pax_global_header00006660000000000000000000000064132013550160014506gustar00rootroot0000000000000052 comment=bed6b516d43e69e10df0d08c3cb58bb7eebba05e starpu-1.2.3+dfsg/000077500000000000000000000000001320135501600137465ustar00rootroot00000000000000starpu-1.2.3+dfsg/AUTHORS000066400000000000000000000030101320135501600150100ustar00rootroot00000000000000Simon Archipoff Cédric Augonnet Olivier Aumage William Braik Berenger Bramas Alfredo Buttari Adrien Cassagne Jérôme Clet-Ortega Nicolas Collin Ludovic Courtès Yann Courtois Jean-Marie Couteyen Nathalie Furmento David Gómez Sylvain Henry Andra Hugo Mehdi Juhoor Xavier Lacoste Benoît Lizé Antoine Lucas Brice Mortier Stojce Nakov Joris Pablo Damien Pasqualinotto Nguyen Quôc-Dinh Cyril Roelandt Anthony Roy Corentin Salingue Marc Sergent Anthony Simonet Luka Stanisic Ludovic Stordeur Guillaume Sylvand François Tessier Samuel Thibault Pierre-André Wacrenier starpu-1.2.3+dfsg/COPYING.LGPL000066400000000000000000000636371320135501600155550ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! starpu-1.2.3+dfsg/ChangeLog000066400000000000000000001253661320135501600155350ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2017 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS # Copyright (C) 2014 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. StarPU 1.2.3 (svn revision 22444) ============================================== New features: * Add per-node MPI data. Small features: * When debug is enabled, starpu data accessors first check the validity of the data interface type * Print disk bus performances when STARPU_BUS_STATS is set * Add starpu_vector_filter_list_long filter. * Data interfaces now define a name through the struct starpu_data_interface_ops * StarPU-MPI : - allow predefined data interface not to define a mpi datatype and to be exchanged through pack/unpack operations - New function starpu_mpi_comm_get_attr() which allows to return the value of the attribute STARPU_MPI_TAG_UB, i.e the upper bound for tag value. - New configure option enable-mpi-verbose to manage the display of extra MPI debug messages. * Add STARPU_WATCHDOG_DELAY environment variable. * Add a 'waiting' worker status * Allow new value 'extra' for configure option --enable-verbose Small changes: * Add data_unregister event in traces * StarPU-MPI - push detached requests at the back of the testing list, so they are tested last since they will most probably finish latest * Automatically initialize handles on data acquisition when reduction methods are provided, and make sure a handle is initialized before trying to read it. StarPU 1.2.2 (svn revision 21308) ============================================== New features: * Add starpu_data_acquire_try and starpu_data_acquire_on_node_try. * Add NVCC_CC environment variable. * Add -no-flops and -no-events options to starpu_fxt_tool to make traces lighter * Add starpu_cusparse_init/shutdown/get_local_handle for proper CUDA overlapping with cusparse. * Allow precise debugging by setting STARPU_TASK_BREAK_ON_PUSH, STARPU_TASK_BREAK_ON_SCHED, STARPU_TASK_BREAK_ON_POP, and STARPU_TASK_BREAK_ON_EXEC environment variables, with the job_id of a task. StarPU will raise SIGTRAP when the task is being scheduled, pushed, or popped by the scheduler. Small features: * New function starpu_worker_get_job_id(struct starpu_task *task) which returns the job identifier for a given task * Show package/numa topology in starpu_machine_display * MPI: Add mpi communications in dag.dot * Add STARPU_PERF_MODEL_HOMOGENEOUS_CPU environment variable to allow having one perfmodel per CPU core * Add starpu_perfmodel_arch_comb_fetch function. * Add starpu_mpi_get_data_on_all_nodes_detached function. Small changes: * Output generated through STARPU_MPI_COMM has been modified to allow easier automated checking * MPI: Fix reactivity of the beginning of the application, when a lot of ready requests have to be processed at the same time, we want to poll the pending requests from time to time. * MPI: Fix gantt chart for starpu_mpi_irecv: it should use the termination time of the request, not the submission time. * MPI: Modify output generated through STARPU_MPI_COMM to allow easier automated checking * MPI: enable more tests in simgrid mode * Use assumed-size instead of assumed-shape arrays for native fortran API, for better backward compatibility. * Fix odd ordering of CPU workers on CPUs due to GPUs stealing some cores StarPU 1.2.1 (svn revision 20299) ============================================== New features: * Add starpu_fxt_trace_user_event_string. * Add starpu_tasks_rec_complete tool to add estimation times in tasks.rec files. * Add STARPU_FXT_TRACE environment variable. * Add starpu_data_set_user_data and starpu_data_get_user_data. * Add STARPU_MPI_FAKE_SIZE and STARPU_MPI_FAKE_RANK to allow simulating execution of just one MPI node. * Add STARPU_PERF_MODEL_HOMOGENEOUS_CUDA/OPENCL/MIC/SCC to share performance models between devices, making calibration much faster. * Add modular-heft-prio scheduler. * Add starpu_cublas_get_local_handle helper. * Add starpu_data_set_name, starpu_data_set_coordinates_array, and starpu_data_set_coordinates to describe data, and starpu_iteration_push and starpu_iteration_pop to describe tasks, for better offline traces analysis. * New function starpu_bus_print_filenames() to display filenames storing bandwidth/affinity/latency information, available through tools/starpu_machine_display -i * Add support for Ayudame version 2.x debugging library. * Add starpu_sched_ctx_get_workers_list_raw, much less costly than starpu_sched_ctx_get_workers_list * Add starpu_task_get_name and use it to warn about dmda etc. using a dumb policy when calibration is not finished * MPI: Add functions to test for cached values Changes: * Fix performance regression of lws for small tasks. * Improve native Fortran support for StarPU Small changes: * Fix type of data home node to allow users to pass -1 to define temporary data * Fix compatibility with simgrid 3.14 StarPU 1.2.0 (svn revision 18521) ============================================== New features: * MIC Xeon Phi support * SCC support * New function starpu_sched_ctx_exec_parallel_code to execute a parallel code on the workers of the given scheduler context * MPI: - New internal communication system : a unique tag called is now used for all communications, and a system of hashmaps on each node which stores pending receives has been implemented. Every message is now coupled with an envelope, sent before the corresponding data, which allows the receiver to allocate data correctly, and to submit the matching receive of the envelope. - New function starpu_mpi_irecv_detached_sequential_consistency which allows to enable or disable the sequential consistency for the given data handle (sequential consistency will be enabled or disabled based on the value of the function parameter and the value of the sequential consistency defined for the given data) - New functions starpu_mpi_task_build() and starpu_mpi_task_post_build() - New flag STARPU_NODE_SELECTION_POLICY to specify a policy for selecting a node to execute the codelet when several nodes own data in W mode. - New selection node policies can be un/registered with the functions starpu_mpi_node_selection_register_policy() and starpu_mpi_node_selection_unregister_policy() - New environment variable STARPU_MPI_COMM which enables basic tracing of communications. - New function starpu_mpi_init_comm() which allows to specify a MPI communicator. * New STARPU_COMMUTE flag which can be passed along STARPU_W or STARPU_RW to let starpu commute write accesses. * Out-of-core support, through registration of disk areas as additional memory nodes. It can be enabled programmatically or through the STARPU_DISK_SWAP* environment variables. * Reclaiming is now periodically done before memory becomes full. This can be controlled through the STARPU_*_AVAILABLE_MEM environment variables. * New hierarchical schedulers which allow the user to easily build its own scheduler, by coding itself each "box" it wants, or by combining existing boxes in StarPU to build it. Hierarchical schedulers have very interesting scalability properties. * Add STARPU_CUDA_ASYNC and STARPU_OPENCL_ASYNC flags to allow asynchronous CUDA and OpenCL kernel execution. * Add STARPU_CUDA_PIPELINE and STARPU_OPENCL_PIPELINE to specify how many asynchronous tasks are submitted in advance on CUDA and OpenCL devices. Setting the value to 0 forces a synchronous execution of all tasks. * Add CUDA concurrent kernel execution support through the STARPU_NWORKER_PER_CUDA environment variable. * Add CUDA and OpenCL kernel submission pipelining, to overlap costs and allow concurrent kernel execution on Fermi cards. * New locality work stealing scheduler (lws). * Add STARPU_VARIABLE_NBUFFERS to be set in cl.nbuffers, and nbuffers and modes field to the task structure, which permit to define codelets taking a variable number of data. * Add support for implementing OpenMP runtimes on top of StarPU * New performance model format to better represent parallel tasks. Used to provide estimations for the execution times of the parallel tasks on scheduling contexts or combined workers. * starpu_data_idle_prefetch_on_node and starpu_idle_prefetch_task_input_on_node allow to queue prefetches to be done only when the bus is idle. * Make starpu_data_prefetch_on_node not forcibly flush data out, introduce starpu_data_fetch_on_node for that. * Add data access arbiters, to improve parallelism of concurrent data accesses, notably with STARPU_COMMUTE. * Anticipative writeback, to flush dirty data asynchronously before the GPU device is full. Disabled by default. Use STARPU_MINIMUM_CLEAN_BUFFERS and STARPU_TARGET_CLEAN_BUFFERS to enable it. * Add starpu_data_wont_use to advise that a piece of data will not be used in the close future. * Enable anticipative writeback by default. * New scheduler 'dmdasd' that considers priority when deciding on which worker to schedule * Add the capability to define specific MPI datatypes for StarPU user-defined interfaces. * Add tasks.rec trace output to make scheduling analysis easier. * Add Fortran 90 module and example using it * New StarPU-MPI gdb debug functions * Generate animated html trace of modular schedulers. * Add asynchronous partition planning. It only supports coherency through the home node of data for now. * Add STARPU_MALLOC_SIMULATION_FOLDED flag to save memory when simulating. * Include application threads in the trace. * Add starpu_task_get_task_scheduled_succs to get successors of a task. * Add graph inspection facility for schedulers. * New STARPU_LOCALITY flag to mark data which should be taken into account by schedulers for improving locality. * Experimental support for data locality in ws and lws. * Add a preliminary framework for native Fortran support for StarPU Small features: * Tasks can now have a name (via the field const char *name of struct starpu_task) * New functions starpu_data_acquire_cb_sequential_consistency() and starpu_data_acquire_on_node_cb_sequential_consistency() which allows to enable or disable sequential consistency * New configure option --enable-fxt-lock which enables additional trace events focused on locks behaviour during the execution * Functions starpu_insert_task and starpu_mpi_insert_task are renamed in starpu_task_insert and starpu_mpi_task_insert. Old names are kept to avoid breaking old codes. * New configure option --enable-calibration-heuristic which allows the user to set the maximum authorized deviation of the history-based calibrator. * Allow application to provide the task footprint itself. * New function starpu_sched_ctx_display_workers() to display worker information belonging to a given scheduler context * The option --enable-verbose can be called with --enable-verbose=extra to increase the verbosity * Add codelet size, footprint and tag id in the paje trace. * Add STARPU_TAG_ONLY, to specify a tag for traces without making StarPU manage the tag. * On Linux x86, spinlocks now block after a hundred tries. This avoids typical 10ms pauses when the application thread tries to submit tasks. * New function char *starpu_worker_get_type_as_string(enum starpu_worker_archtype type) * Improve static scheduling by adding support for specifying the task execution order. * Add starpu_worker_can_execute_task_impl and starpu_worker_can_execute_task_first_impl to optimize getting the working implementations * Add STARPU_MALLOC_NORECLAIM flag to allocate without running a reclaim if the node is out of memory. * New flag STARPU_DATA_MODE_ARRAY for the function family starpu_task_insert to allow to define a array of data handles along with their access modes. * New configure option --enable-new-check to enable new testcases which are known to fail * Add starpu_memory_allocate and _deallocate to let the application declare its own allocation to the reclaiming engine. * Add STARPU_SIMGRID_CUDA_MALLOC_COST and STARPU_SIMGRID_CUDA_QUEUE_COST to disable CUDA costs simulation in simgrid mode. * Add starpu_task_get_task_succs to get the list of children of a given task. * Add starpu_malloc_on_node_flags, starpu_free_on_node_flags, and starpu_malloc_on_node_set_default_flags to control the allocation flags used for allocations done by starpu. * Ranges can be provided in STARPU_WORKERS_CPUID * Add starpu_fxt_autostart_profiling to be able to avoid autostart. * Add arch_cost_function perfmodel function field. * Add STARPU_TASK_BREAK_ON_SCHED, STARPU_TASK_BREAK_ON_PUSH, and STARPU_TASK_BREAK_ON_POP environment variables to debug schedulers. * Add starpu_sched_display tool. * Add starpu_memory_pin and starpu_memory_unpin to pin memory allocated another way than starpu_malloc. * Add STARPU_NOWHERE to create synchronization tasks with data. * Document how to switch between differents views of the same data. * Add STARPU_NAME to specify a task name from a starpu_task_insert call. * Add configure option to disable fortran --disable-fortran * Add configure option to give path for smpirun executable --with-smpirun * Add configure option to disable the build of tests --disable-build-tests * Add starpu-all-tasks debugging support * New function void starpu_opencl_load_program_source_malloc(const char *source_file_name, char **located_file_name, char **located_dir_name, char **opencl_program_source) which allocates the pointers located_file_name, located_dir_name and opencl_program_source. * Add submit_hook and do_schedule scheduler methods. * Add starpu_sleep. * Add starpu_task_list_ismember. * Add _starpu_fifo_pop_this_task. * Add STARPU_MAX_MEMORY_USE environment variable. * Add starpu_worker_get_id_check(). * New function starpu_mpi_wait_for_all(MPI_Comm comm) that allows to wait until all StarPU tasks and communications for the given communicator are completed. * New function starpu_codelet_unpack_args_and_copyleft() which allows to copy in a new buffer values which have not been unpacked by the current call * Add STARPU_CODELET_SIMGRID_EXECUTE flag. * Add STARPU_CODELET_SIMGRID_EXECUTE_AND_INJECT flag. * Add STARPU_CL_ARGS flag to starpu_task_insert() and starpu_mpi_task_insert() functions call Changes: * Data interfaces (variable, vector, matrix and block) now define pack und unpack functions * StarPU-MPI: Fix for being able to receive data which have not yet been registered by the application (i.e it did not call starpu_data_set_tag(), data are received as a raw memory) * StarPU-MPI: Fix for being able to receive data with the same tag from several nodes (see mpi/tests/gather.c) * Remove the long-deprecated cost_model fields and task->buffers field. * Fix complexity of implicit task/data dependency, from quadratic to linear. Small changes: * Rename function starpu_trace_user_event() as starpu_fxt_trace_user_event() * "power" is renamed into "energy" wherever it applies, notably energy consumption performance models * Update starpu_task_build() to set starpu_task::cl_arg_free to 1 if some arguments of type ::STARPU_VALUE are given. * Simplify performance model loading API * Better semantic for environment variables STARPU_NMIC and STARPU_NMICDEVS, the number of devices and the number of cores. STARPU_NMIC will be the number of devices, and STARPU_NMICCORES will be the number of cores per device. StarPU 1.1.5 (svn revision xxx) ============================================== The scheduling context release * Add starpu_memory_pin and starpu_memory_unpin to pin memory allocated another way than starpu_malloc. * Add starpu_task_wait_for_n_submitted() and STARPU_LIMIT_MAX_NSUBMITTED_TASKS/STARPU_LIMIT_MIN_NSUBMITTED_TASKS to easily control the number of submitted tasks by making task submission block. StarPU 1.1.4 (svn revision 14856) ============================================== The scheduling context release New features: * Fix and actually enable the cache allocation. * Enable allocation cache in main RAM when STARPU_LIMIT_CPU_MEM is set by the user. * New MPI functions starpu_mpi_issend and starpu_mpi_issend_detached to send data using a synchronous and non-blocking mode (internally uses MPI_Issend) * New data access mode flag STARPU_SSEND to be set when calling starpu_mpi_insert_task to specify the data has to be sent using a synchronous and non-blocking mode * New environment variable STARPU_PERF_MODEL_DIR which can be set to specify a directory where to store performance model files in. When unset, the files are stored in $STARPU_HOME/.starpu/sampling * MPI: - New function starpu_mpi_data_register_comm to register a data with another communicator than MPI_COMM_WORLD - New functions starpu_mpi_data_set_rank() and starpu_mpi_data_set_tag() which call starpu_mpi_data_register_comm() Small features: * Add starpu_memory_wait_available() to wait for a given size to become available on a given node. * New environment variable STARPU_RAND_SEED to set the seed used for random numbers. * New function starpu_mpi_cache_set() to enable or disable the communication cache at runtime * Add starpu_paje_sort which sorts Pajé traces. Changes: * Fix complexity of implicit task/data dependency, from quadratic to linear. StarPU 1.1.3 (svn revision 13450) ============================================== The scheduling context release New features: * One can register an existing on-GPU buffer to be used by a handle. * Add the starpu_paje_summary statistics tool. * Enable gpu-gpu transfers for matrices. * Let interfaces declare which transfers they allow with the can_copy methode. Small changes: * Lock performance model files while writing and reading them to avoid issues on parallel launches, MPI runs notably. * Lots of build fixes for icc on Windows. StarPU 1.1.2 (svn revision 13011) ============================================== The scheduling context release New features: * The reduction init codelet is automatically used to initialize temporary buffers. * Traces now include a "scheduling" state, to show the overhead of the scheduler. * Add STARPU_CALIBRATE_MINIMUM environment variable to specify the minimum number of calibration measurements. * Add STARPU_TRACE_BUFFER_SIZE environment variable to specify the size of the trace buffer. StarPU 1.1.1 (svn revision 12638) ============================================== The scheduling context release New features: * MPI: - New variable STARPU_MPI_CACHE_STATS to print statistics on cache holding received data. - New function starpu_mpi_data_register() which sets the rank and tag of a data, and also allows to automatically clear the MPI communication cache when unregistering the data. It should be called instead of both calling starpu_data_set_tag() and starpu_data_set_rank() * Use streams for all CUDA transfers, even initiated by CPUs. * Add paje traces statistics tools. * Use streams for GPUA->GPUB and GPUB->GPUA transfers. Small features: * New STARPU_EXECUTE_ON_WORKER flag to specify the worker on which to execute the task. * New STARPU_DISABLE_PINNING environment variable to disable host memory pinning. * New STARPU_DISABLE_KERNELS environment variable to disable actual kernel execution. * New starpu_memory_get_total function to get the size of a memory node. * New starpu_parallel_task_barrier_init_n function to let a scheduler decide a set of workers without going through combined workers. Changes: * Fix simgrid execution. * Rename starpu_get_nready_tasks_of_sched_ctx to starpu_sched_ctx_get_nready_tasks * Rename starpu_get_nready_flops_of_sched_ctx to starpu_sched_ctx_get_nready_flops * New functions starpu_pause() and starpu_resume() * New codelet specific_nodes field to specify explicit target nodes for data. * StarPU-MPI: Fix overzealous allocation of memory. * Interfaces: Allow interface implementation to change pointers at will, in unpack notably. Small changes: * Use big fat abortions when one tries to make a task or callback sleep, instead of just returning EDEADLCK which few people will test * By default, StarPU FFT examples are not compiled and checked, the configure option --enable-starpufft-examples needs to be specified to change this behaviour. StarPU 1.1.0 (svn revision 11960) ============================================== The scheduling context release New features: * OpenGL interoperability support. * Capability to store compiled OpenCL kernels on the file system * Capability to load compiled OpenCL kernels * Performance models measurements can now be provided explicitly by applications. * Capability to emit communication statistics when running MPI code * Add starpu_data_unregister_submit, starpu_data_acquire_on_node and starpu_data_invalidate_submit * New functionnality to wrapper starpu_insert_task to pass a array of data_handles via the parameter STARPU_DATA_ARRAY * Enable GPU-GPU direct transfers. * GCC plug-in - Add `registered' attribute - A new pass was added that warns about the use of possibly unregistered memory buffers. * SOCL - Manual mapping of commands on specific devices is now possible - SOCL does not require StarPU CPU tasks anymore. CPU workers are automatically disabled to enhance performance of OpenCL CPU devices * New interface: COO matrix. * Data interfaces: The pack operation of user-defined data interface defines a new parameter count which should be set to the size of the buffer created by the packing of the data. * MPI: - Communication statistics for MPI can only be enabled at execution time by defining the environment variable STARPU_COMM_STATS - Communication cache mechanism is enabled by default, and can only be disabled at execution time by setting the environment variable STARPU_MPI_CACHE to 0. - Initialisation functions starpu_mpi_initialize_extended() and starpu_mpi_initialize() have been made deprecated. One should now use starpu_mpi_init(int *, char ***, int). The last parameter indicates if MPI should be initialised. - Collective detached operations have new parameters, a callback function and a argument. This is to be consistent with the detached point-to-point communications. - When exchanging user-defined data interfaces, the size of the data is the size returned by the pack operation, i.e data with dynamic size can now be exchanged with StarPU-MPI. * Add experimental simgrid support, to simulate execution with various number of CPUs, GPUs, amount of memory, etc. * Add support for OpenCL simulators (which provide simulated execution time) * Add support for Temanejo, a task graph debugger * Theoretical bound lp output now includes data transfer time. * Update OpenCL driver to only enable CPU devices (the environment variable STARPU_OPENCL_ONLY_ON_CPUS must be set to a positive value when executing an application) * Add Scheduling contexts to separate computation resources - Scheduling policies take into account the set of resources corresponding to the context it belongs to - Add support to dynamically change scheduling contexts (Create and Delete a context, Add Workers to a context, Remove workers from a context) - Add support to indicate to which contexts the tasks are submitted * Add the Hypervisor to manage the Scheduling Contexts automatically - The Contexts can be registered to the Hypervisor - Only the registered contexts are managed by the Hypervisor - The Hypervisor can detect the initial distribution of resources of a context and constructs it consequently (the cost of execution is required) - Several policies can adapt dynamically the distribution of resources in contexts if the initial one was not appropriate - Add a platform to implement new policies of redistribution of resources * Implement a memory manager which checks the global amount of memory available on devices, and checks there is enough memory before doing an allocation on the device. * Discard environment variable STARPU_LIMIT_GPU_MEM and define instead STARPU_LIMIT_CUDA_MEM and STARPU_LIMIT_OPENCL_MEM * Introduce new variables STARPU_LIMIT_CUDA_devid_MEM and STARPU_LIMIT_OPENCL_devid_MEM to limit memory per specific device * Introduce new variable STARPU_LIMIT_CPU_MEM to limit memory for the CPU devices * New function starpu_malloc_flags to define a memory allocation with constraints based on the following values: - STARPU_MALLOC_PINNED specifies memory should be pinned - STARPU_MALLOC_COUNT specifies the memory allocation should be in the limits defined by the environment variables STARPU_LIMIT_xxx (see above). When no memory is left, starpu_malloc_flag tries to reclaim memory from StarPU and returns -ENOMEM on failure. * starpu_malloc calls starpu_malloc_flags with a value of flag set to STARPU_MALLOC_PINNED * Define new function starpu_free_flags similarly to starpu_malloc_flags * Define new public API starpu_pthread which is similar to the pthread API. It is provided with 2 implementations: a pthread one and a Simgrid one. Applications using StarPU and wishing to use the Simgrid StarPU features should use it. * Allow to have a dynamically allocated number of buffers per task, and so overwrite the value defined --enable-maxbuffers=XXX * Performance models files are now stored in a directory whose name include the version of the performance model format. The version number is also written in the file itself. When updating the format, the internal variable _STARPU_PERFMODEL_VERSION should be updated. It is then possible to switch easily between differents versions of StarPU having different performance model formats. * Tasks can now define a optional prologue callback which is executed on the host when the task becomes ready for execution, before getting scheduled. * Small CUDA allocations (<= 4MiB) are now batched to avoid the huge cudaMalloc overhead. * Prefetching is now done for all schedulers when it can be done whatever the scheduling decision. * Add a watchdog which permits to easily trigger a crash when StarPU gets stuck. * Document how to migrate data over MPI. * New function starpu_wakeup_worker() to be used by schedulers to wake up a single worker (instead of all workers) when submitting a single task. * The functions starpu_sched_set/get_min/max_priority set/get the priorities of the current scheduling context, i.e the one which was set by a call to starpu_sched_ctx_set_context() or the initial context if the function has not been called yet. * Fix for properly dealing with NAN on windows systems Small features: * Add starpu_worker_get_by_type and starpu_worker_get_by_devid * Add starpu_fxt_stop_profiling/starpu_fxt_start_profiling which permits to pause trace recording. * Add trace_buffer_size configuration field to permit to specify the tracing buffer size. * Add starpu_codelet_profile and starpu_codelet_histo_profile, tools which draw the profile of a codelet. * File STARPU-REVISION --- containing the SVN revision number from which StarPU was compiled --- is installed in the share/doc/starpu directory * starpu_perfmodel_plot can now directly draw GFlops curves. * New configure option --enable-mpi-progression-hook to enable the activity polling method for StarPU-MPI. * Permit to disable sequential consistency for a given task. * New macro STARPU_RELEASE_VERSION * New function starpu_get_version() to return as 3 integers the release version of StarPU. * Enable by default data allocation cache * New function starpu_perfmodel_directory() to print directory storing performance models. Available through the new option -d of the tool starpu_perfmodel_display * New batch files to execute StarPU applications under Microsoft Visual Studio (They are installed in path_to_starpu/bin/msvc)/ * Add cl_arg_free, callback_arg_free, prologue_callback_arg_free fields to enable automatic free(cl_arg); free(callback_arg); free(prologue_callback_arg) on task destroy. * New function starpu_task_build * New configure options --with-simgrid-dir --with-simgrid-include-dir and --with-simgrid-lib-dir to specify the location of the SimGrid library Changes: * Rename all filter functions to follow the pattern starpu_DATATYPE_filter_FILTERTYPE. The script tools/dev/rename_filter.sh is provided to update your existing applications to use new filters function names. * Renaming of diverse functions and datatypes. The script tools/dev/rename.sh is provided to update your existing applications to use the new names. It is also possible to compile with the pkg-config package starpu-1.0 to keep using the old names. It is however recommended to update your code and to use the package starpu-1.1. * Fix the block filter functions. * Fix StarPU-MPI on Darwin. * The FxT code can now be used on systems other than Linux. * Keep only one hashtable implementation common/uthash.h * The cache of starpu_mpi_insert_task is fixed and thus now enabled by default. * Improve starpu_machine_display output. * Standardize objects name in the performance model API * SOCL - Virtual SOCL device has been removed - Automatic scheduling still available with command queues not assigned to any device - Remove modified OpenCL headers. ICD is now the only supported way to use SOCL. - SOCL test suite is only run when environment variable SOCL_OCL_LIB_OPENCL is defined. It should contain the location of the libOpenCL.so file of the OCL ICD implementation. * Fix main memory leak on multiple unregister/re-register. * Improve hwloc detection by configure * Cell: - It is no longer possible to enable the cell support via the gordon driver - Data interfaces no longer define functions to copy to and from SPU devices - Codelet no longer define pointer for Gordon implementations - Gordon workers are no longer enabled - Gordon performance models are no longer enabled * Fix data transfer arrows in paje traces * The "heft" scheduler no longer exists. Users should now pick "dmda" instead. * StarPU can now use poti to generate paje traces. * Rename scheduling policy "parallel greedy" to "parallel eager" * starpu_scheduler.h is no longer automatically included by starpu.h, it has to be manually included when needed * New batch files to run StarPU applications with Microsoft Visual C * Add examples/release/Makefile to test StarPU examples against an installed version of StarPU. That can also be used to test examples using a previous API. * Tutorial is installed in ${docdir}/tutorial * Schedulers eager_central_policy, dm and dmda no longer erroneously respect priorities. dmdas has to be used to respect priorities. * StarPU-MPI: Fix potential bug for user-defined datatypes. As MPI can reorder messages, we need to make sure the sending of the size of the data has been completed. * Documentation is now generated through doxygen. * Modification of perfmodels output format for future improvements. * Fix for properly dealing with NAN on windows systems * Function starpu_sched_ctx_create() now takes a variable argument list to define the scheduler to be used, and the minimum and maximum priority values * The functions starpu_sched_set/get_min/max_priority set/get the priorities of the current scheduling context, i.e the one which was set by a call to starpu_sched_ctx_set_context() or the initial context if the function was not called yet. * MPI: Fix of the livelock issue discovered while executing applications on a CPU+GPU cluster of machines by adding a maximum trylock threshold before a blocking lock. Small changes: * STARPU_NCPU should now be used instead of STARPU_NCPUS. STARPU_NCPUS is still available for compatibility reasons. * include/starpu.h includes all include/starpu_*.h files, applications therefore only need to have #include * Active task wait is now included in blocked time. * Fix GCC plugin linking issues starting with GCC 4.7. * Fix forcing calibration of never-calibrated archs. * CUDA applications are no longer compiled with the "-arch sm_13" option. It is specifically added to applications which need it. * Explicitly name the non-sleeping-non-running time "Overhead", and use another color in vite traces. * Use C99 variadic macro support, not GNU. * Fix performance regression: dmda queues were inadvertently made LIFOs in r9611. StarPU 1.0.3 (svn revision 7379) ============================================== Changes: * Several bug fixes in the build system * Bug fixes in source code for non-Linux systems * Fix generating FXT traces bigger than 64MiB. * Improve ENODEV error detections in StarPU FFT StarPU 1.0.2 (svn revision 7210) ============================================== Changes: * Add starpu_block_shadow_filter_func_vector and an example. * Add tag dependency in trace-generated DAG. * Fix CPU binding for optimized CPU-GPU transfers. * Fix parallel tasks CPU binding and combined worker generation. * Fix generating FXT traces bigger than 64MiB. StarPU 1.0.1 (svn revision 6659) ============================================== Changes: * hwloc support. Warn users when hwloc is not found on the system and produce error when not explicitely disabled. * Several bug fixes * GCC plug-in - Add `#pragma starpu release' - Fix bug when using `acquire' pragma with function parameters - Slightly improve test suite coverage - Relax the GCC version check * Update SOCL to use new API * Documentation improvement. StarPU 1.0.0 (svn revision 6306) ============================================== The extensions-again release New features: * Add SOCL, an OpenCL interface on top of StarPU. * Add a gcc plugin to extend the C interface with pragmas which allows to easily define codelets and issue tasks. * Add reduction mode to starpu_mpi_insert_task. * A new multi-format interface permits to use different binary formats on CPUs & GPUs, the conversion functions being provided by the application and called by StarPU as needed (and as less as possible). * Deprecate cost_model, and introduce cost_function, which is provided with the whole task structure, the target arch and implementation number. * Permit the application to provide its own size base for performance models. * Applications can provide several implementations of a codelet for the same architecture. * Add a StarPU-Top feedback and steering interface. * Permit to specify MPI tags for more efficient starpu_mpi_insert_task Changes: * Fix several memory leaks and race conditions * Make environment variables take precedence over the configuration passed to starpu_init() * Libtool interface versioning has been included in libraries names (libstarpu-1.0.so, libstarpumpi-1.0.so, libstarpufft-1.0.so, libsocl-1.0.so) * Install headers under $includedir/starpu/1.0. * Make where field for struct starpu_codelet optional. When unset, its value will be automatically set based on the availability of the different XXX_funcs fields of the codelet. * Define access modes for data handles into starpu_codelet and no longer in starpu_task. Hence mark (struct starpu_task).buffers as deprecated, and add (struct starpu_task).handles and (struct starpu_codelet).modes * Fields xxx_func of struct starpu_codelet are made deprecated. One should use fields xxx_funcs instead. * Some types were renamed for consistency. when using pkg-config libstarpu, starpu_deprecated_api.h is automatically included (after starpu.h) to keep compatibility with existing software. Other changes are mentioned below, compatibility is also preserved for them. To port code to use new names (this is not mandatory), the tools/dev/rename.sh script can be used, and pkg-config starpu-1.0 should be used. * The communication cost in the heft and dmda scheduling strategies now take into account the contention brought by the number of GPUs. This changes the meaning of the beta factor, whose default 1.0 value should now be good enough in most case. Small features: * Allow users to disable asynchronous data transfers between CPUs and GPUs. * Update OpenCL driver to enable CPU devices (the environment variable STARPU_OPENCL_ON_CPUS must be set to a positive value when executing an application) * struct starpu_data_interface_ops --- operations on a data interface --- define a new function pointer allocate_new_data which creates a new data interface of the given type based on an existing handle * Add a field named magic to struct starpu_task which is set when initialising the task. starpu_task_submit will fail if the field does not have the right value. This will hence avoid submitting tasks which have not been properly initialised. * Add a hook function pre_exec_hook in struct starpu_sched_policy. The function is meant to be called in drivers. Schedulers can use it to be notified when a task is about being computed. * Add codelet execution time statistics plot. * Add bus speed in starpu_machine_display. * Add a STARPU_DATA_ACQUIRE_CB which permits to inline the code to be done. * Add gdb functions. * Add complex support to LU example. * Permit to use the same data several times in write mode in the parameters of the same task. Small changes: * Increase default value for STARPU_MAXCPUS -- Maximum number of CPUs supported -- to 64. * Add man pages for some of the tools * Add C++ application example in examples/cpp/ * Add an OpenMP fork-join example. * Documentation improvement. StarPU 0.9 (svn revision 3721) ============================================== The extensions release * Provide the STARPU_REDUX data access mode * Externalize the scheduler API. * Add theoretical bound computation * Add the void interface * Add power consumption optimization * Add parallel task support * Add starpu_mpi_insert_task * Add profiling information interface. * Add STARPU_LIMIT_GPU_MEM environment variable. * OpenCL fixes * MPI fixes * Improve optimization documentation * Upgrade to hwloc 1.1 interface * Add fortran example * Add mandelbrot OpenCL example * Add cg example * Add stencil MPI example * Initial support for CUDA4 StarPU 0.4 (svn revision 2535) ============================================== The API strengthening release * Major API improvements - Provide the STARPU_SCRATCH data access mode - Rework data filter interface - Rework data interface structure - A script that automatically renames old functions to accomodate with the new API is available from https://scm.gforge.inria.fr/svn/starpu/scripts/renaming (login: anonsvn, password: anonsvn) * Implement dependencies between task directly (eg. without tags) * Implicit data-driven task dependencies simplifies the design of data-parallel algorithms * Add dynamic profiling capabilities - Provide per-task feedback - Provide per-worker feedback - Provide feedback about memory transfers * Provide a library to help accelerating MPI applications * Improve data transfers overhead prediction - Transparently benchmark buses to generate performance models - Bind accelerator-controlling threads with respect to NUMA locality * Improve StarPU's portability - Add OpenCL support - Add support for Windows StarPU 0.2.901 aka 0.3-rc1 (svn revision 1236) ============================================== The asynchronous heterogeneous multi-accelerator release * Many API changes and code cleanups - Implement starpu_worker_get_id - Implement starpu_worker_get_name - Implement starpu_worker_get_type - Implement starpu_worker_get_count - Implement starpu_display_codelet_stats - Implement starpu_data_prefetch_on_node - Expose the starpu_data_set_wt_mask function * Support nvidia (heterogeneous) multi-GPU * Add the data request mechanism - All data transfers use data requests now - Implement asynchronous data transfers - Implement prefetch mechanism - Chain data requests to support GPU->RAM->GPU transfers * Make it possible to bypass the scheduler and to assign a task to a specific worker * Support restartable tasks to reinstanciate dependencies task graphs * Improve performance prediction - Model data transfer overhead - One model is created for each accelerator * Support for CUDA's driver API is deprecated * The STARPU_WORKERS_CUDAID and STARPU_WORKERS_CPUID env. variables make it possible to specify where to bind the workers * Use the hwloc library to detect the actual number of cores StarPU 0.2.0 (svn revision 1013) ============================================== The Stabilizing-the-Basics release * Various API cleanups * Mac OS X is supported now * Add dynamic code loading facilities onto Cell's SPUs * Improve performance analysis/feedback tools * Application can interact with StarPU tasks - The application may access/modify data managed by the DSM - The application may wait for the termination of a (set of) task(s) * An initial documentation is added * More examples are supplied StarPU 0.1.0 (svn revision 794) ============================================== First release. Status: * Only supports Linux platforms yet * Supported architectures - multicore CPUs - NVIDIA GPUs (with CUDA 2.x) - experimental Cell/BE support Changes: * Scheduling facilities - run-time selection of the scheduling policy - basic auto-tuning facilities * Software-based DSM - transparent data coherency management - High-level expressive interface # Local Variables: # mode: text # coding: utf-8 # ispell-local-dictionary: "american" # End: starpu-1.2.3+dfsg/INSTALL000066400000000000000000000152611320135501600150040ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2012 Université de Bordeaux # Copyright (C) 2010, 2011, 2013, 2014 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. Contents ========= * Installing StarPU on a Unix machine * Installing StarPU on Windows Installing StarPU on a Unix machine ------------------------------------ $ ./autogen.sh # If running the SVN version $ ./configure --prefix= $ make $ make install Installing StarPU on Windows ---------------------------- If you are building from a tarball downloaded from the website, you can skip the cygwin part. 1. Install cygwin http://cygwin.com/install.html Make sure the following packages are available: - (Devel)/subversion - (Devel)/libtool - (Devel)/gcc - (Devel)/make - your favorite editor (vi, emacs, ...) - (Devel)/gdb - (Archive)/zip - (Devel)/pkg-config 2. Install mingw http://www.mingw.org/ 3. Install hwloc (not mandatory, but strongly recommended) http://www.open-mpi.org/projects/hwloc Be careful which version you are installing. Even if your machine runs windows 64 bits, if you are running a 32 bits mingw (check the output of the command uname -a), you will need to install the 32 bits version of hwloc. 4. Install Microsoft Visual C++ Studio Express http://www.microsoft.com/express/Downloads Add in your path the following directories. (adjusting where necessary for the Installation location according to VC version and on 64 and 32bit Windows versions) On cygwin, with Visual C++ 2010 e.g.; export PATH="/cygdrive/c/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE":$PATH export PATH="/cygdrive/c/Program Files (x86)/Microsoft Visual Studio 10.0/VC/bin":$PATH On MingW, with Visual C++ 2010, e.g.; export PATH="/c/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE":$PATH export PATH="/c/Program Files (x86)/Microsoft Visual Studio 10.0/VC/bin":$PATH Try to call , and without any option to make sure these dump their help output with a series of options, otherwise no .def or .lib file will be produced. 5. Install GPU Drivers (not mandatory) 5.1 Install Cuda http://developer.nvidia.com/object/cuda_3_2_downloads.html You need to install at least the CUDA toolkit. libtool is not able to find the libraries automatically, you need to make some copies: copy c:\cuda\lib\cuda.lib c:\cuda\lib\libcuda.lib copy c:\cuda\lib\cudart.lib c:\cuda\lib\libcudart.lib copy c:\cuda\lib\cublas.lib c:\cuda\lib\libcublas.lib copy c:\cuda\lib\cufft.lib c:\cuda\lib\libcufft.lib copy c:\cuda\lib\OpenCL.lib c:\cuda\lib\libOpenCL.lib (and if the version of your CUDA driver is >= 3.2) copy c:\cuda\lib\curand.lib c:\cuda\lib\libcurand.lib Add the CUDA bin directory in your path export PATH=/cygdrive/c/CUDA/bin:$PATH Since we build code using CUDA headers with gcc instead of Visual studio, a fix is needed: c:\cuda\include\host_defines.h has a bogus CUDARTAPI definition which makes linking fail completely. Replace the first occurence of #define CUDARTAPI with #ifdef _WIN32 #define CUDARTAPI __stdcall #else #define CUDARTAPI #endif While at it, you can also comment the __cdecl definition to avoid spurious warnings. 5.2 Install OpenCL http://developer.nvidia.com/object/opencl-download.html You need to download the NVIDIA Drivers for your version of Windows. Executing the file will extract all files in a given directory. The the driver installation will start, it will fail if no compatibles drivers can be found on your system. Anyway, you should copy the *.dl_ files from the directory (extraction path) in the bin directory of the CUDA installation directory (the directory should be v3.2/bin/) 5.3 Install MsCompress http://gnuwin32.sourceforge.net/packages/mscompress.htm Go in the CUDA bin directory, uncompress .dl_ files and rename them in .dll files cp /cygdrive/c/NVIDIA/DisplayDriver/190.89/International/*.dl_ . for i in *.dl_ ; do /cygdrive/c/Program\ Files/GnuWin32/bin/msexpand.exe $i ; mv ${i%_} ${i%_}l ; done If you are building from a tarball downloaded from the website, you can skip the autogen.sh part. 6. Start autogen.sh from cygwin cd starpu-trunk ./autogen.sh 7. Start a MinGW shell /cygdrive/c/MinGW/msys/1.0/bin/sh.exe --login -i 8. Configure, make, install from MinGW If you have a non-english version of windows, use export LANG=C else libtool has troubles parsing the translated output of the toolchain. cd starpu-trunk mkdir build cd build ../configure --prefix=$PWD/target \ --with-hwloc= \ --with-cuda-dir= \ --with-cuda-lib-dir=/lib/Win32 \ --with-opencl-dir= --disable-build-doc --disable-build-examples --enable-quick-check make make check # not necessary but well advised make install The option --disable-build-doc is necessary if you do not have a working TeX binary installed as it is needed by texi2dvi to build the documentation. To fasten the compilation process, the option --disable-build-examples may also be used to disable the compilation of the applications in the examples directory. Only the applications in the test directory will be build. Also convert a couple of files to CRLF: sed -e 's/$/'$'\015'/ < README > $prefix/README.txt sed -e 's/$/'$'\015'/ < AUTHORS > $prefix/AUTHORS.txt sed -e 's/$/'$'\015'/ < COPYING.LGPL > $prefix/COPYING.LGPL.txt 9. If you want your StarPU installation to be standalone, you need to copy the DLL files from hwloc, Cuda, and OpenCL into the StarPU installation bin directory, as well as MinGW/bin/libpthread*dll cp /bin/*dll target/bin cp /bin/*dll target/bin cp /cygdrive/c/MinGW/bin/libpthread*dll target/bin and set the StarPU bin directory in your path. export PATH=/bin:$PATH starpu-1.2.3+dfsg/Makefile.am000066400000000000000000000135541320135501600160120ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2014, 2016-2017 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2015, 2016 CNRS # Copyright (C) 2014, 2016 Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. ACLOCAL_AMFLAGS=-I m4 CLEANFILES = *.gcno *.gcda *.linkinfo SUBDIRS = src SUBDIRS += tools if BUILD_TESTS SUBDIRS += tests endif SUBDIRS += doc if USE_MPI SUBDIRS += mpi endif if BUILD_EXAMPLES SUBDIRS += examples endif if BUILD_SOCL SUBDIRS += socl endif if BUILD_GCC_PLUGIN SUBDIRS += gcc-plugin endif if BUILD_STARPUFFT SUBDIRS += starpufft endif if STARPU_BUILD_SC_HYPERVISOR SUBDIRS += sc_hypervisor endif pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libstarpu.pc starpu-1.0.pc starpu-1.1.pc starpu-1.2.pc versincludedir = $(includedir)/starpu/$(STARPU_EFFECTIVE_VERSION) versinclude_HEADERS = \ include/starpu.h \ include/starpu_bitmap.h \ include/starpu_data_filters.h \ include/starpu_data_interfaces.h \ include/starpu_worker.h \ include/starpu_task.h \ include/starpu_task_bundle.h \ include/starpu_task_list.h \ include/starpu_task_util.h \ include/starpu_data.h \ include/starpu_perfmodel.h \ include/starpu_util.h \ include/starpu_fxt.h \ include/starpu_cuda.h \ include/starpu_opencl.h \ include/starpu_openmp.h \ include/starpu_sink.h \ include/starpu_mic.h \ include/starpu_scc.h \ include/starpu_expert.h \ include/starpu_profiling.h \ include/starpu_bound.h \ include/starpu_scheduler.h \ include/starpu_sched_component.h \ include/starpu_sched_ctx.h \ include/starpu_sched_ctx_hypervisor.h \ include/starpu_top.h \ include/starpu_deprecated_api.h \ include/starpu_hash.h \ include/starpu_rand.h \ include/starpu_disk.h \ include/starpu_cublas.h \ include/starpu_cublas_v2.h \ include/starpu_cusparse.h \ include/starpu_driver.h \ include/starpu_stdlib.h \ include/starpu_thread.h \ include/starpu_thread_util.h \ include/starpu_tree.h \ include/starpu_simgrid_wrap.h \ include/starpu_mod.f90 \ include/fstarpu_mod.f90 nodist_versinclude_HEADERS = \ include/starpu_config.h noinst_HEADERS = \ include/pthread_win32/pthread.h \ include/pthread_win32/semaphore.h if BUILD_STARPU_TOP all-local: starpu-top/starpu_top$(EXEEXT) else all-local: endif if STARPU_DEVEL @if grep -r sys/time.h $$( find $(srcdir)/examples $(srcdir)/tests $(srcdir)/src $(srcdir)/mpi/src $(srcdir)/include -name \*.[ch] -a \! -name starpu_util.h -a \! -name timer.h -a \! -name loader.c ) ; \ then \ echo "Please do not include sys/time, it is not available on Windows, include starpu_util.h and use starpu_timing_now() instead" ; \ false ; \ fi @if grep -re '\' $$( find $(srcdir)/src $(srcdir)/mpi/src $(srcdir)/include -name \*.[ch] -a \! -name starpu_util.h -a \! -name utils.c -a \! -name simgrid.h) ; \ then \ echo "Please do not use getenv, use starpu_getenv instead, which catches unsafe uses"; \ false ; \ fi endif if BUILD_STARPU_TOP starpu-top/starpu_top$(EXEEXT): cd starpu-top ; $(QMAKE) ; $(MAKE) clean-local: cd starpu-top ; $(QMAKE) ; $(MAKE) clean ; $(RM) Makefile $(RM) starpu-top/starpu_top.1 starpu-top/starpu_top$(EXEEXT) # TODO: resources install-exec-local: $(MKDIR_P) $(DESTDIR)$(bindir) -$(INSTALL_STRIP_PROGRAM) starpu-top/starpu_top$(EXEEXT) $(DESTDIR)$(bindir) uninstall-local: $(RM) $(DESTDIR)$(bindir)/starpu_top$(EXEEXT) $(RM) starpu-top/starpu_top$(EXEEXT) $(RM) starpu-top/Makefile if STARPU_HAVE_HELP2MAN starpu-top/starpu_top.1: starpu-top/starpu_top$(EXEEXT) help2man --no-discard-stderr -N --output=$@ starpu-top/starpu_top$(EXEEXT) dist_man1_MANS =\ starpu-top/starpu_top.1 endif endif if STARPU_HAVE_WINDOWS txtdir = ${prefix} else txtdir = ${docdir} endif txt_DATA = AUTHORS COPYING.LGPL README README.dev STARPU-REVISION EXTRA_DIST = autogen.sh AUTHORS COPYING.LGPL README README.dev STARPU-VERSION STARPU-REVISION build-aux/svn2cl.xsl mic-configure DISTCLEANFILES = STARPU-REVISION include starpu-top/extradist showcheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET ctags-local: cd $(top_srcdir) ; $(CTAGS) -R -I LIST_TYPE sed -i $(top_srcdir)/tags -e '/^[^ ]* [^ ]* /d' -e '/^[^ ]*$$/d' # Cyclomatic complexity reports. # The pmccabe tool, see . PMCCABE = pmccabe VC_URL = "https://gforge.inria.fr/scm/viewvc.php/trunk/%FILENAME%?view=markup&root=starpu" # Generate a cyclomatic complexity report. Note that examples and tests are # excluded because they're not particularly relevant, and more importantly # they all have a function called `main', which clobbers the report. cyclomatic-complexity.html: $(PMCCABE) \ `find \( -name examples -o -name tests -o -path ./tools/dev/experimental \) -prune -o -name \*.c` \ | sort -nr \ | $(AWK) -f ${top_srcdir}/build-aux/pmccabe2html \ -v lang=html -v name="$(PACKAGE_NAME)" \ -v vcurl=$(VC_URL) \ -v url="$(PACKAGE_URL)" \ -v css=${top_srcdir}/build-aux/pmccabe.css \ -v cut_dir=${top_srcdir}/ \ > $@-tmp mv $@-tmp $@ starpu-1.2.3+dfsg/Makefile.in000066400000000000000000001532231320135501600160210ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2014, 2016-2017 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2015, 2016 CNRS # Copyright (C) 2014, 2016 Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @BUILD_TESTS_TRUE@am__append_1 = tests @USE_MPI_TRUE@am__append_2 = mpi @BUILD_EXAMPLES_TRUE@am__append_3 = examples @BUILD_SOCL_TRUE@am__append_4 = socl @BUILD_GCC_PLUGIN_TRUE@am__append_5 = gcc-plugin @BUILD_STARPUFFT_TRUE@am__append_6 = starpufft @STARPU_BUILD_SC_HYPERVISOR_TRUE@am__append_7 = sc_hypervisor subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(noinst_HEADERS) $(versinclude_HEADERS) \ $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = tests/regression/regression.sh \ tests/regression/profiles tests/regression/profiles.build.only \ socl/vendors/socl.icd socl/vendors/install/socl.icd \ libstarpu.pc starpu-1.0.pc starpu-1.1.pc starpu-1.2.pc \ starpu-top/StarPU-Top.pro starpu-top/StarPU-Top-qwt-embed.pri \ starpu-top/StarPU-Top-qwt-system.pri tools/msvc/starpu_var.bat CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pkgconfigdir)" \ "$(DESTDIR)$(txtdir)" "$(DESTDIR)$(versincludedir)" \ "$(DESTDIR)$(versincludedir)" NROFF = nroff MANS = $(dist_man1_MANS) DATA = $(pkgconfig_DATA) $(txt_DATA) HEADERS = $(nodist_versinclude_HEADERS) $(noinst_HEADERS) \ $(versinclude_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = src tools tests doc mpi examples socl gcc-plugin \ starpufft sc_hypervisor am__DIST_COMMON = $(dist_man1_MANS) $(srcdir)/Makefile.in \ $(srcdir)/libstarpu.pc.in $(srcdir)/starpu-1.0.pc.in \ $(srcdir)/starpu-1.1.pc.in $(srcdir)/starpu-1.2.pc.in \ $(srcdir)/starpu-top/extradist $(top_srcdir)/build-aux/ar-lib \ $(top_srcdir)/build-aux/compile \ $(top_srcdir)/build-aux/config.guess \ $(top_srcdir)/build-aux/config.sub \ $(top_srcdir)/build-aux/install-sh \ $(top_srcdir)/build-aux/ltmain.sh \ $(top_srcdir)/build-aux/missing \ $(top_srcdir)/gcc-plugin/include/starpu-gcc/config.h.in \ $(top_srcdir)/include/starpu_config.h.in \ $(top_srcdir)/socl/vendors/install/socl.icd.in \ $(top_srcdir)/socl/vendors/socl.icd.in \ $(top_srcdir)/src/common/config.h.in \ $(top_srcdir)/starpu-top/StarPU-Top-qwt-embed.pri.in \ $(top_srcdir)/starpu-top/StarPU-Top-qwt-system.pri.in \ $(top_srcdir)/starpu-top/StarPU-Top.pro.in \ $(top_srcdir)/starpu-top/config.h.in \ $(top_srcdir)/tests/regression/profiles.build.only.in \ $(top_srcdir)/tests/regression/profiles.in \ $(top_srcdir)/tests/regression/regression.sh.in \ $(top_srcdir)/tools/msvc/starpu_var.bat.in AUTHORS ChangeLog \ INSTALL README TODO build-aux/ar-lib build-aux/compile \ build-aux/config.guess build-aux/config.sub \ build-aux/install-sh build-aux/ltmain.sh build-aux/missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POTI_CFLAGS = @POTI_CFLAGS@ POTI_LIBS = @POTI_LIBS@ PROG_DATE = @PROG_DATE@ PROG_STAT = @PROG_STAT@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_COI_CPPFLAGS = @STARPU_COI_CPPFLAGS@ STARPU_COI_LDFLAGS = @STARPU_COI_LDFLAGS@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LEVELDB_LDFLAGS = @STARPU_LEVELDB_LDFLAGS@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RCCE_CFLAGS = @STARPU_RCCE_CFLAGS@ STARPU_RCCE_CPPFLAGS = @STARPU_RCCE_CPPFLAGS@ STARPU_RCCE_LDFLAGS = @STARPU_RCCE_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SCIF_CPPFLAGS = @STARPU_SCIF_CPPFLAGS@ STARPU_SCIF_LDFLAGS = @STARPU_SCIF_LDFLAGS@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SC_HYPERVISOR_DEBUG = @STARPU_SC_HYPERVISOR_DEBUG@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ mpifort_path = @mpifort_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ smpirun_path = @smpirun_path@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ACLOCAL_AMFLAGS = -I m4 CLEANFILES = *.gcno *.gcda *.linkinfo SUBDIRS = src tools $(am__append_1) doc $(am__append_2) \ $(am__append_3) $(am__append_4) $(am__append_5) \ $(am__append_6) $(am__append_7) pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libstarpu.pc starpu-1.0.pc starpu-1.1.pc starpu-1.2.pc versincludedir = $(includedir)/starpu/$(STARPU_EFFECTIVE_VERSION) versinclude_HEADERS = \ include/starpu.h \ include/starpu_bitmap.h \ include/starpu_data_filters.h \ include/starpu_data_interfaces.h \ include/starpu_worker.h \ include/starpu_task.h \ include/starpu_task_bundle.h \ include/starpu_task_list.h \ include/starpu_task_util.h \ include/starpu_data.h \ include/starpu_perfmodel.h \ include/starpu_util.h \ include/starpu_fxt.h \ include/starpu_cuda.h \ include/starpu_opencl.h \ include/starpu_openmp.h \ include/starpu_sink.h \ include/starpu_mic.h \ include/starpu_scc.h \ include/starpu_expert.h \ include/starpu_profiling.h \ include/starpu_bound.h \ include/starpu_scheduler.h \ include/starpu_sched_component.h \ include/starpu_sched_ctx.h \ include/starpu_sched_ctx_hypervisor.h \ include/starpu_top.h \ include/starpu_deprecated_api.h \ include/starpu_hash.h \ include/starpu_rand.h \ include/starpu_disk.h \ include/starpu_cublas.h \ include/starpu_cublas_v2.h \ include/starpu_cusparse.h \ include/starpu_driver.h \ include/starpu_stdlib.h \ include/starpu_thread.h \ include/starpu_thread_util.h \ include/starpu_tree.h \ include/starpu_simgrid_wrap.h \ include/starpu_mod.f90 \ include/fstarpu_mod.f90 nodist_versinclude_HEADERS = \ include/starpu_config.h noinst_HEADERS = \ include/pthread_win32/pthread.h \ include/pthread_win32/semaphore.h @BUILD_STARPU_TOP_TRUE@@STARPU_HAVE_HELP2MAN_TRUE@dist_man1_MANS = \ @BUILD_STARPU_TOP_TRUE@@STARPU_HAVE_HELP2MAN_TRUE@ starpu-top/starpu_top.1 @STARPU_HAVE_WINDOWS_FALSE@txtdir = ${docdir} @STARPU_HAVE_WINDOWS_TRUE@txtdir = ${prefix} txt_DATA = AUTHORS COPYING.LGPL README README.dev STARPU-REVISION EXTRA_DIST = autogen.sh AUTHORS COPYING.LGPL README README.dev \ STARPU-VERSION STARPU-REVISION build-aux/svn2cl.xsl \ mic-configure starpu-top/extradist \ starpu-top/configurationmanager.h starpu-top/taskmanager.cpp \ starpu-top/aboutdialog.cpp starpu-top/aboutdialog.h \ starpu-top/widgetwindowsmanager.cpp \ starpu-top/widgetwindowsmanager.h \ starpu-top/abstractwidgetwindow.cpp \ starpu-top/communicationthread.h \ starpu-top/configurationmanager.cpp \ starpu-top/starpu_top_types.h starpu-top/mainwindow.ui \ starpu-top/mainwindow.cpp starpu-top/sessionsetupmanager.cpp \ starpu-top/resources.qrc starpu-top/images \ starpu-top/images/connect.png starpu-top/images/debugon.png \ starpu-top/images/help.png starpu-top/images/starpu_top.png \ starpu-top/images/widget.png starpu-top/images/lock.png \ starpu-top/images/about.png starpu-top/images/add.png \ starpu-top/images/preferences.png \ starpu-top/images/outside.png starpu-top/images/inside.png \ starpu-top/images/quit.png starpu-top/images/remove.png \ starpu-top/images/play.png starpu-top/images/windows.png \ starpu-top/images/debugoff.png \ starpu-top/abstractwidgetwindow.h \ starpu-top/interactivewidget.h starpu-top/main.cpp \ starpu-top/debugconsole.h starpu-top/TODO.txt \ starpu-top/StarPU-Top-qwt-embed.pri starpu-top/qledindicator \ starpu-top/qledindicator/qledindicator.cpp \ starpu-top/qledindicator/qledindicator.h \ starpu-top/communicationthread.cpp starpu-top/debugconsole.ui \ starpu-top/dataaggregatorwidget.cpp starpu-top/datawidget.cpp \ starpu-top/datawidget.h starpu-top/debugconsole.cpp \ starpu-top/ganttwidget.h starpu-top/mainwindow.h \ starpu-top/ganttwidget.cpp starpu-top/qwt \ starpu-top/qwt/qwt_spline.cpp \ starpu-top/qwt/qwt_double_range.h \ starpu-top/qwt/qwt_plot_curve.cpp starpu-top/qwt/qwt_math.h \ starpu-top/qwt/qwt_scale_draw.cpp starpu-top/qwt/qwt_slider.h \ starpu-top/qwt/qwt_interval.h starpu-top/qwt/qwt_thermo.h \ starpu-top/qwt/qwt_text_label.h \ starpu-top/qwt/qwt_series_data.h \ starpu-top/qwt/qwt_plot_curve.h starpu-top/qwt/qwt_knob.h \ starpu-top/qwt/qwt_plot_seriesitem.h \ starpu-top/qwt/qwt_painter.h starpu-top/qwt/qwt_dial.cpp \ starpu-top/qwt/qwt_scale_map.cpp starpu-top/qwt/qwt_global.h \ starpu-top/qwt/qwt_double_range.cpp \ starpu-top/qwt/qwt_point_polar.h \ starpu-top/qwt/qwt_painter.cpp \ starpu-top/qwt/qwt_abstract_scale.cpp \ starpu-top/qwt/qwt_plot_dict.cpp \ starpu-top/qwt/qwt_series_data.cpp starpu-top/qwt/qwt_wheel.h \ starpu-top/qwt/qwt_plot_seriesitem.cpp \ starpu-top/qwt/qwt_abstract_scale_draw.h \ starpu-top/qwt/qwt_symbol.h starpu-top/qwt/qwt_text_engine.cpp \ starpu-top/qwt/qwt_plot_layout.cpp \ starpu-top/qwt/qwt_round_scale_draw.cpp \ starpu-top/qwt/qwt_plot.cpp starpu-top/qwt/qwt_clipper.cpp \ starpu-top/qwt/qwt_clipper.h starpu-top/qwt/qwt_point_3d.cpp \ starpu-top/qwt/qwt_legend.cpp \ starpu-top/qwt/qwt_scale_widget.h \ starpu-top/qwt/qwt_interval.cpp \ starpu-top/qwt/qwt_scale_draw.h starpu-top/qwt/qwt_plot_dict.h \ starpu-top/qwt/qwt_text.cpp \ starpu-top/qwt/qwt_scale_widget.cpp \ starpu-top/qwt/qwt_legend_item.cpp \ starpu-top/qwt/qwt_abstract_scale.h \ starpu-top/qwt/qwt_spline.h starpu-top/qwt/qwt_plot_canvas.h \ starpu-top/qwt/qwt_color_map.cpp \ starpu-top/qwt/qwt_dial_needle.h \ starpu-top/qwt/qwt_scale_map.h \ starpu-top/qwt/qwt_legend_item.h \ starpu-top/qwt/qwt_legend_itemmanager.h \ starpu-top/qwt/qwt_curve_fitter.h \ starpu-top/qwt/qwt_dyngrid_layout.cpp \ starpu-top/qwt/qwt_color_map.h starpu-top/qwt/qwt_scale_div.h \ starpu-top/qwt/qwt_plot_xml.cpp \ starpu-top/qwt/qwt_round_scale_draw.h \ starpu-top/qwt/qwt_text_engine.h starpu-top/qwt/qwt_dial.h \ starpu-top/qwt/qwt_dyngrid_layout.h \ starpu-top/qwt/qwt_plot_item.cpp \ starpu-top/qwt/qwt_curve_fitter.cpp \ starpu-top/qwt/qwt_dial_needle.cpp \ starpu-top/qwt/qwt_plot_item.h \ starpu-top/qwt/qwt_plot_axis.cpp starpu-top/qwt/qwt_slider.cpp \ starpu-top/qwt/qwt_text_label.cpp \ starpu-top/qwt/qwt_abstract_slider.h \ starpu-top/qwt/qwt_math.cpp \ starpu-top/qwt/qwt_abstract_slider.cpp \ starpu-top/qwt/qwt_plot_canvas.cpp \ starpu-top/qwt/qwt_thermo.cpp starpu-top/qwt/qwt_point_3d.h \ starpu-top/qwt/qwt_abstract_scale_draw.cpp \ starpu-top/qwt/qwt_plot_layout.h starpu-top/qwt/qwt_symbol.cpp \ starpu-top/qwt/qwt_plot.h starpu-top/qwt/qwt_text.h \ starpu-top/qwt/qwt_wheel.cpp \ starpu-top/qwt/qwt_point_polar.cpp \ starpu-top/qwt/qwt_scale_engine.h \ starpu-top/qwt/qwt_scale_engine.cpp \ starpu-top/qwt/qwt_scale_div.cpp starpu-top/qwt/qwt_knob.cpp \ starpu-top/qwt/qwt_legend.h starpu-top/taskmanager.h \ starpu-top/preferencesdialog.cpp \ starpu-top/communicationmanager.h starpu-top/aboutdialog.ui \ starpu-top/StarPU-Top-qwt-system.pri \ starpu-top/StarPU-Top.pro.user \ starpu-top/communicationmanager.cpp \ starpu-top/interactivewidget.cpp \ starpu-top/preferencesdialog.ui \ starpu-top/sessionsetupmanager.h \ starpu-top/StarPU-Top.pro.user.1.3 \ starpu-top/StarPU-Top-common.pri \ starpu-top/dataaggregatorwidget.h \ starpu-top/preferencesdialog.h starpu-top/StarPU-Top.pro.in DISTCLEANFILES = STARPU-REVISION # Cyclomatic complexity reports. # The pmccabe tool, see . PMCCABE = pmccabe VC_URL = "https://gforge.inria.fr/scm/viewvc.php/trunk/%FILENAME%?view=markup&root=starpu" all: all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/starpu-top/extradist $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(srcdir)/starpu-top/extradist $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): src/common/config.h: src/common/stamp-h1 @test -f $@ || rm -f src/common/stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) src/common/stamp-h1 src/common/stamp-h1: $(top_srcdir)/src/common/config.h.in $(top_builddir)/config.status @rm -f src/common/stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status src/common/config.h $(top_srcdir)/src/common/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f src/common/stamp-h1 touch $@ include/starpu_config.h: include/stamp-h2 @test -f $@ || rm -f include/stamp-h2 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) include/stamp-h2 include/stamp-h2: $(top_srcdir)/include/starpu_config.h.in $(top_builddir)/config.status @rm -f include/stamp-h2 cd $(top_builddir) && $(SHELL) ./config.status include/starpu_config.h gcc-plugin/include/starpu-gcc/config.h: gcc-plugin/include/starpu-gcc/stamp-h3 @test -f $@ || rm -f gcc-plugin/include/starpu-gcc/stamp-h3 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) gcc-plugin/include/starpu-gcc/stamp-h3 gcc-plugin/include/starpu-gcc/stamp-h3: $(top_srcdir)/gcc-plugin/include/starpu-gcc/config.h.in $(top_builddir)/config.status @rm -f gcc-plugin/include/starpu-gcc/stamp-h3 cd $(top_builddir) && $(SHELL) ./config.status gcc-plugin/include/starpu-gcc/config.h starpu-top/config.h: starpu-top/stamp-h4 @test -f $@ || rm -f starpu-top/stamp-h4 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) starpu-top/stamp-h4 starpu-top/stamp-h4: $(top_srcdir)/starpu-top/config.h.in $(top_builddir)/config.status @rm -f starpu-top/stamp-h4 cd $(top_builddir) && $(SHELL) ./config.status starpu-top/config.h distclean-hdr: -rm -f src/common/config.h src/common/stamp-h1 include/starpu_config.h include/stamp-h2 gcc-plugin/include/starpu-gcc/config.h gcc-plugin/include/starpu-gcc/stamp-h3 starpu-top/config.h starpu-top/stamp-h4 tests/regression/regression.sh: $(top_builddir)/config.status $(top_srcdir)/tests/regression/regression.sh.in cd $(top_builddir) && $(SHELL) ./config.status $@ tests/regression/profiles: $(top_builddir)/config.status $(top_srcdir)/tests/regression/profiles.in cd $(top_builddir) && $(SHELL) ./config.status $@ tests/regression/profiles.build.only: $(top_builddir)/config.status $(top_srcdir)/tests/regression/profiles.build.only.in cd $(top_builddir) && $(SHELL) ./config.status $@ socl/vendors/socl.icd: $(top_builddir)/config.status $(top_srcdir)/socl/vendors/socl.icd.in cd $(top_builddir) && $(SHELL) ./config.status $@ socl/vendors/install/socl.icd: $(top_builddir)/config.status $(top_srcdir)/socl/vendors/install/socl.icd.in cd $(top_builddir) && $(SHELL) ./config.status $@ libstarpu.pc: $(top_builddir)/config.status $(srcdir)/libstarpu.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ starpu-1.0.pc: $(top_builddir)/config.status $(srcdir)/starpu-1.0.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ starpu-1.1.pc: $(top_builddir)/config.status $(srcdir)/starpu-1.1.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ starpu-1.2.pc: $(top_builddir)/config.status $(srcdir)/starpu-1.2.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ starpu-top/StarPU-Top.pro: $(top_builddir)/config.status $(top_srcdir)/starpu-top/StarPU-Top.pro.in cd $(top_builddir) && $(SHELL) ./config.status $@ starpu-top/StarPU-Top-qwt-embed.pri: $(top_builddir)/config.status $(top_srcdir)/starpu-top/StarPU-Top-qwt-embed.pri.in cd $(top_builddir) && $(SHELL) ./config.status $@ starpu-top/StarPU-Top-qwt-system.pri: $(top_builddir)/config.status $(top_srcdir)/starpu-top/StarPU-Top-qwt-system.pri.in cd $(top_builddir) && $(SHELL) ./config.status $@ tools/msvc/starpu_var.bat: $(top_builddir)/config.status $(top_srcdir)/tools/msvc/starpu_var.bat.in cd $(top_builddir) && $(SHELL) ./config.status $@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt install-man1: $(dist_man1_MANS) @$(NORMAL_INSTALL) @list1='$(dist_man1_MANS)'; \ list2=''; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(dist_man1_MANS)'; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) install-txtDATA: $(txt_DATA) @$(NORMAL_INSTALL) @list='$(txt_DATA)'; test -n "$(txtdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(txtdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(txtdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(txtdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(txtdir)" || exit $$?; \ done uninstall-txtDATA: @$(NORMAL_UNINSTALL) @list='$(txt_DATA)'; test -n "$(txtdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(txtdir)'; $(am__uninstall_files_from_dir) install-nodist_versincludeHEADERS: $(nodist_versinclude_HEADERS) @$(NORMAL_INSTALL) @list='$(nodist_versinclude_HEADERS)'; test -n "$(versincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(versincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(versincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(versincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(versincludedir)" || exit $$?; \ done uninstall-nodist_versincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(nodist_versinclude_HEADERS)'; test -n "$(versincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(versincludedir)'; $(am__uninstall_files_from_dir) install-versincludeHEADERS: $(versinclude_HEADERS) @$(NORMAL_INSTALL) @list='$(versinclude_HEADERS)'; test -n "$(versincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(versincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(versincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(versincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(versincludedir)" || exit $$?; \ done uninstall-versincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(versinclude_HEADERS)'; test -n "$(versincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(versincludedir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(MANS) $(DATA) $(HEADERS) all-local installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(txtdir)" "$(DESTDIR)$(versincludedir)" "$(DESTDIR)$(versincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." @BUILD_STARPU_TOP_FALSE@uninstall-local: @BUILD_STARPU_TOP_FALSE@clean-local: @BUILD_STARPU_TOP_FALSE@install-exec-local: clean: clean-recursive clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr \ distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-man install-nodist_versincludeHEADERS \ install-pkgconfigDATA install-txtDATA \ install-versincludeHEADERS install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-exec-local install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-man1 install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-local uninstall-man \ uninstall-nodist_versincludeHEADERS uninstall-pkgconfigDATA \ uninstall-txtDATA uninstall-versincludeHEADERS uninstall-man: uninstall-man1 .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \ am--refresh check check-am clean clean-cscope clean-generic \ clean-libtool clean-local cscope cscopelist-am ctags ctags-am \ dist dist-all dist-bzip2 dist-gzip dist-lzip dist-shar \ dist-tarZ dist-xz dist-zip distcheck distclean \ distclean-generic distclean-hdr distclean-libtool \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-exec-local install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-nodist_versincludeHEADERS install-pdf \ install-pdf-am install-pkgconfigDATA install-ps install-ps-am \ install-strip install-txtDATA install-versincludeHEADERS \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-local \ uninstall-man uninstall-man1 \ uninstall-nodist_versincludeHEADERS uninstall-pkgconfigDATA \ uninstall-txtDATA uninstall-versincludeHEADERS .PRECIOUS: Makefile @BUILD_STARPU_TOP_TRUE@all-local: starpu-top/starpu_top$(EXEEXT) @BUILD_STARPU_TOP_FALSE@all-local: @STARPU_DEVEL_TRUE@ @if grep -r sys/time.h $$( find $(srcdir)/examples $(srcdir)/tests $(srcdir)/src $(srcdir)/mpi/src $(srcdir)/include -name \*.[ch] -a \! -name starpu_util.h -a \! -name timer.h -a \! -name loader.c ) ; \ @STARPU_DEVEL_TRUE@ then \ @STARPU_DEVEL_TRUE@ echo "Please do not include sys/time, it is not available on Windows, include starpu_util.h and use starpu_timing_now() instead" ; \ @STARPU_DEVEL_TRUE@ false ; \ @STARPU_DEVEL_TRUE@ fi @STARPU_DEVEL_TRUE@ @if grep -re '\' $$( find $(srcdir)/src $(srcdir)/mpi/src $(srcdir)/include -name \*.[ch] -a \! -name starpu_util.h -a \! -name utils.c -a \! -name simgrid.h) ; \ @STARPU_DEVEL_TRUE@ then \ @STARPU_DEVEL_TRUE@ echo "Please do not use getenv, use starpu_getenv instead, which catches unsafe uses"; \ @STARPU_DEVEL_TRUE@ false ; \ @STARPU_DEVEL_TRUE@ fi @BUILD_STARPU_TOP_TRUE@starpu-top/starpu_top$(EXEEXT): @BUILD_STARPU_TOP_TRUE@ cd starpu-top ; $(QMAKE) ; $(MAKE) @BUILD_STARPU_TOP_TRUE@clean-local: @BUILD_STARPU_TOP_TRUE@ cd starpu-top ; $(QMAKE) ; $(MAKE) clean ; $(RM) Makefile @BUILD_STARPU_TOP_TRUE@ $(RM) starpu-top/starpu_top.1 starpu-top/starpu_top$(EXEEXT) # TODO: resources @BUILD_STARPU_TOP_TRUE@install-exec-local: @BUILD_STARPU_TOP_TRUE@ $(MKDIR_P) $(DESTDIR)$(bindir) @BUILD_STARPU_TOP_TRUE@ -$(INSTALL_STRIP_PROGRAM) starpu-top/starpu_top$(EXEEXT) $(DESTDIR)$(bindir) @BUILD_STARPU_TOP_TRUE@uninstall-local: @BUILD_STARPU_TOP_TRUE@ $(RM) $(DESTDIR)$(bindir)/starpu_top$(EXEEXT) @BUILD_STARPU_TOP_TRUE@ $(RM) starpu-top/starpu_top$(EXEEXT) @BUILD_STARPU_TOP_TRUE@ $(RM) starpu-top/Makefile @BUILD_STARPU_TOP_TRUE@@STARPU_HAVE_HELP2MAN_TRUE@starpu-top/starpu_top.1: starpu-top/starpu_top$(EXEEXT) @BUILD_STARPU_TOP_TRUE@@STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N --output=$@ starpu-top/starpu_top$(EXEEXT) showcheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET ctags-local: cd $(top_srcdir) ; $(CTAGS) -R -I LIST_TYPE sed -i $(top_srcdir)/tags -e '/^[^ ]* [^ ]* /d' -e '/^[^ ]*$$/d' # Generate a cyclomatic complexity report. Note that examples and tests are # excluded because they're not particularly relevant, and more importantly # they all have a function called `main', which clobbers the report. cyclomatic-complexity.html: $(PMCCABE) \ `find \( -name examples -o -name tests -o -path ./tools/dev/experimental \) -prune -o -name \*.c` \ | sort -nr \ | $(AWK) -f ${top_srcdir}/build-aux/pmccabe2html \ -v lang=html -v name="$(PACKAGE_NAME)" \ -v vcurl=$(VC_URL) \ -v url="$(PACKAGE_URL)" \ -v css=${top_srcdir}/build-aux/pmccabe.css \ -v cut_dir=${top_srcdir}/ \ > $@-tmp mv $@-tmp $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.2.3+dfsg/README000066400000000000000000000145421320135501600146340ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2012, 2016 Université de Bordeaux # Copyright (C) 2010, 2011, 2013, 2014, 2015 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. ++=================++ || I. Introduction || ++=================++ +--------------------- | I.a. What is StarPU? StarPU is a runtime system that offers support for heterogeneous multicore machines. While many efforts are devoted to design efficient computation kernels for those architectures (e.g. to implement BLAS kernels on GPUs), StarPU not only takes care of offloading such kernels (and implementing data coherency across the machine), but it also makes sure the kernels are executed as efficiently as possible. +------------------------ | I.b. What StarPU is not StarPU is not a new language, and it does not extend existing languages either. StarPU does not help to write computation kernels. +--------------------------------- | I.c. (How) Could StarPU help me? While StarPU will not make it easier to write computation kernels, it does simplify their actual offloading as StarPU handle most low level aspects transparently. Obviously, it is crucial to have efficient kernels, but it must be noted that the way those kernels are mapped and scheduled onto the computational resources also affect the overall performance to a great extent. StarPU is especially helpful when considering multiple heterogeneous processing resources: statically mapping and synchronizing tasks in such a heterogeneous environment is already very difficult, making it in a portable way is virtually impossible. On the other hand, the scheduling capabilities of StarPU makes it possible to easily exploit all processors at the same time while taking advantage of their specificities in a portable fashion. ++==================++ || II. Requirements || ++==================++ * make * gcc (version >= 4.1) * if CUDA support is enabled * CUDA (version >= 2.2) * CUBLAS (version >= 2.2) * if OpenCL support is enabled * AMD SDK >= 2.3 if AMD driver is used * CUDA >= 3.2 if NVIDIA driver is used * extra requirements for the svn version (we usually use the Debian testing versions) * autoconf (version >= 2.60) * automake * makeinfo * libtool (version >= 2) * Remark: It is strongly recommanded that you also install the hwloc library before installing StarPU. This permits StarPU to actually map the processing units according to the machine topology. For more details on hwloc, see http://www.open-mpi.org/projects/hwloc/ . * To build the StarPU-Top tool the following packages (along with their development files) are also required: * libqt4-dev >= 4.7 * libqt4-network * libqt4-opengl * libqt4-sql * qt4-qmake ++=====================++ || III. Getting StarPU || ++=====================++ StarPU is available on https://gforge.inria.fr/projects/starpu/. The project's SVN repository can be checked out through anonymous access with the following command(s). $ svn checkout svn://scm.gforge.inria.fr/svn/starpu/trunk $ svn checkout --username anonsvn https://scm.gforge.inria.fr/svn/starpu/trunk The password is 'anonsvn' ++=============================++ || IV. Building and Installing || ++=============================++ +--------------------------- | IV.a. For svn version only Please skip this step if you are building from a tarball. $ ./autogen.sh +----------------------- | IV.b. For all versions $ ./configure $ make $ make install +--------------------- | IV.c. Windows build: StarPU can be built using MinGW or Cygwin. To avoid the cygwin dependency, we provide MinGW-built binaries. The build process produces libstarpu.dll, libstarpu.def, and libstarpu.lib, which should be enough to use it from e.g. Microsoft Visual Studio. Update the video drivers to the latest stable release available for your hardware. Old ATI drivers (< 2.3) contain bugs that cause OpenCL support in StarPU to hang or exhibit incorrect behaviour. For details on the Windows build process, see the INSTALL file. ++======================================================++ || V. Running StarPU Applications on Microsoft Visual C || ++======================================================++ Batch files are provided to run StarPU applications under Microsoft Visual C. They are installed in path_to_starpu/bin/msvc. To execute a StarPU application, you first need to set the environment variable STARPU_PATH. c:\....> cd c:\cygwin\home\ci\starpu\ c:\....> set STARPU_PATH=c:\cygwin\home\ci\starpu\ c:\....> cd bin\msvc c:\....> starpu_open.bat starpu_simple.c The batch script will run Microsoft Visual C with a basic project file to run the given application. The batch script starpu_clean.bat can be used to delete all compilation generated files. The batch script starpu_exec.bat can be used to compile and execute a StarPU application from the command prompt. c:\....> cd c:\cygwin\home\ci\starpu\ c:\....> set STARPU_PATH=c:\cygwin\home\ci\starpu\ c:\....> cd bin\msvc c:\....> starpu_exec.bat ..\..\..\..\examples\basic_examples\hello_world.c MSVC StarPU Execution ... /out:hello_world.exe ... Hello world (params = {1, 2.00000}) Callback function got argument 0000042 c:\....> ++===================++ || VI. Documentation || ++===================++ Doxygen documentation is available in doc/doxygen. If the doxygen tools are available on the machine, pdf and html documentation can be generated by running $ make -C doc ++=============++ || VII. Trying || ++=============++ Some examples ready to run are installed into $prefix/lib/starpu/{examples,mpi} ++===============++ || VIII. Upgrade || ++===============++ To upgrade your source code from older version (there were quite a few renamings), use the tools/dev/rename.sh script ++=============++ || IX. Contact || ++=============++ For any questions regarding StarPU, please contact the starpu-devel mailing-list at starpu-devel@lists.gforge.inria.fr . starpu-1.2.3+dfsg/README.dev000066400000000000000000000054511320135501600154100ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009, 2010, 2011, 2016 Université de Bordeaux # Copyright (C) 2010, 2011, 2016 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. Contents ======== - Directory structure - Developer Warnings - Naming Conventions - Coding Style - Error handling Directory structure ------------------- The directory structure is as follows: - src : internal source for StarPU - include : public API - tests : unitary tests - examples : examples using StarPU - doc : documentation for StarPU - tools : tools for StarPU StarPU extensions have their own directory (src/include/tests/examples) structure: - mpi : The MPI support - socl : the StarPU OpenCL-compatible interface - gcc-plugin : the GCC plug-in that extends the C programming language with pragmas and attributes - sc_hypervisor : The Scheduling Context Hypervisor - starpufft : The FFT support - starpu-top : StarPU-Top Interface Some directories contain only build system details: - build-aux - m4 - autom4te.cache Developer Warnings ------------------ They are enabled only if the STARPU_DEVEL environment variable is defined to a non-empty value, when calling configure. Naming Conventions ------------------ * Prefix names of public objects (types, functions, etc.) with "starpu" * Prefix names of internal objects (types, functions, etc.) with "_starpu" * Names for qualified types (struct, union, enum) do not end with _t, _s or similar. Use _t only for typedef types, such as opaque public types, e.g typedef struct _starpu_data_state* starpu_data_handle_t; or typedef uint64_t starpu_tag_t; * When a variable can only take a finite set of values, use an enum type instead of defining macros for each of the values. Coding Style ------------ * Curly braces always go on a new line Error handling -------------- * Use STARPU_ABORT() for catastrophic errors, from which StarPU will never recover. switch (node_kind) { case STARPU_CPU_RAM: do_stg(); break; ... default: /* We cannot be here */ STARPU_ABORT(); } * Use STARPU_ASSERT() to run checks that are very likely to succeed, but still are useful for debugging purposes. It should be OK to disable them with --enable-fast. STARPU_ASSERT(j->terminated != 0) starpu-1.2.3+dfsg/STARPU-REVISION000066400000000000000000000000061320135501600161370ustar00rootroot0000000000000022445 starpu-1.2.3+dfsg/STARPU-VERSION000066400000000000000000000037331320135501600160400ustar00rootroot00000000000000# -*- sh -*- # Versioning (SONAMEs) for StarPU libraries. # http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html#Updating-version-info # Here are a set of rules to help you update your library version information: # Start with version information of ‘0:0:0’ for each libtool library. # Update the version information only immediately before a public # release of your software. More frequent updates are unnecessary, and # only guarantee that the current interface number gets larger faster. # - If the library source code has changed at all since the last # update, then increment revision (‘c:r:a’ becomes ‘c:r+1:a’). # - If any interfaces have been added, removed, or changed since the # last update, increment current, and set revision to 0. # - If any interfaces have been added since the last public release, # then increment age. # - If any interfaces have been removed or changed since the last # public release, then set age to 0. change # This is the tarball version, major.minor STARPU_EFFECTIVE_VERSION=1.2 # Note for StarPU 1.1: we have changed ABI # Note for StarPU 1.2: reset everything to 0:0:0 # Libtool interface versioning (info "(libtool) Versioning"). LIBSTARPU_INTERFACE_CURRENT=3 # increment upon ABI change LIBSTARPU_INTERFACE_REVISION=0 # increment upon implementation change LIBSTARPU_INTERFACE_AGE=0 # set to CURRENT - PREVIOUS interface LIBSTARPUFFT_INTERFACE_CURRENT=0 # increment upon ABI change LIBSTARPUFFT_INTERFACE_REVISION=0 # increment upon implementation change LIBSTARPUFFT_INTERFACE_AGE=0 # set to CURRENT - PREVIOUS interface LIBSTARPUMPI_INTERFACE_CURRENT=2 # increment upon ABI change LIBSTARPUMPI_INTERFACE_REVISION=0 # increment upon implementation change LIBSTARPUMPI_INTERFACE_AGE=0 # set to CURRENT - PREVIOUS interface LIBSOCL_INTERFACE_CURRENT=0 # increment upon ABI change LIBSOCL_INTERFACE_REVISION=2 # increment upon implementation change LIBSOCL_INTERFACE_AGE=0 # set to CURRENT - PREVIOUS interface starpu-1.2.3+dfsg/TODO000066400000000000000000000005731320135501600144430ustar00rootroot00000000000000 Moving access modes for data handles from struct starpu_task to struct starpu_codelet ===================================================================================== TODO list - Make struct starpu_data_descr private (or not, as it can still be used in tests and examples) - When cost_model is provided, but not cost_function, need to rebuild a struct starpu_data_descr starpu-1.2.3+dfsg/aclocal.m4000066400000000000000000001265361320135501600156230ustar00rootroot00000000000000# generated automatically by aclocal 1.15 -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.15' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.15], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.15])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # Copyright (C) 2011-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_AR([ACT-IF-FAIL]) # ------------------------- # Try to determine the archiver interface, and trigger the ar-lib wrapper # if it is needed. If the detection of archiver interface fails, run # ACT-IF-FAIL (default is to abort configure with a proper error message). AC_DEFUN([AM_PROG_AR], [AC_BEFORE([$0], [LT_INIT])dnl AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([ar-lib])dnl AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false]) : ${AR=ar} AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface], [AC_LANG_PUSH([C]) am_cv_ar_interface=ar AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])], [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([am_ar_try]) if test "$ac_status" -eq 0; then am_cv_ar_interface=ar else am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([am_ar_try]) if test "$ac_status" -eq 0; then am_cv_ar_interface=lib else am_cv_ar_interface=unknown fi fi rm -f conftest.lib libconftest.a ]) AC_LANG_POP([C])]) case $am_cv_ar_interface in ar) ;; lib) # Microsoft lib, so override with the ar-lib wrapper script. # FIXME: It is wrong to rewrite AR. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__AR in this case, # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something # similar. AR="$am_aux_dir/ar-lib $AR" ;; unknown) m4_default([$1], [AC_MSG_ERROR([could not determine $AR interface])]) ;; esac AC_SUBST([AR])dnl ]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/acinclude.m4]) m4_include([m4/gcc.m4]) m4_include([m4/libs.m4]) m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) m4_include([m4/pkg.m4]) starpu-1.2.3+dfsg/autogen.sh000077500000000000000000000017131320135501600157510ustar00rootroot00000000000000#!/bin/sh # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010, 2016 Université de Bordeaux # Copyright (C) 2010 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. if ! libtool --version > /dev/null then # Perhaps we are on a Mac if ! glibtool --version > /dev/null then echo "GNU Libtool is missing, please install it and fix the PATH to it." exit 1 else export LIBTOOL=glibtool export LIBTOOLIZE=glibtoolize fi fi autoreconf -ivf -I m4 starpu-1.2.3+dfsg/build-aux/000077500000000000000000000000001320135501600156405ustar00rootroot00000000000000starpu-1.2.3+dfsg/build-aux/ar-lib000077500000000000000000000133021320135501600167330ustar00rootroot00000000000000#! /bin/sh # Wrapper for Microsoft lib.exe me=ar-lib scriptversion=2012-03-01.08; # UTC # Copyright (C) 2010-2014 Free Software Foundation, Inc. # Written by Peter Rosin . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # func_error message func_error () { echo "$me: $1" 1>&2 exit 1 } file_conv= # func_file_conv build_file # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv in mingw) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin) file=`cygpath -m "$file" || echo "$file"` ;; wine) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_at_file at_file operation archive # Iterate over all members in AT_FILE performing OPERATION on ARCHIVE # for each of them. # When interpreting the content of the @FILE, do NOT use func_file_conv, # since the user would need to supply preconverted file names to # binutils ar, at least for MinGW. func_at_file () { operation=$2 archive=$3 at_file_contents=`cat "$1"` eval set x "$at_file_contents" shift for member do $AR -NOLOGO $operation:"$member" "$archive" || exit $? done } case $1 in '') func_error "no command. Try '$0 --help' for more information." ;; -h | --h*) cat <. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: starpu-1.2.3+dfsg/build-aux/config.guess000077500000000000000000001303611320135501600201640ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-06-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches with a ChangeLog entry to config-patches@gnu.org. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; or1k:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: starpu-1.2.3+dfsg/build-aux/config.sub000077500000000000000000001053541320135501600176330ustar00rootroot00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-08-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 \ | or1k | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or1k-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: starpu-1.2.3+dfsg/build-aux/depcomp000077500000000000000000000560161320135501600172250ustar00rootroot00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2013-05-30.07; # UTC # Copyright (C) 1999-2014 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: starpu-1.2.3+dfsg/build-aux/install-sh000077500000000000000000000354631320135501600176570ustar00rootroot00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2014-09-12.12; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) # $RANDOM is not portable (e.g. dash); use it when possible to # lower collision chance tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 # As "mkdir -p" follows symlinks and we work in /tmp possibly; so # create the $tmpdir first (and fail if unsuccessful) to make sure # that nobody tries to guess the $tmpdir name. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: starpu-1.2.3+dfsg/build-aux/ltmain.sh000066400000000000000000010520301320135501600174610ustar00rootroot00000000000000 # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1.11 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION="2.4.2 Debian-2.4.2-1.11" TIMESTAMP="" package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS%" test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; *) func_fatal_configuration "$modename: unknown library version type \`$version_type'" ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 starpu-1.2.3+dfsg/build-aux/missing000077500000000000000000000153301320135501600172410ustar00rootroot00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2013-10-28.13; # UTC # Copyright (C) 1996-2014 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: starpu-1.2.3+dfsg/build-aux/svn2cl.xsl000066400000000000000000000373511320135501600176100ustar00rootroot00000000000000 / / [r ] * , . , [DEL] [CPY] [ADD] starpu-1.2.3+dfsg/build-aux/test-driver000077500000000000000000000110401320135501600200320ustar00rootroot00000000000000#! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2013-07-13.22; # UTC # Copyright (C) 2011-2014 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # Make unconditional expansion of undefined variables an error. This # helps a lot in preventing typo-related bugs. set -u usage_error () { echo "$0: $*" >&2 print_usage >&2 exit 2 } print_usage () { cat <$log_file 2>&1 estatus=$? if test $enable_hard_errors = no && test $estatus -eq 99; then tweaked_estatus=1 else tweaked_estatus=$estatus fi case $tweaked_estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac # Report the test outcome and exit status in the logs, so that one can # know whether the test passed or failed simply by looking at the '.log' # file, without the need of also peaking into the corresponding '.trs' # file (automake bug#11814). echo "$res $test_name (exit status: $estatus)" >>$log_file # Report outcome to console. echo "${col}${res}${std}: $test_name" # Register the test result, and other relevant metadata. echo ":test-result: $res" > $trs_file echo ":global-test-result: $res" >> $trs_file echo ":recheck: $recheck" >> $trs_file echo ":copy-in-global-log: $gcopy" >> $trs_file # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: starpu-1.2.3+dfsg/build-aux/ylwrap000077500000000000000000000153121320135501600171060ustar00rootroot00000000000000#! /bin/sh # ylwrap - wrapper for lex/yacc invocations. scriptversion=2013-01-12.17; # UTC # Copyright (C) 1996-2014 Free Software Foundation, Inc. # # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . get_dirname () { case $1 in */*|*\\*) printf '%s\n' "$1" | sed -e 's|\([\\/]\)[^\\/]*$|\1|';; # Otherwise, we want the empty string (not "."). esac } # guard FILE # ---------- # The CPP macro used to guard inclusion of FILE. guard () { printf '%s\n' "$1" \ | sed \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \ -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g' \ -e 's/__*/_/g' } # quote_for_sed [STRING] # ---------------------- # Return STRING (or stdin) quoted to be used as a sed pattern. quote_for_sed () { case $# in 0) cat;; 1) printf '%s\n' "$1";; esac \ | sed -e 's|[][\\.*]|\\&|g' } case "$1" in '') echo "$0: No files given. Try '$0 --help' for more information." 1>&2 exit 1 ;; --basedir) basedir=$2 shift 2 ;; -h|--h*) cat <<\EOF Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]... Wrapper for lex/yacc invocations, renaming files as desired. INPUT is the input file OUTPUT is one file PROG generates DESIRED is the file we actually want instead of OUTPUT PROGRAM is program to run ARGS are passed to PROG Any number of OUTPUT,DESIRED pairs may be used. Report bugs to . EOF exit $? ;; -v|--v*) echo "ylwrap $scriptversion" exit $? ;; esac # The input. input=$1 shift # We'll later need for a correct munging of "#line" directives. input_sub_rx=`get_dirname "$input" | quote_for_sed` case $input in [\\/]* | ?:[\\/]*) # Absolute path; do nothing. ;; *) # Relative path. Make it absolute. input=`pwd`/$input ;; esac input_rx=`get_dirname "$input" | quote_for_sed` # Since DOS filename conventions don't allow two dots, # the DOS version of Bison writes out y_tab.c instead of y.tab.c # and y_tab.h instead of y.tab.h. Test to see if this is the case. y_tab_nodot=false if test -f y_tab.c || test -f y_tab.h; then y_tab_nodot=true fi # The parser itself, the first file, is the destination of the .y.c # rule in the Makefile. parser=$1 # A sed program to s/FROM/TO/g for all the FROM/TO so that, for # instance, we rename #include "y.tab.h" into #include "parse.h" # during the conversion from y.tab.c to parse.c. sed_fix_filenames= # Also rename header guards, as Bison 2.7 for instance uses its header # guard in its implementation file. sed_fix_header_guards= while test $# -ne 0; do if test x"$1" = x"--"; then shift break fi from=$1 # Handle y_tab.c and y_tab.h output by DOS if $y_tab_nodot; then case $from in "y.tab.c") from=y_tab.c;; "y.tab.h") from=y_tab.h;; esac fi shift to=$1 shift sed_fix_filenames="${sed_fix_filenames}s|"`quote_for_sed "$from"`"|$to|g;" sed_fix_header_guards="${sed_fix_header_guards}s|"`guard "$from"`"|"`guard "$to"`"|g;" done # The program to run. prog=$1 shift # Make any relative path in $prog absolute. case $prog in [\\/]* | ?:[\\/]*) ;; *[\\/]*) prog=`pwd`/$prog ;; esac dirname=ylwrap$$ do_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 mkdir $dirname || exit 1 cd $dirname case $# in 0) "$prog" "$input" ;; *) "$prog" "$@" "$input" ;; esac ret=$? if test $ret -eq 0; then for from in * do to=`printf '%s\n' "$from" | sed "$sed_fix_filenames"` if test -f "$from"; then # If $2 is an absolute path name, then just use that, # otherwise prepend '../'. case $to in [\\/]* | ?:[\\/]*) target=$to;; *) target=../$to;; esac # Do not overwrite unchanged header files to avoid useless # recompilations. Always update the parser itself: it is the # destination of the .y.c rule in the Makefile. Divert the # output of all other files to a temporary file so we can # compare them to existing versions. if test $from != $parser; then realtarget=$target target=tmp-`printf '%s\n' "$target" | sed 's|.*[\\/]||g'` fi # Munge "#line" or "#" directives. Don't let the resulting # debug information point at an absolute srcdir. Use the real # output file name, not yy.lex.c for instance. Adjust the # include guards too. sed -e "/^#/!b" \ -e "s|$input_rx|$input_sub_rx|" \ -e "$sed_fix_filenames" \ -e "$sed_fix_header_guards" \ "$from" >"$target" || ret=$? # Check whether files must be updated. if test "$from" != "$parser"; then if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then echo "$to is unchanged" rm -f "$target" else echo "updating $to" mv -f "$target" "$realtarget" fi fi else # A missing file is only an error for the parser. This is a # blatant hack to let us support using "yacc -d". If -d is not # specified, don't fail when the header file is "missing". if test "$from" = "$parser"; then ret=1 fi fi done fi # Remove the directory. cd .. rm -rf $dirname exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: starpu-1.2.3+dfsg/configure000077500000000000000000044320411320135501600156650ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for StarPU 1.2.3. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: starpu-devel@lists.gforge.inria.fr about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='StarPU' PACKAGE_TARNAME='starpu' PACKAGE_VERSION='1.2.3' PACKAGE_STRING='StarPU 1.2.3' PACKAGE_BUGREPORT='starpu-devel@lists.gforge.inria.fr' PACKAGE_URL='http://runtime.bordeaux.inria.fr/StarPU/' ac_unique_file="include/starpu.h" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS STARPU_SANITIZE_FALSE STARPU_SANITIZE_TRUE SOCL_VENDORS STARPU_EXPORTED_LIBS LIBSTARPU_LINK LIBSTARPU_LDFLAGS AVAILABLE_DOC_FALSE AVAILABLE_DOC_TRUE BUILD_DOC_FALSE BUILD_DOC_TRUE epstopdfcommand pdflatexcommand doxygencommand STARPU_HAVE_AM111_FALSE STARPU_HAVE_AM111_TRUE STARPU_HAVE_HELP2MAN_FALSE STARPU_HAVE_HELP2MAN_TRUE HELP2MAN STARPU_HAVE_ICC_FALSE STARPU_HAVE_ICC_TRUE ICC STARPU_HAVE_F77_H_FALSE STARPU_HAVE_F77_H_TRUE STARPU_HAVE_F77_H HWLOC_REQUIRES STARPU_HWLOC_HAVE_TOPOLOGY_DUP_FALSE STARPU_HWLOC_HAVE_TOPOLOGY_DUP_TRUE STARPU_HAVE_HWLOC STARPU_HAVE_HWLOC_FALSE STARPU_HAVE_HWLOC_TRUE HWLOC_LIBS HWLOC_CFLAGS BUILD_STARPUFFT_EXAMPLES_FALSE BUILD_STARPUFFT_EXAMPLES_TRUE BUILD_STARPUFFT_FALSE BUILD_STARPUFFT_TRUE STARPU_HAVE_FFTWL_FALSE STARPU_HAVE_FFTWL_TRUE HAVE_FFTWFL FFTWL_LIBS FFTWL_CFLAGS STARPU_HAVE_FFTWF_FALSE STARPU_HAVE_FFTWF_TRUE STARPU_HAVE_FFTWF FFTWF_LIBS FFTWF_CFLAGS STARPU_HAVE_FFTW_FALSE STARPU_HAVE_FFTW_TRUE STARPU_HAVE_FFTW FFTW_LIBS FFTW_CFLAGS BLAS_LIB NO_BLAS_LIB_FALSE NO_BLAS_LIB_TRUE SYSTEM_BLAS_LIB_FALSE SYSTEM_BLAS_LIB_TRUE MKL_BLAS_LIB_FALSE MKL_BLAS_LIB_TRUE GOTO_BLAS_LIB_FALSE GOTO_BLAS_LIB_TRUE ATLAS_BLAS_LIB_FALSE ATLAS_BLAS_LIB_TRUE BLAS_LIBS ATLASDIR STARPU_BLAS_LDFLAGS GOTODIR HAVE_X11_FALSE HAVE_X11_TRUE X_EXTRA_LIBS X_LIBS X_PRE_LIBS X_CFLAGS XMKMF HAVE_OPENGL_FALSE HAVE_OPENGL_TRUE STARPU_OPENGL_RENDER STARPU_OPENGL_RENDER_LDFLAGS BUILD_EXAMPLES_FALSE BUILD_EXAMPLES_TRUE BUILD_TESTS_FALSE BUILD_TESTS_TRUE GDB SOCL_OCL_LIB_OPENCL_DIR STARPU_USE_SOCL_FALSE STARPU_USE_SOCL_TRUE BUILD_SOCL_FALSE BUILD_SOCL_TRUE STARPU_HAVE_OPENMP_FALSE STARPU_HAVE_OPENMP_TRUE STARPU_OPENMP_FALSE STARPU_OPENMP_TRUE RUN_GCC_PLUGIN_TESTS_FALSE RUN_GCC_PLUGIN_TESTS_TRUE BUILD_GCC_PLUGIN_FALSE BUILD_GCC_PLUGIN_TRUE YACC GUILE HAVE_PTR_DEREFS_MAY_ALIAS_P_FALSE HAVE_PTR_DEREFS_MAY_ALIAS_P_TRUE GCC_PLUGIN_PKGCONFIG GCC_PLUGIN_DIR_PKGCONFIG gccplugindir STARPU_GCC_VERSION_MINOR STARPU_GCC_VERSION_MAJOR GCC_PLUGIN_INCLUDE_DIR GCC_FOR_PLUGIN_LIBTOOL_TAG GCC_FOR_PLUGIN STARPU_HAVE_MPIFORT_FALSE STARPU_HAVE_MPIFORT_TRUE STARPU_HAVE_F77_FALSE STARPU_HAVE_F77_TRUE STARPU_HAVE_FC_FALSE STARPU_HAVE_FC_TRUE MPIFORT mpifort_path pkglibdir GLOBAL_AM_CFLAGS STARPU_DEVEL_FALSE STARPU_DEVEL_TRUE BUILD_STARPU_TOP_FALSE BUILD_STARPU_TOP_TRUE STARPU_USE_TOP QWT_PRI STARPU_QWT_LDFLAGS STARPU_QWT_INCLUDE QMAKE MPIEXEC_ARGS USE_MPI_FALSE USE_MPI_TRUE USE_MPI MPIEXEC STARPU_MPI_CHECK_FALSE STARPU_MPI_CHECK_TRUE mpiexec_path CC_OR_MPICC MPICC_LDFLAGS MPICC smpirun_path mpicc_path STARPU_HAVE_LEVELDB_FALSE STARPU_HAVE_LEVELDB_TRUE STARPU_LEVELDB_LDFLAGS STARPU_USE_AYUDAME2_FALSE STARPU_USE_AYUDAME2_TRUE STARPU_USE_AYUDAME1_FALSE STARPU_USE_AYUDAME1_TRUE STARPU_GLPK_LDFLAGS STARPU_ENABLE_STATS STATS STARPU_PERF_DEBUG POTI_LIBS POTI_CFLAGS FXT_LDFLAGS FXT_LIBS FXT_CFLAGS STARPU_USE_FXT_FALSE STARPU_USE_FXT_TRUE STARPU_USE_FXT FXTDIR STARPU_COVERAGE_ENABLED_FALSE STARPU_COVERAGE_ENABLED_TRUE COVERAGE STARPU_EXPORT_DYNAMIC STARPU_USE_MP_FALSE STARPU_USE_MP_TRUE STARPU_USE_SCC_FALSE STARPU_USE_SCC_TRUE STARPU_RCCE_LDFLAGS STARPU_RCCE_CPPFLAGS STARPU_RCCE_CFLAGS STARPU_SCIF_LDFLAGS STARPU_SCIF_CPPFLAGS STARPU_COI_LDFLAGS STARPU_COI_CPPFLAGS SIMGRID_LIBS SIMGRID_CFLAGS STARPU_SIMGRID_FALSE STARPU_SIMGRID_TRUE STARPU_OPENCL_LDFLAGS STARPU_OPENCL_CPPFLAGS STARPU_OPENCL_DATAdir STARPU_USE_OPENCL_FALSE STARPU_USE_OPENCL_TRUE STARPU_USE_OPENCL NVCCFLAGS NVCC_CC STARPU_CUDA_CPPFLAGS STARPU_CUFFT_LDFLAGS STARPU_CUDA_LDFLAGS STARPU_CURAND_LDFLAGS STARPU_HAVE_CUFFTDOUBLECOMPLEX_FALSE STARPU_HAVE_CUFFTDOUBLECOMPLEX_TRUE STARPU_HAVE_MAGMA_FALSE STARPU_HAVE_MAGMA_TRUE STARPU_HAVE_MAGMA MAGMA_LIBS MAGMA_CFLAGS PKG_CONFIG STARPU_CUDA_FORTRAN_LDFLAGS STARPU_USE_CUDA_FALSE STARPU_USE_CUDA_TRUE STARPU_USE_CUDA NVCC STARPU_USE_CPU_FALSE STARPU_USE_CPU_TRUE STARPU_USE_CPU STARPU_SC_HYPERVISOR_DEBUG_FALSE STARPU_SC_HYPERVISOR_DEBUG_TRUE STARPU_SC_HYPERVISOR_DEBUG STARPU_USE_SC_HYPERVISOR_FALSE STARPU_USE_SC_HYPERVISOR_TRUE STARPU_BUILD_SC_HYPERVISOR_FALSE STARPU_BUILD_SC_HYPERVISOR_TRUE STARPU_SC_HYPERVISOR STARPU_LIBNUMA_LDFLAGS STARPU_NEW_CHECK_FALSE STARPU_NEW_CHECK_TRUE STARPU_LONG_CHECK_FALSE STARPU_LONG_CHECK_TRUE STARPU_QUICK_CHECK_FALSE STARPU_QUICK_CHECK_TRUE STARPU_SRC_DIR STARPU_BUILD_DIR STARPU_MS_LIB_ARCH STARPU_OPENBSD_SYS_FALSE STARPU_OPENBSD_SYS_TRUE STARPU_HAVE_DARWIN_FALSE STARPU_HAVE_DARWIN_TRUE STARPU_LINUX_SYS_FALSE STARPU_LINUX_SYS_TRUE STARPU_HAVE_WINDOWS_FALSE STARPU_HAVE_WINDOWS_TRUE STARPU_HAVE_MS_LIB_FALSE STARPU_HAVE_MS_LIB_TRUE STARPU_MS_LIB STARPU_USE_MIC_FALSE STARPU_USE_MIC_TRUE STARPU_CROSS_COMPILING_FALSE STARPU_CROSS_COMPILING_TRUE svnversioncommand svncommand BASH CXXCPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP LIBTOOL OBJDUMP DLLTOOL AS OPENMP_CFLAGS PROG_DATE PROG_STAT ac_ct_FC FCFLAGS FC ac_ct_F77 FFLAGS F77 LN_S SED CPP am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC ac_ct_AR AR AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_os target_vendor target_cpu target host_os host_vendor host_cpu host build_os build_vendor build_cpu build LIBSOCL_INTERFACE_AGE LIBSOCL_INTERFACE_REVISION LIBSOCL_INTERFACE_CURRENT LIBSTARPUFFT_INTERFACE_AGE LIBSTARPUFFT_INTERFACE_REVISION LIBSTARPUFFT_INTERFACE_CURRENT LIBSTARPUMPI_INTERFACE_AGE LIBSTARPUMPI_INTERFACE_REVISION LIBSTARPUMPI_INTERFACE_CURRENT LIBSTARPU_INTERFACE_AGE LIBSTARPU_INTERFACE_REVISION LIBSTARPU_INTERFACE_CURRENT STARPU_EFFECTIVE_VERSION STARPU_RELEASE_VERSION STARPU_MINOR_VERSION STARPU_MAJOR_VERSION target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_openmp enable_shared enable_static with_pic enable_fast_install with_gnu_ld with_sysroot enable_libtool_lock enable_mic enable_mic_rma enable_native_winthreads enable_default_drand48 enable_quick_check enable_long_check enable_new_check enable_valgrind enable_max_sched_ctxs enable_sc_hypervisor enable_sc_hypervisor_debug enable_maxcpus enable_cpu enable_maxcudadev enable_cuda with_cuda_dir with_cuda_include_dir with_cuda_lib_dir enable_cuda_memcpy_peer enable_maxopencldev enable_opencl with_opencl_dir with_opencl_include_dir with_opencl_lib_dir enable_asynchronous_copy enable_asynchronous_cuda_copy enable_asynchronous_opencl_copy enable_asynchronous_mic_copy enable_opencl_simulator with_simgrid_dir with_simgrid_include_dir with_simgrid_lib_dir enable_simgrid enable_blocking_drivers enable_native_mic with_compiler with_mic_param with_host_param enable_maxmicdev enable_maxmicthreads with_coi_dir with_coi_include_dir with_coi_lib_dir with_scif_dir with_scif_include_dir with_scif_lib_dir enable_rcce with_rcce_dir with_rcce_include_dir with_rcce_lib_dir enable_export_dynamic enable_maxmpkernels enable_debug enable_spinlock_check enable_fstack_protector_all enable_fast enable_verbose enable_coverage with_fxt enable_fxt_lock enable_perf_debug enable_model_debug enable_stats enable_memory_stats enable_glpk with_ayudame1_include_dir with_ayudame2_include_dir enable_ayudame1 enable_ayudame2 enable_maxbuffers enable_maxnodes enable_allocation_cache with_perf_model_dir enable_maximplementations enable_leveldb enable_calibration_heuristic with_mpicc with_smpirun enable_mpi_check with_mpiexec with_mpiexec_args enable_mpi_progression_hook enable_mpi_verbose enable_starpu_top with_qwt_include_dir with_qwt_lib_dir with_qwt_lib enable_fortran with_mpifort enable_gcc_extensions enable_socl enable_build_tests enable_build_examples enable_opengl_render with_x enable_blas_lib with_goto_dir with_atlas_dir with_mkl_cflags with_mkl_ldflags enable_starpufft enable_starpufft_examples with_hwloc enable_build_doc ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CPP F77 FFLAGS FC FCFLAGS CXXCPP STARPU_MS_LIB PKG_CONFIG MAGMA_CFLAGS MAGMA_LIBS NVCC NVCC_CC NVCCFLAGS FXT_CFLAGS FXT_LIBS FXT_LDFLAGS POTI_CFLAGS POTI_LIBS XMKMF BLAS_LIBS FFTW_CFLAGS FFTW_LIBS FFTWF_CFLAGS FFTWF_LIBS FFTWL_CFLAGS FFTWL_LIBS HWLOC_CFLAGS HWLOC_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures StarPU 1.2.3 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/starpu] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of StarPU 1.2.3:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-openmp do not use OpenMP --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-mic use MIC device(s) --disable-mic-rma use MIC RMA transfer --enable-native-winthreads Use native windows threads instead of pthread --disable-default-drand48 Do not use the default version of drand48 --enable-quick-check Lower default values for the testcases run by make check to allow a faster execution --enable-long-check Enable some exhaustive checks which take a really long time --enable-new-check Enable new and known-to-fail testcases --disable-valgrind Do not check the availability of valgrind.h and helgrind.h --enable-max-sched-ctxs= maximum number of sched_ctxs --enable-sc-hypervisor enable resizing contexts (experimental) --enable-sc-hypervisor-debug enable debug for resizing contexts (experimental) --enable-maxcpus= maximum number of CPUs --disable-cpu do not use the CPU(s) --enable-maxcudadev= maximum number of CUDA devices --disable-cuda do not use CUDA device(s) --disable-cuda-memcpy-peer do not allow peer transfers when using CUDA 4.0 --enable-maxopencldev= maximum number of OPENCL devices --disable-opencl do not use OpenCL device(s) --disable-asynchronous-copy disable asynchronous copy between CPU and GPU --disable-asynchronous-cuda-copy disable asynchronous copy between CPU and CUDA devices --disable-asynchronous-opencl-copy disable asynchronous copy between CPU and OPENCL devices --disable-asynchronous-mic-copy disable asynchronous copy between CPU and MIC devices --enable-opencl-simulator Enable the use of an OpenCL simulator --enable-simgrid Enable simulating execution in simgrid --enable-blocking-drivers enable blocking drivers --enable-maxmicdev= maximum number of MIC devices --enable-maxmicthreads= maximum number of MIC threads --disable-rcce do not use SCC device(s) --disable-export-dynamic Prevent the linker from adding all symbols to the dynamic symbol table -enable-maxmpkernels= maximum number of kernels a message-passing sink can lookup for and execute --enable-debug enable debug mode --enable-spinlock-check enable spinlock check --disable-fstack-protector-all disable GCC option -fstack-protector-all --enable-fast do not enforce assertions --enable-verbose display verbose debug messages (--enable-verbose=extra increase the verbosity) --enable-coverage enable coverage checking --enable-fxt-lock enable additional locking systems FxT traces --enable-perf-debug enable performance debugging through gprof --enable-model-debug enable performance model debugging --enable-stats enable statistics --enable-memory-stats enable memory stats --disable-glpk disable using glpk for bound computation --disable-ayudame1 Do not use Ayudame lib version 1 --disable-ayudame2 Do not use Ayudame lib version 2 --enable-maxbuffers= maximum number of buffers per task --enable-maxnodes= maximum number of nodes --disable-allocation-cache disable data allocation cache --enable-maximplementations= maximum number of implementations --enable-leveldb Enable linking with LevelDB if available --enable-calibration-heuristic= Define the maximum authorized deviation of StarPU history-based calibrator. --enable-mpi-check Enable execution of MPI testcases --enable-mpi-progression-hook Enable StarPU MPI activity polling method --enable-mpi-verbose display MPI verbose debug messages (--enable-mpi-verbose=extra increase the verbosity) --disable-starpu-top build StarPU-Top --disable-fortran disable build of fortran examples --enable-gcc-extensions build the GCC plug-in that provides C language extensions (experimental) --enable-openmp build the OpenMP runtime support (experimental) --enable-socl build the OpenCL interface (experimental) --disable-build-tests disable building of tests --disable-build-examples disable building of examples --enable-opengl-render enable OpenGL rendering of some examples --enable-blas-lib=blaslibname: none default: no BLAS lib is used atlas: use ATLAS library goto: use GotoBLAS library mkl: use MKL library (you may need to set specific CFLAGS and LDFLAGS with --with-mkl-cflags and --with-mkl-ldflags) --disable-starpufft Disable build of StarPU-FFT --enable-starpufft-examples disable execution of StarPU FFT examples --disable-build-doc disable building of documentation Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-cuda-dir= specify CUDA installation directory --with-cuda-include-dir= specify where CUDA headers are installed --with-cuda-lib-dir= specify where CUDA libraries are installed --with-opencl-dir= specify OpenCL installation directory --with-opencl-include-dir= specify where OpenCL headers are installed --with-opencl-lib-dir= specify where OpenCL libraries are installed --with-simgrid-dir= specify SimGrid installation directory --with-simgrid-include-dir= specify where SimGrid headers are installed --with-simgrid-lib-dir= specify where SimGrid libraries are installed --with-coi-dir= specify the MIC's COI installation directory --with-coi-include-dir= specify where the MIC's COI headers are installed --with-coi-lib-dir= specify where the MIC's COI libraries are installed --with-scif-dir= specify the MIC's SCIF installation directory --with-scif-include-dir= specify where the MIC's SCIF headers are installed --with-scif-lib-dir= specify where the MIC's SCIF libraries are installed --with-rcce-dir= specify RCCE installation directory --with-rcce-include-dir= specify where RCCE headers are installed --with-rcce-lib-dir= specify where RCCE libraries are installed --with-fxt= generate fxt traces --with-ayudame1-include-dir= specify where Ayudame version 1 headers are installed --with-ayudame2-include-dir= specify where Ayudame version 2 headers are installed --with-perf-model-dir= specify where performance models should be stored --with-mpicc= Path of the mpicc compiler --with-smpirun= Path of the smpirun helper --with-mpiexec= Path of mpiexec --with-mpiexec-args= Arguments for mpiexec --with-qwt-include-dir= specify installed libqwt include path --with-qwt-lib-dir= specify installed libqwt library path --with-qwt-lib= specify installed libqwt library name --with-mpifort= Path of the mpifort compiler --with-x use the X Window System --with-goto-dir= specify GotoBLAS lib location --with-atlas-dir= specify ATLAS lib location --with-mkl-cflags specify MKL compilation flags --with-mkl-ldflags specify MKL linking flags --without-hwloc Disable hwloc (enabled by default) Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CPP C preprocessor F77 Fortran 77 compiler command FFLAGS Fortran 77 compiler flags FC Fortran compiler command FCFLAGS Fortran compiler flags CXXCPP C++ preprocessor STARPU_MS_LIB Path to Microsoft's Visual Studio `lib' tool PKG_CONFIG path to pkg-config utility MAGMA_CFLAGS C compiler flags for MAGMA, overriding pkg-config MAGMA_LIBS linker flags for MAGMA, overriding pkg-config NVCC CUDA compiler NVCC_CC C compiler for CUDA compiler NVCCFLAGS CUDA compiler flags FXT_CFLAGS C compiler flags for FXT, overriding pkg-config FXT_LIBS linker flags for FXT, overriding pkg-config FXT_LDFLAGS POTI_CFLAGS C compiler flags for POTI, overriding pkg-config POTI_LIBS linker flags for POTI, overriding pkg-config XMKMF Path to xmkmf, Makefile generator for X Window System BLAS_LIBS linker flags for blas FFTW_CFLAGS C compiler flags for FFTW, overriding pkg-config FFTW_LIBS linker flags for FFTW, overriding pkg-config FFTWF_CFLAGS C compiler flags for FFTWF, overriding pkg-config FFTWF_LIBS linker flags for FFTWF, overriding pkg-config FFTWL_CFLAGS C compiler flags for FFTWL, overriding pkg-config FFTWL_LIBS linker flags for FFTWL, overriding pkg-config HWLOC_CFLAGS C compiler flags for HWLOC, overriding pkg-config HWLOC_LIBS linker flags for HWLOC, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . StarPU home page: . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF StarPU configure 1.2.3 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_f77_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_f77_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_f77_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_f77_try_compile # ac_fn_fc_try_compile LINENO # --------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_fc_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_fc_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_fc_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_f77_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_f77_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_f77_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_f77_try_link # ac_fn_fc_try_link LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_fc_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_fc_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_fc_try_link # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 &5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------------------------- ## ## Report this to starpu-devel@lists.gforge.inria.fr ## ## ------------------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES # --------------------------------------------- # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. ac_fn_c_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 $as_echo_n "checking whether $as_decl_name is declared... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_decl # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------------------------- ## ## Report this to starpu-devel@lists.gforge.inria.fr ## ## ------------------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_mongrel # ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES # ---------------------------------------------------- # Tries to find if the field MEMBER exists in type AGGR, after including # INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_member cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by StarPU $as_me 1.2.3, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in build-aux "$srcdir"/build-aux; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # libtool doesn't actually properly manage a space in the workdir case `pwd` in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac STARPU_MAJOR_VERSION="`echo $PACKAGE_VERSION | cut -d . -f 1`" STARPU_MINOR_VERSION="`echo $PACKAGE_VERSION | cut -d . -f 2`" STARPU_RELEASE_VERSION="`echo $PACKAGE_VERSION | cut -d . -f 3`" STARPU_RELEASE_VERSION="`echo $PACKAGE_VERSION | cut -d . -f 3| sed 's/rc.*//'`" cat >>confdefs.h <<_ACEOF #define STARPU_MAJOR_VERSION $STARPU_MAJOR_VERSION _ACEOF cat >>confdefs.h <<_ACEOF #define STARPU_MINOR_VERSION $STARPU_MINOR_VERSION _ACEOF cat >>confdefs.h <<_ACEOF #define STARPU_RELEASE_VERSION $STARPU_RELEASE_VERSION _ACEOF . "$srcdir/STARPU-VERSION" # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 $as_echo_n "checking target system type... " >&6; } if ${ac_cv_target+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' set x $ac_cv_target shift target_cpu=$1 target_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: target_os=$* IFS=$ac_save_IFS case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # The aliases save the names the user supplied, while $host etc. # will get canonicalized. test -n "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- am__api_version='1.15' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='starpu' VERSION='1.2.3' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi if test -n "$ac_tool_prefix"; then for ac_prog in ar lib "link -lib" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar lib "link -lib" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} { $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5 $as_echo_n "checking the archiver ($AR) interface... " >&6; } if ${am_cv_ar_interface+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am_cv_ar_interface=ar cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int some_variable = 0; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 (eval $am_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then am_cv_ar_interface=ar else am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 (eval $am_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then am_cv_ar_interface=lib else am_cv_ar_interface=unknown fi fi rm -f conftest.lib libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5 $as_echo "$am_cv_ar_interface" >&6; } case $am_cv_ar_interface in ar) ;; lib) # Microsoft lib, so override with the ar-lib wrapper script. # FIXME: It is wrong to rewrite AR. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__AR in this case, # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something # similar. AR="$am_aux_dir/ar-lib $AR" ;; unknown) as_fn_error $? "could not determine $AR interface" "$LINENO" 5 ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_F77+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$F77"; then ac_cv_prog_F77="$F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_F77="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi F77=$ac_cv_prog_F77 if test -n "$F77"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $F77" >&5 $as_echo "$F77" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$F77" && break done fi if test -z "$F77"; then ac_ct_F77=$F77 for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_F77+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_F77"; then ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_F77="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_F77=$ac_cv_prog_ac_ct_F77 if test -n "$ac_ct_F77"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_F77" >&5 $as_echo "$ac_ct_F77" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_F77" && break done if test "x$ac_ct_F77" = x; then F77="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac F77=$ac_ct_F77 fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done rm -f a.out # If we don't use `.F' as extension, the preprocessor is not run on the # input file. (Note that this only needs to work for GNU compilers.) ac_save_ext=$ac_ext ac_ext=F { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran 77 compiler" >&5 $as_echo_n "checking whether we are using the GNU Fortran 77 compiler... " >&6; } if ${ac_cv_f77_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF program main #ifndef __GNUC__ choke me #endif end _ACEOF if ac_fn_f77_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_f77_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_compiler_gnu" >&5 $as_echo "$ac_cv_f77_compiler_gnu" >&6; } ac_ext=$ac_save_ext ac_test_FFLAGS=${FFLAGS+set} ac_save_FFLAGS=$FFLAGS FFLAGS= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $F77 accepts -g" >&5 $as_echo_n "checking whether $F77 accepts -g... " >&6; } if ${ac_cv_prog_f77_g+:} false; then : $as_echo_n "(cached) " >&6 else FFLAGS=-g cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_compile "$LINENO"; then : ac_cv_prog_f77_g=yes else ac_cv_prog_f77_g=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_f77_g" >&5 $as_echo "$ac_cv_prog_f77_g" >&6; } if test "$ac_test_FFLAGS" = set; then FFLAGS=$ac_save_FFLAGS elif test $ac_cv_prog_f77_g = yes; then if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-g -O2" else FFLAGS="-g" fi else if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-O2" else FFLAGS= fi fi if test $ac_compiler_gnu = yes; then G77=yes else G77= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor xlf90 f90 pgf90 pghpf epcf90 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_FC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$FC"; then ac_cv_prog_FC="$FC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_FC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi FC=$ac_cv_prog_FC if test -n "$FC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FC" >&5 $as_echo "$FC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$FC" && break done fi if test -z "$FC"; then ac_ct_FC=$FC for ac_prog in gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor xlf90 f90 pgf90 pghpf epcf90 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_FC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_FC"; then ac_cv_prog_ac_ct_FC="$ac_ct_FC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_FC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_FC=$ac_cv_prog_ac_ct_FC if test -n "$ac_ct_FC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FC" >&5 $as_echo "$ac_ct_FC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_FC" && break done if test "x$ac_ct_FC" = x; then FC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac FC=$ac_ct_FC fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done rm -f a.out # If we don't use `.F' as extension, the preprocessor is not run on the # input file. (Note that this only needs to work for GNU compilers.) ac_save_ext=$ac_ext ac_ext=F { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran compiler" >&5 $as_echo_n "checking whether we are using the GNU Fortran compiler... " >&6; } if ${ac_cv_fc_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF program main #ifndef __GNUC__ choke me #endif end _ACEOF if ac_fn_fc_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_fc_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_compiler_gnu" >&5 $as_echo "$ac_cv_fc_compiler_gnu" >&6; } ac_ext=$ac_save_ext ac_test_FCFLAGS=${FCFLAGS+set} ac_save_FCFLAGS=$FCFLAGS FCFLAGS= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $FC accepts -g" >&5 $as_echo_n "checking whether $FC accepts -g... " >&6; } if ${ac_cv_prog_fc_g+:} false; then : $as_echo_n "(cached) " >&6 else FCFLAGS=-g cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_fc_try_compile "$LINENO"; then : ac_cv_prog_fc_g=yes else ac_cv_prog_fc_g=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_fc_g" >&5 $as_echo "$ac_cv_prog_fc_g" >&6; } if test "$ac_test_FCFLAGS" = set; then FCFLAGS=$ac_save_FCFLAGS elif test $ac_cv_prog_fc_g = yes; then if test "x$ac_cv_fc_compiler_gnu" = xyes; then FCFLAGS="-g -O2" else FCFLAGS="-g" fi else if test "x$ac_cv_fc_compiler_gnu" = xyes; then FCFLAGS="-O2" else FCFLAGS= fi fi if test $ac_compiler_gnu = yes; then GFC=yes else GFC= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu for ac_prog in gstat stat do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PROG_STAT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PROG_STAT"; then ac_cv_prog_PROG_STAT="$PROG_STAT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PROG_STAT="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PROG_STAT=$ac_cv_prog_PROG_STAT if test -n "$PROG_STAT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PROG_STAT" >&5 $as_echo "$PROG_STAT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PROG_STAT" && break done for ac_prog in gdate date do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PROG_DATE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PROG_DATE"; then ac_cv_prog_PROG_DATE="$PROG_DATE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PROG_DATE="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PROG_DATE=$ac_cv_prog_PROG_DATE if test -n "$PROG_DATE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PROG_DATE" >&5 $as_echo "$PROG_DATE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PROG_DATE" && break done OPENMP_CFLAGS= # Check whether --enable-openmp was given. if test "${enable_openmp+set}" = set; then : enableval=$enable_openmp; fi if test "$enable_openmp" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to support OpenMP" >&5 $as_echo_n "checking for $CC option to support OpenMP... " >&6; } if ${ac_cv_prog_c_openmp+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef _OPENMP choke me #endif #include int main () { return omp_get_num_threads (); } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_c_openmp='none needed' else ac_cv_prog_c_openmp='unsupported' for ac_option in -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp -homp \ -Popenmp --openmp; do ac_save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS $ac_option" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef _OPENMP choke me #endif #include int main () { return omp_get_num_threads (); } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_c_openmp=$ac_option fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$ac_save_CFLAGS if test "$ac_cv_prog_c_openmp" != unsupported; then break fi done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_c_openmp" >&5 $as_echo "$ac_cv_prog_c_openmp" >&6; } case $ac_cv_prog_c_openmp in #( "none needed" | unsupported) ;; #( *) OPENMP_CFLAGS=$ac_cv_prog_c_openmp ;; esac fi if test x$enable_perf_debug = xyes; then enable_shared=no fi case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf # Set options enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AS"; then ac_cv_prog_AS="$AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AS="${ac_tool_prefix}as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AS=$ac_cv_prog_AS if test -n "$AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 $as_echo "$AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AS"; then ac_ct_AS=$AS # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AS"; then ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AS="as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AS=$ac_cv_prog_ac_ct_AS if test -n "$ac_ct_AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 $as_echo "$ac_ct_AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AS" = x; then AS="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AS=$ac_ct_AS fi else AS="$ac_cv_prog_AS" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi ;; esac test -z "$AS" && AS=as test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$OBJDUMP" && OBJDUMP=objdump enable_dlopen=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi link_all_deplibs=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_CXX='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty # executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared # libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else ld_shlibs_CXX=no fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs_CXX=no ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink || test "$inherit_rpath_CXX" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi archive_cmds_need_lc_F77=no allow_undefined_flag_F77= always_export_symbols_F77=no archive_expsym_cmds_F77= export_dynamic_flag_spec_F77= hardcode_direct_F77=no hardcode_direct_absolute_F77=no hardcode_libdir_flag_spec_F77= hardcode_libdir_separator_F77= hardcode_minus_L_F77=no hardcode_automatic_F77=no inherit_rpath_F77=no module_cmds_F77= module_expsym_cmds_F77= link_all_deplibs_F77=unknown old_archive_cmds_F77=$old_archive_cmds reload_flag_F77=$reload_flag reload_cmds_F77=$reload_cmds no_undefined_flag_F77= whole_archive_flag_spec_F77= enable_shared_with_static_runtimes_F77=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o objext_F77=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC compiler_F77=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` GCC=$G77 if test -n "$compiler"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } GCC_F77="$G77" LD_F77="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... lt_prog_compiler_wl_F77= lt_prog_compiler_pic_F77= lt_prog_compiler_static_F77= if test "$GCC" = yes; then lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_static_F77='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_F77='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_F77='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_F77='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_F77= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_F77=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_F77='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_F77=-Kconform_pic fi ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl_F77='-Xlinker ' if test -n "$lt_prog_compiler_pic_F77"; then lt_prog_compiler_pic_F77="-Xcompiler $lt_prog_compiler_pic_F77" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_F77='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' else lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_F77='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_F77='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_F77='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_F77='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_F77='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fPIC' lt_prog_compiler_static_F77='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='--shared' lt_prog_compiler_static_F77='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl_F77='-Wl,-Wl,,' lt_prog_compiler_pic_F77='-PIC' lt_prog_compiler_static_F77='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fpic' lt_prog_compiler_static_F77='-Bstatic' ;; ccc*) lt_prog_compiler_wl_F77='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-qpic' lt_prog_compiler_static_F77='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' lt_prog_compiler_wl_F77='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' lt_prog_compiler_wl_F77='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' lt_prog_compiler_wl_F77='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fPIC' lt_prog_compiler_static_F77='-static' ;; *Portland\ Group*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fpic' lt_prog_compiler_static_F77='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_F77='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_F77='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; rdos*) lt_prog_compiler_static_F77='-non_shared' ;; solaris*) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl_F77='-Qoption ld ';; *) lt_prog_compiler_wl_F77='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl_F77='-Qoption ld ' lt_prog_compiler_pic_F77='-PIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic_F77='-Kconform_pic' lt_prog_compiler_static_F77='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; unicos*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_can_build_shared_F77=no ;; uts4*) lt_prog_compiler_pic_F77='-pic' lt_prog_compiler_static_F77='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_F77=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_F77= ;; *) lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_F77+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_F77=$lt_prog_compiler_pic_F77 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_F77" >&5 $as_echo "$lt_cv_prog_compiler_pic_F77" >&6; } lt_prog_compiler_pic_F77=$lt_cv_prog_compiler_pic_F77 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_F77"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... " >&6; } if ${lt_cv_prog_compiler_pic_works_F77+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_F77=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_F77" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_F77=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_F77" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_F77" >&6; } if test x"$lt_cv_prog_compiler_pic_works_F77" = xyes; then case $lt_prog_compiler_pic_F77 in "" | " "*) ;; *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; esac else lt_prog_compiler_pic_F77= lt_prog_compiler_can_build_shared_F77=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_F77+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_F77=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_F77=yes fi else lt_cv_prog_compiler_static_works_F77=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_F77" >&5 $as_echo "$lt_cv_prog_compiler_static_works_F77" >&6; } if test x"$lt_cv_prog_compiler_static_works_F77" = xyes; then : else lt_prog_compiler_static_F77= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_F77+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_F77=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_F77=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_F77" >&5 $as_echo "$lt_cv_prog_compiler_c_o_F77" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_F77+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_F77=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_F77=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_F77" >&5 $as_echo "$lt_cv_prog_compiler_c_o_F77" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag_F77= always_export_symbols_F77=no archive_cmds_F77= archive_expsym_cmds_F77= compiler_needs_object_F77=no enable_shared_with_static_runtimes_F77=no export_dynamic_flag_spec_F77= export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic_F77=no hardcode_direct_F77=no hardcode_direct_absolute_F77=no hardcode_libdir_flag_spec_F77= hardcode_libdir_separator_F77= hardcode_minus_L_F77=no hardcode_shlibpath_var_F77=unsupported inherit_rpath_F77=no link_all_deplibs_F77=unknown module_cmds_F77= module_expsym_cmds_F77= old_archive_from_new_cmds_F77= old_archive_from_expsyms_cmds_F77= thread_safe_flag_spec_F77= whole_archive_flag_spec_F77= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_F77= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms_F77='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs_F77=no ;; esac ld_shlibs_F77=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_F77='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_F77= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs_F77=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='' ;; m68k) archive_cmds_F77='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_F77=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_F77=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_F77='-L$libdir' export_dynamic_flag_spec_F77='${wl}--export-all-symbols' allow_undefined_flag_F77=unsupported always_export_symbols_F77=no enable_shared_with_static_runtimes_F77=yes export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_F77='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_F77=no fi ;; haiku*) archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_F77=yes ;; interix[3-9]*) hardcode_direct_F77=no hardcode_shlibpath_var_F77=no hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' export_dynamic_flag_spec_F77='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec_F77= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_F77=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec_F77='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_F77=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds_F77='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_F77='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec_F77='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_F77='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs_F77=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs_F77=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs_F77=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; esac ;; sunos4*) archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; esac if test "$ld_shlibs_F77" = no; then runpath_var= hardcode_libdir_flag_spec_F77= export_dynamic_flag_spec_F77= whole_archive_flag_spec_F77= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_F77=unsupported always_export_symbols_F77=yes archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_F77=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_F77=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_F77='' hardcode_direct_F77=yes hardcode_direct_absolute_F77=yes hardcode_libdir_separator_F77=':' link_all_deplibs_F77=yes file_list_spec_F77='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_F77=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_F77=yes hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_libdir_separator_F77= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi link_all_deplibs_F77=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_F77='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_F77=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_F77='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__F77+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__F77=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__F77"; then lt_cv_aix_libpath__F77=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__F77"; then lt_cv_aix_libpath__F77="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__F77 fi hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_F77='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_F77="-z nodefs" archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__F77+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__F77=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__F77"; then lt_cv_aix_libpath__F77=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__F77"; then lt_cv_aix_libpath__F77="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__F77 fi hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_F77=' ${wl}-bernotok' allow_undefined_flag_F77=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_F77='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_F77='$convenience' fi archive_cmds_need_lc_F77=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='' ;; m68k) archive_cmds_F77='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec_F77=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec_F77=' ' allow_undefined_flag_F77=unsupported always_export_symbols_F77=yes file_list_spec_F77='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_F77='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, F77)='true' enable_shared_with_static_runtimes_F77=yes exclude_expsyms_F77='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds_F77='chmod 644 $oldlib' postlink_cmds_F77='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec_F77=' ' allow_undefined_flag_F77=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds_F77='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_F77='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes_F77=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_F77=no hardcode_direct_F77=no hardcode_automatic_F77=yes hardcode_shlibpath_var_F77=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_F77='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' compiler_needs_object_F77=yes else whole_archive_flag_spec_F77='' fi link_all_deplibs_F77=yes allow_undefined_flag_F77="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_F77="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_F77="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_F77="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_F77="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs_F77=no fi ;; dgux*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds_F77='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds_F77='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes export_dynamic_flag_spec_F77='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds_F77='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes hardcode_direct_absolute_F77=yes export_dynamic_flag_spec_F77='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_F77='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_F77='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: case $host_cpu in hppa*64*|ia64*) hardcode_direct_F77=no hardcode_shlibpath_var_F77=no ;; *) hardcode_direct_F77=yes hardcode_direct_absolute_F77=yes export_dynamic_flag_spec_F77='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat > conftest.$ac_ext <<_ACEOF subroutine foo end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc_F77='no' hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: inherit_rpath_F77=yes link_all_deplibs_F77=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; newsos6) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_shlibpath_var_F77=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no hardcode_direct_absolute_F77=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' export_dynamic_flag_spec_F77='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-R$libdir' ;; *) archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs_F77=no fi ;; os2*) hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes allow_undefined_flag_F77=unsupported archive_cmds_F77='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc_F77='no' hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_F77='-rpath $libdir' fi archive_cmds_need_lc_F77='no' hardcode_libdir_separator_F77=: ;; solaris*) no_undefined_flag_F77=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds_F77='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds_F77='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_shlibpath_var_F77=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec_F77='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs_F77=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; sysv4) case $host_vendor in sni) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_F77='$CC -r -o $output$reload_objs' hardcode_direct_F77=no ;; motorola) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_F77=no ;; sysv4.3*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no export_dynamic_flag_spec_F77='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_F77=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_F77='${wl}-z,text' archive_cmds_need_lc_F77=no hardcode_shlibpath_var_F77=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_F77='${wl}-z,text' allow_undefined_flag_F77='${wl}-z,nodefs' archive_cmds_need_lc_F77=no hardcode_shlibpath_var_F77=no hardcode_libdir_flag_spec_F77='${wl}-R,$libdir' hardcode_libdir_separator_F77=':' link_all_deplibs_F77=yes export_dynamic_flag_spec_F77='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; *) ld_shlibs_F77=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec_F77='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_F77" >&5 $as_echo "$ld_shlibs_F77" >&6; } test "$ld_shlibs_F77" = no && can_build_shared=no with_gnu_ld_F77=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_F77" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_F77=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_F77 in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_F77+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_F77 pic_flag=$lt_prog_compiler_pic_F77 compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_F77 allow_undefined_flag_F77= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_F77 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_F77 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_F77=no else lt_cv_archive_cmds_need_lc_F77=yes fi allow_undefined_flag_F77=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_F77" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_F77" >&6; } archive_cmds_need_lc_F77=$lt_cv_archive_cmds_need_lc_F77 ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_F77\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_F77\"" cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_F77= if test -n "$hardcode_libdir_flag_spec_F77" || test -n "$runpath_var_F77" || test "X$hardcode_automatic_F77" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_F77" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, F77)" != no && test "$hardcode_minus_L_F77" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_F77=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_F77=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_F77=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_F77" >&5 $as_echo "$hardcode_action_F77" >&6; } if test "$hardcode_action_F77" = relink || test "$inherit_rpath_F77" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi archive_cmds_need_lc_FC=no allow_undefined_flag_FC= always_export_symbols_FC=no archive_expsym_cmds_FC= export_dynamic_flag_spec_FC= hardcode_direct_FC=no hardcode_direct_absolute_FC=no hardcode_libdir_flag_spec_FC= hardcode_libdir_separator_FC= hardcode_minus_L_FC=no hardcode_automatic_FC=no inherit_rpath_FC=no module_cmds_FC= module_expsym_cmds_FC= link_all_deplibs_FC=unknown old_archive_cmds_FC=$old_archive_cmds reload_flag_FC=$reload_flag reload_cmds_FC=$reload_cmds no_undefined_flag_FC= whole_archive_flag_spec_FC= enable_shared_with_static_runtimes_FC=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o objext_FC=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu compiler_FC=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` if test -n "$compiler"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } GCC_FC="$ac_cv_fc_compiler_gnu" LD_FC="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_FC= postdep_objects_FC= predeps_FC= postdeps_FC= compiler_lib_search_path_FC= cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_FC"; then compiler_lib_search_path_FC="${prev}${p}" else compiler_lib_search_path_FC="${compiler_lib_search_path_FC} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_FC"; then postdeps_FC="${prev}${p}" else postdeps_FC="${postdeps_FC} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_FC"; then predep_objects_FC="$p" else predep_objects_FC="$predep_objects_FC $p" fi else if test -z "$postdep_objects_FC"; then postdep_objects_FC="$p" else postdep_objects_FC="$postdep_objects_FC $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling FC test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case " $postdeps_FC " in *" -lc "*) archive_cmds_need_lc_FC=no ;; esac compiler_lib_search_dirs_FC= if test -n "${compiler_lib_search_path_FC}"; then compiler_lib_search_dirs_FC=`echo " ${compiler_lib_search_path_FC}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_FC= lt_prog_compiler_pic_FC= lt_prog_compiler_static_FC= if test "$GCC" = yes; then lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_static_FC='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_FC='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_FC='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_FC='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_FC='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_FC='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_FC= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic_FC='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_FC=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_FC='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_FC=-Kconform_pic fi ;; *) lt_prog_compiler_pic_FC='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl_FC='-Xlinker ' if test -n "$lt_prog_compiler_pic_FC"; then lt_prog_compiler_pic_FC="-Xcompiler $lt_prog_compiler_pic_FC" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_FC='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_FC='-Bstatic' else lt_prog_compiler_static_FC='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_FC='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_FC='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_FC='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_FC='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_FC='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_FC='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fPIC' lt_prog_compiler_static_FC='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='--shared' lt_prog_compiler_static_FC='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl_FC='-Wl,-Wl,,' lt_prog_compiler_pic_FC='-PIC' lt_prog_compiler_static_FC='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fpic' lt_prog_compiler_static_FC='-Bstatic' ;; ccc*) lt_prog_compiler_wl_FC='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_FC='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-qpic' lt_prog_compiler_static_FC='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' lt_prog_compiler_wl_FC='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' lt_prog_compiler_wl_FC='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' lt_prog_compiler_wl_FC='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fPIC' lt_prog_compiler_static_FC='-static' ;; *Portland\ Group*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fpic' lt_prog_compiler_static_FC='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_FC='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_FC='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_FC='-non_shared' ;; rdos*) lt_prog_compiler_static_FC='-non_shared' ;; solaris*) lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl_FC='-Qoption ld ';; *) lt_prog_compiler_wl_FC='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl_FC='-Qoption ld ' lt_prog_compiler_pic_FC='-PIC' lt_prog_compiler_static_FC='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic_FC='-Kconform_pic' lt_prog_compiler_static_FC='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' ;; unicos*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_can_build_shared_FC=no ;; uts4*) lt_prog_compiler_pic_FC='-pic' lt_prog_compiler_static_FC='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_FC=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_FC= ;; *) lt_prog_compiler_pic_FC="$lt_prog_compiler_pic_FC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_FC+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_FC=$lt_prog_compiler_pic_FC fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_FC" >&5 $as_echo "$lt_cv_prog_compiler_pic_FC" >&6; } lt_prog_compiler_pic_FC=$lt_cv_prog_compiler_pic_FC # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_FC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_FC works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_FC works... " >&6; } if ${lt_cv_prog_compiler_pic_works_FC+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_FC=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_FC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_FC=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_FC" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_FC" >&6; } if test x"$lt_cv_prog_compiler_pic_works_FC" = xyes; then case $lt_prog_compiler_pic_FC in "" | " "*) ;; *) lt_prog_compiler_pic_FC=" $lt_prog_compiler_pic_FC" ;; esac else lt_prog_compiler_pic_FC= lt_prog_compiler_can_build_shared_FC=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_FC eval lt_tmp_static_flag=\"$lt_prog_compiler_static_FC\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_FC+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_FC=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_FC=yes fi else lt_cv_prog_compiler_static_works_FC=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_FC" >&5 $as_echo "$lt_cv_prog_compiler_static_works_FC" >&6; } if test x"$lt_cv_prog_compiler_static_works_FC" = xyes; then : else lt_prog_compiler_static_FC= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_FC+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_FC=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_FC=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_FC" >&5 $as_echo "$lt_cv_prog_compiler_c_o_FC" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_FC+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_FC=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_FC=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_FC" >&5 $as_echo "$lt_cv_prog_compiler_c_o_FC" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_FC" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag_FC= always_export_symbols_FC=no archive_cmds_FC= archive_expsym_cmds_FC= compiler_needs_object_FC=no enable_shared_with_static_runtimes_FC=no export_dynamic_flag_spec_FC= export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic_FC=no hardcode_direct_FC=no hardcode_direct_absolute_FC=no hardcode_libdir_flag_spec_FC= hardcode_libdir_separator_FC= hardcode_minus_L_FC=no hardcode_shlibpath_var_FC=unsupported inherit_rpath_FC=no link_all_deplibs_FC=unknown module_cmds_FC= module_expsym_cmds_FC= old_archive_from_new_cmds_FC= old_archive_from_expsyms_cmds_FC= thread_safe_flag_spec_FC= whole_archive_flag_spec_FC= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_FC= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms_FC='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs_FC=no ;; esac ld_shlibs_FC=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_FC='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_FC="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_FC= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs_FC=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_FC='' ;; m68k) archive_cmds_FC='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_minus_L_FC=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_FC=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_FC='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_FC=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, FC) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_FC='-L$libdir' export_dynamic_flag_spec_FC='${wl}--export-all-symbols' allow_undefined_flag_FC=unsupported always_export_symbols_FC=no enable_shared_with_static_runtimes_FC=yes export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_FC='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_FC='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_FC=no fi ;; haiku*) archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_FC=yes ;; interix[3-9]*) hardcode_direct_FC=no hardcode_shlibpath_var_FC=no hardcode_libdir_flag_spec_FC='${wl}-rpath,$libdir' export_dynamic_flag_spec_FC='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_FC='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec_FC='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec_FC='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec_FC= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec_FC='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_FC=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec_FC='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_FC=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds_FC='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_FC='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec_FC='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' archive_cmds_FC='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_FC='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs_FC=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_FC='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs_FC=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_FC=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs_FC=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_FC=no fi ;; esac ;; sunos4*) archive_cmds_FC='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_FC=yes hardcode_shlibpath_var_FC=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_FC=no fi ;; esac if test "$ld_shlibs_FC" = no; then runpath_var= hardcode_libdir_flag_spec_FC= export_dynamic_flag_spec_FC= whole_archive_flag_spec_FC= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_FC=unsupported always_export_symbols_FC=yes archive_expsym_cmds_FC='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_FC=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_FC=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_FC='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_FC='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_FC='' hardcode_direct_FC=yes hardcode_direct_absolute_FC=yes hardcode_libdir_separator_FC=':' link_all_deplibs_FC=yes file_list_spec_FC='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_FC=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_FC=yes hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_libdir_separator_FC= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi link_all_deplibs_FC=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_FC='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_FC=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_FC='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__FC+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_fc_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__FC=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__FC"; then lt_cv_aix_libpath__FC=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__FC"; then lt_cv_aix_libpath__FC="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__FC fi hardcode_libdir_flag_spec_FC='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_FC='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_FC='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_FC="-z nodefs" archive_expsym_cmds_FC="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__FC+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_fc_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__FC=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__FC"; then lt_cv_aix_libpath__FC=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__FC"; then lt_cv_aix_libpath__FC="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__FC fi hardcode_libdir_flag_spec_FC='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_FC=' ${wl}-bernotok' allow_undefined_flag_FC=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_FC='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_FC='$convenience' fi archive_cmds_need_lc_FC=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds_FC="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_FC='' ;; m68k) archive_cmds_FC='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_minus_L_FC=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec_FC=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec_FC=' ' allow_undefined_flag_FC=unsupported always_export_symbols_FC=yes file_list_spec_FC='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_FC='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_FC='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, FC)='true' enable_shared_with_static_runtimes_FC=yes exclude_expsyms_FC='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds_FC='chmod 644 $oldlib' postlink_cmds_FC='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec_FC=' ' allow_undefined_flag_FC=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_FC='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds_FC='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_FC='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes_FC=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_FC=no hardcode_direct_FC=no hardcode_automatic_FC=yes hardcode_shlibpath_var_FC=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_FC='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' compiler_needs_object_FC=yes else whole_archive_flag_spec_FC='' fi link_all_deplibs_FC=yes allow_undefined_flag_FC="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_FC="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_FC="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_FC="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_FC="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs_FC=no fi ;; dgux*) archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_shlibpath_var_FC=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_FC='-R$libdir' hardcode_direct_FC=yes hardcode_shlibpath_var_FC=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_FC=yes hardcode_minus_L_FC=yes hardcode_shlibpath_var_FC=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_FC='-R$libdir' hardcode_direct_FC=yes hardcode_shlibpath_var_FC=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds_FC='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds_FC='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec_FC='${wl}+b ${wl}$libdir' hardcode_libdir_separator_FC=: hardcode_direct_FC=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_FC=yes export_dynamic_flag_spec_FC='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds_FC='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_FC='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_FC='${wl}+b ${wl}$libdir' hardcode_libdir_separator_FC=: hardcode_direct_FC=yes hardcode_direct_absolute_FC=yes export_dynamic_flag_spec_FC='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_FC=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds_FC='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_FC='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_FC='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds_FC='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_FC='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_FC='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_FC='${wl}+b ${wl}$libdir' hardcode_libdir_separator_FC=: case $host_cpu in hppa*64*|ia64*) hardcode_direct_FC=no hardcode_shlibpath_var_FC=no ;; *) hardcode_direct_FC=yes hardcode_direct_absolute_FC=yes export_dynamic_flag_spec_FC='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_FC=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat > conftest.$ac_ext <<_ACEOF subroutine foo end _ACEOF if ac_fn_fc_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc_FC='no' hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_FC=: inherit_rpath_FC=yes link_all_deplibs_FC=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_FC='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_FC='-R$libdir' hardcode_direct_FC=yes hardcode_shlibpath_var_FC=no ;; newsos6) archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_FC=yes hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_FC=: hardcode_shlibpath_var_FC=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_FC=yes hardcode_shlibpath_var_FC=no hardcode_direct_absolute_FC=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec_FC='${wl}-rpath,$libdir' export_dynamic_flag_spec_FC='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_FC='-R$libdir' ;; *) archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_FC='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs_FC=no fi ;; os2*) hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_minus_L_FC=yes allow_undefined_flag_FC=unsupported archive_cmds_FC='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds_FC='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag_FC=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_FC='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag_FC=' -expect_unresolved \*' archive_cmds_FC='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc_FC='no' hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_FC=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag_FC=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_FC='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' else allow_undefined_flag_FC=' -expect_unresolved \*' archive_cmds_FC='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_FC='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_FC='-rpath $libdir' fi archive_cmds_need_lc_FC='no' hardcode_libdir_separator_FC=: ;; solaris*) no_undefined_flag_FC=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds_FC='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds_FC='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds_FC='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec_FC='-R$libdir' hardcode_shlibpath_var_FC=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec_FC='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec_FC='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs_FC=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds_FC='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_FC='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_direct_FC=yes hardcode_minus_L_FC=yes hardcode_shlibpath_var_FC=no ;; sysv4) case $host_vendor in sni) archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_FC=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_FC='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_FC='$CC -r -o $output$reload_objs' hardcode_direct_FC=no ;; motorola) archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_FC=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_FC=no ;; sysv4.3*) archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_FC=no export_dynamic_flag_spec_FC='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_FC=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_FC=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_FC='${wl}-z,text' archive_cmds_need_lc_FC=no hardcode_shlibpath_var_FC=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_FC='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_FC='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_FC='${wl}-z,text' allow_undefined_flag_FC='${wl}-z,nodefs' archive_cmds_need_lc_FC=no hardcode_shlibpath_var_FC=no hardcode_libdir_flag_spec_FC='${wl}-R,$libdir' hardcode_libdir_separator_FC=':' link_all_deplibs_FC=yes export_dynamic_flag_spec_FC='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_FC='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_FC='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_shlibpath_var_FC=no ;; *) ld_shlibs_FC=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec_FC='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_FC" >&5 $as_echo "$ld_shlibs_FC" >&6; } test "$ld_shlibs_FC" = no && can_build_shared=no with_gnu_ld_FC=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_FC" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_FC=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_FC in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_FC+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_FC pic_flag=$lt_prog_compiler_pic_FC compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_FC allow_undefined_flag_FC= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_FC 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_FC 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_FC=no else lt_cv_archive_cmds_need_lc_FC=yes fi allow_undefined_flag_FC=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_FC" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_FC" >&6; } archive_cmds_need_lc_FC=$lt_cv_archive_cmds_need_lc_FC ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_FC\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_FC\"" cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_fc_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_FC= if test -n "$hardcode_libdir_flag_spec_FC" || test -n "$runpath_var_FC" || test "X$hardcode_automatic_FC" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_FC" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, FC)" != no && test "$hardcode_minus_L_FC" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_FC=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_FC=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_FC=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_FC" >&5 $as_echo "$hardcode_action_FC" >&6; } if test "$hardcode_action_FC" = relink || test "$inherit_rpath_FC" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_commands="$ac_config_commands libtool" # Only expand once: { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5 $as_echo_n "checking for C/C++ restrict keyword... " >&6; } if ${ac_cv_c_restrict+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_restrict=no # The order here caters to the fact that C++ does not require restrict. for ac_kw in __restrict __restrict__ _Restrict restrict; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ typedef int * int_ptr; int foo (int_ptr $ac_kw ip) { return ip[0]; } int main () { int s[1]; int * $ac_kw t = s; t[0] = 0; return foo(t) ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_restrict=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_restrict" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5 $as_echo "$ac_cv_c_restrict" >&6; } case $ac_cv_c_restrict in restrict) ;; no) $as_echo "#define restrict /**/" >>confdefs.h ;; *) cat >>confdefs.h <<_ACEOF #define restrict $ac_cv_c_restrict _ACEOF ;; esac # Check if bash is available for ac_prog in bash do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_BASH+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$BASH"; then ac_cv_prog_BASH="$BASH" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_BASH="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi BASH=$ac_cv_prog_BASH if test -n "$BASH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BASH" >&5 $as_echo "$BASH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$BASH" && break done # Check whether subversion is installed # Extract the first word of "svn", so it can be a program name with args. set dummy svn; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_svncommand+:} false; then : $as_echo_n "(cached) " >&6 else case $svncommand in [\\/]* | ?:[\\/]*) ac_cv_path_svncommand="$svncommand" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_svncommand="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi svncommand=$ac_cv_path_svncommand if test -n "$svncommand"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $svncommand" >&5 $as_echo "$svncommand" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "svnversion", so it can be a program name with args. set dummy svnversion; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_svnversioncommand+:} false; then : $as_echo_n "(cached) " >&6 else case $svnversioncommand in [\\/]* | ?:[\\/]*) ac_cv_path_svnversioncommand="$svnversioncommand" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_svnversioncommand="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi svnversioncommand=$ac_cv_path_svnversioncommand if test -n "$svnversioncommand"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $svnversioncommand" >&5 $as_echo "$svnversioncommand" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # find out if we are are in a subversion directory svndir=0 if test "$svncommand" != "" ; then $svncommand info $srcdir >/dev/null 2>&1 if test $? -eq 0; then svndir=1 fi fi # use svnversion to record the current repository revision only if # subversion is installed and we are in a working copy if test "$svnversioncommand" = "" || test "`LC_ALL=C $svnversioncommand -n $srcdir`" = "exported" ; then if test -f $srcdir/STARPU-REVISION ; then cp $srcdir/STARPU-REVISION . else echo "unknown" > ./STARPU-REVISION fi else LC_ALL=C svnversion $srcdir > ./STARPU-REVISION fi if test "x$cross_compiling" = "xyes"; then STARPU_CROSS_COMPILING_TRUE= STARPU_CROSS_COMPILING_FALSE='#' else STARPU_CROSS_COMPILING_TRUE='#' STARPU_CROSS_COMPILING_FALSE= fi ############################################################################### # # # MIC device compilation # # (Must be done in beginning to change prefix in the whole configuration) # # # ############################################################################### # Check whether --enable-mic was given. if test "${enable_mic+set}" = set; then : enableval=$enable_mic; enable_mic=$enableval else enable_mic=no fi # Check whether --enable-mic-rma was given. if test "${enable_mic_rma+set}" = set; then : enableval=$enable_mic_rma; enable_mic_rma=$enableval else enable_mic_rma=yes fi if test x$enable_mic = xyes ; then $as_echo "#define STARPU_USE_MIC 1" >>confdefs.h fi if test x$enable_mic_rma = xyes ; then $as_echo "#define STARPU_MIC_USE_RMA 1" >>confdefs.h fi if test "x$enable_mic" = "xyes"; then STARPU_USE_MIC_TRUE= STARPU_USE_MIC_FALSE='#' else STARPU_USE_MIC_TRUE='#' STARPU_USE_MIC_FALSE= fi ############################################################################### for ac_prog in lib do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_STARPU_MS_LIB+:} false; then : $as_echo_n "(cached) " >&6 else case $STARPU_MS_LIB in [\\/]* | ?:[\\/]*) ac_cv_path_STARPU_MS_LIB="$STARPU_MS_LIB" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_STARPU_MS_LIB="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi STARPU_MS_LIB=$ac_cv_path_STARPU_MS_LIB if test -n "$STARPU_MS_LIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STARPU_MS_LIB" >&5 $as_echo "$STARPU_MS_LIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$STARPU_MS_LIB" && break done if test "x$STARPU_MS_LIB" != "x"; then STARPU_HAVE_MS_LIB_TRUE= STARPU_HAVE_MS_LIB_FALSE='#' else STARPU_HAVE_MS_LIB_TRUE='#' STARPU_HAVE_MS_LIB_FALSE= fi case "$target" in *-*-mingw*|*-*-cygwin*) starpu_windows=yes libext=a $as_echo "#define STARPU_HAVE_WINDOWS 1" >>confdefs.h ;; *-*-linux*) starpu_linux=yes $as_echo "#define STARPU_LINUX_SYS 1" >>confdefs.h ;; *-*-openbsd*) starpu_openbsd=yes $as_echo "#define STARPU_OPENBSD_SYS 1" >>confdefs.h ;; *-*darwin*) starpu_darwin=yes $as_echo "#define STARPU_HAVE_DARWIN 1" >>confdefs.h ;; esac if test "x$starpu_windows" = "xyes"; then STARPU_HAVE_WINDOWS_TRUE= STARPU_HAVE_WINDOWS_FALSE='#' else STARPU_HAVE_WINDOWS_TRUE='#' STARPU_HAVE_WINDOWS_FALSE= fi if test "x$starpu_linux" = "xyes"; then STARPU_LINUX_SYS_TRUE= STARPU_LINUX_SYS_FALSE='#' else STARPU_LINUX_SYS_TRUE='#' STARPU_LINUX_SYS_FALSE= fi if test "x$starpu_darwin" = "xyes"; then STARPU_HAVE_DARWIN_TRUE= STARPU_HAVE_DARWIN_FALSE='#' else STARPU_HAVE_DARWIN_TRUE='#' STARPU_HAVE_DARWIN_FALSE= fi if test "x$starpu_openbsd" = "xyes"; then STARPU_OPENBSD_SYS_TRUE= STARPU_OPENBSD_SYS_FALSE='#' else STARPU_OPENBSD_SYS_TRUE='#' STARPU_OPENBSD_SYS_FALSE= fi # on Darwin, GCC targets i386 by default, so we don't have atomic ops # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5 $as_echo_n "checking size of void *... " >&6; } if ${ac_cv_sizeof_void_p+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then : else if test "$ac_cv_type_void_p" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (void *) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_void_p=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5 $as_echo "$ac_cv_sizeof_void_p" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_VOID_P $ac_cv_sizeof_void_p _ACEOF SIZEOF_VOID_P=$ac_cv_sizeof_void_p case $SIZEOF_VOID_P in 4) case "$target" in i386-*darwin*) CFLAGS+=" -march=i686 " ;; esac STARPU_MS_LIB_ARCH=X86 ;; 8) STARPU_MS_LIB_ARCH=X64 ;; esac # This will be useful for program which use CUDA (and .cubin files) which need # some path to the CUDA code at runtime. cat >>confdefs.h <<_ACEOF #define STARPU_BUILD_DIR "$PWD" _ACEOF STARPU_BUILD_DIR=$PWD case "${srcdir}" in /*) cat >>confdefs.h <<_ACEOF #define STARPU_SRC_DIR "$(eval echo ${srcdir})" _ACEOF STARPU_SRC_DIR="$(eval echo ${srcdir})" ;; *) cat >>confdefs.h <<_ACEOF #define STARPU_SRC_DIR "$(eval echo $PWD/${srcdir})" _ACEOF STARPU_SRC_DIR="$(eval echo $PWD/${srcdir})" ;; esac case "$target" in *-*-mingw*|*-*-cygwin*) # Check whether --enable-native-winthreads was given. if test "${enable_native_winthreads+set}" = set; then : enableval=$enable_native_winthreads; enable_native_winthreads=$enableval else enable_native_winthreads=no fi ;; esac if test x"$enable_native_winthreads" != xyes then INCLUDE_PTHREAD_H='#include ' fi for ac_header in unistd.h do : ac_fn_c_check_header_mongrel "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" if test "x$ac_cv_header_unistd_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UNISTD_H 1 _ACEOF $as_echo "#define STARPU_HAVE_UNISTD_H 1" >>confdefs.h fi done ac_fn_c_check_type "$LINENO" "struct timespec" "ac_cv_type_struct_timespec" " #include #include #ifdef HAVE_UNISTD_H #include #endif #include $INCLUDE_PTHREAD_H " if test "x$ac_cv_type_struct_timespec" = xyes; then : $as_echo "#define STARPU_HAVE_STRUCT_TIMESPEC 1" >>confdefs.h fi if test x"$enable_native_winthreads" = xyes then CPPFLAGS+=" -I$STARPU_SRC_DIR/include/pthread_win32 " cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define STARPU_CONFIGURE #include int main () { pthread_t t; pthread_create(&t, NULL, NULL, NULL); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : $as_echo "#define STARPU_NATIVE_WINTHREADS 1" >>confdefs.h else as_fn_error $? "pthread_create unavailable" "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5 $as_echo_n "checking for pthread_create in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_create (); int main () { return pthread_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_create=yes else ac_cv_lib_pthread_pthread_create=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5 $as_echo "$ac_cv_lib_pthread_pthread_create" >&6; } if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBPTHREAD 1 _ACEOF LIBS="-lpthread $LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sqrt" >&5 $as_echo_n "checking for library containing sqrt... " >&6; } if ${ac_cv_search_sqrt+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sqrt (); int main () { return sqrt (); ; return 0; } _ACEOF for ac_lib in '' m; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_sqrt=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_sqrt+:} false; then : break fi done if ${ac_cv_search_sqrt+:} false; then : else ac_cv_search_sqrt=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sqrt" >&5 $as_echo "$ac_cv_search_sqrt" >&6; } ac_res=$ac_cv_search_sqrt if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else as_fn_error $? "math library unavailable" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lws2_32" >&5 $as_echo_n "checking for main in -lws2_32... " >&6; } if ${ac_cv_lib_ws2_32_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lws2_32 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ws2_32_main=yes else ac_cv_lib_ws2_32_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ws2_32_main" >&5 $as_echo "$ac_cv_lib_ws2_32_main" >&6; } if test "x$ac_cv_lib_ws2_32_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBWS2_32 1 _ACEOF LIBS="-lws2_32 $LIBS" fi ac_cv_lib_ws2_32=ac_cv_lib_ws2_32_main for ac_func in sysconf do : ac_fn_c_check_func "$LINENO" "sysconf" "ac_cv_func_sysconf" if test "x$ac_cv_func_sysconf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYSCONF 1 _ACEOF fi done for ac_func in getrlimit do : ac_fn_c_check_func "$LINENO" "getrlimit" "ac_cv_func_getrlimit" if test "x$ac_cv_func_getrlimit" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETRLIMIT 1 _ACEOF fi done ac_fn_c_check_func "$LINENO" "pthread_spin_lock" "ac_cv_func_pthread_spin_lock" if test "x$ac_cv_func_pthread_spin_lock" = xyes; then : have_pthread_spin_lock=yes else have_pthread_spin_lock=no fi if test x$have_pthread_spin_lock = xyes; then $as_echo "#define HAVE_PTHREAD_SPIN_LOCK 1" >>confdefs.h $as_echo "#define STARPU_HAVE_PTHREAD_SPIN_LOCK 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "pthread_barrier_init" "ac_cv_func_pthread_barrier_init" if test "x$ac_cv_func_pthread_barrier_init" = xyes; then : have_pthread_barrier=yes else have_pthread_barrier=no fi if test x$have_pthread_barrier = xyes; then $as_echo "#define STARPU_HAVE_PTHREAD_BARRIER 1" >>confdefs.h fi # yes, that's non portable, but it's still better than sched_setaffinity for ac_func in pthread_setaffinity_np do : ac_fn_c_check_func "$LINENO" "pthread_setaffinity_np" "ac_cv_func_pthread_setaffinity_np" if test "x$ac_cv_func_pthread_setaffinity_np" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PTHREAD_SETAFFINITY_NP 1 _ACEOF fi done ac_fn_c_check_func "$LINENO" "pthread_setname_np" "ac_cv_func_pthread_setname_np" if test "x$ac_cv_func_pthread_setname_np" = xyes; then : have_pthread_setname_np=yes else have_pthread_setname_np=no fi if test x$have_pthread_setname_np = xyes; then $as_echo "#define STARPU_HAVE_PTHREAD_SETNAME_NP 1" >>confdefs.h fi # There is no posix_memalign on Mac OS X, only memalign for ac_func in posix_memalign do : ac_fn_c_check_func "$LINENO" "posix_memalign" "ac_cv_func_posix_memalign" if test "x$ac_cv_func_posix_memalign" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_POSIX_MEMALIGN 1 _ACEOF $as_echo "#define STARPU_HAVE_POSIX_MEMALIGN 1" >>confdefs.h fi done for ac_func in memalign do : ac_fn_c_check_func "$LINENO" "memalign" "ac_cv_func_memalign" if test "x$ac_cv_func_memalign" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MEMALIGN 1 _ACEOF $as_echo "#define STARPU_HAVE_MEMALIGN 1" >>confdefs.h fi done # Some systems don't have drand48 ac_fn_c_check_func "$LINENO" "drand48" "ac_cv_func_drand48" if test "x$ac_cv_func_drand48" = xyes; then : have_drand48=yes else have_drand48=no fi ac_fn_c_check_func "$LINENO" "erand48_r" "ac_cv_func_erand48_r" if test "x$ac_cv_func_erand48_r" = xyes; then : have_erand48_r=yes else have_erand48_r=no fi # Maybe the user still does not want to use the provided drand48 # Check whether --enable-default-drand48 was given. if test "${enable_default_drand48+set}" = set; then : enableval=$enable_default_drand48; enable_default_drand48=$enableval else enable_default_drand48=yes fi if test x$have_drand48 = xyes -a x$enable_default_drand48 = xyes ; then $as_echo "#define STARPU_USE_DRAND48 1" >>confdefs.h fi if test x$have_erand48_r = xyes ; then $as_echo "#define STARPU_USE_ERAND48_R 1" >>confdefs.h fi # Some systems do not define strerror_r ac_fn_c_check_func "$LINENO" "strerror_r" "ac_cv_func_strerror_r" if test "x$ac_cv_func_strerror_r" = xyes; then : $as_echo "#define STARPU_HAVE_STRERROR_R 1" >>confdefs.h fi # Some systems may not define setenv ac_fn_c_check_func "$LINENO" "setenv" "ac_cv_func_setenv" if test "x$ac_cv_func_setenv" = xyes; then : $as_echo "#define STARPU_HAVE_SETENV 1" >>confdefs.h fi # Some systems do not define unsetenv ac_fn_c_check_func "$LINENO" "unsetenv" "ac_cv_func_unsetenv" if test "x$ac_cv_func_unsetenv" = xyes; then : $as_echo "#define STARPU_HAVE_UNSETENV 1" >>confdefs.h fi # Some systems do not define nearbyintf... ac_fn_c_check_func "$LINENO" "nearbyintf" "ac_cv_func_nearbyintf" if test "x$ac_cv_func_nearbyintf" = xyes; then : $as_echo "#define STARPU_HAVE_NEARBYINTF 1" >>confdefs.h fi # ... but they may define rintf. ac_fn_c_check_func "$LINENO" "rintf" "ac_cv_func_rintf" if test "x$ac_cv_func_rintf" = xyes; then : $as_echo "#define STARPU_HAVE_RINTF 1" >>confdefs.h fi # Define quick check # Check whether --enable-quick-check was given. if test "${enable_quick_check+set}" = set; then : enableval=$enable_quick_check; enable_quick_check=$enableval else enable_quick_check=no fi if test x$enable_quick_check = xyes; then $as_echo "#define STARPU_QUICK_CHECK 1" >>confdefs.h fi if test "x$enable_quick_check" = "xyes"; then STARPU_QUICK_CHECK_TRUE= STARPU_QUICK_CHECK_FALSE='#' else STARPU_QUICK_CHECK_TRUE='#' STARPU_QUICK_CHECK_FALSE= fi # Define long check # Check whether --enable-long-check was given. if test "${enable_long_check+set}" = set; then : enableval=$enable_long_check; enable_long_check=$enableval else enable_long_check=no fi if test x$enable_long_check = xyes; then $as_echo "#define STARPU_LONG_CHECK 1" >>confdefs.h fi if test "x$enable_long_check" = "xyes"; then STARPU_LONG_CHECK_TRUE= STARPU_LONG_CHECK_FALSE='#' else STARPU_LONG_CHECK_TRUE='#' STARPU_LONG_CHECK_FALSE= fi # Define new check # Check whether --enable-new-check was given. if test "${enable_new_check+set}" = set; then : enableval=$enable_new_check; enable_new_check=$enableval else enable_new_check=no fi if test x$enable_new_check = xyes; then $as_echo "#define STARPU_NEW_CHECK 1" >>confdefs.h fi if test "x$enable_new_check" = "xyes"; then STARPU_NEW_CHECK_TRUE= STARPU_NEW_CHECK_FALSE='#' else STARPU_NEW_CHECK_TRUE='#' STARPU_NEW_CHECK_FALSE= fi for ac_header in malloc.h do : ac_fn_c_check_header_mongrel "$LINENO" "malloc.h" "ac_cv_header_malloc_h" "$ac_includes_default" if test "x$ac_cv_header_malloc_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MALLOC_H 1 _ACEOF $as_echo "#define STARPU_HAVE_MALLOC_H 1" >>confdefs.h fi done # Check whether --enable-valgrind was given. if test "${enable_valgrind+set}" = set; then : enableval=$enable_valgrind; enable_valgrind=$enableval else enable_valgrind=yes fi if test "$enable_valgrind" != "no" ; then for ac_header in valgrind/valgrind.h do : ac_fn_c_check_header_mongrel "$LINENO" "valgrind/valgrind.h" "ac_cv_header_valgrind_valgrind_h" "$ac_includes_default" if test "x$ac_cv_header_valgrind_valgrind_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VALGRIND_VALGRIND_H 1 _ACEOF $as_echo "#define STARPU_HAVE_VALGRIND_H 1" >>confdefs.h fi done for ac_header in valgrind/memcheck.h do : ac_fn_c_check_header_mongrel "$LINENO" "valgrind/memcheck.h" "ac_cv_header_valgrind_memcheck_h" "$ac_includes_default" if test "x$ac_cv_header_valgrind_memcheck_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VALGRIND_MEMCHECK_H 1 _ACEOF $as_echo "#define STARPU_HAVE_MEMCHECK_H 1" >>confdefs.h fi done for ac_header in valgrind/helgrind.h do : ac_fn_c_check_header_mongrel "$LINENO" "valgrind/helgrind.h" "ac_cv_header_valgrind_helgrind_h" "$ac_includes_default" if test "x$ac_cv_header_valgrind_helgrind_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VALGRIND_HELGRIND_H 1 _ACEOF $as_echo "#define STARPU_HAVE_HELGRIND_H 1" >>confdefs.h fi done fi if test "$enable_valgrind" = "full" ; then $as_echo "#define STARPU_VALGRIND_FULL 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "sched_yield" "ac_cv_func_sched_yield" if test "x$ac_cv_func_sched_yield" = xyes; then : $as_echo "#define STARPU_HAVE_SCHED_YIELD 1" >>confdefs.h fi for ac_header in aio.h do : ac_fn_c_check_header_mongrel "$LINENO" "aio.h" "ac_cv_header_aio_h" "$ac_includes_default" if test "x$ac_cv_header_aio_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_AIO_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for aio_read in -lrt" >&5 $as_echo_n "checking for aio_read in -lrt... " >&6; } if ${ac_cv_lib_rt_aio_read+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lrt $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char aio_read (); int main () { return aio_read (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_rt_aio_read=yes else ac_cv_lib_rt_aio_read=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_aio_read" >&5 $as_echo "$ac_cv_lib_rt_aio_read" >&6; } if test "x$ac_cv_lib_rt_aio_read" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBRT 1 _ACEOF LIBS="-lrt $LIBS" fi #AC_CHECK_HEADERS([libaio.h]) #AC_CHECK_LIB([aio], [io_setup]) for ac_func in mkostemp do : ac_fn_c_check_func "$LINENO" "mkostemp" "ac_cv_func_mkostemp" if test "x$ac_cv_func_mkostemp" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MKOSTEMP 1 _ACEOF fi done for ac_func in mkdtemp do : ac_fn_c_check_func "$LINENO" "mkdtemp" "ac_cv_func_mkdtemp" if test "x$ac_cv_func_mkdtemp" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MKDTEMP 1 _ACEOF fi done for ac_func in pread pwrite do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # This defines HAVE_SYNC_VAL_COMPARE_AND_SWAP { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target supports __sync_val_compare_and_swap" >&5 $as_echo_n "checking whether the target supports __sync_val_compare_and_swap... " >&6; } if ${ac_cv_have_sync_val_compare_and_swap+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo, bar; int main () { bar = __sync_val_compare_and_swap(&foo, 0, 1); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_have_sync_val_compare_and_swap=yes else ac_cv_have_sync_val_compare_and_swap=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_sync_val_compare_and_swap" >&5 $as_echo "$ac_cv_have_sync_val_compare_and_swap" >&6; } if test $ac_cv_have_sync_val_compare_and_swap = yes; then $as_echo "#define STARPU_HAVE_SYNC_VAL_COMPARE_AND_SWAP 1" >>confdefs.h fi # This defines HAVE_SYNC_BOOL_COMPARE_AND_SWAP { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target supports __sync_bool_compare_and_swap" >&5 $as_echo_n "checking whether the target supports __sync_bool_compare_and_swap... " >&6; } if ${ac_cv_have_sync_bool_compare_and_swap+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo, bar; int main () { bar = __sync_bool_compare_and_swap(&foo, 0, 1); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_have_sync_bool_compare_and_swap=yes else ac_cv_have_sync_bool_compare_and_swap=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_sync_bool_compare_and_swap" >&5 $as_echo "$ac_cv_have_sync_bool_compare_and_swap" >&6; } if test $ac_cv_have_sync_bool_compare_and_swap = yes; then $as_echo "#define STARPU_HAVE_SYNC_BOOL_COMPARE_AND_SWAP 1" >>confdefs.h fi # This defines HAVE_SYNC_FETCH_AND_ADD { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target supports __sync_fetch_and_add" >&5 $as_echo_n "checking whether the target supports __sync_fetch_and_add... " >&6; } if ${ac_cv_have_sync_fetch_and_add+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo, bar; int main () { bar = __sync_fetch_and_add(&foo, 1); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_have_sync_fetch_and_add=yes else ac_cv_have_sync_fetch_and_add=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_sync_fetch_and_add" >&5 $as_echo "$ac_cv_have_sync_fetch_and_add" >&6; } if test $ac_cv_have_sync_fetch_and_add = yes; then $as_echo "#define STARPU_HAVE_SYNC_FETCH_AND_ADD 1" >>confdefs.h fi # This defines HAVE_SYNC_FETCH_AND_OR { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target supports __sync_fetch_and_or" >&5 $as_echo_n "checking whether the target supports __sync_fetch_and_or... " >&6; } if ${ac_cv_have_sync_fetch_and_or+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo, bar; int main () { bar = __sync_fetch_and_or(&foo, 1); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_have_sync_fetch_and_or=yes else ac_cv_have_sync_fetch_and_or=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_sync_fetch_and_or" >&5 $as_echo "$ac_cv_have_sync_fetch_and_or" >&6; } if test $ac_cv_have_sync_fetch_and_or = yes; then $as_echo "#define STARPU_HAVE_SYNC_FETCH_AND_OR 1" >>confdefs.h fi # This defines HAVE_SYNC_LOCK_TEST_AND_SET { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target supports __sync_lock_test_and_set" >&5 $as_echo_n "checking whether the target supports __sync_lock_test_and_set... " >&6; } if ${ac_cv_have_sync_lock_test_and_set+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo, bar; int main () { bar = __sync_lock_test_and_set(&foo, 1); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_have_sync_lock_test_and_set=yes else ac_cv_have_sync_lock_test_and_set=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_sync_lock_test_and_set" >&5 $as_echo "$ac_cv_have_sync_lock_test_and_set" >&6; } if test $ac_cv_have_sync_lock_test_and_set = yes; then $as_echo "#define STARPU_HAVE_SYNC_LOCK_TEST_AND_SET 1" >>confdefs.h fi # This defines HAVE_SYNC_SYNCHRONIZE { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target supports __sync_synchronize" >&5 $as_echo_n "checking whether the target supports __sync_synchronize... " >&6; } if ${ac_cv_have_sync_synchronize+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { __sync_synchronize(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_have_sync_synchronize=yes else ac_cv_have_sync_synchronize=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_sync_synchronize" >&5 $as_echo "$ac_cv_have_sync_synchronize" >&6; } if test $ac_cv_have_sync_synchronize = yes; then $as_echo "#define STARPU_HAVE_SYNC_SYNCHRONIZE 1" >>confdefs.h fi CPPFLAGS="${CPPFLAGS} -D_GNU_SOURCE " _LIBS_SAV="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing set_mempolicy" >&5 $as_echo_n "checking for library containing set_mempolicy... " >&6; } if ${ac_cv_search_set_mempolicy+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char set_mempolicy (); int main () { return set_mempolicy (); ; return 0; } _ACEOF for ac_lib in '' numa; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_set_mempolicy=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_set_mempolicy+:} false; then : break fi done if ${ac_cv_search_set_mempolicy+:} false; then : else ac_cv_search_set_mempolicy=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_set_mempolicy" >&5 $as_echo "$ac_cv_search_set_mempolicy" >&6; } ac_res=$ac_cv_search_set_mempolicy if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" enable_libnuma=yes else enable_libnuma=no fi STARPU_LIBNUMA_LDFLAGS="$STARPU_LIBNUMA_LDFLAGS $LIBS" LIBS=$_LIBS_SAV { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether libnuma is available" >&5 $as_echo_n "checking whether libnuma is available... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_libnuma" >&5 $as_echo "$enable_libnuma" >&6; } if test x$enable_libnuma = xyes; then $as_echo "#define STARPU_HAVE_LIBNUMA 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether statement expressions are available" >&5 $as_echo_n "checking whether statement expressions are available... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define maxint(a,b) ({int _a = (a), _b = (b); _a > _b ? _a : _b; }) int main () { int x=maxint(12,42); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : statement_expressions="yes" else statement_expressions="no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $statement_expressions" >&5 $as_echo "$statement_expressions" >&6; } if test x$statement_expressions = xyes; then $as_echo "#define STARPU_HAVE_STATEMENT_EXPRESSIONS 1" >>confdefs.h fi ############################################################################### # # # SCHED_CTX settings # # # ############################################################################### { $as_echo "$as_me:${as_lineno-$LINENO}: checking maximum number of sched_ctxs" >&5 $as_echo_n "checking maximum number of sched_ctxs... " >&6; } # Check whether --enable-max_sched_ctxs was given. if test "${enable_max_sched_ctxs+set}" = set; then : enableval=$enable_max_sched_ctxs; max_sched_ctxs=$enableval else max_sched_ctxs=10 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $max_sched_ctxs" >&5 $as_echo "$max_sched_ctxs" >&6; } cat >>confdefs.h <<_ACEOF #define STARPU_NMAX_SCHED_CTXS $max_sched_ctxs _ACEOF # Check whether --enable-sc_hypervisor was given. if test "${enable_sc_hypervisor+set}" = set; then : enableval=$enable_sc_hypervisor; enable_sc_hypervisor="yes" else enable_sc_hypervisor="no" fi #for pkgconfig if test "x$enable_sc_hypervisor" = "xyes"; then $as_echo "#define STARPU_USE_SC_HYPERVISOR 1" >>confdefs.h # PKG_CHECK_MODULES([SC_HYPERVISOR], [libsc_hypervisor], [], build_sc_hypervisor="yes") STARPU_SC_HYPERVISOR="-lsc_hypervisor" build_sc_hypervisor="yes" else build_sc_hypervisor="no" fi if test "x$build_sc_hypervisor" = "xyes"; then STARPU_BUILD_SC_HYPERVISOR_TRUE= STARPU_BUILD_SC_HYPERVISOR_FALSE='#' else STARPU_BUILD_SC_HYPERVISOR_TRUE='#' STARPU_BUILD_SC_HYPERVISOR_FALSE= fi if test "x$build_sc_hypervisor" = "xyes"; then STARPU_USE_SC_HYPERVISOR_TRUE= STARPU_USE_SC_HYPERVISOR_FALSE='#' else STARPU_USE_SC_HYPERVISOR_TRUE='#' STARPU_USE_SC_HYPERVISOR_FALSE= fi # Check whether --enable-sc_hypervisor_debug was given. if test "${enable_sc_hypervisor_debug+set}" = set; then : enableval=$enable_sc_hypervisor_debug; enable_sc_hypervisor_debug="yes" else enable_sc_hypervisor_debug="no" fi STARPU_SC_HYPERVISOR_DEBUG=$enable_sc_hypervisor_debug if test "x$enable_sc_hypervisor_debug" = "xyes"; then STARPU_SC_HYPERVISOR_DEBUG_TRUE= STARPU_SC_HYPERVISOR_DEBUG_FALSE='#' else STARPU_SC_HYPERVISOR_DEBUG_TRUE='#' STARPU_SC_HYPERVISOR_DEBUG_FALSE= fi if test "x$enable_sc_hypervisor_debug" = "xyes"; then $as_echo "#define STARPU_SC_HYPERVISOR_DEBUG 1" >>confdefs.h fi ############################################################################### # # # CPUs settings # # # ############################################################################### { $as_echo "$as_me:${as_lineno-$LINENO}: checking maximum number of CPUs" >&5 $as_echo_n "checking maximum number of CPUs... " >&6; } # Check whether --enable-maxcpus was given. if test "${enable_maxcpus+set}" = set; then : enableval=$enable_maxcpus; maxcpus=$enableval else maxcpus=64 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $maxcpus" >&5 $as_echo "$maxcpus" >&6; } cat >>confdefs.h <<_ACEOF #define STARPU_MAXCPUS $maxcpus _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CPUs should be used" >&5 $as_echo_n "checking whether CPUs should be used... " >&6; } # Check whether --enable-cpu was given. if test "${enable_cpu+set}" = set; then : enableval=$enable_cpu; enable_cpu=$enableval else enable_cpu=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_cpu" >&5 $as_echo "$enable_cpu" >&6; } STARPU_USE_CPU=$enable_cpu if test x$enable_cpu = xyes; then STARPU_USE_CPU_TRUE= STARPU_USE_CPU_FALSE='#' else STARPU_USE_CPU_TRUE='#' STARPU_USE_CPU_FALSE= fi if test x$enable_cpu = xyes; then $as_echo "#define STARPU_USE_CPU 1" >>confdefs.h fi ############################################################################### # # # CUDA settings # # # ############################################################################### { $as_echo "$as_me:${as_lineno-$LINENO}: checking maximum number of CUDA devices" >&5 $as_echo_n "checking maximum number of CUDA devices... " >&6; } # Check whether --enable-maxcudadev was given. if test "${enable_maxcudadev+set}" = set; then : enableval=$enable_maxcudadev; nmaxcudadev=$enableval else nmaxcudadev=4 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nmaxcudadev" >&5 $as_echo "$nmaxcudadev" >&6; } cat >>confdefs.h <<_ACEOF #define STARPU_MAXCUDADEVS $nmaxcudadev _ACEOF # Check whether --enable-cuda was given. if test "${enable_cuda+set}" = set; then : enableval=$enable_cuda; else enable_cuda=maybe fi #AC_MSG_CHECKING(whether CUDA is available) # Check whether --with-cuda-dir was given. if test "${with_cuda_dir+set}" = set; then : withval=$with_cuda_dir; cuda_dir="$withval" # in case this was not explicit yet enable_cuda=yes else cuda_dir=no fi # Check whether --with-cuda-include-dir was given. if test "${with_cuda_include_dir+set}" = set; then : withval=$with_cuda_include_dir; cuda_include_dir="$withval" # in case this was not explicit yet enable_cuda=yes else cuda_include_dir=no fi # Check whether --with-cuda-lib-dir was given. if test "${with_cuda_lib_dir+set}" = set; then : withval=$with_cuda_lib_dir; cuda_lib_dir="$withval" # in case this was not explicit yet enable_cuda=yes else cuda_lib_dir=no fi if test x$enable_cuda = xyes -o x$enable_cuda = xmaybe; then __cuda_dir="$cuda_dir" __cuda_include_dir="$cuda_include_dir" __cuda_lib_dir="$cuda_lib_dir" if test -z "$__cuda_lib_dir" ; then __cuda_lib_dir=no fi if test -z "$__cuda_include_dir" ; then __cuda_include_dir=no fi if test -z "$__cuda_dir" ; then __cuda_dir=no fi if test "$__cuda_dir" != "no" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available in $__cuda_dir" >&5 $as_echo_n "checking whether CUDA is available in $__cuda_dir... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available" >&5 $as_echo_n "checking whether CUDA is available... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } if test "$__cuda_include_dir" = "no" -a "$__cuda_dir" != "no" ; then __cuda_include_dir="$__cuda_dir/include" fi SAVED_CPPFLAGS="$CPPFLAGS" have_valid_cuda=no if test "$__cuda_include_dir" != "no" ; then CPPFLAGS="${CPPFLAGS} -I$__cuda_include_dir" fi ac_fn_c_check_header_mongrel "$LINENO" "cuda.h" "ac_cv_header_cuda_h" "$ac_includes_default" if test "x$ac_cv_header_cuda_h" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi unset ac_cv_header_cuda_h if test "$have_valid_cuda" = "yes" ; then if test "$__cuda_lib_dir" != "no" ; then __cuda_L="-L${__cuda_lib_dir}" SAVED_LDFLAGS="${LDFLAGS}" STARPU_CUDA_LDFLAGS="${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available with: $__cuda_L" >&5 $as_echo_n "checking whether CUDA is available with: $__cuda_L... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } LDFLAGS="${SAVED_LDFLAGS} ${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcuda" >&5 $as_echo_n "checking for main in -lcuda... " >&6; } if ${ac_cv_lib_cuda_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcuda $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cuda_main=yes else ac_cv_lib_cuda_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cuda_main" >&5 $as_echo "$ac_cv_lib_cuda_main" >&6; } if test "x$ac_cv_lib_cuda_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cuda=ac_cv_lib_cuda_main unset ac_cv_lib_cuda_main if test "$have_valid_cuda" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcudart" >&5 $as_echo_n "checking for main in -lcudart... " >&6; } if ${ac_cv_lib_cudart_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcudart $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cudart_main=yes else ac_cv_lib_cudart_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cudart_main" >&5 $as_echo "$ac_cv_lib_cudart_main" >&6; } if test "x$ac_cv_lib_cudart_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cudart=ac_cv_lib_cudart_main unset ac_cv_lib_cudart_main if test "$have_valid_cuda" = yes ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcudart" LDFLAGS="${SAVED_LDFLAGS} ${STARPU_CUDA_LDFLAGS}" # we also check that CUBLAS is available { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcublas" >&5 $as_echo_n "checking for main in -lcublas... " >&6; } if ${ac_cv_lib_cublas_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcublas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cublas_main=yes else ac_cv_lib_cublas_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cublas_main" >&5 $as_echo "$ac_cv_lib_cublas_main" >&6; } if test "x$ac_cv_lib_cublas_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cublas=ac_cv_lib_cublas_main unset ac_cv_lib_cublas_main if test "$have_valid_cuda" = "yes" ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcublas" fi fi fi LDFLAGS="${SAVED_LDFLAGS}" else if test "$__cuda_dir" != "no" ; then for __cuda_libdir in lib64 lib lib/x64 lib/Win32 ; do __cuda_L="-L${__cuda_dir}/${__cuda_libdir}" SAVED_LDFLAGS="${LDFLAGS}" STARPU_CUDA_LDFLAGS="${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available with: $__cuda_L" >&5 $as_echo_n "checking whether CUDA is available with: $__cuda_L... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } LDFLAGS="${SAVED_LDFLAGS} ${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcuda" >&5 $as_echo_n "checking for main in -lcuda... " >&6; } if ${ac_cv_lib_cuda_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcuda $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cuda_main=yes else ac_cv_lib_cuda_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cuda_main" >&5 $as_echo "$ac_cv_lib_cuda_main" >&6; } if test "x$ac_cv_lib_cuda_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cuda=ac_cv_lib_cuda_main unset ac_cv_lib_cuda_main if test "$have_valid_cuda" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcudart" >&5 $as_echo_n "checking for main in -lcudart... " >&6; } if ${ac_cv_lib_cudart_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcudart $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cudart_main=yes else ac_cv_lib_cudart_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cudart_main" >&5 $as_echo "$ac_cv_lib_cudart_main" >&6; } if test "x$ac_cv_lib_cudart_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cudart=ac_cv_lib_cudart_main unset ac_cv_lib_cudart_main if test "$have_valid_cuda" = yes ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcudart" LDFLAGS="${SAVED_LDFLAGS} ${STARPU_CUDA_LDFLAGS}" # we also check that CUBLAS is available { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcublas" >&5 $as_echo_n "checking for main in -lcublas... " >&6; } if ${ac_cv_lib_cublas_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcublas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cublas_main=yes else ac_cv_lib_cublas_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cublas_main" >&5 $as_echo "$ac_cv_lib_cublas_main" >&6; } if test "x$ac_cv_lib_cublas_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cublas=ac_cv_lib_cublas_main unset ac_cv_lib_cublas_main if test "$have_valid_cuda" = "yes" ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcublas" fi fi fi LDFLAGS="${SAVED_LDFLAGS}" if test "$have_valid_cuda" = yes ; then break fi done else __cuda_L="" SAVED_LDFLAGS="${LDFLAGS}" STARPU_CUDA_LDFLAGS="${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available with: $__cuda_L" >&5 $as_echo_n "checking whether CUDA is available with: $__cuda_L... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } LDFLAGS="${SAVED_LDFLAGS} ${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcuda" >&5 $as_echo_n "checking for main in -lcuda... " >&6; } if ${ac_cv_lib_cuda_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcuda $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cuda_main=yes else ac_cv_lib_cuda_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cuda_main" >&5 $as_echo "$ac_cv_lib_cuda_main" >&6; } if test "x$ac_cv_lib_cuda_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cuda=ac_cv_lib_cuda_main unset ac_cv_lib_cuda_main if test "$have_valid_cuda" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcudart" >&5 $as_echo_n "checking for main in -lcudart... " >&6; } if ${ac_cv_lib_cudart_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcudart $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cudart_main=yes else ac_cv_lib_cudart_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cudart_main" >&5 $as_echo "$ac_cv_lib_cudart_main" >&6; } if test "x$ac_cv_lib_cudart_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cudart=ac_cv_lib_cudart_main unset ac_cv_lib_cudart_main if test "$have_valid_cuda" = yes ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcudart" LDFLAGS="${SAVED_LDFLAGS} ${STARPU_CUDA_LDFLAGS}" # we also check that CUBLAS is available { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcublas" >&5 $as_echo_n "checking for main in -lcublas... " >&6; } if ${ac_cv_lib_cublas_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcublas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cublas_main=yes else ac_cv_lib_cublas_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cublas_main" >&5 $as_echo "$ac_cv_lib_cublas_main" >&6; } if test "x$ac_cv_lib_cublas_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cublas=ac_cv_lib_cublas_main unset ac_cv_lib_cublas_main if test "$have_valid_cuda" = "yes" ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcublas" fi fi fi LDFLAGS="${SAVED_LDFLAGS}" fi fi fi if test "$have_valid_cuda" = "no" ; then CPPFLAGS="${SAVED_CPPFLAGS}" unset STARPU_CUDA_LDFLAGS else if test "$NVCC" = "" ; then # Extract the first word of "nvcc", so it can be a program name with args. set dummy nvcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_NVCC+:} false; then : $as_echo_n "(cached) " >&6 else case $NVCC in [\\/]* | ?:[\\/]*) ac_cv_path_NVCC="$NVCC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$cuda_dir/bin:$PATH:/usr/local/cuda/bin:/usr/bin:/bin" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_NVCC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_NVCC" && ac_cv_path_NVCC="not-found" ;; esac fi NVCC=$ac_cv_path_NVCC if test -n "$NVCC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NVCC" >&5 $as_echo "$NVCC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "x$NVCC" = "xnot-found"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'nvcc' not found, disabling CUDA" >&5 $as_echo "$as_me: WARNING: 'nvcc' not found, disabling CUDA" >&2;} have_valid_cuda=no else # This is for very old cuda, to enable the use of double etc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether nvcc supports sm_13 architecture" >&5 $as_echo_n "checking whether nvcc supports sm_13 architecture... " >&6; } OLD_NVCCFLAGS="$NVCCFLAGS" NVCCFLAGS="$NVCCFLAGS -arch sm_13" echo "int main(int argc, char **argv) { return 0;}" > cuda_test.cu $NVCC $NVCCFLAGS -c cuda_test.cu >/dev/null 2>&1 if test $? -eq 0 then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } NVCCFLAGS="$OLD_NVCCFLAGS" fi # This is for recent cuda, which complains if we don't actually set an arch!? { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether nvcc supports -Wno-deprecated-gpu-targets" >&5 $as_echo_n "checking whether nvcc supports -Wno-deprecated-gpu-targets... " >&6; } OLD_NVCCFLAGS="$NVCCFLAGS" NVCCFLAGS="$NVCCFLAGS -Wno-deprecated-gpu-targets" echo "int main(int argc, char **argv) { return 0;}" > cuda_test.cu $NVCC $NVCCFLAGS -c cuda_test.cu >/dev/null 2>&1 if test $? -eq 0 then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } NVCCFLAGS="$OLD_NVCCFLAGS" fi rm -f cuda_test* fi if test -n "$NVCC_CC"; then NVCCFLAGS="${NVCCFLAGS} -ccbin \${NVCC_CC}" fi if test "$__cuda_include_dir" != "no"; then STARPU_CUDA_CPPFLAGS="-I$__cuda_include_dir" NVCCFLAGS="${NVCCFLAGS} -I$__cuda_include_dir" fi fi if test "$have_valid_cuda" = "no" ; then __cuda_dir="$CUDA_ROOT" __cuda_include_dir="$CUDA_PATH" __cuda_lib_dir="$CUDA_INC_PATH" if test -z "$__cuda_lib_dir" ; then __cuda_lib_dir=no fi if test -z "$__cuda_include_dir" ; then __cuda_include_dir=no fi if test -z "$__cuda_dir" ; then __cuda_dir=no fi if test "$__cuda_dir" != "no" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available in $__cuda_dir" >&5 $as_echo_n "checking whether CUDA is available in $__cuda_dir... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available" >&5 $as_echo_n "checking whether CUDA is available... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } if test "$__cuda_include_dir" = "no" -a "$__cuda_dir" != "no" ; then __cuda_include_dir="$__cuda_dir/include" fi SAVED_CPPFLAGS="$CPPFLAGS" have_valid_cuda=no if test "$__cuda_include_dir" != "no" ; then CPPFLAGS="${CPPFLAGS} -I$__cuda_include_dir" fi ac_fn_c_check_header_mongrel "$LINENO" "cuda.h" "ac_cv_header_cuda_h" "$ac_includes_default" if test "x$ac_cv_header_cuda_h" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi unset ac_cv_header_cuda_h if test "$have_valid_cuda" = "yes" ; then if test "$__cuda_lib_dir" != "no" ; then __cuda_L="-L${__cuda_lib_dir}" SAVED_LDFLAGS="${LDFLAGS}" STARPU_CUDA_LDFLAGS="${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available with: $__cuda_L" >&5 $as_echo_n "checking whether CUDA is available with: $__cuda_L... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } LDFLAGS="${SAVED_LDFLAGS} ${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcuda" >&5 $as_echo_n "checking for main in -lcuda... " >&6; } if ${ac_cv_lib_cuda_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcuda $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cuda_main=yes else ac_cv_lib_cuda_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cuda_main" >&5 $as_echo "$ac_cv_lib_cuda_main" >&6; } if test "x$ac_cv_lib_cuda_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cuda=ac_cv_lib_cuda_main unset ac_cv_lib_cuda_main if test "$have_valid_cuda" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcudart" >&5 $as_echo_n "checking for main in -lcudart... " >&6; } if ${ac_cv_lib_cudart_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcudart $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cudart_main=yes else ac_cv_lib_cudart_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cudart_main" >&5 $as_echo "$ac_cv_lib_cudart_main" >&6; } if test "x$ac_cv_lib_cudart_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cudart=ac_cv_lib_cudart_main unset ac_cv_lib_cudart_main if test "$have_valid_cuda" = yes ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcudart" LDFLAGS="${SAVED_LDFLAGS} ${STARPU_CUDA_LDFLAGS}" # we also check that CUBLAS is available { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcublas" >&5 $as_echo_n "checking for main in -lcublas... " >&6; } if ${ac_cv_lib_cublas_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcublas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cublas_main=yes else ac_cv_lib_cublas_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cublas_main" >&5 $as_echo "$ac_cv_lib_cublas_main" >&6; } if test "x$ac_cv_lib_cublas_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cublas=ac_cv_lib_cublas_main unset ac_cv_lib_cublas_main if test "$have_valid_cuda" = "yes" ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcublas" fi fi fi LDFLAGS="${SAVED_LDFLAGS}" else if test "$__cuda_dir" != "no" ; then for __cuda_libdir in lib64 lib lib/x64 lib/Win32 ; do __cuda_L="-L${__cuda_dir}/${__cuda_libdir}" SAVED_LDFLAGS="${LDFLAGS}" STARPU_CUDA_LDFLAGS="${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available with: $__cuda_L" >&5 $as_echo_n "checking whether CUDA is available with: $__cuda_L... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } LDFLAGS="${SAVED_LDFLAGS} ${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcuda" >&5 $as_echo_n "checking for main in -lcuda... " >&6; } if ${ac_cv_lib_cuda_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcuda $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cuda_main=yes else ac_cv_lib_cuda_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cuda_main" >&5 $as_echo "$ac_cv_lib_cuda_main" >&6; } if test "x$ac_cv_lib_cuda_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cuda=ac_cv_lib_cuda_main unset ac_cv_lib_cuda_main if test "$have_valid_cuda" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcudart" >&5 $as_echo_n "checking for main in -lcudart... " >&6; } if ${ac_cv_lib_cudart_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcudart $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cudart_main=yes else ac_cv_lib_cudart_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cudart_main" >&5 $as_echo "$ac_cv_lib_cudart_main" >&6; } if test "x$ac_cv_lib_cudart_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cudart=ac_cv_lib_cudart_main unset ac_cv_lib_cudart_main if test "$have_valid_cuda" = yes ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcudart" LDFLAGS="${SAVED_LDFLAGS} ${STARPU_CUDA_LDFLAGS}" # we also check that CUBLAS is available { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcublas" >&5 $as_echo_n "checking for main in -lcublas... " >&6; } if ${ac_cv_lib_cublas_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcublas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cublas_main=yes else ac_cv_lib_cublas_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cublas_main" >&5 $as_echo "$ac_cv_lib_cublas_main" >&6; } if test "x$ac_cv_lib_cublas_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cublas=ac_cv_lib_cublas_main unset ac_cv_lib_cublas_main if test "$have_valid_cuda" = "yes" ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcublas" fi fi fi LDFLAGS="${SAVED_LDFLAGS}" if test "$have_valid_cuda" = yes ; then break fi done else __cuda_L="" SAVED_LDFLAGS="${LDFLAGS}" STARPU_CUDA_LDFLAGS="${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available with: $__cuda_L" >&5 $as_echo_n "checking whether CUDA is available with: $__cuda_L... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } LDFLAGS="${SAVED_LDFLAGS} ${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcuda" >&5 $as_echo_n "checking for main in -lcuda... " >&6; } if ${ac_cv_lib_cuda_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcuda $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cuda_main=yes else ac_cv_lib_cuda_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cuda_main" >&5 $as_echo "$ac_cv_lib_cuda_main" >&6; } if test "x$ac_cv_lib_cuda_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cuda=ac_cv_lib_cuda_main unset ac_cv_lib_cuda_main if test "$have_valid_cuda" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcudart" >&5 $as_echo_n "checking for main in -lcudart... " >&6; } if ${ac_cv_lib_cudart_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcudart $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cudart_main=yes else ac_cv_lib_cudart_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cudart_main" >&5 $as_echo "$ac_cv_lib_cudart_main" >&6; } if test "x$ac_cv_lib_cudart_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cudart=ac_cv_lib_cudart_main unset ac_cv_lib_cudart_main if test "$have_valid_cuda" = yes ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcudart" LDFLAGS="${SAVED_LDFLAGS} ${STARPU_CUDA_LDFLAGS}" # we also check that CUBLAS is available { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcublas" >&5 $as_echo_n "checking for main in -lcublas... " >&6; } if ${ac_cv_lib_cublas_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcublas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cublas_main=yes else ac_cv_lib_cublas_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cublas_main" >&5 $as_echo "$ac_cv_lib_cublas_main" >&6; } if test "x$ac_cv_lib_cublas_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cublas=ac_cv_lib_cublas_main unset ac_cv_lib_cublas_main if test "$have_valid_cuda" = "yes" ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcublas" fi fi fi LDFLAGS="${SAVED_LDFLAGS}" fi fi fi if test "$have_valid_cuda" = "no" ; then CPPFLAGS="${SAVED_CPPFLAGS}" unset STARPU_CUDA_LDFLAGS else if test "$NVCC" = "" ; then # Extract the first word of "nvcc", so it can be a program name with args. set dummy nvcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_NVCC+:} false; then : $as_echo_n "(cached) " >&6 else case $NVCC in [\\/]* | ?:[\\/]*) ac_cv_path_NVCC="$NVCC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$cuda_dir/bin:$PATH:/usr/local/cuda/bin:/usr/bin:/bin" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_NVCC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_NVCC" && ac_cv_path_NVCC="not-found" ;; esac fi NVCC=$ac_cv_path_NVCC if test -n "$NVCC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NVCC" >&5 $as_echo "$NVCC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "x$NVCC" = "xnot-found"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'nvcc' not found, disabling CUDA" >&5 $as_echo "$as_me: WARNING: 'nvcc' not found, disabling CUDA" >&2;} have_valid_cuda=no else # This is for very old cuda, to enable the use of double etc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether nvcc supports sm_13 architecture" >&5 $as_echo_n "checking whether nvcc supports sm_13 architecture... " >&6; } OLD_NVCCFLAGS="$NVCCFLAGS" NVCCFLAGS="$NVCCFLAGS -arch sm_13" echo "int main(int argc, char **argv) { return 0;}" > cuda_test.cu $NVCC $NVCCFLAGS -c cuda_test.cu >/dev/null 2>&1 if test $? -eq 0 then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } NVCCFLAGS="$OLD_NVCCFLAGS" fi # This is for recent cuda, which complains if we don't actually set an arch!? { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether nvcc supports -Wno-deprecated-gpu-targets" >&5 $as_echo_n "checking whether nvcc supports -Wno-deprecated-gpu-targets... " >&6; } OLD_NVCCFLAGS="$NVCCFLAGS" NVCCFLAGS="$NVCCFLAGS -Wno-deprecated-gpu-targets" echo "int main(int argc, char **argv) { return 0;}" > cuda_test.cu $NVCC $NVCCFLAGS -c cuda_test.cu >/dev/null 2>&1 if test $? -eq 0 then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } NVCCFLAGS="$OLD_NVCCFLAGS" fi rm -f cuda_test* fi if test -n "$NVCC_CC"; then NVCCFLAGS="${NVCCFLAGS} -ccbin \${NVCC_CC}" fi if test "$__cuda_include_dir" != "no"; then STARPU_CUDA_CPPFLAGS="-I$__cuda_include_dir" NVCCFLAGS="${NVCCFLAGS} -I$__cuda_include_dir" fi fi fi if test "$have_valid_cuda" = "no" ; then for f in "/usr/local/cuda" "/c/cuda" "/cygdrive/c/cuda" "/opt/cuda" "$CUDA_ROOT" "$CUDA_PATH" "$CUDA_INC_PATH/.." "$CUDA_INC/.." "$CUDA_BIN/.." "$CUDA_SDK/.." "$CUDA_INSTALL_PATH" "$CUDA_TOOLKIT"; do if test -n "$f" ; then __cuda_dir="$f" __cuda_include_dir="no" __cuda_lib_dir="no" if test -z "$__cuda_lib_dir" ; then __cuda_lib_dir=no fi if test -z "$__cuda_include_dir" ; then __cuda_include_dir=no fi if test -z "$__cuda_dir" ; then __cuda_dir=no fi if test "$__cuda_dir" != "no" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available in $__cuda_dir" >&5 $as_echo_n "checking whether CUDA is available in $__cuda_dir... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available" >&5 $as_echo_n "checking whether CUDA is available... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } if test "$__cuda_include_dir" = "no" -a "$__cuda_dir" != "no" ; then __cuda_include_dir="$__cuda_dir/include" fi SAVED_CPPFLAGS="$CPPFLAGS" have_valid_cuda=no if test "$__cuda_include_dir" != "no" ; then CPPFLAGS="${CPPFLAGS} -I$__cuda_include_dir" fi ac_fn_c_check_header_mongrel "$LINENO" "cuda.h" "ac_cv_header_cuda_h" "$ac_includes_default" if test "x$ac_cv_header_cuda_h" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi unset ac_cv_header_cuda_h if test "$have_valid_cuda" = "yes" ; then if test "$__cuda_lib_dir" != "no" ; then __cuda_L="-L${__cuda_lib_dir}" SAVED_LDFLAGS="${LDFLAGS}" STARPU_CUDA_LDFLAGS="${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available with: $__cuda_L" >&5 $as_echo_n "checking whether CUDA is available with: $__cuda_L... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } LDFLAGS="${SAVED_LDFLAGS} ${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcuda" >&5 $as_echo_n "checking for main in -lcuda... " >&6; } if ${ac_cv_lib_cuda_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcuda $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cuda_main=yes else ac_cv_lib_cuda_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cuda_main" >&5 $as_echo "$ac_cv_lib_cuda_main" >&6; } if test "x$ac_cv_lib_cuda_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cuda=ac_cv_lib_cuda_main unset ac_cv_lib_cuda_main if test "$have_valid_cuda" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcudart" >&5 $as_echo_n "checking for main in -lcudart... " >&6; } if ${ac_cv_lib_cudart_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcudart $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cudart_main=yes else ac_cv_lib_cudart_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cudart_main" >&5 $as_echo "$ac_cv_lib_cudart_main" >&6; } if test "x$ac_cv_lib_cudart_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cudart=ac_cv_lib_cudart_main unset ac_cv_lib_cudart_main if test "$have_valid_cuda" = yes ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcudart" LDFLAGS="${SAVED_LDFLAGS} ${STARPU_CUDA_LDFLAGS}" # we also check that CUBLAS is available { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcublas" >&5 $as_echo_n "checking for main in -lcublas... " >&6; } if ${ac_cv_lib_cublas_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcublas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cublas_main=yes else ac_cv_lib_cublas_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cublas_main" >&5 $as_echo "$ac_cv_lib_cublas_main" >&6; } if test "x$ac_cv_lib_cublas_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cublas=ac_cv_lib_cublas_main unset ac_cv_lib_cublas_main if test "$have_valid_cuda" = "yes" ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcublas" fi fi fi LDFLAGS="${SAVED_LDFLAGS}" else if test "$__cuda_dir" != "no" ; then for __cuda_libdir in lib64 lib lib/x64 lib/Win32 ; do __cuda_L="-L${__cuda_dir}/${__cuda_libdir}" SAVED_LDFLAGS="${LDFLAGS}" STARPU_CUDA_LDFLAGS="${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available with: $__cuda_L" >&5 $as_echo_n "checking whether CUDA is available with: $__cuda_L... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } LDFLAGS="${SAVED_LDFLAGS} ${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcuda" >&5 $as_echo_n "checking for main in -lcuda... " >&6; } if ${ac_cv_lib_cuda_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcuda $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cuda_main=yes else ac_cv_lib_cuda_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cuda_main" >&5 $as_echo "$ac_cv_lib_cuda_main" >&6; } if test "x$ac_cv_lib_cuda_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cuda=ac_cv_lib_cuda_main unset ac_cv_lib_cuda_main if test "$have_valid_cuda" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcudart" >&5 $as_echo_n "checking for main in -lcudart... " >&6; } if ${ac_cv_lib_cudart_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcudart $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cudart_main=yes else ac_cv_lib_cudart_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cudart_main" >&5 $as_echo "$ac_cv_lib_cudart_main" >&6; } if test "x$ac_cv_lib_cudart_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cudart=ac_cv_lib_cudart_main unset ac_cv_lib_cudart_main if test "$have_valid_cuda" = yes ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcudart" LDFLAGS="${SAVED_LDFLAGS} ${STARPU_CUDA_LDFLAGS}" # we also check that CUBLAS is available { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcublas" >&5 $as_echo_n "checking for main in -lcublas... " >&6; } if ${ac_cv_lib_cublas_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcublas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cublas_main=yes else ac_cv_lib_cublas_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cublas_main" >&5 $as_echo "$ac_cv_lib_cublas_main" >&6; } if test "x$ac_cv_lib_cublas_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cublas=ac_cv_lib_cublas_main unset ac_cv_lib_cublas_main if test "$have_valid_cuda" = "yes" ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcublas" fi fi fi LDFLAGS="${SAVED_LDFLAGS}" if test "$have_valid_cuda" = yes ; then break fi done else __cuda_L="" SAVED_LDFLAGS="${LDFLAGS}" STARPU_CUDA_LDFLAGS="${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available with: $__cuda_L" >&5 $as_echo_n "checking whether CUDA is available with: $__cuda_L... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } LDFLAGS="${SAVED_LDFLAGS} ${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcuda" >&5 $as_echo_n "checking for main in -lcuda... " >&6; } if ${ac_cv_lib_cuda_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcuda $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cuda_main=yes else ac_cv_lib_cuda_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cuda_main" >&5 $as_echo "$ac_cv_lib_cuda_main" >&6; } if test "x$ac_cv_lib_cuda_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cuda=ac_cv_lib_cuda_main unset ac_cv_lib_cuda_main if test "$have_valid_cuda" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcudart" >&5 $as_echo_n "checking for main in -lcudart... " >&6; } if ${ac_cv_lib_cudart_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcudart $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cudart_main=yes else ac_cv_lib_cudart_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cudart_main" >&5 $as_echo "$ac_cv_lib_cudart_main" >&6; } if test "x$ac_cv_lib_cudart_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cudart=ac_cv_lib_cudart_main unset ac_cv_lib_cudart_main if test "$have_valid_cuda" = yes ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcudart" LDFLAGS="${SAVED_LDFLAGS} ${STARPU_CUDA_LDFLAGS}" # we also check that CUBLAS is available { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcublas" >&5 $as_echo_n "checking for main in -lcublas... " >&6; } if ${ac_cv_lib_cublas_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcublas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cublas_main=yes else ac_cv_lib_cublas_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cublas_main" >&5 $as_echo "$ac_cv_lib_cublas_main" >&6; } if test "x$ac_cv_lib_cublas_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cublas=ac_cv_lib_cublas_main unset ac_cv_lib_cublas_main if test "$have_valid_cuda" = "yes" ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcublas" fi fi fi LDFLAGS="${SAVED_LDFLAGS}" fi fi fi if test "$have_valid_cuda" = "no" ; then CPPFLAGS="${SAVED_CPPFLAGS}" unset STARPU_CUDA_LDFLAGS else if test "$NVCC" = "" ; then # Extract the first word of "nvcc", so it can be a program name with args. set dummy nvcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_NVCC+:} false; then : $as_echo_n "(cached) " >&6 else case $NVCC in [\\/]* | ?:[\\/]*) ac_cv_path_NVCC="$NVCC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$cuda_dir/bin:$PATH:/usr/local/cuda/bin:/usr/bin:/bin" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_NVCC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_NVCC" && ac_cv_path_NVCC="not-found" ;; esac fi NVCC=$ac_cv_path_NVCC if test -n "$NVCC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NVCC" >&5 $as_echo "$NVCC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "x$NVCC" = "xnot-found"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'nvcc' not found, disabling CUDA" >&5 $as_echo "$as_me: WARNING: 'nvcc' not found, disabling CUDA" >&2;} have_valid_cuda=no else # This is for very old cuda, to enable the use of double etc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether nvcc supports sm_13 architecture" >&5 $as_echo_n "checking whether nvcc supports sm_13 architecture... " >&6; } OLD_NVCCFLAGS="$NVCCFLAGS" NVCCFLAGS="$NVCCFLAGS -arch sm_13" echo "int main(int argc, char **argv) { return 0;}" > cuda_test.cu $NVCC $NVCCFLAGS -c cuda_test.cu >/dev/null 2>&1 if test $? -eq 0 then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } NVCCFLAGS="$OLD_NVCCFLAGS" fi # This is for recent cuda, which complains if we don't actually set an arch!? { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether nvcc supports -Wno-deprecated-gpu-targets" >&5 $as_echo_n "checking whether nvcc supports -Wno-deprecated-gpu-targets... " >&6; } OLD_NVCCFLAGS="$NVCCFLAGS" NVCCFLAGS="$NVCCFLAGS -Wno-deprecated-gpu-targets" echo "int main(int argc, char **argv) { return 0;}" > cuda_test.cu $NVCC $NVCCFLAGS -c cuda_test.cu >/dev/null 2>&1 if test $? -eq 0 then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } NVCCFLAGS="$OLD_NVCCFLAGS" fi rm -f cuda_test* fi if test -n "$NVCC_CC"; then NVCCFLAGS="${NVCCFLAGS} -ccbin \${NVCC_CC}" fi if test "$__cuda_include_dir" != "no"; then STARPU_CUDA_CPPFLAGS="-I$__cuda_include_dir" NVCCFLAGS="${NVCCFLAGS} -I$__cuda_include_dir" fi fi if test "$have_valid_cuda" = "yes" ; then break fi fi done fi # Check cuda is compatible with the C compiler { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is working" >&5 $as_echo_n "checking whether CUDA is working... " >&6; } if test "$have_valid_cuda" = "yes" ; then SAVED_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${CPPFLAGS} ${STARPU_CUDA_CPPFLAGS}" SAVED_LDFLAGS="${LDFLAGS}" LDFLAGS="${LDFLAGS} ${STARPU_CUDA_LDFLAGS} -lcuda" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : have_valid_cuda="yes" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: CUDA found and can be compiled, but compiled application can not be run, is the CUDA path missing in LD_LIBRARY_PATH?" >&5 $as_echo "CUDA found and can be compiled, but compiled application can not be run, is the CUDA path missing in LD_LIBRARY_PATH?" >&6; } have_valid_cuda="no" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi else as_fn_error $? "CUDA found, but cuda.h could not be compiled" "$LINENO" 5 have_valid_cuda="no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="${SAVED_CPPFLAGS}" LDFLAGS="${SAVED_LDFLAGS}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_valid_cuda" >&5 $as_echo "$have_valid_cuda" >&6; } # in case CUDA was explicitely required, but is not available, this is an error if test x$enable_cuda = xyes -a x$have_valid_cuda = xno; then as_fn_error $? "cannot find CUDA" "$LINENO" 5 fi # now we enable CUDA if and only if a proper setup is available enable_cuda=$have_valid_cuda fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA should be used" >&5 $as_echo_n "checking whether CUDA should be used... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_cuda" >&5 $as_echo "$enable_cuda" >&6; } STARPU_USE_CUDA=$enable_cuda if test x$enable_cuda = xyes; then STARPU_USE_CUDA_TRUE= STARPU_USE_CUDA_FALSE='#' else STARPU_USE_CUDA_TRUE='#' STARPU_USE_CUDA_FALSE= fi if test x$enable_cuda = xyes; then $as_echo "#define STARPU_USE_CUDA 1" >>confdefs.h # On Darwin, the libstdc++ dependency is not automatically added by nvcc # case "$target" in # *-*darwin*) AC_HAVE_LIBRARY([stdc++], []) ;; # #*-*darwin*) AC_HAVE_LIBRARY([stdc++], [STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lstdc++"]) ;; # esac STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcuda" STARPU_CUFFT_LDFLAGS="-lcufft" if test "$F77" = "gfortran" -o "$FC" = "gfortran" ; then STARPU_CUDA_FORTRAN_LDFLAGS="-lgfortran" fi #in case this is a 64bit setup, we tell nvcc to use a -m64 flag if test x$SIZEOF_VOID_P = x8; then NVCCFLAGS="${NVCCFLAGS} -m64" fi for ac_header in cuda_gl_interop.h do : ac_fn_c_check_header_mongrel "$LINENO" "cuda_gl_interop.h" "ac_cv_header_cuda_gl_interop_h" "$ac_includes_default" if test "x$ac_cv_header_cuda_gl_interop_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_CUDA_GL_INTEROP_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cusparseCreate in -lcusparse" >&5 $as_echo_n "checking for cusparseCreate in -lcusparse... " >&6; } if ${ac_cv_lib_cusparse_cusparseCreate+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcusparse $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cusparseCreate (); int main () { return cusparseCreate (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cusparse_cusparseCreate=yes else ac_cv_lib_cusparse_cusparseCreate=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cusparse_cusparseCreate" >&5 $as_echo "$ac_cv_lib_cusparse_cusparseCreate" >&6; } if test "x$ac_cv_lib_cusparse_cusparseCreate" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBCUSPARSE 1 _ACEOF LIBS="-lcusparse $LIBS" fi ac_fn_c_check_decl "$LINENO" "cusparseSetStream" "ac_cv_have_decl_cusparseSetStream" "#include " if test "x$ac_cv_have_decl_cusparseSetStream" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_CUSPARSESETSTREAM $ac_have_decl _ACEOF fi if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi have_magma=no if test x$enable_cuda = xyes; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MAGMA" >&5 $as_echo_n "checking for MAGMA... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$MAGMA_CFLAGS"; then pkg_cv_MAGMA_CFLAGS="$MAGMA_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"magma\""; } >&5 ($PKG_CONFIG --exists --print-errors "magma") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MAGMA_CFLAGS=`$PKG_CONFIG --cflags "magma" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$MAGMA_LIBS"; then pkg_cv_MAGMA_LIBS="$MAGMA_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"magma\""; } >&5 ($PKG_CONFIG --exists --print-errors "magma") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MAGMA_LIBS=`$PKG_CONFIG --libs "magma" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then MAGMA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "magma"` else MAGMA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "magma"` fi # Put the nasty error message in config.log where it belongs echo "$MAGMA_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : elif test $pkg_failed = untried; then : else MAGMA_CFLAGS=$pkg_cv_MAGMA_CFLAGS MAGMA_LIBS=$pkg_cv_MAGMA_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define STARPU_HAVE_MAGMA 1" >>confdefs.h STARPU_HAVE_MAGMA=1 have_magma=yes fi fi if test x$have_magma = xyes; then STARPU_HAVE_MAGMA_TRUE= STARPU_HAVE_MAGMA_FALSE='#' else STARPU_HAVE_MAGMA_TRUE='#' STARPU_HAVE_MAGMA_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether MAGMA should be used" >&5 $as_echo_n "checking whether MAGMA should be used... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_magma" >&5 $as_echo "$have_magma" >&6; } # cufftDoubleComplex may not be available on an old CUDA setup ac_fn_c_check_type "$LINENO" "cufftDoubleComplex" "ac_cv_type_cufftDoubleComplex" "#include " if test "x$ac_cv_type_cufftDoubleComplex" = xyes; then : have_cufftdoublecomplex=yes else have_cufftdoublecomplex=no fi if test x$have_cufftdoublecomplex = xyes; then STARPU_HAVE_CUFFTDOUBLECOMPLEX_TRUE= STARPU_HAVE_CUFFTDOUBLECOMPLEX_FALSE='#' else STARPU_HAVE_CUFFTDOUBLECOMPLEX_TRUE='#' STARPU_HAVE_CUFFTDOUBLECOMPLEX_FALSE= fi if test x$have_cufftdoublecomplex = xyes; then $as_echo "#define STARPU_HAVE_CUFFTDOUBLECOMPLEX 1" >>confdefs.h fi # The CURAND library is only available since CUDA 3.2 have_curand=$enable_cuda if test x$enable_cuda = xyes; then SAVED_LDFLAGS="${LDFLAGS}" LDFLAGS="${LDFLAGS} ${STARPU_CUDA_LDFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcurand" >&5 $as_echo_n "checking for main in -lcurand... " >&6; } if ${ac_cv_lib_curand_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcurand $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_curand_main=yes else ac_cv_lib_curand_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curand_main" >&5 $as_echo "$ac_cv_lib_curand_main" >&6; } if test "x$ac_cv_lib_curand_main" = xyes; then : have_curand=yes else have_curand=no fi ac_cv_lib_curand=ac_cv_lib_curand_main LDFLAGS="${SAVED_LDFLAGS}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CURAND is available" >&5 $as_echo_n "checking whether CURAND is available... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_curand" >&5 $as_echo "$have_curand" >&6; } if test x$have_curand = xyes; then $as_echo "#define STARPU_HAVE_CURAND 1" >>confdefs.h STARPU_CURAND_LDFLAGS="$STARPU_CURAND_LDFLAGS -lcurand" fi # Peer transfers are only supported since CUDA 4.0 # Disable them if user explicity wants to disable them # Check whether --enable-cuda_memcpy_peer was given. if test "${enable_cuda_memcpy_peer+set}" = set; then : enableval=$enable_cuda_memcpy_peer; else enable_cuda_memcpy_peer=yes fi have_cuda_memcpy_peer=no if test x$enable_cuda_memcpy_peer = xyes -a x$enable_cuda = xyes ; then SAVED_LDFLAGS="${LDFLAGS}" LDFLAGS="${LDFLAGS} ${STARPU_CUDA_LDFLAGS}" ac_fn_c_check_func "$LINENO" "cudaMemcpyPeer" "ac_cv_func_cudaMemcpyPeer" if test "x$ac_cv_func_cudaMemcpyPeer" = xyes; then : have_cuda_memcpy_peer=yes else have_cuda_memcpy_peer=no fi LDFLAGS="${SAVED_LDFLAGS}" fi if test x$have_cuda_memcpy_peer = xyes; then $as_echo "#define HAVE_CUDA_MEMCPY_PEER 1" >>confdefs.h fi if test x$enable_cuda = xyes; then if test x$starpu_windows != xyes ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lstdc++" fi fi ############################################################################### # # # OpenCL settings # # # ############################################################################### { $as_echo "$as_me:${as_lineno-$LINENO}: checking maximum number of OpenCL devices" >&5 $as_echo_n "checking maximum number of OpenCL devices... " >&6; } # Check whether --enable-maxopencldev was given. if test "${enable_maxopencldev+set}" = set; then : enableval=$enable_maxopencldev; nmaxopencldev=$enableval else nmaxopencldev=8 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nmaxopencldev" >&5 $as_echo "$nmaxopencldev" >&6; } cat >>confdefs.h <<_ACEOF #define STARPU_MAXOPENCLDEVS $nmaxopencldev _ACEOF # Check whether --enable-opencl was given. if test "${enable_opencl+set}" = set; then : enableval=$enable_opencl; else enable_opencl=maybe fi have_valid_opencl=no #AC_MSG_CHECKING(whether OpenCL is available) # Check whether --with-opencl-dir was given. if test "${with_opencl_dir+set}" = set; then : withval=$with_opencl_dir; opencl_dir="$withval" # in case this was not explicit yet enable_opencl=yes else opencl_dir=no fi # Check whether --with-opencl-include-dir was given. if test "${with_opencl_include_dir+set}" = set; then : withval=$with_opencl_include_dir; opencl_include_dir="$withval" # in case this was not explicit yet enable_opencl=yes else opencl_include_dir=no fi # Check whether --with-opencl-lib-dir was given. if test "${with_opencl_lib_dir+set}" = set; then : withval=$with_opencl_lib_dir; opencl_lib_dir="$withval" # in case this was not explicit yet enable_opencl=yes else opencl_lib_dir=no fi if test x$enable_opencl = xyes -o x$enable_opencl = xmaybe; then case $target in *-*-darwin*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether OpenCL is available" >&5 $as_echo_n "checking whether OpenCL is available... " >&6; } SAVED_LIBS=$LIBS LIBS="$LIBS -framework OpenCL" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __APPLE_CC__ #include #else #include #endif int main () { return clSetKernelArg(0, 0, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } enable_opencl=yes have_valid_opencl=yes STARPU_OPENCL_CPPFLAGS= STARPU_OPENCL_LDFLAGS="-framework OpenCL" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } enable_opencl=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$SAVED_LIBS ;; *) if test "x$has_opencl_being_checked" != "xyes" ; then __opencl_dir="$opencl_dir" __opencl_include_dir="$opencl_include_dir" __opencl_lib_dir="$opencl_lib_dir" if test "$__opencl_dir" != "no" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether OpenCL is available in $__opencl_dir $__opencl_include_dir and $__opencl_lib_dir" >&5 $as_echo_n "checking whether OpenCL is available in $__opencl_dir $__opencl_include_dir and $__opencl_lib_dir... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether OpenCL is available" >&5 $as_echo_n "checking whether OpenCL is available... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } if test "$__opencl_include_dir" = "no" -a "$__opencl_dir" != "no" ; then __opencl_include_dir="$__opencl_dir/include" fi SAVED_CPPFLAGS="$CPPFLAGS" SAVED_LDFLAGS="${LDFLAGS}" if test "$__opencl_include_dir" != "no" ; then CPPFLAGS="${CPPFLAGS} -I$__opencl_include_dir" fi ac_fn_c_check_header_mongrel "$LINENO" "CL/cl.h" "ac_cv_header_CL_cl_h" "$ac_includes_default" if test "x$ac_cv_header_CL_cl_h" = xyes; then : have_valid_opencl=yes else have_valid_opencl=no fi unset ac_cv_header_CL_cl_h if test "$have_valid_opencl" = "yes" ; then if test "$__opencl_lib_dir" != "no"; then LDFLAGS="${SAVED_LDFLAGS} -L$__opencl_lib_dir" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lOpenCL" >&5 $as_echo_n "checking for main in -lOpenCL... " >&6; } if ${ac_cv_lib_OpenCL_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lOpenCL $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_OpenCL_main=yes else ac_cv_lib_OpenCL_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_OpenCL_main" >&5 $as_echo "$ac_cv_lib_OpenCL_main" >&6; } if test "x$ac_cv_lib_OpenCL_main" = xyes; then : have_valid_opencl=yes else have_valid_opencl=no fi ac_cv_lib_OpenCL=ac_cv_lib_OpenCL_main unset ac_cv_lib_OpenCL_main else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether OpenCL is available in $__opencl_dir" >&5 $as_echo_n "checking whether OpenCL is available in $__opencl_dir... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lOpenCL" >&5 $as_echo_n "checking for main in -lOpenCL... " >&6; } if ${ac_cv_lib_OpenCL_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lOpenCL $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_OpenCL_main=yes else ac_cv_lib_OpenCL_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_OpenCL_main" >&5 $as_echo "$ac_cv_lib_OpenCL_main" >&6; } if test "x$ac_cv_lib_OpenCL_main" = xyes; then : have_valid_opencl=yes else have_valid_opencl=no fi ac_cv_lib_OpenCL=ac_cv_lib_OpenCL_main unset ac_cv_lib_OpenCL_main if test "$have_valid_opencl" = "no" -a "$__opencl_dir" != "no" ; then for __cuda_libdir in lib64 lib lib/x86 lib/Win32 ; do __opencl_lib_dir="$__opencl_dir/$__cuda_libdir" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether OpenCL is available in $__opencl_dir and $__opencl_lib_dir" >&5 $as_echo_n "checking whether OpenCL is available in $__opencl_dir and $__opencl_lib_dir... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } LDFLAGS="${SAVED_LDFLAGS} -L$__opencl_lib_dir" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lOpenCL" >&5 $as_echo_n "checking for main in -lOpenCL... " >&6; } if ${ac_cv_lib_OpenCL_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lOpenCL $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_OpenCL_main=yes else ac_cv_lib_OpenCL_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_OpenCL_main" >&5 $as_echo "$ac_cv_lib_OpenCL_main" >&6; } if test "x$ac_cv_lib_OpenCL_main" = xyes; then : have_valid_opencl=yes else have_valid_opencl=no fi ac_cv_lib_OpenCL=ac_cv_lib_OpenCL_main unset ac_cv_lib_OpenCL_main if test "$have_valid_opencl" = yes ; then break fi done else LDFLAGS="${SAVED_LDFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lOpenCL" >&5 $as_echo_n "checking for main in -lOpenCL... " >&6; } if ${ac_cv_lib_OpenCL_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lOpenCL $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_OpenCL_main=yes else ac_cv_lib_OpenCL_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_OpenCL_main" >&5 $as_echo "$ac_cv_lib_OpenCL_main" >&6; } if test "x$ac_cv_lib_OpenCL_main" = xyes; then : have_valid_opencl=yes else have_valid_opencl=no fi ac_cv_lib_OpenCL=ac_cv_lib_OpenCL_main unset ac_cv_lib_OpenCL_main fi fi fi if test "$have_valid_opencl" = "yes" -a "$__opencl_include_dir" != "no"; then STARPU_OPENCL_CPPFLAGS="-I$__opencl_include_dir" for ac_header in CL/cl_ext.h do : ac_fn_c_check_header_mongrel "$LINENO" "CL/cl_ext.h" "ac_cv_header_CL_cl_ext_h" "$ac_includes_default" if test "x$ac_cv_header_CL_cl_ext_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_CL_CL_EXT_H 1 _ACEOF fi done fi CPPFLAGS="${SAVED_CPPFLAGS}" LDFLAGS="${SAVED_LDFLAGS}" if test "$have_valid_opencl" = "yes" ; then if test "$__opencl_lib_dir" != "no"; then STARPU_OPENCL_LDFLAGS="-L$__opencl_lib_dir" fi STARPU_OPENCL_LDFLAGS="${STARPU_OPENCL_LDFLAGS} -lOpenCL" fi if test "$have_valid_opencl" = "no" ; then for f in "/usr/local/cuda" "/c/cuda" "/cygdrive/c/cuda" "/opt/cuda" "$CUDA_ROOT" "$CUDA_PATH" "$CUDA_INC_PATH/.." "$CUDA_INSTALL_PATH" "$CUDA_TOOLKIT"; do if test -n "$f" ; then __opencl_dir="$f" __opencl_include_dir="no" __opencl_lib_dir="no" if test "$__opencl_dir" != "no" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether OpenCL is available in $__opencl_dir $__opencl_include_dir and $__opencl_lib_dir" >&5 $as_echo_n "checking whether OpenCL is available in $__opencl_dir $__opencl_include_dir and $__opencl_lib_dir... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether OpenCL is available" >&5 $as_echo_n "checking whether OpenCL is available... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } if test "$__opencl_include_dir" = "no" -a "$__opencl_dir" != "no" ; then __opencl_include_dir="$__opencl_dir/include" fi SAVED_CPPFLAGS="$CPPFLAGS" SAVED_LDFLAGS="${LDFLAGS}" if test "$__opencl_include_dir" != "no" ; then CPPFLAGS="${CPPFLAGS} -I$__opencl_include_dir" fi ac_fn_c_check_header_mongrel "$LINENO" "CL/cl.h" "ac_cv_header_CL_cl_h" "$ac_includes_default" if test "x$ac_cv_header_CL_cl_h" = xyes; then : have_valid_opencl=yes else have_valid_opencl=no fi unset ac_cv_header_CL_cl_h if test "$have_valid_opencl" = "yes" ; then if test "$__opencl_lib_dir" != "no"; then LDFLAGS="${SAVED_LDFLAGS} -L$__opencl_lib_dir" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lOpenCL" >&5 $as_echo_n "checking for main in -lOpenCL... " >&6; } if ${ac_cv_lib_OpenCL_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lOpenCL $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_OpenCL_main=yes else ac_cv_lib_OpenCL_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_OpenCL_main" >&5 $as_echo "$ac_cv_lib_OpenCL_main" >&6; } if test "x$ac_cv_lib_OpenCL_main" = xyes; then : have_valid_opencl=yes else have_valid_opencl=no fi ac_cv_lib_OpenCL=ac_cv_lib_OpenCL_main unset ac_cv_lib_OpenCL_main else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether OpenCL is available in $__opencl_dir" >&5 $as_echo_n "checking whether OpenCL is available in $__opencl_dir... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lOpenCL" >&5 $as_echo_n "checking for main in -lOpenCL... " >&6; } if ${ac_cv_lib_OpenCL_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lOpenCL $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_OpenCL_main=yes else ac_cv_lib_OpenCL_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_OpenCL_main" >&5 $as_echo "$ac_cv_lib_OpenCL_main" >&6; } if test "x$ac_cv_lib_OpenCL_main" = xyes; then : have_valid_opencl=yes else have_valid_opencl=no fi ac_cv_lib_OpenCL=ac_cv_lib_OpenCL_main unset ac_cv_lib_OpenCL_main if test "$have_valid_opencl" = "no" -a "$__opencl_dir" != "no" ; then for __cuda_libdir in lib64 lib lib/x86 lib/Win32 ; do __opencl_lib_dir="$__opencl_dir/$__cuda_libdir" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether OpenCL is available in $__opencl_dir and $__opencl_lib_dir" >&5 $as_echo_n "checking whether OpenCL is available in $__opencl_dir and $__opencl_lib_dir... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } LDFLAGS="${SAVED_LDFLAGS} -L$__opencl_lib_dir" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lOpenCL" >&5 $as_echo_n "checking for main in -lOpenCL... " >&6; } if ${ac_cv_lib_OpenCL_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lOpenCL $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_OpenCL_main=yes else ac_cv_lib_OpenCL_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_OpenCL_main" >&5 $as_echo "$ac_cv_lib_OpenCL_main" >&6; } if test "x$ac_cv_lib_OpenCL_main" = xyes; then : have_valid_opencl=yes else have_valid_opencl=no fi ac_cv_lib_OpenCL=ac_cv_lib_OpenCL_main unset ac_cv_lib_OpenCL_main if test "$have_valid_opencl" = yes ; then break fi done else LDFLAGS="${SAVED_LDFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lOpenCL" >&5 $as_echo_n "checking for main in -lOpenCL... " >&6; } if ${ac_cv_lib_OpenCL_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lOpenCL $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_OpenCL_main=yes else ac_cv_lib_OpenCL_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_OpenCL_main" >&5 $as_echo "$ac_cv_lib_OpenCL_main" >&6; } if test "x$ac_cv_lib_OpenCL_main" = xyes; then : have_valid_opencl=yes else have_valid_opencl=no fi ac_cv_lib_OpenCL=ac_cv_lib_OpenCL_main unset ac_cv_lib_OpenCL_main fi fi fi if test "$have_valid_opencl" = "yes" -a "$__opencl_include_dir" != "no"; then STARPU_OPENCL_CPPFLAGS="-I$__opencl_include_dir" for ac_header in CL/cl_ext.h do : ac_fn_c_check_header_mongrel "$LINENO" "CL/cl_ext.h" "ac_cv_header_CL_cl_ext_h" "$ac_includes_default" if test "x$ac_cv_header_CL_cl_ext_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_CL_CL_EXT_H 1 _ACEOF fi done fi CPPFLAGS="${SAVED_CPPFLAGS}" LDFLAGS="${SAVED_LDFLAGS}" if test "$have_valid_opencl" = "yes" ; then if test "$__opencl_lib_dir" != "no"; then STARPU_OPENCL_LDFLAGS="-L$__opencl_lib_dir" fi STARPU_OPENCL_LDFLAGS="${STARPU_OPENCL_LDFLAGS} -lOpenCL" fi if test "$have_valid_opencl" = "yes" ; then break fi fi done fi has_opencl_being_checked=yes fi # in case OpenCL was explicitely required, but is not available, this is an error if test x$enable_opencl = xyes -a x$have_valid_opencl = xno; then as_fn_error $? "cannot find OpenCL" "$LINENO" 5 fi # now we enable OpenCL if and only if a proper setup is available enable_opencl=$have_valid_opencl ;; esac save_LIBS="$LIBS" LIBS="$LIBS $STARPU_OPENCL_LDFLAGS" for ac_func in clEnqueueMarkerWithWaitList do : ac_fn_c_check_func "$LINENO" "clEnqueueMarkerWithWaitList" "ac_cv_func_clEnqueueMarkerWithWaitList" if test "x$ac_cv_func_clEnqueueMarkerWithWaitList" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_CLENQUEUEMARKERWITHWAITLIST 1 _ACEOF fi done LIBS="$save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether OpenCL should be used" >&5 $as_echo_n "checking whether OpenCL should be used... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_opencl" >&5 $as_echo "$enable_opencl" >&6; } STARPU_USE_OPENCL=$enable_opencl if test x$enable_opencl = xyes; then STARPU_USE_OPENCL_TRUE= STARPU_USE_OPENCL_FALSE='#' else STARPU_USE_OPENCL_TRUE='#' STARPU_USE_OPENCL_FALSE= fi if test x$enable_opencl = xyes ; then $as_echo "#define STARPU_USE_OPENCL 1" >>confdefs.h STARPU_OPENCL_CPPFLAGS="${STARPU_OPENCL_CPPFLAGS} -DSTARPU_OPENCL_DATADIR=${datarootdir}/starpu/opencl -DCL_USE_DEPRECATED_OPENCL_1_1_APIS" STARPU_OPENCL_DATAdir="$(eval echo ${datarootdir}/starpu/opencl/examples)" fi ############################################################################### # # # General GPU settings # # # ############################################################################### { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether asynchronous copy should be disabled" >&5 $as_echo_n "checking whether asynchronous copy should be disabled... " >&6; } # Check whether --enable-asynchronous-copy was given. if test "${enable_asynchronous_copy+set}" = set; then : enableval=$enable_asynchronous_copy; enable_asynchronous_copy=$enableval else enable_asynchronous_copy=yes fi disable_asynchronous_copy=no if test x$enable_asynchronous_copy = xno ; then disable_asynchronous_copy=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $disable_asynchronous_copy" >&5 $as_echo "$disable_asynchronous_copy" >&6; } if test x$disable_asynchronous_copy = xyes ; then $as_echo "#define STARPU_DISABLE_ASYNCHRONOUS_COPY 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether asynchronous CUDA copy should be disabled" >&5 $as_echo_n "checking whether asynchronous CUDA copy should be disabled... " >&6; } # Check whether --enable-asynchronous-cuda-copy was given. if test "${enable_asynchronous_cuda_copy+set}" = set; then : enableval=$enable_asynchronous_cuda_copy; enable_asynchronous_cuda_copy=$enableval else enable_asynchronous_cuda_copy=yes fi disable_asynchronous_cuda_copy=no if test x$enable_asynchronous_cuda_copy = xno ; then disable_asynchronous_cuda_copy=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $disable_asynchronous_cuda_copy" >&5 $as_echo "$disable_asynchronous_cuda_copy" >&6; } if test x$disable_asynchronous_cuda_copy = xyes ; then $as_echo "#define STARPU_DISABLE_ASYNCHRONOUS_CUDA_COPY 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether asynchronous OpenCL copy should be disabled" >&5 $as_echo_n "checking whether asynchronous OpenCL copy should be disabled... " >&6; } # Check whether --enable-asynchronous-opencl-copy was given. if test "${enable_asynchronous_opencl_copy+set}" = set; then : enableval=$enable_asynchronous_opencl_copy; enable_asynchronous_opencl_copy=$enableval else enable_asynchronous_opencl_copy=yes fi disable_asynchronous_opencl_copy=no if test x$enable_asynchronous_opencl_copy = xno ; then disable_asynchronous_opencl_copy=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $disable_asynchronous_opencl_copy" >&5 $as_echo "$disable_asynchronous_opencl_copy" >&6; } if test x$disable_asynchronous_opencl_copy = xyes ; then $as_echo "#define STARPU_DISABLE_ASYNCHRONOUS_OPENCL_COPY 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether asynchronous MIC copy should be disabled" >&5 $as_echo_n "checking whether asynchronous MIC copy should be disabled... " >&6; } # Check whether --enable-asynchronous-mic-copy was given. if test "${enable_asynchronous_mic_copy+set}" = set; then : enableval=$enable_asynchronous_mic_copy; enable_asynchronous_mic_copy=$enableval else enable_asynchronous_mic_copy=yes fi disable_asynchronous_mic_copy=no if test x$enable_asynchronous_mic_copy = xno ; then disable_asynchronous_mic_copy=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $disable_asynchronous_mic_copy" >&5 $as_echo "$disable_asynchronous_mic_copy" >&6; } if test x$disable_asynchronous_mic_copy = xyes ; then $as_echo "#define STARPU_DISABLE_ASYNCHRONOUS_MIC_COPY 1" >>confdefs.h fi ############################################################################### # # # Drivers # # # ############################################################################### # Check whether --enable-opencl-simulator was given. if test "${enable_opencl_simulator+set}" = set; then : enableval=$enable_opencl_simulator; enable_opencl_simulator=$enableval else enable_opencl_simulator=no fi if test x$enable_opencl_simulator = xyes; then enable_simgrid=yes $as_echo "#define STARPU_OPENCL_SIMULATOR 1" >>confdefs.h fi # Check whether --with-simgrid-dir was given. if test "${with_simgrid_dir+set}" = set; then : withval=$with_simgrid_dir; simgrid_dir="$withval" # in case this was not explicit yet enable_simgrid=yes else simgrid_dir=no fi # Check whether --with-simgrid-include-dir was given. if test "${with_simgrid_include_dir+set}" = set; then : withval=$with_simgrid_include_dir; simgrid_include_dir="$withval" # in case this was not explicit yet enable_simgrid=yes else simgrid_include_dir=no fi # Check whether --with-simgrid-lib-dir was given. if test "${with_simgrid_lib_dir+set}" = set; then : withval=$with_simgrid_lib_dir; simgrid_lib_dir="$withval" # in case this was not explicit yet enable_simgrid=yes else simgrid_lib_dir=no fi # Check whether --enable-simgrid was given. if test "${enable_simgrid+set}" = set; then : enableval=$enable_simgrid; enable_simgrid=$enableval else enable_simgrid=no fi if test x$enable_simgrid = xyes ; then if test -n "$SIMGRID_CFLAGS" ; then CFLAGS="$SIMGRID_CFLAGS $CFLAGS" CXXFLAGS="$SIMGRID_CFLAGS $CXXFLAGS" NVCCFLAGS="$SIMGRID_CFLAGS $NVCCFLAGS" fi if test -n "$SIMGRID_LIBS" ; then LDFLAGS="$SIMGRID_LIBS $LDFLAGS" fi if test "$simgrid_dir" != "no" ; then CFLAGS="-I$simgrid_dir/include $CFLAGS" CXXFLAGS="-I$simgrid_dir/include $CXXFLAGS" NVCCFLAGS="-I$simgrid_dir/include $NVCCFLAGS" LDFLAGS="-L$simgrid_dir/lib $LDFLAGS" fi if test "$simgrid_include_dir" != "no" ; then CFLAGS="-I$simgrid_include_dir $CFLAGS" CXXFLAGS="-I$simgrid_include_dir $CXXFLAGS" NVCCFLAGS="-I$simgrid_include_dir $NVCCFLAGS" fi if test "$simgrid_lib_dir" != "no" ; then LDFLAGS="-L$simgrid_lib_dir $LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lsimgrid" >&5 $as_echo_n "checking for main in -lsimgrid... " >&6; } if ${ac_cv_lib_simgrid_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsimgrid $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_simgrid_main=yes else ac_cv_lib_simgrid_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_simgrid_main" >&5 $as_echo "$ac_cv_lib_simgrid_main" >&6; } if test "x$ac_cv_lib_simgrid_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBSIMGRID 1 _ACEOF LIBS="-lsimgrid $LIBS" else as_fn_error $? "Simgrid support needs simgrid installed" "$LINENO" 5 fi ac_cv_lib_simgrid=ac_cv_lib_simgrid_main for ac_header in simgrid/msg.h do : ac_fn_c_check_header_mongrel "$LINENO" "simgrid/msg.h" "ac_cv_header_simgrid_msg_h" "$ac_includes_default" if test "x$ac_cv_header_simgrid_msg_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIMGRID_MSG_H 1 _ACEOF $as_echo "#define STARPU_HAVE_SIMGRID_MSG_H 1" >>confdefs.h fi done for ac_header in xbt/synchro.h do : ac_fn_c_check_header_mongrel "$LINENO" "xbt/synchro.h" "ac_cv_header_xbt_synchro_h" "$ac_includes_default" if test "x$ac_cv_header_xbt_synchro_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_XBT_SYNCHRO_H 1 _ACEOF $as_echo "#define STARPU_HAVE_XBT_SYNCHRO_H 1" >>confdefs.h fi done for ac_func in MSG_process_join MSG_process_attach MSG_get_as_by_name MSG_zone_get_by_name MSG_environment_get_routing_root MSG_zone_get_hosts MSG_host_get_speed MSG_process_self_name do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in xbt_mutex_try_acquire smpi_process_set_user_data do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in xbt_barrier_init do : ac_fn_c_check_func "$LINENO" "xbt_barrier_init" "ac_cv_func_xbt_barrier_init" if test "x$ac_cv_func_xbt_barrier_init" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_XBT_BARRIER_INIT 1 _ACEOF $as_echo "#define STARPU_SIMGRID_HAVE_XBT_BARRIER_INIT 1" >>confdefs.h fi done ac_fn_c_check_decl "$LINENO" "smpi_process_set_user_data" "ac_cv_have_decl_smpi_process_set_user_data" "#include " if test "x$ac_cv_have_decl_smpi_process_set_user_data" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_SMPI_PROCESS_SET_USER_DATA $ac_have_decl _ACEOF for ac_func in SIMIX_process_get_code do : ac_fn_c_check_func "$LINENO" "SIMIX_process_get_code" "ac_cv_func_SIMIX_process_get_code" if test "x$ac_cv_func_SIMIX_process_get_code" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIMIX_PROCESS_GET_CODE 1 _ACEOF $as_echo "#define STARPU_SIMGRID_HAVE_SIMIX_PROCESS_GET_CODE 1" >>confdefs.h fi done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef STARPU_HAVE_SIMGRID_MSG_H #include #else #include #endif int main () { msg_host_t foo; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else as_fn_error $? "StarPU needs a version of Simgrid which defines the type msg_host_t (should be any version >= 3.8.1)" "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext $as_echo "#define STARPU_SIMGRID 1" >>confdefs.h # We won't bind or detect anything with_hwloc=no # Simgrid 3.12 & 3.13 need -std=c++11 to be able to build anything in C++... ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef HAVE_SIMGRID_MSG_H #include #include #else #include #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else CXXFLAGS="-std=c++11 $CXXFLAGS" NVCCFLAGS="-std=c++11 $NVCCFLAGS" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi if test x$enable_simgrid = xyes; then STARPU_SIMGRID_TRUE= STARPU_SIMGRID_FALSE='#' else STARPU_SIMGRID_TRUE='#' STARPU_SIMGRID_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether SimGrid is enabled" >&5 $as_echo_n "checking whether SimGrid is enabled... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_simgrid" >&5 $as_echo "$enable_simgrid" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether blocking drivers should be enabled" >&5 $as_echo_n "checking whether blocking drivers should be enabled... " >&6; } # Check whether --enable-blocking-drivers was given. if test "${enable_blocking_drivers+set}" = set; then : enableval=$enable_blocking_drivers; enable_blocking=$enableval else enable_blocking=$enable_simgrid fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_blocking" >&5 $as_echo "$enable_blocking" >&6; } if test x$enable_blocking = xno ; then $as_echo "#define STARPU_NON_BLOCKING_DRIVERS 1" >>confdefs.h fi ############################################################################### # # # MIC settings # # # ############################################################################### # ignore these otions, only meant for mic-configure, but also passed here. # Check whether --enable-native-mic was given. if test "${enable_native_mic+set}" = set; then : enableval=$enable_native_mic; fi # Check whether --with-compiler was given. if test "${with_compiler+set}" = set; then : withval=$with_compiler; fi # Check whether --with-mic-param was given. if test "${with_mic_param+set}" = set; then : withval=$with_mic_param; fi # Check whether --with-host-param was given. if test "${with_host_param+set}" = set; then : withval=$with_host_param; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking maximum number of MIC devices" >&5 $as_echo_n "checking maximum number of MIC devices... " >&6; } # Check whether --enable-maxmicdev was given. if test "${enable_maxmicdev+set}" = set; then : enableval=$enable_maxmicdev; nmaxmicdev=$enableval else nmaxmicdev=4 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nmaxmicdev" >&5 $as_echo "$nmaxmicdev" >&6; } cat >>confdefs.h <<_ACEOF #define STARPU_MAXMICDEVS $nmaxmicdev _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking maximum number of MIC threads" >&5 $as_echo_n "checking maximum number of MIC threads... " >&6; } # Check whether --enable-maxmicthreads was given. if test "${enable_maxmicthreads+set}" = set; then : enableval=$enable_maxmicthreads; nmaxmicthreads=$enableval else nmaxmicthreads=120 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nmaxmicthread" >&5 $as_echo "$nmaxmicthread" >&6; } cat >>confdefs.h <<_ACEOF #define STARPU_MAXMICCORES $nmaxmicthreads _ACEOF # Check whether --with-coi-dir was given. if test "${with_coi_dir+set}" = set; then : withval=$with_coi_dir; coi_dir="$withval" else coi_dir=no fi # Check whether --with-coi-include-dir was given. if test "${with_coi_include_dir+set}" = set; then : withval=$with_coi_include_dir; coi_include_dir="$withval" else coi_include_dir=no fi # Check whether --with-coi-lib-dir was given. if test "${with_coi_lib_dir+set}" = set; then : withval=$with_coi_lib_dir; coi_lib_dir="$withval" else coi_lib_dir=no fi # Check whether --with-scif-dir was given. if test "${with_scif_dir+set}" = set; then : withval=$with_scif_dir; scif_dir="$withval" else scif_dir=no fi # Check whether --with-scif-include-dir was given. if test "${with_scif_include_dir+set}" = set; then : withval=$with_scif_include_dir; scif_include_dir="$withval" else scif_include_dir=no fi # Check whether --with-scif-lib-dir was given. if test "${with_scif_lib_dir+set}" = set; then : withval=$with_scif_lib_dir; scif_lib_dir="$withval" else scif_lib_dir=no fi if test x$enable_mic = xyes ; then __scif_dir=$scif_dir __scif_include_dir=$scif_include_dir __scif_lib_dir=$scif_lib_dir if test "$__scif_dir" != "no" -a "$__scif_dir" != "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether MIC's SCIF runtime is available in $__scif_dir" >&5 $as_echo_n "checking whether MIC's SCIF runtime is available in $__scif_dir... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether MIC's SCIF runtime is available" >&5 $as_echo_n "checking whether MIC's SCIF runtime is available... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } if test "$__scif_include_dir" = "no" -a "$__scif_dir" != "no" ; then __scif_include_dir="${__scif_dir}/include" fi if test "$__scif_lib_dir" = "no" -a "$__scif_dir" != "no" ; then __scif_lib_dir="${__scif_dir}/lib" fi SAVED_CPPFLAGS="$CPPFLAGS" SAVED_LDFLAGS="$LDFLAGS" if test "$__scif_include_dir" != "no" ; then CPPFLAGS="${CPPFLAGS} -I$__scif_include_dir" fi if test "$__scif_lib_dir" != "no" ; then LDFLAGS="${LDFLAGS} -L$__scif_lib_dir" fi # AC_CHECK_HEADER([source/SCIFEngine_source.h],[have_valid_scif=yes],[have_valid_scif=no]) # if test "$have_valid_scif" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lscif" >&5 $as_echo_n "checking for main in -lscif... " >&6; } if ${ac_cv_lib_scif_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lscif $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_scif_main=yes else ac_cv_lib_scif_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_scif_main" >&5 $as_echo "$ac_cv_lib_scif_main" >&6; } if test "x$ac_cv_lib_scif_main" = xyes; then : have_valid_scif=yes else have_valid_scif=no fi ac_cv_lib_scif=ac_cv_lib_scif_main if test "$have_valid_scif" = "no" ; then if test "$scif_lib_dir" = "no" -a "$__scif_dir" != "no" ; then # ${__scif_dir}/lib didn't work, let's try with lib64 __scif_lib_dir="$__scif_dir/lib64" LDFLAGS="${SAVED_LDFLAGS} -L$__scif_lib_dir" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lscif" >&5 $as_echo_n "checking for main in -lscif... " >&6; } if ${ac_cv_lib_scif_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lscif $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_scif_main=yes else ac_cv_lib_scif_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_scif_main" >&5 $as_echo "$ac_cv_lib_scif_main" >&6; } if test "x$ac_cv_lib_scif_main" = xyes; then : have_valid_scif=yes else have_valid_scif=no fi ac_cv_lib_scif=ac_cv_lib_scif_main fi fi # fi if test "$have_valid_scif" = "yes" -a "$__scif_include_dir" != "no"; then STARPU_SCIF_CPPFLAGS="-I$__scif_include_dir" fi if test "$have_valid_scif" = "yes" ; then if test "$__scif_lib_dir" != "no"; then STARPU_SCIF_LDFLAGS="-L$__scif_lib_dir" fi STARPU_SCIF_LDFLAGS="${STARPU_SCIF_LDFLAGS} -lscif" fi CPPFLAGS="${SAVED_CPPFLAGS}" LDFLAGS="${SAVED_LDFLAGS}" if test "$have_valid_scif" = "no" ; then as_fn_error $? "cannot find MIC's SCIF runtime" "$LINENO" 5 fi case $host_vendor in *1om) # We are cross-compiling. # Let's have a look for the device runtime which lib has a different name __coi_dir=$coi_dir __coi_include_dir=$coi_include_dir __coi_lib_dir=$coi_lib_dir if test "$__coi_dir" != "no" -a "$__coi_dir" != "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether MIC's COI runtime is available in $__coi_dir" >&5 $as_echo_n "checking whether MIC's COI runtime is available in $__coi_dir... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether MIC's COI runtime is available" >&5 $as_echo_n "checking whether MIC's COI runtime is available... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } if test "$__coi_include_dir" = "no" -a "$__coi_dir" != "no" ; then __coi_include_dir="${__coi_dir}/include" fi if test "$__coi_lib_dir" = "no" -a "$__coi_dir" != "no" ; then __coi_lib_dir="${__coi_dir}/lib" fi SAVED_CPPFLAGS="$CPPFLAGS" SAVED_LDFLAGS="$LDFLAGS" if test "$__coi_include_dir" != "no" ; then CPPFLAGS="${CPPFLAGS} -I$__coi_include_dir" fi if test "$__coi_lib_dir" != "no" ; then LDFLAGS="${LDFLAGS} -L$__coi_lib_dir ${STARPU_SCIF_LDFLAGS}" fi ac_fn_c_check_header_mongrel "$LINENO" "source/COIEngine_source.h" "ac_cv_header_source_COIEngine_source_h" "$ac_includes_default" if test "x$ac_cv_header_source_COIEngine_source_h" = xyes; then : have_valid_coi=yes else have_valid_coi=no fi if test "$have_valid_coi" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcoi_device" >&5 $as_echo_n "checking for main in -lcoi_device... " >&6; } if ${ac_cv_lib_coi_device_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcoi_device $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_coi_device_main=yes else ac_cv_lib_coi_device_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_coi_device_main" >&5 $as_echo "$ac_cv_lib_coi_device_main" >&6; } if test "x$ac_cv_lib_coi_device_main" = xyes; then : have_valid_coi=yes else have_valid_coi=no fi ac_cv_lib_coi_device=ac_cv_lib_coi_device_main if test "$have_valid_coi" = "no" ; then if test "$coi_lib_dir" = "no" -a "$__coi_dir" != "no" ; then # ${__coi_dir}/lib didn't work, let's try with lib64 __coi_lib_dir="$__coi_dir/lib64" LDFLAGS="${SAVED_LDFLAGS} -L$__coi_lib_dir" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcoi_device" >&5 $as_echo_n "checking for main in -lcoi_device... " >&6; } if ${ac_cv_lib_coi_device_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcoi_device $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_coi_device_main=yes else ac_cv_lib_coi_device_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_coi_device_main" >&5 $as_echo "$ac_cv_lib_coi_device_main" >&6; } if test "x$ac_cv_lib_coi_device_main" = xyes; then : have_valid_coi=yes else have_valid_coi=no fi ac_cv_lib_coi_device=ac_cv_lib_coi_device_main fi fi fi if test "$have_valid_coi" = "yes" -a "$__coi_include_dir" != "no"; then STARPU_COI_CPPFLAGS="-I$__coi_include_dir" fi if test "$have_valid_coi" = "yes" ; then if test "$__coi_lib_dir" != "no"; then STARPU_COI_LDFLAGS="-L$__coi_lib_dir" fi STARPU_COI_LDFLAGS="${STARPU_COI_LDFLAGS} -lcoi_device" fi CPPFLAGS="${SAVED_CPPFLAGS}" LDFLAGS="${SAVED_LDFLAGS}" ;; *) __coi_dir=$coi_dir __coi_include_dir=$coi_include_dir __coi_lib_dir=$coi_lib_dir if test "$__coi_dir" != "no" -a "$__coi_dir" != "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether MIC's COI runtime is available in $__coi_dir" >&5 $as_echo_n "checking whether MIC's COI runtime is available in $__coi_dir... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether MIC's COI runtime is available" >&5 $as_echo_n "checking whether MIC's COI runtime is available... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } if test "$__coi_include_dir" = "no" -a "$__coi_dir" != "no" ; then __coi_include_dir="${__coi_dir}/include" fi if test "$__coi_lib_dir" = "no" -a "$__coi_dir" != "no" ; then __coi_lib_dir="${__coi_dir}/lib" fi SAVED_CPPFLAGS="$CPPFLAGS" SAVED_LDFLAGS="$LDFLAGS" if test "$__coi_include_dir" != "no" ; then CPPFLAGS="${CPPFLAGS} -I$__coi_include_dir" fi if test "$__coi_lib_dir" != "no" ; then LDFLAGS="${LDFLAGS} -L$__coi_lib_dir ${STARPU_SCIF_LDFLAGS}" fi ac_fn_c_check_header_mongrel "$LINENO" "source/COIEngine_source.h" "ac_cv_header_source_COIEngine_source_h" "$ac_includes_default" if test "x$ac_cv_header_source_COIEngine_source_h" = xyes; then : have_valid_coi=yes else have_valid_coi=no fi if test "$have_valid_coi" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcoi_host" >&5 $as_echo_n "checking for main in -lcoi_host... " >&6; } if ${ac_cv_lib_coi_host_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcoi_host $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_coi_host_main=yes else ac_cv_lib_coi_host_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_coi_host_main" >&5 $as_echo "$ac_cv_lib_coi_host_main" >&6; } if test "x$ac_cv_lib_coi_host_main" = xyes; then : have_valid_coi=yes else have_valid_coi=no fi ac_cv_lib_coi_host=ac_cv_lib_coi_host_main if test "$have_valid_coi" = "no" ; then if test "$coi_lib_dir" = "no" -a "$__coi_dir" != "no" ; then # ${__coi_dir}/lib didn't work, let's try with lib64 __coi_lib_dir="$__coi_dir/lib64" LDFLAGS="${SAVED_LDFLAGS} -L$__coi_lib_dir" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcoi_host" >&5 $as_echo_n "checking for main in -lcoi_host... " >&6; } if ${ac_cv_lib_coi_host_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcoi_host $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_coi_host_main=yes else ac_cv_lib_coi_host_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_coi_host_main" >&5 $as_echo "$ac_cv_lib_coi_host_main" >&6; } if test "x$ac_cv_lib_coi_host_main" = xyes; then : have_valid_coi=yes else have_valid_coi=no fi ac_cv_lib_coi_host=ac_cv_lib_coi_host_main fi fi fi if test "$have_valid_coi" = "yes" -a "$__coi_include_dir" != "no"; then STARPU_COI_CPPFLAGS="-I$__coi_include_dir" fi if test "$have_valid_coi" = "yes" ; then if test "$__coi_lib_dir" != "no"; then STARPU_COI_LDFLAGS="-L$__coi_lib_dir" fi STARPU_COI_LDFLAGS="${STARPU_COI_LDFLAGS} -lcoi_host" fi CPPFLAGS="${SAVED_CPPFLAGS}" LDFLAGS="${SAVED_LDFLAGS}" ;; esac if test "$have_valid_coi" = "no" ; then as_fn_error $? "cannot find MIC's COI runtime" "$LINENO" 5 fi fi ############################################################################### # # # SCC settings # # # ############################################################################### # Check whether --enable-rcce was given. if test "${enable_rcce+set}" = set; then : enableval=$enable_rcce; else enable_rcce=maybe fi nmaxsccdev=47 cat >>confdefs.h <<_ACEOF #define STARPU_MAXSCCDEVS $nmaxsccdev _ACEOF # Check whether --with-rcce-dir was given. if test "${with_rcce_dir+set}" = set; then : withval=$with_rcce_dir; rcce_dir="$withval" enable_rcce=yes else rcce_dir=no fi # Check whether --with-rcce-include-dir was given. if test "${with_rcce_include_dir+set}" = set; then : withval=$with_rcce_include_dir; rcce_include_dir="$withval" enable_rcce=yes else rcce_include_dir=no fi # Check whether --with-rcce-lib-dir was given. if test "${with_rcce_lib_dir+set}" = set; then : withval=$with_rcce_lib_dir; rcce_lib_dir="$withval" enable_rcce=yes else rcce_lib_dir=no fi if test x$enable_rcce = xyes -o x$enable_rcce = xmaybe ; then have_valid_rcce=yes SAVED_LDFLAGS="${LDFLAGS}" SAVED_CPPFLAGS="${CPPFLAGS}" SAVED_LIBS="${LIBS}" if test x$rcce_include_dir != xno ; then STARPU_RCCE_CPPFLAGS="-I${rcce_include_dir}" elif test x$rcce_dir != xno ; then STARPU_RCCE_CPPFLAGS="-I${rcce_dir}/include" fi CPPFLAGS="${CPPFLAGS} ${STARPU_RCCE_CPPFLAGS}" ac_fn_c_check_header_mongrel "$LINENO" "RCCE.h" "ac_cv_header_RCCE_h" "$ac_includes_default" if test "x$ac_cv_header_RCCE_h" = xyes; then : else have_valid_rcce=no fi if test x$rcce_lib_dir != xno ; then STARPU_RCCE_LDFLAGS="-L${rcce_lib_dir}" elif test x$rcce_dir != xno ; then STARPU_RCCE_LDFLAGS="-L${rcce_lib}/lib" fi LDFLAGS="${LDFLAGS} ${STARPU_RCCE_LDFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for RCCE_init in -lRCCE_bigflags_nongory_nopwrmgmt" >&5 $as_echo_n "checking for RCCE_init in -lRCCE_bigflags_nongory_nopwrmgmt... " >&6; } if ${ac_cv_lib_RCCE_bigflags_nongory_nopwrmgmt_RCCE_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lRCCE_bigflags_nongory_nopwrmgmt $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char RCCE_init (); int main () { return RCCE_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_RCCE_bigflags_nongory_nopwrmgmt_RCCE_init=yes else ac_cv_lib_RCCE_bigflags_nongory_nopwrmgmt_RCCE_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_RCCE_bigflags_nongory_nopwrmgmt_RCCE_init" >&5 $as_echo "$ac_cv_lib_RCCE_bigflags_nongory_nopwrmgmt_RCCE_init" >&6; } if test "x$ac_cv_lib_RCCE_bigflags_nongory_nopwrmgmt_RCCE_init" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBRCCE_BIGFLAGS_NONGORY_NOPWRMGMT 1 _ACEOF LIBS="-lRCCE_bigflags_nongory_nopwrmgmt $LIBS" else have_valid_rcce=no fi # in case RCCE was explicitely required, but is not available, this is an error if test x$enable_rcce = xyes -a x$have_valid_rcce = xno ; then as_fn_error $? "cannot find RCCE library" "$LINENO" 5 fi if test x$have_valid_rcce = xyes ; then STARPU_RCCE_CPPFLAGS="${STARPU_RCCE_CPPFLAGS} -DSCC" STARPU_RCCE_LDFLAGS="${STARPU_RCCE_LDFLAGS} -lRCCE_bigflags_nongory_nopwrmgmt -ldl" $as_echo "#define STARPU_USE_SCC 1" >>confdefs.h fi LDFLAGS="${SAVED_LDFLAGS}" CPPFLAGS="${SAVED_CPPFLAGS}" LIBS="${SAVED_LIBS}" enable_rcce=$have_valid_rcce fi if test x$enable_rcce = xyes; then STARPU_USE_SCC_TRUE= STARPU_USE_SCC_FALSE='#' else STARPU_USE_SCC_TRUE='#' STARPU_USE_SCC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether RCCE should be used" >&5 $as_echo_n "checking whether RCCE should be used... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_rcce" >&5 $as_echo "$enable_rcce" >&6; } ############################################################################### # # # MP Common settings # # # ############################################################################### if test "x$enable_mic" = "xyes" -o "x$enable_mpi" = "xyes" -o "x$enable_rcce" = "xyes"; then STARPU_USE_MP_TRUE= STARPU_USE_MP_FALSE='#' else STARPU_USE_MP_TRUE='#' STARPU_USE_MP_FALSE= fi # Check whether --enable-export-dynamic was given. if test "${enable_export_dynamic+set}" = set; then : enableval=$enable_export_dynamic; fi if test x$enable_mic = xyes -o x$enable_mpi = xyes -o x$enable_rcce = xyes ; then $as_echo "#define STARPU_USE_MP 1" >>confdefs.h if test x$enable_export_dynamic != xno ; then STARPU_EXPORT_DYNAMIC="-rdynamic" fi fi # Computes the maximum number of different kernels a message-passing sink # can lookup for and launch. { $as_echo "$as_me:${as_lineno-$LINENO}: checking Maximum number of message-passing kernels" >&5 $as_echo_n "checking Maximum number of message-passing kernels... " >&6; } # Check whether --enable-maxmpkernels was given. if test "${enable_maxmpkernels+set}" = set; then : enableval=$enable_maxmpkernels; maxmpkernels=$enableval else maxmpkernels=10 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $maxmpkernels" >&5 $as_echo "$maxmpkernels" >&6; } cat >>confdefs.h <<_ACEOF #define STARPU_MAXMPKERNELS $maxmpkernels _ACEOF ############################################################################### ############################################################################### # # # Debug and Performance analysis tools # # # ############################################################################### { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether debug mode should be enabled" >&5 $as_echo_n "checking whether debug mode should be enabled... " >&6; } # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; enable_debug=$enableval else enable_debug=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_debug" >&5 $as_echo "$enable_debug" >&6; } # Check whether --enable-spinlock_check was given. if test "${enable_spinlock_check+set}" = set; then : enableval=$enable_spinlock_check; enable_spinlock_check=$enableval else enable_spinlock_check=no fi # Check whether --enable-fstack-protector-all was given. if test "${enable_fstack_protector_all+set}" = set; then : enableval=$enable_fstack_protector_all; enable_fstack_protector_all=$enableval else enable_fstack_protector_all=yes fi if test x$enable_debug = xyes; then $as_echo "#define STARPU_DEBUG 1" >>confdefs.h CFLAGS="$CFLAGS -O0" CXXFLAGS="$CXXFLAGS -O0" enable_spinlock_check=yes if test x$GCC = xyes; then if test x$starpu_windows != xyes ; then if test x$enable_fstack_protector_all = xyes ; then CFLAGS="$CFLAGS -fstack-protector-all" CXXFLAGS="$CXXFLAGS -fstack-protector-all" fi fi fi else CFLAGS="-O3 $CFLAGS" CXXFLAGS="-O3 $CXXFLAGS" fi if test x$GCC = xyes; then CFLAGS+=" -gdwarf-2" CXXFLAGS+=" -gdwarf-2" LDFLAGS+=" -gdwarf-2" fi CFLAGS+=" -g3 " CXXFLAGS+=" -g3 " LDFLAGS+=" -g3 " if test x$enable_spinlock_check = xyes; then $as_echo "#define STARPU_SPINLOCK_CHECK 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether extra checks should be performed" >&5 $as_echo_n "checking whether extra checks should be performed... " >&6; } # Check whether --enable-fast was given. if test "${enable_fast+set}" = set; then : enableval=$enable_fast; enable_fast=$enableval else enable_fast=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_fast" >&5 $as_echo "$enable_fast" >&6; } if test x$enable_fast = xyes; then $as_echo "#define STARPU_NO_ASSERT 1" >>confdefs.h else if test x$enable_debug != xyes; then if test x$GCC = xyes; then CPPFLAGS="$CPPFLAGS -D_FORTIFY_SOURCE=1" fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether debug messages should be displayed" >&5 $as_echo_n "checking whether debug messages should be displayed... " >&6; } # Check whether --enable-verbose was given. if test "${enable_verbose+set}" = set; then : enableval=$enable_verbose; enable_verbose=$enableval else enable_verbose=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_verbose" >&5 $as_echo "$enable_verbose" >&6; } if test x$enable_verbose = xyes; then $as_echo "#define STARPU_VERBOSE 1" >>confdefs.h fi if test x$enable_verbose = xextra; then $as_echo "#define STARPU_VERBOSE 1" >>confdefs.h $as_echo "#define STARPU_EXTRA_VERBOSE 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether coverage testing should be enabled" >&5 $as_echo_n "checking whether coverage testing should be enabled... " >&6; } # Check whether --enable-coverage was given. if test "${enable_coverage+set}" = set; then : enableval=$enable_coverage; enable_coverage=$enableval else enable_coverage=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_coverage" >&5 $as_echo "$enable_coverage" >&6; } COVERAGE=$enable_coverage if test "x$enable_coverage" = "xyes"; then STARPU_COVERAGE_ENABLED_TRUE= STARPU_COVERAGE_ENABLED_FALSE='#' else STARPU_COVERAGE_ENABLED_TRUE='#' STARPU_COVERAGE_ENABLED_FALSE= fi if test x$enable_coverage = xyes; then CFLAGS="${CFLAGS} --coverage" CXXFLAGS="${CXXFLAGS} --coverage" LDFLAGS="${LDFLAGS} --coverage" LIBS="${LIBS} -lgcov" fi # shall we use FxT to generate trace of the execution ? { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether FxT traces should be generated" >&5 $as_echo_n "checking whether FxT traces should be generated... " >&6; } # Check whether --with-fxt was given. if test "${with_fxt+set}" = set; then : withval=$with_fxt; if test x$withval != xno; then use_fxt=yes if test x$withval = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } use_fxt_from_system=yes else # use specified path # TODO check if the dir is actually containing FxT use_fxt_from_system=no fxtdir=$withval { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes using $fxtdir" >&5 $as_echo "yes using $fxtdir" >&6; } FXTDIR=$fxtdir fi else use_fxt=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else use_fxt=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi STARPU_USE_FXT=$use_fxt if test x$use_fxt = xyes; then STARPU_USE_FXT_TRUE= STARPU_USE_FXT_FALSE='#' else STARPU_USE_FXT_TRUE='#' STARPU_USE_FXT_FALSE= fi if test x$use_fxt = xyes; then $as_echo "#define STARPU_USE_FXT 1" >>confdefs.h $as_echo "#define CONFIG_FUT 1" >>confdefs.h if test x$use_fxt_from_system = xno; then save_PKG_CONFIG_PATH="$PKG_CONFIG_PATH" PKG_CONFIG_PATH="$fxtdir/lib/pkgconfig:$PKG_CONFIG_PATH" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FXT" >&5 $as_echo_n "checking for FXT... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$FXT_CFLAGS"; then pkg_cv_FXT_CFLAGS="$FXT_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fxt\""; } >&5 ($PKG_CONFIG --exists --print-errors "fxt") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FXT_CFLAGS=`$PKG_CONFIG --cflags "fxt" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$FXT_LIBS"; then pkg_cv_FXT_LIBS="$FXT_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fxt\""; } >&5 ($PKG_CONFIG --exists --print-errors "fxt") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FXT_LIBS=`$PKG_CONFIG --libs "fxt" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FXT_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "fxt"` else FXT_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "fxt"` fi # Put the nasty error message in config.log where it belongs echo "$FXT_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Old FxT without fxt.pc file, hoping link will succeed" >&5 $as_echo "$as_me: WARNING: Old FxT without fxt.pc file, hoping link will succeed" >&2;} FXT_CFLAGS="-I$fxtdir/include/ " FXT_LDFLAGS="-L$fxtdir/lib/" FXT_LIBS="-lfxt" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Old FxT without fxt.pc file, hoping link will succeed" >&5 $as_echo "$as_me: WARNING: Old FxT without fxt.pc file, hoping link will succeed" >&2;} FXT_CFLAGS="-I$fxtdir/include/ " FXT_LDFLAGS="-L$fxtdir/lib/" FXT_LIBS="-lfxt" else FXT_CFLAGS=$pkg_cv_FXT_CFLAGS FXT_LIBS=$pkg_cv_FXT_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi PKG_CONFIG_PATH="$save_PKG_CONFIG_PATH" else pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FXT" >&5 $as_echo_n "checking for FXT... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$FXT_CFLAGS"; then pkg_cv_FXT_CFLAGS="$FXT_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fxt\""; } >&5 ($PKG_CONFIG --exists --print-errors "fxt") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FXT_CFLAGS=`$PKG_CONFIG --cflags "fxt" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$FXT_LIBS"; then pkg_cv_FXT_LIBS="$FXT_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fxt\""; } >&5 ($PKG_CONFIG --exists --print-errors "fxt") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FXT_LIBS=`$PKG_CONFIG --libs "fxt" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FXT_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "fxt"` else FXT_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "fxt"` fi # Put the nasty error message in config.log where it belongs echo "$FXT_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (fxt) were not met: $FXT_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables FXT_CFLAGS and FXT_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables FXT_CFLAGS and FXT_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else FXT_CFLAGS=$pkg_cv_FXT_CFLAGS FXT_LIBS=$pkg_cv_FXT_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi fi save_LIBS="$LIBS" LIBS="$LIBS $FXT_LIBS" save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $FXT_LDFLAGS" for ac_func in enable_fut_flush do : ac_fn_c_check_func "$LINENO" "enable_fut_flush" "ac_cv_func_enable_fut_flush" if test "x$ac_cv_func_enable_fut_flush" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_ENABLE_FUT_FLUSH 1 _ACEOF fi done for ac_func in fut_set_filename do : ac_fn_c_check_func "$LINENO" "fut_set_filename" "ac_cv_func_fut_set_filename" if test "x$ac_cv_func_fut_set_filename" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FUT_SET_FILENAME 1 _ACEOF fi done LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $FXT_CFLAGS" ac_fn_c_check_decl "$LINENO" "enable_fut_flush" "ac_cv_have_decl_enable_fut_flush" "#include " if test "x$ac_cv_have_decl_enable_fut_flush" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ENABLE_FUT_FLUSH $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "fut_set_filename" "ac_cv_have_decl_fut_set_filename" "#include " if test "x$ac_cv_have_decl_fut_set_filename" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FUT_SET_FILENAME $ac_have_decl _ACEOF CFLAGS="$save_CFLAGS" if test x$enable_simgrid = xyes -a x$enable_shared = xno ; then # simgrid's SMPI needs fxt to be linked in statically for # variable privatization to work FXT_LIBS="$(pkg-config --variable=libdir fxt)/libfxt.a -Wl,--as-needed $(pkg-config --libs --static fxt) -Wl,--no-as-needed" fi ########################################## # Poti is a library to generate paje trace files ########################################## pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for POTI" >&5 $as_echo_n "checking for POTI... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$POTI_CFLAGS"; then pkg_cv_POTI_CFLAGS="$POTI_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"poti\""; } >&5 ($PKG_CONFIG --exists --print-errors "poti") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_POTI_CFLAGS=`$PKG_CONFIG --cflags "poti" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$POTI_LIBS"; then pkg_cv_POTI_LIBS="$POTI_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"poti\""; } >&5 ($PKG_CONFIG --exists --print-errors "poti") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_POTI_LIBS=`$PKG_CONFIG --libs "poti" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then POTI_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "poti"` else POTI_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "poti"` fi # Put the nasty error message in config.log where it belongs echo "$POTI_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : elif test $pkg_failed = untried; then : else POTI_CFLAGS=$pkg_cv_POTI_CFLAGS POTI_LIBS=$pkg_cv_POTI_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define STARPU_HAVE_POTI 1" >>confdefs.h save_LIBS="$LIBS" LIBS="$LIBS $POTI_LIBS" for ac_func in poti_init_custom do : ac_fn_c_check_func "$LINENO" "poti_init_custom" "ac_cv_func_poti_init_custom" if test "x$ac_cv_func_poti_init_custom" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_POTI_INIT_CUSTOM 1 _ACEOF fi done LIBS="$save_LIBS" fi FXT_CFLAGS="$FXT_CFLAGS $POTI_CFLAGS" FXT_LIBS="$FXT_LIBS $POTI_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether additional locking systems FxT traces should be enabled" >&5 $as_echo_n "checking whether additional locking systems FxT traces should be enabled... " >&6; } # Check whether --enable-fxt-lock was given. if test "${enable_fxt_lock+set}" = set; then : enableval=$enable_fxt_lock; enable_fxt_lock=$enableval else enable_fxt_lock=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_fxt_lock" >&5 $as_echo "$enable_fxt_lock" >&6; } if test x$enable_fxt_lock = xyes; then $as_echo "#define STARPU_FXT_LOCK_TRACES 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether performance debugging should be enabled" >&5 $as_echo_n "checking whether performance debugging should be enabled... " >&6; } # Check whether --enable-perf-debug was given. if test "${enable_perf_debug+set}" = set; then : enableval=$enable_perf_debug; enable_perf_debug=$enableval else enable_perf_debug=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_perf_debug" >&5 $as_echo "$enable_perf_debug" >&6; } STARPU_PERF_DEBUG=$enable_perf_debug if test x$enable_perf_debug = xyes; then $as_echo "#define STARPU_PERF_DEBUG 1" >>confdefs.h CPPFLAGS="${CPPFLAGS} -pg " LDFLAGS="${LDFLAGS} -pg " fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether performance model debugging should be enabled" >&5 $as_echo_n "checking whether performance model debugging should be enabled... " >&6; } # Check whether --enable-model-debug was given. if test "${enable_model_debug+set}" = set; then : enableval=$enable_model_debug; enable_model_debug=$enableval else enable_model_debug=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_model_debug" >&5 $as_echo "$enable_model_debug" >&6; } if test x$enable_model_debug = xyes; then $as_echo "#define STARPU_MODEL_DEBUG 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether statistics should be generated" >&5 $as_echo_n "checking whether statistics should be generated... " >&6; } # Check whether --enable-stats was given. if test "${enable_stats+set}" = set; then : enableval=$enable_stats; enable_stats=$enableval else enable_stats=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_stats" >&5 $as_echo "$enable_stats" >&6; } STATS=$enable_stats STARPU_ENABLE_STATS=$enable_stats if test x$enable_stats = xyes; then $as_echo "#define STARPU_ENABLE_STATS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether memory stats should be displayed" >&5 $as_echo_n "checking whether memory stats should be displayed... " >&6; } # Check whether --enable-memory-stats was given. if test "${enable_memory_stats+set}" = set; then : enableval=$enable_memory_stats; enable_memory_stats=$enableval else enable_memory_stats=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_memory_stats" >&5 $as_echo "$enable_memory_stats" >&6; } if test x$enable_memory_stats = xyes; then $as_echo "#define STARPU_MEMORY_STATS 1" >>confdefs.h fi # Check whether --enable-glpk was given. if test "${enable_glpk+set}" = set; then : enableval=$enable_glpk; enable_glpk=$enableval else enable_glpk=yes fi if test x$enable_glpk = xyes; then for ac_header in glpk.h do : ac_fn_c_check_header_mongrel "$LINENO" "glpk.h" "ac_cv_header_glpk_h" "$ac_includes_default" if test "x$ac_cv_header_glpk_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GLPK_H 1 _ACEOF $as_echo "#define STARPU_HAVE_GLPK_H 1" >>confdefs.h fi done _LIBS_SAV="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lglpk" >&5 $as_echo_n "checking for main in -lglpk... " >&6; } if ${ac_cv_lib_glpk_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lglpk $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_glpk_main=yes else ac_cv_lib_glpk_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_glpk_main" >&5 $as_echo "$ac_cv_lib_glpk_main" >&6; } if test "x$ac_cv_lib_glpk_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBGLPK 1 _ACEOF LIBS="-lglpk $LIBS" fi STARPU_GLPK_LDFLAGS="$STARPU_GLPK_LDFLAGS $LIBS" LIBS=$_LIBS_SAV fi # Check whether --with-ayudame1-include-dir was given. if test "${with_ayudame1_include_dir+set}" = set; then : withval=$with_ayudame1_include_dir; ayudame1_include_dir="$withval" if test -n "$ayudame1_include_dir"; then CPPFLAGS="-I$ayudame1_include_dir $CPPFLAGS" fi else ayudame1_include_dir=no fi # Check whether --with-ayudame2-include-dir was given. if test "${with_ayudame2_include_dir+set}" = set; then : withval=$with_ayudame2_include_dir; ayudame2_include_dir="$withval" if test -n "$ayudame2_include_dir"; then CPPFLAGS="-I$ayudame2_include_dir $CPPFLAGS" fi else ayudame2_include_dir=no fi # Ayudame 1 header is capitalized for ac_header in Ayudame.h do : ac_fn_c_check_header_mongrel "$LINENO" "Ayudame.h" "ac_cv_header_Ayudame_h" "$ac_includes_default" if test "x$ac_cv_header_Ayudame_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_AYUDAME_H 1 _ACEOF fi done # Check whether --enable-ayudame1 was given. if test "${enable_ayudame1+set}" = set; then : enableval=$enable_ayudame1; enable_ayudame1=$enableval else enable_ayudame1=yes fi # Ayudame 2 header is lowercase for ac_header in ayudame.h do : ac_fn_c_check_header_mongrel "$LINENO" "ayudame.h" "ac_cv_header_ayudame_h" "$ac_includes_default" if test "x$ac_cv_header_ayudame_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_AYUDAME_H 1 _ACEOF fi done # Check whether --enable-ayudame2 was given. if test "${enable_ayudame2+set}" = set; then : enableval=$enable_ayudame2; enable_ayudame2=$enableval else enable_ayudame2=yes fi if test x$enable_ayudame1 = xyes -a x$ac_cv_header_Ayudame_h = xyes; then $as_echo "#define STARPU_USE_AYUDAME1 1" >>confdefs.h ayu_msg="yes, use version 1" else if test x$enable_ayudame2 = xyes -a x$ac_cv_header_ayudame_h = xyes; then $as_echo "#define STARPU_USE_AYUDAME2 1" >>confdefs.h ayu_msg="yes, use version 2" else ayu_msg="no" fi fi if test "x$enable_ayudame1" = "xyes"; then STARPU_USE_AYUDAME1_TRUE= STARPU_USE_AYUDAME1_FALSE='#' else STARPU_USE_AYUDAME1_TRUE='#' STARPU_USE_AYUDAME1_FALSE= fi if test "x$enable_ayudame2" = "xyes"; then STARPU_USE_AYUDAME2_TRUE= STARPU_USE_AYUDAME2_FALSE='#' else STARPU_USE_AYUDAME2_TRUE='#' STARPU_USE_AYUDAME2_FALSE= fi ############################################################################### # # # Miscellaneous options for StarPU # # # ############################################################################### { $as_echo "$as_me:${as_lineno-$LINENO}: checking how many buffers can be manipulated per task" >&5 $as_echo_n "checking how many buffers can be manipulated per task... " >&6; } # Check whether --enable-maxbuffers was given. if test "${enable_maxbuffers+set}" = set; then : enableval=$enable_maxbuffers; nmaxbuffers=$enableval else nmaxbuffers=8 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nmaxbuffers" >&5 $as_echo "$nmaxbuffers" >&6; } cat >>confdefs.h <<_ACEOF #define STARPU_NMAXBUFS $nmaxbuffers _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking maximum number of nodes to use" >&5 $as_echo_n "checking maximum number of nodes to use... " >&6; } # Check whether --enable-maxnodes was given. if test "${enable_maxnodes+set}" = set; then : enableval=$enable_maxnodes; maxnodes=$enableval else maxnodes=0 fi if test x$maxnodes = x0 ; then if test x$enable_simgrid = xyes ; then # We need the room for the virtual CUDA/OpenCL devices nodes=`expr 4 + $nmaxcudadev + $nmaxopencldev + $nmaxmicdev + 1` if test $nodes -gt 32 then nodes=32 fi else # We have one memory node shared by all CPU workers, one node per GPU # and per MIC device # we add nodes to use 3 memory disks nodes=4 if test x$enable_cuda = xyes ; then # we could have used nmaxcudadev + 1, but this would certainly give an # odd number. nodes=`expr $nodes + $nmaxcudadev` fi if test x$enable_opencl = xyes ; then # we could have used nmaxcudadev + 1, but this would certainly give an # odd number. nodes=`expr $nodes + $nmaxopencldev` fi if test x$enable_mic = xyes ; then nodes=`expr $nodes + $nmaxmicdev` fi if test x$enable_rcce = xyes ; then # Only 1 memory node for the shared memory. nodes=`expr $nodes + 1` fi fi # set maxnodes to the next power of 2 greater than nodes maxnodes=1 while test "$maxnodes" -lt "$nodes" do maxnodes=`expr $maxnodes \* 2` done fi if test $maxnodes -gt 32 ; then as_fn_error $? "selected number of nodes ($maxnodes) can not be greater than 32" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking maximum number of memory nodes" >&5 $as_echo_n "checking maximum number of memory nodes... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $maxnodes" >&5 $as_echo "$maxnodes" >&6; } cat >>confdefs.h <<_ACEOF #define STARPU_MAXNODES $maxnodes _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether allocation cache should be used" >&5 $as_echo_n "checking whether allocation cache should be used... " >&6; } # Check whether --enable-allocation-cache was given. if test "${enable_allocation_cache+set}" = set; then : enableval=$enable_allocation_cache; enable_allocation_cache=$enableval else enable_allocation_cache=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_allocation_cache" >&5 $as_echo "$enable_allocation_cache" >&6; } if test x$enable_allocation_cache = xyes; then $as_echo "#define STARPU_USE_ALLOCATION_CACHE 1" >>confdefs.h fi # Check whether --with-perf-model-dir was given. if test "${with_perf_model_dir+set}" = set; then : withval=$with_perf_model_dir; if test x$withval = xno; then as_fn_error $? "--without-perf-model-dir is not a valid option" "$LINENO" 5 fi perf_model_dir="$withval" have_explicit_perf_model_dir=yes cat >>confdefs.h <<_ACEOF #define STARPU_PERF_MODEL_DIR "$perf_model_dir" _ACEOF else # by default, we put the performance models in # $HOME/.starpu/sampling/ have_explicit_perf_model_dir=no perf_model_dir="\$HOME/.starpu/sampling/" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking using explicit performance model location" >&5 $as_echo_n "checking using explicit performance model location... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_explicit_perf_model_dir" >&5 $as_echo "$have_explicit_perf_model_dir" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking performance models location" >&5 $as_echo_n "checking performance models location... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $perf_model_dir" >&5 $as_echo "$perf_model_dir" >&6; } # On many multicore CPUs, clock cycles are not synchronized { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt" >&5 $as_echo_n "checking for clock_gettime in -lrt... " >&6; } if ${ac_cv_lib_rt_clock_gettime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lrt $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char clock_gettime (); int main () { return clock_gettime (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_rt_clock_gettime=yes else ac_cv_lib_rt_clock_gettime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_gettime" >&5 $as_echo "$ac_cv_lib_rt_clock_gettime" >&6; } if test "x$ac_cv_lib_rt_clock_gettime" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBRT 1 _ACEOF LIBS="-lrt $LIBS" fi for ac_func in clock_gettime do : ac_fn_c_check_func "$LINENO" "clock_gettime" "ac_cv_func_clock_gettime" if test "x$ac_cv_func_clock_gettime" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_CLOCK_GETTIME 1 _ACEOF fi done # Compute the maximum number of workers (we round it to 16 for alignment # purposes). if test x$enable_simgrid != xyes; then if test x$enable_cpu != xyes; then maxcpus=0 fi if test x$enable_cuda != xyes; then nmaxcudadev=0 fi if test x$enable_opencl != xyes; then nmaxopencldev=0 fi if test x$enable_mic != xyes; then nmaxmicthreads=0 fi if test x$enable_rcce != xyes; then nmaxsccdev=0 fi fi nmaxworkers=`expr 16 \* \( \( $maxcpus + $nmaxcudadev + $nmaxopencldev + $nmaxmicthreads + $nmaxsccdev + 15 \) / 16 \) ` { $as_echo "$as_me:${as_lineno-$LINENO}: checking Maximum number of workers" >&5 $as_echo_n "checking Maximum number of workers... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nmaxworkers" >&5 $as_echo "$nmaxworkers" >&6; } cat >>confdefs.h <<_ACEOF #define STARPU_NMAXWORKERS $nmaxworkers _ACEOF # Computes the maximun number of combined worker nmaxcombinedworkers=`expr $maxcpus + $nmaxmicthreads` { $as_echo "$as_me:${as_lineno-$LINENO}: checking Maximum number of workers combinations" >&5 $as_echo_n "checking Maximum number of workers combinations... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nmaxcombinedworkers" >&5 $as_echo "$nmaxcombinedworkers" >&6; } cat >>confdefs.h <<_ACEOF #define STARPU_NMAX_COMBINEDWORKERS $nmaxcombinedworkers _ACEOF # Computes the maximum number of implementations per arch { $as_echo "$as_me:${as_lineno-$LINENO}: checking maximum number of implementations" >&5 $as_echo_n "checking maximum number of implementations... " >&6; } # Check whether --enable-maximplementations was given. if test "${enable_maximplementations+set}" = set; then : enableval=$enable_maximplementations; maximplementations=$enableval else maximplementations=4 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $maximplementations" >&5 $as_echo "$maximplementations" >&6; } cat >>confdefs.h <<_ACEOF #define STARPU_MAXIMPLEMENTATIONS $maximplementations _ACEOF # Enable LevelDB support if requested and the lib is found # Check whether --enable-leveldb was given. if test "${enable_leveldb+set}" = set; then : enableval=$enable_leveldb; enable_leveldb=$enableval else enable_leveldb=no fi if test x$enable_leveldb = xyes; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu for ac_header in leveldb/db.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "leveldb/db.h" "ac_cv_header_leveldb_db_h" "$ac_includes_default" if test "x$ac_cv_header_leveldb_db_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LEVELDB_DB_H 1 _ACEOF $as_echo "#define STARPU_HAVE_LEVELDB 1" >>confdefs.h fi done _LIBS_SAV="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lleveldb" >&5 $as_echo_n "checking for main in -lleveldb... " >&6; } if ${ac_cv_lib_leveldb_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lleveldb $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_leveldb_main=yes else ac_cv_lib_leveldb_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_leveldb_main" >&5 $as_echo "$ac_cv_lib_leveldb_main" >&6; } if test "x$ac_cv_lib_leveldb_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBLEVELDB 1 _ACEOF LIBS="-lleveldb $LIBS" fi STARPU_LEVELDB_LDFLAGS="$STARPU_LEVELDB_LDFLAGS $LIBS" LIBS=$_LIBS_SAV ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi if test "x$enable_leveldb" = "xyes" -a "x$ac_cv_lib_leveldb_main" = "xyes"; then STARPU_HAVE_LEVELDB_TRUE= STARPU_HAVE_LEVELDB_FALSE='#' else STARPU_HAVE_LEVELDB_TRUE='#' STARPU_HAVE_LEVELDB_FALSE= fi # Defines the calibration heuristic for the history-based calibration of StarPU { $as_echo "$as_me:${as_lineno-$LINENO}: checking calibration heuristic of history-based StarPU calibrator" >&5 $as_echo_n "checking calibration heuristic of history-based StarPU calibrator... " >&6; } # Check whether --enable-calibration-heuristic was given. if test "${enable_calibration_heuristic+set}" = set; then : enableval=$enable_calibration_heuristic; calibration_heuristic=$enableval else calibration_heuristic=50 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $calibration_heuristic" >&5 $as_echo "$calibration_heuristic" >&6; } cat >>confdefs.h <<_ACEOF #define STARPU_HISTORYMAXERROR $calibration_heuristic _ACEOF ############################################################################### # # # MPI # # # ############################################################################### # Check whether --with-mpicc was given. if test "${with_mpicc+set}" = set; then : withval=$with_mpicc; if test x$withval = xyes; then as_fn_error $? "--with-mpicc must be given a pathname" "$LINENO" 5 else mpicc_path=$withval fi else if test x$enable_simgrid = xyes ; then DEFAULT_MPICC=smpicc else DEFAULT_MPICC=mpicc fi # nothing was specified: default value is used # Extract the first word of "$DEFAULT_MPICC", so it can be a program name with args. set dummy $DEFAULT_MPICC; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_mpicc_path+:} false; then : $as_echo_n "(cached) " >&6 else case $mpicc_path in [\\/]* | ?:[\\/]*) ac_cv_path_mpicc_path="$mpicc_path" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$simgrid_dir/bin:$PATH" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_mpicc_path="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_mpicc_path" && ac_cv_path_mpicc_path="no" ;; esac fi mpicc_path=$ac_cv_path_mpicc_path if test -n "$mpicc_path"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mpicc_path" >&5 $as_echo "$mpicc_path" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # We test if the MPICC compiler exists if test ! -x $mpicc_path; then #MPICC does not exists or is not executable { $as_echo "$as_me:${as_lineno-$LINENO}: result: The mpicc compiler '$mpicc_path' does not have the execute permission" >&5 $as_echo "The mpicc compiler '$mpicc_path' does not have the execute permission" >&6; } use_mpi=no else use_mpi=yes if test x$enable_simgrid = xyes ; then # Check whether --with-smpirun was given. if test "${with_smpirun+set}" = set; then : withval=$with_smpirun; if test x$withval = xyes; then as_fn_error $? "--with-smpirun must be given a pathname" "$LINENO" 5 else smpirun_path=$withval fi else # nothing was specified: default value is used # Extract the first word of "smpirun", so it can be a program name with args. set dummy smpirun; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_smpirun_path+:} false; then : $as_echo_n "(cached) " >&6 else case $smpirun_path in [\\/]* | ?:[\\/]*) ac_cv_path_smpirun_path="$smpirun_path" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$simgrid_dir/bin:$PATH" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_smpirun_path="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_smpirun_path" && ac_cv_path_smpirun_path="no" ;; esac fi smpirun_path=$ac_cv_path_smpirun_path if test -n "$smpirun_path"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $smpirun_path" >&5 $as_echo "$smpirun_path" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking mpicc path" >&5 $as_echo_n "checking mpicc path... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mpicc_path" >&5 $as_echo "$mpicc_path" >&6; } MPICC=$mpicc_path if test x$use_mpi = xyes; then cc_or_mpicc=$mpicc_path # For some reason, libtool uses gcc instead of mpicc when linking # libstarpumpi. # On Darwin (and maybe other systems ?) the linker will fail (undefined # references to MPI_*). We manually add the required flags to fix this # issue. MPICC_LDFLAGS=`$mpicc_path --showme:link` else cc_or_mpicc=$CC fi CC_OR_MPICC=$cc_or_mpicc # If the user specifically asks for it, or if we are in a developer checkout, we enable mpi check # Check whether --enable-mpi-check was given. if test "${enable_mpi_check+set}" = set; then : enableval=$enable_mpi_check; fi running_mpi_check=no if test $svndir = 1 -o -d "$srcdir/.git" ; then running_mpi_check=yes fi if test x$enable_mpi_check = xyes ; then running_mpi_check=yes fi if test x$enable_mpi_check = xno ; then running_mpi_check=no fi # Check if mpiexec is available # Check whether --with-mpiexec was given. if test "${with_mpiexec+set}" = set; then : withval=$with_mpiexec; if test x$withval = xyes; then as_fn_error $? "--with-mpiexec must be given a pathname" "$LINENO" 5 else mpiexec_path=$withval fi else # nothing was specified: look in the path # Extract the first word of "mpiexec", so it can be a program name with args. set dummy mpiexec; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_mpiexec_path+:} false; then : $as_echo_n "(cached) " >&6 else case $mpiexec_path in [\\/]* | ?:[\\/]*) ac_cv_path_mpiexec_path="$mpiexec_path" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$(dirname $mpicc_path):$PATH" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_mpiexec_path="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_mpiexec_path" && ac_cv_path_mpiexec_path="no" ;; esac fi mpiexec_path=$ac_cv_path_mpiexec_path if test -n "$mpiexec_path"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mpiexec_path" >&5 $as_echo "$mpiexec_path" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mpiexec is available" >&5 $as_echo_n "checking whether mpiexec is available... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mpiexec_path" >&5 $as_echo "$mpiexec_path" >&6; } # We test if MPIEXEC exists if test ! -x $mpiexec_path; then #MPIEXEC does not exists or is not executable { $as_echo "$as_me:${as_lineno-$LINENO}: result: The mpiexec script is not valid" >&5 $as_echo "The mpiexec script is not valid" >&6; } running_mpi_check=no mpiexec_path="" fi if test x$running_mpi_check = xyes; then STARPU_MPI_CHECK_TRUE= STARPU_MPI_CHECK_FALSE='#' else STARPU_MPI_CHECK_TRUE='#' STARPU_MPI_CHECK_FALSE= fi if test x$use_mpi = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether MPI tests should be run" >&5 $as_echo_n "checking whether MPI tests should be run... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $running_mpi_check" >&5 $as_echo "$running_mpi_check" >&6; } MPIEXEC=$mpiexec_path fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the StarPU MPI library should be generated" >&5 $as_echo_n "checking whether the StarPU MPI library should be generated... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_mpi" >&5 $as_echo "$use_mpi" >&6; } USE_MPI=$use_mpi if test x$use_mpi = xyes; then USE_MPI_TRUE= USE_MPI_FALSE='#' else USE_MPI_TRUE='#' USE_MPI_FALSE= fi if test x$use_mpi = xyes; then $as_echo "#define STARPU_USE_MPI 1" >>confdefs.h else running_mpi_check=no fi # Check whether --with-mpiexec-args was given. if test "${with_mpiexec_args+set}" = set; then : withval=$with_mpiexec_args; mpiexec_args=$withval fi MPIEXEC_ARGS=$mpiexec_args # Check whether --enable-mpi-progression-hook was given. if test "${enable_mpi_progression_hook+set}" = set; then : enableval=$enable_mpi_progression_hook; enable_mpi_progression_hook=$enableval else enable_mpi_progression_hook=no fi if test x$enable_mpi_progression_hook = xyes; then $as_echo "#define STARPU_MPI_ACTIVITY 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether MPI debug messages should be displayed" >&5 $as_echo_n "checking whether MPI debug messages should be displayed... " >&6; } # Check whether --enable-mpi-verbose was given. if test "${enable_mpi_verbose+set}" = set; then : enableval=$enable_mpi_verbose; enable_mpi_verbose=$enableval else enable_mpi_verbose=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_mpi_verbose" >&5 $as_echo "$enable_mpi_verbose" >&6; } if test x$enable_mpi_verbose = xyes; then $as_echo "#define STARPU_MPI_VERBOSE 1" >>confdefs.h fi if test x$enable_mpi_verbose = xextra; then $as_echo "#define STARPU_MPI_VERBOSE 1" >>confdefs.h $as_echo "#define STARPU_MPI_EXTRA_VERBOSE 1" >>confdefs.h fi ############################################################################### # # # StarPU-Top # # # ############################################################################### # Check whether --enable-starpu-top was given. if test "${enable_starpu_top+set}" = set; then : enableval=$enable_starpu_top; enable_starpu_top="$enableval" else enable_starpu_top="maybe" fi # Check whether StarPU-Top can be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking for StarPU-Top" >&5 $as_echo_n "checking for StarPU-Top... " >&6; } if test "x$enable_starpu_top" != "xno" ; then can_build_starpu_top=no for ac_prog in qmake-qt4 qmake do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else case $QMAKE in [\\/]* | ?:[\\/]*) ac_cv_path_QMAKE="$QMAKE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_QMAKE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi QMAKE=$ac_cv_path_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$QMAKE" && break done test -n "$QMAKE" || QMAKE="not-found" if test x$QMAKE != xnot-found; then QMAKE_VERSION=`$QMAKE --version 2>&1 | head -n 1 | cut -d '.' -f 1 | cut -d ' ' -f 3` QT_VERSION=`$QMAKE --version 2>&1 | tail -n 1 | cut -d '.' -f 1 | cut -d ' ' -f 4` if test $QT_VERSION -ge 5 ; then can_build_starpu_top=yes elif test $QMAKE_VERSION -ge 2 ; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtGui QtOpenGL QtSql\""; } >&5 ($PKG_CONFIG --exists --print-errors "QtGui QtOpenGL QtSql") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then QT_MAJVERSION=`$PKG_CONFIG --modversion QtGui | cut -d '.' -f 1` QT_MINVERSION=`$PKG_CONFIG --modversion QtGui | cut -d '.' -f 2` if test $QT_MAJVERSION -gt 4 -o \( $QT_MAJVERSION -eq 4 -a $QT_MINVERSION -ge 7 \) ; then can_build_starpu_top=yes fi fi fi if test x$can_build_starpu_top = xyes; then QWT_PRI=embed # Check whether --with-qwt-include-dir was given. if test "${with_qwt_include_dir+set}" = set; then : withval=$with_qwt_include_dir; STARPU_QWT_INCLUDE="$withval" QWT_PRI=system fi # Check whether --with-qwt-lib-dir was given. if test "${with_qwt_lib_dir+set}" = set; then : withval=$with_qwt_lib_dir; STARPU_QWT_LDFLAGS="-L$withval" QWT_PRI=system fi # Check whether --with-qwt-lib was given. if test "${with_qwt_lib+set}" = set; then : withval=$with_qwt_lib; STARPU_QWT_LDFLAGS="${STARPU_QWT_LDFLAGS} -l$withval" QWT_PRI=system fi fi fi fi if test "x$enable_starpu_top" != "xno" ; then build_starpu_top=$can_build_starpu_top else build_starpu_top=no fi STARPU_USE_TOP=$build_starpu_top if test "x$build_starpu_top" = "xyes"; then BUILD_STARPU_TOP_TRUE= BUILD_STARPU_TOP_FALSE='#' else BUILD_STARPU_TOP_TRUE='#' BUILD_STARPU_TOP_FALSE= fi if test "x$build_starpu_top" = "xyes"; then $as_echo "#define STARPU_USE_TOP 1" >>confdefs.h fi ############################################################################### # # # Flags for C Compiler # # # ############################################################################### # IS_SUPPORTED_CFLAG(flag) # ------------------------ # Check if the CFLAGS `flag' is supported by the compiler { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler support -Wall" >&5 $as_echo_n "checking whether compiler support -Wall... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-Wall" # -we10006" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { const char *hello = "Hello World"; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : GLOBAL_AM_CFLAGS="$GLOBAL_AM_CFLAGS -Wall" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } option_available=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } option_available=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler support -Werror=implicit" >&5 $as_echo_n "checking whether compiler support -Werror=implicit... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror=implicit" # -we10006" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { const char *hello = "Hello World"; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : GLOBAL_AM_CFLAGS="$GLOBAL_AM_CFLAGS -Werror=implicit" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } option_available=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } option_available=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler support -Werror=implicit-function-declaration" >&5 $as_echo_n "checking whether compiler support -Werror=implicit-function-declaration... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror=implicit-function-declaration" # -we10006" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { const char *hello = "Hello World"; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : GLOBAL_AM_CFLAGS="$GLOBAL_AM_CFLAGS -Werror=implicit-function-declaration" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } option_available=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } option_available=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" if test x$enable_perf_debug = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler support -no-pie" >&5 $as_echo_n "checking whether compiler support -no-pie... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-no-pie" # -we10006" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { const char *hello = "Hello World"; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : GLOBAL_AM_CFLAGS="$GLOBAL_AM_CFLAGS -no-pie" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } option_available=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } option_available=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler support -no-PIE" >&5 $as_echo_n "checking whether compiler support -no-PIE... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-no-PIE" # -we10006" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { const char *hello = "Hello World"; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : GLOBAL_AM_CFLAGS="$GLOBAL_AM_CFLAGS -no-PIE" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } option_available=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } option_available=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler support -fno-pie" >&5 $as_echo_n "checking whether compiler support -fno-pie... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-fno-pie" # -we10006" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { const char *hello = "Hello World"; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : GLOBAL_AM_CFLAGS="$GLOBAL_AM_CFLAGS -fno-pie" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } option_available=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } option_available=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" fi if test "x$STARPU_DEVEL" != x; then $as_echo "#define STARPU_DEVEL 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler support -Wextra" >&5 $as_echo_n "checking whether compiler support -Wextra... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-Wextra" # -we10006" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { const char *hello = "Hello World"; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : GLOBAL_AM_CFLAGS="$GLOBAL_AM_CFLAGS -Wextra" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } option_available=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } option_available=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler support -Wunused" >&5 $as_echo_n "checking whether compiler support -Wunused... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-Wunused" # -we10006" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { const char *hello = "Hello World"; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : GLOBAL_AM_CFLAGS="$GLOBAL_AM_CFLAGS -Wunused" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } option_available=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } option_available=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler support -Wundef" >&5 $as_echo_n "checking whether compiler support -Wundef... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-Wundef" # -we10006" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { const char *hello = "Hello World"; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : GLOBAL_AM_CFLAGS="$GLOBAL_AM_CFLAGS -Wundef" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } option_available=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } option_available=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler support -Wshadow" >&5 $as_echo_n "checking whether compiler support -Wshadow... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-Wshadow" # -we10006" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { const char *hello = "Hello World"; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : GLOBAL_AM_CFLAGS="$GLOBAL_AM_CFLAGS -Wshadow" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } option_available=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } option_available=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler support -Werror=pointer-arith" >&5 $as_echo_n "checking whether compiler support -Werror=pointer-arith... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror=pointer-arith" # -we10006" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { const char *hello = "Hello World"; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : GLOBAL_AM_CFLAGS="$GLOBAL_AM_CFLAGS -Werror=pointer-arith" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } option_available=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } option_available=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" fi if test "x$STARPU_DEVEL" != x; then STARPU_DEVEL_TRUE= STARPU_DEVEL_FALSE='#' else STARPU_DEVEL_TRUE='#' STARPU_DEVEL_FALSE= fi # Same value as Automake's, for use in other places. pkglibdir="\${libdir}/$PACKAGE" ############################################################################### # # # Fortran # # # ############################################################################### # Check whether --enable-fortran was given. if test "${enable_fortran+set}" = set; then : enableval=$enable_fortran; enable_build_fortran_requested=$enableval else enable_build_fortran_requested=yes fi enable_build_fortran=no if test "x$enable_build_fortran_requested" = "xyes" ; then if test "x$FC" != "x"; then if $FC --version|grep -q 'GNU Fortran'; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9) int dummy; #else #error GFortran too old, version >= 4.9.x needed, Fortran examples will not be built #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : enable_build_fortran="yes" else enable_build_fortran="no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test "$enable_build_fortran" = "no" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: GFortran too old, version >= 4.9.x needed, Fortran examples will not be built" >&5 $as_echo "$as_me: WARNING: GFortran too old, version >= 4.9.x needed, Fortran examples will not be built" >&2;} fi else if $FC -V 2>&1|grep -q 'Intel(R) Fortran'; then ifort_fc_version=`$FC -V 2>&1 |head -1|sed 's/.*Version //;s/ Build.*//'` ifort_maj_version=`echo $ifort_fc_version|cut -d. -f1` if test $ifort_maj_version -lt 16; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Intel Fortran compiler $ifort_fc_version too old, version >= 2016.x needed, Fortran examples will not be built" >&5 $as_echo "$as_me: WARNING: Intel Fortran compiler $ifort_fc_version too old, version >= 2016.x needed, Fortran examples will not be built" >&2;} enable_build_fortran="no" fi else if $FC -qversion 2>&1|grep -q 'IBM XL Fortran'; then xlf_fc_version=`$FC -V 2>&1 |tail -1|sed 's/.*Version: //'` xlf_maj_version=`echo $xlf_fc_version|cut -d. -f1` { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: IBM Fortran compiler $xlf_fc_version not validated with the native StarPU Fortran API, Fortran examples will not be built" >&5 $as_echo "$as_me: WARNING: IBM Fortran compiler $xlf_fc_version not validated with the native StarPU Fortran API, Fortran examples will not be built" >&2;} enable_build_fortran="no" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Fortran compiler has not been tested for StarPU native Fortran support" >&5 $as_echo "$as_me: WARNING: Fortran compiler has not been tested for StarPU native Fortran support" >&2;} fi fi fi if test "x$enable_build_fortran" = "xyes" ; then $as_echo "#define STARPU_HAVE_FC 1" >>confdefs.h if test x$use_mpi = xyes; then # Check whether --with-mpifort was given. if test "${with_mpifort+set}" = set; then : withval=$with_mpifort; if test x$withval = xyes; then as_fn_error $? "--with-mpifort must be given a pathname" "$LINENO" 5 else mpifort_path=$withval fi else if test x$enable_simgrid = xyes ; then DEFAULT_MPIFORT=smpifort else DEFAULT_MPIFORT=mpif90 fi # nothing was specified: default value is used # Extract the first word of "$DEFAULT_MPIFORT", so it can be a program name with args. set dummy $DEFAULT_MPIFORT; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_mpifort_path+:} false; then : $as_echo_n "(cached) " >&6 else case $mpifort_path in [\\/]* | ?:[\\/]*) ac_cv_path_mpifort_path="$mpifort_path" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$(dirname $mpicc_path):$simgrid_dir/bin:$PATH" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_mpifort_path="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_mpifort_path" && ac_cv_path_mpifort_path="no" ;; esac fi mpifort_path=$ac_cv_path_mpifort_path if test -n "$mpifort_path"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mpifort_path" >&5 $as_echo "$mpifort_path" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # We test if the MPIFORT compiler exists if test ! -x $mpifort_path; then #MPIFORT does not exists or is not executable { $as_echo "$as_me:${as_lineno-$LINENO}: result: The mpifort compiler '$mpifort_path' does not have the execute permission" >&5 $as_echo "The mpifort compiler '$mpifort_path' does not have the execute permission" >&6; } use_mpi_fort=no else OLD_CC=$CC CC=$mpicc_path cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return MPI_Comm_f2c(0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : use_mpi_fort=yes else use_mpi_fort=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CC=$OLD_CC if test "x$use_mpi_fort" = xyes; then $as_echo "#define HAVE_MPI_COMM_F2C 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking mpifort path" >&5 $as_echo_n "checking mpifort path... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mpifort_path" >&5 $as_echo "$mpifort_path" >&6; } MPIFORT=$mpifort_path fi fi fi fi fi fi if test "x$enable_build_fortran" = "xyes" ; then if test "x$FC" = "x" ; then enable_build_fortran="no" fi fi if test "x$FC" != "x" -a "x$enable_build_fortran" = "xyes"; then STARPU_HAVE_FC_TRUE= STARPU_HAVE_FC_FALSE='#' else STARPU_HAVE_FC_TRUE='#' STARPU_HAVE_FC_FALSE= fi if test "x$F77" != "x" -a "x$enable_build_fortran" = "xyes"; then STARPU_HAVE_F77_TRUE= STARPU_HAVE_F77_FALSE='#' else STARPU_HAVE_F77_TRUE='#' STARPU_HAVE_F77_FALSE= fi if test "x$use_mpi_fort" = "xyes"; then STARPU_HAVE_MPIFORT_TRUE= STARPU_HAVE_MPIFORT_FALSE='#' else STARPU_HAVE_MPIFORT_TRUE='#' STARPU_HAVE_MPIFORT_FALSE= fi ############################################################################### # # # GCC extensions # # # ############################################################################### # Check whether --enable-gcc-extensions was given. if test "${enable_gcc_extensions+set}" = set; then : enableval=$enable_gcc_extensions; enable_gcc_plugin="$enableval" else enable_gcc_plugin="maybe" fi if test "x$enable_gcc_plugin" = "xyes" -o "x$enable_gcc_plugin" = "xmaybe" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GCC supports plug-ins" >&5 $as_echo_n "checking whether GCC supports plug-ins... " >&6; } if ${ac_cv_have_gcc_plugins+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$GCC" = xyes; then # ICC 12.1.0 and Clang 3.1 (among others) support `--version', # define `__GNUC__', and provide a `-print-file-name=plugin' # that returns GCC's valid header directory. This makes them # hardly distinguishable from GCC. Actually, ICC 12.1.0 is able # to compile our plug-in, but silently ignores `-fplugin', leading # to obvious build failures; thus, it is explicitly excluded below. GCC_PLUGIN_INCLUDE_DIR="`"$CC" -print-file-name=plugin`/include" save_CPPFLAGS="$CPPFLAGS" save_LDFLAGS="$LDFLAGS" CPPFLAGS="-I$GCC_PLUGIN_INCLUDE_DIR" case "$host_os" in darwin*) # Darwin's linker errors out when encountering undefined # symbols, by default. Tell it to ignore them. LDFLAGS="-Wl,-undefined -Wl,dynamic_lookup";; esac cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #if defined __INTEL_COMPILER || defined __ICC Beware, this compiler is a fake. Don't use it. #endif tree fndecl; gimple call; int main () { /* Clang 3.1 doesn't support nested functions, so try to discriminate it this way. */ tree foo (void) { return lookup_name (get_identifier ("puts")); } fndecl = foo (); call = gimple_build_call (fndecl, 0); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_have_gcc_plugins="yes" else ac_cv_have_gcc_plugins="no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" else ac_cv_have_gcc_plugins="no" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_gcc_plugins" >&5 $as_echo "$ac_cv_have_gcc_plugins" >&6; } if test "x$ac_cv_have_gcc_plugins" = "xyes"; then GCC_PLUGIN_INCLUDE_DIR="`"$CC" -print-file-name=plugin`/include" save_CPPFLAGS="$CPPFLAGS" save_LDFLAGS="$LDFLAGS" CPPFLAGS="-I$GCC_PLUGIN_INCLUDE_DIR" case "$host_os" in darwin*) # Darwin's linker errors out when encountering undefined # symbols, by default. Tell it to ignore them. LDFLAGS="-Wl,-undefined -Wl,dynamic_lookup";; esac ac_fn_c_check_decl "$LINENO" "build_call_expr_loc_array" "ac_cv_have_decl_build_call_expr_loc_array" "#include #include #include " if test "x$ac_cv_have_decl_build_call_expr_loc_array" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_BUILD_CALL_EXPR_LOC_ARRAY $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "build_call_expr_loc_vec" "ac_cv_have_decl_build_call_expr_loc_vec" "#include #include #include " if test "x$ac_cv_have_decl_build_call_expr_loc_vec" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_BUILD_CALL_EXPR_LOC_VEC $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "build_array_ref" "ac_cv_have_decl_build_array_ref" "#include #include #include " if test "x$ac_cv_have_decl_build_array_ref" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_BUILD_ARRAY_REF $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "build_zero_cst" "ac_cv_have_decl_build_zero_cst" "#include #include #include " if test "x$ac_cv_have_decl_build_zero_cst" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_BUILD_ZERO_CST $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "builtin_decl_explicit" "ac_cv_have_decl_builtin_decl_explicit" "#include #include #include " if test "x$ac_cv_have_decl_builtin_decl_explicit" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_BUILTIN_DECL_EXPLICIT $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "ptr_derefs_may_alias_p" "ac_cv_have_decl_ptr_derefs_may_alias_p" "#include #include #include " if test "x$ac_cv_have_decl_ptr_derefs_may_alias_p" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PTR_DEREFS_MAY_ALIAS_P $ac_have_decl _ACEOF for ac_header in c-common.h c-pragma.h c-family/c-common.h c-family/c-pragma.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#include #include " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_member "$LINENO" "struct attribute_spec" "affects_type_identity" "ac_cv_member_struct_attribute_spec_affects_type_identity" "#include #include " if test "x$ac_cv_member_struct_attribute_spec_affects_type_identity" = xyes; then : $as_echo "#define HAVE_ATTRIBUTE_SPEC_AFFECTS_TYPE_IDENTITY 1" >>confdefs.h fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" cat >>confdefs.h <<_ACEOF #define STARPU_INCLUDE_DIR "`test "x$prefix" = xNONE && prefix=$ac_default_prefix ; eval "echo $includedir"`/starpu/$STARPU_EFFECTIVE_VERSION" _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking which compiler to use to build GCC plug-ins" >&5 $as_echo_n "checking which compiler to use to build GCC plug-ins... " >&6; } if ${ac_cv_starpu_gcc_for_plugin+:} false; then : $as_echo_n "(cached) " >&6 else for GCC_FOR_PLUGIN in "$CC" "$CXX" "" do if test "x$GCC_FOR_PLUGIN" = "x"; then break; fi cat > conftest.c < #include #include int plugin_is_GPL_compatible; extern struct cpp_reader *parse_in; /* C-family front-ends */ static void define_something (void *gcc_data, void *user_data) { cpp_define (parse_in, "CONFTEST_GCC_PLUGIN=1"); } int plugin_init (struct plugin_name_args *plugin_info, struct plugin_gcc_version *version) { if (!plugin_default_version_check (version, &gcc_version)) return 1; register_callback ("conftest", PLUGIN_START_UNIT, define_something, NULL); return 0; } END_OF_CONFTEST # Build the plug-in. rm -f conftest.so GCC_PLUGIN_INCLUDE_DIR="`"$CC" -print-file-name=plugin`/include" save_CPPFLAGS="$CPPFLAGS" save_LDFLAGS="$LDFLAGS" CPPFLAGS="-I$GCC_PLUGIN_INCLUDE_DIR" case "$host_os" in darwin*) # Darwin's linker errors out when encountering undefined # symbols, by default. Tell it to ignore them. LDFLAGS="-Wl,-undefined -Wl,dynamic_lookup";; esac { { ac_try=""$GCC_FOR_PLUGIN" "$CPPFLAGS" -fPIC -shared conftest.c -o conftest.so" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval ""$GCC_FOR_PLUGIN" "$CPPFLAGS" -fPIC -shared conftest.c -o conftest.so") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } || { as_fn_error $? "failed to build a GCC plug-in with \`$GCC_FOR_PLUGIN'" "$LINENO" 5 } CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" # Attempt to use it. save_CFLAGS="$CFLAGS" CFLAGS="-fplugin=$PWD/conftest.so" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef CONFTEST_GCC_PLUGIN # error plug-in not loaded #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_starpu_gcc_for_plugin="$GCC_FOR_PLUGIN" else : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$save_CFLAGS" rm -f conftest.so conftest.c if test "x$ac_cv_starpu_gcc_for_plugin" != "x"; then # We're done. break fi done if test "x$ac_cv_starpu_gcc_for_plugin" = "x"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } as_fn_error $? "could not find a suitable compiler for GCC plug-ins" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_starpu_gcc_for_plugin" >&5 $as_echo "$ac_cv_starpu_gcc_for_plugin" >&6; } GCC_FOR_PLUGIN="$ac_cv_starpu_gcc_for_plugin" if test "$GCC_FOR_PLUGIN" = "$CXX"; then GCC_FOR_PLUGIN_LIBTOOL_TAG="CXX" # Require C++11, for lambdas and `auto'. GCC_FOR_PLUGIN="$GCC_FOR_PLUGIN -std=c++11" else GCC_FOR_PLUGIN_LIBTOOL_TAG="CC" fi fi if test "x$ac_cv_have_gcc_plugins" = "xno" ; then if test "x$enable_gcc_plugin" = "xyes" ; then # Since this was explicitly asked for, error out. as_fn_error $? "This compiler lacks GCC plug-in support." "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: GCC plug-ins not supported; StarPU's GCC plug-in will not be built" >&5 $as_echo "$as_me: WARNING: GCC plug-ins not supported; StarPU's GCC plug-in will not be built" >&2;} fi else # What GCC version are we using? if ac_fn_c_compute_int "$LINENO" "__GNUC__" "STARPU_GCC_VERSION_MAJOR" ""; then : fi if ac_fn_c_compute_int "$LINENO" "__GNUC_MINOR__" "STARPU_GCC_VERSION_MINOR" ""; then : fi # The `.so' itself cannot be called `starpu-gcc.so' (because # `-fplugin-arg-' option names and such must match the `.so' # name), so use a meaningful directory name. gccplugindir="\${pkglibdir}/${STARPU_EFFECTIVE_VERSION}/gcc/${STARPU_GCC_VERSION_MAJOR}.${STARPU_GCC_VERSION_MINOR}" # Lines to be inserted in the `.pc' file. GCC_PLUGIN_DIR_PKGCONFIG="gccplugindir=$gccplugindir" GCC_PLUGIN_PKGCONFIG="gccplugin=\${gccplugindir}/starpu.so" fi fi if test "x$ac_cv_have_decl_ptr_derefs_may_alias_p" = "xyes"; then HAVE_PTR_DEREFS_MAY_ALIAS_P_TRUE= HAVE_PTR_DEREFS_MAY_ALIAS_P_FALSE='#' else HAVE_PTR_DEREFS_MAY_ALIAS_P_TRUE='#' HAVE_PTR_DEREFS_MAY_ALIAS_P_FALSE= fi if test "x$ac_cv_have_gcc_plugins" = "xyes" ; then build_gcc_plugin="yes" # GNU Guile 1.8/2.0 is used to run the test suite. # Extract the first word of "guile", so it can be a program name with args. set dummy guile; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GUILE+:} false; then : $as_echo_n "(cached) " >&6 else case $GUILE in [\\/]* | ?:[\\/]*) ac_cv_path_GUILE="$GUILE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GUILE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GUILE=$ac_cv_path_GUILE if test -n "$GUILE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GUILE" >&5 $as_echo "$GUILE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$GUILE" != "x"; then if test "x$enable_cpu" = "xyes"; then run_gcc_plugin_test_suite="yes" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: CPU back-end disabled; GCC plug-in test suite will not be run" >&5 $as_echo "$as_me: WARNING: CPU back-end disabled; GCC plug-in test suite will not be run" >&2;} run_gcc_plugin_test_suite="no" fi else run_gcc_plugin_test_suite="no" fi else build_gcc_plugin="no" run_gcc_plugin_test_suite="no" fi # Bison is used to generate the C expression parser. The generated # parser is part of the distribution, though. YACC=${YACC-"${am_missing_run}bison"} if test "x$build_gcc_plugin" = "xyes"; then BUILD_GCC_PLUGIN_TRUE= BUILD_GCC_PLUGIN_FALSE='#' else BUILD_GCC_PLUGIN_TRUE='#' BUILD_GCC_PLUGIN_FALSE= fi if test "x$run_gcc_plugin_test_suite" = "xyes"; then RUN_GCC_PLUGIN_TESTS_TRUE= RUN_GCC_PLUGIN_TESTS_FALSE='#' else RUN_GCC_PLUGIN_TESTS_TRUE='#' RUN_GCC_PLUGIN_TESTS_FALSE= fi ############################################################################### # # # OpenMP runtime support # # # ############################################################################### # Check whether --enable-openmp was given. if test "${enable_openmp+set}" = set; then : enableval=$enable_openmp; enable_openmp=$enableval else enable_openmp=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenMP runtime support" >&5 $as_echo_n "checking for OpenMP runtime support... " >&6; } if test x$enable_openmp = xyes; then $as_echo "#define STARPU_OPENMP 1" >>confdefs.h fi if test "x$enable_openmp" = "xyes"; then STARPU_OPENMP_TRUE= STARPU_OPENMP_FALSE='#' else STARPU_OPENMP_TRUE='#' STARPU_OPENMP_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_openmp" >&5 $as_echo "$enable_openmp" >&6; } if test -n "$OPENMP_CFLAGS"; then STARPU_HAVE_OPENMP_TRUE= STARPU_HAVE_OPENMP_FALSE='#' else STARPU_HAVE_OPENMP_TRUE='#' STARPU_HAVE_OPENMP_FALSE= fi ############################################################################### # # # SOCL interface # # # ############################################################################### # Check whether --enable-socl was given. if test "${enable_socl+set}" = set; then : enableval=$enable_socl; enable_socl="$enableval" else enable_socl="maybe" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOCL" >&5 $as_echo_n "checking for SOCL... " >&6; } # in case SOCL was explicitely required, but is not available, this is an error if test "x$enable_socl" = "xyes" -a "$have_valid_opencl" = "no" ; then as_fn_error $? "SOCL cannot be enabled without OpenCL" "$LINENO" 5 fi # now we enable SOCL if and only if a proper setup is available if test "x$enable_socl" = "xyes" -o "x$enable_socl" = "xmaybe" ; then build_socl=$have_valid_opencl else build_socl=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $build_socl" >&5 $as_echo "$build_socl" >&6; } if test "x$build_socl" = "xyes"; then BUILD_SOCL_TRUE= BUILD_SOCL_FALSE='#' else BUILD_SOCL_TRUE='#' BUILD_SOCL_FALSE= fi if test "x$build_socl" = "xyes"; then STARPU_USE_SOCL_TRUE= STARPU_USE_SOCL_FALSE='#' else STARPU_USE_SOCL_TRUE='#' STARPU_USE_SOCL_FALSE= fi if test "$build_socl" = "yes" ; then for ac_func in clGetExtensionFunctionAddressForPlatform do : ac_fn_c_check_func "$LINENO" "clGetExtensionFunctionAddressForPlatform" "ac_cv_func_clGetExtensionFunctionAddressForPlatform" if test "x$ac_cv_func_clGetExtensionFunctionAddressForPlatform" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_CLGETEXTENSIONFUNCTIONADDRESSFORPLATFORM 1 _ACEOF fi done if test -n "$SOCL_OCL_LIB_OPENCL" -a -f "$SOCL_OCL_LIB_OPENCL" ; then run_socl_check=yes SOCL_OCL_LIB_OPENCL_DIR=$(dirname $SOCL_OCL_LIB_OPENCL) else run_socl_check=no fi else run_socl_check=no fi ############################################################################### # # # Debugging # # # ############################################################################### # Extract the first word of "gdb", so it can be a program name with args. set dummy gdb; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GDB+:} false; then : $as_echo_n "(cached) " >&6 else case $GDB in [\\/]* | ?:[\\/]*) ac_cv_path_GDB="$GDB" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GDB="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GDB" && ac_cv_path_GDB="not-found" ;; esac fi GDB=$ac_cv_path_GDB if test -n "$GDB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GDB" >&5 $as_echo "$GDB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$GDB" != "xnot-found"; then cat >>confdefs.h <<_ACEOF #define STARPU_GDB_PATH "$GDB" _ACEOF fi ############################################################################### # # # Examples # # # ############################################################################### # Check whether --enable-build-tests was given. if test "${enable_build_tests+set}" = set; then : enableval=$enable_build_tests; enable_build_tests=$enableval else enable_build_tests=yes fi # check stuff for tests (todo) if test x$enable_build_tests != xno; then BUILD_TESTS_TRUE= BUILD_TESTS_FALSE='#' else BUILD_TESTS_TRUE='#' BUILD_TESTS_FALSE= fi # Check whether --enable-build-examples was given. if test "${enable_build_examples+set}" = set; then : enableval=$enable_build_examples; enable_build_examples=$enableval else enable_build_examples=yes fi # check stuff for examples (todo) if test x$enable_build_examples != xno; then BUILD_EXAMPLES_TRUE= BUILD_EXAMPLES_FALSE='#' else BUILD_EXAMPLES_TRUE='#' BUILD_EXAMPLES_FALSE= fi # Check whether --enable-opengl-render was given. if test "${enable_opengl_render+set}" = set; then : enableval=$enable_opengl_render; enable_opengl_render=$enableval else enable_opengl_render=no fi if test x$enable_opengl_render = xyes; then _LIBS_SAV="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glutInit in -lglut" >&5 $as_echo_n "checking for glutInit in -lglut... " >&6; } if ${ac_cv_lib_glut_glutInit+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lglut $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char glutInit (); int main () { return glutInit (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_glut_glutInit=yes else ac_cv_lib_glut_glutInit=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_glut_glutInit" >&5 $as_echo "$ac_cv_lib_glut_glutInit" >&6; } if test "x$ac_cv_lib_glut_glutInit" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBGLUT 1 _ACEOF LIBS="-lglut $LIBS" else as_fn_error $? "cannot find glut" "$LINENO" 5 fi STARPU_OPENGL_RENDER_LDFLAGS="$STARPU_OPENGL_RENDER_LDFLAGS $LIBS" LIBS=$_LIBS_SAV _LIBS_SAV="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glXCreateContext in -lGL" >&5 $as_echo_n "checking for glXCreateContext in -lGL... " >&6; } if ${ac_cv_lib_GL_glXCreateContext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lGL $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char glXCreateContext (); int main () { return glXCreateContext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_GL_glXCreateContext=yes else ac_cv_lib_GL_glXCreateContext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GL_glXCreateContext" >&5 $as_echo "$ac_cv_lib_GL_glXCreateContext" >&6; } if test "x$ac_cv_lib_GL_glXCreateContext" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBGL 1 _ACEOF LIBS="-lGL $LIBS" else as_fn_error $? "cannot find GL" "$LINENO" 5 fi STARPU_OPENGL_RENDER_LDFLAGS="$STARPU_OPENGL_RENDER_LDFLAGS $LIBS" LIBS=$_LIBS_SAV _LIBS_SAV="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gluLookAt in -lGLU" >&5 $as_echo_n "checking for gluLookAt in -lGLU... " >&6; } if ${ac_cv_lib_GLU_gluLookAt+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lGLU $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gluLookAt (); int main () { return gluLookAt (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_GLU_gluLookAt=yes else ac_cv_lib_GLU_gluLookAt=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLU_gluLookAt" >&5 $as_echo "$ac_cv_lib_GLU_gluLookAt" >&6; } if test "x$ac_cv_lib_GLU_gluLookAt" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBGLU 1 _ACEOF LIBS="-lGLU $LIBS" else as_fn_error $? "cannot find GLU" "$LINENO" 5 fi STARPU_OPENGL_RENDER_LDFLAGS="$STARPU_OPENGL_RENDER_LDFLAGS $LIBS" LIBS=$_LIBS_SAV $as_echo "#define STARPU_OPENGL_RENDER 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether OpenGL rendering is enabled" >&5 $as_echo_n "checking whether OpenGL rendering is enabled... " >&6; } STARPU_OPENGL_RENDER=$enable_opengl_render { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_opengl_render" >&5 $as_echo "$enable_opengl_render" >&6; } if test "x$enable_opengl_render" = xyes; then HAVE_OPENGL_TRUE= HAVE_OPENGL_FALSE='#' else HAVE_OPENGL_TRUE='#' HAVE_OPENGL_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.i conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. $as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= else if test -n "$x_includes"; then X_CFLAGS="$X_CFLAGS -I$x_includes" fi # It would also be nice to do this for all -L options, not just this one. if test -n "$x_libraries"; then X_LIBS="$X_LIBS -L$x_libraries" # For Solaris; some versions of Sun CC require a space after -R and # others require no space. Words are not sufficient . . . . { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 $as_echo_n "checking whether -R must be followed by a space... " >&6; } ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" ac_xsave_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } X_LIBS="$X_LIBS -R$x_libraries" else LIBS="$ac_xsave_LIBS -R $x_libraries" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } X_LIBS="$X_LIBS -R $x_libraries" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 $as_echo "neither works" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_c_werror_flag=$ac_xsave_c_werror_flag LIBS=$ac_xsave_LIBS fi # Check for system-dependent libraries X programs must link with. # Do this before checking for the system-independent R6 libraries # (-lICE), since we may need -lsocket or whatever for X linking. if test "$ISC" = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" else # Martyn Johnson says this is needed for Ultrix, if the X # libraries were built with DECnet support. And Karl Berry says # the Alpha needs dnet_stub (dnet does not exist). ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XOpenDisplay (); int main () { return XOpenDisplay (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_dnet_ntoa=yes else ac_cv_lib_dnet_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet_stub $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_stub_dnet_ntoa=yes else ac_cv_lib_dnet_stub_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" fi fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_xsave_LIBS" # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, # to get the SysV transport functions. # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) # needs -lnsl. # The nsl library prevents programs from opening the X display # on Irix 5.2, according to T.E. Dickey. # The functions gethostbyname, getservbyname, and inet_addr are # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : fi if test $ac_cv_func_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" fi if test $ac_cv_lib_nsl_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 $as_echo_n "checking for gethostbyname in -lbsd... " >&6; } if ${ac_cv_lib_bsd_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bsd_gethostbyname=yes else ac_cv_lib_bsd_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 $as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" fi fi fi # lieder@skyler.mavd.honeywell.com says without -lsocket, # socket/setsockopt and other routines are undefined under SCO ODT # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary # on later versions), says Simon Leinen: it contains gethostby* # variants that don't use the name server (or something). -lsocket # must be given before -lnsl if both are needed. We assume that # if connect needs -lnsl, so does gethostbyname. ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : fi if test $ac_cv_func_connect = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 $as_echo_n "checking for connect in -lsocket... " >&6; } if ${ac_cv_lib_socket_connect+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char connect (); int main () { return connect (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_connect=yes else ac_cv_lib_socket_connect=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 $as_echo "$ac_cv_lib_socket_connect" >&6; } if test "x$ac_cv_lib_socket_connect" = xyes; then : X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" fi fi # Guillermo Gomez says -lposix is necessary on A/UX. ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" if test "x$ac_cv_func_remove" = xyes; then : fi if test $ac_cv_func_remove = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 $as_echo_n "checking for remove in -lposix... " >&6; } if ${ac_cv_lib_posix_remove+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char remove (); int main () { return remove (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_posix_remove=yes else ac_cv_lib_posix_remove=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 $as_echo "$ac_cv_lib_posix_remove" >&6; } if test "x$ac_cv_lib_posix_remove" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" fi fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" if test "x$ac_cv_func_shmat" = xyes; then : fi if test $ac_cv_func_shmat = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 $as_echo_n "checking for shmat in -lipc... " >&6; } if ${ac_cv_lib_ipc_shmat+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lipc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shmat (); int main () { return shmat (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ipc_shmat=yes else ac_cv_lib_ipc_shmat=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 $as_echo "$ac_cv_lib_ipc_shmat" >&6; } if test "x$ac_cv_lib_ipc_shmat" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" fi fi fi # Check for libraries that X11R6 Xt/Xaw programs need. ac_save_LDFLAGS=$LDFLAGS test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to # check for ICE first), but we must link in the order -lSM -lICE or # we get undefined symbols. So assume we have SM if we have ICE. # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # John Interrante, Karl Berry { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 $as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lICE $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char IceConnectionNumber (); int main () { return IceConnectionNumber (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ICE_IceConnectionNumber=yes else ac_cv_lib_ICE_IceConnectionNumber=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 $as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then : X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" fi LDFLAGS=$ac_save_LDFLAGS fi if test "x$no_x" != "xyes"; then $as_echo "#define STARPU_HAVE_X11 1" >>confdefs.h fi if test "x$no_x" != "xyes"; then HAVE_X11_TRUE= HAVE_X11_FALSE='#' else HAVE_X11_TRUE='#' HAVE_X11_FALSE= fi # In case there are BLAS kernels that are used by the example applications # we may specify which library to use. Note that this is not used for StarPU # itself. blas_lib=maybe # Check whether --enable-blas-lib was given. if test "${enable_blas_lib+set}" = set; then : enableval=$enable_blas_lib; if test "x$enableval" = "xatlas" ; then blas_lib=atlas elif test "x$enableval" = "xgoto" ; then blas_lib=goto elif test "x$enableval" = "xnone" ; then blas_lib=none elif test "x$enableval" = "xmkl" ; then blas_lib=mkl elif test x$enableval = xno; then blas_lib=none else echo echo "Error!" echo "Unknown BLAS library" exit -1 fi fi if test x$blas_lib = xmaybe -o x$blas_lib = xgoto; then # Check whether --with-goto-dir was given. if test "${with_goto_dir+set}" = set; then : withval=$with_goto_dir; blas_lib=goto gotodir=$withval GOTODIR=$gotodir CPPFLAGS="${CPPFLAGS} -I$gotodir/ " LDFLAGS="${LDFLAGS} -L$gotodir/ " fi if test x$blas_lib = xgoto; then _LIBS_SAV="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lgfortran" >&5 $as_echo_n "checking for main in -lgfortran... " >&6; } if ${ac_cv_lib_gfortran_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgfortran $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_gfortran_main=yes else ac_cv_lib_gfortran_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gfortran_main" >&5 $as_echo "$ac_cv_lib_gfortran_main" >&6; } if test "x$ac_cv_lib_gfortran_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBGFORTRAN 1 _ACEOF LIBS="-lgfortran $LIBS" fi STARPU_BLAS_LDFLAGS="$STARPU_BLAS_LDFLAGS $LIBS" LIBS=$_LIBS_SAV _LIBS_SAV="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lifcore" >&5 $as_echo_n "checking for main in -lifcore... " >&6; } if ${ac_cv_lib_ifcore_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lifcore $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ifcore_main=yes else ac_cv_lib_ifcore_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ifcore_main" >&5 $as_echo "$ac_cv_lib_ifcore_main" >&6; } if test "x$ac_cv_lib_ifcore_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBIFCORE 1 _ACEOF LIBS="-lifcore $LIBS" fi STARPU_BLAS_LDFLAGS="$STARPU_BLAS_LDFLAGS $LIBS" LIBS=$_LIBS_SAV # Perhaps that GotoBLAS2 is available instead (so that we have libgotoblas2.{so,a}) _LIBS_SAV="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sgemm_ in -lgoto2" >&5 $as_echo_n "checking for sgemm_ in -lgoto2... " >&6; } if ${ac_cv_lib_goto2_sgemm_+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgoto2 $STARPU_BLAS_LDFLAGS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sgemm_ (); int main () { return sgemm_ (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_goto2_sgemm_=yes else ac_cv_lib_goto2_sgemm_=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_goto2_sgemm_" >&5 $as_echo "$ac_cv_lib_goto2_sgemm_" >&6; } if test "x$ac_cv_lib_goto2_sgemm_" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBGOTO2 1 _ACEOF LIBS="-lgoto2 $LIBS" else havegoto2=no fi STARPU_BLAS_LDFLAGS="$STARPU_BLAS_LDFLAGS $LIBS" LIBS=$_LIBS_SAV if test x$havegoto2 = xno; then _LIBS_SAV="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sgemm_ in -lgoto" >&5 $as_echo_n "checking for sgemm_ in -lgoto... " >&6; } if ${ac_cv_lib_goto_sgemm_+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgoto $STARPU_BLAS_LDFLAGS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sgemm_ (); int main () { return sgemm_ (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_goto_sgemm_=yes else ac_cv_lib_goto_sgemm_=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_goto_sgemm_" >&5 $as_echo "$ac_cv_lib_goto_sgemm_" >&6; } if test "x$ac_cv_lib_goto_sgemm_" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBGOTO 1 _ACEOF LIBS="-lgoto $LIBS" else as_fn_error $? "cannot find goto lib" "$LINENO" 5 fi STARPU_BLAS_LDFLAGS="$STARPU_BLAS_LDFLAGS $LIBS" LIBS=$_LIBS_SAV fi $as_echo "#define STARPU_GOTO 1" >>confdefs.h fi fi if test x$blas_lib = xmaybe -o x$blas_lib = xatlas; then # Check whether --with-atlas-dir was given. if test "${with_atlas_dir+set}" = set; then : withval=$with_atlas_dir; { $as_echo "$as_me:${as_lineno-$LINENO}: checking STARPU_ATLAS location" >&5 $as_echo_n "checking STARPU_ATLAS location... " >&6; } blas_lib=atlas atlasdir=$withval { $as_echo "$as_me:${as_lineno-$LINENO}: result: $atlasdir" >&5 $as_echo "$atlasdir" >&6; } ATLASDIR=$atlasdir CPPFLAGS="${CPPFLAGS} -I$atlasdir/include/ " LDFLAGS="${LDFLAGS} -L$atlasdir/lib/ " fi if test x$blas_lib = xatlas; then # test whether STARPU_ATLAS is actually available ac_fn_c_check_header_mongrel "$LINENO" "cblas.h" "ac_cv_header_cblas_h" "$ac_includes_default" if test "x$ac_cv_header_cblas_h" = xyes; then : else as_fn_error $? "cannot find atlas headers" "$LINENO" 5 fi _LIBS_SAV="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ATL_sgemm in -latlas" >&5 $as_echo_n "checking for ATL_sgemm in -latlas... " >&6; } if ${ac_cv_lib_atlas_ATL_sgemm+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-latlas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ATL_sgemm (); int main () { return ATL_sgemm (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_atlas_ATL_sgemm=yes else ac_cv_lib_atlas_ATL_sgemm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_atlas_ATL_sgemm" >&5 $as_echo "$ac_cv_lib_atlas_ATL_sgemm" >&6; } if test "x$ac_cv_lib_atlas_ATL_sgemm" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBATLAS 1 _ACEOF LIBS="-latlas $LIBS" else as_fn_error $? "cannot find atlas lib" "$LINENO" 5 fi STARPU_BLAS_LDFLAGS="$STARPU_BLAS_LDFLAGS $LIBS" LIBS=$_LIBS_SAV _LIBS_SAV="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cblas_sgemm in -lcblas" >&5 $as_echo_n "checking for cblas_sgemm in -lcblas... " >&6; } if ${ac_cv_lib_cblas_cblas_sgemm+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcblas -latlas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cblas_sgemm (); int main () { return cblas_sgemm (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cblas_cblas_sgemm=yes else ac_cv_lib_cblas_cblas_sgemm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cblas_cblas_sgemm" >&5 $as_echo "$ac_cv_lib_cblas_cblas_sgemm" >&6; } if test "x$ac_cv_lib_cblas_cblas_sgemm" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBCBLAS 1 _ACEOF LIBS="-lcblas $LIBS" else as_fn_error $? "cannot find atlas lib" "$LINENO" 5 fi STARPU_BLAS_LDFLAGS="$STARPU_BLAS_LDFLAGS $LIBS" LIBS=$_LIBS_SAV $as_echo "#define STARPU_ATLAS 1" >>confdefs.h fi fi if test x$blas_lib = xmaybe -o x$blas_lib = xmkl; then # Should we use MKL ? if test -n "$MKLROOT" then CPPFLAGS="${CPPFLAGS} -I$MKLROOT/include" case $host_vendor in *1om) mkl_plat=mic ;; *) mkl_plat=intel64 ;; esac SAVED_LIBS=$LIBS STARPU_BLAS_LDFLAGS="-L$MKLROOT/lib/$mkl_plat -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lm -lpthread -ldl" LIBS="$LIBS $STARPU_BLAS_LDFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : blas_lib=mkl else STARPU_BLAS_LDFLAGS="" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$SAVED_LIBS fi # Check whether --with-mkl-cflags was given. if test "${with_mkl_cflags+set}" = set; then : withval=$with_mkl_cflags; CPPFLAGS="${CPPFLAGS} $withval" blas_lib=mkl fi # Check whether --with-mkl-ldflags was given. if test "${with_mkl_ldflags+set}" = set; then : withval=$with_mkl_ldflags; STARPU_BLAS_LDFLAGS="$withval" blas_lib=mkl fi if test x$blas_lib = xmkl; then $as_echo "#define STARPU_MKL 1" >>confdefs.h fi fi if test x$blas_lib = xmaybe; then #perhaps it is possible to use some BLAS lib from the system use_system_blas=no _LIBS_SAV="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sgemm_" >&5 $as_echo_n "checking for library containing sgemm_... " >&6; } if ${ac_cv_search_sgemm_+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sgemm_ (); int main () { return sgemm_ (); ; return 0; } _ACEOF for ac_lib in '' blas; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_sgemm_=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_sgemm_+:} false; then : break fi done if ${ac_cv_search_sgemm_+:} false; then : else ac_cv_search_sgemm_=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sgemm_" >&5 $as_echo "$ac_cv_search_sgemm_" >&6; } ac_res=$ac_cv_search_sgemm_ if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" use_system_blas=yes fi STARPU_BLAS_LDFLAGS="$STARPU_BLAS_LDFLAGS $LIBS" LIBS=$_LIBS_SAV if test x$use_system_blas = xyes; then $as_echo "#define STARPU_SYSTEM_BLAS 1" >>confdefs.h blas_lib=system elif test x"$BLAS_LIBS" != x; then $as_echo "#define STARPU_SYSTEM_BLAS 1" >>confdefs.h STARPU_BLAS_LDFLAGS="$BLAS_LIBS" blas_lib=system else blas_lib=none fi fi if test x$blas_lib = xatlas; then ATLAS_BLAS_LIB_TRUE= ATLAS_BLAS_LIB_FALSE='#' else ATLAS_BLAS_LIB_TRUE='#' ATLAS_BLAS_LIB_FALSE= fi if test x$blas_lib = xgoto; then GOTO_BLAS_LIB_TRUE= GOTO_BLAS_LIB_FALSE='#' else GOTO_BLAS_LIB_TRUE='#' GOTO_BLAS_LIB_FALSE= fi if test x$blas_lib = xmkl; then MKL_BLAS_LIB_TRUE= MKL_BLAS_LIB_FALSE='#' else MKL_BLAS_LIB_TRUE='#' MKL_BLAS_LIB_FALSE= fi if test x$blas_lib = xsystem; then SYSTEM_BLAS_LIB_TRUE= SYSTEM_BLAS_LIB_FALSE='#' else SYSTEM_BLAS_LIB_TRUE='#' SYSTEM_BLAS_LIB_FALSE= fi if test x$blas_lib = xnone -a x$enable_simgrid = xno; then NO_BLAS_LIB_TRUE= NO_BLAS_LIB_FALSE='#' else NO_BLAS_LIB_TRUE='#' NO_BLAS_LIB_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking which BLAS lib should be used" >&5 $as_echo_n "checking which BLAS lib should be used... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $blas_lib" >&5 $as_echo "$blas_lib" >&6; } BLAS_LIB=$blas_lib ########################################## # FFT # ########################################## have_fftw=no have_fftwf=no have_fftwl=no fft_support=no # Check whether --enable-starpufft was given. if test "${enable_starpufft+set}" = set; then : enableval=$enable_starpufft; enable_starpufft=$enableval else enable_starpufft=yes fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FFTW" >&5 $as_echo_n "checking for FFTW... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$FFTW_CFLAGS"; then pkg_cv_FFTW_CFLAGS="$FFTW_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fftw3\""; } >&5 ($PKG_CONFIG --exists --print-errors "fftw3") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FFTW_CFLAGS=`$PKG_CONFIG --cflags "fftw3" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$FFTW_LIBS"; then pkg_cv_FFTW_LIBS="$FFTW_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fftw3\""; } >&5 ($PKG_CONFIG --exists --print-errors "fftw3") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FFTW_LIBS=`$PKG_CONFIG --libs "fftw3" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FFTW_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "fftw3"` else FFTW_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "fftw3"` fi # Put the nasty error message in config.log where it belongs echo "$FFTW_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : elif test $pkg_failed = untried; then : else FFTW_CFLAGS=$pkg_cv_FFTW_CFLAGS FFTW_LIBS=$pkg_cv_FFTW_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define STARPU_HAVE_FFTW 1" >>confdefs.h STARPU_HAVE_FFTW=1 have_fftw=yes fi if test x$have_fftw = xyes; then STARPU_HAVE_FFTW_TRUE= STARPU_HAVE_FFTW_FALSE='#' else STARPU_HAVE_FFTW_TRUE='#' STARPU_HAVE_FFTW_FALSE= fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FFTWF" >&5 $as_echo_n "checking for FFTWF... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$FFTWF_CFLAGS"; then pkg_cv_FFTWF_CFLAGS="$FFTWF_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fftw3f\""; } >&5 ($PKG_CONFIG --exists --print-errors "fftw3f") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FFTWF_CFLAGS=`$PKG_CONFIG --cflags "fftw3f" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$FFTWF_LIBS"; then pkg_cv_FFTWF_LIBS="$FFTWF_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fftw3f\""; } >&5 ($PKG_CONFIG --exists --print-errors "fftw3f") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FFTWF_LIBS=`$PKG_CONFIG --libs "fftw3f" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FFTWF_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "fftw3f"` else FFTWF_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "fftw3f"` fi # Put the nasty error message in config.log where it belongs echo "$FFTWF_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : elif test $pkg_failed = untried; then : else FFTWF_CFLAGS=$pkg_cv_FFTWF_CFLAGS FFTWF_LIBS=$pkg_cv_FFTWF_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define STARPU_HAVE_FFTWF 1" >>confdefs.h STARPU_HAVE_FFTWF=1 have_fftwf=yes fi if test x$have_fftwf = xyes; then STARPU_HAVE_FFTWF_TRUE= STARPU_HAVE_FFTWF_FALSE='#' else STARPU_HAVE_FFTWF_TRUE='#' STARPU_HAVE_FFTWF_FALSE= fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FFTWL" >&5 $as_echo_n "checking for FFTWL... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$FFTWL_CFLAGS"; then pkg_cv_FFTWL_CFLAGS="$FFTWL_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fftw3l\""; } >&5 ($PKG_CONFIG --exists --print-errors "fftw3l") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FFTWL_CFLAGS=`$PKG_CONFIG --cflags "fftw3l" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$FFTWL_LIBS"; then pkg_cv_FFTWL_LIBS="$FFTWL_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fftw3l\""; } >&5 ($PKG_CONFIG --exists --print-errors "fftw3l") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FFTWL_LIBS=`$PKG_CONFIG --libs "fftw3l" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FFTWL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "fftw3l"` else FFTWL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "fftw3l"` fi # Put the nasty error message in config.log where it belongs echo "$FFTWL_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : elif test $pkg_failed = untried; then : else FFTWL_CFLAGS=$pkg_cv_FFTWL_CFLAGS FFTWL_LIBS=$pkg_cv_FFTWL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define STARPU_HAVE_FFTWL 1" >>confdefs.h HAVE_FFTWFL=1 have_fftwl=yes fi if test x$have_fftwl = xyes; then STARPU_HAVE_FFTWL_TRUE= STARPU_HAVE_FFTWL_FALSE='#' else STARPU_HAVE_FFTWL_TRUE='#' STARPU_HAVE_FFTWL_FALSE= fi if test x$enable_starpufft = xyes -a \( \( x$enable_cpu = xyes -a x$have_fftw = xyes -a x$have_fftwf = xyes \) -o x$have_cufftdoublecomplex = xyes \); then fft_support=yes fi if test x$fft_support = xyes; then BUILD_STARPUFFT_TRUE= BUILD_STARPUFFT_FALSE='#' else BUILD_STARPUFFT_TRUE='#' BUILD_STARPUFFT_FALSE= fi # Check whether --enable-starpufft-examples was given. if test "${enable_starpufft_examples+set}" = set; then : enableval=$enable_starpufft_examples; enable_starpufft_examples=$enableval else enable_starpufft_examples=no fi if test x$enable_starpufft_examples = xyes; then BUILD_STARPUFFT_EXAMPLES_TRUE= BUILD_STARPUFFT_EXAMPLES_FALSE='#' else BUILD_STARPUFFT_EXAMPLES_TRUE='#' BUILD_STARPUFFT_EXAMPLES_FALSE= fi ########################################## # hwloc # ########################################## have_valid_hwloc=no SAVED_LDFLAGS="${LDFLAGS}" SAVED_CPPFLAGS="${CPPFLAGS}" SAVED_PKG_CONFIG_PATH="$PKG_CONFIG_PATH" # Check whether --with-hwloc was given. if test "${with_hwloc+set}" = set; then : withval=$with_hwloc; if test x$withval != xno; then if test "$withval" = "yes" ; then use_hwloc=yes else # use specified path if test ! -d "$withval" ; then as_fn_error $? "\"Directory specified for hwloc <$withval> does not exist\"" "$LINENO" 5 fi if test ! -d "$withval/lib/pkgconfig" ; then as_fn_error $? "\"Hwloc directory <$withval> does not have a subdirectory lib/pkgconfig\"" "$LINENO" 5 fi export PKG_CONFIG_PATH=$withval/lib/pkgconfig:$PKG_CONFIG_PATH use_hwloc=yes fi else use_hwloc=no fi else use_hwloc=maybe fi if test "$use_hwloc" != "no"; then : pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for HWLOC" >&5 $as_echo_n "checking for HWLOC... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$HWLOC_CFLAGS"; then pkg_cv_HWLOC_CFLAGS="$HWLOC_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"hwloc\""; } >&5 ($PKG_CONFIG --exists --print-errors "hwloc") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_HWLOC_CFLAGS=`$PKG_CONFIG --cflags "hwloc" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$HWLOC_LIBS"; then pkg_cv_HWLOC_LIBS="$HWLOC_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"hwloc\""; } >&5 ($PKG_CONFIG --exists --print-errors "hwloc") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_HWLOC_LIBS=`$PKG_CONFIG --libs "hwloc" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then HWLOC_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "hwloc"` else HWLOC_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "hwloc"` fi # Put the nasty error message in config.log where it belongs echo "$HWLOC_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } have_valid_hwloc=no elif test $pkg_failed = untried; then have_valid_hwloc=no else HWLOC_CFLAGS=$pkg_cv_HWLOC_CFLAGS HWLOC_LIBS=$pkg_cv_HWLOC_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } have_valid_hwloc=yes fi fi if test "x$have_valid_hwloc" = "xyes"; then STARPU_HAVE_HWLOC_TRUE= STARPU_HAVE_HWLOC_FALSE='#' else STARPU_HAVE_HWLOC_TRUE='#' STARPU_HAVE_HWLOC_FALSE= fi # in case hwloc was explicitely required, but is not available, this is an error if test "$use_hwloc" = "yes" -a "$have_valid_hwloc" = "no"; then : as_fn_error $? "cannot find hwloc" "$LINENO" 5 fi # in case hwloc is not available but was not explicitely disabled, this is an error if test "$have_valid_hwloc" = "no" -a "$use_hwloc" != "no"; then : as_fn_error $? "libhwloc or pkg-config was not found on your system. If the target machine is hyperthreaded the performance may be impacted a lot. It is strongly recommended to install libhwloc and pkg-config. However, if you really want to use StarPU without enabling libhwloc, please restart configure by specifying the option '--without-hwloc'." "$LINENO" 5 fi LDFLAGS="${HWLOC_LIBS} ${SAVED_LDFLAGS}" CPPFLAGS="${HWLOC_CFLAGS} ${SAVED_CPPFLAGS}" if test "$have_valid_hwloc" = "yes"; then : $as_echo "#define STARPU_HAVE_HWLOC 1" >>confdefs.h HWLOC_REQUIRES=hwloc STARPU_HAVE_HWLOC=1 ac_fn_c_check_decl "$LINENO" "hwloc_cuda_get_device_osdev_by_index" "ac_cv_have_decl_hwloc_cuda_get_device_osdev_by_index" "#include " if test "x$ac_cv_have_decl_hwloc_cuda_get_device_osdev_by_index" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_HWLOC_CUDA_GET_DEVICE_OSDEV_BY_INDEX $ac_have_decl _ACEOF fi for ac_func in hwloc_topology_dup do : ac_fn_c_check_func "$LINENO" "hwloc_topology_dup" "ac_cv_func_hwloc_topology_dup" if test "x$ac_cv_func_hwloc_topology_dup" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_HWLOC_TOPOLOGY_DUP 1 _ACEOF fi done if test $ac_cv_func_hwloc_topology_dup = yes; then STARPU_HWLOC_HAVE_TOPOLOGY_DUP_TRUE= STARPU_HWLOC_HAVE_TOPOLOGY_DUP_FALSE='#' else STARPU_HWLOC_HAVE_TOPOLOGY_DUP_TRUE='#' STARPU_HWLOC_HAVE_TOPOLOGY_DUP_FALSE= fi LDFLAGS="${SAVED_LDFLAGS}" CPPFLAGS="${SAVED_CPPFLAGS}" export PKG_CONFIG_PATH=$SAVED_PKG_CONFIG_PATH { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether hwloc should be used" >&5 $as_echo_n "checking whether hwloc should be used... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_valid_hwloc" >&5 $as_echo "$have_valid_hwloc" >&6; } # is the header file f77.h available ? ac_fn_c_check_header_mongrel "$LINENO" "f77.h" "ac_cv_header_f77_h" "$ac_includes_default" if test "x$ac_cv_header_f77_h" = xyes; then : have_f77_h=yes else have_f77_h=no fi STARPU_HAVE_F77_H=$have_f77_h if test x$have_f77_h = xyes; then STARPU_HAVE_F77_H_TRUE= STARPU_HAVE_F77_H_FALSE='#' else STARPU_HAVE_F77_H_TRUE='#' STARPU_HAVE_F77_H_FALSE= fi if test x$have_f77_h = xyes; then $as_echo "#define STARPU_HAVE_F77_H 1" >>confdefs.h fi # Check if icc is available for ac_prog in icc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ICC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ICC"; then ac_cv_prog_ICC="$ICC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ICC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ICC=$ac_cv_prog_ICC if test -n "$ICC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ICC" >&5 $as_echo "$ICC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ICC" && break done # If cuda and icc are both available, check they are compatible if test "$enable_cuda" = "yes" -a "$ICC" != ""; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA and ICC are compatible" >&5 $as_echo_n "checking whether CUDA and ICC are compatible... " >&6; } OLD_CC="$CC" CC="$ICC" OLD_CFLAGS="$CFLAGS" CFLAGS="-I$PWD/include -I$srcdir/include" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else ICC="" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CC="$OLD_CC" CFLAGS="$OLD_CFLAGS" fi # Disable ICC on windows if test "x$ICC" != "x" -a "$starpu_windows" = "yes" ; then ICC="" fi if test "x$ICC" != "x"; then $as_echo "#define STARPU_HAVE_ICC 1" >>confdefs.h fi if test "x$ICC" != "x"; then STARPU_HAVE_ICC_TRUE= STARPU_HAVE_ICC_FALSE='#' else STARPU_HAVE_ICC_TRUE='#' STARPU_HAVE_ICC_FALSE= fi # Do not generate manpages for the tools if we do not have help2man for ac_prog in help2man do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_HELP2MAN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$HELP2MAN"; then ac_cv_prog_HELP2MAN="$HELP2MAN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_HELP2MAN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi HELP2MAN=$ac_cv_prog_HELP2MAN if test -n "$HELP2MAN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HELP2MAN" >&5 $as_echo "$HELP2MAN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$HELP2MAN" && break done # Disable on windows if test "$starpu_windows" = "yes" ; then HELP2MAN="" fi if test "x$HELP2MAN" != "x"; then STARPU_HAVE_HELP2MAN_TRUE= STARPU_HAVE_HELP2MAN_FALSE='#' else STARPU_HAVE_HELP2MAN_TRUE='#' STARPU_HAVE_HELP2MAN_FALSE= fi ac_fn_c_check_member "$LINENO" "struct cudaDeviceProp" "pciDomainID" "ac_cv_member_struct_cudaDeviceProp_pciDomainID" "#include " if test "x$ac_cv_member_struct_cudaDeviceProp_pciDomainID" = xyes; then : $as_echo "#define STARPU_HAVE_DOMAINID 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct cudaDeviceProp" "pciBusID" "ac_cv_member_struct_cudaDeviceProp_pciBusID" "#include " if test "x$ac_cv_member_struct_cudaDeviceProp_pciBusID" = xyes; then : $as_echo "#define STARPU_HAVE_BUSID 1" >>confdefs.h fi if true; then STARPU_HAVE_AM111_TRUE= STARPU_HAVE_AM111_FALSE='#' else STARPU_HAVE_AM111_TRUE='#' STARPU_HAVE_AM111_FALSE= fi ########################################## # Documentation # ########################################## # Check whether --enable-build-doc was given. if test "${enable_build_doc+set}" = set; then : enableval=$enable_build_doc; enable_build_doc=$enableval else enable_build_doc=yes fi if test "$enable_build_doc" = "yes" ; then # Check whether doxygen needed tools are installed # Extract the first word of "doxygen", so it can be a program name with args. set dummy doxygen; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_doxygencommand+:} false; then : $as_echo_n "(cached) " >&6 else case $doxygencommand in [\\/]* | ?:[\\/]*) ac_cv_path_doxygencommand="$doxygencommand" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_doxygencommand="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi doxygencommand=$ac_cv_path_doxygencommand if test -n "$doxygencommand"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doxygencommand" >&5 $as_echo "$doxygencommand" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$doxygencommand" = "" ; then enable_build_doc="no" fi # Extract the first word of "pdflatex", so it can be a program name with args. set dummy pdflatex; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_pdflatexcommand+:} false; then : $as_echo_n "(cached) " >&6 else case $pdflatexcommand in [\\/]* | ?:[\\/]*) ac_cv_path_pdflatexcommand="$pdflatexcommand" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_pdflatexcommand="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi pdflatexcommand=$ac_cv_path_pdflatexcommand if test -n "$pdflatexcommand"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pdflatexcommand" >&5 $as_echo "$pdflatexcommand" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$pdflatexcommand" = "" ; then enable_build_doc="no" fi # Extract the first word of "epstopdf", so it can be a program name with args. set dummy epstopdf; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_epstopdfcommand+:} false; then : $as_echo_n "(cached) " >&6 else case $epstopdfcommand in [\\/]* | ?:[\\/]*) ac_cv_path_epstopdfcommand="$epstopdfcommand" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_epstopdfcommand="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi epstopdfcommand=$ac_cv_path_epstopdfcommand if test -n "$epstopdfcommand"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $epstopdfcommand" >&5 $as_echo "$epstopdfcommand" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$epstopdfcommand" = "" ; then enable_build_doc="no" fi fi available_doc="no" if test -f "$srcdir/doc/doxygen/starpu.pdf" then enable_build_doc="no" available_doc="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether documentation should be compiled" >&5 $as_echo_n "checking whether documentation should be compiled... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_build_doc" >&5 $as_echo "$enable_build_doc" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether documentation is available" >&5 $as_echo_n "checking whether documentation is available... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $available_doc" >&5 $as_echo "$available_doc" >&6; } if test x$enable_build_doc != xno; then BUILD_DOC_TRUE= BUILD_DOC_FALSE='#' else BUILD_DOC_TRUE='#' BUILD_DOC_FALSE= fi if test x$available_doc != xno; then AVAILABLE_DOC_TRUE= AVAILABLE_DOC_FALSE='#' else AVAILABLE_DOC_TRUE='#' AVAILABLE_DOC_FALSE= fi ############################################################################### # # # Final settings # # # ############################################################################### # these are the flags needed for linking libstarpu (and thus also for static linking) LIBSTARPU_LDFLAGS="$HWLOC_LIBS $FXT_LIBS $STARPU_COI_LDFLAGS $STARPU_SCIF_LDFLAGS $STARPU_RCCE_LDFLAGS $STARPU_LEVELDB_LDFLAGS $STARPU_GLPK_LDFLAGS $STARPU_LEVELDB_LDFLAGS $SIMGRID_LIBS" LIBSTARPU_LINK=libstarpu-$STARPU_EFFECTIVE_VERSION.la if test x$enable_perf_debug = xyes; then # For gperf to work, we need to link statically our tests LIBSTARPU_LINK=".libs/libstarpu-$STARPU_EFFECTIVE_VERSION.a $LIBSTARPU_LDFLAGS $STARPU_CUDA_LDFLAGS $STARPU_OPENCL_LDFLAGS" fi if test "x$enable_shared" = xno; then # No .so, so application will unexpected have to know which -l to # use. Give them in .pc file. STARPU_EXPORTED_LIBS="$LDFLAGS $LIBS $LIBSTARPU_LDFLAGS" fi # File configuration ac_config_commands="$ac_config_commands executable-scripts" # Create links to ICD files in build/socl/vendors directory. SOCL will use this # directory as the OCL_ICD_VENDORS directory SOCL_VENDORS="vendors/install/socl.icd" for icd in /etc/OpenCL/vendors/*.icd ; do if test -f $icd ; then if test "$(basename $icd)" != "socl.icd" ; then new_icd=$(basename $icd) ac_config_links="$ac_config_links socl/vendors/$new_icd:$icd" SOCL_VENDORS="$SOCL_VENDORS vendors/$new_icd" fi fi done ac_config_files="$ac_config_files tests/regression/regression.sh tests/regression/profiles tests/regression/profiles.build.only" ac_config_headers="$ac_config_headers src/common/config.h include/starpu_config.h gcc-plugin/include/starpu-gcc/config.h starpu-top/config.h" SANITIZE=$(echo $CFLAGS | grep sanitize) if test -n "$SANITIZE"; then STARPU_SANITIZE_TRUE= STARPU_SANITIZE_FALSE='#' else STARPU_SANITIZE_TRUE='#' STARPU_SANITIZE_FALSE= fi ac_config_files="$ac_config_files Makefile src/Makefile tools/Makefile tools/starpu_codelet_profile tools/starpu_codelet_histo_profile tools/starpu_workers_activity tools/starpu_paje_draw_histogram tools/starpu_paje_state_stats tools/starpu_paje_summary tools/starpu_paje_sort tools/starpu_smpirun socl/Makefile socl/src/Makefile socl/examples/Makefile socl/vendors/socl.icd socl/vendors/install/socl.icd libstarpu.pc starpu-1.0.pc starpu-1.1.pc starpu-1.2.pc mpi/libstarpumpi.pc mpi/starpumpi-1.0.pc mpi/starpumpi-1.1.pc mpi/starpumpi-1.2.pc starpufft/Makefile starpufft/src/Makefile starpufft/tests/Makefile starpufft/libstarpufft.pc starpufft/starpufft-1.0.pc starpufft/starpufft-1.1.pc starpufft/starpufft-1.2.pc examples/Makefile examples/stencil/Makefile tests/Makefile tests/loader-cross.sh examples/loader-cross.sh examples/stencil/loader-cross.sh mpi/Makefile mpi/src/Makefile mpi/tests/Makefile mpi/examples/Makefile starpu-top/StarPU-Top.pro starpu-top/StarPU-Top-qwt-embed.pri starpu-top/StarPU-Top-qwt-system.pri gcc-plugin/Makefile gcc-plugin/src/Makefile gcc-plugin/tests/Makefile gcc-plugin/tests/run-test gcc-plugin/examples/Makefile sc_hypervisor/Makefile sc_hypervisor/src/Makefile sc_hypervisor/examples/Makefile doc/Makefile doc/doxygen/Makefile doc/doxygen/doxygen-config.cfg doc/doxygen/doxygen_filter.sh tools/msvc/starpu_var.bat" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_CROSS_COMPILING_TRUE}" && test -z "${STARPU_CROSS_COMPILING_FALSE}"; then as_fn_error $? "conditional \"STARPU_CROSS_COMPILING\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_USE_MIC_TRUE}" && test -z "${STARPU_USE_MIC_FALSE}"; then as_fn_error $? "conditional \"STARPU_USE_MIC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_MS_LIB_TRUE}" && test -z "${STARPU_HAVE_MS_LIB_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_MS_LIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_WINDOWS_TRUE}" && test -z "${STARPU_HAVE_WINDOWS_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_WINDOWS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_LINUX_SYS_TRUE}" && test -z "${STARPU_LINUX_SYS_FALSE}"; then as_fn_error $? "conditional \"STARPU_LINUX_SYS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_DARWIN_TRUE}" && test -z "${STARPU_HAVE_DARWIN_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_DARWIN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_OPENBSD_SYS_TRUE}" && test -z "${STARPU_OPENBSD_SYS_FALSE}"; then as_fn_error $? "conditional \"STARPU_OPENBSD_SYS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_QUICK_CHECK_TRUE}" && test -z "${STARPU_QUICK_CHECK_FALSE}"; then as_fn_error $? "conditional \"STARPU_QUICK_CHECK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_LONG_CHECK_TRUE}" && test -z "${STARPU_LONG_CHECK_FALSE}"; then as_fn_error $? "conditional \"STARPU_LONG_CHECK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_NEW_CHECK_TRUE}" && test -z "${STARPU_NEW_CHECK_FALSE}"; then as_fn_error $? "conditional \"STARPU_NEW_CHECK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_BUILD_SC_HYPERVISOR_TRUE}" && test -z "${STARPU_BUILD_SC_HYPERVISOR_FALSE}"; then as_fn_error $? "conditional \"STARPU_BUILD_SC_HYPERVISOR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_USE_SC_HYPERVISOR_TRUE}" && test -z "${STARPU_USE_SC_HYPERVISOR_FALSE}"; then as_fn_error $? "conditional \"STARPU_USE_SC_HYPERVISOR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_SC_HYPERVISOR_DEBUG_TRUE}" && test -z "${STARPU_SC_HYPERVISOR_DEBUG_FALSE}"; then as_fn_error $? "conditional \"STARPU_SC_HYPERVISOR_DEBUG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_USE_CPU_TRUE}" && test -z "${STARPU_USE_CPU_FALSE}"; then as_fn_error $? "conditional \"STARPU_USE_CPU\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_USE_CUDA_TRUE}" && test -z "${STARPU_USE_CUDA_FALSE}"; then as_fn_error $? "conditional \"STARPU_USE_CUDA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_MAGMA_TRUE}" && test -z "${STARPU_HAVE_MAGMA_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_MAGMA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_CUFFTDOUBLECOMPLEX_TRUE}" && test -z "${STARPU_HAVE_CUFFTDOUBLECOMPLEX_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_CUFFTDOUBLECOMPLEX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_USE_OPENCL_TRUE}" && test -z "${STARPU_USE_OPENCL_FALSE}"; then as_fn_error $? "conditional \"STARPU_USE_OPENCL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_SIMGRID_TRUE}" && test -z "${STARPU_SIMGRID_FALSE}"; then as_fn_error $? "conditional \"STARPU_SIMGRID\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_USE_SCC_TRUE}" && test -z "${STARPU_USE_SCC_FALSE}"; then as_fn_error $? "conditional \"STARPU_USE_SCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_USE_MP_TRUE}" && test -z "${STARPU_USE_MP_FALSE}"; then as_fn_error $? "conditional \"STARPU_USE_MP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_COVERAGE_ENABLED_TRUE}" && test -z "${STARPU_COVERAGE_ENABLED_FALSE}"; then as_fn_error $? "conditional \"STARPU_COVERAGE_ENABLED\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_USE_FXT_TRUE}" && test -z "${STARPU_USE_FXT_FALSE}"; then as_fn_error $? "conditional \"STARPU_USE_FXT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_USE_AYUDAME1_TRUE}" && test -z "${STARPU_USE_AYUDAME1_FALSE}"; then as_fn_error $? "conditional \"STARPU_USE_AYUDAME1\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_USE_AYUDAME2_TRUE}" && test -z "${STARPU_USE_AYUDAME2_FALSE}"; then as_fn_error $? "conditional \"STARPU_USE_AYUDAME2\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_LEVELDB_TRUE}" && test -z "${STARPU_HAVE_LEVELDB_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_LEVELDB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_MPI_CHECK_TRUE}" && test -z "${STARPU_MPI_CHECK_FALSE}"; then as_fn_error $? "conditional \"STARPU_MPI_CHECK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_MPI_TRUE}" && test -z "${USE_MPI_FALSE}"; then as_fn_error $? "conditional \"USE_MPI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_STARPU_TOP_TRUE}" && test -z "${BUILD_STARPU_TOP_FALSE}"; then as_fn_error $? "conditional \"BUILD_STARPU_TOP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_DEVEL_TRUE}" && test -z "${STARPU_DEVEL_FALSE}"; then as_fn_error $? "conditional \"STARPU_DEVEL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_FC_TRUE}" && test -z "${STARPU_HAVE_FC_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_FC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_F77_TRUE}" && test -z "${STARPU_HAVE_F77_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_F77\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_MPIFORT_TRUE}" && test -z "${STARPU_HAVE_MPIFORT_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_MPIFORT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_PTR_DEREFS_MAY_ALIAS_P_TRUE}" && test -z "${HAVE_PTR_DEREFS_MAY_ALIAS_P_FALSE}"; then as_fn_error $? "conditional \"HAVE_PTR_DEREFS_MAY_ALIAS_P\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_GCC_PLUGIN_TRUE}" && test -z "${BUILD_GCC_PLUGIN_FALSE}"; then as_fn_error $? "conditional \"BUILD_GCC_PLUGIN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${RUN_GCC_PLUGIN_TESTS_TRUE}" && test -z "${RUN_GCC_PLUGIN_TESTS_FALSE}"; then as_fn_error $? "conditional \"RUN_GCC_PLUGIN_TESTS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_OPENMP_TRUE}" && test -z "${STARPU_OPENMP_FALSE}"; then as_fn_error $? "conditional \"STARPU_OPENMP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_OPENMP_TRUE}" && test -z "${STARPU_HAVE_OPENMP_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_OPENMP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_SOCL_TRUE}" && test -z "${BUILD_SOCL_FALSE}"; then as_fn_error $? "conditional \"BUILD_SOCL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_USE_SOCL_TRUE}" && test -z "${STARPU_USE_SOCL_FALSE}"; then as_fn_error $? "conditional \"STARPU_USE_SOCL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_TESTS_TRUE}" && test -z "${BUILD_TESTS_FALSE}"; then as_fn_error $? "conditional \"BUILD_TESTS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_EXAMPLES_TRUE}" && test -z "${BUILD_EXAMPLES_FALSE}"; then as_fn_error $? "conditional \"BUILD_EXAMPLES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_OPENGL_TRUE}" && test -z "${HAVE_OPENGL_FALSE}"; then as_fn_error $? "conditional \"HAVE_OPENGL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_X11_TRUE}" && test -z "${HAVE_X11_FALSE}"; then as_fn_error $? "conditional \"HAVE_X11\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ATLAS_BLAS_LIB_TRUE}" && test -z "${ATLAS_BLAS_LIB_FALSE}"; then as_fn_error $? "conditional \"ATLAS_BLAS_LIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GOTO_BLAS_LIB_TRUE}" && test -z "${GOTO_BLAS_LIB_FALSE}"; then as_fn_error $? "conditional \"GOTO_BLAS_LIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MKL_BLAS_LIB_TRUE}" && test -z "${MKL_BLAS_LIB_FALSE}"; then as_fn_error $? "conditional \"MKL_BLAS_LIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SYSTEM_BLAS_LIB_TRUE}" && test -z "${SYSTEM_BLAS_LIB_FALSE}"; then as_fn_error $? "conditional \"SYSTEM_BLAS_LIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${NO_BLAS_LIB_TRUE}" && test -z "${NO_BLAS_LIB_FALSE}"; then as_fn_error $? "conditional \"NO_BLAS_LIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_FFTW_TRUE}" && test -z "${STARPU_HAVE_FFTW_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_FFTW\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_FFTWF_TRUE}" && test -z "${STARPU_HAVE_FFTWF_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_FFTWF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_FFTWL_TRUE}" && test -z "${STARPU_HAVE_FFTWL_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_FFTWL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_STARPUFFT_TRUE}" && test -z "${BUILD_STARPUFFT_FALSE}"; then as_fn_error $? "conditional \"BUILD_STARPUFFT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_STARPUFFT_EXAMPLES_TRUE}" && test -z "${BUILD_STARPUFFT_EXAMPLES_FALSE}"; then as_fn_error $? "conditional \"BUILD_STARPUFFT_EXAMPLES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_HWLOC_TRUE}" && test -z "${STARPU_HAVE_HWLOC_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_HWLOC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HWLOC_HAVE_TOPOLOGY_DUP_TRUE}" && test -z "${STARPU_HWLOC_HAVE_TOPOLOGY_DUP_FALSE}"; then as_fn_error $? "conditional \"STARPU_HWLOC_HAVE_TOPOLOGY_DUP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_F77_H_TRUE}" && test -z "${STARPU_HAVE_F77_H_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_F77_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_ICC_TRUE}" && test -z "${STARPU_HAVE_ICC_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_ICC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_HELP2MAN_TRUE}" && test -z "${STARPU_HAVE_HELP2MAN_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_HELP2MAN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_AM111_TRUE}" && test -z "${STARPU_HAVE_AM111_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_AM111\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_AM111_TRUE}" && test -z "${STARPU_HAVE_AM111_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_AM111\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_DOC_TRUE}" && test -z "${BUILD_DOC_FALSE}"; then as_fn_error $? "conditional \"BUILD_DOC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AVAILABLE_DOC_TRUE}" && test -z "${AVAILABLE_DOC_FALSE}"; then as_fn_error $? "conditional \"AVAILABLE_DOC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_SANITIZE_TRUE}" && test -z "${STARPU_SANITIZE_FALSE}"; then as_fn_error $? "conditional \"STARPU_SANITIZE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by StarPU $as_me 1.2.3, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_links="$ac_config_links" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration links: $config_links Configuration commands: $config_commands Report bugs to . StarPU home page: ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ StarPU config.status 1.2.3 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' LD_F77='`$ECHO "$LD_F77" | $SED "$delay_single_quote_subst"`' LD_FC='`$ECHO "$LD_FC" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_F77='`$ECHO "$reload_flag_F77" | $SED "$delay_single_quote_subst"`' reload_flag_FC='`$ECHO "$reload_flag_FC" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_F77='`$ECHO "$reload_cmds_F77" | $SED "$delay_single_quote_subst"`' reload_cmds_FC='`$ECHO "$reload_cmds_FC" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_F77='`$ECHO "$old_archive_cmds_F77" | $SED "$delay_single_quote_subst"`' old_archive_cmds_FC='`$ECHO "$old_archive_cmds_FC" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' compiler_F77='`$ECHO "$compiler_F77" | $SED "$delay_single_quote_subst"`' compiler_FC='`$ECHO "$compiler_FC" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' GCC_F77='`$ECHO "$GCC_F77" | $SED "$delay_single_quote_subst"`' GCC_FC='`$ECHO "$GCC_FC" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_F77='`$ECHO "$lt_prog_compiler_no_builtin_flag_F77" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_FC='`$ECHO "$lt_prog_compiler_no_builtin_flag_FC" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_F77='`$ECHO "$lt_prog_compiler_pic_F77" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_FC='`$ECHO "$lt_prog_compiler_pic_FC" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_F77='`$ECHO "$lt_prog_compiler_wl_F77" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_FC='`$ECHO "$lt_prog_compiler_wl_FC" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_F77='`$ECHO "$lt_prog_compiler_static_F77" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_FC='`$ECHO "$lt_prog_compiler_static_FC" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_F77='`$ECHO "$lt_cv_prog_compiler_c_o_F77" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_FC='`$ECHO "$lt_cv_prog_compiler_c_o_FC" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_F77='`$ECHO "$archive_cmds_need_lc_F77" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_FC='`$ECHO "$archive_cmds_need_lc_FC" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_F77='`$ECHO "$enable_shared_with_static_runtimes_F77" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_FC='`$ECHO "$enable_shared_with_static_runtimes_FC" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_F77='`$ECHO "$export_dynamic_flag_spec_F77" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_FC='`$ECHO "$export_dynamic_flag_spec_FC" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_F77='`$ECHO "$whole_archive_flag_spec_F77" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_FC='`$ECHO "$whole_archive_flag_spec_FC" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_F77='`$ECHO "$compiler_needs_object_F77" | $SED "$delay_single_quote_subst"`' compiler_needs_object_FC='`$ECHO "$compiler_needs_object_FC" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_F77='`$ECHO "$old_archive_from_new_cmds_F77" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_FC='`$ECHO "$old_archive_from_new_cmds_FC" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_F77='`$ECHO "$old_archive_from_expsyms_cmds_F77" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_FC='`$ECHO "$old_archive_from_expsyms_cmds_FC" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_F77='`$ECHO "$archive_cmds_F77" | $SED "$delay_single_quote_subst"`' archive_cmds_FC='`$ECHO "$archive_cmds_FC" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_F77='`$ECHO "$archive_expsym_cmds_F77" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_FC='`$ECHO "$archive_expsym_cmds_FC" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_F77='`$ECHO "$module_cmds_F77" | $SED "$delay_single_quote_subst"`' module_cmds_FC='`$ECHO "$module_cmds_FC" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_F77='`$ECHO "$module_expsym_cmds_F77" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_FC='`$ECHO "$module_expsym_cmds_FC" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_F77='`$ECHO "$with_gnu_ld_F77" | $SED "$delay_single_quote_subst"`' with_gnu_ld_FC='`$ECHO "$with_gnu_ld_FC" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_F77='`$ECHO "$allow_undefined_flag_F77" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_FC='`$ECHO "$allow_undefined_flag_FC" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_F77='`$ECHO "$no_undefined_flag_F77" | $SED "$delay_single_quote_subst"`' no_undefined_flag_FC='`$ECHO "$no_undefined_flag_FC" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_F77='`$ECHO "$hardcode_libdir_flag_spec_F77" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_FC='`$ECHO "$hardcode_libdir_flag_spec_FC" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_F77='`$ECHO "$hardcode_libdir_separator_F77" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_FC='`$ECHO "$hardcode_libdir_separator_FC" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_F77='`$ECHO "$hardcode_direct_F77" | $SED "$delay_single_quote_subst"`' hardcode_direct_FC='`$ECHO "$hardcode_direct_FC" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_F77='`$ECHO "$hardcode_direct_absolute_F77" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_FC='`$ECHO "$hardcode_direct_absolute_FC" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_F77='`$ECHO "$hardcode_minus_L_F77" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_FC='`$ECHO "$hardcode_minus_L_FC" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_F77='`$ECHO "$hardcode_shlibpath_var_F77" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_FC='`$ECHO "$hardcode_shlibpath_var_FC" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_F77='`$ECHO "$hardcode_automatic_F77" | $SED "$delay_single_quote_subst"`' hardcode_automatic_FC='`$ECHO "$hardcode_automatic_FC" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_F77='`$ECHO "$inherit_rpath_F77" | $SED "$delay_single_quote_subst"`' inherit_rpath_FC='`$ECHO "$inherit_rpath_FC" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_F77='`$ECHO "$link_all_deplibs_F77" | $SED "$delay_single_quote_subst"`' link_all_deplibs_FC='`$ECHO "$link_all_deplibs_FC" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_F77='`$ECHO "$always_export_symbols_F77" | $SED "$delay_single_quote_subst"`' always_export_symbols_FC='`$ECHO "$always_export_symbols_FC" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_F77='`$ECHO "$export_symbols_cmds_F77" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_FC='`$ECHO "$export_symbols_cmds_FC" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_F77='`$ECHO "$exclude_expsyms_F77" | $SED "$delay_single_quote_subst"`' exclude_expsyms_FC='`$ECHO "$exclude_expsyms_FC" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_F77='`$ECHO "$include_expsyms_F77" | $SED "$delay_single_quote_subst"`' include_expsyms_FC='`$ECHO "$include_expsyms_FC" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_F77='`$ECHO "$prelink_cmds_F77" | $SED "$delay_single_quote_subst"`' prelink_cmds_FC='`$ECHO "$prelink_cmds_FC" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_F77='`$ECHO "$postlink_cmds_F77" | $SED "$delay_single_quote_subst"`' postlink_cmds_FC='`$ECHO "$postlink_cmds_FC" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_F77='`$ECHO "$file_list_spec_F77" | $SED "$delay_single_quote_subst"`' file_list_spec_FC='`$ECHO "$file_list_spec_FC" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_F77='`$ECHO "$hardcode_action_F77" | $SED "$delay_single_quote_subst"`' hardcode_action_FC='`$ECHO "$hardcode_action_FC" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_F77='`$ECHO "$compiler_lib_search_dirs_F77" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_FC='`$ECHO "$compiler_lib_search_dirs_FC" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_F77='`$ECHO "$predep_objects_F77" | $SED "$delay_single_quote_subst"`' predep_objects_FC='`$ECHO "$predep_objects_FC" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_F77='`$ECHO "$postdep_objects_F77" | $SED "$delay_single_quote_subst"`' postdep_objects_FC='`$ECHO "$postdep_objects_FC" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' predeps_F77='`$ECHO "$predeps_F77" | $SED "$delay_single_quote_subst"`' predeps_FC='`$ECHO "$predeps_FC" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_F77='`$ECHO "$postdeps_F77" | $SED "$delay_single_quote_subst"`' postdeps_FC='`$ECHO "$postdeps_FC" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_F77='`$ECHO "$compiler_lib_search_path_F77" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_FC='`$ECHO "$compiler_lib_search_path_FC" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in AS \ DLLTOOL \ OBJDUMP \ SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ LD_F77 \ LD_FC \ reload_flag_CXX \ reload_flag_F77 \ reload_flag_FC \ compiler_CXX \ compiler_F77 \ compiler_FC \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_no_builtin_flag_F77 \ lt_prog_compiler_no_builtin_flag_FC \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_pic_F77 \ lt_prog_compiler_pic_FC \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_wl_F77 \ lt_prog_compiler_wl_FC \ lt_prog_compiler_static_CXX \ lt_prog_compiler_static_F77 \ lt_prog_compiler_static_FC \ lt_cv_prog_compiler_c_o_CXX \ lt_cv_prog_compiler_c_o_F77 \ lt_cv_prog_compiler_c_o_FC \ export_dynamic_flag_spec_CXX \ export_dynamic_flag_spec_F77 \ export_dynamic_flag_spec_FC \ whole_archive_flag_spec_CXX \ whole_archive_flag_spec_F77 \ whole_archive_flag_spec_FC \ compiler_needs_object_CXX \ compiler_needs_object_F77 \ compiler_needs_object_FC \ with_gnu_ld_CXX \ with_gnu_ld_F77 \ with_gnu_ld_FC \ allow_undefined_flag_CXX \ allow_undefined_flag_F77 \ allow_undefined_flag_FC \ no_undefined_flag_CXX \ no_undefined_flag_F77 \ no_undefined_flag_FC \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_flag_spec_F77 \ hardcode_libdir_flag_spec_FC \ hardcode_libdir_separator_CXX \ hardcode_libdir_separator_F77 \ hardcode_libdir_separator_FC \ exclude_expsyms_CXX \ exclude_expsyms_F77 \ exclude_expsyms_FC \ include_expsyms_CXX \ include_expsyms_F77 \ include_expsyms_FC \ file_list_spec_CXX \ file_list_spec_F77 \ file_list_spec_FC \ compiler_lib_search_dirs_CXX \ compiler_lib_search_dirs_F77 \ compiler_lib_search_dirs_FC \ predep_objects_CXX \ predep_objects_F77 \ predep_objects_FC \ postdep_objects_CXX \ postdep_objects_F77 \ postdep_objects_FC \ predeps_CXX \ predeps_F77 \ predeps_FC \ postdeps_CXX \ postdeps_F77 \ postdeps_FC \ compiler_lib_search_path_CXX \ compiler_lib_search_path_F77 \ compiler_lib_search_path_FC; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec \ reload_cmds_CXX \ reload_cmds_F77 \ reload_cmds_FC \ old_archive_cmds_CXX \ old_archive_cmds_F77 \ old_archive_cmds_FC \ old_archive_from_new_cmds_CXX \ old_archive_from_new_cmds_F77 \ old_archive_from_new_cmds_FC \ old_archive_from_expsyms_cmds_CXX \ old_archive_from_expsyms_cmds_F77 \ old_archive_from_expsyms_cmds_FC \ archive_cmds_CXX \ archive_cmds_F77 \ archive_cmds_FC \ archive_expsym_cmds_CXX \ archive_expsym_cmds_F77 \ archive_expsym_cmds_FC \ module_cmds_CXX \ module_cmds_F77 \ module_cmds_FC \ module_expsym_cmds_CXX \ module_expsym_cmds_F77 \ module_expsym_cmds_FC \ export_symbols_cmds_CXX \ export_symbols_cmds_F77 \ export_symbols_cmds_FC \ prelink_cmds_CXX \ prelink_cmds_F77 \ prelink_cmds_FC \ postlink_cmds_CXX \ postlink_cmds_F77 \ postlink_cmds_FC; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "executable-scripts") CONFIG_COMMANDS="$CONFIG_COMMANDS executable-scripts" ;; "socl/vendors/$new_icd") CONFIG_LINKS="$CONFIG_LINKS socl/vendors/$new_icd:$icd" ;; "tests/regression/regression.sh") CONFIG_FILES="$CONFIG_FILES tests/regression/regression.sh" ;; "tests/regression/profiles") CONFIG_FILES="$CONFIG_FILES tests/regression/profiles" ;; "tests/regression/profiles.build.only") CONFIG_FILES="$CONFIG_FILES tests/regression/profiles.build.only" ;; "src/common/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/common/config.h" ;; "include/starpu_config.h") CONFIG_HEADERS="$CONFIG_HEADERS include/starpu_config.h" ;; "gcc-plugin/include/starpu-gcc/config.h") CONFIG_HEADERS="$CONFIG_HEADERS gcc-plugin/include/starpu-gcc/config.h" ;; "starpu-top/config.h") CONFIG_HEADERS="$CONFIG_HEADERS starpu-top/config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "tools/Makefile") CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;; "tools/starpu_codelet_profile") CONFIG_FILES="$CONFIG_FILES tools/starpu_codelet_profile" ;; "tools/starpu_codelet_histo_profile") CONFIG_FILES="$CONFIG_FILES tools/starpu_codelet_histo_profile" ;; "tools/starpu_workers_activity") CONFIG_FILES="$CONFIG_FILES tools/starpu_workers_activity" ;; "tools/starpu_paje_draw_histogram") CONFIG_FILES="$CONFIG_FILES tools/starpu_paje_draw_histogram" ;; "tools/starpu_paje_state_stats") CONFIG_FILES="$CONFIG_FILES tools/starpu_paje_state_stats" ;; "tools/starpu_paje_summary") CONFIG_FILES="$CONFIG_FILES tools/starpu_paje_summary" ;; "tools/starpu_paje_sort") CONFIG_FILES="$CONFIG_FILES tools/starpu_paje_sort" ;; "tools/starpu_smpirun") CONFIG_FILES="$CONFIG_FILES tools/starpu_smpirun" ;; "socl/Makefile") CONFIG_FILES="$CONFIG_FILES socl/Makefile" ;; "socl/src/Makefile") CONFIG_FILES="$CONFIG_FILES socl/src/Makefile" ;; "socl/examples/Makefile") CONFIG_FILES="$CONFIG_FILES socl/examples/Makefile" ;; "socl/vendors/socl.icd") CONFIG_FILES="$CONFIG_FILES socl/vendors/socl.icd" ;; "socl/vendors/install/socl.icd") CONFIG_FILES="$CONFIG_FILES socl/vendors/install/socl.icd" ;; "libstarpu.pc") CONFIG_FILES="$CONFIG_FILES libstarpu.pc" ;; "starpu-1.0.pc") CONFIG_FILES="$CONFIG_FILES starpu-1.0.pc" ;; "starpu-1.1.pc") CONFIG_FILES="$CONFIG_FILES starpu-1.1.pc" ;; "starpu-1.2.pc") CONFIG_FILES="$CONFIG_FILES starpu-1.2.pc" ;; "mpi/libstarpumpi.pc") CONFIG_FILES="$CONFIG_FILES mpi/libstarpumpi.pc" ;; "mpi/starpumpi-1.0.pc") CONFIG_FILES="$CONFIG_FILES mpi/starpumpi-1.0.pc" ;; "mpi/starpumpi-1.1.pc") CONFIG_FILES="$CONFIG_FILES mpi/starpumpi-1.1.pc" ;; "mpi/starpumpi-1.2.pc") CONFIG_FILES="$CONFIG_FILES mpi/starpumpi-1.2.pc" ;; "starpufft/Makefile") CONFIG_FILES="$CONFIG_FILES starpufft/Makefile" ;; "starpufft/src/Makefile") CONFIG_FILES="$CONFIG_FILES starpufft/src/Makefile" ;; "starpufft/tests/Makefile") CONFIG_FILES="$CONFIG_FILES starpufft/tests/Makefile" ;; "starpufft/libstarpufft.pc") CONFIG_FILES="$CONFIG_FILES starpufft/libstarpufft.pc" ;; "starpufft/starpufft-1.0.pc") CONFIG_FILES="$CONFIG_FILES starpufft/starpufft-1.0.pc" ;; "starpufft/starpufft-1.1.pc") CONFIG_FILES="$CONFIG_FILES starpufft/starpufft-1.1.pc" ;; "starpufft/starpufft-1.2.pc") CONFIG_FILES="$CONFIG_FILES starpufft/starpufft-1.2.pc" ;; "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; "examples/stencil/Makefile") CONFIG_FILES="$CONFIG_FILES examples/stencil/Makefile" ;; "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; "tests/loader-cross.sh") CONFIG_FILES="$CONFIG_FILES tests/loader-cross.sh" ;; "examples/loader-cross.sh") CONFIG_FILES="$CONFIG_FILES examples/loader-cross.sh" ;; "examples/stencil/loader-cross.sh") CONFIG_FILES="$CONFIG_FILES examples/stencil/loader-cross.sh" ;; "mpi/Makefile") CONFIG_FILES="$CONFIG_FILES mpi/Makefile" ;; "mpi/src/Makefile") CONFIG_FILES="$CONFIG_FILES mpi/src/Makefile" ;; "mpi/tests/Makefile") CONFIG_FILES="$CONFIG_FILES mpi/tests/Makefile" ;; "mpi/examples/Makefile") CONFIG_FILES="$CONFIG_FILES mpi/examples/Makefile" ;; "starpu-top/StarPU-Top.pro") CONFIG_FILES="$CONFIG_FILES starpu-top/StarPU-Top.pro" ;; "starpu-top/StarPU-Top-qwt-embed.pri") CONFIG_FILES="$CONFIG_FILES starpu-top/StarPU-Top-qwt-embed.pri" ;; "starpu-top/StarPU-Top-qwt-system.pri") CONFIG_FILES="$CONFIG_FILES starpu-top/StarPU-Top-qwt-system.pri" ;; "gcc-plugin/Makefile") CONFIG_FILES="$CONFIG_FILES gcc-plugin/Makefile" ;; "gcc-plugin/src/Makefile") CONFIG_FILES="$CONFIG_FILES gcc-plugin/src/Makefile" ;; "gcc-plugin/tests/Makefile") CONFIG_FILES="$CONFIG_FILES gcc-plugin/tests/Makefile" ;; "gcc-plugin/tests/run-test") CONFIG_FILES="$CONFIG_FILES gcc-plugin/tests/run-test" ;; "gcc-plugin/examples/Makefile") CONFIG_FILES="$CONFIG_FILES gcc-plugin/examples/Makefile" ;; "sc_hypervisor/Makefile") CONFIG_FILES="$CONFIG_FILES sc_hypervisor/Makefile" ;; "sc_hypervisor/src/Makefile") CONFIG_FILES="$CONFIG_FILES sc_hypervisor/src/Makefile" ;; "sc_hypervisor/examples/Makefile") CONFIG_FILES="$CONFIG_FILES sc_hypervisor/examples/Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "doc/doxygen/Makefile") CONFIG_FILES="$CONFIG_FILES doc/doxygen/Makefile" ;; "doc/doxygen/doxygen-config.cfg") CONFIG_FILES="$CONFIG_FILES doc/doxygen/doxygen-config.cfg" ;; "doc/doxygen/doxygen_filter.sh") CONFIG_FILES="$CONFIG_FILES doc/doxygen/doxygen_filter.sh" ;; "tools/msvc/starpu_var.bat") CONFIG_FILES="$CONFIG_FILES tools/msvc/starpu_var.bat" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_LINKS+set}" = set || CONFIG_LINKS=$config_links test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :L $CONFIG_LINKS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :L) # # CONFIG_LINK # if test "$ac_source" = "$ac_file" && test "$srcdir" = '.'; then : else # Prefer the file from the source tree if names are identical. if test "$ac_source" = "$ac_file" || test ! -r "$ac_source"; then ac_source=$srcdir/$ac_source fi { $as_echo "$as_me:${as_lineno-$LINENO}: linking $ac_source to $ac_file" >&5 $as_echo "$as_me: linking $ac_source to $ac_file" >&6;} if test ! -r "$ac_source"; then as_fn_error $? "$ac_source: file not found" "$LINENO" 5 fi rm -f "$ac_file" # Try a relative symlink, then a hard link, then a copy. case $ac_source in [\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;; *) ac_rel_source=$ac_top_build_prefix$ac_source ;; esac ln -s "$ac_rel_source" "$ac_file" 2>/dev/null || ln "$ac_source" "$ac_file" 2>/dev/null || cp -p "$ac_source" "$ac_file" || as_fn_error $? "cannot link or copy $ac_source to $ac_file" "$LINENO" 5 fi ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="CXX F77 FC " # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Assembler program. AS=$lt_AS # DLL creation program. DLLTOOL=$lt_DLLTOOL # Object dumper program. OBJDUMP=$lt_OBJDUMP # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: F77 # The linker used to build libraries. LD=$lt_LD_F77 # How to create reloadable object files. reload_flag=$lt_reload_flag_F77 reload_cmds=$lt_reload_cmds_F77 # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_F77 # A language specific compiler. CC=$lt_compiler_F77 # Is the compiler the GNU compiler? with_gcc=$GCC_F77 # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_F77 # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_F77 # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_F77 # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_F77 # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_F77 # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_F77 archive_expsym_cmds=$lt_archive_expsym_cmds_F77 # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_F77 module_expsym_cmds=$lt_module_expsym_cmds_F77 # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_F77 # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_F77 # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_F77 # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_F77 # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_F77 # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_F77 # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_F77 # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_F77 # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_F77 # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_F77 # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_F77 # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_F77 # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_F77 # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_F77 # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_F77 # Specify filename containing input files. file_list_spec=$lt_file_list_spec_F77 # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_F77 # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_F77 # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_F77 postdep_objects=$lt_postdep_objects_F77 predeps=$lt_predeps_F77 postdeps=$lt_postdeps_F77 # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_F77 # ### END LIBTOOL TAG CONFIG: F77 _LT_EOF cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: FC # The linker used to build libraries. LD=$lt_LD_FC # How to create reloadable object files. reload_flag=$lt_reload_flag_FC reload_cmds=$lt_reload_cmds_FC # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_FC # A language specific compiler. CC=$lt_compiler_FC # Is the compiler the GNU compiler? with_gcc=$GCC_FC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_FC # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_FC # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_FC # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_FC # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_FC # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_FC # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_FC # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_FC # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_FC # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_FC # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_FC # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_FC # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_FC archive_expsym_cmds=$lt_archive_expsym_cmds_FC # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_FC module_expsym_cmds=$lt_module_expsym_cmds_FC # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_FC # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_FC # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_FC # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_FC # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_FC # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_FC # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_FC # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_FC # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_FC # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_FC # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_FC # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_FC # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_FC # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_FC # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_FC # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_FC # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_FC # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_FC # Specify filename containing input files. file_list_spec=$lt_file_list_spec_FC # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_FC # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_FC # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_FC postdep_objects=$lt_postdep_objects_FC predeps=$lt_predeps_FC postdeps=$lt_postdeps_FC # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_FC # ### END LIBTOOL TAG CONFIG: FC _LT_EOF ;; "executable-scripts":C) chmod +x tests/regression/regression.sh chmod +x tests/loader-cross.sh chmod +x examples/loader-cross.sh chmod +x examples/stencil/loader-cross.sh chmod +x gcc-plugin/tests/run-test chmod +x tools/starpu_codelet_profile chmod +x tools/starpu_codelet_histo_profile chmod +x tools/starpu_workers_activity chmod +x tools/starpu_paje_draw_histogram chmod +x tools/starpu_paje_state_stats chmod +x tools/starpu_paje_summary chmod +x tools/starpu_paje_sort chmod +x tools/starpu_smpirun chmod +x doc/doxygen/doxygen_filter.sh mkdir -p tests/microbenchs test -e tests/microbenchs/tasks_size_overhead.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/tasks_size_overhead.sh tests/microbenchs/ test -e tests/microbenchs/tasks_size_overhead.gp || ln -sf $ac_abs_top_srcdir/tests/microbenchs/tasks_size_overhead.gp tests/microbenchs/ mkdir -p tests/datawizard test -e tests/datawizard/locality.sh || ln -sf $ac_abs_top_srcdir/tests/datawizard/locality.sh tests/datawizard/ mkdir -p tests/overlap test -e tests/overlap/overlap.sh || ln -sf $ac_abs_top_srcdir/tests/overlap/overlap.sh tests/overlap/ mkdir -p examples/heat test -e examples/heat/heat.sh || ln -sf $ac_abs_top_srcdir/examples/heat/heat.sh examples/heat/ mkdir -p examples/lu test -e examples/lu/lu.sh || ln -sf $ac_abs_top_srcdir/examples/lu/lu.sh examples/lu/ test -e tools/starpu_paje_draw_histogram.R || ln -sf $ac_abs_top_srcdir/tools/starpu_paje_draw_histogram.R tools/starpu_paje_draw_histogram.R test -e tools/starpu_paje_state_stats.R || ln -sf $ac_abs_top_srcdir/tools/starpu_paje_state_stats.R tools/starpu_paje_state_stats.R ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi { $as_echo "$as_me:${as_lineno-$LINENO}: CPUs enabled: $enable_cpu CUDA enabled: $enable_cuda OpenCL enabled: $enable_opencl SCC enabled: $enable_rcce MIC enabled: $enable_mic Compile-time limits (change these with --enable-maxcpus, --enable-maxcudadev, --enable-maxopencldev, --enable-maxmicdev, --enable-maxnodes, --enable-maxbuffers) (Note these numbers do not represent the number of detected devices, but the maximum number of devices StarPU can manage) Maximum number of CPUs: $maxcpus Maximum number of CUDA devices: $nmaxcudadev Maximum number of OpenCL devices: $nmaxopencldev Maximum number of SCC devices: $nmaxsccdev Maximum number of MIC threads: $nmaxmicthreads Maximum number of memory nodes: $maxnodes Maximum number of task buffers: $nmaxbuffers GPU-GPU transfers: $have_cuda_memcpy_peer Allocation cache: $enable_allocation_cache Magma enabled: $have_magma BLAS library: $blas_lib hwloc: $have_valid_hwloc FxT trace enabled: $use_fxt StarPU-Top: $build_starpu_top Documentation: $enable_build_doc Examples: $enable_build_examples StarPU Extensions: MPI enabled: $use_mpi MPI test suite: $running_mpi_check FFT Support: $fft_support GCC plug-in: $build_gcc_plugin GCC plug-in test suite (requires GNU Guile): $run_gcc_plugin_test_suite OpenMP runtime support enabled: $enable_openmp SOCL enabled: $build_socl SOCL test suite: $run_socl_check Scheduler Hypervisor: $build_sc_hypervisor simgrid enabled: $enable_simgrid ayudame enabled: $ayu_msg Native fortran support: $enable_build_fortran Native MPI fortran support: $use_mpi_fort " >&5 $as_echo "$as_me: CPUs enabled: $enable_cpu CUDA enabled: $enable_cuda OpenCL enabled: $enable_opencl SCC enabled: $enable_rcce MIC enabled: $enable_mic Compile-time limits (change these with --enable-maxcpus, --enable-maxcudadev, --enable-maxopencldev, --enable-maxmicdev, --enable-maxnodes, --enable-maxbuffers) (Note these numbers do not represent the number of detected devices, but the maximum number of devices StarPU can manage) Maximum number of CPUs: $maxcpus Maximum number of CUDA devices: $nmaxcudadev Maximum number of OpenCL devices: $nmaxopencldev Maximum number of SCC devices: $nmaxsccdev Maximum number of MIC threads: $nmaxmicthreads Maximum number of memory nodes: $maxnodes Maximum number of task buffers: $nmaxbuffers GPU-GPU transfers: $have_cuda_memcpy_peer Allocation cache: $enable_allocation_cache Magma enabled: $have_magma BLAS library: $blas_lib hwloc: $have_valid_hwloc FxT trace enabled: $use_fxt StarPU-Top: $build_starpu_top Documentation: $enable_build_doc Examples: $enable_build_examples StarPU Extensions: MPI enabled: $use_mpi MPI test suite: $running_mpi_check FFT Support: $fft_support GCC plug-in: $build_gcc_plugin GCC plug-in test suite (requires GNU Guile): $run_gcc_plugin_test_suite OpenMP runtime support enabled: $enable_openmp SOCL enabled: $build_socl SOCL test suite: $run_socl_check Scheduler Hypervisor: $build_sc_hypervisor simgrid enabled: $enable_simgrid ayudame enabled: $ayu_msg Native fortran support: $enable_build_fortran Native MPI fortran support: $use_mpi_fort " >&6;} if test "$build_socl" = "yes" -a "$run_socl_check" = "no" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: SOCL test suite will not be run as the environment variable SOCL_OCL_LIB_OPENCL is not defined. To run the tests, you need to install the OCL implementation of ICD (https://forge.imag.fr/projects/ocl-icd/ or Debian package ocl-icd-libopencl1) and set the variable SOCL_OCL_LIB_OPENCL to the location of the libOpenCL.so." >&5 $as_echo "$as_me: WARNING: SOCL test suite will not be run as the environment variable SOCL_OCL_LIB_OPENCL is not defined. To run the tests, you need to install the OCL implementation of ICD (https://forge.imag.fr/projects/ocl-icd/ or Debian package ocl-icd-libopencl1) and set the variable SOCL_OCL_LIB_OPENCL to the location of the libOpenCL.so." >&6;} fi if test x"$have_valid_hwloc" = xno -a "$enable_simgrid" = "no" then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: hwloc was not enabled. If the target machine is hyperthreaded the performance may be impacted a lot. It is strongly recommended to install hwloc" >&5 $as_echo "$as_me: WARNING: hwloc was not enabled. If the target machine is hyperthreaded the performance may be impacted a lot. It is strongly recommended to install hwloc" >&6;} fi starpu-1.2.3+dfsg/configure.ac000066400000000000000000003316151320135501600162450ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2017 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS # Copyright (C) 2011 Télécom-SudParis # Copyright (C) 2011, 2012, 2014-2016 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. AC_INIT([StarPU], [1.2.3], [starpu-devel@lists.gforge.inria.fr], [starpu], [http://runtime.bordeaux.inria.fr/StarPU/]) AC_CONFIG_SRCDIR(include/starpu.h) AC_CONFIG_AUX_DIR([build-aux]) # libtool doesn't actually properly manage a space in the workdir case `pwd` in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac dnl Versioning. STARPU_MAJOR_VERSION="`echo $PACKAGE_VERSION | cut -d . -f 1`" STARPU_MINOR_VERSION="`echo $PACKAGE_VERSION | cut -d . -f 2`" STARPU_RELEASE_VERSION="`echo $PACKAGE_VERSION | cut -d . -f 3`" STARPU_RELEASE_VERSION="`echo $PACKAGE_VERSION | cut -d . -f 3| sed 's/rc.*//'`" dnl we do not want the rcXX in the release version. we would like to use sed -r 's/[a-z]+.*//' to remove any string but the -r option is not portable AC_SUBST([STARPU_MAJOR_VERSION]) AC_SUBST([STARPU_MINOR_VERSION]) AC_SUBST([STARPU_RELEASE_VERSION]) AC_SUBST([STARPU_EFFECTIVE_VERSION]) AC_DEFINE_UNQUOTED([STARPU_MAJOR_VERSION], [$STARPU_MAJOR_VERSION], [Major version number of StarPU.]) AC_DEFINE_UNQUOTED([STARPU_MINOR_VERSION], [$STARPU_MINOR_VERSION], [Minor version number of StarPU.]) AC_DEFINE_UNQUOTED([STARPU_RELEASE_VERSION], [$STARPU_RELEASE_VERSION], [Release version number of StarPU.]) . "$srcdir/STARPU-VERSION" AC_SUBST([LIBSTARPU_INTERFACE_CURRENT]) AC_SUBST([LIBSTARPU_INTERFACE_REVISION]) AC_SUBST([LIBSTARPU_INTERFACE_AGE]) AC_SUBST([LIBSTARPUMPI_INTERFACE_CURRENT]) AC_SUBST([LIBSTARPUMPI_INTERFACE_REVISION]) AC_SUBST([LIBSTARPUMPI_INTERFACE_AGE]) AC_SUBST([LIBSTARPUFFT_INTERFACE_CURRENT]) AC_SUBST([LIBSTARPUFFT_INTERFACE_REVISION]) AC_SUBST([LIBSTARPUFFT_INTERFACE_AGE]) AC_SUBST([LIBSOCL_INTERFACE_CURRENT]) AC_SUBST([LIBSOCL_INTERFACE_REVISION]) AC_SUBST([LIBSOCL_INTERFACE_AGE]) AC_CANONICAL_SYSTEM dnl Automake 1.11 introduced `silent-rules' and `color-tests'. Use them dnl when they're available. dnl do not use option subdir-objects, it causes fortran compilation to fail m4_ifdef([AM_SILENT_RULES], [AM_INIT_AUTOMAKE([1.11 -Wall foreign silent-rules color-tests parallel-tests])], [AM_INIT_AUTOMAKE([1.10 -Wall foreign])]) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES(yes)]) AC_PREREQ(2.64) m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) AC_PROG_CC AM_PROG_CC_C_O AC_PROG_CXX AC_PROG_CPP AC_PROG_SED AC_PROG_LN_S AC_PROG_F77 AC_PROG_FC AC_CHECK_PROGS(PROG_STAT,gstat stat) AC_CHECK_PROGS(PROG_DATE,gdate date) AC_OPENMP if test x$enable_perf_debug = xyes; then enable_shared=no fi LT_PREREQ([2.2]) LT_INIT([win32-dll]) AC_PROG_INSTALL AC_PROG_MKDIR_P AC_PROG_LN_S AC_HEADER_STDC AC_C_RESTRICT # Check if bash is available AC_CHECK_PROGS([BASH], [bash]) # Check whether subversion is installed AC_PATH_PROG(svncommand, svn) AC_PATH_PROG(svnversioncommand, svnversion) # find out if we are are in a subversion directory svndir=0 if test "$svncommand" != "" ; then $svncommand info $srcdir >/dev/null 2>&1 if test $? -eq 0; then svndir=1 fi fi # use svnversion to record the current repository revision only if # subversion is installed and we are in a working copy if test "$svnversioncommand" = "" || test "`LC_ALL=C $svnversioncommand -n $srcdir`" = "exported" ; then if test -f $srcdir/STARPU-REVISION ; then cp $srcdir/STARPU-REVISION . else echo "unknown" > ./STARPU-REVISION fi else LC_ALL=C svnversion $srcdir > ./STARPU-REVISION fi AM_CONDITIONAL([STARPU_CROSS_COMPILING], [test "x$cross_compiling" = "xyes"]) ############################################################################### # # # MIC device compilation # # (Must be done in beginning to change prefix in the whole configuration) # # # ############################################################################### AC_ARG_ENABLE(mic, [AS_HELP_STRING([--enable-mic], [use MIC device(s)])], [enable_mic=$enableval], [enable_mic=no]) AC_ARG_ENABLE(mic-rma, [AS_HELP_STRING([--disable-mic-rma], [use MIC RMA transfer])], [enable_mic_rma=$enableval], [enable_mic_rma=yes]) if test x$enable_mic = xyes ; then AC_DEFINE(STARPU_USE_MIC, [1], [MIC workers support is enabled]) fi if test x$enable_mic_rma = xyes ; then AC_DEFINE([STARPU_MIC_USE_RMA], [1], [MIC RMA transfer is enable]) fi AM_CONDITIONAL([STARPU_USE_MIC], [test "x$enable_mic" = "xyes"]) ############################################################################### AC_PATH_PROGS([STARPU_MS_LIB], [lib]) AC_ARG_VAR([STARPU_MS_LIB], [Path to Microsoft's Visual Studio `lib' tool]) AM_CONDITIONAL([STARPU_HAVE_MS_LIB], [test "x$STARPU_MS_LIB" != "x"]) case "$target" in *-*-mingw*|*-*-cygwin*) starpu_windows=yes libext=a AC_DEFINE(STARPU_HAVE_WINDOWS, [1], [Define this on windows.]) ;; *-*-linux*) starpu_linux=yes AC_DEFINE(STARPU_LINUX_SYS, [1], [Define to 1 on Linux]) ;; *-*-openbsd*) starpu_openbsd=yes AC_DEFINE(STARPU_OPENBSD_SYS, [1], [Define to 1 on OpenBSD systems]) ;; *-*darwin*) starpu_darwin=yes AC_DEFINE(STARPU_HAVE_DARWIN, [1], [Define this on darwin.]) ;; esac AM_CONDITIONAL([STARPU_HAVE_WINDOWS], [test "x$starpu_windows" = "xyes"]) AM_CONDITIONAL([STARPU_LINUX_SYS], [test "x$starpu_linux" = "xyes"]) AM_CONDITIONAL([STARPU_HAVE_DARWIN], [test "x$starpu_darwin" = "xyes"]) AM_CONDITIONAL([STARPU_OPENBSD_SYS], [test "x$starpu_openbsd" = "xyes"]) # on Darwin, GCC targets i386 by default, so we don't have atomic ops AC_CHECK_SIZEOF([void *]) SIZEOF_VOID_P=$ac_cv_sizeof_void_p case $SIZEOF_VOID_P in 4) case "$target" in i386-*darwin*) CFLAGS+=" -march=i686 " ;; esac STARPU_MS_LIB_ARCH=X86 ;; 8) STARPU_MS_LIB_ARCH=X64 ;; esac AC_SUBST(STARPU_MS_LIB_ARCH) # This will be useful for program which use CUDA (and .cubin files) which need # some path to the CUDA code at runtime. AC_DEFINE_UNQUOTED(STARPU_BUILD_DIR, "$PWD", [location of StarPU build directory]) AC_SUBST(STARPU_BUILD_DIR, $PWD) case "${srcdir}" in /*) AC_DEFINE_UNQUOTED(STARPU_SRC_DIR, "$(eval echo ${srcdir})", [location of StarPU sources]) AC_SUBST(STARPU_SRC_DIR, "$(eval echo ${srcdir})") ;; *) AC_DEFINE_UNQUOTED(STARPU_SRC_DIR, "$(eval echo $PWD/${srcdir})", [location of StarPU sources]) AC_SUBST(STARPU_SRC_DIR, "$(eval echo $PWD/${srcdir})") ;; esac case "$target" in *-*-mingw*|*-*-cygwin*) AC_ARG_ENABLE(native-winthreads, [AS_HELP_STRING([--enable-native-winthreads], [Use native windows threads instead of pthread])], enable_native_winthreads=$enableval, enable_native_winthreads=no) ;; esac if test x"$enable_native_winthreads" != xyes then INCLUDE_PTHREAD_H='#include ' fi AC_CHECK_HEADERS([unistd.h], [AC_DEFINE([STARPU_HAVE_UNISTD_H], [1], [Define to 1 if you have the header file.])]) AC_CHECK_TYPE([struct timespec], AC_DEFINE(STARPU_HAVE_STRUCT_TIMESPEC,[1],[struct timespec is defined]), [], [ #include #include #ifdef HAVE_UNISTD_H #include #endif #include $INCLUDE_PTHREAD_H ]) if test x"$enable_native_winthreads" = xyes then CPPFLAGS+=" -I$STARPU_SRC_DIR/include/pthread_win32 " AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[ #define STARPU_CONFIGURE #include ]], [[ pthread_t t; pthread_create(&t, NULL, NULL, NULL); ]])], AC_DEFINE(STARPU_NATIVE_WINTHREADS,[1],[Using native windows threads]), AC_MSG_ERROR([pthread_create unavailable])) else AC_CHECK_LIB([pthread], [pthread_create]) fi AC_SEARCH_LIBS([sqrt],[m],,AC_MSG_ERROR([math library unavailable])) AC_HAVE_LIBRARY([ws2_32]) AC_CHECK_FUNCS([sysconf]) AC_CHECK_FUNCS([getrlimit]) AC_CHECK_FUNC([pthread_spin_lock], have_pthread_spin_lock=yes, have_pthread_spin_lock=no) if test x$have_pthread_spin_lock = xyes; then AC_DEFINE(HAVE_PTHREAD_SPIN_LOCK,[1],[pthread_spin_lock is available]) AC_DEFINE(STARPU_HAVE_PTHREAD_SPIN_LOCK,[1],[pthread_spin_lock is available]) fi AC_CHECK_FUNC([pthread_barrier_init], have_pthread_barrier=yes, have_pthread_barrier=no) if test x$have_pthread_barrier = xyes; then AC_DEFINE(STARPU_HAVE_PTHREAD_BARRIER,[1],[pthread_barrier is available]) fi # yes, that's non portable, but it's still better than sched_setaffinity AC_CHECK_FUNCS(pthread_setaffinity_np) AC_CHECK_FUNC([pthread_setname_np], have_pthread_setname_np=yes, have_pthread_setname_np=no) if test x$have_pthread_setname_np = xyes; then AC_DEFINE(STARPU_HAVE_PTHREAD_SETNAME_NP,[1],[pthread_setname_np is available]) fi # There is no posix_memalign on Mac OS X, only memalign AC_CHECK_FUNCS([posix_memalign], [AC_DEFINE([STARPU_HAVE_POSIX_MEMALIGN], [1], [Define to 1 if you have the `posix_memalign' function.])]) AC_CHECK_FUNCS([memalign], [AC_DEFINE([STARPU_HAVE_MEMALIGN], [1], [Define to 1 if you have the `memalign' function.])]) # Some systems don't have drand48 AC_CHECK_FUNC([drand48], have_drand48=yes, have_drand48=no) AC_CHECK_FUNC([erand48_r], have_erand48_r=yes, have_erand48_r=no) # Maybe the user still does not want to use the provided drand48 AC_ARG_ENABLE(default-drand48, [AS_HELP_STRING([--disable-default-drand48], [Do not use the default version of drand48])], enable_default_drand48=$enableval, enable_default_drand48=yes) if test x$have_drand48 = xyes -a x$enable_default_drand48 = xyes ; then AC_DEFINE([STARPU_USE_DRAND48], [1], [Define to 1 if drandr48 is available and should be used]) fi if test x$have_erand48_r = xyes ; then AC_DEFINE([STARPU_USE_ERAND48_R], [1], [Define to 1 if erandr48_r is available]) fi # Some systems do not define strerror_r AC_CHECK_FUNC([strerror_r], [AC_DEFINE([STARPU_HAVE_STRERROR_R], [1], [Define to 1 if the function strerro_r is available.])]) # Some systems may not define setenv AC_CHECK_FUNC([setenv], [AC_DEFINE([STARPU_HAVE_SETENV], [1], [Define to 1 if the function setenv is available.])]) # Some systems do not define unsetenv AC_CHECK_FUNC([unsetenv], [AC_DEFINE([STARPU_HAVE_UNSETENV], [1], [Define to 1 if the function unsetenv is available.])]) # Some systems do not define nearbyintf... AC_CHECK_FUNC([nearbyintf], [AC_DEFINE([STARPU_HAVE_NEARBYINTF], [1], [Define to 1 if the function nearbyintf is available.])]) # ... but they may define rintf. AC_CHECK_FUNC([rintf], [AC_DEFINE([STARPU_HAVE_RINTF], [1], [Define to 1 if the function rintf is available.])]) # Define quick check AC_ARG_ENABLE(quick-check, [AS_HELP_STRING([--enable-quick-check], [Lower default values for the testcases run by make check to allow a faster execution])], enable_quick_check=$enableval, enable_quick_check=no) if test x$enable_quick_check = xyes; then AC_DEFINE(STARPU_QUICK_CHECK, [1], [enable quick check]) fi AM_CONDITIONAL([STARPU_QUICK_CHECK], [test "x$enable_quick_check" = "xyes"]) # Define long check AC_ARG_ENABLE(long-check, [AS_HELP_STRING([--enable-long-check], [Enable some exhaustive checks which take a really long time])], enable_long_check=$enableval, enable_long_check=no) if test x$enable_long_check = xyes; then AC_DEFINE(STARPU_LONG_CHECK, [1], [enable long check]) fi AM_CONDITIONAL([STARPU_LONG_CHECK], [test "x$enable_long_check" = "xyes"]) # Define new check AC_ARG_ENABLE(new-check, [AS_HELP_STRING([--enable-new-check], [Enable new and known-to-fail testcases])], enable_new_check=$enableval, enable_new_check=no) if test x$enable_new_check = xyes; then AC_DEFINE(STARPU_NEW_CHECK, [1], [enable new check]) fi AM_CONDITIONAL([STARPU_NEW_CHECK], [test "x$enable_new_check" = "xyes"]) AC_CHECK_HEADERS([malloc.h], [AC_DEFINE([STARPU_HAVE_MALLOC_H], [1], [Define to 1 if you have the header file.])]) AC_ARG_ENABLE(valgrind, [AS_HELP_STRING([--disable-valgrind], [Do not check the availability of valgrind.h and helgrind.h])], enable_valgrind=$enableval, enable_valgrind=yes) if test "$enable_valgrind" != "no" ; then AC_CHECK_HEADERS([valgrind/valgrind.h], [AC_DEFINE([STARPU_HAVE_VALGRIND_H], [1], [Define to 1 if you have the header file.])]) AC_CHECK_HEADERS([valgrind/memcheck.h], [AC_DEFINE([STARPU_HAVE_MEMCHECK_H], [1], [Define to 1 if you have the header file.])]) AC_CHECK_HEADERS([valgrind/helgrind.h], [AC_DEFINE([STARPU_HAVE_HELGRIND_H], [1], [Define to 1 if you have the header file.])]) fi if test "$enable_valgrind" = "full" ; then AC_DEFINE([STARPU_VALGRIND_FULL], [1], [Define to 1 to disable STARPU_SKIP_IF_VALGRIND when running tests.]) fi AC_CHECK_FUNC([sched_yield], [AC_DEFINE([STARPU_HAVE_SCHED_YIELD], [1], [Define to 1 if the function sched_yield is available.])]) AC_CHECK_HEADERS([aio.h]) AC_CHECK_LIB([rt], [aio_read]) #AC_CHECK_HEADERS([libaio.h]) #AC_CHECK_LIB([aio], [io_setup]) AC_CHECK_FUNCS([mkostemp]) AC_CHECK_FUNCS([mkdtemp]) AC_CHECK_FUNCS([pread pwrite]) # This defines HAVE_SYNC_VAL_COMPARE_AND_SWAP STARPU_CHECK_SYNC_VAL_COMPARE_AND_SWAP # This defines HAVE_SYNC_BOOL_COMPARE_AND_SWAP STARPU_CHECK_SYNC_BOOL_COMPARE_AND_SWAP # This defines HAVE_SYNC_FETCH_AND_ADD STARPU_CHECK_SYNC_FETCH_AND_ADD # This defines HAVE_SYNC_FETCH_AND_OR STARPU_CHECK_SYNC_FETCH_AND_OR # This defines HAVE_SYNC_LOCK_TEST_AND_SET STARPU_CHECK_SYNC_LOCK_TEST_AND_SET # This defines HAVE_SYNC_SYNCHRONIZE STARPU_CHECK_SYNC_SYNCHRONIZE CPPFLAGS="${CPPFLAGS} -D_GNU_SOURCE " STARPU_SEARCH_LIBS([LIBNUMA],[set_mempolicy],[numa],[enable_libnuma=yes],[enable_libnuma=no]) AC_MSG_CHECKING(whether libnuma is available) AC_MSG_RESULT($enable_libnuma) if test x$enable_libnuma = xyes; then AC_DEFINE(STARPU_HAVE_LIBNUMA,[1],[libnuma is available]) fi AC_MSG_CHECKING(whether statement expressions are available) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #define maxint(a,b) ({int _a = (a), _b = (b); _a > _b ? _a : _b; }) ]], [[ int x=maxint(12,42); ]])], [statement_expressions="yes"], [statement_expressions="no"]) AC_MSG_RESULT($statement_expressions) if test x$statement_expressions = xyes; then AC_DEFINE(STARPU_HAVE_STATEMENT_EXPRESSIONS,[1],[statement expressions are available]) fi ############################################################################### # # # SCHED_CTX settings # # # ############################################################################### AC_MSG_CHECKING(maximum number of sched_ctxs) AC_ARG_ENABLE(max_sched_ctxs, [AS_HELP_STRING([--enable-max-sched-ctxs=], [maximum number of sched_ctxs])], max_sched_ctxs=$enableval, max_sched_ctxs=10) AC_MSG_RESULT($max_sched_ctxs) AC_DEFINE_UNQUOTED(STARPU_NMAX_SCHED_CTXS, [$max_sched_ctxs], [Maximum number of sched_ctxs supported]) AC_ARG_ENABLE([sc_hypervisor], [AS_HELP_STRING([--enable-sc-hypervisor], [enable resizing contexts (experimental)])], [enable_sc_hypervisor="yes"], [enable_sc_hypervisor="no"]) #for pkgconfig AC_SUBST(STARPU_SC_HYPERVISOR) if test "x$enable_sc_hypervisor" = "xyes"; then AC_DEFINE(STARPU_USE_SC_HYPERVISOR, [1], [enable sc_hypervisor lib]) # PKG_CHECK_MODULES([SC_HYPERVISOR], [libsc_hypervisor], [], build_sc_hypervisor="yes") STARPU_SC_HYPERVISOR="-lsc_hypervisor" build_sc_hypervisor="yes" else build_sc_hypervisor="no" fi AM_CONDITIONAL([STARPU_BUILD_SC_HYPERVISOR], [test "x$build_sc_hypervisor" = "xyes"]) AM_CONDITIONAL([STARPU_USE_SC_HYPERVISOR], [test "x$build_sc_hypervisor" = "xyes"]) AC_ARG_ENABLE([sc_hypervisor_debug], [AS_HELP_STRING([--enable-sc-hypervisor-debug], [enable debug for resizing contexts (experimental)])], [enable_sc_hypervisor_debug="yes"], [enable_sc_hypervisor_debug="no"]) AC_SUBST(STARPU_SC_HYPERVISOR_DEBUG, $enable_sc_hypervisor_debug) AM_CONDITIONAL([STARPU_SC_HYPERVISOR_DEBUG], [test "x$enable_sc_hypervisor_debug" = "xyes"]) if test "x$enable_sc_hypervisor_debug" = "xyes"; then AC_DEFINE(STARPU_SC_HYPERVISOR_DEBUG, [1], [enable debug sc_hypervisor]) fi ############################################################################### # # # CPUs settings # # # ############################################################################### AC_MSG_CHECKING(maximum number of CPUs) AC_ARG_ENABLE(maxcpus, [AS_HELP_STRING([--enable-maxcpus=], [maximum number of CPUs])], maxcpus=$enableval, maxcpus=64) AC_MSG_RESULT($maxcpus) AC_DEFINE_UNQUOTED(STARPU_MAXCPUS, [$maxcpus], [Maximum number of CPUs supported]) AC_MSG_CHECKING(whether CPUs should be used) AC_ARG_ENABLE(cpu, [AS_HELP_STRING([--disable-cpu], [do not use the CPU(s)])], enable_cpu=$enableval, enable_cpu=yes) AC_MSG_RESULT($enable_cpu) AC_SUBST(STARPU_USE_CPU, $enable_cpu) AM_CONDITIONAL(STARPU_USE_CPU, test x$enable_cpu = xyes) if test x$enable_cpu = xyes; then AC_DEFINE(STARPU_USE_CPU, [1], [CPU driver is activated]) fi ############################################################################### # # # CUDA settings # # # ############################################################################### AC_MSG_CHECKING(maximum number of CUDA devices) AC_ARG_ENABLE(maxcudadev, [AS_HELP_STRING([--enable-maxcudadev=], [maximum number of CUDA devices])], nmaxcudadev=$enableval, nmaxcudadev=4) AC_MSG_RESULT($nmaxcudadev) AC_DEFINE_UNQUOTED(STARPU_MAXCUDADEVS, [$nmaxcudadev], [maximum number of CUDA devices]) AC_ARG_ENABLE(cuda, [AS_HELP_STRING([--disable-cuda], [do not use CUDA device(s)])],, [enable_cuda=maybe]) #AC_MSG_CHECKING(whether CUDA is available) AC_ARG_WITH(cuda-dir, [AS_HELP_STRING([--with-cuda-dir=], [specify CUDA installation directory])], [ cuda_dir="$withval" # in case this was not explicit yet enable_cuda=yes ], cuda_dir=no) AC_ARG_WITH(cuda-include-dir, [AS_HELP_STRING([--with-cuda-include-dir=], [specify where CUDA headers are installed])], [ cuda_include_dir="$withval" # in case this was not explicit yet enable_cuda=yes ], [cuda_include_dir=no]) AC_ARG_WITH(cuda-lib-dir, [AS_HELP_STRING([--with-cuda-lib-dir=], [specify where CUDA libraries are installed])], [ cuda_lib_dir="$withval" # in case this was not explicit yet enable_cuda=yes ], [cuda_lib_dir=no]) AC_DEFUN([STARPU_CHECK_CUDA_L], [ __cuda_L=$1 SAVED_LDFLAGS="${LDFLAGS}" STARPU_CUDA_LDFLAGS="${__cuda_L}" AC_MSG_CHECKING(whether CUDA is available with: $__cuda_L) AC_MSG_RESULT() LDFLAGS="${SAVED_LDFLAGS} ${__cuda_L}" AC_HAVE_LIBRARY([cuda],[have_valid_cuda=yes],[have_valid_cuda=no]) unset ac_cv_lib_cuda_main if test "$have_valid_cuda" = "yes" ; then AC_HAVE_LIBRARY([cudart],[have_valid_cuda=yes],[have_valid_cuda=no]) unset ac_cv_lib_cudart_main if test "$have_valid_cuda" = yes ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcudart" LDFLAGS="${SAVED_LDFLAGS} ${STARPU_CUDA_LDFLAGS}" # we also check that CUBLAS is available AC_HAVE_LIBRARY([cublas],[have_valid_cuda=yes],[have_valid_cuda=no]) unset ac_cv_lib_cublas_main if test "$have_valid_cuda" = "yes" ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcublas" fi fi fi LDFLAGS="${SAVED_LDFLAGS}" ]) AC_DEFUN([STARPU_CHECK_CUDA], [ __cuda_dir=$1 __cuda_include_dir=$2 __cuda_lib_dir=$3 if test -z "$__cuda_lib_dir" ; then __cuda_lib_dir=no fi if test -z "$__cuda_include_dir" ; then __cuda_include_dir=no fi if test -z "$__cuda_dir" ; then __cuda_dir=no fi if test "$__cuda_dir" != "no" ; then AC_MSG_CHECKING(whether CUDA is available in $__cuda_dir, $__cuda_include_dir and $__cuda_lib_dir) else AC_MSG_CHECKING(whether CUDA is available) fi AC_MSG_RESULT() if test "$__cuda_include_dir" = "no" -a "$__cuda_dir" != "no" ; then __cuda_include_dir="$__cuda_dir/include" fi SAVED_CPPFLAGS="$CPPFLAGS" have_valid_cuda=no if test "$__cuda_include_dir" != "no" ; then CPPFLAGS="${CPPFLAGS} -I$__cuda_include_dir" fi AC_CHECK_HEADER([cuda.h],[have_valid_cuda=yes],[have_valid_cuda=no]) unset ac_cv_header_cuda_h if test "$have_valid_cuda" = "yes" ; then if test "$__cuda_lib_dir" != "no" ; then STARPU_CHECK_CUDA_L("-L${__cuda_lib_dir}") else if test "$__cuda_dir" != "no" ; then for __cuda_libdir in lib64 lib lib/x64 lib/Win32 ; do STARPU_CHECK_CUDA_L("-L${__cuda_dir}/${__cuda_libdir}") if test "$have_valid_cuda" = yes ; then break fi done else STARPU_CHECK_CUDA_L("") fi fi fi if test "$have_valid_cuda" = "no" ; then CPPFLAGS="${SAVED_CPPFLAGS}" unset STARPU_CUDA_LDFLAGS else if test "$NVCC" = "" ; then AC_PATH_PROG([NVCC], [nvcc], [not-found], [$cuda_dir/bin:$PATH:/usr/local/cuda/bin:/usr/bin:/bin]) fi if test "x$NVCC" = "xnot-found"; then AC_MSG_WARN(['nvcc' not found, disabling CUDA]) have_valid_cuda=no else # This is for very old cuda, to enable the use of double etc. AC_MSG_CHECKING(whether nvcc supports sm_13 architecture) OLD_NVCCFLAGS="$NVCCFLAGS" NVCCFLAGS="$NVCCFLAGS -arch sm_13" echo "int main(int argc, char **argv) { return 0;}" > cuda_test.cu $NVCC $NVCCFLAGS -c cuda_test.cu >/dev/null 2>&1 if test $? -eq 0 then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) NVCCFLAGS="$OLD_NVCCFLAGS" fi # This is for recent cuda, which complains if we don't actually set an arch!? AC_MSG_CHECKING(whether nvcc supports -Wno-deprecated-gpu-targets) OLD_NVCCFLAGS="$NVCCFLAGS" NVCCFLAGS="$NVCCFLAGS -Wno-deprecated-gpu-targets" echo "int main(int argc, char **argv) { return 0;}" > cuda_test.cu $NVCC $NVCCFLAGS -c cuda_test.cu >/dev/null 2>&1 if test $? -eq 0 then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) NVCCFLAGS="$OLD_NVCCFLAGS" fi rm -f cuda_test* fi if test -n "$NVCC_CC"; then NVCCFLAGS="${NVCCFLAGS} -ccbin \${NVCC_CC}" fi if test "$__cuda_include_dir" != "no"; then STARPU_CUDA_CPPFLAGS="-I$__cuda_include_dir" NVCCFLAGS="${NVCCFLAGS} -I$__cuda_include_dir" fi fi ]) if test x$enable_cuda = xyes -o x$enable_cuda = xmaybe; then STARPU_CHECK_CUDA("$cuda_dir", "$cuda_include_dir", "$cuda_lib_dir") if test "$have_valid_cuda" = "no" ; then STARPU_CHECK_CUDA("$CUDA_ROOT", "$CUDA_PATH", "$CUDA_INC_PATH", "$CUDA_LIB_PATH") fi if test "$have_valid_cuda" = "no" ; then for f in "/usr/local/cuda" "/c/cuda" "/cygdrive/c/cuda" "/opt/cuda" "$CUDA_ROOT" "$CUDA_PATH" "$CUDA_INC_PATH/.." "$CUDA_INC/.." "$CUDA_BIN/.." "$CUDA_SDK/.." "$CUDA_INSTALL_PATH" "$CUDA_TOOLKIT"; do if test -n "$f" ; then STARPU_CHECK_CUDA("$f", "no", "no") if test "$have_valid_cuda" = "yes" ; then break fi fi done fi # Check cuda is compatible with the C compiler AC_MSG_CHECKING(whether CUDA is working) if test "$have_valid_cuda" = "yes" ; then SAVED_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${CPPFLAGS} ${STARPU_CUDA_CPPFLAGS}" SAVED_LDFLAGS="${LDFLAGS}" LDFLAGS="${LDFLAGS} ${STARPU_CUDA_LDFLAGS} -lcuda" AC_COMPILE_IFELSE([AC_LANG_PROGRAM( [[#include ]], [[]] )], [ AC_RUN_IFELSE([AC_LANG_PROGRAM( [[#include ]], [[]] )], [have_valid_cuda="yes"], [ AC_MSG_RESULT([CUDA found and can be compiled, but compiled application can not be run, is the CUDA path missing in LD_LIBRARY_PATH?]) have_valid_cuda="no" ]) ], [ AC_MSG_ERROR([CUDA found, but cuda.h could not be compiled]) have_valid_cuda="no" ] ) CPPFLAGS="${SAVED_CPPFLAGS}" LDFLAGS="${SAVED_LDFLAGS}" fi AC_MSG_RESULT($have_valid_cuda) # in case CUDA was explicitely required, but is not available, this is an error if test x$enable_cuda = xyes -a x$have_valid_cuda = xno; then AC_MSG_ERROR([cannot find CUDA]) fi # now we enable CUDA if and only if a proper setup is available enable_cuda=$have_valid_cuda fi AC_MSG_CHECKING(whether CUDA should be used) AC_MSG_RESULT($enable_cuda) AC_SUBST(STARPU_USE_CUDA, $enable_cuda) AM_CONDITIONAL(STARPU_USE_CUDA, test x$enable_cuda = xyes) if test x$enable_cuda = xyes; then AC_DEFINE(STARPU_USE_CUDA, [1], [CUDA support is activated]) # On Darwin, the libstdc++ dependency is not automatically added by nvcc # case "$target" in # *-*darwin*) AC_HAVE_LIBRARY([stdc++], []) ;; # #*-*darwin*) AC_HAVE_LIBRARY([stdc++], [STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lstdc++"]) ;; # esac STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcuda" STARPU_CUFFT_LDFLAGS="-lcufft" if test "$F77" = "gfortran" -o "$FC" = "gfortran" ; then STARPU_CUDA_FORTRAN_LDFLAGS="-lgfortran" AC_SUBST(STARPU_CUDA_FORTRAN_LDFLAGS) fi #in case this is a 64bit setup, we tell nvcc to use a -m64 flag if test x$SIZEOF_VOID_P = x8; then NVCCFLAGS="${NVCCFLAGS} -m64" fi AC_CHECK_HEADERS([cuda_gl_interop.h]) AC_CHECK_LIB([cusparse], [cusparseCreate]) AC_CHECK_DECLS([cusparseSetStream], [], [], [[#include ]]) fi dnl Hey dude, are you around? PKG_PROG_PKG_CONFIG have_magma=no if test x$enable_cuda = xyes; then PKG_CHECK_MODULES([MAGMA], [magma], [ AC_DEFINE([STARPU_HAVE_MAGMA], [1], [Define to 1 if you have the MAGMA library.]) AC_SUBST([STARPU_HAVE_MAGMA], [1]) have_magma=yes ], [:]) fi AM_CONDITIONAL(STARPU_HAVE_MAGMA, [test x$have_magma = xyes]) AC_MSG_CHECKING(whether MAGMA should be used) AC_MSG_RESULT($have_magma) # cufftDoubleComplex may not be available on an old CUDA setup AC_CHECK_TYPE(cufftDoubleComplex, [have_cufftdoublecomplex=yes], [have_cufftdoublecomplex=no], [#include ]) AM_CONDITIONAL(STARPU_HAVE_CUFFTDOUBLECOMPLEX, test x$have_cufftdoublecomplex = xyes) if test x$have_cufftdoublecomplex = xyes; then AC_DEFINE(STARPU_HAVE_CUFFTDOUBLECOMPLEX, [1], [cufftDoubleComplex is available]) fi # The CURAND library is only available since CUDA 3.2 have_curand=$enable_cuda if test x$enable_cuda = xyes; then SAVED_LDFLAGS="${LDFLAGS}" LDFLAGS="${LDFLAGS} ${STARPU_CUDA_LDFLAGS}" AC_HAVE_LIBRARY([curand],[have_curand=yes],[have_curand=no]) LDFLAGS="${SAVED_LDFLAGS}" fi AC_MSG_CHECKING(whether CURAND is available) AC_MSG_RESULT($have_curand) if test x$have_curand = xyes; then AC_DEFINE(STARPU_HAVE_CURAND,[1], [CURAND is available]) STARPU_CURAND_LDFLAGS="$STARPU_CURAND_LDFLAGS -lcurand" AC_SUBST(STARPU_CURAND_LDFLAGS) fi # Peer transfers are only supported since CUDA 4.0 # Disable them if user explicity wants to disable them AC_ARG_ENABLE(cuda_memcpy_peer, [AS_HELP_STRING([--disable-cuda-memcpy-peer], [do not allow peer transfers when using CUDA 4.0])],, [enable_cuda_memcpy_peer=yes]) have_cuda_memcpy_peer=no if test x$enable_cuda_memcpy_peer = xyes -a x$enable_cuda = xyes ; then SAVED_LDFLAGS="${LDFLAGS}" LDFLAGS="${LDFLAGS} ${STARPU_CUDA_LDFLAGS}" AC_CHECK_FUNC([cudaMemcpyPeer], have_cuda_memcpy_peer=yes, have_cuda_memcpy_peer=no) LDFLAGS="${SAVED_LDFLAGS}" fi if test x$have_cuda_memcpy_peer = xyes; then AC_DEFINE(HAVE_CUDA_MEMCPY_PEER,[1],[Peer transfers are supported in CUDA]) fi if test x$enable_cuda = xyes; then if test x$starpu_windows != xyes ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lstdc++" fi AC_SUBST(STARPU_CUDA_LDFLAGS) AC_SUBST(STARPU_CUFFT_LDFLAGS) AC_SUBST(STARPU_CUDA_CPPFLAGS) fi AC_ARG_VAR([NVCC], [CUDA compiler]) AC_ARG_VAR([NVCC_CC], [C compiler for CUDA compiler]) AC_ARG_VAR([NVCCFLAGS], [CUDA compiler flags]) ############################################################################### # # # OpenCL settings # # # ############################################################################### AC_MSG_CHECKING(maximum number of OpenCL devices) AC_ARG_ENABLE(maxopencldev, [AS_HELP_STRING([--enable-maxopencldev=], [maximum number of OPENCL devices])], nmaxopencldev=$enableval, nmaxopencldev=8) AC_MSG_RESULT($nmaxopencldev) AC_DEFINE_UNQUOTED(STARPU_MAXOPENCLDEVS, [$nmaxopencldev], [maximum number of OPENCL devices]) AC_ARG_ENABLE(opencl, [AS_HELP_STRING([--disable-opencl], [do not use OpenCL device(s)])],, [enable_opencl=maybe]) have_valid_opencl=no AC_DEFUN([STARPU_CHECK_OPENCL], [ __opencl_dir=$1 __opencl_include_dir=$2 __opencl_lib_dir=$3 if test "$__opencl_dir" != "no" ; then AC_MSG_CHECKING(whether OpenCL is available in $__opencl_dir $__opencl_include_dir and $__opencl_lib_dir) else AC_MSG_CHECKING(whether OpenCL is available) fi AC_MSG_RESULT() if test "$__opencl_include_dir" = "no" -a "$__opencl_dir" != "no" ; then __opencl_include_dir="$__opencl_dir/include" fi SAVED_CPPFLAGS="$CPPFLAGS" SAVED_LDFLAGS="${LDFLAGS}" if test "$__opencl_include_dir" != "no" ; then CPPFLAGS="${CPPFLAGS} -I$__opencl_include_dir" fi AC_CHECK_HEADER([CL/cl.h],[have_valid_opencl=yes],[have_valid_opencl=no]) unset ac_cv_header_CL_cl_h if test "$have_valid_opencl" = "yes" ; then if test "$__opencl_lib_dir" != "no"; then LDFLAGS="${SAVED_LDFLAGS} -L$__opencl_lib_dir" AC_HAVE_LIBRARY([OpenCL],[have_valid_opencl=yes],[have_valid_opencl=no]) unset ac_cv_lib_OpenCL_main else AC_MSG_CHECKING(whether OpenCL is available in $__opencl_dir) AC_MSG_RESULT() AC_HAVE_LIBRARY([OpenCL],[have_valid_opencl=yes],[have_valid_opencl=no]) unset ac_cv_lib_OpenCL_main if test "$have_valid_opencl" = "no" -a "$__opencl_dir" != "no" ; then for __cuda_libdir in lib64 lib lib/x86 lib/Win32 ; do __opencl_lib_dir="$__opencl_dir/$__cuda_libdir" AC_MSG_CHECKING(whether OpenCL is available in $__opencl_dir and $__opencl_lib_dir) AC_MSG_RESULT() LDFLAGS="${SAVED_LDFLAGS} -L$__opencl_lib_dir" AC_HAVE_LIBRARY([OpenCL],[have_valid_opencl=yes],[have_valid_opencl=no]) unset ac_cv_lib_OpenCL_main if test "$have_valid_opencl" = yes ; then break fi done else LDFLAGS="${SAVED_LDFLAGS}" AC_HAVE_LIBRARY([OpenCL],[have_valid_opencl=yes],[have_valid_opencl=no]) unset ac_cv_lib_OpenCL_main fi fi fi if test "$have_valid_opencl" = "yes" -a "$__opencl_include_dir" != "no"; then STARPU_OPENCL_CPPFLAGS="-I$__opencl_include_dir" AC_CHECK_HEADERS([CL/cl_ext.h]) fi CPPFLAGS="${SAVED_CPPFLAGS}" LDFLAGS="${SAVED_LDFLAGS}" if test "$have_valid_opencl" = "yes" ; then if test "$__opencl_lib_dir" != "no"; then STARPU_OPENCL_LDFLAGS="-L$__opencl_lib_dir" fi STARPU_OPENCL_LDFLAGS="${STARPU_OPENCL_LDFLAGS} -lOpenCL" fi ]) #AC_MSG_CHECKING(whether OpenCL is available) AC_ARG_WITH(opencl-dir, [AS_HELP_STRING([--with-opencl-dir=], [specify OpenCL installation directory])], [ opencl_dir="$withval" # in case this was not explicit yet enable_opencl=yes ], opencl_dir=no) AC_ARG_WITH(opencl-include-dir, [AS_HELP_STRING([--with-opencl-include-dir=], [specify where OpenCL headers are installed])], [ opencl_include_dir="$withval" # in case this was not explicit yet enable_opencl=yes ], [opencl_include_dir=no]) AC_ARG_WITH(opencl-lib-dir, [AS_HELP_STRING([--with-opencl-lib-dir=], [specify where OpenCL libraries are installed])], [ opencl_lib_dir="$withval" # in case this was not explicit yet enable_opencl=yes ], [opencl_lib_dir=no]) AC_DEFUN([STARPU_LOOK_FOR_OPENCL], [ if test "x$has_opencl_being_checked" != "xyes" ; then STARPU_CHECK_OPENCL("$opencl_dir", "$opencl_include_dir", "$opencl_lib_dir") if test "$have_valid_opencl" = "no" ; then for f in "/usr/local/cuda" "/c/cuda" "/cygdrive/c/cuda" "/opt/cuda" "$CUDA_ROOT" "$CUDA_PATH" "$CUDA_INC_PATH/.." "$CUDA_INSTALL_PATH" "$CUDA_TOOLKIT"; do if test -n "$f" ; then STARPU_CHECK_OPENCL("$f", "no", "no") if test "$have_valid_opencl" = "yes" ; then break fi fi done fi has_opencl_being_checked=yes fi ]) if test x$enable_opencl = xyes -o x$enable_opencl = xmaybe; then case $target in *-*-darwin*) AC_MSG_CHECKING(whether OpenCL is available) SAVED_LIBS=$LIBS LIBS="$LIBS -framework OpenCL" AC_LINK_IFELSE( [AC_LANG_PROGRAM([[ #ifdef __APPLE_CC__ #include #else #include #endif ]], [[return clSetKernelArg(0, 0, 0, 0); ]])], [AC_MSG_RESULT(yes) enable_opencl=yes have_valid_opencl=yes STARPU_OPENCL_CPPFLAGS= STARPU_OPENCL_LDFLAGS="-framework OpenCL"], [AC_MSG_RESULT(no) enable_opencl=no]) LIBS=$SAVED_LIBS ;; *) STARPU_LOOK_FOR_OPENCL() # in case OpenCL was explicitely required, but is not available, this is an error if test x$enable_opencl = xyes -a x$have_valid_opencl = xno; then AC_MSG_ERROR([cannot find OpenCL]) fi # now we enable OpenCL if and only if a proper setup is available enable_opencl=$have_valid_opencl ;; esac save_LIBS="$LIBS" LIBS="$LIBS $STARPU_OPENCL_LDFLAGS" AC_CHECK_FUNCS([clEnqueueMarkerWithWaitList]) LIBS="$save_LIBS" fi AC_MSG_CHECKING(whether OpenCL should be used) AC_MSG_RESULT($enable_opencl) AC_SUBST(STARPU_USE_OPENCL, $enable_opencl) AM_CONDITIONAL(STARPU_USE_OPENCL, test x$enable_opencl = xyes) if test x$enable_opencl = xyes ; then AC_DEFINE(STARPU_USE_OPENCL, [1], [OpenCL support is activated]) STARPU_OPENCL_CPPFLAGS="${STARPU_OPENCL_CPPFLAGS} -DSTARPU_OPENCL_DATADIR=${datarootdir}/starpu/opencl -DCL_USE_DEPRECATED_OPENCL_1_1_APIS" AC_SUBST(STARPU_OPENCL_DATAdir, "$(eval echo ${datarootdir}/starpu/opencl/examples)") AC_SUBST(STARPU_OPENCL_CPPFLAGS) AC_SUBST(STARPU_OPENCL_LDFLAGS) fi ############################################################################### # # # General GPU settings # # # ############################################################################### AC_MSG_CHECKING(whether asynchronous copy should be disabled) AC_ARG_ENABLE(asynchronous-copy, [AS_HELP_STRING([--disable-asynchronous-copy], [disable asynchronous copy between CPU and GPU])], enable_asynchronous_copy=$enableval, enable_asynchronous_copy=yes) disable_asynchronous_copy=no if test x$enable_asynchronous_copy = xno ; then disable_asynchronous_copy=yes fi AC_MSG_RESULT($disable_asynchronous_copy) if test x$disable_asynchronous_copy = xyes ; then AC_DEFINE([STARPU_DISABLE_ASYNCHRONOUS_COPY], [1], [Define to 1 to disable asynchronous copy between CPU and GPU devices]) fi AC_MSG_CHECKING(whether asynchronous CUDA copy should be disabled) AC_ARG_ENABLE(asynchronous-cuda-copy, [AS_HELP_STRING([--disable-asynchronous-cuda-copy], [disable asynchronous copy between CPU and CUDA devices])], enable_asynchronous_cuda_copy=$enableval, enable_asynchronous_cuda_copy=yes) disable_asynchronous_cuda_copy=no if test x$enable_asynchronous_cuda_copy = xno ; then disable_asynchronous_cuda_copy=yes fi AC_MSG_RESULT($disable_asynchronous_cuda_copy) if test x$disable_asynchronous_cuda_copy = xyes ; then AC_DEFINE([STARPU_DISABLE_ASYNCHRONOUS_CUDA_COPY], [1], [Define to 1 to disable asynchronous copy between CPU and CUDA devices]) fi AC_MSG_CHECKING(whether asynchronous OpenCL copy should be disabled) AC_ARG_ENABLE(asynchronous-opencl-copy, [AS_HELP_STRING([--disable-asynchronous-opencl-copy], [disable asynchronous copy between CPU and OPENCL devices])], enable_asynchronous_opencl_copy=$enableval, enable_asynchronous_opencl_copy=yes) disable_asynchronous_opencl_copy=no if test x$enable_asynchronous_opencl_copy = xno ; then disable_asynchronous_opencl_copy=yes fi AC_MSG_RESULT($disable_asynchronous_opencl_copy) if test x$disable_asynchronous_opencl_copy = xyes ; then AC_DEFINE([STARPU_DISABLE_ASYNCHRONOUS_OPENCL_COPY], [1], [Define to 1 to disable asynchronous copy between CPU and OpenCL devices]) fi AC_MSG_CHECKING(whether asynchronous MIC copy should be disabled) AC_ARG_ENABLE(asynchronous-mic-copy, [AS_HELP_STRING([--disable-asynchronous-mic-copy], [disable asynchronous copy between CPU and MIC devices])], enable_asynchronous_mic_copy=$enableval, enable_asynchronous_mic_copy=yes) disable_asynchronous_mic_copy=no if test x$enable_asynchronous_mic_copy = xno ; then disable_asynchronous_mic_copy=yes fi AC_MSG_RESULT($disable_asynchronous_mic_copy) if test x$disable_asynchronous_mic_copy = xyes ; then AC_DEFINE([STARPU_DISABLE_ASYNCHRONOUS_MIC_COPY], [1], [Define to 1 to disable asynchronous copy between CPU and MIC devices]) fi ############################################################################### # # # Drivers # # # ############################################################################### AC_ARG_ENABLE(opencl-simulator, [AS_HELP_STRING([--enable-opencl-simulator], [Enable the use of an OpenCL simulator])], enable_opencl_simulator=$enableval, enable_opencl_simulator=no) if test x$enable_opencl_simulator = xyes; then enable_simgrid=yes AC_DEFINE(STARPU_OPENCL_SIMULATOR, [1], [Define this to enable using an OpenCL simulator]) fi AC_ARG_WITH(simgrid-dir, [AS_HELP_STRING([--with-simgrid-dir=], [specify SimGrid installation directory])], [ simgrid_dir="$withval" # in case this was not explicit yet enable_simgrid=yes ], simgrid_dir=no) AC_ARG_WITH(simgrid-include-dir, [AS_HELP_STRING([--with-simgrid-include-dir=], [specify where SimGrid headers are installed])], [ simgrid_include_dir="$withval" # in case this was not explicit yet enable_simgrid=yes ], [simgrid_include_dir=no]) AC_ARG_WITH(simgrid-lib-dir, [AS_HELP_STRING([--with-simgrid-lib-dir=], [specify where SimGrid libraries are installed])], [ simgrid_lib_dir="$withval" # in case this was not explicit yet enable_simgrid=yes ], [simgrid_lib_dir=no]) AC_ARG_ENABLE(simgrid, [AS_HELP_STRING([--enable-simgrid], [Enable simulating execution in simgrid])], enable_simgrid=$enableval, enable_simgrid=no) if test x$enable_simgrid = xyes ; then if test -n "$SIMGRID_CFLAGS" ; then CFLAGS="$SIMGRID_CFLAGS $CFLAGS" CXXFLAGS="$SIMGRID_CFLAGS $CXXFLAGS" NVCCFLAGS="$SIMGRID_CFLAGS $NVCCFLAGS" fi if test -n "$SIMGRID_LIBS" ; then LDFLAGS="$SIMGRID_LIBS $LDFLAGS" fi if test "$simgrid_dir" != "no" ; then CFLAGS="-I$simgrid_dir/include $CFLAGS" CXXFLAGS="-I$simgrid_dir/include $CXXFLAGS" NVCCFLAGS="-I$simgrid_dir/include $NVCCFLAGS" LDFLAGS="-L$simgrid_dir/lib $LDFLAGS" fi if test "$simgrid_include_dir" != "no" ; then CFLAGS="-I$simgrid_include_dir $CFLAGS" CXXFLAGS="-I$simgrid_include_dir $CXXFLAGS" NVCCFLAGS="-I$simgrid_include_dir $NVCCFLAGS" fi if test "$simgrid_lib_dir" != "no" ; then LDFLAGS="-L$simgrid_lib_dir $LDFLAGS" fi AC_HAVE_LIBRARY([simgrid], [], [ AC_MSG_ERROR(Simgrid support needs simgrid installed) ] ) AC_CHECK_HEADERS([simgrid/msg.h], [AC_DEFINE([STARPU_HAVE_SIMGRID_MSG_H], [1], [Define to 1 if you have msg.h in simgrid/.])]) AC_CHECK_HEADERS([xbt/synchro.h], [AC_DEFINE([STARPU_HAVE_XBT_SYNCHRO_H], [1], [Define to 1 if you have synchro.h in xbt/.])]) AC_CHECK_FUNCS([MSG_process_join MSG_process_attach MSG_get_as_by_name MSG_zone_get_by_name MSG_environment_get_routing_root MSG_zone_get_hosts MSG_host_get_speed MSG_process_self_name]) AC_CHECK_FUNCS([xbt_mutex_try_acquire smpi_process_set_user_data]) AC_CHECK_FUNCS([xbt_barrier_init], [AC_DEFINE([STARPU_SIMGRID_HAVE_XBT_BARRIER_INIT], [1], [Define to 1 if you have the `xbt_barrier_init' function.])]) AC_CHECK_DECLS([smpi_process_set_user_data], [], [], [[#include ]]) AC_CHECK_FUNCS([SIMIX_process_get_code], [AC_DEFINE([STARPU_SIMGRID_HAVE_SIMIX_PROCESS_GET_CODE], [1], [Define to 1 if you have the `SIMIX_process_get_code' function.])]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM( [[ #ifdef STARPU_HAVE_SIMGRID_MSG_H #include #else #include #endif ]], [[msg_host_t foo; ]] )], [], [ AC_MSG_ERROR(StarPU needs a version of Simgrid which defines the type msg_host_t (should be any version >= 3.8.1)) ]) AC_DEFINE(STARPU_SIMGRID, [1], [Define this to enable simgrid execution]) # We won't bind or detect anything with_hwloc=no # Simgrid 3.12 & 3.13 need -std=c++11 to be able to build anything in C++... AC_LANG_PUSH([C++]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #ifdef HAVE_SIMGRID_MSG_H #include #include #else #include #endif ]])],, CXXFLAGS="-std=c++11 $CXXFLAGS" NVCCFLAGS="-std=c++11 $NVCCFLAGS") AC_LANG_POP([C++]) fi AM_CONDITIONAL(STARPU_SIMGRID, test x$enable_simgrid = xyes) AC_SUBST(SIMGRID_CFLAGS) AC_SUBST(SIMGRID_LIBS) AC_MSG_CHECKING(whether SimGrid is enabled) AC_MSG_RESULT($enable_simgrid) AC_MSG_CHECKING(whether blocking drivers should be enabled) AC_ARG_ENABLE(blocking-drivers, [AS_HELP_STRING([--enable-blocking-drivers], [enable blocking drivers])], enable_blocking=$enableval, enable_blocking=$enable_simgrid) AC_MSG_RESULT($enable_blocking) if test x$enable_blocking = xno ; then AC_DEFINE(STARPU_NON_BLOCKING_DRIVERS, [1], [drivers must progress]) fi ############################################################################### # # # MIC settings # # # ############################################################################### # ignore these otions, only meant for mic-configure, but also passed here. AC_ARG_ENABLE(native-mic) AC_ARG_WITH(compiler) AC_ARG_WITH(mic-param) AC_ARG_WITH(host-param) AC_MSG_CHECKING(maximum number of MIC devices) AC_ARG_ENABLE(maxmicdev, [AS_HELP_STRING([--enable-maxmicdev=], [maximum number of MIC devices])], nmaxmicdev=$enableval, nmaxmicdev=4) AC_MSG_RESULT($nmaxmicdev) AC_DEFINE_UNQUOTED(STARPU_MAXMICDEVS, [$nmaxmicdev], [maximum number of MIC devices]) AC_MSG_CHECKING(maximum number of MIC threads) AC_ARG_ENABLE(maxmicthreads, [AS_HELP_STRING([--enable-maxmicthreads=], [maximum number of MIC threads])], nmaxmicthreads=$enableval, nmaxmicthreads=120) AC_MSG_RESULT($nmaxmicthread) AC_DEFINE_UNQUOTED(STARPU_MAXMICCORES, [$nmaxmicthreads], [maximum number of MIC cores]) AC_ARG_WITH(coi-dir, [AS_HELP_STRING([--with-coi-dir=], [specify the MIC's COI installation directory])], [coi_dir="$withval"], [coi_dir=no]) AC_ARG_WITH(coi-include-dir, [AS_HELP_STRING([--with-coi-include-dir=], [specify where the MIC's COI headers are installed])], [coi_include_dir="$withval"], [coi_include_dir=no]) AC_ARG_WITH(coi-lib-dir, [AS_HELP_STRING([--with-coi-lib-dir=], [specify where the MIC's COI libraries are installed])], [coi_lib_dir="$withval"], [coi_lib_dir=no]) AC_DEFUN([STARPU_CHECK_COI_RUNTIME], [ __coi_dir=$1 __coi_include_dir=$2 __coi_lib_dir=$3 if test "$__coi_dir" != "no" -a "$__coi_dir" != "" ; then AC_MSG_CHECKING(whether MIC's COI runtime is available in $__coi_dir) else AC_MSG_CHECKING(whether MIC's COI runtime is available) fi AC_MSG_RESULT() if test "$__coi_include_dir" = "no" -a "$__coi_dir" != "no" ; then __coi_include_dir="${__coi_dir}/include" fi if test "$__coi_lib_dir" = "no" -a "$__coi_dir" != "no" ; then __coi_lib_dir="${__coi_dir}/lib" fi SAVED_CPPFLAGS="$CPPFLAGS" SAVED_LDFLAGS="$LDFLAGS" if test "$__coi_include_dir" != "no" ; then CPPFLAGS="${CPPFLAGS} -I$__coi_include_dir" fi if test "$__coi_lib_dir" != "no" ; then LDFLAGS="${LDFLAGS} -L$__coi_lib_dir ${STARPU_SCIF_LDFLAGS}" fi AC_CHECK_HEADER([source/COIEngine_source.h],[have_valid_coi=yes],[have_valid_coi=no]) if test "$have_valid_coi" = "yes" ; then AC_HAVE_LIBRARY([$4],[have_valid_coi=yes],[have_valid_coi=no]) if test "$have_valid_coi" = "no" ; then if test "$3" = "no" -a "$__coi_dir" != "no" ; then # ${__coi_dir}/lib didn't work, let's try with lib64 __coi_lib_dir="$__coi_dir/lib64" LDFLAGS="${SAVED_LDFLAGS} -L$__coi_lib_dir" AC_HAVE_LIBRARY([$4],[have_valid_coi=yes],[have_valid_coi=no]) fi fi fi if test "$have_valid_coi" = "yes" -a "$__coi_include_dir" != "no"; then STARPU_COI_CPPFLAGS="-I$__coi_include_dir" fi if test "$have_valid_coi" = "yes" ; then if test "$__coi_lib_dir" != "no"; then STARPU_COI_LDFLAGS="-L$__coi_lib_dir" fi STARPU_COI_LDFLAGS="${STARPU_COI_LDFLAGS} -l$4" fi CPPFLAGS="${SAVED_CPPFLAGS}" LDFLAGS="${SAVED_LDFLAGS}" ]) AC_ARG_WITH(scif-dir, [AS_HELP_STRING([--with-scif-dir=], [specify the MIC's SCIF installation directory])], [scif_dir="$withval"], [scif_dir=no]) AC_ARG_WITH(scif-include-dir, [AS_HELP_STRING([--with-scif-include-dir=], [specify where the MIC's SCIF headers are installed])], [scif_include_dir="$withval"], [scif_include_dir=no]) AC_ARG_WITH(scif-lib-dir, [AS_HELP_STRING([--with-scif-lib-dir=], [specify where the MIC's SCIF libraries are installed])], [scif_lib_dir="$withval"], [scif_lib_dir=no]) AC_DEFUN([STARPU_CHECK_SCIF_RUNTIME], [ __scif_dir=$1 __scif_include_dir=$2 __scif_lib_dir=$3 if test "$__scif_dir" != "no" -a "$__scif_dir" != "" ; then AC_MSG_CHECKING(whether MIC's SCIF runtime is available in $__scif_dir) else AC_MSG_CHECKING(whether MIC's SCIF runtime is available) fi AC_MSG_RESULT() if test "$__scif_include_dir" = "no" -a "$__scif_dir" != "no" ; then __scif_include_dir="${__scif_dir}/include" fi if test "$__scif_lib_dir" = "no" -a "$__scif_dir" != "no" ; then __scif_lib_dir="${__scif_dir}/lib" fi SAVED_CPPFLAGS="$CPPFLAGS" SAVED_LDFLAGS="$LDFLAGS" if test "$__scif_include_dir" != "no" ; then CPPFLAGS="${CPPFLAGS} -I$__scif_include_dir" fi if test "$__scif_lib_dir" != "no" ; then LDFLAGS="${LDFLAGS} -L$__scif_lib_dir" fi # AC_CHECK_HEADER([source/SCIFEngine_source.h],[have_valid_scif=yes],[have_valid_scif=no]) # if test "$have_valid_scif" = "yes" ; then AC_HAVE_LIBRARY([scif],[have_valid_scif=yes],[have_valid_scif=no]) if test "$have_valid_scif" = "no" ; then if test "$3" = "no" -a "$__scif_dir" != "no" ; then # ${__scif_dir}/lib didn't work, let's try with lib64 __scif_lib_dir="$__scif_dir/lib64" LDFLAGS="${SAVED_LDFLAGS} -L$__scif_lib_dir" AC_HAVE_LIBRARY([scif],[have_valid_scif=yes],[have_valid_scif=no]) fi fi # fi if test "$have_valid_scif" = "yes" -a "$__scif_include_dir" != "no"; then STARPU_SCIF_CPPFLAGS="-I$__scif_include_dir" fi if test "$have_valid_scif" = "yes" ; then if test "$__scif_lib_dir" != "no"; then STARPU_SCIF_LDFLAGS="-L$__scif_lib_dir" fi STARPU_SCIF_LDFLAGS="${STARPU_SCIF_LDFLAGS} -lscif" fi CPPFLAGS="${SAVED_CPPFLAGS}" LDFLAGS="${SAVED_LDFLAGS}" ]) if test x$enable_mic = xyes ; then STARPU_CHECK_SCIF_RUNTIME($scif_dir, $scif_include_dir, $scif_lib_dir) if test "$have_valid_scif" = "no" ; then AC_MSG_ERROR([cannot find MIC's SCIF runtime]) fi case $host_vendor in *1om) # We are cross-compiling. # Let's have a look for the device runtime which lib has a different name STARPU_CHECK_COI_RUNTIME($coi_dir, $coi_include_dir, $coi_lib_dir, coi_device) ;; *) STARPU_CHECK_COI_RUNTIME($coi_dir, $coi_include_dir, $coi_lib_dir, coi_host) ;; esac if test "$have_valid_coi" = "no" ; then AC_MSG_ERROR([cannot find MIC's COI runtime]) fi AC_SUBST(STARPU_COI_CPPFLAGS) AC_SUBST(STARPU_COI_LDFLAGS) AC_SUBST(STARPU_SCIF_CPPFLAGS) AC_SUBST(STARPU_SCIF_LDFLAGS) fi ############################################################################### # # # SCC settings # # # ############################################################################### AC_ARG_ENABLE([rcce], [AS_HELP_STRING([--disable-rcce], [do not use SCC device(s)])], [], enable_rcce=maybe) nmaxsccdev=47 AC_DEFINE_UNQUOTED(STARPU_MAXSCCDEVS, [$nmaxsccdev], [maximum number of SCC devices]) AC_ARG_WITH(rcce-dir, [AS_HELP_STRING([--with-rcce-dir=], [specify RCCE installation directory])], [ rcce_dir="$withval" enable_rcce=yes ], rcce_dir=no) AC_ARG_WITH(rcce-include-dir, [AS_HELP_STRING([--with-rcce-include-dir=], [specify where RCCE headers are installed])], [ rcce_include_dir="$withval" enable_rcce=yes ], rcce_include_dir=no) AC_ARG_WITH(rcce-lib-dir, [AS_HELP_STRING([--with-rcce-lib-dir=], [specify where RCCE libraries are installed])], [ rcce_lib_dir="$withval" enable_rcce=yes ], rcce_lib_dir=no) if test x$enable_rcce = xyes -o x$enable_rcce = xmaybe ; then have_valid_rcce=yes SAVED_LDFLAGS="${LDFLAGS}" SAVED_CPPFLAGS="${CPPFLAGS}" SAVED_LIBS="${LIBS}" if test x$rcce_include_dir != xno ; then STARPU_RCCE_CPPFLAGS="-I${rcce_include_dir}" elif test x$rcce_dir != xno ; then STARPU_RCCE_CPPFLAGS="-I${rcce_dir}/include" fi CPPFLAGS="${CPPFLAGS} ${STARPU_RCCE_CPPFLAGS}" AC_CHECK_HEADER([RCCE.h], [], [have_valid_rcce=no]) if test x$rcce_lib_dir != xno ; then STARPU_RCCE_LDFLAGS="-L${rcce_lib_dir}" elif test x$rcce_dir != xno ; then STARPU_RCCE_LDFLAGS="-L${rcce_lib}/lib" fi LDFLAGS="${LDFLAGS} ${STARPU_RCCE_LDFLAGS}" AC_CHECK_LIB([RCCE_bigflags_nongory_nopwrmgmt], [RCCE_init], [], [have_valid_rcce=no]) # in case RCCE was explicitely required, but is not available, this is an error if test x$enable_rcce = xyes -a x$have_valid_rcce = xno ; then AC_MSG_ERROR([cannot find RCCE library]) fi if test x$have_valid_rcce = xyes ; then STARPU_RCCE_CPPFLAGS="${STARPU_RCCE_CPPFLAGS} -DSCC" STARPU_RCCE_LDFLAGS="${STARPU_RCCE_LDFLAGS} -lRCCE_bigflags_nongory_nopwrmgmt -ldl" AC_DEFINE(STARPU_USE_SCC, [1], [SCC support is enabled]) AC_SUBST(STARPU_RCCE_CFLAGS) AC_SUBST(STARPU_RCCE_CPPFLAGS) AC_SUBST(STARPU_RCCE_LDFLAGS) fi LDFLAGS="${SAVED_LDFLAGS}" CPPFLAGS="${SAVED_CPPFLAGS}" LIBS="${SAVED_LIBS}" enable_rcce=$have_valid_rcce fi AM_CONDITIONAL(STARPU_USE_SCC, test x$enable_rcce = xyes) AC_MSG_CHECKING(whether RCCE should be used) AC_MSG_RESULT($enable_rcce) ############################################################################### # # # MP Common settings # # # ############################################################################### AM_CONDITIONAL([STARPU_USE_MP], [test "x$enable_mic" = "xyes" -o "x$enable_mpi" = "xyes" -o "x$enable_rcce" = "xyes"]) AC_ARG_ENABLE([export-dynamic], [AS_HELP_STRING([--disable-export-dynamic], [Prevent the linker from adding all symbols to the dynamic symbol table])], [], []) if test x$enable_mic = xyes -o x$enable_mpi = xyes -o x$enable_rcce = xyes ; then AC_DEFINE(STARPU_USE_MP, [1], [Message-passing SINKs support is enabled]) if test x$enable_export_dynamic != xno ; then STARPU_EXPORT_DYNAMIC="-rdynamic" fi fi AC_SUBST(STARPU_EXPORT_DYNAMIC) # Computes the maximum number of different kernels a message-passing sink # can lookup for and launch. AC_MSG_CHECKING(Maximum number of message-passing kernels) AC_ARG_ENABLE(maxmpkernels, [AS_HELP_STRING([ -enable-maxmpkernels=], [maximum number of kernels a message-passing sink can lookup for and execute])], maxmpkernels=$enableval, maxmpkernels=10) AC_MSG_RESULT($maxmpkernels) AC_DEFINE_UNQUOTED(STARPU_MAXMPKERNELS, [$maxmpkernels], [maximum number of message-passing kernels]) ############################################################################### ############################################################################### # # # Debug and Performance analysis tools # # # ############################################################################### AC_MSG_CHECKING(whether debug mode should be enabled) AC_ARG_ENABLE(debug, [AS_HELP_STRING([--enable-debug], [enable debug mode])], enable_debug=$enableval, enable_debug=no) AC_MSG_RESULT($enable_debug) AC_ARG_ENABLE(spinlock_check, [AS_HELP_STRING([--enable-spinlock-check], [enable spinlock check])], enable_spinlock_check=$enableval, enable_spinlock_check=no) AC_ARG_ENABLE(fstack-protector-all, [AS_HELP_STRING([--disable-fstack-protector-all], [disable GCC option -fstack-protector-all])], enable_fstack_protector_all=$enableval, enable_fstack_protector_all=yes) if test x$enable_debug = xyes; then AC_DEFINE(STARPU_DEBUG, [1], [enable debugging statements]) CFLAGS="$CFLAGS -O0" CXXFLAGS="$CXXFLAGS -O0" enable_spinlock_check=yes if test x$GCC = xyes; then if test x$starpu_windows != xyes ; then if test x$enable_fstack_protector_all = xyes ; then CFLAGS="$CFLAGS -fstack-protector-all" CXXFLAGS="$CXXFLAGS -fstack-protector-all" fi fi fi else CFLAGS="-O3 $CFLAGS" CXXFLAGS="-O3 $CXXFLAGS" fi if test x$GCC = xyes; then CFLAGS+=" -gdwarf-2" CXXFLAGS+=" -gdwarf-2" LDFLAGS+=" -gdwarf-2" fi CFLAGS+=" -g3 " CXXFLAGS+=" -g3 " LDFLAGS+=" -g3 " if test x$enable_spinlock_check = xyes; then AC_DEFINE(STARPU_SPINLOCK_CHECK, [1], [check spinlock use]) fi AC_MSG_CHECKING(whether extra checks should be performed) AC_ARG_ENABLE(fast, [AS_HELP_STRING([--enable-fast], [do not enforce assertions])], enable_fast=$enableval, enable_fast=no) AC_MSG_RESULT($enable_fast) if test x$enable_fast = xyes; then AC_DEFINE(STARPU_NO_ASSERT, [1], [disable assertions]) else if test x$enable_debug != xyes; then if test x$GCC = xyes; then CPPFLAGS="$CPPFLAGS -D_FORTIFY_SOURCE=1" fi fi fi AC_MSG_CHECKING(whether debug messages should be displayed) AC_ARG_ENABLE(verbose, [AS_HELP_STRING([--enable-verbose], [display verbose debug messages (--enable-verbose=extra increase the verbosity)])], enable_verbose=$enableval, enable_verbose=no) AC_MSG_RESULT($enable_verbose) if test x$enable_verbose = xyes; then AC_DEFINE(STARPU_VERBOSE, [1], [display verbose debug messages]) fi if test x$enable_verbose = xextra; then AC_DEFINE(STARPU_VERBOSE, [1], [display verbose debug messages]) AC_DEFINE(STARPU_EXTRA_VERBOSE, [1], [display verbose debug messages]) fi AC_MSG_CHECKING(whether coverage testing should be enabled) AC_ARG_ENABLE(coverage, [AS_HELP_STRING([--enable-coverage], [enable coverage checking])], enable_coverage=$enableval, enable_coverage=no) AC_MSG_RESULT($enable_coverage) AC_SUBST(COVERAGE, $enable_coverage) AM_CONDITIONAL(STARPU_COVERAGE_ENABLED, [test "x$enable_coverage" = "xyes"]) if test x$enable_coverage = xyes; then CFLAGS="${CFLAGS} --coverage" CXXFLAGS="${CXXFLAGS} --coverage" LDFLAGS="${LDFLAGS} --coverage" LIBS="${LIBS} -lgcov" fi # shall we use FxT to generate trace of the execution ? AC_MSG_CHECKING(whether FxT traces should be generated) AC_ARG_WITH(fxt, [AS_HELP_STRING([--with-fxt[=]], [generate fxt traces])], [ if test x$withval != xno; then use_fxt=yes if test x$withval = xyes; then AC_MSG_RESULT(yes) use_fxt_from_system=yes else # use specified path # TODO check if the dir is actually containing FxT use_fxt_from_system=no fxtdir=$withval AC_MSG_RESULT(yes using $fxtdir) AC_SUBST(FXTDIR, $fxtdir) fi else use_fxt=no AC_MSG_RESULT(no) fi ], [ use_fxt=no AC_MSG_RESULT(no) ]) AC_SUBST(STARPU_USE_FXT, $use_fxt) AM_CONDITIONAL(STARPU_USE_FXT, test x$use_fxt = xyes) if test x$use_fxt = xyes; then AC_DEFINE(STARPU_USE_FXT, [1], [enable FxT traces]) AC_DEFINE(CONFIG_FUT, [1], [enable FUT traces]) if test x$use_fxt_from_system = xno; then save_PKG_CONFIG_PATH="$PKG_CONFIG_PATH" PKG_CONFIG_PATH="$fxtdir/lib/pkgconfig:$PKG_CONFIG_PATH" PKG_CHECK_MODULES([FXT], [fxt], , [ AC_MSG_WARN([Old FxT without fxt.pc file, hoping link will succeed]) FXT_CFLAGS="-I$fxtdir/include/ " FXT_LDFLAGS="-L$fxtdir/lib/" AC_ARG_VAR(FXT_LDFLAGS) FXT_LIBS="-lfxt" ]) PKG_CONFIG_PATH="$save_PKG_CONFIG_PATH" else PKG_CHECK_MODULES([FXT], [fxt]) fi save_LIBS="$LIBS" LIBS="$LIBS $FXT_LIBS" save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $FXT_LDFLAGS" AC_CHECK_FUNCS([enable_fut_flush]) AC_CHECK_FUNCS([fut_set_filename]) LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $FXT_CFLAGS" AC_CHECK_DECLS([enable_fut_flush], [], [], [[#include ]]) AC_CHECK_DECLS([fut_set_filename], [], [], [[#include ]]) CFLAGS="$save_CFLAGS" if test x$enable_simgrid = xyes -a x$enable_shared = xno ; then # simgrid's SMPI needs fxt to be linked in statically for # variable privatization to work FXT_LIBS="$(pkg-config --variable=libdir fxt)/libfxt.a -Wl,--as-needed $(pkg-config --libs --static fxt) -Wl,--no-as-needed" fi ########################################## # Poti is a library to generate paje trace files ########################################## PKG_CHECK_MODULES([POTI], [poti], [ AC_DEFINE(STARPU_HAVE_POTI, [1], [Define to 1 if you have libpoti]) save_LIBS="$LIBS" LIBS="$LIBS $POTI_LIBS" AC_CHECK_FUNCS([poti_init_custom]) LIBS="$save_LIBS" ], [:]) FXT_CFLAGS="$FXT_CFLAGS $POTI_CFLAGS" FXT_LIBS="$FXT_LIBS $POTI_LIBS" fi AC_MSG_CHECKING(whether additional locking systems FxT traces should be enabled) AC_ARG_ENABLE(fxt-lock, [AS_HELP_STRING([--enable-fxt-lock], [enable additional locking systems FxT traces])], enable_fxt_lock=$enableval, enable_fxt_lock=no) AC_MSG_RESULT($enable_fxt_lock) if test x$enable_fxt_lock = xyes; then AC_DEFINE(STARPU_FXT_LOCK_TRACES, [1], [enable additional locking systems FxT traces]) fi AC_MSG_CHECKING(whether performance debugging should be enabled) AC_ARG_ENABLE(perf-debug, [AS_HELP_STRING([--enable-perf-debug], [enable performance debugging through gprof])], enable_perf_debug=$enableval, enable_perf_debug=no) AC_MSG_RESULT($enable_perf_debug) AC_SUBST(STARPU_PERF_DEBUG, $enable_perf_debug) if test x$enable_perf_debug = xyes; then AC_DEFINE(STARPU_PERF_DEBUG, [1], [enable performance debug]) CPPFLAGS="${CPPFLAGS} -pg " LDFLAGS="${LDFLAGS} -pg " fi AC_MSG_CHECKING(whether performance model debugging should be enabled) AC_ARG_ENABLE(model-debug, [AS_HELP_STRING([--enable-model-debug], [enable performance model debugging])], enable_model_debug=$enableval, enable_model_debug=no) AC_MSG_RESULT($enable_model_debug) if test x$enable_model_debug = xyes; then AC_DEFINE(STARPU_MODEL_DEBUG, [1], [enable performance model debug]) fi AC_MSG_CHECKING(whether statistics should be generated) AC_ARG_ENABLE(stats, [AS_HELP_STRING([--enable-stats], [enable statistics])], enable_stats=$enableval, enable_stats=no) AC_MSG_RESULT($enable_stats) AC_SUBST(STATS, $enable_stats) AC_SUBST(STARPU_ENABLE_STATS, $enable_stats) if test x$enable_stats = xyes; then AC_DEFINE(STARPU_ENABLE_STATS, [1], [enable statistics]) fi AC_MSG_CHECKING(whether memory stats should be displayed) AC_ARG_ENABLE(memory-stats, [AS_HELP_STRING([--enable-memory-stats], [enable memory stats])], enable_memory_stats=$enableval, enable_memory_stats=no) AC_MSG_RESULT($enable_memory_stats) if test x$enable_memory_stats = xyes; then AC_DEFINE(STARPU_MEMORY_STATS, [1], [enable memory stats]) fi AC_ARG_ENABLE(glpk, [AS_HELP_STRING([--disable-glpk], [disable using glpk for bound computation])], enable_glpk=$enableval, enable_glpk=yes) if test x$enable_glpk = xyes; then AC_CHECK_HEADERS([glpk.h], [AC_DEFINE([STARPU_HAVE_GLPK_H], [1], [Define to 1 if you have the header file.])]) STARPU_HAVE_LIBRARY(GLPK, [glpk]) fi AC_ARG_WITH(ayudame1-include-dir, [AS_HELP_STRING([--with-ayudame1-include-dir=], [specify where Ayudame version 1 headers are installed])], [ ayudame1_include_dir="$withval" if test -n "$ayudame1_include_dir"; then CPPFLAGS="-I$ayudame1_include_dir $CPPFLAGS" fi ], [ayudame1_include_dir=no]) AC_ARG_WITH(ayudame2-include-dir, [AS_HELP_STRING([--with-ayudame2-include-dir=], [specify where Ayudame version 2 headers are installed])], [ ayudame2_include_dir="$withval" if test -n "$ayudame2_include_dir"; then CPPFLAGS="-I$ayudame2_include_dir $CPPFLAGS" fi ], [ayudame2_include_dir=no]) # Ayudame 1 header is capitalized AC_CHECK_HEADERS([Ayudame.h]) AC_ARG_ENABLE(ayudame1, [AS_HELP_STRING([--disable-ayudame1], [Do not use Ayudame lib version 1])], enable_ayudame1=$enableval, enable_ayudame1=yes) # Ayudame 2 header is lowercase AC_CHECK_HEADERS([ayudame.h]) AC_ARG_ENABLE(ayudame2, [AS_HELP_STRING([--disable-ayudame2], [Do not use Ayudame lib version 2])], enable_ayudame2=$enableval, enable_ayudame2=yes) if test x$enable_ayudame1 = xyes -a x$ac_cv_header_Ayudame_h = xyes; then AC_DEFINE([STARPU_USE_AYUDAME1], [1], [Define to 1 if Ayudame 1 is available and should be used]) ayu_msg="yes, use version 1" else if test x$enable_ayudame2 = xyes -a x$ac_cv_header_ayudame_h = xyes; then AC_DEFINE([STARPU_USE_AYUDAME2], [1], [Define to 1 if Ayudame 2 is available and should be used]) ayu_msg="yes, use version 2" else ayu_msg="no" fi fi AM_CONDITIONAL([STARPU_USE_AYUDAME1], [test "x$enable_ayudame1" = "xyes"]) AM_CONDITIONAL([STARPU_USE_AYUDAME2], [test "x$enable_ayudame2" = "xyes"]) ############################################################################### # # # Miscellaneous options for StarPU # # # ############################################################################### AC_MSG_CHECKING(how many buffers can be manipulated per task) AC_ARG_ENABLE(maxbuffers, [AS_HELP_STRING([--enable-maxbuffers=], [maximum number of buffers per task])], nmaxbuffers=$enableval, nmaxbuffers=8) AC_MSG_RESULT($nmaxbuffers) AC_DEFINE_UNQUOTED(STARPU_NMAXBUFS, [$nmaxbuffers], [how many buffers can be manipulated per task]) AC_MSG_CHECKING(maximum number of nodes to use) AC_ARG_ENABLE(maxnodes, [AS_HELP_STRING([--enable-maxnodes=], [maximum number of nodes])], maxnodes=$enableval, maxnodes=0) if test x$maxnodes = x0 ; then if test x$enable_simgrid = xyes ; then # We need the room for the virtual CUDA/OpenCL devices nodes=`expr 4 + $nmaxcudadev + $nmaxopencldev + $nmaxmicdev + 1` if test $nodes -gt 32 then nodes=32 fi else # We have one memory node shared by all CPU workers, one node per GPU # and per MIC device # we add nodes to use 3 memory disks nodes=4 if test x$enable_cuda = xyes ; then # we could have used nmaxcudadev + 1, but this would certainly give an # odd number. nodes=`expr $nodes + $nmaxcudadev` fi if test x$enable_opencl = xyes ; then # we could have used nmaxcudadev + 1, but this would certainly give an # odd number. nodes=`expr $nodes + $nmaxopencldev` fi if test x$enable_mic = xyes ; then nodes=`expr $nodes + $nmaxmicdev` fi if test x$enable_rcce = xyes ; then # Only 1 memory node for the shared memory. nodes=`expr $nodes + 1` fi fi # set maxnodes to the next power of 2 greater than nodes maxnodes=1 while test "$maxnodes" -lt "$nodes" do maxnodes=`expr $maxnodes \* 2` done fi if test $maxnodes -gt 32 ; then AC_MSG_ERROR([selected number of nodes ($maxnodes) can not be greater than 32]) fi AC_MSG_CHECKING(maximum number of memory nodes) AC_MSG_RESULT($maxnodes) AC_DEFINE_UNQUOTED(STARPU_MAXNODES, [$maxnodes], [maximum number of memory nodes]) AC_MSG_CHECKING(whether allocation cache should be used) AC_ARG_ENABLE(allocation-cache, [AS_HELP_STRING([--disable-allocation-cache], [disable data allocation cache])], enable_allocation_cache=$enableval, enable_allocation_cache=yes) AC_MSG_RESULT($enable_allocation_cache) if test x$enable_allocation_cache = xyes; then AC_DEFINE(STARPU_USE_ALLOCATION_CACHE, [1], [enable data allocation cache]) fi AC_ARG_WITH(perf-model-dir, [AS_HELP_STRING([--with-perf-model-dir=], [specify where performance models should be stored])], [ if test x$withval = xno; then AC_MSG_ERROR(--without-perf-model-dir is not a valid option) fi perf_model_dir="$withval" have_explicit_perf_model_dir=yes AC_DEFINE_UNQUOTED(STARPU_PERF_MODEL_DIR, ["$perf_model_dir"], [performance models location]) ], [ # by default, we put the performance models in # $HOME/.starpu/sampling/ have_explicit_perf_model_dir=no perf_model_dir="\$HOME/.starpu/sampling/" ] ) AC_MSG_CHECKING(using explicit performance model location) AC_MSG_RESULT($have_explicit_perf_model_dir) AC_MSG_CHECKING(performance models location) AC_MSG_RESULT($perf_model_dir) # On many multicore CPUs, clock cycles are not synchronized AC_CHECK_LIB([rt], [clock_gettime]) AC_CHECK_FUNCS([clock_gettime]) # Compute the maximum number of workers (we round it to 16 for alignment # purposes). if test x$enable_simgrid != xyes; then if test x$enable_cpu != xyes; then maxcpus=0 fi if test x$enable_cuda != xyes; then nmaxcudadev=0 fi if test x$enable_opencl != xyes; then nmaxopencldev=0 fi if test x$enable_mic != xyes; then nmaxmicthreads=0 fi if test x$enable_rcce != xyes; then nmaxsccdev=0 fi fi nmaxworkers=`expr 16 \* \( \( $maxcpus + $nmaxcudadev + $nmaxopencldev + $nmaxmicthreads + $nmaxsccdev + 15 \) / 16 \) ` AC_MSG_CHECKING(Maximum number of workers) AC_MSG_RESULT($nmaxworkers) AC_DEFINE_UNQUOTED(STARPU_NMAXWORKERS, [$nmaxworkers], [Maximum number of workers]) # Computes the maximun number of combined worker nmaxcombinedworkers=`expr $maxcpus + $nmaxmicthreads` AC_MSG_CHECKING(Maximum number of workers combinations) AC_MSG_RESULT($nmaxcombinedworkers) AC_DEFINE_UNQUOTED(STARPU_NMAX_COMBINEDWORKERS, [$nmaxcombinedworkers], [Maximum number of worker combinations]) # Computes the maximum number of implementations per arch AC_MSG_CHECKING(maximum number of implementations) AC_ARG_ENABLE(maximplementations, [AS_HELP_STRING([--enable-maximplementations=], [maximum number of implementations])], maximplementations=$enableval, maximplementations=4) AC_MSG_RESULT($maximplementations) AC_DEFINE_UNQUOTED(STARPU_MAXIMPLEMENTATIONS, [$maximplementations], [maximum number of implementations]) # Enable LevelDB support if requested and the lib is found AC_ARG_ENABLE(leveldb, [AS_HELP_STRING([--enable-leveldb], [Enable linking with LevelDB if available])], enable_leveldb=$enableval, enable_leveldb=no) if test x$enable_leveldb = xyes; then AC_LANG_PUSH([C++]) AC_CHECK_HEADERS([leveldb/db.h], [AC_DEFINE([STARPU_HAVE_LEVELDB], [1], [Define to 1 if you have the header file.])]) STARPU_HAVE_LIBRARY(LEVELDB, [leveldb]) AC_LANG_POP([C++]) fi AM_CONDITIONAL(STARPU_HAVE_LEVELDB, test "x$enable_leveldb" = "xyes" -a "x$ac_cv_lib_leveldb_main" = "xyes") # Defines the calibration heuristic for the history-based calibration of StarPU AC_MSG_CHECKING(calibration heuristic of history-based StarPU calibrator) AC_ARG_ENABLE(calibration-heuristic, [AS_HELP_STRING([--enable-calibration-heuristic=], [Define the maximum authorized deviation of StarPU history-based calibrator.])], calibration_heuristic=$enableval, calibration_heuristic=50) AC_MSG_RESULT($calibration_heuristic) AC_DEFINE_UNQUOTED(STARPU_HISTORYMAXERROR, [$calibration_heuristic], [calibration heuristic value]) ############################################################################### # # # MPI # # # ############################################################################### AC_ARG_WITH(mpicc, [AS_HELP_STRING([--with-mpicc[=]], [Path of the mpicc compiler])], [ if test x$withval = xyes; then AC_MSG_ERROR(--with-mpicc must be given a pathname) else mpicc_path=$withval fi ], [ if test x$enable_simgrid = xyes ; then DEFAULT_MPICC=smpicc else DEFAULT_MPICC=mpicc fi # nothing was specified: default value is used AC_PATH_PROG(mpicc_path, $DEFAULT_MPICC, [no], [$simgrid_dir/bin:$PATH]) ]) # We test if the MPICC compiler exists if test ! -x $mpicc_path; then #MPICC does not exists or is not executable AC_MSG_RESULT(The mpicc compiler '$mpicc_path' does not have the execute permission) use_mpi=no else use_mpi=yes if test x$enable_simgrid = xyes ; then AC_ARG_WITH(smpirun, [AS_HELP_STRING([--with-smpirun[=]], [Path of the smpirun helper])], [ if test x$withval = xyes; then AC_MSG_ERROR(--with-smpirun must be given a pathname) else smpirun_path=$withval fi ], [ # nothing was specified: default value is used AC_PATH_PROG(smpirun_path, smpirun, [no], [$simgrid_dir/bin:$PATH]) ]) fi fi AC_MSG_CHECKING(mpicc path) AC_MSG_RESULT($mpicc_path) AC_SUBST(MPICC, $mpicc_path) if test x$use_mpi = xyes; then cc_or_mpicc=$mpicc_path # For some reason, libtool uses gcc instead of mpicc when linking # libstarpumpi. # On Darwin (and maybe other systems ?) the linker will fail (undefined # references to MPI_*). We manually add the required flags to fix this # issue. AC_SUBST(MPICC_LDFLAGS, `$mpicc_path --showme:link`) else cc_or_mpicc=$CC fi AC_SUBST(CC_OR_MPICC, $cc_or_mpicc) # If the user specifically asks for it, or if we are in a developer checkout, we enable mpi check AC_ARG_ENABLE(mpi-check, AC_HELP_STRING([--enable-mpi-check], [Enable execution of MPI testcases])) running_mpi_check=no if test $svndir = 1 -o -d "$srcdir/.git" ; then running_mpi_check=yes fi if test x$enable_mpi_check = xyes ; then running_mpi_check=yes fi if test x$enable_mpi_check = xno ; then running_mpi_check=no fi # Check if mpiexec is available AC_ARG_WITH(mpiexec, [AS_HELP_STRING([--with-mpiexec[=]], [Path of mpiexec])], [ if test x$withval = xyes; then AC_MSG_ERROR(--with-mpiexec must be given a pathname) else mpiexec_path=$withval fi ], [ # nothing was specified: look in the path AC_PATH_PROG(mpiexec_path, mpiexec, [no], [$(dirname $mpicc_path):$PATH]) ]) AC_MSG_CHECKING(whether mpiexec is available) AC_MSG_RESULT($mpiexec_path) # We test if MPIEXEC exists if test ! -x $mpiexec_path; then #MPIEXEC does not exists or is not executable AC_MSG_RESULT(The mpiexec script is not valid) running_mpi_check=no mpiexec_path="" fi AM_CONDITIONAL(STARPU_MPI_CHECK, test x$running_mpi_check = xyes) if test x$use_mpi = xyes; then AC_MSG_CHECKING(whether MPI tests should be run) AC_MSG_RESULT($running_mpi_check) AC_SUBST(MPIEXEC,$mpiexec_path) fi AC_MSG_CHECKING(whether the StarPU MPI library should be generated) AC_MSG_RESULT($use_mpi) AC_SUBST(USE_MPI, $use_mpi) AM_CONDITIONAL(USE_MPI, test x$use_mpi = xyes) if test x$use_mpi = xyes; then AC_DEFINE(STARPU_USE_MPI,[1],[whether the StarPU MPI library is available]) else running_mpi_check=no fi AC_ARG_WITH(mpiexec-args, [AS_HELP_STRING([--with-mpiexec-args[=]], [Arguments for mpiexec])], [ mpiexec_args=$withval ]) AC_SUBST(MPIEXEC_ARGS,$mpiexec_args) AC_ARG_ENABLE(mpi-progression-hook, [AS_HELP_STRING([--enable-mpi-progression-hook], [Enable StarPU MPI activity polling method])], enable_mpi_progression_hook=$enableval, enable_mpi_progression_hook=no) if test x$enable_mpi_progression_hook = xyes; then AC_DEFINE(STARPU_MPI_ACTIVITY, [1], [enable StarPU MPI activity polling method]) fi AC_MSG_CHECKING(whether MPI debug messages should be displayed) AC_ARG_ENABLE(mpi-verbose, [AS_HELP_STRING([--enable-mpi-verbose], [display MPI verbose debug messages (--enable-mpi-verbose=extra increase the verbosity)])], enable_mpi_verbose=$enableval, enable_mpi_verbose=no) AC_MSG_RESULT($enable_mpi_verbose) if test x$enable_mpi_verbose = xyes; then AC_DEFINE(STARPU_MPI_VERBOSE, [1], [display MPI verbose debug messages]) fi if test x$enable_mpi_verbose = xextra; then AC_DEFINE(STARPU_MPI_VERBOSE, [1], [display MPI verbose debug messages]) AC_DEFINE(STARPU_MPI_EXTRA_VERBOSE, [1], [display MPI verbose debug messages]) fi ############################################################################### # # # StarPU-Top # # # ############################################################################### AC_ARG_ENABLE([starpu-top], [AS_HELP_STRING([--disable-starpu-top], [build StarPU-Top])], [enable_starpu_top="$enableval"], [enable_starpu_top="maybe"]) # Check whether StarPU-Top can be built AC_MSG_CHECKING(for StarPU-Top) if test "x$enable_starpu_top" != "xno" ; then can_build_starpu_top=no AC_PATH_PROGS([QMAKE], [qmake-qt4 qmake], [not-found]) if test x$QMAKE != xnot-found; then QMAKE_VERSION=`$QMAKE --version 2>&1 | head -n 1 | cut -d '.' -f 1 | cut -d ' ' -f 3` QT_VERSION=`$QMAKE --version 2>&1 | tail -n 1 | cut -d '.' -f 1 | cut -d ' ' -f 4` if test $QT_VERSION -ge 5 ; then can_build_starpu_top=yes elif test $QMAKE_VERSION -ge 2 ; then PKG_CHECK_EXISTS([QtGui QtOpenGL QtSql], [ QT_MAJVERSION=`$PKG_CONFIG --modversion QtGui | cut -d '.' -f 1` QT_MINVERSION=`$PKG_CONFIG --modversion QtGui | cut -d '.' -f 2` if test $QT_MAJVERSION -gt 4 -o \( $QT_MAJVERSION -eq 4 -a $QT_MINVERSION -ge 7 \) ; then can_build_starpu_top=yes fi ]) fi if test x$can_build_starpu_top = xyes; then QWT_PRI=embed AC_ARG_WITH(qwt-include-dir, [AS_HELP_STRING([--with-qwt-include-dir=], [specify installed libqwt include path])], [ STARPU_QWT_INCLUDE="$withval" AC_SUBST(STARPU_QWT_INCLUDE) QWT_PRI=system ]) AC_ARG_WITH(qwt-lib-dir, [AS_HELP_STRING([--with-qwt-lib-dir=], [specify installed libqwt library path])], [ STARPU_QWT_LDFLAGS="-L$withval" QWT_PRI=system ]) AC_ARG_WITH(qwt-lib, [AS_HELP_STRING([--with-qwt-lib=], [specify installed libqwt library name])], [ STARPU_QWT_LDFLAGS="${STARPU_QWT_LDFLAGS} -l$withval" QWT_PRI=system ]) AC_SUBST(STARPU_QWT_LDFLAGS) AC_SUBST(QWT_PRI) fi fi fi if test "x$enable_starpu_top" != "xno" ; then build_starpu_top=$can_build_starpu_top else build_starpu_top=no fi AC_SUBST(STARPU_USE_TOP, $build_starpu_top) AM_CONDITIONAL(BUILD_STARPU_TOP, test "x$build_starpu_top" = "xyes") if test "x$build_starpu_top" = "xyes"; then AC_DEFINE(STARPU_USE_TOP, [1], [StarPU-Top is activated]) fi ############################################################################### # # # Flags for C Compiler # # # ############################################################################### # IS_SUPPORTED_CFLAG(flag) # ------------------------ # Check if the CFLAGS `flag' is supported by the compiler AC_DEFUN([IS_SUPPORTED_CFLAG], [ AC_REQUIRE([AC_PROG_CC]) AC_MSG_CHECKING([whether compiler support $1]) SAVED_CFLAGS="$CFLAGS" CFLAGS="$1" # -we10006" AC_LINK_IFELSE( AC_LANG_PROGRAM( [[]], [[ AC_LANG_SOURCE([ const char *hello = "Hello World"; ]) ]] ), [ m4_default_nblank([$2], [GLOBAL_AM_CFLAGS="$GLOBAL_AM_CFLAGS $1"]) AC_MSG_RESULT(yes) option_available=1 ], [ AC_MSG_RESULT(no) option_available=0 ] ) CFLAGS="$SAVED_CFLAGS" ]) IS_SUPPORTED_CFLAG(-Wall) IS_SUPPORTED_CFLAG(-Werror=implicit) IS_SUPPORTED_CFLAG(-Werror=implicit-function-declaration) if test x$enable_perf_debug = xyes; then IS_SUPPORTED_CFLAG(-no-pie) IS_SUPPORTED_CFLAG(-no-PIE) IS_SUPPORTED_CFLAG(-fno-pie) fi if test "x$STARPU_DEVEL" != x; then AC_DEFINE(STARPU_DEVEL, [1], [enable developer warnings]) IS_SUPPORTED_CFLAG(-Wextra) IS_SUPPORTED_CFLAG(-Wunused) IS_SUPPORTED_CFLAG(-Wundef) IS_SUPPORTED_CFLAG(-Wshadow) IS_SUPPORTED_CFLAG(-Werror=pointer-arith) fi AM_CONDITIONAL([STARPU_DEVEL],[test "x$STARPU_DEVEL" != x]) AC_SUBST(GLOBAL_AM_CFLAGS) # Same value as Automake's, for use in other places. pkglibdir="\${libdir}/$PACKAGE" AC_SUBST([pkglibdir]) ############################################################################### # # # Fortran # # # ############################################################################### AC_ARG_ENABLE(fortran, [AS_HELP_STRING([--disable-fortran], [disable build of fortran examples])], enable_build_fortran_requested=$enableval, enable_build_fortran_requested=yes) enable_build_fortran=no if test "x$enable_build_fortran_requested" = "xyes" ; then if test "x$FC" != "x"; then if $FC --version|grep -q 'GNU Fortran'; then AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9) int dummy; #else #error GFortran too old, version >= 4.9.x needed, Fortran examples will not be built #endif ]], )], [enable_build_fortran="yes"], [enable_build_fortran="no"]) if test "$enable_build_fortran" = "no" ; then AC_MSG_WARN([GFortran too old, version >= 4.9.x needed, Fortran examples will not be built]) fi else if $FC -V 2>&1|grep -q 'Intel(R) Fortran'; then ifort_fc_version=`$FC -V 2>&1 |head -1|sed 's/.*Version //;s/ Build.*//'` ifort_maj_version=`echo $ifort_fc_version|cut -d. -f1` if test $ifort_maj_version -lt 16; then AC_MSG_WARN([Intel Fortran compiler $ifort_fc_version too old, version >= 2016.x needed, Fortran examples will not be built]) enable_build_fortran="no" fi else if $FC -qversion 2>&1|grep -q 'IBM XL Fortran'; then xlf_fc_version=`$FC -V 2>&1 |tail -1|sed 's/.*Version: //'` xlf_maj_version=`echo $xlf_fc_version|cut -d. -f1` AC_MSG_WARN([IBM Fortran compiler $xlf_fc_version not validated with the native StarPU Fortran API, Fortran examples will not be built]) enable_build_fortran="no" else AC_MSG_WARN(Fortran compiler has not been tested for StarPU native Fortran support) fi fi fi if test "x$enable_build_fortran" = "xyes" ; then AC_DEFINE(STARPU_HAVE_FC, [1], [Define this if a Fortran compiler is available]) if test x$use_mpi = xyes; then AC_ARG_WITH(mpifort, [AS_HELP_STRING([--with-mpifort[=]], [Path of the mpifort compiler])], [ if test x$withval = xyes; then AC_MSG_ERROR(--with-mpifort must be given a pathname) else mpifort_path=$withval fi ], [ if test x$enable_simgrid = xyes ; then DEFAULT_MPIFORT=smpifort else DEFAULT_MPIFORT=mpif90 fi # nothing was specified: default value is used AC_PATH_PROG(mpifort_path, $DEFAULT_MPIFORT, [no], [$(dirname $mpicc_path):$simgrid_dir/bin:$PATH]) ]) # We test if the MPIFORT compiler exists if test ! -x $mpifort_path; then #MPIFORT does not exists or is not executable AC_MSG_RESULT(The mpifort compiler '$mpifort_path' does not have the execute permission) use_mpi_fort=no else OLD_CC=$CC CC=$mpicc_path AC_LINK_IFELSE( AC_LANG_PROGRAM( [[#include ]], [[AC_LANG_SOURCE([return MPI_Comm_f2c(0);])]] ), [use_mpi_fort=yes], [use_mpi_fort=no] ) CC=$OLD_CC if test "x$use_mpi_fort" = xyes; then AC_DEFINE([HAVE_MPI_COMM_F2C], [1], [Function MPI_Comm_f2c is available]) AC_MSG_CHECKING(mpifort path) AC_MSG_RESULT($mpifort_path) AC_SUBST(MPIFORT, $mpifort_path) fi fi fi fi fi fi if test "x$enable_build_fortran" = "xyes" ; then if test "x$FC" = "x" ; then enable_build_fortran="no" fi fi AM_CONDITIONAL([STARPU_HAVE_FC], [test "x$FC" != "x" -a "x$enable_build_fortran" = "xyes"]) AM_CONDITIONAL([STARPU_HAVE_F77], [test "x$F77" != "x" -a "x$enable_build_fortran" = "xyes"]) AM_CONDITIONAL([STARPU_HAVE_MPIFORT], [test "x$use_mpi_fort" = "xyes"]) ############################################################################### # # # GCC extensions # # # ############################################################################### AC_ARG_ENABLE([gcc-extensions], [AS_HELP_STRING([--enable-gcc-extensions], [build the GCC plug-in that provides C language extensions (experimental)])], [enable_gcc_plugin="$enableval"], [enable_gcc_plugin="maybe"]) if test "x$enable_gcc_plugin" = "xyes" -o "x$enable_gcc_plugin" = "xmaybe" ; then STARPU_GCC_PLUGIN_SUPPORT if test "x$ac_cv_have_gcc_plugins" = "xno" ; then if test "x$enable_gcc_plugin" = "xyes" ; then # Since this was explicitly asked for, error out. AC_MSG_ERROR([This compiler lacks GCC plug-in support.]) else AC_MSG_WARN([GCC plug-ins not supported; StarPU's GCC plug-in will not be built]) fi else # What GCC version are we using? STARPU_GCC_VERSION # The `.so' itself cannot be called `starpu-gcc.so' (because # `-fplugin-arg-' option names and such must match the `.so' # name), so use a meaningful directory name. gccplugindir="\${pkglibdir}/${STARPU_EFFECTIVE_VERSION}/gcc/${STARPU_GCC_VERSION_MAJOR}.${STARPU_GCC_VERSION_MINOR}" AC_SUBST([gccplugindir]) # Lines to be inserted in the `.pc' file. GCC_PLUGIN_DIR_PKGCONFIG="gccplugindir=$gccplugindir" GCC_PLUGIN_PKGCONFIG="gccplugin=\${gccplugindir}/starpu.so" AC_SUBST([GCC_PLUGIN_DIR_PKGCONFIG]) AC_SUBST([GCC_PLUGIN_PKGCONFIG]) fi fi AM_CONDITIONAL([HAVE_PTR_DEREFS_MAY_ALIAS_P], [test "x$ac_cv_have_decl_ptr_derefs_may_alias_p" = "xyes"]) if test "x$ac_cv_have_gcc_plugins" = "xyes" ; then build_gcc_plugin="yes" # GNU Guile 1.8/2.0 is used to run the test suite. AC_PATH_PROG([GUILE], [guile]) if test "x$GUILE" != "x"; then if test "x$enable_cpu" = "xyes"; then run_gcc_plugin_test_suite="yes" else AC_MSG_WARN([CPU back-end disabled; GCC plug-in test suite will not be run]) run_gcc_plugin_test_suite="no" fi else run_gcc_plugin_test_suite="no" fi else build_gcc_plugin="no" run_gcc_plugin_test_suite="no" fi # Bison is used to generate the C expression parser. The generated # parser is part of the distribution, though. AM_MISSING_PROG([YACC], [bison]) AM_CONDITIONAL([BUILD_GCC_PLUGIN], [test "x$build_gcc_plugin" = "xyes"]) AM_CONDITIONAL([RUN_GCC_PLUGIN_TESTS], [test "x$run_gcc_plugin_test_suite" = "xyes"]) ############################################################################### # # # OpenMP runtime support # # # ############################################################################### AC_ARG_ENABLE(openmp, [AS_HELP_STRING([--enable-openmp], [build the OpenMP runtime support (experimental)])], enable_openmp=$enableval, enable_openmp=no) AC_MSG_CHECKING(for OpenMP runtime support) if test x$enable_openmp = xyes; then AC_DEFINE(STARPU_OPENMP, [1], [Define this to enable OpenMP runtime support]) fi AM_CONDITIONAL([STARPU_OPENMP], [test "x$enable_openmp" = "xyes"]) AC_MSG_RESULT($enable_openmp) AM_CONDITIONAL([STARPU_HAVE_OPENMP],[test -n "$OPENMP_CFLAGS"]) ############################################################################### # # # SOCL interface # # # ############################################################################### AC_ARG_ENABLE([socl], [AS_HELP_STRING([--enable-socl], [build the OpenCL interface (experimental)])], [enable_socl="$enableval"], [enable_socl="maybe"]) AC_MSG_CHECKING(for SOCL) # in case SOCL was explicitely required, but is not available, this is an error if test "x$enable_socl" = "xyes" -a "$have_valid_opencl" = "no" ; then AC_MSG_ERROR([SOCL cannot be enabled without OpenCL]) fi # now we enable SOCL if and only if a proper setup is available if test "x$enable_socl" = "xyes" -o "x$enable_socl" = "xmaybe" ; then build_socl=$have_valid_opencl else build_socl=no fi AC_MSG_RESULT($build_socl) AM_CONDITIONAL([BUILD_SOCL], [test "x$build_socl" = "xyes"]) AM_CONDITIONAL([STARPU_USE_SOCL], [test "x$build_socl" = "xyes"]) if test "$build_socl" = "yes" ; then AC_CHECK_FUNCS([clGetExtensionFunctionAddressForPlatform]) if test -n "$SOCL_OCL_LIB_OPENCL" -a -f "$SOCL_OCL_LIB_OPENCL" ; then run_socl_check=yes SOCL_OCL_LIB_OPENCL_DIR=$(dirname $SOCL_OCL_LIB_OPENCL) AC_SUBST(SOCL_OCL_LIB_OPENCL_DIR) else run_socl_check=no fi else run_socl_check=no fi ############################################################################### # # # Debugging # # # ############################################################################### AC_PATH_PROG([GDB], [gdb], [not-found]) if test "x$GDB" != "xnot-found"; then AC_DEFINE_UNQUOTED([STARPU_GDB_PATH], ["$GDB"], [Path to the GNU debugger.]) fi ############################################################################### # # # Examples # # # ############################################################################### AC_ARG_ENABLE(build-tests, [AS_HELP_STRING([--disable-build-tests], [disable building of tests])], enable_build_tests=$enableval, enable_build_tests=yes) # check stuff for tests (todo) AM_CONDITIONAL(BUILD_TESTS, [test x$enable_build_tests != xno]) AC_ARG_ENABLE(build-examples, [AS_HELP_STRING([--disable-build-examples], [disable building of examples])], enable_build_examples=$enableval, enable_build_examples=yes) # check stuff for examples (todo) AM_CONDITIONAL(BUILD_EXAMPLES, [test x$enable_build_examples != xno]) AC_ARG_ENABLE(opengl-render, [AS_HELP_STRING([--enable-opengl-render], [enable OpenGL rendering of some examples])], enable_opengl_render=$enableval, enable_opengl_render=no) if test x$enable_opengl_render = xyes; then STARPU_CHECK_LIB(OPENGL_RENDER, glut, glutInit,,AC_MSG_ERROR([cannot find glut])) STARPU_CHECK_LIB(OPENGL_RENDER, GL, glXCreateContext,,AC_MSG_ERROR([cannot find GL])) STARPU_CHECK_LIB(OPENGL_RENDER, GLU, gluLookAt,,AC_MSG_ERROR([cannot find GLU])) AC_DEFINE(STARPU_OPENGL_RENDER, [1], [enable OpenGL rendering of some examples]) fi AC_MSG_CHECKING(whether OpenGL rendering is enabled) AC_SUBST(STARPU_OPENGL_RENDER, $enable_opengl_render) AC_MSG_RESULT($enable_opengl_render) AM_CONDITIONAL([HAVE_OPENGL], [test "x$enable_opengl_render" = xyes]) AC_PATH_XTRA if test "x$no_x" != "xyes"; then AC_DEFINE(STARPU_HAVE_X11, [1], [enable X11]) fi AM_CONDITIONAL([HAVE_X11], [test "x$no_x" != "xyes"]) # In case there are BLAS kernels that are used by the example applications # we may specify which library to use. Note that this is not used for StarPU # itself. blas_lib=maybe AC_ARG_ENABLE(blas-lib, [ --enable-blas-lib[=blaslibname]: none [default]: no BLAS lib is used atlas: use ATLAS library goto: use GotoBLAS library mkl: use MKL library (you may need to set specific CFLAGS and LDFLAGS with --with-mkl-cflags and --with-mkl-ldflags)], [ if test "x$enableval" = "xatlas" ; then blas_lib=atlas elif test "x$enableval" = "xgoto" ; then blas_lib=goto elif test "x$enableval" = "xnone" ; then blas_lib=none elif test "x$enableval" = "xmkl" ; then blas_lib=mkl elif test x$enableval = xno; then blas_lib=none else echo echo "Error!" echo "Unknown BLAS library" exit -1 fi ]) if test x$blas_lib = xmaybe -o x$blas_lib = xgoto; then AC_ARG_WITH(goto-dir, [AS_HELP_STRING([--with-goto-dir=], [specify GotoBLAS lib location])], [ blas_lib=goto gotodir=$withval AC_SUBST(GOTODIR, $gotodir) CPPFLAGS="${CPPFLAGS} -I$gotodir/ " LDFLAGS="${LDFLAGS} -L$gotodir/ " ] ) if test x$blas_lib = xgoto; then STARPU_CHECK_LIB(BLAS, gfortran, main,,) STARPU_CHECK_LIB(BLAS, ifcore, main,,) # Perhaps that GotoBLAS2 is available instead (so that we have libgotoblas2.{so,a}) STARPU_CHECK_LIB(BLAS, goto2, sgemm_,, [havegoto2=no], [$STARPU_BLAS_LDFLAGS]) if test x$havegoto2 = xno; then STARPU_CHECK_LIB(BLAS, goto, sgemm_,,AC_MSG_ERROR([cannot find goto lib]), [$STARPU_BLAS_LDFLAGS]) fi AC_DEFINE(STARPU_GOTO, [1], [use STARPU_GOTO library]) fi fi if test x$blas_lib = xmaybe -o x$blas_lib = xatlas; then AC_ARG_WITH(atlas-dir, [AS_HELP_STRING([--with-atlas-dir=], [specify ATLAS lib location])], [ AC_MSG_CHECKING(STARPU_ATLAS location) blas_lib=atlas atlasdir=$withval AC_MSG_RESULT($atlasdir) AC_SUBST(ATLASDIR, $atlasdir) CPPFLAGS="${CPPFLAGS} -I$atlasdir/include/ " LDFLAGS="${LDFLAGS} -L$atlasdir/lib/ " ] ) if test x$blas_lib = xatlas; then # test whether STARPU_ATLAS is actually available AC_CHECK_HEADER([cblas.h],,AC_MSG_ERROR([cannot find atlas headers])) STARPU_CHECK_LIB(BLAS, atlas, ATL_sgemm,,AC_MSG_ERROR([cannot find atlas lib]),) STARPU_CHECK_LIB(BLAS, cblas, cblas_sgemm,,AC_MSG_ERROR([cannot find atlas lib]),[-latlas]) AC_DEFINE(STARPU_ATLAS, [1], [use STARPU_ATLAS library]) fi fi if test x$blas_lib = xmaybe -o x$blas_lib = xmkl; then # Should we use MKL ? if test -n "$MKLROOT" then CPPFLAGS="${CPPFLAGS} -I$MKLROOT/include" case $host_vendor in *1om) mkl_plat=mic ;; *) mkl_plat=intel64 ;; esac SAVED_LIBS=$LIBS STARPU_BLAS_LDFLAGS="-L$MKLROOT/lib/$mkl_plat -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lm -lpthread -ldl" LIBS="$LIBS $STARPU_BLAS_LDFLAGS" AC_LINK_IFELSE( [AC_LANG_PROGRAM([[ #include ]], [[ ]])], [ blas_lib=mkl ], [ STARPU_BLAS_LDFLAGS="" ], ) LIBS=$SAVED_LIBS fi AC_ARG_WITH(mkl-cflags, [AS_HELP_STRING([--with-mkl-cflags], [specify MKL compilation flags])], [ CPPFLAGS="${CPPFLAGS} $withval" blas_lib=mkl ]) AC_ARG_WITH(mkl-ldflags, [AS_HELP_STRING([--with-mkl-ldflags], [specify MKL linking flags])], [ STARPU_BLAS_LDFLAGS="$withval" blas_lib=mkl ]) if test x$blas_lib = xmkl; then AC_DEFINE(STARPU_MKL, [1], [use MKL library]) fi fi if test x$blas_lib = xmaybe; then #perhaps it is possible to use some BLAS lib from the system use_system_blas=no STARPU_SEARCH_LIBS(BLAS,[sgemm_],[blas],use_system_blas=yes,,) if test x$use_system_blas = xyes; then AC_DEFINE(STARPU_SYSTEM_BLAS, [1], [use refblas library]) blas_lib=system elif test x"$BLAS_LIBS" != x; then AC_DEFINE(STARPU_SYSTEM_BLAS, [1], [use user defined library]) STARPU_BLAS_LDFLAGS="$BLAS_LIBS" blas_lib=system AC_ARG_VAR([BLAS_LIBS], [linker flags for blas]) else blas_lib=none fi fi AM_CONDITIONAL(ATLAS_BLAS_LIB, test x$blas_lib = xatlas) AM_CONDITIONAL(GOTO_BLAS_LIB, test x$blas_lib = xgoto) AM_CONDITIONAL(MKL_BLAS_LIB, test x$blas_lib = xmkl) AM_CONDITIONAL(SYSTEM_BLAS_LIB, test x$blas_lib = xsystem) AM_CONDITIONAL(NO_BLAS_LIB, test x$blas_lib = xnone -a x$enable_simgrid = xno) AC_SUBST(STARPU_BLAS_LDFLAGS) AC_MSG_CHECKING(which BLAS lib should be used) AC_MSG_RESULT($blas_lib) AC_SUBST(BLAS_LIB,$blas_lib) ########################################## # FFT # ########################################## have_fftw=no have_fftwf=no have_fftwl=no fft_support=no AC_ARG_ENABLE(starpufft, [AS_HELP_STRING([--disable-starpufft], [Disable build of StarPU-FFT])], enable_starpufft=$enableval,enable_starpufft=yes) PKG_CHECK_MODULES([FFTW], [fftw3], [ AC_DEFINE([STARPU_HAVE_FFTW], [1], [Define to 1 if you have the libfftw3 library.]) AC_SUBST([STARPU_HAVE_FFTW], [1]) have_fftw=yes ], [:]) AM_CONDITIONAL(STARPU_HAVE_FFTW, [test x$have_fftw = xyes]) PKG_CHECK_MODULES([FFTWF], [fftw3f], [ AC_DEFINE([STARPU_HAVE_FFTWF], [1], [Define to 1 if you have the libfftw3f library.]) AC_SUBST([STARPU_HAVE_FFTWF], [1]) have_fftwf=yes ], [:]) AM_CONDITIONAL(STARPU_HAVE_FFTWF, [test x$have_fftwf = xyes]) PKG_CHECK_MODULES([FFTWL], [fftw3l], [ AC_DEFINE([STARPU_HAVE_FFTWL], [1], [Define to 1 if you have the libfftw3l library.]) AC_SUBST([HAVE_FFTWFL], [1]) have_fftwl=yes ], [:]) AM_CONDITIONAL(STARPU_HAVE_FFTWL, [test x$have_fftwl = xyes]) if test x$enable_starpufft = xyes -a \( \( x$enable_cpu = xyes -a x$have_fftw = xyes -a x$have_fftwf = xyes \) -o x$have_cufftdoublecomplex = xyes \); then fft_support=yes fi AM_CONDITIONAL(BUILD_STARPUFFT, [test x$fft_support = xyes]) AC_ARG_ENABLE(starpufft-examples, [AS_HELP_STRING([--enable-starpufft-examples], [disable execution of StarPU FFT examples])], enable_starpufft_examples=$enableval, enable_starpufft_examples=no) AM_CONDITIONAL(BUILD_STARPUFFT_EXAMPLES, [test x$enable_starpufft_examples = xyes]) ########################################## # hwloc # ########################################## have_valid_hwloc=no SAVED_LDFLAGS="${LDFLAGS}" SAVED_CPPFLAGS="${CPPFLAGS}" SAVED_PKG_CONFIG_PATH="$PKG_CONFIG_PATH" AC_ARG_WITH([hwloc], [AS_HELP_STRING([--without-hwloc], [Disable hwloc (enabled by default)])], [ if test x$withval != xno; then if test "$withval" = "yes" ; then use_hwloc=yes else # use specified path if test ! -d "$withval" ; then AC_MSG_ERROR("Directory specified for hwloc <$withval> does not exist") fi if test ! -d "$withval/lib/pkgconfig" ; then AC_MSG_ERROR("Hwloc directory <$withval> does not have a subdirectory lib/pkgconfig") fi export PKG_CONFIG_PATH=$withval/lib/pkgconfig:$PKG_CONFIG_PATH use_hwloc=yes fi else use_hwloc=no fi ], [ use_hwloc=maybe ]) AS_IF([test "$use_hwloc" != "no"], [PKG_CHECK_MODULES([HWLOC],[hwloc], [have_valid_hwloc=yes], [have_valid_hwloc=no])] ) AM_CONDITIONAL(STARPU_HAVE_HWLOC, test "x$have_valid_hwloc" = "xyes") # in case hwloc was explicitely required, but is not available, this is an error AS_IF([test "$use_hwloc" = "yes" -a "$have_valid_hwloc" = "no"], [AC_MSG_ERROR([cannot find hwloc])] ) # in case hwloc is not available but was not explicitely disabled, this is an error AS_IF([test "$have_valid_hwloc" = "no" -a "$use_hwloc" != "no"], [AC_MSG_ERROR([libhwloc or pkg-config was not found on your system. If the target machine is hyperthreaded the performance may be impacted a lot. It is strongly recommended to install libhwloc and pkg-config. However, if you really want to use StarPU without enabling libhwloc, please restart configure by specifying the option '--without-hwloc'.])] ) LDFLAGS="${HWLOC_LIBS} ${SAVED_LDFLAGS}" CPPFLAGS="${HWLOC_CFLAGS} ${SAVED_CPPFLAGS}" AS_IF([test "$have_valid_hwloc" = "yes"], [AC_DEFINE([STARPU_HAVE_HWLOC], [1], [Define to 1 if you have the hwloc library.]) HWLOC_REQUIRES=hwloc AC_SUBST([STARPU_HAVE_HWLOC], [1]) AC_CHECK_DECLS([hwloc_cuda_get_device_osdev_by_index], [], [], [[#include ]]) ]) AC_CHECK_FUNCS([hwloc_topology_dup]) AM_CONDITIONAL(STARPU_HWLOC_HAVE_TOPOLOGY_DUP, test $ac_cv_func_hwloc_topology_dup = yes) LDFLAGS="${SAVED_LDFLAGS}" CPPFLAGS="${SAVED_CPPFLAGS}" export PKG_CONFIG_PATH=$SAVED_PKG_CONFIG_PATH AC_MSG_CHECKING(whether hwloc should be used) AC_MSG_RESULT($have_valid_hwloc) AC_SUBST(HWLOC_REQUIRES) # is the header file f77.h available ? AC_CHECK_HEADER([f77.h], [have_f77_h=yes], [have_f77_h=no]) AC_SUBST(STARPU_HAVE_F77_H, $have_f77_h) AM_CONDITIONAL(STARPU_HAVE_F77_H, test x$have_f77_h = xyes) if test x$have_f77_h = xyes; then AC_DEFINE([STARPU_HAVE_F77_H], [1], [Define to 1 if you have the header file.]) fi # Check if icc is available AC_CHECK_PROGS([ICC], [icc]) # If cuda and icc are both available, check they are compatible if test "$enable_cuda" = "yes" -a "$ICC" != ""; then AC_MSG_CHECKING(whether CUDA and ICC are compatible) OLD_CC="$CC" CC="$ICC" OLD_CFLAGS="$CFLAGS" CFLAGS="-I$PWD/include -I$srcdir/include" AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include #include ]], [[]] )], AC_MSG_RESULT(yes), [ICC="" AC_MSG_RESULT(no)] ) CC="$OLD_CC" CFLAGS="$OLD_CFLAGS" fi # Disable ICC on windows if test "x$ICC" != "x" -a "$starpu_windows" = "yes" ; then ICC="" fi if test "x$ICC" != "x"; then AC_DEFINE(STARPU_HAVE_ICC, [1], [Define this if icc is available]) fi AM_CONDITIONAL([STARPU_HAVE_ICC], [test "x$ICC" != "x"]) # Do not generate manpages for the tools if we do not have help2man AC_CHECK_PROGS([HELP2MAN], [help2man]) # Disable on windows if test "$starpu_windows" = "yes" ; then HELP2MAN="" fi AM_CONDITIONAL([STARPU_HAVE_HELP2MAN], [test "x$HELP2MAN" != "x"]) AC_CHECK_MEMBER([struct cudaDeviceProp.pciDomainID], AC_DEFINE([STARPU_HAVE_DOMAINID],[1],[Define to 1 if CUDA device properties include DomainID]), , [[#include ]]) AC_CHECK_MEMBER([struct cudaDeviceProp.pciBusID], AC_DEFINE([STARPU_HAVE_BUSID],[1],[Define to 1 if CUDA device properties include BusID]), , [[#include ]]) dnl Set this condition when Automake 1.11 or later is being used. dnl Automake 1.11 introduced `silent-rules', hence the check. m4_ifdef([AM_SILENT_RULES], AM_CONDITIONAL([STARPU_HAVE_AM111], [true]), AM_CONDITIONAL([STARPU_HAVE_AM111], [false])) ########################################## # Documentation # ########################################## AC_ARG_ENABLE(build-doc, [AS_HELP_STRING([--disable-build-doc], [disable building of documentation])], enable_build_doc=$enableval, enable_build_doc=yes) if test "$enable_build_doc" = "yes" ; then # Check whether doxygen needed tools are installed AC_PATH_PROG(doxygencommand, doxygen) if test "$doxygencommand" = "" ; then enable_build_doc="no" fi AC_PATH_PROG(pdflatexcommand, pdflatex) if test "$pdflatexcommand" = "" ; then enable_build_doc="no" fi AC_PATH_PROG(epstopdfcommand, epstopdf) if test "$epstopdfcommand" = "" ; then enable_build_doc="no" fi fi available_doc="no" if test -f "$srcdir/doc/doxygen/starpu.pdf" then enable_build_doc="no" available_doc="yes" fi AC_MSG_CHECKING(whether documentation should be compiled) AC_MSG_RESULT($enable_build_doc) AC_MSG_CHECKING(whether documentation is available) AC_MSG_RESULT($available_doc) AM_CONDITIONAL(BUILD_DOC, [test x$enable_build_doc != xno]) AM_CONDITIONAL(AVAILABLE_DOC, [test x$available_doc != xno]) ############################################################################### # # # Final settings # # # ############################################################################### # these are the flags needed for linking libstarpu (and thus also for static linking) LIBSTARPU_LDFLAGS="$HWLOC_LIBS $FXT_LIBS $STARPU_COI_LDFLAGS $STARPU_SCIF_LDFLAGS $STARPU_RCCE_LDFLAGS $STARPU_LEVELDB_LDFLAGS $STARPU_GLPK_LDFLAGS $STARPU_LEVELDB_LDFLAGS $SIMGRID_LIBS" AC_SUBST([LIBSTARPU_LDFLAGS]) LIBSTARPU_LINK=libstarpu-$STARPU_EFFECTIVE_VERSION.la if test x$enable_perf_debug = xyes; then # For gperf to work, we need to link statically our tests LIBSTARPU_LINK=".libs/libstarpu-$STARPU_EFFECTIVE_VERSION.a $LIBSTARPU_LDFLAGS $STARPU_CUDA_LDFLAGS $STARPU_OPENCL_LDFLAGS" fi AC_SUBST([LIBSTARPU_LINK]) if test "x$enable_shared" = xno; then # No .so, so application will unexpected have to know which -l to # use. Give them in .pc file. STARPU_EXPORTED_LIBS="$LDFLAGS $LIBS $LIBSTARPU_LDFLAGS" fi AC_SUBST(STARPU_EXPORTED_LIBS) # File configuration AC_CONFIG_COMMANDS([executable-scripts], [ chmod +x tests/regression/regression.sh chmod +x tests/loader-cross.sh chmod +x examples/loader-cross.sh chmod +x examples/stencil/loader-cross.sh chmod +x gcc-plugin/tests/run-test chmod +x tools/starpu_codelet_profile chmod +x tools/starpu_codelet_histo_profile chmod +x tools/starpu_workers_activity chmod +x tools/starpu_paje_draw_histogram chmod +x tools/starpu_paje_state_stats chmod +x tools/starpu_paje_summary chmod +x tools/starpu_paje_sort chmod +x tools/starpu_smpirun chmod +x doc/doxygen/doxygen_filter.sh mkdir -p tests/microbenchs test -e tests/microbenchs/tasks_size_overhead.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/tasks_size_overhead.sh tests/microbenchs/ test -e tests/microbenchs/tasks_size_overhead.gp || ln -sf $ac_abs_top_srcdir/tests/microbenchs/tasks_size_overhead.gp tests/microbenchs/ mkdir -p tests/datawizard test -e tests/datawizard/locality.sh || ln -sf $ac_abs_top_srcdir/tests/datawizard/locality.sh tests/datawizard/ mkdir -p tests/overlap test -e tests/overlap/overlap.sh || ln -sf $ac_abs_top_srcdir/tests/overlap/overlap.sh tests/overlap/ mkdir -p examples/heat test -e examples/heat/heat.sh || ln -sf $ac_abs_top_srcdir/examples/heat/heat.sh examples/heat/ mkdir -p examples/lu test -e examples/lu/lu.sh || ln -sf $ac_abs_top_srcdir/examples/lu/lu.sh examples/lu/ test -e tools/starpu_paje_draw_histogram.R || ln -sf $ac_abs_top_srcdir/tools/starpu_paje_draw_histogram.R tools/starpu_paje_draw_histogram.R test -e tools/starpu_paje_state_stats.R || ln -sf $ac_abs_top_srcdir/tools/starpu_paje_state_stats.R tools/starpu_paje_state_stats.R ]) # Create links to ICD files in build/socl/vendors directory. SOCL will use this # directory as the OCL_ICD_VENDORS directory SOCL_VENDORS="vendors/install/socl.icd" for icd in /etc/OpenCL/vendors/*.icd ; do if test -f $icd ; then if test "$(basename $icd)" != "socl.icd" ; then new_icd=$(basename $icd) AC_CONFIG_LINKS([socl/vendors/$new_icd:$icd]) SOCL_VENDORS="$SOCL_VENDORS vendors/$new_icd" fi fi done AC_SUBST(SOCL_VENDORS) AC_CONFIG_FILES(tests/regression/regression.sh tests/regression/profiles tests/regression/profiles.build.only) AC_CONFIG_HEADER(src/common/config.h include/starpu_config.h gcc-plugin/include/starpu-gcc/config.h starpu-top/config.h) AH_BOTTOM([ #if defined(STARPU_DEVEL) && defined(BUILDING_STARPU) # ifndef STARPU_CHECKED_UNISTD_H # define STARPU_CHECKED_UNISTD_H # ifdef _UNISTD_H # define _UNISTD_H PLEASE_DONT_INCLUDE_IT # error Please do not unconditionally include unistd.h, it is not available on Windows, include config.h and test for HAVE_UNISTD_H # endif # endif #endif ]) SANITIZE=$(echo $CFLAGS | grep sanitize) AM_CONDITIONAL(STARPU_SANITIZE, test -n "$SANITIZE") AC_OUTPUT([ Makefile src/Makefile tools/Makefile tools/starpu_codelet_profile tools/starpu_codelet_histo_profile tools/starpu_workers_activity tools/starpu_paje_draw_histogram tools/starpu_paje_state_stats tools/starpu_paje_summary tools/starpu_paje_sort tools/starpu_smpirun socl/Makefile socl/src/Makefile socl/examples/Makefile socl/vendors/socl.icd socl/vendors/install/socl.icd libstarpu.pc starpu-1.0.pc starpu-1.1.pc starpu-1.2.pc mpi/libstarpumpi.pc mpi/starpumpi-1.0.pc mpi/starpumpi-1.1.pc mpi/starpumpi-1.2.pc starpufft/Makefile starpufft/src/Makefile starpufft/tests/Makefile starpufft/libstarpufft.pc starpufft/starpufft-1.0.pc starpufft/starpufft-1.1.pc starpufft/starpufft-1.2.pc examples/Makefile examples/stencil/Makefile tests/Makefile tests/loader-cross.sh examples/loader-cross.sh examples/stencil/loader-cross.sh mpi/Makefile mpi/src/Makefile mpi/tests/Makefile mpi/examples/Makefile starpu-top/StarPU-Top.pro starpu-top/StarPU-Top-qwt-embed.pri starpu-top/StarPU-Top-qwt-system.pri gcc-plugin/Makefile gcc-plugin/src/Makefile gcc-plugin/tests/Makefile gcc-plugin/tests/run-test gcc-plugin/examples/Makefile sc_hypervisor/Makefile sc_hypervisor/src/Makefile sc_hypervisor/examples/Makefile doc/Makefile doc/doxygen/Makefile doc/doxygen/doxygen-config.cfg doc/doxygen/doxygen_filter.sh tools/msvc/starpu_var.bat ]) AC_MSG_NOTICE([ CPUs enabled: $enable_cpu CUDA enabled: $enable_cuda OpenCL enabled: $enable_opencl SCC enabled: $enable_rcce MIC enabled: $enable_mic Compile-time limits (change these with --enable-maxcpus, --enable-maxcudadev, --enable-maxopencldev, --enable-maxmicdev, --enable-maxnodes, --enable-maxbuffers) (Note these numbers do not represent the number of detected devices, but the maximum number of devices StarPU can manage) Maximum number of CPUs: $maxcpus Maximum number of CUDA devices: $nmaxcudadev Maximum number of OpenCL devices: $nmaxopencldev Maximum number of SCC devices: $nmaxsccdev Maximum number of MIC threads: $nmaxmicthreads Maximum number of memory nodes: $maxnodes Maximum number of task buffers: $nmaxbuffers GPU-GPU transfers: $have_cuda_memcpy_peer Allocation cache: $enable_allocation_cache Magma enabled: $have_magma BLAS library: $blas_lib hwloc: $have_valid_hwloc FxT trace enabled: $use_fxt StarPU-Top: $build_starpu_top Documentation: $enable_build_doc Examples: $enable_build_examples StarPU Extensions: MPI enabled: $use_mpi MPI test suite: $running_mpi_check FFT Support: $fft_support GCC plug-in: $build_gcc_plugin GCC plug-in test suite (requires GNU Guile): $run_gcc_plugin_test_suite OpenMP runtime support enabled: $enable_openmp SOCL enabled: $build_socl SOCL test suite: $run_socl_check Scheduler Hypervisor: $build_sc_hypervisor simgrid enabled: $enable_simgrid ayudame enabled: $ayu_msg Native fortran support: $enable_build_fortran Native MPI fortran support: $use_mpi_fort ]) if test "$build_socl" = "yes" -a "$run_socl_check" = "no" ; then AC_MSG_NOTICE([ WARNING: SOCL test suite will not be run as the environment variable SOCL_OCL_LIB_OPENCL is not defined. To run the tests, you need to install the OCL implementation of ICD (https://forge.imag.fr/projects/ocl-icd/ or Debian package ocl-icd-libopencl1) and set the variable SOCL_OCL_LIB_OPENCL to the location of the libOpenCL.so.]) fi if test x"$have_valid_hwloc" = xno -a "$enable_simgrid" = "no" then AC_MSG_NOTICE([ WARNING: hwloc was not enabled. If the target machine is hyperthreaded the performance may be impacted a lot. It is strongly recommended to install hwloc]) fi starpu-1.2.3+dfsg/doc/000077500000000000000000000000001320135501600145135ustar00rootroot00000000000000starpu-1.2.3+dfsg/doc/Makefile.am000066400000000000000000000023141320135501600165470ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2013, 2014, 2016, 2017 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. SUBDIRS = doxygen DIST_SUBDIRS = doxygen EXTRA_DIST = tutorial/hello_world.c \ tutorial/hello_world_plugin.c \ tutorial/hello_world_msvc.c \ tutorial/Makefile \ tutorial/README \ tutorial/vector_scal.c \ tutorial/vector_scal_cpu.c \ tutorial/vector_scal_cuda.cu \ tutorial/vector_scal_opencl.c \ tutorial/vector_scal_opencl_kernel.cl \ tutorial/vector_scal_plugin.c \ tutorial/vector_scal_plugin_cuda.cu txtdir = ${docdir}/tutorial txt_DATA = $(EXTRA_DIST) showcheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET starpu-1.2.3+dfsg/doc/Makefile.in000066400000000000000000000647111320135501600165710ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2013, 2014, 2016, 2017 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = doc ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(txtdir)" DATA = $(txt_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POTI_CFLAGS = @POTI_CFLAGS@ POTI_LIBS = @POTI_LIBS@ PROG_DATE = @PROG_DATE@ PROG_STAT = @PROG_STAT@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_COI_CPPFLAGS = @STARPU_COI_CPPFLAGS@ STARPU_COI_LDFLAGS = @STARPU_COI_LDFLAGS@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LEVELDB_LDFLAGS = @STARPU_LEVELDB_LDFLAGS@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RCCE_CFLAGS = @STARPU_RCCE_CFLAGS@ STARPU_RCCE_CPPFLAGS = @STARPU_RCCE_CPPFLAGS@ STARPU_RCCE_LDFLAGS = @STARPU_RCCE_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SCIF_CPPFLAGS = @STARPU_SCIF_CPPFLAGS@ STARPU_SCIF_LDFLAGS = @STARPU_SCIF_LDFLAGS@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SC_HYPERVISOR_DEBUG = @STARPU_SC_HYPERVISOR_DEBUG@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ mpifort_path = @mpifort_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ smpirun_path = @smpirun_path@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = doxygen DIST_SUBDIRS = doxygen EXTRA_DIST = tutorial/hello_world.c \ tutorial/hello_world_plugin.c \ tutorial/hello_world_msvc.c \ tutorial/Makefile \ tutorial/README \ tutorial/vector_scal.c \ tutorial/vector_scal_cpu.c \ tutorial/vector_scal_cuda.cu \ tutorial/vector_scal_opencl.c \ tutorial/vector_scal_opencl_kernel.cl \ tutorial/vector_scal_plugin.c \ tutorial/vector_scal_plugin_cuda.cu txtdir = ${docdir}/tutorial txt_DATA = $(EXTRA_DIST) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-txtDATA: $(txt_DATA) @$(NORMAL_INSTALL) @list='$(txt_DATA)'; test -n "$(txtdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(txtdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(txtdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(txtdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(txtdir)" || exit $$?; \ done uninstall-txtDATA: @$(NORMAL_UNINSTALL) @list='$(txt_DATA)'; test -n "$(txtdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(txtdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(txtdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-txtDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-txtDATA .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip install-txtDATA installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-txtDATA .PRECIOUS: Makefile showcheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.2.3+dfsg/doc/doxygen/000077500000000000000000000000001320135501600161705ustar00rootroot00000000000000starpu-1.2.3+dfsg/doc/doxygen/Makefile.am000066400000000000000000000321721320135501600202310ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009, 2011, 2013-2014, 2017 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS # Copyright (C) 2014 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. DOXYGEN = doxygen PDFLATEX = pdflatex MAKEINDEX = makeindex DOX_DIR = $(top_builddir)/doc/doxygen DOX_CONFIG = $(top_srcdir)/doc/doxygen/doxygen.cfg DOX_HTML_DIR = html DOX_LATEX_DIR = latex DOX_PDF = $(DOX_DIR)/starpu.pdf DOX_TAG = starpu.tag txtdir = $(docdir)/manual EXTRA_DIST = if BUILD_DOC all: $(DOX_HTML_DIR) $(DOX_PDF) EXTRA_DIST += $(DOX_HTML_DIR) $(DOX_PDF) txt_DATA = $(DOX_PDF) DOX_HTML_SRCDIR=$(DOX_HTML_DIR) install-exec-hook: $(MKDIR_P) $(DESTDIR)$(docdir)/manual/html (cd $(DOX_HTML_SRCDIR) && find . -type f -exec $(INSTALL) -c -m 644 {} $(DESTDIR)$(docdir)/manual/html \;) uninstall-hook: rm -rf $(DESTDIR)$(docdir)/manual/html else if AVAILABLE_DOC EXTRA_DIST += $(top_srcdir)/doc/doxygen/html $(top_srcdir)/doc/doxygen/starpu.pdf txt_DATA = $(top_srcdir)/doc/doxygen/starpu.pdf DOX_HTML_SRCDIR=$(top_srcdir)/doc/doxygen/html install-exec-hook: $(MKDIR_P) $(DESTDIR)$(docdir)/manual/html (cd $(DOX_HTML_SRCDIR) && find . -type f -exec $(INSTALL) -c -m 644 {} $(DESTDIR)$(docdir)/manual/html \;) uninstall-hook: rm -rf $(DESTDIR)$(docdir)/manual/html endif endif chapters = \ chapters/000_introduction.doxy \ chapters/101_building.doxy \ chapters/110_basic_examples.doxy \ chapters/201_advanced_examples.doxy \ chapters/210_check_list_performance.doxy \ chapters/301_tasks.doxy \ chapters/310_data_management.doxy \ chapters/320_scheduling.doxy \ chapters/330_scheduling_contexts.doxy \ chapters/340_scheduling_context_hypervisor.doxy \ chapters/350_modularized_scheduler.doxy \ chapters/360_debugging_tools.doxy \ chapters/370_online_performance_tools.doxy \ chapters/380_offline_performance_tools.doxy \ chapters/390_faq.doxy \ chapters/401_out_of_core.doxy \ chapters/410_mpi_support.doxy \ chapters/420_fft_support.doxy \ chapters/430_mic_scc_support.doxy \ chapters/440_c_extensions.doxy \ chapters/450_native_fortran_support.doxy \ chapters/460_socl_opencl_extensions.doxy \ chapters/470_simgrid.doxy \ chapters/480_openmp_runtime_support.doxy \ chapters/501_environment_variables.doxy \ chapters/510_configure_options.doxy \ chapters/520_files.doxy \ chapters/601_scaling_vector_example.doxy \ chapters/610_fdl_1_3.doxy \ chapters/code/hello_pragma2.c \ chapters/code/hello_pragma.c \ chapters/code/scal_pragma.cu \ chapters/code/matmul_pragma.c \ chapters/code/matmul_pragma2.c \ chapters/code/cholesky_pragma.c \ chapters/code/forkmode.c \ chapters/code/multiformat.c \ chapters/code/complex.c \ chapters/code/simgrid.c \ chapters/code/vector_scal_c.c \ chapters/code/vector_scal_cpu.c \ chapters/code/vector_scal_cuda.cu \ chapters/code/vector_scal_opencl.c \ chapters/code/vector_scal_opencl_codelet.cl \ chapters/code/disk_copy.c \ chapters/code/disk_compute.c \ chapters/code/nf_initexit.f90 \ chapters/api/codelet_and_tasks.doxy \ chapters/api/cuda_extensions.doxy \ chapters/api/data_interfaces.doxy \ chapters/api/data_management.doxy \ chapters/api/data_partition.doxy \ chapters/api/data_out_of_core.doxy \ chapters/api/expert_mode.doxy \ chapters/api/explicit_dependencies.doxy \ chapters/api/fft_support.doxy \ chapters/api/fxt_support.doxy \ chapters/api/implicit_dependencies.doxy \ chapters/api/initialization.doxy \ chapters/api/insert_task.doxy \ chapters/api/lower_bound.doxy \ chapters/api/misc_helpers.doxy \ chapters/api/mpi.doxy \ chapters/api/multiformat_data_interface.doxy \ chapters/api/opencl_extensions.doxy \ chapters/api/openmp_runtime_support.doxy \ chapters/api/mic_extensions.doxy \ chapters/api/scc_extensions.doxy \ chapters/api/parallel_tasks.doxy \ chapters/api/performance_model.doxy \ chapters/api/profiling.doxy \ chapters/api/running_driver.doxy \ chapters/api/scheduling_contexts.doxy \ chapters/api/scheduling_policy.doxy \ chapters/api/standard_memory_library.doxy \ chapters/api/task_bundles.doxy \ chapters/api/task_lists.doxy \ chapters/api/top.doxy \ chapters/api/versioning.doxy \ chapters/api/workers.doxy \ chapters/api/threads.doxy \ chapters/api/bitmap.doxy \ chapters/api/tree.doxy \ chapters/api/toolbox.doxy \ chapters/api/sc_hypervisor/sc_hypervisor.doxy \ chapters/api/sc_hypervisor/sc_hypervisor_usage.doxy \ chapters/api/modularized_scheduler.doxy images = \ chapters/images/data_trace.eps \ chapters/images/data_trace.pdf \ chapters/images/data_trace.png \ chapters/images/distrib_data.eps \ chapters/images/distrib_data.pdf \ chapters/images/distrib_data.png \ chapters/images/distrib_data_histo.eps \ chapters/images/distrib_data_histo.pdf \ chapters/images/distrib_data_histo.png \ chapters/images/paje_draw_histogram.eps \ chapters/images/paje_draw_histogram.pdf \ chapters/images/paje_draw_histogram.png \ chapters/images/parallel_worker2.eps \ chapters/images/parallel_worker2.pdf \ chapters/images/parallel_worker2.png \ chapters/images/runtime-par.eps \ chapters/images/runtime-par.pdf \ chapters/images/runtime-par.png \ chapters/images/starpu_non_linear_memset_regression_based.eps \ chapters/images/starpu_non_linear_memset_regression_based.pdf \ chapters/images/starpu_non_linear_memset_regression_based.png \ chapters/images/starpu_non_linear_memset_regression_based_2.eps \ chapters/images/starpu_non_linear_memset_regression_based_2.pdf \ chapters/images/starpu_non_linear_memset_regression_based_2.png \ chapters/images/starpu_starpu_slu_lu_model_11.eps \ chapters/images/starpu_starpu_slu_lu_model_11.pdf \ chapters/images/starpu_starpu_slu_lu_model_11.png \ chapters/images/tasks_size_overhead.eps \ chapters/images/tasks_size_overhead.pdf \ chapters/images/tasks_size_overhead.png \ chapters/images/temanejo.png if BUILD_DOC starpu_config.h: $(top_srcdir)/include/starpu_config.h.in @$(SED) 's/#undef \(.*\)/#define \1 1/' $< > $@ chapters/version.sty: $(chapters) @for f in $(chapters) ; do \ if test -f $(top_srcdir)/doc/doxygen/$$f ; then $(PROG_STAT) --format=%Y $(top_srcdir)/doc/doxygen/$$f ; fi \ done | sort -r | head -1 > timestamp_sty @if test -s timestamp_sty ; then \ LC_ALL=C $(PROG_DATE) --date=@`cat timestamp_sty` +"%d %B %Y" > timestamp_sty_updated ;\ LC_ALL=C $(PROG_DATE) --date=@`cat timestamp_sty` +"%B %Y" > timestamp_sty_updated_month ;\ fi @if test -s timestamp_sty_updated ; then \ echo ':newcommand{:STARPUUPDATED}{'`cat timestamp_sty_updated`'}' > $(top_srcdir)/doc/doxygen/chapters/version.sty;\ else \ echo ':newcommand{:STARPUUPDATED}{unknown date}' > $(top_srcdir)/doc/doxygen/chapters/version.sty;\ fi @echo ':newcommand{:STARPUVERSION}{$(VERSION)}' >> $(top_srcdir)/doc/doxygen/chapters/version.sty @$(SED) -i 's/:/\\/g' $(top_srcdir)/doc/doxygen/chapters/version.sty @for f in timestamp_sty timestamp_sty_updated timestamp_sty_updated_month ; do \ if test -f $$f ; then $(RM) $$f ; fi ;\ done chapters/version.html: $(chapters) @for f in $(chapters) ; do \ if test -f $(top_srcdir)/doc/doxygen/$$f ; then $(PROG_STAT) --format=%Y $(top_srcdir)/doc/doxygen/$$f ; fi \ done | sort -r | head -1 > timestamp_html @if test -s timestamp_html ; then \ LC_ALL=C $(PROG_DATE) --date=@`cat timestamp_html` +"%d %B %Y" > timestamp_html_updated ;\ LC_ALL=C $(PROG_DATE) --date=@`cat timestamp_html` +"%B %Y" > timestamp_html_updated_month ;\ fi @echo "This manual documents the usage of StarPU version $(VERSION)." > $(top_srcdir)/doc/doxygen/chapters/version.html @if test -s timestamp_html_updated ; then \ echo "Its contents was last updated on "`cat timestamp_html_updated`"." >> $(top_srcdir)/doc/doxygen/chapters/version.html;\ else \ echo "Its contents was last updated on unknown_date." >> $(top_srcdir)/doc/doxygen/chapters/version.html;\ fi @for f in timestamp_html timestamp_html_updated timestamp_html_updated_month ; do \ if test -f $$f ; then $(RM) $$f ; fi ;\ done dox_inputs = $(DOX_CONFIG) \ $(chapters) \ starpu_config.h \ chapters/version.sty \ chapters/version.html \ $(top_srcdir)/include/starpu.h \ $(top_srcdir)/include/starpu_bitmap.h \ $(top_srcdir)/include/starpu_bound.h \ $(top_srcdir)/include/starpu_cublas.h \ $(top_srcdir)/include/starpu_cuda.h \ $(top_srcdir)/include/starpu_data_filters.h \ $(top_srcdir)/include/starpu_data.h \ $(top_srcdir)/include/starpu_data_interfaces.h \ $(top_srcdir)/include/starpu_deprecated_api.h \ $(top_srcdir)/include/starpu_disk.h \ $(top_srcdir)/include/starpu_driver.h \ $(top_srcdir)/include/starpu_expert.h \ $(top_srcdir)/include/starpu_fxt.h \ $(top_srcdir)/include/starpu_hash.h \ $(top_srcdir)/include/starpu_mic.h \ $(top_srcdir)/include/starpu_mod.f90 \ $(top_srcdir)/include/starpu_opencl.h \ $(top_srcdir)/include/starpu_openmp.h \ $(top_srcdir)/include/starpu_perfmodel.h \ $(top_srcdir)/include/starpu_profiling.h \ $(top_srcdir)/include/starpu_rand.h \ $(top_srcdir)/include/starpu_scc.h \ $(top_srcdir)/include/starpu_sched_component.h \ $(top_srcdir)/include/starpu_sched_ctx.h \ $(top_srcdir)/include/starpu_sched_ctx_hypervisor.h \ $(top_srcdir)/include/starpu_scheduler.h \ $(top_srcdir)/include/starpu_simgrid_wrap.h \ $(top_srcdir)/include/starpu_sink.h \ $(top_srcdir)/include/starpu_stdlib.h \ $(top_srcdir)/include/starpu_task_bundle.h \ $(top_srcdir)/include/starpu_task.h \ $(top_srcdir)/include/starpu_task_list.h \ $(top_srcdir)/include/starpu_task_util.h \ $(top_srcdir)/include/starpu_thread.h \ $(top_srcdir)/include/starpu_thread_util.h \ $(top_srcdir)/include/starpu_top.h \ $(top_srcdir)/include/starpu_tree.h \ $(top_srcdir)/include/starpu_util.h \ $(top_srcdir)/include/starpu_worker.h \ $(top_srcdir)/include/fstarpu_mod.f90 \ $(top_srcdir)/mpi/include/starpu_mpi.h \ $(top_srcdir)/mpi/include/fstarpu_mpi_mod.f90 \ $(top_srcdir)/sc_hypervisor/include/sc_hypervisor.h \ $(top_srcdir)/sc_hypervisor/include/sc_hypervisor_config.h \ $(top_srcdir)/sc_hypervisor/include/sc_hypervisor_lp.h \ $(top_srcdir)/sc_hypervisor/include/sc_hypervisor_monitoring.h \ $(top_srcdir)/sc_hypervisor/include/sc_hypervisor_policy.h $(DOX_TAG): $(dox_inputs) @rm -fr $(DOX_HTML_DIR) $(DOX_LATEX_DIR) @$(DOXYGEN) $(DOX_CONFIG) @$(SED) -i 's/ModuleDocumentation <\/li>/Modules<\/a>/' html/index.html @$(SED) -i 's/FileDocumentation <\/li>/Files<\/a>/' html/index.html # comment for the line below: what we really want to do is to remove the line, but dy doing so, it avoids opening the interactive menu when browsing files @if test -f html/navtree.js ; then $(SED) -i 's/\[ "Files", "Files.html", null \]/\[ "", "Files.html", null \]/' html/navtree.js ; fi @$(SED) -i 's/.*"Files.html".*//' html/pages.html @if test -f latex/main.tex ; then mv latex/main.tex latex/index.tex ; fi @$(SED) -i '/\\begin{titlepage}/,$$d' $(DOX_LATEX_DIR)/refman.tex @cat $(top_srcdir)/doc/doxygen/refman.tex >> $(DOX_LATEX_DIR)/refman.tex $(DOX_PDF): $(DOX_TAG) refman.tex @cp $(top_srcdir)/doc/doxygen/chapters/version.sty $(DOX_LATEX_DIR) @cp $(top_srcdir)/doc/doxygen/chapters/images/*pdf $(DOX_LATEX_DIR) @echo $(PDFLATEX) $(DOX_LATEX_DIR)/refman.tex @cd $(DOX_LATEX_DIR) ;\ rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out ;\ $(SED) -i -e 's/__env__/\\_Environment Variables!/' -e 's/\\-\\_\\-\\-\\_\\-env\\-\\_\\-\\-\\_\\-//' ExecutionConfigurationThroughEnvironmentVariables.tex ;\ $(SED) -i -e 's/__configure__/\\_Configure Options!/' -e 's/\\-\\_\\-\\-\\_\\-configure\\-\\_\\-\\-\\_\\-//' CompilationConfiguration.tex ;\ $(SED) -i s'/\\item Module\\-Documentation/\\item \\hyperlink{ModuleDocumentation}{Module Documentation}/' index.tex ;\ $(SED) -i s'/\\item File\\-Documentation/\\item \\hyperlink{FileDocumentation}{File Documentation}/' index.tex ;\ $(PDFLATEX) refman.tex > /dev/null ;\ $(MAKEINDEX) refman.idx > /dev/null 2>&1 ;\ $(PDFLATEX) refman.tex > /dev/null ;\ done=0; repeat=5 ;\ while test $$done = 0 -a $$repeat -gt 0; do \ if $(EGREP) 'Rerun (LaTeX|to get cross-references right)' refman.log > /dev/null 2>&1; then \ $(PDFLATEX) refman.tex; \ repeat=`expr $$repeat - 1`; \ else \ done=1; \ fi; \ done mv $(DOX_LATEX_DIR)/refman.pdf $(DOX_PDF) CLEANFILES = $(DOX_TAG) starpu_config.h \ -r \ $(DOX_HTML_DIR) \ $(DOX_LATEX_DIR) \ $(DOX_PDF) endif EXTRA_DIST += doxygen.cfg refman.tex \ $(chapters) $(images) # Rule to update documentation on web server. Should only be used locally. PUBLISHHOST ?= gforge update-web: $(DOX_PDF) scp -pr starpu.pdf html $(PUBLISHHOST):/home/groups/starpu/htdocs/doc showcheck: -cat /dev/null starpu-1.2.3+dfsg/doc/doxygen/Makefile.in000066400000000000000000001064271320135501600202470ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009, 2011, 2013-2014, 2017 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS # Copyright (C) 2014 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @BUILD_DOC_TRUE@am__append_1 = $(DOX_HTML_DIR) $(DOX_PDF) @AVAILABLE_DOC_TRUE@@BUILD_DOC_FALSE@am__append_2 = $(top_srcdir)/doc/doxygen/html $(top_srcdir)/doc/doxygen/starpu.pdf subdir = doc/doxygen ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = doxygen-config.cfg doxygen_filter.sh CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(txtdir)" DATA = $(txt_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(srcdir)/doxygen-config.cfg.in $(srcdir)/doxygen_filter.sh.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POTI_CFLAGS = @POTI_CFLAGS@ POTI_LIBS = @POTI_LIBS@ PROG_DATE = @PROG_DATE@ PROG_STAT = @PROG_STAT@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_COI_CPPFLAGS = @STARPU_COI_CPPFLAGS@ STARPU_COI_LDFLAGS = @STARPU_COI_LDFLAGS@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LEVELDB_LDFLAGS = @STARPU_LEVELDB_LDFLAGS@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RCCE_CFLAGS = @STARPU_RCCE_CFLAGS@ STARPU_RCCE_CPPFLAGS = @STARPU_RCCE_CPPFLAGS@ STARPU_RCCE_LDFLAGS = @STARPU_RCCE_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SCIF_CPPFLAGS = @STARPU_SCIF_CPPFLAGS@ STARPU_SCIF_LDFLAGS = @STARPU_SCIF_LDFLAGS@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SC_HYPERVISOR_DEBUG = @STARPU_SC_HYPERVISOR_DEBUG@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ mpifort_path = @mpifort_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ smpirun_path = @smpirun_path@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ DOXYGEN = doxygen PDFLATEX = pdflatex MAKEINDEX = makeindex DOX_DIR = $(top_builddir)/doc/doxygen DOX_CONFIG = $(top_srcdir)/doc/doxygen/doxygen.cfg DOX_HTML_DIR = html DOX_LATEX_DIR = latex DOX_PDF = $(DOX_DIR)/starpu.pdf DOX_TAG = starpu.tag txtdir = $(docdir)/manual EXTRA_DIST = $(am__append_1) $(am__append_2) doxygen.cfg refman.tex \ $(chapters) $(images) @AVAILABLE_DOC_TRUE@@BUILD_DOC_FALSE@txt_DATA = $(top_srcdir)/doc/doxygen/starpu.pdf @BUILD_DOC_TRUE@txt_DATA = $(DOX_PDF) @AVAILABLE_DOC_TRUE@@BUILD_DOC_FALSE@DOX_HTML_SRCDIR = $(top_srcdir)/doc/doxygen/html @BUILD_DOC_TRUE@DOX_HTML_SRCDIR = $(DOX_HTML_DIR) chapters = \ chapters/000_introduction.doxy \ chapters/101_building.doxy \ chapters/110_basic_examples.doxy \ chapters/201_advanced_examples.doxy \ chapters/210_check_list_performance.doxy \ chapters/301_tasks.doxy \ chapters/310_data_management.doxy \ chapters/320_scheduling.doxy \ chapters/330_scheduling_contexts.doxy \ chapters/340_scheduling_context_hypervisor.doxy \ chapters/350_modularized_scheduler.doxy \ chapters/360_debugging_tools.doxy \ chapters/370_online_performance_tools.doxy \ chapters/380_offline_performance_tools.doxy \ chapters/390_faq.doxy \ chapters/401_out_of_core.doxy \ chapters/410_mpi_support.doxy \ chapters/420_fft_support.doxy \ chapters/430_mic_scc_support.doxy \ chapters/440_c_extensions.doxy \ chapters/450_native_fortran_support.doxy \ chapters/460_socl_opencl_extensions.doxy \ chapters/470_simgrid.doxy \ chapters/480_openmp_runtime_support.doxy \ chapters/501_environment_variables.doxy \ chapters/510_configure_options.doxy \ chapters/520_files.doxy \ chapters/601_scaling_vector_example.doxy \ chapters/610_fdl_1_3.doxy \ chapters/code/hello_pragma2.c \ chapters/code/hello_pragma.c \ chapters/code/scal_pragma.cu \ chapters/code/matmul_pragma.c \ chapters/code/matmul_pragma2.c \ chapters/code/cholesky_pragma.c \ chapters/code/forkmode.c \ chapters/code/multiformat.c \ chapters/code/complex.c \ chapters/code/simgrid.c \ chapters/code/vector_scal_c.c \ chapters/code/vector_scal_cpu.c \ chapters/code/vector_scal_cuda.cu \ chapters/code/vector_scal_opencl.c \ chapters/code/vector_scal_opencl_codelet.cl \ chapters/code/disk_copy.c \ chapters/code/disk_compute.c \ chapters/code/nf_initexit.f90 \ chapters/api/codelet_and_tasks.doxy \ chapters/api/cuda_extensions.doxy \ chapters/api/data_interfaces.doxy \ chapters/api/data_management.doxy \ chapters/api/data_partition.doxy \ chapters/api/data_out_of_core.doxy \ chapters/api/expert_mode.doxy \ chapters/api/explicit_dependencies.doxy \ chapters/api/fft_support.doxy \ chapters/api/fxt_support.doxy \ chapters/api/implicit_dependencies.doxy \ chapters/api/initialization.doxy \ chapters/api/insert_task.doxy \ chapters/api/lower_bound.doxy \ chapters/api/misc_helpers.doxy \ chapters/api/mpi.doxy \ chapters/api/multiformat_data_interface.doxy \ chapters/api/opencl_extensions.doxy \ chapters/api/openmp_runtime_support.doxy \ chapters/api/mic_extensions.doxy \ chapters/api/scc_extensions.doxy \ chapters/api/parallel_tasks.doxy \ chapters/api/performance_model.doxy \ chapters/api/profiling.doxy \ chapters/api/running_driver.doxy \ chapters/api/scheduling_contexts.doxy \ chapters/api/scheduling_policy.doxy \ chapters/api/standard_memory_library.doxy \ chapters/api/task_bundles.doxy \ chapters/api/task_lists.doxy \ chapters/api/top.doxy \ chapters/api/versioning.doxy \ chapters/api/workers.doxy \ chapters/api/threads.doxy \ chapters/api/bitmap.doxy \ chapters/api/tree.doxy \ chapters/api/toolbox.doxy \ chapters/api/sc_hypervisor/sc_hypervisor.doxy \ chapters/api/sc_hypervisor/sc_hypervisor_usage.doxy \ chapters/api/modularized_scheduler.doxy images = \ chapters/images/data_trace.eps \ chapters/images/data_trace.pdf \ chapters/images/data_trace.png \ chapters/images/distrib_data.eps \ chapters/images/distrib_data.pdf \ chapters/images/distrib_data.png \ chapters/images/distrib_data_histo.eps \ chapters/images/distrib_data_histo.pdf \ chapters/images/distrib_data_histo.png \ chapters/images/paje_draw_histogram.eps \ chapters/images/paje_draw_histogram.pdf \ chapters/images/paje_draw_histogram.png \ chapters/images/parallel_worker2.eps \ chapters/images/parallel_worker2.pdf \ chapters/images/parallel_worker2.png \ chapters/images/runtime-par.eps \ chapters/images/runtime-par.pdf \ chapters/images/runtime-par.png \ chapters/images/starpu_non_linear_memset_regression_based.eps \ chapters/images/starpu_non_linear_memset_regression_based.pdf \ chapters/images/starpu_non_linear_memset_regression_based.png \ chapters/images/starpu_non_linear_memset_regression_based_2.eps \ chapters/images/starpu_non_linear_memset_regression_based_2.pdf \ chapters/images/starpu_non_linear_memset_regression_based_2.png \ chapters/images/starpu_starpu_slu_lu_model_11.eps \ chapters/images/starpu_starpu_slu_lu_model_11.pdf \ chapters/images/starpu_starpu_slu_lu_model_11.png \ chapters/images/tasks_size_overhead.eps \ chapters/images/tasks_size_overhead.pdf \ chapters/images/tasks_size_overhead.png \ chapters/images/temanejo.png @BUILD_DOC_TRUE@dox_inputs = $(DOX_CONFIG) \ @BUILD_DOC_TRUE@ $(chapters) \ @BUILD_DOC_TRUE@ starpu_config.h \ @BUILD_DOC_TRUE@ chapters/version.sty \ @BUILD_DOC_TRUE@ chapters/version.html \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_bitmap.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_bound.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_cublas.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_cuda.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_data_filters.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_data.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_data_interfaces.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_deprecated_api.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_disk.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_driver.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_expert.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_fxt.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_hash.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_mic.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_mod.f90 \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_opencl.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_openmp.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_perfmodel.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_profiling.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_rand.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_scc.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_sched_component.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_sched_ctx.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_sched_ctx_hypervisor.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_scheduler.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_simgrid_wrap.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_sink.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_stdlib.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_task_bundle.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_task.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_task_list.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_task_util.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_thread.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_thread_util.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_top.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_tree.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_util.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_worker.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/include/fstarpu_mod.f90 \ @BUILD_DOC_TRUE@ $(top_srcdir)/mpi/include/starpu_mpi.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/mpi/include/fstarpu_mpi_mod.f90 \ @BUILD_DOC_TRUE@ $(top_srcdir)/sc_hypervisor/include/sc_hypervisor.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/sc_hypervisor/include/sc_hypervisor_config.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/sc_hypervisor/include/sc_hypervisor_lp.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/sc_hypervisor/include/sc_hypervisor_monitoring.h \ @BUILD_DOC_TRUE@ $(top_srcdir)/sc_hypervisor/include/sc_hypervisor_policy.h @BUILD_DOC_TRUE@CLEANFILES = $(DOX_TAG) starpu_config.h \ @BUILD_DOC_TRUE@ -r \ @BUILD_DOC_TRUE@ $(DOX_HTML_DIR) \ @BUILD_DOC_TRUE@ $(DOX_LATEX_DIR) \ @BUILD_DOC_TRUE@ $(DOX_PDF) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/doxygen/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/doxygen/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): doxygen-config.cfg: $(top_builddir)/config.status $(srcdir)/doxygen-config.cfg.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ doxygen_filter.sh: $(top_builddir)/config.status $(srcdir)/doxygen_filter.sh.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-txtDATA: $(txt_DATA) @$(NORMAL_INSTALL) @list='$(txt_DATA)'; test -n "$(txtdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(txtdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(txtdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(txtdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(txtdir)" || exit $$?; \ done uninstall-txtDATA: @$(NORMAL_UNINSTALL) @list='$(txt_DATA)'; test -n "$(txtdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(txtdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(txtdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." @AVAILABLE_DOC_FALSE@@BUILD_DOC_FALSE@install-exec-hook: @AVAILABLE_DOC_FALSE@@BUILD_DOC_FALSE@uninstall-hook: clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-txtDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-exec-hook install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-txtDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook .MAKE: install-am install-exec-am install-strip uninstall-am .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-exec-hook \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip install-txtDATA installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-hook uninstall-txtDATA .PRECIOUS: Makefile @BUILD_DOC_TRUE@all: $(DOX_HTML_DIR) $(DOX_PDF) @BUILD_DOC_TRUE@install-exec-hook: @BUILD_DOC_TRUE@ $(MKDIR_P) $(DESTDIR)$(docdir)/manual/html @BUILD_DOC_TRUE@ (cd $(DOX_HTML_SRCDIR) && find . -type f -exec $(INSTALL) -c -m 644 {} $(DESTDIR)$(docdir)/manual/html \;) @BUILD_DOC_TRUE@uninstall-hook: @BUILD_DOC_TRUE@ rm -rf $(DESTDIR)$(docdir)/manual/html @AVAILABLE_DOC_TRUE@@BUILD_DOC_FALSE@install-exec-hook: @AVAILABLE_DOC_TRUE@@BUILD_DOC_FALSE@ $(MKDIR_P) $(DESTDIR)$(docdir)/manual/html @AVAILABLE_DOC_TRUE@@BUILD_DOC_FALSE@ (cd $(DOX_HTML_SRCDIR) && find . -type f -exec $(INSTALL) -c -m 644 {} $(DESTDIR)$(docdir)/manual/html \;) @AVAILABLE_DOC_TRUE@@BUILD_DOC_FALSE@uninstall-hook: @AVAILABLE_DOC_TRUE@@BUILD_DOC_FALSE@ rm -rf $(DESTDIR)$(docdir)/manual/html @BUILD_DOC_TRUE@starpu_config.h: $(top_srcdir)/include/starpu_config.h.in @BUILD_DOC_TRUE@ @$(SED) 's/#undef \(.*\)/#define \1 1/' $< > $@ @BUILD_DOC_TRUE@chapters/version.sty: $(chapters) @BUILD_DOC_TRUE@ @for f in $(chapters) ; do \ @BUILD_DOC_TRUE@ if test -f $(top_srcdir)/doc/doxygen/$$f ; then $(PROG_STAT) --format=%Y $(top_srcdir)/doc/doxygen/$$f ; fi \ @BUILD_DOC_TRUE@ done | sort -r | head -1 > timestamp_sty @BUILD_DOC_TRUE@ @if test -s timestamp_sty ; then \ @BUILD_DOC_TRUE@ LC_ALL=C $(PROG_DATE) --date=@`cat timestamp_sty` +"%d %B %Y" > timestamp_sty_updated ;\ @BUILD_DOC_TRUE@ LC_ALL=C $(PROG_DATE) --date=@`cat timestamp_sty` +"%B %Y" > timestamp_sty_updated_month ;\ @BUILD_DOC_TRUE@ fi @BUILD_DOC_TRUE@ @if test -s timestamp_sty_updated ; then \ @BUILD_DOC_TRUE@ echo ':newcommand{:STARPUUPDATED}{'`cat timestamp_sty_updated`'}' > $(top_srcdir)/doc/doxygen/chapters/version.sty;\ @BUILD_DOC_TRUE@ else \ @BUILD_DOC_TRUE@ echo ':newcommand{:STARPUUPDATED}{unknown date}' > $(top_srcdir)/doc/doxygen/chapters/version.sty;\ @BUILD_DOC_TRUE@ fi @BUILD_DOC_TRUE@ @echo ':newcommand{:STARPUVERSION}{$(VERSION)}' >> $(top_srcdir)/doc/doxygen/chapters/version.sty @BUILD_DOC_TRUE@ @$(SED) -i 's/:/\\/g' $(top_srcdir)/doc/doxygen/chapters/version.sty @BUILD_DOC_TRUE@ @for f in timestamp_sty timestamp_sty_updated timestamp_sty_updated_month ; do \ @BUILD_DOC_TRUE@ if test -f $$f ; then $(RM) $$f ; fi ;\ @BUILD_DOC_TRUE@ done @BUILD_DOC_TRUE@chapters/version.html: $(chapters) @BUILD_DOC_TRUE@ @for f in $(chapters) ; do \ @BUILD_DOC_TRUE@ if test -f $(top_srcdir)/doc/doxygen/$$f ; then $(PROG_STAT) --format=%Y $(top_srcdir)/doc/doxygen/$$f ; fi \ @BUILD_DOC_TRUE@ done | sort -r | head -1 > timestamp_html @BUILD_DOC_TRUE@ @if test -s timestamp_html ; then \ @BUILD_DOC_TRUE@ LC_ALL=C $(PROG_DATE) --date=@`cat timestamp_html` +"%d %B %Y" > timestamp_html_updated ;\ @BUILD_DOC_TRUE@ LC_ALL=C $(PROG_DATE) --date=@`cat timestamp_html` +"%B %Y" > timestamp_html_updated_month ;\ @BUILD_DOC_TRUE@ fi @BUILD_DOC_TRUE@ @echo "This manual documents the usage of StarPU version $(VERSION)." > $(top_srcdir)/doc/doxygen/chapters/version.html @BUILD_DOC_TRUE@ @if test -s timestamp_html_updated ; then \ @BUILD_DOC_TRUE@ echo "Its contents was last updated on "`cat timestamp_html_updated`"." >> $(top_srcdir)/doc/doxygen/chapters/version.html;\ @BUILD_DOC_TRUE@ else \ @BUILD_DOC_TRUE@ echo "Its contents was last updated on unknown_date." >> $(top_srcdir)/doc/doxygen/chapters/version.html;\ @BUILD_DOC_TRUE@ fi @BUILD_DOC_TRUE@ @for f in timestamp_html timestamp_html_updated timestamp_html_updated_month ; do \ @BUILD_DOC_TRUE@ if test -f $$f ; then $(RM) $$f ; fi ;\ @BUILD_DOC_TRUE@ done @BUILD_DOC_TRUE@$(DOX_TAG): $(dox_inputs) @BUILD_DOC_TRUE@ @rm -fr $(DOX_HTML_DIR) $(DOX_LATEX_DIR) @BUILD_DOC_TRUE@ @$(DOXYGEN) $(DOX_CONFIG) @BUILD_DOC_TRUE@ @$(SED) -i 's/ModuleDocumentation <\/li>/Modules<\/a>/' html/index.html @BUILD_DOC_TRUE@ @$(SED) -i 's/FileDocumentation <\/li>/Files<\/a>/' html/index.html @BUILD_DOC_TRUE@ # comment for the line below: what we really want to do is to remove the line, but dy doing so, it avoids opening the interactive menu when browsing files @BUILD_DOC_TRUE@ @if test -f html/navtree.js ; then $(SED) -i 's/\[ "Files", "Files.html", null \]/\[ "", "Files.html", null \]/' html/navtree.js ; fi @BUILD_DOC_TRUE@ @$(SED) -i 's/.*"Files.html".*//' html/pages.html @BUILD_DOC_TRUE@ @if test -f latex/main.tex ; then mv latex/main.tex latex/index.tex ; fi @BUILD_DOC_TRUE@ @$(SED) -i '/\\begin{titlepage}/,$$d' $(DOX_LATEX_DIR)/refman.tex @BUILD_DOC_TRUE@ @cat $(top_srcdir)/doc/doxygen/refman.tex >> $(DOX_LATEX_DIR)/refman.tex @BUILD_DOC_TRUE@$(DOX_PDF): $(DOX_TAG) refman.tex @BUILD_DOC_TRUE@ @cp $(top_srcdir)/doc/doxygen/chapters/version.sty $(DOX_LATEX_DIR) @BUILD_DOC_TRUE@ @cp $(top_srcdir)/doc/doxygen/chapters/images/*pdf $(DOX_LATEX_DIR) @BUILD_DOC_TRUE@ @echo $(PDFLATEX) $(DOX_LATEX_DIR)/refman.tex @BUILD_DOC_TRUE@ @cd $(DOX_LATEX_DIR) ;\ @BUILD_DOC_TRUE@ rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out ;\ @BUILD_DOC_TRUE@ $(SED) -i -e 's/__env__/\\_Environment Variables!/' -e 's/\\-\\_\\-\\-\\_\\-env\\-\\_\\-\\-\\_\\-//' ExecutionConfigurationThroughEnvironmentVariables.tex ;\ @BUILD_DOC_TRUE@ $(SED) -i -e 's/__configure__/\\_Configure Options!/' -e 's/\\-\\_\\-\\-\\_\\-configure\\-\\_\\-\\-\\_\\-//' CompilationConfiguration.tex ;\ @BUILD_DOC_TRUE@ $(SED) -i s'/\\item Module\\-Documentation/\\item \\hyperlink{ModuleDocumentation}{Module Documentation}/' index.tex ;\ @BUILD_DOC_TRUE@ $(SED) -i s'/\\item File\\-Documentation/\\item \\hyperlink{FileDocumentation}{File Documentation}/' index.tex ;\ @BUILD_DOC_TRUE@ $(PDFLATEX) refman.tex > /dev/null ;\ @BUILD_DOC_TRUE@ $(MAKEINDEX) refman.idx > /dev/null 2>&1 ;\ @BUILD_DOC_TRUE@ $(PDFLATEX) refman.tex > /dev/null ;\ @BUILD_DOC_TRUE@ done=0; repeat=5 ;\ @BUILD_DOC_TRUE@ while test $$done = 0 -a $$repeat -gt 0; do \ @BUILD_DOC_TRUE@ if $(EGREP) 'Rerun (LaTeX|to get cross-references right)' refman.log > /dev/null 2>&1; then \ @BUILD_DOC_TRUE@ $(PDFLATEX) refman.tex; \ @BUILD_DOC_TRUE@ repeat=`expr $$repeat - 1`; \ @BUILD_DOC_TRUE@ else \ @BUILD_DOC_TRUE@ done=1; \ @BUILD_DOC_TRUE@ fi; \ @BUILD_DOC_TRUE@ done @BUILD_DOC_TRUE@ mv $(DOX_LATEX_DIR)/refman.pdf $(DOX_PDF) # Rule to update documentation on web server. Should only be used locally. PUBLISHHOST ?= gforge update-web: $(DOX_PDF) scp -pr starpu.pdf html $(PUBLISHHOST):/home/groups/starpu/htdocs/doc showcheck: -cat /dev/null # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.2.3+dfsg/doc/doxygen/chapters/000077500000000000000000000000001320135501600200015ustar00rootroot00000000000000starpu-1.2.3+dfsg/doc/doxygen/chapters/000_introduction.doxy000066400000000000000000000260101320135501600240050ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016 CNRS * Copyright (C) 2011, 2012, 2016 INRIA * See the file version.doxy for copying conditions. */ /*! \mainpage Introduction \htmlonly

Foreword

\endhtmlonly \htmlinclude version.html \htmlinclude foreword.html \section Motivation Motivation // This is a comment and it will be removed before the file is processed by doxygen // complex machines with heterogeneous cores/devices The use of specialized hardware such as accelerators or coprocessors offers an interesting approach to overcome the physical limits encountered by processor architects. As a result, many machines are now equipped with one or several accelerators (e.g. a GPU), in addition to the usual processor(s). While a lot of efforts have been devoted to offload computation onto such accelerators, very little attention as been paid to portability concerns on the one hand, and to the possibility of having heterogeneous accelerators and processors to interact on the other hand. StarPU is a runtime system that offers support for heterogeneous multicore architectures, it not only offers a unified view of the computational resources (i.e. CPUs and accelerators at the same time), but it also takes care of efficiently mapping and executing tasks onto an heterogeneous machine while transparently handling low-level issues such as data transfers in a portable fashion. // this leads to a complicated distributed memory design // which is not (easily) manageable by hand // added value/benefits of StarPU // - portability // - scheduling, perf. portability \section StarPUInANutshell StarPU in a Nutshell StarPU is a software tool aiming to allow programmers to exploit the computing power of the available CPUs and GPUs, while relieving them from the need to specially adapt their programs to the target machine and processing units. At the core of StarPU is its run-time support library, which is responsible for scheduling application-provided tasks on heterogeneous CPU/GPU machines. In addition, StarPU comes with programming language support, in the form of extensions to languages of the C family (\ref cExtensions), as well as an OpenCL front-end (\ref SOCLOpenclExtensions). StarPU's run-time and programming language extensions support a task-based programming model. Applications submit computational tasks, with CPU and/or GPU implementations, and StarPU schedules these tasks and associated data transfers on available CPUs and GPUs. The data that a task manipulates are automatically transferred among accelerators and the main memory, so that programmers are freed from the scheduling issues and technical details associated with these transfers. StarPU takes particular care of scheduling tasks efficiently, using well-known algorithms from the literature (\ref TaskSchedulingPolicy). In addition, it allows scheduling experts, such as compiler or computational library developers, to implement custom scheduling policies in a portable fashion (\ref DefiningANewSchedulingPolicy). The remainder of this section describes the main concepts used in StarPU. // explain the notion of codelet and task (i.e. g(A, B) \subsection CodeletAndTasks Codelet and Tasks One of the StarPU primary data structures is the \b codelet. A codelet describes a computational kernel that can possibly be implemented on multiple architectures such as a CPU, a CUDA device or an OpenCL device. // TODO insert illustration f: f_spu, f_cpu, ... Another important data structure is the \b task. Executing a StarPU task consists in applying a codelet on a data set, on one of the architectures on which the codelet is implemented. A task thus describes the codelet that it uses, but also which data are accessed, and how they are accessed during the computation (read and/or write). StarPU tasks are asynchronous: submitting a task to StarPU is a non-blocking operation. The task structure can also specify a \b callback function that is called once StarPU has properly executed the task. It also contains optional fields that the application may use to give hints to the scheduler (such as priority levels). By default, task dependencies are inferred from data dependency (sequential coherency) by StarPU. The application can however disable sequential coherency for some data, and dependencies can be specifically expressed. A task may be identified by a unique 64-bit number chosen by the application which we refer as a \b tag. Task dependencies can be enforced either by the means of callback functions, by submitting other tasks, or by expressing dependencies between tags (which can thus correspond to tasks that have not yet been submitted). // TODO insert illustration f(Ar, Brw, Cr) + .. // DSM \subsection StarPUDataManagementLibrary StarPU Data Management Library Because StarPU schedules tasks at runtime, data transfers have to be done automatically and ``just-in-time'' between processing units, relieving application programmers from explicit data transfers. Moreover, to avoid unnecessary transfers, StarPU keeps data where it was last needed, even if was modified there, and it allows multiple copies of the same data to reside at the same time on several processing units as long as it is not modified. \section ApplicationTaskification Application Taskification TODO // TODO: section describing what taskifying an application means: before // porting to StarPU, turn the program into: // "pure" functions, which only access data from their passed parameters // a main function which just calls these pure functions // and then it's trivial to use StarPU or any other kind of task-based library: // simply replace calling the function with submitting a task. \section Glossary Glossary A \b codelet records pointers to various implementations of the same theoretical function. A memory node can be either the main RAM, GPU-embedded memory or a disk memory. A \b bus is a link between memory nodes. A data handle keeps track of replicates of the same data (\b registered by the application) over various memory nodes. The data management library manages to keep them coherent. The \b home memory node of a data handle is the memory node from which the data was registered (usually the main memory node). A \b task represents a scheduled execution of a codelet on some data handles. A \b tag is a rendez-vous point. Tasks typically have their own tag, and can depend on other tags. The value is chosen by the application. A \b worker execute tasks. There is typically one per CPU computation core and one per accelerator (for which a whole CPU core is dedicated). A \b driver drives a given kind of workers. There are currently CPU, CUDA, and OpenCL drivers. They usually start several workers to actually drive them. A performance model is a (dynamic or static) model of the performance of a given codelet. Codelets can have execution time performance model as well as energy consumption performance models. A data \b interface describes the layout of the data: for a vector, a pointer for the start, the number of elements and the size of elements ; for a matrix, a pointer for the start, the number of elements per row, the offset between rows, and the size of each element ; etc. To access their data, codelet functions are given interfaces for the local memory node replicates of the data handles of the scheduled task. \b Partitioning data means dividing the data of a given data handle (called \b father) into a series of \b children data handles which designate various portions of the former. A \b filter is the function which computes children data handles from a father data handle, and thus describes how the partitioning should be done (horizontal, vertical, etc.) \b Acquiring a data handle can be done from the main application, to safely access the data of a data handle from its home node, without having to unregister it. \section ResearchPapers Research Papers Research papers about StarPU can be found at http://starpu.gforge.inria.fr/publications/. A good overview is available in the research report at http://hal.archives-ouvertes.fr/inria-00467677. \section StarPUApplications StarPU Applications You can first have a look at the chapters \ref BasicExamples and \ref AdvancedExamples. A tutorial is also installed in the directory share/doc/starpu/tutorial/. Many examples are also available in the StarPU sources in the directory examples/. Simple examples include:
incrementer/
Trivial incrementation test.
basic_examples/
Simple documented Hello world and vector/scalar product (as shown in \ref BasicExamples), matrix product examples (as shown in \ref PerformanceModelExample), an example using the blocked matrix data interface, an example using the variable data interface, and an example using different formats on CPUs and GPUs.
matvecmult/
OpenCL example from NVidia, adapted to StarPU.
axpy/
AXPY CUBLAS operation adapted to StarPU.
native_fortran/
Example of using StarPU's native Fortran support.
fortran90/
Example of Fortran 90 bindings, using C marshalling wrappers.
fortran/
Example of Fortran 77 bindings, using C marshalling wrappers.
More advanced examples include:
filters/
Examples using filters, as shown in \ref PartitioningData.
lu/
LU matrix factorization, see for instance xlu_implicit.c
cholesky/
Cholesky matrix factorization, see for instance cholesky_implicit.c.
\section FurtherReading Further Reading The documentation chapters include
  • Part 1: StarPU Basics
    • \ref BuildingAndInstallingStarPU
    • \ref BasicExamples
  • Part 2: StarPU Quick Programming Guide
    • \ref AdvancedExamples
    • \ref CheckListWhenPerformanceAreNotThere
  • Part 3: StarPU Inside
    • \ref TasksInStarPU
    • \ref DataManagement
    • \ref Scheduling
    • \ref SchedulingContexts
    • \ref SchedulingContextHypervisor
    • \ref ModularizedScheduler
    • \ref DebuggingTools
    • \ref OnlinePerformanceTools
    • \ref OfflinePerformanceTools
    • \ref FrequentlyAskedQuestions
  • Part 4: StarPU Extensions
    • \ref OutOfCore
    • \ref MPISupport
    • \ref FFTSupport
    • \ref MICSCCSupport
    • \ref cExtensions
    • \ref NativeFortranSupport
    • \ref SOCLOpenclExtensions
    • \ref SimGridSupport
    • \ref OpenMPRuntimeSupport
  • Part 5: StarPU Reference API
    • \ref ExecutionConfigurationThroughEnvironmentVariables
    • \ref CompilationConfiguration
    • \ref ModuleDocumentation
    • \ref FileDocumentation
    • \ref deprecated
  • Part: Appendix
    • \ref FullSourceCodeVectorScal
    • \ref GNUFreeDocumentationLicense
Make sure to have had a look at those too! */ starpu-1.2.3+dfsg/doc/doxygen/chapters/101_building.doxy000066400000000000000000000322041320135501600230650ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \page BuildingAndInstallingStarPU Building and Installing StarPU \section InstallingABinaryPackage Installing a Binary Package One of the StarPU developers being a Debian Developer, the packages are well integrated and very uptodate. To see which packages are available, simply type: \verbatim $ apt-cache search starpu \endverbatim To install what you need, type for example: \verbatim $ sudo apt-get install libstarpu-1.2 libstarpu-dev \endverbatim \section InstallingFromSource Installing from Source StarPU can be built and installed by the standard means of the GNU autotools. The following chapter is intended to briefly remind how these tools can be used to install StarPU. \subsection OptionalDependencies Optional Dependencies The hwloc (http://www.open-mpi.org/software/hwloc) topology discovery library is not mandatory to use StarPU but strongly recommended. It allows for topology aware scheduling, which improves performance. libhwloc is available in major free operating system distributions, and for most operating systems. If libhwloc is not available on your system, the option \ref without-hwloc "--without-hwloc" should be explicitely given when calling the configure script. If libhwloc is installed in a standard location, no option is required, it will be detected automatically, otherwise \ref with-hwloc "--with-hwloc=" should be used to specify its location. \subsection GettingSources Getting Sources StarPU's sources can be obtained from the download page of the StarPU website (http://starpu.gforge.inria.fr/files/). All releases and the development tree of StarPU are freely available on INRIA's gforge under the LGPL license. Some releases are available under the BSD license. The latest release can be downloaded from the INRIA's gforge (http://gforge.inria.fr/frs/?group_id=1570) or directly from the StarPU download page (http://starpu.gforge.inria.fr/files/). The latest nightly snapshot can be downloaded from the StarPU gforge website (http://starpu.gforge.inria.fr/testing/). \verbatim $ wget http://starpu.gforge.inria.fr/testing/starpu-nightly-latest.tar.gz \endverbatim And finally, current development version is also accessible via svn. It should be used only if you need the very latest changes (i.e. less than a day!). Note that the client side of the software Subversion can be obtained from http://subversion.tigris.org. If you are running on Windows, you will probably prefer to use TortoiseSVN (http://tortoisesvn.tigris.org/). \verbatim $ svn checkout svn://scm.gforge.inria.fr/svn/starpu/trunk StarPU \endverbatim \subsection ConfiguringStarPU Configuring StarPU Running autogen.sh is not necessary when using the tarball releases of StarPU. If you are using the source code from the svn repository, you first need to generate the configure scripts and the Makefiles. This requires the availability of autoconf and automake >= 2.60. \verbatim $ ./autogen.sh \endverbatim You then need to configure StarPU. Details about options that are useful to give to ./configure are given in \ref CompilationConfiguration. \verbatim $ ./configure \endverbatim If configure does not detect some software or produces errors, please make sure to post the contents of the file config.log when reporting the issue. By default, the files produced during the compilation are placed in the source directory. As the compilation generates a lot of files, it is advised to put them all in a separate directory. It is then easier to cleanup, and this allows to compile several configurations out of the same source tree. For that, simply enter the directory where you want the compilation to produce its files, and invoke the configure script located in the StarPU source directory. \verbatim $ mkdir build $ cd build $ ../configure \endverbatim By default, StarPU will be installed in /usr/local/bin, /usr/local/lib, etc. You can specify an installation prefix other than /usr/local using the option --prefix, for instance: \verbatim $ ../configure --prefix=$HOME/starpu \endverbatim \subsection BuildingStarPU Building StarPU \verbatim $ make \endverbatim Once everything is built, you may want to test the result. An extensive set of regression tests is provided with StarPU. Running the tests is done by calling make check. These tests are run every night and the result from the main profile is publicly available (http://starpu.gforge.inria.fr/testing/). \verbatim $ make check \endverbatim \subsection InstallingStarPU Installing StarPU In order to install StarPU at the location that was specified during configuration: \verbatim $ make install \endverbatim Libtool interface versioning information are included in libraries names (libstarpu-1.2.so, libstarpumpi-1.2.so and libstarpufft-1.2.so). \section SettingUpYourOwnCode Setting up Your Own Code \subsection SettingFlagsForCompilingLinkingAndRunningApplications Setting Flags for Compiling, Linking and Running Applications StarPU provides a pkg-config executable to obtain relevant compiler and linker flags. As compiling and linking an application against StarPU may require to use specific flags or libraries (for instance CUDA or libspe2). If StarPU was not installed at some standard location, the path of StarPU's library must be specified in the environment variable PKG_CONFIG_PATH so that pkg-config can find it. For example if StarPU was installed in $STARPU_PATH: \verbatim $ PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$STARPU_PATH/lib/pkgconfig \endverbatim The flags required to compile or link against StarPU are then accessible with the following commands: \verbatim $ pkg-config --cflags starpu-1.2 # options for the compiler $ pkg-config --libs starpu-1.2 # options for the linker \endverbatim Note that it is still possible to use the API provided in the version 1.0 of StarPU by calling pkg-config with the starpu-1.0 package. Similar packages are provided for starpumpi-1.0 and starpufft-1.0. It is also possible to use the API provided in the version 0.9 of StarPU by calling pkg-config with the libstarpu package. Similar packages are provided for libstarpumpi and libstarpufft. Make sure that pkg-config --libs starpu-1.2 actually produces some output before going further: PKG_CONFIG_PATH has to point to the place where starpu-1.2.pc was installed during make install. Also pass the option --static if the application is to be linked statically. It is also necessary to set the environment variable LD_LIBRARY_PATH to locate dynamic libraries at runtime. \verbatim $ LD_LIBRARY_PATH=$STARPU_PATH/lib:$LD_LIBRARY_PATH \endverbatim When using a Makefile, the following lines can be added to set the options for the compiler and the linker: \verbatim CFLAGS += $$(pkg-config --cflags starpu-1.2) LDFLAGS += $$(pkg-config --libs starpu-1.2) \endverbatim \subsection RunningABasicStarPUApplication Running a Basic StarPU Application Basic examples using StarPU are built in the directory examples/basic_examples/ (and installed in $STARPU_PATH/lib/starpu/examples/). You can for example run the example vector_scal. \verbatim $ ./examples/basic_examples/vector_scal BEFORE: First element was 1.000000 AFTER: First element is 3.140000 \endverbatim When StarPU is used for the first time, the directory $STARPU_HOME/.starpu/ is created, performance models will be stored in that directory (\ref STARPU_HOME). Please note that buses are benchmarked when StarPU is launched for the first time. This may take a few minutes, or less if libhwloc is installed. This step is done only once per user and per machine. \subsection RunningABasicStarPUApplicationOnMicrosoft Running a Basic StarPU Application on Microsoft Visual C Batch files are provided to run StarPU applications under Microsoft Visual C. They are installed in $STARPU_PATH/bin/msvc. To execute a StarPU application, you first need to set the environment variable \ref STARPU_PATH. \verbatim c:\....> cd c:\cygwin\home\ci\starpu\ c:\....> set STARPU_PATH=c:\cygwin\home\ci\starpu\ c:\....> cd bin\msvc c:\....> starpu_open.bat starpu_simple.c \endverbatim The batch script will run Microsoft Visual C with a basic project file to run the given application. The batch script starpu_clean.bat can be used to delete all compilation generated files. The batch script starpu_exec.bat can be used to compile and execute a StarPU application from the command prompt. \verbatim c:\....> cd c:\cygwin\home\ci\starpu\ c:\....> set STARPU_PATH=c:\cygwin\home\ci\starpu\ c:\....> cd bin\msvc c:\....> starpu_exec.bat ..\..\..\..\examples\basic_examples\hello_world.c \endverbatim \verbatim MSVC StarPU Execution ... /out:hello_world.exe ... Hello world (params = {1, 2.00000}) Callback function got argument 0000042 c:\....> \endverbatim \subsection KernelThreadsStartedByStarPU Kernel Threads Started by StarPU StarPU automatically binds one thread per CPU core. It does not use SMT/hyperthreading because kernels are usually already optimized for using a full core, and using hyperthreading would make kernel calibration rather random. Since driving GPUs is a CPU-consuming task, StarPU dedicates one core per GPU. While StarPU tasks are executing, the application is not supposed to do computations in the threads it starts itself, tasks should be used instead. TODO: add a StarPU function to bind an application thread (e.g. the main thread) to a dedicated core (and thus disable the corresponding StarPU CPU worker). \subsection EnablingOpenCL Enabling OpenCL When both CUDA and OpenCL drivers are enabled, StarPU will launch an OpenCL worker for NVIDIA GPUs only if CUDA is not already running on them. This design choice was necessary as OpenCL and CUDA can not run at the same time on the same NVIDIA GPU, as there is currently no interoperability between them. To enable OpenCL, you need either to disable CUDA when configuring StarPU: \verbatim $ ./configure --disable-cuda \endverbatim or when running applications: \verbatim $ STARPU_NCUDA=0 ./application \endverbatim OpenCL will automatically be started on any device not yet used by CUDA. So on a machine running 4 GPUS, it is therefore possible to enable CUDA on 2 devices, and OpenCL on the 2 other devices by doing so: \verbatim $ STARPU_NCUDA=2 ./application \endverbatim \section BenchmarkingStarPU Benchmarking StarPU Some interesting benchmarks are installed among examples in $STARPU_PATH/lib/starpu/examples/. Make sure to try various schedulers, for instance STARPU_SCHED=dmda. \subsection TaskSizeOverhead Task Size Overhead This benchmark gives a glimpse into how long a task should be (in µs) for StarPU overhead to be low enough to keep efficiency. Running tasks_size_overhead.sh generates a plot of the speedup of tasks of various sizes, depending on the number of CPUs being used. \image html tasks_size_overhead.png \image latex tasks_size_overhead.eps "" width=\textwidth \subsection DataTransferLatency Data Transfer Latency local_pingpong performs a ping-pong between the first two CUDA nodes, and prints the measured latency. \subsection MatrixMatrixMultiplication Matrix-Matrix Multiplication sgemm and dgemm perform a blocked matrix-matrix multiplication using BLAS and cuBLAS. They output the obtained GFlops. \subsection CholeskyFactorization Cholesky Factorization cholesky_* perform a Cholesky factorization (single precision). They use different dependency primitives. \subsection LUFactorization LU Factorization lu_* perform an LU factorization. They use different dependency primitives. \subsection SimulatedBenchmarks Simulated benchmarks It can also be convenient to try simulated benchmarks, if you want to give a try at CPU-GPU scheduling without actually having a GPU at hand. This can be done by using the simgrid version of StarPU: first install the simgrid simulator from http://simgrid.gforge.inria.fr/ (we tested with simgrid 3.11, 3.12 and 3.13, other versions may have compatibility issues), then configure StarPU with \ref enable-simgrid "--enable-simgrid" and rebuild and install it, and then you can simulate the performance for a few virtualized systems shipped along StarPU: attila, mirage, idgraf, and sirocco. For instance: \verbatim $ export STARPU_PERF_MODEL_DIR=$STARPU_PATH/share/starpu/perfmodels/sampling $ export STARPU_HOSTNAME=attila $ $STARPU_PATH/lib/starpu/examples/cholesky_implicit -size $((960*20)) -nblocks 20 \endverbatim Will show the performance of the cholesky factorization with the attila system. It will be interesting to try with different matrix sizes and schedulers. Performance models are available for cholesky_*, lu_*, *gemm, with block sizes 320, 640, or 960 (plus 1440 for sirocco), and for stencil with block size 128x128x128, 192x192x192, and 256x256x256. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/110_basic_examples.doxy000066400000000000000000000575411320135501600242620ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \page BasicExamples Basic Examples \section HelloWorldUsingTheCExtension Hello World Using The C Extension This section shows how to implement a simple program that submits a task to StarPU using the StarPU C extension (\ref cExtensions). The complete example, and additional examples, is available in the directory gcc-plugin/examples of the StarPU distribution. A similar example showing how to directly use the StarPU's API is shown in \ref HelloWorldUsingStarPUAPI. GCC from version 4.5 permit to use the StarPU GCC plug-in (\ref cExtensions). This makes writing a task both simpler and less error-prone. In a nutshell, all it takes is to declare a task, declare and define its implementations (for CPU, OpenCL, and/or CUDA), and invoke the task like a regular C function. The example below defines my_task which has a single implementation for CPU: \snippet hello_pragma.c To be included. You should update doxygen if you see this text. The code can then be compiled and linked with GCC and the flag -fplugin: \verbatim $ gcc `pkg-config starpu-1.2 --cflags` hello-starpu.c \ -fplugin=`pkg-config starpu-1.2 --variable=gccplugin` \ `pkg-config starpu-1.2 --libs` \endverbatim The code can also be compiled without the StarPU C extension and will behave as a normal sequential code. \verbatim $ gcc hello-starpu.c hello-starpu.c:33:1: warning: ‘task’ attribute directive ignored [-Wattributes] $ ./a.out Hello, world! With x = 42 \endverbatim As can be seen above, the C extensions allows programmers to use StarPU tasks by essentially annotating ``regular'' C code. \section HelloWorldUsingStarPUAPI Hello World Using StarPU's API This section shows how to achieve the same result as in the previous section using StarPU's standard C API. \subsection RequiredHeaders Required Headers The header starpu.h should be included in any code using StarPU. \code{.c} #include \endcode \subsection DefiningACodelet Defining A Codelet A codelet is a structure that represents a computational kernel. Such a codelet may contain an implementation of the same kernel on different architectures (e.g. CUDA, x86, ...). For compatibility, make sure that the whole structure is properly initialized to zero, either by using the function starpu_codelet_init(), or by letting the compiler implicitly do it as examplified below. The field starpu_codelet::nbuffers specifies the number of data buffers that are manipulated by the codelet: here the codelet does not access or modify any data that is controlled by our data management library. We create a codelet which may only be executed on CPUs. When a CPU core will execute a codelet, it will call the function cpu_func, which \em must have the following prototype: \code{.c} void (*cpu_func)(void *buffers[], void *cl_arg); \endcode In this example, we can ignore the first argument of this function which gives a description of the input and output buffers (e.g. the size and the location of the matrices) since there is none. We also ignore the second argument which is a pointer to optional arguments for the codelet. \code{.c} void cpu_func(void *buffers[], void *cl_arg) { printf("Hello world\n"); } struct starpu_codelet cl = { .cpu_funcs = { cpu_func }, .nbuffers = 0 }; \endcode \subsection SubmittingATask Submitting A Task Before submitting any tasks to StarPU, starpu_init() must be called. The NULL argument specifies that we use the default configuration. Tasks can then be submitted until the termination of StarPU -- done by a call to starpu_shutdown(). In the example below, a task structure is allocated by a call to starpu_task_create(). This function allocates and fills the task structure with its default settings, it does not submit the task to StarPU. The field starpu_task::cl is a pointer to the codelet which the task will execute: in other words, the codelet structure describes which computational kernel should be offloaded on the different architectures, and the task structure is a wrapper containing a codelet and the piece of data on which the codelet should operate. If the field starpu_task::synchronous is non-zero, task submission will be synchronous: the function starpu_task_submit() will not return until the task has been executed. Note that the function starpu_shutdown() does not guarantee that asynchronous tasks have been executed before it returns, starpu_task_wait_for_all() can be used to that effect, or data can be unregistered (starpu_data_unregister()), which will implicitly wait for all the tasks scheduled to work on it, unless explicitly disabled thanks to starpu_data_set_default_sequential_consistency_flag() or starpu_data_set_sequential_consistency_flag(). \code{.c} int main(int argc, char **argv) { /* initialize StarPU */ starpu_init(NULL); struct starpu_task *task = starpu_task_create(); task->cl = &cl; /* Pointer to the codelet defined above */ /* starpu_task_submit will be a blocking call. If unset, starpu_task_wait() needs to be called after submitting the task. */ task->synchronous = 1; /* submit the task to StarPU */ starpu_task_submit(task); /* terminate StarPU */ starpu_shutdown(); return 0; } \endcode \subsection ExecutionOfHelloWorld Execution Of Hello World \verbatim $ make hello_world cc $(pkg-config --cflags starpu-1.2) hello_world.c -o hello_world $(pkg-config --libs starpu-1.2) $ ./hello_world Hello world \endverbatim \subsection PassingArgumentsToTheCodelet Passing Arguments To The Codelet The optional field starpu_task::cl_arg field is a pointer to a buffer (of size starpu_task::cl_arg_size) with some parameters for the kernel described by the codelet. For instance, if a codelet implements a computational kernel that multiplies its input vector by a constant, the constant could be specified by the means of this buffer, instead of registering it as a StarPU data. It must however be noted that StarPU avoids making copy whenever possible and rather passes the pointer as such, so the buffer which is pointed at must be kept allocated until the task terminates, and if several tasks are submitted with various parameters, each of them must be given a pointer to their own buffer. \code{.c} struct params { int i; float f; }; void cpu_func(void *buffers[], void *cl_arg) { struct params *params = cl_arg; printf("Hello world (params = {%i, %f} )\n", params->i, params->f); } \endcode As said before, the field starpu_codelet::nbuffers specifies the number of data buffers that are manipulated by the codelet. It does not count the argument --- the parameter cl_arg of the function cpu_func --- since it is not managed by our data management library, but just contains trivial parameters. // TODO rewrite so that it is a little clearer ? Be aware that this may be a pointer to a \em copy of the actual buffer, and not the pointer given by the programmer: if the codelet modifies this buffer, there is no guarantee that the initial buffer will be modified as well: this for instance implies that the buffer cannot be used as a synchronization medium. If synchronization is needed, data has to be registered to StarPU, see \ref VectorScalingUsingStarPUAPI. \code{.c} int main(int argc, char **argv) { /* initialize StarPU */ starpu_init(NULL); struct starpu_task *task = starpu_task_create(); task->cl = &cl; /* Pointer to the codelet defined above */ struct params params = { 1, 2.0f }; task->cl_arg = ¶ms; task->cl_arg_size = sizeof(params); /* starpu_task_submit will be a blocking call */ task->synchronous = 1; /* submit the task to StarPU */ starpu_task_submit(task); /* terminate StarPU */ starpu_shutdown(); return 0; } \endcode \verbatim $ make hello_world cc $(pkg-config --cflags starpu-1.2) hello_world.c -o hello_world $(pkg-config --libs starpu-1.2) $ ./hello_world Hello world (params = {1, 2.000000} ) \endverbatim \subsection DefiningACallback Defining A Callback Once a task has been executed, an optional callback function starpu_task::callback_func is called when defined. While the computational kernel could be offloaded on various architectures, the callback function is always executed on a CPU. The pointer starpu_task::callback_arg is passed as an argument of the callback function. The prototype of a callback function must be: \code{.c} void (*callback_function)(void *); \endcode \code{.c} void callback_func(void *callback_arg) { printf("Callback function (arg %x)\n", callback_arg); } int main(int argc, char **argv) { /* initialize StarPU */ starpu_init(NULL); struct starpu_task *task = starpu_task_create(); task->cl = &cl; /* Pointer to the codelet defined above */ task->callback_func = callback_func; task->callback_arg = 0x42; /* starpu_task_submit will be a blocking call */ task->synchronous = 1; /* submit the task to StarPU */ starpu_task_submit(task); /* terminate StarPU */ starpu_shutdown(); return 0; } \endcode \verbatim $ make hello_world cc $(pkg-config --cflags starpu-1.2) hello_world.c -o hello_world $(pkg-config --libs starpu-1.2) $ ./hello_world Hello world Callback function (arg 42) \endverbatim \subsection WhereToExecuteACodelet Where To Execute A Codelet \code{.c} struct starpu_codelet cl = { .where = STARPU_CPU, .cpu_funcs = { cpu_func }, .cpu_funcs_name = { "cpu_func" }, .nbuffers = 0 }; \endcode We create a codelet which may only be executed on the CPUs. The optional field starpu_codelet::where is a bitmask that defines where the codelet may be executed. Here, the value ::STARPU_CPU means that only CPUs can execute this codelet. When the optional field starpu_codelet::where is unset, its value is automatically set based on the availability of the different fields XXX_funcs. TODO: explain starpu_codelet::cpu_funcs_name \section VectorScalingUsingTheCExtension Vector Scaling Using the C Extension The previous example has shown how to submit tasks. In this section, we show how StarPU tasks can manipulate data. We will first show how to use the C language extensions provided by the GCC plug-in (\ref cExtensions). The complete example, and additional examples, is available in the directory gcc-plugin/examples of the StarPU distribution. These extensions map directly to StarPU's main concepts: tasks, task implementations for CPU, OpenCL, or CUDA, and registered data buffers. The standard C version that uses StarPU's standard C programming interface is given in \ref VectorScalingUsingStarPUAPI. First of all, the vector-scaling task and its simple CPU implementation has to be defined: \code{.c} /* Declare the `vector_scal' task. */ static void vector_scal (unsigned size, float vector[size], float factor) __attribute__ ((task)); /* Define the standard CPU implementation. */ static void vector_scal (unsigned size, float vector[size], float factor) { unsigned i; for (i = 0; i < size; i++) vector[i] *= factor; } \endcode Next, the body of the program, which uses the task defined above, can be implemented: \snippet hello_pragma2.c To be included. You should update doxygen if you see this text. The function main above does several things:
  • It initializes StarPU.
  • It allocates vector in the heap; it will automatically be freed when its scope is left. Alternatively, good old malloc and free could have been used, but they are more error-prone and require more typing.
  • It registers the memory pointed to by vector. Eventually, when OpenCL or CUDA task implementations are added, this will allow StarPU to transfer that memory region between GPUs and the main memory. Removing this pragma is an error.
  • It invokes the task vector_scal. The invocation looks the same as a standard C function call. However, it is an asynchronous invocation, meaning that the actual call is performed in parallel with the caller's continuation.
  • It waits for the termination of the asynchronous call vector_scal.
  • Finally, StarPU is shut down.
The program can be compiled and linked with GCC and the flag -fplugin: \verbatim $ gcc `pkg-config starpu-1.2 --cflags` vector_scal.c \ -fplugin=`pkg-config starpu-1.2 --variable=gccplugin` \ `pkg-config starpu-1.2 --libs` \endverbatim And voilà! \subsection AddingAnOpenCLTaskImplementation Adding an OpenCL Task Implementation Now, this is all fine and great, but you certainly want to take advantage of these newfangled GPUs that your lab just bought, don't you? So, let's add an OpenCL implementation of the task vector_scal. We assume that the OpenCL kernel is available in a file, vector_scal_opencl_kernel.cl, not shown here. The OpenCL task implementation is similar to that used with the standard C API (\ref DefinitionOfTheOpenCLKernel). It is declared and defined in our C file like this: \code{.c} /* The OpenCL programs, loaded from 'main' (see below). */ static struct starpu_opencl_program cl_programs; static void vector_scal_opencl (unsigned size, float vector[size], float factor) __attribute__ ((task_implementation ("opencl", vector_scal))); static void vector_scal_opencl (unsigned size, float vector[size], float factor) { int id, devid, err; cl_kernel kernel; cl_command_queue queue; cl_event event; /* VECTOR is GPU memory pointer, not a main memory pointer. */ cl_mem val = (cl_mem) vector; id = starpu_worker_get_id (); devid = starpu_worker_get_devid (id); /* Prepare to invoke the kernel. In the future, this will be largely automated. */ err = starpu_opencl_load_kernel (&kernel, &queue, &cl_programs, "vector_mult_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR (err); err = clSetKernelArg (kernel, 0, sizeof (size), &size); err |= clSetKernelArg (kernel, 1, sizeof (val), &val); err |= clSetKernelArg (kernel, 2, sizeof (factor), &factor); if (err) STARPU_OPENCL_REPORT_ERROR (err); size_t global = 1, local = 1; err = clEnqueueNDRangeKernel (queue, kernel, 1, NULL, &global, &local, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR (err); clFinish (queue); starpu_opencl_collect_stats (event); clReleaseEvent (event); /* Done with KERNEL. */ starpu_opencl_release_kernel (kernel); } \endcode The OpenCL kernel itself must be loaded from main, sometime after the pragma initialize: \code{.c} starpu_opencl_load_opencl_from_file ("vector_scal_opencl_kernel.cl", &cl_programs, ""); \endcode And that's it. The task vector_scal now has an additional implementation, for OpenCL, which StarPU's scheduler may choose to use at run-time. Unfortunately, the vector_scal_opencl above still has to go through the common OpenCL boilerplate; in the future, additional extensions will automate most of it. \subsection AddingACUDATaskImplementation Adding a CUDA Task Implementation Adding a CUDA implementation of the task is very similar, except that the implementation itself is typically written in CUDA, and compiled with nvcc. Thus, the C file only needs to contain an external declaration for the task implementation: \code{.c} extern void vector_scal_cuda (unsigned size, float vector[size], float factor) __attribute__ ((task_implementation ("cuda", vector_scal))); \endcode The actual implementation of the CUDA task goes into a separate compilation unit, in a .cu file. It is very close to the implementation when using StarPU's standard C API (\ref DefinitionOfTheCUDAKernel). \snippet scal_pragma.cu To be included. You should update doxygen if you see this text. The complete source code, in the directory gcc-plugin/examples/vector_scal of the StarPU distribution, also shows how an SSE-specialized CPU task implementation can be added. For more details on the C extensions provided by StarPU's GCC plug-in, see \ref cExtensions. \section VectorScalingUsingStarPUAPI Vector Scaling Using StarPU's API This section shows how to achieve the same result as explained in the previous section using StarPU's standard C API. The full source code for this example is given in \ref FullSourceCodeVectorScal. \subsection SourceCodeOfVectorScaling Source Code of Vector Scaling Programmers can describe the data layout of their application so that StarPU is responsible for enforcing data coherency and availability across the machine. Instead of handling complex (and non-portable) mechanisms to perform data movements, programmers only declare which piece of data is accessed and/or modified by a task, and StarPU makes sure that when a computational kernel starts somewhere (e.g. on a GPU), its data are available locally. Before submitting those tasks, the programmer first needs to declare the different pieces of data to StarPU using the functions starpu_*_data_register. To ease the development of applications for StarPU, it is possible to describe multiple types of data layout. A type of data layout is called an interface. There are different predefined interfaces available in StarPU: here we will consider the vector interface. The following lines show how to declare an array of NX elements of type float using the vector interface: \code{.c} float vector[NX]; starpu_data_handle_t vector_handle; starpu_vector_data_register(&vector_handle, STARPU_MAIN_RAM, (uintptr_t)vector, NX, sizeof(vector[0])); \endcode The first argument, called the data handle, is an opaque pointer which designates the array within StarPU. This is also the structure which is used to describe which data is used by a task. The second argument is the node number where the data originally resides. Here it is ::STARPU_MAIN_RAM since the array vector is in the main memory. Then comes the pointer vector where the data can be found in main memory, the number of elements in the vector and the size of each element. The following shows how to construct a StarPU task that will manipulate the vector and a constant factor. \code{.c} float factor = 3.14; struct starpu_task *task = starpu_task_create(); task->cl = &cl; /* Pointer to the codelet defined below */ task->handles[0] = vector_handle; /* First parameter of the codelet */ task->cl_arg = &factor; task->cl_arg_size = sizeof(factor); task->synchronous = 1; starpu_task_submit(task); \endcode Since the factor is a mere constant float value parameter, it does not need a preliminary registration, and can just be passed through the pointer starpu_task::cl_arg like in the previous example. The vector parameter is described by its handle. starpu_task::handles should be set with the handles of the data, the access modes for the data are defined in the field starpu_codelet::modes (::STARPU_R for read-only, ::STARPU_W for write-only and ::STARPU_RW for read and write access). The definition of the codelet can be written as follows: \code{.c} void scal_cpu_func(void *buffers[], void *cl_arg) { unsigned i; float *factor = cl_arg; /* length of the vector */ unsigned n = STARPU_VECTOR_GET_NX(buffers[0]); /* CPU copy of the vector pointer */ float *val = (float *)STARPU_VECTOR_GET_PTR(buffers[0]); for (i = 0; i < n; i++) val[i] *= *factor; } struct starpu_codelet cl = { .cpu_funcs = { scal_cpu_func }, .cpu_funcs_name = { "scal_cpu_func" }, .nbuffers = 1, .modes = { STARPU_RW } }; \endcode The first argument is an array that gives a description of all the buffers passed in the array starpu_task::handles. The size of this array is given by the field starpu_codelet::nbuffers. For the sake of genericity, this array contains pointers to the different interfaces describing each buffer. In the case of the vector interface, the location of the vector (resp. its length) is accessible in the starpu_vector_interface::ptr (resp. starpu_vector_interface::nx) of this interface. Since the vector is accessed in a read-write fashion, any modification will automatically affect future accesses to this vector made by other tasks. The second argument of the function scal_cpu_func contains a pointer to the parameters of the codelet (given in starpu_task::cl_arg), so that we read the constant factor from this pointer. \subsection ExecutionOfVectorScaling Execution of Vector Scaling \verbatim $ make vector_scal cc $(pkg-config --cflags starpu-1.2) vector_scal.c -o vector_scal $(pkg-config --libs starpu-1.2) $ ./vector_scal 0.000000 3.000000 6.000000 9.000000 12.000000 \endverbatim \section VectorScalingOnAnHybridCPUGPUMachine Vector Scaling on an Hybrid CPU/GPU Machine Contrary to the previous examples, the task submitted in this example may not only be executed by the CPUs, but also by a CUDA device. \subsection DefinitionOfTheCUDAKernel Definition of the CUDA Kernel The CUDA implementation can be written as follows. It needs to be compiled with a CUDA compiler such as nvcc, the NVIDIA CUDA compiler driver. It must be noted that the vector pointer returned by ::STARPU_VECTOR_GET_PTR is here a pointer in GPU memory, so that it can be passed as such to the kernel call vector_mult_cuda. \snippet vector_scal_cuda.cu To be included. You should update doxygen if you see this text. \subsection DefinitionOfTheOpenCLKernel Definition of the OpenCL Kernel The OpenCL implementation can be written as follows. StarPU provides tools to compile a OpenCL kernel stored in a file. \code{.c} __kernel void vector_mult_opencl(int nx, __global float* val, float factor) { const int i = get_global_id(0); if (i < nx) { val[i] *= factor; } } \endcode Contrary to CUDA and CPU, ::STARPU_VECTOR_GET_DEV_HANDLE has to be used, which returns a cl_mem (which is not a device pointer, but an OpenCL handle), which can be passed as such to the OpenCL kernel. The difference is important when using partitioning, see \ref PartitioningData. \snippet vector_scal_opencl.c To be included. You should update doxygen if you see this text. \subsection DefinitionOfTheMainCode Definition of the Main Code The CPU implementation is the same as in the previous section. Here is the source of the main application. You can notice that the fields starpu_codelet::cuda_funcs and starpu_codelet::opencl_funcs are set to define the pointers to the CUDA and OpenCL implementations of the task. \snippet vector_scal_c.c To be included. You should update doxygen if you see this text. \subsection ExecutionOfHybridVectorScaling Execution of Hybrid Vector Scaling The Makefile given at the beginning of the section must be extended to give the rules to compile the CUDA source code. Note that the source file of the OpenCL kernel does not need to be compiled now, it will be compiled at run-time when calling the function starpu_opencl_load_opencl_from_file(). \verbatim CFLAGS += $(shell pkg-config --cflags starpu-1.2) LDFLAGS += $(shell pkg-config --libs starpu-1.2) CC = gcc vector_scal: vector_scal.o vector_scal_cpu.o vector_scal_cuda.o vector_scal_opencl.o %.o: %.cu nvcc $(CFLAGS) $< -c $@ clean: rm -f vector_scal *.o \endverbatim \verbatim $ make \endverbatim and to execute it, with the default configuration: \verbatim $ ./vector_scal 0.000000 3.000000 6.000000 9.000000 12.000000 \endverbatim or for example, by disabling CPU devices: \verbatim $ STARPU_NCPU=0 ./vector_scal 0.000000 3.000000 6.000000 9.000000 12.000000 \endverbatim or by disabling CUDA devices (which may permit to enable the use of OpenCL, see \ref EnablingOpenCL) : \verbatim $ STARPU_NCUDA=0 ./vector_scal 0.000000 3.000000 6.000000 9.000000 12.000000 \endverbatim */ starpu-1.2.3+dfsg/doc/doxygen/chapters/201_advanced_examples.doxy000066400000000000000000000004551320135501600247370ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \page AdvancedExamples Advanced Examples TODO */ starpu-1.2.3+dfsg/doc/doxygen/chapters/210_check_list_performance.doxy000066400000000000000000000464451320135501600257760ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \page CheckListWhenPerformanceAreNotThere Check List When Performance Are Not There TODO: improve! To achieve good performance, we give below a list of features which should be checked. For a start, you can use \ref OfflinePerformanceTools to get a Gantt chart which will show roughly where time is spent, and focus correspondingly. \section ConfigurationImprovePerformance Configuration That May Improve Performance The \ref enable-fast "--enable-fast" configuration option disables all assertions. This makes StarPU more performant for really small tasks by disabling all sanity checks. Only use this for measurements and production, not for development, since this will drop all basic checks. \section DataRelatedFeaturesToImprovePerformance Data Related Features That May Improve Performance link to \ref DataManagement link to \ref DataPrefetch \section TaskRelatedFeaturesToImprovePerformance Task Related Features That May Improve Performance link to \ref TaskGranularity link to \ref TaskSubmission link to \ref TaskPriorities \section SchedulingRelatedFeaturesToImprovePerformance Scheduling Related Features That May Improve Performance link to \ref TaskSchedulingPolicy link to \ref TaskDistributionVsDataTransfer link to \ref Energy-basedScheduling link to \ref StaticScheduling \section CUDA-specificOptimizations CUDA-specific Optimizations Due to CUDA limitations, StarPU will have a hard time overlapping its own communications and the codelet computations if the application does not use a dedicated CUDA stream for its computations instead of the default stream, which synchronizes all operations of the GPU. StarPU provides one by the use of starpu_cuda_get_local_stream() which can be used by all CUDA codelet operations to avoid this issue. For instance: \code{.c} func <<>> (foo, bar); cudaStreamSynchronize(starpu_cuda_get_local_stream()); \endcode Unfortunately, some CUDA libraries do not have stream variants of kernels. That will lower the potential for overlapping. Calling starpu_cublas_init() makes StarPU already do appropriate calls for the CUBLAS library. Some libraries like Magma may however change the current stream of CUBLAS v1, one then has to call cublasSetKernelStream(starpu_cuda_get_local_stream()) at the beginning of the codelet to make sure that CUBLAS is really using the proper stream. When using CUBLAS v2, starpu_cublas_get_local_handle() can be called to queue CUBLAS kernels with the proper configuration. Similarly, calling starpu_cusparse_init() makes StarPU create CUSPARSE handles on each CUDA device, starpu_cusparse_get_local_handle() can then be used to queue CUSPARSE kernels with the proper configuration. If the kernel can be made to only use this local stream or other self-allocated streams, i.e. the whole kernel submission can be made asynchronous, then one should enable asynchronous execution of the kernel. That means setting the flag ::STARPU_CUDA_ASYNC in the corresponding field starpu_codelet::cuda_flags, and dropping the cudaStreamSynchronize() call at the end of the cuda_func function, so that it returns immediately after having queued the kernel to the local stream. That way, StarPU will be able to submit and complete data transfers while kernels are executing, instead of only at each kernel submission. The kernel just has to make sure that StarPU can use the local stream to synchronize with the kernel startup and completion. If the kernel uses its own non-default stream, one can synchronize that stream with the StarPU-provided stream this way: \code{.c} cudaEvent_t event; call_kernel_with_its_own_stream() cudaEventCreateWithFlags(&event, cudaEventDisableTiming); cudaEventRecord(event, get_kernel_stream()); cudaStreamWaitEvent(starpu_cuda_get_local_stream(), event, 0); cudaEventDestroy(event); \endcode That code makes the StarPU-provided stream wait for a new event, which will be triggered by the completion of the kernel. Using the flag ::STARPU_CUDA_ASYNC also permits to enable concurrent kernel execution, on cards which support it (Kepler and later, notably). This is enabled by setting the environment variable \ref STARPU_NWORKER_PER_CUDA to the number of kernels to execute concurrently. This is useful when kernels are small and do not feed the whole GPU with threads to run. \section OpenCL-specificOptimizations OpenCL-specific Optimizations If the kernel can be made to only use the StarPU-provided command queue or other self-allocated queues, i.e. the whole kernel submission can be made asynchronous, then one should enable asynchronous execution of the kernel. This means setting the flag ::STARPU_OPENCL_ASYNC in the corresponding field starpu_codelet::opencl_flags and dropping the clFinish() and starpu_opencl_collect_stats() calls at the end of the kernel, so that it returns immediately after having queued the kernel to the provided queue. That way, StarPU will be able to submit and complete data transfers while kernels are executing, instead of only at each kernel submission. The kernel just has to make sure that StarPU can use the command queue it has provided to synchronize with the kernel startup and completion. \section DetectionStuckConditions Detection Stuck Conditions It may happen that for some reason, StarPU does not make progress for a long period of time. Reason are sometimes due to contention inside StarPU, but sometimes this is due to external reasons, such as stuck MPI driver, or CUDA driver, etc. export STARPU_WATCHDOG_TIMEOUT=10000 (\ref STARPU_WATCHDOG_TIMEOUT) allows to make StarPU print an error message whenever StarPU does not terminate any task for 10ms, but lets the application continue normally. In addition to that, export STARPU_WATCHDOG_CRASH=1 (\ref STARPU_WATCHDOG_CRASH) raises SIGABRT in that condition, thus allowing to catch the situation in gdb. It can also be useful to type handle SIGABRT nopass in gdb to be able to let the process continue, after inspecting the state of the process. \section HowToLimitMemoryPerNode How to Limit Memory Used By StarPU And Cache Buffer Allocations By default, StarPU makes sure to use at most 90% of the memory of GPU devices, moving data in and out of the device as appropriate and with prefetch and writeback optimizations. Concerning the main memory, by default it will not limit its consumption, since by default it has nowhere to push the data to when memory gets tight. This also means that by default StarPU will not cache buffer allocations in main memory, since it does not know how much of the system memory it can afford. In the case of GPUs, the \ref STARPU_LIMIT_CUDA_MEM, \ref STARPU_LIMIT_CUDA_devid_MEM, \ref STARPU_LIMIT_OPENCL_MEM, and \ref STARPU_LIMIT_OPENCL_devid_MEM environment variables can be used to control how much (in MiB) of the GPU device memory should be used at most by StarPU (their default values are 90% of the available memory). In the case of the main memory, the \ref STARPU_LIMIT_CPU_MEM environment variable can be used to specify how much (in MiB) of the main memory should be used at most by StarPU for buffer allocations. This way, StarPU will be able to cache buffer allocations (which can be a real benefit if a lot of bufferes are involved, or if allocation fragmentation can become a problem), and when using \ref OutOfCore, StarPU will know when it should evict data out to the disk. It should be noted that by default only buffer allocations automatically done by StarPU are accounted here, i.e. allocations performed through starpu_malloc_on_node() which are used by the data interfaces (matrix, vector, etc.). This does not include allocations performed by the application through e.g. malloc(). It does not include allocations performed through starpu_malloc() either, only allocations performed explicitly with the \ref STARPU_MALLOC_COUNT flag, i.e. by calling \code{.c} starpu_malloc_flags(STARPU_MALLOC_COUNT) \endcode are taken into account. If the application wants to make StarPU aware of its own allocations, so that StarPU knows precisely how much data is allocated, and thus when to evict allocation caches or data out to the disk, starpu_memory_allocate() can be used to specify an amount of memory to be accounted for. starpu_memory_deallocate() can be used to account freed memory back. Those can for instance be used by data interfaces with dynamic data buffers: instead of using starpu_malloc_on_node(), they would dynamically allocate data with malloc/realloc, and notify starpu of the delta thanks to starpu_memory_allocate() and starpu_memory_deallocate() calls. starpu_memory_get_total() and starpu_memory_get_available() can be used to get an estimation of how much memory is available. starpu_memory_wait_available() can also be used to block until an amount of memory becomes available, but it may be preferrable to call \code{.c} starpu_memory_allocate(STARPU_MEMORY_WAIT) \endcode to reserve that amount immediately. \section HowToReduceTheMemoryFootprintOfInternalDataStructures How To Reduce The Memory Footprint Of Internal Data Structures It is possible to reduce the memory footprint of the task and data internal structures of StarPU by describing the shape of your machine and/or your application at the configure step. To reduce the memory footprint of the data internal structures of StarPU, one can set the \ref enable-maxcpus "--enable-maxcpus", \ref enable-maxcudadev "--enable-maxcudadev", \ref enable-maxopencldev "--enable-maxopencldev" and \ref enable-maxnodes "--enable-maxnodes" configure parameters to give StarPU the architecture of the machine it will run on, thus tuning the size of the structures to the machine. To reduce the memory footprint of the task internal structures of StarPU, one can set the \ref enable-maxbuffers "--enable-maxbuffers" configure parameter to give StarPU the maximum number of buffers that a task can use during an execution. For example, in the Cholesky factorization (dense linear algebra application), the GEMM task uses up to 3 buffers, so it is possible to set the maximum number of task buffers to 3 to run a Cholesky factorization on StarPU. The size of the various structures of StarPU can be printed by tests/microbenchs/display_structures_size. It is also often useless to submit *all* the tasks at the same time. One can make the starpu_task_submit() function block when a reasonable given number of tasks have been submitted, by setting the \ref STARPU_LIMIT_MIN_SUBMITTED_TASKS and \ref STARPU_LIMIT_MAX_SUBMITTED_TASKS environment variables, for instance: export STARPU_LIMIT_MAX_SUBMITTED_TASKS=10000 export STARPU_LIMIT_MIN_SUBMITTED_TASKS=9000 To make StarPU block submission when 10000 tasks are submitted, and unblock submission when only 9000 tasks are still submitted, i.e. 1000 tasks have completed among the 10000 that were submitted when submission was blocked. Of course this may reduce parallelism if the threshold is set too low. The precise balance depends on the application task graph. An idea of how much memory is used for tasks and data handles can be obtained by setting the \ref STARPU_MAX_MEMORY_USE environment variable to 1. \section HowtoReuseMemory How To Reuse Memory When your application needs to allocate more data than the available amount of memory usable by StarPU (given by starpu_memory_get_available()), the allocation cache system can reuse data buffers used by previously executed tasks. For that system to work with MPI tasks, you need to submit tasks progressively instead of as soon as possible, because in the case of MPI receives, the allocation cache check for reusing data buffers will be done at submission time, not at execution time. You have two options to control the task submission flow. The first one is by controlling the number of submitted tasks during the whole execution. This can be done whether by setting the environment variables \ref STARPU_LIMIT_MAX_SUBMITTED_TASKS and \ref STARPU_LIMIT_MIN_SUBMITTED_TASKS to tell StarPU when to stop submitting tasks and when to wake up and submit tasks again, or by explicitely calling starpu_task_wait_for_n_submitted() in your application code for finest grain control (for example, between two iterations of a submission loop). The second option is to control the memory size of the allocation cache. This can be done in the application by using jointly starpu_memory_get_available() and starpu_memory_wait_available() to submit tasks only when there is enough memory space to allocate the data needed by the task, i.e when enough data are available for reuse in the allocation cache. \section PerformanceModelCalibration Performance Model Calibration Most schedulers are based on an estimation of codelet duration on each kind of processing unit. For this to be possible, the application programmer needs to configure a performance model for the codelets of the application (see \ref PerformanceModelExample for instance). History-based performance models use on-line calibration. StarPU will automatically calibrate codelets which have never been calibrated yet, and save the result in $STARPU_HOME/.starpu/sampling/codelets. The models are indexed by machine name. By default, StarPU stores separate performance models according to the hostname of the system. To avoid having to calibrate performance models for each node of a homogeneous cluster for instance, the model can be shared by using export STARPU_HOSTNAME=some_global_name (\ref STARPU_HOSTNAME), where some_global_name is the name of the cluster for instance, which thus overrides the hostname of the system. By default, StarPU stores separate performance models for each GPU. To avoid having to calibrate performance models for each GPU of a homogeneous set of GPU devices for instance, the model can be shared by setting export STARPU_PERF_MODEL_HOMOGENEOUS_CUDA=1 , export STARPU_PERF_MODEL_HOMOGENEOUS_OPENCL=1 , export STARPU_PERF_MODEL_HOMOGENEOUS_MIC=1 , or export STARPU_PERF_MODEL_HOMOGENEOUS_SCC=1 (depending on your GPU device type). To force continuing calibration, use export STARPU_CALIBRATE=1 (\ref STARPU_CALIBRATE). This may be necessary if your application has not-so-stable performance. StarPU will force calibration (and thus ignore the current result) until 10 (_STARPU_CALIBRATION_MINIMUM) measurements have been made on each architecture, to avoid badly scheduling tasks just because the first measurements were not so good. Details on the current performance model status can be obtained from the tool starpu_perfmodel_display: the -l option lists the available performance models, and the -s option permits to choose the performance model to be displayed. The result looks like: \verbatim $ starpu_perfmodel_display -s starpu_slu_lu_model_11 performance model for cpu_impl_0 # hash size flops mean dev n 914f3bef 1048576 0.000000e+00 2.503577e+04 1.982465e+02 8 3e921964 65536 0.000000e+00 5.527003e+02 1.848114e+01 7 e5a07e31 4096 0.000000e+00 1.717457e+01 5.190038e+00 14 ... \endverbatim Which shows that for the LU 11 kernel with a 1MiB matrix, the average execution time on CPUs was about 25ms, with a 0.2ms standard deviation, over 8 samples. It is a good idea to check this before doing actual performance measurements. A graph can be drawn by using the tool starpu_perfmodel_plot: \verbatim $ starpu_perfmodel_plot -s starpu_slu_lu_model_11 4096 16384 65536 262144 1048576 4194304 $ gnuplot starpu_starpu_slu_lu_model_11.gp $ gv starpu_starpu_slu_lu_model_11.eps \endverbatim \image html starpu_starpu_slu_lu_model_11.png \image latex starpu_starpu_slu_lu_model_11.eps "" width=\textwidth If a kernel source code was modified (e.g. performance improvement), the calibration information is stale and should be dropped, to re-calibrate from start. This can be done by using export STARPU_CALIBRATE=2 (\ref STARPU_CALIBRATE). Note: history-based performance models get calibrated only if a performance-model-based scheduler is chosen. The history-based performance models can also be explicitly filled by the application without execution, if e.g. the application already has a series of measurements. This can be done by using starpu_perfmodel_update_history(), for instance: \code{.c} static struct starpu_perfmodel perf_model = { .type = STARPU_HISTORY_BASED, .symbol = "my_perfmodel", }; struct starpu_codelet cl = { .cuda_funcs = { cuda_func1, cuda_func2 }, .nbuffers = 1, .modes = {STARPU_W}, .model = &perf_model }; void feed(void) { struct my_measure *measure; struct starpu_task task; starpu_task_init(&task); task.cl = &cl; for (measure = &measures[0]; measure < measures[last]; measure++) { starpu_data_handle_t handle; starpu_vector_data_register(&handle, -1, 0, measure->size, sizeof(float)); task.handles[0] = handle; starpu_perfmodel_update_history(&perf_model, &task, STARPU_CUDA_DEFAULT + measure->cudadev, 0, measure->implementation, measure->time); starpu_task_clean(&task); starpu_data_unregister(handle); } } \endcode Measurement has to be provided in milliseconds for the completion time models, and in Joules for the energy consumption models. \section Profiling Profiling A quick view of how many tasks each worker has executed can be obtained by setting export STARPU_WORKER_STATS=1 (\ref STARPU_WORKER_STATS). This is a convenient way to check that execution did happen on accelerators, without penalizing performance with the profiling overhead. A quick view of how much data transfers have been issued can be obtained by setting export STARPU_BUS_STATS=1 (\ref STARPU_BUS_STATS). More detailed profiling information can be enabled by using export STARPU_PROFILING=1 (\ref STARPU_PROFILING) or by calling starpu_profiling_status_set() from the source code. Statistics on the execution can then be obtained by using export STARPU_BUS_STATS=1 and export STARPU_WORKER_STATS=1 . More details on performance feedback are provided in the next chapter. \section OverheadProfiling Overhead Profiling \ref OfflinePerformanceTools can already provide an idea of to what extent and which part of StarPU bring overhead on the execution time. To get a more precise analysis of the parts of StarPU which bring most overhead, gprof can be used. First, recompile and reinstall StarPU with gprof support: \code ./configure --enable-perf-debug --disable-shared --disable-build-tests --disable-build-examples \endcode Make sure not to leave a dynamic version of StarPU in the target path: remove any remaining libstarpu-*.so Then relink your application with the static StarPU library, make sure that running ldd on your application does not mention any libstarpu (i.e. it's really statically-linked). \code gcc test.c -o test $(pkg-config --cflags starpu-1.3) $(pkg-config --libs starpu-1.3) \endcode Now you can run your application, and a gmon.out file should appear in the current directory, you can process it by running gprof on your application: \code gprof ./test \endcode That will dump an analysis of the time spent in StarPU functions. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/301_tasks.doxy000066400000000000000000000510151320135501600224200ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016, 2017 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \page TasksInStarPU Tasks In StarPU \section TaskGranularity Task Granularity Like any other runtime, StarPU has some overhead to manage tasks. Since it does smart scheduling and data management, that overhead is not always neglectable. The order of magnitude of the overhead is typically a couple of microseconds, which is actually quite smaller than the CUDA overhead itself. The amount of work that a task should do should thus be somewhat bigger, to make sure that the overhead becomes neglectible. The offline performance feedback can provide a measure of task length, which should thus be checked if bad performance are observed. To get a grasp at the scalability possibility according to task size, one can run tests/microbenchs/tasks_size_overhead.sh which draws curves of the speedup of independent tasks of very small sizes. The choice of scheduler also has impact over the overhead: for instance, the scheduler dmda takes time to make a decision, while eager does not. tasks_size_overhead.sh can again be used to get a grasp at how much impact that has on the target machine. \section TaskSubmission Task Submission To let StarPU make online optimizations, tasks should be submitted asynchronously as much as possible. Ideally, all the tasks should be submitted, and mere calls to starpu_task_wait_for_all() or starpu_data_unregister() be done to wait for termination. StarPU will then be able to rework the whole schedule, overlap computation with communication, manage accelerator local memory usage, etc. \section TaskPriorities Task Priorities By default, StarPU will consider the tasks in the order they are submitted by the application. If the application programmer knows that some tasks should be performed in priority (for instance because their output is needed by many other tasks and may thus be a bottleneck if not executed early enough), the field starpu_task::priority should be set to transmit the priority information to StarPU. \section SettingManyDataHandlesForATask Setting Many Data Handles For a Task The maximum number of data a task can manage is fixed by the environment variable \ref STARPU_NMAXBUFS which has a default value which can be changed through the configure option \ref enable-maxbuffers "--enable-maxbuffers". However, it is possible to define tasks managing more data by using the field starpu_task::dyn_handles when defining a task and the field starpu_codelet::dyn_modes when defining the corresponding codelet. \code{.c} enum starpu_data_access_mode modes[STARPU_NMAXBUFS+1] = { STARPU_R, STARPU_R, ... }; struct starpu_codelet dummy_big_cl = { .cuda_funcs = { dummy_big_kernel }, .opencl_funcs = { dummy_big_kernel }, .cpu_funcs = { dummy_big_kernel }, .cpu_funcs_name = { "dummy_big_kernel" }, .nbuffers = STARPU_NMAXBUFS+1, .dyn_modes = modes }; task = starpu_task_create(); task->cl = &dummy_big_cl; task->dyn_handles = malloc(task->cl->nbuffers * sizeof(starpu_data_handle_t)); for(i=0 ; icl->nbuffers ; i++) { task->dyn_handles[i] = handle; } starpu_task_submit(task); \endcode \code{.c} starpu_data_handle_t *handles = malloc(dummy_big_cl.nbuffers * sizeof(starpu_data_handle_t)); for(i=0 ; iexamples/basic_examples/dynamic_handles.c. \section SettingVariableDataHandlesForATask Setting a Variable Number Of Data Handles For a Task Normally, the number of data handles given to a task is fixed in the starpu_codelet::nbuffers codelet field. This field can however be set to \ref STARPU_VARIABLE_NBUFFERS, in which case the starpu_task::nbuffers task field must be set, and the starpu_task::modes field (or starpu_task::dyn_modes field, see \ref SettingManyDataHandlesForATask) should be used to specify the modes for the handles. \section UsingMultipleImplementationsOfACodelet Using Multiple Implementations Of A Codelet One may want to write multiple implementations of a codelet for a single type of device and let StarPU choose which one to run. As an example, we will show how to use SSE to scale a vector. The codelet can be written as follows: \code{.c} #include void scal_sse_func(void *buffers[], void *cl_arg) { float *vector = (float *) STARPU_VECTOR_GET_PTR(buffers[0]); unsigned int n = STARPU_VECTOR_GET_NX(buffers[0]); unsigned int n_iterations = n/4; if (n % 4 != 0) n_iterations++; __m128 *VECTOR = (__m128*) vector; __m128 factor __attribute__((aligned(16))); factor = _mm_set1_ps(*(float *) cl_arg); unsigned int i; for (i = 0; i < n_iterations; i++) VECTOR[i] = _mm_mul_ps(factor, VECTOR[i]); } \endcode \code{.c} struct starpu_codelet cl = { .cpu_funcs = { scal_cpu_func, scal_sse_func }, .cpu_funcs_name = { "scal_cpu_func", "scal_sse_func" }, .nbuffers = 1, .modes = { STARPU_RW } }; \endcode Schedulers which are multi-implementation aware (only dmda and pheft for now) will use the performance models of all the implementations it was given, and pick the one that seems to be the fastest. \section EnablingImplementationAccordingToCapabilities Enabling Implementation According To Capabilities Some implementations may not run on some devices. For instance, some CUDA devices do not support double floating point precision, and thus the kernel execution would just fail; or the device may not have enough shared memory for the implementation being used. The field starpu_codelet::can_execute permits to express this. For instance: \code{.c} static int can_execute(unsigned workerid, struct starpu_task *task, unsigned nimpl) { const struct cudaDeviceProp *props; if (starpu_worker_get_type(workerid) == STARPU_CPU_WORKER) return 1; /* Cuda device */ props = starpu_cuda_get_device_properties(workerid); if (props->major >= 2 || props->minor >= 3) /* At least compute capability 1.3, supports doubles */ return 1; /* Old card, does not support doubles */ return 0; } struct starpu_codelet cl = { .can_execute = can_execute, .cpu_funcs = { cpu_func }, .cpu_funcs_name = { "cpu_func" }, .cuda_funcs = { gpu_func } .nbuffers = 1, .modes = { STARPU_RW } }; \endcode This can be essential e.g. when running on a machine which mixes various models of CUDA devices, to take benefit from the new models without crashing on old models. Note: the function starpu_codelet::can_execute is called by the scheduler each time it tries to match a task with a worker, and should thus be very fast. The function starpu_cuda_get_device_properties() provides a quick access to CUDA properties of CUDA devices to achieve such efficiency. Another example is to compile CUDA code for various compute capabilities, resulting with two CUDA functions, e.g. scal_gpu_13 for compute capability 1.3, and scal_gpu_20 for compute capability 2.0. Both functions can be provided to StarPU by using starpu_codelet::cuda_funcs, and starpu_codelet::can_execute can then be used to rule out the scal_gpu_20 variant on a CUDA device which will not be able to execute it: \code{.c} static int can_execute(unsigned workerid, struct starpu_task *task, unsigned nimpl) { const struct cudaDeviceProp *props; if (starpu_worker_get_type(workerid) == STARPU_CPU_WORKER) return 1; /* Cuda device */ if (nimpl == 0) /* Trying to execute the 1.3 capability variant, we assume it is ok in all cases. */ return 1; /* Trying to execute the 2.0 capability variant, check that the card can do it. */ props = starpu_cuda_get_device_properties(workerid); if (props->major >= 2 || props->minor >= 0) /* At least compute capability 2.0, can run it */ return 1; /* Old card, does not support 2.0, will not be able to execute the 2.0 variant. */ return 0; } struct starpu_codelet cl = { .can_execute = can_execute, .cpu_funcs = { cpu_func }, .cpu_funcs_name = { "cpu_func" }, .cuda_funcs = { scal_gpu_13, scal_gpu_20 }, .nbuffers = 1, .modes = { STARPU_RW } }; \endcode Another example is having specialized implementations for some given common sizes, for instance here we have a specialized implementation for 1024x1024 matrices: \code{.c} static int can_execute(unsigned workerid, struct starpu_task *task, unsigned nimpl) { const struct cudaDeviceProp *props; if (starpu_worker_get_type(workerid) == STARPU_CPU_WORKER) return 1; /* Cuda device */ switch (nimpl) { case 0: /* Trying to execute the generic capability variant. */ return 1; case 1: { /* Trying to execute the size == 1024 specific variant. */ struct starpu_matrix_interface *interface = starpu_data_get_interface_on_node(task->handles[0]); return STARPU_MATRIX_GET_NX(interface) == 1024 && STARPU_MATRIX_GET_NY(interface == 1024); } } } struct starpu_codelet cl = { .can_execute = can_execute, .cpu_funcs = { cpu_func }, .cpu_funcs_name = { "cpu_func" }, .cuda_funcs = { potrf_gpu_generic, potrf_gpu_1024 }, .nbuffers = 1, .modes = { STARPU_RW } }; \endcode Note: the most generic variant should be provided first, as some schedulers are not able to try the different variants. \section InsertTaskUtility Insert Task Utility StarPU provides the wrapper function starpu_task_insert() to ease the creation and submission of tasks. Here the implementation of the codelet: \code{.c} void func_cpu(void *descr[], void *_args) { int *x0 = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); float *x1 = (float *)STARPU_VARIABLE_GET_PTR(descr[1]); int ifactor; float ffactor; starpu_codelet_unpack_args(_args, &ifactor, &ffactor); *x0 = *x0 * ifactor; *x1 = *x1 * ffactor; } struct starpu_codelet mycodelet = { .cpu_funcs = { func_cpu }, .cpu_funcs_name = { "func_cpu" }, .nbuffers = 2, .modes = { STARPU_RW, STARPU_RW } }; \endcode And the call to the function starpu_task_insert(): \code{.c} starpu_task_insert(&mycodelet, STARPU_VALUE, &ifactor, sizeof(ifactor), STARPU_VALUE, &ffactor, sizeof(ffactor), STARPU_RW, data_handles[0], STARPU_RW, data_handles[1], 0); \endcode The call to starpu_task_insert() is equivalent to the following code: \code{.c} struct starpu_task *task = starpu_task_create(); task->cl = &mycodelet; task->handles[0] = data_handles[0]; task->handles[1] = data_handles[1]; char *arg_buffer; size_t arg_buffer_size; starpu_codelet_pack_args(&arg_buffer, &arg_buffer_size, STARPU_VALUE, &ifactor, sizeof(ifactor), STARPU_VALUE, &ffactor, sizeof(ffactor), 0); task->cl_arg = arg_buffer; task->cl_arg_size = arg_buffer_size; int ret = starpu_task_submit(task); \endcode Here a similar call using ::STARPU_DATA_ARRAY. \code{.c} starpu_task_insert(&mycodelet, STARPU_DATA_ARRAY, data_handles, 2, STARPU_VALUE, &ifactor, sizeof(ifactor), STARPU_VALUE, &ffactor, sizeof(ffactor), 0); \endcode If some part of the task insertion depends on the value of some computation, the macro ::STARPU_DATA_ACQUIRE_CB can be very convenient. For instance, assuming that the index variable i was registered as handle A_handle[i]: \code{.c} /* Compute which portion we will work on, e.g. pivot */ starpu_task_insert(&which_index, STARPU_W, i_handle, 0); /* And submit the corresponding task */ STARPU_DATA_ACQUIRE_CB(i_handle, STARPU_R, starpu_task_insert(&work, STARPU_RW, A_handle[i], 0)); \endcode The macro ::STARPU_DATA_ACQUIRE_CB submits an asynchronous request for acquiring data i for the main application, and will execute the code given as third parameter when it is acquired. In other words, as soon as the value of i computed by the codelet which_index can be read, the portion of code passed as third parameter of ::STARPU_DATA_ACQUIRE_CB will be executed, and is allowed to read from i to use it e.g. as an index. Note that this macro is only avaible when compiling StarPU with the compiler gcc. There is several ways of calling the function starpu_codelet_unpack_args(). \code{.c} void func_cpu(void *descr[], void *_args) { int ifactor; float ffactor; starpu_codelet_unpack_args(_args, &ifactor, &ffactor); } \endcode \code{.c} void func_cpu(void *descr[], void *_args) { int ifactor; float ffactor; starpu_codelet_unpack_args(_args, &ifactor, 0); starpu_codelet_unpack_args(_args, &ifactor, &ffactor); } \endcode \code{.c} void func_cpu(void *descr[], void *_args) { int ifactor; float ffactor; char buffer[100]; starpu_codelet_unpack_args_and_copyleft(_args, buffer, 100, &ifactor, 0); starpu_codelet_unpack_args(buffer, &ffactor); } \endcode \section GettingTaskChildren Getting Task Children It may be interesting to get the list of tasks which depend on a given task, notably when using implicit dependencies, since this list is computed by StarPU. starpu_task_get_task_succs() provides it. For instance: \code{.c} struct starpu_task *tasks[4]; ret = starpu_task_get_task_succs(task, sizeof(tasks)/sizeof(*tasks), tasks); \endcode \section ParallelTasks Parallel Tasks StarPU can leverage existing parallel computation libraries by the means of parallel tasks. A parallel task is a task which gets worked on by a set of CPUs (called a parallel or combined worker) at the same time, by using an existing parallel CPU implementation of the computation to be achieved. This can also be useful to improve the load balance between slow CPUs and fast GPUs: since CPUs work collectively on a single task, the completion time of tasks on CPUs become comparable to the completion time on GPUs, thus relieving from granularity discrepancy concerns. hwloc support needs to be enabled to get good performance, otherwise StarPU will not know how to better group cores. Two modes of execution exist to accomodate with existing usages. \subsection Fork-modeParallelTasks Fork-mode Parallel Tasks In the Fork mode, StarPU will call the codelet function on one of the CPUs of the combined worker. The codelet function can use starpu_combined_worker_get_size() to get the number of threads it is allowed to start to achieve the computation. The CPU binding mask for the whole set of CPUs is already enforced, so that threads created by the function will inherit the mask, and thus execute where StarPU expected, the OS being in charge of choosing how to schedule threads on the corresponding CPUs. The application can also choose to bind threads by hand, using e.g. sched_getaffinity to know the CPU binding mask that StarPU chose. For instance, using OpenMP (full source is available in examples/openmp/vector_scal.c): \snippet forkmode.c To be included. You should update doxygen if you see this text. Other examples include for instance calling a BLAS parallel CPU implementation (see examples/mult/xgemm.c). \subsection SPMD-modeParallelTasks SPMD-mode Parallel Tasks In the SPMD mode, StarPU will call the codelet function on each CPU of the combined worker. The codelet function can use starpu_combined_worker_get_size() to get the total number of CPUs involved in the combined worker, and thus the number of calls that are made in parallel to the function, and starpu_combined_worker_get_rank() to get the rank of the current CPU within the combined worker. For instance: \code{.c} static void func(void *buffers[], void *args) { unsigned i; float *factor = _args; struct starpu_vector_interface *vector = buffers[0]; unsigned n = STARPU_VECTOR_GET_NX(vector); float *val = (float *)STARPU_VECTOR_GET_PTR(vector); /* Compute slice to compute */ unsigned m = starpu_combined_worker_get_size(); unsigned j = starpu_combined_worker_get_rank(); unsigned slice = (n+m-1)/m; for (i = j * slice; i < (j+1) * slice && i < n; i++) val[i] *= *factor; } static struct starpu_codelet cl = { .modes = { STARPU_RW }, .type = STARPU_SPMD, .max_parallelism = INT_MAX, .cpu_funcs = { func }, .cpu_funcs_name = { "func" }, .nbuffers = 1, } \endcode Of course, this trivial example will not really benefit from parallel task execution, and was only meant to be simple to understand. The benefit comes when the computation to be done is so that threads have to e.g. exchange intermediate results, or write to the data in a complex but safe way in the same buffer. \subsection ParallelTasksPerformance Parallel Tasks Performance To benefit from parallel tasks, a parallel-task-aware StarPU scheduler has to be used. When exposed to codelets with a flag ::STARPU_FORKJOIN or ::STARPU_SPMD, the schedulers pheft (parallel-heft) and peager (parallel eager) will indeed also try to execute tasks with several CPUs. It will automatically try the various available combined worker sizes (making several measurements for each worker size) and thus be able to avoid choosing a large combined worker if the codelet does not actually scale so much. \subsection CombinedWorkers Combined Workers By default, StarPU creates combined workers according to the architecture structure as detected by hwloc. It means that for each object of the hwloc topology (NUMA node, socket, cache, ...) a combined worker will be created. If some nodes of the hierarchy have a big arity (e.g. many cores in a socket without a hierarchy of shared caches), StarPU will create combined workers of intermediate sizes. The variable \ref STARPU_SYNTHESIZE_ARITY_COMBINED_WORKER permits to tune the maximum arity between levels of combined workers. The combined workers actually produced can be seen in the output of the tool starpu_machine_display (the environment variable \ref STARPU_SCHED has to be set to a combined worker-aware scheduler such as pheft or peager). \subsection ConcurrentParallelTasks Concurrent Parallel Tasks Unfortunately, many environments and librairies do not support concurrent calls. For instance, most OpenMP implementations (including the main ones) do not support concurrent pragma omp parallel statements without nesting them in another pragma omp parallel statement, but StarPU does not yet support creating its CPU workers by using such pragma. Other parallel libraries are also not safe when being invoked concurrently from different threads, due to the use of global variables in their sequential sections for instance. The solution is then to use only one combined worker at a time. This can be done by setting the field starpu_conf::single_combined_worker to 1, or setting the environment variable \ref STARPU_SINGLE_COMBINED_WORKER to 1. StarPU will then run only one parallel task at a time (but other CPU and GPU tasks are not affected and can be run concurrently). The parallel task scheduler will however still however still try varying combined worker sizes to look for the most efficient ones. \subsection SynchronizationTasks Synchronization Tasks For the application conveniency, it may be useful to define tasks which do not actually make any computation, but wear for instance dependencies between other tasks or tags, or to be submitted in callbacks, etc. The obvious way is of course to make kernel functions empty, but such task will thus have to wait for a worker to become ready, transfer data, etc. A much lighter way to define a synchronization task is to set its starpu_task::cl field to NULL. The task will thus be a mere synchronization point, without any data access or execution content: as soon as its dependencies become available, it will terminate, call the callbacks, and release dependencies. An intermediate solution is to define a codelet with its starpu_codelet::where field set to \ref STARPU_NOWHERE, for instance: \code{.c} struct starpu_codelet cl = { .where = STARPU_NOWHERE, .nbuffers = 1, .modes = { STARPU_R }, } task = starpu_task_create(); task->cl = &cl; task->handles[0] = handle; starpu_task_submit(task); \endcode will create a task which simply waits for the value of handle to be available for read. This task can then be depended on, etc. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/310_data_management.doxy000066400000000000000000001004751320135501600244050ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \page DataManagement Data Management TODO: intro qui parle de coherency entre autres \section DataInterface Data Interface StarPU provides several data interfaces for programmers to describe the data layout of their application. There are predefined interfaces already available in StarPU. Users can define new data interfaces as explained in \ref DefiningANewDataInterface. All functions provided by StarPU are documented in \ref API_Data_Interfaces. You will find a short list below. \subsection VariableDataInterface Variable Data Interface A variable is a given size byte element, typically a scalar. Here an example of how to register a variable data to StarPU by using starpu_variable_data_register(). \code{.c} float var = 42.0; starpu_data_handle_t var_handle; starpu_variable_data_register(&var_handle, STARPU_MAIN_RAM, (uintptr_t)&var, sizeof(var)); \endcode \subsection VectorDataInterface Vector Data Interface A vector is a fixed number of elements of a given size. Here an example of how to register a vector data to StarPU by using starpu_vector_data_register(). \code{.c} float vector[NX]; starpu_data_handle_t vector_handle; starpu_vector_data_register(&vector_handle, STARPU_MAIN_RAM, (uintptr_t)vector, NX, sizeof(vector[0])); \endcode \subsection MatrixDataInterface Matrix Data Interface To register 2-D matrices with a potential padding, one can use the matrix data interface. Here an example of how to register a matrix data to StarPU by using starpu_matrix_data_register(). \code{.c} float *matrix; starpu_data_handle_t matrix_handle; matrix = (float*)malloc(width * height * sizeof(float)); starpu_matrix_data_register(&matrix_handle, STARPU_MAIN_RAM, (uintptr_t)matrix, width, width, height, sizeof(float)); \endcode \subsection BlockDataInterface Block Data Interface To register 3-D blocks with potential paddings on Y and Z dimensions, one can use the block data interface. Here an example of how to register a block data to StarPU by using starpu_block_data_register(). \code{.c} float *block; starpu_data_handle_t block_handle; block = (float*)malloc(nx*ny*nz*sizeof(float)); starpu_block_data_register(&block_handle, STARPU_MAIN_RAM, (uintptr_t)block, nx, nx*ny, nx, ny, nz, sizeof(float)); \endcode \subsection BCSRDataInterface BCSR Data Interface BCSR (Blocked Compressed Sparse Row Representation) sparse matrix data can be registered to StarPU using the bcsr data interface. Here an example on how to do so by using starpu_bcsr_data_register(). \code{.c} /* * We use the following matrix: * * +----------------+ * | 0 1 0 0 | * | 2 3 0 0 | * | 4 5 8 9 | * | 6 7 10 11 | * +----------------+ * * nzval = [0, 1, 2, 3] ++ [4, 5, 6, 7] ++ [8, 9, 10, 11] * colind = [0, 0, 1] * rowptr = [0, 1, 3] * r = c = 2 */ /* Size of the blocks */ int R = 2; int C = 2; int NROWS = 2; int NNZ_BLOCKS = 3; /* out of 4 */ int NZVAL_SIZE = (R*C*NNZ_BLOCKS); int nzval[NZVAL_SIZE] = { 0, 1, 2, 3, /* First block */ 4, 5, 6, 7, /* Second block */ 8, 9, 10, 11 /* Third block */ }; uint32_t colind[NNZ_BLOCKS] = { 0, /* block-column index for first block in nzval */ 0, /* block-column index for second block in nzval */ 1 /* block-column index for third block in nzval */ }; uint32_t rowptr[NROWS+1] = { 0, / * block-index in nzval of the first block of the first row. */ 1, / * block-index in nzval of the first block of the second row. */ NNZ_BLOCKS /* number of blocks, to allow an easier element's access for the kernels */ }; starpu_data_handle_t bcsr_handle; starpu_bcsr_data_register(&bcsr_handle, STARPU_MAIN_RAM, NNZ_BLOCKS, NROWS, (uintptr_t) nzval, colind, rowptr, 0, /* firstentry */ R, C, sizeof(nzval[0])); \endcode StarPU provides an example on how to deal with such matrices in examples/spmv. \subsection CSRDataInterface CSR Data Interface TODO \section DataManagement Data Management When the application allocates data, whenever possible it should use the starpu_malloc() function, which will ask CUDA or OpenCL to make the allocation itself and pin the corresponding allocated memory, or to use the starpu_memory_pin() function to pin memory allocated by other ways, such as local arrays. This is needed to permit asynchronous data transfer, i.e. permit data transfer to overlap with computations. Otherwise, the trace will show that the DriverCopyAsync state takes a lot of time, this is because CUDA or OpenCL then reverts to synchronous transfers. By default, StarPU leaves replicates of data wherever they were used, in case they will be re-used by other tasks, thus saving the data transfer time. When some task modifies some data, all the other replicates are invalidated, and only the processing unit which ran that task will have a valid replicate of the data. If the application knows that this data will not be re-used by further tasks, it should advise StarPU to immediately replicate it to a desired list of memory nodes (given through a bitmask). This can be understood like the write-through mode of CPU caches. \code{.c} starpu_data_set_wt_mask(img_handle, 1<<0); \endcode will for instance request to always automatically transfer a replicate into the main memory (node 0), as bit 0 of the write-through bitmask is being set. \code{.c} starpu_data_set_wt_mask(img_handle, ~0U); \endcode will request to always automatically broadcast the updated data to all memory nodes. Setting the write-through mask to ~0U can also be useful to make sure all memory nodes always have a copy of the data, so that it is never evicted when memory gets scarse. Implicit data dependency computation can become expensive if a lot of tasks access the same piece of data. If no dependency is required on some piece of data (e.g. because it is only accessed in read-only mode, or because write accesses are actually commutative), use the function starpu_data_set_sequential_consistency_flag() to disable implicit dependencies on that data. In the same vein, accumulation of results in the same data can become a bottleneck. The use of the mode ::STARPU_REDUX permits to optimize such accumulation (see \ref DataReduction). To a lesser extent, the use of the flag ::STARPU_COMMUTE keeps the bottleneck (see \ref DataCommute), but at least permits the accumulation to happen in any order. Applications often need a data just for temporary results. In such a case, registration can be made without an initial value, for instance this produces a vector data: \code{.c} starpu_vector_data_register(&handle, -1, 0, n, sizeof(float)); \endcode StarPU will then allocate the actual buffer only when it is actually needed, e.g. directly on the GPU without allocating in main memory. In the same vein, once the temporary results are not useful any more, the data should be thrown away. If the handle is not to be reused, it can be unregistered: \code{.c} starpu_data_unregister_submit(handle); \endcode actual unregistration will be done after all tasks working on the handle terminate. If the handle is to be reused, instead of unregistering it, it can simply be invalidated: \code{.c} starpu_data_invalidate_submit(handle); \endcode the buffers containing the current value will then be freed, and reallocated only when another task writes some value to the handle. \section DataPrefetch Data Prefetch The scheduling policies heft, dmda and pheft perform data prefetch (see \ref STARPU_PREFETCH): as soon as a scheduling decision is taken for a task, requests are issued to transfer its required data to the target processing unit, if needed, so that when the processing unit actually starts the task, its data will hopefully be already available and it will not have to wait for the transfer to finish. The application may want to perform some manual prefetching, for several reasons such as excluding initial data transfers from performance measurements, or setting up an initial statically-computed data distribution on the machine before submitting tasks, which will thus guide StarPU toward an initial task distribution (since StarPU will try to avoid further transfers). This can be achieved by giving the function starpu_data_prefetch_on_node() the handle and the desired target memory node. The starpu_data_idle_prefetch_on_node() variant can be used to issue the transfer only when the bus is idle. Conversely, one can advise StarPU that some data will not be useful in the close future by calling starpu_data_wont_use(). StarPU will then write its value back to its home node, and evict it from GPUs when room is needed. \section PartitioningData Partitioning Data An existing piece of data can be partitioned in sub parts to be used by different tasks, for instance: \code{.c} #define NX 1048576 #define PARTS 16 int vector[NX]; starpu_data_handle_t handle; /* Declare data to StarPU */ starpu_vector_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)vector, NX, sizeof(vector[0])); /* Partition the vector in PARTS sub-vectors */ struct starpu_data_filter f = { .filter_func = starpu_vector_filter_block, .nchildren = PARTS }; starpu_data_partition(handle, &f); \endcode The task submission then uses the function starpu_data_get_sub_data() to retrieve the sub-handles to be passed as tasks parameters. \code{.c} /* Submit a task on each sub-vector */ for (i=0; ihandles[0] = sub_handle; task->cl = &cl; task->synchronous = 1; task->cl_arg = &factor; task->cl_arg_size = sizeof(factor); starpu_task_submit(task); } \endcode Partitioning can be applied several times, see examples/basic_examples/mult.c and examples/filters/. Wherever the whole piece of data is already available, the partitioning will be done in-place, i.e. without allocating new buffers but just using pointers inside the existing copy. This is particularly important to be aware of when using OpenCL, where the kernel parameters are not pointers, but cl_mem handles. The kernel thus needs to be also passed the offset within the OpenCL buffer: \code{.c} void opencl_func(void *buffers[], void *cl_arg) { cl_mem vector = (cl_mem) STARPU_VECTOR_GET_DEV_HANDLE(buffers[0]); unsigned offset = STARPU_BLOCK_GET_OFFSET(buffers[0]); ... clSetKernelArg(kernel, 0, sizeof(vector), &vector); clSetKernelArg(kernel, 1, sizeof(offset), &offset); ... } \endcode And the kernel has to shift from the pointer passed by the OpenCL driver: \code{.c} __kernel void opencl_kernel(__global int *vector, unsigned offset) { block = (__global void *)block + offset; ... } \endcode StarPU provides various interfaces and filters for matrices, vectors, etc., but applications can also write their own data interfaces and filters, see examples/interface and examples/filters/custom_mf for an example, and see \ref DefiningANewDataInterface and \ref DefiningANewDataFilter for documentation. \section AsynchronousPartitioning Asynchronous Partitioning The partitioning functions described in the previous section are synchronous: starpu_data_partition() and starpu_data_unpartition() both wait for all the tasks currently working on the data. This can be a bottleneck for the application. An asynchronous API also exists, it works only on handles with sequential consistency. The principle is to first plan the partitioning, which returns data handles of the partition, which are not functional yet. Along other task submission, one can submit the actual partitioning, and then use the handles of the partition. Before using the handle of the whole data, one has to submit the unpartitioning. fmultiple_submit is a complete example using this technique. In short, we first register a matrix and plan the partitioning: \code{.c} starpu_matrix_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)matrix, NX, NX, NY, sizeof(matrix[0])); struct starpu_data_filter f_vert = { .filter_func = starpu_matrix_filter_block, .nchildren = PARTS }; starpu_data_partition_plan(handle, &f_vert, vert_handle); \endcode starpu_data_partition_plan() returns the handles for the partition in vert_handle. One can submit tasks working on the main handle, but not yet on the vert_handle handles. Now we submit the partitioning: \code{.c} starpu_data_partition_submit(handle, PARTS, vert_handle); \endcode And now we can submit tasks working on vert_handle handles (and not on the main handle any more). Eventually we want to work on the main handle again, so we submit the unpartitioning: \code{.c} starpu_data_unpartition_submit(handle, PARTS, vert_handle, -1); \endcode And now we can submit tasks working on the main handle again. All this code is asynchronous, just submitting which tasks, partitioning and unpartitioning should be done at runtime. Planning several partitioning of the same data is also possible, one just has to submit unpartitioning (to get back to the initial handle) before submitting another partitioning. It is also possible to activate several partitioning at the same time, in read-only mode, by using starpu_data_partition_readonly_submit(). A complete example is available in examples/filters/fmultiple_submit_readonly.c. \section ManualPartitioning Manual Partitioning One can also handle partitioning by hand, by registering several views on the same piece of data. The idea is then to manage the coherency of the various views through the common buffer in the main memory. fmultiple_manual is a complete example using this technique. In short, we first register the same matrix several times: \code{.c} starpu_matrix_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)matrix, NX, NX, NY, sizeof(matrix[0])); for (i = 0; i < PARTS; i++) starpu_matrix_data_register(&vert_handle[i], STARPU_MAIN_RAM, (uintptr_t)&matrix[0][i*(NX/PARTS)], NX, NX/PARTS, NY, sizeof(matrix[0][0])); \endcode Since StarPU is not aware that the two handles are actually pointing to the same data, we have a danger of inadvertently submitting tasks to both views, which will bring a mess since StarPU will not guarantee any coherency between the two views. To make sure we don't do this, we invalidate the view that we will not use: \code{.c} for (i = 0; i < PARTS; i++) starpu_data_invalidate(vert_handle[i]); \endcode Then we can safely work on handle. When we want to switch to the vertical slice view, all we need to do is bring coherency between them by running an empty task on the home node of the data: \code{.c} void empty(void *buffers[] STARPU_ATTRIBUTE_UNUSED, void *cl_arg STARPU_ATTRIBUTE_UNUSED) { } struct starpu_codelet cl_switch = { .cpu_funcs = {empty}, .nbuffers = STARPU_VARIABLE_NBUFFERS, }; ret = starpu_task_insert(&cl_switch, STARPU_RW, handle, STARPU_W, vert_handle[0], STARPU_W, vert_handle[1], 0); \endcode The execution of the switch task will get back the matrix data into the main memory, and thus the vertical slices will get the updated value there. Again, we prefer to make sure that we don't accidentally access the matrix through the whole-matrix handle: \code{.c} starpu_data_invalidate_submit(handle); \endcode And now we can start using vertical slices, etc. \section DefiningANewDataFilter Defining A New Data Filter StarPU provides a series of predefined filters in API_Data_Partition, but additional filters can be defined by the application. The principle is that the filter function just fills the memory location of the i-th subpart of a data. Examples are provided in src/datawizard/interfaces/*_filters.c, and see \ref starpu_data_filter::filter_func for the details. \section DataReduction Data Reduction In various cases, some piece of data is used to accumulate intermediate results. For instances, the dot product of a vector, maximum/minimum finding, the histogram of a photograph, etc. When these results are produced along the whole machine, it would not be efficient to accumulate them in only one place, incurring data transmission each and access concurrency. StarPU provides a mode ::STARPU_REDUX, which permits to optimize that case: it will allocate a buffer on each memory node, and accumulate intermediate results there. When the data is eventually accessed in the normal mode ::STARPU_R, StarPU will collect the intermediate results in just one buffer. For this to work, the user has to use the function starpu_data_set_reduction_methods() to declare how to initialize these buffers, and how to assemble partial results. For instance, cg uses that to optimize its dot product: it first defines the codelets for initialization and reduction: \code{.c} struct starpu_codelet bzero_variable_cl = { .cpu_funcs = { bzero_variable_cpu }, .cpu_funcs_name = { "bzero_variable_cpu" }, .cuda_funcs = { bzero_variable_cuda }, .nbuffers = 1, } static void accumulate_variable_cpu(void *descr[], void *cl_arg) { double *v_dst = (double *)STARPU_VARIABLE_GET_PTR(descr[0]); double *v_src = (double *)STARPU_VARIABLE_GET_PTR(descr[1]); *v_dst = *v_dst + *v_src; } static void accumulate_variable_cuda(void *descr[], void *cl_arg) { double *v_dst = (double *)STARPU_VARIABLE_GET_PTR(descr[0]); double *v_src = (double *)STARPU_VARIABLE_GET_PTR(descr[1]); cublasaxpy(1, (double)1.0, v_src, 1, v_dst, 1); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } struct starpu_codelet accumulate_variable_cl = { .cpu_funcs = { accumulate_variable_cpu }, .cpu_funcs_name = { "accumulate_variable_cpu" }, .cuda_funcs = { accumulate_variable_cuda }, .nbuffers = 1, } \endcode and attaches them as reduction methods for its handle dtq: \code{.c} starpu_variable_data_register(&dtq_handle, -1, NULL, sizeof(type)); starpu_data_set_reduction_methods(dtq_handle, &accumulate_variable_cl, &bzero_variable_cl); \endcode and dtq_handle can now be used in mode ::STARPU_REDUX for the dot products with partitioned vectors: \code{.c} for (b = 0; b < nblocks; b++) starpu_task_insert(&dot_kernel_cl, STARPU_REDUX, dtq_handle, STARPU_R, starpu_data_get_sub_data(v1, 1, b), STARPU_R, starpu_data_get_sub_data(v2, 1, b), 0); \endcode During registration, we have here provided NULL, i.e. there is no initial value to be taken into account during reduction. StarPU will thus only take into account the contributions from the tasks dot_kernel_cl. Also, it will not allocate any memory for dtq_handle before tasks dot_kernel_cl are ready to run. If another dot product has to be performed, one could unregister dtq_handle, and re-register it. But one can also call starpu_data_invalidate_submit() with the parameter dtq_handle, which will clear all data from the handle, thus resetting it back to the initial status register(NULL). The example cg also uses reduction for the blocked gemv kernel, leading to yet more relaxed dependencies and more parallelism. ::STARPU_REDUX can also be passed to starpu_mpi_task_insert() in the MPI case. That will however not produce any MPI communication, but just pass ::STARPU_REDUX to the underlying starpu_task_insert(). It is up to the application to call starpu_mpi_redux_data(), which posts tasks that will reduce the partial results among MPI nodes into the MPI node which owns the data. For instance, some hypothetical application which collects partial results into data res, then uses it for other computation, before looping again with a new reduction: \code{.c} for (i = 0; i < 100; i++) { starpu_mpi_task_insert(MPI_COMM_WORLD, &init_res, STARPU_W, res, 0); starpu_mpi_task_insert(MPI_COMM_WORLD, &work, STARPU_RW, A, STARPU_R, B, STARPU_REDUX, res, 0); starpu_mpi_redux_data(MPI_COMM_WORLD, res); starpu_mpi_task_insert(MPI_COMM_WORLD, &work2, STARPU_RW, B, STARPU_R, res, 0); } \endcode \section DataCommute Commute Data Access By default, the implicit dependencies computed from data access use the sequential semantic. Notably, write accesses are always serialized in the order of submission. In some applicative cases, the write contributions can actually be performed in any order without affecting the eventual result. In that case it is useful to drop the strictly sequential semantic, to improve parallelism by allowing StarPU to reorder the write accesses. This can be done by using the ::STARPU_COMMUTE data access flag. Accesses without this flag will however properly be serialized against accesses with this flag. For instance: \code{.c} starpu_task_insert(&cl1, STARPU_R, h, STARPU_RW, handle, 0); starpu_task_insert(&cl2, STARPU_R, handle1, STARPU_RW|STARPU_COMMUTE, handle, 0); starpu_task_insert(&cl2, STARPU_R, handle2, STARPU_RW|STARPU_COMMUTE, handle, 0); starpu_task_insert(&cl3, STARPU_R, g, STARPU_RW, handle, 0); \endcode The two tasks running cl2 will be able to commute: depending on whether the value of handle1 or handle2 becomes available first, the corresponding task running cl2 will start first. The task running cl1 will however always be run before them, and the task running cl3 will always be run after them. If a lot of tasks use the commute access on the same set of data and a lot of them are ready at the same time, it may become interesting to use an arbiter, see \ref ConcurrentDataAccess. \section ConcurrentDataAccess Concurrent Data Accesses When several tasks are ready and will work on several data, StarPU is faced with the classical Dining Philosophers problem, and has to determine the order in which it will run the tasks. Data accesses usually use sequential ordering, so data accesses are usually already serialized, and thus by default StarPU uses the Dijkstra solution which scales very well in terms of overhead: tasks will just acquire data one by one by data handle pointer value order. When sequential ordering is disabled or the ::STARPU_COMMUTE flag is used, there may be a lot of concurrent accesses to the same data, and the Dijkstra solution gets only poor parallelism, typically in some pathological cases which do happen in various applications. In that case, one can use a data access arbiter, which implements the classical centralized solution for the Dining Philosophers problem. This is more expensive in terms of overhead since it is centralized, but it opportunistically gets a lot of parallelism. The centralization can also be avoided by using several arbiters, thus separating sets of data for which arbitration will be done. If a task accesses data from different arbiters, it will acquire them arbiter by arbiter, in arbiter pointer value order. See the tests/datawizard/test_arbiter.cpp example. Arbiters however do not support the ::STARPU_REDUX flag yet. \section TemporaryBuffers Temporary Buffers There are two kinds of temporary buffers: temporary data which just pass results from a task to another, and scratch data which are needed only internally by tasks. \subsection TemporaryData Temporary Data Data can sometimes be entirely produced by a task, and entirely consumed by another task, without the need for other parts of the application to access it. In such case, registration can be done without prior allocation, by using the special memory node number -1, and passing a zero pointer. StarPU will actually allocate memory only when the task creating the content gets scheduled, and destroy it on unregistration. In addition to that, it can be tedious for the application to have to unregister the data, since it will not use its content anyway. The unregistration can be done lazily by using the function starpu_data_unregister_submit(), which will record that no more tasks accessing the handle will be submitted, so that it can be freed as soon as the last task accessing it is over. The following code examplifies both points: it registers the temporary data, submits three tasks accessing it, and records the data for automatic unregistration. \code{.c} starpu_vector_data_register(&handle, -1, 0, n, sizeof(float)); starpu_task_insert(&produce_data, STARPU_W, handle, 0); starpu_task_insert(&compute_data, STARPU_RW, handle, 0); starpu_task_insert(&summarize_data, STARPU_R, handle, STARPU_W, result_handle, 0); starpu_data_unregister_submit(handle); \endcode The application may also want to see the temporary data initialized on the fly before being used by the task. This can be done by using starpu_data_set_reduction_methods() to set an initialization codelet (no redux codelet is needed). \subsection ScratchData Scratch Data Some kernels sometimes need temporary data to achieve the computations, i.e. a workspace. The application could allocate it at the start of the codelet function, and free it at the end, but that would be costly. It could also allocate one buffer per worker (similarly to \ref HowToInitializeAComputationLibraryOnceForEachWorker), but that would make them systematic and permanent. A more optimized way is to use the data access mode ::STARPU_SCRATCH, as examplified below, which provides per-worker buffers without content consistency. The buffer is registered only once, using memory node -1, i.e. the application didn't allocate memory for it, and StarPU will allocate it on demand at task execution. \code{.c} starpu_vector_data_register(&workspace, -1, 0, sizeof(float)); for (i = 0; i < N; i++) starpu_task_insert(&compute, STARPU_R, input[i], STARPU_SCRATCH, workspace, STARPU_W, output[i], 0); \endcode StarPU will make sure that the buffer is allocated before executing the task, and make this allocation per-worker: for CPU workers, notably, each worker has its own buffer. This means that each task submitted above will actually have its own workspace, which will actually be the same for all tasks running one after the other on the same worker. Also, if for instance memory becomes scarce, StarPU will notice that it can free such buffers easily, since the content does not matter. The example examples/pi uses scratches for some temporary buffer. \section TheMultiformatInterface The Multiformat Interface It may be interesting to represent the same piece of data using two different data structures: one that would only be used on CPUs, and one that would only be used on GPUs. This can be done by using the multiformat interface. StarPU will be able to convert data from one data structure to the other when needed. Note that the scheduler dmda is the only one optimized for this interface. The user must provide StarPU with conversion codelets: \snippet multiformat.c To be included. You should update doxygen if you see this text. Kernels can be written almost as for any other interface. Note that ::STARPU_MULTIFORMAT_GET_CPU_PTR shall only be used for CPU kernels. CUDA kernels must use ::STARPU_MULTIFORMAT_GET_CUDA_PTR, and OpenCL kernels must use ::STARPU_MULTIFORMAT_GET_OPENCL_PTR. ::STARPU_MULTIFORMAT_GET_NX may be used in any kind of kernel. \code{.c} static void multiformat_scal_cpu_func(void *buffers[], void *args) { struct point *aos; unsigned int n; aos = STARPU_MULTIFORMAT_GET_CPU_PTR(buffers[0]); n = STARPU_MULTIFORMAT_GET_NX(buffers[0]); ... } extern "C" void multiformat_scal_cuda_func(void *buffers[], void *_args) { unsigned int n; struct struct_of_arrays *soa; soa = (struct struct_of_arrays *) STARPU_MULTIFORMAT_GET_CUDA_PTR(buffers[0]); n = STARPU_MULTIFORMAT_GET_NX(buffers[0]); ... } \endcode A full example may be found in examples/basic_examples/multiformat.c. \section DefiningANewDataInterface Defining A New Data Interface Let's define a new data interface to manage complex numbers. \code{.c} /* interface for complex numbers */ struct starpu_complex_interface { double *real; double *imaginary; int nx; }; \endcode Registering such a data to StarPU is easily done using the function starpu_data_register(). The last parameter of the function, interface_complex_ops, will be described below. \code{.c} void starpu_complex_data_register(starpu_data_handle_t *handle, unsigned home_node, double *real, double *imaginary, int nx) { struct starpu_complex_interface complex = { .real = real, .imaginary = imaginary, .nx = nx }; if (interface_complex_ops.interfaceid == STARPU_UNKNOWN_INTERFACE_ID) { interface_complex_ops.interfaceid = starpu_data_interface_get_next_id(); } starpu_data_register(handleptr, home_node, &complex, &interface_complex_ops); } \endcode Different operations need to be defined for a data interface through the type starpu_data_interface_ops. We only define here the basic operations needed to run simple applications. The source code for the different functions can be found in the file examples/interface/complex_interface.c, the details of the hooks to be provided are documented \ref starpu_data_interface_ops . \code{.c} static struct starpu_data_interface_ops interface_complex_ops = { .register_data_handle = complex_register_data_handle, .allocate_data_on_node = complex_allocate_data_on_node, .copy_methods = &complex_copy_methods, .get_size = complex_get_size, .footprint = complex_footprint, .interfaceid = STARPU_UNKNOWN_INTERFACE_ID, .interface_size = sizeof(struct starpu_complex_interface), }; \endcode Functions need to be defined to access the different fields of the complex interface from a StarPU data handle. \code{.c} double *starpu_complex_get_real(starpu_data_handle_t handle) { struct starpu_complex_interface *complex_interface = (struct starpu_complex_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); return complex_interface->real; } double *starpu_complex_get_imaginary(starpu_data_handle_t handle); int starpu_complex_get_nx(starpu_data_handle_t handle); \endcode Similar functions need to be defined to access the different fields of the complex interface from a void * pointer to be used within codelet implemetations. \snippet complex.c To be included. You should update doxygen if you see this text. Complex data interfaces can then be registered to StarPU. \code{.c} double real = 45.0; double imaginary = 12.0; starpu_complex_data_register(&handle1, STARPU_MAIN_RAM, &real, &imaginary, 1); starpu_task_insert(&cl_display, STARPU_R, handle1, 0); \endcode and used by codelets. \code{.c} void display_complex_codelet(void *descr[], __attribute__ ((unused)) void *_args) { int nx = STARPU_COMPLEX_GET_NX(descr[0]); double *real = STARPU_COMPLEX_GET_REAL(descr[0]); double *imaginary = STARPU_COMPLEX_GET_IMAGINARY(descr[0]); int i; for(i=0 ; iexamples/interface/. \section SpecifyingATargetNode Specifying A Target Node For Task Data When executing a task on a GPU for instance, StarPU would normally copy all the needed data for the tasks on the embedded memory of the GPU. It may however happen that the task kernel would rather have some of the datas kept in the main memory instead of copied in the GPU, a pivoting vector for instance. This can be achieved by setting the starpu_codelet::specific_nodes flag to 1, and then fill the starpu_codelet::nodes array (or starpu_codelet::dyn_nodes when starpu_codelet::nbuffers is greater than \ref STARPU_NMAXBUFS) with the node numbers where data should be copied to, or -1 to let StarPU copy it to the memory node where the task will be executed. For instance, with the following codelet: \code{.c} struct starpu_codelet cl = { .cuda_funcs = { kernel }, .nbuffers = 2, .modes = {STARPU_RW, STARPU_RW}, .specific_nodes = 1, .nodes = {STARPU_MAIN_RAM, -1}, }; \endcode the first data of the task will be kept in the main memory, while the second data will be copied to the CUDA GPU as usual. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/320_scheduling.doxy000066400000000000000000000355431320135501600234310ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \page Scheduling Scheduling \section TaskSchedulingPolicy Task Scheduling Policies The basics of the scheduling policy are that:
  • The scheduler gets to schedule tasks (push operation) when they become ready to be executed, i.e. they are not waiting for some tags, data dependencies or task dependencies.
  • Workers pull tasks (pop operation) one by one from the scheduler.
This means scheduling policies usually contain at least one queue of tasks to store them between the time when they become available, and the time when a worker gets to grab them. By default, StarPU uses the simple greedy scheduler eager. This is because it provides correct load balance even if the application codelets do not have performance models. Other non-modelling scheduling policies can be selected among the list below, thanks to the environment variable \ref STARPU_SCHED. For instance export STARPU_SCHED=dmda . Use help to get the list of available schedulers. Non Performance Modelling Policies: The eager scheduler uses a central task queue, from which all workers draw tasks to work on concurrently. This however does not permit to prefetch data since the scheduling decision is taken late. If a task has a non-0 priority, it is put at the front of the queue. The random scheduler uses a queue per worker, and distributes tasks randomly according to assumed worker overall performance. The ws (work stealing) scheduler uses a queue per worker, and schedules a task on the worker which released it by default. When a worker becomes idle, it steals a task from the most loaded worker. The lws (locality work stealing) scheduler uses a queue per worker, and schedules a task on the worker which released it by default. When a worker becomes idle, it steals a task from neighbour workers. It also takes into account priorities. The prio scheduler also uses a central task queue, but sorts tasks by priority specified by the programmer (between -5 and 5). \section DMTaskSchedulingPolicy Performance Model-Based Task Scheduling Policies If (and only if) your application codelets have performance models (\ref PerformanceModelExample), you should change the scheduler thanks to the environment variable \ref STARPU_SCHED, to select one of the policies below, in order to take advantage of StarPU's performance modelling. For instance export STARPU_SCHED=dmda . Use help to get the list of available schedulers. Note: Depending on the performance model type chosen, some preliminary calibration runs may be needed for the model to converge. If the calibration has not been done, or is insufficient yet, or if no performance model is specified for a codelet, every task built from this codelet will be scheduled using an eager fallback policy. Troubleshooting: Configuring and recompiling StarPU using the --enable-verbose configure flag displays some statistics at the end of execution about the percentage of tasks that have been scheduled by a DM* family policy using performance model hints. A low or zero percentage may be the sign that performance models are not converging or that codelets do not have performance models enabled. Performance Modelling Policies: The dm (deque model) scheduler takes task execution performance models into account to perform a HEFT-similar scheduling strategy: it schedules tasks where their termination time will be minimal. The difference with HEFT is that dm schedules tasks as soon as they become available, and thus in the order they become available, without taking priorities into account. The dmda (deque model data aware) scheduler is similar to dm, but it also takes into account data transfer time. The dmdar (deque model data aware ready) scheduler is similar to dmda, but it also sorts tasks on per-worker queues by number of already-available data buffers on the target device. The dmdas (deque model data aware sorted) scheduler is similar to dmdar, except that it sorts tasks by priority order, which allows to become even closer to HEFT by respecting priorities after having made the scheduling decision (but it still schedules tasks in the order they become available). The dmdasd (deque model data aware sorted decision) scheduler is similar to dmdas, except that when scheduling a task, it takes into account its priority when computing the minimum completion time, since this task may get executed before others, and thus the latter should be ignored. The heft (heterogeneous earliest finish time) scheduler is a deprecated alias for dmda. The pheft (parallel HEFT) scheduler is similar to dmda, it also supports parallel tasks (still experimental). Should not be used when several contexts using it are being executed simultaneously. The peager (parallel eager) scheduler is similar to eager, it also supports parallel tasks (still experimental). Should not be used when several contexts using it are being executed simultaneously. TODO: describe modular schedulers \section TaskDistributionVsDataTransfer Task Distribution Vs Data Transfer Distributing tasks to balance the load induces data transfer penalty. StarPU thus needs to find a balance between both. The target function that the scheduler dmda of StarPU tries to minimize is alpha * T_execution + beta * T_data_transfer, where T_execution is the estimated execution time of the codelet (usually accurate), and T_data_transfer is the estimated data transfer time. The latter is estimated based on bus calibration before execution start, i.e. with an idle machine, thus without contention. You can force bus re-calibration by running the tool starpu_calibrate_bus. The beta parameter defaults to 1, but it can be worth trying to tweak it by using export STARPU_SCHED_BETA=2 (\ref STARPU_SCHED_BETA) for instance, since during real application execution, contention makes transfer times bigger. This is of course imprecise, but in practice, a rough estimation already gives the good results that a precise estimation would give. \section Energy-basedScheduling Energy-based Scheduling If the application can provide some energy consumption performance model (through the field starpu_codelet::energy_model), StarPU will take it into account when distributing tasks. The target function that the scheduler dmda minimizes becomes alpha * T_execution + beta * T_data_transfer + gamma * Consumption , where Consumption is the estimated task consumption in Joules. To tune this parameter, use export STARPU_SCHED_GAMMA=3000 (\ref STARPU_SCHED_GAMMA) for instance, to express that each Joule (i.e kW during 1000us) is worth 3000us execution time penalty. Setting alpha and beta to zero permits to only take into account energy consumption. This is however not sufficient to correctly optimize energy: the scheduler would simply tend to run all computations on the most energy-conservative processing unit. To account for the consumption of the whole machine (including idle processing units), the idle power of the machine should be given by setting export STARPU_IDLE_POWER=200 (\ref STARPU_IDLE_POWER) for 200W, for instance. This value can often be obtained from the machine power supplier. The energy actually consumed by the total execution can be displayed by setting export STARPU_PROFILING=1 STARPU_WORKER_STATS=1 . On-line task consumption measurement is currently only supported through the CL_PROFILING_POWER_CONSUMED OpenCL extension, implemented in the MoviSim simulator. Applications can however provide explicit measurements by using the function starpu_perfmodel_update_history() (examplified in \ref PerformanceModelExample with the energy_model performance model). Fine-grain measurement is often not feasible with the feedback provided by the hardware, so the user can for instance run a given task a thousand times, measure the global consumption for that series of tasks, divide it by a thousand, repeat for varying kinds of tasks and task sizes, and eventually feed StarPU with these manual measurements through starpu_perfmodel_update_history(). For instance, for CUDA devices, nvidia-smi -q -d POWER can be used to get the current consumption in Watt. Multiplying that value by the average duration of a single task gives the consumption of the task in Joules, which can be given to starpu_perfmodel_update_history(). \section StaticScheduling Static Scheduling In some cases, one may want to force some scheduling, for instance force a given set of tasks to GPU0, another set to GPU1, etc. while letting some other tasks be scheduled on any other device. This can indeed be useful to guide StarPU into some work distribution, while still letting some degree of dynamism. For instance, to force execution of a task on CUDA0: \code{.c} task->execute_on_a_specific_worker = 1; task->workerid = starpu_worker_get_by_type(STARPU_CUDA_WORKER, 0); \endcode One can also specify the order in which tasks must be executed by setting the starpu_task::workerorder field. If this field is set to a non-zero value, it provides the per-worker consecutive order in which tasks will be executed, starting from 1. For a given of such task, the worker will thus not execute it before all the tasks with smaller order value have been executed, notably in case those tasks are not available yet due to some dependencies. This eventually gives total control of task scheduling, and StarPU will only serve as a "self-timed" task runtime. Of course, the provided order has to be runnable, i.e. a task should should not depend on another task bound to the same worker with a bigger order. Note however that using scheduling contexts while statically scheduling tasks on workers could be tricky. Be careful to schedule the tasks exactly on the workers of the corresponding contexts, otherwise the workers' corresponding scheduling structures may not be allocated or the execution of the application may deadlock. Moreover, the hypervisor should not be used when statically scheduling tasks. \section DefiningANewSchedulingPolicy Defining A New Scheduling Policy A full example showing how to define a new scheduling policy is available in the StarPU sources in the directory examples/scheduler/. The scheduler has to provide methods: \code{.c} static struct starpu_sched_policy dummy_sched_policy = { .init_sched = init_dummy_sched, .deinit_sched = deinit_dummy_sched, .add_workers = dummy_sched_add_workers, .remove_workers = dummy_sched_remove_workers, .push_task = push_task_dummy, .pop_task = pop_task_dummy, .policy_name = "dummy", .policy_description = "dummy scheduling strategy" }; \endcode The idea is that when a task becomes ready for execution, the starpu_sched_policy::push_task method is called. When a worker is idle, the starpu_sched_policy::pop_task method is called to get a task. It is up to the scheduler to implement what is between. A simple eager scheduler is for instance to make starpu_sched_policy::push_task push the task to a global list, and make starpu_sched_policy::pop_task pop from that list. The \ref starpu_sched_policy section provides the exact rules that govern the methods of the policy. Make sure to have a look at the \ref API_Scheduling_Policy section, which provides a list of the available functions for writing advanced schedulers, such as starpu_task_expected_length(), starpu_task_expected_data_transfer_time(), starpu_task_expected_energy(), etc. Other useful functions include starpu_transfer_bandwidth(), starpu_transfer_latency(), starpu_transfer_predict(), ... Usual functions can also be used on tasks, for instance one can do \code{.c} size = 0; write = 0; if (task->cl) for (i = 0; i < STARPU_TASK_GET_NBUFFERS(task); i++) { starpu_data_handle_t data = STARPU_TASK_GET_HANDLE(task, i) size_t datasize = starpu_data_get_size(data); size += datasize; if (STARPU_TASK_GET_MODE(task, i) & STARPU_W) write += datasize; } \endcode And various queues can be used in schedulers. A variety of examples of schedulers can be read in src/sched_policies, for instance random_policy.c, eager_central_policy.c, work_stealing_policy.c \section GraphScheduling Graph-based Scheduling For performance reasons, most of the schedulers shipped with StarPU use simple list-scheduling heuristics, assuming that the application has already set priorities. That is why they do their scheduling between when tasks become available for execution and when a worker becomes idle, without looking at the task graph. Other heuristics can however look at the task graph. Recording the task graph is expensive, so it is not available by default, the scheduling heuristic has to set _starpu_graph_record to 1 from the initialization function, to make it available. Then the _starpu_graph* functions can be used. src/sched_policies/graph_test_policy.c is an example of simple greedy policy which automatically computes priorities by bottom-up rank. The idea is that while the application submits tasks, they are only pushed to a bag of tasks. When the application is finished with submitting tasks, it calls starpu_do_schedule() (or starpu_task_wait_for_all(), which calls starpu_do_schedule()), and the starpu_sched_policy::do_schedule method of the scheduler is called. This method calls _starpu_graph_compute_depths to compute the bottom-up ranks, and then uses these rank to set priorities over tasks. It then has two priority queues, one for CPUs, and one for GPUs, and uses a dumb heuristic based on the duration of the task over CPUs and GPUs to decide between the two queues. CPU workers can then pop from the CPU priority queue, and GPU workers from the GPU priority queue. \section DebuggingScheduling Debugging Scheduling All the \ref OnlinePerformanceTools and \ref OfflinePerformanceTools can be used to get information about how well the execution proceeded, and thus the overall quality of the execution. Precise debugging can also be performed by using the \ref STARPU_TASK_BREAK_ON_PUSH, \ref STARPU_TASK_BREAK_ON_SCHED, \ref STARPU_TASK_BREAK_ON_POP, and \ref STARPU_TASK_BREAK_ON_EXEC environment variables. By setting the job_id of a task in these environment variables, StarPU will raise SIGTRAP when the task is being scheduled, pushed, or popped by the scheduler. That means that when one notices that a task is being scheduled in a seemingly odd way, one can just reexecute the application in a debugger, with some of those variables set, and the execution will stop exactly at the scheduling points of that task, thus allowing to inspect the scheduler state, etc. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/330_scheduling_contexts.doxy000066400000000000000000000143321320135501600253520ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. // * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \page SchedulingContexts Scheduling Contexts TODO: improve! \section GeneralIdeas General Ideas Scheduling contexts represent abstracts sets of workers that allow the programmers to control the distribution of computational resources (i.e. CPUs and GPUs) to concurrent parallel kernels. The main goal is to minimize interferences between the execution of multiple parallel kernels, by partitioning the underlying pool of workers using contexts. \section CreatingAContext Creating A Context By default, the application submits tasks to an initial context, which disposes of all the computation resources available to StarPU (all the workers). If the application programmer plans to launch several parallel kernels simultaneously, by default these kernels will be executed within this initial context, using a single scheduler policy(see \ref TaskSchedulingPolicy). Meanwhile, if the application programmer is aware of the demands of these kernels and of the specificity of the machine used to execute them, the workers can be divided between several contexts. These scheduling contexts will isolate the execution of each kernel and they will permit the use of a scheduling policy proper to each one of them. Scheduling Contexts may be created in two ways: either the programmers indicates the set of workers corresponding to each context (providing he knows the identifiers of the workers running within StarPU), or the programmer does not provide any worker list and leaves the Hypervisor assign workers to each context according to their needs (\ref SchedulingContextHypervisor) Both cases require a call to the function starpu_sched_ctx_create(), which requires as input the worker list (the exact list or a NULL pointer) and the scheduling policy. The latter one can be a character list corresponding to the name of a StarPU predefined policy or the pointer to a custom policy. The function returns an identifier of the context created which you will use to indicate the context you want to submit the tasks to. \code{.c} /* the list of resources the context will manage */ int workerids[3] = {1, 3, 10}; /* indicate the scheduling policy to be used within the context, the list of workers assigned to it, the number of workers, the name of the context */ int id_ctx = starpu_sched_ctx_create("dmda", workerids, 3, "my_ctx"); /* let StarPU know that the following tasks will be submitted to this context */ starpu_sched_ctx_set_task_context(id); /* submit the task to StarPU */ starpu_task_submit(task); \endcode Note: Parallel greedy and parallel heft scheduling policies do not support the existence of several disjoint contexts on the machine. Combined workers are constructed depending on the entire topology of the machine, not only the one belonging to a context. \section ModifyingAContext Modifying A Context A scheduling context can be modified dynamically. The application may change its requirements during the execution and the programmer can add additional workers to a context or remove if no longer needed. In the following example we have two scheduling contexts sched_ctx1 and sched_ctx2. After executing a part of the tasks some of the workers of sched_ctx1 will be moved to context sched_ctx2. \code{.c} /* the list of ressources that context 1 will give away */ int workerids[3] = {1, 3, 10}; /* add the workers to context 1 */ starpu_sched_ctx_add_workers(workerids, 3, sched_ctx2); /* remove the workers from context 2 */ starpu_sched_ctx_remove_workers(workerids, 3, sched_ctx1); \endcode \section SubmittingTasksToAContext Submitting Tasks To A Context The application may submit tasks to several contexts either simultaneously or sequnetially. If several threads of submission are used the function starpu_sched_ctx_set_context() may be called just before starpu_task_submit(). Thus StarPU considers that the current thread will submit tasks to the coresponding context. When the application may not assign a thread of submission to each context, the id of the context must be indicated by using the function starpu_task_submit_to_ctx() or the field \ref STARPU_SCHED_CTX for starpu_task_insert(). \section DeletingAContext Deleting A Context When a context is no longer needed it must be deleted. The application can indicate which context should keep the resources of a deleted one. All the tasks of the context should be executed before doing this. Thus, the programmer may use either a barrier and then delete the context directly, or just indicate that other tasks will not be submitted later on to the context (such that when the last task is executed its workers will be moved to the inheritor) and delete the context at the end of the execution (when a barrier will be used eventually). \code{.c} /* when the context 2 is deleted context 1 inherits its resources */ starpu_sched_ctx_set_inheritor(sched_ctx2, sched_ctx1); /* submit tasks to context 2 */ for (i = 0; i < ntasks; i++) starpu_task_submit_to_ctx(task[i],sched_ctx2); /* indicate that context 2 finished submitting and that */ /* as soon as the last task of context 2 finished executing */ /* its workers can be moved to the inheritor context */ starpu_sched_ctx_finished_submit(sched_ctx1); /* wait for the tasks of both contexts to finish */ starpu_task_wait_for_all(); /* delete context 2 */ starpu_sched_ctx_delete(sched_ctx2); /* delete context 1 */ starpu_sched_ctx_delete(sched_ctx1); \endcode \section EmptyingAContext Emptying A Context A context may have no resources at the begining or at a certain moment of the execution. Task can still be submitted to these contexts and they will be executed as soon as the contexts will have resources. A list of tasks pending to be executed is kept and when workers are added to the contexts these tasks start being submitted. However, if resources are never allocated to the context the program will not terminate. If these tasks have low priority the programmer can forbid the application to submit them by calling the function starpu_sched_ctx_stop_task_submission(). */ starpu-1.2.3+dfsg/doc/doxygen/chapters/340_scheduling_context_hypervisor.doxy000066400000000000000000000224661320135501600274710ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \page SchedulingContextHypervisor Scheduling Context Hypervisor \section WhatIsTheHypervisor What Is The Hypervisor StarPU proposes a platform to construct Scheduling Contexts, to delete and modify them dynamically. A parallel kernel, can thus be isolated into a scheduling context and interferences between several parallel kernels are avoided. If users know exactly how many workers each scheduling context needs, they can assign them to the contexts at their creation time or modify them during the execution of the program. The Scheduling Context Hypervisor Plugin is available for users who do not dispose of a regular parallelism, who cannot know in advance the exact size of the context and need to resize the contexts according to the behavior of the parallel kernels. The Hypervisor receives information from StarPU concerning the execution of the tasks, the efficiency of the resources, etc. and it decides accordingly when and how the contexts can be resized. Basic strategies of resizing scheduling contexts already exist but a platform for implementing additional custom ones is available. \section StartTheHypervisor Start the Hypervisor The Hypervisor must be initialized once at the beginning of the application. At this point a resizing policy should be indicated. This strategy depends on the information the application is able to provide to the hypervisor as well as on the accuracy needed for the resizing procedure. For example, the application may be able to provide an estimation of the workload of the contexts. In this situation the hypervisor may decide what resources the contexts need. However, if no information is provided the hypervisor evaluates the behavior of the resources and of the application and makes a guess about the future. The hypervisor resizes only the registered contexts. \section InterrogateTheRuntime Interrogate The Runtime The runtime provides the hypervisor with information concerning the behavior of the resources and the application. This is done by using the performance_counters which represent callbacks indicating when the resources are idle or not efficient, when the application submits tasks or when it becomes to slow. \section TriggerTheHypervisor Trigger the Hypervisor The resizing is triggered either when the application requires it (sc_hypervisor_resize_ctxs()) or when the initials distribution of resources alters the performance of the application (the application is to slow or the resource are idle for too long time). If the environment variable \ref SC_HYPERVISOR_TRIGGER_RESIZE is set to speed the monitored speed of the contexts is compared to a theoretical value computed with a linear program, and the resizing is triggered whenever the two values do not correspond. Otherwise, if the environment variable is set to idle the hypervisor triggers the resizing algorithm whenever the workers are idle for a period longer than the threshold indicated by the programmer. When this happens different resizing strategy are applied that target minimizing the total execution of the application, the instant speed or the idle time of the resources. \section ResizingStrategies Resizing Strategies The plugin proposes several strategies for resizing the scheduling context. The Application driven strategy uses users's input concerning the moment when they want to resize the contexts. Thus, users tag the task that should trigger the resizing process. One can set directly the field starpu_task::hypervisor_tag or use the macro ::STARPU_HYPERVISOR_TAG in the function starpu_task_insert(). \code{.c} task.hypervisor_tag = 2; \endcode or \code{.c} starpu_task_insert(&codelet, ..., STARPU_HYPERVISOR_TAG, 2, 0); \endcode Then users have to indicate that when a task with the specified tag is executed the contexts should resize. \code{.c} sc_hypervisor_resize(sched_ctx, 2); \endcode Users can use the same tag to change the resizing configuration of the contexts if they consider it necessary. \code{.c} sc_hypervisor_ctl(sched_ctx, SC_HYPERVISOR_MIN_WORKERS, 6, SC_HYPERVISOR_MAX_WORKERS, 12, SC_HYPERVISOR_TIME_TO_APPLY, 2, NULL); \endcode The Idleness based strategy moves workers unused in a certain context to another one needing them. (see \ref API_SC_Hypervisor_usage) \code{.c} int workerids[3] = {1, 3, 10}; int workerids2[9] = {0, 2, 4, 5, 6, 7, 8, 9, 11}; sc_hypervisor_ctl(sched_ctx_id, SC_HYPERVISOR_MAX_IDLE, workerids, 3, 10000.0, SC_HYPERVISOR_MAX_IDLE, workerids2, 9, 50000.0, NULL); \endcode The Gflops rate based strategy resizes the scheduling contexts such that they all finish at the same time. The speed of each of them is computed and once one of them is significantly slower the resizing process is triggered. In order to do these computations users have to input the total number of instructions needed to be executed by the parallel kernels and the number of instruction to be executed by each task. The number of flops to be executed by a context are passed as parameter when they are registered to the hypervisor, \code{.c} sc_hypervisor_register_ctx(sched_ctx_id, flops) \endcode and the one to be executed by each task are passed when the task is submitted. The corresponding field is starpu_task::flops and the corresponding macro in the function starpu_task_insert() is ::STARPU_FLOPS (Caution: but take care of passing a double, not an integer, otherwise parameter passing will be bogus). When the task is executed the resizing process is triggered. \code{.c} task.flops = 100; \endcode or \code{.c} starpu_task_insert(&codelet, ..., STARPU_FLOPS, (double) 100, 0); \endcode The Feft strategy uses a linear program to predict the best distribution of resources such that the application finishes in a minimum amount of time. As for the Gflops rate strategy the programmers has to indicate the total number of flops to be executed when registering the context. This number of flops may be updated dynamically during the execution of the application whenever this information is not very accurate from the beginning. The function sc_hypervisor_update_diff_total_flops() is called in order to add or to remove a difference to the flops left to be executed. Tasks are provided also the number of flops corresponding to each one of them. During the execution of the application the hypervisor monitors the consumed flops and recomputes the time left and the number of resources to use. The speed of each type of resource is (re)evaluated and inserter in the linear program in order to better adapt to the needs of the application. The Teft strategy uses a linear program too, that considers all the types of tasks and the number of each of them and it tries to allocates resources such that the application finishes in a minimum amount of time. A previous calibration of StarPU would be useful in order to have good predictions of the execution time of each type of task. The types of tasks may be determines directly by the hypervisor when they are submitted. However there are applications that do not expose all the graph of tasks from the beginning. In this case in order to let the hypervisor know about all the tasks the function sc_hypervisor_set_type_of_task() will just inform the hypervisor about future tasks without submitting them right away. The Ispeed strategy divides the execution of the application in several frames. For each frame the hypervisor computes the speed of the contexts and tries making them run at the same speed. The strategy requires less contribution from users as the hypervisor requires only the size of the frame in terms of flops. \code{.c} int workerids[3] = {1, 3, 10}; int workerids2[9] = {0, 2, 4, 5, 6, 7, 8, 9, 11}; sc_hypervisor_ctl(sched_ctx_id, SC_HYPERVISOR_ISPEED_W_SAMPLE, workerids, 3, 2000000000.0, SC_HYPERVISOR_ISPEED_W_SAMPLE, workerids2, 9, 200000000000.0, SC_HYPERVISOR_ISPEED_CTX_SAMPLE, 60000000000.0, NULL); \endcode The Throughput strategy focuses on maximizing the throughput of the resources and resizes the contexts such that the machine is running at its maximum efficiency (maximum instant speed of the workers). \section DefiningANewHypervisorPolicy Defining A New Hypervisor Policy While Scheduling Context Hypervisor Plugin comes with a variety of resizing policies (see \ref ResizingStrategies), it may sometimes be desirable to implement custom policies to address specific problems. The API described below allows users to write their own resizing policy. Here an example of how to define a new policy \code{.c} struct sc_hypervisor_policy dummy_policy = { .handle_poped_task = dummy_handle_poped_task, .handle_pushed_task = dummy_handle_pushed_task, .handle_idle_cycle = dummy_handle_idle_cycle, .handle_idle_end = dummy_handle_idle_end, .handle_post_exec_hook = dummy_handle_post_exec_hook, .custom = 1, .name = "dummy" }; \endcode */ starpu-1.2.3+dfsg/doc/doxygen/chapters/350_modularized_scheduler.doxy000066400000000000000000000350601320135501600256560ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2013 Simon Archipoff * Copyright (C) 2013 INRIA * See the file version.doxy for copying conditions. */ /*! \page ModularizedScheduler Modularized Schedulers \section Introduction StarPU's Modularized Schedulers are made of individual Scheduling Components Modularizedly assembled as a Scheduling Tree. Each Scheduling Component has an unique purpose, such as prioritizing tasks or mapping tasks over resources. A typical Scheduling Tree is shown below.
                                  |
              starpu_push_task    |
                                  |
                                  v
                            Fifo_Component
                                |  ^
                                |  |
                                v  |
                           Eager_Component
                                |  ^
                                |  |
                                v  |
                 --------><--------------><--------
                 |  ^                          |  ^
                 |  |                          |  |
                 v  |                          v  |
             Fifo_Component                 Fifo_Component
                 |  ^                          |  ^
                 |  |                          |  |
                 v  |                          v  |
            Worker_Component               Worker_Component
When a task is pushed by StarPU in a Modularized Scheduler, the task moves from a Scheduling Component to an other, following the hierarchy of the Scheduling Tree, and is stored in one of the Scheduling Components of the strategy. When a worker wants to pop a task from the Modularized Scheduler, the corresponding Worker Component of the Scheduling Tree tries to pull a task from its parents, following the hierarchy, and gives it to the worker if it succeded to get one. \section UsingModularizedSchedulers Using Modularized Schedulers \subsection ExistingModularizedSchedulers Existing Modularized Schedulers StarPU is currently shipped with the following pre-defined Modularized Schedulers : - Eager-based Schedulers (with/without prefetching) : \n Naive scheduler, which tries to map a task on the first available resource it finds. - Prio-based Schedulers (with/without prefetching) : \n Similar to Eager-Based Schedulers. Can handle tasks which have a defined priority and schedule them accordingly. - Random-based Schedulers (with/without prefetching) : \n Selects randomly a resource to be mapped on for each task. - HEFT Scheduler : \n Heterogeneous Earliest Finish Time Scheduler. This scheduler needs that every task submitted to StarPU have a defined performance model (\ref PerformanceModelCalibration) to work efficiently, but can handle tasks without a performance model. To use one of these schedulers, one can set the environment variable \ref STARPU_SCHED. All modularized schedulers are named following the RE tree-* \subsection ExampleTreeEagerPrefetchingStrategy An Example : The Tree-Eager-Prefetching Strategy
                                 |
             starpu_push_task    |
                                 |
                                 v
                           Fifo_Component
                                |  ^
                        Push    |  |    Can_Push
                                v  |
                          Eager_Component
                                |  ^
                                |  |
                                v  |
              --------><-------------------><---------
              |  ^                                |  ^
      Push    |  |    Can_Push            Push    |  |    Can_Push
              v  |                                v  |
         Fifo_Component                       Fifo_Component
              |  ^                                |  ^
      Pull    |  |    Can_Pull            Pull    |  |    Can_Pull
              v  |                                v  |
        Worker_Component                     Worker_Component
\subsection Interface Each Scheduling Component must follow the following pre-defined Interface to be able to interact with other Scheduling Components. - Push (Caller_Component, Child_Component, Task) \n The calling Scheduling Component transfers a task to its Child Component. When the Push function returns, the task no longer belongs to the calling Component. The Modularized Schedulers' model relies on this function to perform prefetching. See starpu_sched_component::push_task for more details - Pull (Caller_Component, Parent_Component) -> Task \n The calling Scheduling Component requests a task from its Parent Component. When the Pull function ends, the returned task belongs to the calling Component. See starpu_sched_component::pull_task for more details - Can_Push (Caller_Component, Parent_Component) \n The calling Scheduling Component notifies its Parent Component that it is ready to accept new tasks. See starpu_sched_component::can_push for more details - Can_Pull (Caller_Component, Child_Component) \n The calling Scheduling Component notifies its Child Component that it is ready to give new tasks. See starpu_sched_component::can_pull for more details \section BuildAModularizedScheduler Building a Modularized Scheduler \subsection PreImplementedComponents Pre-implemented Components StarPU is currently shipped with the following four Scheduling Components : - Flow-control Components : Fifo, Prio \n Components which store tasks. They can also prioritize them if they have a defined priority. It is possible to define a threshold for those Components following two criterias : the number of tasks stored in the Component, or the sum of the expected length of all tasks stored in the Component. - Resource-Mapping Components : Mct, Heft, Eager, Random, Work-Stealing \n "Core" of the Scheduling Strategy, those Components are the ones who make scheduling choices. - Worker Components : Worker \n Each Worker Component modelize a concrete worker. - Special-Purpose Components : Perfmodel_Select, Best_Implementation \n Components dedicated to original purposes. The Perfmodel_Select Component decides which Resource-Mapping Component should be used to schedule a task. The Best_Implementation Component chooses which implementation of a task should be used on the choosen resource. \subsection ProgressionAndValidationRules Progression And Validation Rules Some rules must be followed to ensure the correctness of a Modularized Scheduler : - At least one Flow-control Component without threshold per Worker Component is needed in a Modularized Scheduler, to store incoming tasks from StarPU and to give tasks to Worker Components who asks for it. It is possible to use one Flow-control Component per Worker Component, or one for all Worker Components, depending on how the Scheduling Tree is defined. - At least one Resource-Mapping Component is needed in a Modularized Scheduler. Resource-Mapping Components are the only ones who can make scheduling choices, and so the only ones who can have several child. \subsection ImplementAModularizedScheduler Implementing a Modularized Scheduler The following code shows how the Tree-Eager-Prefetching Scheduler shown in Section \ref ExampleTreeEagerPrefetchingStrategy is implemented : \code{.c} #define _STARPU_SCHED_NTASKS_THRESHOLD_DEFAULT 2 #define _STARPU_SCHED_EXP_LEN_THRESHOLD_DEFAULT 1000000000.0 static void initialize_eager_prefetching_center_policy(unsigned sched_ctx_id) { unsigned ntasks_threshold = _STARPU_SCHED_NTASKS_THRESHOLD_DEFAULT; double exp_len_threshold = _STARPU_SCHED_EXP_LEN_THRESHOLD_DEFAULT; [...] starpu_sched_ctx_create_worker_collection (sched_ctx_id, STARPU_WORKER_LIST); /* Create the Scheduling Tree */ struct starpu_sched_tree * t = starpu_sched_tree_create(sched_ctx_id); /* The Root Component is a Flow-control Fifo Component */ t->root = starpu_sched_component_fifo_create(NULL); /* The Resource-mapping Component of the strategy is an Eager Component */ struct starpu_sched_component * eager_component = starpu_sched_component_eager_create(NULL); /* Create links between Components : the Eager Component is the child * of the Root Component */ t->root->add_child (t->root, eager_component); eager_component->add_father (eager_component, t->root); /* A task threshold is set for the Flow-control Components which will * be connected to Worker Components. By doing so, this Modularized * Scheduler will be able to perform some prefetching on the resources */ struct starpu_sched_component_fifo_data fifo_data = { .ntasks_threshold = ntasks_threshold, .exp_len_threshold = exp_len_threshold, }; unsigned i; for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++) { /* Each Worker Component has a Flow-control Fifo Component as * father */ struct starpu_sched_component * worker_component = starpu_sched_component_worker_get(i); struct starpu_sched_component * fifo_component = starpu_sched_component_fifo_create(&fifo_data); fifo_component->add_child (fifo_component, worker_component); worker_component->add_father (worker_component, fifo_component); /* Each Flow-control Fifo Component associated to a Worker * Component is linked to the Eager Component as one of its * children */ eager_component->add_child (eager_component, fifo_component); fifo_component->add_father (fifo_component, eager_component); } starpu_sched_tree_update_workers(t); starpu_sched_ctx_set_policy_data (sched_ctx_id, (void*)t); } /* Properly destroy the Scheduling Tree and all its Components */ static void deinitialize_eager_prefetching_center_policy(unsigned sched_ctx_id) { struct starpu_sched_tree * tree = (struct starpu_sched_tree*)starpu_sched_ctx_get_policy_data(sched_ctx_id); starpu_sched_tree_destroy(tree); starpu_sched_ctx_delete_worker_collection (sched_ctx_id); } /* Initializing the starpu_sched_policy struct associated to the Modularized * Scheduler : only the init_sched and deinit_sched needs to be defined to * implement a Modularized Scheduler */ struct starpu_sched_policy _starpu_sched_tree_eager_prefetching_policy = { .init_sched = initialize_eager_prefetching_center_policy, .deinit_sched = deinitialize_eager_prefetching_center_policy, .add_workers = starpu_sched_tree_add_workers, .remove_workers = starpu_sched_tree_remove_workers, .push_task = starpu_sched_tree_push_task, .pop_task = starpu_sched_tree_pop_task, .pre_exec_hook = starpu_sched_component_worker_pre_exec_hook, .post_exec_hook = starpu_sched_component_worker_post_exec_hook, .pop_every_task = NULL, .policy_name = "tree-eager-prefetching", .policy_description = "eager with prefetching tree policy" }; \endcode \section WriteASchedulingComponent Writing a Scheduling Component \subsection GenericSchedulingComponent Generic Scheduling Component Each Scheduling Component is instantiated from a Generic Scheduling Component, which implements a generic version of the Interface. The generic implementation of Pull, Can_Pull and Can_Push functions are recursive calls to their parents (respectively to their children). However, as a Generic Scheduling Component do not know how much children it will have when it will be instantiated, it does not implement the Push function. \subsection InstantiationRedefineInterface Instantiation : Redefining the Interface A Scheduling Component must implement all the functions of the Interface. It is so necessary to implement a Push function to instantiate a Scheduling Component. The implemented Push function is the "fingerprint" of a Scheduling Component. Depending on how functionalities or properties the programmer wants to give to the Scheduling Component he is implementing, it is possible to reimplement all the functions of the Interface. For example, a Flow-control Component reimplements the Pull and the Can_Push functions of the Interface, allowing him to catch the generic recursive calls of these functions. The Pull function of a Flow-control Component can, for example, pop a task from the local storage queue of the Component, and give it to the calling Component which asks for it. \subsection DetailedProgressionAndValidationRules Detailed Progression and Validation Rules - A Reservoir is a Scheduling Component which redefines a Push and a Pull function, in order to store tasks into it. A Reservoir delimit Scheduling Areas in the Scheduling Tree. - A Pump is the engine source of the Scheduler : it pushes/pulls tasks to/from a Scheduling Component to an other. Native Pumps of a Scheduling Tree are located at the root of the Tree (incoming Push calls from StarPU), and at the leafs of the Tree (Pop calls coming from StarPU Workers). Pre-implemented Scheduling Components currently shipped with Pumps are Flow-Control Components and the Resource-Mapping Component Heft, within their defined Can_Push functions. - A correct Scheduling Tree requires a Pump per Scheduling Area and per Execution Flow. The Tree-Eager-Prefetching Scheduler shown in Section \ref ExampleTreeEagerPrefetchingStrategy follows the previous assumptions :
                                  starpu_push_task
                                       Pump
                                         |
 Area 1                                  |
                                         |
                                         v
            -----------------------Fifo_Component-----------------------------
                                       Pump
                                        |  ^
                                Push    |  |    Can_Push
                                        v  |
 Area 2                           Eager_Component
                                        |  ^
                                        |  |
                                        v  |
                      --------><-------------------><---------
                      |  ^                                |  ^
              Push    |  |    Can_Push            Push    |  |    Can_Push
                      v  |                                v  |
            -----Fifo_Component-----------------------Fifo_Component----------
                      |  ^                                |  ^
              Pull    |  |    Can_Pull            Pull    |  |    Can_Pull
 Area 3               v  |                                v  |
                     Pump                               Pump
                Worker_Component                     Worker_Component
*/ starpu-1.2.3+dfsg/doc/doxygen/chapters/360_debugging_tools.doxy000066400000000000000000000107031320135501600244520ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \page DebuggingTools Debugging Tools StarPU provides several tools to help debugging applications. Execution traces can be generated and displayed graphically, see \ref GeneratingTracesWithFxT. \section DebuggingInGeneral TroubleShooting In General Generally-speaking, if you have troubles, pass \ref enable-debug "--enable-debug" to ./configure to enable some checks which impact performance, but will catch common issues, possibly earlier than the actual problem you are observing, which may just be a consequence of a bug that happened earlier. Also, make sure not to have the \ref enable-fast "--enable-fast" option which drops very useful catchup assertions. If your program is valgrind-safe, you can use it, see \ref UsingOtherDebugger. Depending on your toolchain, it might happen that you get undefined reference to `__stack_chk_guard' errors. In that case, use the --disable-fstack-protector-all option to avoid the issue. Then, if your program crashes with an assertion error, a segfault, etc. you can send us the result of \verbatim thread apply all bt \endverbatim run in gdb at the point of the crash. In case your program just hangs, but it may also be useful in case of a crash too, it helps to source gdbinit as described in the next section to be able to run and send us the output of the following commands: \verbatim starpu-workers starpu-tasks starpu-print-requests starpu-print-prequests starpu-print-frrequests starpu-print-irrequests \endverbatim To give us an idea of what is happening within StarPU. If the outputs are not too long, you can even run \verbatim starpu-all-tasks starpu-print-all-tasks starpu-print-datas-summary starpu-print-datas \endverbatim \section UsingGdb Using The Gdb Debugger Some gdb helpers are provided to show the whole StarPU state: \verbatim (gdb) source tools/gdbinit (gdb) help starpu \endverbatim For instance,
  • one can print all tasks with starpu-print-all-tasks,
  • print all datas with starpu-print-datas,
  • print all pending data transfers with starpu-print-prequests, starpu-print-requests, starpu-print-frequests, starpu-print-irequests,
  • print pending MPI requests with starpu-mpi-print-detached-requests
Some functions can only work if \ref enable-debug "--enable-debug" was passed to ./configure (because they impact performance) \section UsingOtherDebugger Using Other Debugging Tools Valgrind can be used on StarPU: valgrind.h just needs to be found at ./configure time, to tell valgrind about some known false positives and disable host memory pinning. Other known false positives can be suppressed by giving the suppression files in tools/valgrind/*.suppr to valgrind's --suppressions option. The environment variable \ref STARPU_DISABLE_KERNELS can also be set to 1 to make StarPU does everything (schedule tasks, transfer memory, etc.) except actually calling the application-provided kernel functions, i.e. the computation will not happen. This permits to quickly check that the task scheme is working properly. \section UsingTheTemanejoTaskDebugger Using The Temanejo Task Debugger StarPU can connect to Temanejo >= 1.0rc2 (see http://www.hlrs.de/temanejo), to permit nice visual task debugging. To do so, build Temanejo's libayudame.so, install Ayudame.h to e.g. /usr/local/include, apply the tools/patch-ayudame to it to fix C build, re-./configure, make sure that it found it, rebuild StarPU. Run the Temanejo GUI, give it the path to your application, any options you want to pass it, the path to libayudame.so. It permits to visualize the task graph, add breakpoints, continue execution task-by-task, and run gdb on a given task, etc. \image html temanejo.png \image latex temanejo.png "" width=\textwidth Make sure to specify at least the same number of CPUs in the dialog box as your machine has, otherwise an error will happen during execution. Future versions of Temanejo should be able to tell StarPU the number of CPUs to use. Tag numbers have to be below 4000000000000000000ULL to be usable for Temanejo (so as to distinguish them from tasks). */ starpu-1.2.3+dfsg/doc/doxygen/chapters/370_online_performance_tools.doxy000066400000000000000000000531761320135501600264000ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016, 2017 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \page OnlinePerformanceTools Online Performance Tools \section On-linePerformanceFeedback On-line Performance Feedback \subsection EnablingOn-linePerformanceMonitoring Enabling On-line Performance Monitoring In order to enable online performance monitoring, the application can call starpu_profiling_status_set() with the parameter ::STARPU_PROFILING_ENABLE. It is possible to detect whether monitoring is already enabled or not by calling starpu_profiling_status_get(). Enabling monitoring also reinitialize all previously collected feedback. The environment variable \ref STARPU_PROFILING can also be set to 1 to achieve the same effect. The function starpu_profiling_init() can also be called during the execution to reinitialize performance counters and to start the profiling if the environment variable \ref STARPU_PROFILING is set to 1. Likewise, performance monitoring is stopped by calling starpu_profiling_status_set() with the parameter ::STARPU_PROFILING_DISABLE. Note that this does not reset the performance counters so that the application may consult them later on. More details about the performance monitoring API are available in \ref API_Profiling. \subsection Per-taskFeedback Per-task Feedback If profiling is enabled, a pointer to a structure starpu_profiling_task_info is put in the field starpu_task::profiling_info when a task terminates. This structure is automatically destroyed when the task structure is destroyed, either automatically or by calling starpu_task_destroy(). The structure starpu_profiling_task_info indicates the date when the task was submitted (starpu_profiling_task_info::submit_time), started (starpu_profiling_task_info::start_time), and terminated (starpu_profiling_task_info::end_time), relative to the initialization of StarPU with starpu_init(). It also specifies the identifier of the worker that has executed the task (starpu_profiling_task_info::workerid). These date are stored as timespec structures which the user may convert into micro-seconds using the helper function starpu_timing_timespec_to_us(). It it worth noting that the application may directly access this structure from the callback executed at the end of the task. The structure starpu_task associated to the callback currently being executed is indeed accessible with the function starpu_task_get_current(). \subsection Per-codeletFeedback Per-codelet Feedback The field starpu_codelet::per_worker_stats is an array of counters. The i-th entry of the array is incremented every time a task implementing the codelet is executed on the i-th worker. This array is not reinitialized when profiling is enabled or disabled. \subsection Per-workerFeedback Per-worker Feedback The second argument returned by the function starpu_profiling_worker_get_info() is a structure starpu_profiling_worker_info that gives statistics about the specified worker. This structure specifies when StarPU started collecting profiling information for that worker (starpu_profiling_worker_info::start_time), the duration of the profiling measurement interval (starpu_profiling_worker_info::total_time), the time spent executing kernels (starpu_profiling_worker_info::executing_time), the time spent sleeping because there is no task to execute at all (starpu_profiling_worker_info::sleeping_time), and the number of tasks that were executed while profiling was enabled. These values give an estimation of the proportion of time spent do real work, and the time spent either sleeping because there are not enough executable tasks or simply wasted in pure StarPU overhead. Calling starpu_profiling_worker_get_info() resets the profiling information associated to a worker. To easily display all this information, the environment variable \ref STARPU_WORKER_STATS can be set to 1 (in addition to setting \ref STARPU_PROFILING to 1). A summary will then be displayed at program termination: \verbatim Worker stats: CUDA 0.0 (4.7 GiB) 480 task(s) total: 1574.82 ms executing: 1510.72 ms sleeping: 0.00 ms overhead 64.10 ms 325.217970 GFlop/s CPU 0 22 task(s) total: 1574.82 ms executing: 1364.81 ms sleeping: 0.00 ms overhead 210.01 ms 7.512057 GFlop/s CPU 1 14 task(s) total: 1574.82 ms executing: 1500.13 ms sleeping: 0.00 ms overhead 74.69 ms 6.675853 GFlop/s CPU 2 14 task(s) total: 1574.82 ms executing: 1553.12 ms sleeping: 0.00 ms overhead 21.70 ms 7.152886 GFlop/s \endverbatim The number of GFlops is available because the starpu_task::flops field of the tasks were filled (or \ref STARPU_FLOPS used in starpu_task_insert()). When an FxT trace is generated (see \ref GeneratingTracesWithFxT), it is also possible to use the tool starpu_workers_activity (see \ref MonitoringActivity) to generate a graphic showing the evolution of these values during the time, for the different workers. \subsection Bus-relatedFeedback Bus-related Feedback // how to enable/disable performance monitoring // what kind of information do we get ? The bus speed measured by StarPU can be displayed by using the tool starpu_machine_display, for instance: \verbatim StarPU has found: 3 CUDA devices CUDA 0 (Tesla C2050 02:00.0) CUDA 1 (Tesla C2050 03:00.0) CUDA 2 (Tesla C2050 84:00.0) from to RAM to CUDA 0 to CUDA 1 to CUDA 2 RAM 0.000000 5176.530428 5176.492994 5191.710722 CUDA 0 4523.732446 0.000000 2414.074751 2417.379201 CUDA 1 4523.718152 2414.078822 0.000000 2417.375119 CUDA 2 4534.229519 2417.069025 2417.060863 0.000000 \endverbatim Statistics about the data transfers which were performed and temporal average of bandwidth usage can be obtained by setting the environment variable \ref STARPU_BUS_STATS to 1; a summary will then be displayed at program termination: \verbatim Data transfer stats: RAM 0 -> CUDA 0 319.92 MB 213.10 MB/s (transfers : 91 - avg 3.52 MB) CUDA 0 -> RAM 0 214.45 MB 142.85 MB/s (transfers : 61 - avg 3.52 MB) RAM 0 -> CUDA 1 302.34 MB 201.39 MB/s (transfers : 86 - avg 3.52 MB) CUDA 1 -> RAM 0 133.59 MB 88.99 MB/s (transfers : 38 - avg 3.52 MB) CUDA 0 -> CUDA 1 144.14 MB 96.01 MB/s (transfers : 41 - avg 3.52 MB) CUDA 1 -> CUDA 0 130.08 MB 86.64 MB/s (transfers : 37 - avg 3.52 MB) RAM 0 -> CUDA 2 312.89 MB 208.42 MB/s (transfers : 89 - avg 3.52 MB) CUDA 2 -> RAM 0 133.59 MB 88.99 MB/s (transfers : 38 - avg 3.52 MB) CUDA 0 -> CUDA 2 151.17 MB 100.69 MB/s (transfers : 43 - avg 3.52 MB) CUDA 2 -> CUDA 0 105.47 MB 70.25 MB/s (transfers : 30 - avg 3.52 MB) CUDA 1 -> CUDA 2 175.78 MB 117.09 MB/s (transfers : 50 - avg 3.52 MB) CUDA 2 -> CUDA 1 203.91 MB 135.82 MB/s (transfers : 58 - avg 3.52 MB) Total transfers: 2.27 GB \endverbatim \subsection StarPU-TopInterface StarPU-Top Interface StarPU-Top is an interface which remotely displays the on-line state of a StarPU application and permits the user to change parameters on the fly. Variables to be monitored can be registered by calling the functions starpu_top_add_data_boolean(), starpu_top_add_data_integer(), starpu_top_add_data_float(), e.g.: \code{.c} starpu_top_data *data = starpu_top_add_data_integer("mynum", 0, 100, 1); \endcode The application should then call starpu_top_init_and_wait() to give its name and wait for StarPU-Top to get a start request from the user. The name is used by StarPU-Top to quickly reload a previously-saved layout of parameter display. \code{.c} starpu_top_init_and_wait("the application"); \endcode The new values can then be provided thanks to starpu_top_update_data_boolean(), starpu_top_update_data_integer(), starpu_top_update_data_float(), e.g.: \code{.c} starpu_top_update_data_integer(data, mynum); \endcode Updateable parameters can be registered thanks to starpu_top_register_parameter_boolean(), starpu_top_register_parameter_integer(), starpu_top_register_parameter_float(), e.g.: \code{.c} float alpha; starpu_top_register_parameter_float("alpha", &alpha, 0, 10, modif_hook); \endcode modif_hook is a function which will be called when the parameter is being modified, it can for instance print the new value: \code{.c} void modif_hook(struct starpu_top_param *d) { fprintf(stderr,"%s has been modified: %f\n", d->name, alpha); } \endcode Task schedulers should notify StarPU-Top when it has decided when a task will be scheduled, so that it can show it in its Gantt chart, for instance: \code{.c} starpu_top_task_prevision(task, workerid, begin, end); \endcode Starting StarPU-Top (StarPU-Top is started via the binary starpu_top) and the application can be done in two ways:
  • The application is started by hand on some machine (and thus already waiting for the start event). In the Preference dialog of StarPU-Top, the SSH checkbox should be unchecked, and the hostname and port (default is 2011) on which the application is already running should be specified. Clicking on the connection button will thus connect to the already-running application.
  • StarPU-Top is started first, and clicking on the connection button will start the application itself (possibly on a remote machine). The SSH checkbox should be checked, and a command line provided, e.g.: \verbatim $ ssh myserver STARPU_SCHED=dmda ./application \endverbatim If port 2011 of the remote machine can not be accessed directly, an ssh port bridge should be added: \verbatim $ ssh -L 2011:localhost:2011 myserver STARPU_SCHED=dmda ./application \endverbatim and "localhost" should be used as IP Address to connect to.
\section TaskAndWorkerProfiling Task And Worker Profiling A full example showing how to use the profiling API is available in the StarPU sources in the directory examples/profiling/. \code{.c} struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->synchronous = 1; /* We will destroy the task structure by hand so that we can * query the profiling info before the task is destroyed. */ task->destroy = 0; /* Submit and wait for completion (since synchronous was set to 1) */ starpu_task_submit(task); /* The task is finished, get profiling information */ struct starpu_profiling_task_info *info = task->profiling_info; /* How much time did it take before the task started ? */ double delay += starpu_timing_timespec_delay_us(&info->submit_time, &info->start_time); /* How long was the task execution ? */ double length += starpu_timing_timespec_delay_us(&info->start_time, &info->end_time); /* We no longer need the task structure */ starpu_task_destroy(task); \endcode \code{.c} /* Display the occupancy of all workers during the test */ int worker; for (worker = 0; worker < starpu_worker_get_count(); worker++) { struct starpu_profiling_worker_info worker_info; int ret = starpu_profiling_worker_get_info(worker, &worker_info); STARPU_ASSERT(!ret); double total_time = starpu_timing_timespec_to_us(&worker_info.total_time); double executing_time = starpu_timing_timespec_to_us(&worker_info.executing_time); double sleeping_time = starpu_timing_timespec_to_us(&worker_info.sleeping_time); double overhead_time = total_time - executing_time - sleeping_time; float executing_ratio = 100.0*executing_time/total_time; float sleeping_ratio = 100.0*sleeping_time/total_time; float overhead_ratio = 100.0 - executing_ratio - sleeping_ratio; char workername[128]; starpu_worker_get_name(worker, workername, 128); fprintf(stderr, "Worker %s:\n", workername); fprintf(stderr, "\ttotal time: %.2lf ms\n", total_time*1e-3); fprintf(stderr, "\texec time: %.2lf ms (%.2f %%)\n", executing_time*1e-3, executing_ratio); fprintf(stderr, "\tblocked time: %.2lf ms (%.2f %%)\n", sleeping_time*1e-3, sleeping_ratio); fprintf(stderr, "\toverhead time: %.2lf ms (%.2f %%)\n", overhead_time*1e-3, overhead_ratio); } \endcode \section PerformanceModelExample Performance Model Example To achieve good scheduling, StarPU scheduling policies need to be able to estimate in advance the duration of a task. This is done by giving to codelets a performance model, by defining a structure starpu_perfmodel and providing its address in the field starpu_codelet::model. The fields starpu_perfmodel::symbol and starpu_perfmodel::type are mandatory, to give a name to the model, and the type of the model, since there are several kinds of performance models. For compatibility, make sure to initialize the whole structure to zero, either by using explicit memset(), or by letting the compiler implicitly do it as examplified below.
  • Measured at runtime (model type ::STARPU_HISTORY_BASED). This assumes that for a given set of data input/output sizes, the performance will always be about the same. This is very true for regular kernels on GPUs for instance (<0.1% error), and just a bit less true on CPUs (~=1% error). This also assumes that there are few different sets of data input/output sizes. StarPU will then keep record of the average time of previous executions on the various processing units, and use it as an estimation. History is done per task size, by using a hash of the input and ouput sizes as an index. It will also save it in $STARPU_HOME/.starpu/sampling/codelets for further executions, and can be observed by using the tool starpu_perfmodel_display, or drawn by using the tool starpu_perfmodel_plot (\ref PerformanceModelCalibration). The models are indexed by machine name. To share the models between machines (e.g. for a homogeneous cluster), use export STARPU_HOSTNAME=some_global_name. Measurements are only done when using a task scheduler which makes use of it, such as dmda. Measurements can also be provided explicitly by the application, by using the function starpu_perfmodel_update_history(). The following is a small code example. If e.g. the code is recompiled with other compilation options, or several variants of the code are used, the symbol string should be changed to reflect that, in order to recalibrate a new model from zero. The symbol string can even be constructed dynamically at execution time, as long as this is done before submitting any task using it. \code{.c} static struct starpu_perfmodel mult_perf_model = { .type = STARPU_HISTORY_BASED, .symbol = "mult_perf_model" }; struct starpu_codelet cl = { .cpu_funcs = { cpu_mult }, .cpu_funcs_name = { "cpu_mult" }, .nbuffers = 3, .modes = { STARPU_R, STARPU_R, STARPU_W }, /* for the scheduling policy to be able to use performance models */ .model = &mult_perf_model }; \endcode
  • Measured at runtime and refined by regression (model types ::STARPU_REGRESSION_BASED and ::STARPU_NL_REGRESSION_BASED). This still assumes performance regularity, but works with various data input sizes, by applying regression over observed execution times. ::STARPU_REGRESSION_BASED uses an a*n^b regression form, ::STARPU_NL_REGRESSION_BASED uses an a*n^b+c (more precise than ::STARPU_REGRESSION_BASED, but costs a lot more to compute). For instance, tests/perfmodels/regression_based.c uses a regression-based performance model for the function memset(). Of course, the application has to issue tasks with varying size so that the regression can be computed. StarPU will not trust the regression unless there is at least 10% difference between the minimum and maximum observed input size. It can be useful to set the environment variable \ref STARPU_CALIBRATE to 1 and run the application on varying input sizes with \ref STARPU_SCHED set to dmda scheduler, so as to feed the performance model for a variety of inputs. The application can also provide the measurements explictly by using the function starpu_perfmodel_update_history(). The tools starpu_perfmodel_display and starpu_perfmodel_plot can be used to observe how much the performance model is calibrated (\ref PerformanceModelCalibration); when their output look good, \ref STARPU_CALIBRATE can be reset to 0 to let StarPU use the resulting performance model without recording new measures, and \ref STARPU_SCHED can be set to dmda to benefit from the performance models. If the data input sizes vary a lot, it is really important to set \ref STARPU_CALIBRATE to 0, otherwise StarPU will continue adding the measures, and result with a very big performance model, which will take time a lot of time to load and save. For non-linear regression, since computing it is quite expensive, it is only done at termination of the application. This means that the first execution of the application will use only history-based performance model to perform scheduling, without using regression.
  • Provided as an estimation from the application itself (model type ::STARPU_COMMON and field starpu_perfmodel::cost_function), see for instance examples/common/blas_model.h and examples/common/blas_model.c.
  • Provided explicitly by the application (model type ::STARPU_PER_ARCH): either field starpu_perfmodel::arch_cost_function, or the fields .per_arch[arch][nimpl].cost_function have to be filled with pointers to functions which return the expected duration of the task in micro-seconds, one per architecture, see for instance tests/datawizard/locality.c
For ::STARPU_HISTORY_BASED, ::STARPU_REGRESSION_BASED, and ::STARPU_NL_REGRESSION_BASED, the dimensions of task data (both input and output) are used as an index by default. ::STARPU_HISTORY_BASED uses a CRC hash of the dimensions as an index to distinguish histories, and ::STARPU_REGRESSION_BASED and ::STARPU_NL_REGRESSION_BASED use the total size as an index for the regression. The starpu_perfmodel::size_base and starpu_perfmodel::footprint fields however permit the application to override that, when for instance some of the data do not matter for task cost (e.g. mere reference table), or when using sparse structures (in which case it is the number of non-zeros which matter), or when there is some hidden parameter such as the number of iterations, or when the application actually has a very good idea of the complexity of the algorithm, and just not the speed of the processor, etc. The example in the directory examples/pi uses this to include the number of iterations in the base size. starpu_perfmodel::size_base should be used when the variance of the actual performance is known (i.e. bigger returned value is longer execution time), and thus particularly useful for ::STARPU_REGRESSION_BASED or ::STARPU_NL_REGRESSION_BASED. starpu_perfmodel::footprint can be used when the variance of the actual performance is unknown (irregular performance behavior, etc.), and thus only useful for ::STARPU_HISTORY_BASED. starpu_task_data_footprint() can be used as a base and combined with other parameters through starpu_hash_crc32c_be() for instance. StarPU will automatically determine when the performance model is calibrated, or rather, it will assume the performance model is calibrated until the application submits a task for which the performance can not be predicted. For ::STARPU_HISTORY_BASED, StarPU will require 10 (STARPU_CALIBRATE_MINIMUM) measurements for a given size before estimating that an average can be taken as estimation for further executions with the same size. For ::STARPU_REGRESSION_BASED and ::STARPU_NL_REGRESSION_BASED, StarPU will require 10 (STARPU_CALIBRATE_MINIMUM) measurements, and that the minimum measured data size is smaller than 90% of the maximum measured data size (i.e. the measurement interval is large enough for a regression to have a meaning). Calibration can also be forced by setting the \ref STARPU_CALIBRATE environment variable to 1, or even reset by setting it to 2. How to use schedulers which can benefit from such performance model is explained in \ref TaskSchedulingPolicy. The same can be done for task energy consumption estimation, by setting the field starpu_codelet::energy_model the same way as the field starpu_codelet::model. Note: for now, the application has to give to the energy consumption performance model a name which is different from the execution time performance model. The application can request time estimations from the StarPU performance models by filling a task structure as usual without actually submitting it. The data handles can be created by calling any of the functions starpu_*_data_register with a NULL pointer and -1 node and the desired data sizes, and need to be unregistered as usual. The functions starpu_task_expected_length() and starpu_task_expected_energy() can then be called to get an estimation of the task cost on a given arch. starpu_task_footprint() can also be used to get the footprint used for indexing history-based performance models. starpu_task_destroy() needs to be called to destroy the dummy task afterwards. See tests/perfmodels/regression_based.c for an example. \section DataTrace Data trace and tasks length It is possible to get statistics about tasks length and data size by using : \verbatim $ starpu_fxt_data_trace filename [codelet1 codelet2 ... codeletn] \endverbatim Where filename is the FxT trace file and codeletX the names of the codelets you want to profile (if no names are specified, starpu_fxt_data_trace will profile them all). This will create a file, data_trace.gp which can be executed to get a .eps image of these results. On the image, each point represents a task, and each color corresponds to a codelet. \image html data_trace.png \image latex data_trace.eps "" width=\textwidth */ starpu-1.2.3+dfsg/doc/doxygen/chapters/380_offline_performance_tools.doxy000066400000000000000000000566021320135501600265340ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \page OfflinePerformanceTools Offline Performance Tools To get an idea of what is happening, a lot of performance feedback is available, detailed in this chapter. The various informations should be checked for.
  • What does the Gantt diagram look like? (see \ref CreatingAGanttDiagram)
    • If it's mostly green (tasks running in the initial context) or context specific color prevailing, then the machine is properly utilized, and perhaps the codelets are just slow. Check their performance, see \ref PerformanceOfCodelets.
    • If it's mostly purple (FetchingInput), tasks keep waiting for data transfers, do you perhaps have far more communication than computation? Did you properly use CUDA streams to make sure communication can be overlapped? Did you use data-locality aware schedulers to avoid transfers as much as possible?
    • If it's mostly red (Blocked), tasks keep waiting for dependencies, do you have enough parallelism? It might be a good idea to check what the DAG looks like (see \ref CreatingADAGWithGraphviz).
    • If only some workers are completely red (Blocked), for some reason the scheduler didn't assign tasks to them. Perhaps the performance model is bogus, check it (see \ref PerformanceOfCodelets). Do all your codelets have a performance model? When some of them don't, the schedulers switches to a greedy algorithm which thus performs badly.
You can also use the Temanejo task debugger (see \ref UsingTheTemanejoTaskDebugger) to visualize the task graph more easily. \section Off-linePerformanceFeedback Off-line Performance Feedback \subsection GeneratingTracesWithFxT Generating Traces With FxT StarPU can use the FxT library (see https://savannah.nongnu.org/projects/fkt/) to generate traces with a limited runtime overhead. You can either get a tarball: \verbatim $ wget http://download.savannah.gnu.org/releases/fkt/fxt-0.2.11.tar.gz \endverbatim or use the FxT library from CVS (autotools are required): \verbatim $ cvs -d :pserver:anonymous\@cvs.sv.gnu.org:/sources/fkt co FxT $ ./bootstrap \endverbatim Compiling and installing the FxT library in the $FXTDIR path is done following the standard procedure: \verbatim $ ./configure --prefix=$FXTDIR $ make $ make install \endverbatim In order to have StarPU to generate traces, StarPU should be configured with the option \ref with-fxt "--with-fxt" : \verbatim $ ./configure --with-fxt=$FXTDIR \endverbatim Or you can simply point the PKG_CONFIG_PATH to $FXTDIR/lib/pkgconfig and pass \ref with-fxt "--with-fxt" to ./configure When FxT is enabled, a trace is generated when StarPU is terminated by calling starpu_shutdown(). The trace is a binary file whose name has the form prof_file_XXX_YYY where XXX is the user name, and YYY is the pid of the process that used StarPU. This file is saved in the /tmp/ directory by default, or by the directory specified by the environment variable \ref STARPU_FXT_PREFIX. The additional configure option \ref enable-fxt-lock "--enable-fxt-lock" can be used to generate trace events which describes the locks behaviour during the execution. It is however very heavy and should not be used unless debugging StarPU's internal locking. The environment variable \ref STARPU_FXT_TRACE can be set to 0 to disable the generation of the prof_file_XXX_YYY file. \subsection CreatingAGanttDiagram Creating a Gantt Diagram When the FxT trace file prof_file_something has been generated, it is possible to generate a trace in the Paje format by calling: \verbatim $ starpu_fxt_tool -i /tmp/prof_file_something \endverbatim Or alternatively, setting the environment variable \ref STARPU_GENERATE_TRACE to 1 before application execution will make StarPU do it automatically at application shutdown. This will create a file paje.trace in the current directory that can be inspected with the ViTE (http://vite.gforge.inria.fr/) trace visualizing open-source tool. It is possible to open the file paje.trace with ViTE by using the following command: \verbatim $ vite paje.trace \endverbatim To get names of tasks instead of "unknown", fill the optional starpu_codelet::name, or use a performance model for them. One can also introduce user-defined events in the diagram thanks to the starpu_fxt_trace_user_event_string() function. In the MPI execution case, \ref STARPU_GENERATE_TRACE will not work as expected (each node will try to generate paje.trace, thus mixing outputs...), you have to collect the trace files from the MPI nodes, and specify them all on the command starpu_fxt_tool, for instance: \verbatim $ starpu_fxt_tool -i /tmp/prof_file_something* \endverbatim By default, all tasks are displayed using a green color. To display tasks with varying colors, pass option -c to starpu_fxt_tool. By default, the trace contains all informations. To reduce the trace size, various -no-foo options can be passed to starpu_fxt_tool, see starpu_fxt_tool --help . To identify tasks precisely, the application can set the starpu_task::tag_id field of the task (or use \ref STARPU_TAG_ONLY when using starpu_task_insert()), and the value of the tag will show up in the trace. It can also set the starpu_task::name field of the task (or use \ref STARPU_NAME) when using starpu_task_insert()), to replace in traces the name of the codelet with an arbitrarily chosen name. It can also set the iteration number, by just calling starpu_iteration_push() at the beginning of submission loops and starpu_iteration_pop() at the end of submission loops. These iteration numbers will show up in traces for all tasks submitted from there. Coordinates can also be given to data with the starpu_data_set_coordinates() or starpu_data_set_coordinates_array() function. In the trace, tasks will then be assigned the coordinates of the first data they write to. Traces can also be inspected by hand by using the tool fxt_print, for instance: \verbatim $ fxt_print -o -f /tmp/prof_file_something \endverbatim Timings are in nanoseconds (while timings as seen in ViTE are in milliseconds). \subsection CreatingADAGWithGraphviz Creating a DAG With Graphviz When the FxT trace file prof_file_something has been generated, it is possible to generate a task graph in the DOT format by calling: \verbatim $ starpu_fxt_tool -i /tmp/prof_file_something \endverbatim This will create a dag.dot file in the current directory. This file is a task graph described using the DOT language. It is possible to get a graphical output of the graph by using the graphviz library: \verbatim $ dot -Tpdf dag.dot -o output.pdf \endverbatim \subsection TraceTaskDetails Getting Task Details When the FxT trace file prof_file_something has been generated, details on the executed tasks can be retrieved by calling: \verbatim $ starpu_fxt_tool -i /tmp/prof_file_something \endverbatim This will create a tasks.rec file in the current directory. This file is in the recutils format, i.e. Field: value lines, and empty lines to separate each task. This can be used as a convenient input for various ad-hoc analysis tools. By default it only contains information about the actual execution. Performance models can be obtained by running starpu_tasks_rec_complete on it: \verbatim $ starpu_tasks_rec_complete tasks.rec tasks2.rec \endverbatim which will add EstimatedTime lines which contain the performance model-estimated time (in µs) for each worker starting from 0. Since it needs the performance models, it needs to be run the same way as the application execution, or at least with STARPU_HOSTNAME set to the hostname of the machine used for execution, to get the performance models of that machine. \subsection MonitoringActivity Monitoring Activity When the FxT trace file prof_file_something has been generated, it is possible to generate an activity trace by calling: \verbatim $ starpu_fxt_tool -i /tmp/prof_file_something \endverbatim This will create a file activity.data in the current directory. A profile of the application showing the activity of StarPU during the execution of the program can be generated: \verbatim $ starpu_workers_activity activity.data \endverbatim This will create a file named activity.eps in the current directory. This picture is composed of two parts. The first part shows the activity of the different workers. The green sections indicate which proportion of the time was spent executed kernels on the processing unit. The red sections indicate the proportion of time spent in StartPU: an important overhead may indicate that the granularity may be too low, and that bigger tasks may be appropriate to use the processing unit more efficiently. The black sections indicate that the processing unit was blocked because there was no task to process: this may indicate a lack of parallelism which may be alleviated by creating more tasks when it is possible. The second part of the picture activity.eps is a graph showing the evolution of the number of tasks available in the system during the execution. Ready tasks are shown in black, and tasks that are submitted but not schedulable yet are shown in grey. \subsection Animation Getting Modular Schedular Animation When using modular schedulers (i.e. schedulers which use a modular architecture, and whose name start with "modular-"), the command \verbatim $ starpu_fxt_tool -i /tmp/prof_file_something \endverbatim will also produce a trace.html file which can be viewed in a javascript-enabled web browser. It shows the flow of tasks between the components of the modular scheduler. \subsection LimitingScopeTrace Limiting The Scope Of The Trace For computing statistics, it is useful to limit the trace to a given portion of the time of the whole execution. This can be achieved by calling \code{.c} starpu_fxt_autostart_profiling(0) \endcode before calling starpu_init(), to prevent tracing from starting immediately. Then \code{.c} starpu_fxt_start_profiling(); \endcode and \code{.c} starpu_fxt_stop_profiling(); \endcode can be used around the portion of code to be traced. This will show up as marks in the trace, and states of workers will only show up for that portion. \section PerformanceOfCodelets Performance Of Codelets The performance model of codelets (see \ref PerformanceModelExample) can be examined by using the tool starpu_perfmodel_display: \verbatim $ starpu_perfmodel_display -l file: file: file: file: file: \endverbatim Here, the codelets of the example lu are available. We can examine the performance of the kernel 22 (in micro-seconds), which is history-based: \verbatim $ starpu_perfmodel_display -s starpu_slu_lu_model_22 performance model for cpu # hash size mean dev n 57618ab0 19660800 2.851069e+05 1.829369e+04 109 performance model for cuda_0 # hash size mean dev n 57618ab0 19660800 1.164144e+04 1.556094e+01 315 performance model for cuda_1 # hash size mean dev n 57618ab0 19660800 1.164271e+04 1.330628e+01 360 performance model for cuda_2 # hash size mean dev n 57618ab0 19660800 1.166730e+04 3.390395e+02 456 \endverbatim We can see that for the given size, over a sample of a few hundreds of execution, the GPUs are about 20 times faster than the CPUs (numbers are in us). The standard deviation is extremely low for the GPUs, and less than 10% for CPUs. This tool can also be used for regression-based performance models. It will then display the regression formula, and in the case of non-linear regression, the same performance log as for history-based performance models: \verbatim $ starpu_perfmodel_display -s non_linear_memset_regression_based performance model for cpu_impl_0 Regression : #sample = 1400 Linear: y = alpha size ^ beta alpha = 1.335973e-03 beta = 8.024020e-01 Non-Linear: y = a size ^b + c a = 5.429195e-04 b = 8.654899e-01 c = 9.009313e-01 # hash size mean stddev n a3d3725e 4096 4.763200e+00 7.650928e-01 100 870a30aa 8192 1.827970e+00 2.037181e-01 100 48e988e9 16384 2.652800e+00 1.876459e-01 100 961e65d2 32768 4.255530e+00 3.518025e-01 100 ... \endverbatim The same can also be achieved by using StarPU's library API, see \ref API_Performance_Model and notably the function starpu_perfmodel_load_symbol(). The source code of the tool starpu_perfmodel_display can be a useful example. The tool starpu_perfmodel_plot can be used to draw performance models. It writes a .gp file in the current directory, to be run with the tool gnuplot, which shows the corresponding curve. \image html starpu_non_linear_memset_regression_based.png \image latex starpu_non_linear_memset_regression_based.eps "" width=\textwidth When the field starpu_task::flops is set (or \ref STARPU_FLOPS is passed to starpu_task_insert()), starpu_perfmodel_plot can directly draw a GFlops curve, by simply adding the -f option: \verbatim $ starpu_perfmodel_plot -f -s chol_model_11 \endverbatim This will however disable displaying the regression model, for which we can not compute GFlops. \image html starpu_chol_model_11_type.png \image latex starpu_chol_model_11_type.eps "" width=\textwidth When the FxT trace file prof_file_something has been generated, it is possible to get a profiling of each codelet by calling: \verbatim $ starpu_fxt_tool -i /tmp/prof_file_something $ starpu_codelet_profile distrib.data codelet_name \endverbatim This will create profiling data files, and a distrib.data.gp file in the current directory, which draws the distribution of codelet time over the application execution, according to data input size. \image html distrib_data.png \image latex distrib_data.eps "" width=\textwidth This is also available in the tool starpu_perfmodel_plot, by passing it the fxt trace: \verbatim $ starpu_perfmodel_plot -s non_linear_memset_regression_based -i /tmp/prof_file_foo_0 \endverbatim It will produce a .gp file which contains both the performance model curves, and the profiling measurements. \image html starpu_non_linear_memset_regression_based_2.png \image latex starpu_non_linear_memset_regression_based_2.eps "" width=\textwidth If you have the statistical tool R installed, you can additionally use \verbatim $ starpu_codelet_histo_profile distrib.data \endverbatim Which will create one .pdf file per codelet and per input size, showing a histogram of the codelet execution time distribution. \image html distrib_data_histo.png \image latex distrib_data_histo.eps "" width=\textwidth \section TraceStatistics Trace Statistics More than just codelet performance, it is interesting to get statistics over all kinds of StarPU states (allocations, data transfers, etc.). This is particularly useful to check what may have gone wrong in the accurracy of the simgrid simulation. This requires the R statistical tool, with the plyr, ggplot2 and data.table packages. If your system distribution does not have packages for these, one can fetch them from CRAN: \verbatim $ R > install.packages("plyr") > install.packages("ggplot2") > install.packages("data.table") > install.packages("knitr") \endverbatim The pj_dump tool from pajeng is also needed (see https://github.com/schnorr/pajeng) One can then get textual or .csv statistics over the trace states: \verbatim $ starpu_paje_state_stats -v native.trace simgrid.trace "Value" "Events_native.csv" "Duration_native.csv" "Events_simgrid.csv" "Duration_simgrid.csv" "Callback" 220 0.075978 220 0 "chol_model_11" 10 565.176 10 572.8695 "chol_model_21" 45 9184.828 45 9170.719 "chol_model_22" 165 64712.07 165 64299.203 $ starpu_paje_state_stats native.trace simgrid.trace \endverbatim And one can plot histograms of execution times, of several states for instance: \verbatim $ starpu_paje_draw_histogram -n chol_model_11,chol_model_21,chol_model_22 native.trace simgrid.trace \endverbatim and see the resulting pdf file: \image html paje_draw_histogram.png \image latex paje_draw_histogram.eps "" width=\textwidth A quick statistical report can be generated by using: \verbatim $ starpu_paje_summary native.trace simgrid.trace \endverbatim it includes gantt charts, execution summaries, as well as state duration charts and time distribution histograms. Other external Paje analysis tools can be used on these traces, one just needs to sort the traces by timestamp order (which not guaranteed to make recording more efficient): \verbatim $ starpu_paje_sort paje.trace \endverbatim \section TheoreticalLowerBoundOnExecutionTime Theoretical Lower Bound On Execution Time StarPU can record a trace of what tasks are needed to complete the application, and then, by using a linear system, provide a theoretical lower bound of the execution time (i.e. with an ideal scheduling). The computed bound is not really correct when not taking into account dependencies, but for an application which have enough parallelism, it is very near to the bound computed with dependencies enabled (which takes a huge lot more time to compute), and thus provides a good-enough estimation of the ideal execution time. \ref TheoreticalLowerBoundOnExecutionTimeExample provides an example on how to use this. \section TheoreticalLowerBoundOnExecutionTimeExample Theoretical Lower Bound On Execution Time Example For kernels with history-based performance models (and provided that they are completely calibrated), StarPU can very easily provide a theoretical lower bound for the execution time of a whole set of tasks. See for instance examples/lu/lu_example.c: before submitting tasks, call the function starpu_bound_start(), and after complete execution, call starpu_bound_stop(). starpu_bound_print_lp() or starpu_bound_print_mps() can then be used to output a Linear Programming problem corresponding to the schedule of your tasks. Run it through lp_solve or any other linear programming solver, and that will give you a lower bound for the total execution time of your tasks. If StarPU was compiled with the library glpk installed, starpu_bound_compute() can be used to solve it immediately and get the optimized minimum, in ms. Its parameter integer allows to decide whether integer resolution should be computed and returned The deps parameter tells StarPU whether to take tasks, implicit data, and tag dependencies into account. Tags released in a callback or similar are not taken into account, only tags associated with a task are. It must be understood that the linear programming problem size is quadratic with the number of tasks and thus the time to solve it will be very long, it could be minutes for just a few dozen tasks. You should probably use lp_solve -timeout 1 test.pl -wmps test.mps to convert the problem to MPS format and then use a better solver, glpsol might be better than lp_solve for instance (the --pcost option may be useful), but sometimes doesn't manage to converge. cbc might look slower, but it is parallel. For lp_solve, be sure to try at least all the -B options. For instance, we often just use lp_solve -cc -B1 -Bb -Bg -Bp -Bf -Br -BG -Bd -Bs -BB -Bo -Bc -Bi , and the -gr option can also be quite useful. The resulting schedule can be observed by using the tool starpu_lp2paje, which converts it into the Paje format. Data transfer time can only be taken into account when deps is set. Only data transfers inferred from implicit data dependencies between tasks are taken into account. Other data transfers are assumed to be completely overlapped. Setting deps to 0 will only take into account the actual computations on processing units. It however still properly takes into account the varying performances of kernels and processing units, which is quite more accurate than just comparing StarPU performances with the fastest of the kernels being used. The prio parameter tells StarPU whether to simulate taking into account the priorities as the StarPU scheduler would, i.e. schedule prioritized tasks before less prioritized tasks, to check to which extend this results to a less optimal solution. This increases even more computation time. \section MemoryFeedback Memory Feedback It is possible to enable memory statistics. To do so, you need to pass the option \ref enable-memory-stats "--enable-memory-stats" when running configure. It is then possible to call the function starpu_data_display_memory_stats() to display statistics about the current data handles registered within StarPU. Moreover, statistics will be displayed at the end of the execution on data handles which have not been cleared out. This can be disabled by setting the environment variable \ref STARPU_MEMORY_STATS to 0. For example, if you do not unregister data at the end of the complex example, you will get something similar to: \verbatim $ STARPU_MEMORY_STATS=0 ./examples/interface/complex Complex[0] = 45.00 + 12.00 i Complex[0] = 78.00 + 78.00 i Complex[0] = 45.00 + 12.00 i Complex[0] = 45.00 + 12.00 i \endverbatim \verbatim $ STARPU_MEMORY_STATS=1 ./examples/interface/complex Complex[0] = 45.00 + 12.00 i Complex[0] = 78.00 + 78.00 i Complex[0] = 45.00 + 12.00 i Complex[0] = 45.00 + 12.00 i #--------------------- Memory stats: #------- Data on Node #3 #----- Data : 0x553ff40 Size : 16 #-- Data access stats /!\ Work Underway Node #0 Direct access : 4 Loaded (Owner) : 0 Loaded (Shared) : 0 Invalidated (was Owner) : 0 Node #3 Direct access : 0 Loaded (Owner) : 0 Loaded (Shared) : 1 Invalidated (was Owner) : 0 #----- Data : 0x5544710 Size : 16 #-- Data access stats /!\ Work Underway Node #0 Direct access : 2 Loaded (Owner) : 0 Loaded (Shared) : 1 Invalidated (was Owner) : 1 Node #3 Direct access : 0 Loaded (Owner) : 1 Loaded (Shared) : 0 Invalidated (was Owner) : 0 \endverbatim \section DataStatistics Data Statistics Different data statistics can be displayed at the end of the execution of the application. To enable them, you need to pass the option \ref enable-stats "--enable-stats" when calling configure. When calling starpu_shutdown() various statistics will be displayed, execution, MSI cache statistics, allocation cache statistics, and data transfer statistics. The display can be disabled by setting the environment variable \ref STARPU_STATS to 0. \verbatim $ ./examples/cholesky/cholesky_tag Computation took (in ms) 518.16 Synthetic GFlops : 44.21 #--------------------- MSI cache stats : TOTAL MSI stats hit 1622 (66.23 %) miss 827 (33.77 %) ... \endverbatim \verbatim $ STARPU_STATS=0 ./examples/cholesky/cholesky_tag Computation took (in ms) 518.16 Synthetic GFlops : 44.21 \endverbatim // TODO: data transfer stats are similar to the ones displayed when // setting STARPU_BUS_STATS */ starpu-1.2.3+dfsg/doc/doxygen/chapters/390_faq.doxy000066400000000000000000000274731320135501600220650ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \page FrequentlyAskedQuestions Frequently Asked Questions \section HowToInitializeAComputationLibraryOnceForEachWorker How To Initialize A Computation Library Once For Each Worker? Some libraries need to be initialized once for each concurrent instance that may run on the machine. For instance, a C++ computation class which is not thread-safe by itself, but for which several instanciated objects of that class can be used concurrently. This can be used in StarPU by initializing one such object per worker. For instance, the libstarpufft example does the following to be able to use FFTW on CPUs. Some global array stores the instanciated objects: \code{.c} fftw_plan plan_cpu[STARPU_NMAXWORKERS]; \endcode At initialisation time of libstarpu, the objects are initialized: \code{.c} int workerid; for (workerid = 0; workerid < starpu_worker_get_count(); workerid++) { switch (starpu_worker_get_type(workerid)) { case STARPU_CPU_WORKER: plan_cpu[workerid] = fftw_plan(...); break; } } \endcode And in the codelet body, they are used: \code{.c} static void fft(void *descr[], void *_args) { int workerid = starpu_worker_get_id(); fftw_plan plan = plan_cpu[workerid]; ... fftw_execute(plan, ...); } \endcode This however is not sufficient for FFT on CUDA: initialization has to be done from the workers themselves. This can be done thanks to starpu_execute_on_each_worker(). For instance libstarpufft does the following. \code{.c} static void fft_plan_gpu(void *args) { plan plan = args; int n2 = plan->n2[0]; int workerid = starpu_worker_get_id(); cufftPlan1d(&plan->plans[workerid].plan_cuda, n, _CUFFT_C2C, 1); cufftSetStream(plan->plans[workerid].plan_cuda, starpu_cuda_get_local_stream()); } void starpufft_plan(void) { starpu_execute_on_each_worker(fft_plan_gpu, plan, STARPU_CUDA); } \endcode \section UsingTheDriverAPI Using The Driver API \ref API_Running_Drivers \code{.c} int ret; struct starpu_driver = { .type = STARPU_CUDA_WORKER, .id.cuda_id = 0 }; ret = starpu_driver_init(&d); if (ret != 0) error(); while (some_condition) { ret = starpu_driver_run_once(&d); if (ret != 0) error(); } ret = starpu_driver_deinit(&d); if (ret != 0) error(); \endcode To add a new kind of device to the structure starpu_driver, one needs to:
  1. Add a member to the union starpu_driver::id
  2. Modify the internal function _starpu_launch_drivers() to make sure the driver is not always launched.
  3. Modify the function starpu_driver_run() so that it can handle another kind of architecture.
  4. Write the new function _starpu_run_foobar() in the corresponding driver.
\section On-GPURendering On-GPU Rendering Graphical-oriented applications need to draw the result of their computations, typically on the very GPU where these happened. Technologies such as OpenGL/CUDA interoperability permit to let CUDA directly work on the OpenGL buffers, making them thus immediately ready for drawing, by mapping OpenGL buffer, textures or renderbuffer objects into CUDA. CUDA however imposes some technical constraints: peer memcpy has to be disabled, and the thread that runs OpenGL has to be the one that runs CUDA computations for that GPU. To achieve this with StarPU, pass the option \ref disable-cuda-memcpy-peer "--disable-cuda-memcpy-peer" to ./configure (TODO: make it dynamic), OpenGL/GLUT has to be initialized first, and the interoperability mode has to be enabled by using the field starpu_conf::cuda_opengl_interoperability, and the driver loop has to be run by the application, by using the field starpu_conf::not_launched_drivers to prevent StarPU from running it in a separate thread, and by using starpu_driver_run() to run the loop. The examples gl_interop and gl_interop_idle show how it articulates in a simple case, where rendering is done in task callbacks. The former uses glutMainLoopEvent to make GLUT progress from the StarPU driver loop, while the latter uses glutIdleFunc to make StarPU progress from the GLUT main loop. Then, to use an OpenGL buffer as a CUDA data, StarPU simply needs to be given the CUDA pointer at registration, for instance: \code{.c} /* Get the CUDA worker id */ for (workerid = 0; workerid < starpu_worker_get_count(); workerid++) if (starpu_worker_get_type(workerid) == STARPU_CUDA_WORKER) break; /* Build a CUDA pointer pointing at the OpenGL buffer */ cudaGraphicsResourceGetMappedPointer((void**)&output, &num_bytes, resource); /* And register it to StarPU */ starpu_vector_data_register(&handle, starpu_worker_get_memory_node(workerid), output, num_bytes / sizeof(float4), sizeof(float4)); /* The handle can now be used as usual */ starpu_task_insert(&cl, STARPU_RW, handle, 0); /* ... */ /* This gets back data into the OpenGL buffer */ starpu_data_unregister(handle); \endcode and display it e.g. in the callback function. \section UsingStarPUWithMKL Using StarPU With MKL 11 (Intel Composer XE 2013) Some users had issues with MKL 11 and StarPU (versions 1.1rc1 and 1.0.5) on Linux with MKL, using 1 thread for MKL and doing all the parallelism using StarPU (no multithreaded tasks), setting the environment variable MKL_NUM_THREADS to 1, and using the threaded MKL library, with iomp5. Using this configuration, StarPU only uses 1 core, no matter the value of \ref STARPU_NCPU. The problem is actually a thread pinning issue with MKL. The solution is to set the environment variable KMP_AFFINITY to disabled (http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011Update/compiler_c/optaps/common/optaps_openmp_thread_affinity.htm). \section ThreadBindingOnNetBSD Thread Binding on NetBSD When using StarPU on a NetBSD machine, if the topology discovery library hwloc is used, thread binding will fail. To prevent the problem, you should at least use the version 1.7 of hwloc, and also issue the following call: \verbatim $ sysctl -w security.models.extensions.user_set_cpu_affinity=1 \endverbatim Or add the following line in the file /etc/sysctl.conf \verbatim security.models.extensions.user_set_cpu_affinity=1 \endverbatim \section StarPUEatsCPUs StarPU permanently eats 100% of all CPUs Yes, this is on purpose. By default, StarPU uses active polling on task queues, so as to minimize wake-up latency for better overall performance. If eating CPU time is a problem (e.g. application running on a desktop), pass option \ref enable-blocking-drivers "--enable-blocking-drivers" to ./configure. This will add some overhead when putting CPU workers to sleep or waking them, but avoid eating 100% CPU permanently. \section PauseResume Interleaving StarPU and non-StarPU code If your application only partially uses StarPU, and you do not want to call starpu_init() / starpu_shutdown() at the beginning/end of each section, StarPU workers will poll for work between the sections. To avoid this behavior, you can "pause" StarPU with the starpu_pause() function. This will prevent the StarPU workers from accepting new work (tasks that are already in progress will not be frozen), and stop them from polling for more work. Note that this does not prevent you from submitting new tasks, but they won't execute until starpu_resume() is called. Also note that StarPU must not be paused when you call starpu_shutdown(), and that this function pair works in a push/pull manner, i.e you need to match the number of calls to these functions to clear their effect. One way to use these functions could be: \code{.c} starpu_init(NULL); starpu_pause(); // To submit all the tasks without a single one executing submit_some_tasks(); starpu_resume(); // The tasks start executing starpu_task_wait_for_all(); starpu_pause(); // Stop the workers from polling // Non-StarPU code starpu_resume(); // ... starpu_shutdown(); \endcode \section GPUEatingCores When running with CUDA or OpenCL devices, I am seeing less CPU cores Yes, this is on purpose. Since GPU devices are way faster than CPUs, StarPU needs to react quickly when a task is finished, to feed the GPU with another task (StarPU actually submits a couple of tasks in advance so as to pipeline this, but filling the pipeline still has to be happening often enough), and thus it has to dedicate threads for this, and this is a very CPU-consuming duty. StarPU thus dedicates one CPU core for driving each GPU. Such dedication is also useful when a codelet is hybrid, i.e. while kernels are running on the GPU, the codelet can run some computation, which thus be run by the CPU core instead of driving the GPU. \section CUDADrivers StarPU does not see my CUDA device First make sure that CUDA is properly running outside StarPU: build and run the following program with -lcudart: \code{.c} #include #include #include int main(void) { int n, i, version; cudaError_t err; err = cudaGetDeviceCount(&n); if (err) { fprintf(stderr,"cuda error %d\n", err); exit(1); } cudaDriverGetVersion(&version); printf("driver version %d\n", version); cudaRuntimeGetVersion(&version); printf("runtime version %d\n", version); printf("\n"); for (i = 0; i < n; i++) { struct cudaDeviceProp props; printf("CUDA%d\n", i); err = cudaGetDeviceProperties(&props, i); if (err) { fprintf(stderr,"cuda error %d\n", err); continue; } printf("%s\n", props.name); printf("%0.3f GB\n", (float) props.totalGlobalMem / (1<<30)); printf("%u MP\n", props.multiProcessorCount); printf("\n"); } return 0; } \endcode If that program does not find your device, the problem is not at the StarPU level, but the CUDA drivers, check the documentation of your CUDA setup. \section OpenCLDrivers StarPU does not see my OpenCL device First make sure that OpenCL is properly running outside StarPU: build and run the following program with -lOpenCL: \code{.c} #include #include #include int main(void) { cl_device_id did[16]; cl_int err; cl_platform_id pid, pids[16]; cl_uint nbplat, nb; char buf[128]; size_t size; int i, j; err = clGetPlatformIDs(sizeof(pids)/sizeof(pids[0]), pids, &nbplat); assert(err == CL_SUCCESS); printf("%u platforms\n", nbplat); for (j = 0; j < nbplat; j++) { pid = pids[j]; printf(" platform %d\n", j); err = clGetPlatformInfo(pid, CL_PLATFORM_VERSION, sizeof(buf)-1, buf, &size); assert(err == CL_SUCCESS); buf[size] = 0; printf(" platform version %s\n", buf); err = clGetDeviceIDs(pid, CL_DEVICE_TYPE_ALL, sizeof(did)/sizeof(did[0]), did, &nb); assert(err == CL_SUCCESS); printf("%d devices\n", nb); for (i = 0; i < nb; i++) { err = clGetDeviceInfo(did[i], CL_DEVICE_VERSION, sizeof(buf)-1, buf, &size); buf[size] = 0; printf(" device %d version %s\n", i, buf); } } return 0; } \endcode If that program does not find your device, the problem is not at the StarPU level, but the OpenCL drivers, check the documentation of your OpenCL implementation. \section IncorrectPerformanceModelFile I keep getting a "Incorrect performance model file" error The performance model file, used by StarPU to record the performance of codelets, seem to have been corrupted. Perhaps a previous run of StarPU stopped abruptly, and thus could not save it properly. You can have a look at the file if you can fix it, but the simplest way is to just remove the file and run again, StarPU will just have to re-perform calibration for the corresponding codelet. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/401_out_of_core.doxy000066400000000000000000000055451320135501600236060ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2013 Corentin Salingue * See the file version.doxy for copying conditions. */ /*! \page OutOfCore Out Of Core \section Introduction Introduction When using StarPU, one may need to store more data than what the main memory (RAM) can store. This part describes the method to add a new memory node on a disk and to use it. The principle is that one first registers a disk location, seen by StarPU as a void*, which can be for instance a Unix path for the stdio, unistd or unistd_o_direct case, or a database file path for a leveldb case, etc. The disk backend opens this place with the plug method. If the disk backend provides an alloc method, StarPU can then start using it to allocate room and store data there with the write method, without user intervention. The user can also use starpu_disk_open() to explicitly open an object within the disk, e.g. a file name in the stdio or unistd cases, or a database key in the leveldb case, and then use starpu_*_register functions to turn it into a StarPU data handle. StarPU will then automatically read and write data as appropriate. \section UseANewDiskMemory Use a new disk memory To use a disk memory node, you have to register it with this function: \code{.c} int new_dd = starpu_disk_register(&starpu_disk_unistd_ops, (void *) "/tmp/", 1024*1024*200); \endcode Here, we use the unistd library to realize the read/write operations, i.e. fread/fwrite. This structure must have a path where to store files, as well as the maximum size the software can afford storing on the disk. Don't forget to check if the result is correct! This can also be achieved by just setting environment variables: \verbatim export STARPU_DISK_SWAP=/tmp export STARPU_DISK_SWAP_BACKEND=unistd export STARPU_DISK_SWAP_SIZE=200 \endverbatim The backend can be set to stdio, unistd, unistd_o_direct, or leveldb. When the register function is called, StarPU will benchmark the disk. This can take some time. Warning: the size thus has to be at least \ref STARPU_DISK_SIZE_MIN bytes ! StarPU will automatically try to evict unused data to this new disk. One can also use the standard StarPU memory node API, see the \ref API_Standard_Memory_Library and the \ref API_Data_Interfaces . The disk is unregistered during the starpu_shutdown(). \section DiskFunctions Disk functions There are various ways to operate a disk memory node, described by the structure starpu_disk_ops. For instance, the variable #starpu_disk_unistd_ops uses read/write functions. All structures are in \ref API_Out_Of_Core. \section ExampleDiskCopy Examples: disk_copy \snippet disk_copy.c To be included. You should update doxygen if you see this text. \section ExampleDiskCompute Examples: disk_compute \snippet disk_compute.c To be included. You should update doxygen if you see this text. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/410_mpi_support.doxy000066400000000000000000001034711320135501600236610ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \page MPISupport MPI Support The integration of MPI transfers within task parallelism is done in a very natural way by the means of asynchronous interactions between the application and StarPU. This is implemented in a separate libstarpumpi library which basically provides "StarPU" equivalents of MPI_* functions, where void * buffers are replaced with ::starpu_data_handle_t, and all GPU-RAM-NIC transfers are handled efficiently by StarPU-MPI. The user has to use the usual mpirun command of the MPI implementation to start StarPU on the different MPI nodes. An MPI Insert Task function provides an even more seamless transition to a distributed application, by automatically issuing all required data transfers according to the task graph and an application-provided distribution. \section ExampleDocumentation Example used in this documentation The example below will be used as the base for this documentation. It initializes a token on node 0, and the token is passed from node to node, incremented by one on each step. The code is not using StarPU yet. \code{.c} for (loop = 0; loop < nloops; loop++) { int tag = loop*size + rank; if (loop == 0 && rank == 0) { token = 0; fprintf(stdout, "Start with token value %d\n", token); } else { MPI_Recv(&token, 1, MPI_INT, (rank+size-1)%size, tag, MPI_COMM_WORLD); } token++; if (loop == last_loop && rank == last_rank) { fprintf(stdout, "Finished: token value %d\n", token); } else { MPI_Send(&token, 1, MPI_INT, (rank+1)%size, tag+1, MPI_COMM_WORLD); } } \endcode \section NotUsingMPISupport About not using the MPI support Although StarPU provides MPI support, the application programmer may want to keep his MPI communications as they are for a start, and only delegate task execution to StarPU. This is possible by just using starpu_data_acquire(), for instance: \code{.c} for (loop = 0; loop < nloops; loop++) { int tag = loop*size + rank; /* Acquire the data to be able to write to it */ starpu_data_acquire(token_handle, STARPU_W); if (loop == 0 && rank == 0) { token = 0; fprintf(stdout, "Start with token value %d\n", token); } else { MPI_Recv(&token, 1, MPI_INT, (rank+size-1)%size, tag, MPI_COMM_WORLD); } starpu_data_release(token_handle); /* Task delegation to StarPU to increment the token. The execution might * be performed on a CPU, a GPU, etc. */ increment_token(); /* Acquire the update data to be able to read from it */ starpu_data_acquire(token_handle, STARPU_R); if (loop == last_loop && rank == last_rank) { fprintf(stdout, "Finished: token value %d\n", token); } else { MPI_Send(&token, 1, MPI_INT, (rank+1)%size, tag+1, MPI_COMM_WORLD); } starpu_data_release(token_handle); } \endcode In that case, libstarpumpi is not needed. One can also use MPI_Isend() and MPI_Irecv(), by calling starpu_data_release() after MPI_Wait() or MPI_Test() have notified completion. It is however better to use libstarpumpi, to save the application from having to synchronize with starpu_data_acquire(), and instead just submit all tasks and communications asynchronously, and wait for the overall completion. \section SimpleExample Simple Example The flags required to compile or link against the MPI layer are accessible with the following commands: \verbatim $ pkg-config --cflags starpumpi-1.2 # options for the compiler $ pkg-config --libs starpumpi-1.2 # options for the linker \endverbatim \code{.c} void increment_token(void) { struct starpu_task *task = starpu_task_create(); task->cl = &increment_cl; task->handles[0] = token_handle; starpu_task_submit(task); } int main(int argc, char **argv) { int rank, size; starpu_init(NULL); starpu_mpi_init(&argc, &argv, 1); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); starpu_vector_data_register(&token_handle, STARPU_MAIN_RAM, (uintptr_t)&token, 1, sizeof(unsigned)); unsigned nloops = NITER; unsigned loop; unsigned last_loop = nloops - 1; unsigned last_rank = size - 1; for (loop = 0; loop < nloops; loop++) { int tag = loop*size + rank; if (loop == 0 && rank == 0) { starpu_data_acquire(token_handle, STARPU_W); token = 0; fprintf(stdout, "Start with token value %d\n", token); starpu_data_release(token_handle); } else { starpu_mpi_irecv_detached(token_handle, (rank+size-1)%size, tag, MPI_COMM_WORLD, NULL, NULL); } increment_token(); if (loop == last_loop && rank == last_rank) { starpu_data_acquire(token_handle, STARPU_R); fprintf(stdout, "Finished: token value %d\n", token); starpu_data_release(token_handle); } else { starpu_mpi_isend_detached(token_handle, (rank+1)%size, tag+1, MPI_COMM_WORLD, NULL, NULL); } } starpu_task_wait_for_all(); starpu_mpi_shutdown(); starpu_shutdown(); if (rank == last_rank) { fprintf(stderr, "[%d] token = %d == %d * %d ?\n", rank, token, nloops, size); STARPU_ASSERT(token == nloops*size); } \endcode We have here replaced MPI_Recv() and MPI_Send() with starpu_mpi_irecv_detached() and starpu_mpi_isend_detached(), which just submit the communication to be performed. The implicit sequential consistency dependencies provide synchronization between mpi reception and emission and the corresponding tasks. The only remaining synchronization with starpu_data_acquire() is at the beginning and the end. \section MPIInitialization How to Initialize StarPU-MPI As seen in the previous example, one has to call starpu_mpi_init() to initialize StarPU-MPI. The third parameter of the function indicates if MPI should be initialized by StarPU or if the application will do it itself. If the application initializes MPI itself, it must call MPI_Init_thread() with MPI_THREAD_SERIALIZED or MPI_THREAD_MULTIPLE, since StarPU-MPI uses a separate thread to perform the communications. MPI_THREAD_MULTIPLE is necessary if the application also performs some MPI communications. \section PointToPointCommunication Point To Point Communication The standard point to point communications of MPI have been implemented. The semantic is similar to the MPI one, but adapted to the DSM provided by StarPU. A MPI request will only be submitted when the data is available in the main memory of the node submitting the request. There are two types of asynchronous communications: the classic asynchronous communications and the detached communications. The classic asynchronous communications (starpu_mpi_isend() and starpu_mpi_irecv()) need to be followed by a call to starpu_mpi_wait() or to starpu_mpi_test() to wait for or to test the completion of the communication. Waiting for or testing the completion of detached communications is not possible, this is done internally by StarPU-MPI, on completion, the resources are automatically released. This mechanism is similar to the pthread detach state attribute which determines whether a thread will be created in a joinable or a detached state. Internally, all communication are divided in 2 communications, a first message is used to exchange an envelope describing the data (i.e its tag and its size), the data itself is sent in a second message. All MPI communications submitted by StarPU uses a unique tag which has a default value, and can be accessed with the functions starpu_mpi_get_communication_tag() and starpu_mpi_set_communication_tag(). The matching of tags with corresponding requests is done within StarPU-MPI. For any userland communication, the call of the corresponding function (e.g starpu_mpi_isend()) will result in the creation of a StarPU-MPI request, the function starpu_data_acquire_cb() is then called to asynchronously request StarPU to fetch the data in main memory; when the data is ready and the corresponding buffer has already been received by MPI, it will be copied in the memory of the data, otherwise the request is stored in the early requests list. Sending requests are stored in the ready requests list. While requests need to be processed, the StarPU-MPI progression thread does the following:
  1. it polls the ready requests list. For all the ready requests, the appropriate function is called to post the corresponding MPI call. For example, an initial call to starpu_mpi_isend() will result in a call to MPI_Isend(). If the request is marked as detached, the request will then be added in the detached requests list.
  2. it posts a MPI_Irecv() to retrieve a data envelope.
  3. it polls the detached requests list. For all the detached requests, it tests its completion of the MPI request by calling MPI_Test(). On completion, the data handle is released, and if a callback was defined, it is called.
  4. finally, it checks if a data envelope has been received. If so, if the data envelope matches a request in the early requests list (i.e the request has already been posted by the application), the corresponding MPI call is posted (similarly to the first step above). If the data envelope does not match any application request, a temporary handle is created to receive the data, a StarPU-MPI request is created and added into the ready requests list, and thus will be processed in the first step of the next loop.
\ref MPIPtpCommunication gives the list of all the point to point communications defined in StarPU-MPI. \section ExchangingUserDefinedDataInterface Exchanging User Defined Data Interface New data interfaces defined as explained in \ref DefiningANewDataInterface can also be used within StarPU-MPI and exchanged between nodes. Two functions needs to be defined through the type starpu_data_interface_ops. The function starpu_data_interface_ops::pack_data takes a handle and returns a contiguous memory buffer allocated with \code{.c} starpu_malloc_flags(ptr, size, 0) \endcode along with its size where data to be conveyed to another node should be copied. The reversed operation is implemented in the function starpu_data_interface_ops::unpack_data which takes a contiguous memory buffer and recreates the data handle. \code{.c} static int complex_pack_data(starpu_data_handle_t handle, unsigned node, void **ptr, ssize_t *count) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_complex_interface *complex_interface = (struct starpu_complex_interface *) starpu_data_get_interface_on_node(handle, node); *count = complex_get_size(handle); starpu_malloc_flags(ptr, *count, 0); memcpy(*ptr, complex_interface->real, complex_interface->nx*sizeof(double)); memcpy(*ptr+complex_interface->nx*sizeof(double), complex_interface->imaginary, complex_interface->nx*sizeof(double)); return 0; } static int complex_unpack_data(starpu_data_handle_t handle, unsigned node, void *ptr, size_t count) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_complex_interface *complex_interface = (struct starpu_complex_interface *) starpu_data_get_interface_on_node(handle, node); memcpy(complex_interface->real, ptr, complex_interface->nx*sizeof(double)); memcpy(complex_interface->imaginary, ptr+complex_interface->nx*sizeof(double), complex_interface->nx*sizeof(double)); return 0; } static struct starpu_data_interface_ops interface_complex_ops = { ... .pack_data = complex_pack_data, .unpack_data = complex_unpack_data }; \endcode Instead of defining pack and unpack operations, users may want to attach a MPI type to their user defined data interface. The function starpu_mpi_datatype_register() allows to do so. This function takes 3 parameters: the data handle for which the MPI datatype is going to be defined, a function's pointer that will create the MPI datatype, and a function's pointer that will free the MPI datatype. \code{.c} starpu_data_interface handle; starpu_complex_data_register(&handle, STARPU_MAIN_RAM, real, imaginary, 2); starpu_mpi_datatype_register(handle, starpu_complex_interface_datatype_allocate, starpu_complex_interface_datatype_free); \endcode The functions to create and free the MPI datatype are defined as follows. \code{.c} void starpu_complex_interface_datatype_allocate(starpu_data_handle_t handle, MPI_Datatype *mpi_datatype) { int ret; int blocklengths[2]; MPI_Aint displacements[2]; MPI_Datatype types[2] = {MPI_DOUBLE, MPI_DOUBLE}; struct starpu_complex_interface *complex_interface = (struct starpu_complex_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); MPI_Address(complex_interface, displacements); MPI_Address(&complex_interface->imaginary, displacements+1); displacements[1] -= displacements[0]; displacements[0] = 0; blocklengths[0] = complex_interface->nx; blocklengths[1] = complex_interface->nx; ret = MPI_Type_create_struct(2, blocklengths, displacements, types, mpi_datatype); STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_contiguous failed"); ret = MPI_Type_commit(mpi_datatype); STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_commit failed"); } void starpu_complex_interface_datatype_free(MPI_Datatype *mpi_datatype) { MPI_Type_free(mpi_datatype); } \endcode Note that it is important to make sure no communication is going to occur before the function starpu_mpi_datatype_register() is called. That would produce an undefined result as the data may be received before the function is called, and so the MPI datatype would not be known by the StarPU-MPI communication engine, and the data would be processed with the pack and unpack operations. \code{.c} starpu_data_interface handle; starpu_complex_data_register(&handle, STARPU_MAIN_RAM, real, imaginary, 2); starpu_mpi_datatype_register(handle, starpu_complex_interface_datatype_allocate, starpu_complex_interface_datatype_free); starpu_mpi_barrier(MPI_COMM_WORLD); \endcode \section MPIInsertTaskUtility MPI Insert Task Utility To save the programmer from having to explicit all communications, StarPU provides an "MPI Insert Task Utility". The principe is that the application decides a distribution of the data over the MPI nodes by allocating it and notifying StarPU of that decision, i.e. tell StarPU which MPI node "owns" which data. It also decides, for each handle, an MPI tag which will be used to exchange the content of the handle. All MPI nodes then process the whole task graph, and StarPU automatically determines which node actually execute which task, and trigger the required MPI transfers. The list of functions is described in \ref MPIInsertTask. Here an stencil example showing how to use starpu_mpi_task_insert(). One first needs to define a distribution function which specifies the locality of the data. Note that the data needs to be registered to MPI by calling starpu_mpi_data_register(). This function allows to set the distribution information and the MPI tag which should be used when communicating the data. It also allows to automatically clear the MPI communication cache when unregistering the data. \code{.c} /* Returns the MPI node number where data is */ int my_distrib(int x, int y, int nb_nodes) { /* Block distrib */ return ((int)(x / sqrt(nb_nodes) + (y / sqrt(nb_nodes)) * sqrt(nb_nodes))) % nb_nodes; // /* Other examples useful for other kinds of computations */ // /* / distrib */ // return (x+y) % nb_nodes; // /* Block cyclic distrib */ // unsigned side = sqrt(nb_nodes); // return x % side + (y % side) * size; } \endcode Now the data can be registered within StarPU. Data which are not owned but will be needed for computations can be registered through the lazy allocation mechanism, i.e. with a home_node set to -1. StarPU will automatically allocate the memory when it is used for the first time. One can note an optimization here (the else if test): we only register data which will be needed by the tasks that we will execute. \code{.c} unsigned matrix[X][Y]; starpu_data_handle_t data_handles[X][Y]; for(x = 0; x < X; x++) { for (y = 0; y < Y; y++) { int mpi_rank = my_distrib(x, y, size); if (mpi_rank == my_rank) /* Owning data */ starpu_variable_data_register(&data_handles[x][y], STARPU_MAIN_RAM, (uintptr_t)&(matrix[x][y]), sizeof(unsigned)); else if (my_rank == my_distrib(x+1, y, size) || my_rank == my_distrib(x-1, y, size) || my_rank == my_distrib(x, y+1, size) || my_rank == my_distrib(x, y-1, size)) /* I don't own that index, but will need it for my computations */ starpu_variable_data_register(&data_handles[x][y], -1, (uintptr_t)NULL, sizeof(unsigned)); else /* I know it's useless to allocate anything for this */ data_handles[x][y] = NULL; if (data_handles[x][y]) { starpu_mpi_data_register(data_handles[x][y], x*X+y, mpi_rank); } } } \endcode Now starpu_mpi_task_insert() can be called for the different steps of the application. \code{.c} for(loop=0 ; loopdata_handles[x][y]) will actually run the task. The other MPI nodes will automatically send the required data. This can be a concern with a growing number of nodes. To avoid this, the application can prune the task for loops according to the data distribution, so as to only submit tasks on nodes which have to care about them (either to execute them, or to send the required data). A way to do some of this quite easily can be to just add an if like this: \code{.c} for(loop=0 ; loopmy_distrib function can be inlined by the compiler, the latter can improve the test. If the size can be made a compile-time constant, the compiler can considerably improve the test further. If the distribution function is not too complex and the compiler is very good, the latter can even optimize the for loops, thus dramatically reducing the cost of task submission. To estimate quickly how long task submission takes, and notably how much pruning saves, a quick and easy way is to measure the submission time of just one of the MPI nodes. This can be achieved by running the application on just one MPI node with the following environment variables: \code export STARPU_DISABLE_KERNELS=1 export STARPU_MPI_FAKE_RANK=2 export STARPU_MPI_FAKE_SIZE=1024 \endcode Here we have disabled the kernel function call to skip the actual computation time and only keep submission time, and we have asked StarPU to fake running on MPI node 2 out of 1024 nodes. To tune the placement of tasks among MPI nodes, one can use ::STARPU_EXECUTE_ON_NODE or ::STARPU_EXECUTE_ON_DATA to specify an explicit node, or the node of a given data (e.g. one of the parameters), or use starpu_mpi_node_selection_register_policy() and ::STARPU_NODE_SELECTION_POLICY to provide a dynamic policy. A function starpu_mpi_task_build() is also provided with the aim to only construct the task structure. All MPI nodes need to call the function, only the node which is to execute the task will return a valid task structure, others will return NULL. That node must submit that task. All nodes then need to call the function starpu_mpi_task_post_build() -- with the same list of arguments as starpu_mpi_task_build() -- to post all the necessary data communications. \code{.c} struct starpu_task *task; task = starpu_mpi_task_build(MPI_COMM_WORLD, &cl, STARPU_RW, data_handles[0], STARPU_R, data_handles[1], 0); if (task) starpu_task_submit(task); starpu_mpi_task_post_build(MPI_COMM_WORLD, &cl, STARPU_RW, data_handles[0], STARPU_R, data_handles[1], 0); \endcode \section MPITemporaryData Temporary Data To be able to use starpu_mpi_task_insert(), one has to call starpu_mpi_data_register(), so that StarPU-MPI can know what it needs to do for each data. Parameters of starpu_mpi_data_register() are normally the same on all nodes for a given data, so that all nodes agree on which node owns the data, and which tag is used to transfer its value. It can however be useful to register e.g. some temporary data on just one node, without having to register a dumb handle on all nodes, while only one node will actually need to know about it. In that case, nodes which will not need the data can just pass NULL to starpu_mpi_task_insert(): \code{.c} starpu_data_handle_t data0 = NULL; if (rank == 0) { starpu_variable_data_register(&data0, STARPU_MAIN_RAM, (uintptr_t) &val0, sizeof(val0)); starpu_mpi_data_register(data0, 0, rank); } starpu_mpi_task_insert(MPI_COMM_WORLD, &cl, STARPU_W, data0, 0); /* Executes on node 0 */ \endcode Here, nodes whose rank is not 0 will simply not take care of the data, and consider it to be on another node. This can be mixed various way, for instance here node 1 determines that it does not have to care about data0, but knows that it should send the value of its data1 to node 0, which owns data and thus will need the value of data1 to execute the task: \code{.c} starpu_data_handle_t data0 = NULL, data1, data; if (rank == 0) { starpu_variable_data_register(&data0, STARPU_MAIN_RAM, (uintptr_t) &val0, sizeof(val0)); starpu_mpi_data_register(data0, -1, rank); starpu_variable_data_register(&data1, -1, 0, sizeof(val1)); starpu_variable_data_register(&data, STARPU_MAIN_RAM, (uintptr_t) &val, sizeof(val)); } else if (rank == 1) { starpu_variable_data_register(&data1, STARPU_MAIN_RAM, (uintptr_t) &val1, sizeof(val1)); starpu_variable_data_register(&data, -1, 0, sizeof(val)); } starpu_mpi_data_register(data, 42, 0); starpu_mpi_data_register(data1, 43, 1); starpu_mpi_task_insert(MPI_COMM_WORLD, &cl, STARPU_W, data, STARPU_R, data0, STARPU_R, data1, 0); /* Executes on node 0 */ \endcode \section MPIPerNodeData Per-node Data Further than temporary data on just one node, one may want per-node data, to e.g. replicate some computation because that is less expensive than communicating the value over MPI: \code{.c} starpu_data_handle pernode, data0, data1; starpu_variable_data_register(&pernode, -1, 0, sizeof(val)); starpu_mpi_data_register(pernode, -1, STARPU_MPI_PER_NODE); /* Normal data: one on node0, one on node1 */ if (rank == 0) { starpu_variable_data_register(&data0, STARPU_MAIN_RAM, (uintptr_t) &val0, sizeof(val0)); starpu_variable_data_register(&data1, -1, 0, sizeof(val1)); } else if (rank == 1) { starpu_variable_data_register(&data0, -1, 0, sizeof(val1)); starpu_variable_data_register(&data1, STARPU_MAIN_RAM, (uintptr_t) &val1, sizeof(val1)); } starpu_mpi_data_register(data0, 42, 0); starpu_mpi_data_register(data1, 43, 1); starpu_mpi_task_insert(MPI_COMM_WORLD, &cl, STARPU_W, pernode, 0); /* Will be replicated on all nodes */ starpu_mpi_task_insert(MPI_COMM_WORLD, &cl2, STARPU_RW, data0, STARPU_R, pernode); /* Will execute on node 0, using its own pernode*/ starpu_mpi_task_insert(MPI_COMM_WORLD, &cl2, STARPU_RW, data1, STARPU_R, pernode); /* Will execute on node 1, using its own pernode*/ \endcode One can turn a normal data into pernode data, by first broadcasting it to all nodes: \code{.c} starpu_data_handle data; starpu_variable_data_register(&data, -1, 0, sizeof(val)); starpu_mpi_data_register(data, 42, 0); /* Compute some value */ starpu_mpi_task_insert(MPI_COMM_WORLD, &cl, STARPU_W, data, 0); /* Node 0 computes it */ /* Get it on all nodes */ starpu_mpi_get_data_on_all_nodes_detached(MPI_COMM_WORLD, data); /* And turn it per-node */ starpu_mpi_data_set_rank(data, STARPU_MPI_PER_NODE); \endcode The data can then be used just like pernode above. \section MPICache MPI cache support StarPU-MPI automatically optimizes duplicate data transmissions: if an MPI node B needs a piece of data D from MPI node A for several tasks, only one transmission of D will take place from A to B, and the value of D will be kept on B as long as no task modifies D. If a task modifies D, B will wait for all tasks which need the previous value of D, before invalidating the value of D. As a consequence, it releases the memory occupied by D. Whenever a task running on B needs the new value of D, allocation will take place again to receive it. Since tasks can be submitted dynamically, StarPU-MPI can not know whether the current value of data D will again be used by a newly-submitted task before being modified by another newly-submitted task, so until a task is submitted to modify the current value, it can not decide by itself whether to flush the cache or not. The application can however explicitly tell StarPU-MPI to flush the cache by calling starpu_mpi_cache_flush() or starpu_mpi_cache_flush_all_data(), for instance in case the data will not be used at all any more (see for instance the cholesky example in mpi/examples/matrix_decomposition), or at least not in the close future. If a newly-submitted task actually needs the value again, another transmission of D will be initiated from A to B. A mere starpu_mpi_cache_flush_all_data() can for instance be added at the end of the whole algorithm, to express that no data will be reused after that (or at least that it is not interesting to keep them in cache). It may however be interesting to add fine-graph starpu_mpi_cache_flush() calls during the algorithm; the effect for the data deallocation will be the same, but it will additionally release some pressure from the StarPU-MPI cache hash table during task submission. One can determine whether a piece of is cached with starpu_mpi_cached_receive() and starpu_mpi_cached_send(). The whole caching behavior can be disabled thanks to the \ref STARPU_MPI_CACHE environment variable. The variable \ref STARPU_MPI_CACHE_STATS can be set to 1 to enable the runtime to display messages when data are added or removed from the cache holding the received data. \section MPIMigration MPI Data migration The application can dynamically change its mind about the data distribution, to balance the load over MPI nodes for instance. This can be done very simply by requesting an explicit move and then change the registered rank. For instance, we here switch to a new distribution function my_distrib2: we first register any data that wasn't registered already and will be needed, then migrate the data, and register the new location. \code{.c} for(x = 0; x < X; x++) { for (y = 0; y < Y; y++) { int mpi_rank = my_distrib2(x, y, size); if (!data_handles[x][y] && (mpi_rank == my_rank || my_rank == my_distrib(x+1, y, size) || my_rank == my_distrib(x-1, y, size) || my_rank == my_distrib(x, y+1, size) || my_rank == my_distrib(x, y-1, size))) /* Register newly-needed data */ starpu_variable_data_register(&data_handles[x][y], -1, (uintptr_t)NULL, sizeof(unsigned)); if (data_handles[x][y]) { /* Migrate the data */ starpu_mpi_data_migrate(MPI_COMM_WORLD, data_handles[x][y], mpi_rank); } } } \endcode From then on, further tasks submissions will use the new data distribution, which will thus change both MPI communications and task assignments. Very importantly, since all nodes have to agree on which node owns which data so as to determine MPI communications and task assignments the same way, all nodes have to perform the same data migration, and at the same point among task submissions. It thus does not require a strict synchronization, just a clear separation of task submissions before and after the data redistribution. Before data unregistration, it has to be migrated back to its original home node (the value, at least), since that is where the user-provided buffer resides. Otherwise the unregistration will complain that it does not have the latest value on the original home node. \code{.c} for(x = 0; x < X; x++) { for (y = 0; y < Y; y++) { if (data_handles[x][y]) { int mpi_rank = my_distrib(x, y, size); /* Get back data to original place where the user-provided buffer is. */ starpu_mpi_get_data_on_node_detached(MPI_COMM_WORLD, data_handles[x][y], mpi_rank, NULL, NULL); /* And unregister it */ starpu_data_unregister(data_handles[x][y]); } } } \endcode \section MPICollective MPI Collective Operations The functions are described in \ref MPICollectiveOperations. \code{.c} if (rank == root) { /* Allocate the vector */ vector = malloc(nblocks * sizeof(float *)); for(x=0 ; x
  • comm shows how to use communicators with StarPU-MPI
  • complex is a simple example using a user-define data interface over MPI (complex numbers),
  • stencil5 is a simple stencil example using starpu_mpi_task_insert(),
  • matrix_decomposition is a cholesky decomposition example using starpu_mpi_task_insert(). The non-distributed version can check for
  • mpi_lu is an LU decomposition example, provided in three versions: plu_example uses explicit MPI data transfers, plu_implicit_example uses implicit MPI data transfers, plu_outofcore_example uses implicit MPI data transfers and supports data matrices which do not fit in memory (out-of-core).
  • starpu-1.2.3+dfsg/doc/doxygen/chapters/420_fft_support.doxy000066400000000000000000000046371320135501600236600ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \page FFTSupport FFT Support StarPU provides libstarpufft, a library whose design is very similar to both fftw and cufft, the difference being that it takes benefit from both CPUs and GPUs. It should however be noted that GPUs do not have the same precision as CPUs, so the results may different by a negligible amount. Different precisions are available, namely float, double and long double precisions, with the following fftw naming conventions:
    • double precision structures and functions are named e.g. starpufft_execute()
    • float precision structures and functions are named e.g. starpufftf_execute()
    • long double precision structures and functions are named e.g. starpufftl_execute()
    The documentation below is given with names for double precision, replace starpufft_ with starpufftf_ or starpufftl_ as appropriate. Only complex numbers are supported at the moment. The application has to call starpu_init() before calling starpufft functions. Either main memory pointers or data handles can be provided.
    • To provide main memory pointers, use starpufft_start() or starpufft_execute(). Only one FFT can be performed at a time, because StarPU will have to register the data on the fly. In the starpufft_start() case, starpufft_cleanup() needs to be called to unregister the data.
    • To provide data handles (which is preferrable), use starpufft_start_handle() (preferred) or starpufft_execute_handle(). Several FFTs tasks can be submitted for a given plan, which permits e.g. to start a series of FFT with just one plan. starpufft_start_handle() is preferrable since it does not wait for the task completion, and thus permits to enqueue a series of tasks.
    All functions are defined in \ref API_FFT_Support. \section Compilation Compilation The flags required to compile or link against the FFT library are accessible with the following commands: \verbatim $ pkg-config --cflags starpufft-1.2 # options for the compiler $ pkg-config --libs starpufft-1.2 # options for the linker \endverbatim Also pass the option --static if the application is to be linked statically. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/430_mic_scc_support.doxy000066400000000000000000000110141320135501600244650ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \page MICSCCSupport MIC Xeon Phi / SCC Support \section Compilation Compilation SCC support just needs the presence of the RCCE library. MIC Xeon Phi support actually needs two compilations of StarPU, one for the host and one for the device. The PATH environment variable has to include the path to the cross-compilation toolchain, for instance /usr/linux-k1om-4.7/bin . The SINK_PKG_CONFIG_PATH environment variable should include the path to the cross-compiled hwloc.pc. The script mic-configure can then be used to achieve the two compilations: it basically calls configure as appropriate from two new directories: build_mic and build_host. make and make install can then be used as usual and will recurse into both directories. If different configuration options are needed for the host and for the mic, one can use --with-host-param=--with-fxt for instance to specify the --with-fxt option for the host only, or --with-mic-param=--with-fxt for the mic only. One can also run StarPU just natively on the Xeon Phi, i.e. it will only run directly on the Phi without any exchange with the host CPU. The binaries in build_mic can be run that way. For MPI support, you will probably have to specify different MPI compiler path or option for the host and the device builds, for instance: \verbatim ./mic-configure --with-mic-param=--with-mpicc="/.../mpiicc -mmic" \ --with-host-param=--with-mpicc=/.../mpiicc \endverbatim In case you have troubles with the coi or scif libraries (the Intel paths are really not standard, it seems...), you can still make a build in native mode only, by using mic-configure --enable-native-mic (and notably without --enable-mic since in that case we don't need mic offloading support). \section PortingApplicationsToMICSCC Porting Applications To MIC Xeon Phi / SCC The simplest way to port an application to MIC Xeon Phi or SCC is to set the field starpu_codelet::cpu_funcs_name, to provide StarPU with the function name of the CPU implementation, so for instance: \verbatim struct starpu_codelet cl = { .cpu_funcs = {myfunc}, .cpu_funcs_name = {"myfunc"}, .nbuffers = 1, } \endverbatim StarPU will thus simply use the existing CPU implementation (cross-rebuilt in the MIC Xeon Phi case). The functions have to be globally-visible (i.e. not static) for StarPU to be able to look them up, and -rdynamic must be passed to gcc (or -export-dynamic to ld) so that symbols of the main program are visible. If you have used the .where field, you additionally need to add in it STARPU_MIC for the Xeon Phi, and/or STARPU_SCC for the SCC. For non-native MIC Xeon Phi execution, the 'main' function of the application, on the sink, should call starpu_init() immediately upon start-up; the starpu_init() function never returns. On the host, the 'main' function may freely perform application related initialization calls as usual, before calling starpu_init(). For MIC Xeon Phi, the application may programmatically detect whether executing on the sink or on the host, by checking whether the STARPU_SINK environment variable is defined (on the sink) or not (on the host). For SCC execution, the function starpu_initialize() also has to be used instead of starpu_init(), so as to pass argc and argv. \section LaunchingPrograms Launching Programs SCC programs are started through RCCE. MIC programs are started from the host. StarPU automatically starts the same program on MIC devices. It however needs to get the MIC-cross-built binary. It will look for the file given by the environment variable \ref STARPU_MIC_SINK_PROGRAM_NAME or in the directory given by the environment variable \ref STARPU_MIC_SINK_PROGRAM_PATH, or in the field starpu_conf::mic_sink_program_path. It will also look in the current directory for the same binary name plus the suffix -mic or _mic. The testsuite can be started by simply running make check from the top directory. It will recurse into both build_host to run tests with only the host, and into build_mic to run tests with both the host and the MIC devices. Single tests with the host and the MIC can be run by starting ./loader-cross.sh ./the_test from build_mic/tests. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/440_c_extensions.doxy000066400000000000000000000306751320135501600240110ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \page cExtensions C Extensions When GCC plug-in support is available, StarPU builds a plug-in for the GNU Compiler Collection (GCC), which defines extensions to languages of the C family (C, C++, Objective-C) that make it easier to write StarPU code. This feature is only available for GCC 4.5 and later; it is known to work with GCC 4.5, 4.6, and 4.7. You may need to install a specific -dev package of your distro, such as gcc-4.6-plugin-dev on Debian and derivatives. In addition, the plug-in's test suite is only run when GNU Guile (http://www.gnu.org/software/guile/) is found at configure-time. Building the GCC plug-in can be disabled by configuring with \ref disable-gcc-extensions "--disable-gcc-extensions". Those extensions include syntactic sugar for defining tasks and their implementations, invoking a task, and manipulating data buffers. Use of these extensions can be made conditional on the availability of the plug-in, leading to valid C sequential code when the plug-in is not used (\ref UsingCExtensionsConditionally). When StarPU has been installed with its GCC plug-in, programs that use these extensions can be compiled this way: \verbatim $ gcc -c -fplugin=`pkg-config starpu-1.2 --variable=gccplugin` foo.c \endverbatim When the plug-in is not available, the above pkg-config command returns the empty string. In addition, the -fplugin-arg-starpu-verbose flag can be used to obtain feedback from the compiler as it analyzes the C extensions used in source files. This section describes the C extensions implemented by StarPU's GCC plug-in. It does not require detailed knowledge of the StarPU library. Note: this is still an area under development and subject to change. \section DefiningTasks Defining Tasks The StarPU GCC plug-in views tasks as ``extended'' C functions:
    • tasks may have several implementations---e.g., one for CPUs, one written in OpenCL, one written in CUDA;
    • tasks may have several implementations of the same target---e.g., several CPU implementations;
    • when a task is invoked, it may run in parallel, and StarPU is free to choose any of its implementations.
    Tasks and their implementations must be declared. These declarations are annotated with attributes (http://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html#Attribute-Syntax): the declaration of a task is a regular C function declaration with an additional task attribute, and task implementations are declared with a task_implementation attribute. The following function attributes are provided:
    task
    Declare the given function as a StarPU task. Its return type must be void. When a function declared as task has a user-defined body, that body is interpreted as the implicit definition of the task's CPU implementation (see example below). In all cases, the actual definition of a task's body is automatically generated by the compiler. Under the hood, declaring a task leads to the declaration of the corresponding codelet (\ref CodeletAndTasks). If one or more task implementations are declared in the same compilation unit, then the codelet and the function itself are also defined; they inherit the scope of the task. Scalar arguments to the task are passed by value and copied to the target device if need be---technically, they are passed as the buffer starpu_task::cl_arg (\ref CodeletAndTasks). Pointer arguments are assumed to be registered data buffers---the handles argument of a task (starpu_task::handles) ; const-qualified pointer arguments are viewed as read-only buffers (::STARPU_R), and non-const-qualified buffers are assumed to be used read-write (::STARPU_RW). In addition, the output type attribute can be as a type qualifier for output pointer or array parameters (::STARPU_W).
    task_implementation (target, task)
    Declare the given function as an implementation of task to run on target. target must be a string, currently one of "cpu", "opencl", or "cuda". // FIXME: Update when OpenCL support is ready.
    Here is an example: \code{.c} #define __output __attribute__ ((output)) static void matmul (const float *A, const float *B, __output float *C, unsigned nx, unsigned ny, unsigned nz) __attribute__ ((task)); static void matmul_cpu (const float *A, const float *B, __output float *C, unsigned nx, unsigned ny, unsigned nz) __attribute__ ((task_implementation ("cpu", matmul))); static void matmul_cpu (const float *A, const float *B, __output float *C, unsigned nx, unsigned ny, unsigned nz) { unsigned i, j, k; for (j = 0; j < ny; j++) for (i = 0; i < nx; i++) { for (k = 0; k < nz; k++) C[j * nx + i] += A[j * nz + k] * B[k * nx + i]; } } \endcode A matmult task is defined; it has only one implementation, matmult_cpu, which runs on the CPU. Variables A and B are input buffers, whereas C is considered an input/output buffer. For convenience, when a function declared with the task attribute has a user-defined body, that body is assumed to be that of the CPU implementation of a task, which we call an implicit task CPU implementation. Thus, the above snippet can be simplified like this: \code{.c} #define __output __attribute__ ((output)) static void matmul (const float *A, const float *B, __output float *C, unsigned nx, unsigned ny, unsigned nz) __attribute__ ((task)); /* Implicit definition of the CPU implementation of the `matmul' task. */ static void matmul (const float *A, const float *B, __output float *C, unsigned nx, unsigned ny, unsigned nz) { unsigned i, j, k; for (j = 0; j < ny; j++) for (i = 0; i < nx; i++) { for (k = 0; k < nz; k++) C[j * nx + i] += A[j * nz + k] * B[k * nx + i]; } } \endcode Use of implicit CPU task implementations as above has the advantage that the code is valid sequential code when StarPU's GCC plug-in is not used (\ref UsingCExtensionsConditionally). CUDA and OpenCL implementations can be declared in a similar way: \code{.c} static void matmul_cuda (const float *A, const float *B, float *C, unsigned nx, unsigned ny, unsigned nz) __attribute__ ((task_implementation ("cuda", matmul))); static void matmul_opencl (const float *A, const float *B, float *C, unsigned nx, unsigned ny, unsigned nz) __attribute__ ((task_implementation ("opencl", matmul))); \endcode The CUDA and OpenCL implementations typically either invoke a kernel written in CUDA or OpenCL (for similar code, \ref CUDAKernel, and \ref OpenCLKernel), or call a library function that uses CUDA or OpenCL under the hood, such as CUBLAS functions: \code{.c} static void matmul_cuda (const float *A, const float *B, float *C, unsigned nx, unsigned ny, unsigned nz) { cublasSgemm ('n', 'n', nx, ny, nz, 1.0f, A, 0, B, 0, 0.0f, C, 0); cudaStreamSynchronize (starpu_cuda_get_local_stream ()); } \endcode A task can be invoked like a regular C function: \code{.c} matmul (&A[i * zdim * bydim + k * bzdim * bydim], &B[k * xdim * bzdim + j * bxdim * bzdim], &C[i * xdim * bydim + j * bxdim * bydim], bxdim, bydim, bzdim); \endcode This leads to an asynchronous invocation, whereby matmult's implementation may run in parallel with the continuation of the caller. The next section describes how memory buffers must be handled in StarPU-GCC code. For a complete example, see the gcc-plugin/examples directory of the source distribution, and \ref VectorScalingUsingTheCExtension. \section InitializationTerminationAndSynchronization Initialization, Termination, and Synchronization The following pragmas allow user code to control StarPU's life time and to synchronize with tasks.
    \#pragma starpu initialize
    Initialize StarPU. This call is compulsory and is never added implicitly. One of the reasons this has to be done explicitly is that it provides greater control to user code over its resource usage.
    \#pragma starpu shutdown
    Shut down StarPU, giving it an opportunity to write profiling info to a file on disk, for instance (\ref Off-linePerformanceFeedback).
    \#pragma starpu wait
    Wait for all task invocations to complete, as with starpu_task_wait_for_all().
    \section RegisteredDataBuffers Registered Data Buffers Data buffers such as matrices and vectors that are to be passed to tasks must be registered. Registration allows StarPU to handle data transfers among devices---e.g., transferring an input buffer from the CPU's main memory to a task scheduled to run a GPU (\ref StarPUDataManagementLibrary). The following pragmas are provided:
    \#pragma starpu register ptr [size]
    Register ptr as a size-element buffer. When ptr has an array type whose size is known, size may be omitted. Alternatively, the registered attribute can be used (see below.)
    \#pragma starpu unregister ptr
    Unregister the previously-registered memory area pointed to by ptr. As a side-effect, ptr points to a valid copy in main memory.
    \#pragma starpu acquire ptr
    Acquire in main memory an up-to-date copy of the previously-registered memory area pointed to by ptr, for read-write access.
    \#pragma starpu release ptr
    Release the previously-register memory area pointed to by ptr, making it available to the tasks.
    Additionally, the following attributes offer a simple way to allocate and register storage for arrays:
    registered
    This attributes applies to local variables with an array type. Its effect is to automatically register the array's storage, as per \#pragma starpu register. The array is automatically unregistered when the variable's scope is left. This attribute is typically used in conjunction with the heap_allocated attribute, described below.
    heap_allocated
    This attributes applies to local variables with an array type. Its effect is to automatically allocate the array's storage on the heap, using starpu_malloc() under the hood. The heap-allocated array is automatically freed when the variable's scope is left, as with automatic variables.
    The following example illustrates use of the heap_allocated attribute: \snippet cholesky_pragma.c To be included. You should update doxygen if you see this text. \section UsingCExtensionsConditionally Using C Extensions Conditionally The C extensions described in this chapter are only available when GCC and its StarPU plug-in are in use. Yet, it is possible to make use of these extensions when they are available---leading to hybrid CPU/GPU code---and discard them when they are not available---leading to valid sequential code. To that end, the GCC plug-in defines the C preprocessor macro --- STARPU_GCC_PLUGIN --- when it is being used. When defined, this macro expands to an integer denoting the version of the supported C extensions. The code below illustrates how to define a task and its implementations in a way that allows it to be compiled without the GCC plug-in: \snippet matmul_pragma.c To be included. You should update doxygen if you see this text. The above program is a valid StarPU program when StarPU's GCC plug-in is used; it is also a valid sequential program when the plug-in is not used. Note that attributes such as task as well as starpu pragmas are simply ignored by GCC when the StarPU plug-in is not loaded. However, gcc -Wall emits a warning for unknown attributes and pragmas, which can be inconvenient. In addition, other compilers may be unable to parse the attribute syntax (In practice, Clang and several proprietary compilers implement attributes.), so you may want to wrap attributes in macros like this: \snippet matmul_pragma2.c To be included. You should update doxygen if you see this text. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/450_native_fortran_support.doxy000066400000000000000000000236641320135501600261260ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2014, 2016 INRIA * See the file version.doxy for copying conditions. */ /*! \page NativeFortranSupport The StarPU Native Fortran Support StarPU provides the necessary routines and support to natively access most of its functionalities from Fortran 2008+ codes. All symbols (functions, constants) are defined in fstarpu_mod.f90. Every symbol of the Native Fortran support API is prefixed by fstarpu_. Note: Mixing uses of fstarpu_ and starpu_ symbols in the same Fortran code has unspecified behaviour. See \ref APIMIX for a discussion about valid and unspecified combinations. \section Implementation Implementation Details and Specificities \subsection Prerequisites Prerequisites The Native Fortran support relies on Fortran 2008 specific constructs, as well as on the support of interoperability of assumed-shape arrays introduced as part of Fortran's Technical Specification ISO/IEC TS 29113:2012, for which no equivalent are available in previous versions of the standard. It has currently been tested successfully with GNU GFortran 4.9, GFortran 5.x, GFortran 6.x and the Intel Fortran Compiler >= 2016. It is known not to work with GNU GFortran < 4.9, Intel Fortran Compiler < 2016. See Section \ref OldFortran on information on how to write StarPU Fortran code with older compilers. \subsection Configuration Configuration The Native Fortran API is enabled and its companion fstarpu_mod.f90 Fortran module source file is installed by default when a Fortran compiler is found, unless the detected Fortran compiler is known not to support the requirements for the Native Fortran API. The support can be disabled through the configure option \ref disable-fortran "--disable-fortran". Conditional compiled source codes may check for the availability of the Native Fortran Support by testing whether the preprocessor macro STARPU_HAVE_FC is defined or not. \subsection Examples Examples Several examples using the Native Fortran API are provided in StarPU's examples/native_fortran/ examples directory, to showcase the Fortran flavor of various basic and more advanced StarPU features. \subsection AppCompile Compiling a Native Fortran Application The Fortran module fstarpu_mod.f90 installed in StarPU's include/ directory provides all the necessary API definitions. It must be compiled with the same compiler (same vendor, same version) as the application itself, and the resulting fstarpu_mod.o object file must linked with the application executable. Each example provided in StarPU's examples/native_fortran/ examples directory comes with its own dedicated Makefile for out-of-tree build. Such example Makefiles may be used as starting points for building application codes with StarPU. \section Idioms Fortran Translation for Common StarPU API Idioms All these examples assume that the standard Fortran module iso_c_binding is in use. - Specifying a NULL pointer \code{.f90} type(c_ptr) :: my_ptr ! variable to store the pointer ! [...] my_ptr = C_NULL_PTR ! assign standard constant for NULL ptr \endcode - Obtaining a pointer to some object: \code{.f90} real(8), dimension(:), allocatable, target :: va type(c_ptr) :: p_va ! variable to store a pointer to array va ! [...] p_va = c_loc(va) \endcode - Obtaining a pointer to some subroutine: \code{.f90} ! pointed routine definition recursive subroutine myfunc () bind(C) ! [...] type(c_funptr) :: p_fun ! variable to store the routine pointer ! [...] p_fun = c_funloc(my_func) \endcode - Obtaining the size of some object: \code{.f90} real(8) :: a integer(c_size_t) :: sz_a ! variable to store the size of a ! [...] sz_a = c_sizeof(a) \endcode - Obtaining the length of an array dimension: \code{.f90} real(8), dimension(:,:), allocatable, target :: vb intger(c_int) :: ln_vb_1 ! variable to store the length of vb's dimension 1 intger(c_int) :: ln_vb_2 ! variable to store the length of vb's dimension 2 ! [...] ln_vb_1 = 1+ubound(vb,1)-lbound(vb,1) ! get length of dimension 1 of vb ln_vb_2 = 1+ubound(vb,2)-lbound(vb,2) ! get length of dimension 2 of vb \endcode - Specifying a string constant: \code{.f90} type(c_ptr) :: my_cl ! a StarPU codelet ! [...] ! set the name of a codelet to string 'my_codele't: call fstarpu_codelet_set_name(my_cl, C_CHAR_"my_codelet"//C_NULL_CHAR) ! note: using the C_CHAR_ prefix and the //C_NULL_CHAR concatenation at the end ensures ! that the string constant is properly '\0' terminated, and compatible with StarPU's ! internal C routines ! ! note: plain Fortran string constants are not '\0' terminated, and as such, must not be ! passed to StarPU routines. \endcode - Combining multiple flag constants with a bitwise 'or': \code{.f90} type(c_ptr) :: my_cl ! a pointer for the codelet structure ! [...] ! add a managed buffer to a codelet, specifying both the Read/Write access mode and the Locality hint call fstarpu_codelet_add_buffer(my_cl, FSTARPU_RW.ior.FSTARPU_LOCALITY) \endcode \section InitExit Uses, Initialization and Shutdown The snippet below show an example of minimal StarPU code using the Native Fortran support. The program should use the standard module iso_c_binding as well as StarPU's fstarpu_mod. The StarPU runtime engine is initialized with a call to function fstarpu_init, which returns an integer status of 0 if successful or non-0 otherwise. Eventually, a call to fstarpu_shutdown ends the runtime engine and frees all internal StarPU data structures. \snippet nf_initexit.f90 To be included. You should update doxygen if you see this text. \section InsertTask Fortran Flavor of StarPU's Variadic Insert_task Fortran does not have a construction similar to C variadic functions on which starpu_insert_task relies at the time of this writing. However, Fortran's variable length arrays of c_ptr elements enable to emulate much of the convenience of C's variadic functions. This is the approach retained for implementing fstarpu_insert_task. The general syntax for using fstarpu_insert_task is as follows: \code{.f90} call fstarpu_insert_task((/ & [, , ]* & [, , ]* & , C_NULL_PTR /)) \endcode There is thus a unique array argument (/ ... /) passed to fstarpu_insert_task which itself contains the task settings. Each element of the array must be of type type(c_ptr). The last element of the array must be C_NULL_PTR. Example extracted from nf_vector.f90: \code{.f90} call fstarpu_insert_task((/ cl_vec, & ! codelet FSTARPU_R, dh_va, & ! a first data handle FSTARPU_RW.ior.FSTARPU_LOCALITY, dh_vb, & ! a second data handle C_NULL_PTR /)) ! no more args \endcode \section Structs Functions and Subroutines Expecting Data Structures Arguments Several StarPU structures that are expected to be passed to the C API, are replaced by function/subroutine wrapper sets to allocate, set fields and free such structure. This strategy has been prefered over defining native Fortran equivalent of such structures using Fortran's derived types, to avoid potential layout mismatch between C and Fortran StarPU data structures. Examples of such data structures wrappers include fstarpu_conf_allocate and alike, fstarpu_codelet_allocate and alike, fstarpu_data_filter_allocate and alike. Here is an example of allocating, filling and deallocating a codelet structure: \code{.f90} ! a pointer for the codelet structure type(c_ptr) :: cl_vec ! [...] ! allocate an empty codelet structure cl_vec = fstarpu_codelet_allocate() ! add a CPU implementation function to the codelet call fstarpu_codelet_add_cpu_func(cl_vec, C_FUNLOC(cl_cpu_func_vec)) ! set the codelet name call fstarpu_codelet_set_name(cl_vec, C_CHAR_"my_vec_codelet"//C_NULL_CHAR) ! add a Read-only mode data buffer to the codelet call fstarpu_codelet_add_buffer(cl_vec, FSTARPU_R) ! add a Read-Write mode data buffer to the codelet call fstarpu_codelet_add_buffer(cl_vec, FSTARPU_RW.ior.FSTARPU_LOCALITY) ! [...] ! free codelet structure call fstarpu_codelet_free(cl_vec) \endcode \section Notes Additional Notes about the Native Fortran Support \subsection OldFortran Using StarPU with Older Fortran Compilers When using older compilers, Fortran applications may still interoperate with StarPU using C marshalling functions as exemplified in StarPU's examples/fortran/ and examples/fortran90/ example directories, though the process will be less convenient. Basically, the main FORTRAN code calls some C wrapper functions to submit tasks to StarPU. Then, when StarPU starts a task, another C wrapper function calls the FORTRAN routine for the task. Note that this marshalled FORTRAN support remains available even when specifying configure option \ref disable-fortran "--disable-fortran" (which only disables StarPU's native Fortran layer). \subsection APIMIX Valid API Mixes and Language Mixes Mixing uses of fstarpu_ and starpu_ symbols in the same Fortran code has unspecified behaviour. Using fstarpu_ symbols in C code has unspecified behaviour. For multi-language applications using both C and Fortran source files: - C source files must use starpu_ symbols exclusively - Fortran sources must uniformly use either fstarpu_ symbols exclusively, or starpu_ symbols exclusively. Every other combination has unspecified behaviour. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/460_socl_opencl_extensions.doxy000066400000000000000000000057211320135501600260630ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \page SOCLOpenclExtensions SOCL OpenCL Extensions SOCL is an OpenCL implementation based on StarPU. It gives a unified access to every available OpenCL device: applications can now share entities such as Events, Contexts or Command Queues between several OpenCL implementations. In addition, command queues that are created without specifying a device provide automatic scheduling of the submitted commands on OpenCL devices contained in the context to which the command queue is attached. Setting the CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE flag on a command queue also allows StarPU to reorder kernels queued on the queue, otherwise they would be serialized and several command queues would be necessary to see kernels dispatched on the various OpenCL devices. Note: this is still an area under development and subject to change. When compiling StarPU, SOCL will be enabled if a valid OpenCL implementation is found on your system. To be able to run the SOCL test suite, the environment variable \ref SOCL_OCL_LIB_OPENCL needs to be defined to the location of the file libOpenCL.so of the OCL ICD implementation. You should for example add the following line in your file .bashrc \verbatim export SOCL_OCL_LIB_OPENCL=/usr/lib/x86_64-linux-gnu/libOpenCL.so \endverbatim You can then run the test suite in the directory socl/examples. \verbatim $ make check ... PASS: basic/basic PASS: testmap/testmap PASS: clinfo/clinfo PASS: matmul/matmul PASS: mansched/mansched ================== All 5 tests passed ================== \endverbatim The environment variable \ref OCL_ICD_VENDORS has to point to the directory where the socl.icd ICD file is installed. When compiling StarPU, the files are in the directory socl/vendors. With an installed version of StarPU, the files are installed in the directory $prefix/share/starpu/opencl/vendors. To run the tests by hand, you have to call for example, \verbatim $ LD_PRELOAD=$SOCL_OCL_LIB_OPENCL OCL_ICD_VENDORS=socl/vendors/ socl/examples/clinfo/clinfo Number of platforms: 2 Plaform Profile: FULL_PROFILE Plaform Version: OpenCL 1.1 CUDA 4.2.1 Plaform Name: NVIDIA CUDA Plaform Vendor: NVIDIA Corporation Plaform Extensions: cl_khr_byte_addressable_store cl_khr_icd cl_khr_gl_sharing cl_nv_compiler_options cl_nv_device_attribute_query cl_nv_pragma_unroll Plaform Profile: FULL_PROFILE Plaform Version: OpenCL 1.0 SOCL Edition (0.1.0) Plaform Name: SOCL Platform Plaform Vendor: INRIA Plaform Extensions: cl_khr_icd .... $ \endverbatim To enable the use of CPU cores via OpenCL, one can set the \ref STARPU_OPENCL_ON_CPUS environment variable to 1 and \ref STARPU_NCPUS to 0 (to avoid using CPUs both via the OpenCL driver and the normal CPU driver). */ starpu-1.2.3+dfsg/doc/doxygen/chapters/470_simgrid.doxy000066400000000000000000000221261320135501600227410ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \page SimGridSupport SimGrid Support StarPU can use Simgrid in order to simulate execution on an arbitrary platform. This was tested with simgrid from 3.11 to 3.16, other versions may have compatibility issues. 3.17 notably does not build at all. \section Preparing Preparing Your Application For Simulation There are a few technical details which need to be handled for an application to be simulated through Simgrid. If the application uses gettimeofday to make its performance measurements, the real time will be used, which will be bogus. To get the simulated time, it has to use starpu_timing_now() which returns the virtual timestamp in us. For some technical reason, the application's .c file which contains main() has to be recompiled with starpu_simgrid_wrap.h, which in the simgrid case will # define main() into starpu_main(), and it is libstarpu which will provide the real main() and will call the application's main(). To be able to test with crazy data sizes, one may want to only allocate application data if STARPU_SIMGRID is not defined. Passing a NULL pointer to starpu_data_register functions is fine, data will never be read/written to by StarPU in Simgrid mode anyway. To be able to run the application with e.g. CUDA simulation on a system which does not have CUDA installed, one can fill the cuda_funcs with (void*)1, to express that there is a CUDA implementation, even if one does not actually provide it. StarPU will not actually run it in Simgrid mode anyway by default (unless the ::STARPU_CODELET_SIMGRID_EXECUTE flag is set in the codelet) \snippet simgrid.c To be included. You should update doxygen if you see this text. \section Calibration Calibration The idea is to first compile StarPU normally, and run the application, so as to automatically benchmark the bus and the codelets. \verbatim $ ./configure && make $ STARPU_SCHED=dmda ./examples/matvecmult/matvecmult [starpu][_starpu_load_history_based_model] Warning: model matvecmult is not calibrated, forcing calibration for this run. Use the STARPU_CALIBRATE environment variable to control this. $ ... $ STARPU_SCHED=dmda ./examples/matvecmult/matvecmult TEST PASSED \endverbatim Note that we force to use the scheduler dmda to generate performance models for the application. The application may need to be run several times before the model is calibrated. \section Simulation Simulation Then, recompile StarPU, passing \ref enable-simgrid "--enable-simgrid" to ./configure. Make sure to keep all other ./configure options the same, and notably options such as --enable-maxcudadev. \verbatim $ ./configure --enable-simgrid \endverbatim To specify the location of SimGrid, you can either set the environment variables SIMGRID_CFLAGS and SIMGRID_LIBS, or use the configure options \ref with-simgrid-dir "--with-simgrid-dir", \ref with-simgrid-include-dir "--with-simgrid-include-dir" and \ref with-simgrid-lib-dir "--with-simgrid-lib-dir", for example \verbatim $ ./configure --with-simgrid-dir=/opt/local/simgrid \endverbatim You can then re-run the application. \verbatim $ make $ STARPU_SCHED=dmda ./examples/matvecmult/matvecmult TEST FAILED !!! \endverbatim It is normal that the test fails: since the computation are not actually done (that is the whole point of simgrid), the result is wrong, of course. If the performance model is not calibrated enough, the following error message will be displayed \verbatim $ STARPU_SCHED=dmda ./examples/matvecmult/matvecmult [starpu][_starpu_load_history_based_model] Warning: model matvecmult is not calibrated, forcing calibration for this run. Use the STARPU_CALIBRATE environment variable to control this. [starpu][_starpu_simgrid_execute_job][assert failure] Codelet matvecmult does not have a perfmodel, or is not calibrated enough \endverbatim The number of devices can be chosen as usual with \ref STARPU_NCPU, \ref STARPU_NCUDA, and \ref STARPU_NOPENCL, and the amount of GPU memory with \ref STARPU_LIMIT_CUDA_MEM, \ref STARPU_LIMIT_CUDA_devid_MEM, \ref STARPU_LIMIT_OPENCL_MEM, and \ref STARPU_LIMIT_OPENCL_devid_MEM. \section SimulationOnAnotherMachine Simulation On Another Machine The simgrid support even permits to perform simulations on another machine, your desktop, typically. To achieve this, one still needs to perform the Calibration step on the actual machine to be simulated, then copy them to your desktop machine (the $STARPU_HOME/.starpu directory). One can then perform the Simulation step on the desktop machine, by setting the environment variable \ref STARPU_HOSTNAME to the name of the actual machine, to make StarPU use the performance models of the simulated machine even on the desktop machine. If the desktop machine does not have CUDA or OpenCL, StarPU is still able to use simgrid to simulate execution with CUDA/OpenCL devices, but the application source code will probably disable the CUDA and OpenCL codelets in thatcd sc case. Since during simgrid execution, the functions of the codelet are actually not called by default, one can use dummy functions such as the following to still permit CUDA or OpenCL execution. \section SimulationExamples Simulation Examples StarPU ships a few performance models for a couple of systems: attila, mirage, idgraf, and sirocco. See section \ref SimulatedBenchmarks for the details. \section FakeSimulations Simulations On Fake Machines It is possible to build fake machines which do not exist, by modifying the platform file in $STARPU_HOME/.starpu/sampling/bus/machine.platform.xml by hand: one can add more CPUs, add GPUs (but the performance model file has to be extended as well), change the available GPU memory size, PCI memory bandwidth, etc. \section TweakingSimulation Tweaking Simulation The simulation can be tweaked, to be able to tune it between a very accurate simulation and a very simple simulation (which is thus close to scheduling theory results), see the \ref STARPU_SIMGRID_CUDA_MALLOC_COST and \ref STARPU_SIMGRID_CUDA_QUEUE_COST environment variables. \section SimulationMPIApplications MPI Applications StarPU-MPI applications can also be run in simgrid mode. It needs to be compiled with smpicc, and run using the starpu_smpirun script, for instance: \verbatim $ STARPU_SCHED=dmda starpu_smpirun -platform cluster.xml -hostfile hostfile ./mpi/tests/pingpong \endverbatim Where cluster.xml is a Simgrid-MPI platform description, and hostfile the list of MPI nodes to be used. StarPU currently only supports homogeneous MPI clusters: for each MPI node it will just replicate the architecture referred by \ref STARPU_HOSTNAME. \section SimulationDebuggingApplications Debugging Applications By default, simgrid uses its own implementation of threads, which prevents gdb from being able to inspect stacks of all threads. To be able to fully debug an application running with simgrid, pass the --cfg=contexts/factory:thread option to the application, to make simgrid use system threads, which gdb will be able to manipulate as usual. \section SimulationMemoryUsage Memory Usage Since kernels are not actually run and data transfers are not actually performed, the data memory does not actually need to be allocated. This allows for instance to simulate the execution of applications processing very big data on a small laptop. The application can for instance pass 1 (or whatever bogus pointer) to starpu data registration functions, instead of allocating data. This will however require the application to take care of not trying to access the data, and will not work in MPI mode, which performs transfers. Another way is to pass the \ref STARPU_MALLOC_SIMULATION_FOLDED flag to the starpu_malloc_flags() function. This will make it allocate a memory area which one can read/write, but optimized so that this does not actually consume memory. Of course, the values read from such area will be bogus, but this allows the application to keep e.g. data load, store, initialization as it is, and also work in MPI mode. Note however that notably Linux kernels refuse obvious memory overcommitting by default, so a single allocation can typically not be bigger than the amount of physical memory, see https://www.kernel.org/doc/Documentation/vm/overcommit-accounting This prevents for instance from allocating a single huge matrix. Allocating a huge matrix in several tiles is not a problem, however. sysctl vm.overcommit_memory=1 can also be used to allow such overcommit. Note however that this folding is done by remapping the same file several times, and Linux kernels will also refuse to create too many memory areas. sysctl vm.max_map_count can be used to check and change the default (65535). By default, StarPU uses a 1MiB file, so it hopefully fits in the CPU cache. This however limits the amount of such folded memory to a bit below 64GiB. The \ref STARPU_MALLOC_SIMULATION_FOLD environment variable can be used to increase the size of the file. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/480_openmp_runtime_support.doxy000066400000000000000000000371241320135501600261450ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2014 INRIA * See the file version.doxy for copying conditions. */ /*! \page OpenMPRuntimeSupport The StarPU OpenMP Runtime Support (SORS) StarPU provides the necessary routines and support to implement an OpenMP (http://www.openmp.org/) runtime compliant with the revision 3.1 of the language specification, and compliant with the task-related data dependency functionalities introduced in the revision 4.0 of the language. This StarPU OpenMP Runtime Support (SORS) has been designed to be targetted by OpenMP compilers such as the Klang-OMP compiler. Most supported OpenMP directives can both be implemented inline or as outlined functions. All functions are defined in \ref API_OpenMP_Runtime_Support. \section Implementation Implementation Details and Specificities \subsection MainThread Main Thread When using the SORS, the main thread gets involved in executing OpenMP tasks just like every other threads, in order to be compliant with the specification execution model. This contrasts with StarPU's usual execution model where the main thread submit tasks but does not take part in executing them. \subsection TaskSemantics Extended Task Semantics The semantics of tasks generated by the SORS are extended with respect to regular StarPU tasks in that SORS' tasks may block and be preempted by SORS call, whereas regular StarPU tasks cannot. SORS tasks may coexist with regular StarPU tasks. However, only the tasks created using SORS API functions inherit from extended semantics. \section Configuration Configuration The SORS can be compiled into libstarpu through the configure option \ref enable-openmp "--enable-openmp". Conditional compiled source codes may check for the availability of the OpenMP Runtime Support by testing whether the C preprocessor macro STARPU_OPENMP is defined or not. \section InitExit Initialization and Shutdown The SORS needs to be executed/terminated by the starpu_omp_init() / starpu_omp_shutdown() instead of starpu_init() / starpu_shutdown(). This requirement is necessary to make sure that the main thread gets the proper execution environment to run OpenMP tasks. These calls will usually be performed by a compiler runtime. Thus, they can be executed from a constructor/destructor such as this: \code{.c} __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } \endcode \sa starpu_omp_init() \sa starpu_omp_shutdown() \section Parallel Parallel Regions and Worksharing The SORS provides functions to create OpenMP parallel regions as well as mapping work on participating workers. The current implementation does not provide nested active parallel regions: Parallel regions may be created recursively, however only the first level parallel region may have more than one worker. From an internal point-of-view, the SORS' parallel regions are implemented as a set of implicit, extended semantics StarPU tasks, following the execution model of the OpenMP specification. Thus the SORS' parallel region tasks may block and be preempted, by SORS calls, enabling constructs such as barriers. \subsection OMPParallel Parallel Regions Parallel regions can be created with the function starpu_omp_parallel_region() which accepts a set of attributes as parameter. The execution of the calling task is suspended until the parallel region completes. The field starpu_omp_parallel_region_attr::cl is a regular StarPU codelet. However only CPU codelets are supported for parallel regions. Here is an example of use: \code{.c} void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; pthread_t tid = pthread_self(); int worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d\n", (void *)tid, worker_id); } void f(void) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; starpu_omp_parallel_region(&attr); return 0; } \endcode \sa struct starpu_omp_parallel_region_attr \sa starpu_omp_parallel_region() \subsection OMPFor Parallel For OpenMP for loops are provided by the starpu_omp_for() group of functions. Variants are available for inline or outlined implementations. The SORS supports static, dynamic, and guided loop scheduling clauses. The auto scheduling clause is implemented as static. The runtime scheduling clause honors the scheduling mode selected through the environment variable OMP_SCHEDULE or the starpu_omp_set_schedule() function. For loops with the ordered clause are also supported. An implicit barrier can be enforced or skipped at the end of the worksharing construct, according to the value of the nowait parameter. The canonical family of starpu_omp_for() functions provide each instance with the first iteration number and the number of iterations (possibly zero) to perform. The alternate family of starpu_omp_for_alt() functions provide each instance with the (possibly empty) range of iterations to perform, including the first and excluding the last. The family of starpu_omp_ordered() functions enable to implement OpenMP's ordered construct, a region with a parallel for loop that is guaranteed to be executed in the sequential order of the loop iterations. \code{.c} void for_g(unsigned long long i, unsigned long long nb_i, void *arg) { (void) arg; for (; nb_i > 0; i++, nb_i--) { array[i] = 1; } } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; starpu_omp_for(for_g, NULL, NB_ITERS, CHUNK, starpu_omp_sched_static, 0, 0); } \endcode \sa starpu_omp_for() \sa starpu_omp_for_inline_first() \sa starpu_omp_for_inline_next() \sa starpu_omp_for_alt() \sa starpu_omp_for_inline_first_alt() \sa starpu_omp_for_inline_next_alt() \sa starpu_omp_ordered() \sa starpu_omp_ordered_inline_begin() \sa starpu_omp_ordered_inline_end() \subsection OMPSections Sections OpenMP sections worksharing constructs are supported using the set of starpu_omp_sections() variants. The general principle is either to provide an array of per-section functions or a single function that will redirect to execution to the suitable per-section functions. An implicit barrier can be enforced or skipped at the end of the worksharing construct, according to the value of the nowait parameter. \code{.c} void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; section_funcs[0] = f; section_funcs[1] = g; section_funcs[2] = h; section_funcs[3] = i; section_args[0] = arg_f; section_args[1] = arg_g; section_args[2] = arg_h; section_args[3] = arg_i; starpu_omp_sections(4, section_f, section_args, 0); } \endcode \sa starpu_omp_sections() \sa starpu_omp_sections_combined() \subsection OMPSingle Single OpenMP single workharing constructs are supported using the set of starpu_omp_single() variants. An implicit barrier can be enforced or skipped at the end of the worksharing construct, according to the value of the nowait parameter. \code{.c} void single_f(void *arg) { (void) arg; pthread_t tid = pthread_self(); int worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d -- single\n", (void *)tid, worker_id); } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; starpu_omp_single(single_f, NULL, 0); } \endcode The SORS also provides dedicated support for single sections with copyprivate clauses through the starpu_omp_single_copyprivate() function variants. The OpenMP master directive is supported as well using the starpu_omp_master() function variants. \sa starpu_omp_master() \sa starpu_omp_master_inline() \sa starpu_omp_single() \sa starpu_omp_single_inline() \sa starpu_omp_single_copyprivate() \sa starpu_omp_single_copyprivate_inline_begin() \sa starpu_omp_single_copyprivate_inline_end() \section Task Tasks The SORS implements the necessary support of OpenMP 3.1 and OpenMP 4.0's so-called explicit tasks, together with OpenMP 4.0's data dependency management. \subsection OMPTask Explicit Tasks Explicit OpenMP tasks are created with the SORS using the starpu_omp_task_region() function. The implementation supports if, final, untied and mergeable clauses as defined in the OpenMP specification. Unless specified otherwise by the appropriate clause(s), the created task may be executed by any participating worker of the current parallel region. The current SORS implementation requires explicit tasks to be created within the context of an active parallel region. In particular, an explicit task cannot be created by the main thread outside of a parallel region. Explicit OpenMP tasks created using starpu_omp_task_region() are implemented as StarPU tasks with extended semantics, and may as such be blocked and preempted by SORS routines. The current SORS implementation supports recursive explicit tasks creation, to ensure compliance with the OpenMP specification. However, it should be noted that StarPU is not designed nor optimized for efficiently scheduling of recursive task applications. The code below shows how to create 4 explicit tasks within a parallel region. \code{.c} void task_region_g(void *buffers[], void *args) { (void) buffers; (void) args; pthread tid = pthread_self(); int worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d: explicit task \"g\"\n", (void *)tid, worker_id); } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; struct starpu_omp_task_region_attr attr; memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = task_region_g; attr.cl.where = STARPU_CPU; attr.if_clause = 1; attr.final_clause = 0; attr.untied_clause = 1; attr.mergeable_clause = 0; starpu_omp_task_region(&attr); starpu_omp_task_region(&attr); starpu_omp_task_region(&attr); starpu_omp_task_region(&attr); } \endcode \sa struct starpu_omp_task_region_attr \sa starpu_omp_task_region() \subsection DataDependencies Data Dependencies The SORS implements inter-tasks data dependencies as specified in OpenMP 4.0. Data dependencies are expressed using regular StarPU data handles (starpu_data_handle_t) plugged into the task's attr.cl codelet. The family of starpu_vector_data_register() -like functions and the starpu_data_lookup() function may be used to register a memory area and to retrieve the current data handle associated with a pointer respectively. The testcase ./tests/openmp/task_02.c gives a detailed example of using OpenMP 4.0 tasks dependencies with the SORS implementation. Note: the OpenMP 4.0 specification only supports data dependencies between sibling tasks, that is tasks created by the same implicit or explicit parent task. The current SORS implementation also only supports data dependencies between sibling tasks. Consequently the behaviour is unspecified if dependencies are expressed beween tasks that have not been created by the same parent task. \subsection TaskSyncs TaskWait and TaskGroup The SORS implements both the taskwait and taskgroup OpenMP task synchronization constructs specified in OpenMP 4.0, with the starpu_omp_taskwait() and starpu_omp_taskgroup() functions respectively. An example of starpu_omp_taskwait() use, creating two explicit tasks and waiting for their completion: \code{.c} void task_region_g(void *buffers[], void *args) { (void) buffers; (void) args; printf("Hello, World!\n"); } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; struct starpu_omp_task_region_attr attr; memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = task_region_g; attr.cl.where = STARPU_CPU; attr.if_clause = 1; attr.final_clause = 0; attr.untied_clause = 1; attr.mergeable_clause = 0; starpu_omp_task_region(&attr); starpu_omp_task_region(&attr); starpu_omp_taskwait(); \endcode An example of starpu_omp_taskgroup() use, creating a task group of two explicit tasks: \code{.c} void task_region_g(void *buffers[], void *args) { (void) buffers; (void) args; printf("Hello, World!\n"); } void taskgroup_f(void *arg) { (void)arg; struct starpu_omp_task_region_attr attr; memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = task_region_g; attr.cl.where = STARPU_CPU; attr.if_clause = 1; attr.final_clause = 0; attr.untied_clause = 1; attr.mergeable_clause = 0; starpu_omp_task_region(&attr); starpu_omp_task_region(&attr); } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; starpu_omp_taskgroup(taskgroup_f, (void *)NULL); } \endcode \sa starpu_omp_task_region() \sa starpu_omp_taskwait() \sa starpu_omp_taskgroup() \sa starpu_omp_taskgroup_inline_begin() \sa starpu_omp_taskgroup_inline_end() \section Synchronization Synchronization Support The SORS implements objects and method to build common OpenMP synchronization constructs. \subsection SimpleLock Simple Locks The SORS Simple Locks are opaque starpu_omp_lock_t objects enabling multiple tasks to synchronize with each others, following the Simple Lock constructs defined by the OpenMP specification. In accordance with such specification, simple locks may not by acquired multiple times by the same task, without being released in-between; otherwise, deadlocks may result. Codes requiring the possibility to lock multiple times recursively should use Nestable Locks (\ref NestableLock). Codes NOT requiring the possibility to lock multiple times recursively should use Simple Locks as they incur less processing overhead than Nestable Locks. \sa starpu_omp_lock_t \sa starpu_omp_init_lock() \sa starpu_omp_destroy_lock() \sa starpu_omp_set_lock() \sa starpu_omp_unset_lock() \sa starpu_omp_test_lock() \subsection NestableLock Nestable Locks The SORS Nestable Locks are opaque starpu_omp_nest_lock_t objects enabling multiple tasks to synchronize with each others, following the Nestable Lock constructs defined by the OpenMP specification. In accordance with such specification, nestable locks may by acquired multiple times recursively by the same task without deadlocking. Nested locking and unlocking operations must be well parenthesized at any time, otherwise deadlock and/or undefined behaviour may occur. Codes requiring the possibility to lock multiple times recursively should use Nestable Locks. Codes NOT requiring the possibility to lock multiple times recursively should use Simple Locks (\ref SimpleLock) instead, as they incur less processing overhead than Nestable Locks. \sa starpu_omp_nest_lock_t \sa starpu_omp_init_nest_lock() \sa starpu_omp_destroy_nest_lock() \sa starpu_omp_set_nest_lock() \sa starpu_omp_unset_nest_lock() \sa starpu_omp_test_nest_lock() \subsection Critical Critical Sections The SORS implements support for OpenMP critical sections through the family of starpu_omp_critical functions. Critical sections may optionally be named. There is a single, common anonymous critical section. Mutual exclusion only occur within the scope of single critical section, either a named one or the anonymous one. \sa starpu_omp_critical() \sa starpu_omp_critical_inline_begin() \sa starpu_omp_critical_inline_end() \subsection Barrier Barriers The SORS provides the starpu_omp_barrier() function to implement barriers over parallel region teams. In accordance with the OpenMP specification, the starpu_omp_barrier() function waits for every implicit task of the parallel region to reach the barrier and every explicit task launched by the parallel region to complete, before returning. \sa starpu_omp_barrier() */ starpu-1.2.3+dfsg/doc/doxygen/chapters/501_environment_variables.doxy000066400000000000000000001121341320135501600256710ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \page ExecutionConfigurationThroughEnvironmentVariables Execution Configuration Through Environment Variables The behavior of the StarPU library and tools may be tuned thanks to the following environment variables. \section ConfiguringWorkers Configuring Workers
    STARPU_NCPU
    \anchor STARPU_NCPU \addindex __env__STARPU_NCPU Specify the number of CPU workers (thus not including workers dedicated to control accelerators). Note that by default, StarPU will not allocate more CPU workers than there are physical CPUs, and that some CPUs are used to control the accelerators.
    STARPU_NCPUS
    \anchor STARPU_NCPUS \addindex __env__STARPU_NCPUS This variable is deprecated. You should use \ref STARPU_NCPU.
    STARPU_NCUDA
    \anchor STARPU_NCUDA \addindex __env__STARPU_NCUDA Specify the number of CUDA devices that StarPU can use. If \ref STARPU_NCUDA is lower than the number of physical devices, it is possible to select which CUDA devices should be used by the means of the environment variable \ref STARPU_WORKERS_CUDAID. By default, StarPU will create as many CUDA workers as there are CUDA devices.
    STARPU_NWORKER_PER_CUDA
    \anchor STARPU_NWORKER_PER_CUDA \addindex __env__STARPU_NWORKER_PER_CUDA Specify the number of workers per CUDA device, and thus the number of kernels which will be concurrently running on the devices. The default value is 1.
    STARPU_CUDA_PIPELINE
    \anchor STARPU_CUDA_PIPELINE \addindex __env__STARPU_CUDA_PIPELINE Specify how many asynchronous tasks are submitted in advance on CUDA devices. This for instance permits to overlap task management with the execution of previous tasks, but it also allows concurrent execution on Fermi cards, which otherwise bring spurious synchronizations. The default is 2. Setting the value to 0 forces a synchronous execution of all tasks.
    STARPU_NOPENCL
    \anchor STARPU_NOPENCL \addindex __env__STARPU_NOPENCL OpenCL equivalent of the environment variable \ref STARPU_NCUDA.
    STARPU_OPENCL_PIPELINE
    \anchor STARPU_OPENCL_PIPELINE \addindex __env__STARPU_OPENCL_PIPELINE Specify how many asynchronous tasks are submitted in advance on OpenCL devices. This for instance permits to overlap task management with the execution of previous tasks, but it also allows concurrent execution on Fermi cards, which otherwise bring spurious synchronizations. The default is 2. Setting the value to 0 forces a synchronous execution of all tasks.
    STARPU_OPENCL_ON_CPUS
    \anchor STARPU_OPENCL_ON_CPUS \addindex __env__STARPU_OPENCL_ON_CPUS By default, the OpenCL driver only enables GPU and accelerator devices. By setting the environment variable \ref STARPU_OPENCL_ON_CPUS to 1, the OpenCL driver will also enable CPU devices.
    STARPU_OPENCL_ONLY_ON_CPUS
    \anchor STARPU_OPENCL_ONLY_ON_CPUS \addindex __env__STARPU_OPENCL_ONLY_ON_CPUS By default, the OpenCL driver enables GPU and accelerator devices. By setting the environment variable \ref STARPU_OPENCL_ONLY_ON_CPUS to 1, the OpenCL driver will ONLY enable CPU devices.
    STARPU_NMIC
    \anchor STARPU_NMIC \addindex __env__STARPU_NMIC MIC equivalent of the environment variable \ref STARPU_NCUDA, i.e. the number of MIC devices to use.
    STARPU_NMICTHREADS
    \anchor STARPU_NMICTHREADS \addindex __env__STARPU_NMICTHREADS Number of threads to use on the MIC devices.
    STARPU_NSCC
    \anchor STARPU_NSCC \addindex __env__STARPU_NSCC SCC equivalent of the environment variable \ref STARPU_NCUDA.
    STARPU_WORKERS_NOBIND
    \anchor STARPU_WORKERS_NOBIND \addindex __env__STARPU_WORKERS_NOBIND Setting it to non-zero will prevent StarPU from binding its threads to CPUs. This is for instance useful when running the testsuite in parallel.
    STARPU_WORKERS_CPUID
    \anchor STARPU_WORKERS_CPUID \addindex __env__STARPU_WORKERS_CPUID Passing an array of integers in \ref STARPU_WORKERS_CPUID specifies on which logical CPU the different workers should be bound. For instance, if STARPU_WORKERS_CPUID = "0 1 4 5", the first worker will be bound to logical CPU #0, the second CPU worker will be bound to logical CPU #1 and so on. Note that the logical ordering of the CPUs is either determined by the OS, or provided by the library hwloc in case it is available. Ranges can be provided: for instance, STARPU_WORKERS_CPUID = "1-3 5" will bind the first three workers on logical CPUs #1, #2, and #3, and the fourth worker on logical CPU #5. Unbound ranges can also be provided: STARPU_WORKERS_CPUID = "1-" will bind the workers starting from logical CPU #1 up to last CPU. Note that the first workers correspond to the CUDA workers, then come the OpenCL workers, and finally the CPU workers. For example if we have STARPU_NCUDA=1, STARPU_NOPENCL=1, STARPU_NCPU=2 and STARPU_WORKERS_CPUID = "0 2 1 3", the CUDA device will be controlled by logical CPU #0, the OpenCL device will be controlled by logical CPU #2, and the logical CPUs #1 and #3 will be used by the CPU workers. If the number of workers is larger than the array given in \ref STARPU_WORKERS_CPUID, the workers are bound to the logical CPUs in a round-robin fashion: if STARPU_WORKERS_CPUID = "0 1", the first and the third (resp. second and fourth) workers will be put on CPU #0 (resp. CPU #1). This variable is ignored if the field starpu_conf::use_explicit_workers_bindid passed to starpu_init() is set.
    STARPU_WORKERS_CUDAID
    \anchor STARPU_WORKERS_CUDAID \addindex __env__STARPU_WORKERS_CUDAID Similarly to the \ref STARPU_WORKERS_CPUID environment variable, it is possible to select which CUDA devices should be used by StarPU. On a machine equipped with 4 GPUs, setting STARPU_WORKERS_CUDAID = "1 3" and STARPU_NCUDA=2 specifies that 2 CUDA workers should be created, and that they should use CUDA devices #1 and #3 (the logical ordering of the devices is the one reported by CUDA). This variable is ignored if the field starpu_conf::use_explicit_workers_cuda_gpuid passed to starpu_init() is set.
    STARPU_WORKERS_OPENCLID
    \anchor STARPU_WORKERS_OPENCLID \addindex __env__STARPU_WORKERS_OPENCLID OpenCL equivalent of the \ref STARPU_WORKERS_CUDAID environment variable. This variable is ignored if the field starpu_conf::use_explicit_workers_opencl_gpuid passed to starpu_init() is set.
    STARPU_WORKERS_MICID
    \anchor STARPU_WORKERS_MICID \addindex __env__STARPU_WORKERS_MICID MIC equivalent of the \ref STARPU_WORKERS_CUDAID environment variable. This variable is ignored if the field starpu_conf::use_explicit_workers_mic_deviceid passed to starpu_init() is set.
    STARPU_WORKERS_SCCID
    \anchor STARPU_WORKERS_SCCID \addindex __env__STARPU_WORKERS_SCCID SCC equivalent of the \ref STARPU_WORKERS_CUDAID environment variable. This variable is ignored if the field starpu_conf::use_explicit_workers_scc_deviceid passed to starpu_init() is set.
    STARPU_WORKER_TREE
    \anchor STARPU_WORKER_TREE \addindex __env__STARPU_WORKER_TREE Define to 1 to enable the tree iterator in schedulers.
    STARPU_SINGLE_COMBINED_WORKER
    \anchor STARPU_SINGLE_COMBINED_WORKER \addindex __env__STARPU_SINGLE_COMBINED_WORKER If set, StarPU will create several workers which won't be able to work concurrently. It will by default create combined workers which size goes from 1 to the total number of CPU workers in the system. \ref STARPU_MIN_WORKERSIZE and \ref STARPU_MAX_WORKERSIZE can be used to change this default.
    STARPU_MIN_WORKERSIZE
    \anchor STARPU_MIN_WORKERSIZE \addindex __env__STARPU_MIN_WORKERSIZE \ref STARPU_MIN_WORKERSIZE permits to specify the minimum size of the combined workers (instead of the default 2)
    STARPU_MAX_WORKERSIZE
    \anchor STARPU_MAX_WORKERSIZE \addindex __env__STARPU_MAX_WORKERSIZE \ref STARPU_MAX_WORKERSIZE permits to specify the minimum size of the combined workers (instead of the number of CPU workers in the system)
    STARPU_SYNTHESIZE_ARITY_COMBINED_WORKER
    \anchor STARPU_SYNTHESIZE_ARITY_COMBINED_WORKER \addindex __env__STARPU_SYNTHESIZE_ARITY_COMBINED_WORKER Let the user decide how many elements are allowed between combined workers created from hwloc information. For instance, in the case of sockets with 6 cores without shared L2 caches, if \ref STARPU_SYNTHESIZE_ARITY_COMBINED_WORKER is set to 6, no combined worker will be synthesized beyond one for the socket and one per core. If it is set to 3, 3 intermediate combined workers will be synthesized, to divide the socket cores into 3 chunks of 2 cores. If it set to 2, 2 intermediate combined workers will be synthesized, to divide the the socket cores into 2 chunks of 3 cores, and then 3 additional combined workers will be synthesized, to divide the former synthesized workers into a bunch of 2 cores, and the remaining core (for which no combined worker is synthesized since there is already a normal worker for it). The default, 2, thus makes StarPU tend to building a binary trees of combined workers.
    STARPU_DISABLE_ASYNCHRONOUS_COPY
    \anchor STARPU_DISABLE_ASYNCHRONOUS_COPY \addindex __env__STARPU_DISABLE_ASYNCHRONOUS_COPY Disable asynchronous copies between CPU and GPU devices. The AMD implementation of OpenCL is known to fail when copying data asynchronously. When using this implementation, it is therefore necessary to disable asynchronous data transfers.
    STARPU_DISABLE_ASYNCHRONOUS_CUDA_COPY
    \anchor STARPU_DISABLE_ASYNCHRONOUS_CUDA_COPY \addindex __env__STARPU_DISABLE_ASYNCHRONOUS_CUDA_COPY Disable asynchronous copies between CPU and CUDA devices.
    STARPU_DISABLE_ASYNCHRONOUS_OPENCL_COPY
    \anchor STARPU_DISABLE_ASYNCHRONOUS_OPENCL_COPY \addindex __env__STARPU_DISABLE_ASYNCHRONOUS_OPENCL_COPY Disable asynchronous copies between CPU and OpenCL devices. The AMD implementation of OpenCL is known to fail when copying data asynchronously. When using this implementation, it is therefore necessary to disable asynchronous data transfers.
    STARPU_DISABLE_ASYNCHRONOUS_MIC_COPY
    \anchor STARPU_DISABLE_ASYNCHRONOUS_MIC_COPY \addindex __env__STARPU_DISABLE_ASYNCHRONOUS_MIC_COPY Disable asynchronous copies between CPU and MIC devices.
    STARPU_ENABLE_CUDA_GPU_GPU_DIRECT
    \anchor STARPU_ENABLE_CUDA_GPU_GPU_DIRECT \addindex __env__STARPU_ENABLE_CUDA_GPU_GPU_DIRECT Enable (1) or Disable (0) direct CUDA transfers from GPU to GPU, without copying through RAM. The default is Enabled. This permits to test the performance effect of GPU-Direct.
    STARPU_DISABLE_PINNING
    \anchor STARPU_DISABLE_PINNING \addindex __env__STARPU_DISABLE_PINNING Disable (1) or Enable (0) pinning host memory allocated through starpu_malloc, starpu_memory_pin and friends. The default is Enabled. This permits to test the performance effect of memory pinning.
    STARPU_MIC_SINK_PROGRAM_NAME
    \anchor STARPU_MIC_SINK_PROGRAM_NAME \addindex __env__STARPU_MIC_SINK_PROGRAM_NAME todo
    STARPU_MIC_SINK_PROGRAM_PATH
    \anchor STARPU_MIC_SINK_PROGRAM_PATH \addindex __env__STARPU_MIC_SINK_PROGRAM_PATH todo
    STARPU_MIC_PROGRAM_PATH
    \anchor STARPU_MIC_PROGRAM_PATH \addindex __env__STARPU_MIC_PROGRAM_PATH todo
    \section ConfiguringTheSchedulingEngine Configuring The Scheduling Engine
    STARPU_SCHED
    \anchor STARPU_SCHED \addindex __env__STARPU_SCHED Choose between the different scheduling policies proposed by StarPU: work random, stealing, greedy, with performance models, etc. Use STARPU_SCHED=help to get the list of available schedulers.
    STARPU_MIN_PRIO
    \anchor STARPU_MIN_PRIO_env \addindex __env__STARPU_MIN_PRIO Set the mininum priority used by priorities-aware schedulers.
    STARPU_MAX_PRIO
    \anchor STARPU_MAX_PRIO_env \addindex __env__STARPU_MAX_PRIO Set the maximum priority used by priorities-aware schedulers.
    STARPU_CALIBRATE
    \anchor STARPU_CALIBRATE \addindex __env__STARPU_CALIBRATE If this variable is set to 1, the performance models are calibrated during the execution. If it is set to 2, the previous values are dropped to restart calibration from scratch. Setting this variable to 0 disable calibration, this is the default behaviour. Note: this currently only applies to dm and dmda scheduling policies.
    STARPU_CALIBRATE_MINIMUM
    \anchor STARPU_CALIBRATE_MINIMUM \addindex __env__STARPU_CALIBRATE_MINIMUM This defines the minimum number of calibration measurements that will be made before considering that the performance model is calibrated. The default value is 10.
    STARPU_BUS_CALIBRATE
    \anchor STARPU_BUS_CALIBRATE \addindex __env__STARPU_BUS_CALIBRATE If this variable is set to 1, the bus is recalibrated during intialization.
    STARPU_PREFETCH
    \anchor STARPU_PREFETCH \addindex __env__STARPU_PREFETCH This variable indicates whether data prefetching should be enabled (0 means that it is disabled). If prefetching is enabled, when a task is scheduled to be executed e.g. on a GPU, StarPU will request an asynchronous transfer in advance, so that data is already present on the GPU when the task starts. As a result, computation and data transfers are overlapped. Note that prefetching is enabled by default in StarPU.
    STARPU_SCHED_ALPHA
    \anchor STARPU_SCHED_ALPHA \addindex __env__STARPU_SCHED_ALPHA To estimate the cost of a task StarPU takes into account the estimated computation time (obtained thanks to performance models). The alpha factor is the coefficient to be applied to it before adding it to the communication part.
    STARPU_SCHED_BETA
    \anchor STARPU_SCHED_BETA \addindex __env__STARPU_SCHED_BETA To estimate the cost of a task StarPU takes into account the estimated data transfer time (obtained thanks to performance models). The beta factor is the coefficient to be applied to it before adding it to the computation part.
    STARPU_SCHED_GAMMA
    \anchor STARPU_SCHED_GAMMA \addindex __env__STARPU_SCHED_GAMMA Define the execution time penalty of a joule (\ref Energy-basedScheduling).
    STARPU_IDLE_POWER
    \anchor STARPU_IDLE_POWER \addindex __env__STARPU_IDLE_POWER Define the idle power of the machine (\ref Energy-basedScheduling).
    STARPU_PROFILING
    \anchor STARPU_PROFILING \addindex __env__STARPU_PROFILING Enable on-line performance monitoring (\ref EnablingOn-linePerformanceMonitoring).
    \section Extensions Extensions
    SOCL_OCL_LIB_OPENCL
    \anchor SOCL_OCL_LIB_OPENCL \addindex __env__SOCL_OCL_LIB_OPENCL THE SOCL test suite is only run when the environment variable \ref SOCL_OCL_LIB_OPENCL is defined. It should contain the location of the file libOpenCL.so of the OCL ICD implementation.
    OCL_ICD_VENDORS
    \anchor OCL_ICD_VENDORS \addindex __env__OCL_ICD_VENDORS When using SOCL with OpenCL ICD (https://forge.imag.fr/projects/ocl-icd/), this variable may be used to point to the directory where ICD files are installed. The default directory is /etc/OpenCL/vendors. StarPU installs ICD files in the directory $prefix/share/starpu/opencl/vendors.
    STARPU_COMM_STATS
    \anchor STARPU_COMM_STATS \addindex __env__STARPU_COMM_STATS Communication statistics for starpumpi (\ref MPISupport) will be enabled when the environment variable \ref STARPU_COMM_STATS is defined to an value other than 0.
    STARPU_MPI_CACHE
    \anchor STARPU_MPI_CACHE \addindex __env__STARPU_MPI_CACHE Communication cache for starpumpi (\ref MPISupport) will be disabled when the environment variable \ref STARPU_MPI_CACHE is set to 0. It is enabled by default or for any other values of the variable \ref STARPU_MPI_CACHE.
    STARPU_MPI_COMM
    \anchor STARPU_MPI_COMM \addindex __env__STARPU_MPI_COMM Communication trace for starpumpi (\ref MPISupport) will be enabled when the environment variable \ref STARPU_MPI_COMM is set to 1, and StarPU has been configured with the option \ref enable-verbose "--enable-verbose".
    STARPU_MPI_CACHE_STATS
    \anchor STARPU_MPI_CACHE_STATS \addindex __env__STARPU_MPI_CACHE_STATS When set to 1, statistics are enabled for the communication cache (\ref MPISupport). For now, it prints messages on the standard output when data are added or removed from the received communication cache.
    STARPU_MPI_FAKE_SIZE
    \anchor STARPU_MPI_FAKE_SIZE \addindex __env__STARPU_MPI_FAKE_SIZE Setting to a number makes StarPU believe that there are as many MPI nodes, even if it was run on only one MPI node. This allows e.g. to simulate the execution of one of the nodes of a big cluster without actually running the rest. It of course does not provide computation results and timing.
    STARPU_MPI_FAKE_RANK
    \anchor STARPU_MPI_FAKE_RANK \addindex __env__STARPU_MPI_FAKE_RANK Setting to a number makes StarPU believe that it runs the given MPI node, even if it was run on only one MPI node. This allows e.g. to simulate the execution of one of the nodes of a big cluster without actually running the rest. It of course does not provide computation results and timing.
    STARPU_SIMGRID_CUDA_MALLOC_COST
    \anchor STARPU_SIMGRID_CUDA_MALLOC_COST \addindex __env__STARPU_SIMGRID_CUDA_MALLOC_COST When set to 1 (which is the default), CUDA malloc costs are taken into account in simgrid mode.
    STARPU_SIMGRID_CUDA_QUEUE_COST
    \anchor STARPU_SIMGRID_CUDA_QUEUE_COST \addindex __env__STARPU_SIMGRID_CUDA_QUEUE_COST When set to 1 (which is the default), CUDA task and transfer queueing costs are taken into account in simgrid mode.
    STARPU_PCI_FLAT
    \anchor STARPU_PCI_FLAT \addindex __env__STARPU_PCI_FLAT When unset or set to to 0, the platform file created for simgrid will contain PCI bandwidths and routes.
    STARPU_SIMGRID_QUEUE_MALLOC_COST
    \anchor STARPU_SIMGRID_QUEUE_MALLOC_COST \addindex __env__STARPU_SIMGRID_QUEUE_MALLOC_COST When unset or set to 1, simulate within simgrid the GPU transfer queueing.
    STARPU_MALLOC_SIMULATION_FOLD
    \anchor STARPU_MALLOC_SIMULATION_FOLD \addindex __env__STARPU_MALLOC_SIMULATION_FOLD This defines the size of the file used for folding virtual allocation, in MiB. The default is 1, thus allowing 64GiB virtual memory when Linux's sysctl vm.max_map_count value is the default 65535.
    \section MiscellaneousAndDebug Miscellaneous And Debug
    STARPU_HOME
    \anchor STARPU_HOME \addindex __env__STARPU_HOME This specifies the main directory in which StarPU stores its configuration files. The default is $HOME on Unix environments, and $USERPROFILE on Windows environments.
    STARPU_PATH
    \anchor STARPU_PATH \addindex __env__STARPU_PATH Only used on Windows environments. This specifies the main directory in which StarPU is installed (\ref RunningABasicStarPUApplicationOnMicrosoft)
    STARPU_PERF_MODEL_DIR
    \anchor STARPU_PERF_MODEL_DIR \addindex __env__STARPU_PERF_MODEL_DIR This specifies the main directory in which StarPU stores its performance model files. The default is $STARPU_HOME/.starpu/sampling.
    STARPU_PERF_MODEL_HOMOGENEOUS_CPU
    \anchor STARPU_PERF_MODEL_HOMOGENEOUS_CPU \addindex __env__STARPU_PERF_MODEL_HOMOGENEOUS_CPU When this is set to 0, StarPU will assume that CPU devices do not have the same performance, and thus use different performance models for them, thus making kernel calibration much longer, since measurements have to be made for each CPU core.
    STARPU_PERF_MODEL_HOMOGENEOUS_CUDA
    \anchor STARPU_PERF_MODEL_HOMOGENEOUS_CUDA \addindex __env__STARPU_PERF_MODEL_HOMOGENEOUS_CUDA When this is set to 1, StarPU will assume that all CUDA devices have the same performance, and thus share performance models for them, thus allowing kernel calibration to be much faster, since measurements only have to be once for all CUDA GPUs.
    STARPU_PERF_MODEL_HOMOGENEOUS_OPENCL
    \anchor STARPU_PERF_MODEL_HOMOGENEOUS_OPENCL \addindex __env__STARPU_PERF_MODEL_HOMOGENEOUS_OPENCL When this is set to 1, StarPU will assume that all OPENCL devices have the same performance, and thus share performance models for them, thus allowing kernel calibration to be much faster, since measurements only have to be once for all OPENCL GPUs.
    STARPU_PERF_MODEL_HOMOGENEOUS_MIC
    \anchor STARPU_PERF_MODEL_HOMOGENEOUS_MIC \addindex __env__STARPU_PERF_MODEL_HOMOGENEOUS_MIC When this is set to 1, StarPU will assume that all MIC devices have the same performance, and thus share performance models for them, thus allowing kernel calibration to be much faster, since measurements only have to be once for all MIC GPUs.
    STARPU_PERF_MODEL_HOMOGENEOUS_SCC
    \anchor STARPU_PERF_MODEL_HOMOGENEOUS_SCC \addindex __env__STARPU_PERF_MODEL_HOMOGENEOUS_SCC When this is set to 1, StarPU will assume that all SCC devices have the same performance, and thus share performance models for them, thus allowing kernel calibration to be much faster, since measurements only have to be once for all SCC GPUs.
    STARPU_HOSTNAME
    \anchor STARPU_HOSTNAME \addindex __env__STARPU_HOSTNAME When set, force the hostname to be used when dealing performance model files. Models are indexed by machine name. When running for example on a homogenenous cluster, it is possible to share the models between machines by setting export STARPU_HOSTNAME=some_global_name.
    STARPU_OPENCL_PROGRAM_DIR
    \anchor STARPU_OPENCL_PROGRAM_DIR \addindex __env__STARPU_OPENCL_PROGRAM_DIR This specifies the directory where the OpenCL codelet source files are located. The function starpu_opencl_load_program_source() looks for the codelet in the current directory, in the directory specified by the environment variable \ref STARPU_OPENCL_PROGRAM_DIR, in the directory share/starpu/opencl of the installation directory of StarPU, and finally in the source directory of StarPU.
    STARPU_SILENT
    \anchor STARPU_SILENT \addindex __env__STARPU_SILENT This variable allows to disable verbose mode at runtime when StarPU has been configured with the option \ref enable-verbose "--enable-verbose". It also disables the display of StarPU information and warning messages.
    STARPU_LOGFILENAME
    \anchor STARPU_LOGFILENAME \addindex __env__STARPU_LOGFILENAME This variable specifies in which file the debugging output should be saved to.
    STARPU_FXT_PREFIX
    \anchor STARPU_FXT_PREFIX \addindex __env__STARPU_FXT_PREFIX This variable specifies in which directory to save the trace generated if FxT is enabled. It needs to have a trailing '/' character.
    STARPU_FXT_TRACE
    \anchor STARPU_FXT_TRACE \addindex __env__STARPU_FXT_TRACE This variable specifies whether to generate (1) or not (0) the FxT trace in /tmp/prof_file_XXX_YYY . The default is 1 (generate it)
    STARPU_LIMIT_CUDA_devid_MEM
    \anchor STARPU_LIMIT_CUDA_devid_MEM \addindex __env__STARPU_LIMIT_CUDA_devid_MEM This variable specifies the maximum number of megabytes that should be available to the application on the CUDA device with the identifier devid. This variable is intended to be used for experimental purposes as it emulates devices that have a limited amount of memory. When defined, the variable overwrites the value of the variable \ref STARPU_LIMIT_CUDA_MEM.
    STARPU_LIMIT_CUDA_MEM
    \anchor STARPU_LIMIT_CUDA_MEM \addindex __env__STARPU_LIMIT_CUDA_MEM This variable specifies the maximum number of megabytes that should be available to the application on each CUDA devices. This variable is intended to be used for experimental purposes as it emulates devices that have a limited amount of memory.
    STARPU_LIMIT_OPENCL_devid_MEM
    \anchor STARPU_LIMIT_OPENCL_devid_MEM \addindex __env__STARPU_LIMIT_OPENCL_devid_MEM This variable specifies the maximum number of megabytes that should be available to the application on the OpenCL device with the identifier devid. This variable is intended to be used for experimental purposes as it emulates devices that have a limited amount of memory. When defined, the variable overwrites the value of the variable \ref STARPU_LIMIT_OPENCL_MEM.
    STARPU_LIMIT_OPENCL_MEM
    \anchor STARPU_LIMIT_OPENCL_MEM \addindex __env__STARPU_LIMIT_OPENCL_MEM This variable specifies the maximum number of megabytes that should be available to the application on each OpenCL devices. This variable is intended to be used for experimental purposes as it emulates devices that have a limited amount of memory.
    STARPU_LIMIT_CPU_MEM
    \anchor STARPU_LIMIT_CPU_MEM \addindex __env__STARPU_LIMIT_CPU_MEM This variable specifies the maximum number of megabytes that should be available to the application in the main CPU memory. Setting it enables allocation cache in main memory. Setting it to zero lets StarPU overflow memory.
    STARPU_MINIMUM_AVAILABLE_MEM
    \anchor STARPU_MINIMUM_AVAILABLE_MEM \addindex __env__STARPU_MINIMUM_AVAILABLE_MEM This specifies the minimum percentage of memory that should be available in GPUs (or in main memory, when using out of core), below which a reclaiming pass is performed. The default is 5%.
    STARPU_TARGET_AVAILABLE_MEM
    \anchor STARPU_TARGET_AVAILABLE_MEM \addindex __env__STARPU_TARGET_AVAILABLE_MEM This specifies the target percentage of memory that should be reached in GPUs (or in main memory, when using out of core), when performing a periodic reclaiming pass. The default is 10%.
    STARPU_MINIMUM_CLEAN_BUFFERS
    \anchor STARPU_MINIMUM_CLEAN_BUFFERS \addindex __env__STARPU_MINIMUM_CLEAN_BUFFERS This specifies the minimum percentage of number of buffers that should be clean in GPUs (or in main memory, when using out of core), below which asynchronous writebacks will be issued. The default is to disable asynchronous writebacks.
    STARPU_TARGET_CLEAN_BUFFERS
    \anchor STARPU_TARGET_CLEAN_BUFFERS \addindex __env__STARPU_TARGET_CLEAN_BUFFERS This specifies the target percentage of number of buffers that should be reached in GPUs (or in main memory, when using out of core), when performing an asynchronous writeback pass. The default is to disable asynchronous writebacks.
    STARPU_DISK_SWAP
    \anchor STARPU_DISK_SWAP \addindex __env__STARPU_DISK_SWAP This specifies a path where StarPU can push data when the main memory is getting full.
    STARPU_DISK_SWAP_BACKEND
    \anchor STARPU_DISK_SWAP_BACKEND \addindex __env__STARPU_DISK_SWAP_BACKEND This specifies then backend to be used by StarPU to push data when the main memory is getting full. The default is unistd (i.e. using read/write functions), other values are stdio (i.e. using fread/fwrite), unistd_o_direct (i.e. using read/write with O_DIRECT), and leveldb (i.e. using a leveldb database).
    STARPU_DISK_SWAP_SIZE
    \anchor STARPU_DISK_SWAP_SIZE \addindex __env__STARPU_DISK_SWAP_SIZE This specifies then maximum size in MiB to be used by StarPU to push data when the main memory is getting full. The default is unlimited.
    STARPU_LIMIT_MAX_SUBMITTED_TASKS
    \anchor STARPU_LIMIT_MAX_SUBMITTED_TASKS \addindex __env__STARPU_LIMIT_MAX_SUBMITTED_TASKS This variable allows the user to control the task submission flow by specifying to StarPU a maximum number of submitted tasks allowed at a given time, i.e. when this limit is reached task submission becomes blocking until enough tasks have completed, specified by \ref STARPU_LIMIT_MIN_SUBMITTED_TASKS. Setting it enables allocation cache buffer reuse in main memory.
    STARPU_LIMIT_MIN_SUBMITTED_TASKS
    \anchor STARPU_LIMIT_MIN_SUBMITTED_TASKS \addindex __env__STARPU_LIMIT_MIN_SUBMITTED_TASKS This variable allows the user to control the task submission flow by specifying to StarPU a submitted task threshold to wait before unblocking task submission. This variable has to be used in conjunction with \ref STARPU_LIMIT_MAX_SUBMITTED_TASKS which puts the task submission thread to sleep. Setting it enables allocation cache buffer reuse in main memory.
    STARPU_TRACE_BUFFER_SIZE
    \anchor STARPU_TRACE_BUFFER_SIZE \addindex __env__STARPU_TRACE_BUFFER_SIZE This sets the buffer size for recording trace events in MiB. Setting it to a big size allows to avoid pauses in the trace while it is recorded on the disk. This however also consumes memory, of course. The default value is 64.
    STARPU_GENERATE_TRACE
    \anchor STARPU_GENERATE_TRACE \addindex __env__STARPU_GENERATE_TRACE When set to 1, this variable indicates that StarPU should automatically generate a Paje trace when starpu_shutdown() is called.
    STARPU_MEMORY_STATS
    \anchor STARPU_MEMORY_STATS \addindex __env__STARPU_MEMORY_STATS When set to 0, disable the display of memory statistics on data which have not been unregistered at the end of the execution (\ref MemoryFeedback).
    STARPU_MAX_MEMORY_USE
    \anchor STARPU_MAX_MEMORY_USE \addindex __env__STARPU_MAX_MEMORY_USE When set to 1, display at the end of the execution the maximum memory used by StarPU for internal data structures during execution.
    STARPU_BUS_STATS
    \anchor STARPU_BUS_STATS \addindex __env__STARPU_BUS_STATS When defined, statistics about data transfers will be displayed when calling starpu_shutdown() (\ref Profiling).
    STARPU_WORKER_STATS
    \anchor STARPU_WORKER_STATS \addindex __env__STARPU_WORKER_STATS When defined, statistics about the workers will be displayed when calling starpu_shutdown() (\ref Profiling). When combined with the environment variable \ref STARPU_PROFILING, it displays the energy consumption (\ref Energy-basedScheduling).
    STARPU_STATS
    \anchor STARPU_STATS \addindex __env__STARPU_STATS When set to 0, data statistics will not be displayed at the end of the execution of an application (\ref DataStatistics).
    STARPU_WATCHDOG_TIMEOUT
    \anchor STARPU_WATCHDOG_TIMEOUT \addindex __env__STARPU_WATCHDOG_TIMEOUT When set to a value other than 0, allows to make StarPU print an error message whenever StarPU does not terminate any task for the given time (in µs), but lets the application continue normally. Should be used in combination with \ref STARPU_WATCHDOG_CRASH (see \ref DetectionStuckConditions).
    STARPU_WATCHDOG_CRASH
    \anchor STARPU_WATCHDOG_CRASH \addindex __env__STARPU_WATCHDOG_CRASH When set to a value other than 0, it triggers a crash when the watch dog is reached, thus allowing to catch the situation in gdb, etc (see \ref DetectionStuckConditions)
    STARPU_WATCHDOG_DELAY
    \anchor STARPU_WATCHDOG_DELAY \addindex __env__STARPU_WATCHDOG_DELAY This delays the activation of the watchdog by the given time (in µs). This can be convenient for letting the application initialize data etc. before starting to look for idle time.
    STARPU_TASK_BREAK_ON_PUSH
    \anchor STARPU_TASK_BREAK_ON_PUSH \addindex __env__STARPU_TASK_BREAK_ON_PUSH When this variable contains a job id, StarPU will raise SIGTRAP when the task with that job id is being pushed to the scheduler, which will be nicely catched by debuggers (see \ref DebuggingScheduling)
    STARPU_TASK_BREAK_ON_SCHED
    \anchor STARPU_TASK_BREAK_ON_SCHED \addindex __env__STARPU_TASK_BREAK_ON_SCHED When this variable contains a job id, StarPU will raise SIGTRAP when the task with that job id is being scheduled by the scheduler (at a scheduler-specific point), which will be nicely catched by debuggers. This only works for schedulers which have such a scheduling point defined (see \ref DebuggingScheduling)
    STARPU_TASK_BREAK_ON_POP
    \anchor STARPU_TASK_BREAK_ON_POP \addindex __env__STARPU_TASK_BREAK_ON_POP When this variable contains a job id, StarPU will raise SIGTRAP when the task with that job id is being popped from the scheduler, which will be nicely catched by debuggers (see \ref DebuggingScheduling)
    STARPU_TASK_BREAK_ON_EXEC
    \anchor STARPU_TASK_BREAK_ON_EXEC \addindex __env__STARPU_TASK_BREAK_ON_EXEC When this variable contains a job id, StarPU will raise SIGTRAP when the task with that job id is being executed, which will be nicely catched by debuggers (see \ref DebuggingScheduling)
    STARPU_DISABLE_KERNELS
    \anchor STARPU_DISABLE_KERNELS \addindex __env__STARPU_DISABLE_KERNELS When set to a value other than 1, it disables actually calling the kernel functions, thus allowing to quickly check that the task scheme is working properly, without performing the actual application-provided computation.
    STARPU_HISTORY_MAX_ERROR
    \anchor STARPU_HISTORY_MAX_ERROR \addindex __env__STARPU_HISTORY_MAX_ERROR History-based performance models will drop measurements which are really far froom the measured average. This specifies the allowed variation. The default is 50 (%), i.e. the measurement is allowed to be x1.5 faster or /1.5 slower than the average.
    STARPU_RAND_SEED
    \anchor STARPU_RAND_SEED \addindex __env__STARPU_RAND_SEED The random scheduler and some examples use random numbers for their own working. Depending on the examples, the seed is by default juste always 0 or the current time() (unless simgrid mode is enabled, in which case it is always 0). \ref STARPU_RAND_SEED allows to set the seed to a specific value.
    STARPU_IDLE_TIME
    \anchor STARPU_IDLE_TIME \addindex __env__STARPU_IDLE_TIME When set to a value being a valid filename, a corresponding file will be created when shutting down StarPU. The file will contain the sum of all the workers' idle time.
    STARPU_GLOBAL_ARBITER
    \anchor STARPU_GLOBAL_ARBITER \addindex __env__STARPU_GLOBAL_ARBITER When set to a positive value, StarPU will create a arbiter, which implements an advanced but centralized management of concurrent data accesses (see \ref ConcurrentDataAccess).
    \section ConfiguringTheHypervisor Configuring The Hypervisor
    SC_HYPERVISOR_POLICY
    \anchor SC_HYPERVISOR_POLICY \addindex __env__SC_HYPERVISOR_POLICY Choose between the different resizing policies proposed by StarPU for the hypervisor: idle, app_driven, feft_lp, teft_lp; ispeed_lp, throughput_lp etc. Use SC_HYPERVISOR_POLICY=help to get the list of available policies for the hypervisor
    SC_HYPERVISOR_TRIGGER_RESIZE
    \anchor SC_HYPERVISOR_TRIGGER_RESIZE \addindex __env__SC_HYPERVISOR_TRIGGER_RESIZE Choose how should the hypervisor be triggered: speed if the resizing algorithm should be called whenever the speed of the context does not correspond to an optimal precomputed value, idle it the resizing algorithm should be called whenever the workers are idle for a period longer than the value indicated when configuring the hypervisor.
    SC_HYPERVISOR_START_RESIZE
    \anchor SC_HYPERVISOR_START_RESIZE \addindex __env__SC_HYPERVISOR_START_RESIZE Indicate the moment when the resizing should be available. The value correspond to the percentage of the total time of execution of the application. The default value is the resizing frame.
    SC_HYPERVISOR_MAX_SPEED_GAP
    \anchor SC_HYPERVISOR_MAX_SPEED_GAP \addindex __env__SC_HYPERVISOR_MAX_SPEED_GAP Indicate the ratio of speed difference between contexts that should trigger the hypervisor. This situation may occur only when a theoretical speed could not be computed and the hypervisor has no value to compare the speed to. Otherwise the resizing of a context is not influenced by the the speed of the other contexts, but only by the the value that a context should have.
    SC_HYPERVISOR_STOP_PRINT
    \anchor SC_HYPERVISOR_STOP_PRINT \addindex __env__SC_HYPERVISOR_STOP_PRINT By default the values of the speed of the workers is printed during the execution of the application. If the value 1 is given to this environment variable this printing is not done.
    SC_HYPERVISOR_LAZY_RESIZE
    \anchor SC_HYPERVISOR_LAZY_RESIZE \addindex __env__SC_HYPERVISOR_LAZY_RESIZE By default the hypervisor resizes the contexts in a lazy way, that is workers are firstly added to a new context before removing them from the previous one. Once this workers are clearly taken into account into the new context (a task was poped there) we remove them from the previous one. However if the application would like that the change in the distribution of workers should change right away this variable should be set to 0
    SC_HYPERVISOR_SAMPLE_CRITERIA
    \anchor SC_HYPERVISOR_SAMPLE_CRITERIA \addindex __env__SC_HYPERVISOR_SAMPLE_CRITERIA By default the hypervisor uses a sample of flops when computing the speed of the contexts and of the workers. If this variable is set to time the hypervisor uses a sample of time (10% of an aproximation of the total execution time of the application)
    */ starpu-1.2.3+dfsg/doc/doxygen/chapters/510_configure_options.doxy000066400000000000000000000442601320135501600250350ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \page CompilationConfiguration Compilation Configuration The behavior of the StarPU library and tools may be tuned thanks to the following configure options. \section CommonConfiguration Common Configuration
    --enable-debug
    \anchor enable-debug \addindex __configure__--enable-debug Enable debugging messages.
    --enable-spinlock-check
    \anchor enable-spinlock-check \addindex __configure__--enable-spinlock-check Enable checking that spinlocks are taken and released properly.
    --enable-fast
    \anchor enable-fast \addindex __configure__--enable-fast Disable assertion checks, which saves computation time.
    --enable-verbose
    \anchor enable-verbose \addindex __configure__--enable-verbose Increase the verbosity of the debugging messages. This can be disabled at runtime by setting the environment variable \ref STARPU_SILENT to any value. --enable-verbose=extra increase even more the verbosity. \verbatim $ STARPU_SILENT=1 ./vector_scal \endverbatim
    --enable-coverage
    \anchor enable-coverage \addindex __configure__--enable-coverage Enable flags for the coverage tool gcov.
    --enable-quick-check
    \anchor enable-quick-check \addindex __configure__--enable-quick-check Specify tests and examples should be run on a smaller data set, i.e allowing a faster execution time
    --enable-long-check
    \anchor enable-long-check \addindex __configure__--enable-long-check Enable some exhaustive checks which take a really long time.
    --enable-new-check
    \anchor enable-new-check \addindex __configure__--enable-new-check Enable new testcases which are known to fail.
    --with-hwloc
    \anchor with-hwloc \addindex __configure__--with-hwloc Specify hwloc should be used by StarPU. hwloc should be found by the means of the tool pkg-config.
    --with-hwloc=prefix
    \anchor with-hwloc \addindex __configure__--with-hwloc Specify hwloc should be used by StarPU. hwloc should be found in the directory specified by prefix
    --without-hwloc
    \anchor without-hwloc \addindex __configure__--without-hwloc Specify hwloc should not be used by StarPU.
    --disable-build-doc
    \anchor disable-build-doc \addindex __configure__--disable-build-doc Disable the creation of the documentation. This should be done on a machine which does not have the tools doxygen and latex (plus the packages latex-xcolor and texlive-latex-extra).
    Additionally, the script configure recognize many variables, which can be listed by typing ./configure --help. For example, ./configure NVCCFLAGS="-arch sm_20" adds a flag for the compilation of CUDA kernels, and NVCC_CC=gcc-5 allows to change the C++ compiler used by nvcc. \section ConfiguringWorkers Configuring Workers
    --enable-blocking-drivers
    \anchor enable-blocking-drivers \addindex __configure__--enable-blocking-drivers By default, StarPU keeps CPU workers awake permanently, for better reactivity. This option makes StarPU put CPU workers to real sleep when there are not enough tasks to compute. Use at most count CPU cores. This information is then available as the macro ::STARPU_MAXCPUS.
    --enable-maxcpus=count
    \anchor enable-maxcpus \addindex __configure__--enable-maxcpus Use at most count CPU cores. This information is then available as the macro ::STARPU_MAXCPUS.
    --disable-cpu
    \anchor disable-cpu \addindex __configure__--disable-cpu Disable the use of CPUs of the machine. Only GPUs etc. will be used.
    --enable-maxcudadev=count
    \anchor enable-maxcudadev \addindex __configure__--enable-maxcudadev Use at most count CUDA devices. This information is then available as the macro ::STARPU_MAXCUDADEVS.
    --disable-cuda
    \anchor disable-cuda \addindex __configure__--disable-cuda Disable the use of CUDA, even if a valid CUDA installation was detected.
    --with-cuda-dir=prefix
    \anchor with-cuda-dir \addindex __configure__--with-cuda-dir Search for CUDA under prefix, which should notably contain the file include/cuda.h.
    --with-cuda-include-dir=dir
    \anchor with-cuda-include-dir \addindex __configure__--with-cuda-include-dir Search for CUDA headers under dir, which should notably contain the file cuda.h. This defaults to /include appended to the value given to \ref with-cuda-dir "--with-cuda-dir".
    --with-cuda-lib-dir=dir
    \anchor with-cuda-lib-dir \addindex __configure__--with-cuda-lib-dir Search for CUDA libraries under dir, which should notably contain the CUDA shared libraries---e.g., libcuda.so. This defaults to /lib appended to the value given to \ref with-cuda-dir "--with-cuda-dir".
    --disable-cuda-memcpy-peer
    \anchor disable-cuda-memcpy-peer \addindex __configure__--disable-cuda-memcpy-peer Explicitly disable peer transfers when using CUDA 4.0.
    --enable-maxopencldev=count
    \anchor enable-maxopencldev \addindex __configure__--enable-maxopencldev Use at most count OpenCL devices. This information is then available as the macro ::STARPU_MAXOPENCLDEVS.
    --disable-opencl
    \anchor disable-opencl \addindex __configure__--disable-opencl Disable the use of OpenCL, even if the SDK is detected.
    --with-opencl-dir=prefix
    \anchor with-opencl-dir \addindex __configure__--with-opencl-dir Search for an OpenCL implementation under prefix, which should notably contain include/CL/cl.h (or include/OpenCL/cl.h on Mac OS).
    --with-opencl-include-dir=dir
    \anchor with-opencl-include-dir \addindex __configure__--with-opencl-include-dir Search for OpenCL headers under dir, which should notably contain CL/cl.h (or OpenCL/cl.h on Mac OS). This defaults to /include appended to the value given to \ref with-opencl-dir "--with-opencl-dir".
    --with-opencl-lib-dir=dir
    \anchor with-opencl-lib-dir \addindex __configure__--with-opencl-lib-dir Search for an OpenCL library under dir, which should notably contain the OpenCL shared libraries---e.g. libOpenCL.so. This defaults to /lib appended to the value given to \ref with-opencl-dir "--with-opencl-dir".
    --enable-opencl-simulator
    \anchor enable-opencl-simulator \addindex __configure__--enable-opencl-simulator Enable considering the provided OpenCL implementation as a simulator, i.e. use the kernel duration returned by OpenCL profiling information as wallclock time instead of the actual measured real time. This requires simgrid support.
    --enable-maximplementations=count
    \anchor enable-maximplementations \addindex __configure__--enable-maximplementations Allow for at most count codelet implementations for the same target device. This information is then available as the macro ::STARPU_MAXIMPLEMENTATIONS macro.
    --enable-max-sched-ctxs=count
    \anchor enable-max-sched-ctxs \addindex __configure__--enable-max-sched-ctxs Allow for at most count scheduling contexts This information is then available as the macro ::STARPU_NMAX_SCHED_CTXS.
    --disable-asynchronous-copy
    \anchor disable-asynchronous-copy \addindex __configure__--disable-asynchronous-copy Disable asynchronous copies between CPU and GPU devices. The AMD implementation of OpenCL is known to fail when copying data asynchronously. When using this implementation, it is therefore necessary to disable asynchronous data transfers.
    --disable-asynchronous-cuda-copy
    \anchor disable-asynchronous-cuda-copy \addindex __configure__--disable-asynchronous-cuda-copy Disable asynchronous copies between CPU and CUDA devices.
    --disable-asynchronous-opencl-copy
    \anchor disable-asynchronous-opencl-copy \addindex __configure__--disable-asynchronous-opencl-copy Disable asynchronous copies between CPU and OpenCL devices. The AMD implementation of OpenCL is known to fail when copying data asynchronously. When using this implementation, it is therefore necessary to disable asynchronous data transfers.
    --enable-maxmicthreads
    \anchor enable-maxmicthreads \addindex __configure__--enable-maxmicthreads Specify the maximum number of MIC threads
    --disable-asynchronous-mic-copy
    \anchor disable-asynchronous-mic-copy \addindex __configure__--disable-asynchronous-mic-copy Disable asynchronous copies between CPU and MIC devices.
    --enable-maxnodes=count
    \anchor enable-maxnodes \addindex __configure__--enable-maxnodes Use at most count memory nodes. This information is then available as the macro ::STARPU_MAXNODES. Reducing it allows to considerably reduce memory used by StarPU data structures.
    \section ExtensionConfiguration Extension Configuration
    --enable-mpi-verbose
    \anchor enable-mpi-verbose \addindex __configure__--enable-mpi-verbose Increase the verbosity of the MPI debugging messages. This can be disabled at runtime by setting the environment variable \ref STARPU_SILENT to any value. --enable-mpi-verbose=extra increase even more the verbosity. \verbatim $ STARPU_SILENT=1 mpirun -np 2 ./insert_task \endverbatim
    --disable-fortran
    \anchor disable-fortran \addindex __configure__--disable-fortran Disable the fortran extension. By default, it is enabled when a fortran compiler is found.
    --disable-socl
    \anchor disable-socl \addindex __configure__--disable-socl Disable the SOCL extension (\ref SOCLOpenclExtensions). By default, it is enabled when an OpenCL implementation is found.
    --disable-starpu-top
    \anchor disable-starpu-top \addindex __configure__--disable-starpu-top Disable the StarPU-Top interface (\ref StarPU-TopInterface). By default, it is enabled when the required dependencies are found.
    --disable-gcc-extensions
    \anchor disable-gcc-extensions \addindex __configure__--disable-gcc-extensions Disable the GCC plug-in (\ref cExtensions). By default, it is enabled when the GCC compiler provides a plug-in support.
    --with-mpicc=path
    \anchor with-mpicc \addindex __configure__--with-mpicc Use the compiler mpicc at path, for StarPU-MPI. (\ref MPISupport).
    --enable-mpi-progression-hook
    \anchor enable-mpi-progression-hook \addindex __configure__--enable-mpi-progression-hook Enable the activity polling method for StarPU-MPI. This is however experimental, do not enable it unless you know what you are doing.
    --with-coi-dir
    \anchor with-coi-dir \addindex __configure__--with-coi-dir Specify the directory to the COI library for MIC support. The default value is /opt/intel/mic/coi
    --mic-host
    \anchor mic-host \addindex __configure__--mic-host Specify the precise MIC architecture host identifier. The default value is x86_64-k1om-linux
    --enable-openmp
    \anchor enable-openmp \addindex __configure__--enable-openmp Enable OpenMP Support (\ref OpenMPRuntimeSupport)
    \section AdvancedConfiguration Advanced Configuration
    --enable-perf-debug
    \anchor enable-perf-debug \addindex __configure__--enable-perf-debug Enable performance debugging through gprof.
    --enable-model-debug
    \anchor enable-model-debug \addindex __configure__--enable-model-debug Enable performance model debugging.
    --enable-fxt-lock
    \anchor enable-fxt-lock \addindex __configure__--enable-fxt-lock Enable additional trace events which describes locks behaviour.
    --enable-stats
    \anchor enable-stats \addindex __configure__--enable-stats (see ../../src/datawizard/datastats.c) Enable gathering of various data statistics (\ref DataStatistics).
    --enable-maxbuffers
    \anchor enable-maxbuffers \addindex __configure__--enable-maxbuffers Define the maximum number of buffers that tasks will be able to take as parameters, then available as the macro ::STARPU_NMAXBUFS.
    --enable-allocation-cache
    \anchor enable-allocation-cache \addindex __configure__--enable-allocation-cache Enable the use of a data allocation cache to avoid the cost of it with CUDA. Still experimental.
    --enable-opengl-render
    \anchor enable-opengl-render \addindex __configure__--enable-opengl-render Enable the use of OpenGL for the rendering of some examples. // TODO: rather default to enabled when detected
    --enable-blas-lib=prefix
    \anchor enable-blas-lib \addindex __configure__--enable-blas-lib Specify the blas library to be used by some of the examples. Librairies available : - none [default] : no BLAS library is used - atlas: use ATLAS library - goto: use GotoBLAS library - mkl: use MKL library (you may need to set specific CFLAGS and LDFLAGS with --with-mkl-cflags and --with-mkl-ldflags)
    --enable-leveldb
    \anchor enable-leveldb \addindex __configure__--enable-leveldb Enable linking with LevelDB if available
    --disable-starpufft
    \anchor disable-starpufft \addindex __configure__--disable-starpufft Disable the build of libstarpufft, even if fftw or cuFFT is available.
    --enable-starpufft-examples
    \anchor enable-starpufft-examples \addindex __configure__--enable-starpufft-examples Enable the compilation and the execution of the libstarpufft examples. By default, they are neither compiled nor checked.
    --with-fxt=prefix
    \anchor with-fxt \addindex __configure__--with-fxt Search for FxT under prefix. FxT (http://savannah.nongnu.org/projects/fkt) is used to generate traces of scheduling events, which can then be rendered them using ViTE (\ref Off-linePerformanceFeedback). prefix should notably contain include/fxt/fxt.h.
    --with-perf-model-dir=dir
    \anchor with-perf-model-dir \addindex __configure__--with-perf-model-dir Store performance models under dir, instead of the current user's home.
    --with-goto-dir=prefix
    \anchor with-goto-dir \addindex __configure__--with-goto-dir Search for GotoBLAS under prefix, which should notably contain libgoto.so or libgoto2.so.
    --with-atlas-dir=prefix
    \anchor with-atlas-dir \addindex __configure__--with-atlas-dir Search for ATLAS under prefix, which should notably contain include/cblas.h.
    --with-mkl-cflags=cflags
    \anchor with-mkl-cflags \addindex __configure__--with-mkl-cflags Use cflags to compile code that uses the MKL library.
    --with-mkl-ldflags=ldflags
    \anchor with-mkl-ldflags \addindex __configure__--with-mkl-ldflags Use ldflags when linking code that uses the MKL library. Note that the MKL website (http://software.intel.com/en-us/articles/intel-mkl-link-line-advisor/) provides a script to determine the linking flags.
    --disable-glpk
    \anchor disable-glpk \addindex __configure__--disable-glpk Disable the use of libglpk for computing area bounds.
    --disable-build-tests
    \anchor disable-build-tests \addindex __configure__--disable-build-tests Disable the build of tests.
    --disable-build-examples
    \anchor disable-build-examples \addindex __configure__--disable-build-examples Disable the build of examples.
    --disable-build-tests
    \anchor disable-build-tests \addindex __configure__--disable-build-tests Disable the build of tests.
    --enable-sc-hypervisor
    \anchor enable-sc-hypervisor \addindex __configure__--enable-sc-hypervisor Enable the Scheduling Context Hypervisor plugin (\ref SchedulingContextHypervisor). By default, it is disabled.
    --enable-memory-stats
    \anchor enable-memory-stats \addindex __configure__--enable-memory-stats Enable memory statistics (\ref MemoryFeedback).
    --enable-simgrid
    \anchor enable-simgrid \addindex __configure__--enable-simgrid Enable simulation of execution in simgrid, to allow easy experimentation with various numbers of cores and GPUs, or amount of memory, etc. Experimental. The path to simgrid can be specified through the SIMGRID_CFLAGS and SIMGRID_LIBS environment variables, for instance: \verbatim export SIMGRID_CFLAGS="-I/usr/local/simgrid/include" export SIMGRID_LIBS="-L/usr/local/simgrid/lib -lsimgrid" \endverbatim
    --with-simgrid-dir
    \anchor with-simgrid-dir \addindex __configure__--with-simgrid-dir Similar to the option \ref enable-simgrid "--enable-simgrid" but also allows to specify the location to the SimGrid library.
    --with-simgrid-include-dir
    \anchor with-simgrid-include-dir \addindex __configure__--with-simgrid-include-dir Similar to the option \ref enable-simgrid "--enable-simgrid" but also allows to specify the location to the SimGrid include directory.
    --with-simgrid-lib-dir
    \anchor with-simgrid-lib-dir \addindex __configure__--with-simgrid-lib-dir Similar to the option \ref enable-simgrid "--enable-simgrid" but also allows to specify the location to the SimGrid lib directory.
    --with-smpirun=path
    \anchor with-smpirun \addindex __configure__--with-smpirun Use the smpirun at path
    --enable-calibration-heuristic
    \anchor enable-calibration-heuristic \addindex __configure__--enable-calibration-heuristic Allows to set the maximum authorized percentage of deviation for the history-based calibrator of StarPU. A correct value of this parameter must be in [0..100]. The default value of this parameter is 10. Experimental.
    */ starpu-1.2.3+dfsg/doc/doxygen/chapters/520_files.doxy000066400000000000000000000025421320135501600224010ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \page Files Files \file starpu_config.h \file starpu.h \file starpu_bitmap.h \file starpu_bound.h \file starpu_cublas.h \file starpu_cuda.h \file starpu_data_filters.h \file starpu_data.h \file starpu_data_interfaces.h \file starpu_deprecated_api.h \file starpu_disk.h \file starpu_driver.h \file starpu_expert.h \file starpu_fxt.h \file starpu_hash.h \file starpu_mic.h \file starpu_mod.f90 \file starpu_opencl.h \file starpu_openmp.h \file starpu_perfmodel.h \file starpu_profiling.h \file starpu_rand.h \file starpu_scc.h \file starpu_sched_component.h \file starpu_sched_ctx.h \file starpu_sched_ctx_hypervisor.h \file starpu_scheduler.h \file starpu_simgrid_wrap.h \file starpu_sink.h \file starpu_stdlib.h \file starpu_task_bundle.h \file starpu_task.h \file starpu_task_list.h \file starpu_task_util.h \file starpu_thread.h \file starpu_thread_util.h \file starpu_top.h \file starpu_tree.h \file starpu_util.h \file starpu_worker.h \file starpu_mpi.h \file sc_hypervisor_config.h \file sc_hypervisor.h \file sc_hypervisor_lp.h \file sc_hypervisor_monitoring.h \file sc_hypervisor_policy.h \file starpufft.h */ starpu-1.2.3+dfsg/doc/doxygen/chapters/601_scaling_vector_example.doxy000066400000000000000000000020421320135501600260070ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \page FullSourceCodeVectorScal Full source code for the ’Scaling a Vector’ example \section MainApplication Main Application \snippet vector_scal_c.c To be included. You should update doxygen if you see this text. \section CPUKernel CPU Kernel \snippet vector_scal_cpu.c To be included. You should update doxygen if you see this text. \section CUDAKernel CUDA Kernel \snippet vector_scal_cuda.cu To be included. You should update doxygen if you see this text. \section OpenCLKernel OpenCL Kernel \subsection InvokingtheKernel Invoking the Kernel \snippet vector_scal_opencl.c To be included. You should update doxygen if you see this text. \subsection SourceoftheKernel Source of the Kernel \snippet vector_scal_opencl_codelet.cl To be included. You should update doxygen if you see this text. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/610_fdl_1_3.doxy000066400000000000000000000560331320135501600225120ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \page GNUFreeDocumentationLicense The GNU Free Documentation License
    Version 1.3, 3 November 2008
    \copyright 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. http://fsf.org/ Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
    1. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document free in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of ``copyleft'', which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference.
    2. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The ``Document'', below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as ``you''. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A ``Modified Version'' of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A ``Secondary Section'' is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The ``Invariant Sections'' are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The ``Cover Texts'' are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A ``Transparent'' copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not ``Transparent'' is called ``Opaque''. Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The ``Title Page'' means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, ``Title Page'' means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. The ``publisher'' means any person or entity that distributes copies of the Document to the public. A section ``Entitled XYZ'' means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as ``Acknowledgements'', ``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title'' of such a section when you modify the Document means that it remains a section ``Entitled XYZ'' according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License.
    3. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies.
    4. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document.
    5. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:
      1. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission.
      2. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement.
      3. State on the Title page the name of the publisher of the Modified Version, as the publisher.
      4. Preserve all the copyright notices of the Document.
      5. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices.
      6. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below.
      7. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice.
      8. Include an unaltered copy of this License.
      9. Preserve the section Entitled ``History'', Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled ``History'' in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence.
      10. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the ``History'' section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission.
      11. For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein.
      12. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles.
      13. Delete any section Entitled ``Endorsements''. Such a section may not be included in the Modified Version.
      14. Do not retitle any existing section to be Entitled ``Endorsements'' or to conflict in title with any Invariant Section.
      15. Preserve any Warranty Disclaimers.
      If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled ``Endorsements'', provided it contains nothing but endorsements of your Modified Version by various parties---for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version.
    6. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled ``History'' in the various original documents, forming one section Entitled ``History''; likewise combine any sections Entitled ``Acknowledgements'', and any sections Entitled ``Dedications''. You must delete all sections Entitled ``Endorsements.''
    7. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document.
    8. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an ``aggregate'' if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate.
    9. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled ``Acknowledgements'', ``Dedications'', or ``History'', the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title.
    10. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it.
    11. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License ``or any later version'' applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document.
    12. RELICENSING ``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A ``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the site means any set of copyrightable works thus published on the MMC site. ``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. ``Incorporate'' means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is ``eligible for relicensing'' if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing.
    \section ADDENDUM ADDENDUM: How to use this License for your documents To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page:
    Copyright (C) year your name. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''.
    If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the ``with...Texts.'' line with this:
    with the Invariant Sections being list their titles, with the Front-Cover Texts being list, and with the Back-Cover Texts being list.
    If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/000077500000000000000000000000001320135501600205525ustar00rootroot00000000000000starpu-1.2.3+dfsg/doc/doxygen/chapters/api/bitmap.doxy000066400000000000000000000036311320135501600227360ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2014 CNRS * See the file version.doxy for copying conditions. */ /*! \defgroup API_Bitmap Bitmap \brief This section describes the bitmap facilities provided by StarPU. \fn struct starpu_bitmap *starpu_bitmap_create(void) \ingroup API_Bitmap create a empty starpu_bitmap \fn void starpu_bitmap_destroy(struct starpu_bitmap *b) \ingroup API_Bitmap free a starpu_bitmap \fn void starpu_bitmap_set(struct starpu_bitmap *b, int e) \ingroup API_Bitmap set bit \p e in \p b \fn void starpu_bitmap_unset(struct starpu_bitmap *b, int e) \ingroup API_Bitmap unset bit \p e in \p b \fn void starpu_bitmap_unset_all(struct starpu_bitmap *b) \ingroup API_Bitmap unset all bits in \b b \fn int starpu_bitmap_get(struct starpu_bitmap *b, int e) \ingroup API_Bitmap return true iff bit \p e is set in \p b \fn void starpu_bitmap_unset_and(struct starpu_bitmap *a, struct starpu_bitmap *b, struct starpu_bitmap *c) \ingroup API_Bitmap Basically compute starpu_bitmap_unset_all(a) ; a = b & c; \fn void starpu_bitmap_or(struct starpu_bitmap *a, struct starpu_bitmap *b) \ingroup API_Bitmap Basically compute a |= b \fn int starpu_bitmap_and_get(struct starpu_bitmap *b1, struct starpu_bitmap *b2, int e) \ingroup API_Bitmap return 1 iff e set in b1 AND e set in b2 \fn int starpu_bitmap_cardinal(struct starpu_bitmap *b) \ingroup API_Bitmap return the number of set bits in \p b \fn int starpu_bitmap_first(struct starpu_bitmap *b) \ingroup API_Bitmap return the index of first set bit of \p b, -1 if none \fn int starpu_bitmap_last(struct starpu_bitmap *b) \ingroup API_Bitmap return the position of the last set bit of \p b, -1 if none \fn int starpu_bitmap_next(struct starpu_bitmap *b, int e) \ingroup API_Bitmap return the position of set bit right after \p e in \p b, -1 if none \fn int starpu_bitmap_has_next(struct starpu_bitmap *b, int e) \ingroup API_Bitmap todo */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/codelet_and_tasks.doxy000066400000000000000000001170671320135501600251410ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Codelet_And_Tasks Codelet And Tasks \brief This section describes the interface to manipulate codelets and tasks. \enum starpu_codelet_type \ingroup API_Codelet_And_Tasks Describes the type of parallel task. See \ref ParallelTasks for details. \var starpu_codelet_type::STARPU_SEQ \ingroup API_Codelet_And_Tasks (default) for classical sequential tasks. \var starpu_codelet_type::STARPU_SPMD \ingroup API_Codelet_And_Tasks for a parallel task whose threads are handled by StarPU, the code has to use starpu_combined_worker_get_size() and starpu_combined_worker_get_rank() to distribute the work. \var starpu_codelet_type::STARPU_FORKJOIN \ingroup API_Codelet_And_Tasks for a parallel task whose threads are started by the codelet function, which has to use starpu_combined_worker_get_size() to determine how many threads should be started. \enum starpu_task_status \ingroup API_Codelet_And_Tasks Task status \var starpu_task_status::STARPU_TASK_INVALID \ingroup API_Codelet_And_Tasks The task has just been initialized. \var starpu_task_status::STARPU_TASK_BLOCKED \ingroup API_Codelet_And_Tasks The task has just been submitted, and its dependencies has not been checked yet. \var starpu_task_status::STARPU_TASK_READY \ingroup API_Codelet_And_Tasks The task is ready for execution. \var starpu_task_status::STARPU_TASK_RUNNING \ingroup API_Codelet_And_Tasks The task is running on some worker. \var starpu_task_status::STARPU_TASK_FINISHED \ingroup API_Codelet_And_Tasks The task is finished executing. \var starpu_task_status::STARPU_TASK_BLOCKED_ON_TAG \ingroup API_Codelet_And_Tasks The task is waiting for a tag. \var starpu_task_status::STARPU_TASK_BLOCKED_ON_TASK \ingroup API_Codelet_And_Tasks The task is waiting for a task. \var starpu_task_status::STARPU_TASK_BLOCKED_ON_DATA \ingroup API_Codelet_And_Tasks The task is waiting for some data. \def STARPU_NOWHERE \ingroup API_Codelet_And_Tasks This macro is used when setting the field starpu_codelet::where to specify that the codelet has no computation part, and thus does not need to be scheduled, and data does not need to be actually loaded. This is thus essentially used for synchronization tasks. \def STARPU_CPU \ingroup API_Codelet_And_Tasks This macro is used when setting the field starpu_codelet::where to specify the codelet may be executed on a CPU processing unit. \def STARPU_CUDA \ingroup API_Codelet_And_Tasks This macro is used when setting the field starpu_codelet::where to specify the codelet may be executed on a CUDA processing unit. \def STARPU_OPENCL \ingroup API_Codelet_And_Tasks This macro is used when setting the field starpu_codelet::where to specify the codelet may be executed on a OpenCL processing unit. \def STARPU_MIC \ingroup API_Codelet_And_Tasks This macro is used when setting the field starpu_codelet::where to specify the codelet may be executed on a MIC processing unit. \def STARPU_SCC \ingroup API_Codelet_And_Tasks This macro is used when setting the field starpu_codelet::where to specify the codelet may be executed on an SCC processing unit. \def STARPU_MAIN_RAM \ingroup API_Codelet_And_Tasks This macro is used when the RAM memory node is specified. \def STARPU_MULTIPLE_CPU_IMPLEMENTATIONS \deprecated \ingroup API_Codelet_And_Tasks Setting the field starpu_codelet::cpu_func with this macro indicates the codelet will have several implementations. The use of this macro is deprecated. One should always only define the field starpu_codelet::cpu_funcs. \def STARPU_MULTIPLE_CUDA_IMPLEMENTATIONS \deprecated \ingroup API_Codelet_And_Tasks Setting the field starpu_codelet::cuda_func with this macro indicates the codelet will have several implementations. The use of this macro is deprecated. One should always only define the field starpu_codelet::cuda_funcs. \def STARPU_MULTIPLE_OPENCL_IMPLEMENTATIONS \deprecated \ingroup API_Codelet_And_Tasks Setting the field starpu_codelet::opencl_func with this macro indicates the codelet will have several implementations. The use of this macro is deprecated. One should always only define the field starpu_codelet::opencl_funcs. \def STARPU_NMAXBUFS \ingroup API_Codelet_And_Tasks Defines the maximum number of buffers that tasks will be able to take as parameters. The default value is 8, it can be changed by using the configure option \ref enable-maxbuffers "--enable-maxbuffers". \def STARPU_VARIABLE_NBUFFERS \ingroup API_Codelet_And_Tasks Value to set in starpu_codelet::nbuffers to specify that the codelet can accept a variable number of buffers, specified in starpu_task::nbuffers. \def STARPU_CUDA_ASYNC Value to be set in starpu_codelet::cuda_flags to allow asynchronous CUDA kernel execution. \def STARPU_OPENCL_ASYNC Value to be set in starpu_codelet::opencl_flags to allow asynchronous OpenCL kernel execution. \def STARPU_CODELET_SIMGRID_EXECUTE Value to be set in starpu_codelet::flags to execute the codelet functions even in simgrid mode. \typedef starpu_cpu_func_t \ingroup API_Codelet_And_Tasks CPU implementation of a codelet. \typedef starpu_cuda_func_t \ingroup API_Codelet_And_Tasks CUDA implementation of a codelet. \typedef starpu_opencl_func_t \ingroup API_Codelet_And_Tasks OpenCL implementation of a codelet. \typedef starpu_mic_func_t \ingroup API_Codelet_And_Tasks MIC implementation of a codelet. \typedef starpu_scc_func_t \ingroup API_Codelet_And_Tasks SCC implementation of a codelet. \typedef starpu_mic_kernel_t \ingroup API_Codelet_And_Tasks MIC kernel for a codelet \typedef starpu_scc_kernel_t \ingroup API_Codelet_And_Tasks SCC kernel for a codelet \struct starpu_codelet The codelet structure describes a kernel that is possibly implemented on various targets. For compatibility, make sure to initialize the whole structure to zero, either by using explicit memset, or the function starpu_codelet_init(), or by letting the compiler implicitly do it in e.g. static storage case. \ingroup API_Codelet_And_Tasks \var uint32_t starpu_codelet::where Optional field to indicate which types of processing units are able to execute the codelet. The different values ::STARPU_CPU, ::STARPU_CUDA, ::STARPU_OPENCL can be combined to specify on which types of processing units the codelet can be executed. ::STARPU_CPU|::STARPU_CUDA for instance indicates that the codelet is implemented for both CPU cores and CUDA devices while ::STARPU_OPENCL indicates that it is only available on OpenCL devices. If the field is unset, its value will be automatically set based on the availability of the XXX_funcs fields defined below. It can also be set to ::STARPU_NOWHERE to specify that no computation has to be actually done. \var int (*starpu_codelet::can_execute)(unsigned workerid, struct starpu_task *task, unsigned nimpl) Define a function which should return 1 if the worker designated by workerid can execute the nimplth implementation of the given task, 0 otherwise. \var enum starpu_codelet_type starpu_codelet::type Optional field to specify the type of the codelet. The default is ::STARPU_SEQ, i.e. usual sequential implementation. Other values (::STARPU_SPMD or ::STARPU_FORKJOIN declare that a parallel implementation is also available. See \ref ParallelTasks for details. \var int starpu_codelet::max_parallelism Optional field. If a parallel implementation is available, this denotes the maximum combined worker size that StarPU will use to execute parallel tasks for this codelet. \var starpu_cpu_func_t starpu_codelet::cpu_func \deprecated Optional field which has been made deprecated. One should use instead the field starpu_codelet::cpu_funcs. \var starpu_cuda_func_t starpu_codelet::cuda_func \deprecated Optional field which has been made deprecated. One should use instead the starpu_codelet::cuda_funcs field. \var starpu_opencl_func_t starpu_codelet::opencl_func \deprecated Optional field which has been made deprecated. One should use instead the starpu_codelet::opencl_funcs field. \var starpu_cpu_func_t starpu_codelet::cpu_funcs[STARPU_MAXIMPLEMENTATIONS] Optional array of function pointers to the CPU implementations of the codelet. The functions prototype must be: \code{.c} void cpu_func(void *buffers[], void *cl_arg) \endcode The first argument being the array of data managed by the data management library, and the second argument is a pointer to the argument passed from the field starpu_task::cl_arg. If the field starpu_codelet::where is set, then the field starpu_codelet::cpu_funcs is ignored if ::STARPU_CPU does not appear in the field starpu_codelet::where, it must be non-null otherwise. \var char *starpu_codelet::cpu_funcs_name[STARPU_MAXIMPLEMENTATIONS] Optional array of strings which provide the name of the CPU functions referenced in the array starpu_codelet::cpu_funcs. This can be used when running on MIC devices or the SCC platform, for StarPU to simply look up the MIC function implementation through its name. \var starpu_cuda_func_t starpu_codelet::cuda_funcs[STARPU_MAXIMPLEMENTATIONS] Optional array of function pointers to the CUDA implementations of the codelet. The functions must be host-functions written in the CUDA runtime API. Their prototype must be: \code{.c} void cuda_func(void *buffers[], void *cl_arg) \endcode If the field starpu_codelet::where is set, then the field starpu_codelet::cuda_funcs is ignored if ::STARPU_CUDA does not appear in the field starpu_codelet::where, it must be non-null otherwise. \var char starpu_codelet::cuda_flags[STARPU_MAXIMPLEMENTATIONS] Optional array of flags for CUDA execution. They specify some semantic details about CUDA kernel execution, such as asynchronous execution. \var starpu_opencl_func_t starpu_codelet::opencl_funcs[STARPU_MAXIMPLEMENTATIONS] Optional array of function pointers to the OpenCL implementations of the codelet. The functions prototype must be: \code{.c} void opencl_func(void *buffers[], void *cl_arg) \endcode If the field starpu_codelet::where field is set, then the field starpu_codelet::opencl_funcs is ignored if ::STARPU_OPENCL does not appear in the field starpu_codelet::where, it must be non-null otherwise. \var char starpu_codelet::opencl_flags[STARPU_MAXIMPLEMENTATIONS] Optional array of flags for OpenCL execution. They specify some semantic details about OpenCL kernel execution, such as asynchronous execution. \var starpu_mic_func_t starpu_codelet::mic_funcs[STARPU_MAXIMPLEMENTATIONS] Optional array of function pointers to a function which returns the MIC implementation of the codelet. The functions prototype must be: \code{.c} starpu_mic_kernel_t mic_func(struct starpu_codelet *cl, unsigned nimpl) \endcode If the field starpu_codelet::where is set, then the field starpu_codelet::mic_funcs is ignored if ::STARPU_MIC does not appear in the field starpu_codelet::where. It can be null if starpu_codelet::cpu_funcs_name is non-NULL, in which case StarPU will simply make a symbol lookup to get the implementation. \var starpu_scc_func_t starpu_codelet::scc_funcs[STARPU_MAXIMPLEMENTATIONS] Optional array of function pointers to a function which returns the SCC implementation of the codelet. The functions prototype must be: \code{.c} starpu_scc_kernel_t scc_func(struct starpu_codelet *cl, unsigned nimpl) \endcode If the field starpu_codelet::where is set, then the field starpu_codelet::scc_funcs is ignored if ::STARPU_SCC does not appear in the field starpu_codelet::where. It can be null if starpu_codelet::cpu_funcs_name is non-NULL, in which case StarPU will simply make a symbol lookup to get the implementation. \var int starpu_codelet::nbuffers Specify the number of arguments taken by the codelet. These arguments are managed by the DSM and are accessed from the void *buffers[] array. The constant argument passed with the field starpu_task::cl_arg is not counted in this number. This value should not be above \ref STARPU_NMAXBUFS. It may be set to STARPU_VARIABLE_NBUFFERS to specify that the number of buffers and their access modes will be set in starpu_task::nbuffers and starpu_task::modes or starpu_task::dyn_modes, which thus permits to define codelets with a varying number of data. \var enum starpu_data_access_mode starpu_codelet::modes[STARPU_NMAXBUFS] Is an array of ::starpu_data_access_mode. It describes the required access modes to the data neeeded by the codelet (e.g. ::STARPU_RW). The number of entries in this array must be specified in the field starpu_codelet::nbuffers, and should not exceed \ref STARPU_NMAXBUFS. If unsufficient, this value can be set with the configure option \ref enable-maxbuffers "--enable-maxbuffers". \var enum starpu_data_access_mode *starpu_codelet::dyn_modes Is an array of ::starpu_data_access_mode. It describes the required access modes to the data needed by the codelet (e.g. ::STARPU_RW). The number of entries in this array must be specified in the field starpu_codelet::nbuffers. This field should be used for codelets having a number of datas greater than \ref STARPU_NMAXBUFS (see \ref SettingManyDataHandlesForATask). When defining a codelet, one should either define this field or the field starpu_codelet::modes defined above. \var unsigned starpu_codelet::specific_nodes Default value is 0. If this flag is set, StarPU will not systematically send all data to the memory node where the task will be executing, it will read the starpu_codelet::nodes or starpu_codelet::dyn_nodes array to determine, for each data, whether to send it on the memory node where the task will be executing (-1), or on a specific node (!= -1). \var int starpu_codelet::nodes[STARPU_NMAXBUFS] Optional field. When starpu_codelet::specific_nodes is 1, this specifies the memory nodes where each data should be sent to for task execution. The number of entries in this array is starpu_codelet::nbuffers, and should not exceed \ref STARPU_NMAXBUFS. \var int *starpu_codelet::dyn_nodes Optional field. When starpu_codelet::specific_nodes is 1, this specifies the memory nodes where each data should be sent to for task execution. The number of entries in this array is starpu_codelet::nbuffers. This field should be used for codelets having a number of datas greater than \ref STARPU_NMAXBUFS (see \ref SettingManyDataHandlesForATask). When defining a codelet, one should either define this field or the field starpu_codelet::nodes defined above. \var struct starpu_perfmodel *starpu_codelet::model Optional pointer to the task duration performance model associated to this codelet. This optional field is ignored when set to NULL or when its field starpu_perfmodel::symbol is not set. \var struct starpu_perfmodel *starpu_codelet::energy_model Optional pointer to the task energy consumption performance model associated to this codelet. This optional field is ignored when set to NULL or when its field starpu_perfmodel::field is not set. In the case of parallel codelets, this has to account for all processing units involved in the parallel execution. \var unsigned long starpu_codelet::per_worker_stats[STARPU_NMAXWORKERS] Optional array for statistics collected at runtime: this is filled by StarPU and should not be accessed directly, but for example by calling the function starpu_codelet_display_stats() (See starpu_codelet_display_stats() for details). \var const char *starpu_codelet::name Optional name of the codelet. This can be useful for debugging purposes. \var const char *starpu_codelet::flags Various flags for the codelet. \fn void starpu_codelet_init(struct starpu_codelet *cl) \ingroup API_Codelet_And_Tasks Initialize \p cl with default values. Codelets should preferably be initialized statically as shown in \ref DefiningACodelet. However such a initialisation is not always possible, e.g. when using C++. \struct starpu_data_descr \ingroup API_Codelet_And_Tasks This type is used to describe a data handle along with an access mode. \var starpu_data_handle_t starpu_data_descr::handle describes a data \var enum starpu_data_access_mode starpu_data_descr::mode describes its access mode \struct starpu_task \ingroup API_Codelet_And_Tasks The structure describes a task that can be offloaded on the various processing units managed by StarPU. It instantiates a codelet. It can either be allocated dynamically with the function starpu_task_create(), or declared statically. In the latter case, the programmer has to zero the structure starpu_task and to fill the different fields properly. The indicated default values correspond to the configuration of a task allocated with starpu_task_create(). \var const char *starpu_task::name Optional name of the task. This can be useful for debugging purposes. \var struct starpu_codelet *starpu_task::cl Is a pointer to the corresponding structure starpu_codelet. This describes where the kernel should be executed, and supplies the appropriate implementations. When set to NULL, no code is executed during the tasks, such empty tasks can be useful for synchronization purposes. This field has been made deprecated. One should use instead the field starpu_task::handles to specify the data handles accessed by the task. The access modes are now defined in the field starpu_codelet::modes. \var int starpu_task::nbuffers Specifies the number of buffers. This is only used when starpu_codelet::nbuffers is STARPU_VARIABLE_NBUFFERS. \var starpu_data_handle_t starpu_task::handles[STARPU_NMAXBUFS] Is an array of ::starpu_data_handle_t. It specifies the handles to the different pieces of data accessed by the task. The number of entries in this array must be specified in the field starpu_codelet::nbuffers, and should not exceed \ref STARPU_NMAXBUFS. If unsufficient, this value can be set with the configure option \ref enable-maxbuffers "--enable-maxbuffers". \var starpu_data_handle_t *starpu_task::dyn_handles Is an array of ::starpu_data_handle_t. It specifies the handles to the different pieces of data accessed by the task. The number of entries in this array must be specified in the field starpu_codelet::nbuffers. This field should be used for tasks having a number of datas greater than \ref STARPU_NMAXBUFS (see \ref SettingManyDataHandlesForATask). When defining a task, one should either define this field or the field starpu_task::handles defined above. \var void *starpu_task::interfaces[STARPU_NMAXBUFS] The actual data pointers to the memory node where execution will happen, managed by the DSM. \var void **starpu_task::dyn_interfaces The actual data pointers to the memory node where execution will happen, managed by the DSM. Is used when the field starpu_task::dyn_handles is defined. \var enum starpu_data_access_mode starpu_task::modes[STARPU_NMAXBUFS] Is used only when starpu_codelet::nbuffers is STARPU_VARIABLE_NBUFFERS. It is an array of ::starpu_data_access_mode. It describes the required access modes to the data neeeded by the codelet (e.g. ::STARPU_RW). The number of entries in this array must be specified in the field starpu_task::nbuffers, and should not exceed \ref STARPU_NMAXBUFS. If unsufficient, this value can be set with the configure option \ref enable-maxbuffers "--enable-maxbuffers". \var enum starpu_data_access_mode *starpu_task::dyn_modes Is used only when starpu_codelet::nbuffers is STARPU_VARIABLE_NBUFFERS. It is an array of ::starpu_data_access_mode. It describes the required access modes to the data needed by the codelet (e.g. ::STARPU_RW). The number of entries in this array must be specified in the field starpu_codelet::nbuffers. This field should be used for codelets having a number of datas greater than \ref STARPU_NMAXBUFS (see \ref SettingManyDataHandlesForATask). When defining a codelet, one should either define this field or the field starpu_task::modes defined above. \var void *starpu_task::cl_arg Optional pointer which is passed to the codelet through the second argument of the codelet implementation (e.g. starpu_codelet::cpu_func or starpu_codelet::cuda_func). The default value is NULL. starpu_codelet_pack_args() and starpu_codelet_unpack_args() are helpers that can can be used to respectively pack and unpack data into and from it, but the application can manage it any way, the only requirement is that the size of the data must be set in starpu_task:cl_arg_size . \var size_t starpu_task::cl_arg_size Optional field. For some specific drivers, the pointer starpu_task::cl_arg cannot not be directly given to the driver function. A buffer of size starpu_task::cl_arg_size needs to be allocated on the driver. This buffer is then filled with the starpu_task::cl_arg_size bytes starting at address starpu_task::cl_arg. In this case, the argument given to the codelet is therefore not the starpu_task::cl_arg pointer, but the address of the buffer in local store (LS) instead. This field is ignored for CPU, CUDA and OpenCL codelets, where the starpu_task::cl_arg pointer is given as such. \var unsigned starpu_task::cl_arg_free Optional field. In case starpu_task::cl_arg was allocated by the application through malloc(), setting starpu_task::cl_arg_free to 1 makes StarPU automatically call free(cl_arg) when destroying the task. This saves the user from defining a callback just for that. This is mostly useful when targetting MIC or SCC, where the codelet does not execute in the same memory space as the main thread. \var void (*starpu_task::callback_func)(void *) Optional field, the default value is NULL. This is a function pointer of prototype void (*f)(void *) which specifies a possible callback. If this pointer is non-null, the callback function is executed on the host after the execution of the task. Tasks which depend on it might already be executing. The callback is passed the value contained in the starpu_task::callback_arg field. No callback is executed if the field is set to NULL. \var void *starpu_task::callback_arg (optional) (default: NULL) Optional field, the default value is NULL. This is the pointer passed to the callback function. This field is ignored if the field starpu_task::callback_func is set to NULL. \var unsigned starpu_task::callback_arg_free Optional field. In case starpu_task::callback_arg was allocated by the application through malloc(), setting starpu_task::callback_arg_free to 1 makes StarPU automatically call free(callback_arg) when destroying the task. \var void (*starpu_task::prologue_callback_func)(void *) Optional field, the default value is NULL. This is a function pointer of prototype void (*f)(void *) which specifies a possible callback. If this pointer is non-null, the callback function is executed on the host when the task becomes ready for execution, before getting scheduled. The callback is passed the value contained in the starpu_task::prologue_callback_arg field. No callback is executed if the field is set to NULL. \var void *starpu_task::prologue_callback_arg (optional) (default: NULL) Optional field, the default value is NULL. This is the pointer passed to the prologue callback function. This field is ignored if the field starpu_task::prologue_callback_func is set to NULL. \var unsigned starpu_task::prologue_callback_arg_free Optional field. In case starpu_task::prologue_callback_arg was allocated by the application through malloc(), setting starpu_task::prologue_callback_arg_free to 1 makes StarPU automatically call free(prologue_callback_arg) when destroying the task. \var unsigned starpu_task::use_tag Optional field, the default value is 0. If set, this flag indicates that the task should be associated with the tag contained in the starpu_task::tag_id field. Tag allow the application to synchronize with the task and to express task dependencies easily. \var starpu_tag_t starpu_task::tag_id This optional field contains the tag associated to the task if the field starpu_task::use_tag is set, it is ignored otherwise. \var unsigned starpu_task::sequential_consistency If this flag is set (which is the default), sequential consistency is enforced for the data parameters of this task for which sequential consistency is enabled. Clearing this flag permits to disable sequential consistency for this task, even if data have it enabled. \var unsigned starpu_task::synchronous If this flag is set, the function starpu_task_submit() is blocking and returns only when the task has been executed (or if no worker is able to process the task). Otherwise, starpu_task_submit() returns immediately. \var int starpu_task::priority Optional field, the default value is ::STARPU_DEFAULT_PRIO. This field indicates a level of priority for the task. This is an integer value that must be set between the return values of the function starpu_sched_get_min_priority() for the least important tasks, and that of the function starpu_sched_get_max_priority() for the most important tasks (included). The ::STARPU_MIN_PRIO and ::STARPU_MAX_PRIO macros are provided for convenience and respectively returns the value of starpu_sched_get_min_priority() and starpu_sched_get_max_priority(). Default priority is ::STARPU_DEFAULT_PRIO, which is always defined as 0 in order to allow static task initialization. Scheduling strategies that take priorities into account can use this parameter to take better scheduling decisions, but the scheduling policy may also ignore it. \var unsigned starpu_task::execute_on_a_specific_worker Default value is 0. If this flag is set, StarPU will bypass the scheduler and directly affect this task to the worker specified by the field starpu_task::workerid. \var unsigned starpu_task::workerid Optional field. If the field starpu_task::execute_on_a_specific_worker is set, this field indicates the identifier of the worker that should process this task (as returned by starpu_worker_get_id()). This field is ignored if the field starpu_task::execute_on_a_specific_worker is set to 0. \var unsigned starpu_task::workerorder Optional field. If the field starpu_task::execute_on_a_specific_worker is set, this field indicates the per-worker consecutive order in which tasks should be executed on the worker. Tasks will be executed in consecutive starpu_task::workerorder values, thus ignoring the availability order or task priority. See \ref StaticScheduling for more details. This field is ignored if the field starpu_task::execute_on_a_specific_worker is set to 0. \var starpu_task_bundle_t starpu_task::bundle Optional field. The bundle that includes this task. If no bundle is used, this should be NULL. \var unsigned starpu_task::detach Optional field, default value is 1. If this flag is set, it is not possible to synchronize with the task by the means of starpu_task_wait() later on. Internal data structures are only guaranteed to be freed once starpu_task_wait() is called if the flag is not set. \var unsigned starpu_task::destroy Optional value. Default value is 0 for starpu_task_init(), and 1 for starpu_task_create(). If this flag is set, the task structure will automatically be freed, either after the execution of the callback if the task is detached, or during starpu_task_wait() otherwise. If this flag is not set, dynamically allocated data structures will not be freed until starpu_task_destroy() is called explicitly. Setting this flag for a statically allocated task structure will result in undefined behaviour. The flag is set to 1 when the task is created by calling starpu_task_create(). Note that starpu_task_wait_for_all() will not free any task. \var unsigned starpu_task::regenerate Optional field. If this flag is set, the task will be re-submitted to StarPU once it has been executed. This flag must not be set if the flag starpu_task::destroy is set. This flag must be set before making another task depend on this one. \var enum starpu_task_status starpu_task::status Optional field. Current state of the task. \var struct starpu_profiling_task_info *starpu_task::profiling_info Optional field. Profiling information for the task. \var double starpu_task::predicted Output field. Predicted duration of the task. This field is only set if the scheduling strategy uses performance models. \var double starpu_task::predicted_transfer Optional field. Predicted data transfer duration for the task in microseconds. This field is only valid if the scheduling strategy uses performance models. \var struct starpu_task *starpu_task::prev \private A pointer to the previous task. This should only be used by StarPU. \var struct starpu_task *starpu_task::next \private A pointer to the next task. This should only be used by StarPU. \var unsigned int starpu_task::mf_skip \private This is only used for tasks that use multiformat handle. This should only be used by StarPU. \var double starpu_task::flops This can be set to the number of floating points operations that the task will have to achieve. This is useful for easily getting GFlops curves from the tool starpu_perfmodel_plot, and for the hypervisor load balancing. \var void *starpu_task::starpu_private \private This is private to StarPU, do not modify. If the task is allocated by hand (without starpu_task_create()), this field should be set to NULL. \var int starpu_task::magic \private This field is set when initializing a task. The function starpu_task_submit() will fail if the field does not have the right value. This will hence avoid submitting tasks which have not been properly initialised. \var unsigned starpu_task::sched_ctx Scheduling context. \var int starpu_task::hypervisor_tag Helps the hypervisor monitor the execution of this task. \var unsigned starpu_task::scheduled Whether the scheduler has pushed the task on some queue \fn void starpu_task_init(struct starpu_task *task) \ingroup API_Codelet_And_Tasks Initialize task with default values. This function is implicitly called by starpu_task_create(). By default, tasks initialized with starpu_task_init() must be deinitialized explicitly with starpu_task_clean(). Tasks can also be initialized statically, using ::STARPU_TASK_INITIALIZER. \def STARPU_TASK_INITIALIZER \ingroup API_Codelet_And_Tasks It is possible to initialize statically allocated tasks with this value. This is equivalent to initializing a structure starpu_task with the function starpu_task_init() function. \def STARPU_TASK_GET_NBUFFERS(task) \ingroup API_Codelet_And_Tasks Return the number of buffers for this task, i.e. starpu_codelet::nbuffers, or starpu_task::nbuffers if the former is STARPU_VARIABLE_NBUFFERS. \def STARPU_TASK_GET_HANDLE(task, i) \ingroup API_Codelet_And_Tasks Return the \p i th data handle of the given task. If the task is defined with a static or dynamic number of handles, will either return the \p i th element of the field starpu_task::handles or the \p i th element of the field starpu_task::dyn_handles (see \ref SettingManyDataHandlesForATask) \def STARPU_TASK_SET_HANDLE(task, handle, i) \ingroup API_Codelet_And_Tasks Set the \p i th data handle of the given task with the given dat handle. If the task is defined with a static or dynamic number of handles, will either set the \p i th element of the field starpu_task::handles or the \p i th element of the field starpu_task::dyn_handles (see \ref SettingManyDataHandlesForATask) \def STARPU_CODELET_GET_MODE(codelet, i) \ingroup API_Codelet_And_Tasks Return the access mode of the \p i th data handle of the given codelet. If the codelet is defined with a static or dynamic number of handles, will either return the \p i th element of the field starpu_codelet::modes or the \p i th element of the field starpu_codelet::dyn_modes (see \ref SettingManyDataHandlesForATask) \def STARPU_CODELET_SET_MODE(codelet, mode, i) \ingroup API_Codelet_And_Tasks Set the access mode of the \p i th data handle of the given codelet. If the codelet is defined with a static or dynamic number of handles, will either set the \p i th element of the field starpu_codelet::modes or the \p i th element of the field starpu_codelet::dyn_modes (see \ref SettingManyDataHandlesForATask) \def STARPU_TASK_GET_MODE(task, i) \ingroup API_Codelet_And_Tasks Return the access mode of the \p i th data handle of the given task. If the task is defined with a static or dynamic number of handles, will either return the \p i th element of the field starpu_task::modes or the \p i th element of the field starpu_task::dyn_modes (see \ref SettingManyDataHandlesForATask) \def STARPU_TASK_SET_MODE(task, mode, i) \ingroup API_Codelet_And_Tasks Set the access mode of the \p i th data handle of the given task. If the task is defined with a static or dynamic number of handles, will either set the \p i th element of the field starpu_task::modes or the \p i th element of the field starpu_task::dyn_modes (see \ref SettingManyDataHandlesForATask) \fn struct starpu_task *starpu_task_create(void) \ingroup API_Codelet_And_Tasks Allocate a task structure and initialize it with default values. Tasks allocated dynamically with starpu_task_create() are automatically freed when the task is terminated. This means that the task pointer can not be used any more once the task is submitted, since it can be executed at any time (unless dependencies make it wait) and thus freed at any time. If the field starpu_task::destroy is explicitly unset, the resources used by the task have to be freed by calling starpu_task_destroy(). \fn struct starpu_task *starpu_task_dup(struct starpu_task *task) \ingroup API_Codelet_And_Tasks Allocate a task structure which is the exact duplicate of the given task. \fn void starpu_task_clean(struct starpu_task *task) \ingroup API_Codelet_And_Tasks Release all the structures automatically allocated to execute task, but not the task structure itself and values set by the user remain unchanged. It is thus useful for statically allocated tasks for instance. It is also useful when users want to execute the same operation several times with as least overhead as possible. It is called automatically by starpu_task_destroy(). It has to be called only after explicitly waiting for the task or after starpu_shutdown() (waiting for the callback is not enough, since StarPU still manipulates the task after calling the callback). \fn void starpu_task_destroy(struct starpu_task *task) \ingroup API_Codelet_And_Tasks Free the resource allocated during starpu_task_create() and associated with task. This function is already called automatically after the execution of a task when the field starpu_task::destroy is set, which is the default for tasks created by starpu_task_create(). Calling this function on a statically allocated task results in an undefined behaviour. \fn int starpu_task_wait(struct starpu_task *task) \ingroup API_Codelet_And_Tasks This function blocks until \p task has been executed. It is not possible to synchronize with a task more than once. It is not possible to wait for synchronous or detached tasks. Upon successful completion, this function returns 0. Otherwise, -EINVAL indicates that the specified task was either synchronous or detached. \fn int starpu_task_submit(struct starpu_task *task) \ingroup API_Codelet_And_Tasks This function submits task to StarPU. Calling this function does not mean that the task will be executed immediately as there can be data or task (tag) dependencies that are not fulfilled yet: StarPU will take care of scheduling this task with respect to such dependencies. This function returns immediately if the field starpu_task::synchronous is set to 0, and block until the termination of the task otherwise. It is also possible to synchronize the application with asynchronous tasks by the means of tags, using the function starpu_tag_wait() function for instance. In case of success, this function returns 0, a return value of -ENODEV means that there is no worker able to process this task (e.g. there is no GPU available and this task is only implemented for CUDA devices). starpu_task_submit() can be called from anywhere, including codelet functions and callbacks, provided that the field starpu_task::synchronous is set to 0. \fn int starpu_task_submit_to_ctx(struct starpu_task *task, unsigned sched_ctx_id) \ingroup API_Codelet_And_Tasks This function submits a task to StarPU to the context sched_ctx_id . By default starpu_task_submit submits the task to a global context that is created automatically by StarPU. \fn int starpu_task_wait_for_all(void) \ingroup API_Codelet_And_Tasks This function blocks until all the tasks that were submitted (to the current context or the global one if there aren't any) are terminated. It does not destroy these tasks. \fn int starpu_task_wait_for_all_in_ctx(unsigned sched_ctx_id) \ingroup API_Codelet_And_Tasks This function waits until all the tasks that were already submitted to the context \p sched_ctx_id have been executed. \fn int starpu_task_wait_for_n_submitted(unsigned n) \ingroup API_Codelet_And_Tasks This function blocks until there are n submitted tasks left (to the current context or the global one if there aren't any) to be executed. It does not destroy these tasks. \fn int starpu_task_wait_for_n_submitted_in_ctx(unsigned sched_ctx_id, unsigned n) \ingroup API_Codelet_And_Tasks This function waits until there are n tasks submitted left to be executed that were already submitted to the context sched_ctx_id . \fn int starpu_task_nready(void) \ingroup API_Codelet_And_Tasks TODO \fn int starpu_task_nsubmitted(void) \ingroup API_Codelet_And_Tasks Return the number of submitted tasks which have not completed yet. \fn int starpu_task_nready(void) \ingroup API_Codelet_And_Tasks Return the number of submitted tasks which are ready for execution are already executing. It thus does not include tasks waiting for dependencies. \fn struct starpu_task *starpu_task_get_current(void) \ingroup API_Codelet_And_Tasks This function returns the task currently executed by the worker, or NULL if it is called either from a thread that is not a task or simply because there is no task being executed at the moment. \fn const char *starpu_task_get_name(struct starpu_task *task) \ingroup API_Codelet_And_Tasks This function returns the name of \p task, i.e. either its task->name field, or the name of the corresponding performance model. \fn const char *starpu_task_get_model_name(struct starpu_task *task) \ingroup API_Codelet_And_Tasks This function returns the name of the performance model of \p task. \fn void starpu_codelet_display_stats(struct starpu_codelet *cl) \ingroup API_Codelet_And_Tasks Output on stderr some statistics on the codelet \p cl. \fn int starpu_task_wait_for_no_ready(void) \ingroup API_Codelet_And_Tasks This function waits until there is no more ready task. \fn void starpu_task_set_implementation(struct starpu_task *task, unsigned impl) \ingroup API_Codelet_And_Tasks This function should be called by schedulers to specify the codelet implementation to be executed when executing the task. \fn unsigned starpu_task_get_implementation(struct starpu_task *task) \ingroup API_Codelet_And_Tasks This function return the codelet implementation to be executed when executing the task. \fn void starpu_iteration_push(unsigned long iteration) \ingroup API_Codelet_And_Tasks Sets the iteration number for all the tasks to be submitted after this call. This is typically called at the beginning of a task submission loop. This number will then show up in tracing tools. A corresponding starpu_iteration_pop() call must be made to match the call to starpu_iteration_push(), at the end of the same task submission loop, typically. Nested calls to starpu_iteration_push and starpu_iteration_pop are allowed, to describe a loop nest for instance, provided that they match properly. \fn void starpu_iteration_pop(void) \ingroup API_Codelet_And_Tasks Drops the iteration number for submitted tasks. This must match a previous call to starpu_iteration_push(), and is typically called at the end of a task submission loop. \fn void starpu_create_sync_task(starpu_tag_t sync_tag, unsigned ndeps, starpu_tag_t *deps, void (*callback)(void *), void *callback_arg) \ingroup API_Codelet_And_Tasks This creates (and submits) an empty task that unlocks a tag once all its dependencies are fulfilled. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/cuda_extensions.doxy000066400000000000000000000113271320135501600246560ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_CUDA_Extensions CUDA Extensions \def STARPU_USE_CUDA \ingroup API_CUDA_Extensions This macro is defined when StarPU has been installed with CUDA support. It should be used in your code to detect the availability of CUDA as shown in \ref FullSourceCodeVectorScal. \def STARPU_MAXCUDADEVS \ingroup API_CUDA_Extensions This macro defines the maximum number of CUDA devices that are supported by StarPU. \fn cudaStream_t starpu_cuda_get_local_stream(void) \ingroup API_CUDA_Extensions This function gets the current worker’s CUDA stream. StarPU provides a stream for every CUDA device controlled by StarPU. This function is only provided for convenience so that programmers can easily use asynchronous operations within codelets without having to create a stream by hand. Note that the application is not forced to use the stream provided by starpu_cuda_get_local_stream() and may also create its own streams. Synchronizing with cudaThreadSynchronize() is allowed, but will reduce the likelihood of having all transfers overlapped. \fn const struct cudaDeviceProp *starpu_cuda_get_device_properties(unsigned workerid) \ingroup API_CUDA_Extensions This function returns a pointer to device properties for worker \p workerid (assumed to be a CUDA worker). \fn void starpu_cuda_report_error(const char *func, const char *file, int line, cudaError_t status) \ingroup API_CUDA_Extensions Report a CUDA error. \def STARPU_CUDA_REPORT_ERROR(status) \ingroup API_CUDA_Extensions Calls starpu_cuda_report_error(), passing the current function, file and line position. \fn int starpu_cuda_copy_async_sync(void *src_ptr, unsigned src_node, void *dst_ptr, unsigned dst_node, size_t ssize, cudaStream_t stream, enum cudaMemcpyKind kind) \ingroup API_CUDA_Extensions Copy \p ssize bytes from the pointer \p src_ptr on \p src_node to the pointer \p dst_ptr on \p dst_node. The function first tries to copy the data asynchronous (unless stream is NULL). If the asynchronous copy fails or if stream is NULL, it copies the data synchronously. The function returns -EAGAIN if the asynchronous launch was successfull. It returns 0 if the synchronous copy was successful, or fails otherwise. \fn void starpu_cuda_set_device(unsigned devid) \ingroup API_CUDA_Extensions Calls cudaSetDevice(devid) or cudaGLSetGLDevice(devid), according to whether \p devid is among the field starpu_conf::cuda_opengl_interoperability. \fn void starpu_cublas_init(void) \ingroup API_CUDA_Extensions This function initializes CUBLAS on every CUDA device. The CUBLAS library must be initialized prior to any CUBLAS call. Calling starpu_cublas_init() will initialize CUBLAS on every CUDA device controlled by StarPU. This call blocks until CUBLAS has been properly initialized on every device. \fn void starpu_cublas_set_stream(void) \ingroup API_CUDA_Extensions This function sets the proper CUBLAS stream for CUBLAS v1. This must be called from the CUDA codelet before calling CUBLAS v1 kernels, so that they are queued on the proper CUDA stream. When using one thread per CUDA worker, this function does not do anything since the CUBLAS stream does not change, and is set once by starpu_cublas_init(). \fn cublasHandle_t starpu_cublas_get_local_handle(void) \ingroup API_CUDA_Extensions This function returns the CUBLAS v2 handle to be used to queue CUBLAS v2 kernels. It is properly initialized and configured for multistream by starpu_cublas_init(). \fn void starpu_cublas_shutdown(void) \ingroup API_CUDA_Extensions This function synchronously deinitializes the CUBLAS library on every CUDA device. \fn void starpu_cublas_report_error(const char *func, const char *file, int line, int status) \ingroup API_CUDA_Extensions Report a cublas error. \def STARPU_CUBLAS_REPORT_ERROR(status) \ingroup API_CUDA_Extensions Calls starpu_cublas_report_error(), passing the current function, file and line position. \fn void starpu_cusparse_init(void) \ingroup API_CUDA_Extensions Calling starpu_cusparse_init() will initialize CUSPARSE on every CUDA device controlled by StarPU. This call blocks until CUSPARSE has been properly initialized on every device. \fn cusparseHandle_t starpu_cusparse_get_local_handle(void) \ingroup API_CUDA_Extensions This function returns the CUSPARSE handle to be used to queue CUSPARSE kernels. It is properly initialized and configured for multistream by starpu_cusparse_init(). \fn void starpu_cusparse_shutdown(void) \ingroup API_CUDA_Extensions This function synchronously deinitializes the CUSPARSE library on every CUDA device. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/data_interfaces.doxy000066400000000000000000001442221320135501600246000ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016, 2017 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Data_Interfaces Data Interfaces \struct starpu_data_interface_ops Per-interface data transfer methods. \ingroup API_Data_Interfaces \var void (*starpu_data_interface_ops::register_data_handle)(starpu_data_handle_t handle, unsigned home_node, void *data_interface) Register an existing interface into a data handle. This iterates over all memory nodes to initialize all fields of the data interface on each of them. Since data is not allocated yet except on the home node, pointers should be left as NULL except on the \p home_node, for which the pointers should be copied from the given \p data_interface, which was filled with the application's pointers. \var starpu_ssize_t (*starpu_data_interface_ops::allocate_data_on_node)(void *data_interface, unsigned node) Allocate data for the interface on a given node. This should use starpu_malloc_on_node to perform the allocation(s), and fill the pointers in the data interface. It should return the size of the allocated memory, or -ENOMEM if memory could not be allocated. \var void (*starpu_data_interface_ops::free_data_on_node)(void *data_interface, unsigned node) Free data of the interface on a given node. \var const struct starpu_data_copy_methods *starpu_data_interface_ops::copy_methods This provides a series of methods for performing ram/cuda/opencl synchronous and asynchronous transfers. \var void *(*starpu_data_interface_ops::handle_to_pointer)(starpu_data_handle_t handle, unsigned node) Return the current pointer (if any) for the handle on the given node. \var size_t (*starpu_data_interface_ops::get_size)(starpu_data_handle_t handle) Return an estimation of the size of data, for performance models. \var uint32_t (*starpu_data_interface_ops::footprint)(starpu_data_handle_t handle) Return a 32bit footprint which characterizes the data size and layout (nx, ny, ld, elemsize, etc.) \var int (*starpu_data_interface_ops::compare)(void *data_interface_a, void *data_interface_b) Compare the data size and layout of two interfaces (nx, ny, ld, elemsize, etc.). It should return 1 if the two interfaces size and layout match, and 0 otherwise. \var void (*starpu_data_interface_ops::display)(starpu_data_handle_t handle, FILE *f) Dump the sizes of a handle to a file. \var starpu_ssize_t (*starpu_data_interface_ops::describe)(void *data_interface, char *buf, size_t size) Describe the data into a string in a brief way, such as one letter to describe the type of data, and the data dimensions. \var enum starpu_data_interface_id starpu_data_interface_ops::interfaceid An identifier that is unique to each interface. \var enum starpu_data_interface_id starpu_data_interface_ops::name Name of the interface \var size_t starpu_data_interface_ops::interface_size The size of the interface data descriptor. \var char starpu_data_interface_ops::is_multiformat todo \var char starpu_data_interface_ops::dontcache If set to non-zero, StarPU will never try to reuse an allocated buffer for a different handle. This can be notably useful for application-defined interfaces which have a dynamic size, and for which it thus does not make sense to reuse the buffer since will probably not have the proper size. \var struct starpu_multiformat_data_interface_ops* (*starpu_data_interface_ops::get_mf_ops)(void *data_interface) todo \var int (*starpu_data_interface_ops::pack_data)(starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count) Pack the data handle into a contiguous buffer at the address allocated with starpu_malloc_flags(ptr, size, 0) (and thus returned in ptr) and set the size of the newly created buffer in count. If ptr is NULL, the function should not copy the data in the buffer but just set count to the size of the buffer which would have been allocated. The special value -1 indicates the size is yet unknown. \var int (*starpu_data_interface_ops::unpack_data) (starpu_data_handle_t handle, unsigned node, void *ptr, size_t count) Unpack the data handle from the contiguous buffer at the address ptr of size count \struct starpu_data_copy_methods Defines the per-interface methods. If the any_to_any method is provided, it will be used by default if no more specific method is provided. It can still be useful to provide more specific method in case of e.g. available particular CUDA or OpenCL support. \ingroup API_Data_Interfaces \var int (*starpu_data_copy_methods::can_copy)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, unsigned handling_node) If defined, allows the interface to declare whether it supports transferring from \p src_interface on node \p src_node to \p dst_interface on node \p dst_node, run from node \p handling_node. If not defined, it is assumed that the interface supports all transfers. \var int (*starpu_data_copy_methods::ram_to_ram)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) Define how to copy data from the \p src_interface interface on the \p src_node CPU node to the \p dst_interface interface on the \p dst_node CPU node. Return 0 on success. \var int (*starpu_data_copy_methods::ram_to_cuda)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) Define how to copy data from the \p src_interface interface on the \p src_node CPU node to the \p dst_interface interface on the \p dst_node CUDA node. Return 0 on success. \var int (*starpu_data_copy_methods::ram_to_opencl)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) Define how to copy data from the \p src_interface interface on the \p src_node CPU node to the \p dst_interface interface on the \p dst_node OpenCL node. Return 0 on success. \var int (*starpu_data_copy_methods::ram_to_mic)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) Define how to copy data from the \p src_interface interface on the \p src_node CPU node to the \p dst_interface interface on the \p dst_node MIC node. Return 0 on success. \var int (*starpu_data_copy_methods::cuda_to_ram)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) Define how to copy data from the \p src_interface interface on the \p src_node CUDA node to the \p dst_interface interface on the \p dst_node CPU node. Return 0 on success. \var int (*starpu_data_copy_methods::cuda_to_cuda)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) Define how to copy data from the \p src_interface interface on the \p src_node CUDA node to the \p dst_interface interface on the \p dst_node CUDA node. Return 0 on success. \var int (*starpu_data_copy_methods::cuda_to_opencl)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) Define how to copy data from the \p src_interface interface on the \p src_node CUDA node to the \p dst_interface interface on the \p dst_node OpenCL node. Return 0 on success. \var int (*starpu_data_copy_methods::opencl_to_ram)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) Define how to copy data from the \p src_interface interface on the \p src_node OpenCL node to the \p dst_interface interface on the \p dst_node CPU node. Return 0 on success. \var int (*starpu_data_copy_methods::opencl_to_cuda)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) Define how to copy data from the \p src_interface interface on the \p src_node OpenCL node to the \p dst_interface interface on the \p dst_node CUDA node. Return 0 on success. \var int (*starpu_data_copy_methods::opencl_to_opencl)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) Define how to copy data from the \p src_interface interface on the \p src_node OpenCL node to the \p dst_interface interface on the \p dst_node OpenCL node. Return 0 on success. \var int (*starpu_data_copy_methods::mic_to_ram)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) Define how to copy data from the \p src_interface interface on the \p src_node MIC node to the \p dst_interface interface on the \p dst_node CPU node. Return 0 on success. \var int (*starpu_data_copy_methods::scc_src_to_sink)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) Define how to copy data from the \p src_interface interface on the \p src_node node to the \p dst_interface interface on the \p dst_node node. Must return 0 if the transfer was actually completed completely synchronously, or -EAGAIN if at least some transfers are still ongoing and should be awaited for by the core. \var int (*starpu_data_copy_methods::scc_sink_to_src)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) Define how to copy data from the \p src_interface interface on the \p src_node node to the \p dst_interface interface on the \p dst_node node. Must return 0 if the transfer was actually completed completely synchronously, or -EAGAIN if at least some transfers are still ongoing and should be awaited for by the core. \var int (*starpu_data_copy_methods::scc_sink_to_sink)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) Define how to copy data from the \p src_interface interface on the \p src_node node to the \p dst_interface interface on the \p dst_node node. Must return 0 if the transfer was actually completed completely synchronously, or -EAGAIN if at least some transfers are still ongoing and should be awaited for by the core. \var int (*starpu_data_copy_methods::ram_to_cuda_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cudaStream_t stream) Define how to copy data from the \p src_interface interface on the \p src_node CPU node to the \p dst_interface interface on the \p dst_node CUDA node, using the given stream. Must return 0 if the transfer was actually completed completely synchronously, or -EAGAIN if at least some transfers are still ongoing and should be awaited for by the core. \var int (*starpu_data_copy_methods::cuda_to_ram_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cudaStream_t stream) Define how to copy data from the \p src_interface interface on the \p src_node CUDA node to the \p dst_interface interface on the \p dst_node CPU node, using the given stream. Must return 0 if the transfer was actually completed completely synchronously, or -EAGAIN if at least some transfers are still ongoing and should be awaited for by the core. \var int (*starpu_data_copy_methods::cuda_to_cuda_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cudaStream_t stream) Define how to copy data from the \p src_interface interface on the \p src_node CUDA node to the \p dst_interface interface on the \p dst_node CUDA node, using the given stream. Must return 0 if the transfer was actually completed completely synchronously, or -EAGAIN if at least some transfers are still ongoing and should be awaited for by the core. \var int (*starpu_data_copy_methods::ram_to_opencl_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event) Define how to copy data from the \p src_interface interface on the \p src_node CPU node to the \p dst_interface interface on the \p dst_node OpenCL node, by recording in event, a pointer to a cl_event, the event of the last submitted transfer. Must return 0 if the transfer was actually completed completely synchronously, or -EAGAIN if at least some transfers are still ongoing and should be awaited for by the core. \var int (*starpu_data_copy_methods::opencl_to_ram_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event) Define how to copy data from the \p src_interface interface on the \p src_node OpenCL node to the \p dst_interface interface on the \p dst_node CPU node, by recording in event, a pointer to a cl_event, the event of the last submitted transfer. Must return 0 if the transfer was actually completed completely synchronously, or -EAGAIN if at least some transfers are still ongoing and should be awaited for by the core. \var int (*starpu_data_copy_methods::opencl_to_opencl_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event) Define how to copy data from the \p src_interface interface on the \p src_node OpenCL node to the \p dst_interface interface on the \p dst_node OpenCL node, by recording in event, a pointer to a cl_event, the event of the last submitted transfer. Must return 0 if the transfer was actually completed completely synchronously, or -EAGAIN if at least some transfers are still ongoing and should be awaited for by the core. \var int (*starpu_data_copy_methods::ram_to_mic_async)(void *src_intreface, unsigned src_node, void *dst_interface, unsigned dst_node) Define how to copy data from the \p src_interface interface on the \p src_node CPU node to the \p dst_interface interface on the \p dst_node MIC node. Must return 0 if the transfer was actually completed completely synchronously, or -EAGAIN if at least some transfers are still ongoing and should be awaited for by the core. \var int (*starpu_data_copy_methods::mic_to_ram_async)(void *src_intreface, unsigned src_node, void *dst_interface, unsigned dst_node) Define how to copy data from the \p src_interface interface on the \p src_node MIC node to the \p dst_interface interface on the \p dst_node CPU node. Must return 0 if the transfer was actually completed completely synchronously, or -EAGAIN if at least some transfers are still ongoing and should be awaited for by the core. \var int (*starpu_data_copy_methods::any_to_any)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data) Define how to copy data from the \p src_interface interface on the \p src_node node to the \p dst_interface interface on the \p dst_node node. This is meant to be implemented through the starpu_interface_copy() helper, to which async_data should be passed as such, and will be used to manage asynchronicity. This must return -EAGAIN if any of the starpu_interface_copy() calls has returned -EAGAIN (i.e. at least some transfer is still ongoing), and return 0 otherwise. \enum starpu_data_interface_id \ingroup API_Data_Interfaces Identifier for all predefined StarPU data interfaces \var starpu_data_interface_id::STARPU_UNKNOWN_INTERFACE_ID Unknown interface \var starpu_data_interface_id::STARPU_MATRIX_INTERFACE_ID Identifier for the matrix data interface \var starpu_data_interface_id::STARPU_BLOCK_INTERFACE_ID Identifier for block data interface \var starpu_data_interface_id::STARPU_VECTOR_INTERFACE_ID Identifier for the vector data interface \var starpu_data_interface_id::STARPU_CSR_INTERFACE_ID Identifier for the csr data interface \var starpu_data_interface_id::STARPU_BCSR_INTERFACE_ID Identifier for the bcsr data interface \var starpu_data_interface_id::STARPU_VARIABLE_INTERFACE_ID Identifier for the variable data interface \var starpu_data_interface_id::STARPU_VOID_INTERFACE_ID Identifier for the void data interface \var starpu_data_interface_id::STARPU_MULTIFORMAT_INTERFACE_ID Identifier for the multiformat data interface \var starpu_data_interface_id::STARPU_COO_INTERFACE_ID Identifier for the coo data interface \var starpu_data_interface_id::STARPU_MAX_INTERFACE_ID Maximum number of data interfaces @name Registering Data \ingroup API_Data_Interfaces There are several ways to register a memory region so that it can be managed by StarPU. The functions below allow the registration of vectors, 2D matrices, 3D matrices as well as BCSR and CSR sparse matrices. \fn void starpu_void_data_register(starpu_data_handle_t *handle) \ingroup API_Data_Interfaces Register a void interface. There is no data really associated to that interface, but it may be used as a synchronization mechanism. It also permits to express an abstract piece of data that is managed by the application internally: this makes it possible to forbid the concurrent execution of different tasks accessing the same void data in read-write concurrently. \fn void starpu_variable_data_register(starpu_data_handle_t *handle, int home_node, uintptr_t ptr, size_t size) \ingroup API_Data_Interfaces Register the \p size byte element pointed to by \p ptr, which is typically a scalar, and initialize \p handle to represent this data item. Here an example of how to use the function. \code{.c} float var; starpu_data_handle_t var_handle; starpu_variable_data_register(&var_handle, STARPU_MAIN_RAM, (uintptr_t)&var, sizeof(var)); \endcode \fn void starpu_variable_ptr_register(starpu_data_handle_t handle, unsigned node, uintptr_t ptr, uintptr_t dev_handle, size_t offset) \ingroup API_Data_Interfaces Register into the \p handle that to store data on node \p node it should use the buffer located at \p ptr, or device handle \p dev_handle and offset \p offset (for OpenCL, notably) \fn void starpu_vector_data_register(starpu_data_handle_t *handle, int home_node, uintptr_t ptr, uint32_t nx, size_t elemsize) \ingroup API_Data_Interfaces Register the \p nx elemsize-byte elements pointed to by \p ptr and initialize \p handle to represent it. Here an example of how to use the function. \code{.c} float vector[NX]; starpu_data_handle_t vector_handle; starpu_vector_data_register(&vector_handle, STARPU_MAIN_RAM, (uintptr_t)vector, NX, sizeof(vector[0])); \endcode \fn void starpu_vector_ptr_register(starpu_data_handle_t handle, unsigned node, uintptr_t ptr, uintptr_t dev_handle, size_t offset) \ingroup API_Data_Interfaces Register into the \p handle that to store data on node \p node it should use the buffer located at \p ptr, or device handle \p dev_handle and offset \p offset (for OpenCL, notably) \fn void starpu_matrix_data_register(starpu_data_handle_t *handle, int home_node, uintptr_t ptr, uint32_t ld, uint32_t nx, uint32_t ny, size_t elemsize) \ingroup API_Data_Interfaces Register the \p nx x \p ny 2D matrix of \p elemsize-byte elements pointed by \p ptr and initialize \p handle to represent it. \p ld specifies the number of elements between rows. a value greater than \p nx adds padding, which can be useful for alignment purposes. Here an example of how to use the function. \code{.c} float *matrix; starpu_data_handle_t matrix_handle; matrix = (float*)malloc(width * height * sizeof(float)); starpu_matrix_data_register(&matrix_handle, STARPU_MAIN_RAM, (uintptr_t)matrix, width, width, height, sizeof(float)); \endcode \fn void starpu_matrix_ptr_register(starpu_data_handle_t handle, unsigned node, uintptr_t ptr, uintptr_t dev_handle, size_t offset, uint32_t ld) \ingroup API_Data_Interfaces Register into the \p handle that to store data on node \p node it should use the buffer located at \p ptr, or device handle \p dev_handle and offset \p offset (for OpenCL, notably), with \p ld elements between rows. \fn void starpu_block_data_register(starpu_data_handle_t *handle, int home_node, uintptr_t ptr, uint32_t ldy, uint32_t ldz, uint32_t nx, uint32_t ny, uint32_t nz, size_t elemsize) \ingroup API_Data_Interfaces Register the \p nx x \p ny x \p nz 3D matrix of \p elemsize byte elements pointed by \p ptr and initialize \p handle to represent it. Again, \p ldy and \p ldz specify the number of elements between rows and between z planes. Here an example of how to use the function. \code{.c} float *block; starpu_data_handle_t block_handle; block = (float*)malloc(nx*ny*nz*sizeof(float)); starpu_block_data_register(&block_handle, STARPU_MAIN_RAM, (uintptr_t)block, nx, nx*ny, nx, ny, nz, sizeof(float)); \endcode \fn void starpu_block_ptr_register(starpu_data_handle_t handle, unsigned node, uintptr_t ptr, uintptr_t dev_handle, size_t offset, uint32_t ldy, uint32_t ldz) \ingroup API_Data_Interfaces Register into the \p handle that to store data on node \p node it should use the buffer located at \p ptr, or device handle \p dev_handle and offset \p offset (for OpenCL, notably), with \p ldy elements between rows and \p ldz elements between z planes. \fn void starpu_bcsr_data_register(starpu_data_handle_t *handle, int home_node, uint32_t nnz, uint32_t nrows, uintptr_t nzval, uint32_t *colind, uint32_t *rowptr, uint32_t firstentry, uint32_t r, uint32_t c, size_t elemsize) \ingroup API_Data_Interfaces This variant of starpu_data_register() uses the BCSR (Blocked Compressed Sparse Row Representation) sparse matrix interface. Register the sparse matrix made of \p nnz non-zero blocks of elements of size \p elemsize stored in \p nzval and initializes \p handle to represent it. Blocks have size \p r * \p c. \p nrows is the number of rows (in terms of blocks), \p colind is an array of nnz elements, colind[i] is the block-column index for block i in \p nzval, \p rowptr is an array of nrows+1 elements, rowptr[i] is the block-index (in \p nzval) of the first block of row i. By convention, rowptr[nrows] is the number of blocks, this allows an easier access of the matrix's elements for the kernels. \p firstentry is the index of the first entry of the given arrays (usually 0 or 1). Here an example of how to use the function. \code{.c} /* * We use the following matrix: * * +----------------+ * | 0 1 0 0 | * | 2 3 0 0 | * | 4 5 8 9 | * | 6 7 10 11 | * +----------------+ * * nzval = [0, 1, 2, 3] ++ [4, 5, 6, 7] ++ [8, 9, 10, 11] * colind = [0, 0, 1] * rowptr = [0, 1, 3] * r = c = 2 */ /* Size of the blocks */ int R = 2; int C = 2; int NROWS = 2; int NNZ_BLOCKS = 3; /* out of 4 */ int NZVAL_SIZE = (R*C*NNZ_BLOCKS); int nzval[NZVAL_SIZE] = { 0, 1, 2, 3, /* First block */ 4, 5, 6, 7, /* Second block */ 8, 9, 10, 11 /* Third block */ }; uint32_t colind[NNZ_BLOCKS] = { 0, /* block-column index for first block in nzval */ 0, /* block-column index for second block in nzval */ 1 /* block-column index for third block in nzval */ }; uint32_t rowptr[NROWS+1] = { 0, / * block-index in nzval of the first block of the first row. */ 1, / * block-index in nzval of the first block of the second row. */ NNZ_BLOCKS /* number of blocks, to allow an easier element's access for the kernels */ }; starpu_data_handle_t bcsr_handle; starpu_bcsr_data_register(&bcsr_handle, STARPU_MAIN_RAM, NNZ_BLOCKS, NROWS, (uintptr_t) nzval, colind, rowptr, 0, /* firstentry */ R, C, sizeof(nzval[0])); \endcode \fn void starpu_csr_data_register(starpu_data_handle_t *handle, int home_node, uint32_t nnz, uint32_t nrow, uintptr_t nzval, uint32_t *colind, uint32_t *rowptr, uint32_t firstentry, size_t elemsize) \ingroup API_Data_Interfaces This variant of starpu_data_register() uses the CSR (Compressed Sparse Row Representation) sparse matrix interface. TODO \fn void starpu_coo_data_register(starpu_data_handle_t *handleptr, int home_node, uint32_t nx, uint32_t ny, uint32_t n_values, uint32_t *columns, uint32_t *rows, uintptr_t values, size_t elemsize); \ingroup API_Data_Interfaces Register the \p nx x \p ny 2D matrix given in the COO format, using the \p columns, \p rows, \p values arrays, which must have \p n_values elements of size \p elemsize. Initialize \p handleptr. \fn void *starpu_data_get_interface_on_node(starpu_data_handle_t handle, unsigned memory_node) \ingroup API_Data_Interfaces Return the interface associated with \p handle on \p memory_node. @name Accessing Data Interfaces \ingroup API_Data_Interfaces Each data interface is provided with a set of field access functions. The ones using a void * parameter aimed to be used in codelet implementations (see for example the code in \ref VectorScalingUsingStarPUAPI). \fn void *starpu_data_handle_to_pointer(starpu_data_handle_t handle, unsigned node) \ingroup API_Data_Interfaces Return the pointer associated with \p handle on node \p node or NULL if handle’s interface does not support this operation or data for this \p handle is not allocated on that \p node. \fn void *starpu_data_get_local_ptr(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the local pointer associated with \p handle or NULL if \p handle’s interface does not have data allocated locally \fn enum starpu_data_interface_id starpu_data_get_interface_id(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the unique identifier of the interface associated with the given \p handle. \fn size_t starpu_data_get_size(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the size of the data associated with \p handle. \fn int starpu_data_pack(starpu_data_handle_t handle, void **ptr, starpu_ssize_t *count) \ingroup API_Data_Interfaces Execute the packing operation of the interface of the data registered at \p handle (see starpu_data_interface_ops). This packing operation must allocate a buffer large enough at \p ptr and copy into the newly allocated buffer the data associated to \p handle. \p count will be set to the size of the allocated buffer. If \p ptr is NULL, the function should not copy the data in the buffer but just set \p count to the size of the buffer which would have been allocated. The special value -1 indicates the size is yet unknown. \fn int starpu_data_unpack(starpu_data_handle_t handle, void *ptr, size_t count) \ingroup API_Data_Interfaces Unpack in handle the data located at \p ptr of size \p count as described by the interface of the data. The interface registered at \p handle must define a unpacking operation (see starpu_data_interface_ops). The memory at the address \p ptr is freed after calling the data unpacking operation. @name Accessing Variable Data Interfaces \ingroup API_Data_Interfaces \struct starpu_variable_interface Variable interface for a single data (not a vector, a matrix, a list, ...) \ingroup API_Data_Interfaces \var enum starpu_data_interface_id starpu_variable_interface::id Identifier of the interface \var uintptr_t starpu_variable_interface::ptr local pointer of the variable \var uintptr_t starpu_variable_interface::dev_handle device handle of the variable. \var size_t starpu_variable_interface::offset offset in the variable \var size_t starpu_variable_interface::elemsize size of the variable \fn size_t starpu_variable_get_elemsize(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the size of the variable designated by \p handle. \fn uintptr_t starpu_variable_get_local_ptr(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return a pointer to the variable designated by \p handle. \def STARPU_VARIABLE_GET_PTR(interface) \ingroup API_Data_Interfaces Return a pointer to the variable designated by \p interface. \def STARPU_VARIABLE_GET_ELEMSIZE(interface) \ingroup API_Data_Interfaces Return the size of the variable designated by \p interface. \def STARPU_VARIABLE_GET_DEV_HANDLE(interface) \ingroup API_Data_Interfaces Return a device handle for the variable designated by \p interface, to be used on OpenCL. The offset documented below has to be used in addition to this. \def STARPU_VARIABLE_GET_OFFSET(interface) \ingroup API_Data_Interfaces Return the offset in the variable designated by \p interface, to be used with the device handle. @name Accessing Vector Data Interfaces \ingroup API_Data_Interfaces \struct starpu_vector_interface Vector interface \ingroup API_Data_Interfaces \var enum starpu_data_interface_id starpu_vector_interface::id Identifier of the interface \var uintptr_t starpu_vector_interface::ptr local pointer of the vector \var uintptr_t starpu_vector_interface::dev_handle device handle of the vector. \var size_t starpu_vector_interface::offset offset in the vector \var uint32_t starpu_vector_interface::nx number of elements on the x-axis of the vector \var size_t starpu_vector_interface::elemsize size of the elements of the vector \var uint32_t starpu_vector_interface::slice_base vector slice base, used by the StarPU OpenMP runtime support \fn uint32_t starpu_vector_get_nx(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the number of elements registered into the array designated by \p handle. \fn size_t starpu_vector_get_elemsize(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the size of each element of the array designated by \p handle. \fn uintptr_t starpu_vector_get_local_ptr(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the local pointer associated with \p handle. \def STARPU_VECTOR_GET_PTR(interface) \ingroup API_Data_Interfaces Return a pointer to the array designated by \p interface, valid on CPUs and CUDA only. For OpenCL, the device handle and offset need to be used instead. \def STARPU_VECTOR_GET_DEV_HANDLE(interface) \ingroup API_Data_Interfaces Return a device handle for the array designated by \p interface, to be used on OpenCL. the offset documented below has to be used in addition to this. \def STARPU_VECTOR_GET_OFFSET(interface) \ingroup API_Data_Interfaces Return the offset in the array designated by \p interface, to be used with the device handle. \def STARPU_VECTOR_GET_NX(interface) \ingroup API_Data_Interfaces Return the number of elements registered into the array designated by \p interface. \def STARPU_VECTOR_GET_ELEMSIZE(interface) \ingroup API_Data_Interfaces Return the size of each element of the array designated by \p interface. \def STARPU_VECTOR_GET_SLICE_BASE(interface) \ingroup API_Data_Interfaces Return the OpenMP slice base annotation of each element of the array designated by \p interface. \sa starpu_omp_vector_annotate @name Accessing Matrix Data Interfaces \ingroup API_Data_Interfaces \struct starpu_matrix_interface Matrix interface for dense matrices \ingroup API_Data_Interfaces \var enum starpu_data_interface_id starpu_matrix_interface::id Identifier of the interface \var uintptr_t starpu_matrix_interface::ptr local pointer of the matrix \var uintptr_t starpu_matrix_interface::dev_handle device handle of the matrix. \var size_t starpu_matrix_interface::offset offset in the matrix \var uint32_t starpu_matrix_interface::nx number of elements on the x-axis of the matrix \var uint32_t starpu_matrix_interface::ny number of elements on the y-axis of the matrix \var uint32_t starpu_matrix_interface::ld number of elements between each row of the matrix. Maybe be equal to starpu_matrix_interface::nx when there is no padding. \var size_t starpu_matrix_interface::elemsize size of the elements of the matrix \fn uint32_t starpu_matrix_get_nx(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the number of elements on the x-axis of the matrix designated by \p handle. \fn uint32_t starpu_matrix_get_ny(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the number of elements on the y-axis of the matrix designated by \p handle. \fn uint32_t starpu_matrix_get_local_ld(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the number of elements between each row of the matrix designated by \p handle. Maybe be equal to nx when there is no padding. \fn uintptr_t starpu_matrix_get_local_ptr(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the local pointer associated with \p handle. \fn size_t starpu_matrix_get_elemsize(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the size of the elements registered into the matrix designated by \p handle. \def STARPU_MATRIX_GET_PTR(interface) \ingroup API_Data_Interfaces Return a pointer to the matrix designated by \p interface, valid on CPUs and CUDA devices only. For OpenCL devices, the device handle and offset need to be used instead. \def STARPU_MATRIX_GET_DEV_HANDLE(interface) \ingroup API_Data_Interfaces Return a device handle for the matrix designated by \p interface, to be used on OpenCL. The offset documented below has to be used in addition to this. \def STARPU_MATRIX_GET_OFFSET(interface) \ingroup API_Data_Interfaces Return the offset in the matrix designated by \p interface, to be used with the device handle. \def STARPU_MATRIX_GET_NX(interface) \ingroup API_Data_Interfaces Return the number of elements on the x-axis of the matrix designated by \p interface. \def STARPU_MATRIX_GET_NY(interface) \ingroup API_Data_Interfaces Return the number of elements on the y-axis of the matrix designated by \p interface. \def STARPU_MATRIX_GET_LD(interface) \ingroup API_Data_Interfaces Return the number of elements between each row of the matrix designated by \p interface. May be equal to nx when there is no padding. \def STARPU_MATRIX_GET_ELEMSIZE(interface) \ingroup API_Data_Interfaces Return the size of the elements registered into the matrix designated by \p interface. @name Accessing Block Data Interfaces \ingroup API_Data_Interfaces \struct starpu_block_interface Block interface for 3D dense blocks \ingroup API_Data_Interfaces \var enum starpu_data_interface_id starpu_block_interface::id identifier of the interface \var uintptr_t starpu_block_interface::ptr local pointer of the block \var uintptr_t starpu_block_interface::dev_handle device handle of the block. \var size_t starpu_block_interface::offset offset in the block. \var uint32_t starpu_block_interface::nx number of elements on the x-axis of the block. \var uint32_t starpu_block_interface::ny number of elements on the y-axis of the block. \var uint32_t starpu_block_interface::nz number of elements on the z-axis of the block. \var uint32_t starpu_block_interface::ldy number of elements between two lines \var uint32_t starpu_block_interface::ldz number of elements between two planes \var size_t starpu_block_interface::elemsize size of the elements of the block. \fn uint32_t starpu_block_get_nx(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the number of elements on the x-axis of the block designated by \p handle. \fn uint32_t starpu_block_get_ny(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the number of elements on the y-axis of the block designated by \p handle. \fn uint32_t starpu_block_get_nz(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the number of elements on the z-axis of the block designated by \p handle. \fn uint32_t starpu_block_get_local_ldy(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the number of elements between each row of the block designated by \p handle, in the format of the current memory node. \fn uint32_t starpu_block_get_local_ldz(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the number of elements between each z plane of the block designated by \p handle, in the format of the current memory node. \fn uintptr_t starpu_block_get_local_ptr(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the local pointer associated with \p handle. \fn size_t starpu_block_get_elemsize(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the size of the elements of the block designated by \p handle. \def STARPU_BLOCK_GET_PTR(interface) \ingroup API_Data_Interfaces Return a pointer to the block designated by \p interface. \def STARPU_BLOCK_GET_DEV_HANDLE(interface) \ingroup API_Data_Interfaces Return a device handle for the block designated by \p interface, to be used on OpenCL. The offset document below has to be used in addition to this. \def STARPU_BLOCK_GET_OFFSET(interface) \ingroup API_Data_Interfaces Return the offset in the block designated by \p interface, to be used with the device handle. \def STARPU_BLOCK_GET_NX(interface) \ingroup API_Data_Interfaces Return the number of elements on the x-axis of the block designated by \p interface. \def STARPU_BLOCK_GET_NY(interface) \ingroup API_Data_Interfaces Return the number of elements on the y-axis of the block designated by \p interface. \def STARPU_BLOCK_GET_NZ(interface) \ingroup API_Data_Interfaces Return the number of elements on the z-axis of the block designated by \p interface. \def STARPU_BLOCK_GET_LDY(interface) \ingroup API_Data_Interfaces Return the number of elements between each row of the block designated by \p interface. May be equal to nx when there is no padding. \def STARPU_BLOCK_GET_LDZ(interface) \ingroup API_Data_Interfaces Return the number of elements between each z plane of the block designated by \p interface. May be equal to nx*ny when there is no padding. \def STARPU_BLOCK_GET_ELEMSIZE(interface) \ingroup API_Data_Interfaces Return the size of the elements of the block designated by \p interface. @name Accessing BCSR Data Interfaces \ingroup API_Data_Interfaces \struct starpu_bcsr_interface BCSR interface for sparse matrices (blocked compressed sparse row representation) \ingroup API_Data_Interfaces \var enum starpu_data_interface_id starpu_bcsr_interface::id Identifier of the interface \var uint32_t starpu_bcsr_interface::nnz number of non-zero BLOCKS \var uint32_t starpu_bcsr_interface::nrow number of rows (in terms of BLOCKS) \var uintptr_t starpu_bcsr_interface::nzval non-zero values \var uint32_t *starpu_bcsr_interface::colind array of nnz elements, colind[i] is the block-column index for block i in nzval \var uint32_t *starpu_bcsr_interface::rowptr array of nrows+1 elements, rowptr[i] is the block-index (in nzval) of the first block of row i. By convention, rowptr[nrows] is the number of blocks, this allows an easier access of the matrix's elements for the kernels. \var starpu_bcsr_interface::firstentry k for k-based indexing (0 or 1 usually). Also useful when partitionning the matrix. \var uint32_t starpu_bcsr_interface::r height of the blocks \var uint32_t starpu_bcsr_interface::c size of the blocks \var size_t starpu_bcsr_interface::elemsize; width of the blocks \var size_t starpu_bcsr_interface::elemsize size of the elements of the matrix \fn uint32_t starpu_bcsr_get_nnz(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the number of non-zero elements in the matrix designated by \p handle. \fn uint32_t starpu_bcsr_get_nrow(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the number of rows (in terms of blocks of size r*c) in the matrix designated by \p handle. \fn uint32_t starpu_bcsr_get_firstentry(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the index at which all arrays (the column indexes, the row pointers...) of the matrix desginated by \p handle. \fn uintptr_t starpu_bcsr_get_local_nzval(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return a pointer to the non-zero values of the matrix designated by \p handle. \fn uint32_t *starpu_bcsr_get_local_colind(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return a pointer to the column index, which holds the positions of the non-zero entries in the matrix designated by \p handle. \fn uint32_t *starpu_bcsr_get_local_rowptr(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the row pointer array of the matrix designated by \p handle. \fn uint32_t starpu_bcsr_get_r(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the number of rows in a block. \fn uint32_t starpu_bcsr_get_c(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the numberof columns in a block. \fn size_t starpu_bcsr_get_elemsize(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the size of the elements in the matrix designated by \p handle. \def STARPU_BCSR_GET_NNZ(interface) \ingroup API_Data_Interfaces Return the number of non-zero values in the matrix designated by \p interface. \def STARPU_BCSR_GET_NZVAL(interface) \ingroup API_Data_Interfaces Return a pointer to the non-zero values of the matrix designated by \p interface. \def STARPU_BCSR_GET_NZVAL_DEV_HANDLE(interface) \ingroup API_Data_Interfaces Return a device handle for the array of non-zero values in the matrix designated by \p interface. The offset documented below has to be used in addition to this. \def STARPU_BCSR_GET_COLIND(interface) \ingroup API_Data_Interfaces Return a pointer to the column index of the matrix designated by \p interface. \def STARPU_BCSR_GET_COLIND_DEV_HANDLE(interface) \ingroup API_Data_Interfaces Return a device handle for the column index of the matrix designated by \p interface. The offset documented below has to be used in addition to this. \def STARPU_BCSR_GET_ROWPTR(interface) \ingroup API_Data_Interfaces Return a pointer to the row pointer array of the matrix designated by \p interface. \def STARPU_BCSR_GET_ROWPTR_DEV_HANDLE(interface) \ingroup API_Data_Interfaces Return a device handle for the row pointer array of the matrix designated by \p interface. The offset documented below has to be used in addition to this. \def STARPU_BCSR_GET_OFFSET \ingroup API_Data_Interfaces Return the offset in the arrays (coling, rowptr, nzval) of the matrix designated by \p interface, to be used with the device handles. @name Accessing CSR Data Interfaces \ingroup API_Data_Interfaces \struct starpu_csr_interface CSR interface for sparse matrices (compressed sparse row representation) \ingroup API_Data_Interfaces \var enum starpu_data_interface_id starpu_csr_interface::id Identifier of the interface \var uint32_t starpu_csr_interface::nnz number of non-zero entries \var uint32_t starpu_csr_interface::nrow number of rows \var uintptr_t starpu_csr_interface::nzval non-zero values \var uint32_t *starpu_csr_interface::colind position of non-zero entries on the row \var uint32_t *starpu_csr_interface::rowptr index (in nzval) of the first entry of the row \var uint32_t starpu_csr_interface::firstentry k for k-based indexing (0 or 1 usually). also useful when partitionning the matrix. \var size_t starpu_csr_interface::elemsize size of the elements of the matrix \fn uint32_t starpu_csr_get_nnz(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the number of non-zero values in the matrix designated by \p handle. \fn uint32_t starpu_csr_get_nrow(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the size of the row pointer array of the matrix designated by \p handle. \fn uint32_t starpu_csr_get_firstentry(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the index at which all arrays (the column indexes, the row pointers...) of the matrix designated by \p handle. \fn uintptr_t starpu_csr_get_local_nzval(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return a local pointer to the non-zero values of the matrix designated by \p handle. \fn uint32_t *starpu_csr_get_local_colind(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return a local pointer to the column index of the matrix designated by \p handle. \fn uint32_t *starpu_csr_get_local_rowptr(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return a local pointer to the row pointer array of the matrix designated by \p handle. \fn size_t starpu_csr_get_elemsize(starpu_data_handle_t handle) \ingroup API_Data_Interfaces Return the size of the elements registered into the matrix designated by \p handle. \def STARPU_CSR_GET_NNZ(interface) \ingroup API_Data_Interfaces Return the number of non-zero values in the matrix designated by \p interface. \def STARPU_CSR_GET_NROW(interface) \ingroup API_Data_Interfaces Return the size of the row pointer array of the matrix designated by \p interface. \def STARPU_CSR_GET_NZVAL(interface) \ingroup API_Data_Interfaces Return a pointer to the non-zero values of the matrix designated by \p interface. \def STARPU_CSR_GET_NZVAL_DEV_HANDLE(interface) \ingroup API_Data_Interfaces Return a device handle for the array of non-zero values in the matrix designated by \p interface. The offset documented below has to be used in addition to this. \def STARPU_CSR_GET_COLIND(interface) \ingroup API_Data_Interfaces Return a pointer to the column index of the matrix designated by \p interface. \def STARPU_CSR_GET_COLIND_DEV_HANDLE(interface) \ingroup API_Data_Interfaces Return a device handle for the column index of the matrix designated by \p interface. The offset documented below has to be used in addition to this. \def STARPU_CSR_GET_ROWPTR(interface) \ingroup API_Data_Interfaces Return a pointer to the row pointer array of the matrix designated by \p interface. \def STARPU_CSR_GET_ROWPTR_DEV_HANDLE(interface) \ingroup API_Data_Interfaces Return a device handle for the row pointer array of the matrix designated by \p interface. The offset documented below has to be used in addition to this. \def STARPU_CSR_GET_OFFSET \ingroup API_Data_Interfaces Return the offset in the arrays (colind, rowptr, nzval) of the matrix designated by \p interface, to be used with the device handles. \def STARPU_CSR_GET_FIRSTENTRY(interface) \ingroup API_Data_Interfaces Return the index at which all arrays (the column indexes, the row pointers...) of the \p interface start. \def STARPU_CSR_GET_ELEMSIZE(interface) \ingroup API_Data_Interfaces Return the size of the elements registered into the matrix designated by \p interface. @name Accessing COO Data Interfaces \ingroup API_Data_Interfaces \struct starpu_coo_interface COO Matrices \ingroup API_Data_Interfaces \var enum starpu_data_interface_id starpu_coo_interface::id identifier of the interface \var uint32_t *starpu_coo_interface::columns column array of the matrix \var uint32_t *starpu_coo_interface::rows row array of the matrix \var uintptr_t starpu_coo_interface::values values of the matrix \var uint32_t starpu_coo_interface::nx number of elements on the x-axis of the matrix \var uint32_t starpu_coo_interface::ny number of elements on the y-axis of the matrix \var uint32_t starpu_coo_interface::n_values number of values registered in the matrix \var size_t starpu_coo_interface::elemsize size of the elements of the matrix \def STARPU_COO_GET_COLUMNS(interface) \ingroup API_Data_Interfaces Return a pointer to the column array of the matrix designated by \p interface. \def STARPU_COO_GET_COLUMNS_DEV_HANDLE(interface) \ingroup API_Data_Interfaces Return a device handle for the column array of the matrix designated by \p interface, to be used on OpenCL. The offset documented below has to be used in addition to this. \def STARPU_COO_GET_ROWS(interface) \ingroup API_Data_Interfaces Return a pointer to the rows array of the matrix designated by \p interface. \def STARPU_COO_GET_ROWS_DEV_HANDLE(interface) \ingroup API_Data_Interfaces Return a device handle for the row array of the matrix designated by \p interface, to be used on OpenCL. The offset documented below has to be used in addition to this. \def STARPU_COO_GET_VALUES(interface) \ingroup API_Data_Interfaces Return a pointer to the values array of the matrix designated by \p interface. \def STARPU_COO_GET_VALUES_DEV_HANDLE(interface) \ingroup API_Data_Interfaces Return a device handle for the value array of the matrix designated by \p interface, to be used on OpenCL. The offset documented below has to be used in addition to this. \def STARPU_COO_GET_OFFSET \ingroup API_Data_Interfaces Return the offset in the arrays of the COO matrix designated by \p interface. \def STARPU_COO_GET_NX(interface) \ingroup API_Data_Interfaces Return the number of elements on the x-axis of the matrix designated by \p interface. \def STARPU_COO_GET_NY(interface) \ingroup API_Data_Interfaces Return the number of elements on the y-axis of the matrix designated by \p interface. \def STARPU_COO_GET_NVALUES(interface) \ingroup API_Data_Interfaces Return the number of values registered in the matrix designated by \p interface. \def STARPU_COO_GET_ELEMSIZE(interface) \ingroup API_Data_Interfaces Return the size of the elements registered into the matrix designated by \p interface. @name Defining Interface \ingroup API_Data_Interfaces Applications can provide their own interface as shown in \ref DefiningANewDataInterface. \fn uintptr_t starpu_malloc_on_node_flags(unsigned dst_node, size_t size, int flags) \ingroup API_Data_Interfaces Allocate \p size bytes on node \p dst_node with the given allocation \p flags. This returns 0 if allocation failed, the allocation method should then return -ENOMEM as allocated size. Deallocation must be done with starpu_free_on_node. \fn void starpu_free_on_node_flags(unsigned dst_node, uintptr_t addr, size_t size, int flags) \ingroup API_Data_Interfaces Free \p addr of \p size bytes on node \p dst_node which was previously allocated with starpu_malloc_on_node with the given allocation \p flags. \fn uintptr_t starpu_malloc_on_node(unsigned dst_node, size_t size) \ingroup API_Data_Interfaces Allocate \p size bytes on node \p dst_node with the default allocation flags. This returns 0 if allocation failed, the allocation method should then return -ENOMEM as allocated size. Deallocation must be done with starpu_free_on_node. \fn void starpu_free_on_node(unsigned dst_node, uintptr_t addr, size_t size) \ingroup API_Data_Interfaces Free \p addr of \p size bytes on node \p dst_node which was previously allocated with starpu_malloc_on_node. \fn void starpu_malloc_on_node_set_default_flags(unsigned node, int flags) \ingroup API_Data_Interfaces Define the defaultflags for allocations performed by starpu_malloc_on_node() and starpu_free_on_node(). The default is STARPU_MALLOC_PINNED | STARPU_MALLOC_COUNT. \fn int starpu_interface_copy(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, void *async_data) \ingroup API_Data_Interfaces Copy \p size bytes from byte offset \p src_offset of \p src on \p src_node to byte offset \p dst_offset of \p dst on \p dst_node. This is to be used in the any_to_any() copy method, which is provided with the async_data to be passed to starpu_interface_copy(). this returns -EAGAIN if the transfer is still ongoing, or 0 if the transfer is already completed. \fn uint32_t starpu_hash_crc32c_be_n(const void *input, size_t n, uint32_t inputcrc) \ingroup API_Data_Interfaces Compute the CRC of a byte buffer seeded by the \p inputcrc current state. The return value should be considered as the new current state for future CRC computation. This is used for computing data size footprint. \fn uint32_t starpu_hash_crc32c_be(uint32_t input, uint32_t inputcrc) \ingroup API_Data_Interfaces Compute the CRC of a 32bit number seeded by the \p inputcrc current state. The return value should be considered as the new current state for future CRC computation. This is used for computing data size footprint. \fn uint32_t starpu_hash_crc32c_string(const char *str, uint32_t inputcrc) \ingroup API_Data_Interfaces Compute the CRC of a string seeded by the \p inputcrc current state. The return value should be considered as the new current state for future CRC computation. This is used for computing data size footprint. \fn int starpu_data_interface_get_next_id(void) \ingroup API_Data_Interfaces Return the next available id for a newly created data interface (\ref DefiningANewDataInterface). */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/data_management.doxy000066400000000000000000000525601320135501600245740ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Data_Management Data Management \brief This section describes the data management facilities provided by StarPU. We show how to use existing data interfaces in \ref API_Data_Interfaces, but developers can design their own data interfaces if required. \typedef starpu_data_handle_t \ingroup API_Data_Management StarPU uses ::starpu_data_handle_t as an opaque handle to manage a piece of data. Once a piece of data has been registered to StarPU, it is associated to a ::starpu_data_handle_t which keeps track of the state of the piece of data over the entire machine, so that we can maintain data consistency and locate data replicates for instance. \typedef starpu_arbiter_t \ingroup API_Data_Management This is an arbiter, which implements an advanced but centralized management of concurrent data accesses, see \ref ConcurrentDataAccess for the details. \enum starpu_data_access_mode \ingroup API_Data_Management This datatype describes a data access mode. \var starpu_data_access_mode::STARPU_NONE \ingroup API_Data_Management TODO \var starpu_data_access_mode::STARPU_R \ingroup API_Data_Management read-only mode. \var starpu_data_access_mode::STARPU_W \ingroup API_Data_Management write-only mode. \var starpu_data_access_mode::STARPU_RW \ingroup API_Data_Management read-write mode. This is equivalent to ::STARPU_R|::STARPU_W \var starpu_data_access_mode::STARPU_SCRATCH \ingroup API_Data_Management A temporary buffer is allocated for the task, but StarPU does not enforce data consistency---i.e. each device has its own buffer, independently from each other (even for CPUs), and no data transfer is ever performed. This is useful for temporary variables to avoid allocating/freeing buffers inside each task. Currently, no behavior is defined concerning the relation with the ::STARPU_R and ::STARPU_W modes and the value provided at registration --- i.e., the value of the scratch buffer is undefined at entry of the codelet function. It is being considered for future extensions at least to define the initial value. For now, data to be used in ::STARPU_SCRATCH mode should be registered with node -1 and a NULL pointer, since the value of the provided buffer is simply ignored for now. \var starpu_data_access_mode::STARPU_REDUX \ingroup API_Data_Management todo \var starpu_data_access_mode::STARPU_COMMUTE \ingroup API_Data_Management In addition to that, ::STARPU_COMMUTE can be passed along ::STARPU_W or ::STARPU_RW to express that StarPU can let tasks commute, which is useful e.g. when bringing a contribution into some data, which can be done in any order (but still require sequential consistency against reads or non-commutative writes). \var starpu_data_access_mode::STARPU_SSEND \ingroup API_Data_Management used in starpu_mpi_insert_task() to specify the data has to be sent using a synchronous and non-blocking mode (see starpu_mpi_issend()) \var starpu_data_access_mode::STARPU_LOCALITY \ingroup API_Data_Management used to tell the scheduler which data is the most important for the task, and should thus be used to try to group tasks on the same core or cache, etc. For now only the ws and lws schedulers take this flag into account, and only when rebuild with USE_LOCALITY flag defined in the src/sched_policies/work_stealing_policy.c source code. @name Basic Data Management API \ingroup API_Data_Management Data management is done at a high-level in StarPU: rather than accessing a mere list of contiguous buffers, the tasks may manipulate data that are described by a high-level construct which we call data interface. An example of data interface is the "vector" interface which describes a contiguous data array on a spefic memory node. This interface is a simple structure containing the number of elements in the array, the size of the elements, and the address of the array in the appropriate address space (this address may be invalid if there is no valid copy of the array in the memory node). More informations on the data interfaces provided by StarPU are given in \ref API_Data_Interfaces. When a piece of data managed by StarPU is used by a task, the task implementation is given a pointer to an interface describing a valid copy of the data that is accessible from the current processing unit. Every worker is associated to a memory node which is a logical abstraction of the address space from which the processing unit gets its data. For instance, the memory node associated to the different CPU workers represents main memory (RAM), the memory node associated to a GPU is DRAM embedded on the device. Every memory node is identified by a logical index which is accessible from the function starpu_worker_get_memory_node(). When registering a piece of data to StarPU, the specified memory node indicates where the piece of data initially resides (we also call this memory node the home node of a piece of data). \fn void starpu_data_register(starpu_data_handle_t *handleptr, int home_node, void *data_interface, struct starpu_data_interface_ops *ops) \ingroup API_Data_Management Register a piece of data into the handle located at the \p handleptr address. The \p data_interface buffer contains the initial description of the data in the \p home_node. The \p ops argument is a pointer to a structure describing the different methods used to manipulate this type of interface. See starpu_data_interface_ops for more details on this structure. If \p home_node is -1, StarPU will automatically allocate the memory when it is used for the first time in write-only mode. Once such data handle has been automatically allocated, it is possible to access it using any access mode. Note that StarPU supplies a set of predefined types of interface (e.g. vector or matrix) which can be registered by the means of helper functions (e.g. starpu_vector_data_register() or starpu_matrix_data_register()). \fn void starpu_data_ptr_register(starpu_data_handle_t handle, unsigned node) \ingroup API_Data_Management Register that a buffer for \p handle on \p node will be set. This is typically used by starpu_*_ptr_register helpers before setting the interface pointers for this node, to tell the core that that is now allocated. \fn void starpu_data_register_same(starpu_data_handle_t *handledst, starpu_data_handle_t handlesrc) \ingroup API_Data_Management Register a new piece of data into the handle \p handledst with the same interface as the handle \p handlesrc. \fn void starpu_data_unregister(starpu_data_handle_t handle) \ingroup API_Data_Management This function unregisters a data handle from StarPU. If the data was automatically allocated by StarPU because the home node was -1, all automatically allocated buffers are freed. Otherwise, a valid copy of the data is put back into the home node in the buffer that was initially registered. Using a data handle that has been unregistered from StarPU results in an undefined behaviour. In case we do not need to update the value of the data in the home node, we can use the function starpu_data_unregister_no_coherency() instead. \fn void starpu_data_unregister_no_coherency(starpu_data_handle_t handle) \ingroup API_Data_Management This is the same as starpu_data_unregister(), except that StarPU does not put back a valid copy into the home node, in the buffer that was initially registered. \fn void starpu_data_unregister_submit(starpu_data_handle_t handle) \ingroup API_Data_Management Destroy the data \p handle once it is no longer needed by any submitted task. No coherency is assumed. \fn void starpu_data_invalidate(starpu_data_handle_t handle) \ingroup API_Data_Management Destroy all replicates of the data handle immediately. After data invalidation, the first access to the handle must be performed in write-only mode. Accessing an invalidated data in read-mode results in undefined behaviour. \fn void starpu_data_invalidate_submit(starpu_data_handle_t handle) \ingroup API_Data_Management Submits invalidation of the data handle after completion of previously submitted tasks. \fn void starpu_data_set_wt_mask(starpu_data_handle_t handle, uint32_t wt_mask) \ingroup API_Data_Management This function sets the write-through mask of a given data (and its children), i.e. a bitmask of nodes where the data should be always replicated after modification. It also prevents the data from being evicted from these nodes when memory gets scarse. When the data is modified, it is automatically transfered into those memory node. For instance a 1<<0 write-through mask means that the CUDA workers will commit their changes in main memory (node 0). \fn void starpu_data_set_name(starpu_data_handle_t handle, const char *name) \ingroup API_Data_Management Set the name of the data, to be shown in various profiling tools. \fn void starpu_data_set_coordinates_array(starpu_data_handle_t handle, int dimensions, int dims[]) \ingroup API_Data_Management Set the coordinates of the data, to be shown in various profiling tools. \p dimensions is the size of the \p dims array This can be for instance the tile coordinates within a big matrix. \fn void starpu_data_set_coordinates(starpu_data_handle_t handle, unsigned dimensions, ...) \ingroup API_Data_Management Set the coordinates of the data, to be shown in various profiling tools. \p dimensions is the number of subsequent \c int parameters. This can be for instance the tile coordinates within a big matrix. \fn int starpu_data_fetch_on_node(starpu_data_handle_t handle, unsigned node, unsigned async) \ingroup API_Data_Management Issue a fetch request for a given data to a given node, i.e. requests that the data be replicated to the given node as soon as possible, so that it is available there for tasks. If the \p async parameter is 0, the call will block until the transfer is achieved, else the call will return immediately, after having just queued the request. In the latter case, the request will asynchronously wait for the completion of any task writing on the data. \fn int starpu_data_prefetch_on_node(starpu_data_handle_t handle, unsigned node, unsigned async) \ingroup API_Data_Management Issue a prefetch request for a given data to a given node, i.e. requests that the data be replicated to the given node when there is room for it, so that it is available there for tasks. If the \p async parameter is 0, the call will block until the transfer is achieved, else the call will return immediately, after having just queued the request. In the latter case, the request will asynchronously wait for the completion of any task writing on the data. \fn int starpu_data_idle_prefetch_on_node(starpu_data_handle_t handle, unsigned node, unsigned async) \ingroup API_Data_Management Issue an idle prefetch request for a given data to a given node, i.e. requests that the data be replicated to the given node, so that it is available there for tasks, but only when the bus is really idle. If the \p async parameter is 0, the call will block until the transfer is achieved, else the call will return immediately, after having just queued the request. In the latter case, the request will asynchronously wait for the completion of any task writing on the data. \fn void starpu_data_wont_use(starpu_data_handle_t handle) \ingroup API_Data_Management Advise StarPU that this handle will not be used in the close future, and is thus a good candidate for eviction from GPUs. StarPU will thus write its value back to its home node when the bus is idle, and select this data in priority for eviction when memory gets low. \fn starpu_data_handle_t starpu_data_lookup(const void *ptr) \ingroup API_Data_Management Return the handle corresponding to the data pointed to by the \p ptr host pointer. \fn int starpu_data_request_allocation(starpu_data_handle_t handle, unsigned node) \ingroup API_Data_Management Explicitly ask StarPU to allocate room for a piece of data on the specified memory node. \fn void starpu_data_query_status(starpu_data_handle_t handle, int memory_node, int *is_allocated, int *is_valid, int *is_requested) \ingroup API_Data_Management Query the status of \p handle on the specified \p memory_node. \fn void starpu_data_advise_as_important(starpu_data_handle_t handle, unsigned is_important) \ingroup API_Data_Management This function allows to specify that a piece of data can be discarded without impacting the application. \fn void starpu_data_set_reduction_methods(starpu_data_handle_t handle, struct starpu_codelet *redux_cl, struct starpu_codelet *init_cl) \ingroup API_Data_Management This sets the codelets to be used for \p handle when it is accessed in the mode ::STARPU_REDUX. Per-worker buffers will be initialized with the codelet \p init_cl, and reduction between per-worker buffers will be done with the codelet \p redux_cl. \fn struct starpu_data_interface_ops* starpu_data_get_interface_ops(starpu_data_handle_t handle) \ingroup API_Data_Management todo \fn void starpu_data_set_user_data(starpu_data_handle_t handle, void* user_data) \ingroup API_Data_Management This sets the "user_data" field for the \p handle to \p user_data . It can then be retrieved with starpu_data_get_user_data. \p user_data can be any application-defined value, for instance a pointer to an object-oriented container for the data. \fn void *starpu_data_get_user_data(starpu_data_handle_t handle) \ingroup API_Data_Management This retrieves the "user_data" field previously set for the \p handle . @name Access registered data from the application \ingroup API_Data_Management \fn int starpu_data_acquire(starpu_data_handle_t handle, enum starpu_data_access_mode mode) \ingroup API_Data_Management The application must call this function prior to accessing registered data from main memory outside tasks. StarPU ensures that the application will get an up-to-date copy of the data in main memory located where the data was originally registered, and that all concurrent accesses (e.g. from tasks) will be consistent with the access mode specified in the mode argument. starpu_data_release() must be called once the application no longer needs to access the piece of data. Note that implicit data dependencies are also enforced by starpu_data_acquire(), i.e. starpu_data_acquire() will wait for all tasks scheduled to work on the data, unless they have been disabled explictly by calling starpu_data_set_default_sequential_consistency_flag() or starpu_data_set_sequential_consistency_flag(). starpu_data_acquire() is a blocking call, so that it cannot be called from tasks or from their callbacks (in that case, starpu_data_acquire() returns -EDEADLK). Upon successful completion, this function returns 0. \fn int starpu_data_acquire_cb(starpu_data_handle_t handle, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg) \ingroup API_Data_Management Asynchronous equivalent of starpu_data_acquire(). When the data specified in \p handle is available in the appropriate access mode, the \p callback function is executed. The application may access the requested data during the execution of this \p callback. The \p callback function must call starpu_data_release() once the application no longer needs to access the piece of data. Note that implicit data dependencies are also enforced by starpu_data_acquire_cb() in case they are not disabled. Contrary to starpu_data_acquire(), this function is non-blocking and may be called from task callbacks. Upon successful completion, this function returns 0. \fn int starpu_data_acquire_cb_sequential_consistency(starpu_data_handle_t handle, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg, int sequential_consistency) \ingroup API_Data_Management Equivalent of starpu_data_acquire_cb() with the possibility of enabling or disabling data dependencies. When the data specified in \p handle is available in the appropriate access mode, the \p callback function is executed. The application may access the requested data during the execution of this \p callback. The \p callback function must call starpu_data_release() once the application no longer needs to access the piece of data. Note that implicit data dependencies are also enforced by starpu_data_acquire_cb_sequential_consistency() in case they are not disabled specifically for the given \p handle or by the parameter \p sequential_consistency. Similarly to starpu_data_acquire_cb(), this function is non-blocking and may be called from task callbacks. Upon successful completion, this function returns 0. \fn int starpu_data_acquire_try(starpu_data_handle_t handle, enum starpu_data_access_mode mode) \ingroup API_Data_Management The application can call this function instead of starpu_data_acquire() so as to acquire the data like starpu_data_acquire(), but only if all previously-submitted tasks have completed, in which case starpu_data_acquire_try() returns 0. StarPU will have ensured that the application will get an up-to-date copy of \p handle in main memory located where the data was originally registered. starpu_data_release() must be called once the application no longer needs to access the piece of data. If not all previously-submitted tasks have completed, starpu_data_acquire_try returns -EAGAIN, and starpu_data_release() must not be called. \def STARPU_ACQUIRE_NO_NODE \ingroup API_Data_Management This macro can be used to acquire data, but not require it to be available on a given node, only enforce R/W dependencies. This can for instance be used to wait for tasks which produce the data, but without requesting a fetch to the main memory. \def STARPU_ACQUIRE_ALL_NODES \ingroup API_Data_Management This is the same as STARPU_ACQUIRE_NO_NODE, but will lock the data on all nodes, preventing them from being evicted for instance. This is mostly useful inside starpu only. \fn int starpu_data_acquire_on_node(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode) \ingroup API_Data_Management This is the same as starpu_data_acquire(), except that the data will be available on the given memory node instead of main memory. STARPU_ACQUIRE_NO_NODE and STARPU_ACQUIRE_ALL_NODES can be used instead of an explicit node number. \fn int starpu_data_acquire_on_node_cb(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg) \ingroup API_Data_Management This is the same as starpu_data_acquire_cb(), except that the data will be available on the given memory node instead of main memory. STARPU_ACQUIRE_NO_NODE and STARPU_ACQUIRE_ALL_NODES can be used instead of an explicit node number. \fn int starpu_data_acquire_on_node_cb_sequential_consistency(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg, int sequential_consistency) \ingroup API_Data_Management This is the same as starpu_data_acquire_cb_sequential_consistency(), except that the data will be available on the given memory node instead of main memory. STARPU_ACQUIRE_NO_NODE and STARPU_ACQUIRE_ALL_NODES can be used instead of an explicit node number. \fn int starpu_data_acquire_on_node_cb_sequential_consistency_sync_jobids(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg, int sequential_consistency, long *pre_sync_jobid, long *post_sync_jobid) \ingroup API_Data_Management This is the same as starpu_data_acquire_on_node_cb_sequential_consistency(), except that the \e pre_sync_jobid and \e post_sync_jobid parameters can be used to retrieve the jobid of the synchronization tasks. \e pre_sync_jobid happens just before the acquisition, and \e post_sync_jobid happens just after the release. \fn int starpu_data_acquire_on_node_try(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode) \ingroup API_Data_Management This is the same as starpu_data_acquire_try(), except that the data will be available on the given memory node instead of main memory. ::STARPU_ACQUIRE_NO_NODE and ::STARPU_ACQUIRE_NO_NODE_LOCK_ALL can be used instead of an explicit node number. \def STARPU_DATA_ACQUIRE_CB(handle, mode, code) \ingroup API_Data_Management STARPU_DATA_ACQUIRE_CB() is the same as starpu_data_acquire_cb(), except that the code to be executed in a callback is directly provided as a macro parameter, and the data \p handle is automatically released after it. This permits to easily execute code which depends on the value of some registered data. This is non-blocking too and may be called from task callbacks. \fn void starpu_data_release(starpu_data_handle_t handle) \ingroup API_Data_Management This function releases the piece of data acquired by the application either by starpu_data_acquire() or by starpu_data_acquire_cb(). \fn void starpu_data_release_on_node(starpu_data_handle_t handle, int node) \ingroup API_Data_Management This is the same as starpu_data_release(), except that the data will be available on the given memory \p node instead of main memory. The \p node parameter must be exactly the same as the corresponding starpu_data_acquire_on_node* call. \fn starpu_arbiter_t starpu_arbiter_create(void) \ingroup API_Data_Management This creates a data access arbiter, see \ref ConcurrentDataAccess for the details \fn void starpu_data_assign_arbiter(starpu_data_handle_t handle, starpu_arbiter_t arbiter) \ingroup API_Data_Management This makes accesses to \p handle managed by \p arbiter \fn void starpu_arbiter_destroy(starpu_arbiter_t arbiter) \ingroup API_Data_Management This destroys the \p arbiter . This must only be called after all data assigned to it have been unregistered. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/data_out_of_core.doxy000066400000000000000000000143521320135501600247600ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2013 Corentin Salingue * See the file version.doxy for copying conditions. */ /*! \defgroup API_Out_Of_Core Out Of Core \def STARPU_DISK_SIZE_MIN \ingroup API_Out_Of_Core Minimum size of a registered disk. The size of a disk is the last parameter of the function starpu_disk_register(). \struct starpu_disk_ops \ingroup API_Out_Of_Core This is a set of functions to manipulate datas on disk. \var void* (*starpu_disk_ops::alloc)(void *base, size_t size) Create a new location for datas of size \p size. This returns an opaque object pointer. \var void (*starpu_disk_ops::free)(void *base, void *obj, size_t size) Free a data \p obj previously allocated with \c alloc. \var void* (*starpu_disk_ops::open)(void *base, void *pos, size_t size) Open an existing location of datas, at a specific position \p pos dependent on the backend. \var void (*starpu_disk_ops::close)(void *base, void *obj, size_t size) Close, without deleting it, a location of datas \p obj. \var int (*starpu_disk_ops::read)(void *base, void *obj, void *buf, off_t offset, size_t size) Read \p size bytes of data from \p obj in \p base, at offset \p offset, and put into \p buf. Returns the actual number of read bytes. \var int (*starpu_disk_ops::write)(void *base, void *obj, const void *buf, off_t offset, size_t size) Write \p size bytes of data to \p obj in \p base, at offset \p offset, from \p buf. Returns 0 on success. \var int (*starpu_disk_ops::full_read)(void * base, void * obj, void ** ptr, size_t * size) Read all data from \p obj of \p base, from offset 0. Returns it in an allocated buffer \p ptr, of size \p size \var int (*starpu_disk_ops::full_write)(void * base, void * obj, void * ptr, size_t size) Write data in \p ptr to \p obj of \p base, from offset 0, and truncate \p obj to \p size, so that a \c full_read will get it. \var void* (*starpu_disk_ops::plug) (void *parameters, size_t size) Connect a disk memory at location \p parameter with size \p size, and return a base as void*, which will be passed by StarPU to all other methods. \var void (*starpu_disk_ops::unplug) (void* base) Disconnect a disk memory \p base. \var void* (*starpu_disk_ops::async_read)(void *base, void *obj, void *buf, off_t offset, size_t size) Asynchronously read \p size bytes of data from \p obj in \p base, at offset \p offset, and put into \p buf. Returns a void* pointer that StarPU will pass to \c *_request methods for testing for the completion. \var void* (*starpu_disk_ops::async_write)(void *base, void *obj, const void *buf, off_t offset, size_t size) Asynchronously write \p size bytes of data to \p obj in \p base, at offset \p offset, from \p buf. Returns a void* pointer that StarPU will pass to \c *_request methods for testing for the completion. \var void * (*starpu_disk_ops::async_full_read)(void * base, void * obj, void ** ptr, size_t * size) Read all data from \p obj of \p base, from offset 0. Returns it in an allocated buffer \p ptr, of size \p size \var void * (*starpu_disk_ops::async_full_write)(void * base, void * obj, void * ptr, size_t size) Write data in \p ptr to \p obj of \p base, from offset 0, and truncate \p obj to \p size, so that a \c full_read will get it. \var void* (*starpu_disk_ops::copy)(void *base_src, void* obj_src, off_t offset_src, void *base_dst, void* obj_dst, off_t offset_dst, size_t size) Copy from offset \p offset_src of disk object \p obj_src in \p base_src to offset \p offset_dst of disk object \p obj_dst in \p base_dst. Returns a void* pointer that StarPU will pass to \c *_request methods for testing for the completion. \var int (*starpu_disk_ops::bandwidth) (unsigned node) Measure the bandwidth and the latency for the disk \p node and save it. Returns 1 if it could measure it. \var void (*starpu_disk_ops::wait_request)(void *async_channel) Wait for completion of request \p async_channel returned by a previous asynchronous read, write or copy. \var void (*starpu_disk_ops::test_request)(void *async_channel) Test for completion of request \p async_channel returned by a previous asynchronous read, write or copy. Returns 1 on completion, 0 otherwise. \var void (*starpu_disk_ops::free_request)(void *async_channel) Free the request allocated by a previous asynchronous read, write or copy. \fn int starpu_disk_register(struct starpu_disk_ops *func, void *parameter, starpu_ssize_t size) \ingroup API_Out_Of_Core Register a disk memory node with a set of functions to manipulate datas. The \c plug member of \p func will be passed \p parameter, and return a \c base which will be passed to all \p func methods.
    SUCCESS: return the disk node.
    FAIL: return an error code.
    \p size must be at least \ref STARPU_DISK_SIZE_MIN bytes ! \p size being negative means infinite size. \fn void *starpu_disk_open(unsigned node, void *pos, size_t size) \ingroup API_Out_Of_Core Open an existing file memory in a disk node. \p size: this is a size of your file. \p pos is specific position dependent on the backend, given to the \c open method of the disk operations. This returns an opaque object pointer. \fn void starpu_disk_close(unsigned node, void *obj, size_t size) \ingroup API_Out_Of_Core Close an existing data opened with starpu_disk_open. \var starpu_disk_swap_node \ingroup API_Out_Of_Core This contains the node number of the disk swap, if set up through the STARPU_DISK_SWAP variable. \var starpu_disk_stdio_ops \ingroup API_Out_Of_Core This set uses the stdio library (fwrite, fread...) to read/write on disk.
    Warning: It creates one file per allocation !
    It doesn't support asynchronous transfers. \var starpu_disk_unistd_ops \ingroup API_Out_Of_Core This set uses the unistd library (write, read...) to read/write on disk.
    Warning: It creates one file per allocation !
    \var starpu_disk_unistd_o_direct_ops \ingroup API_Out_Of_Core This set uses the unistd library (write, read...) to read/write on disk with the O_DIRECT flag.
    Warning: It creates one file per allocation !
    Only available on Linux systems. \var starpu_disk_leveldb_ops \ingroup API_Out_Of_Core This set uses the leveldb created by Google
    Show here: https://code.google.com/p/leveldb/
    It doesn't support asynchronous transfers. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/data_partition.doxy000066400000000000000000000456321320135501600244730ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Data_Partition Data Partition \struct starpu_data_filter The filter structure describes a data partitioning operation, to be given to the starpu_data_partition() function. \ingroup API_Data_Partition \var void (*starpu_data_filter::filter_func)(void *father_interface, void *child_interface, struct starpu_data_filter *filter, unsigned i, unsigned nparts) Fill the \p child_interface structure with interface information for the \p i -th child of the parent \p father_interface (among \p nparts). The \p filter structure is provided, allowing to inspect the starpu_data_filter::filter_arg and starpu_data_filter::filter_arg_ptr parameters. The details of what needs to be filled in \p child_interface vary according to the data interface, but generally speaking:
    • id is usually just copied over from the father, when the sub data has the same structure as the father, e.g. a subvector is a vector, a submatrix is a matrix, etc. This is however not the case for instance when dividing a BCSR matrix into its dense blocks, which then are matrices.
    • nx, ny and alike are usually divided by the number of subdata, depending how the subdivision is done (e.g. nx division vs ny division for vertical matrix division vs horizontal matrix division).
    • ld for matrix interfaces are usually just copied over: the leading dimension (ld) usually does not change.
    • elemsize is usually just copied over.
    • ptr, the pointer to the data, has to be computed according to \p i and the father's ptr, so as to point to the start of the sub data. This should however be done only if the father has ptr different from NULL: in the OpenCL case notably, the dev_handle and offset fields are used instead.
    • dev_handle should be just copied over from the parent.
    • offset has to be computed according to \p i and the father's offset, so as to provide the offset of the start of the sub data. This is notably used for the OpenCL case.
    \var unsigned starpu_data_filter::nchildren This is the number of parts to partition the data into. \var unsigned (*starpu_data_filter::get_nchildren)(struct starpu_data_filter *, starpu_data_handle_t initial_handle) This returns the number of children. This can be used instead of nchildren when the number of children depends on the actual data (e.g. the number of blocks in a sparse matrix). \var struct starpu_data_interface_ops *(*starpu_data_filter::get_child_ops)(struct starpu_data_filter *, unsigned id) In case the resulting children use a different data interface, this function returns which interface is used by child number id. \var unsigned starpu_data_filter::filter_arg Additional parameter for the filter function \var void *starpu_data_filter::filter_arg_ptr Additional pointer parameter for the filter function, such as the sizes of the different parts. @name Basic API \ingroup API_Data_Partition \fn void starpu_data_partition(starpu_data_handle_t initial_handle, struct starpu_data_filter *f) \ingroup API_Data_Partition This requests partitioning one StarPU data initial_handle into several subdata according to the filter \p f. Here an example of how to use the function. \code{.c} struct starpu_data_filter f = { .filter_func = starpu_matrix_filter_block, .nchildren = nslicesx }; starpu_data_partition(A_handle, &f); \endcode \fn void starpu_data_unpartition(starpu_data_handle_t root_data, unsigned gathering_node) \ingroup API_Data_Partition This unapplies one filter, thus unpartitioning the data. The pieces of data are collected back into one big piece in the \p gathering_node (usually STARPU_MAIN_RAM). Tasks working on the partitioned data must be already finished when calling starpu_data_unpartition(). Here an example of how to use the function. \code{.c} starpu_data_unpartition(A_handle, STARPU_MAIN_RAM); \endcode \fn int starpu_data_get_nb_children(starpu_data_handle_t handle) \ingroup API_Data_Partition This function returns the number of children. \fn starpu_data_handle_t starpu_data_get_child(starpu_data_handle_t handle, unsigned i) \ingroup API_Data_Partition Return the ith child of the given \p handle, which must have been partitionned beforehand. \fn starpu_data_handle_t starpu_data_get_sub_data(starpu_data_handle_t root_data, unsigned depth, ... ) \ingroup API_Data_Partition After partitioning a StarPU data by applying a filter, starpu_data_get_sub_data() can be used to get handles for each of the data portions. \p root_data is the parent data that was partitioned. \p depth is the number of filters to traverse (in case several filters have been applied, to e.g. partition in row blocks, and then in column blocks), and the subsequent parameters are the indexes. The function returns a handle to the subdata. Here an example of how to use the function. \code{.c} h = starpu_data_get_sub_data(A_handle, 1, taskx); \endcode \fn starpu_data_handle_t starpu_data_vget_sub_data(starpu_data_handle_t root_data, unsigned depth, va_list pa) \ingroup API_Data_Partition This function is similar to starpu_data_get_sub_data() but uses a va_list for the parameter list. \fn void starpu_data_map_filters(starpu_data_handle_t root_data, unsigned nfilters, ...) \ingroup API_Data_Partition Applies \p nfilters filters to the handle designated by \p root_handle recursively. \p nfilters pointers to variables of the type starpu_data_filter should be given. \fn void starpu_data_vmap_filters(starpu_data_handle_t root_data, unsigned nfilters, va_list pa) \ingroup API_Data_Partition Applies \p nfilters filters to the handle designated by \p root_handle recursively. It uses a va_list of pointers to variables of the type starpu_data_filter. @name Asynchronous API \ingroup API_Data_Partition \fn void starpu_data_partition_plan(starpu_data_handle_t initial_handle, struct starpu_data_filter *f, starpu_data_handle_t *children) \ingroup API_Data_Partition This plans for partitioning one StarPU data handle \p initial_handle into several subdata according to the filter \p f. The handles are returned into the \p children array, which has to be the same size as the number of parts described in \p f. These handles are not immediately usable, starpu_data_partition_submit has to be called to submit the actual partitioning. Here is an example of how to use the function: \code{.c} starpu_data_handle_t children[nslicesx]; struct starpu_data_filter f = { .filter_func = starpu_matrix_filter_block, .nchildren = nslicesx }; starpu_data_partition_plan(A_handle, &f, children); \endcode \fn void starpu_data_partition_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children) \ingroup API_Data_Partition This submits the actual partitioning of \p initial_handle into the \p nparts \p children handles. This call is asynchronous, it only submits that the partitioning should be done, so that the \p children handles can now be used to submit tasks, and \p initial_handle can not be used to submit tasks any more (to guarantee coherency). For instance, \code{.c} starpu_data_partition_submit(A_handle, nslicesx, children); \endcode \fn void starpu_data_partition_readonly_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children) \ingroup API_Data_Partition This is the same as starpu_data_partition_submit, but does not invalidate \p initial_handle. This allows to continue using it, but the application has to be careful not to write to \p initial_handle or \p children handles, only read from them, since the coherency is otherwise not guaranteed. This thus allows to submit various tasks which concurrently read from various partitions of the data. When the application wants to write to \p initial_handle again, it should call starpu_data_unpartition_submit, which will properly add dependencies between the reads on the \p children and the writes to be submitted. If instead the application wants to write to \p children handles, it should call starpu_data_partition_readwrite_upgrade_submit, which will properly add dependencies between the reads on the \p initial_handle and the writes to be submitted. \fn void starpu_data_partition_readwrite_upgrade_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children) \ingroup API_Data_Partition This assumes that a partitioning of \p initial_handle has already been submited in readonly mode through starpu_data_partition_readonly_submit, and will upgrade that partitioning into read-write mode for the \p children, by invalidating \p initial_handle, and adding the necessary dependencies. \fn void starpu_data_unpartition_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int gathering_node) \ingroup API_Data_Partition This assumes that \p initial_handle is partitioned into \p children, and submits an unpartitionning of it, i.e. submitting a gathering of the pieces on the requested \p gathering_node memory node, and submitting an invalidation of the children. \p gathering_node can be set to -1 to let the runtime decide which memory node should be used to gather the pieces. \fn void starpu_data_unpartition_readonly_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int gathering_node) \ingroup API_Data_Partition This assumes that \p initial_handle is partitioned into \p children, and submits just a readonly unpartitionning of it, i.e. submitting a gathering of the pieces on the requested \p gathering_node memory node. It does not invalidate the children. This brings \p initial_handle and \p children handles to the same state as obtained with starpu_data_partition_readonly_submit. \p gathering_node can be set to -1 to let the runtime decide which memory node should be used to gather the pieces. \fn void starpu_data_partition_clean(starpu_data_handle_t root_data, unsigned nparts, starpu_data_handle_t *children) \ingroup API_Data_Partition This should be used to clear the partition planning established between \p root_data and \p children with starpu_data_partition_plan. This will notably submit an unregister all the \p children, which can thus not be used any more afterwards. @name Predefined Vector Filter Functions \ingroup API_Data_Partition This section gives a partial list of the predefined partitioning functions for vector data. Examples on how to use them are shown in \ref PartitioningData. The complete list can be found in the file starpu_data_filters.h. \fn void starpu_vector_filter_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts) \ingroup API_Data_Partition Return in \p child_interface the \p id th element of the vector represented by \p father_interface once partitioned in \p nparts chunks of equal size. \fn void starpu_vector_filter_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts) \ingroup API_Data_Partition Return in \p child_interface the \p id th element of the vector represented by \p father_interface once partitioned in \p nparts chunks of equal size with a shadow border filter_arg_ptr, thus getting a vector of size (n-2*shadow)/nparts+2*shadow. The filter_arg_ptr field of \p f must be the shadow size casted into void*. IMPORTANT: This can only be used for read-only access, as no coherency is enforced for the shadowed parts. An usage example is available in examples/filters/shadow.c \fn void starpu_vector_filter_list_long(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts) \ingroup API_Data_Partition Return in \p child_interface the \p id th element of the vector represented by \p father_interface once partitioned into \p nparts chunks according to the filter_arg_ptr field of \p f. The filter_arg_ptr field must point to an array of \p nparts long elements, each of which specifies the number of elements in each chunk of the partition. \fn void starpu_vector_filter_list(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts) \ingroup API_Data_Partition Return in \p child_interface the \p id th element of the vector represented by \p father_interface once partitioned into \p nparts chunks according to the filter_arg_ptr field of \p f. The filter_arg_ptr field must point to an array of \p nparts uint32_t elements, each of which specifies the number of elements in each chunk of the partition. \fn void starpu_vector_filter_divide_in_2(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts) \ingroup API_Data_Partition Return in \p child_interface the \p id th element of the vector represented by \p father_interface once partitioned in 2 chunks of equal size, ignoring nparts. Thus, \p id must be 0 or 1. @name Predefined Matrix Filter Functions \ingroup API_Data_Partition This section gives a partial list of the predefined partitioning functions for matrix data. Examples on how to use them are shown in \ref PartitioningData. The complete list can be found in the file starpu_data_filters.h. \fn void starpu_matrix_filter_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts) \ingroup API_Data_Partition This partitions a dense Matrix along the x dimension, thus getting (x/\p nparts ,y) matrices. If \p nparts does not divide x, the last submatrix contains the remainder. \fn void starpu_matrix_filter_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts) \ingroup API_Data_Partition This partitions a dense Matrix along the x dimension, with a shadow border filter_arg_ptr, thus getting ((x-2*shadow)/\p nparts +2*shadow,y) matrices. If \p nparts does not divide x-2*shadow, the last submatrix contains the remainder. IMPORTANT: This can only be used for read-only access, as no coherency is enforced for the shadowed parts. A usage example is available in examples/filters/shadow2d.c \fn void starpu_matrix_filter_vertical_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts) \ingroup API_Data_Partition This partitions a dense Matrix along the y dimension, thus getting (x,y/\p nparts) matrices. If \p nparts does not divide y, the last submatrix contains the remainder. \fn void starpu_matrix_filter_vertical_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts) \ingroup API_Data_Partition This partitions a dense Matrix along the y dimension, with a shadow border filter_arg_ptr, thus getting (x,(y-2*shadow)/\p nparts +2*shadow) matrices. If \p nparts does not divide y-2*shadow, the last submatrix contains the remainder. IMPORTANT: This can only be used for read-only access, as no coherency is enforced for the shadowed parts. A usage example is available in examples/filters/shadow2d.c @name Predefined Block Filter Functions \ingroup API_Data_Partition This section gives a partial list of the predefined partitioning functions for block data. Examples on how to use them are shown in \ref PartitioningData. The complete list can be found in the file starpu_data_filters.h. A usage example is available in examples/filters/shadow3d.c \fn void starpu_block_filter_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts) \ingroup API_Data_Partition This partitions a block along the X dimension, thus getting (x/\p nparts ,y,z) 3D matrices. If \p nparts does not divide x, the last submatrix contains the remainder. \fn void starpu_block_filter_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts) \ingroup API_Data_Partition This partitions a block along the X dimension, with a shadow border filter_arg_ptr, thus getting ((x-2*shadow)/\p nparts +2*shadow,y,z) blocks. If \p nparts does not divide x, the last submatrix contains the remainder. IMPORTANT: This can only be used for read-only access, as no coherency is enforced for the shadowed parts. \fn void starpu_block_filter_vertical_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts) \ingroup API_Data_Partition This partitions a block along the Y dimension, thus getting (x,y/\p nparts ,z) blocks. If \p nparts does not divide y, the last submatrix contains the remainder. \fn void starpu_block_filter_vertical_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts) \ingroup API_Data_Partition This partitions a block along the Y dimension, with a shadow border filter_arg_ptr, thus getting (x,(y-2*shadow)/\p nparts +2*shadow,z) 3D matrices. If \p nparts does not divide y, the last submatrix contains the remainder. IMPORTANT: This can only be used for read-only access, as no coherency is enforced for the shadowed parts. \fn void starpu_block_filter_depth_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts) \ingroup API_Data_Partition This partitions a block along the Z dimension, thus getting (x,y,z/\p nparts) blocks. If \p nparts does not divide z, the last submatrix contains the remainder. \fn void starpu_block_filter_depth_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts) \ingroup API_Data_Partition This partitions a block along the Z dimension, with a shadow border filter_arg_ptr, thus getting (x,y,(z-2*shadow)/\p nparts +2*shadow) blocks. If \p nparts does not divide z, the last submatrix contains the remainder. IMPORTANT: This can only be used for read-only access, as no coherency is enforced for the shadowed parts. @name Predefined BCSR Filter Functions \ingroup API_Data_Partition This section gives a partial list of the predefined partitioning functions for BCSR data. Examples on how to use them are shown in \ref PartitioningData. The complete list can be found in the file starpu_data_filters.h. \fn void starpu_bcsr_filter_canonical_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts) \ingroup API_Data_Partition This partitions a block-sparse matrix into dense matrices. \fn void starpu_csr_filter_vertical_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts) \ingroup API_Data_Partition This partitions a block-sparse matrix into vertical block-sparse matrices. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/expert_mode.doxy000066400000000000000000000013401320135501600237700ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Expert_Mode Expert Mode \fn void starpu_wake_all_blocked_workers(void) \ingroup API_Expert_Mode Wake all the workers, so they can inspect data requests and task submissions again. \fn int starpu_progression_hook_register(unsigned (*func)(void *arg), void *arg) \ingroup API_Expert_Mode Register a progression hook, to be called when workers are idle. \fn void starpu_progression_hook_deregister(int hook_id) \ingroup API_Expert_Mode Unregister a given progression hook. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/explicit_dependencies.doxy000066400000000000000000000144201320135501600260070ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Explicit_Dependencies Explicit Dependencies \fn void starpu_task_declare_deps_array(struct starpu_task *task, unsigned ndeps, struct starpu_task *task_array[]) \ingroup API_Explicit_Dependencies Declare task dependencies between a \p task and an array of tasks of length \p ndeps. This function must be called prior to the submission of the task, but it may called after the submission or the execution of the tasks in the array, provided the tasks are still valid (i.e. they were not automatically destroyed). Calling this function on a task that was already submitted or with an entry of \p task_array that is no longer a valid task results in an undefined behaviour. If \p ndeps is 0, no dependency is added. It is possible to call starpu_task_declare_deps_array() several times on the same task, in this case, the dependencies are added. It is possible to have redundancy in the task dependencies. \fn int starpu_task_get_task_succs(struct starpu_task *task, unsigned ndeps, struct starpu_task *task_array[]) \ingroup API_Explicit_Dependencies Fills \p task_array with the list of tasks which are direct children of \p task. \p ndeps is the size of \p task_array. This function returns the number of direct children. \p task_array can be set to NULL if \p ndeps is 0, which allows to compute the number of children before allocating an array to store them. This function can only be called if \p task has not completed yet, otherwise the results are undefined. The result may also be outdated if some additional dependency has been added in the meanwhile. \fn int starpu_task_get_task_scheduled_succs(struct starpu_task *task, unsigned ndeps, struct starpu_task *task_array[]) \ingroup API_Explicit_Dependencies This behaves like starpu_task_get_task_succs(), except that it only reports tasks which will go through the scheduler, thus avoiding tasks with not codelet, or with explicit placement. \typedef starpu_tag_t \ingroup API_Explicit_Dependencies This type defines a task logical identifer. It is possible to associate a task with a unique tag chosen by the application, and to express dependencies between tasks by the means of those tags. To do so, fill the field starpu_task::tag_id with a tag number (can be arbitrary) and set the field starpu_task::use_tag to 1. If starpu_tag_declare_deps() is called with this tag number, the task will not be started until the tasks which holds the declared dependency tags are completed. \fn void starpu_tag_declare_deps(starpu_tag_t id, unsigned ndeps, ...) \ingroup API_Explicit_Dependencies Specify the dependencies of the task identified by tag \p id. The first argument specifies the tag which is configured, the second argument gives the number of tag(s) on which \p id depends. The following arguments are the tags which have to be terminated to unlock the task. This function must be called before the associated task is submitted to StarPU with starpu_task_submit(). WARNING! Use with caution. Because of the variable arity of starpu_tag_declare_deps(), note that the last arguments must be of type starpu_tag_t : constant values typically need to be explicitly casted. Otherwise, due to integer sizes and argument passing on the stack, the C compiler might consider the tag 0x200000003 instead of 0x2 and 0x3 when calling starpu_tag_declare_deps(0x1, 2, 0x2, 0x3). Using the starpu_tag_declare_deps_array() function avoids this hazard. \code{.c} /* Tag 0x1 depends on tags 0x32 and 0x52 */ starpu_tag_declare_deps((starpu_tag_t)0x1, 2, (starpu_tag_t)0x32, (starpu_tag_t)0x52); \endcode \fn void starpu_tag_declare_deps_array(starpu_tag_t id, unsigned ndeps, starpu_tag_t *array) \ingroup API_Explicit_Dependencies This function is similar to starpu_tag_declare_deps(), except that its does not take a variable number of arguments but an array of tags of size \p ndeps. \code{.c} /* Tag 0x1 depends on tags 0x32 and 0x52 */ starpu_tag_t tag_array[2] = {0x32, 0x52}; starpu_tag_declare_deps_array((starpu_tag_t)0x1, 2, tag_array); \endcode \fn int starpu_tag_wait(starpu_tag_t id) \ingroup API_Explicit_Dependencies This function blocks until the task associated to tag \p id has been executed. This is a blocking call which must therefore not be called within tasks or callbacks, but only from the application directly. It is possible to synchronize with the same tag multiple times, as long as the starpu_tag_remove() function is not called. Note that it is still possible to synchronize with a tag associated to a task for which the strucuture starpu_task was freed (e.g. if the field starpu_task::destroy was enabled). \fn int starpu_tag_wait_array(unsigned ntags, starpu_tag_t *id) \ingroup API_Explicit_Dependencies This function is similar to starpu_tag_wait() except that it blocks until all the \p ntags tags contained in the array \p id are terminated. \fn void starpu_tag_restart(starpu_tag_t id) \ingroup API_Explicit_Dependencies This function can be used to clear the already notified status of a tag which is not associated with a task. Before that, calling starpu_tag_notify_from_apps() again will not notify the successors. After that, the next call to starpu_tag_notify_from_apps() will notify the successors. \fn void starpu_tag_remove(starpu_tag_t id) \ingroup API_Explicit_Dependencies This function releases the resources associated to tag \p id. It can be called once the corresponding task has been executed and when there is no other tag that depend on this tag anymore. \fn void starpu_tag_notify_from_apps(starpu_tag_t id) \ingroup API_Explicit_Dependencies This function explicitly unlocks tag \p id. It may be useful in the case of applications which execute part of their computation outside StarPU tasks (e.g. third-party libraries). It is also provided as a convenient tool for the programmer, for instance to entirely construct the task DAG before actually giving StarPU the opportunity to execute the tasks. When called several times on the same tag, notification will be done only on first call, thus implementing "OR" dependencies, until the tag is restarted using starpu_tag_restart(). */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/fft_support.doxy000066400000000000000000000047531320135501600240430ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_FFT_Support FFT Support \fn void * starpufft_malloc(size_t n) \ingroup API_FFT_Support Allocates memory for \p n bytes. This is preferred over malloc(), since it allocates pinned memory, which allows overlapped transfers. \fn void * starpufft_free(void *p) \ingroup API_FFT_Support Release memory previously allocated. \fn struct starpufft_plan * starpufft_plan_dft_1d(int n, int sign, unsigned flags) \ingroup API_FFT_Support Initializes a plan for 1D FFT of size \p n. \p sign can be STARPUFFT_FORWARD or STARPUFFT_INVERSE. \p flags must be 0. \fn struct starpufft_plan * starpufft_plan_dft_2d(int n, int m, int sign, unsigned flags) \ingroup API_FFT_Support Initializes a plan for 2D FFT of size (\p n, \p m). \p sign can be STARPUFFT_FORWARD or STARPUFFT_INVERSE. flags must be \p 0. \fn struct starpu_task * starpufft_start(starpufft_plan p, void *in, void *out) \ingroup API_FFT_Support Start an FFT previously planned as \p p, using \p in and \p out as input and output. This only submits the task and does not wait for it. The application should call starpufft_cleanup() to unregister the \fn struct starpu_task * starpufft_start_handle(starpufft_plan p, starpu_data_handle_t in, starpu_data_handle_t out) \ingroup API_FFT_Support Start an FFT previously planned as \p p, using data handles \p in and \p out as input and output (assumed to be vectors of elements of the expected types). This only submits the task and does not wait for it. \fn void starpufft_execute(starpufft_plan p, void *in, void *out) \ingroup API_FFT_Support Execute an FFT previously planned as \p p, using \p in and \p out as input and output. This submits and waits for the task. \fn void starpufft_execute_handle(starpufft_plan p, starpu_data_handle_t in, starpu_data_handle_t out) \ingroup API_FFT_Support Execute an FFT previously planned as \p p, using data handles \p in and \p out as input and output (assumed to be vectors of elements of the expected types). This submits and waits for the task. \fn void starpufft_cleanup(starpufft_plan p) \ingroup API_FFT_Support Releases data for plan \p p, in the starpufft_start() case. \fn void starpufft_destroy_plan(starpufft_plan p) \ingroup API_FFT_Support Destroys plan \p p, i.e. release all CPU (fftw) and GPU (cufft) resources. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/fxt_support.doxy000066400000000000000000000070251320135501600240600ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_FxT_Support FxT Support \struct starpu_fxt_codelet_event todo \ingroup API_FxT_Support \var char starpu_fxt_codelet_event::symbol[256] name of the codelet \var int starpu_fxt_codelet_event::workerid \var char starpu_fxt_codelet_event::perfmodel_archname[256] \var uint32_t starpu_fxt_codelet_event::hash \var size_t starpu_fxt_codelet_event::size \var float starpu_fxt_codelet_event::time \struct starpu_fxt_options todo \ingroup API_FxT_Support \var unsigned starpu_fxt_options::per_task_colour \var unsigned starpu_fxt_options::no_counter \var starpu_unsigned fxt_options::no_bus \var unsigned starpu_fxt_options::ninputfiles \var char *starpu_fxt_options::filenames[STARPU_FXT_MAX_FILES] \var char *starpu_fxt_options::out_paje_path \var char *starpu_fxt_options::distrib_time_path \var char *starpu_fxt_options::activity_path \var char *starpu_fxt_options::dag_path \var char *starpu_fxt_options::file_prefix In case we are going to gather multiple traces (e.g in the case of MPI processes), we may need to prefix the name of the containers. \var uint64_t starpu_fxt_options::file_offset In case we are going to gather multiple traces (e.g in the case of MPI processes), we may need to prefix the name of the containers. \var int starpu_fxt_options::file_rank In case we are going to gather multiple traces (e.g in the case of MPI processes), we may need to prefix the name of the containers. \var char starpu_fxt_options::worker_names[STARPU_NMAXWORKERS][256] Output parameters \var struct starpu_perfmodel_arch starpu_fxt_options::worker_archtypes[STARPU_NMAXWORKERS] Output parameters \var int starpu_fxt_options::nworkers Output parameters \var struct starpu_fxt_codelet_event **starpu_fxt_options::dumped_codelets In case we want to dump the list of codelets to an external tool \var long starpu_fxt_options::dumped_codelets_count In case we want to dump the list of codelets to an external tool \fn void starpu_fxt_options_init(struct starpu_fxt_options *options) \ingroup API_FxT_Support todo \fn void starpu_fxt_generate_trace(struct starpu_fxt_options *options) \ingroup API_FxT_Support todo \fn void starpu_fxt_start_profiling(void) \ingroup API_FxT_Support Start recording the trace. The trace is by default started from starpu_init() call, but can be paused by using starpu_fxt_stop_profiling(), in which case starpu_fxt_start_profiling() should be called to resume recording events. \fn void starpu_fxt_stop_profiling(void) \ingroup API_FxT_Support Stop recording the trace. The trace is by default stopped when calling starpu_shutdown(). starpu_fxt_stop_profiling() can however be used to stop it earlier. starpu_fxt_start_profiling() can then be called to start recording it again, etc. \fn void starpu_fxt_autostart_profiling(int autostart) \ingroup API_FxT_Support Determines whether profiling should be started by starpu_init, or only when starpu_fxt_start_profiling is called. \e autostart should be 1 to do so, or 0 to prevent it. \fn void starpu_fxt_write_data_trace(char *filename_in) \ingroup API_FxT_Support todo \fn void starpu_fxt_trace_user_event(unsigned long code) \ingroup API_FxT_Support Add an event in the execution trace if FxT is enabled. \fn void starpu_fxt_trace_user_event_string(const char *s) \ingroup API_FxT_Support Add a string event in the execution trace if FxT is enabled. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/implicit_dependencies.doxy000066400000000000000000000042111320135501600257750ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Implicit_Data_Dependencies Implicit Data Dependencies \brief In this section, we describe how StarPU makes it possible to insert implicit task dependencies in order to enforce sequential data consistency. When this data consistency is enabled on a specific data handle, any data access will appear as sequentially consistent from the application. For instance, if the application submits two tasks that access the same piece of data in read-only mode, and then a third task that access it in write mode, dependencies will be added between the two first tasks and the third one. Implicit data dependencies are also inserted in the case of data accesses from the application. \fn void starpu_data_set_default_sequential_consistency_flag(unsigned flag) \ingroup API_Implicit_Data_Dependencies Set the default sequential consistency flag. If a non-zero value is passed, a sequential data consistency will be enforced for all handles registered after this function call, otherwise it is disabled. By default, StarPU enables sequential data consistency. It is also possible to select the data consistency mode of a specific data handle with the function starpu_data_set_sequential_consistency_flag(). \fn unsigned starpu_data_get_default_sequential_consistency_flag(void) \ingroup API_Implicit_Data_Dependencies Return the default sequential consistency flag \fn void starpu_data_set_sequential_consistency_flag(starpu_data_handle_t handle, unsigned flag) \ingroup API_Implicit_Data_Dependencies Set the data consistency mode associated to a data handle. The consistency mode set using this function has the priority over the default mode which can be set with starpu_data_set_default_sequential_consistency_flag(). \fn unsigned starpu_data_get_sequential_consistency_flag(starpu_data_handle_t handle) \ingroup API_Implicit_Data_Dependencies Get the data consistency mode associated to the data handle \p handle */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/initialization.doxy000066400000000000000000000320371320135501600245130ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Initialization_and_Termination Initialization and Termination \struct starpu_driver structure for a driver \ingroup API_Initialization_and_Termination \var enum starpu_worker_archtype starpu_driver::type The type of the driver. Only ::STARPU_CPU_WORKER, ::STARPU_CUDA_WORKER and ::STARPU_OPENCL_WORKER are currently supported. \var union starpu_driver::id The identifier of the driver. \struct starpu_conf \ingroup API_Initialization_and_Termination This structure is passed to the starpu_init() function in order to configure StarPU. It has to be initialized with starpu_conf_init(). When the default value is used, StarPU automatically selects the number of processing units and takes the default scheduling policy. The environment variables overwrite the equivalent parameters. \var int starpu_conf::magic \private Will be initialized by starpu_conf_init(). Should not be set by hand. \var const char*starpu_conf::sched_policy_name This is the name of the scheduling policy. This can also be specified with the environment variable \ref STARPU_SCHED. (default = NULL). \var struct starpu_sched_policy *starpu_conf::sched_policy This is the definition of the scheduling policy. This field is ignored if starpu_conf::sched_policy_name is set. (default = NULL) \var int starpu_conf::ncpus This is the number of CPU cores that StarPU can use. This can also be specified with the environment variable \ref STARPU_NCPU . (default = -1) \var int starpu_conf::ncuda This is the number of CUDA devices that StarPU can use. This can also be specified with the environment variable \ref STARPU_NCUDA. (default = -1) \var int starpu_conf::nopencl This is the number of OpenCL devices that StarPU can use. This can also be specified with the environment variable \ref STARPU_NOPENCL. (default = -1) \var int starpu_conf::nmic This is the number of MIC devices that StarPU can use. This can also be specified with the environment variable \ref STARPU_NMIC. (default = -1) \var int starpu_conf::nscc This is the number of SCC devices that StarPU can use. This can also be specified with the environment variable \ref STARPU_NSCC. (default = -1) \var unsigned starpu_conf::use_explicit_workers_bindid If this flag is set, the starpu_conf::workers_bindid array indicates where the different workers are bound, otherwise StarPU automatically selects where to bind the different workers. This can also be specified with the environment variable \ref STARPU_WORKERS_CPUID. (default = 0) \var unsigned starpu_conf::workers_bindid[STARPU_NMAXWORKERS] If the starpu_conf::use_explicit_workers_bindid flag is set, this array indicates where to bind the different workers. The i-th entry of the starpu_conf::workers_bindid indicates the logical identifier of the processor which should execute the i-th worker. Note that the logical ordering of the CPUs is either determined by the OS, or provided by the hwloc library in case it is available. \var unsigned starpu_conf::use_explicit_workers_cuda_gpuid If this flag is set, the CUDA workers will be attached to the CUDA devices specified in the starpu_conf::workers_cuda_gpuid array. Otherwise, StarPU affects the CUDA devices in a round-robin fashion. This can also be specified with the environment variable \ref STARPU_WORKERS_CUDAID. (default = 0) \var unsigned starpu_conf::workers_cuda_gpuid[STARPU_NMAXWORKERS] If the starpu_conf::use_explicit_workers_cuda_gpuid flag is set, this array contains the logical identifiers of the CUDA devices (as used by cudaGetDevice()). \var unsigned starpu_conf::use_explicit_workers_opencl_gpuid If this flag is set, the OpenCL workers will be attached to the OpenCL devices specified in the starpu_conf::workers_opencl_gpuid array. Otherwise, StarPU affects the OpenCL devices in a round-robin fashion. This can also be specified with the environment variable \ref STARPU_WORKERS_OPENCLID. (default = 0) \var unsigned starpu_conf::workers_opencl_gpuid[STARPU_NMAXWORKERS] If the starpu_conf::use_explicit_workers_opencl_gpuid flag is set, this array contains the logical identifiers of the OpenCL devices to be used. \var unsigned starpu_conf::use_explicit_workers_mic_deviceid If this flag is set, the MIC workers will be attached to the MIC devices specified in the array starpu_conf::workers_mic_deviceid. Otherwise, StarPU affects the MIC devices in a round-robin fashion. This can also be specified with the environment variable \ref STARPU_WORKERS_MICID. (default = 0) \var unsigned starpu_conf::workers_mic_deviceid[STARPU_NMAXWORKERS] If the flag starpu_conf::use_explicit_workers_mic_deviceid is set, the array contains the logical identifiers of the MIC devices to be used. \var unsigned starpu_conf::use_explicit_workers_scc_deviceid If this flag is set, the SCC workers will be attached to the SCC devices specified in the array starpu_conf::workers_scc_deviceid. (default = 0) \var unsigned starpu_conf::workers_scc_deviceid[STARPU_NMAXWORKERS] If the flag starpu_conf::use_explicit_workers_scc_deviceid is set, the array contains the logical identifiers of the SCC devices to be used. Otherwise, StarPU affects the SCC devices in a round-robin fashion. This can also be specified with the environment variable \ref STARPU_WORKERS_SCCID. \var int starpu_conf::bus_calibrate If this flag is set, StarPU will recalibrate the bus. If this value is equal to -1, the default value is used. This can also be specified with the environment variable \ref STARPU_BUS_CALIBRATE. (default = 0) \var int starpu_conf::calibrate If this flag is set, StarPU will calibrate the performance models when executing tasks. If this value is equal to -1, the default value is used. If the value is equal to 1, it will force continuing calibration. If the value is equal to 2, the existing performance models will be overwritten. This can also be specified with the environment variable \ref STARPU_CALIBRATE. (default = 0) \var int starpu_conf::single_combined_worker By default, StarPU executes parallel tasks concurrently. Some parallel libraries (e.g. most OpenMP implementations) however do not support concurrent calls to parallel code. In such case, setting this flag makes StarPU only start one parallel task at a time (but other CPU and GPU tasks are not affected and can be run concurrently). The parallel task scheduler will however still try varying combined worker sizes to look for the most efficient ones. This can also be specified with the environment variable \ref STARPU_SINGLE_COMBINED_WORKER. (default = 0) \var char *starpu_conf::mic_sink_program_path Path to the kernel to execute on the MIC device, compiled for MIC architecture. When set to NULL, StarPU automatically looks next to the host program location. (default = NULL) \var int starpu_conf::disable_asynchronous_copy This flag should be set to 1 to disable asynchronous copies between CPUs and all accelerators. This can also be specified with the environment variable \ref STARPU_DISABLE_ASYNCHRONOUS_COPY. The AMD implementation of OpenCL is known to fail when copying data asynchronously. When using this implementation, it is therefore necessary to disable asynchronous data transfers. This can also be specified at compilation time by giving to the configure script the option \ref disable-asynchronous-copy "--disable-asynchronous-copy". (default = 0) \var int starpu_conf::disable_asynchronous_cuda_copy This flag should be set to 1 to disable asynchronous copies between CPUs and CUDA accelerators. This can also be specified with the environment variable \ref STARPU_DISABLE_ASYNCHRONOUS_CUDA_COPY. This can also be specified at compilation time by giving to the configure script the option \ref disable-asynchronous-cuda-copy "--disable-asynchronous-cuda-copy". (default = 0) \var int starpu_conf::disable_asynchronous_opencl_copy This flag should be set to 1 to disable asynchronous copies between CPUs and OpenCL accelerators. This can also be specified with the environment variable \ref STARPU_DISABLE_ASYNCHRONOUS_OPENCL_COPY. The AMD implementation of OpenCL is known to fail when copying data asynchronously. When using this implementation, it is therefore necessary to disable asynchronous data transfers. This can also be specified at compilation time by giving to the configure script the option \ref disable-asynchronous-opencl-copy "--disable-asynchronous-opencl-copy". (default = 0) \var int starpu_conf::disable_asynchronous_mic_copy This flag should be set to 1 to disable asynchronous copies between CPUs and MIC accelerators. This can also be specified with the environment variable \ref STARPU_DISABLE_ASYNCHRONOUS_MIC_COPY. This can also be specified at compilation time by giving to the configure script the option \ref disable-asynchronous-mic-copy "--disable-asynchronous-mic-copy". (default = 0). \var unsigned *starpu_conf::cuda_opengl_interoperability Enable CUDA/OpenGL interoperation on these CUDA devices. This can be set to an array of CUDA device identifiers for which cudaGLSetGLDevice() should be called instead of cudaSetDevice(). Its size is specified by the starpu_conf::n_cuda_opengl_interoperability field below (default = NULL) \var unsigned starpu_conf::n_cuda_opengl_interoperability todo \var struct starpu_driver *starpu_conf::not_launched_drivers Array of drivers that should not be launched by StarPU. The application will run in one of its own threads. (default = NULL) \var unsigned starpu_conf::n_not_launched_drivers The number of StarPU drivers that should not be launched by StarPU. (default = 0) \var starpu_conf::trace_buffer_size Specifies the buffer size used for FxT tracing. Starting from FxT version 0.2.12, the buffer will automatically be flushed when it fills in, but it may still be interesting to specify a bigger value to avoid any flushing (which would disturb the trace). \fn int starpu_init(struct starpu_conf *conf) \ingroup API_Initialization_and_Termination This is StarPU initialization method, which must be called prior to any other StarPU call. It is possible to specify StarPU’s configuration (e.g. scheduling policy, number of cores, ...) by passing a non-null argument. Default configuration is used if the passed argument is NULL. Upon successful completion, this function returns 0. Otherwise, -ENODEV indicates that no worker was available (so that StarPU was not initialized). \fn int starpu_initialize(struct starpu_conf *user_conf, int *argc, char ***argv) \ingroup API_Initialization_and_Termination This is the same as starpu_init(), but also takes the \p argc and \p argv as defined by the application. This is needed for SCC execution to initialize the communication library. Do not call starpu_init() and starpu_initialize() in the same program. \fn int starpu_conf_init(struct starpu_conf *conf) \ingroup API_Initialization_and_Termination This function initializes the conf structure passed as argument with the default values. In case some configuration parameters are already specified through environment variables, starpu_conf_init() initializes the fields of the structure according to the environment variables. For instance if \ref STARPU_CALIBRATE is set, its value is put in the field starpu_conf::calibrate of the structure passed as argument. Upon successful completion, this function returns 0. Otherwise, -EINVAL indicates that the argument was NULL. \fn void starpu_shutdown(void) \ingroup API_Initialization_and_Termination This is StarPU termination method. It must be called at the end of the application: statistics and other post-mortem debugging information are not guaranteed to be available until this method has been called. \fn void starpu_pause(void) \ingroup API_Initialization_and_Termination This call is used to suspend the processing of new tasks by workers. It can be used in a program where StarPU is used during only a part of the execution. Without this call, the workers continue to poll for new tasks in a tight loop, wasting CPU time. The symmetric call to starpu_resume() should be used to unfreeze the workers. \fn void starpu_resume(void) \ingroup API_Initialization_and_Termination This is the symmetrical call to starpu_pause(), used to resume the workers polling for new tasks. \fn int starpu_asynchronous_copy_disabled(void) \ingroup API_Initialization_and_Termination Return 1 if asynchronous data transfers between CPU and accelerators are disabled. \fn int starpu_asynchronous_cuda_copy_disabled(void) \ingroup API_Initialization_and_Termination Return 1 if asynchronous data transfers between CPU and CUDA accelerators are disabled. \fn int starpu_asynchronous_opencl_copy_disabled(void) \ingroup API_Initialization_and_Termination Return 1 if asynchronous data transfers between CPU and OpenCL accelerators are disabled. \fn int starpu_asynchronous_mic_copy_disabled(void) \ingroup API_Initialization_and_Termination Return 1 if asynchronous data transfers between CPU and MIC devices are disabled. \fn void starpu_topology_print(FILE *f) \ingroup API_Initialization_and_Termination Prints a description of the topology on f. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/insert_task.doxy000066400000000000000000000143661320135501600240170ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Insert_Task Insert_Task \fn int starpu_insert_task(struct starpu_codelet *cl, ...) \ingroup API_Insert_Task This function does the same as the function starpu_task_insert(). It has been kept to avoid breaking old codes. \fn int starpu_task_insert(struct starpu_codelet *cl, ...) \ingroup API_Insert_Task Create and submit a task corresponding to \p cl with the following arguments. The argument list must be zero-terminated. The arguments following the codelet can be of the following types:
    • ::STARPU_R, ::STARPU_W, ::STARPU_RW, ::STARPU_SCRATCH, ::STARPU_REDUX an access mode followed by a data handle;
    • ::STARPU_DATA_ARRAY followed by an array of data handles and its number of elements;
    • ::STARPU_DATA_MODE_ARRAY followed by an array of struct starpu_data_descr, i.e data handles with their associated access modes, and its number of elements;
    • ::STARPU_EXECUTE_ON_WORKER, ::STARPU_WORKER_ORDER followed by an integer value specifying the worker on which to execute the task (as specified by starpu_task::execute_on_a_specific_worker)
    • the specific values ::STARPU_VALUE, ::STARPU_CALLBACK, ::STARPU_CALLBACK_ARG, ::STARPU_CALLBACK_WITH_ARG, ::STARPU_PRIORITY, ::STARPU_TAG, ::STARPU_TAG_ONLY, ::STARPU_FLOPS, ::STARPU_SCHED_CTX, ::STARPU_CL_ARGS followed by the appropriated objects as defined elsewhere.
    When using ::STARPU_DATA_ARRAY, the access mode of the data handles is not defined, it will be taken from the codelet starpu_codelet::modes or starpu_codelet::dyn_modes field. One should use ::STARPU_DATA_MODE_ARRAY to define the data handles along with the access modes. Parameters to be passed to the codelet implementation are defined through the type ::STARPU_VALUE. The function starpu_codelet_unpack_args() must be called within the codelet implementation to retrieve them. \def STARPU_VALUE \ingroup API_Insert_Task this macro is used when calling starpu_task_insert(), and must be followed by a pointer to a constant value and the size of the constant \def STARPU_CL_ARGS \ingroup API_Insert_Task this macro is used when calling starpu_task_insert(), and must be followed by a memory buffer containing the arguments to be given to the task, and by the size of the arguments. The memory buffer should be the result of a previous call to starpu_codelet_pack_args(), and will be freed (i.e. starpu_task::cl_arg_free will be set to 1) \def STARPU_CALLBACK \ingroup API_Insert_Task this macro is used when calling starpu_task_insert(), and must be followed by a pointer to a callback function \def STARPU_CALLBACK_WITH_ARG \ingroup API_Insert_Task this macro is used when calling starpu_task_insert(), and must be followed by two pointers: one to a callback function, and the other to be given as an argument to the callback function; this is equivalent to using both ::STARPU_CALLBACK and ::STARPU_CALLBACK_WITH_ARG. \def STARPU_CALLBACK_ARG \ingroup API_Insert_Task this macro is used when calling starpu_task_insert(), and must be followed by a pointer to be given as an argument to the callback function \def STARPU_PRIORITY \ingroup API_Insert_Task this macro is used when calling starpu_task_insert(), and must be followed by a integer defining a priority level \def STARPU_DATA_ARRAY \ingroup API_Insert_Task TODO \def STARPU_DATA_MODE_ARRAY \ingroup API_Insert_Task TODO \def STARPU_EXECUTE_ON_WORKER \ingroup API_Insert_Task this macro is used when calling starpu_task_insert(), and must be followed by an integer value specifying the worker on which to execute the task (as specified by starpu_task::execute_on_a_specific_worker) \def STARPU_WORKER_ORDER \ingroup API_Insert_Task this macro is used when calling starpu_task_insert(), and must be followed by an integer value specifying the worker order in which to execute the tasks (as specified by starpu_task::workerorder) \def STARPU_TAG \ingroup API_Insert_Task this macro is used when calling starpu_task_insert(), and must be followed by a tag. \def STARPU_TAG_ONLY \ingroup API_Insert_Task this macro is used when calling starpu_task_insert(), and must be followed by a tag. It sets starpu_task::tag_id, but leaves starpu_task::use_tag as 0. \def STARPU_NAME \ingroup API_Insert_Task this macro is used when calling starpu_task_insert(), and must be followed by a char *. It sets starpu_task::name to it. \def STARPU_FLOPS \ingroup API_Insert_Task this macro is used when calling starpu_task_insert(), and must be followed by an amount of floating point operations, as a double. Users MUST explicitly cast into double, otherwise parameter passing will not work. \def STARPU_SCHED_CTX \ingroup API_Insert_Task this macro is used when calling starpu_task_insert(), and must be followed by the id of the scheduling context to which we want to submit the task. \fn void starpu_codelet_pack_args(void **arg_buffer, size_t *arg_buffer_size, ...) \ingroup API_Insert_Task Pack arguments of type ::STARPU_VALUE into a buffer which can be given to a codelet and later unpacked with the function starpu_codelet_unpack_args(). \fn void starpu_codelet_unpack_args(void *cl_arg, ...) \ingroup API_Insert_Task Retrieve the arguments of type ::STARPU_VALUE associated to a task automatically created using the function starpu_task_insert(). If any parameter's value is 0, unpacking will stop there and ignore the remaining parameters. \fn void starpu_codelet_unpack_args_and_copyleft(void *cl_arg, void *buffer, size_t buffer_size, ...) \ingroup API_Insert_Task Similar to starpu_codelet_unpack_args(), but if any parameter is 0, copy the part of cl_arg that has not been read in buffer which can then be used in a later call to one of the unpack functions. \fn struct starpu_task *starpu_task_build(struct starpu_codelet *cl, ...) \ingroup API_Insert_Task Create a task corresponding to \p cl with the following arguments. The argument list must be zero-terminated. The arguments following the codelet are the same as the ones for the function starpu_task_insert(). If some arguments of type ::STARPU_VALUE are given, the parameter starpu_task::cl_arg_free will be set to 1. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/lower_bound.doxy000066400000000000000000000035711320135501600240040ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Theoretical_Lower_Bound_on_Execution_Time Theoretical Lower Bound on Execution Time \brief Compute theoretical upper computation efficiency bound corresponding to some actual execution. \fn void starpu_bound_start(int deps, int prio) \ingroup API_Theoretical_Lower_Bound_on_Execution_Time Start recording tasks (resets stats). \p deps tells whether dependencies should be recorded too (this is quite expensive) \fn void starpu_bound_stop(void) \ingroup API_Theoretical_Lower_Bound_on_Execution_Time Stop recording tasks \fn void starpu_bound_print_dot(FILE *output) \ingroup API_Theoretical_Lower_Bound_on_Execution_Time Print the DAG that was recorded \fn void starpu_bound_compute(double *res, double *integer_res, int integer) \ingroup API_Theoretical_Lower_Bound_on_Execution_Time Get theoretical upper bound (in ms) (needs glpk support detected by configure script). It returns 0 if some performance models are not calibrated. \fn void starpu_bound_print_lp(FILE *output) \ingroup API_Theoretical_Lower_Bound_on_Execution_Time Emit the Linear Programming system on \p output for the recorded tasks, in the lp format \fn void starpu_bound_print_mps(FILE *output) \ingroup API_Theoretical_Lower_Bound_on_Execution_Time Emit the Linear Programming system on \p output for the recorded tasks, in the mps format \fn void starpu_bound_print(FILE *output, int integer) \ingroup API_Theoretical_Lower_Bound_on_Execution_Time Emit statistics of actual execution vs theoretical upper bound. \p integer permits to choose between integer solving (which takes a long time but is correct), and relaxed solving (which provides an approximate solution). */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/mic_extensions.doxy000066400000000000000000000024231320135501600245070ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_MIC_Extensions MIC Extensions \def STARPU_USE_MIC \ingroup API_MIC_Extensions This macro is defined when StarPU has been installed with MIC support. It should be used in your code to detect the availability of MIC. \def STARPU_MAXMICDEVS \ingroup API_MIC_Extensions This macro defines the maximum number of MIC devices that are supported by StarPU. \typedef starpu_mic_func_symbol_t \ingroup API_MIC_Extensions Type for MIC function symbols \fn int starpu_mic_register_kernel(starpu_mic_func_symbol_t *symbol, const char *func_name) \ingroup API_MIC_Extensions Initiate a lookup on each MIC device to find the adress of the function named \p func_name, store them in the global array kernels and return the index in the array through \p symbol. \fn starpu_mic_kernel_t starpu_mic_get_kernel(starpu_mic_func_symbol_t symbol) \ingroup API_MIC_Extensions If success, return the pointer to the function defined by \p symbol on the device linked to the called device. This can for instance be used in a starpu_mic_func_t implementation. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/misc_helpers.doxy000066400000000000000000000050251320135501600241360ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Miscellaneous_Helpers Miscellaneous Helpers \fn int starpu_data_cpy(starpu_data_handle_t dst_handle, starpu_data_handle_t src_handle, int asynchronous, void (*callback_func)(void*), void *callback_arg) \ingroup API_Miscellaneous_Helpers Copy the content of \p src_handle into \p dst_handle. The parameter \p asynchronous indicates whether the function should block or not. In the case of an asynchronous call, it is possible to synchronize with the termination of this operation either by the means of implicit dependencies (if enabled) or by calling starpu_task_wait_for_all(). If \p callback_func is not NULL, this callback function is executed after the handle has been copied, and it is given the pointer \p callback_arg as argument. \fn void starpu_execute_on_each_worker(void (*func)(void *), void *arg, uint32_t where) \ingroup API_Miscellaneous_Helpers This function executes the given function on a subset of workers. When calling this method, the offloaded function \p func is executed by every StarPU worker that may execute the function. The argument \p arg is passed to the offloaded function. The argument \p where specifies on which types of processing units the function should be executed. Similarly to the field starpu_codelet::where, it is possible to specify that the function should be executed on every CUDA device and every CPU by passing ::STARPU_CPU|::STARPU_CUDA. This function blocks until the function has been executed on every appropriate processing units, so that it may not be called from a callback function for instance. \fn void starpu_execute_on_each_worker_ex(void (*func)(void *), void *arg, uint32_t where, const char *name) \ingroup API_Miscellaneous_Helpers Same as starpu_execute_on_each_worker(), except that the task name is specified in the argument \p name. \fn void starpu_execute_on_specific_workers(void (*func)(void*), void *arg, unsigned num_workers, unsigned *workers, const char *name); \ingroup API_Miscellaneous_Helpers Call \p func(\p arg) on every worker in the \p workers array. \p num_workers indicates the number of workers in this array. This function is synchronous, but the different workers may execute the function in parallel. \fn double starpu_timing_now(void) \ingroup API_Miscellaneous_Helpers Return the current date in micro-seconds. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/modularized_scheduler.doxy000066400000000000000000000602671320135501600260470ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2013 Simon Archipoff * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2014, 2015, 2016 CNRS * Copyright (C) 2013, 2014 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Modularized_Scheduler Modularized Scheduler Interface \enum starpu_sched_component_properties \ingroup API_Modularized_Scheduler flags for starpu_sched_component::properties \var starpu_sched_component_properties::STARPU_SCHED_COMPONENT_HOMOGENEOUS \ingroup API_Modularized_Scheduler indicate that all workers have the same starpu_worker_archtype \var starpu_sched_component_properties::STARPU_SCHED_COMPONENT_SINGLE_MEMORY_NODE \ingroup API_Modularized_Scheduler indicate that all workers have the same memory component \def STARPU_SCHED_COMPONENT_IS_HOMOGENEOUS \ingroup API_Modularized_Scheduler indicate if component is homogeneous \def STARPU_SCHED_COMPONENT_IS_SINGLE_MEMORY_NODE \ingroup API_Modularized_Scheduler indicate if all workers have the same memory component \struct starpu_sched_component \ingroup API_Modularized_Scheduler This structure represent a scheduler module. A scheduler is a tree-like structure of them, some parts of scheduler can be shared by several contexes to perform some local optimisations, so, for all components, a list of parent is defined indexed by sched_ctx_id. They embed there specialised method in a pseudo object-style, so calls are like component->push_task(component,task) \var struct starpu_sched_tree *starpu_sched_component::tree The tree containing the component \var struct starpu_bitmap *starpu_sched_component::workers this member contain the set of underlying workers \var starpu_sched_component::workers_in_ctx this member contain the subset of starpu_sched_component::workers that is currently available in the context The push method should take this member into account. this member is set with : component->workers UNION tree->workers UNION component->child[i]->workers_in_ctx iff exist x such as component->children[i]->parents[x] == component \var void *starpu_sched_component::data private data \var int starpu_sched_component::nchildren the number of compoments's children \var struct starpu_sched_component **starpu_sched_component::children the vector of component's children \var int starpu_sched_component::nparents the numbers of component's parents \var struct starpu_sched_component **starpu_sched_component::parents the vector of component's parents \var void(*starpu_sched_component::add_child)(struct starpu_sched_component *component, struct starpu_sched_component *child) add a child to component \var void(*starpu_sched_component::remove_child)(struct starpu_sched_component *component, struct starpu_sched_component *child) remove a child from component \var void(*starpu_sched_component::add_parent)(struct starpu_sched_component *component, struct starpu_sched_component *parent) todo \var void(*starpu_sched_component::remove_parent)(struct starpu_sched_component *component, struct starpu_sched_component *parent) todo \var int (*starpu_sched_component::push_task)(struct starpu_sched_component *, struct starpu_task *) push a task in the scheduler module. this function is called to push a task on component subtree, this can either perform a recursive call on a child or store the task in the component, then it will be returned by a further pull_task call. the caller must ensure that component is able to execute task. This method must either return 0 if it the task was properly stored or passed over to a child component, or return a value different from 0 if the task could not be consumed (e.g. the queue is full). \var struct starpu_task * (*starpu_sched_component::pull_task)(struct starpu_sched_component *) pop a task from the scheduler module. this function is called by workers to get a task from their parents. this function should first return a locally stored task or perform a recursive call on the parents. the task returned by this function is executable by the caller \var int (*starpu_sched_component::can_push)(struct starpu_sched_component *component) This function is called by a component which implements a queue, allowing it to signify to its parents that an empty slot is available in its queue. The basic implementation of this function is a recursive call to its parents, the user has to specify a personally-made function to catch those calls. \var void (*starpu_sched_component::can_pull)(struct starpu_sched_component *component) This function allow a component to wake up a worker. It is currently called by component which implements a queue, to signify to its children that a task have been pushed in its local queue, and is available to be popped by a worker, for example. The basic implementation of this function is a recursive call to its children, until at least one worker have been woken up. \var double (*starpu_sched_component::estimated_load)(struct starpu_sched_component *component) is an heuristic to compute load of scheduler module. Basically the number of tasks divided by the sum of relatives speedup of workers available in context. estimated_load(component) = sum(estimated_load(component_children)) + nb_local_tasks / average(relative_speedup(underlying_worker)) \var starpu_sched_component::estimated_end return the time when a worker will enter in starvation. This function is relevant only if the task->predicted member has been set. \var void (*starpu_sched_component::deinit_data)(struct starpu_sched_component *component) called by starpu_sched_component_destroy. Should free data allocated during creation \var void (*starpu_sched_component::notify_change_workers)(struct starpu_sched_component *component) this function is called for each component when workers are added or removed from a context \var int starpu_sched_component::properties todo \var hwloc_obj_t starpu_sched_component::obj the hwloc object associated to scheduler module. points to the part of topology that is binded to this component, eg: a numa node for a ws component that would balance load between underlying sockets \struct starpu_sched_tree \ingroup API_Modularized_Scheduler The actual scheduler \var struct starpu_sched_component *starpu_sched_tree::root this is the entry module of the scheduler \var struct starpu_bitmap *starpu_sched_tree::workers this is the set of workers available in this context, this value is used to mask workers in modules \var unsigned starpu_sched_tree::sched_ctx_id the context id of the scheduler \var starpu_pthread_mutex_t starpu_sched_tree::lock this lock is used to protect the scheduler, it is taken in read mode pushing a task and in write mode for adding or removing workers \var struct starpu_sched_component *starpu_sched_tree::worker_components[STARPU_NMAXWORKERS] worker components @name Scheduling Tree API \ingroup API_Modularized_Scheduler \fn struct starpu_sched_tree *starpu_sched_tree_create(unsigned sched_ctx_id) \ingroup API_Modularized_Scheduler create a empty initialized starpu_sched_tree \fn void starpu_sched_tree_destroy(struct starpu_sched_tree *tree) \ingroup API_Modularized_Scheduler destroy tree and free all non shared component in it. \fn void starpu_sched_tree_update_workers(struct starpu_sched_tree *t) \ingroup API_Modularized_Scheduler recursively set all starpu_sched_component::workers, do not take into account shared parts (except workers). \fn void starpu_sched_tree_update_workers_in_ctx(struct starpu_sched_tree *t) \ingroup API_Modularized_Scheduler recursively set all starpu_sched_component::workers_in_ctx, do not take into account shared parts (except workers) \fn int starpu_sched_tree_push_task(struct starpu_task *task) \ingroup API_Modularized_Scheduler compatibility with starpu_sched_policy interface \fn struct starpu_task *starpu_sched_tree_pop_task(unsigned sched_ctx) \ingroup API_Modularized_Scheduler compatibility with starpu_sched_policy interface \fn void starpu_sched_tree_add_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers) \ingroup API_Modularized_Scheduler compatibility with starpu_sched_policy interface \fn void starpu_sched_tree_remove_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers) \ingroup API_Modularized_Scheduler compatibility with starpu_sched_policy interface \fn void starpu_sched_component_connect(struct starpu_sched_component *parent, struct starpu_sched_component *child) \ingroup API_Modularized_Scheduler Attaches component \p child to parent \p parent. Some component may accept only one child, others accept several (e.g. MCT) @name Generic Scheduling Component API \ingroup API_Modularized_Scheduler \fn struct starpu_sched_component *starpu_sched_component_create(struct starpu_sched_tree *tree, const char *name) \ingroup API_Modularized_Scheduler allocate and initialize component field with defaults values : .pop_task make recursive call on father .estimated_load compute relative speedup and tasks in sub tree .estimated_end return the average of recursive call on children .add_child is starpu_sched_component_add_child .remove_child is starpu_sched_component_remove_child .notify_change_workers does nothing .deinit_data does nothing \fn void starpu_sched_component_destroy(struct starpu_sched_component *component) \ingroup API_Modularized_Scheduler free data allocated by starpu_sched_component_create and call component->deinit_data(component) set to null the member starpu_sched_component::fathers[sched_ctx_id] of all child if its equal to \p component \fn void starpu_sched_component_destroy_rec(struct starpu_sched_component *component) \ingroup API_Modularized_Scheduler recursively destroy non shared parts of a \p component 's tree \fn int starpu_sched_component_can_execute_task(struct starpu_sched_component *component, struct starpu_task *task) \ingroup API_Modularized_Scheduler return true iff \p component can execute \p task, this function take into account the workers available in the scheduling context \fn int starpu_sched_component_execute_preds(struct starpu_sched_component *component, struct starpu_task *task, double *length) \ingroup API_Modularized_Scheduler return a non null value if \p component can execute \p task. write the execution prediction length for the best implementation of the best worker available and write this at \p length address. this result is more relevant if starpu_sched_component::is_homogeneous is non null. if a worker need to be calibrated for an implementation, nan is set to \p length. \fn double starpu_sched_component_transfer_length(struct starpu_sched_component *component, struct starpu_task *task) \ingroup API_Modularized_Scheduler return the average time to transfer \p task data to underlying \p component workers. @name Worker Component API \ingroup API_Modularized_Scheduler \fn struct starpu_sched_component *starpu_sched_component_worker_get(unsigned sched_ctx, int workerid) \ingroup API_Modularized_Scheduler return the struct starpu_sched_component corresponding to \p workerid. Undefined if \p workerid is not a valid workerid \fn int starpu_sched_component_worker_get_workerid(struct starpu_sched_component *worker_component) \ingroup API_Modularized_Scheduler return the workerid of \p worker_component, undefined if starpu_sched_component_is_worker(worker_component) == 0 \fn int starpu_sched_component_is_worker(struct starpu_sched_component *component) \ingroup API_Modularized_Scheduler return true iff \p component is a worker component \fn int starpu_sched_component_is_simple_worker(struct starpu_sched_component *component) \ingroup API_Modularized_Scheduler return true iff \p component is a simple worker component \fn int starpu_sched_component_is_combined_worker(struct starpu_sched_component *component) \ingroup API_Modularized_Scheduler return true iff \p component is a combined worker component \fn void starpu_sched_component_worker_pre_exec_hook(struct starpu_task *task) \ingroup API_Modularized_Scheduler compatibility with starpu_sched_policy interface update predictions for workers \fn void starpu_sched_component_worker_post_exec_hook(struct starpu_task *task) \ingroup API_Modularized_Scheduler compatibility with starpu_sched_policy interface @name Flow-control Fifo Component API \ingroup API_Modularized_Scheduler \fn double starpu_sched_component_estimated_load(struct starpu_sched_component * component); \ingroup API_Modularized_Scheduler default function for the estimated_load component method, just sums up the loads of the children of the component. \fn double starpu_sched_component_estimated_end_min(struct starpu_sched_component * component); \ingroup API_Modularized_Scheduler function that can be used for the estimated_end component method, which just computes the minimum completion time of the children. \fn double starpu_sched_component_estimated_end_average(struct starpu_sched_component * component); \ingroup API_Modularized_Scheduler default function for the estimated_end component method, which just computes the average completion time of the children. \struct starpu_sched_component_fifo_data \ingroup API_Modularized_Scheduler \var unsigned starpu_sched_component_fifo_data::ntasks_threshold todo \var double starpu_sched_component_fifo_data::exp_len_threshold todo \fn struct starpu_sched_component *starpu_sched_component_fifo_create(struct starpu_sched_tree *tree, struct starpu_sched_component_fifo_data *fifo_data) \ingroup API_Modularized_Scheduler Return a struct starpu_sched_component with a fifo. A stable sort is performed according to tasks priorities. A push_task call on this component does not perform recursive calls, underlying components will have to call pop_task to get it. starpu_sched_component::estimated_end function compute the estimated length by dividing the sequential length by the number of underlying workers. Do not take into account tasks that are currently executed. \fn int starpu_sched_component_is_fifo(struct starpu_sched_component *component) \ingroup API_Modularized_Scheduler return true iff \p component is a fifo component @name Flow-control Prio Component API \ingroup API_Modularized_Scheduler \struct starpu_sched_component_prio_data \ingroup API_Modularized_Scheduler \var unsigned starpu_sched_component_prio_data::ntasks_threshold todo \var double starpu_sched_component_prio_data::exp_len_threshold todo \fn struct starpu_sched_component *starpu_sched_component_prio_create(struct starpu_sched_tree *tree, struct starpu_sched_component_prio_data *prio_data) \ingroup API_Modularized_Scheduler todo \fn int starpu_sched_component_is_prio(struct starpu_sched_component *component) \ingroup API_Modularized_Scheduler todo @name Resource-mapping Work-Stealing Component API \ingroup API_Modularized_Scheduler \fn struct starpu_sched_component *starpu_sched_component_work_stealing_create(struct starpu_sched_tree *tree, void *arg) \ingroup API_Modularized_Scheduler return a component that perform a work stealing scheduling. Tasks are pushed in a round robin way. estimated_end return the average of expected length of fifos, starting at the average of the expected_end of his children. When a worker have to steal a task, it steal a task in a round robin way, and get the last pushed task of the higher priority. \fn int starpu_sched_tree_work_stealing_push_task(struct starpu_task *task) \ingroup API_Modularized_Scheduler undefined if there is no work stealing component in the scheduler. If any, \p task is pushed in a default way if the caller is the application, and in the caller's fifo if its a worker. \fn int starpu_sched_component_is_work_stealing(struct starpu_sched_component *component) \ingroup API_Modularized_Scheduler return true iff \p component is a work stealing component @name Resource-mapping Random Component API \ingroup API_Modularized_Scheduler \fn struct starpu_sched_component *starpu_sched_component_random_create(struct starpu_sched_tree *tree, void *arg) \ingroup API_Modularized_Scheduler create a component that perform a random scheduling \fn int starpu_sched_component_is_random(struct starpu_sched_component *) \ingroup API_Modularized_Scheduler return true iff \p component is a random component @name Resource-mapping Eager Component API \ingroup API_Modularized_Scheduler \fn struct starpu_sched_component *starpu_sched_component_eager_create(struct starpu_sched_tree *tree, void *arg) \ingroup API_Modularized_Scheduler todo \fn int starpu_sched_component_is_eager(struct starpu_sched_component *) \ingroup API_Modularized_Scheduler todo @name Resource-mapping Eager-Calibration Component API \ingroup API_Modularized_Scheduler \fn struct starpu_sched_component *starpu_sched_component_eager_calibration_create(struct starpu_sched_tree *tree, void *arg) \ingroup API_Modularized_Scheduler todo \fn int starpu_sched_component_is_eager_calibration(struct starpu_sched_component *) \ingroup API_Modularized_Scheduler todo @name Resource-mapping MCT Component API \ingroup API_Modularized_Scheduler \struct starpu_sched_component_mct_data \ingroup API_Modularized_Scheduler \var double starpu_sched_component_mct_data::alpha todo \var double starpu_sched_component_mct_data::beta todo \var double starpu_sched_component_mct_data::_gamma todo \var double starpu_sched_component_mct_data::idle_power todo \fn struct starpu_sched_component *starpu_sched_component_mct_create(struct starpu_sched_tree *tree, struct starpu_sched_component_mct_data *mct_data) \ingroup API_Modularized_Scheduler create a component with mct_data paremeters. the mct component doesnt do anything but pushing tasks on no_perf_model_component and calibrating_component \fn int starpu_sched_component_is_mct(struct starpu_sched_component *component); \ingroup API_Modularized_Scheduler todo @name Resource-mapping Heft Component API \ingroup API_Modularized_Scheduler \fn struct starpu_sched_component *starpu_sched_component_heft_create(struct starpu_sched_tree *tree, struct starpu_sched_component_mct_data *mct_data) \ingroup API_Modularized_Scheduler this component perform a heft scheduling \fn int starpu_sched_component_is_heft(struct starpu_sched_component *component) \ingroup API_Modularized_Scheduler return true iff \p component is a heft component @name Special-purpose Best_Implementation Component API \ingroup API_Modularized_Scheduler \fn struct starpu_sched_component *starpu_sched_component_best_implementation_create(struct starpu_sched_tree *tree, void *arg) \ingroup API_Modularized_Scheduler Select the implementation that offer the shortest computation length for the first worker that can execute the task. Or an implementation that need to be calibrated. Also set starpu_task::predicted and starpu_task::predicted_transfer for memory component of the first suitable workerid. If starpu_sched_component::push method is called and starpu_sched_component::nchild > 1 the result is undefined. @name Special-purpose Perfmodel_Select Component API \ingroup API_Modularized_Scheduler \struct starpu_sched_component_perfmodel_select_data \ingroup API_Modularized_Scheduler \var struct starpu_sched_component *starpu_sched_component_perfmodel_select_data::calibrator_component todo \var struct starpu_sched_component *starpu_sched_component_perfmodel_select_data::no_perfmodel_component todo \var struct starpu_sched_component *starpu_sched_component_perfmodel_select_data::perfmodel_component todo \fn struct starpu_sched_component *starpu_sched_component_perfmodel_select_create(struct starpu_sched_tree *tree, struct starpu_sched_component_perfmodel_select_data *perfmodel_select_data) \ingroup API_Modularized_Scheduler todo \fn int starpu_sched_component_is_perfmodel_select(struct starpu_sched_component *component) \ingroup API_Modularized_Scheduler todo @name Recipe Component API \ingroup API_Modularized_Scheduler \struct starpu_sched_component_composed_recipe \ingroup API_Modularized_Scheduler parameters for starpu_sched_component_composed_component_create \fn struct starpu_sched_component_composed_recipe *starpu_sched_component_composed_recipe_create(void) \ingroup API_Modularized_Scheduler return an empty recipe for a composed component, it should not be used without modification \fn struct starpu_sched_component_composed_recipe *starpu_sched_component_composed_recipe_create_singleton(struct starpu_sched_component *(*create_component)(struct starpu_sched_tree *tree, void *arg), void *arg) \ingroup API_Modularized_Scheduler return a recipe to build a composed component with a \p create_component \fn void starpu_sched_component_composed_recipe_add(struct starpu_sched_component_composed_recipe *recipe, struct starpu_sched_component *(*create_component)(struct starpu_sched_tree *tree, void *arg), void *arg) \ingroup API_Modularized_Scheduler add \p create_component under all previous components in recipe \fn void starpu_sched_component_composed_recipe_destroy(struct starpu_sched_component_composed_recipe *) \ingroup API_Modularized_Scheduler destroy composed_sched_component, this should be done after starpu_sched_component_composed_component_create was called \fn struct starpu_sched_component *starpu_sched_component_composed_component_create(struct starpu_sched_tree *tree, struct starpu_sched_component_composed_recipe *recipe) \ingroup API_Modularized_Scheduler create a component that behave as all component of recipe where linked. Except that you cant use starpu_sched_component_is_foo function if recipe contain a single create_foo arg_foo pair, create_foo(arg_foo) is returned instead of a composed component \struct starpu_sched_component_specs \ingroup API_Modularized_Scheduler Define how build a scheduler according to topology. Each level (except for hwloc_machine_composed_sched_component) can be NULL, then the level is just skipped. Bugs everywhere, do not rely on. \var struct starpu_sched_component_composed_recipe *starpu_sched_specs::hwloc_machine_composed_sched_component the composed component to put on the top of the scheduler this member must not be NULL as it is the root of the topology \var struct starpu_sched_component_composed_recipe *starpu_sched_specs::hwloc_component_composed_sched_component the composed component to put for each memory component \var struct starpu_sched_component_composed_recipe *starpu_sched_specs::hwloc_socket_composed_sched_component the composed component to put for each socket \var struct starpu_sched_component_composed_recipe *starpu_sched_specs::hwloc_cache_composed_sched_component the composed component to put for each cache \var struct starpu_sched_component_composed_recipe *(*starpu_sched_specs::worker_composed_sched_component)(enum starpu_worker_archtype archtype) a function that return a starpu_sched_component_composed_recipe to put on top of a worker of type \p archtype. NULL is a valid return value, then no component will be added on top \var starpu_sched_specs::mix_heterogeneous_workers this flag is a dirty hack because of the poor expressivity of this interface. As example, if you want to build a heft component with a fifo component per numa component, and you also have GPUs, if this flag is set, GPUs will share those fifos. If this flag is not set, a new fifo will be built for each of them (if they have the same starpu_perf_arch and the same numa component it will be shared. it indicates if heterogenous workers should be brothers or cousins, as example, if a gpu and a cpu should share or not there numa node \fn struct starpu_sched_tree *starpu_sched_component_make_scheduler(unsigned sched_ctx_id, struct starpu_sched_component_specs s) \ingroup API_Modularized_Scheduler this function build a scheduler for \p sched_ctx_id according to \p s and the hwloc topology of the machine. \fn int starpu_sched_component_push_task(struct starpu_sched_component *from, struct starpu_sched_component *to, struct starpu_task *task) \ingroup API_Modularized_Scheduler Push a task to a component. This is a helper for component->push_task(component, task) plus tracing. \fn struct starpu_task *starpu_sched_component_pull_task(struct starpu_sched_component *from, struct starpu_sched_component *to) \ingroup API_Modularized_Scheduler Pull a task from a component. This is a helper for component->pull_task(component) plus tracing. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/mpi.doxy000066400000000000000000000602021320135501600222440ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_MPI_Support MPI Support @name Initialisation \ingroup API_MPI_Support \def STARPU_USE_MPI \ingroup API_MPI_Support This macro is defined when StarPU has been installed with MPI support. It should be used in your code to detect the availability of MPI. \fn int starpu_mpi_init_comm(int *argc, char ***argv, int initialize_mpi, MPI_Comm comm) \ingroup API_MPI_Support Initializes the starpumpi library with the given communicator. \p initialize_mpi indicates if MPI should be initialized or not by StarPU. If the value is not 0, MPI will be initialized by calling MPI_Init_Thread(argc, argv, MPI_THREAD_SERIALIZED, ...). starpu_init() must be called before starpu_mpi_init_comm(). \fn int starpu_mpi_init(int *argc, char ***argv, int initialize_mpi) \ingroup API_MPI_Support Call starpu_mpi_init_comm() with the MPI communicator MPI_COMM_WORLD. \fn int starpu_mpi_initialize(void) \deprecated \ingroup API_MPI_Support This function has been made deprecated. One should use instead the function starpu_mpi_init(). This function does not call MPI_Init(), it should be called beforehand. \fn int starpu_mpi_initialize_extended(int *rank, int *world_size) \deprecated \ingroup API_MPI_Support This function has been made deprecated. One should use instead the function starpu_mpi_init(). MPI will be initialized by starpumpi by calling MPI_Init_Thread(argc, argv, MPI_THREAD_SERIALIZED, ...). \fn int starpu_mpi_shutdown(void) \ingroup API_MPI_Support Cleans the starpumpi library. This must be called between calling starpu_mpi functions and starpu_shutdown(). MPI_Finalize() will be called if StarPU-MPI has been initialized by starpu_mpi_init(). \fn void starpu_mpi_comm_amounts_retrieve(size_t *comm_amounts) \ingroup API_MPI_Support Retrieve the current amount of communications from the current node in the array \p comm_amounts which must have a size greater or equal to the world size. Communications statistics must be enabled (see \ref STARPU_COMM_STATS). \fn int starpu_mpi_comm_size(MPI_Comm comm, int *size) \ingroup API_MPI_Support Return in \p size the size of the communicator \p comm \fn int starpu_mpi_comm_rank(MPI_Comm comm, int *rank) \ingroup API_MPI_Support Return in \p rank the rank of the calling process in the communicator \p comm \fn int starpu_mpi_world_rank(void) \ingroup API_MPI_Support Return the rank of the calling process in the communicator MPI_COMM_WORLD \fn int starpu_mpi_world_size(void) \ingroup API_MPI_Support Return the size of the communicator MPI_COMM_WORLD @name Communication \anchor MPIPtpCommunication \ingroup API_MPI_Support \fn int starpu_mpi_send(starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm) \ingroup API_MPI_Support Performs a standard-mode, blocking send of \p data_handle to the node \p dest using the message tag \p mpi_tag within the communicator \p comm. \fn int starpu_mpi_recv(starpu_data_handle_t data_handle, int source, int mpi_tag, MPI_Comm comm, MPI_Status *status) \ingroup API_MPI_Support Performs a standard-mode, blocking receive in \p data_handle from the node \p source using the message tag \p mpi_tag within the communicator \p comm. \fn int starpu_mpi_isend(starpu_data_handle_t data_handle, starpu_mpi_req *req, int dest, int mpi_tag, MPI_Comm comm) \ingroup API_MPI_Support Posts a standard-mode, non blocking send of \p data_handle to the node \p dest using the message tag \p mpi_tag within the communicator \p comm. After the call, the pointer to the request \p req can be used to test or to wait for the completion of the communication. \fn int starpu_mpi_irecv(starpu_data_handle_t data_handle, starpu_mpi_req *req, int source, int mpi_tag, MPI_Comm comm) \ingroup API_MPI_Support Posts a nonblocking receive in \p data_handle from the node \p source using the message tag \p mpi_tag within the communicator \p comm. After the call, the pointer to the request \p req can be used to test or to wait for the completion of the communication. \fn int starpu_mpi_isend_detached(starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm, void (*callback)(void *), void *arg) \ingroup API_MPI_Support Posts a standard-mode, non blocking send of \p data_handle to the node \p dest using the message tag \p mpi_tag within the communicator \p comm. On completion, the \p callback function is called with the argument \p arg. Similarly to the pthread detached functionality, when a detached communication completes, its resources are automatically released back to the system, there is no need to test or to wait for the completion of the request. \fn int starpu_mpi_irecv_detached(starpu_data_handle_t data_handle, int source, int mpi_tag, MPI_Comm comm, void (*callback)(void *), void *arg) \ingroup API_MPI_Support Posts a nonblocking receive in \p data_handle from the node \p source using the message tag \p mpi_tag within the communicator \p comm. On completion, the \p callback function is called with the argument \p arg. Similarly to the pthread detached functionality, when a detached communication completes, its resources are automatically released back to the system, there is no need to test or to wait for the completion of the request. \fn int starpu_mpi_irecv_detached_sequential_consistency(starpu_data_handle_t data_handle, int source, int mpi_tag, MPI_Comm comm, void (*callback)(void *), void *arg, int sequential_consistency) \ingroup API_MPI_Support Posts a nonblocking receive in \p data_handle from the node \p source using the message tag \p mpi_tag within the communicator \p comm. On completion, the \p callback function is called with the argument \p arg. The parameter \p sequential_consistency allows to enable or disable the sequential consistency for \p data handle (sequential consistency will be enabled or disabled based on the value of the parameter \p sequential_consistency and the value of the sequential consistency defined for \p data_handle). Similarly to the pthread detached functionality, when a detached communication completes, its resources are automatically released back to the system, there is no need to test or to wait for the completion of the request. \fn int starpu_mpi_issend(starpu_data_handle_t data_handle, starpu_mpi_req *req, int dest, int mpi_tag, MPI_Comm comm) \ingroup API_MPI_Support Performs a synchronous-mode, non-blocking send of \p data_handle to the node \p dest using the message tag \p mpi_tag within the communicator \p comm. \fn int starpu_mpi_issend_detached(starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm, void (*callback)(void *), void *arg) \ingroup API_MPI_Support Performs a synchronous-mode, non-blocking send of \p data_handle to the node \p dest using the message tag \p mpi_tag within the communicator \p comm. On completion, the \p callback function is called with the argument \p arg. Similarly to the pthread detached functionality, when a detached communication completes, its resources are automatically released back to the system, there is no need to test or to wait for the completion of the request. \fn int starpu_mpi_wait(starpu_mpi_req *req, MPI_Status *status) \ingroup API_MPI_Support Returns when the operation identified by request \p req is complete. \fn int starpu_mpi_test(starpu_mpi_req *req, int *flag, MPI_Status *status) \ingroup API_MPI_Support If the operation identified by \p req is complete, set \p flag to 1. The \p status object is set to contain information on the completed operation. \fn int starpu_mpi_barrier(MPI_Comm comm) \ingroup API_MPI_Support Blocks the caller until all group members of the communicator \p comm have called it. \fn int starpu_mpi_wait_for_all(MPI_Comm comm) \ingroup API_MPI_Support Wait until all StarPU tasks and communications for the given communicator are completed. \fn int starpu_mpi_isend_detached_unlock_tag(starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm, starpu_tag_t tag) \ingroup API_MPI_Support Posts a standard-mode, non blocking send of \p data_handle to the node \p dest using the message tag \p mpi_tag within the communicator \p comm. On completion, \p tag is unlocked. \fn int starpu_mpi_irecv_detached_unlock_tag(starpu_data_handle_t data_handle, int source, int mpi_tag, MPI_Comm comm, starpu_tag_t tag) \ingroup API_MPI_Support Posts a nonblocking receive in \p data_handle from the node \p source using the message tag \p mpi_tag within the communicator \p comm. On completion, \p tag is unlocked. \fn int starpu_mpi_isend_array_detached_unlock_tag(unsigned array_size, starpu_data_handle_t *data_handle, int *dest, int *mpi_tag, MPI_Comm *comm, starpu_tag_t tag) \ingroup API_MPI_Support Posts \p array_size standard-mode, non blocking send. Each post sends the n-th data of the array \p data_handle to the n-th node of the array \p dest using the n-th message tag of the array \p mpi_tag within the n-th communicator of the array \p comm. On completion of the all the requests, \p tag is unlocked. \fn int starpu_mpi_irecv_array_detached_unlock_tag(unsigned array_size, starpu_data_handle_t *data_handle, int *source, int *mpi_tag, MPI_Comm *comm, starpu_tag_t tag) \ingroup API_MPI_Support Posts \p array_size nonblocking receive. Each post receives in the n-th data of the array \p data_handle from the n-th node of the array \p source using the n-th message tag of the array \p mpi_tag within the n-th communicator of the array \p comm. On completion of the all the requests, \p tag is unlocked. \fn int starpu_mpi_get_communication_tag(void) \ingroup API_MPI_Support todo \fn void starpu_mpi_set_communication_tag(int tag) \ingroup API_MPI_Support todo \fn int starpu_mpi_datatype_register(starpu_data_handle_t handle, starpu_mpi_datatype_allocate_func_t allocate_datatype_func, starpu_mpi_datatype_free_func_t free_datatype_func) \ingroup API_MPI_Support Register functions to create and free a MPI datatype for the given handle. It is important that the function is called before any communication can take place for a data with the given handle. See \ref ExchangingUserDefinedDataInterface for an example. \fn int starpu_mpi_datatype_unregister(starpu_data_handle_t handle); \ingroup API_MPI_Support Unregister the MPI datatype functions stored for the interface of the given handle. \def STARPU_MPI_TAG_UB \ingroup API_MPI_Support When given to the function starpu_mpi_comm_get_attr(), retrieve the value for the upper bound for tag value. \fn int starpu_mpi_comm_get_attr(MPI_Comm comm, int keyval, void *attribute_val, int *flag); \ingroup API_MPI_Support Retrieve an attribute value by key, similarly to the MPI function \c MPI_comm_get_attr(). If an attribute is attached on \p comm to \p keyval, then the call returns \p flag equal to \c 1, and the attribute value in \p attribute_val. Otherwise, \p flag is set to \0. @name Communication Cache \ingroup API_MPI_Support \fn int starpu_mpi_cache_is_enabled() \ingroup API_MPI_Support Return 1 if the communication cache is enabled, 0 otherwise \fn int starpu_mpi_cache_set(int enabled) \ingroup API_MPI_Support If \p enabled is 1, enable the communication cache. Otherwise, clean the cache if it was enabled and disable it. \fn void starpu_mpi_cache_flush(MPI_Comm comm, starpu_data_handle_t data_handle) \ingroup API_MPI_Support Clear the send and receive communication cache for the data \p data_handle and invalidate the value. The function has to be called at the same point of task graph submission by all the MPI nodes on which the handle was registered. The function does nothing if the cache mechanism is disabled (see \ref STARPU_MPI_CACHE). \fn void starpu_mpi_cache_flush_all_data(MPI_Comm comm) \ingroup API_MPI_Support Clear the send and receive communication cache for all data and invalidate their values. The function has to be called at the same point of task graph submission by all the MPI nodes. The function does nothing if the cache mechanism is disabled (see \ref STARPU_MPI_CACHE). \fn int starpu_mpi_cached_receive(starpu_data_handle_t data_handle); \ingroup API_MPI_Support Test whether \p data_handle is cached for reception, i.e. the value was previously received from the owner node, and not flushed since then. \fn int starpu_mpi_cached_send(starpu_data_handle_t data_handle, int dest); \ingroup API_MPI_Support Test whether \p data_handle is cached for emission to node \p dest , i.e. the value was previously sent to \p dest, and not flushed since then. @name MPI Insert Task \anchor MPIInsertTask \ingroup API_MPI_Support \fn void starpu_mpi_data_register_comm(starpu_data_handle_t data_handle, int tag, int rank, MPI_Comm comm) \ingroup API_MPI_Support Register to MPI a StarPU data handle with the given tag, rank and MPI communicator. It also automatically clears the MPI communication cache when unregistering the data. \def starpu_mpi_data_register(data_handle, tag, rank) \ingroup API_MPI_Support Register to MPI a StarPU data handle with the given tag, rank and the MPI communicator MPI_COMM_WORLD. It also automatically clears the MPI communication cache when unregistering the data. \fn void starpu_mpi_data_set_tag(starpu_data_handle_t handle, int tag) \ingroup API_MPI_Support Register to MPI a StarPU data handle with the given tag. No rank will be defined. It also automatically clears the MPI communication cache when unregistering the data. \def starpu_data_set_tag \ingroup API_MPI_Support Symbol kept for backward compatibility. Calling function starpu_mpi_data_set_tag \fn void starpu_mpi_data_set_rank_comm(starpu_data_handle_t handle, int rank, MPI_Comm comm) \ingroup API_MPI_Support Register to MPI a StarPU data handle with the given rank and given communicator. No tag will be defined. It also automatically clears the MPI communication cache when unregistering the data. \def starpu_mpi_data_set_rank \ingroup API_MPI_Support Register to MPI a StarPU data handle with the given rank and the MPI communicator MPI_COMM_WORLD. No tag will be defined. It also automatically clears the MPI communication cache when unregistering the data. Symbol kept for backward compatibility. Calling function starpu_mpi_data_set_rank \def starpu_data_set_rank \ingroup API_MPI_Support Register to MPI a StarPU data handle with the given rank and the MPI communicator MPI_COMM_WORLD. No tag will be defined. It also automatically clears the MPI communication cache when unregistering the data. Symbol kept for backward compatibility. Calling function starpu_mpi_data_set_rank \fn int starpu_mpi_data_get_rank(starpu_data_handle_t handle) \ingroup API_MPI_Support Return the rank of the given data. \def starpu_data_get_rank(starpu_data_handle_t handle) \ingroup API_MPI_Support Return the rank of the given data. Symbol kept for backward compatibility. Calling function starpu_mpi_data_get_rank \fn int starpu_mpi_data_get_tag(starpu_data_handle_t handle) \ingroup API_MPI_Support Return the tag of the given data. \def starpu_data_get_tag(starpu_data_handle_t handle) \ingroup API_MPI_Support Return the tag of the given data. Symbol kept for backward compatibility. Calling function starpu_mpi_data_get_tag \def STARPU_MPI_PER_NODE \ingroup API_MPI_Support Can be used as rank when calling starpu_mpi_data_register() and alike, to specify that the data is per-node: each node will have its own value. Tasks writing to such data will be replicated on all nodes (and all parameters then have to be per-node). Tasks not writing to such data will just take the node-local value without any MPI communication. \fn void starpu_mpi_data_migrate(MPI_Comm comm, starpu_data_handle_t handle, int new_rank) \ingroup API_MPI_Support Migrate the data onto the \p new_rank MPI node. This means both transferring the data to node \p new_rank if it hasn't been transferred already, and setting the home node of the data to the new node. Further data transfers triggered by starpu_mpi_task_insert() will be done from that new node. This function thus needs to be called on all nodes which have registered the data. This also flushes the cache for this data to avoid incoherencies. \def STARPU_EXECUTE_ON_NODE \ingroup API_MPI_Support this macro is used when calling starpu_mpi_task_insert(), and must be followed by a integer value which specified the node on which to execute the codelet. \def STARPU_EXECUTE_ON_DATA \ingroup API_MPI_Support this macro is used when calling starpu_mpi_task_insert(), and must be followed by a data handle to specify that the node owning the given data will execute the codelet. \def STARPU_NODE_SELECTION_POLICY \ingroup API_MPI_Support this macro is used when calling starpu_mpi_task_insert(), and must be followed by a identifier to a node selection policy. This is needed when several nodes own data in ::STARPU_W mode. \fn int starpu_mpi_insert_task(MPI_Comm comm, struct starpu_codelet *codelet, ...) \ingroup API_MPI_Support This function does the same as the function starpu_mpi_task_insert(). It has been kept to avoid breaking old codes. \fn int starpu_mpi_task_insert(MPI_Comm comm, struct starpu_codelet *codelet, ...) \ingroup API_MPI_Support Create and submit a task corresponding to codelet with the following arguments. The argument list must be zero-terminated. The arguments following the codelet are the same types as for the function starpu_task_insert(). Access modes for data can also be set with ::STARPU_SSEND to specify the data has to be sent using a synchronous and non-blocking mode (see starpu_mpi_issend()). The extra argument ::STARPU_EXECUTE_ON_NODE followed by an integer allows to specify the MPI node to execute the codelet. It is also possible to specify that the node owning a specific data will execute the codelet, by using ::STARPU_EXECUTE_ON_DATA followed by a data handle. The internal algorithm is as follows:
    1. Find out which MPI node is going to execute the codelet.
      • If there is only one node owning data in ::STARPU_W mode, it will be selected;
      • If there is several nodes owning data in ::STARPU_W mode, a node will be selected according to a given node selection policy (see ::STARPU_NODE_SELECTION_POLICY or starpu_mpi_node_selection_set_current_policy())
      • The argument ::STARPU_EXECUTE_ON_NODE followed by an integer can be used to specify the node;
      • The argument ::STARPU_EXECUTE_ON_DATA followed by a data handle can be used to specify that the node owing the given data will execute the codelet.
    2. Send and receive data as requested. Nodes owning data which need to be read by the task are sending them to the MPI node which will execute it. The latter receives them.
    3. Execute the codelet. This is done by the MPI node selected in the 1st step of the algorithm.
    4. If several MPI nodes own data to be written to, send written data back to their owners.
    The algorithm also includes a communication cache mechanism that allows not to send data twice to the same MPI node, unless the data has been modified. The cache can be disabled (see \ref STARPU_MPI_CACHE). \fn struct starpu_task *starpu_mpi_task_build(MPI_Comm comm, struct starpu_codelet *codelet, ...) \ingroup API_MPI_Support Create a task corresponding to codelet with the following arguments. The argument list must be zero-terminated. The function performs the first two steps of the function starpu_mpi_task_insert(). Only the MPI node selected in the first step of the algorithm will return a valid task structure which can then be submitted, others will return NULL. The function starpu_mpi_task_post_build() MUST be called after that on all nodes, and after the submission of the task on the node which creates it, with the SAME list of arguments. \fn int starpu_mpi_task_post_build(MPI_Comm comm, struct starpu_codelet *codelet, ...) \ingroup API_MPI_Support This function MUST be called after a call to starpu_mpi_task_build(), with the SAME list of arguments. It performs the fourth -- last -- step of the algorithm described in starpu_mpi_task_insert(). \fn void starpu_mpi_get_data_on_node(MPI_Comm comm, starpu_data_handle_t data_handle, int node) \ingroup API_MPI_Support Transfer data \p data_handle to MPI node \p node, sending it from its owner if needed. At least the target node and the owner have to call the function. \fn void starpu_mpi_get_data_on_node_detached(MPI_Comm comm, starpu_data_handle_t data_handle, int node, void (*callback)(void*), void *arg) \ingroup API_MPI_Support Transfer data \p data_handle to MPI node \p node, sending it from its owner if needed. At least the target node and the owner have to call the function. On reception, the \p callback function is called with the argument \p arg. \fn void starpu_mpi_get_data_on_all_nodes_detached(MPI_Comm comm, starpu_data_handle_t data_handle) \ingroup API_MPI_Support Transfer data \p data_handle to all MPI nodes, sending it from its owner if needed. All nodes have to call the function. @name Node Selection Policy \anchor MPINodeSelectionPolicy \ingroup API_MPI_Support \fn int starpu_mpi_node_selection_get_current_policy() \ingroup API_MPI_Support Return the current policy used to select the node which will execute the codelet \fn int starpu_mpi_node_selection_set_current_policy(int policy) \ingroup API_MPI_Support Set the current policy used to select the node which will execute the codelet. The policy STARPU_MPI_NODE_SELECTION_MOST_R_DATA selects the node having the most data in R mode so as to minimize the amount of data to be transfered. \fn int starpu_mpi_node_selection_register_policy(starpu_mpi_select_node_policy_func_t policy_func) \ingroup API_MPI_Support Register a new policy which can then be used when there is several nodes owning data in W mode. Here an example of function defining a node selection policy. The codelet will be executed on the node owing the first data with a size bigger than 1M, or on the node 0 if no data fits the given size. \code{.c} int my_node_selection_policy(int me, int nb_nodes, struct starpu_data_descr *descr, int nb_data) { // me is the current MPI rank // nb_nodes is the number of MPI nodes // descr is the description of the data specified when calling starpu_mpi_task_insert // nb_data is the number of data in descr int i; for(i= 0 ; i 1024*1024) return rank; } } return 0; } \endcode \fn int starpu_mpi_node_selection_unregister_policy(int policy) \ingroup API_MPI_Support Unregister a previously registered policy. @name Collective Operations \anchor MPICollectiveOperations \ingroup API_MPI_Support \fn void starpu_mpi_redux_data(MPI_Comm comm, starpu_data_handle_t data_handle) \ingroup API_MPI_Support Perform a reduction on the given data. All nodes send the data to its owner node which will perform a reduction. \fn int starpu_mpi_scatter_detached(starpu_data_handle_t *data_handles, int count, int root, MPI_Comm comm, void (*scallback)(void *), void *sarg, void (*rcallback)(void *), void *rarg) \ingroup API_MPI_Support Scatter data among processes of the communicator based on the ownership of the data. For each data of the array \p data_handles, the process \p root sends the data to the process owning this data. Processes receiving data must have valid data handles to receive them. On completion of the collective communication, the \p scallback function is called with the argument \p sarg on the process \p root, the \p rcallback function is called with the argument \p rarg on any other process. \fn int starpu_mpi_gather_detached(starpu_data_handle_t *data_handles, int count, int root, MPI_Comm comm, void (*scallback)(void *), void *sarg, void (*rcallback)(void *), void *rarg) \ingroup API_MPI_Support Gather data from the different processes of the communicator onto the process \p root. Each process owning data handle in the array \p data_handles will send them to the process \p root. The process \p root must have valid data handles to receive the data. On completion of the collective communication, the \p rcallback function is called with the argument \p rarg on the process root, the \p scallback function is called with the argument \p sarg on any other process. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/multiformat_data_interface.doxy000066400000000000000000000066611320135501600270440ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Multiformat_Data_Interface Multiformat Data Interface \struct starpu_multiformat_data_interface_ops \ingroup API_Multiformat_Data_Interface The different fields are: \var size_t starpu_multiformat_data_interface_ops::cpu_elemsize the size of each element on CPUs \var size_t starpu_multiformat_data_interface_ops::opencl_elemsize the size of each element on OpenCL devices \var struct starpu_codelet *starpu_multiformat_data_interface_ops::cpu_to_opencl_cl pointer to a codelet which converts from CPU to OpenCL \var struct starpu_codelet *starpu_multiformat_data_interface_ops::opencl_to_cpu_cl pointer to a codelet which converts from OpenCL to CPU \var size_t starpu_multiformat_data_interface_ops::cuda_elemsize the size of each element on CUDA devices \var struct starpu_codelet *starpu_multiformat_data_interface_ops::cpu_to_cuda_cl pointer to a codelet which converts from CPU to CUDA \var struct starpu_codelet *starpu_multiformat_data_interface_ops::cuda_to_cpu_cl pointer to a codelet which converts from CUDA to CPU \var size_t starpu_multiformat_data_interface_ops::mic_elemsize the size of each element on MIC devices \var struct starpu_codelet *starpu_multiformat_data_interface_ops::cpu_to_mic_cl pointer to a codelet which converts from CPU to MIC \var struct starpu_codelet *starpu_multiformat_data_interface_ops::mic_to_cpu_cl pointer to a codelet which converts from MIC to CPU \struct starpu_multiformat_interface todo \ingroup API_Multiformat_Data_Interface \var enum starpu_data_interface_id starpu_multiformat_interface::id \var void *starpu_multiformat_interface::cpu_ptr \var void *starpu_multiformat_interface::cuda_ptr \var void *starpu_multiformat_interface::opencl_ptr \var void *starpu_multiformat_interface::mic_ptr \var uint32_t starpu_multiformat_interface::nx \var struct starpu_multiformat_data_interface_ops *starpu_multiformat_interface::ops \fn void starpu_multiformat_data_register(starpu_data_handle_t *handle, int home_node, void *ptr, uint32_t nobjects, struct starpu_multiformat_data_interface_ops *format_ops) \ingroup API_Multiformat_Data_Interface Register a piece of data that can be represented in different ways, depending upon the processing unit that manipulates it. It allows the programmer, for instance, to use an array of structures when working on a CPU, and a structure of arrays when working on a GPU. \p nobjects is the number of elements in the data. \p format_ops describes the format. \def STARPU_MULTIFORMAT_GET_CPU_PTR(interface) \ingroup API_Multiformat_Data_Interface returns the local pointer to the data with CPU format. \def STARPU_MULTIFORMAT_GET_CUDA_PTR(interface) \ingroup API_Multiformat_Data_Interface returns the local pointer to the data with CUDA format. \def STARPU_MULTIFORMAT_GET_OPENCL_PTR(interface) \ingroup API_Multiformat_Data_Interface returns the local pointer to the data with OpenCL format. \def STARPU_MULTIFORMAT_GET_MIC_PTR(interface) \ingroup API_Multiformat_Data_Interface returns the local pointer to the data with MIC format. \def STARPU_MULTIFORMAT_GET_NX(interface) \ingroup API_Multiformat_Data_Interface returns the number of elements in the data. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/opencl_extensions.doxy000066400000000000000000000302621320135501600252210ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_OpenCL_Extensions OpenCL Extensions \def STARPU_USE_OPENCL \ingroup API_OpenCL_Extensions This macro is defined when StarPU has been installed with OpenCL support. It should be used in your code to detect the availability of OpenCL as shown in \ref FullSourceCodeVectorScal. \def STARPU_MAXOPENCLDEVS \ingroup API_OpenCL_Extensions This macro defines the maximum number of OpenCL devices that are supported by StarPU. \def STARPU_OPENCL_DATADIR \ingroup API_OpenCL_Extensions This macro defines the directory in which the OpenCL codelets of the applications provided with StarPU have been installed. \struct starpu_opencl_program \ingroup API_OpenCL_Extensions Stores the OpenCL programs as compiled for the different OpenCL devices. \var cl_program starpu_opencl_program::programs[STARPU_MAXOPENCLDEVS] Stores each program for each OpenCL device. @name Writing OpenCL kernels \ingroup API_OpenCL_Extensions \fn void starpu_opencl_get_context(int devid, cl_context *context) \ingroup API_OpenCL_Extensions Places the OpenCL context of the device designated by \p devid into \p context. \fn void starpu_opencl_get_device(int devid, cl_device_id *device) \ingroup API_OpenCL_Extensions Places the cl_device_id corresponding to \p devid in \p device. \fn void starpu_opencl_get_queue(int devid, cl_command_queue *queue) \ingroup API_OpenCL_Extensions Places the command queue of the device designated by \p devid into \p queue. \fn void starpu_opencl_get_current_context(cl_context *context) \ingroup API_OpenCL_Extensions Return the context of the current worker. \fn void starpu_opencl_get_current_queue(cl_command_queue *queue) \ingroup API_OpenCL_Extensions Return the computation kernel command queue of the current worker. \fn int starpu_opencl_set_kernel_args(cl_int *err, cl_kernel *kernel, ...) \ingroup API_OpenCL_Extensions Sets the arguments of a given kernel. The list of arguments must be given as (size_t size_of_the_argument, cl_mem * pointer_to_the_argument). The last argument must be 0. Returns the number of arguments that were successfully set. In case of failure, returns the id of the argument that could not be set and err is set to the error returned by OpenCL. Otherwise, returns the number of arguments that were set. Here an example: \code{.c} int n; cl_int err; cl_kernel kernel; n = starpu_opencl_set_kernel_args(&err, 2, &kernel, sizeof(foo), &foo, sizeof(bar), &bar, 0); if (n != 2) fprintf(stderr, "Error : %d\n", err); \endcode @name Compiling OpenCL kernels \ingroup API_OpenCL_Extensions Source codes for OpenCL kernels can be stored in a file or in a string. StarPU provides functions to build the program executable for each available OpenCL device as a cl_program object. This program executable can then be loaded within a specific queue as explained in the next section. These are only helpers, Applications can also fill a starpu_opencl_program array by hand for more advanced use (e.g. different programs on the different OpenCL devices, for relocation purpose for instance). \fn int starpu_opencl_load_opencl_from_file(const char *source_file_name, struct starpu_opencl_program *opencl_programs, const char *build_options) \ingroup API_OpenCL_Extensions This function compiles an OpenCL source code stored in a file. \fn int starpu_opencl_load_opencl_from_string(const char *opencl_program_source, struct starpu_opencl_program *opencl_programs, const char *build_options) \ingroup API_OpenCL_Extensions This function compiles an OpenCL source code stored in a string. \fn int starpu_opencl_unload_opencl(struct starpu_opencl_program *opencl_programs) \ingroup API_OpenCL_Extensions This function unloads an OpenCL compiled code. \fn void starpu_opencl_load_program_source(const char *source_file_name, char *located_file_name, char *located_dir_name, char *opencl_program_source) \ingroup API_OpenCL_Extensions Store the contents of the file \p source_file_name in the buffer \p opencl_program_source. The file \p source_file_name can be located in the current directory, or in the directory specified by the environment variable \ref STARPU_OPENCL_PROGRAM_DIR, or in the directory share/starpu/opencl of the installation directory of StarPU, or in the source directory of StarPU. When the file is found, \p located_file_name is the full name of the file as it has been located on the system, \p located_dir_name the directory where it has been located. Otherwise, they are both set to the empty string. \fn void starpu_opencl_load_program_source_malloc(const char *source_file_name, char **located_file_name, char **located_dir_name, char **opencl_program_source) \ingroup API_OpenCL_Extensions Similar to function starpu_opencl_load_program_source() but it allocates the buffers located_file_name, located_dir_name and opencl_program_source. \fn int starpu_opencl_compile_opencl_from_file(const char *source_file_name, const char *build_options) \ingroup API_OpenCL_Extensions Compile the OpenCL kernel stored in the file \p source_file_name with the given options \p build_options and stores the result in the directory $STARPU_HOME/.starpu/opencl with the same filename as \p source_file_name. The compilation is done for every OpenCL device, and the filename is suffixed with the vendor id and the device id of the OpenCL device. \fn int starpu_opencl_compile_opencl_from_string(const char *opencl_program_source, const char *file_name, const char *build_options) \ingroup API_OpenCL_Extensions Compile the OpenCL kernel in the string \p opencl_program_source with the given options \p build_options and stores the result in the directory $STARPU_HOME/.starpu/opencl with the filename \p file_name. The compilation is done for every OpenCL device, and the filename is suffixed with the vendor id and the device id of the OpenCL device. \fn int starpu_opencl_load_binary_opencl(const char *kernel_id, struct starpu_opencl_program *opencl_programs) \ingroup API_OpenCL_Extensions Compile the binary OpenCL kernel identified with \p kernel_id. For every OpenCL device, the binary OpenCL kernel will be loaded from the file $STARPU_HOME/.starpu/opencl/\.\.vendor_id_\_device_id_\. @name Loading OpenCL kernels \ingroup API_OpenCL_Extensions \fn int starpu_opencl_load_kernel(cl_kernel *kernel, cl_command_queue *queue, struct starpu_opencl_program *opencl_programs, const char *kernel_name, int devid) \ingroup API_OpenCL_Extensions Create a kernel \p kernel for device \p devid, on its computation command queue returned in \p queue, using program \p opencl_programs and name \p kernel_name. \fn int starpu_opencl_release_kernel(cl_kernel kernel) \ingroup API_OpenCL_Extensions Release the given \p kernel, to be called after kernel execution. @name OpenCL statistics \fn int starpu_opencl_collect_stats(cl_event event) \ingroup API_OpenCL_Extensions This function allows to collect statistics on a kernel execution. After termination of the kernels, the OpenCL codelet should call this function to pass it the even returned by clEnqueueNDRangeKernel, to let StarPU collect statistics about the kernel execution (used cycles, consumed energy). @name OpenCL utilities \ingroup API_OpenCL_Extensions \fn const char *starpu_opencl_error_string(cl_int status) \ingroup API_OpenCL_Extensions Return the error message in English corresponding to \p status, an OpenCL error code. \fn void starpu_opencl_display_error(const char *func, const char *file, int line, const char *msg, cl_int status) \ingroup API_OpenCL_Extensions Given a valid error status, prints the corresponding error message on stdout, along with the given function name \p func, the given filename \p file, the given line number \p line and the given message \p msg. \def STARPU_OPENCL_DISPLAY_ERROR(status) \ingroup API_OpenCL_Extensions Call the function starpu_opencl_display_error() with the given error \p status, the current function name, current file and line number, and a empty message. \fn void starpu_opencl_report_error(const char *func, const char *file, int line, const char *msg, cl_int status) \ingroup API_OpenCL_Extensions Call the function starpu_opencl_display_error() and abort. \def STARPU_OPENCL_REPORT_ERROR(status) \ingroup API_OpenCL_Extensions Call the function starpu_opencl_report_error() with the given error \p status, with the current function name, current file and line number, and a empty message. \def STARPU_OPENCL_REPORT_ERROR_WITH_MSG(msg, status) \ingroup API_OpenCL_Extensions Call the function starpu_opencl_report_error() with the given \p msg and the given error \p status, with the current function name, current file and line number. \fn cl_int starpu_opencl_allocate_memory(int devid, cl_mem *addr, size_t size, cl_mem_flags flags) \ingroup API_OpenCL_Extensions Allocate \p size bytes of memory, stored in \p addr. \p flags must be a valid combination of cl_mem_flags values. \fn cl_int starpu_opencl_copy_ram_to_opencl(void *ptr, unsigned src_node, cl_mem buffer, unsigned dst_node, size_t size, size_t offset, cl_event *event, int *ret) \ingroup API_OpenCL_Extensions Copy \p size bytes from the given \p ptr on RAM \p src_node to the given \p buffer on OpenCL \p dst_node. \p offset is the offset, in bytes, in \p buffer. if \p event is NULL, the copy is synchronous, i.e the queue is synchronised before returning. If not NULL, \p event can be used after the call to wait for this particular copy to complete. This function returns CL_SUCCESS if the copy was successful, or a valid OpenCL error code otherwise. The integer pointed to by \p ret is set to -EAGAIN if the asynchronous launch was successful, or to 0 if \p event was NULL. \fn cl_int starpu_opencl_copy_opencl_to_ram(cl_mem buffer, unsigned src_node, void *ptr, unsigned dst_node, size_t size, size_t offset, cl_event *event, int *ret) \ingroup API_OpenCL_Extensions Copy \p size bytes asynchronously from the given \p buffer on OpenCL \p src_node to the given \p ptr on RAM \p dst_node. \p offset is the offset, in bytes, in \p buffer. if \p event is NULL, the copy is synchronous, i.e the queue is synchronised before returning. If not NULL, \p event can be used after the call to wait for this particular copy to complete. This function returns CL_SUCCESS if the copy was successful, or a valid OpenCL error code otherwise. The integer pointed to by \p ret is set to -EAGAIN if the asynchronous launch was successful, or to 0 if \p event was NULL. \fn cl_int starpu_opencl_copy_opencl_to_opencl(cl_mem src, unsigned src_node, size_t src_offset, cl_mem dst, unsigned dst_node, size_t dst_offset, size_t size, cl_event *event, int *ret) \ingroup API_OpenCL_Extensions Copy \p size bytes asynchronously from byte offset \p src_offset of \p src on OpenCL \p src_node to byte offset \p dst_offset of \p dst on OpenCL \p dst_node. if \p event is NULL, the copy is synchronous, i.e. the queue is synchronised before returning. If not NULL, \p event can be used after the call to wait for this particular copy to complete. This function returns CL_SUCCESS if the copy was successful, or a valid OpenCL error code otherwise. The integer pointed to by \p ret is set to -EAGAIN if the asynchronous launch was successful, or to 0 if \p event was NULL. \fn cl_int starpu_opencl_copy_async_sync(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, cl_event *event) \ingroup API_OpenCL_Extensions Copy \p size bytes from byte offset \p src_offset of \p src on \p src_node to byte offset \p dst_offset of \p dst on \p dst_node. if \p event is NULL, the copy is synchronous, i.e. the queue is synchronised before returning. If not NULL, \p event can be used after the call to wait for this particular copy to complete. The function returns -EAGAIN if the asynchronous launch was successfull. It returns 0 if the synchronous copy was successful, or fails otherwise. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/openmp_runtime_support.doxy000066400000000000000000001105651320135501600263240ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2014 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_OpenMP_Runtime_Support OpenMP Runtime Support \brief This section describes the interface provided for implementing OpenMP runtimes on top of StarPU. \struct starpu_omp_lock_t \ingroup API_OpenMP_Runtime_Support Opaque Simple Lock object (\ref SimpleLock) for inter-task synchronization operations. \sa starpu_omp_init_lock() \sa starpu_omp_destroy_lock() \sa starpu_omp_set_lock() \sa starpu_omp_unset_lock() \sa starpu_omp_test_lock() \var starpu_omp_lock_t::internal Is an opaque pointer for internal use. \struct starpu_omp_nest_lock_t \ingroup API_OpenMP_Runtime_Support Opaque Nestable Lock object (\ref NestableLock) for inter-task synchronization operations. \sa starpu_omp_init_nest_lock() \sa starpu_omp_destroy_nest_lock() \sa starpu_omp_set_nest_lock() \sa starpu_omp_unset_nest_lock() \sa starpu_omp_test_nest_lock() \var starpu_omp_nest_lock_t::internal Is an opaque pointer for internal use. \enum starpu_omp_sched_value \ingroup API_OpenMP_Runtime_Support Set of constants for selecting the for loop iteration scheduling algorithm (\ref OMPFor) as defined by the OpenMP specification. \var starpu_omp_sched_value::starpu_omp_sched_undefined \ingroup API_OpenMP_Runtime_Support Undefined iteration scheduling algorithm. \var starpu_omp_sched_value::starpu_omp_sched_static \ingroup API_OpenMP_Runtime_Support \b Static iteration scheduling algorithm. \var starpu_omp_sched_value::starpu_omp_sched_dynamic \ingroup API_OpenMP_Runtime_Support \b Dynamic iteration scheduling algorithm. \var starpu_omp_sched_value::starpu_omp_sched_guided \ingroup API_OpenMP_Runtime_Support \b Guided iteration scheduling algorithm. \var starpu_omp_sched_value::starpu_omp_sched_auto \ingroup API_OpenMP_Runtime_Support \b Automatically choosen iteration scheduling algorithm. \var starpu_omp_sched_value::starpu_omp_sched_runtime \ingroup API_OpenMP_Runtime_Support Choice of iteration scheduling algorithm deferred at \b runtime. \sa starpu_omp_for() \sa starpu_omp_for_inline_first() \sa starpu_omp_for_inline_next() \sa starpu_omp_for_alt() \sa starpu_omp_for_inline_first_alt() \sa starpu_omp_for_inline_next_alt() \enum starpu_omp_proc_bind_value \ingroup API_OpenMP_Runtime_Support Set of constants for selecting the processor binding method, as defined in the OpenMP specification. \var starpu_omp_proc_bind_value::starpu_omp_proc_bind_undefined \ingroup API_OpenMP_Runtime_Support Undefined processor binding method. \var starpu_omp_proc_bind_value::starpu_omp_proc_bind_false \ingroup API_OpenMP_Runtime_Support Team threads may be moved between places at any time. \var starpu_omp_proc_bind_value::starpu_omp_proc_bind_true \ingroup API_OpenMP_Runtime_Support Team threads may not be moved between places. \var starpu_omp_proc_bind_value::starpu_omp_proc_bind_master \ingroup API_OpenMP_Runtime_Support Assign every thread in the team to the same place as the \b master thread. \var starpu_omp_proc_bind_value::starpu_omp_proc_bind_close \ingroup API_OpenMP_Runtime_Support Assign every thread in the team to a place \b close to the parent thread. \var starpu_omp_proc_bind_value::starpu_omp_proc_bind_spread \ingroup API_OpenMP_Runtime_Support Assign team threads as a sparse distribution over the selected places. \sa starpu_omp_get_proc_bind() \struct starpu_omp_parallel_region_attr \ingroup API_OpenMP_Runtime_Support Set of attributes used for creating a new parallel region. \sa starpu_omp_parallel_region() \var struct starpu_codelet starpu_omp_parallel_region_attr::cl Is a ::starpu_codelet (\ref API_Codelet_And_Tasks) to use for the parallel region implicit tasks. The codelet must provide a CPU implementation function. \var starpu_data_handle_t *starpu_omp_parallel_region_attr::handles Is an array of zero or more ::starpu_data_handle_t data handle to be passed to the parallel region implicit tasks. \var void *starpu_omp_parallel_region_attr::cl_arg Is an optional pointer to an inline argument to be passed to the region implicit tasks. \var size_t starpu_omp_parallel_region_attr::cl_arg_size Is the size of the optional inline argument to be passed to the region implicit tasks, or 0 if unused. \var unsigned starpu_omp_parallel_region_attr::cl_arg_free Is a boolean indicating whether the optional inline argument should be automatically freed (true), or not (false). \var int starpu_omp_parallel_region_attr::if_clause Is a boolean indicating whether the \b if clause of the corresponding pragma omp parallel is true or false. \var int starpu_omp_parallel_region_attr::num_threads Is an integer indicating the requested number of threads in the team of the newly created parallel region, or 0 to let the runtime choose the number of threads alone. This attribute may be ignored by the runtime system if the requested number of threads is higher than the number of threads that the runtime can create. \struct starpu_omp_task_region_attr \ingroup API_OpenMP_Runtime_Support Set of attributes used for creating a new task region. \sa starpu_omp_task_region() \var struct starpu_codelet starpu_omp_task_region_attr::cl Is a ::starpu_codelet (\ref API_Codelet_And_Tasks) to use for the task region explicit task. The codelet must provide a CPU implementation function or an accelerator implementation for offloaded target regions. \var starpu_data_handle_t *starpu_omp_task_region_attr::handles Is an array of zero or more ::starpu_data_handle_t data handle to be passed to the task region explicit tasks. \var void *starpu_omp_task_region_attr::cl_arg Is an optional pointer to an inline argument to be passed to the region implicit tasks. \var size_t starpu_omp_task_region_attr::cl_arg_size Is the size of the optional inline argument to be passed to the region implicit tasks, or 0 if unused. \var unsigned starpu_omp_task_region_attr::cl_arg_free Is a boolean indicating whether the optional inline argument should be automatically freed (true), or not (false). \var int starpu_omp_task_region_attr::if_clause Is a boolean indicating whether the \b if clause of the corresponding pragma omp task is true or false. \var int starpu_omp_task_region_attr::final_clause Is a boolean indicating whether the \b final clause of the corresponding pragma omp task is true or false. \var int starpu_omp_task_region_attr::untied_clause Is a boolean indicating whether the \b untied clause of the corresponding pragma omp task is true or false. \var int starpu_omp_task_region_attr::mergeable_clause Is a boolean indicating whether the \b mergeable clause of the corresponding pragma omp task is true or false. @name Initialisation \ingroup API_OpenMP_Runtime_Support \def STARPU_OPENMP \ingroup API_OpenMP_Runtime_Support This macro is defined when StarPU has been installed with OpenMP Runtime support. It should be used in your code to detect the availability of the runtime support for OpenMP. \fn int starpu_omp_init(void) \ingroup API_OpenMP_Runtime_Support Initializes StarPU and its OpenMP Runtime support. \fn void starpu_omp_shutdown(void) \ingroup API_OpenMP_Runtime_Support Shutdown StarPU and its OpenMP Runtime support. @name Parallel \anchor ORS_Parallel \ingroup API_OpenMP_Runtime_Support \fn void starpu_omp_parallel_region(const struct starpu_omp_parallel_region_attr *attr) \ingroup API_OpenMP_Runtime_Support Generates and launch an OpenMP parallel region and return after its completion. \p attr specifies the attributes for the generated parallel region. If this function is called from inside another, generating, parallel region, the generated parallel region is nested within the generating parallel region. This function can be used to implement \#pragma omp parallel. \fn void starpu_omp_master(void (*f)(void *arg), void *arg) \ingroup API_OpenMP_Runtime_Support Executes a function only on the master thread of the OpenMP parallel region it is called from. When called from a thread that is not the master of the parallel region it is called from, this function does nothing. \p f is the function to be called. \p arg is an argument passed to function \p f. This function can be used to implement \#pragma omp master. \fn int starpu_omp_master_inline(void) \ingroup API_OpenMP_Runtime_Support Determines whether the calling thread is the master of the OpenMP parallel region it is called from or not. This function can be used to implement \#pragma omp master without code outlining. \return !0 if called by the region's master thread. \return 0 if not called by the region's master thread. @name Synchronization \anchor ORS_Synchronization \ingroup API_OpenMP_Runtime_Support \fn void starpu_omp_barrier(void) \ingroup API_OpenMP_Runtime_Support Waits until each participating thread of the innermost OpenMP parallel region has reached the barrier and each explicit OpenMP task bound to this region has completed its execution. This function can be used to implement \#pragma omp barrier. \fn void starpu_omp_critical(void (*f)(void *arg), void *arg, const char *name) \ingroup API_OpenMP_Runtime_Support Waits until no other thread is executing within the context of the selected critical section, then proceeds to the exclusive execution of a function within the critical section. \p f is the function to be executed in the critical section. \p arg is an argument passed to function \p f. \p name is the name of the selected critical section. If name == NULL, the selected critical section is the unique anonymous critical section. This function can be used to implement \#pragma omp critical. \fn void starpu_omp_critical_inline_begin(const char *name) \ingroup API_OpenMP_Runtime_Support Waits until execution can proceed exclusively within the context of the selected critical section. \p name is the name of the selected critical section. If name == NULL, the selected critical section is the unique anonymous critical section. This function together with #starpu_omp_critical_inline_end can be used to implement \#pragma omp critical without code outlining. \fn void starpu_omp_critical_inline_end(const char *name) \ingroup API_OpenMP_Runtime_Support Ends the exclusive execution within the context of the selected critical section. \p name is the name of the selected critical section. If name==NULL, the selected critical section is the unique anonymous critical section. This function together with #starpu_omp_critical_inline_begin can be used to implement \#pragma omp critical without code outlining. @name Worksharing \anchor ORS_Worksharing \ingroup API_OpenMP_Runtime_Support \fn void starpu_omp_single(void (*f)(void *arg), void *arg, int nowait) \ingroup API_OpenMP_Runtime_Support Ensures that a single participating thread of the innermost OpenMP parallel region executes a function. \p f is the function to be executed by a single thread. \p arg is an argument passed to function \p f. \p nowait is a flag indicating whether an implicit barrier is requested after the single section (nowait==0) or not (nowait==!0). This function can be used to implement \#pragma omp single. \fn int starpu_omp_single_inline(void) \ingroup API_OpenMP_Runtime_Support Decides whether the current thread is elected to run the following single section among the participating threads of the innermost OpenMP parallel region. This function can be used to implement \#pragma omp single without code outlining. \return !0 if the calling thread has won the election. \return 0 if the calling thread has lost the election. \fn void starpu_omp_single_copyprivate(void (*f)(void *arg, void *data, unsigned long long data_size), void *arg, void *data, unsigned long long data_size) \ingroup API_OpenMP_Runtime_Support This function executes \p f on a single task of the current parallel region task, and then broadcast the contents of the memory block pointed by the copyprivate pointer \p data and of size \p data_size to the corresponding \p data pointed memory blocks of all the other participating region tasks. This function can be used to implement \#pragma omp single with a copyprivate clause. \sa starpu_omp_single_copyprivate_inline \sa starpu_omp_single_copyprivate_inline_begin \sa starpu_omp_single_copyprivate_inline_end \fn void *starpu_omp_single_copyprivate_inline_begin(void *data) \ingroup API_OpenMP_Runtime_Support This function elects one task among the tasks of the current parallel region task to execute the following single section, and then broadcast the copyprivate pointer \p data to all the other participating region tasks. This function can be used to implement \#pragma omp single with a copyprivate clause without code outlining. \sa starpu_omp_single_copyprivate_inline \sa starpu_omp_single_copyprivate_inline_end \fn void starpu_omp_single_copyprivate_inline_end(void) \ingroup API_OpenMP_Runtime_Support This function completes the execution of a single section and returns the broadcasted copyprivate pointer for tasks that lost the election and NULL for the task that won the election. This function can be used to implement \#pragma omp single with a copyprivate clause without code outlining. \return the copyprivate pointer for tasks that lost the election and therefore did not execute the code of the single section. \return NULL for the task that won the election and executed the code of the single section. \sa starpu_omp_single_copyprivate_inline \sa starpu_omp_single_copyprivate_inline_begin \fn void starpu_omp_for(void (*f)(unsigned long long _first_i, unsigned long long _nb_i, void *arg), void *arg, unsigned long long nb_iterations, unsigned long long chunk, int schedule, int ordered, int nowait) \ingroup API_OpenMP_Runtime_Support Executes a parallel loop together with the other threads participating to the innermost parallel region. \p f is the function to be executed iteratively. \p arg is an argument passed to function \p f. \p nb_iterations is the number of iterations to be performed by the parallel loop. \p chunk is the number of consecutive iterations that should be affected to the same thread when scheduling the loop workshares, it follows the semantics of the \c modifier argument in OpenMP \#pragma omp for specification. \p schedule is the scheduling mode according to the OpenMP specification. \p ordered is a flag indicating whether the loop region may contain an ordered section (ordered==!0) or not (ordered==0). \p nowait is a flag indicating whether an implicit barrier is requested after the for section (nowait==0) or not (nowait==!0). The function \p f will be called with arguments \p _first_i, the first iteration to perform, \p _nb_i, the number of consecutive iterations to perform before returning, \p arg, the free \p arg argument. This function can be used to implement \#pragma omp for. \fn int starpu_omp_for_inline_first(unsigned long long nb_iterations, unsigned long long chunk, int schedule, int ordered, unsigned long long *_first_i, unsigned long long *_nb_i) \ingroup API_OpenMP_Runtime_Support Decides whether the current thread should start to execute a parallel loop section. See #starpu_omp_for for the argument description. This function together with #starpu_omp_for_inline_next can be used to implement \#pragma omp for without code outlining. \return !0 if the calling thread participates to the loop region and should execute a first chunk of iterations. In that case, \p *_first_i will be set to the first iteration of the chunk to perform and \p *_nb_i will be set to the number of iterations of the chunk to perform. \return 0 if the calling thread does not participate to the loop region because all the available iterations have been affected to the other threads of the parallel region. \sa starpu_omp_for \fn int starpu_omp_for_inline_next(unsigned long long nb_iterations, unsigned long long chunk, int schedule, int ordered, unsigned long long *_first_i, unsigned long long *_nb_i) \ingroup API_OpenMP_Runtime_Support Decides whether the current thread should continue to execute a parallel loop section. See #starpu_omp_for for the argument description. This function together with #starpu_omp_for_inline_first can be used to implement \#pragma omp for without code outlining. \return !0 if the calling thread should execute a next chunk of iterations. In that case, \p *_first_i will be set to the first iteration of the chunk to perform and \p *_nb_i will be set to the number of iterations of the chunk to perform. \return 0 if the calling thread does not participate anymore to the loop region because all the available iterations have been affected to the other threads of the parallel region. \sa starpu_omp_for \fn void starpu_omp_for_alt(void (*f)(unsigned long long _begin_i, unsigned long long _end_i, void *arg), void *arg, unsigned long long nb_iterations, unsigned long long chunk, int schedule, int ordered, int nowait) \ingroup API_OpenMP_Runtime_Support Alternative implementation of a parallel loop. This function differs from #starpu_omp_for in the expected arguments of the loop function \c f. The function \p f will be called with arguments \p _begin_i, the first iteration to perform, \p _end_i, the first iteration not to perform before returning, \p arg, the free \p arg argument. This function can be used to implement \#pragma omp for. \sa starpu_omp_for \fn int starpu_omp_for_inline_first_alt(unsigned long long nb_iterations, unsigned long long chunk, int schedule, int ordered, unsigned long long *_begin_i, unsigned long long *_end_i) \ingroup API_OpenMP_Runtime_Support Inline version of the alternative implementation of a parallel loop. This function together with #starpu_omp_for_inline_next_alt can be used to implement \#pragma omp for without code outlining. \sa starpu_omp_for \sa starpu_omp_for_alt \sa starpu_omp_for_inline_first \fn int starpu_omp_for_inline_next_alt(unsigned long long nb_iterations, unsigned long long chunk, int schedule, int ordered, unsigned long long *_begin_i, unsigned long long *_end_i) \ingroup API_OpenMP_Runtime_Support Inline version of the alternative implementation of a parallel loop. This function together with #starpu_omp_for_inline_first_alt can be used to implement \#pragma omp for without code outlining. \sa starpu_omp_for \sa starpu_omp_for_alt \sa starpu_omp_for_inline_next \fn void starpu_omp_ordered(void (*f)(void *arg), void *arg) \ingroup API_OpenMP_Runtime_Support Ensures that a function is sequentially executed once for each iteration in order within a parallel loop, by the thread that own the iteration. \p f is the function to be executed by the thread that own the current iteration. \p arg is an argument passed to function \p f. This function can be used to implement \#pragma omp ordered. \fn void starpu_omp_ordered_inline_begin(void) \ingroup API_OpenMP_Runtime_Support Waits until all the iterations of a parallel loop below the iteration owned by the current thread have been executed. This function together with #starpu_omp_ordered_inline_end can be used to implement \#pragma omp ordered without code code outlining. \fn void starpu_omp_ordered_inline_end(void) \ingroup API_OpenMP_Runtime_Support Notifies that the ordered section for the current iteration has been completed. This function together with #starpu_omp_ordered_inline_begin can be used to implement \#pragma omp ordered without code code outlining. \fn void starpu_omp_sections(unsigned long long nb_sections, void (**section_f)(void *arg), void **section_arg, int nowait) \ingroup API_OpenMP_Runtime_Support Ensures that each function of a given array of functions is executed by one and only one thread. \p nb_sections is the number of functions in the array \p section_f. \p section_f is the array of functions to be executed as sections. \p section_arg is an array of arguments to be passed to the corresponding function. \p nowait is a flag indicating whether an implicit barrier is requested after the execution of all the sections (nowait==0) or not (nowait==!0). This function can be used to implement \#pragma omp sections and \#pragma omp section. \fn void starpu_omp_sections_combined(unsigned long long nb_sections, void (*section_f)(unsigned long long section_num, void *arg), void *section_arg, int nowait) \ingroup API_OpenMP_Runtime_Support Alternative implementation of sections. This function differs from #starpu_omp_sections in that all the sections are combined within a single function in this version. \p section_f is the function implementing the combined sections. The function \p section_f will be called with arguments \p section_num, the section number to be executed, \p arg, the entry of \p section_arg corresponding to this section. This function can be used to implement \#pragma omp sections and \#pragma omp section. \sa starpu_omp_sections @name Task \anchor ORS_Task \ingroup API_OpenMP_Runtime_Support \fn void starpu_omp_task_region(const struct starpu_omp_task_region_attr *attr) \ingroup API_OpenMP_Runtime_Support Generates an explicit child task. The execution of the generated task is asynchronous with respect to the calling code unless specified otherwise. \p attr specifies the attributes for the generated task region. This function can be used to implement \#pragma omp task. \fn void starpu_omp_taskwait(void) \ingroup API_OpenMP_Runtime_Support Waits for the completion of the tasks generated by the current task. This function does not wait for the descendants of the tasks generated by the current task. This function can be used to implement \#pragma omp taskwait. \fn void starpu_omp_taskgroup(void (*f)(void *arg), void *arg) \ingroup API_OpenMP_Runtime_Support Launches a function and wait for the completion of every descendant task generated during the execution of the function. This function can be used to implement \#pragma omp taskgroup. \sa starpu_omp_taskgroup_inline_begin \sa starpu_omp_taskgroup_inline_end \fn void starpu_omp_taskgroup_inline_begin(void) \ingroup API_OpenMP_Runtime_Support Launches a function and gets ready to wait for the completion of every descendant task generated during the dynamic scope of the taskgroup. This function can be used to implement \#pragma omp taskgroup without code outlining. \sa starpu_omp_taskgroup \sa starpu_omp_taskgroup_inline_end \fn void starpu_omp_taskgroup_inline_end(void) \ingroup API_OpenMP_Runtime_Support Waits for the completion of every descendant task generated during the dynamic scope of the taskgroup. This function can be used to implement \#pragma omp taskgroup without code outlining. \sa starpu_omp_taskgroup \sa starpu_omp_taskgroup_inline_begin @name API \anchor ORS_API \ingroup API_OpenMP_Runtime_Support \fn void starpu_omp_set_num_threads(int threads) \ingroup API_OpenMP_Runtime_Support This function sets ICVS nthreads_var for the parallel regions to be created with the current region. Note: The StarPU OpenMP runtime support currently ignores this setting for nested parallel regions. \sa starpu_omp_get_num_threads \sa starpu_omp_get_thread_num \sa starpu_omp_get_max_threads \sa starpu_omp_get_num_procs \fn int starpu_omp_get_num_threads() \ingroup API_OpenMP_Runtime_Support This function returns the number of threads of the current region. \return the number of threads of the current region. \sa starpu_omp_set_num_threads \sa starpu_omp_get_thread_num \sa starpu_omp_get_max_threads \sa starpu_omp_get_num_procs \fn int starpu_omp_get_thread_num() \ingroup API_OpenMP_Runtime_Support This function returns the rank of the current thread among the threads of the current region. \return the rank of the current thread in the current region. \sa starpu_omp_set_num_threads \sa starpu_omp_get_num_threads \sa starpu_omp_get_max_threads \sa starpu_omp_get_num_procs \fn int starpu_omp_get_max_threads() \ingroup API_OpenMP_Runtime_Support This function returns the maximum number of threads that can be used to create a region from the current region. \return the maximum number of threads that can be used to create a region from the current region. \sa starpu_omp_set_num_threads \sa starpu_omp_get_num_threads \sa starpu_omp_get_thread_num \sa starpu_omp_get_num_procs \fn int starpu_omp_get_num_procs(void) \ingroup API_OpenMP_Runtime_Support This function returns the number of StarPU CPU workers. \return the number of StarPU CPU workers. \sa starpu_omp_set_num_threads \sa starpu_omp_get_num_threads \sa starpu_omp_get_thread_num \sa starpu_omp_get_max_threads \fn int starpu_omp_in_parallel(void) \ingroup API_OpenMP_Runtime_Support This function returns whether it is called from the scope of a parallel region or not. \return !0 if called from a parallel region scope. \return 0 otherwise. \fn void starpu_omp_set_dynamic(int dynamic_threads) \ingroup API_OpenMP_Runtime_Support This function enables (1) or disables (0) dynamically adjusting the number of parallel threads. Note: The StarPU OpenMP runtime support currently ignores the argument of this function. \sa starpu_omp_get_dynamic \fn int starpu_omp_get_dynamic(void) \ingroup API_OpenMP_Runtime_Support This function returns the state of dynamic thread number adjustment. \return !0 if dynamic thread number adjustment is enabled. \return 0 otherwise. \sa starpu_omp_set_dynamic \fn void starpu_omp_set_nested(int nested) \ingroup API_OpenMP_Runtime_Support This function enables (1) or disables (0) nested parallel regions. Note: The StarPU OpenMP runtime support currently ignores the argument of this function. \sa starpu_omp_get_nested \sa starpu_omp_get_max_active_levels \sa starpu_omp_set_max_active_levels \sa starpu_omp_get_level \sa starpu_omp_get_active_level \fn int starpu_omp_get_nested(void) \ingroup API_OpenMP_Runtime_Support This function returns whether nested parallel sections are enabled or not. \return !0 if nested parallel sections are enabled. \return 0 otherwise. \sa starpu_omp_set_nested \sa starpu_omp_get_max_active_levels \sa starpu_omp_set_max_active_levels \sa starpu_omp_get_level \sa starpu_omp_get_active_level \fn int starpu_omp_get_cancellation(void) \ingroup API_OpenMP_Runtime_Support This function returns the state of the cancel ICVS var. \fn void starpu_omp_set_schedule(enum starpu_omp_sched_value kind, int modifier) \ingroup API_OpenMP_Runtime_Support This function sets the default scheduling kind for upcoming loops within the current parallel section. \p kind is the scheduler kind, \p modifier complements the scheduler kind with informations such as the chunk size, in accordance with the OpenMP specification. \sa starpu_omp_get_schedule \fn void starpu_omp_get_schedule(enum starpu_omp_sched_value *kind, int *modifier) \ingroup API_OpenMP_Runtime_Support This function returns the current selected default loop scheduler. \return the kind and the modifier of the current default loop scheduler. \sa starpu_omp_set_schedule \fn int starpu_omp_get_thread_limit(void) \ingroup API_OpenMP_Runtime_Support This function returns the number of StarPU CPU workers. \return the number of StarPU CPU workers. \fn void starpu_omp_set_max_active_levels(int max_levels) \ingroup API_OpenMP_Runtime_Support This function sets the maximum number of allowed active parallel section levels. Note: The StarPU OpenMP runtime support currently ignores the argument of this function and assume \p max_levels equals 1 instead. \sa starpu_omp_set_nested \sa starpu_omp_get_nested \sa starpu_omp_get_max_active_levels \sa starpu_omp_get_level \sa starpu_omp_get_active_level \fn int starpu_omp_get_max_active_levels(void) \ingroup API_OpenMP_Runtime_Support This function returns the current maximum number of allowed active parallel section levels \return the current maximum number of allowed active parallel section levels. \sa starpu_omp_set_nested \sa starpu_omp_get_nested \sa starpu_omp_set_max_active_levels \sa starpu_omp_get_level \sa starpu_omp_get_active_level \fn int starpu_omp_get_level(void) \ingroup API_OpenMP_Runtime_Support This function returns the nesting level of the current parallel section. \return the nesting level of the current parallel section. \sa starpu_omp_set_nested \sa starpu_omp_get_nested \sa starpu_omp_get_max_active_levels \sa starpu_omp_set_max_active_levels \sa starpu_omp_get_active_level \fn int starpu_omp_get_ancestor_thread_num(int level) \ingroup API_OpenMP_Runtime_Support This function returns the number of the ancestor of the current parallel section. \return the number of the ancestor of the current parallel section. \fn int starpu_omp_get_team_size(int level) \ingroup API_OpenMP_Runtime_Support This function returns the size of the team of the current parallel section. \return the size of the team of the current parallel section. \fn int starpu_omp_get_active_level(void) \ingroup API_OpenMP_Runtime_Support This function returns the nestinglevel of the current innermost active parallel section. \return the nestinglevel of the current innermost active parallel section. \sa starpu_omp_set_nested \sa starpu_omp_get_nested \sa starpu_omp_get_max_active_levels \sa starpu_omp_set_max_active_levels \sa starpu_omp_get_level \fn int starpu_omp_in_final(void) \ingroup API_OpenMP_Runtime_Support This function checks whether the current task is final or not. \return !0 if called from a final task. \return 0 otherwise. \fn enum starpu_omp_proc_bind_value starpu_omp_get_proc_bind(void) \ingroup API_OpenMP_Runtime_Support This function returns the proc_bind setting of the current parallel region. \return the proc_bind setting of the current parallel region. \fn void starpu_omp_set_default_device(int device_num) \ingroup API_OpenMP_Runtime_Support This function sets the number of the device to use as default. Note: The StarPU OpenMP runtime support currently ignores the argument of this function. \sa starpu_omp_get_default_device \sa starpu_omp_is_initial_device \fn int starpu_omp_get_default_device(void) \ingroup API_OpenMP_Runtime_Support This function returns the number of the device used as default. \return the number of the device used as default. \sa starpu_omp_set_default_device \sa starpu_omp_is_initial_device \fn int starpu_omp_get_num_devices(void) \ingroup API_OpenMP_Runtime_Support This function returns the number of the devices. \return the number of the devices. \fn int starpu_omp_get_num_teams(void) \ingroup API_OpenMP_Runtime_Support This function returns the number of teams in the current teams region. \return the number of teams in the current teams region. \sa starpu_omp_get_num_teams \fn int starpu_omp_get_team_num(void) \ingroup API_OpenMP_Runtime_Support This function returns the team number of the calling thread. \return the team number of the calling thread. \sa starpu_omp_get_num_teams \fn int starpu_omp_is_initial_device(void) \ingroup API_OpenMP_Runtime_Support This function checks whether the current device is the initial device or not. \return !0 if called from the host device. \return 0 otherwise. \sa starpu_omp_set_default_device \sa starpu_omp_get_default_device \fn void starpu_omp_init_lock(starpu_omp_lock_t *lock) \ingroup API_OpenMP_Runtime_Support This function initializes an opaque lock object. \sa starpu_omp_destroy_lock \sa starpu_omp_set_lock \sa starpu_omp_unset_lock \sa starpu_omp_test_lock \fn void starpu_omp_destroy_lock(starpu_omp_lock_t *lock) \ingroup API_OpenMP_Runtime_Support This function destroys an opaque lock object. \sa starpu_omp_init_lock \sa starpu_omp_set_lock \sa starpu_omp_unset_lock \sa starpu_omp_test_lock \fn void starpu_omp_set_lock(starpu_omp_lock_t *lock) \ingroup API_OpenMP_Runtime_Support This function locks an opaque lock object. If the lock is already locked, the function will block until it succeeds in exclusively acquiring the lock. \sa starpu_omp_init_lock \sa starpu_omp_destroy_lock \sa starpu_omp_unset_lock \sa starpu_omp_test_lock \fn void starpu_omp_unset_lock(starpu_omp_lock_t *lock) \ingroup API_OpenMP_Runtime_Support This function unlocks a previously locked lock object. The behaviour of this function is unspecified if it is called on an unlocked lock object. \sa starpu_omp_init_lock \sa starpu_omp_destroy_lock \sa starpu_omp_set_lock \sa starpu_omp_test_lock \fn int starpu_omp_test_lock(starpu_omp_lock_t *lock) \ingroup API_OpenMP_Runtime_Support This function unblockingly attempts to lock a lock object and returns whether it succeeded or not. \return !0 if the function succeeded in acquiring the lock. \return 0 if the lock was already locked. \sa starpu_omp_init_lock \sa starpu_omp_destroy_lock \sa starpu_omp_set_lock \sa starpu_omp_unset_lock \fn void starpu_omp_init_nest_lock(starpu_omp_nest_lock_t *lock) \ingroup API_OpenMP_Runtime_Support This function initializes an opaque lock object supporting nested locking operations. \sa starpu_omp_destroy_nest_lock \sa starpu_omp_set_nest_lock \sa starpu_omp_unset_nest_lock \sa starpu_omp_test_nest_lock \fn void starpu_omp_destroy_nest_lock(starpu_omp_nest_lock_t *lock) \ingroup API_OpenMP_Runtime_Support This function destroys an opaque lock object supporting nested locking operations. \sa starpu_omp_init_nest_lock \sa starpu_omp_set_nest_lock \sa starpu_omp_unset_nest_lock \sa starpu_omp_test_nest_lock \fn void starpu_omp_set_nest_lock(starpu_omp_nest_lock_t *lock) \ingroup API_OpenMP_Runtime_Support This function locks an opaque lock object supporting nested locking operations. If the lock is already locked by another task, the function will block until it succeeds in exclusively acquiring the lock. If the lock is already taken by the current task, the function will increase the nested locking level of the lock object. \sa starpu_omp_init_nest_lock \sa starpu_omp_destroy_nest_lock \sa starpu_omp_unset_nest_lock \sa starpu_omp_test_nest_lock \fn void starpu_omp_unset_nest_lock(starpu_omp_nest_lock_t *lock) \ingroup API_OpenMP_Runtime_Support This function unlocks a previously locked lock object supporting nested locking operations. If the lock has been locked multiple times in nested fashion, the nested locking level is decreased and the lock remains locked. Otherwise, if the lock has only been locked once, it becomes unlocked. The behaviour of this function is unspecified if it is called on an unlocked lock object. The behaviour of this function is unspecified if it is called from a different task than the one that locked the lock object. \sa starpu_omp_init_nest_lock \sa starpu_omp_destroy_nest_lock \sa starpu_omp_set_nest_lock \sa starpu_omp_test_nest_lock \fn int starpu_omp_test_nest_lock(starpu_omp_nest_lock_t *lock) \ingroup API_OpenMP_Runtime_Support This function unblocking attempts to lock an opaque lock object supporting nested locking operations and returns whether it succeeded or not. If the lock is already locked by another task, the function will return without having acquired the lock. If the lock is already taken by the current task, the function will increase the nested locking level of the lock object. \return !0 if the function succeeded in acquiring the lock. \return 0 if the lock was already locked. \sa starpu_omp_init_nest_lock \sa starpu_omp_destroy_nest_lock \sa starpu_omp_set_nest_lock \sa starpu_omp_unset_nest_lock \fn void starpu_omp_atomic_fallback_inline_begin(void) \ingroup API_OpenMP_Runtime_Support This function implements the entry point of a fallback global atomic region. It blocks until it succeeds in acquiring exclusive access to the global atomic region. \sa starpu_omp_atomic_fallback_inline_end \fn void starpu_omp_atomic_fallback_inline_end(void) \ingroup API_OpenMP_Runtime_Support This function implements the exit point of a fallback global atomic region. It release the exclusive access to the global atomic region. \sa starpu_omp_atomic_fallback_inline_begin \fn double starpu_omp_get_wtime(void) \ingroup API_OpenMP_Runtime_Support This function returns the elapsed wallclock time in seconds. \return the elapsed wallclock time in seconds. \sa starpu_omp_get_wtick \fn double starpu_omp_get_wtick(void) \ingroup API_OpenMP_Runtime_Support This function returns the precision of the time used by \p starpu_omp_get_wtime. \return the precision of the time used by \p starpu_omp_get_wtime. \sa starpu_omp_get_wtime \fn void starpu_omp_vector_annotate(starpu_data_handle_t handle, uint32_t slice_base) \ingroup API_OpenMP_Runtime_Support This function enables setting additional vector metadata needed by the OpenMP Runtime Support. \p handle is vector data handle. \p slice_base is the base of an array slice, expressed in number of vector elements from the array base. \sa STARPU_VECTOR_GET_SLICE_BASE */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/parallel_tasks.doxy000066400000000000000000000041751320135501600244670ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Parallel_Tasks Parallel Tasks \fn int starpu_combined_worker_get_size(void) \ingroup API_Parallel_Tasks Return the size of the current combined worker, i.e. the total number of cpus running the same task in the case of ::STARPU_SPMD parallel tasks, or the total number of threads that the task is allowed to start in the case of ::STARPU_FORKJOIN parallel tasks. \fn int starpu_combined_worker_get_rank(void) \ingroup API_Parallel_Tasks Return the rank of the current thread within the combined worker. Can only be used in ::STARPU_FORKJOIN parallel tasks, to know which part of the task to work on. \fn unsigned starpu_combined_worker_get_count(void) \ingroup API_Parallel_Tasks Return the number of different combined workers. \fn int starpu_combined_worker_get_id(void) \ingroup API_Parallel_Tasks Return the identifier of the current combined worker. \fn int starpu_combined_worker_assign_workerid(int nworkers, int workerid_array[]) \ingroup API_Parallel_Tasks Register a new combined worker and get its identifier \fn int starpu_combined_worker_get_description(int workerid, int *worker_size, int **combined_workerid) \ingroup API_Parallel_Tasks Get the description of a combined worker \fn int starpu_combined_worker_can_execute_task(unsigned workerid, struct starpu_task *task, unsigned nimpl) \ingroup API_Parallel_Tasks Variant of starpu_worker_can_execute_task() compatible with combined workers \fn void starpu_parallel_task_barrier_init(struct starpu_task *task, int workerid) \ingroup API_Parallel_Tasks Initialise the barrier for the parallel task, and dispatch the task between the different workers of the given combined worker. \fn void starpu_parallel_task_barrier_init_n(struct starpu_task *task, int worker_size) \ingroup API_Parallel_Tasks Initialise the barrier for the parallel task, to be pushed to \e worker_size workers (without having to explicit a given combined worker). */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/performance_model.doxy000066400000000000000000000305601320135501600251440ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Performance_Model Performance Model \enum starpu_perfmodel_type \ingroup API_Performance_Model TODO \var starpu_perfmodel_type::STARPU_PER_ARCH \ingroup API_Performance_Model Application-provided per-arch cost model function \var starpu_perfmodel_type::STARPU_COMMON \ingroup API_Performance_Model Application-provided common cost model function, with per-arch factor \var starpu_perfmodel_type::STARPU_HISTORY_BASED \ingroup API_Performance_Model Automatic history-based cost model \var starpu_perfmodel_type::STARPU_REGRESSION_BASED \ingroup API_Performance_Model Automatic linear regression-based cost model (alpha * size ^ beta) \var starpu_perfmodel_type::STARPU_NL_REGRESSION_BASED \ingroup API_Performance_Model Automatic non-linear regression-based cost model (a * size ^ b + c) \struct starpu_perfmodel_device todo \ingroup API_Performance_Model \var enum starpu_worker_archtype starpu_perfmodel_device::type is the type of the device \var int starpu_perfmodel_device::devid is the identifier of the precise device \var int starpu_perfmodel_device::ncore is the number of execution in parallel, minus 1 \struct starpu_perfmodel_arch todo \ingroup API_Performance_Model \var int starpu_perfmodel_arch::ndevices is the number of the devices for the given arch \var struct starpu_perfmodel_device *starpu_perfmodel_arch::devices is the list of the devices for the given arch \struct starpu_perfmodel Contains all information about a performance model. At least the type and symbol fields have to be filled when defining a performance model for a codelet. For compatibility, make sure to initialize the whole structure to zero, either by using explicit memset, or by letting the compiler implicitly do it in e.g. static storage case. If not provided, other fields have to be zero. \ingroup API_Performance_Model \var enum starpu_perfmodel_type starpu_perfmodel::type is the type of performance model
    • ::STARPU_HISTORY_BASED, ::STARPU_REGRESSION_BASED, ::STARPU_NL_REGRESSION_BASED: No other fields needs to be provided, this is purely history-based.
    • ::STARPU_PER_ARCH: either field starpu_perfmodel::arch_cost_function has to be filled with a function that returns the cost in micro-seconds on the arch given as parameter, or field starpu_perfmodel::per_arch has to be filled with functions which return the cost in micro-seconds.
    • ::STARPU_COMMON: field starpu_perfmodel::cost_function has to be filled with a function that returns the cost in micro-seconds on a CPU, timing on other archs will be determined by multiplying by an arch-specific factor.
    \var const char *starpu_perfmodel::symbol is the symbol name for the performance model, which will be used as file name to store the model. It must be set otherwise the model will be ignored. \var double (*starpu_perfmodel::cost_function)(struct starpu_task *, unsigned nimpl) Used by ::STARPU_COMMON: takes a task and implementation number, and must return a task duration estimation in micro-seconds. \var double (*starpu_perfmodel::arch_cost_function)(struct starpu_task *, struct starpu_perfmodel_arch* arch, unsigned nimpl) Used by ::STARPU_COMMON: takes a task, an arch and implementation number, and must return a task duration estimation in micro-seconds on that arch. \var size_t (*starpu_perfmodel::size_base)(struct starpu_task *, unsigned nimpl) Used by ::STARPU_HISTORY_BASED, ::STARPU_REGRESSION_BASED and ::STARPU_NL_REGRESSION_BASED. If not NULL, takes a task and implementation number, and returns the size to be used as index to distinguish histories and as a base for regressions. \var uint32_t (*starpu_perfmodel::footprint)(struct starpu_task *) Used by ::STARPU_HISTORY_BASED. If not NULL, takes a task and returns the footprint to be used as index to distinguish histories. The default is to use the starpu_task_data_footprint function. \var unsigned starpu_perfmodel::is_loaded \private Whether the performance model is already loaded from the disk. \var unsigned starpu_perfmodel::benchmarking \private \var unsigned starpu_perfmodel::is_init todo \var starpu_perfmodel_state_t starpu_perfmodel::state \private \struct starpu_perfmodel_regression_model ... \ingroup API_Performance_Model \var double starpu_perfmodel_regression_model::sumlny sum of ln(measured) \var double starpu_perfmodel_regression_model::sumlnx sum of ln(size) \var double starpu_perfmodel_regression_model::sumlnx2 sum of ln(size)^2 \var unsigned long starpu_perfmodel_regression_model::minx minimum size \var unsigned long starpu_perfmodel_regression_model::maxx maximum size \var double starpu_perfmodel_regression_model::sumlnxlny sum of ln(size)*ln(measured) \var double starpu_perfmodel_regression_model::alpha estimated = alpha * size ^ beta \var double starpu_perfmodel_regression_model::beta estimated = alpha * size ^ beta \var unsigned starpu_perfmodel_regression_model::valid whether the linear regression model is valid (i.e. enough measures) \var double starpu_perfmodel_regression_model::a estimated = a size ^b + c \var double starpu_perfmodel_regression_model::b estimated = a size ^b + c \var double starpu_perfmodel_regression_model::c estimated = a size ^b + c \var unsigned starpu_perfmodel_regression_model::nl_valid whether the non-linear regression model is valid (i.e. enough measures) \var unsigned starpu_perfmodel_regression_model::nsample number of sample values for non-linear regression \struct starpu_perfmodel_per_arch contains information about the performance model of a given arch. \ingroup API_Performance_Model \var starpu_perfmodel_per_arch_cost_function starpu_perfmodel_per_arch::cost_function Used by ::STARPU_PER_ARCH, must point to functions which take a task, the target arch and implementation number (as mere conveniency, since the array is already indexed by these), and must return a task duration estimation in micro-seconds. \var starpu_perfmodel_per_arch_size_base starpu_perfmodel_per_arch::size_base Same as in structure starpu_perfmodel, but per-arch, in case it depends on the architecture-specific implementation. \var struct starpu_perfmodel_history_table *starpu_perfmodel_per_arch::history \private The history of performance measurements. \var struct starpu_perfmodel_history_list *starpu_perfmodel_per_arch::list \private Used by ::STARPU_HISTORY_BASED and ::STARPU_NL_REGRESSION_BASED, records all execution history measures. \var struct starpu_perfmodel_regression_model starpu_perfmodel_per_arch::regression \private Used by ::STARPU_REGRESSION_BASED and ::STARPU_NL_REGRESSION_BASED, contains the estimated factors of the regression. \struct starpu_perfmodel_history_list todo \ingroup API_Performance_Model \var struct starpu_perfmodel_history_list *starpu_perfmodel_history_list::next todo \var struct starpu_perfmodel_history_entry *starpu_perfmodel_history_list::entry todo \struct starpu_perfmodel_history_entry todo \ingroup API_Performance_Model \var double starpu_perfmodel_history_entry::mean mean_n = 1/n sum \var double starpu_perfmodel_history_entry::deviation n dev_n = sum2 - 1/n (sum)^2 \var double starpu_perfmodel_history_entry::sum sum of samples (in µs) \var double starpu_perfmodel_history_entry::sum2 sum of samples^2 \var unsigned starpu_perfmodel_history_entry::nsample number of samples \var uint32_t starpu_perfmodel_history_entry::footprint data footprint \var size_t starpu_perfmodel_history_entry::size in bytes \var double starpu_perfmodel_history_entry::flops Provided by the application \fn void starpu_perfmodel_init(struct starpu_perfmodel *model) \ingroup API_Performance_Model todo \fn void starpu_perfmodel_free_sampling_directories(void) \ingroup API_Performance_Model this function frees internal memory used for sampling directory management. It should only be called by an application which is not calling starpu_shutdown as this function already calls it. See for example tools/starpu_perfmodel_display.c. \fn int starpu_perfmodel_load_file(const char *filename, struct starpu_perfmodel *model) \ingroup API_Performance_Model loads the performance model found in the given file. The model structure has to be completely zero, and will be filled with the information stored in the given file. \fn int starpu_perfmodel_load_symbol(const char *symbol, struct starpu_perfmodel *model) \ingroup API_Performance_Model loads a given performance model. The model structure has to be completely zero, and will be filled with the information saved in $STARPU_HOME/.starpu. The function is intended to be used by external tools that should read the performance model files. \fn int starpu_perfmodel_unload_model(struct starpu_perfmodel *model) \ingroup API_Performance_Model unloads the given model which has been previously loaded through the function starpu_perfmodel_load_symbol() \fn void starpu_perfmodel_debugfilepath(struct starpu_perfmodel *model, struct starpu_perfmodel_arch *arch, char *path, size_t maxlen, unsigned nimpl) \ingroup API_Performance_Model returns the path to the debugging information for the performance model. \fn char* starpu_perfmodel_get_archtype_name(enum starpu_worker_archtype archtype) \ingroup API_Performance_Model todo \fn void starpu_perfmodel_get_arch_name(struct starpu_perfmodel_arch *arch, char *archname, size_t maxlen, unsigned nimpl) \ingroup API_Performance_Model returns the architecture name for \p arch \fn struct starpu_perfmodel_arch *starpu_worker_get_perf_archtype(int workerid, unsigned sched_ctx_id) \ingroup API_Performance_Model returns the architecture type of a given worker. \fn void starpu_perfmodel_initialize(void) \ingroup API_Performance_Model If starpu_init is not used, starpu_perfmodel_initialize should be used before calling starpu_perfmodel_* functions. \fn int starpu_perfmodel_list(FILE *output) \ingroup API_Performance_Model prints a list of all performance models on \p output \fn void starpu_perfmodel_directory(FILE *output) \ingroup API_Performance_Model prints the directory name storing performance models on \p output \fn void starpu_perfmodel_print(struct starpu_perfmodel *model, struct starpu_perfmodel_arch *arch, unsigned nimpl, char *parameter, uint32_t *footprint, FILE *output) \ingroup API_Performance_Model todo \fn int starpu_perfmodel_print_all(struct starpu_perfmodel *model, char *arch, char *parameter, uint32_t *footprint, FILE *output) \ingroup API_Performance_Model todo \fn int starpu_perfmodel_print_estimations(struct starpu_perfmodel *model, uint32_t footprint, FILE *output) \ingroup API_Performance_Model todo \fn void starpu_bus_print_bandwidth(FILE *f) \ingroup API_Performance_Model prints a matrix of bus bandwidths on \p f. \fn void starpu_bus_print_affinity(FILE *f) \ingroup API_Performance_Model prints the affinity devices on \p f. \fn void starpu_bus_print_filenames(FILE *f) \ingroup API_Performance_Model prints on \p f the name of the files containing the matrix of bus bandwidths, the affinity devices and the latency. \fn void starpu_perfmodel_update_history(struct starpu_perfmodel *model, struct starpu_task *task, struct starpu_perfmodel_arch *arch, unsigned cpuid, unsigned nimpl, double measured); \ingroup API_Performance_Model This feeds the performance model model with an explicit measurement measured (in µs), in addition to measurements done by StarPU itself. This can be useful when the application already has an existing set of measurements done in good conditions, that StarPU could benefit from instead of doing on-line measurements. And example of use can be seen in \ref PerformanceModelExample. \fn double starpu_transfer_bandwidth(unsigned src_node, unsigned dst_node) \ingroup API_Performance_Model Return the bandwidth of data transfer between two memory nodes \fn double starpu_transfer_latency(unsigned src_node, unsigned dst_node) \ingroup API_Performance_Model Return the latency of data transfer between two memory nodes \fn double starpu_transfer_predict(unsigned src_node, unsigned dst_node, size_t size) \ingroup API_Performance_Model Return the estimated time to transfer a given size between two memory nodes. \fn double starpu_perfmodel_history_based_expected_perf(struct starpu_perfmodel *model, struct starpu_perfmodel_arch* arch, uint32_t footprint) \ingroup API_Performance_Model Return the estimated time of a task whose model is named \p and whose footprint is \p footprint */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/profiling.doxy000066400000000000000000000173761320135501600234660ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Profiling Profiling \struct starpu_profiling_task_info \ingroup API_Profiling This structure contains information about the execution of a task. It is accessible from the field starpu_task::profiling_info if profiling was enabled. \var struct timespec starpu_profiling_task_info::submit_time Date of task submission (relative to the initialization of StarPU). \var struct timespec starpu_profiling_task_info::push_start_time Time when the task was submitted to the scheduler. \var struct timespec starpu_profiling_task_info::push_end_time Time when the scheduler finished with the task submission. \var struct timespec starpu_profiling_task_info::pop_start_time Time when the scheduler started to be requested for a task, and eventually gave that task. \var struct timespec starpu_profiling_task_info::pop_end_time Time when the scheduler finished providing the task for execution. \var struct timespec starpu_profiling_task_info::acquire_data_start_time Time when the worker started fetching input data. \var struct timespec starpu_profiling_task_info::acquire_data_end_time Time when the worker finished fetching input data. \var struct timespec starpu_profiling_task_info::start_time Date of task execution beginning (relative to the initialization of StarPU). \var struct timespec starpu_profiling_task_info::end_time Date of task execution termination (relative to the initialization of StarPU). \var struct timespec starpu_profiling_task_info::release_data_start_time Time when the worker started releasing data. \var struct timespec starpu_profiling_task_info::release_data_end_time Time when the worker finished releasing data. \var struct timespec starpu_profiling_task_info::callback_start_time Time when the worker started the application callback for the task. \var struct timespec starpu_profiling_task_info::callback_end_time Time when the worker finished the application callback for the task. \var int starpu_profiling_task_info::workerid Identifier of the worker which has executed the task. \var uint64_t starpu_profiling_task_info::used_cycles Number of cycles used by the task, only available in the MoviSim \var uint64_t starpu_profiling_task_info::stall_cycles Number of cycles stalled within the task, only available in the MoviSim \var double starpu_profiling_task_info::energy_consumed Energy consumed by the task, only available in the MoviSim \struct starpu_profiling_worker_info This structure contains the profiling information associated to a worker. The timing is provided since the previous call to starpu_profiling_worker_get_info() \ingroup API_Profiling \var struct timespec starpu_profiling_worker_info::start_time Starting date for the reported profiling measurements. \var struct timespec starpu_profiling_worker_info::total_time Duration of the profiling measurement interval. \var struct timespec starpu_profiling_worker_info::executing_time Time spent by the worker to execute tasks during the profiling measurement interval. \var struct timespec starpu_profiling_worker_info::sleeping_time Time spent idling by the worker during the profiling measurement interval. \var int starpu_profiling_worker_info::executed_tasks Number of tasks executed by the worker during the profiling measurement interval. \var uint64_t starpu_profiling_worker_info::used_cycles Number of cycles used by the worker, only available in the MoviSim \var uint64_t starpu_profiling_worker_info::stall_cycles Number of cycles stalled within the worker, only available in the MoviSim \var double starpu_profiling_worker_info::energy_consumed Energy consumed by the worker, only available in the MoviSim \struct starpu_profiling_bus_info todo \ingroup API_Profiling \var struct timespec starpu_profiling_bus_info::start_time Time of bus profiling startup. \var struct timespec starpu_profiling_bus_info::total_time Total time of bus profiling. \var int long long starpu_profiling_bus_info::transferred_bytes Number of bytes transferred during profiling. \var int starpu_profiling_bus_info::transfer_count Number of transfers during profiling. \typedef STARPU_PROFILING_DISABLE \ingroup API_Profiling This value is used when calling the function starpu_profiling_status_set() to disable profiling. \typedef STARPU_PROFILING_ENABLE \ingroup API_Profiling This value is used when calling the function starpu_profiling_status_set() to enable profiling. \fn int starpu_profiling_status_set(int status) \ingroup API_Profiling This function sets the profiling status. Profiling is activated by passing \ref STARPU_PROFILING_ENABLE in status. Passing \ref STARPU_PROFILING_DISABLE disables profiling. Calling this function resets all profiling measurements. When profiling is enabled, the field starpu_task::profiling_info points to a valid structure starpu_profiling_task_info containing information about the execution of the task. Negative return values indicate an error, otherwise the previous status is returned. \fn int starpu_profiling_status_get(void) \ingroup API_Profiling Return the current profiling status or a negative value in case there was an error. \fn void starpu_profiling_init(void) \ingroup API_Profiling This function resets performance counters and enable profiling if the environment variable \ref STARPU_PROFILING is set to a positive value. \fn void starpu_profiling_set_id(int new_id) \ingroup API_Profiling This function sets the ID used for profiling trace filename. It needs to be called before starpu_init(). \fn int starpu_profiling_worker_get_info(int workerid, struct starpu_profiling_worker_info *worker_info) \ingroup API_Profiling Get the profiling info associated to the worker identified by \p workerid, and reset the profiling measurements. If the argument \p worker_info is NULL, only reset the counters associated to worker \p workerid. Upon successful completion, this function returns 0. Otherwise, a negative value is returned. \fn int starpu_bus_get_profiling_info(int busid, struct starpu_profiling_bus_info *bus_info) \ingroup API_Profiling todo \fn int starpu_bus_get_count(void) \ingroup API_Profiling Return the number of buses in the machine \fn int starpu_bus_get_id(int src, int dst) \ingroup API_Profiling Return the identifier of the bus between \p src and \p dst \fn int starpu_bus_get_src(int busid) \ingroup API_Profiling Return the source point of bus \p busid \fn int starpu_bus_get_dst(int busid) \ingroup API_Profiling Return the destination point of bus \p busid \fn double starpu_timing_timespec_delay_us(struct timespec *start, struct timespec *end) \ingroup API_Profiling Returns the time elapsed between \p start and \p end in microseconds. \fn double starpu_timing_timespec_to_us(struct timespec *ts) \ingroup API_Profiling Converts the given timespec \p ts into microseconds \fn void starpu_profiling_bus_helper_display_summary(void) \ingroup API_Profiling Displays statistics about the bus on stderr. if the environment variable \ref STARPU_BUS_STATS is defined. The function is called automatically by starpu_shutdown(). \fn void starpu_profiling_worker_helper_display_summary(void) \ingroup API_Profiling Displays statistics about the workers on stderr if the environment variable \ref STARPU_WORKER_STATS is defined. The function is called automatically by starpu_shutdown(). \fn void starpu_data_display_memory_stats() \ingroup API_Profiling Display statistics about the current data handles registered within StarPU. StarPU must have been configured with the configure option \ref enable-memory-stats "--enable-memory-stats" (see \ref MemoryFeedback). */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/running_driver.doxy000066400000000000000000000030401320135501600245070ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Running_Drivers Running Drivers \fn int starpu_driver_run(struct starpu_driver *d) \ingroup API_Running_Drivers Initialize the given driver, run it until it receives a request to terminate, deinitialize it and return 0 on success. It returns -EINVAL if d->type is not a valid StarPU device type (::STARPU_CPU_WORKER, ::STARPU_CUDA_WORKER or ::STARPU_OPENCL_WORKER). This is the same as using the following functions: calling starpu_driver_init(), then calling starpu_driver_run_once() in a loop, and eventually starpu_driver_deinit(). \fn int starpu_driver_init(struct starpu_driver *d) \ingroup API_Running_Drivers Initialize the given driver. Returns 0 on success, -EINVAL if d->type is not a valid ::starpu_worker_archtype. \fn int starpu_driver_run_once(struct starpu_driver *d) \ingroup API_Running_Drivers Run the driver once, then returns 0 on success, -EINVAL if d->type is not a valid ::starpu_worker_archtype. \fn int starpu_driver_deinit(struct starpu_driver *d) \ingroup API_Running_Drivers Deinitialize the given driver. Returns 0 on success, -EINVAL if d->type is not a valid ::starpu_worker_archtype. \fn void starpu_drivers_request_termination(void) \ingroup API_Running_Drivers Notify all running drivers they should terminate. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/sc_hypervisor/000077500000000000000000000000001320135501600234515ustar00rootroot00000000000000starpu-1.2.3+dfsg/doc/doxygen/chapters/api/sc_hypervisor/sc_hypervisor.doxy000066400000000000000000000217741320135501600272700ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2016 CNRS * Copyright (C) 2011, 2012, 2013 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_SC_Hypervisor Scheduling Context Hypervisor - Building a new resizing policy \struct sc_hypervisor_policy \ingroup API_SC_Hypervisor This structure contains all the methods that implement a hypervisor resizing policy. \var sc_hypervisor_policy::name Indicates the name of the policy, if there is not a custom policy, the policy corresponding to this name will be used by the hypervisor \var sc_hypervisor_policy::custom Indicates whether the policy is custom or not \var sc_hypervisor_policy::size_ctxs Distribute workers to contexts even at the beginning of the program \var sc_hypervisor_policy::resize_ctxs Require explicit resizing \var sc_hypervisor_policy::handle_idle_cycle It is called whenever the indicated worker executes another idle cycle in sched_ctx \var sc_hypervisor_policy::handle_pushed_task It is called whenever a task is pushed on the worker’s queue corresponding to the context sched_ctx \var sc_hypervisor_policy::handle_poped_task It is called whenever a task is poped from the worker’s queue corresponding to the context sched_ctx \var sc_hypervisor_policy::handle_poped_task The hypervisor takes a decision when another task was poped from this worker in this ctx \var sc_hypervisor_policy::handle_idle_end It is called whenever a task is executed on the indicated worker and context after a long period of idle time \var sc_hypervisor_policy::handle_post_exec_hook It is called whenever a tag task has just been executed. The table of resize requests is provided as well as the tag \var sc_hypervisor_policy::handle_submitted_job The hypervisor takes a decision when a job was submitted in this ctx \var sc_hypervisor_policy::end_ctx The hypervisor takes a decision when a certain ctx was deleted \struct sc_hypervisor_policy_config \ingroup API_SC_Hypervisor This structure contains all configuration information of a context. It contains configuration information for each context, which can be used to construct new resize strategies. \var sc_hypervisor_policy_config::min_nworkers Indicates the minimum number of workers needed by the context \var sc_hypervisor_policy_config::max_nworkers Indicates the maximum number of workers needed by the context \var sc_hypervisor_policy_config::granularity Indicates the workers granularity of the context \var sc_hypervisor_policy_config::priority Indicates the priority of each worker in the context \var sc_hypervisor_policy_config::max_idle Indicates the maximum idle time accepted before a resize is triggered \var sc_hypervisor_policy_config::min_working Indicates that underneath this limit the priority of the worker is reduced \var sc_hypervisor_policy_config::fixed_workers Indicates which workers can be moved and which ones are fixed \var sc_hypervisor_policy_config:: new_workers_max_idle Indicates the maximum idle time accepted before a resize is triggered for the workers that just arrived in the new context \var sc_hypervisor_policy_config::ispeed_w_sample Indicates the sample used to compute the instant speed per worker \var sc_hypervisor_policy_config::ispeed_ctx_sample Indicates the sample used to compute the instant speed per ctxs \var sc_hypervisor_policy_config::time_sample todo \struct sc_hypervisor_wrapper \ingroup API_SC_Hypervisor This structure is a wrapper of the contexts available in StarPU and contains all information about a context obtained by incrementing the performance counters. \var sc_hypervisor_wrapper::sched_ctx The context wrapped \var sc_hypervisor_wrapper::config The corresponding resize configuration \var sc_hypervisor_wrapper::current_idle_time The idle time counter of each worker of the context \var sc_hypervisor_wrapper::idle_time The time the workers were idle from the last resize \var sc_hypervisor_wrapper::idle_start_time The moment when the workers started being idle \var sc_hypervisor_wrapper::worker_to_be_removed The list of workers that will leave this contexts (lazy resizing process) \var sc_hypervisor_wrapper::pushed_tasks The number of pushed tasks of each worker of the context \var sc_hypervisor_wrapper::poped_tasks The number of poped tasks of each worker of the context \var sc_hypervisor_wrapper::total_flops The total number of flops to execute by the context \var sc_hypervisor_wrapper::total_elapsed_flops The number of flops executed by each workers of the context \var sc_hypervisor_wrapper::elapsed_flops The number of flops executed by each worker of the context from last resize \var sc_hypervisor_wrapper::elapsed_data The quantity of data (in bytes) used to execute tasks on each worker in this ctx \var sc_hypervisor_wrapper::elapsed_tasks The nr of tasks executed on each worker in this ctx \var sc_hypervisor_wrapper::ref_speed The average speed of the workers (type of workers) when they belonged to this context 0 - cuda 1 - cpu \var sc_hypervisor_wrapper::submitted_flops The number of flops submitted to this ctx \var sc_hypervisor_wrapper::remaining_flops The number of flops that still have to be executed by the workers in the context \var sc_hypervisor_wrapper::ready_flops The number of flops corresponding to the ready tasks in this context \var sc_hypervisor_wrapper::start_time The time when he started executed \var sc_hypervisor_wrapper::real_start_time The first time a task was pushed to this context \var sc_hypervisor_wrapper::resize_ack The structure confirming the last resize finished and a new one can be done \var sc_hypervisor_wrapper::mutex The mutex needed to synchronize the acknowledgment of the workers into the receiver context \var sc_hypervisor_wrapper::total_flops_available A boolean indicating if the hypervisor can use the flops corresponding to the entire execution of the context \var sc_hypervisor_wrapper::nready_tasks The number of ready tasks in a context \struct sc_hypervisor_resize_ack \ingroup API_SC_Hypervisor This structures checks if the workers moved to another context are actually taken into account in that context. \var sc_hypervisor_resize_ack::receiver_sched_ctx The context receiving the new workers \var sc_hypervisor_resize_ack::moved_workers The workers moved to the receiver context \var sc_hypervisor_resize_ack::nmoved_workers The number of workers moved \var sc_hypervisor_resize_ack::acked_workers If the value corresponding to a worker is 1, this one is taken into account in the new context if 0 not yet \struct sc_hypervisor_policy_task_pool task wrapper linked list \ingroup API_SC_Hypervisor \var sc_hypervisor_policy_task_pool::cl Which codelet has been executed \var sc_hypervisor_policy_task_pool::footprint Task footprint key \var sc_hypervisor_policy_task_pool::sched_ctx_id Context the task belongs to \var sc_hypervisor_policy_task_pool::n Number of tasks of this kind \var sc_hypervisor_policy_task_pool::data_size The quantity of data(in bytes) needed by the task to execute \var sc_hypervisor_policy_task_pool::next Other task kinds \def STARPU_HYPERVISOR_TAG \ingroup API_SC_Hypervisor todo \fn void sc_hypervisor_post_resize_request(unsigned sched_ctx, int task_tag) \ingroup API_SC_Hypervisor Requires resizing the context \p sched_ctx whenever a task tagged with the id \p task_tag finished executing \fn unsigned sc_hypervisor_get_size_req(unsigned **sched_ctxs, int* nsched_ctxs, int **workers, int *nworkers) \ingroup API_SC_Hypervisor Check if there are pending demands of resizing \fn void sc_hypervisor_save_size_req(unsigned *sched_ctxs, int nsched_ctxs, int *workers, int nworkers) \ingroup API_SC_Hypervisor Save a demand of resizing \fn void sc_hypervisor_free_size_req(void) \ingroup API_SC_Hypervisor Clear the list of pending demands of resizing \fn unsigned sc_hypervisor_can_resize(unsigned sched_ctx) \ingroup API_SC_Hypervisor Check out if a context can be resized \fn struct sc_hypervisor_policy_config *sc_hypervisor_get_config(unsigned sched_ctx) \ingroup API_SC_Hypervisor Returns the configuration structure of a context \fn void sc_hypervisor_set_config(unsigned sched_ctx, void *config) \ingroup API_SC_Hypervisor Set a certain configuration to a contexts \fn unsigned *sc_hypervisor_get_sched_ctxs() \ingroup API_SC_Hypervisor Gets the contexts managed by the hypervisor \fn int sc_hypervisor_get_nsched_ctxs() \ingroup API_SC_Hypervisor Gets the number of contexts managed by the hypervisor \fn struct sc_hypervisor_wrapper *sc_hypervisor_get_wrapper(unsigned sched_ctx) \ingroup API_SC_Hypervisor Returns the wrapper corresponding the context \p sched_ctx \fn double sc_hypervisor_get_elapsed_flops_per_sched_ctx(struct sc_hypervisor_wrapper *sc_w) \ingroup API_SC_Hypervisor Returns the flops of a context elapsed from the last resize */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/sc_hypervisor/sc_hypervisor_usage.doxy000066400000000000000000000210061320135501600304400ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016 CNRS * Copyright (C) 2011, 2012, 2013 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_SC_Hypervisor_usage Scheduling Context Hypervisor - Regular usage \fn void *sc_hypervisor_init(struct sc_hypervisor_policy *policy) \ingroup API_SC_Hypervisor_usage There is a single hypervisor that is in charge of resizing contexts and the resizing strategy is chosen at the initialization of the hypervisor. A single resize can be done at a time. The Scheduling Context Hypervisor Plugin provides a series of performance counters to StarPU. By incrementing them, StarPU can help the hypervisor in the resizing decision making process. This function initializes the hypervisor to use the strategy provided as parameter and creates the performance counters (see starpu_sched_ctx_performance_counters). These performance counters represent actually some callbacks that will be used by the contexts to notify the information needed by the hypervisor. Note: The Hypervisor is actually a worker that takes this role once certain conditions trigger the resizing process (there is no additional thread assigned to the hypervisor). \fn void sc_hypervisor_shutdown(void) \ingroup API_SC_Hypervisor_usage The hypervisor and all information concerning it is cleaned. There is no synchronization between this function and starpu_shutdown(). Thus, this should be called after starpu_shutdown(), because the performance counters will still need allocated callback functions. \fn void sc_hypervisor_register_ctx(unsigned sched_ctx, double total_flops) \ingroup API_SC_Hypervisor_usage Scheduling Contexts that have to be resized by the hypervisor must be first registered to the hypervisor. This function registers the context to the hypervisor, and indicate the number of flops the context will execute (used for Gflops rate based strategy or any other custom strategy needing it, for the others we can pass 0.0) \fn void sc_hypervisor_unregister_ctx(unsigned sched_ctx) \ingroup API_SC_Hypervisor_usage Whenever we want to exclude contexts from the resizing process we have to unregister them from the hypervisor. \fn void sc_hypervisor_resize_ctxs(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers) \ingroup API_SC_Hypervisor_usage Requires reconsidering the distribution of ressources over the indicated scheduling contexts \fn void sc_hypervisor_stop_resize(unsigned sched_ctx) \ingroup API_SC_Hypervisor_usage The user can totally forbid the resizing of a certain context or can then change his mind and allow it (in this case the resizing is managed by the hypervisor, that can forbid it or allow it) \fn void sc_hypervisor_start_resize(unsigned sched_ctx) \ingroup API_SC_Hypervisor_usage Allow resizing of a context. The user can then provide information to the hypervisor concerning the conditions of resizing. \fn char *sc_hypervisor_get_policy(); \ingroup API_SC_Hypervisor_usage Returns the name of the resizing policy the hypervisor uses \fn void sc_hypervisor_add_workers_to_sched_ctx(int* workers_to_add, unsigned nworkers_to_add, unsigned sched_ctx) \ingroup API_SC_Hypervisor_usage Ask the hypervisor to add workers to a sched_ctx \fn void sc_hypervisor_remove_workers_from_sched_ctx(int* workers_to_remove, unsigned nworkers_to_remove, unsigned sched_ctx, unsigned now) \ingroup API_SC_Hypervisor_usage Ask the hypervisor to remove workers from a sched_ctx \fn void sc_hypervisor_move_workers(unsigned sender_sched_ctx, unsigned receiver_sched_ctx, int *workers_to_move, unsigned nworkers_to_move, unsigned now) \ingroup API_SC_Hypervisor_usage Moves workers from one context to another \fn void sc_hypervisor_size_ctxs(unsigned *sched_ctxs, int nsched_ctxs, int *workers, int nworkers) \ingroup API_SC_Hypervisor_usage Ask the hypervisor to chose a distribution of workers in the required contexts \fn void sc_hypervisor_set_type_of_task(struct starpu_codelet *cl, unsigned sched_ctx, uint32_t footprint, size_t data_size) \ingroup API_SC_Hypervisor_usage Indicate the types of tasks a context will execute in order to better decide the sizing of ctxs \fn void sc_hypervisor_update_diff_total_flops(unsigned sched_ctx, double diff_total_flops) \ingroup API_SC_Hypervisor_usage Change dynamically the total number of flops of a context, move the deadline of the finishing time of the context \fn void sc_hypervisor_update_diff_elapsed_flops(unsigned sched_ctx, double diff_task_flops) \ingroup API_SC_Hypervisor_usage Change dynamically the number of the elapsed flops in a context, modify the past in order to better compute the speed \fn void sc_hypervisor_ctl(unsigned sched_ctx, ...) \ingroup API_SC_Hypervisor_usage Inputs conditions to the context sched_ctx with the following arguments. The argument list must be zero-terminated. \def SC_HYPERVISOR_MAX_IDLE \ingroup API_SC_Hypervisor_usage This macro is used when calling sc_hypervisor_ctl() and must be followed by 3 arguments: an array of int for the workerids to apply the condition, an int to indicate the size of the array, and a double value indicating the maximum idle time allowed for a worker before the resizing process should be triggered \def SC_HYPERVISOR_PRIORITY \ingroup API_SC_Hypervisor_usage This macro is used when calling sc_hypervisor_ctl() and must be followed by 3 arguments: an array of int for the workerids to apply the condition, an int to indicate the size of the array, and an int value indicating the priority of the workers previously mentioned. The workers with the smallest priority are moved the first. \def SC_HYPERVISOR_MIN_WORKERS \ingroup API_SC_Hypervisor_usage This macro is used when calling sc_hypervisor_ctl() and must be followed by 1 argument(int) indicating the minimum number of workers a context should have, underneath this limit the context cannot execute. \def SC_HYPERVISOR_MAX_WORKERS \ingroup API_SC_Hypervisor_usage This macro is used when calling sc_hypervisor_ctl() and must be followed by 1 argument(int) indicating the maximum number of workers a context should have, above this limit the context would not be able to scale \def SC_HYPERVISOR_GRANULARITY \ingroup API_SC_Hypervisor_usage This macro is used when calling sc_hypervisor_ctl() and must be followed by 1 argument(int) indicating the granularity of the resizing process (the number of workers should be moved from the context once it is resized) This parameter is ignore for the Gflops rate based strategy (see \ref ResizingStrategies), the number of workers that have to be moved is calculated by the strategy. \def SC_HYPERVISOR_FIXED_WORKERS \ingroup API_SC_Hypervisor_usage This macro is used when calling sc_hypervisor_ctl() and must be followed by 2 arguments: an array of int for the workerids to apply the condition and an int to indicate the size of the array. These workers are not allowed to be moved from the context. \def SC_HYPERVISOR_MIN_TASKS \ingroup API_SC_Hypervisor_usage This macro is used when calling sc_hypervisor_ctl() and must be followed by 1 argument (int) that indicated the minimum number of tasks that have to be executed before the context could be resized. This parameter is ignored for the Application Driven strategy (see \ref ResizingStrategies) where the user indicates exactly when the resize should be done. \def SC_HYPERVISOR_NEW_WORKERS_MAX_IDLE \ingroup API_SC_Hypervisor_usage This macro is used when calling sc_hypervisor_ctl() and must be followed by 1 argument, a double value indicating the maximum idle time allowed for workers that have just been moved from other contexts in the current context. \def SC_HYPERVISOR_TIME_TO_APPLY \ingroup API_SC_Hypervisor_usage This macro is used when calling sc_hypervisor_ctl() and must be followed by 1 argument (int) indicating the tag an executed task should have such that this configuration should be taken into account. \def SC_HYPERVISOR_ISPEED_W_SAMPLE \ingroup API_SC_Hypervisor_usage This macro is used when calling sc_hypervisor_ctl() and must be followed by 1 argument, a double, that indicates the number of flops needed to be executed before computing the speed of a worker \def SC_HYPERVISOR_ISPEED_CTX_SAMPLE \ingroup API_SC_Hypervisor_usage This macro is used when calling sc_hypervisor_ctl() and must be followed by 1 argument, a double, that indicates the number of flops needed to be executed before computing the speed of a context \def SC_HYPERVISOR_NULL \ingroup API_SC_Hypervisor_usage This macro is used when calling sc_hypervisor_ctl() and must be followed by 1 arguments */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/scc_extensions.doxy000066400000000000000000000024231320135501600245070ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_SCC_Extensions SCC Extensions \def STARPU_USE_SCC \ingroup API_SCC_Extensions This macro is defined when StarPU has been installed with SCC support. It should be used in your code to detect the availability of SCC. \def STARPU_MAXSCCDEVS \ingroup API_SCC_Extensions This macro defines the maximum number of SCC devices that are supported by StarPU. \typedef starpu_scc_func_symbol_t \ingroup API_SCC_Extensions Type for SCC function symbols \fn int starpu_scc_register_kernel(starpu_scc_func_symbol_t *symbol, const char *func_name) \ingroup API_SCC_Extensions Initiate a lookup on each SCC device to find the adress of the function named \p func_name, store them in the global array kernels and return the index in the array through \p symbol. \fn starpu_scc_kernel_t starpu_scc_get_kernel(starpu_scc_func_symbol_t symbol) \ingroup API_SCC_Extensions If success, return the pointer to the function defined by \p symbol on the device linked to the called device. This can for instance be used in a starpu_scc_func_t implementation. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/scheduling_contexts.doxy000066400000000000000000000327741320135501600255500ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Scheduling_Contexts Scheduling Contexts \brief StarPU permits on one hand grouping workers in combined workers in order to execute a parallel task and on the other hand grouping tasks in bundles that will be executed by a single specified worker. In contrast when we group workers in scheduling contexts we submit starpu tasks to them and we schedule them with the policy assigned to the context. Scheduling contexts can be created, deleted and modified dynamically. \struct starpu_sched_ctx_performance_counters Performance counters used by the starpu to indicate the hypervisor how the application and the resources are executing. \ingroup API_Scheduling_Contexts \var void (*starpu_sched_ctx_performance_counters::notify_idle_cycle)(unsigned sched_ctx_id, int worker, double idle_time) Informs the hypervisor for how long a worker has been idle in the specified context \var void (*starpu_sched_ctx_performance_counters::notify_pushed_task)(unsigned sched_ctx_id, int worker) Notifies the hypervisor that a task has been scheduled on the queue of the worker corresponding to the specified context \var void (*starpu_sched_ctx_performance_counters::notify_poped_task)(unsigned sched_ctx_id, int worker) Informs the hypervisor that a task executing a specified number of instructions has been poped from the worker \var void (*starpu_sched_ctx_performance_counters::notify_post_exec_task)(struct starpu_task *task, size_t data_size, uint32_t footprint, int hypervisor_tag, double flops) Notifies the hypervisor that a task has just been executed \var void (*starpu_sched_ctx_performance_counters::notify_submitted_job)(struct starpu_task *task, uint32_t footprint, size_t data_size) Notifies the hypervisor that a task has just been submitted \var void (*starpu_sched_ctx_performance_counters::notify_delete_context)(unsigned sched_ctx) Notifies the hypervisor that the context was deleted @name Scheduling Contexts Basic API \ingroup API_Scheduling_Contexts \def STARPU_NMAX_SCHED_CTXS \ingroup API_Scheduling_Policy Define the maximum number of scheduling contexts managed by StarPU. The default value can be modified at configure by using the option \ref enable-max-sched-ctxs "--enable-max-sched-ctxs". \fn unsigned starpu_sched_ctx_create(int *workerids_ctx, int nworkers_ctx, const char *sched_ctx_name, ...) \ingroup API_Scheduling_Contexts This function creates a scheduling context with the given parameters (see below) and assigns the workers in \p workerids_ctx to execute the tasks submitted to it. The return value represents the identifier of the context that has just been created. It will be further used to indicate the context the tasks will be submitted to. The return value should be at most \ref STARPU_NMAX_SCHED_CTXS. The arguments following the name of the scheduling context can be of the following types:
    • ::STARPU_SCHED_CTX_POLICY_NAME, followed by the name of a predefined scheduling policy. Use an empty string to create the context with the default scheduling policy.
    • ::STARPU_SCHED_CTX_POLICY_STRUCT, followed by a pointer to a custom scheduling policy (struct starpu_sched_policy *)
    • ::STARPU_SCHED_CTX_POLICY_MIN_PRIO, followed by a integer representing the minimum priority value to be defined for the scheduling policy.
    • ::STARPU_SCHED_CTX_POLICY_MAX_PRIO, followed by a integer representing the maximum priority value to be defined for the scheduling policy.
    \def STARPU_SCHED_CTX_POLICY_NAME \ingroup API_Scheduling_Contexts This macro is used when calling starpu_sched_ctx_create() to specify a name for a scheduling policy \def STARPU_SCHED_CTX_POLICY_STRUCT \ingroup API_Scheduling_Contexts This macro is used when calling starpu_sched_ctx_create() to specify a pointer to a scheduling policy \def STARPU_SCHED_CTX_POLICY_MIN_PRIO \ingroup API_Scheduling_Contexts This macro is used when calling starpu_sched_ctx_create() to specify a minimum scheduler priority value. \def STARPU_SCHED_CTX_POLICY_MAX_PRIO \ingroup API_Scheduling_Contexts This macro is used when calling starpu_sched_ctx_create() to specify a maximum scheduler priority value. \def STARPU_SCHED_CTX_POLICY_INIT \ingroup API_Scheduling_Contexts This macro is used when calling starpu_sched_ctx_create() to specify a function pointer allowing to initialize the scheduling policy. \fn unsigned starpu_sched_ctx_create_inside_interval(const char *policy_name, const char *sched_ctx_name, int min_ncpus, int max_ncpus, int min_ngpus, int max_ngpus, unsigned allow_overlap) \ingroup API_Scheduling_Contexts Create a context indicating an approximate interval of resources \fn void starpu_sched_ctx_register_close_callback(unsigned sched_ctx_id, void (*close_callback)(unsigned sched_ctx_id, void* args), void *args) \ingroup API_Scheduling_Contexts Execute the callback whenever the last task of the context finished executing, it is called with the pramaters: sched_ctx and any other paramter needed by the application (packed in a void*) \fn void starpu_sched_ctx_add_workers(int *workerids_ctx, int nworkers_ctx, unsigned sched_ctx_id) \ingroup API_Scheduling_Contexts This function adds dynamically the workers in \p workerids_ctx to the context \p sched_ctx_id. The last argument cannot be greater than \ref STARPU_NMAX_SCHED_CTXS. \fn void starpu_sched_ctx_remove_workers(int *workerids_ctx, int nworkers_ctx, unsigned sched_ctx_id) \ingroup API_Scheduling_Contexts This function removes the workers in \p workerids_ctx from the context \p sched_ctx_id. The last argument cannot be greater than STARPU_NMAX_SCHED_CTXS. \fn void starpu_sched_ctx_display_workers(unsigned sched_ctx_id, FILE *f) \ingroup API_Scheduling_Contexts This function prints on the file \p f the worker names belonging to the context \p sched_ctx_id \fn void starpu_sched_ctx_delete(unsigned sched_ctx_id) \ingroup API_Scheduling_Contexts Delete scheduling context \p sched_ctx_id and transfer remaining workers to the inheritor scheduling context. \fn void starpu_sched_ctx_set_inheritor(unsigned sched_ctx_id, unsigned inheritor) \ingroup API_Scheduling_Contexts Indicate which context whill inherit the resources of this context when he will be deleted. \fn void starpu_sched_ctx_set_context(unsigned *sched_ctx_id) \ingroup API_Scheduling_Contexts Set the scheduling context the subsequent tasks will be submitted to \fn unsigned starpu_sched_ctx_get_context(void) \ingroup API_Scheduling_Contexts Return the scheduling context the tasks are currently submitted to, or ::STARPU_NMAX_SCHED_CTXS if no default context has been defined by calling the function starpu_sched_ctx_set_context(). \fn void starpu_sched_ctx_stop_task_submission(void) \ingroup API_Scheduling_Contexts Stop submitting tasks from the empty context list until the next time the context has time to check the empty context list \fn void starpu_sched_ctx_finished_submit(unsigned sched_ctx_id) \ingroup API_Scheduling_Contexts Indicate starpu that the application finished submitting to this context in order to move the workers to the inheritor as soon as possible. \fn unsigned starpu_sched_ctx_get_workers_list(unsigned sched_ctx_id, int **workerids) \ingroup API_Scheduling_Contexts Returns the list of workers in the array \p workerids, the returned value is the number of workers. The user should free the \p workerids table after finishing using it (it is allocated inside the function with the proper size) \fn unsigned starpu_sched_ctx_get_workers_list_raw(unsigned sched_ctx_id, int **workerids) \ingroup API_Scheduling_Contexts Returns the list of workers in the array \p workerids, the returned value is the number of workers. This list is provided in raw order, i.e. not sorted by tree or list order, and the user should not free the \p workerids table. This function is thus much less costly than starpu_sched_ctx_get_workers_list. \fn unsigned starpu_sched_ctx_get_nworkers(unsigned sched_ctx_id) \ingroup API_Scheduling_Contexts Return the number of workers managed by the specified contexts (Usually needed to verify if it manages any workers or if it should be blocked) \fn unsigned starpu_sched_ctx_get_nshared_workers(unsigned sched_ctx_id, unsigned sched_ctx_id2) \ingroup API_Scheduling_Contexts Return the number of workers shared by two contexts. \fn unsigned starpu_sched_ctx_contains_worker(int workerid, unsigned sched_ctx_id) \ingroup API_Scheduling_Contexts Return 1 if the worker belongs to the context and 0 otherwise \fn unsigned starpu_sched_ctx_worker_get_id(unsigned sched_ctx_id) \ingroup API_Scheduling_Contexts Return the workerid if the worker belongs to the context and -1 otherwise. If the thread calling this function is not a worker the function returns -1 as it calls the function starpu_worker_get_id(). \fn unsigned starpu_sched_ctx_overlapping_ctxs_on_worker(int workerid) \ingroup API_Scheduling_Contexts Check if a worker is shared between several contexts @name Scheduling Context Priorities \ingroup API_Scheduling_Contexts \def STARPU_MIN_PRIO \ingroup API_Scheduling_Contexts Provided for legacy reasons. \def STARPU_MAX_PRIO \ingroup API_Scheduling_Contexts Provided for legacy reasons. \def STARPU_DEFAULT_PRIO \ingroup API_Scheduling_Contexts By convention, the default priority level should be 0 so that we can statically allocate tasks with a default priority. \fn int starpu_sched_ctx_set_min_priority(unsigned sched_ctx_id, int min_prio) \ingroup API_Scheduling_Contexts Defines the minimum task priority level supported by the scheduling policy of the given scheduler context. The default minimum priority level is the same as the default priority level which is 0 by convention. The application may access that value by calling the function starpu_sched_ctx_get_min_priority(). This function should only be called from the initialization method of the scheduling policy, and should not be used directly from the application. \fn int starpu_sched_ctx_set_max_priority(unsigned sched_ctx_id, int max_prio) \ingroup API_Scheduling_Contexts Defines the maximum priority level supported by the scheduling policy of the given scheduler context. The default maximum priority level is 1. The application may access that value by calling the starpu_sched_ctx_get_max_priority function. This function should only be called from the initialization method of the scheduling policy, and should not be used directly from the application. \fn int starpu_sched_ctx_get_min_priority(unsigned sched_ctx_id) \ingroup API_Scheduling_Contexts Returns the current minimum priority level supported by the scheduling policy of the given scheduler context. \fn int starpu_sched_ctx_get_max_priority(unsigned sched_ctx_id) \ingroup API_Scheduling_Contexts Returns the current maximum priority level supported by the scheduling policy of the given scheduler context. \fn int starpu_sched_ctx_min_priority_is_set(unsigned sched_ctx_id) \ingroup API_Scheduling_Contexts todo \fn int starpu_sched_ctx_max_priority_is_set(unsigned sched_ctx_id) \ingroup API_Scheduling_Contexts todo @name Scheduling Context Worker Collection \ingroup API_Scheduling_Contexts \fn struct starpu_worker_collection *starpu_sched_ctx_create_worker_collection(unsigned sched_ctx_id, enum starpu_worker_collection_type type) \ingroup API_Scheduling_Contexts Create a worker collection of the type indicated by the last parameter for the context specified through the first parameter. \fn void starpu_sched_ctx_delete_worker_collection(unsigned sched_ctx_id) \ingroup API_Scheduling_Contexts Delete the worker collection of the specified scheduling context \fn struct starpu_worker_collection *starpu_sched_ctx_get_worker_collection(unsigned sched_ctx_id) \ingroup API_Scheduling_Contexts Return the worker collection managed by the indicated context @name Scheduling Context Link with Hypervisor \ingroup API_Scheduling_Contexts \fn void starpu_sched_ctx_set_perf_counters(unsigned sched_ctx_id, void *perf_counters) \ingroup API_Scheduling_Contexts Indicates to starpu the pointer to the performance counter \fn void starpu_sched_ctx_call_pushed_task_cb(int workerid, unsigned sched_ctx_id) \ingroup API_Scheduling_Contexts Callback that lets the scheduling policy tell the hypervisor that a task was pushed on a worker \fn void starpu_sched_ctx_notify_hypervisor_exists(void) \ingroup API_Scheduling_Contexts Allow the hypervisor to let starpu know he's initialised \fn unsigned starpu_sched_ctx_check_if_hypervisor_exists(void) \ingroup API_Scheduling_Contexts Ask starpu if he is informed if the hypervisor is initialised \fn void starpu_sched_ctx_set_policy_data(unsigned sched_ctx_id, void *policy_data) \ingroup API_Scheduling_Contexts Allocate the scheduling policy data (private information of the scheduler like queues, variables, additional condition variables) the context \fn void *starpu_sched_ctx_get_policy_data(unsigned sched_ctx_id) \ingroup API_Scheduling_Contexts Return the scheduling policy data (private information of the scheduler) of the contexts previously assigned to. \fn void *starpu_sched_ctx_exec_parallel_code(void* (*func)(void*), void *param, unsigned sched_ctx_id) \ingroup API_Scheduling_Contexts execute any parallel code on the workers of the sched_ctx (workers are blocked) \fn int starpu_sched_ctx_get_nready_tasks(unsigned sched_ctx_id) \ingroup API_Scheduling_Contexts todo \fn double starpu_sched_ctx_get_nready_flops(unsigned sched_ctx_id) \ingroup API_Scheduling_Contexts todo */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/scheduling_policy.doxy000066400000000000000000000321321320135501600251640ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Scheduling_Policy Scheduling Policy \brief TODO. While StarPU comes with a variety of scheduling policies (see \ref TaskSchedulingPolicy), it may sometimes be desirable to implement custom policies to address specific problems. The API described below allows users to write their own scheduling policy. \def STARPU_MAXIMPLEMENTATIONS \ingroup API_Scheduling_Policy Define the maximum number of implementations per architecture. The default value can be modified at configure by using the option \ref enable-maximplementations "--enable-maximplementations". \struct starpu_sched_policy \ingroup API_Scheduling_Policy This structure contains all the methods that implement a scheduling policy. An application may specify which scheduling strategy in the field starpu_conf::sched_policy passed to the function starpu_init(). For each task going through the scheduler, the following methods get called in the given order:
    • starpu_sched_policy::submit_hook when the task is submitted
    • starpu_sched_policy::push_task when the task becomes ready. The scheduler is here given the task
    • starpu_sched_policy::pop_task when a worker is idle. The scheduler here gives back the task to the core
    • starpu_sched_policy::pre_exec_hook right before the worker actually starts the task computation (after transferring any missing data).
    • starpu_sched_policy::post_exec_hook right after the worker actually completed the task computation.
    For each task not going through the scheduler (because starpu_task::execute_on_a_specific_worker was set), these get called:
    • starpu_sched_policy::submit_hook when the task is submitted
    • starpu_sched_policy::push_task_notify when the task becomes ready. This is just a notification, the scheduler does not have to do anything about the task.
    • starpu_sched_policy::pre_exec_hook right before the worker actually starts the task computation (after transferring any missing data).
    • starpu_sched_policy::post_exec_hook right after the worker actually completed the task computation.
    \var void (*starpu_sched_policy::init_sched)(unsigned sched_ctx_id) Initialize the scheduling policy, called before any other method. \var void (*starpu_sched_policy::deinit_sched)(unsigned sched_ctx_id) Cleanup the scheduling policy, called before any other method. \var int (*starpu_sched_policy::push_task)(struct starpu_task *) Insert a task into the scheduler, called when the task becomes ready for execution. \var void (*starpu_sched_policy::push_task_notify)(struct starpu_task *, int workerid, int perf_workerid, unsigned sched_ctx_id) Notify the scheduler that a task was pushed on a given worker. This method is called when a task that was explicitly assigned to a worker becomes ready and is about to be executed by the worker. This method therefore permits to keep the state of the scheduler coherent even when StarPU bypasses the scheduling strategy. \var struct starpu_task *(*starpu_sched_policy::pop_task)(unsigned sched_ctx_id) Get a task from the scheduler. If this method returns NULL, the worker will start sleeping. If later on some task are pushed for this worker, starpu_wake_worker() must be called to wake the worker so it can call the pop_task() method again. The mutex associated to the worker is already taken when this method is called. This method may release it (e.g. for scalability reasons when doing work stealing), but it must acquire it again before taking the decision whether to return a task or NULL, so the atomicity of deciding to return NULL and making the worker actually sleep is preserved. Otherwise in simgrid or blocking driver mode the worker might start sleeping while a task has just been pushed for it. If this method is defined as NULL, the worker will only execute tasks from its local queue. In this case, the push_task method should use the starpu_push_local_task method to assign tasks to the different workers. \var struct starpu_task *(*starpu_sched_policy::pop_every_task)(unsigned sched_ctx_id) Remove all available tasks from the scheduler (tasks are chained by the means of the field starpu_task::prev and starpu_task::next). The mutex associated to the worker is already taken when this method is called. This is currently not used and can be discarded. \var void (*starpu_sched_policy::submit_hook)(struct starpu_task *) Optional field. This method is called when a task is submitted. \var void (*starpu_sched_policy::pre_exec_hook)(struct starpu_task *) Optional field. This method is called every time a task is starting. \var void (*starpu_sched_policy::post_exec_hook)(struct starpu_task *) Optional field. This method is called every time a task has been executed. \var void (*starpu_sched_policy::do_schedule)(unsigned sched_ctx_id) Optional field. This method is called when it is a good time to start scheduling tasks. This is notably called when the application calls starpu_task_wait_for_all or starpu_do_schedule explicitly. \var void (*starpu_sched_policy::add_workers)(unsigned sched_ctx_id, int *workerids, unsigned nworkers) Initialize scheduling structures corresponding to each worker used by the policy. \var void (*starpu_sched_policy::remove_workers)(unsigned sched_ctx_id, int *workerids, unsigned nworkers) Deinitialize scheduling structures corresponding to each worker used by the policy. \var const char *starpu_sched_policy::policy_name Optional field. Name of the policy. \var const char *starpu_sched_policy::policy_description Optional field. Human readable description of the policy. \fn struct starpu_sched_policy **starpu_sched_get_predefined_policies() \ingroup API_Scheduling_Policy Return an NULL-terminated array of all the predefined scheduling policies. \fn void starpu_worker_get_sched_condition(int workerid, starpu_pthread_mutex_t **sched_mutex, starpu_pthread_cond_t **sched_cond) \ingroup API_Scheduling_Policy When there is no available task for a worker, StarPU blocks this worker on a condition variable. This function specifies which condition variable (and the associated mutex) should be used to block (and to wake up) a worker. Note that multiple workers may use the same condition variable. For instance, in the case of a scheduling strategy with a single task queue, the same condition variable would be used to block and wake up all workers. \fn int starpu_wake_worker(int workerid) \ingroup API_Scheduling_Policy In simgrid or blocking driver mode, this should be called by push functions to wake the potential workers that are supposed to pick up the tasks which just have been pushed, otherwise they may remain sleeping. \fn void starpu_worker_get_job_id(struct starpu_task *task) \ingroup API_Scheduling_Policy Return the job id of the given task, i.e. a number that uniquely identifies this task for the local MPI node, and can be found in the various offline execution traces reports. \fn int starpu_sched_set_min_priority(int min_prio) \ingroup API_Scheduling_Policy TODO: check if this is correct Defines the minimum task priority level supported by the scheduling policy. The default minimum priority level is the same as the default priority level which is 0 by convention. The application may access that value by calling the function starpu_sched_get_min_priority(). This function should only be called from the initialization method of the scheduling policy, and should not be used directly from the application. \fn int starpu_sched_set_max_priority(int max_prio) \ingroup API_Scheduling_Policy TODO: check if this is correct Defines the maximum priority level supported by the scheduling policy. The default maximum priority level is 1. The application may access that value by calling the function starpu_sched_get_max_priority(). This function should only be called from the initialization method of the scheduling policy, and should not be used directly from the application. \fn int starpu_sched_get_min_priority(void) \ingroup API_Scheduling_Policy TODO: check if this is correct Returns the current minimum priority level supported by the scheduling policy \fn int starpu_sched_get_max_priority(void) \ingroup API_Scheduling_Policy TODO: check if this is correct Returns the current maximum priority level supported by the scheduling policy \fn int starpu_push_local_task(int workerid, struct starpu_task *task, int back) \ingroup API_Scheduling_Policy The scheduling policy may put tasks directly into a worker’s local queue so that it is not always necessary to create its own queue when the local queue is sufficient. If \p back is not 0, \p task is put at the back of the queue where the worker will pop tasks first. Setting \p back to 0 therefore ensures a FIFO ordering. \fn int starpu_push_task_end(struct starpu_task *task) \ingroup API_Scheduling_Policy This function must be called by a scheduler to notify that the given task has just been pushed. \fn int starpu_worker_can_execute_task(unsigned workerid, struct starpu_task *task, unsigned nimpl) \ingroup API_Scheduling_Policy Check if the worker specified by workerid can execute the codelet. Schedulers need to call it before assigning a task to a worker, otherwise the task may fail to execute. \fn int starpu_worker_can_execute_task_impl(unsigned workerid, struct starpu_task *task, unsigned *impl_mask) \ingroup API_Scheduling_Policy Check if the worker specified by workerid can execute the codelet and returns which implementation numbers can be used. Schedulers need to call it before assigning a task to a worker, otherwise the task may fail to execute. This should be preferred rather than calling starpu_worker_can_execute_task for each and every implementation. It can also be used with impl_mask == NULL to check for at least one implementation without determining which. \fn int starpu_worker_can_execute_task_first_impl(unsigned workerid, struct starpu_task *task, unsigned *nimpl) \ingroup API_Scheduling_Policy Check if the worker specified by workerid can execute the codelet and returns the first implementation which can be used. Schedulers need to call it before assigning a task to a worker, otherwise the task may fail to execute. This should be preferred rather than calling starpu_worker_can_execute_task for each and every implementation. It can also be used with impl_mask == NULL to check for at least one implementation without determining which. \fn uint32_t starpu_task_footprint(struct starpu_perfmodel *model, struct starpu_task *task, struct starpu_perfmodel_arch *arch, unsigned nimpl) \ingroup API_Scheduling_Policy Returns the footprint for a given task, taking into account user-provided perfmodel footprint or size_base functions. \fn uint32_t starpu_task_data_footprint(struct starpu_task *task) \ingroup API_Scheduling_Policy Returns the raw footprint for the data of a given task (without taking into account user-provided functions). \fn double starpu_task_expected_length(struct starpu_task *task, struct starpu_perfmodel_arch *arch, unsigned nimpl) \ingroup API_Scheduling_Policy Returns expected task duration in micro-seconds. \fn double starpu_worker_get_relative_speedup(struct starpu_perfmodel_arch *perf_arch) \ingroup API_Scheduling_Policy Returns an estimated speedup factor relative to CPU speed \fn double starpu_task_expected_data_transfer_time(unsigned memory_node, struct starpu_task *task) \ingroup API_Scheduling_Policy Returns expected data transfer time in micro-seconds. \fn double starpu_data_expected_transfer_time(starpu_data_handle_t handle, unsigned memory_node, enum starpu_data_access_mode mode) \ingroup API_Scheduling_Policy Predict the transfer time (in micro-seconds) to move \p handle to a memory node \fn double starpu_task_expected_energy(struct starpu_task *task, struct starpu_perfmodel_arch *arch, unsigned nimpl) \ingroup API_Scheduling_Policy Returns expected energy consumption in J \fn double starpu_task_expected_conversion_time(struct starpu_task *task, struct starpu_perfmodel_arch *arch, unsigned nimpl) \ingroup API_Scheduling_Policy Returns expected conversion time in ms (multiformat interface only) \fn int starpu_get_prefetch_flag(void) \ingroup API_Scheduling_Policy Whether \ref STARPU_PREFETCH was set \fn int starpu_prefetch_task_input_on_node(struct starpu_task *task, unsigned node) \ingroup API_Scheduling_Policy Prefetch data for a given task on a given node \fn int starpu_idle_prefetch_task_input_on_node(struct starpu_task *task, unsigned node) \ingroup API_Scheduling_Policy Prefetch data for a given task on a given node when the bus is idle \fn void starpu_sched_ctx_worker_shares_tasks_lists(int workerid, int sched_ctx_id) \ingroup API_Scheduling_Policy The scheduling policies indicates if the worker may pop tasks from the list of other workers or if there is a central list with task for all the workers */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/standard_memory_library.doxy000066400000000000000000000160431320135501600263770ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Standard_Memory_Library Standard Memory Library \def starpu_data_malloc_pinned_if_possible \ingroup API_Standard_Memory_Library \deprecated Equivalent to starpu_malloc(). This macro is provided to avoid breaking old codes. \def starpu_data_free_pinned_if_possible \ingroup API_Standard_Memory_Library \deprecated Equivalent to starpu_free(). This macro is provided to avoid breaking old codes. \def STARPU_MALLOC_PINNED \ingroup API_Standard_Memory_Library Value passed to the function starpu_malloc_flags() to indicate the memory allocation should be pinned. \def STARPU_MALLOC_COUNT \ingroup API_Standard_Memory_Library Value passed to the function starpu_malloc_flags() to indicate the memory allocation should be in the limit defined by the environment variables \ref STARPU_LIMIT_CUDA_devid_MEM, \ref STARPU_LIMIT_CUDA_MEM, \ref STARPU_LIMIT_OPENCL_devid_MEM, \ref STARPU_LIMIT_OPENCL_MEM and \ref STARPU_LIMIT_CPU_MEM (see Section \ref HowToLimitMemoryPerNode). If no memory is available, it tries to reclaim memory from StarPU. Memory allocated this way needs to be freed by calling the function starpu_free_flags() with the same flag. \def STARPU_MALLOC_NORECLAIM \ingroup API_Standard_Memory_Library Value passed to the function starpu_malloc_flags() along STARPU_MALLOC_COUNT to indicate that while the memory allocation should be kept in the limits defined for STARPU_MALLOC_COUNT, no reclaiming should be performed by starpu_malloc_flags itself, thus potentially overflowing the memory node a bit. StarPU will reclaim memory after next task termination, according to the STARPU_MINIMUM_AVAILABLE_MEM and STARPU_TARGET_AVAILABLE_MEM environment variables. If STARPU_MEMORY_WAIT is set, no overflowing will happen, starpu_malloc_flags() will wait for other eviction mechanisms to release enough memory. \def STARPU_MALLOC_SIMULATION_FOLDED \ingroup API_Standard_Memory_Library Value passed to the function starpu_malloc_flags() to indicate that when StarPU is using simgrid, the allocation can be "folded", i.e. a memory area is allocated, but its content is actually a replicate of the same memory area, to avoid having to actually allocate that much memory . This thus allows to have a memory area that does not actually consumes memory, to which one can read from and write to normally, but get bogus values. \fn int starpu_malloc_flags(void **A, size_t dim, int flags) \ingroup API_Standard_Memory_Library Performs a memory allocation based on the constraints defined by the given flag. \fn void starpu_malloc_set_align(size_t align) \ingroup API_Standard_Memory_Library This function sets an alignment constraints for starpu_malloc() allocations. align must be a power of two. This is for instance called automatically by the OpenCL driver to specify its own alignment constraints. \fn int starpu_malloc(void **A, size_t dim) \ingroup API_Standard_Memory_Library This function allocates data of the given size \p dim in main memory, and returns the pointer to the allocated data through \p A. It will also try to pin it in CUDA or OpenCL, so that data transfers from this buffer can be asynchronous, and thus permit data transfer and computation overlapping. The allocated buffer must be freed thanks to the starpu_free() function. \fn int starpu_free(void *A) \ingroup API_Standard_Memory_Library This function frees memory which has previously been allocated with starpu_malloc(). \fn int starpu_free_flags(void *A, size_t dim, int flags) \ingroup API_Standard_Memory_Library This function frees memory by specifying its size. The given flags should be consistent with the ones given to starpu_malloc_flags() when allocating the memory. \fn int starpu_memory_pin(void *addr, size_t size) \ingroup API_Standard_Memory_Library This function pins the given memory area, so that CPU-GPU transfers can be done asynchronously with DMAs. The memory must be unpinned with starpu_memory_unpin() before being freed. Returns 0 on success, -1 on error. \fn int starpu_memory_unpin(void *addr, size_t size) \ingroup API_Standard_Memory_Library This function unpins the given memory area previously pinned with starpu_memory_pin(). Returns 0 on success, -1 on error. \fn ssize_t starpu_memory_get_total(unsigned node) \ingroup API_Standard_Memory_Library If a memory limit is defined on the given node (see Section \ref HowToLimitMemoryPerNode), return the amount of total memory on the node. Otherwise return -1. \fn ssize_t starpu_memory_get_available(unsigned node) \ingroup API_Standard_Memory_Library If a memory limit is defined on the given node (see Section \ref HowToLimitMemoryPerNode), return the amount of available memory on the node. Otherwise return -1. \fn int starpu_memory_allocate(unsigned node, size_t size, int flags) \ingroup API_Standard_Memory_Library If a memory limit is defined on the given node (see Section \ref HowToLimitMemoryPerNode), try to allocate some of it. This does not actually allocate memory, but only accounts for it. This can be useful when the application allocates data another way, but want StarPU to be aware of the allocation size e.g. for memory reclaiming. By default, the function returns -ENOMEM if there is not enough room on the given node. \p flags can be either STARPU_MEMORY_WAIT or STARPU_MEMORY_OVERFLOW to change this. \fn void starpu_memory_deallocate(unsigned node, size_t size) \ingroup API_Standard_Memory_Library If a memory limit is defined on the given node (see Section \ref HowToLimitMemoryPerNode), free some of it. This does not actually free memory, but only accounts for it, like starpu_memory_allocate(). The amount does not have to be exactly the same as what was passed to starpu_memory_allocate(), only the eventual amount needs to be the same, i.e. one call to starpu_memory_allocate() can be followed by several calls to starpu_memory_deallocate() to declare the deallocation piece by piece. \fn void starpu_memory_wait_available(unsigned node, size_t size) \ingroup API_Standard_Memory_Library If a memory limit is defined on the given node (see Section \ref HowToLimitMemoryPerNode), this will wait for \p size bytes to become available on \p node. Of course, since another thread may be allocating memory concurrently, this does not necessarily mean that this amount will be actually available, just that it was reached. To atomically wait for some amount of memory and reserve it, starpu_memory_allocate() should be used with the STARPU_MEMORY_WAIT flag. \def STARPU_MEMORY_WAIT \ingroup API_Standard_Memory_Library Value passed to starpu_memory_allocate() to specify that the function should wait for the requested amount of memory to become available, and atomically allocate it. \def STARPU_MEMORY_OVERFLOW \ingroup API_Standard_Memory_Library Value passed to starpu_memory_allocate() to specify that the function should allocate the amount of memory, even if that means overflowing the total size of the memory node. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/task_bundles.doxy000066400000000000000000000052421320135501600241400ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Task_Bundles Task Bundles \typedef starpu_task_bundle_t \ingroup API_Task_Bundles Opaque structure describing a list of tasks that should be scheduled on the same worker whenever it’s possible. It must be considered as a hint given to the scheduler as there is no guarantee that they will be executed on the same worker. \fn void starpu_task_bundle_create(starpu_task_bundle_t *bundle) \ingroup API_Task_Bundles Factory function creating and initializing \p bundle, when the call returns, memory needed is allocated and \p bundle is ready to use. \fn int starpu_task_bundle_insert(starpu_task_bundle_t bundle, struct starpu_task *task) \ingroup API_Task_Bundles Insert \p task in \p bundle. Until \p task is removed from \p bundle its expected length and data transfer time will be considered along those of the other tasks of bundle. This function must not be called if \p bundle is already closed and/or \p task is already submitted. On success, it returns 0. There are two cases of error : if \p bundle is already closed it returns -EPERM, if \p task was already submitted it returns -EINVAL. \fn int starpu_task_bundle_remove(starpu_task_bundle_t bundle, struct starpu_task *task) \ingroup API_Task_Bundles Remove \p task from \p bundle. Of course \p task must have been previously inserted in \p bundle. This function must not be called if \p bundle is already closed and/or \p task is already submitted. Doing so would result in undefined behaviour. On success, it returns 0. If \p bundle is already closed it returns -ENOENT. \fn void starpu_task_bundle_close(starpu_task_bundle_t bundle) \ingroup API_Task_Bundles Inform the runtime that the user will not modify \p bundle anymore, it means no more inserting or removing task. Thus the runtime can destroy it when possible. \fn double starpu_task_bundle_expected_length(starpu_task_bundle_t bundle, struct starpu_perfmodel_arch *arch, unsigned nimpl) \ingroup API_Task_Bundles Return the expected duration of \p bundle in micro-seconds. \fn double starpu_task_bundle_expected_energy(starpu_task_bundle_t bundle, struct starpu_perfmodel_arch *arch, unsigned nimpl) \ingroup API_Task_Bundles Return the expected energy consumption of \p bundle in J. \fn double starpu_task_bundle_expected_data_transfer_time(starpu_task_bundle_t bundle, unsigned memory_node) \ingroup API_Task_Bundles Return the time (in micro-seconds) expected to transfer all data used within \p bundle. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/task_lists.doxy000066400000000000000000000045151320135501600236440ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Task_Lists Task Lists \struct starpu_task_list Stores a double-chained list of tasks \ingroup API_Task_Lists \var struct starpu_task *starpu_task_list::head head of the list \var struct starpu_task *starpu_task_list::tail tail of the list \fn void starpu_task_list_init(struct starpu_task_list *list) \ingroup API_Task_Lists Initialize a list structure \fn void starpu_task_list_push_front(struct starpu_task_list *list, struct starpu_task *task) \ingroup API_Task_Lists Push \p task at the front of \p list \fn void starpu_task_list_push_back(struct starpu_task_list *list, struct starpu_task *task) \ingroup API_Task_Lists Push \p task at the back of \p list \fn struct starpu_task *starpu_task_list_front(struct starpu_task_list *list) \ingroup API_Task_Lists Get the front of \p list (without removing it) \fn struct starpu_task *starpu_task_list_back(struct starpu_task_list *list) \ingroup API_Task_Lists Get the back of \p list (without removing it) \fn int starpu_task_list_empty(struct starpu_task_list *list) \ingroup API_Task_Lists Test if \p list is empty \fn void starpu_task_list_erase(struct starpu_task_list *list, struct starpu_task *task) \ingroup API_Task_Lists Remove \p task from \p list \fn struct starpu_task *starpu_task_list_pop_front(struct starpu_task_list *list) \ingroup API_Task_Lists Remove the element at the front of \p list \fn struct starpu_task *starpu_task_list_pop_back(struct starpu_task_list *list) \ingroup API_Task_Lists Remove the element at the back of \p list \fn struct starpu_task *starpu_task_list_begin(struct starpu_task_list *list) \ingroup API_Task_Lists Get the first task of \p list. \fn struct starpu_task *starpu_task_list_end(struct starpu_task_list *list) \ingroup API_Task_Lists Get the end of \p list. \fn struct starpu_task *starpu_task_list_next(struct starpu_task *task) \ingroup API_Task_Lists Get the next task of \p list. This is not erase-safe. \fn int starpu_task_list_ismember(struct starpu_task_list *list, struct starpu_task *look) \ingroup API_Task_Lists Test whether the given task \p look is contained in the \p list. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/threads.doxy000066400000000000000000000323011320135501600231100ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Threads Threads \brief This section describes the thread facilities provided by StarPU. The thread function are either implemented on top of the pthread library or the Simgrid library when the simulated performance mode is enabled (\ref SimGridSupport). \def STARPU_PTHREAD_CREATE_ON \ingroup API_Threads This macro calls the function starpu_pthread_create_on() and aborts on error. \def STARPU_PTHREAD_CREATE \ingroup API_Threads This macro calls the function starpu_pthread_create() and aborts on error. \def STARPU_PTHREAD_MUTEX_INIT \ingroup API_Threads This macro calls the function starpu_pthread_mutex_init() and aborts on error. \def STARPU_PTHREAD_MUTEX_DESTROY \ingroup API_Threads This macro calls the function starpu_pthread_mutex_destroy() and aborts on error. \def STARPU_PTHREAD_MUTEX_LOCK \ingroup API_Threads This macro calls the function starpu_pthread_mutex_lock() and aborts on error. \def STARPU_PTHREAD_MUTEX_UNLOCK \ingroup API_Threads This macro calls the function starpu_pthread_mutex_unlock() and aborts on error. \def STARPU_PTHREAD_KEY_CREATE \ingroup API_Threads This macro calls the function starpu_pthread_key_create() and aborts on error. \def STARPU_PTHREAD_KEY_DELETE \ingroup API_Threads This macro calls the function starpu_pthread_key_delete() and aborts on error. \def STARPU_PTHREAD_SETSPECIFIC \ingroup API_Threads This macro calls the function starpu_pthread_setspecific() and aborts on error. \def STARPU_PTHREAD_GETSPECIFIC \ingroup API_Threads This macro calls the function starpu_pthread_getspecific() and aborts on error. \def STARPU_PTHREAD_RWLOCK_INIT \ingroup API_Threads This macro calls the function starpu_pthread_rwlock_init() and aborts on error. \def STARPU_PTHREAD_RWLOCK_RDLOCK \ingroup API_Threads This macro calls the function starpu_pthread_rwlock_rdlock() and aborts on error. \def STARPU_PTHREAD_RWLOCK_WRLOCK \ingroup API_Threads This macro calls the function starpu_pthread_rwlock_wrlock() and aborts on error. \def STARPU_PTHREAD_RWLOCK_UNLOCK \ingroup API_Threads This macro calls the function starpu_pthread_rwlock_unlock() and aborts on error. \def STARPU_PTHREAD_RWLOCK_DESTROY \ingroup API_Threads This macro calls the function starpu_pthread_rwlock_destroy() and aborts on error. \def STARPU_PTHREAD_COND_INIT \ingroup API_Threads This macro calls the function starpu_pthread_cond_init() and aborts on error. \def STARPU_PTHREAD_COND_DESTROY \ingroup API_Threads This macro calls the function starpu_pthread_cond_destroy() and aborts on error. \def STARPU_PTHREAD_COND_SIGNAL \ingroup API_Threads This macro calls the function starpu_pthread_cond_signal() and aborts on error. \def STARPU_PTHREAD_COND_BROADCAST \ingroup API_Threads This macro calls the function starpu_pthread_cond_broadcast() and aborts on error. \def STARPU_PTHREAD_COND_WAIT \ingroup API_Threads This macro calls the function starpu_pthread_cond_wait() and aborts on error. \def STARPU_PTHREAD_BARRIER_INIT \ingroup API_Threads This macro calls the function starpu_pthread_barrier_init() and aborts on error. \def STARPU_PTHREAD_BARRIER_DESTROY \ingroup API_Threads This macro calls the function starpu_pthread_barrier_destroy() and aborts on error. \def STARPU_PTHREAD_BARRIER_WAIT \ingroup API_Threads This macro calls the function starpu_pthread_barrier_wait() and aborts on error. \fn int starpu_pthread_create_on(char *name, starpu_pthread_t *thread, const starpu_pthread_attr_t *attr, void *(*start_routine) (void *), void *arg, int where) \ingroup API_Threads \fn int starpu_pthread_create(starpu_pthread_t *thread, const starpu_pthread_attr_t *attr, void *(*start_routine) (void *), void *arg) \ingroup API_Threads This function starts a new thread in the calling process. The new thread starts execution by invoking \p start_routine; \p arg is passed as the sole argument of \p start_routine. \fn int starpu_pthread_join(starpu_pthread_t thread, void **retval) \ingroup API_Threads This function waits for the thread specified by \p thread to terminate. If that thread has already terminated, then the function returns immediately. The thread specified by \p thread must be joinable. \fn int starpu_pthread_exit(void *retval) \ingroup API_Threads This function terminates the calling thread and returns a value via \p retval that (if the thread is joinable) is available to another thread in the same process that calls starpu_pthread_join(). \fn int starpu_pthread_attr_init(starpu_pthread_attr_t *attr) \ingroup API_Threads This function initializes the thread attributes object pointed to by \p attr with default attribute values. It does not do anything when the simulated performance mode is enabled (\ref SimGridSupport). \fn int starpu_pthread_attr_destroy(starpu_pthread_attr_t *attr) \ingroup API_Threads This function destroys a thread attributes object which is no longer required. Destroying a thread attributes object has no effect on threads that were created using that object. It does not do anything when the simulated performance mode is enabled (\ref SimGridSupport). \fn int starpu_pthread_attr_setdetachstate(starpu_pthread_attr_t *attr, int detachstate) \ingroup API_Threads This function sets the detach state attribute of the thread attributes object referred to by \p attr to the value specified in \p detachstate. The detach state attribute determines whether a thread created using the thread attributes object \p attr will be created in a joinable or a detached state. It does not do anything when the simulated performance mode is enabled (\ref SimGridSupport). \fn int starpu_pthread_mutex_init(starpu_pthread_mutex_t *mutex, const starpu_pthread_mutexattr_t *mutexattr) \ingroup API_Threads This function initializes the mutex object pointed to by \p mutex according to the mutex attributes specified in \p mutexattr. If \p mutexattr is NULL, default attributes are used instead. \fn int starpu_pthread_mutex_destroy(starpu_pthread_mutex_t *mutex) \ingroup API_Threads This function destroys a mutex object, freeing the resources it might hold. The mutex must be unlocked on entrance. \fn int starpu_pthread_mutex_lock(starpu_pthread_mutex_t *mutex) \ingroup API_Threads This function locks the given mutex. If the mutex is currently unlocked, it becomes locked and owned by the calling thread, and the function returns immediately. If the mutex is already locked by another thread, the function suspends the calling thread until the mutex is unlocked. This function also produces trace when the configure option \ref enable-fxt-lock "--enable-fxt-lock" is enabled. \fn int starpu_pthread_mutex_unlock(starpu_pthread_mutex_t *mutex) \ingroup API_Threads This function unlocks the given mutex. The mutex is assumed to be locked and owned by the calling thread on entrance to starpu_pthread_mutex_unlock(). This function also produces trace when the configure option \ref enable-fxt-lock "--enable-fxt-lock" is enabled. \fn int starpu_pthread_mutex_trylock(starpu_pthread_mutex_t *mutex) \ingroup API_Threads This function behaves identically to starpu_pthread_mutex_lock(), except that it does not block the calling thread if the mutex is already locked by another thread (or by the calling thread in the case of a ``fast'' mutex). Instead, the function returns immediately with the error code EBUSY. This function also produces trace when the configure option \ref enable-fxt-lock "--enable-fxt-lock" is enabled. \typedef STARPU_PTHREAD_MUTEX_INITIALIZER \ingroup API_Threads This macro initializes the mutex given in parameter. \fn int starpu_pthread_mutexattr_gettype(const starpu_pthread_mutexattr_t *attr, int *type) \ingroup API_Threads todo \fn int starpu_pthread_mutexattr_settype(starpu_pthread_mutexattr_t *attr, int type) \ingroup API_Threads todo \fn int starpu_pthread_mutexattr_destroy(starpu_pthread_mutexattr_t *attr) \ingroup API_Threads todo \fn int starpu_pthread_mutexattr_init(starpu_pthread_mutexattr_t *attr) \ingroup API_Threads todo \fn int starpu_pthread_key_create(starpu_pthread_key_t *key, void (*destr_function) (void *)) \ingroup API_Threads This function allocates a new TSD key. The key is stored in the location pointed to by \p key. \fn int starpu_pthread_key_delete(starpu_pthread_key_t key) \ingroup API_Threads This function deallocates a TSD key. It does not check whether non-NULL values are associated with that key in the currently executing threads, nor call the destructor function associated with the key. \fn int starpu_pthread_setspecific(starpu_pthread_key_t key, const void *pointer) \ingroup API_Threads This function changes the value associated with \p key in the calling thread, storing the given \p pointer instead. \fn void *starpu_pthread_getspecific(starpu_pthread_key_t key) \ingroup API_Threads This function returns the value associated with \p key on success, and NULL on error. \typedef STARPU_PTHREAD_COND_INITIALIZER \ingroup API_Threads This macro initializes the condition variable given in parameter. \fn int starpu_pthread_cond_init(starpu_pthread_cond_t *cond, starpu_pthread_condattr_t *cond_attr) \ingroup API_Threads This function initializes the condition variable \p cond, using the condition attributes specified in \p cond_attr, or default attributes if \p cond_attr is NULL. \fn int starpu_pthread_cond_signal(starpu_pthread_cond_t *cond) \ingroup API_Threads This function restarts one of the threads that are waiting on the condition variable \p cond. If no threads are waiting on \p cond, nothing happens. If several threads are waiting on \p cond, exactly one is restarted, but it not specified which. \fn int starpu_pthread_cond_broadcast(starpu_pthread_cond_t *cond) \ingroup API_Threads This function restarts all the threads that are waiting on the condition variable \p cond. Nothing happens if no threads are waiting on cond. \fn int starpu_pthread_cond_wait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex) \ingroup API_Threads This function atomically unlocks the mutex (as per starpu_pthread_mutex_unlock()) and waits for the condition variable \p cond to be signaled. The thread execution is suspended and does not consume any CPU time until the condition variable is signaled. The mutex must be locked by the calling thread on entrance to starpu_pthread_cond_wait(). Before returning to the calling thread, the function re-acquires mutex (as per starpu_pthread_mutex_lock()). This function also produces trace when the configure option \ref enable-fxt-lock "--enable-fxt-lock" is enabled. \fn int starpu_pthread_cond_timedwait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex, const struct timespec *abstime) \ingroup API_Threads This function atomically unlocks \p mutex and waits on \p cond, as starpu_pthread_cond_wait() does, but it also bounds the duration of the wait. \fn int starpu_pthread_cond_destroy(starpu_pthread_cond_t *cond) \ingroup API_Threads This function destroys a condition variable, freeing the resources it might hold. No threads must be waiting on the condition variable on entrance to the function. \fn int starpu_pthread_rwlock_init(starpu_pthread_rwlock_t *rwlock, const starpu_pthread_rwlockattr_t *attr) \ingroup API_Threads This function is the same as starpu_pthread_mutex_init(). \fn int starpu_pthread_rwlock_destroy(starpu_pthread_rwlock_t *rwlock) \ingroup API_Threads This function is the same as starpu_pthread_mutex_destroy(). \fn int starpu_pthread_rwlock_rdlock(starpu_pthread_rwlock_t *rwlock) \ingroup API_Threads This function is the same as starpu_pthread_mutex_lock(). \fn int starpu_pthread_rwlock_tryrdlock(starpu_pthread_rwlock_t *rwlock) \ingroup API_Threads todo \fn int starpu_pthread_rwlock_wrlock(starpu_pthread_rwlock_t *rwlock) \ingroup API_Threads This function is the same as starpu_pthread_mutex_lock(). \fn int starpu_pthread_rwlock_trywrlock(starpu_pthread_rwlock_t *rwlock) \ingroup API_Threads todo \fn int starpu_pthread_rwlock_unlock(starpu_pthread_rwlock_t *rwlock) \ingroup API_Threads This function is the same as starpu_pthread_mutex_unlock(). \fn int starpu_pthread_barrier_init(starpu_pthread_barrier_t *barrier, const starpu_pthread_barrierattr_t *attr, unsigned count) \ingroup API_Threads todo \fn int starpu_pthread_barrier_destroy(starpu_pthread_barrier_t *barrier) \ingroup API_Threads todo \fn int starpu_pthread_barrier_wait(starpu_pthread_barrier_t *barrier) \ingroup API_Threads todo \fn int starpu_pthread_spin_init(starpu_pthread_spinlock_t *lock, int pshared) \ingroup API_Threads todo \fn int starpu_pthread_spin_destroy(starpu_pthread_spinlock_t *lock) \ingroup API_Threads todo \fn int starpu_pthread_spin_lock(starpu_pthread_spinlock_t *lock) \ingroup API_Threads todo \fn int starpu_pthread_spin_trylock(starpu_pthread_spinlock_t *lock) \ingroup API_Threads todo \fn int starpu_pthread_spin_unlock(starpu_pthread_spinlock_t *lock) \ingroup API_Threads todo \fn void starpu_sleep(float nb_sec) \ingroup API_Threads This is the same as calling Unix' sleep function, except that it takes a float to allow sub-second sleeping, and when StarPU is compiled in simgrid mode it does not really sleep but just makes simgrid record that the thread has taken some time to sleep. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/toolbox.doxy000066400000000000000000000065321320135501600231530ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Toolbox Toolbox \brief The following macros allow to make GCC extensions portable, and to have a code which can be compiled with any C compiler. \def STARPU_GNUC_PREREQ \ingroup API_Toolbox Return true (non-zero) if GCC version MAJ.MIN or later is being used (macro taken from glibc.) \def STARPU_UNLIKELY \ingroup API_Toolbox When building with a GNU C Compiler, this macro allows programmers to mark an expression as unlikely. \def STARPU_LIKELY \ingroup API_Toolbox When building with a GNU C Compiler, this macro allows programmers to mark an expression as likely. \def STARPU_ATTRIBUTE_UNUSED \ingroup API_Toolbox When building with a GNU C Compiler, this macro is defined to __attribute__((unused)) \def STARPU_ATTRIBUTE_INTERNAL \ingroup API_Toolbox When building with a GNU C Compiler, this macro is defined to __attribute__((visibility ("internal"))) \def STARPU_ATTRIBUTE_MALLOC \ingroup API_Toolbox When building with a GNU C Compiler, this macro is defined to __attribute__((malloc)) \def STARPU_ATTRIBUTE_WARN_UNUSED_RESULT \ingroup API_Toolbox When building with a GNU C Compiler, this macro is defined to __attribute__((warn_unused_result)) \def STARPU_ATTRIBUTE_PURE \ingroup API_Toolbox When building with a GNU C Compiler, this macro is defined to __attribute__((pure)) \def STARPU_ATTRIBUTE_ALIGNED \ingroup API_Toolbox When building with a GNU C Compiler, this macro is defined to__attribute__((aligned(size))) \def STARPU_WARN_UNUSED_RESULT \ingroup API_Toolbox When building with a GNU C Compiler, this macro is defined to__attribute__((__warn_unused_result__)) \def STARPU_POISON_PTR \ingroup API_Toolbox This macro defines a value which can be used to mark pointers as invalid values. \def STARPU_MIN \ingroup API_Toolbox This macro returns the min of the two parameters. \def STARPU_MAX \ingroup API_Toolbox This macro returns the max of the two parameters. \def STARPU_ASSERT \ingroup API_Toolbox Unless StarPU has been configured with the option \ref enable-fast "--enable-fast", this macro will abort if the expression is false. \def STARPU_ASSERT_MSG \ingroup API_Toolbox Unless StarPU has been configured with the option \ref enable-fast "--enable-fast", this macro will abort if the expression is false. The given message will be displayed. \def STARPU_ABORT \ingroup API_Toolbox This macro aborts the program. \def STARPU_ABORT_MSG \ingroup API_Toolbox This macro aborts the program, and displays the given message. \def STARPU_CHECK_RETURN_VALUE \ingroup API_Toolbox If \p err has a value which is not 0, the given message is displayed before aborting. \def STARPU_CHECK_RETURN_VALUE_IS \ingroup API_Toolbox If \p err has a value which is not \p value, the given message is displayed before aborting. \def STARPU_RMB \ingroup API_Toolbox This macro can be used to do a synchronization. \def STARPU_WMB \ingroup API_Toolbox This macro can be used to do a synchronization. \fn int starpu_get_env_number(const char *str) \ingroup API_Toolbox If \p str is the name of a existing environment variable which is defined to an integer, the function returns the value of the integer. It returns 0 otherwise. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/top.doxy000066400000000000000000000201071320135501600222610ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_StarPUTop_Interface StarPU-Top Interface \enum starpu_top_data_type \ingroup API_StarPUTop_Interface StarPU-Top Data type \var starpu_top_data_type::STARPU_TOP_DATA_BOOLEAN \ingroup API_StarPUTop_Interface todo \var starpu_top_data_type::STARPU_TOP_DATA_INTEGER \ingroup API_StarPUTop_Interface todo \var starpu_top_data_type::STARPU_TOP_DATA_FLOAT \ingroup API_StarPUTop_Interface todo \enum starpu_top_param_type \ingroup API_StarPUTop_Interface StarPU-Top Parameter type \var starpu_top_param_type::STARPU_TOP_PARAM_BOOLEAN \ingroup API_StarPUTop_Interface todo \var starpu_top_param_type::STARPU_TOP_PARAM_INTEGER \ingroup API_StarPUTop_Interface todo \var starpu_top_param_type::STARPU_TOP_PARAM_FLOAT \ingroup API_StarPUTop_Interface todo \var starpu_top_param_type::STARPU_TOP_PARAM_ENUM \ingroup API_StarPUTop_Interface todo \enum starpu_top_message_type \ingroup API_StarPUTop_Interface StarPU-Top Message type \var starpu_top_message_type::TOP_TYPE_GO \ingroup API_StarPUTop_Interface todo \var starpu_top_message_type::TOP_TYPE_SET \ingroup API_StarPUTop_Interface todo \var starpu_top_message_type::TOP_TYPE_CONTINUE \ingroup API_StarPUTop_Interface todo \var starpu_top_message_type::TOP_TYPE_ENABLE \ingroup API_StarPUTop_Interface todo \var starpu_top_message_type::TOP_TYPE_DISABLE \ingroup API_StarPUTop_Interface todo \var starpu_top_message_type::TOP_TYPE_DEBUG \ingroup API_StarPUTop_Interface todo \var starpu_top_message_type::TOP_TYPE_UNKNOW \ingroup API_StarPUTop_Interface todo \struct starpu_top_data todo \ingroup API_StarPUTop_Interface \var unsigned int starpu_top_data::id todo \var const char *starpu_top_data::name todo \var int starpu_top_data::int_min_value todo \var int starpu_top_data::int_max_value todo \var double starpu_top_data::double_min_value todo \var double starpu_top_data::double_max_value todo \var int starpu_top_data::active todo \var enum starpu_top_data_type starpu_top_data::type todo \var struct starpu_top_data *starpu_top_data::next todo \struct starpu_top_param todo \ingroup API_StarPUTop_Interface \var unsigned int starpu_top_param::id todo \var const char *starpu_top_param::name todo \var enum starpu_top_param_type starpu_top_param::type todo \var void *starpu_top_param::value todo \var char **starpu_top_param::enum_values only for enum type can be NULL \var int starpu_top_param::nb_values todo \var void (*starpu_top_param::callback)(struct starpu_top_param*) todo \var int starpu_top_param::int_min_value only for integer type \var int starpu_top_param::int_max_value todo \var double starpu_top_param::double_min_value only for double type \var double starpu_top_param::double_max_value todo \var struct starpu_top_param *starpu_top_param::next todo @name Functions to call before the initialisation \ingroup API_StarPUTop_Interface \fn struct starpu_top_data *starpu_top_add_data_boolean(const char *data_name, int active) \ingroup API_StarPUTop_Interface This fonction register a data named data_name of type boolean. If \p active=0, the value will NOT be displayed to user by default. Any other value will make the value displayed by default. \fn struct starpu_top_data *starpu_top_add_data_integer(const char *data_name, int minimum_value, int maximum_value, int active) \ingroup API_StarPUTop_Interface This fonction register a data named \p data_name of type integer. The minimum and maximum value will be usefull to define the scale in UI. If \p active=0, the value will NOT be displayed to user by default. Any other value will make the value displayed by default. \fn struct starpu_top_data *starpu_top_add_data_float(const char *data_name, double minimum_value, double maximum_value, int active) \ingroup API_StarPUTop_Interface This fonction register a data named data_name of type float. The minimum and maximum value will be usefull to define the scale in UI. If \p active=0, the value will NOT be displayed to user by default. Any other value will make the value displayed by default. \fn struct starpu_top_param *starpu_top_register_parameter_boolean(const char *param_name, int *parameter_field, void (*callback)(struct starpu_top_param*)) \ingroup API_StarPUTop_Interface This fonction register a parameter named \p parameter_name, of type boolean. The \p callback fonction will be called when the parameter is modified by UI, and can be null. \fn struct starpu_top_param *starpu_top_register_parameter_float(const char *param_name, double *parameter_field, double minimum_value, double maximum_value, void (*callback)(struct starpu_top_param*)) \ingroup API_StarPUTop_Interface his fonction register a parameter named \p param_name, of type integer. Minimum and maximum value will be used to prevent user seting incorrect value. The \p callback fonction will be called when the parameter is modified by UI, and can be null. \fn struct starpu_top_param *starpu_top_register_parameter_integer(const char *param_name, int *parameter_field, int minimum_value, int maximum_value, void (*callback)(struct starpu_top_param*)) \ingroup API_StarPUTop_Interface This fonction register a parameter named \p param_name, of type float. Minimum and maximum value will be used to prevent user seting incorrect value. The \p callback fonction will be called when the parameter is modified by UI, and can be null. \fn struct starpu_top_param *starpu_top_register_parameter_enum(const char *param_name, int *parameter_field, char **values, int nb_values, void (*callback)(struct starpu_top_param*)) \ingroup API_StarPUTop_Interface This fonction register a parameter named \p param_name, of type enum. Minimum and maximum value will be used to prevent user seting incorrect value. The \p callback fonction will be called when the parameter is modified by UI, and can be null. @name Initialisation \ingroup API_StarPUTop_Interface \fn void starpu_top_init_and_wait(const char *server_name) \ingroup API_StarPUTop_Interface This function must be called when all parameters and data have been registered AND initialised (for parameters). This function will wait for a TOP to connect, send initialisation sentences, and wait for the GO message. @name To call after initialisation \ingroup API_StarPUTop_Interface \fn void starpu_top_update_parameter(const struct starpu_top_param *param) \ingroup API_StarPUTop_Interface This function should be called after every modification of a parameter from something other than starpu_top. This fonction notice UI that the configuration changed. \fn void starpu_top_update_data_boolean(const struct starpu_top_data *data, int value) \ingroup API_StarPUTop_Interface This function updates the value of the starpu_top_data on UI. \fn void starpu_top_update_data_integer(const struct starpu_top_data *data, int value) \ingroup API_StarPUTop_Interface This function updates the value of the starpu_top_data on UI. \fn void starpu_top_update_data_float(const struct starpu_top_data *data, double value) \ingroup API_StarPUTop_Interface This function updates the value of the starpu_top_data on UI. \fn void starpu_top_task_prevision(struct starpu_task *task, int devid, unsigned long long start, unsigned long long end) \ingroup API_StarPUTop_Interface This function notifies UI than the task have been planed to run from start to end, on computation-core. \fn void starpu_top_debug_log(const char *message) \ingroup API_StarPUTop_Interface This function is useful in debug mode. The starpu developper doesn't need to check if the debug mode is active. This is checked by starpu_top itsefl. It just send a message to display by UI. \fn void starpu_top_debug_lock(const char *message) \ingroup API_StarPUTop_Interface This function is useful in debug mode. The starpu developper doesn't need to check if the debug mode is active. This is checked by starpu_top itsefl. It send a message and wait for a continue message from UI to return. The lock (wich create a stop-point) should be called only by the main thread. Calling it from more than one thread is not supported. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/tree.doxy000066400000000000000000000021001320135501600224070ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2014, 2016 CNRS * See the file version.doxy for copying conditions. */ /*! \defgroup API_Tree Tree \brief This section describes the tree facilities provided by StarPU. \struct starpu_tree \ingroup API_Tree \var struct starpu_tree **starpu_tree::nodes todo \var struct starpu_tree *starpu_tree::father todo \var int starpu_tree::arity todo \var int starpu_tree::id todo \var int starpu_tree::level todo \var int starpu_tree::is_pu todo \fn void starpu_tree_reset_visited(struct starpu_tree *tree, char *visited) \ingroup API_Tree todo \fn void starpu_tree_insert(struct starpu_tree *tree, int id, int level, int is_pu, int arity, struct starpu_tree *father) \ingroup API_Tree todo \fn struct starpu_tree *starpu_tree_get(struct starpu_tree *tree, int id) \ingroup API_Tree todo \fn struct starpu_tree *starpu_tree_get_neighbour(struct starpu_tree *tree, struct starpu_tree *node, char *visited, char *present) \ingroup API_Tree todo \fn void starpu_tree_free(struct starpu_tree *tree) \ingroup API_Tree todo */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/versioning.doxy000066400000000000000000000015721320135501600236470ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Versioning Versioning \def STARPU_MAJOR_VERSION \ingroup API_Versioning Define the major version of StarPU. This is the version used when compiling the application. \def STARPU_MINOR_VERSION \ingroup API_Versioning Define the minor version of StarPU. This is the version used when compiling the application. \def STARPU_RELEASE_VERSION \ingroup API_Versioning Define the release version of StarPU. This is the version used when compiling the application. \fn void starpu_get_version(int *major, int *minor, int *release) \ingroup API_Versioning Return as 3 integers the version of StarPU used when running the application. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/api/workers.doxy000066400000000000000000000246721320135501600231660ustar00rootroot00000000000000/* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011 Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016 CNRS * Copyright (C) 2011, 2012 INRIA * See the file version.doxy for copying conditions. */ /*! \defgroup API_Workers_Properties Workers’ Properties \def STARPU_NMAXWORKERS \ingroup API_Workers_Properties Define the maximum number of workers managed by StarPU. \def STARPU_MAXCPUS \ingroup API_Workers_Properties Define the maximum number of CPU workers managed by StarPU. The default value can be modified at configure by using the option \ref enable-maxcpus "--enable-maxcpus". \def STARPU_MAXNODES \ingroup API_Workers_Properties Define the maximum number of memory nodes managed by StarPU. The default value can be modified at configure by using the option \ref enable-maxnodes "--enable-maxnodes". Reducing it allows to considerably reduce memory used by StarPU data structures. \enum starpu_node_kind \ingroup API_Workers_Properties TODO \var starpu_node_kind::STARPU_UNUSED \ingroup API_Workers_Properties TODO \ingroup API_Workers_Properties \var starpu_node_kind::STARPU_CPU_RAM \ingroup API_Workers_Properties TODO \var starpu_node_kind::STARPU_CUDA_RAM \ingroup API_Workers_Properties TODO \var starpu_node_kind::STARPU_OPENCL_RAM \ingroup API_Workers_Properties TODO \var starpu_node_kind::STARPU_MIC_RAM \ingroup API_Workers_Properties TODO \var starpu_node_kind::STARPU_SCC_RAM \ingroup API_Workers_Properties This node kind is not used anymore, but implementations in interfaces will be useful for MPI. \var starpu_node_kind::STARPU_SCC_SHM \ingroup API_Workers_Properties TODO \enum starpu_worker_archtype \ingroup API_Workers_Properties Worker Architecture Type \var starpu_worker_archtype::STARPU_ANY_WORKER \ingroup API_Workers_Properties any worker, used in the hypervisor \var starpu_worker_archtype::STARPU_CPU_WORKER \ingroup API_Workers_Properties CPU core \var starpu_worker_archtype::STARPU_CUDA_WORKER \ingroup API_Workers_Properties NVIDIA CUDA device \var starpu_worker_archtype::STARPU_OPENCL_WORKER \ingroup API_Workers_Properties OpenCL device \var starpu_worker_archtype::STARPU_MIC_WORKER \ingroup API_Workers_Properties Intel MIC device \var starpu_worker_archtype::STARPU_SCC_WORKER \ingroup API_Workers_Properties Intel SCC device \struct starpu_worker_collection \ingroup API_Workers_Properties A scheduling context manages a collection of workers that can be memorized using different data structures. Thus, a generic structure is available in order to simplify the choice of its type. Only the list data structure is available but further data structures(like tree) implementations are foreseen. \var void *starpu_worker_collection::workerids The workerids managed by the collection \var unsigned starpu_worker_collection::nworkers The number of workers in the collection \var enum starpu_worker_collection_type starpu_worker_collection::type The type of structure (currently ::STARPU_WORKER_LIST is the only one available) \var unsigned (*starpu_worker_collection::has_next)(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it) Checks if there is another element in collection \var int (*starpu_worker_collection::get_next)(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it) return the next element in the collection \var int (*starpu_worker_collection::add)(struct starpu_worker_collection *workers, int worker) add a new element in the collection \var int (*starpu_worker_collection::remove)(struct starpu_worker_collection *workers, int worker) remove an element from the collection \var void (*starpu_worker_collection::init)(struct starpu_worker_collection *workers) Initialize the collection \var void (*starpu_worker_collection::deinit)(struct starpu_worker_collection *workers) Deinitialize the colection \var void (*starpu_worker_collection::init_iterator)(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it) Initialize the cursor if there is one \enum starpu_worker_collection_type \ingroup API_Workers_Properties Types of structures the worker collection can implement \var starpu_worker_collection_type::STARPU_WORKER_LIST \ingroup API_Workers_Properties The collection is an array \struct starpu_sched_ctx_iterator \ingroup API_Workers_Properties Structure needed to iterate on the collection \var int starpu_sched_ctx_iterator::cursor The index of the current worker in the collection, needed when iterating on the collection. \fn unsigned starpu_worker_get_count(void) \ingroup API_Workers_Properties This function returns the number of workers (i.e. processing units executing StarPU tasks). The returned value should be at most \ref STARPU_NMAXWORKERS. \fn int starpu_worker_get_count_by_type(enum starpu_worker_archtype type) \ingroup API_Workers_Properties Returns the number of workers of the given type. A positive (or NULL) value is returned in case of success, -EINVAL indicates that the type is not valid otherwise. \fn unsigned starpu_cpu_worker_get_count(void) \ingroup API_Workers_Properties This function returns the number of CPUs controlled by StarPU. The returned value should be at most \ref STARPU_MAXCPUS. \fn unsigned starpu_cuda_worker_get_count(void) \ingroup API_Workers_Properties This function returns the number of CUDA devices controlled by StarPU. The returned value should be at most \ref STARPU_MAXCUDADEVS. \fn unsigned starpu_mic_worker_get_count(void) \ingroup API_Workers_Properties This function returns the number of MIC workers controlled by StarPU. \fn unsigned starpu_mic_device_get_count(void) \ingroup API_Workers_Properties This function returns the number of MIC devices controlled by StarPU. The returned value should be at most \ref STARPU_MAXMICDEVS. \fn unsigned starpu_scc_worker_get_count(void) \ingroup API_Workers_Properties This function returns the number of SCC devices controlled by StarPU. The returned value should be at most \ref STARPU_MAXSCCDEVS. \fn unsigned starpu_opencl_worker_get_count(void) \ingroup API_Workers_Properties This function returns the number of OpenCL devices controlled by StarPU. The returned value should be at most \ref STARPU_MAXOPENCLDEVS. \fn int starpu_worker_get_id(void) \ingroup API_Workers_Properties This function returns the identifier of the current worker, i.e the one associated to the calling thread. The returned value is either -1 if the current context is not a StarPU worker (i.e. when called from the application outside a task or a callback), or an integer between 0 and starpu_worker_get_count() - 1. \fn unsigned starpu_worker_get_id_check(void) \ingroup API_Workers_Properties This is the same as starpu_worker_get_id, but aborts when called from outside a worker (i.e. when starpu_worker_get_id() would return -1). \fn int starpu_worker_get_ids_by_type(enum starpu_worker_archtype type, int *workerids, int maxsize) \ingroup API_Workers_Properties This function gets the list of identifiers of workers with the given type. It fills the array \p workerids with the identifiers of the workers that have the type indicated in the first argument. The argument \p maxsize indicates the size of the array \p workerids. The returned value gives the number of identifiers that were put in the array. -ERANGE is returned is \p maxsize is lower than the number of workers with the appropriate type: in that case, the array is filled with the \p maxsize first elements. To avoid such overflows, the value of maxsize can be chosen by the means of the function starpu_worker_get_count_by_type(), or by passing a value greater or equal to \ref STARPU_NMAXWORKERS. \fn int starpu_worker_get_by_type(enum starpu_worker_archtype type, int num) \ingroup API_Workers_Properties This returns the identifier of the num-th worker that has the specified type type. If there are no such worker, -1 is returned. \fn int starpu_worker_get_by_devid(enum starpu_worker_archtype type, int devid) \ingroup API_Workers_Properties This returns the identifier of the worker that has the specified type \p type and device id \p devid (which may not be the n-th, if some devices are skipped for instance). If there are no such worker, -1 is returned. \fn int starpu_worker_get_devid(int id) \ingroup API_Workers_Properties This function returns the device id of the given worker. The worker should be identified with the value returned by the starpu_worker_get_id() function. In the case of a CUDA worker, this device identifier is the logical device identifier exposed by CUDA (used by the function cudaGetDevice() for instance). The device identifier of a CPU worker is the logical identifier of the core on which the worker was bound; this identifier is either provided by the OS or by the library hwloc in case it is available. \fn enum starpu_worker_archtype starpu_worker_get_type(int id) \ingroup API_Workers_Properties This function returns the type of processing unit associated to a worker. The worker identifier is a value returned by the function starpu_worker_get_id()). The returned value indicates the architecture of the worker: ::STARPU_CPU_WORKER for a CPU core, ::STARPU_CUDA_WORKER for a CUDA device, and ::STARPU_OPENCL_WORKER for a OpenCL device. The value returned for an invalid identifier is unspecified. \fn void starpu_worker_get_name(int id, char *dst, size_t maxlen) \ingroup API_Workers_Properties This function allows to get the name of a given worker. StarPU associates a unique human readable string to each processing unit. This function copies at most the maxlen first bytes of the unique string associated to a worker identified by its identifier id into the dst buffer. The caller is responsible for ensuring that \p dst is a valid pointer to a buffer of \p maxlen bytes at least. Calling this function on an invalid identifier results in an unspecified behaviour. \fn unsigned starpu_worker_get_memory_node(unsigned workerid) \ingroup API_Workers_Properties This function returns the identifier of the memory node associated to the worker identified by \p workerid. \fn enum starpu_node_kind starpu_node_get_kind(unsigned node) \ingroup API_Workers_Properties Returns the type of the given node as defined by ::starpu_node_kind. For example, when defining a new data interface, this function should be used in the allocation function to determine on which device the memory needs to be allocated. \fn char *starpu_worker_get_type_as_string(enum starpu_worker_archtype type) \ingroup API_Workers_Properties Returns the given worker type as a string. */ starpu-1.2.3+dfsg/doc/doxygen/chapters/code/000077500000000000000000000000001320135501600207135ustar00rootroot00000000000000starpu-1.2.3+dfsg/doc/doxygen/chapters/code/cholesky_pragma.c000066400000000000000000000026561320135501600242400ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 CNRS * Copyright (C) 2010-2013 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ //! [To be included. You should update doxygen if you see this text.] extern void cholesky(unsigned nblocks, unsigned size, float mat[nblocks][nblocks][size]) __attribute__ ((task)); int main (int argc, char *argv[]) { #pragma starpu initialize /* ... */ int nblocks, size; parse_args (&nblocks, &size); /* Allocate an array of the required size on the heap, and register it. */ { float matrix[nblocks][nblocks][size] __attribute__ ((heap_allocated, registered)); cholesky (nblocks, size, matrix); #pragma starpu wait } /* MATRIX is automatically unregistered & freed here. */ #pragma starpu shutdown return EXIT_SUCCESS; } //! [To be included. You should update doxygen if you see this text.] starpu-1.2.3+dfsg/doc/doxygen/chapters/code/complex.c000066400000000000000000000022171320135501600225300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 CNRS * Copyright (C) 2010-2013 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ //! [To be included. You should update doxygen if you see this text.] #define STARPU_COMPLEX_GET_REAL(interface) \ (((struct starpu_complex_interface *)(interface))->real) #define STARPU_COMPLEX_GET_IMAGINARY(interface) \ (((struct starpu_complex_interface *)(interface))->imaginary) #define STARPU_COMPLEX_GET_NX(interface) \ (((struct starpu_complex_interface *)(interface))->nx) //! [To be included. You should update doxygen if you see this text.] starpu-1.2.3+dfsg/doc/doxygen/chapters/code/disk_compute.c000066400000000000000000000110771320135501600235530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Corentin Salingue * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ //! [To be included. You should update doxygen if you see this text.] /* Try to write into disk memory * Use mechanism to push datas from main ram to disk ram */ #include #include #include #include #include #include #define NX (1024) int main(int argc, char **argv) { /* Initialize StarPU with default configuration */ int ret = starpu_init(NULL); if (ret == -ENODEV) goto enodev; /* Initialize path and name */ char pid_str[16]; int pid = getpid(); snprintf(pid_str, 16, "%d", pid); const char *name_file_start = "STARPU_DISK_COMPUTE_DATA_"; const char *name_file_end = "STARPU_DISK_COMPUTE_DATA_RESULT_"; char * path_file_start = malloc(strlen(base) + 1 + strlen(name_file_start) + 1); strcpy(path_file_start, base); strcat(path_file_start, "/"); strcat(path_file_start, name_file_start); char * path_file_end = malloc(strlen(base) + 1 + strlen(name_file_end) + 1); strcpy(path_file_end, base); strcat(path_file_end, "/"); strcat(path_file_end, name_file_end); /* register a disk */ int new_dd = starpu_disk_register(&starpu_disk_unistd_ops, (void *) base, 1024*1024*1); /* can't write on /tmp/ */ if (new_dd == -ENOENT) goto enoent; unsigned dd = (unsigned) new_dd; printf("TEST DISK MEMORY \n"); /* Imagine, you want to compute datas */ int *A; int *C; starpu_malloc_flags((void **)&A, NX*sizeof(int), STARPU_MALLOC_COUNT); starpu_malloc_flags((void **)&C, NX*sizeof(int), STARPU_MALLOC_COUNT); unsigned int j; /* you register them in a vector */ for(j = 0; j < NX; ++j) { A[j] = j; C[j] = 0; } /* you create a file to store the vector ON the disk */ FILE * f = fopen(path_file_start, "wb+"); if (f == NULL) goto enoent2; /* store it in the file */ fwrite(A, sizeof(int), NX, f); /* close the file */ fclose(f); /* create a file to store result */ f = fopen(path_file_end, "wb+"); if (f == NULL) goto enoent2; /* replace all datas by 0 */ fwrite(C, sizeof(int), NX, f); /* close the file */ fclose(f); /* And now, you want to use your datas in StarPU */ /* Open the file ON the disk */ void * data = starpu_disk_open(dd, (void *) name_file_start, NX*sizeof(int)); void * data_result = starpu_disk_open(dd, (void *) name_file_end, NX*sizeof(int)); starpu_data_handle_t vector_handleA, vector_handleC; /* register vector in starpu */ starpu_vector_data_register(&vector_handleA, dd, (uintptr_t) data, NX, sizeof(int)); /* and do what you want with it, here we copy it into an other vector */ starpu_vector_data_register(&vector_handleC, dd, (uintptr_t) data_result, NX, sizeof(int)); starpu_data_cpy(vector_handleC, vector_handleA, 0, NULL, NULL); /* free them */ starpu_data_unregister(vector_handleA); starpu_data_unregister(vector_handleC); /* close them in StarPU */ starpu_disk_close(dd, data, NX*sizeof(int)); starpu_disk_close(dd, data_result, NX*sizeof(int)); /* check results */ f = fopen(path_file_end, "rb+"); if (f == NULL) goto enoent; /* take datas */ int size = fread(C, sizeof(int), NX, f); /* close the file */ fclose(f); int try = 1; for (j = 0; j < NX; ++j) if (A[j] != C[j]) { printf("Fail A %d != C %d \n", A[j], C[j]); try = 0; } starpu_free_flags(A, NX*sizeof(int), STARPU_MALLOC_COUNT); starpu_free_flags(C, NX*sizeof(int), STARPU_MALLOC_COUNT); unlink(path_file_start); unlink(path_file_end); free(path_file_start); free(path_file_end); /* terminate StarPU, no task can be submitted after */ starpu_shutdown(); if(try) printf("TEST SUCCESS\n"); else printf("TEST FAIL\n"); return (try ? EXIT_SUCCESS : EXIT_FAILURE); enodev: return 77; enoent2: starpu_free_flags(A, NX*sizeof(int), STARPU_MALLOC_COUNT); starpu_free_flags(C, NX*sizeof(int), STARPU_MALLOC_COUNT); enoent: unlink(path_file_start); unlink(path_file_end); free(path_file_start); free(path_file_end); starpu_shutdown(); return 77; } //! [To be included. You should update doxygen if you see this text.] starpu-1.2.3+dfsg/doc/doxygen/chapters/code/disk_copy.c000066400000000000000000000075361320135501600230560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Corentin Salingue * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ //! [To be included. You should update doxygen if you see this text.] /* Try to write into disk memory * Use mechanism to push datas from main ram to disk ram */ #include #include #include #include /* size of one vector */ #define NX (30*1000000/sizeof(double)) #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) int main(int argc, char **argv) { double * A,*B,*C,*D,*E,*F; /* limit main ram to force to push in disk */ setenv("STARPU_LIMIT_CPU_MEM", "160", 1); /* Initialize StarPU with default configuration */ int ret = starpu_init(NULL); if (ret == -ENODEV) goto enodev; /* register a disk */ int new_dd = starpu_disk_register(&starpu_disk_unistd_ops, (void *) "/tmp/", 1024*1024*200); /* can't write on /tmp/ */ if (new_dd == -ENOENT) goto enoent; /* allocate two memory spaces */ starpu_malloc_flags((void **)&A, NX*sizeof(double), STARPU_MALLOC_COUNT); starpu_malloc_flags((void **)&F, NX*sizeof(double), STARPU_MALLOC_COUNT); FPRINTF(stderr, "TEST DISK MEMORY \n"); unsigned int j; /* initialization with bad values */ for(j = 0; j < NX; ++j) { A[j] = j; F[j] = -j; } starpu_data_handle_t vector_handleA, vector_handleB, vector_handleC, vector_handleD, vector_handleE, vector_handleF; /* register vector in starpu */ starpu_vector_data_register(&vector_handleA, STARPU_MAIN_RAM, (uintptr_t)A, NX, sizeof(double)); starpu_vector_data_register(&vector_handleB, -1, (uintptr_t) NULL, NX, sizeof(double)); starpu_vector_data_register(&vector_handleC, -1, (uintptr_t) NULL, NX, sizeof(double)); starpu_vector_data_register(&vector_handleD, -1, (uintptr_t) NULL, NX, sizeof(double)); starpu_vector_data_register(&vector_handleE, -1, (uintptr_t) NULL, NX, sizeof(double)); starpu_vector_data_register(&vector_handleF, STARPU_MAIN_RAM, (uintptr_t)F, NX, sizeof(double)); /* copy vector A->B, B->C... */ starpu_data_cpy(vector_handleB, vector_handleA, 0, NULL, NULL); starpu_data_cpy(vector_handleC, vector_handleB, 0, NULL, NULL); starpu_data_cpy(vector_handleD, vector_handleC, 0, NULL, NULL); starpu_data_cpy(vector_handleE, vector_handleD, 0, NULL, NULL); starpu_data_cpy(vector_handleF, vector_handleE, 0, NULL, NULL); /* StarPU does not need to manipulate the array anymore so we can stop * monitoring it */ /* free them */ starpu_data_unregister(vector_handleA); starpu_data_unregister(vector_handleB); starpu_data_unregister(vector_handleC); starpu_data_unregister(vector_handleD); starpu_data_unregister(vector_handleE); starpu_data_unregister(vector_handleF); /* check if computation is correct */ int try = 1; for (j = 0; j < NX; ++j) if (A[j] != F[j]) { printf("Fail A %f != F %f \n", A[j], F[j]); try = 0; } /* free last vectors */ starpu_free_flags(A, NX*sizeof(double), STARPU_MALLOC_COUNT); starpu_free_flags(F, NX*sizeof(double), STARPU_MALLOC_COUNT); /* terminate StarPU, no task can be submitted after */ starpu_shutdown(); if(try) FPRINTF(stderr, "TEST SUCCESS\n"); else FPRINTF(stderr, "TEST FAIL\n"); return (try ? EXIT_SUCCESS : EXIT_FAILURE); enodev: return 77; enoent: return 77; } //! [To be included. You should update doxygen if you see this text.] starpu-1.2.3+dfsg/doc/doxygen/chapters/code/forkmode.c000066400000000000000000000026701320135501600226720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 CNRS * Copyright (C) 2010-2013 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ //! [To be included. You should update doxygen if you see this text.] void scal_cpu_func(void *buffers[], void *_args) { unsigned i; float *factor = _args; struct starpu_vector_interface *vector = buffers[0]; unsigned n = STARPU_VECTOR_GET_NX(vector); float *val = (float *)STARPU_VECTOR_GET_PTR(vector); #pragma omp parallel for num_threads(starpu_combined_worker_get_size()) for (i = 0; i < n; i++) val[i] *= *factor; } static struct starpu_codelet cl = { .modes = { STARPU_RW }, .where = STARPU_CPU, .type = STARPU_FORKJOIN, .max_parallelism = INT_MAX, .cpu_funcs = {scal_cpu_func}, .cpu_funcs_name = {"scal_cpu_func"}, .nbuffers = 1, }; //! [To be included. You should update doxygen if you see this text.] starpu-1.2.3+dfsg/doc/doxygen/chapters/code/hello_pragma.c000066400000000000000000000024441320135501600235150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 CNRS * Copyright (C) 2010-2013 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ //! [To be included. You should update doxygen if you see this text.] #include /* Task declaration. */ static void my_task (int x) __attribute__ ((task)); /* Definition of the CPU implementation of `my_task'. */ static void my_task (int x) { printf ("Hello, world! With x = %d\n", x); } int main () { /* Initialize StarPU. */ #pragma starpu initialize /* Do an asynchronous call to `my_task'. */ my_task (42); /* Wait for the call to complete. */ #pragma starpu wait /* Terminate. */ #pragma starpu shutdown return 0; } //! [To be included. You should update doxygen if you see this text.] starpu-1.2.3+dfsg/doc/doxygen/chapters/code/hello_pragma2.c000066400000000000000000000023441320135501600235760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 CNRS * Copyright (C) 2010-2013 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ //! [To be included. You should update doxygen if you see this text.] int main (void) { #pragma starpu initialize #define NX 0x100000 #define FACTOR 3.14 { float vector[NX] __attribute__ ((heap_allocated, registered)); size_t i; for (i = 0; i < NX; i++) vector[i] = (float) i; vector_scal (NX, vector, FACTOR); #pragma starpu wait } /* VECTOR is automatically freed here. */ #pragma starpu shutdown return valid ? EXIT_SUCCESS : EXIT_FAILURE; } //! [To be included. You should update doxygen if you see this text.] starpu-1.2.3+dfsg/doc/doxygen/chapters/code/matmul_pragma.c000066400000000000000000000043331320135501600237100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 CNRS * Copyright (C) 2010-2013 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ //! [To be included. You should update doxygen if you see this text.] /* This program is valid, whether or not StarPU's GCC plug-in is being used. */ #include /* The attribute below is ignored when GCC is not used. */ static void matmul (const float *A, const float *B, float * C, unsigned nx, unsigned ny, unsigned nz) __attribute__ ((task)); static void matmul (const float *A, const float *B, float * C, unsigned nx, unsigned ny, unsigned nz) { /* Code of the CPU kernel here... */ } #ifdef STARPU_GCC_PLUGIN /* Optional OpenCL task implementation. */ static void matmul_opencl (const float *A, const float *B, float * C, unsigned nx, unsigned ny, unsigned nz) __attribute__ ((task_implementation ("opencl", matmul))); static void matmul_opencl (const float *A, const float *B, float * C, unsigned nx, unsigned ny, unsigned nz) { /* Code that invokes the OpenCL kernel here... */ } #endif int main (int argc, char *argv[]) { /* The pragmas below are simply ignored when StarPU-GCC is not used. */ #pragma starpu initialize float A[123][42][7], B[123][42][7], C[123][42][7]; #pragma starpu register A #pragma starpu register B #pragma starpu register C /* When StarPU-GCC is used, the call below is asynchronous; otherwise, it is synchronous. */ matmul ((float *) A, (float *) B, (float *) C, 123, 42, 7); #pragma starpu wait #pragma starpu shutdown return EXIT_SUCCESS; } //! [To be included. You should update doxygen if you see this text.] starpu-1.2.3+dfsg/doc/doxygen/chapters/code/matmul_pragma2.c000066400000000000000000000021601320135501600237660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 CNRS * Copyright (C) 2010-2013 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ //! [To be included. You should update doxygen if you see this text.] /* Use the `task' attribute only when StarPU's GCC plug-in is available. */ #ifdef STARPU_GCC_PLUGIN # define __task __attribute__ ((task)) #else # define __task #endif static void matmul (const float *A, const float *B, float *C, unsigned nx, unsigned ny, unsigned nz) __task; //! [To be included. You should update doxygen if you see this text.] starpu-1.2.3+dfsg/doc/doxygen/chapters/code/multiformat.c000066400000000000000000000042131320135501600234220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 CNRS * Copyright (C) 2010-2013 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ //! [To be included. You should update doxygen if you see this text.] #define NX 1024 struct point array_of_structs[NX]; starpu_data_handle_t handle; /* * The conversion of a piece of data is itself a task, though it is created, * submitted and destroyed by StarPU internals and not by the user. Therefore, * we have to define two codelets. * Note that for now the conversion from the CPU format to the GPU format has to * be executed on the GPU, and the conversion from the GPU to the CPU has to be * executed on the CPU. */ #ifdef STARPU_USE_OPENCL void cpu_to_opencl_opencl_func(void *buffers[], void *args); struct starpu_codelet cpu_to_opencl_cl = { .where = STARPU_OPENCL, .opencl_funcs = { cpu_to_opencl_opencl_func }, .nbuffers = 1, .modes = { STARPU_RW } }; void opencl_to_cpu_func(void *buffers[], void *args); struct starpu_codelet opencl_to_cpu_cl = { .where = STARPU_CPU, .cpu_funcs = { opencl_to_cpu_func }, .cpu_funcs_name = { "opencl_to_cpu_func" }, .nbuffers = 1, .modes = { STARPU_RW } }; #endif struct starpu_multiformat_data_interface_ops format_ops = { #ifdef STARPU_USE_OPENCL .opencl_elemsize = 2 * sizeof(float), .cpu_to_opencl_cl = &cpu_to_opencl_cl, .opencl_to_cpu_cl = &opencl_to_cpu_cl, #endif .cpu_elemsize = 2 * sizeof(float), ... }; starpu_multiformat_data_register(handle, STARPU_MAIN_RAM, &array_of_structs, NX, &format_ops); //! [To be included. You should update doxygen if you see this text.] starpu-1.2.3+dfsg/doc/doxygen/chapters/code/nf_initexit.f90000066400000000000000000000025141320135501600235550ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2016 Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ! ! See the GNU Lesser General Public License in COPYING.LGPL for more details. ! [To be included. You should update doxygen if you see this text.] program nf_initexit use iso_c_binding ! C interfacing module use fstarpu_mod ! StarPU interfacing module implicit none ! Fortran recommended best practice integer(c_int) :: err ! return status for fstarpu_init ! initialize StarPU with default settings err = fstarpu_init(C_NULL_PTR) if (err /= 0) then stop 1 ! StarPU initialization failure end if ! - add StarPU Native Fortran API calls here ! shut StarPU down call fstarpu_shutdown() end program nf_initexit ! [To be included. You should update doxygen if you see this text.] starpu-1.2.3+dfsg/doc/doxygen/chapters/code/scal_pragma.cu000066400000000000000000000030341320135501600235150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 CNRS * Copyright (C) 2010-2013 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ //! [To be included. You should update doxygen if you see this text.] /* CUDA implementation of the `vector_scal' task, to be compiled with `nvcc'. */ #include #include static __global__ void vector_mult_cuda (unsigned n, float *val, float factor) { unsigned i = blockIdx.x * blockDim.x + threadIdx.x; if (i < n) val[i] *= factor; } /* Definition of the task implementation declared in the C file. */ extern "C" void vector_scal_cuda (size_t size, float vector[], float factor) { unsigned threads_per_block = 64; unsigned nblocks = (size + threads_per_block - 1) / threads_per_block; vector_mult_cuda <<< nblocks, threads_per_block, 0, starpu_cuda_get_local_stream () >>> (size, vector, factor); cudaStreamSynchronize (starpu_cuda_get_local_stream ()); } //! [To be included. You should update doxygen if you see this text.] starpu-1.2.3+dfsg/doc/doxygen/chapters/code/simgrid.c000066400000000000000000000022211320135501600225120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 CNRS * Copyright (C) 2010-2013 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ //! [To be included. You should update doxygen if you see this text.] static struct starpu_codelet cl11 = { .cpu_funcs = {chol_cpu_codelet_update_u11}, .cpu_funcs_name = {"chol_cpu_codelet_update_u11"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {chol_cublas_codelet_update_u11}, #elif defined(STARPU_SIMGRID) .cuda_funcs = {(void*)1}, #endif .nbuffers = 1, .modes = {STARPU_RW}, .model = &chol_model_11 }; //! [To be included. You should update doxygen if you see this text.] starpu-1.2.3+dfsg/doc/doxygen/chapters/code/vector_scal_c.c000066400000000000000000000110561320135501600236700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 CNRS * Copyright (C) 2010-2013 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ //! [To be included. You should update doxygen if you see this text.] /* * This example demonstrates how to use StarPU to scale an array by a factor. * It shows how to manipulate data with StarPU's data management library. * 1- how to declare a piece of data to StarPU (starpu_vector_data_register) * 2- how to describe which data are accessed by a task (task->handles[0]) * 3- how a kernel can manipulate the data (buffers[0].vector.ptr) */ #include #define NX 2048 extern void scal_cpu_func(void *buffers[], void *_args); extern void scal_sse_func(void *buffers[], void *_args); extern void scal_cuda_func(void *buffers[], void *_args); extern void scal_opencl_func(void *buffers[], void *_args); static struct starpu_codelet cl = { .where = STARPU_CPU | STARPU_CUDA | STARPU_OPENCL, /* CPU implementation of the codelet */ .cpu_funcs = { scal_cpu_func, scal_sse_func }, .cpu_funcs_name = { "scal_cpu_func", "scal_sse_func" }, #ifdef STARPU_USE_CUDA /* CUDA implementation of the codelet */ .cuda_funcs = { scal_cuda_func }, #endif #ifdef STARPU_USE_OPENCL /* OpenCL implementation of the codelet */ .opencl_funcs = { scal_opencl_func }, #endif .nbuffers = 1, .modes = { STARPU_RW } }; #ifdef STARPU_USE_OPENCL struct starpu_opencl_program programs; #endif int main(int argc, char **argv) { /* We consider a vector of float that is initialized just as any of C * data */ float vector[NX]; unsigned i; for (i = 0; i < NX; i++) vector[i] = 1.0f; fprintf(stderr, "BEFORE: First element was %f\n", vector[0]); /* Initialize StarPU with default configuration */ starpu_init(NULL); #ifdef STARPU_USE_OPENCL starpu_opencl_load_opencl_from_file( "examples/basic_examples/vector_scal_opencl_kernel.cl", &programs, NULL); #endif /* Tell StaPU to associate the "vector" vector with the "vector_handle" * identifier. When a task needs to access a piece of data, it should * refer to the handle that is associated to it. * In the case of the "vector" data interface: * - the first argument of the registration method is a pointer to the * handle that should describe the data * - the second argument is the memory node where the data (ie. "vector") * resides initially: STARPU_MAIN_RAM stands for an address in main memory, as * opposed to an adress on a GPU for instance. * - the third argument is the adress of the vector in RAM * - the fourth argument is the number of elements in the vector * - the fifth argument is the size of each element. */ starpu_data_handle_t vector_handle; starpu_vector_data_register(&vector_handle, STARPU_MAIN_RAM, (uintptr_t)vector, NX, sizeof(vector[0])); float factor = 3.14; /* create a synchronous task: any call to starpu_task_submit will block * until it is terminated */ struct starpu_task *task = starpu_task_create(); task->synchronous = 1; task->cl = &cl; /* the codelet manipulates one buffer in RW mode */ task->handles[0] = vector_handle; /* an argument is passed to the codelet, beware that this is a * READ-ONLY buffer and that the codelet may be given a pointer to a * COPY of the argument */ task->cl_arg = &factor; task->cl_arg_size = sizeof(factor); /* execute the task on any eligible computational ressource */ starpu_task_submit(task); /* StarPU does not need to manipulate the array anymore so we can stop * monitoring it */ starpu_data_unregister(vector_handle); #ifdef STARPU_USE_OPENCL starpu_opencl_unload_opencl(&programs); #endif /* terminate StarPU, no task can be submitted after */ starpu_shutdown(); fprintf(stderr, "AFTER First element is %f\n", vector[0]); return 0; } //! [To be included. You should update doxygen if you see this text.] starpu-1.2.3+dfsg/doc/doxygen/chapters/code/vector_scal_cpu.c000066400000000000000000000053651320135501600242430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ //! [To be included. You should update doxygen if you see this text.] #include #include /* This kernel takes a buffer and scales it by a constant factor */ void scal_cpu_func(void *buffers[], void *cl_arg) { unsigned i; float *factor = cl_arg; /* * The "buffers" array matches the task->handles array: for instance * task->handles[0] is a handle that corresponds to a data with * vector "interface", so that the first entry of the array in the * codelet is a pointer to a structure describing such a vector (ie. * struct starpu_vector_interface *). Here, we therefore manipulate * the buffers[0] element as a vector: nx gives the number of elements * in the array, ptr gives the location of the array (that was possibly * migrated/replicated), and elemsize gives the size of each elements. */ struct starpu_vector_interface *vector = buffers[0]; /* length of the vector */ unsigned n = STARPU_VECTOR_GET_NX(vector); /* get a pointer to the local copy of the vector: note that we have to * cast it in (float *) since a vector could contain any type of * elements so that the .ptr field is actually a uintptr_t */ float *val = (float *)STARPU_VECTOR_GET_PTR(vector); /* scale the vector */ for (i = 0; i < n; i++) val[i] *= *factor; } void scal_sse_func(void *buffers[], void *cl_arg) { float *vector = (float *) STARPU_VECTOR_GET_PTR(buffers[0]); unsigned int n = STARPU_VECTOR_GET_NX(buffers[0]); unsigned int n_iterations = n/4; __m128 *VECTOR = (__m128*) vector; __m128 FACTOR STARPU_ATTRIBUTE_ALIGNED(16); float factor = *(float *) cl_arg; FACTOR = _mm_set1_ps(factor); unsigned int i; for (i = 0; i < n_iterations; i++) VECTOR[i] = _mm_mul_ps(FACTOR, VECTOR[i]); unsigned int remainder = n%4; if (remainder != 0) { unsigned int start = 4 * n_iterations; for (i = start; i < start+remainder; ++i) { vector[i] = factor * vector[i]; } } } //! [To be included. You should update doxygen if you see this text.] starpu-1.2.3+dfsg/doc/doxygen/chapters/code/vector_scal_cuda.cu000066400000000000000000000032541320135501600245500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012, 2013 CNRS * Copyright (C) 2010 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ //! [To be included. You should update doxygen if you see this text.] #include static __global__ void vector_mult_cuda(unsigned n, float *val, float factor) { unsigned i = blockIdx.x*blockDim.x + threadIdx.x; if (i < n) val[i] *= factor; } extern "C" void scal_cuda_func(void *buffers[], void *_args) { float *factor = (float *)_args; /* length of the vector */ unsigned n = STARPU_VECTOR_GET_NX(buffers[0]); /* local copy of the vector pointer */ float *val = (float *)STARPU_VECTOR_GET_PTR(buffers[0]); unsigned threads_per_block = 64; unsigned nblocks = (n + threads_per_block-1) / threads_per_block; vector_mult_cuda<<>> (n, val, *factor); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } //! [To be included. You should update doxygen if you see this text.] starpu-1.2.3+dfsg/doc/doxygen/chapters/code/vector_scal_opencl.c000066400000000000000000000053661320135501600247350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012, 2013 CNRS * Copyright (C) 2010 INRIA * Copyright (C) 2011 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ //! [To be included. You should update doxygen if you see this text.] #include extern struct starpu_opencl_program programs; void scal_opencl_func(void *buffers[], void *_args) { float *factor = _args; int id, devid, err; /* OpenCL specific code */ cl_kernel kernel; /* OpenCL specific code */ cl_command_queue queue; /* OpenCL specific code */ cl_event event; /* OpenCL specific code */ /* length of the vector */ unsigned n = STARPU_VECTOR_GET_NX(buffers[0]); /* OpenCL copy of the vector pointer */ cl_mem val = (cl_mem)STARPU_VECTOR_GET_DEV_HANDLE(buffers[0]); { /* OpenCL specific code */ id = starpu_worker_get_id(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &programs, "vector_mult_opencl", /* Name of the codelet */ devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 0, sizeof(n), &n); err |= clSetKernelArg(kernel, 1, sizeof(val), &val); err |= clSetKernelArg(kernel, 2, sizeof(*factor), factor); if (err) STARPU_OPENCL_REPORT_ERROR(err); } { /* OpenCL specific code */ size_t global=n; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local=global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } { /* OpenCL specific code */ clFinish(queue); starpu_opencl_collect_stats(event); clReleaseEvent(event); starpu_opencl_release_kernel(kernel); } } //! [To be included. You should update doxygen if you see this text.] starpu-1.2.3+dfsg/doc/doxygen/chapters/code/vector_scal_opencl_codelet.cl000066400000000000000000000017141320135501600266010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ //! [To be included. You should update doxygen if you see this text.] __kernel void vector_mult_opencl(int nx, __global float* val, float factor) { const int i = get_global_id(0); if (i < nx) { val[i] *= factor; } } //! [To be included. You should update doxygen if you see this text.] starpu-1.2.3+dfsg/doc/doxygen/chapters/images/000077500000000000000000000000001320135501600212465ustar00rootroot00000000000000starpu-1.2.3+dfsg/doc/doxygen/chapters/images/data_trace.eps000066400000000000000000050425131320135501600240600ustar00rootroot00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Title: data_trace.eps %%Creator: gnuplot 4.6 patchlevel 0 %%CreationDate: Tue Jul 30 10:38:32 2013 %%DocumentFonts: (atend) %%BoundingBox: 50 50 410 302 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following true/false flags may be edited by hand if desired. % The unit line width and grayscale image gamma correction may also be changed. % /Color true def /Blacktext false def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /ClipToBoundingBox false def /SuppressPDFMark false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def /Gamma 1.0 def /BackgroundColor {-1.000 -1.000 -1.000} def % /vshift -46 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def /doclip { ClipToBoundingBox { newpath 50 50 moveto 410 50 lineto 410 302 lineto 50 302 lineto closepath clip } if } def % % Gnuplot Prolog Version 4.4 (August 2010) % %/SuppressPDFMark true def % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} bind def /C {setrgbcolor} bind def /f {rlineto fill} bind def /g {setgray} bind def /Gshow {show} def % May be redefined later in the file to support UTF-8 /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow {currentpoint stroke M 0 vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /UP {dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def} def /DL {Color {setrgbcolor Solid {pop []} if 0 setdash} {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse} def /BL {stroke userlinewidth 2 mul setlinewidth Rounded {1 setlinejoin 1 setlinecap} if} def /AL {stroke userlinewidth 2 div setlinewidth Rounded {1 setlinejoin 1 setlinecap} if} def /UL {dup gnulinewidth mul /userlinewidth exch def dup 1 lt {pop 1} if 10 mul /udl exch def} def /PL {stroke userlinewidth setlinewidth Rounded {1 setlinejoin 1 setlinecap} if} def 3.8 setmiterlimit % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 DL} def /Pnt {stroke [] 0 setdash gsave 1 setlinecap M 0 0 V stroke grestore} def /Dia {stroke [] 0 setdash 2 copy vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke Pnt} def /Pls {stroke [] 0 setdash vpt sub M 0 vpt2 V currentpoint stroke M hpt neg vpt neg R hpt2 0 V stroke } def /Box {stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke Pnt} def /Crs {stroke [] 0 setdash exch hpt sub exch vpt add M hpt2 vpt2 neg V currentpoint stroke M hpt2 neg 0 R hpt2 vpt2 V stroke} def /TriU {stroke [] 0 setdash 2 copy vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke Pnt} def /Star {2 copy Pls Crs} def /BoxF {stroke [] 0 setdash exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath fill} def /TriUF {stroke [] 0 setdash vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath fill} def /TriD {stroke [] 0 setdash 2 copy vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V closepath stroke Pnt} def /TriDF {stroke [] 0 setdash vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V closepath fill} def /DiaF {stroke [] 0 setdash vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath fill} def /Pent {stroke [] 0 setdash 2 copy gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat closepath stroke grestore Pnt} def /PentF {stroke [] 0 setdash gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat closepath fill grestore} def /Circle {stroke [] 0 setdash 2 copy hpt 0 360 arc stroke Pnt} def /CircleF {stroke [] 0 setdash hpt 0 360 arc fill} def /C0 {BL [] 0 setdash 2 copy moveto vpt 90 450 arc} bind def /C1 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 90 arc closepath fill vpt 0 360 arc closepath} bind def /C2 {BL [] 0 setdash 2 copy moveto 2 copy vpt 90 180 arc closepath fill vpt 0 360 arc closepath} bind def /C3 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 180 arc closepath fill vpt 0 360 arc closepath} bind def /C4 {BL [] 0 setdash 2 copy moveto 2 copy vpt 180 270 arc closepath fill vpt 0 360 arc closepath} bind def /C5 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 90 arc 2 copy moveto 2 copy vpt 180 270 arc closepath fill vpt 0 360 arc} bind def /C6 {BL [] 0 setdash 2 copy moveto 2 copy vpt 90 270 arc closepath fill vpt 0 360 arc closepath} bind def /C7 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 270 arc closepath fill vpt 0 360 arc closepath} bind def /C8 {BL [] 0 setdash 2 copy moveto 2 copy vpt 270 360 arc closepath fill vpt 0 360 arc closepath} bind def /C9 {BL [] 0 setdash 2 copy moveto 2 copy vpt 270 450 arc closepath fill vpt 0 360 arc closepath} bind def /C10 {BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill 2 copy moveto 2 copy vpt 90 180 arc closepath fill vpt 0 360 arc closepath} bind def /C11 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 180 arc closepath fill 2 copy moveto 2 copy vpt 270 360 arc closepath fill vpt 0 360 arc closepath} bind def /C12 {BL [] 0 setdash 2 copy moveto 2 copy vpt 180 360 arc closepath fill vpt 0 360 arc closepath} bind def /C13 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 90 arc closepath fill 2 copy moveto 2 copy vpt 180 360 arc closepath fill vpt 0 360 arc closepath} bind def /C14 {BL [] 0 setdash 2 copy moveto 2 copy vpt 90 360 arc closepath fill vpt 0 360 arc} bind def /C15 {BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill vpt 0 360 arc closepath} bind def /Rec {newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath} bind def /Square {dup Rec} bind def /Bsquare {vpt sub exch vpt sub exch vpt2 Square} bind def /S0 {BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare} bind def /S1 {BL [] 0 setdash 2 copy vpt Square fill Bsquare} bind def /S2 {BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def /S3 {BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare} bind def /S4 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def /S5 {BL [] 0 setdash 2 copy 2 copy vpt Square fill exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def /S6 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare} bind def /S7 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill 2 copy vpt Square fill Bsquare} bind def /S8 {BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare} bind def /S9 {BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare} bind def /S10 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def /S11 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare} bind def /S12 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare} bind def /S13 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill 2 copy vpt Square fill Bsquare} bind def /S14 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def /S15 {BL [] 0 setdash 2 copy Bsquare fill Bsquare} bind def /D0 {gsave translate 45 rotate 0 0 S0 stroke grestore} bind def /D1 {gsave translate 45 rotate 0 0 S1 stroke grestore} bind def /D2 {gsave translate 45 rotate 0 0 S2 stroke grestore} bind def /D3 {gsave translate 45 rotate 0 0 S3 stroke grestore} bind def /D4 {gsave translate 45 rotate 0 0 S4 stroke grestore} bind def /D5 {gsave translate 45 rotate 0 0 S5 stroke grestore} bind def /D6 {gsave translate 45 rotate 0 0 S6 stroke grestore} bind def /D7 {gsave translate 45 rotate 0 0 S7 stroke grestore} bind def /D8 {gsave translate 45 rotate 0 0 S8 stroke grestore} bind def /D9 {gsave translate 45 rotate 0 0 S9 stroke grestore} bind def /D10 {gsave translate 45 rotate 0 0 S10 stroke grestore} bind def /D11 {gsave translate 45 rotate 0 0 S11 stroke grestore} bind def /D12 {gsave translate 45 rotate 0 0 S12 stroke grestore} bind def /D13 {gsave translate 45 rotate 0 0 S13 stroke grestore} bind def /D14 {gsave translate 45 rotate 0 0 S14 stroke grestore} bind def /D15 {gsave translate 45 rotate 0 0 S15 stroke grestore} bind def /DiaE {stroke [] 0 setdash vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke} def /BoxE {stroke [] 0 setdash exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke} def /TriUE {stroke [] 0 setdash vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke} def /TriDE {stroke [] 0 setdash vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V closepath stroke} def /PentE {stroke [] 0 setdash gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat closepath stroke grestore} def /CircE {stroke [] 0 setdash hpt 0 360 arc stroke} def /Opaque {gsave closepath 1 setgray fill grestore 0 setgray closepath} def /DiaW {stroke [] 0 setdash vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V Opaque stroke} def /BoxW {stroke [] 0 setdash exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V Opaque stroke} def /TriUW {stroke [] 0 setdash vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V Opaque stroke} def /TriDW {stroke [] 0 setdash vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V Opaque stroke} def /PentW {stroke [] 0 setdash gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat Opaque stroke grestore} def /CircW {stroke [] 0 setdash hpt 0 360 arc Opaque stroke} def /BoxFill {gsave Rec 1 setgray fill grestore} def /Density { /Fillden exch def currentrgbcolor /ColB exch def /ColG exch def /ColR exch def /ColR ColR Fillden mul Fillden sub 1 add def /ColG ColG Fillden mul Fillden sub 1 add def /ColB ColB Fillden mul Fillden sub 1 add def ColR ColG ColB setrgbcolor} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave closepath fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % Usage: x y w h s a XX PatternFill % x,y = lower left corner of box to be filled % w,h = width and height of box % a = angle in degrees between lines and x-axis % XX = 0/1 for no/yes cross-hatch % /PatternFill {gsave /PFa [ 9 2 roll ] def PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec gsave 1 setgray fill grestore clip currentlinewidth 0.5 mul setlinewidth /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def 0 0 M PFa 5 get rotate PFs -2 div dup translate 0 1 PFs PFa 4 get div 1 add floor cvi {PFa 4 get mul 0 M 0 PFs V} for 0 PFa 6 get ne { 0 1 PFs PFa 4 get div 1 add floor cvi {PFa 4 get mul 0 2 1 roll M PFs 0 V} for } if stroke grestore} def % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall currentdict end definefont pop /MFshow { { dup 5 get 3 ge { 5 get 3 eq {gsave} {grestore} ifelse } {dup dup 0 get findfont exch 1 get scalefont setfont [ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6 get exch 4 get {Gshow} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq {dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5 get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop pop aload pop M} ifelse }ifelse }ifelse } ifelse } forall} def /Gswidth {dup type /stringtype eq {stringwidth} {pop (n) stringwidth} ifelse} def /MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse } {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont 6 get Gswidth pop add} {pop} ifelse} ifelse} forall} def /MLshow { currentpoint stroke M 0 exch R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MRshow { currentpoint stroke M exch dup MFwidth neg 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MCshow { currentpoint stroke M exch dup MFwidth -2 div 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /XYsave { [( ) 1 2 true false 3 ()] } bind def /XYrestore { [( ) 1 2 true false 4 ()] } bind def Level1 SuppressPDFMark or {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (data_trace.eps) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 0) /Author (jpablo) % /Producer (gnuplot) % /Keywords () /CreationDate (Tue Jul 30 10:38:32 2013) /DOCINFO pdfmark end } ifelse end %%EndProlog %%Page: 1 1 gnudict begin gsave doclip 50 50 translate 0.050 0.050 scale 0 setgray newpath (Helvetica) findfont 140 scalefont setfont BackgroundColor 0 lt 3 1 roll 0 lt exch 0 lt or or not {BackgroundColor C 1.000 0 0 7200.00 5040.00 BoxColFill} if 1.000 UL LTb 938 448 M 63 0 V 5946 0 R -63 0 V stroke 854 448 M [ [(Helvetica) 140.0 0.0 true true 0 ( 100)] ] -46.7 MRshow 1.000 UL LTb 938 657 M 31 0 V 5978 0 R -31 0 V 938 934 M 31 0 V 5978 0 R -31 0 V 938 1076 M 31 0 V 5978 0 R -31 0 V 938 1143 M 63 0 V 5946 0 R -63 0 V stroke 854 1143 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1000)] ] -46.7 MRshow 1.000 UL LTb 938 1352 M 31 0 V 5978 0 R -31 0 V 938 1629 M 31 0 V 5978 0 R -31 0 V 938 1771 M 31 0 V 5978 0 R -31 0 V 938 1838 M 63 0 V 5946 0 R -63 0 V stroke 854 1838 M [ [(Helvetica) 140.0 0.0 true true 0 ( 10000)] ] -46.7 MRshow 1.000 UL LTb 938 2048 M 31 0 V 5978 0 R -31 0 V 938 2324 M 31 0 V 5978 0 R -31 0 V 938 2466 M 31 0 V 5978 0 R -31 0 V 938 2534 M 63 0 V 5946 0 R -63 0 V stroke 854 2534 M [ [(Helvetica) 140.0 0.0 true true 0 ( 100000)] ] -46.7 MRshow 1.000 UL LTb 938 2743 M 31 0 V 5978 0 R -31 0 V 938 3019 M 31 0 V 5978 0 R -31 0 V 938 3161 M 31 0 V 5978 0 R -31 0 V 938 3229 M 63 0 V 5946 0 R -63 0 V stroke 854 3229 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1e+06)] ] -46.7 MRshow 1.000 UL LTb 938 3438 M 31 0 V 5978 0 R -31 0 V 938 3715 M 31 0 V 5978 0 R -31 0 V 938 3856 M 31 0 V 5978 0 R -31 0 V 938 3924 M 63 0 V 5946 0 R -63 0 V stroke 854 3924 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1e+07)] ] -46.7 MRshow 1.000 UL LTb 938 4133 M 31 0 V 5978 0 R -31 0 V 938 4410 M 31 0 V 5978 0 R -31 0 V 938 4552 M 31 0 V 5978 0 R -31 0 V 938 4619 M 63 0 V 5946 0 R -63 0 V stroke 854 4619 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1e+08)] ] -46.7 MRshow 1.000 UL LTb 938 448 M 0 63 V 0 4108 R 0 -63 V stroke 938 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.001)] ] -46.7 MCshow 1.000 UL LTb 1300 448 M 0 31 V 0 4140 R 0 -31 V 1778 448 M 0 31 V 0 4140 R 0 -31 V 2023 448 M 0 31 V 0 4140 R 0 -31 V 2140 448 M 0 63 V 0 4108 R 0 -63 V stroke 2140 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.01)] ] -46.7 MCshow 1.000 UL LTb 2502 448 M 0 31 V 0 4140 R 0 -31 V 2980 448 M 0 31 V 0 4140 R 0 -31 V 3225 448 M 0 31 V 0 4140 R 0 -31 V 3342 448 M 0 63 V 0 4108 R 0 -63 V stroke 3342 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.1)] ] -46.7 MCshow 1.000 UL LTb 3703 448 M 0 31 V 0 4140 R 0 -31 V 4182 448 M 0 31 V 0 4140 R 0 -31 V 4427 448 M 0 31 V 0 4140 R 0 -31 V 4543 448 M 0 63 V 0 4108 R 0 -63 V stroke 4543 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1)] ] -46.7 MCshow 1.000 UL LTb 4905 448 M 0 31 V 0 4140 R 0 -31 V 5383 448 M 0 31 V 0 4140 R 0 -31 V 5629 448 M 0 31 V 0 4140 R 0 -31 V 5745 448 M 0 63 V 0 4108 R 0 -63 V stroke 5745 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 10)] ] -46.7 MCshow 1.000 UL LTb 6107 448 M 0 31 V 0 4140 R 0 -31 V 6585 448 M 0 31 V 0 4140 R 0 -31 V 6831 448 M 0 31 V 0 4140 R 0 -31 V 6947 448 M 0 63 V 0 4108 R 0 -63 V stroke 6947 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 100)] ] -46.7 MCshow 1.000 UL LTb 1.000 UL LTb 938 4619 N 938 448 L 6009 0 V 0 4171 V -6009 0 V Z stroke LCb setrgbcolor 112 2533 M currentpoint gsave translate -270 rotate 0 0 moveto [ [(Helvetica) 140.0 0.0 true true 0 (data size \(B\))] ] -46.7 MCshow grestore LTb LCb setrgbcolor 3942 98 M [ [(Helvetica) 140.0 0.0 true true 0 (tasks size \(ms\))] ] -46.7 MCshow LTb 3942 4829 M [ [(Helvetica) 140.0 0.0 true true 0 (Data trace)] ] -46.7 MCshow 1.000 UP 1.000 UL LTb % Begin plot #1 1.000 UL LT0 LCb setrgbcolor 6296 4486 M [ [(Helvetica) 140.0 0.0 true true 0 (DPOTRF)] [(Helvetica) 112.0 -42.0 true true 0 (T)] [(Helvetica) 140.0 0.0 true true 0 (RSM)] ] -32.7 MRshow LT0 5269 2650 Pnt 3568 2544 Pnt 3564 2523 Pnt 3770 2643 Pnt 3720 2551 Pnt 4171 2836 Pnt 3692 2650 Pnt 3913 2706 Pnt 3273 2491 Pnt 3392 2537 Pnt 3749 2724 Pnt 2916 3747 Pnt 3369 2519 Pnt 3911 2766 Pnt 3470 2569 Pnt 4008 2770 Pnt 2726 2307 Pnt 3853 2773 Pnt 3886 2720 Pnt 2832 3747 Pnt 4027 3747 Pnt 3830 2756 Pnt 3340 3739 Pnt 3863 2782 Pnt 3635 2670 Pnt 3267 2559 Pnt 2478 3748 Pnt 3679 2619 Pnt 3317 3746 Pnt 3340 2482 Pnt 3471 2726 Pnt 3420 2533 Pnt 3884 2726 Pnt 3836 2704 Pnt 3503 2557 Pnt 3426 2523 Pnt 3362 2494 Pnt 4112 2786 Pnt 3936 2524 Pnt 3753 3760 Pnt 3337 2524 Pnt 3626 2636 Pnt 3733 3741 Pnt 3766 3750 Pnt 3748 2647 Pnt 3483 3751 Pnt 4044 2837 Pnt 3717 3741 Pnt 3362 3732 Pnt 3285 3747 Pnt 3558 3736 Pnt 3668 2647 Pnt 3546 2853 Pnt 3949 2580 Pnt 3374 2494 Pnt 3826 2556 Pnt 4101 3744 Pnt 3360 2555 Pnt 3785 2708 Pnt 3784 2659 Pnt 3680 2580 Pnt 4033 2587 Pnt 3887 2615 Pnt 3374 2526 Pnt 3613 2615 Pnt 3604 3783 Pnt 3613 3741 Pnt 3458 2587 Pnt 3785 2714 Pnt 3589 3744 Pnt 2788 2157 Pnt 3614 2640 Pnt 2619 2236 Pnt 3706 3738 Pnt 3983 3743 Pnt 3192 2443 Pnt 3468 2580 Pnt 3975 3738 Pnt 3739 3749 Pnt 3419 2546 Pnt 3698 2729 Pnt 3736 2743 Pnt 3575 2605 Pnt 3943 2685 Pnt 3356 2901 Pnt 3920 2658 Pnt 3474 2728 Pnt 3634 2707 Pnt 3534 3738 Pnt 3795 3743 Pnt 3648 3743 Pnt 3688 2669 Pnt 3374 2630 Pnt 3715 2745 Pnt 3714 3747 Pnt 3483 2599 Pnt 3647 3743 Pnt 3687 2542 Pnt 3638 2669 Pnt 4017 3737 Pnt 3664 3738 Pnt 3559 2743 Pnt 3603 3746 Pnt 3337 2546 Pnt 3656 2635 Pnt 3315 2504 Pnt 3493 3744 Pnt 3809 3738 Pnt 3622 3775 Pnt 3414 2555 Pnt 3714 3736 Pnt 3590 2655 Pnt 3492 2551 Pnt 3564 3743 Pnt 3427 2625 Pnt 3704 3744 Pnt 3970 2699 Pnt 2700 2358 Pnt 3470 2494 Pnt 3654 2538 Pnt 4045 2523 Pnt 3555 2665 Pnt 3786 3739 Pnt 3455 3755 Pnt 3195 2524 Pnt 3487 3746 Pnt 3258 2523 Pnt 3772 3761 Pnt 3733 3744 Pnt 3656 3759 Pnt 3799 2737 Pnt 3491 2494 Pnt 3770 2724 Pnt 2520 2110 Pnt 2811 2295 Pnt 3157 2380 Pnt 3926 3768 Pnt 3476 2762 Pnt 3464 2578 Pnt 3793 3744 Pnt 3581 3744 Pnt 2870 2421 Pnt 3935 3765 Pnt 3860 3743 Pnt 3876 2565 Pnt 3942 3742 Pnt 3403 2709 Pnt 3428 3755 Pnt 3842 2767 Pnt 3353 2464 Pnt 2127 3739 Pnt 3270 3750 Pnt 3449 3744 Pnt 3610 2833 Pnt 3417 2565 Pnt 3341 3740 Pnt 3569 2662 Pnt 3883 2795 Pnt 4066 3793 Pnt 3547 2588 Pnt 3350 2620 Pnt 2780 2300 Pnt 3810 2529 Pnt 3604 2665 Pnt 3387 2661 Pnt 3513 2578 Pnt 3387 2598 Pnt 3521 2653 Pnt 3663 2662 Pnt 3615 2603 Pnt 3248 2527 Pnt 3617 2620 Pnt 3926 2795 Pnt 3297 2529 Pnt 3858 3739 Pnt 3422 2615 Pnt 3364 2579 Pnt 4004 2646 Pnt 3591 3751 Pnt 3309 3751 Pnt 3718 3734 Pnt 3767 2739 Pnt 3544 3745 Pnt 3633 2567 Pnt 3920 2627 Pnt 3294 2546 Pnt 3445 2575 Pnt 3808 2748 Pnt 3613 3744 Pnt 3363 2549 Pnt 3544 2788 Pnt 3372 2564 Pnt 3568 2773 Pnt 3454 3748 Pnt 3479 2567 Pnt 3559 2631 Pnt 3539 2567 Pnt 3544 3750 Pnt 3556 2492 Pnt 3660 2675 Pnt 3558 2824 Pnt 3937 3749 Pnt 3828 2627 Pnt 3891 3737 Pnt 3722 3779 Pnt 3331 2484 Pnt 3875 3742 Pnt 3823 3774 Pnt 3428 2571 Pnt 3342 2494 Pnt 2808 2313 Pnt 3460 3742 Pnt 3661 2628 Pnt 3225 2583 Pnt 3405 2559 Pnt 3367 2532 Pnt 3649 3736 Pnt 3606 2642 Pnt 3591 3750 Pnt 3703 3755 Pnt 2168 1849 Pnt 3878 3748 Pnt 4061 3752 Pnt 3421 2559 Pnt 3682 3747 Pnt 3158 2389 Pnt 3446 2571 Pnt 3746 3742 Pnt 3944 3744 Pnt 4001 2478 Pnt 3389 2181 Pnt 3758 3753 Pnt 3525 2587 Pnt 3460 2554 Pnt 3795 2573 Pnt 3901 2518 Pnt 3850 3742 Pnt 3651 3742 Pnt 3454 3738 Pnt 3808 3777 Pnt 3851 3739 Pnt 2567 2181 Pnt 4075 3760 Pnt 3346 2716 Pnt 4056 2554 Pnt 3551 2651 Pnt 3414 3760 Pnt 3529 3743 Pnt 3515 3766 Pnt 3412 2518 Pnt 4089 3737 Pnt 3988 3741 Pnt 3724 2778 Pnt 4105 2536 Pnt 3806 2742 Pnt 3620 3747 Pnt 3470 2554 Pnt 3806 3742 Pnt 3628 2716 Pnt 3313 3744 Pnt 3814 3753 Pnt 3522 3742 Pnt 3727 3746 Pnt 3983 2599 Pnt 3751 2723 Pnt 3415 2505 Pnt 3304 3737 Pnt 3548 3741 Pnt 2978 2833 Pnt 3957 2788 Pnt 3334 2469 Pnt 3993 2443 Pnt 3469 2555 Pnt 4089 2707 Pnt 3952 2778 Pnt 3945 3746 Pnt 3399 2536 Pnt 3851 2624 Pnt 3370 2486 Pnt 3029 2500 Pnt 4135 3746 Pnt 4028 3751 Pnt 3390 2482 Pnt 3288 2630 Pnt 3973 2564 Pnt 3551 2612 Pnt 3894 2764 Pnt 3974 3743 Pnt 3259 3743 Pnt 3608 2646 Pnt 3478 3748 Pnt 3318 2479 Pnt 3712 3756 Pnt 3546 2623 Pnt 3725 3737 Pnt 3709 3758 Pnt 4012 3742 Pnt 3509 2611 Pnt 4062 3744 Pnt 3373 3784 Pnt 4033 2599 Pnt 3397 2564 Pnt 3624 2717 Pnt 3681 2689 Pnt 3869 2455 Pnt 3588 3753 Pnt 3682 3741 Pnt 3380 2532 Pnt 3564 2925 Pnt 3494 2569 Pnt 3773 2662 Pnt 3695 3773 Pnt 3771 2692 Pnt 3702 3770 Pnt 3613 2644 Pnt 3334 3745 Pnt 4078 3777 Pnt 3669 3756 Pnt 3908 3752 Pnt 3488 2560 Pnt 3323 2455 Pnt 3690 2717 Pnt 3788 3739 Pnt 3461 2513 Pnt 3310 2484 Pnt 3665 2643 Pnt 3668 3749 Pnt 3615 3737 Pnt 3406 3743 Pnt 4290 3743 Pnt 3807 2700 Pnt 3056 2410 Pnt 3925 2669 Pnt 3742 2553 Pnt 3921 3744 Pnt 4152 2595 Pnt 3445 3745 Pnt 3958 2514 Pnt 4416 2774 Pnt 3489 3776 Pnt 3991 3757 Pnt 3358 2494 Pnt 3999 2504 Pnt 3670 3744 Pnt 3318 2504 Pnt 3333 2479 Pnt 3769 2684 Pnt 3448 2538 Pnt 3583 2613 Pnt 4116 2624 Pnt 3741 2627 Pnt 3539 3744 Pnt 4332 3768 Pnt 4050 2689 Pnt 3595 3777 Pnt 3831 3739 Pnt 2309 3770 Pnt 3951 2643 Pnt 3653 3758 Pnt 3944 2767 Pnt 3708 2669 Pnt 3417 2553 Pnt 4145 3741 Pnt 4002 3762 Pnt 3477 2571 Pnt 3747 2647 Pnt 3815 2569 Pnt 3660 2702 Pnt 3519 2733 Pnt 3785 2595 Pnt 3857 2533 Pnt 3337 3761 Pnt 3387 2514 Pnt 3501 3751 Pnt 3377 3736 Pnt 3954 3749 Pnt 3499 3745 Pnt 3821 3749 Pnt 3660 3755 Pnt 3729 2532 Pnt 3493 2567 Pnt 4320 3757 Pnt 3361 3749 Pnt 3969 2775 Pnt 3656 2680 Pnt 2858 2242 Pnt 3840 3747 Pnt 3640 3766 Pnt 3563 3748 Pnt 3526 2603 Pnt 3501 3766 Pnt 3471 2514 Pnt 3430 2533 Pnt 3432 2544 Pnt 3809 2624 Pnt 3767 2733 Pnt 3560 3739 Pnt 4100 3746 Pnt 3734 3745 Pnt 3907 3749 Pnt 3637 2619 Pnt 3718 3751 Pnt 4326 3780 Pnt 3407 2532 Pnt 3912 2754 Pnt 2985 2367 Pnt 3590 3752 Pnt 3568 3743 Pnt 3341 3780 Pnt 3636 2646 Pnt 3632 2628 Pnt 4042 3757 Pnt 3638 2696 Pnt 3665 2658 Pnt 3448 2584 Pnt 3432 3739 Pnt 3605 3740 Pnt 3530 2554 Pnt 3829 2734 Pnt 4210 3776 Pnt 3963 3735 Pnt 3521 2725 Pnt 2743 2177 Pnt 3943 2716 Pnt 3224 3750 Pnt 4276 3742 Pnt 4056 3743 Pnt 3634 3749 Pnt 3755 3761 Pnt 3467 2565 Pnt 4135 3739 Pnt 3350 3793 Pnt 2717 3744 Pnt 3652 3769 Pnt 3764 3746 Pnt 3695 3739 Pnt 3386 2866 Pnt 3320 2489 Pnt 3765 2705 Pnt 3620 3744 Pnt 3615 3801 Pnt 3637 2646 Pnt 4209 3742 Pnt 3623 2647 Pnt 3860 2514 Pnt 3530 2646 Pnt 4073 2853 Pnt 3542 2587 Pnt 3766 3743 Pnt 4172 3771 Pnt 2873 2412 Pnt 4008 3735 Pnt 3878 2513 Pnt 3337 2504 Pnt 3594 2595 Pnt 4020 3743 Pnt 3885 3791 Pnt 3719 2602 Pnt 3639 2583 Pnt 3403 2518 Pnt 3556 2696 Pnt 3977 2518 Pnt 4041 2429 Pnt 3472 3757 Pnt 3541 2612 Pnt 3672 2725 Pnt 3695 3755 Pnt 3516 3740 Pnt 3760 2707 Pnt 3715 3800 Pnt 3925 2690 Pnt 3487 2747 Pnt 3407 2606 Pnt 3427 3744 Pnt 3376 2477 Pnt 3634 2627 Pnt 3461 3744 Pnt 3395 2518 Pnt 3311 3734 Pnt 3532 3743 Pnt 3159 2526 Pnt 4128 2718 Pnt 3776 3750 Pnt 3426 3812 Pnt 3028 2357 Pnt 3372 3755 Pnt 3579 3743 Pnt 3477 2602 Pnt 4139 2651 Pnt 3538 3741 Pnt 3533 2542 Pnt 3364 2910 Pnt 3624 2542 Pnt 2819 2098 Pnt 3462 2532 Pnt 3772 2725 Pnt 3861 3763 Pnt 3544 3758 Pnt 3410 2555 Pnt 3412 2951 Pnt 3306 3763 Pnt 3888 3742 Pnt 3330 2469 Pnt 3672 3746 Pnt 4092 2845 Pnt 3879 2747 Pnt 3453 3750 Pnt 3579 2611 Pnt 3746 2690 Pnt 3682 2664 Pnt 3500 2587 Pnt 3815 3740 Pnt 3425 3757 Pnt 3738 3752 Pnt 3830 2704 Pnt 3727 2483 Pnt 3723 2718 Pnt 3830 3743 Pnt 3405 2429 Pnt 4333 2677 Pnt 3804 3750 Pnt 2949 2227 Pnt 4002 2615 Pnt 3675 2658 Pnt 3569 2615 Pnt 3715 2710 Pnt 3596 2611 Pnt 3910 2830 Pnt 3419 2542 Pnt 3516 2595 Pnt 3416 2542 Pnt 3615 3758 Pnt 3432 2542 Pnt 3737 3759 Pnt 3391 3738 Pnt 3356 2542 Pnt 4070 3746 Pnt 3382 2555 Pnt 4214 2514 Pnt 3695 3746 Pnt 3461 2650 Pnt 3840 3772 Pnt 4337 3762 Pnt 3661 3780 Pnt 4061 2679 Pnt 3537 3752 Pnt 3567 3754 Pnt 3729 2682 Pnt 4259 2844 Pnt 3651 3766 Pnt 3323 2520 Pnt 4072 3759 Pnt 4209 2586 Pnt 3663 3750 Pnt 3557 2664 Pnt 3913 3745 Pnt 3518 3777 Pnt 3316 2482 Pnt 3482 3750 Pnt 3722 2750 Pnt 3589 3782 Pnt 3751 2533 Pnt 3880 3737 Pnt 3638 2677 Pnt 3314 3769 Pnt 3572 2647 Pnt 3694 2556 Pnt 3409 2542 Pnt 3601 3805 Pnt 3929 3741 Pnt 3613 2655 Pnt 3546 3812 Pnt 3739 2648 Pnt 3153 2472 Pnt 3429 2403 Pnt 3458 2623 Pnt 3320 2536 Pnt 4275 2700 Pnt 3587 2596 Pnt 3899 3752 Pnt 4017 3744 Pnt 2217 1814 Pnt 3462 2572 Pnt 4021 2528 Pnt 3341 2483 Pnt 4506 2551 Pnt 3514 3739 Pnt 3388 2565 Pnt 3452 2560 Pnt 3817 3744 Pnt 4005 2816 Pnt 4270 3774 Pnt 3717 3792 Pnt 3322 2474 Pnt 3734 2679 Pnt 3232 3741 Pnt 3389 3741 Pnt 3272 3747 Pnt 3570 2650 Pnt 3205 3759 Pnt 3502 2615 Pnt 3879 2727 Pnt 3604 2740 Pnt 3405 2565 Pnt 3946 2895 Pnt 3509 2637 Pnt 3532 3734 Pnt 3378 3740 Pnt 3503 3744 Pnt 4322 2703 Pnt 3471 2611 Pnt 3820 3735 Pnt 3391 2533 Pnt 2015 1431 Pnt 3170 2403 Pnt 3771 3747 Pnt 3328 2499 Pnt 3447 3754 Pnt 3626 2650 Pnt 3331 3739 Pnt 4038 2679 Pnt 3923 2763 Pnt 3834 3746 Pnt 3532 2639 Pnt 3608 3803 Pnt 3816 3740 Pnt 3963 2706 Pnt 3915 3765 Pnt 3566 2662 Pnt 3969 2693 Pnt 4231 3743 Pnt 3572 2623 Pnt 3572 3742 Pnt 3832 3751 Pnt 4017 2700 Pnt 3706 3743 Pnt 3313 2528 Pnt 3380 2639 Pnt 3440 3783 Pnt 4017 3758 Pnt 3481 3796 Pnt 3740 3738 Pnt 3778 3751 Pnt 3144 2414 Pnt 3276 2479 Pnt 3830 3749 Pnt 3235 2443 Pnt 3815 2727 Pnt 3886 3755 Pnt 3582 2564 Pnt 3533 2651 Pnt 3920 3754 Pnt 3380 3761 Pnt 3609 3743 Pnt 3709 3742 Pnt 3793 2673 Pnt 3793 2722 Pnt 3385 2533 Pnt 3905 3787 Pnt 3717 2699 Pnt 4085 2758 Pnt 3227 2468 Pnt 3448 2560 Pnt 3666 2674 Pnt 3869 3771 Pnt 3321 2518 Pnt 4339 3734 Pnt 2988 2642 Pnt 3393 3746 Pnt 3681 2625 Pnt 3478 2556 Pnt 3421 2719 Pnt 3621 3735 Pnt 3607 3745 Pnt 3429 2537 Pnt 3937 3816 Pnt 3590 2628 Pnt 3341 2519 Pnt 3583 3744 Pnt 3558 3750 Pnt 3332 3738 Pnt 3819 2679 Pnt 3413 2496 Pnt 3349 2560 Pnt 3903 3764 Pnt 3772 2619 Pnt 2654 2142 Pnt 3640 3787 Pnt 2333 1762 Pnt 3671 3762 Pnt 3705 2742 Pnt 3748 2706 Pnt 3916 2760 Pnt 3397 3741 Pnt 3802 3747 Pnt 3783 2521 Pnt 3946 2733 Pnt 3766 3778 Pnt 3057 2451 Pnt 3524 3754 Pnt 3592 3742 Pnt 3841 2703 Pnt 2732 3790 Pnt 3557 3746 Pnt 3638 3749 Pnt 3510 2725 Pnt 3663 3747 Pnt 3648 3781 Pnt 4135 3823 Pnt 3923 3753 Pnt 3574 2894 Pnt 3642 3738 Pnt 3706 2650 Pnt 3695 2847 Pnt 3550 2565 Pnt 3359 2518 Pnt 4015 3762 Pnt 3523 2544 Pnt 3812 2754 Pnt 3503 2625 Pnt 3826 2714 Pnt 3561 2532 Pnt 3601 2604 Pnt 4097 3768 Pnt 3643 2654 Pnt 3611 3752 Pnt 4129 3743 Pnt 3675 3761 Pnt 4101 2538 Pnt 3350 2522 Pnt 3148 3746 Pnt 3980 3751 Pnt 3907 2754 Pnt 3652 2685 Pnt 4135 3769 Pnt 3542 2626 Pnt 3723 2689 Pnt 3918 3753 Pnt 3612 3733 Pnt 3799 2770 Pnt 3586 3738 Pnt 3736 2716 Pnt 3467 2560 Pnt 3658 3758 Pnt 3611 2631 Pnt 3610 2619 Pnt 3316 2463 Pnt 3827 2620 Pnt 3645 3749 Pnt 3467 3784 Pnt 3984 2726 Pnt 3373 2557 Pnt 3982 2513 Pnt 3701 2563 Pnt 3453 3746 Pnt 3795 3743 Pnt 3677 3744 Pnt 3590 2628 Pnt 3436 3758 Pnt 3795 3737 Pnt 3741 2662 Pnt 3583 2904 Pnt 3281 2440 Pnt 3760 2717 Pnt 3478 3743 Pnt 3351 3745 Pnt 3426 3746 Pnt 3612 2584 Pnt 3650 2572 Pnt 3606 2601 Pnt 3709 2521 Pnt 3525 2604 Pnt 3355 2524 Pnt 3653 3755 Pnt 3865 2693 Pnt 3343 3744 Pnt 3508 3755 Pnt 3621 3748 Pnt 4283 2820 Pnt 3314 3747 Pnt 3553 2818 Pnt 4296 3744 Pnt 4030 3743 Pnt 3652 2650 Pnt 4119 3758 Pnt 4057 3743 Pnt 3097 2438 Pnt 3515 3746 Pnt 3556 2569 Pnt 3873 3743 Pnt 3681 3808 Pnt 3476 2699 Pnt 3365 3763 Pnt 3346 3753 Pnt 3493 2630 Pnt 3353 3748 Pnt 3840 2770 Pnt 3473 2567 Pnt 3502 2598 Pnt 3647 2636 Pnt 3725 2577 Pnt 3854 2683 Pnt 3458 2538 Pnt 3916 3738 Pnt 3659 2797 Pnt 3833 2726 Pnt 3569 3737 Pnt 3970 2516 Pnt 3518 3748 Pnt 3316 3740 Pnt 2797 2318 Pnt 3770 2581 Pnt 3496 2560 Pnt 3001 3744 Pnt 3529 3783 Pnt 3372 3754 Pnt 3695 2682 Pnt 3629 2556 Pnt 3449 3769 Pnt 3487 3745 Pnt 3434 2609 Pnt 3644 3749 Pnt 3371 2524 Pnt 3606 2599 Pnt 3611 2528 Pnt 4031 3739 Pnt 3394 3763 Pnt 4194 3735 Pnt 3775 3764 Pnt 3672 3786 Pnt 4225 3737 Pnt 3819 2723 Pnt 3727 3777 Pnt 4225 3741 Pnt 3426 3807 Pnt 3691 3748 Pnt 3945 2812 Pnt 3638 3747 Pnt 3804 3758 Pnt 3578 2615 Pnt 3560 2646 Pnt 3397 2524 Pnt 3689 3801 Pnt 3990 3747 Pnt 3503 2577 Pnt 4276 3738 Pnt 3834 3755 Pnt 3333 2500 Pnt 3357 2499 Pnt 4192 3739 Pnt 3789 3745 Pnt 3912 3755 Pnt 3379 2499 Pnt 4030 3748 Pnt 4054 2717 Pnt 3532 3738 Pnt 3387 2678 Pnt 3512 2541 Pnt 3777 2779 Pnt 3845 2662 Pnt 3786 2907 Pnt 3304 2561 Pnt 3556 2578 Pnt 4279 3738 Pnt 3443 2546 Pnt 3483 2577 Pnt 3554 2549 Pnt 3568 3738 Pnt 3588 2633 Pnt 3970 3746 Pnt 3516 3747 Pnt 4194 2856 Pnt 3908 3761 Pnt 3735 3741 Pnt 3518 2503 Pnt 3663 2683 Pnt 3634 2528 Pnt 3489 3745 Pnt 3475 2578 Pnt 3529 3738 Pnt 3242 3741 Pnt 3486 2560 Pnt 3673 3742 Pnt 3475 3761 Pnt 3289 2712 Pnt 3640 2731 Pnt 3428 2585 Pnt 3489 2670 Pnt 3649 2663 Pnt 3521 2616 Pnt 4103 2839 Pnt 4303 3754 Pnt 3682 2612 Pnt 3468 2747 Pnt 3579 3744 Pnt 3473 2528 Pnt 4079 3741 Pnt 3521 2623 Pnt 3584 3811 Pnt 3472 3803 Pnt 4133 3770 Pnt 3537 3738 Pnt 4017 2599 Pnt 3525 2651 Pnt 3665 3776 Pnt 3734 2658 Pnt 3870 3749 Pnt 3870 3745 Pnt 3047 3738 Pnt 3790 2673 Pnt 3353 3767 Pnt 3671 2680 Pnt 3657 2699 Pnt 3820 2721 Pnt 3550 3741 Pnt 3866 3749 Pnt 3713 3746 Pnt 3447 2556 Pnt 3451 3735 Pnt 3408 3796 Pnt 3747 2717 Pnt 3437 2499 Pnt 3625 3760 Pnt 4203 2907 Pnt 3846 2747 Pnt 4048 2604 Pnt 3586 2541 Pnt 4079 2530 Pnt 3914 3761 Pnt 3542 2602 Pnt 3342 2477 Pnt 3629 2623 Pnt 3662 2503 Pnt 3877 2723 Pnt 3961 3750 Pnt 3607 3753 Pnt 3524 3759 Pnt 3441 2511 Pnt 3514 2623 Pnt 3298 2449 Pnt 3677 2712 Pnt 3613 2668 Pnt 3470 2616 Pnt 3568 3736 Pnt 3244 2434 Pnt 3883 2782 Pnt 3403 2584 Pnt 3376 2528 Pnt 3360 2542 Pnt 4027 3738 Pnt 3542 2595 Pnt 3906 2779 Pnt 3574 3753 Pnt 3261 2779 Pnt 3433 2631 Pnt 3448 2551 Pnt 4165 2879 Pnt 3516 3770 Pnt 4481 2881 Pnt 3345 2486 Pnt 3723 2581 Pnt 2687 2314 Pnt 3946 3790 Pnt 3456 3757 Pnt 3761 3741 Pnt 3048 2783 Pnt 2033 1505 Pnt 3793 2747 Pnt 3607 2560 Pnt 3512 3746 Pnt 3213 2469 Pnt 3383 2546 Pnt 3393 2536 Pnt 3843 2754 Pnt 3864 2565 Pnt 3762 2533 Pnt 3599 2615 Pnt 3460 2599 Pnt 3877 3739 Pnt 3793 3734 Pnt 3601 3736 Pnt 3730 3737 Pnt 3555 2629 Pnt 3859 2683 Pnt 3834 2611 Pnt 3395 3736 Pnt 3678 2827 Pnt 3044 3785 Pnt 3976 3736 Pnt 3485 2595 Pnt 3263 2489 Pnt 3903 3739 Pnt 3647 2673 Pnt 3499 2599 Pnt 3651 3807 Pnt 3588 2479 Pnt 3758 3741 Pnt 3657 2651 Pnt 3498 2595 Pnt 3807 3807 Pnt 3642 2492 Pnt 2002 1044 Pnt 3412 2564 Pnt 3928 3934 Pnt 3591 3740 Pnt 3968 2493 Pnt 3729 3782 Pnt 3901 2728 Pnt 3747 3739 Pnt 4150 2706 Pnt 3753 2685 Pnt 3011 2335 Pnt 2826 2408 Pnt 3284 2528 Pnt 3453 2541 Pnt 3530 2554 Pnt 4204 3743 Pnt 3393 2565 Pnt 3863 2832 Pnt 3469 2532 Pnt 3275 2484 Pnt 3738 3732 Pnt 3506 2580 Pnt 3862 3775 Pnt 4034 2743 Pnt 3555 2604 Pnt 3304 2499 Pnt 3585 3741 Pnt 3684 3745 Pnt 3960 3740 Pnt 3710 2489 Pnt 3715 2458 Pnt 3299 3789 Pnt 3817 3735 Pnt 3213 2443 Pnt 3807 3773 Pnt 3737 3770 Pnt 3564 3748 Pnt 3210 2489 Pnt 3986 2738 Pnt 3619 2549 Pnt 4207 2914 Pnt 3830 2544 Pnt 4013 2609 Pnt 3409 2560 Pnt 3668 2668 Pnt 3429 2627 Pnt 3860 3753 Pnt 3571 2650 Pnt 3824 2461 Pnt 3794 3736 Pnt 3506 2581 Pnt 3326 2477 Pnt 4393 3745 Pnt 3909 2483 Pnt 3500 2602 Pnt 3311 3753 Pnt 4308 2729 Pnt 3428 3737 Pnt 3724 3742 Pnt 2972 2384 Pnt 3969 2554 Pnt 4343 3749 Pnt 3310 3749 Pnt 3452 2583 Pnt 4131 3749 Pnt 4442 3739 Pnt 3426 2578 Pnt 3306 2545 Pnt 3998 3765 Pnt 3846 2783 Pnt 3787 3737 Pnt 3708 3754 Pnt 3445 2560 Pnt 3516 3801 Pnt 3439 2565 Pnt 4373 3807 Pnt 3824 3754 Pnt 3380 2524 Pnt 3542 3750 Pnt 3542 2608 Pnt 3496 3737 Pnt 3406 2533 Pnt 3545 3813 Pnt 3480 2537 Pnt 3279 2544 Pnt 3749 2683 Pnt 3588 2680 Pnt 3834 3815 Pnt 4309 3766 Pnt 3879 2619 Pnt 3495 3757 Pnt 4098 2845 Pnt 4084 3763 Pnt 3414 2528 Pnt 3841 3745 Pnt 3826 2733 Pnt 2273 3769 Pnt 3443 3797 Pnt 3573 3739 Pnt 3650 3742 Pnt 3995 2637 Pnt 3769 2513 Pnt 3549 3740 Pnt 3214 2609 Pnt 3617 3741 Pnt 3779 3780 Pnt 3622 3745 Pnt 4069 3749 Pnt 3851 3769 Pnt 3617 2685 Pnt 3621 3748 Pnt 3816 2743 Pnt 3708 3748 Pnt 3871 3745 Pnt 3725 3750 Pnt 3679 2706 Pnt 4102 2738 Pnt 3782 2710 Pnt 3412 2554 Pnt 3984 3760 Pnt 3276 2489 Pnt 3660 3742 Pnt 3861 2783 Pnt 3936 2721 Pnt 3321 3934 Pnt 3631 2845 Pnt 3545 3754 Pnt 3727 2724 Pnt 3605 3768 Pnt 4133 2870 Pnt 4293 2599 Pnt 3403 3761 Pnt 4126 2778 Pnt 3861 3750 Pnt 3539 2530 Pnt 4047 3735 Pnt 3651 3736 Pnt 3548 3743 Pnt 3404 2544 Pnt 3269 3742 Pnt 3641 2655 Pnt 3215 2458 Pnt 3903 2752 Pnt 3626 2065 Pnt 3825 2710 Pnt 3995 2419 Pnt 3483 2549 Pnt 3972 2565 Pnt 4238 3825 Pnt 3251 2464 Pnt 3461 2554 Pnt 3777 2685 Pnt 3354 3761 Pnt 3975 3753 Pnt 3583 2442 Pnt 3215 2474 Pnt 4206 2670 Pnt 3321 2461 Pnt 3624 3752 Pnt 3387 2487 Pnt 3620 2607 Pnt 3418 2546 Pnt 3341 2483 Pnt 3807 2528 Pnt 4072 3740 Pnt 3853 3776 Pnt 3507 3742 Pnt 3795 3803 Pnt 3613 2582 Pnt 3432 3743 Pnt 3895 3738 Pnt 3461 2533 Pnt 3777 2687 Pnt 4112 2724 Pnt 3598 2615 Pnt 3421 2537 Pnt 3553 2631 Pnt 3552 3741 Pnt 3501 2560 Pnt 3445 2544 Pnt 3323 2479 Pnt 3392 2528 Pnt 3931 3824 Pnt 3872 2768 Pnt 3443 3749 Pnt 3859 2609 Pnt 3982 2573 Pnt 4000 3766 Pnt 3615 2300 Pnt 3650 3753 Pnt 3631 2508 Pnt 3464 2533 Pnt 3644 3745 Pnt 3972 2792 Pnt 4056 2527 Pnt 3505 3763 Pnt 3645 2640 Pnt 4043 2458 Pnt 3413 3750 Pnt 3654 2660 Pnt 3920 3753 Pnt 4066 2829 Pnt 3615 3763 Pnt 3545 3744 Pnt 3845 3738 Pnt 3675 3739 Pnt 3937 2065 Pnt 3710 2686 Pnt 3579 2596 Pnt 4150 2575 Pnt 3507 2726 Pnt 3734 3750 Pnt 3476 3743 Pnt 3774 2655 Pnt 3865 2738 Pnt 3304 2437 Pnt 3855 2603 Pnt 3920 3747 Pnt 3836 3763 Pnt 3836 2824 Pnt 3771 2721 Pnt 4084 2770 Pnt 3270 2419 Pnt 3407 3751 Pnt 3640 2646 Pnt 2504 2065 Pnt 3789 3736 Pnt 3810 2813 Pnt 3542 3751 Pnt 3613 2609 Pnt 3986 2800 Pnt 3468 2634 Pnt 3663 2660 Pnt 3572 3749 Pnt 3291 3740 Pnt 3592 2650 Pnt 2101 1470 Pnt 3850 2751 Pnt 4346 2713 Pnt 3659 2909 Pnt 3418 2523 Pnt 3760 2714 Pnt 3615 3754 Pnt 3296 2528 Pnt 3855 3743 Pnt 3417 2565 Pnt 3399 3751 Pnt 3602 2677 Pnt 2849 2304 Pnt 4027 2548 Pnt 2879 2359 Pnt 3789 2609 Pnt 3500 2624 Pnt 3476 2569 Pnt 4023 2827 Pnt 4099 2876 Pnt 3297 3753 Pnt 3394 2547 Pnt 3639 2685 Pnt 3624 2533 Pnt 4185 3754 Pnt 4017 2813 Pnt 3994 2793 Pnt 4170 2734 Pnt 3111 3743 Pnt 3502 2586 Pnt 3310 2528 Pnt 3982 2774 Pnt 3951 2419 Pnt 3529 2577 Pnt 4427 3746 Pnt 3763 2536 Pnt 3412 3740 Pnt 3778 3001 Pnt 3342 2739 Pnt 3653 3742 Pnt 3530 2616 Pnt 3626 2573 Pnt 3511 2553 Pnt 4375 3737 Pnt 3604 3762 Pnt 3831 2643 Pnt 3857 3753 Pnt 3418 2555 Pnt 4020 2802 Pnt 3669 2587 Pnt 3632 2655 Pnt 3522 3757 Pnt 3892 3758 Pnt 3363 2582 Pnt 3605 2612 Pnt 4134 2716 Pnt 4043 2724 Pnt 3362 2528 Pnt 4011 2696 Pnt 3699 2667 Pnt 3477 3736 Pnt 3261 2527 Pnt 3615 3744 Pnt 3584 3739 Pnt 3568 2587 Pnt 3861 3769 Pnt 3820 2640 Pnt 2936 2285 Pnt 3478 2595 Pnt 3942 3744 Pnt 2945 2300 Pnt 3218 2461 Pnt 3477 3739 Pnt 3865 2699 Pnt 3838 3776 Pnt 2686 2223 Pnt 3929 2790 Pnt 2544 2739 Pnt 3660 2660 Pnt 3523 3763 Pnt 3633 2658 Pnt 3505 3743 Pnt 3777 3742 Pnt 3355 2508 Pnt 3692 2705 Pnt 3853 3782 Pnt 3469 2551 Pnt 3717 3782 Pnt 4377 3743 Pnt 3669 2616 Pnt 3302 2494 Pnt 3194 3751 Pnt 4086 2716 Pnt 4052 3780 Pnt 3691 2652 Pnt 3810 2757 Pnt 3595 3781 Pnt 4222 3752 Pnt 3753 3756 Pnt 3924 3748 Pnt 3427 3740 Pnt 3143 2422 Pnt 3239 3746 Pnt 3574 2618 Pnt 3706 3735 Pnt 3842 3772 Pnt 3902 2775 Pnt 4013 3742 Pnt 3917 2767 Pnt 3642 3744 Pnt 3599 2627 Pnt 3687 2659 Pnt 3433 2523 Pnt 3496 2601 Pnt 3134 2431 Pnt 3413 3777 Pnt 4010 3745 Pnt 3607 2735 Pnt 3625 3739 Pnt 3436 2582 Pnt 3323 2561 Pnt 3537 3765 Pnt 3915 2713 Pnt 3630 3776 Pnt 3960 2827 Pnt 3020 2474 Pnt 3177 2500 Pnt 3447 3760 Pnt 4197 3742 Pnt 3974 2660 Pnt 3506 2528 Pnt 3850 2492 Pnt 3509 3730 Pnt 3386 2463 Pnt 4033 3741 Pnt 3635 2578 Pnt 3815 3747 Pnt 3597 2609 Pnt 3999 2624 Pnt 3610 3782 Pnt 3913 3748 Pnt 3403 3743 Pnt 4444 2706 Pnt 4233 2764 Pnt 3501 2532 Pnt 3338 2478 Pnt 3312 3764 Pnt 3350 2461 Pnt 3745 3745 Pnt 3834 3740 Pnt 3833 2739 Pnt 3508 2518 Pnt 3509 3764 Pnt 3531 3752 Pnt 4003 2794 Pnt 3535 3758 Pnt 3067 2419 Pnt 3634 3752 Pnt 3408 2612 Pnt 3702 2698 Pnt 3613 2624 Pnt 3761 2548 Pnt 4081 3738 Pnt 4469 3747 Pnt 3381 2536 Pnt 3950 3757 Pnt 4406 2712 Pnt 3533 2642 Pnt 3533 3737 Pnt 3007 2748 Pnt 3325 2484 Pnt 3459 3792 Pnt 3996 2757 Pnt 3589 3750 Pnt 3714 3790 Pnt 3675 2708 Pnt 3716 2692 Pnt 3797 3740 Pnt 4036 3747 Pnt 4406 2573 Pnt 2682 2244 Pnt 3557 3758 Pnt 4166 3748 Pnt 3629 2643 Pnt 4186 3775 Pnt 4120 2775 Pnt 3613 3740 Pnt 3460 2546 Pnt 3552 2611 Pnt 3682 3757 Pnt 3917 3765 Pnt 3915 3753 Pnt 3474 2542 Pnt 3813 2809 Pnt 3805 2716 Pnt 3946 2756 Pnt 3217 2482 Pnt 3755 3747 Pnt 3716 3747 Pnt 3502 2599 Pnt 3648 2640 Pnt 3944 2564 Pnt 3463 3754 Pnt 3516 3818 Pnt 3825 2555 Pnt 3506 2616 Pnt 4061 3740 Pnt 3515 2582 Pnt 4477 2569 Pnt 4030 2687 Pnt 3787 3751 Pnt 3629 2620 Pnt 2803 3750 Pnt 3523 2884 Pnt 3638 2714 Pnt 4194 2696 Pnt 3642 3761 Pnt 2983 2531 Pnt 3490 3747 Pnt 3174 2495 Pnt 3625 3735 Pnt 3366 2504 Pnt 3834 2803 Pnt 3503 2626 Pnt 3537 3750 Pnt 3703 2599 Pnt 3214 3742 Pnt 3473 3746 Pnt 3755 2699 Pnt 3847 3756 Pnt 4273 3751 Pnt 3893 3737 Pnt 3522 2587 Pnt 3685 2763 Pnt 4025 3737 Pnt 3419 2519 Pnt 4096 2844 Pnt 3861 2602 Pnt 3462 2542 Pnt 3774 3746 Pnt 3921 2777 Pnt 3633 3750 Pnt 3739 2906 Pnt 3564 3890 Pnt 3789 3739 Pnt 4088 2806 Pnt 3551 2655 Pnt 3989 3749 Pnt 3369 2703 Pnt 4486 3744 Pnt 3672 2660 Pnt 3449 3743 Pnt 3801 2726 Pnt 3361 3735 Pnt 3365 2510 Pnt 3453 3780 Pnt 3885 3736 Pnt 3745 2702 Pnt 3658 2603 Pnt 3617 2627 Pnt 3597 2624 Pnt 3901 3778 Pnt 3378 3766 Pnt 2841 2222 Pnt 3503 2577 Pnt 3842 3739 Pnt 3700 3734 Pnt 3505 2578 Pnt 3607 3835 Pnt 3688 2572 Pnt 3933 3740 Pnt 3930 2767 Pnt 3199 3756 Pnt 4185 3753 Pnt 3647 2652 Pnt 3539 2537 Pnt 3626 2606 Pnt 3438 2533 Pnt 3511 3743 Pnt 3587 3740 Pnt 3535 2573 Pnt 3339 3741 Pnt 3702 3747 Pnt 3954 2787 Pnt 3834 3744 Pnt 2466 2066 Pnt 3602 3750 Pnt 4012 3746 Pnt 3567 3745 Pnt 3625 2681 Pnt 3531 3759 Pnt 3525 3749 Pnt 2685 2110 Pnt 3736 3750 Pnt 4100 2727 Pnt 2966 2338 Pnt 3864 2712 Pnt 3384 2469 Pnt 3310 3737 Pnt 3709 3783 Pnt 3512 2544 Pnt 3482 3745 Pnt 3527 2573 Pnt 3950 2541 Pnt 3330 2489 Pnt 3622 2791 Pnt 3820 3817 Pnt 3756 2719 Pnt 3618 3758 Pnt 3693 2733 Pnt 3894 2757 Pnt 3975 3747 Pnt 4217 2757 Pnt 3565 3752 Pnt 3413 2514 Pnt 3840 2700 Pnt 3983 2678 Pnt 3632 2648 Pnt 3571 3746 Pnt 3469 2577 Pnt 3457 2674 Pnt 3841 2670 Pnt 3616 3749 Pnt 3489 2634 Pnt 3518 2606 Pnt 3361 2546 Pnt 3928 3787 Pnt 3339 3745 Pnt 3451 2693 Pnt 3740 3785 Pnt 4080 3782 Pnt 3635 3779 Pnt 3805 3737 Pnt 3389 2580 Pnt 4274 3744 Pnt 3578 3745 Pnt 3426 2555 Pnt 3343 2484 Pnt 3407 3755 Pnt 3793 3739 Pnt 4125 3749 Pnt 3729 2564 Pnt 4043 2831 Pnt 3807 2696 Pnt 3595 2632 Pnt 3568 2603 Pnt 3554 3790 Pnt 3513 2599 Pnt 3893 3746 Pnt 3714 3776 Pnt 3542 3787 Pnt 3695 2651 Pnt 3766 2569 Pnt 3368 2472 Pnt 4246 3759 Pnt 3516 2530 Pnt 3329 3744 Pnt 3567 2469 Pnt 3588 2620 Pnt 3693 3737 Pnt 3620 2612 Pnt 3313 2489 Pnt 4260 2659 Pnt 3483 3808 Pnt 3533 3750 Pnt 3402 2549 Pnt 3998 2700 Pnt 3891 3736 Pnt 3460 2619 Pnt 3446 2612 Pnt 4171 2642 Pnt 3657 2655 Pnt 3618 3742 Pnt 3739 2651 Pnt 4049 2652 Pnt 3623 3737 Pnt 3644 2658 Pnt 3599 3748 Pnt 3444 2615 Pnt 4299 3743 Pnt 3532 2595 Pnt 3647 2677 Pnt 3490 3744 Pnt 3946 3744 Pnt 4107 3759 Pnt 3587 3782 Pnt 2486 2116 Pnt 3406 2481 Pnt 3649 3741 Pnt 3473 2782 Pnt 3881 3736 Pnt 4014 3738 Pnt 4174 2662 Pnt 3927 3784 Pnt 3215 3739 Pnt 3789 2700 Pnt 3934 2622 Pnt 3608 3743 Pnt 3787 2571 Pnt 3506 3739 Pnt 3074 2333 Pnt 3743 3754 Pnt 3662 3731 Pnt 3810 3751 Pnt 3593 3737 Pnt 3477 2581 Pnt 3366 2486 Pnt 3575 2544 Pnt 3463 3739 Pnt 4005 3749 Pnt 3434 3734 Pnt 3444 2572 Pnt 3438 3746 Pnt 3337 2525 Pnt 3579 2657 Pnt 3445 3751 Pnt 3529 2587 Pnt 3739 2735 Pnt 3544 2781 Pnt 3370 2563 Pnt 3207 2477 Pnt 4067 2770 Pnt 3737 2533 Pnt 4142 3748 Pnt 3738 2586 Pnt 4040 3746 Pnt 3443 2544 Pnt 3636 2751 Pnt 3625 3741 Pnt 3957 2774 Pnt 3193 2712 Pnt 3245 2465 Pnt 3781 2830 Pnt 3780 2742 Pnt 3946 2640 Pnt 3106 3753 Pnt 3443 2541 Pnt 3903 2746 Pnt 3941 2791 Pnt 3628 2674 Pnt 4073 2654 Pnt 3756 3752 Pnt 3327 2494 Pnt 2990 3740 Pnt 3509 2753 Pnt 3334 2546 Pnt 3770 3743 Pnt 3449 2677 Pnt 3736 3745 Pnt 3864 2760 Pnt 3432 3750 Pnt 3971 3743 Pnt 3901 3748 Pnt 3661 2674 Pnt 4574 3780 Pnt 4170 2885 Pnt 3775 2599 Pnt 3376 3745 Pnt 3482 2595 Pnt 3679 2569 Pnt 3621 2659 Pnt 3668 2691 Pnt 3532 2623 Pnt 3362 2514 Pnt 3276 3744 Pnt 3772 3741 Pnt 3963 2693 Pnt 3907 2849 Pnt 3474 2560 Pnt 3634 2789 Pnt 3508 2608 Pnt 3594 3738 Pnt 3610 3745 Pnt 3514 3793 Pnt 3556 2661 Pnt 3759 2785 Pnt 3826 2590 Pnt 4167 2753 Pnt 3537 3741 Pnt 4231 3743 Pnt 4123 2597 Pnt 3591 2549 Pnt 3443 2533 Pnt 4098 3735 Pnt 3834 3739 Pnt 3575 2586 Pnt 3559 3740 Pnt 3527 2624 Pnt 3713 3747 Pnt 3848 2528 Pnt 3415 2743 Pnt 3730 3748 Pnt 3404 3752 Pnt 3929 2559 Pnt 3228 2606 Pnt 3244 2469 Pnt 3566 3741 Pnt 4221 2717 Pnt 3592 3732 Pnt 3471 3742 Pnt 3885 2682 Pnt 3566 2647 Pnt 2857 2316 Pnt 3682 3746 Pnt 3517 2642 Pnt 3922 3741 Pnt 4082 2744 Pnt 3546 3782 Pnt 3950 3750 Pnt 3380 3745 Pnt 3839 2689 Pnt 3420 2587 Pnt 3689 3745 Pnt 3666 2701 Pnt 3536 3741 Pnt 4630 2766 Pnt 3260 2509 Pnt 3859 2751 Pnt 3578 3745 Pnt 4061 3742 Pnt 3463 3755 Pnt 3588 3738 Pnt 3964 2659 Pnt 4091 3757 Pnt 3563 3745 Pnt 3591 2628 Pnt 3690 2716 Pnt 3486 3742 Pnt 3975 2533 Pnt 3467 3784 Pnt 2953 2399 Pnt 3698 2694 Pnt 3580 3750 Pnt 3876 2781 Pnt 3414 3746 Pnt 3380 2542 Pnt 3879 2587 Pnt 3936 3736 Pnt 3944 2838 Pnt 3513 3741 Pnt 3409 2533 Pnt 3945 3759 Pnt 2588 2169 Pnt 3989 2800 Pnt 3297 2536 Pnt 3718 3825 Pnt 3339 3744 Pnt 4153 2860 Pnt 3305 2691 Pnt 3545 2601 Pnt 3220 2457 Pnt 2833 2292 Pnt 3288 2499 Pnt 3568 2606 Pnt 3744 2573 Pnt 3919 3740 Pnt 3229 2469 Pnt 3690 2667 Pnt 3097 2433 Pnt 3045 2347 Pnt 3297 2518 Pnt 3873 3737 Pnt 3830 3810 Pnt 3742 2712 Pnt 4038 3745 Pnt 4110 3754 Pnt 4030 2807 Pnt 3639 3746 Pnt 3011 2360 Pnt 3100 3754 Pnt 3119 2254 Pnt 3484 3772 Pnt 3425 2580 Pnt 3099 2418 Pnt 3069 2423 Pnt 3939 3742 Pnt 3628 3738 Pnt 3423 3744 Pnt 3459 2582 Pnt 3567 3747 Pnt 3478 2627 Pnt 3952 3787 Pnt 4085 2660 Pnt 3671 2677 Pnt 2876 2309 Pnt 4006 3746 Pnt 3356 3738 Pnt 4013 2830 Pnt 4093 3795 Pnt 3475 3761 Pnt 3763 3738 Pnt 4358 2671 Pnt 3490 2631 Pnt 3637 3911 Pnt 3355 2544 Pnt 3378 2627 Pnt 3783 2750 Pnt 3479 3750 Pnt 3801 3743 Pnt 4121 2885 Pnt 4058 2734 Pnt 3784 2551 Pnt 2891 3746 Pnt 3328 3800 Pnt 3662 2999 Pnt 3417 2609 Pnt 3497 3742 Pnt 3282 2523 Pnt 3698 3758 Pnt 3892 3796 Pnt 3976 2717 Pnt 3744 2695 Pnt 3823 3745 Pnt 3925 3758 Pnt 3786 2712 Pnt 3720 2566 Pnt 3843 3773 Pnt 3916 2703 Pnt 4082 2849 Pnt 3751 2671 Pnt 3475 2560 Pnt 3368 2549 Pnt 3820 3747 Pnt 4094 3755 Pnt 3404 3806 Pnt 3664 2691 Pnt 3391 2537 Pnt 3616 3746 Pnt 3226 2452 Pnt 3682 2738 Pnt 3268 2489 Pnt 3425 3743 Pnt 3440 3738 Pnt 3560 2593 Pnt 3398 3737 Pnt 3489 3753 Pnt 3699 2667 Pnt 4010 2677 Pnt 3782 3742 Pnt 3482 2667 Pnt 4443 3752 Pnt 3811 3743 Pnt 3597 2606 Pnt 3383 3741 Pnt 3648 2651 Pnt 3452 3737 Pnt 3968 3740 Pnt 4038 2724 Pnt 3512 3748 Pnt 3712 2599 Pnt 3230 2495 Pnt 3954 3792 Pnt 3616 2624 Pnt 3768 2731 Pnt 3860 2720 Pnt 3473 3749 Pnt 3500 2582 Pnt 3545 2591 Pnt 3615 3740 Pnt 3913 3741 Pnt 3572 2662 Pnt 4392 2779 Pnt 3654 2639 Pnt 3697 3748 Pnt 3541 2609 Pnt 4285 2955 Pnt 3631 3764 Pnt 3449 2610 Pnt 3295 2463 Pnt 3548 2757 Pnt 4237 3739 Pnt 3262 2559 Pnt 3130 2484 Pnt 3772 3822 Pnt 3375 2546 Pnt 3505 3755 Pnt 3909 2565 Pnt 3855 2742 Pnt 3549 3741 Pnt 3954 3803 Pnt 3656 2642 Pnt 4070 3743 Pnt 3676 3746 Pnt 3374 2494 Pnt 3631 2662 Pnt 3384 2618 Pnt 3799 2593 Pnt 2685 2197 Pnt 4049 2740 Pnt 3447 3744 Pnt 3744 3748 Pnt 3427 2584 Pnt 3917 3765 Pnt 3435 2609 Pnt 3754 2716 Pnt 3842 3739 Pnt 3496 2606 Pnt 3863 2612 Pnt 3496 3744 Pnt 4086 2812 Pnt 3886 3774 Pnt 3496 2650 Pnt 3417 2494 Pnt 4040 2801 Pnt 3734 2833 Pnt 4093 3743 Pnt 2854 3734 Pnt 3713 3739 Pnt 3871 2415 Pnt 4400 3765 Pnt 3622 2620 Pnt 3902 2776 Pnt 4167 3751 Pnt 3706 2876 Pnt 3319 3745 Pnt 3474 2595 Pnt 3593 3742 Pnt 2815 2245 Pnt 4217 2796 Pnt 3430 3741 Pnt 3480 2573 Pnt 3930 2587 Pnt 4301 2599 Pnt 3403 3741 Pnt 3534 3750 Pnt 3316 2566 Pnt 4374 2635 Pnt 3947 2698 Pnt 4069 2630 Pnt 3738 3755 Pnt 3474 2571 Pnt 3546 2631 Pnt 3444 2528 Pnt 3620 3739 Pnt 3791 2688 Pnt 4190 3734 Pnt 3749 2581 Pnt 4294 3732 Pnt 3707 3741 Pnt 3759 2688 Pnt 3562 3750 Pnt 3732 3827 Pnt 3509 3763 Pnt 3824 3739 Pnt 3688 2566 Pnt 3723 3749 Pnt 3397 3740 Pnt 3480 3735 Pnt 3535 3749 Pnt 4011 2577 Pnt 3654 2747 Pnt 3599 2644 Pnt 3574 3739 Pnt 3568 2627 Pnt 3357 3747 Pnt 3974 3742 Pnt 3681 2690 Pnt 3609 2674 Pnt 3278 2508 Pnt 3689 3743 Pnt 3933 2564 Pnt 3688 3742 Pnt 3630 3738 Pnt 4484 2727 Pnt 3937 3786 Pnt 3905 2760 Pnt 4457 3768 Pnt 4001 2830 Pnt 3482 3758 Pnt 3813 3737 Pnt 3614 2695 Pnt 3406 2561 Pnt 3755 2717 Pnt 3717 3741 Pnt 3317 3739 Pnt 3894 3770 Pnt 3609 2532 Pnt 4245 2910 Pnt 3731 3742 Pnt 3701 2551 Pnt 3982 2779 Pnt 3195 2509 Pnt 3353 3740 Pnt 3860 3773 Pnt 3574 2777 Pnt 3762 2696 Pnt 3896 3739 Pnt 4458 2644 Pnt 3527 2700 Pnt 4014 3751 Pnt 2983 2343 Pnt 4289 3745 Pnt 3700 2671 Pnt 2875 2339 Pnt 3649 2677 Pnt 3844 2816 Pnt 3494 3742 Pnt 3418 2609 Pnt 4254 2766 Pnt 3402 3746 Pnt 4126 2778 Pnt 3490 2754 Pnt 3666 3740 Pnt 3704 2542 Pnt 3841 3759 Pnt 3359 2523 Pnt 3687 2528 Pnt 3865 2595 Pnt 3809 2703 Pnt 3834 3740 Pnt 3850 2773 Pnt 4093 2523 Pnt 3542 3739 Pnt 3767 2630 Pnt 3433 3749 Pnt 3664 3746 Pnt 3396 3758 Pnt 3491 2599 Pnt 3625 3740 Pnt 4218 2601 Pnt 3850 2639 Pnt 3661 3746 Pnt 3685 2679 Pnt 3965 2611 Pnt 4035 3742 Pnt 3563 3739 Pnt 3468 2565 Pnt 4164 3766 Pnt 4359 3748 Pnt 3580 3758 Pnt 3919 3749 Pnt 3525 3750 Pnt 3596 2642 Pnt 3014 2399 Pnt 3656 2648 Pnt 3486 2596 Pnt 4037 3741 Pnt 3774 3762 Pnt 3592 2593 Pnt 3564 3738 Pnt 3803 2650 Pnt 3886 3802 Pnt 3426 2614 Pnt 3256 2520 Pnt 3353 2867 Pnt 4187 3745 Pnt 3734 2494 Pnt 3354 3758 Pnt 3954 2795 Pnt 3614 3746 Pnt 3725 2636 Pnt 4313 3777 Pnt 3879 3743 Pnt 3700 2639 Pnt 3329 2516 Pnt 3308 2537 Pnt 4037 2557 Pnt 3453 3780 Pnt 4094 3740 Pnt 3335 2509 Pnt 4179 3761 Pnt 3358 2654 Pnt 3638 3739 Pnt 3940 2581 Pnt 3974 2702 Pnt 4095 3784 Pnt 4067 2876 Pnt 3383 3743 Pnt 3142 2533 Pnt 3591 2612 Pnt 4044 2795 Pnt 3834 3743 Pnt 4039 3787 Pnt 3973 2574 Pnt 3703 3738 Pnt 3965 3744 Pnt 3554 2574 Pnt 3968 3756 Pnt 4009 3770 Pnt 3996 2615 Pnt 3925 2646 Pnt 3595 3746 Pnt 3876 3738 Pnt 3376 2494 Pnt 3649 2580 Pnt 4159 3739 Pnt 4137 2898 Pnt 3867 2760 Pnt 3853 3775 Pnt 3700 3748 Pnt 3501 3765 Pnt 2483 1873 Pnt 3487 3788 Pnt 3809 2746 Pnt 3776 3754 Pnt 3444 3745 Pnt 3636 2595 Pnt 3497 2751 Pnt 3447 2559 Pnt 3738 3742 Pnt 4084 2850 Pnt 3474 3780 Pnt 3965 3787 Pnt 3738 3749 Pnt 3365 3762 Pnt 3889 2702 Pnt 3279 3756 Pnt 3727 3741 Pnt 3808 2749 Pnt 3356 2566 Pnt 4055 2910 Pnt 4154 2805 Pnt 3867 2785 Pnt 3612 2583 Pnt 4155 2674 Pnt 3638 3739 Pnt 3694 3774 Pnt 3403 2546 Pnt 3481 2577 Pnt 3653 3740 Pnt 4116 2575 Pnt 3633 2612 Pnt 4020 3748 Pnt 3929 2747 Pnt 3965 3763 Pnt 4175 3741 Pnt 3774 2716 Pnt 3892 3746 Pnt 3291 2469 Pnt 3601 3731 Pnt 3969 3831 Pnt 3811 3765 Pnt 3520 3767 Pnt 3433 2518 Pnt 4145 3738 Pnt 3446 3744 Pnt 3137 2418 Pnt 3924 2773 Pnt 3825 3739 Pnt 4032 3828 Pnt 3371 2518 Pnt 3512 2595 Pnt 4025 3750 Pnt 3412 2603 Pnt 3660 2612 Pnt 4134 2590 Pnt 3804 3777 Pnt 3716 2667 Pnt 3790 3750 Pnt 2134 1762 Pnt 4111 2877 Pnt 3506 3756 Pnt 3912 2727 Pnt 3999 3740 Pnt 3823 2724 Pnt 3415 2890 Pnt 3699 2733 Pnt 3834 3768 Pnt 3967 2571 Pnt 3547 3737 Pnt 3387 2519 Pnt 3696 2792 Pnt 4238 3757 Pnt 3494 2747 Pnt 3660 2577 Pnt 3542 3741 Pnt 4228 3756 Pnt 3518 2569 Pnt 3886 3757 Pnt 3639 3748 Pnt 3766 3758 Pnt 3289 2504 Pnt 4285 2857 Pnt 3427 2644 Pnt 3635 2849 Pnt 3959 3748 Pnt 3714 2947 Pnt 4277 2611 Pnt 3520 2660 Pnt 3942 3754 Pnt 3536 2578 Pnt 3522 3752 Pnt 4057 3753 Pnt 3605 3743 Pnt 3718 3756 Pnt 3572 2651 Pnt 3915 2604 Pnt 3556 3764 Pnt 3656 2673 Pnt 4122 3747 Pnt 3990 3748 Pnt 3927 3736 Pnt 4069 3737 Pnt 3488 2587 Pnt 3633 3742 Pnt 3763 2700 Pnt 3447 2731 Pnt 3337 3742 Pnt 3909 2683 Pnt 3924 2754 Pnt 3449 2580 Pnt 3512 3740 Pnt 3275 3735 Pnt 3434 2582 Pnt 3781 2826 Pnt 4247 3745 Pnt 4077 3743 Pnt 3541 3749 Pnt 3660 2672 Pnt 3754 2706 Pnt 3856 3776 Pnt 3721 2514 Pnt 3326 2528 Pnt 3664 3768 Pnt 4015 2673 Pnt 3424 2537 Pnt 3668 3745 Pnt 4247 3789 Pnt 3563 3740 Pnt 3632 2654 Pnt 3224 2510 Pnt 3436 3748 Pnt 3537 3738 Pnt 3838 2494 Pnt 3670 2523 Pnt 3624 2527 Pnt 3506 3741 Pnt 3702 2686 Pnt 3430 2602 Pnt 4196 3744 Pnt 3790 3752 Pnt 3522 2607 Pnt 3586 3742 Pnt 4128 2836 Pnt 4005 2795 Pnt 4207 3767 Pnt 3463 2551 Pnt 3890 2879 Pnt 3298 3756 Pnt 3406 3736 Pnt 3331 3763 Pnt 4064 3745 Pnt 3653 2689 Pnt 4199 2670 Pnt 3842 2537 Pnt 3898 3798 Pnt 3787 3757 Pnt 3448 2581 Pnt 3982 3740 Pnt 3986 3747 Pnt 4189 2801 Pnt 3471 3739 Pnt 3495 2587 Pnt 4189 2889 Pnt 3543 3770 Pnt 3723 3753 Pnt 3613 3744 Pnt 3928 3762 Pnt 3374 2574 Pnt 3774 3750 Pnt 3959 3824 Pnt 3488 3750 Pnt 4429 3740 Pnt 3601 3740 Pnt 3897 3749 Pnt 3453 3764 Pnt 3498 3746 Pnt 3256 2489 Pnt 3442 3750 Pnt 3611 3748 Pnt 3638 2633 Pnt 3864 2666 Pnt 3571 2615 Pnt 3509 2509 Pnt 3582 2587 Pnt 3102 3749 Pnt 3483 3752 Pnt 3725 3742 Pnt 3984 2791 Pnt 2892 2385 Pnt 3660 2631 Pnt 3680 3928 Pnt 4171 2788 Pnt 3843 3739 Pnt 3696 2717 Pnt 3589 2623 Pnt 3657 3758 Pnt 3373 2563 Pnt 3500 2605 Pnt 3406 2577 Pnt 3499 3749 Pnt 4304 3742 Pnt 4400 2730 Pnt 3974 3749 Pnt 3713 3760 Pnt 2856 2311 Pnt 3462 3774 Pnt 3774 2698 Pnt 3520 3747 Pnt 4013 2620 Pnt 3994 2556 Pnt 3942 3743 Pnt 3919 3754 Pnt 3728 3779 Pnt 3603 2695 Pnt 3959 2556 Pnt 4312 2590 Pnt 3453 3753 Pnt 3650 3923 Pnt 3673 3754 Pnt 3851 3778 Pnt 3444 2761 Pnt 2209 1789 Pnt 3531 3745 Pnt 3695 3758 Pnt 3642 2670 Pnt 3715 3751 Pnt 3879 2753 Pnt 3848 3749 Pnt 3533 3748 Pnt 4285 2702 Pnt 3045 2347 Pnt 4059 2551 Pnt 3551 3734 Pnt 4010 3741 Pnt 3945 3746 Pnt 4135 2514 Pnt 3977 3779 Pnt 3749 2521 Pnt 3675 3745 Pnt 3444 3800 Pnt 3914 3743 Pnt 3625 2635 Pnt 3381 3747 Pnt 4439 3740 Pnt 3882 3745 Pnt 3484 3800 Pnt 3444 2567 Pnt 3760 3767 Pnt 3347 2536 Pnt 3930 3747 Pnt 4083 3769 Pnt 4250 3768 Pnt 4134 2504 Pnt 3857 2616 Pnt 2840 2236 Pnt 3061 2407 Pnt 4039 2494 Pnt 4152 2612 Pnt 3829 3739 Pnt 3661 3747 Pnt 3917 3822 Pnt 3628 2709 Pnt 3626 2655 Pnt 3814 2747 Pnt 3775 3738 Pnt 3542 3748 Pnt 4161 3737 Pnt 3574 2640 Pnt 3645 3795 Pnt 3663 2683 Pnt 3500 2590 Pnt 2514 2133 Pnt 3774 2611 Pnt 4136 2726 Pnt 3833 2760 Pnt 3490 3843 Pnt 3673 2603 Pnt 3474 2615 Pnt 3546 3777 Pnt 3987 3735 Pnt 3699 3750 Pnt 3582 2611 Pnt 2872 2290 Pnt 3397 2514 Pnt 3769 2843 Pnt 3512 3738 Pnt 4198 3798 Pnt 3551 2667 Pnt 4019 3749 Pnt 3722 2682 Pnt 3608 3847 Pnt 3670 2736 Pnt 4017 3755 Pnt 3701 3747 Pnt 3654 3770 Pnt 3825 2731 Pnt 4085 3748 Pnt 3567 3744 Pnt 4210 3749 Pnt 3413 2565 Pnt 2748 2251 Pnt 3783 2824 Pnt 4050 2661 Pnt 3300 3749 Pnt 3655 2571 Pnt 3352 2544 Pnt 3498 2598 Pnt 3729 2706 Pnt 3451 2580 Pnt 3607 3744 Pnt 3369 2532 Pnt 3302 3748 Pnt 3831 2588 Pnt 3333 2540 Pnt 3735 3751 Pnt 3662 3755 Pnt 2100 1530 Pnt 3771 3756 Pnt 4030 3756 Pnt 3310 3739 Pnt 4029 3746 Pnt 3296 3744 Pnt 2916 2286 Pnt 3470 2577 Pnt 3862 3760 Pnt 3884 3736 Pnt 4142 2869 Pnt 3441 3778 Pnt 3930 3741 Pnt 4266 2787 Pnt 3872 3790 Pnt 4257 2754 Pnt 3393 3754 Pnt 2714 2286 Pnt 3517 2631 Pnt 3479 3741 Pnt 3591 2670 Pnt 3224 2527 Pnt 3094 2268 Pnt 3519 3751 Pnt 3483 2729 Pnt 3511 3742 Pnt 3551 2587 Pnt 3471 3754 Pnt 3453 2615 Pnt 3536 2666 Pnt 2287 1992 Pnt 3880 2724 Pnt 3950 2872 Pnt 3511 2573 Pnt 3049 3739 Pnt 3320 3746 Pnt 3371 2451 Pnt 3906 3743 Pnt 3645 3752 Pnt 4042 2781 Pnt 3310 2469 Pnt 3755 2677 Pnt 3538 2624 Pnt 4155 3744 Pnt 3132 2453 Pnt 3624 3748 Pnt 3692 2504 Pnt 3667 2674 Pnt 3838 3766 Pnt 3788 2639 Pnt 3743 3741 Pnt 3554 2586 Pnt 3951 2776 Pnt 3221 2910 Pnt 3624 3743 Pnt 4188 2915 Pnt 3813 3746 Pnt 3946 2765 Pnt 3767 3743 Pnt 3713 2833 Pnt 4081 3751 Pnt 2017 3777 Pnt 3565 3745 Pnt 3989 3767 Pnt 3652 3748 Pnt 3518 3764 Pnt 3565 3748 Pnt 3381 2494 Pnt 3613 2620 Pnt 3726 2689 Pnt 3777 3739 Pnt 2611 1917 Pnt 4006 2917 Pnt 3948 3742 Pnt 3856 2460 Pnt 2708 2164 Pnt 3728 3743 Pnt 4387 3755 Pnt 4089 3836 Pnt 4035 3753 Pnt 3677 2659 Pnt 4297 2803 Pnt 3949 3750 Pnt 3487 2556 Pnt 4118 2681 Pnt 3459 2533 Pnt 3751 3734 Pnt 3516 2590 Pnt 3429 3742 Pnt 3874 2770 Pnt 3646 3801 Pnt 3950 2761 Pnt 3390 2882 Pnt 3445 3745 Pnt 3633 3765 Pnt 3593 2587 Pnt 3919 2787 Pnt 3505 3755 Pnt 3460 2551 Pnt 3925 3746 Pnt 2203 1784 Pnt 3943 3834 Pnt 3774 2760 Pnt 3338 2618 Pnt 3546 2595 Pnt 3907 3753 Pnt 3732 2969 Pnt 3417 3738 Pnt 3826 3934 Pnt 3702 2681 Pnt 3327 2514 Pnt 3573 3804 Pnt 4037 2621 Pnt 4121 3774 Pnt 3614 2593 Pnt 3600 2618 Pnt 3692 3757 Pnt 3799 2762 Pnt 3521 3746 Pnt 4149 2744 Pnt 4019 2689 Pnt 3310 2570 Pnt 3779 3769 Pnt 4141 2858 Pnt 3588 3746 Pnt 3770 2587 Pnt 3626 2653 Pnt 3552 2607 Pnt 4238 2556 Pnt 3865 3759 Pnt 3878 2753 Pnt 3504 3749 Pnt 3506 2593 Pnt 3886 3741 Pnt 2620 3785 Pnt 3325 3747 Pnt 3333 2494 Pnt 4053 2797 Pnt 3814 3742 Pnt 3950 3749 Pnt 3836 2469 Pnt 3921 3741 Pnt 3946 2686 Pnt 3534 2637 Pnt 3536 2469 Pnt 3896 2757 Pnt 3308 3747 Pnt 3378 2549 Pnt 3954 2747 Pnt 4112 2932 Pnt 3566 3762 Pnt 3616 2657 Pnt 3340 3738 Pnt 3977 2597 Pnt 4160 2633 Pnt 3492 3746 Pnt 3729 3776 Pnt 3366 2553 Pnt 3860 3738 Pnt 4482 2933 Pnt 3598 2636 Pnt 3375 2514 Pnt 3315 2474 Pnt 3569 2666 Pnt 3130 3742 Pnt 3590 2463 Pnt 3925 2789 Pnt 3438 3824 Pnt 3655 3741 Pnt 3812 3747 Pnt 3557 2603 Pnt 3927 3740 Pnt 3971 3836 Pnt 3943 2795 Pnt 4442 3847 Pnt 3615 2542 Pnt 3887 3742 Pnt 3871 3731 Pnt 3896 3743 Pnt 3232 2472 Pnt 3911 2701 Pnt 3645 2612 Pnt 3362 2579 Pnt 3851 3749 Pnt 4175 3742 Pnt 3587 2661 Pnt 3862 2731 Pnt 3898 2920 Pnt 4056 2731 Pnt 3840 2717 Pnt 3862 2737 Pnt 3252 2443 Pnt 2842 2252 Pnt 3718 3763 Pnt 3789 2494 Pnt 2862 3744 Pnt 3724 3773 Pnt 3562 2736 Pnt 3767 2843 Pnt 2823 3741 Pnt 3634 3764 Pnt 4109 2747 Pnt 3661 3758 Pnt 3667 2706 Pnt 4081 2821 Pnt 3845 2823 Pnt 3657 3746 Pnt 4198 3764 Pnt 3959 3748 Pnt 3381 3738 Pnt 3385 2528 Pnt 4054 3748 Pnt 4027 3743 Pnt 3087 2447 Pnt 3620 2602 Pnt 3594 3745 Pnt 3997 2747 Pnt 3550 2595 Pnt 3802 2583 Pnt 3916 2537 Pnt 3477 2549 Pnt 3711 2616 Pnt 3620 3827 Pnt 3781 3734 Pnt 4344 3745 Pnt 3791 2683 Pnt 3294 3751 Pnt 3851 2736 Pnt 3449 3745 Pnt 3290 3771 Pnt 3655 2757 Pnt 3888 2706 Pnt 3530 2595 Pnt 3843 2702 Pnt 3550 2612 Pnt 3824 3744 Pnt 4203 2565 Pnt 3870 2820 Pnt 3859 3743 Pnt 3567 2499 Pnt 3979 3745 Pnt 3672 2746 Pnt 3331 3741 Pnt 3833 3793 Pnt 4005 3743 Pnt 3659 3748 Pnt 3492 2682 Pnt 3557 2622 Pnt 3955 2835 Pnt 3535 3747 Pnt 3486 2628 Pnt 3182 3745 Pnt 4375 2560 Pnt 4037 3742 Pnt 3247 3793 Pnt 3003 3746 Pnt 3271 2576 Pnt 3002 2343 Pnt 4201 3757 Pnt 3575 2616 Pnt 3877 2615 Pnt 3711 3750 Pnt 4028 3750 Pnt 4285 2615 Pnt 3800 2759 Pnt 3525 3752 Pnt 4184 2910 Pnt 3784 3751 Pnt 3466 3796 Pnt 3741 2671 Pnt 4108 3741 Pnt 4329 3744 Pnt 3517 2887 Pnt 3288 2460 Pnt 4022 2682 Pnt 3949 3735 Pnt 2916 2360 Pnt 3671 2701 Pnt 4216 3777 Pnt 3158 2441 Pnt 4018 2836 Pnt 3888 3803 Pnt 3648 2683 Pnt 3935 2800 Pnt 3309 2604 Pnt 3712 3817 Pnt 3237 2489 Pnt 4200 3746 Pnt 4104 3741 Pnt 3618 3751 Pnt 3818 3754 Pnt 3508 2665 Pnt 3747 3742 Pnt 4320 3045 Pnt 3644 3809 Pnt 3683 2847 Pnt 4147 2729 Pnt 3663 2661 Pnt 3930 2735 Pnt 3625 3749 Pnt 4384 2772 Pnt 3992 3739 Pnt 3318 2591 Pnt 3354 2520 Pnt 3941 2872 Pnt 3945 3740 Pnt 4418 2571 Pnt 3849 3743 Pnt 3948 3741 Pnt 4160 3761 Pnt 3412 2542 Pnt 3560 3752 Pnt 4195 3755 Pnt 3561 3799 Pnt 3587 2652 Pnt 3617 3825 Pnt 3505 3807 Pnt 3406 3765 Pnt 3429 3746 Pnt 3399 2579 Pnt 3891 2730 Pnt 3933 3737 Pnt 4042 3755 Pnt 3277 3766 Pnt 3629 3762 Pnt 3132 2498 Pnt 3427 3744 Pnt 3617 2609 Pnt 3920 2734 Pnt 3905 2663 Pnt 2779 3785 Pnt 3083 3746 Pnt 3703 2696 Pnt 3833 2636 Pnt 3909 3829 Pnt 3431 3736 Pnt 3850 3791 Pnt 3328 2474 Pnt 3937 3775 Pnt 3513 3746 Pnt 3607 3749 Pnt 4371 2760 Pnt 3821 3746 Pnt 4269 3758 Pnt 3660 2700 Pnt 3617 3753 Pnt 3502 3743 Pnt 3597 2706 Pnt 3795 3808 Pnt 3898 3750 Pnt 4254 2810 Pnt 3569 2586 Pnt 3454 3747 Pnt 2345 1623 Pnt 3622 3823 Pnt 3761 2720 Pnt 3765 3752 Pnt 3576 2632 Pnt 3794 3841 Pnt 3888 2631 Pnt 3593 2561 Pnt 3659 3783 Pnt 3870 3750 Pnt 3490 2642 Pnt 3836 3758 Pnt 3281 2509 Pnt 3856 3753 Pnt 4264 3746 Pnt 3540 2631 Pnt 4068 3741 Pnt 3790 3736 Pnt 3684 3746 Pnt 3310 2632 Pnt 3333 2494 Pnt 3762 3741 Pnt 3501 3747 Pnt 3340 3742 Pnt 3476 3753 Pnt 3123 2448 Pnt 3893 2792 Pnt 4414 3742 Pnt 3470 2615 Pnt 3967 2833 Pnt 3843 2747 Pnt 3418 3748 Pnt 3654 3733 Pnt 4077 3742 Pnt 3493 2583 Pnt 3396 3761 Pnt 3865 2751 Pnt 3927 3748 Pnt 3582 3754 Pnt 3945 3755 Pnt 3737 2735 Pnt 3841 3744 Pnt 3637 2737 Pnt 4004 3743 Pnt 3417 2595 Pnt 3988 3762 Pnt 3349 3751 Pnt 2869 2311 Pnt 3333 2591 Pnt 4216 2855 Pnt 3816 2749 Pnt 3879 3746 Pnt 4055 2623 Pnt 3554 2620 Pnt 3657 2660 Pnt 2997 2309 Pnt 3604 2635 Pnt 4005 3786 Pnt 3654 3751 Pnt 3805 2923 Pnt 3685 2665 Pnt 3522 2583 Pnt 3672 3749 Pnt 3819 3752 Pnt 3968 2701 Pnt 3793 3742 Pnt 3596 2674 Pnt 3817 3747 Pnt 3468 2565 Pnt 3260 2509 Pnt 3577 2616 Pnt 4405 2595 Pnt 3955 2726 Pnt 3495 3774 Pnt 3493 2559 Pnt 3672 2686 Pnt 4085 2945 Pnt 3477 2541 Pnt 3910 2737 Pnt 3457 3735 Pnt 3925 2725 Pnt 3880 3745 Pnt 3354 2494 Pnt 3577 2646 Pnt 3674 3741 Pnt 3749 2514 Pnt 4026 2740 Pnt 3679 2695 Pnt 3140 2410 Pnt 3590 2544 Pnt 3403 2513 Pnt 4163 3752 Pnt 4092 2978 Pnt 3979 3752 Pnt 3763 3749 Pnt 3891 2791 Pnt 3732 2693 Pnt 3543 2616 Pnt 4392 3746 Pnt 3343 3743 Pnt 3621 2667 Pnt 3507 3756 Pnt 3458 2533 Pnt 3883 2780 Pnt 3794 2736 Pnt 3632 2695 Pnt 3441 2514 Pnt 3613 3752 Pnt 3760 2682 Pnt 3916 2751 Pnt 4335 3747 Pnt 3712 2672 Pnt 3389 3761 Pnt 3517 3938 Pnt 4008 3758 Pnt 4063 3752 Pnt 3538 2615 Pnt 3785 3756 Pnt 3709 2657 Pnt 3946 3761 Pnt 3521 3741 Pnt 3875 2745 Pnt 3987 3751 Pnt 3526 3745 Pnt 4044 3740 Pnt 3554 2623 Pnt 3829 2556 Pnt 3755 3746 Pnt 4181 3830 Pnt 3653 2547 Pnt 4009 3743 Pnt 3622 3745 Pnt 3600 3743 Pnt 3508 2762 Pnt 3892 3749 Pnt 3872 2533 Pnt 3764 2681 Pnt 3975 3744 Pnt 3589 2576 Pnt 4104 3781 Pnt 3113 3750 Pnt 3011 2419 Pnt 3922 3770 Pnt 4179 2628 Pnt 3436 2537 Pnt 4304 2742 Pnt 4023 2821 Pnt 4051 3755 Pnt 2208 1762 Pnt 3618 2608 Pnt 3362 3740 Pnt 3533 3757 Pnt 3704 2565 Pnt 3473 2658 Pnt 3904 3743 Pnt 3553 2586 Pnt 3846 2789 Pnt 4003 2556 Pnt 3516 3743 Pnt 4095 3738 Pnt 3876 3747 Pnt 3863 3748 Pnt 4174 2527 Pnt 3258 2513 Pnt 4066 3760 Pnt 3702 3748 Pnt 3549 3758 Pnt 3725 3778 Pnt 3228 3757 Pnt 3938 2882 Pnt 4171 2886 Pnt 3697 3746 Pnt 3383 2514 Pnt 4082 2882 Pnt 3374 3754 Pnt 3358 2520 Pnt 3844 3746 Pnt 3820 3744 Pnt 3377 2528 Pnt 3424 3748 Pnt 3889 3736 Pnt 3789 2729 Pnt 3840 3739 Pnt 3450 2591 Pnt 3515 2595 Pnt 3376 3755 Pnt 3974 3746 Pnt 3368 3747 Pnt 3764 3738 Pnt 3380 3748 Pnt 4122 3799 Pnt 3615 2684 Pnt 3793 3748 Pnt 3567 2655 Pnt 2989 3746 Pnt 2159 3741 Pnt 4055 3808 Pnt 4545 2691 Pnt 3714 3742 Pnt 3930 3786 Pnt 3464 3822 Pnt 3739 3737 Pnt 3439 2616 Pnt 3786 3749 Pnt 3565 2509 Pnt 3327 3781 Pnt 3590 2635 Pnt 3779 2726 Pnt 3926 3744 Pnt 3643 2707 Pnt 3734 3748 Pnt 3610 3747 Pnt 3619 3758 Pnt 3581 2647 Pnt 3621 2879 Pnt 3627 2644 Pnt 3892 3853 Pnt 3230 2508 Pnt 3457 2689 Pnt 3877 3787 Pnt 4179 2699 Pnt 3304 2518 Pnt 3900 2682 Pnt 3266 3747 Pnt 3556 2611 Pnt 3672 2672 Pnt 3666 2537 Pnt 3971 2741 Pnt 3638 2706 Pnt 3823 3749 Pnt 3611 2669 Pnt 4045 3765 Pnt 4106 2669 Pnt 3947 2810 Pnt 3800 2717 Pnt 3574 2569 Pnt 4042 2645 Pnt 3724 2927 Pnt 4002 2586 Pnt 3778 3736 Pnt 4036 2838 Pnt 3534 3777 Pnt 3289 3744 Pnt 3663 2651 Pnt 3819 3756 Pnt 3642 3743 Pnt 3525 3796 Pnt 3380 3795 Pnt 3453 2539 Pnt 3624 2833 Pnt 3658 3757 Pnt 3985 3760 Pnt 3575 3743 Pnt 3657 2673 Pnt 3714 2725 Pnt 3947 3782 Pnt 4417 3745 Pnt 3413 2521 Pnt 4060 3742 Pnt 3450 2474 Pnt 3738 3745 Pnt 2720 2248 Pnt 3824 3813 Pnt 3716 3802 Pnt 3584 3812 Pnt 3695 2665 Pnt 3279 2562 Pnt 3465 3752 Pnt 3771 3746 Pnt 3819 2609 Pnt 3975 3770 Pnt 3393 2519 Pnt 3875 3755 Pnt 3870 3750 Pnt 3517 3772 Pnt 4092 2503 Pnt 3515 2633 Pnt 3096 3816 Pnt 4008 3740 Pnt 3737 3745 Pnt 4002 2853 Pnt 3564 3816 Pnt 3559 3762 Pnt 3869 2705 Pnt 3865 3750 Pnt 3663 3756 Pnt 3535 2595 Pnt 3413 2544 Pnt 3556 2607 Pnt 3493 2595 Pnt 3567 3782 Pnt 3614 3751 Pnt 3337 2527 Pnt 3481 2597 Pnt 3450 3751 Pnt 3933 3794 Pnt 3950 2792 Pnt 3880 3752 Pnt 3998 2792 Pnt 3809 3743 Pnt 3997 3735 Pnt 3469 3752 Pnt 3936 3805 Pnt 3704 3750 Pnt 4250 3756 Pnt 3429 2528 Pnt 3977 3733 Pnt 3485 2625 Pnt 3968 2823 Pnt 3916 2772 Pnt 3357 3758 Pnt 3696 3742 Pnt 4136 3754 Pnt 3552 2627 Pnt 3426 3756 Pnt 3804 2829 Pnt 4136 2710 Pnt 3426 2527 Pnt 3349 2499 Pnt 4410 2806 Pnt 3691 2642 Pnt 3639 2637 Pnt 3487 3744 Pnt 3599 3774 Pnt 4203 2816 Pnt 4179 2717 Pnt 3688 3739 Pnt 3779 3741 Pnt 3390 3767 Pnt 3719 3761 Pnt 3617 3817 Pnt 3483 3748 Pnt 4140 2669 Pnt 4050 2657 Pnt 3476 3754 Pnt 3386 3743 Pnt 2379 2037 Pnt 4273 2915 Pnt 3768 3767 Pnt 3684 3744 Pnt 4071 2574 Pnt 3891 2797 Pnt 3811 2725 Pnt 3412 3767 Pnt 3789 2740 Pnt 4316 3751 Pnt 4012 2646 Pnt 3790 2726 Pnt 3247 2544 Pnt 4478 2616 Pnt 3721 3740 Pnt 3765 3760 Pnt 3939 2672 Pnt 3548 3752 Pnt 3903 2741 Pnt 4014 3752 Pnt 4302 3752 Pnt 3419 2547 Pnt 3846 2744 Pnt 3663 3740 Pnt 3615 3795 Pnt 4111 2737 Pnt 3864 2751 Pnt 3477 3755 Pnt 3468 2579 Pnt 3628 2699 Pnt 3648 2663 Pnt 3713 2564 Pnt 3593 3763 Pnt 3577 2747 Pnt 3489 3746 Pnt 4322 3759 Pnt 3902 3745 Pnt 3323 3811 Pnt 3812 2606 Pnt 4041 3743 Pnt 3801 2970 Pnt 4119 3758 Pnt 3598 3766 Pnt 3355 3813 Pnt 3545 2692 Pnt 3867 3770 Pnt 3595 3739 Pnt 3558 3754 Pnt 3720 3770 Pnt 4170 2874 Pnt 3510 2608 Pnt 3709 3740 Pnt 3436 3746 Pnt 3974 3752 Pnt 4267 3757 Pnt 3533 3745 Pnt 3338 3902 Pnt 3590 2584 Pnt 3449 2556 Pnt 3275 2527 Pnt 3941 3878 Pnt 3819 2729 Pnt 3550 2641 Pnt 4101 3739 Pnt 3431 2579 Pnt 3458 3808 Pnt 3412 3760 Pnt 4198 3744 Pnt 3431 2598 Pnt 3926 3757 Pnt 3322 2842 Pnt 4203 3054 Pnt 3698 2689 Pnt 3788 2604 Pnt 3994 2684 Pnt 3792 3745 Pnt 3447 2565 Pnt 4160 3744 Pnt 3282 2499 Pnt 3798 3744 Pnt 4079 3742 Pnt 4036 3754 Pnt 3660 3758 Pnt 3236 2509 Pnt 3935 3798 Pnt 3773 2700 Pnt 4122 2573 Pnt 3380 2583 Pnt 3853 2760 Pnt 3883 3738 Pnt 3041 2399 Pnt 3609 3750 Pnt 4058 2662 Pnt 3921 2583 Pnt 3668 3763 Pnt 3692 2663 Pnt 3963 3765 Pnt 3459 3748 Pnt 4139 2628 Pnt 3340 2523 Pnt 3755 2563 Pnt 4172 3801 Pnt 3615 3758 Pnt 3751 3799 Pnt 3573 3746 Pnt 3927 2627 Pnt 3510 3778 Pnt 3868 3737 Pnt 4029 2720 Pnt 3582 2604 Pnt 3920 3746 Pnt 3713 2691 Pnt 3539 2528 Pnt 3424 2540 Pnt 3964 2546 Pnt 3511 2611 Pnt 3469 2578 Pnt 3572 2587 Pnt 3447 2586 Pnt 3716 2651 Pnt 3065 2464 Pnt 3697 3800 Pnt 3786 2537 Pnt 3943 3748 Pnt 4121 3750 Pnt 3884 3752 Pnt 3974 3746 Pnt 3713 3760 Pnt 3712 3741 Pnt 3483 2494 Pnt 3880 3747 Pnt 3667 3777 Pnt 4068 3760 Pnt 3936 3740 Pnt 3464 2542 Pnt 3956 2546 Pnt 3753 2509 Pnt 4107 3737 Pnt 3811 3740 Pnt 3724 3741 Pnt 4359 3758 Pnt 3518 2586 Pnt 3524 2560 Pnt 3914 3868 Pnt 4277 2852 Pnt 4185 2902 Pnt 3790 2604 Pnt 3693 3745 Pnt 3986 2905 Pnt 3442 3766 Pnt 3354 3798 Pnt 3638 2644 Pnt 3441 3753 Pnt 4020 2750 Pnt 3500 2580 Pnt 3570 3738 Pnt 3421 2497 Pnt 3374 2618 Pnt 3908 3745 Pnt 3432 3743 Pnt 3890 2578 Pnt 3769 2743 Pnt 3377 3742 Pnt 4126 2860 Pnt 3699 2652 Pnt 4138 2833 Pnt 4194 2537 Pnt 3834 2556 Pnt 3505 3740 Pnt 4196 3751 Pnt 4274 3777 Pnt 4181 3750 Pnt 3370 3757 Pnt 3581 2590 Pnt 3409 2546 Pnt 3638 2523 Pnt 3705 3839 Pnt 3396 2474 Pnt 4151 3750 Pnt 3770 3743 Pnt 3442 3744 Pnt 3479 2313 Pnt 3317 3732 Pnt 4094 3755 Pnt 3184 2532 Pnt 3750 2661 Pnt 3370 3760 Pnt 3816 3745 Pnt 3506 2511 Pnt 3745 3734 Pnt 3769 2676 Pnt 3561 2710 Pnt 3998 3748 Pnt 3442 2503 Pnt 4181 3798 Pnt 3712 2665 Pnt 3408 2536 Pnt 3898 2632 Pnt 4142 3738 Pnt 3773 3800 Pnt 3734 2852 Pnt 3573 2618 Pnt 4034 3750 Pnt 3483 3743 Pnt 3706 2687 Pnt 3948 2753 Pnt 3159 3735 Pnt 3603 2514 Pnt 3021 2667 Pnt 3494 2581 Pnt 3669 3784 Pnt 3426 2538 Pnt 3684 2494 Pnt 4000 2669 Pnt 3693 2652 Pnt 3490 2565 Pnt 3754 2587 Pnt 3546 2599 Pnt 3688 3740 Pnt 3512 3744 Pnt 3835 2546 Pnt 3387 2518 Pnt 3597 2812 Pnt 4006 3750 Pnt 3969 3738 Pnt 3480 3758 Pnt 3518 3746 Pnt 3592 3740 Pnt 3449 2542 Pnt 3625 2654 Pnt 4067 2829 Pnt 3640 3753 Pnt 4346 2824 Pnt 3436 2528 Pnt 3964 2741 Pnt 3616 3756 Pnt 4147 3753 Pnt 3334 3739 Pnt 3321 2666 Pnt 3366 3733 Pnt 3637 3757 Pnt 3687 2657 Pnt 4319 2693 Pnt 3868 3760 Pnt 3405 2898 Pnt 3431 3741 Pnt 3955 3831 Pnt 3789 2587 Pnt 3396 2514 Pnt 3763 3741 Pnt 4224 2489 Pnt 3983 2742 Pnt 3591 3760 Pnt 3455 3751 Pnt 4379 3740 Pnt 3654 2702 Pnt 3702 3756 Pnt 3905 3752 Pnt 3764 3752 Pnt 3926 3751 Pnt 3680 2657 Pnt 3630 3750 Pnt 3501 2646 Pnt 3616 2514 Pnt 3551 2787 Pnt 3586 3749 Pnt 3678 2623 Pnt 3805 3745 Pnt 3496 2538 Pnt 4036 3740 Pnt 3610 2670 Pnt 3112 2396 Pnt 4254 3755 Pnt 3462 3744 Pnt 3477 2602 Pnt 3816 2748 Pnt 3337 3749 Pnt 3556 3778 Pnt 3372 3744 Pnt 3548 3742 Pnt 3897 2730 Pnt 3369 2514 Pnt 3699 2692 Pnt 3550 3740 Pnt 3704 3740 Pnt 4277 3756 Pnt 3691 2773 Pnt 3594 2618 Pnt 4058 3741 Pnt 3407 2598 Pnt 3460 2598 Pnt 3460 3745 Pnt 3682 3745 Pnt 3434 2579 Pnt 4175 3739 Pnt 3921 3754 Pnt 3604 2949 Pnt 3739 2702 Pnt 3269 2581 Pnt 4074 3743 Pnt 3501 3902 Pnt 3450 2584 Pnt 4021 2771 Pnt 3929 2729 Pnt 3329 2516 Pnt 3520 3739 Pnt 3852 2634 Pnt 3464 2598 Pnt 3510 2623 Pnt 3524 2683 Pnt 3300 3745 Pnt 3764 2574 Pnt 4478 3771 Pnt 3663 3762 Pnt 3843 2746 Pnt 4191 3742 Pnt 2667 2121 Pnt 3513 3749 Pnt 4306 3766 Pnt 3495 3737 Pnt 4131 3743 Pnt 4004 2804 Pnt 3754 3737 Pnt 3741 2616 Pnt 2935 3745 Pnt 3563 3757 Pnt 3342 3787 Pnt 3483 3764 Pnt 3825 3737 Pnt 3030 3762 Pnt 4061 3744 Pnt 3363 3811 Pnt 3865 2757 Pnt 3709 2651 Pnt 4152 3755 Pnt 3472 3742 Pnt 3558 3765 Pnt 3312 3745 Pnt 3874 2577 Pnt 4414 2792 Pnt 3763 3750 Pnt 3479 3751 Pnt 3989 3752 Pnt 3802 2624 Pnt 3490 3815 Pnt 4092 2860 Pnt 3334 3755 Pnt 3347 2561 Pnt 3578 3756 Pnt 3712 2720 Pnt 3333 3745 Pnt 3142 2433 Pnt 3914 3750 Pnt 3576 3751 Pnt 3280 3744 Pnt 3633 3820 Pnt 3298 3744 Pnt 3203 3741 Pnt 3420 3776 Pnt 3584 2645 Pnt 3488 3745 Pnt 3435 2672 Pnt 3376 3745 Pnt 3882 2693 Pnt 3750 2751 Pnt 3653 2684 Pnt 3819 3748 Pnt 3316 3761 Pnt 3431 2582 Pnt 4027 3737 Pnt 3764 3743 Pnt 3483 3815 Pnt 3379 2509 Pnt 4030 3737 Pnt 3630 3745 Pnt 3195 2500 Pnt 3561 3759 Pnt 3339 3750 Pnt 3399 2533 Pnt 3339 2709 Pnt 3600 2818 Pnt 3312 2583 Pnt 3396 2539 Pnt 3764 3761 Pnt 3482 2624 Pnt 3295 3814 Pnt 3302 3746 Pnt 3362 3751 Pnt 3358 3767 Pnt 3549 2595 Pnt 3328 3734 Pnt 3881 3747 Pnt 3683 3739 Pnt 3645 3746 Pnt 3500 2586 Pnt 3560 3739 Pnt 3444 2537 Pnt 3411 3743 Pnt 2734 2200 Pnt 3279 3794 Pnt 3582 3743 Pnt 4141 3747 Pnt 3649 3768 Pnt 4092 3788 Pnt 3895 3740 Pnt 3357 3766 Pnt 3392 2524 Pnt 3219 3808 Pnt 3806 2773 Pnt 3792 2709 Pnt 3351 3759 Pnt 4098 3742 Pnt 3384 2481 Pnt 3396 2497 Pnt 3804 3739 Pnt 4029 2866 Pnt 3348 2501 Pnt 3292 3759 Pnt 3545 2604 Pnt 3696 2806 Pnt 3882 3743 Pnt 3806 3741 Pnt 3914 3746 Pnt 3925 3750 Pnt 3423 2537 Pnt 3323 2499 Pnt 4147 3745 Pnt 3231 2507 Pnt 3863 3746 Pnt 3930 3761 Pnt 3750 3746 Pnt 3465 2943 Pnt 3908 3799 Pnt 3318 3808 Pnt 3459 2561 Pnt 4007 3761 Pnt 3618 3797 Pnt 3580 2632 Pnt 3519 3750 Pnt 3675 3743 Pnt 3463 2556 Pnt 3330 2523 Pnt 3545 2632 Pnt 3197 2454 Pnt 3037 2431 Pnt 2932 3743 Pnt 3743 3742 Pnt 2811 2384 Pnt 3811 2710 Pnt 3771 3746 Pnt 3782 2579 Pnt 3111 3739 Pnt 3400 3755 Pnt 3597 3754 Pnt 3879 3816 Pnt 3471 2838 Pnt 3416 2514 Pnt 3586 2642 Pnt 4216 2726 Pnt 3559 3743 Pnt 4280 3738 Pnt 3901 2680 Pnt 3771 3803 Pnt 3354 3749 Pnt 3569 2590 Pnt 4104 3782 Pnt 3847 2902 Pnt 4140 2907 Pnt 4007 2769 Pnt 3507 2295 Pnt 3958 3750 Pnt 3463 2581 Pnt 3325 2484 Pnt 3931 3747 Pnt 3832 2633 Pnt 3366 3739 Pnt 3574 3741 Pnt 3823 2721 Pnt 3604 3747 Pnt 3727 2730 Pnt 3694 3752 Pnt 3248 3761 Pnt 3336 3756 Pnt 3727 3744 Pnt 3441 2551 Pnt 3598 2642 Pnt 4036 3792 Pnt 3458 3744 Pnt 3859 3741 Pnt 3352 2494 Pnt 3090 3738 Pnt 3899 2703 Pnt 3505 3752 Pnt 3792 2763 Pnt 3638 3751 Pnt 3577 3867 Pnt 3538 3747 Pnt 3695 2751 Pnt 3636 3747 Pnt 4029 2708 Pnt 4007 3756 Pnt 4002 3756 Pnt 4037 3739 Pnt 3890 2762 Pnt 2868 3871 Pnt 3839 2741 Pnt 3482 2634 Pnt 3579 3780 Pnt 4159 3756 Pnt 3623 2709 Pnt 3358 3760 Pnt 3911 3747 Pnt 3568 3733 Pnt 3920 3751 Pnt 3671 2666 Pnt 3005 2437 Pnt 4053 3761 Pnt 4041 3747 Pnt 3089 3737 Pnt 3665 3755 Pnt 3947 3850 Pnt 3794 3752 Pnt 3493 2573 Pnt 3644 3775 Pnt 3881 3767 Pnt 4014 3754 Pnt 3828 2702 Pnt 3315 3744 Pnt 3639 3747 Pnt 3596 3833 Pnt 3566 2630 Pnt 3587 3759 Pnt 3879 2704 Pnt 3458 3745 Pnt 3543 3762 Pnt 3476 3750 Pnt 3553 3748 Pnt 3602 3745 Pnt 3391 2514 Pnt 4107 2434 Pnt 3358 3740 Pnt 3942 3771 Pnt 3293 3757 Pnt 3474 3760 Pnt 2821 3744 Pnt 3538 3754 Pnt 3537 3744 Pnt 3927 3739 Pnt 2853 2325 Pnt 3526 2623 Pnt 3745 2605 Pnt 3395 2536 Pnt 3719 3749 Pnt 3712 3835 Pnt 3824 2696 Pnt 4064 3749 Pnt 3793 2707 Pnt 3830 3754 Pnt 3916 3746 Pnt 3451 2636 Pnt 4245 3748 Pnt 3746 2843 Pnt 3426 3750 Pnt 3802 3760 Pnt 3824 3843 Pnt 3795 2776 Pnt 4045 3762 Pnt 3490 2852 Pnt 3926 3786 Pnt 4094 3750 Pnt 3681 2714 Pnt 2781 2300 Pnt 3640 3822 Pnt 3622 3747 Pnt 4005 3751 Pnt 3576 3751 Pnt 3838 2840 Pnt 4472 2948 Pnt 3469 3741 Pnt 3626 2624 Pnt 3572 3746 Pnt 3639 3753 Pnt 3427 2587 Pnt 3569 3745 Pnt 3791 3736 Pnt 2993 2419 Pnt 3496 2673 Pnt 3582 3754 Pnt 3958 2855 Pnt 3792 3749 Pnt 3738 3747 Pnt 3529 2658 Pnt 3670 2645 Pnt 3820 3748 Pnt 3744 3750 Pnt 4075 3801 Pnt 3891 3749 Pnt 3183 3748 Pnt 3154 2489 Pnt 4183 3751 Pnt 3916 2810 Pnt 3505 2703 Pnt 3578 3846 Pnt 3730 2709 Pnt 3370 2937 Pnt 3656 2703 Pnt 3674 2685 Pnt 3752 2731 Pnt 3963 3800 Pnt 4013 3801 Pnt 4473 2979 Pnt 3934 3772 Pnt 4184 3746 Pnt 3537 2683 Pnt 3874 2613 Pnt 3670 3748 Pnt 3709 3804 Pnt 2727 2237 Pnt 4030 2853 Pnt 4216 3752 Pnt 3659 3755 Pnt 3878 3825 Pnt 3544 3737 Pnt 3824 2762 Pnt 3660 3815 Pnt 4262 3746 Pnt 3432 2881 Pnt 3394 2579 Pnt 3527 3740 Pnt 4018 3746 Pnt 2508 2146 Pnt 4129 3114 Pnt 3933 2811 Pnt 3422 2580 Pnt 3925 3742 Pnt 2666 2242 Pnt 3788 3747 Pnt 4105 3753 Pnt 3633 2710 Pnt 3833 3746 Pnt 3807 3745 Pnt 4470 3760 Pnt 3387 2571 Pnt 3454 2664 Pnt 3961 3752 Pnt 4272 3750 Pnt 3519 3751 Pnt 3435 2600 Pnt 3796 2632 Pnt 4156 3762 Pnt 3610 3764 Pnt 4051 3743 Pnt 3965 3745 Pnt 2865 2295 Pnt 4131 3775 Pnt 3602 2633 Pnt 3111 3788 Pnt 3706 3753 Pnt 3335 2508 Pnt 3487 3748 Pnt 3844 3752 Pnt 3823 3763 Pnt 4101 3740 Pnt 4392 3750 Pnt 2645 2224 Pnt 3737 3770 Pnt 4022 3749 Pnt 3835 2655 Pnt 3783 3740 Pnt 3158 3737 Pnt 4051 3001 Pnt 4069 3764 Pnt 3971 2762 Pnt 3637 3738 Pnt 4065 3741 Pnt 3753 2689 Pnt 3754 2772 Pnt 3459 3777 Pnt 3789 3747 Pnt 3822 3745 Pnt 3724 2728 Pnt 3912 3828 Pnt 3933 2569 Pnt 3067 2467 Pnt 3646 3744 Pnt 3680 3807 Pnt 4025 2726 Pnt 3455 2605 Pnt 3582 3802 Pnt 3478 3765 Pnt 3493 3759 Pnt 3423 2798 Pnt 3341 3743 Pnt 3066 2434 Pnt 3755 3745 Pnt 3564 3749 Pnt 3621 3754 Pnt 4095 3758 Pnt 3775 3813 Pnt 4055 3774 Pnt 4039 3749 Pnt 3712 3746 Pnt 3676 3742 Pnt 3948 3744 Pnt 2526 3763 Pnt 3852 3748 Pnt 3625 3743 Pnt 2757 2237 Pnt 4107 2803 Pnt 3879 3754 Pnt 3680 3746 Pnt 3528 3744 Pnt 4146 2627 Pnt 3151 3749 Pnt 3712 2535 Pnt 3768 2849 Pnt 3698 3735 Pnt 3654 2630 Pnt 4143 3783 Pnt 4183 3740 Pnt 3959 2842 Pnt 3522 2612 Pnt 4118 3762 Pnt 3755 3799 Pnt 4107 3762 Pnt 3848 3763 Pnt 4312 3749 Pnt 3756 3757 Pnt 3886 3737 Pnt 3428 3743 Pnt 3746 3739 Pnt 3225 2488 Pnt 3811 3809 Pnt 3220 2477 Pnt 3560 2636 Pnt 3388 2628 Pnt 4102 3736 Pnt 4013 2840 Pnt 3615 3829 Pnt 4501 3736 Pnt 3059 2369 Pnt 3665 2749 Pnt 3619 2626 Pnt 3665 3759 Pnt 3279 2564 Pnt 4065 3743 Pnt 3769 3746 Pnt 4265 3765 Pnt 3751 3755 Pnt 4100 3756 Pnt 4331 3748 Pnt 3483 2577 Pnt 3946 3803 Pnt 3668 2693 Pnt 3678 2677 Pnt 3468 2616 Pnt 3379 2790 Pnt 4175 2834 Pnt 4298 3741 Pnt 4280 3734 Pnt 3367 2613 Pnt 3778 3819 Pnt 3703 3754 Pnt 4186 3759 Pnt 3920 3748 Pnt 3325 3757 Pnt 3907 3818 Pnt 3249 3754 Pnt 4422 2868 Pnt 3374 2586 Pnt 3389 2559 Pnt 3409 3742 Pnt 3751 2851 Pnt 3429 2606 Pnt 3176 2530 Pnt 3229 2474 Pnt 3787 2713 Pnt 4039 2756 Pnt 4090 3759 Pnt 4443 2924 Pnt 4636 3748 Pnt 3637 2681 Pnt 3492 2605 Pnt 4132 2874 Pnt 4121 3746 Pnt 4452 3758 Pnt 3550 2664 Pnt 3824 3751 Pnt 3042 2506 Pnt 3823 3736 Pnt 3704 2710 Pnt 3418 2670 Pnt 3604 2906 Pnt 3300 3743 Pnt 3808 2813 Pnt 4103 2865 Pnt 3498 3757 Pnt 3617 3799 Pnt 3213 2498 Pnt 3625 2664 Pnt 2019 3757 Pnt 4038 3754 Pnt 3906 3772 Pnt 3511 3751 Pnt 4189 3753 Pnt 4140 3800 Pnt 3390 3742 Pnt 3690 3049 Pnt 3953 2779 Pnt 2977 2374 Pnt 3577 2637 Pnt 3710 2848 Pnt 4218 2590 Pnt 3817 3816 Pnt 3954 3740 Pnt 3541 3742 Pnt 4154 3813 Pnt 4047 2838 Pnt 3912 3767 Pnt 3613 3819 Pnt 3916 2756 Pnt 3336 2605 Pnt 3403 3757 Pnt 4360 3750 Pnt 3505 3744 Pnt 4082 3757 Pnt 3314 2610 Pnt 4337 3749 Pnt 4214 2875 Pnt 3897 3746 Pnt 3574 3745 Pnt 3771 3749 Pnt 3884 3869 Pnt 3264 2547 Pnt 4169 2776 Pnt 3928 3750 Pnt 3394 2569 Pnt 3598 2627 Pnt 3871 3756 Pnt 4035 3758 Pnt 3672 2702 Pnt 3975 3751 Pnt 3516 2635 Pnt 3813 2759 Pnt 3517 2678 Pnt 4292 3748 Pnt 3825 3742 Pnt 3417 2918 Pnt 3964 3753 Pnt 4079 3788 Pnt 3956 3810 Pnt 3537 3748 Pnt 3598 2627 Pnt 3436 2606 Pnt 3502 2658 Pnt 4007 2906 Pnt 3956 2699 Pnt 3011 2402 Pnt 3664 3754 Pnt 3425 3788 Pnt 3352 2594 Pnt 3990 3738 Pnt 3228 2501 Pnt 3829 3742 Pnt 3336 3803 Pnt 3443 3748 Pnt 3597 2690 Pnt 4269 3753 Pnt 3668 3757 Pnt 4010 3742 Pnt 2866 3759 Pnt 3482 3747 Pnt 3529 2618 Pnt 3678 2677 Pnt 3821 3741 Pnt 3807 2634 Pnt 3486 3742 Pnt 3426 3754 Pnt 3502 3756 Pnt 3660 3732 Pnt 3517 2623 Pnt 3449 2628 Pnt 2888 2382 Pnt 3699 2722 Pnt 3943 3747 Pnt 3740 3751 Pnt 3650 3738 Pnt 3897 3745 Pnt 4087 3844 Pnt 4026 2611 Pnt 3677 3743 Pnt 3701 2979 Pnt 2215 1903 Pnt 4334 2725 Pnt 4110 3758 Pnt 2787 2358 Pnt 3842 2783 Pnt 3968 3744 Pnt 3574 3800 Pnt 4074 3764 Pnt 3905 2790 Pnt 3473 3752 Pnt 3630 2693 Pnt 3025 2392 Pnt 3987 3827 Pnt 3884 2993 Pnt 3963 2786 Pnt 3845 2868 Pnt 3510 2664 Pnt 3774 3775 Pnt 3429 2640 Pnt 3665 3746 Pnt 3997 2923 Pnt 3397 3742 Pnt 3282 3758 Pnt 3855 2786 Pnt 4007 3748 Pnt 3714 3765 Pnt 3895 3747 Pnt 3882 3749 Pnt 3677 2718 Pnt 3830 2754 Pnt 4379 3746 Pnt 4052 3758 Pnt 3736 3757 Pnt 4152 3747 Pnt 3867 3756 Pnt 3849 3762 Pnt 3855 2924 Pnt 3454 3745 Pnt 3852 3764 Pnt 3722 2736 Pnt 3664 3751 Pnt 3705 2708 Pnt 3631 2695 Pnt 3875 2918 Pnt 3344 2516 Pnt 3673 3736 Pnt 3991 3747 Pnt 4210 3758 Pnt 4255 3742 Pnt 3470 3746 Pnt 3928 3760 Pnt 4073 2827 Pnt 3820 3755 Pnt 3680 2670 Pnt 4051 3757 Pnt 3301 2561 Pnt 4028 3742 Pnt 3789 3748 Pnt 4218 3831 Pnt 3559 2607 Pnt 3184 3749 Pnt 3519 2628 Pnt 4267 3744 Pnt 3086 2377 Pnt 3871 2771 Pnt 4194 2786 Pnt 3402 2591 Pnt 3837 3735 Pnt 3855 2781 Pnt 4172 3762 Pnt 4166 2887 Pnt 4473 2693 Pnt 3705 3751 Pnt 3218 2514 Pnt 2418 2083 Pnt 3462 3749 Pnt 3173 2498 Pnt 4128 2612 Pnt 3960 3742 Pnt 4108 3760 Pnt 3918 3749 Pnt 4053 3760 Pnt 3515 3758 Pnt 3698 2727 Pnt 4133 3739 Pnt 3808 3795 Pnt 4529 2877 Pnt 3910 2504 Pnt 3946 2698 Pnt 3889 3801 Pnt 3346 3748 Pnt 2962 2396 Pnt 3557 2634 Pnt 4119 2768 Pnt 4287 2933 Pnt 3671 3745 Pnt 3797 3745 Pnt 3559 3749 Pnt 3525 3742 Pnt 3629 2662 Pnt 3595 3750 Pnt 3711 3744 Pnt 3684 3801 Pnt 3626 3766 Pnt 3957 3745 Pnt 4028 3759 Pnt 3902 3766 Pnt 3865 3759 Pnt 3995 3757 Pnt 3771 3753 Pnt 3376 2569 Pnt 3371 3748 Pnt 3975 3746 Pnt 3812 2785 Pnt 3943 2801 Pnt 3547 2641 Pnt 3767 2787 Pnt 3581 2642 Pnt 3752 2637 Pnt 3729 3754 Pnt 4178 2796 Pnt 3609 2706 Pnt 4074 2579 Pnt 3569 2691 Pnt 3516 2650 Pnt 3699 2672 Pnt 3729 2704 Pnt 3883 3748 Pnt 3652 2684 Pnt 3824 3743 Pnt 4606 3749 Pnt 3828 2730 Pnt 3571 2643 Pnt 4096 2834 Pnt 3412 2650 Pnt 4236 3765 Pnt 3935 3753 Pnt 3807 3757 Pnt 3548 3751 Pnt 3730 2701 Pnt 4114 3752 Pnt 4062 2591 Pnt 4197 3744 Pnt 3163 2501 Pnt 3984 3855 Pnt 4138 3765 Pnt 3609 2684 Pnt 3477 2551 Pnt 3958 3017 Pnt 3497 2599 Pnt 4081 2806 Pnt 3424 3793 Pnt 3713 2847 Pnt 3779 3826 Pnt 3280 3824 Pnt 3741 2753 Pnt 3910 3745 Pnt 3847 2888 Pnt 4001 3747 Pnt 3523 3826 Pnt 3571 2792 Pnt 4082 2797 Pnt 3675 2691 Pnt 3575 2667 Pnt 3023 3731 Pnt 3405 2622 Pnt 4091 2777 Pnt 3483 2621 Pnt 4106 2870 Pnt 3689 2686 Pnt 4272 3772 Pnt 4038 2789 Pnt 4384 3770 Pnt 3781 2736 Pnt 3601 3827 Pnt 3702 3756 Pnt 4032 3850 Pnt 2849 3755 Pnt 3901 2744 Pnt 3925 2742 Pnt 2797 2186 Pnt 3921 3759 Pnt 3462 3750 Pnt 3935 3771 Pnt 4260 3744 Pnt 3126 2495 Pnt 3287 2582 Pnt 2976 2339 Pnt 4027 3754 Pnt 3664 3746 Pnt 4260 2686 Pnt 3985 3743 Pnt 4245 2884 Pnt 3963 3770 Pnt 2973 3741 Pnt 3038 3744 Pnt 3866 3740 Pnt 3194 3764 Pnt 4164 2801 Pnt 4038 3739 Pnt 2957 2374 Pnt 3776 3760 Pnt 4035 3795 Pnt 3857 2766 Pnt 3671 3774 Pnt 3909 3751 Pnt 3415 2583 Pnt 3754 3782 Pnt 3973 3782 Pnt 4214 3746 Pnt 3361 2509 Pnt 3957 2824 Pnt 3571 3762 Pnt 3746 3738 Pnt 3779 2727 Pnt 4013 3740 Pnt 3209 3797 Pnt 3794 3864 Pnt 4074 2877 Pnt 3560 3746 Pnt 3458 2612 Pnt 3789 2780 Pnt 4167 3763 Pnt 3873 3744 Pnt 3963 3738 Pnt 3871 3801 Pnt 3962 3758 Pnt 4143 3760 Pnt 3175 2504 Pnt 3829 3735 Pnt 3742 3762 Pnt 3735 2698 Pnt 2505 3757 Pnt 3843 2758 Pnt 3655 3759 Pnt 3404 2554 Pnt 3713 2723 Pnt 3847 3747 Pnt 3628 2667 Pnt 4276 2778 Pnt 3929 3745 Pnt 3962 3764 Pnt 4075 2866 Pnt 3962 2939 Pnt 3878 3751 Pnt 4169 3810 Pnt 3518 2709 Pnt 3507 2606 Pnt 4102 3765 Pnt 3781 3743 Pnt 3389 3766 Pnt 3530 2595 Pnt 3878 3757 Pnt 3808 3749 Pnt 4146 3772 Pnt 3524 2609 Pnt 4120 3751 Pnt 3597 2646 Pnt 3192 3743 Pnt 4088 3744 Pnt 3543 3754 Pnt 4552 2837 Pnt 3647 3752 Pnt 3357 2504 Pnt 3998 2821 Pnt 4253 3824 Pnt 3655 3744 Pnt 3681 3767 Pnt 3926 3788 Pnt 3957 2844 Pnt 4269 2818 Pnt 3713 3757 Pnt 4267 2844 Pnt 3471 3748 Pnt 3588 2599 Pnt 3870 2892 Pnt 4448 2781 Pnt 3075 2364 Pnt 3782 3772 Pnt 3787 2721 Pnt 3859 3839 Pnt 3625 2654 Pnt 3975 3804 Pnt 3651 3752 Pnt 3363 3754 Pnt 4433 3737 Pnt 4090 3738 Pnt 3374 2591 Pnt 3765 3752 Pnt 3890 3746 Pnt 3770 3739 Pnt 2893 2324 Pnt 3565 3779 Pnt 2795 2328 Pnt 3207 2454 Pnt 3196 2423 Pnt 3956 3757 Pnt 3945 3739 Pnt 3749 2727 Pnt 3653 2701 Pnt 3893 3760 Pnt 3785 2738 Pnt 4389 3011 Pnt 4312 3751 Pnt 3518 2622 Pnt 3535 3756 Pnt 3455 3748 Pnt 3775 2740 Pnt 3563 2688 Pnt 4454 2841 Pnt 3859 3746 Pnt 3939 3745 Pnt 3739 3749 Pnt 4188 2926 Pnt 3767 3789 Pnt 4206 3749 Pnt 3687 3741 Pnt 3878 3746 Pnt 3981 2900 Pnt 4038 3758 Pnt 3935 3776 Pnt 4058 3761 Pnt 3378 3753 Pnt 4041 3739 Pnt 4025 3757 Pnt 4067 3758 Pnt 4000 3737 Pnt 3798 3744 Pnt 3522 2684 Pnt 4157 3755 Pnt 3968 3745 Pnt 3901 2859 Pnt 3356 2582 Pnt 3698 2714 Pnt 3560 2676 Pnt 3956 2765 Pnt 3049 2394 Pnt 3665 3798 Pnt 4212 3734 Pnt 3901 2508 Pnt 3637 3752 Pnt 3542 2686 Pnt 3850 3802 Pnt 3355 2588 Pnt 3644 3750 Pnt 3251 3755 Pnt 4115 3758 Pnt 3954 2513 Pnt 3555 3779 Pnt 4151 3751 Pnt 3803 2833 Pnt 3783 3747 Pnt 3673 2725 Pnt 3732 3872 Pnt 2067 1687 Pnt 3946 3797 Pnt 4225 3742 Pnt 3678 3743 Pnt 3177 3741 Pnt 3338 2616 Pnt 3867 3754 Pnt 3925 3756 Pnt 3788 3750 Pnt 3109 3755 Pnt 3911 2766 Pnt 4163 2775 Pnt 4149 3755 Pnt 3680 2671 Pnt 3454 3751 Pnt 4345 3839 Pnt 3976 3758 Pnt 3941 3743 Pnt 3094 2384 Pnt 3786 2723 Pnt 3882 3777 Pnt 3137 2492 Pnt 3591 2635 Pnt 3902 2749 Pnt 4017 3808 Pnt 3906 2751 Pnt 3748 2702 Pnt 3699 2709 Pnt 3888 3761 Pnt 3678 2742 Pnt 3763 3744 Pnt 3985 2779 Pnt 3663 3741 Pnt 4298 3759 Pnt 3511 3757 Pnt 4113 3757 Pnt 4137 3754 Pnt 4075 3774 Pnt 3456 2583 Pnt 3628 2793 Pnt 2974 2421 Pnt 3479 3753 Pnt 4517 3784 Pnt 3718 3751 Pnt 3711 3752 Pnt 2634 2110 Pnt 3979 2894 Pnt 3537 2599 Pnt 4028 2993 Pnt 4058 3743 Pnt 3865 3760 Pnt 3644 2696 Pnt 3012 2425 Pnt 2921 2497 Pnt 3898 3740 Pnt 3979 3777 Pnt 4297 3747 Pnt 3871 3758 Pnt 3874 3746 Pnt 2720 3758 Pnt 2571 2170 Pnt 3564 3754 Pnt 4542 2844 Pnt 3844 3810 Pnt 3821 2733 Pnt 3584 3747 Pnt 4147 2902 Pnt 3823 2865 Pnt 3378 2518 Pnt 3949 2821 Pnt 3917 2829 Pnt 3781 2728 Pnt 2682 2162 Pnt 3903 3805 Pnt 3817 2867 Pnt 3513 3757 Pnt 3933 3780 Pnt 3617 3743 Pnt 3642 2706 Pnt 3223 3807 Pnt 4246 3818 Pnt 2649 2235 Pnt 3845 3761 Pnt 3608 3758 Pnt 4003 3834 Pnt 3956 3760 Pnt 4349 2830 Pnt 3945 2668 Pnt 3993 2661 Pnt 3799 3803 Pnt 3381 2895 Pnt 4067 2907 Pnt 3446 3799 Pnt 3798 2674 Pnt 4006 3815 Pnt 3415 3758 Pnt 4061 2900 Pnt 3853 3743 Pnt 3620 2696 Pnt 4000 3746 Pnt 4158 3736 Pnt 3311 3832 Pnt 3379 3770 Pnt 3401 3817 Pnt 4246 3744 Pnt 3782 3767 Pnt 3804 2783 Pnt 3664 2674 Pnt 3407 2513 Pnt 3926 3750 Pnt 3747 3752 Pnt 3885 3748 Pnt 3397 3746 Pnt 3745 3737 Pnt 3665 3804 Pnt 3318 3777 Pnt 4014 3740 Pnt 3614 3764 Pnt 3315 3760 Pnt 3792 3742 Pnt 3870 3749 Pnt 3606 2689 Pnt 3850 3745 Pnt 3982 3741 Pnt 2508 2049 Pnt 3825 2769 Pnt 3617 3745 Pnt 3715 3745 Pnt 3495 2605 Pnt 3620 3745 Pnt 3971 2776 Pnt 3944 3749 Pnt 3675 2789 Pnt 3505 3760 Pnt 4059 3797 Pnt 4131 2694 Pnt 2907 2263 Pnt 3360 3751 Pnt 3317 2579 Pnt 3944 3822 Pnt 3900 3750 Pnt 3772 2603 Pnt 4284 3745 Pnt 3061 2406 Pnt 3895 3764 Pnt 3347 2796 Pnt 3641 3749 Pnt 4229 3754 Pnt 3844 2753 Pnt 4121 3753 Pnt 3946 3769 Pnt 4154 3783 Pnt 3684 3754 Pnt 2100 1660 Pnt 3986 2723 Pnt 3962 3757 Pnt 3891 2851 Pnt 3595 3750 Pnt 3882 3764 Pnt 4536 2773 Pnt 3056 2426 Pnt 4552 3902 Pnt 3487 2641 Pnt 3553 3812 Pnt 3717 3774 Pnt 4059 3742 Pnt 3520 2675 Pnt 3482 2641 Pnt 3797 3744 Pnt 4071 2867 Pnt 3923 3784 Pnt 3575 3769 Pnt 4294 2762 Pnt 2918 2319 Pnt 3812 3764 Pnt 3584 2674 Pnt 3853 3773 Pnt 3996 3741 Pnt 3887 3791 Pnt 3989 2830 Pnt 4233 3762 Pnt 3832 2869 Pnt 4438 3809 Pnt 4325 2722 Pnt 3514 3768 Pnt 3394 2625 Pnt 4573 3770 Pnt 4024 3839 Pnt 3805 3757 Pnt 3786 3765 Pnt 3774 3771 Pnt 3761 3742 Pnt 3574 2637 Pnt 3864 2883 Pnt 3453 3766 Pnt 3570 3742 Pnt 4080 2726 Pnt 3772 3747 Pnt 4201 3855 Pnt 4186 2688 Pnt 3970 3748 Pnt 3203 2471 Pnt 3919 3764 Pnt 3854 2669 Pnt 2912 2350 Pnt 4182 3770 Pnt 3874 2837 Pnt 4226 2924 Pnt 3531 3751 Pnt 4249 3793 Pnt 3809 3805 Pnt 3848 3760 Pnt 4385 2778 Pnt 3888 2745 Pnt 4562 3754 Pnt 4242 3741 Pnt 3786 2876 Pnt 3944 3781 Pnt 3883 2761 Pnt 3711 3781 Pnt 3526 2597 Pnt 4021 3755 Pnt 4046 3771 Pnt 3854 3763 Pnt 3446 2603 Pnt 3991 2890 Pnt 3930 3740 Pnt 4392 3755 Pnt 4160 3747 Pnt 4194 2735 Pnt 4019 3834 Pnt 4444 2828 Pnt 2503 2133 Pnt 3712 2694 Pnt 4182 3756 Pnt 3421 2654 Pnt 4093 2677 Pnt 3907 3773 Pnt 3841 3749 Pnt 3854 2698 Pnt 3131 2477 Pnt 3231 2612 Pnt 3981 3750 Pnt 4039 3749 Pnt 3951 3767 Pnt 3382 3838 Pnt 3730 3759 Pnt 3677 3813 Pnt 3059 2500 Pnt 3603 3734 Pnt 3644 2657 Pnt 4139 3747 Pnt 3692 3751 Pnt 3093 3777 Pnt 3021 3756 Pnt 4266 3812 Pnt 4047 3747 Pnt 4143 3746 Pnt 3985 3749 Pnt 3728 3804 Pnt 3686 3787 Pnt 3924 2817 Pnt 2379 2003 Pnt 3900 2778 Pnt 3765 3805 Pnt 3681 3752 Pnt 4019 3751 Pnt 3962 3807 Pnt 4450 3748 Pnt 3833 3781 Pnt 3542 3752 Pnt 2680 2205 Pnt 3817 3756 Pnt 3914 3751 Pnt 2693 2236 Pnt 3697 3734 Pnt 4092 2962 Pnt 3574 3843 Pnt 3955 2797 Pnt 3875 2725 Pnt 4283 3763 Pnt 3749 3750 Pnt 3165 3754 Pnt 4248 3738 Pnt 3999 2650 Pnt 3722 3806 Pnt 2973 2399 Pnt 4054 3799 Pnt 4256 3748 Pnt 3895 3805 Pnt 3493 3811 Pnt 3594 2637 Pnt 3755 3737 Pnt 4603 2698 Pnt 3990 2883 Pnt 4017 2801 Pnt 4286 2670 Pnt 3865 2713 Pnt 2953 3755 Pnt 3585 3778 Pnt 3447 2643 Pnt 3809 3775 Pnt 3747 3746 Pnt 3407 2728 Pnt 3580 3768 Pnt 3726 3802 Pnt 3516 3740 Pnt 4171 3752 Pnt 4394 3746 Pnt 3797 3761 Pnt 3662 3736 Pnt 3108 2429 Pnt 4484 3754 Pnt 3539 3832 Pnt 3891 2778 Pnt 3930 3832 Pnt 3842 2722 Pnt 4370 3751 Pnt 3451 2649 Pnt 3548 3746 Pnt 3737 3756 Pnt 3503 3773 Pnt 3861 3752 Pnt 4023 3931 Pnt 4278 3013 Pnt 3773 3750 Pnt 4120 3750 Pnt 3287 2501 Pnt 3936 3737 Pnt 3335 2583 Pnt 4182 2956 Pnt 4486 3750 Pnt 3960 3083 Pnt 3130 2450 Pnt 3712 2718 Pnt 4018 3758 Pnt 3512 2669 Pnt 4066 3746 Pnt 4040 3786 Pnt 4334 3766 Pnt 3624 3770 Pnt 3516 3794 Pnt 3727 3743 Pnt 4050 2911 Pnt 3640 3808 Pnt 4125 3740 Pnt 3568 3756 Pnt 3691 2797 Pnt 3799 3754 Pnt 3674 2833 Pnt 3937 3747 Pnt 4129 3742 Pnt 4258 2850 Pnt 3741 2735 Pnt 4100 3902 Pnt 2830 2283 Pnt 3707 2677 Pnt 3753 2762 Pnt 3260 2537 Pnt 3991 2868 Pnt 3386 2618 Pnt 3481 3768 Pnt 3999 2912 Pnt 4196 3820 Pnt 3574 2667 Pnt 3779 3778 Pnt 4351 3761 Pnt 2920 2301 Pnt 4046 2837 Pnt 3937 3753 Pnt 3753 2737 Pnt 3953 3753 Pnt 3871 3777 Pnt 3761 3755 Pnt 2892 2460 Pnt 3511 2837 Pnt 3632 3828 Pnt 3860 2717 Pnt 3974 3747 Pnt 4110 3742 Pnt 3330 3751 Pnt 4373 2926 Pnt 3922 2684 Pnt 4100 3801 Pnt 4101 3796 Pnt 3212 2478 Pnt 3447 3753 Pnt 3913 3760 Pnt 3549 2683 Pnt 3039 2454 Pnt 3721 3757 Pnt 3580 3775 Pnt 3502 2811 Pnt 3772 3834 Pnt 3769 2923 Pnt 4114 3760 Pnt 4443 3028 Pnt 3702 3754 Pnt 3692 3752 Pnt 3852 2800 Pnt 4170 3749 Pnt 3693 2676 Pnt 3851 3746 Pnt 3673 3806 Pnt 4371 3786 Pnt 3735 2787 Pnt 3754 3751 Pnt 4133 3753 Pnt 3985 3737 Pnt 3648 3839 Pnt 3162 2434 Pnt 3259 3743 Pnt 3827 3748 Pnt 3751 3765 Pnt 3630 2713 Pnt 3663 3779 Pnt 3888 3754 Pnt 3557 3771 Pnt 4454 2923 Pnt 3697 2743 Pnt 4062 2743 Pnt 3969 3743 Pnt 3559 2655 Pnt 3339 2599 Pnt 3766 3750 Pnt 3807 2758 Pnt 3436 2640 Pnt 3767 3750 Pnt 3954 2797 Pnt 3471 3851 Pnt 4198 3763 Pnt 4187 3781 Pnt 3970 3747 Pnt 2976 2339 Pnt 3499 3791 Pnt 3041 2338 Pnt 4535 2746 Pnt 4097 3776 Pnt 3933 3743 Pnt 3370 2622 Pnt 3819 2769 Pnt 3850 3754 Pnt 3628 2983 Pnt 4118 3774 Pnt 3735 3741 Pnt 3152 3832 Pnt 4255 3742 Pnt 3259 2758 Pnt 3460 2643 Pnt 3982 3753 Pnt 4176 3828 Pnt 3758 2717 Pnt 4229 3771 Pnt 4099 2837 Pnt 3733 2718 Pnt 3737 3736 Pnt 3971 3762 Pnt 3640 2774 Pnt 3594 2684 Pnt 3806 3745 Pnt 4354 3923 Pnt 4382 3828 Pnt 3710 3812 Pnt 3433 2612 Pnt 2706 2222 Pnt 4281 2767 Pnt 4314 3743 Pnt 4043 3787 Pnt 3785 3750 Pnt 3911 3817 Pnt 4028 3806 Pnt 3675 2848 Pnt 3055 2464 Pnt 4004 3756 Pnt 4106 3760 Pnt 2471 2113 Pnt 3999 3763 Pnt 4153 2680 Pnt 3902 3769 Pnt 3938 3753 Pnt 4316 3752 Pnt 3503 2605 Pnt 3881 3760 Pnt 3834 2734 Pnt 3915 3740 Pnt 3355 3750 Pnt 3843 3762 Pnt 3556 3036 Pnt 3805 3860 Pnt 3568 3746 Pnt 4188 3759 Pnt 4277 3746 Pnt 3998 3752 Pnt 3759 2707 Pnt 4117 3806 Pnt 2698 3789 Pnt 3682 3761 Pnt 4166 3799 Pnt 4169 2985 Pnt 4051 3765 Pnt 4238 3761 Pnt 4189 2804 Pnt 4028 2915 Pnt 3910 3866 Pnt 3942 2842 Pnt 3606 2728 Pnt 3876 3744 Pnt 4013 3760 Pnt 3973 3825 Pnt 2392 2018 Pnt 3952 3777 Pnt 4306 2937 Pnt 3482 2662 Pnt 3641 2658 Pnt 4274 3779 Pnt 4123 3745 Pnt 4151 3747 Pnt 3970 2733 Pnt 4198 3754 Pnt 3301 2606 Pnt 3456 2609 Pnt 3756 2742 Pnt 3659 2672 Pnt 4351 2778 Pnt 3662 2660 Pnt 3840 2843 Pnt 3565 3763 Pnt 3807 3782 Pnt 3868 3763 Pnt 4240 3744 Pnt 3979 3797 Pnt 4105 3809 Pnt 3865 3752 Pnt 3960 3774 Pnt 3496 2648 Pnt 3883 2766 Pnt 3482 3764 Pnt 3735 3753 Pnt 4260 2705 Pnt 3377 2652 Pnt 3741 2736 Pnt 4277 2992 Pnt 3829 3747 Pnt 4019 3760 Pnt 3535 3750 Pnt 3953 3759 Pnt 4052 3793 Pnt 4350 3757 Pnt 4215 3766 Pnt 3348 3838 Pnt 4280 2872 Pnt 4192 3780 Pnt 3782 3787 Pnt 3543 2596 Pnt 3974 3760 Pnt 4138 3757 Pnt 4713 3136 Pnt 4142 3807 Pnt 4041 2827 Pnt 3809 3742 Pnt 4052 3768 Pnt 4270 3749 Pnt 3596 3739 Pnt 4228 3744 Pnt 3527 2616 Pnt 3087 2335 Pnt 4081 3751 Pnt 3771 2720 Pnt 4510 3753 Pnt 4149 2933 Pnt 4406 3787 Pnt 3917 3747 Pnt 4214 2931 Pnt 3686 3761 Pnt 3250 2504 Pnt 3781 3799 Pnt 3155 2484 Pnt 4264 2927 Pnt 4007 3753 Pnt 4004 3759 Pnt 3635 3791 Pnt 3915 3827 Pnt 3229 2554 Pnt 3850 3787 Pnt 3709 3751 Pnt 3925 3758 Pnt 2767 2232 Pnt 4186 3781 Pnt 4216 3741 Pnt 3674 2733 Pnt 3280 2530 Pnt 3708 2785 Pnt 3961 2566 Pnt 3604 2797 Pnt 3769 2743 Pnt 4402 3790 Pnt 4264 3753 Pnt 3777 3801 Pnt 4325 3772 Pnt 3922 3766 Pnt 3092 2915 Pnt 4059 3757 Pnt 3897 3770 Pnt 4271 3189 Pnt 3852 3757 Pnt 3675 2782 Pnt 3700 3770 Pnt 3597 3755 Pnt 3811 3744 Pnt 3152 2477 Pnt 4355 3774 Pnt 3502 3852 Pnt 3431 3806 Pnt 4036 2810 Pnt 4178 3747 Pnt 4349 3750 Pnt 4159 3799 Pnt 4076 3790 Pnt 2639 2225 Pnt 4666 3822 Pnt 3158 2542 Pnt 4456 2978 Pnt 3979 3754 Pnt 3965 3761 Pnt 4135 3768 Pnt 3942 3807 Pnt 3950 2757 Pnt 3315 2573 Pnt 4137 3844 Pnt 3845 3758 Pnt 3415 2604 Pnt 3129 2431 Pnt 3983 3766 Pnt 4281 3774 Pnt 3365 3777 Pnt 3991 2872 Pnt 3953 3787 Pnt 4076 2894 Pnt 4216 3807 Pnt 4449 3751 Pnt 3860 3805 Pnt 3841 3758 Pnt 3341 3747 Pnt 4168 3755 Pnt 4023 3022 Pnt 3946 2785 Pnt 3440 2566 Pnt 4155 2859 Pnt 3836 3751 Pnt 3321 3755 Pnt 4020 3756 Pnt 3946 3799 Pnt 3916 3840 Pnt 3887 3755 Pnt 3434 3767 Pnt 3823 2781 Pnt 4135 3751 Pnt 3708 2746 Pnt 3846 3756 Pnt 4049 3770 Pnt 3848 2891 Pnt 3814 3758 Pnt 3333 2605 Pnt 3853 3925 Pnt 3987 3798 Pnt 3986 2722 Pnt 4808 3766 Pnt 3844 3802 Pnt 3957 3777 Pnt 3739 3786 Pnt 4346 3744 Pnt 3158 2437 Pnt 3356 2533 Pnt 3745 2837 Pnt 4047 3745 Pnt 4188 3758 Pnt 2748 2301 Pnt 3883 3760 Pnt 3926 3753 Pnt 4168 3795 Pnt 4420 2669 Pnt 3701 3881 Pnt 3923 3750 Pnt 3103 3771 Pnt 3889 3826 Pnt 3900 3805 Pnt 4092 3790 Pnt 3580 2644 Pnt 4088 3136 Pnt 4417 3791 Pnt 3929 3142 Pnt 2484 2046 Pnt 4389 2990 Pnt 3896 3794 Pnt 3643 2660 Pnt 4065 3847 Pnt 4009 3776 Pnt 4184 3807 Pnt 3693 3944 Pnt 2359 1936 Pnt 4070 3749 Pnt 3476 2602 Pnt 4411 3772 Pnt 4422 3840 Pnt 3883 3774 Pnt 3879 3750 Pnt 4182 3756 Pnt 4300 3754 Pnt 4428 3945 Pnt 3685 3761 Pnt 4109 3758 Pnt 3992 3752 Pnt 4180 2962 Pnt 4111 3766 Pnt 3596 3826 Pnt 3904 3768 Pnt 3798 3799 Pnt 3681 2935 Pnt 4190 2903 Pnt 4135 3783 Pnt 4193 3786 Pnt 4348 3781 Pnt 4060 3772 Pnt 3605 3752 Pnt 4410 3753 Pnt 4015 3767 Pnt 4247 3754 Pnt 3658 3753 Pnt 4072 2831 Pnt 4174 2909 Pnt 3920 2728 Pnt 4283 3768 Pnt 3775 2736 Pnt 4722 3829 Pnt 4628 3827 Pnt 4048 3757 Pnt 4628 3803 Pnt 4140 3761 Pnt 4200 3787 Pnt 4306 3759 Pnt 4266 2923 Pnt 2935 2333 Pnt 4051 3771 Pnt 3997 2836 Pnt 4101 3807 Pnt 4425 3802 Pnt 3087 2444 Pnt 3821 3812 Pnt 4121 2691 Pnt 3479 3747 Pnt 4100 3752 Pnt 3774 3759 Pnt 3796 2874 Pnt 4152 3823 Pnt 4233 2888 Pnt 4013 2681 Pnt 4281 3763 Pnt 4111 2843 Pnt 4203 3788 Pnt 4043 2831 Pnt 4235 2881 Pnt 3668 2711 Pnt 4194 3797 Pnt 3748 3796 Pnt 4113 2927 Pnt 4394 3787 Pnt 4547 3752 Pnt 4144 3749 Pnt 4089 3790 Pnt 3785 3759 Pnt 3863 3778 Pnt 4099 3749 Pnt 3926 2862 Pnt 4151 3745 Pnt 4143 3746 Pnt 4106 3782 Pnt 3818 3764 Pnt 4437 3749 Pnt 4240 2886 Pnt 4261 2953 Pnt 4148 3752 Pnt 3803 3749 Pnt 4360 3804 Pnt 3954 3770 Pnt 4143 3754 Pnt 3008 2434 Pnt 3917 3780 Pnt 3725 3813 Pnt 4036 3787 Pnt 4185 3779 Pnt 3676 3752 Pnt 3840 3750 Pnt 4202 2908 Pnt 4166 3750 Pnt 4119 2881 Pnt 4102 3761 Pnt 4037 3036 Pnt 4323 3751 Pnt 4156 2874 Pnt 4275 3065 Pnt 4132 3761 Pnt 4023 2815 Pnt 4054 3773 Pnt 4351 3839 Pnt 4034 3762 Pnt 3886 2797 Pnt 3813 3843 Pnt 4175 2929 Pnt 4132 2582 Pnt 4022 3799 Pnt 4123 3760 Pnt 3971 3758 Pnt 3974 2783 Pnt 4303 3759 Pnt 3923 3753 Pnt 3751 3748 Pnt 4104 3746 Pnt 4074 3755 Pnt 4214 2880 Pnt 3980 3808 Pnt 4281 3785 Pnt 4018 3750 Pnt 3872 3789 Pnt 3918 3853 Pnt 4264 3749 Pnt 4451 3762 Pnt 4215 2966 Pnt 3523 2668 Pnt 4152 3806 Pnt 4444 3763 Pnt 3902 3778 Pnt 4483 3791 Pnt 4233 2949 Pnt 4063 3841 Pnt 3499 2864 Pnt 4080 3765 Pnt 4407 3763 Pnt 4548 3779 Pnt 4206 3804 Pnt 3932 2921 Pnt 3968 3756 Pnt 3952 3774 Pnt 4247 3767 Pnt 4026 2876 Pnt 3174 2554 Pnt 3542 3818 Pnt 3203 3785 Pnt 4197 3858 Pnt 3421 3753 Pnt 4163 3762 Pnt 4431 3756 Pnt 4030 3745 Pnt 4114 2971 Pnt 4091 3756 Pnt 3643 3837 Pnt 4685 3789 Pnt 4175 3783 Pnt 4114 3794 Pnt 4057 2863 Pnt 4628 3752 Pnt 4250 2898 Pnt 3769 3754 Pnt 4052 3804 Pnt 3747 3761 Pnt 3868 3832 Pnt 4245 3783 Pnt 3967 2874 Pnt 4301 3755 Pnt 4333 3767 Pnt 3368 3787 Pnt 3964 3772 Pnt 4242 3754 Pnt 4460 3050 Pnt 4307 2957 Pnt 4261 2926 Pnt 4044 3799 Pnt 4071 3785 Pnt 3946 3799 Pnt 4196 3807 Pnt 4149 3781 Pnt 4101 3754 Pnt 4103 3764 Pnt 4090 3768 Pnt 4008 3773 Pnt 2814 2242 Pnt 4142 3787 Pnt 4332 3773 Pnt 4598 3085 Pnt 3752 2714 Pnt 4181 3752 Pnt 3953 3804 Pnt 4077 3807 Pnt 4233 3765 Pnt 3706 3809 Pnt 4662 3759 Pnt 4469 3768 Pnt 4269 2946 Pnt 4100 2954 Pnt 4115 2898 Pnt 4200 3772 Pnt 4410 3759 Pnt 3963 3770 Pnt 4364 3772 Pnt 4235 3796 Pnt 4366 3788 Pnt 4172 3805 Pnt 4528 3753 Pnt 4015 3824 Pnt 4035 3772 Pnt 4121 3768 Pnt 3767 3802 Pnt 3869 2945 Pnt 4546 3770 Pnt 4158 3748 Pnt 3975 3831 Pnt 4102 3757 Pnt 4189 3798 Pnt 3906 3776 Pnt 4751 3770 Pnt 3975 3754 Pnt 4000 3807 Pnt 4082 2796 Pnt 4583 3759 Pnt 4036 3769 Pnt 4097 3792 Pnt 4050 3768 Pnt 3733 2602 Pnt 4050 2909 Pnt 4256 3767 Pnt 4409 3757 Pnt 4187 3826 Pnt 4089 3835 Pnt 3914 3817 Pnt 3887 3789 Pnt 4097 2945 Pnt 4409 3758 Pnt 3968 3809 Pnt 3951 3808 Pnt 4039 2892 Pnt 4125 3770 Pnt 4473 3065 Pnt 3379 3755 Pnt 4058 3761 Pnt 4242 3755 Pnt 3934 3743 Pnt 4402 3761 Pnt 4048 3763 Pnt 3694 3805 Pnt 4389 3773 Pnt 3972 3789 Pnt 4053 3839 Pnt 4008 3779 Pnt 4147 3841 Pnt 3988 3770 Pnt 4171 3780 Pnt 4034 3779 Pnt 3849 3758 Pnt 4410 3103 Pnt 4384 3795 Pnt 4090 3773 Pnt 4286 3825 Pnt 3940 3782 Pnt 3942 3771 Pnt 4169 3755 Pnt 4510 3814 Pnt 4247 2930 Pnt 4078 3791 Pnt 4267 3771 Pnt 3831 3789 Pnt 2569 2136 Pnt 3823 3746 Pnt 4115 2882 Pnt 4365 3752 Pnt 3983 3751 Pnt 4130 3793 Pnt 4197 3769 Pnt 4519 3811 Pnt 4227 3810 Pnt 4761 3742 Pnt 4388 3739 Pnt 4031 3818 Pnt 4148 3818 Pnt 3769 3758 Pnt 4000 3794 Pnt 4319 3762 Pnt 4498 3825 Pnt 4113 3776 Pnt 4041 2823 Pnt 4255 2703 Pnt 4444 3809 Pnt 4798 3762 Pnt 3979 3830 Pnt 4199 3759 Pnt 4008 3799 Pnt 3977 3801 Pnt 4111 3917 Pnt 4261 3766 Pnt 4309 3804 Pnt 4045 3784 Pnt 3995 2824 Pnt 4054 3808 Pnt 4527 3772 Pnt 4743 3849 Pnt 4322 3787 Pnt 3953 3798 Pnt 3772 3805 Pnt 4143 3748 Pnt 3615 3783 Pnt 4193 3769 Pnt 3415 2651 Pnt 4267 3798 Pnt 4088 3809 Pnt 4205 3750 Pnt 4608 3805 Pnt 4361 3779 Pnt 4327 3798 Pnt 4043 2822 Pnt 3953 3786 Pnt 4090 3786 Pnt 4087 3835 Pnt 3824 3807 Pnt 4422 3781 Pnt 4029 3754 Pnt 4008 3816 Pnt 4394 3784 Pnt 4183 3780 Pnt 3939 3789 Pnt 4201 3805 Pnt 4047 3758 Pnt 4609 3789 Pnt 4445 2982 Pnt 4093 3787 Pnt 4193 3119 Pnt 4145 2914 Pnt 4309 3064 Pnt 4184 3013 Pnt 3877 3759 Pnt 4233 3822 Pnt 4464 3007 Pnt 3972 3781 Pnt 4532 3763 Pnt 4312 3757 Pnt 4585 3061 Pnt 4512 3011 Pnt 4005 3799 Pnt 4052 3770 Pnt 4078 3781 Pnt 4143 3014 Pnt 4384 3837 Pnt 4235 3831 Pnt 4398 3798 Pnt 3256 3777 Pnt 3820 3836 Pnt 4662 3870 Pnt 4217 3770 Pnt 4520 3813 Pnt 4065 3759 Pnt 4090 3809 Pnt 4402 3786 Pnt 4188 3857 Pnt 4341 3843 Pnt 4212 3769 Pnt 4436 3811 Pnt 4084 3800 Pnt 4557 3816 Pnt 3964 3774 Pnt 4146 2914 Pnt 4119 3816 Pnt 4146 3801 Pnt 4358 3781 Pnt 4377 3779 Pnt 4398 3774 Pnt 4181 3828 Pnt 4955 3773 Pnt 4264 3757 Pnt 4310 2948 Pnt 4519 3799 Pnt 4193 3823 Pnt 4701 3184 Pnt 4148 3786 Pnt 4155 3843 Pnt 4409 3766 Pnt 4394 3199 Pnt 4734 3768 Pnt 4527 3790 Pnt 4513 3769 Pnt 4068 3810 Pnt 4263 3810 Pnt 4422 3033 Pnt 4805 3801 Pnt 4440 3835 Pnt 4881 3831 Pnt 4393 3839 Pnt 4468 3803 Pnt 4603 3841 Pnt 4035 3782 Pnt 4167 3821 Pnt 4230 3782 Pnt 4384 3771 Pnt 4458 3756 Pnt 4173 3838 Pnt 4374 3015 Pnt 4454 3816 Pnt 4495 3792 Pnt 4586 3845 Pnt 4091 3766 Pnt 4456 3830 Pnt 4079 3810 Pnt 4418 3844 Pnt 4427 3835 Pnt 4483 3858 Pnt 4103 3807 Pnt 4432 3768 Pnt 4895 3810 Pnt 4164 2884 Pnt 4371 3785 Pnt 4482 3792 Pnt 4535 3086 Pnt 4061 3786 Pnt 4492 3847 Pnt 4493 3776 Pnt 4379 2993 Pnt 4380 3770 Pnt 4390 3789 Pnt 4188 2998 Pnt 4501 3089 Pnt 4034 3812 Pnt 4492 3783 Pnt 4536 3848 Pnt 4349 3807 Pnt 4628 3828 Pnt 4725 3823 Pnt 4466 3801 Pnt 4253 3760 Pnt 4575 3805 Pnt 4207 3167 Pnt 4156 3770 Pnt 4686 3809 Pnt 4110 3796 Pnt 4292 3775 Pnt 4501 3781 Pnt 4731 3799 Pnt 4264 3799 Pnt 4868 3806 Pnt 4288 3786 Pnt 4716 3802 Pnt 4537 3756 Pnt 4697 3816 Pnt 4586 3168 Pnt 4636 3786 Pnt 4603 3779 Pnt 4552 3848 Pnt 4861 3047 Pnt 4509 3791 Pnt 4382 3756 Pnt 4484 3772 Pnt 4435 3772 Pnt 4631 3838 Pnt 4634 3786 Pnt 4389 3767 Pnt 4228 3779 Pnt 4529 3776 Pnt 4454 3761 Pnt 4315 2917 Pnt 4563 3782 Pnt 4390 3802 Pnt 4573 3773 Pnt 4424 3844 Pnt 4568 3759 Pnt 4339 3842 Pnt 4475 3842 Pnt 4907 3806 Pnt 4546 3130 Pnt 4671 3799 Pnt 4646 3127 Pnt 4140 3780 Pnt 4687 3779 Pnt 4387 3133 Pnt 4463 3782 Pnt 4264 3820 Pnt 4463 3773 Pnt 4409 3772 Pnt 4725 3773 Pnt 4486 3773 Pnt 5079 3815 Pnt 4575 3782 Pnt 4571 3767 Pnt 4698 3764 Pnt 4332 3784 Pnt 4097 2956 Pnt 4678 3775 Pnt 4581 3221 Pnt 4681 3801 Pnt 4482 3777 Pnt 4728 3816 Pnt 4225 3821 Pnt 4641 3764 Pnt 4129 3844 Pnt 4395 3809 Pnt 4459 3811 Pnt 4746 3825 Pnt 4729 3783 Pnt 4847 3803 Pnt 4455 3831 Pnt 4650 3812 Pnt 4678 3152 Pnt 4842 3816 Pnt 4393 3140 Pnt 4587 3769 Pnt 4571 3806 Pnt 4396 3785 Pnt 4585 3835 Pnt 4674 3814 Pnt 4541 3782 Pnt 4640 3803 Pnt 4855 3855 Pnt 4711 3801 Pnt 4774 3055 Pnt 4680 3779 Pnt 4970 3799 Pnt 4319 3795 Pnt 4360 3170 Pnt 4581 3831 Pnt 4355 3797 Pnt 4475 3797 Pnt 4546 3038 Pnt 4627 3829 Pnt 4718 3811 Pnt 4550 3043 Pnt 4507 3815 Pnt 4416 3796 Pnt 4723 3783 Pnt 4887 3286 Pnt 4714 3878 Pnt 4788 3042 Pnt 4707 3089 Pnt 4925 3824 Pnt 4716 3819 Pnt 4809 3037 Pnt 4478 3029 Pnt 4878 3286 Pnt 4438 3850 Pnt 4485 3805 Pnt 4653 3818 Pnt 4707 3856 Pnt 4505 3843 Pnt 4413 3784 Pnt 4495 3809 Pnt 4888 3795 Pnt 5038 3820 Pnt 4788 3848 Pnt 4370 3779 Pnt 4652 3811 Pnt 4758 3799 Pnt 4878 3864 Pnt 4575 3147 Pnt 4431 3808 Pnt 4888 3831 Pnt 4701 3132 Pnt 4769 3844 Pnt 4507 3873 Pnt 4877 3838 Pnt 4514 3824 Pnt 4670 3798 Pnt 4913 3782 Pnt 4809 3808 Pnt 4772 3794 Pnt 4897 3759 Pnt 4712 3140 Pnt 4839 3819 Pnt 5070 3807 Pnt 4826 3054 Pnt 4734 3838 Pnt 4398 3804 Pnt 4345 3798 Pnt 4789 3808 Pnt 4402 3799 Pnt 4740 3854 Pnt 5028 3817 Pnt 4702 3840 Pnt 4860 3182 Pnt 5121 3807 Pnt 4829 3856 Pnt 4783 3867 Pnt 4786 3857 Pnt 5114 3790 Pnt 4762 3844 Pnt 4360 3840 Pnt 4883 3931 Pnt 4871 3819 Pnt 4723 3832 Pnt 4481 3059 Pnt 4679 3818 Pnt 4997 3809 Pnt 4347 3814 Pnt 4583 3842 Pnt 4652 3797 Pnt 4799 3821 Pnt 4784 3833 Pnt 4844 3786 Pnt 5079 3337 Pnt 4777 3866 Pnt 4778 3798 Pnt 5075 3869 Pnt 4569 3811 Pnt 5024 3814 Pnt 4941 3156 Pnt 4692 3847 Pnt 4835 3812 Pnt 4548 3829 Pnt 4785 3786 Pnt 4793 3837 Pnt 4645 3807 Pnt 4737 3840 Pnt 4709 3807 Pnt 5031 3840 Pnt 4769 3818 Pnt 4998 3846 Pnt 5051 3830 Pnt 4791 3827 Pnt 4738 3206 Pnt 4720 3836 Pnt 4670 3117 Pnt 4424 3850 Pnt 4540 3803 Pnt 4562 3335 Pnt 4947 3842 Pnt 5071 3900 Pnt 4879 3812 Pnt 4574 3864 Pnt 4986 3879 Pnt 4297 3793 Pnt 4809 3815 Pnt 5038 3248 Pnt 4335 3823 Pnt 4736 3826 Pnt 4281 3791 Pnt 5264 3769 Pnt 4998 3831 Pnt 4965 3824 Pnt 4724 3799 Pnt 4208 3827 Pnt 4904 3297 Pnt 4757 3823 Pnt 4434 3134 Pnt 4599 3293 Pnt 4401 3821 Pnt 5002 3352 Pnt 5040 3833 Pnt 5016 3828 Pnt 4221 3829 Pnt 5047 3425 Pnt 4411 3110 Pnt 4795 3825 Pnt 5215 3812 Pnt 5276 3306 Pnt 5117 3308 Pnt 5124 3793 Pnt 5193 3932 Pnt 4569 3906 Pnt 5017 3832 Pnt 4978 3222 Pnt 5031 3833 Pnt 4858 3872 Pnt 4804 3811 Pnt 4861 3802 Pnt 5212 3806 Pnt 5096 3856 Pnt 4643 3828 Pnt 4842 3840 Pnt 4937 3832 Pnt 4648 3819 Pnt 4852 3881 Pnt 5135 3849 Pnt 4796 3834 Pnt 4609 3861 Pnt 5240 3825 Pnt 5136 3811 Pnt 5167 3870 Pnt 5076 3876 Pnt 5115 3308 Pnt 5323 3863 Pnt 5166 3880 Pnt 5150 3846 Pnt 4559 3170 Pnt 4470 3410 Pnt 5016 3836 Pnt 4788 3794 Pnt 5062 3338 Pnt 5227 3853 Pnt 4746 3834 Pnt 4455 3150 Pnt 5396 3859 Pnt 4542 3148 Pnt 5181 3865 Pnt 4739 3829 Pnt 5071 3801 Pnt 4394 3905 Pnt 5081 3874 Pnt 5090 3839 Pnt 4643 3861 Pnt 5032 3944 Pnt 5080 3410 Pnt 4927 3817 Pnt 4344 3110 Pnt 5179 3820 Pnt 5155 3900 Pnt 5142 3830 Pnt 5151 3111 Pnt 4714 3849 Pnt 4550 3111 Pnt 5281 3820 Pnt 5057 3416 Pnt 4558 3198 Pnt 5214 3843 Pnt 4410 3820 Pnt 5158 3828 Pnt 4524 3935 Pnt 4931 3800 Pnt 4479 3081 Pnt 5059 3356 Pnt 5023 3393 Pnt 4372 3826 Pnt 5138 3943 Pnt 4878 3849 Pnt 5002 3847 Pnt 5620 3303 Pnt 5431 3455 Pnt 5142 3887 Pnt 5098 3872 Pnt 5002 3848 Pnt 4923 3884 Pnt 4862 3865 Pnt 5083 3854 Pnt 5411 3478 Pnt 5008 3826 Pnt 4809 3887 Pnt 4873 3264 Pnt 5237 3896 Pnt 4863 3852 Pnt 5119 3353 Pnt 4709 3221 Pnt 4571 3846 Pnt 4751 3856 Pnt 5252 3889 Pnt 4585 3817 Pnt 5509 3485 Pnt 4774 3893 Pnt 4599 3859 Pnt 5223 3228 Pnt 5481 3862 Pnt 4720 3228 Pnt 4656 3915 Pnt 5216 3893 Pnt 4782 3846 Pnt 4524 3841 Pnt 5292 3806 Pnt 4709 3796 Pnt 4556 3191 Pnt 5495 3850 Pnt 5184 3867 Pnt 5646 3215 Pnt 5306 3461 Pnt 5548 3407 Pnt 4669 3208 Pnt 4582 3215 Pnt 5511 3910 Pnt 4629 3834 Pnt 5274 3407 Pnt 5346 3559 Pnt 5512 3944 Pnt 5399 3916 Pnt 5358 3870 Pnt 5455 3887 Pnt 5537 3494 Pnt 4680 3913 Pnt 4843 3807 Pnt 4705 3809 Pnt 4538 3158 Pnt 5727 3927 Pnt 5339 3929 Pnt 5319 3477 Pnt 5641 3555 Pnt 4672 3928 Pnt 5378 3923 Pnt 4410 3861 Pnt 4511 3835 Pnt 4705 3861 Pnt 4443 3188 Pnt 4533 3879 Pnt 4418 3177 Pnt 5654 3851 Pnt 4416 3853 Pnt 4564 3171 Pnt 5074 3952 Pnt 5066 3932 Pnt 5486 3595 Pnt 5079 3906 Pnt 5811 3887 Pnt 4967 3942 Pnt 5463 3853 Pnt 5560 3881 Pnt 5621 3946 Pnt 5046 3570 Pnt 4714 3937 Pnt 5674 3851 Pnt 5697 3890 Pnt 4744 3322 Pnt 5037 3360 Pnt 4775 3882 Pnt 5822 3844 Pnt 4927 3990 Pnt 4661 3967 Pnt 5584 3886 Pnt 4660 3981 Pnt 4852 3845 Pnt 5077 3458 Pnt 5797 3893 Pnt 5627 3926 Pnt 4739 3287 Pnt 4922 3368 Pnt 4955 3868 Pnt 5097 3849 Pnt 5147 3915 Pnt 4889 3304 Pnt 6066 3833 Pnt 4786 3357 Pnt 4898 3312 Pnt 4968 3442 Pnt 4820 3273 Pnt 4867 3346 Pnt 5081 3863 Pnt 5114 3426 Pnt 4985 3431 Pnt 4760 3231 Pnt 4736 3886 Pnt 5097 3854 Pnt 5045 3420 Pnt 5094 3878 Pnt 5289 3508 Pnt 5004 3877 Pnt 4934 3900 Pnt 4882 3397 Pnt 5213 3897 Pnt 5077 3364 Pnt 5955 3476 Pnt 5050 3429 Pnt 5989 3871 Pnt 5145 3968 Pnt 6057 3890 Pnt 5799 3952 Pnt 5115 3410 Pnt 5942 3678 Pnt 4856 3392 Pnt 4782 3839 Pnt 5203 3892 Pnt 4784 3293 Pnt 5111 3855 Pnt 4947 3383 Pnt 4699 3284 Pnt 6038 3828 Pnt 6013 3957 Pnt 4943 3844 Pnt 5171 3838 Pnt 4814 3375 Pnt 5017 3870 Pnt 5025 3827 Pnt 4760 3284 Pnt 4761 3837 Pnt 5019 3876 Pnt 4969 3872 Pnt 4888 3328 Pnt 4752 3829 Pnt 5095 3883 Pnt 4893 3885 Pnt 4942 3313 Pnt 5976 3823 Pnt 4878 3349 Pnt 4814 3857 Pnt 4881 3285 Pnt 4720 3281 Pnt 4745 3341 Pnt 4959 3844 Pnt 4796 3823 Pnt 4831 3255 Pnt 4723 3334 Pnt 4644 3849 Pnt 4825 3843 Pnt 5007 3323 Pnt 4599 3223 Pnt 4819 3818 Pnt 4806 3835 Pnt 5014 3282 Pnt 4938 3828 Pnt 4893 3834 Pnt 5123 3812 Pnt 4786 3235 Pnt 4970 3857 Pnt 5217 3828 Pnt 4855 3893 Pnt 4772 3828 Pnt 4839 3850 Pnt 5193 3507 Pnt 4462 3890 Pnt 4750 3777 Pnt 4879 3374 Pnt 6025 3809 Pnt 5193 3499 Pnt 4422 3191 Pnt 4803 3368 Pnt 4724 3198 Pnt 5092 3491 Pnt 4668 3871 Pnt 4576 3864 Pnt 4851 3266 Pnt 4770 3361 Pnt 4669 3313 Pnt 5052 3483 Pnt 4403 3874 Pnt 4732 3236 Pnt 4929 3355 Pnt 4635 3875 Pnt 4394 3159 Pnt 5040 3798 Pnt 4743 3204 Pnt 4746 3352 Pnt 4667 3821 Pnt 4479 3168 Pnt 5134 3785 Pnt 4614 3168 Pnt 4431 3830 Pnt 4718 3785 Pnt 5117 3840 Pnt 4639 3127 Pnt 4465 3137 Pnt 4562 3856 Pnt 4990 3864 Pnt 4453 3862 Pnt 4353 3124 Pnt 4970 3437 Pnt 5321 3873 Pnt 4418 3109 Pnt 5085 3447 Pnt 5246 3860 Pnt 4398 3094 Pnt 4843 3350 Pnt 4305 3097 Pnt 4848 3763 Pnt 5212 3841 Pnt 4709 3337 Pnt 5279 3491 Pnt 4914 3330 Pnt 4798 3323 Pnt 5138 3833 Pnt 4770 3316 Pnt 5215 3826 Pnt 4652 3309 Pnt 4925 3847 Pnt 4718 3359 Pnt 4796 3860 Pnt 4846 3353 Pnt 4782 3294 Pnt 4719 3346 Pnt 4738 3850 Pnt 4877 3849 Pnt 4608 3861 Pnt 4822 3848 Pnt 4781 3270 Pnt 4701 3848 Pnt 4679 3855 Pnt 4791 3853 Pnt 4760 3305 Pnt 4689 3854 Pnt 4632 3301 Pnt 4837 3302 Pnt 4909 3840 Pnt 4799 3424 Pnt 4928 3420 Pnt 4833 3415 Pnt 4912 3410 Pnt 4782 3405 Pnt 4893 3400 Pnt 4796 3395 Pnt 4740 3390 Pnt 4829 3384 Pnt 4852 3379 Pnt 4779 3373 Pnt 4838 3368 Pnt 4699 3362 Pnt 4815 3356 Pnt 4780 3350 Pnt 4798 3344 Pnt 4624 3338 Pnt 4727 3380 Pnt 4840 3374 Pnt 4823 3369 Pnt 4691 3363 Pnt 4684 3358 Pnt 4804 3352 Pnt 4781 3346 Pnt 4665 3340 Pnt 4634 3334 Pnt 4762 3328 Pnt 4759 3322 Pnt 4528 3805 Pnt 4734 3309 Pnt 4598 3302 Pnt 4699 3295 Pnt 4568 3288 Pnt 4683 3281 Pnt 4547 3273 Pnt 4536 3266 Pnt 4637 3258 Pnt 4633 3250 Pnt 4489 3242 Pnt 4462 3233 Pnt 4269 3787 Pnt 4734 3306 Pnt 4440 3208 Pnt 4417 3198 Pnt 4417 3188 Pnt 4386 3178 Pnt 4210 3167 Pnt 4249 3156 Pnt 4299 3144 Pnt 4175 3132 Pnt 4150 3119 Pnt 4093 3106 Pnt 4077 3092 Pnt 4039 3078 Pnt 4022 3063 Pnt 3970 3047 Pnt 3982 3030 Pnt 3930 3012 Pnt 3913 2993 Pnt 3875 2972 Pnt 3908 2951 Pnt 3819 2927 Pnt 3808 2902 Pnt 3735 2874 Pnt 3740 2843 Pnt 3730 2809 Pnt 3643 2771 Pnt 3493 2727 Pnt 3508 2676 Pnt 3398 2613 Pnt 3341 2535 Pnt 3152 2429 Pnt 3219 2361 Pnt 6579 4486 Pnt % End plot #1 % Begin plot #2 1.000 UL LT1 LCb setrgbcolor 6296 4346 M [ [(Helvetica) 140.0 0.0 true true 0 (DGEMM)] ] -46.7 MRshow LT1 2641 3743 Pnt 2359 3736 Pnt 3907 3745 Pnt 2395 3743 Pnt 2456 3745 Pnt 2113 3736 Pnt 2743 3745 Pnt 3363 3743 Pnt 2365 3732 Pnt 2049 3734 Pnt 2582 3745 Pnt 1816 3733 Pnt 2164 3732 Pnt 2540 3743 Pnt 2101 3733 Pnt 2564 3742 Pnt 2790 3734 Pnt 2387 3731 Pnt 2119 3734 Pnt 2452 3731 Pnt 3572 3741 Pnt 3727 3742 Pnt 2257 3734 Pnt 2558 3743 Pnt 2790 3744 Pnt 2823 3742 Pnt 2454 3743 Pnt 2287 3741 Pnt 3192 3744 Pnt 2634 3743 Pnt 3099 3745 Pnt 3342 3743 Pnt 2777 3742 Pnt 2304 3736 Pnt 3225 3743 Pnt 1887 3733 Pnt 2324 3745 Pnt 2172 3743 Pnt 3236 3743 Pnt 2436 3736 Pnt 3133 3744 Pnt 3201 3745 Pnt 2318 3743 Pnt 3081 3736 Pnt 2957 3742 Pnt 2182 3755 Pnt 3344 3743 Pnt 1742 3733 Pnt 3043 3733 Pnt 2494 3745 Pnt 2340 3742 Pnt 2935 3743 Pnt 2164 3749 Pnt 3459 3736 Pnt 2426 3761 Pnt 2492 3743 Pnt 2672 3744 Pnt 2505 3743 Pnt 2435 3733 Pnt 2743 3762 Pnt 2503 3753 Pnt 2436 3745 Pnt 2221 3744 Pnt 2320 3742 Pnt 3052 3742 Pnt 2512 3743 Pnt 2144 3735 Pnt 2578 3733 Pnt 2368 3753 Pnt 2671 3743 Pnt 3663 3745 Pnt 2059 3735 Pnt 2281 3742 Pnt 2734 3742 Pnt 2550 3733 Pnt 3334 3747 Pnt 2947 3763 Pnt 2724 3743 Pnt 3031 3745 Pnt 2201 3762 Pnt 2861 3743 Pnt 2650 2766 Pnt 3518 3746 Pnt 2527 3755 Pnt 3223 3742 Pnt 2417 3747 Pnt 2370 3743 Pnt 2487 3763 Pnt 2580 3745 Pnt 2563 3760 Pnt 2535 3746 Pnt 3380 3760 Pnt 2289 3743 Pnt 2160 3753 Pnt 2096 3760 Pnt 2381 3755 Pnt 3188 3733 Pnt 2884 3738 Pnt 2629 3760 Pnt 3076 3743 Pnt 2753 3742 Pnt 2409 3745 Pnt 2353 3745 Pnt 2751 3739 Pnt 2396 3747 Pnt 2792 3738 Pnt 2799 3743 Pnt 3069 2720 Pnt 2212 3743 Pnt 1984 3760 Pnt 3590 2307 Pnt 3242 3743 Pnt 2078 3761 Pnt 2227 3757 Pnt 2391 3747 Pnt 2898 3745 Pnt 3758 2392 Pnt 1878 3760 Pnt 3014 3745 Pnt 2415 3743 Pnt 2885 3743 Pnt 2475 3761 Pnt 2168 3757 Pnt 2105 3738 Pnt 3189 3745 Pnt 3095 3757 Pnt 2704 3738 Pnt 3023 3747 Pnt 2225 3743 Pnt 3368 3733 Pnt 2000 3760 Pnt 2157 3751 Pnt 2531 3745 Pnt 2087 3738 Pnt 3097 3741 Pnt 2579 3743 Pnt 2605 3738 Pnt 4033 2619 Pnt 2728 3751 Pnt 2225 3760 Pnt 2744 3757 Pnt 2426 3741 Pnt 3127 3738 Pnt 2515 2670 Pnt 2474 3761 Pnt 2039 3743 Pnt 2343 3747 Pnt 3393 3741 Pnt 3458 2559 Pnt 3163 3746 Pnt 2521 3740 Pnt 2200 3749 Pnt 1949 3736 Pnt 3387 3743 Pnt 2592 3746 Pnt 2451 2586 Pnt 2350 3759 Pnt 1904 3761 Pnt 2491 3748 Pnt 2063 3748 Pnt 3748 3744 Pnt 2241 3739 Pnt 1921 3757 Pnt 2907 3740 Pnt 3377 3737 Pnt 2392 3747 Pnt 3059 3742 Pnt 3393 3757 Pnt 2367 3746 Pnt 3042 3748 Pnt 2217 3761 Pnt 3212 3739 Pnt 2962 3745 Pnt 2866 3743 Pnt 2655 3748 Pnt 1896 3759 Pnt 3082 3745 Pnt 3064 3749 Pnt 3037 3736 Pnt 2775 3757 Pnt 2494 3741 Pnt 2179 3767 Pnt 2026 3736 Pnt 2241 3735 Pnt 2392 3736 Pnt 3397 3739 Pnt 2955 3740 Pnt 2581 3759 Pnt 2317 3744 Pnt 2558 3745 Pnt 3514 3737 Pnt 2668 3761 Pnt 2629 3747 Pnt 3075 3743 Pnt 2370 3743 Pnt 2277 3761 Pnt 2756 3745 Pnt 3018 3746 Pnt 2928 3745 Pnt 2271 3743 Pnt 2845 3752 Pnt 2659 3747 Pnt 2213 3759 Pnt 2399 3761 Pnt 1916 3739 Pnt 3727 2494 Pnt 3162 3760 Pnt 2322 3740 Pnt 2870 3743 Pnt 3127 3741 Pnt 2970 3747 Pnt 4035 3745 Pnt 2422 3744 Pnt 2869 3743 Pnt 2097 3753 Pnt 2384 3738 Pnt 2087 3747 Pnt 2274 3741 Pnt 1971 3735 Pnt 2126 3731 Pnt 2029 3765 Pnt 2690 3747 Pnt 2395 3736 Pnt 2364 3747 Pnt 2383 3741 Pnt 2779 3741 Pnt 3293 3735 Pnt 2632 3734 Pnt 2382 3741 Pnt 1967 3760 Pnt 2399 3743 Pnt 2525 3773 Pnt 2732 3746 Pnt 2116 3738 Pnt 2729 3738 Pnt 2331 3740 Pnt 2054 3743 Pnt 3355 3741 Pnt 1921 3750 Pnt 2302 3746 Pnt 3069 3738 Pnt 2301 3731 Pnt 2548 3738 Pnt 1858 3735 Pnt 1776 3773 Pnt 2383 3732 Pnt 3269 3746 Pnt 2299 3746 Pnt 2298 3744 Pnt 2088 3765 Pnt 2409 3741 Pnt 3394 3746 Pnt 2798 3743 Pnt 2287 3753 Pnt 3063 3743 Pnt 2507 3741 Pnt 3029 3743 Pnt 2209 3741 Pnt 2473 3736 Pnt 2621 3743 Pnt 2515 3744 Pnt 1943 3730 Pnt 3003 3747 Pnt 2571 3760 Pnt 2202 3738 Pnt 2739 3755 Pnt 3253 3744 Pnt 2736 3758 Pnt 2570 3735 Pnt 2698 2837 Pnt 2929 3741 Pnt 2226 3738 Pnt 2666 3740 Pnt 2704 3746 Pnt 2154 3731 Pnt 1845 3750 Pnt 2538 3747 Pnt 3218 3747 Pnt 2630 3741 Pnt 3461 3750 Pnt 2584 3741 Pnt 2817 3747 Pnt 1710 3760 Pnt 2657 3736 Pnt 2957 3747 Pnt 2836 3741 Pnt 2865 3735 Pnt 2414 3741 Pnt 2589 3753 Pnt 3303 3743 Pnt 2105 3760 Pnt 2298 3773 Pnt 3355 3743 Pnt 2419 3747 Pnt 2301 3743 Pnt 2805 3747 Pnt 2415 3761 Pnt 2391 3735 Pnt 3700 2549 Pnt 2430 3738 Pnt 2824 3744 Pnt 3662 2569 Pnt 2369 3741 Pnt 2384 3755 Pnt 2650 3736 Pnt 2357 3730 Pnt 1843 3750 Pnt 2646 3747 Pnt 2504 3758 Pnt 2054 3743 Pnt 2697 3741 Pnt 2568 3735 Pnt 2945 3741 Pnt 2217 3747 Pnt 3497 3743 Pnt 4000 3743 Pnt 2414 3747 Pnt 2792 3741 Pnt 2772 3738 Pnt 2383 3753 Pnt 2809 3747 Pnt 1886 3761 Pnt 2580 3758 Pnt 1970 3773 Pnt 1948 3740 Pnt 2838 3747 Pnt 2074 3735 Pnt 2697 3738 Pnt 2089 3743 Pnt 2200 3741 Pnt 2286 3751 Pnt 2066 3738 Pnt 2769 3744 Pnt 2424 3751 Pnt 2156 3749 Pnt 2320 3747 Pnt 2483 3741 Pnt 2041 3743 Pnt 4044 3750 Pnt 2074 3746 Pnt 2387 3749 Pnt 2373 3736 Pnt 3366 3752 Pnt 2135 3739 Pnt 2503 3747 Pnt 2236 3747 Pnt 3017 3743 Pnt 1906 3750 Pnt 2741 3747 Pnt 1915 3761 Pnt 2166 3743 Pnt 2448 3745 Pnt 2237 3758 Pnt 2731 3736 Pnt 3863 2555 Pnt 2185 3737 Pnt 2144 3747 Pnt 2488 3739 Pnt 2777 3744 Pnt 2373 3732 Pnt 2444 3743 Pnt 2558 3752 Pnt 2410 3744 Pnt 2419 3747 Pnt 2387 3755 Pnt 2417 3737 Pnt 2405 3747 Pnt 2362 3758 Pnt 2518 3740 Pnt 2010 3730 Pnt 2166 3743 Pnt 2218 3739 Pnt 2662 3739 Pnt 3198 3744 Pnt 2584 3741 Pnt 2082 3747 Pnt 2597 3773 Pnt 2000 3751 Pnt 1932 3742 Pnt 2594 3738 Pnt 2763 3738 Pnt 2215 3749 Pnt 2362 3744 Pnt 2289 3745 Pnt 2040 3735 Pnt 2013 3765 Pnt 2944 3743 Pnt 2666 2655 Pnt 2336 3752 Pnt 2599 3765 Pnt 1981 3744 Pnt 2734 3738 Pnt 2338 3745 Pnt 3036 3743 Pnt 2504 3741 Pnt 2214 3735 Pnt 2119 3735 Pnt 2058 3737 Pnt 2202 3754 Pnt 2218 3761 Pnt 2543 3773 Pnt 1871 3747 Pnt 2968 3745 Pnt 2392 3740 Pnt 2926 3732 Pnt 3248 3737 Pnt 2282 3742 Pnt 2091 3732 Pnt 3341 3746 Pnt 2276 3749 Pnt 3027 2828 Pnt 2405 3741 Pnt 2208 3739 Pnt 3189 3743 Pnt 3462 3751 Pnt 3037 3740 Pnt 2197 3737 Pnt 2423 3738 Pnt 3096 3752 Pnt 3381 3744 Pnt 1952 3741 Pnt 3481 3752 Pnt 3097 3738 Pnt 2228 3755 Pnt 3219 3744 Pnt 2132 3765 Pnt 2543 3755 Pnt 2183 3766 Pnt 2864 3741 Pnt 2193 3740 Pnt 3666 3765 Pnt 2869 3749 Pnt 2341 3766 Pnt 2482 3740 Pnt 1908 3739 Pnt 3100 3743 Pnt 2247 3740 Pnt 2601 3749 Pnt 2823 3745 Pnt 2082 3743 Pnt 3239 3748 Pnt 2172 3738 Pnt 3149 3746 Pnt 2785 3738 Pnt 2219 3737 Pnt 3283 3741 Pnt 2427 3739 Pnt 2862 3752 Pnt 2540 3735 Pnt 2254 3738 Pnt 3507 3745 Pnt 3360 3783 Pnt 2479 3744 Pnt 2502 3737 Pnt 2249 3766 Pnt 2363 3754 Pnt 3325 3744 Pnt 2941 3739 Pnt 2023 3744 Pnt 3144 3743 Pnt 2172 3732 Pnt 1889 3743 Pnt 1989 3752 Pnt 2004 3739 Pnt 2854 3735 Pnt 2165 3740 Pnt 2881 3740 Pnt 2328 3743 Pnt 2676 3744 Pnt 2041 3747 Pnt 2955 2658 Pnt 2873 2564 Pnt 3831 2649 Pnt 2684 3749 Pnt 3179 3747 Pnt 2327 3747 Pnt 2470 3747 Pnt 2955 3743 Pnt 2356 3765 Pnt 2127 3734 Pnt 3168 3742 Pnt 2151 3745 Pnt 3687 3741 Pnt 2442 3744 Pnt 2123 3743 Pnt 3480 3749 Pnt 3123 3740 Pnt 2096 3738 Pnt 2378 3733 Pnt 3397 3744 Pnt 3108 3738 Pnt 2062 3744 Pnt 2974 2667 Pnt 3069 3741 Pnt 2770 3749 Pnt 2905 3752 Pnt 2314 3766 Pnt 2224 3746 Pnt 2435 3743 Pnt 2900 3741 Pnt 1763 3747 Pnt 2593 3759 Pnt 1805 3785 Pnt 3050 3751 Pnt 2691 3744 Pnt 3492 3749 Pnt 2721 3737 Pnt 3226 3740 Pnt 3132 3739 Pnt 2133 3742 Pnt 2198 3732 Pnt 2670 3740 Pnt 2757 3766 Pnt 1908 3743 Pnt 2277 3752 Pnt 2387 3743 Pnt 2409 3744 Pnt 2372 3761 Pnt 2432 3763 Pnt 2553 3736 Pnt 2312 3779 Pnt 2178 3751 Pnt 2790 3737 Pnt 2868 3736 Pnt 2654 3754 Pnt 2422 3739 Pnt 4251 3756 Pnt 2438 3735 Pnt 1845 3783 Pnt 2351 3744 Pnt 2088 3743 Pnt 3428 3738 Pnt 2456 3738 Pnt 3061 3744 Pnt 2521 3742 Pnt 1966 3765 Pnt 2901 3741 Pnt 3343 3749 Pnt 3011 3740 Pnt 2789 3742 Pnt 3082 3740 Pnt 2804 3738 Pnt 2902 3740 Pnt 2878 3743 Pnt 2901 3743 Pnt 2608 3744 Pnt 2248 3745 Pnt 2113 3741 Pnt 2392 3751 Pnt 3321 3734 Pnt 2469 3743 Pnt 2158 3751 Pnt 2611 3743 Pnt 2588 3748 Pnt 2258 3759 Pnt 2465 3746 Pnt 2716 3737 Pnt 3041 3751 Pnt 2743 3740 Pnt 2001 3785 Pnt 2737 3741 Pnt 2081 3749 Pnt 2445 3741 Pnt 3917 3740 Pnt 2073 3762 Pnt 2972 3741 Pnt 2036 3766 Pnt 2966 3747 Pnt 2022 3738 Pnt 1947 3783 Pnt 2356 3742 Pnt 1908 3765 Pnt 2863 3737 Pnt 2270 3736 Pnt 3509 2689 Pnt 2780 3738 Pnt 2861 3738 Pnt 3719 3737 Pnt 2537 3747 Pnt 2713 3761 Pnt 2367 3754 Pnt 2260 3744 Pnt 2024 3741 Pnt 2120 3743 Pnt 2359 3741 Pnt 2354 3790 Pnt 3032 3742 Pnt 1835 3761 Pnt 2814 3738 Pnt 2487 3741 Pnt 2402 3743 Pnt 1735 3765 Pnt 2344 3779 Pnt 2269 3741 Pnt 2992 3740 Pnt 1907 3739 Pnt 1909 3766 Pnt 2515 3751 Pnt 2688 3744 Pnt 2840 3743 Pnt 2303 3742 Pnt 2232 3759 Pnt 2354 3737 Pnt 2813 3740 Pnt 3843 3744 Pnt 2650 3736 Pnt 2512 2546 Pnt 2476 3746 Pnt 2693 2580 Pnt 2244 3738 Pnt 2229 3749 Pnt 3247 3736 Pnt 3211 3743 Pnt 3284 3740 Pnt 3189 3743 Pnt 3529 3742 Pnt 2266 3744 Pnt 3148 3733 Pnt 3084 3745 Pnt 2669 3782 Pnt 2361 3748 Pnt 3313 3736 Pnt 2877 2625 Pnt 2660 3779 Pnt 2286 3742 Pnt 2362 3734 Pnt 2314 3740 Pnt 3423 2555 Pnt 2481 3736 Pnt 2076 3766 Pnt 2155 3741 Pnt 2248 3741 Pnt 2136 3749 Pnt 2186 3785 Pnt 2906 3741 Pnt 2610 3737 Pnt 2504 3758 Pnt 2689 3741 Pnt 1874 3747 Pnt 2521 3763 Pnt 2303 3740 Pnt 3231 3738 Pnt 3002 3747 Pnt 2243 3745 Pnt 2657 3744 Pnt 2441 3745 Pnt 2326 3748 Pnt 2232 3747 Pnt 2297 3765 Pnt 2360 3744 Pnt 2584 3738 Pnt 2593 3742 Pnt 2438 3738 Pnt 2238 3744 Pnt 2588 3744 Pnt 2557 3759 Pnt 2113 3790 Pnt 2799 3743 Pnt 2327 3741 Pnt 1769 3781 Pnt 3221 3736 Pnt 2176 3783 Pnt 2432 3744 Pnt 2817 3761 Pnt 2722 3736 Pnt 2497 3738 Pnt 3088 3741 Pnt 2546 3767 Pnt 3188 3736 Pnt 2234 3754 Pnt 2052 3763 Pnt 2257 3751 Pnt 2680 3738 Pnt 2385 3747 Pnt 2505 3743 Pnt 1818 3738 Pnt 2797 3743 Pnt 2624 3745 Pnt 2199 3745 Pnt 2421 3748 Pnt 2438 3739 Pnt 2283 3749 Pnt 2213 3745 Pnt 1971 3755 Pnt 3154 3744 Pnt 2656 3740 Pnt 2359 3748 Pnt 1896 3766 Pnt 2396 3741 Pnt 2578 3734 Pnt 2480 3746 Pnt 2001 3765 Pnt 2160 3740 Pnt 2409 3768 Pnt 2330 3739 Pnt 2231 3743 Pnt 2850 3751 Pnt 2732 3742 Pnt 2483 3739 Pnt 2532 3738 Pnt 2879 3738 Pnt 2505 3741 Pnt 2440 3738 Pnt 2092 3749 Pnt 3103 3745 Pnt 2858 3742 Pnt 3864 2590 Pnt 3264 3734 Pnt 2388 3742 Pnt 2985 3737 Pnt 2835 3767 Pnt 3967 2726 Pnt 2067 3759 Pnt 2883 3738 Pnt 2092 2737 Pnt 2187 3745 Pnt 1948 3754 Pnt 2795 3744 Pnt 1795 3783 Pnt 2688 3738 Pnt 2253 3753 Pnt 2646 3737 Pnt 2456 3761 Pnt 2645 3744 Pnt 2572 2647 Pnt 2101 3763 Pnt 3082 3740 Pnt 1987 3744 Pnt 2702 3761 Pnt 2655 3736 Pnt 2733 3736 Pnt 2372 3731 Pnt 2722 3738 Pnt 3194 2810 Pnt 2565 3743 Pnt 2435 3743 Pnt 2654 3747 Pnt 3192 3743 Pnt 2346 3781 Pnt 3516 3741 Pnt 2427 3739 Pnt 3000 3735 Pnt 2808 3738 Pnt 2922 3738 Pnt 3147 3741 Pnt 2633 3747 Pnt 3500 3739 Pnt 2988 3736 Pnt 1845 3779 Pnt 2484 3777 Pnt 2425 3741 Pnt 2352 3742 Pnt 2307 3775 Pnt 2276 3751 Pnt 2588 3742 Pnt 2479 3746 Pnt 2847 3742 Pnt 2351 3743 Pnt 1821 3766 Pnt 3018 3780 Pnt 2479 3743 Pnt 2202 3789 Pnt 3145 3736 Pnt 2979 3757 Pnt 2393 3748 Pnt 2890 3739 Pnt 2427 3745 Pnt 3245 2295 Pnt 2794 3741 Pnt 1810 3755 Pnt 2786 3748 Pnt 2348 3746 Pnt 2676 3759 Pnt 1886 3781 Pnt 2227 3749 Pnt 2677 3743 Pnt 2936 3734 Pnt 2743 3784 Pnt 1798 3765 Pnt 2303 3745 Pnt 1712 3785 Pnt 3164 2578 Pnt 2082 3748 Pnt 2307 3742 Pnt 2976 3740 Pnt 2155 3785 Pnt 2812 3739 Pnt 2375 3748 Pnt 2329 3738 Pnt 2152 3768 Pnt 2185 3742 Pnt 2031 3738 Pnt 2369 3741 Pnt 3123 3738 Pnt 3740 2744 Pnt 2156 3775 Pnt 3015 2802 Pnt 3098 3745 Pnt 2366 3767 Pnt 3491 3740 Pnt 2736 3743 Pnt 1883 3775 Pnt 1872 3759 Pnt 2382 3742 Pnt 3346 3737 Pnt 3648 3740 Pnt 2915 3738 Pnt 2374 3742 Pnt 2079 3784 Pnt 3250 3754 Pnt 2418 3737 Pnt 2368 3743 Pnt 3465 2421 Pnt 2596 3745 Pnt 2151 3753 Pnt 2191 3742 Pnt 3071 3744 Pnt 2304 3761 Pnt 2956 3740 Pnt 3807 3745 Pnt 2381 3740 Pnt 2918 3744 Pnt 2632 3761 Pnt 2593 3744 Pnt 2520 3748 Pnt 2598 3741 Pnt 2920 3744 Pnt 2505 3743 Pnt 2807 3758 Pnt 1820 3755 Pnt 2738 3749 Pnt 2023 3768 Pnt 2130 3741 Pnt 2244 3789 Pnt 2758 3743 Pnt 2219 3763 Pnt 2171 3767 Pnt 2216 3745 Pnt 3148 3743 Pnt 2250 3741 Pnt 2940 3744 Pnt 2623 3735 Pnt 2005 3748 Pnt 3099 3739 Pnt 2867 1858 Pnt 3303 3743 Pnt 2433 3739 Pnt 1904 3787 Pnt 3269 3743 Pnt 2823 3736 Pnt 2550 3744 Pnt 2207 3784 Pnt 3376 3744 Pnt 2313 3754 Pnt 2779 3743 Pnt 3107 3759 Pnt 2309 3740 Pnt 1784 3781 Pnt 2646 3784 Pnt 1786 3785 Pnt 2124 3745 Pnt 2798 3783 Pnt 2308 3741 Pnt 2476 3745 Pnt 2630 3775 Pnt 2872 3748 Pnt 2096 3761 Pnt 2837 3757 Pnt 2755 3756 Pnt 2140 3733 Pnt 2298 3743 Pnt 2368 3745 Pnt 2025 3738 Pnt 3434 3736 Pnt 2155 3753 Pnt 2891 3734 Pnt 2316 3742 Pnt 2090 3745 Pnt 2975 3744 Pnt 3680 2464 Pnt 3160 3740 Pnt 2802 3743 Pnt 3048 3734 Pnt 2926 3744 Pnt 2392 3748 Pnt 3889 2533 Pnt 2645 3742 Pnt 2492 3738 Pnt 3100 3741 Pnt 2398 3739 Pnt 3517 3767 Pnt 2897 3738 Pnt 2722 3781 Pnt 3123 3739 Pnt 1941 3744 Pnt 2883 3738 Pnt 2921 3745 Pnt 1771 3775 Pnt 2629 3740 Pnt 2328 3748 Pnt 2493 3742 Pnt 1956 3741 Pnt 1859 3759 Pnt 3086 3738 Pnt 2208 3780 Pnt 2288 3743 Pnt 2114 3745 Pnt 2872 3789 Pnt 2544 3742 Pnt 2211 3745 Pnt 2663 3751 Pnt 2507 3754 Pnt 1937 3777 Pnt 1939 3763 Pnt 3709 3742 Pnt 2040 3753 Pnt 2038 3784 Pnt 3130 3745 Pnt 1736 3768 Pnt 2317 3744 Pnt 3254 3745 Pnt 2934 3758 Pnt 2425 3740 Pnt 2988 3753 Pnt 2109 3758 Pnt 2619 3744 Pnt 2397 3776 Pnt 2921 3750 Pnt 3325 3741 Pnt 2204 3747 Pnt 2486 3743 Pnt 2906 3744 Pnt 2451 3739 Pnt 2849 3758 Pnt 2276 3743 Pnt 2428 3755 Pnt 1994 3741 Pnt 2836 3765 Pnt 2406 3744 Pnt 2506 3736 Pnt 2918 3743 Pnt 2351 3742 Pnt 3603 2524 Pnt 1958 3784 Pnt 2360 3740 Pnt 2218 3742 Pnt 1916 3746 Pnt 2951 3744 Pnt 2887 3744 Pnt 2773 3746 Pnt 2308 3745 Pnt 2006 3792 Pnt 3273 3732 Pnt 2613 3751 Pnt 2529 3748 Pnt 2254 3763 Pnt 2432 3755 Pnt 2465 3781 Pnt 2999 3744 Pnt 2372 3743 Pnt 3150 3742 Pnt 2762 3743 Pnt 2484 3741 Pnt 2422 3765 Pnt 3422 3741 Pnt 2367 3743 Pnt 2592 3743 Pnt 2430 3767 Pnt 2425 3745 Pnt 3132 3748 Pnt 2399 3786 Pnt 1998 3741 Pnt 2221 3784 Pnt 2304 3739 Pnt 2109 3783 Pnt 2814 3740 Pnt 1881 3761 Pnt 2976 3739 Pnt 2572 3751 Pnt 2616 3756 Pnt 4011 3748 Pnt 2393 3754 Pnt 3171 3743 Pnt 2651 3744 Pnt 3000 3742 Pnt 2806 3739 Pnt 2928 3742 Pnt 2344 3797 Pnt 3718 2590 Pnt 2948 3740 Pnt 2673 3743 Pnt 2504 3755 Pnt 2747 3770 Pnt 2739 3740 Pnt 3034 3745 Pnt 2067 3753 Pnt 2223 3768 Pnt 2760 3780 Pnt 3331 3743 Pnt 2565 3758 Pnt 2545 3740 Pnt 2962 2578 Pnt 2549 3752 Pnt 1952 3783 Pnt 2929 3742 Pnt 2507 3743 Pnt 2222 3753 Pnt 3086 3745 Pnt 2412 3743 Pnt 2052 3744 Pnt 3496 3745 Pnt 2297 3739 Pnt 3017 3738 Pnt 2517 3743 Pnt 2443 3755 Pnt 2841 3739 Pnt 1946 3781 Pnt 3403 2615 Pnt 2749 3750 Pnt 1921 3740 Pnt 2534 3744 Pnt 2035 3745 Pnt 1759 3777 Pnt 2164 3742 Pnt 2886 3738 Pnt 2690 3735 Pnt 2073 3765 Pnt 2345 3745 Pnt 2262 3769 Pnt 2661 3789 Pnt 2827 3745 Pnt 2815 3743 Pnt 2597 3781 Pnt 2341 3741 Pnt 2121 3783 Pnt 2826 3789 Pnt 2732 3761 Pnt 2612 3748 Pnt 2896 3745 Pnt 1939 3763 Pnt 2816 3740 Pnt 2366 3739 Pnt 3463 3748 Pnt 2316 3735 Pnt 3195 3743 Pnt 3508 2579 Pnt 2900 3739 Pnt 2743 3741 Pnt 3510 3748 Pnt 2860 3741 Pnt 2036 3768 Pnt 2725 3736 Pnt 2436 3767 Pnt 1915 3761 Pnt 1815 3776 Pnt 2497 3743 Pnt 2819 3736 Pnt 2115 3770 Pnt 2918 3761 Pnt 3092 3739 Pnt 2512 3743 Pnt 3090 3744 Pnt 2676 3742 Pnt 2594 3737 Pnt 2680 3739 Pnt 1837 3743 Pnt 2775 3742 Pnt 2650 3755 Pnt 2234 3758 Pnt 2381 3744 Pnt 2324 3742 Pnt 2579 3755 Pnt 2045 3779 Pnt 2309 3781 Pnt 3025 3742 Pnt 2455 3734 Pnt 1862 3743 Pnt 2355 3743 Pnt 2831 3793 Pnt 2289 3777 Pnt 2147 3763 Pnt 2110 3745 Pnt 2266 3746 Pnt 1795 3781 Pnt 2274 3756 Pnt 2772 3743 Pnt 3939 3742 Pnt 2442 3751 Pnt 2808 3758 Pnt 2822 3744 Pnt 2650 3739 Pnt 2751 3759 Pnt 2878 3737 Pnt 2821 3744 Pnt 3633 3758 Pnt 2714 3743 Pnt 2063 3750 Pnt 2398 3755 Pnt 2168 3786 Pnt 3607 3786 Pnt 2025 3784 Pnt 2421 3740 Pnt 2801 3756 Pnt 1818 3781 Pnt 2197 3742 Pnt 2460 3739 Pnt 2544 3751 Pnt 2551 3761 Pnt 2025 3777 Pnt 3168 3767 Pnt 3516 3737 Pnt 1845 3783 Pnt 2406 3744 Pnt 2776 3748 Pnt 2664 3745 Pnt 2958 3740 Pnt 2903 3735 Pnt 2009 3745 Pnt 2678 3783 Pnt 2347 3742 Pnt 2399 3740 Pnt 3013 3748 Pnt 2763 3742 Pnt 2379 3741 Pnt 2200 3754 Pnt 2234 3741 Pnt 2449 3781 Pnt 3205 3742 Pnt 1869 3761 Pnt 3057 3752 Pnt 2590 3759 Pnt 1928 3774 Pnt 2291 3780 Pnt 2026 3736 Pnt 2936 3755 Pnt 2335 3743 Pnt 1963 3765 Pnt 2658 3748 Pnt 2458 3739 Pnt 2305 3789 Pnt 2656 3753 Pnt 2445 3746 Pnt 3090 3742 Pnt 2786 3781 Pnt 3114 3740 Pnt 2714 3745 Pnt 2767 3781 Pnt 2529 3742 Pnt 2447 3734 Pnt 3029 2582 Pnt 3056 3745 Pnt 2491 3744 Pnt 1785 3770 Pnt 2768 3754 Pnt 3141 3741 Pnt 2463 3780 Pnt 2871 3763 Pnt 2365 3788 Pnt 2568 3789 Pnt 2642 3748 Pnt 2207 3744 Pnt 2546 3744 Pnt 2351 3785 Pnt 2143 3779 Pnt 2338 3740 Pnt 2621 3750 Pnt 3063 3780 Pnt 2782 3741 Pnt 2376 3739 Pnt 2240 3739 Pnt 1889 3746 Pnt 3392 3744 Pnt 3249 3739 Pnt 2884 3749 Pnt 2390 3751 Pnt 2728 3741 Pnt 2118 3745 Pnt 2404 3762 Pnt 2344 3754 Pnt 2421 3743 Pnt 2165 3779 Pnt 2266 3740 Pnt 2396 3758 Pnt 2589 3743 Pnt 2349 3755 Pnt 3675 3750 Pnt 1735 3767 Pnt 2442 3744 Pnt 2038 3744 Pnt 2190 3742 Pnt 2581 3777 Pnt 2271 3742 Pnt 2465 3737 Pnt 2200 3756 Pnt 2242 3739 Pnt 2363 3742 Pnt 2356 3765 Pnt 2319 3763 Pnt 2365 3758 Pnt 2939 2569 Pnt 3209 3744 Pnt 2361 3744 Pnt 2659 3743 Pnt 2008 3769 Pnt 2326 3736 Pnt 1942 3783 Pnt 3016 3736 Pnt 2925 3742 Pnt 3557 2700 Pnt 2780 3743 Pnt 2613 3759 Pnt 2349 3745 Pnt 2507 3793 Pnt 3098 2675 Pnt 2205 3786 Pnt 2894 3740 Pnt 2358 3743 Pnt 2900 3741 Pnt 2410 3755 Pnt 3147 3786 Pnt 2538 3745 Pnt 2751 3735 Pnt 2224 3778 Pnt 2834 3737 Pnt 2604 3742 Pnt 2805 3737 Pnt 2490 2484 Pnt 2731 3749 Pnt 2801 3742 Pnt 2615 3737 Pnt 2406 3741 Pnt 2742 2648 Pnt 3014 3746 Pnt 3041 3752 Pnt 3070 3748 Pnt 2224 3748 Pnt 3361 3746 Pnt 2195 3753 Pnt 1857 3765 Pnt 2551 3785 Pnt 2497 3765 Pnt 2873 3743 Pnt 2355 3745 Pnt 3430 3749 Pnt 2786 3751 Pnt 2442 3742 Pnt 1833 3780 Pnt 2553 3780 Pnt 2777 3743 Pnt 2480 3750 Pnt 1808 3774 Pnt 2791 3751 Pnt 2553 3737 Pnt 2370 3756 Pnt 2178 3744 Pnt 2628 3747 Pnt 2970 3741 Pnt 2261 3734 Pnt 3553 3767 Pnt 2620 3747 Pnt 2312 3778 Pnt 3680 3741 Pnt 2512 3745 Pnt 2241 3745 Pnt 2075 3789 Pnt 2717 3778 Pnt 1787 3757 Pnt 2526 3755 Pnt 1736 3767 Pnt 2593 3779 Pnt 2276 3763 Pnt 3444 3740 Pnt 2681 3738 Pnt 2931 3743 Pnt 2724 3743 Pnt 2403 3744 Pnt 1909 3739 Pnt 3719 3743 Pnt 1781 3770 Pnt 2132 3742 Pnt 2790 3737 Pnt 2425 3744 Pnt 3093 3740 Pnt 2195 3763 Pnt 2194 3744 Pnt 2526 3742 Pnt 2535 3757 Pnt 2093 3742 Pnt 2561 3745 Pnt 2248 3739 Pnt 2962 3789 Pnt 2670 3742 Pnt 2528 3786 Pnt 2393 3744 Pnt 2734 3736 Pnt 3859 3738 Pnt 2217 3752 Pnt 2256 3751 Pnt 2078 3756 Pnt 2417 3759 Pnt 2521 3740 Pnt 1845 3793 Pnt 3541 3751 Pnt 3494 3756 Pnt 2748 3738 Pnt 3039 3748 Pnt 1896 3769 Pnt 2444 3770 Pnt 2825 3743 Pnt 2826 3749 Pnt 3457 3791 Pnt 2711 3741 Pnt 2320 3740 Pnt 2056 3750 Pnt 2390 3754 Pnt 2565 3734 Pnt 3866 3745 Pnt 2315 3749 Pnt 2664 3742 Pnt 3176 3745 Pnt 2938 3759 Pnt 2125 3786 Pnt 2317 3741 Pnt 2737 3786 Pnt 2667 3787 Pnt 3374 3758 Pnt 2778 3737 Pnt 2943 3777 Pnt 2874 3755 Pnt 2130 3756 Pnt 2646 3737 Pnt 2313 3774 Pnt 2039 3765 Pnt 2536 3747 Pnt 2388 3827 Pnt 2442 3766 Pnt 2306 3738 Pnt 1992 3763 Pnt 2978 3742 Pnt 1785 3779 Pnt 3018 3746 Pnt 2879 3744 Pnt 1933 3777 Pnt 2975 3748 Pnt 2693 3739 Pnt 2401 3737 Pnt 2028 3767 Pnt 3332 3748 Pnt 2302 3735 Pnt 2967 3742 Pnt 2660 3755 Pnt 2317 3734 Pnt 2320 3779 Pnt 2968 3778 Pnt 2924 3744 Pnt 2177 3756 Pnt 3348 3746 Pnt 3046 3735 Pnt 2146 3752 Pnt 2515 3779 Pnt 2084 3742 Pnt 2650 3762 Pnt 2319 3744 Pnt 3281 3742 Pnt 2856 3746 Pnt 2873 3742 Pnt 2605 3743 Pnt 2257 3743 Pnt 2346 3763 Pnt 2245 3748 Pnt 2513 3740 Pnt 2672 3742 Pnt 3309 3741 Pnt 3293 3745 Pnt 2646 3744 Pnt 2212 3753 Pnt 2230 3781 Pnt 3067 3742 Pnt 2916 2483 Pnt 2499 3755 Pnt 2122 3739 Pnt 2458 3743 Pnt 2780 3748 Pnt 2625 3754 Pnt 2516 3742 Pnt 2530 3737 Pnt 3056 3749 Pnt 3234 3740 Pnt 3517 3740 Pnt 2585 3737 Pnt 2297 3784 Pnt 2421 3740 Pnt 2855 3775 Pnt 2784 3785 Pnt 3030 3739 Pnt 2658 3780 Pnt 1766 3770 Pnt 3229 3775 Pnt 1884 3792 Pnt 1892 3765 Pnt 3106 2811 Pnt 2487 3779 Pnt 2779 3755 Pnt 2586 3748 Pnt 2916 3744 Pnt 2681 3739 Pnt 2424 3740 Pnt 3418 3739 Pnt 2683 3756 Pnt 2217 3777 Pnt 2452 3742 Pnt 2835 3742 Pnt 2966 3750 Pnt 2981 3740 Pnt 2929 3744 Pnt 2725 3752 Pnt 2346 3740 Pnt 2887 3737 Pnt 2266 3742 Pnt 3872 3734 Pnt 2519 3750 Pnt 2452 3751 Pnt 2571 2713 Pnt 2461 3738 Pnt 2579 3738 Pnt 3545 3749 Pnt 3510 2554 Pnt 2639 3744 Pnt 3395 3735 Pnt 2683 3749 Pnt 2327 3739 Pnt 3055 3743 Pnt 2698 3737 Pnt 2403 3750 Pnt 2666 3757 Pnt 2298 3747 Pnt 2237 3738 Pnt 2331 3751 Pnt 2417 3736 Pnt 2874 3750 Pnt 2772 3742 Pnt 2577 3742 Pnt 1914 3765 Pnt 2310 3769 Pnt 2272 3738 Pnt 2039 3789 Pnt 3010 3737 Pnt 2842 3750 Pnt 2810 3743 Pnt 2246 3746 Pnt 3313 3738 Pnt 2376 3786 Pnt 1981 3756 Pnt 2178 3750 Pnt 2225 3791 Pnt 2395 3755 Pnt 2567 3742 Pnt 2365 3734 Pnt 2333 3770 Pnt 2492 3786 Pnt 2307 3757 Pnt 3106 3743 Pnt 2015 3756 Pnt 2983 3735 Pnt 2295 3749 Pnt 2934 3827 Pnt 2526 3766 Pnt 2179 3741 Pnt 2187 3752 Pnt 2083 3758 Pnt 2999 3747 Pnt 3338 3741 Pnt 2419 3776 Pnt 2144 3758 Pnt 2021 3763 Pnt 3867 3827 Pnt 3128 3747 Pnt 2705 3779 Pnt 2228 3765 Pnt 2461 3760 Pnt 2801 3738 Pnt 1759 3776 Pnt 2292 3734 Pnt 2220 3778 Pnt 1893 3774 Pnt 2379 3756 Pnt 1934 3747 Pnt 3134 3775 Pnt 2040 3773 Pnt 2487 3774 Pnt 2919 3743 Pnt 3630 3756 Pnt 2516 3746 Pnt 1878 3776 Pnt 2065 3779 Pnt 2743 3754 Pnt 3193 3753 Pnt 3871 3746 Pnt 2983 3742 Pnt 2303 3784 Pnt 2588 3739 Pnt 2006 3765 Pnt 1978 3782 Pnt 2910 3746 Pnt 2536 3763 Pnt 2680 3760 Pnt 2544 3765 Pnt 2459 3784 Pnt 1835 3742 Pnt 2040 3778 Pnt 2768 3744 Pnt 2721 3749 Pnt 2288 3742 Pnt 3330 3748 Pnt 2294 3737 Pnt 2949 3739 Pnt 2721 3743 Pnt 2375 3755 Pnt 3258 3739 Pnt 2591 3748 Pnt 2558 3742 Pnt 3266 3739 Pnt 3104 3744 Pnt 2558 3755 Pnt 2393 3744 Pnt 2106 3739 Pnt 3937 3734 Pnt 2745 3744 Pnt 2967 3740 Pnt 2242 3760 Pnt 2183 3744 Pnt 1843 3777 Pnt 2404 3751 Pnt 2263 3744 Pnt 3070 3744 Pnt 2175 3738 Pnt 2324 3752 Pnt 2573 3744 Pnt 2753 3744 Pnt 2505 3755 Pnt 2589 3749 Pnt 2350 3743 Pnt 3711 3740 Pnt 2628 3756 Pnt 3019 3745 Pnt 1955 3768 Pnt 2333 3734 Pnt 2368 3779 Pnt 2890 3778 Pnt 2481 3766 Pnt 2976 3742 Pnt 2218 3767 Pnt 1915 3752 Pnt 1804 3774 Pnt 2554 3751 Pnt 2308 3739 Pnt 3580 3767 Pnt 2669 3734 Pnt 2389 3743 Pnt 1875 3799 Pnt 2903 3740 Pnt 2765 3748 Pnt 3145 3750 Pnt 2261 3778 Pnt 1901 3792 Pnt 3215 3800 Pnt 3110 3774 Pnt 2912 3775 Pnt 2612 3740 Pnt 2875 3768 Pnt 2399 3750 Pnt 2750 3743 Pnt 2544 3758 Pnt 2659 3749 Pnt 2336 3738 Pnt 2341 3742 Pnt 3183 3758 Pnt 2757 3755 Pnt 2772 3737 Pnt 2006 3786 Pnt 2591 3742 Pnt 3353 3744 Pnt 2867 3751 Pnt 2048 3776 Pnt 2988 3742 Pnt 2969 3748 Pnt 2875 3742 Pnt 3883 3747 Pnt 2505 3773 Pnt 2750 3743 Pnt 2645 3765 Pnt 2912 3743 Pnt 2572 3740 Pnt 2987 3770 Pnt 2944 3740 Pnt 2301 3750 Pnt 2783 3786 Pnt 2463 3747 Pnt 2534 3738 Pnt 2513 3779 Pnt 2960 3739 Pnt 2559 3779 Pnt 2144 3779 Pnt 2666 3765 Pnt 2579 3746 Pnt 2810 3737 Pnt 2396 3755 Pnt 2087 3750 Pnt 2933 3747 Pnt 2689 3760 Pnt 2735 3740 Pnt 3425 2847 Pnt 2288 3742 Pnt 2417 3791 Pnt 2106 3742 Pnt 2375 3734 Pnt 2452 3782 Pnt 2676 3734 Pnt 3678 3747 Pnt 2049 3778 Pnt 2973 3750 Pnt 2815 3742 Pnt 3042 3742 Pnt 2147 3753 Pnt 3289 3750 Pnt 2037 3739 Pnt 3032 3746 Pnt 3605 3736 Pnt 2885 3745 Pnt 2573 3757 Pnt 2447 3747 Pnt 2736 3739 Pnt 2252 3738 Pnt 3139 3745 Pnt 2405 3785 Pnt 2646 3748 Pnt 2418 3777 Pnt 3292 3742 Pnt 2334 3746 Pnt 2845 3739 Pnt 2445 3756 Pnt 1963 3763 Pnt 2254 3739 Pnt 2312 3761 Pnt 2158 3773 Pnt 1895 3765 Pnt 3026 3765 Pnt 2328 3784 Pnt 2267 3760 Pnt 2761 2707 Pnt 2120 3774 Pnt 2666 3736 Pnt 2910 3736 Pnt 2919 3744 Pnt 2783 3744 Pnt 2831 3747 Pnt 3843 3745 Pnt 2486 3738 Pnt 2245 3772 Pnt 1936 3767 Pnt 3247 2798 Pnt 2650 3754 Pnt 3337 3753 Pnt 2452 3741 Pnt 2448 3779 Pnt 2414 3778 Pnt 2392 3744 Pnt 3643 3742 Pnt 2358 3740 Pnt 3087 3736 Pnt 2307 3738 Pnt 2247 3742 Pnt 2409 3755 Pnt 2529 3741 Pnt 2647 3734 Pnt 2380 3739 Pnt 2527 3739 Pnt 3024 3760 Pnt 2382 3755 Pnt 2870 3743 Pnt 3015 3737 Pnt 2476 3738 Pnt 4002 3749 Pnt 2540 3751 Pnt 2623 3744 Pnt 2019 3781 Pnt 1878 3774 Pnt 2521 3744 Pnt 2857 3736 Pnt 2455 3756 Pnt 1763 3770 Pnt 2321 3743 Pnt 2328 3741 Pnt 2469 3757 Pnt 2517 3778 Pnt 2720 3755 Pnt 2333 3742 Pnt 2791 3744 Pnt 2778 3746 Pnt 2694 3743 Pnt 2393 3743 Pnt 2408 3749 Pnt 3374 2505 Pnt 2935 3756 Pnt 2279 3748 Pnt 2811 3738 Pnt 2313 3758 Pnt 2923 3742 Pnt 2586 3741 Pnt 3374 3742 Pnt 2899 3737 Pnt 3235 2788 Pnt 2901 3741 Pnt 2548 3751 Pnt 2233 3789 Pnt 2964 3734 Pnt 2240 3760 Pnt 2587 3753 Pnt 2659 3742 Pnt 3097 3744 Pnt 3784 3742 Pnt 2904 3741 Pnt 2515 3740 Pnt 2182 3760 Pnt 2429 3749 Pnt 1957 3749 Pnt 1823 3776 Pnt 3030 3740 Pnt 2497 3765 Pnt 3360 3739 Pnt 2332 3752 Pnt 3096 3738 Pnt 1870 3760 Pnt 2479 3788 Pnt 2688 3749 Pnt 2607 3768 Pnt 3855 2801 Pnt 3004 3747 Pnt 2782 3758 Pnt 2492 3778 Pnt 3038 3749 Pnt 2307 3827 Pnt 2447 2555 Pnt 2236 3738 Pnt 3086 3744 Pnt 3003 3750 Pnt 2693 3750 Pnt 2917 2808 Pnt 2824 3745 Pnt 2486 3746 Pnt 2512 3742 Pnt 2056 3768 Pnt 1908 3778 Pnt 2445 3739 Pnt 3052 3742 Pnt 2357 3766 Pnt 2724 3768 Pnt 3488 3762 Pnt 2692 3792 Pnt 2486 3750 Pnt 2224 3744 Pnt 2469 3746 Pnt 2605 3736 Pnt 3271 3762 Pnt 2477 3740 Pnt 2809 3777 Pnt 2165 3780 Pnt 2071 3739 Pnt 3335 3748 Pnt 2292 3755 Pnt 2704 3747 Pnt 1806 3777 Pnt 1656 3763 Pnt 3023 3755 Pnt 1842 3765 Pnt 3426 2646 Pnt 2240 3770 Pnt 2872 3748 Pnt 3497 3777 Pnt 2577 3761 Pnt 2721 3738 Pnt 2904 2500 Pnt 2242 3739 Pnt 2497 3760 Pnt 2460 3747 Pnt 2330 3742 Pnt 3686 2849 Pnt 2401 3776 Pnt 2462 3744 Pnt 3531 3747 Pnt 2547 3742 Pnt 2099 3780 Pnt 3087 3744 Pnt 2873 3743 Pnt 3169 3752 Pnt 2813 3763 Pnt 2244 3779 Pnt 2828 3744 Pnt 1860 3773 Pnt 3024 3773 Pnt 2879 3760 Pnt 2086 3778 Pnt 2454 3745 Pnt 2099 3779 Pnt 1858 3774 Pnt 1920 3767 Pnt 1926 3756 Pnt 3259 3774 Pnt 3819 2849 Pnt 3307 3756 Pnt 2279 3772 Pnt 2605 3744 Pnt 3916 3749 Pnt 2304 3740 Pnt 2407 3746 Pnt 2468 3775 Pnt 3716 3740 Pnt 2175 3781 Pnt 1847 3778 Pnt 3024 3743 Pnt 2477 3741 Pnt 2768 3734 Pnt 2790 3749 Pnt 2515 3766 Pnt 2307 3766 Pnt 2900 3755 Pnt 2645 3741 Pnt 2431 3742 Pnt 2575 3737 Pnt 2371 3737 Pnt 2411 3742 Pnt 2375 3741 Pnt 3196 3737 Pnt 2438 3766 Pnt 2656 3742 Pnt 2160 3733 Pnt 2177 3742 Pnt 2581 3737 Pnt 2959 3737 Pnt 2931 3733 Pnt 2246 3785 Pnt 1984 3803 Pnt 2602 3741 Pnt 2147 3760 Pnt 1771 3764 Pnt 3121 3748 Pnt 3127 3760 Pnt 1984 3763 Pnt 2441 3747 Pnt 3003 3753 Pnt 2451 3744 Pnt 2151 3756 Pnt 2564 3750 Pnt 2824 3749 Pnt 2668 3749 Pnt 2979 3749 Pnt 1941 3768 Pnt 2741 3778 Pnt 2489 3750 Pnt 2202 3800 Pnt 2384 3788 Pnt 2696 3788 Pnt 2262 3742 Pnt 2191 3822 Pnt 2405 3739 Pnt 4044 3751 Pnt 2619 3822 Pnt 2784 3764 Pnt 2387 3746 Pnt 2171 3761 Pnt 2473 3792 Pnt 2214 3755 Pnt 2055 3739 Pnt 3329 3790 Pnt 2704 3747 Pnt 2409 3768 Pnt 2205 3739 Pnt 3213 3762 Pnt 2760 3738 Pnt 2248 3744 Pnt 3035 3739 Pnt 3345 3781 Pnt 3630 3737 Pnt 2832 3750 Pnt 2631 3746 Pnt 3256 3740 Pnt 2415 3773 Pnt 2631 3747 Pnt 2127 3752 Pnt 2769 2479 Pnt 1995 3750 Pnt 2743 3742 Pnt 2779 3763 Pnt 2357 3780 Pnt 2156 3734 Pnt 3512 3754 Pnt 3017 3740 Pnt 2941 3747 Pnt 2351 3744 Pnt 2897 3738 Pnt 2693 3757 Pnt 2556 3737 Pnt 1966 3770 Pnt 2223 3780 Pnt 2852 3757 Pnt 2476 3777 Pnt 3467 2667 Pnt 2776 3780 Pnt 3220 3770 Pnt 2894 3734 Pnt 1771 3765 Pnt 3211 3747 Pnt 2979 3745 Pnt 2493 3766 Pnt 2678 3745 Pnt 2635 3777 Pnt 2000 3784 Pnt 2548 3766 Pnt 1840 3774 Pnt 2561 3749 Pnt 2339 3765 Pnt 2258 3736 Pnt 3288 3748 Pnt 2747 3776 Pnt 2631 3746 Pnt 3794 3744 Pnt 3181 3746 Pnt 3089 2844 Pnt 2985 3737 Pnt 3045 3744 Pnt 2635 3737 Pnt 3057 3747 Pnt 2361 3737 Pnt 2056 3781 Pnt 2299 3760 Pnt 2124 3778 Pnt 3468 3756 Pnt 2795 3737 Pnt 2558 3742 Pnt 2355 3754 Pnt 2382 3761 Pnt 2518 3737 Pnt 2041 3785 Pnt 2480 3749 Pnt 2642 3741 Pnt 1986 3822 Pnt 3084 3737 Pnt 2375 3742 Pnt 2243 3739 Pnt 2650 3763 Pnt 2190 3738 Pnt 2032 3733 Pnt 2737 3741 Pnt 2024 3775 Pnt 3537 3738 Pnt 2331 3781 Pnt 2599 3760 Pnt 2864 3740 Pnt 2100 3742 Pnt 2920 3742 Pnt 2810 3744 Pnt 2319 3736 Pnt 3096 3750 Pnt 2407 3743 Pnt 1877 3768 Pnt 2633 3741 Pnt 2848 3743 Pnt 3457 2560 Pnt 3075 3742 Pnt 2972 3744 Pnt 2365 3764 Pnt 3631 3742 Pnt 3213 3743 Pnt 2280 3741 Pnt 2339 3755 Pnt 3235 3746 Pnt 2379 3743 Pnt 2607 3743 Pnt 3159 3741 Pnt 2409 3742 Pnt 2169 3734 Pnt 2830 3743 Pnt 2986 3753 Pnt 2755 3747 Pnt 2571 3746 Pnt 3354 3757 Pnt 2447 3746 Pnt 1894 3744 Pnt 2950 3741 Pnt 1931 3739 Pnt 2928 2532 Pnt 2088 3832 Pnt 2125 3794 Pnt 1980 3749 Pnt 3621 3760 Pnt 2411 3737 Pnt 2650 3745 Pnt 2707 3741 Pnt 2325 3790 Pnt 3437 3760 Pnt 2426 3766 Pnt 2579 3739 Pnt 3013 3736 Pnt 3099 2723 Pnt 2292 3743 Pnt 2396 3755 Pnt 2904 3752 Pnt 2870 3773 Pnt 2965 3751 Pnt 2035 3803 Pnt 2124 3739 Pnt 3226 3753 Pnt 2686 3738 Pnt 2643 3743 Pnt 2461 3733 Pnt 4102 3755 Pnt 1787 3766 Pnt 3636 2651 Pnt 2680 3742 Pnt 2400 3746 Pnt 1876 3773 Pnt 2310 3778 Pnt 2419 3746 Pnt 2637 3750 Pnt 2111 3815 Pnt 2171 3739 Pnt 2228 3800 Pnt 2572 3736 Pnt 2564 3777 Pnt 2580 3757 Pnt 2324 3779 Pnt 2362 3741 Pnt 2871 3762 Pnt 2851 3746 Pnt 2036 3784 Pnt 2916 3751 Pnt 2349 3745 Pnt 2228 3760 Pnt 3424 3744 Pnt 2316 3756 Pnt 2157 3737 Pnt 3359 2692 Pnt 1850 3764 Pnt 2007 3734 Pnt 3557 3751 Pnt 3022 3746 Pnt 3166 3743 Pnt 2181 3779 Pnt 2921 3737 Pnt 1859 3781 Pnt 2629 3747 Pnt 2660 3737 Pnt 2451 3748 Pnt 2484 3737 Pnt 3108 3817 Pnt 2751 3746 Pnt 2611 3756 Pnt 2358 3760 Pnt 2676 3742 Pnt 2652 3742 Pnt 3361 3760 Pnt 2863 3737 Pnt 1914 3780 Pnt 3061 2560 Pnt 2363 3737 Pnt 2429 3770 Pnt 1918 3756 Pnt 2590 3748 Pnt 2878 3738 Pnt 2778 3742 Pnt 2344 3762 Pnt 3148 3746 Pnt 1977 3822 Pnt 3017 2452 Pnt 1938 3732 Pnt 1943 3789 Pnt 3060 3750 Pnt 2900 3740 Pnt 2807 3763 Pnt 2817 3744 Pnt 3054 3753 Pnt 2951 3749 Pnt 2831 3776 Pnt 2623 3740 Pnt 2592 3738 Pnt 2611 3749 Pnt 2561 3742 Pnt 2560 3760 Pnt 2065 3749 Pnt 2609 3746 Pnt 2805 3735 Pnt 2803 3744 Pnt 2231 3823 Pnt 2611 3760 Pnt 2242 3741 Pnt 3912 3742 Pnt 3022 3740 Pnt 1840 3776 Pnt 2900 3765 Pnt 2109 3747 Pnt 2740 3746 Pnt 2621 3740 Pnt 2320 3758 Pnt 3093 3741 Pnt 2771 3742 Pnt 2403 3738 Pnt 1890 3775 Pnt 2698 3741 Pnt 2594 3747 Pnt 3943 3743 Pnt 3432 3748 Pnt 3007 3740 Pnt 2350 3766 Pnt 2778 3741 Pnt 2763 3746 Pnt 2446 3746 Pnt 2109 3743 Pnt 2952 3787 Pnt 3611 3746 Pnt 2700 3741 Pnt 2734 3761 Pnt 1857 3774 Pnt 1977 3748 Pnt 3077 3741 Pnt 2472 3757 Pnt 2585 3743 Pnt 2380 3753 Pnt 3624 3753 Pnt 2820 3740 Pnt 2289 3741 Pnt 2953 3743 Pnt 2951 3753 Pnt 2185 3770 Pnt 2100 3764 Pnt 2909 3751 Pnt 3176 3778 Pnt 2441 3753 Pnt 3022 3744 Pnt 2650 3750 Pnt 2745 3741 Pnt 2054 3760 Pnt 2660 3753 Pnt 3072 3737 Pnt 3165 3743 Pnt 3284 3742 Pnt 3405 3744 Pnt 2905 3734 Pnt 2334 3832 Pnt 2761 3733 Pnt 2689 3742 Pnt 1960 3765 Pnt 2928 3740 Pnt 2529 3740 Pnt 2882 3743 Pnt 3742 2672 Pnt 2086 3768 Pnt 2228 3776 Pnt 3153 3742 Pnt 2133 3778 Pnt 3301 3740 Pnt 2511 3743 Pnt 2619 3754 Pnt 3257 3740 Pnt 2118 3734 Pnt 2994 3749 Pnt 2064 3782 Pnt 1965 3766 Pnt 2246 3740 Pnt 1667 3759 Pnt 2915 3739 Pnt 3218 3743 Pnt 2669 3737 Pnt 2645 3745 Pnt 3736 3742 Pnt 2636 3739 Pnt 2597 3757 Pnt 2554 3751 Pnt 2379 3746 Pnt 2471 3763 Pnt 2674 3739 Pnt 2746 3766 Pnt 2844 3742 Pnt 2323 3749 Pnt 1964 3760 Pnt 2428 3734 Pnt 2453 3741 Pnt 3166 3757 Pnt 2152 3745 Pnt 2511 3773 Pnt 2424 3737 Pnt 2079 3765 Pnt 2701 3743 Pnt 1824 3756 Pnt 2496 3737 Pnt 3054 3735 Pnt 2544 3780 Pnt 2595 3776 Pnt 1960 3766 Pnt 2885 3745 Pnt 2692 3756 Pnt 2366 3742 Pnt 3080 3751 Pnt 2662 3744 Pnt 3314 3745 Pnt 2160 3783 Pnt 2461 3736 Pnt 3179 3751 Pnt 2178 3755 Pnt 3486 3747 Pnt 3457 2479 Pnt 2235 3749 Pnt 2519 3750 Pnt 2620 3737 Pnt 3068 3737 Pnt 2412 3739 Pnt 2218 3770 Pnt 3026 3742 Pnt 3599 3744 Pnt 2755 3737 Pnt 2820 2613 Pnt 2463 3756 Pnt 1806 3773 Pnt 2551 3742 Pnt 3399 2778 Pnt 2708 3790 Pnt 3554 3747 Pnt 2899 3784 Pnt 2430 3736 Pnt 2756 3778 Pnt 2173 3775 Pnt 2174 3746 Pnt 2769 3747 Pnt 3275 3743 Pnt 2663 3794 Pnt 2570 3748 Pnt 2644 3746 Pnt 3962 3755 Pnt 1939 3756 Pnt 3140 3786 Pnt 3333 3734 Pnt 3742 3740 Pnt 2062 3803 Pnt 2678 3752 Pnt 3181 3739 Pnt 2581 3740 Pnt 2654 3746 Pnt 2091 3778 Pnt 2075 3779 Pnt 2372 3738 Pnt 2202 3800 Pnt 2598 3756 Pnt 3221 3778 Pnt 3090 3738 Pnt 2107 3822 Pnt 1991 3737 Pnt 2064 3779 Pnt 3352 3742 Pnt 2569 3758 Pnt 3085 3739 Pnt 3038 3738 Pnt 2022 3815 Pnt 1813 3789 Pnt 2556 3756 Pnt 1947 3777 Pnt 2828 3762 Pnt 2029 3760 Pnt 2530 3737 Pnt 2267 3741 Pnt 2677 3750 Pnt 2643 3751 Pnt 3376 3762 Pnt 2917 3746 Pnt 2814 3763 Pnt 2280 3737 Pnt 2609 3767 Pnt 2832 3740 Pnt 2711 3735 Pnt 2703 3780 Pnt 2098 3798 Pnt 3982 3740 Pnt 2573 3742 Pnt 3208 3738 Pnt 2797 3748 Pnt 2973 3752 Pnt 2986 3737 Pnt 3992 3758 Pnt 2074 3766 Pnt 1956 3817 Pnt 3183 3765 Pnt 2420 3737 Pnt 2833 3747 Pnt 3501 3765 Pnt 3748 3752 Pnt 3440 3749 Pnt 2815 3742 Pnt 3191 2538 Pnt 2290 3760 Pnt 2545 3740 Pnt 2461 3737 Pnt 3092 3740 Pnt 2743 3737 Pnt 3408 3737 Pnt 2384 3742 Pnt 2359 3748 Pnt 2621 3741 Pnt 1688 3774 Pnt 2679 3754 Pnt 2490 3757 Pnt 3597 3741 Pnt 2585 3748 Pnt 2917 3738 Pnt 3235 3737 Pnt 2830 3739 Pnt 3065 3748 Pnt 3420 3741 Pnt 2340 3743 Pnt 2838 3776 Pnt 2595 3753 Pnt 2254 3764 Pnt 2618 3740 Pnt 2965 3744 Pnt 3058 3753 Pnt 3153 3746 Pnt 2888 3740 Pnt 2481 3750 Pnt 2021 3782 Pnt 3090 3749 Pnt 2912 3750 Pnt 2633 3743 Pnt 2710 3744 Pnt 2293 3739 Pnt 1797 3759 Pnt 2236 3759 Pnt 3547 2866 Pnt 2756 3811 Pnt 2575 3739 Pnt 2414 3823 Pnt 2900 3751 Pnt 1857 3760 Pnt 2703 3785 Pnt 2723 3739 Pnt 2673 3760 Pnt 2489 3733 Pnt 3792 3742 Pnt 2495 3740 Pnt 2234 3761 Pnt 3173 3749 Pnt 2435 3752 Pnt 1818 3760 Pnt 3264 2978 Pnt 2817 3743 Pnt 3218 3739 Pnt 2623 3761 Pnt 2372 3753 Pnt 2322 3740 Pnt 2930 3753 Pnt 2480 3743 Pnt 2342 3735 Pnt 2742 3753 Pnt 2274 3776 Pnt 2597 3745 Pnt 1802 3756 Pnt 2770 3753 Pnt 2526 3783 Pnt 2506 3751 Pnt 2485 3734 Pnt 2508 3737 Pnt 3640 3751 Pnt 2280 3743 Pnt 2181 3832 Pnt 2319 3749 Pnt 2280 3740 Pnt 2308 2738 Pnt 3654 2569 Pnt 2443 3742 Pnt 2583 3742 Pnt 2648 3757 Pnt 2166 3779 Pnt 3047 3744 Pnt 2434 3780 Pnt 3179 2595 Pnt 3580 3747 Pnt 2559 3739 Pnt 3054 3780 Pnt 3084 3740 Pnt 2656 3777 Pnt 3253 3735 Pnt 2590 3778 Pnt 3254 3773 Pnt 2694 3781 Pnt 2715 3777 Pnt 2515 3774 Pnt 2389 3739 Pnt 3258 3781 Pnt 2082 3766 Pnt 3182 3746 Pnt 2428 3747 Pnt 2880 3747 Pnt 2166 3742 Pnt 3098 3745 Pnt 3523 3745 Pnt 3126 3745 Pnt 2358 3746 Pnt 2616 3756 Pnt 2855 2781 Pnt 1929 3766 Pnt 2721 3790 Pnt 3485 3745 Pnt 3410 3749 Pnt 2698 3744 Pnt 2617 3745 Pnt 2190 3742 Pnt 2618 3747 Pnt 1999 3740 Pnt 2490 3784 Pnt 2415 3746 Pnt 2429 3770 Pnt 3869 3744 Pnt 2688 3753 Pnt 2797 3753 Pnt 3321 3749 Pnt 2598 3739 Pnt 2045 3779 Pnt 2584 3766 Pnt 2973 3734 Pnt 2384 3742 Pnt 3190 3782 Pnt 2865 3742 Pnt 2371 3743 Pnt 3689 3765 Pnt 2673 3737 Pnt 3407 3742 Pnt 2326 3778 Pnt 2417 3749 Pnt 2481 3741 Pnt 2304 3758 Pnt 2970 3757 Pnt 2890 3743 Pnt 2217 3794 Pnt 2058 3760 Pnt 3750 3745 Pnt 2683 3739 Pnt 3316 2674 Pnt 2746 3739 Pnt 2889 3746 Pnt 2593 3755 Pnt 2702 3746 Pnt 2394 3753 Pnt 2236 3778 Pnt 2917 3756 Pnt 2602 3735 Pnt 3018 3740 Pnt 2770 3780 Pnt 1888 3764 Pnt 2787 3739 Pnt 2398 3803 Pnt 2911 3751 Pnt 2095 3800 Pnt 2404 3748 Pnt 2271 3815 Pnt 2514 3770 Pnt 2399 3743 Pnt 2797 3742 Pnt 2472 3740 Pnt 2603 3756 Pnt 2604 3798 Pnt 3048 3743 Pnt 3111 3756 Pnt 2587 3750 Pnt 4210 3803 Pnt 2675 3752 Pnt 2317 3786 Pnt 2418 3750 Pnt 2468 3742 Pnt 2238 3811 Pnt 2552 3751 Pnt 2446 3737 Pnt 2385 3804 Pnt 2335 3752 Pnt 2379 3779 Pnt 2180 3767 Pnt 3072 3780 Pnt 3169 3746 Pnt 2138 3762 Pnt 3323 3740 Pnt 3259 3801 Pnt 3092 3749 Pnt 2141 3764 Pnt 1868 3815 Pnt 2387 3742 Pnt 3605 3744 Pnt 2657 3741 Pnt 3278 3752 Pnt 2014 3782 Pnt 3145 3732 Pnt 2671 3750 Pnt 3371 3747 Pnt 2094 3822 Pnt 2270 3750 Pnt 2830 3736 Pnt 2860 3744 Pnt 2444 3744 Pnt 2476 3765 Pnt 3321 3751 Pnt 3056 3740 Pnt 2421 3744 Pnt 2888 3737 Pnt 2820 3738 Pnt 2246 3735 Pnt 3197 3744 Pnt 2185 3777 Pnt 2658 3801 Pnt 2939 3749 Pnt 2585 3735 Pnt 2094 3761 Pnt 2303 3749 Pnt 3585 3761 Pnt 2338 3742 Pnt 1920 3759 Pnt 2554 3778 Pnt 2988 3737 Pnt 2423 3759 Pnt 2304 3740 Pnt 2939 3737 Pnt 2747 3759 Pnt 3075 3742 Pnt 3125 2567 Pnt 1954 3765 Pnt 3217 3744 Pnt 2715 3737 Pnt 2768 3744 Pnt 3122 3774 Pnt 3504 3737 Pnt 2711 3766 Pnt 2772 3754 Pnt 2613 3774 Pnt 3019 3739 Pnt 4085 3757 Pnt 2507 3743 Pnt 2356 3776 Pnt 2746 3780 Pnt 2631 3740 Pnt 3774 3745 Pnt 2694 3751 Pnt 2579 3734 Pnt 2130 3783 Pnt 2548 3740 Pnt 3534 2930 Pnt 2264 3740 Pnt 2240 3738 Pnt 2241 3753 Pnt 2968 2699 Pnt 3034 2734 Pnt 3617 3749 Pnt 3063 3737 Pnt 2685 3753 Pnt 2603 3777 Pnt 2758 3741 Pnt 2356 3739 Pnt 3740 3738 Pnt 2663 3740 Pnt 2426 3734 Pnt 3382 3780 Pnt 2173 2680 Pnt 1990 3781 Pnt 3635 3755 Pnt 2344 3770 Pnt 2433 3737 Pnt 2187 3781 Pnt 2201 3750 Pnt 2808 3768 Pnt 2241 3739 Pnt 2590 3777 Pnt 2844 3749 Pnt 2011 3766 Pnt 3834 3746 Pnt 2667 3743 Pnt 2240 3774 Pnt 3133 3751 Pnt 3105 3753 Pnt 2993 3735 Pnt 2147 3776 Pnt 3552 3746 Pnt 3230 3744 Pnt 2921 3753 Pnt 2827 3834 Pnt 2748 3742 Pnt 2454 3751 Pnt 2348 3753 Pnt 3776 3743 Pnt 2794 3738 Pnt 2701 3757 Pnt 3175 3742 Pnt 2908 3743 Pnt 2466 3740 Pnt 3447 3784 Pnt 2165 3735 Pnt 3132 2554 Pnt 2324 3783 Pnt 2298 3742 Pnt 3100 3779 Pnt 4133 3755 Pnt 3942 2978 Pnt 2502 3747 Pnt 2429 3746 Pnt 2077 3759 Pnt 2784 3745 Pnt 2064 3778 Pnt 4355 3778 Pnt 3527 2761 Pnt 3188 3761 Pnt 2589 3749 Pnt 2415 2751 Pnt 2934 3767 Pnt 2238 3749 Pnt 2975 3766 Pnt 3095 3735 Pnt 1974 3776 Pnt 3402 3792 Pnt 2845 3766 Pnt 2360 3743 Pnt 3430 3749 Pnt 2805 3752 Pnt 2475 3749 Pnt 3034 3745 Pnt 3102 3791 Pnt 2856 2769 Pnt 2546 3746 Pnt 3005 3745 Pnt 2125 3733 Pnt 2696 3740 Pnt 2673 3739 Pnt 2916 2544 Pnt 2414 3749 Pnt 2731 3745 Pnt 2829 3741 Pnt 2223 3788 Pnt 3012 3748 Pnt 2863 3757 Pnt 2500 3750 Pnt 3336 3746 Pnt 2679 3742 Pnt 2837 3740 Pnt 2585 3737 Pnt 2901 3741 Pnt 2485 3757 Pnt 2741 3766 Pnt 3072 2619 Pnt 2471 3750 Pnt 3938 2754 Pnt 2001 3757 Pnt 2843 2806 Pnt 2716 3771 Pnt 1783 3765 Pnt 3038 3768 Pnt 2787 3745 Pnt 2196 3742 Pnt 2218 3742 Pnt 2661 3738 Pnt 2497 3778 Pnt 2863 3739 Pnt 2252 3780 Pnt 2605 3741 Pnt 3415 3753 Pnt 2883 3740 Pnt 3661 3744 Pnt 3051 3742 Pnt 3164 3780 Pnt 2701 3743 Pnt 2505 3748 Pnt 3132 3742 Pnt 2708 3788 Pnt 3350 3749 Pnt 2344 3750 Pnt 2148 3781 Pnt 2618 3748 Pnt 2703 3770 Pnt 2125 3751 Pnt 2692 3794 Pnt 2640 3742 Pnt 2610 3755 Pnt 2374 3756 Pnt 2999 3744 Pnt 2394 3740 Pnt 2276 3760 Pnt 2810 3736 Pnt 2667 3756 Pnt 2200 3768 Pnt 2891 3760 Pnt 2956 2662 Pnt 2192 3748 Pnt 2515 3753 Pnt 3331 3749 Pnt 2816 3749 Pnt 2153 3811 Pnt 1964 3801 Pnt 3892 3749 Pnt 2817 3740 Pnt 3100 3751 Pnt 2327 3731 Pnt 3556 3757 Pnt 1907 3804 Pnt 3502 2696 Pnt 2709 3739 Pnt 3294 3740 Pnt 2704 3749 Pnt 3090 3756 Pnt 2993 3749 Pnt 2208 3777 Pnt 3000 3755 Pnt 2954 3754 Pnt 2480 3752 Pnt 3091 3752 Pnt 2512 3779 Pnt 2873 3757 Pnt 2689 3744 Pnt 2349 3768 Pnt 2183 3767 Pnt 3935 3754 Pnt 2953 3742 Pnt 2403 3739 Pnt 2258 3761 Pnt 2246 3746 Pnt 2183 3735 Pnt 2500 3740 Pnt 2820 3738 Pnt 2320 3748 Pnt 4023 3749 Pnt 2093 3752 Pnt 2334 3801 Pnt 2865 3740 Pnt 2705 3747 Pnt 2625 3739 Pnt 2199 3748 Pnt 2881 3740 Pnt 2803 3753 Pnt 2817 2703 Pnt 2631 3751 Pnt 2751 3734 Pnt 3455 3798 Pnt 2026 3800 Pnt 2473 3814 Pnt 2775 2494 Pnt 2110 3803 Pnt 2518 3826 Pnt 2426 3750 Pnt 4089 3755 Pnt 3277 3731 Pnt 2962 3739 Pnt 2380 3770 Pnt 1870 3758 Pnt 2367 3758 Pnt 4011 2658 Pnt 2339 3738 Pnt 3214 3762 Pnt 2982 3770 Pnt 2756 3741 Pnt 2817 3737 Pnt 3111 3747 Pnt 3168 3737 Pnt 2455 3754 Pnt 3019 3753 Pnt 2544 3751 Pnt 2312 3743 Pnt 2241 3759 Pnt 3083 3753 Pnt 2353 3822 Pnt 2206 3776 Pnt 1926 3815 Pnt 2632 3778 Pnt 3615 3751 Pnt 3115 3782 Pnt 2938 3741 Pnt 2715 3752 Pnt 2755 3738 Pnt 2434 3766 Pnt 3237 3744 Pnt 2768 3742 Pnt 3455 2565 Pnt 3233 3742 Pnt 3058 3744 Pnt 3543 3745 Pnt 3137 3744 Pnt 2830 3745 Pnt 3409 2571 Pnt 2465 3746 Pnt 2703 3737 Pnt 2835 3749 Pnt 3552 3746 Pnt 2840 3738 Pnt 2533 3767 Pnt 2575 3769 Pnt 2135 3780 Pnt 3029 3752 Pnt 2768 2504 Pnt 2769 3742 Pnt 2350 3743 Pnt 2303 3748 Pnt 3328 3752 Pnt 2389 3743 Pnt 2473 3752 Pnt 2821 3735 Pnt 1805 3776 Pnt 2174 3786 Pnt 2954 3741 Pnt 2500 3735 Pnt 2087 3776 Pnt 2583 3783 Pnt 2482 3786 Pnt 2135 3783 Pnt 2730 3739 Pnt 1996 3822 Pnt 3149 3746 Pnt 3342 3766 Pnt 2287 3734 Pnt 2694 3749 Pnt 2934 3750 Pnt 2573 3740 Pnt 2641 3736 Pnt 3003 3738 Pnt 2848 3743 Pnt 3977 3734 Pnt 2215 3749 Pnt 3380 3744 Pnt 2854 3736 Pnt 2400 3740 Pnt 3297 3761 Pnt 2436 3781 Pnt 2509 3736 Pnt 2670 3739 Pnt 2986 3738 Pnt 2409 3752 Pnt 2620 3746 Pnt 2567 3743 Pnt 2562 3767 Pnt 2888 3740 Pnt 3263 3746 Pnt 1809 3759 Pnt 2743 3740 Pnt 2789 3751 Pnt 3169 3736 Pnt 2612 3745 Pnt 2765 3748 Pnt 2707 3737 Pnt 3822 3742 Pnt 2112 3794 Pnt 2298 3737 Pnt 2528 3743 Pnt 2249 3781 Pnt 3352 3751 Pnt 3055 2504 Pnt 2748 3742 Pnt 2607 3738 Pnt 2774 3739 Pnt 1886 3763 Pnt 2662 2804 Pnt 3182 3754 Pnt 2711 3774 Pnt 3534 3761 Pnt 3044 3743 Pnt 2668 3747 Pnt 2939 3738 Pnt 2566 3742 Pnt 2938 3761 Pnt 2869 3737 Pnt 2671 3742 Pnt 2445 3749 Pnt 2676 3742 Pnt 2395 3766 Pnt 2410 3752 Pnt 2141 3788 Pnt 2264 3780 Pnt 2971 3748 Pnt 2400 3782 Pnt 3705 3751 Pnt 2695 3749 Pnt 2915 3801 Pnt 2961 3782 Pnt 2926 3750 Pnt 2806 3742 Pnt 2396 3751 Pnt 3494 3750 Pnt 2907 3744 Pnt 2779 3738 Pnt 3442 3738 Pnt 3000 3750 Pnt 2582 3777 Pnt 2744 3760 Pnt 3169 3746 Pnt 3353 3737 Pnt 2828 3757 Pnt 2584 3744 Pnt 2666 3738 Pnt 2710 3749 Pnt 3290 3738 Pnt 2414 3741 Pnt 3983 3741 Pnt 2810 3803 Pnt 2253 3802 Pnt 2350 3738 Pnt 2690 3739 Pnt 2309 3768 Pnt 2901 3834 Pnt 3599 3742 Pnt 2590 3739 Pnt 2340 3777 Pnt 3121 2412 Pnt 2072 3762 Pnt 2643 3735 Pnt 2997 3745 Pnt 2470 3742 Pnt 2362 3774 Pnt 3054 3778 Pnt 2391 3823 Pnt 2524 3756 Pnt 2876 3750 Pnt 2929 3736 Pnt 2833 3740 Pnt 2593 3748 Pnt 3602 2721 Pnt 2823 3742 Pnt 3135 3736 Pnt 1782 3794 Pnt 2565 3768 Pnt 2531 3762 Pnt 2665 3752 Pnt 3143 3753 Pnt 2412 3747 Pnt 2297 3758 Pnt 3050 3744 Pnt 2451 3738 Pnt 2646 3771 Pnt 2360 3747 Pnt 2563 3780 Pnt 2726 3775 Pnt 3150 3780 Pnt 2555 3740 Pnt 3199 3770 Pnt 2118 3778 Pnt 2684 3757 Pnt 2074 3735 Pnt 3011 3748 Pnt 2567 3767 Pnt 4046 2699 Pnt 2771 3740 Pnt 3950 3747 Pnt 2463 3768 Pnt 2933 3742 Pnt 2406 3749 Pnt 3504 3743 Pnt 3483 3742 Pnt 2809 3756 Pnt 3078 3737 Pnt 2091 3743 Pnt 2865 3741 Pnt 2622 3743 Pnt 2848 3750 Pnt 3239 2612 Pnt 2395 3748 Pnt 2472 3788 Pnt 3374 3751 Pnt 1897 3765 Pnt 2657 3749 Pnt 2554 3762 Pnt 2770 3743 Pnt 2340 3738 Pnt 2858 3762 Pnt 4062 3751 Pnt 3410 3748 Pnt 2117 3811 Pnt 2375 3752 Pnt 2924 3749 Pnt 3411 3741 Pnt 2791 3747 Pnt 2632 3762 Pnt 2308 3778 Pnt 2375 3745 Pnt 2721 3749 Pnt 2604 3801 Pnt 2017 3748 Pnt 2646 3737 Pnt 2564 3739 Pnt 1861 3803 Pnt 2866 3748 Pnt 3167 3742 Pnt 2163 3801 Pnt 3058 3752 Pnt 2737 3734 Pnt 2665 3743 Pnt 2142 3773 Pnt 2503 3743 Pnt 2528 3751 Pnt 2620 3801 Pnt 2795 3749 Pnt 2993 3739 Pnt 2328 3781 Pnt 3281 3747 Pnt 2905 3766 Pnt 2705 3738 Pnt 3485 3752 Pnt 2251 3765 Pnt 3238 3766 Pnt 2812 3758 Pnt 3552 3766 Pnt 3173 3745 Pnt 2952 3782 Pnt 2566 3756 Pnt 3101 3749 Pnt 2659 3739 Pnt 2735 3743 Pnt 1955 3815 Pnt 2185 3768 Pnt 2368 3740 Pnt 2792 3758 Pnt 2646 3749 Pnt 2969 3741 Pnt 2572 3746 Pnt 2586 3737 Pnt 3351 3780 Pnt 2764 3749 Pnt 3701 3741 Pnt 2390 3747 Pnt 3649 3744 Pnt 2790 3738 Pnt 3439 2606 Pnt 2866 3756 Pnt 2669 3739 Pnt 3857 3746 Pnt 2746 3791 Pnt 2710 3751 Pnt 2567 3753 Pnt 2480 3743 Pnt 2745 3798 Pnt 2923 3755 Pnt 2308 3767 Pnt 2886 3744 Pnt 2506 3734 Pnt 2381 3769 Pnt 2615 3798 Pnt 2186 3814 Pnt 2401 3746 Pnt 3012 3739 Pnt 2091 3742 Pnt 2481 3750 Pnt 2440 3738 Pnt 2186 3755 Pnt 2533 3742 Pnt 3469 3755 Pnt 2480 3742 Pnt 2817 3740 Pnt 2959 3750 Pnt 3373 3741 Pnt 2594 3781 Pnt 2767 3744 Pnt 2070 3760 Pnt 2257 3752 Pnt 2759 3742 Pnt 3415 3741 Pnt 2589 3761 Pnt 3081 3754 Pnt 2657 3753 Pnt 2740 3738 Pnt 2168 3781 Pnt 2944 3746 Pnt 1912 3788 Pnt 3691 3753 Pnt 2093 3759 Pnt 2802 3764 Pnt 2695 3766 Pnt 2546 3743 Pnt 2986 3755 Pnt 2245 3780 Pnt 2939 3745 Pnt 3240 3744 Pnt 2286 3774 Pnt 2574 3822 Pnt 3534 3745 Pnt 2204 3767 Pnt 3082 3749 Pnt 2492 3761 Pnt 3405 3744 Pnt 2234 3741 Pnt 1953 3760 Pnt 2692 3740 Pnt 2533 3742 Pnt 3113 3747 Pnt 2974 3752 Pnt 2873 3743 Pnt 3131 3742 Pnt 3018 3734 Pnt 2657 3780 Pnt 2633 3750 Pnt 2931 3738 Pnt 2923 3744 Pnt 2972 3747 Pnt 3053 3753 Pnt 2687 3782 Pnt 3065 3800 Pnt 2122 3794 Pnt 2720 3740 Pnt 3338 3744 Pnt 3209 3782 Pnt 4163 2627 Pnt 2785 3749 Pnt 2269 3745 Pnt 2769 3731 Pnt 3457 3748 Pnt 2505 3743 Pnt 1947 3780 Pnt 2239 3780 Pnt 3522 3760 Pnt 2149 3807 Pnt 3213 3743 Pnt 2527 3753 Pnt 2895 3751 Pnt 2161 3758 Pnt 2384 3786 Pnt 3936 3753 Pnt 3054 3758 Pnt 1881 3780 Pnt 2929 3743 Pnt 3079 2836 Pnt 1835 3739 Pnt 2666 3737 Pnt 2624 3783 Pnt 3067 3746 Pnt 2630 3742 Pnt 2363 3762 Pnt 2212 3747 Pnt 3406 3750 Pnt 2458 3786 Pnt 2415 3823 Pnt 2651 3751 Pnt 3015 3800 Pnt 2972 2477 Pnt 2805 3742 Pnt 2642 3745 Pnt 2228 3822 Pnt 2692 3756 Pnt 3057 3746 Pnt 3286 3750 Pnt 3875 3760 Pnt 2601 3751 Pnt 2997 3761 Pnt 2854 3740 Pnt 2871 3748 Pnt 2688 3761 Pnt 3325 3748 Pnt 3024 3753 Pnt 2510 3750 Pnt 3122 3768 Pnt 3007 3775 Pnt 2750 3732 Pnt 2679 3740 Pnt 2793 3747 Pnt 3455 3776 Pnt 2321 3778 Pnt 1956 3793 Pnt 2402 3738 Pnt 2969 3771 Pnt 2710 3776 Pnt 3477 3743 Pnt 2720 3739 Pnt 2429 3745 Pnt 2156 3746 Pnt 2775 3738 Pnt 2785 3735 Pnt 2394 3768 Pnt 2502 3749 Pnt 3344 3742 Pnt 2446 3762 Pnt 2682 3751 Pnt 2635 3745 Pnt 2321 3764 Pnt 2657 3750 Pnt 3049 3735 Pnt 2193 3766 Pnt 2829 3753 Pnt 2699 3752 Pnt 3789 3741 Pnt 3201 3736 Pnt 2680 3774 Pnt 3110 3738 Pnt 2972 3744 Pnt 2652 3757 Pnt 2206 3797 Pnt 3358 3739 Pnt 2418 3738 Pnt 1986 3788 Pnt 2864 3745 Pnt 2643 3747 Pnt 2490 3788 Pnt 2429 3748 Pnt 2874 3741 Pnt 2555 3764 Pnt 2506 3762 Pnt 2349 3748 Pnt 3022 3749 Pnt 2951 3737 Pnt 1804 3758 Pnt 2876 2857 Pnt 2964 3762 Pnt 2001 3742 Pnt 2250 3770 Pnt 2628 3770 Pnt 2527 3739 Pnt 2017 3791 Pnt 3222 3738 Pnt 2077 3801 Pnt 2567 3740 Pnt 2868 3774 Pnt 2679 2578 Pnt 2378 3738 Pnt 2502 3752 Pnt 2682 3751 Pnt 2185 3778 Pnt 2465 3738 Pnt 2348 3744 Pnt 2449 3763 Pnt 2853 3743 Pnt 2569 3754 Pnt 2627 3767 Pnt 2415 3741 Pnt 3250 3743 Pnt 2772 3753 Pnt 3215 3757 Pnt 2047 3798 Pnt 2832 3752 Pnt 3340 3754 Pnt 4034 3753 Pnt 2454 3781 Pnt 3337 2627 Pnt 2369 3741 Pnt 2602 3735 Pnt 2303 3758 Pnt 3118 3800 Pnt 2328 3801 Pnt 2711 3746 Pnt 2620 3739 Pnt 2821 3745 Pnt 2093 3737 Pnt 3647 3746 Pnt 2513 3749 Pnt 3166 3745 Pnt 3002 3754 Pnt 2362 3735 Pnt 2656 3744 Pnt 2648 3758 Pnt 2219 3751 Pnt 3239 3740 Pnt 2468 3738 Pnt 3014 3742 Pnt 3264 3738 Pnt 3067 3748 Pnt 2216 3769 Pnt 3319 3747 Pnt 2434 3757 Pnt 2565 3739 Pnt 2929 3741 Pnt 2575 3754 Pnt 1993 3802 Pnt 2407 3764 Pnt 3205 3757 Pnt 2453 3768 Pnt 2298 3742 Pnt 2798 2587 Pnt 2418 3750 Pnt 3480 2725 Pnt 2327 3765 Pnt 3495 3768 Pnt 2882 3781 Pnt 2884 3751 Pnt 2496 3750 Pnt 2054 3768 Pnt 2347 3748 Pnt 2750 3757 Pnt 2815 3746 Pnt 2585 3738 Pnt 3093 3745 Pnt 2099 3817 Pnt 3748 3742 Pnt 2091 3780 Pnt 2509 3747 Pnt 2754 3755 Pnt 2474 3742 Pnt 2044 3822 Pnt 2605 3766 Pnt 3614 3780 Pnt 2679 3757 Pnt 2305 3749 Pnt 2446 3750 Pnt 2084 3768 Pnt 2786 3767 Pnt 2697 3761 Pnt 2192 3763 Pnt 3416 3743 Pnt 2639 3747 Pnt 3009 3757 Pnt 3484 3748 Pnt 3063 3755 Pnt 2968 3749 Pnt 2213 3741 Pnt 2046 3741 Pnt 2120 3755 Pnt 3011 3747 Pnt 2550 3753 Pnt 3417 3746 Pnt 2724 3740 Pnt 3279 3744 Pnt 2926 3743 Pnt 2854 3750 Pnt 2274 3743 Pnt 2654 3746 Pnt 2495 3749 Pnt 2882 3739 Pnt 2501 3755 Pnt 2789 3740 Pnt 2339 3743 Pnt 2261 3738 Pnt 3003 3774 Pnt 1800 3746 Pnt 3224 3771 Pnt 2533 3742 Pnt 2355 3752 Pnt 3182 3743 Pnt 2167 3780 Pnt 3185 3731 Pnt 2929 3766 Pnt 1981 3794 Pnt 2940 3736 Pnt 3432 2227 Pnt 2686 3781 Pnt 2457 3801 Pnt 2497 3778 Pnt 2459 3745 Pnt 3094 3807 Pnt 2616 3742 Pnt 2753 3747 Pnt 2864 3751 Pnt 2336 3750 Pnt 2994 3746 Pnt 3435 3750 Pnt 2623 3762 Pnt 2015 3758 Pnt 3034 3745 Pnt 3857 3750 Pnt 2780 3739 Pnt 2839 3780 Pnt 3440 2674 Pnt 2598 3743 Pnt 3166 3783 Pnt 2673 3748 Pnt 2609 3780 Pnt 3985 3737 Pnt 2764 3739 Pnt 2010 3778 Pnt 1863 3811 Pnt 3077 3739 Pnt 2786 3753 Pnt 3048 3744 Pnt 2228 3737 Pnt 2752 3739 Pnt 2830 3743 Pnt 1950 3780 Pnt 2684 3739 Pnt 3313 3739 Pnt 2710 3806 Pnt 2764 3735 Pnt 2106 3783 Pnt 2563 3745 Pnt 3297 3741 Pnt 3029 3750 Pnt 3214 3757 Pnt 2989 3746 Pnt 2611 3750 Pnt 3024 3750 Pnt 3048 3737 Pnt 2820 3743 Pnt 2418 3791 Pnt 3251 3738 Pnt 2566 3746 Pnt 2748 3749 Pnt 2584 3739 Pnt 2684 3793 Pnt 1866 3822 Pnt 2881 3749 Pnt 2654 3739 Pnt 2565 3756 Pnt 2934 3740 Pnt 2760 3817 Pnt 3043 3750 Pnt 2594 3754 Pnt 3399 3755 Pnt 2488 3750 Pnt 3020 2611 Pnt 2960 2747 Pnt 2773 3739 Pnt 3092 3750 Pnt 3143 3744 Pnt 2890 3740 Pnt 2583 3740 Pnt 3275 3744 Pnt 2672 3800 Pnt 2647 3769 Pnt 3001 3740 Pnt 2320 3742 Pnt 3891 2542 Pnt 4443 3755 Pnt 1955 3751 Pnt 2565 3753 Pnt 2886 3734 Pnt 2242 3753 Pnt 3530 3761 Pnt 2533 3781 Pnt 2727 3741 Pnt 2497 3761 Pnt 3468 3752 Pnt 3014 3739 Pnt 3276 3740 Pnt 2573 3738 Pnt 3945 3750 Pnt 3034 3742 Pnt 2809 3743 Pnt 2406 3741 Pnt 2458 3776 Pnt 2594 3745 Pnt 2556 3746 Pnt 3092 3771 Pnt 2828 3768 Pnt 3535 3753 Pnt 3015 3738 Pnt 3164 3746 Pnt 3609 3740 Pnt 3051 2712 Pnt 2595 3738 Pnt 4020 3759 Pnt 2739 2760 Pnt 3156 3742 Pnt 2544 3776 Pnt 2323 3770 Pnt 2043 3780 Pnt 2121 3800 Pnt 3073 3753 Pnt 2337 3762 Pnt 2783 3760 Pnt 2602 3739 Pnt 2050 3791 Pnt 2787 3749 Pnt 3589 3743 Pnt 2348 3749 Pnt 2876 3752 Pnt 2317 3774 Pnt 2504 3740 Pnt 2472 3762 Pnt 2881 3756 Pnt 2752 3750 Pnt 3006 3762 Pnt 2940 3757 Pnt 2978 3780 Pnt 3443 3777 Pnt 2825 3742 Pnt 3100 3747 Pnt 2302 3800 Pnt 3144 3757 Pnt 2821 3744 Pnt 2962 3749 Pnt 2833 3751 Pnt 2071 3763 Pnt 2817 3753 Pnt 2893 3779 Pnt 2912 3743 Pnt 2407 3801 Pnt 2764 3782 Pnt 2678 3767 Pnt 2305 3737 Pnt 2956 3738 Pnt 2664 3797 Pnt 2989 3766 Pnt 3884 2658 Pnt 3395 3734 Pnt 3081 3743 Pnt 2819 3745 Pnt 2780 3739 Pnt 3170 3750 Pnt 2487 3768 Pnt 2669 3735 Pnt 3342 3752 Pnt 3642 3737 Pnt 2852 3745 Pnt 2891 3757 Pnt 3206 3739 Pnt 2931 3768 Pnt 2771 3738 Pnt 3260 3832 Pnt 3082 3786 Pnt 2951 3757 Pnt 2887 3744 Pnt 2782 3740 Pnt 2665 3746 Pnt 3553 3742 Pnt 2331 3753 Pnt 3122 3747 Pnt 3464 3750 Pnt 2947 3736 Pnt 3083 3738 Pnt 2962 3753 Pnt 2549 3782 Pnt 2493 3751 Pnt 2263 3757 Pnt 2989 3743 Pnt 2689 3748 Pnt 3523 3748 Pnt 2817 3757 Pnt 3632 2611 Pnt 3325 3757 Pnt 2815 3768 Pnt 2652 3738 Pnt 3187 3757 Pnt 2109 3741 Pnt 3174 3763 Pnt 2734 3739 Pnt 2867 3741 Pnt 2593 3744 Pnt 1829 3751 Pnt 2490 3746 Pnt 3058 3745 Pnt 2411 3763 Pnt 2664 3744 Pnt 2589 3785 Pnt 2677 3745 Pnt 2215 3788 Pnt 2552 3746 Pnt 2888 3763 Pnt 2057 3780 Pnt 2751 3750 Pnt 2498 3747 Pnt 3037 3764 Pnt 2857 3755 Pnt 2595 3746 Pnt 1992 3802 Pnt 3241 3746 Pnt 2469 3747 Pnt 2560 3739 Pnt 2253 3766 Pnt 3033 3815 Pnt 2409 3763 Pnt 2801 3757 Pnt 3025 3743 Pnt 2398 3778 Pnt 2244 3771 Pnt 2264 3735 Pnt 2840 3749 Pnt 1961 3793 Pnt 2453 3739 Pnt 2032 3758 Pnt 2434 3768 Pnt 2460 3761 Pnt 2641 3738 Pnt 2424 3750 Pnt 2397 3744 Pnt 2772 3739 Pnt 2440 3750 Pnt 4098 3739 Pnt 2545 3766 Pnt 3477 3751 Pnt 3279 3771 Pnt 2729 3744 Pnt 3006 3744 Pnt 2484 3767 Pnt 2075 3780 Pnt 2807 3771 Pnt 2521 3738 Pnt 2470 3751 Pnt 2863 3750 Pnt 2865 3780 Pnt 2075 3741 Pnt 2761 2676 Pnt 3377 3752 Pnt 2521 3737 Pnt 2817 3743 Pnt 2522 3743 Pnt 2894 2813 Pnt 2201 3755 Pnt 2276 3807 Pnt 2323 3741 Pnt 2640 3740 Pnt 2333 3781 Pnt 3590 3807 Pnt 2385 3754 Pnt 3561 3781 Pnt 3780 2767 Pnt 2394 3739 Pnt 2416 3742 Pnt 2507 3779 Pnt 3864 3744 Pnt 3179 3745 Pnt 3250 3800 Pnt 2587 3745 Pnt 2625 3748 Pnt 2792 3754 Pnt 2585 3749 Pnt 2628 3749 Pnt 3061 3754 Pnt 3396 2720 Pnt 2268 3783 Pnt 3241 3746 Pnt 2619 3743 Pnt 2440 3748 Pnt 3152 3749 Pnt 2953 3741 Pnt 2878 3739 Pnt 2446 3748 Pnt 2154 3755 Pnt 3116 3752 Pnt 2615 3744 Pnt 2098 3780 Pnt 2730 3762 Pnt 2985 3742 Pnt 2999 3747 Pnt 2507 3744 Pnt 2186 3778 Pnt 2628 3740 Pnt 2433 3734 Pnt 2526 3764 Pnt 2846 3750 Pnt 2322 3757 Pnt 2570 3753 Pnt 2629 3739 Pnt 2301 3752 Pnt 2713 3791 Pnt 2587 3739 Pnt 1926 3746 Pnt 2989 3753 Pnt 2729 3812 Pnt 2248 3783 Pnt 2830 3754 Pnt 2687 3750 Pnt 2542 3744 Pnt 2510 3753 Pnt 1987 3812 Pnt 2725 3749 Pnt 2265 3740 Pnt 2554 3739 Pnt 3058 3753 Pnt 2002 3781 Pnt 2984 3743 Pnt 2856 3749 Pnt 2506 3823 Pnt 2100 3753 Pnt 2446 3742 Pnt 2113 3749 Pnt 3479 3743 Pnt 2352 3761 Pnt 3534 3761 Pnt 2666 3737 Pnt 2023 3771 Pnt 2750 2627 Pnt 2542 3770 Pnt 3044 3748 Pnt 2511 3750 Pnt 2163 3756 Pnt 2316 3748 Pnt 2758 3774 Pnt 2144 3823 Pnt 3079 3750 Pnt 2565 3817 Pnt 2530 3743 Pnt 2188 3744 Pnt 3062 3750 Pnt 2934 3757 Pnt 2522 3738 Pnt 3019 3744 Pnt 2039 3774 Pnt 2813 3740 Pnt 2735 2632 Pnt 2559 3743 Pnt 2897 3806 Pnt 2686 3741 Pnt 2196 3768 Pnt 2486 3737 Pnt 2812 3743 Pnt 2498 3739 Pnt 3009 3738 Pnt 2650 3745 Pnt 2477 3793 Pnt 2661 3745 Pnt 3804 3761 Pnt 3544 3743 Pnt 2629 3744 Pnt 2877 3743 Pnt 2872 3742 Pnt 2800 3754 Pnt 2615 3756 Pnt 2049 3801 Pnt 2456 3737 Pnt 3020 3742 Pnt 2894 3746 Pnt 2760 2591 Pnt 2485 3756 Pnt 3149 3771 Pnt 3310 3755 Pnt 2702 3754 Pnt 2493 3750 Pnt 2984 3768 Pnt 2686 3747 Pnt 2322 3740 Pnt 2241 3741 Pnt 4176 3761 Pnt 2444 3790 Pnt 2122 3771 Pnt 2723 3740 Pnt 2158 3817 Pnt 2785 2725 Pnt 2412 3781 Pnt 2187 3734 Pnt 2433 3747 Pnt 2864 3741 Pnt 3863 2655 Pnt 2921 3738 Pnt 3058 3742 Pnt 3307 3742 Pnt 3070 3780 Pnt 2705 3770 Pnt 3319 3800 Pnt 3071 3743 Pnt 3041 3776 Pnt 2264 3753 Pnt 2756 3739 Pnt 3126 3756 Pnt 2999 3738 Pnt 3112 3740 Pnt 2454 3742 Pnt 2929 3755 Pnt 2838 3812 Pnt 2757 3757 Pnt 3227 3757 Pnt 3931 3755 Pnt 3045 3755 Pnt 2650 3739 Pnt 2607 3812 Pnt 2565 3786 Pnt 2528 3750 Pnt 2727 3744 Pnt 2702 3755 Pnt 2348 3791 Pnt 3340 3750 Pnt 2866 3746 Pnt 3476 3751 Pnt 2199 3776 Pnt 2982 3740 Pnt 2405 3762 Pnt 2428 3762 Pnt 3050 3738 Pnt 3234 3739 Pnt 2299 3749 Pnt 2928 3760 Pnt 3118 3749 Pnt 2796 3777 Pnt 2083 3768 Pnt 2106 3778 Pnt 2296 3805 Pnt 3393 3768 Pnt 3067 3753 Pnt 2815 3800 Pnt 2075 3801 Pnt 3002 3752 Pnt 2074 3773 Pnt 2200 3737 Pnt 2130 3753 Pnt 2378 3742 Pnt 2611 3741 Pnt 2509 3744 Pnt 2884 3762 Pnt 2796 3742 Pnt 3798 3784 Pnt 2591 3832 Pnt 2838 3779 Pnt 2869 3744 Pnt 2908 3762 Pnt 2758 3742 Pnt 2530 3758 Pnt 2375 3753 Pnt 2535 3746 Pnt 2356 3736 Pnt 3080 2757 Pnt 2966 3741 Pnt 2500 3743 Pnt 3241 3736 Pnt 3219 1814 Pnt 3649 2707 Pnt 2904 3739 Pnt 2317 3743 Pnt 3533 3754 Pnt 3547 3743 Pnt 2610 3738 Pnt 3298 3754 Pnt 2122 3741 Pnt 2693 3780 Pnt 2236 3797 Pnt 3419 3754 Pnt 2866 3739 Pnt 2463 3742 Pnt 3049 3797 Pnt 2858 3766 Pnt 3523 3747 Pnt 2861 3757 Pnt 2624 3739 Pnt 2494 3744 Pnt 2391 3740 Pnt 3952 3748 Pnt 2494 3737 Pnt 2745 3760 Pnt 2332 3741 Pnt 2742 3750 Pnt 2763 3756 Pnt 1994 3739 Pnt 2298 3757 Pnt 2508 3753 Pnt 2343 3758 Pnt 2504 3758 Pnt 2502 3747 Pnt 3738 3742 Pnt 2682 3738 Pnt 2990 3759 Pnt 3118 3738 Pnt 2600 3738 Pnt 3167 3734 Pnt 3413 3746 Pnt 2189 3788 Pnt 2814 3745 Pnt 2581 3735 Pnt 2406 3749 Pnt 2624 3744 Pnt 2687 3743 Pnt 2698 3744 Pnt 2910 3743 Pnt 2670 3748 Pnt 2324 3742 Pnt 2570 3782 Pnt 2916 3736 Pnt 3640 3745 Pnt 2458 3752 Pnt 2089 3750 Pnt 2209 3771 Pnt 2462 3771 Pnt 1889 3771 Pnt 3213 3751 Pnt 2906 3743 Pnt 2728 3746 Pnt 2329 3741 Pnt 2275 3778 Pnt 3006 2474 Pnt 3240 3744 Pnt 3034 3757 Pnt 2739 3745 Pnt 2651 3764 Pnt 3085 3747 Pnt 2470 3749 Pnt 3307 3739 Pnt 2631 3757 Pnt 1801 3757 Pnt 2017 3763 Pnt 2521 3741 Pnt 3078 3741 Pnt 2686 3746 Pnt 3080 3798 Pnt 3621 3754 Pnt 2460 3743 Pnt 2285 3798 Pnt 3504 3736 Pnt 2267 3793 Pnt 2854 3748 Pnt 2815 3742 Pnt 2336 3738 Pnt 2792 3749 Pnt 2376 3739 Pnt 2773 3757 Pnt 3177 3746 Pnt 2800 3745 Pnt 2322 3750 Pnt 2219 3792 Pnt 2349 3748 Pnt 2476 3763 Pnt 2422 3744 Pnt 3637 3738 Pnt 2485 3738 Pnt 3417 3764 Pnt 3785 2565 Pnt 2165 3766 Pnt 3057 3748 Pnt 2548 3762 Pnt 2167 3780 Pnt 3753 3738 Pnt 2946 3754 Pnt 2778 3762 Pnt 2571 3771 Pnt 2141 3802 Pnt 3100 3757 Pnt 3049 3744 Pnt 2734 3780 Pnt 2277 3771 Pnt 2352 3750 Pnt 3687 3763 Pnt 2681 3740 Pnt 2942 3815 Pnt 2185 3738 Pnt 2262 3757 Pnt 2375 3741 Pnt 2649 3807 Pnt 2540 3815 Pnt 2731 3750 Pnt 2409 3780 Pnt 2595 3754 Pnt 2703 3734 Pnt 3463 3739 Pnt 3910 3747 Pnt 2444 3752 Pnt 2589 3739 Pnt 3143 3734 Pnt 3103 3739 Pnt 2544 3739 Pnt 2662 3788 Pnt 3046 3749 Pnt 3137 3754 Pnt 2377 3753 Pnt 3643 2602 Pnt 2599 3742 Pnt 2945 3743 Pnt 2616 3753 Pnt 2987 3742 Pnt 2244 3744 Pnt 2889 3739 Pnt 2610 3781 Pnt 2232 3748 Pnt 2965 3739 Pnt 2615 3754 Pnt 2319 3754 Pnt 2457 3737 Pnt 3162 3739 Pnt 2729 3747 Pnt 2962 3763 Pnt 2804 3800 Pnt 3749 3757 Pnt 2619 3744 Pnt 2967 3750 Pnt 2640 3741 Pnt 2340 3770 Pnt 2556 3741 Pnt 2609 3748 Pnt 2563 3806 Pnt 3983 2565 Pnt 2597 3781 Pnt 2798 3740 Pnt 2601 3744 Pnt 2714 3771 Pnt 3070 3741 Pnt 2371 3738 Pnt 2801 3742 Pnt 2984 3754 Pnt 2994 3777 Pnt 2700 3743 Pnt 2606 3745 Pnt 2924 3740 Pnt 2913 3740 Pnt 2800 3754 Pnt 2682 3749 Pnt 2713 3737 Pnt 2443 3750 Pnt 2747 3749 Pnt 2431 3752 Pnt 2874 3750 Pnt 2673 3739 Pnt 2050 3761 Pnt 2657 3768 Pnt 2563 3748 Pnt 3009 3739 Pnt 2987 3735 Pnt 3228 3743 Pnt 3012 3734 Pnt 2641 3752 Pnt 2634 3739 Pnt 3215 3739 Pnt 2507 3783 Pnt 2066 3783 Pnt 2933 3740 Pnt 2735 3740 Pnt 2160 3817 Pnt 2879 3742 Pnt 2427 3739 Pnt 3244 3758 Pnt 2420 3742 Pnt 2722 3781 Pnt 3238 3742 Pnt 3483 3739 Pnt 2827 3748 Pnt 2353 3823 Pnt 2349 3761 Pnt 2649 2739 Pnt 2478 3749 Pnt 3519 3746 Pnt 2552 3773 Pnt 2623 3742 Pnt 2231 3747 Pnt 3671 3823 Pnt 2434 3738 Pnt 2943 3740 Pnt 2505 3753 Pnt 2454 3783 Pnt 2280 3747 Pnt 2923 3740 Pnt 2200 3801 Pnt 2916 3737 Pnt 2749 3743 Pnt 2306 3771 Pnt 3569 3798 Pnt 2604 3740 Pnt 2572 3741 Pnt 2692 3757 Pnt 2788 3741 Pnt 2557 3786 Pnt 3295 3776 Pnt 2512 3745 Pnt 3269 3756 Pnt 2927 3741 Pnt 2181 3776 Pnt 2610 3751 Pnt 2688 3739 Pnt 2731 3744 Pnt 2895 3760 Pnt 2428 3738 Pnt 2538 3812 Pnt 3107 3740 Pnt 2222 3793 Pnt 3002 3753 Pnt 2967 3755 Pnt 2613 3783 Pnt 3814 3743 Pnt 2717 3756 Pnt 2108 3778 Pnt 2578 3752 Pnt 3813 3793 Pnt 2832 3739 Pnt 2507 3747 Pnt 2277 3805 Pnt 2759 3790 Pnt 3202 3747 Pnt 2595 3740 Pnt 1941 3753 Pnt 2384 3741 Pnt 3564 3751 Pnt 2427 3784 Pnt 2471 3771 Pnt 3396 3738 Pnt 3328 3800 Pnt 3615 3756 Pnt 3247 3834 Pnt 3428 3740 Pnt 2814 3812 Pnt 2621 3756 Pnt 3156 3759 Pnt 3603 3742 Pnt 2449 3784 Pnt 2770 3744 Pnt 3200 3759 Pnt 2957 3750 Pnt 3368 3736 Pnt 2899 3755 Pnt 2693 3735 Pnt 2545 3774 Pnt 2560 3746 Pnt 3455 3739 Pnt 3022 3755 Pnt 2991 3740 Pnt 2717 3750 Pnt 2649 3739 Pnt 2683 3741 Pnt 2786 3756 Pnt 2652 3738 Pnt 2677 3739 Pnt 2433 3792 Pnt 2540 3748 Pnt 2240 3742 Pnt 2705 3738 Pnt 2558 3743 Pnt 3252 2650 Pnt 2766 3742 Pnt 2325 3744 Pnt 3085 3758 Pnt 2535 3734 Pnt 3118 3775 Pnt 3291 3754 Pnt 2700 3739 Pnt 2193 3767 Pnt 2401 3762 Pnt 3135 3746 Pnt 3471 3734 Pnt 3234 3742 Pnt 2659 3744 Pnt 3194 3734 Pnt 2606 3740 Pnt 2722 3738 Pnt 2376 3757 Pnt 2753 3743 Pnt 3404 2640 Pnt 2640 3753 Pnt 2388 3813 Pnt 2896 3743 Pnt 4070 3750 Pnt 2350 3762 Pnt 2930 3813 Pnt 2512 3739 Pnt 2338 3733 Pnt 2583 3744 Pnt 2252 3784 Pnt 2094 3733 Pnt 2434 3810 Pnt 3369 3762 Pnt 2722 3740 Pnt 3003 3743 Pnt 2975 3797 Pnt 2927 3742 Pnt 3262 3743 Pnt 2709 3773 Pnt 2469 3756 Pnt 3340 3754 Pnt 2798 3736 Pnt 2687 3742 Pnt 3108 3742 Pnt 2812 3742 Pnt 2974 3750 Pnt 2621 3739 Pnt 2073 3775 Pnt 2280 3734 Pnt 3020 3743 Pnt 1863 3784 Pnt 3128 3743 Pnt 3700 3751 Pnt 2931 3744 Pnt 2563 3742 Pnt 2937 3745 Pnt 1864 3771 Pnt 3342 3751 Pnt 2960 3744 Pnt 2481 3742 Pnt 2796 3763 Pnt 2358 3757 Pnt 2912 3759 Pnt 2504 3753 Pnt 3060 3742 Pnt 2785 3780 Pnt 2242 3778 Pnt 2417 3749 Pnt 3093 3753 Pnt 2073 3790 Pnt 2779 3741 Pnt 2189 3752 Pnt 3025 3749 Pnt 2856 3754 Pnt 2431 3741 Pnt 3216 3746 Pnt 2316 3738 Pnt 3303 3750 Pnt 2731 3783 Pnt 2768 3756 Pnt 2650 3739 Pnt 1985 3750 Pnt 2826 3745 Pnt 2377 3739 Pnt 3771 3761 Pnt 1879 3771 Pnt 2502 3746 Pnt 2561 3736 Pnt 2404 3741 Pnt 2689 3798 Pnt 2062 3758 Pnt 2530 3771 Pnt 3944 3747 Pnt 2065 3807 Pnt 3101 2569 Pnt 2241 3738 Pnt 3410 3745 Pnt 3432 3735 Pnt 2221 3788 Pnt 3096 2414 Pnt 2337 3766 Pnt 3425 3749 Pnt 2408 3751 Pnt 2973 3762 Pnt 2723 3780 Pnt 2892 3747 Pnt 2410 3746 Pnt 2708 3741 Pnt 2540 3738 Pnt 2816 3772 Pnt 1886 3755 Pnt 2556 3754 Pnt 2963 3758 Pnt 2645 3759 Pnt 3189 3738 Pnt 2573 3746 Pnt 2757 3739 Pnt 2533 3753 Pnt 2671 3742 Pnt 2177 3797 Pnt 2300 3784 Pnt 3250 3747 Pnt 1966 3805 Pnt 3319 3759 Pnt 2743 3757 Pnt 2582 3766 Pnt 2491 3742 Pnt 2986 3788 Pnt 3447 3748 Pnt 2655 3737 Pnt 2509 3744 Pnt 3441 3785 Pnt 2287 3750 Pnt 2942 3739 Pnt 2804 2479 Pnt 2545 3745 Pnt 2576 3744 Pnt 3021 3745 Pnt 2046 3759 Pnt 2253 3754 Pnt 2959 3753 Pnt 2233 3739 Pnt 2627 3735 Pnt 2368 3782 Pnt 2522 3751 Pnt 2474 3735 Pnt 2494 3741 Pnt 2618 3737 Pnt 2656 3743 Pnt 3055 3738 Pnt 2534 3737 Pnt 2338 3761 Pnt 2861 3747 Pnt 3170 3751 Pnt 2047 3792 Pnt 3104 3750 Pnt 2607 3742 Pnt 2423 3745 Pnt 2890 3736 Pnt 2277 3743 Pnt 2712 3742 Pnt 2817 3763 Pnt 2543 3742 Pnt 2750 3739 Pnt 2539 3744 Pnt 2506 3749 Pnt 2361 3784 Pnt 2263 3734 Pnt 2083 3772 Pnt 3123 3743 Pnt 3190 3748 Pnt 2444 3744 Pnt 2979 3739 Pnt 2483 3768 Pnt 2534 3742 Pnt 3799 3754 Pnt 2042 3815 Pnt 2812 3758 Pnt 3494 3766 Pnt 2282 3744 Pnt 3484 3753 Pnt 2676 3738 Pnt 2919 3755 Pnt 2360 3735 Pnt 2748 3752 Pnt 2445 3764 Pnt 2424 3740 Pnt 2580 3739 Pnt 3269 3752 Pnt 2534 3738 Pnt 2481 3762 Pnt 2083 3752 Pnt 2189 3759 Pnt 2799 2533 Pnt 4110 3747 Pnt 3569 3762 Pnt 2584 3741 Pnt 2861 3752 Pnt 3364 3744 Pnt 2540 3762 Pnt 2654 3740 Pnt 2487 3763 Pnt 2532 3817 Pnt 2343 3782 Pnt 3208 3762 Pnt 3076 3749 Pnt 3269 3754 Pnt 3082 3750 Pnt 3861 3743 Pnt 2952 3741 Pnt 2878 3740 Pnt 3208 3749 Pnt 2470 2852 Pnt 3090 3744 Pnt 3053 3741 Pnt 2679 3749 Pnt 2235 3750 Pnt 2861 3739 Pnt 2696 3801 Pnt 2777 3763 Pnt 3235 3749 Pnt 2972 3744 Pnt 2291 3737 Pnt 3296 3741 Pnt 3034 3757 Pnt 2754 3744 Pnt 2776 3758 Pnt 2417 3767 Pnt 2472 3734 Pnt 2914 3745 Pnt 2548 3751 Pnt 3457 3740 Pnt 2303 3752 Pnt 3035 2468 Pnt 3985 2524 Pnt 3384 2783 Pnt 2716 3781 Pnt 2632 3749 Pnt 2449 3742 Pnt 3203 3748 Pnt 2621 3773 Pnt 3256 3739 Pnt 3263 3746 Pnt 2949 3740 Pnt 2308 3771 Pnt 2690 3777 Pnt 2568 3737 Pnt 2448 3734 Pnt 2409 3750 Pnt 2258 3747 Pnt 3452 3742 Pnt 3465 2685 Pnt 2488 3761 Pnt 3114 3750 Pnt 1910 3805 Pnt 2707 3757 Pnt 2504 3805 Pnt 2607 3790 Pnt 3298 3749 Pnt 2805 3742 Pnt 2585 3781 Pnt 2471 3739 Pnt 2586 3747 Pnt 2949 3742 Pnt 2384 3771 Pnt 2384 3823 Pnt 2777 3745 Pnt 2144 3760 Pnt 2976 3739 Pnt 3329 3739 Pnt 3049 3740 Pnt 2838 3739 Pnt 2221 3744 Pnt 2717 3745 Pnt 3100 3762 Pnt 3079 3739 Pnt 2419 3745 Pnt 2225 3761 Pnt 2951 3737 Pnt 3033 3741 Pnt 2854 3758 Pnt 2371 3798 Pnt 2706 3736 Pnt 3396 3744 Pnt 3079 3745 Pnt 2548 3738 Pnt 2551 3729 Pnt 3135 3738 Pnt 3114 3744 Pnt 2595 3745 Pnt 2456 3816 Pnt 2942 3750 Pnt 3304 3737 Pnt 3057 3745 Pnt 2777 3750 Pnt 2520 3736 Pnt 2202 3729 Pnt 2928 3741 Pnt 2716 3745 Pnt 3008 3743 Pnt 2866 3739 Pnt 2686 3741 Pnt 2847 3754 Pnt 2523 3738 Pnt 2498 3777 Pnt 2588 3745 Pnt 2999 3768 Pnt 2934 3760 Pnt 2240 3769 Pnt 2993 3742 Pnt 2646 3749 Pnt 2155 3734 Pnt 2326 3739 Pnt 3036 3741 Pnt 2583 3749 Pnt 3363 3737 Pnt 2498 3749 Pnt 2273 3768 Pnt 2869 3739 Pnt 2677 3756 Pnt 2405 3759 Pnt 3072 3768 Pnt 2439 3748 Pnt 2979 3734 Pnt 2551 3786 Pnt 3612 3752 Pnt 2982 3793 Pnt 3407 3740 Pnt 2062 3781 Pnt 2861 3748 Pnt 2884 3747 Pnt 2636 3768 Pnt 3107 3742 Pnt 2994 3747 Pnt 2632 3741 Pnt 2953 3746 Pnt 2454 3779 Pnt 2710 3754 Pnt 2530 3756 Pnt 2280 3783 Pnt 2743 3740 Pnt 3130 2667 Pnt 2742 3733 Pnt 2847 3734 Pnt 2616 3740 Pnt 2440 3812 Pnt 2589 3747 Pnt 2861 3749 Pnt 3280 3740 Pnt 3496 3740 Pnt 2655 3748 Pnt 1923 3770 Pnt 3010 3740 Pnt 2990 3743 Pnt 2215 3810 Pnt 2766 3734 Pnt 1826 3789 Pnt 2287 3759 Pnt 2619 3755 Pnt 2037 3797 Pnt 3263 3810 Pnt 2495 3736 Pnt 2699 3738 Pnt 2263 3784 Pnt 2416 3776 Pnt 2653 3742 Pnt 2310 3765 Pnt 2068 3798 Pnt 3031 3751 Pnt 3386 3742 Pnt 3329 3762 Pnt 2624 3742 Pnt 3233 3742 Pnt 3016 2564 Pnt 3142 3768 Pnt 3020 3740 Pnt 2892 3750 Pnt 2601 3742 Pnt 3332 3793 Pnt 2477 3743 Pnt 2452 3743 Pnt 3566 2472 Pnt 2148 3774 Pnt 3571 3743 Pnt 2956 3739 Pnt 2858 3743 Pnt 3370 3743 Pnt 2160 3762 Pnt 2687 3834 Pnt 3165 3755 Pnt 3161 3755 Pnt 2799 3734 Pnt 2531 3744 Pnt 3130 3763 Pnt 3012 3784 Pnt 3031 3750 Pnt 2880 3734 Pnt 3478 3742 Pnt 2594 3762 Pnt 2278 3734 Pnt 3394 3750 Pnt 2684 3792 Pnt 1831 3784 Pnt 2249 3742 Pnt 2738 3739 Pnt 3676 3751 Pnt 3221 3742 Pnt 3117 3756 Pnt 2444 3744 Pnt 2393 3752 Pnt 2876 3756 Pnt 2621 3751 Pnt 2747 3743 Pnt 2569 3779 Pnt 2742 3762 Pnt 2745 3775 Pnt 2973 3739 Pnt 2569 3762 Pnt 2356 3760 Pnt 4237 3756 Pnt 2707 3784 Pnt 2595 3741 Pnt 2150 3738 Pnt 2969 3740 Pnt 3275 3753 Pnt 2763 3741 Pnt 2966 3746 Pnt 2953 3744 Pnt 3612 3784 Pnt 3432 3742 Pnt 3324 3757 Pnt 3150 3763 Pnt 2640 3897 Pnt 3262 3747 Pnt 2428 3766 Pnt 2656 3750 Pnt 2755 3749 Pnt 3159 3766 Pnt 2847 3746 Pnt 2374 3740 Pnt 2356 3785 Pnt 1954 3785 Pnt 3820 3747 Pnt 2373 3741 Pnt 1816 3771 Pnt 4067 3762 Pnt 3036 3749 Pnt 2820 3746 Pnt 2511 3783 Pnt 2005 3750 Pnt 3212 3742 Pnt 2728 3739 Pnt 2618 3754 Pnt 3024 3796 Pnt 2639 3759 Pnt 2085 3746 Pnt 2899 3742 Pnt 2591 3807 Pnt 3438 3745 Pnt 2723 3753 Pnt 2301 3744 Pnt 2270 3741 Pnt 2649 3742 Pnt 2297 3744 Pnt 2192 3796 Pnt 2606 3741 Pnt 2177 3750 Pnt 3367 3770 Pnt 2622 3744 Pnt 1834 3779 Pnt 2733 3749 Pnt 2863 3736 Pnt 2010 3807 Pnt 3181 3751 Pnt 3019 3749 Pnt 2777 3733 Pnt 2670 3748 Pnt 2499 3738 Pnt 2498 3771 Pnt 3144 3741 Pnt 2558 3757 Pnt 2582 3761 Pnt 2223 3747 Pnt 2520 3761 Pnt 3198 3751 Pnt 2600 3753 Pnt 2464 3754 Pnt 1985 3759 Pnt 2955 3739 Pnt 2957 3749 Pnt 3310 3767 Pnt 3013 3792 Pnt 2529 3741 Pnt 2910 3763 Pnt 2317 3754 Pnt 2266 3761 Pnt 2954 3738 Pnt 2589 3742 Pnt 3408 3774 Pnt 2635 3758 Pnt 3453 3738 Pnt 2607 3742 Pnt 2370 3744 Pnt 2345 3792 Pnt 2604 3749 Pnt 2179 3759 Pnt 3508 3742 Pnt 3182 3742 Pnt 2044 3797 Pnt 2281 3780 Pnt 2864 3739 Pnt 3431 3797 Pnt 3096 2691 Pnt 2864 3742 Pnt 2767 3744 Pnt 2574 3805 Pnt 2754 3751 Pnt 2820 3740 Pnt 2906 3736 Pnt 3052 3741 Pnt 2661 3746 Pnt 2802 3737 Pnt 2355 3778 Pnt 2735 3739 Pnt 2602 3743 Pnt 2123 3754 Pnt 2325 3743 Pnt 2447 3741 Pnt 2690 3741 Pnt 2698 3741 Pnt 2427 3737 Pnt 2329 3780 Pnt 3430 3748 Pnt 3589 3744 Pnt 2344 3747 Pnt 2915 3742 Pnt 2289 3782 Pnt 2190 3744 Pnt 2370 3762 Pnt 2825 3748 Pnt 2688 3736 Pnt 2353 2670 Pnt 2647 3757 Pnt 3003 3738 Pnt 2627 3751 Pnt 2769 3748 Pnt 2334 3735 Pnt 2974 3741 Pnt 2633 2553 Pnt 4066 2651 Pnt 3065 3769 Pnt 2729 3745 Pnt 2309 3772 Pnt 3395 3752 Pnt 2775 3744 Pnt 2868 3762 Pnt 2890 3753 Pnt 2942 3766 Pnt 2932 3736 Pnt 2187 3772 Pnt 3361 3752 Pnt 2970 3753 Pnt 2913 3741 Pnt 2483 3762 Pnt 2552 3772 Pnt 2629 3760 Pnt 1931 3823 Pnt 3742 3739 Pnt 2601 3784 Pnt 2548 3737 Pnt 2709 3737 Pnt 2916 3744 Pnt 2947 3744 Pnt 2824 3736 Pnt 2738 3753 Pnt 2313 3770 Pnt 2527 3751 Pnt 3034 3742 Pnt 2565 3768 Pnt 2885 3738 Pnt 4013 3749 Pnt 3401 3755 Pnt 2199 3739 Pnt 2336 3813 Pnt 2588 3743 Pnt 2815 3769 Pnt 2734 3758 Pnt 2837 3735 Pnt 2487 3747 Pnt 1821 3755 Pnt 2677 3743 Pnt 2307 3748 Pnt 3395 3744 Pnt 2485 3817 Pnt 2714 3742 Pnt 2986 3744 Pnt 2727 3742 Pnt 2953 3751 Pnt 2751 2500 Pnt 3337 3737 Pnt 3016 3741 Pnt 3286 3759 Pnt 3112 3749 Pnt 2936 3739 Pnt 2735 3746 Pnt 2731 3757 Pnt 2209 3782 Pnt 2150 3771 Pnt 2636 3777 Pnt 2443 3764 Pnt 3931 3754 Pnt 3623 3740 Pnt 2803 3754 Pnt 2852 3777 Pnt 2617 3737 Pnt 3663 3739 Pnt 2188 3738 Pnt 2502 3750 Pnt 2213 3787 Pnt 3323 3761 Pnt 2400 3749 Pnt 2667 3740 Pnt 2203 3761 Pnt 3307 3748 Pnt 2770 3762 Pnt 2709 2637 Pnt 2118 3761 Pnt 2667 3740 Pnt 2002 3763 Pnt 3303 3743 Pnt 2713 3761 Pnt 2437 3805 Pnt 2824 3741 Pnt 2063 3805 Pnt 2898 3740 Pnt 2400 3745 Pnt 2524 3738 Pnt 3340 3805 Pnt 3077 3757 Pnt 2668 3739 Pnt 2438 3790 Pnt 1755 3750 Pnt 3094 3744 Pnt 2748 3753 Pnt 2430 3767 Pnt 3209 3784 Pnt 2791 3781 Pnt 2482 3737 Pnt 2281 3746 Pnt 3035 3734 Pnt 2481 3748 Pnt 2314 3744 Pnt 3178 3749 Pnt 2839 3803 Pnt 2714 3740 Pnt 2874 3741 Pnt 2021 3798 Pnt 3061 3770 Pnt 2547 3801 Pnt 3189 3801 Pnt 2584 3746 Pnt 2323 3742 Pnt 2397 3748 Pnt 2090 3762 Pnt 2650 3734 Pnt 1875 3729 Pnt 2394 3768 Pnt 2588 3744 Pnt 3615 3745 Pnt 2732 3734 Pnt 2366 3742 Pnt 2997 3735 Pnt 3310 3745 Pnt 2616 3818 Pnt 2789 3746 Pnt 2128 3788 Pnt 3047 3735 Pnt 2326 3747 Pnt 2825 3744 Pnt 3557 3752 Pnt 2964 3746 Pnt 2154 3738 Pnt 3214 2654 Pnt 2074 3786 Pnt 2327 3739 Pnt 2665 3739 Pnt 2956 3744 Pnt 2577 3745 Pnt 3679 2754 Pnt 3077 3752 Pnt 2473 3739 Pnt 2401 3737 Pnt 2669 3741 Pnt 2817 3737 Pnt 2487 3745 Pnt 3428 3742 Pnt 2738 3749 Pnt 2891 3741 Pnt 2505 3739 Pnt 3955 3758 Pnt 2936 3740 Pnt 3386 3735 Pnt 2404 3816 Pnt 2519 3745 Pnt 2094 3756 Pnt 3656 3740 Pnt 3450 2631 Pnt 2750 3737 Pnt 2237 3760 Pnt 2417 3777 Pnt 3468 3749 Pnt 2450 3743 Pnt 2340 3744 Pnt 2733 3741 Pnt 2003 3823 Pnt 2420 3754 Pnt 2835 3736 Pnt 3308 3741 Pnt 2650 3760 Pnt 2817 3752 Pnt 2498 3739 Pnt 2856 3745 Pnt 2531 3738 Pnt 2944 3754 Pnt 3332 3740 Pnt 2615 3769 Pnt 4056 2685 Pnt 2544 3734 Pnt 2853 3793 Pnt 3775 3738 Pnt 3123 3743 Pnt 2833 3736 Pnt 3286 3737 Pnt 3188 3755 Pnt 2754 3756 Pnt 2619 3750 Pnt 2497 3740 Pnt 2520 3737 Pnt 3420 3758 Pnt 2638 3741 Pnt 3671 3740 Pnt 2750 3759 Pnt 2458 3734 Pnt 2091 3781 Pnt 2667 3739 Pnt 2640 3734 Pnt 2132 3768 Pnt 2298 3784 Pnt 2843 3747 Pnt 2379 3733 Pnt 3397 3748 Pnt 2676 3776 Pnt 3532 3776 Pnt 2256 3756 Pnt 2480 3742 Pnt 2823 3747 Pnt 4090 2712 Pnt 2319 3779 Pnt 2638 3757 Pnt 2378 3749 Pnt 3179 2711 Pnt 2368 3748 Pnt 2436 3740 Pnt 2645 3754 Pnt 3807 3738 Pnt 3622 3755 Pnt 2872 3768 Pnt 2597 3764 Pnt 3307 3742 Pnt 2711 3785 Pnt 3493 3734 Pnt 2549 3743 Pnt 2929 3764 Pnt 2635 3813 Pnt 2613 3764 Pnt 2703 3753 Pnt 2265 3812 Pnt 2832 3745 Pnt 2526 3747 Pnt 2550 3761 Pnt 2620 3751 Pnt 2390 3734 Pnt 3245 3751 Pnt 3031 3753 Pnt 2661 3762 Pnt 2317 3736 Pnt 2977 3734 Pnt 2652 3792 Pnt 2386 3774 Pnt 2344 3810 Pnt 1902 3803 Pnt 2348 3765 Pnt 3896 3792 Pnt 2147 3785 Pnt 2750 3765 Pnt 2530 3743 Pnt 3153 3799 Pnt 2893 2716 Pnt 3029 2636 Pnt 3037 3756 Pnt 2928 3740 Pnt 2832 3751 Pnt 3143 3750 Pnt 3316 3739 Pnt 3241 3743 Pnt 2966 3750 Pnt 2954 3756 Pnt 2062 3790 Pnt 3167 3762 Pnt 2667 3742 Pnt 2766 3743 Pnt 3015 3750 Pnt 1955 3793 Pnt 2536 3746 Pnt 2668 3749 Pnt 3328 3775 Pnt 2971 3755 Pnt 2608 3753 Pnt 2392 3736 Pnt 3158 3749 Pnt 3083 3751 Pnt 2302 3760 Pnt 3185 3746 Pnt 2602 3754 Pnt 2580 3739 Pnt 3421 3741 Pnt 2149 3743 Pnt 2356 3736 Pnt 3147 3745 Pnt 2314 3803 Pnt 2848 3807 Pnt 3185 2573 Pnt 2638 3779 Pnt 2665 3803 Pnt 2393 3748 Pnt 1925 3758 Pnt 2646 3739 Pnt 2882 3756 Pnt 2714 3739 Pnt 2759 3738 Pnt 2430 3829 Pnt 2914 3742 Pnt 2054 3744 Pnt 2768 3738 Pnt 2749 3749 Pnt 3089 3741 Pnt 2817 3746 Pnt 2685 3771 Pnt 2432 3755 Pnt 2323 3778 Pnt 3175 3744 Pnt 3034 3784 Pnt 2255 3742 Pnt 2651 3738 Pnt 2416 3796 Pnt 3421 3784 Pnt 3056 3763 Pnt 2391 3739 Pnt 2414 3754 Pnt 2418 3738 Pnt 2621 3758 Pnt 3161 3742 Pnt 3034 3766 Pnt 2868 3746 Pnt 3176 3754 Pnt 2804 3753 Pnt 2494 3743 Pnt 3418 3742 Pnt 3222 3751 Pnt 2838 3746 Pnt 2481 3742 Pnt 3044 3744 Pnt 3187 3747 Pnt 2709 3797 Pnt 3151 3796 Pnt 3038 3779 Pnt 2583 3759 Pnt 2605 3738 Pnt 2660 3766 Pnt 2369 3741 Pnt 2183 3767 Pnt 3214 3738 Pnt 2176 3749 Pnt 3351 3741 Pnt 2398 3805 Pnt 2947 3757 Pnt 1892 3805 Pnt 2409 3897 Pnt 3113 3762 Pnt 2033 3772 Pnt 2913 3737 Pnt 3072 3757 Pnt 2917 3757 Pnt 2141 3781 Pnt 3477 2640 Pnt 3158 3742 Pnt 2611 3792 Pnt 2613 3785 Pnt 2080 3775 Pnt 2507 3754 Pnt 2379 3741 Pnt 2929 3783 Pnt 2533 3742 Pnt 2796 3741 Pnt 2653 3749 Pnt 4432 3739 Pnt 2723 3782 Pnt 3548 3744 Pnt 2003 3750 Pnt 2433 3738 Pnt 3325 3738 Pnt 2681 3741 Pnt 3071 3744 Pnt 3073 3750 Pnt 2632 3745 Pnt 2488 3767 Pnt 2612 3794 Pnt 2997 3738 Pnt 3205 3741 Pnt 2613 3761 Pnt 3101 3751 Pnt 2716 3741 Pnt 3462 3768 Pnt 2762 3739 Pnt 2623 3737 Pnt 2819 3744 Pnt 1943 3823 Pnt 2694 3753 Pnt 2206 3750 Pnt 3863 2599 Pnt 2795 3768 Pnt 2248 3741 Pnt 2906 3749 Pnt 3544 3735 Pnt 3806 3768 Pnt 2500 3742 Pnt 2878 3741 Pnt 2530 3741 Pnt 1960 3756 Pnt 2912 3738 Pnt 1954 3784 Pnt 2934 3786 Pnt 2423 3737 Pnt 2600 3748 Pnt 2681 3753 Pnt 2286 3744 Pnt 2826 3755 Pnt 2503 3765 Pnt 3262 3748 Pnt 2502 3744 Pnt 2931 3744 Pnt 1807 3779 Pnt 2303 3748 Pnt 2813 3751 Pnt 2962 3744 Pnt 3048 3748 Pnt 2430 3770 Pnt 2826 3748 Pnt 2752 3744 Pnt 4120 2604 Pnt 2336 3779 Pnt 2733 3805 Pnt 2552 3746 Pnt 3008 3752 Pnt 3287 3770 Pnt 2677 3749 Pnt 3040 3748 Pnt 2642 3735 Pnt 2055 3757 Pnt 2350 3747 Pnt 2789 3742 Pnt 2620 3780 Pnt 2798 3748 Pnt 2755 3758 Pnt 2905 3740 Pnt 2370 3805 Pnt 2648 3746 Pnt 2580 3744 Pnt 2543 3815 Pnt 1914 3817 Pnt 2995 3739 Pnt 2409 3738 Pnt 3203 3742 Pnt 2369 3744 Pnt 3014 3738 Pnt 3335 3744 Pnt 2748 3752 Pnt 2519 3782 Pnt 3189 2857 Pnt 2436 3744 Pnt 2920 3736 Pnt 3275 3740 Pnt 3358 3745 Pnt 3091 3737 Pnt 2724 3739 Pnt 2727 3749 Pnt 3144 3745 Pnt 3614 3757 Pnt 2429 3740 Pnt 2865 3739 Pnt 3052 3751 Pnt 2940 3736 Pnt 2851 3762 Pnt 3028 3757 Pnt 2816 3744 Pnt 2323 3748 Pnt 3098 3753 Pnt 2315 3752 Pnt 2940 3748 Pnt 2703 3761 Pnt 3226 3736 Pnt 3400 3757 Pnt 2880 3748 Pnt 2677 3752 Pnt 2588 3741 Pnt 3031 3744 Pnt 2696 3735 Pnt 2692 3752 Pnt 2438 3755 Pnt 2905 3757 Pnt 3775 3748 Pnt 2594 3749 Pnt 3329 3739 Pnt 3089 3790 Pnt 2139 3748 Pnt 2847 3740 Pnt 2574 3749 Pnt 2402 3747 Pnt 2142 3761 Pnt 2315 3748 Pnt 2514 3746 Pnt 2469 3740 Pnt 2420 3744 Pnt 2138 3772 Pnt 2751 3787 Pnt 2448 3763 Pnt 2572 3761 Pnt 2569 3761 Pnt 2653 3739 Pnt 2954 3740 Pnt 2872 3739 Pnt 2226 3780 Pnt 2908 2918 Pnt 2803 3770 Pnt 2650 3740 Pnt 2466 3764 Pnt 2539 3787 Pnt 2440 3741 Pnt 2463 3737 Pnt 3794 3745 Pnt 3572 3735 Pnt 3232 3751 Pnt 2641 3822 Pnt 2619 3762 Pnt 2769 3748 Pnt 3155 3754 Pnt 2674 3744 Pnt 2663 3755 Pnt 1865 3763 Pnt 2054 3761 Pnt 2133 3745 Pnt 3504 3749 Pnt 2505 3743 Pnt 2790 3763 Pnt 3666 3759 Pnt 2552 3740 Pnt 2984 3745 Pnt 2525 3735 Pnt 2940 3737 Pnt 3157 2612 Pnt 2768 3745 Pnt 3125 3744 Pnt 2321 3736 Pnt 2651 3740 Pnt 2837 3751 Pnt 3118 3750 Pnt 3721 3751 Pnt 2653 3773 Pnt 2386 3801 Pnt 3312 2494 Pnt 3327 3741 Pnt 2183 3729 Pnt 2687 3742 Pnt 2532 3732 Pnt 2332 3734 Pnt 2597 3770 Pnt 2238 3751 Pnt 2075 3804 Pnt 3801 3732 Pnt 2458 3752 Pnt 2289 3744 Pnt 2527 3773 Pnt 2640 3769 Pnt 2649 3742 Pnt 3006 3745 Pnt 2663 3816 Pnt 3631 3744 Pnt 2625 3735 Pnt 2790 3741 Pnt 3303 3744 Pnt 2468 3756 Pnt 2861 3745 Pnt 2613 3740 Pnt 2444 3737 Pnt 2506 3748 Pnt 3536 3745 Pnt 2797 3746 Pnt 2384 3735 Pnt 2370 3746 Pnt 2907 3737 Pnt 2578 3788 Pnt 3012 3788 Pnt 2779 3733 Pnt 2330 3748 Pnt 1828 3781 Pnt 2156 3760 Pnt 3215 3754 Pnt 3046 3739 Pnt 2934 3778 Pnt 2846 3740 Pnt 3345 3739 Pnt 2573 2630 Pnt 3412 3734 Pnt 2437 3754 Pnt 3176 3737 Pnt 2681 3749 Pnt 2492 3737 Pnt 2228 3749 Pnt 2839 3737 Pnt 2494 3736 Pnt 3096 3739 Pnt 2980 2551 Pnt 2608 3749 Pnt 2622 3786 Pnt 3534 3745 Pnt 2810 3736 Pnt 2284 3735 Pnt 2053 3793 Pnt 3057 3741 Pnt 3882 3749 Pnt 2547 2727 Pnt 3294 2609 Pnt 2972 3751 Pnt 2759 3741 Pnt 2353 3744 Pnt 2592 3746 Pnt 2281 3823 Pnt 2724 3749 Pnt 2496 3783 Pnt 2210 3798 Pnt 2388 3738 Pnt 2442 3783 Pnt 2752 3741 Pnt 2896 3746 Pnt 2708 3759 Pnt 2964 3744 Pnt 2439 3746 Pnt 2617 3755 Pnt 2460 3750 Pnt 2496 3818 Pnt 3766 3761 Pnt 3156 3738 Pnt 2336 3747 Pnt 2636 3758 Pnt 3053 3737 Pnt 2482 3733 Pnt 2791 3733 Pnt 2869 3737 Pnt 2454 3775 Pnt 2570 3736 Pnt 3610 3743 Pnt 3284 3737 Pnt 2224 3756 Pnt 2793 3737 Pnt 2443 3747 Pnt 2447 3740 Pnt 2902 3742 Pnt 2123 3769 Pnt 2700 3812 Pnt 2135 3757 Pnt 2760 2428 Pnt 3027 3744 Pnt 2556 3741 Pnt 2893 3738 Pnt 2184 3737 Pnt 2057 3762 Pnt 2357 3737 Pnt 2688 3734 Pnt 2459 3737 Pnt 2862 3739 Pnt 3053 3746 Pnt 2875 3750 Pnt 3247 2746 Pnt 2426 3784 Pnt 2033 3758 Pnt 3633 3739 Pnt 2570 2667 Pnt 2121 3735 Pnt 2260 3736 Pnt 2957 3742 Pnt 3010 3738 Pnt 2702 3740 Pnt 2579 3792 Pnt 2363 3790 Pnt 2706 3776 Pnt 3514 3749 Pnt 2377 3749 Pnt 2653 3768 Pnt 2826 3746 Pnt 3324 3742 Pnt 2105 3774 Pnt 4109 3750 Pnt 3049 3749 Pnt 2577 3734 Pnt 2711 3741 Pnt 2587 3740 Pnt 2593 3756 Pnt 2096 3764 Pnt 2259 3799 Pnt 2015 3765 Pnt 2868 3741 Pnt 3537 3784 Pnt 2590 3737 Pnt 1780 3733 Pnt 2715 3750 Pnt 2543 3742 Pnt 2646 3787 Pnt 2165 3810 Pnt 2410 3749 Pnt 3119 3749 Pnt 2590 3753 Pnt 2270 3796 Pnt 2009 3789 Pnt 1871 3773 Pnt 1972 3738 Pnt 2946 3745 Pnt 2158 3741 Pnt 2729 3746 Pnt 2773 3740 Pnt 2165 3736 Pnt 2703 3744 Pnt 2574 3742 Pnt 2693 3761 Pnt 2303 3748 Pnt 2787 3777 Pnt 2793 3753 Pnt 2442 3751 Pnt 2858 3755 Pnt 3726 2578 Pnt 2743 3736 Pnt 2553 3756 Pnt 3491 3777 Pnt 2474 3743 Pnt 2356 3761 Pnt 2818 3735 Pnt 2525 3744 Pnt 1895 3739 Pnt 3366 2850 Pnt 3108 3739 Pnt 2580 3742 Pnt 2985 3754 Pnt 2269 3744 Pnt 2846 3755 Pnt 2754 3738 Pnt 2499 3740 Pnt 3316 3742 Pnt 2151 3790 Pnt 2952 3740 Pnt 2371 3741 Pnt 2181 3734 Pnt 2629 3736 Pnt 2485 2682 Pnt 2546 3749 Pnt 3316 3743 Pnt 2959 3746 Pnt 3007 3763 Pnt 2338 3745 Pnt 2947 3740 Pnt 2761 3743 Pnt 3026 3746 Pnt 2218 3797 Pnt 2094 3761 Pnt 2717 3741 Pnt 2270 3754 Pnt 2137 3813 Pnt 2118 3746 Pnt 2145 3793 Pnt 2371 3753 Pnt 3139 3741 Pnt 2252 3743 Pnt 2437 3770 Pnt 2890 3794 Pnt 2285 3766 Pnt 2357 3801 Pnt 2589 3770 Pnt 3471 3764 Pnt 3113 3764 Pnt 3015 3753 Pnt 2938 3739 Pnt 3057 3741 Pnt 2764 3738 Pnt 1833 3788 Pnt 2857 3742 Pnt 2696 3758 Pnt 2871 3752 Pnt 2936 3775 Pnt 3320 3734 Pnt 3321 3746 Pnt 2925 3747 Pnt 3119 3742 Pnt 2462 3756 Pnt 2487 3739 Pnt 2122 3785 Pnt 2679 3737 Pnt 2570 3773 Pnt 2519 3741 Pnt 3378 3742 Pnt 2824 3753 Pnt 2604 3778 Pnt 2363 3743 Pnt 3003 3746 Pnt 2545 3794 Pnt 2545 3744 Pnt 3096 3762 Pnt 3058 3743 Pnt 3452 3753 Pnt 2976 3807 Pnt 2656 3746 Pnt 3194 3751 Pnt 2649 3741 Pnt 2849 3807 Pnt 2717 3751 Pnt 2361 3779 Pnt 2156 3741 Pnt 2577 3794 Pnt 2622 3746 Pnt 3038 3741 Pnt 2648 3741 Pnt 3173 3747 Pnt 2311 3767 Pnt 2655 3768 Pnt 2389 3735 Pnt 2600 3735 Pnt 2718 3757 Pnt 3473 3742 Pnt 2256 3744 Pnt 2503 3803 Pnt 2782 3757 Pnt 2190 3792 Pnt 2727 3754 Pnt 2747 3742 Pnt 4224 3756 Pnt 2429 3744 Pnt 2957 3739 Pnt 2866 3756 Pnt 3100 3756 Pnt 2471 3750 Pnt 3181 3744 Pnt 3140 3766 Pnt 2365 3792 Pnt 3380 2615 Pnt 3021 3746 Pnt 3367 3735 Pnt 2768 3897 Pnt 2527 3768 Pnt 2528 3742 Pnt 3442 3746 Pnt 2305 3755 Pnt 2661 3738 Pnt 2496 3758 Pnt 2152 3788 Pnt 2397 3788 Pnt 3120 3742 Pnt 2524 3745 Pnt 2485 3792 Pnt 2557 3741 Pnt 2853 3742 Pnt 3723 3740 Pnt 2074 3796 Pnt 2404 3763 Pnt 3252 3796 Pnt 2350 3744 Pnt 2855 3755 Pnt 3099 3795 Pnt 2970 3741 Pnt 2702 3742 Pnt 2531 3751 Pnt 3122 3829 Pnt 2314 3779 Pnt 3027 3739 Pnt 2549 3770 Pnt 3126 3743 Pnt 3486 3744 Pnt 2069 3750 Pnt 2529 3769 Pnt 3213 3747 Pnt 3091 3744 Pnt 2124 3752 Pnt 2135 3738 Pnt 2955 3754 Pnt 2733 3749 Pnt 2528 3805 Pnt 2792 3747 Pnt 3198 3745 Pnt 2394 3742 Pnt 2317 3764 Pnt 3113 3750 Pnt 2770 3753 Pnt 2408 3757 Pnt 2481 3742 Pnt 2432 3780 Pnt 2875 3742 Pnt 2085 3783 Pnt 2345 3738 Pnt 2654 3765 Pnt 2994 3815 Pnt 2311 3748 Pnt 3393 2662 Pnt 2853 3781 Pnt 3124 2695 Pnt 2728 3758 Pnt 2256 3772 Pnt 3322 3781 Pnt 2577 3763 Pnt 2938 3744 Pnt 3729 3749 Pnt 2819 3752 Pnt 2539 3801 Pnt 2151 3817 Pnt 2236 3782 Pnt 3333 3757 Pnt 2623 3735 Pnt 2125 3767 Pnt 2290 3740 Pnt 3635 3752 Pnt 3220 3742 Pnt 2932 3738 Pnt 3145 3741 Pnt 3517 3747 Pnt 3070 3738 Pnt 2386 3744 Pnt 2451 2500 Pnt 2476 3765 Pnt 2080 3774 Pnt 2433 3739 Pnt 2860 3771 Pnt 3064 3744 Pnt 2164 3755 Pnt 2649 3736 Pnt 3084 3786 Pnt 2320 3775 Pnt 2481 3739 Pnt 2594 3753 Pnt 2353 3780 Pnt 3239 3752 Pnt 2511 3748 Pnt 3099 3748 Pnt 2081 3785 Pnt 2789 3753 Pnt 2564 3754 Pnt 2031 3763 Pnt 2418 3740 Pnt 3513 3754 Pnt 2661 3742 Pnt 2581 3751 Pnt 2434 3769 Pnt 3060 3733 Pnt 2594 3745 Pnt 2474 3741 Pnt 2491 3770 Pnt 2411 3748 Pnt 1938 3745 Pnt 2775 3740 Pnt 2473 2578 Pnt 2527 3746 Pnt 2357 3762 Pnt 1857 3779 Pnt 2643 3744 Pnt 2726 3735 Pnt 2808 3744 Pnt 3178 3751 Pnt 3010 3778 Pnt 2763 2499 Pnt 2597 3738 Pnt 3467 2561 Pnt 2946 3745 Pnt 2706 3751 Pnt 2754 3753 Pnt 3080 2716 Pnt 2678 3766 Pnt 2307 3737 Pnt 2857 3755 Pnt 2520 3755 Pnt 2104 3748 Pnt 2440 3752 Pnt 3577 3737 Pnt 2475 3738 Pnt 2541 3780 Pnt 2118 3745 Pnt 2787 3746 Pnt 2335 3748 Pnt 2607 3748 Pnt 1921 3761 Pnt 2009 3778 Pnt 2029 3810 Pnt 2918 3754 Pnt 2651 3736 Pnt 2933 3750 Pnt 2821 3740 Pnt 2714 3750 Pnt 2455 3787 Pnt 2707 3741 Pnt 3109 3749 Pnt 4173 3748 Pnt 2513 3746 Pnt 2699 3822 Pnt 1991 3740 Pnt 2097 3822 Pnt 2106 3772 Pnt 3186 3748 Pnt 2431 3745 Pnt 3466 3769 Pnt 2930 3761 Pnt 2654 3736 Pnt 2943 3745 Pnt 2316 3761 Pnt 2506 3743 Pnt 2923 3734 Pnt 2711 3756 Pnt 3300 2533 Pnt 2326 3740 Pnt 2127 3823 Pnt 3108 3740 Pnt 2321 3762 Pnt 2153 3735 Pnt 2870 3736 Pnt 2575 3751 Pnt 3015 3759 Pnt 2790 3744 Pnt 2653 3745 Pnt 2789 3744 Pnt 2616 3743 Pnt 3405 3738 Pnt 2476 3787 Pnt 3551 3738 Pnt 3159 3744 Pnt 3495 3743 Pnt 2575 3741 Pnt 2913 3746 Pnt 2154 3769 Pnt 2537 3738 Pnt 2934 3744 Pnt 2598 3741 Pnt 3209 3746 Pnt 3038 3752 Pnt 3212 3738 Pnt 2736 3744 Pnt 3058 3812 Pnt 2441 3773 Pnt 2421 3757 Pnt 1943 3774 Pnt 2597 3769 Pnt 2339 3775 Pnt 3196 3751 Pnt 2279 3761 Pnt 2182 3843 Pnt 2895 3744 Pnt 2475 3733 Pnt 2321 3742 Pnt 2439 3787 Pnt 3194 3741 Pnt 2160 3810 Pnt 3118 3768 Pnt 2907 3739 Pnt 2640 3744 Pnt 4061 3744 Pnt 3808 3810 Pnt 2477 3734 Pnt 2436 3801 Pnt 2576 3804 Pnt 2219 3751 Pnt 3054 3784 Pnt 2714 3739 Pnt 2382 3744 Pnt 3349 3749 Pnt 3069 3745 Pnt 2450 3736 Pnt 3039 3749 Pnt 2911 3754 Pnt 2701 3746 Pnt 3426 3744 Pnt 2502 3759 Pnt 3117 3752 Pnt 2703 3742 Pnt 3233 3757 Pnt 2387 3739 Pnt 3013 3737 Pnt 2396 3761 Pnt 2477 3741 Pnt 2196 3746 Pnt 3092 3804 Pnt 2288 3747 Pnt 3507 3756 Pnt 2028 3760 Pnt 2718 3742 Pnt 2191 3735 Pnt 3059 3748 Pnt 2938 3737 Pnt 2430 3734 Pnt 2916 3758 Pnt 2543 3753 Pnt 2390 3732 Pnt 1942 3804 Pnt 2284 3741 Pnt 2942 3747 Pnt 2104 3748 Pnt 2756 3742 Pnt 3718 3740 Pnt 2460 3756 Pnt 2580 3737 Pnt 3142 3748 Pnt 2585 3738 Pnt 2832 3737 Pnt 2614 3787 Pnt 2670 3748 Pnt 3060 3757 Pnt 3104 3752 Pnt 3142 3739 Pnt 2093 3775 Pnt 2371 3737 Pnt 2798 3774 Pnt 2771 3738 Pnt 2380 3749 Pnt 1975 3745 Pnt 2052 3759 Pnt 2285 3793 Pnt 2705 3736 Pnt 3068 3763 Pnt 2314 3738 Pnt 2971 3780 Pnt 2647 3748 Pnt 2655 3773 Pnt 3095 3743 Pnt 2932 3736 Pnt 3523 3755 Pnt 2055 3786 Pnt 2818 3737 Pnt 2855 3740 Pnt 2700 3742 Pnt 2554 3751 Pnt 2473 3736 Pnt 2457 3747 Pnt 3028 3740 Pnt 2518 3783 Pnt 3185 3744 Pnt 2543 3770 Pnt 1988 3797 Pnt 2770 3738 Pnt 3835 3745 Pnt 2840 3733 Pnt 3072 3754 Pnt 2821 3749 Pnt 1918 3784 Pnt 2747 3741 Pnt 3466 3733 Pnt 3101 3748 Pnt 2937 3747 Pnt 2368 3768 Pnt 2976 3784 Pnt 2006 3758 Pnt 2743 3737 Pnt 2410 3733 Pnt 3169 3747 Pnt 2363 3740 Pnt 2874 3737 Pnt 2822 3743 Pnt 2818 3742 Pnt 3064 3749 Pnt 3542 3743 Pnt 2800 3740 Pnt 2532 3790 Pnt 2518 3737 Pnt 2700 3749 Pnt 2412 3744 Pnt 2941 3736 Pnt 2733 3737 Pnt 2523 3774 Pnt 2746 3741 Pnt 4053 3736 Pnt 3040 3763 Pnt 1868 3751 Pnt 2875 3739 Pnt 3409 3784 Pnt 2724 3755 Pnt 2430 3743 Pnt 3066 3743 Pnt 2197 3801 Pnt 2622 3760 Pnt 3192 3749 Pnt 2950 3751 Pnt 2485 3746 Pnt 4122 2944 Pnt 2831 3739 Pnt 2243 3810 Pnt 2457 3768 Pnt 2836 3744 Pnt 3362 3748 Pnt 2670 3744 Pnt 2665 3746 Pnt 2542 3739 Pnt 2542 3742 Pnt 3005 3746 Pnt 2954 3741 Pnt 3090 2839 Pnt 2440 3740 Pnt 3306 2661 Pnt 2564 3739 Pnt 2406 3749 Pnt 2091 3761 Pnt 2593 3749 Pnt 2296 3799 Pnt 3290 2616 Pnt 2470 3744 Pnt 2526 3792 Pnt 3115 3818 Pnt 2387 3741 Pnt 2586 3749 Pnt 3348 3770 Pnt 3051 3756 Pnt 2581 3740 Pnt 2268 3797 Pnt 2353 3737 Pnt 3311 3770 Pnt 3276 3755 Pnt 2137 3738 Pnt 4133 2533 Pnt 2743 3750 Pnt 3318 3750 Pnt 2437 3813 Pnt 2997 3738 Pnt 3341 3813 Pnt 2472 3777 Pnt 2681 3753 Pnt 2603 3742 Pnt 2680 3745 Pnt 2660 3741 Pnt 3027 3746 Pnt 3636 2833 Pnt 2429 3736 Pnt 3222 3752 Pnt 2495 3747 Pnt 2613 3756 Pnt 2511 3741 Pnt 2319 3742 Pnt 3303 2762 Pnt 2903 3746 Pnt 2715 3741 Pnt 2487 3742 Pnt 2989 3741 Pnt 2540 3744 Pnt 2571 3739 Pnt 2702 3742 Pnt 2802 3740 Pnt 2312 3745 Pnt 2961 3739 Pnt 2974 3741 Pnt 2908 3739 Pnt 2884 3743 Pnt 2637 3761 Pnt 2799 3758 Pnt 3047 3740 Pnt 2900 3745 Pnt 2868 3756 Pnt 3421 3735 Pnt 3125 3751 Pnt 1992 3739 Pnt 2989 3746 Pnt 1921 3794 Pnt 3455 2686 Pnt 2568 3770 Pnt 3189 3739 Pnt 2132 3794 Pnt 3853 3743 Pnt 2557 3738 Pnt 2853 3737 Pnt 2623 3756 Pnt 2341 3748 Pnt 2227 3740 Pnt 3077 3754 Pnt 2726 3754 Pnt 2547 3736 Pnt 2700 3744 Pnt 2410 3738 Pnt 2327 3764 Pnt 2412 3786 Pnt 2587 3735 Pnt 2724 3740 Pnt 2492 3747 Pnt 2976 3749 Pnt 3043 3788 Pnt 2134 3729 Pnt 2732 3738 Pnt 3075 3788 Pnt 2367 3745 Pnt 2816 3756 Pnt 2542 3779 Pnt 2239 3739 Pnt 3130 3739 Pnt 2938 3794 Pnt 2784 3732 Pnt 3312 3745 Pnt 2438 3777 Pnt 2812 3773 Pnt 2734 3742 Pnt 2696 3749 Pnt 2257 3742 Pnt 3108 3741 Pnt 2588 3759 Pnt 3249 3743 Pnt 2414 3794 Pnt 2184 3767 Pnt 2931 3776 Pnt 3769 3753 Pnt 3053 3757 Pnt 2175 3807 Pnt 2837 3746 Pnt 2741 3743 Pnt 3751 3742 Pnt 2018 3788 Pnt 2566 3803 Pnt 2389 3795 Pnt 2944 3743 Pnt 2694 3805 Pnt 2346 3744 Pnt 2314 3751 Pnt 3065 3751 Pnt 2710 3768 Pnt 3467 3737 Pnt 3925 3749 Pnt 3666 2749 Pnt 3036 3755 Pnt 2766 3739 Pnt 2752 3739 Pnt 2062 3803 Pnt 2340 3741 Pnt 3293 3739 Pnt 2881 3749 Pnt 2779 3815 Pnt 2861 3742 Pnt 2663 3767 Pnt 2225 3749 Pnt 2934 3742 Pnt 3546 3742 Pnt 3510 3742 Pnt 3247 3749 Pnt 2532 3735 Pnt 3027 3757 Pnt 2871 3759 Pnt 2024 3897 Pnt 2713 3792 Pnt 2347 3777 Pnt 2506 3747 Pnt 3357 3744 Pnt 2780 3768 Pnt 2704 3801 Pnt 3198 3735 Pnt 2528 3752 Pnt 3131 3745 Pnt 3522 3743 Pnt 2473 3757 Pnt 2514 3792 Pnt 3490 3750 Pnt 3185 3745 Pnt 2995 3736 Pnt 2435 3788 Pnt 3139 3755 Pnt 2302 3735 Pnt 2282 3755 Pnt 2353 3738 Pnt 2994 3755 Pnt 2254 3745 Pnt 2591 3770 Pnt 2475 3750 Pnt 2270 3740 Pnt 2278 3763 Pnt 2893 3740 Pnt 2050 3796 Pnt 2369 3742 Pnt 2387 3732 Pnt 2520 3739 Pnt 2134 3750 Pnt 2709 3762 Pnt 2789 2494 Pnt 3069 3748 Pnt 2799 3740 Pnt 2873 3738 Pnt 2471 3766 Pnt 3131 3740 Pnt 1908 3770 Pnt 3228 3738 Pnt 2449 3737 Pnt 3323 3740 Pnt 4059 3743 Pnt 3221 3747 Pnt 2485 3758 Pnt 2554 3743 Pnt 2438 3752 Pnt 2409 3749 Pnt 2861 3792 Pnt 2783 3741 Pnt 2162 3783 Pnt 2117 3805 Pnt 2836 3739 Pnt 3007 3742 Pnt 2665 3753 Pnt 2267 3829 Pnt 2684 3757 Pnt 2459 3742 Pnt 2320 3765 Pnt 3786 3743 Pnt 2356 3778 Pnt 2612 3744 Pnt 2289 3752 Pnt 3122 3745 Pnt 2851 3745 Pnt 3158 2655 Pnt 3007 3739 Pnt 2539 3742 Pnt 3042 3744 Pnt 2483 3756 Pnt 2314 3757 Pnt 2859 3744 Pnt 2291 3739 Pnt 2182 3753 Pnt 2301 3738 Pnt 2962 3753 Pnt 2872 3744 Pnt 2486 3769 Pnt 2981 3751 Pnt 3413 3783 Pnt 2808 3739 Pnt 2758 3781 Pnt 2429 3773 Pnt 3044 3757 Pnt 2701 3733 Pnt 2940 3771 Pnt 2809 3758 Pnt 2285 3743 Pnt 2584 3740 Pnt 2048 3817 Pnt 2897 3754 Pnt 3540 3743 Pnt 2137 3748 Pnt 2981 3754 Pnt 2136 3772 Pnt 2477 3783 Pnt 2528 3736 Pnt 2486 3768 Pnt 2793 3747 Pnt 2024 3809 Pnt 3412 3732 Pnt 2073 3761 Pnt 2922 3738 Pnt 2776 3742 Pnt 2783 3741 Pnt 2817 3739 Pnt 2695 3747 Pnt 3071 3758 Pnt 2961 3746 Pnt 2137 3738 Pnt 2972 3746 Pnt 2605 3750 Pnt 2977 3747 Pnt 2605 3763 Pnt 2615 3741 Pnt 2517 3755 Pnt 2747 3770 Pnt 2292 3758 Pnt 3208 3745 Pnt 2487 3778 Pnt 2686 3784 Pnt 2994 3748 Pnt 2377 3749 Pnt 2790 3778 Pnt 2542 3748 Pnt 2531 3748 Pnt 2741 3749 Pnt 2968 3741 Pnt 1853 3775 Pnt 3484 3742 Pnt 2669 3752 Pnt 3028 3741 Pnt 2645 3752 Pnt 3138 3746 Pnt 2346 3745 Pnt 2892 3741 Pnt 2644 3754 Pnt 3358 2750 Pnt 2958 3798 Pnt 2792 3743 Pnt 2857 3737 Pnt 2502 3765 Pnt 2585 3769 Pnt 3259 3746 Pnt 3117 3743 Pnt 2842 3764 Pnt 2650 3751 Pnt 2309 3738 Pnt 2700 3751 Pnt 3615 3744 Pnt 2601 3753 Pnt 2595 3785 Pnt 4101 3740 Pnt 2527 3739 Pnt 2258 3759 Pnt 2979 3739 Pnt 1957 3753 Pnt 2238 3757 Pnt 2617 3762 Pnt 2612 3744 Pnt 2662 3753 Pnt 2637 3742 Pnt 2063 3864 Pnt 2402 3782 Pnt 3486 2763 Pnt 2372 3746 Pnt 3489 3804 Pnt 3295 3766 Pnt 2883 3736 Pnt 3192 3743 Pnt 2370 3737 Pnt 2121 3810 Pnt 2773 3784 Pnt 3157 2596 Pnt 3027 3735 Pnt 2826 3748 Pnt 3114 3752 Pnt 2966 3745 Pnt 2827 3733 Pnt 4038 3760 Pnt 2672 3738 Pnt 1881 3787 Pnt 2371 3778 Pnt 2947 3746 Pnt 3001 3746 Pnt 3387 3749 Pnt 3601 3742 Pnt 3001 3755 Pnt 2922 3750 Pnt 2609 3768 Pnt 2587 3736 Pnt 2591 3753 Pnt 3126 3751 Pnt 2928 3754 Pnt 3841 3744 Pnt 2890 3736 Pnt 2649 3744 Pnt 3825 3753 Pnt 2819 3759 Pnt 2334 3808 Pnt 2794 3803 Pnt 2108 3745 Pnt 2809 3738 Pnt 2563 3748 Pnt 3042 3736 Pnt 2351 3793 Pnt 3242 3751 Pnt 2622 3746 Pnt 2829 3738 Pnt 2973 3747 Pnt 2628 3843 Pnt 3109 3747 Pnt 2413 3740 Pnt 2371 3742 Pnt 4109 3752 Pnt 2339 3787 Pnt 2462 3748 Pnt 2833 3740 Pnt 2564 3761 Pnt 2964 3737 Pnt 2756 3746 Pnt 2280 3748 Pnt 3060 3752 Pnt 2434 3737 Pnt 2361 3756 Pnt 2188 3804 Pnt 2910 3740 Pnt 2338 3736 Pnt 2168 3822 Pnt 3325 3758 Pnt 2339 3780 Pnt 3118 3744 Pnt 2975 3751 Pnt 2760 3775 Pnt 2294 3747 Pnt 2631 3757 Pnt 2901 3747 Pnt 2616 3744 Pnt 2652 3749 Pnt 3051 3744 Pnt 3168 3769 Pnt 3712 3751 Pnt 3386 3745 Pnt 2477 3773 Pnt 2332 3738 Pnt 2205 3760 Pnt 2971 3749 Pnt 2350 3735 Pnt 3520 3757 Pnt 2616 3758 Pnt 2390 3744 Pnt 2005 3786 Pnt 2951 3749 Pnt 2462 3734 Pnt 2273 3740 Pnt 2626 3822 Pnt 2519 3748 Pnt 3109 3746 Pnt 3006 3734 Pnt 2084 3755 Pnt 2821 3748 Pnt 3239 3764 Pnt 3239 3745 Pnt 2771 3737 Pnt 2665 3740 Pnt 3279 3748 Pnt 3271 3738 Pnt 2649 3774 Pnt 3202 3764 Pnt 3251 3747 Pnt 3051 3747 Pnt 2528 3770 Pnt 3181 3746 Pnt 2862 3748 Pnt 2838 3773 Pnt 2550 3739 Pnt 2575 3761 Pnt 3411 3740 Pnt 2593 3746 Pnt 2900 3795 Pnt 3273 3783 Pnt 2605 3743 Pnt 2610 3736 Pnt 2546 2584 Pnt 2209 3750 Pnt 2719 3773 Pnt 2760 3738 Pnt 2892 3741 Pnt 2885 3757 Pnt 1906 3797 Pnt 2951 3752 Pnt 2539 3792 Pnt 2715 3737 Pnt 2859 3738 Pnt 2599 3741 Pnt 2683 3737 Pnt 2559 3743 Pnt 2393 3738 Pnt 2675 3740 Pnt 2243 3741 Pnt 2661 3745 Pnt 2778 3747 Pnt 2855 3739 Pnt 2580 3758 Pnt 2066 3784 Pnt 3615 3738 Pnt 2374 3740 Pnt 1929 3758 Pnt 1989 3763 Pnt 3102 3739 Pnt 2531 3754 Pnt 2980 3743 Pnt 2914 3754 Pnt 2404 3742 Pnt 3689 3744 Pnt 3154 3766 Pnt 2800 3748 Pnt 2742 3740 Pnt 2590 3741 Pnt 2683 3749 Pnt 2291 2754 Pnt 2542 3732 Pnt 2931 3737 Pnt 2795 3749 Pnt 2401 3737 Pnt 3040 2314 Pnt 3560 3743 Pnt 2496 3753 Pnt 2539 3774 Pnt 2330 3740 Pnt 3001 3739 Pnt 2648 3739 Pnt 2371 3737 Pnt 3442 3736 Pnt 3106 3741 Pnt 3089 3751 Pnt 3103 3769 Pnt 2272 3801 Pnt 2414 3744 Pnt 2361 3768 Pnt 2327 3736 Pnt 2569 3737 Pnt 2610 3733 Pnt 2199 3751 Pnt 3200 3763 Pnt 3154 3739 Pnt 2619 3742 Pnt 3285 3744 Pnt 2037 3823 Pnt 2724 3801 Pnt 3572 3749 Pnt 2799 3742 Pnt 3048 3743 Pnt 2202 3784 Pnt 3033 3801 Pnt 2472 3744 Pnt 2565 3806 Pnt 2463 3739 Pnt 2754 3743 Pnt 2813 3739 Pnt 3201 3783 Pnt 2365 3749 Pnt 3027 3747 Pnt 2958 3742 Pnt 2212 3735 Pnt 2230 3745 Pnt 3640 2595 Pnt 3103 3746 Pnt 2645 3746 Pnt 3046 3743 Pnt 2886 3792 Pnt 2562 3741 Pnt 2844 3812 Pnt 3299 3748 Pnt 3062 3760 Pnt 2552 3749 Pnt 2496 3818 Pnt 4054 3745 Pnt 2116 3761 Pnt 2594 3743 Pnt 2803 3753 Pnt 2714 3749 Pnt 3060 3738 Pnt 3155 3756 Pnt 3018 3753 Pnt 2631 3761 Pnt 2631 3745 Pnt 3003 3746 Pnt 2481 3777 Pnt 4050 3748 Pnt 1848 3787 Pnt 2978 3736 Pnt 3099 3745 Pnt 2639 3758 Pnt 2226 3748 Pnt 2569 3768 Pnt 3613 3758 Pnt 3998 3761 Pnt 2957 3743 Pnt 3546 3752 Pnt 2512 3756 Pnt 3175 2639 Pnt 2763 3750 Pnt 2979 3740 Pnt 2848 3741 Pnt 2613 3756 Pnt 3089 3750 Pnt 2614 3744 Pnt 2421 3740 Pnt 2342 3737 Pnt 2050 3751 Pnt 3152 2489 Pnt 2561 3742 Pnt 4074 3768 Pnt 2518 3801 Pnt 3331 3744 Pnt 2981 3750 Pnt 2743 3751 Pnt 2494 3742 Pnt 2764 3740 Pnt 2649 3757 Pnt 2502 3797 Pnt 2417 3755 Pnt 1926 3813 Pnt 2993 3738 Pnt 2631 3756 Pnt 2844 3759 Pnt 2510 3730 Pnt 2829 3766 Pnt 3195 3741 Pnt 2790 3750 Pnt 2794 3794 Pnt 3046 3740 Pnt 2804 3738 Pnt 2409 3749 Pnt 2535 3750 Pnt 3151 3740 Pnt 2796 3741 Pnt 2663 3742 Pnt 2721 3753 Pnt 2507 3744 Pnt 2720 3740 Pnt 3562 3763 Pnt 2575 3744 Pnt 2964 3746 Pnt 3173 3737 Pnt 2836 3748 Pnt 3538 2546 Pnt 3091 3744 Pnt 3508 3737 Pnt 2541 3739 Pnt 2996 3747 Pnt 3287 3762 Pnt 2878 3773 Pnt 2723 3770 Pnt 2863 3752 Pnt 2578 3748 Pnt 2695 3743 Pnt 2667 3739 Pnt 2467 3796 Pnt 3108 3756 Pnt 2270 3742 Pnt 2497 3754 Pnt 2746 3802 Pnt 2469 3761 Pnt 2992 3743 Pnt 2982 3778 Pnt 2786 3744 Pnt 2856 3747 Pnt 2853 3747 Pnt 2972 3741 Pnt 3124 3745 Pnt 2464 3742 Pnt 2295 3741 Pnt 2859 3736 Pnt 2321 3786 Pnt 3397 3741 Pnt 3060 3754 Pnt 2301 3813 Pnt 2641 3737 Pnt 3574 3756 Pnt 2658 3776 Pnt 3868 2723 Pnt 2836 3748 Pnt 2121 3746 Pnt 2278 3793 Pnt 1840 3794 Pnt 3522 3742 Pnt 3129 3746 Pnt 2784 3764 Pnt 3007 3738 Pnt 3311 3748 Pnt 3138 2680 Pnt 2219 3793 Pnt 3081 3742 Pnt 2738 3737 Pnt 2617 3753 Pnt 2283 3786 Pnt 3051 3749 Pnt 2431 3807 Pnt 3080 3753 Pnt 3039 3745 Pnt 2788 3764 Pnt 2756 3745 Pnt 2754 3747 Pnt 2736 3777 Pnt 3030 3764 Pnt 3261 3777 Pnt 2965 3738 Pnt 2839 3788 Pnt 2460 3750 Pnt 2786 3750 Pnt 2741 3746 Pnt 3320 3776 Pnt 2939 3760 Pnt 2368 3740 Pnt 2896 3745 Pnt 3049 3738 Pnt 2846 3801 Pnt 2899 3742 Pnt 2211 3763 Pnt 2344 3741 Pnt 2361 3745 Pnt 2036 3757 Pnt 2363 3752 Pnt 2991 3764 Pnt 2452 3736 Pnt 3180 3740 Pnt 2704 3792 Pnt 2363 3749 Pnt 2925 3742 Pnt 4106 2492 Pnt 2329 3807 Pnt 2502 3738 Pnt 2095 3752 Pnt 2831 3794 Pnt 2217 3759 Pnt 2923 3742 Pnt 2700 3743 Pnt 2641 3767 Pnt 1727 3766 Pnt 2843 3807 Pnt 2787 3749 Pnt 2691 3741 Pnt 2173 3745 Pnt 4264 3758 Pnt 3278 3765 Pnt 3140 3740 Pnt 2789 3744 Pnt 3418 3748 Pnt 2712 3742 Pnt 2849 3772 Pnt 2536 3750 Pnt 3098 3745 Pnt 1990 3751 Pnt 3395 3736 Pnt 3550 3747 Pnt 2888 1044 Pnt 3373 3744 Pnt 2892 3738 Pnt 2905 3744 Pnt 3510 2564 Pnt 2531 3752 Pnt 3475 3755 Pnt 4116 3747 Pnt 2728 3751 Pnt 2867 3744 Pnt 2770 3746 Pnt 2440 3752 Pnt 3605 2740 Pnt 3039 2712 Pnt 2099 3827 Pnt 2605 3741 Pnt 2862 3745 Pnt 2582 3732 Pnt 2044 3897 Pnt 3743 3745 Pnt 2835 3744 Pnt 2338 3769 Pnt 3184 3732 Pnt 2966 3757 Pnt 2359 3739 Pnt 2460 3788 Pnt 4226 3756 Pnt 3324 3751 Pnt 2861 3738 Pnt 2666 3739 Pnt 2512 3739 Pnt 2586 3795 Pnt 3544 2636 Pnt 3750 2927 Pnt 3851 3751 Pnt 2464 3770 Pnt 3922 3746 Pnt 2497 3735 Pnt 3022 3749 Pnt 2571 3733 Pnt 2661 3755 Pnt 3229 3750 Pnt 2966 3744 Pnt 2874 3767 Pnt 2382 3747 Pnt 2763 3747 Pnt 2620 3743 Pnt 2755 3750 Pnt 3053 3750 Pnt 2508 3767 Pnt 2230 3742 Pnt 4055 3748 Pnt 2620 3768 Pnt 1938 3739 Pnt 1960 3764 Pnt 2483 3757 Pnt 2795 3768 Pnt 1769 3773 Pnt 3170 3737 Pnt 2624 3736 Pnt 2147 3801 Pnt 2636 3758 Pnt 2262 3755 Pnt 2500 3816 Pnt 3032 3748 Pnt 2609 3762 Pnt 2885 3757 Pnt 2343 3809 Pnt 3193 3816 Pnt 2304 3771 Pnt 2991 3750 Pnt 2989 3757 Pnt 2862 3747 Pnt 2600 3741 Pnt 3275 2743 Pnt 2666 3735 Pnt 2954 3742 Pnt 2632 3743 Pnt 2041 3783 Pnt 3558 3742 Pnt 2929 3741 Pnt 2602 3758 Pnt 2464 3784 Pnt 2139 3810 Pnt 2089 3796 Pnt 3178 3741 Pnt 2313 3748 Pnt 2820 3740 Pnt 2659 3736 Pnt 2688 2734 Pnt 2342 3741 Pnt 2977 3785 Pnt 2053 3742 Pnt 2171 3738 Pnt 3896 2742 Pnt 3791 3744 Pnt 2657 3792 Pnt 2646 3760 Pnt 2087 3775 Pnt 1970 3771 Pnt 2981 3808 Pnt 3073 3746 Pnt 2978 3760 Pnt 2302 3779 Pnt 2544 3743 Pnt 2869 3753 Pnt 2715 3809 Pnt 2330 3758 Pnt 2754 3803 Pnt 2892 3738 Pnt 2472 3743 Pnt 3202 3743 Pnt 3037 3742 Pnt 2471 3741 Pnt 2750 3814 Pnt 2412 3765 Pnt 1819 3757 Pnt 2448 3748 Pnt 2059 3778 Pnt 2572 3745 Pnt 2957 3750 Pnt 2610 3778 Pnt 2647 3737 Pnt 3428 3750 Pnt 3251 3778 Pnt 2560 3755 Pnt 2524 3733 Pnt 3327 3740 Pnt 2642 3742 Pnt 2591 3741 Pnt 3291 3739 Pnt 2729 2583 Pnt 3686 3780 Pnt 2893 3746 Pnt 2734 3739 Pnt 3067 3757 Pnt 2529 3762 Pnt 2830 3742 Pnt 3592 3764 Pnt 2770 3742 Pnt 2727 3778 Pnt 3418 2565 Pnt 3112 3742 Pnt 2278 3778 Pnt 2063 3757 Pnt 2948 3744 Pnt 2388 3744 Pnt 2226 3756 Pnt 3006 2769 Pnt 2733 3740 Pnt 3068 3745 Pnt 2833 3746 Pnt 2461 3739 Pnt 3016 3755 Pnt 2569 3751 Pnt 2146 3745 Pnt 2930 3749 Pnt 2673 3739 Pnt 2259 3745 Pnt 2962 3753 Pnt 2405 3776 Pnt 2549 3741 Pnt 2411 3742 Pnt 2828 3740 Pnt 2531 3763 Pnt 2563 3741 Pnt 3577 3741 Pnt 2529 3744 Pnt 2381 3750 Pnt 2832 3746 Pnt 3078 3768 Pnt 2103 3743 Pnt 2643 2773 Pnt 2575 3749 Pnt 3506 3750 Pnt 2374 3757 Pnt 2373 3740 Pnt 2553 3755 Pnt 2033 3753 Pnt 2269 3754 Pnt 2957 3736 Pnt 3578 3768 Pnt 2839 3739 Pnt 2834 3745 Pnt 2474 3757 Pnt 2621 3737 Pnt 3275 2665 Pnt 2880 3760 Pnt 2182 3743 Pnt 2440 3765 Pnt 2389 3765 Pnt 2723 2560 Pnt 2710 3782 Pnt 2136 3757 Pnt 3108 3744 Pnt 2657 3760 Pnt 3158 3737 Pnt 2878 3782 Pnt 2843 3757 Pnt 1932 3778 Pnt 3497 3745 Pnt 2740 2443 Pnt 2987 3750 Pnt 2746 3744 Pnt 2464 3757 Pnt 3405 3742 Pnt 2327 3759 Pnt 2281 3748 Pnt 3365 3740 Pnt 2660 3793 Pnt 2931 3772 Pnt 2181 3782 Pnt 3889 3745 Pnt 2818 3751 Pnt 2726 3761 Pnt 3210 3739 Pnt 2150 3778 Pnt 2978 3744 Pnt 4218 3758 Pnt 2718 3749 Pnt 2200 3843 Pnt 2732 3758 Pnt 2139 3748 Pnt 2872 3740 Pnt 2777 3740 Pnt 1930 3787 Pnt 2116 3762 Pnt 2635 3741 Pnt 3828 3741 Pnt 2595 3757 Pnt 2422 3742 Pnt 2385 3761 Pnt 3459 3733 Pnt 3341 3822 Pnt 2977 3737 Pnt 2614 3739 Pnt 2456 3750 Pnt 2729 3740 Pnt 2802 2762 Pnt 2714 3758 Pnt 2380 3749 Pnt 2497 3738 Pnt 2075 3804 Pnt 2358 3734 Pnt 3098 3740 Pnt 2158 3742 Pnt 2366 3736 Pnt 3481 3747 Pnt 2617 3766 Pnt 2675 3755 Pnt 3165 3739 Pnt 3384 3747 Pnt 2673 3736 Pnt 2789 3753 Pnt 2945 3756 Pnt 2629 3749 Pnt 2630 3780 Pnt 3019 3736 Pnt 2786 3925 Pnt 2735 3743 Pnt 2804 3784 Pnt 2903 3774 Pnt 2916 3738 Pnt 2428 3743 Pnt 2185 3748 Pnt 3355 3743 Pnt 2981 3743 Pnt 2871 3740 Pnt 2422 3748 Pnt 3221 3752 Pnt 2353 3749 Pnt 3342 3748 Pnt 2682 3737 Pnt 2218 3775 Pnt 3106 2992 Pnt 2782 3745 Pnt 3122 3741 Pnt 2754 3753 Pnt 2970 2602 Pnt 3017 3746 Pnt 3007 3753 Pnt 2540 3746 Pnt 3701 3746 Pnt 2382 3738 Pnt 2146 3780 Pnt 2721 2764 Pnt 2223 3743 Pnt 1906 3797 Pnt 3592 3752 Pnt 2743 2799 Pnt 3038 3758 Pnt 2418 3741 Pnt 3109 3741 Pnt 3061 3770 Pnt 3239 3746 Pnt 2484 3754 Pnt 2540 3786 Pnt 2950 3786 Pnt 2474 3735 Pnt 3227 3754 Pnt 2655 3737 Pnt 2506 3770 Pnt 3411 2674 Pnt 2424 3738 Pnt 2366 3804 Pnt 3221 3743 Pnt 2352 3748 Pnt 2323 3741 Pnt 2392 3864 Pnt 2719 3743 Pnt 2910 3791 Pnt 2628 3746 Pnt 2591 3735 Pnt 2434 3746 Pnt 3064 3744 Pnt 2605 3744 Pnt 1869 3823 Pnt 3111 3756 Pnt 3086 2578 Pnt 2411 3742 Pnt 2643 3776 Pnt 3387 3738 Pnt 2922 3754 Pnt 2962 3806 Pnt 2737 3752 Pnt 2404 3743 Pnt 2464 3790 Pnt 2569 3739 Pnt 2310 3759 Pnt 2318 3790 Pnt 3220 3734 Pnt 2632 2650 Pnt 2477 3744 Pnt 3071 3757 Pnt 3222 3740 Pnt 3018 3739 Pnt 2505 3751 Pnt 3027 3758 Pnt 3739 3769 Pnt 2797 3753 Pnt 2544 3748 Pnt 1875 3751 Pnt 2564 3734 Pnt 3148 3761 Pnt 2904 3745 Pnt 2912 3751 Pnt 3072 3765 Pnt 2512 3742 Pnt 3028 3743 Pnt 2736 3741 Pnt 2017 3786 Pnt 3576 2760 Pnt 2699 3745 Pnt 2907 3737 Pnt 2530 3746 Pnt 2894 3746 Pnt 3992 3784 Pnt 2458 3749 Pnt 3139 3740 Pnt 3571 3745 Pnt 3232 3747 Pnt 2248 3822 Pnt 3142 2545 Pnt 2406 3747 Pnt 2887 3749 Pnt 3900 3755 Pnt 2676 3744 Pnt 2435 3741 Pnt 2732 3747 Pnt 3011 3756 Pnt 2594 3742 Pnt 2190 3745 Pnt 2488 3749 Pnt 2289 3740 Pnt 3345 3783 Pnt 3053 3803 Pnt 2467 3744 Pnt 2580 3737 Pnt 1732 3755 Pnt 2624 3743 Pnt 3049 3738 Pnt 3355 3750 Pnt 2039 3751 Pnt 2805 3758 Pnt 3117 3743 Pnt 2698 3746 Pnt 3225 3742 Pnt 3043 3742 Pnt 2515 3784 Pnt 3675 2637 Pnt 3173 3742 Pnt 2428 3741 Pnt 2699 2734 Pnt 3091 3743 Pnt 2293 3773 Pnt 3161 3754 Pnt 2237 3801 Pnt 3844 3747 Pnt 2668 3804 Pnt 2353 3813 Pnt 2564 3749 Pnt 3596 3813 Pnt 2872 3801 Pnt 2784 3756 Pnt 2629 3781 Pnt 2689 3742 Pnt 2290 3792 Pnt 2882 3750 Pnt 2536 3734 Pnt 3427 3755 Pnt 2860 3750 Pnt 2667 3750 Pnt 2757 3739 Pnt 2583 3776 Pnt 2281 3741 Pnt 2205 3794 Pnt 2585 3742 Pnt 2521 3739 Pnt 2414 3742 Pnt 3752 3766 Pnt 3478 3766 Pnt 2962 3756 Pnt 3248 3757 Pnt 2737 3744 Pnt 2425 3802 Pnt 1841 3769 Pnt 3197 3766 Pnt 2535 3752 Pnt 2529 3741 Pnt 2406 3742 Pnt 2305 3813 Pnt 2761 3774 Pnt 2310 3761 Pnt 2671 3792 Pnt 2823 3746 Pnt 2471 3734 Pnt 3741 3792 Pnt 2545 3760 Pnt 2524 3749 Pnt 3241 3752 Pnt 2989 3746 Pnt 2774 3742 Pnt 3062 3744 Pnt 2756 3737 Pnt 2386 3737 Pnt 3324 3764 Pnt 2941 3741 Pnt 2848 3819 Pnt 2826 3737 Pnt 2420 3797 Pnt 2713 3753 Pnt 2431 3793 Pnt 2988 3755 Pnt 2882 3749 Pnt 2312 3791 Pnt 2819 3753 Pnt 2593 3749 Pnt 2237 3801 Pnt 3256 3743 Pnt 2415 3733 Pnt 2542 3744 Pnt 3198 3749 Pnt 2506 3745 Pnt 2323 3768 Pnt 3118 3743 Pnt 2772 3786 Pnt 2769 3746 Pnt 3494 3768 Pnt 3794 3745 Pnt 4037 3749 Pnt 2557 3746 Pnt 2163 3787 Pnt 3194 3740 Pnt 2867 3740 Pnt 3697 2519 Pnt 3193 3770 Pnt 2494 2524 Pnt 2817 3740 Pnt 2692 3751 Pnt 2286 3749 Pnt 2165 3914 Pnt 2861 3763 Pnt 2658 3762 Pnt 2885 3777 Pnt 3806 3742 Pnt 2467 3736 Pnt 2485 3764 Pnt 3289 3736 Pnt 2718 3739 Pnt 2451 3776 Pnt 2322 3739 Pnt 3309 3742 Pnt 2658 3760 Pnt 3112 3739 Pnt 3364 3754 Pnt 2394 3762 Pnt 2222 3752 Pnt 2576 3765 Pnt 2463 3760 Pnt 2874 3747 Pnt 2548 3740 Pnt 3534 3735 Pnt 2329 3757 Pnt 3711 3740 Pnt 2490 3747 Pnt 3018 3752 Pnt 3022 3738 Pnt 2664 3742 Pnt 2883 3738 Pnt 3373 3742 Pnt 2858 3744 Pnt 2815 3751 Pnt 2843 3742 Pnt 2270 3741 Pnt 2811 3738 Pnt 2738 3753 Pnt 3210 3741 Pnt 3672 3753 Pnt 2536 3748 Pnt 2551 3744 Pnt 3335 3738 Pnt 2861 3759 Pnt 2592 3743 Pnt 2569 3740 Pnt 2798 3750 Pnt 3565 2651 Pnt 2748 3793 Pnt 3048 3741 Pnt 2766 3807 Pnt 2894 3745 Pnt 2904 3758 Pnt 2304 3811 Pnt 3114 3734 Pnt 2305 3759 Pnt 2295 3732 Pnt 2701 3754 Pnt 2586 3738 Pnt 3031 3758 Pnt 3167 3741 Pnt 3086 3759 Pnt 3398 3746 Pnt 3193 3746 Pnt 2976 3736 Pnt 2649 3792 Pnt 2940 3749 Pnt 2928 3748 Pnt 3573 3759 Pnt 3524 3743 Pnt 2718 3736 Pnt 2520 3749 Pnt 2790 3743 Pnt 2681 3742 Pnt 2079 3788 Pnt 3006 3747 Pnt 2817 3801 Pnt 2667 3739 Pnt 3796 2650 Pnt 2461 3750 Pnt 3141 3781 Pnt 3235 3737 Pnt 3056 3747 Pnt 3359 3739 Pnt 3081 3750 Pnt 2986 3756 Pnt 2003 3790 Pnt 3596 3756 Pnt 2153 3796 Pnt 3008 3742 Pnt 3675 3740 Pnt 3466 3796 Pnt 3186 3747 Pnt 2833 3778 Pnt 3145 3749 Pnt 3078 3741 Pnt 2614 3795 Pnt 3120 3749 Pnt 2985 3735 Pnt 3268 3741 Pnt 2635 3739 Pnt 2515 3739 Pnt 2926 3743 Pnt 2797 3750 Pnt 2910 2599 Pnt 2852 3772 Pnt 2073 3897 Pnt 2134 3736 Pnt 2361 3769 Pnt 2289 3738 Pnt 3310 3745 Pnt 2545 3768 Pnt 4009 3769 Pnt 3828 2603 Pnt 3006 3745 Pnt 3772 3745 Pnt 3154 3745 Pnt 1930 3764 Pnt 3842 2783 Pnt 2021 3745 Pnt 3051 3747 Pnt 2298 3752 Pnt 3042 3745 Pnt 1749 3741 Pnt 2914 3752 Pnt 2471 3738 Pnt 2395 3737 Pnt 1818 3935 Pnt 2888 3739 Pnt 3598 2717 Pnt 2384 3785 Pnt 2100 3762 Pnt 2628 3757 Pnt 2037 3742 Pnt 2669 3739 Pnt 2016 3753 Pnt 2507 3769 Pnt 3784 3755 Pnt 2430 3816 Pnt 3290 3751 Pnt 2708 3749 Pnt 2743 3751 Pnt 3152 3741 Pnt 2139 3788 Pnt 3567 3752 Pnt 2644 3741 Pnt 3457 3751 Pnt 2531 3748 Pnt 3237 3750 Pnt 3167 3752 Pnt 2569 3732 Pnt 2938 3746 Pnt 2327 3762 Pnt 2745 3745 Pnt 2009 3796 Pnt 2799 2636 Pnt 2704 3748 Pnt 2759 3752 Pnt 3934 2815 Pnt 1840 3753 Pnt 3308 3762 Pnt 2288 3750 Pnt 2415 3801 Pnt 2451 3787 Pnt 3435 3744 Pnt 2856 3749 Pnt 2646 3793 Pnt 2515 3736 Pnt 2413 3768 Pnt 2439 3747 Pnt 2653 3732 Pnt 2740 3760 Pnt 2742 3768 Pnt 3200 3750 Pnt 2490 3741 Pnt 2480 3732 Pnt 2486 3827 Pnt 2154 3771 Pnt 3447 3737 Pnt 2869 3770 Pnt 2918 3742 Pnt 3319 2705 Pnt 3044 3736 Pnt 2403 3733 Pnt 2457 3743 Pnt 2986 3767 Pnt 2570 3738 Pnt 2901 2865 Pnt 2869 3747 Pnt 2823 3748 Pnt 2395 3755 Pnt 2398 3780 Pnt 2447 3743 Pnt 3146 3734 Pnt 2916 3742 Pnt 2615 3741 Pnt 3033 3742 Pnt 2678 2710 Pnt 3186 3741 Pnt 2891 3754 Pnt 1980 3810 Pnt 3110 3741 Pnt 2015 3778 Pnt 2922 3755 Pnt 2755 3741 Pnt 2562 3752 Pnt 2835 3744 Pnt 2417 3765 Pnt 3023 3745 Pnt 2443 3742 Pnt 2458 3755 Pnt 2112 3758 Pnt 2079 3757 Pnt 3222 3744 Pnt 2532 3750 Pnt 2707 3743 Pnt 2569 3814 Pnt 2646 3760 Pnt 2940 3814 Pnt 2996 3760 Pnt 2682 3754 Pnt 2073 3775 Pnt 3123 3754 Pnt 3022 3757 Pnt 3415 3736 Pnt 3168 3753 Pnt 2847 3746 Pnt 3417 3746 Pnt 2690 3741 Pnt 2578 3778 Pnt 3065 3750 Pnt 2199 3741 Pnt 2781 3798 Pnt 3181 3745 Pnt 2023 3757 Pnt 2856 3741 Pnt 3254 3744 Pnt 2349 3764 Pnt 2931 3750 Pnt 2978 3744 Pnt 3633 3763 Pnt 2626 3740 Pnt 3335 3761 Pnt 2506 3743 Pnt 3014 3740 Pnt 2791 3749 Pnt 2346 3778 Pnt 2387 3752 Pnt 2743 3742 Pnt 2392 3743 Pnt 2591 3749 Pnt 2982 3778 Pnt 2552 3744 Pnt 2958 3740 Pnt 3261 3747 Pnt 2904 3747 Pnt 2351 3754 Pnt 2117 3749 Pnt 2960 3740 Pnt 2348 3737 Pnt 2227 3754 Pnt 2245 3774 Pnt 2539 3757 Pnt 3605 3753 Pnt 3111 3739 Pnt 2743 3809 Pnt 2938 3740 Pnt 2881 3737 Pnt 2772 3739 Pnt 3649 3751 Pnt 2641 3751 Pnt 2459 3809 Pnt 2669 3745 Pnt 3097 3740 Pnt 2149 3779 Pnt 3254 3744 Pnt 2939 3746 Pnt 2925 3741 Pnt 2658 3734 Pnt 2452 3789 Pnt 3437 3754 Pnt 2593 3742 Pnt 3276 3755 Pnt 2442 3774 Pnt 3360 3760 Pnt 3111 3754 Pnt 2635 3793 Pnt 2533 3758 Pnt 2461 3765 Pnt 2668 3782 Pnt 2100 3767 Pnt 2580 3775 Pnt 3034 3735 Pnt 3206 3760 Pnt 2094 3760 Pnt 3108 3773 Pnt 2690 3739 Pnt 2650 3741 Pnt 3554 3749 Pnt 2235 3770 Pnt 3028 3739 Pnt 2079 3778 Pnt 3102 2580 Pnt 2791 3740 Pnt 2626 3786 Pnt 2866 3782 Pnt 2690 3739 Pnt 2045 3804 Pnt 2586 3744 Pnt 2579 3747 Pnt 2438 3739 Pnt 3268 3757 Pnt 2868 3745 Pnt 2401 3761 Pnt 2581 3738 Pnt 2340 3739 Pnt 2920 3761 Pnt 2437 3747 Pnt 2021 3738 Pnt 2201 3760 Pnt 3127 3747 Pnt 2822 3738 Pnt 2739 3739 Pnt 2793 3749 Pnt 2738 3761 Pnt 3271 3744 Pnt 3214 3747 Pnt 2477 3741 Pnt 2235 3748 Pnt 2790 3738 Pnt 3797 3738 Pnt 2366 3748 Pnt 2752 3741 Pnt 2724 3925 Pnt 2513 3741 Pnt 2212 3736 Pnt 3459 3925 Pnt 2664 3737 Pnt 3331 3738 Pnt 2660 3758 Pnt 2952 3736 Pnt 2791 3739 Pnt 2230 3822 Pnt 2811 3755 Pnt 2754 3748 Pnt 2475 3735 Pnt 3096 3755 Pnt 2806 3750 Pnt 2539 3741 Pnt 3405 3741 Pnt 3534 3752 Pnt 3111 3743 Pnt 2749 3750 Pnt 2591 3768 Pnt 3260 2648 Pnt 2716 3780 Pnt 2782 3735 Pnt 2907 3743 Pnt 2472 3784 Pnt 2918 3748 Pnt 2379 3790 Pnt 3235 2590 Pnt 3115 2474 Pnt 2794 3740 Pnt 3111 3789 Pnt 2674 3732 Pnt 2774 3755 Pnt 2271 3737 Pnt 2218 3798 Pnt 2734 3771 Pnt 3268 3732 Pnt 2560 3739 Pnt 2424 3746 Pnt 3202 3733 Pnt 2531 3753 Pnt 1796 3757 Pnt 2364 3747 Pnt 2130 3843 Pnt 1916 3780 Pnt 2216 3741 Pnt 3043 3747 Pnt 2955 3783 Pnt 2787 3758 Pnt 2599 3749 Pnt 2526 3738 Pnt 2708 3746 Pnt 1883 3760 Pnt 2603 3746 Pnt 2306 3740 Pnt 3051 3751 Pnt 2573 3740 Pnt 2521 3746 Pnt 4177 2508 Pnt 3020 3750 Pnt 2947 3741 Pnt 2511 3742 Pnt 3627 3740 Pnt 2577 3739 Pnt 2645 3736 Pnt 1966 3732 Pnt 2567 3746 Pnt 2749 3736 Pnt 3267 3739 Pnt 2896 3742 Pnt 2822 3745 Pnt 2042 3822 Pnt 2891 3742 Pnt 2308 3759 Pnt 1797 3742 Pnt 2330 3738 Pnt 3106 3742 Pnt 2527 3741 Pnt 3407 3738 Pnt 2465 3747 Pnt 3033 3748 Pnt 2181 3773 Pnt 2706 3756 Pnt 2331 3734 Pnt 3279 3755 Pnt 2673 3749 Pnt 2807 3754 Pnt 2466 3744 Pnt 3130 3749 Pnt 2614 3744 Pnt 3320 3743 Pnt 2495 3729 Pnt 2103 3825 Pnt 2222 3746 Pnt 2339 3742 Pnt 2870 3743 Pnt 2717 3739 Pnt 2902 2487 Pnt 2628 3757 Pnt 2535 3737 Pnt 2833 3744 Pnt 2899 3741 Pnt 2625 3770 Pnt 2992 3752 Pnt 2876 3735 Pnt 2874 3738 Pnt 2281 3761 Pnt 3092 2709 Pnt 2747 3734 Pnt 3133 3743 Pnt 2946 3740 Pnt 3154 3761 Pnt 2598 3734 Pnt 2664 3761 Pnt 2284 3804 Pnt 2471 3739 Pnt 2746 3758 Pnt 3191 3741 Pnt 2666 3743 Pnt 2563 3749 Pnt 3451 2713 Pnt 3011 3743 Pnt 2904 3747 Pnt 2465 3749 Pnt 2962 3749 Pnt 2799 3806 Pnt 2738 2713 Pnt 2714 3735 Pnt 2164 3748 Pnt 2913 3768 Pnt 3188 3801 Pnt 2422 3791 Pnt 2571 3768 Pnt 2233 3737 Pnt 3190 2611 Pnt 2859 3739 Pnt 1972 3784 Pnt 3469 3746 Pnt 3219 3746 Pnt 2741 3744 Pnt 2246 3751 Pnt 2326 3746 Pnt 2621 3746 Pnt 2734 3739 Pnt 2746 3784 Pnt 2264 2687 Pnt 2819 3738 Pnt 2579 3736 Pnt 2270 3758 Pnt 2485 3744 Pnt 3022 3784 Pnt 2608 3746 Pnt 2810 3744 Pnt 2711 3745 Pnt 2562 3739 Pnt 3156 3736 Pnt 2750 3756 Pnt 2424 3746 Pnt 3461 2519 Pnt 2848 3757 Pnt 2625 3742 Pnt 3177 3764 Pnt 2818 3741 Pnt 3050 3764 Pnt 2832 3741 Pnt 2131 3741 Pnt 3851 2826 Pnt 2772 3742 Pnt 2380 3737 Pnt 2688 3792 Pnt 3354 3740 Pnt 2505 3742 Pnt 2346 3744 Pnt 2505 3775 Pnt 2151 3783 Pnt 2960 3782 Pnt 2544 3748 Pnt 2946 3744 Pnt 2900 3737 Pnt 3167 3741 Pnt 2445 3749 Pnt 4435 2634 Pnt 3356 3745 Pnt 3250 3742 Pnt 3180 3740 Pnt 2997 3743 Pnt 2901 3747 Pnt 2683 3749 Pnt 3555 3736 Pnt 2824 3733 Pnt 2287 3801 Pnt 3023 3747 Pnt 3443 3747 Pnt 2342 3801 Pnt 3810 2513 Pnt 2371 3768 Pnt 2444 3748 Pnt 2543 3734 Pnt 2169 3761 Pnt 2140 3787 Pnt 3372 3749 Pnt 3072 3749 Pnt 2636 3776 Pnt 2356 3749 Pnt 1855 3766 Pnt 2199 3766 Pnt 2593 3744 Pnt 2251 3740 Pnt 2559 3748 Pnt 3693 3755 Pnt 2618 3750 Pnt 2148 3745 Pnt 3009 3735 Pnt 3582 3754 Pnt 2207 3742 Pnt 2778 3787 Pnt 2358 3759 Pnt 2608 3760 Pnt 2159 3741 Pnt 4053 3758 Pnt 2899 3756 Pnt 3131 3762 Pnt 2586 3740 Pnt 2355 3794 Pnt 2472 3802 Pnt 3151 3752 Pnt 2645 3738 Pnt 2453 3813 Pnt 2346 3793 Pnt 3114 3737 Pnt 3864 3752 Pnt 2720 3742 Pnt 3071 3750 Pnt 2637 3743 Pnt 2860 3734 Pnt 2338 3790 Pnt 2794 3739 Pnt 2862 2533 Pnt 2593 3751 Pnt 2755 3755 Pnt 3026 3745 Pnt 2902 3748 Pnt 3035 3751 Pnt 3294 3743 Pnt 2588 3750 Pnt 2284 3797 Pnt 3140 3744 Pnt 2841 3745 Pnt 2548 3742 Pnt 2138 3740 Pnt 2634 2813 Pnt 3641 2768 Pnt 3388 3742 Pnt 3022 3734 Pnt 2394 3773 Pnt 3636 3769 Pnt 2168 3755 Pnt 2748 3741 Pnt 2956 3746 Pnt 3045 3744 Pnt 2542 3758 Pnt 2450 3748 Pnt 3273 3740 Pnt 2558 3748 Pnt 2988 3759 Pnt 3292 3742 Pnt 2794 3751 Pnt 2731 3782 Pnt 2353 3736 Pnt 3205 3765 Pnt 2666 3759 Pnt 2606 3736 Pnt 2011 3793 Pnt 2512 3805 Pnt 2769 3759 Pnt 2812 3739 Pnt 2832 3749 Pnt 2560 3750 Pnt 2446 3819 Pnt 2535 3741 Pnt 3167 3766 Pnt 2723 3747 Pnt 2863 3758 Pnt 2052 3791 Pnt 3062 3764 Pnt 3110 3744 Pnt 2763 3742 Pnt 2960 3753 Pnt 2916 3745 Pnt 2508 3750 Pnt 2533 3749 Pnt 3008 3745 Pnt 2794 3765 Pnt 2594 3744 Pnt 2009 3783 Pnt 2963 3752 Pnt 2315 3760 Pnt 2829 3746 Pnt 2609 3740 Pnt 2368 3746 Pnt 2848 3749 Pnt 3981 3750 Pnt 2215 3757 Pnt 2145 3765 Pnt 2554 3738 Pnt 2705 3741 Pnt 3288 3772 Pnt 2479 3809 Pnt 2654 3741 Pnt 3429 3737 Pnt 2670 3767 Pnt 2562 3773 Pnt 2253 3769 Pnt 2474 3747 Pnt 3320 3756 Pnt 2162 3776 Pnt 2943 3745 Pnt 2749 3773 Pnt 2110 3914 Pnt 2843 3763 Pnt 2031 3763 Pnt 2470 3756 Pnt 2444 2829 Pnt 1983 3762 Pnt 2194 3749 Pnt 2472 3762 Pnt 2531 3741 Pnt 2995 3783 Pnt 2423 3781 Pnt 3284 2533 Pnt 2591 3738 Pnt 2896 3783 Pnt 1975 3764 Pnt 3113 3746 Pnt 2291 3777 Pnt 2661 3752 Pnt 2100 3776 Pnt 3105 3742 Pnt 2620 3742 Pnt 2663 3750 Pnt 3559 3752 Pnt 3006 3732 Pnt 2400 3739 Pnt 2363 3766 Pnt 2879 3743 Pnt 2486 3750 Pnt 2253 3739 Pnt 3512 3754 Pnt 2430 3801 Pnt 2555 3774 Pnt 3249 3739 Pnt 2011 3764 Pnt 2194 3743 Pnt 2970 3744 Pnt 3025 3744 Pnt 2140 3752 Pnt 2822 3743 Pnt 2523 3742 Pnt 3013 3743 Pnt 2546 3732 Pnt 2845 3738 Pnt 2855 3739 Pnt 3774 2768 Pnt 3526 3740 Pnt 2624 3738 Pnt 2768 3744 Pnt 2679 3753 Pnt 3051 3740 Pnt 2949 3760 Pnt 3079 3747 Pnt 3387 3748 Pnt 2959 3742 Pnt 3116 3747 Pnt 2297 3760 Pnt 3207 3740 Pnt 2940 3816 Pnt 3004 3741 Pnt 3014 3742 Pnt 2689 3771 Pnt 3124 3742 Pnt 2811 3772 Pnt 2682 3747 Pnt 2198 3768 Pnt 3073 3758 Pnt 2814 3741 Pnt 3306 2602 Pnt 2419 3796 Pnt 3725 3747 Pnt 3117 3757 Pnt 2913 3757 Pnt 2597 3746 Pnt 2263 3732 Pnt 3061 3749 Pnt 2883 3740 Pnt 3248 3742 Pnt 2082 3762 Pnt 2963 3759 Pnt 2778 3740 Pnt 3446 2518 Pnt 1963 3785 Pnt 3235 3740 Pnt 2588 3742 Pnt 3173 3762 Pnt 3143 3739 Pnt 2813 3738 Pnt 3169 3786 Pnt 3138 3738 Pnt 2604 3799 Pnt 2436 3742 Pnt 2035 3778 Pnt 2637 3740 Pnt 3013 3761 Pnt 2506 3742 Pnt 3324 2699 Pnt 2964 3748 Pnt 2345 3767 Pnt 2698 3793 Pnt 2137 3743 Pnt 2377 3739 Pnt 3232 2661 Pnt 2034 3753 Pnt 2978 3743 Pnt 2487 3748 Pnt 2694 3749 Pnt 2488 3737 Pnt 2908 3769 Pnt 3628 3737 Pnt 3343 3807 Pnt 2401 3739 Pnt 2981 3750 Pnt 3212 3753 Pnt 2580 3739 Pnt 3296 3751 Pnt 2830 3738 Pnt 3204 3776 Pnt 2340 3891 Pnt 3201 2640 Pnt 2601 3739 Pnt 3331 3751 Pnt 2911 3748 Pnt 2223 3736 Pnt 2704 3746 Pnt 2862 3743 Pnt 3493 3748 Pnt 1907 3786 Pnt 2687 3745 Pnt 3046 3778 Pnt 3171 3741 Pnt 3149 3750 Pnt 2444 3735 Pnt 2859 3764 Pnt 2523 3742 Pnt 2293 3788 Pnt 2602 3751 Pnt 2007 3775 Pnt 3052 3760 Pnt 2528 3757 Pnt 3243 3747 Pnt 2738 3740 Pnt 3241 2710 Pnt 2203 3898 Pnt 2783 3741 Pnt 2453 3757 Pnt 3053 3745 Pnt 2813 3811 Pnt 2904 3743 Pnt 2282 3823 Pnt 3004 3744 Pnt 2689 3746 Pnt 3412 3811 Pnt 2304 3749 Pnt 2758 3807 Pnt 3612 3741 Pnt 1784 3773 Pnt 2359 3750 Pnt 2488 3732 Pnt 3223 3754 Pnt 2874 3748 Pnt 2691 3748 Pnt 3016 3741 Pnt 2407 3738 Pnt 2932 3750 Pnt 2376 3746 Pnt 3054 3786 Pnt 2887 3744 Pnt 2775 3768 Pnt 2409 3765 Pnt 2193 3750 Pnt 3362 3739 Pnt 2344 3736 Pnt 2436 3765 Pnt 2538 3752 Pnt 2392 3767 Pnt 3140 3753 Pnt 3274 3757 Pnt 2794 3746 Pnt 3628 3753 Pnt 2833 3737 Pnt 3038 3757 Pnt 2296 3776 Pnt 2305 3778 Pnt 2582 3761 Pnt 2552 3736 Pnt 2585 3751 Pnt 2722 3757 Pnt 2919 3736 Pnt 2119 3757 Pnt 3278 3743 Pnt 3150 2701 Pnt 2907 3749 Pnt 3039 3751 Pnt 2496 3761 Pnt 2223 3761 Pnt 2488 3739 Pnt 2826 3738 Pnt 2420 3742 Pnt 2833 3735 Pnt 2539 3743 Pnt 3094 3742 Pnt 2703 3738 Pnt 2936 3743 Pnt 2182 3934 Pnt 2157 3738 Pnt 2198 3778 Pnt 2925 3740 Pnt 2300 3738 Pnt 2350 3773 Pnt 2542 3738 Pnt 2750 3763 Pnt 2669 3745 Pnt 3403 3739 Pnt 2677 3781 Pnt 3266 3736 Pnt 2770 3766 Pnt 2337 3769 Pnt 2505 3754 Pnt 2108 3779 Pnt 2325 3752 Pnt 2356 3755 Pnt 2945 3751 Pnt 3418 3747 Pnt 2381 3789 Pnt 3487 3760 Pnt 2547 3804 Pnt 2481 3760 Pnt 3098 3745 Pnt 2954 3755 Pnt 2588 2714 Pnt 2559 3755 Pnt 2668 3749 Pnt 2378 3735 Pnt 3492 2632 Pnt 3023 3760 Pnt 3366 3754 Pnt 3103 3735 Pnt 2479 3738 Pnt 2816 3787 Pnt 2590 3779 Pnt 2065 3757 Pnt 2199 3799 Pnt 3219 3734 Pnt 3095 3773 Pnt 2698 3778 Pnt 3022 3786 Pnt 2753 3768 Pnt 2923 3765 Pnt 3105 2359 Pnt 2280 3738 Pnt 2967 3753 Pnt 2669 3739 Pnt 2425 3764 Pnt 2576 3737 Pnt 1922 3771 Pnt 2929 3744 Pnt 2584 3731 Pnt 2092 3765 Pnt 2783 3740 Pnt 3856 3739 Pnt 3189 3741 Pnt 3193 3761 Pnt 3564 3740 Pnt 2487 3761 Pnt 2189 3754 Pnt 2881 3735 Pnt 3579 3748 Pnt 2614 3754 Pnt 2545 3741 Pnt 2056 3736 Pnt 2173 3746 Pnt 2382 3743 Pnt 2877 3814 Pnt 2648 3740 Pnt 2324 3736 Pnt 2419 3760 Pnt 2517 3738 Pnt 2092 3754 Pnt 2847 3736 Pnt 2511 3749 Pnt 2550 3738 Pnt 1901 3732 Pnt 2905 2528 Pnt 2896 3739 Pnt 3020 3742 Pnt 2619 3785 Pnt 3169 3741 Pnt 3120 2609 Pnt 2531 3827 Pnt 2888 3749 Pnt 3096 3739 Pnt 3117 3741 Pnt 3789 3743 Pnt 2735 3747 Pnt 3159 3747 Pnt 2450 3735 Pnt 2487 3745 Pnt 3144 3744 Pnt 2523 3739 Pnt 1932 3761 Pnt 2909 3753 Pnt 3070 3745 Pnt 3177 3738 Pnt 2389 3738 Pnt 2980 3753 Pnt 3020 3742 Pnt 2567 3767 Pnt 2599 3751 Pnt 2269 3843 Pnt 3188 3757 Pnt 2828 3740 Pnt 2635 3742 Pnt 2267 3757 Pnt 2692 3739 Pnt 2653 3739 Pnt 2086 3747 Pnt 2096 3739 Pnt 2606 3733 Pnt 2610 3743 Pnt 2620 2660 Pnt 3854 3775 Pnt 2539 3744 Pnt 2647 3741 Pnt 2327 3737 Pnt 2837 3738 Pnt 2971 3736 Pnt 2500 3752 Pnt 2844 3737 Pnt 3301 2744 Pnt 2379 3734 Pnt 2422 3736 Pnt 2945 2672 Pnt 2643 3746 Pnt 3157 3740 Pnt 2713 3738 Pnt 3224 3734 Pnt 2514 3742 Pnt 2968 3748 Pnt 2428 3748 Pnt 2618 3749 Pnt 3293 3739 Pnt 3083 3748 Pnt 2636 3741 Pnt 3735 3754 Pnt 2592 3740 Pnt 3189 2650 Pnt 2462 3755 Pnt 2516 3741 Pnt 3926 2677 Pnt 2795 3742 Pnt 2983 3749 Pnt 2565 3746 Pnt 2047 3737 Pnt 2276 3736 Pnt 2803 3736 Pnt 2688 3925 Pnt 2615 3743 Pnt 2319 3729 Pnt 2424 3746 Pnt 2876 3742 Pnt 2474 3742 Pnt 2201 3748 Pnt 2694 3754 Pnt 2537 3734 Pnt 2545 3771 Pnt 2059 3825 Pnt 2690 3799 Pnt 3973 3745 Pnt 3132 2569 Pnt 2521 3745 Pnt 3196 3749 Pnt 3494 3737 Pnt 2565 3744 Pnt 3933 3743 Pnt 2945 3741 Pnt 2888 3753 Pnt 2716 3740 Pnt 2878 3741 Pnt 2589 3741 Pnt 2630 3735 Pnt 2265 3798 Pnt 2568 3750 Pnt 3860 3781 Pnt 2691 3746 Pnt 3181 3763 Pnt 2506 3751 Pnt 3175 3743 Pnt 2557 3738 Pnt 2136 3758 Pnt 2499 3811 Pnt 3804 2547 Pnt 3324 3738 Pnt 2390 3735 Pnt 2473 3784 Pnt 2708 3747 Pnt 2687 3768 Pnt 3403 2717 Pnt 2524 3741 Pnt 2587 3767 Pnt 2727 3767 Pnt 2195 3800 Pnt 2364 3741 Pnt 3799 3759 Pnt 3469 3759 Pnt 3072 3780 Pnt 3263 3774 Pnt 3579 3740 Pnt 2989 3749 Pnt 2591 3740 Pnt 2421 3741 Pnt 2950 3755 Pnt 2658 3734 Pnt 2807 3746 Pnt 3270 3753 Pnt 3631 3752 Pnt 2703 3756 Pnt 2626 3746 Pnt 2593 3764 Pnt 2794 3757 Pnt 4162 3749 Pnt 2498 3746 Pnt 2259 3740 Pnt 2318 3742 Pnt 2187 3784 Pnt 2290 3759 Pnt 3132 3739 Pnt 2111 3822 Pnt 3202 3742 Pnt 2868 3734 Pnt 2626 2912 Pnt 2613 3775 Pnt 2711 3741 Pnt 2241 3792 Pnt 3054 3751 Pnt 2583 3744 Pnt 2234 3737 Pnt 2730 3751 Pnt 2396 3734 Pnt 2968 3743 Pnt 2708 3738 Pnt 3000 3740 Pnt 2167 3758 Pnt 2944 3738 Pnt 3136 3738 Pnt 4117 3757 Pnt 2724 3735 Pnt 2246 3739 Pnt 2770 3739 Pnt 3011 3736 Pnt 2441 3749 Pnt 2845 2577 Pnt 2280 3753 Pnt 2461 3742 Pnt 2416 3768 Pnt 2580 3745 Pnt 2468 3864 Pnt 3301 3750 Pnt 2931 3738 Pnt 3050 3735 Pnt 2246 3738 Pnt 3455 3750 Pnt 2302 3741 Pnt 2709 3740 Pnt 2885 3750 Pnt 3686 3741 Pnt 2107 3804 Pnt 3391 3748 Pnt 3675 2586 Pnt 2480 3738 Pnt 2508 3804 Pnt 3283 2587 Pnt 2596 3739 Pnt 2840 3751 Pnt 2466 3744 Pnt 2844 3740 Pnt 2550 3776 Pnt 2024 3746 Pnt 3041 3758 Pnt 3396 3744 Pnt 2336 3744 Pnt 2335 3747 Pnt 2504 3742 Pnt 2272 3744 Pnt 2298 3741 Pnt 3234 3742 Pnt 2519 3741 Pnt 2571 3758 Pnt 2496 3753 Pnt 2945 3744 Pnt 2457 3742 Pnt 3070 3758 Pnt 2694 3743 Pnt 3200 3742 Pnt 2845 3775 Pnt 2652 3743 Pnt 2384 3766 Pnt 2339 3792 Pnt 2605 3753 Pnt 2611 3746 Pnt 2459 3767 Pnt 3249 3764 Pnt 2667 3746 Pnt 3194 3746 Pnt 2725 3782 Pnt 1895 3761 Pnt 3144 3756 Pnt 2827 3746 Pnt 2360 3748 Pnt 2946 2710 Pnt 2705 3760 Pnt 2842 3787 Pnt 2480 3749 Pnt 2627 3806 Pnt 2644 3803 Pnt 2508 3750 Pnt 3014 3747 Pnt 2520 3760 Pnt 3064 3735 Pnt 3325 3743 Pnt 3278 3748 Pnt 3430 3760 Pnt 2547 3739 Pnt 3136 3784 Pnt 2451 3732 Pnt 2850 3741 Pnt 2387 3735 Pnt 2930 2627 Pnt 2657 3756 Pnt 2829 3754 Pnt 2710 3770 Pnt 2441 3791 Pnt 2966 3747 Pnt 2468 3744 Pnt 3232 3753 Pnt 2087 3745 Pnt 2919 3791 Pnt 2044 3768 Pnt 3039 3743 Pnt 2844 3750 Pnt 4056 3750 Pnt 2984 3744 Pnt 2656 3754 Pnt 3068 3756 Pnt 2151 3778 Pnt 2737 3738 Pnt 3598 3740 Pnt 2906 3756 Pnt 3471 3746 Pnt 2947 3770 Pnt 2797 3746 Pnt 2752 3740 Pnt 2681 3749 Pnt 2981 3743 Pnt 3521 3744 Pnt 2920 3743 Pnt 2460 3742 Pnt 2347 3743 Pnt 2413 3794 Pnt 3543 3751 Pnt 4343 3750 Pnt 2916 3737 Pnt 3424 3751 Pnt 3170 3743 Pnt 2835 3739 Pnt 3494 3757 Pnt 2525 3768 Pnt 2769 3754 Pnt 2626 3741 Pnt 2586 3742 Pnt 2831 3770 Pnt 3040 3738 Pnt 2920 3742 Pnt 2296 3758 Pnt 2878 3750 Pnt 2164 3793 Pnt 3098 3758 Pnt 2387 3761 Pnt 2978 3747 Pnt 3130 3752 Pnt 2446 3743 Pnt 2736 3741 Pnt 2491 3741 Pnt 2282 3759 Pnt 2982 3743 Pnt 2254 3746 Pnt 3592 3765 Pnt 3267 3752 Pnt 3664 3744 Pnt 2346 3767 Pnt 2052 3787 Pnt 3151 3751 Pnt 3616 3746 Pnt 2888 3753 Pnt 2508 3802 Pnt 2348 3740 Pnt 3194 3804 Pnt 3570 3757 Pnt 2926 3760 Pnt 2214 3748 Pnt 2816 3758 Pnt 2260 3756 Pnt 3128 3813 Pnt 2657 3734 Pnt 2292 3782 Pnt 3085 3750 Pnt 2915 3737 Pnt 2624 3765 Pnt 2591 3742 Pnt 2322 3789 Pnt 3229 3756 Pnt 2665 3743 Pnt 2662 3759 Pnt 2542 3739 Pnt 2950 3752 Pnt 3102 2753 Pnt 2874 3754 Pnt 2578 3751 Pnt 3005 3755 Pnt 3311 3736 Pnt 3022 3737 Pnt 1943 3766 Pnt 2255 3748 Pnt 2797 3734 Pnt 2280 3797 Pnt 2723 3755 Pnt 2214 3738 Pnt 4195 2612 Pnt 3130 2596 Pnt 2968 3756 Pnt 2597 3745 Pnt 2544 3800 Pnt 2341 3822 Pnt 2423 3807 Pnt 2892 3756 Pnt 2921 3746 Pnt 3127 3735 Pnt 2461 3755 Pnt 2659 3742 Pnt 2321 3776 Pnt 3038 3758 Pnt 2058 3769 Pnt 2829 3745 Pnt 2479 3795 Pnt 2422 3773 Pnt 2008 3790 Pnt 2429 3754 Pnt 3136 3746 Pnt 2707 3749 Pnt 3090 3741 Pnt 2524 3749 Pnt 2429 3815 Pnt 2938 3749 Pnt 2651 3737 Pnt 2591 3777 Pnt 2660 3744 Pnt 2239 3750 Pnt 2821 3805 Pnt 2599 3747 Pnt 3661 3742 Pnt 2554 3766 Pnt 3157 3805 Pnt 2882 3735 Pnt 2806 3759 Pnt 2775 3759 Pnt 2801 3747 Pnt 2652 3757 Pnt 2235 3755 Pnt 3264 3736 Pnt 2856 3746 Pnt 3527 3747 Pnt 2715 3740 Pnt 2890 3745 Pnt 4189 3754 Pnt 2556 3789 Pnt 3252 3739 Pnt 2915 3744 Pnt 2506 3750 Pnt 2346 3749 Pnt 2948 3739 Pnt 2106 3816 Pnt 2953 2779 Pnt 2635 3816 Pnt 2594 3742 Pnt 2639 3741 Pnt 2490 3746 Pnt 3426 3766 Pnt 3057 3741 Pnt 2739 3740 Pnt 2035 3791 Pnt 1855 3914 Pnt 2816 3744 Pnt 2440 3773 Pnt 2426 3760 Pnt 3055 3742 Pnt 2855 3763 Pnt 2305 3763 Pnt 3317 3745 Pnt 3001 3779 Pnt 2871 3763 Pnt 2696 3744 Pnt 2311 3797 Pnt 3430 2658 Pnt 2302 3813 Pnt 3093 3739 Pnt 3603 3748 Pnt 2873 3744 Pnt 2797 3764 Pnt 3849 3745 Pnt 3236 3747 Pnt 3225 3747 Pnt 2797 3747 Pnt 1895 3754 Pnt 3089 3738 Pnt 2941 3740 Pnt 2230 3783 Pnt 3013 3749 Pnt 2447 3738 Pnt 2936 3759 Pnt 2590 3749 Pnt 2268 3748 Pnt 2513 3738 Pnt 3383 3781 Pnt 3053 3805 Pnt 3034 3749 Pnt 2601 3764 Pnt 2289 3767 Pnt 3042 3749 Pnt 2535 3739 Pnt 2813 3741 Pnt 3363 2533 Pnt 3450 3749 Pnt 2507 3759 Pnt 3237 3742 Pnt 2908 3793 Pnt 2814 3793 Pnt 2362 3801 Pnt 3082 3742 Pnt 2242 3743 Pnt 2663 3745 Pnt 2356 3736 Pnt 3196 3801 Pnt 2106 3776 Pnt 2226 3773 Pnt 3068 3750 Pnt 2642 3741 Pnt 3213 2865 Pnt 2900 3746 Pnt 2655 3742 Pnt 3059 3785 Pnt 3018 3807 Pnt 3190 3741 Pnt 2735 3753 Pnt 2850 3756 Pnt 2788 3744 Pnt 2065 3752 Pnt 4086 2742 Pnt 2701 3744 Pnt 2118 3786 Pnt 3327 3742 Pnt 2974 3743 Pnt 2960 3743 Pnt 3213 3762 Pnt 2760 3743 Pnt 3361 3747 Pnt 2194 3742 Pnt 2718 2551 Pnt 2698 3776 Pnt 3080 3764 Pnt 3040 3799 Pnt 2744 3743 Pnt 2890 3737 Pnt 2893 3740 Pnt 2745 3748 Pnt 2528 3750 Pnt 3008 3739 Pnt 3530 3740 Pnt 2547 3898 Pnt 3047 3769 Pnt 2240 3739 Pnt 3894 3781 Pnt 3078 3761 Pnt 2728 3760 Pnt 2530 3732 Pnt 3093 3739 Pnt 3639 3740 Pnt 3038 3741 Pnt 2940 3739 Pnt 2528 3787 Pnt 2596 3766 Pnt 2554 3739 Pnt 2206 3766 Pnt 2273 3762 Pnt 2806 3744 Pnt 2568 3743 Pnt 2344 3743 Pnt 2661 3748 Pnt 2238 3748 Pnt 2804 3747 Pnt 2485 3738 Pnt 3405 2820 Pnt 3247 3743 Pnt 2428 3749 Pnt 2826 3738 Pnt 2598 3746 Pnt 2433 3741 Pnt 3410 2461 Pnt 2639 3742 Pnt 3106 3740 Pnt 2294 3807 Pnt 2051 3823 Pnt 2579 3742 Pnt 3145 3742 Pnt 3414 3747 Pnt 2244 3807 Pnt 3116 3737 Pnt 2381 3735 Pnt 3399 3742 Pnt 3141 3751 Pnt 3115 3742 Pnt 2820 3742 Pnt 1907 3753 Pnt 2061 3760 Pnt 2946 3764 Pnt 2693 3799 Pnt 2338 3769 Pnt 2554 3740 Pnt 2601 3771 Pnt 2968 3757 Pnt 2263 3891 Pnt 2563 3796 Pnt 2119 3773 Pnt 2799 3750 Pnt 3028 3740 Pnt 3064 3749 Pnt 2363 3739 Pnt 3190 3760 Pnt 2144 3738 Pnt 2510 3741 Pnt 2711 3762 Pnt 3299 3754 Pnt 2035 3770 Pnt 2863 3745 Pnt 3452 3749 Pnt 2862 3738 Pnt 3178 3743 Pnt 2384 3742 Pnt 2625 3744 Pnt 4291 3754 Pnt 2481 3739 Pnt 2932 3738 Pnt 3091 3751 Pnt 3793 2500 Pnt 3380 3753 Pnt 2645 3768 Pnt 2676 3749 Pnt 2386 3746 Pnt 2422 3765 Pnt 3029 3736 Pnt 3662 3765 Pnt 3092 3748 Pnt 2661 3754 Pnt 2761 3781 Pnt 3950 3752 Pnt 3420 3740 Pnt 3108 3754 Pnt 3073 3780 Pnt 2722 3732 Pnt 2766 3767 Pnt 2467 3738 Pnt 3156 2830 Pnt 3109 3751 Pnt 2695 3767 Pnt 2581 3745 Pnt 2682 3786 Pnt 3166 3753 Pnt 2863 3738 Pnt 3562 3742 Pnt 2366 3742 Pnt 2941 2735 Pnt 2409 3739 Pnt 2334 3778 Pnt 2465 3761 Pnt 2855 3738 Pnt 2875 3761 Pnt 2926 3737 Pnt 2819 3751 Pnt 2860 3744 Pnt 2743 3742 Pnt 2797 3741 Pnt 3013 3738 Pnt 2147 3752 Pnt 2972 3749 Pnt 3136 3743 Pnt 2429 3742 Pnt 3068 3743 Pnt 3017 3751 Pnt 2718 3751 Pnt 3729 3749 Pnt 2623 3742 Pnt 2424 3739 Pnt 2654 3788 Pnt 3287 3744 Pnt 2793 3747 Pnt 2544 3743 Pnt 2420 3765 Pnt 2655 3743 Pnt 2998 3746 Pnt 3134 3743 Pnt 2951 3757 Pnt 2228 3769 Pnt 2612 3750 Pnt 3769 2583 Pnt 2887 2328 Pnt 2886 3757 Pnt 2556 3761 Pnt 2231 3738 Pnt 3392 3736 Pnt 2368 2631 Pnt 2065 3775 Pnt 2424 3738 Pnt 3261 2706 Pnt 2747 3745 Pnt 2182 3778 Pnt 2624 3739 Pnt 2105 3843 Pnt 2487 3741 Pnt 2665 3809 Pnt 3218 2627 Pnt 2785 3773 Pnt 2613 3739 Pnt 3175 3741 Pnt 2735 3773 Pnt 2526 3760 Pnt 3032 2503 Pnt 2807 3735 Pnt 2857 3735 Pnt 3068 3750 Pnt 2920 3742 Pnt 2560 3749 Pnt 2652 3739 Pnt 3262 3745 Pnt 2482 3754 Pnt 4094 2481 Pnt 2660 3760 Pnt 2280 3740 Pnt 2982 3736 Pnt 2476 3739 Pnt 3930 3742 Pnt 2071 3773 Pnt 2593 3740 Pnt 2814 3753 Pnt 2651 3742 Pnt 2638 3764 Pnt 3149 3746 Pnt 2290 3743 Pnt 3405 3737 Pnt 2495 3811 Pnt 2538 3746 Pnt 2117 3747 Pnt 2967 3741 Pnt 3431 3747 Pnt 2851 3754 Pnt 3253 3741 Pnt 1982 3761 Pnt 3469 3748 Pnt 3122 3741 Pnt 2197 3736 Pnt 3035 3760 Pnt 2956 2603 Pnt 2471 3760 Pnt 2518 3744 Pnt 2544 3741 Pnt 2849 3749 Pnt 2609 3740 Pnt 3127 3757 Pnt 2696 3740 Pnt 3200 2875 Pnt 2909 3738 Pnt 2946 3737 Pnt 2899 3757 Pnt 4053 3747 Pnt 2278 3754 Pnt 3444 3735 Pnt 2730 3746 Pnt 2450 3766 Pnt 1990 3765 Pnt 3105 3732 Pnt 2441 3774 Pnt 3284 3740 Pnt 3207 3747 Pnt 3601 3754 Pnt 3147 3750 Pnt 2786 3749 Pnt 2420 3741 Pnt 3222 3740 Pnt 2644 3749 Pnt 3268 3749 Pnt 2467 3751 Pnt 2636 3750 Pnt 2516 3738 Pnt 2941 3739 Pnt 3409 3755 Pnt 2819 3743 Pnt 2881 3742 Pnt 2621 3748 Pnt 2419 3735 Pnt 2988 3748 Pnt 2704 3758 Pnt 3364 2833 Pnt 2178 3742 Pnt 2489 3746 Pnt 3095 3746 Pnt 2855 3809 Pnt 2882 3738 Pnt 2399 3734 Pnt 2290 3746 Pnt 3020 3740 Pnt 2976 3754 Pnt 2256 3746 Pnt 2350 3787 Pnt 2446 3740 Pnt 2610 3741 Pnt 2838 3786 Pnt 2566 3755 Pnt 2659 3741 Pnt 2490 3750 Pnt 2294 3774 Pnt 3171 3759 Pnt 2367 3754 Pnt 2967 3769 Pnt 3386 3759 Pnt 2040 3757 Pnt 3065 3747 Pnt 2855 3754 Pnt 2926 3735 Pnt 2390 3736 Pnt 3383 3747 Pnt 2403 3779 Pnt 2764 3743 Pnt 2343 3814 Pnt 2547 3825 Pnt 2787 3752 Pnt 3042 3744 Pnt 2432 3738 Pnt 2614 3747 Pnt 2544 3747 Pnt 3446 3750 Pnt 2904 3745 Pnt 2654 3782 Pnt 2603 3741 Pnt 3017 3736 Pnt 2326 3755 Pnt 3029 3776 Pnt 2717 3763 Pnt 2594 3750 Pnt 3252 3763 Pnt 2585 3751 Pnt 2674 3741 Pnt 3050 3789 Pnt 2670 3735 Pnt 2541 3746 Pnt 2962 3741 Pnt 2676 3764 Pnt 2809 3735 Pnt 3408 3741 Pnt 2675 3742 Pnt 2215 3738 Pnt 3371 3764 Pnt 2621 3746 Pnt 2846 3750 Pnt 3152 3752 Pnt 2911 3742 Pnt 2923 3737 Pnt 3588 3750 Pnt 2440 3737 Pnt 2561 3749 Pnt 2307 3738 Pnt 2892 3796 Pnt 2625 3755 Pnt 2152 3768 Pnt 2739 3750 Pnt 2902 3741 Pnt 2788 3740 Pnt 2481 3744 Pnt 2423 3738 Pnt 2440 3749 Pnt 2649 3767 Pnt 2115 3800 Pnt 2802 3749 Pnt 2657 3757 Pnt 2974 3738 Pnt 2253 3741 Pnt 3002 3800 Pnt 2876 3749 Pnt 2025 3737 Pnt 3204 3778 Pnt 2852 3781 Pnt 2384 3827 Pnt 2878 2724 Pnt 2312 3747 Pnt 2578 3746 Pnt 2783 3761 Pnt 2272 3925 Pnt 3538 3749 Pnt 2880 3746 Pnt 2503 3734 Pnt 3258 3761 Pnt 2242 3759 Pnt 2340 3736 Pnt 2515 3734 Pnt 3238 3743 Pnt 2255 3739 Pnt 3411 3748 Pnt 2780 3742 Pnt 3096 3745 Pnt 2729 3738 Pnt 2772 3748 Pnt 2653 3748 Pnt 2886 3755 Pnt 2586 3755 Pnt 2423 3734 Pnt 2192 3740 Pnt 2648 3736 Pnt 3136 3743 Pnt 3283 3771 Pnt 3762 3749 Pnt 2757 3768 Pnt 2532 3737 Pnt 2767 3745 Pnt 1955 3821 Pnt 2710 3750 Pnt 2560 3820 Pnt 2925 3741 Pnt 2324 3741 Pnt 3311 3755 Pnt 2168 3740 Pnt 2401 3811 Pnt 2374 3739 Pnt 3248 2518 Pnt 2506 3751 Pnt 2878 3775 Pnt 2039 3758 Pnt 4108 3775 Pnt 2598 3741 Pnt 2999 3757 Pnt 2852 3743 Pnt 3437 3749 Pnt 2593 3743 Pnt 2278 3738 Pnt 2747 3767 Pnt 2654 3749 Pnt 2667 3738 Pnt 2421 3742 Pnt 2635 3740 Pnt 3490 3740 Pnt 2536 3753 Pnt 2224 3765 Pnt 2138 3740 Pnt 2607 3752 Pnt 3277 3740 Pnt 2330 3741 Pnt 2887 3755 Pnt 2833 3743 Pnt 2741 3749 Pnt 2437 3758 Pnt 2625 3739 Pnt 2219 3759 Pnt 3169 3746 Pnt 3668 3742 Pnt 2843 3739 Pnt 2535 3782 Pnt 2817 3744 Pnt 2188 3747 Pnt 2927 3757 Pnt 3294 3741 Pnt 3615 3739 Pnt 2729 3739 Pnt 2875 3760 Pnt 2343 3733 Pnt 2730 3735 Pnt 2392 3823 Pnt 2392 3821 Pnt 2343 3752 Pnt 2428 2794 Pnt 3227 3748 Pnt 3337 3748 Pnt 2723 3788 Pnt 2527 3744 Pnt 3590 3750 Pnt 3151 3744 Pnt 4048 3746 Pnt 2714 3743 Pnt 3179 3741 Pnt 3410 3757 Pnt 2323 3737 Pnt 2201 3743 Pnt 2352 3784 Pnt 2925 3742 Pnt 3503 3743 Pnt 2455 3755 Pnt 2377 3749 Pnt 3214 3743 Pnt 3316 3748 Pnt 2973 3740 Pnt 3194 3743 Pnt 3041 3742 Pnt 1930 3749 Pnt 3248 3740 Pnt 3169 2664 Pnt 2311 3740 Pnt 2705 3743 Pnt 2336 3744 Pnt 2503 3742 Pnt 2247 3758 Pnt 3757 3776 Pnt 2759 3743 Pnt 2629 3744 Pnt 2773 3737 Pnt 2546 3743 Pnt 2678 3751 Pnt 2424 3747 Pnt 2882 3766 Pnt 2233 3748 Pnt 2915 3738 Pnt 2501 3760 Pnt 2242 3742 Pnt 2260 3804 Pnt 2511 3754 Pnt 2762 3766 Pnt 2624 3737 Pnt 2665 3741 Pnt 3542 3748 Pnt 2466 3782 Pnt 2435 3734 Pnt 2198 3793 Pnt 2424 3758 Pnt 3160 2692 Pnt 2173 3782 Pnt 2823 3799 Pnt 2546 3745 Pnt 2045 3825 Pnt 2604 3767 Pnt 2635 3753 Pnt 2414 3864 Pnt 3802 3744 Pnt 2711 3761 Pnt 2758 3744 Pnt 3239 3752 Pnt 3641 2595 Pnt 2283 3746 Pnt 2739 2637 Pnt 3204 3763 Pnt 2581 3744 Pnt 3102 3747 Pnt 3746 3750 Pnt 3097 3752 Pnt 3356 3755 Pnt 3104 3734 Pnt 2879 3749 Pnt 3214 2333 Pnt 2801 3742 Pnt 2294 3771 Pnt 2074 3784 Pnt 3475 2804 Pnt 2427 3791 Pnt 3586 3754 Pnt 2529 3775 Pnt 2948 3742 Pnt 2321 3734 Pnt 2582 3803 Pnt 2735 3770 Pnt 3367 3734 Pnt 3154 3746 Pnt 2804 3765 Pnt 2386 3749 Pnt 3070 3770 Pnt 2060 3762 Pnt 3559 3747 Pnt 2319 3748 Pnt 2005 3775 Pnt 2638 3742 Pnt 2620 3741 Pnt 3234 3746 Pnt 2685 3744 Pnt 2348 3789 Pnt 4030 2526 Pnt 3375 2559 Pnt 2733 3750 Pnt 2422 3741 Pnt 3289 3768 Pnt 4047 3741 Pnt 2777 3732 Pnt 2559 3798 Pnt 2823 3750 Pnt 2513 3743 Pnt 3131 3743 Pnt 2979 3745 Pnt 2568 3738 Pnt 3484 3750 Pnt 2953 3743 Pnt 3088 2708 Pnt 2814 3747 Pnt 3449 3760 Pnt 3181 3747 Pnt 2651 3735 Pnt 3128 3759 Pnt 2839 3758 Pnt 3770 3737 Pnt 2470 3737 Pnt 2613 3737 Pnt 2455 3739 Pnt 3152 3739 Pnt 2356 3742 Pnt 2067 3738 Pnt 3071 3743 Pnt 2519 3751 Pnt 2936 3779 Pnt 4060 3738 Pnt 2802 3747 Pnt 2578 3745 Pnt 2862 3737 Pnt 2529 3744 Pnt 3016 3754 Pnt 2700 3738 Pnt 2688 3743 Pnt 2808 3742 Pnt 2832 3746 Pnt 2691 3736 Pnt 3011 2611 Pnt 2875 3747 Pnt 2527 3735 Pnt 3210 3746 Pnt 2522 3747 Pnt 2646 3742 Pnt 2507 3749 Pnt 2334 3801 Pnt 2661 3747 Pnt 2902 3759 Pnt 2546 3766 Pnt 3523 3749 Pnt 2547 3743 Pnt 2346 3794 Pnt 3233 3749 Pnt 2702 3740 Pnt 3346 3747 Pnt 2388 3738 Pnt 2501 3746 Pnt 3412 3746 Pnt 2794 3757 Pnt 2421 3795 Pnt 3055 3747 Pnt 2947 3747 Pnt 2796 3784 Pnt 2107 3815 Pnt 2895 3795 Pnt 2590 2244 Pnt 2101 3806 Pnt 2759 3770 Pnt 2867 3741 Pnt 2245 3766 Pnt 3017 3744 Pnt 2540 3754 Pnt 2301 3743 Pnt 3123 3754 Pnt 2599 3757 Pnt 3319 3753 Pnt 3072 3750 Pnt 2601 3759 Pnt 3384 3742 Pnt 3009 3749 Pnt 2629 3742 Pnt 3773 3749 Pnt 3447 3736 Pnt 2914 3742 Pnt 2535 3741 Pnt 2856 3741 Pnt 2298 3758 Pnt 3139 2940 Pnt 2609 3746 Pnt 1799 3770 Pnt 2862 3770 Pnt 2793 3747 Pnt 2078 3807 Pnt 2152 3748 Pnt 3522 3752 Pnt 2646 3738 Pnt 2581 3745 Pnt 3602 3770 Pnt 2337 3746 Pnt 2659 3744 Pnt 2137 3749 Pnt 3340 3763 Pnt 2260 3740 Pnt 2342 3744 Pnt 2032 3920 Pnt 3238 3748 Pnt 2745 3743 Pnt 2354 3734 Pnt 3068 3920 Pnt 2783 3743 Pnt 3885 3763 Pnt 2593 3740 Pnt 3215 3748 Pnt 3530 3736 Pnt 2754 3740 Pnt 3256 3733 Pnt 2194 3760 Pnt 2501 3754 Pnt 2982 3758 Pnt 3456 3757 Pnt 2426 3760 Pnt 2524 3741 Pnt 3864 3758 Pnt 3102 3734 Pnt 2515 3766 Pnt 2945 3759 Pnt 2755 3746 Pnt 2503 2643 Pnt 2448 3740 Pnt 3366 3754 Pnt 2769 3742 Pnt 2866 3759 Pnt 2518 3739 Pnt 2773 3805 Pnt 2861 3746 Pnt 2796 3804 Pnt 2997 3740 Pnt 2668 3763 Pnt 3290 3763 Pnt 2979 3747 Pnt 2713 3813 Pnt 3117 3741 Pnt 2404 3789 Pnt 2954 3738 Pnt 2992 3738 Pnt 2823 3742 Pnt 2615 3749 Pnt 2510 3745 Pnt 2173 3766 Pnt 2695 3735 Pnt 3136 3742 Pnt 2549 3742 Pnt 2106 3787 Pnt 2881 3766 Pnt 2235 3762 Pnt 1901 3754 Pnt 2595 3769 Pnt 3497 3742 Pnt 2473 3741 Pnt 2995 3747 Pnt 2721 3739 Pnt 2780 3742 Pnt 2108 3783 Pnt 3008 3750 Pnt 3350 3736 Pnt 2102 3816 Pnt 1965 3790 Pnt 2433 3778 Pnt 2476 3748 Pnt 2797 3738 Pnt 2696 3736 Pnt 2461 3749 Pnt 3034 3742 Pnt 2302 3735 Pnt 2394 3797 Pnt 2542 3752 Pnt 2969 3749 Pnt 2641 3794 Pnt 2658 3736 Pnt 3161 3749 Pnt 2947 3749 Pnt 3051 3747 Pnt 2409 3735 Pnt 2751 3753 Pnt 2583 3744 Pnt 2771 3745 Pnt 2536 3797 Pnt 2563 3743 Pnt 3220 3753 Pnt 2309 3740 Pnt 3025 3749 Pnt 2540 3738 Pnt 2929 3738 Pnt 2792 3745 Pnt 2240 3755 Pnt 2744 3741 Pnt 2860 3753 Pnt 2789 3749 Pnt 2798 3739 Pnt 2003 3813 Pnt 3816 3740 Pnt 3326 3749 Pnt 2836 3736 Pnt 2558 3814 Pnt 2946 3756 Pnt 2603 3746 Pnt 3089 3733 Pnt 3341 2542 Pnt 2549 3780 Pnt 1973 3786 Pnt 2395 3801 Pnt 3390 3746 Pnt 2689 3741 Pnt 2968 3745 Pnt 3073 2692 Pnt 3219 3805 Pnt 2588 3824 Pnt 2919 3739 Pnt 3185 3777 Pnt 3302 3777 Pnt 2740 3800 Pnt 2487 3776 Pnt 2945 3738 Pnt 2891 3745 Pnt 2733 3737 Pnt 2398 3738 Pnt 3310 3741 Pnt 2416 3743 Pnt 2384 3767 Pnt 2243 3749 Pnt 3309 3745 Pnt 2097 3807 Pnt 3052 3744 Pnt 2251 3823 Pnt 2992 3763 Pnt 2657 3740 Pnt 3279 3742 Pnt 2485 3807 Pnt 2797 3755 Pnt 2534 3822 Pnt 2063 3776 Pnt 3006 3755 Pnt 2670 3747 Pnt 2861 3744 Pnt 2738 3756 Pnt 3111 3743 Pnt 2820 3744 Pnt 3620 3742 Pnt 2808 3761 Pnt 2452 3775 Pnt 2506 3775 Pnt 2495 3758 Pnt 3573 3756 Pnt 2313 3743 Pnt 3425 2727 Pnt 2754 3754 Pnt 2438 3742 Pnt 2398 3796 Pnt 3002 3745 Pnt 2960 3748 Pnt 2737 3748 Pnt 2638 3742 Pnt 2743 3751 Pnt 3057 3742 Pnt 2833 3734 Pnt 2666 3771 Pnt 2293 3735 Pnt 2172 3781 Pnt 2903 3740 Pnt 2538 3763 Pnt 2980 3761 Pnt 2550 3743 Pnt 3033 3750 Pnt 3114 3739 Pnt 2300 3741 Pnt 3241 3748 Pnt 2592 3750 Pnt 1897 3898 Pnt 2528 3747 Pnt 3022 3760 Pnt 2797 3746 Pnt 3176 3750 Pnt 2939 3756 Pnt 2420 3769 Pnt 2415 3770 Pnt 3052 3787 Pnt 2711 3750 Pnt 3056 3748 Pnt 3678 3750 Pnt 2909 3744 Pnt 3090 3744 Pnt 2929 3739 Pnt 2721 3754 Pnt 3176 3745 Pnt 3128 3746 Pnt 2459 3759 Pnt 2102 3739 Pnt 2631 3755 Pnt 2749 3743 Pnt 3097 2582 Pnt 4090 3745 Pnt 3073 3780 Pnt 2677 3749 Pnt 3177 3742 Pnt 2878 3758 Pnt 2643 3740 Pnt 3422 3747 Pnt 3105 2603 Pnt 2842 3758 Pnt 2794 3742 Pnt 2557 3767 Pnt 2462 3746 Pnt 3093 3795 Pnt 3815 3749 Pnt 2412 3745 Pnt 3000 3741 Pnt 2868 3751 Pnt 2438 3743 Pnt 2884 3749 Pnt 2806 3764 Pnt 2415 3764 Pnt 2315 3755 Pnt 2355 3781 Pnt 2839 3786 Pnt 2030 3799 Pnt 2890 3763 Pnt 2601 3744 Pnt 3542 3765 Pnt 2566 3745 Pnt 2570 3768 Pnt 3126 3757 Pnt 3604 3745 Pnt 2899 3891 Pnt 2656 3741 Pnt 3170 3739 Pnt 3573 3891 Pnt 4095 2959 Pnt 2471 3737 Pnt 2781 3774 Pnt 2889 3740 Pnt 2630 3765 Pnt 3222 3737 Pnt 2187 3774 Pnt 2443 3750 Pnt 2901 3809 Pnt 3194 3743 Pnt 2912 3809 Pnt 3275 2637 Pnt 2663 3739 Pnt 2287 3796 Pnt 3120 3739 Pnt 4168 3747 Pnt 2597 3741 Pnt 2961 3751 Pnt 2965 3743 Pnt 2524 3746 Pnt 3189 3745 Pnt 2416 3744 Pnt 2899 3793 Pnt 3055 3742 Pnt 2478 3772 Pnt 2885 3738 Pnt 3018 3754 Pnt 2357 3752 Pnt 3163 3757 Pnt 1994 3790 Pnt 2796 3745 Pnt 3577 3738 Pnt 2469 3747 Pnt 2719 3737 Pnt 3024 3739 Pnt 2836 3737 Pnt 3330 3744 Pnt 3026 3778 Pnt 2388 3749 Pnt 2904 3742 Pnt 2530 3752 Pnt 2705 3740 Pnt 2592 3799 Pnt 2436 3756 Pnt 3447 3751 Pnt 2541 3739 Pnt 2900 3739 Pnt 2746 3744 Pnt 2529 3751 Pnt 3212 3748 Pnt 2698 3757 Pnt 2639 3760 Pnt 2111 3773 Pnt 1953 3934 Pnt 1828 3782 Pnt 3179 3760 Pnt 3008 3745 Pnt 2505 3778 Pnt 2995 3742 Pnt 2605 3737 Pnt 3866 3760 Pnt 3464 3746 Pnt 2668 2768 Pnt 2777 3736 Pnt 2934 3751 Pnt 3231 3754 Pnt 2461 3744 Pnt 2665 3739 Pnt 2514 3735 Pnt 2311 3737 Pnt 2502 3743 Pnt 2640 3738 Pnt 2084 3773 Pnt 3341 3738 Pnt 1933 3761 Pnt 3052 3746 Pnt 2040 3775 Pnt 2487 3764 Pnt 2544 3765 Pnt 2639 2844 Pnt 1997 3743 Pnt 2226 3811 Pnt 3577 3737 Pnt 2721 3734 Pnt 3436 3746 Pnt 2767 3746 Pnt 2424 3753 Pnt 3499 3749 Pnt 2507 3746 Pnt 3269 3746 Pnt 3593 3741 Pnt 2547 3743 Pnt 2859 3745 Pnt 3480 3738 Pnt 2113 3735 Pnt 3132 2510 Pnt 2305 3742 Pnt 2823 3744 Pnt 2606 3742 Pnt 3316 3742 Pnt 2626 3746 Pnt 2674 3740 Pnt 3419 3742 Pnt 2666 3743 Pnt 2594 3749 Pnt 3308 3754 Pnt 2414 3752 Pnt 2526 3736 Pnt 2351 2674 Pnt 2779 3765 Pnt 2350 3736 Pnt 2865 3738 Pnt 2512 3745 Pnt 2848 3743 Pnt 2824 3739 Pnt 2783 3741 Pnt 2463 3742 Pnt 2622 3742 Pnt 2410 3754 Pnt 3028 3763 Pnt 3575 3752 Pnt 3048 3742 Pnt 2543 3738 Pnt 2525 3768 Pnt 2072 3741 Pnt 2713 3738 Pnt 2563 3778 Pnt 2579 3764 Pnt 2288 3745 Pnt 2593 3750 Pnt 2037 3782 Pnt 3101 3774 Pnt 2081 3766 Pnt 3160 3749 Pnt 2906 3740 Pnt 2351 3809 Pnt 2672 3758 Pnt 1961 3759 Pnt 2561 3738 Pnt 2474 3753 Pnt 3218 3732 Pnt 2594 3740 Pnt 2448 3741 Pnt 3149 3758 Pnt 2608 3741 Pnt 2443 3770 Pnt 2388 3742 Pnt 2074 3778 Pnt 2840 3739 Pnt 3414 3750 Pnt 2667 3770 Pnt 2430 3756 Pnt 3104 3778 Pnt 2419 3774 Pnt 3150 3777 Pnt 2466 3736 Pnt 3177 3746 Pnt 2981 3747 Pnt 2637 3749 Pnt 2349 3769 Pnt 3328 3747 Pnt 3067 3740 Pnt 2176 3746 Pnt 3591 3747 Pnt 2565 3739 Pnt 2632 3767 Pnt 3520 3739 Pnt 2456 3751 Pnt 2575 2602 Pnt 3760 3748 Pnt 2482 3742 Pnt 2744 3744 Pnt 2586 3750 Pnt 2747 3741 Pnt 2549 3748 Pnt 2708 3752 Pnt 2601 2606 Pnt 2788 3747 Pnt 2634 3792 Pnt 2586 3758 Pnt 2315 3787 Pnt 2301 3741 Pnt 3234 3746 Pnt 2797 3747 Pnt 3007 3754 Pnt 2539 3735 Pnt 2244 3738 Pnt 2704 3741 Pnt 2443 3740 Pnt 2725 3760 Pnt 2308 3755 Pnt 2041 3784 Pnt 3059 3739 Pnt 3220 3742 Pnt 2528 3749 Pnt 2539 3741 Pnt 2493 3844 Pnt 2535 3761 Pnt 2627 3735 Pnt 3313 3844 Pnt 3445 3758 Pnt 2879 3749 Pnt 2938 3773 Pnt 2791 3749 Pnt 2807 3748 Pnt 2655 3747 Pnt 2938 3749 Pnt 2696 3757 Pnt 3518 3742 Pnt 2606 3741 Pnt 3251 3749 Pnt 2477 3740 Pnt 3295 2603 Pnt 3012 3829 Pnt 2266 3738 Pnt 2919 3796 Pnt 2551 3741 Pnt 3540 3757 Pnt 2645 3736 Pnt 2078 3768 Pnt 2180 3746 Pnt 2613 3825 Pnt 2260 3749 Pnt 2785 3789 Pnt 2547 3752 Pnt 2066 3754 Pnt 2501 3755 Pnt 2237 3773 Pnt 2397 3785 Pnt 2404 3806 Pnt 2820 3767 Pnt 2702 3739 Pnt 2430 3763 Pnt 2471 3737 Pnt 2898 3741 Pnt 2386 3744 Pnt 2729 3736 Pnt 2409 3738 Pnt 2618 3747 Pnt 2390 3753 Pnt 2687 3740 Pnt 2408 3739 Pnt 2436 3739 Pnt 2509 3736 Pnt 2215 3741 Pnt 2958 3749 Pnt 2782 3740 Pnt 2644 3748 Pnt 2491 2578 Pnt 2314 3760 Pnt 3171 3748 Pnt 2734 3789 Pnt 2220 3768 Pnt 2825 3734 Pnt 2808 3778 Pnt 2614 3736 Pnt 2449 3742 Pnt 2516 3760 Pnt 2179 3925 Pnt 2461 3741 Pnt 3273 3738 Pnt 2495 3746 Pnt 2439 3742 Pnt 3348 3748 Pnt 2974 2603 Pnt 2117 3759 Pnt 3024 3761 Pnt 2296 3736 Pnt 2941 3743 Pnt 2919 3753 Pnt 3284 3745 Pnt 2841 3736 Pnt 3421 3745 Pnt 2732 3755 Pnt 3382 2066 Pnt 3118 3749 Pnt 2324 3820 Pnt 2488 3811 Pnt 2595 3748 Pnt 2615 3751 Pnt 4102 3820 Pnt 3379 3733 Pnt 2889 3754 Pnt 2527 3755 Pnt 3947 3784 Pnt 2485 3775 Pnt 2596 3742 Pnt 2499 3754 Pnt 3092 3740 Pnt 2173 3773 Pnt 2461 3753 Pnt 3056 3741 Pnt 2442 3745 Pnt 3347 3740 Pnt 2842 3741 Pnt 3317 3740 Pnt 2572 3740 Pnt 2648 3788 Pnt 2357 3737 Pnt 2693 3750 Pnt 3045 3743 Pnt 2635 3744 Pnt 2998 3744 Pnt 3043 3764 Pnt 2999 3740 Pnt 3745 3741 Pnt 3018 3743 Pnt 3247 3740 Pnt 2701 3762 Pnt 2976 3755 Pnt 2653 3735 Pnt 2981 3745 Pnt 4227 3736 Pnt 2404 3740 Pnt 3036 3754 Pnt 2490 3743 Pnt 3367 3785 Pnt 2880 3743 Pnt 2892 3740 Pnt 2845 3746 Pnt 3129 3785 Pnt 2937 3749 Pnt 2656 3741 Pnt 2477 3743 Pnt 2777 3739 Pnt 2396 3740 Pnt 2995 3737 Pnt 2635 3743 Pnt 2747 3735 Pnt 2267 3744 Pnt 2599 3752 Pnt 2964 3743 Pnt 3913 3767 Pnt 2681 3753 Pnt 2646 3741 Pnt 3234 3752 Pnt 2619 3748 Pnt 2893 3744 Pnt 2842 3756 Pnt 3234 3756 Pnt 2316 3738 Pnt 3177 3753 Pnt 2387 3737 Pnt 3055 3780 Pnt 2504 3866 Pnt 2202 3821 Pnt 2653 3744 Pnt 2960 3742 Pnt 2640 3751 Pnt 3178 3771 Pnt 2607 3743 Pnt 3056 3764 Pnt 2923 3744 Pnt 2958 3736 Pnt 2621 3743 Pnt 2638 3758 Pnt 3022 3745 Pnt 3419 3737 Pnt 2770 3742 Pnt 3127 3743 Pnt 2476 3742 Pnt 2467 3735 Pnt 2650 3782 Pnt 2592 3742 Pnt 2458 3758 Pnt 3155 3746 Pnt 2450 3776 Pnt 2025 3761 Pnt 2256 3747 Pnt 2873 3735 Pnt 2850 3741 Pnt 3087 3747 Pnt 2921 3744 Pnt 3196 3742 Pnt 2814 3750 Pnt 3475 3743 Pnt 2147 3792 Pnt 3067 3740 Pnt 2671 3746 Pnt 2708 3739 Pnt 3099 3741 Pnt 3400 3743 Pnt 2831 3737 Pnt 2736 3733 Pnt 2521 3747 Pnt 3321 3742 Pnt 2248 3752 Pnt 2322 3742 Pnt 3955 2514 Pnt 2318 3754 Pnt 2874 3744 Pnt 3063 3743 Pnt 3079 3738 Pnt 2264 3786 Pnt 2946 3745 Pnt 2266 3742 Pnt 3005 3763 Pnt 2872 3737 Pnt 2576 3800 Pnt 3171 3768 Pnt 2516 3746 Pnt 2699 3744 Pnt 3041 3756 Pnt 3166 3746 Pnt 4130 3758 Pnt 2771 3740 Pnt 2611 3758 Pnt 2386 3742 Pnt 2572 3747 Pnt 3066 3754 Pnt 3303 3757 Pnt 2952 3741 Pnt 2274 3749 Pnt 4276 3745 Pnt 2544 3771 Pnt 2395 3760 Pnt 3105 3778 Pnt 3211 2783 Pnt 2256 3749 Pnt 2692 3748 Pnt 3260 3738 Pnt 2624 3768 Pnt 2762 3827 Pnt 2776 3738 Pnt 2221 3796 Pnt 3086 3782 Pnt 3156 3744 Pnt 2491 3749 Pnt 2273 3748 Pnt 2872 3744 Pnt 2571 3753 Pnt 2946 3757 Pnt 2760 3738 Pnt 3785 3743 Pnt 2854 3753 Pnt 2953 3738 Pnt 2407 3745 Pnt 2387 3743 Pnt 2672 3745 Pnt 3159 3743 Pnt 2655 3749 Pnt 2840 3744 Pnt 2908 3766 Pnt 2888 3743 Pnt 3043 3744 Pnt 3380 3750 Pnt 3139 3742 Pnt 2479 3803 Pnt 3005 3734 Pnt 2394 3734 Pnt 3110 3746 Pnt 2220 3790 Pnt 3521 2544 Pnt 2712 3753 Pnt 3677 3759 Pnt 2639 3765 Pnt 2173 3740 Pnt 3142 3753 Pnt 2266 3749 Pnt 2114 3735 Pnt 2524 3750 Pnt 2171 3797 Pnt 2157 3735 Pnt 2501 3754 Pnt 3331 2611 Pnt 2516 3795 Pnt 2600 3782 Pnt 2118 3761 Pnt 3638 3762 Pnt 2644 3746 Pnt 3058 3772 Pnt 2238 3754 Pnt 1980 3775 Pnt 2201 3739 Pnt 3946 3757 Pnt 2825 3749 Pnt 3273 3739 Pnt 2921 3742 Pnt 2464 3758 Pnt 3274 3738 Pnt 2638 3741 Pnt 2283 3744 Pnt 3258 3745 Pnt 2344 3741 Pnt 1990 3825 Pnt 2254 3746 Pnt 3304 3747 Pnt 3103 3746 Pnt 2385 3742 Pnt 2252 3763 Pnt 2921 3752 Pnt 2828 3789 Pnt 2607 3750 Pnt 3019 2654 Pnt 1990 3920 Pnt 3204 3747 Pnt 3210 3752 Pnt 2983 3752 Pnt 2564 3744 Pnt 2210 3766 Pnt 2992 3746 Pnt 2592 3760 Pnt 2774 3749 Pnt 2706 3769 Pnt 2429 3749 Pnt 3702 3760 Pnt 2912 3750 Pnt 3170 3750 Pnt 2481 3750 Pnt 3345 3747 Pnt 2435 3800 Pnt 2680 3742 Pnt 2335 3752 Pnt 3219 3742 Pnt 2623 3747 Pnt 2350 3732 Pnt 2565 3743 Pnt 2340 3749 Pnt 3049 3747 Pnt 3015 2489 Pnt 2890 3775 Pnt 2852 3746 Pnt 3052 3740 Pnt 2658 3737 Pnt 2847 3740 Pnt 2697 3746 Pnt 2247 3749 Pnt 2430 3740 Pnt 2619 3809 Pnt 3344 3749 Pnt 2814 3743 Pnt 2685 3747 Pnt 2699 3745 Pnt 2601 3747 Pnt 2581 3817 Pnt 3139 3745 Pnt 2901 3742 Pnt 2671 3749 Pnt 3594 3753 Pnt 2354 3773 Pnt 2539 3797 Pnt 2896 3737 Pnt 2805 3740 Pnt 2814 3766 Pnt 2696 3784 Pnt 2546 3757 Pnt 2451 3738 Pnt 2747 3741 Pnt 2713 3743 Pnt 2733 3749 Pnt 2820 3743 Pnt 2675 3770 Pnt 2574 3769 Pnt 2953 3753 Pnt 2375 3763 Pnt 2924 2494 Pnt 2500 3754 Pnt 2854 3737 Pnt 3060 3743 Pnt 2519 3739 Pnt 3014 3744 Pnt 2804 3755 Pnt 2419 3804 Pnt 2748 3758 Pnt 2883 3734 Pnt 3050 3753 Pnt 2919 3742 Pnt 3147 3766 Pnt 2555 3745 Pnt 2640 3758 Pnt 2996 3755 Pnt 3479 3745 Pnt 3493 3737 Pnt 2885 3743 Pnt 2719 3807 Pnt 2647 3742 Pnt 2029 3738 Pnt 2218 3779 Pnt 2370 3754 Pnt 2721 3747 Pnt 2944 3742 Pnt 2702 3748 Pnt 2708 3736 Pnt 3592 3779 Pnt 2642 3770 Pnt 2625 3741 Pnt 3061 3740 Pnt 3292 3752 Pnt 2245 3753 Pnt 2595 3746 Pnt 2108 3771 Pnt 2181 3789 Pnt 3116 3740 Pnt 2771 3749 Pnt 3196 3741 Pnt 2187 3778 Pnt 3305 3747 Pnt 3243 3770 Pnt 2663 3741 Pnt 2671 3749 Pnt 2032 3790 Pnt 3101 3742 Pnt 3101 3746 Pnt 2737 3748 Pnt 3109 3744 Pnt 2320 3755 Pnt 2338 3735 Pnt 2155 3758 Pnt 2660 3744 Pnt 2302 3746 Pnt 3537 3755 Pnt 3018 3736 Pnt 2222 3786 Pnt 3369 2542 Pnt 3743 3742 Pnt 2858 3748 Pnt 2916 3744 Pnt 2449 3737 Pnt 3576 3736 Pnt 2875 3746 Pnt 2213 3735 Pnt 2504 3797 Pnt 2887 3788 Pnt 3408 3737 Pnt 2752 3747 Pnt 3052 3735 Pnt 2563 3736 Pnt 2585 3746 Pnt 2622 3739 Pnt 2931 3742 Pnt 2637 3747 Pnt 2847 3808 Pnt 2895 3743 Pnt 3821 3797 Pnt 2091 3783 Pnt 2748 3782 Pnt 2670 3740 Pnt 2559 3744 Pnt 2281 3736 Pnt 2320 3748 Pnt 2921 3742 Pnt 2637 3742 Pnt 2616 3773 Pnt 2554 3818 Pnt 2902 3742 Pnt 2935 3773 Pnt 2266 3760 Pnt 2853 3824 Pnt 2613 3751 Pnt 2504 3742 Pnt 2060 3749 Pnt 2676 3777 Pnt 2756 3741 Pnt 2826 3763 Pnt 3238 3777 Pnt 2714 3773 Pnt 2502 3739 Pnt 2989 3745 Pnt 2088 3813 Pnt 3279 3754 Pnt 2625 3740 Pnt 3099 3745 Pnt 3010 3742 Pnt 2430 3768 Pnt 2119 3760 Pnt 2105 3792 Pnt 1976 3763 Pnt 2590 3758 Pnt 3490 3758 Pnt 3318 3743 Pnt 2662 3740 Pnt 2291 3796 Pnt 2543 3787 Pnt 2583 3740 Pnt 3868 3751 Pnt 2740 3744 Pnt 2637 3740 Pnt 3477 3761 Pnt 1956 3768 Pnt 2461 3763 Pnt 2591 3749 Pnt 2543 3746 Pnt 2387 3738 Pnt 2875 3743 Pnt 2925 3746 Pnt 2410 3741 Pnt 3475 3757 Pnt 3270 3749 Pnt 2847 3751 Pnt 2407 3739 Pnt 2589 3742 Pnt 1910 3764 Pnt 3936 2852 Pnt 2215 3795 Pnt 2430 3789 Pnt 2817 3753 Pnt 2389 3795 Pnt 2384 3744 Pnt 2640 3743 Pnt 1953 3822 Pnt 3085 3745 Pnt 2887 3745 Pnt 3059 3757 Pnt 2671 3760 Pnt 3262 3744 Pnt 2885 3739 Pnt 2715 3772 Pnt 2830 3750 Pnt 2246 3766 Pnt 3033 3744 Pnt 3132 3749 Pnt 2660 3739 Pnt 2623 3800 Pnt 2803 3752 Pnt 2769 3745 Pnt 3030 3759 Pnt 3459 2530 Pnt 3110 3739 Pnt 2421 3757 Pnt 3645 3780 Pnt 3346 3733 Pnt 2996 3742 Pnt 3277 3779 Pnt 2960 3739 Pnt 3281 3742 Pnt 2780 3750 Pnt 2864 3738 Pnt 2800 3748 Pnt 3656 3747 Pnt 3602 3761 Pnt 2610 3743 Pnt 2866 3758 Pnt 3680 3743 Pnt 2967 3754 Pnt 2454 3754 Pnt 3585 3746 Pnt 2558 3809 Pnt 2734 3738 Pnt 2479 3739 Pnt 2784 3745 Pnt 3441 3739 Pnt 2872 3742 Pnt 2715 3741 Pnt 3816 3746 Pnt 2911 3737 Pnt 2249 3743 Pnt 2660 3749 Pnt 3336 3743 Pnt 2852 3766 Pnt 3408 3745 Pnt 2832 3747 Pnt 2574 3741 Pnt 3516 2703 Pnt 2476 3796 Pnt 2507 3738 Pnt 3591 3741 Pnt 3358 3759 Pnt 2813 3755 Pnt 2818 3741 Pnt 1954 3753 Pnt 3287 3802 Pnt 2812 3739 Pnt 2369 3776 Pnt 2187 3751 Pnt 2950 3738 Pnt 3223 2484 Pnt 2989 3739 Pnt 3273 3748 Pnt 2771 3738 Pnt 2716 3751 Pnt 2871 3747 Pnt 2615 3771 Pnt 2515 3753 Pnt 2529 3740 Pnt 2180 3762 Pnt 3047 3741 Pnt 2918 3741 Pnt 2153 3735 Pnt 3364 3746 Pnt 2347 3758 Pnt 2350 3774 Pnt 2584 3774 Pnt 2595 3749 Pnt 2898 3748 Pnt 2618 3782 Pnt 2759 3741 Pnt 2611 3774 Pnt 2590 3750 Pnt 2318 3750 Pnt 2682 2690 Pnt 2348 3737 Pnt 3457 3740 Pnt 2484 3760 Pnt 3352 3746 Pnt 2529 3738 Pnt 2121 3761 Pnt 2700 3764 Pnt 3059 3746 Pnt 2681 3739 Pnt 2686 3738 Pnt 2796 3766 Pnt 2333 3794 Pnt 3256 3739 Pnt 2181 3782 Pnt 1876 3790 Pnt 2810 3756 Pnt 2381 3756 Pnt 2331 3801 Pnt 2814 3745 Pnt 2709 3759 Pnt 3102 3741 Pnt 2697 3744 Pnt 3142 3759 Pnt 2868 3733 Pnt 2585 3737 Pnt 2590 3749 Pnt 2563 3741 Pnt 2276 3743 Pnt 2095 3898 Pnt 1961 3749 Pnt 3950 3744 Pnt 2808 3805 Pnt 3058 3743 Pnt 2541 3767 Pnt 3398 3740 Pnt 2726 3753 Pnt 2484 3814 Pnt 2868 3742 Pnt 2632 3744 Pnt 2330 3749 Pnt 2856 3757 Pnt 2753 3738 Pnt 2501 3747 Pnt 2379 3752 Pnt 2893 3754 Pnt 3071 3746 Pnt 2686 3738 Pnt 2819 2892 Pnt 2440 3744 Pnt 2200 3807 Pnt 2512 3746 Pnt 2326 3788 Pnt 3325 3751 Pnt 2939 3751 Pnt 3086 3744 Pnt 2842 3740 Pnt 2351 3735 Pnt 3453 3756 Pnt 2877 3739 Pnt 2193 3738 Pnt 3650 3739 Pnt 2834 3757 Pnt 2352 3766 Pnt 3007 3766 Pnt 2573 3769 Pnt 2528 3759 Pnt 3189 3763 Pnt 2611 3737 Pnt 2901 3738 Pnt 2208 3762 Pnt 2602 3750 Pnt 2985 3751 Pnt 2619 3741 Pnt 2194 3741 Pnt 2673 3774 Pnt 3009 3739 Pnt 3168 3750 Pnt 2942 3755 Pnt 3028 3738 Pnt 2682 3744 Pnt 3247 3740 Pnt 2624 3755 Pnt 2822 3755 Pnt 3403 3744 Pnt 1981 3775 Pnt 3407 3773 Pnt 2248 3774 Pnt 2639 3737 Pnt 3193 2655 Pnt 3050 3739 Pnt 2145 3796 Pnt 2712 3740 Pnt 2862 3756 Pnt 2497 3788 Pnt 3110 3744 Pnt 2298 3758 Pnt 3870 3745 Pnt 3306 3744 Pnt 3038 3738 Pnt 2667 3738 Pnt 2427 3747 Pnt 3363 3743 Pnt 2980 3741 Pnt 3018 3765 Pnt 2394 3741 Pnt 2405 3775 Pnt 3267 2745 Pnt 2706 3754 Pnt 3746 3744 Pnt 3539 3765 Pnt 3048 3781 Pnt 3084 3741 Pnt 2502 3744 Pnt 2998 3814 Pnt 1838 3733 Pnt 2638 3746 Pnt 2592 3749 Pnt 2842 3767 Pnt 2655 3740 Pnt 2416 2599 Pnt 2203 3840 Pnt 2458 3799 Pnt 2517 3741 Pnt 3221 3769 Pnt 2707 3786 Pnt 2714 3740 Pnt 2339 3746 Pnt 2149 3799 Pnt 2699 3756 Pnt 2345 3746 Pnt 3071 3738 Pnt 2998 3752 Pnt 2794 3799 Pnt 3004 3738 Pnt 2978 3743 Pnt 2692 3755 Pnt 2390 3737 Pnt 3128 3738 Pnt 2302 3744 Pnt 2934 3737 Pnt 2658 3743 Pnt 2812 3744 Pnt 2939 3749 Pnt 2827 3753 Pnt 3878 2658 Pnt 2741 3742 Pnt 2623 3749 Pnt 2826 3744 Pnt 2863 3737 Pnt 3148 3764 Pnt 2386 3758 Pnt 2650 3739 Pnt 3410 3746 Pnt 2455 3735 Pnt 2091 3891 Pnt 2568 3748 Pnt 3212 3745 Pnt 2237 3767 Pnt 2641 3741 Pnt 2707 3737 Pnt 2347 3738 Pnt 3071 3745 Pnt 2656 3745 Pnt 2305 3740 Pnt 3105 3747 Pnt 3284 3747 Pnt 3001 3746 Pnt 2509 3744 Pnt 2252 3752 Pnt 2630 3747 Pnt 2545 3787 Pnt 2752 3740 Pnt 2641 3738 Pnt 2589 3785 Pnt 2523 3738 Pnt 3115 3740 Pnt 3209 3758 Pnt 2742 3738 Pnt 3226 3758 Pnt 2743 3746 Pnt 2088 3782 Pnt 3050 3748 Pnt 2691 3746 Pnt 2927 3747 Pnt 3656 2560 Pnt 2653 3732 Pnt 2872 3747 Pnt 3343 3773 Pnt 2977 3772 Pnt 2473 3741 Pnt 2862 3755 Pnt 2453 3735 Pnt 2409 3739 Pnt 2530 3743 Pnt 2898 2544 Pnt 2517 3749 Pnt 2030 3735 Pnt 2966 3746 Pnt 2570 3739 Pnt 1995 3934 Pnt 2258 3784 Pnt 2935 3745 Pnt 3425 3749 Pnt 3560 3736 Pnt 2359 3739 Pnt 3777 3742 Pnt 3112 3745 Pnt 2428 3781 Pnt 2812 3754 Pnt 2388 3737 Pnt 2962 3745 Pnt 2402 3735 Pnt 2161 3778 Pnt 3373 2603 Pnt 3124 3743 Pnt 2909 3742 Pnt 2984 3739 Pnt 3478 3735 Pnt 3065 3742 Pnt 2414 3736 Pnt 2988 3749 Pnt 2943 3754 Pnt 2438 3749 Pnt 2672 3747 Pnt 3676 3749 Pnt 3401 3733 Pnt 2483 3825 Pnt 2338 3752 Pnt 3893 2874 Pnt 2663 3746 Pnt 3566 3745 Pnt 2836 3768 Pnt 2983 3735 Pnt 2800 3766 Pnt 2789 3783 Pnt 3028 3739 Pnt 2780 3768 Pnt 2225 3741 Pnt 2598 3767 Pnt 3101 3740 Pnt 2104 3740 Pnt 2565 3759 Pnt 2403 3739 Pnt 2330 3745 Pnt 2327 3739 Pnt 2977 3737 Pnt 2707 3778 Pnt 2747 3741 Pnt 2453 3742 Pnt 2939 3757 Pnt 2276 3752 Pnt 2572 3744 Pnt 3027 3750 Pnt 2405 3746 Pnt 2938 3754 Pnt 2454 3739 Pnt 2418 3777 Pnt 2066 3925 Pnt 2779 3743 Pnt 2142 3772 Pnt 2780 3779 Pnt 2944 3754 Pnt 2900 3741 Pnt 2832 3741 Pnt 2783 3750 Pnt 2720 3739 Pnt 3754 3743 Pnt 2440 3741 Pnt 3549 3737 Pnt 3394 2625 Pnt 2513 3764 Pnt 2633 3741 Pnt 2845 3767 Pnt 3260 2497 Pnt 2259 3737 Pnt 2461 3738 Pnt 2418 3736 Pnt 2142 3734 Pnt 2532 3742 Pnt 2570 3732 Pnt 2931 3745 Pnt 3206 3733 Pnt 2217 3736 Pnt 1978 3782 Pnt 3280 2563 Pnt 2994 3738 Pnt 2932 3772 Pnt 3058 3751 Pnt 2194 3758 Pnt 3047 3736 Pnt 2093 3736 Pnt 2641 3739 Pnt 2864 3741 Pnt 2768 3745 Pnt 3607 3741 Pnt 2513 3734 Pnt 2759 3744 Pnt 2726 3752 Pnt 3571 3737 Pnt 3200 3734 Pnt 2501 3759 Pnt 3231 2333 Pnt 3159 3758 Pnt 3073 2670 Pnt 2378 3747 Pnt 2814 3753 Pnt 2787 3739 Pnt 2929 3744 Pnt 3253 3740 Pnt 2700 3740 Pnt 2415 3743 Pnt 2764 3739 Pnt 2864 3742 Pnt 2248 3770 Pnt 2700 3742 Pnt 2635 3743 Pnt 2623 3740 Pnt 2905 3748 Pnt 2758 3736 Pnt 2759 3762 Pnt 2444 3757 Pnt 2540 3741 Pnt 2760 3756 Pnt 2566 3764 Pnt 2819 3747 Pnt 2456 3742 Pnt 2905 3744 Pnt 2922 3762 Pnt 2597 3755 Pnt 2512 3763 Pnt 3138 3733 Pnt 3504 2581 Pnt 2402 3776 Pnt 1999 3740 Pnt 2561 3748 Pnt 2881 3748 Pnt 2934 3754 Pnt 2905 3745 Pnt 2666 3754 Pnt 3429 3745 Pnt 2279 3745 Pnt 1995 3765 Pnt 3406 3753 Pnt 3432 3765 Pnt 2102 3759 Pnt 3114 3740 Pnt 2377 3742 Pnt 2633 3757 Pnt 3731 3744 Pnt 2726 3742 Pnt 2865 3742 Pnt 2476 3740 Pnt 2510 3750 Pnt 2443 3750 Pnt 2958 3774 Pnt 2468 3735 Pnt 3169 3744 Pnt 2772 3744 Pnt 3001 3746 Pnt 4277 2533 Pnt 2789 3809 Pnt 3357 3745 Pnt 2767 3785 Pnt 2953 3753 Pnt 3003 2884 Pnt 2784 3740 Pnt 2601 3742 Pnt 2516 3743 Pnt 3426 3741 Pnt 2458 3796 Pnt 2545 3743 Pnt 1908 3775 Pnt 3685 3751 Pnt 2646 3778 Pnt 2459 3829 Pnt 2556 3739 Pnt 2470 3740 Pnt 2018 3754 Pnt 3143 3737 Pnt 2258 3739 Pnt 2426 3806 Pnt 2853 3741 Pnt 3007 3744 Pnt 2559 3746 Pnt 3227 3743 Pnt 2422 3792 Pnt 2531 3747 Pnt 2584 3758 Pnt 2504 3749 Pnt 2623 3753 Pnt 2455 3743 Pnt 2816 3737 Pnt 2520 3739 Pnt 3243 3759 Pnt 2577 3740 Pnt 3755 3741 Pnt 2980 3741 Pnt 2543 3730 Pnt 3052 3747 Pnt 2380 3744 Pnt 2187 3844 Pnt 3084 3744 Pnt 2739 3752 Pnt 2379 3738 Pnt 2537 3821 Pnt 2799 3744 Pnt 2556 3773 Pnt 3398 3736 Pnt 2607 3760 Pnt 2395 3737 Pnt 2538 3742 Pnt 3394 3743 Pnt 3000 3770 Pnt 2716 3737 Pnt 2578 3748 Pnt 2546 3746 Pnt 2836 3747 Pnt 2846 3743 Pnt 2470 3780 Pnt 3363 3747 Pnt 3671 3760 Pnt 3370 3742 Pnt 2768 3744 Pnt 2546 3866 Pnt 2993 3740 Pnt 2208 3758 Pnt 2229 3744 Pnt 2430 3735 Pnt 2503 3744 Pnt 2346 3760 Pnt 2429 3751 Pnt 2466 3747 Pnt 2353 3736 Pnt 3298 3735 Pnt 4091 2883 Pnt 2938 3743 Pnt 2713 3736 Pnt 3065 3744 Pnt 3397 3742 Pnt 2018 3782 Pnt 2674 3744 Pnt 3536 3736 Pnt 3134 3740 Pnt 2683 3746 Pnt 2245 3768 Pnt 2761 3753 Pnt 3548 3746 Pnt 2825 3738 Pnt 2696 3748 Pnt 3327 2670 Pnt 3410 3750 Pnt 2939 3751 Pnt 2896 3748 Pnt 3523 3745 Pnt 2188 3747 Pnt 2725 3750 Pnt 2205 3752 Pnt 2664 3748 Pnt 3261 3742 Pnt 3193 3752 Pnt 2396 3742 Pnt 2804 3740 Pnt 3079 3740 Pnt 3676 3741 Pnt 2916 3749 Pnt 2174 3767 Pnt 2548 3743 Pnt 3350 3745 Pnt 2758 3754 Pnt 2813 3744 Pnt 2320 3828 Pnt 2407 3744 Pnt 2365 3742 Pnt 2258 3780 Pnt 2249 3796 Pnt 3009 3757 Pnt 2726 3756 Pnt 2711 3768 Pnt 2742 3765 Pnt 2580 3744 Pnt 2552 3800 Pnt 2348 3740 Pnt 2804 3749 Pnt 2202 3756 Pnt 2346 3749 Pnt 2317 3736 Pnt 2453 3775 Pnt 2549 3753 Pnt 3128 3736 Pnt 2693 3756 Pnt 2630 3749 Pnt 2424 3746 Pnt 2201 3748 Pnt 2178 3820 Pnt 2630 3745 Pnt 2738 3782 Pnt 2648 3741 Pnt 3196 3742 Pnt 2096 3811 Pnt 3105 3734 Pnt 3198 3741 Pnt 2520 3760 Pnt 2220 3771 Pnt 2880 3733 Pnt 3456 3758 Pnt 3922 3764 Pnt 2883 3751 Pnt 2552 3758 Pnt 2438 3764 Pnt 2395 3743 Pnt 2960 3745 Pnt 3643 3758 Pnt 2939 3754 Pnt 2901 3790 Pnt 2849 3758 Pnt 2169 3739 Pnt 2361 3749 Pnt 2358 3774 Pnt 2912 3745 Pnt 4442 3758 Pnt 2800 3757 Pnt 3018 3745 Pnt 2359 3742 Pnt 2929 3768 Pnt 2759 3742 Pnt 2454 3757 Pnt 3165 3745 Pnt 2499 3741 Pnt 3199 3741 Pnt 3042 2611 Pnt 3032 3738 Pnt 2928 3750 Pnt 2811 3739 Pnt 2576 3766 Pnt 3591 3741 Pnt 2558 3744 Pnt 3880 3754 Pnt 2290 3748 Pnt 2439 3739 Pnt 2502 3758 Pnt 2928 3743 Pnt 3708 3781 Pnt 2857 3739 Pnt 3211 3748 Pnt 3258 2774 Pnt 3234 3732 Pnt 2514 3794 Pnt 3205 3743 Pnt 2767 3786 Pnt 2417 3735 Pnt 3614 3786 Pnt 2562 3740 Pnt 3020 3828 Pnt 2463 3828 Pnt 3069 3752 Pnt 2636 3750 Pnt 2319 3747 Pnt 3369 3750 Pnt 4015 3761 Pnt 2560 3740 Pnt 2724 3790 Pnt 2793 3773 Pnt 2681 3745 Pnt 3337 3735 Pnt 2273 3766 Pnt 2683 3750 Pnt 3514 3753 Pnt 2692 3748 Pnt 2590 3769 Pnt 3341 3750 Pnt 2912 3734 Pnt 2540 3754 Pnt 3915 3733 Pnt 2248 3742 Pnt 2511 3760 Pnt 3247 3743 Pnt 2078 3792 Pnt 2087 3759 Pnt 2536 3795 Pnt 2866 3742 Pnt 2630 3744 Pnt 2660 3750 Pnt 3169 3742 Pnt 2908 3759 Pnt 2627 3745 Pnt 2277 3737 Pnt 2477 3750 Pnt 3253 3792 Pnt 3179 3792 Pnt 2710 3739 Pnt 3266 3745 Pnt 3192 3736 Pnt 2577 3749 Pnt 2908 3817 Pnt 2847 3741 Pnt 4031 3772 Pnt 2599 3743 Pnt 3031 3745 Pnt 2727 3741 Pnt 2653 3736 Pnt 2083 3914 Pnt 3192 2637 Pnt 2726 3745 Pnt 2731 3738 Pnt 3375 3752 Pnt 2254 3733 Pnt 3309 3759 Pnt 2749 3753 Pnt 2623 3746 Pnt 2830 3748 Pnt 2969 3738 Pnt 3435 3746 Pnt 2361 3740 Pnt 2273 3760 Pnt 3071 3740 Pnt 3692 3758 Pnt 2616 3743 Pnt 2881 3744 Pnt 3116 3742 Pnt 2567 3744 Pnt 2114 3792 Pnt 3043 3739 Pnt 2809 3792 Pnt 2709 3747 Pnt 2830 3747 Pnt 2513 3749 Pnt 2460 3758 Pnt 3335 3765 Pnt 2614 3748 Pnt 2085 3779 Pnt 2812 3740 Pnt 2557 3749 Pnt 2380 3779 Pnt 3159 3741 Pnt 2187 3797 Pnt 2993 3764 Pnt 3194 3740 Pnt 2626 3746 Pnt 2537 3749 Pnt 2858 3749 Pnt 2664 3739 Pnt 2334 3763 Pnt 2569 3797 Pnt 2640 3763 Pnt 3048 3743 Pnt 2276 3803 Pnt 3006 3749 Pnt 2613 3733 Pnt 3302 3775 Pnt 4196 3748 Pnt 3268 3731 Pnt 3403 3771 Pnt 2312 3762 Pnt 3157 3740 Pnt 3232 2701 Pnt 2795 3762 Pnt 3411 3747 Pnt 3340 3741 Pnt 2809 3753 Pnt 2811 3739 Pnt 2527 3736 Pnt 3594 3745 Pnt 3515 2737 Pnt 2632 3742 Pnt 2554 3809 Pnt 2538 3746 Pnt 3011 3750 Pnt 2904 2710 Pnt 3124 3741 Pnt 2738 3754 Pnt 3115 3742 Pnt 3029 3757 Pnt 2998 3754 Pnt 3274 3750 Pnt 2637 3752 Pnt 3046 3745 Pnt 1973 3749 Pnt 2779 3749 Pnt 2597 3789 Pnt 2850 3746 Pnt 2876 3747 Pnt 2594 3748 Pnt 2828 3741 Pnt 2767 3742 Pnt 2743 3741 Pnt 2537 3811 Pnt 2614 3749 Pnt 2590 3746 Pnt 2476 3745 Pnt 2834 3911 Pnt 3395 3745 Pnt 3148 3755 Pnt 2477 3740 Pnt 2167 3786 Pnt 2716 3749 Pnt 2999 3742 Pnt 3315 3747 Pnt 2850 3737 Pnt 3316 3807 Pnt 2577 3766 Pnt 2604 3800 Pnt 2453 3738 Pnt 2957 3744 Pnt 2713 3748 Pnt 3135 3807 Pnt 2865 3800 Pnt 2768 3740 Pnt 2638 3773 Pnt 2726 3738 Pnt 3243 3782 Pnt 2735 3747 Pnt 2783 3745 Pnt 1954 3791 Pnt 2809 3740 Pnt 2947 3775 Pnt 2827 3791 Pnt 3851 3743 Pnt 2354 3745 Pnt 2769 3757 Pnt 3597 3752 Pnt 3038 3743 Pnt 2042 3756 Pnt 2694 3743 Pnt 2451 3743 Pnt 3417 3737 Pnt 3616 2821 Pnt 2568 3739 Pnt 1747 3776 Pnt 2930 3752 Pnt 2464 3797 Pnt 2362 3751 Pnt 2885 3768 Pnt 2615 3740 Pnt 2223 3795 Pnt 2824 3763 Pnt 2868 3768 Pnt 2046 3772 Pnt 2666 3771 Pnt 2179 3763 Pnt 1938 3786 Pnt 2544 3739 Pnt 2657 3751 Pnt 2505 3743 Pnt 3367 2636 Pnt 2752 3749 Pnt 2833 3804 Pnt 2890 3739 Pnt 2617 3749 Pnt 2585 3736 Pnt 2128 3813 Pnt 2549 3769 Pnt 3100 3742 Pnt 2937 3740 Pnt 2815 3746 Pnt 2474 3763 Pnt 2626 3810 Pnt 2840 3737 Pnt 2274 3766 Pnt 2935 3746 Pnt 2396 3758 Pnt 2863 3736 Pnt 2644 3736 Pnt 2441 3773 Pnt 2102 3797 Pnt 3725 2667 Pnt 2635 3742 Pnt 2261 3769 Pnt 3337 2640 Pnt 3037 3753 Pnt 2758 3740 Pnt 2591 3747 Pnt 3471 3765 Pnt 2849 3744 Pnt 2612 3735 Pnt 2420 3768 Pnt 2244 3746 Pnt 3009 3745 Pnt 4088 3773 Pnt 2674 3745 Pnt 2233 3797 Pnt 3153 3745 Pnt 3487 3745 Pnt 2370 3753 Pnt 2180 3782 Pnt 2834 3745 Pnt 2362 3784 Pnt 2769 2925 Pnt 2751 3755 Pnt 2556 3757 Pnt 2541 3780 Pnt 2728 3739 Pnt 2688 3779 Pnt 2573 3755 Pnt 2008 3797 Pnt 2810 3750 Pnt 3104 3744 Pnt 2969 3742 Pnt 2499 3744 Pnt 2434 3778 Pnt 2979 3741 Pnt 2994 3770 Pnt 2557 3749 Pnt 3096 3782 Pnt 2751 3758 Pnt 2757 3744 Pnt 3074 3738 Pnt 3224 3750 Pnt 2860 3756 Pnt 2685 3763 Pnt 2714 3744 Pnt 2820 3743 Pnt 3356 3744 Pnt 2644 3751 Pnt 3020 3744 Pnt 2367 3746 Pnt 4029 3774 Pnt 3529 3752 Pnt 3244 3745 Pnt 3199 3741 Pnt 4012 3761 Pnt 2804 3743 Pnt 3112 3745 Pnt 2859 3741 Pnt 2763 3739 Pnt 2688 3755 Pnt 2432 3742 Pnt 3032 3749 Pnt 2923 3768 Pnt 3261 3736 Pnt 2287 3754 Pnt 2432 3739 Pnt 3046 3762 Pnt 2916 3754 Pnt 2534 3737 Pnt 2740 3743 Pnt 2426 3742 Pnt 2827 3808 Pnt 2455 3763 Pnt 3094 3748 Pnt 2624 3741 Pnt 3129 3748 Pnt 2851 3808 Pnt 2786 3741 Pnt 2621 3741 Pnt 2695 3739 Pnt 3258 3748 Pnt 2857 3790 Pnt 2900 3737 Pnt 2386 3742 Pnt 3008 3741 Pnt 2614 3737 Pnt 2234 3780 Pnt 4030 3744 Pnt 2546 3739 Pnt 3215 3736 Pnt 2504 3798 Pnt 2221 3758 Pnt 2286 3749 Pnt 2855 3745 Pnt 3226 3744 Pnt 2664 3760 Pnt 2451 3735 Pnt 2139 3774 Pnt 2878 3746 Pnt 2803 3749 Pnt 2498 3743 Pnt 2738 3749 Pnt 2210 3792 Pnt 2772 3746 Pnt 2272 2603 Pnt 2213 3740 Pnt 3279 3746 Pnt 2745 3741 Pnt 2932 3738 Pnt 2899 3788 Pnt 2803 3758 Pnt 2959 3749 Pnt 3026 3788 Pnt 2343 3787 Pnt 2496 3750 Pnt 3081 2624 Pnt 2410 3750 Pnt 3273 3746 Pnt 2857 3749 Pnt 2719 3744 Pnt 2292 3736 Pnt 3135 3777 Pnt 2258 3796 Pnt 2741 3738 Pnt 2762 3755 Pnt 3062 3813 Pnt 3016 3755 Pnt 3351 3765 Pnt 2540 3750 Pnt 2864 3813 Pnt 2430 3738 Pnt 2852 3759 Pnt 2520 3789 Pnt 2741 3747 Pnt 2937 3760 Pnt 1917 3737 Pnt 2368 3760 Pnt 3608 2766 Pnt 2981 3735 Pnt 4231 2717 Pnt 2865 3824 Pnt 3558 3737 Pnt 2631 3803 Pnt 3261 3738 Pnt 2680 3743 Pnt 2975 3751 Pnt 2390 3897 Pnt 2970 3803 Pnt 2738 3743 Pnt 2899 3742 Pnt 3341 3752 Pnt 2815 3735 Pnt 2703 3795 Pnt 2608 3744 Pnt 2366 3737 Pnt 2782 3741 Pnt 2493 3739 Pnt 2611 3801 Pnt 2646 3739 Pnt 4497 3764 Pnt 2620 3759 Pnt 3686 3739 Pnt 2982 3763 Pnt 2586 3738 Pnt 2677 3748 Pnt 2994 3801 Pnt 2280 3814 Pnt 3004 3760 Pnt 2798 3741 Pnt 3329 2521 Pnt 2942 3744 Pnt 3341 3748 Pnt 3145 3747 Pnt 2685 3743 Pnt 3846 3746 Pnt 2928 3738 Pnt 3031 3738 Pnt 2650 3744 Pnt 3227 3743 Pnt 2509 3741 Pnt 3702 3744 Pnt 2020 3766 Pnt 2884 3741 Pnt 2940 3741 Pnt 2597 3736 Pnt 2249 3766 Pnt 2327 3747 Pnt 2654 3739 Pnt 2579 3741 Pnt 3003 3747 Pnt 2774 3741 Pnt 2444 3750 Pnt 2303 3762 Pnt 2515 3758 Pnt 2753 3744 Pnt 2970 3741 Pnt 2572 3749 Pnt 2410 3808 Pnt 3040 3749 Pnt 2302 3807 Pnt 2368 3759 Pnt 2936 3745 Pnt 2216 3736 Pnt 3200 3775 Pnt 2112 3774 Pnt 2445 3740 Pnt 3011 3746 Pnt 2436 3750 Pnt 1981 3775 Pnt 2449 3745 Pnt 2304 3750 Pnt 2393 3750 Pnt 2990 3755 Pnt 2645 3735 Pnt 2500 3823 Pnt 3077 3742 Pnt 3959 3747 Pnt 2843 3755 Pnt 2152 3743 Pnt 2915 3747 Pnt 2474 3764 Pnt 2598 3760 Pnt 2270 3749 Pnt 2397 3774 Pnt 3320 3742 Pnt 2840 3786 Pnt 2522 3770 Pnt 2314 3840 Pnt 3090 3741 Pnt 2630 3771 Pnt 2336 3737 Pnt 2529 3786 Pnt 3354 3759 Pnt 3356 3741 Pnt 2055 3748 Pnt 2883 3739 Pnt 2177 3799 Pnt 3397 3760 Pnt 2756 3739 Pnt 2858 3742 Pnt 2799 3740 Pnt 2244 3741 Pnt 3031 3747 Pnt 2354 3776 Pnt 3608 3740 Pnt 2999 3746 Pnt 2987 3761 Pnt 2804 3743 Pnt 2429 3796 Pnt 2883 3748 Pnt 2561 3778 Pnt 3223 3742 Pnt 3131 3751 Pnt 2775 3788 Pnt 2727 3749 Pnt 2272 3763 Pnt 2859 3744 Pnt 2758 3742 Pnt 2814 3743 Pnt 3122 3744 Pnt 2741 3753 Pnt 2496 3739 Pnt 2196 3774 Pnt 2040 3739 Pnt 2940 3763 Pnt 4017 3742 Pnt 3398 2597 Pnt 2668 3756 Pnt 2584 3755 Pnt 2355 3791 Pnt 2482 3741 Pnt 2855 3745 Pnt 2560 3738 Pnt 3548 3735 Pnt 2575 3738 Pnt 2098 3791 Pnt 2350 3750 Pnt 2901 3734 Pnt 2263 3758 Pnt 2669 3765 Pnt 2094 3802 Pnt 2364 3760 Pnt 2377 3742 Pnt 2417 3732 Pnt 2683 3738 Pnt 3991 3745 Pnt 2684 3738 Pnt 3282 3743 Pnt 3032 3745 Pnt 2643 3751 Pnt 2864 3743 Pnt 2392 3742 Pnt 2144 3752 Pnt 3102 3747 Pnt 3021 3761 Pnt 2615 3737 Pnt 2247 3804 Pnt 2401 3769 Pnt 2623 3738 Pnt 3369 3741 Pnt 2194 3787 Pnt 2393 3814 Pnt 3311 3753 Pnt 2699 3750 Pnt 2304 3794 Pnt 1974 3790 Pnt 2309 3740 Pnt 2807 3741 Pnt 3431 3757 Pnt 2824 3790 Pnt 2864 3752 Pnt 2477 3766 Pnt 2685 3744 Pnt 2539 3785 Pnt 2425 3788 Pnt 1764 3733 Pnt 3533 3752 Pnt 3308 3749 Pnt 3091 3743 Pnt 2675 3742 Pnt 2264 3774 Pnt 3491 3749 Pnt 2723 3744 Pnt 2622 3736 Pnt 2907 3741 Pnt 2750 3769 Pnt 2513 3768 Pnt 3126 3748 Pnt 3410 3742 Pnt 2108 3841 Pnt 3422 3768 Pnt 2442 3746 Pnt 3328 3751 Pnt 2887 3744 Pnt 2879 3772 Pnt 2590 3767 Pnt 3178 3742 Pnt 3496 3744 Pnt 2069 3743 Pnt 2774 3738 Pnt 3209 3751 Pnt 2571 3744 Pnt 2671 3738 Pnt 3376 3767 Pnt 2901 3741 Pnt 2879 3755 Pnt 3125 3740 Pnt 2195 3754 Pnt 2490 3767 Pnt 2285 3744 Pnt 3998 3757 Pnt 2999 3744 Pnt 3179 3740 Pnt 2460 3775 Pnt 2549 3742 Pnt 2320 3743 Pnt 2575 3782 Pnt 3125 2692 Pnt 2197 3890 Pnt 3592 3765 Pnt 2425 3758 Pnt 3337 3890 Pnt 2928 3748 Pnt 2576 3736 Pnt 3201 3758 Pnt 3149 3746 Pnt 3388 2637 Pnt 2542 3741 Pnt 2815 3739 Pnt 2205 3739 Pnt 2503 3753 Pnt 3031 3739 Pnt 2770 3735 Pnt 2940 3737 Pnt 3404 2611 Pnt 3076 3742 Pnt 2588 3747 Pnt 2520 3742 Pnt 2385 3749 Pnt 2976 3736 Pnt 2344 3743 Pnt 2876 3736 Pnt 2572 3749 Pnt 2444 3780 Pnt 2537 3735 Pnt 2077 3934 Pnt 2607 3734 Pnt 2012 3799 Pnt 1959 3758 Pnt 3185 3743 Pnt 2330 3735 Pnt 2474 3749 Pnt 2809 3733 Pnt 2924 3747 Pnt 2850 3739 Pnt 2355 3739 Pnt 3344 3746 Pnt 3077 3739 Pnt 2538 3784 Pnt 3114 3766 Pnt 2161 3729 Pnt 3919 2509 Pnt 3023 3737 Pnt 1852 3733 Pnt 3472 3749 Pnt 3075 3739 Pnt 2368 3768 Pnt 2703 3783 Pnt 3272 3745 Pnt 2613 3741 Pnt 2822 3739 Pnt 2569 3739 Pnt 4385 3744 Pnt 3251 3745 Pnt 2887 3744 Pnt 2955 3739 Pnt 3089 3766 Pnt 2955 3758 Pnt 3068 3750 Pnt 2569 3927 Pnt 2767 3758 Pnt 2567 3767 Pnt 3480 3927 Pnt 2742 3735 Pnt 2385 3739 Pnt 2479 3752 Pnt 2846 3745 Pnt 3050 2560 Pnt 3063 3743 Pnt 3642 2537 Pnt 2336 3738 Pnt 2943 3742 Pnt 3272 3752 Pnt 2587 3743 Pnt 2699 3737 Pnt 2722 3743 Pnt 2590 3734 Pnt 2659 3748 Pnt 3326 3739 Pnt 3219 3740 Pnt 2733 3734 Pnt 2845 3737 Pnt 2656 3742 Pnt 2193 3736 Pnt 2697 3752 Pnt 2491 3742 Pnt 2931 3737 Pnt 2649 3778 Pnt 2867 3740 Pnt 2799 3736 Pnt 2527 3749 Pnt 2434 3772 Pnt 2770 3758 Pnt 2714 3749 Pnt 2770 3737 Pnt 2090 3747 Pnt 2185 3758 Pnt 3152 3758 Pnt 2874 3835 Pnt 2784 3736 Pnt 2595 3741 Pnt 3184 3778 Pnt 3403 2608 Pnt 3010 3749 Pnt 2590 3773 Pnt 2570 3741 Pnt 3131 2630 Pnt 2806 3747 Pnt 2541 3747 Pnt 2775 3741 Pnt 2988 3773 Pnt 2819 3741 Pnt 2288 3759 Pnt 3150 3747 Pnt 2593 3739 Pnt 2953 3739 Pnt 3101 3743 Pnt 2942 3739 Pnt 2473 3759 Pnt 2263 3744 Pnt 2664 3753 Pnt 2653 3752 Pnt 2687 3745 Pnt 2714 3747 Pnt 2416 3738 Pnt 1794 3782 Pnt 3088 3738 Pnt 2666 3744 Pnt 3305 2645 Pnt 2859 3746 Pnt 2526 3779 Pnt 3418 3747 Pnt 3363 3741 Pnt 2894 3758 Pnt 2609 3755 Pnt 3027 3739 Pnt 3761 2776 Pnt 2912 3741 Pnt 2458 3753 Pnt 3032 3741 Pnt 2923 3747 Pnt 2805 3739 Pnt 2775 3746 Pnt 2237 3809 Pnt 2390 3739 Pnt 3309 3746 Pnt 2769 3745 Pnt 2579 3739 Pnt 2964 3742 Pnt 2108 3746 Pnt 2884 3747 Pnt 2558 3744 Pnt 2592 3825 Pnt 2460 3745 Pnt 2519 3757 Pnt 2581 3752 Pnt 2378 3740 Pnt 1905 3738 Pnt 3050 3747 Pnt 2583 3741 Pnt 2649 3744 Pnt 2494 3754 Pnt 2897 3746 Pnt 2904 3746 Pnt 2679 3757 Pnt 2558 3750 Pnt 2215 3776 Pnt 2696 3749 Pnt 3094 3753 Pnt 2581 3743 Pnt 3136 3744 Pnt 2812 3743 Pnt 2447 3776 Pnt 2686 3742 Pnt 2341 3742 Pnt 2964 3772 Pnt 2371 3745 Pnt 2314 3758 Pnt 3198 3746 Pnt 2543 3748 Pnt 2376 3757 Pnt 2544 3756 Pnt 2751 3734 Pnt 2926 3746 Pnt 2842 3743 Pnt 2928 3753 Pnt 2283 3743 Pnt 2856 3748 Pnt 3740 3742 Pnt 2782 3744 Pnt 2945 3742 Pnt 3062 3751 Pnt 2743 3740 Pnt 2942 3737 Pnt 2719 3742 Pnt 2228 3745 Pnt 2869 3740 Pnt 4125 3742 Pnt 2567 3770 Pnt 2399 3746 Pnt 2708 3753 Pnt 2087 3796 Pnt 2289 3740 Pnt 2657 3751 Pnt 2543 3740 Pnt 2514 3764 Pnt 2422 3742 Pnt 3061 3742 Pnt 2261 3741 Pnt 3655 3744 Pnt 1866 3764 Pnt 2631 3748 Pnt 2596 3760 Pnt 2556 3743 Pnt 2141 3778 Pnt 2832 3745 Pnt 2524 3741 Pnt 2437 3737 Pnt 2959 3743 Pnt 3757 3744 Pnt 2867 2469 Pnt 2474 3735 Pnt 1867 3775 Pnt 2977 3754 Pnt 2841 2499 Pnt 2319 3806 Pnt 3321 3792 Pnt 2698 3738 Pnt 2606 3735 Pnt 3243 3732 Pnt 2800 3793 Pnt 2356 3775 Pnt 3020 3731 Pnt 2605 3778 Pnt 2471 3740 Pnt 3021 3747 Pnt 2054 3767 Pnt 2991 3736 Pnt 2591 3744 Pnt 2686 3743 Pnt 2693 3741 Pnt 2722 3770 Pnt 2209 3739 Pnt 2734 3753 Pnt 3327 3744 Pnt 2407 3742 Pnt 2285 3829 Pnt 2501 3756 Pnt 2351 3739 Pnt 2728 3748 Pnt 2279 3747 Pnt 3427 3755 Pnt 2724 3759 Pnt 2832 3743 Pnt 2370 3744 Pnt 3421 3744 Pnt 2506 3758 Pnt 2684 3748 Pnt 2820 3745 Pnt 2863 3738 Pnt 2789 3740 Pnt 2671 3844 Pnt 2573 3751 Pnt 3430 3748 Pnt 2514 3738 Pnt 3219 3744 Pnt 2900 2860 Pnt 3201 3762 Pnt 3405 3751 Pnt 2827 3766 Pnt 2407 3742 Pnt 2518 3752 Pnt 2328 3735 Pnt 2537 3738 Pnt 2841 3754 Pnt 3514 3765 Pnt 2925 3735 Pnt 2905 3742 Pnt 2602 3825 Pnt 2702 3831 Pnt 2548 3743 Pnt 3100 3747 Pnt 3427 3737 Pnt 2774 3740 Pnt 2151 3755 Pnt 3147 3740 Pnt 3526 3744 Pnt 3787 3750 Pnt 3773 3762 Pnt 2397 3737 Pnt 2423 3790 Pnt 2469 3738 Pnt 2758 3737 Pnt 2915 3744 Pnt 2546 3738 Pnt 2272 3748 Pnt 3157 3758 Pnt 1989 3757 Pnt 2678 3743 Pnt 3501 3737 Pnt 3240 3757 Pnt 3960 3751 Pnt 2657 3741 Pnt 3083 3745 Pnt 3433 2469 Pnt 2641 3776 Pnt 3273 2807 Pnt 2685 3760 Pnt 2318 3796 Pnt 2121 3777 Pnt 3038 3745 Pnt 3385 3736 Pnt 3002 3752 Pnt 2616 3759 Pnt 2517 3768 Pnt 2118 3768 Pnt 2804 3744 Pnt 3801 3752 Pnt 2140 3740 Pnt 2211 3741 Pnt 2516 3866 Pnt 2782 3750 Pnt 2861 3738 Pnt 3399 3740 Pnt 2380 3736 Pnt 2446 3744 Pnt 2803 3742 Pnt 2550 3775 Pnt 2899 3751 Pnt 3731 2518 Pnt 2659 3746 Pnt 2869 3749 Pnt 2639 3739 Pnt 2750 3746 Pnt 2408 3756 Pnt 2959 2710 Pnt 3046 3766 Pnt 2432 3737 Pnt 2865 3742 Pnt 2535 3747 Pnt 2395 3749 Pnt 2780 3759 Pnt 2586 3792 Pnt 2625 3754 Pnt 2761 3766 Pnt 2864 3757 Pnt 3625 3739 Pnt 2518 3740 Pnt 2718 3800 Pnt 2648 3750 Pnt 2628 3747 Pnt 2546 3741 Pnt 2848 3740 Pnt 2735 3743 Pnt 2464 3744 Pnt 3714 3750 Pnt 2612 3792 Pnt 2318 3748 Pnt 2517 3784 Pnt 3094 3757 Pnt 2998 3756 Pnt 3830 3770 Pnt 2771 3747 Pnt 3003 3736 Pnt 3679 3783 Pnt 2913 3749 Pnt 3122 3749 Pnt 2612 3753 Pnt 3212 3749 Pnt 2865 3750 Pnt 2489 3740 Pnt 2875 3740 Pnt 2600 3744 Pnt 3017 3753 Pnt 2943 3758 Pnt 2728 3746 Pnt 2070 3782 Pnt 2836 3740 Pnt 2499 3735 Pnt 2293 3747 Pnt 2674 3741 Pnt 2153 3743 Pnt 2929 3745 Pnt 2944 2828 Pnt 3162 3743 Pnt 2425 3790 Pnt 2893 3758 Pnt 2572 3737 Pnt 2466 3820 Pnt 2580 3737 Pnt 2598 3745 Pnt 3396 3767 Pnt 3155 3748 Pnt 3134 3737 Pnt 2427 3759 Pnt 2932 3741 Pnt 3525 3752 Pnt 2683 3742 Pnt 2455 3740 Pnt 3153 3742 Pnt 2164 3741 Pnt 3141 3743 Pnt 2849 3742 Pnt 2087 3811 Pnt 3719 3752 Pnt 2741 3734 Pnt 2571 3750 Pnt 2395 3734 Pnt 3451 3735 Pnt 2655 3737 Pnt 3148 3734 Pnt 4135 2566 Pnt 3067 3742 Pnt 2980 2347 Pnt 2547 3793 Pnt 3201 3747 Pnt 2638 3760 Pnt 2980 3746 Pnt 2640 3743 Pnt 3207 3758 Pnt 2466 3749 Pnt 3046 3765 Pnt 3671 2727 Pnt 2646 3746 Pnt 3035 3747 Pnt 2325 3741 Pnt 2783 3746 Pnt 2885 2523 Pnt 2486 3809 Pnt 1994 3760 Pnt 3989 3745 Pnt 2675 3747 Pnt 2165 3736 Pnt 2894 3742 Pnt 2061 3786 Pnt 2926 3740 Pnt 2439 3738 Pnt 2642 3736 Pnt 2553 3751 Pnt 2673 3828 Pnt 3316 3733 Pnt 2629 3746 Pnt 3446 3746 Pnt 2285 3748 Pnt 3071 3744 Pnt 2816 2360 Pnt 2564 3769 Pnt 2000 3792 Pnt 2598 3744 Pnt 3566 3745 Pnt 2810 2989 Pnt 2659 3737 Pnt 2414 3768 Pnt 3210 3766 Pnt 2728 3792 Pnt 2969 3738 Pnt 3022 3739 Pnt 2971 3739 Pnt 2861 3752 Pnt 3173 3739 Pnt 2862 3766 Pnt 2354 3746 Pnt 2537 3760 Pnt 2394 3748 Pnt 3008 3745 Pnt 2684 3747 Pnt 3191 3760 Pnt 2229 3787 Pnt 2745 3748 Pnt 2868 3745 Pnt 2919 3746 Pnt 3043 3755 Pnt 2628 3759 Pnt 2282 3756 Pnt 2752 3758 Pnt 2267 3739 Pnt 2811 3749 Pnt 3294 3816 Pnt 2286 3795 Pnt 3225 3758 Pnt 2259 3740 Pnt 2266 3761 Pnt 3298 3748 Pnt 3067 3740 Pnt 2972 3737 Pnt 3397 3738 Pnt 2415 3762 Pnt 2732 3746 Pnt 2721 3735 Pnt 2696 3745 Pnt 2389 3745 Pnt 2453 3746 Pnt 2753 3741 Pnt 2261 3752 Pnt 3209 3752 Pnt 2686 3737 Pnt 2714 3754 Pnt 2821 3737 Pnt 2559 3800 Pnt 2168 3735 Pnt 3160 3740 Pnt 3932 3737 Pnt 2889 3744 Pnt 2473 3745 Pnt 2954 3741 Pnt 3261 3742 Pnt 3135 3743 Pnt 3085 3743 Pnt 2882 3738 Pnt 2777 3780 Pnt 2622 3752 Pnt 2915 3741 Pnt 2376 3911 Pnt 2532 3739 Pnt 2251 3773 Pnt 2875 3817 Pnt 3052 3817 Pnt 2590 3749 Pnt 2909 3739 Pnt 3075 3740 Pnt 3535 3739 Pnt 2858 3759 Pnt 2899 3743 Pnt 2927 3747 Pnt 4105 3746 Pnt 3085 3772 Pnt 2864 3759 Pnt 2820 3764 Pnt 2564 3753 Pnt 2839 3746 Pnt 2769 3782 Pnt 2034 3779 Pnt 2235 3743 Pnt 2902 3746 Pnt 2789 3765 Pnt 2462 3745 Pnt 2654 3748 Pnt 2708 3742 Pnt 2348 3742 Pnt 2383 3742 Pnt 2596 3749 Pnt 3671 3740 Pnt 3027 3747 Pnt 2914 2631 Pnt 2790 3758 Pnt 3255 3752 Pnt 2526 3771 Pnt 2900 3758 Pnt 3007 3765 Pnt 2811 3753 Pnt 2851 3749 Pnt 2614 3751 Pnt 2098 3797 Pnt 2833 3745 Pnt 3351 2609 Pnt 3124 3757 Pnt 2415 3787 Pnt 3449 3751 Pnt 2305 3763 Pnt 3516 3771 Pnt 2622 3739 Pnt 2530 3810 Pnt 3271 3749 Pnt 3061 3742 Pnt 2407 3766 Pnt 2443 3770 Pnt 2232 3790 Pnt 3135 3739 Pnt 3577 3749 Pnt 2575 3736 Pnt 3150 3770 Pnt 2713 3745 Pnt 2637 3806 Pnt 2728 3749 Pnt 3193 3744 Pnt 3261 3747 Pnt 2783 3737 Pnt 2886 3733 Pnt 2865 3743 Pnt 2125 3771 Pnt 2056 3780 Pnt 3248 3737 Pnt 3127 3734 Pnt 2808 3758 Pnt 2432 3741 Pnt 3114 3747 Pnt 2452 3743 Pnt 3317 3747 Pnt 2513 3766 Pnt 2265 3797 Pnt 2805 3751 Pnt 2298 3791 Pnt 2191 3766 Pnt 2119 3786 Pnt 2387 3758 Pnt 2530 3749 Pnt 2596 3760 Pnt 2815 3807 Pnt 2267 3761 Pnt 3112 3750 Pnt 2737 3800 Pnt 2751 2796 Pnt 2408 3745 Pnt 2373 3761 Pnt 3643 3736 Pnt 2461 3740 Pnt 3373 3780 Pnt 2785 3735 Pnt 2556 3757 Pnt 2601 3797 Pnt 2702 3774 Pnt 2036 3769 Pnt 3198 3741 Pnt 2128 3803 Pnt 2827 3752 Pnt 3084 3745 Pnt 2907 3744 Pnt 3182 3745 Pnt 2869 3742 Pnt 3312 3755 Pnt 2258 3756 Pnt 3107 3750 Pnt 3115 3744 Pnt 3983 3745 Pnt 3416 3756 Pnt 2675 3743 Pnt 3086 3749 Pnt 2461 2565 Pnt 2897 3747 Pnt 2964 3782 Pnt 2772 3745 Pnt 2493 3751 Pnt 2597 3757 Pnt 3213 3747 Pnt 2677 3779 Pnt 2520 3792 Pnt 2196 3780 Pnt 3166 3792 Pnt 3831 3741 Pnt 2281 3801 Pnt 3263 3763 Pnt 2885 3754 Pnt 2790 3747 Pnt 2334 3746 Pnt 2448 3743 Pnt 2427 3755 Pnt 2294 3768 Pnt 2963 3763 Pnt 4216 3746 Pnt 3014 3746 Pnt 3018 3738 Pnt 2424 3748 Pnt 2697 3753 Pnt 2755 3742 Pnt 2568 3741 Pnt 2375 3739 Pnt 2514 3754 Pnt 2428 3742 Pnt 2497 3778 Pnt 2331 3756 Pnt 3135 3744 Pnt 2641 3744 Pnt 2647 3751 Pnt 2790 3740 Pnt 3031 3756 Pnt 2869 3754 Pnt 2952 3742 Pnt 2682 3747 Pnt 3341 3744 Pnt 2668 3738 Pnt 3014 3759 Pnt 2556 3741 Pnt 2500 3770 Pnt 2919 3738 Pnt 2562 3773 Pnt 2785 3745 Pnt 1977 3752 Pnt 2225 3808 Pnt 2627 3747 Pnt 2408 3753 Pnt 3669 3756 Pnt 3118 3741 Pnt 2660 3735 Pnt 2671 3744 Pnt 3121 3754 Pnt 2494 3749 Pnt 3262 3754 Pnt 2232 3914 Pnt 2904 3735 Pnt 3072 3761 Pnt 3073 3774 Pnt 2735 3749 Pnt 2343 3755 Pnt 2844 3752 Pnt 2918 3768 Pnt 2853 3749 Pnt 3202 3774 Pnt 2825 3752 Pnt 2582 3758 Pnt 2943 3754 Pnt 2329 3745 Pnt 3488 3752 Pnt 2882 3743 Pnt 3114 3768 Pnt 2893 3738 Pnt 2303 3773 Pnt 2501 3745 Pnt 3391 3743 Pnt 3043 3761 Pnt 2820 3733 Pnt 3171 3755 Pnt 2203 3788 Pnt 2921 3749 Pnt 3029 3738 Pnt 2790 3744 Pnt 2460 3747 Pnt 2746 3737 Pnt 2573 3760 Pnt 2223 3750 Pnt 2794 3737 Pnt 2719 3738 Pnt 4088 2766 Pnt 2664 3758 Pnt 2536 3741 Pnt 2820 3738 Pnt 2758 3743 Pnt 2710 3750 Pnt 3348 3738 Pnt 2748 3774 Pnt 2611 3746 Pnt 3274 3738 Pnt 2634 3742 Pnt 2632 3749 Pnt 2861 3741 Pnt 2423 3760 Pnt 2082 3742 Pnt 2939 3747 Pnt 2740 3741 Pnt 2303 3736 Pnt 2673 3745 Pnt 2851 3737 Pnt 3073 3736 Pnt 2743 3739 Pnt 2617 3744 Pnt 2031 3780 Pnt 2948 3735 Pnt 2793 3755 Pnt 3178 3739 Pnt 2713 3744 Pnt 2683 3740 Pnt 2207 3745 Pnt 3093 3740 Pnt 3516 3763 Pnt 2404 3794 Pnt 2750 3755 Pnt 2072 3790 Pnt 2872 3736 Pnt 2847 3744 Pnt 2251 3740 Pnt 2541 3740 Pnt 3028 3737 Pnt 3028 3748 Pnt 2548 3787 Pnt 2916 3813 Pnt 2834 3775 Pnt 2962 3792 Pnt 3058 3742 Pnt 2923 3749 Pnt 2494 3760 Pnt 3456 3813 Pnt 2245 3736 Pnt 2885 3745 Pnt 3499 3737 Pnt 3566 3776 Pnt 2266 3788 Pnt 2148 3795 Pnt 2793 3754 Pnt 2331 3737 Pnt 2243 3734 Pnt 3327 2691 Pnt 3020 3776 Pnt 2910 3795 Pnt 2684 3751 Pnt 2530 3753 Pnt 2838 3734 Pnt 2042 3736 Pnt 2769 3760 Pnt 2266 3735 Pnt 3537 3751 Pnt 2422 3736 Pnt 1817 3867 Pnt 2030 3754 Pnt 3624 3739 Pnt 2434 3789 Pnt 3224 3751 Pnt 2935 3775 Pnt 2952 3748 Pnt 2547 3744 Pnt 2965 3750 Pnt 2911 3775 Pnt 3061 3742 Pnt 2517 3744 Pnt 2972 3743 Pnt 2603 3750 Pnt 3094 3750 Pnt 2925 3759 Pnt 2714 3743 Pnt 3270 3741 Pnt 2616 3739 Pnt 2864 3754 Pnt 3266 3763 Pnt 2971 3741 Pnt 2615 3739 Pnt 3192 3816 Pnt 2545 3743 Pnt 2221 3897 Pnt 2843 3744 Pnt 3119 3742 Pnt 2679 3738 Pnt 3246 3748 Pnt 2604 3745 Pnt 2821 3742 Pnt 3200 2639 Pnt 2250 3764 Pnt 3620 3775 Pnt 2996 3738 Pnt 2861 3786 Pnt 3196 3742 Pnt 2814 3737 Pnt 2340 3735 Pnt 2732 3744 Pnt 2478 3736 Pnt 3863 3775 Pnt 2744 3736 Pnt 2515 3766 Pnt 2990 3760 Pnt 2454 3774 Pnt 2711 3741 Pnt 2307 3742 Pnt 2372 3737 Pnt 3064 3748 Pnt 2713 3747 Pnt 2534 3742 Pnt 2805 3749 Pnt 3294 3752 Pnt 2764 3741 Pnt 2973 3739 Pnt 2405 3788 Pnt 2260 3780 Pnt 3639 2960 Pnt 2811 3745 Pnt 2664 3758 Pnt 2597 3749 Pnt 2513 3747 Pnt 2819 3741 Pnt 3047 3745 Pnt 2435 3739 Pnt 2780 3749 Pnt 3579 3737 Pnt 2598 3781 Pnt 3065 3744 Pnt 2458 3755 Pnt 2393 3763 Pnt 3582 3749 Pnt 2353 3798 Pnt 2677 2667 Pnt 2648 3762 Pnt 2262 3739 Pnt 2881 3742 Pnt 2344 3738 Pnt 2671 3738 Pnt 2427 3749 Pnt 2632 3751 Pnt 3455 3736 Pnt 3337 2820 Pnt 2360 3789 Pnt 3030 3751 Pnt 3705 3743 Pnt 2669 3741 Pnt 2871 3739 Pnt 2524 3823 Pnt 3460 3763 Pnt 2899 2742 Pnt 3111 3745 Pnt 2811 3743 Pnt 2460 3777 Pnt 3317 3746 Pnt 3421 3742 Pnt 2769 3743 Pnt 2367 3736 Pnt 2472 3739 Pnt 2715 3740 Pnt 3850 2477 Pnt 2826 3740 Pnt 3425 3735 Pnt 2901 3739 Pnt 2313 3756 Pnt 2663 3778 Pnt 2000 3772 Pnt 2790 3763 Pnt 2885 3744 Pnt 2925 2662 Pnt 2817 3745 Pnt 3216 3771 Pnt 2605 3759 Pnt 2846 3736 Pnt 1953 3791 Pnt 3034 3740 Pnt 2146 3738 Pnt 2419 3808 Pnt 3093 3746 Pnt 2915 3748 Pnt 2100 3802 Pnt 2966 3824 Pnt 2678 3743 Pnt 2695 3773 Pnt 2425 3742 Pnt 2810 3753 Pnt 2741 3749 Pnt 3020 3743 Pnt 2244 3801 Pnt 2652 3750 Pnt 2622 3751 Pnt 2628 3740 Pnt 3658 3755 Pnt 2844 3750 Pnt 3063 3742 Pnt 2489 3742 Pnt 2773 3740 Pnt 2544 3787 Pnt 3483 2581 Pnt 3288 3744 Pnt 2764 3743 Pnt 2664 3757 Pnt 2847 3742 Pnt 2653 3749 Pnt 2738 3767 Pnt 2187 3770 Pnt 2250 3803 Pnt 2935 3743 Pnt 2031 3790 Pnt 3251 3767 Pnt 2712 3775 Pnt 2160 3799 Pnt 3964 3758 Pnt 2844 3742 Pnt 2449 3740 Pnt 2945 3783 Pnt 2046 3774 Pnt 2633 3764 Pnt 2696 3760 Pnt 2390 3738 Pnt 2167 3770 Pnt 2745 3741 Pnt 3198 3739 Pnt 2539 3744 Pnt 2473 3738 Pnt 3256 3741 Pnt 2958 3748 Pnt 2607 3746 Pnt 2918 3743 Pnt 2932 3740 Pnt 2943 3747 Pnt 2927 3747 Pnt 3791 3793 Pnt 2590 3744 Pnt 2392 3814 Pnt 2499 3746 Pnt 3443 2824 Pnt 2993 3761 Pnt 2576 3738 Pnt 3539 2603 Pnt 2707 3741 Pnt 3368 3772 Pnt 2715 3746 Pnt 3596 3741 Pnt 2550 3767 Pnt 2344 3735 Pnt 2431 3741 Pnt 2490 3752 Pnt 2738 3738 Pnt 2471 3796 Pnt 2602 3738 Pnt 2740 3746 Pnt 4484 3732 Pnt 3060 3753 Pnt 2736 3739 Pnt 2530 3748 Pnt 2910 3741 Pnt 2792 3745 Pnt 2234 3734 Pnt 2629 3764 Pnt 2651 3742 Pnt 2896 3816 Pnt 3397 3814 Pnt 3288 3753 Pnt 3182 3745 Pnt 3099 3746 Pnt 2887 3741 Pnt 2724 2961 Pnt 3134 3751 Pnt 3016 3757 Pnt 2475 3814 Pnt 2433 3739 Pnt 2634 3746 Pnt 2537 3741 Pnt 2880 3741 Pnt 2673 3741 Pnt 3219 3735 Pnt 2374 3758 Pnt 3160 3743 Pnt 2917 3784 Pnt 2228 3774 Pnt 3561 3781 Pnt 3176 3745 Pnt 2190 3814 Pnt 3267 3741 Pnt 2451 3737 Pnt 2722 3742 Pnt 2775 3743 Pnt 2300 3765 Pnt 3115 3750 Pnt 2689 3744 Pnt 2452 3782 Pnt 2975 3767 Pnt 3076 3761 Pnt 2563 3785 Pnt 2315 3743 Pnt 2940 3741 Pnt 2549 3766 Pnt 2884 3748 Pnt 2580 3739 Pnt 2953 3788 Pnt 3207 3743 Pnt 2764 3748 Pnt 2575 3757 Pnt 2592 3739 Pnt 2628 3745 Pnt 2833 3735 Pnt 2683 3745 Pnt 2702 3748 Pnt 2649 3742 Pnt 3157 3779 Pnt 3086 3737 Pnt 3067 3743 Pnt 2597 3743 Pnt 3063 3750 Pnt 3393 3736 Pnt 2858 3736 Pnt 2121 3739 Pnt 2371 3799 Pnt 2067 3739 Pnt 3103 3760 Pnt 2628 3747 Pnt 2697 3749 Pnt 2713 3744 Pnt 3055 3762 Pnt 2496 3739 Pnt 2183 3840 Pnt 2536 3753 Pnt 2916 3758 Pnt 2494 3769 Pnt 2338 3837 Pnt 2620 3737 Pnt 3449 3737 Pnt 2281 3779 Pnt 3161 3747 Pnt 3129 3745 Pnt 2744 3753 Pnt 2843 3743 Pnt 2653 3841 Pnt 3317 3746 Pnt 2522 3780 Pnt 2897 3737 Pnt 2928 3740 Pnt 3300 2574 Pnt 2659 3749 Pnt 3563 3739 Pnt 2534 3749 Pnt 2217 3742 Pnt 3440 3734 Pnt 2471 3810 Pnt 3218 3751 Pnt 2893 3733 Pnt 2109 3747 Pnt 2409 3753 Pnt 3636 3749 Pnt 2580 3739 Pnt 2241 3764 Pnt 2957 3749 Pnt 3272 3772 Pnt 2505 3740 Pnt 2877 3747 Pnt 2150 3758 Pnt 2469 3825 Pnt 3720 3772 Pnt 3631 3749 Pnt 2133 3774 Pnt 2908 3738 Pnt 2551 3747 Pnt 2896 3744 Pnt 2815 3739 Pnt 2185 3755 Pnt 2523 3746 Pnt 3127 3747 Pnt 3402 3758 Pnt 3169 3747 Pnt 3165 2727 Pnt 2872 3739 Pnt 3145 3755 Pnt 2695 3927 Pnt 2950 3743 Pnt 4176 3746 Pnt 3134 3743 Pnt 2588 3767 Pnt 3123 3741 Pnt 2903 2836 Pnt 4195 2494 Pnt 2713 3739 Pnt 3174 3744 Pnt 2787 3754 Pnt 2547 3937 Pnt 3469 3754 Pnt 2258 3742 Pnt 3034 3751 Pnt 2587 3753 Pnt 2870 3739 Pnt 2705 3737 Pnt 2743 3748 Pnt 3367 2489 Pnt 2604 3741 Pnt 4103 3750 Pnt 2749 3743 Pnt 2474 3733 Pnt 2526 3758 Pnt 3451 3777 Pnt 2510 3749 Pnt 3297 3744 Pnt 2432 3750 Pnt 3410 3756 Pnt 2582 3734 Pnt 2482 3735 Pnt 2899 3744 Pnt 2491 3834 Pnt 3057 3754 Pnt 2235 3742 Pnt 3080 2581 Pnt 3023 3743 Pnt 2860 3745 Pnt 2536 3736 Pnt 2703 3743 Pnt 2727 3743 Pnt 2924 3743 Pnt 2774 3735 Pnt 2570 3768 Pnt 3098 3737 Pnt 2204 3738 Pnt 2413 3806 Pnt 2539 3794 Pnt 2838 3737 Pnt 3223 3768 Pnt 2953 3778 Pnt 2746 3746 Pnt 3538 3757 Pnt 3091 3738 Pnt 2484 3739 Pnt 2574 3736 Pnt 2607 3739 Pnt 3381 3746 Pnt 2490 3747 Pnt 3227 3739 Pnt 2635 3797 Pnt 1968 3825 Pnt 3101 3797 Pnt 3041 3739 Pnt 2570 3786 Pnt 2700 3759 Pnt 2723 3742 Pnt 2458 3739 Pnt 3297 3750 Pnt 2610 3749 Pnt 4005 3747 Pnt 3769 3742 Pnt 2939 3737 Pnt 2534 3741 Pnt 3396 2757 Pnt 3708 3743 Pnt 2618 3809 Pnt 3058 3757 Pnt 2590 3739 Pnt 2980 3744 Pnt 3953 3749 Pnt 2647 3752 Pnt 2788 3762 Pnt 1913 3786 Pnt 3151 3754 Pnt 2483 3757 Pnt 2417 3740 Pnt 2480 3764 Pnt 2881 3744 Pnt 2577 3737 Pnt 2820 3754 Pnt 3434 3743 Pnt 3184 3741 Pnt 2596 3762 Pnt 2616 3747 Pnt 2168 3755 Pnt 2223 3784 Pnt 2324 3758 Pnt 2852 3745 Pnt 2912 3732 Pnt 2488 3741 Pnt 2809 3737 Pnt 3027 3741 Pnt 3071 3746 Pnt 3095 3741 Pnt 2295 3757 Pnt 2259 3800 Pnt 2501 3768 Pnt 4128 3756 Pnt 2634 3739 Pnt 2512 3742 Pnt 3036 3734 Pnt 2541 3750 Pnt 3454 3737 Pnt 2596 3735 Pnt 2156 3753 Pnt 3045 3740 Pnt 2925 3766 Pnt 3091 3745 Pnt 2822 3772 Pnt 3170 3750 Pnt 3114 3763 Pnt 3056 3748 Pnt 2639 3737 Pnt 2298 3758 Pnt 2371 3744 Pnt 3225 3741 Pnt 2512 3760 Pnt 2511 3738 Pnt 1950 3743 Pnt 2801 3748 Pnt 3234 3746 Pnt 2686 3747 Pnt 3115 2915 Pnt 2745 3752 Pnt 3072 3743 Pnt 2875 3745 Pnt 2594 3742 Pnt 3084 3739 Pnt 2156 3776 Pnt 2333 3742 Pnt 2409 3753 Pnt 3389 3750 Pnt 2624 3743 Pnt 2787 3746 Pnt 2238 3745 Pnt 3192 3742 Pnt 2831 3743 Pnt 2053 3760 Pnt 2355 3749 Pnt 3492 3746 Pnt 2465 3741 Pnt 3056 3758 Pnt 2997 3753 Pnt 3111 3749 Pnt 2555 3742 Pnt 2498 3737 Pnt 2848 3738 Pnt 2058 3757 Pnt 2817 3750 Pnt 2598 3740 Pnt 2234 3770 Pnt 2853 3742 Pnt 2719 3736 Pnt 2354 3780 Pnt 2867 3742 Pnt 3790 3742 Pnt 2482 3742 Pnt 2754 3742 Pnt 3407 3746 Pnt 2529 3747 Pnt 2580 3759 Pnt 3635 3745 Pnt 3828 3749 Pnt 2606 3750 Pnt 3295 3738 Pnt 2487 3751 Pnt 2622 3754 Pnt 2350 3744 Pnt 3199 3753 Pnt 3322 3781 Pnt 3636 3744 Pnt 2406 3758 Pnt 3221 3751 Pnt 3219 3743 Pnt 2780 3744 Pnt 3098 2774 Pnt 2421 3779 Pnt 3742 3763 Pnt 2527 3744 Pnt 2204 3737 Pnt 3432 3751 Pnt 3137 3748 Pnt 2847 3748 Pnt 2430 3753 Pnt 2819 3744 Pnt 2334 3741 Pnt 2558 3831 Pnt 2490 3780 Pnt 2457 3768 Pnt 2246 3737 Pnt 3327 3768 Pnt 3064 3780 Pnt 2698 3890 Pnt 2560 3741 Pnt 2394 3790 Pnt 2675 3747 Pnt 2885 3739 Pnt 2500 3739 Pnt 2759 3741 Pnt 2503 3742 Pnt 2134 3745 Pnt 3550 3745 Pnt 2722 3758 Pnt 2006 3758 Pnt 3053 3745 Pnt 2996 3737 Pnt 2662 3744 Pnt 2343 3752 Pnt 2416 3744 Pnt 2859 3741 Pnt 2472 3738 Pnt 2564 3754 Pnt 2344 3735 Pnt 3126 3738 Pnt 3317 3750 Pnt 3980 2961 Pnt 2457 3737 Pnt 2691 3750 Pnt 2497 3743 Pnt 2872 3738 Pnt 2416 3740 Pnt 3108 3740 Pnt 2233 3755 Pnt 3139 3747 Pnt 2462 3744 Pnt 3050 3737 Pnt 2363 3758 Pnt 2637 3738 Pnt 2596 3736 Pnt 2841 3742 Pnt 2990 3744 Pnt 2562 3749 Pnt 2319 3737 Pnt 3404 3742 Pnt 2982 3781 Pnt 2197 3736 Pnt 3125 3770 Pnt 2735 2644 Pnt 2777 3743 Pnt 3786 3759 Pnt 2367 3756 Pnt 2984 3781 Pnt 2319 3741 Pnt 2078 3738 Pnt 2746 2620 Pnt 2931 3751 Pnt 3279 3745 Pnt 2280 3796 Pnt 3327 3737 Pnt 2816 3796 Pnt 2479 3776 Pnt 2291 3778 Pnt 3914 3734 Pnt 2217 3923 Pnt 2462 3747 Pnt 3828 3748 Pnt 3199 3747 Pnt 2564 3750 Pnt 2731 3751 Pnt 3603 3773 Pnt 2411 3735 Pnt 2830 3750 Pnt 2778 3765 Pnt 2377 3759 Pnt 2384 2581 Pnt 2083 3792 Pnt 2486 3738 Pnt 3707 3773 Pnt 3073 3745 Pnt 2633 3759 Pnt 2626 3759 Pnt 2760 3738 Pnt 2777 3756 Pnt 2484 3766 Pnt 2597 3745 Pnt 2138 3793 Pnt 3197 3766 Pnt 2796 3747 Pnt 3264 3768 Pnt 2523 3740 Pnt 2942 3740 Pnt 2602 3749 Pnt 2778 3742 Pnt 2303 3810 Pnt 2828 3749 Pnt 2556 2637 Pnt 2827 3748 Pnt 2150 3744 Pnt 3179 3756 Pnt 2739 3746 Pnt 2413 3754 Pnt 2450 3743 Pnt 3102 3760 Pnt 2256 3740 Pnt 2439 3743 Pnt 2362 3745 Pnt 2537 3745 Pnt 2710 3756 Pnt 3217 3745 Pnt 2696 3737 Pnt 2960 3734 Pnt 2422 3760 Pnt 2988 3746 Pnt 2269 3739 Pnt 2424 3738 Pnt 3174 3757 Pnt 2170 3820 Pnt 2905 3750 Pnt 3132 3759 Pnt 2676 3760 Pnt 2688 3754 Pnt 2798 3748 Pnt 2454 3739 Pnt 3092 3739 Pnt 2502 3809 Pnt 2585 3748 Pnt 3743 3742 Pnt 2241 3749 Pnt 2269 3772 Pnt 2769 2612 Pnt 2113 3744 Pnt 2977 3750 Pnt 2659 3760 Pnt 3012 3747 Pnt 3215 3740 Pnt 3641 3763 Pnt 2433 3758 Pnt 2253 3745 Pnt 3038 3741 Pnt 2942 3747 Pnt 2797 3746 Pnt 2711 3736 Pnt 2129 3766 Pnt 3298 3808 Pnt 3084 3750 Pnt 2252 3748 Pnt 2931 3739 Pnt 2896 3735 Pnt 2712 3748 Pnt 2884 3746 Pnt 2636 3744 Pnt 2955 3745 Pnt 2456 3744 Pnt 2715 3740 Pnt 4095 2689 Pnt 3323 3755 Pnt 2393 3735 Pnt 2378 3768 Pnt 2352 3747 Pnt 3602 3866 Pnt 2747 3741 Pnt 2486 3750 Pnt 3401 3745 Pnt 2541 3753 Pnt 3114 3747 Pnt 2619 3738 Pnt 2956 3743 Pnt 2517 3749 Pnt 2384 3740 Pnt 3298 3743 Pnt 2349 3741 Pnt 2795 3741 Pnt 2971 3739 Pnt 2366 3741 Pnt 2236 3733 Pnt 2443 3734 Pnt 2820 3748 Pnt 2633 3759 Pnt 3885 3734 Pnt 2558 3755 Pnt 2707 3749 Pnt 2637 3739 Pnt 2606 3744 Pnt 2415 3742 Pnt 2610 3775 Pnt 2076 3787 Pnt 2170 3800 Pnt 2461 3749 Pnt 2554 3741 Pnt 2707 3801 Pnt 2325 3816 Pnt 3223 3742 Pnt 2522 3735 Pnt 3027 3749 Pnt 3249 3752 Pnt 2457 3759 Pnt 3074 3741 Pnt 2862 3740 Pnt 3175 3742 Pnt 2304 3746 Pnt 3117 3752 Pnt 3198 3746 Pnt 2723 3739 Pnt 2615 3741 Pnt 3133 3740 Pnt 2172 3792 Pnt 2557 3750 Pnt 2442 3745 Pnt 2409 3779 Pnt 3031 3766 Pnt 2643 3740 Pnt 2595 3748 Pnt 2571 3743 Pnt 2793 3744 Pnt 2387 3734 Pnt 2676 3750 Pnt 2424 3758 Pnt 2352 3792 Pnt 1947 3762 Pnt 3212 2508 Pnt 2651 3745 Pnt 2668 3743 Pnt 3426 3792 Pnt 2903 3742 Pnt 2747 3800 Pnt 2483 3748 Pnt 2970 3756 Pnt 2863 3746 Pnt 2842 3746 Pnt 3516 3745 Pnt 2773 3743 Pnt 2304 3754 Pnt 2443 3817 Pnt 3637 3743 Pnt 3090 3738 Pnt 2988 3756 Pnt 2954 3738 Pnt 2780 3747 Pnt 2608 3748 Pnt 2775 3784 Pnt 3243 3758 Pnt 2285 3765 Pnt 3080 3748 Pnt 2546 3783 Pnt 3303 3017 Pnt 3016 3747 Pnt 2924 3737 Pnt 2599 3747 Pnt 3013 3745 Pnt 2649 3747 Pnt 2569 3749 Pnt 2464 3766 Pnt 3077 3751 Pnt 2825 3755 Pnt 3282 3758 Pnt 2747 3746 Pnt 2567 3787 Pnt 2439 3751 Pnt 3478 3758 Pnt 2465 3795 Pnt 2777 3748 Pnt 2140 3803 Pnt 2695 3745 Pnt 2292 3761 Pnt 2621 3745 Pnt 2687 3742 Pnt 3091 3738 Pnt 2454 3745 Pnt 2687 3794 Pnt 3009 3748 Pnt 2896 3738 Pnt 3062 3780 Pnt 2656 3754 Pnt 2744 3743 Pnt 2628 3749 Pnt 2539 3747 Pnt 2293 3741 Pnt 2287 3781 Pnt 3142 3741 Pnt 2497 3790 Pnt 2385 3911 Pnt 3190 3743 Pnt 3056 3740 Pnt 2301 3738 Pnt 4105 3753 Pnt 2570 3739 Pnt 3298 3755 Pnt 2770 3747 Pnt 3365 3747 Pnt 3101 3772 Pnt 2691 3742 Pnt 2961 3750 Pnt 3433 2674 Pnt 2465 3743 Pnt 3366 3746 Pnt 2774 3782 Pnt 3435 2684 Pnt 3319 3752 Pnt 2442 3747 Pnt 2607 3747 Pnt 2690 3745 Pnt 2974 2640 Pnt 3381 3749 Pnt 2506 3779 Pnt 3010 3766 Pnt 2777 3742 Pnt 3513 2542 Pnt 2598 3746 Pnt 2625 3762 Pnt 3185 3744 Pnt 2014 2702 Pnt 2220 3772 Pnt 2708 3742 Pnt 2422 3774 Pnt 3112 3770 Pnt 2587 3779 Pnt 1919 3771 Pnt 3235 3779 Pnt 2503 3743 Pnt 2921 3745 Pnt 3005 3741 Pnt 2667 3745 Pnt 2773 3745 Pnt 2550 3738 Pnt 3158 3761 Pnt 2449 3792 Pnt 2996 3742 Pnt 2451 3800 Pnt 2172 3777 Pnt 3413 3744 Pnt 2693 3758 Pnt 2705 3760 Pnt 3165 3744 Pnt 2194 3740 Pnt 2633 3742 Pnt 2578 3747 Pnt 3543 3745 Pnt 2634 3735 Pnt 2189 3796 Pnt 2478 3744 Pnt 2155 3745 Pnt 2347 3740 Pnt 3889 3749 Pnt 2874 3755 Pnt 2649 3742 Pnt 2465 3791 Pnt 2313 3739 Pnt 2184 3760 Pnt 2618 3747 Pnt 3156 3773 Pnt 2008 3756 Pnt 2840 3807 Pnt 2118 3786 Pnt 3395 3746 Pnt 2760 3741 Pnt 2717 3758 Pnt 2280 3758 Pnt 3107 3745 Pnt 2642 3740 Pnt 2660 3740 Pnt 2596 3780 Pnt 2642 3779 Pnt 2976 3768 Pnt 2611 3735 Pnt 2965 3736 Pnt 2445 3750 Pnt 2965 3744 Pnt 2787 3743 Pnt 2829 2678 Pnt 2675 3738 Pnt 3051 3742 Pnt 2828 3755 Pnt 2609 3740 Pnt 2476 3738 Pnt 3062 3745 Pnt 2595 3745 Pnt 2686 3742 Pnt 2820 3770 Pnt 3139 3749 Pnt 3428 2956 Pnt 2872 3752 Pnt 2389 3745 Pnt 2873 3747 Pnt 3824 2784 Pnt 2703 3755 Pnt 2427 3741 Pnt 2254 3740 Pnt 3151 3747 Pnt 2965 3742 Pnt 3398 3741 Pnt 2292 3752 Pnt 3174 3745 Pnt 2460 3808 Pnt 2595 3741 Pnt 2599 3745 Pnt 2729 3745 Pnt 3282 3756 Pnt 3527 3747 Pnt 2651 3751 Pnt 3391 3758 Pnt 2524 3749 Pnt 2763 3745 Pnt 2128 3773 Pnt 2564 3757 Pnt 2295 3773 Pnt 2036 3788 Pnt 2785 3743 Pnt 2733 3749 Pnt 3672 3753 Pnt 2888 3746 Pnt 2947 3749 Pnt 2091 3739 Pnt 2974 3778 Pnt 2608 3778 Pnt 2777 3740 Pnt 3109 3752 Pnt 2982 3739 Pnt 3213 3747 Pnt 2800 3752 Pnt 2932 3740 Pnt 1995 3792 Pnt 2893 3774 Pnt 2775 3761 Pnt 3280 3745 Pnt 3184 3750 Pnt 3153 3753 Pnt 3156 2773 Pnt 2881 3754 Pnt 2646 2986 Pnt 2375 3798 Pnt 2397 3803 Pnt 2430 3735 Pnt 2770 3754 Pnt 2545 3752 Pnt 2055 3914 Pnt 2971 3745 Pnt 2565 3737 Pnt 2716 3749 Pnt 3762 3753 Pnt 3192 3747 Pnt 4207 2565 Pnt 2676 3738 Pnt 2578 3763 Pnt 3170 2564 Pnt 2635 3763 Pnt 2270 3746 Pnt 2379 3737 Pnt 2266 3763 Pnt 2565 3754 Pnt 2942 2339 Pnt 2753 3760 Pnt 2478 3737 Pnt 3225 3744 Pnt 2995 3746 Pnt 2675 3746 Pnt 2158 3755 Pnt 2667 3788 Pnt 3754 2779 Pnt 2957 2604 Pnt 2521 3745 Pnt 2614 3739 Pnt 3375 3745 Pnt 2664 3737 Pnt 2578 3774 Pnt 2378 3810 Pnt 2903 3755 Pnt 3218 3739 Pnt 2651 3742 Pnt 3019 3738 Pnt 2875 3740 Pnt 2798 3810 Pnt 2884 3740 Pnt 2838 2509 Pnt 2950 3739 Pnt 3231 3752 Pnt 2750 3739 Pnt 2680 3770 Pnt 2548 3778 Pnt 3423 3755 Pnt 2489 3739 Pnt 2458 3736 Pnt 2259 3745 Pnt 1986 3740 Pnt 1972 3784 Pnt 3368 3751 Pnt 2509 3806 Pnt 3307 3745 Pnt 2888 3751 Pnt 3126 3737 Pnt 2839 3745 Pnt 3193 3738 Pnt 2688 3753 Pnt 2241 3754 Pnt 3207 3737 Pnt 2518 3760 Pnt 2125 3756 Pnt 2408 3738 Pnt 2742 3743 Pnt 2480 3749 Pnt 3767 3743 Pnt 2556 3738 Pnt 2498 3766 Pnt 2893 3741 Pnt 3120 3746 Pnt 2489 3754 Pnt 2762 3751 Pnt 3816 3752 Pnt 2935 3749 Pnt 2934 3768 Pnt 3081 3747 Pnt 2954 3742 Pnt 3010 3741 Pnt 2437 3750 Pnt 3247 3768 Pnt 2908 3746 Pnt 2720 3735 Pnt 2575 3750 Pnt 2524 3740 Pnt 2978 3745 Pnt 2610 3740 Pnt 3735 3746 Pnt 2115 3760 Pnt 2258 3752 Pnt 2977 3745 Pnt 2076 3766 Pnt 2928 3747 Pnt 2482 3738 Pnt 2138 3742 Pnt 2749 3741 Pnt 2844 2523 Pnt 2582 3752 Pnt 2162 3778 Pnt 2618 3744 Pnt 2425 3742 Pnt 2754 3764 Pnt 2191 3897 Pnt 2967 3741 Pnt 2604 3740 Pnt 2940 3743 Pnt 2242 3782 Pnt 2973 3740 Pnt 2689 3745 Pnt 3535 2639 Pnt 2298 3772 Pnt 3576 3741 Pnt 3152 3749 Pnt 3037 3744 Pnt 3184 3744 Pnt 2550 3737 Pnt 3347 3754 Pnt 2744 3749 Pnt 3078 3741 Pnt 3791 3740 Pnt 2872 3754 Pnt 2660 3739 Pnt 3196 3748 Pnt 2865 3780 Pnt 2650 3744 Pnt 2528 3736 Pnt 2353 3739 Pnt 2677 3739 Pnt 2571 3776 Pnt 2917 3748 Pnt 2651 3743 Pnt 3126 3739 Pnt 2390 3760 Pnt 2373 3750 Pnt 2401 3736 Pnt 3489 3745 Pnt 3327 3750 Pnt 2735 3771 Pnt 2512 3736 Pnt 2079 3795 Pnt 3866 3783 Pnt 2891 3741 Pnt 2664 3739 Pnt 2593 3772 Pnt 3495 3752 Pnt 2822 3754 Pnt 1992 3793 Pnt 2690 3747 Pnt 2568 3763 Pnt 2080 3734 Pnt 1911 3741 Pnt 3111 3744 Pnt 3458 2855 Pnt 3030 3755 Pnt 2381 3816 Pnt 3205 3737 Pnt 2921 3740 Pnt 3054 3745 Pnt 2803 3736 Pnt 4041 3749 Pnt 3505 3749 Pnt 3248 3756 Pnt 2763 3781 Pnt 3095 3749 Pnt 2357 3735 Pnt 3629 3740 Pnt 2859 3742 Pnt 2862 3766 Pnt 2567 3739 Pnt 2995 3740 Pnt 1964 3797 Pnt 2432 3740 Pnt 2185 3801 Pnt 2799 3738 Pnt 2986 3742 Pnt 3437 3759 Pnt 3568 3747 Pnt 3194 3732 Pnt 2502 3738 Pnt 2031 3756 Pnt 2304 3740 Pnt 3269 3739 Pnt 3002 3754 Pnt 2899 3745 Pnt 4014 2704 Pnt 2638 3742 Pnt 2338 3747 Pnt 2982 3761 Pnt 3060 3759 Pnt 3275 3748 Pnt 2247 3762 Pnt 2764 3788 Pnt 2339 3753 Pnt 3492 3761 Pnt 2077 3773 Pnt 2023 3799 Pnt 2963 3782 Pnt 3295 3753 Pnt 1998 3758 Pnt 2644 3743 Pnt 2440 3776 Pnt 3142 2729 Pnt 2951 3743 Pnt 3382 3741 Pnt 2701 3741 Pnt 3180 3746 Pnt 2338 3761 Pnt 2351 3791 Pnt 2503 3774 Pnt 2267 3773 Pnt 3199 3745 Pnt 3001 3741 Pnt 3502 3746 Pnt 3105 3743 Pnt 2609 3767 Pnt 2757 3739 Pnt 2739 3743 Pnt 2888 3741 Pnt 2614 3738 Pnt 2533 3767 Pnt 2467 3771 Pnt 3163 3758 Pnt 3140 3741 Pnt 3041 3737 Pnt 2861 3759 Pnt 2204 3750 Pnt 2984 3746 Pnt 2644 3755 Pnt 2629 3740 Pnt 3246 3739 Pnt 2458 3745 Pnt 2636 3743 Pnt 2071 3742 Pnt 2981 3740 Pnt 2618 3761 Pnt 2368 3792 Pnt 2376 3773 Pnt 2809 3751 Pnt 2929 3787 Pnt 2661 3738 Pnt 3353 3743 Pnt 2423 3763 Pnt 2965 3738 Pnt 2275 3747 Pnt 2177 3763 Pnt 2821 3745 Pnt 2144 3816 Pnt 2624 3748 Pnt 2428 3760 Pnt 3163 3749 Pnt 2880 3746 Pnt 2878 3736 Pnt 3279 3746 Pnt 2767 3744 Pnt 2279 3865 Pnt 2904 3763 Pnt 3076 3778 Pnt 2740 3763 Pnt 3231 3748 Pnt 2779 3739 Pnt 3031 3745 Pnt 3176 3742 Pnt 2387 3738 Pnt 2656 3740 Pnt 2288 3736 Pnt 2631 3743 Pnt 2944 3750 Pnt 1756 3754 Pnt 2994 3749 Pnt 2672 3753 Pnt 3368 3753 Pnt 3834 2759 Pnt 3137 3741 Pnt 3128 3766 Pnt 2356 3744 Pnt 2716 3766 Pnt 4454 2644 Pnt 2828 3749 Pnt 2563 3792 Pnt 2339 3789 Pnt 3220 2499 Pnt 2526 3803 Pnt 2567 3745 Pnt 2784 3745 Pnt 2487 3775 Pnt 2383 3744 Pnt 2792 2900 Pnt 2867 3752 Pnt 2630 3745 Pnt 2596 3749 Pnt 2198 3782 Pnt 3569 3757 Pnt 2564 3743 Pnt 2879 3767 Pnt 2189 3767 Pnt 3004 3742 Pnt 3182 3755 Pnt 2998 3743 Pnt 2344 3737 Pnt 2765 3751 Pnt 2951 3761 Pnt 2706 3739 Pnt 3778 3739 Pnt 2836 3793 Pnt 2541 3740 Pnt 2413 3738 Pnt 1941 3806 Pnt 2804 3744 Pnt 2840 3785 Pnt 2456 3815 Pnt 3894 3754 Pnt 2840 3750 Pnt 3110 3746 Pnt 2365 3738 Pnt 3383 3741 Pnt 3023 3747 Pnt 3187 3743 Pnt 3333 3749 Pnt 2630 3747 Pnt 3771 2902 Pnt 2987 3748 Pnt 2819 3753 Pnt 2734 3753 Pnt 3403 3755 Pnt 3195 3753 Pnt 3066 3746 Pnt 3290 3763 Pnt 2433 3768 Pnt 2652 3768 Pnt 2969 3768 Pnt 2398 3759 Pnt 3338 3738 Pnt 2339 3734 Pnt 2833 3748 Pnt 2506 2544 Pnt 3081 3738 Pnt 2908 3741 Pnt 2938 3744 Pnt 2632 3743 Pnt 3009 3742 Pnt 2623 3764 Pnt 2125 3741 Pnt 2063 3762 Pnt 2826 3841 Pnt 2359 3808 Pnt 1876 3814 Pnt 2238 3780 Pnt 2523 3757 Pnt 2524 3740 Pnt 2951 3742 Pnt 2313 3749 Pnt 2647 3739 Pnt 3864 3745 Pnt 2779 3807 Pnt 3207 3735 Pnt 2741 2614 Pnt 3191 3759 Pnt 2574 3741 Pnt 2087 3801 Pnt 3280 3750 Pnt 2154 3824 Pnt 2826 3741 Pnt 3857 3751 Pnt 2795 3744 Pnt 3704 3755 Pnt 4100 3749 Pnt 2984 3741 Pnt 2648 3737 Pnt 3288 3738 Pnt 2602 3738 Pnt 1953 3774 Pnt 3020 3741 Pnt 2251 3788 Pnt 2318 3824 Pnt 2595 3741 Pnt 3263 3743 Pnt 2569 3747 Pnt 3076 3740 Pnt 3860 2695 Pnt 2759 3744 Pnt 2402 3747 Pnt 2780 3746 Pnt 2545 3741 Pnt 2028 3739 Pnt 3196 2674 Pnt 2191 3777 Pnt 3188 3757 Pnt 2564 3744 Pnt 2704 3743 Pnt 2834 3747 Pnt 3318 2494 Pnt 2885 3747 Pnt 2726 3750 Pnt 2577 3767 Pnt 2661 3755 Pnt 2286 3777 Pnt 3046 3741 Pnt 3767 3742 Pnt 2678 3759 Pnt 2555 3755 Pnt 2068 3809 Pnt 3117 3746 Pnt 3130 3754 Pnt 2088 3754 Pnt 2562 3759 Pnt 1807 3809 Pnt 2890 3739 Pnt 2156 3937 Pnt 2828 3746 Pnt 3436 3739 Pnt 2176 3744 Pnt 3115 3757 Pnt 2627 3744 Pnt 3574 3745 Pnt 2529 3757 Pnt 2665 3739 Pnt 2816 3758 Pnt 2479 3738 Pnt 3032 3739 Pnt 3230 3743 Pnt 2468 3742 Pnt 2676 3744 Pnt 2194 3757 Pnt 2853 3753 Pnt 2459 3744 Pnt 3574 3738 Pnt 2348 3799 Pnt 2537 3744 Pnt 2980 3753 Pnt 2676 3762 Pnt 2119 3778 Pnt 2465 3749 Pnt 3415 2807 Pnt 2747 3743 Pnt 2982 3741 Pnt 2735 3741 Pnt 3182 3738 Pnt 2188 3837 Pnt 2675 3741 Pnt 2361 3742 Pnt 3218 3737 Pnt 4331 2720 Pnt 3864 3742 Pnt 2248 3740 Pnt 2386 3759 Pnt 2358 3759 Pnt 2947 3740 Pnt 2176 3760 Pnt 2038 3745 Pnt 3083 3759 Pnt 4219 2596 Pnt 2184 3740 Pnt 2942 3737 Pnt 2012 3764 Pnt 3183 3745 Pnt 2641 3748 Pnt 2801 3739 Pnt 3005 3746 Pnt 2744 3749 Pnt 2767 3740 Pnt 2427 3749 Pnt 3418 3752 Pnt 2650 3738 Pnt 3293 3749 Pnt 2822 3737 Pnt 2675 3814 Pnt 2785 3747 Pnt 2679 3737 Pnt 2751 3797 Pnt 2043 3762 Pnt 2882 3747 Pnt 2662 3825 Pnt 2642 3744 Pnt 2939 3757 Pnt 3190 3737 Pnt 2049 3825 Pnt 2369 3745 Pnt 2495 3753 Pnt 3007 3772 Pnt 2336 3754 Pnt 2895 3768 Pnt 2409 3739 Pnt 3328 3743 Pnt 3692 3745 Pnt 2294 3758 Pnt 2328 3748 Pnt 2138 3737 Pnt 1946 3786 Pnt 2817 3753 Pnt 3494 3754 Pnt 2812 3747 Pnt 2793 3739 Pnt 3391 3742 Pnt 2796 3754 Pnt 2451 3774 Pnt 2672 3744 Pnt 2516 3745 Pnt 3102 3747 Pnt 3487 3774 Pnt 2500 3745 Pnt 2205 3814 Pnt 3160 3736 Pnt 2647 3741 Pnt 2609 3736 Pnt 3087 3743 Pnt 3477 3738 Pnt 2716 3737 Pnt 2918 3741 Pnt 2770 3743 Pnt 3023 3743 Pnt 2585 3744 Pnt 2401 3814 Pnt 3351 3738 Pnt 2407 3743 Pnt 1980 3776 Pnt 2611 3814 Pnt 3135 3744 Pnt 2821 3757 Pnt 2674 3761 Pnt 2846 3737 Pnt 2491 3739 Pnt 2433 3736 Pnt 2438 3784 Pnt 3170 3748 Pnt 2427 3747 Pnt 2670 3800 Pnt 2896 3741 Pnt 2369 3758 Pnt 2851 3754 Pnt 3096 3779 Pnt 2112 3768 Pnt 2628 3747 Pnt 3618 3772 Pnt 2539 3741 Pnt 2394 3834 Pnt 2842 2747 Pnt 3077 3747 Pnt 3569 3738 Pnt 2601 3736 Pnt 2648 3745 Pnt 3361 3743 Pnt 3109 3752 Pnt 2824 3746 Pnt 2199 3779 Pnt 2963 3744 Pnt 2461 3743 Pnt 2676 3746 Pnt 2788 3737 Pnt 2690 3746 Pnt 2354 3767 Pnt 3100 3747 Pnt 2687 3763 Pnt 3025 3767 Pnt 3004 3737 Pnt 2747 3737 Pnt 3454 3802 Pnt 2657 3746 Pnt 2423 3738 Pnt 3241 3778 Pnt 3059 3743 Pnt 2527 3745 Pnt 3569 2612 Pnt 2783 3796 Pnt 2662 3746 Pnt 2068 3744 Pnt 2420 3747 Pnt 3197 3749 Pnt 2521 3736 Pnt 3206 3733 Pnt 2856 3751 Pnt 3007 3743 Pnt 2889 3746 Pnt 3000 3743 Pnt 2717 3737 Pnt 2721 3780 Pnt 2596 3739 Pnt 3375 3746 Pnt 2777 3744 Pnt 3392 3739 Pnt 2733 3927 Pnt 3100 3750 Pnt 2548 3737 Pnt 2540 3740 Pnt 2634 3734 Pnt 2651 3757 Pnt 2426 3747 Pnt 2770 3740 Pnt 3280 3757 Pnt 3761 3746 Pnt 2896 3751 Pnt 3615 3791 Pnt 2937 3749 Pnt 2030 3746 Pnt 2655 3751 Pnt 3739 2533 Pnt 2616 3739 Pnt 2592 3739 Pnt 2057 3743 Pnt 3398 3746 Pnt 2737 3743 Pnt 2453 3759 Pnt 3470 2684 Pnt 2465 3743 Pnt 3079 3746 Pnt 3138 2640 Pnt 2830 3748 Pnt 2484 3743 Pnt 1959 3747 Pnt 2775 3781 Pnt 2929 3743 Pnt 2517 3737 Pnt 2895 3753 Pnt 2552 3753 Pnt 2907 3742 Pnt 2745 3733 Pnt 2523 3752 Pnt 2067 3806 Pnt 3161 3808 Pnt 2501 3780 Pnt 2714 2434 Pnt 2320 3737 Pnt 2917 3805 Pnt 2546 3782 Pnt 2513 3768 Pnt 3281 3747 Pnt 3423 2644 Pnt 2635 3757 Pnt 3809 3742 Pnt 2584 3763 Pnt 2834 3733 Pnt 2371 3740 Pnt 3117 3744 Pnt 3964 3749 Pnt 3039 3739 Pnt 3216 3745 Pnt 2739 3749 Pnt 2832 2714 Pnt 1949 3890 Pnt 3149 3757 Pnt 2957 3751 Pnt 2551 3741 Pnt 2360 3765 Pnt 2472 3754 Pnt 2498 3761 Pnt 2312 3743 Pnt 3108 3750 Pnt 2606 3738 Pnt 3531 3761 Pnt 2664 3743 Pnt 2490 3744 Pnt 3524 3744 Pnt 2691 3744 Pnt 2257 3742 Pnt 3266 3748 Pnt 2764 3748 Pnt 2370 3788 Pnt 2245 3745 Pnt 2209 3821 Pnt 2833 3748 Pnt 2562 3743 Pnt 2260 3754 Pnt 2761 3743 Pnt 4400 3747 Pnt 2285 3737 Pnt 2811 3745 Pnt 2314 3755 Pnt 2870 3761 Pnt 3099 3743 Pnt 2697 3738 Pnt 2781 3793 Pnt 3017 3737 Pnt 2342 3735 Pnt 2525 3809 Pnt 2686 2574 Pnt 3052 3745 Pnt 2111 3808 Pnt 2538 3756 Pnt 2545 3750 Pnt 2803 3760 Pnt 2713 3743 Pnt 2355 3742 Pnt 2403 3744 Pnt 2900 3735 Pnt 2542 3755 Pnt 2658 3743 Pnt 2968 3750 Pnt 2754 2549 Pnt 2818 3745 Pnt 2758 3746 Pnt 2166 3810 Pnt 2759 3752 Pnt 3168 3750 Pnt 2796 3745 Pnt 2901 3737 Pnt 2766 3741 Pnt 2734 3743 Pnt 2320 3796 Pnt 3403 3750 Pnt 2489 3737 Pnt 3135 3734 Pnt 3436 3741 Pnt 3264 3772 Pnt 3322 3752 Pnt 2570 3747 Pnt 2503 3739 Pnt 3188 3744 Pnt 2647 3751 Pnt 2546 3757 Pnt 3257 3740 Pnt 2173 3792 Pnt 2888 3759 Pnt 2314 3754 Pnt 3301 3788 Pnt 2879 3757 Pnt 2667 3750 Pnt 2463 3773 Pnt 3052 3745 Pnt 2311 3744 Pnt 2524 3738 Pnt 2417 3755 Pnt 2346 3735 Pnt 2738 3745 Pnt 2598 3759 Pnt 2621 3776 Pnt 3295 3748 Pnt 2956 3741 Pnt 2873 3760 Pnt 3038 3768 Pnt 2784 3740 Pnt 2301 3901 Pnt 2510 3738 Pnt 2636 3749 Pnt 2432 3776 Pnt 2405 3748 Pnt 2627 3746 Pnt 3083 3739 Pnt 2590 3749 Pnt 2500 3742 Pnt 3612 3759 Pnt 2562 3743 Pnt 2156 3923 Pnt 3531 3758 Pnt 2351 3750 Pnt 2696 3748 Pnt 2320 3772 Pnt 2908 3784 Pnt 2894 3734 Pnt 2627 3741 Pnt 3268 3743 Pnt 3864 3743 Pnt 3754 3755 Pnt 2823 3757 Pnt 2404 3770 Pnt 2623 3741 Pnt 2387 3731 Pnt 2966 3758 Pnt 3305 3747 Pnt 2809 3742 Pnt 3085 3750 Pnt 2948 3768 Pnt 2608 3760 Pnt 2754 3768 Pnt 1867 3871 Pnt 2904 3744 Pnt 3339 3763 Pnt 2596 3744 Pnt 3212 2551 Pnt 2886 3745 Pnt 4134 2593 Pnt 3715 3821 Pnt 2703 3755 Pnt 2931 3766 Pnt 2617 3759 Pnt 2763 2850 Pnt 2814 3795 Pnt 2624 3744 Pnt 2423 3747 Pnt 2323 3766 Pnt 2781 3747 Pnt 2326 3821 Pnt 3246 3747 Pnt 2657 3821 Pnt 2831 3750 Pnt 2637 3762 Pnt 2805 3748 Pnt 3611 3737 Pnt 2384 3740 Pnt 2822 3810 Pnt 2453 3735 Pnt 2874 3751 Pnt 3986 2709 Pnt 3733 3742 Pnt 2128 3766 Pnt 2368 3734 Pnt 2594 2773 Pnt 2129 3756 Pnt 2729 3747 Pnt 3341 3747 Pnt 2587 3758 Pnt 3274 3751 Pnt 2406 3747 Pnt 3114 3753 Pnt 2675 3759 Pnt 2475 3747 Pnt 2102 3744 Pnt 3344 3762 Pnt 3227 3749 Pnt 2988 3747 Pnt 3071 3746 Pnt 2410 3779 Pnt 3454 3755 Pnt 2678 3739 Pnt 2386 3760 Pnt 2356 3739 Pnt 3050 3761 Pnt 2331 3744 Pnt 3030 3739 Pnt 3273 3739 Pnt 2529 3737 Pnt 3184 3746 Pnt 3378 3755 Pnt 3146 3743 Pnt 2599 3741 Pnt 2812 3745 Pnt 2835 3768 Pnt 2672 3742 Pnt 2441 3735 Pnt 2512 3740 Pnt 2171 3739 Pnt 3069 3731 Pnt 2959 3744 Pnt 2739 3740 Pnt 3444 3782 Pnt 2792 3738 Pnt 2234 3750 Pnt 3307 3744 Pnt 3050 3825 Pnt 2541 3736 Pnt 2824 3752 Pnt 2643 3783 Pnt 2729 3741 Pnt 2534 3750 Pnt 2424 3733 Pnt 3029 3753 Pnt 1869 3759 Pnt 2372 3739 Pnt 2848 3742 Pnt 2886 3738 Pnt 3031 3759 Pnt 2923 3739 Pnt 2556 3754 Pnt 3422 3754 Pnt 2654 3745 Pnt 2798 3748 Pnt 3041 3744 Pnt 2831 3752 Pnt 2584 3742 Pnt 3079 3748 Pnt 2689 2786 Pnt 2242 3741 Pnt 2557 3753 Pnt 3302 3733 Pnt 3645 3746 Pnt 2285 3802 Pnt 2488 3746 Pnt 2421 3741 Pnt 2919 3744 Pnt 2987 3746 Pnt 2844 3740 Pnt 2610 3820 Pnt 2896 3750 Pnt 2405 3751 Pnt 2315 3741 Pnt 3197 3745 Pnt 2007 3819 Pnt 3090 3743 Pnt 2202 3787 Pnt 2605 3740 Pnt 3159 3744 Pnt 2678 3748 Pnt 2165 3787 Pnt 3035 3740 Pnt 2693 3737 Pnt 3130 3748 Pnt 2474 3749 Pnt 3433 3745 Pnt 2605 3742 Pnt 2640 3744 Pnt 2489 3823 Pnt 2545 3775 Pnt 3548 3750 Pnt 2878 3741 Pnt 2311 3750 Pnt 2905 3758 Pnt 2642 3775 Pnt 3268 3775 Pnt 2633 3745 Pnt 2744 3753 Pnt 2981 3755 Pnt 2752 3792 Pnt 3088 3747 Pnt 3067 3746 Pnt 4444 2659 Pnt 2312 3738 Pnt 3161 3781 Pnt 2798 3735 Pnt 2792 3745 Pnt 2902 3741 Pnt 2794 3747 Pnt 2826 3742 Pnt 3252 3750 Pnt 2293 3736 Pnt 1711 3736 Pnt 2997 3754 Pnt 2542 3761 Pnt 2480 3740 Pnt 2332 3793 Pnt 2527 3801 Pnt 3262 3738 Pnt 2076 3813 Pnt 2993 3793 Pnt 4113 3752 Pnt 2791 3747 Pnt 2461 3829 Pnt 2223 3830 Pnt 2852 3739 Pnt 2888 3740 Pnt 2495 3749 Pnt 2487 3794 Pnt 2760 3748 Pnt 2648 3744 Pnt 2949 3740 Pnt 2993 3759 Pnt 2919 3742 Pnt 3078 3750 Pnt 2879 3740 Pnt 2283 3745 Pnt 3015 3740 Pnt 2698 3747 Pnt 2499 3740 Pnt 2120 3780 Pnt 2872 3747 Pnt 2975 3746 Pnt 2347 3758 Pnt 3018 2773 Pnt 2792 3766 Pnt 1890 3750 Pnt 2562 3745 Pnt 2957 3749 Pnt 2262 3794 Pnt 2904 3755 Pnt 2668 3744 Pnt 2843 3740 Pnt 3219 3742 Pnt 3079 3741 Pnt 2744 3749 Pnt 2248 3828 Pnt 2134 3803 Pnt 2379 3738 Pnt 2432 3755 Pnt 3170 3737 Pnt 2750 3806 Pnt 2372 3742 Pnt 2956 3757 Pnt 2634 3755 Pnt 3659 2469 Pnt 2436 3743 Pnt 2831 3744 Pnt 2558 3749 Pnt 2108 3800 Pnt 3322 3749 Pnt 2881 3747 Pnt 2156 3843 Pnt 2765 3737 Pnt 1952 3790 Pnt 2962 3766 Pnt 2344 3745 Pnt 2754 3759 Pnt 2539 3744 Pnt 2466 3747 Pnt 3226 3835 Pnt 2270 3782 Pnt 2756 3752 Pnt 2680 3745 Pnt 3371 3746 Pnt 3037 3742 Pnt 1826 3807 Pnt 2992 3752 Pnt 2873 3756 Pnt 2865 3738 Pnt 3436 3752 Pnt 2852 3739 Pnt 2645 3738 Pnt 2544 3802 Pnt 2086 3793 Pnt 3414 3806 Pnt 3212 3742 Pnt 2580 3794 Pnt 3457 3757 Pnt 3018 3794 Pnt 2789 3761 Pnt 3332 2595 Pnt 2970 3866 Pnt 2496 3766 Pnt 2099 3765 Pnt 2542 3787 Pnt 2712 3828 Pnt 2909 3756 Pnt 2674 3742 Pnt 3279 3746 Pnt 2865 3749 Pnt 1936 3771 Pnt 3462 3743 Pnt 2998 3759 Pnt 2972 3742 Pnt 2571 3747 Pnt 2508 3779 Pnt 3546 3772 Pnt 3744 3777 Pnt 3254 3747 Pnt 2480 3762 Pnt 1954 3771 Pnt 2171 3786 Pnt 2978 3781 Pnt 3529 3757 Pnt 2052 3738 Pnt 2965 2587 Pnt 3433 3743 Pnt 3014 3747 Pnt 2820 3738 Pnt 2303 3746 Pnt 3141 3744 Pnt 3088 2799 Pnt 2565 3745 Pnt 2956 3754 Pnt 3464 3743 Pnt 2407 3785 Pnt 3103 3779 Pnt 2296 3791 Pnt 2925 3768 Pnt 2419 3740 Pnt 2689 3748 Pnt 2975 3766 Pnt 2689 3740 Pnt 3216 3760 Pnt 3000 3754 Pnt 2595 3740 Pnt 2424 3733 Pnt 2526 3736 Pnt 2235 3760 Pnt 3964 2667 Pnt 2568 3760 Pnt 2876 3750 Pnt 2417 3747 Pnt 2289 3782 Pnt 2922 3762 Pnt 2543 3744 Pnt 2894 3752 Pnt 2526 3746 Pnt 2639 3757 Pnt 2569 3746 Pnt 2326 3758 Pnt 2229 3746 Pnt 3981 2519 Pnt 3376 3746 Pnt 2969 3758 Pnt 3495 3743 Pnt 3324 3742 Pnt 2781 3745 Pnt 3085 3740 Pnt 3170 2712 Pnt 2884 3746 Pnt 3460 3742 Pnt 3678 3757 Pnt 3362 3758 Pnt 3749 3747 Pnt 2685 3774 Pnt 2380 3788 Pnt 2461 3737 Pnt 2856 3744 Pnt 2887 3741 Pnt 2595 3748 Pnt 2426 3764 Pnt 2675 3792 Pnt 2650 3741 Pnt 3554 3761 Pnt 2684 3742 Pnt 2375 3806 Pnt 2808 3770 Pnt 3667 3761 Pnt 3267 3739 Pnt 2585 3752 Pnt 3182 3746 Pnt 2558 3745 Pnt 3562 2923 Pnt 2952 3749 Pnt 2482 3749 Pnt 2891 3752 Pnt 2328 3815 Pnt 3037 3741 Pnt 2649 3749 Pnt 2254 3754 Pnt 3621 3739 Pnt 2618 3800 Pnt 2748 3758 Pnt 2662 3752 Pnt 3389 3763 Pnt 2417 3795 Pnt 3010 3746 Pnt 2137 3777 Pnt 2588 3751 Pnt 1929 3914 Pnt 2452 3758 Pnt 2712 3752 Pnt 2847 3751 Pnt 2923 3753 Pnt 2847 3740 Pnt 2790 3747 Pnt 2774 3745 Pnt 2799 3745 Pnt 2712 2663 Pnt 2318 3745 Pnt 3708 3746 Pnt 2814 3748 Pnt 2780 3735 Pnt 2857 3750 Pnt 2701 3745 Pnt 1928 3784 Pnt 3015 3808 Pnt 2667 3744 Pnt 3111 3738 Pnt 2774 3749 Pnt 3050 3749 Pnt 2591 3732 Pnt 2409 3738 Pnt 3736 2569 Pnt 2576 3738 Pnt 3081 3748 Pnt 2789 3748 Pnt 2551 3798 Pnt 2800 3739 Pnt 2704 3739 Pnt 2566 3740 Pnt 3574 2701 Pnt 3219 2565 Pnt 2336 3774 Pnt 2608 3740 Pnt 2456 3803 Pnt 2767 3761 Pnt 1957 3772 Pnt 2900 3771 Pnt 2346 3759 Pnt 2162 3772 Pnt 2599 3841 Pnt 3114 3753 Pnt 2582 3757 Pnt 2071 3788 Pnt 2332 3786 Pnt 3563 3737 Pnt 3437 3745 Pnt 2474 3754 Pnt 2709 3739 Pnt 3237 3752 Pnt 2633 3773 Pnt 2902 3754 Pnt 2647 3794 Pnt 2551 3739 Pnt 2466 3739 Pnt 2405 3748 Pnt 3428 3734 Pnt 2064 3742 Pnt 2560 3746 Pnt 2444 3740 Pnt 3208 3744 Pnt 2495 3796 Pnt 2600 3744 Pnt 2832 3735 Pnt 3147 3745 Pnt 2683 3780 Pnt 2285 3742 Pnt 2165 3768 Pnt 2478 3781 Pnt 2428 3765 Pnt 2927 3764 Pnt 2190 3839 Pnt 2881 3735 Pnt 3112 3839 Pnt 2839 3745 Pnt 2879 3756 Pnt 2694 3738 Pnt 2386 3740 Pnt 2754 3740 Pnt 3695 3756 Pnt 2625 3803 Pnt 2465 3830 Pnt 3631 3749 Pnt 3345 3753 Pnt 2834 3733 Pnt 3292 3738 Pnt 3068 3825 Pnt 2770 3768 Pnt 2365 3755 Pnt 2706 3740 Pnt 2666 3753 Pnt 2472 3772 Pnt 2751 3747 Pnt 2411 3741 Pnt 3515 3758 Pnt 3225 3747 Pnt 2474 3738 Pnt 2240 3740 Pnt 3206 3740 Pnt 2978 3747 Pnt 3061 3742 Pnt 2938 3762 Pnt 3192 2822 Pnt 2930 3741 Pnt 2831 3762 Pnt 3040 3740 Pnt 3987 2576 Pnt 2910 3754 Pnt 2918 3736 Pnt 3212 3748 Pnt 3096 3745 Pnt 2586 3749 Pnt 2853 3769 Pnt 3450 3745 Pnt 2516 3743 Pnt 2585 3738 Pnt 2998 3747 Pnt 3073 3747 Pnt 2618 3743 Pnt 2194 3764 Pnt 3225 3748 Pnt 2672 3752 Pnt 3523 3766 Pnt 2549 3741 Pnt 2556 3740 Pnt 2177 3765 Pnt 3513 3747 Pnt 2996 3736 Pnt 2716 3742 Pnt 2921 3737 Pnt 3017 3743 Pnt 2761 3740 Pnt 3011 3740 Pnt 2701 3740 Pnt 2663 3745 Pnt 2228 3748 Pnt 2374 3911 Pnt 2689 3755 Pnt 2989 3744 Pnt 3479 3746 Pnt 2823 3754 Pnt 2474 3754 Pnt 3220 3754 Pnt 2655 3739 Pnt 3125 3739 Pnt 3028 3751 Pnt 3327 3748 Pnt 2401 3750 Pnt 2627 3735 Pnt 2137 3781 Pnt 3012 2673 Pnt 3065 3774 Pnt 2393 3801 Pnt 3269 3740 Pnt 3451 3745 Pnt 2922 3771 Pnt 3033 3771 Pnt 3232 3741 Pnt 2811 3749 Pnt 2445 3740 Pnt 2595 3759 Pnt 2392 3740 Pnt 2351 3742 Pnt 2445 3752 Pnt 2076 3798 Pnt 3281 3739 Pnt 2962 3740 Pnt 3059 3740 Pnt 2672 3761 Pnt 2644 3737 Pnt 2766 3743 Pnt 2534 3792 Pnt 2841 3737 Pnt 2713 3739 Pnt 3368 3760 Pnt 3120 3814 Pnt 4202 3758 Pnt 2374 3740 Pnt 3101 3738 Pnt 2380 3759 Pnt 2805 3749 Pnt 3018 3770 Pnt 3706 2866 Pnt 2945 3748 Pnt 2674 3744 Pnt 2832 3754 Pnt 3191 3744 Pnt 2227 3756 Pnt 3810 3743 Pnt 2825 3763 Pnt 3623 3753 Pnt 3815 3745 Pnt 2665 3744 Pnt 3254 3756 Pnt 2584 3801 Pnt 2032 3739 Pnt 2984 3745 Pnt 2980 3760 Pnt 3479 3739 Pnt 2086 3745 Pnt 3120 3743 Pnt 3346 3801 Pnt 3125 3742 Pnt 2316 3796 Pnt 2606 3791 Pnt 2306 3750 Pnt 2611 3744 Pnt 2239 3773 Pnt 3089 3760 Pnt 2751 3736 Pnt 3574 3818 Pnt 2738 3739 Pnt 2161 3739 Pnt 2473 3774 Pnt 2068 3741 Pnt 2713 3740 Pnt 2303 3788 Pnt 3554 3761 Pnt 2887 3737 Pnt 2296 3753 Pnt 2974 3741 Pnt 2927 3747 Pnt 3481 3741 Pnt 2386 3762 Pnt 2959 3743 Pnt 3156 3751 Pnt 2347 3737 Pnt 2491 3816 Pnt 2885 3748 Pnt 2302 3762 Pnt 3082 3737 Pnt 2591 3791 Pnt 2702 3791 Pnt 2898 3775 Pnt 3139 3762 Pnt 2663 3749 Pnt 3188 3748 Pnt 2713 3743 Pnt 2433 3773 Pnt 2290 3767 Pnt 2356 3749 Pnt 2744 3757 Pnt 3685 3743 Pnt 3563 3755 Pnt 2749 3766 Pnt 3384 3747 Pnt 2491 3735 Pnt 2403 3751 Pnt 2417 3767 Pnt 3530 3755 Pnt 2524 3743 Pnt 2489 3738 Pnt 2396 3763 Pnt 2954 3749 Pnt 3584 3739 Pnt 2453 3751 Pnt 3277 3742 Pnt 2962 3739 Pnt 3074 3740 Pnt 2657 3746 Pnt 2497 3763 Pnt 2870 2684 Pnt 2735 3742 Pnt 2637 3743 Pnt 2536 3764 Pnt 3550 2841 Pnt 3017 3737 Pnt 2478 3750 Pnt 3097 3755 Pnt 3445 3746 Pnt 2555 3740 Pnt 2957 3743 Pnt 3012 3759 Pnt 2717 3752 Pnt 2771 3741 Pnt 3093 3743 Pnt 2496 3764 Pnt 2943 3760 Pnt 2888 3741 Pnt 2152 3806 Pnt 2618 3750 Pnt 3123 3747 Pnt 2399 3755 Pnt 2921 3747 Pnt 2047 3782 Pnt 2952 3754 Pnt 2510 3740 Pnt 2480 3815 Pnt 3231 3746 Pnt 2437 3745 Pnt 3592 3754 Pnt 2984 3746 Pnt 3049 3745 Pnt 2046 3742 Pnt 1994 3773 Pnt 3392 3746 Pnt 2438 3760 Pnt 2929 3745 Pnt 2389 3745 Pnt 2303 3796 Pnt 2920 3744 Pnt 2478 3742 Pnt 2578 3770 Pnt 2758 3739 Pnt 2311 3781 Pnt 3212 3744 Pnt 2830 3751 Pnt 2604 3748 Pnt 2790 3788 Pnt 3549 2684 Pnt 2307 3815 Pnt 2931 3738 Pnt 3224 3744 Pnt 2961 3810 Pnt 2803 3745 Pnt 2398 3747 Pnt 2626 3736 Pnt 3099 3745 Pnt 2736 3770 Pnt 2565 3744 Pnt 2677 3753 Pnt 3438 3745 Pnt 2724 3748 Pnt 2764 3743 Pnt 2538 3786 Pnt 2720 3790 Pnt 2889 3740 Pnt 2377 3746 Pnt 3003 3745 Pnt 2066 3784 Pnt 3174 3752 Pnt 2432 3749 Pnt 3233 3760 Pnt 3008 3739 Pnt 2489 3736 Pnt 3061 3739 Pnt 2645 3767 Pnt 2461 3803 Pnt 2692 3753 Pnt 3164 3751 Pnt 2801 3755 Pnt 2125 3767 Pnt 2273 3742 Pnt 2861 3808 Pnt 2578 3792 Pnt 3056 3811 Pnt 2498 3743 Pnt 2446 3806 Pnt 2748 3766 Pnt 3776 3785 Pnt 2908 3741 Pnt 2872 3743 Pnt 2357 3738 Pnt 2972 3741 Pnt 2270 3745 Pnt 2591 3751 Pnt 2986 3740 Pnt 2487 3737 Pnt 4004 3749 Pnt 2535 3750 Pnt 3060 3736 Pnt 2576 3745 Pnt 3462 2677 Pnt 3377 3740 Pnt 2629 3763 Pnt 3064 3746 Pnt 2863 3745 Pnt 2719 3744 Pnt 2422 3759 Pnt 2674 3736 Pnt 2247 3738 Pnt 2674 2602 Pnt 4129 2898 Pnt 3183 3738 Pnt 3290 3758 Pnt 2675 3756 Pnt 2916 3738 Pnt 2822 3752 Pnt 2398 3760 Pnt 3449 3761 Pnt 2044 3841 Pnt 3222 3743 Pnt 2290 3777 Pnt 2950 3761 Pnt 3161 3744 Pnt 2976 3758 Pnt 3274 3793 Pnt 2247 3744 Pnt 3145 3746 Pnt 3388 3744 Pnt 2720 3749 Pnt 3079 3769 Pnt 2557 3744 Pnt 2989 3750 Pnt 2469 3900 Pnt 2666 3742 Pnt 2923 3756 Pnt 2483 3741 Pnt 2337 3749 Pnt 3119 3746 Pnt 2805 3746 Pnt 2946 2551 Pnt 3034 3743 Pnt 2721 3738 Pnt 2387 3749 Pnt 3496 3743 Pnt 3110 3747 Pnt 2652 3739 Pnt 2917 3770 Pnt 2747 3740 Pnt 2516 3736 Pnt 3194 3741 Pnt 2210 3741 Pnt 2512 3750 Pnt 1943 3814 Pnt 2648 3837 Pnt 2566 3747 Pnt 2976 3741 Pnt 2212 3791 Pnt 2620 3743 Pnt 2502 3740 Pnt 2360 3772 Pnt 3587 3754 Pnt 3230 3774 Pnt 2678 3762 Pnt 2509 3741 Pnt 3396 3737 Pnt 2985 3748 Pnt 3012 3741 Pnt 2606 3789 Pnt 1981 3780 Pnt 2739 3740 Pnt 2669 3733 Pnt 2126 3757 Pnt 2536 3763 Pnt 2430 3742 Pnt 3085 3759 Pnt 3595 3745 Pnt 3021 3750 Pnt 3321 3743 Pnt 2522 3751 Pnt 2899 3737 Pnt 3187 3743 Pnt 2369 3768 Pnt 3061 3743 Pnt 2513 3735 Pnt 2485 3749 Pnt 2787 3761 Pnt 2049 3793 Pnt 2951 3745 Pnt 3115 3750 Pnt 2603 3741 Pnt 2655 3776 Pnt 2877 3739 Pnt 2640 3738 Pnt 2553 3744 Pnt 2539 3744 Pnt 2035 3801 Pnt 2911 3807 Pnt 2640 3739 Pnt 2760 3744 Pnt 2820 3751 Pnt 3363 3739 Pnt 2778 3737 Pnt 2492 3742 Pnt 3124 3751 Pnt 3510 3748 Pnt 2621 3742 Pnt 2411 3782 Pnt 2498 3741 Pnt 2793 3740 Pnt 2587 3741 Pnt 2830 3742 Pnt 3503 3748 Pnt 2552 3780 Pnt 3031 3752 Pnt 3000 3749 Pnt 3009 3748 Pnt 2332 3776 Pnt 2565 3739 Pnt 2326 3742 Pnt 2620 3768 Pnt 2582 3737 Pnt 2675 3741 Pnt 2929 3753 Pnt 4126 3768 Pnt 2683 3757 Pnt 2781 3735 Pnt 2612 3752 Pnt 3144 3745 Pnt 3055 3750 Pnt 2688 3741 Pnt 2988 3746 Pnt 2659 3745 Pnt 3618 3748 Pnt 2753 3747 Pnt 2388 3803 Pnt 2904 3750 Pnt 3189 3743 Pnt 2592 3746 Pnt 2549 3759 Pnt 2465 3741 Pnt 2933 3741 Pnt 3336 3758 Pnt 3931 3744 Pnt 2751 3751 Pnt 3590 3742 Pnt 3889 2689 Pnt 2818 3740 Pnt 2508 3744 Pnt 3001 3739 Pnt 2138 3777 Pnt 2723 3739 Pnt 2108 3784 Pnt 2707 3746 Pnt 2599 3739 Pnt 2921 3743 Pnt 3011 3743 Pnt 3061 3746 Pnt 2501 3808 Pnt 2689 3746 Pnt 3691 3754 Pnt 2914 3754 Pnt 2375 3745 Pnt 2265 3744 Pnt 2890 3743 Pnt 2581 3739 Pnt 3028 3744 Pnt 2390 3740 Pnt 3602 3743 Pnt 2806 3773 Pnt 2666 3739 Pnt 2258 3782 Pnt 2997 3739 Pnt 1991 3943 Pnt 2376 3731 Pnt 2808 3741 Pnt 2352 3796 Pnt 3648 2599 Pnt 1975 3799 Pnt 3224 3801 Pnt 2875 3742 Pnt 2557 3757 Pnt 3142 3743 Pnt 2433 3759 Pnt 2939 3757 Pnt 3037 3743 Pnt 2754 2782 Pnt 2979 3746 Pnt 3133 3740 Pnt 2945 3738 Pnt 2472 3739 Pnt 3169 3742 Pnt 2377 3759 Pnt 2487 3755 Pnt 1940 3759 Pnt 2843 3745 Pnt 2948 3737 Pnt 2565 3805 Pnt 2448 3768 Pnt 3611 3746 Pnt 3434 3747 Pnt 2570 3779 Pnt 2964 3749 Pnt 3051 3808 Pnt 2689 3754 Pnt 2730 3773 Pnt 3492 2575 Pnt 2747 3744 Pnt 2726 3773 Pnt 2116 3760 Pnt 2782 3761 Pnt 2552 3865 Pnt 2511 3865 Pnt 2399 3733 Pnt 2966 3761 Pnt 2493 3747 Pnt 3700 3740 Pnt 2236 3786 Pnt 2586 3767 Pnt 3057 3774 Pnt 2816 3748 Pnt 2521 2889 Pnt 2829 3751 Pnt 3385 3745 Pnt 3250 2706 Pnt 2840 3740 Pnt 3303 3751 Pnt 2433 3781 Pnt 2756 3741 Pnt 2750 3755 Pnt 2885 3781 Pnt 3811 3763 Pnt 2666 3742 Pnt 3547 3747 Pnt 2466 3817 Pnt 3355 3755 Pnt 2869 3747 Pnt 2755 3747 Pnt 3399 3744 Pnt 2581 3746 Pnt 2960 3744 Pnt 3470 3746 Pnt 3024 3734 Pnt 2939 3739 Pnt 2846 3753 Pnt 2479 3743 Pnt 3073 2774 Pnt 3173 3744 Pnt 3887 3743 Pnt 2884 3751 Pnt 2491 3752 Pnt 2870 3746 Pnt 2666 3814 Pnt 2815 3753 Pnt 2768 3747 Pnt 2703 3746 Pnt 2541 3743 Pnt 2159 3762 Pnt 3064 3743 Pnt 2925 3752 Pnt 3154 3745 Pnt 2765 3744 Pnt 2206 3749 Pnt 2637 3764 Pnt 3198 3797 Pnt 2513 3747 Pnt 2011 3891 Pnt 2379 3822 Pnt 2818 3825 Pnt 3603 3742 Pnt 2917 3747 Pnt 2817 3836 Pnt 3087 3738 Pnt 2780 3744 Pnt 2454 3738 Pnt 2965 3836 Pnt 2691 3743 Pnt 2817 3745 Pnt 2835 3748 Pnt 3089 3745 Pnt 3425 2990 Pnt 2461 3737 Pnt 2978 3761 Pnt 3442 3749 Pnt 2638 3772 Pnt 2172 3738 Pnt 3400 3751 Pnt 3296 3793 Pnt 2716 3737 Pnt 3261 2643 Pnt 2415 3736 Pnt 2879 2707 Pnt 2282 3777 Pnt 2885 2667 Pnt 2809 3754 Pnt 2400 3736 Pnt 2877 3741 Pnt 2148 3790 Pnt 2307 3753 Pnt 2716 3764 Pnt 2685 3744 Pnt 2248 3777 Pnt 2181 3881 Pnt 2389 3748 Pnt 2920 3743 Pnt 2158 3741 Pnt 2285 3741 Pnt 2719 3824 Pnt 2902 3731 Pnt 2704 3744 Pnt 2485 3834 Pnt 2106 3767 Pnt 2799 3742 Pnt 2882 3760 Pnt 2417 3731 Pnt 3236 3748 Pnt 3066 3767 Pnt 1990 3788 Pnt 3160 3757 Pnt 3070 3760 Pnt 2468 3748 Pnt 2262 3752 Pnt 2601 3788 Pnt 2730 3738 Pnt 2813 3755 Pnt 2557 3747 Pnt 2477 3737 Pnt 2779 3762 Pnt 2341 3777 Pnt 2984 3754 Pnt 2419 3747 Pnt 2493 3927 Pnt 4002 3770 Pnt 2791 3737 Pnt 2823 3747 Pnt 2725 3747 Pnt 2480 3746 Pnt 2485 3757 Pnt 2423 3755 Pnt 3155 3740 Pnt 2909 3743 Pnt 3388 3741 Pnt 2406 3738 Pnt 2445 3739 Pnt 2897 3745 Pnt 3207 2464 Pnt 2609 3746 Pnt 2707 3739 Pnt 3488 3784 Pnt 2171 3743 Pnt 2829 3749 Pnt 3519 3745 Pnt 3024 3739 Pnt 2139 3753 Pnt 3316 3747 Pnt 2041 3821 Pnt 2772 3757 Pnt 2477 3757 Pnt 1898 3755 Pnt 2625 3753 Pnt 2804 3761 Pnt 2419 3765 Pnt 3186 3752 Pnt 3454 3745 Pnt 3286 3745 Pnt 3018 3739 Pnt 2397 3743 Pnt 2816 3740 Pnt 3067 3741 Pnt 2288 3754 Pnt 2483 3745 Pnt 2738 3759 Pnt 3167 3759 Pnt 2347 3775 Pnt 2618 3754 Pnt 2559 3746 Pnt 2502 3750 Pnt 2957 3751 Pnt 2819 3750 Pnt 2814 3750 Pnt 2565 3934 Pnt 2832 3749 Pnt 2891 3767 Pnt 2204 3809 Pnt 2839 3737 Pnt 3834 3745 Pnt 2754 3743 Pnt 2411 3741 Pnt 2326 3808 Pnt 2784 3743 Pnt 2404 3791 Pnt 3157 3747 Pnt 2610 3767 Pnt 2653 3757 Pnt 2344 3742 Pnt 3414 3747 Pnt 2596 3746 Pnt 2953 3747 Pnt 2320 3744 Pnt 2919 3740 Pnt 2630 3757 Pnt 2545 3772 Pnt 3035 3743 Pnt 2879 2791 Pnt 2609 3750 Pnt 2545 3742 Pnt 2616 3734 Pnt 2825 3757 Pnt 2523 3814 Pnt 3046 3757 Pnt 2312 3809 Pnt 3270 3752 Pnt 2663 3737 Pnt 2872 3740 Pnt 3718 3743 Pnt 2484 3781 Pnt 2188 3788 Pnt 2371 3758 Pnt 3002 3743 Pnt 2845 3751 Pnt 2906 3741 Pnt 4078 3743 Pnt 2431 3754 Pnt 3325 3741 Pnt 3212 3763 Pnt 3969 2514 Pnt 2624 3764 Pnt 2726 3750 Pnt 3293 3737 Pnt 2226 3741 Pnt 3062 3764 Pnt 3191 3742 Pnt 2475 3740 Pnt 3201 2577 Pnt 2821 3745 Pnt 2734 3745 Pnt 2586 3738 Pnt 3494 3745 Pnt 3202 3770 Pnt 3191 3739 Pnt 3697 3739 Pnt 3565 2563 Pnt 2913 2718 Pnt 2683 3743 Pnt 2388 3818 Pnt 2942 2489 Pnt 2767 3762 Pnt 3060 3773 Pnt 2926 3739 Pnt 2682 3778 Pnt 3958 3752 Pnt 3062 3750 Pnt 2891 3741 Pnt 2207 3782 Pnt 2875 3745 Pnt 2407 3747 Pnt 2390 3901 Pnt 3049 3744 Pnt 2686 3780 Pnt 2771 3744 Pnt 3000 3741 Pnt 2510 3754 Pnt 2723 3749 Pnt 2354 3739 Pnt 2639 3768 Pnt 2709 3746 Pnt 3087 3749 Pnt 3001 3751 Pnt 2596 3735 Pnt 2814 3765 Pnt 2777 3776 Pnt 2451 3820 Pnt 3170 3751 Pnt 2764 3739 Pnt 2694 3757 Pnt 2327 3763 Pnt 2341 3762 Pnt 2724 3740 Pnt 2814 3747 Pnt 3451 3749 Pnt 2585 3758 Pnt 3146 3757 Pnt 2554 3765 Pnt 2256 3758 Pnt 2696 3750 Pnt 2885 3732 Pnt 3287 3771 Pnt 2485 3747 Pnt 3225 3750 Pnt 3121 3743 Pnt 2784 3765 Pnt 3095 3733 Pnt 3714 3749 Pnt 2910 3741 Pnt 2983 3762 Pnt 2678 3765 Pnt 2678 3761 Pnt 2602 3751 Pnt 2051 3739 Pnt 2730 3740 Pnt 2937 3741 Pnt 3003 3753 Pnt 2771 3744 Pnt 2806 3744 Pnt 2504 3743 Pnt 2906 3744 Pnt 2954 3744 Pnt 3062 3763 Pnt 2941 3762 Pnt 2825 3739 Pnt 2753 3749 Pnt 2405 3748 Pnt 3184 3821 Pnt 2815 3755 Pnt 2471 3743 Pnt 3244 3766 Pnt 2717 3735 Pnt 2977 3747 Pnt 2696 3761 Pnt 3889 3755 Pnt 2531 3739 Pnt 2918 3749 Pnt 2716 3744 Pnt 2462 3739 Pnt 2148 3747 Pnt 2458 3782 Pnt 2650 3738 Pnt 2248 3759 Pnt 3081 3748 Pnt 2364 3821 Pnt 3012 3784 Pnt 2419 3751 Pnt 3002 3743 Pnt 2888 3825 Pnt 2943 3752 Pnt 2575 3810 Pnt 2694 3748 Pnt 3148 3760 Pnt 3511 3758 Pnt 3404 3743 Pnt 3087 3810 Pnt 2703 3748 Pnt 2225 3742 Pnt 2370 3749 Pnt 2234 3735 Pnt 3430 3752 Pnt 2860 3750 Pnt 3232 3744 Pnt 2890 3753 Pnt 2161 3744 Pnt 2855 3747 Pnt 2594 2696 Pnt 3066 3741 Pnt 2710 3743 Pnt 3238 3755 Pnt 3156 3744 Pnt 2677 3749 Pnt 2854 3758 Pnt 2432 3740 Pnt 2566 3744 Pnt 2308 3745 Pnt 2343 3745 Pnt 3118 3752 Pnt 2906 3754 Pnt 2301 3737 Pnt 2602 3758 Pnt 2699 3768 Pnt 2376 3774 Pnt 3046 3746 Pnt 1991 3808 Pnt 2525 3746 Pnt 2633 3741 Pnt 2938 3739 Pnt 2719 3742 Pnt 2589 3740 Pnt 3587 3792 Pnt 2968 3755 Pnt 3244 3740 Pnt 2962 3744 Pnt 2551 3762 Pnt 3683 2770 Pnt 2799 3770 Pnt 3231 3744 Pnt 2873 3751 Pnt 2082 3754 Pnt 2601 3751 Pnt 3699 3738 Pnt 2177 3787 Pnt 3554 3737 Pnt 2244 2695 Pnt 2574 3800 Pnt 2770 3740 Pnt 3215 3735 Pnt 3011 3767 Pnt 2709 3746 Pnt 3394 3746 Pnt 2956 3740 Pnt 2711 3747 Pnt 3024 3744 Pnt 2816 3752 Pnt 2361 3923 Pnt 2595 3754 Pnt 3098 3753 Pnt 2300 3792 Pnt 2251 3750 Pnt 3155 3753 Pnt 2530 3741 Pnt 2433 3783 Pnt 2888 3792 Pnt 2605 3802 Pnt 2204 3784 Pnt 2460 3750 Pnt 3409 3748 Pnt 2170 3734 Pnt 3338 3760 Pnt 2749 3732 Pnt 2811 3746 Pnt 2884 3750 Pnt 3580 3751 Pnt 3898 3748 Pnt 2921 3748 Pnt 2387 3749 Pnt 3070 3740 Pnt 2947 3741 Pnt 2644 3751 Pnt 2910 3747 Pnt 2812 3781 Pnt 2613 3744 Pnt 2063 3813 Pnt 3215 3740 Pnt 2690 3742 Pnt 2226 3775 Pnt 2260 3747 Pnt 2731 3743 Pnt 2563 3740 Pnt 2772 3813 Pnt 2717 3746 Pnt 2527 3747 Pnt 2551 3775 Pnt 3392 3743 Pnt 2816 3747 Pnt 2713 3741 Pnt 2337 3746 Pnt 3520 3747 Pnt 2906 3763 Pnt 2178 3825 Pnt 2972 3751 Pnt 3521 3750 Pnt 3130 3748 Pnt 2976 3744 Pnt 2740 3758 Pnt 2113 3780 Pnt 2733 3739 Pnt 3919 3744 Pnt 2882 3781 Pnt 3104 3743 Pnt 2727 3739 Pnt 2352 3740 Pnt 2695 3737 Pnt 3437 3747 Pnt 2631 3738 Pnt 2266 3759 Pnt 2976 3793 Pnt 2628 3758 Pnt 3506 3741 Pnt 2688 3794 Pnt 2717 3759 Pnt 2964 3745 Pnt 3103 3755 Pnt 2793 3749 Pnt 3118 3744 Pnt 2565 3749 Pnt 2412 3737 Pnt 3837 3755 Pnt 2954 3742 Pnt 2584 3827 Pnt 2671 3759 Pnt 2597 3783 Pnt 2638 3755 Pnt 2464 3743 Pnt 2745 3767 Pnt 2604 3740 Pnt 2435 3742 Pnt 2845 3765 Pnt 2795 3737 Pnt 2572 3745 Pnt 2944 3754 Pnt 3158 3753 Pnt 2933 3744 Pnt 3583 3740 Pnt 3309 3733 Pnt 2870 3741 Pnt 2759 3755 Pnt 2085 3797 Pnt 2719 3743 Pnt 2304 3755 Pnt 2729 3742 Pnt 2561 3754 Pnt 3435 3742 Pnt 3103 3740 Pnt 2671 3743 Pnt 2437 3829 Pnt 3928 3745 Pnt 3551 3742 Pnt 2854 3743 Pnt 2959 3741 Pnt 2551 3824 Pnt 2853 3745 Pnt 2929 3744 Pnt 2846 3824 Pnt 2763 3746 Pnt 2257 3750 Pnt 2326 3810 Pnt 2874 3742 Pnt 2696 3806 Pnt 2638 3742 Pnt 2064 3828 Pnt 3388 3750 Pnt 3105 3745 Pnt 3283 3747 Pnt 2475 3762 Pnt 2254 3823 Pnt 3074 3749 Pnt 2788 3744 Pnt 2979 3750 Pnt 2641 3745 Pnt 2504 3740 Pnt 3525 3758 Pnt 2042 3793 Pnt 2668 3747 Pnt 2666 3745 Pnt 3001 3752 Pnt 3037 3740 Pnt 3137 3749 Pnt 3324 2519 Pnt 2825 3794 Pnt 2600 3745 Pnt 2646 3806 Pnt 3092 3743 Pnt 2511 3738 Pnt 2457 3785 Pnt 2715 3766 Pnt 2411 3738 Pnt 3281 3735 Pnt 3216 3747 Pnt 2782 3753 Pnt 2612 3738 Pnt 2918 3747 Pnt 3275 2347 Pnt 3155 3745 Pnt 2226 3800 Pnt 2294 3757 Pnt 2878 3777 Pnt 2108 3780 Pnt 3528 3805 Pnt 2450 3736 Pnt 2976 3752 Pnt 2978 3779 Pnt 2471 3762 Pnt 2160 3843 Pnt 2413 3791 Pnt 2607 3746 Pnt 2338 3761 Pnt 2320 3740 Pnt 2612 3748 Pnt 2582 3798 Pnt 3099 3748 Pnt 2120 3758 Pnt 2788 3750 Pnt 2576 3766 Pnt 3127 3744 Pnt 2545 3744 Pnt 2564 3740 Pnt 2852 3738 Pnt 2475 3742 Pnt 2274 3794 Pnt 2903 3759 Pnt 2283 3786 Pnt 3046 3738 Pnt 3456 3737 Pnt 3028 3749 Pnt 1825 3770 Pnt 3045 3766 Pnt 2849 3750 Pnt 2336 3782 Pnt 2670 3738 Pnt 2297 3740 Pnt 2190 3831 Pnt 3661 3750 Pnt 2604 3747 Pnt 2886 3740 Pnt 2451 3758 Pnt 2780 3757 Pnt 2976 3754 Pnt 2649 3751 Pnt 3798 3760 Pnt 2605 3755 Pnt 2288 3758 Pnt 3167 3744 Pnt 2382 3774 Pnt 2798 3744 Pnt 2962 3755 Pnt 2829 3737 Pnt 3550 3745 Pnt 2624 3770 Pnt 2565 3752 Pnt 2283 3757 Pnt 3862 2565 Pnt 2911 3748 Pnt 3043 3739 Pnt 2337 3745 Pnt 3273 3748 Pnt 2836 3737 Pnt 3239 3746 Pnt 2376 3745 Pnt 2170 3745 Pnt 3943 3747 Pnt 2578 3761 Pnt 4252 3754 Pnt 3135 3749 Pnt 2901 3753 Pnt 2630 3828 Pnt 2920 3746 Pnt 2295 3782 Pnt 3335 2768 Pnt 2400 3746 Pnt 2297 3866 Pnt 2794 3749 Pnt 2810 2786 Pnt 2617 3737 Pnt 2772 3742 Pnt 1975 3807 Pnt 2890 3756 Pnt 2051 3800 Pnt 2483 3742 Pnt 2569 3808 Pnt 2362 3747 Pnt 2718 3745 Pnt 2616 3800 Pnt 2584 3005 Pnt 2708 3751 Pnt 2851 3751 Pnt 3260 3756 Pnt 3155 3745 Pnt 2992 3744 Pnt 2640 3742 Pnt 2800 3787 Pnt 2430 3739 Pnt 3592 3744 Pnt 2808 3792 Pnt 3204 3740 Pnt 3147 3792 Pnt 2657 3734 Pnt 2953 3738 Pnt 2564 3780 Pnt 2455 3739 Pnt 2567 3747 Pnt 2912 3744 Pnt 3537 3741 Pnt 2434 3756 Pnt 2556 3761 Pnt 3122 3745 Pnt 3547 3748 Pnt 3708 3761 Pnt 2776 3819 Pnt 3059 3742 Pnt 2831 3746 Pnt 2784 3757 Pnt 2237 3799 Pnt 2137 3792 Pnt 3247 3750 Pnt 3035 3745 Pnt 3365 3772 Pnt 2928 3748 Pnt 2728 3765 Pnt 2656 3781 Pnt 2610 3803 Pnt 2631 3741 Pnt 2076 3772 Pnt 2765 3788 Pnt 2173 3800 Pnt 2327 3808 Pnt 2382 3756 Pnt 2278 3841 Pnt 3317 3744 Pnt 2269 3747 Pnt 2617 3745 Pnt 3155 3749 Pnt 2015 3754 Pnt 2944 3746 Pnt 2654 3753 Pnt 2276 3741 Pnt 2802 3744 Pnt 2841 3749 Pnt 2826 3752 Pnt 2281 3764 Pnt 2759 3757 Pnt 2557 3792 Pnt 2558 3748 Pnt 3010 3749 Pnt 2576 3758 Pnt 1970 3784 Pnt 3464 3748 Pnt 2845 3792 Pnt 2340 3806 Pnt 3049 3754 Pnt 2869 3734 Pnt 2941 3768 Pnt 2387 3789 Pnt 2912 3739 Pnt 2961 3751 Pnt 2747 3745 Pnt 2488 3818 Pnt 2369 3748 Pnt 2310 3811 Pnt 1817 3792 Pnt 2325 3760 Pnt 2922 3750 Pnt 3012 3744 Pnt 2852 3737 Pnt 3133 3740 Pnt 2654 3750 Pnt 3052 3750 Pnt 2807 3733 Pnt 2655 3740 Pnt 3246 3747 Pnt 2773 3782 Pnt 3323 3741 Pnt 2652 3743 Pnt 2255 3798 Pnt 2872 3736 Pnt 2539 3796 Pnt 2078 3810 Pnt 3389 3739 Pnt 2209 3819 Pnt 2172 3746 Pnt 2474 3778 Pnt 2137 3813 Pnt 3036 2133 Pnt 2556 3741 Pnt 3351 2567 Pnt 2504 3754 Pnt 3285 3754 Pnt 2610 3752 Pnt 2554 3766 Pnt 2625 3748 Pnt 2446 3742 Pnt 2596 3792 Pnt 2427 3765 Pnt 3030 3778 Pnt 2553 3763 Pnt 2385 3738 Pnt 2596 3794 Pnt 2648 3764 Pnt 2406 3795 Pnt 2165 3839 Pnt 2242 3737 Pnt 2736 3794 Pnt 2653 3738 Pnt 2636 3758 Pnt 2241 3771 Pnt 3829 3750 Pnt 2969 3750 Pnt 2128 3867 Pnt 2678 2620 Pnt 2160 3777 Pnt 3557 3750 Pnt 2828 3738 Pnt 2829 3740 Pnt 3376 3745 Pnt 3146 3740 Pnt 3129 3733 Pnt 3250 3740 Pnt 2261 3754 Pnt 3370 2800 Pnt 2544 3747 Pnt 2185 3755 Pnt 2893 3770 Pnt 3165 3735 Pnt 3638 3765 Pnt 2646 3751 Pnt 2381 2268 Pnt 4037 3748 Pnt 2690 3745 Pnt 2800 3781 Pnt 2086 3772 Pnt 2747 3748 Pnt 3082 3745 Pnt 2794 3754 Pnt 2715 3742 Pnt 2468 3747 Pnt 2843 3752 Pnt 2403 3743 Pnt 2941 3753 Pnt 2153 3749 Pnt 2721 3746 Pnt 2662 3741 Pnt 3495 2884 Pnt 2542 3742 Pnt 2946 3741 Pnt 2504 3745 Pnt 3168 3758 Pnt 2717 3746 Pnt 2448 3752 Pnt 2706 3739 Pnt 2635 3816 Pnt 2780 3738 Pnt 2645 3750 Pnt 3552 2726 Pnt 2666 3742 Pnt 3311 3746 Pnt 3005 3756 Pnt 2820 3735 Pnt 2911 3751 Pnt 3090 3746 Pnt 2887 3741 Pnt 2722 3752 Pnt 2817 3812 Pnt 2176 3784 Pnt 2425 3762 Pnt 2464 3753 Pnt 2423 3825 Pnt 3106 3762 Pnt 3225 3790 Pnt 2557 3740 Pnt 3662 3769 Pnt 3379 3785 Pnt 2673 3742 Pnt 2340 3744 Pnt 2682 3744 Pnt 2746 3738 Pnt 2587 3754 Pnt 3151 2692 Pnt 2601 3740 Pnt 3203 3741 Pnt 3585 3777 Pnt 2549 3748 Pnt 2769 3741 Pnt 1743 3797 Pnt 3051 3755 Pnt 2676 2772 Pnt 2899 3740 Pnt 2490 3761 Pnt 3489 3748 Pnt 2653 3745 Pnt 3240 2573 Pnt 2747 3758 Pnt 3015 3739 Pnt 2573 3749 Pnt 2441 3740 Pnt 2561 3738 Pnt 3413 3735 Pnt 2376 3769 Pnt 2932 3738 Pnt 2192 3765 Pnt 2421 3732 Pnt 3110 3740 Pnt 2372 3799 Pnt 3115 3738 Pnt 2723 3749 Pnt 2466 3743 Pnt 3150 3745 Pnt 2881 3749 Pnt 2481 3846 Pnt 2698 3743 Pnt 2264 3795 Pnt 2103 3751 Pnt 2587 3739 Pnt 2079 3911 Pnt 2944 3747 Pnt 1929 3771 Pnt 2846 3753 Pnt 2550 3768 Pnt 2343 3747 Pnt 2890 3736 Pnt 2555 3748 Pnt 2301 3775 Pnt 2179 3747 Pnt 3316 3748 Pnt 2334 3749 Pnt 3562 2791 Pnt 2963 3746 Pnt 2895 3801 Pnt 2319 3824 Pnt 2534 3747 Pnt 2614 3739 Pnt 2110 3764 Pnt 2305 3761 Pnt 2848 3738 Pnt 3699 3747 Pnt 2999 3760 Pnt 2860 3756 Pnt 3291 3748 Pnt 2086 3796 Pnt 2740 3745 Pnt 3118 3743 Pnt 2668 3749 Pnt 3105 3748 Pnt 3167 3746 Pnt 2381 3742 Pnt 2834 3743 Pnt 2428 3748 Pnt 3047 3739 Pnt 2613 3754 Pnt 2814 3744 Pnt 2591 3766 Pnt 3321 3739 Pnt 2282 3773 Pnt 2996 3743 Pnt 3386 3770 Pnt 2453 3749 Pnt 3438 3747 Pnt 2664 3737 Pnt 3022 3777 Pnt 3231 3751 Pnt 2693 3742 Pnt 2819 3743 Pnt 3119 3743 Pnt 2194 3747 Pnt 3326 3751 Pnt 2898 3774 Pnt 3497 3743 Pnt 2141 3791 Pnt 2984 3774 Pnt 2575 3741 Pnt 2300 3735 Pnt 3039 3746 Pnt 2532 3809 Pnt 2554 3750 Pnt 2674 3737 Pnt 3174 3742 Pnt 3352 3735 Pnt 2698 3747 Pnt 2386 3804 Pnt 3278 3740 Pnt 2558 3750 Pnt 2411 3762 Pnt 2122 3791 Pnt 2405 3804 Pnt 2095 3773 Pnt 4401 3760 Pnt 2825 3741 Pnt 2734 3814 Pnt 3418 3748 Pnt 2248 3818 Pnt 2904 3741 Pnt 2864 3740 Pnt 3179 3749 Pnt 3525 3816 Pnt 2368 3740 Pnt 2846 3748 Pnt 2618 3805 Pnt 3550 3739 Pnt 2472 3748 Pnt 1998 3756 Pnt 3914 3741 Pnt 2411 3771 Pnt 2810 3738 Pnt 2889 3763 Pnt 2781 3749 Pnt 2628 3735 Pnt 3086 3763 Pnt 2435 3756 Pnt 2274 3793 Pnt 3947 3741 Pnt 2597 3739 Pnt 2506 3747 Pnt 3039 2705 Pnt 2740 3740 Pnt 2722 3780 Pnt 2566 3759 Pnt 2847 3739 Pnt 2855 3743 Pnt 2867 3738 Pnt 2413 3742 Pnt 2945 3783 Pnt 2549 3763 Pnt 2630 3738 Pnt 2632 3751 Pnt 2374 3748 Pnt 2944 3795 Pnt 2380 3816 Pnt 2540 3764 Pnt 3025 3791 Pnt 3072 3741 Pnt 3035 3737 Pnt 3118 3747 Pnt 2814 3746 Pnt 3653 2586 Pnt 2732 3743 Pnt 2945 3743 Pnt 3184 3743 Pnt 2640 3750 Pnt 2284 3762 Pnt 3156 3749 Pnt 2845 3749 Pnt 2659 3775 Pnt 2531 3749 Pnt 2994 2750 Pnt 2929 3755 Pnt 2605 3749 Pnt 2638 3767 Pnt 2637 3767 Pnt 2508 3756 Pnt 2545 3742 Pnt 2424 3738 Pnt 2226 3792 Pnt 2472 3737 Pnt 3099 3763 Pnt 2760 3743 Pnt 2796 3776 Pnt 2754 3745 Pnt 3234 3737 Pnt 2640 3764 Pnt 2333 3744 Pnt 2676 3738 Pnt 3341 3745 Pnt 2517 3830 Pnt 3144 3738 Pnt 3446 3744 Pnt 2482 3748 Pnt 2595 3744 Pnt 2174 3745 Pnt 2466 3760 Pnt 3008 3760 Pnt 2119 3781 Pnt 3483 2544 Pnt 3715 2725 Pnt 4131 3744 Pnt 3055 3781 Pnt 2200 3806 Pnt 3145 2670 Pnt 3015 3770 Pnt 3175 3749 Pnt 2818 2682 Pnt 2742 3791 Pnt 2472 3744 Pnt 3014 3739 Pnt 2571 3760 Pnt 3585 3791 Pnt 2625 3747 Pnt 3509 3739 Pnt 3058 3739 Pnt 3029 3755 Pnt 2051 3810 Pnt 3157 3751 Pnt 2189 3745 Pnt 3206 3743 Pnt 2989 3744 Pnt 2655 3755 Pnt 2899 2702 Pnt 3088 3743 Pnt 2579 3811 Pnt 3071 3745 Pnt 2619 3753 Pnt 2664 3816 Pnt 2744 3809 Pnt 3392 3740 Pnt 2883 3743 Pnt 3074 3816 Pnt 3267 3749 Pnt 2784 3764 Pnt 2939 3774 Pnt 3703 2565 Pnt 2946 3754 Pnt 2407 3786 Pnt 2621 3770 Pnt 2468 3744 Pnt 2944 3744 Pnt 2819 3748 Pnt 2435 3749 Pnt 3650 3786 Pnt 2851 3740 Pnt 2657 3746 Pnt 2221 3746 Pnt 2336 3815 Pnt 2783 3745 Pnt 2560 3766 Pnt 2947 3746 Pnt 2825 3745 Pnt 2510 3743 Pnt 2349 3744 Pnt 2933 3740 Pnt 2990 3754 Pnt 2729 3788 Pnt 2749 3745 Pnt 3125 3751 Pnt 2763 3745 Pnt 3485 3740 Pnt 2679 3738 Pnt 2501 3740 Pnt 2855 3788 Pnt 2738 3753 Pnt 3833 3761 Pnt 2592 3749 Pnt 3649 2736 Pnt 2583 3745 Pnt 2994 3756 Pnt 2071 3784 Pnt 2347 3767 Pnt 2645 3750 Pnt 2944 3743 Pnt 3290 3786 Pnt 2715 3750 Pnt 2605 3739 Pnt 3215 3798 Pnt 2817 2494 Pnt 3019 3743 Pnt 2713 3743 Pnt 3157 3815 Pnt 2745 3750 Pnt 2790 3803 Pnt 3056 3748 Pnt 3056 3745 Pnt 2855 3754 Pnt 2698 3744 Pnt 2430 3792 Pnt 2860 3748 Pnt 2706 3743 Pnt 2276 3855 Pnt 3123 3743 Pnt 2471 3759 Pnt 2741 3777 Pnt 2788 3748 Pnt 2387 3783 Pnt 2913 3742 Pnt 2449 3739 Pnt 2480 3741 Pnt 2566 3740 Pnt 2645 3737 Pnt 3174 3747 Pnt 2696 3744 Pnt 2832 3744 Pnt 3276 3740 Pnt 2787 3751 Pnt 2285 3900 Pnt 3003 3751 Pnt 2920 3744 Pnt 2617 3769 Pnt 2591 3762 Pnt 2830 3790 Pnt 3850 3772 Pnt 2711 3757 Pnt 2738 3744 Pnt 3415 3765 Pnt 3959 3746 Pnt 2121 3756 Pnt 2703 3744 Pnt 2787 3749 Pnt 2844 3744 Pnt 2945 3744 Pnt 3907 3755 Pnt 3303 3744 Pnt 3102 3742 Pnt 3300 3739 Pnt 2513 3767 Pnt 3840 3745 Pnt 2761 3755 Pnt 3470 3748 Pnt 2836 3761 Pnt 3455 3748 Pnt 3414 3747 Pnt 2911 3743 Pnt 2783 3741 Pnt 2586 3739 Pnt 3438 3744 Pnt 2778 3751 Pnt 2693 3745 Pnt 2483 3738 Pnt 2173 3738 Pnt 2520 3744 Pnt 2465 3744 Pnt 2463 3736 Pnt 2814 3734 Pnt 2601 3733 Pnt 3875 3736 Pnt 2955 3744 Pnt 3673 3744 Pnt 2235 3748 Pnt 2731 3747 Pnt 2414 3802 Pnt 3283 3752 Pnt 2736 3748 Pnt 2445 3761 Pnt 3037 3749 Pnt 2651 3742 Pnt 2399 3759 Pnt 2409 3745 Pnt 2894 3755 Pnt 2710 3775 Pnt 2559 3741 Pnt 3050 3744 Pnt 2452 3737 Pnt 2878 3736 Pnt 2264 3775 Pnt 2804 3742 Pnt 3298 3744 Pnt 3571 3736 Pnt 3373 3752 Pnt 3277 3753 Pnt 3728 3752 Pnt 3043 3738 Pnt 3924 3745 Pnt 2716 3756 Pnt 2532 3752 Pnt 2902 3742 Pnt 2618 3758 Pnt 2658 3774 Pnt 2706 3737 Pnt 3050 3749 Pnt 2471 3755 Pnt 3366 3770 Pnt 3060 3746 Pnt 2496 3746 Pnt 3182 3746 Pnt 3171 3737 Pnt 2571 3759 Pnt 4192 3861 Pnt 2721 3749 Pnt 3563 3748 Pnt 2572 3810 Pnt 2507 3741 Pnt 1975 3818 Pnt 2678 3749 Pnt 2579 3737 Pnt 3089 3754 Pnt 2660 3760 Pnt 2976 3768 Pnt 2291 3742 Pnt 3043 3741 Pnt 2387 3768 Pnt 2920 3746 Pnt 2566 3747 Pnt 3976 3758 Pnt 4083 3740 Pnt 3043 3739 Pnt 2544 3740 Pnt 2943 3745 Pnt 2906 3739 Pnt 2658 3742 Pnt 2667 3815 Pnt 2074 3743 Pnt 3211 3746 Pnt 2528 3774 Pnt 3609 3739 Pnt 3189 3746 Pnt 3262 3739 Pnt 2949 3746 Pnt 2872 3772 Pnt 2780 3778 Pnt 2974 3747 Pnt 3601 3749 Pnt 2595 3736 Pnt 2894 3739 Pnt 2278 3943 Pnt 3108 3740 Pnt 3474 3746 Pnt 2832 3741 Pnt 2605 3755 Pnt 3760 3744 Pnt 2261 3757 Pnt 2224 3796 Pnt 3396 2527 Pnt 2387 3762 Pnt 2804 3746 Pnt 2533 3772 Pnt 3501 3740 Pnt 2266 3799 Pnt 3696 3772 Pnt 3032 3742 Pnt 2146 3799 Pnt 3449 3746 Pnt 2935 3749 Pnt 2782 3759 Pnt 3193 3739 Pnt 3107 3742 Pnt 2740 3749 Pnt 2670 3761 Pnt 2610 3741 Pnt 2785 3745 Pnt 2657 3757 Pnt 2171 3753 Pnt 3182 3759 Pnt 2881 3757 Pnt 4024 3744 Pnt 2737 3749 Pnt 3615 3759 Pnt 2240 3761 Pnt 2744 3743 Pnt 2528 3768 Pnt 3123 3743 Pnt 2402 3754 Pnt 3393 3748 Pnt 2524 3759 Pnt 2457 3737 Pnt 2927 3744 Pnt 2642 3751 Pnt 2546 2615 Pnt 3166 3743 Pnt 2789 3780 Pnt 3097 3743 Pnt 2783 3739 Pnt 2643 3744 Pnt 3276 3752 Pnt 2658 3751 Pnt 2502 3828 Pnt 2908 3752 Pnt 2712 3753 Pnt 3155 3733 Pnt 2884 3740 Pnt 2634 3745 Pnt 2576 3762 Pnt 2611 3752 Pnt 2738 3764 Pnt 2703 3745 Pnt 2781 3746 Pnt 3050 3741 Pnt 2751 3760 Pnt 3076 3764 Pnt 2005 3765 Pnt 2453 3805 Pnt 2562 3753 Pnt 2409 3743 Pnt 2382 3735 Pnt 3135 3755 Pnt 2692 3750 Pnt 2377 3817 Pnt 2895 3749 Pnt 3115 3764 Pnt 2027 3891 Pnt 2566 3750 Pnt 3120 3748 Pnt 2553 3741 Pnt 3404 3748 Pnt 2677 3822 Pnt 3267 3745 Pnt 3543 2905 Pnt 2695 3754 Pnt 3405 3743 Pnt 2266 3749 Pnt 3048 3743 Pnt 2586 3822 Pnt 2456 3803 Pnt 2476 3825 Pnt 2904 3750 Pnt 2634 3754 Pnt 2600 3787 Pnt 2264 3778 Pnt 3197 3750 Pnt 2026 3814 Pnt 2327 3755 Pnt 3350 3758 Pnt 2491 3747 Pnt 2464 3814 Pnt 2644 3738 Pnt 2812 3744 Pnt 2557 3837 Pnt 2557 3741 Pnt 3283 3740 Pnt 2648 3744 Pnt 3452 3744 Pnt 3426 3744 Pnt 3770 2569 Pnt 2923 3745 Pnt 2284 3786 Pnt 2446 3738 Pnt 2335 3787 Pnt 3184 3745 Pnt 3446 3742 Pnt 2591 3767 Pnt 3126 3739 Pnt 3121 3784 Pnt 2542 3743 Pnt 2718 3748 Pnt 2990 3738 Pnt 3694 2798 Pnt 2749 3757 Pnt 3133 3744 Pnt 2139 3778 Pnt 3110 3744 Pnt 3151 3747 Pnt 2738 3763 Pnt 2787 2677 Pnt 3231 3737 Pnt 3090 3780 Pnt 2641 3748 Pnt 3182 3780 Pnt 3947 3768 Pnt 2228 3773 Pnt 3049 3742 Pnt 2154 3788 Pnt 2567 3836 Pnt 3411 3777 Pnt 2712 3755 Pnt 2997 3752 Pnt 2425 3782 Pnt 2116 3824 Pnt 3028 3752 Pnt 3655 3785 Pnt 2222 3746 Pnt 3125 3739 Pnt 3900 3739 Pnt 2611 3761 Pnt 2559 3753 Pnt 3255 3740 Pnt 1896 3741 Pnt 3110 3746 Pnt 2576 3761 Pnt 2703 3745 Pnt 2342 3744 Pnt 2754 3749 Pnt 2917 3774 Pnt 3003 3764 Pnt 2894 3758 Pnt 2144 3834 Pnt 2668 3767 Pnt 2723 3739 Pnt 1970 3810 Pnt 2002 3767 Pnt 2494 2586 Pnt 3371 3754 Pnt 2767 3747 Pnt 2925 3746 Pnt 2157 3753 Pnt 2877 3743 Pnt 2113 3852 Pnt 2259 3745 Pnt 2316 3829 Pnt 3301 3753 Pnt 2797 3740 Pnt 2225 3760 Pnt 3933 3752 Pnt 2442 3755 Pnt 3196 3744 Pnt 3055 3768 Pnt 2168 3739 Pnt 2906 3748 Pnt 2925 3746 Pnt 3012 3787 Pnt 2573 3744 Pnt 2485 3745 Pnt 2606 3804 Pnt 3993 3743 Pnt 2790 3746 Pnt 2691 3747 Pnt 2705 3747 Pnt 2538 3804 Pnt 2936 3743 Pnt 3262 3746 Pnt 3051 3746 Pnt 2770 3736 Pnt 2766 3750 Pnt 2753 3750 Pnt 3110 3745 Pnt 3049 3746 Pnt 2792 3739 Pnt 3832 3768 Pnt 2645 3772 Pnt 2686 3739 Pnt 3302 3759 Pnt 2384 3766 Pnt 3282 3755 Pnt 2848 3747 Pnt 2958 3757 Pnt 3274 3751 Pnt 3319 3766 Pnt 2874 3740 Pnt 2309 3755 Pnt 3458 3744 Pnt 2401 3768 Pnt 2779 3745 Pnt 2603 3746 Pnt 2906 3763 Pnt 2522 3777 Pnt 3565 3738 Pnt 3503 2493 Pnt 2898 3741 Pnt 3397 3747 Pnt 2867 2765 Pnt 2800 3762 Pnt 3337 3747 Pnt 2717 3744 Pnt 2300 3739 Pnt 2750 3762 Pnt 2473 3753 Pnt 2593 3741 Pnt 2151 3807 Pnt 2914 3742 Pnt 2611 3748 Pnt 3972 3744 Pnt 2156 3754 Pnt 2404 3761 Pnt 2203 3757 Pnt 2431 3814 Pnt 2867 3747 Pnt 2675 3801 Pnt 2236 3743 Pnt 2823 3742 Pnt 2825 3732 Pnt 2024 3788 Pnt 3190 3744 Pnt 1932 3934 Pnt 2670 3746 Pnt 2075 3927 Pnt 2679 3767 Pnt 2627 3749 Pnt 2580 3751 Pnt 3578 3756 Pnt 2983 3740 Pnt 2515 3743 Pnt 2978 3741 Pnt 2719 3756 Pnt 2680 3747 Pnt 3043 3757 Pnt 3005 3741 Pnt 2826 3735 Pnt 2664 3764 Pnt 2398 3750 Pnt 3123 3743 Pnt 2302 3752 Pnt 3156 3743 Pnt 2977 3739 Pnt 3222 3746 Pnt 2705 3752 Pnt 3627 3751 Pnt 2988 3738 Pnt 2658 3775 Pnt 2358 3804 Pnt 2940 3738 Pnt 2763 3773 Pnt 3226 3745 Pnt 2759 3752 Pnt 3253 3749 Pnt 2895 3751 Pnt 3530 3738 Pnt 3830 3754 Pnt 2587 3763 Pnt 2109 3805 Pnt 3235 3757 Pnt 2334 3760 Pnt 2928 3812 Pnt 2896 3765 Pnt 3445 3765 Pnt 2647 3740 Pnt 2579 3761 Pnt 3344 3757 Pnt 2692 3761 Pnt 3061 3737 Pnt 3667 3757 Pnt 2953 3750 Pnt 2415 3762 Pnt 2236 3736 Pnt 3066 2682 Pnt 1917 3775 Pnt 2884 3742 Pnt 3066 3737 Pnt 2714 3743 Pnt 2984 3738 Pnt 2384 3747 Pnt 2971 3741 Pnt 2733 3775 Pnt 2779 3741 Pnt 3356 3737 Pnt 2911 3750 Pnt 2589 3755 Pnt 3163 3737 Pnt 2309 3742 Pnt 2053 3779 Pnt 2916 3736 Pnt 2727 3762 Pnt 2666 3762 Pnt 3040 3742 Pnt 2650 3763 Pnt 2248 3770 Pnt 2391 3740 Pnt 3003 3743 Pnt 2892 3749 Pnt 3225 3740 Pnt 2701 3745 Pnt 2328 3756 Pnt 3372 3749 Pnt 2517 3754 Pnt 2217 3742 Pnt 2713 3743 Pnt 3353 3752 Pnt 3160 3741 Pnt 2657 3746 Pnt 3208 3752 Pnt 2542 3738 Pnt 3091 3749 Pnt 2720 3743 Pnt 4041 3758 Pnt 2890 3741 Pnt 2648 3784 Pnt 2562 3756 Pnt 2338 3814 Pnt 3003 3784 Pnt 2852 3738 Pnt 2112 3825 Pnt 2660 3750 Pnt 3908 3745 Pnt 2792 3812 Pnt 2637 3753 Pnt 2539 3748 Pnt 2978 3750 Pnt 2302 3768 Pnt 2404 3817 Pnt 3012 3744 Pnt 3114 3753 Pnt 2281 3765 Pnt 2938 3750 Pnt 2916 3747 Pnt 3119 3753 Pnt 2756 3750 Pnt 3319 3754 Pnt 2507 3762 Pnt 2178 3749 Pnt 2424 3814 Pnt 3355 3780 Pnt 2890 3741 Pnt 3995 3750 Pnt 2478 3774 Pnt 3763 3749 Pnt 2665 3757 Pnt 2478 3758 Pnt 3139 3752 Pnt 2652 3768 Pnt 2053 3761 Pnt 3122 3749 Pnt 3090 3755 Pnt 2571 3784 Pnt 3249 3761 Pnt 3049 3765 Pnt 2600 3809 Pnt 2830 3736 Pnt 2116 3749 Pnt 2775 3739 Pnt 3467 3820 Pnt 1975 3808 Pnt 3394 3755 Pnt 2433 3765 Pnt 2781 3776 Pnt 3570 3747 Pnt 2692 3752 Pnt 3478 3793 Pnt 3067 3735 Pnt 2195 3779 Pnt 2780 3741 Pnt 2473 3752 Pnt 2464 3820 Pnt 2507 3776 Pnt 2205 3797 Pnt 2010 3732 Pnt 2548 3763 Pnt 2716 3747 Pnt 3169 3742 Pnt 3397 3876 Pnt 2282 3758 Pnt 3055 3763 Pnt 3603 3777 Pnt 3080 3745 Pnt 2948 3741 Pnt 2666 3746 Pnt 2952 3763 Pnt 3116 3743 Pnt 2305 3802 Pnt 2957 3739 Pnt 3825 3743 Pnt 2543 3748 Pnt 2425 3749 Pnt 2447 3747 Pnt 2409 3744 Pnt 3767 3792 Pnt 2669 3746 Pnt 2660 3738 Pnt 3180 3748 Pnt 2851 3753 Pnt 2499 3739 Pnt 2875 3742 Pnt 2400 3754 Pnt 3385 3746 Pnt 3023 3744 Pnt 2859 3743 Pnt 2269 3744 Pnt 2646 3754 Pnt 2395 3751 Pnt 3330 3757 Pnt 2697 3741 Pnt 2231 3780 Pnt 2223 3788 Pnt 2112 3820 Pnt 2757 3762 Pnt 2305 3901 Pnt 4244 2737 Pnt 2869 3752 Pnt 3829 3750 Pnt 2946 3749 Pnt 2488 3757 Pnt 2151 3787 Pnt 2896 3748 Pnt 3245 3738 Pnt 3589 3743 Pnt 2627 3745 Pnt 2826 3755 Pnt 3385 3744 Pnt 2913 3737 Pnt 2682 3759 Pnt 2617 3744 Pnt 2381 3747 Pnt 3153 3750 Pnt 2317 3800 Pnt 3064 3749 Pnt 2835 3744 Pnt 2535 3735 Pnt 3249 3753 Pnt 2890 3740 Pnt 3019 3746 Pnt 2944 2682 Pnt 2961 3740 Pnt 2913 3746 Pnt 2780 3739 Pnt 2554 3746 Pnt 1953 3923 Pnt 2661 3744 Pnt 2952 3776 Pnt 2639 3791 Pnt 2336 3745 Pnt 3455 2576 Pnt 2375 3737 Pnt 2927 3754 Pnt 3391 3752 Pnt 2438 3744 Pnt 2491 3839 Pnt 2619 3747 Pnt 2236 3746 Pnt 2783 3753 Pnt 3549 2463 Pnt 2626 3740 Pnt 2925 3747 Pnt 3243 3747 Pnt 2566 3744 Pnt 3264 3839 Pnt 3206 3747 Pnt 2412 3741 Pnt 3055 3742 Pnt 2295 3813 Pnt 2642 3746 Pnt 2317 3750 Pnt 3017 3766 Pnt 2479 3749 Pnt 3101 3742 Pnt 2308 3824 Pnt 2856 3742 Pnt 3307 3750 Pnt 2434 3783 Pnt 2945 3739 Pnt 2883 3740 Pnt 2775 3781 Pnt 2766 3778 Pnt 2752 3742 Pnt 3035 3740 Pnt 2896 3743 Pnt 2119 3784 Pnt 3292 3740 Pnt 2988 3755 Pnt 2336 3740 Pnt 3001 3787 Pnt 2891 3810 Pnt 2775 3740 Pnt 3131 3755 Pnt 3532 3740 Pnt 2950 3760 Pnt 2845 3749 Pnt 2462 3758 Pnt 2878 3750 Pnt 2710 2542 Pnt 2681 3758 Pnt 2811 3758 Pnt 2681 3753 Pnt 2311 3739 Pnt 3598 2787 Pnt 2572 3742 Pnt 2405 3747 Pnt 3004 3751 Pnt 2390 3747 Pnt 2188 3758 Pnt 2490 3794 Pnt 3473 2760 Pnt 2507 3747 Pnt 2585 3741 Pnt 2587 3747 Pnt 2363 3798 Pnt 2587 3748 Pnt 2333 3758 Pnt 3664 2533 Pnt 2785 3740 Pnt 2846 3750 Pnt 3124 3749 Pnt 2914 3739 Pnt 2468 3745 Pnt 2226 3739 Pnt 2519 3806 Pnt 3220 3749 Pnt 2704 3743 Pnt 2549 3740 Pnt 2182 3794 Pnt 2289 3738 Pnt 3796 3739 Pnt 2704 3762 Pnt 3743 3749 Pnt 3566 3789 Pnt 3476 3762 Pnt 2634 3745 Pnt 3078 3755 Pnt 2701 3748 Pnt 2523 3742 Pnt 2749 3743 Pnt 3002 3743 Pnt 3402 3752 Pnt 2801 3744 Pnt 2702 3770 Pnt 3799 3749 Pnt 2611 3754 Pnt 3093 3751 Pnt 2249 3735 Pnt 2415 3748 Pnt 3236 3741 Pnt 3632 3739 Pnt 3286 3759 Pnt 3069 3740 Pnt 2067 3785 Pnt 3349 3759 Pnt 3896 2595 Pnt 2759 3742 Pnt 3429 3755 Pnt 2704 3766 Pnt 3263 3754 Pnt 3262 3767 Pnt 2909 3737 Pnt 2460 3783 Pnt 3200 3787 Pnt 3022 3755 Pnt 2747 3749 Pnt 2111 3746 Pnt 2323 3733 Pnt 2625 3772 Pnt 2924 3746 Pnt 2487 3767 Pnt 2606 3753 Pnt 2406 3741 Pnt 2734 3774 Pnt 2420 3757 Pnt 3501 3739 Pnt 2814 3761 Pnt 2852 3742 Pnt 2661 3753 Pnt 3341 3736 Pnt 2914 3746 Pnt 2692 3740 Pnt 2809 3781 Pnt 3093 3747 Pnt 3616 2745 Pnt 2953 3743 Pnt 2733 3743 Pnt 2320 3782 Pnt 3429 3751 Pnt 2839 3743 Pnt 2730 3740 Pnt 3228 3753 Pnt 2441 3745 Pnt 2747 3747 Pnt 2274 3831 Pnt 3017 3753 Pnt 2557 3758 Pnt 1927 3756 Pnt 3689 3831 Pnt 2660 3746 Pnt 2855 3758 Pnt 2828 3747 Pnt 3142 3751 Pnt 2808 3747 Pnt 2512 3747 Pnt 2465 3824 Pnt 2755 3754 Pnt 2852 3744 Pnt 2705 3824 Pnt 2820 3752 Pnt 3712 3744 Pnt 2373 2618 Pnt 2526 3757 Pnt 3198 3747 Pnt 2568 3752 Pnt 2556 3734 Pnt 2535 3739 Pnt 2088 3774 Pnt 2454 3808 Pnt 3522 3746 Pnt 3032 3740 Pnt 2716 3743 Pnt 3104 1784 Pnt 2940 3746 Pnt 2592 3797 Pnt 3605 3808 Pnt 2670 3800 Pnt 3151 3746 Pnt 2290 3745 Pnt 3325 3752 Pnt 2839 3743 Pnt 3697 3800 Pnt 3163 3751 Pnt 2528 3741 Pnt 2391 3760 Pnt 3300 2779 Pnt 3565 3745 Pnt 2646 3751 Pnt 3020 3744 Pnt 3452 3744 Pnt 3622 3754 Pnt 2648 3768 Pnt 2625 3738 Pnt 2864 2631 Pnt 2633 3768 Pnt 2807 3745 Pnt 3679 3738 Pnt 3441 3744 Pnt 2029 3741 Pnt 2006 3828 Pnt 3063 3739 Pnt 2657 3760 Pnt 2367 3744 Pnt 3480 3736 Pnt 2585 3806 Pnt 3259 3744 Pnt 3041 3733 Pnt 2669 3821 Pnt 3505 3737 Pnt 2398 3750 Pnt 3448 2681 Pnt 3169 3750 Pnt 3440 3819 Pnt 3087 3745 Pnt 2726 3748 Pnt 2853 3743 Pnt 3244 3756 Pnt 2738 3750 Pnt 2382 3762 Pnt 2367 3742 Pnt 3465 3745 Pnt 2256 3792 Pnt 3039 3792 Pnt 2853 3742 Pnt 2848 3757 Pnt 2635 3746 Pnt 2961 3744 Pnt 2677 3816 Pnt 2036 3800 Pnt 3086 3748 Pnt 2526 3740 Pnt 2954 3800 Pnt 2660 3744 Pnt 3600 3750 Pnt 2931 3749 Pnt 3218 3742 Pnt 2496 3747 Pnt 3049 3750 Pnt 2567 3782 Pnt 2403 3768 Pnt 3090 3747 Pnt 2587 3747 Pnt 2115 3772 Pnt 2116 3758 Pnt 4177 2858 Pnt 3241 3758 Pnt 2797 3745 Pnt 2073 3778 Pnt 2744 3739 Pnt 2413 3740 Pnt 1980 3756 Pnt 3604 3746 Pnt 2359 3803 Pnt 2305 3758 Pnt 2643 3742 Pnt 3383 3741 Pnt 2984 3736 Pnt 2678 3794 Pnt 3025 3803 Pnt 3323 3740 Pnt 2592 3747 Pnt 3146 3742 Pnt 1966 3738 Pnt 2666 3811 Pnt 3412 3736 Pnt 3173 3745 Pnt 3627 2747 Pnt 2991 3744 Pnt 3320 3754 Pnt 2711 3753 Pnt 3056 3754 Pnt 2868 3741 Pnt 3859 3749 Pnt 2944 3741 Pnt 2579 3758 Pnt 2532 3750 Pnt 3260 3748 Pnt 2987 3758 Pnt 2657 3738 Pnt 3081 3741 Pnt 3404 3763 Pnt 2503 3761 Pnt 2464 3747 Pnt 2193 3791 Pnt 3068 2710 Pnt 2492 3744 Pnt 2080 3780 Pnt 2949 3746 Pnt 3225 3742 Pnt 2535 3761 Pnt 3191 3780 Pnt 3160 3742 Pnt 3056 3746 Pnt 2889 3735 Pnt 2708 3806 Pnt 2400 3733 Pnt 3320 3735 Pnt 3298 3746 Pnt 2821 3748 Pnt 2634 3738 Pnt 2686 3828 Pnt 3410 3781 Pnt 2485 3782 Pnt 2976 3748 Pnt 2392 3739 Pnt 2668 3766 Pnt 2816 3748 Pnt 3110 3742 Pnt 2677 3765 Pnt 3293 3829 Pnt 2117 3819 Pnt 2945 3817 Pnt 3273 2766 Pnt 2977 3751 Pnt 2545 3741 Pnt 2423 3779 Pnt 3104 3812 Pnt 2820 3762 Pnt 2644 3741 Pnt 4075 3779 Pnt 2577 2920 Pnt 2560 3734 Pnt 2331 3756 Pnt 3895 3752 Pnt 3606 3754 Pnt 2621 3765 Pnt 2935 3739 Pnt 2671 3813 Pnt 2530 3758 Pnt 2690 3754 Pnt 2435 3761 Pnt 2533 3752 Pnt 2817 3747 Pnt 3092 3750 Pnt 2813 3783 Pnt 3097 3747 Pnt 2556 3766 Pnt 3222 3745 Pnt 3231 3739 Pnt 3059 3741 Pnt 2580 3742 Pnt 2599 3743 Pnt 4073 3750 Pnt 2405 3796 Pnt 3339 2607 Pnt 2711 3794 Pnt 2179 3799 Pnt 2729 3745 Pnt 2685 3754 Pnt 2521 3749 Pnt 2427 3742 Pnt 2574 3765 Pnt 3081 3753 Pnt 3073 3743 Pnt 3717 3739 Pnt 3130 3749 Pnt 2465 3743 Pnt 2462 3792 Pnt 2937 3748 Pnt 3297 3743 Pnt 2415 3808 Pnt 2760 3743 Pnt 2800 3738 Pnt 2320 3841 Pnt 2957 3758 Pnt 2878 3747 Pnt 2673 3731 Pnt 2982 3738 Pnt 2417 3773 Pnt 3912 3742 Pnt 3101 3745 Pnt 2865 2637 Pnt 2751 3748 Pnt 2779 3747 Pnt 3109 3749 Pnt 2472 3740 Pnt 2980 3737 Pnt 2492 3738 Pnt 2363 3769 Pnt 2645 3774 Pnt 3658 2799 Pnt 3119 3740 Pnt 2963 3740 Pnt 2299 3799 Pnt 3002 3750 Pnt 3392 3754 Pnt 2966 3746 Pnt 2266 3741 Pnt 2588 3750 Pnt 3229 3752 Pnt 2320 3766 Pnt 3219 3745 Pnt 1969 3784 Pnt 3080 3739 Pnt 3134 3746 Pnt 2631 3752 Pnt 2395 3736 Pnt 2557 3758 Pnt 2635 3737 Pnt 2584 3734 Pnt 2559 3764 Pnt 2791 3761 Pnt 2181 3788 Pnt 2464 3747 Pnt 2484 3742 Pnt 3181 3756 Pnt 2677 3749 Pnt 2569 3741 Pnt 3227 3750 Pnt 2636 3745 Pnt 2294 3749 Pnt 2695 2782 Pnt 2791 3747 Pnt 2497 3825 Pnt 2288 3757 Pnt 2682 3744 Pnt 2743 3747 Pnt 2599 2643 Pnt 2104 3749 Pnt 3155 2549 Pnt 3075 3741 Pnt 3016 3736 Pnt 2145 3738 Pnt 3526 3757 Pnt 3346 3746 Pnt 2193 3911 Pnt 1787 3773 Pnt 3121 3755 Pnt 2927 3743 Pnt 2496 3747 Pnt 3691 3747 Pnt 2558 3741 Pnt 3250 3747 Pnt 2496 2553 Pnt 2394 3798 Pnt 3588 3747 Pnt 2974 3739 Pnt 2789 3746 Pnt 2494 3770 Pnt 3056 3805 Pnt 2397 3749 Pnt 2123 3746 Pnt 2101 3747 Pnt 2763 3757 Pnt 3336 3764 Pnt 2528 3740 Pnt 3962 3746 Pnt 3171 3743 Pnt 2469 3801 Pnt 2857 3741 Pnt 2992 3759 Pnt 3193 3768 Pnt 3118 3748 Pnt 3047 3751 Pnt 3158 3747 Pnt 2894 3792 Pnt 2611 3741 Pnt 2864 3794 Pnt 2485 3742 Pnt 3232 3743 Pnt 4033 3792 Pnt 2768 3762 Pnt 2890 3769 Pnt 2434 3738 Pnt 3051 3754 Pnt 2339 3754 Pnt 2934 3743 Pnt 2375 3771 Pnt 2312 3843 Pnt 3005 3764 Pnt 1896 3788 Pnt 2610 3750 Pnt 2505 3791 Pnt 2664 3735 Pnt 3205 3750 Pnt 2595 3872 Pnt 3142 3738 Pnt 2588 3804 Pnt 2553 3746 Pnt 3250 3804 Pnt 2278 3750 Pnt 2747 3779 Pnt 2371 3839 Pnt 2419 3764 Pnt 2632 3762 Pnt 2576 3774 Pnt 2068 3762 Pnt 2825 3737 Pnt 2471 3744 Pnt 2245 3792 Pnt 2452 3735 Pnt 3142 3737 Pnt 2703 3738 Pnt 2691 3741 Pnt 2171 3816 Pnt 2461 3849 Pnt 2817 3757 Pnt 2602 3798 Pnt 3021 3750 Pnt 2858 3749 Pnt 2731 3818 Pnt 3310 3741 Pnt 2829 3743 Pnt 2695 3754 Pnt 2207 3796 Pnt 3293 3748 Pnt 2903 3735 Pnt 3065 3796 Pnt 2794 3738 Pnt 2851 3763 Pnt 2603 3742 Pnt 2730 3759 Pnt 2665 3744 Pnt 3029 3740 Pnt 2791 3745 Pnt 3396 3783 Pnt 3056 3744 Pnt 3052 3740 Pnt 3842 3745 Pnt 2864 3783 Pnt 3040 3741 Pnt 3533 3746 Pnt 2597 3786 Pnt 3235 3740 Pnt 2739 3759 Pnt 2751 3741 Pnt 2209 3762 Pnt 2898 3746 Pnt 2398 3768 Pnt 3033 3743 Pnt 2182 3798 Pnt 2836 3749 Pnt 2838 3778 Pnt 2729 3738 Pnt 2282 3807 Pnt 2534 3778 Pnt 3197 3763 Pnt 2821 3735 Pnt 2676 3827 Pnt 2752 3750 Pnt 2873 3737 Pnt 2475 3750 Pnt 3020 3737 Pnt 3878 3749 Pnt 2689 3766 Pnt 2192 3764 Pnt 2768 3747 Pnt 2408 3776 Pnt 2557 3749 Pnt 2507 3738 Pnt 3524 2914 Pnt 3043 3744 Pnt 2687 3753 Pnt 2575 3847 Pnt 2808 3751 Pnt 2992 3751 Pnt 2710 3748 Pnt 3224 3738 Pnt 3141 3755 Pnt 3019 3801 Pnt 2492 3745 Pnt 3385 3748 Pnt 2343 3767 Pnt 2979 3739 Pnt 2890 3745 Pnt 3528 3745 Pnt 3108 3760 Pnt 3036 3758 Pnt 2895 3749 Pnt 3362 3745 Pnt 2571 3781 Pnt 3034 3739 Pnt 2998 3739 Pnt 2991 3741 Pnt 3408 3777 Pnt 2420 3814 Pnt 3430 3748 Pnt 2891 3743 Pnt 2475 3747 Pnt 2548 3763 Pnt 2741 3746 Pnt 3311 3763 Pnt 2965 3745 Pnt 3046 3744 Pnt 2475 3744 Pnt 2535 3740 Pnt 2813 3748 Pnt 3142 3742 Pnt 2992 3738 Pnt 2589 3745 Pnt 2231 3746 Pnt 2646 3761 Pnt 2714 3742 Pnt 3581 2828 Pnt 3056 3743 Pnt 2224 3753 Pnt 2480 3737 Pnt 2736 3760 Pnt 2828 2651 Pnt 2731 3919 Pnt 2068 3847 Pnt 2782 3746 Pnt 4115 2789 Pnt 3002 3805 Pnt 2547 3740 Pnt 3213 3847 Pnt 2630 3744 Pnt 3155 3743 Pnt 2472 3746 Pnt 3337 3751 Pnt 2768 3771 Pnt 2011 3794 Pnt 3029 3744 Pnt 2668 3745 Pnt 2118 3788 Pnt 2803 3751 Pnt 3211 3744 Pnt 2860 3803 Pnt 2317 3745 Pnt 2878 3740 Pnt 3076 3740 Pnt 2482 3750 Pnt 2446 3748 Pnt 2614 3744 Pnt 2585 3748 Pnt 2723 3751 Pnt 3267 3798 Pnt 3161 2688 Pnt 2413 3798 Pnt 3216 3752 Pnt 3510 3750 Pnt 2937 3740 Pnt 2210 3813 Pnt 3317 3738 Pnt 2957 3749 Pnt 2627 3754 Pnt 3049 2750 Pnt 2969 3739 Pnt 2556 3739 Pnt 2059 3799 Pnt 3091 3747 Pnt 2915 3744 Pnt 3076 3742 Pnt 2174 3851 Pnt 3415 3763 Pnt 2979 3740 Pnt 3856 2528 Pnt 3081 2564 Pnt 3212 3738 Pnt 2744 3786 Pnt 2252 3771 Pnt 2986 3787 Pnt 3541 3738 Pnt 3068 3740 Pnt 2959 3749 Pnt 2958 3757 Pnt 2755 3751 Pnt 2557 3750 Pnt 2603 3795 Pnt 2189 3795 Pnt 2640 3775 Pnt 3198 3757 Pnt 2789 3744 Pnt 2314 3733 Pnt 3226 3756 Pnt 2932 2671 Pnt 2676 3751 Pnt 3881 3745 Pnt 2686 3743 Pnt 2037 3810 Pnt 2761 3787 Pnt 2876 3755 Pnt 2216 3756 Pnt 2961 3739 Pnt 2610 3744 Pnt 2788 3744 Pnt 2596 3741 Pnt 3315 3775 Pnt 2892 3745 Pnt 2653 3855 Pnt 2796 3751 Pnt 2714 3900 Pnt 2457 3768 Pnt 2495 3743 Pnt 2868 3743 Pnt 2535 3739 Pnt 2106 3784 Pnt 3883 3745 Pnt 2957 3744 Pnt 2563 3744 Pnt 2592 3775 Pnt 3341 3739 Pnt 2860 3748 Pnt 2621 3772 Pnt 3367 3748 Pnt 3382 3775 Pnt 1996 3809 Pnt 3036 3744 Pnt 2685 3741 Pnt 2089 3744 Pnt 2950 3740 Pnt 2898 3742 Pnt 3357 3741 Pnt 2790 3749 Pnt 2683 3739 Pnt 2604 3750 Pnt 2931 3781 Pnt 2101 3806 Pnt 3099 3750 Pnt 2390 3745 Pnt 2673 3737 Pnt 3082 3781 Pnt 2099 3803 Pnt 2357 3748 Pnt 3312 3743 Pnt 2699 3742 Pnt 3006 3738 Pnt 3108 3753 Pnt 2869 3765 Pnt 2767 3744 Pnt 2523 3749 Pnt 2234 3816 Pnt 3053 3742 Pnt 2619 3781 Pnt 3106 3763 Pnt 3450 3744 Pnt 2083 3755 Pnt 2504 3751 Pnt 2728 3739 Pnt 3153 3746 Pnt 2203 3791 Pnt 3550 2611 Pnt 2618 3741 Pnt 3278 2844 Pnt 2404 3791 Pnt 2566 3756 Pnt 3570 3741 Pnt 2174 3751 Pnt 2927 3734 Pnt 2715 3753 Pnt 3691 3742 Pnt 2929 3744 Pnt 3576 3744 Pnt 2590 3808 Pnt 3102 3824 Pnt 3297 3746 Pnt 2691 3799 Pnt 2240 3753 Pnt 3185 3744 Pnt 3305 3824 Pnt 2926 3766 Pnt 2851 2725 Pnt 3318 3772 Pnt 3074 3744 Pnt 2426 3762 Pnt 2687 2755 Pnt 2388 3746 Pnt 2938 3743 Pnt 2783 3748 Pnt 2888 3801 Pnt 2470 3761 Pnt 2317 3750 Pnt 3015 3751 Pnt 3245 3746 Pnt 2765 3758 Pnt 2881 3747 Pnt 2729 3744 Pnt 2404 3780 Pnt 2105 3762 Pnt 2127 3815 Pnt 2927 3751 Pnt 2207 3739 Pnt 4008 2664 Pnt 2249 3790 Pnt 3360 2762 Pnt 3292 3814 Pnt 2664 3744 Pnt 2770 3745 Pnt 2628 3795 Pnt 2623 3746 Pnt 2302 3743 Pnt 3045 3744 Pnt 2567 3740 Pnt 2440 3738 Pnt 3154 3754 Pnt 3043 3737 Pnt 3549 3741 Pnt 2613 3750 Pnt 4222 3758 Pnt 2687 3744 Pnt 2385 3775 Pnt 2894 2825 Pnt 2645 3759 Pnt 3299 3747 Pnt 2960 3741 Pnt 2438 3744 Pnt 3221 3740 Pnt 2289 3809 Pnt 2323 3810 Pnt 2507 3768 Pnt 3419 2595 Pnt 2643 3778 Pnt 2954 3752 Pnt 3080 3767 Pnt 2932 3770 Pnt 2501 3746 Pnt 2548 3744 Pnt 2879 3789 Pnt 2356 3738 Pnt 2495 3736 Pnt 2411 3941 Pnt 3683 3768 Pnt 2768 3789 Pnt 2857 3748 Pnt 3046 3941 Pnt 2867 3752 Pnt 2486 3741 Pnt 2554 3747 Pnt 3279 3748 Pnt 2484 3746 Pnt 2975 3774 Pnt 2706 3748 Pnt 2555 3764 Pnt 2567 3756 Pnt 2647 3739 Pnt 2252 3747 Pnt 2308 3746 Pnt 3132 3751 Pnt 2779 3756 Pnt 2418 3744 Pnt 2459 3815 Pnt 3028 3752 Pnt 2719 3772 Pnt 2929 3770 Pnt 3003 3738 Pnt 3595 3772 Pnt 2983 3770 Pnt 2423 3778 Pnt 2672 3739 Pnt 2377 3796 Pnt 3508 3757 Pnt 2517 3742 Pnt 2916 3830 Pnt 3067 3825 Pnt 3331 3743 Pnt 3213 3745 Pnt 2067 3740 Pnt 2373 3762 Pnt 2179 3744 Pnt 3502 3744 Pnt 4185 3827 Pnt 3352 3772 Pnt 2587 3737 Pnt 2522 3822 Pnt 3563 2846 Pnt 2216 3821 Pnt 3025 3756 Pnt 3271 3740 Pnt 2512 3774 Pnt 3042 3755 Pnt 2641 3817 Pnt 2699 3770 Pnt 2886 3770 Pnt 2626 3755 Pnt 2301 3761 Pnt 3572 3746 Pnt 3028 3806 Pnt 2117 3809 Pnt 3241 2782 Pnt 2400 3745 Pnt 3085 3741 Pnt 2945 3746 Pnt 2094 3753 Pnt 2483 3751 Pnt 1945 3891 Pnt 3445 3738 Pnt 2727 3735 Pnt 4063 3753 Pnt 2642 3793 Pnt 2570 3753 Pnt 3512 3759 Pnt 2882 3741 Pnt 2806 3743 Pnt 3397 3743 Pnt 2353 3764 Pnt 2865 3749 Pnt 2336 3848 Pnt 2918 3777 Pnt 2580 3786 Pnt 3080 3748 Pnt 2959 2736 Pnt 2184 3749 Pnt 3229 3749 Pnt 3321 2602 Pnt 2911 3752 Pnt 2871 3746 Pnt 2177 3754 Pnt 2758 3742 Pnt 2856 3846 Pnt 2600 3762 Pnt 2534 3823 Pnt 2647 3803 Pnt 3937 2775 Pnt 2846 3749 Pnt 3199 3762 Pnt 3022 3749 Pnt 2429 3816 Pnt 2802 3757 Pnt 2239 3754 Pnt 2804 3763 Pnt 1905 3765 Pnt 2652 3757 Pnt 2437 3749 Pnt 2855 3740 Pnt 2615 3758 Pnt 2644 3740 Pnt 3009 3747 Pnt 2626 3749 Pnt 3243 3749 Pnt 2340 3738 Pnt 2527 3742 Pnt 2578 3753 Pnt 3534 3739 Pnt 2813 3743 Pnt 2759 3752 Pnt 2669 3744 Pnt 3577 2812 Pnt 3961 3749 Pnt 2493 3814 Pnt 2886 3743 Pnt 3236 3743 Pnt 2976 3751 Pnt 3602 2955 Pnt 2858 3743 Pnt 2262 3744 Pnt 3462 3745 Pnt 3694 3751 Pnt 2757 3762 Pnt 2197 3747 Pnt 2906 3751 Pnt 3126 3762 Pnt 2636 3757 Pnt 2571 3764 Pnt 3237 3751 Pnt 2830 3745 Pnt 2850 3760 Pnt 2873 3865 Pnt 2816 3740 Pnt 3035 3742 Pnt 3417 3760 Pnt 2802 3743 Pnt 2613 3780 Pnt 2684 3751 Pnt 2613 3752 Pnt 2501 3803 Pnt 3663 3738 Pnt 2958 3758 Pnt 3287 3749 Pnt 2877 3759 Pnt 2766 3740 Pnt 2318 3735 Pnt 2823 3740 Pnt 2872 3752 Pnt 2534 3812 Pnt 2147 3778 Pnt 3110 3740 Pnt 2885 3805 Pnt 2444 3808 Pnt 2896 3808 Pnt 3634 3746 Pnt 2896 3753 Pnt 2996 3755 Pnt 2789 3770 Pnt 3741 3755 Pnt 3448 2683 Pnt 2510 3753 Pnt 2505 3745 Pnt 3423 3755 Pnt 2838 3746 Pnt 2531 3739 Pnt 2876 3739 Pnt 2264 3767 Pnt 3139 3758 Pnt 2623 3738 Pnt 1966 2571 Pnt 3747 3764 Pnt 2680 3748 Pnt 2693 3751 Pnt 2446 3738 Pnt 2738 3743 Pnt 2839 3756 Pnt 1994 3784 Pnt 3070 3744 Pnt 3092 3784 Pnt 3247 3755 Pnt 2315 3817 Pnt 2183 3769 Pnt 4026 3750 Pnt 3418 2801 Pnt 2730 3757 Pnt 2701 3749 Pnt 3457 3744 Pnt 2634 3775 Pnt 2516 3775 Pnt 3262 3763 Pnt 2715 3753 Pnt 2690 3762 Pnt 3187 3744 Pnt 2521 3825 Pnt 3016 3778 Pnt 3862 3754 Pnt 2120 3824 Pnt 3136 3747 Pnt 3097 3791 Pnt 3171 3748 Pnt 3270 3743 Pnt 2624 3748 Pnt 2947 3824 Pnt 2914 2608 Pnt 2980 3768 Pnt 2921 3745 Pnt 3573 3750 Pnt 2096 3788 Pnt 3023 3780 Pnt 2477 3748 Pnt 3975 3772 Pnt 2860 3742 Pnt 3793 3750 Pnt 2833 3741 Pnt 2372 3761 Pnt 2120 3835 Pnt 3257 3744 Pnt 2956 3766 Pnt 3159 3752 Pnt 4092 3748 Pnt 2363 3881 Pnt 3494 3739 Pnt 2220 3808 Pnt 2860 3740 Pnt 2428 3879 Pnt 2400 3746 Pnt 2528 3742 Pnt 3540 3767 Pnt 1979 3834 Pnt 2428 3739 Pnt 3466 3746 Pnt 3070 3764 Pnt 2584 3758 Pnt 3077 3738 Pnt 2945 3740 Pnt 2694 3755 Pnt 3042 3802 Pnt 2462 3783 Pnt 2941 3751 Pnt 2342 3755 Pnt 2366 3740 Pnt 3559 3740 Pnt 2544 3755 Pnt 3034 3741 Pnt 2233 3739 Pnt 2981 3760 Pnt 2730 3740 Pnt 2476 3739 Pnt 2687 3745 Pnt 2197 3753 Pnt 3547 2869 Pnt 2849 3748 Pnt 2066 3852 Pnt 3485 3753 Pnt 3769 3745 Pnt 2690 3747 Pnt 3302 3746 Pnt 2324 3745 Pnt 2374 3943 Pnt 2132 3774 Pnt 2923 3747 Pnt 3889 3747 Pnt 2136 3753 Pnt 2551 3829 Pnt 3033 3745 Pnt 2712 3740 Pnt 2154 3776 Pnt 3397 2783 Pnt 2885 3767 Pnt 2317 3806 Pnt 2334 3742 Pnt 3295 3740 Pnt 3071 3741 Pnt 2514 3755 Pnt 3010 3741 Pnt 2502 3751 Pnt 2939 3755 Pnt 2937 3747 Pnt 2340 3757 Pnt 3076 3745 Pnt 2373 3742 Pnt 2999 3767 Pnt 3927 3757 Pnt 2790 3768 Pnt 3443 3752 Pnt 2608 3767 Pnt 3071 3747 Pnt 3144 3768 Pnt 1961 3804 Pnt 3382 3741 Pnt 3181 3743 Pnt 3672 3752 Pnt 2336 3787 Pnt 3099 3798 Pnt 3277 3754 Pnt 3777 3759 Pnt 2599 3760 Pnt 2076 3851 Pnt 2433 3763 Pnt 1895 3799 Pnt 2481 3740 Pnt 3304 3739 Pnt 3069 3824 Pnt 2680 3809 Pnt 2363 3747 Pnt 2299 3780 Pnt 2246 3799 Pnt 3009 3746 Pnt 3203 3757 Pnt 2614 3750 Pnt 2964 3764 Pnt 2450 3747 Pnt 2814 3743 Pnt 3112 3746 Pnt 2378 3736 Pnt 3024 3746 Pnt 3309 3737 Pnt 3299 3749 Pnt 3022 3746 Pnt 2794 3740 Pnt 3478 3741 Pnt 3498 3806 Pnt 2840 3746 Pnt 3108 3745 Pnt 3103 3750 Pnt 2489 3744 Pnt 2573 3784 Pnt 2860 3736 Pnt 2734 3777 Pnt 3930 3784 Pnt 3640 3748 Pnt 2780 3747 Pnt 1967 3752 Pnt 2844 3745 Pnt 2678 3738 Pnt 2534 3743 Pnt 2543 3749 Pnt 4038 3747 Pnt 2530 3751 Pnt 2656 3748 Pnt 2012 3788 Pnt 2798 3749 Pnt 3315 2835 Pnt 2770 3738 Pnt 2911 3767 Pnt 2768 3740 Pnt 2732 3746 Pnt 1811 3795 Pnt 3143 3744 Pnt 3221 3743 Pnt 2916 3757 Pnt 3201 3740 Pnt 2987 3744 Pnt 2657 3763 Pnt 1922 3934 Pnt 2653 3741 Pnt 3297 3765 Pnt 2654 3743 Pnt 3502 3753 Pnt 2686 3784 Pnt 2404 3750 Pnt 2406 3761 Pnt 2907 3742 Pnt 2366 3746 Pnt 2498 3743 Pnt 3251 3739 Pnt 2492 3787 Pnt 2391 3740 Pnt 2696 3750 Pnt 2974 3773 Pnt 2741 3748 Pnt 3474 2591 Pnt 3318 3759 Pnt 3196 3753 Pnt 3214 3743 Pnt 2509 3761 Pnt 2592 3795 Pnt 2643 3741 Pnt 2666 3762 Pnt 2098 3775 Pnt 3113 3750 Pnt 4118 3784 Pnt 3109 3795 Pnt 2377 3742 Pnt 2558 3748 Pnt 2872 3812 Pnt 3208 3742 Pnt 3054 3752 Pnt 2811 3753 Pnt 3440 3742 Pnt 2572 3762 Pnt 2946 3816 Pnt 2145 3797 Pnt 2855 3749 Pnt 2964 3750 Pnt 2813 3797 Pnt 2389 3807 Pnt 2613 3763 Pnt 1876 3774 Pnt 2155 3757 Pnt 2662 3817 Pnt 2321 3758 Pnt 2474 3763 Pnt 2892 3814 Pnt 2573 3744 Pnt 3215 3763 Pnt 2740 2738 Pnt 2769 3754 Pnt 3097 3740 Pnt 3209 3785 Pnt 3253 3749 Pnt 3379 3752 Pnt 3933 3745 Pnt 2765 3763 Pnt 3581 3745 Pnt 3284 3844 Pnt 2813 3756 Pnt 2642 3761 Pnt 3041 3738 Pnt 3435 3791 Pnt 3485 3737 Pnt 4187 3773 Pnt 2644 3734 Pnt 3158 3772 Pnt 2481 3798 Pnt 2519 3762 Pnt 3161 3743 Pnt 2965 3750 Pnt 2662 3745 Pnt 2553 3739 Pnt 2912 3742 Pnt 2738 3737 Pnt 2093 3825 Pnt 3319 3743 Pnt 2390 3748 Pnt 3741 3743 Pnt 3435 3749 Pnt 2816 3812 Pnt 2588 3741 Pnt 3792 3747 Pnt 2147 3756 Pnt 3120 3749 Pnt 2432 3758 Pnt 2570 3748 Pnt 2793 3737 Pnt 1914 3788 Pnt 3169 3741 Pnt 3277 3735 Pnt 2758 3744 Pnt 2441 3761 Pnt 2459 3759 Pnt 2004 3749 Pnt 2750 3742 Pnt 2998 3760 Pnt 2645 3901 Pnt 2627 3745 Pnt 3988 3760 Pnt 3457 3746 Pnt 3157 3737 Pnt 3077 2652 Pnt 2739 3739 Pnt 2332 3768 Pnt 3288 3750 Pnt 3381 3749 Pnt 3143 3768 Pnt 2815 3786 Pnt 3159 3762 Pnt 2884 3752 Pnt 3157 3747 Pnt 2807 3751 Pnt 3185 3786 Pnt 2442 3774 Pnt 3187 3748 Pnt 2290 3739 Pnt 1987 3808 Pnt 2732 3814 Pnt 3461 2779 Pnt 2823 3741 Pnt 2879 3742 Pnt 2770 3743 Pnt 2128 3754 Pnt 2926 3774 Pnt 2711 3745 Pnt 3222 3752 Pnt 2369 3800 Pnt 2973 3745 Pnt 2593 3741 Pnt 3188 3754 Pnt 2752 3744 Pnt 3660 3799 Pnt 2594 3801 Pnt 3159 3766 Pnt 2779 3763 Pnt 3655 3749 Pnt 2609 3744 Pnt 3620 3769 Pnt 2544 3749 Pnt 2535 3767 Pnt 2704 3747 Pnt 3531 3771 Pnt 2853 3748 Pnt 2951 3735 Pnt 2731 3876 Pnt 3077 3770 Pnt 3940 3747 Pnt 2878 3778 Pnt 2779 3839 Pnt 3174 3754 Pnt 2625 3758 Pnt 2527 3745 Pnt 2711 3746 Pnt 3040 3742 Pnt 2872 3739 Pnt 3042 3743 Pnt 2764 3745 Pnt 2379 3810 Pnt 2168 3803 Pnt 2212 3820 Pnt 3341 3743 Pnt 2467 3803 Pnt 3787 2620 Pnt 3316 3750 Pnt 2808 3749 Pnt 2496 3736 Pnt 3811 3752 Pnt 3239 3752 Pnt 3225 3746 Pnt 3131 3746 Pnt 2518 3747 Pnt 3230 3743 Pnt 3038 3742 Pnt 2198 3752 Pnt 3203 3751 Pnt 3237 3742 Pnt 3095 3748 Pnt 2356 3754 Pnt 3370 3751 Pnt 3021 3745 Pnt 2724 3760 Pnt 2855 3753 Pnt 3724 3752 Pnt 2278 3796 Pnt 2768 3792 Pnt 2479 3743 Pnt 2832 3738 Pnt 2547 3740 Pnt 3656 3737 Pnt 2469 3747 Pnt 2702 3798 Pnt 2349 3747 Pnt 3585 3754 Pnt 2888 3740 Pnt 2811 3744 Pnt 3911 3740 Pnt 2797 2671 Pnt 3234 3747 Pnt 2708 3754 Pnt 2571 3739 Pnt 3464 3754 Pnt 3168 3741 Pnt 3259 3751 Pnt 2865 3781 Pnt 2565 3762 Pnt 2835 3740 Pnt 2688 3742 Pnt 2471 3757 Pnt 3042 3739 Pnt 2477 3923 Pnt 2520 3813 Pnt 3109 3740 Pnt 2744 3759 Pnt 2840 3735 Pnt 2104 3784 Pnt 2838 3736 Pnt 2702 3744 Pnt 2532 3750 Pnt 2505 3746 Pnt 2745 3751 Pnt 2217 3776 Pnt 2420 3734 Pnt 2505 3746 Pnt 2097 3787 Pnt 4102 3736 Pnt 3655 3739 Pnt 2728 3737 Pnt 2330 3791 Pnt 2711 3756 Pnt 2968 3740 Pnt 2762 3747 Pnt 3265 3737 Pnt 2779 3746 Pnt 2712 3748 Pnt 3248 2683 Pnt 2665 3745 Pnt 2631 3756 Pnt 2677 3760 Pnt 2495 3742 Pnt 2521 3747 Pnt 2260 3798 Pnt 2884 3745 Pnt 3621 3736 Pnt 3158 3740 Pnt 2830 3747 Pnt 2578 3751 Pnt 2621 3737 Pnt 3521 3740 Pnt 2561 3758 Pnt 2294 3791 Pnt 3159 3751 Pnt 3323 3753 Pnt 2625 3736 Pnt 2937 3744 Pnt 2986 3740 Pnt 3219 3738 Pnt 3257 3744 Pnt 3122 3738 Pnt 2828 3754 Pnt 2791 3741 Pnt 2127 3775 Pnt 3389 3745 Pnt 3787 3751 Pnt 2646 3745 Pnt 2533 3838 Pnt 3189 2698 Pnt 2796 3753 Pnt 2731 3749 Pnt 2394 3739 Pnt 3847 2857 Pnt 2572 3739 Pnt 2667 3810 Pnt 2623 3742 Pnt 2637 3753 Pnt 2931 3810 Pnt 3366 3740 Pnt 2825 3742 Pnt 2574 3792 Pnt 2920 3744 Pnt 2704 3750 Pnt 2511 3745 Pnt 2648 2360 Pnt 2421 3746 Pnt 4115 3755 Pnt 3061 3740 Pnt 2251 3744 Pnt 3056 3744 Pnt 2766 3783 Pnt 2882 3767 Pnt 2921 3748 Pnt 2465 3749 Pnt 3016 3740 Pnt 2355 3743 Pnt 2344 3785 Pnt 2552 3770 Pnt 2701 3747 Pnt 3236 3767 Pnt 2806 3744 Pnt 2520 3737 Pnt 2707 3778 Pnt 3003 3757 Pnt 2686 3806 Pnt 2702 3744 Pnt 2687 3784 Pnt 2378 3779 Pnt 2962 3752 Pnt 2565 3740 Pnt 2784 3740 Pnt 3381 2838 Pnt 3859 3761 Pnt 2710 3758 Pnt 2692 3827 Pnt 3322 3758 Pnt 3394 2441 Pnt 2936 3767 Pnt 3199 3749 Pnt 3090 3754 Pnt 2656 3752 Pnt 3080 3740 Pnt 2933 3767 Pnt 2440 3760 Pnt 3423 3752 Pnt 2330 3782 Pnt 3212 3743 Pnt 2055 3794 Pnt 3020 3749 Pnt 2964 3757 Pnt 2940 3750 Pnt 2975 3743 Pnt 3079 3741 Pnt 2137 3817 Pnt 2776 3758 Pnt 2796 3732 Pnt 2670 3743 Pnt 2741 3755 Pnt 2980 3762 Pnt 2547 3758 Pnt 2618 3746 Pnt 3096 3747 Pnt 3136 3762 Pnt 2663 3758 Pnt 3169 3739 Pnt 2903 3755 Pnt 4126 3759 Pnt 2927 3750 Pnt 2414 3824 Pnt 2328 3746 Pnt 3523 3755 Pnt 2984 3747 Pnt 2576 3830 Pnt 2717 3746 Pnt 3091 3745 Pnt 2755 3762 Pnt 2395 3747 Pnt 2766 3797 Pnt 2802 3752 Pnt 2836 3735 Pnt 2605 3741 Pnt 2439 3800 Pnt 2312 3800 Pnt 2901 3769 Pnt 3040 3741 Pnt 3088 3751 Pnt 2507 3760 Pnt 2564 3750 Pnt 2162 3794 Pnt 2385 3808 Pnt 3130 3800 Pnt 2873 3741 Pnt 2444 3751 Pnt 2810 3751 Pnt 3310 3793 Pnt 3083 3741 Pnt 2820 3753 Pnt 2265 3760 Pnt 3378 3733 Pnt 2425 3758 Pnt 1959 3756 Pnt 3495 3743 Pnt 2825 3751 Pnt 3478 2566 Pnt 2225 3790 Pnt 3297 2520 Pnt 2460 3754 Pnt 2702 3750 Pnt 2525 3749 Pnt 2855 3744 Pnt 2264 3737 Pnt 2740 3749 Pnt 2302 3741 Pnt 2558 3744 Pnt 2245 3774 Pnt 2986 3765 Pnt 2494 3772 Pnt 3859 3742 Pnt 2618 3738 Pnt 2615 3746 Pnt 2693 3781 Pnt 2782 3743 Pnt 2433 3746 Pnt 3222 3781 Pnt 2806 3751 Pnt 2418 3821 Pnt 2449 3738 Pnt 2573 3742 Pnt 2861 3772 Pnt 2323 3836 Pnt 2838 2724 Pnt 2441 3748 Pnt 2850 3934 Pnt 2415 3736 Pnt 3729 2775 Pnt 2982 2763 Pnt 3375 3747 Pnt 2772 3750 Pnt 2392 3742 Pnt 3053 3761 Pnt 2545 3742 Pnt 2721 3797 Pnt 2677 3742 Pnt 3149 3745 Pnt 2645 3753 Pnt 2453 3744 Pnt 2241 3746 Pnt 2891 3744 Pnt 3356 3743 Pnt 2708 3746 Pnt 2510 3740 Pnt 2866 3748 Pnt 2076 3744 Pnt 2102 3778 Pnt 2841 3758 Pnt 2920 3747 Pnt 2874 3750 Pnt 2469 3739 Pnt 2678 3754 Pnt 2615 3745 Pnt 3824 3752 Pnt 2809 3748 Pnt 2946 3753 Pnt 2379 3760 Pnt 3000 3773 Pnt 2457 3747 Pnt 3855 3752 Pnt 2981 3753 Pnt 2294 3800 Pnt 2959 3746 Pnt 2331 3803 Pnt 3072 3745 Pnt 3502 3772 Pnt 2943 3757 Pnt 2068 3794 Pnt 3337 3754 Pnt 2689 3811 Pnt 3686 3785 Pnt 2685 3814 Pnt 3357 3741 Pnt 2477 3741 Pnt 3766 3814 Pnt 3652 3758 Pnt 2697 3746 Pnt 2851 3745 Pnt 2763 3779 Pnt 2494 2616 Pnt 2057 3821 Pnt 3641 3779 Pnt 3151 2776 Pnt 3158 3739 Pnt 2723 3757 Pnt 2530 3761 Pnt 2993 2652 Pnt 2620 3750 Pnt 2807 3739 Pnt 2996 3757 Pnt 3384 3743 Pnt 2610 3751 Pnt 3440 3746 Pnt 2364 3776 Pnt 3288 3745 Pnt 3743 3754 Pnt 3512 3750 Pnt 3667 3745 Pnt 2807 3752 Pnt 2735 3768 Pnt 2726 3737 Pnt 3400 2803 Pnt 2409 3825 Pnt 3225 3819 Pnt 2804 3741 Pnt 3052 3819 Pnt 2931 3755 Pnt 2637 3765 Pnt 3747 3747 Pnt 2691 3742 Pnt 3792 3742 Pnt 3000 3769 Pnt 2878 3762 Pnt 3973 3770 Pnt 3783 2542 Pnt 2583 3733 Pnt 2467 2625 Pnt 2855 3751 Pnt 3526 2897 Pnt 3301 3743 Pnt 3306 3742 Pnt 2669 3755 Pnt 3885 3751 Pnt 2911 3758 Pnt 2250 3782 Pnt 3675 3757 Pnt 3445 3757 Pnt 2442 3736 Pnt 3936 3752 Pnt 3560 3750 Pnt 2866 2655 Pnt 2990 3750 Pnt 2638 3741 Pnt 2399 3737 Pnt 3052 3750 Pnt 3249 3739 Pnt 2687 3761 Pnt 2529 3758 Pnt 2648 3744 Pnt 2954 3761 Pnt 2358 3749 Pnt 2191 3800 Pnt 2622 3753 Pnt 4158 3743 Pnt 2065 3737 Pnt 2509 3829 Pnt 2603 3747 Pnt 2424 3791 Pnt 3040 3928 Pnt 2845 3747 Pnt 2870 3742 Pnt 2338 3759 Pnt 3346 3742 Pnt 3055 3750 Pnt 2724 3747 Pnt 2105 3740 Pnt 2707 3768 Pnt 2097 3765 Pnt 2104 3734 Pnt 2398 3751 Pnt 2357 3743 Pnt 3056 3747 Pnt 2647 3768 Pnt 2468 3806 Pnt 2977 3741 Pnt 2952 3756 Pnt 2420 3801 Pnt 2586 3747 Pnt 3236 3753 Pnt 3083 3740 Pnt 3363 3736 Pnt 3072 3753 Pnt 2650 3751 Pnt 2708 2498 Pnt 2126 3782 Pnt 3575 3745 Pnt 2820 3743 Pnt 2547 3736 Pnt 2323 3785 Pnt 2533 3738 Pnt 2464 3752 Pnt 2969 3743 Pnt 3390 3782 Pnt 2101 3817 Pnt 2922 3741 Pnt 2376 3769 Pnt 3106 3752 Pnt 2138 3774 Pnt 2300 3762 Pnt 3231 3738 Pnt 2857 3752 Pnt 3601 3738 Pnt 2962 3741 Pnt 3195 3749 Pnt 3208 3766 Pnt 2779 3741 Pnt 2585 3744 Pnt 2616 3736 Pnt 2658 3742 Pnt 3961 3742 Pnt 3065 3744 Pnt 2864 3749 Pnt 2413 3774 Pnt 2450 3759 Pnt 2957 3730 Pnt 2209 3801 Pnt 3709 3801 Pnt 2716 3801 Pnt 2953 3735 Pnt 2273 3762 Pnt 3239 3738 Pnt 2669 3741 Pnt 2757 3740 Pnt 3282 3749 Pnt 2368 3779 Pnt 2060 3780 Pnt 2945 3762 Pnt 3022 3757 Pnt 2618 3822 Pnt 2383 3740 Pnt 3593 3785 Pnt 2044 3798 Pnt 2658 3814 Pnt 3355 3740 Pnt 2124 3799 Pnt 2783 3746 Pnt 2210 3792 Pnt 2024 3779 Pnt 2578 3771 Pnt 3124 3747 Pnt 3502 3746 Pnt 3965 2782 Pnt 2819 3735 Pnt 2420 3765 Pnt 3251 3742 Pnt 2638 3739 Pnt 3201 3765 Pnt 3090 3748 Pnt 2870 3739 Pnt 3541 3768 Pnt 3104 3751 Pnt 3011 3740 Pnt 2950 3747 Pnt 2706 3739 Pnt 2546 3757 Pnt 2501 3798 Pnt 2370 3816 Pnt 3614 3740 Pnt 2557 3741 Pnt 3654 3741 Pnt 3172 3798 Pnt 2271 3844 Pnt 2690 3734 Pnt 3214 3749 Pnt 2980 3736 Pnt 2739 3736 Pnt 3485 3749 Pnt 3152 3741 Pnt 2748 3742 Pnt 2842 3761 Pnt 2658 3761 Pnt 2897 3761 Pnt 2925 3754 Pnt 3012 3798 Pnt 2872 3737 Pnt 3490 3739 Pnt 3514 3782 Pnt 2560 3768 Pnt 3093 3745 Pnt 2892 3738 Pnt 2111 3788 Pnt 2242 3783 Pnt 2934 3738 Pnt 2328 3839 Pnt 3365 3746 Pnt 2157 3738 Pnt 2608 3839 Pnt 3216 3753 Pnt 4139 3768 Pnt 2388 3744 Pnt 2113 3841 Pnt 3111 3744 Pnt 2868 3743 Pnt 2979 3744 Pnt 2973 3751 Pnt 3124 3737 Pnt 3098 3742 Pnt 3568 3759 Pnt 3745 3750 Pnt 3620 3748 Pnt 2497 3736 Pnt 2609 3796 Pnt 2896 3739 Pnt 2469 3750 Pnt 3069 3813 Pnt 2868 3742 Pnt 2793 3741 Pnt 2614 3735 Pnt 3089 3747 Pnt 3018 3738 Pnt 3182 3741 Pnt 2904 3825 Pnt 3023 3825 Pnt 2965 3742 Pnt 2888 3752 Pnt 2703 3747 Pnt 2887 3792 Pnt 3161 3752 Pnt 3441 3754 Pnt 3171 3740 Pnt 3162 3752 Pnt 2239 3762 Pnt 3284 3754 Pnt 2339 3750 Pnt 2684 3749 Pnt 2584 3912 Pnt 2596 3759 Pnt 2732 3743 Pnt 2910 3764 Pnt 3752 3746 Pnt 2172 3768 Pnt 2662 3762 Pnt 3045 3735 Pnt 2790 3770 Pnt 2668 3766 Pnt 3013 3768 Pnt 3033 3738 Pnt 2342 3750 Pnt 2867 3783 Pnt 2407 3742 Pnt 2722 3738 Pnt 2831 3738 Pnt 2953 3748 Pnt 2514 3750 Pnt 3495 3806 Pnt 3170 3789 Pnt 2755 3743 Pnt 2483 3750 Pnt 2153 3818 Pnt 3311 3743 Pnt 2712 3765 Pnt 2574 3738 Pnt 3913 2674 Pnt 2028 3764 Pnt 2442 3738 Pnt 3249 3746 Pnt 2663 3738 Pnt 2669 3779 Pnt 3075 3740 Pnt 3028 3760 Pnt 2479 3749 Pnt 2921 2700 Pnt 2707 3740 Pnt 2410 3743 Pnt 2183 3742 Pnt 2410 3768 Pnt 3235 3761 Pnt 2962 3743 Pnt 3816 3760 Pnt 3098 3752 Pnt 2941 3807 Pnt 2647 3741 Pnt 2434 3807 Pnt 3108 3741 Pnt 3003 3745 Pnt 2806 3827 Pnt 2711 3747 Pnt 3041 2646 Pnt 2247 3745 Pnt 2276 3786 Pnt 2117 3749 Pnt 3887 3752 Pnt 3014 3746 Pnt 2725 3759 Pnt 3418 3748 Pnt 3311 3763 Pnt 3107 2673 Pnt 3046 3748 Pnt 2734 3805 Pnt 2532 3846 Pnt 2897 3792 Pnt 2087 3791 Pnt 2856 3736 Pnt 2756 3750 Pnt 2777 3742 Pnt 2365 3755 Pnt 3226 3739 Pnt 2750 3770 Pnt 2594 3737 Pnt 2531 3794 Pnt 2447 3737 Pnt 3213 3746 Pnt 2651 3743 Pnt 3305 3769 Pnt 2618 3798 Pnt 2606 3778 Pnt 2619 3764 Pnt 3472 3800 Pnt 3147 3738 Pnt 2676 3739 Pnt 2808 3771 Pnt 3264 3744 Pnt 2539 3763 Pnt 2885 3740 Pnt 2598 3744 Pnt 2009 3843 Pnt 3713 2809 Pnt 2613 3746 Pnt 3928 3744 Pnt 3369 3746 Pnt 3635 3747 Pnt 3267 3752 Pnt 2480 3741 Pnt 3835 3748 Pnt 3149 3741 Pnt 2944 3749 Pnt 2679 3743 Pnt 2767 3760 Pnt 3218 3793 Pnt 2845 3744 Pnt 2856 3742 Pnt 3901 3749 Pnt 2831 3762 Pnt 3448 3789 Pnt 2788 3743 Pnt 3116 2673 Pnt 2946 3738 Pnt 2882 3743 Pnt 3329 3744 Pnt 2815 3747 Pnt 2634 3752 Pnt 3084 3751 Pnt 2385 3824 Pnt 2574 3737 Pnt 2851 3747 Pnt 3369 3739 Pnt 2929 2651 Pnt 2197 3751 Pnt 2714 3744 Pnt 2204 3836 Pnt 3407 3778 Pnt 3216 3765 Pnt 2639 3767 Pnt 3197 3744 Pnt 2683 3791 Pnt 2504 3761 Pnt 2609 3740 Pnt 2977 3756 Pnt 2792 3743 Pnt 2087 3847 Pnt 2848 2809 Pnt 3039 2728 Pnt 2725 3746 Pnt 2071 3804 Pnt 3816 3754 Pnt 2537 3759 Pnt 2699 3760 Pnt 2970 3759 Pnt 2599 3731 Pnt 3293 3742 Pnt 2938 3743 Pnt 2643 3814 Pnt 3465 3758 Pnt 3388 3742 Pnt 2785 3746 Pnt 2218 3739 Pnt 2430 3739 Pnt 2935 3745 Pnt 2846 3750 Pnt 3075 3744 Pnt 3238 3748 Pnt 2953 3872 Pnt 2735 3746 Pnt 2688 3737 Pnt 3608 3748 Pnt 2294 3919 Pnt 3443 3800 Pnt 2693 3792 Pnt 2050 3764 Pnt 2205 3782 Pnt 2287 3746 Pnt 3557 3745 Pnt 3587 2631 Pnt 2878 3750 Pnt 2688 3794 Pnt 3349 3764 Pnt 2683 3741 Pnt 2579 3744 Pnt 3025 3737 Pnt 2715 3745 Pnt 2460 3743 Pnt 3257 3756 Pnt 3318 3740 Pnt 2459 3753 Pnt 2096 3900 Pnt 2837 3743 Pnt 2309 3756 Pnt 2170 3756 Pnt 2265 3738 Pnt 2667 3750 Pnt 2402 3768 Pnt 2507 3739 Pnt 2631 3750 Pnt 1926 3771 Pnt 2267 3734 Pnt 2446 3813 Pnt 2514 3800 Pnt 3165 3759 Pnt 2837 3749 Pnt 2982 3855 Pnt 3446 3763 Pnt 3012 3747 Pnt 3264 3755 Pnt 2291 3851 Pnt 4070 3763 Pnt 2454 3786 Pnt 3134 3741 Pnt 2671 3741 Pnt 2177 3751 Pnt 2707 3761 Pnt 2979 3747 Pnt 4090 3763 Pnt 2858 3761 Pnt 3185 2741 Pnt 2531 3747 Pnt 3526 3753 Pnt 2180 3782 Pnt 2795 3745 Pnt 2309 3766 Pnt 2729 3738 Pnt 3088 3782 Pnt 1989 3764 Pnt 2559 3733 Pnt 2840 3824 Pnt 2900 3831 Pnt 2091 3799 Pnt 2520 3747 Pnt 2434 3740 Pnt 3389 3734 Pnt 2531 3758 Pnt 3002 3740 Pnt 2912 3753 Pnt 2517 3753 Pnt 4037 3753 Pnt 2266 3776 Pnt 2813 3795 Pnt 2429 3758 Pnt 2599 3739 Pnt 3115 3751 Pnt 2529 3748 Pnt 2660 3754 Pnt 2566 3776 Pnt 2401 3776 Pnt 2569 3737 Pnt 3995 3742 Pnt 2652 3744 Pnt 3017 3738 Pnt 2874 3734 Pnt 2848 3746 Pnt 3014 3749 Pnt 3083 2536 Pnt 3005 3745 Pnt 2161 3784 Pnt 3039 3746 Pnt 2364 3808 Pnt 2881 3748 Pnt 3295 3750 Pnt 2585 3754 Pnt 3178 3744 Pnt 3877 3748 Pnt 2638 3781 Pnt 2695 3755 Pnt 2614 3775 Pnt 2443 3795 Pnt 2860 3772 Pnt 2899 3739 Pnt 2587 3772 Pnt 2659 3747 Pnt 2417 3792 Pnt 3203 3746 Pnt 4023 2605 Pnt 2308 3746 Pnt 3372 3751 Pnt 2889 3746 Pnt 2433 3941 Pnt 3756 2620 Pnt 3092 3740 Pnt 2934 3740 Pnt 3597 3746 Pnt 2899 3748 Pnt 2992 3741 Pnt 2864 3761 Pnt 2581 3816 Pnt 2336 3748 Pnt 3069 3743 Pnt 2122 3817 Pnt 2770 3740 Pnt 2531 3756 Pnt 2872 3751 Pnt 2493 3760 Pnt 2820 3761 Pnt 2933 3741 Pnt 2657 3770 Pnt 1991 3769 Pnt 2884 3781 Pnt 3225 3767 Pnt 3153 3761 Pnt 2804 3751 Pnt 2399 3778 Pnt 2955 3800 Pnt 3391 3744 Pnt 3358 3744 Pnt 3238 3751 Pnt 2923 3775 Pnt 2914 3758 Pnt 2614 3748 Pnt 3059 3747 Pnt 2552 3764 Pnt 2925 2792 Pnt 2187 3755 Pnt 2804 3744 Pnt 2283 3772 Pnt 2484 3745 Pnt 3859 2615 Pnt 3370 3749 Pnt 2646 3743 Pnt 2533 3758 Pnt 3205 3745 Pnt 2096 3740 Pnt 3011 3738 Pnt 2672 3747 Pnt 2312 3748 Pnt 2507 3765 Pnt 3720 3745 Pnt 3652 3737 Pnt 3375 3744 Pnt 3372 3748 Pnt 2982 3755 Pnt 2435 3805 Pnt 3382 3747 Pnt 3132 3755 Pnt 3418 3744 Pnt 2982 3745 Pnt 2542 3737 Pnt 2468 3740 Pnt 2731 3740 Pnt 2856 3746 Pnt 2948 3770 Pnt 2669 3758 Pnt 3247 3751 Pnt 1870 3822 Pnt 4007 2649 Pnt 2742 3783 Pnt 2315 3744 Pnt 2776 3742 Pnt 3948 3778 Pnt 2670 3739 Pnt 2484 3744 Pnt 2691 3772 Pnt 2284 3744 Pnt 3266 3806 Pnt 2585 3743 Pnt 2597 3746 Pnt 2326 3744 Pnt 2562 3747 Pnt 3408 3747 Pnt 3015 3740 Pnt 3412 3746 Pnt 2791 3801 Pnt 3715 3744 Pnt 2248 3796 Pnt 2785 2770 Pnt 2759 3738 Pnt 2408 3780 Pnt 2880 3746 Pnt 2480 3866 Pnt 2313 3786 Pnt 3167 3738 Pnt 2741 3817 Pnt 2391 3802 Pnt 2048 3762 Pnt 2482 3745 Pnt 2507 3752 Pnt 2489 3740 Pnt 2966 3756 Pnt 2752 3746 Pnt 2649 3740 Pnt 2174 3754 Pnt 2592 3743 Pnt 3005 3748 Pnt 2176 3770 Pnt 2611 3738 Pnt 2823 3759 Pnt 2853 3750 Pnt 2658 3744 Pnt 3513 2581 Pnt 2910 3738 Pnt 2531 3789 Pnt 2883 3762 Pnt 2609 3744 Pnt 3027 2620 Pnt 2000 3825 Pnt 2668 3742 Pnt 3487 3750 Pnt 3572 2781 Pnt 2853 3751 Pnt 3133 3764 Pnt 2970 3742 Pnt 3003 3749 Pnt 2798 3749 Pnt 2495 3803 Pnt 3297 3746 Pnt 2358 3748 Pnt 2574 3777 Pnt 2761 3748 Pnt 3604 3751 Pnt 2555 3848 Pnt 3158 3744 Pnt 3526 3749 Pnt 2535 3759 Pnt 3207 3758 Pnt 3129 3735 Pnt 3207 3757 Pnt 2293 3761 Pnt 2324 3787 Pnt 2864 3735 Pnt 2541 3748 Pnt 2902 3740 Pnt 3212 3745 Pnt 3719 3748 Pnt 3015 3746 Pnt 2199 3786 Pnt 3168 3771 Pnt 2463 3744 Pnt 2851 3746 Pnt 2504 3758 Pnt 2691 3743 Pnt 3162 3746 Pnt 3119 3751 Pnt 3063 3743 Pnt 3031 3758 Pnt 2368 3810 Pnt 3863 3782 Pnt 3066 3753 Pnt 2391 3736 Pnt 3070 3744 Pnt 2852 3744 Pnt 2535 3756 Pnt 2522 3752 Pnt 3493 3736 Pnt 3119 3749 Pnt 2633 3756 Pnt 2863 3806 Pnt 2574 3742 Pnt 2425 3737 Pnt 2095 3754 Pnt 3510 3744 Pnt 2537 3776 Pnt 2329 3746 Pnt 2181 2544 Pnt 2749 3739 Pnt 3201 3754 Pnt 2121 3816 Pnt 3004 3739 Pnt 3232 3737 Pnt 3056 3758 Pnt 2958 3739 Pnt 2997 3752 Pnt 3259 3745 Pnt 2878 3741 Pnt 2487 3763 Pnt 2909 3772 Pnt 2760 2655 Pnt 3174 3738 Pnt 3184 3751 Pnt 2581 2311 Pnt 2665 3742 Pnt 2545 3813 Pnt 2932 3795 Pnt 3034 3748 Pnt 3440 3746 Pnt 2824 2713 Pnt 2856 3751 Pnt 2573 3754 Pnt 2067 3891 Pnt 2901 3744 Pnt 2509 3817 Pnt 3323 3755 Pnt 2653 3802 Pnt 2568 3794 Pnt 2355 3747 Pnt 3269 3735 Pnt 2951 3794 Pnt 3097 3742 Pnt 2876 3740 Pnt 3919 2509 Pnt 2882 3751 Pnt 2906 3740 Pnt 3381 3801 Pnt 2389 3866 Pnt 2501 3775 Pnt 3034 3749 Pnt 3325 2309 Pnt 2390 3734 Pnt 2825 3747 Pnt 3177 3751 Pnt 2329 3746 Pnt 2678 3744 Pnt 3731 3775 Pnt 1986 3784 Pnt 2666 3760 Pnt 2599 3739 Pnt 2388 3762 Pnt 3604 3754 Pnt 2652 3751 Pnt 2097 3791 Pnt 3692 3740 Pnt 2670 3760 Pnt 2388 3837 Pnt 2318 3769 Pnt 3326 3740 Pnt 2082 3768 Pnt 2728 3748 Pnt 2629 3803 Pnt 2481 3753 Pnt 2603 3742 Pnt 2141 3827 Pnt 2419 3736 Pnt 2951 3750 Pnt 2799 3810 Pnt 3036 3751 Pnt 2988 3755 Pnt 3029 3739 Pnt 3644 3739 Pnt 2962 3740 Pnt 3004 3755 Pnt 2875 3748 Pnt 2151 3747 Pnt 2634 3812 Pnt 2674 3814 Pnt 2340 3742 Pnt 3098 3759 Pnt 1991 3764 Pnt 2906 3767 Pnt 2773 3751 Pnt 3293 3751 Pnt 2933 3746 Pnt 4079 3742 Pnt 2144 3739 Pnt 2976 3770 Pnt 2171 3790 Pnt 2942 3739 Pnt 3179 3748 Pnt 2667 3770 Pnt 3346 3751 Pnt 3095 3752 Pnt 2861 3754 Pnt 2496 3751 Pnt 3674 3741 Pnt 2948 3805 Pnt 2516 3751 Pnt 2662 3735 Pnt 2964 2674 Pnt 2686 3791 Pnt 2822 3746 Pnt 3921 3745 Pnt 2350 3814 Pnt 3593 3745 Pnt 2554 3741 Pnt 2729 3737 Pnt 2982 3743 Pnt 3753 3746 Pnt 3576 3745 Pnt 2151 3740 Pnt 3787 3771 Pnt 3065 3746 Pnt 3216 3945 Pnt 3082 3737 Pnt 2462 3746 Pnt 2169 3774 Pnt 3089 3746 Pnt 4280 2673 Pnt 2856 3755 Pnt 3115 3765 Pnt 2829 3739 Pnt 2946 3829 Pnt 2735 3757 Pnt 2687 3737 Pnt 3813 3755 Pnt 2585 3742 Pnt 2243 3775 Pnt 3172 2983 Pnt 2836 3741 Pnt 2577 3737 Pnt 2668 3743 Pnt 2313 3748 Pnt 2377 3775 Pnt 1969 3778 Pnt 2792 3747 Pnt 2606 3740 Pnt 2405 3746 Pnt 4214 3757 Pnt 2579 3743 Pnt 2528 3862 Pnt 2613 3742 Pnt 3242 3745 Pnt 2619 3829 Pnt 3096 3745 Pnt 2787 3751 Pnt 2874 2702 Pnt 2931 3757 Pnt 3196 3757 Pnt 2065 3788 Pnt 2799 3758 Pnt 2073 3780 Pnt 2963 3751 Pnt 4058 3751 Pnt 3367 3750 Pnt 2608 3752 Pnt 3395 3748 Pnt 3578 3748 Pnt 3437 2494 Pnt 3130 3752 Pnt 2718 3765 Pnt 2956 3742 Pnt 2683 3742 Pnt 3562 3736 Pnt 3106 3746 Pnt 2957 2410 Pnt 2628 3751 Pnt 2715 3745 Pnt 2739 3755 Pnt 2590 3768 Pnt 3601 2695 Pnt 2988 3739 Pnt 2729 3771 Pnt 2917 3744 Pnt 2416 3740 Pnt 2920 3745 Pnt 3040 3760 Pnt 3340 3767 Pnt 3144 3740 Pnt 2342 3767 Pnt 2852 3738 Pnt 3536 3766 Pnt 2333 3749 Pnt 2705 3767 Pnt 3099 3758 Pnt 3794 3741 Pnt 3772 2513 Pnt 2568 3739 Pnt 3205 3800 Pnt 2612 3745 Pnt 2614 3750 Pnt 2605 3824 Pnt 3226 3779 Pnt 3894 2686 Pnt 2260 3851 Pnt 3289 3745 Pnt 2642 3740 Pnt 2718 3781 Pnt 2530 3763 Pnt 2779 3743 Pnt 3106 3767 Pnt 2757 3738 Pnt 3250 2575 Pnt 2794 3749 Pnt 2157 3804 Pnt 3873 3746 Pnt 2659 3745 Pnt 1868 3760 Pnt 2604 3743 Pnt 2505 3798 Pnt 3801 3754 Pnt 2888 3754 Pnt 3169 3745 Pnt 2227 3806 Pnt 3094 3740 Pnt 3478 2981 Pnt 2668 3734 Pnt 3572 2559 Pnt 1944 3814 Pnt 3148 3745 Pnt 3456 2780 Pnt 3124 3743 Pnt 1835 3812 Pnt 2845 3775 Pnt 2517 3793 Pnt 2933 3748 Pnt 3343 3763 Pnt 2693 3730 Pnt 2145 3745 Pnt 3248 3736 Pnt 3141 3746 Pnt 2584 3764 Pnt 3574 3750 Pnt 2822 3747 Pnt 3230 3762 Pnt 2973 3770 Pnt 2866 3743 Pnt 2757 3749 Pnt 2282 3761 Pnt 2757 3749 Pnt 2884 3748 Pnt 1937 3811 Pnt 2935 3748 Pnt 3084 3740 Pnt 2453 3751 Pnt 3541 3747 Pnt 3487 2541 Pnt 2524 3746 Pnt 3317 3745 Pnt 2598 3741 Pnt 3218 3751 Pnt 1866 3804 Pnt 2211 3809 Pnt 3307 3749 Pnt 3027 2736 Pnt 2705 3743 Pnt 2627 3777 Pnt 2418 3771 Pnt 3276 3748 Pnt 3395 3749 Pnt 2636 3748 Pnt 2779 3742 Pnt 2699 3752 Pnt 3308 3743 Pnt 2820 3747 Pnt 2687 3793 Pnt 3249 3755 Pnt 1969 3824 Pnt 2547 3751 Pnt 2678 3775 Pnt 2719 3798 Pnt 2557 3767 Pnt 3143 3750 Pnt 3324 3755 Pnt 3894 3767 Pnt 2179 3757 Pnt 2578 3757 Pnt 2552 3749 Pnt 2664 3749 Pnt 2408 3747 Pnt 2589 3756 Pnt 2590 3784 Pnt 2667 3753 Pnt 2899 3753 Pnt 3101 3745 Pnt 3340 3753 Pnt 3215 3749 Pnt 3679 3758 Pnt 2341 3762 Pnt 2085 3835 Pnt 2323 3738 Pnt 3491 3748 Pnt 2879 3759 Pnt 2404 3742 Pnt 2537 3792 Pnt 2962 3747 Pnt 2161 3757 Pnt 2413 3938 Pnt 2443 3743 Pnt 3131 3742 Pnt 2592 3741 Pnt 3995 3745 Pnt 2727 3753 Pnt 2629 3816 Pnt 2529 3763 Pnt 3608 3741 Pnt 4047 2564 Pnt 3142 3743 Pnt 2729 3752 Pnt 3273 3793 Pnt 2260 3844 Pnt 2625 3746 Pnt 2775 3746 Pnt 2041 3879 Pnt 3496 3752 Pnt 2554 3758 Pnt 3353 3764 Pnt 3266 3745 Pnt 3134 3784 Pnt 2587 3739 Pnt 2505 3736 Pnt 3081 3764 Pnt 2635 3751 Pnt 2637 3808 Pnt 2350 3761 Pnt 2615 3750 Pnt 2655 3744 Pnt 2765 3748 Pnt 2483 3748 Pnt 2939 3761 Pnt 2589 3835 Pnt 2169 3807 Pnt 3161 3748 Pnt 3033 3758 Pnt 2788 3802 Pnt 2616 3740 Pnt 2965 3742 Pnt 2543 3763 Pnt 3266 3758 Pnt 2586 2544 Pnt 4288 3771 Pnt 2232 3743 Pnt 2867 3751 Pnt 2603 3812 Pnt 2927 3738 Pnt 2588 3739 Pnt 1949 3812 Pnt 2070 3756 Pnt 2151 3753 Pnt 2654 3748 Pnt 1968 3749 Pnt 2950 3787 Pnt 3196 3756 Pnt 2115 3757 Pnt 3076 3766 Pnt 2559 3758 Pnt 2222 3852 Pnt 2912 3750 Pnt 2855 3748 Pnt 2650 3771 Pnt 2479 3811 Pnt 2827 3738 Pnt 2688 3752 Pnt 2510 3760 Pnt 3030 2795 Pnt 2526 3751 Pnt 2294 3817 Pnt 2857 3747 Pnt 1728 3809 Pnt 2830 3760 Pnt 2548 3748 Pnt 2728 3751 Pnt 2005 3788 Pnt 2590 3740 Pnt 2972 2751 Pnt 2218 3812 Pnt 3086 3747 Pnt 2235 3763 Pnt 1915 3795 Pnt 2366 3768 Pnt 2702 3749 Pnt 3020 3747 Pnt 2934 3747 Pnt 2789 2569 Pnt 2973 3752 Pnt 2520 3739 Pnt 2432 3815 Pnt 2654 3749 Pnt 2899 3752 Pnt 1956 3762 Pnt 2335 3753 Pnt 3134 3747 Pnt 3062 3741 Pnt 2816 3849 Pnt 3415 3748 Pnt 2899 3742 Pnt 2362 3780 Pnt 3194 3753 Pnt 2603 3901 Pnt 2699 3752 Pnt 2284 3806 Pnt 3359 3744 Pnt 2752 3752 Pnt 2321 3777 Pnt 2638 3763 Pnt 2645 3745 Pnt 3058 3777 Pnt 2787 3749 Pnt 2628 3749 Pnt 2899 3745 Pnt 3585 3741 Pnt 2671 3830 Pnt 2950 3749 Pnt 2616 3738 Pnt 2199 3754 Pnt 2494 3738 Pnt 2159 3797 Pnt 2818 3772 Pnt 3687 3752 Pnt 2618 3737 Pnt 3445 3752 Pnt 2968 3744 Pnt 2913 3755 Pnt 3595 3772 Pnt 2447 3747 Pnt 2714 3749 Pnt 3092 3773 Pnt 2760 3751 Pnt 2214 3758 Pnt 2455 3757 Pnt 3317 3751 Pnt 3238 3766 Pnt 3172 3741 Pnt 3322 3741 Pnt 3617 3743 Pnt 2364 3749 Pnt 3231 3756 Pnt 2792 3772 Pnt 3190 3749 Pnt 2917 3754 Pnt 2649 3767 Pnt 2374 3807 Pnt 2341 3744 Pnt 3382 3753 Pnt 2717 3770 Pnt 2457 3747 Pnt 2542 3822 Pnt 2230 3774 Pnt 2951 3770 Pnt 2926 3752 Pnt 3128 3743 Pnt 2677 3740 Pnt 2005 3811 Pnt 4064 3752 Pnt 3426 3744 Pnt 2770 3810 Pnt 2620 3811 Pnt 3541 2731 Pnt 2544 3745 Pnt 3219 3876 Pnt 2158 3812 Pnt 2929 3836 Pnt 3420 3746 Pnt 2423 3750 Pnt 2852 3744 Pnt 3726 3744 Pnt 3034 3761 Pnt 2878 3750 Pnt 2301 3810 Pnt 2369 3750 Pnt 3308 3807 Pnt 3234 3736 Pnt 3422 3742 Pnt 2604 3747 Pnt 2513 3746 Pnt 3605 3749 Pnt 2401 3743 Pnt 2389 3777 Pnt 2505 3761 Pnt 2333 3762 Pnt 2933 3745 Pnt 3142 3748 Pnt 2499 3740 Pnt 3122 3768 Pnt 3161 2821 Pnt 2602 3759 Pnt 2266 3796 Pnt 2554 3792 Pnt 3361 3751 Pnt 3576 3768 Pnt 2838 3750 Pnt 2169 3774 Pnt 2908 3745 Pnt 2788 3751 Pnt 3064 3738 Pnt 2970 3752 Pnt 2988 3773 Pnt 3129 3750 Pnt 2466 3746 Pnt 2889 3750 Pnt 2344 3784 Pnt 1867 3798 Pnt 1687 3799 Pnt 2688 3734 Pnt 2230 3794 Pnt 2518 3757 Pnt 2060 3747 Pnt 3255 3736 Pnt 2560 3798 Pnt 3169 3754 Pnt 2832 3746 Pnt 3210 3743 Pnt 2349 3754 Pnt 2291 3867 Pnt 2857 3740 Pnt 2473 3739 Pnt 3328 3867 Pnt 3219 3753 Pnt 2685 3753 Pnt 2814 3741 Pnt 2540 3742 Pnt 2553 3778 Pnt 3214 3753 Pnt 2497 3739 Pnt 3021 3733 Pnt 3003 3752 Pnt 2873 3751 Pnt 2351 3923 Pnt 2908 3743 Pnt 2730 3739 Pnt 2977 3808 Pnt 2534 3751 Pnt 2631 3742 Pnt 2761 3737 Pnt 4178 3802 Pnt 2755 3755 Pnt 2476 3763 Pnt 2270 3753 Pnt 2120 3825 Pnt 2837 3755 Pnt 2740 3767 Pnt 2514 3760 Pnt 4102 2903 Pnt 2379 3749 Pnt 2611 3731 Pnt 2387 3838 Pnt 3918 3749 Pnt 3090 3748 Pnt 2752 3764 Pnt 2631 3786 Pnt 2372 3744 Pnt 2909 3798 Pnt 3342 3748 Pnt 3650 3838 Pnt 1833 3801 Pnt 3140 3749 Pnt 2314 3758 Pnt 2198 3793 Pnt 3047 3759 Pnt 3353 3749 Pnt 2531 3746 Pnt 3680 3755 Pnt 2826 3749 Pnt 2185 3791 Pnt 3742 3751 Pnt 2639 3762 Pnt 3116 3744 Pnt 2497 3735 Pnt 2554 3742 Pnt 2933 2595 Pnt 2660 3756 Pnt 3222 3745 Pnt 2864 3741 Pnt 2737 3741 Pnt 3227 3741 Pnt 2139 3809 Pnt 3151 3741 Pnt 2822 3743 Pnt 2310 3792 Pnt 3441 3749 Pnt 2763 3740 Pnt 2180 3791 Pnt 3283 3768 Pnt 2890 3737 Pnt 3860 3768 Pnt 2804 3761 Pnt 2940 3755 Pnt 2792 3743 Pnt 2914 3755 Pnt 2672 3793 Pnt 3374 3753 Pnt 2487 3741 Pnt 2596 3739 Pnt 3942 2721 Pnt 3313 2829 Pnt 2795 3810 Pnt 2551 3771 Pnt 3566 3742 Pnt 2649 3755 Pnt 3372 3743 Pnt 3550 2686 Pnt 2614 3739 Pnt 3224 3750 Pnt 3018 2744 Pnt 2361 2458 Pnt 2869 3740 Pnt 2375 3749 Pnt 2756 3784 Pnt 2625 3754 Pnt 3607 3771 Pnt 2816 3746 Pnt 3732 3742 Pnt 2879 3760 Pnt 3231 3808 Pnt 4304 3745 Pnt 2058 3778 Pnt 3084 3740 Pnt 3056 3742 Pnt 2404 3767 Pnt 3366 3808 Pnt 2668 3744 Pnt 2949 3740 Pnt 3373 3745 Pnt 2974 2757 Pnt 2544 3827 Pnt 2246 3799 Pnt 3851 2798 Pnt 2918 3746 Pnt 2812 3749 Pnt 2254 3803 Pnt 3021 3752 Pnt 2316 3824 Pnt 2603 3749 Pnt 2720 3746 Pnt 3223 3744 Pnt 2997 3787 Pnt 3326 3752 Pnt 3171 3824 Pnt 2606 3743 Pnt 3168 3752 Pnt 2526 3746 Pnt 2502 3752 Pnt 2552 3747 Pnt 2563 3736 Pnt 2463 3817 Pnt 2611 3754 Pnt 2662 3754 Pnt 2784 3732 Pnt 2193 3817 Pnt 2681 3755 Pnt 3562 3746 Pnt 3245 3817 Pnt 2586 3815 Pnt 2720 3741 Pnt 2753 3742 Pnt 2599 3762 Pnt 2533 3743 Pnt 2573 3748 Pnt 3296 3742 Pnt 2715 3740 Pnt 2671 3746 Pnt 3261 3755 Pnt 2699 3739 Pnt 2171 3754 Pnt 2554 3742 Pnt 3019 3743 Pnt 2489 3749 Pnt 2420 3737 Pnt 2629 3802 Pnt 4080 3755 Pnt 3045 2580 Pnt 2658 3745 Pnt 3313 3743 Pnt 2629 3826 Pnt 2948 3744 Pnt 2892 3736 Pnt 2030 3756 Pnt 2482 3748 Pnt 2114 3746 Pnt 2867 3762 Pnt 3504 3826 Pnt 2761 3745 Pnt 2746 3744 Pnt 3034 3746 Pnt 2938 3749 Pnt 2472 3777 Pnt 3612 3744 Pnt 3054 3740 Pnt 2601 3774 Pnt 2959 3735 Pnt 3079 3750 Pnt 1916 3813 Pnt 2135 3776 Pnt 2580 3738 Pnt 2667 3746 Pnt 3581 3738 Pnt 2515 3753 Pnt 3815 2540 Pnt 3010 3739 Pnt 2347 3736 Pnt 2159 3800 Pnt 3186 3765 Pnt 2068 3787 Pnt 3062 3751 Pnt 2887 3743 Pnt 2417 3756 Pnt 1932 3776 Pnt 2689 3746 Pnt 3050 3743 Pnt 2816 3737 Pnt 2633 3736 Pnt 3883 3746 Pnt 2722 3734 Pnt 2515 3746 Pnt 2435 3751 Pnt 2680 3756 Pnt 2737 3762 Pnt 2630 3821 Pnt 3259 3761 Pnt 2432 3787 Pnt 2886 3760 Pnt 2844 3760 Pnt 2329 3741 Pnt 2572 3772 Pnt 2389 3791 Pnt 2455 3747 Pnt 2132 3735 Pnt 3615 2659 Pnt 3077 3748 Pnt 3013 3747 Pnt 2752 3748 Pnt 2820 3747 Pnt 1922 3804 Pnt 3204 3747 Pnt 2325 3747 Pnt 2656 3742 Pnt 2288 3800 Pnt 2942 2599 Pnt 2950 3750 Pnt 2538 3748 Pnt 2341 3756 Pnt 3043 3747 Pnt 3112 3745 Pnt 2388 3760 Pnt 2654 3836 Pnt 2415 3760 Pnt 3015 3742 Pnt 1844 3803 Pnt 2834 3755 Pnt 2748 3757 Pnt 2935 3751 Pnt 3259 3732 Pnt 2690 3736 Pnt 3183 3757 Pnt 2628 3746 Pnt 2258 3755 Pnt 2523 3758 Pnt 2986 3745 Pnt 2650 3797 Pnt 2595 3744 Pnt 2747 3755 Pnt 3049 3746 Pnt 2854 3744 Pnt 2898 3751 Pnt 2566 3733 Pnt 3167 3861 Pnt 3657 2744 Pnt 3316 2900 Pnt 2746 3751 Pnt 2787 3742 Pnt 2721 3742 Pnt 2437 3736 Pnt 2418 3809 Pnt 2560 3804 Pnt 2994 2514 Pnt 3532 3761 Pnt 2520 3780 Pnt 3631 3754 Pnt 2604 3799 Pnt 2714 3747 Pnt 2581 3790 Pnt 3093 3741 Pnt 2480 3748 Pnt 3058 3747 Pnt 2854 3749 Pnt 3804 3741 Pnt 2309 3744 Pnt 2698 3754 Pnt 3358 3754 Pnt 2632 3747 Pnt 2644 3800 Pnt 3107 3747 Pnt 3300 3744 Pnt 3190 3747 Pnt 2948 3791 Pnt 2849 3772 Pnt 3311 3744 Pnt 2534 3761 Pnt 2555 3739 Pnt 3125 3745 Pnt 2414 3750 Pnt 2783 3747 Pnt 2628 3755 Pnt 2761 3747 Pnt 3425 3747 Pnt 2593 3745 Pnt 3000 3745 Pnt 2723 3736 Pnt 3418 2604 Pnt 2976 3760 Pnt 2298 3793 Pnt 2841 3748 Pnt 2845 3742 Pnt 2789 3736 Pnt 2703 3749 Pnt 2549 3760 Pnt 2472 3740 Pnt 3021 3763 Pnt 2932 3744 Pnt 2570 3755 Pnt 2547 3739 Pnt 3639 3739 Pnt 2974 3744 Pnt 3180 3758 Pnt 3069 3757 Pnt 2603 3748 Pnt 3026 3750 Pnt 3075 3745 Pnt 2153 3764 Pnt 3751 3748 Pnt 2818 3747 Pnt 2566 3751 Pnt 2782 3741 Pnt 4141 3756 Pnt 2423 3739 Pnt 2623 3741 Pnt 2173 3811 Pnt 3266 3746 Pnt 2832 3746 Pnt 3941 3745 Pnt 2557 3745 Pnt 2423 3745 Pnt 2546 3748 Pnt 2718 3819 Pnt 2365 3738 Pnt 3784 3776 Pnt 2860 3748 Pnt 3051 3741 Pnt 2686 3749 Pnt 3302 3743 Pnt 2891 3752 Pnt 2893 3742 Pnt 3741 3761 Pnt 2314 3773 Pnt 2618 3762 Pnt 2949 3771 Pnt 3207 3769 Pnt 3458 3751 Pnt 3091 3747 Pnt 3243 3748 Pnt 2791 3737 Pnt 3598 2606 Pnt 2931 3761 Pnt 2576 3821 Pnt 1986 3791 Pnt 2495 3750 Pnt 2367 3737 Pnt 2246 3759 Pnt 3162 3800 Pnt 2731 3753 Pnt 2307 3810 Pnt 2775 3810 Pnt 2294 3736 Pnt 3331 3774 Pnt 2214 3765 Pnt 3294 3743 Pnt 2996 3739 Pnt 3056 3744 Pnt 2785 3766 Pnt 3346 3744 Pnt 2161 3807 Pnt 2847 3747 Pnt 2637 3750 Pnt 2506 3747 Pnt 3211 3746 Pnt 2732 3801 Pnt 2458 3750 Pnt 2258 3829 Pnt 3488 3742 Pnt 2471 3744 Pnt 2930 3746 Pnt 2855 3750 Pnt 2584 3756 Pnt 3017 3747 Pnt 2390 3747 Pnt 3207 3763 Pnt 3728 3742 Pnt 2548 3742 Pnt 2656 3755 Pnt 2408 3743 Pnt 3068 3763 Pnt 2664 3785 Pnt 2958 3744 Pnt 2683 3751 Pnt 2863 3758 Pnt 3420 3755 Pnt 2197 3759 Pnt 2852 3824 Pnt 2492 3742 Pnt 2116 3774 Pnt 3434 3751 Pnt 3216 3743 Pnt 2164 3802 Pnt 2679 3752 Pnt 2699 3786 Pnt 2429 3766 Pnt 2937 3753 Pnt 3368 3749 Pnt 2678 3749 Pnt 2702 3740 Pnt 3187 3758 Pnt 2412 3748 Pnt 2574 3736 Pnt 3696 2833 Pnt 3917 3750 Pnt 3204 3736 Pnt 2997 3757 Pnt 2643 3801 Pnt 2509 3747 Pnt 2742 3741 Pnt 2556 3763 Pnt 2656 3738 Pnt 2363 3759 Pnt 2306 3752 Pnt 3206 3747 Pnt 3172 3754 Pnt 2677 3762 Pnt 2901 3743 Pnt 2760 3737 Pnt 4053 3741 Pnt 2870 3747 Pnt 2954 3741 Pnt 3251 3742 Pnt 3818 3745 Pnt 2867 3759 Pnt 3362 3733 Pnt 4352 3754 Pnt 3165 3775 Pnt 2583 3738 Pnt 2077 3798 Pnt 2428 3738 Pnt 3422 2836 Pnt 3118 3741 Pnt 3059 3798 Pnt 3029 3738 Pnt 2444 3814 Pnt 2125 3757 Pnt 2636 3745 Pnt 2287 3740 Pnt 2418 3801 Pnt 2481 3764 Pnt 1765 3832 Pnt 2786 3741 Pnt 3856 3744 Pnt 2437 3823 Pnt 2420 3772 Pnt 3133 3742 Pnt 2133 3762 Pnt 2416 3736 Pnt 2590 3768 Pnt 2423 3779 Pnt 2296 3799 Pnt 2676 3928 Pnt 2627 3749 Pnt 2415 3792 Pnt 3132 3778 Pnt 2579 3768 Pnt 3137 3797 Pnt 3418 3770 Pnt 2482 3785 Pnt 3255 3742 Pnt 2476 3795 Pnt 2118 3778 Pnt 2998 2655 Pnt 3234 3735 Pnt 3094 3771 Pnt 4311 3742 Pnt 2645 3756 Pnt 2415 3735 Pnt 3538 3845 Pnt 2989 3739 Pnt 2824 3738 Pnt 2469 3765 Pnt 3050 3746 Pnt 2325 3744 Pnt 3142 3739 Pnt 2861 3746 Pnt 3230 3756 Pnt 3665 3748 Pnt 2631 3745 Pnt 3415 3745 Pnt 2973 3741 Pnt 3014 3743 Pnt 2861 3767 Pnt 3251 3753 Pnt 2525 3741 Pnt 2844 3752 Pnt 2049 3751 Pnt 3034 3741 Pnt 2531 3743 Pnt 2520 3798 Pnt 2862 3748 Pnt 2665 3738 Pnt 2145 3788 Pnt 2002 3736 Pnt 2511 3778 Pnt 1897 3780 Pnt 2609 3816 Pnt 3424 2925 Pnt 2680 3745 Pnt 2900 3749 Pnt 2409 3816 Pnt 3138 3745 Pnt 2848 3743 Pnt 2910 3747 Pnt 2438 3750 Pnt 3815 2707 Pnt 2313 3793 Pnt 3767 3742 Pnt 2317 3828 Pnt 2778 3754 Pnt 2675 3759 Pnt 2743 3736 Pnt 2431 3762 Pnt 2530 3750 Pnt 2714 3740 Pnt 2051 3796 Pnt 3318 3768 Pnt 4016 3751 Pnt 2331 3779 Pnt 2705 3749 Pnt 2911 3770 Pnt 2566 3741 Pnt 2863 3751 Pnt 2757 3751 Pnt 2021 3749 Pnt 2013 3825 Pnt 2615 3758 Pnt 3332 3747 Pnt 2476 3741 Pnt 2405 3776 Pnt 3204 3742 Pnt 2690 3763 Pnt 3118 3758 Pnt 3088 3761 Pnt 2680 3760 Pnt 2239 3791 Pnt 3273 3747 Pnt 3437 3912 Pnt 2973 3761 Pnt 2805 3742 Pnt 2789 3746 Pnt 2867 3743 Pnt 2911 3754 Pnt 3451 3735 Pnt 3007 3742 Pnt 2484 3809 Pnt 2723 3783 Pnt 2560 2669 Pnt 2415 3791 Pnt 2268 3766 Pnt 2914 3748 Pnt 2960 3789 Pnt 1876 3768 Pnt 2759 3791 Pnt 2330 3760 Pnt 3335 3782 Pnt 2592 3768 Pnt 3283 3789 Pnt 2745 3741 Pnt 2460 3750 Pnt 3091 3747 Pnt 2285 3794 Pnt 2822 3810 Pnt 2919 3793 Pnt 2684 3754 Pnt 2174 3775 Pnt 3457 3791 Pnt 2260 3839 Pnt 2755 3743 Pnt 2476 3794 Pnt 2610 3743 Pnt 2356 3765 Pnt 3109 3813 Pnt 2597 3750 Pnt 2378 3815 Pnt 3055 3741 Pnt 2919 3746 Pnt 2792 3749 Pnt 2912 3742 Pnt 2622 3778 Pnt 3130 3764 Pnt 2574 3757 Pnt 3054 3752 Pnt 3250 3752 Pnt 2613 3764 Pnt 2442 3789 Pnt 3386 3752 Pnt 2728 3738 Pnt 3626 3746 Pnt 2596 3756 Pnt 2285 3755 Pnt 2535 3758 Pnt 1980 3779 Pnt 3811 3758 Pnt 2990 3743 Pnt 3124 3750 Pnt 2978 3742 Pnt 2395 3752 Pnt 2464 3827 Pnt 2588 3763 Pnt 2773 3770 Pnt 2710 3746 Pnt 2848 3770 Pnt 2488 3737 Pnt 3207 3739 Pnt 2479 3749 Pnt 2940 3740 Pnt 3086 3746 Pnt 2348 3742 Pnt 2565 3746 Pnt 2690 3768 Pnt 2740 3756 Pnt 3121 3755 Pnt 3654 3756 Pnt 2097 3755 Pnt 2152 3794 Pnt 2601 3760 Pnt 2290 3820 Pnt 3112 3770 Pnt 3861 2731 Pnt 3487 3762 Pnt 2870 3746 Pnt 2785 3752 Pnt 2606 3808 Pnt 2461 3774 Pnt 2544 3747 Pnt 3349 3759 Pnt 3092 3757 Pnt 2582 3743 Pnt 2739 3753 Pnt 2766 3761 Pnt 2754 3741 Pnt 3140 3742 Pnt 3099 3741 Pnt 3003 3740 Pnt 3006 3777 Pnt 2331 3800 Pnt 2194 3755 Pnt 3079 3744 Pnt 3401 3740 Pnt 2810 3763 Pnt 2715 3752 Pnt 3192 3745 Pnt 3514 3758 Pnt 2785 3767 Pnt 2880 3741 Pnt 2937 3744 Pnt 2225 3744 Pnt 3050 3742 Pnt 2949 2705 Pnt 2705 3740 Pnt 2619 3772 Pnt 3155 3760 Pnt 2925 3747 Pnt 2533 3791 Pnt 2149 3836 Pnt 2152 3747 Pnt 2301 3789 Pnt 2926 3746 Pnt 3287 3751 Pnt 2826 3805 Pnt 2737 3781 Pnt 2446 3762 Pnt 3022 3778 Pnt 2254 3791 Pnt 2907 3746 Pnt 2693 3742 Pnt 3081 3739 Pnt 2453 3841 Pnt 2066 3790 Pnt 2162 3847 Pnt 3027 3736 Pnt 3395 3742 Pnt 3090 3743 Pnt 2082 3808 Pnt 2652 3748 Pnt 2633 3746 Pnt 3517 3827 Pnt 2093 3804 Pnt 3181 3742 Pnt 2852 3743 Pnt 2693 3747 Pnt 2923 3759 Pnt 4343 2651 Pnt 2101 3768 Pnt 2622 3732 Pnt 2616 3738 Pnt 3230 3747 Pnt 3404 3742 Pnt 3124 3736 Pnt 2846 3742 Pnt 3230 3742 Pnt 2758 3750 Pnt 3041 3741 Pnt 2680 3739 Pnt 3728 3742 Pnt 2256 3795 Pnt 4022 2647 Pnt 2893 3756 Pnt 2374 3752 Pnt 3471 3737 Pnt 4218 3795 Pnt 2732 3757 Pnt 2934 3750 Pnt 2923 2846 Pnt 2678 3741 Pnt 3048 3750 Pnt 3837 3756 Pnt 3014 3744 Pnt 3234 3762 Pnt 3463 3744 Pnt 2956 3760 Pnt 3217 3740 Pnt 2602 3824 Pnt 2759 3743 Pnt 2690 3741 Pnt 3173 3824 Pnt 3194 2673 Pnt 2859 3742 Pnt 2427 3745 Pnt 2628 3785 Pnt 3677 3745 Pnt 2916 3783 Pnt 3584 3746 Pnt 3253 3746 Pnt 2504 3737 Pnt 2539 3798 Pnt 3433 3748 Pnt 2751 3754 Pnt 3042 3741 Pnt 2509 3742 Pnt 2767 3745 Pnt 2344 3823 Pnt 4491 3771 Pnt 2919 3753 Pnt 3178 3745 Pnt 2975 3786 Pnt 3108 3747 Pnt 2709 3760 Pnt 2984 3740 Pnt 3471 2800 Pnt 2997 3739 Pnt 2477 3742 Pnt 2516 3768 Pnt 2556 3741 Pnt 3005 3755 Pnt 3656 3738 Pnt 3183 2650 Pnt 2488 3742 Pnt 2186 3739 Pnt 2123 3855 Pnt 3189 3748 Pnt 2329 3769 Pnt 2462 3731 Pnt 2772 3744 Pnt 3064 3758 Pnt 2647 3738 Pnt 2973 3752 Pnt 2948 3765 Pnt 3296 3763 Pnt 1962 3740 Pnt 2619 3753 Pnt 2612 3824 Pnt 3379 3742 Pnt 2624 3737 Pnt 2590 3740 Pnt 2962 3753 Pnt 3067 3755 Pnt 2458 3765 Pnt 2419 3750 Pnt 3585 2673 Pnt 2691 3809 Pnt 2563 3744 Pnt 2467 3799 Pnt 2942 3763 Pnt 2979 3735 Pnt 3142 3756 Pnt 2545 3747 Pnt 2978 3746 Pnt 2793 3740 Pnt 2012 3782 Pnt 2404 3831 Pnt 2532 3749 Pnt 2538 3749 Pnt 2580 3872 Pnt 2671 3781 Pnt 2407 3800 Pnt 2902 3754 Pnt 2404 3730 Pnt 2105 3800 Pnt 2940 2533 Pnt 3321 3750 Pnt 2882 3751 Pnt 2769 3745 Pnt 2773 3736 Pnt 2814 3764 Pnt 3767 3746 Pnt 2847 3743 Pnt 2571 3747 Pnt 2268 3784 Pnt 3432 2728 Pnt 2016 3764 Pnt 2097 3739 Pnt 2597 3756 Pnt 2687 3899 Pnt 2521 3738 Pnt 2142 3746 Pnt 3145 3750 Pnt 3392 3741 Pnt 2518 3756 Pnt 2607 3739 Pnt 2471 3744 Pnt 2677 3779 Pnt 2597 3749 Pnt 2536 3782 Pnt 2866 3745 Pnt 2595 3747 Pnt 2882 3773 Pnt 3661 2595 Pnt 2814 3951 Pnt 2762 3742 Pnt 3539 3745 Pnt 3083 3782 Pnt 3039 3738 Pnt 2972 3738 Pnt 1913 3771 Pnt 2660 3742 Pnt 2630 3748 Pnt 2612 3813 Pnt 2525 3755 Pnt 1972 3740 Pnt 2628 3734 Pnt 3043 3747 Pnt 2316 3800 Pnt 3578 3813 Pnt 3067 3750 Pnt 3009 3756 Pnt 2557 3747 Pnt 2917 3772 Pnt 2356 3813 Pnt 2879 3759 Pnt 2671 3747 Pnt 2303 3792 Pnt 3694 3759 Pnt 2650 3740 Pnt 3357 3747 Pnt 2570 3851 Pnt 2537 3739 Pnt 2895 2522 Pnt 2529 3741 Pnt 3163 2778 Pnt 3020 3746 Pnt 2761 3742 Pnt 3034 3747 Pnt 2339 3756 Pnt 2758 3757 Pnt 3337 3780 Pnt 2640 3761 Pnt 2565 3746 Pnt 3129 3744 Pnt 2882 3755 Pnt 3171 3755 Pnt 2455 3747 Pnt 2910 3739 Pnt 2143 3816 Pnt 2249 3748 Pnt 2492 3805 Pnt 3102 3747 Pnt 2169 3751 Pnt 2752 3761 Pnt 3011 3741 Pnt 3406 3768 Pnt 2883 3751 Pnt 2593 3740 Pnt 2282 3818 Pnt 2960 3778 Pnt 3123 3747 Pnt 2959 3745 Pnt 2645 3740 Pnt 3539 2726 Pnt 2620 3747 Pnt 2621 3754 Pnt 2540 3816 Pnt 2956 3849 Pnt 2977 3753 Pnt 2513 3800 Pnt 2988 3734 Pnt 2655 3738 Pnt 3209 3746 Pnt 2542 3741 Pnt 3219 3736 Pnt 3675 3746 Pnt 2455 3775 Pnt 3646 3753 Pnt 2128 3782 Pnt 3089 3749 Pnt 2784 3747 Pnt 2712 2853 Pnt 2838 3771 Pnt 3638 2804 Pnt 2837 3746 Pnt 2899 3752 Pnt 3468 3735 Pnt 2654 3776 Pnt 3329 3738 Pnt 3395 3744 Pnt 2652 3743 Pnt 3401 3767 Pnt 2684 2607 Pnt 2938 3765 Pnt 2548 3770 Pnt 2847 3746 Pnt 2467 3744 Pnt 2714 3738 Pnt 4024 3750 Pnt 2539 3743 Pnt 3602 3744 Pnt 2423 3760 Pnt 2468 3748 Pnt 2470 3747 Pnt 2892 3759 Pnt 2870 3790 Pnt 3789 3765 Pnt 3222 3750 Pnt 2348 3754 Pnt 2328 3846 Pnt 2941 3741 Pnt 2550 3777 Pnt 2662 3764 Pnt 2607 3764 Pnt 2874 3748 Pnt 2554 3792 Pnt 2660 3745 Pnt 2145 3755 Pnt 3562 3774 Pnt 2511 3824 Pnt 2909 3760 Pnt 1998 3796 Pnt 2416 3748 Pnt 3551 3752 Pnt 2909 3748 Pnt 2861 3749 Pnt 3067 3751 Pnt 3361 3751 Pnt 2637 3768 Pnt 2173 3801 Pnt 2922 3744 Pnt 2630 3748 Pnt 2659 3764 Pnt 2469 3744 Pnt 2021 3839 Pnt 3662 3795 Pnt 4068 3748 Pnt 2666 3778 Pnt 2910 3740 Pnt 2567 3770 Pnt 2639 3743 Pnt 3104 3748 Pnt 2554 3742 Pnt 2692 2556 Pnt 2555 3826 Pnt 2761 3806 Pnt 2130 3769 Pnt 3165 3748 Pnt 2839 3783 Pnt 2586 3764 Pnt 4178 3758 Pnt 2911 3746 Pnt 3279 3738 Pnt 3013 3765 Pnt 2161 3866 Pnt 3584 3751 Pnt 2102 3802 Pnt 3334 3743 Pnt 3243 3865 Pnt 2581 3786 Pnt 4061 2615 Pnt 3072 2817 Pnt 2718 3762 Pnt 2411 3815 Pnt 2038 3816 Pnt 2455 3744 Pnt 3458 3749 Pnt 3267 3739 Pnt 3772 3743 Pnt 2437 3738 Pnt 2488 3802 Pnt 2103 3766 Pnt 1994 3772 Pnt 3181 2605 Pnt 2510 3740 Pnt 2764 3744 Pnt 2539 3738 Pnt 3164 3740 Pnt 3188 3762 Pnt 2757 3749 Pnt 2853 3751 Pnt 2528 3743 Pnt 3484 2544 Pnt 2935 3745 Pnt 2742 3743 Pnt 3908 3745 Pnt 2646 3762 Pnt 2984 3738 Pnt 2245 3754 Pnt 2826 3807 Pnt 2468 3814 Pnt 2450 3813 Pnt 2890 3764 Pnt 3217 3813 Pnt 2421 3744 Pnt 2706 3751 Pnt 2097 3803 Pnt 3670 3739 Pnt 2524 3740 Pnt 2638 3746 Pnt 2467 3795 Pnt 2795 3746 Pnt 2906 3743 Pnt 2674 3755 Pnt 2779 3746 Pnt 3423 3755 Pnt 2091 3891 Pnt 3181 3776 Pnt 2985 3743 Pnt 2974 3738 Pnt 2141 3798 Pnt 2838 3744 Pnt 3544 3743 Pnt 2260 3752 Pnt 2550 3802 Pnt 4068 2772 Pnt 3766 3798 Pnt 2602 3791 Pnt 2311 3794 Pnt 2438 3740 Pnt 3507 3769 Pnt 3322 3794 Pnt 2813 3749 Pnt 2603 3744 Pnt 2493 3745 Pnt 2355 3866 Pnt 3355 3745 Pnt 2698 3792 Pnt 2760 3746 Pnt 3003 3739 Pnt 2219 3870 Pnt 2618 3740 Pnt 2431 3792 Pnt 3049 3741 Pnt 2686 3754 Pnt 2927 3744 Pnt 2687 3746 Pnt 2465 3754 Pnt 3090 3753 Pnt 4077 2737 Pnt 3016 3746 Pnt 3638 3744 Pnt 2762 3736 Pnt 2988 3788 Pnt 2949 3735 Pnt 2951 3743 Pnt 2408 3789 Pnt 3407 3743 Pnt 3192 3746 Pnt 2853 2671 Pnt 2200 3743 Pnt 3177 3751 Pnt 2436 3770 Pnt 3241 3768 Pnt 2681 3762 Pnt 2804 3746 Pnt 2033 3786 Pnt 2775 3751 Pnt 2538 3737 Pnt 3990 3762 Pnt 2900 3739 Pnt 2678 3792 Pnt 3099 3782 Pnt 2999 2826 Pnt 3025 3742 Pnt 2809 3744 Pnt 2330 3736 Pnt 3079 3749 Pnt 3409 3742 Pnt 2851 3747 Pnt 3116 3765 Pnt 2741 3782 Pnt 2852 3745 Pnt 2603 3742 Pnt 2959 3745 Pnt 3887 2514 Pnt 2988 3742 Pnt 3150 3750 Pnt 2793 3806 Pnt 2719 3809 Pnt 3431 3758 Pnt 2316 3744 Pnt 2928 3737 Pnt 2300 3837 Pnt 2191 3810 Pnt 2964 3782 Pnt 3376 3745 Pnt 2155 3776 Pnt 2730 3785 Pnt 2735 3750 Pnt 2013 3862 Pnt 3749 2553 Pnt 3420 3779 Pnt 2447 3746 Pnt 2715 3737 Pnt 2634 3742 Pnt 2711 3743 Pnt 3064 2792 Pnt 3007 3754 Pnt 2504 3747 Pnt 3393 3752 Pnt 3340 3734 Pnt 2994 3753 Pnt 2375 3738 Pnt 3416 3763 Pnt 2031 3736 Pnt 2602 3756 Pnt 2639 3772 Pnt 2087 3779 Pnt 4182 3740 Pnt 2464 3749 Pnt 2389 3756 Pnt 3451 3779 Pnt 2910 3746 Pnt 2280 3814 Pnt 2665 3750 Pnt 3228 3747 Pnt 2822 3746 Pnt 2021 3943 Pnt 2902 3746 Pnt 2753 3943 Pnt 2719 3756 Pnt 2027 3774 Pnt 3352 3748 Pnt 2921 3801 Pnt 2602 3757 Pnt 4074 3756 Pnt 2524 3808 Pnt 2625 3769 Pnt 3027 3755 Pnt 2682 3745 Pnt 2282 3829 Pnt 3102 2895 Pnt 3248 3758 Pnt 2948 3800 Pnt 2854 3751 Pnt 2785 3747 Pnt 2747 3792 Pnt 2628 3750 Pnt 2675 3750 Pnt 3151 3753 Pnt 2055 3784 Pnt 2629 3751 Pnt 2418 3750 Pnt 2595 3746 Pnt 3170 3740 Pnt 2629 3776 Pnt 2757 3745 Pnt 2939 3777 Pnt 2989 2658 Pnt 2506 3751 Pnt 2755 3791 Pnt 2595 3739 Pnt 3650 3755 Pnt 2938 3750 Pnt 2932 3803 Pnt 2575 3760 Pnt 2616 3762 Pnt 3219 3732 Pnt 2778 3752 Pnt 3007 3760 Pnt 2419 3827 Pnt 2407 3773 Pnt 3101 3745 Pnt 2589 3753 Pnt 2894 3740 Pnt 2126 3790 Pnt 3084 3743 Pnt 3332 3743 Pnt 4049 3760 Pnt 2598 3770 Pnt 2876 3743 Pnt 2818 3742 Pnt 2583 3808 Pnt 3169 3740 Pnt 2252 3810 Pnt 3266 3743 Pnt 2293 3760 Pnt 3320 3742 Pnt 3082 3751 Pnt 2629 3751 Pnt 3032 3748 Pnt 2646 3743 Pnt 2603 3749 Pnt 2984 2672 Pnt 3152 3763 Pnt 3390 3751 Pnt 2561 3739 Pnt 2858 3736 Pnt 3101 3739 Pnt 2478 3782 Pnt 2479 3749 Pnt 3095 2637 Pnt 2797 3747 Pnt 3598 3747 Pnt 2419 3767 Pnt 2621 3746 Pnt 2703 3759 Pnt 2787 3825 Pnt 2886 3763 Pnt 3152 3745 Pnt 2721 3740 Pnt 2676 3746 Pnt 4378 3738 Pnt 2853 3750 Pnt 3651 3805 Pnt 2852 3744 Pnt 2693 3824 Pnt 3940 3751 Pnt 2763 3748 Pnt 2065 3851 Pnt 2544 3807 Pnt 2392 3740 Pnt 2794 3737 Pnt 2070 3733 Pnt 3080 3737 Pnt 3130 3746 Pnt 4125 2776 Pnt 3645 2620 Pnt 3067 3746 Pnt 2325 3737 Pnt 3055 3748 Pnt 2420 3743 Pnt 2567 3747 Pnt 2746 3741 Pnt 3229 3741 Pnt 2965 3741 Pnt 2955 3777 Pnt 2280 3775 Pnt 2334 3777 Pnt 2551 3793 Pnt 3660 3740 Pnt 2632 3748 Pnt 3080 3748 Pnt 4013 3745 Pnt 2891 3740 Pnt 2985 3741 Pnt 2739 3772 Pnt 2013 3812 Pnt 3067 3809 Pnt 2965 3749 Pnt 2546 3750 Pnt 3128 3772 Pnt 3034 3765 Pnt 2711 3806 Pnt 3501 3745 Pnt 2920 3742 Pnt 2417 3775 Pnt 3606 3765 Pnt 2967 3752 Pnt 2654 3741 Pnt 2831 3739 Pnt 2320 3744 Pnt 3076 3750 Pnt 2359 3745 Pnt 2413 3793 Pnt 3076 3745 Pnt 2615 3746 Pnt 2686 3746 Pnt 2861 3752 Pnt 3311 3736 Pnt 3231 3755 Pnt 2314 3763 Pnt 2862 3748 Pnt 3112 3771 Pnt 2944 3758 Pnt 2067 3829 Pnt 2534 3740 Pnt 3115 3740 Pnt 2704 3750 Pnt 2591 3775 Pnt 2521 3767 Pnt 2298 3752 Pnt 3098 3748 Pnt 2619 3738 Pnt 2641 3745 Pnt 3292 3754 Pnt 2520 3736 Pnt 2666 3758 Pnt 2884 3765 Pnt 3409 3750 Pnt 3377 3767 Pnt 3627 3743 Pnt 1971 3835 Pnt 2661 2842 Pnt 2803 2606 Pnt 2564 3813 Pnt 3135 3752 Pnt 2485 3738 Pnt 3418 3762 Pnt 2920 3752 Pnt 3457 3749 Pnt 2851 3748 Pnt 2711 3745 Pnt 3647 3745 Pnt 3906 3745 Pnt 2479 3761 Pnt 3417 3754 Pnt 2846 3749 Pnt 3061 3758 Pnt 3742 3749 Pnt 2711 3749 Pnt 2515 3751 Pnt 2729 3756 Pnt 2477 3748 Pnt 3093 3761 Pnt 2926 3747 Pnt 3670 3741 Pnt 2335 3811 Pnt 2809 3759 Pnt 3391 3741 Pnt 3370 3750 Pnt 2876 3746 Pnt 2966 3740 Pnt 3133 3749 Pnt 3124 2587 Pnt 3791 2858 Pnt 2908 3758 Pnt 2861 3751 Pnt 2520 3758 Pnt 3508 3752 Pnt 2748 3755 Pnt 2463 3747 Pnt 2698 3752 Pnt 2389 3748 Pnt 2061 3844 Pnt 3034 3747 Pnt 2415 3752 Pnt 2737 3740 Pnt 2602 3746 Pnt 2597 3753 Pnt 3836 3753 Pnt 2736 3812 Pnt 3007 3783 Pnt 3406 3783 Pnt 2244 3744 Pnt 2687 3739 Pnt 2845 3748 Pnt 2662 3741 Pnt 3047 3829 Pnt 3115 3745 Pnt 3585 2840 Pnt 2899 3743 Pnt 2627 3747 Pnt 3061 3744 Pnt 2640 3741 Pnt 3038 3747 Pnt 3462 3743 Pnt 2614 3755 Pnt 2292 3742 Pnt 2421 3748 Pnt 3031 3749 Pnt 2903 3753 Pnt 2278 3793 Pnt 2214 3884 Pnt 2930 3747 Pnt 2552 3799 Pnt 3045 3741 Pnt 2076 3757 Pnt 3008 3748 Pnt 2220 3812 Pnt 2454 3762 Pnt 3273 3747 Pnt 3149 3747 Pnt 2933 3736 Pnt 2732 3757 Pnt 2556 3743 Pnt 2872 3744 Pnt 2746 3938 Pnt 2756 3755 Pnt 2495 3737 Pnt 2649 3855 Pnt 3908 3745 Pnt 3071 3754 Pnt 2887 3855 Pnt 2730 3773 Pnt 2134 3759 Pnt 2601 3758 Pnt 3625 3753 Pnt 2482 3747 Pnt 3105 3771 Pnt 3272 3751 Pnt 2315 3747 Pnt 3262 3835 Pnt 3181 3762 Pnt 3770 3743 Pnt 2755 3763 Pnt 2363 3752 Pnt 2912 3738 Pnt 2330 3810 Pnt 2977 3746 Pnt 2649 3759 Pnt 2610 3765 Pnt 2167 3832 Pnt 2641 3763 Pnt 2676 2711 Pnt 2655 3744 Pnt 2363 3814 Pnt 2520 3809 Pnt 2395 3818 Pnt 2722 3742 Pnt 3652 3809 Pnt 2809 3807 Pnt 2767 3781 Pnt 2374 3761 Pnt 2760 3758 Pnt 2505 3750 Pnt 2922 3735 Pnt 2841 3766 Pnt 3162 3752 Pnt 3115 3739 Pnt 2241 3807 Pnt 2720 3741 Pnt 2872 3766 Pnt 2840 3760 Pnt 3111 3742 Pnt 2744 3740 Pnt 2821 3752 Pnt 3616 2494 Pnt 2504 3744 Pnt 2864 3743 Pnt 3147 3753 Pnt 2862 3747 Pnt 2452 3737 Pnt 2695 3752 Pnt 2796 3740 Pnt 2614 3770 Pnt 2812 3750 Pnt 2260 3740 Pnt 3049 3752 Pnt 2589 3741 Pnt 2651 3751 Pnt 2896 3747 Pnt 2143 3818 Pnt 2423 3751 Pnt 2280 3771 Pnt 3478 3741 Pnt 2422 3819 Pnt 2904 3747 Pnt 2666 2744 Pnt 2654 3740 Pnt 2687 3747 Pnt 2380 3757 Pnt 3514 3747 Pnt 2946 3748 Pnt 2838 3744 Pnt 3041 3784 Pnt 4002 3748 Pnt 2723 3738 Pnt 2946 3740 Pnt 3106 3753 Pnt 2767 3815 Pnt 2889 3775 Pnt 2568 3780 Pnt 2358 3783 Pnt 2493 3783 Pnt 2785 3815 Pnt 2238 3773 Pnt 3177 3748 Pnt 2642 3763 Pnt 2118 3795 Pnt 2281 3777 Pnt 2985 3759 Pnt 3176 3752 Pnt 2700 3751 Pnt 3272 3752 Pnt 2964 3752 Pnt 3320 3750 Pnt 2838 3749 Pnt 2612 2874 Pnt 2798 3830 Pnt 3903 3742 Pnt 2840 3742 Pnt 2994 3751 Pnt 3190 3752 Pnt 2832 3767 Pnt 2433 3755 Pnt 2989 3745 Pnt 2607 3761 Pnt 3120 3749 Pnt 3017 3751 Pnt 2469 3750 Pnt 2600 3750 Pnt 2369 3901 Pnt 2826 3751 Pnt 3361 3749 Pnt 3273 2731 Pnt 3200 3750 Pnt 2739 3752 Pnt 2436 3760 Pnt 3447 3755 Pnt 2660 3739 Pnt 3098 3760 Pnt 3514 3768 Pnt 3642 3772 Pnt 3964 3750 Pnt 3041 3744 Pnt 3273 3815 Pnt 2715 3768 Pnt 3201 3744 Pnt 3347 3743 Pnt 2814 3756 Pnt 2664 3757 Pnt 3489 3765 Pnt 2771 3749 Pnt 3088 2533 Pnt 2878 3744 Pnt 2977 3745 Pnt 3788 2663 Pnt 3418 3765 Pnt 2286 3771 Pnt 2941 3753 Pnt 2501 3767 Pnt 2403 3876 Pnt 2757 3743 Pnt 2585 3771 Pnt 2953 3753 Pnt 2927 3754 Pnt 2696 3742 Pnt 3888 3767 Pnt 2873 3767 Pnt 3188 3745 Pnt 2932 3754 Pnt 2697 3741 Pnt 3399 3762 Pnt 2867 3820 Pnt 2073 3807 Pnt 3271 3749 Pnt 3217 3745 Pnt 2645 3756 Pnt 2743 3738 Pnt 2057 3797 Pnt 2607 3756 Pnt 2184 3817 Pnt 2993 3750 Pnt 2218 3803 Pnt 3276 3750 Pnt 2643 3747 Pnt 3007 3744 Pnt 2507 3746 Pnt 2799 3764 Pnt 2953 3736 Pnt 2436 3761 Pnt 3013 3817 Pnt 3228 2504 Pnt 2528 3793 Pnt 2524 3756 Pnt 3054 3817 Pnt 2859 3744 Pnt 3293 2641 Pnt 2726 3804 Pnt 2682 3743 Pnt 2365 3867 Pnt 3312 3754 Pnt 2910 3759 Pnt 2686 3781 Pnt 2565 3868 Pnt 3025 3739 Pnt 2589 3747 Pnt 2642 3817 Pnt 3063 3740 Pnt 2763 3746 Pnt 2571 3759 Pnt 3139 2606 Pnt 2875 3743 Pnt 2484 3767 Pnt 3445 2713 Pnt 3287 3745 Pnt 3611 3752 Pnt 3128 3741 Pnt 2713 3784 Pnt 2710 3777 Pnt 3816 3754 Pnt 3012 3751 Pnt 2662 3809 Pnt 3269 2646 Pnt 3066 3770 Pnt 2644 3754 Pnt 2642 3749 Pnt 2309 3754 Pnt 3536 3755 Pnt 2973 3742 Pnt 2810 3754 Pnt 3058 3741 Pnt 2996 3741 Pnt 3732 3768 Pnt 2978 3737 Pnt 3147 3744 Pnt 2750 3740 Pnt 2817 3754 Pnt 2177 3773 Pnt 2505 3746 Pnt 2269 3806 Pnt 3395 3736 Pnt 2255 3762 Pnt 3557 3740 Pnt 3226 3746 Pnt 2782 3740 Pnt 2474 3746 Pnt 2740 3746 Pnt 2422 3796 Pnt 2877 3760 Pnt 2803 3746 Pnt 3088 3762 Pnt 2437 3796 Pnt 2861 3744 Pnt 2580 3808 Pnt 3441 3755 Pnt 2137 3777 Pnt 2632 3757 Pnt 2154 3804 Pnt 1968 3778 Pnt 3344 3778 Pnt 2741 3753 Pnt 2407 3774 Pnt 2557 3757 Pnt 2770 3804 Pnt 2482 3771 Pnt 2368 3774 Pnt 2951 3755 Pnt 2549 3752 Pnt 2574 3740 Pnt 2127 3776 Pnt 2259 3794 Pnt 2627 3752 Pnt 2501 3743 Pnt 2668 3743 Pnt 2679 3738 Pnt 2872 3750 Pnt 2413 3798 Pnt 2738 3793 Pnt 3352 3750 Pnt 2653 3735 Pnt 2985 3740 Pnt 2401 3741 Pnt 3133 3741 Pnt 2497 3742 Pnt 2146 3746 Pnt 2073 3793 Pnt 3534 3787 Pnt 2822 3741 Pnt 3484 3735 Pnt 2180 3778 Pnt 2897 3744 Pnt 2473 3739 Pnt 2626 3747 Pnt 2624 3778 Pnt 2640 3752 Pnt 3344 3743 Pnt 2561 3789 Pnt 2218 3924 Pnt 2818 3779 Pnt 3767 2637 Pnt 3209 2641 Pnt 2697 3743 Pnt 2431 3739 Pnt 2549 3741 Pnt 3280 3746 Pnt 3549 3751 Pnt 3395 3736 Pnt 3348 3758 Pnt 2865 3749 Pnt 3566 3752 Pnt 2634 3755 Pnt 2693 3732 Pnt 2204 3820 Pnt 2829 3749 Pnt 2828 3800 Pnt 2640 3760 Pnt 3636 3741 Pnt 3172 3755 Pnt 2841 3861 Pnt 2773 3741 Pnt 2473 3809 Pnt 1810 3797 Pnt 3309 3761 Pnt 2649 3797 Pnt 2416 3733 Pnt 3153 3793 Pnt 2394 3758 Pnt 2625 3736 Pnt 3234 3739 Pnt 2776 3740 Pnt 3318 3757 Pnt 3043 3763 Pnt 2408 3753 Pnt 2893 3751 Pnt 3131 3755 Pnt 3334 3753 Pnt 2572 3755 Pnt 2547 3790 Pnt 2709 3804 Pnt 2854 3754 Pnt 3580 3753 Pnt 3241 3744 Pnt 3576 3760 Pnt 3550 3740 Pnt 2535 3748 Pnt 2736 3800 Pnt 2450 3748 Pnt 2550 3747 Pnt 2380 3739 Pnt 3065 3756 Pnt 2766 3744 Pnt 2607 3736 Pnt 2667 3742 Pnt 2734 3744 Pnt 2315 3800 Pnt 3225 3758 Pnt 4091 2509 Pnt 2724 3762 Pnt 2208 3791 Pnt 2896 3800 Pnt 2925 3740 Pnt 3140 3763 Pnt 3424 3791 Pnt 2929 3745 Pnt 2615 3765 Pnt 2210 3799 Pnt 2287 3742 Pnt 3399 3769 Pnt 2545 3740 Pnt 3097 3744 Pnt 2144 3750 Pnt 4034 3748 Pnt 2085 3827 Pnt 3138 3769 Pnt 2271 3748 Pnt 2689 3742 Pnt 2570 3747 Pnt 3059 3763 Pnt 2306 3756 Pnt 3109 3745 Pnt 2783 3746 Pnt 3003 3736 Pnt 2766 3750 Pnt 2441 3809 Pnt 3113 3749 Pnt 2461 3736 Pnt 3091 3745 Pnt 2842 3758 Pnt 2838 3813 Pnt 3257 3741 Pnt 2400 3780 Pnt 2261 3793 Pnt 2399 3739 Pnt 3111 3758 Pnt 2464 3734 Pnt 3104 3749 Pnt 2966 3740 Pnt 2784 3749 Pnt 3176 2768 Pnt 2556 3748 Pnt 3147 3743 Pnt 3202 3748 Pnt 4078 2497 Pnt 2374 3746 Pnt 2862 3745 Pnt 2328 3816 Pnt 2515 3739 Pnt 2229 3764 Pnt 3200 3745 Pnt 3505 3747 Pnt 2706 3750 Pnt 2806 3754 Pnt 3835 3750 Pnt 2926 3745 Pnt 2291 3787 Pnt 2847 3751 Pnt 3772 3751 Pnt 2213 3754 Pnt 2516 3748 Pnt 2879 3793 Pnt 2749 2499 Pnt 3037 3743 Pnt 2316 3738 Pnt 3301 3751 Pnt 3005 3819 Pnt 2720 3760 Pnt 3059 3753 Pnt 2520 3754 Pnt 2987 3746 Pnt 2516 3750 Pnt 4033 3753 Pnt 3054 3751 Pnt 3254 3740 Pnt 2882 3754 Pnt 2967 3750 Pnt 2586 3813 Pnt 2456 3738 Pnt 3507 3740 Pnt 3234 3741 Pnt 2617 3749 Pnt 1990 3811 Pnt 2511 3741 Pnt 2333 3742 Pnt 3622 3742 Pnt 3186 3773 Pnt 3816 3742 Pnt 3658 3786 Pnt 2211 3749 Pnt 2799 3746 Pnt 2077 3795 Pnt 3296 3802 Pnt 2707 3744 Pnt 2095 3800 Pnt 2543 3810 Pnt 2815 3744 Pnt 2654 3821 Pnt 2666 3842 Pnt 2546 3796 Pnt 2703 3739 Pnt 2612 3737 Pnt 2729 3748 Pnt 2198 3800 Pnt 2563 3736 Pnt 3462 3742 Pnt 2610 3742 Pnt 2679 3756 Pnt 3012 3829 Pnt 3040 3753 Pnt 2715 3751 Pnt 3334 3743 Pnt 2458 3736 Pnt 3025 3755 Pnt 3062 2847 Pnt 4056 3761 Pnt 3160 3765 Pnt 3331 3747 Pnt 3432 3747 Pnt 2965 3740 Pnt 3909 3752 Pnt 2454 3750 Pnt 2308 3743 Pnt 1986 3787 Pnt 2605 3750 Pnt 2873 2700 Pnt 2882 3772 Pnt 3048 3746 Pnt 2757 3747 Pnt 2338 3750 Pnt 3127 3746 Pnt 2730 3746 Pnt 2373 3747 Pnt 2973 3825 Pnt 2926 3759 Pnt 2785 3746 Pnt 2401 3735 Pnt 2874 3753 Pnt 2721 3747 Pnt 2795 3757 Pnt 2304 3742 Pnt 2250 3801 Pnt 2542 3766 Pnt 2647 3766 Pnt 1962 3774 Pnt 3038 3801 Pnt 2238 3785 Pnt 3492 3739 Pnt 2604 3743 Pnt 2533 3752 Pnt 2474 3742 Pnt 2558 3751 Pnt 3694 3743 Pnt 3322 2700 Pnt 2775 3756 Pnt 2089 3786 Pnt 3225 3743 Pnt 1904 3776 Pnt 2882 3745 Pnt 3404 3745 Pnt 2292 3746 Pnt 3300 3761 Pnt 3460 2797 Pnt 2622 3747 Pnt 2862 3752 Pnt 2888 3756 Pnt 3276 3741 Pnt 2985 3758 Pnt 2964 3741 Pnt 4008 2860 Pnt 2917 3761 Pnt 3773 3741 Pnt 3290 3748 Pnt 3045 3743 Pnt 3595 3741 Pnt 2222 3801 Pnt 3311 3750 Pnt 2416 3748 Pnt 2117 3761 Pnt 3565 3855 Pnt 3392 3747 Pnt 2606 3763 Pnt 3972 2868 Pnt 2827 3743 Pnt 2494 3764 Pnt 3177 3742 Pnt 3096 3747 Pnt 2670 3738 Pnt 3093 3753 Pnt 3045 3761 Pnt 2976 3762 Pnt 3590 3734 Pnt 3033 3764 Pnt 3069 3761 Pnt 2741 3753 Pnt 2683 3737 Pnt 3253 3747 Pnt 2650 3764 Pnt 3047 3753 Pnt 2696 3747 Pnt 3067 3742 Pnt 2447 3742 Pnt 2419 3734 Pnt 2543 3742 Pnt 2526 3744 Pnt 2932 2678 Pnt 2695 3737 Pnt 2070 3774 Pnt 2537 3739 Pnt 2514 3748 Pnt 2629 3804 Pnt 2013 3763 Pnt 2755 3757 Pnt 3096 3751 Pnt 2616 3826 Pnt 2894 3775 Pnt 2815 3745 Pnt 2761 3769 Pnt 2599 3750 Pnt 2706 3744 Pnt 3179 3752 Pnt 2943 3766 Pnt 2800 3812 Pnt 3056 3748 Pnt 3299 3766 Pnt 2864 2918 Pnt 2210 3811 Pnt 3120 3748 Pnt 2822 3736 Pnt 2364 3904 Pnt 2375 3799 Pnt 2987 3741 Pnt 2287 3850 Pnt 2548 3774 Pnt 2280 3744 Pnt 2853 3749 Pnt 2552 3737 Pnt 2907 3758 Pnt 2868 3757 Pnt 2487 3807 Pnt 3327 3850 Pnt 2530 3743 Pnt 3082 3745 Pnt 3066 3766 Pnt 2326 3812 Pnt 2891 3747 Pnt 2786 3740 Pnt 2466 3759 Pnt 2590 3796 Pnt 2834 3735 Pnt 2086 3759 Pnt 2034 3784 Pnt 2468 3749 Pnt 3248 3796 Pnt 2416 3756 Pnt 1980 3807 Pnt 2189 3852 Pnt 3217 3748 Pnt 2841 3742 Pnt 2277 3766 Pnt 2820 3735 Pnt 2752 3741 Pnt 2490 3798 Pnt 2541 3766 Pnt 2469 3749 Pnt 2933 3749 Pnt 2659 3754 Pnt 2084 3807 Pnt 3703 3798 Pnt 2578 3767 Pnt 2235 3778 Pnt 2337 3762 Pnt 2455 3746 Pnt 2095 3806 Pnt 3485 3746 Pnt 2906 3742 Pnt 2599 3753 Pnt 2431 3795 Pnt 2693 3753 Pnt 3221 3745 Pnt 2705 3747 Pnt 3326 3741 Pnt 2664 3746 Pnt 2022 3822 Pnt 2043 3823 Pnt 3168 3754 Pnt 2150 3778 Pnt 2889 3765 Pnt 2264 3785 Pnt 3060 3829 Pnt 2446 3776 Pnt 2640 3768 Pnt 1909 3845 Pnt 2697 3743 Pnt 3506 3735 Pnt 2672 3739 Pnt 3842 3845 Pnt 2382 3735 Pnt 2805 3928 Pnt 3592 3751 Pnt 2479 3765 Pnt 2149 3776 Pnt 2633 3741 Pnt 3535 3743 Pnt 2734 3758 Pnt 2948 3744 Pnt 2949 3754 Pnt 2741 3754 Pnt 2615 3750 Pnt 2862 3742 Pnt 3393 3744 Pnt 2766 3744 Pnt 2443 3754 Pnt 2550 3824 Pnt 3147 3742 Pnt 4013 3744 Pnt 2704 3775 Pnt 2016 3772 Pnt 2708 3761 Pnt 2944 3740 Pnt 2691 3827 Pnt 3321 3745 Pnt 2764 3761 Pnt 2435 3760 Pnt 2363 3793 Pnt 2738 3748 Pnt 3585 3752 Pnt 2099 3798 Pnt 2011 3791 Pnt 2724 3738 Pnt 3459 3781 Pnt 2198 3838 Pnt 2467 3794 Pnt 3097 3758 Pnt 1922 3794 Pnt 3068 3801 Pnt 2804 3755 Pnt 3540 2629 Pnt 2706 3749 Pnt 2844 3798 Pnt 2621 3741 Pnt 3037 3774 Pnt 2644 3741 Pnt 2964 3741 Pnt 2626 3736 Pnt 2247 3814 Pnt 2718 3741 Pnt 2438 3740 Pnt 2554 3741 Pnt 2993 3749 Pnt 2989 3798 Pnt 2819 3762 Pnt 2211 3757 Pnt 2801 3735 Pnt 2942 3757 Pnt 2572 3758 Pnt 2829 3750 Pnt 2915 2755 Pnt 2105 3796 Pnt 2965 3773 Pnt 2291 3850 Pnt 2600 3791 Pnt 3578 3771 Pnt 2268 3785 Pnt 2446 3818 Pnt 2260 3746 Pnt 4062 3750 Pnt 2803 3745 Pnt 2326 3841 Pnt 3414 3819 Pnt 1903 3768 Pnt 2450 3755 Pnt 3080 3749 Pnt 2282 3780 Pnt 2877 3846 Pnt 2732 3848 Pnt 2096 3783 Pnt 2092 3738 Pnt 3212 3743 Pnt 2681 3848 Pnt 2885 3755 Pnt 2631 3750 Pnt 2876 3770 Pnt 2778 3763 Pnt 2522 3775 Pnt 2250 3847 Pnt 2555 3758 Pnt 1979 3735 Pnt 2018 3779 Pnt 2503 3827 Pnt 2514 3736 Pnt 2356 3752 Pnt 2039 3738 Pnt 3654 2777 Pnt 2296 3809 Pnt 3843 3746 Pnt 2356 3743 Pnt 2442 3763 Pnt 3205 3775 Pnt 2718 3743 Pnt 2832 3739 Pnt 2610 3745 Pnt 2059 3808 Pnt 2799 3810 Pnt 2151 3767 Pnt 2804 3739 Pnt 3152 3765 Pnt 2843 3808 Pnt 2589 3739 Pnt 2759 3741 Pnt 3127 3765 Pnt 2978 3748 Pnt 2266 3785 Pnt 2696 3750 Pnt 2755 3736 Pnt 2991 3741 Pnt 3008 2734 Pnt 2987 3750 Pnt 3067 3746 Pnt 2646 3752 Pnt 3468 3740 Pnt 2692 3747 Pnt 2761 3750 Pnt 2594 3768 Pnt 3346 3740 Pnt 3156 3747 Pnt 2769 3768 Pnt 2664 3743 Pnt 2669 3760 Pnt 3056 3747 Pnt 3514 3750 Pnt 2772 3743 Pnt 2106 3842 Pnt 3082 2862 Pnt 3198 3762 Pnt 2659 3752 Pnt 2601 3763 Pnt 2105 3797 Pnt 3508 3748 Pnt 2919 3764 Pnt 2679 3762 Pnt 2504 3760 Pnt 2798 3746 Pnt 3151 3758 Pnt 3058 3756 Pnt 2763 3752 Pnt 2604 3742 Pnt 3642 3758 Pnt 2539 3742 Pnt 3124 3749 Pnt 2777 3751 Pnt 2112 3770 Pnt 3330 3742 Pnt 2165 3742 Pnt 2693 3743 Pnt 2432 3743 Pnt 3757 3748 Pnt 3010 3768 Pnt 2809 3742 Pnt 3131 3743 Pnt 3000 3750 Pnt 2263 3774 Pnt 2628 2654 Pnt 2084 3744 Pnt 2669 3755 Pnt 3147 3773 Pnt 3043 3742 Pnt 2778 3737 Pnt 2342 3746 Pnt 3409 3743 Pnt 3100 3765 Pnt 3514 3746 Pnt 2797 3747 Pnt 2987 3752 Pnt 2731 3775 Pnt 3127 3752 Pnt 2654 3767 Pnt 2689 3740 Pnt 2273 3800 Pnt 2531 3768 Pnt 2779 3742 Pnt 3015 3775 Pnt 2275 3799 Pnt 3227 3754 Pnt 2652 3746 Pnt 2976 3741 Pnt 2555 3753 Pnt 2004 3791 Pnt 3103 2862 Pnt 1974 3855 Pnt 2520 3742 Pnt 4013 3753 Pnt 3356 2639 Pnt 2888 3743 Pnt 2749 3741 Pnt 2668 3746 Pnt 3314 3750 Pnt 2612 3777 Pnt 2840 3739 Pnt 2777 3746 Pnt 2115 3798 Pnt 2997 3742 Pnt 2875 3746 Pnt 2579 3745 Pnt 2826 3737 Pnt 2373 3840 Pnt 3076 3746 Pnt 3679 2702 Pnt 3056 3740 Pnt 2639 3775 Pnt 3804 3742 Pnt 2873 3754 Pnt 2745 3826 Pnt 3208 3772 Pnt 2876 3810 Pnt 2531 3747 Pnt 2236 3853 Pnt 2324 3841 Pnt 2715 3754 Pnt 2222 3789 Pnt 2331 3739 Pnt 2419 3747 Pnt 2430 3753 Pnt 2447 3796 Pnt 2038 3836 Pnt 2119 3756 Pnt 4043 2542 Pnt 2439 3797 Pnt 2717 3748 Pnt 3263 3756 Pnt 2561 3748 Pnt 2328 3823 Pnt 2607 3742 Pnt 2764 3751 Pnt 2532 3759 Pnt 3602 2782 Pnt 4206 3758 Pnt 2409 3745 Pnt 3476 2923 Pnt 3311 3757 Pnt 2789 3805 Pnt 2677 3745 Pnt 3810 3751 Pnt 2451 3824 Pnt 3068 2781 Pnt 2591 3737 Pnt 3151 2965 Pnt 2897 3737 Pnt 2406 3735 Pnt 3226 3738 Pnt 2379 3841 Pnt 2425 3762 Pnt 3440 3797 Pnt 2835 3745 Pnt 2256 3778 Pnt 3032 3743 Pnt 3407 3749 Pnt 2101 3768 Pnt 3347 3747 Pnt 2876 3778 Pnt 2512 3777 Pnt 2484 3774 Pnt 3240 3747 Pnt 2877 3777 Pnt 2453 3742 Pnt 2617 3748 Pnt 1986 3839 Pnt 2719 3753 Pnt 2285 3748 Pnt 2075 3791 Pnt 2432 3745 Pnt 2951 3763 Pnt 3159 3742 Pnt 3058 3762 Pnt 2358 3765 Pnt 2481 3748 Pnt 3093 3745 Pnt 2646 3834 Pnt 3204 3755 Pnt 2623 3744 Pnt 3207 3746 Pnt 3183 3765 Pnt 3078 3828 Pnt 2939 3733 Pnt 2844 3736 Pnt 2835 3761 Pnt 2566 3777 Pnt 2439 3805 Pnt 2352 3730 Pnt 3443 3763 Pnt 2048 3800 Pnt 3292 2773 Pnt 2962 3751 Pnt 3841 3805 Pnt 3282 3742 Pnt 2600 3755 Pnt 3253 3750 Pnt 2825 3743 Pnt 2498 3753 Pnt 2760 3756 Pnt 2694 3750 Pnt 3816 3743 Pnt 2601 3736 Pnt 1909 3806 Pnt 2689 3755 Pnt 2930 3760 Pnt 2471 3764 Pnt 3174 3749 Pnt 2461 3823 Pnt 2687 3743 Pnt 3175 3743 Pnt 3983 2719 Pnt 2883 3821 Pnt 2685 3801 Pnt 3200 3746 Pnt 2695 3748 Pnt 2092 3800 Pnt 2870 3756 Pnt 3114 3741 Pnt 3693 2580 Pnt 2059 3733 Pnt 3243 3760 Pnt 2507 3809 Pnt 2651 3743 Pnt 3589 3746 Pnt 2104 3786 Pnt 2874 3738 Pnt 2359 3836 Pnt 2524 3773 Pnt 3579 3748 Pnt 3079 3742 Pnt 2668 3760 Pnt 2805 3742 Pnt 2808 3785 Pnt 2646 3742 Pnt 2738 3799 Pnt 3198 3738 Pnt 2721 3747 Pnt 2627 3742 Pnt 2326 3744 Pnt 2789 3783 Pnt 2958 3769 Pnt 2072 3803 Pnt 2479 3753 Pnt 2647 3751 Pnt 2863 3744 Pnt 2542 3736 Pnt 3319 3755 Pnt 3302 3746 Pnt 3278 3757 Pnt 3026 3749 Pnt 3631 3749 Pnt 2804 3741 Pnt 3313 3746 Pnt 2889 3751 Pnt 2702 3740 Pnt 2565 3742 Pnt 2940 3736 Pnt 2693 3739 Pnt 2874 3740 Pnt 2473 3742 Pnt 2916 3740 Pnt 2034 3854 Pnt 3057 3746 Pnt 2445 3747 Pnt 3437 3772 Pnt 2645 3765 Pnt 2776 3764 Pnt 3023 3763 Pnt 2582 3751 Pnt 2557 3740 Pnt 2572 3737 Pnt 3282 3767 Pnt 2560 3739 Pnt 2416 3745 Pnt 2514 3741 Pnt 2906 3750 Pnt 2321 3770 Pnt 2376 3800 Pnt 2127 3849 Pnt 1919 3782 Pnt 2231 3747 Pnt 2003 3758 Pnt 2887 3741 Pnt 2625 3781 Pnt 3256 3746 Pnt 2755 3747 Pnt 2828 3828 Pnt 2922 3739 Pnt 2630 3762 Pnt 2800 3744 Pnt 2539 3796 Pnt 3347 3754 Pnt 2980 3744 Pnt 2986 3739 Pnt 2293 3934 Pnt 2660 3757 Pnt 2777 3743 Pnt 2351 3739 Pnt 3460 3743 Pnt 2959 3753 Pnt 2632 3759 Pnt 2888 3747 Pnt 2440 3840 Pnt 3020 3872 Pnt 2451 3740 Pnt 2575 3761 Pnt 2517 3742 Pnt 3143 3742 Pnt 2669 3742 Pnt 2209 3806 Pnt 2845 3746 Pnt 2115 3797 Pnt 2436 3835 Pnt 2253 3755 Pnt 2443 3744 Pnt 3078 3745 Pnt 2640 3760 Pnt 2847 3796 Pnt 2391 3741 Pnt 2525 3743 Pnt 2535 2555 Pnt 3017 3751 Pnt 2586 3744 Pnt 2361 3775 Pnt 2280 3813 Pnt 3325 2879 Pnt 2912 3747 Pnt 2407 3802 Pnt 1908 3798 Pnt 1991 3740 Pnt 3121 3753 Pnt 2908 3743 Pnt 2600 3754 Pnt 2350 3742 Pnt 2410 3753 Pnt 3155 3748 Pnt 2725 3747 Pnt 2638 3743 Pnt 2799 3748 Pnt 2115 3839 Pnt 3303 3741 Pnt 2740 2840 Pnt 2663 3756 Pnt 2411 3747 Pnt 3033 2463 Pnt 2238 3784 Pnt 3636 3768 Pnt 2915 3756 Pnt 2291 3746 Pnt 2666 3771 Pnt 3206 3771 Pnt 2374 3778 Pnt 2760 3771 Pnt 2057 3739 Pnt 4198 3742 Pnt 3174 3747 Pnt 2902 3756 Pnt 3173 3741 Pnt 2845 3802 Pnt 3263 3750 Pnt 3082 3742 Pnt 4076 3740 Pnt 3009 3746 Pnt 3403 3735 Pnt 3048 3750 Pnt 3805 3802 Pnt 2689 3748 Pnt 2961 3755 Pnt 3003 3778 Pnt 3043 3779 Pnt 2954 3745 Pnt 2341 3742 Pnt 3765 3748 Pnt 2874 3772 Pnt 2757 3736 Pnt 2529 3744 Pnt 2978 3733 Pnt 2637 3752 Pnt 2700 3742 Pnt 2805 3752 Pnt 2761 3747 Pnt 2809 3751 Pnt 2737 3746 Pnt 2492 3746 Pnt 3686 2546 Pnt 3486 3747 Pnt 2475 3749 Pnt 3100 3739 Pnt 2499 3757 Pnt 2667 3746 Pnt 2418 3768 Pnt 2797 3770 Pnt 1914 3801 Pnt 3105 3743 Pnt 2251 3795 Pnt 2683 3743 Pnt 2486 3744 Pnt 1971 3751 Pnt 3593 3747 Pnt 3125 2755 Pnt 2755 3776 Pnt 3332 3797 Pnt 3130 3747 Pnt 3689 3741 Pnt 2698 3818 Pnt 3505 3755 Pnt 3270 3733 Pnt 2880 3751 Pnt 2888 3750 Pnt 2909 3772 Pnt 2322 3783 Pnt 2932 3758 Pnt 2812 3736 Pnt 2304 3757 Pnt 2667 3787 Pnt 3316 3783 Pnt 4151 3758 Pnt 2343 3756 Pnt 2328 3779 Pnt 2466 3744 Pnt 2373 3794 Pnt 2629 3761 Pnt 3097 2713 Pnt 2360 3816 Pnt 1969 3799 Pnt 2658 3740 Pnt 2510 3740 Pnt 3524 3754 Pnt 3106 3779 Pnt 2901 3796 Pnt 2698 3748 Pnt 3373 3753 Pnt 3212 3742 Pnt 2855 3769 Pnt 3259 3778 Pnt 2208 3786 Pnt 2331 3777 Pnt 2766 3743 Pnt 2996 3745 Pnt 2815 3764 Pnt 3372 3739 Pnt 2795 3764 Pnt 3820 3745 Pnt 2190 3769 Pnt 2753 3747 Pnt 2333 3762 Pnt 2112 3782 Pnt 2417 3806 Pnt 2956 3747 Pnt 2493 3803 Pnt 3538 3755 Pnt 2227 3815 Pnt 2984 3747 Pnt 2632 3751 Pnt 2430 3743 Pnt 2292 3754 Pnt 2585 3769 Pnt 2468 3812 Pnt 3357 2665 Pnt 3002 3743 Pnt 2225 3846 Pnt 2761 3739 Pnt 3337 3752 Pnt 2986 2795 Pnt 2672 3744 Pnt 3259 3736 Pnt 2490 3738 Pnt 2826 3741 Pnt 2216 3736 Pnt 2753 3749 Pnt 2821 3800 Pnt 2960 3756 Pnt 2557 3764 Pnt 2513 3742 Pnt 1962 3772 Pnt 2232 3780 Pnt 3301 3744 Pnt 2638 3747 Pnt 1982 3816 Pnt 2643 3792 Pnt 2869 2618 Pnt 3922 3746 Pnt 3026 3747 Pnt 2267 3737 Pnt 2980 3750 Pnt 2836 3764 Pnt 2492 3740 Pnt 2412 3758 Pnt 2555 3792 Pnt 2584 3743 Pnt 3463 3749 Pnt 3644 3742 Pnt 3312 2603 Pnt 3294 3743 Pnt 2977 3740 Pnt 2580 3748 Pnt 2769 3746 Pnt 2719 3738 Pnt 3045 3745 Pnt 2951 3770 Pnt 3052 3743 Pnt 3376 3751 Pnt 2924 3751 Pnt 2667 3759 Pnt 2941 3791 Pnt 2570 3744 Pnt 2334 3775 Pnt 3336 3753 Pnt 2606 3743 Pnt 3902 2663 Pnt 3002 3752 Pnt 2202 3826 Pnt 3405 3748 Pnt 2481 3745 Pnt 2979 3749 Pnt 2401 3766 Pnt 2594 3785 Pnt 3034 3751 Pnt 2683 3738 Pnt 2447 3739 Pnt 2085 3756 Pnt 2926 3746 Pnt 3017 3739 Pnt 2524 3750 Pnt 2261 3776 Pnt 2993 3747 Pnt 2716 3783 Pnt 2852 3759 Pnt 2757 3783 Pnt 3271 3735 Pnt 2094 3813 Pnt 3082 3750 Pnt 2546 3862 Pnt 2330 3794 Pnt 2836 3741 Pnt 2848 3749 Pnt 3338 3736 Pnt 2400 3795 Pnt 3254 2678 Pnt 2882 3751 Pnt 2645 3737 Pnt 1976 3792 Pnt 2761 3785 Pnt 3134 3747 Pnt 2026 3755 Pnt 2933 3756 Pnt 2498 3865 Pnt 3017 3753 Pnt 3388 3759 Pnt 2987 3756 Pnt 2538 3755 Pnt 2832 3824 Pnt 2658 3754 Pnt 2252 3788 Pnt 2996 3788 Pnt 2636 3779 Pnt 3183 3755 Pnt 2429 3739 Pnt 3846 3742 Pnt 2588 3755 Pnt 2402 3782 Pnt 2864 3772 Pnt 3710 2538 Pnt 2767 3743 Pnt 2761 3751 Pnt 2509 3743 Pnt 3076 3740 Pnt 2275 3768 Pnt 2555 3745 Pnt 2462 3746 Pnt 3797 3743 Pnt 2714 3746 Pnt 2659 3816 Pnt 3893 3744 Pnt 2688 3816 Pnt 2583 3744 Pnt 3244 3770 Pnt 3167 3762 Pnt 2673 3753 Pnt 2213 3746 Pnt 2876 3750 Pnt 3434 3762 Pnt 2432 3767 Pnt 2559 3797 Pnt 3054 3767 Pnt 2423 3746 Pnt 3024 3740 Pnt 2638 3774 Pnt 2927 3739 Pnt 3304 3797 Pnt 2730 3743 Pnt 3049 3776 Pnt 2069 3792 Pnt 2977 3738 Pnt 2121 3829 Pnt 2710 3760 Pnt 2723 3759 Pnt 3079 3745 Pnt 2568 3870 Pnt 3213 2683 Pnt 2714 3795 Pnt 2980 3738 Pnt 3140 3750 Pnt 2518 3749 Pnt 2584 3754 Pnt 2403 3777 Pnt 2571 3755 Pnt 3213 3753 Pnt 2686 3800 Pnt 2479 3827 Pnt 2162 3747 Pnt 3562 3743 Pnt 3528 3743 Pnt 2291 3814 Pnt 2916 3755 Pnt 2556 3756 Pnt 2579 3741 Pnt 2551 3752 Pnt 2899 3751 Pnt 2080 3786 Pnt 2833 3743 Pnt 2651 3738 Pnt 2406 3752 Pnt 1986 3891 Pnt 2944 3749 Pnt 2567 3752 Pnt 2202 3770 Pnt 2266 3805 Pnt 2482 3745 Pnt 2571 3736 Pnt 3422 3752 Pnt 3121 3743 Pnt 2569 3738 Pnt 2940 3738 Pnt 2799 3749 Pnt 2356 3810 Pnt 2659 3775 Pnt 2562 3746 Pnt 3021 3749 Pnt 3171 3749 Pnt 1962 3786 Pnt 3001 3752 Pnt 2694 3744 Pnt 2205 3739 Pnt 2904 3805 Pnt 2819 3765 Pnt 3461 3765 Pnt 3035 3741 Pnt 2577 3751 Pnt 2845 3741 Pnt 2486 3746 Pnt 2755 3745 Pnt 2688 3740 Pnt 2686 3744 Pnt 2686 3748 Pnt 2804 3745 Pnt 2006 3803 Pnt 2711 3750 Pnt 3375 3750 Pnt 2866 3748 Pnt 2365 3762 Pnt 2637 3740 Pnt 3358 3771 Pnt 2822 3824 Pnt 2941 3740 Pnt 3310 3746 Pnt 3515 3746 Pnt 3817 3736 Pnt 2927 3753 Pnt 2584 3808 Pnt 3171 3743 Pnt 2977 3744 Pnt 3949 3746 Pnt 2365 3736 Pnt 3723 3744 Pnt 2635 3812 Pnt 2882 3747 Pnt 2974 3809 Pnt 2888 3750 Pnt 2810 3833 Pnt 3619 3747 Pnt 2735 3793 Pnt 3708 3737 Pnt 2486 3782 Pnt 2418 3740 Pnt 3446 3739 Pnt 2657 3741 Pnt 2981 3754 Pnt 2235 3744 Pnt 3229 3749 Pnt 3003 3749 Pnt 2955 3754 Pnt 2436 3748 Pnt 2610 3775 Pnt 3185 3744 Pnt 2747 3744 Pnt 2743 3773 Pnt 2613 3765 Pnt 3552 3772 Pnt 2108 3744 Pnt 2560 3765 Pnt 2831 3837 Pnt 2289 3752 Pnt 2740 3745 Pnt 2728 3741 Pnt 2438 3832 Pnt 3192 3752 Pnt 2240 3810 Pnt 3025 3754 Pnt 2766 3745 Pnt 2436 3822 Pnt 2992 3810 Pnt 2844 3814 Pnt 2740 3745 Pnt 2778 3747 Pnt 2990 3750 Pnt 2751 3736 Pnt 2473 3752 Pnt 3659 3740 Pnt 2877 3803 Pnt 2698 3761 Pnt 3187 3747 Pnt 3239 3742 Pnt 2509 3741 Pnt 2752 3760 Pnt 2514 3943 Pnt 2578 3754 Pnt 2967 3745 Pnt 4004 3745 Pnt 3179 3748 Pnt 3776 3744 Pnt 2850 3748 Pnt 2562 3756 Pnt 3402 3768 Pnt 3138 3756 Pnt 2783 3749 Pnt 3030 2544 Pnt 2805 3747 Pnt 2398 3758 Pnt 3518 3768 Pnt 2513 3804 Pnt 2923 3761 Pnt 2416 3755 Pnt 3027 3757 Pnt 2872 3795 Pnt 3928 3750 Pnt 3002 3746 Pnt 2666 3733 Pnt 3507 3757 Pnt 2817 3745 Pnt 3117 3754 Pnt 3337 3746 Pnt 4074 3739 Pnt 2933 3752 Pnt 2079 3750 Pnt 3232 3762 Pnt 2699 3782 Pnt 2696 3737 Pnt 2705 3747 Pnt 2631 3783 Pnt 3441 3782 Pnt 2723 3744 Pnt 3823 2576 Pnt 2637 3759 Pnt 2251 3786 Pnt 3128 3744 Pnt 2895 3831 Pnt 2119 3790 Pnt 3214 3739 Pnt 3229 3790 Pnt 3647 3739 Pnt 2565 3756 Pnt 3109 3733 Pnt 2559 3741 Pnt 3239 3896 Pnt 3073 3757 Pnt 2413 3808 Pnt 3045 3754 Pnt 2907 3808 Pnt 2633 3750 Pnt 3008 3753 Pnt 2741 3751 Pnt 2434 3741 Pnt 3701 3750 Pnt 2692 3806 Pnt 2558 3751 Pnt 2608 3751 Pnt 2746 3749 Pnt 3041 3745 Pnt 2438 3791 Pnt 3905 3755 Pnt 2446 3832 Pnt 2536 3758 Pnt 2754 3752 Pnt 2611 3807 Pnt 3005 3747 Pnt 2067 3814 Pnt 3242 3751 Pnt 3415 3755 Pnt 2616 3741 Pnt 2904 3764 Pnt 3033 3761 Pnt 2937 3781 Pnt 2261 3818 Pnt 2515 3765 Pnt 2980 3781 Pnt 3127 3751 Pnt 2881 2662 Pnt 2974 3742 Pnt 3017 3746 Pnt 2600 3750 Pnt 2654 3825 Pnt 4077 3754 Pnt 3055 3835 Pnt 2893 3763 Pnt 2755 3740 Pnt 2525 3809 Pnt 3473 2654 Pnt 3198 3750 Pnt 3199 3766 Pnt 2337 3781 Pnt 3045 3739 Pnt 4147 2634 Pnt 2701 3741 Pnt 2548 3739 Pnt 3257 2657 Pnt 2909 3782 Pnt 3671 3740 Pnt 2459 3809 Pnt 2652 3809 Pnt 2940 3749 Pnt 3101 3739 Pnt 3008 3742 Pnt 3278 3756 Pnt 3679 3774 Pnt 2594 3866 Pnt 2652 3829 Pnt 2890 3744 Pnt 2719 3741 Pnt 3225 3775 Pnt 2742 3744 Pnt 3045 3739 Pnt 2864 3742 Pnt 2991 3751 Pnt 3811 3738 Pnt 2776 3745 Pnt 2595 3745 Pnt 2114 3831 Pnt 2699 3734 Pnt 2490 3761 Pnt 2407 3793 Pnt 2702 3831 Pnt 2929 3737 Pnt 2754 3744 Pnt 3963 2655 Pnt 2163 3755 Pnt 3284 3771 Pnt 2379 3807 Pnt 2265 3737 Pnt 3249 3819 Pnt 2665 3738 Pnt 3241 2670 Pnt 2668 3748 Pnt 2312 3742 Pnt 2763 3740 Pnt 2093 3733 Pnt 2463 3789 Pnt 2525 3738 Pnt 2787 3803 Pnt 3148 3747 Pnt 2685 3748 Pnt 3403 3784 Pnt 2328 3771 Pnt 2428 3747 Pnt 2543 3756 Pnt 2579 3742 Pnt 2691 3751 Pnt 3082 3777 Pnt 2467 3760 Pnt 2652 3748 Pnt 2335 3742 Pnt 2653 3938 Pnt 2851 3749 Pnt 3283 3760 Pnt 2590 3751 Pnt 2276 3783 Pnt 2279 3758 Pnt 2734 3747 Pnt 2022 3807 Pnt 2059 3804 Pnt 2938 3807 Pnt 3005 3737 Pnt 2815 3772 Pnt 2754 3772 Pnt 2572 3784 Pnt 2612 3750 Pnt 3243 3751 Pnt 2243 3770 Pnt 3463 3771 Pnt 2738 2396 Pnt 2882 3752 Pnt 2385 3762 Pnt 3092 3744 Pnt 2976 3744 Pnt 3227 3758 Pnt 2950 3741 Pnt 3844 3762 Pnt 2256 3763 Pnt 2840 3747 Pnt 2606 3753 Pnt 2961 3763 Pnt 2838 3772 Pnt 2265 3819 Pnt 3222 3761 Pnt 2985 3744 Pnt 3210 3748 Pnt 2734 3742 Pnt 2977 3751 Pnt 2210 3807 Pnt 2936 3748 Pnt 2750 3759 Pnt 3484 2606 Pnt 3388 3812 Pnt 2667 3740 Pnt 3307 3740 Pnt 3416 3752 Pnt 3005 3747 Pnt 2389 3749 Pnt 2614 3761 Pnt 2801 3747 Pnt 3332 3742 Pnt 2718 3764 Pnt 2729 3740 Pnt 3776 3740 Pnt 2690 3752 Pnt 3288 3754 Pnt 2515 3797 Pnt 3087 3746 Pnt 2932 3758 Pnt 2990 3741 Pnt 2966 3741 Pnt 2789 3741 Pnt 2241 3770 Pnt 3349 3747 Pnt 3388 3758 Pnt 2800 3749 Pnt 2631 3752 Pnt 2934 3747 Pnt 2982 3750 Pnt 2688 3817 Pnt 3137 3750 Pnt 2182 3755 Pnt 3383 3746 Pnt 3084 3745 Pnt 2464 3777 Pnt 2923 3745 Pnt 3029 3771 Pnt 2773 3740 Pnt 2476 3747 Pnt 3165 3752 Pnt 2666 3743 Pnt 2743 3743 Pnt 2185 3795 Pnt 2972 3752 Pnt 2536 3740 Pnt 2595 3762 Pnt 2258 3738 Pnt 2638 3755 Pnt 2936 3767 Pnt 2630 3761 Pnt 2420 3757 Pnt 2492 3756 Pnt 3487 3738 Pnt 2973 3756 Pnt 2873 3743 Pnt 2687 3788 Pnt 3000 3743 Pnt 3045 3815 Pnt 3093 3765 Pnt 3562 3752 Pnt 3156 3797 Pnt 2926 3782 Pnt 2783 2748 Pnt 2812 3836 Pnt 3486 3738 Pnt 2234 3785 Pnt 3099 3748 Pnt 3115 3836 Pnt 2379 3793 Pnt 3025 3761 Pnt 2370 3744 Pnt 2854 3745 Pnt 2649 3763 Pnt 2651 3741 Pnt 2396 3749 Pnt 3383 3745 Pnt 2809 3755 Pnt 2594 3799 Pnt 3006 3733 Pnt 2962 3737 Pnt 2419 3747 Pnt 3039 3749 Pnt 2610 3876 Pnt 3221 2793 Pnt 2473 3747 Pnt 2498 3773 Pnt 2823 3745 Pnt 2483 3749 Pnt 2362 3746 Pnt 2841 3747 Pnt 2259 3762 Pnt 2949 3748 Pnt 3059 3748 Pnt 2264 3760 Pnt 2411 3753 Pnt 3031 3748 Pnt 2634 3745 Pnt 3712 3748 Pnt 2675 3755 Pnt 2831 3746 Pnt 3210 3748 Pnt 3204 3745 Pnt 3233 3749 Pnt 2368 3748 Pnt 3295 3738 Pnt 2377 3830 Pnt 2758 3741 Pnt 3292 3767 Pnt 2638 3747 Pnt 3540 3759 Pnt 2630 3830 Pnt 2231 3834 Pnt 2451 3767 Pnt 3556 3834 Pnt 3114 3751 Pnt 2419 3811 Pnt 4260 2595 Pnt 2716 3743 Pnt 2535 3743 Pnt 2450 3749 Pnt 4069 3754 Pnt 2479 3800 Pnt 3183 2598 Pnt 3121 3758 Pnt 2894 3748 Pnt 2954 3746 Pnt 3210 3741 Pnt 2838 3764 Pnt 3268 3756 Pnt 2605 3757 Pnt 2975 2855 Pnt 2354 3781 Pnt 2631 3753 Pnt 2195 3817 Pnt 2617 3834 Pnt 3813 3741 Pnt 3000 3817 Pnt 2296 3747 Pnt 2734 3810 Pnt 3597 3748 Pnt 2836 3831 Pnt 2494 3746 Pnt 2035 3809 Pnt 2755 3775 Pnt 3506 3771 Pnt 3364 3741 Pnt 3068 3751 Pnt 3986 3835 Pnt 2529 3765 Pnt 3054 2899 Pnt 2558 3771 Pnt 3001 3752 Pnt 2758 3742 Pnt 2801 3746 Pnt 2656 3753 Pnt 2242 3743 Pnt 3014 3770 Pnt 3855 2560 Pnt 2753 3746 Pnt 2440 3773 Pnt 2376 3754 Pnt 3399 3755 Pnt 3592 3740 Pnt 3126 3753 Pnt 2584 3740 Pnt 2541 3745 Pnt 3196 3740 Pnt 2575 3741 Pnt 3495 3755 Pnt 2437 3761 Pnt 3000 3761 Pnt 2654 2608 Pnt 2541 3753 Pnt 2592 3753 Pnt 3723 3748 Pnt 2729 3761 Pnt 2947 3823 Pnt 3638 2706 Pnt 2911 3813 Pnt 2607 3752 Pnt 2789 3754 Pnt 3435 3741 Pnt 2926 3750 Pnt 3846 3743 Pnt 2418 3805 Pnt 2420 3774 Pnt 3368 3745 Pnt 2767 3752 Pnt 2295 3747 Pnt 2148 3771 Pnt 3104 3752 Pnt 2744 3750 Pnt 3050 3746 Pnt 3069 3748 Pnt 3756 3742 Pnt 2834 3769 Pnt 3260 3744 Pnt 2857 3769 Pnt 2307 3844 Pnt 3353 2804 Pnt 3416 3746 Pnt 2747 3745 Pnt 2676 3844 Pnt 3361 3736 Pnt 2794 3744 Pnt 2774 3737 Pnt 2230 3824 Pnt 2779 3738 Pnt 3157 3737 Pnt 2662 3749 Pnt 2719 3749 Pnt 3300 3738 Pnt 2948 3751 Pnt 2502 3739 Pnt 3050 3744 Pnt 3118 3739 Pnt 2406 3760 Pnt 2625 3759 Pnt 2650 3752 Pnt 2969 3750 Pnt 2889 3748 Pnt 2745 3800 Pnt 2733 3759 Pnt 2875 3752 Pnt 2299 3778 Pnt 2016 3776 Pnt 3161 3756 Pnt 3092 3742 Pnt 3037 3757 Pnt 3109 3778 Pnt 2616 3795 Pnt 2614 3750 Pnt 2316 3901 Pnt 3608 2720 Pnt 3167 3747 Pnt 3700 3748 Pnt 2944 3868 Pnt 2673 3751 Pnt 2743 3767 Pnt 2697 3749 Pnt 2539 3744 Pnt 2853 3755 Pnt 2801 2702 Pnt 3739 3737 Pnt 2482 3757 Pnt 2509 3739 Pnt 2967 3824 Pnt 4020 3759 Pnt 2244 3800 Pnt 2897 3743 Pnt 2854 3739 Pnt 2813 3757 Pnt 2350 3800 Pnt 3059 3759 Pnt 2991 3740 Pnt 2074 3800 Pnt 2934 3815 Pnt 2099 3759 Pnt 2948 3755 Pnt 2868 3744 Pnt 3722 2657 Pnt 3576 3735 Pnt 2738 3754 Pnt 2502 3754 Pnt 2485 3765 Pnt 3388 3743 Pnt 3211 3744 Pnt 2390 3747 Pnt 2804 2569 Pnt 3391 2433 Pnt 3301 3757 Pnt 2149 3776 Pnt 3318 3776 Pnt 2616 3752 Pnt 2959 3878 Pnt 2626 3752 Pnt 3137 3743 Pnt 2432 3804 Pnt 2362 3809 Pnt 2469 3784 Pnt 2246 3782 Pnt 2412 3809 Pnt 2777 3754 Pnt 2462 3797 Pnt 2321 3757 Pnt 3811 3745 Pnt 2800 3797 Pnt 3111 3754 Pnt 3042 3753 Pnt 2316 3748 Pnt 3886 3757 Pnt 3001 3754 Pnt 2698 3855 Pnt 2565 3820 Pnt 2975 3758 Pnt 2004 3806 Pnt 3694 2499 Pnt 2421 3750 Pnt 3566 3758 Pnt 2790 3742 Pnt 2510 3802 Pnt 2908 3748 Pnt 2851 3738 Pnt 2180 3810 Pnt 3106 3739 Pnt 2812 3747 Pnt 2607 3739 Pnt 2681 3739 Pnt 2589 3759 Pnt 2263 3744 Pnt 2919 3746 Pnt 3131 3768 Pnt 3871 3755 Pnt 2724 3744 Pnt 2877 3744 Pnt 2089 3750 Pnt 2712 3765 Pnt 2794 3763 Pnt 2501 3762 Pnt 3024 3751 Pnt 2863 3744 Pnt 2080 3827 Pnt 2933 3744 Pnt 3116 3744 Pnt 2901 3762 Pnt 2791 3751 Pnt 3354 3744 Pnt 2216 3791 Pnt 3073 3791 Pnt 2685 3740 Pnt 2988 3757 Pnt 3083 3749 Pnt 3521 3754 Pnt 2508 3758 Pnt 3661 2561 Pnt 3195 3769 Pnt 2130 3806 Pnt 3125 3806 Pnt 3428 3761 Pnt 2966 3786 Pnt 3166 3747 Pnt 2457 3808 Pnt 3099 3786 Pnt 1936 3801 Pnt 2710 3746 Pnt 3235 3740 Pnt 2012 3796 Pnt 2989 3746 Pnt 2061 3816 Pnt 3341 3756 Pnt 2769 3794 Pnt 2982 3745 Pnt 3786 2835 Pnt 3316 2551 Pnt 2428 3739 Pnt 2243 3775 Pnt 3013 2760 Pnt 2315 3736 Pnt 2700 3764 Pnt 2645 3803 Pnt 2586 3746 Pnt 2948 3756 Pnt 2516 3754 Pnt 2704 3744 Pnt 2272 3796 Pnt 2737 3784 Pnt 2789 3748 Pnt 3639 3745 Pnt 3914 3741 Pnt 2383 3796 Pnt 3309 3750 Pnt 2900 3758 Pnt 2869 3740 Pnt 2688 3753 Pnt 2886 3749 Pnt 2339 3793 Pnt 3683 3748 Pnt 2590 3750 Pnt 3245 3784 Pnt 2790 3743 Pnt 3308 3749 Pnt 3234 3739 Pnt 2381 3754 Pnt 3066 3748 Pnt 3202 3745 Pnt 2761 3761 Pnt 2395 3766 Pnt 2020 3778 Pnt 2575 3734 Pnt 3912 3761 Pnt 2708 3738 Pnt 2138 3777 Pnt 2950 3739 Pnt 2752 3743 Pnt 2590 3744 Pnt 2416 3757 Pnt 2642 3793 Pnt 2725 3753 Pnt 2682 3822 Pnt 3211 3746 Pnt 3032 3744 Pnt 2539 3842 Pnt 2724 3751 Pnt 3497 3759 Pnt 2576 3749 Pnt 2640 3739 Pnt 3593 3743 Pnt 2658 3758 Pnt 2563 3804 Pnt 3112 3819 Pnt 2453 3738 Pnt 3856 3739 Pnt 2643 3748 Pnt 2406 3743 Pnt 3328 3819 Pnt 2236 3801 Pnt 3061 3748 Pnt 2211 3784 Pnt 2437 3798 Pnt 2977 3744 Pnt 2566 3764 Pnt 3018 3747 Pnt 2344 3751 Pnt 2972 3743 Pnt 3143 3744 Pnt 2602 3740 Pnt 2970 3739 Pnt 2166 3797 Pnt 2414 3745 Pnt 2938 3764 Pnt 2957 3755 Pnt 2172 3793 Pnt 3360 3745 Pnt 2743 3742 Pnt 2717 3747 Pnt 2948 3813 Pnt 2107 3787 Pnt 2865 3765 Pnt 3583 3811 Pnt 2661 3754 Pnt 2599 3754 Pnt 2390 3748 Pnt 2210 3746 Pnt 2745 2713 Pnt 3088 3750 Pnt 2454 3744 Pnt 2626 3742 Pnt 2524 3803 Pnt 2781 3747 Pnt 2112 3787 Pnt 3616 3741 Pnt 2485 3738 Pnt 2471 3747 Pnt 3422 2581 Pnt 2768 3741 Pnt 2259 3778 Pnt 2821 3742 Pnt 2829 2748 Pnt 2750 3745 Pnt 2542 3744 Pnt 2571 3782 Pnt 2594 3742 Pnt 3376 3747 Pnt 2915 3746 Pnt 2113 3776 Pnt 2969 3761 Pnt 2385 3808 Pnt 2540 3740 Pnt 2830 3772 Pnt 2969 3749 Pnt 2500 3756 Pnt 2787 3762 Pnt 3748 2751 Pnt 2856 3749 Pnt 2512 3743 Pnt 2136 3785 Pnt 2107 3774 Pnt 3032 3753 Pnt 2772 3785 Pnt 3338 3733 Pnt 2282 3825 Pnt 2849 3750 Pnt 2521 3924 Pnt 2519 3755 Pnt 3394 3855 Pnt 2549 3743 Pnt 3326 3735 Pnt 2582 3754 Pnt 3925 3924 Pnt 2713 3747 Pnt 3222 3741 Pnt 2826 3743 Pnt 3039 3782 Pnt 2584 3742 Pnt 2857 3764 Pnt 2336 3749 Pnt 2401 3829 Pnt 2995 2121 Pnt 2818 3755 Pnt 3172 3765 Pnt 2604 3751 Pnt 3119 3763 Pnt 3591 3746 Pnt 2699 3739 Pnt 2424 3765 Pnt 2668 3750 Pnt 2667 3743 Pnt 3711 3740 Pnt 3105 3741 Pnt 2622 3748 Pnt 3943 2681 Pnt 2678 3742 Pnt 2633 3750 Pnt 3826 2700 Pnt 3518 3742 Pnt 3068 2573 Pnt 2571 3755 Pnt 2918 3742 Pnt 3385 2826 Pnt 2858 3763 Pnt 2445 3764 Pnt 3347 3755 Pnt 2525 3755 Pnt 3532 3752 Pnt 2524 3764 Pnt 2190 3783 Pnt 3171 3745 Pnt 3728 3751 Pnt 3115 3748 Pnt 1835 3771 Pnt 2846 3799 Pnt 2557 3763 Pnt 3017 3751 Pnt 2604 3793 Pnt 3087 3748 Pnt 1943 3790 Pnt 3142 2612 Pnt 2598 3738 Pnt 2589 3762 Pnt 2994 3741 Pnt 2477 3743 Pnt 3167 3750 Pnt 2158 3761 Pnt 2304 3826 Pnt 2829 3746 Pnt 2718 3753 Pnt 3167 3807 Pnt 2228 3738 Pnt 2333 3795 Pnt 3025 3745 Pnt 3788 3739 Pnt 2951 3757 Pnt 2759 3737 Pnt 2339 3774 Pnt 4085 3753 Pnt 2027 3808 Pnt 3055 3759 Pnt 3341 2494 Pnt 3325 3763 Pnt 2856 3780 Pnt 3539 3780 Pnt 2549 3742 Pnt 3187 3737 Pnt 2590 3742 Pnt 2613 3750 Pnt 3058 3743 Pnt 2901 3743 Pnt 1894 3799 Pnt 2921 3753 Pnt 3674 3751 Pnt 2848 3748 Pnt 2325 3803 Pnt 2071 3801 Pnt 2510 3742 Pnt 3224 3744 Pnt 2961 3737 Pnt 2962 3752 Pnt 2926 3742 Pnt 3609 3822 Pnt 2466 3785 Pnt 2477 3739 Pnt 3045 3766 Pnt 2863 3745 Pnt 2625 3753 Pnt 2846 3758 Pnt 2309 3754 Pnt 3196 3780 Pnt 3052 3766 Pnt 2472 3773 Pnt 2359 2509 Pnt 3308 3736 Pnt 3077 3755 Pnt 2768 3735 Pnt 2681 3753 Pnt 3297 3740 Pnt 2627 3743 Pnt 2752 3904 Pnt 2409 3775 Pnt 2511 3743 Pnt 3487 2533 Pnt 2690 3812 Pnt 1774 3756 Pnt 3781 3740 Pnt 2484 3736 Pnt 3072 3776 Pnt 3013 3756 Pnt 2801 3750 Pnt 3049 3750 Pnt 2582 3750 Pnt 2318 3850 Pnt 2939 3743 Pnt 2904 3741 Pnt 2700 3799 Pnt 3056 3742 Pnt 2797 3745 Pnt 2256 3774 Pnt 2880 3758 Pnt 2585 3758 Pnt 2946 3749 Pnt 2440 3744 Pnt 3836 2734 Pnt 2214 3762 Pnt 2767 3746 Pnt 3115 3749 Pnt 1939 3773 Pnt 2573 3754 Pnt 3071 3781 Pnt 2921 3780 Pnt 3386 3796 Pnt 3098 3746 Pnt 2944 3781 Pnt 2541 3793 Pnt 4413 3744 Pnt 2302 3799 Pnt 2248 3742 Pnt 2821 3757 Pnt 2217 3801 Pnt 2871 3742 Pnt 2309 3766 Pnt 2263 3745 Pnt 2708 3765 Pnt 2262 3807 Pnt 3081 3761 Pnt 2210 3758 Pnt 2885 3741 Pnt 2280 3802 Pnt 2662 3813 Pnt 2372 3757 Pnt 3069 3808 Pnt 2745 3741 Pnt 3870 3747 Pnt 2585 3798 Pnt 2603 3742 Pnt 2863 3735 Pnt 3180 3782 Pnt 2834 3746 Pnt 2473 3758 Pnt 2475 2828 Pnt 2233 3840 Pnt 2667 3794 Pnt 2657 3752 Pnt 2980 3735 Pnt 2575 3754 Pnt 3208 3759 Pnt 2527 3790 Pnt 2957 3735 Pnt 2022 3819 Pnt 2777 3754 Pnt 2454 3750 Pnt 2223 3757 Pnt 3358 3746 Pnt 2190 3833 Pnt 2482 3749 Pnt 2034 3808 Pnt 3434 3757 Pnt 3061 3825 Pnt 4068 3752 Pnt 2449 3765 Pnt 3141 3746 Pnt 2340 3810 Pnt 3097 3749 Pnt 2747 3744 Pnt 2136 3796 Pnt 2487 3800 Pnt 2545 2801 Pnt 2558 3735 Pnt 2021 3767 Pnt 2526 3750 Pnt 2143 3797 Pnt 2883 3781 Pnt 2593 3852 Pnt 2253 3738 Pnt 2807 3742 Pnt 2658 3766 Pnt 3281 3781 Pnt 2437 3825 Pnt 3129 3846 Pnt 2898 3743 Pnt 3306 3742 Pnt 2489 3846 Pnt 2504 3739 Pnt 2109 3780 Pnt 2683 3749 Pnt 2782 3749 Pnt 2792 3749 Pnt 2102 3848 Pnt 2216 3746 Pnt 3066 3741 Pnt 2684 3755 Pnt 2733 3746 Pnt 2940 3928 Pnt 2501 3746 Pnt 3248 3736 Pnt 2396 3747 Pnt 2925 3741 Pnt 1980 3772 Pnt 2944 3789 Pnt 3299 3751 Pnt 2759 2509 Pnt 2853 3743 Pnt 3170 3763 Pnt 2653 3756 Pnt 2538 3754 Pnt 2464 3777 Pnt 2653 3752 Pnt 3268 3741 Pnt 2663 3752 Pnt 2803 3746 Pnt 2368 3743 Pnt 4104 3761 Pnt 2819 3746 Pnt 2839 3747 Pnt 3332 3746 Pnt 3229 3747 Pnt 3354 3765 Pnt 2294 3741 Pnt 3290 3740 Pnt 3210 3745 Pnt 2862 2595 Pnt 2458 3752 Pnt 3215 3740 Pnt 2165 3797 Pnt 2679 3736 Pnt 2159 3789 Pnt 2891 3763 Pnt 3002 3823 Pnt 2646 3746 Pnt 3278 3746 Pnt 2857 3747 Pnt 2570 3757 Pnt 2380 3800 Pnt 3015 3748 Pnt 2999 3746 Pnt 2931 3757 Pnt 2566 3801 Pnt 2849 3735 Pnt 2400 3738 Pnt 2555 3768 Pnt 3039 3750 Pnt 3562 3747 Pnt 3108 3745 Pnt 3894 2494 Pnt 2830 3736 Pnt 2233 3785 Pnt 3524 3751 Pnt 3176 3732 Pnt 2380 3750 Pnt 2682 3829 Pnt 2769 3748 Pnt 2937 3764 Pnt 2684 3768 Pnt 2676 3743 Pnt 2896 3743 Pnt 2279 3912 Pnt 1828 3845 Pnt 2278 3752 Pnt 3326 3745 Pnt 2485 3742 Pnt 3147 3750 Pnt 3266 3912 Pnt 3142 3739 Pnt 2535 3750 Pnt 3152 3750 Pnt 2928 3747 Pnt 2714 3755 Pnt 2840 3752 Pnt 3255 3743 Pnt 2325 3760 Pnt 2618 3766 Pnt 3168 3736 Pnt 3066 3741 Pnt 2966 3743 Pnt 3251 3742 Pnt 2559 3774 Pnt 2404 3747 Pnt 2209 3800 Pnt 2785 3741 Pnt 2791 3745 Pnt 2469 3752 Pnt 2780 3741 Pnt 2770 3757 Pnt 2523 3768 Pnt 2902 3749 Pnt 2008 3735 Pnt 2899 3753 Pnt 2642 3752 Pnt 2632 3799 Pnt 2374 3759 Pnt 2612 3753 Pnt 2594 3747 Pnt 3386 3762 Pnt 3005 3740 Pnt 2866 3748 Pnt 2507 3777 Pnt 2224 3800 Pnt 2852 3768 Pnt 3834 2607 Pnt 2711 3785 Pnt 2503 3762 Pnt 2665 3740 Pnt 2780 3799 Pnt 4081 3759 Pnt 2738 3840 Pnt 3273 3840 Pnt 2368 3793 Pnt 1908 3838 Pnt 2590 3827 Pnt 2476 3742 Pnt 2345 3756 Pnt 3157 3753 Pnt 2496 3773 Pnt 3114 3752 Pnt 2960 3744 Pnt 3018 3754 Pnt 4071 3748 Pnt 3596 2615 Pnt 2962 3744 Pnt 2568 3760 Pnt 2885 2636 Pnt 2583 3798 Pnt 3059 3751 Pnt 2663 3749 Pnt 2664 3753 Pnt 3000 3740 Pnt 2856 3741 Pnt 1950 3793 Pnt 3003 3746 Pnt 2545 3789 Pnt 2216 3786 Pnt 2618 3786 Pnt 2805 3810 Pnt 2615 3745 Pnt 2651 3829 Pnt 2289 3829 Pnt 3793 3761 Pnt 2432 3737 Pnt 2150 3855 Pnt 2769 3754 Pnt 2481 3824 Pnt 2967 3775 Pnt 3443 3761 Pnt 2927 3747 Pnt 2464 3853 Pnt 2748 3737 Pnt 2894 3841 Pnt 2906 3741 Pnt 2739 3759 Pnt 2209 3785 Pnt 2508 3805 Pnt 3554 3735 Pnt 2625 3746 Pnt 2289 3788 Pnt 3821 3782 Pnt 2914 3853 Pnt 2590 3745 Pnt 2890 3853 Pnt 2644 3737 Pnt 2475 3739 Pnt 2855 3737 Pnt 2794 3758 Pnt 2885 3782 Pnt 1884 3749 Pnt 2404 3841 Pnt 2777 3762 Pnt 3520 3841 Pnt 2702 3749 Pnt 3311 3738 Pnt 3154 3749 Pnt 2551 3778 Pnt 2716 3815 Pnt 3124 3738 Pnt 2137 3817 Pnt 3044 3742 Pnt 2980 3747 Pnt 2112 3768 Pnt 2112 3791 Pnt 2814 3746 Pnt 2266 3738 Pnt 2809 3745 Pnt 2760 3777 Pnt 2860 3747 Pnt 1959 3797 Pnt 3205 3753 Pnt 2613 3774 Pnt 3485 3789 Pnt 3100 3751 Pnt 3412 3747 Pnt 3015 3762 Pnt 2354 3814 Pnt 2919 3751 Pnt 2606 3811 Pnt 2662 3745 Pnt 2638 3837 Pnt 2321 3748 Pnt 3123 3751 Pnt 2699 3743 Pnt 2267 3839 Pnt 3121 3748 Pnt 2673 3742 Pnt 2666 3738 Pnt 3511 3748 Pnt 3025 3733 Pnt 2839 3769 Pnt 2596 3749 Pnt 3027 3745 Pnt 3762 3750 Pnt 3234 2481 Pnt 3097 3745 Pnt 3008 3737 Pnt 2800 3824 Pnt 2671 3745 Pnt 3022 3754 Pnt 2509 3805 Pnt 3083 3737 Pnt 2625 3777 Pnt 2214 3821 Pnt 2630 3744 Pnt 2478 3747 Pnt 3394 3748 Pnt 2709 3744 Pnt 2565 3761 Pnt 3794 3744 Pnt 3388 3743 Pnt 1996 3818 Pnt 2804 3752 Pnt 2713 3801 Pnt 3505 2882 Pnt 2651 3775 Pnt 3087 3798 Pnt 2827 3775 Pnt 2679 3749 Pnt 3009 3744 Pnt 3932 3745 Pnt 2449 3808 Pnt 2412 3772 Pnt 3365 3759 Pnt 3872 3748 Pnt 2939 3748 Pnt 2732 3777 Pnt 3328 3746 Pnt 2705 3777 Pnt 2560 3753 Pnt 3130 3763 Pnt 2720 3737 Pnt 2400 3796 Pnt 3173 3761 Pnt 3075 3751 Pnt 3473 3761 Pnt 2976 3753 Pnt 2748 3753 Pnt 3590 3741 Pnt 2333 3806 Pnt 2185 3775 Pnt 2879 3781 Pnt 3580 3753 Pnt 3104 3753 Pnt 2472 3795 Pnt 2602 3746 Pnt 2565 3763 Pnt 3135 3749 Pnt 2251 3816 Pnt 3159 2866 Pnt 2006 3835 Pnt 3104 3743 Pnt 2514 3785 Pnt 2692 3744 Pnt 3066 3809 Pnt 2691 3738 Pnt 2626 3737 Pnt 3183 3744 Pnt 3314 2727 Pnt 2773 3763 Pnt 2210 3836 Pnt 2855 3807 Pnt 3251 3756 Pnt 2156 3796 Pnt 3036 3746 Pnt 2325 3767 Pnt 2552 3807 Pnt 2541 3796 Pnt 3419 3736 Pnt 2018 3800 Pnt 2606 3745 Pnt 3118 3747 Pnt 3077 3746 Pnt 3037 3775 Pnt 3739 2454 Pnt 2797 3740 Pnt 2978 3769 Pnt 2415 3748 Pnt 3250 3750 Pnt 2983 3748 Pnt 2885 3751 Pnt 2370 3759 Pnt 3023 3741 Pnt 3948 3751 Pnt 3437 3759 Pnt 2573 3744 Pnt 3511 3744 Pnt 2954 3745 Pnt 3796 3749 Pnt 2283 3749 Pnt 3398 3747 Pnt 3385 3751 Pnt 2993 3783 Pnt 2103 3755 Pnt 2868 3753 Pnt 2704 3742 Pnt 2756 3746 Pnt 2371 3754 Pnt 3236 3765 Pnt 2610 3749 Pnt 2945 2760 Pnt 2834 3754 Pnt 2272 3749 Pnt 2203 3770 Pnt 2973 3748 Pnt 3008 3751 Pnt 2766 3780 Pnt 2261 3755 Pnt 2828 3804 Pnt 2773 3756 Pnt 2086 3836 Pnt 2430 3770 Pnt 2769 3743 Pnt 3450 3751 Pnt 2590 3762 Pnt 2813 3787 Pnt 2411 3839 Pnt 2922 3741 Pnt 3497 3743 Pnt 2052 3756 Pnt 3018 3755 Pnt 2859 3750 Pnt 2721 3737 Pnt 2667 3756 Pnt 2510 3741 Pnt 2208 3831 Pnt 2877 3739 Pnt 2920 3748 Pnt 2805 3752 Pnt 2042 3842 Pnt 2648 3742 Pnt 1922 3782 Pnt 2774 3752 Pnt 2721 3747 Pnt 3521 3743 Pnt 2293 3747 Pnt 3065 3742 Pnt 3162 3740 Pnt 2869 3751 Pnt 2945 3761 Pnt 2685 3852 Pnt 2790 3746 Pnt 2668 3828 Pnt 2351 3772 Pnt 3320 3746 Pnt 3811 3751 Pnt 3168 2499 Pnt 2855 3744 Pnt 2285 3842 Pnt 2430 3755 Pnt 2579 3899 Pnt 3198 3802 Pnt 2679 3744 Pnt 2943 3747 Pnt 2756 3781 Pnt 2493 3750 Pnt 3170 3757 Pnt 2842 3785 Pnt 2685 3752 Pnt 2569 3739 Pnt 2309 3800 Pnt 3159 3745 Pnt 2669 3747 Pnt 2201 3745 Pnt 2380 3757 Pnt 2882 3744 Pnt 2541 3748 Pnt 3421 3757 Pnt 3411 3744 Pnt 2914 3743 Pnt 3000 3742 Pnt 2841 3762 Pnt 2528 3761 Pnt 2809 3748 Pnt 2520 3780 Pnt 2443 3736 Pnt 2829 3816 Pnt 2928 3748 Pnt 1835 3840 Pnt 3895 2631 Pnt 2544 3839 Pnt 2884 3741 Pnt 2518 3803 Pnt 2771 3761 Pnt 3447 3758 Pnt 2584 3742 Pnt 3473 3740 Pnt 2639 3740 Pnt 2455 3747 Pnt 2511 3742 Pnt 3592 3745 Pnt 2764 3756 Pnt 2876 3743 Pnt 2547 3743 Pnt 3150 3742 Pnt 2327 3800 Pnt 3572 3754 Pnt 2858 3747 Pnt 2821 3742 Pnt 3411 3735 Pnt 2387 3744 Pnt 2587 3742 Pnt 2481 3744 Pnt 2884 3772 Pnt 2189 3764 Pnt 3054 3742 Pnt 2160 3813 Pnt 2799 3746 Pnt 2162 3743 Pnt 2566 3744 Pnt 2988 3796 Pnt 2509 3740 Pnt 2878 2431 Pnt 2411 3777 Pnt 2452 3769 Pnt 3231 3796 Pnt 2283 3743 Pnt 3162 3750 Pnt 2594 3750 Pnt 2821 3769 Pnt 2807 3764 Pnt 2586 3756 Pnt 2962 3755 Pnt 2932 3748 Pnt 3004 3764 Pnt 2329 3741 Pnt 2940 3750 Pnt 2669 3747 Pnt 2717 3752 Pnt 2868 3768 Pnt 2813 3739 Pnt 3321 3738 Pnt 2435 3747 Pnt 2619 3807 Pnt 2605 3748 Pnt 2683 3815 Pnt 2693 3755 Pnt 2731 3746 Pnt 2663 3746 Pnt 2425 3743 Pnt 2030 3786 Pnt 2613 3736 Pnt 2486 3815 Pnt 2514 3756 Pnt 3792 3740 Pnt 3994 3755 Pnt 3088 3767 Pnt 3374 3742 Pnt 2395 3746 Pnt 2890 3755 Pnt 2941 3743 Pnt 4434 2910 Pnt 2766 3760 Pnt 2443 3749 Pnt 3161 2713 Pnt 2757 3751 Pnt 2830 3750 Pnt 3027 3739 Pnt 2589 3766 Pnt 2975 3748 Pnt 2427 3744 Pnt 2436 3742 Pnt 2131 3764 Pnt 2870 3743 Pnt 2657 3743 Pnt 2889 3764 Pnt 2468 3787 Pnt 2366 3769 Pnt 3255 3744 Pnt 3249 3737 Pnt 2724 3742 Pnt 3494 3784 Pnt 3454 3745 Pnt 3469 3754 Pnt 2858 3747 Pnt 2765 3806 Pnt 4130 3768 Pnt 3437 2514 Pnt 1944 3755 Pnt 3200 3820 Pnt 2861 3776 Pnt 2371 3812 Pnt 2935 3748 Pnt 3908 3758 Pnt 3191 3743 Pnt 2650 3741 Pnt 2034 3739 Pnt 2300 3818 Pnt 3634 3740 Pnt 2401 3762 Pnt 2750 3779 Pnt 2579 3753 Pnt 3080 3737 Pnt 2984 3752 Pnt 2703 3740 Pnt 3227 3755 Pnt 2302 3752 Pnt 2719 3739 Pnt 2626 3740 Pnt 2362 3756 Pnt 2645 3801 Pnt 2359 3783 Pnt 2973 3752 Pnt 3171 3755 Pnt 2666 3747 Pnt 2411 3756 Pnt 3229 3741 Pnt 2401 3766 Pnt 2422 3823 Pnt 3362 3758 Pnt 2600 3766 Pnt 2833 3777 Pnt 2282 3739 Pnt 3368 2716 Pnt 2848 3736 Pnt 3028 3746 Pnt 2436 3738 Pnt 2847 3760 Pnt 2741 3736 Pnt 2446 3794 Pnt 2137 3736 Pnt 3137 3760 Pnt 2795 3748 Pnt 2509 3754 Pnt 2945 3752 Pnt 2170 3797 Pnt 2649 3745 Pnt 2333 3800 Pnt 2661 3797 Pnt 3870 3745 Pnt 2427 3775 Pnt 2283 3766 Pnt 2022 3782 Pnt 2291 3797 Pnt 3433 3747 Pnt 2785 3764 Pnt 2040 3756 Pnt 3247 3751 Pnt 3314 3753 Pnt 2852 3785 Pnt 2326 3846 Pnt 2770 3751 Pnt 2822 3745 Pnt 3057 3744 Pnt 3247 3752 Pnt 3188 3753 Pnt 2573 3743 Pnt 2290 3817 Pnt 2934 2773 Pnt 3411 3756 Pnt 2549 3817 Pnt 3889 3741 Pnt 2473 3739 Pnt 2687 3762 Pnt 2667 3748 Pnt 3651 3747 Pnt 2678 3747 Pnt 2210 3784 Pnt 2741 3753 Pnt 2624 3757 Pnt 2840 3743 Pnt 3515 3742 Pnt 2372 3816 Pnt 3313 3757 Pnt 2768 3744 Pnt 3281 3755 Pnt 2332 3785 Pnt 2966 3737 Pnt 2534 3792 Pnt 2533 3751 Pnt 2809 3741 Pnt 2436 3799 Pnt 2643 3738 Pnt 2753 3751 Pnt 3159 2717 Pnt 2915 3763 Pnt 3958 3799 Pnt 2996 3742 Pnt 2759 3742 Pnt 2516 3788 Pnt 2705 3750 Pnt 2277 3783 Pnt 2849 3746 Pnt 2536 3755 Pnt 2977 3738 Pnt 3540 3783 Pnt 2936 3779 Pnt 3503 3755 Pnt 2778 3748 Pnt 3473 3751 Pnt 4084 3748 Pnt 3827 3749 Pnt 2364 3770 Pnt 2922 3759 Pnt 2832 3764 Pnt 2679 3746 Pnt 2817 3746 Pnt 3724 3749 Pnt 2836 3761 Pnt 2413 3815 Pnt 2761 3865 Pnt 2544 3862 Pnt 3691 3761 Pnt 3217 3810 Pnt 3230 3756 Pnt 3014 3743 Pnt 3174 3752 Pnt 2774 3753 Pnt 2516 3819 Pnt 2998 3756 Pnt 2491 3792 Pnt 2393 3824 Pnt 2455 3767 Pnt 2806 3748 Pnt 3215 3742 Pnt 2692 3741 Pnt 3807 3753 Pnt 2605 3739 Pnt 2629 3752 Pnt 3073 3768 Pnt 2805 3748 Pnt 2547 3740 Pnt 3600 3742 Pnt 2510 3751 Pnt 2701 3782 Pnt 3055 3740 Pnt 2623 3744 Pnt 3129 3739 Pnt 2760 3751 Pnt 2558 3746 Pnt 2560 3756 Pnt 2592 3738 Pnt 3290 3750 Pnt 3164 3745 Pnt 2339 3754 Pnt 2907 3884 Pnt 2546 3884 Pnt 2308 3771 Pnt 2699 3744 Pnt 3078 3745 Pnt 2808 3741 Pnt 2670 3741 Pnt 2660 3736 Pnt 3128 3743 Pnt 2849 3742 Pnt 3056 3742 Pnt 2158 3812 Pnt 2824 3743 Pnt 2469 3796 Pnt 3337 3744 Pnt 3306 3755 Pnt 2163 3786 Pnt 2480 3746 Pnt 3354 3744 Pnt 3935 2514 Pnt 2511 3799 Pnt 2474 3794 Pnt 2691 3734 Pnt 2849 3751 Pnt 3172 2642 Pnt 2734 3761 Pnt 2280 3929 Pnt 2510 3742 Pnt 2625 3738 Pnt 2748 3753 Pnt 2690 3739 Pnt 2611 3746 Pnt 2552 3743 Pnt 2440 3747 Pnt 3199 3792 Pnt 3009 3781 Pnt 3022 3740 Pnt 3195 3758 Pnt 2991 3774 Pnt 3222 3746 Pnt 3558 3781 Pnt 2648 3738 Pnt 2720 3759 Pnt 2966 3739 Pnt 3382 3737 Pnt 2853 3827 Pnt 2761 3750 Pnt 2509 3747 Pnt 2774 3743 Pnt 2955 3749 Pnt 3157 3749 Pnt 2597 3747 Pnt 3435 3745 Pnt 2607 3824 Pnt 3206 3750 Pnt 2966 3782 Pnt 2840 3762 Pnt 2565 3813 Pnt 2541 3745 Pnt 2477 3777 Pnt 2809 3743 Pnt 2645 3743 Pnt 3030 3762 Pnt 2635 3867 Pnt 2455 3733 Pnt 2208 3794 Pnt 3002 3743 Pnt 2646 3752 Pnt 2120 3867 Pnt 3383 3752 Pnt 2506 3740 Pnt 3232 3749 Pnt 2460 3826 Pnt 2952 3753 Pnt 2172 3746 Pnt 3396 3741 Pnt 2989 3740 Pnt 2450 3795 Pnt 2828 3826 Pnt 3183 3742 Pnt 2727 3746 Pnt 2513 3752 Pnt 2504 3814 Pnt 3299 3795 Pnt 2656 3742 Pnt 3351 3756 Pnt 2859 3744 Pnt 2580 3800 Pnt 1984 3888 Pnt 3097 3751 Pnt 2911 2581 Pnt 2463 3870 Pnt 2239 3812 Pnt 2984 3812 Pnt 2830 3741 Pnt 2291 3759 Pnt 2961 3749 Pnt 2744 3751 Pnt 3279 3738 Pnt 2405 3792 Pnt 3262 3750 Pnt 1993 3792 Pnt 2711 3742 Pnt 2954 3742 Pnt 3783 3742 Pnt 3792 3752 Pnt 2891 3739 Pnt 2035 3803 Pnt 3101 3760 Pnt 2746 3744 Pnt 3066 3746 Pnt 2794 3753 Pnt 3247 3743 Pnt 3882 3776 Pnt 2822 3805 Pnt 2418 3747 Pnt 1977 3770 Pnt 3339 3780 Pnt 2083 3750 Pnt 3185 3736 Pnt 2834 3741 Pnt 2410 3810 Pnt 2654 3738 Pnt 3504 3733 Pnt 2750 2305 Pnt 2463 3746 Pnt 2315 3762 Pnt 1998 3786 Pnt 2383 3778 Pnt 3102 3735 Pnt 2504 3745 Pnt 3750 3762 Pnt 2402 3741 Pnt 3122 3752 Pnt 2915 3745 Pnt 2574 3738 Pnt 2344 3748 Pnt 3586 3759 Pnt 2634 3774 Pnt 2737 3756 Pnt 2550 3737 Pnt 2842 3760 Pnt 2329 3740 Pnt 2440 3749 Pnt 3771 3742 Pnt 3405 3749 Pnt 3267 3765 Pnt 3303 3791 Pnt 2818 3746 Pnt 3635 2763 Pnt 2464 3765 Pnt 1987 3808 Pnt 2680 3740 Pnt 3783 3746 Pnt 2412 3798 Pnt 2401 3833 Pnt 2721 3746 Pnt 3065 3751 Pnt 3641 2642 Pnt 3026 3753 Pnt 2662 3733 Pnt 1921 3779 Pnt 3406 3750 Pnt 2207 3790 Pnt 3107 3733 Pnt 2963 2634 Pnt 2212 3793 Pnt 2821 3775 Pnt 2164 3744 Pnt 2681 3774 Pnt 2548 3808 Pnt 2796 3764 Pnt 3452 3749 Pnt 2764 3761 Pnt 2774 3758 Pnt 3208 3747 Pnt 2573 3771 Pnt 2056 3771 Pnt 2618 3772 Pnt 2887 2696 Pnt 2504 3747 Pnt 2049 3773 Pnt 2814 3771 Pnt 2459 3751 Pnt 2947 3747 Pnt 2627 3745 Pnt 2717 3747 Pnt 1888 3822 Pnt 3525 2834 Pnt 2865 3745 Pnt 3405 3740 Pnt 2479 3832 Pnt 3372 2409 Pnt 2990 3753 Pnt 2315 3752 Pnt 3014 3753 Pnt 2691 3754 Pnt 2219 3914 Pnt 3076 3738 Pnt 3548 3739 Pnt 2941 3754 Pnt 2854 3914 Pnt 4338 3751 Pnt 3378 3745 Pnt 2742 3763 Pnt 3242 3746 Pnt 3014 3742 Pnt 2791 3729 Pnt 3001 3757 Pnt 3168 3756 Pnt 2898 3754 Pnt 2525 3943 Pnt 2457 3802 Pnt 3253 3757 Pnt 3939 3749 Pnt 2214 3773 Pnt 2155 3780 Pnt 2655 3778 Pnt 2608 3751 Pnt 2354 3748 Pnt 2599 3757 Pnt 2541 3773 Pnt 2455 3744 Pnt 3775 2764 Pnt 3297 3768 Pnt 2993 3757 Pnt 2615 3741 Pnt 3329 3745 Pnt 2858 3748 Pnt 2386 3756 Pnt 2646 3742 Pnt 2762 3748 Pnt 3625 2573 Pnt 3179 3754 Pnt 2913 3739 Pnt 1828 3850 Pnt 2887 3755 Pnt 3274 3951 Pnt 4027 3762 Pnt 2321 3755 Pnt 3467 3754 Pnt 3413 3737 Pnt 2661 3782 Pnt 2998 3747 Pnt 2742 3807 Pnt 2671 3744 Pnt 2581 3747 Pnt 2357 3758 Pnt 3577 3755 Pnt 2776 3744 Pnt 3246 3811 Pnt 2915 3783 Pnt 2564 3804 Pnt 3209 3744 Pnt 2844 3804 Pnt 4284 3781 Pnt 3225 3748 Pnt 2855 2651 Pnt 3831 3759 Pnt 2748 3755 Pnt 2775 3738 Pnt 2635 3831 Pnt 2596 3733 Pnt 2720 3744 Pnt 2573 3749 Pnt 2483 3747 Pnt 2710 3739 Pnt 2713 3896 Pnt 2648 3814 Pnt 2420 3750 Pnt 3245 3739 Pnt 2944 3749 Pnt 2906 3756 Pnt 2597 3741 Pnt 2973 3751 Pnt 2494 3733 Pnt 2867 3737 Pnt 2743 3750 Pnt 2937 3742 Pnt 3291 3742 Pnt 3524 3743 Pnt 2307 3786 Pnt 3194 3761 Pnt 2588 3771 Pnt 3496 3759 Pnt 2580 3765 Pnt 3531 2630 Pnt 3174 3796 Pnt 3093 3752 Pnt 2583 3747 Pnt 2960 3746 Pnt 2967 3776 Pnt 2511 3751 Pnt 2929 3790 Pnt 2587 3771 Pnt 2911 3750 Pnt 2538 3751 Pnt 3015 3742 Pnt 2761 3763 Pnt 2604 3740 Pnt 2724 3743 Pnt 3090 2813 Pnt 2077 3806 Pnt 2592 3758 Pnt 3119 3743 Pnt 2668 3757 Pnt 2297 3748 Pnt 2349 3761 Pnt 4085 3742 Pnt 2841 3754 Pnt 4178 3762 Pnt 2363 3781 Pnt 2834 3829 Pnt 2891 3737 Pnt 3094 3752 Pnt 2227 3774 Pnt 2820 3753 Pnt 2568 3783 Pnt 2466 3739 Pnt 3095 3741 Pnt 3001 3748 Pnt 3428 3792 Pnt 3220 3746 Pnt 3012 3772 Pnt 2959 3756 Pnt 2657 3748 Pnt 2499 3738 Pnt 3530 3790 Pnt 3213 3782 Pnt 2601 3818 Pnt 2516 3812 Pnt 2805 3739 Pnt 2688 3752 Pnt 2734 3740 Pnt 2989 3740 Pnt 2965 3745 Pnt 2738 3745 Pnt 3270 3749 Pnt 2272 3749 Pnt 3086 3740 Pnt 3143 3745 Pnt 2252 3754 Pnt 2947 3741 Pnt 2522 3767 Pnt 3239 2533 Pnt 3157 3761 Pnt 3031 3757 Pnt 2808 3759 Pnt 2353 3832 Pnt 2731 3745 Pnt 2097 3812 Pnt 2775 3747 Pnt 2636 3776 Pnt 2701 3832 Pnt 2486 3819 Pnt 2401 3738 Pnt 2947 3818 Pnt 2571 3752 Pnt 2368 3807 Pnt 2862 3761 Pnt 2769 3735 Pnt 3010 3735 Pnt 2978 3742 Pnt 2852 3767 Pnt 2901 3745 Pnt 2502 3749 Pnt 3058 3767 Pnt 2778 3767 Pnt 2220 3789 Pnt 3207 3740 Pnt 2568 3751 Pnt 3318 3767 Pnt 3153 3803 Pnt 2407 3822 Pnt 3254 3781 Pnt 2797 3758 Pnt 3113 3744 Pnt 2964 3751 Pnt 2968 3755 Pnt 2752 3748 Pnt 3153 3752 Pnt 2155 3807 Pnt 3157 3741 Pnt 3588 3750 Pnt 3063 3736 Pnt 2842 3740 Pnt 2711 3761 Pnt 2563 3743 Pnt 3149 3773 Pnt 2716 3740 Pnt 2561 3752 Pnt 2455 3752 Pnt 2376 3750 Pnt 2730 3773 Pnt 2283 3835 Pnt 2426 3785 Pnt 4098 2586 Pnt 2598 3756 Pnt 2597 3774 Pnt 2010 3787 Pnt 3529 3747 Pnt 3206 3734 Pnt 2401 3750 Pnt 2067 3788 Pnt 3011 3817 Pnt 2930 3738 Pnt 2853 3767 Pnt 3352 2303 Pnt 2666 3737 Pnt 3341 3753 Pnt 2968 3748 Pnt 2792 3739 Pnt 3319 3751 Pnt 2848 3747 Pnt 3321 3799 Pnt 3215 3795 Pnt 2882 3738 Pnt 2478 3736 Pnt 2078 3815 Pnt 3434 3772 Pnt 3157 3750 Pnt 3174 3751 Pnt 3094 3745 Pnt 2917 3737 Pnt 2650 3759 Pnt 3459 3765 Pnt 2780 3790 Pnt 3020 3759 Pnt 2238 3934 Pnt 3865 3760 Pnt 3160 3739 Pnt 2314 3779 Pnt 2601 3744 Pnt 2792 3836 Pnt 2277 3779 Pnt 3009 3739 Pnt 3463 3757 Pnt 2678 3741 Pnt 2907 3764 Pnt 2623 3757 Pnt 3570 3771 Pnt 3193 3757 Pnt 2850 3756 Pnt 2264 3777 Pnt 2482 3747 Pnt 2913 3763 Pnt 2706 3742 Pnt 2598 3748 Pnt 2519 3804 Pnt 2774 3740 Pnt 2774 3752 Pnt 2710 3799 Pnt 3362 3738 Pnt 2921 3742 Pnt 2302 3748 Pnt 2977 3747 Pnt 3401 3742 Pnt 2649 3805 Pnt 2534 3876 Pnt 3285 3751 Pnt 2587 3743 Pnt 2126 3764 Pnt 2427 3747 Pnt 2124 3786 Pnt 4051 3746 Pnt 2520 3733 Pnt 1905 3773 Pnt 2252 3749 Pnt 2246 3785 Pnt 3842 3786 Pnt 2847 3741 Pnt 3085 3747 Pnt 2724 3748 Pnt 3002 3745 Pnt 2718 3746 Pnt 2390 3752 Pnt 2430 3763 Pnt 2593 3738 Pnt 3772 3793 Pnt 2111 3798 Pnt 2749 3744 Pnt 2589 3798 Pnt 2560 3782 Pnt 3102 3738 Pnt 2652 3748 Pnt 4126 3754 Pnt 2917 3752 Pnt 2563 3747 Pnt 3031 3753 Pnt 2780 3744 Pnt 2397 3753 Pnt 2646 3755 Pnt 2760 3767 Pnt 3107 3748 Pnt 3489 3753 Pnt 2522 3755 Pnt 3249 3755 Pnt 3140 3753 Pnt 2311 3745 Pnt 2768 3744 Pnt 2670 3750 Pnt 2184 3775 Pnt 3322 3747 Pnt 2917 3737 Pnt 3895 3743 Pnt 2587 3749 Pnt 2892 3744 Pnt 3102 3751 Pnt 3614 3747 Pnt 2324 3810 Pnt 3071 3750 Pnt 2443 3747 Pnt 3444 3752 Pnt 4154 3747 Pnt 2596 3763 Pnt 2644 3831 Pnt 2252 3797 Pnt 3949 3752 Pnt 2920 3750 Pnt 2587 3814 Pnt 3688 3766 Pnt 2114 3834 Pnt 2911 2644 Pnt 2391 3785 Pnt 3300 3764 Pnt 3924 3742 Pnt 2801 3785 Pnt 3047 3745 Pnt 3150 3756 Pnt 2675 3747 Pnt 3461 3752 Pnt 2732 3741 Pnt 2195 3749 Pnt 3005 3741 Pnt 2665 3740 Pnt 2479 3747 Pnt 2862 3751 Pnt 2579 3754 Pnt 3226 3747 Pnt 2337 3770 Pnt 2810 3749 Pnt 3536 3769 Pnt 3250 3756 Pnt 2715 3751 Pnt 3218 3743 Pnt 2971 3752 Pnt 2305 3747 Pnt 1943 3811 Pnt 3604 3761 Pnt 2794 3748 Pnt 2857 3752 Pnt 2403 3772 Pnt 2631 3751 Pnt 3813 3748 Pnt 2681 3763 Pnt 2467 3743 Pnt 2838 3744 Pnt 2888 3741 Pnt 3109 3740 Pnt 3536 3770 Pnt 2863 3749 Pnt 3923 3736 Pnt 3089 3754 Pnt 2632 3745 Pnt 2741 3738 Pnt 3976 3821 Pnt 2707 3747 Pnt 3279 2709 Pnt 2753 3805 Pnt 2682 2707 Pnt 2999 3738 Pnt 3208 3810 Pnt 3122 3743 Pnt 2283 3825 Pnt 3129 3741 Pnt 2895 3748 Pnt 3007 3743 Pnt 2822 3752 Pnt 2474 3759 Pnt 3914 3741 Pnt 3085 3835 Pnt 3912 3759 Pnt 3206 3761 Pnt 2460 3739 Pnt 2847 3743 Pnt 3184 2636 Pnt 2915 3740 Pnt 2175 3740 Pnt 3066 3743 Pnt 4083 3757 Pnt 2894 3741 Pnt 3013 3748 Pnt 3408 3750 Pnt 3474 3755 Pnt 2387 3743 Pnt 2548 3745 Pnt 2694 3755 Pnt 3061 3757 Pnt 2749 3745 Pnt 2886 3795 Pnt 2534 3765 Pnt 2405 3739 Pnt 3258 3795 Pnt 3418 3739 Pnt 2555 3771 Pnt 2124 3795 Pnt 2128 3778 Pnt 2948 3737 Pnt 2458 3772 Pnt 3040 3747 Pnt 3486 3737 Pnt 2593 3736 Pnt 2892 3737 Pnt 2568 3742 Pnt 2309 3772 Pnt 3648 3741 Pnt 2334 3835 Pnt 2460 3750 Pnt 1966 3795 Pnt 3373 3758 Pnt 3154 3743 Pnt 2629 3740 Pnt 2811 3758 Pnt 3006 3756 Pnt 2913 3739 Pnt 3289 3750 Pnt 2623 3767 Pnt 4163 3741 Pnt 4095 3756 Pnt 2903 3767 Pnt 3081 3767 Pnt 2112 3773 Pnt 3068 3764 Pnt 2998 3778 Pnt 2213 3748 Pnt 3257 3752 Pnt 3187 3751 Pnt 3236 3755 Pnt 3896 3754 Pnt 3189 3751 Pnt 2671 3757 Pnt 3259 3739 Pnt 3155 3746 Pnt 2769 3740 Pnt 3558 3755 Pnt 2227 3902 Pnt 2849 3744 Pnt 2786 3823 Pnt 2608 3813 Pnt 2589 3750 Pnt 3186 3732 Pnt 3528 3736 Pnt 2767 3769 Pnt 2638 3868 Pnt 3291 3759 Pnt 2605 3744 Pnt 3353 3744 Pnt 2129 3807 Pnt 2784 3830 Pnt 4124 3754 Pnt 3083 3744 Pnt 2994 3745 Pnt 2261 3800 Pnt 3287 3747 Pnt 2938 3757 Pnt 3782 3744 Pnt 3345 3767 Pnt 2989 3763 Pnt 3001 3745 Pnt 2829 3744 Pnt 2959 3740 Pnt 2200 3795 Pnt 3096 3765 Pnt 3772 3744 Pnt 2214 3782 Pnt 2750 3758 Pnt 2728 3785 Pnt 3417 3740 Pnt 2466 3878 Pnt 2037 3757 Pnt 1973 3838 Pnt 2719 3758 Pnt 2852 3736 Pnt 2800 3749 Pnt 3864 2720 Pnt 2648 3774 Pnt 3077 3861 Pnt 2888 3750 Pnt 2538 3861 Pnt 3240 3752 Pnt 3027 3751 Pnt 2242 3812 Pnt 3922 3734 Pnt 2451 3793 Pnt 2451 3746 Pnt 3334 3758 Pnt 2320 3826 Pnt 2588 3813 Pnt 2067 3776 Pnt 2824 3745 Pnt 3620 3760 Pnt 2655 3752 Pnt 2621 3755 Pnt 3201 3740 Pnt 2482 3764 Pnt 2442 3801 Pnt 2575 3764 Pnt 3039 3744 Pnt 3008 3771 Pnt 2535 3756 Pnt 3291 3744 Pnt 3028 3760 Pnt 3214 3777 Pnt 2383 3758 Pnt 3221 3777 Pnt 3705 3758 Pnt 2575 3762 Pnt 2162 3791 Pnt 2958 3739 Pnt 3343 3741 Pnt 2795 3786 Pnt 3045 3749 Pnt 3677 3754 Pnt 3109 3741 Pnt 3014 3755 Pnt 3256 3855 Pnt 2441 3752 Pnt 3064 3744 Pnt 2133 3737 Pnt 2767 3753 Pnt 3628 3747 Pnt 2466 3808 Pnt 3021 3755 Pnt 3981 3752 Pnt 2603 3775 Pnt 3438 3749 Pnt 2904 3737 Pnt 2792 3761 Pnt 2385 3764 Pnt 3734 3743 Pnt 2574 3770 Pnt 2182 3756 Pnt 2814 3747 Pnt 2901 3756 Pnt 3068 3759 Pnt 2493 3766 Pnt 2355 3803 Pnt 2406 3747 Pnt 3255 3770 Pnt 2595 3741 Pnt 2497 3774 Pnt 2758 3784 Pnt 2405 3738 Pnt 3078 3753 Pnt 3066 3741 Pnt 2693 3741 Pnt 3072 3745 Pnt 2887 3739 Pnt 2816 3750 Pnt 2460 3747 Pnt 3049 3737 Pnt 3315 3751 Pnt 2607 3747 Pnt 2041 3771 Pnt 3204 3733 Pnt 2856 3743 Pnt 3024 3749 Pnt 3719 3751 Pnt 2436 3796 Pnt 3094 3745 Pnt 3031 3820 Pnt 2828 3757 Pnt 2394 3751 Pnt 3048 3756 Pnt 2734 3748 Pnt 2501 3748 Pnt 2244 3783 Pnt 2783 3742 Pnt 3026 3756 Pnt 2316 3787 Pnt 2889 3761 Pnt 2134 3782 Pnt 2493 3741 Pnt 3227 3740 Pnt 2994 3744 Pnt 3658 3022 Pnt 3260 3740 Pnt 2575 3769 Pnt 3501 3748 Pnt 2165 3800 Pnt 3182 3736 Pnt 2462 2300 Pnt 2009 3844 Pnt 3635 3752 Pnt 2481 3807 Pnt 2884 3744 Pnt 2664 3787 Pnt 3918 3750 Pnt 2531 3807 Pnt 2363 3757 Pnt 3061 3747 Pnt 2987 3742 Pnt 2504 3789 Pnt 3411 3752 Pnt 3361 3756 Pnt 2395 3744 Pnt 3127 3739 Pnt 3496 3789 Pnt 3210 3747 Pnt 2495 3743 Pnt 3165 3795 Pnt 2488 3742 Pnt 3472 3746 Pnt 2741 3748 Pnt 3060 3784 Pnt 2957 3737 Pnt 2815 3747 Pnt 3424 3744 Pnt 2423 3737 Pnt 3271 3747 Pnt 2855 3749 Pnt 3199 3740 Pnt 3103 3737 Pnt 2270 3809 Pnt 2803 3748 Pnt 3174 3740 Pnt 2897 3749 Pnt 2473 3761 Pnt 2501 3747 Pnt 2097 3776 Pnt 2462 3734 Pnt 3002 3754 Pnt 2550 3798 Pnt 2728 3762 Pnt 2326 3778 Pnt 3213 3734 Pnt 3163 3744 Pnt 2652 3804 Pnt 3195 3776 Pnt 2823 3811 Pnt 2447 3764 Pnt 2274 3749 Pnt 2602 3744 Pnt 3250 3740 Pnt 2776 3738 Pnt 2491 3768 Pnt 2634 3760 Pnt 2327 3771 Pnt 2470 3743 Pnt 2188 3751 Pnt 2643 3743 Pnt 3430 3771 Pnt 3256 3743 Pnt 3005 3785 Pnt 2835 3743 Pnt 2933 3855 Pnt 4017 3738 Pnt 2679 3743 Pnt 2326 3815 Pnt 2338 3808 Pnt 3226 3740 Pnt 2400 3799 Pnt 3691 2696 Pnt 2818 3759 Pnt 2542 3822 Pnt 2425 3747 Pnt 2753 3765 Pnt 2883 3742 Pnt 2911 3747 Pnt 2882 3747 Pnt 2942 3750 Pnt 2531 3735 Pnt 2650 3739 Pnt 3018 3739 Pnt 2620 3733 Pnt 3010 3770 Pnt 2770 3757 Pnt 2234 3749 Pnt 3281 3750 Pnt 2287 3811 Pnt 1996 3797 Pnt 2071 3810 Pnt 2725 3782 Pnt 3148 3765 Pnt 2918 3753 Pnt 2657 3747 Pnt 2478 3745 Pnt 2562 3747 Pnt 3107 3754 Pnt 3239 3738 Pnt 3462 3740 Pnt 2530 3746 Pnt 3788 3740 Pnt 2141 3744 Pnt 2489 3840 Pnt 3129 2678 Pnt 2670 3750 Pnt 2144 3741 Pnt 3459 3758 Pnt 3243 3746 Pnt 3379 3765 Pnt 2479 3742 Pnt 2615 3748 Pnt 2548 3748 Pnt 3257 3751 Pnt 2626 3742 Pnt 1976 3803 Pnt 2876 3751 Pnt 3741 3752 Pnt 2950 3802 Pnt 2584 3740 Pnt 3363 3744 Pnt 3190 3741 Pnt 2595 3763 Pnt 2925 3743 Pnt 2855 3755 Pnt 3448 3747 Pnt 3806 3746 Pnt 3027 3741 Pnt 2841 2682 Pnt 2330 3762 Pnt 3739 3755 Pnt 2210 3748 Pnt 2687 2714 Pnt 3770 3759 Pnt 3274 3738 Pnt 2767 3741 Pnt 3028 3742 Pnt 2704 3748 Pnt 2941 3764 Pnt 3258 3749 Pnt 2940 3765 Pnt 2757 3748 Pnt 3973 2587 Pnt 2868 3755 Pnt 1963 3804 Pnt 3060 3800 Pnt 2806 3749 Pnt 2449 3755 Pnt 2609 3741 Pnt 2021 3800 Pnt 2286 3773 Pnt 2107 3750 Pnt 2529 3763 Pnt 2532 3744 Pnt 2932 3747 Pnt 2182 3815 Pnt 3701 3748 Pnt 2996 3780 Pnt 3538 3752 Pnt 2695 3750 Pnt 2589 3744 Pnt 2477 3748 Pnt 2970 3779 Pnt 2787 3756 Pnt 3154 3743 Pnt 3299 3761 Pnt 3258 3763 Pnt 2438 3799 Pnt 2412 3763 Pnt 2007 3748 Pnt 2850 3791 Pnt 3298 3743 Pnt 2878 3745 Pnt 3164 3744 Pnt 2210 3736 Pnt 2616 3746 Pnt 2807 3791 Pnt 2680 3744 Pnt 2551 3738 Pnt 2179 3826 Pnt 2963 3783 Pnt 3046 3741 Pnt 2507 3754 Pnt 2897 3797 Pnt 3021 3746 Pnt 3760 3826 Pnt 2706 3750 Pnt 3318 3750 Pnt 3507 3797 Pnt 2773 3758 Pnt 2697 3820 Pnt 2674 3743 Pnt 2276 3799 Pnt 3244 3807 Pnt 2343 3780 Pnt 2544 2746 Pnt 3059 3749 Pnt 3150 3749 Pnt 2722 3751 Pnt 3504 3780 Pnt 3016 3742 Pnt 3839 2489 Pnt 3012 3767 Pnt 2639 3751 Pnt 2633 3812 Pnt 2973 3751 Pnt 2296 3793 Pnt 3364 3744 Pnt 2710 3753 Pnt 2857 3743 Pnt 3265 3750 Pnt 2700 3743 Pnt 2336 3748 Pnt 2406 3753 Pnt 3112 3758 Pnt 2659 2720 Pnt 2263 3811 Pnt 2137 3820 Pnt 2547 3803 Pnt 2552 3758 Pnt 2293 3770 Pnt 2488 3744 Pnt 3061 3739 Pnt 1895 3801 Pnt 2812 3755 Pnt 2408 3759 Pnt 2673 3744 Pnt 2338 3742 Pnt 3573 3776 Pnt 2914 3763 Pnt 2081 3806 Pnt 3123 3743 Pnt 3601 3760 Pnt 2815 3749 Pnt 4065 3743 Pnt 3247 3760 Pnt 2978 3793 Pnt 2867 3736 Pnt 2711 3759 Pnt 2877 3780 Pnt 2423 3746 Pnt 2822 3748 Pnt 2798 3761 Pnt 2731 3741 Pnt 2306 3733 Pnt 3657 3741 Pnt 2773 3741 Pnt 2565 3742 Pnt 3008 3742 Pnt 3683 3745 Pnt 2158 2709 Pnt 2780 3738 Pnt 3287 3757 Pnt 2723 3796 Pnt 2275 3746 Pnt 2737 3745 Pnt 3647 3741 Pnt 2337 3798 Pnt 2684 3803 Pnt 2542 3750 Pnt 3337 3750 Pnt 2586 3748 Pnt 2211 3774 Pnt 2582 3808 Pnt 1899 3756 Pnt 3537 3756 Pnt 2437 3735 Pnt 3048 3747 Pnt 2542 3743 Pnt 2934 3801 Pnt 2624 3813 Pnt 2851 3743 Pnt 2833 3794 Pnt 2580 3807 Pnt 2223 3747 Pnt 2491 3734 Pnt 2478 3784 Pnt 3406 3741 Pnt 2422 3754 Pnt 2531 3749 Pnt 2529 3750 Pnt 3316 3746 Pnt 2525 3778 Pnt 3167 3757 Pnt 2644 3802 Pnt 2396 3829 Pnt 2088 3850 Pnt 2908 3802 Pnt 2762 3749 Pnt 2330 3757 Pnt 3252 3734 Pnt 2555 3764 Pnt 2474 3743 Pnt 2090 3798 Pnt 2854 3748 Pnt 3483 3743 Pnt 2744 3786 Pnt 3128 3747 Pnt 2461 3739 Pnt 2187 3793 Pnt 2646 3779 Pnt 2393 3739 Pnt 2990 3737 Pnt 2880 3793 Pnt 2526 3810 Pnt 3810 3747 Pnt 2312 3757 Pnt 2918 3737 Pnt 3260 3740 Pnt 2093 3757 Pnt 2929 3746 Pnt 3129 3745 Pnt 2569 3746 Pnt 2622 3794 Pnt 3332 3778 Pnt 2943 3741 Pnt 2668 3763 Pnt 2370 3740 Pnt 2644 3759 Pnt 2923 3741 Pnt 3175 3741 Pnt 2522 3794 Pnt 3130 3737 Pnt 2391 3743 Pnt 2514 3763 Pnt 3177 3742 Pnt 2680 3747 Pnt 2785 3804 Pnt 2229 3737 Pnt 2304 3904 Pnt 2646 3757 Pnt 2285 3775 Pnt 2547 3751 Pnt 3118 3744 Pnt 2846 3794 Pnt 3405 3753 Pnt 2107 3774 Pnt 2867 3745 Pnt 2473 3842 Pnt 2384 3842 Pnt 2744 3749 Pnt 3473 3771 Pnt 3115 3747 Pnt 2690 3741 Pnt 1981 3808 Pnt 2188 3749 Pnt 2578 3758 Pnt 3374 3745 Pnt 2767 3751 Pnt 2600 3812 Pnt 3020 3744 Pnt 2367 3747 Pnt 3418 3754 Pnt 2242 3735 Pnt 2675 3750 Pnt 2804 3933 Pnt 3330 2731 Pnt 2312 3762 Pnt 2148 3811 Pnt 3072 3747 Pnt 1899 3772 Pnt 3916 3747 Pnt 2810 3758 Pnt 2834 3823 Pnt 2787 3750 Pnt 3361 3768 Pnt 3565 3760 Pnt 2184 3741 Pnt 3908 2658 Pnt 3080 3751 Pnt 3038 3750 Pnt 3031 3738 Pnt 2770 3743 Pnt 2466 3746 Pnt 3018 3751 Pnt 2901 3804 Pnt 2568 3761 Pnt 2503 3750 Pnt 2447 3758 Pnt 3181 3745 Pnt 2486 3739 Pnt 2258 3744 Pnt 2678 3763 Pnt 2104 3847 Pnt 2582 3743 Pnt 2643 3740 Pnt 2285 3745 Pnt 2753 3766 Pnt 2438 3829 Pnt 2409 3781 Pnt 3149 3766 Pnt 2068 3742 Pnt 3118 3748 Pnt 2751 3758 Pnt 2425 3768 Pnt 3244 3741 Pnt 2581 3735 Pnt 3252 3784 Pnt 2738 3765 Pnt 3671 3799 Pnt 2542 3745 Pnt 3127 3846 Pnt 2490 3736 Pnt 2683 3746 Pnt 3587 3736 Pnt 3058 3744 Pnt 3263 3745 Pnt 2604 3765 Pnt 2014 3780 Pnt 2787 3846 Pnt 2417 3741 Pnt 2466 3782 Pnt 2533 3791 Pnt 2873 3819 Pnt 2340 3777 Pnt 3499 3782 Pnt 2828 3825 Pnt 3196 3736 Pnt 2553 3912 Pnt 2682 3739 Pnt 2625 3742 Pnt 2813 3748 Pnt 2987 3743 Pnt 2908 3764 Pnt 2233 3766 Pnt 3811 3749 Pnt 2925 3746 Pnt 2511 3763 Pnt 3045 3743 Pnt 2545 3761 Pnt 3089 3778 Pnt 3652 3790 Pnt 3061 2673 Pnt 2886 3752 Pnt 2645 3745 Pnt 3085 3752 Pnt 2797 3741 Pnt 2535 3782 Pnt 2844 3755 Pnt 2176 3814 Pnt 3183 3742 Pnt 1957 3842 Pnt 2601 3750 Pnt 3576 3742 Pnt 2282 3750 Pnt 2519 3755 Pnt 2512 3752 Pnt 2088 3783 Pnt 3143 3746 Pnt 2474 3756 Pnt 2984 3735 Pnt 3957 3748 Pnt 2911 3738 Pnt 2855 3762 Pnt 2918 3742 Pnt 2285 3752 Pnt 2734 3740 Pnt 2648 3744 Pnt 2256 3852 Pnt 3519 3763 Pnt 2830 3746 Pnt 3048 3762 Pnt 3114 3749 Pnt 2574 3756 Pnt 2033 3797 Pnt 3085 3784 Pnt 2361 3824 Pnt 2809 3768 Pnt 2362 3742 Pnt 3035 3784 Pnt 2892 3738 Pnt 2863 3824 Pnt 2648 3738 Pnt 2130 3924 Pnt 3485 3753 Pnt 2100 3800 Pnt 3064 3738 Pnt 2591 3748 Pnt 2650 3751 Pnt 2486 3766 Pnt 2687 3747 Pnt 2343 3772 Pnt 2829 3745 Pnt 3168 3741 Pnt 2975 3742 Pnt 2022 3745 Pnt 2725 3747 Pnt 3418 3740 Pnt 2461 3771 Pnt 2882 3755 Pnt 2002 3760 Pnt 2625 3744 Pnt 2545 3743 Pnt 2540 3825 Pnt 2940 3739 Pnt 2674 3740 Pnt 3420 3749 Pnt 2741 3744 Pnt 2527 3749 Pnt 2618 3754 Pnt 2517 3754 Pnt 2723 3800 Pnt 2404 3747 Pnt 2969 3758 Pnt 2859 3744 Pnt 2696 3786 Pnt 2422 3801 Pnt 2756 3754 Pnt 3250 3741 Pnt 2477 3753 Pnt 2496 3739 Pnt 2730 3747 Pnt 2544 3821 Pnt 3357 3748 Pnt 2462 3746 Pnt 2838 3761 Pnt 2655 3799 Pnt 2071 3775 Pnt 2111 3759 Pnt 2822 3736 Pnt 2781 3768 Pnt 2632 3756 Pnt 2568 3744 Pnt 2924 3753 Pnt 1974 3788 Pnt 2845 3740 Pnt 2640 3744 Pnt 2515 3774 Pnt 2892 3744 Pnt 1879 3818 Pnt 2678 3753 Pnt 2795 3785 Pnt 2452 3743 Pnt 2509 3829 Pnt 2277 3747 Pnt 2895 3743 Pnt 3105 3829 Pnt 2461 3793 Pnt 2732 3840 Pnt 2696 3757 Pnt 3520 3755 Pnt 2276 3786 Pnt 4101 3757 Pnt 2915 3737 Pnt 2614 3740 Pnt 2447 3793 Pnt 3323 3738 Pnt 2854 3801 Pnt 2268 3855 Pnt 2524 3743 Pnt 3435 3761 Pnt 2121 3735 Pnt 2800 3799 Pnt 3360 2850 Pnt 2575 3777 Pnt 2710 2916 Pnt 2682 3744 Pnt 3222 3747 Pnt 2925 3805 Pnt 2179 3798 Pnt 2887 2683 Pnt 2176 3800 Pnt 2438 3805 Pnt 2589 3853 Pnt 3260 3742 Pnt 2498 3794 Pnt 3629 3750 Pnt 2781 3810 Pnt 2601 3743 Pnt 2484 3782 Pnt 2478 3839 Pnt 2588 3740 Pnt 2786 3827 Pnt 2301 3868 Pnt 3016 3739 Pnt 2577 3750 Pnt 2692 3754 Pnt 3002 3749 Pnt 2776 3750 Pnt 2693 3824 Pnt 2458 3750 Pnt 2970 3762 Pnt 2671 3778 Pnt 2554 3744 Pnt 3020 3749 Pnt 2456 3758 Pnt 2526 3756 Pnt 2353 3828 Pnt 3263 3747 Pnt 2910 3739 Pnt 2768 3757 Pnt 2067 3773 Pnt 2836 3818 Pnt 2084 3760 Pnt 2695 3746 Pnt 3127 3740 Pnt 2104 3788 Pnt 2849 3747 Pnt 3055 3752 Pnt 3238 3760 Pnt 2771 3750 Pnt 2678 3777 Pnt 2148 3853 Pnt 3084 3741 Pnt 2255 3808 Pnt 3410 3744 Pnt 3515 3777 Pnt 3446 3763 Pnt 2835 3744 Pnt 2687 3738 Pnt 3146 3763 Pnt 2966 3745 Pnt 2497 3760 Pnt 2730 3759 Pnt 4111 3756 Pnt 2106 3839 Pnt 2590 3736 Pnt 2108 3811 Pnt 3043 3840 Pnt 2607 3748 Pnt 3951 2797 Pnt 2289 2533 Pnt 3071 3749 Pnt 2647 3809 Pnt 2783 3841 Pnt 3046 3786 Pnt 3501 3747 Pnt 2955 3742 Pnt 2081 3796 Pnt 2396 3752 Pnt 3012 3809 Pnt 3223 2685 Pnt 3045 3743 Pnt 3177 3782 Pnt 2038 3797 Pnt 3167 3753 Pnt 2495 3742 Pnt 2773 3741 Pnt 2643 3782 Pnt 2759 3802 Pnt 2431 3762 Pnt 2840 3747 Pnt 2563 3806 Pnt 2733 3802 Pnt 3240 3745 Pnt 3256 3747 Pnt 2894 3751 Pnt 2547 3736 Pnt 3100 3749 Pnt 2564 3781 Pnt 2978 3760 Pnt 2361 3841 Pnt 2827 3815 Pnt 2314 3837 Pnt 3417 3746 Pnt 2416 3748 Pnt 3365 3747 Pnt 3490 2757 Pnt 2983 3775 Pnt 2842 3753 Pnt 2847 3762 Pnt 2372 3772 Pnt 2374 3756 Pnt 3604 3752 Pnt 3241 3772 Pnt 1994 3791 Pnt 2344 3785 Pnt 3055 3740 Pnt 3006 3744 Pnt 2762 3743 Pnt 3209 3749 Pnt 3442 3740 Pnt 3063 3775 Pnt 4193 3765 Pnt 2193 3765 Pnt 2723 3752 Pnt 3130 2771 Pnt 2788 3738 Pnt 3459 3765 Pnt 2229 3772 Pnt 2484 3737 Pnt 2217 3749 Pnt 2094 3811 Pnt 3087 3741 Pnt 2648 3777 Pnt 2926 3747 Pnt 2871 3743 Pnt 2073 3747 Pnt 2504 3753 Pnt 2623 3741 Pnt 2389 3740 Pnt 3063 3748 Pnt 2617 3768 Pnt 2759 3824 Pnt 2860 3769 Pnt 3857 3743 Pnt 3051 3749 Pnt 2332 3770 Pnt 2511 3738 Pnt 2894 3783 Pnt 3128 3742 Pnt 3059 3774 Pnt 2673 3747 Pnt 3104 3783 Pnt 2438 3753 Pnt 2876 3757 Pnt 2782 3744 Pnt 2222 3741 Pnt 3056 3746 Pnt 2105 3836 Pnt 3037 3748 Pnt 2194 3752 Pnt 3052 3748 Pnt 2988 3754 Pnt 3033 3738 Pnt 3652 3754 Pnt 2497 3761 Pnt 3180 3742 Pnt 2512 3741 Pnt 2681 3804 Pnt 2830 3756 Pnt 4150 3750 Pnt 3035 3746 Pnt 2896 3766 Pnt 2373 3748 Pnt 2161 3841 Pnt 2385 3773 Pnt 2622 3737 Pnt 2649 3753 Pnt 2249 3752 Pnt 3066 3743 Pnt 3352 3756 Pnt 2463 3753 Pnt 2495 3739 Pnt 2005 3795 Pnt 2656 3750 Pnt 2597 3742 Pnt 2651 3750 Pnt 3524 2939 Pnt 2974 3737 Pnt 2908 3795 Pnt 2219 3828 Pnt 3767 3762 Pnt 2773 3795 Pnt 2751 3775 Pnt 3110 3752 Pnt 2420 3818 Pnt 3224 3795 Pnt 2895 3742 Pnt 2582 3739 Pnt 3223 3737 Pnt 3269 3775 Pnt 2756 3775 Pnt 2684 3772 Pnt 2943 3743 Pnt 2426 3757 Pnt 2852 3763 Pnt 3121 3751 Pnt 3204 3804 Pnt 2411 3807 Pnt 3154 3745 Pnt 2623 3757 Pnt 2620 3733 Pnt 3515 3743 Pnt 2076 3802 Pnt 3111 3747 Pnt 2519 3749 Pnt 1964 3839 Pnt 3210 3751 Pnt 1974 3842 Pnt 2582 3745 Pnt 3089 3749 Pnt 2807 3761 Pnt 2788 3768 Pnt 2594 3747 Pnt 2776 3750 Pnt 2802 3742 Pnt 3113 3747 Pnt 2761 3747 Pnt 2703 3750 Pnt 2390 3742 Pnt 3067 3804 Pnt 3265 3750 Pnt 2573 3747 Pnt 2924 3754 Pnt 2238 3747 Pnt 2581 3796 Pnt 2138 3770 Pnt 2786 3796 Pnt 2631 3742 Pnt 3309 3755 Pnt 2235 3808 Pnt 2941 3814 Pnt 2669 3732 Pnt 2520 3732 Pnt 2493 3742 Pnt 3311 3744 Pnt 2747 3768 Pnt 4007 3741 Pnt 2551 2571 Pnt 2197 3755 Pnt 2872 3739 Pnt 3319 3754 Pnt 3058 3761 Pnt 2682 3756 Pnt 2491 3815 Pnt 3153 3749 Pnt 2394 3748 Pnt 3024 3755 Pnt 2761 3749 Pnt 4123 3753 Pnt 2169 3777 Pnt 2234 3795 Pnt 3126 3780 Pnt 3104 3751 Pnt 2424 3741 Pnt 2319 3831 Pnt 2481 3762 Pnt 2715 3743 Pnt 2739 3746 Pnt 2937 3746 Pnt 2589 3782 Pnt 3670 3743 Pnt 2661 3761 Pnt 2530 3745 Pnt 2778 3757 Pnt 2869 3748 Pnt 2529 3740 Pnt 2308 3763 Pnt 3224 3739 Pnt 2427 3744 Pnt 2561 3761 Pnt 1900 3800 Pnt 2634 3852 Pnt 2828 3748 Pnt 3838 3744 Pnt 3385 2580 Pnt 2747 3744 Pnt 3042 3749 Pnt 2614 3746 Pnt 2225 3842 Pnt 2700 2865 Pnt 3206 3745 Pnt 2402 3742 Pnt 2584 3743 Pnt 2513 3744 Pnt 2812 3773 Pnt 2647 3743 Pnt 3058 3746 Pnt 3034 3746 Pnt 4388 3753 Pnt 3267 3774 Pnt 3420 3738 Pnt 2132 3836 Pnt 2676 3738 Pnt 2399 3742 Pnt 4020 3757 Pnt 2550 3742 Pnt 3602 3772 Pnt 2574 3768 Pnt 3526 3751 Pnt 2698 3816 Pnt 2586 3740 Pnt 2108 3739 Pnt 3266 3744 Pnt 3000 3741 Pnt 2137 3743 Pnt 2884 3741 Pnt 2442 3739 Pnt 3326 3743 Pnt 2863 3741 Pnt 2748 3742 Pnt 1901 3840 Pnt 2825 3742 Pnt 2905 3745 Pnt 3026 3745 Pnt 2979 3741 Pnt 3333 3742 Pnt 3251 3748 Pnt 2984 3743 Pnt 2363 3748 Pnt 2897 3737 Pnt 2048 3764 Pnt 2555 3803 Pnt 2929 3751 Pnt 2331 3730 Pnt 2135 3734 Pnt 2941 3764 Pnt 2998 3743 Pnt 2437 3769 Pnt 2857 3743 Pnt 2460 3761 Pnt 2217 3759 Pnt 3911 3769 Pnt 2517 3738 Pnt 2631 3745 Pnt 3651 3758 Pnt 2932 3748 Pnt 2761 3759 Pnt 3127 3748 Pnt 2875 3772 Pnt 2762 3769 Pnt 2448 3744 Pnt 2568 3750 Pnt 2643 3748 Pnt 3700 3746 Pnt 2432 3817 Pnt 2010 3807 Pnt 2517 3749 Pnt 2830 3754 Pnt 2649 3743 Pnt 3526 3796 Pnt 2413 3750 Pnt 2619 3806 Pnt 2507 3747 Pnt 2313 3787 Pnt 3370 3749 Pnt 2865 3756 Pnt 2140 3820 Pnt 2373 3770 Pnt 2690 3761 Pnt 2826 3770 Pnt 3526 3751 Pnt 3362 3740 Pnt 2965 3737 Pnt 2617 3747 Pnt 2890 3741 Pnt 2004 3828 Pnt 3489 3735 Pnt 1887 3805 Pnt 2089 3764 Pnt 3233 3807 Pnt 3254 3828 Pnt 3024 3749 Pnt 2585 3777 Pnt 3310 3744 Pnt 2741 3743 Pnt 3007 3750 Pnt 3890 2861 Pnt 3003 3750 Pnt 3214 3743 Pnt 2949 2803 Pnt 2483 3766 Pnt 3255 3748 Pnt 2896 3743 Pnt 2213 3743 Pnt 3537 3761 Pnt 3531 3743 Pnt 3006 3736 Pnt 3967 2789 Pnt 2060 3899 Pnt 2978 3757 Pnt 2756 3764 Pnt 2917 3747 Pnt 2799 3899 Pnt 2465 3807 Pnt 2427 3837 Pnt 1989 3734 Pnt 2954 3737 Pnt 2925 3739 Pnt 2437 3746 Pnt 2701 3760 Pnt 3237 3752 Pnt 2511 3826 Pnt 3084 3744 Pnt 2378 3760 Pnt 2648 3742 Pnt 2905 3772 Pnt 3020 3826 Pnt 2986 3752 Pnt 2766 3744 Pnt 2790 3748 Pnt 2295 3766 Pnt 2854 3776 Pnt 2783 3751 Pnt 2000 3786 Pnt 2791 3748 Pnt 3056 3756 Pnt 2823 3743 Pnt 2481 3746 Pnt 2092 3774 Pnt 2233 3742 Pnt 3514 3743 Pnt 3354 3745 Pnt 3765 3774 Pnt 2804 3746 Pnt 2533 3777 Pnt 3534 3756 Pnt 2826 3750 Pnt 3205 3742 Pnt 2749 3745 Pnt 2329 3743 Pnt 2292 3748 Pnt 2443 3766 Pnt 3278 3750 Pnt 2220 3818 Pnt 2393 3746 Pnt 2500 3816 Pnt 2145 3824 Pnt 2450 3762 Pnt 2951 3884 Pnt 3347 3758 Pnt 2760 3740 Pnt 2960 3758 Pnt 2344 3744 Pnt 2385 3777 Pnt 3224 3784 Pnt 3838 3755 Pnt 2585 3772 Pnt 2653 3755 Pnt 2768 3756 Pnt 2472 3756 Pnt 2255 3754 Pnt 2866 3751 Pnt 2837 3748 Pnt 2693 3738 Pnt 3444 3751 Pnt 2952 3773 Pnt 2577 3750 Pnt 2291 3768 Pnt 2938 3743 Pnt 2323 3750 Pnt 2459 3749 Pnt 2520 3737 Pnt 2613 3738 Pnt 2312 3752 Pnt 2702 3753 Pnt 2940 3749 Pnt 2646 3739 Pnt 2781 3740 Pnt 2634 3800 Pnt 3038 3755 Pnt 2824 3741 Pnt 2461 3801 Pnt 2088 3797 Pnt 2555 3744 Pnt 2790 3743 Pnt 3177 3753 Pnt 2491 3745 Pnt 2287 3823 Pnt 2514 3764 Pnt 2268 3764 Pnt 3875 3749 Pnt 2488 3745 Pnt 3546 3739 Pnt 2820 3748 Pnt 2529 3775 Pnt 3994 3733 Pnt 2909 3793 Pnt 2758 3751 Pnt 2723 3754 Pnt 2737 3784 Pnt 2550 3782 Pnt 2004 3797 Pnt 2246 3778 Pnt 2532 3744 Pnt 2678 3754 Pnt 2882 3759 Pnt 2381 3743 Pnt 2898 3743 Pnt 3379 3745 Pnt 2510 3745 Pnt 2288 3754 Pnt 2864 3774 Pnt 2202 3794 Pnt 3158 3751 Pnt 2245 3740 Pnt 3723 3749 Pnt 2343 3812 Pnt 2755 2595 Pnt 2955 3750 Pnt 2622 3741 Pnt 2920 3758 Pnt 2622 3739 Pnt 2531 3745 Pnt 3162 3732 Pnt 2346 3815 Pnt 2741 3748 Pnt 2726 3751 Pnt 2044 3752 Pnt 2019 3797 Pnt 3321 3788 Pnt 3215 3753 Pnt 2427 3750 Pnt 2355 3814 Pnt 2672 3756 Pnt 3312 3771 Pnt 2720 3865 Pnt 2135 3799 Pnt 2797 3785 Pnt 2721 3748 Pnt 2941 3743 Pnt 2754 3764 Pnt 2664 3748 Pnt 2566 3827 Pnt 1969 3810 Pnt 3226 3747 Pnt 2255 3784 Pnt 3441 3787 Pnt 2636 3744 Pnt 2603 3738 Pnt 2900 3746 Pnt 2943 3753 Pnt 3343 3752 Pnt 2429 3779 Pnt 2428 3817 Pnt 2524 3792 Pnt 2193 3824 Pnt 3219 3743 Pnt 3090 3806 Pnt 2743 3791 Pnt 3182 3762 Pnt 2594 3741 Pnt 2936 3762 Pnt 2345 3752 Pnt 3136 3747 Pnt 3494 3754 Pnt 2853 3795 Pnt 3284 3752 Pnt 2898 3744 Pnt 2561 3775 Pnt 3113 3737 Pnt 3448 3795 Pnt 2063 3929 Pnt 2445 3746 Pnt 2962 3758 Pnt 3437 3742 Pnt 2140 3770 Pnt 3111 3750 Pnt 2738 3746 Pnt 2050 3794 Pnt 3656 3746 Pnt 2059 3800 Pnt 2523 3751 Pnt 2816 3734 Pnt 2692 3862 Pnt 3090 3756 Pnt 2041 3748 Pnt 2533 3739 Pnt 3213 3744 Pnt 3003 3741 Pnt 2669 3799 Pnt 2400 3738 Pnt 1831 3888 Pnt 3099 3743 Pnt 2433 3751 Pnt 3094 3741 Pnt 2920 3745 Pnt 2942 3740 Pnt 2614 3744 Pnt 2751 3751 Pnt 3063 3749 Pnt 2644 3752 Pnt 2748 3748 Pnt 3296 3755 Pnt 2146 3749 Pnt 3496 3754 Pnt 2958 3766 Pnt 2885 3738 Pnt 1943 3766 Pnt 2735 3775 Pnt 2227 3772 Pnt 2112 3759 Pnt 3113 3742 Pnt 2831 3771 Pnt 1922 3826 Pnt 2321 3792 Pnt 3277 3751 Pnt 2538 3747 Pnt 2497 3791 Pnt 3807 3765 Pnt 2682 3788 Pnt 2363 3743 Pnt 2555 3770 Pnt 2823 3807 Pnt 2577 3748 Pnt 3565 3747 Pnt 2425 3751 Pnt 2410 3748 Pnt 2827 3791 Pnt 3502 3757 Pnt 2685 3740 Pnt 2648 3785 Pnt 3119 3739 Pnt 2546 3750 Pnt 2661 3755 Pnt 3229 3816 Pnt 3187 3739 Pnt 3091 3756 Pnt 3709 3751 Pnt 2031 3783 Pnt 3051 3742 Pnt 3237 2717 Pnt 3547 3751 Pnt 2630 3744 Pnt 2956 3749 Pnt 3768 3741 Pnt 3228 3750 Pnt 2087 3769 Pnt 3032 3740 Pnt 3221 3742 Pnt 2707 3738 Pnt 2518 3824 Pnt 2409 3783 Pnt 2612 3824 Pnt 3694 3739 Pnt 3234 3746 Pnt 2625 3750 Pnt 2558 3914 Pnt 3156 2665 Pnt 2917 3738 Pnt 2864 3740 Pnt 2523 3759 Pnt 2395 3777 Pnt 3232 3750 Pnt 2991 3768 Pnt 2886 3747 Pnt 2601 3733 Pnt 3276 3748 Pnt 2833 3743 Pnt 3087 3743 Pnt 2874 3752 Pnt 3298 3734 Pnt 2629 3746 Pnt 2456 3762 Pnt 3104 3746 Pnt 2567 3813 Pnt 3064 3740 Pnt 3009 3737 Pnt 2758 3745 Pnt 2628 3805 Pnt 2303 3798 Pnt 2865 3756 Pnt 2670 3743 Pnt 2498 3867 Pnt 2538 3740 Pnt 2642 3747 Pnt 2439 3824 Pnt 3468 3749 Pnt 2662 3749 Pnt 2909 3752 Pnt 3092 3746 Pnt 2943 3743 Pnt 1986 3798 Pnt 2836 3744 Pnt 2208 3733 Pnt 3662 3751 Pnt 2725 3741 Pnt 2673 3812 Pnt 2742 3751 Pnt 2423 3780 Pnt 2702 3742 Pnt 3395 3776 Pnt 2452 3746 Pnt 2611 3780 Pnt 2508 3812 Pnt 2483 3747 Pnt 3465 3736 Pnt 2264 3796 Pnt 2084 3786 Pnt 3147 3741 Pnt 2669 3739 Pnt 2257 3747 Pnt 2596 3767 Pnt 2773 3750 Pnt 2460 3745 Pnt 1963 3790 Pnt 2935 3750 Pnt 2971 3750 Pnt 3282 3741 Pnt 4152 3753 Pnt 2933 3756 Pnt 4176 2810 Pnt 2961 3739 Pnt 2929 3747 Pnt 2994 3757 Pnt 2607 3780 Pnt 2505 3792 Pnt 3263 3805 Pnt 3054 3749 Pnt 2381 3744 Pnt 2171 3798 Pnt 2383 3781 Pnt 4012 3753 Pnt 3340 3798 Pnt 2909 3742 Pnt 2241 3741 Pnt 3359 3760 Pnt 2402 3739 Pnt 3147 3740 Pnt 2700 3743 Pnt 2908 3753 Pnt 2444 3800 Pnt 2521 3746 Pnt 2387 3763 Pnt 2343 3800 Pnt 2348 3746 Pnt 2399 3871 Pnt 2970 3812 Pnt 2721 3773 Pnt 3313 3743 Pnt 2323 3776 Pnt 2679 3751 Pnt 2394 3795 Pnt 2856 3770 Pnt 2876 3756 Pnt 2699 3756 Pnt 2612 3763 Pnt 3041 3761 Pnt 3018 3761 Pnt 1934 3773 Pnt 2804 3784 Pnt 2447 3802 Pnt 3291 3756 Pnt 2785 3747 Pnt 2933 3754 Pnt 2861 3765 Pnt 2482 3756 Pnt 2485 3794 Pnt 3357 3755 Pnt 2678 3832 Pnt 2890 3750 Pnt 2990 3759 Pnt 2761 3832 Pnt 2746 3771 Pnt 2577 3751 Pnt 3037 3739 Pnt 2405 3810 Pnt 2721 3779 Pnt 3113 3753 Pnt 3576 3756 Pnt 2731 3790 Pnt 3139 3752 Pnt 2487 3738 Pnt 2390 3740 Pnt 2314 3786 Pnt 2323 3746 Pnt 2908 3776 Pnt 2502 3750 Pnt 2838 3753 Pnt 2601 3774 Pnt 2389 3762 Pnt 2656 3771 Pnt 2484 3753 Pnt 2973 3749 Pnt 2747 3754 Pnt 2646 3744 Pnt 3164 3758 Pnt 2791 3761 Pnt 2352 3746 Pnt 2463 3748 Pnt 2863 3738 Pnt 2884 3751 Pnt 2801 3747 Pnt 2704 3747 Pnt 2971 3759 Pnt 2532 3773 Pnt 3016 3749 Pnt 2659 3755 Pnt 2558 3754 Pnt 3061 3757 Pnt 2417 3780 Pnt 2828 3760 Pnt 2772 3755 Pnt 2272 3740 Pnt 2384 3822 Pnt 4057 3782 Pnt 2750 3943 Pnt 2911 3755 Pnt 2947 3750 Pnt 2465 3800 Pnt 2479 3741 Pnt 2847 3749 Pnt 3218 3741 Pnt 3173 3747 Pnt 2632 3747 Pnt 2005 3850 Pnt 3200 3767 Pnt 2803 3951 Pnt 2293 3951 Pnt 3265 3745 Pnt 3705 3757 Pnt 3092 3739 Pnt 2878 3748 Pnt 2594 3742 Pnt 2701 3763 Pnt 2553 3757 Pnt 2223 3771 Pnt 3250 3746 Pnt 2136 3753 Pnt 2530 3747 Pnt 2472 3729 Pnt 2660 3747 Pnt 3547 3754 Pnt 2476 3833 Pnt 2762 3899 Pnt 2816 3833 Pnt 2679 3744 Pnt 3456 3752 Pnt 2809 3742 Pnt 2367 3814 Pnt 3058 3750 Pnt 2005 3831 Pnt 3767 3743 Pnt 3303 3809 Pnt 2819 3763 Pnt 2659 3759 Pnt 2776 3751 Pnt 2778 3787 Pnt 3312 3757 Pnt 2246 3755 Pnt 2525 3744 Pnt 3329 3763 Pnt 2386 3748 Pnt 2868 3753 Pnt 3232 3759 Pnt 2339 3771 Pnt 3065 3774 Pnt 3740 3753 Pnt 3146 3747 Pnt 2097 3733 Pnt 2599 3774 Pnt 2633 3747 Pnt 3023 3749 Pnt 2382 2672 Pnt 3673 3740 Pnt 2699 3829 Pnt 2812 3741 Pnt 3208 3757 Pnt 2104 3808 Pnt 2295 3811 Pnt 3431 2467 Pnt 3017 3764 Pnt 2756 3742 Pnt 3171 3760 Pnt 3988 2720 Pnt 2605 3783 Pnt 3026 3745 Pnt 3275 3746 Pnt 2634 3747 Pnt 3042 3783 Pnt 2901 3755 Pnt 2549 3739 Pnt 2227 3818 Pnt 2659 3741 Pnt 3164 3743 Pnt 2916 3761 Pnt 3476 3739 Pnt 3100 3737 Pnt 2690 3745 Pnt 2214 3737 Pnt 2960 3754 Pnt 2844 3818 Pnt 2724 3819 Pnt 2501 3809 Pnt 2613 3768 Pnt 3950 3752 Pnt 2735 3746 Pnt 3017 3768 Pnt 2066 3765 Pnt 3519 3751 Pnt 3427 3761 Pnt 2111 3741 Pnt 3212 3746 Pnt 2914 3776 Pnt 2703 3752 Pnt 2678 3750 Pnt 3337 3752 Pnt 2417 3782 Pnt 2902 3757 Pnt 3225 3747 Pnt 2814 3773 Pnt 2083 3760 Pnt 2566 3762 Pnt 2961 3765 Pnt 3112 3742 Pnt 2792 3743 Pnt 2517 3738 Pnt 2969 3782 Pnt 2136 3787 Pnt 2855 3743 Pnt 2932 2689 Pnt 2909 3749 Pnt 2888 3747 Pnt 3446 3773 Pnt 1986 3797 Pnt 3057 3741 Pnt 2117 3786 Pnt 2488 3759 Pnt 2058 3773 Pnt 2923 3805 Pnt 2989 3742 Pnt 2964 3747 Pnt 3254 3752 Pnt 2644 3740 Pnt 3307 3781 Pnt 2255 3783 Pnt 3083 3745 Pnt 2562 3740 Pnt 2757 3752 Pnt 2455 3828 Pnt 1965 3765 Pnt 3194 3751 Pnt 3788 3743 Pnt 3137 3752 Pnt 2975 3752 Pnt 2183 3774 Pnt 2587 3740 Pnt 3074 3828 Pnt 2610 3788 Pnt 2514 3755 Pnt 3183 3742 Pnt 2228 3782 Pnt 2891 2761 Pnt 2153 3774 Pnt 2794 3748 Pnt 2361 3741 Pnt 2604 3773 Pnt 2784 3782 Pnt 2290 3763 Pnt 2637 3803 Pnt 2848 3749 Pnt 3459 3740 Pnt 2980 3773 Pnt 2922 3765 Pnt 2808 3738 Pnt 2484 3761 Pnt 2528 3761 Pnt 2894 3741 Pnt 2975 3748 Pnt 2457 2672 Pnt 2612 2701 Pnt 3137 3804 Pnt 2602 3761 Pnt 2896 3753 Pnt 2720 3760 Pnt 3071 3744 Pnt 2610 3832 Pnt 3224 3754 Pnt 3205 3752 Pnt 2972 3748 Pnt 2500 3750 Pnt 2178 3759 Pnt 3240 3753 Pnt 2596 3737 Pnt 2475 3812 Pnt 3149 3741 Pnt 2895 3758 Pnt 3819 3737 Pnt 2989 3753 Pnt 2639 3737 Pnt 3353 3754 Pnt 2874 3759 Pnt 2769 3744 Pnt 3001 3750 Pnt 2914 3741 Pnt 2778 3738 Pnt 2828 3739 Pnt 2437 3750 Pnt 2892 3797 Pnt 2193 3758 Pnt 3506 3750 Pnt 2582 2651 Pnt 2296 3745 Pnt 2652 3743 Pnt 2432 3790 Pnt 3055 3835 Pnt 2806 3745 Pnt 3257 3761 Pnt 2660 3755 Pnt 3058 3747 Pnt 2902 3750 Pnt 2670 3756 Pnt 2025 3934 Pnt 2594 3739 Pnt 2719 3740 Pnt 3788 3739 Pnt 3465 3753 Pnt 2674 3865 Pnt 2532 3744 Pnt 2855 3865 Pnt 2082 3806 Pnt 3209 2781 Pnt 2732 3755 Pnt 3112 3750 Pnt 3162 3782 Pnt 2469 3776 Pnt 3069 3748 Pnt 2185 3754 Pnt 3259 3748 Pnt 2026 3778 Pnt 3636 3750 Pnt 3017 3735 Pnt 3475 3771 Pnt 2750 3759 Pnt 2627 3740 Pnt 2437 3819 Pnt 3100 3779 Pnt 2442 3740 Pnt 2616 3752 Pnt 2554 3745 Pnt 2762 3745 Pnt 2658 3752 Pnt 2748 3742 Pnt 2670 3767 Pnt 2443 3752 Pnt 2860 3748 Pnt 3079 3745 Pnt 2939 3747 Pnt 2561 3756 Pnt 3520 3740 Pnt 3071 3758 Pnt 2835 3757 Pnt 3637 3750 Pnt 2686 3745 Pnt 2779 3753 Pnt 2091 3757 Pnt 2818 3752 Pnt 3822 3751 Pnt 3716 3767 Pnt 2574 3749 Pnt 2812 3744 Pnt 3017 3745 Pnt 2759 3740 Pnt 2427 3797 Pnt 2574 3749 Pnt 3404 3767 Pnt 2993 3750 Pnt 2986 3737 Pnt 2550 3748 Pnt 2535 3742 Pnt 3143 3734 Pnt 2965 2145 Pnt 2048 3788 Pnt 2815 3751 Pnt 2513 3744 Pnt 2643 3763 Pnt 2619 3747 Pnt 2359 3735 Pnt 2057 3764 Pnt 3443 3761 Pnt 3016 3763 Pnt 2765 3751 Pnt 2502 3735 Pnt 2874 3749 Pnt 2040 3810 Pnt 2137 3805 Pnt 2694 3813 Pnt 2483 3747 Pnt 2396 3747 Pnt 2879 3810 Pnt 3354 3770 Pnt 2857 3743 Pnt 2700 3763 Pnt 1856 3868 Pnt 2995 3740 Pnt 2288 3815 Pnt 1986 3805 Pnt 2190 3750 Pnt 3278 3813 Pnt 2719 3746 Pnt 2434 3806 Pnt 2386 3748 Pnt 3196 3750 Pnt 2295 3755 Pnt 3364 3746 Pnt 2798 3744 Pnt 2696 3741 Pnt 2634 3741 Pnt 2817 3739 Pnt 2664 3737 Pnt 3720 3742 Pnt 3110 3764 Pnt 2994 3745 Pnt 2629 3799 Pnt 2193 3831 Pnt 2947 3759 Pnt 2917 3777 Pnt 3136 3759 Pnt 2547 3742 Pnt 2159 3749 Pnt 3460 2813 Pnt 2430 3845 Pnt 2187 3746 Pnt 2392 3778 Pnt 2736 3749 Pnt 3297 3765 Pnt 2180 3785 Pnt 2762 3745 Pnt 1950 3803 Pnt 2307 3739 Pnt 2691 3742 Pnt 2988 3744 Pnt 3260 3748 Pnt 2200 3793 Pnt 3293 3756 Pnt 2191 3748 Pnt 2178 3779 Pnt 2052 3814 Pnt 2290 3749 Pnt 2106 3798 Pnt 2749 3778 Pnt 3023 3753 Pnt 3739 3779 Pnt 2448 3835 Pnt 2116 3779 Pnt 2890 3753 Pnt 2706 3750 Pnt 3145 3755 Pnt 2659 3747 Pnt 2545 3835 Pnt 2501 3742 Pnt 2125 3785 Pnt 2354 3743 Pnt 3039 3744 Pnt 1998 3767 Pnt 2547 3749 Pnt 3493 3780 Pnt 2494 3825 Pnt 3843 3763 Pnt 3099 3746 Pnt 2514 3739 Pnt 2724 3825 Pnt 2567 3735 Pnt 2971 3749 Pnt 2831 3748 Pnt 2460 3736 Pnt 2946 3739 Pnt 2375 3753 Pnt 2639 3741 Pnt 2489 3747 Pnt 2335 3753 Pnt 2414 3739 Pnt 2828 3764 Pnt 3892 3736 Pnt 2692 3743 Pnt 2919 3743 Pnt 2364 3821 Pnt 3231 3745 Pnt 3690 3743 Pnt 2618 3759 Pnt 2291 3773 Pnt 3191 3749 Pnt 3396 3743 Pnt 2392 3739 Pnt 2896 3738 Pnt 3053 3745 Pnt 3329 3747 Pnt 2766 3743 Pnt 2501 3835 Pnt 2588 3757 Pnt 3005 3741 Pnt 2580 3744 Pnt 2486 3741 Pnt 2623 3742 Pnt 2846 3751 Pnt 2456 3740 Pnt 2901 3878 Pnt 3758 3751 Pnt 2577 3739 Pnt 3244 3740 Pnt 3036 3861 Pnt 2660 3743 Pnt 2423 3823 Pnt 3255 3759 Pnt 2260 3788 Pnt 2517 3749 Pnt 3947 3750 Pnt 2628 3747 Pnt 3574 2730 Pnt 2635 3740 Pnt 2714 3745 Pnt 2367 3754 Pnt 3192 3743 Pnt 2722 3738 Pnt 2305 3826 Pnt 2155 3868 Pnt 2995 3743 Pnt 2663 3745 Pnt 2632 3752 Pnt 2462 3772 Pnt 2855 3743 Pnt 3509 3739 Pnt 2578 3752 Pnt 2488 3749 Pnt 3339 3752 Pnt 2498 3747 Pnt 2833 3749 Pnt 3149 3743 Pnt 3043 3751 Pnt 2856 3755 Pnt 2417 3759 Pnt 2627 3745 Pnt 2589 3816 Pnt 3604 3816 Pnt 2583 3755 Pnt 2389 3743 Pnt 2395 3739 Pnt 4116 3773 Pnt 2456 3750 Pnt 2808 3740 Pnt 2347 3757 Pnt 2419 3765 Pnt 3437 3750 Pnt 2842 3763 Pnt 3055 3757 Pnt 2622 3801 Pnt 3726 3801 Pnt 2335 3739 Pnt 2386 2689 Pnt 3151 2643 Pnt 2438 3745 Pnt 3641 3736 Pnt 3071 3741 Pnt 2817 3748 Pnt 3138 3757 Pnt 2237 3902 Pnt 3310 3745 Pnt 2917 3754 Pnt 2617 3744 Pnt 2289 3772 Pnt 3035 2677 Pnt 2607 3742 Pnt 3146 3762 Pnt 2982 3750 Pnt 2555 3744 Pnt 2944 3772 Pnt 2222 3795 Pnt 3285 3744 Pnt 2876 3750 Pnt 2980 3810 Pnt 3053 3762 Pnt 2524 3753 Pnt 2579 3805 Pnt 3223 3741 Pnt 3031 3770 Pnt 2594 3778 Pnt 3178 3741 Pnt 2303 3781 Pnt 2766 3758 Pnt 3111 3744 Pnt 3168 3749 Pnt 2512 3744 Pnt 3527 3760 Pnt 2441 3830 Pnt 2688 3764 Pnt 2633 3795 Pnt 2122 3800 Pnt 3885 3795 Pnt 3202 3741 Pnt 2756 3756 Pnt 2456 3745 Pnt 3652 3748 Pnt 3029 3745 Pnt 2955 3752 Pnt 2580 3744 Pnt 3420 2663 Pnt 2955 3741 Pnt 2919 3755 Pnt 2527 3761 Pnt 2885 3744 Pnt 3030 3749 Pnt 3520 3744 Pnt 2741 3749 Pnt 2740 3855 Pnt 3312 3736 Pnt 2468 3751 Pnt 3204 3740 Pnt 2489 3793 Pnt 2619 3743 Pnt 2344 3743 Pnt 3090 3859 Pnt 2978 3765 Pnt 2258 3761 Pnt 2593 3752 Pnt 4018 3767 Pnt 2876 3744 Pnt 2772 3784 Pnt 3214 3767 Pnt 3451 3761 Pnt 2940 3744 Pnt 2476 3741 Pnt 2929 3736 Pnt 3955 3751 Pnt 2640 3745 Pnt 3357 3747 Pnt 3559 3741 Pnt 2561 3808 Pnt 2420 3747 Pnt 2040 3796 Pnt 2256 3795 Pnt 2996 3755 Pnt 2671 3747 Pnt 3740 3741 Pnt 2524 3818 Pnt 2886 3740 Pnt 2298 3812 Pnt 3547 3767 Pnt 2860 3767 Pnt 3118 3755 Pnt 2320 3747 Pnt 2922 3758 Pnt 2433 3760 Pnt 2575 3740 Pnt 2301 3753 Pnt 2171 3838 Pnt 3005 3813 Pnt 3445 3753 Pnt 3959 3749 Pnt 2478 3816 Pnt 2542 3758 Pnt 2184 3776 Pnt 3581 3742 Pnt 2842 3766 Pnt 2253 3736 Pnt 2753 3748 Pnt 3166 3732 Pnt 2786 3760 Pnt 2312 3744 Pnt 2981 3743 Pnt 2516 3835 Pnt 2970 3755 Pnt 2890 3774 Pnt 2644 3749 Pnt 2635 3750 Pnt 3337 3747 Pnt 4067 3753 Pnt 3048 3764 Pnt 2609 3750 Pnt 3152 3749 Pnt 2738 3750 Pnt 2109 3770 Pnt 2105 3795 Pnt 3055 3764 Pnt 2669 3801 Pnt 2918 2881 Pnt 3065 3738 Pnt 3088 3764 Pnt 2792 3744 Pnt 3014 3779 Pnt 3639 3764 Pnt 2418 3795 Pnt 2991 3755 Pnt 2823 3767 Pnt 2807 3734 Pnt 1993 3812 Pnt 3119 3752 Pnt 2762 3753 Pnt 3369 3746 Pnt 3388 3767 Pnt 2886 3756 Pnt 2285 3784 Pnt 2685 3737 Pnt 3267 2612 Pnt 2803 3742 Pnt 3132 2882 Pnt 2931 3754 Pnt 3129 2670 Pnt 2408 3807 Pnt 2870 3762 Pnt 2528 3775 Pnt 2540 3757 Pnt 2894 3755 Pnt 3343 3807 Pnt 2766 3843 Pnt 3044 3757 Pnt 2571 3737 Pnt 2114 3776 Pnt 3368 3749 Pnt 3339 3737 Pnt 2747 3750 Pnt 2616 3752 Pnt 1985 3756 Pnt 2785 3752 Pnt 2704 3743 Pnt 3825 3768 Pnt 2363 3749 Pnt 2836 3736 Pnt 2542 3742 Pnt 2940 3736 Pnt 3241 3745 Pnt 3509 3747 Pnt 2880 3760 Pnt 3477 3771 Pnt 3121 3744 Pnt 2422 3779 Pnt 2644 3743 Pnt 3437 3753 Pnt 3054 3760 Pnt 3438 3748 Pnt 3137 3755 Pnt 2970 3750 Pnt 2894 3748 Pnt 3830 3765 Pnt 2883 3777 Pnt 2571 3758 Pnt 2911 3748 Pnt 3164 3749 Pnt 2551 3777 Pnt 3191 3745 Pnt 2714 3774 Pnt 2863 3759 Pnt 3137 3804 Pnt 2773 3756 Pnt 2675 3747 Pnt 2786 3749 Pnt 2386 3771 Pnt 2780 3770 Pnt 2095 3792 Pnt 2168 3758 Pnt 2906 3756 Pnt 3201 3756 Pnt 2218 3804 Pnt 2930 3792 Pnt 2769 3741 Pnt 3062 3744 Pnt 3567 3755 Pnt 2685 3744 Pnt 2727 3740 Pnt 3523 3755 Pnt 2520 3808 Pnt 2695 3740 Pnt 2089 3762 Pnt 2877 3764 Pnt 3637 3757 Pnt 2773 3757 Pnt 1790 3781 Pnt 2711 3734 Pnt 3091 3740 Pnt 2301 3771 Pnt 2689 3742 Pnt 2236 3787 Pnt 3884 3744 Pnt 2518 3770 Pnt 2604 2630 Pnt 2644 3745 Pnt 2403 3811 Pnt 3148 3791 Pnt 2921 3741 Pnt 2031 3802 Pnt 2513 3769 Pnt 2127 3769 Pnt 2362 3770 Pnt 3301 3805 Pnt 2067 3785 Pnt 2901 3766 Pnt 2411 3755 Pnt 3092 3786 Pnt 2734 3735 Pnt 3045 2848 Pnt 2456 3743 Pnt 2482 3733 Pnt 3283 3749 Pnt 2486 3782 Pnt 2600 3749 Pnt 2888 3739 Pnt 2667 3747 Pnt 2514 3744 Pnt 3309 3782 Pnt 2740 3752 Pnt 2592 3855 Pnt 3456 3770 Pnt 3514 3744 Pnt 3059 3820 Pnt 2364 3807 Pnt 3210 3770 Pnt 1946 3797 Pnt 2790 3745 Pnt 2109 3756 Pnt 2565 3784 Pnt 3625 3738 Pnt 2341 3738 Pnt 2706 3737 Pnt 2568 3768 Pnt 2696 3784 Pnt 2576 3753 Pnt 2691 3755 Pnt 2938 3774 Pnt 2720 3811 Pnt 2465 3743 Pnt 3169 3738 Pnt 3210 3745 Pnt 2595 3747 Pnt 2915 3811 Pnt 2484 3743 Pnt 3388 3743 Pnt 2287 3749 Pnt 3323 3797 Pnt 2639 3740 Pnt 2587 3757 Pnt 2906 3764 Pnt 3433 3741 Pnt 2496 3740 Pnt 3565 2752 Pnt 3013 3753 Pnt 2267 3746 Pnt 2464 3748 Pnt 3512 3761 Pnt 3002 3750 Pnt 2629 3761 Pnt 2604 3757 Pnt 2630 3750 Pnt 2652 3747 Pnt 2111 3840 Pnt 2287 3784 Pnt 2972 3780 Pnt 2358 3804 Pnt 2496 3744 Pnt 3200 3760 Pnt 2499 3804 Pnt 2822 3761 Pnt 2552 3806 Pnt 2275 3736 Pnt 3182 3811 Pnt 3110 3742 Pnt 2823 3744 Pnt 2675 3742 Pnt 2984 3750 Pnt 2149 3789 Pnt 3073 3746 Pnt 2547 3742 Pnt 2822 3789 Pnt 4166 3750 Pnt 2261 3800 Pnt 2571 3746 Pnt 3275 3742 Pnt 2754 3748 Pnt 2687 3741 Pnt 2627 3746 Pnt 2350 3733 Pnt 3030 3733 Pnt 3271 3752 Pnt 2934 3747 Pnt 2757 3815 Pnt 3990 3744 Pnt 2988 3774 Pnt 2516 3781 Pnt 2620 3753 Pnt 2881 3800 Pnt 3402 3754 Pnt 2367 3737 Pnt 2020 3778 Pnt 3248 3751 Pnt 2650 3742 Pnt 4062 3751 Pnt 2797 3745 Pnt 2387 3847 Pnt 2529 3745 Pnt 2746 3739 Pnt 2025 3761 Pnt 2284 2789 Pnt 2188 3784 Pnt 2650 3747 Pnt 3790 2745 Pnt 3950 3747 Pnt 2756 3754 Pnt 3228 3745 Pnt 2916 3757 Pnt 2485 3745 Pnt 2494 3783 Pnt 2910 3747 Pnt 2310 3861 Pnt 2787 3738 Pnt 3723 3750 Pnt 2475 3738 Pnt 3071 3738 Pnt 2231 3733 Pnt 2230 3799 Pnt 3433 3738 Pnt 3041 3739 Pnt 2392 3799 Pnt 2708 3744 Pnt 3311 3783 Pnt 2624 3759 Pnt 2707 3738 Pnt 2274 3748 Pnt 2502 3745 Pnt 2533 3740 Pnt 2165 3764 Pnt 2712 3740 Pnt 2169 3826 Pnt 2704 3741 Pnt 1972 3769 Pnt 3864 3828 Pnt 2902 3741 Pnt 2301 3802 Pnt 2952 3759 Pnt 2497 3747 Pnt 2327 3752 Pnt 2839 3802 Pnt 3902 3741 Pnt 3264 2601 Pnt 2874 2842 Pnt 2253 3741 Pnt 3004 3751 Pnt 3103 2707 Pnt 2546 3765 Pnt 2531 3746 Pnt 2227 3750 Pnt 3085 3797 Pnt 2046 3745 Pnt 2533 3767 Pnt 2753 3748 Pnt 2634 3741 Pnt 2330 3779 Pnt 2071 3811 Pnt 3257 3763 Pnt 2631 3794 Pnt 3220 3745 Pnt 2787 3758 Pnt 2524 3764 Pnt 2116 3735 Pnt 2840 3746 Pnt 3237 3747 Pnt 2299 3810 Pnt 2219 3794 Pnt 3269 3741 Pnt 2827 3750 Pnt 2346 3777 Pnt 3058 3742 Pnt 2449 3757 Pnt 3264 3754 Pnt 2816 3744 Pnt 3342 3757 Pnt 3168 3777 Pnt 2645 3753 Pnt 3207 3744 Pnt 3111 3745 Pnt 2366 3736 Pnt 2619 3744 Pnt 2712 3762 Pnt 2945 3749 Pnt 3567 3736 Pnt 2452 3766 Pnt 3133 3741 Pnt 2372 3795 Pnt 3006 3747 Pnt 2687 3820 Pnt 2190 3747 Pnt 2709 3742 Pnt 2551 3754 Pnt 2154 3806 Pnt 2632 3750 Pnt 2961 3744 Pnt 3216 3742 Pnt 2395 3740 Pnt 2055 3772 Pnt 2820 3763 Pnt 3968 3740 Pnt 2754 3763 Pnt 2605 3742 Pnt 3300 2740 Pnt 3713 3742 Pnt 2298 3758 Pnt 2242 3740 Pnt 3443 3753 Pnt 2674 3741 Pnt 2277 3745 Pnt 2734 3736 Pnt 2935 3784 Pnt 3880 3736 Pnt 3668 3741 Pnt 3829 3753 Pnt 3785 3779 Pnt 2643 3782 Pnt 2643 3748 Pnt 3037 3776 Pnt 2610 3762 Pnt 2087 3912 Pnt 2754 3820 Pnt 3324 3757 Pnt 2319 3746 Pnt 2912 3755 Pnt 3275 3911 Pnt 2171 3766 Pnt 2633 3741 Pnt 2923 3740 Pnt 3363 3750 Pnt 2765 3741 Pnt 2839 3763 Pnt 2613 3745 Pnt 2490 3746 Pnt 2509 3753 Pnt 2382 3802 Pnt 1837 3773 Pnt 2578 3763 Pnt 4190 3758 Pnt 2921 3763 Pnt 2292 3743 Pnt 2691 3750 Pnt 1924 3741 Pnt 3281 3752 Pnt 2724 3757 Pnt 2319 3798 Pnt 2574 3737 Pnt 3159 3748 Pnt 2824 3742 Pnt 2474 3747 Pnt 2945 3750 Pnt 2520 3759 Pnt 2704 3743 Pnt 2583 3786 Pnt 2734 3759 Pnt 2911 3782 Pnt 2790 3804 Pnt 2444 3739 Pnt 2615 3778 Pnt 2018 3842 Pnt 3253 3761 Pnt 3700 3739 Pnt 4054 3752 Pnt 2723 3904 Pnt 2317 3739 Pnt 2510 3750 Pnt 2277 3757 Pnt 2475 3778 Pnt 2502 3842 Pnt 2476 3769 Pnt 2435 3804 Pnt 2922 3737 Pnt 2160 3775 Pnt 1720 3756 Pnt 2464 3780 Pnt 3101 3775 Pnt 2663 3759 Pnt 2508 3741 Pnt 2171 3758 Pnt 2661 3749 Pnt 3046 3759 Pnt 2389 3855 Pnt 2281 3735 Pnt 2488 3758 Pnt 3275 2560 Pnt 1963 3820 Pnt 2813 3855 Pnt 2328 3801 Pnt 3372 3747 Pnt 4040 2577 Pnt 2718 3819 Pnt 2088 3823 Pnt 3149 3742 Pnt 2855 3738 Pnt 3603 3743 Pnt 2609 3747 Pnt 2021 3807 Pnt 2739 3742 Pnt 2356 3748 Pnt 2219 3735 Pnt 2036 3842 Pnt 1910 3770 Pnt 3551 2693 Pnt 2398 3748 Pnt 1992 3924 Pnt 2993 3752 Pnt 2577 3736 Pnt 2369 3812 Pnt 2784 3748 Pnt 2552 3744 Pnt 2541 3752 Pnt 2894 3739 Pnt 2443 3745 Pnt 2446 3812 Pnt 2203 3803 Pnt 2325 3794 Pnt 2790 3752 Pnt 2057 3844 Pnt 2918 3812 Pnt 2957 3746 Pnt 2432 3811 Pnt 3022 3750 Pnt 2586 3753 Pnt 2525 3805 Pnt 2703 3812 Pnt 2412 3802 Pnt 2282 3829 Pnt 4010 3805 Pnt 2684 3768 Pnt 3365 3829 Pnt 2689 3747 Pnt 3192 3750 Pnt 3408 3753 Pnt 3008 3809 Pnt 2309 3743 Pnt 2897 3750 Pnt 2772 3748 Pnt 2995 3752 Pnt 1775 3818 Pnt 2669 3809 Pnt 2637 3815 Pnt 2649 3779 Pnt 2429 3764 Pnt 2267 3741 Pnt 2544 3756 Pnt 3219 3761 Pnt 2777 3745 Pnt 3134 3745 Pnt 2433 3804 Pnt 2889 3743 Pnt 2778 3746 Pnt 1996 3799 Pnt 2850 3735 Pnt 2406 3737 Pnt 2847 3735 Pnt 2040 3818 Pnt 2663 3758 Pnt 2979 3742 Pnt 2764 3742 Pnt 2429 3739 Pnt 3794 3039 Pnt 2727 3763 Pnt 2568 3753 Pnt 2426 3743 Pnt 2453 3744 Pnt 3528 3744 Pnt 2164 3851 Pnt 3163 3762 Pnt 2612 3814 Pnt 3269 3743 Pnt 2543 3815 Pnt 2921 3740 Pnt 2483 3740 Pnt 2140 3839 Pnt 2734 3743 Pnt 2662 3750 Pnt 2447 3762 Pnt 3765 3741 Pnt 2394 3739 Pnt 3279 2651 Pnt 3079 3762 Pnt 3043 3778 Pnt 2647 3749 Pnt 3528 3752 Pnt 3503 3768 Pnt 2589 3745 Pnt 3140 3738 Pnt 2522 3750 Pnt 3392 3776 Pnt 3140 3745 Pnt 2388 3746 Pnt 3952 2732 Pnt 2711 3741 Pnt 2671 3829 Pnt 3067 3761 Pnt 2599 3846 Pnt 3399 2870 Pnt 3141 3757 Pnt 3061 3761 Pnt 2804 3753 Pnt 2471 3743 Pnt 2542 3741 Pnt 2883 3764 Pnt 2556 3737 Pnt 2105 3784 Pnt 4017 3750 Pnt 2534 3778 Pnt 2753 3738 Pnt 3228 3747 Pnt 3223 3778 Pnt 3357 3750 Pnt 3264 3748 Pnt 2645 3752 Pnt 2754 3746 Pnt 2311 3772 Pnt 2719 3738 Pnt 2757 3796 Pnt 3351 3759 Pnt 2062 3840 Pnt 3680 2852 Pnt 2505 3776 Pnt 3101 2910 Pnt 2594 3825 Pnt 2820 3776 Pnt 2006 3794 Pnt 3227 3780 Pnt 2944 3755 Pnt 2682 3760 Pnt 2128 3847 Pnt 3225 3799 Pnt 2487 3791 Pnt 3014 3746 Pnt 2491 3847 Pnt 2492 3745 Pnt 3126 3755 Pnt 3196 3740 Pnt 2699 3749 Pnt 3006 3748 Pnt 2406 3795 Pnt 2426 3809 Pnt 2037 3742 Pnt 2700 3737 Pnt 2351 3756 Pnt 3600 3809 Pnt 2531 3744 Pnt 2729 3760 Pnt 3936 3749 Pnt 2641 3741 Pnt 2268 3762 Pnt 3431 3760 Pnt 2870 3754 Pnt 2951 3743 Pnt 2677 3749 Pnt 3092 3758 Pnt 2358 3805 Pnt 3682 3741 Pnt 2941 3743 Pnt 2787 3760 Pnt 2338 3800 Pnt 2944 3736 Pnt 2127 3732 Pnt 2695 3787 Pnt 2433 3805 Pnt 2116 3819 Pnt 3235 3743 Pnt 3608 3732 Pnt 3207 3746 Pnt 2815 3765 Pnt 2530 3750 Pnt 2671 3741 Pnt 1983 3780 Pnt 3156 3747 Pnt 2886 3739 Pnt 2135 3818 Pnt 3302 3805 Pnt 3690 3747 Pnt 2651 3785 Pnt 2274 3777 Pnt 3517 3785 Pnt 3475 3769 Pnt 3465 2708 Pnt 3295 3783 Pnt 2903 3748 Pnt 3343 3829 Pnt 2577 3747 Pnt 3427 3736 Pnt 3004 3780 Pnt 2531 3741 Pnt 3159 3766 Pnt 1814 3801 Pnt 2538 3794 Pnt 3015 3742 Pnt 3562 3751 Pnt 3499 3753 Pnt 2771 3754 Pnt 2490 3751 Pnt 2818 3761 Pnt 2465 3761 Pnt 3119 3744 Pnt 3422 3750 Pnt 2837 3739 Pnt 2803 3747 Pnt 2876 3739 Pnt 2635 3793 Pnt 2437 3787 Pnt 1969 3797 Pnt 2031 3853 Pnt 2514 3755 Pnt 2693 3827 Pnt 2628 3801 Pnt 2556 3750 Pnt 2155 3843 Pnt 2914 3743 Pnt 3176 3824 Pnt 2605 3741 Pnt 3156 3748 Pnt 2822 3749 Pnt 2452 3808 Pnt 3624 3773 Pnt 3038 3749 Pnt 2927 3750 Pnt 2765 3777 Pnt 3251 3736 Pnt 3018 3737 Pnt 2489 3777 Pnt 3004 3757 Pnt 2730 3744 Pnt 1988 3760 Pnt 2984 3738 Pnt 2086 3800 Pnt 2549 3743 Pnt 3142 3749 Pnt 2489 3782 Pnt 2522 3766 Pnt 3857 3749 Pnt 2555 3749 Pnt 2609 3745 Pnt 3536 3763 Pnt 2757 3742 Pnt 2534 3747 Pnt 3661 3742 Pnt 3406 2977 Pnt 2559 3814 Pnt 2586 3758 Pnt 2633 3739 Pnt 2494 3748 Pnt 2543 3755 Pnt 3050 3786 Pnt 2609 3804 Pnt 2380 3734 Pnt 2975 3738 Pnt 3170 3745 Pnt 2565 3754 Pnt 3145 2525 Pnt 2783 3783 Pnt 3104 3742 Pnt 3047 3762 Pnt 2487 3742 Pnt 2998 3762 Pnt 2440 3754 Pnt 2192 3775 Pnt 2921 3743 Pnt 4359 3032 Pnt 2679 3754 Pnt 3225 3759 Pnt 2555 3775 Pnt 2613 3765 Pnt 3464 3749 Pnt 2813 3742 Pnt 2710 3775 Pnt 2186 3782 Pnt 3343 3753 Pnt 2185 3756 Pnt 2636 3757 Pnt 3794 3786 Pnt 2857 3774 Pnt 2275 3730 Pnt 2952 3741 Pnt 2615 3741 Pnt 1977 3758 Pnt 3021 3762 Pnt 3307 3762 Pnt 2725 3744 Pnt 2836 3765 Pnt 2612 3736 Pnt 3380 3744 Pnt 3645 2695 Pnt 2750 3740 Pnt 2978 3736 Pnt 3159 3768 Pnt 2977 3759 Pnt 2846 3740 Pnt 3251 3757 Pnt 2674 3743 Pnt 2464 3744 Pnt 3035 3738 Pnt 2513 3743 Pnt 2412 3760 Pnt 2914 3802 Pnt 2802 3754 Pnt 2636 3737 Pnt 2383 3756 Pnt 2948 3744 Pnt 3339 3734 Pnt 3654 3741 Pnt 2521 3754 Pnt 2983 3751 Pnt 2540 3868 Pnt 2436 3744 Pnt 2662 3748 Pnt 2999 3742 Pnt 2120 3788 Pnt 2542 3743 Pnt 2849 3868 Pnt 2647 3750 Pnt 2460 3749 Pnt 2616 3742 Pnt 2242 3824 Pnt 3100 3746 Pnt 3596 2586 Pnt 2482 3827 Pnt 2964 3746 Pnt 2564 3750 Pnt 3038 3741 Pnt 2302 3811 Pnt 3002 3747 Pnt 2553 3752 Pnt 1966 3769 Pnt 3322 3743 Pnt 2538 3773 Pnt 2284 3762 Pnt 2509 3934 Pnt 2746 3741 Pnt 3500 2616 Pnt 2918 3762 Pnt 2949 3934 Pnt 2752 3736 Pnt 3002 3767 Pnt 2186 3836 Pnt 2398 3771 Pnt 2501 3741 Pnt 2189 3837 Pnt 2415 3736 Pnt 2650 2559 Pnt 2280 3806 Pnt 2353 3747 Pnt 2997 3739 Pnt 2579 3747 Pnt 2625 3742 Pnt 2585 3837 Pnt 2987 3742 Pnt 2698 3750 Pnt 2558 3739 Pnt 2327 3744 Pnt 2534 3741 Pnt 2127 3790 Pnt 2403 3767 Pnt 2407 3784 Pnt 2753 3748 Pnt 3137 3741 Pnt 2455 3748 Pnt 2435 3771 Pnt 3329 3742 Pnt 2940 3751 Pnt 2550 3746 Pnt 3394 3745 Pnt 2938 3751 Pnt 2323 3737 Pnt 2994 3755 Pnt 2501 3745 Pnt 2896 3824 Pnt 2603 3749 Pnt 2653 3746 Pnt 2095 3801 Pnt 3041 3751 Pnt 2716 3737 Pnt 2712 3743 Pnt 2651 3775 Pnt 2816 3801 Pnt 2990 3746 Pnt 2415 3734 Pnt 2820 3741 Pnt 2388 3809 Pnt 3068 3742 Pnt 2617 3766 Pnt 2464 3759 Pnt 2951 3741 Pnt 3228 3744 Pnt 2452 3752 Pnt 2245 3753 Pnt 2648 3825 Pnt 2965 3747 Pnt 3476 3753 Pnt 2888 3756 Pnt 2160 3800 Pnt 2885 3744 Pnt 2005 3795 Pnt 2494 3756 Pnt 3198 3747 Pnt 2200 3804 Pnt 2735 3737 Pnt 2853 3758 Pnt 2598 3738 Pnt 3947 3742 Pnt 2395 3815 Pnt 3059 3738 Pnt 2380 3799 Pnt 3021 3745 Pnt 3233 3741 Pnt 2406 3741 Pnt 2986 3785 Pnt 3140 3760 Pnt 2456 3737 Pnt 2862 3750 Pnt 2397 3742 Pnt 2848 3777 Pnt 2297 3772 Pnt 2319 3748 Pnt 2506 3737 Pnt 2064 3747 Pnt 2621 3834 Pnt 2329 3736 Pnt 3129 3763 Pnt 2362 3754 Pnt 3319 3740 Pnt 2476 3844 Pnt 2559 3740 Pnt 3057 3742 Pnt 2834 3736 Pnt 3249 3748 Pnt 2914 3772 Pnt 2966 3743 Pnt 2929 3743 Pnt 2033 3828 Pnt 3138 3772 Pnt 2879 3799 Pnt 2361 3746 Pnt 2475 3761 Pnt 2729 3751 Pnt 3621 3749 Pnt 3327 3799 Pnt 2085 3821 Pnt 2928 3746 Pnt 2577 3742 Pnt 2315 3775 Pnt 2728 3756 Pnt 3556 3754 Pnt 2680 3746 Pnt 3076 3740 Pnt 1939 3804 Pnt 2651 3815 Pnt 3262 3756 Pnt 2693 3741 Pnt 2613 3756 Pnt 3000 3751 Pnt 2848 3804 Pnt 2366 3757 Pnt 2535 3759 Pnt 2235 3808 Pnt 2651 3742 Pnt 3250 3757 Pnt 2873 3748 Pnt 2713 3768 Pnt 2338 3736 Pnt 2899 3745 Pnt 2614 3745 Pnt 2376 3755 Pnt 2741 3768 Pnt 2487 3769 Pnt 2508 3737 Pnt 2267 3745 Pnt 3032 3768 Pnt 2473 3748 Pnt 2882 3767 Pnt 2693 3744 Pnt 2579 3774 Pnt 2695 3755 Pnt 2979 3750 Pnt 2689 3747 Pnt 3126 3755 Pnt 2797 3766 Pnt 1993 3794 Pnt 3759 3742 Pnt 2522 3746 Pnt 3429 3747 Pnt 2693 3747 Pnt 2737 3796 Pnt 2572 3782 Pnt 2409 3842 Pnt 2107 3740 Pnt 2168 3762 Pnt 2728 3761 Pnt 2753 3745 Pnt 2365 3770 Pnt 2226 3797 Pnt 2486 3807 Pnt 2984 3771 Pnt 2556 3762 Pnt 2525 3786 Pnt 2690 3744 Pnt 2622 3831 Pnt 2922 3764 Pnt 2450 3748 Pnt 2990 3831 Pnt 3179 3744 Pnt 2371 3734 Pnt 2913 3743 Pnt 1905 3806 Pnt 2160 3736 Pnt 2619 3772 Pnt 3066 3746 Pnt 1957 3777 Pnt 3963 3778 Pnt 2562 3741 Pnt 2489 3777 Pnt 2107 3730 Pnt 2635 3856 Pnt 2951 3741 Pnt 2888 3765 Pnt 2727 3750 Pnt 2822 3794 Pnt 3210 3751 Pnt 2499 3744 Pnt 2635 3747 Pnt 3890 3742 Pnt 2612 3740 Pnt 3409 2918 Pnt 2665 3740 Pnt 2058 3802 Pnt 3476 2713 Pnt 2748 3748 Pnt 2832 3757 Pnt 2708 3784 Pnt 2699 3842 Pnt 2475 3749 Pnt 2528 3744 Pnt 2539 3761 Pnt 2182 3800 Pnt 2316 3761 Pnt 3214 3753 Pnt 2020 3749 Pnt 2537 3742 Pnt 2819 3744 Pnt 2070 3852 Pnt 2066 3806 Pnt 2714 3764 Pnt 2784 3744 Pnt 2326 3768 Pnt 2724 3748 Pnt 2509 3764 Pnt 2746 3787 Pnt 2495 3740 Pnt 2680 3761 Pnt 2778 3773 Pnt 2345 3749 Pnt 3141 3818 Pnt 2340 3820 Pnt 2385 3740 Pnt 2348 3741 Pnt 2494 3741 Pnt 2701 3761 Pnt 2692 3746 Pnt 2912 3740 Pnt 3113 3741 Pnt 2815 3743 Pnt 2567 3761 Pnt 2873 3754 Pnt 2608 3740 Pnt 3198 3748 Pnt 3012 3748 Pnt 2797 3840 Pnt 2879 3754 Pnt 2893 3753 Pnt 2540 3750 Pnt 2508 3840 Pnt 2329 3748 Pnt 3189 3753 Pnt 2268 3777 Pnt 2929 3750 Pnt 2239 3751 Pnt 2514 3827 Pnt 3008 3737 Pnt 2579 3827 Pnt 2250 3741 Pnt 2614 3743 Pnt 2567 3744 Pnt 2536 3768 Pnt 2637 3738 Pnt 2349 3799 Pnt 3201 3743 Pnt 3430 3754 Pnt 2117 3844 Pnt 3224 3781 Pnt 3341 3748 Pnt 3129 3737 Pnt 2896 3742 Pnt 2200 3772 Pnt 2319 3837 Pnt 3114 3755 Pnt 2798 3814 Pnt 2784 3769 Pnt 2345 3746 Pnt 2716 3770 Pnt 2503 3789 Pnt 3031 3732 Pnt 2320 3737 Pnt 2888 3741 Pnt 2537 3807 Pnt 2775 3783 Pnt 2821 3760 Pnt 2658 3749 Pnt 3894 3749 Pnt 2302 3764 Pnt 2439 3731 Pnt 2535 3826 Pnt 3274 3750 Pnt 2480 3751 Pnt 2933 3744 Pnt 2847 3752 Pnt 2058 3734 Pnt 3685 3781 Pnt 2661 3752 Pnt 2703 3750 Pnt 3726 3753 Pnt 2606 3753 Pnt 2638 3769 Pnt 3466 2874 Pnt 2179 3759 Pnt 3391 2580 Pnt 3013 3746 Pnt 2820 3774 Pnt 3462 3737 Pnt 2569 3776 Pnt 4002 3768 Pnt 2658 3748 Pnt 3085 3744 Pnt 2623 3762 Pnt 2890 3750 Pnt 3615 3753 Pnt 2503 3746 Pnt 3120 3743 Pnt 2893 3764 Pnt 2288 3740 Pnt 2866 3756 Pnt 2092 3774 Pnt 2758 3743 Pnt 2653 3742 Pnt 3068 3752 Pnt 2660 3753 Pnt 2759 3766 Pnt 2924 3752 Pnt 2894 3753 Pnt 3325 3750 Pnt 2478 3741 Pnt 2853 3741 Pnt 3142 3757 Pnt 2521 3768 Pnt 3623 3743 Pnt 3597 3751 Pnt 2938 2606 Pnt 2070 3827 Pnt 3311 3737 Pnt 3226 3754 Pnt 2039 3817 Pnt 3332 3757 Pnt 2524 3750 Pnt 3092 3746 Pnt 2862 3742 Pnt 3871 3748 Pnt 2034 3796 Pnt 2957 3738 Pnt 3343 3739 Pnt 3728 3747 Pnt 3004 3757 Pnt 2958 3750 Pnt 2883 3742 Pnt 2827 3757 Pnt 3454 3750 Pnt 2731 3763 Pnt 3051 3752 Pnt 2649 3769 Pnt 2525 3770 Pnt 2527 3805 Pnt 2573 3762 Pnt 2843 3807 Pnt 2657 3770 Pnt 2878 3745 Pnt 2665 3753 Pnt 2581 3862 Pnt 2064 3841 Pnt 2687 3755 Pnt 2375 3744 Pnt 2665 3744 Pnt 3137 3744 Pnt 2250 3766 Pnt 3393 3744 Pnt 2941 3743 Pnt 4233 3738 Pnt 3083 3777 Pnt 2926 3738 Pnt 2162 3794 Pnt 2774 3751 Pnt 1982 3888 Pnt 2054 3797 Pnt 2731 3753 Pnt 2485 3747 Pnt 3051 3747 Pnt 2602 3743 Pnt 2686 3743 Pnt 2633 3750 Pnt 2724 3750 Pnt 2684 3745 Pnt 2651 3737 Pnt 2361 3751 Pnt 2239 3745 Pnt 3133 3737 Pnt 3035 3745 Pnt 2772 3775 Pnt 3011 3756 Pnt 2859 3748 Pnt 2987 3744 Pnt 2826 3745 Pnt 2339 3766 Pnt 2837 3749 Pnt 2717 3735 Pnt 2111 3816 Pnt 2859 3745 Pnt 2887 3771 Pnt 2867 3775 Pnt 2980 3737 Pnt 2630 3749 Pnt 3367 3733 Pnt 2271 3828 Pnt 2495 3746 Pnt 2835 3793 Pnt 2630 3828 Pnt 2510 3734 Pnt 2736 3745 Pnt 2468 3814 Pnt 2844 3745 Pnt 3123 3745 Pnt 2594 3775 Pnt 2314 3748 Pnt 3213 3791 Pnt 2564 3741 Pnt 2882 3745 Pnt 2823 3742 Pnt 2193 3816 Pnt 2196 3753 Pnt 3182 3752 Pnt 2493 3760 Pnt 2206 3796 Pnt 3019 3760 Pnt 2269 3743 Pnt 2822 3743 Pnt 2799 3741 Pnt 2756 3823 Pnt 3014 3752 Pnt 2596 3801 Pnt 2205 3741 Pnt 2512 3739 Pnt 2827 3745 Pnt 3362 3823 Pnt 2604 3884 Pnt 2532 3775 Pnt 2473 3775 Pnt 3042 3748 Pnt 2055 3816 Pnt 2974 3756 Pnt 2508 3750 Pnt 2655 3770 Pnt 2366 3865 Pnt 3088 3816 Pnt 2811 3758 Pnt 2774 3744 Pnt 2660 3752 Pnt 2336 3749 Pnt 2446 3757 Pnt 2194 3744 Pnt 2526 3753 Pnt 2165 3795 Pnt 3607 3744 Pnt 2322 3772 Pnt 3253 3753 Pnt 2729 3751 Pnt 2359 3748 Pnt 2599 3756 Pnt 2494 3807 Pnt 3057 3737 Pnt 2986 2752 Pnt 2537 3751 Pnt 2701 3788 Pnt 2470 3740 Pnt 2304 3754 Pnt 3721 3807 Pnt 2915 3742 Pnt 3206 3737 Pnt 2912 3750 Pnt 2723 3751 Pnt 3085 3816 Pnt 1801 3750 Pnt 2125 3799 Pnt 3123 3762 Pnt 3716 3740 Pnt 2464 3780 Pnt 3367 3814 Pnt 2687 3746 Pnt 2331 3755 Pnt 3017 3785 Pnt 2788 3741 Pnt 2078 3747 Pnt 2821 3768 Pnt 3108 3740 Pnt 2532 3754 Pnt 3047 3753 Pnt 3694 3743 Pnt 3118 3747 Pnt 2652 3749 Pnt 2246 3772 Pnt 3212 3746 Pnt 2481 3785 Pnt 3145 3772 Pnt 2730 3773 Pnt 3267 3736 Pnt 2650 3736 Pnt 2769 3736 Pnt 3318 3746 Pnt 3026 3773 Pnt 3744 3749 Pnt 3181 3764 Pnt 3299 3752 Pnt 3405 3747 Pnt 3183 3742 Pnt 3160 3744 Pnt 2729 3743 Pnt 2912 3747 Pnt 2913 2661 Pnt 2932 3743 Pnt 2219 3742 Pnt 2865 3758 Pnt 2890 3759 Pnt 4041 3743 Pnt 3383 3747 Pnt 2838 3743 Pnt 2656 3770 Pnt 3736 3745 Pnt 2990 3751 Pnt 2808 3739 Pnt 2943 3743 Pnt 2544 3807 Pnt 2665 3739 Pnt 3076 3807 Pnt 2393 3788 Pnt 3002 3746 Pnt 2567 3800 Pnt 2179 3744 Pnt 2982 3739 Pnt 2299 3763 Pnt 2699 3753 Pnt 2773 3780 Pnt 3243 3765 Pnt 2519 3742 Pnt 3067 3820 Pnt 2723 3779 Pnt 2774 3747 Pnt 2850 3787 Pnt 2925 3757 Pnt 2794 3775 Pnt 3465 3742 Pnt 2310 3746 Pnt 2913 3746 Pnt 3205 3743 Pnt 2650 3750 Pnt 2922 3753 Pnt 2389 3824 Pnt 2874 3783 Pnt 2212 3929 Pnt 2841 3792 Pnt 2473 3771 Pnt 3148 3739 Pnt 2962 3744 Pnt 3022 3793 Pnt 2922 3739 Pnt 2939 3738 Pnt 3358 3751 Pnt 3083 3743 Pnt 2927 3758 Pnt 2831 3733 Pnt 2371 3733 Pnt 2265 3747 Pnt 2210 3774 Pnt 2797 3795 Pnt 2813 3774 Pnt 2802 3738 Pnt 2533 3774 Pnt 2104 3786 Pnt 2451 3789 Pnt 2254 3739 Pnt 2755 3742 Pnt 2608 3742 Pnt 3587 3754 Pnt 2643 3762 Pnt 3030 3744 Pnt 2663 3739 Pnt 2531 3757 Pnt 2233 3747 Pnt 2485 3742 Pnt 2535 3751 Pnt 3269 3744 Pnt 2157 3756 Pnt 2906 3753 Pnt 3696 3744 Pnt 2701 3741 Pnt 2122 3743 Pnt 1947 3770 Pnt 2249 3747 Pnt 2708 3805 Pnt 2588 3741 Pnt 2539 3741 Pnt 2843 3748 Pnt 2461 3748 Pnt 2492 3748 Pnt 2851 3761 Pnt 2610 3749 Pnt 2367 3752 Pnt 2991 3803 Pnt 2989 3745 Pnt 3184 3750 Pnt 3058 3744 Pnt 2441 3943 Pnt 2893 3745 Pnt 2540 3739 Pnt 2857 3743 Pnt 2234 3800 Pnt 2953 3757 Pnt 3261 3745 Pnt 2812 3753 Pnt 2727 3799 Pnt 2357 3840 Pnt 3403 3749 Pnt 2056 3826 Pnt 3411 3757 Pnt 2789 3744 Pnt 2659 3746 Pnt 2750 3871 Pnt 2315 3748 Pnt 2373 3744 Pnt 3207 3755 Pnt 2537 3747 Pnt 2015 3824 Pnt 2726 3746 Pnt 2955 3770 Pnt 2511 3747 Pnt 2254 3798 Pnt 2561 3800 Pnt 3410 3776 Pnt 2388 3791 Pnt 2503 3755 Pnt 2867 3767 Pnt 2713 3770 Pnt 2682 3746 Pnt 2804 3803 Pnt 1866 3777 Pnt 2187 3782 Pnt 3236 3761 Pnt 3074 3748 Pnt 3035 3743 Pnt 2863 3753 Pnt 2963 3740 Pnt 3260 3767 Pnt 2133 3795 Pnt 1945 3783 Pnt 3221 3746 Pnt 2479 3812 Pnt 3343 3747 Pnt 2541 3745 Pnt 3124 3812 Pnt 2775 3753 Pnt 3083 3747 Pnt 3571 3741 Pnt 3039 3745 Pnt 2713 3765 Pnt 2753 3740 Pnt 2792 3750 Pnt 2700 3780 Pnt 2518 3746 Pnt 3363 3780 Pnt 3254 3746 Pnt 2064 3914 Pnt 2329 3768 Pnt 3541 3914 Pnt 2484 3737 Pnt 2370 3812 Pnt 2520 3753 Pnt 3278 3740 Pnt 3194 3753 Pnt 4291 3768 Pnt 2792 3784 Pnt 2625 3771 Pnt 2006 3899 Pnt 2976 3771 Pnt 3406 3898 Pnt 2830 3734 Pnt 3146 3744 Pnt 2437 3740 Pnt 3329 3740 Pnt 2184 3867 Pnt 3174 3751 Pnt 2902 3747 Pnt 2598 3750 Pnt 2931 3740 Pnt 2930 3756 Pnt 2197 3802 Pnt 2866 3743 Pnt 2031 3769 Pnt 3824 3802 Pnt 2616 3751 Pnt 2621 3738 Pnt 2695 3793 Pnt 4146 2684 Pnt 2299 3742 Pnt 3763 3738 Pnt 2731 3832 Pnt 2558 3742 Pnt 2350 3755 Pnt 2839 3750 Pnt 3435 3750 Pnt 3082 3749 Pnt 2707 3824 Pnt 3157 3749 Pnt 2471 3798 Pnt 3283 3774 Pnt 3645 3747 Pnt 2568 3744 Pnt 2051 3782 Pnt 2862 3808 Pnt 2833 3784 Pnt 3206 3755 Pnt 3782 3759 Pnt 2822 3746 Pnt 3956 3761 Pnt 3127 3738 Pnt 3542 3755 Pnt 2629 3748 Pnt 2244 3786 Pnt 2778 3748 Pnt 2620 3776 Pnt 3750 3745 Pnt 3298 3750 Pnt 2992 3750 Pnt 2855 3751 Pnt 3181 3776 Pnt 3032 3756 Pnt 2593 3760 Pnt 2232 3797 Pnt 2751 3743 Pnt 3389 3760 Pnt 2603 3740 Pnt 2663 3739 Pnt 3503 3756 Pnt 2990 3741 Pnt 3691 3752 Pnt 2005 3762 Pnt 2734 3742 Pnt 2572 3767 Pnt 2630 3740 Pnt 3525 3767 Pnt 2965 3754 Pnt 2050 3790 Pnt 2984 3757 Pnt 3405 3765 Pnt 3806 3740 Pnt 4131 3763 Pnt 2922 3757 Pnt 3142 3782 Pnt 2139 3805 Pnt 2749 3750 Pnt 2483 3782 Pnt 2179 3755 Pnt 2855 3768 Pnt 2961 3764 Pnt 3528 3764 Pnt 2645 3742 Pnt 2712 3757 Pnt 3151 3747 Pnt 3133 3747 Pnt 3291 3752 Pnt 3243 3741 Pnt 2440 3752 Pnt 3040 3739 Pnt 2602 3800 Pnt 2521 3740 Pnt 2050 3776 Pnt 3484 3757 Pnt 2277 3801 Pnt 2862 3757 Pnt 2758 3755 Pnt 3407 3774 Pnt 3947 3746 Pnt 2478 3755 Pnt 3233 3742 Pnt 2448 3803 Pnt 2242 3803 Pnt 3339 3803 Pnt 3289 3741 Pnt 2215 3745 Pnt 2894 3755 Pnt 2869 2690 Pnt 2543 3751 Pnt 2640 3747 Pnt 2645 3748 Pnt 2216 3823 Pnt 2759 3744 Pnt 3176 3758 Pnt 2042 3876 Pnt 2102 3816 Pnt 2624 3754 Pnt 2468 3764 Pnt 2734 3755 Pnt 2123 3750 Pnt 3625 3764 Pnt 3073 3761 Pnt 2722 3738 Pnt 3242 3742 Pnt 2277 3775 Pnt 3074 3761 Pnt 2564 3741 Pnt 2956 3733 Pnt 3029 3775 Pnt 2635 3746 Pnt 2915 3755 Pnt 2331 3797 Pnt 2373 3811 Pnt 3360 3735 Pnt 2514 3743 Pnt 2773 3753 Pnt 2508 3739 Pnt 2611 3811 Pnt 2396 3790 Pnt 2257 3784 Pnt 3133 3785 Pnt 3096 3742 Pnt 2881 3782 Pnt 2769 3739 Pnt 2942 3790 Pnt 2678 3781 Pnt 2171 3797 Pnt 2685 3745 Pnt 2454 3747 Pnt 2562 3747 Pnt 2868 3745 Pnt 2088 3778 Pnt 2560 3773 Pnt 3656 3747 Pnt 2843 3737 Pnt 2265 3744 Pnt 3237 3777 Pnt 3151 3818 Pnt 2259 3748 Pnt 3112 3753 Pnt 3004 3746 Pnt 2085 3833 Pnt 2852 3759 Pnt 2969 3759 Pnt 2529 3759 Pnt 3198 3740 Pnt 2913 3760 Pnt 2714 3745 Pnt 2799 3742 Pnt 2565 3763 Pnt 2421 3899 Pnt 2883 3756 Pnt 2344 3782 Pnt 2253 3789 Pnt 2864 3752 Pnt 3212 3790 Pnt 2342 3822 Pnt 2647 3752 Pnt 2448 3761 Pnt 2660 3742 Pnt 2154 3828 Pnt 3579 3752 Pnt 2531 3809 Pnt 2220 3782 Pnt 3279 3760 Pnt 2323 3749 Pnt 3118 3745 Pnt 2957 3951 Pnt 2081 3831 Pnt 2985 3745 Pnt 3269 3762 Pnt 2496 3739 Pnt 3238 3754 Pnt 2133 3767 Pnt 2756 3741 Pnt 3574 3739 Pnt 2628 3745 Pnt 2795 3741 Pnt 2713 3739 Pnt 3120 3744 Pnt 2503 3738 Pnt 3520 3763 Pnt 2862 3739 Pnt 2371 3759 Pnt 2442 3761 Pnt 2669 3747 Pnt 2873 3739 Pnt 2550 3751 Pnt 3008 3759 Pnt 2025 3786 Pnt 2848 3759 Pnt 2543 3802 Pnt 2805 3759 Pnt 2690 3740 Pnt 3122 3747 Pnt 2595 3773 Pnt 3407 3759 Pnt 2684 3774 Pnt 3534 3784 Pnt 2677 3741 Pnt 2513 3831 Pnt 2059 3787 Pnt 2870 2815 Pnt 2711 3829 Pnt 2312 3832 Pnt 2758 3742 Pnt 2302 3794 Pnt 2683 3743 Pnt 1840 3788 Pnt 2046 3808 Pnt 2728 3760 Pnt 2552 3783 Pnt 2209 3749 Pnt 2434 3751 Pnt 2111 3811 Pnt 3257 3781 Pnt 2728 3748 Pnt 2019 3760 Pnt 2331 3845 Pnt 2945 3744 Pnt 2188 3833 Pnt 3089 3748 Pnt 3346 3763 Pnt 3276 3738 Pnt 2211 3746 Pnt 2681 3761 Pnt 3191 3761 Pnt 2644 3818 Pnt 2551 3765 Pnt 2546 3740 Pnt 2219 3739 Pnt 2942 3746 Pnt 2575 3761 Pnt 2575 3819 Pnt 2437 3750 Pnt 2630 3746 Pnt 3289 3750 Pnt 2652 3766 Pnt 2922 3758 Pnt 3182 3756 Pnt 2353 3821 Pnt 2856 3765 Pnt 2684 3752 Pnt 2596 3738 Pnt 2890 3777 Pnt 2581 3761 Pnt 2415 3768 Pnt 3705 3743 Pnt 2902 3745 Pnt 2136 3781 Pnt 2205 3803 Pnt 2536 3756 Pnt 2634 3742 Pnt 3482 3752 Pnt 1981 3759 Pnt 2603 3768 Pnt 1808 3803 Pnt 2914 3744 Pnt 2930 2838 Pnt 2896 3804 Pnt 2845 3743 Pnt 2591 3786 Pnt 2295 3793 Pnt 3040 3749 Pnt 2460 3740 Pnt 2640 3818 Pnt 2951 3760 Pnt 2632 3760 Pnt 3129 3782 Pnt 1926 3753 Pnt 3788 2702 Pnt 2927 3740 Pnt 2988 3828 Pnt 3015 3740 Pnt 2773 3759 Pnt 2754 3752 Pnt 1921 3779 Pnt 3186 3740 Pnt 3061 3747 Pnt 3276 3739 Pnt 2842 3758 Pnt 2440 3835 Pnt 3166 3756 Pnt 2666 3743 Pnt 3047 3835 Pnt 3373 3747 Pnt 2914 3743 Pnt 2774 3749 Pnt 2500 3743 Pnt 2745 3740 Pnt 2465 3747 Pnt 2636 3734 Pnt 3148 3747 Pnt 2613 3752 Pnt 2662 3740 Pnt 1942 3812 Pnt 3978 3747 Pnt 3415 2900 Pnt 2738 3759 Pnt 2554 3747 Pnt 3021 3752 Pnt 2883 3815 Pnt 2536 3826 Pnt 2592 3737 Pnt 2519 3742 Pnt 3292 3759 Pnt 2936 3741 Pnt 2947 3759 Pnt 1986 3795 Pnt 3150 2678 Pnt 2665 3784 Pnt 2597 3753 Pnt 3043 3745 Pnt 2178 3774 Pnt 3090 3738 Pnt 3180 3748 Pnt 2728 3759 Pnt 3097 3752 Pnt 2860 3774 Pnt 2618 3743 Pnt 2500 3740 Pnt 2220 3776 Pnt 3306 3734 Pnt 2327 3765 Pnt 3619 3748 Pnt 2779 3742 Pnt 3527 3771 Pnt 2061 2787 Pnt 2715 3742 Pnt 2544 3749 Pnt 2266 3762 Pnt 3388 3749 Pnt 2255 3738 Pnt 2701 3747 Pnt 3661 3746 Pnt 2872 3735 Pnt 2255 3739 Pnt 3039 3749 Pnt 2908 3743 Pnt 2809 3754 Pnt 2676 3749 Pnt 2758 3748 Pnt 2508 3764 Pnt 2162 3748 Pnt 2811 3754 Pnt 2449 3798 Pnt 2432 2877 Pnt 2838 3738 Pnt 2542 3756 Pnt 2795 3740 Pnt 2615 3759 Pnt 3465 3764 Pnt 2563 3743 Pnt 2691 3740 Pnt 2545 3766 Pnt 2102 3878 Pnt 4007 2974 Pnt 2643 3742 Pnt 2282 3776 Pnt 2506 3761 Pnt 3389 2595 Pnt 2697 3776 Pnt 2808 3794 Pnt 3507 3739 Pnt 3193 3757 Pnt 2883 3748 Pnt 2375 3768 Pnt 2983 3749 Pnt 3147 3757 Pnt 3479 3764 Pnt 2698 3760 Pnt 3006 3744 Pnt 2353 3749 Pnt 3111 3749 Pnt 2953 3756 Pnt 4023 3749 Pnt 2895 3752 Pnt 2588 3750 Pnt 2521 3740 Pnt 3182 3756 Pnt 2637 2756 Pnt 3636 3753 Pnt 2115 3902 Pnt 2913 3745 Pnt 2443 3745 Pnt 2105 3766 Pnt 2594 3745 Pnt 2924 3742 Pnt 3753 3745 Pnt 2401 3821 Pnt 2659 3752 Pnt 2935 3742 Pnt 2178 3770 Pnt 2641 3749 Pnt 2426 3821 Pnt 3441 3759 Pnt 2592 3751 Pnt 3012 3741 Pnt 2562 3745 Pnt 2387 3795 Pnt 2165 3752 Pnt 3372 3745 Pnt 3174 3751 Pnt 2963 3743 Pnt 2630 3769 Pnt 3214 3744 Pnt 2865 3744 Pnt 2662 3767 Pnt 2984 3754 Pnt 2854 2684 Pnt 2901 3775 Pnt 2604 3748 Pnt 2236 3743 Pnt 3023 3767 Pnt 3070 3747 Pnt 2402 3810 Pnt 2081 3812 Pnt 2673 3767 Pnt 2767 3751 Pnt 2713 3748 Pnt 2114 3805 Pnt 2750 3749 Pnt 3042 3812 Pnt 2623 3790 Pnt 2107 3736 Pnt 2794 3748 Pnt 2539 3742 Pnt 3995 3747 Pnt 3012 3752 Pnt 3493 2605 Pnt 2546 3756 Pnt 2992 3752 Pnt 2821 3772 Pnt 2336 3754 Pnt 1953 3766 Pnt 3438 3754 Pnt 3269 3742 Pnt 2482 3751 Pnt 2172 3819 Pnt 3229 3744 Pnt 2995 3761 Pnt 3092 3750 Pnt 3047 3755 Pnt 2959 3744 Pnt 3740 3822 Pnt 3164 3746 Pnt 3345 3755 Pnt 3008 3744 Pnt 2548 3744 Pnt 2433 3747 Pnt 3211 3749 Pnt 2768 3744 Pnt 2759 3751 Pnt 2649 3745 Pnt 2433 3752 Pnt 2753 3787 Pnt 2572 3759 Pnt 4091 3754 Pnt 1923 3752 Pnt 2232 3785 Pnt 2705 3758 Pnt 3264 3756 Pnt 2722 3773 Pnt 2656 3749 Pnt 2023 3784 Pnt 2999 3740 Pnt 2567 3739 Pnt 2936 3763 Pnt 2804 3751 Pnt 2333 3813 Pnt 3076 3811 Pnt 2182 3799 Pnt 2061 3806 Pnt 2357 3805 Pnt 2173 3774 Pnt 2851 3747 Pnt 2653 3772 Pnt 2676 3743 Pnt 2956 3735 Pnt 2528 3773 Pnt 2345 3813 Pnt 2348 3743 Pnt 2492 3750 Pnt 3344 3813 Pnt 4076 3805 Pnt 2663 3748 Pnt 2932 3749 Pnt 2672 3743 Pnt 2965 3743 Pnt 2110 3777 Pnt 2579 3743 Pnt 2789 3765 Pnt 2968 3765 Pnt 2973 3765 Pnt 2557 3742 Pnt 3957 3772 Pnt 3277 3765 Pnt 2609 3747 Pnt 2905 3777 Pnt 3189 3765 Pnt 2175 3825 Pnt 2706 2595 Pnt 3486 2778 Pnt 3218 3756 Pnt 2175 3770 Pnt 2749 3788 Pnt 2621 3740 Pnt 2430 3773 Pnt 3067 3756 Pnt 2773 3751 Pnt 3228 3740 Pnt 3053 3742 Pnt 2866 3756 Pnt 3800 3744 Pnt 2802 3745 Pnt 2369 3739 Pnt 2227 3747 Pnt 2408 3754 Pnt 1921 3934 Pnt 2310 3803 Pnt 2253 3831 Pnt 3321 3742 Pnt 3561 3747 Pnt 2415 3760 Pnt 2589 3755 Pnt 2344 3750 Pnt 2342 3796 Pnt 2882 3743 Pnt 2541 3753 Pnt 2242 3806 Pnt 2196 3818 Pnt 2854 3742 Pnt 2574 3744 Pnt 3546 2402 Pnt 2928 3766 Pnt 2583 3755 Pnt 3093 3790 Pnt 2688 3743 Pnt 2365 3742 Pnt 2812 3741 Pnt 2618 3769 Pnt 2639 3749 Pnt 2105 3868 Pnt 2971 3740 Pnt 2745 3743 Pnt 2507 3739 Pnt 4038 2764 Pnt 3313 3752 Pnt 2944 3738 Pnt 2025 3811 Pnt 2850 3769 Pnt 3417 2737 Pnt 2398 3780 Pnt 2888 3735 Pnt 2560 3750 Pnt 2804 3789 Pnt 2934 3760 Pnt 2974 3736 Pnt 2778 3749 Pnt 3830 3744 Pnt 2781 3757 Pnt 2939 3760 Pnt 2701 3763 Pnt 3244 3749 Pnt 2386 3835 Pnt 2277 3736 Pnt 3206 3741 Pnt 2375 3764 Pnt 3175 3749 Pnt 2433 3750 Pnt 3650 3758 Pnt 2209 3753 Pnt 3095 3757 Pnt 3057 3774 Pnt 2975 3740 Pnt 2731 3737 Pnt 3518 3751 Pnt 2665 3752 Pnt 2548 3747 Pnt 2193 3835 Pnt 2967 3753 Pnt 2413 3739 Pnt 3494 3766 Pnt 2602 3749 Pnt 2972 3745 Pnt 2481 3745 Pnt 2879 3750 Pnt 2621 3823 Pnt 3009 3759 Pnt 3350 3743 Pnt 2373 3867 Pnt 3155 3748 Pnt 2450 3754 Pnt 2191 3749 Pnt 2015 3772 Pnt 3443 2635 Pnt 2600 3772 Pnt 2709 3748 Pnt 2965 3745 Pnt 2971 3749 Pnt 2111 3793 Pnt 2399 3745 Pnt 2533 3787 Pnt 2498 3812 Pnt 3556 3750 Pnt 3026 3744 Pnt 3201 3749 Pnt 2538 3744 Pnt 3232 3764 Pnt 2674 3754 Pnt 2539 3774 Pnt 2155 3814 Pnt 2495 3745 Pnt 3296 3754 Pnt 2911 3745 Pnt 2733 3744 Pnt 2418 3745 Pnt 2047 3816 Pnt 2087 3806 Pnt 3078 3816 Pnt 2452 3801 Pnt 2068 3809 Pnt 2058 3831 Pnt 2543 3768 Pnt 2276 3763 Pnt 2361 3764 Pnt 3536 3807 Pnt 3167 3773 Pnt 2912 3755 Pnt 2850 3746 Pnt 4122 3766 Pnt 2693 3765 Pnt 2530 3795 Pnt 3877 3755 Pnt 3030 3744 Pnt 2891 3739 Pnt 2961 3807 Pnt 3120 3768 Pnt 2594 3750 Pnt 2149 3800 Pnt 2455 3740 Pnt 2351 3744 Pnt 2481 3753 Pnt 3174 3743 Pnt 2604 3745 Pnt 2863 3741 Pnt 3848 3745 Pnt 2666 3760 Pnt 2639 3743 Pnt 2391 3764 Pnt 3096 3752 Pnt 3165 3755 Pnt 2282 3821 Pnt 2431 3798 Pnt 3154 3745 Pnt 3185 3755 Pnt 2901 3753 Pnt 2854 3747 Pnt 2185 3773 Pnt 2871 3753 Pnt 3710 3750 Pnt 3513 3773 Pnt 3035 3745 Pnt 2741 3738 Pnt 2470 3782 Pnt 3369 3750 Pnt 3060 3736 Pnt 2459 3744 Pnt 3089 3748 Pnt 2479 3744 Pnt 2613 3744 Pnt 3247 3749 Pnt 2097 3812 Pnt 3015 3737 Pnt 2667 3738 Pnt 2972 3757 Pnt 2534 3738 Pnt 2790 3741 Pnt 3038 3756 Pnt 2829 3747 Pnt 2529 3745 Pnt 3889 2501 Pnt 2752 3745 Pnt 2999 3747 Pnt 2735 3771 Pnt 3274 2743 Pnt 2511 3758 Pnt 2034 3756 Pnt 2262 3796 Pnt 3171 3771 Pnt 3596 3767 Pnt 2508 3757 Pnt 4200 3754 Pnt 3360 3746 Pnt 3243 3788 Pnt 2767 3757 Pnt 2803 3741 Pnt 2877 3736 Pnt 2706 3746 Pnt 2675 3747 Pnt 2843 3745 Pnt 3245 3751 Pnt 3742 3754 Pnt 3306 3753 Pnt 2845 3745 Pnt 3713 3747 Pnt 2796 3779 Pnt 2198 3733 Pnt 2789 3755 Pnt 2334 3838 Pnt 2791 3733 Pnt 2524 3793 Pnt 3845 3750 Pnt 3426 3749 Pnt 2127 3770 Pnt 2390 3813 Pnt 2872 3738 Pnt 4119 3751 Pnt 2460 3786 Pnt 2070 3816 Pnt 2478 3759 Pnt 2963 3748 Pnt 2570 3755 Pnt 3049 3748 Pnt 2874 3758 Pnt 3305 3755 Pnt 2663 3771 Pnt 3327 3742 Pnt 2772 3765 Pnt 3021 3767 Pnt 2223 3787 Pnt 2099 3751 Pnt 3360 3744 Pnt 3182 3732 Pnt 3476 3767 Pnt 2036 3768 Pnt 2270 3808 Pnt 2065 3805 Pnt 3220 3810 Pnt 2968 3747 Pnt 2571 3740 Pnt 2414 3766 Pnt 3250 3740 Pnt 2824 3740 Pnt 2407 3755 Pnt 2853 3764 Pnt 2721 3828 Pnt 2688 3761 Pnt 2620 3749 Pnt 2805 3757 Pnt 3243 3859 Pnt 2699 3757 Pnt 3246 3757 Pnt 3289 3743 Pnt 3935 3764 Pnt 2013 3743 Pnt 3107 3759 Pnt 2746 3810 Pnt 2771 3818 Pnt 2330 3756 Pnt 2094 3756 Pnt 2983 3742 Pnt 2613 3734 Pnt 3790 3744 Pnt 2246 3804 Pnt 2325 3745 Pnt 3134 3742 Pnt 2583 3753 Pnt 2694 3744 Pnt 3175 3754 Pnt 1896 3772 Pnt 3125 3774 Pnt 2663 3741 Pnt 2390 3811 Pnt 3101 2731 Pnt 2492 3743 Pnt 3255 3799 Pnt 2496 3736 Pnt 3093 3779 Pnt 3000 3775 Pnt 2624 3750 Pnt 3078 3744 Pnt 2750 3775 Pnt 2611 3843 Pnt 3096 3742 Pnt 3852 3750 Pnt 2645 3797 Pnt 2302 3796 Pnt 2863 3744 Pnt 2761 3739 Pnt 2534 3740 Pnt 2257 3749 Pnt 2016 3774 Pnt 3821 2708 Pnt 3071 3796 Pnt 2828 3736 Pnt 3067 3747 Pnt 2586 3786 Pnt 3208 3766 Pnt 2444 3811 Pnt 3119 3752 Pnt 3340 3734 Pnt 2967 3811 Pnt 4024 3760 Pnt 3842 3746 Pnt 1994 3778 Pnt 2729 3855 Pnt 3292 3855 Pnt 3271 3750 Pnt 2209 3768 Pnt 3411 3770 Pnt 2922 3763 Pnt 3911 3756 Pnt 2401 3784 Pnt 4082 3783 Pnt 2976 3763 Pnt 2716 3746 Pnt 3393 2813 Pnt 2818 3744 Pnt 3095 3751 Pnt 2698 3743 Pnt 2427 3741 Pnt 3749 3747 Pnt 2543 3807 Pnt 2773 3749 Pnt 2571 3746 Pnt 2947 3742 Pnt 2457 3754 Pnt 2608 3739 Pnt 3040 3751 Pnt 2091 3782 Pnt 2581 3759 Pnt 2677 3733 Pnt 2560 3761 Pnt 3671 3748 Pnt 2323 3743 Pnt 2282 3802 Pnt 2552 3778 Pnt 3114 3761 Pnt 3543 3739 Pnt 3144 3752 Pnt 1920 3762 Pnt 2824 3758 Pnt 3065 3743 Pnt 2474 3788 Pnt 3880 2643 Pnt 2386 3815 Pnt 2053 3747 Pnt 3132 3749 Pnt 2470 3743 Pnt 2882 3808 Pnt 2491 3765 Pnt 2410 3753 Pnt 4087 2690 Pnt 2249 3743 Pnt 2588 3750 Pnt 3595 3765 Pnt 2346 3736 Pnt 2768 3761 Pnt 2709 3789 Pnt 2454 3779 Pnt 2048 3739 Pnt 2943 3747 Pnt 3007 3757 Pnt 2592 3753 Pnt 2791 3747 Pnt 2327 3757 Pnt 3460 3757 Pnt 2792 3765 Pnt 3266 3750 Pnt 3190 3757 Pnt 2848 3753 Pnt 2120 3776 Pnt 2989 3764 Pnt 4186 3752 Pnt 2766 3736 Pnt 2720 3752 Pnt 2420 3740 Pnt 2857 3742 Pnt 2636 3749 Pnt 3532 3742 Pnt 3125 3752 Pnt 2213 3795 Pnt 2795 3742 Pnt 3555 3745 Pnt 2879 3798 Pnt 2492 3799 Pnt 3636 3748 Pnt 3094 3747 Pnt 2607 3764 Pnt 3619 2773 Pnt 3073 3798 Pnt 2639 3741 Pnt 2406 3748 Pnt 3882 3749 Pnt 2472 3737 Pnt 2503 3803 Pnt 2671 3794 Pnt 2565 3757 Pnt 2994 3748 Pnt 2945 3736 Pnt 2851 3746 Pnt 2216 3746 Pnt 2925 3747 Pnt 3026 3735 Pnt 2547 3847 Pnt 2436 3752 Pnt 2602 3744 Pnt 2400 3780 Pnt 3388 3754 Pnt 2572 3738 Pnt 2699 3745 Pnt 3962 3780 Pnt 2722 3749 Pnt 2714 3782 Pnt 3082 2346 Pnt 2734 3739 Pnt 2728 3780 Pnt 2474 3762 Pnt 2965 3739 Pnt 2070 3840 Pnt 3947 3778 Pnt 2874 3757 Pnt 2762 3762 Pnt 3285 3745 Pnt 1879 3823 Pnt 2654 3747 Pnt 2508 3759 Pnt 1927 3803 Pnt 2395 3766 Pnt 2859 3747 Pnt 3300 3825 Pnt 3312 3742 Pnt 2563 3856 Pnt 3141 3749 Pnt 2782 3741 Pnt 2767 2723 Pnt 2388 3773 Pnt 2516 3739 Pnt 3026 3797 Pnt 2579 3740 Pnt 3379 3744 Pnt 2851 3812 Pnt 2725 3739 Pnt 2253 3766 Pnt 2733 3820 Pnt 2428 3759 Pnt 2901 3745 Pnt 2917 3767 Pnt 3230 3745 Pnt 3123 3749 Pnt 3349 3747 Pnt 3096 3754 Pnt 2797 2615 Pnt 3229 3806 Pnt 2607 3760 Pnt 3071 3747 Pnt 3063 3768 Pnt 2746 3743 Pnt 2495 3806 Pnt 2104 3808 Pnt 2109 3811 Pnt 2648 3752 Pnt 2351 3759 Pnt 3040 3743 Pnt 2473 3749 Pnt 2507 3808 Pnt 2432 3810 Pnt 3204 3759 Pnt 2388 3797 Pnt 2228 3741 Pnt 3235 3750 Pnt 2610 3750 Pnt 2064 3795 Pnt 3534 2577 Pnt 3074 3815 Pnt 2851 3740 Pnt 2783 3758 Pnt 2535 3745 Pnt 2863 3745 Pnt 3196 3749 Pnt 2844 3746 Pnt 2798 3758 Pnt 2493 3742 Pnt 2233 3800 Pnt 2363 3740 Pnt 2861 3740 Pnt 3089 3744 Pnt 2504 3741 Pnt 3529 3740 Pnt 2277 3808 Pnt 3296 3753 Pnt 2806 3753 Pnt 3127 3746 Pnt 2493 3750 Pnt 4006 3740 Pnt 2060 3781 Pnt 2009 3842 Pnt 2313 3735 Pnt 3083 3754 Pnt 2603 3743 Pnt 2960 3752 Pnt 2293 3752 Pnt 2360 3748 Pnt 3058 3744 Pnt 2607 3812 Pnt 2726 3746 Pnt 2591 3778 Pnt 3316 3746 Pnt 3189 3923 Pnt 2552 3744 Pnt 2920 3778 Pnt 2390 3762 Pnt 3999 2844 Pnt 2961 3736 Pnt 3138 3748 Pnt 2544 3745 Pnt 2163 3847 Pnt 2429 3744 Pnt 3108 2834 Pnt 2411 3804 Pnt 2618 3756 Pnt 2646 3763 Pnt 2939 3748 Pnt 2538 3739 Pnt 3061 3749 Pnt 2620 3754 Pnt 2468 3803 Pnt 2383 3764 Pnt 2942 2885 Pnt 2178 3812 Pnt 3002 3747 Pnt 2859 3761 Pnt 2782 3740 Pnt 2836 3764 Pnt 2763 3745 Pnt 2611 3747 Pnt 3064 3739 Pnt 2714 3764 Pnt 2408 3745 Pnt 2745 3753 Pnt 2222 3901 Pnt 3151 2618 Pnt 2800 3737 Pnt 2666 3763 Pnt 2649 3748 Pnt 2374 3809 Pnt 3162 3746 Pnt 2500 3761 Pnt 2566 3805 Pnt 2980 3778 Pnt 2667 3743 Pnt 2583 3784 Pnt 2334 3743 Pnt 2548 3737 Pnt 2900 3754 Pnt 2712 3752 Pnt 2630 3757 Pnt 2145 3799 Pnt 2344 3750 Pnt 2745 3748 Pnt 2520 3750 Pnt 2887 3815 Pnt 2226 3818 Pnt 3548 3747 Pnt 3015 3757 Pnt 2467 3762 Pnt 3808 3818 Pnt 2461 3762 Pnt 2973 3750 Pnt 2223 3751 Pnt 2978 3744 Pnt 3741 3743 Pnt 3515 3746 Pnt 3186 3749 Pnt 2735 3757 Pnt 3644 3777 Pnt 2569 3748 Pnt 3107 3745 Pnt 2729 3770 Pnt 2977 3747 Pnt 2183 3747 Pnt 1825 3770 Pnt 2185 3764 Pnt 2017 3799 Pnt 2559 3742 Pnt 2823 3739 Pnt 2152 3769 Pnt 2374 3759 Pnt 2568 3741 Pnt 2203 3799 Pnt 3293 3752 Pnt 2801 3741 Pnt 2648 3761 Pnt 2576 3758 Pnt 2618 3743 Pnt 2437 3741 Pnt 2260 3801 Pnt 2025 3763 Pnt 2837 3766 Pnt 2677 3747 Pnt 2677 3745 Pnt 2543 3739 Pnt 2708 3758 Pnt 2086 3801 Pnt 2865 3745 Pnt 2615 3743 Pnt 3770 3748 Pnt 3492 3764 Pnt 2467 3781 Pnt 2929 3735 Pnt 2406 3781 Pnt 2392 3782 Pnt 3118 3785 Pnt 2503 3747 Pnt 3121 3743 Pnt 3055 3754 Pnt 2552 3776 Pnt 2696 3762 Pnt 3517 3747 Pnt 3635 3778 Pnt 2754 3776 Pnt 3016 3786 Pnt 2935 3741 Pnt 2710 3836 Pnt 2489 3751 Pnt 2854 3750 Pnt 2625 3738 Pnt 3616 3768 Pnt 2297 3744 Pnt 2408 3761 Pnt 2631 3757 Pnt 2614 3750 Pnt 2533 3782 Pnt 2690 3750 Pnt 2794 3753 Pnt 2810 3739 Pnt 3577 3757 Pnt 2096 3799 Pnt 2850 3756 Pnt 2558 3741 Pnt 2644 3745 Pnt 2721 3789 Pnt 2352 3756 Pnt 2049 3842 Pnt 2424 3750 Pnt 2380 3738 Pnt 2690 3745 Pnt 2760 3790 Pnt 2889 3800 Pnt 2387 3739 Pnt 3516 3744 Pnt 2085 3853 Pnt 2824 3776 Pnt 2275 3771 Pnt 3273 3746 Pnt 2021 3829 Pnt 2092 3776 Pnt 2591 3749 Pnt 2502 3808 Pnt 1975 3797 Pnt 2718 3829 Pnt 2791 3746 Pnt 2714 3744 Pnt 2335 3775 Pnt 2918 2790 Pnt 2722 3827 Pnt 2892 3777 Pnt 3071 3846 Pnt 3082 3796 Pnt 2612 3750 Pnt 2181 3820 Pnt 3773 3773 Pnt 3416 3741 Pnt 2899 3750 Pnt 2618 3772 Pnt 2196 3820 Pnt 2823 3911 Pnt 3326 3757 Pnt 2314 3732 Pnt 2029 3840 Pnt 2106 3808 Pnt 3048 3760 Pnt 2446 3743 Pnt 2904 3745 Pnt 2624 3744 Pnt 3734 3760 Pnt 2136 3784 Pnt 2839 2591 Pnt 3237 3749 Pnt 2514 3798 Pnt 3001 3750 Pnt 2301 3757 Pnt 2919 3742 Pnt 2594 3765 Pnt 3933 3750 Pnt 2661 3750 Pnt 2530 3746 Pnt 2792 3755 Pnt 2759 3749 Pnt 2599 3743 Pnt 2244 3802 Pnt 3007 3760 Pnt 1844 3769 Pnt 2902 3745 Pnt 3529 3762 Pnt 2703 3760 Pnt 2494 3804 Pnt 2060 3756 Pnt 3124 3743 Pnt 3081 3745 Pnt 2280 3777 Pnt 2795 3735 Pnt 2908 2986 Pnt 2304 3754 Pnt 2645 3744 Pnt 2930 3748 Pnt 2373 3804 Pnt 2457 3744 Pnt 3539 3742 Pnt 2714 3757 Pnt 2866 3743 Pnt 3415 3743 Pnt 3339 3757 Pnt 2465 3789 Pnt 3048 3761 Pnt 2558 3767 Pnt 2587 3750 Pnt 2445 3782 Pnt 3246 3782 Pnt 3197 3746 Pnt 1909 3758 Pnt 3002 3778 Pnt 2866 3766 Pnt 3069 3752 Pnt 2088 3818 Pnt 2872 3766 Pnt 3915 3746 Pnt 2708 3742 Pnt 2473 3749 Pnt 2975 3747 Pnt 3106 3743 Pnt 2368 3747 Pnt 3969 3748 Pnt 2475 3745 Pnt 2257 3743 Pnt 2908 3769 Pnt 2440 3773 Pnt 2434 3748 Pnt 3286 3748 Pnt 2267 3821 Pnt 3203 3743 Pnt 3711 3749 Pnt 2687 3744 Pnt 2097 3825 Pnt 2812 3743 Pnt 3234 3744 Pnt 1992 3851 Pnt 2891 3796 Pnt 2629 3856 Pnt 3267 3733 Pnt 2240 3814 Pnt 2828 3810 Pnt 2823 3754 Pnt 2874 3765 Pnt 2033 3839 Pnt 2774 3807 Pnt 2592 3752 Pnt 2597 3799 Pnt 2713 3765 Pnt 2798 3814 Pnt 2872 3741 Pnt 2482 3766 Pnt 2040 3758 Pnt 2821 3740 Pnt 3129 3743 Pnt 2585 3739 Pnt 2359 3828 Pnt 3563 2602 Pnt 2626 3825 Pnt 2700 3819 Pnt 3536 3825 Pnt 2621 3748 Pnt 2594 3762 Pnt 3636 3762 Pnt 2742 3767 Pnt 2492 3760 Pnt 2800 3786 Pnt 2863 3741 Pnt 2566 3736 Pnt 3749 3762 Pnt 2896 3762 Pnt 2305 3800 Pnt 2886 3745 Pnt 2741 3747 Pnt 2488 3762 Pnt 2309 3771 Pnt 2858 3747 Pnt 2367 3787 Pnt 2728 3749 Pnt 3830 3753 Pnt 3123 3742 Pnt 2392 3749 Pnt 2115 3794 Pnt 3670 3747 Pnt 2536 3754 Pnt 2910 3736 Pnt 2411 3747 Pnt 2447 3747 Pnt 2104 3775 Pnt 2604 3740 Pnt 2491 3740 Pnt 1945 3868 Pnt 2718 3821 Pnt 2436 3773 Pnt 2026 3783 Pnt 3002 3754 Pnt 3396 3789 Pnt 2493 3775 Pnt 3338 3740 Pnt 2725 3747 Pnt 2397 3805 Pnt 2740 3754 Pnt 2591 3761 Pnt 3085 3747 Pnt 2917 3743 Pnt 2491 3742 Pnt 3101 3752 Pnt 2895 3744 Pnt 2762 3745 Pnt 2958 2693 Pnt 2458 3752 Pnt 2870 3764 Pnt 3062 3745 Pnt 3018 3742 Pnt 2809 3744 Pnt 2235 3776 Pnt 2850 3757 Pnt 3279 3746 Pnt 3870 3742 Pnt 2402 3762 Pnt 3028 3744 Pnt 2812 3741 Pnt 2445 3757 Pnt 2977 3768 Pnt 2951 3755 Pnt 2765 3762 Pnt 2325 3740 Pnt 2868 3759 Pnt 2336 3734 Pnt 1797 3806 Pnt 2729 3734 Pnt 2551 3753 Pnt 2577 3739 Pnt 3044 3750 Pnt 3260 3736 Pnt 2622 3804 Pnt 2669 3742 Pnt 3194 3758 Pnt 3344 3753 Pnt 1920 3804 Pnt 2891 3746 Pnt 3273 3742 Pnt 2891 3739 Pnt 2357 3790 Pnt 3010 3744 Pnt 3293 3741 Pnt 3032 3756 Pnt 2061 3843 Pnt 2768 3734 Pnt 2829 3740 Pnt 3101 3748 Pnt 2197 3824 Pnt 3010 3754 Pnt 3022 3742 Pnt 2971 3753 Pnt 2686 3738 Pnt 3340 3749 Pnt 2610 3738 Pnt 2248 3749 Pnt 3482 3746 Pnt 2398 3799 Pnt 3195 3749 Pnt 2735 3757 Pnt 2644 3746 Pnt 2235 3811 Pnt 2158 3819 Pnt 2024 3815 Pnt 2279 3760 Pnt 2730 3759 Pnt 2664 3816 Pnt 2307 3741 Pnt 2577 3824 Pnt 2271 3740 Pnt 2357 3802 Pnt 2694 3746 Pnt 3010 3824 Pnt 2463 3741 Pnt 2131 3791 Pnt 2307 3768 Pnt 2786 3734 Pnt 2812 3743 Pnt 3458 3734 Pnt 3032 3742 Pnt 3108 3743 Pnt 2705 3764 Pnt 3653 3746 Pnt 3089 3744 Pnt 2633 3818 Pnt 3076 3743 Pnt 2397 3748 Pnt 3587 3764 Pnt 2738 3741 Pnt 2439 3818 Pnt 2684 3824 Pnt 2524 3761 Pnt 2386 3827 Pnt 2902 3750 Pnt 2728 3748 Pnt 3233 3754 Pnt 2907 3765 Pnt 2924 3740 Pnt 2968 3747 Pnt 3622 3768 Pnt 3154 3753 Pnt 2564 3744 Pnt 1996 3836 Pnt 2248 3756 Pnt 3621 2474 Pnt 2806 3749 Pnt 2816 3743 Pnt 3383 3747 Pnt 2521 3844 Pnt 2781 3746 Pnt 2862 3748 Pnt 2621 3746 Pnt 3077 3752 Pnt 3330 3745 Pnt 2922 3827 Pnt 2247 3767 Pnt 3027 3748 Pnt 3859 3752 Pnt 3109 3742 Pnt 3041 3746 Pnt 2558 3739 Pnt 2691 3799 Pnt 2934 3755 Pnt 2056 3801 Pnt 2728 3837 Pnt 2108 3772 Pnt 2405 3808 Pnt 2507 3820 Pnt 2280 3771 Pnt 2392 3742 Pnt 2698 3744 Pnt 2172 3837 Pnt 2213 3805 Pnt 2566 3750 Pnt 2921 3769 Pnt 2810 2774 Pnt 2580 3934 Pnt 2664 3752 Pnt 3086 3756 Pnt 2967 3756 Pnt 2827 3783 Pnt 2864 3739 Pnt 2612 3741 Pnt 2965 3738 Pnt 2388 3731 Pnt 2602 3739 Pnt 2716 3757 Pnt 2913 3746 Pnt 4080 3745 Pnt 2281 3806 Pnt 2355 3759 Pnt 2841 3783 Pnt 2556 3751 Pnt 3016 3737 Pnt 2674 3742 Pnt 2812 3742 Pnt 2679 3750 Pnt 2567 3739 Pnt 2981 3741 Pnt 2629 3776 Pnt 2437 3784 Pnt 2873 3750 Pnt 3253 3748 Pnt 2864 3748 Pnt 2415 3767 Pnt 2844 3746 Pnt 3013 3753 Pnt 3591 3736 Pnt 2768 3744 Pnt 2766 3748 Pnt 2631 3744 Pnt 2105 3818 Pnt 2800 3750 Pnt 3235 3768 Pnt 2049 3804 Pnt 3817 3744 Pnt 2966 3745 Pnt 2766 3842 Pnt 2675 3753 Pnt 2458 3794 Pnt 3054 3737 Pnt 2327 3793 Pnt 3275 3753 Pnt 3192 2695 Pnt 3029 3741 Pnt 3449 3751 Pnt 2820 3750 Pnt 2965 3740 Pnt 2467 3753 Pnt 2794 3737 Pnt 2726 3768 Pnt 2381 3740 Pnt 4353 3743 Pnt 2260 3738 Pnt 2961 3755 Pnt 2461 3771 Pnt 2720 3761 Pnt 2339 3777 Pnt 2317 3770 Pnt 2456 3748 Pnt 3033 3747 Pnt 2069 3730 Pnt 2228 3791 Pnt 4002 3771 Pnt 4035 3748 Pnt 2743 3750 Pnt 2781 3754 Pnt 2430 3831 Pnt 2598 3831 Pnt 2711 3747 Pnt 2238 3754 Pnt 3746 3742 Pnt 2278 3834 Pnt 4005 3752 Pnt 3044 3834 Pnt 2590 3745 Pnt 2891 3743 Pnt 2086 3804 Pnt 2649 3748 Pnt 3440 3758 Pnt 2715 3753 Pnt 2672 3745 Pnt 2234 3736 Pnt 2810 3747 Pnt 2754 3741 Pnt 2660 3741 Pnt 3009 3794 Pnt 2647 3772 Pnt 2815 3743 Pnt 2510 3744 Pnt 3068 3745 Pnt 2641 3751 Pnt 2821 3740 Pnt 2529 3743 Pnt 2285 3742 Pnt 2411 3736 Pnt 2471 3736 Pnt 2100 3753 Pnt 2397 3774 Pnt 3063 3742 Pnt 2675 3740 Pnt 2615 3755 Pnt 2470 3747 Pnt 2258 3795 Pnt 2907 3746 Pnt 3100 3755 Pnt 2516 3766 Pnt 2621 3762 Pnt 3076 3750 Pnt 2942 3758 Pnt 2331 3761 Pnt 2601 3740 Pnt 2087 3814 Pnt 3146 3756 Pnt 2819 3762 Pnt 3925 3748 Pnt 2309 3788 Pnt 3734 2891 Pnt 3238 3758 Pnt 3374 3754 Pnt 2235 3742 Pnt 2951 3748 Pnt 2552 3753 Pnt 2671 3741 Pnt 3106 3771 Pnt 2453 3777 Pnt 2825 3754 Pnt 2479 3744 Pnt 2961 3753 Pnt 2432 3747 Pnt 3259 3754 Pnt 3740 3744 Pnt 2714 3750 Pnt 2447 3817 Pnt 3131 3754 Pnt 2909 3745 Pnt 3173 3752 Pnt 3115 3748 Pnt 3024 3742 Pnt 3698 3748 Pnt 2705 3785 Pnt 2234 3751 Pnt 2433 3740 Pnt 3179 3761 Pnt 2704 3737 Pnt 2364 3746 Pnt 3990 2752 Pnt 3029 3807 Pnt 2115 3770 Pnt 2272 3777 Pnt 2872 3774 Pnt 2602 3789 Pnt 3081 3747 Pnt 3628 3814 Pnt 2617 3747 Pnt 3146 3741 Pnt 2140 3807 Pnt 3836 3744 Pnt 2975 3749 Pnt 2991 3779 Pnt 3523 2742 Pnt 2761 3751 Pnt 2432 3761 Pnt 3077 3743 Pnt 3841 3777 Pnt 3044 2746 Pnt 2827 3746 Pnt 2820 3823 Pnt 4382 3761 Pnt 2862 3750 Pnt 3088 3744 Pnt 3160 3744 Pnt 3607 3754 Pnt 3162 3765 Pnt 2641 3764 Pnt 3287 3746 Pnt 2874 3744 Pnt 2966 3856 Pnt 3171 3744 Pnt 2382 3744 Pnt 2528 3934 Pnt 1988 3835 Pnt 2451 3746 Pnt 3386 3742 Pnt 2992 3789 Pnt 2292 3743 Pnt 3275 3789 Pnt 3203 3750 Pnt 2199 3842 Pnt 4199 2690 Pnt 2473 3842 Pnt 2983 3750 Pnt 3321 3746 Pnt 2679 3757 Pnt 2942 3768 Pnt 3091 3757 Pnt 2629 3762 Pnt 2485 3762 Pnt 3224 3748 Pnt 3454 3757 Pnt 2206 3816 Pnt 3155 3739 Pnt 3162 3755 Pnt 3023 3744 Pnt 2496 3828 Pnt 2900 3755 Pnt 3081 3755 Pnt 2158 3826 Pnt 3654 3738 Pnt 3130 3742 Pnt 2375 3828 Pnt 3114 3826 Pnt 2428 3740 Pnt 2677 3737 Pnt 2031 3798 Pnt 3110 3793 Pnt 2737 3754 Pnt 4267 3816 Pnt 2579 3769 Pnt 3058 3755 Pnt 2821 3751 Pnt 2065 3824 Pnt 2792 3749 Pnt 2529 3752 Pnt 2532 3741 Pnt 3218 3763 Pnt 2730 3741 Pnt 3137 3742 Pnt 2457 3840 Pnt 2897 3823 Pnt 3595 3747 Pnt 4049 3840 Pnt 2527 3745 Pnt 2892 3753 Pnt 2916 3750 Pnt 1927 3791 Pnt 2673 3768 Pnt 3099 3745 Pnt 3503 3753 Pnt 2839 3807 Pnt 2578 3761 Pnt 2672 3791 Pnt 2582 3800 Pnt 2251 3741 Pnt 3454 3801 Pnt 2547 3862 Pnt 3110 3865 Pnt 2573 3739 Pnt 2455 3800 Pnt 2004 3841 Pnt 2490 3803 Pnt 2269 3799 Pnt 2702 3943 Pnt 2673 3747 Pnt 3185 3804 Pnt 2558 3761 Pnt 2804 3755 Pnt 2725 3756 Pnt 2695 3743 Pnt 2647 3761 Pnt 2158 3782 Pnt 2145 3744 Pnt 2804 3782 Pnt 3099 3742 Pnt 2117 3781 Pnt 2605 3736 Pnt 2382 3812 Pnt 2289 3853 Pnt 3581 3751 Pnt 2242 3816 Pnt 3127 3853 Pnt 3218 3747 Pnt 2570 3750 Pnt 3026 3747 Pnt 2751 3775 Pnt 2837 3755 Pnt 2849 3747 Pnt 2476 3746 Pnt 2282 3761 Pnt 3116 3750 Pnt 3018 3746 Pnt 2480 3773 Pnt 2507 3733 Pnt 2889 3746 Pnt 2634 3773 Pnt 2780 3800 Pnt 2680 3753 Pnt 2745 3742 Pnt 2799 3752 Pnt 2184 3753 Pnt 2636 3785 Pnt 3792 3742 Pnt 2270 3753 Pnt 3048 3785 Pnt 2136 3795 Pnt 2361 3769 Pnt 3281 3734 Pnt 2773 3740 Pnt 2452 3814 Pnt 3438 3744 Pnt 3747 3740 Pnt 3662 3753 Pnt 2344 3794 Pnt 2839 3795 Pnt 3253 3746 Pnt 4050 2515 Pnt 2344 3740 Pnt 2462 3775 Pnt 2639 3738 Pnt 2610 3798 Pnt 2259 3753 Pnt 2560 3764 Pnt 4202 3755 Pnt 3246 3769 Pnt 2573 3738 Pnt 2469 3840 Pnt 2561 3765 Pnt 2532 3737 Pnt 2746 3808 Pnt 2568 3884 Pnt 2386 3742 Pnt 2435 3774 Pnt 2392 3783 Pnt 3044 3743 Pnt 4050 3787 Pnt 2988 3751 Pnt 3135 3760 Pnt 2769 3752 Pnt 2272 3747 Pnt 2509 3742 Pnt 3429 3750 Pnt 3030 3739 Pnt 2785 3750 Pnt 3199 3742 Pnt 2004 3816 Pnt 3665 3742 Pnt 2744 3797 Pnt 2354 3816 Pnt 3368 3750 Pnt 2907 3746 Pnt 2998 3756 Pnt 3548 3755 Pnt 2538 3744 Pnt 2546 3752 Pnt 2414 3816 Pnt 2735 3780 Pnt 2521 3750 Pnt 3455 3752 Pnt 2654 3768 Pnt 3178 3746 Pnt 2796 3746 Pnt 2651 3768 Pnt 2472 3749 Pnt 3190 3752 Pnt 3567 3740 Pnt 3712 3749 Pnt 3434 3749 Pnt 3138 3767 Pnt 2755 3747 Pnt 2953 3747 Pnt 2948 3740 Pnt 3787 3752 Pnt 3008 3749 Pnt 2899 3751 Pnt 2795 3739 Pnt 2831 3755 Pnt 2869 3757 Pnt 2416 3771 Pnt 2547 3831 Pnt 2471 3775 Pnt 2181 3777 Pnt 3354 3831 Pnt 3686 3779 Pnt 2566 3746 Pnt 2491 3759 Pnt 2516 3747 Pnt 3039 3745 Pnt 2700 3745 Pnt 2080 3914 Pnt 3031 3749 Pnt 3178 3746 Pnt 2865 3754 Pnt 2408 3798 Pnt 3367 3757 Pnt 3473 3750 Pnt 3618 3799 Pnt 3342 3757 Pnt 2843 3757 Pnt 2890 3865 Pnt 2527 3745 Pnt 2859 3745 Pnt 2888 3753 Pnt 2430 3750 Pnt 2242 3771 Pnt 2684 3746 Pnt 3293 2867 Pnt 4234 2721 Pnt 2959 3774 Pnt 3032 3746 Pnt 2547 3867 Pnt 2890 3744 Pnt 2018 3743 Pnt 3036 3739 Pnt 2640 3774 Pnt 2891 3774 Pnt 2666 3753 Pnt 2997 3767 Pnt 2836 3782 Pnt 3281 3746 Pnt 1930 3770 Pnt 2422 3742 Pnt 2997 3747 Pnt 2412 3742 Pnt 2756 2827 Pnt 2549 3781 Pnt 3008 3743 Pnt 2436 3737 Pnt 2484 3745 Pnt 1990 3805 Pnt 3029 3743 Pnt 2910 3749 Pnt 2708 3738 Pnt 2343 3748 Pnt 2577 3762 Pnt 2017 3819 Pnt 2685 3756 Pnt 2602 3755 Pnt 2429 3755 Pnt 2185 3769 Pnt 2642 3749 Pnt 2878 3756 Pnt 2623 3742 Pnt 2423 3764 Pnt 3924 3764 Pnt 3106 3745 Pnt 2859 3744 Pnt 2762 3750 Pnt 2520 3758 Pnt 2902 3738 Pnt 3130 3739 Pnt 2412 3746 Pnt 3015 3784 Pnt 3158 3758 Pnt 2520 3747 Pnt 3072 3738 Pnt 3063 3737 Pnt 2406 3747 Pnt 2934 3784 Pnt 2176 3748 Pnt 2816 3747 Pnt 3132 3747 Pnt 2612 3743 Pnt 3470 3759 Pnt 2917 3745 Pnt 2431 3744 Pnt 2879 3795 Pnt 2360 3803 Pnt 2799 3752 Pnt 2082 3850 Pnt 2739 3761 Pnt 2982 2779 Pnt 2797 3748 Pnt 3430 3746 Pnt 2725 3746 Pnt 3197 3748 Pnt 2432 3777 Pnt 3029 3757 Pnt 3049 3760 Pnt 2497 3749 Pnt 2089 3795 Pnt 4069 3750 Pnt 2849 3741 Pnt 3307 3742 Pnt 3234 3757 Pnt 1915 3801 Pnt 3119 3743 Pnt 1715 3888 Pnt 2924 3741 Pnt 2748 3893 Pnt 2629 3740 Pnt 2786 3751 Pnt 2642 3740 Pnt 2264 3796 Pnt 3688 2890 Pnt 3598 3757 Pnt 3277 3796 Pnt 3409 3747 Pnt 2863 3747 Pnt 3293 3743 Pnt 2704 3776 Pnt 3229 3746 Pnt 2513 3743 Pnt 3835 2951 Pnt 2611 3739 Pnt 2524 3733 Pnt 2871 3750 Pnt 2211 3798 Pnt 3584 3748 Pnt 2481 3751 Pnt 3574 3740 Pnt 3557 3736 Pnt 2841 3745 Pnt 3108 3740 Pnt 2490 3757 Pnt 2862 3743 Pnt 2739 3754 Pnt 2790 3745 Pnt 2546 3792 Pnt 3055 3745 Pnt 1985 3765 Pnt 3399 3747 Pnt 3157 3737 Pnt 2605 3748 Pnt 2491 3743 Pnt 2535 3740 Pnt 2897 3732 Pnt 2698 3744 Pnt 3056 3748 Pnt 2245 3742 Pnt 3028 3737 Pnt 2215 3745 Pnt 2477 3757 Pnt 3125 3741 Pnt 2789 3739 Pnt 2414 3871 Pnt 3252 3751 Pnt 2644 3759 Pnt 2823 3744 Pnt 2832 3755 Pnt 2273 3787 Pnt 3064 3754 Pnt 2628 3761 Pnt 2524 3755 Pnt 2532 3766 Pnt 2858 3739 Pnt 2617 3793 Pnt 2645 3756 Pnt 2652 3747 Pnt 3220 3739 Pnt 2137 3750 Pnt 2631 3802 Pnt 3268 3749 Pnt 2460 3788 Pnt 3480 3751 Pnt 3076 3745 Pnt 2898 3741 Pnt 2625 3735 Pnt 3152 3742 Pnt 2743 3763 Pnt 2729 3766 Pnt 2867 3739 Pnt 2384 3753 Pnt 2674 3753 Pnt 2090 3787 Pnt 2632 3741 Pnt 2713 3749 Pnt 2385 3800 Pnt 2643 3810 Pnt 2924 3765 Pnt 2583 3733 Pnt 2645 3775 Pnt 3334 3744 Pnt 2896 3757 Pnt 2662 3768 Pnt 2789 3742 Pnt 2895 3797 Pnt 2233 3757 Pnt 2342 3746 Pnt 2565 3761 Pnt 2155 3871 Pnt 2553 3791 Pnt 2902 3741 Pnt 2243 3802 Pnt 2588 3746 Pnt 2531 3760 Pnt 3145 3751 Pnt 3296 2781 Pnt 2986 3750 Pnt 3450 3760 Pnt 2988 3755 Pnt 2630 3756 Pnt 3939 3750 Pnt 3070 3746 Pnt 3006 3735 Pnt 2733 3761 Pnt 2370 3746 Pnt 2914 3750 Pnt 3740 3735 Pnt 2802 3755 Pnt 2539 3785 Pnt 2432 3751 Pnt 2633 3811 Pnt 2596 3758 Pnt 3699 2514 Pnt 2416 3807 Pnt 2810 3734 Pnt 2849 3758 Pnt 2526 3744 Pnt 2964 3806 Pnt 2020 3782 Pnt 3358 3739 Pnt 2633 3743 Pnt 3266 3784 Pnt 2202 3780 Pnt 2909 2498 Pnt 2890 3747 Pnt 3970 2887 Pnt 3030 3747 Pnt 2728 2801 Pnt 2749 3751 Pnt 3903 3744 Pnt 2577 3752 Pnt 3474 3747 Pnt 2709 3759 Pnt 2467 3790 Pnt 3147 3751 Pnt 2405 3761 Pnt 2711 3750 Pnt 2206 3833 Pnt 2950 3751 Pnt 2679 3751 Pnt 2566 3756 Pnt 2884 3750 Pnt 2343 3754 Pnt 2099 3802 Pnt 3152 3740 Pnt 2974 3815 Pnt 2658 3951 Pnt 2985 3761 Pnt 2791 3820 Pnt 2861 3753 Pnt 3741 3746 Pnt 2658 3745 Pnt 2630 3741 Pnt 3226 3746 Pnt 2542 3739 Pnt 3195 3756 Pnt 2937 3757 Pnt 2777 3763 Pnt 2175 3774 Pnt 3126 3739 Pnt 3311 3749 Pnt 2565 3756 Pnt 3176 3755 Pnt 2676 3793 Pnt 2768 3776 Pnt 2397 3899 Pnt 2633 3750 Pnt 2921 3746 Pnt 2430 3832 Pnt 2806 3763 Pnt 3189 3899 Pnt 2704 3745 Pnt 2659 3784 Pnt 2414 3755 Pnt 3054 3782 Pnt 2255 3898 Pnt 2581 3745 Pnt 2900 3807 Pnt 2460 3821 Pnt 3233 3745 Pnt 2939 3741 Pnt 3311 3807 Pnt 3300 3749 Pnt 2633 3735 Pnt 2416 3739 Pnt 3178 3735 Pnt 2396 3742 Pnt 2491 3746 Pnt 2320 3750 Pnt 3260 3747 Pnt 3100 3738 Pnt 2561 3783 Pnt 3081 3761 Pnt 2861 3750 Pnt 3124 3739 Pnt 2403 3786 Pnt 2871 3761 Pnt 2602 3759 Pnt 3909 3750 Pnt 3230 3761 Pnt 2340 3776 Pnt 3358 3757 Pnt 2723 3743 Pnt 3026 3740 Pnt 2758 3761 Pnt 2661 3744 Pnt 1983 3795 Pnt 2918 3749 Pnt 2446 3885 Pnt 3727 3774 Pnt 3716 3744 Pnt 2340 3833 Pnt 2858 3748 Pnt 2856 3762 Pnt 2183 3845 Pnt 2678 3793 Pnt 3007 3752 Pnt 3505 3845 Pnt 3006 3793 Pnt 2497 3746 Pnt 2970 3742 Pnt 3390 3763 Pnt 2940 3741 Pnt 3150 3744 Pnt 2867 3761 Pnt 2625 3776 Pnt 3353 3752 Pnt 2978 3818 Pnt 3045 2810 Pnt 2569 3818 Pnt 2989 3761 Pnt 2920 3746 Pnt 3681 3818 Pnt 2164 3753 Pnt 3023 3818 Pnt 3905 2864 Pnt 2926 3749 Pnt 3506 3816 Pnt 2757 3750 Pnt 3468 3749 Pnt 2214 3835 Pnt 3520 3739 Pnt 3332 3744 Pnt 2082 3840 Pnt 2976 3758 Pnt 2394 3753 Pnt 2532 3740 Pnt 1959 3796 Pnt 3422 3799 Pnt 3066 3759 Pnt 2513 3734 Pnt 2905 3756 Pnt 3346 3747 Pnt 2623 3756 Pnt 2929 3765 Pnt 2199 3822 Pnt 2919 3759 Pnt 4090 2868 Pnt 3067 3741 Pnt 3186 3738 Pnt 2346 3752 Pnt 2932 3742 Pnt 2398 3775 Pnt 2794 3779 Pnt 2282 3794 Pnt 3667 2607 Pnt 2878 3734 Pnt 2619 3779 Pnt 2056 3803 Pnt 3407 3745 Pnt 3117 3748 Pnt 2135 3764 Pnt 3432 3742 Pnt 3173 3761 Pnt 2371 3745 Pnt 2529 3749 Pnt 3286 3760 Pnt 2868 3760 Pnt 2551 3781 Pnt 2400 3762 Pnt 2904 3782 Pnt 3083 3756 Pnt 2679 3777 Pnt 2977 3781 Pnt 2526 3828 Pnt 3139 3762 Pnt 3179 3742 Pnt 3391 3751 Pnt 3023 3742 Pnt 2656 3742 Pnt 3010 3861 Pnt 2924 3744 Pnt 2919 3742 Pnt 2811 3756 Pnt 3089 3739 Pnt 2229 3780 Pnt 2117 3791 Pnt 2279 3777 Pnt 2966 3759 Pnt 2367 3765 Pnt 2883 3759 Pnt 2279 3822 Pnt 2826 3747 Pnt 2722 3740 Pnt 3820 3747 Pnt 2339 3742 Pnt 2515 3751 Pnt 3619 3765 Pnt 2384 3826 Pnt 2873 2634 Pnt 4102 3759 Pnt 2730 3758 Pnt 2138 3828 Pnt 2885 3826 Pnt 2645 3788 Pnt 2615 3819 Pnt 3065 3762 Pnt 2560 3760 Pnt 3008 3746 Pnt 2185 3770 Pnt 2020 3760 Pnt 2238 3800 Pnt 2418 3777 Pnt 2609 3760 Pnt 2080 3797 Pnt 3076 3749 Pnt 2455 3742 Pnt 3030 3800 Pnt 2430 3811 Pnt 2731 3796 Pnt 2975 3753 Pnt 2626 3740 Pnt 2570 3740 Pnt 2573 3743 Pnt 2540 3753 Pnt 2591 3738 Pnt 2199 3790 Pnt 2649 3743 Pnt 2344 3810 Pnt 2652 3747 Pnt 3160 3759 Pnt 2669 3741 Pnt 2484 3745 Pnt 2810 3741 Pnt 2573 3736 Pnt 2894 3754 Pnt 3728 3786 Pnt 2683 3763 Pnt 2576 3752 Pnt 2614 3743 Pnt 2757 3743 Pnt 2505 3831 Pnt 2949 3790 Pnt 2289 3767 Pnt 3472 3743 Pnt 2880 3757 Pnt 2550 3749 Pnt 2604 3757 Pnt 2576 3745 Pnt 2268 3784 Pnt 2682 3756 Pnt 2712 3772 Pnt 2621 3744 Pnt 3004 3780 Pnt 2420 3740 Pnt 2476 3739 Pnt 3128 3744 Pnt 3366 3754 Pnt 2860 3757 Pnt 2967 3744 Pnt 3299 3752 Pnt 2691 3741 Pnt 2216 3770 Pnt 2967 3753 Pnt 2259 3823 Pnt 2775 3831 Pnt 3155 3773 Pnt 2606 3745 Pnt 2628 3822 Pnt 2066 3829 Pnt 3145 3749 Pnt 3460 3773 Pnt 2766 3813 Pnt 2672 3801 Pnt 2203 3832 Pnt 3151 3747 Pnt 2638 3744 Pnt 2408 3774 Pnt 1959 3750 Pnt 2655 3742 Pnt 2862 3773 Pnt 3280 3801 Pnt 2737 3745 Pnt 2433 3745 Pnt 2981 3742 Pnt 3422 3797 Pnt 2625 3752 Pnt 3243 3743 Pnt 3505 3752 Pnt 2732 3749 Pnt 3026 3745 Pnt 2702 3745 Pnt 3414 3755 Pnt 2677 3807 Pnt 2661 3774 Pnt 2864 3746 Pnt 2360 3746 Pnt 3170 3751 Pnt 2926 3756 Pnt 2406 3782 Pnt 2999 3739 Pnt 2427 3739 Pnt 2699 3794 Pnt 1869 3812 Pnt 2804 3748 Pnt 2522 3750 Pnt 3276 3794 Pnt 2985 3776 Pnt 2102 3865 Pnt 2821 3755 Pnt 3334 3750 Pnt 2154 3814 Pnt 3146 3752 Pnt 2306 3804 Pnt 3431 3744 Pnt 2586 3750 Pnt 2718 3752 Pnt 2883 3750 Pnt 2637 3749 Pnt 3123 2644 Pnt 2694 3819 Pnt 3252 3747 Pnt 2549 3819 Pnt 2420 3761 Pnt 2980 3787 Pnt 2761 3766 Pnt 2299 3740 Pnt 2960 3736 Pnt 1965 3902 Pnt 2901 3797 Pnt 2095 3806 Pnt 3889 3746 Pnt 2329 3810 Pnt 3000 3807 Pnt 2216 3808 Pnt 2864 3747 Pnt 2686 3763 Pnt 3002 3738 Pnt 2568 3750 Pnt 2564 3756 Pnt 3007 3746 Pnt 3089 3738 Pnt 2439 3821 Pnt 2623 3741 Pnt 2906 3752 Pnt 3880 3747 Pnt 3170 3777 Pnt 2768 3752 Pnt 3260 3737 Pnt 2956 3773 Pnt 2456 3770 Pnt 2496 3823 Pnt 2582 3742 Pnt 2475 3834 Pnt 3639 3741 Pnt 2597 3793 Pnt 3067 3770 Pnt 2471 3768 Pnt 2330 3744 Pnt 2153 3867 Pnt 3598 3744 Pnt 2349 3780 Pnt 3199 3771 Pnt 3363 3733 Pnt 2454 3773 Pnt 3041 3778 Pnt 3511 3740 Pnt 2854 3735 Pnt 3180 2487 Pnt 2501 3743 Pnt 3651 3750 Pnt 2340 3784 Pnt 2086 3777 Pnt 2993 3750 Pnt 3510 3778 Pnt 2896 3733 Pnt 3215 3750 Pnt 2545 3739 Pnt 2558 3744 Pnt 2428 3765 Pnt 2451 3750 Pnt 3035 3736 Pnt 2592 3743 Pnt 3224 3761 Pnt 2695 3752 Pnt 2796 3762 Pnt 2375 3782 Pnt 2124 3748 Pnt 3017 3756 Pnt 2086 3816 Pnt 2333 3764 Pnt 3556 3815 Pnt 2766 3758 Pnt 2880 3756 Pnt 2103 3783 Pnt 2905 3740 Pnt 2521 3760 Pnt 2715 3745 Pnt 2673 3751 Pnt 2089 3750 Pnt 2952 3740 Pnt 3056 3759 Pnt 2699 3745 Pnt 3171 2716 Pnt 2869 3766 Pnt 2521 3739 Pnt 2237 3747 Pnt 2519 3740 Pnt 3158 3747 Pnt 2405 3751 Pnt 1958 3934 Pnt 2573 3747 Pnt 3094 3747 Pnt 2635 3803 Pnt 3628 3744 Pnt 2954 3803 Pnt 3422 3779 Pnt 3025 3734 Pnt 2950 3753 Pnt 3287 3754 Pnt 3137 3744 Pnt 2658 3744 Pnt 2909 3766 Pnt 2712 3805 Pnt 2266 3749 Pnt 3190 3805 Pnt 2860 3748 Pnt 3685 3753 Pnt 2255 3806 Pnt 2725 3753 Pnt 2002 3779 Pnt 2994 3742 Pnt 2423 3764 Pnt 2350 3815 Pnt 3026 3744 Pnt 2937 3742 Pnt 2548 3760 Pnt 2166 3831 Pnt 2877 3815 Pnt 2905 3741 Pnt 2251 3752 Pnt 3108 3780 Pnt 3149 3755 Pnt 2258 3807 Pnt 2900 3752 Pnt 2751 3752 Pnt 1972 3838 Pnt 2645 3742 Pnt 3238 3744 Pnt 3681 3752 Pnt 2714 3765 Pnt 2434 3758 Pnt 3182 3756 Pnt 2212 3810 Pnt 1894 3770 Pnt 2089 3766 Pnt 3453 3742 Pnt 2615 3765 Pnt 3210 3747 Pnt 2617 3773 Pnt 2866 3750 Pnt 2684 3789 Pnt 2743 3744 Pnt 2762 3790 Pnt 2975 3749 Pnt 2736 3742 Pnt 3194 3751 Pnt 3720 3790 Pnt 2426 3745 Pnt 3780 3783 Pnt 3923 3744 Pnt 2560 3759 Pnt 2628 3810 Pnt 3249 3743 Pnt 3419 3767 Pnt 2691 3749 Pnt 2855 3749 Pnt 1948 3792 Pnt 2888 3761 Pnt 2459 3810 Pnt 3977 2669 Pnt 2987 3759 Pnt 2282 3757 Pnt 2533 3748 Pnt 2366 3743 Pnt 2766 3754 Pnt 2792 3743 Pnt 3771 2804 Pnt 3204 3748 Pnt 3084 3775 Pnt 3929 3743 Pnt 2989 3755 Pnt 3022 3767 Pnt 2569 3756 Pnt 3408 2801 Pnt 3035 3744 Pnt 3903 3761 Pnt 2508 3802 Pnt 2292 3748 Pnt 3174 3745 Pnt 2670 3753 Pnt 3016 3779 Pnt 2730 3818 Pnt 3138 3744 Pnt 2075 3812 Pnt 3134 3744 Pnt 2721 3750 Pnt 2265 3756 Pnt 1974 3805 Pnt 3080 3754 Pnt 3279 3747 Pnt 2542 3750 Pnt 2314 3756 Pnt 3106 3747 Pnt 3427 3754 Pnt 3277 3752 Pnt 3221 3749 Pnt 2041 3805 Pnt 3019 3752 Pnt 3282 3742 Pnt 2798 3753 Pnt 2273 3797 Pnt 3088 3750 Pnt 3478 2641 Pnt 2444 3801 Pnt 3229 3742 Pnt 1990 3766 Pnt 2967 3763 Pnt 2742 3751 Pnt 2533 3759 Pnt 2805 3768 Pnt 2009 3771 Pnt 3215 3753 Pnt 3105 3742 Pnt 2243 3736 Pnt 2929 3743 Pnt 2873 3765 Pnt 2582 3744 Pnt 2534 3763 Pnt 2148 3733 Pnt 3881 3765 Pnt 2723 3742 Pnt 3108 3744 Pnt 2732 3737 Pnt 1859 3806 Pnt 2618 3755 Pnt 2708 3808 Pnt 3946 3733 Pnt 4094 3742 Pnt 3053 2569 Pnt 2454 3807 Pnt 2384 3747 Pnt 2019 3792 Pnt 2403 3760 Pnt 3341 3744 Pnt 2990 3741 Pnt 2397 3774 Pnt 2852 3759 Pnt 2883 3755 Pnt 2519 3741 Pnt 3394 3759 Pnt 2745 3772 Pnt 2405 3828 Pnt 2740 3754 Pnt 3099 3772 Pnt 2128 3757 Pnt 2836 3754 Pnt 2720 3859 Pnt 2494 3751 Pnt 2568 3740 Pnt 3068 3771 Pnt 2801 3745 Pnt 2559 3740 Pnt 2663 3811 Pnt 2944 3753 Pnt 2111 3868 Pnt 2641 3759 Pnt 2338 3821 Pnt 3247 2701 Pnt 2686 3855 Pnt 2432 3747 Pnt 2140 3785 Pnt 3186 3752 Pnt 2853 3753 Pnt 2534 3745 Pnt 2558 3786 Pnt 3746 3742 Pnt 2220 3780 Pnt 2835 3747 Pnt 2658 3777 Pnt 2536 3753 Pnt 3043 3813 Pnt 3385 3747 Pnt 2780 3748 Pnt 3180 2698 Pnt 2760 3773 Pnt 2998 3766 Pnt 3347 3762 Pnt 2822 3773 Pnt 2819 3756 Pnt 2474 3756 Pnt 4413 3767 Pnt 2383 3823 Pnt 2469 3748 Pnt 3377 3778 Pnt 3261 3762 Pnt 3003 3741 Pnt 2609 3775 Pnt 3276 2732 Pnt 2466 3739 Pnt 2234 3811 Pnt 3416 3759 Pnt 2757 3747 Pnt 3433 3743 Pnt 2789 3749 Pnt 2445 3749 Pnt 2479 3792 Pnt 3906 2825 Pnt 2192 3807 Pnt 2571 3751 Pnt 3349 3746 Pnt 2947 3745 Pnt 2626 3750 Pnt 2629 3744 Pnt 3056 3751 Pnt 3114 3745 Pnt 3011 3738 Pnt 3199 3744 Pnt 2802 3743 Pnt 2524 3811 Pnt 2824 3744 Pnt 2601 3775 Pnt 2813 3754 Pnt 3440 3766 Pnt 2567 3758 Pnt 1995 3763 Pnt 3254 3766 Pnt 3108 3752 Pnt 2656 3811 Pnt 2640 3738 Pnt 2527 3757 Pnt 2531 3787 Pnt 3113 3745 Pnt 2511 3855 Pnt 3363 3752 Pnt 2478 3812 Pnt 2477 3743 Pnt 2748 3749 Pnt 2823 3749 Pnt 2701 3745 Pnt 3999 3762 Pnt 2841 3812 Pnt 3710 3748 Pnt 3035 3745 Pnt 2561 3748 Pnt 3318 3764 Pnt 2943 3738 Pnt 2906 2642 Pnt 2344 3758 Pnt 2348 3734 Pnt 2815 3752 Pnt 2425 3802 Pnt 2542 3752 Pnt 3158 3763 Pnt 2667 3742 Pnt 3065 3795 Pnt 2457 3778 Pnt 2571 3741 Pnt 3206 3738 Pnt 3011 3761 Pnt 3265 3741 Pnt 2799 3753 Pnt 3267 3748 Pnt 2039 3800 Pnt 3052 3758 Pnt 2124 3755 Pnt 3286 3742 Pnt 2808 3742 Pnt 2705 3748 Pnt 3268 3748 Pnt 2640 3767 Pnt 2150 3768 Pnt 2897 3758 Pnt 3109 3742 Pnt 2708 3746 Pnt 2399 3744 Pnt 2368 3782 Pnt 3095 3746 Pnt 3167 3758 Pnt 2585 3779 Pnt 2504 3782 Pnt 2856 3744 Pnt 2342 3753 Pnt 2843 3763 Pnt 2802 3736 Pnt 2386 3772 Pnt 3345 3782 Pnt 2924 3739 Pnt 3286 3752 Pnt 2092 3816 Pnt 2493 3757 Pnt 2675 3744 Pnt 2531 3797 Pnt 1925 3786 Pnt 2655 3739 Pnt 2784 3742 Pnt 3183 3797 Pnt 2542 3755 Pnt 3526 3761 Pnt 2365 3751 Pnt 2364 3805 Pnt 2445 3771 Pnt 1974 3778 Pnt 2954 3761 Pnt 2739 3747 Pnt 3455 3765 Pnt 2896 3933 Pnt 3023 3747 Pnt 2689 3752 Pnt 2299 3793 Pnt 3165 3735 Pnt 2944 3773 Pnt 2366 3796 Pnt 4260 3752 Pnt 2529 3765 Pnt 3028 3753 Pnt 2595 3749 Pnt 3490 3773 Pnt 2712 3736 Pnt 3672 3750 Pnt 2408 3744 Pnt 3133 3749 Pnt 3023 3750 Pnt 2541 3791 Pnt 2293 3791 Pnt 2363 3766 Pnt 2584 3736 Pnt 2664 3818 Pnt 2793 3802 Pnt 3114 3736 Pnt 3502 3742 Pnt 2425 3740 Pnt 2933 3744 Pnt 2575 3767 Pnt 3174 3802 Pnt 3148 3749 Pnt 2717 3777 Pnt 3070 3740 Pnt 3236 3754 Pnt 2418 3749 Pnt 2923 2650 Pnt 2814 3749 Pnt 2627 3770 Pnt 2541 3745 Pnt 2498 3755 Pnt 2916 3771 Pnt 2667 3764 Pnt 2258 3847 Pnt 2755 3747 Pnt 2068 3805 Pnt 3567 3115 Pnt 2064 3771 Pnt 3115 3803 Pnt 2393 3746 Pnt 3346 3799 Pnt 2169 3764 Pnt 2046 3756 Pnt 3545 2834 Pnt 2319 3812 Pnt 3392 3752 Pnt 3389 3751 Pnt 2942 3742 Pnt 2652 3796 Pnt 2498 3762 Pnt 2351 3778 Pnt 2171 3810 Pnt 2766 3806 Pnt 2217 3769 Pnt 2273 3743 Pnt 2918 3810 Pnt 2305 3789 Pnt 3404 3754 Pnt 3143 3760 Pnt 2888 3745 Pnt 2544 3739 Pnt 2483 3750 Pnt 2434 2706 Pnt 2539 3756 Pnt 2699 3746 Pnt 2583 3738 Pnt 2902 3747 Pnt 3680 3749 Pnt 2655 3839 Pnt 2783 3746 Pnt 2569 3804 Pnt 2679 3739 Pnt 2661 3749 Pnt 2577 3739 Pnt 2362 3764 Pnt 2640 3743 Pnt 2717 3763 Pnt 3817 3744 Pnt 2675 3782 Pnt 2399 3923 Pnt 2625 3761 Pnt 2427 3739 Pnt 2706 3739 Pnt 2970 3737 Pnt 3929 3782 Pnt 2335 3845 Pnt 2335 3778 Pnt 3144 3737 Pnt 2786 3746 Pnt 2547 3807 Pnt 3081 3808 Pnt 3182 3769 Pnt 2911 3757 Pnt 4134 3743 Pnt 2574 3747 Pnt 3309 3751 Pnt 2932 2890 Pnt 2850 3764 Pnt 2935 3753 Pnt 2724 3766 Pnt 2518 3743 Pnt 2500 3759 Pnt 2250 3743 Pnt 3053 3751 Pnt 2708 3766 Pnt 3800 2765 Pnt 3054 3742 Pnt 2809 3735 Pnt 2806 3758 Pnt 2980 3739 Pnt 2698 3782 Pnt 2756 3747 Pnt 2519 3740 Pnt 3174 3747 Pnt 2270 3748 Pnt 2631 3747 Pnt 3027 3788 Pnt 2916 3781 Pnt 2678 3752 Pnt 1900 3803 Pnt 2659 3744 Pnt 3597 3740 Pnt 2417 3753 Pnt 2852 3743 Pnt 2162 3808 Pnt 2799 3778 Pnt 3047 3743 Pnt 3792 3758 Pnt 2527 3784 Pnt 3306 3797 Pnt 3133 3772 Pnt 2202 3806 Pnt 2908 3742 Pnt 2753 3778 Pnt 2230 3810 Pnt 2428 3740 Pnt 2106 3808 Pnt 2958 3786 Pnt 3525 3747 Pnt 2822 3743 Pnt 2176 3820 Pnt 2689 3745 Pnt 2420 3797 Pnt 2542 3771 Pnt 2681 3795 Pnt 2737 3750 Pnt 2302 3786 Pnt 3962 2643 Pnt 2431 3759 Pnt 2432 3738 Pnt 2591 3744 Pnt 3204 3762 Pnt 3512 3759 Pnt 2896 3745 Pnt 2564 3857 Pnt 2425 3761 Pnt 2470 3844 Pnt 3676 3746 Pnt 1908 3829 Pnt 3452 3768 Pnt 2723 3737 Pnt 3091 3769 Pnt 2316 3797 Pnt 2651 3752 Pnt 2164 3776 Pnt 2996 3768 Pnt 2930 3797 Pnt 2556 3748 Pnt 2942 3752 Pnt 2851 3778 Pnt 2800 3749 Pnt 2659 3757 Pnt 2274 3752 Pnt 2790 3746 Pnt 2385 3800 Pnt 2322 3749 Pnt 2634 3743 Pnt 2716 3744 Pnt 2489 3747 Pnt 2257 3759 Pnt 2103 3762 Pnt 2638 3742 Pnt 2310 3809 Pnt 2972 3738 Pnt 2180 3802 Pnt 2808 3740 Pnt 2369 3756 Pnt 3148 3756 Pnt 2651 3757 Pnt 2281 3768 Pnt 2909 3808 Pnt 3425 3738 Pnt 2539 3754 Pnt 3112 3770 Pnt 2684 3750 Pnt 2790 3760 Pnt 2607 3741 Pnt 2517 3804 Pnt 2021 3788 Pnt 2790 3815 Pnt 2651 3751 Pnt 2804 3736 Pnt 2673 3739 Pnt 2541 3737 Pnt 3095 3750 Pnt 2659 3815 Pnt 2277 3741 Pnt 2756 3761 Pnt 2129 3747 Pnt 3895 3737 Pnt 2584 3800 Pnt 2762 3750 Pnt 2755 3735 Pnt 2088 3847 Pnt 2343 3761 Pnt 2167 3818 Pnt 2629 3744 Pnt 2253 3823 Pnt 2581 3754 Pnt 3192 3847 Pnt 2905 3777 Pnt 2786 3748 Pnt 2594 3743 Pnt 2215 3821 Pnt 2654 3745 Pnt 3086 3752 Pnt 2926 3754 Pnt 2579 3744 Pnt 2326 3760 Pnt 2965 3911 Pnt 3358 3748 Pnt 2578 3755 Pnt 3388 2740 Pnt 2446 3778 Pnt 2850 3789 Pnt 1991 3808 Pnt 2621 3761 Pnt 2273 3740 Pnt 3613 3756 Pnt 2206 3747 Pnt 1942 3840 Pnt 2627 3761 Pnt 2946 3751 Pnt 2679 3745 Pnt 3089 3767 Pnt 2879 3743 Pnt 3087 3743 Pnt 2566 3743 Pnt 2701 3748 Pnt 2557 3812 Pnt 2904 3751 Pnt 2534 3751 Pnt 2524 3741 Pnt 2464 3739 Pnt 2925 3737 Pnt 2296 3901 Pnt 2067 3782 Pnt 2665 3743 Pnt 2428 3904 Pnt 2499 3779 Pnt 2401 3800 Pnt 2693 3798 Pnt 3053 3800 Pnt 4224 3737 Pnt 2985 3753 Pnt 2766 3741 Pnt 2496 3742 Pnt 3306 2857 Pnt 2961 3745 Pnt 2448 3766 Pnt 3078 3765 Pnt 3409 3809 Pnt 3357 3766 Pnt 2159 3752 Pnt 3109 3752 Pnt 2728 3758 Pnt 2280 3776 Pnt 3815 3752 Pnt 2238 3801 Pnt 3637 3809 Pnt 2717 3795 Pnt 2915 3737 Pnt 3020 3752 Pnt 2284 3819 Pnt 2457 3737 Pnt 2041 3818 Pnt 2212 3795 Pnt 3517 3764 Pnt 2158 3769 Pnt 2791 3739 Pnt 2790 3742 Pnt 2595 3799 Pnt 3709 3749 Pnt 2855 3758 Pnt 3468 3762 Pnt 2408 3798 Pnt 2595 3782 Pnt 3107 3753 Pnt 2039 3801 Pnt 3178 3741 Pnt 3098 3796 Pnt 2836 3742 Pnt 2356 3820 Pnt 2950 3782 Pnt 2388 3796 Pnt 3042 3734 Pnt 2622 3743 Pnt 2910 3741 Pnt 2478 3747 Pnt 2892 3748 Pnt 3286 3741 Pnt 2519 3776 Pnt 2264 3757 Pnt 2735 3759 Pnt 2021 3803 Pnt 2455 3762 Pnt 3146 3764 Pnt 2517 3754 Pnt 2568 3794 Pnt 2554 3844 Pnt 2606 3745 Pnt 2969 3836 Pnt 2494 3758 Pnt 2847 3737 Pnt 3979 3745 Pnt 3157 3754 Pnt 3009 3762 Pnt 2117 3856 Pnt 2487 3746 Pnt 2200 3758 Pnt 3329 3745 Pnt 3165 3773 Pnt 2889 3748 Pnt 2663 3771 Pnt 2589 3788 Pnt 3546 3742 Pnt 2775 3753 Pnt 2730 3789 Pnt 2089 3780 Pnt 2917 3758 Pnt 2930 2605 Pnt 2562 3747 Pnt 2035 3814 Pnt 1793 3833 Pnt 3129 3758 Pnt 2654 3771 Pnt 2740 3762 Pnt 2393 3807 Pnt 3926 3754 Pnt 2788 3745 Pnt 1847 3842 Pnt 2509 3747 Pnt 2985 3808 Pnt 2333 3735 Pnt 4147 3743 Pnt 3125 3749 Pnt 2958 3762 Pnt 2748 3825 Pnt 2985 3758 Pnt 2641 3757 Pnt 2622 3787 Pnt 2794 3765 Pnt 3176 3749 Pnt 3744 3757 Pnt 3746 3780 Pnt 2134 3749 Pnt 3724 3826 Pnt 2601 3752 Pnt 3272 3757 Pnt 3425 3760 Pnt 2319 3757 Pnt 3299 3779 Pnt 2896 3795 Pnt 2673 3790 Pnt 2938 3790 Pnt 2456 3799 Pnt 2282 3756 Pnt 3203 3747 Pnt 3163 3763 Pnt 2300 3777 Pnt 2718 3824 Pnt 2382 3747 Pnt 2628 3839 Pnt 2186 3750 Pnt 2776 3749 Pnt 2570 3766 Pnt 2440 3748 Pnt 2662 3740 Pnt 2296 3750 Pnt 3125 3760 Pnt 3135 3753 Pnt 4131 3756 Pnt 2434 3744 Pnt 3076 3745 Pnt 2704 3802 Pnt 2577 3741 Pnt 2854 3741 Pnt 2580 3740 Pnt 2308 3786 Pnt 2857 3764 Pnt 2557 3757 Pnt 3540 3743 Pnt 2555 3734 Pnt 3745 3757 Pnt 3784 2691 Pnt 2506 3818 Pnt 3174 3759 Pnt 3651 2501 Pnt 2187 3793 Pnt 2806 3748 Pnt 2893 3756 Pnt 3046 3743 Pnt 2442 3741 Pnt 2518 3753 Pnt 2930 3743 Pnt 2390 3803 Pnt 3307 3746 Pnt 2374 3743 Pnt 3364 3762 Pnt 2591 3804 Pnt 2009 3824 Pnt 2715 3743 Pnt 2727 3736 Pnt 2705 3747 Pnt 2613 3757 Pnt 2499 3763 Pnt 2636 3755 Pnt 2882 3747 Pnt 2582 3753 Pnt 2644 3827 Pnt 2097 3779 Pnt 2958 3754 Pnt 3320 3749 Pnt 2530 3761 Pnt 4121 3753 Pnt 3103 3747 Pnt 2684 3764 Pnt 2650 3747 Pnt 3448 3754 Pnt 3031 3750 Pnt 2184 3744 Pnt 3166 3742 Pnt 3977 3752 Pnt 3227 3770 Pnt 2760 3742 Pnt 2282 3735 Pnt 3851 3749 Pnt 2788 3743 Pnt 2511 3791 Pnt 2559 3743 Pnt 2456 3780 Pnt 3465 2837 Pnt 2734 3738 Pnt 2617 3768 Pnt 2677 3748 Pnt 3175 2866 Pnt 3187 3744 Pnt 3498 3768 Pnt 2729 3757 Pnt 2406 3837 Pnt 3227 3736 Pnt 2505 3776 Pnt 3395 3772 Pnt 2469 3756 Pnt 2262 3748 Pnt 2829 3741 Pnt 2639 3775 Pnt 2351 3821 Pnt 2546 3762 Pnt 3555 3747 Pnt 2490 3817 Pnt 3056 3744 Pnt 2825 3757 Pnt 2604 3736 Pnt 3257 3780 Pnt 2362 3789 Pnt 2761 3842 Pnt 3900 2789 Pnt 3065 3753 Pnt 2935 3821 Pnt 3439 3753 Pnt 4109 3766 Pnt 2891 3744 Pnt 3483 3744 Pnt 2562 3740 Pnt 3256 3782 Pnt 2306 3870 Pnt 2030 3804 Pnt 2481 3753 Pnt 3037 3739 Pnt 2772 3808 Pnt 3170 3746 Pnt 3486 2641 Pnt 2638 3768 Pnt 2142 3797 Pnt 3342 3753 Pnt 2483 3742 Pnt 2185 3754 Pnt 2417 3764 Pnt 2440 3844 Pnt 2640 3756 Pnt 3002 3826 Pnt 3271 3746 Pnt 2485 3740 Pnt 2862 3741 Pnt 2824 3762 Pnt 2095 3811 Pnt 3089 3741 Pnt 3163 3757 Pnt 3134 3741 Pnt 2760 3740 Pnt 3028 3771 Pnt 2345 3767 Pnt 3421 3750 Pnt 2938 3767 Pnt 2811 3743 Pnt 2848 3748 Pnt 2940 3818 Pnt 2331 3828 Pnt 3199 3846 Pnt 2912 3829 Pnt 2989 3818 Pnt 2950 3748 Pnt 2446 3742 Pnt 3649 3739 Pnt 2921 3750 Pnt 3151 3746 Pnt 2812 3743 Pnt 2631 2667 Pnt 2208 3825 Pnt 2425 3758 Pnt 3047 3743 Pnt 2752 3753 Pnt 2978 3744 Pnt 2069 3744 Pnt 2383 3826 Pnt 3549 3741 Pnt 3038 3750 Pnt 2371 3757 Pnt 3469 3748 Pnt 3109 3743 Pnt 2189 3752 Pnt 2848 3774 Pnt 3632 3752 Pnt 3357 3746 Pnt 4020 3750 Pnt 3180 3794 Pnt 2914 3767 Pnt 2779 3768 Pnt 3077 3765 Pnt 2419 3760 Pnt 3761 3759 Pnt 3937 3759 Pnt 2907 3747 Pnt 2702 3760 Pnt 2492 3759 Pnt 1947 3816 Pnt 2616 3739 Pnt 3336 3750 Pnt 2558 3827 Pnt 2603 3763 Pnt 3667 3762 Pnt 2283 3760 Pnt 3257 3750 Pnt 2602 3755 Pnt 2827 2870 Pnt 3378 3754 Pnt 2118 3814 Pnt 2832 3772 Pnt 2970 3760 Pnt 2504 3760 Pnt 2184 3777 Pnt 3009 3754 Pnt 3183 3772 Pnt 2855 3756 Pnt 2499 3777 Pnt 1784 3770 Pnt 2814 3770 Pnt 2671 3800 Pnt 2651 3748 Pnt 2681 3803 Pnt 3630 3741 Pnt 3058 3750 Pnt 2626 3817 Pnt 2951 3748 Pnt 3140 3744 Pnt 2572 3757 Pnt 2310 3756 Pnt 3985 3749 Pnt 2909 3748 Pnt 2640 2673 Pnt 1993 3789 Pnt 2282 3805 Pnt 3681 3739 Pnt 2758 3747 Pnt 2642 3742 Pnt 3652 3792 Pnt 2562 3747 Pnt 2952 3747 Pnt 2915 3747 Pnt 2704 3785 Pnt 3186 3785 Pnt 2255 3790 Pnt 2785 3739 Pnt 2641 3757 Pnt 3271 3735 Pnt 2319 3820 Pnt 2415 3740 Pnt 2873 3746 Pnt 3772 3744 Pnt 2600 3743 Pnt 2064 3806 Pnt 2760 3761 Pnt 2617 3739 Pnt 2094 3837 Pnt 2286 3741 Pnt 3526 3745 Pnt 2510 3805 Pnt 2661 3752 Pnt 2184 3771 Pnt 3175 3750 Pnt 2543 3745 Pnt 2349 3799 Pnt 2832 3754 Pnt 3483 3750 Pnt 2561 3740 Pnt 2804 3745 Pnt 2423 3742 Pnt 2336 3741 Pnt 2819 3744 Pnt 3757 3745 Pnt 2213 3837 Pnt 2955 2753 Pnt 2460 3795 Pnt 3171 3764 Pnt 3100 3795 Pnt 2905 3780 Pnt 2193 3742 Pnt 2973 3746 Pnt 3485 3764 Pnt 2055 3794 Pnt 2584 3752 Pnt 2530 3758 Pnt 2316 3768 Pnt 3768 2776 Pnt 3116 3751 Pnt 2589 3934 Pnt 3081 3934 Pnt 2692 3793 Pnt 2788 3743 Pnt 2542 3743 Pnt 3313 3743 Pnt 2280 3816 Pnt 3018 3748 Pnt 3236 3742 Pnt 2986 2419 Pnt 2939 3749 Pnt 3174 3748 Pnt 3692 3743 Pnt 3234 3763 Pnt 2556 3770 Pnt 4190 3749 Pnt 3484 3744 Pnt 2386 3762 Pnt 3000 3753 Pnt 2921 3754 Pnt 2979 3764 Pnt 2846 3768 Pnt 3327 3764 Pnt 3106 3749 Pnt 3529 3750 Pnt 3445 3753 Pnt 2587 3741 Pnt 2682 3745 Pnt 2747 3755 Pnt 3074 3761 Pnt 2778 3745 Pnt 2647 3772 Pnt 3310 3736 Pnt 3143 3745 Pnt 2898 3772 Pnt 3208 2564 Pnt 2466 3741 Pnt 2420 3744 Pnt 2367 3771 Pnt 2202 3807 Pnt 3195 3771 Pnt 3264 3751 Pnt 2322 3804 Pnt 2937 3746 Pnt 2765 3812 Pnt 2774 3744 Pnt 2429 3767 Pnt 3394 3764 Pnt 4297 3744 Pnt 3238 3744 Pnt 2971 3844 Pnt 2293 3822 Pnt 3120 3742 Pnt 2584 3757 Pnt 2901 3823 Pnt 2659 3762 Pnt 2608 3745 Pnt 2603 3757 Pnt 3127 3745 Pnt 2906 3748 Pnt 2860 3742 Pnt 2340 3853 Pnt 2862 3757 Pnt 3184 2819 Pnt 2859 3775 Pnt 2334 3737 Pnt 2134 3828 Pnt 2037 3914 Pnt 3333 3746 Pnt 2704 3751 Pnt 2537 3914 Pnt 2194 3770 Pnt 2184 3823 Pnt 3304 3735 Pnt 2929 3808 Pnt 3132 2475 Pnt 4004 3757 Pnt 2808 3744 Pnt 2644 3823 Pnt 2437 3780 Pnt 2249 3738 Pnt 2801 3749 Pnt 2564 2763 Pnt 2629 3744 Pnt 2397 3765 Pnt 2259 3777 Pnt 2711 3754 Pnt 3086 3748 Pnt 2631 2790 Pnt 2726 3750 Pnt 2369 3762 Pnt 2672 3779 Pnt 2268 3746 Pnt 2369 3765 Pnt 2190 3772 Pnt 2995 3765 Pnt 2777 3753 Pnt 2715 3747 Pnt 3183 3765 Pnt 2314 3836 Pnt 2923 3789 Pnt 2209 3794 Pnt 2942 3747 Pnt 3235 3757 Pnt 2602 3836 Pnt 2422 3741 Pnt 2341 3788 Pnt 2851 3747 Pnt 2727 3741 Pnt 3055 3746 Pnt 2316 3814 Pnt 2771 3751 Pnt 2342 3831 Pnt 1956 3842 Pnt 2891 3744 Pnt 3054 3747 Pnt 2856 3769 Pnt 2682 3799 Pnt 3014 3850 Pnt 2859 3736 Pnt 2957 3750 Pnt 2846 3793 Pnt 2896 3752 Pnt 2754 3807 Pnt 3296 3746 Pnt 2639 3798 Pnt 3102 3769 Pnt 2681 3747 Pnt 2856 3744 Pnt 2707 3773 Pnt 3683 2808 Pnt 2672 3744 Pnt 3095 3749 Pnt 2720 3764 Pnt 2916 3775 Pnt 2691 3745 Pnt 2575 3800 Pnt 2430 3768 Pnt 1861 3819 Pnt 3381 2810 Pnt 2860 3745 Pnt 2768 3764 Pnt 2671 3757 Pnt 2547 3736 Pnt 2075 3795 Pnt 2802 3755 Pnt 2768 3736 Pnt 2595 3753 Pnt 2763 3761 Pnt 2481 3751 Pnt 2489 3769 Pnt 2258 3774 Pnt 2600 3750 Pnt 2552 3770 Pnt 3007 3742 Pnt 2748 3751 Pnt 2586 3740 Pnt 3614 3771 Pnt 2543 3745 Pnt 2477 3784 Pnt 3085 3752 Pnt 2358 3814 Pnt 3115 3751 Pnt 2909 3787 Pnt 3562 3752 Pnt 3772 2712 Pnt 2632 3738 Pnt 2974 3749 Pnt 2708 3788 Pnt 2563 3742 Pnt 3181 2643 Pnt 2536 3840 Pnt 2269 3742 Pnt 2429 3787 Pnt 2926 3753 Pnt 2640 3767 Pnt 2273 3737 Pnt 2711 3741 Pnt 2453 3741 Pnt 2597 3744 Pnt 2087 3840 Pnt 2598 3884 Pnt 2983 3856 Pnt 2904 3765 Pnt 3499 3856 Pnt 3195 3742 Pnt 2374 3934 Pnt 1979 3792 Pnt 2886 3741 Pnt 2546 3768 Pnt 2602 3750 Pnt 3489 3792 Pnt 2713 3782 Pnt 2745 3801 Pnt 3965 3744 Pnt 3499 3749 Pnt 1785 3743 Pnt 3097 3748 Pnt 2470 3742 Pnt 2431 3811 Pnt 2975 3765 Pnt 2720 3760 Pnt 2851 3742 Pnt 2792 3793 Pnt 3127 3744 Pnt 2943 3735 Pnt 2959 3746 Pnt 2806 3793 Pnt 2702 3743 Pnt 3161 3750 Pnt 3241 3735 Pnt 2454 3746 Pnt 2556 3750 Pnt 3352 3746 Pnt 2762 3756 Pnt 2480 3804 Pnt 3004 3751 Pnt 2827 3743 Pnt 2546 3752 Pnt 2899 3744 Pnt 2071 3782 Pnt 2656 3790 Pnt 2660 3750 Pnt 3784 3744 Pnt 3647 3807 Pnt 2872 3747 Pnt 3145 3735 Pnt 3460 2746 Pnt 2435 3816 Pnt 3015 3747 Pnt 3264 3750 Pnt 2568 3775 Pnt 2365 3759 Pnt 3076 2390 Pnt 2553 3785 Pnt 3694 3816 Pnt 2765 3773 Pnt 2536 3770 Pnt 2143 3733 Pnt 3236 3749 Pnt 3483 3745 Pnt 2844 3773 Pnt 2777 3770 Pnt 2542 3733 Pnt 2782 3755 Pnt 3187 3752 Pnt 2386 3745 Pnt 3203 3743 Pnt 2776 3774 Pnt 3068 3744 Pnt 2380 3746 Pnt 2566 3762 Pnt 3064 3743 Pnt 2757 3768 Pnt 2318 3805 Pnt 3710 2748 Pnt 2812 3740 Pnt 2749 3744 Pnt 3158 3748 Pnt 3055 2791 Pnt 2652 3745 Pnt 2957 3752 Pnt 3317 3745 Pnt 2853 3739 Pnt 3738 3759 Pnt 2694 3745 Pnt 2771 3802 Pnt 2284 3749 Pnt 2197 3747 Pnt 2157 3742 Pnt 3437 3802 Pnt 1976 3799 Pnt 2991 3749 Pnt 2444 3774 Pnt 2843 3742 Pnt 3490 2724 Pnt 2561 3864 Pnt 2959 3768 Pnt 2484 3742 Pnt 3729 3757 Pnt 1975 3816 Pnt 2473 3797 Pnt 2200 3826 Pnt 3401 3797 Pnt 3229 3767 Pnt 2638 3770 Pnt 2939 3742 Pnt 2844 3739 Pnt 3312 3767 Pnt 2882 3746 Pnt 2714 3801 Pnt 2848 3743 Pnt 2749 3755 Pnt 2911 3780 Pnt 2802 3817 Pnt 3597 3740 Pnt 2161 3898 Pnt 3142 3740 Pnt 2904 3748 Pnt 2538 3831 Pnt 2464 3750 Pnt 2637 3750 Pnt 2337 3735 Pnt 2752 3775 Pnt 3372 3738 Pnt 2650 3745 Pnt 2976 3764 Pnt 2875 3741 Pnt 3141 3762 Pnt 2539 2374 Pnt 2195 3786 Pnt 2699 3750 Pnt 2876 3747 Pnt 2149 3850 Pnt 2691 3761 Pnt 3923 3758 Pnt 2447 3770 Pnt 2789 3761 Pnt 2493 3756 Pnt 3095 3756 Pnt 2529 3761 Pnt 3146 3762 Pnt 2886 3755 Pnt 2568 3773 Pnt 3006 3750 Pnt 2621 3770 Pnt 3746 3745 Pnt 2663 3746 Pnt 2325 3865 Pnt 3135 3770 Pnt 2642 3803 Pnt 3197 3740 Pnt 2623 3745 Pnt 2695 3747 Pnt 2630 3865 Pnt 2457 3742 Pnt 2097 3796 Pnt 2943 3739 Pnt 3651 3754 Pnt 2984 3761 Pnt 2059 3841 Pnt 2739 3795 Pnt 3066 2509 Pnt 2863 3746 Pnt 3572 3761 Pnt 2215 3771 Pnt 3192 3842 Pnt 2364 3943 Pnt 3241 3761 Pnt 2660 3746 Pnt 2956 3743 Pnt 2625 3742 Pnt 2887 3752 Pnt 2269 3761 Pnt 2720 3776 Pnt 3239 3762 Pnt 2710 3743 Pnt 2244 3753 Pnt 2777 3760 Pnt 3070 3761 Pnt 2866 3748 Pnt 2687 3755 Pnt 2227 3772 Pnt 2827 3743 Pnt 2710 3760 Pnt 2289 3746 Pnt 2789 3750 Pnt 2478 3737 Pnt 1887 3770 Pnt 2497 3753 Pnt 3285 3756 Pnt 2569 3749 Pnt 2570 3755 Pnt 3119 3741 Pnt 2772 3745 Pnt 2501 3784 Pnt 2100 3753 Pnt 2659 3741 Pnt 3018 3751 Pnt 2953 3742 Pnt 2751 3756 Pnt 2625 3756 Pnt 2713 3749 Pnt 3190 3744 Pnt 2562 3742 Pnt 2730 3748 Pnt 2671 3744 Pnt 3995 3742 Pnt 2614 3737 Pnt 2781 3749 Pnt 3073 3752 Pnt 2463 3757 Pnt 2688 3738 Pnt 2011 3871 Pnt 3140 3757 Pnt 3130 3763 Pnt 2274 3787 Pnt 2495 3751 Pnt 2283 3793 Pnt 3270 3736 Pnt 2762 3754 Pnt 2824 3745 Pnt 2832 3745 Pnt 2654 3810 Pnt 2538 3757 Pnt 3489 3745 Pnt 2419 3788 Pnt 3977 3759 Pnt 2164 3769 Pnt 2479 3764 Pnt 2446 3757 Pnt 2884 3807 Pnt 3833 2900 Pnt 2456 3746 Pnt 2918 3764 Pnt 2662 3768 Pnt 3379 3735 Pnt 2706 3742 Pnt 2672 3797 Pnt 3845 2901 Pnt 2424 3791 Pnt 2850 3753 Pnt 2947 3808 Pnt 2001 3893 Pnt 2892 3741 Pnt 3726 3753 Pnt 2594 3808 Pnt 2911 3755 Pnt 2741 3749 Pnt 2618 3787 Pnt 3709 3751 Pnt 2960 3740 Pnt 2296 3787 Pnt 2966 2802 Pnt 2884 3758 Pnt 2760 3858 Pnt 1965 3802 Pnt 2132 3756 Pnt 3094 3750 Pnt 2469 3761 Pnt 3721 3744 Pnt 2302 3777 Pnt 2961 3762 Pnt 3320 3820 Pnt 3263 3748 Pnt 2461 3820 Pnt 2628 3798 Pnt 2496 3748 Pnt 1981 3789 Pnt 3010 3745 Pnt 2486 3745 Pnt 2486 3745 Pnt 2658 3777 Pnt 3066 3751 Pnt 3478 3755 Pnt 3285 3746 Pnt 2092 3869 Pnt 3307 3759 Pnt 2381 3745 Pnt 3866 3743 Pnt 2600 3759 Pnt 2540 3807 Pnt 2801 3774 Pnt 2721 3800 Pnt 3820 3755 Pnt 3425 3759 Pnt 3207 3774 Pnt 2863 3745 Pnt 2514 3752 Pnt 3140 3749 Pnt 2175 3740 Pnt 2743 3784 Pnt 2302 3806 Pnt 2985 3746 Pnt 3292 3749 Pnt 2823 3738 Pnt 3125 2827 Pnt 2775 3951 Pnt 3983 3762 Pnt 3058 3759 Pnt 2955 3743 Pnt 3011 3759 Pnt 2852 3818 Pnt 2771 3816 Pnt 3364 3757 Pnt 2730 3739 Pnt 3353 3753 Pnt 3168 3746 Pnt 2485 3763 Pnt 3207 3750 Pnt 2299 3806 Pnt 2773 3761 Pnt 2500 3743 Pnt 2583 3739 Pnt 2311 3776 Pnt 1991 3840 Pnt 4095 2821 Pnt 4059 2682 Pnt 2130 3833 Pnt 2944 3743 Pnt 2096 3831 Pnt 2743 3753 Pnt 2978 3758 Pnt 3280 3828 Pnt 3141 3816 Pnt 2790 3748 Pnt 3204 3748 Pnt 2678 3745 Pnt 2691 3749 Pnt 2704 3744 Pnt 2135 3845 Pnt 2145 3748 Pnt 2174 3780 Pnt 2412 3835 Pnt 2720 3744 Pnt 2273 3832 Pnt 2460 3739 Pnt 2863 3738 Pnt 2628 3744 Pnt 2802 3752 Pnt 3091 3744 Pnt 2555 3763 Pnt 3201 3754 Pnt 3059 3746 Pnt 3034 3746 Pnt 3461 3754 Pnt 2750 3757 Pnt 2993 3742 Pnt 2661 3751 Pnt 2398 3803 Pnt 2831 3752 Pnt 2695 3799 Pnt 2908 3747 Pnt 2692 3741 Pnt 3266 3752 Pnt 2053 3792 Pnt 3061 3751 Pnt 3137 3759 Pnt 2734 3752 Pnt 2680 3748 Pnt 2561 3821 Pnt 3577 3740 Pnt 2880 3745 Pnt 2423 3790 Pnt 2967 3741 Pnt 2443 3761 Pnt 2787 3755 Pnt 2496 3819 Pnt 2135 3829 Pnt 3065 3750 Pnt 1739 3737 Pnt 2528 3748 Pnt 3479 2723 Pnt 2285 3830 Pnt 2773 3819 Pnt 3329 3830 Pnt 2766 3742 Pnt 3128 3779 Pnt 2574 3760 Pnt 2701 3810 Pnt 3633 3746 Pnt 2393 3799 Pnt 3423 3772 Pnt 2849 3756 Pnt 2621 3748 Pnt 2883 3777 Pnt 2397 3777 Pnt 2898 3761 Pnt 2738 3749 Pnt 3878 3761 Pnt 2887 2667 Pnt 2851 3740 Pnt 3069 3760 Pnt 2780 3762 Pnt 2436 3736 Pnt 3076 3755 Pnt 3028 3740 Pnt 3665 3760 Pnt 2299 3776 Pnt 2290 3810 Pnt 2795 3742 Pnt 3138 3758 Pnt 2518 3752 Pnt 2971 3739 Pnt 2617 3741 Pnt 2774 3739 Pnt 2462 3743 Pnt 2380 3750 Pnt 2879 3762 Pnt 3205 3743 Pnt 2708 3746 Pnt 2464 3810 Pnt 2973 3751 Pnt 2058 3790 Pnt 3641 3806 Pnt 2971 3738 Pnt 1950 3801 Pnt 2812 3739 Pnt 2739 3802 Pnt 3574 3797 Pnt 2290 3788 Pnt 3009 3801 Pnt 3278 3739 Pnt 2286 3750 Pnt 2502 3832 Pnt 3489 2817 Pnt 2790 3744 Pnt 2579 3742 Pnt 3356 3749 Pnt 2727 3744 Pnt 2314 3784 Pnt 3173 2803 Pnt 2542 3751 Pnt 2520 2796 Pnt 1975 3824 Pnt 2486 3767 Pnt 3804 3750 Pnt 1999 3804 Pnt 2419 3790 Pnt 2745 3772 Pnt 2040 3832 Pnt 2707 3740 Pnt 2415 3790 Pnt 2961 3744 Pnt 2466 3753 Pnt 3606 3740 Pnt 2717 3780 Pnt 2696 3743 Pnt 2627 3738 Pnt 3124 3753 Pnt 2635 3773 Pnt 3201 3773 Pnt 2644 3822 Pnt 2762 3743 Pnt 2368 3800 Pnt 3443 3748 Pnt 2608 3750 Pnt 2416 3764 Pnt 2942 3756 Pnt 3537 3753 Pnt 2437 3772 Pnt 2978 3750 Pnt 1962 3794 Pnt 3015 3828 Pnt 2938 3798 Pnt 2672 3741 Pnt 2058 3793 Pnt 3779 3741 Pnt 2595 3760 Pnt 2535 3752 Pnt 3177 3739 Pnt 3791 3749 Pnt 2784 3750 Pnt 2659 3753 Pnt 3061 3743 Pnt 3749 3750 Pnt 2883 3744 Pnt 2215 3770 Pnt 3076 3819 Pnt 3060 3741 Pnt 2913 2802 Pnt 2702 3757 Pnt 2646 3801 Pnt 1755 3796 Pnt 2244 3807 Pnt 2291 3776 Pnt 2907 3797 Pnt 2820 3736 Pnt 3539 3783 Pnt 2910 3755 Pnt 3172 3736 Pnt 3321 3746 Pnt 2531 3835 Pnt 2362 3885 Pnt 3792 3746 Pnt 2378 3755 Pnt 2748 3744 Pnt 2981 3749 Pnt 3563 3761 Pnt 2376 3767 Pnt 2924 3794 Pnt 2699 3741 Pnt 2964 3749 Pnt 2499 3752 Pnt 2845 3761 Pnt 2884 3756 Pnt 2907 3807 Pnt 2858 3807 Pnt 2087 3806 Pnt 3191 3736 Pnt 3792 3756 Pnt 2685 3750 Pnt 2593 3755 Pnt 2665 2774 Pnt 2231 3813 Pnt 3109 3756 Pnt 3004 3740 Pnt 3931 3765 Pnt 2210 3832 Pnt 2570 3742 Pnt 2528 3756 Pnt 3378 3749 Pnt 3314 3756 Pnt 2523 3773 Pnt 2522 3745 Pnt 2977 3756 Pnt 2438 3761 Pnt 2663 3750 Pnt 3407 3741 Pnt 2771 3765 Pnt 2598 3749 Pnt 2144 3805 Pnt 3158 3786 Pnt 2311 3741 Pnt 3232 3752 Pnt 2801 3743 Pnt 2579 3752 Pnt 2703 3747 Pnt 2717 3741 Pnt 2711 3734 Pnt 2481 3745 Pnt 3028 2767 Pnt 3268 3754 Pnt 2939 3742 Pnt 2220 3783 Pnt 2548 3777 Pnt 3190 3742 Pnt 2638 3752 Pnt 2775 3739 Pnt 2779 3783 Pnt 2783 3751 Pnt 2446 3756 Pnt 2635 3743 Pnt 1970 3780 Pnt 2783 3765 Pnt 3403 3750 Pnt 2386 3739 Pnt 3154 3752 Pnt 2633 3756 Pnt 3035 3765 Pnt 3629 3743 Pnt 2666 3757 Pnt 2422 3762 Pnt 1984 3937 Pnt 3075 3746 Pnt 2875 3739 Pnt 3047 2868 Pnt 2692 3757 Pnt 2185 3748 Pnt 2932 3759 Pnt 2482 3815 Pnt 2923 3762 Pnt 1823 3828 Pnt 3176 3746 Pnt 2306 3822 Pnt 2595 3828 Pnt 3415 3758 Pnt 3248 3744 Pnt 2610 3742 Pnt 2614 3757 Pnt 3039 3753 Pnt 2810 3757 Pnt 3453 3758 Pnt 2540 3738 Pnt 2873 3747 Pnt 2294 3805 Pnt 2392 3738 Pnt 2486 3756 Pnt 3900 2504 Pnt 3028 3759 Pnt 2781 3749 Pnt 2818 3756 Pnt 2820 3751 Pnt 2667 3742 Pnt 2269 3779 Pnt 2346 3766 Pnt 3041 2951 Pnt 2673 3747 Pnt 3078 3747 Pnt 3834 3752 Pnt 2486 3773 Pnt 2837 3751 Pnt 2527 3747 Pnt 2920 3762 Pnt 2517 3749 Pnt 2816 3754 Pnt 2658 3747 Pnt 3139 3744 Pnt 2937 3743 Pnt 2579 3822 Pnt 2246 3747 Pnt 2753 3826 Pnt 2484 3743 Pnt 2710 3738 Pnt 3381 3742 Pnt 4027 3738 Pnt 2555 3743 Pnt 3371 3759 Pnt 2662 3746 Pnt 2682 3750 Pnt 2975 3759 Pnt 2364 3784 Pnt 3629 3754 Pnt 3040 3754 Pnt 2631 3773 Pnt 3178 3754 Pnt 2563 3749 Pnt 2467 3775 Pnt 2418 3823 Pnt 2028 3749 Pnt 3210 3753 Pnt 2730 3777 Pnt 2265 3794 Pnt 2290 3753 Pnt 2719 3759 Pnt 2219 3770 Pnt 3856 3745 Pnt 3212 3745 Pnt 3052 3813 Pnt 2290 3793 Pnt 3702 2606 Pnt 1870 3801 Pnt 2990 2664 Pnt 2897 3745 Pnt 2033 3805 Pnt 2617 3745 Pnt 3308 3756 Pnt 3330 3744 Pnt 2908 3754 Pnt 2239 3764 Pnt 2404 3791 Pnt 3651 3741 Pnt 2562 3740 Pnt 2963 3753 Pnt 2991 3745 Pnt 3288 3741 Pnt 3058 3747 Pnt 2946 3744 Pnt 2134 3831 Pnt 3212 3742 Pnt 2434 3749 Pnt 2589 3773 Pnt 2612 3768 Pnt 3096 3744 Pnt 3434 3749 Pnt 3783 3755 Pnt 2517 3761 Pnt 3058 3761 Pnt 2464 3756 Pnt 2329 3741 Pnt 3549 3752 Pnt 2722 3812 Pnt 3123 3741 Pnt 2252 3821 Pnt 2994 3799 Pnt 2489 3774 Pnt 2737 3764 Pnt 2129 3772 Pnt 3807 3753 Pnt 2875 3774 Pnt 3069 3821 Pnt 2543 3760 Pnt 2031 3812 Pnt 2848 3794 Pnt 2343 3828 Pnt 2925 3753 Pnt 2170 3781 Pnt 2803 3772 Pnt 2790 3752 Pnt 2082 3815 Pnt 2994 3751 Pnt 3564 3753 Pnt 2178 3869 Pnt 2601 3740 Pnt 1939 3838 Pnt 2884 3778 Pnt 2391 3760 Pnt 2797 3752 Pnt 2641 3757 Pnt 2880 3758 Pnt 2314 3800 Pnt 2687 3744 Pnt 2324 3774 Pnt 3611 3744 Pnt 2973 3771 Pnt 2338 3759 Pnt 2487 3771 Pnt 3107 3766 Pnt 3880 3774 Pnt 2425 3765 Pnt 2942 3750 Pnt 2622 3741 Pnt 2107 3786 Pnt 2993 3765 Pnt 2891 3750 Pnt 2117 3810 Pnt 2483 3789 Pnt 2628 3763 Pnt 2589 3743 Pnt 2808 3754 Pnt 2389 3742 Pnt 2713 3754 Pnt 3001 3768 Pnt 2783 3751 Pnt 3104 3771 Pnt 2235 3752 Pnt 2409 3745 Pnt 2721 3746 Pnt 2438 3816 Pnt 3382 3747 Pnt 3012 3812 Pnt 2814 3775 Pnt 2045 3868 Pnt 3976 3749 Pnt 4080 3751 Pnt 3903 2884 Pnt 2944 3742 Pnt 2544 3808 Pnt 3307 2844 Pnt 2847 3739 Pnt 3074 3752 Pnt 2482 3759 Pnt 2423 3803 Pnt 2328 3739 Pnt 3816 3739 Pnt 2636 3755 Pnt 2976 3741 Pnt 2467 3797 Pnt 3383 3739 Pnt 2244 3812 Pnt 3130 3790 Pnt 2510 3794 Pnt 3066 3812 Pnt 3288 3779 Pnt 2617 3775 Pnt 2337 3810 Pnt 3243 3794 Pnt 2347 3749 Pnt 2165 3794 Pnt 2281 3757 Pnt 2667 3747 Pnt 2240 3747 Pnt 2543 3766 Pnt 3009 3759 Pnt 2756 3788 Pnt 2976 3752 Pnt 2554 3755 Pnt 3007 3747 Pnt 2856 3740 Pnt 3817 3755 Pnt 2784 3755 Pnt 2163 3806 Pnt 2923 3767 Pnt 2065 3900 Pnt 3000 3744 Pnt 2320 3742 Pnt 3631 3750 Pnt 2985 2678 Pnt 2589 3742 Pnt 2539 3737 Pnt 2369 3753 Pnt 2932 3745 Pnt 2576 3811 Pnt 2819 3759 Pnt 2259 3797 Pnt 3456 3812 Pnt 2446 3787 Pnt 2829 3759 Pnt 2108 3733 Pnt 2736 3747 Pnt 2205 3779 Pnt 3071 3801 Pnt 2752 3774 Pnt 2456 3797 Pnt 3266 3779 Pnt 2916 3808 Pnt 2931 3777 Pnt 2831 3749 Pnt 3463 3808 Pnt 2553 3834 Pnt 2884 3750 Pnt 2682 2821 Pnt 2585 3748 Pnt 2671 3748 Pnt 2567 3749 Pnt 3533 3761 Pnt 2456 3753 Pnt 2841 3859 Pnt 2873 3748 Pnt 2544 3740 Pnt 2621 3749 Pnt 2431 3796 Pnt 2385 3773 Pnt 2724 3750 Pnt 3076 3754 Pnt 2952 3755 Pnt 3098 3738 Pnt 2528 3855 Pnt 2193 3777 Pnt 2230 3809 Pnt 2846 3763 Pnt 2124 3757 Pnt 1969 3758 Pnt 2716 3748 Pnt 2985 3744 Pnt 2829 3764 Pnt 2221 3786 Pnt 3023 3764 Pnt 2995 3754 Pnt 2305 3784 Pnt 2914 3750 Pnt 2533 3753 Pnt 2207 3802 Pnt 2755 3753 Pnt 2592 3756 Pnt 3368 3754 Pnt 2543 3750 Pnt 2340 3742 Pnt 2766 3766 Pnt 3966 3821 Pnt 2298 3855 Pnt 2575 3766 Pnt 2243 3776 Pnt 4230 2721 Pnt 2519 3766 Pnt 2572 3776 Pnt 2420 3747 Pnt 2684 3753 Pnt 2420 3747 Pnt 2551 3747 Pnt 1868 3780 Pnt 2828 3763 Pnt 4598 3774 Pnt 2441 3753 Pnt 2896 3740 Pnt 2395 3797 Pnt 2911 3752 Pnt 2650 3746 Pnt 3340 3748 Pnt 3446 3758 Pnt 2675 3787 Pnt 2758 3745 Pnt 2892 3750 Pnt 2739 3758 Pnt 2537 3745 Pnt 2484 3787 Pnt 3650 3750 Pnt 2955 3743 Pnt 2703 3813 Pnt 2145 3768 Pnt 2869 3746 Pnt 2884 3753 Pnt 3067 2681 Pnt 2753 3813 Pnt 2435 3765 Pnt 2846 3742 Pnt 2690 3744 Pnt 2571 3779 Pnt 2429 3744 Pnt 2827 3777 Pnt 1954 3782 Pnt 3127 3744 Pnt 2392 3782 Pnt 3068 3739 Pnt 2468 3757 Pnt 1925 3792 Pnt 2650 3755 Pnt 3768 3743 Pnt 3182 3765 Pnt 3037 3759 Pnt 2868 3736 Pnt 2680 3772 Pnt 3007 3752 Pnt 3471 3752 Pnt 3031 3773 Pnt 1907 3771 Pnt 2236 3796 Pnt 2607 3806 Pnt 3417 3752 Pnt 2312 3748 Pnt 2747 3736 Pnt 2449 3762 Pnt 2648 3739 Pnt 2948 3765 Pnt 3951 3762 Pnt 2153 3848 Pnt 2771 3780 Pnt 2448 3743 Pnt 2528 3848 Pnt 2642 3755 Pnt 2899 3803 Pnt 3402 3735 Pnt 2548 3803 Pnt 2745 3760 Pnt 2585 3752 Pnt 2345 3805 Pnt 2027 3810 Pnt 2568 3738 Pnt 3284 3754 Pnt 2590 3810 Pnt 3094 3748 Pnt 2657 3751 Pnt 2862 3754 Pnt 2417 3806 Pnt 3175 3746 Pnt 2786 3787 Pnt 2652 3781 Pnt 2678 3773 Pnt 2397 3778 Pnt 2823 3742 Pnt 3059 3758 Pnt 2518 3778 Pnt 3626 3762 Pnt 3105 3747 Pnt 2595 3749 Pnt 2096 3845 Pnt 3702 3751 Pnt 2835 3744 Pnt 1832 3823 Pnt 3516 3762 Pnt 3315 3759 Pnt 3286 3820 Pnt 2678 3756 Pnt 2506 3763 Pnt 3030 3003 Pnt 3447 2776 Pnt 2664 3753 Pnt 2209 3793 Pnt 3276 3744 Pnt 3576 3933 Pnt 2713 3793 Pnt 2635 3762 Pnt 2157 3749 Pnt 2075 3807 Pnt 2556 3775 Pnt 2737 3747 Pnt 3227 3740 Pnt 3002 3738 Pnt 2556 3782 Pnt 2956 3748 Pnt 2757 3742 Pnt 2883 3760 Pnt 2890 3751 Pnt 2828 3742 Pnt 2160 3769 Pnt 2871 3749 Pnt 3263 3745 Pnt 2946 3764 Pnt 2578 3760 Pnt 2906 3012 Pnt 3146 3766 Pnt 2709 3736 Pnt 2635 3738 Pnt 3909 3766 Pnt 2543 3746 Pnt 2631 3739 Pnt 2066 3766 Pnt 3830 3743 Pnt 2640 3744 Pnt 2612 3782 Pnt 3165 3747 Pnt 4190 3769 Pnt 2687 3754 Pnt 3111 3748 Pnt 2351 3793 Pnt 2855 3770 Pnt 2158 3856 Pnt 4113 3793 Pnt 2427 3748 Pnt 2956 3766 Pnt 2619 3856 Pnt 2477 3803 Pnt 2296 3779 Pnt 2453 3751 Pnt 2984 3803 Pnt 2809 3742 Pnt 3074 3757 Pnt 2674 3751 Pnt 2432 3763 Pnt 2790 3753 Pnt 3044 3755 Pnt 3742 3743 Pnt 2653 3788 Pnt 2568 3759 Pnt 3348 3764 Pnt 2475 3742 Pnt 2387 3736 Pnt 3087 3760 Pnt 2726 3761 Pnt 3203 3736 Pnt 2323 3753 Pnt 3675 3764 Pnt 3261 3735 Pnt 3007 3757 Pnt 2967 2324 Pnt 2326 3736 Pnt 3129 3752 Pnt 2421 3815 Pnt 3553 3757 Pnt 3013 3749 Pnt 3049 3749 Pnt 2730 3745 Pnt 2720 3743 Pnt 2457 3743 Pnt 2193 3796 Pnt 3128 3734 Pnt 2449 3791 Pnt 2402 3753 Pnt 2504 3784 Pnt 2532 3787 Pnt 2583 3787 Pnt 2756 3753 Pnt 3075 3749 Pnt 2602 3742 Pnt 3165 3749 Pnt 2443 3747 Pnt 2649 3745 Pnt 2653 3752 Pnt 2494 3747 Pnt 2799 2865 Pnt 2323 3749 Pnt 2953 3743 Pnt 2460 3738 Pnt 3241 3745 Pnt 2775 3747 Pnt 2436 3763 Pnt 3182 3738 Pnt 2440 2759 Pnt 2629 3761 Pnt 3681 2696 Pnt 2683 2795 Pnt 3376 3743 Pnt 2096 3911 Pnt 3250 3763 Pnt 3097 3746 Pnt 2692 3732 Pnt 2414 3739 Pnt 2592 3818 Pnt 2345 3912 Pnt 2828 3756 Pnt 2721 3757 Pnt 2469 3776 Pnt 3220 3739 Pnt 2341 3737 Pnt 2081 3802 Pnt 2411 3740 Pnt 2488 3806 Pnt 2523 3766 Pnt 2780 3737 Pnt 1975 3767 Pnt 2537 3759 Pnt 2189 3797 Pnt 2601 3798 Pnt 2918 3754 Pnt 2525 3805 Pnt 3199 3806 Pnt 2682 3757 Pnt 3342 3749 Pnt 2378 3757 Pnt 3227 3744 Pnt 3866 3754 Pnt 2824 3739 Pnt 2698 2423 Pnt 2650 3754 Pnt 2381 3804 Pnt 3949 3752 Pnt 2525 3743 Pnt 2501 3804 Pnt 3608 2750 Pnt 2587 3839 Pnt 3525 2642 Pnt 2414 3798 Pnt 3579 3746 Pnt 3302 3797 Pnt 2358 3746 Pnt 2903 3760 Pnt 2907 3739 Pnt 2735 3746 Pnt 2529 3734 Pnt 2577 3743 Pnt 2589 3743 Pnt 2612 3742 Pnt 2907 3736 Pnt 3636 3766 Pnt 2156 3782 Pnt 2452 3796 Pnt 2228 3802 Pnt 2018 3764 Pnt 2906 3755 Pnt 2426 3808 Pnt 2415 3923 Pnt 2252 3756 Pnt 3108 3765 Pnt 2066 3808 Pnt 2834 3772 Pnt 2742 3810 Pnt 2255 3752 Pnt 2158 3740 Pnt 3836 3744 Pnt 2989 3758 Pnt 2828 3744 Pnt 2820 3758 Pnt 3055 3745 Pnt 2397 3761 Pnt 3118 3744 Pnt 2499 3812 Pnt 2149 3796 Pnt 3024 3786 Pnt 2610 3806 Pnt 2164 3747 Pnt 2921 3759 Pnt 3577 3762 Pnt 2568 3771 Pnt 3082 3758 Pnt 3108 3742 Pnt 3049 3743 Pnt 2840 3756 Pnt 3066 3757 Pnt 2950 3743 Pnt 3712 3758 Pnt 2938 3768 Pnt 3222 3737 Pnt 2831 3779 Pnt 2606 3788 Pnt 2217 3745 Pnt 2584 3752 Pnt 3104 3744 Pnt 3432 3753 Pnt 2967 3743 Pnt 2770 3794 Pnt 2768 3813 Pnt 2767 3751 Pnt 2894 3748 Pnt 2806 3752 Pnt 2623 3813 Pnt 2888 3737 Pnt 2716 3745 Pnt 2952 3738 Pnt 2620 3772 Pnt 3145 3747 Pnt 2202 3817 Pnt 2096 3772 Pnt 3030 3749 Pnt 2577 3758 Pnt 2242 3847 Pnt 2271 3749 Pnt 2298 3795 Pnt 3273 3747 Pnt 2787 3760 Pnt 2568 3740 Pnt 2316 3808 Pnt 2274 3767 Pnt 2166 3783 Pnt 2924 3753 Pnt 3492 3808 Pnt 2870 3748 Pnt 3740 2781 Pnt 3185 3777 Pnt 1854 3833 Pnt 3240 3753 Pnt 3070 3741 Pnt 3542 3747 Pnt 2271 3823 Pnt 2436 3747 Pnt 2176 3810 Pnt 3249 3741 Pnt 2269 3799 Pnt 3457 3823 Pnt 2709 3820 Pnt 2489 3821 Pnt 2773 3740 Pnt 3034 3740 Pnt 2626 3818 Pnt 2488 3739 Pnt 2358 3804 Pnt 2798 3756 Pnt 2492 3800 Pnt 3256 3818 Pnt 2316 3745 Pnt 3106 3762 Pnt 2610 3744 Pnt 3184 3742 Pnt 2657 3800 Pnt 3537 3762 Pnt 3101 3800 Pnt 2279 3842 Pnt 2717 3842 Pnt 2286 3769 Pnt 2492 3747 Pnt 3307 3773 Pnt 2103 3793 Pnt 2662 3741 Pnt 2956 3748 Pnt 2226 3800 Pnt 2608 3793 Pnt 3051 3752 Pnt 2363 3778 Pnt 2739 3746 Pnt 2621 2622 Pnt 2958 3742 Pnt 2662 3797 Pnt 2940 3782 Pnt 2495 3746 Pnt 2728 3746 Pnt 2415 3748 Pnt 3020 3823 Pnt 2524 3734 Pnt 3780 3743 Pnt 3107 3748 Pnt 3018 3797 Pnt 2356 3795 Pnt 2895 3744 Pnt 1887 3776 Pnt 2709 3806 Pnt 2096 3820 Pnt 2756 3763 Pnt 1928 3824 Pnt 2991 3744 Pnt 3423 2688 Pnt 2697 3760 Pnt 2605 3778 Pnt 2625 3752 Pnt 2304 3800 Pnt 2965 3780 Pnt 2023 3776 Pnt 2579 3780 Pnt 2938 3744 Pnt 2489 3808 Pnt 3344 2740 Pnt 2617 3857 Pnt 2064 3810 Pnt 2248 3844 Pnt 2655 3756 Pnt 3033 3844 Pnt 2544 3768 Pnt 2324 3828 Pnt 3400 3753 Pnt 3213 3746 Pnt 2801 3750 Pnt 3930 3765 Pnt 3253 3753 Pnt 2597 3745 Pnt 2843 3779 Pnt 2426 3795 Pnt 2494 3759 Pnt 3994 3760 Pnt 3544 3768 Pnt 3538 3752 Pnt 2612 3743 Pnt 2802 3737 Pnt 2728 3769 Pnt 2841 3743 Pnt 2728 3836 Pnt 3721 3751 Pnt 2950 3778 Pnt 3462 3760 Pnt 3148 3754 Pnt 1935 3840 Pnt 3026 3763 Pnt 2028 3785 Pnt 3120 3742 Pnt 2022 3755 Pnt 3982 3749 Pnt 3123 3748 Pnt 2952 3752 Pnt 2840 3758 Pnt 2582 3790 Pnt 2323 3767 Pnt 2917 3771 Pnt 3261 3771 Pnt 3035 3812 Pnt 2481 3740 Pnt 2984 3812 Pnt 2783 3750 Pnt 2177 3808 Pnt 3638 3746 Pnt 2847 3746 Pnt 2593 3738 Pnt 2324 3770 Pnt 3149 3743 Pnt 2040 3788 Pnt 2580 3743 Pnt 3530 3800 Pnt 1999 3739 Pnt 2721 3735 Pnt 3601 3743 Pnt 4051 3753 Pnt 2645 2926 Pnt 3005 3815 Pnt 2938 3737 Pnt 3298 3794 Pnt 2414 3753 Pnt 3328 3749 Pnt 3007 3758 Pnt 3032 3748 Pnt 1999 3787 Pnt 3114 3743 Pnt 3041 3757 Pnt 2746 3738 Pnt 3095 3787 Pnt 2761 3743 Pnt 2894 3754 Pnt 2294 3826 Pnt 3868 3750 Pnt 3526 3754 Pnt 3055 3824 Pnt 3362 3764 Pnt 3008 3762 Pnt 2764 3844 Pnt 3095 3754 Pnt 2682 3795 Pnt 2560 3748 Pnt 2744 3738 Pnt 2350 3745 Pnt 2613 3746 Pnt 2703 3775 Pnt 3060 3756 Pnt 2922 3761 Pnt 2603 3748 Pnt 3201 3746 Pnt 2740 3742 Pnt 2306 3826 Pnt 2447 3826 Pnt 2624 3739 Pnt 2747 3799 Pnt 2638 3752 Pnt 2952 3744 Pnt 2362 3789 Pnt 2876 3846 Pnt 2753 3739 Pnt 2508 3735 Pnt 2593 3741 Pnt 3041 3748 Pnt 2292 3790 Pnt 3963 3771 Pnt 3713 3749 Pnt 2700 3839 Pnt 2676 3742 Pnt 2305 3757 Pnt 2236 3757 Pnt 2165 3791 Pnt 3624 3758 Pnt 2237 3812 Pnt 2980 3791 Pnt 2674 3743 Pnt 3348 3740 Pnt 2867 3748 Pnt 2923 3743 Pnt 3006 3751 Pnt 2604 3748 Pnt 3217 3784 Pnt 2332 3751 Pnt 2602 3904 Pnt 2335 3750 Pnt 3651 3741 Pnt 2697 3815 Pnt 2694 3752 Pnt 1827 3782 Pnt 2762 3768 Pnt 2734 3815 Pnt 2786 3764 Pnt 3726 3742 Pnt 2796 3772 Pnt 2712 3768 Pnt 2268 3757 Pnt 2904 3768 Pnt 3128 3764 Pnt 2767 3743 Pnt 2063 3811 Pnt 2632 3786 Pnt 2944 3746 Pnt 2522 3753 Pnt 2042 3840 Pnt 2963 3753 Pnt 2701 3746 Pnt 2633 3741 Pnt 2901 3744 Pnt 2133 3789 Pnt 2184 3764 Pnt 3147 3762 Pnt 2255 3817 Pnt 4251 3736 Pnt 2065 3856 Pnt 3287 3750 Pnt 2684 3827 Pnt 2524 3757 Pnt 2360 3817 Pnt 3247 3854 Pnt 2491 3763 Pnt 2618 3737 Pnt 2556 3757 Pnt 2659 3742 Pnt 2012 3770 Pnt 3504 3757 Pnt 2412 3791 Pnt 3116 3770 Pnt 2512 3753 Pnt 2077 3804 Pnt 3144 3757 Pnt 3490 2714 Pnt 2736 3750 Pnt 1989 3775 Pnt 2646 3785 Pnt 2629 3744 Pnt 2634 3743 Pnt 2380 3748 Pnt 2488 3820 Pnt 3105 3775 Pnt 2744 3870 Pnt 2515 3743 Pnt 2366 3827 Pnt 2984 3870 Pnt 2555 3804 Pnt 2740 3736 Pnt 2357 3806 Pnt 2333 3817 Pnt 3323 3753 Pnt 2030 3779 Pnt 2078 3837 Pnt 2756 3748 Pnt 2673 3810 Pnt 2452 3738 Pnt 2489 3742 Pnt 2539 3749 Pnt 2848 3752 Pnt 2244 3806 Pnt 2522 3760 Pnt 2138 3754 Pnt 2968 3806 Pnt 3140 3745 Pnt 2549 3740 Pnt 2550 3740 Pnt 2990 3742 Pnt 2728 3747 Pnt 2536 3765 Pnt 3005 3740 Pnt 2380 3769 Pnt 2190 3828 Pnt 3027 3736 Pnt 2967 3750 Pnt 3448 3765 Pnt 2780 3762 Pnt 2120 3795 Pnt 2930 3760 Pnt 2464 3829 Pnt 2581 3752 Pnt 2547 3745 Pnt 3047 3744 Pnt 3416 3762 Pnt 2721 3752 Pnt 2572 3748 Pnt 2431 3801 Pnt 2705 3740 Pnt 2698 3747 Pnt 2509 3748 Pnt 3042 3740 Pnt 2722 3745 Pnt 2448 3743 Pnt 2709 3802 Pnt 2465 3743 Pnt 2960 2804 Pnt 2478 3741 Pnt 2279 3817 Pnt 2266 3768 Pnt 2815 3731 Pnt 3998 2883 Pnt 2238 3827 Pnt 2555 3826 Pnt 2986 3747 Pnt 2850 3740 Pnt 2637 3737 Pnt 2279 3748 Pnt 2832 3758 Pnt 2621 3797 Pnt 3072 3746 Pnt 4034 3744 Pnt 2331 3777 Pnt 2650 2793 Pnt 3309 3780 Pnt 2737 3803 Pnt 3021 3741 Pnt 2460 3749 Pnt 2526 3805 Pnt 3556 3745 Pnt 2256 3800 Pnt 3185 3750 Pnt 3664 2524 Pnt 2839 3803 Pnt 2161 3825 Pnt 2675 3755 Pnt 3266 3756 Pnt 2508 3764 Pnt 3268 3754 Pnt 2579 3736 Pnt 2250 3797 Pnt 3192 3761 Pnt 2697 3748 Pnt 2842 3761 Pnt 2796 3747 Pnt 3079 3745 Pnt 2518 3772 Pnt 2432 3805 Pnt 3951 3746 Pnt 3643 3764 Pnt 2563 3757 Pnt 2906 3769 Pnt 2001 3914 Pnt 3125 3753 Pnt 2565 3757 Pnt 2328 3822 Pnt 2223 3823 Pnt 2927 3767 Pnt 3029 3747 Pnt 2059 3808 Pnt 3544 3748 Pnt 3147 3734 Pnt 3447 3753 Pnt 2986 3844 Pnt 2732 3744 Pnt 2855 3820 Pnt 2500 3844 Pnt 2241 3770 Pnt 2233 3780 Pnt 2868 3739 Pnt 3680 3826 Pnt 2498 3749 Pnt 2074 3820 Pnt 3313 3750 Pnt 2118 3805 Pnt 2824 3779 Pnt 4309 3741 Pnt 2993 3837 Pnt 2047 3794 Pnt 3966 3837 Pnt 3050 3754 Pnt 2790 3789 Pnt 2537 3741 Pnt 2513 3758 Pnt 2309 3772 Pnt 2345 3836 Pnt 2448 3792 Pnt 2110 3934 Pnt 2538 3794 Pnt 2243 3805 Pnt 2698 3773 Pnt 2642 3795 Pnt 3301 3793 Pnt 2718 3741 Pnt 3957 3795 Pnt 3186 3789 Pnt 2579 3850 Pnt 4138 3758 Pnt 2793 3794 Pnt 3310 3806 Pnt 3145 3793 Pnt 3699 3793 Pnt 2265 3769 Pnt 2957 3760 Pnt 2987 3737 Pnt 2930 3743 Pnt 2960 3746 Pnt 3564 3748 Pnt 3298 3744 Pnt 3992 2798 Pnt 3137 3743 Pnt 2418 3758 Pnt 2920 3747 Pnt 2676 3807 Pnt 2523 3744 Pnt 2658 3745 Pnt 2683 3741 Pnt 2378 3771 Pnt 2688 3758 Pnt 2879 3766 Pnt 2737 3746 Pnt 3216 3775 Pnt 3504 3758 Pnt 3047 3780 Pnt 2421 3768 Pnt 3164 3766 Pnt 2568 3775 Pnt 3173 3820 Pnt 2120 3768 Pnt 3177 3754 Pnt 2467 3754 Pnt 2828 3746 Pnt 2637 3757 Pnt 2976 3744 Pnt 2924 2684 Pnt 3473 3756 Pnt 2958 3744 Pnt 2925 3768 Pnt 2819 3751 Pnt 2571 3751 Pnt 3502 3750 Pnt 3076 3796 Pnt 3069 3748 Pnt 2523 3741 Pnt 2858 3771 Pnt 2038 3747 Pnt 2074 3783 Pnt 2841 3768 Pnt 3684 3775 Pnt 3794 3748 Pnt 4123 3771 Pnt 2502 3745 Pnt 2047 3828 Pnt 3257 3756 Pnt 3037 2676 Pnt 2954 3759 Pnt 2417 3752 Pnt 2479 3792 Pnt 3070 3766 Pnt 2399 3790 Pnt 2403 3779 Pnt 3663 3759 Pnt 2973 3757 Pnt 2927 3744 Pnt 2989 3750 Pnt 3207 3748 Pnt 2424 3754 Pnt 3588 3749 Pnt 3090 3755 Pnt 2903 3744 Pnt 2566 3752 Pnt 3499 3754 Pnt 2016 3840 Pnt 2813 3755 Pnt 2086 3782 Pnt 3491 3763 Pnt 2114 3795 Pnt 3010 3747 Pnt 3669 3744 Pnt 2803 3760 Pnt 2226 3880 Pnt 2791 3747 Pnt 2721 3755 Pnt 2528 3760 Pnt 3830 3748 Pnt 2769 3748 Pnt 2710 3755 Pnt 2448 3733 Pnt 2406 3736 Pnt 2922 3756 Pnt 2455 3771 Pnt 2766 3750 Pnt 2557 3753 Pnt 2183 3761 Pnt 2732 3750 Pnt 2437 3756 Pnt 2975 3761 Pnt 3253 3742 Pnt 2672 3751 Pnt 2610 3799 Pnt 2901 3753 Pnt 4261 3760 Pnt 2158 3774 Pnt 2731 3750 Pnt 3397 3758 Pnt 3880 2853 Pnt 3128 3757 Pnt 2897 3744 Pnt 3009 3747 Pnt 2887 3754 Pnt 2670 3749 Pnt 2773 3748 Pnt 3387 3750 Pnt 2828 3754 Pnt 2809 3743 Pnt 3151 3747 Pnt 2191 3837 Pnt 2484 3756 Pnt 1910 3804 Pnt 2937 3758 Pnt 2828 3743 Pnt 2493 3770 Pnt 2973 3797 Pnt 3141 3744 Pnt 3157 3762 Pnt 2577 3801 Pnt 2505 3750 Pnt 3936 3764 Pnt 2886 3775 Pnt 3805 3762 Pnt 2521 3736 Pnt 2555 3750 Pnt 2443 3748 Pnt 3332 3743 Pnt 2401 3745 Pnt 2826 3746 Pnt 2476 3742 Pnt 2492 3801 Pnt 2337 3772 Pnt 3191 3747 Pnt 2731 3750 Pnt 2501 3784 Pnt 2769 3767 Pnt 2793 3746 Pnt 2674 3745 Pnt 2082 3826 Pnt 2742 3759 Pnt 3761 2647 Pnt 2538 3741 Pnt 2451 3741 Pnt 3808 3826 Pnt 2932 3751 Pnt 2678 3754 Pnt 2533 3816 Pnt 2478 3737 Pnt 2549 3751 Pnt 2542 3809 Pnt 2207 3811 Pnt 2737 3787 Pnt 2376 3777 Pnt 3310 3817 Pnt 2412 3785 Pnt 2239 3807 Pnt 2862 3747 Pnt 2480 3770 Pnt 3003 3777 Pnt 2725 3801 Pnt 3199 3765 Pnt 2489 3744 Pnt 2985 3747 Pnt 2316 3823 Pnt 2729 3762 Pnt 3081 3746 Pnt 2202 3769 Pnt 2833 3762 Pnt 2873 3755 Pnt 2654 3750 Pnt 2464 3800 Pnt 2727 3744 Pnt 2407 3803 Pnt 2820 3779 Pnt 2679 3755 Pnt 3524 3803 Pnt 2395 3817 Pnt 2905 3756 Pnt 2762 3745 Pnt 2486 3853 Pnt 2906 3770 Pnt 2736 3780 Pnt 2542 3757 Pnt 2584 3865 Pnt 3493 3748 Pnt 2620 3744 Pnt 2757 3740 Pnt 3328 3746 Pnt 2812 3743 Pnt 2937 3765 Pnt 2749 3742 Pnt 2428 3898 Pnt 2064 3842 Pnt 2701 3760 Pnt 2512 3745 Pnt 2296 3831 Pnt 2749 3775 Pnt 3973 3745 Pnt 2645 3831 Pnt 2544 3743 Pnt 2726 3750 Pnt 2698 3746 Pnt 2880 3762 Pnt 2588 3750 Pnt 2648 3758 Pnt 2937 3745 Pnt 2267 3746 Pnt 1856 3735 Pnt 2958 3795 Pnt 2046 3786 Pnt 3920 3749 Pnt 2941 3786 Pnt 3750 3745 Pnt 2979 3765 Pnt 3204 3739 Pnt 3159 3750 Pnt 3137 3778 Pnt 2747 3765 Pnt 3144 3770 Pnt 2874 3742 Pnt 3113 3750 Pnt 2538 3741 Pnt 2448 3775 Pnt 3051 3755 Pnt 2235 3850 Pnt 2791 3802 Pnt 3223 3741 Pnt 2585 3750 Pnt 2951 3735 Pnt 2804 3852 Pnt 3173 3735 Pnt 2630 3761 Pnt 2446 2394 Pnt 2394 3831 Pnt 2877 3756 Pnt 3509 3735 Pnt 2376 3749 Pnt 2975 3743 Pnt 3126 3744 Pnt 2497 3784 Pnt 3058 3740 Pnt 3247 3763 Pnt 3012 3751 Pnt 2708 3764 Pnt 2660 3755 Pnt 2900 3754 Pnt 2842 3748 Pnt 2700 3790 Pnt 2565 3795 Pnt 2484 3803 Pnt 2117 3753 Pnt 4064 3764 Pnt 2360 3796 Pnt 3151 3753 Pnt 3093 3821 Pnt 3002 3751 Pnt 2932 3740 Pnt 3026 3754 Pnt 3057 3746 Pnt 2734 3747 Pnt 2689 3751 Pnt 2613 3741 Pnt 1916 3840 Pnt 3935 3790 Pnt 2651 3740 Pnt 2121 3761 Pnt 2792 3943 Pnt 2686 3742 Pnt 3001 3761 Pnt 2809 3748 Pnt 2669 3814 Pnt 2596 3753 Pnt 2985 3753 Pnt 3416 3761 Pnt 2607 3742 Pnt 2540 3767 Pnt 3394 3758 Pnt 2330 3772 Pnt 3743 3742 Pnt 2105 3749 Pnt 3440 3762 Pnt 2806 3747 Pnt 2018 3787 Pnt 2523 3788 Pnt 1907 3748 Pnt 3895 3767 Pnt 2356 3742 Pnt 1979 3764 Pnt 3032 3737 Pnt 2912 3777 Pnt 2169 3769 Pnt 3591 3767 Pnt 2304 3794 Pnt 2942 3767 Pnt 2834 3757 Pnt 3745 3794 Pnt 2944 3807 Pnt 2827 3795 Pnt 2778 3807 Pnt 2164 3746 Pnt 3023 3765 Pnt 1926 3871 Pnt 2738 3742 Pnt 3927 3752 Pnt 2638 3754 Pnt 2913 3764 Pnt 2464 3787 Pnt 3823 3743 Pnt 2467 3934 Pnt 2960 3738 Pnt 2565 3754 Pnt 2354 3792 Pnt 2350 3744 Pnt 2400 3782 Pnt 4076 3752 Pnt 3570 3736 Pnt 2761 3736 Pnt 2417 3787 Pnt 2569 3808 Pnt 2608 3775 Pnt 2310 3748 Pnt 3751 3745 Pnt 3050 3893 Pnt 3004 3744 Pnt 2913 3746 Pnt 2755 3746 Pnt 2498 3760 Pnt 3864 2701 Pnt 2643 3746 Pnt 2012 2797 Pnt 2728 3749 Pnt 3167 3757 Pnt 1927 3801 Pnt 2513 3742 Pnt 2890 3750 Pnt 3260 3746 Pnt 2554 3753 Pnt 3423 2723 Pnt 2772 3745 Pnt 4021 3750 Pnt 3832 3755 Pnt 3031 2444 Pnt 2847 3746 Pnt 2889 3820 Pnt 2438 3757 Pnt 2528 3761 Pnt 2394 3774 Pnt 2792 3738 Pnt 2277 3951 Pnt 3240 3774 Pnt 2191 3800 Pnt 2383 3746 Pnt 3178 3742 Pnt 2397 3752 Pnt 2885 3746 Pnt 2916 3752 Pnt 2615 3777 Pnt 2611 3776 Pnt 2141 3814 Pnt 3024 3784 Pnt 2956 3757 Pnt 2169 3757 Pnt 3746 3759 Pnt 2575 3756 Pnt 2420 3751 Pnt 2318 3771 Pnt 3972 3751 Pnt 3127 3749 Pnt 3163 3745 Pnt 2789 3746 Pnt 2791 3749 Pnt 2311 2896 Pnt 2534 3739 Pnt 3215 3743 Pnt 2748 3810 Pnt 2893 3749 Pnt 2175 3832 Pnt 2668 2660 Pnt 2398 3743 Pnt 3322 3787 Pnt 2784 3749 Pnt 3078 3757 Pnt 2157 3747 Pnt 2756 3750 Pnt 2632 3759 Pnt 2792 3752 Pnt 2544 3750 Pnt 3453 3751 Pnt 2472 3828 Pnt 2310 3753 Pnt 2432 3742 Pnt 3263 2910 Pnt 2526 3759 Pnt 2618 3740 Pnt 2691 3749 Pnt 2970 3758 Pnt 2467 3797 Pnt 2839 3743 Pnt 2824 3803 Pnt 2581 3758 Pnt 4012 3755 Pnt 2859 3744 Pnt 2637 3746 Pnt 2513 3749 Pnt 2655 3790 Pnt 2462 3774 Pnt 2658 3782 Pnt 2124 3797 Pnt 3660 3756 Pnt 3073 3748 Pnt 2511 3864 Pnt 2462 3739 Pnt 2331 3744 Pnt 3567 3756 Pnt 2685 3744 Pnt 2563 3743 Pnt 3269 3749 Pnt 3030 3750 Pnt 2613 3768 Pnt 3082 3746 Pnt 2750 3819 Pnt 3726 3816 Pnt 2904 3774 Pnt 2489 3757 Pnt 2694 3818 Pnt 2830 3804 Pnt 3061 3763 Pnt 2787 3740 Pnt 2130 3818 Pnt 3282 3756 Pnt 2344 3779 Pnt 2638 3787 Pnt 2680 3748 Pnt 2538 3832 Pnt 2453 3741 Pnt 2472 3761 Pnt 3583 3787 Pnt 2838 3858 Pnt 3190 3755 Pnt 3416 3738 Pnt 3442 2743 Pnt 3065 3749 Pnt 3015 3755 Pnt 3929 2771 Pnt 2991 2384 Pnt 2802 3754 Pnt 2345 3835 Pnt 3190 3835 Pnt 2851 3748 Pnt 2374 3833 Pnt 3278 3761 Pnt 2499 3799 Pnt 3084 3742 Pnt 2326 3790 Pnt 2943 3741 Pnt 2876 3739 Pnt 2684 3754 Pnt 2549 3798 Pnt 2615 3747 Pnt 3215 3739 Pnt 3080 3755 Pnt 2497 3740 Pnt 2705 3752 Pnt 2995 3744 Pnt 2038 3829 Pnt 2621 3742 Pnt 3084 3755 Pnt 2350 3745 Pnt 3632 3742 Pnt 3131 3827 Pnt 2907 3751 Pnt 2844 3751 Pnt 2718 3772 Pnt 3235 3755 Pnt 2451 3821 Pnt 2505 3745 Pnt 2547 3748 Pnt 2880 3751 Pnt 2192 3767 Pnt 2861 3739 Pnt 2296 3830 Pnt 2202 3810 Pnt 2349 3790 Pnt 3173 3745 Pnt 2620 3773 Pnt 2763 3755 Pnt 2559 3799 Pnt 2181 3756 Pnt 3438 3808 Pnt 2568 3744 Pnt 3185 3761 Pnt 2755 3753 Pnt 2786 3756 Pnt 2225 3867 Pnt 3023 3750 Pnt 3809 3744 Pnt 2770 3831 Pnt 2921 3743 Pnt 2707 3756 Pnt 2646 3738 Pnt 2445 3748 Pnt 2888 3769 Pnt 2640 3758 Pnt 2905 3741 Pnt 2752 3769 Pnt 2344 3777 Pnt 3222 3750 Pnt 3101 3760 Pnt 2599 3800 Pnt 2580 3822 Pnt 3875 2702 Pnt 2963 3762 Pnt 2717 3754 Pnt 2736 3772 Pnt 2628 3759 Pnt 3007 3750 Pnt 2782 3742 Pnt 2695 3753 Pnt 2783 3763 Pnt 2620 3767 Pnt 3311 3754 Pnt 2311 3810 Pnt 2768 3746 Pnt 2670 3758 Pnt 2317 3741 Pnt 3312 3750 Pnt 2602 3790 Pnt 2050 3770 Pnt 3107 3757 Pnt 2108 3801 Pnt 3957 3750 Pnt 2591 3761 Pnt 2242 3772 Pnt 2470 3780 Pnt 2627 3804 Pnt 2407 3806 Pnt 3499 3751 Pnt 2786 3780 Pnt 2284 3752 Pnt 3012 3761 Pnt 3496 3772 Pnt 2596 3816 Pnt 2457 3744 Pnt 2760 3754 Pnt 2260 3791 Pnt 2548 3752 Pnt 2722 3777 Pnt 2095 3810 Pnt 2467 3813 Pnt 3128 3756 Pnt 3042 3742 Pnt 2759 3797 Pnt 2357 3767 Pnt 3485 2451 Pnt 2648 3742 Pnt 2753 3743 Pnt 2780 3745 Pnt 2810 3791 Pnt 2689 3735 Pnt 2918 3741 Pnt 3232 3746 Pnt 2817 3773 Pnt 3598 2999 Pnt 3297 3743 Pnt 2228 3755 Pnt 3179 2775 Pnt 2971 3750 Pnt 2279 3788 Pnt 2697 3763 Pnt 3204 3773 Pnt 2893 3788 Pnt 2813 3745 Pnt 2614 3741 Pnt 3112 3749 Pnt 1868 3758 Pnt 2917 3832 Pnt 2696 3757 Pnt 2105 3765 Pnt 2901 3741 Pnt 2078 3832 Pnt 3002 3741 Pnt 2101 3782 Pnt 2855 3741 Pnt 2447 3745 Pnt 2937 3741 Pnt 2517 3736 Pnt 2898 3757 Pnt 2813 3759 Pnt 2635 3761 Pnt 2781 3804 Pnt 3422 3748 Pnt 2568 3828 Pnt 2384 3786 Pnt 3503 3804 Pnt 4581 3776 Pnt 2591 3742 Pnt 2390 3757 Pnt 2089 3797 Pnt 2642 3747 Pnt 2402 3748 Pnt 3692 3743 Pnt 3066 2836 Pnt 3181 3753 Pnt 2808 3802 Pnt 3066 3750 Pnt 2530 3738 Pnt 2641 3776 Pnt 3992 3783 Pnt 2793 3741 Pnt 2462 3746 Pnt 3068 3749 Pnt 3239 3741 Pnt 2266 3805 Pnt 3023 3745 Pnt 2824 3790 Pnt 2218 3783 Pnt 3046 3741 Pnt 2847 3752 Pnt 2660 3754 Pnt 2717 3785 Pnt 3018 3746 Pnt 2453 3743 Pnt 2995 3744 Pnt 2647 3759 Pnt 3175 3754 Pnt 2640 3773 Pnt 1995 3776 Pnt 3801 3749 Pnt 3256 3759 Pnt 2860 3761 Pnt 3097 3751 Pnt 3274 3763 Pnt 2812 3743 Pnt 2769 3782 Pnt 2527 3756 Pnt 2604 3743 Pnt 3423 3760 Pnt 2569 3793 Pnt 2568 3746 Pnt 2487 3899 Pnt 2261 3798 Pnt 3177 3793 Pnt 3540 3742 Pnt 3109 3744 Pnt 2903 3753 Pnt 2591 3771 Pnt 2782 3743 Pnt 2623 3761 Pnt 2428 3747 Pnt 2036 3801 Pnt 3520 3746 Pnt 2523 3749 Pnt 2657 3747 Pnt 2735 3744 Pnt 3518 3743 Pnt 2079 3777 Pnt 3155 3749 Pnt 2445 3819 Pnt 2898 3745 Pnt 2683 3784 Pnt 3412 3787 Pnt 2404 3885 Pnt 2838 3791 Pnt 2766 3829 Pnt 2285 3835 Pnt 2802 3742 Pnt 2476 3803 Pnt 2326 3759 Pnt 3321 3828 Pnt 2709 3754 Pnt 2688 3741 Pnt 2691 3750 Pnt 2344 3750 Pnt 2537 3750 Pnt 3213 3762 Pnt 3677 3754 Pnt 2125 3822 Pnt 4167 3751 Pnt 2099 3807 Pnt 3202 3753 Pnt 3034 3765 Pnt 2081 3780 Pnt 2101 3826 Pnt 3219 3756 Pnt 2896 3749 Pnt 2683 3756 Pnt 2908 3738 Pnt 2429 3828 Pnt 2634 3764 Pnt 3872 3756 Pnt 2459 3756 Pnt 3792 2635 Pnt 2422 3739 Pnt 2405 3741 Pnt 2256 3799 Pnt 2263 3745 Pnt 2703 3812 Pnt 2378 3774 Pnt 1971 3813 Pnt 2628 3762 Pnt 2787 3759 Pnt 2939 3753 Pnt 2747 3766 Pnt 2778 3739 Pnt 2525 3810 Pnt 2229 3748 Pnt 4085 3751 Pnt 2410 3762 Pnt 2093 3784 Pnt 3035 3741 Pnt 2885 3760 Pnt 2695 3752 Pnt 3047 3742 Pnt 3580 3740 Pnt 2644 3742 Pnt 3032 3757 Pnt 2844 3745 Pnt 2225 3935 Pnt 2986 3768 Pnt 2936 3761 Pnt 2712 3754 Pnt 2818 3815 Pnt 2406 3771 Pnt 2703 3740 Pnt 2958 3741 Pnt 2540 3810 Pnt 2217 3832 Pnt 2076 3813 Pnt 2402 3749 Pnt 2336 3810 Pnt 2313 3801 Pnt 2795 3749 Pnt 1903 3773 Pnt 3607 3758 Pnt 3249 3755 Pnt 3828 3741 Pnt 3085 3801 Pnt 2686 3823 Pnt 2703 3761 Pnt 3540 3766 Pnt 3301 3755 Pnt 2888 3756 Pnt 2804 3748 Pnt 3108 3744 Pnt 2618 3771 Pnt 2440 3775 Pnt 2058 3762 Pnt 3206 3750 Pnt 2575 3749 Pnt 1981 3750 Pnt 2730 3752 Pnt 3581 3757 Pnt 3127 3743 Pnt 2882 3754 Pnt 3161 3753 Pnt 2859 3743 Pnt 3212 3750 Pnt 2522 3757 Pnt 2366 3766 Pnt 2566 3747 Pnt 2650 3760 Pnt 2270 3794 Pnt 4142 3734 Pnt 2187 3811 Pnt 3141 3749 Pnt 2375 3828 Pnt 2709 3811 Pnt 2929 3746 Pnt 2610 3745 Pnt 2171 3770 Pnt 1914 3838 Pnt 2203 3791 Pnt 2484 3770 Pnt 2617 3741 Pnt 3597 3759 Pnt 2405 3797 Pnt 2325 3797 Pnt 3208 3741 Pnt 2049 3772 Pnt 2874 2675 Pnt 2381 3798 Pnt 2092 3760 Pnt 2200 3780 Pnt 3900 3778 Pnt 2244 3779 Pnt 2189 3869 Pnt 3033 3763 Pnt 2666 3774 Pnt 3154 2728 Pnt 2314 3765 Pnt 2976 3776 Pnt 2232 3804 Pnt 3088 3752 Pnt 2741 3742 Pnt 2662 3751 Pnt 2250 3776 Pnt 2914 3820 Pnt 2805 3748 Pnt 2985 3745 Pnt 2786 3794 Pnt 2846 3753 Pnt 3945 3756 Pnt 2484 3750 Pnt 2672 3754 Pnt 2373 3772 Pnt 3376 3794 Pnt 2663 3744 Pnt 2089 3812 Pnt 2752 3748 Pnt 2620 3739 Pnt 2896 3757 Pnt 2249 3803 Pnt 2807 3760 Pnt 3718 3750 Pnt 3716 3754 Pnt 3911 3755 Pnt 2419 3797 Pnt 2911 3744 Pnt 2518 3812 Pnt 1996 3851 Pnt 2732 3751 Pnt 2701 3739 Pnt 2987 3782 Pnt 2464 3808 Pnt 2348 3740 Pnt 2741 3756 Pnt 2117 3806 Pnt 2697 3808 Pnt 2379 3797 Pnt 2786 3749 Pnt 2689 3752 Pnt 2153 3783 Pnt 2784 3755 Pnt 2390 3765 Pnt 3493 3773 Pnt 2480 3755 Pnt 2912 3868 Pnt 2793 3759 Pnt 3433 3755 Pnt 2222 3810 Pnt 2974 3743 Pnt 3213 3759 Pnt 2539 3834 Pnt 2257 3808 Pnt 2471 3741 Pnt 2975 3758 Pnt 3025 3752 Pnt 2732 3763 Pnt 2968 3741 Pnt 3662 3760 Pnt 2678 3744 Pnt 2785 3756 Pnt 2626 3739 Pnt 2361 3789 Pnt 2343 3819 Pnt 2219 3773 Pnt 3143 3756 Pnt 2834 3753 Pnt 2586 3763 Pnt 2527 2421 Pnt 2653 3777 Pnt 3357 3753 Pnt 2615 3803 Pnt 2632 3743 Pnt 3237 3759 Pnt 2579 3743 Pnt 1748 3781 Pnt 3013 3748 Pnt 2826 3745 Pnt 2697 3751 Pnt 2390 3744 Pnt 2134 3773 Pnt 2605 3759 Pnt 2560 3791 Pnt 2695 3771 Pnt 2673 3751 Pnt 2324 3752 Pnt 2820 3752 Pnt 3756 3745 Pnt 2055 3845 Pnt 2946 3814 Pnt 2669 3747 Pnt 3289 3754 Pnt 2608 3747 Pnt 3658 3747 Pnt 2118 3747 Pnt 2692 3790 Pnt 2490 3767 Pnt 2891 3812 Pnt 3658 3754 Pnt 3173 3750 Pnt 2894 3763 Pnt 2570 3743 Pnt 2860 3752 Pnt 3050 3810 Pnt 2760 3762 Pnt 2491 3759 Pnt 3228 3745 Pnt 2857 3746 Pnt 2668 3747 Pnt 2769 3775 Pnt 2656 3752 Pnt 3065 3747 Pnt 2618 3759 Pnt 2454 3749 Pnt 1876 3780 Pnt 2715 3744 Pnt 2122 3749 Pnt 2170 3794 Pnt 3088 3788 Pnt 3859 3763 Pnt 2764 3744 Pnt 2352 3747 Pnt 2694 3742 Pnt 2412 3760 Pnt 3969 3757 Pnt 3024 3748 Pnt 2483 3756 Pnt 3432 3743 Pnt 2351 3744 Pnt 3146 3766 Pnt 2663 3857 Pnt 2281 3900 Pnt 1833 3782 Pnt 2728 3750 Pnt 2772 3750 Pnt 2883 3748 Pnt 3091 3770 Pnt 2622 3797 Pnt 3199 3797 Pnt 2558 3764 Pnt 2860 3745 Pnt 2447 3748 Pnt 3471 3764 Pnt 2598 3734 Pnt 4011 3757 Pnt 3278 3750 Pnt 2731 3748 Pnt 3477 3745 Pnt 2779 3859 Pnt 2619 3753 Pnt 2788 3848 Pnt 3444 3757 Pnt 2703 3773 Pnt 2417 3744 Pnt 2026 3759 Pnt 3640 3748 Pnt 2922 3749 Pnt 2885 3752 Pnt 3677 3753 Pnt 2359 3794 Pnt 2100 3771 Pnt 2706 3750 Pnt 2211 3817 Pnt 2633 3817 Pnt 3303 3770 Pnt 2568 3740 Pnt 2934 3806 Pnt 1837 3782 Pnt 2779 3753 Pnt 2096 3753 Pnt 2624 3796 Pnt 2433 3736 Pnt 3120 3755 Pnt 2940 3753 Pnt 3839 3747 Pnt 2297 3742 Pnt 2423 3772 Pnt 3512 3763 Pnt 3202 3745 Pnt 2499 3753 Pnt 3070 3763 Pnt 2590 3738 Pnt 2094 3802 Pnt 3236 3738 Pnt 2705 3777 Pnt 2352 3848 Pnt 2351 3796 Pnt 2152 3795 Pnt 2359 3839 Pnt 3898 3777 Pnt 3384 3766 Pnt 2501 3738 Pnt 3164 3760 Pnt 2994 3762 Pnt 2503 3760 Pnt 2108 3776 Pnt 3057 3754 Pnt 2836 3765 Pnt 2616 3744 Pnt 3349 3754 Pnt 3259 3743 Pnt 2913 3742 Pnt 2750 3766 Pnt 2455 3742 Pnt 2998 3754 Pnt 2437 3787 Pnt 2796 3742 Pnt 3047 3781 Pnt 2829 3758 Pnt 2688 3777 Pnt 2813 3757 Pnt 2551 3781 Pnt 2698 3749 Pnt 3056 3757 Pnt 4090 3757 Pnt 2789 3752 Pnt 3052 3736 Pnt 2480 3787 Pnt 3242 3751 Pnt 3140 3813 Pnt 2580 3803 Pnt 2354 3923 Pnt 3187 3748 Pnt 2701 3744 Pnt 2014 3810 Pnt 3137 3746 Pnt 2717 3751 Pnt 3580 3923 Pnt 2201 3755 Pnt 2892 3770 Pnt 2970 3765 Pnt 2675 3751 Pnt 2780 3747 Pnt 2681 3779 Pnt 3031 3747 Pnt 2971 3749 Pnt 3268 3096 Pnt 2298 3791 Pnt 2824 3747 Pnt 3072 3749 Pnt 2458 3779 Pnt 2485 3742 Pnt 3777 3749 Pnt 2770 3765 Pnt 2899 3746 Pnt 2948 3758 Pnt 2368 3793 Pnt 3196 3743 Pnt 2182 3809 Pnt 3284 3749 Pnt 2659 3754 Pnt 2741 3778 Pnt 2315 3793 Pnt 2341 3767 Pnt 2266 3856 Pnt 3158 3766 Pnt 3500 3743 Pnt 3877 3743 Pnt 2959 3765 Pnt 3821 3753 Pnt 2797 3803 Pnt 2997 3748 Pnt 2673 3760 Pnt 3879 3765 Pnt 2981 3744 Pnt 2846 3795 Pnt 2539 3753 Pnt 2868 3784 Pnt 2665 3805 Pnt 2593 3751 Pnt 2472 3751 Pnt 3109 3762 Pnt 2773 3759 Pnt 2609 3784 Pnt 1799 3742 Pnt 2916 3757 Pnt 2529 3738 Pnt 2314 3736 Pnt 1903 3806 Pnt 3033 3750 Pnt 2809 3777 Pnt 2170 3781 Pnt 2745 3781 Pnt 3247 3745 Pnt 2862 3756 Pnt 2752 3748 Pnt 2344 3761 Pnt 2683 3809 Pnt 3110 3746 Pnt 2724 3758 Pnt 2040 3821 Pnt 2733 3743 Pnt 4095 3745 Pnt 2305 3753 Pnt 2825 3743 Pnt 3012 3823 Pnt 2898 3766 Pnt 3111 3750 Pnt 2931 3742 Pnt 3061 3746 Pnt 2630 3767 Pnt 2992 3759 Pnt 2371 3747 Pnt 2416 3912 Pnt 2978 3787 Pnt 2729 3761 Pnt 2702 3747 Pnt 3332 3784 Pnt 3033 3745 Pnt 2548 3783 Pnt 2605 3797 Pnt 3382 3787 Pnt 2148 3798 Pnt 2981 3742 Pnt 2373 3749 Pnt 2820 3783 Pnt 3014 3732 Pnt 2533 3749 Pnt 2781 3742 Pnt 2359 3763 Pnt 2267 3818 Pnt 3662 3745 Pnt 2957 3763 Pnt 3029 3762 Pnt 2938 3763 Pnt 1975 3776 Pnt 2203 3766 Pnt 3000 3734 Pnt 3071 3766 Pnt 2570 3760 Pnt 2796 3750 Pnt 2595 3747 Pnt 4045 3759 Pnt 2825 3747 Pnt 2588 3804 Pnt 3397 3747 Pnt 3003 3749 Pnt 2643 3742 Pnt 3015 3789 Pnt 2346 3743 Pnt 2697 3737 Pnt 3813 2831 Pnt 2893 3749 Pnt 2106 3797 Pnt 3704 3747 Pnt 2751 3804 Pnt 3353 2927 Pnt 2701 3797 Pnt 3164 3739 Pnt 2632 3806 Pnt 2410 3760 Pnt 3113 3743 Pnt 2657 3754 Pnt 3588 3756 Pnt 2430 3760 Pnt 3658 3761 Pnt 2347 3740 Pnt 3987 3753 Pnt 2240 3755 Pnt 3603 3756 Pnt 2527 3778 Pnt 2479 3732 Pnt 2718 3776 Pnt 3586 3755 Pnt 3337 3749 Pnt 2246 3752 Pnt 2717 3743 Pnt 2941 3733 Pnt 2633 3747 Pnt 2075 3810 Pnt 2458 3738 Pnt 2134 3740 Pnt 3301 3741 Pnt 2158 3768 Pnt 2791 3757 Pnt 3833 3768 Pnt 3494 3741 Pnt 3076 3744 Pnt 2451 3739 Pnt 3639 3754 Pnt 2305 3796 Pnt 2219 3812 Pnt 2850 3751 Pnt 2643 3744 Pnt 2264 3766 Pnt 2569 3751 Pnt 2501 3745 Pnt 3293 3747 Pnt 2840 3797 Pnt 2458 3748 Pnt 3193 3743 Pnt 2183 3800 Pnt 3178 3743 Pnt 2046 3788 Pnt 2731 3743 Pnt 3109 3813 Pnt 2405 3746 Pnt 3014 3738 Pnt 3850 3816 Pnt 2606 3743 Pnt 3156 3750 Pnt 3938 3791 Pnt 2327 3735 Pnt 2557 3762 Pnt 2066 3775 Pnt 2579 3772 Pnt 2200 3815 Pnt 3242 3735 Pnt 2239 3804 Pnt 2607 3745 Pnt 2317 3796 Pnt 2212 3817 Pnt 3043 3757 Pnt 2817 3762 Pnt 2149 3796 Pnt 2796 3796 Pnt 2564 3802 Pnt 2011 3754 Pnt 2017 3787 Pnt 2238 3808 Pnt 4069 3755 Pnt 2948 3786 Pnt 2993 2806 Pnt 2534 3742 Pnt 3991 3755 Pnt 3133 3786 Pnt 1933 3763 Pnt 2621 3754 Pnt 3521 3760 Pnt 2973 3747 Pnt 2268 3800 Pnt 2009 3849 Pnt 2479 3767 Pnt 2434 3771 Pnt 3730 3746 Pnt 2463 3786 Pnt 2913 3755 Pnt 3726 2954 Pnt 2244 3767 Pnt 2701 3753 Pnt 2629 3751 Pnt 2445 3759 Pnt 2688 3758 Pnt 3257 3782 Pnt 2793 3809 Pnt 3945 3742 Pnt 2947 3754 Pnt 2688 2728 Pnt 2061 3839 Pnt 2688 3797 Pnt 2739 3839 Pnt 3502 3772 Pnt 3268 3758 Pnt 2485 3765 Pnt 3198 3745 Pnt 2506 3743 Pnt 2885 3743 Pnt 2652 3739 Pnt 2549 3795 Pnt 4100 3753 Pnt 2947 3747 Pnt 2321 3798 Pnt 2744 3773 Pnt 1937 3776 Pnt 2753 3805 Pnt 2696 3777 Pnt 3836 3745 Pnt 2887 3749 Pnt 1831 3819 Pnt 3323 3741 Pnt 2017 3832 Pnt 3295 3757 Pnt 3148 3762 Pnt 2464 3791 Pnt 2735 2235 Pnt 2185 3810 Pnt 2069 3820 Pnt 2276 3796 Pnt 2855 3812 Pnt 2095 3821 Pnt 3320 3751 Pnt 2606 3751 Pnt 2481 3787 Pnt 2201 3823 Pnt 2639 3820 Pnt 2627 3763 Pnt 4156 3750 Pnt 2570 3734 Pnt 2391 3833 Pnt 2862 3747 Pnt 2419 3739 Pnt 3447 2451 Pnt 3106 3744 Pnt 2320 3745 Pnt 2752 3818 Pnt 2699 3756 Pnt 3786 3746 Pnt 2911 3759 Pnt 2661 3800 Pnt 3574 3818 Pnt 2184 3842 Pnt 2897 3800 Pnt 2923 3780 Pnt 2894 3855 Pnt 2636 3800 Pnt 2921 3748 Pnt 3389 3743 Pnt 3151 3748 Pnt 2873 3762 Pnt 2557 3747 Pnt 3113 3752 Pnt 2383 3793 Pnt 2865 3760 Pnt 2177 3796 Pnt 3436 3770 Pnt 2869 3812 Pnt 3783 3793 Pnt 2490 3737 Pnt 2394 3740 Pnt 2661 3760 Pnt 2126 3809 Pnt 3059 3811 Pnt 2765 3746 Pnt 2124 3844 Pnt 2808 3765 Pnt 2900 3746 Pnt 2698 3823 Pnt 3047 3756 Pnt 2676 3769 Pnt 3804 3760 Pnt 3606 3765 Pnt 2772 3752 Pnt 2712 3834 Pnt 2406 3748 Pnt 3001 3832 Pnt 2279 3760 Pnt 2408 3795 Pnt 3186 3743 Pnt 2055 3791 Pnt 2721 3780 Pnt 2603 3760 Pnt 2735 3791 Pnt 2506 3762 Pnt 1823 3808 Pnt 3178 3756 Pnt 2465 3759 Pnt 2428 3752 Pnt 2439 3740 Pnt 3071 3750 Pnt 2227 3806 Pnt 2564 3768 Pnt 2293 3738 Pnt 3682 3768 Pnt 2710 3738 Pnt 3477 3780 Pnt 3533 3754 Pnt 3946 3761 Pnt 2278 3796 Pnt 3172 3750 Pnt 3040 3793 Pnt 2785 3731 Pnt 2662 3746 Pnt 1932 3736 Pnt 2239 3754 Pnt 2658 3836 Pnt 2590 3758 Pnt 3007 3741 Pnt 2189 3809 Pnt 2881 3754 Pnt 2803 3748 Pnt 3374 3754 Pnt 1931 3840 Pnt 2730 3827 Pnt 3180 3754 Pnt 1672 3786 Pnt 2532 3797 Pnt 2741 3824 Pnt 2932 3742 Pnt 2356 3752 Pnt 2697 3741 Pnt 2406 3761 Pnt 1932 3795 Pnt 3614 3741 Pnt 2891 3844 Pnt 2831 3827 Pnt 1949 3773 Pnt 3118 3771 Pnt 2720 3748 Pnt 2495 3753 Pnt 2969 3775 Pnt 2076 3773 Pnt 4222 3763 Pnt 2600 3790 Pnt 2712 3775 Pnt 4074 3750 Pnt 3927 3748 Pnt 2881 3751 Pnt 2774 2788 Pnt 3064 3743 Pnt 2778 3747 Pnt 2508 3904 Pnt 1889 3782 Pnt 3031 3783 Pnt 2010 3775 Pnt 3115 3771 Pnt 2521 3810 Pnt 2335 3768 Pnt 3195 3754 Pnt 2778 3785 Pnt 3402 3743 Pnt 2327 3744 Pnt 2790 3739 Pnt 2224 3818 Pnt 3494 3739 Pnt 3796 2887 Pnt 4054 3785 Pnt 3172 3753 Pnt 2528 3752 Pnt 2527 3752 Pnt 3432 3736 Pnt 2687 3757 Pnt 2273 3790 Pnt 2460 3820 Pnt 3132 3746 Pnt 2824 3768 Pnt 2597 3751 Pnt 2566 3804 Pnt 4041 3747 Pnt 2675 3736 Pnt 1961 3757 Pnt 2640 3771 Pnt 2186 3757 Pnt 2362 3837 Pnt 2766 3778 Pnt 2540 3743 Pnt 2930 3739 Pnt 2191 3791 Pnt 2540 3753 Pnt 2158 3803 Pnt 3154 3747 Pnt 2772 3775 Pnt 2208 3812 Pnt 2901 3753 Pnt 2052 3840 Pnt 3077 3803 Pnt 1864 3776 Pnt 2585 3821 Pnt 2693 3779 Pnt 2877 3840 Pnt 2623 3766 Pnt 2502 3757 Pnt 2675 3764 Pnt 2259 3748 Pnt 3060 3743 Pnt 3941 3760 Pnt 2878 3744 Pnt 2625 3815 Pnt 2561 3748 Pnt 2856 3756 Pnt 3003 3844 Pnt 2720 3817 Pnt 2428 3776 Pnt 2529 3736 Pnt 2444 3741 Pnt 3632 3736 Pnt 3417 3764 Pnt 3785 3746 Pnt 2777 3763 Pnt 2776 3764 Pnt 2163 3818 Pnt 2531 3745 Pnt 2448 3786 Pnt 2137 3768 Pnt 2604 3738 Pnt 2296 3757 Pnt 2816 3761 Pnt 3191 3770 Pnt 2793 3754 Pnt 2537 3791 Pnt 2351 3826 Pnt 3366 3754 Pnt 3967 3756 Pnt 3201 3774 Pnt 3635 3741 Pnt 2133 3825 Pnt 2034 3844 Pnt 3282 3750 Pnt 2878 3780 Pnt 2365 3790 Pnt 3521 3824 Pnt 2897 3765 Pnt 2466 3818 Pnt 2511 3750 Pnt 2299 3805 Pnt 2947 3741 Pnt 2715 3764 Pnt 2172 3754 Pnt 2747 3793 Pnt 2520 3827 Pnt 2801 3749 Pnt 3773 3750 Pnt 2741 3793 Pnt 2829 3799 Pnt 2978 3754 Pnt 2420 3803 Pnt 2990 3751 Pnt 2827 3744 Pnt 2708 3800 Pnt 2728 3741 Pnt 2802 3744 Pnt 3805 3843 Pnt 2426 3800 Pnt 3076 3766 Pnt 2630 3798 Pnt 2910 3766 Pnt 2632 3741 Pnt 3609 3795 Pnt 3712 3744 Pnt 3774 3750 Pnt 2258 3757 Pnt 3475 3750 Pnt 2762 3823 Pnt 2348 3740 Pnt 2484 3782 Pnt 2466 3744 Pnt 3241 3823 Pnt 3696 2720 Pnt 2576 3745 Pnt 3098 3755 Pnt 2615 3744 Pnt 3344 3747 Pnt 2146 3854 Pnt 3391 3744 Pnt 1899 3805 Pnt 1949 3769 Pnt 3757 3775 Pnt 2507 3752 Pnt 2054 3821 Pnt 3962 3775 Pnt 2738 3784 Pnt 3327 3751 Pnt 3863 3760 Pnt 2289 3771 Pnt 3600 3747 Pnt 2425 3827 Pnt 3752 3751 Pnt 2844 3834 Pnt 2598 3817 Pnt 4001 3749 Pnt 3103 3759 Pnt 3818 3747 Pnt 2793 2804 Pnt 3626 3759 Pnt 2467 3741 Pnt 3015 3742 Pnt 2352 3770 Pnt 2443 3916 Pnt 3579 2824 Pnt 3496 3744 Pnt 2674 2927 Pnt 3189 3761 Pnt 2221 3780 Pnt 2907 3737 Pnt 2688 3745 Pnt 2970 3770 Pnt 2501 3755 Pnt 2506 3739 Pnt 2136 3782 Pnt 3760 2713 Pnt 3670 3785 Pnt 3263 3754 Pnt 2996 3782 Pnt 2914 3738 Pnt 2691 3839 Pnt 3519 3736 Pnt 2503 3762 Pnt 2832 3744 Pnt 3195 3750 Pnt 2431 3753 Pnt 2730 3795 Pnt 2834 3804 Pnt 2099 3778 Pnt 2925 3839 Pnt 2283 3789 Pnt 2396 3760 Pnt 2272 3761 Pnt 2392 3746 Pnt 2524 3769 Pnt 2654 3745 Pnt 2692 3766 Pnt 2984 3762 Pnt 3385 3748 Pnt 2723 3750 Pnt 3019 3758 Pnt 2135 3853 Pnt 2943 3744 Pnt 2791 2544 Pnt 3632 3750 Pnt 2956 3746 Pnt 3128 3827 Pnt 2735 3796 Pnt 2762 3757 Pnt 2749 3826 Pnt 2677 3836 Pnt 3405 3758 Pnt 3152 3745 Pnt 2623 3795 Pnt 2656 3773 Pnt 3283 3826 Pnt 2148 3794 Pnt 2663 3737 Pnt 3405 3745 Pnt 2117 3786 Pnt 2689 3754 Pnt 2125 3770 Pnt 2929 3744 Pnt 3723 3744 Pnt 2779 3750 Pnt 2055 3793 Pnt 2745 2752 Pnt 2467 3741 Pnt 3336 3757 Pnt 2485 3769 Pnt 3883 3744 Pnt 2827 3748 Pnt 3965 3748 Pnt 3106 3850 Pnt 2894 3850 Pnt 2186 3765 Pnt 2835 3806 Pnt 3127 3749 Pnt 2371 3771 Pnt 2534 3743 Pnt 3547 2609 Pnt 2905 3743 Pnt 2706 3747 Pnt 3032 3744 Pnt 3382 3749 Pnt 2416 3758 Pnt 2599 3745 Pnt 2735 3807 Pnt 2423 3748 Pnt 2803 3748 Pnt 3280 3750 Pnt 3249 3743 Pnt 3091 3741 Pnt 2687 3749 Pnt 3041 3739 Pnt 2022 3826 Pnt 3657 2882 Pnt 2864 3764 Pnt 2341 3777 Pnt 2022 3826 Pnt 2888 3758 Pnt 2278 3759 Pnt 4152 3743 Pnt 2636 3775 Pnt 3326 3754 Pnt 3220 3748 Pnt 3039 3763 Pnt 2217 3792 Pnt 1810 3821 Pnt 3295 3764 Pnt 3549 3755 Pnt 2122 3854 Pnt 2899 3752 Pnt 2569 3796 Pnt 2943 3792 Pnt 2925 3743 Pnt 3243 3746 Pnt 2992 3792 Pnt 2344 3779 Pnt 3004 3771 Pnt 2118 3897 Pnt 2124 3838 Pnt 3352 3746 Pnt 3321 3876 Pnt 2796 3754 Pnt 3205 3760 Pnt 2576 3934 Pnt 2547 3806 Pnt 2950 3771 Pnt 2939 3749 Pnt 4160 3760 Pnt 2745 3754 Pnt 2731 3771 Pnt 2514 3740 Pnt 2454 3742 Pnt 2494 3795 Pnt 2573 3746 Pnt 2959 3741 Pnt 3600 3740 Pnt 2920 3739 Pnt 2829 3742 Pnt 2716 3758 Pnt 2360 3880 Pnt 2485 3746 Pnt 3396 3757 Pnt 2546 3800 Pnt 2453 3742 Pnt 2650 3754 Pnt 2173 3827 Pnt 2521 3787 Pnt 3230 3739 Pnt 3160 3763 Pnt 2763 3747 Pnt 2250 3826 Pnt 2604 3795 Pnt 3471 3742 Pnt 2043 3786 Pnt 1823 3891 Pnt 2637 3769 Pnt 2425 3746 Pnt 2597 3764 Pnt 3774 3758 Pnt 2434 3760 Pnt 2804 3750 Pnt 2462 3736 Pnt 2910 3814 Pnt 2633 3744 Pnt 3169 3744 Pnt 2410 3797 Pnt 2679 3758 Pnt 3373 3747 Pnt 2682 3746 Pnt 2185 3798 Pnt 4049 3800 Pnt 3160 3743 Pnt 2976 3748 Pnt 2712 3760 Pnt 3051 3806 Pnt 3001 3751 Pnt 2857 3760 Pnt 2040 3801 Pnt 2647 3767 Pnt 3540 2863 Pnt 2890 3754 Pnt 3045 3750 Pnt 2660 3788 Pnt 2760 3742 Pnt 2695 3749 Pnt 2976 3745 Pnt 2851 3743 Pnt 3454 3743 Pnt 2941 3747 Pnt 2675 3737 Pnt 2700 3777 Pnt 2543 3772 Pnt 3947 2749 Pnt 2003 3805 Pnt 2561 3779 Pnt 3368 2729 Pnt 3300 3793 Pnt 3508 3805 Pnt 3252 3760 Pnt 2584 3801 Pnt 2648 3837 Pnt 3017 3757 Pnt 2714 3765 Pnt 3118 3747 Pnt 2841 3788 Pnt 2350 3837 Pnt 3429 3747 Pnt 3162 3799 Pnt 3050 3744 Pnt 2630 3758 Pnt 2623 3750 Pnt 3972 3799 Pnt 3196 2807 Pnt 2670 3770 Pnt 2996 3758 Pnt 2237 3801 Pnt 3737 3761 Pnt 2356 2707 Pnt 2485 3774 Pnt 2025 3801 Pnt 3221 3829 Pnt 2776 3744 Pnt 2577 3756 Pnt 2721 3747 Pnt 2579 3803 Pnt 4190 3769 Pnt 3680 3744 Pnt 2934 3767 Pnt 2717 3807 Pnt 3197 3757 Pnt 2572 3767 Pnt 2905 3751 Pnt 2599 3798 Pnt 3416 3826 Pnt 2944 3826 Pnt 3217 3740 Pnt 3505 3738 Pnt 3059 3744 Pnt 3049 3795 Pnt 2472 3736 Pnt 2772 3742 Pnt 3707 3736 Pnt 3426 3750 Pnt 2807 3765 Pnt 2334 3801 Pnt 2840 3743 Pnt 3901 2667 Pnt 3435 3779 Pnt 2168 3765 Pnt 2501 3792 Pnt 3120 3747 Pnt 2577 3771 Pnt 3263 3792 Pnt 2516 3749 Pnt 3097 3755 Pnt 3874 2449 Pnt 3507 3750 Pnt 3146 3782 Pnt 2087 3798 Pnt 3247 3749 Pnt 3059 3764 Pnt 2970 3797 Pnt 2197 3792 Pnt 3987 3747 Pnt 2838 3770 Pnt 2346 3831 Pnt 2438 3792 Pnt 2379 3782 Pnt 2478 3735 Pnt 2150 3934 Pnt 2612 3785 Pnt 2603 3784 Pnt 1991 3753 Pnt 3773 3934 Pnt 1955 3794 Pnt 2576 3751 Pnt 2986 3745 Pnt 2608 3748 Pnt 2943 3743 Pnt 2219 3805 Pnt 2583 3751 Pnt 2533 3842 Pnt 2687 3754 Pnt 2559 3773 Pnt 3531 2839 Pnt 3519 3743 Pnt 3529 3746 Pnt 2847 3749 Pnt 2504 3752 Pnt 3242 3755 Pnt 2820 3746 Pnt 2628 3749 Pnt 2638 3755 Pnt 2049 3762 Pnt 3453 3761 Pnt 2835 3747 Pnt 2658 3743 Pnt 2709 3761 Pnt 2637 3736 Pnt 2969 3817 Pnt 3191 3745 Pnt 2904 3743 Pnt 2473 3784 Pnt 2097 3774 Pnt 2607 3775 Pnt 2210 3811 Pnt 3832 3744 Pnt 3028 3784 Pnt 2969 3740 Pnt 2888 3762 Pnt 2534 3740 Pnt 2434 3801 Pnt 2713 3775 Pnt 3326 3762 Pnt 2896 3809 Pnt 2666 3808 Pnt 2289 3799 Pnt 2629 3762 Pnt 1941 3737 Pnt 3368 3787 Pnt 2475 3746 Pnt 3383 3812 Pnt 2281 3825 Pnt 3292 3744 Pnt 2369 3769 Pnt 3351 3749 Pnt 2650 3746 Pnt 3393 3752 Pnt 3121 3742 Pnt 2316 3780 Pnt 2860 3751 Pnt 2936 3750 Pnt 2635 3800 Pnt 2492 3804 Pnt 2895 3749 Pnt 2486 3865 Pnt 3745 3750 Pnt 2861 3744 Pnt 2807 2769 Pnt 2605 3756 Pnt 3223 3767 Pnt 3693 3742 Pnt 2998 3757 Pnt 2884 3752 Pnt 2796 3740 Pnt 2716 3831 Pnt 3797 3742 Pnt 3686 3744 Pnt 2497 3741 Pnt 2549 3821 Pnt 2365 3756 Pnt 2861 3769 Pnt 2866 3821 Pnt 2345 3749 Pnt 2880 3755 Pnt 3661 3776 Pnt 2675 3751 Pnt 3700 3751 Pnt 2535 3749 Pnt 2356 3752 Pnt 3512 3752 Pnt 2964 3756 Pnt 3068 3744 Pnt 2563 3744 Pnt 2628 3804 Pnt 3315 3747 Pnt 2669 3751 Pnt 2734 3775 Pnt 2453 3743 Pnt 2549 3743 Pnt 2441 3740 Pnt 1849 3802 Pnt 2503 3818 Pnt 3142 3750 Pnt 2676 3759 Pnt 3152 3746 Pnt 2522 3740 Pnt 2599 3758 Pnt 2419 3833 Pnt 2239 3872 Pnt 3054 3746 Pnt 2675 3762 Pnt 2654 3750 Pnt 2811 3764 Pnt 2207 3832 Pnt 2971 3748 Pnt 3253 3750 Pnt 2468 3832 Pnt 2934 3750 Pnt 2325 3833 Pnt 3018 3761 Pnt 2875 3743 Pnt 2972 3833 Pnt 2281 3943 Pnt 2906 3743 Pnt 3913 3748 Pnt 2479 3759 Pnt 2837 3761 Pnt 2521 3758 Pnt 3879 3744 Pnt 1936 3765 Pnt 2812 3753 Pnt 2002 3753 Pnt 2014 3794 Pnt 3399 3761 Pnt 2551 2673 Pnt 2573 3759 Pnt 3146 3761 Pnt 3274 3744 Pnt 2718 3739 Pnt 3090 3745 Pnt 2550 3756 Pnt 2913 3755 Pnt 2561 3740 Pnt 2267 3794 Pnt 2213 3791 Pnt 3530 3743 Pnt 2848 3781 Pnt 2826 3770 Pnt 3119 3743 Pnt 2257 3852 Pnt 2782 3783 Pnt 2687 3742 Pnt 2693 3797 Pnt 2952 3758 Pnt 2280 3794 Pnt 2828 3808 Pnt 3098 3758 Pnt 3903 3794 Pnt 2827 3744 Pnt 2564 3749 Pnt 2841 3747 Pnt 2905 2749 Pnt 3098 3762 Pnt 3231 3755 Pnt 3203 3762 Pnt 2728 3746 Pnt 2991 3744 Pnt 3456 3763 Pnt 2508 3790 Pnt 2608 3745 Pnt 3320 3753 Pnt 3547 3760 Pnt 2526 3754 Pnt 3899 3744 Pnt 2873 3745 Pnt 2825 3745 Pnt 2625 3754 Pnt 2805 3759 Pnt 3052 3770 Pnt 2875 3748 Pnt 3715 3760 Pnt 3128 3751 Pnt 3229 3746 Pnt 2772 3805 Pnt 3334 3762 Pnt 4061 3751 Pnt 3004 3803 Pnt 2681 3790 Pnt 2718 3790 Pnt 2657 3750 Pnt 2225 3802 Pnt 2216 3773 Pnt 3533 3790 Pnt 2817 3802 Pnt 2470 3765 Pnt 3950 3757 Pnt 2831 3744 Pnt 2626 3750 Pnt 3121 3738 Pnt 3013 3749 Pnt 2598 3743 Pnt 2485 3756 Pnt 3297 3756 Pnt 3064 3760 Pnt 2754 3794 Pnt 3208 3755 Pnt 2166 3755 Pnt 3305 3760 Pnt 3021 3746 Pnt 2575 3815 Pnt 2132 3797 Pnt 2497 3754 Pnt 2970 3770 Pnt 2869 3749 Pnt 2995 3778 Pnt 2420 3835 Pnt 3519 3778 Pnt 2291 3749 Pnt 3297 3744 Pnt 2708 3762 Pnt 2532 3742 Pnt 2524 3753 Pnt 3248 3762 Pnt 4012 3757 Pnt 2677 3777 Pnt 2222 3806 Pnt 2205 3771 Pnt 2238 3793 Pnt 3455 3809 Pnt 2500 3747 Pnt 2266 3757 Pnt 2948 3748 Pnt 2680 3748 Pnt 2658 3763 Pnt 3944 3746 Pnt 2576 3777 Pnt 2385 3757 Pnt 3773 3737 Pnt 2651 3787 Pnt 2642 3788 Pnt 2612 3773 Pnt 3149 3787 Pnt 3137 3757 Pnt 2746 3754 Pnt 2755 3754 Pnt 3185 3753 Pnt 2423 3777 Pnt 3181 3755 Pnt 2372 3951 Pnt 2991 3761 Pnt 2415 3772 Pnt 3350 3764 Pnt 3147 3942 Pnt 2874 3753 Pnt 2276 3757 Pnt 3793 3764 Pnt 2966 3738 Pnt 2547 3801 Pnt 2455 3782 Pnt 3111 3763 Pnt 2622 3822 Pnt 3754 3782 Pnt 2434 3739 Pnt 3368 3750 Pnt 2750 3740 Pnt 2659 3822 Pnt 3190 3750 Pnt 2859 3742 Pnt 2961 3864 Pnt 2768 3760 Pnt 2440 3776 Pnt 2689 3751 Pnt 3001 3772 Pnt 2273 3746 Pnt 2801 3758 Pnt 2817 3838 Pnt 2738 3794 Pnt 2948 3768 Pnt 4159 3759 Pnt 2823 3742 Pnt 2600 3759 Pnt 2446 3774 Pnt 2682 3747 Pnt 2689 3741 Pnt 2783 3751 Pnt 2653 3775 Pnt 3732 3758 Pnt 3056 3740 Pnt 2767 3742 Pnt 3579 3768 Pnt 2750 3753 Pnt 2993 2597 Pnt 2251 3832 Pnt 2558 3743 Pnt 2219 3867 Pnt 3347 3754 Pnt 2557 3746 Pnt 2412 3761 Pnt 3450 3867 Pnt 2743 3757 Pnt 2347 3899 Pnt 3281 3757 Pnt 3055 3758 Pnt 2922 3781 Pnt 2086 3810 Pnt 1980 3813 Pnt 2915 3759 Pnt 2532 3782 Pnt 2830 3781 Pnt 2210 3811 Pnt 3151 3748 Pnt 2800 3797 Pnt 2653 3746 Pnt 2901 3801 Pnt 3126 3793 Pnt 3061 3813 Pnt 2451 3742 Pnt 2724 3754 Pnt 2405 3767 Pnt 2797 3791 Pnt 3180 3763 Pnt 2667 3744 Pnt 3451 3742 Pnt 2809 3735 Pnt 1901 3827 Pnt 3780 3750 Pnt 2628 3766 Pnt 3055 3858 Pnt 3028 3753 Pnt 2418 3822 Pnt 3740 3741 Pnt 3821 3753 Pnt 2281 3746 Pnt 2814 3753 Pnt 3573 3745 Pnt 3528 3760 Pnt 2499 3783 Pnt 3239 3753 Pnt 2509 3766 Pnt 2009 3770 Pnt 3231 3749 Pnt 2145 3869 Pnt 3085 3762 Pnt 3023 3749 Pnt 2990 3749 Pnt 2223 3790 Pnt 3752 3745 Pnt 2911 3762 Pnt 2673 3777 Pnt 3431 3751 Pnt 2414 3813 Pnt 2816 3764 Pnt 3063 3751 Pnt 2917 3743 Pnt 2092 3801 Pnt 3104 3751 Pnt 2306 3812 Pnt 2371 3755 Pnt 2553 3743 Pnt 2145 3827 Pnt 2801 3739 Pnt 2185 3780 Pnt 3654 3755 Pnt 2780 3743 Pnt 2365 3751 Pnt 2243 3830 Pnt 2163 3804 Pnt 2814 3752 Pnt 2637 3786 Pnt 2822 3808 Pnt 2406 3751 Pnt 3626 3751 Pnt 2082 3832 Pnt 3013 3738 Pnt 2562 3812 Pnt 3815 3758 Pnt 3749 3745 Pnt 3668 3832 Pnt 3512 3751 Pnt 4746 3783 Pnt 2217 3831 Pnt 2166 3748 Pnt 2662 3814 Pnt 3170 3752 Pnt 2435 3766 Pnt 3203 3744 Pnt 2386 3761 Pnt 3146 3814 Pnt 2941 3773 Pnt 2654 3747 Pnt 2690 3741 Pnt 2966 3745 Pnt 2850 3758 Pnt 3260 3738 Pnt 2614 3741 Pnt 4038 3752 Pnt 2028 3770 Pnt 2930 3744 Pnt 2782 3744 Pnt 2388 3738 Pnt 2004 3770 Pnt 2944 3748 Pnt 3437 3749 Pnt 3188 3797 Pnt 2977 3760 Pnt 2412 3798 Pnt 3909 3743 Pnt 2455 3774 Pnt 3409 3740 Pnt 2745 3750 Pnt 4245 3749 Pnt 2112 3869 Pnt 2694 3804 Pnt 3584 3748 Pnt 3327 2536 Pnt 2462 3810 Pnt 2453 3742 Pnt 2768 3753 Pnt 2739 3788 Pnt 2516 3810 Pnt 2117 3816 Pnt 2957 3742 Pnt 2662 3828 Pnt 3409 3866 Pnt 3081 3744 Pnt 2371 3758 Pnt 3280 3755 Pnt 2957 3741 Pnt 2583 3802 Pnt 2429 3749 Pnt 3443 3756 Pnt 3011 3745 Pnt 2932 3829 Pnt 3254 3762 Pnt 2010 3805 Pnt 2950 3775 Pnt 2580 3762 Pnt 3117 3750 Pnt 2743 3746 Pnt 2244 3763 Pnt 3784 3763 Pnt 2358 3771 Pnt 2493 3741 Pnt 3004 3752 Pnt 2478 3798 Pnt 2551 3742 Pnt 3688 2605 Pnt 2154 3804 Pnt 3421 3759 Pnt 3461 3766 Pnt 2756 3742 Pnt 2887 3743 Pnt 2666 3751 Pnt 2887 3779 Pnt 3115 3751 Pnt 2256 3772 Pnt 3004 3754 Pnt 3625 3798 Pnt 1888 3795 Pnt 2078 3812 Pnt 2845 3754 Pnt 3244 3758 Pnt 2626 3798 Pnt 2333 3750 Pnt 3234 3750 Pnt 2294 3741 Pnt 3840 3805 Pnt 2474 3825 Pnt 2899 3750 Pnt 2746 3750 Pnt 2762 3759 Pnt 2908 3754 Pnt 2730 3759 Pnt 2237 3858 Pnt 2786 3774 Pnt 4209 3761 Pnt 2977 3763 Pnt 2869 3754 Pnt 2492 3780 Pnt 3155 3755 Pnt 2624 3774 Pnt 3181 3763 Pnt 2664 3762 Pnt 2152 3826 Pnt 3395 3755 Pnt 3075 3741 Pnt 2698 3786 Pnt 2315 3829 Pnt 2905 3752 Pnt 2304 3744 Pnt 2326 3761 Pnt 2288 3935 Pnt 2423 3739 Pnt 2772 3740 Pnt 3762 3761 Pnt 2723 3752 Pnt 2951 3740 Pnt 2705 3789 Pnt 2447 3750 Pnt 2892 3745 Pnt 3106 3744 Pnt 2152 3768 Pnt 3703 3744 Pnt 2434 3819 Pnt 2110 3810 Pnt 3455 3756 Pnt 2289 3785 Pnt 2883 3768 Pnt 3625 3824 Pnt 3084 3743 Pnt 2938 3743 Pnt 2786 3819 Pnt 2864 3751 Pnt 2507 3745 Pnt 4000 3756 Pnt 2169 3762 Pnt 2739 3751 Pnt 4162 3758 Pnt 2502 3743 Pnt 2977 3751 Pnt 2901 3757 Pnt 2752 3748 Pnt 2643 3801 Pnt 2006 3796 Pnt 3155 3755 Pnt 2564 3747 Pnt 2759 3791 Pnt 2259 3801 Pnt 2126 3823 Pnt 3155 3734 Pnt 2964 3755 Pnt 2459 3771 Pnt 3921 3786 Pnt 3339 3801 Pnt 1933 3803 Pnt 2711 3746 Pnt 3374 3755 Pnt 3000 3757 Pnt 2101 3806 Pnt 3606 3739 Pnt 2483 3759 Pnt 3109 3756 Pnt 2355 3759 Pnt 2514 3750 Pnt 3759 3750 Pnt 2549 3748 Pnt 3786 3755 Pnt 2581 3748 Pnt 1919 3762 Pnt 2613 3761 Pnt 3026 3741 Pnt 2755 3778 Pnt 3167 3761 Pnt 2757 3753 Pnt 2844 3751 Pnt 2502 3749 Pnt 2868 3754 Pnt 1908 3750 Pnt 4091 3749 Pnt 3369 3763 Pnt 2622 3750 Pnt 3820 3749 Pnt 2718 3752 Pnt 2579 3740 Pnt 2168 3757 Pnt 2684 3755 Pnt 2882 3754 Pnt 2702 2753 Pnt 2282 3766 Pnt 2871 3778 Pnt 3273 3734 Pnt 2794 3777 Pnt 2707 3767 Pnt 2362 3774 Pnt 2304 3763 Pnt 3300 3776 Pnt 2931 3754 Pnt 2626 3746 Pnt 2711 3748 Pnt 2331 3804 Pnt 2386 3754 Pnt 2432 3787 Pnt 2842 3738 Pnt 2433 3745 Pnt 2887 3743 Pnt 3768 3776 Pnt 2385 3811 Pnt 2914 3781 Pnt 2262 3834 Pnt 3349 3794 Pnt 2613 3828 Pnt 3252 3743 Pnt 2333 3808 Pnt 2767 3777 Pnt 2995 3764 Pnt 2571 3768 Pnt 2378 3794 Pnt 2360 3793 Pnt 3876 3777 Pnt 2038 3748 Pnt 2548 3776 Pnt 3006 3760 Pnt 3004 3743 Pnt 2064 3808 Pnt 2918 3782 Pnt 3127 3759 Pnt 2668 3757 Pnt 2523 3752 Pnt 2501 3756 Pnt 2388 3817 Pnt 2004 3773 Pnt 2195 3796 Pnt 3508 3743 Pnt 2700 3812 Pnt 3059 3745 Pnt 2385 3739 Pnt 3004 3745 Pnt 2687 3752 Pnt 2548 3787 Pnt 3270 3745 Pnt 2388 3744 Pnt 2924 3745 Pnt 2707 3787 Pnt 2512 3752 Pnt 2707 3744 Pnt 2036 3772 Pnt 2632 3771 Pnt 3594 3752 Pnt 2509 3756 Pnt 1971 3846 Pnt 2972 3771 Pnt 2817 3771 Pnt 2699 3784 Pnt 2259 3810 Pnt 2246 3753 Pnt 3166 3849 Pnt 3004 3744 Pnt 1977 3755 Pnt 2684 3761 Pnt 2580 3784 Pnt 2342 3754 Pnt 2507 3755 Pnt 2970 3749 Pnt 2521 3751 Pnt 2472 3751 Pnt 3604 3755 Pnt 2451 3759 Pnt 3832 3752 Pnt 2930 3812 Pnt 2410 3752 Pnt 2672 3759 Pnt 3016 3738 Pnt 2803 3783 Pnt 3321 3754 Pnt 2677 3752 Pnt 3077 3752 Pnt 3517 3739 Pnt 2456 3765 Pnt 2940 3752 Pnt 2629 3751 Pnt 2662 3762 Pnt 2820 3753 Pnt 2533 3773 Pnt 3395 3735 Pnt 2482 3758 Pnt 2673 3814 Pnt 3396 3753 Pnt 2479 3795 Pnt 2371 3755 Pnt 2279 3753 Pnt 3063 3755 Pnt 4170 3759 Pnt 3056 3755 Pnt 2868 3759 Pnt 2623 3868 Pnt 2931 3759 Pnt 2682 3742 Pnt 3773 3765 Pnt 2545 3746 Pnt 2728 3744 Pnt 2499 3753 Pnt 2860 3765 Pnt 3417 3759 Pnt 2614 3766 Pnt 3035 3742 Pnt 2770 3743 Pnt 3279 3742 Pnt 2615 3759 Pnt 3161 3787 Pnt 2529 3761 Pnt 2758 3756 Pnt 3162 3752 Pnt 2511 3742 Pnt 2291 3773 Pnt 3691 3755 Pnt 3363 3756 Pnt 3115 3753 Pnt 2870 3738 Pnt 2080 3763 Pnt 3901 3774 Pnt 2644 3765 Pnt 2654 3822 Pnt 2340 3798 Pnt 2530 3074 Pnt 3092 3741 Pnt 2958 3749 Pnt 2992 3771 Pnt 3441 3753 Pnt 2587 3787 Pnt 2907 3749 Pnt 2394 3763 Pnt 3925 3753 Pnt 2521 3745 Pnt 2054 3776 Pnt 2896 2713 Pnt 2173 3817 Pnt 2433 3756 Pnt 2254 3779 Pnt 3591 3756 Pnt 2867 3762 Pnt 2738 3755 Pnt 4160 3757 Pnt 3270 3789 Pnt 2773 3744 Pnt 2611 3752 Pnt 2069 3798 Pnt 2932 3755 Pnt 2645 3820 Pnt 3405 3789 Pnt 2403 3779 Pnt 2622 3735 Pnt 1911 3797 Pnt 3086 3757 Pnt 2621 3741 Pnt 2785 3735 Pnt 2748 3797 Pnt 2742 3746 Pnt 3433 2789 Pnt 2083 3797 Pnt 2661 3787 Pnt 2535 3760 Pnt 2270 3740 Pnt 3192 3806 Pnt 3587 2751 Pnt 2999 3797 Pnt 2074 3783 Pnt 3056 3763 Pnt 3249 3764 Pnt 2476 3753 Pnt 2228 3742 Pnt 2699 3797 Pnt 3524 3735 Pnt 2624 3771 Pnt 3347 3743 Pnt 2359 3755 Pnt 3595 3759 Pnt 3450 2644 Pnt 3509 3755 Pnt 3318 3755 Pnt 2651 3753 Pnt 2948 3753 Pnt 1998 3771 Pnt 2324 3807 Pnt 2469 3738 Pnt 2544 3807 Pnt 2645 3733 Pnt 3226 3753 Pnt 2910 3754 Pnt 2426 3760 Pnt 2651 3767 Pnt 2024 3733 Pnt 2935 3850 Pnt 2683 3743 Pnt 1867 3900 Pnt 2150 3859 Pnt 2168 3839 Pnt 3680 3753 Pnt 3134 3753 Pnt 2688 3857 Pnt 2389 3848 Pnt 4020 3753 Pnt 3174 3742 Pnt 2511 3853 Pnt 2183 3766 Pnt 2572 3857 Pnt 2596 3788 Pnt 3209 2677 Pnt 2604 3757 Pnt 2995 3786 Pnt 2633 3748 Pnt 2630 3749 Pnt 2861 3736 Pnt 2856 3752 Pnt 3553 3749 Pnt 2891 3767 Pnt 2241 3751 Pnt 2925 3770 Pnt 3712 3786 Pnt 2410 3794 Pnt 2359 3800 Pnt 2532 3746 Pnt 3283 3760 Pnt 2522 3779 Pnt 2593 3797 Pnt 2462 3746 Pnt 2213 3848 Pnt 3033 3770 Pnt 1769 3782 Pnt 2750 3747 Pnt 2093 3767 Pnt 2716 3737 Pnt 2565 3763 Pnt 2541 3796 Pnt 2529 3791 Pnt 3546 3763 Pnt 2015 3808 Pnt 3574 3797 Pnt 2667 3753 Pnt 2158 3744 Pnt 3061 3753 Pnt 2628 3775 Pnt 2642 3750 Pnt 2770 3786 Pnt 3440 3759 Pnt 2603 3777 Pnt 3428 3746 Pnt 2475 3809 Pnt 3187 3763 Pnt 2232 3759 Pnt 2142 3781 Pnt 2818 3764 Pnt 2107 3795 Pnt 3106 3746 Pnt 2537 3753 Pnt 2135 3766 Pnt 3269 3753 Pnt 2537 3761 Pnt 3291 3765 Pnt 2369 3742 Pnt 3528 3757 Pnt 2779 3760 Pnt 2225 3818 Pnt 2879 2865 Pnt 2971 3761 Pnt 2946 3797 Pnt 3000 3743 Pnt 2677 3782 Pnt 2107 3805 Pnt 3268 3782 Pnt 2722 3772 Pnt 2863 3784 Pnt 2532 3760 Pnt 2922 3768 Pnt 2736 3752 Pnt 3355 3760 Pnt 2575 3742 Pnt 2696 3750 Pnt 2637 3751 Pnt 2149 3752 Pnt 2079 3784 Pnt 3782 3742 Pnt 2618 3743 Pnt 3069 3760 Pnt 2429 3813 Pnt 1996 3747 Pnt 2233 3777 Pnt 2781 3738 Pnt 2791 3760 Pnt 4259 3743 Pnt 2673 3747 Pnt 3089 3750 Pnt 2397 3912 Pnt 2357 3747 Pnt 2070 3750 Pnt 1990 3791 Pnt 2849 3753 Pnt 2778 3752 Pnt 2752 3748 Pnt 2313 3923 Pnt 3391 3745 Pnt 2290 3827 Pnt 2953 3760 Pnt 2542 3776 Pnt 3407 3749 Pnt 2789 3745 Pnt 2630 3758 Pnt 2710 3754 Pnt 3039 3755 Pnt 2723 3804 Pnt 2431 3823 Pnt 3206 3754 Pnt 3114 3767 Pnt 2362 3752 Pnt 4040 3777 Pnt 2606 3809 Pnt 3431 3767 Pnt 2237 3815 Pnt 2596 3746 Pnt 2905 3753 Pnt 2783 3753 Pnt 2989 3771 Pnt 2652 3770 Pnt 2659 3745 Pnt 2872 3739 Pnt 3909 3771 Pnt 2754 3769 Pnt 2125 3796 Pnt 2414 3789 Pnt 4043 3789 Pnt 3638 3741 Pnt 3186 3744 Pnt 3475 3787 Pnt 2799 3810 Pnt 3252 3783 Pnt 2889 3773 Pnt 2378 3773 Pnt 2892 3763 Pnt 2441 3791 Pnt 4225 3749 Pnt 3112 3748 Pnt 2453 3760 Pnt 2860 3756 Pnt 2527 3760 Pnt 3522 3760 Pnt 2448 3804 Pnt 2263 3771 Pnt 3069 3736 Pnt 3877 3746 Pnt 3566 3779 Pnt 2890 3744 Pnt 2882 3761 Pnt 3901 3751 Pnt 2517 3732 Pnt 3526 3744 Pnt 2546 3761 Pnt 2843 3778 Pnt 2966 3754 Pnt 2308 3735 Pnt 2494 3750 Pnt 4105 3754 Pnt 2064 3843 Pnt 3606 3775 Pnt 2191 3752 Pnt 2326 3800 Pnt 3681 3753 Pnt 2064 3840 Pnt 2056 3810 Pnt 4242 3800 Pnt 2168 3741 Pnt 2080 3798 Pnt 3106 3766 Pnt 2476 3801 Pnt 2435 3738 Pnt 2213 3757 Pnt 2216 3739 Pnt 2616 3757 Pnt 3149 3747 Pnt 4047 3751 Pnt 2584 3752 Pnt 3138 3744 Pnt 2481 3754 Pnt 3681 3751 Pnt 2681 3752 Pnt 2074 3812 Pnt 3380 3800 Pnt 2967 3812 Pnt 2787 3763 Pnt 2985 3800 Pnt 3304 3777 Pnt 2479 3744 Pnt 2585 3833 Pnt 3645 3748 Pnt 2728 3766 Pnt 2385 3762 Pnt 4463 3777 Pnt 1983 3839 Pnt 2598 3745 Pnt 2555 3797 Pnt 2506 3776 Pnt 2061 3810 Pnt 2688 3741 Pnt 3242 3745 Pnt 3913 3808 Pnt 2792 3756 Pnt 2587 3810 Pnt 2084 3804 Pnt 2084 3812 Pnt 2826 3750 Pnt 2630 3742 Pnt 2604 3756 Pnt 2290 3815 Pnt 2627 3796 Pnt 2213 3796 Pnt 3296 3750 Pnt 3254 3759 Pnt 2809 3743 Pnt 2642 3773 Pnt 2391 3821 Pnt 2091 3808 Pnt 2672 3855 Pnt 3382 3773 Pnt 2739 3805 Pnt 2245 3753 Pnt 2797 3780 Pnt 3146 3774 Pnt 2627 3748 Pnt 3096 3792 Pnt 3032 3766 Pnt 2532 3777 Pnt 2398 3817 Pnt 3286 3817 Pnt 2863 3820 Pnt 2666 3757 Pnt 2385 3802 Pnt 2821 3780 Pnt 2587 3737 Pnt 2564 3742 Pnt 2485 3751 Pnt 3085 3746 Pnt 2870 3755 Pnt 3030 3746 Pnt 3970 2603 Pnt 3138 3750 Pnt 2966 3759 Pnt 2115 3844 Pnt 2465 3746 Pnt 3384 3758 Pnt 4057 3752 Pnt 4242 3759 Pnt 3666 3750 Pnt 2798 3765 Pnt 2423 3747 Pnt 4213 3757 Pnt 2848 3743 Pnt 2119 3784 Pnt 2883 3747 Pnt 2537 3824 Pnt 2477 3824 Pnt 2932 3793 Pnt 3576 3751 Pnt 3893 3747 Pnt 2669 3744 Pnt 2554 3751 Pnt 3175 3784 Pnt 2722 3809 Pnt 2648 3796 Pnt 2294 3754 Pnt 1990 3832 Pnt 2988 3744 Pnt 2687 3818 Pnt 2511 3847 Pnt 2861 3760 Pnt 2579 3837 Pnt 1885 3819 Pnt 2602 3741 Pnt 2129 3795 Pnt 2526 3757 Pnt 3321 3749 Pnt 2252 3826 Pnt 2651 3800 Pnt 3528 3757 Pnt 2239 3793 Pnt 3136 3733 Pnt 2232 3846 Pnt 2645 3791 Pnt 3662 3741 Pnt 2721 3846 Pnt 3224 3752 Pnt 2612 3806 Pnt 2210 3794 Pnt 3073 3756 Pnt 2313 3771 Pnt 2527 3811 Pnt 2908 3790 Pnt 2806 3751 Pnt 3864 2742 Pnt 2619 3760 Pnt 2709 3747 Pnt 2486 3797 Pnt 3086 3763 Pnt 2673 3824 Pnt 3574 3760 Pnt 2007 3773 Pnt 2983 3744 Pnt 3214 3758 Pnt 3610 3740 Pnt 2443 3761 Pnt 2442 3748 Pnt 1984 3795 Pnt 2993 3755 Pnt 3193 3756 Pnt 2641 3749 Pnt 2736 3834 Pnt 2713 3834 Pnt 2611 3769 Pnt 3390 3834 Pnt 2661 3751 Pnt 2780 3748 Pnt 2844 3736 Pnt 2524 3736 Pnt 2426 3780 Pnt 2603 3800 Pnt 3619 3751 Pnt 2685 3753 Pnt 2642 3748 Pnt 3092 3807 Pnt 3351 3750 Pnt 3033 3752 Pnt 2340 3756 Pnt 2856 3750 Pnt 2435 3747 Pnt 3273 3758 Pnt 1934 3786 Pnt 2690 3752 Pnt 4034 3827 Pnt 2364 3740 Pnt 2833 3762 Pnt 2226 3783 Pnt 2507 3762 Pnt 3773 3780 Pnt 2384 3783 Pnt 3148 3748 Pnt 2622 3821 Pnt 3000 3758 Pnt 3353 3748 Pnt 2853 3758 Pnt 2520 3790 Pnt 3046 3791 Pnt 2680 3746 Pnt 3441 3821 Pnt 2464 3797 Pnt 3111 3761 Pnt 2889 3796 Pnt 2758 3753 Pnt 2263 3758 Pnt 2910 3760 Pnt 1937 3775 Pnt 3369 3778 Pnt 2493 3799 Pnt 2923 3785 Pnt 3089 3760 Pnt 3935 3741 Pnt 1983 3787 Pnt 1992 3837 Pnt 2325 3736 Pnt 3880 2757 Pnt 2331 3844 Pnt 2657 3832 Pnt 2436 3766 Pnt 2634 3832 Pnt 2567 3795 Pnt 3012 3754 Pnt 2936 3795 Pnt 3484 3734 Pnt 2875 3775 Pnt 2817 3739 Pnt 2540 3751 Pnt 2683 3743 Pnt 3112 3745 Pnt 3085 3746 Pnt 2912 3826 Pnt 2620 3904 Pnt 2326 3762 Pnt 2102 3803 Pnt 2881 3746 Pnt 2915 3744 Pnt 2604 3750 Pnt 2898 3771 Pnt 2674 3750 Pnt 2190 3758 Pnt 2398 3795 Pnt 3023 2789 Pnt 2459 3750 Pnt 2757 3747 Pnt 2032 3824 Pnt 2867 3747 Pnt 2597 3743 Pnt 2646 3779 Pnt 2521 3745 Pnt 2496 3773 Pnt 2072 3818 Pnt 4351 2898 Pnt 2299 3818 Pnt 3894 3771 Pnt 2632 3823 Pnt 4711 2682 Pnt 3394 3757 Pnt 3060 3753 Pnt 3026 3765 Pnt 2636 3782 Pnt 2462 3759 Pnt 2504 3817 Pnt 2197 3752 Pnt 2872 3817 Pnt 2367 3871 Pnt 2791 3744 Pnt 3153 3741 Pnt 2273 3770 Pnt 2599 3780 Pnt 2708 3768 Pnt 3238 3746 Pnt 2708 3916 Pnt 2402 3737 Pnt 2556 3756 Pnt 3656 3782 Pnt 1929 3916 Pnt 2323 3797 Pnt 2841 3763 Pnt 3960 3089 Pnt 2583 3763 Pnt 3379 3746 Pnt 2820 3778 Pnt 4169 3783 Pnt 2777 3757 Pnt 2634 3805 Pnt 2661 3827 Pnt 2695 2615 Pnt 2650 3753 Pnt 2242 3748 Pnt 2879 3745 Pnt 2716 3757 Pnt 2156 3812 Pnt 2791 3749 Pnt 3384 3738 Pnt 2574 3737 Pnt 2522 3748 Pnt 2486 3821 Pnt 1980 3805 Pnt 3048 3739 Pnt 3259 3753 Pnt 2516 3738 Pnt 2179 3801 Pnt 3976 3753 Pnt 2735 3743 Pnt 2446 3762 Pnt 3441 3805 Pnt 2772 3745 Pnt 2695 3745 Pnt 2723 3799 Pnt 3260 3850 Pnt 3140 3764 Pnt 2363 3800 Pnt 2295 3748 Pnt 3202 3739 Pnt 2588 3827 Pnt 3140 3739 Pnt 2844 3822 Pnt 2620 3815 Pnt 2683 3743 Pnt 2883 3743 Pnt 2867 3764 Pnt 2341 3773 Pnt 2375 3775 Pnt 3180 3758 Pnt 3175 3750 Pnt 2496 3769 Pnt 2816 3742 Pnt 2912 3740 Pnt 2761 3748 Pnt 2637 3767 Pnt 2149 3854 Pnt 2129 3799 Pnt 2724 3748 Pnt 2341 3807 Pnt 2365 3756 Pnt 4106 3758 Pnt 3438 3750 Pnt 2677 3764 Pnt 2813 3812 Pnt 2791 3776 Pnt 2560 3771 Pnt 2804 3752 Pnt 3144 3764 Pnt 1881 3805 Pnt 3437 3765 Pnt 2546 3804 Pnt 3026 3748 Pnt 3213 3812 Pnt 2955 3749 Pnt 2851 3775 Pnt 2439 3782 Pnt 2393 3764 Pnt 2966 3750 Pnt 3001 3764 Pnt 3055 3751 Pnt 2133 3769 Pnt 3167 3751 Pnt 2653 3742 Pnt 2728 3755 Pnt 2886 3844 Pnt 2849 3750 Pnt 3906 3745 Pnt 2886 3757 Pnt 3644 3755 Pnt 3142 3757 Pnt 3505 3743 Pnt 2549 3763 Pnt 2261 3740 Pnt 3043 3751 Pnt 3562 3741 Pnt 2249 3775 Pnt 2773 3740 Pnt 1999 3786 Pnt 2333 3831 Pnt 2894 3786 Pnt 2852 3766 Pnt 3827 3745 Pnt 2759 3770 Pnt 2961 3748 Pnt 2062 3737 Pnt 2621 3779 Pnt 2015 3818 Pnt 2797 3751 Pnt 2707 3754 Pnt 3138 3750 Pnt 2409 3756 Pnt 3191 2923 Pnt 2721 3785 Pnt 2708 3795 Pnt 2532 3744 Pnt 3107 3795 Pnt 2495 3798 Pnt 2603 3737 Pnt 2556 3788 Pnt 2102 3770 Pnt 3475 3753 Pnt 4112 3757 Pnt 3355 3753 Pnt 2500 3753 Pnt 2568 3799 Pnt 3462 2918 Pnt 2617 3748 Pnt 2029 3806 Pnt 3162 3733 Pnt 3984 3735 Pnt 2465 3744 Pnt 2035 3826 Pnt 3094 3794 Pnt 3040 3806 Pnt 2696 3749 Pnt 2859 3745 Pnt 2534 3826 Pnt 2809 3767 Pnt 2442 3744 Pnt 2738 3755 Pnt 1979 3766 Pnt 3314 3750 Pnt 3924 3747 Pnt 2742 3754 Pnt 2642 3771 Pnt 2973 3792 Pnt 2715 3761 Pnt 3042 3745 Pnt 3919 3748 Pnt 2822 3788 Pnt 3220 3744 Pnt 2176 3897 Pnt 2541 3753 Pnt 2937 2837 Pnt 2152 3838 Pnt 2912 3804 Pnt 2378 3759 Pnt 2659 3754 Pnt 2657 3746 Pnt 2715 3794 Pnt 2683 3783 Pnt 2894 3760 Pnt 2010 3805 Pnt 2624 3762 Pnt 2864 3762 Pnt 2763 3755 Pnt 2059 3838 Pnt 4050 3753 Pnt 3915 3748 Pnt 3094 3747 Pnt 2525 3838 Pnt 2098 3789 Pnt 3709 3756 Pnt 2600 3748 Pnt 2860 3743 Pnt 2611 3771 Pnt 2588 3804 Pnt 3837 3747 Pnt 2087 3738 Pnt 2838 3804 Pnt 2913 3745 Pnt 3490 3747 Pnt 2562 3791 Pnt 2859 3740 Pnt 2718 3817 Pnt 2428 3817 Pnt 3035 3746 Pnt 2705 3876 Pnt 3359 3742 Pnt 3962 3763 Pnt 2683 3775 Pnt 2305 3832 Pnt 2863 3744 Pnt 3367 3768 Pnt 2715 3880 Pnt 3632 3751 Pnt 3618 3754 Pnt 3298 3745 Pnt 2752 3784 Pnt 2503 3764 Pnt 2660 3764 Pnt 2744 2837 Pnt 2383 3767 Pnt 2301 3808 Pnt 3021 2746 Pnt 2592 3826 Pnt 2654 3750 Pnt 2875 3743 Pnt 2860 3754 Pnt 2517 3740 Pnt 2208 3853 Pnt 3011 3750 Pnt 2403 3892 Pnt 1925 3783 Pnt 2221 3801 Pnt 2025 3792 Pnt 2911 3892 Pnt 2719 3745 Pnt 3687 3793 Pnt 2775 3809 Pnt 2598 3780 Pnt 2493 3839 Pnt 2459 3746 Pnt 4206 3762 Pnt 2148 3795 Pnt 2422 3741 Pnt 2138 3769 Pnt 2694 3769 Pnt 2490 3757 Pnt 2985 3752 Pnt 3526 3742 Pnt 2646 3760 Pnt 3403 3769 Pnt 2150 3804 Pnt 2443 3754 Pnt 3078 3748 Pnt 3741 3757 Pnt 2476 3750 Pnt 3028 3748 Pnt 2492 3737 Pnt 3072 2471 Pnt 2684 3752 Pnt 2686 3800 Pnt 3044 3746 Pnt 2380 3771 Pnt 2732 3746 Pnt 2597 3765 Pnt 2625 3771 Pnt 3430 3751 Pnt 2790 3743 Pnt 2537 3767 Pnt 2408 3760 Pnt 2669 3762 Pnt 3901 3762 Pnt 2665 3762 Pnt 3537 3737 Pnt 3092 3755 Pnt 2883 3755 Pnt 2617 3777 Pnt 2560 3743 Pnt 2883 3759 Pnt 3545 3748 Pnt 2856 3777 Pnt 2443 3771 Pnt 3170 3747 Pnt 2522 3752 Pnt 3885 3759 Pnt 2903 3748 Pnt 2570 3772 Pnt 2943 3747 Pnt 2246 3744 Pnt 2585 3745 Pnt 2398 3744 Pnt 3126 3762 Pnt 2298 3757 Pnt 3334 3749 Pnt 2404 3804 Pnt 3758 3746 Pnt 2809 3740 Pnt 2963 3771 Pnt 3223 3761 Pnt 2381 3840 Pnt 2923 3756 Pnt 3222 3749 Pnt 2893 3750 Pnt 3595 3754 Pnt 3171 3749 Pnt 2803 3754 Pnt 2456 3804 Pnt 3104 3802 Pnt 3347 3778 Pnt 2594 3740 Pnt 2648 3775 Pnt 2340 3801 Pnt 2890 3761 Pnt 3094 3767 Pnt 3771 3808 Pnt 2789 3796 Pnt 2646 3750 Pnt 2452 3764 Pnt 2164 3807 Pnt 2679 3775 Pnt 2381 3741 Pnt 2797 3754 Pnt 3517 3758 Pnt 2316 3775 Pnt 2707 3751 Pnt 3100 3764 Pnt 2778 3742 Pnt 2476 3770 Pnt 3228 3743 Pnt 2314 3751 Pnt 2490 3750 Pnt 3044 3770 Pnt 3090 3764 Pnt 2461 3833 Pnt 2522 3775 Pnt 2564 3758 Pnt 2052 3742 Pnt 3140 3754 Pnt 2563 3750 Pnt 3134 3763 Pnt 2552 3826 Pnt 2154 3867 Pnt 2240 3792 Pnt 3388 3763 Pnt 2728 3754 Pnt 2531 3744 Pnt 2711 3753 Pnt 2050 3739 Pnt 2394 3766 Pnt 2599 3758 Pnt 2532 3829 Pnt 4263 3767 Pnt 2496 3758 Pnt 2828 3867 Pnt 2339 3743 Pnt 2891 3767 Pnt 2396 3759 Pnt 2707 3759 Pnt 2754 3934 Pnt 2754 3743 Pnt 2878 3754 Pnt 2125 3798 Pnt 2757 3842 Pnt 2971 3754 Pnt 1997 3813 Pnt 2738 3784 Pnt 3468 3842 Pnt 2026 3801 Pnt 3712 3014 Pnt 2916 3779 Pnt 3405 3751 Pnt 3212 3755 Pnt 2939 3771 Pnt 2320 3770 Pnt 2647 3779 Pnt 3274 3743 Pnt 2965 3801 Pnt 2747 3743 Pnt 2446 3742 Pnt 2950 3749 Pnt 2443 3931 Pnt 2929 3781 Pnt 2781 3768 Pnt 2224 3806 Pnt 2309 3768 Pnt 2941 3747 Pnt 2457 3747 Pnt 2702 3779 Pnt 3290 3745 Pnt 3411 3784 Pnt 3099 3753 Pnt 3222 3755 Pnt 2563 3743 Pnt 2758 3808 Pnt 3804 3753 Pnt 2408 3746 Pnt 2738 3745 Pnt 3277 3763 Pnt 2408 3774 Pnt 2616 3750 Pnt 2818 3774 Pnt 2709 3761 Pnt 2533 3746 Pnt 2044 3839 Pnt 3274 3762 Pnt 3498 3762 Pnt 2856 3780 Pnt 1985 3832 Pnt 3247 3835 Pnt 2940 3794 Pnt 3528 3842 Pnt 2899 3744 Pnt 2359 3800 Pnt 3704 3780 Pnt 2821 3745 Pnt 2948 3765 Pnt 2909 3800 Pnt 1834 3827 Pnt 3175 3754 Pnt 3116 3765 Pnt 3092 3754 Pnt 2107 3774 Pnt 2710 3795 Pnt 3946 3754 Pnt 2806 3758 Pnt 3219 3745 Pnt 2490 3814 Pnt 3002 3760 Pnt 3841 2791 Pnt 2952 3743 Pnt 3803 3760 Pnt 3513 3742 Pnt 3106 3775 Pnt 3022 3741 Pnt 3646 3752 Pnt 3983 2681 Pnt 3848 3743 Pnt 2787 3762 Pnt 3524 3756 Pnt 3957 3752 Pnt 3360 3755 Pnt 2639 3821 Pnt 3160 3750 Pnt 2381 3801 Pnt 2797 3743 Pnt 3481 3755 Pnt 2308 3793 Pnt 4229 3770 Pnt 3945 3749 Pnt 2422 3769 Pnt 2451 3766 Pnt 2167 3821 Pnt 3019 3761 Pnt 2820 3758 Pnt 2601 3750 Pnt 2413 3865 Pnt 1881 3822 Pnt 2359 3743 Pnt 3414 3747 Pnt 2702 3768 Pnt 3155 3865 Pnt 2529 3790 Pnt 2506 3769 Pnt 2212 3801 Pnt 2528 3750 Pnt 3518 3767 Pnt 2542 3745 Pnt 2498 3774 Pnt 2579 3744 Pnt 4075 3770 Pnt 3819 3788 Pnt 2801 3774 Pnt 1994 3818 Pnt 2509 3798 Pnt 3166 3755 Pnt 3633 3755 Pnt 2731 3758 Pnt 2721 3756 Pnt 3292 2818 Pnt 2544 3829 Pnt 2988 3755 Pnt 3021 3773 Pnt 2523 3788 Pnt 3384 3788 Pnt 2633 3747 Pnt 2575 3751 Pnt 2732 3773 Pnt 3075 3755 Pnt 2874 3828 Pnt 2849 3762 Pnt 2615 3762 Pnt 3046 3795 Pnt 2570 3751 Pnt 3464 3750 Pnt 2891 3749 Pnt 2791 3746 Pnt 3052 3747 Pnt 2548 3747 Pnt 2482 3758 Pnt 2877 3742 Pnt 2158 3775 Pnt 2811 3944 Pnt 2671 3746 Pnt 3469 3753 Pnt 2340 3791 Pnt 3381 3750 Pnt 3304 2597 Pnt 2873 3775 Pnt 2476 3833 Pnt 2168 2818 Pnt 2614 3750 Pnt 2563 3768 Pnt 3170 3767 Pnt 2429 3782 Pnt 2744 3768 Pnt 2152 3767 Pnt 2358 3819 Pnt 2724 3771 Pnt 3290 3758 Pnt 2513 3809 Pnt 2971 3749 Pnt 2750 3743 Pnt 2876 3763 Pnt 2818 3768 Pnt 3631 3756 Pnt 3893 3763 Pnt 2030 3803 Pnt 3273 3756 Pnt 2395 3746 Pnt 3841 3773 Pnt 3040 3756 Pnt 2353 3794 Pnt 2042 3792 Pnt 3511 3759 Pnt 2494 3786 Pnt 2296 3802 Pnt 3290 3769 Pnt 1941 3792 Pnt 2601 3749 Pnt 2577 3754 Pnt 2564 3754 Pnt 3559 3755 Pnt 2407 3743 Pnt 3820 3749 Pnt 3116 3796 Pnt 2601 3781 Pnt 3693 3796 Pnt 2239 3780 Pnt 2494 3803 Pnt 3480 3751 Pnt 2852 3803 Pnt 2991 3776 Pnt 4068 3744 Pnt 2998 3748 Pnt 3251 3751 Pnt 2745 3745 Pnt 2798 3770 Pnt 3250 2772 Pnt 2150 3798 Pnt 2587 3864 Pnt 3963 3748 Pnt 2657 3830 Pnt 1968 3794 Pnt 3020 3750 Pnt 2949 3830 Pnt 2691 3760 Pnt 3374 3752 Pnt 2484 3820 Pnt 2883 3752 Pnt 2437 3765 Pnt 2510 3751 Pnt 2017 3760 Pnt 2816 3751 Pnt 3804 3768 Pnt 2783 3794 Pnt 2613 3782 Pnt 3007 3760 Pnt 2094 3755 Pnt 3162 3753 Pnt 2882 3766 Pnt 2557 3815 Pnt 2946 3739 Pnt 3985 3763 Pnt 2390 3772 Pnt 3021 3746 Pnt 3629 3739 Pnt 2462 3746 Pnt 3320 3759 Pnt 2407 3797 Pnt 2550 3749 Pnt 3477 3755 Pnt 2501 3766 Pnt 2294 3752 Pnt 3420 3749 Pnt 2682 3858 Pnt 2493 3772 Pnt 2209 3780 Pnt 3802 2793 Pnt 2502 3798 Pnt 2646 3778 Pnt 3833 3743 Pnt 2533 3835 Pnt 2902 3749 Pnt 2457 3753 Pnt 2967 3744 Pnt 2107 3790 Pnt 3115 3815 Pnt 1894 3770 Pnt 3188 3792 Pnt 4160 3755 Pnt 2469 3809 Pnt 2008 3773 Pnt 3796 3745 Pnt 2663 3749 Pnt 3449 3762 Pnt 2538 3758 Pnt 3871 3759 Pnt 2932 3751 Pnt 3133 3762 Pnt 2235 3795 Pnt 3534 3738 Pnt 2972 3763 Pnt 3551 3747 Pnt 2803 3746 Pnt 2269 3866 Pnt 2273 3795 Pnt 2433 3752 Pnt 2532 3805 Pnt 3446 3805 Pnt 2567 3742 Pnt 2438 3804 Pnt 2242 3782 Pnt 2845 3800 Pnt 2189 3822 Pnt 2987 3755 Pnt 3855 3746 Pnt 3638 3739 Pnt 2686 3751 Pnt 3279 3744 Pnt 3967 3749 Pnt 2572 3742 Pnt 2886 3746 Pnt 3387 3758 Pnt 3276 3755 Pnt 3133 3747 Pnt 2591 3755 Pnt 3597 3765 Pnt 2554 3740 Pnt 2666 3750 Pnt 3222 3753 Pnt 2557 3754 Pnt 2672 3752 Pnt 2054 3804 Pnt 3966 3741 Pnt 3760 3749 Pnt 2661 3754 Pnt 2892 3740 Pnt 2463 3795 Pnt 2061 3785 Pnt 2852 3761 Pnt 2407 3792 Pnt 3790 3743 Pnt 3232 3794 Pnt 3082 3795 Pnt 2363 3742 Pnt 2582 3737 Pnt 2898 3781 Pnt 2127 3822 Pnt 2794 3762 Pnt 2432 3935 Pnt 2567 3852 Pnt 1776 3731 Pnt 3164 3745 Pnt 2094 3768 Pnt 3857 3752 Pnt 2395 3797 Pnt 2855 3819 Pnt 4125 3757 Pnt 3242 3752 Pnt 3038 2953 Pnt 2720 3741 Pnt 2094 3796 Pnt 3307 3752 Pnt 3165 3749 Pnt 2267 3801 Pnt 2877 3744 Pnt 3714 3739 Pnt 3845 3741 Pnt 2945 3755 Pnt 2541 3777 Pnt 2518 3757 Pnt 2082 3853 Pnt 2673 3761 Pnt 2337 3808 Pnt 3851 3754 Pnt 2991 3808 Pnt 4023 3757 Pnt 3188 3756 Pnt 2779 3780 Pnt 2116 3771 Pnt 2611 3763 Pnt 2808 3744 Pnt 2450 3785 Pnt 3054 3759 Pnt 2748 3754 Pnt 2401 3942 Pnt 2703 3764 Pnt 2559 3740 Pnt 2388 3811 Pnt 2953 3743 Pnt 3649 3941 Pnt 2736 3758 Pnt 2579 3814 Pnt 3248 2133 Pnt 2755 3752 Pnt 2627 3751 Pnt 3429 3735 Pnt 3080 3752 Pnt 2801 3814 Pnt 2558 3759 Pnt 3063 3751 Pnt 2327 3824 Pnt 2418 3743 Pnt 3073 3781 Pnt 4021 3745 Pnt 2929 3745 Pnt 2144 3797 Pnt 3363 3757 Pnt 2733 3753 Pnt 2636 3740 Pnt 2916 3753 Pnt 2263 3781 Pnt 3045 3753 Pnt 2923 3760 Pnt 2917 3781 Pnt 2802 3824 Pnt 3805 2841 Pnt 3920 2893 Pnt 3125 3778 Pnt 2708 3791 Pnt 3097 3767 Pnt 2542 3759 Pnt 3063 3813 Pnt 3645 2696 Pnt 2226 3774 Pnt 3059 3791 Pnt 2877 3767 Pnt 2610 3749 Pnt 2472 3750 Pnt 2135 3777 Pnt 2721 3764 Pnt 2474 3771 Pnt 2557 3747 Pnt 3360 3750 Pnt 2403 3748 Pnt 2721 3743 Pnt 3380 3748 Pnt 2544 3869 Pnt 2010 3801 Pnt 3606 3739 Pnt 2619 3807 Pnt 2077 3777 Pnt 3236 3735 Pnt 2296 3810 Pnt 2684 3810 Pnt 2853 3742 Pnt 2716 3810 Pnt 2938 3753 Pnt 2340 3755 Pnt 2288 3834 Pnt 1900 3803 Pnt 3411 3751 Pnt 3281 3757 Pnt 2082 3762 Pnt 2645 3838 Pnt 2924 3834 Pnt 2459 3749 Pnt 2859 3798 Pnt 2215 3827 Pnt 3607 3763 Pnt 2142 3796 Pnt 2623 3827 Pnt 3543 3776 Pnt 2544 3777 Pnt 2327 3808 Pnt 2849 3767 Pnt 2681 3819 Pnt 2042 3781 Pnt 2912 3776 Pnt 4432 3751 Pnt 2766 3752 Pnt 2660 3752 Pnt 2713 3748 Pnt 2366 3796 Pnt 2193 3831 Pnt 2223 3752 Pnt 2079 3808 Pnt 4049 3796 Pnt 3275 3831 Pnt 2950 3749 Pnt 2625 3754 Pnt 2538 3751 Pnt 2930 3749 Pnt 4037 3759 Pnt 2598 3814 Pnt 3265 3753 Pnt 3040 3803 Pnt 2613 3749 Pnt 4107 3754 Pnt 2753 3782 Pnt 3563 3749 Pnt 2572 3763 Pnt 3147 3814 Pnt 2691 3752 Pnt 3206 3751 Pnt 2714 3745 Pnt 2316 3810 Pnt 3647 3746 Pnt 2521 3749 Pnt 2262 3766 Pnt 2983 3759 Pnt 2388 3765 Pnt 3292 3766 Pnt 3731 3743 Pnt 3405 3765 Pnt 2524 3756 Pnt 3036 3769 Pnt 3279 3744 Pnt 3082 3735 Pnt 2417 3761 Pnt 2985 2703 Pnt 3331 3735 Pnt 2010 3766 Pnt 3010 3752 Pnt 2314 3772 Pnt 2021 3810 Pnt 3486 3761 Pnt 3943 2612 Pnt 2568 3757 Pnt 2975 3764 Pnt 2534 3747 Pnt 2757 3741 Pnt 2613 3753 Pnt 3030 3748 Pnt 2794 3762 Pnt 2726 3787 Pnt 2562 3803 Pnt 2172 3746 Pnt 2120 3803 Pnt 2392 3749 Pnt 1949 3772 Pnt 3392 3743 Pnt 2952 3753 Pnt 3401 3752 Pnt 1961 3771 Pnt 3059 3745 Pnt 2439 3781 Pnt 3665 3756 Pnt 2472 3783 Pnt 2400 3804 Pnt 2531 3813 Pnt 2302 3744 Pnt 3100 3786 Pnt 3614 3749 Pnt 2536 3752 Pnt 2315 3923 Pnt 2454 3755 Pnt 2723 3743 Pnt 2793 3782 Pnt 3415 3745 Pnt 3689 3772 Pnt 2764 3752 Pnt 2409 3763 Pnt 2051 3781 Pnt 2984 3760 Pnt 3384 3755 Pnt 2584 3763 Pnt 2492 3776 Pnt 3076 3758 Pnt 3011 3759 Pnt 2661 3755 Pnt 3022 3806 Pnt 2389 3812 Pnt 2487 3750 Pnt 2746 3746 Pnt 2544 3810 Pnt 3063 3750 Pnt 3247 3756 Pnt 2869 3746 Pnt 2565 3742 Pnt 2196 3804 Pnt 3288 3750 Pnt 2415 3738 Pnt 3320 3763 Pnt 2971 3750 Pnt 2588 3741 Pnt 3101 3772 Pnt 2052 2869 Pnt 2626 3811 Pnt 2494 3763 Pnt 2532 3773 Pnt 2513 3787 Pnt 3213 3787 Pnt 2974 3754 Pnt 3389 3774 Pnt 2568 3759 Pnt 3545 3752 Pnt 2516 3802 Pnt 2982 3733 Pnt 3453 3802 Pnt 2629 3808 Pnt 2080 3766 Pnt 2848 3766 Pnt 2782 3746 Pnt 2610 3746 Pnt 2532 3750 Pnt 2873 3787 Pnt 2432 3761 Pnt 2680 3815 Pnt 2507 3757 Pnt 2707 3744 Pnt 2459 3742 Pnt 2541 3743 Pnt 2107 3798 Pnt 3025 3742 Pnt 2757 3752 Pnt 2560 3776 Pnt 2855 3754 Pnt 3663 3743 Pnt 2393 3750 Pnt 3863 3795 Pnt 2545 3745 Pnt 2853 3783 Pnt 4031 3754 Pnt 2653 3749 Pnt 2806 3754 Pnt 2632 3767 Pnt 2470 3824 Pnt 3425 3757 Pnt 3100 3770 Pnt 3105 3765 Pnt 2688 3744 Pnt 3577 3754 Pnt 3405 3757 Pnt 2448 3810 Pnt 3116 3754 Pnt 2863 3748 Pnt 2488 3791 Pnt 3066 3738 Pnt 3721 3740 Pnt 2354 3738 Pnt 2830 3739 Pnt 3040 3738 Pnt 2849 3773 Pnt 2265 3784 Pnt 1972 3771 Pnt 2578 3745 Pnt 1994 3795 Pnt 1848 3807 Pnt 2916 3763 Pnt 2164 3762 Pnt 2120 3755 Pnt 2193 3753 Pnt 2650 3791 Pnt 3228 3746 Pnt 2681 3791 Pnt 2683 3747 Pnt 3214 3751 Pnt 3814 3744 Pnt 2619 3747 Pnt 3009 3746 Pnt 2922 3756 Pnt 2685 3746 Pnt 2292 3801 Pnt 1981 3781 Pnt 2528 3747 Pnt 2407 3760 Pnt 2343 3760 Pnt 2902 3868 Pnt 2372 3767 Pnt 3123 3742 Pnt 3084 3752 Pnt 2989 3781 Pnt 2280 3760 Pnt 1761 3802 Pnt 3329 3742 Pnt 2457 3761 Pnt 2468 3816 Pnt 2697 3802 Pnt 3941 3755 Pnt 3173 3756 Pnt 2157 3823 Pnt 2852 3812 Pnt 3035 3774 Pnt 2255 3850 Pnt 3862 3812 Pnt 2790 3845 Pnt 3572 3774 Pnt 2368 3902 Pnt 2908 3751 Pnt 3126 2723 Pnt 3781 2868 Pnt 2482 3757 Pnt 2851 3756 Pnt 2869 3753 Pnt 2550 3771 Pnt 2618 3760 Pnt 3041 3768 Pnt 2494 3766 Pnt 2786 3751 Pnt 3223 3745 Pnt 2750 3755 Pnt 3031 3759 Pnt 2775 3745 Pnt 2326 3820 Pnt 3575 3762 Pnt 2663 3779 Pnt 2256 3859 Pnt 4163 3757 Pnt 2733 3814 Pnt 2560 3779 Pnt 3517 3756 Pnt 2740 3773 Pnt 2938 3853 Pnt 2466 3796 Pnt 2204 3744 Pnt 3033 3745 Pnt 3898 3755 Pnt 2399 3841 Pnt 2522 3745 Pnt 3531 3774 Pnt 2224 3796 Pnt 3055 2797 Pnt 3233 3765 Pnt 2769 3752 Pnt 2043 3758 Pnt 2852 3745 Pnt 2634 3754 Pnt 2339 3759 Pnt 2638 3787 Pnt 2971 3749 Pnt 2681 3755 Pnt 2705 3750 Pnt 3001 3747 Pnt 2093 3751 Pnt 2580 3812 Pnt 3851 3763 Pnt 2588 3752 Pnt 2234 3740 Pnt 3404 3743 Pnt 2664 3781 Pnt 2682 3794 Pnt 2912 3754 Pnt 2804 3740 Pnt 2176 3802 Pnt 2884 3761 Pnt 2749 3756 Pnt 2293 3828 Pnt 2040 3843 Pnt 3344 3766 Pnt 2242 3805 Pnt 2476 3760 Pnt 2990 3750 Pnt 2529 3777 Pnt 2245 3848 Pnt 2967 3777 Pnt 2533 3759 Pnt 3195 3743 Pnt 2885 3809 Pnt 2661 3774 Pnt 2180 3745 Pnt 2646 3774 Pnt 2863 3843 Pnt 2638 3796 Pnt 2685 3773 Pnt 2682 3759 Pnt 2114 3783 Pnt 3121 3746 Pnt 2428 3758 Pnt 2053 3764 Pnt 2821 3756 Pnt 2715 3774 Pnt 2395 3844 Pnt 2454 3742 Pnt 2905 3763 Pnt 2302 3748 Pnt 2933 3746 Pnt 2702 3747 Pnt 2381 3810 Pnt 2514 3748 Pnt 3063 3763 Pnt 2830 3752 Pnt 2392 3844 Pnt 2834 3764 Pnt 2401 3804 Pnt 2836 3758 Pnt 2895 2205 Pnt 2813 3844 Pnt 2149 3753 Pnt 2782 3760 Pnt 2914 3771 Pnt 2801 3745 Pnt 2794 3757 Pnt 2299 3742 Pnt 2934 3763 Pnt 2913 3759 Pnt 2784 3761 Pnt 2018 3786 Pnt 2846 3761 Pnt 2255 3796 Pnt 2399 3756 Pnt 3000 3751 Pnt 2508 3796 Pnt 2173 3771 Pnt 2518 2236 Pnt 3399 3750 Pnt 2406 3761 Pnt 2700 3779 Pnt 2007 3821 Pnt 2630 3817 Pnt 3571 3779 Pnt 3111 3744 Pnt 2673 3756 Pnt 2516 3747 Pnt 4324 3748 Pnt 2555 3747 Pnt 2521 3753 Pnt 4000 2673 Pnt 2644 3778 Pnt 2874 3823 Pnt 2917 3857 Pnt 2471 3736 Pnt 3142 3744 Pnt 2310 3800 Pnt 2410 3788 Pnt 2594 3743 Pnt 3439 3743 Pnt 3636 3788 Pnt 2828 3756 Pnt 2779 3743 Pnt 2444 3756 Pnt 1858 3747 Pnt 3502 3825 Pnt 2597 3753 Pnt 3910 3752 Pnt 2706 3751 Pnt 2358 3802 Pnt 2803 3771 Pnt 2416 3824 Pnt 2489 3744 Pnt 3208 3771 Pnt 3258 3751 Pnt 2668 3784 Pnt 2609 3769 Pnt 2732 3790 Pnt 2432 3784 Pnt 3306 3744 Pnt 2787 3751 Pnt 2240 3847 Pnt 2464 3762 Pnt 2861 3762 Pnt 2896 3760 Pnt 3100 3784 Pnt 3506 3760 Pnt 3303 3748 Pnt 2960 3810 Pnt 2801 3762 Pnt 3439 3748 Pnt 2245 3753 Pnt 3861 3746 Pnt 2657 3761 Pnt 2057 3810 Pnt 2770 3765 Pnt 2478 3810 Pnt 2086 3797 Pnt 3452 3755 Pnt 2566 3758 Pnt 3283 3753 Pnt 3278 3755 Pnt 2770 3770 Pnt 2528 3822 Pnt 1993 3789 Pnt 3641 3744 Pnt 4129 3755 Pnt 2646 3744 Pnt 2862 3795 Pnt 2309 3755 Pnt 2542 3757 Pnt 2787 3757 Pnt 2255 3827 Pnt 3205 3783 Pnt 2985 3755 Pnt 3832 3744 Pnt 2811 3742 Pnt 2460 3767 Pnt 2564 3742 Pnt 2398 3757 Pnt 2262 3783 Pnt 3415 3759 Pnt 2657 3758 Pnt 3057 3756 Pnt 2499 3739 Pnt 3043 3791 Pnt 3486 3754 Pnt 2274 3739 Pnt 2334 3744 Pnt 2775 3791 Pnt 2365 3757 Pnt 2655 3748 Pnt 1902 3795 Pnt 2560 3812 Pnt 2581 3821 Pnt 2570 3800 Pnt 3518 3812 Pnt 2355 3821 Pnt 2996 3757 Pnt 4261 3760 Pnt 2631 3746 Pnt 2326 3743 Pnt 3158 3751 Pnt 2130 3810 Pnt 3060 3791 Pnt 2363 3842 Pnt 2786 3743 Pnt 3135 3741 Pnt 2727 3763 Pnt 2663 3753 Pnt 2450 3827 Pnt 2518 3759 Pnt 2358 3741 Pnt 2696 3780 Pnt 2265 3758 Pnt 2244 3793 Pnt 3002 3753 Pnt 2822 3778 Pnt 2581 3752 Pnt 2555 3801 Pnt 4049 3786 Pnt 3395 3786 Pnt 2931 3785 Pnt 2822 3827 Pnt 2825 3766 Pnt 2658 3827 Pnt 3045 3751 Pnt 2694 3741 Pnt 2353 3742 Pnt 2528 3832 Pnt 3021 3766 Pnt 2835 3762 Pnt 2670 3739 Pnt 2794 3752 Pnt 3388 3739 Pnt 2828 3752 Pnt 3842 3739 Pnt 3920 3761 Pnt 2551 3752 Pnt 2909 3790 Pnt 2872 2707 Pnt 2851 3745 Pnt 2409 3769 Pnt 2704 3769 Pnt 3469 3804 Pnt 2510 3737 Pnt 2653 3748 Pnt 3146 3777 Pnt 2238 3817 Pnt 3884 3742 Pnt 3716 3745 Pnt 2768 3750 Pnt 2345 3795 Pnt 2202 3779 Pnt 2129 3807 Pnt 2665 2838 Pnt 2335 3795 Pnt 2776 3795 Pnt 3388 3752 Pnt 1958 3762 Pnt 2035 3812 Pnt 3115 3753 Pnt 2079 3804 Pnt 2959 3742 Pnt 2963 3830 Pnt 2137 3760 Pnt 2010 3808 Pnt 2059 3812 Pnt 2427 3750 Pnt 2595 3756 Pnt 3617 3754 Pnt 2859 3745 Pnt 2598 3753 Pnt 2606 3742 Pnt 2298 3843 Pnt 2519 3817 Pnt 2548 3777 Pnt 2114 3744 Pnt 2642 3815 Pnt 2569 3780 Pnt 3740 3744 Pnt 2821 3747 Pnt 2377 3796 Pnt 3192 2813 Pnt 2938 3782 Pnt 2939 3747 Pnt 2588 3743 Pnt 2563 3928 Pnt 1948 3818 Pnt 2681 3756 Pnt 2507 3777 Pnt 2047 3805 Pnt 2280 3823 Pnt 3473 3754 Pnt 2763 3746 Pnt 2973 3743 Pnt 2258 3856 Pnt 1975 3796 Pnt 3224 3737 Pnt 2331 3778 Pnt 2349 3809 Pnt 3523 3737 Pnt 2858 3916 Pnt 2817 3780 Pnt 3398 3768 Pnt 2841 3780 Pnt 2369 3805 Pnt 2413 3753 Pnt 2560 3742 Pnt 2853 3770 Pnt 2447 3756 Pnt 2466 3751 Pnt 2339 3805 Pnt 2181 3788 Pnt 2446 3759 Pnt 2244 3746 Pnt 2373 3754 Pnt 2057 3784 Pnt 2771 3751 Pnt 2590 3799 Pnt 2741 3784 Pnt 2076 3784 Pnt 3478 3788 Pnt 2840 3827 Pnt 3357 3776 Pnt 2939 3760 Pnt 3536 3751 Pnt 2630 3757 Pnt 3048 3763 Pnt 1869 3777 Pnt 2402 3839 Pnt 2978 3757 Pnt 2531 3764 Pnt 1989 3800 Pnt 2075 3776 Pnt 2487 3753 Pnt 2057 3822 Pnt 2838 3778 Pnt 2547 3770 Pnt 1967 3810 Pnt 2193 3748 Pnt 3078 3743 Pnt 2099 3805 Pnt 2905 3747 Pnt 2324 3797 Pnt 2226 3797 Pnt 2242 3813 Pnt 2407 3761 Pnt 2591 3766 Pnt 2742 3816 Pnt 2571 3821 Pnt 2433 3750 Pnt 4033 2970 Pnt 2709 3762 Pnt 3372 3756 Pnt 2753 3745 Pnt 2742 3799 Pnt 2584 3775 Pnt 3310 3749 Pnt 3881 3745 Pnt 2003 3775 Pnt 3595 3738 Pnt 2834 3811 Pnt 2438 3771 Pnt 2691 3799 Pnt 2199 3786 Pnt 3834 3759 Pnt 3034 3792 Pnt 2576 3792 Pnt 2929 3759 Pnt 2551 3820 Pnt 2241 3748 Pnt 2899 3777 Pnt 2551 3769 Pnt 3033 3820 Pnt 2871 3749 Pnt 3470 3817 Pnt 3137 3754 Pnt 2750 3746 Pnt 2241 3812 Pnt 2578 3809 Pnt 3161 3769 Pnt 3450 3809 Pnt 2971 3739 Pnt 2483 3812 Pnt 2734 3834 Pnt 2238 3806 Pnt 2294 3800 Pnt 2421 3758 Pnt 3112 3736 Pnt 2569 3743 Pnt 2389 3773 Pnt 3647 3758 Pnt 2033 3787 Pnt 2338 3758 Pnt 3907 3745 Pnt 2475 3769 Pnt 2899 3742 Pnt 2109 3747 Pnt 3774 3742 Pnt 2195 3807 Pnt 3109 3764 Pnt 3199 2745 Pnt 2817 3749 Pnt 3922 3757 Pnt 2795 3048 Pnt 2538 3797 Pnt 2091 3795 Pnt 3439 3763 Pnt 2681 3817 Pnt 2723 3797 Pnt 1941 3832 Pnt 3429 3767 Pnt 2421 3766 Pnt 2854 3741 Pnt 2827 3754 Pnt 2393 3805 Pnt 2971 3799 Pnt 2529 3806 Pnt 2232 3765 Pnt 3002 3742 Pnt 3809 3750 Pnt 3043 3741 Pnt 2463 3744 Pnt 3251 3776 Pnt 3023 3767 Pnt 2648 3751 Pnt 2860 3755 Pnt 2646 3751 Pnt 3249 3746 Pnt 3359 3748 Pnt 2952 3761 Pnt 2719 3800 Pnt 2657 3844 Pnt 2466 3769 Pnt 3371 3751 Pnt 3608 3755 Pnt 2861 3755 Pnt 2667 3743 Pnt 3399 3751 Pnt 3079 3772 Pnt 2812 3806 Pnt 3216 3735 Pnt 2771 2493 Pnt 2828 3749 Pnt 2663 3785 Pnt 2085 3796 Pnt 2846 3783 Pnt 2635 3745 Pnt 2352 3826 Pnt 2829 3798 Pnt 3179 3773 Pnt 2791 3758 Pnt 3847 3758 Pnt 2340 3814 Pnt 3078 3744 Pnt 2763 3774 Pnt 2140 3767 Pnt 1996 3788 Pnt 2228 3825 Pnt 2180 3803 Pnt 3402 3748 Pnt 2638 3750 Pnt 2380 3744 Pnt 3105 3754 Pnt 3286 3753 Pnt 2817 3757 Pnt 2737 3912 Pnt 3535 3744 Pnt 2050 3799 Pnt 2291 3770 Pnt 3235 3750 Pnt 2695 3747 Pnt 3633 3799 Pnt 2574 3763 Pnt 2882 3754 Pnt 2112 3787 Pnt 1935 3786 Pnt 2408 3771 Pnt 2494 3748 Pnt 2393 3740 Pnt 2611 3854 Pnt 2124 3836 Pnt 2541 3737 Pnt 3080 3744 Pnt 3489 3792 Pnt 3124 3737 Pnt 2782 3754 Pnt 2240 3843 Pnt 3373 3771 Pnt 2041 3782 Pnt 2523 3794 Pnt 2571 3739 Pnt 3331 3758 Pnt 2744 3782 Pnt 2037 3771 Pnt 3801 3739 Pnt 2429 3782 Pnt 3319 3760 Pnt 3075 3832 Pnt 2901 3758 Pnt 2738 3750 Pnt 3885 3783 Pnt 3155 3748 Pnt 3931 3745 Pnt 2524 3826 Pnt 3563 3750 Pnt 2494 3904 Pnt 2250 3904 Pnt 2738 3747 Pnt 3115 3746 Pnt 2560 3746 Pnt 2657 3743 Pnt 3937 3748 Pnt 3354 3746 Pnt 2805 3745 Pnt 3978 3745 Pnt 2131 3847 Pnt 3397 3808 Pnt 2788 3756 Pnt 3835 3761 Pnt 2567 3758 Pnt 3187 3815 Pnt 3671 3742 Pnt 2687 3788 Pnt 3279 3750 Pnt 3938 3776 Pnt 2878 3748 Pnt 2783 3740 Pnt 2126 3858 Pnt 2556 3902 Pnt 2953 3740 Pnt 2710 3804 Pnt 2344 3853 Pnt 2606 3766 Pnt 3111 3773 Pnt 2842 3757 Pnt 2262 3754 Pnt 2670 3804 Pnt 3195 3783 Pnt 2718 3780 Pnt 3108 3770 Pnt 2014 3817 Pnt 2102 3838 Pnt 2419 3811 Pnt 2583 3780 Pnt 2432 3807 Pnt 2221 3760 Pnt 2160 3775 Pnt 2441 3762 Pnt 2907 3764 Pnt 2376 3759 Pnt 2033 3838 Pnt 3137 3767 Pnt 2782 3838 Pnt 2619 3743 Pnt 3445 3737 Pnt 3249 3754 Pnt 2550 3795 Pnt 2173 3786 Pnt 2710 3754 Pnt 2264 3799 Pnt 3145 3790 Pnt 2959 3759 Pnt 3168 3744 Pnt 3637 3796 Pnt 2403 3764 Pnt 2992 3768 Pnt 2808 3759 Pnt 2685 3043 Pnt 2770 3754 Pnt 2547 3767 Pnt 2206 3846 Pnt 3654 3755 Pnt 2294 3808 Pnt 3752 3748 Pnt 2912 3777 Pnt 2260 3791 Pnt 3624 2637 Pnt 2989 3746 Pnt 2562 3771 Pnt 3332 3754 Pnt 2341 3816 Pnt 2038 3771 Pnt 2737 3770 Pnt 2987 3752 Pnt 2796 3754 Pnt 3697 3752 Pnt 2799 3748 Pnt 3071 3748 Pnt 2910 3823 Pnt 2503 3792 Pnt 3838 2429 Pnt 2709 3737 Pnt 2593 3761 Pnt 3273 3761 Pnt 2792 3751 Pnt 2642 3750 Pnt 3179 3833 Pnt 2161 3798 Pnt 3356 3750 Pnt 2472 3808 Pnt 3140 3746 Pnt 2615 3801 Pnt 2004 3793 Pnt 3079 3761 Pnt 2638 3744 Pnt 2520 3742 Pnt 1951 3832 Pnt 2791 3739 Pnt 2377 3796 Pnt 3332 3735 Pnt 2355 3805 Pnt 2461 3826 Pnt 2706 3799 Pnt 3875 2661 Pnt 2821 3839 Pnt 2019 3791 Pnt 3403 3755 Pnt 3031 3760 Pnt 2847 3934 Pnt 3295 3789 Pnt 2749 2884 Pnt 3087 3753 Pnt 2392 3746 Pnt 3307 3763 Pnt 3439 3742 Pnt 2308 3800 Pnt 2802 3764 Pnt 3348 3756 Pnt 3512 3763 Pnt 2595 3776 Pnt 2438 3842 Pnt 2831 3842 Pnt 2652 3755 Pnt 3344 3748 Pnt 2804 3799 Pnt 2407 3796 Pnt 3569 3750 Pnt 2445 3762 Pnt 3049 3784 Pnt 2482 3784 Pnt 2063 3752 Pnt 2646 3771 Pnt 2079 3812 Pnt 2174 3742 Pnt 3250 3769 Pnt 3301 3783 Pnt 2983 3804 Pnt 2931 3751 Pnt 2116 3738 Pnt 2645 3784 Pnt 2473 3750 Pnt 2656 3746 Pnt 2938 3748 Pnt 2622 3780 Pnt 2888 3750 Pnt 2691 3779 Pnt 2372 3871 Pnt 3704 3747 Pnt 2297 3876 Pnt 2558 3742 Pnt 2305 3931 Pnt 3459 3871 Pnt 2689 3741 Pnt 2663 3743 Pnt 3465 3817 Pnt 2390 2745 Pnt 2635 3770 Pnt 3398 3768 Pnt 3088 3743 Pnt 2945 3747 Pnt 2704 3744 Pnt 2636 3754 Pnt 2911 3756 Pnt 2725 3751 Pnt 2790 3826 Pnt 3337 3753 Pnt 3939 3748 Pnt 2525 3880 Pnt 3093 2722 Pnt 2785 3892 Pnt 2185 3804 Pnt 3356 3753 Pnt 3182 3892 Pnt 2853 3818 Pnt 2247 3754 Pnt 3891 3756 Pnt 2813 3748 Pnt 2556 3763 Pnt 2228 3793 Pnt 3391 3765 Pnt 2503 3804 Pnt 2639 3763 Pnt 2435 3772 Pnt 2144 3769 Pnt 2319 3769 Pnt 2867 3752 Pnt 2389 3752 Pnt 2430 3744 Pnt 2674 3750 Pnt 3687 3776 Pnt 3336 3742 Pnt 3320 3750 Pnt 2842 3747 Pnt 3408 3752 Pnt 2429 3774 Pnt 3146 3758 Pnt 3427 2501 Pnt 2779 2649 Pnt 2977 3753 Pnt 4068 3746 Pnt 2657 3761 Pnt 2888 3748 Pnt 3611 3736 Pnt 2031 3758 Pnt 3093 3767 Pnt 2696 3771 Pnt 2646 3739 Pnt 2717 3775 Pnt 2257 3804 Pnt 2803 3771 Pnt 2525 3761 Pnt 2223 3840 Pnt 2689 3755 Pnt 2983 3749 Pnt 2555 3761 Pnt 2942 3756 Pnt 2444 3765 Pnt 2289 3741 Pnt 2502 3788 Pnt 3384 3752 Pnt 2461 3779 Pnt 3231 3762 Pnt 1979 3777 Pnt 2518 3740 Pnt 2311 3753 Pnt 3025 3762 Pnt 3381 3755 Pnt 2002 3797 Pnt 2705 3757 Pnt 2989 3775 Pnt 2537 3791 Pnt 2968 3777 Pnt 2808 3790 Pnt 3299 3764 Pnt 3538 3801 Pnt 2159 3821 Pnt 2092 3778 Pnt 2996 3746 Pnt 3966 3821 Pnt 2522 3759 Pnt 3609 3740 Pnt 3183 3746 Pnt 3189 3747 Pnt 2456 3797 Pnt 2843 3754 Pnt 3718 2683 Pnt 2596 3746 Pnt 2791 3754 Pnt 2578 3744 Pnt 2127 3742 Pnt 3605 3744 Pnt 3717 3754 Pnt 3524 3754 Pnt 2955 3757 Pnt 2397 3833 Pnt 3114 3763 Pnt 3599 3765 Pnt 2265 3816 Pnt 3913 3764 Pnt 2683 3746 Pnt 3512 3753 Pnt 2633 3750 Pnt 2308 3829 Pnt 2752 3758 Pnt 2031 3803 Pnt 3091 3746 Pnt 3225 3758 Pnt 3162 3750 Pnt 2105 3867 Pnt 2979 3767 Pnt 2970 3755 Pnt 2865 3867 Pnt 2877 3773 Pnt 2029 3778 Pnt 2724 3751 Pnt 2334 3797 Pnt 2179 3800 Pnt 2281 3739 Pnt 4083 3773 Pnt 2473 3759 Pnt 2845 3828 Pnt 2663 3794 Pnt 2981 3739 Pnt 2744 3754 Pnt 2333 3800 Pnt 4067 2840 Pnt 2848 3803 Pnt 2479 3751 Pnt 2697 3751 Pnt 2646 3826 Pnt 2513 3795 Pnt 3747 3751 Pnt 3159 3755 Pnt 2804 3743 Pnt 3430 2669 Pnt 3113 3743 Pnt 3284 3743 Pnt 3249 3746 Pnt 2831 3784 Pnt 2394 3746 Pnt 3307 3758 Pnt 2702 3814 Pnt 2553 3780 Pnt 3992 3746 Pnt 2720 3744 Pnt 3948 3746 Pnt 3235 3756 Pnt 2900 3774 Pnt 2044 3744 Pnt 3948 3771 Pnt 2924 3760 Pnt 2613 3782 Pnt 2711 3771 Pnt 2916 3754 Pnt 3396 3771 Pnt 3139 3781 Pnt 2132 3872 Pnt 3124 3743 Pnt 2725 3774 Pnt 3803 3771 Pnt 2788 3801 Pnt 1983 3801 Pnt 2484 3771 Pnt 3743 3029 Pnt 3397 3801 Pnt 3146 3771 Pnt 2426 3739 Pnt 2683 3770 Pnt 3295 3742 Pnt 3213 3766 Pnt 2190 3835 Pnt 2699 3745 Pnt 2540 3748 Pnt 2628 3768 Pnt 3039 3768 Pnt 3263 3744 Pnt 3050 3781 Pnt 4130 3750 Pnt 2481 3790 Pnt 2551 3742 Pnt 2994 3754 Pnt 2108 3806 Pnt 2917 3746 Pnt 2861 3806 Pnt 2784 3747 Pnt 3944 3770 Pnt 3559 3760 Pnt 2820 3750 Pnt 2594 3762 Pnt 2212 3781 Pnt 3235 3738 Pnt 2875 3745 Pnt 4207 3748 Pnt 3111 2450 Pnt 3305 3746 Pnt 2064 3772 Pnt 3083 3775 Pnt 2481 3752 Pnt 3232 3745 Pnt 2258 3766 Pnt 3884 3748 Pnt 3245 3758 Pnt 2350 3741 Pnt 2994 3771 Pnt 2542 3754 Pnt 2920 3752 Pnt 2609 3808 Pnt 3387 3762 Pnt 4052 3751 Pnt 2090 3775 Pnt 2238 3797 Pnt 3341 3754 Pnt 2746 3742 Pnt 3579 3749 Pnt 2726 3756 Pnt 3181 2844 Pnt 3456 3753 Pnt 2568 3756 Pnt 3924 3740 Pnt 2883 3741 Pnt 2603 3768 Pnt 3323 3762 Pnt 3183 3744 Pnt 2428 3809 Pnt 2404 3768 Pnt 2706 3751 Pnt 2382 3749 Pnt 2414 3829 Pnt 2571 3765 Pnt 2966 3815 Pnt 3854 3747 Pnt 2831 3763 Pnt 3355 3750 Pnt 2611 3743 Pnt 2613 3741 Pnt 2908 3751 Pnt 3761 3743 Pnt 3761 3745 Pnt 3473 3773 Pnt 3684 3770 Pnt 2992 3795 Pnt 2577 3746 Pnt 2735 3747 Pnt 2720 3758 Pnt 2745 3747 Pnt 2556 3749 Pnt 2523 3740 Pnt 2369 3865 Pnt 4163 3758 Pnt 2412 3780 Pnt 2597 3787 Pnt 2901 3747 Pnt 2749 3827 Pnt 1880 3766 Pnt 2890 3780 Pnt 2790 3744 Pnt 2800 3743 Pnt 2247 3821 Pnt 3566 3738 Pnt 2892 3752 Pnt 2993 3770 Pnt 2655 3740 Pnt 2876 3749 Pnt 2752 3752 Pnt 2833 3815 Pnt 3218 3747 Pnt 3119 3752 Pnt 2808 3830 Pnt 2071 3935 Pnt 2649 3944 Pnt 3295 3740 Pnt 2746 3751 Pnt 2824 3794 Pnt 2630 3788 Pnt 3046 3794 Pnt 3486 3794 Pnt 3052 3748 Pnt 2544 3833 Pnt 2475 3741 Pnt 2117 3772 Pnt 2350 3797 Pnt 2829 3858 Pnt 3190 3741 Pnt 2612 3780 Pnt 3450 2283 Pnt 3503 3737 Pnt 2583 3778 Pnt 3227 3743 Pnt 2880 3744 Pnt 2660 3757 Pnt 2322 3794 Pnt 4075 3753 Pnt 2292 3835 Pnt 3024 3792 Pnt 3512 3753 Pnt 3343 3763 Pnt 2448 3774 Pnt 2468 3786 Pnt 2587 3785 Pnt 2232 3764 Pnt 2964 3756 Pnt 2777 3809 Pnt 2171 3802 Pnt 3663 3807 Pnt 2475 3775 Pnt 3010 3762 Pnt 2886 3758 Pnt 2646 3763 Pnt 2445 3814 Pnt 2739 3747 Pnt 2400 3804 Pnt 2888 3752 Pnt 2498 3866 Pnt 3960 3775 Pnt 2811 3753 Pnt 3869 3752 Pnt 2387 3805 Pnt 3947 3745 Pnt 2786 3746 Pnt 3341 3791 Pnt 3988 3738 Pnt 3766 3745 Pnt 3373 3796 Pnt 2492 3748 Pnt 3176 2762 Pnt 2557 3803 Pnt 3609 3755 Pnt 2230 3867 Pnt 3754 3822 Pnt 2204 3755 Pnt 3082 3751 Pnt 3662 3743 Pnt 2838 3807 Pnt 2845 3745 Pnt 1870 3743 Pnt 3013 3802 Pnt 2286 3798 Pnt 4034 2856 Pnt 2529 3866 Pnt 3245 3765 Pnt 2554 3791 Pnt 2741 3758 Pnt 2137 3766 Pnt 2690 3825 Pnt 3994 2855 Pnt 3694 3741 Pnt 2988 3757 Pnt 3363 3762 Pnt 2157 3834 Pnt 2946 3785 Pnt 4095 3791 Pnt 3127 3743 Pnt 3472 3757 Pnt 3018 3749 Pnt 3994 2868 Pnt 3967 2811 Pnt 2858 3753 Pnt 2120 3852 Pnt 2121 3796 Pnt 2535 3754 Pnt 2627 3753 Pnt 3484 3749 Pnt 2179 3771 Pnt 2149 3781 Pnt 2738 3756 Pnt 2068 3804 Pnt 3786 2952 Pnt 2512 3815 Pnt 2994 3751 Pnt 2661 3819 Pnt 2704 3899 Pnt 3120 3748 Pnt 3532 3737 Pnt 2747 3745 Pnt 2992 3774 Pnt 2820 3780 Pnt 2371 3745 Pnt 2914 3795 Pnt 3617 3812 Pnt 2372 3776 Pnt 2623 3749 Pnt 3511 3807 Pnt 2665 3744 Pnt 3787 3749 Pnt 3070 3780 Pnt 3584 3744 Pnt 3245 3781 Pnt 2654 3744 Pnt 3080 3766 Pnt 2268 3761 Pnt 3020 3758 Pnt 2854 3768 Pnt 2660 3781 Pnt 2013 3852 Pnt 2976 3758 Pnt 2549 3800 Pnt 3110 3758 Pnt 2610 3754 Pnt 1943 3794 Pnt 3275 3732 Pnt 2262 3810 Pnt 2195 3822 Pnt 3252 3794 Pnt 2278 3763 Pnt 2255 3824 Pnt 3336 3754 Pnt 3171 3751 Pnt 2106 3797 Pnt 3416 3751 Pnt 2642 3754 Pnt 2438 3740 Pnt 3284 3769 Pnt 3527 3753 Pnt 2917 3758 Pnt 2849 3752 Pnt 3148 3761 Pnt 2387 3796 Pnt 2868 3762 Pnt 3385 3745 Pnt 2605 3752 Pnt 2092 3797 Pnt 3266 3744 Pnt 3871 3745 Pnt 2445 3765 Pnt 2866 3763 Pnt 3567 3752 Pnt 2582 3761 Pnt 2904 3803 Pnt 2616 3820 Pnt 2637 3740 Pnt 3745 3744 Pnt 2899 3768 Pnt 2632 3776 Pnt 2528 3808 Pnt 3212 2783 Pnt 3560 3776 Pnt 2883 3753 Pnt 3092 3760 Pnt 2574 3754 Pnt 2946 3747 Pnt 2771 3753 Pnt 3039 3824 Pnt 1985 3779 Pnt 3088 3754 Pnt 2929 3794 Pnt 2240 3762 Pnt 3104 3752 Pnt 2362 3824 Pnt 3041 3778 Pnt 3310 3759 Pnt 2462 3786 Pnt 2813 3778 Pnt 2553 3838 Pnt 2368 3767 Pnt 2909 3786 Pnt 2736 3742 Pnt 2763 3763 Pnt 1775 3759 Pnt 2465 3810 Pnt 2520 3813 Pnt 2104 3755 Pnt 2211 3792 Pnt 3571 3757 Pnt 2813 3811 Pnt 3004 3809 Pnt 2998 3813 Pnt 2508 3774 Pnt 2261 3774 Pnt 3011 3734 Pnt 3541 3767 Pnt 2806 3773 Pnt 2753 3766 Pnt 2032 3819 Pnt 2478 3781 Pnt 2499 3782 Pnt 2527 3749 Pnt 3309 3739 Pnt 2638 3787 Pnt 3864 3751 Pnt 3272 3765 Pnt 2776 3784 Pnt 2981 3762 Pnt 3794 3822 Pnt 1968 3764 Pnt 2805 3794 Pnt 2254 3760 Pnt 2947 3747 Pnt 3257 3776 Pnt 3030 3755 Pnt 2036 3781 Pnt 2587 3750 Pnt 2991 3776 Pnt 2858 3752 Pnt 2678 3754 Pnt 2503 3743 Pnt 2640 3748 Pnt 3899 3750 Pnt 2749 3739 Pnt 2572 3868 Pnt 2894 3749 Pnt 2106 3745 Pnt 2604 3831 Pnt 2693 3760 Pnt 3418 3830 Pnt 2509 3760 Pnt 3801 3751 Pnt 2254 3811 Pnt 2297 3758 Pnt 2531 3767 Pnt 4106 3750 Pnt 2409 3811 Pnt 2920 3762 Pnt 2510 3738 Pnt 2376 3827 Pnt 2573 3827 Pnt 2799 3755 Pnt 2251 3803 Pnt 2309 3810 Pnt 4007 3751 Pnt 2352 3812 Pnt 3647 3789 Pnt 3376 3759 Pnt 2455 3777 Pnt 2968 3756 Pnt 3024 3810 Pnt 2563 3799 Pnt 3438 3744 Pnt 2796 3742 Pnt 3717 3809 Pnt 2814 3747 Pnt 2713 3797 Pnt 2364 3819 Pnt 3354 3750 Pnt 2891 3812 Pnt 2873 3742 Pnt 2106 3850 Pnt 2497 3746 Pnt 4001 3749 Pnt 2578 3752 Pnt 2494 3902 Pnt 2691 3759 Pnt 3856 3750 Pnt 3209 3803 Pnt 2952 3757 Pnt 2668 3765 Pnt 2462 3757 Pnt 2362 3804 Pnt 2601 3782 Pnt 3199 3743 Pnt 2720 3750 Pnt 3068 3782 Pnt 2735 3762 Pnt 3846 3747 Pnt 2375 3756 Pnt 2856 3789 Pnt 2564 3817 Pnt 2580 3820 Pnt 2914 3762 Pnt 2911 3752 Pnt 2291 3820 Pnt 2862 3757 Pnt 3181 3766 Pnt 2630 3750 Pnt 3759 3748 Pnt 3474 3751 Pnt 3061 3752 Pnt 2797 3775 Pnt 3201 3758 Pnt 2341 3772 Pnt 3314 3761 Pnt 2781 3753 Pnt 3754 3761 Pnt 1997 3810 Pnt 3010 3814 Pnt 2747 3762 Pnt 3395 3755 Pnt 2786 3814 Pnt 2257 3759 Pnt 2705 3748 Pnt 2581 3802 Pnt 2425 3774 Pnt 4073 3010 Pnt 3457 3774 Pnt 2443 3751 Pnt 3310 3757 Pnt 3443 3746 Pnt 2942 3756 Pnt 2862 3746 Pnt 2748 3796 Pnt 2524 3802 Pnt 2482 3752 Pnt 3591 3746 Pnt 2148 3796 Pnt 3307 3763 Pnt 3488 3759 Pnt 4057 2478 Pnt 3135 3761 Pnt 3082 3759 Pnt 3173 3744 Pnt 2479 3738 Pnt 2486 3761 Pnt 2926 3849 Pnt 2225 3763 Pnt 2482 2460 Pnt 2603 3743 Pnt 3708 3743 Pnt 2104 3781 Pnt 2636 3738 Pnt 2454 3798 Pnt 2443 3839 Pnt 3615 3839 Pnt 2236 3805 Pnt 3246 3757 Pnt 3059 3743 Pnt 2150 3828 Pnt 3082 3745 Pnt 2533 2679 Pnt 2836 3738 Pnt 2665 3757 Pnt 2912 3745 Pnt 2447 3756 Pnt 2622 3801 Pnt 3113 3758 Pnt 2987 2590 Pnt 2247 3810 Pnt 2485 3749 Pnt 2003 3842 Pnt 2381 3805 Pnt 2423 3753 Pnt 2536 3750 Pnt 3616 3750 Pnt 2200 3765 Pnt 3737 3805 Pnt 2549 3760 Pnt 2845 3767 Pnt 2324 3941 Pnt 2528 3795 Pnt 3118 3747 Pnt 3591 3767 Pnt 3766 3741 Pnt 2386 3771 Pnt 2863 3795 Pnt 2508 3771 Pnt 2741 3759 Pnt 2563 3779 Pnt 3710 2763 Pnt 2294 3750 Pnt 2872 3755 Pnt 2242 3809 Pnt 1869 3752 Pnt 3477 3742 Pnt 3588 3803 Pnt 3769 3777 Pnt 3173 3771 Pnt 2504 3764 Pnt 3475 3829 Pnt 2138 3771 Pnt 3192 3754 Pnt 2936 3774 Pnt 2936 3742 Pnt 2257 3761 Pnt 3189 3742 Pnt 2502 3765 Pnt 2096 3783 Pnt 3263 3783 Pnt 3862 3749 Pnt 4134 2806 Pnt 3937 2874 Pnt 2861 3742 Pnt 4029 3745 Pnt 2563 3776 Pnt 3302 3738 Pnt 3588 3774 Pnt 3658 3747 Pnt 2672 3762 Pnt 2642 3751 Pnt 3593 3747 Pnt 1949 3786 Pnt 2841 3824 Pnt 3097 3774 Pnt 2185 3802 Pnt 2769 3767 Pnt 3008 3797 Pnt 3123 3756 Pnt 2948 3760 Pnt 2859 3741 Pnt 2831 3741 Pnt 2715 3753 Pnt 2780 3810 Pnt 3017 3784 Pnt 2815 3744 Pnt 2875 3756 Pnt 2737 3752 Pnt 2807 3764 Pnt 3146 3746 Pnt 2285 3749 Pnt 2746 3743 Pnt 2267 3796 Pnt 4281 3766 Pnt 2522 3762 Pnt 2352 3746 Pnt 2632 3746 Pnt 2310 3787 Pnt 3515 3754 Pnt 1997 3843 Pnt 2672 3754 Pnt 2107 3753 Pnt 2264 3764 Pnt 3265 3754 Pnt 2500 3749 Pnt 2818 3756 Pnt 2913 3743 Pnt 2247 3753 Pnt 2735 3767 Pnt 3797 2894 Pnt 3371 3782 Pnt 2863 3760 Pnt 2748 3784 Pnt 2445 3779 Pnt 2740 3765 Pnt 3177 3760 Pnt 3598 3771 Pnt 2919 3761 Pnt 2484 3796 Pnt 2675 3762 Pnt 2966 3786 Pnt 2367 3818 Pnt 2545 3776 Pnt 2489 3746 Pnt 2049 3766 Pnt 2553 3752 Pnt 3871 3819 Pnt 2675 3806 Pnt 2933 3762 Pnt 2850 3764 Pnt 2335 3742 Pnt 2498 3807 Pnt 3021 3748 Pnt 2420 3794 Pnt 2659 3763 Pnt 2174 3748 Pnt 2645 3753 Pnt 3836 3748 Pnt 2516 3794 Pnt 3298 3756 Pnt 2675 3796 Pnt 2591 3812 Pnt 3253 3753 Pnt 3115 3763 Pnt 2374 3804 Pnt 2717 3757 Pnt 2583 3787 Pnt 3313 3746 Pnt 3430 3807 Pnt 2480 3759 Pnt 2233 3754 Pnt 2111 3746 Pnt 2107 3803 Pnt 3029 3783 Pnt 2650 3791 Pnt 3419 3745 Pnt 3663 3770 Pnt 2337 3761 Pnt 4750 3803 Pnt 2394 3749 Pnt 2683 3842 Pnt 2175 3739 Pnt 2341 3820 Pnt 2483 3752 Pnt 3656 3739 Pnt 2599 3741 Pnt 2730 3827 Pnt 3797 3742 Pnt 2637 3753 Pnt 2420 3781 Pnt 2746 3769 Pnt 2819 3826 Pnt 2722 3753 Pnt 2433 3826 Pnt 3566 3827 Pnt 3933 3748 Pnt 2766 3779 Pnt 2930 3752 Pnt 2593 3804 Pnt 3143 3771 Pnt 3292 3822 Pnt 2365 3823 Pnt 2760 3745 Pnt 2353 3771 Pnt 2946 3769 Pnt 2779 3804 Pnt 3243 3802 Pnt 2613 3857 Pnt 2252 3847 Pnt 4194 3756 Pnt 2246 3747 Pnt 2235 3849 Pnt 2858 3759 Pnt 2629 3923 Pnt 2854 3923 Pnt 3214 3736 Pnt 3069 3801 Pnt 2058 3798 Pnt 4006 3752 Pnt 3048 3772 Pnt 2232 3755 Pnt 2972 3774 Pnt 3395 3806 Pnt 3037 3788 Pnt 2876 3837 Pnt 2740 3794 Pnt 2333 3827 Pnt 2459 3758 Pnt 3836 3746 Pnt 2900 3758 Pnt 3201 3784 Pnt 3055 3768 Pnt 2319 3844 Pnt 2121 3810 Pnt 2692 3785 Pnt 4112 3771 Pnt 2633 3756 Pnt 3260 3763 Pnt 3014 3758 Pnt 2585 3743 Pnt 3399 3759 Pnt 2079 3820 Pnt 2095 3796 Pnt 2726 3757 Pnt 2577 3796 Pnt 2387 3756 Pnt 4100 3759 Pnt 3852 3750 Pnt 2743 3827 Pnt 2558 3758 Pnt 2542 3752 Pnt 3183 3768 Pnt 2220 3804 Pnt 2974 3753 Pnt 3952 3788 Pnt 2664 3753 Pnt 2233 3817 Pnt 4092 3763 Pnt 2424 3804 Pnt 2807 3791 Pnt 3172 3777 Pnt 2727 3749 Pnt 2541 3797 Pnt 2585 3749 Pnt 2510 3802 Pnt 2865 3785 Pnt 3082 3744 Pnt 2249 3755 Pnt 3534 3773 Pnt 3631 3755 Pnt 2278 3752 Pnt 3709 3817 Pnt 2970 3766 Pnt 2648 3741 Pnt 2621 3743 Pnt 2880 3746 Pnt 2022 3767 Pnt 2918 3741 Pnt 2340 3795 Pnt 3320 2738 Pnt 2397 3745 Pnt 2942 3745 Pnt 2715 3744 Pnt 2769 3751 Pnt 2209 3782 Pnt 2640 3812 Pnt 2376 3784 Pnt 3221 3739 Pnt 2583 3758 Pnt 2305 3762 Pnt 2762 3753 Pnt 2771 3776 Pnt 4063 3777 Pnt 2642 3772 Pnt 2636 3760 Pnt 3451 3762 Pnt 2772 3745 Pnt 2525 3817 Pnt 1985 3784 Pnt 2793 3806 Pnt 2722 3744 Pnt 2569 3741 Pnt 3626 3744 Pnt 2466 3755 Pnt 3394 2740 Pnt 3209 3755 Pnt 3015 3782 Pnt 2520 3761 Pnt 2580 3755 Pnt 2232 3779 Pnt 1986 3775 Pnt 2877 3822 Pnt 2504 3857 Pnt 2609 3743 Pnt 2410 3747 Pnt 1996 3807 Pnt 2468 3792 Pnt 2097 3770 Pnt 2000 3796 Pnt 3377 3745 Pnt 2852 3747 Pnt 2423 3752 Pnt 2696 3749 Pnt 2313 3795 Pnt 4027 3796 Pnt 2648 3754 Pnt 3420 3741 Pnt 2551 3752 Pnt 3147 3753 Pnt 2596 3750 Pnt 3132 3737 Pnt 2453 3754 Pnt 3095 3834 Pnt 2916 3765 Pnt 2076 3784 Pnt 3504 3754 Pnt 2610 3750 Pnt 2296 3800 Pnt 3259 3830 Pnt 2511 3788 Pnt 2577 3741 Pnt 2166 3742 Pnt 3108 3804 Pnt 2762 3762 Pnt 2465 3745 Pnt 2610 3759 Pnt 2998 3744 Pnt 2525 3749 Pnt 2062 3796 Pnt 2656 3750 Pnt 3264 3744 Pnt 2570 3766 Pnt 2477 3774 Pnt 2373 3747 Pnt 3350 3774 Pnt 2902 3742 Pnt 2738 3743 Pnt 2130 3751 Pnt 2593 3743 Pnt 2533 3928 Pnt 2551 3812 Pnt 2872 3743 Pnt 2622 3795 Pnt 2724 3735 Pnt 3760 3742 Pnt 3736 3750 Pnt 2599 3740 Pnt 4124 3761 Pnt 2057 3818 Pnt 2458 3742 Pnt 3149 3748 Pnt 2968 3821 Pnt 2750 3752 Pnt 2577 3801 Pnt 2767 3772 Pnt 3322 3742 Pnt 2647 3753 Pnt 2415 3769 Pnt 1951 3800 Pnt 2441 3779 Pnt 2089 3914 Pnt 2832 3816 Pnt 2429 3807 Pnt 2856 3761 Pnt 2134 3777 Pnt 2896 3799 Pnt 2668 3834 Pnt 3581 3736 Pnt 2479 3802 Pnt 3760 3811 Pnt 2861 3776 Pnt 3028 3763 Pnt 2733 3750 Pnt 2846 3763 Pnt 2506 3770 Pnt 3487 3750 Pnt 2989 3774 Pnt 2381 3807 Pnt 2742 3771 Pnt 3427 3786 Pnt 2186 3799 Pnt 3089 3811 Pnt 3629 2602 Pnt 2616 3785 Pnt 2584 3755 Pnt 2415 3777 Pnt 3130 3750 Pnt 3475 3762 Pnt 2388 3772 Pnt 3807 3766 Pnt 2884 3770 Pnt 2338 3789 Pnt 3895 3785 Pnt 2625 3765 Pnt 2050 3764 Pnt 2967 3769 Pnt 3413 3795 Pnt 2459 3778 Pnt 2959 3759 Pnt 1991 3807 Pnt 2372 3769 Pnt 2277 3774 Pnt 2764 3752 Pnt 2478 3778 Pnt 2064 3839 Pnt 2800 3749 Pnt 2767 3773 Pnt 3177 3761 Pnt 3672 3778 Pnt 2832 3754 Pnt 3045 2910 Pnt 2387 3772 Pnt 3026 3754 Pnt 2669 3795 Pnt 2356 3806 Pnt 2983 3752 Pnt 2416 3822 Pnt 3570 3767 Pnt 2352 3809 Pnt 2744 3736 Pnt 1862 3804 Pnt 3486 3746 Pnt 3422 3752 Pnt 2780 3805 Pnt 3480 2800 Pnt 3200 3763 Pnt 2507 3779 Pnt 2825 3844 Pnt 2146 3760 Pnt 2571 3755 Pnt 1922 3808 Pnt 2670 3749 Pnt 2564 3812 Pnt 3911 3761 Pnt 2432 3783 Pnt 3826 3757 Pnt 2412 3805 Pnt 2588 3758 Pnt 2404 3797 Pnt 2824 3744 Pnt 3893 3783 Pnt 2939 3749 Pnt 2450 3814 Pnt 2000 3795 Pnt 3986 3749 Pnt 2371 3815 Pnt 2400 3747 Pnt 2163 3767 Pnt 3406 3795 Pnt 2514 3833 Pnt 2246 3805 Pnt 2670 3774 Pnt 2803 3831 Pnt 2440 3805 Pnt 2415 3817 Pnt 2793 3799 Pnt 2571 3843 Pnt 2663 3743 Pnt 2417 3744 Pnt 1897 3813 Pnt 3754 3799 Pnt 4269 3773 Pnt 2650 3754 Pnt 2206 3758 Pnt 3489 3742 Pnt 3045 3759 Pnt 2814 3753 Pnt 2518 2535 Pnt 3744 3780 Pnt 2618 3754 Pnt 3383 3790 Pnt 2876 3766 Pnt 3069 3760 Pnt 2850 3766 Pnt 2555 3748 Pnt 2472 3806 Pnt 2770 3757 Pnt 3681 3798 Pnt 3023 3757 Pnt 2675 3763 Pnt 2573 3756 Pnt 2866 3750 Pnt 2652 3756 Pnt 2487 3767 Pnt 2805 3751 Pnt 2218 3755 Pnt 3834 3759 Pnt 2934 3772 Pnt 2589 3785 Pnt 2431 3744 Pnt 3014 3771 Pnt 2566 3750 Pnt 2811 3746 Pnt 2815 3747 Pnt 2197 3843 Pnt 3980 3750 Pnt 2706 3767 Pnt 2193 3856 Pnt 3621 3754 Pnt 2406 3739 Pnt 2275 3912 Pnt 2484 3778 Pnt 1898 3799 Pnt 3902 3754 Pnt 2852 3750 Pnt 2666 3809 Pnt 3107 3750 Pnt 2291 3770 Pnt 2676 3780 Pnt 2480 3746 Pnt 3499 3746 Pnt 3903 3751 Pnt 2895 3829 Pnt 3101 3750 Pnt 2634 3751 Pnt 4132 3747 Pnt 2517 3746 Pnt 3865 3751 Pnt 3770 3750 Pnt 2855 3829 Pnt 2188 3756 Pnt 2746 3769 Pnt 3342 3748 Pnt 3402 3750 Pnt 2094 3782 Pnt 2961 3808 Pnt 3547 3760 Pnt 2442 3745 Pnt 2477 3744 Pnt 2214 3792 Pnt 2351 3798 Pnt 3423 3754 Pnt 3667 2872 Pnt 2204 3784 Pnt 2985 3776 Pnt 3239 3788 Pnt 3732 3750 Pnt 1992 3775 Pnt 3091 3770 Pnt 2348 3826 Pnt 2607 3742 Pnt 3761 3744 Pnt 2442 3746 Pnt 2875 3739 Pnt 3480 3763 Pnt 3353 3753 Pnt 3481 3749 Pnt 2804 3799 Pnt 3140 3745 Pnt 2790 3767 Pnt 3807 3753 Pnt 2768 3749 Pnt 2188 3788 Pnt 3031 3745 Pnt 2826 3767 Pnt 2561 3789 Pnt 2542 3814 Pnt 2125 3788 Pnt 2624 3756 Pnt 1922 3812 Pnt 3357 3814 Pnt 2520 3781 Pnt 3010 3746 Pnt 3562 3749 Pnt 4065 3755 Pnt 2500 3797 Pnt 3496 3762 Pnt 2768 3758 Pnt 2886 3753 Pnt 3659 3845 Pnt 2671 3768 Pnt 3153 3755 Pnt 2670 3808 Pnt 2459 3764 Pnt 3790 3752 Pnt 2734 3757 Pnt 2364 3768 Pnt 3166 3753 Pnt 2856 3756 Pnt 3461 3750 Pnt 3156 3753 Pnt 2237 3808 Pnt 3061 3772 Pnt 2954 3804 Pnt 2969 3741 Pnt 3255 3770 Pnt 3170 3748 Pnt 2852 3804 Pnt 2565 3795 Pnt 3482 3774 Pnt 2054 3854 Pnt 2159 3775 Pnt 3192 3777 Pnt 2386 3786 Pnt 2365 3796 Pnt 2329 3802 Pnt 2498 3766 Pnt 2865 3777 Pnt 1983 3838 Pnt 2150 3791 Pnt 2565 3754 Pnt 2219 3800 Pnt 3423 3826 Pnt 2841 3761 Pnt 2782 3788 Pnt 1923 3773 Pnt 2993 3767 Pnt 2447 3800 Pnt 2491 3761 Pnt 2748 3762 Pnt 3777 3743 Pnt 2224 3767 Pnt 3064 3904 Pnt 2073 3846 Pnt 3072 3746 Pnt 2633 3798 Pnt 2782 3759 Pnt 2105 3784 Pnt 2726 3800 Pnt 2480 3784 Pnt 2759 3745 Pnt 2128 3856 Pnt 2980 3784 Pnt 2869 3856 Pnt 2912 3748 Pnt 3262 3751 Pnt 2828 3902 Pnt 2717 3769 Pnt 2459 3773 Pnt 2586 3761 Pnt 2160 3738 Pnt 2879 3757 Pnt 3265 3761 Pnt 2708 3813 Pnt 2550 3752 Pnt 2745 3783 Pnt 3130 3783 Pnt 2760 3743 Pnt 3675 3746 Pnt 2391 3855 Pnt 3957 3754 Pnt 2375 3807 Pnt 3516 3751 Pnt 2038 3836 Pnt 2067 3760 Pnt 2490 2717 Pnt 2719 3737 Pnt 2585 3799 Pnt 2735 3811 Pnt 3196 3748 Pnt 3071 3799 Pnt 2020 3817 Pnt 2655 3732 Pnt 3161 3734 Pnt 2472 3749 Pnt 2767 3750 Pnt 2020 3793 Pnt 2677 3753 Pnt 2028 3838 Pnt 2632 3765 Pnt 2607 3780 Pnt 2713 3742 Pnt 1808 3838 Pnt 3100 3819 Pnt 2791 3762 Pnt 2743 3765 Pnt 2366 3744 Pnt 3126 3746 Pnt 2421 3776 Pnt 2577 3832 Pnt 2451 3832 Pnt 3088 3765 Pnt 3205 3776 Pnt 2807 3764 Pnt 2542 3793 Pnt 4046 3776 Pnt 3159 3747 Pnt 3071 3743 Pnt 2853 3842 Pnt 2548 3743 Pnt 2877 3789 Pnt 3403 3842 Pnt 3315 3765 Pnt 3049 3747 Pnt 3086 3759 Pnt 3580 3756 Pnt 2237 3749 Pnt 2815 3776 Pnt 2747 3748 Pnt 3056 3751 Pnt 2604 3783 Pnt 3094 3761 Pnt 2884 3746 Pnt 2888 3826 Pnt 2038 3812 Pnt 2870 3763 Pnt 2391 3801 Pnt 3522 3748 Pnt 1994 3762 Pnt 2729 3793 Pnt 2882 3770 Pnt 4026 3765 Pnt 3912 3746 Pnt 3572 3737 Pnt 3018 3770 Pnt 2454 3780 Pnt 4152 2730 Pnt 3430 3770 Pnt 2824 3765 Pnt 2626 3789 Pnt 2502 3779 Pnt 2429 3748 Pnt 2264 3769 Pnt 3606 3789 Pnt 2839 3771 Pnt 2512 3750 Pnt 2264 3871 Pnt 3671 3767 Pnt 2544 3818 Pnt 3020 3751 Pnt 2454 3833 Pnt 2802 3763 Pnt 3315 3765 Pnt 2407 3876 Pnt 2534 3808 Pnt 2929 3744 Pnt 2848 3804 Pnt 2559 3752 Pnt 2675 3743 Pnt 3165 3804 Pnt 2208 3798 Pnt 2895 3750 Pnt 3255 3758 Pnt 2623 3743 Pnt 3795 3771 Pnt 2945 3768 Pnt 2336 3773 Pnt 3296 3771 Pnt 2299 3741 Pnt 3064 3744 Pnt 2973 3762 Pnt 2062 3758 Pnt 3465 3759 Pnt 3123 3753 Pnt 2426 3793 Pnt 3670 3751 Pnt 2569 3771 Pnt 2389 3739 Pnt 3373 3762 Pnt 3026 3744 Pnt 2550 3756 Pnt 2709 3805 Pnt 2798 3746 Pnt 2622 3826 Pnt 3108 3744 Pnt 2511 3780 Pnt 3519 3735 Pnt 3652 3744 Pnt 3970 3779 Pnt 3035 3737 Pnt 3075 3892 Pnt 3101 3765 Pnt 2574 3740 Pnt 2597 3773 Pnt 2723 3788 Pnt 2525 3753 Pnt 2341 3788 Pnt 2922 3752 Pnt 2569 3750 Pnt 2750 3775 Pnt 2764 3756 Pnt 3092 3798 Pnt 2707 3754 Pnt 2325 3801 Pnt 3705 3764 Pnt 2289 3797 Pnt 2834 3746 Pnt 2556 3931 Pnt 2087 3807 Pnt 2891 3764 Pnt 2476 3751 Pnt 2148 3840 Pnt 2639 3807 Pnt 2486 3758 Pnt 3011 3759 Pnt 3195 3755 Pnt 2358 3747 Pnt 2939 3775 Pnt 4199 3757 Pnt 2754 3754 Pnt 2595 3758 Pnt 2176 3803 Pnt 3044 3751 Pnt 2630 3800 Pnt 2781 3743 Pnt 3745 3800 Pnt 2536 3749 Pnt 2645 3817 Pnt 3530 3749 Pnt 2421 3879 Pnt 2305 3807 Pnt 3742 3755 Pnt 3253 3765 Pnt 2712 3755 Pnt 3574 3757 Pnt 3271 3749 Pnt 2444 3767 Pnt 3034 3747 Pnt 3334 3760 Pnt 2402 3743 Pnt 2789 3746 Pnt 2796 3748 Pnt 2874 3752 Pnt 2513 3786 Pnt 2016 3833 Pnt 2798 3763 Pnt 2282 3829 Pnt 2635 3761 Pnt 3877 2907 Pnt 2223 3771 Pnt 2953 3750 Pnt 3530 3746 Pnt 2831 3768 Pnt 3686 3757 Pnt 2443 3801 Pnt 2895 3746 Pnt 2247 3840 Pnt 2497 3766 Pnt 2428 3790 Pnt 2929 3752 Pnt 1858 3778 Pnt 2717 3748 Pnt 2865 3751 Pnt 2587 3781 Pnt 1965 3739 Pnt 2254 3775 Pnt 2308 3774 Pnt 2825 3743 Pnt 3041 3754 Pnt 2850 3745 Pnt 2670 3771 Pnt 4321 3763 Pnt 2723 3795 Pnt 2491 3747 Pnt 2273 3808 Pnt 3900 3746 Pnt 2925 3751 Pnt 3651 3771 Pnt 3454 3740 Pnt 2360 3742 Pnt 3016 3771 Pnt 2671 3755 Pnt 2568 3774 Pnt 3491 3763 Pnt 3126 3832 Pnt 2068 3797 Pnt 2623 3763 Pnt 3181 3765 Pnt 2701 3756 Pnt 3282 3773 Pnt 2331 3790 Pnt 2750 3747 Pnt 2772 3794 Pnt 2925 3767 Pnt 2648 3778 Pnt 2882 3756 Pnt 2567 3764 Pnt 1895 3795 Pnt 3228 3750 Pnt 2771 3747 Pnt 2516 3768 Pnt 2223 3781 Pnt 3654 3785 Pnt 1858 3797 Pnt 2733 3809 Pnt 3867 3794 Pnt 2526 3744 Pnt 4093 3771 Pnt 3165 3746 Pnt 2996 3768 Pnt 3040 3751 Pnt 2924 3746 Pnt 2619 3751 Pnt 3144 3770 Pnt 4107 3743 Pnt 2753 3749 Pnt 3084 3751 Pnt 2538 3816 Pnt 2400 3751 Pnt 2971 3752 Pnt 2682 3762 Pnt 2661 3816 Pnt 2390 3829 Pnt 2773 3753 Pnt 2509 3766 Pnt 2400 3743 Pnt 2286 3815 Pnt 2188 3833 Pnt 2992 3751 Pnt 2236 3797 Pnt 2563 3827 Pnt 2195 3797 Pnt 3312 3794 Pnt 2297 3828 Pnt 2586 3792 Pnt 3090 3762 Pnt 2527 3789 Pnt 2823 3792 Pnt 2096 3780 Pnt 2678 3803 Pnt 3666 3744 Pnt 2807 3743 Pnt 1909 3826 Pnt 3800 3836 Pnt 2478 3815 Pnt 2983 3780 Pnt 3818 2742 Pnt 4136 3782 Pnt 2698 3740 Pnt 3113 2771 Pnt 2517 3775 Pnt 2905 3775 Pnt 2341 3774 Pnt 2900 3766 Pnt 2720 3810 Pnt 2454 3786 Pnt 3568 3747 Pnt 2549 3866 Pnt 3888 3810 Pnt 2780 3765 Pnt 3233 3755 Pnt 2561 3747 Pnt 3821 3747 Pnt 2592 3765 Pnt 3065 3944 Pnt 2473 3801 Pnt 2953 3791 Pnt 2274 3809 Pnt 1918 3801 Pnt 3019 3944 Pnt 2662 3821 Pnt 2152 3821 Pnt 2666 3752 Pnt 3119 3740 Pnt 3560 3745 Pnt 2832 3821 Pnt 2457 3749 Pnt 2227 3806 Pnt 3387 3756 Pnt 3658 3791 Pnt 2987 3770 Pnt 3077 3770 Pnt 2963 3794 Pnt 2670 3794 Pnt 2283 3834 Pnt 2767 3872 Pnt 2584 3746 Pnt 2376 3797 Pnt 3447 3872 Pnt 3211 3797 Pnt 2883 3754 Pnt 2578 3780 Pnt 3083 3792 Pnt 2901 3780 Pnt 2945 3760 Pnt 2159 3744 Pnt 3140 3743 Pnt 2608 3814 Pnt 3774 3745 Pnt 2216 3780 Pnt 3026 3819 Pnt 2851 3762 Pnt 2261 3807 Pnt 3407 3781 Pnt 2398 3792 Pnt 2766 3762 Pnt 2366 3806 Pnt 3094 3747 Pnt 2402 3865 Pnt 3330 3743 Pnt 2418 3804 Pnt 4019 2842 Pnt 2185 3784 Pnt 3026 3805 Pnt 2549 3767 Pnt 3959 3776 Pnt 3306 3791 Pnt 2625 3803 Pnt 3661 3754 Pnt 3308 3773 Pnt 4362 3743 Pnt 3493 3760 Pnt 2888 3755 Pnt 2838 3749 Pnt 2541 3812 Pnt 2278 3867 Pnt 4079 2764 Pnt 2693 3764 Pnt 2581 3744 Pnt 3529 3744 Pnt 3807 3746 Pnt 3255 3810 Pnt 2760 3760 Pnt 2622 3808 Pnt 3664 3810 Pnt 3721 3775 Pnt 2376 3758 Pnt 3249 3758 Pnt 2415 3766 Pnt 3020 3762 Pnt 3672 3735 Pnt 3770 3755 Pnt 3020 3753 Pnt 3362 3753 Pnt 2619 3834 Pnt 3081 3825 Pnt 2565 3824 Pnt 3039 3824 Pnt 1862 3807 Pnt 2142 3872 Pnt 2631 3794 Pnt 3506 3781 Pnt 3039 3760 Pnt 2523 3795 Pnt 3460 3810 Pnt 2800 3778 Pnt 3730 3748 Pnt 2509 3810 Pnt 3263 3744 Pnt 2473 3785 Pnt 3654 2646 Pnt 2484 3832 Pnt 3299 3785 Pnt 3561 3752 Pnt 2605 3754 Pnt 2120 3852 Pnt 3587 3740 Pnt 2267 3796 Pnt 3512 3851 Pnt 2915 2622 Pnt 2176 3743 Pnt 3105 3770 Pnt 2502 3935 Pnt 3137 3763 Pnt 2679 3769 Pnt 2633 3830 Pnt 2740 3834 Pnt 2326 3793 Pnt 2629 3756 Pnt 3966 3769 Pnt 2842 3809 Pnt 3263 3752 Pnt 2381 3773 Pnt 2906 3778 Pnt 3436 3752 Pnt 2839 3778 Pnt 2752 3747 Pnt 2252 3772 Pnt 3997 3747 Pnt 2740 3819 Pnt 2678 3820 Pnt 2540 3775 Pnt 2387 3899 Pnt 2603 3820 Pnt 2624 3803 Pnt 2943 3899 Pnt 2543 3740 Pnt 3433 3741 Pnt 3197 3754 Pnt 2532 3782 Pnt 2816 3768 Pnt 2391 3824 Pnt 2894 3745 Pnt 3114 3760 Pnt 3278 3762 Pnt 2493 3832 Pnt 2497 3776 Pnt 3776 3747 Pnt 3092 3742 Pnt 3058 2763 Pnt 3254 3742 Pnt 2931 3776 Pnt 2832 3755 Pnt 3070 3748 Pnt 2712 3902 Pnt 2564 3757 Pnt 3254 3787 Pnt 2686 3858 Pnt 3684 3757 Pnt 2520 3752 Pnt 2826 3749 Pnt 3246 3757 Pnt 3842 3787 Pnt 3171 3764 Pnt 2770 3786 Pnt 2782 3807 Pnt 3261 3734 Pnt 2480 3767 Pnt 3574 3753 Pnt 3071 3734 Pnt 3847 3759 Pnt 2488 3761 Pnt 2079 3767 Pnt 2709 3811 Pnt 2076 3783 Pnt 2593 3770 Pnt 2963 3761 Pnt 3546 3738 Pnt 2866 2769 Pnt 2536 3766 Pnt 2614 3806 Pnt 2364 3800 Pnt 2456 3770 Pnt 3179 3753 Pnt 3928 3748 Pnt 2959 3813 Pnt 2574 3787 Pnt 2839 3778 Pnt 2773 3746 Pnt 2679 3799 Pnt 3239 3765 Pnt 2664 3767 Pnt 2611 3799 Pnt 2786 3784 Pnt 3497 3754 Pnt 2462 3748 Pnt 2961 3791 Pnt 3514 3753 Pnt 2653 3814 Pnt 3039 3791 Pnt 2152 3796 Pnt 4018 3753 Pnt 2579 3772 Pnt 2350 3762 Pnt 2786 3753 Pnt 2202 3822 Pnt 3258 3749 Pnt 2858 3755 Pnt 1881 3754 Pnt 2753 3761 Pnt 2308 3784 Pnt 3542 3758 Pnt 2504 3782 Pnt 3769 2702 Pnt 2152 3794 Pnt 2575 3752 Pnt 2926 3742 Pnt 2451 3748 Pnt 2434 3794 Pnt 3403 3762 Pnt 2115 3771 Pnt 2672 3751 Pnt 2533 3750 Pnt 3434 3748 Pnt 2109 3828 Pnt 2706 3750 Pnt 2167 3781 Pnt 2520 3760 Pnt 2078 3758 Pnt 2913 3760 Pnt 2394 3757 Pnt 1923 3740 Pnt 3601 3784 Pnt 2518 3750 Pnt 2413 3782 Pnt 3882 3759 Pnt 2812 3815 Pnt 3618 3752 Pnt 2323 3760 Pnt 3052 3760 Pnt 3121 3759 Pnt 2846 3746 Pnt 2666 3751 Pnt 2514 3753 Pnt 3200 3760 Pnt 2815 3751 Pnt 2863 3762 Pnt 2654 3771 Pnt 2479 3838 Pnt 2499 3767 Pnt 2516 3810 Pnt 3429 3831 Pnt 3157 3747 Pnt 3015 3767 Pnt 3717 3810 Pnt 2294 3809 Pnt 2272 3797 Pnt 2419 3761 Pnt 2027 3773 Pnt 3254 3763 Pnt 2876 3828 Pnt 2584 3774 Pnt 3713 2713 Pnt 3742 3746 Pnt 3248 3750 Pnt 2370 3776 Pnt 2387 3803 Pnt 2998 3776 Pnt 3211 3812 Pnt 2811 3765 Pnt 2290 3812 Pnt 2915 3868 Pnt 3300 3744 Pnt 2295 3810 Pnt 1767 3809 Pnt 3937 3776 Pnt 2575 3777 Pnt 2317 3782 Pnt 2665 3809 Pnt 2991 3782 Pnt 2548 3809 Pnt 2887 3758 Pnt 2558 3747 Pnt 3643 3751 Pnt 2203 3751 Pnt 2369 3850 Pnt 2892 3756 Pnt 3112 3814 Pnt 3628 3759 Pnt 3532 3755 Pnt 3764 3756 Pnt 2731 3755 Pnt 2448 3803 Pnt 1871 3802 Pnt 3101 3803 Pnt 3017 3748 Pnt 3868 3758 Pnt 2591 3804 Pnt 3803 3762 Pnt 2956 3762 Pnt 2472 3745 Pnt 2351 3800 Pnt 2241 3802 Pnt 2644 3797 Pnt 2645 3774 Pnt 2319 3765 Pnt 3897 3741 Pnt 2680 3797 Pnt 2338 3794 Pnt 2524 3748 Pnt 2325 3820 Pnt 2744 3744 Pnt 1962 3770 Pnt 2646 3753 Pnt 2696 3763 Pnt 3024 3747 Pnt 2564 3850 Pnt 3992 3781 Pnt 2958 3750 Pnt 2781 3738 Pnt 3094 3782 Pnt 2570 3819 Pnt 3623 3781 Pnt 2541 3815 Pnt 2448 3777 Pnt 2567 3752 Pnt 3147 3766 Pnt 2896 3798 Pnt 1983 3827 Pnt 3077 3798 Pnt 2309 3805 Pnt 3080 3748 Pnt 3017 3764 Pnt 2342 3801 Pnt 3639 3756 Pnt 3725 3752 Pnt 2262 3745 Pnt 2272 3756 Pnt 2757 3775 Pnt 4159 3806 Pnt 1884 3830 Pnt 3609 3832 Pnt 2807 3777 Pnt 1999 3811 Pnt 3430 3755 Pnt 2608 3760 Pnt 2763 3762 Pnt 2523 3750 Pnt 2422 3848 Pnt 3619 3762 Pnt 3717 3760 Pnt 2217 3941 Pnt 3267 2612 Pnt 3047 3758 Pnt 2523 3758 Pnt 1920 3839 Pnt 3061 3753 Pnt 2565 3761 Pnt 3694 3762 Pnt 2395 3761 Pnt 2536 3757 Pnt 2457 3763 Pnt 2078 3781 Pnt 2514 3817 Pnt 3040 3810 Pnt 3871 3761 Pnt 2777 3757 Pnt 2826 3769 Pnt 3419 3810 Pnt 3196 3769 Pnt 3189 3743 Pnt 2745 3738 Pnt 2761 3826 Pnt 1967 3819 Pnt 3084 3743 Pnt 3107 3739 Pnt 2469 3810 Pnt 3688 3760 Pnt 2190 3811 Pnt 2375 3749 Pnt 3367 3750 Pnt 3015 3769 Pnt 4009 2725 Pnt 3725 3758 Pnt 2399 3829 Pnt 3360 3777 Pnt 3798 3756 Pnt 2790 3747 Pnt 2602 3774 Pnt 2787 3771 Pnt 2853 3807 Pnt 2927 3756 Pnt 2681 3794 Pnt 3839 3743 Pnt 2343 3825 Pnt 2597 3794 Pnt 3046 3807 Pnt 2133 3761 Pnt 1971 3786 Pnt 2629 3756 Pnt 3347 3734 Pnt 3760 3750 Pnt 1756 3786 Pnt 3330 3774 Pnt 2363 3765 Pnt 2410 3736 Pnt 2574 3755 Pnt 2272 3747 Pnt 2490 3844 Pnt 2004 3783 Pnt 2850 3811 Pnt 2627 3847 Pnt 2451 3746 Pnt 3341 3847 Pnt 2881 3752 Pnt 2387 3802 Pnt 3878 3749 Pnt 2919 3736 Pnt 2364 3755 Pnt 3190 3765 Pnt 3741 2993 Pnt 2281 3770 Pnt 3062 3802 Pnt 2031 3796 Pnt 2697 3780 Pnt 3547 3744 Pnt 3118 3758 Pnt 2499 3757 Pnt 3025 3744 Pnt 2657 3796 Pnt 2026 3742 Pnt 2647 3751 Pnt 3402 3757 Pnt 2434 3776 Pnt 2727 3752 Pnt 2541 3842 Pnt 2954 3747 Pnt 2389 3764 Pnt 2487 3820 Pnt 2620 3738 Pnt 2128 3760 Pnt 3752 3759 Pnt 4123 2970 Pnt 2241 3820 Pnt 3070 3751 Pnt 2144 3809 Pnt 2819 3762 Pnt 2679 3741 Pnt 2839 3752 Pnt 2623 3783 Pnt 3639 2895 Pnt 2715 3750 Pnt 3198 3742 Pnt 3591 3745 Pnt 2492 3771 Pnt 3073 3751 Pnt 2483 3762 Pnt 3966 2736 Pnt 2969 3827 Pnt 2154 3798 Pnt 3069 3752 Pnt 2876 3783 Pnt 2585 3773 Pnt 2467 3763 Pnt 3244 3756 Pnt 3527 3783 Pnt 2410 3794 Pnt 2398 3768 Pnt 3094 3744 Pnt 2686 3848 Pnt 2644 3742 Pnt 3239 3848 Pnt 3085 3766 Pnt 3746 3750 Pnt 4022 3750 Pnt 3039 3755 Pnt 2741 3798 Pnt 2398 3772 Pnt 2962 2751 Pnt 2654 3757 Pnt 2669 3771 Pnt 2327 3840 Pnt 3339 3754 Pnt 2156 3796 Pnt 3063 3738 Pnt 2794 3756 Pnt 4066 3738 Pnt 2194 3787 Pnt 3782 3745 Pnt 2622 3822 Pnt 2894 3755 Pnt 2582 3745 Pnt 3143 3752 Pnt 2722 3741 Pnt 2484 3801 Pnt 2713 3764 Pnt 3467 3768 Pnt 4234 3768 Pnt 3073 3751 Pnt 2714 3762 Pnt 3608 3752 Pnt 3153 3757 Pnt 2889 3753 Pnt 2289 3796 Pnt 3299 3749 Pnt 2495 3798 Pnt 3165 3753 Pnt 4185 2657 Pnt 3283 3744 Pnt 2811 3804 Pnt 2761 3752 Pnt 2806 3774 Pnt 2898 3798 Pnt 3145 3753 Pnt 2920 3760 Pnt 3113 3751 Pnt 2579 3825 Pnt 2047 3784 Pnt 3360 3804 Pnt 2722 3767 Pnt 2899 3755 Pnt 2703 3764 Pnt 2885 3743 Pnt 2588 3772 Pnt 2890 3754 Pnt 2367 3760 Pnt 2954 3769 Pnt 2867 3928 Pnt 2813 3745 Pnt 2278 3742 Pnt 3061 3774 Pnt 2600 3857 Pnt 3035 3757 Pnt 2589 3741 Pnt 3454 3786 Pnt 2536 3741 Pnt 2625 3843 Pnt 2211 3746 Pnt 2800 3838 Pnt 2825 3750 Pnt 2683 3923 Pnt 2538 3763 Pnt 2303 3806 Pnt 2147 3786 Pnt 2888 3767 Pnt 2930 3786 Pnt 4215 2874 Pnt 3083 3807 Pnt 3972 3857 Pnt 2837 3756 Pnt 3103 3763 Pnt 3406 3748 Pnt 3003 3764 Pnt 3368 3742 Pnt 2638 3754 Pnt 2507 3755 Pnt 2395 3763 Pnt 3560 2113 Pnt 2989 3748 Pnt 2649 3744 Pnt 2502 3752 Pnt 2592 3751 Pnt 3989 3746 Pnt 2846 2696 Pnt 2757 3807 Pnt 3112 3766 Pnt 2116 3804 Pnt 3128 3761 Pnt 3975 3807 Pnt 4272 3738 Pnt 2987 3745 Pnt 2821 3751 Pnt 3111 3761 Pnt 2826 3787 Pnt 3073 3741 Pnt 4004 3748 Pnt 3233 2848 Pnt 2667 3801 Pnt 3994 3745 Pnt 2971 3765 Pnt 2383 3762 Pnt 2316 3807 Pnt 2726 3747 Pnt 2942 3747 Pnt 2643 3762 Pnt 2906 3796 Pnt 2424 3781 Pnt 3300 3753 Pnt 2181 3805 Pnt 2959 3838 Pnt 2176 3782 Pnt 2270 3827 Pnt 1939 3816 Pnt 2379 3804 Pnt 2390 3758 Pnt 3207 3774 Pnt 2667 3838 Pnt 2461 3807 Pnt 3416 3801 Pnt 3483 3816 Pnt 3349 3807 Pnt 2828 3758 Pnt 3747 3740 Pnt 2863 3745 Pnt 2519 3754 Pnt 3406 3749 Pnt 2403 3752 Pnt 2267 3795 Pnt 2197 3775 Pnt 2095 3784 Pnt 2848 3764 Pnt 2491 3817 Pnt 2261 3814 Pnt 2227 3750 Pnt 3613 3746 Pnt 1990 3817 Pnt 2604 3742 Pnt 3514 3745 Pnt 2791 3762 Pnt 3215 3806 Pnt 3095 3746 Pnt 2513 3805 Pnt 2929 3745 Pnt 2548 3750 Pnt 3732 3746 Pnt 2890 3824 Pnt 2775 3750 Pnt 2929 3756 Pnt 2658 3831 Pnt 2432 3765 Pnt 2580 3791 Pnt 2728 3782 Pnt 3327 3760 Pnt 3113 3741 Pnt 2814 3825 Pnt 2096 3817 Pnt 3082 3786 Pnt 2710 3762 Pnt 2259 3834 Pnt 2475 3760 Pnt 3776 3770 Pnt 2423 3787 Pnt 2581 3741 Pnt 2631 3750 Pnt 2180 3784 Pnt 3697 3768 Pnt 1986 3750 Pnt 2311 3762 Pnt 2388 3756 Pnt 2210 3762 Pnt 3647 3750 Pnt 2684 3747 Pnt 2616 3778 Pnt 2169 3788 Pnt 3669 3746 Pnt 2858 3742 Pnt 2800 3834 Pnt 3687 3778 Pnt 2514 3804 Pnt 3884 3766 Pnt 2497 3743 Pnt 3158 3751 Pnt 2303 3802 Pnt 2900 3747 Pnt 2814 3809 Pnt 3053 3750 Pnt 2795 3767 Pnt 2645 3773 Pnt 2075 3803 Pnt 2497 3784 Pnt 3366 3773 Pnt 2320 3761 Pnt 3645 3758 Pnt 2810 3735 Pnt 3323 3800 Pnt 2573 3806 Pnt 3535 3798 Pnt 3093 3782 Pnt 2411 3748 Pnt 2418 3791 Pnt 2273 3772 Pnt 2623 3791 Pnt 2680 3749 Pnt 2845 3811 Pnt 3265 3748 Pnt 1816 3818 Pnt 3115 3819 Pnt 2932 3801 Pnt 2504 3800 Pnt 2460 3769 Pnt 1857 3812 Pnt 3281 3749 Pnt 2739 3772 Pnt 3338 3769 Pnt 2408 3742 Pnt 3252 3772 Pnt 2726 3756 Pnt 2652 3774 Pnt 3235 3783 Pnt 3488 3781 Pnt 3081 3774 Pnt 3177 3783 Pnt 2779 3777 Pnt 2203 3805 Pnt 3398 3753 Pnt 2769 3778 Pnt 4294 3761 Pnt 4496 3774 Pnt 2260 3772 Pnt 2386 3779 Pnt 3114 3753 Pnt 2460 3771 Pnt 2050 3807 Pnt 2072 3782 Pnt 3094 3786 Pnt 2410 3805 Pnt 3326 3754 Pnt 2416 3797 Pnt 2832 3769 Pnt 2027 3807 Pnt 2361 3799 Pnt 1936 3777 Pnt 2542 3785 Pnt 2708 3776 Pnt 2183 3831 Pnt 2671 3745 Pnt 2136 3817 Pnt 3520 3785 Pnt 3972 3776 Pnt 2664 3789 Pnt 2009 3807 Pnt 2635 3776 Pnt 3675 3744 Pnt 3336 3771 Pnt 3002 3745 Pnt 2058 3778 Pnt 2954 3797 Pnt 2346 3802 Pnt 3434 3774 Pnt 2705 3809 Pnt 2257 3795 Pnt 2236 3755 Pnt 3514 3749 Pnt 2569 3814 Pnt 3487 3786 Pnt 2675 3808 Pnt 2939 3737 Pnt 2636 3743 Pnt 2001 3813 Pnt 2165 3804 Pnt 2850 3752 Pnt 2295 3774 Pnt 3353 3815 Pnt 3027 3755 Pnt 2001 3839 Pnt 2597 3817 Pnt 2368 3762 Pnt 4020 3747 Pnt 2495 3845 Pnt 2482 3766 Pnt 2650 3749 Pnt 2204 3833 Pnt 3030 3763 Pnt 2114 3843 Pnt 3314 3833 Pnt 2708 3755 Pnt 2733 3743 Pnt 4219 3757 Pnt 3367 3771 Pnt 2842 2880 Pnt 2444 3836 Pnt 2374 3761 Pnt 3771 3753 Pnt 2773 3746 Pnt 3252 3756 Pnt 2991 3860 Pnt 2316 3843 Pnt 2097 3758 Pnt 2202 3779 Pnt 2181 3912 Pnt 2709 3855 Pnt 2320 3854 Pnt 2237 3780 Pnt 2032 3775 Pnt 2687 3799 Pnt 2538 3780 Pnt 2151 3822 Pnt 2914 3799 Pnt 2444 3839 Pnt 2695 3750 Pnt 2062 3755 Pnt 2604 3755 Pnt 2658 3754 Pnt 2514 3758 Pnt 3062 3746 Pnt 2648 3806 Pnt 2406 3741 Pnt 1875 3770 Pnt 2992 3762 Pnt 3549 3762 Pnt 3013 3787 Pnt 2519 3786 Pnt 2077 3784 Pnt 2421 3780 Pnt 2690 3767 Pnt 2869 3807 Pnt 2685 3813 Pnt 2669 3766 Pnt 2635 3745 Pnt 2393 3788 Pnt 2082 3778 Pnt 3131 3747 Pnt 2487 3741 Pnt 2014 3796 Pnt 3097 3783 Pnt 3267 3745 Pnt 2752 3743 Pnt 2529 3802 Pnt 3571 3744 Pnt 3345 3751 Pnt 3661 3739 Pnt 3008 3757 Pnt 2530 3795 Pnt 2602 3757 Pnt 2840 3756 Pnt 3450 2660 Pnt 2500 3750 Pnt 3058 3760 Pnt 3316 3753 Pnt 2610 3746 Pnt 2030 3792 Pnt 4066 3758 Pnt 2184 3826 Pnt 1954 3798 Pnt 3135 3756 Pnt 2746 3829 Pnt 4073 3797 Pnt 3561 2783 Pnt 3838 2944 Pnt 2526 3814 Pnt 4143 3758 Pnt 3102 2855 Pnt 1928 3806 Pnt 2815 3812 Pnt 3517 3757 Pnt 2631 3756 Pnt 3704 3740 Pnt 2750 3799 Pnt 3131 3812 Pnt 3048 3746 Pnt 1972 3838 Pnt 3668 2734 Pnt 2576 3895 Pnt 3048 3821 Pnt 2631 3767 Pnt 2601 3774 Pnt 2190 3808 Pnt 2094 3839 Pnt 2852 3789 Pnt 2170 3838 Pnt 3101 3753 Pnt 3160 3797 Pnt 2449 3773 Pnt 2803 3760 Pnt 2706 3763 Pnt 3023 3768 Pnt 2625 3744 Pnt 2368 3777 Pnt 2933 3760 Pnt 2664 3740 Pnt 2857 3737 Pnt 2553 3788 Pnt 2602 3796 Pnt 3122 3765 Pnt 2520 3773 Pnt 3355 3768 Pnt 2699 3765 Pnt 2988 3760 Pnt 2605 3788 Pnt 2100 3786 Pnt 2675 3767 Pnt 2271 3753 Pnt 2455 3796 Pnt 2034 3784 Pnt 3189 3741 Pnt 3470 3784 Pnt 2458 3802 Pnt 2553 3800 Pnt 3161 3746 Pnt 3813 3743 Pnt 2591 3766 Pnt 2949 3784 Pnt 2903 3773 Pnt 2669 3790 Pnt 2820 3771 Pnt 4005 2718 Pnt 3392 3750 Pnt 2905 3832 Pnt 2872 3752 Pnt 2911 3902 Pnt 2386 3771 Pnt 2124 3856 Pnt 3857 3904 Pnt 2762 3776 Pnt 3416 3761 Pnt 2469 3790 Pnt 3185 3745 Pnt 2962 3790 Pnt 3201 3751 Pnt 2984 3769 Pnt 2844 3758 Pnt 3971 3751 Pnt 2611 3807 Pnt 3032 3758 Pnt 2750 3754 Pnt 2608 3751 Pnt 1970 3836 Pnt 2383 3761 Pnt 2078 3811 Pnt 2878 3753 Pnt 2748 3749 Pnt 2521 3805 Pnt 2849 3748 Pnt 2869 3759 Pnt 2825 3751 Pnt 2269 3749 Pnt 2806 3752 Pnt 2293 3742 Pnt 2554 3749 Pnt 2152 3748 Pnt 2667 3839 Pnt 3257 3754 Pnt 2815 3752 Pnt 2240 3775 Pnt 2654 3756 Pnt 2587 3782 Pnt 2456 3761 Pnt 2219 3774 Pnt 2764 3751 Pnt 3448 3754 Pnt 2681 3761 Pnt 2624 3774 Pnt 3140 3757 Pnt 2860 3774 Pnt 2685 3842 Pnt 3592 3751 Pnt 2693 3832 Pnt 2308 3801 Pnt 3542 3765 Pnt 2198 3789 Pnt 2587 3801 Pnt 2272 3765 Pnt 2460 3759 Pnt 3158 3793 Pnt 2949 3757 Pnt 3790 3756 Pnt 3318 3757 Pnt 2367 3808 Pnt 1950 3812 Pnt 3219 2746 Pnt 2924 3746 Pnt 3861 3761 Pnt 2885 3777 Pnt 3093 3777 Pnt 2844 3832 Pnt 2798 3765 Pnt 2024 3793 Pnt 3891 3748 Pnt 3412 3752 Pnt 3066 3832 Pnt 2542 3789 Pnt 2652 3764 Pnt 2897 3769 Pnt 2757 3773 Pnt 3661 3752 Pnt 2745 3780 Pnt 2620 3745 Pnt 2580 3743 Pnt 2953 3818 Pnt 4051 2857 Pnt 2104 3805 Pnt 2501 3805 Pnt 2607 3765 Pnt 2446 3780 Pnt 3035 3776 Pnt 2963 3789 Pnt 2440 3833 Pnt 3110 3748 Pnt 2884 3737 Pnt 2514 3778 Pnt 2959 3833 Pnt 3931 3771 Pnt 2327 3771 Pnt 2489 3764 Pnt 2000 3867 Pnt 2781 3807 Pnt 2420 3770 Pnt 2533 3799 Pnt 3147 3764 Pnt 2822 3876 Pnt 2620 3811 Pnt 2763 3749 Pnt 2835 3750 Pnt 2763 3794 Pnt 2195 3781 Pnt 2409 3802 Pnt 3656 3752 Pnt 2621 3755 Pnt 3447 3771 Pnt 3545 3744 Pnt 2763 3743 Pnt 3243 3804 Pnt 3129 3746 Pnt 2575 3751 Pnt 2010 3743 Pnt 2702 3775 Pnt 2492 3931 Pnt 3014 3743 Pnt 2901 3758 Pnt 4069 3804 Pnt 2972 3743 Pnt 2916 3754 Pnt 2739 3764 Pnt 2843 3753 Pnt 2846 3770 Pnt 3370 3751 Pnt 2627 3785 Pnt 3617 3771 Pnt 2172 3840 Pnt 3026 3750 Pnt 2925 3804 Pnt 2554 3749 Pnt 2516 3739 Pnt 3177 3834 Pnt 2149 3770 Pnt 4098 3751 Pnt 2952 3817 Pnt 2442 3744 Pnt 3772 2919 Pnt 2869 3756 Pnt 2530 3760 Pnt 3483 3744 Pnt 2274 3747 Pnt 2844 3756 Pnt 2551 3752 Pnt 3532 3758 Pnt 2717 3776 Pnt 3081 3764 Pnt 2635 3746 Pnt 3735 2926 Pnt 2297 3798 Pnt 3158 3776 Pnt 2925 3752 Pnt 2801 3754 Pnt 2734 3756 Pnt 2492 3754 Pnt 3239 3752 Pnt 3683 3807 Pnt 3190 3759 Pnt 2829 3798 Pnt 2475 3807 Pnt 3588 3759 Pnt 3328 3757 Pnt 3240 3798 Pnt 2871 3803 Pnt 2622 3754 Pnt 4027 2929 Pnt 2492 3800 Pnt 3016 3754 Pnt 2427 3766 Pnt 3267 3762 Pnt 2898 3750 Pnt 2789 3753 Pnt 2870 3817 Pnt 3001 3746 Pnt 2749 3749 Pnt 2247 3801 Pnt 2617 3750 Pnt 3525 3750 Pnt 2448 3767 Pnt 2972 3745 Pnt 3018 3769 Pnt 2804 3784 Pnt 3401 3757 Pnt 3003 3751 Pnt 2464 3795 Pnt 3092 3835 Pnt 1982 3793 Pnt 2445 3801 Pnt 2616 3791 Pnt 2536 3742 Pnt 3360 3750 Pnt 2371 3771 Pnt 2108 3756 Pnt 3202 3752 Pnt 2867 3820 Pnt 2401 3761 Pnt 2565 3840 Pnt 2657 3765 Pnt 2878 3751 Pnt 2570 3747 Pnt 3263 3748 Pnt 2734 3748 Pnt 4135 2791 Pnt 2526 3751 Pnt 3844 3748 Pnt 2649 3747 Pnt 2568 3779 Pnt 3870 2836 Pnt 2694 3754 Pnt 3267 3745 Pnt 3644 3740 Pnt 1883 3775 Pnt 4346 3771 Pnt 2809 3774 Pnt 2933 3767 Pnt 3474 2989 Pnt 3879 3746 Pnt 2898 3746 Pnt 2841 3748 Pnt 1999 3826 Pnt 3400 3825 Pnt 4163 3774 Pnt 2708 3746 Pnt 3348 3755 Pnt 2729 3794 Pnt 2502 3739 Pnt 2773 3746 Pnt 2604 3835 Pnt 2588 3752 Pnt 2471 3751 Pnt 2806 3748 Pnt 2372 3746 Pnt 2713 3748 Pnt 2505 3786 Pnt 2521 3828 Pnt 2785 3746 Pnt 2612 3792 Pnt 3335 3786 Pnt 2524 3752 Pnt 2875 3789 Pnt 2861 3826 Pnt 3395 3789 Pnt 2561 3752 Pnt 4202 3809 Pnt 4406 3767 Pnt 3105 3754 Pnt 2286 3751 Pnt 2568 3759 Pnt 2818 3790 Pnt 3942 2749 Pnt 2039 3766 Pnt 3014 3803 Pnt 2564 3741 Pnt 2653 3755 Pnt 2773 3750 Pnt 2401 3755 Pnt 2865 3836 Pnt 2204 3871 Pnt 2777 3770 Pnt 2448 3811 Pnt 2157 3775 Pnt 3026 3756 Pnt 2772 3762 Pnt 2451 3800 Pnt 4109 3871 Pnt 3848 3746 Pnt 2187 3811 Pnt 3123 3747 Pnt 3052 3751 Pnt 2493 3740 Pnt 4263 2747 Pnt 2236 3767 Pnt 2429 3740 Pnt 2645 3746 Pnt 3249 3749 Pnt 2096 3846 Pnt 2697 3809 Pnt 3235 3746 Pnt 2535 3780 Pnt 3417 3749 Pnt 2812 3754 Pnt 2561 3744 Pnt 3190 3792 Pnt 2789 3774 Pnt 2819 3777 Pnt 2661 3810 Pnt 3571 3748 Pnt 2214 3807 Pnt 3867 3751 Pnt 4130 3761 Pnt 2224 3775 Pnt 2527 3747 Pnt 2074 3821 Pnt 3229 3808 Pnt 2605 3775 Pnt 1886 3801 Pnt 2484 3743 Pnt 1976 3821 Pnt 3896 2842 Pnt 3856 3806 Pnt 3849 3748 Pnt 2674 3803 Pnt 3687 3740 Pnt 3211 3768 Pnt 3579 3766 Pnt 3228 3746 Pnt 2506 3834 Pnt 2622 3769 Pnt 3961 3750 Pnt 2374 3855 Pnt 3127 3872 Pnt 3112 3782 Pnt 3535 3771 Pnt 2607 3780 Pnt 2149 3798 Pnt 2471 3808 Pnt 2544 3765 Pnt 4020 3759 Pnt 2532 3750 Pnt 3356 3757 Pnt 2583 3824 Pnt 2635 3753 Pnt 3870 3743 Pnt 2942 3774 Pnt 2937 3744 Pnt 2376 3758 Pnt 3074 3763 Pnt 4052 3774 Pnt 2884 3744 Pnt 2069 3868 Pnt 2244 3816 Pnt 2903 3758 Pnt 2344 3764 Pnt 2938 2949 Pnt 3551 2807 Pnt 2180 3767 Pnt 2370 3797 Pnt 2943 3744 Pnt 2570 3762 Pnt 3665 3762 Pnt 2827 3753 Pnt 2558 3732 Pnt 4129 3768 Pnt 2830 3732 Pnt 4251 3765 Pnt 3845 3804 Pnt 2544 3751 Pnt 3213 2941 Pnt 2595 3751 Pnt 3791 3754 Pnt 2345 3754 Pnt 3878 3735 Pnt 2322 3784 Pnt 2781 3824 Pnt 3477 3760 Pnt 2940 3792 Pnt 2552 3802 Pnt 2295 3824 Pnt 3067 3879 Pnt 2346 3808 Pnt 2241 3833 Pnt 2791 3802 Pnt 3011 3740 Pnt 3837 2853 Pnt 2693 3776 Pnt 2344 3806 Pnt 2850 3784 Pnt 3223 2018 Pnt 2786 3750 Pnt 2628 3794 Pnt 3081 3776 Pnt 2345 3798 Pnt 2325 3795 Pnt 2692 3751 Pnt 2618 3806 Pnt 2460 3763 Pnt 2659 3762 Pnt 2472 3748 Pnt 2873 3757 Pnt 3826 3743 Pnt 3478 3744 Pnt 3056 3863 Pnt 2394 3851 Pnt 3547 2662 Pnt 2607 3743 Pnt 3428 3747 Pnt 3276 3776 Pnt 2313 3797 Pnt 2918 3760 Pnt 2575 3792 Pnt 1956 3834 Pnt 2780 3760 Pnt 3625 3758 Pnt 2756 3791 Pnt 3354 3758 Pnt 2343 3773 Pnt 2935 3791 Pnt 3357 3750 Pnt 2913 3749 Pnt 2237 3781 Pnt 2409 3778 Pnt 3075 3778 Pnt 2986 3778 Pnt 2771 3763 Pnt 2673 3794 Pnt 2547 3748 Pnt 2617 3819 Pnt 2834 3751 Pnt 2963 3751 Pnt 3871 3763 Pnt 2377 3806 Pnt 2969 3782 Pnt 3528 3742 Pnt 3276 3746 Pnt 3983 3806 Pnt 2754 3786 Pnt 2813 3745 Pnt 3375 3808 Pnt 2587 3832 Pnt 2458 3899 Pnt 2431 3743 Pnt 2681 3866 Pnt 3529 3746 Pnt 3041 3808 Pnt 3341 3899 Pnt 2383 3806 Pnt 2711 3800 Pnt 3021 3743 Pnt 2737 3740 Pnt 2551 3805 Pnt 2173 3776 Pnt 2258 3749 Pnt 3829 3776 Pnt 2711 3799 Pnt 3143 3752 Pnt 2720 3754 Pnt 3729 3789 Pnt 3924 3746 Pnt 3043 3770 Pnt 3531 3748 Pnt 3305 3770 Pnt 2824 3792 Pnt 3819 3756 Pnt 2839 3744 Pnt 2748 3785 Pnt 2620 3803 Pnt 2133 3766 Pnt 1906 3766 Pnt 2635 3754 Pnt 4035 3749 Pnt 2188 3819 Pnt 3101 3757 Pnt 2203 3767 Pnt 3031 3750 Pnt 2747 3744 Pnt 3162 3780 Pnt 2512 3825 Pnt 3135 3769 Pnt 2802 3806 Pnt 3559 3753 Pnt 2109 3834 Pnt 2545 3769 Pnt 2590 3809 Pnt 3332 3806 Pnt 2610 3799 Pnt 2433 3877 Pnt 2506 3754 Pnt 2676 3738 Pnt 2704 3814 Pnt 4053 3764 Pnt 3846 3754 Pnt 2815 3746 Pnt 2670 3778 Pnt 2567 3768 Pnt 2975 3778 Pnt 2719 3749 Pnt 3276 3762 Pnt 3705 3747 Pnt 2929 3746 Pnt 2761 3749 Pnt 2351 3784 Pnt 2382 3812 Pnt 2432 3787 Pnt 3995 3758 Pnt 2836 3831 Pnt 2648 3794 Pnt 2590 2742 Pnt 2779 3760 Pnt 2612 3831 Pnt 3738 2961 Pnt 2595 3809 Pnt 2514 3748 Pnt 2267 3820 Pnt 3045 3748 Pnt 2394 3763 Pnt 2969 3935 Pnt 3583 3763 Pnt 2730 3765 Pnt 1857 3773 Pnt 3535 3762 Pnt 2367 3793 Pnt 2251 3807 Pnt 1967 3774 Pnt 3323 3741 Pnt 2703 3756 Pnt 3077 3769 Pnt 3530 3753 Pnt 2975 3753 Pnt 2887 3759 Pnt 3007 3739 Pnt 2944 3776 Pnt 3522 3742 Pnt 3787 3781 Pnt 3279 3738 Pnt 2601 3752 Pnt 3033 3766 Pnt 3764 3742 Pnt 2687 3747 Pnt 2269 3766 Pnt 2467 3749 Pnt 2439 3749 Pnt 2408 3820 Pnt 2994 3763 Pnt 2317 3803 Pnt 3071 3755 Pnt 3401 3752 Pnt 4137 3738 Pnt 2185 3809 Pnt 2779 3764 Pnt 3224 3787 Pnt 3337 3791 Pnt 3972 3752 Pnt 2172 3812 Pnt 3346 3789 Pnt 2588 3777 Pnt 2462 3786 Pnt 3345 3789 Pnt 2810 3740 Pnt 2248 3850 Pnt 2835 3759 Pnt 2500 3752 Pnt 2916 3767 Pnt 2186 3768 Pnt 2605 3798 Pnt 3074 3767 Pnt 3243 3756 Pnt 3586 3786 Pnt 2586 3756 Pnt 3021 3760 Pnt 2467 3774 Pnt 3710 3751 Pnt 3376 3752 Pnt 2961 3797 Pnt 3217 3774 Pnt 2287 3765 Pnt 2693 3751 Pnt 2368 3810 Pnt 3375 3762 Pnt 2402 3764 Pnt 2728 3744 Pnt 3649 3751 Pnt 2828 3761 Pnt 2655 3750 Pnt 2884 3774 Pnt 3696 3757 Pnt 2847 3850 Pnt 2072 3783 Pnt 3218 3750 Pnt 3145 2921 Pnt 3093 3762 Pnt 2680 3770 Pnt 3045 3775 Pnt 2748 3758 Pnt 3314 3764 Pnt 2668 3743 Pnt 2427 3902 Pnt 2604 3811 Pnt 3620 3750 Pnt 3652 3755 Pnt 2734 3781 Pnt 3257 3811 Pnt 3008 3759 Pnt 2906 3755 Pnt 2286 3798 Pnt 2869 3785 Pnt 2394 3750 Pnt 2614 3760 Pnt 2668 3767 Pnt 2725 3756 Pnt 2935 3757 Pnt 2427 3757 Pnt 2974 3767 Pnt 2581 3760 Pnt 2473 3815 Pnt 2644 3750 Pnt 2586 3746 Pnt 2139 3941 Pnt 3071 3745 Pnt 2697 3745 Pnt 3678 3756 Pnt 3062 3754 Pnt 3933 3784 Pnt 3005 3761 Pnt 2825 3761 Pnt 2587 3802 Pnt 2699 3781 Pnt 3268 3757 Pnt 3585 3779 Pnt 2123 3794 Pnt 3137 3796 Pnt 4292 3766 Pnt 3011 3752 Pnt 2888 3768 Pnt 4004 3784 Pnt 2951 3817 Pnt 2675 3767 Pnt 2458 3828 Pnt 2712 3773 Pnt 2710 3750 Pnt 2958 3756 Pnt 3975 3773 Pnt 2189 3751 Pnt 2733 3750 Pnt 3405 3750 Pnt 2563 3771 Pnt 2811 3753 Pnt 3169 3751 Pnt 3389 3771 Pnt 2645 3800 Pnt 2049 3796 Pnt 1832 3838 Pnt 2571 3832 Pnt 2292 3761 Pnt 2143 3772 Pnt 3082 3786 Pnt 2779 3780 Pnt 2807 3752 Pnt 3393 3771 Pnt 3234 3787 Pnt 2375 3744 Pnt 3072 3795 Pnt 3205 3757 Pnt 2905 3769 Pnt 2867 3797 Pnt 3057 3752 Pnt 2679 3772 Pnt 2775 3751 Pnt 2731 3744 Pnt 2139 3828 Pnt 3433 3757 Pnt 2293 3825 Pnt 2167 3784 Pnt 2847 3755 Pnt 2489 3757 Pnt 1765 3786 Pnt 2438 3794 Pnt 3866 3782 Pnt 3140 3757 Pnt 3684 3767 Pnt 2634 3810 Pnt 3216 2736 Pnt 3137 3826 Pnt 2527 3751 Pnt 2038 3796 Pnt 3101 3774 Pnt 3394 3810 Pnt 2342 3748 Pnt 3255 3774 Pnt 2430 3751 Pnt 2211 3761 Pnt 3410 3756 Pnt 2245 3788 Pnt 1974 3783 Pnt 2971 3738 Pnt 2365 3771 Pnt 2365 3764 Pnt 3178 3753 Pnt 2669 3779 Pnt 2466 3809 Pnt 2763 3755 Pnt 2490 3755 Pnt 2430 3764 Pnt 2006 3809 Pnt 2186 3763 Pnt 2923 3745 Pnt 2378 3782 Pnt 2252 3736 Pnt 1971 3803 Pnt 3320 3761 Pnt 3214 3762 Pnt 2149 3844 Pnt 2071 3782 Pnt 2312 3747 Pnt 2242 3782 Pnt 2887 3748 Pnt 3692 3748 Pnt 2564 3783 Pnt 3980 3741 Pnt 3711 3742 Pnt 2595 2885 Pnt 2380 3774 Pnt 3987 3773 Pnt 2739 3774 Pnt 3755 3740 Pnt 2964 3804 Pnt 3757 3770 Pnt 2467 3794 Pnt 3157 3749 Pnt 2578 3767 Pnt 2587 3764 Pnt 2240 3848 Pnt 1682 3802 Pnt 2388 3827 Pnt 2764 3766 Pnt 2496 3928 Pnt 2223 3805 Pnt 1992 3807 Pnt 2788 3747 Pnt 2580 3741 Pnt 2739 3748 Pnt 2212 3843 Pnt 2904 3745 Pnt 2786 3828 Pnt 2739 3764 Pnt 2096 3923 Pnt 2395 3773 Pnt 2843 3800 Pnt 2293 3762 Pnt 2324 3806 Pnt 2417 3802 Pnt 3236 3806 Pnt 2865 3807 Pnt 2846 3798 Pnt 2528 3786 Pnt 2210 3804 Pnt 2997 3774 Pnt 3302 3753 Pnt 2225 3801 Pnt 2448 3830 Pnt 2225 3765 Pnt 2548 3756 Pnt 2359 3868 Pnt 3726 3762 Pnt 2551 3763 Pnt 2698 3741 Pnt 3677 3741 Pnt 2504 3804 Pnt 2434 3810 Pnt 2307 3832 Pnt 1915 3819 Pnt 4091 3751 Pnt 2733 3814 Pnt 2034 3810 Pnt 2929 3858 Pnt 2068 3810 Pnt 3932 3805 Pnt 2267 3777 Pnt 2397 3787 Pnt 2823 3755 Pnt 2802 3759 Pnt 3078 3762 Pnt 3356 3743 Pnt 2403 3746 Pnt 2793 3778 Pnt 2118 3747 Pnt 2126 3829 Pnt 3883 3752 Pnt 2161 3829 Pnt 2997 3757 Pnt 2776 3778 Pnt 2315 3811 Pnt 2849 3807 Pnt 2351 3747 Pnt 2362 3738 Pnt 2508 3761 Pnt 2561 3746 Pnt 2361 3800 Pnt 2585 3741 Pnt 2328 3781 Pnt 4178 3758 Pnt 2913 3753 Pnt 3493 3739 Pnt 2818 3803 Pnt 4356 3768 Pnt 4000 3803 Pnt 3009 3838 Pnt 3580 2889 Pnt 2731 3807 Pnt 2867 3748 Pnt 2667 3807 Pnt 3262 3755 Pnt 2448 3751 Pnt 3166 3751 Pnt 2741 3791 Pnt 1896 3812 Pnt 2701 3765 Pnt 2568 3811 Pnt 4084 3773 Pnt 2644 3756 Pnt 3369 3810 Pnt 2875 3847 Pnt 2431 3756 Pnt 3985 3752 Pnt 2955 3756 Pnt 2980 3761 Pnt 2666 3749 Pnt 2284 3783 Pnt 2446 3775 Pnt 3437 3761 Pnt 3938 3753 Pnt 3630 3781 Pnt 3161 3783 Pnt 2331 3752 Pnt 2917 3778 Pnt 2947 3742 Pnt 3092 3764 Pnt 2623 3749 Pnt 1972 3784 Pnt 3732 2857 Pnt 2422 3751 Pnt 2590 3887 Pnt 2321 3769 Pnt 2171 3805 Pnt 3190 3751 Pnt 3604 3758 Pnt 2947 3764 Pnt 1848 3795 Pnt 3801 2735 Pnt 3021 3807 Pnt 2721 3802 Pnt 2526 3776 Pnt 2472 3803 Pnt 3329 3732 Pnt 2663 3751 Pnt 2628 3744 Pnt 2239 3777 Pnt 2361 3796 Pnt 1928 3754 Pnt 2494 3817 Pnt 2594 3744 Pnt 3165 3748 Pnt 3015 3785 Pnt 2176 3762 Pnt 3847 3751 Pnt 2056 3804 Pnt 2209 3750 Pnt 2889 3751 Pnt 2419 3751 Pnt 2369 3796 Pnt 2395 3768 Pnt 3073 3804 Pnt 2732 3749 Pnt 2360 3798 Pnt 3070 3764 Pnt 2292 3822 Pnt 1881 3817 Pnt 2123 3842 Pnt 2833 2989 Pnt 3063 3745 Pnt 2862 3762 Pnt 3302 3752 Pnt 2814 3747 Pnt 3252 3754 Pnt 2352 3797 Pnt 2274 3763 Pnt 4083 3798 Pnt 2739 3806 Pnt 2357 3738 Pnt 2689 3802 Pnt 2567 3760 Pnt 2322 3814 Pnt 3044 3824 Pnt 2564 3815 Pnt 2603 3792 Pnt 3891 3754 Pnt 2449 3786 Pnt 3030 3815 Pnt 3595 3815 Pnt 2006 3840 Pnt 2777 3772 Pnt 2960 3748 Pnt 2346 3744 Pnt 2746 3773 Pnt 2574 3763 Pnt 2874 3744 Pnt 3257 3743 Pnt 2719 3755 Pnt 2753 3816 Pnt 4078 3802 Pnt 2692 3820 Pnt 2867 3750 Pnt 2776 3761 Pnt 2569 3774 Pnt 2916 3757 Pnt 2198 3772 Pnt 2536 3749 Pnt 2527 3738 Pnt 2111 3830 Pnt 2410 3743 Pnt 2520 3747 Pnt 2471 3798 Pnt 2685 3753 Pnt 2543 3766 Pnt 3180 3757 Pnt 3300 3766 Pnt 3105 3756 Pnt 2424 3786 Pnt 2161 3833 Pnt 2290 3771 Pnt 3302 3741 Pnt 2662 3838 Pnt 2794 3787 Pnt 2909 3796 Pnt 2655 3840 Pnt 2414 3746 Pnt 3976 3769 Pnt 2087 3840 Pnt 2629 3767 Pnt 2769 2760 Pnt 2779 3783 Pnt 3805 3794 Pnt 3537 3767 Pnt 2766 3744 Pnt 2417 3816 Pnt 2603 3732 Pnt 2433 3756 Pnt 2567 3809 Pnt 2541 3782 Pnt 3006 3822 Pnt 2842 3775 Pnt 2654 3742 Pnt 2557 3857 Pnt 2879 3766 Pnt 2689 3748 Pnt 2214 3795 Pnt 2283 3766 Pnt 3090 3769 Pnt 2372 3757 Pnt 2745 3755 Pnt 1684 3771 Pnt 2912 3755 Pnt 2130 3804 Pnt 2264 3839 Pnt 2300 3773 Pnt 2331 3761 Pnt 2947 3755 Pnt 3601 3761 Pnt 2621 3807 Pnt 2432 3807 Pnt 3585 3745 Pnt 2526 3780 Pnt 2889 3747 Pnt 2914 3745 Pnt 2620 3811 Pnt 2825 3776 Pnt 3380 3769 Pnt 2813 3809 Pnt 2313 3758 Pnt 3369 3758 Pnt 2064 3816 Pnt 2698 3775 Pnt 3210 3761 Pnt 3108 3801 Pnt 3627 3756 Pnt 2256 3753 Pnt 2771 3754 Pnt 3146 3752 Pnt 2303 3753 Pnt 2939 3757 Pnt 2645 3814 Pnt 2746 3754 Pnt 2429 3814 Pnt 2347 3804 Pnt 2592 3819 Pnt 2794 3746 Pnt 4333 3765 Pnt 2306 3798 Pnt 2095 3756 Pnt 2882 3782 Pnt 2441 3821 Pnt 2523 2942 Pnt 3193 3749 Pnt 2501 3744 Pnt 2073 3838 Pnt 2677 3767 Pnt 3016 2531 Pnt 1999 3797 Pnt 2843 3803 Pnt 3040 3782 Pnt 2911 3755 Pnt 2832 3768 Pnt 3328 3781 Pnt 3260 3756 Pnt 4101 3161 Pnt 1934 3796 Pnt 2624 3788 Pnt 4016 3754 Pnt 3013 2837 Pnt 3512 3753 Pnt 2667 3774 Pnt 2822 3756 Pnt 2769 3765 Pnt 2407 3807 Pnt 2025 3843 Pnt 3964 3774 Pnt 2540 3777 Pnt 2528 3777 Pnt 2535 3750 Pnt 2496 3750 Pnt 3176 3757 Pnt 3488 3760 Pnt 2249 3746 Pnt 2659 3825 Pnt 2989 3745 Pnt 2142 3758 Pnt 2018 3792 Pnt 2650 3772 Pnt 3077 3748 Pnt 2304 3779 Pnt 2248 3824 Pnt 2451 3826 Pnt 2326 3912 Pnt 3730 3781 Pnt 2122 3797 Pnt 3010 3775 Pnt 2294 3771 Pnt 4276 3745 Pnt 3560 3739 Pnt 2650 2802 Pnt 2585 3838 Pnt 2302 3898 Pnt 2650 3796 Pnt 2492 3797 Pnt 2909 3773 Pnt 2640 3855 Pnt 2179 3746 Pnt 2799 3829 Pnt 2307 3780 Pnt 3042 2894 Pnt 2565 3790 Pnt 3051 3828 Pnt 2746 3752 Pnt 3020 3790 Pnt 2072 3826 Pnt 3548 3766 Pnt 2596 3829 Pnt 2835 3807 Pnt 1965 3836 Pnt 3709 3753 Pnt 4426 3746 Pnt 3014 3762 Pnt 2798 3766 Pnt 3638 3745 Pnt 2682 3793 Pnt 2399 3783 Pnt 2740 3814 Pnt 2704 3780 Pnt 2775 3806 Pnt 1939 3765 Pnt 2457 3806 Pnt 2771 3750 Pnt 2948 3757 Pnt 2873 3751 Pnt 2052 3775 Pnt 3196 3747 Pnt 4068 2930 Pnt 2425 3766 Pnt 2959 2984 Pnt 2804 3799 Pnt 2414 3763 Pnt 2332 3803 Pnt 3739 3741 Pnt 2271 3751 Pnt 4165 3758 Pnt 2296 3771 Pnt 3360 3772 Pnt 2486 3801 Pnt 3926 3801 Pnt 2950 3768 Pnt 2009 3812 Pnt 3966 3749 Pnt 3594 3812 Pnt 2594 3763 Pnt 2479 3755 Pnt 4450 3752 Pnt 4070 3752 Pnt 2575 3784 Pnt 2944 3761 Pnt 2768 3740 Pnt 2336 3776 Pnt 3004 3751 Pnt 2402 3765 Pnt 2863 3791 Pnt 2745 3767 Pnt 3301 3737 Pnt 2763 3754 Pnt 3922 3751 Pnt 2303 3753 Pnt 2650 3760 Pnt 3988 2881 Pnt 3638 2504 Pnt 2472 3796 Pnt 2973 3778 Pnt 3352 3738 Pnt 3602 3763 Pnt 2388 3780 Pnt 2020 3825 Pnt 4305 3770 Pnt 1945 3784 Pnt 3195 3778 Pnt 2837 3773 Pnt 2714 3773 Pnt 2443 3751 Pnt 2951 3751 Pnt 3911 3745 Pnt 2687 3753 Pnt 3512 3786 Pnt 2665 3743 Pnt 2419 3760 Pnt 2478 3835 Pnt 3475 2827 Pnt 2423 3788 Pnt 2748 3743 Pnt 2056 3805 Pnt 2352 3815 Pnt 2371 3791 Pnt 3717 3834 Pnt 2805 3771 Pnt 2777 3795 Pnt 3589 3819 Pnt 2795 3762 Pnt 2166 3785 Pnt 2483 3820 Pnt 2495 3841 Pnt 3255 2596 Pnt 3036 3767 Pnt 2182 3783 Pnt 3257 3836 Pnt 2823 3761 Pnt 3033 3765 Pnt 2536 3761 Pnt 2597 3755 Pnt 3142 3746 Pnt 2688 3751 Pnt 3247 3768 Pnt 2797 3743 Pnt 2594 3802 Pnt 3271 3745 Pnt 3688 3762 Pnt 2823 3742 Pnt 2722 3750 Pnt 2264 3834 Pnt 2865 3800 Pnt 3447 3748 Pnt 2229 3836 Pnt 2465 3769 Pnt 3747 3746 Pnt 2630 3746 Pnt 3090 3754 Pnt 2684 3741 Pnt 2434 3860 Pnt 2861 3761 Pnt 3314 3746 Pnt 2692 3750 Pnt 2866 3740 Pnt 3178 3746 Pnt 2056 3784 Pnt 3222 3759 Pnt 3337 3769 Pnt 2690 3844 Pnt 2743 3759 Pnt 2582 3844 Pnt 2833 3782 Pnt 2075 3914 Pnt 2915 3749 Pnt 3702 3748 Pnt 2043 3807 Pnt 2176 3762 Pnt 2616 3742 Pnt 2748 3799 Pnt 2701 3756 Pnt 2151 3816 Pnt 3965 3769 Pnt 3213 3751 Pnt 2673 3839 Pnt 3975 3756 Pnt 3124 3749 Pnt 2860 3756 Pnt 3122 3742 Pnt 3022 3752 Pnt 2781 3934 Pnt 3110 3746 Pnt 1973 3776 Pnt 2851 3934 Pnt 2514 3782 Pnt 2301 3804 Pnt 1879 3854 Pnt 3883 2954 Pnt 2708 3761 Pnt 3960 3787 Pnt 3185 2653 Pnt 2562 3766 Pnt 2337 3807 Pnt 2901 3758 Pnt 2449 3761 Pnt 2652 3748 Pnt 2491 3821 Pnt 2301 3766 Pnt 4029 3742 Pnt 2461 3739 Pnt 2648 3778 Pnt 2481 3806 Pnt 2514 3831 Pnt 2725 3761 Pnt 2558 3739 Pnt 3427 3737 Pnt 2974 3748 Pnt 3165 3754 Pnt 2804 3752 Pnt 2792 3780 Pnt 2850 3792 Pnt 3625 2530 Pnt 2985 3770 Pnt 3411 3792 Pnt 2964 3740 Pnt 2735 3764 Pnt 2510 3819 Pnt 2777 3774 Pnt 3727 3757 Pnt 2626 3752 Pnt 2831 3777 Pnt 2536 3774 Pnt 2235 3771 Pnt 4013 3740 Pnt 1933 3841 Pnt 2929 3742 Pnt 2662 3832 Pnt 2985 3770 Pnt 2579 3833 Pnt 2475 3754 Pnt 2829 3801 Pnt 2594 3770 Pnt 2303 3800 Pnt 3392 3778 Pnt 3511 3752 Pnt 2970 3769 Pnt 2393 3781 Pnt 2261 3783 Pnt 2846 3762 Pnt 2671 3799 Pnt 3655 3789 Pnt 2814 3762 Pnt 2629 3749 Pnt 2189 3807 Pnt 2970 3749 Pnt 3206 3771 Pnt 2805 3761 Pnt 2458 3874 Pnt 3209 3764 Pnt 2442 3895 Pnt 2550 3745 Pnt 4248 3764 Pnt 2305 3895 Pnt 3584 3746 Pnt 2655 3776 Pnt 2429 3819 Pnt 1998 3867 Pnt 2113 3806 Pnt 2116 3775 Pnt 2479 3798 Pnt 2331 3814 Pnt 2331 3840 Pnt 2759 3806 Pnt 3354 3765 Pnt 2562 3754 Pnt 2374 3770 Pnt 2924 3771 Pnt 2702 3789 Pnt 2865 3814 Pnt 3049 3756 Pnt 2883 3771 Pnt 4129 3770 Pnt 3239 3749 Pnt 2958 3784 Pnt 2588 3823 Pnt 3130 3823 Pnt 2187 3750 Pnt 2816 3774 Pnt 2870 3758 Pnt 2876 3745 Pnt 2496 3771 Pnt 2820 3753 Pnt 4070 3753 Pnt 2825 3796 Pnt 2708 3799 Pnt 2561 3804 Pnt 2856 3766 Pnt 2630 3824 Pnt 3758 3766 Pnt 2440 3808 Pnt 3463 3804 Pnt 2830 3740 Pnt 2983 3769 Pnt 2542 3834 Pnt 3941 2837 Pnt 3653 3773 Pnt 3208 3765 Pnt 2872 3822 Pnt 3187 3759 Pnt 3147 3752 Pnt 2864 3794 Pnt 4261 3759 Pnt 2676 3754 Pnt 3999 3756 Pnt 2770 3753 Pnt 3062 3745 Pnt 2111 3756 Pnt 2983 3732 Pnt 3595 3803 Pnt 2885 3752 Pnt 3057 3762 Pnt 2492 3751 Pnt 1938 3840 Pnt 2897 3836 Pnt 2794 3750 Pnt 2764 3765 Pnt 2601 3751 Pnt 4128 3750 Pnt 2814 3777 Pnt 2429 3744 Pnt 2660 3754 Pnt 3252 3771 Pnt 2533 3742 Pnt 3766 3742 Pnt 2099 3771 Pnt 3665 3740 Pnt 2983 3756 Pnt 2743 3826 Pnt 2273 3829 Pnt 2776 3767 Pnt 3268 3760 Pnt 2434 3757 Pnt 3214 3752 Pnt 3046 3810 Pnt 2522 3825 Pnt 2865 3757 Pnt 2786 3772 Pnt 2406 3851 Pnt 2678 3758 Pnt 2802 3751 Pnt 2482 3741 Pnt 2781 3763 Pnt 1938 3821 Pnt 2620 3746 Pnt 2671 3746 Pnt 2517 3743 Pnt 2538 3762 Pnt 2147 3801 Pnt 2935 3753 Pnt 2697 3835 Pnt 2973 3757 Pnt 2244 3807 Pnt 2140 3775 Pnt 2411 3746 Pnt 2585 3798 Pnt 3391 3775 Pnt 2673 3790 Pnt 2640 3770 Pnt 3447 3764 Pnt 2595 3793 Pnt 2731 3754 Pnt 3337 3770 Pnt 2643 3790 Pnt 2089 3766 Pnt 2368 3773 Pnt 2591 3807 Pnt 2531 3740 Pnt 2514 3758 Pnt 2097 3828 Pnt 3445 3760 Pnt 2242 3798 Pnt 2048 3846 Pnt 2933 3782 Pnt 2825 3786 Pnt 2712 3844 Pnt 2281 3807 Pnt 4055 3766 Pnt 2852 3814 Pnt 2718 3779 Pnt 2607 3792 Pnt 2131 3778 Pnt 2221 3807 Pnt 4045 3748 Pnt 2930 3752 Pnt 2520 3743 Pnt 2975 3752 Pnt 2383 3820 Pnt 2897 3820 Pnt 2902 3748 Pnt 2300 3899 Pnt 2141 3800 Pnt 1889 3808 Pnt 2678 3755 Pnt 2592 3770 Pnt 3690 2803 Pnt 2417 3775 Pnt 2087 3775 Pnt 1972 3774 Pnt 3095 3743 Pnt 3368 3757 Pnt 3658 3770 Pnt 2785 3747 Pnt 2664 3814 Pnt 2256 3748 Pnt 3147 3756 Pnt 2271 3787 Pnt 2963 3872 Pnt 2197 3871 Pnt 2783 3792 Pnt 2667 3744 Pnt 2011 3800 Pnt 2945 3873 Pnt 2826 3777 Pnt 3928 3744 Pnt 2948 3752 Pnt 2551 3800 Pnt 3903 3746 Pnt 3568 3777 Pnt 2857 3744 Pnt 3437 2781 Pnt 2789 3751 Pnt 2684 3750 Pnt 2634 3769 Pnt 2190 3791 Pnt 3453 3759 Pnt 1920 3868 Pnt 3203 3743 Pnt 2699 3803 Pnt 2933 3755 Pnt 3284 3782 Pnt 2256 3819 Pnt 2439 3754 Pnt 4057 3803 Pnt 2981 3765 Pnt 2547 3784 Pnt 2693 3744 Pnt 2137 3775 Pnt 3708 2927 Pnt 2698 3804 Pnt 3133 3763 Pnt 2496 3879 Pnt 3635 3754 Pnt 2103 3763 Pnt 3182 3806 Pnt 2052 3821 Pnt 2137 3803 Pnt 3205 3754 Pnt 2621 3801 Pnt 3249 3766 Pnt 3380 3766 Pnt 2708 3776 Pnt 2211 3834 Pnt 3726 3748 Pnt 2092 3833 Pnt 3650 3769 Pnt 2268 3855 Pnt 2978 3738 Pnt 2838 3794 Pnt 2810 2763 Pnt 2394 3795 Pnt 2355 3808 Pnt 3242 3798 Pnt 2587 3794 Pnt 4365 3771 Pnt 2529 3784 Pnt 2549 3781 Pnt 2315 3806 Pnt 2649 3822 Pnt 2699 3751 Pnt 3107 3757 Pnt 3974 3765 Pnt 2080 3793 Pnt 3329 3774 Pnt 2211 3827 Pnt 3890 3791 Pnt 2264 3773 Pnt 2895 3764 Pnt 2119 3791 Pnt 2582 3783 Pnt 2992 3810 Pnt 2738 3747 Pnt 3488 3810 Pnt 3388 3751 Pnt 3104 3749 Pnt 2445 3803 Pnt 3219 3778 Pnt 2520 2787 Pnt 2438 3778 Pnt 2307 3738 Pnt 4234 3795 Pnt 2484 3747 Pnt 3320 3737 Pnt 2535 3762 Pnt 3378 3806 Pnt 3136 3735 Pnt 2515 3780 Pnt 4455 3756 Pnt 3591 3780 Pnt 2674 3832 Pnt 2626 3771 Pnt 3043 3754 Pnt 2935 3800 Pnt 2167 3811 Pnt 2865 3799 Pnt 2447 3750 Pnt 3022 3750 Pnt 2594 3750 Pnt 2961 3752 Pnt 2466 3802 Pnt 2978 3789 Pnt 2815 3752 Pnt 3793 3773 Pnt 2512 3800 Pnt 2721 3750 Pnt 2364 3804 Pnt 3218 3754 Pnt 2134 3755 Pnt 3355 3750 Pnt 2610 3785 Pnt 2030 3776 Pnt 2432 3794 Pnt 2252 3781 Pnt 2424 3833 Pnt 3286 3760 Pnt 2703 3747 Pnt 2459 3750 Pnt 3164 3759 Pnt 2730 3751 Pnt 2238 3809 Pnt 2731 3746 Pnt 2630 3770 Pnt 3080 3767 Pnt 2397 3761 Pnt 2225 3877 Pnt 2883 3818 Pnt 3258 3768 Pnt 4150 3753 Pnt 2844 3748 Pnt 2297 3810 Pnt 2568 3799 Pnt 3366 3749 Pnt 2981 3756 Pnt 2716 3749 Pnt 2590 3749 Pnt 2218 3931 Pnt 2574 3744 Pnt 2514 3754 Pnt 2092 3780 Pnt 2672 3749 Pnt 2681 3745 Pnt 3515 3932 Pnt 3055 3745 Pnt 2961 3756 Pnt 2514 3746 Pnt 3007 3808 Pnt 3678 3748 Pnt 3471 3765 Pnt 2889 3863 Pnt 2409 3786 Pnt 2821 3744 Pnt 2310 3810 Pnt 2615 3754 Pnt 2661 3796 Pnt 2839 3758 Pnt 2811 3786 Pnt 2842 3793 Pnt 2679 3768 Pnt 3105 3755 Pnt 2471 3787 Pnt 2806 3791 Pnt 2818 3773 Pnt 3419 3796 Pnt 2888 3767 Pnt 2350 3784 Pnt 2712 3748 Pnt 2212 3774 Pnt 2748 3778 Pnt 3575 3755 Pnt 2634 3747 Pnt 2538 3772 Pnt 3163 3747 Pnt 3066 3772 Pnt 2493 3831 Pnt 2931 3817 Pnt 2372 3759 Pnt 2047 3793 Pnt 3586 3817 Pnt 2674 3792 Pnt 3796 3778 Pnt 2305 3766 Pnt 2656 3763 Pnt 4344 3747 Pnt 3277 3745 Pnt 3773 3758 Pnt 3747 3743 Pnt 2477 3807 Pnt 2703 3741 Pnt 3110 3761 Pnt 3175 3767 Pnt 2253 3782 Pnt 2929 2994 Pnt 2698 3781 Pnt 2288 3804 Pnt 2212 3762 Pnt 2843 3759 Pnt 3589 3759 Pnt 2993 3804 Pnt 2705 3770 Pnt 2868 3769 Pnt 2606 3777 Pnt 2764 3764 Pnt 2699 3758 Pnt 4015 3750 Pnt 2612 3819 Pnt 2270 3832 Pnt 2700 3798 Pnt 3080 3764 Pnt 4259 3770 Pnt 2477 3766 Pnt 2530 3754 Pnt 2702 2785 Pnt 3442 3752 Pnt 3507 3744 Pnt 2814 3754 Pnt 2727 3760 Pnt 2549 3850 Pnt 3163 3757 Pnt 2601 3753 Pnt 3835 3747 Pnt 2621 3749 Pnt 3969 3747 Pnt 3067 3765 Pnt 2544 3749 Pnt 2498 3750 Pnt 2440 3753 Pnt 2029 3803 Pnt 3365 3758 Pnt 2260 3839 Pnt 1926 3819 Pnt 2137 3941 Pnt 2986 3757 Pnt 2476 3750 Pnt 2522 3761 Pnt 2448 3820 Pnt 3941 3757 Pnt 2999 3747 Pnt 2786 3756 Pnt 2482 3757 Pnt 2190 3745 Pnt 2802 3822 Pnt 2640 3764 Pnt 2754 3757 Pnt 2622 3760 Pnt 2273 3851 Pnt 2235 3809 Pnt 3404 3796 Pnt 4335 3767 Pnt 2481 3779 Pnt 2635 3810 Pnt 2368 3763 Pnt 3212 3769 Pnt 2745 3791 Pnt 3892 3810 Pnt 3014 3810 Pnt 3020 3826 Pnt 2882 3834 Pnt 2807 3767 Pnt 2471 3780 Pnt 2133 3765 Pnt 2662 3765 Pnt 2738 3935 Pnt 2753 3764 Pnt 2857 3765 Pnt 2446 3806 Pnt 4009 3762 Pnt 2085 3772 Pnt 2391 3812 Pnt 3363 3784 Pnt 3313 3764 Pnt 3536 3759 Pnt 3125 3828 Pnt 2830 3773 Pnt 3478 3743 Pnt 2803 3771 Pnt 3176 3764 Pnt 2776 3753 Pnt 2624 3801 Pnt 4101 3787 Pnt 2371 3777 Pnt 3020 3806 Pnt 2515 3782 Pnt 2412 3746 Pnt 2889 3751 Pnt 3620 3816 Pnt 2569 3796 Pnt 2675 3759 Pnt 2744 3832 Pnt 3626 3740 Pnt 2052 3795 Pnt 2944 3756 Pnt 2593 3731 Pnt 3327 3791 Pnt 2485 3770 Pnt 2581 3801 Pnt 2651 3758 Pnt 2697 3748 Pnt 2444 3760 Pnt 2330 3808 Pnt 2461 3821 Pnt 2141 3744 Pnt 2687 3761 Pnt 2603 3782 Pnt 3933 3796 Pnt 2875 3807 Pnt 3128 3764 Pnt 2690 3816 Pnt 2872 3776 Pnt 3132 3797 Pnt 2711 3761 Pnt 2563 3762 Pnt 3005 3753 Pnt 2365 3774 Pnt 2924 3762 Pnt 1954 3820 Pnt 2988 3785 Pnt 2892 3814 Pnt 2688 3757 Pnt 2765 3809 Pnt 2591 3783 Pnt 2102 3788 Pnt 2499 3757 Pnt 2555 3837 Pnt 2645 3747 Pnt 2286 3747 Pnt 2287 3764 Pnt 2256 3800 Pnt 2765 3809 Pnt 2287 3818 Pnt 2795 3748 Pnt 3111 3774 Pnt 3954 3764 Pnt 2558 3761 Pnt 2651 3805 Pnt 2928 3757 Pnt 3249 3753 Pnt 2841 3745 Pnt 2116 3844 Pnt 3871 3792 Pnt 2484 3755 Pnt 2798 3772 Pnt 2193 3770 Pnt 2724 3751 Pnt 2777 3796 Pnt 2870 3804 Pnt 1922 3772 Pnt 3773 3742 Pnt 3388 3741 Pnt 3761 3751 Pnt 2932 3752 Pnt 2351 3751 Pnt 2197 3799 Pnt 2639 3858 Pnt 2940 3774 Pnt 3184 3804 Pnt 2853 3773 Pnt 2192 3798 Pnt 2067 3774 Pnt 2773 3812 Pnt 3276 3774 Pnt 2062 3775 Pnt 2786 3756 Pnt 3350 3766 Pnt 2630 3772 Pnt 2558 3774 Pnt 2122 3808 Pnt 3602 3756 Pnt 2400 3829 Pnt 3000 3769 Pnt 2446 3830 Pnt 2855 3769 Pnt 2871 3757 Pnt 2600 3810 Pnt 2511 3943 Pnt 3014 3753 Pnt 2469 3767 Pnt 2071 3748 Pnt 2605 3816 Pnt 4056 3769 Pnt 2679 3739 Pnt 2513 3756 Pnt 2294 3816 Pnt 3868 3765 Pnt 3025 3755 Pnt 3038 3756 Pnt 2276 3867 Pnt 3673 2657 Pnt 2394 3751 Pnt 3400 3756 Pnt 3038 3773 Pnt 2553 3751 Pnt 3157 3757 Pnt 2988 3756 Pnt 3588 3752 Pnt 3656 3751 Pnt 2160 3819 Pnt 2976 3756 Pnt 2740 3757 Pnt 2234 3843 Pnt 2522 3763 Pnt 3248 3767 Pnt 2940 3777 Pnt 3277 3741 Pnt 2842 3745 Pnt 2872 3773 Pnt 2198 3751 Pnt 2680 3756 Pnt 2992 3745 Pnt 3114 3800 Pnt 2875 3750 Pnt 2573 3752 Pnt 3808 3773 Pnt 3326 3757 Pnt 2320 3798 Pnt 3155 3786 Pnt 3000 3757 Pnt 2778 3805 Pnt 2696 3751 Pnt 2991 3814 Pnt 3290 3747 Pnt 3021 3773 Pnt 2444 3747 Pnt 2079 3801 Pnt 2222 3786 Pnt 2895 3747 Pnt 2195 3736 Pnt 3539 3752 Pnt 2941 3740 Pnt 3792 3773 Pnt 2113 3805 Pnt 2700 3736 Pnt 2881 3751 Pnt 2149 3760 Pnt 3041 3792 Pnt 2873 3778 Pnt 2084 3801 Pnt 2328 3787 Pnt 2122 3814 Pnt 2167 3755 Pnt 2504 3815 Pnt 3325 3789 Pnt 3244 3761 Pnt 2235 3782 Pnt 3672 3806 Pnt 2576 3784 Pnt 3216 3764 Pnt 2832 3764 Pnt 2723 3763 Pnt 2786 3751 Pnt 2572 3807 Pnt 2639 3902 Pnt 2953 3759 Pnt 4043 3741 Pnt 3894 3759 Pnt 2608 3757 Pnt 4124 3760 Pnt 2301 3783 Pnt 2963 3016 Pnt 2626 3793 Pnt 3107 3748 Pnt 3881 3763 Pnt 3197 3743 Pnt 2934 3750 Pnt 2893 3754 Pnt 2830 3811 Pnt 3340 3778 Pnt 2556 3751 Pnt 2496 3776 Pnt 2625 3753 Pnt 2442 3777 Pnt 2722 3744 Pnt 2640 3757 Pnt 3994 2686 Pnt 2937 3794 Pnt 2772 3761 Pnt 2958 3755 Pnt 2715 3782 Pnt 3801 3745 Pnt 2349 3786 Pnt 2408 3822 Pnt 2358 3758 Pnt 2330 3758 Pnt 2624 3822 Pnt 3324 3775 Pnt 2642 3732 Pnt 2535 3746 Pnt 2362 3809 Pnt 2815 3787 Pnt 2153 3833 Pnt 3383 3838 Pnt 2913 3749 Pnt 2258 3822 Pnt 2663 3858 Pnt 2224 3800 Pnt 3076 3749 Pnt 4206 2810 Pnt 2611 3802 Pnt 2583 3800 Pnt 3109 3780 Pnt 2495 3774 Pnt 2991 3757 Pnt 3155 3757 Pnt 3138 3778 Pnt 2978 3752 Pnt 2719 3766 Pnt 2542 3815 Pnt 2568 3799 Pnt 2394 3771 Pnt 2644 3750 Pnt 2792 3814 Pnt 2485 3765 Pnt 2367 3839 Pnt 3394 3765 Pnt 2558 3750 Pnt 3298 3760 Pnt 2321 3761 Pnt 2968 3828 Pnt 3769 3752 Pnt 2477 3828 Pnt 2724 3819 Pnt 2556 3749 Pnt 3068 3767 Pnt 2311 3761 Pnt 2305 3753 Pnt 3007 3847 Pnt 3346 3769 Pnt 2229 3774 Pnt 3709 3754 Pnt 3155 3759 Pnt 2398 3771 Pnt 2032 3816 Pnt 3511 3747 Pnt 2729 3767 Pnt 2079 3786 Pnt 2817 3880 Pnt 3269 3736 Pnt 2022 3807 Pnt 2840 3758 Pnt 3097 3775 Pnt 2362 3792 Pnt 3663 3878 Pnt 2100 3777 Pnt 3087 3751 Pnt 2883 3741 Pnt 2164 3782 Pnt 1946 3798 Pnt 3964 3749 Pnt 2347 3779 Pnt 2565 3805 Pnt 2927 3754 Pnt 2678 3828 Pnt 2136 3749 Pnt 2232 3847 Pnt 3366 3754 Pnt 2971 3752 Pnt 2634 3757 Pnt 2295 3750 Pnt 3656 3761 Pnt 2840 2761 Pnt 2502 3808 Pnt 2612 3790 Pnt 2184 3808 Pnt 2975 3830 Pnt 3698 3746 Pnt 2439 3775 Pnt 2897 3782 Pnt 2737 3766 Pnt 1963 3838 Pnt 2666 3757 Pnt 2403 3744 Pnt 3023 3799 Pnt 2958 3825 Pnt 2488 3851 Pnt 2140 3803 Pnt 2399 3804 Pnt 3291 3780 Pnt 2934 3775 Pnt 2828 3851 Pnt 2624 3749 Pnt 2553 3764 Pnt 2364 3744 Pnt 2334 3787 Pnt 2548 3856 Pnt 3272 3798 Pnt 2247 3827 Pnt 2752 3765 Pnt 4119 3748 Pnt 2297 3802 Pnt 2816 3768 Pnt 2395 3817 Pnt 2035 3912 Pnt 2192 3819 Pnt 3641 3807 Pnt 2611 3747 Pnt 2092 3805 Pnt 2906 3840 Pnt 2070 3842 Pnt 2950 3855 Pnt 1966 3820 Pnt 2456 3782 Pnt 2487 3745 Pnt 3052 3757 Pnt 2192 3775 Pnt 3354 3782 Pnt 2494 3748 Pnt 2505 3754 Pnt 2003 3925 Pnt 3042 3750 Pnt 2808 3828 Pnt 2792 3762 Pnt 2567 3797 Pnt 2312 3805 Pnt 2732 3746 Pnt 2537 3766 Pnt 2650 3769 Pnt 3120 3766 Pnt 2528 3747 Pnt 2661 3757 Pnt 2730 3748 Pnt 2305 3807 Pnt 2749 3754 Pnt 3853 3767 Pnt 2671 3764 Pnt 3474 3754 Pnt 3011 3769 Pnt 2473 3775 Pnt 2844 3753 Pnt 3904 3764 Pnt 2257 3923 Pnt 2464 3757 Pnt 2086 3804 Pnt 2494 2593 Pnt 3091 3769 Pnt 2273 3771 Pnt 2852 3851 Pnt 2820 3804 Pnt 3429 3772 Pnt 2801 3772 Pnt 2379 3780 Pnt 2286 3762 Pnt 3080 3847 Pnt 2554 3772 Pnt 2446 3783 Pnt 2484 3766 Pnt 2792 3807 Pnt 2999 3814 Pnt 2889 3763 Pnt 2599 3760 Pnt 2368 3802 Pnt 2642 3799 Pnt 3366 3821 Pnt 2149 3812 Pnt 3803 3760 Pnt 2105 3780 Pnt 1941 3775 Pnt 2387 3750 Pnt 3823 3799 Pnt 3007 3806 Pnt 2661 3798 Pnt 2674 3770 Pnt 2132 3809 Pnt 1945 3786 Pnt 2451 3829 Pnt 2105 3753 Pnt 3495 3770 Pnt 2233 3796 Pnt 2517 3758 Pnt 2212 3804 Pnt 2256 3814 Pnt 2615 3768 Pnt 2471 3746 Pnt 3593 3755 Pnt 2454 3776 Pnt 2892 3820 Pnt 2586 3762 Pnt 2410 3783 Pnt 2833 3741 Pnt 3190 3757 Pnt 2604 3754 Pnt 2415 3743 Pnt 2094 3839 Pnt 2108 3780 Pnt 2812 3755 Pnt 2979 3741 Pnt 2577 3804 Pnt 2847 3756 Pnt 2657 3742 Pnt 2309 3771 Pnt 3734 3741 Pnt 3368 3771 Pnt 2506 3804 Pnt 2253 3796 Pnt 2128 3810 Pnt 2714 3776 Pnt 2738 3768 Pnt 3340 3755 Pnt 2764 3751 Pnt 2586 3832 Pnt 2440 3752 Pnt 2690 3811 Pnt 3446 3768 Pnt 1866 3819 Pnt 2807 3791 Pnt 2634 3755 Pnt 2983 3791 Pnt 2747 3761 Pnt 2419 3780 Pnt 4058 3750 Pnt 1980 3792 Pnt 2063 3825 Pnt 2433 3782 Pnt 2583 3772 Pnt 2516 3787 Pnt 4089 3782 Pnt 2809 3761 Pnt 2796 3781 Pnt 2108 3747 Pnt 3016 3750 Pnt 2864 3781 Pnt 2839 3740 Pnt 2566 3904 Pnt 2805 3747 Pnt 2831 3819 Pnt 4033 2888 Pnt 2589 3781 Pnt 2310 3771 Pnt 2828 2881 Pnt 2486 3820 Pnt 2231 3834 Pnt 2121 3753 Pnt 2571 3803 Pnt 2710 3805 Pnt 4246 3765 Pnt 3859 3798 Pnt 2783 2932 Pnt 3726 3746 Pnt 2593 3815 Pnt 3332 3807 Pnt 3241 3815 Pnt 2784 3771 Pnt 2980 3757 Pnt 2374 3934 Pnt 3453 3763 Pnt 2713 3748 Pnt 2954 3939 Pnt 2703 3767 Pnt 3232 3748 Pnt 4084 3755 Pnt 3882 3775 Pnt 2918 3797 Pnt 2382 3799 Pnt 2268 3784 Pnt 2296 3807 Pnt 3155 3807 Pnt 3694 3788 Pnt 2465 3794 Pnt 2990 3794 Pnt 3930 3758 Pnt 2578 3760 Pnt 2317 3741 Pnt 2859 3759 Pnt 2714 3803 Pnt 2619 3747 Pnt 3870 3756 Pnt 3694 3803 Pnt 2432 3755 Pnt 1893 3795 Pnt 4136 3758 Pnt 2902 3816 Pnt 2734 3807 Pnt 3023 3746 Pnt 2614 3743 Pnt 2451 3742 Pnt 3657 3752 Pnt 3090 3743 Pnt 2530 3807 Pnt 2179 3799 Pnt 2977 3768 Pnt 2887 3765 Pnt 3107 3758 Pnt 2438 3844 Pnt 2945 3751 Pnt 3998 3758 Pnt 2854 3764 Pnt 2665 3748 Pnt 2445 3805 Pnt 1961 3812 Pnt 3765 3753 Pnt 1951 3787 Pnt 2715 3757 Pnt 2516 3756 Pnt 1951 3818 Pnt 2214 3772 Pnt 3875 3757 Pnt 2533 3745 Pnt 2585 3777 Pnt 2518 3762 Pnt 3271 3745 Pnt 2134 3825 Pnt 3199 3749 Pnt 2962 3760 Pnt 3999 3772 Pnt 3037 3762 Pnt 3094 3751 Pnt 4233 3764 Pnt 3540 3745 Pnt 2334 3816 Pnt 3167 3758 Pnt 3160 3746 Pnt 2446 3778 Pnt 1990 3796 Pnt 3002 3895 Pnt 2692 3790 Pnt 2815 3796 Pnt 2748 3756 Pnt 2974 3743 Pnt 2297 3839 Pnt 2724 3753 Pnt 1940 3806 Pnt 2624 3773 Pnt 2579 3807 Pnt 2356 3753 Pnt 2478 3759 Pnt 2453 3797 Pnt 2488 3782 Pnt 3432 3768 Pnt 3476 3807 Pnt 2880 3797 Pnt 2190 3748 Pnt 2210 3806 Pnt 3080 3778 Pnt 3043 3766 Pnt 2575 3854 Pnt 3007 3748 Pnt 2490 3775 Pnt 4024 2748 Pnt 2321 3777 Pnt 2547 3788 Pnt 2535 2929 Pnt 2377 3868 Pnt 3808 3778 Pnt 2940 3745 Pnt 2933 3814 Pnt 3477 3765 Pnt 2725 3773 Pnt 2122 3761 Pnt 2277 3805 Pnt 2388 3751 Pnt 3254 3751 Pnt 2470 3823 Pnt 3719 3752 Pnt 2926 3805 Pnt 2972 3782 Pnt 2626 3743 Pnt 2946 3749 Pnt 2838 3752 Pnt 2655 3752 Pnt 3016 3750 Pnt 2468 3760 Pnt 3013 3737 Pnt 2543 3792 Pnt 2973 3750 Pnt 2234 3772 Pnt 2580 3832 Pnt 3148 3803 Pnt 2280 3819 Pnt 4158 3759 Pnt 2834 3751 Pnt 2811 3790 Pnt 3065 3762 Pnt 2866 3774 Pnt 3567 3762 Pnt 2763 3767 Pnt 3042 3796 Pnt 4108 3803 Pnt 2237 3783 Pnt 2992 3771 Pnt 3052 3783 Pnt 2609 3767 Pnt 2504 3767 Pnt 3891 3778 Pnt 3702 3764 Pnt 2962 3763 Pnt 2994 3774 Pnt 3689 3757 Pnt 3061 3761 Pnt 3794 3751 Pnt 3241 3750 Pnt 2359 3789 Pnt 3761 3749 Pnt 3585 3774 Pnt 3338 3770 Pnt 2482 3835 Pnt 3153 3750 Pnt 2670 3776 Pnt 2441 3801 Pnt 2536 3794 Pnt 1912 3771 Pnt 2246 3800 Pnt 3156 3782 Pnt 2128 3840 Pnt 3813 3753 Pnt 3679 3800 Pnt 3006 3774 Pnt 2804 3826 Pnt 2558 3752 Pnt 2322 3789 Pnt 3237 3752 Pnt 3083 3750 Pnt 2725 3784 Pnt 3554 3771 Pnt 2982 3762 Pnt 2577 3776 Pnt 2919 3835 Pnt 3573 3784 Pnt 2059 3766 Pnt 3156 3758 Pnt 2585 3819 Pnt 2350 3773 Pnt 2285 3753 Pnt 3381 3754 Pnt 2195 3775 Pnt 2917 3804 Pnt 3377 3747 Pnt 2910 3745 Pnt 2420 3746 Pnt 3942 3760 Pnt 1931 3798 Pnt 3896 3749 Pnt 3387 3745 Pnt 2414 3766 Pnt 2216 3758 Pnt 2426 3784 Pnt 3437 3738 Pnt 2838 3793 Pnt 2557 3774 Pnt 2088 3808 Pnt 3068 3784 Pnt 2825 3768 Pnt 2617 3740 Pnt 3017 3790 Pnt 2462 3800 Pnt 2621 3826 Pnt 2175 3828 Pnt 2928 3793 Pnt 2559 3789 Pnt 3601 3804 Pnt 3684 3745 Pnt 2790 3742 Pnt 2804 3826 Pnt 3012 3770 Pnt 2594 3765 Pnt 2647 3742 Pnt 2844 3766 Pnt 2914 3767 Pnt 3414 3782 Pnt 3601 3753 Pnt 2704 3898 Pnt 2027 3793 Pnt 3255 3760 Pnt 2826 3754 Pnt 2677 3761 Pnt 2319 3797 Pnt 3211 3814 Pnt 2257 3758 Pnt 3002 3778 Pnt 2138 3866 Pnt 2953 3844 Pnt 2333 3838 Pnt 3784 3866 Pnt 3109 3753 Pnt 2752 3747 Pnt 2182 3822 Pnt 2543 3786 Pnt 2597 3773 Pnt 2495 3810 Pnt 4122 2872 Pnt 2658 3811 Pnt 2389 3790 Pnt 3027 3746 Pnt 3689 3772 Pnt 2598 3820 Pnt 3462 3790 Pnt 2410 3744 Pnt 2113 3834 Pnt 2546 3804 Pnt 2940 3742 Pnt 2314 3829 Pnt 2877 3804 Pnt 3326 3757 Pnt 2469 3829 Pnt 2272 3897 Pnt 2410 3757 Pnt 2135 3799 Pnt 2601 3822 Pnt 2681 3814 Pnt 2805 3762 Pnt 1909 3805 Pnt 2967 3793 Pnt 2705 3770 Pnt 3177 3756 Pnt 2433 3840 Pnt 1971 3828 Pnt 3630 3767 Pnt 4039 3799 Pnt 2438 3758 Pnt 2298 3744 Pnt 2775 3836 Pnt 2405 3775 Pnt 2613 3774 Pnt 3405 3756 Pnt 3117 3763 Pnt 2578 3780 Pnt 3093 3756 Pnt 3098 3780 Pnt 2858 3801 Pnt 2679 3742 Pnt 2217 3807 Pnt 2768 3743 Pnt 3215 3747 Pnt 2791 3742 Pnt 2248 3801 Pnt 3414 3801 Pnt 2338 3771 Pnt 2400 3799 Pnt 3433 3796 Pnt 2603 3769 Pnt 3109 3757 Pnt 2431 3814 Pnt 3073 3771 Pnt 2576 3815 Pnt 2610 3776 Pnt 2482 3782 Pnt 2885 3764 Pnt 2194 3787 Pnt 2794 3751 Pnt 3326 3754 Pnt 2561 3851 Pnt 2897 3792 Pnt 3208 3787 Pnt 2815 3770 Pnt 2549 3781 Pnt 1951 3821 Pnt 3160 3755 Pnt 2731 3765 Pnt 2611 3746 Pnt 2499 3767 Pnt 3361 3754 Pnt 2317 3798 Pnt 3167 3754 Pnt 3436 3777 Pnt 3297 3779 Pnt 3792 3754 Pnt 2817 3751 Pnt 2434 3784 Pnt 2656 3752 Pnt 2869 3773 Pnt 3159 3749 Pnt 2649 3775 Pnt 2490 3748 Pnt 2859 3753 Pnt 2343 3755 Pnt 2049 3791 Pnt 2246 3780 Pnt 3676 3760 Pnt 2957 3789 Pnt 2479 3879 Pnt 2179 3801 Pnt 2228 3803 Pnt 3288 3757 Pnt 2609 3750 Pnt 2208 3807 Pnt 2673 3794 Pnt 2783 3792 Pnt 3012 3766 Pnt 2210 3748 Pnt 2246 3791 Pnt 2673 3825 Pnt 2197 3873 Pnt 2667 3744 Pnt 2476 3834 Pnt 3958 3754 Pnt 3696 3752 Pnt 3078 3757 Pnt 2286 3738 Pnt 3393 3752 Pnt 3319 3744 Pnt 2754 3782 Pnt 2845 3737 Pnt 2702 3770 Pnt 2519 3759 Pnt 2864 3774 Pnt 2129 3767 Pnt 3133 3762 Pnt 2779 3751 Pnt 2678 3798 Pnt 2384 3761 Pnt 2972 3751 Pnt 3285 3780 Pnt 2572 3791 Pnt 2320 3806 Pnt 2454 3784 Pnt 2586 3871 Pnt 2554 3828 Pnt 3762 3813 Pnt 3018 3743 Pnt 2781 3755 Pnt 2709 3802 Pnt 3020 3744 Pnt 2798 3757 Pnt 2472 3827 Pnt 4156 3764 Pnt 2736 3757 Pnt 2458 3800 Pnt 3175 3802 Pnt 2908 3742 Pnt 2354 2787 Pnt 2647 3761 Pnt 3406 3755 Pnt 2598 3745 Pnt 3044 3768 Pnt 2270 3877 Pnt 2802 3833 Pnt 3368 3755 Pnt 2541 3800 Pnt 2610 3758 Pnt 2666 3744 Pnt 3199 3768 Pnt 2713 3826 Pnt 2441 3750 Pnt 3292 3762 Pnt 2653 3804 Pnt 2559 3836 Pnt 3741 3826 Pnt 3091 3760 Pnt 2297 3785 Pnt 2124 3746 Pnt 2345 3746 Pnt 3792 3785 Pnt 2806 3765 Pnt 2324 3783 Pnt 2520 3860 Pnt 2974 3763 Pnt 2350 3808 Pnt 2802 3747 Pnt 4010 3754 Pnt 2933 3747 Pnt 2572 3749 Pnt 2861 3858 Pnt 2486 3761 Pnt 2683 3794 Pnt 3914 3761 Pnt 2601 3804 Pnt 3153 3747 Pnt 2512 3808 Pnt 2499 3803 Pnt 3019 3808 Pnt 3318 3791 Pnt 2474 3781 Pnt 2516 3746 Pnt 2202 3797 Pnt 3323 3762 Pnt 3237 3773 Pnt 3025 3762 Pnt 2494 3771 Pnt 4239 3764 Pnt 3753 3788 Pnt 3015 3748 Pnt 3466 3771 Pnt 2908 3753 Pnt 3060 3754 Pnt 2610 3784 Pnt 2791 3784 Pnt 2783 3809 Pnt 2521 3747 Pnt 3512 2887 Pnt 2552 3794 Pnt 2214 3810 Pnt 2282 3826 Pnt 3299 3769 Pnt 3783 3792 Pnt 2511 3784 Pnt 2781 3780 Pnt 3426 3742 Pnt 2551 3747 Pnt 3127 3777 Pnt 2970 3776 Pnt 2467 3750 Pnt 2646 3792 Pnt 2625 3748 Pnt 3903 3742 Pnt 3745 3750 Pnt 3001 3751 Pnt 2647 3747 Pnt 2143 3831 Pnt 3106 3751 Pnt 2264 3765 Pnt 3184 3825 Pnt 2432 3739 Pnt 2910 3810 Pnt 2038 3831 Pnt 2592 3795 Pnt 2249 3804 Pnt 2134 3832 Pnt 3708 3810 Pnt 2874 3762 Pnt 2622 3758 Pnt 2972 3831 Pnt 2584 3767 Pnt 2055 3811 Pnt 2041 3754 Pnt 2476 3811 Pnt 2096 3781 Pnt 2233 3799 Pnt 3391 3818 Pnt 2154 3798 Pnt 2446 3750 Pnt 2532 3850 Pnt 2183 3764 Pnt 1923 3800 Pnt 3273 3764 Pnt 2116 3842 Pnt 2681 3781 Pnt 2564 3750 Pnt 2448 3768 Pnt 3833 3753 Pnt 2933 3764 Pnt 3301 3742 Pnt 4431 3773 Pnt 4096 3788 Pnt 2156 3824 Pnt 2665 3754 Pnt 2913 3752 Pnt 2608 3850 Pnt 2229 3744 Pnt 3126 3756 Pnt 3498 3762 Pnt 2432 3850 Pnt 3119 3754 Pnt 2019 3805 Pnt 2635 3752 Pnt 2866 3760 Pnt 2554 3759 Pnt 2429 3754 Pnt 2101 3778 Pnt 3160 3760 Pnt 2488 3766 Pnt 3210 3745 Pnt 3078 3753 Pnt 3117 3776 Pnt 2869 3745 Pnt 2491 3932 Pnt 3917 3762 Pnt 2866 3769 Pnt 2555 3754 Pnt 3007 3741 Pnt 3301 3753 Pnt 2590 3785 Pnt 2890 3741 Pnt 3419 3754 Pnt 3077 3757 Pnt 2004 3788 Pnt 2859 3785 Pnt 2670 3806 Pnt 2398 3812 Pnt 2722 3753 Pnt 2473 3757 Pnt 2609 3774 Pnt 2094 3808 Pnt 3637 3752 Pnt 2505 3784 Pnt 3011 3757 Pnt 2512 3756 Pnt 2456 3759 Pnt 2432 3743 Pnt 2213 3837 Pnt 2947 3822 Pnt 2594 3759 Pnt 2784 3732 Pnt 3247 3837 Pnt 3681 3822 Pnt 2744 3747 Pnt 2435 3745 Pnt 1796 3745 Pnt 3010 3764 Pnt 2735 3750 Pnt 2373 3800 Pnt 2298 3819 Pnt 2172 3759 Pnt 2225 3935 Pnt 2382 3797 Pnt 2981 3745 Pnt 2681 3747 Pnt 2629 3760 Pnt 1996 3780 Pnt 3134 3795 Pnt 3169 3817 Pnt 2564 3770 Pnt 3230 3760 Pnt 2108 3765 Pnt 3006 3763 Pnt 2896 3796 Pnt 2053 3766 Pnt 2620 3765 Pnt 2495 3851 Pnt 2472 3763 Pnt 3199 3766 Pnt 2646 3763 Pnt 2484 3811 Pnt 2677 3766 Pnt 2950 3765 Pnt 2304 3779 Pnt 3432 3772 Pnt 3937 3748 Pnt 3919 3765 Pnt 2851 3810 Pnt 2991 3731 Pnt 3551 2746 Pnt 3422 3753 Pnt 3177 3784 Pnt 3851 3784 Pnt 2592 3783 Pnt 3358 3798 Pnt 2465 3818 Pnt 3282 3780 Pnt 3722 3758 Pnt 2831 3794 Pnt 2902 3810 Pnt 2856 3771 Pnt 4072 3810 Pnt 3059 3769 Pnt 2468 3801 Pnt 2883 3764 Pnt 3146 3816 Pnt 2764 3755 Pnt 3269 3792 Pnt 3740 3741 Pnt 2965 3792 Pnt 4079 2768 Pnt 2454 3762 Pnt 2759 3794 Pnt 3131 3751 Pnt 2875 3749 Pnt 2804 3746 Pnt 2567 3830 Pnt 3387 3789 Pnt 2556 3816 Pnt 2448 3749 Pnt 3332 3749 Pnt 3288 3749 Pnt 2282 3804 Pnt 2353 3751 Pnt 2202 3789 Pnt 2553 3806 Pnt 2207 3748 Pnt 2676 3823 Pnt 2754 3790 Pnt 2765 3770 Pnt 2006 3803 Pnt 3669 3784 Pnt 2054 3821 Pnt 3276 3769 Pnt 3112 3769 Pnt 1949 3745 Pnt 2913 3757 Pnt 3196 3769 Pnt 2365 3808 Pnt 2469 3772 Pnt 2889 3755 Pnt 2309 3804 Pnt 3058 3847 Pnt 2412 3760 Pnt 3050 3755 Pnt 4049 3753 Pnt 2824 3819 Pnt 3927 3748 Pnt 2133 3819 Pnt 3024 3768 Pnt 2433 3744 Pnt 2871 3819 Pnt 2031 3941 Pnt 2920 3754 Pnt 3646 3765 Pnt 2067 3785 Pnt 2360 3750 Pnt 3108 3761 Pnt 2333 3768 Pnt 2721 3794 Pnt 2137 3814 Pnt 3206 3750 Pnt 2807 3757 Pnt 2612 3773 Pnt 3748 3743 Pnt 2569 3776 Pnt 2699 3756 Pnt 3402 3785 Pnt 2883 3742 Pnt 2945 3776 Pnt 2428 3761 Pnt 2718 3785 Pnt 2374 3772 Pnt 3055 3774 Pnt 3013 3756 Pnt 3436 3807 Pnt 2806 3753 Pnt 2682 3747 Pnt 2914 3803 Pnt 2879 3756 Pnt 2464 3805 Pnt 3126 3764 Pnt 2882 3764 Pnt 3012 3749 Pnt 3829 3756 Pnt 2871 3818 Pnt 4071 3787 Pnt 3320 3749 Pnt 2980 3737 Pnt 3893 3747 Pnt 2521 3810 Pnt 3466 3743 Pnt 2976 3749 Pnt 2810 3808 Pnt 2496 3760 Pnt 2526 3763 Pnt 2895 3786 Pnt 2926 3772 Pnt 3523 3757 Pnt 2872 3810 Pnt 2698 3810 Pnt 2454 3775 Pnt 2552 3796 Pnt 2470 3767 Pnt 3919 3767 Pnt 2221 3772 Pnt 3195 3771 Pnt 2097 3802 Pnt 2741 3754 Pnt 3384 3764 Pnt 2639 3782 Pnt 3860 3817 Pnt 2276 3800 Pnt 3865 3745 Pnt 2985 3770 Pnt 2371 3822 Pnt 2738 3764 Pnt 3239 3744 Pnt 2721 3791 Pnt 2971 3768 Pnt 2903 3767 Pnt 2793 3751 Pnt 2592 3858 Pnt 2567 3799 Pnt 2040 3756 Pnt 2771 3768 Pnt 3031 3793 Pnt 2975 3778 Pnt 2748 3762 Pnt 2766 3767 Pnt 2664 3741 Pnt 2406 3774 Pnt 2582 3756 Pnt 2530 3806 Pnt 3101 3741 Pnt 2874 3774 Pnt 2638 3858 Pnt 2384 3751 Pnt 2276 3819 Pnt 2448 3809 Pnt 2768 3743 Pnt 3249 3751 Pnt 2488 3774 Pnt 2795 3756 Pnt 2924 3765 Pnt 3628 3762 Pnt 2718 3786 Pnt 3190 3773 Pnt 2222 3797 Pnt 2262 3774 Pnt 3116 3759 Pnt 2330 3747 Pnt 2814 3782 Pnt 3106 3798 Pnt 2422 3754 Pnt 2460 3804 Pnt 2160 3747 Pnt 2985 3782 Pnt 3771 3747 Pnt 2905 3832 Pnt 2913 3753 Pnt 3161 3775 Pnt 2456 3764 Pnt 3106 3753 Pnt 1976 3809 Pnt 3027 3759 Pnt 2195 3782 Pnt 2816 3771 Pnt 3439 3832 Pnt 2788 3771 Pnt 3023 3747 Pnt 2505 3770 Pnt 2424 3783 Pnt 2069 3798 Pnt 2945 3757 Pnt 2349 3801 Pnt 2312 3752 Pnt 3887 3794 Pnt 3393 3756 Pnt 2889 3751 Pnt 3199 3760 Pnt 2897 3812 Pnt 2201 3807 Pnt 4087 3773 Pnt 4116 3757 Pnt 3476 3763 Pnt 2465 3762 Pnt 3149 3763 Pnt 2269 3820 Pnt 2372 3762 Pnt 3085 3814 Pnt 3454 3779 Pnt 2588 3756 Pnt 2058 3770 Pnt 2456 3799 Pnt 2249 3828 Pnt 2271 3799 Pnt 2486 3772 Pnt 3459 3799 Pnt 3212 3741 Pnt 2439 3806 Pnt 2802 2548 Pnt 2315 3767 Pnt 2835 3943 Pnt 2039 3829 Pnt 2724 3751 Pnt 3455 3760 Pnt 2794 3751 Pnt 2284 3816 Pnt 2907 3822 Pnt 3515 3751 Pnt 2689 3763 Pnt 2324 3803 Pnt 3340 3828 Pnt 2623 3775 Pnt 2751 3809 Pnt 2508 3754 Pnt 3032 3838 Pnt 2819 3739 Pnt 2483 3867 Pnt 2762 3751 Pnt 2220 3833 Pnt 3918 3775 Pnt 2645 3751 Pnt 3721 3838 Pnt 2505 3741 Pnt 3242 3787 Pnt 2330 3787 Pnt 2837 3749 Pnt 2785 3746 Pnt 2669 3811 Pnt 2992 3749 Pnt 2637 3827 Pnt 2454 3774 Pnt 2724 3845 Pnt 3034 3757 Pnt 2687 3743 Pnt 3299 3747 Pnt 2134 3760 Pnt 2198 3819 Pnt 2866 3755 Pnt 2860 3787 Pnt 2639 3845 Pnt 2122 3819 Pnt 3025 3815 Pnt 2607 3766 Pnt 4328 3768 Pnt 2369 3813 Pnt 2674 3752 Pnt 2523 3776 Pnt 2414 3771 Pnt 2598 3805 Pnt 3886 3819 Pnt 2868 3751 Pnt 2587 3764 Pnt 2876 3770 Pnt 2642 3786 Pnt 2582 3771 Pnt 2291 3802 Pnt 2689 3746 Pnt 2563 3839 Pnt 2506 3776 Pnt 2606 3829 Pnt 4571 3777 Pnt 2582 3840 Pnt 2135 3792 Pnt 2777 3777 Pnt 2144 3786 Pnt 2137 3807 Pnt 3089 3750 Pnt 3003 3855 Pnt 2641 3745 Pnt 2552 3812 Pnt 2309 3902 Pnt 2154 3757 Pnt 2244 3745 Pnt 2426 3805 Pnt 2831 3749 Pnt 2139 3848 Pnt 2946 3764 Pnt 2740 3759 Pnt 3899 3746 Pnt 2878 3757 Pnt 3188 3848 Pnt 2524 3753 Pnt 2863 3754 Pnt 2363 3783 Pnt 2903 3804 Pnt 2341 3798 Pnt 2455 3754 Pnt 4085 3777 Pnt 2187 3838 Pnt 3168 3793 Pnt 3396 3838 Pnt 2961 3757 Pnt 3306 2819 Pnt 2936 3793 Pnt 2035 3816 Pnt 3146 2672 Pnt 2970 3769 Pnt 2797 3747 Pnt 2839 3800 Pnt 2203 3786 Pnt 2626 3806 Pnt 3118 3769 Pnt 2557 3754 Pnt 2815 3759 Pnt 2432 3798 Pnt 2318 3736 Pnt 2885 3750 Pnt 2503 3825 Pnt 3540 3737 Pnt 2588 3824 Pnt 2345 3774 Pnt 3543 3825 Pnt 2652 3824 Pnt 2501 3774 Pnt 4317 3766 Pnt 1988 3813 Pnt 3231 3756 Pnt 2468 3753 Pnt 1995 3804 Pnt 2559 3804 Pnt 4281 3740 Pnt 3309 3753 Pnt 2187 3800 Pnt 3104 3764 Pnt 2825 3746 Pnt 2626 3764 Pnt 2581 3746 Pnt 2348 3768 Pnt 2564 3766 Pnt 2947 3762 Pnt 2458 3758 Pnt 4094 3742 Pnt 3579 3748 Pnt 2453 3797 Pnt 4014 3754 Pnt 3394 3756 Pnt 2592 3805 Pnt 2035 3766 Pnt 2713 3746 Pnt 3697 3772 Pnt 3802 3747 Pnt 3225 3878 Pnt 3196 3749 Pnt 2639 3754 Pnt 2868 3808 Pnt 3654 3761 Pnt 2084 3832 Pnt 2839 3780 Pnt 2049 3805 Pnt 3383 3757 Pnt 2488 3746 Pnt 2692 3767 Pnt 2623 3757 Pnt 2157 3791 Pnt 2091 3847 Pnt 2833 3805 Pnt 2786 3830 Pnt 2899 3754 Pnt 2344 3775 Pnt 3569 3764 Pnt 3849 3750 Pnt 3921 3751 Pnt 2544 3799 Pnt 2882 3821 Pnt 2318 3766 Pnt 2780 3828 Pnt 3867 3754 Pnt 2551 3750 Pnt 2394 3851 Pnt 4362 3808 Pnt 2178 3834 Pnt 2088 3803 Pnt 2081 3804 Pnt 3756 3751 Pnt 3724 3829 Pnt 3099 3803 Pnt 2104 3836 Pnt 3477 3748 Pnt 2989 3829 Pnt 2499 3775 Pnt 2984 3804 Pnt 3861 2934 Pnt 2649 3772 Pnt 2048 3805 Pnt 2322 3796 Pnt 2481 3775 Pnt 2638 3748 Pnt 2717 3769 Pnt 2145 3771 Pnt 2102 3753 Pnt 2677 3805 Pnt 2754 3765 Pnt 2394 3925 Pnt 1974 3820 Pnt 2665 3768 Pnt 3427 3851 Pnt 2500 3856 Pnt 3065 3762 Pnt 3020 3780 Pnt 2544 3774 Pnt 2757 3787 Pnt 2771 3828 Pnt 2045 3807 Pnt 3284 3807 Pnt 3168 3770 Pnt 2489 3842 Pnt 4170 3755 Pnt 2696 3782 Pnt 3108 3790 Pnt 2872 3749 Pnt 2446 3735 Pnt 3709 3808 Pnt 3150 3753 Pnt 4131 3775 Pnt 2638 3759 Pnt 1933 3750 Pnt 2181 3815 Pnt 3037 3807 Pnt 2856 3783 Pnt 2520 3757 Pnt 3546 3753 Pnt 2671 3807 Pnt 2835 3771 Pnt 4078 2727 Pnt 3307 3757 Pnt 3308 3764 Pnt 3013 3763 Pnt 3254 3769 Pnt 2230 3804 Pnt 2067 3810 Pnt 3545 3772 Pnt 2401 3808 Pnt 2639 3807 Pnt 1998 3807 Pnt 3540 3741 Pnt 2692 3856 Pnt 2435 3776 Pnt 2009 3827 Pnt 3048 3778 Pnt 2368 3780 Pnt 2263 3794 Pnt 2368 3796 Pnt 3391 3778 Pnt 2508 3788 Pnt 2241 3804 Pnt 3437 3741 Pnt 3151 3798 Pnt 2705 3782 Pnt 2617 3792 Pnt 2624 3759 Pnt 2557 2437 Pnt 2528 3802 Pnt 2883 3792 Pnt 2558 3787 Pnt 4062 3759 Pnt 2376 3756 Pnt 2978 3747 Pnt 2547 3804 Pnt 2276 3743 Pnt 2824 3759 Pnt 2562 3754 Pnt 1891 3795 Pnt 3299 3759 Pnt 2886 3758 Pnt 3818 3744 Pnt 2444 3747 Pnt 2220 3777 Pnt 3281 3765 Pnt 2824 3798 Pnt 2576 3747 Pnt 3109 3768 Pnt 2584 3747 Pnt 2369 3825 Pnt 3926 3748 Pnt 2891 3771 Pnt 2018 3776 Pnt 2749 3764 Pnt 2588 3817 Pnt 2398 3868 Pnt 2403 3804 Pnt 3277 3742 Pnt 2555 3811 Pnt 3360 3796 Pnt 4015 3752 Pnt 2972 3760 Pnt 2889 3802 Pnt 2499 3781 Pnt 3240 3743 Pnt 3628 3739 Pnt 2791 3759 Pnt 2775 3751 Pnt 2327 3811 Pnt 2589 3805 Pnt 2027 3816 Pnt 2050 3895 Pnt 2222 3796 Pnt 3182 3755 Pnt 4255 3768 Pnt 2559 3756 Pnt 3564 3746 Pnt 3231 3795 Pnt 3150 3742 Pnt 2879 3797 Pnt 2812 3760 Pnt 2417 3825 Pnt 2185 3775 Pnt 2645 3748 Pnt 2135 3761 Pnt 2673 3757 Pnt 2198 3777 Pnt 2386 3782 Pnt 2880 3757 Pnt 2156 3939 Pnt 2404 3787 Pnt 2339 3741 Pnt 4109 3741 Pnt 2651 3781 Pnt 2628 3794 Pnt 2591 3789 Pnt 2816 3788 Pnt 2792 3752 Pnt 3064 2867 Pnt 3024 3763 Pnt 4172 3775 Pnt 2454 3743 Pnt 2244 3904 Pnt 2507 3743 Pnt 2478 3807 Pnt 3636 3772 Pnt 3500 3743 Pnt 2875 3741 Pnt 2339 3797 Pnt 3087 3764 Pnt 2736 3741 Pnt 2442 3771 Pnt 1801 3799 Pnt 3835 3796 Pnt 4330 3752 Pnt 2410 3820 Pnt 3546 3765 Pnt 2750 3736 Pnt 2811 2954 Pnt 2301 3770 Pnt 3042 3788 Pnt 2295 3917 Pnt 2480 3835 Pnt 1912 3795 Pnt 3422 3917 Pnt 3729 3756 Pnt 2815 3782 Pnt 3444 3768 Pnt 2396 3770 Pnt 2384 3745 Pnt 2113 3794 Pnt 3453 3763 Pnt 3092 3791 Pnt 2659 3745 Pnt 3587 3763 Pnt 2404 3790 Pnt 3331 3802 Pnt 3245 3804 Pnt 3119 3816 Pnt 2201 3800 Pnt 3383 3816 Pnt 3174 3817 Pnt 3185 3780 Pnt 3037 3746 Pnt 2318 3839 Pnt 3562 3749 Pnt 2246 3844 Pnt 3165 3750 Pnt 3173 3753 Pnt 2981 3776 Pnt 2872 3758 Pnt 2408 3851 Pnt 3714 3750 Pnt 2729 3787 Pnt 2567 3755 Pnt 2868 3818 Pnt 3801 3787 Pnt 3637 3758 Pnt 3104 3757 Pnt 3846 3747 Pnt 2785 3765 Pnt 3464 3751 Pnt 2838 3758 Pnt 2654 3765 Pnt 3864 2813 Pnt 2337 3789 Pnt 2525 3799 Pnt 2126 3822 Pnt 2628 2781 Pnt 2537 3833 Pnt 2638 3771 Pnt 2727 3773 Pnt 2408 3779 Pnt 3654 3740 Pnt 2518 3774 Pnt 3376 3767 Pnt 2710 3762 Pnt 2236 3766 Pnt 3873 3742 Pnt 3051 3779 Pnt 3462 3767 Pnt 2043 3808 Pnt 2933 3773 Pnt 2332 3753 Pnt 1898 3773 Pnt 3567 3756 Pnt 2492 3840 Pnt 3162 3750 Pnt 3182 3765 Pnt 3373 3768 Pnt 2602 3790 Pnt 3846 3764 Pnt 3903 3768 Pnt 2734 3773 Pnt 2511 3767 Pnt 3575 3779 Pnt 2243 3867 Pnt 2980 3773 Pnt 2821 3773 Pnt 2229 3738 Pnt 2698 3749 Pnt 2446 3783 Pnt 3326 3749 Pnt 2574 3804 Pnt 2653 3767 Pnt 3186 3770 Pnt 2022 3793 Pnt 2511 3743 Pnt 3936 3749 Pnt 4297 3804 Pnt 4614 3777 Pnt 1968 3798 Pnt 2702 3798 Pnt 2972 3814 Pnt 3358 3774 Pnt 2985 3783 Pnt 3236 3752 Pnt 2642 3753 Pnt 2394 3760 Pnt 2929 3765 Pnt 2499 3753 Pnt 2595 3778 Pnt 3255 3813 Pnt 2560 3773 Pnt 3236 3760 Pnt 2287 3778 Pnt 2956 3755 Pnt 2726 3761 Pnt 2159 3820 Pnt 3022 3757 Pnt 2499 3866 Pnt 2859 3761 Pnt 2157 3804 Pnt 3337 3866 Pnt 2738 3793 Pnt 2540 3844 Pnt 2600 3774 Pnt 3502 3753 Pnt 2012 3822 Pnt 2631 3812 Pnt 3128 3793 Pnt 2809 3826 Pnt 3050 3761 Pnt 2744 3753 Pnt 2295 3810 Pnt 2726 3790 Pnt 3332 2789 Pnt 2687 3758 Pnt 2979 3790 Pnt 2511 3804 Pnt 2436 3752 Pnt 2808 3780 Pnt 2077 3789 Pnt 2771 3800 Pnt 2713 3746 Pnt 2974 3768 Pnt 2471 3757 Pnt 3137 3768 Pnt 2442 3740 Pnt 2357 3840 Pnt 3185 3742 Pnt 2926 3814 Pnt 3883 3838 Pnt 2759 3901 Pnt 1949 3770 Pnt 2922 3750 Pnt 2650 3771 Pnt 1972 3805 Pnt 2548 3749 Pnt 3688 3901 Pnt 2328 3838 Pnt 2245 3744 Pnt 2621 3784 Pnt 3135 3749 Pnt 2486 3761 Pnt 3172 3796 Pnt 2681 3761 Pnt 3368 3787 Pnt 2397 3808 Pnt 2920 3747 Pnt 2891 3835 Pnt 2805 3803 Pnt 3373 3764 Pnt 2723 3789 Pnt 2551 3816 Pnt 2151 3787 Pnt 3442 3778 Pnt 2580 3823 Pnt 2853 3772 Pnt 3532 3788 Pnt 2573 3746 Pnt 3376 3777 Pnt 3990 3772 Pnt 2552 3748 Pnt 2033 3829 Pnt 2432 3767 Pnt 3442 3762 Pnt 2303 3897 Pnt 2982 3828 Pnt 2857 3754 Pnt 3214 3745 Pnt 2910 3779 Pnt 2544 3810 Pnt 3755 2776 Pnt 1959 3798 Pnt 3287 3741 Pnt 2961 3784 Pnt 2863 3763 Pnt 2924 3751 Pnt 2568 3774 Pnt 4526 3744 Pnt 2089 3800 Pnt 2699 3751 Pnt 2225 3781 Pnt 3337 3784 Pnt 2775 3780 Pnt 2466 3758 Pnt 3152 3795 Pnt 2070 3804 Pnt 2444 3826 Pnt 2806 3759 Pnt 2783 3805 Pnt 2914 3836 Pnt 2770 3759 Pnt 2578 3802 Pnt 2343 3849 Pnt 2793 3802 Pnt 2239 3800 Pnt 3886 3757 Pnt 2961 3774 Pnt 2453 3750 Pnt 3544 3763 Pnt 2265 3793 Pnt 3617 3782 Pnt 2928 3787 Pnt 3112 3756 Pnt 3649 3764 Pnt 2634 3810 Pnt 3314 3754 Pnt 2812 3810 Pnt 3118 3763 Pnt 2219 3744 Pnt 2899 3748 Pnt 2787 3798 Pnt 3342 3748 Pnt 3558 3744 Pnt 3470 3747 Pnt 2917 3761 Pnt 3096 3804 Pnt 2755 3758 Pnt 2831 3743 Pnt 2475 3871 Pnt 2144 3801 Pnt 4058 3756 Pnt 3421 2301 Pnt 2002 3797 Pnt 3070 3747 Pnt 2200 3804 Pnt 2940 3743 Pnt 2261 3801 Pnt 2885 3776 Pnt 2421 3757 Pnt 2525 3781 Pnt 2879 3826 Pnt 2166 3784 Pnt 2681 3810 Pnt 2677 3756 Pnt 3761 3825 Pnt 2860 3784 Pnt 2388 3858 Pnt 2590 3762 Pnt 3054 3758 Pnt 2207 3826 Pnt 2775 3754 Pnt 3343 3787 Pnt 2728 3799 Pnt 2394 3822 Pnt 2556 3770 Pnt 3759 3756 Pnt 2188 3775 Pnt 3039 3781 Pnt 2886 3759 Pnt 2804 3763 Pnt 2589 3865 Pnt 2476 3760 Pnt 2173 3807 Pnt 2665 3761 Pnt 3356 3784 Pnt 2696 3754 Pnt 2497 3800 Pnt 2958 3784 Pnt 3934 2660 Pnt 2668 3766 Pnt 3361 3771 Pnt 2802 3799 Pnt 2097 3805 Pnt 3029 3758 Pnt 2035 3784 Pnt 2574 3748 Pnt 3796 3761 Pnt 2218 3769 Pnt 2988 3757 Pnt 2895 3748 Pnt 2080 3750 Pnt 3040 3757 Pnt 2678 3775 Pnt 2441 3815 Pnt 2979 3753 Pnt 2697 3751 Pnt 2535 3764 Pnt 2185 3784 Pnt 2779 3786 Pnt 2929 3785 Pnt 2423 3763 Pnt 3549 3772 Pnt 2492 3752 Pnt 2466 3838 Pnt 2786 3773 Pnt 3436 3758 Pnt 2528 3777 Pnt 2309 3785 Pnt 3605 3802 Pnt 3814 3795 Pnt 2458 3774 Pnt 2735 3784 Pnt 4363 3769 Pnt 3104 3744 Pnt 3112 3749 Pnt 2599 3754 Pnt 2043 3834 Pnt 3234 3749 Pnt 3144 3753 Pnt 3050 3750 Pnt 3150 3780 Pnt 3046 3792 Pnt 2542 3735 Pnt 3089 3774 Pnt 2658 3789 Pnt 3880 3822 Pnt 2873 3750 Pnt 2469 3747 Pnt 2773 3774 Pnt 2621 3827 Pnt 2363 3825 Pnt 2323 3804 Pnt 2346 3746 Pnt 2768 3795 Pnt 3653 3825 Pnt 2809 3795 Pnt 4157 3762 Pnt 3643 2760 Pnt 2736 3815 Pnt 3230 3756 Pnt 2564 2452 Pnt 1869 3791 Pnt 2072 3813 Pnt 2457 3881 Pnt 3407 3788 Pnt 2573 3758 Pnt 2613 3802 Pnt 2327 3794 Pnt 2698 3747 Pnt 3413 3761 Pnt 2270 3803 Pnt 2837 3769 Pnt 3550 3774 Pnt 3266 3803 Pnt 2264 3794 Pnt 3944 2895 Pnt 2899 3757 Pnt 3321 3794 Pnt 2865 3757 Pnt 2589 3776 Pnt 2757 3757 Pnt 2733 3750 Pnt 2753 3757 Pnt 2405 3766 Pnt 3177 3786 Pnt 2429 3766 Pnt 3214 3791 Pnt 1841 3799 Pnt 2986 3809 Pnt 2140 3748 Pnt 2641 3754 Pnt 2595 3760 Pnt 2806 3766 Pnt 3982 3748 Pnt 2927 3768 Pnt 2737 3791 Pnt 2536 3810 Pnt 2264 3793 Pnt 3781 2749 Pnt 2036 3819 Pnt 2489 3785 Pnt 3177 3769 Pnt 2663 3750 Pnt 4277 3761 Pnt 3034 3797 Pnt 2237 3768 Pnt 4495 3769 Pnt 2745 3737 Pnt 3749 3770 Pnt 2663 3754 Pnt 2672 3816 Pnt 2047 3028 Pnt 3072 3760 Pnt 2552 3816 Pnt 2869 3761 Pnt 2751 3863 Pnt 2408 3830 Pnt 2843 3742 Pnt 3204 3742 Pnt 3019 3739 Pnt 2550 3751 Pnt 2301 3754 Pnt 2928 3759 Pnt 2627 3833 Pnt 3348 3785 Pnt 2816 3754 Pnt 3183 3790 Pnt 2446 3767 Pnt 1984 3850 Pnt 2642 3762 Pnt 3014 3761 Pnt 2072 3772 Pnt 3433 3861 Pnt 2821 3756 Pnt 4244 3757 Pnt 2810 3750 Pnt 2749 3761 Pnt 2716 3765 Pnt 2496 3765 Pnt 2342 3803 Pnt 3109 3768 Pnt 4197 3757 Pnt 2867 3750 Pnt 2759 3751 Pnt 2504 3771 Pnt 2812 3831 Pnt 2531 3795 Pnt 3687 3750 Pnt 2861 3794 Pnt 3194 3823 Pnt 2479 3764 Pnt 2334 3832 Pnt 3552 3753 Pnt 2183 3808 Pnt 2045 3781 Pnt 4109 3754 Pnt 3106 3764 Pnt 2628 3779 Pnt 2533 3757 Pnt 2961 2644 Pnt 2464 3755 Pnt 2470 3757 Pnt 3120 3766 Pnt 2355 3810 Pnt 2106 3796 Pnt 2928 3747 Pnt 2357 3818 Pnt 4066 3757 Pnt 2339 3756 Pnt 2979 3751 Pnt 2740 3767 Pnt 2654 3747 Pnt 2329 3771 Pnt 2486 3826 Pnt 2421 3750 Pnt 2894 3759 Pnt 2352 3756 Pnt 2780 3764 Pnt 2583 3746 Pnt 2756 3732 Pnt 3681 3764 Pnt 2736 3750 Pnt 3269 3753 Pnt 2695 3749 Pnt 2919 3764 Pnt 3325 3742 Pnt 2385 3768 Pnt 2018 3851 Pnt 2111 3822 Pnt 2780 2602 Pnt 2261 3762 Pnt 2352 3763 Pnt 2721 3764 Pnt 3886 3005 Pnt 2650 3755 Pnt 3129 3793 Pnt 2901 3782 Pnt 2758 3799 Pnt 2912 3811 Pnt 3976 3757 Pnt 2935 3752 Pnt 3667 3782 Pnt 2210 3748 Pnt 2680 3779 Pnt 1903 3800 Pnt 2847 3785 Pnt 2957 3770 Pnt 2815 3772 Pnt 2491 3804 Pnt 3006 3770 Pnt 2048 3790 Pnt 2769 3810 Pnt 2680 3750 Pnt 3705 3756 Pnt 2802 3810 Pnt 2793 3802 Pnt 4058 3737 Pnt 2217 3798 Pnt 2471 3769 Pnt 3441 3765 Pnt 3296 3802 Pnt 1995 3831 Pnt 2771 3822 Pnt 2490 3759 Pnt 2831 3832 Pnt 3107 3755 Pnt 2214 3764 Pnt 2627 3742 Pnt 3694 3786 Pnt 3013 3755 Pnt 2587 3766 Pnt 2402 3850 Pnt 3313 3763 Pnt 2535 3767 Pnt 2496 3851 Pnt 1952 3800 Pnt 2825 3753 Pnt 1904 3811 Pnt 2346 3746 Pnt 2003 3808 Pnt 3473 3766 Pnt 2222 3840 Pnt 4459 3772 Pnt 3892 3760 Pnt 2989 3763 Pnt 3168 3755 Pnt 2842 3847 Pnt 2361 3782 Pnt 2475 3777 Pnt 2156 3794 Pnt 2250 3823 Pnt 2896 3847 Pnt 3428 3782 Pnt 2897 3819 Pnt 2524 3784 Pnt 2367 3749 Pnt 2203 3807 Pnt 2168 3752 Pnt 3555 3773 Pnt 2354 3778 Pnt 2003 3809 Pnt 3538 3832 Pnt 2835 3750 Pnt 2391 3752 Pnt 2411 3745 Pnt 2519 3778 Pnt 2536 3745 Pnt 2644 3811 Pnt 2919 3813 Pnt 3244 3755 Pnt 4146 3751 Pnt 2981 3756 Pnt 2507 3743 Pnt 3335 3762 Pnt 2180 3803 Pnt 3170 3743 Pnt 2370 3799 Pnt 2600 3837 Pnt 2569 3753 Pnt 2574 3828 Pnt 2534 3828 Pnt 2299 3874 Pnt 3085 3853 Pnt 2073 3941 Pnt 2226 3867 Pnt 2249 3829 Pnt 2736 3747 Pnt 2486 3754 Pnt 3144 3758 Pnt 3488 3747 Pnt 2733 3822 Pnt 2264 3800 Pnt 2140 3758 Pnt 2081 3935 Pnt 3109 3749 Pnt 2702 3747 Pnt 2606 3797 Pnt 4022 3828 Pnt 3713 3749 Pnt 2854 3808 Pnt 2090 3770 Pnt 2858 3790 Pnt 3534 3810 Pnt 3696 2878 Pnt 2435 3827 Pnt 2579 3810 Pnt 2747 3814 Pnt 2003 3786 Pnt 3013 3750 Pnt 2733 3776 Pnt 2630 3796 Pnt 2476 3767 Pnt 3784 3765 Pnt 2896 3776 Pnt 2607 3796 Pnt 3182 3750 Pnt 3040 3764 Pnt 2300 3747 Pnt 2878 3794 Pnt 3200 3783 Pnt 2679 3845 Pnt 2572 3812 Pnt 2580 3763 Pnt 2679 3845 Pnt 3956 3751 Pnt 3188 3770 Pnt 2553 3766 Pnt 2919 3770 Pnt 3890 3744 Pnt 3727 3754 Pnt 2643 3786 Pnt 3882 2880 Pnt 2529 3818 Pnt 3580 3816 Pnt 3445 3761 Pnt 2359 3749 Pnt 2277 3794 Pnt 2873 3003 Pnt 2555 3774 Pnt 4196 3762 Pnt 4085 3755 Pnt 3004 3816 Pnt 3161 3751 Pnt 3602 3759 Pnt 2676 3758 Pnt 2722 3932 Pnt 3179 3754 Pnt 2557 3767 Pnt 2632 3805 Pnt 2543 3745 Pnt 2167 3747 Pnt 3047 3782 Pnt 4083 3773 Pnt 2988 3741 Pnt 1930 3774 Pnt 2152 3806 Pnt 2534 3812 Pnt 3749 3812 Pnt 4042 3752 Pnt 2950 3753 Pnt 2641 2743 Pnt 2649 3805 Pnt 2682 3812 Pnt 2681 3748 Pnt 2727 3805 Pnt 1821 3739 Pnt 4016 3759 Pnt 2791 3789 Pnt 2528 3789 Pnt 2618 3757 Pnt 3173 3760 Pnt 2484 3751 Pnt 4269 3766 Pnt 2331 3751 Pnt 4115 3764 Pnt 2180 3819 Pnt 2429 3755 Pnt 3496 3751 Pnt 2596 3749 Pnt 2399 3774 Pnt 1703 3745 Pnt 3332 3752 Pnt 3513 3766 Pnt 2834 3764 Pnt 2468 3762 Pnt 3016 3787 Pnt 4424 3774 Pnt 2100 3806 Pnt 3477 3766 Pnt 2433 3760 Pnt 2302 3772 Pnt 2835 3824 Pnt 3205 3040 Pnt 2165 3800 Pnt 2530 3757 Pnt 3054 3756 Pnt 4020 3756 Pnt 2827 3802 Pnt 2442 3743 Pnt 2426 3828 Pnt 4276 3759 Pnt 1950 3765 Pnt 2585 3782 Pnt 3078 3745 Pnt 2225 3754 Pnt 1931 3877 Pnt 3040 3746 Pnt 2773 3765 Pnt 3033 3851 Pnt 3435 3755 Pnt 2299 3839 Pnt 2646 3766 Pnt 2639 3780 Pnt 3329 3839 Pnt 2482 3776 Pnt 2524 3770 Pnt 3639 3750 Pnt 3640 3778 Pnt 3642 3754 Pnt 2383 3776 Pnt 2775 3787 Pnt 2043 3754 Pnt 2808 3767 Pnt 2728 3786 Pnt 3326 3774 Pnt 2671 3774 Pnt 2846 3840 Pnt 3237 3768 Pnt 3713 3825 Pnt 2495 3780 Pnt 3096 3769 Pnt 2987 3745 Pnt 2610 3774 Pnt 2540 3801 Pnt 2998 3775 Pnt 2911 3858 Pnt 2328 3771 Pnt 2787 3792 Pnt 1989 3786 Pnt 2134 3751 Pnt 3622 3760 Pnt 2109 3771 Pnt 3887 3792 Pnt 2237 3780 Pnt 2394 3819 Pnt 2968 3808 Pnt 2475 3857 Pnt 2811 3751 Pnt 2056 3805 Pnt 2653 3763 Pnt 2338 3852 Pnt 2652 3750 Pnt 2475 3756 Pnt 3476 3763 Pnt 2347 3815 Pnt 2686 3786 Pnt 2615 3759 Pnt 2510 3750 Pnt 3202 3775 Pnt 3057 3768 Pnt 2512 3776 Pnt 2955 3764 Pnt 2442 3745 Pnt 3769 3821 Pnt 2138 3832 Pnt 3366 3784 Pnt 2518 3813 Pnt 2973 3778 Pnt 2876 3773 Pnt 2380 3834 Pnt 3450 3747 Pnt 4447 3803 Pnt 2397 3901 Pnt 2602 3834 Pnt 3270 3776 Pnt 2588 3820 Pnt 3113 3787 Pnt 2020 3803 Pnt 2295 3764 Pnt 2709 3792 Pnt 3366 3747 Pnt 2826 3749 Pnt 2045 3777 Pnt 2949 3766 Pnt 2834 3759 Pnt 3137 3817 Pnt 3007 3766 Pnt 2899 3772 Pnt 2886 3751 Pnt 3720 3754 Pnt 2605 3838 Pnt 2061 3813 Pnt 1948 3804 Pnt 3196 3813 Pnt 2337 3756 Pnt 2896 3767 Pnt 2223 3815 Pnt 1854 3837 Pnt 2132 3810 Pnt 3302 3756 Pnt 2580 3747 Pnt 2704 3747 Pnt 3150 3757 Pnt 3050 3758 Pnt 2000 3816 Pnt 2140 3819 Pnt 2170 3848 Pnt 3030 3943 Pnt 1905 3891 Pnt 2937 3819 Pnt 4098 3754 Pnt 2417 3774 Pnt 2369 3807 Pnt 3246 3765 Pnt 2422 3746 Pnt 2949 3774 Pnt 2054 3819 Pnt 2896 3765 Pnt 2105 3799 Pnt 3504 3763 Pnt 2741 3758 Pnt 2648 3783 Pnt 3161 3750 Pnt 2775 3752 Pnt 2642 3747 Pnt 3242 3802 Pnt 3396 3752 Pnt 3634 3802 Pnt 2590 3771 Pnt 2349 3777 Pnt 2770 3801 Pnt 2457 3806 Pnt 3543 3758 Pnt 2240 3787 Pnt 2492 3742 Pnt 2379 3778 Pnt 2571 3796 Pnt 3704 3796 Pnt 2471 3749 Pnt 2889 2888 Pnt 2019 3932 Pnt 2015 3825 Pnt 2685 3868 Pnt 2487 3751 Pnt 2073 3838 Pnt 3159 3758 Pnt 2618 3747 Pnt 3125 3788 Pnt 2502 3774 Pnt 3884 3747 Pnt 2036 3801 Pnt 3206 3743 Pnt 2645 3811 Pnt 2957 3752 Pnt 2834 3811 Pnt 3592 3793 Pnt 3166 3748 Pnt 2545 3753 Pnt 3644 3796 Pnt 2316 3800 Pnt 3388 3760 Pnt 2941 3814 Pnt 2615 3751 Pnt 3333 3754 Pnt 2624 3755 Pnt 3744 3797 Pnt 3789 3794 Pnt 3371 3814 Pnt 2067 3808 Pnt 2648 3925 Pnt 2934 3737 Pnt 2729 3778 Pnt 2539 3774 Pnt 2496 3804 Pnt 2188 3917 Pnt 3163 3826 Pnt 3735 3772 Pnt 2604 3786 Pnt 2524 3835 Pnt 2205 3778 Pnt 3034 3788 Pnt 3236 3823 Pnt 2351 3798 Pnt 2298 3770 Pnt 3227 3789 Pnt 3328 3828 Pnt 2752 3750 Pnt 2384 3770 Pnt 3262 3770 Pnt 3308 3761 Pnt 2086 3750 Pnt 2748 3780 Pnt 2375 3745 Pnt 3268 3784 Pnt 3159 3745 Pnt 2464 3793 Pnt 2937 3793 Pnt 2822 3769 Pnt 2629 3789 Pnt 3281 3807 Pnt 2763 3759 Pnt 2952 3806 Pnt 2902 3756 Pnt 2983 3749 Pnt 2391 3926 Pnt 2937 3788 Pnt 2443 3753 Pnt 3097 3746 Pnt 2079 3815 Pnt 3198 3782 Pnt 2639 3804 Pnt 2963 3768 Pnt 2283 3808 Pnt 3569 3782 Pnt 2362 3791 Pnt 2932 3766 Pnt 2268 3735 Pnt 3307 3807 Pnt 2554 3766 Pnt 2940 3764 Pnt 2150 3800 Pnt 2070 3790 Pnt 2625 3801 Pnt 2668 3763 Pnt 2624 3771 Pnt 2526 3912 Pnt 2604 3792 Pnt 2238 3800 Pnt 2647 3769 Pnt 3409 3816 Pnt 2878 3765 Pnt 3670 3747 Pnt 2740 3780 Pnt 2408 3799 Pnt 2419 3767 Pnt 2874 3756 Pnt 3494 3806 Pnt 2562 3817 Pnt 2012 3810 Pnt 2433 3759 Pnt 2824 3777 Pnt 3473 3754 Pnt 1897 3808 Pnt 2868 3746 Pnt 3987 3759 Pnt 3265 3856 Pnt 2347 3772 Pnt 2470 3745 Pnt 3119 3748 Pnt 2642 3807 Pnt 2664 3839 Pnt 2311 3765 Pnt 3575 3758 Pnt 2472 3803 Pnt 3098 3777 Pnt 2297 3797 Pnt 2798 3748 Pnt 2224 3742 Pnt 2267 3773 Pnt 2696 3777 Pnt 3336 3805 Pnt 2367 3769 Pnt 2033 3786 Pnt 2237 3867 Pnt 2752 3765 Pnt 2443 3776 Pnt 3595 3740 Pnt 3387 3769 Pnt 2750 3747 Pnt 2742 3765 Pnt 2698 3789 Pnt 3082 3747 Pnt 2649 3754 Pnt 3529 3762 Pnt 2801 3757 Pnt 2688 3772 Pnt 2601 3794 Pnt 2522 3774 Pnt 2643 3796 Pnt 2526 3767 Pnt 3198 3768 Pnt 2622 3818 Pnt 2660 3796 Pnt 2506 3779 Pnt 2381 3762 Pnt 1975 3793 Pnt 3249 3808 Pnt 2737 3762 Pnt 2439 3807 Pnt 2334 3842 Pnt 3065 3762 Pnt 3520 3757 Pnt 3696 3810 Pnt 2898 3763 Pnt 2417 3781 Pnt 2974 3754 Pnt 2038 3790 Pnt 2506 3777 Pnt 3053 3749 Pnt 2246 3790 Pnt 2800 3768 Pnt 2920 3788 Pnt 2093 3804 Pnt 3344 3749 Pnt 2934 3757 Pnt 2902 3773 Pnt 3125 3750 Pnt 2155 3829 Pnt 3053 3767 Pnt 1869 3834 Pnt 2261 3784 Pnt 2994 3787 Pnt 2857 3767 Pnt 2264 3760 Pnt 2700 3766 Pnt 4176 3763 Pnt 2828 3818 Pnt 2587 3743 Pnt 3178 3806 Pnt 2212 3790 Pnt 1998 3802 Pnt 3295 3758 Pnt 2349 3757 Pnt 4050 3787 Pnt 2140 3820 Pnt 2665 3768 Pnt 2098 3791 Pnt 2453 3810 Pnt 2575 3789 Pnt 2089 3773 Pnt 2724 3847 Pnt 2850 3847 Pnt 2602 3803 Pnt 2410 3805 Pnt 2637 3753 Pnt 2309 3805 Pnt 1960 3808 Pnt 2907 3824 Pnt 4075 3796 Pnt 1872 3773 Pnt 2617 3796 Pnt 3944 3767 Pnt 3398 3796 Pnt 2843 3755 Pnt 2924 3804 Pnt 2473 3837 Pnt 3811 3757 Pnt 2418 3775 Pnt 2424 3800 Pnt 3035 3783 Pnt 2940 3750 Pnt 3091 3755 Pnt 4260 3764 Pnt 2979 3755 Pnt 2583 3799 Pnt 2449 3798 Pnt 3795 2779 Pnt 2280 3755 Pnt 2375 3771 Pnt 3733 3745 Pnt 2975 3755 Pnt 2713 3764 Pnt 2887 3783 Pnt 2827 3768 Pnt 4099 3760 Pnt 3152 3787 Pnt 1999 3776 Pnt 2653 3771 Pnt 3099 3760 Pnt 2978 3794 Pnt 2317 3778 Pnt 3216 3760 Pnt 2746 3817 Pnt 2623 3759 Pnt 2513 3844 Pnt 2824 3821 Pnt 2351 3752 Pnt 2710 3743 Pnt 2651 3750 Pnt 2294 3830 Pnt 1966 3822 Pnt 2415 3741 Pnt 2908 3830 Pnt 3812 3754 Pnt 3103 3764 Pnt 2184 3820 Pnt 2747 3771 Pnt 2987 3753 Pnt 3242 3776 Pnt 2956 3802 Pnt 1945 3743 Pnt 2942 3774 Pnt 3351 3766 Pnt 2876 3781 Pnt 2677 3743 Pnt 4526 3812 Pnt 2692 3784 Pnt 2658 3851 Pnt 2380 3790 Pnt 2597 3759 Pnt 2113 3804 Pnt 3674 3763 Pnt 2576 3897 Pnt 3407 3786 Pnt 2670 3807 Pnt 2862 3831 Pnt 3420 3001 Pnt 2719 3827 Pnt 2993 3741 Pnt 3024 3778 Pnt 3165 3805 Pnt 2594 3767 Pnt 2984 3745 Pnt 2339 3826 Pnt 2368 3804 Pnt 3223 3797 Pnt 2718 3800 Pnt 3488 3759 Pnt 3882 3772 Pnt 2729 3811 Pnt 2282 3800 Pnt 3801 3761 Pnt 2430 3792 Pnt 3523 3759 Pnt 2668 3797 Pnt 2851 3774 Pnt 2473 3901 Pnt 2975 3772 Pnt 2553 3760 Pnt 3601 3901 Pnt 2579 3775 Pnt 3784 3744 Pnt 2768 3871 Pnt 3212 3755 Pnt 2429 3825 Pnt 2315 3784 Pnt 3182 3825 Pnt 2528 3771 Pnt 2150 3758 Pnt 2725 3757 Pnt 2264 3818 Pnt 2378 3761 Pnt 3255 3761 Pnt 4093 3743 Pnt 2812 3750 Pnt 2518 3751 Pnt 2590 3741 Pnt 3334 3754 Pnt 4182 3756 Pnt 2406 3803 Pnt 3062 3803 Pnt 2579 3743 Pnt 2204 3738 Pnt 3145 3753 Pnt 2327 3904 Pnt 2681 3749 Pnt 2556 3815 Pnt 2586 3807 Pnt 2499 3800 Pnt 2789 3786 Pnt 4280 3763 Pnt 4359 2882 Pnt 3193 2963 Pnt 2931 3804 Pnt 2882 3752 Pnt 2961 3743 Pnt 4223 3763 Pnt 2031 3804 Pnt 3544 3768 Pnt 3158 2933 Pnt 2106 3757 Pnt 3037 3795 Pnt 2530 3744 Pnt 3078 3747 Pnt 2541 3744 Pnt 2986 3763 Pnt 2526 3761 Pnt 3659 3784 Pnt 2471 3785 Pnt 2325 3810 Pnt 3052 3762 Pnt 2433 3854 Pnt 4010 3764 Pnt 2996 3757 Pnt 2520 3754 Pnt 3250 3757 Pnt 2453 3838 Pnt 2382 3784 Pnt 3346 3786 Pnt 3354 3765 Pnt 2414 3784 Pnt 2994 3747 Pnt 2359 3844 Pnt 2216 3818 Pnt 2545 3787 Pnt 2964 3763 Pnt 2348 3799 Pnt 2861 3747 Pnt 2679 3799 Pnt 4026 3830 Pnt 2459 3833 Pnt 3732 3805 Pnt 4200 3763 Pnt 2530 3774 Pnt 2409 3833 Pnt 2424 3784 Pnt 2513 3764 Pnt 2377 3785 Pnt 3091 3764 Pnt 2863 3773 Pnt 2262 3823 Pnt 3206 3789 Pnt 3049 3772 Pnt 4081 3823 Pnt 2861 3744 Pnt 2596 3750 Pnt 3170 3816 Pnt 3113 3749 Pnt 3714 2852 Pnt 3970 3758 Pnt 2825 3752 Pnt 3432 3751 Pnt 2945 3753 Pnt 2764 2889 Pnt 3365 3749 Pnt 2530 3781 Pnt 3002 3763 Pnt 2155 3835 Pnt 2628 3750 Pnt 3252 3747 Pnt 3438 2916 Pnt 2375 3866 Pnt 2565 3796 Pnt 3840 3866 Pnt 2129 3813 Pnt 2672 3881 Pnt 3428 3777 Pnt 4448 3777 Pnt 2345 3802 Pnt 2297 3784 Pnt 2476 3800 Pnt 2727 3766 Pnt 2503 3790 Pnt 4141 3780 Pnt 2609 3774 Pnt 3953 3775 Pnt 4205 3781 Pnt 3426 3768 Pnt 3384 3783 Pnt 3565 3748 Pnt 4643 3813 Pnt 3781 3802 Pnt 4039 3752 Pnt 3998 3758 Pnt 4298 3801 Pnt 4126 3798 Pnt 3129 3795 Pnt 2303 3782 Pnt 2408 3798 Pnt 3140 3874 Pnt 2810 3874 Pnt 2531 3762 Pnt 2534 3744 Pnt 2479 3735 Pnt 2583 3774 Pnt 2415 3796 Pnt 2834 3780 Pnt 2612 3747 Pnt 2740 3758 Pnt 1941 3797 Pnt 3598 2831 Pnt 3321 3766 Pnt 2796 3766 Pnt 2356 3740 Pnt 2255 3794 Pnt 3135 3758 Pnt 2627 3770 Pnt 3576 3805 Pnt 3101 3760 Pnt 2511 3755 Pnt 3081 3761 Pnt 2121 3804 Pnt 2769 3771 Pnt 2811 3755 Pnt 2607 3807 Pnt 4214 3778 Pnt 2676 3758 Pnt 3173 3770 Pnt 2499 3858 Pnt 2578 3793 Pnt 2183 3804 Pnt 2133 3792 Pnt 2618 3838 Pnt 2523 3758 Pnt 3148 3752 Pnt 2554 3783 Pnt 3744 3804 Pnt 2413 3758 Pnt 3940 3752 Pnt 2389 3754 Pnt 2172 3803 Pnt 3459 2665 Pnt 2701 3789 Pnt 1922 3767 Pnt 2840 3776 Pnt 2702 3750 Pnt 2337 3774 Pnt 3114 3787 Pnt 2396 3806 Pnt 3632 3776 Pnt 2859 3792 Pnt 2832 3765 Pnt 3097 3774 Pnt 2452 3768 Pnt 3872 2830 Pnt 1942 3819 Pnt 2711 3765 Pnt 2495 3752 Pnt 2561 3827 Pnt 2132 3807 Pnt 3513 3757 Pnt 2216 3813 Pnt 3064 3825 Pnt 2691 3752 Pnt 2671 3765 Pnt 2693 3806 Pnt 2710 3825 Pnt 2887 3771 Pnt 2289 3762 Pnt 3295 3749 Pnt 2724 3805 Pnt 2034 3802 Pnt 2659 3825 Pnt 2300 3826 Pnt 2386 3790 Pnt 2582 3754 Pnt 2427 3851 Pnt 2418 3787 Pnt 3403 3771 Pnt 3078 3787 Pnt 2924 3816 Pnt 2399 3807 Pnt 2913 3805 Pnt 2221 3795 Pnt 2259 3737 Pnt 3292 3760 Pnt 3515 3816 Pnt 2570 3748 Pnt 2413 3830 Pnt 3565 3771 Pnt 4041 3753 Pnt 2738 3753 Pnt 2589 3794 Pnt 2374 3769 Pnt 2926 3772 Pnt 2994 2909 Pnt 3433 3763 Pnt 3047 3796 Pnt 3417 3751 Pnt 2304 3822 Pnt 2800 3765 Pnt 2444 3754 Pnt 3267 3796 Pnt 3539 3752 Pnt 2831 3739 Pnt 2753 3758 Pnt 3452 3793 Pnt 3234 3763 Pnt 3136 3759 Pnt 2017 3851 Pnt 2614 3797 Pnt 2458 3863 Pnt 2517 3808 Pnt 2319 3803 Pnt 2785 3753 Pnt 2363 3826 Pnt 2491 3863 Pnt 2630 3824 Pnt 2573 3742 Pnt 2428 3761 Pnt 2612 3754 Pnt 2875 3754 Pnt 2709 3834 Pnt 2814 3756 Pnt 2608 3795 Pnt 2551 3759 Pnt 2739 3761 Pnt 3489 3797 Pnt 4144 3760 Pnt 3787 3764 Pnt 2682 3790 Pnt 3415 3753 Pnt 2613 3757 Pnt 3847 3741 Pnt 2282 3800 Pnt 3174 3789 Pnt 3311 3762 Pnt 3009 3756 Pnt 2016 3772 Pnt 2638 3757 Pnt 2433 3789 Pnt 2755 3799 Pnt 3498 3768 Pnt 2681 3774 Pnt 2625 3755 Pnt 2562 3746 Pnt 2713 3795 Pnt 2547 3757 Pnt 2242 3794 Pnt 2958 3757 Pnt 2481 3741 Pnt 2114 3832 Pnt 2474 3823 Pnt 2937 3826 Pnt 3852 3757 Pnt 3093 3767 Pnt 2539 3791 Pnt 2224 3773 Pnt 3154 3759 Pnt 2848 3749 Pnt 2181 3803 Pnt 2838 3803 Pnt 3195 3771 Pnt 2192 3796 Pnt 3868 3771 Pnt 2570 3747 Pnt 3029 2740 Pnt 3054 3775 Pnt 4177 3756 Pnt 3554 3755 Pnt 2379 3782 Pnt 2726 3749 Pnt 2659 3782 Pnt 2097 3768 Pnt 2391 3819 Pnt 2847 3770 Pnt 1976 3829 Pnt 2825 3819 Pnt 2098 3807 Pnt 2826 3748 Pnt 2787 3810 Pnt 3072 3750 Pnt 2865 3764 Pnt 2479 3769 Pnt 2401 3768 Pnt 2588 3793 Pnt 4245 3767 Pnt 2909 3793 Pnt 3982 3749 Pnt 2280 3832 Pnt 3244 3756 Pnt 2072 3798 Pnt 3106 2899 Pnt 2800 3832 Pnt 2185 3826 Pnt 2280 3774 Pnt 2074 3796 Pnt 2374 3759 Pnt 3608 3782 Pnt 4004 3751 Pnt 2517 3800 Pnt 2728 3811 Pnt 2855 3838 Pnt 2586 3795 Pnt 2174 3820 Pnt 2101 3790 Pnt 3257 3769 Pnt 2452 3776 Pnt 3202 3744 Pnt 2954 3750 Pnt 2783 3764 Pnt 3282 3733 Pnt 2396 3809 Pnt 2797 3753 Pnt 3546 3750 Pnt 2391 3745 Pnt 2661 3756 Pnt 3228 3772 Pnt 2286 3802 Pnt 2376 3800 Pnt 2871 3765 Pnt 2922 3766 Pnt 3006 3802 Pnt 2721 3807 Pnt 2464 3794 Pnt 2864 3754 Pnt 2872 3755 Pnt 2142 3762 Pnt 2646 3808 Pnt 3185 3753 Pnt 2568 3845 Pnt 2709 3793 Pnt 2202 3764 Pnt 2359 3757 Pnt 3100 3845 Pnt 2910 3812 Pnt 2830 3764 Pnt 3159 3747 Pnt 2615 3742 Pnt 2927 3810 Pnt 3993 3752 Pnt 2764 3770 Pnt 2633 3766 Pnt 2525 3784 Pnt 2069 3808 Pnt 3436 3756 Pnt 3142 3851 Pnt 3062 2914 Pnt 2344 3763 Pnt 2334 3750 Pnt 2453 3778 Pnt 2705 3813 Pnt 3244 3851 Pnt 2264 3840 Pnt 3328 3760 Pnt 3135 3814 Pnt 3049 3758 Pnt 3013 3847 Pnt 2543 3776 Pnt 1997 3777 Pnt 2160 3790 Pnt 3216 3810 Pnt 2535 3823 Pnt 3135 3758 Pnt 3734 3761 Pnt 2239 3809 Pnt 2986 3814 Pnt 3281 3763 Pnt 2672 3803 Pnt 2392 3741 Pnt 2894 3799 Pnt 2465 3745 Pnt 2170 3752 Pnt 3747 3819 Pnt 2478 3744 Pnt 2009 3828 Pnt 2964 3767 Pnt 2772 3745 Pnt 2539 3767 Pnt 2873 3747 Pnt 3772 3745 Pnt 2761 3754 Pnt 2437 3874 Pnt 2825 3755 Pnt 2633 3767 Pnt 3406 3755 Pnt 2939 3754 Pnt 3205 3765 Pnt 3007 3803 Pnt 2727 3774 Pnt 3264 3756 Pnt 2679 3822 Pnt 3136 3774 Pnt 2482 3746 Pnt 2636 3753 Pnt 2666 3944 Pnt 3325 3754 Pnt 4054 2874 Pnt 2805 3749 Pnt 3253 3753 Pnt 2779 3749 Pnt 2492 3867 Pnt 2567 3764 Pnt 2596 3829 Pnt 3415 3812 Pnt 2926 3786 Pnt 2437 3772 Pnt 3097 3874 Pnt 2696 3790 Pnt 2216 3829 Pnt 2422 3743 Pnt 2483 3814 Pnt 3260 3755 Pnt 3290 3776 Pnt 3042 3809 Pnt 2608 3754 Pnt 2587 3762 Pnt 3037 3747 Pnt 2187 3818 Pnt 1930 3935 Pnt 2459 3801 Pnt 2427 3805 Pnt 2882 3782 Pnt 3273 3758 Pnt 2232 3771 Pnt 2255 3808 Pnt 2284 3770 Pnt 3706 3782 Pnt 2336 3762 Pnt 3906 3809 Pnt 2082 3771 Pnt 2551 3757 Pnt 2794 3755 Pnt 2499 3785 Pnt 2746 3755 Pnt 2246 3764 Pnt 2408 3748 Pnt 2839 3753 Pnt 3429 3770 Pnt 2847 3747 Pnt 2997 3748 Pnt 3052 3763 Pnt 2956 3753 Pnt 2690 3749 Pnt 2660 3751 Pnt 2781 3815 Pnt 3628 3767 Pnt 3440 3751 Pnt 1988 3797 Pnt 3949 3752 Pnt 2830 3773 Pnt 3074 3755 Pnt 2717 3760 Pnt 2430 3879 Pnt 2889 3775 Pnt 2730 3816 Pnt 2216 3748 Pnt 2852 3812 Pnt 2450 3769 Pnt 3350 3771 Pnt 2243 3779 Pnt 2850 3787 Pnt 3339 3749 Pnt 2941 3776 Pnt 2090 3800 Pnt 2581 3764 Pnt 2830 3757 Pnt 2501 3780 Pnt 2164 3762 Pnt 2090 3782 Pnt 2884 3784 Pnt 2474 3840 Pnt 4084 3759 Pnt 2197 3801 Pnt 2147 3772 Pnt 2941 3760 Pnt 2153 3846 Pnt 2574 3767 Pnt 2393 3804 Pnt 2514 3764 Pnt 2347 3839 Pnt 4058 3804 Pnt 3216 3775 Pnt 2835 3932 Pnt 3328 3773 Pnt 2820 3840 Pnt 2548 3821 Pnt 3035 3765 Pnt 2531 3788 Pnt 2223 3814 Pnt 3602 3765 Pnt 3022 3773 Pnt 2583 3754 Pnt 2018 3754 Pnt 2213 3791 Pnt 4027 2923 Pnt 3367 3754 Pnt 2228 3781 Pnt 3248 3778 Pnt 2805 3757 Pnt 3074 3759 Pnt 2124 3801 Pnt 2862 3825 Pnt 3580 2898 Pnt 2401 3812 Pnt 2832 3743 Pnt 3130 3752 Pnt 3312 3774 Pnt 2609 3747 Pnt 2337 3811 Pnt 3697 3812 Pnt 2454 3771 Pnt 2870 3755 Pnt 2560 3753 Pnt 2840 3762 Pnt 2879 3751 Pnt 2265 3805 Pnt 2478 3813 Pnt 3071 3767 Pnt 3071 3762 Pnt 2741 3815 Pnt 3075 3779 Pnt 3247 3747 Pnt 2619 3766 Pnt 2190 3834 Pnt 2194 3852 Pnt 2062 3806 Pnt 3355 3766 Pnt 2369 3773 Pnt 3124 3766 Pnt 2699 3804 Pnt 3329 3788 Pnt 2806 3756 Pnt 2129 3838 Pnt 3164 3786 Pnt 3442 3748 Pnt 3053 3777 Pnt 2592 3750 Pnt 2498 3812 Pnt 3270 3767 Pnt 2146 3776 Pnt 2849 3827 Pnt 1880 3891 Pnt 2971 3746 Pnt 3786 3776 Pnt 3175 3891 Pnt 2804 3757 Pnt 2272 3813 Pnt 2535 3812 Pnt 2076 3803 Pnt 3696 3757 Pnt 2938 3754 Pnt 2396 3756 Pnt 3852 3757 Pnt 2924 3752 Pnt 2031 3832 Pnt 2775 3829 Pnt 2964 3834 Pnt 2248 3771 Pnt 2524 3809 Pnt 2254 3780 Pnt 2587 3757 Pnt 2067 3806 Pnt 3361 3782 Pnt 2442 3765 Pnt 2566 3785 Pnt 2035 3777 Pnt 2316 3901 Pnt 3874 3815 Pnt 2305 3804 Pnt 2014 3816 Pnt 2355 3774 Pnt 2810 3828 Pnt 2718 3758 Pnt 2514 3804 Pnt 2536 3772 Pnt 3409 3758 Pnt 2239 3772 Pnt 3407 3804 Pnt 2573 3777 Pnt 3206 3772 Pnt 3146 3747 Pnt 2668 3789 Pnt 3006 3787 Pnt 2917 3789 Pnt 2059 3815 Pnt 2897 3758 Pnt 3676 3748 Pnt 2775 3802 Pnt 3156 3802 Pnt 2496 3796 Pnt 2899 3759 Pnt 3057 3798 Pnt 2033 3807 Pnt 4399 3776 Pnt 2782 3742 Pnt 2504 3787 Pnt 3313 3856 Pnt 2758 3772 Pnt 1947 3777 Pnt 3608 3745 Pnt 2575 3774 Pnt 3147 3844 Pnt 3686 3772 Pnt 2775 3777 Pnt 2339 3828 Pnt 3297 3763 Pnt 3449 3782 Pnt 3143 3770 Pnt 2337 3774 Pnt 3112 3766 Pnt 1937 3807 Pnt 2631 3753 Pnt 3077 3776 Pnt 3606 3808 Pnt 3088 3757 Pnt 2881 3758 Pnt 2399 3830 Pnt 2701 3819 Pnt 2390 3838 Pnt 2555 3810 Pnt 3370 3819 Pnt 2883 3858 Pnt 2174 3813 Pnt 2773 3810 Pnt 4240 3760 Pnt 4111 3743 Pnt 2415 3745 Pnt 2034 3809 Pnt 3311 3760 Pnt 2053 3793 Pnt 2933 3756 Pnt 2333 3805 Pnt 2312 3825 Pnt 2617 3792 Pnt 2457 3819 Pnt 2574 3825 Pnt 3164 3763 Pnt 2814 3845 Pnt 2488 3868 Pnt 2688 3769 Pnt 2998 3782 Pnt 2773 3802 Pnt 4363 3765 Pnt 2954 3869 Pnt 2546 3747 Pnt 3199 3747 Pnt 3126 2993 Pnt 2744 3743 Pnt 2538 3788 Pnt 3672 3783 Pnt 1942 3822 Pnt 4135 3757 Pnt 2583 3775 Pnt 3124 3752 Pnt 2432 3774 Pnt 2400 3797 Pnt 2558 3805 Pnt 2553 3780 Pnt 3976 3748 Pnt 3689 3780 Pnt 2228 3811 Pnt 2595 3794 Pnt 3846 2668 Pnt 2232 3773 Pnt 3249 3786 Pnt 2257 3774 Pnt 3010 3806 Pnt 2658 3811 Pnt 2984 3760 Pnt 3867 2793 Pnt 3082 3747 Pnt 2685 3811 Pnt 2102 3917 Pnt 3274 3775 Pnt 3229 3797 Pnt 2077 3789 Pnt 2387 3770 Pnt 2506 3823 Pnt 2175 3737 Pnt 3358 3756 Pnt 2854 3792 Pnt 2494 3762 Pnt 3698 3788 Pnt 1945 3793 Pnt 2456 3755 Pnt 3722 3792 Pnt 2394 3770 Pnt 2737 3787 Pnt 2234 3755 Pnt 2704 3804 Pnt 2763 3762 Pnt 2304 3798 Pnt 3972 3747 Pnt 2685 3806 Pnt 2521 3762 Pnt 2352 3743 Pnt 2500 3796 Pnt 2109 3757 Pnt 2840 3810 Pnt 2583 3788 Pnt 2585 3766 Pnt 2337 3842 Pnt 3580 3753 Pnt 3780 3766 Pnt 3011 3782 Pnt 2722 3756 Pnt 2820 3764 Pnt 3215 3802 Pnt 2392 3802 Pnt 2454 3807 Pnt 2897 3781 Pnt 3340 3754 Pnt 2620 3777 Pnt 4307 3751 Pnt 2548 3787 Pnt 2548 3774 Pnt 3234 3777 Pnt 2251 3829 Pnt 2105 3807 Pnt 2840 3761 Pnt 2551 3796 Pnt 3894 3787 Pnt 2693 3807 Pnt 2616 3796 Pnt 2510 3765 Pnt 2610 3784 Pnt 3258 3860 Pnt 2846 3780 Pnt 2097 3756 Pnt 2811 3818 Pnt 3967 3818 Pnt 3298 3768 Pnt 3948 3741 Pnt 3759 3758 Pnt 2503 3796 Pnt 2832 3764 Pnt 2917 3762 Pnt 2838 3748 Pnt 2558 3772 Pnt 2301 3757 Pnt 2900 3774 Pnt 4144 3755 Pnt 4164 2841 Pnt 1943 3773 Pnt 2996 3754 Pnt 3924 3776 Pnt 3477 2907 Pnt 2711 3817 Pnt 2309 3778 Pnt 2907 3837 Pnt 2526 3787 Pnt 2300 3760 Pnt 3349 3759 Pnt 3946 3779 Pnt 2658 3766 Pnt 2418 3743 Pnt 2399 3762 Pnt 2624 3787 Pnt 2037 3804 Pnt 2651 3750 Pnt 4052 3743 Pnt 2182 3847 Pnt 4018 3765 Pnt 2051 3822 Pnt 2289 3805 Pnt 1966 3799 Pnt 2645 3808 Pnt 3156 3808 Pnt 3502 3763 Pnt 4122 2823 Pnt 2895 3763 Pnt 2311 3824 Pnt 3045 3752 Pnt 2049 3773 Pnt 2556 3751 Pnt 2847 3764 Pnt 2733 3796 Pnt 2551 3762 Pnt 3172 3752 Pnt 2744 3802 Pnt 3120 3754 Pnt 2868 3811 Pnt 3141 3757 Pnt 2711 3925 Pnt 3052 3812 Pnt 2843 3757 Pnt 3443 3925 Pnt 2654 3750 Pnt 3007 3771 Pnt 2824 3750 Pnt 2654 3805 Pnt 2855 3851 Pnt 2198 3897 Pnt 4785 3742 Pnt 3042 3755 Pnt 4070 3755 Pnt 2786 3806 Pnt 3251 2965 Pnt 2956 3777 Pnt 2630 3748 Pnt 3034 3787 Pnt 2695 3839 Pnt 4090 3759 Pnt 2640 2782 Pnt 2528 3803 Pnt 2403 3788 Pnt 4165 2890 Pnt 2322 3742 Pnt 2733 3759 Pnt 2182 3787 Pnt 2383 3835 Pnt 2025 3867 Pnt 3095 3760 Pnt 3865 3835 Pnt 2590 3787 Pnt 3224 3772 Pnt 2542 3787 Pnt 2717 3753 Pnt 2580 3770 Pnt 2395 3752 Pnt 3078 3776 Pnt 2136 3791 Pnt 4128 3772 Pnt 3724 3745 Pnt 2328 3772 Pnt 2501 3749 Pnt 3490 3816 Pnt 2668 3757 Pnt 2604 3778 Pnt 2551 3750 Pnt 3579 3818 Pnt 2632 3935 Pnt 2340 3770 Pnt 3909 2797 Pnt 2483 3751 Pnt 3145 3744 Pnt 1983 3838 Pnt 2624 3769 Pnt 3891 3777 Pnt 4499 2711 Pnt 2119 3801 Pnt 3206 3797 Pnt 4094 3769 Pnt 2840 3756 Pnt 3427 3752 Pnt 2676 3768 Pnt 3199 3787 Pnt 2347 3926 Pnt 2899 3786 Pnt 2370 3755 Pnt 3584 3786 Pnt 2519 3804 Pnt 4145 3755 Pnt 3304 3769 Pnt 3163 3753 Pnt 2075 3815 Pnt 3047 3742 Pnt 4034 3745 Pnt 2613 3811 Pnt 3380 3756 Pnt 3137 3760 Pnt 3822 3751 Pnt 2389 3826 Pnt 2118 3795 Pnt 4010 2910 Pnt 2693 3784 Pnt 2060 3797 Pnt 2458 3755 Pnt 3850 3797 Pnt 2934 3800 Pnt 2068 3790 Pnt 2517 3814 Pnt 3472 3786 Pnt 2660 3754 Pnt 4089 3814 Pnt 1920 3792 Pnt 2517 3760 Pnt 2833 3831 Pnt 2830 3788 Pnt 4278 3752 Pnt 2772 3742 Pnt 2374 3815 Pnt 2568 3766 Pnt 2810 3742 Pnt 2657 3777 Pnt 2504 3826 Pnt 2261 3743 Pnt 2412 3851 Pnt 2471 3764 Pnt 2946 3764 Pnt 2490 3794 Pnt 4209 3760 Pnt 3469 3794 Pnt 4232 3851 Pnt 3421 3756 Pnt 4053 3826 Pnt 3067 3901 Pnt 2901 3796 Pnt 2224 3835 Pnt 2555 3901 Pnt 3074 3749 Pnt 2462 3823 Pnt 1957 3796 Pnt 3628 3754 Pnt 2858 3785 Pnt 2465 3808 Pnt 2583 3768 Pnt 2806 3871 Pnt 2483 3752 Pnt 2527 3800 Pnt 3419 3871 Pnt 2334 3825 Pnt 2330 3805 Pnt 2402 3741 Pnt 2178 3780 Pnt 3056 3766 Pnt 2147 3854 Pnt 2768 3874 Pnt 4158 3754 Pnt 2746 3764 Pnt 3977 3751 Pnt 2970 3852 Pnt 2883 3757 Pnt 2085 3802 Pnt 2069 3800 Pnt 2590 3747 Pnt 2028 3790 Pnt 2947 3747 Pnt 4095 3746 Pnt 2930 3790 Pnt 2801 3827 Pnt 3459 3760 Pnt 2776 3801 Pnt 3768 3746 Pnt 2897 3823 Pnt 3749 3763 Pnt 2860 3767 Pnt 3334 3827 Pnt 2184 3791 Pnt 2904 3805 Pnt 2594 3761 Pnt 2435 3771 Pnt 2743 3810 Pnt 2641 3771 Pnt 3872 3771 Pnt 2716 3837 Pnt 2838 3789 Pnt 3088 3792 Pnt 2741 3755 Pnt 2268 3800 Pnt 3907 3792 Pnt 2560 3912 Pnt 2097 3773 Pnt 4002 3754 Pnt 3835 3747 Pnt 2524 3804 Pnt 3372 3783 Pnt 2614 3799 Pnt 2657 3751 Pnt 3258 3796 Pnt 2613 3803 Pnt 3469 3749 Pnt 2088 3806 Pnt 3045 3796 Pnt 2733 3765 Pnt 3332 3819 Pnt 2754 3802 Pnt 2587 3780 Pnt 2354 3792 Pnt 2983 3771 Pnt 2566 3757 Pnt 2288 3802 Pnt 3687 3768 Pnt 3928 3803 Pnt 2669 3767 Pnt 2969 3766 Pnt 1958 3800 Pnt 4073 3754 Pnt 2880 3764 Pnt 2603 3744 Pnt 2957 3755 Pnt 2984 3756 Pnt 2734 3848 Pnt 2369 3758 Pnt 2238 3796 Pnt 2429 3763 Pnt 3040 3761 Pnt 2555 3787 Pnt 3892 3745 Pnt 2877 3763 Pnt 2641 3761 Pnt 2639 3792 Pnt 2659 3807 Pnt 2686 3784 Pnt 2306 3768 Pnt 3159 3763 Pnt 2438 3794 Pnt 2937 3827 Pnt 3266 3761 Pnt 2511 3752 Pnt 2438 3799 Pnt 3004 3785 Pnt 3807 3763 Pnt 2212 3805 Pnt 2737 3786 Pnt 3181 3821 Pnt 2479 3747 Pnt 2834 3827 Pnt 2789 3786 Pnt 2771 3759 Pnt 2598 3838 Pnt 2185 3804 Pnt 2805 3806 Pnt 1982 3743 Pnt 3014 3747 Pnt 1953 3808 Pnt 3532 3838 Pnt 4325 3827 Pnt 2766 3784 Pnt 2349 3785 Pnt 2898 3808 Pnt 2015 3837 Pnt 3279 3806 Pnt 3020 3759 Pnt 2400 3766 Pnt 2869 3805 Pnt 2224 3810 Pnt 2656 3837 Pnt 2446 3776 Pnt 1921 3790 Pnt 2768 3805 Pnt 2826 3762 Pnt 2439 3789 Pnt 2841 3795 Pnt 2243 3757 Pnt 2730 3772 Pnt 2980 3755 Pnt 2867 3774 Pnt 2218 3835 Pnt 2374 3744 Pnt 3330 3778 Pnt 3516 3753 Pnt 3042 3782 Pnt 2607 3797 Pnt 3116 3764 Pnt 1894 3818 Pnt 2076 3773 Pnt 3133 3751 Pnt 2666 3764 Pnt 2443 3761 Pnt 3157 3764 Pnt 2993 3816 Pnt 2617 3750 Pnt 3022 3771 Pnt 3314 3765 Pnt 2401 3751 Pnt 2158 3789 Pnt 3324 3747 Pnt 2368 3790 Pnt 2413 3757 Pnt 3991 3762 Pnt 2171 3827 Pnt 3240 3760 Pnt 2698 3881 Pnt 3111 3830 Pnt 2717 3761 Pnt 3313 3757 Pnt 2277 3816 Pnt 4165 3813 Pnt 3240 3784 Pnt 2439 3807 Pnt 2068 3775 Pnt 2877 3773 Pnt 3996 3784 Pnt 2626 3805 Pnt 3079 3773 Pnt 2476 3759 Pnt 3091 3748 Pnt 2184 3805 Pnt 2602 3813 Pnt 2836 3759 Pnt 1863 3803 Pnt 2955 3830 Pnt 2938 3748 Pnt 2819 3795 Pnt 2527 3830 Pnt 1894 3796 Pnt 2954 3771 Pnt 2666 3795 Pnt 3032 3747 Pnt 3079 3747 Pnt 3081 3805 Pnt 3718 3755 Pnt 3619 3787 Pnt 3128 3752 Pnt 4236 3769 Pnt 2689 3858 Pnt 2394 3758 Pnt 2443 3807 Pnt 2983 3749 Pnt 2459 3820 Pnt 2346 3752 Pnt 2392 3798 Pnt 2931 3749 Pnt 2100 3804 Pnt 2731 3743 Pnt 2483 3807 Pnt 2228 3806 Pnt 2682 3774 Pnt 2864 3754 Pnt 2701 3756 Pnt 2043 3800 Pnt 3062 3787 Pnt 2755 3765 Pnt 3668 3756 Pnt 2056 3793 Pnt 3124 3765 Pnt 3058 3761 Pnt 2167 3758 Pnt 2499 3778 Pnt 3244 3861 Pnt 2632 3753 Pnt 2495 3765 Pnt 3354 3768 Pnt 3200 3789 Pnt 2806 3825 Pnt 2673 3781 Pnt 2391 3858 Pnt 2207 3770 Pnt 3993 3771 Pnt 2558 3863 Pnt 3420 3749 Pnt 3394 3793 Pnt 2244 3806 Pnt 3832 3792 Pnt 3621 3789 Pnt 2193 3796 Pnt 3461 3760 Pnt 2645 3816 Pnt 2037 3794 Pnt 3365 3792 Pnt 2365 3795 Pnt 3768 3760 Pnt 2477 3746 Pnt 2814 3765 Pnt 2655 3825 Pnt 2420 3737 Pnt 2702 3834 Pnt 2494 3799 Pnt 3130 3781 Pnt 3673 3736 Pnt 2937 3748 Pnt 2213 3774 Pnt 3208 3781 Pnt 2523 3763 Pnt 3012 3759 Pnt 2984 3773 Pnt 2332 3787 Pnt 2563 3854 Pnt 1887 3827 Pnt 3382 3763 Pnt 2930 3771 Pnt 2648 3826 Pnt 2520 3756 Pnt 3211 3774 Pnt 2480 3758 Pnt 2727 3769 Pnt 3125 3797 Pnt 2437 3820 Pnt 3780 3753 Pnt 2817 3772 Pnt 3625 3802 Pnt 3475 3757 Pnt 2728 3814 Pnt 3294 3814 Pnt 3158 3764 Pnt 2640 3789 Pnt 2903 3796 Pnt 2461 3793 Pnt 3105 3751 Pnt 4635 3785 Pnt 4071 3759 Pnt 2851 3838 Pnt 2743 3789 Pnt 2643 3753 Pnt 2562 3822 Pnt 3410 3822 Pnt 2783 3782 Pnt 2117 3793 Pnt 3421 3765 Pnt 2465 3795 Pnt 3729 3755 Pnt 2287 3819 Pnt 2688 3793 Pnt 2695 3799 Pnt 3556 3742 Pnt 2566 3826 Pnt 2982 3760 Pnt 2668 3788 Pnt 2764 3865 Pnt 2520 3800 Pnt 3000 3776 Pnt 3668 2855 Pnt 2735 3753 Pnt 3888 3739 Pnt 2001 3808 Pnt 3173 3753 Pnt 2675 3824 Pnt 4033 3757 Pnt 2232 3826 Pnt 2807 3757 Pnt 2851 3810 Pnt 3738 3750 Pnt 4120 3815 Pnt 2861 3746 Pnt 2208 3764 Pnt 2984 3746 Pnt 2267 3790 Pnt 2417 3757 Pnt 3051 3783 Pnt 3913 3749 Pnt 3625 3757 Pnt 2445 3741 Pnt 2911 3786 Pnt 2684 3799 Pnt 2545 3745 Pnt 2562 3826 Pnt 2570 3760 Pnt 2811 3776 Pnt 3046 3745 Pnt 2574 3750 Pnt 2317 3756 Pnt 3700 3754 Pnt 2737 3752 Pnt 2547 3749 Pnt 2197 3762 Pnt 3255 3772 Pnt 2042 3802 Pnt 3179 3753 Pnt 2673 3758 Pnt 2754 3766 Pnt 2548 3747 Pnt 2982 3778 Pnt 2005 3747 Pnt 4283 3767 Pnt 3654 3753 Pnt 2345 3799 Pnt 2690 3784 Pnt 2279 3753 Pnt 2742 3794 Pnt 2058 3796 Pnt 2612 3753 Pnt 2648 3757 Pnt 2375 3747 Pnt 3358 3775 Pnt 3905 3750 Pnt 3077 3740 Pnt 2599 3763 Pnt 3391 3775 Pnt 2789 3754 Pnt 2861 3763 Pnt 1948 3803 Pnt 2525 3797 Pnt 3692 3757 Pnt 3224 3764 Pnt 2252 3806 Pnt 3053 3735 Pnt 2451 3745 Pnt 2480 3791 Pnt 3235 3740 Pnt 3432 3814 Pnt 2607 3760 Pnt 2671 3812 Pnt 2818 3791 Pnt 2721 3755 Pnt 2917 3761 Pnt 2557 3809 Pnt 3359 3758 Pnt 2915 3775 Pnt 2742 3809 Pnt 3157 3783 Pnt 2430 3933 Pnt 4124 2992 Pnt 2966 3758 Pnt 2691 3767 Pnt 2424 3845 Pnt 2307 3748 Pnt 1943 3801 Pnt 2603 3815 Pnt 2652 3814 Pnt 2579 3791 Pnt 3432 3744 Pnt 2568 3776 Pnt 2836 3758 Pnt 3222 3776 Pnt 3003 3753 Pnt 2778 3801 Pnt 4117 2900 Pnt 3092 3770 Pnt 3348 3744 Pnt 2455 3803 Pnt 2620 3742 Pnt 3147 3787 Pnt 2316 3768 Pnt 3809 3773 Pnt 2139 3829 Pnt 2738 3755 Pnt 3125 3748 Pnt 2695 3776 Pnt 2645 3755 Pnt 2298 3803 Pnt 2018 3823 Pnt 3049 3761 Pnt 2910 3748 Pnt 2804 3758 Pnt 1981 3780 Pnt 3109 3765 Pnt 2641 3751 Pnt 2237 3840 Pnt 2559 3758 Pnt 2084 3801 Pnt 2796 3757 Pnt 2629 3809 Pnt 2189 3772 Pnt 2307 3822 Pnt 4040 3749 Pnt 2675 3807 Pnt 2437 3760 Pnt 2092 3832 Pnt 2791 3944 Pnt 2389 3829 Pnt 2706 3847 Pnt 3872 3773 Pnt 2355 3764 Pnt 2890 3756 Pnt 3845 3744 Pnt 2590 3773 Pnt 2404 3751 Pnt 2203 3809 Pnt 3209 3800 Pnt 3087 3809 Pnt 2962 3767 Pnt 2952 3774 Pnt 2987 3742 Pnt 2515 3745 Pnt 3542 3828 Pnt 2852 3828 Pnt 2695 3753 Pnt 3116 3762 Pnt 2955 3753 Pnt 2368 3749 Pnt 2426 3802 Pnt 1953 3874 Pnt 3537 3750 Pnt 3028 3805 Pnt 2503 3800 Pnt 3525 3777 Pnt 3131 3811 Pnt 3164 3754 Pnt 2699 3747 Pnt 2748 3765 Pnt 2639 3764 Pnt 2714 3754 Pnt 3525 3744 Pnt 3021 3765 Pnt 2585 3772 Pnt 3318 3771 Pnt 3536 3750 Pnt 2542 3772 Pnt 2127 3790 Pnt 1925 3891 Pnt 3034 3763 Pnt 2480 3750 Pnt 3699 3792 Pnt 2580 3829 Pnt 2616 3829 Pnt 3822 3769 Pnt 4458 3771 Pnt 2615 3761 Pnt 3111 3766 Pnt 3296 3765 Pnt 2468 3772 Pnt 2402 3812 Pnt 2856 3810 Pnt 2780 3746 Pnt 3465 3758 Pnt 2790 3812 Pnt 2234 3795 Pnt 2624 3767 Pnt 4085 3756 Pnt 3192 3819 Pnt 3443 3770 Pnt 2225 3879 Pnt 2406 3839 Pnt 3203 3851 Pnt 2809 3811 Pnt 2929 3796 Pnt 2796 3811 Pnt 2686 3816 Pnt 3661 3851 Pnt 2680 3754 Pnt 2648 3756 Pnt 2274 3772 Pnt 2961 3796 Pnt 2847 3767 Pnt 2509 3828 Pnt 2346 3932 Pnt 3248 3809 Pnt 2372 3813 Pnt 3598 3753 Pnt 2280 3756 Pnt 2199 3781 Pnt 2477 3847 Pnt 3527 3758 Pnt 2837 3809 Pnt 2430 3755 Pnt 2885 3809 Pnt 2848 3756 Pnt 2451 3778 Pnt 3113 3778 Pnt 3049 3807 Pnt 2597 3826 Pnt 2703 3945 Pnt 3268 3752 Pnt 2439 3787 Pnt 2645 3752 Pnt 2290 3775 Pnt 2524 3840 Pnt 2052 3806 Pnt 2796 3804 Pnt 2091 3765 Pnt 3126 3759 Pnt 2523 3762 Pnt 2678 3789 Pnt 2585 3901 Pnt 2567 3807 Pnt 3568 3767 Pnt 2424 3810 Pnt 2582 3750 Pnt 2640 3814 Pnt 2621 3798 Pnt 2528 3813 Pnt 4065 3751 Pnt 3870 3798 Pnt 2554 3763 Pnt 2857 3782 Pnt 2839 3779 Pnt 3779 3742 Pnt 2527 3781 Pnt 3079 3779 Pnt 2591 3777 Pnt 2926 3812 Pnt 2685 3802 Pnt 2614 3774 Pnt 2390 3825 Pnt 3322 3740 Pnt 4118 3793 Pnt 3320 3774 Pnt 2204 3805 Pnt 2508 3796 Pnt 3255 3779 Pnt 2718 3787 Pnt 2412 3769 Pnt 3510 3853 Pnt 2298 3851 Pnt 2871 3757 Pnt 2840 3784 Pnt 2461 3812 Pnt 3768 3787 Pnt 3415 3812 Pnt 2515 3818 Pnt 2199 3762 Pnt 3298 2434 Pnt 4179 2655 Pnt 2510 3766 Pnt 2302 3776 Pnt 3402 3759 Pnt 2610 3804 Pnt 2322 3840 Pnt 3151 3776 Pnt 2828 3747 Pnt 2344 3834 Pnt 2246 3808 Pnt 2009 3838 Pnt 2727 3791 Pnt 3362 3747 Pnt 2420 3764 Pnt 2610 3743 Pnt 3015 3791 Pnt 2482 3824 Pnt 2830 3771 Pnt 3094 3824 Pnt 2791 3804 Pnt 2620 3777 Pnt 2337 3788 Pnt 3221 3771 Pnt 2040 3762 Pnt 2154 3773 Pnt 2441 3827 Pnt 1997 3805 Pnt 3275 3804 Pnt 2653 3793 Pnt 2373 3780 Pnt 2572 3786 Pnt 2752 3785 Pnt 2798 3755 Pnt 2458 3754 Pnt 3301 3790 Pnt 2008 3818 Pnt 3033 3759 Pnt 2514 3756 Pnt 2048 3805 Pnt 2739 3757 Pnt 2651 3779 Pnt 3439 3792 Pnt 2205 3804 Pnt 3233 3773 Pnt 2946 3790 Pnt 2795 3815 Pnt 2673 3825 Pnt 2836 3784 Pnt 2430 3815 Pnt 3382 3788 Pnt 2298 3801 Pnt 2261 3807 Pnt 3319 3797 Pnt 3162 3766 Pnt 2602 3749 Pnt 2495 3774 Pnt 2795 3793 Pnt 2682 3761 Pnt 2744 3753 Pnt 4477 3779 Pnt 2532 3834 Pnt 2681 3758 Pnt 2013 3844 Pnt 2042 3765 Pnt 2700 3764 Pnt 2425 3824 Pnt 3762 3761 Pnt 2635 3764 Pnt 2427 3772 Pnt 4009 3846 Pnt 3024 3760 Pnt 3039 3750 Pnt 2020 3777 Pnt 2134 3852 Pnt 2794 2777 Pnt 3599 3852 Pnt 2487 3747 Pnt 1991 3806 Pnt 2339 3828 Pnt 3405 3763 Pnt 1849 3789 Pnt 2666 3806 Pnt 3288 3812 Pnt 3644 3763 Pnt 3732 3741 Pnt 3191 3754 Pnt 3088 3770 Pnt 2200 3799 Pnt 2100 3774 Pnt 3041 3768 Pnt 2695 3758 Pnt 3383 3749 Pnt 3023 3768 Pnt 2677 3822 Pnt 3363 3823 Pnt 2852 3753 Pnt 2884 3775 Pnt 2849 3819 Pnt 3510 3746 Pnt 2408 3796 Pnt 2924 3753 Pnt 3325 3750 Pnt 3684 3742 Pnt 2756 3743 Pnt 2934 3838 Pnt 2969 3763 Pnt 2082 3810 Pnt 4125 3748 Pnt 3438 3838 Pnt 2577 3810 Pnt 2480 3788 Pnt 2492 3783 Pnt 2693 3750 Pnt 3928 3748 Pnt 2382 3792 Pnt 3052 3759 Pnt 2878 3766 Pnt 2099 3847 Pnt 2798 3750 Pnt 2351 3804 Pnt 2753 3808 Pnt 2501 3805 Pnt 2890 3806 Pnt 3028 3742 Pnt 3960 3797 Pnt 2614 3798 Pnt 2582 3806 Pnt 3029 3758 Pnt 2189 3773 Pnt 2791 3787 Pnt 2114 3784 Pnt 3212 3773 Pnt 2525 3855 Pnt 2479 3774 Pnt 2137 3917 Pnt 4098 3773 Pnt 3435 3777 Pnt 3341 3772 Pnt 2851 3762 Pnt 2203 3782 Pnt 1850 3770 Pnt 3115 3754 Pnt 3032 3755 Pnt 2872 3775 Pnt 2571 3869 Pnt 2877 3748 Pnt 2383 3774 Pnt 2550 3869 Pnt 3095 3788 Pnt 2917 3811 Pnt 2407 3772 Pnt 3090 3755 Pnt 2206 3925 Pnt 1977 3808 Pnt 3105 3754 Pnt 2147 3807 Pnt 2775 3753 Pnt 3675 3764 Pnt 2833 3821 Pnt 4266 3766 Pnt 2418 3776 Pnt 3104 3768 Pnt 2854 3757 Pnt 2761 3771 Pnt 2121 3757 Pnt 3766 3771 Pnt 3166 3747 Pnt 2870 3758 Pnt 2209 3810 Pnt 2618 3742 Pnt 2763 3774 Pnt 3136 3760 Pnt 2624 3779 Pnt 3025 3799 Pnt 2056 3770 Pnt 4175 2763 Pnt 2468 3837 Pnt 2221 3819 Pnt 2350 3755 Pnt 2098 3839 Pnt 3878 3837 Pnt 2447 3819 Pnt 3493 3746 Pnt 3816 3751 Pnt 2467 2819 Pnt 2541 3804 Pnt 2191 3808 Pnt 3308 3759 Pnt 2466 3756 Pnt 3513 3756 Pnt 3040 3762 Pnt 2450 3826 Pnt 2809 3805 Pnt 2668 3826 Pnt 2387 3796 Pnt 2760 3787 Pnt 2599 3826 Pnt 2019 3798 Pnt 2560 3797 Pnt 4678 3787 Pnt 2091 3806 Pnt 2578 3752 Pnt 2127 3791 Pnt 3934 3748 Pnt 2741 3823 Pnt 2739 3753 Pnt 2801 3777 Pnt 2316 3842 Pnt 2799 2946 Pnt 3023 3776 Pnt 2351 3797 Pnt 2042 3737 Pnt 2487 3749 Pnt 3398 3760 Pnt 2767 3753 Pnt 2536 3762 Pnt 3133 3757 Pnt 3036 3756 Pnt 2688 3757 Pnt 3204 3753 Pnt 2718 3792 Pnt 2348 3826 Pnt 2373 3781 Pnt 2923 3768 Pnt 1964 3815 Pnt 1924 3807 Pnt 3348 3819 Pnt 3214 3770 Pnt 2596 3750 Pnt 2044 3804 Pnt 3193 3796 Pnt 2756 3773 Pnt 3057 3750 Pnt 2218 3765 Pnt 3202 3760 Pnt 2625 3774 Pnt 2658 3769 Pnt 3274 3774 Pnt 2099 3832 Pnt 2511 3900 Pnt 4331 3769 Pnt 2944 3796 Pnt 2848 3755 Pnt 3282 3745 Pnt 2729 3767 Pnt 2383 3926 Pnt 4040 3743 Pnt 2977 3796 Pnt 4350 3773 Pnt 3979 3752 Pnt 2209 3791 Pnt 3346 2965 Pnt 2991 3743 Pnt 2860 3818 Pnt 3832 3780 Pnt 2776 3777 Pnt 3320 3771 Pnt 2560 3764 Pnt 3022 3767 Pnt 3983 3766 Pnt 2956 3752 Pnt 2859 3752 Pnt 2500 3826 Pnt 3176 3764 Pnt 2596 3851 Pnt 2007 3795 Pnt 3209 3847 Pnt 3119 3748 Pnt 2618 3784 Pnt 2228 3784 Pnt 2578 3792 Pnt 2216 3780 Pnt 3212 3791 Pnt 4012 3874 Pnt 2701 3852 Pnt 3240 3806 Pnt 2539 3814 Pnt 2556 3758 Pnt 2502 3791 Pnt 2931 3763 Pnt 2380 3777 Pnt 4240 3777 Pnt 2781 3762 Pnt 2855 3826 Pnt 2886 3802 Pnt 2474 3866 Pnt 3293 3776 Pnt 1889 3823 Pnt 3044 3757 Pnt 2759 3752 Pnt 2673 3772 Pnt 4303 3760 Pnt 3467 3756 Pnt 3349 3772 Pnt 2762 3818 Pnt 2998 3767 Pnt 2657 3768 Pnt 3137 3751 Pnt 4292 2971 Pnt 2354 3752 Pnt 3039 3803 Pnt 3329 3751 Pnt 2398 3775 Pnt 3005 3784 Pnt 2172 3784 Pnt 3710 3774 Pnt 2774 3795 Pnt 2577 3784 Pnt 3539 3757 Pnt 2689 3837 Pnt 2562 3767 Pnt 2218 3806 Pnt 3340 3747 Pnt 3282 3806 Pnt 2055 3800 Pnt 2015 3753 Pnt 2832 3759 Pnt 3336 3744 Pnt 3224 3747 Pnt 2267 3821 Pnt 2164 3797 Pnt 2767 3763 Pnt 2721 3835 Pnt 2900 3798 Pnt 2503 3844 Pnt 3107 3805 Pnt 3165 3753 Pnt 3973 3753 Pnt 2605 3771 Pnt 3958 3847 Pnt 2726 3778 Pnt 2682 3777 Pnt 4411 3765 Pnt 3190 3821 Pnt 2210 3787 Pnt 2241 3758 Pnt 3419 2951 Pnt 2993 3935 Pnt 2128 3796 Pnt 2000 3867 Pnt 4078 3751 Pnt 1909 3796 Pnt 2310 3935 Pnt 2762 3800 Pnt 3155 3750 Pnt 2416 3797 Pnt 2010 3804 Pnt 2773 3797 Pnt 3190 3760 Pnt 2013 3838 Pnt 2668 3798 Pnt 3267 3797 Pnt 2517 3755 Pnt 2926 3795 Pnt 3751 3765 Pnt 2039 3837 Pnt 2818 3765 Pnt 2450 3788 Pnt 2828 3753 Pnt 2698 3760 Pnt 2546 3784 Pnt 2477 3742 Pnt 2938 3912 Pnt 2640 3784 Pnt 3236 3745 Pnt 2457 3814 Pnt 3070 3827 Pnt 2714 3751 Pnt 2793 3755 Pnt 2936 3761 Pnt 2529 3803 Pnt 2964 3766 Pnt 2588 3771 Pnt 3675 3763 Pnt 2699 3796 Pnt 2987 3763 Pnt 2274 3789 Pnt 3885 3780 Pnt 4121 3757 Pnt 3260 3742 Pnt 2434 3812 Pnt 3664 2720 Pnt 2023 3790 Pnt 2706 3786 Pnt 2358 3760 Pnt 3099 3795 Pnt 3766 3747 Pnt 2022 3831 Pnt 2361 3826 Pnt 3970 2831 Pnt 2058 3851 Pnt 3802 3748 Pnt 2917 3851 Pnt 3539 3766 Pnt 2811 2916 Pnt 4070 3756 Pnt 2132 3790 Pnt 2884 3756 Pnt 2442 3744 Pnt 3858 3762 Pnt 2640 3848 Pnt 2592 3818 Pnt 2350 3767 Pnt 3548 3758 Pnt 3815 3752 Pnt 2430 3803 Pnt 2995 3757 Pnt 2932 3785 Pnt 2706 3794 Pnt 3994 3803 Pnt 4069 3755 Pnt 2486 3800 Pnt 2271 3835 Pnt 3321 2815 Pnt 3215 3753 Pnt 2617 3818 Pnt 2624 3829 Pnt 2235 3901 Pnt 2842 3794 Pnt 2771 3799 Pnt 2561 3805 Pnt 3112 3799 Pnt 3355 3794 Pnt 2970 3802 Pnt 2392 3837 Pnt 2832 3811 Pnt 4107 2918 Pnt 2904 3786 Pnt 2456 3808 Pnt 2854 3827 Pnt 2284 3768 Pnt 2772 3787 Pnt 2478 3798 Pnt 2666 3871 Pnt 1960 3800 Pnt 2896 3763 Pnt 3150 3774 Pnt 2578 3759 Pnt 2547 3810 Pnt 1933 3743 Pnt 3973 3754 Pnt 2765 3755 Pnt 3124 3784 Pnt 2390 3784 Pnt 3436 3808 Pnt 3931 3755 Pnt 2767 3778 Pnt 3141 3784 Pnt 2527 3759 Pnt 2981 3787 Pnt 2877 3752 Pnt 1867 3806 Pnt 3137 3755 Pnt 3411 3766 Pnt 2385 3810 Pnt 4113 3755 Pnt 3312 3765 Pnt 3033 3752 Pnt 2976 3753 Pnt 3843 3804 Pnt 2521 3813 Pnt 2452 3798 Pnt 3380 3789 Pnt 4056 3768 Pnt 3171 3775 Pnt 3971 3805 Pnt 2837 3789 Pnt 2754 3746 Pnt 2254 3825 Pnt 2423 3776 Pnt 2818 3746 Pnt 3285 3786 Pnt 2704 3769 Pnt 2539 3788 Pnt 2515 3774 Pnt 3225 3773 Pnt 2149 3833 Pnt 2203 3762 Pnt 2099 3832 Pnt 2217 3803 Pnt 3190 3773 Pnt 3696 3803 Pnt 2224 3780 Pnt 3102 3751 Pnt 3297 3772 Pnt 4448 3771 Pnt 2547 3818 Pnt 2372 3901 Pnt 2583 3764 Pnt 2147 3827 Pnt 2600 3771 Pnt 3776 3749 Pnt 2305 3881 Pnt 3151 3771 Pnt 2917 3797 Pnt 2691 3753 Pnt 3938 2948 Pnt 2059 3773 Pnt 2821 3760 Pnt 3198 3773 Pnt 3241 3761 Pnt 2548 3751 Pnt 2084 3799 Pnt 2171 3807 Pnt 3149 3761 Pnt 2008 3767 Pnt 2721 3765 Pnt 2437 3805 Pnt 3874 3826 Pnt 2891 3771 Pnt 2474 3788 Pnt 2289 3816 Pnt 2925 3748 Pnt 2648 3749 Pnt 2895 3769 Pnt 3107 2818 Pnt 2891 3803 Pnt 2895 3776 Pnt 2577 3778 Pnt 2286 3804 Pnt 2506 3763 Pnt 2776 3742 Pnt 3359 3782 Pnt 1976 3771 Pnt 2942 3742 Pnt 2377 3861 Pnt 3948 3759 Pnt 2771 3858 Pnt 2525 3781 Pnt 2377 3863 Pnt 2590 3858 Pnt 2523 3799 Pnt 3017 3810 Pnt 1984 3820 Pnt 2433 3783 Pnt 2288 3858 Pnt 2643 3789 Pnt 3223 3783 Pnt 2874 3798 Pnt 1943 3773 Pnt 3107 3754 Pnt 1876 3795 Pnt 2758 3792 Pnt 2515 3804 Pnt 2323 3765 Pnt 2749 3802 Pnt 2209 3806 Pnt 4221 3795 Pnt 2939 3792 Pnt 2409 3794 Pnt 3117 3783 Pnt 2242 3774 Pnt 2998 3790 Pnt 2902 3776 Pnt 3909 3792 Pnt 3502 3792 Pnt 2040 3795 Pnt 2817 3768 Pnt 3132 3798 Pnt 2272 3790 Pnt 3274 3792 Pnt 2382 3806 Pnt 2914 3750 Pnt 2876 3759 Pnt 2942 3753 Pnt 2437 3796 Pnt 3517 3756 Pnt 2462 3800 Pnt 2987 3796 Pnt 2349 3802 Pnt 3803 3753 Pnt 3112 3787 Pnt 2759 3752 Pnt 3590 3781 Pnt 2628 3770 Pnt 2598 3765 Pnt 2928 3770 Pnt 2386 3808 Pnt 3373 3781 Pnt 3397 3754 Pnt 2234 3790 Pnt 2780 3741 Pnt 2722 3763 Pnt 3442 3754 Pnt 2353 3757 Pnt 2850 3797 Pnt 2477 3778 Pnt 3264 3786 Pnt 4113 3766 Pnt 3273 3760 Pnt 3017 3808 Pnt 2056 3782 Pnt 2760 3760 Pnt 2790 3747 Pnt 3165 3762 Pnt 2510 3826 Pnt 2829 3758 Pnt 2644 3761 Pnt 2506 3826 Pnt 4037 3750 Pnt 2711 3752 Pnt 3045 3745 Pnt 3221 3752 Pnt 2590 3757 Pnt 2978 3784 Pnt 2683 3780 Pnt 2542 3764 Pnt 2841 3759 Pnt 2401 3747 Pnt 2423 3830 Pnt 2415 3790 Pnt 4408 3777 Pnt 3253 3795 Pnt 2781 3747 Pnt 2650 3791 Pnt 3962 3812 Pnt 4055 3791 Pnt 3943 3791 Pnt 2325 3766 Pnt 3125 3810 Pnt 2667 3763 Pnt 2482 3747 Pnt 3452 3766 Pnt 2817 3763 Pnt 2363 3799 Pnt 2243 3799 Pnt 1938 3934 Pnt 2247 3806 Pnt 3351 3758 Pnt 2722 3753 Pnt 2712 3829 Pnt 2580 3803 Pnt 4069 3753 Pnt 2814 3745 Pnt 2212 3802 Pnt 2399 3773 Pnt 3041 3767 Pnt 2795 3803 Pnt 2881 3753 Pnt 2910 3944 Pnt 2512 3802 Pnt 2949 3757 Pnt 2603 3792 Pnt 4593 3784 Pnt 2307 3943 Pnt 2850 3755 Pnt 2927 3773 Pnt 2667 3812 Pnt 2359 3763 Pnt 2317 3764 Pnt 2986 3757 Pnt 2717 3763 Pnt 2778 3804 Pnt 2699 3809 Pnt 3327 3774 Pnt 2765 3783 Pnt 2955 3828 Pnt 2349 3799 Pnt 2089 3811 Pnt 3926 3783 Pnt 2083 3809 Pnt 3737 3810 Pnt 4116 2943 Pnt 2509 3801 Pnt 2210 3743 Pnt 3921 3751 Pnt 2498 3765 Pnt 1861 3746 Pnt 2802 3784 Pnt 2766 3791 Pnt 2697 3740 Pnt 4046 2876 Pnt 3396 3762 Pnt 2659 3750 Pnt 2157 3829 Pnt 3207 2923 Pnt 2945 3758 Pnt 2852 3775 Pnt 4442 3825 Pnt 3423 3747 Pnt 2705 3784 Pnt 2654 3784 Pnt 2098 3845 Pnt 2603 3758 Pnt 3117 3784 Pnt 2052 3763 Pnt 2839 3834 Pnt 2153 3748 Pnt 3318 3838 Pnt 2236 3797 Pnt 2126 3799 Pnt 2365 3791 Pnt 2252 3809 Pnt 3164 3801 Pnt 2997 3791 Pnt 2581 3755 Pnt 3167 3742 Pnt 2539 3770 Pnt 2108 3774 Pnt 3407 3755 Pnt 2762 3746 Pnt 2595 3763 Pnt 3356 3744 Pnt 2733 3742 Pnt 2631 3771 Pnt 2687 3819 Pnt 3842 3769 Pnt 2156 3810 Pnt 2678 3787 Pnt 2142 3819 Pnt 2310 3829 Pnt 2815 3854 Pnt 2745 3766 Pnt 3604 3776 Pnt 2465 3827 Pnt 2357 3772 Pnt 3916 3752 Pnt 2461 3772 Pnt 2309 3767 Pnt 3544 3763 Pnt 2069 3822 Pnt 2767 3769 Pnt 3123 3815 Pnt 3913 3822 Pnt 2834 3782 Pnt 2527 3756 Pnt 4337 3785 Pnt 2307 3847 Pnt 2647 3769 Pnt 2855 3756 Pnt 2088 3803 Pnt 2713 3765 Pnt 3386 3755 Pnt 2543 3783 Pnt 3563 3768 Pnt 2793 3751 Pnt 2860 3773 Pnt 2402 3758 Pnt 2147 3901 Pnt 3340 3750 Pnt 3466 3769 Pnt 2398 3820 Pnt 2974 3744 Pnt 2615 3830 Pnt 3048 3761 Pnt 2032 3834 Pnt 2666 3802 Pnt 3969 3783 Pnt 2723 3810 Pnt 3057 3828 Pnt 2266 3808 Pnt 3198 3761 Pnt 2771 3743 Pnt 2353 3739 Pnt 2163 3767 Pnt 2738 3755 Pnt 2599 3750 Pnt 2580 3775 Pnt 2859 3767 Pnt 2638 3757 Pnt 2588 3809 Pnt 2908 3760 Pnt 2537 3822 Pnt 2515 3755 Pnt 2918 3798 Pnt 2410 3824 Pnt 3935 3754 Pnt 2719 3814 Pnt 2750 3764 Pnt 2780 3791 Pnt 3304 3760 Pnt 3375 3798 Pnt 2091 3748 Pnt 3152 3776 Pnt 3016 3756 Pnt 2946 3744 Pnt 2662 3804 Pnt 2637 3753 Pnt 3038 3789 Pnt 2146 3773 Pnt 3006 3829 Pnt 3718 3744 Pnt 3585 3750 Pnt 3046 3773 Pnt 2548 3782 Pnt 2525 3827 Pnt 3680 3750 Pnt 3041 3744 Pnt 2598 3761 Pnt 2432 3780 Pnt 2498 3813 Pnt 2167 3792 Pnt 3273 3770 Pnt 2872 3761 Pnt 2861 3779 Pnt 2712 3762 Pnt 2495 3809 Pnt 2460 3785 Pnt 2660 3770 Pnt 2407 3781 Pnt 2200 3840 Pnt 3064 3774 Pnt 2851 3791 Pnt 2748 3780 Pnt 2635 3808 Pnt 2559 3758 Pnt 3252 3815 Pnt 3113 3765 Pnt 2049 3801 Pnt 2710 3774 Pnt 2373 3879 Pnt 2693 3773 Pnt 1857 3789 Pnt 3560 3765 Pnt 2989 3878 Pnt 2512 3844 Pnt 2710 3812 Pnt 3209 3811 Pnt 2317 3753 Pnt 2918 3753 Pnt 2516 3839 Pnt 2475 3839 Pnt 2657 3822 Pnt 2387 3778 Pnt 3940 3822 Pnt 2734 3817 Pnt 2142 3892 Pnt 3177 3838 Pnt 2598 3767 Pnt 3532 3778 Pnt 2421 3789 Pnt 2888 3767 Pnt 3662 3892 Pnt 4088 3754 Pnt 3238 3804 Pnt 2420 3743 Pnt 3018 3782 Pnt 2580 3758 Pnt 2007 3791 Pnt 3671 3758 Pnt 4252 3803 Pnt 2246 3810 Pnt 2155 3793 Pnt 2255 3799 Pnt 2607 3810 Pnt 2940 3782 Pnt 2685 3765 Pnt 2780 3746 Pnt 4123 3782 Pnt 3350 3823 Pnt 2086 3838 Pnt 1959 3829 Pnt 2552 3757 Pnt 3195 3752 Pnt 2306 3752 Pnt 3031 3777 Pnt 3202 3771 Pnt 2167 3805 Pnt 2481 3795 Pnt 3067 3777 Pnt 3536 3838 Pnt 3420 3756 Pnt 3576 3767 Pnt 3907 3749 Pnt 3113 3756 Pnt 2848 3754 Pnt 3117 3754 Pnt 2792 3787 Pnt 2835 3818 Pnt 3357 3763 Pnt 2674 3833 Pnt 2247 3810 Pnt 2304 3805 Pnt 2461 3777 Pnt 2258 3826 Pnt 3239 3759 Pnt 2995 3815 Pnt 3926 3815 Pnt 3839 3792 Pnt 3323 3772 Pnt 2270 3786 Pnt 3013 3790 Pnt 3381 3758 Pnt 2314 3823 Pnt 2472 3756 Pnt 2508 3828 Pnt 4149 3744 Pnt 2290 3803 Pnt 2829 3763 Pnt 2833 3773 Pnt 2234 3788 Pnt 3011 3792 Pnt 2839 3761 Pnt 1853 3813 Pnt 1989 3791 Pnt 4245 3762 Pnt 2058 3932 Pnt 3202 3802 Pnt 2312 3814 Pnt 2613 3748 Pnt 4233 3759 Pnt 3223 3750 Pnt 2702 3760 Pnt 2612 3747 Pnt 2266 3783 Pnt 2152 3781 Pnt 3144 3781 Pnt 3443 2880 Pnt 2932 3749 Pnt 2844 3840 Pnt 2201 3852 Pnt 2666 3749 Pnt 2645 3797 Pnt 4239 3840 Pnt 3392 3748 Pnt 1908 3803 Pnt 2888 3757 Pnt 2715 3755 Pnt 2799 3748 Pnt 2579 3754 Pnt 2878 3790 Pnt 2575 3747 Pnt 2539 3757 Pnt 2165 3745 Pnt 2993 3754 Pnt 4108 3760 Pnt 2360 3806 Pnt 2522 3809 Pnt 2778 3775 Pnt 2002 3778 Pnt 2744 3777 Pnt 2695 3819 Pnt 2654 3778 Pnt 2605 3812 Pnt 3986 2853 Pnt 2678 3755 Pnt 4274 3764 Pnt 3019 3826 Pnt 2066 3925 Pnt 2875 3750 Pnt 1828 3808 Pnt 2625 3945 Pnt 2022 3807 Pnt 3923 3762 Pnt 2517 3752 Pnt 2768 3753 Pnt 2797 3825 Pnt 3761 3753 Pnt 2782 3787 Pnt 2846 3785 Pnt 3910 3747 Pnt 3318 3785 Pnt 2377 3840 Pnt 2876 3848 Pnt 2829 3757 Pnt 2341 3807 Pnt 2266 3806 Pnt 3412 3756 Pnt 3069 3766 Pnt 2611 3787 Pnt 2960 3816 Pnt 3976 3752 Pnt 2342 3807 Pnt 2829 3771 Pnt 2706 3789 Pnt 4074 3758 Pnt 2900 3787 Pnt 2609 3739 Pnt 4568 3748 Pnt 2430 3803 Pnt 2936 3799 Pnt 3620 3803 Pnt 2038 3839 Pnt 2865 3744 Pnt 2061 3751 Pnt 2059 3839 Pnt 2211 3772 Pnt 2703 3742 Pnt 2211 3773 Pnt 2731 3745 Pnt 3923 3773 Pnt 1990 3775 Pnt 2515 3777 Pnt 2362 3782 Pnt 2944 3770 Pnt 2852 3779 Pnt 2270 3814 Pnt 3957 3779 Pnt 2119 3819 Pnt 2834 3808 Pnt 3408 3775 Pnt 2577 3774 Pnt 3322 3765 Pnt 2214 3762 Pnt 2859 3755 Pnt 2622 3802 Pnt 3140 3761 Pnt 2599 3761 Pnt 3250 3760 Pnt 2849 3743 Pnt 2155 3835 Pnt 2077 3770 Pnt 2719 3795 Pnt 3262 3743 Pnt 2022 3776 Pnt 4429 3779 Pnt 3060 3851 Pnt 3274 3778 Pnt 2423 3771 Pnt 3079 3782 Pnt 3127 3789 Pnt 4046 3763 Pnt 3823 3782 Pnt 2006 3779 Pnt 3363 3784 Pnt 3025 3796 Pnt 2463 3780 Pnt 2637 3773 Pnt 2619 3796 Pnt 4046 3746 Pnt 3027 3743 Pnt 2735 3779 Pnt 2756 3752 Pnt 3128 3766 Pnt 2616 3774 Pnt 2975 3778 Pnt 2365 3815 Pnt 2583 3783 Pnt 2596 3772 Pnt 2393 3926 Pnt 3693 3759 Pnt 2980 3796 Pnt 2380 3825 Pnt 2939 3805 Pnt 2062 3779 Pnt 2596 3766 Pnt 2683 3796 Pnt 3673 3742 Pnt 2965 3747 Pnt 2694 3774 Pnt 2470 3826 Pnt 2280 3812 Pnt 3194 2850 Pnt 2484 3786 Pnt 2779 3761 Pnt 2492 3787 Pnt 2912 3791 Pnt 2736 3818 Pnt 3188 3802 Pnt 4375 3771 Pnt 2221 3766 Pnt 2794 3806 Pnt 2779 3795 Pnt 2288 3764 Pnt 3126 3766 Pnt 2842 3755 Pnt 3100 3796 Pnt 2448 3791 Pnt 2945 3806 Pnt 3695 3761 Pnt 2542 3860 Pnt 2463 3796 Pnt 2442 3826 Pnt 3304 3806 Pnt 2367 3852 Pnt 2603 3756 Pnt 3305 3752 Pnt 2954 3853 Pnt 2738 3753 Pnt 2303 3772 Pnt 1898 3819 Pnt 3142 3828 Pnt 2681 3784 Pnt 2520 3750 Pnt 2608 3774 Pnt 2718 3818 Pnt 2034 3804 Pnt 2356 3840 Pnt 2570 3840 Pnt 2949 3771 Pnt 2497 3747 Pnt 3643 3771 Pnt 3552 3791 Pnt 3336 3750 Pnt 3140 3791 Pnt 3046 3751 Pnt 2326 3842 Pnt 3277 3779 Pnt 2206 3752 Pnt 2163 3812 Pnt 3391 3801 Pnt 2684 3784 Pnt 2000 3774 Pnt 3224 3823 Pnt 4049 3783 Pnt 2394 3797 Pnt 2062 2809 Pnt 3694 3788 Pnt 2073 3815 Pnt 2703 3780 Pnt 2759 3768 Pnt 3286 3797 Pnt 2995 3821 Pnt 2849 3774 Pnt 2652 3815 Pnt 2423 3768 Pnt 2588 3749 Pnt 2281 3798 Pnt 2509 3759 Pnt 2514 3767 Pnt 2235 3807 Pnt 2710 3808 Pnt 2173 3784 Pnt 3453 3795 Pnt 2382 3799 Pnt 2728 3777 Pnt 2776 3762 Pnt 2760 3777 Pnt 3164 3777 Pnt 2826 3742 Pnt 2605 3783 Pnt 2302 3855 Pnt 2743 3753 Pnt 2004 3804 Pnt 2374 3792 Pnt 2413 3916 Pnt 3301 3767 Pnt 4103 3753 Pnt 3214 3806 Pnt 2569 3749 Pnt 2088 3826 Pnt 4205 3760 Pnt 2775 3760 Pnt 2663 3776 Pnt 2297 3821 Pnt 2221 3798 Pnt 3291 3826 Pnt 3588 3786 Pnt 2926 3764 Pnt 2490 3800 Pnt 2411 3744 Pnt 3228 3753 Pnt 2438 3869 Pnt 2935 3755 Pnt 2933 3900 Pnt 2909 3797 Pnt 2460 3841 Pnt 3324 3797 Pnt 3075 3841 Pnt 2796 3874 Pnt 2900 3805 Pnt 2859 3821 Pnt 3363 3762 Pnt 2777 3791 Pnt 2652 3771 Pnt 2586 3807 Pnt 3898 3791 Pnt 3218 3760 Pnt 3049 3796 Pnt 2825 3802 Pnt 2491 3800 Pnt 3821 3768 Pnt 2070 3800 Pnt 3042 3771 Pnt 2330 3796 Pnt 2479 3771 Pnt 3000 3767 Pnt 2449 3750 Pnt 2487 3765 Pnt 4396 3769 Pnt 2636 3769 Pnt 2347 3780 Pnt 3535 3780 Pnt 2556 3771 Pnt 3815 3763 Pnt 2431 3771 Pnt 2850 3827 Pnt 2605 3804 Pnt 1953 3800 Pnt 2852 3796 Pnt 2254 3808 Pnt 2847 3780 Pnt 3319 3763 Pnt 2642 3756 Pnt 3107 3847 Pnt 3449 3766 Pnt 2066 3826 Pnt 4528 3776 Pnt 2417 3790 Pnt 4054 3752 Pnt 2559 3814 Pnt 2447 3789 Pnt 2559 3834 Pnt 2412 3786 Pnt 2672 3780 Pnt 2333 3760 Pnt 2674 3758 Pnt 2781 3756 Pnt 2694 3798 Pnt 2227 3823 Pnt 3155 3758 Pnt 2248 3777 Pnt 3057 3752 Pnt 2668 3770 Pnt 2473 3772 Pnt 3078 3762 Pnt 2732 3846 Pnt 2268 3823 Pnt 3380 3848 Pnt 3721 3848 Pnt 2461 3777 Pnt 2564 3803 Pnt 1980 3759 Pnt 2818 3759 Pnt 2620 3757 Pnt 2932 3754 Pnt 2402 3767 Pnt 3090 3774 Pnt 4491 3790 Pnt 2402 3799 Pnt 3554 3773 Pnt 2505 3759 Pnt 2807 3784 Pnt 2416 3837 Pnt 2267 3828 Pnt 4395 3775 Pnt 2288 3743 Pnt 2420 3802 Pnt 2312 3763 Pnt 2445 3806 Pnt 2568 3770 Pnt 3899 3781 Pnt 2301 3811 Pnt 3321 3810 Pnt 2668 3774 Pnt 2301 3784 Pnt 2061 3804 Pnt 2896 3804 Pnt 2823 3784 Pnt 2249 3794 Pnt 2923 3769 Pnt 2382 3794 Pnt 2156 3769 Pnt 2900 3766 Pnt 2232 3788 Pnt 4116 3752 Pnt 2987 3765 Pnt 3046 3778 Pnt 2554 3786 Pnt 3340 3773 Pnt 3927 3757 Pnt 2584 3766 Pnt 2250 3780 Pnt 2935 3766 Pnt 2531 3788 Pnt 4094 3765 Pnt 2423 3810 Pnt 2399 3788 Pnt 4304 3780 Pnt 2905 3751 Pnt 3030 3765 Pnt 2659 3759 Pnt 3358 3757 Pnt 3009 3772 Pnt 3163 3776 Pnt 2874 3783 Pnt 3960 3780 Pnt 3125 3773 Pnt 2857 3753 Pnt 2812 3752 Pnt 2322 3901 Pnt 1951 3753 Pnt 2427 3763 Pnt 2435 3818 Pnt 3461 3755 Pnt 2619 3770 Pnt 3441 3747 Pnt 3540 3759 Pnt 3695 3768 Pnt 3019 3813 Pnt 2392 3798 Pnt 3998 3752 Pnt 2021 3797 Pnt 2931 3820 Pnt 2083 3789 Pnt 4099 3739 Pnt 3970 3756 Pnt 2618 3807 Pnt 2886 3798 Pnt 3060 3807 Pnt 2912 3779 Pnt 2751 3763 Pnt 2456 3825 Pnt 2881 3011 Pnt 2290 3777 Pnt 2378 3752 Pnt 3534 3837 Pnt 3130 3752 Pnt 2473 3760 Pnt 2890 3814 Pnt 2181 3778 Pnt 2696 3814 Pnt 3433 3807 Pnt 2691 3774 Pnt 2398 3838 Pnt 2807 3786 Pnt 2924 3774 Pnt 2286 3809 Pnt 2964 3797 Pnt 2845 3797 Pnt 3216 3806 Pnt 2482 3771 Pnt 2904 3760 Pnt 2568 3816 Pnt 2363 3762 Pnt 2652 3761 Pnt 2646 3760 Pnt 2385 3768 Pnt 2471 3808 Pnt 2935 3816 Pnt 2118 3832 Pnt 2832 3742 Pnt 2534 3805 Pnt 2002 3784 Pnt 2149 3841 Pnt 2597 3789 Pnt 2381 3821 Pnt 3358 3841 Pnt 2684 3758 Pnt 2828 3761 Pnt 2459 3795 Pnt 2803 3795 Pnt 2597 3798 Pnt 2256 3760 Pnt 2440 3796 Pnt 2005 3803 Pnt 2998 3757 Pnt 2498 3806 Pnt 2647 3796 Pnt 2053 3867 Pnt 3572 3786 Pnt 2233 3795 Pnt 2955 3858 Pnt 2525 3764 Pnt 3305 3760 Pnt 2652 3773 Pnt 2829 3747 Pnt 2647 3790 Pnt 3345 3747 Pnt 2971 3781 Pnt 3320 3870 Pnt 2791 3788 Pnt 2662 3765 Pnt 3303 3812 Pnt 2721 3764 Pnt 2702 3767 Pnt 2558 3825 Pnt 2226 3799 Pnt 3538 3759 Pnt 2957 3802 Pnt 2491 3784 Pnt 2082 3799 Pnt 2404 3802 Pnt 3422 3785 Pnt 3195 3771 Pnt 3724 3762 Pnt 2380 3742 Pnt 1938 3934 Pnt 3359 3792 Pnt 2600 3766 Pnt 4031 3785 Pnt 2575 3753 Pnt 2609 3879 Pnt 3168 3912 Pnt 2623 3752 Pnt 3591 2874 Pnt 2222 3799 Pnt 3167 3810 Pnt 2727 3752 Pnt 2232 3826 Pnt 2490 3797 Pnt 2471 3814 Pnt 2627 3763 Pnt 2402 3761 Pnt 2142 3784 Pnt 3776 3748 Pnt 2654 3762 Pnt 2528 3747 Pnt 2492 3757 Pnt 2490 3826 Pnt 2499 3802 Pnt 3515 3805 Pnt 3487 3783 Pnt 2588 3766 Pnt 2357 3808 Pnt 2590 3750 Pnt 2647 3781 Pnt 3124 3750 Pnt 2469 3818 Pnt 3659 3752 Pnt 2308 3761 Pnt 2522 3780 Pnt 4111 3771 Pnt 2262 3812 Pnt 4244 3761 Pnt 2898 3761 Pnt 2557 3838 Pnt 2625 3791 Pnt 3097 3824 Pnt 2855 3757 Pnt 2475 3786 Pnt 3114 3867 Pnt 2965 3765 Pnt 3544 3762 Pnt 2381 3768 Pnt 2282 3788 Pnt 3388 3867 Pnt 2039 3810 Pnt 3336 3810 Pnt 2971 3796 Pnt 2155 3797 Pnt 2845 3785 Pnt 2275 3826 Pnt 1900 3819 Pnt 2507 3749 Pnt 2497 3858 Pnt 2943 3801 Pnt 2830 3799 Pnt 2059 3851 Pnt 2608 3800 Pnt 3083 3775 Pnt 2620 3791 Pnt 2223 3833 Pnt 2597 3824 Pnt 3417 3833 Pnt 3286 3749 Pnt 3469 3800 Pnt 2694 3752 Pnt 2444 3796 Pnt 2389 3799 Pnt 2946 3796 Pnt 2605 3809 Pnt 3334 3800 Pnt 3171 3780 Pnt 2741 3786 Pnt 2964 3765 Pnt 3415 3760 Pnt 2683 3759 Pnt 1927 3798 Pnt 3027 3754 Pnt 2045 3871 Pnt 3194 3867 Pnt 2707 3757 Pnt 2671 3783 Pnt 4071 3748 Pnt 4210 3762 Pnt 2641 3808 Pnt 3136 3775 Pnt 2725 3755 Pnt 2645 3824 Pnt 3650 3830 Pnt 3543 3763 Pnt 2313 3834 Pnt 2884 3748 Pnt 3266 3798 Pnt 3660 3748 Pnt 2944 3758 Pnt 3923 3758 Pnt 1985 3773 Pnt 2705 3772 Pnt 1993 3820 Pnt 2709 3786 Pnt 2841 3772 Pnt 2756 3753 Pnt 2387 3819 Pnt 2610 3783 Pnt 2651 3827 Pnt 2733 3812 Pnt 2650 3767 Pnt 2434 3830 Pnt 3079 3812 Pnt 2025 3822 Pnt 4541 3778 Pnt 3221 3822 Pnt 2040 3878 Pnt 3041 3756 Pnt 3337 3879 Pnt 2187 3753 Pnt 1727 3761 Pnt 1946 3834 Pnt 3392 3771 Pnt 3989 3756 Pnt 2637 3767 Pnt 2290 3780 Pnt 2656 3802 Pnt 3001 3826 Pnt 2534 3767 Pnt 3874 3761 Pnt 2693 3787 Pnt 2459 3813 Pnt 3102 3805 Pnt 1991 3824 Pnt 2536 3810 Pnt 3026 3797 Pnt 2454 3854 Pnt 2889 3799 Pnt 2816 3804 Pnt 2169 3760 Pnt 3837 3754 Pnt 2926 3854 Pnt 2512 3770 Pnt 3153 3772 Pnt 2757 3801 Pnt 3578 3744 Pnt 2335 3774 Pnt 2784 3772 Pnt 2814 3762 Pnt 2613 3778 Pnt 4288 3765 Pnt 2797 3753 Pnt 2909 3751 Pnt 2553 3818 Pnt 2890 3784 Pnt 2221 3797 Pnt 2167 3813 Pnt 2648 3747 Pnt 3847 3818 Pnt 2581 3817 Pnt 2564 3784 Pnt 3069 3829 Pnt 1910 3811 Pnt 3814 3757 Pnt 3137 3804 Pnt 2370 3778 Pnt 2134 3901 Pnt 3230 3811 Pnt 3250 3754 Pnt 2951 3777 Pnt 3736 3901 Pnt 2859 3755 Pnt 2048 3794 Pnt 2787 3765 Pnt 3537 3754 Pnt 2533 3770 Pnt 3086 3779 Pnt 2160 3774 Pnt 2857 3755 Pnt 2497 3805 Pnt 2830 3758 Pnt 2893 3756 Pnt 2676 3743 Pnt 2978 3805 Pnt 2542 3783 Pnt 2111 3834 Pnt 3513 3782 Pnt 3996 3743 Pnt 2269 3765 Pnt 3155 3750 Pnt 2989 3763 Pnt 3493 3797 Pnt 2735 3784 Pnt 1998 3803 Pnt 3176 3767 Pnt 2223 3808 Pnt 2961 3765 Pnt 3058 3774 Pnt 1987 3763 Pnt 2903 3776 Pnt 2636 3763 Pnt 2168 3827 Pnt 3142 3805 Pnt 2529 3819 Pnt 2198 3842 Pnt 3054 3751 Pnt 2331 3804 Pnt 2322 3768 Pnt 2764 3811 Pnt 2096 3748 Pnt 2158 3901 Pnt 2294 3810 Pnt 4215 3763 Pnt 2951 3752 Pnt 2661 3766 Pnt 3417 3810 Pnt 2510 3767 Pnt 2342 3749 Pnt 3544 3773 Pnt 2223 3810 Pnt 3109 3752 Pnt 2074 3826 Pnt 2873 3755 Pnt 3889 3778 Pnt 2026 3746 Pnt 2861 3752 Pnt 4068 2736 Pnt 1996 3807 Pnt 2843 3797 Pnt 2643 3785 Pnt 2946 3815 Pnt 3708 3785 Pnt 2464 3810 Pnt 3535 3759 Pnt 3394 3797 Pnt 2045 3793 Pnt 3449 3769 Pnt 3060 3787 Pnt 2363 3829 Pnt 3214 3829 Pnt 2471 3790 Pnt 2946 3791 Pnt 3712 3743 Pnt 3308 3761 Pnt 2896 3803 Pnt 2430 3764 Pnt 1757 3813 Pnt 3763 3761 Pnt 2933 3803 Pnt 2672 3763 Pnt 4336 3774 Pnt 3072 3787 Pnt 1952 3804 Pnt 2798 3813 Pnt 2435 3768 Pnt 1929 3802 Pnt 2297 3754 Pnt 2435 3810 Pnt 2232 3792 Pnt 3038 3803 Pnt 2193 3773 Pnt 3592 3754 Pnt 2873 3802 Pnt 2365 3804 Pnt 4032 3803 Pnt 2641 3780 Pnt 2770 3800 Pnt 2541 3804 Pnt 2548 3814 Pnt 3565 3760 Pnt 2766 3780 Pnt 2513 3745 Pnt 2226 3842 Pnt 2538 3874 Pnt 2261 3743 Pnt 2910 3748 Pnt 2577 3757 Pnt 2500 3757 Pnt 3768 3809 Pnt 2313 3823 Pnt 2756 3778 Pnt 3670 3743 Pnt 3797 3815 Pnt 2581 3746 Pnt 2428 3828 Pnt 2590 3805 Pnt 2778 3778 Pnt 3067 3805 Pnt 2950 3763 Pnt 2641 3755 Pnt 2642 3747 Pnt 2705 3765 Pnt 3732 3753 Pnt 2747 3749 Pnt 3140 3765 Pnt 2141 3773 Pnt 2988 3750 Pnt 2691 3754 Pnt 1928 3812 Pnt 2127 3743 Pnt 2395 3818 Pnt 2288 3768 Pnt 3087 3815 Pnt 2173 3790 Pnt 2667 3749 Pnt 2056 3852 Pnt 2287 3740 Pnt 2362 3808 Pnt 3805 3791 Pnt 2946 3749 Pnt 4535 3746 Pnt 2667 3803 Pnt 2334 3823 Pnt 2666 3812 Pnt 4215 3743 Pnt 2746 3782 Pnt 2015 3925 Pnt 2795 3777 Pnt 2598 3745 Pnt 2608 3779 Pnt 2516 3750 Pnt 2449 3754 Pnt 1748 3808 Pnt 2938 3777 Pnt 4166 3756 Pnt 2852 3790 Pnt 2169 3783 Pnt 2868 3945 Pnt 3729 3759 Pnt 2630 3757 Pnt 2872 3764 Pnt 2602 3755 Pnt 4240 3762 Pnt 2667 3756 Pnt 2608 3762 Pnt 1782 3777 Pnt 2737 3753 Pnt 1871 3825 Pnt 2906 3751 Pnt 2591 3822 Pnt 2648 3785 Pnt 2066 3775 Pnt 2506 3742 Pnt 2135 3819 Pnt 3187 3819 Pnt 2361 3807 Pnt 2546 3808 Pnt 2685 3764 Pnt 3050 3774 Pnt 2608 3774 Pnt 3972 3792 Pnt 4344 3763 Pnt 4120 3769 Pnt 2425 3834 Pnt 3648 3759 Pnt 2638 3749 Pnt 3388 3769 Pnt 3002 3781 Pnt 2167 3803 Pnt 2810 3838 Pnt 2595 3739 Pnt 2600 3790 Pnt 1997 3839 Pnt 2456 3767 Pnt 2490 3799 Pnt 2542 3758 Pnt 3702 3768 Pnt 3658 3799 Pnt 3782 3744 Pnt 3150 3774 Pnt 2500 3756 Pnt 2991 3759 Pnt 2488 3757 Pnt 2564 3773 Pnt 2954 3753 Pnt 2589 3772 Pnt 2263 3803 Pnt 1959 3782 Pnt 2698 3742 Pnt 2248 3926 Pnt 3896 3768 Pnt 3585 3782 Pnt 2498 3758 Pnt 2811 3812 Pnt 2604 3755 Pnt 4287 3749 Pnt 2696 3743 Pnt 2851 3771 Pnt 2830 3778 Pnt 2544 3831 Pnt 2302 3783 Pnt 4046 3752 Pnt 2387 3823 Pnt 2717 3759 Pnt 2187 3806 Pnt 2875 3795 Pnt 2607 3779 Pnt 2285 3825 Pnt 4009 3773 Pnt 3781 3779 Pnt 3052 3824 Pnt 2300 3814 Pnt 2344 3757 Pnt 3111 3816 Pnt 3817 3806 Pnt 2836 3807 Pnt 3074 3753 Pnt 3595 3807 Pnt 2349 3796 Pnt 2885 3781 Pnt 3671 2671 Pnt 2635 3815 Pnt 3045 3746 Pnt 2497 3796 Pnt 2028 3779 Pnt 2610 3747 Pnt 2832 3797 Pnt 2689 3774 Pnt 2209 3796 Pnt 2904 3774 Pnt 2792 3786 Pnt 2239 3777 Pnt 3632 3741 Pnt 3034 3773 Pnt 3022 3778 Pnt 3760 3763 Pnt 2066 3809 Pnt 4155 3747 Pnt 2521 3840 Pnt 3531 3840 Pnt 3373 3811 Pnt 1899 3829 Pnt 3233 3755 Pnt 2657 3752 Pnt 2838 3761 Pnt 4050 3753 Pnt 2891 3757 Pnt 2736 3782 Pnt 3110 2863 Pnt 3013 3757 Pnt 2655 3827 Pnt 2759 3787 Pnt 2267 3806 Pnt 2309 3812 Pnt 3878 3760 Pnt 2025 3806 Pnt 4090 3755 Pnt 3334 3771 Pnt 3025 3771 Pnt 2568 3780 Pnt 2904 3780 Pnt 2471 3795 Pnt 2907 3751 Pnt 3425 3779 Pnt 2438 3785 Pnt 3090 3777 Pnt 4039 2914 Pnt 2683 3776 Pnt 2335 3826 Pnt 2794 3779 Pnt 3297 3748 Pnt 2986 3749 Pnt 2661 3812 Pnt 3049 3756 Pnt 2866 3916 Pnt 2789 3806 Pnt 2708 3748 Pnt 2231 3786 Pnt 2647 3751 Pnt 2622 3748 Pnt 3936 3791 Pnt 2472 3796 Pnt 2294 3797 Pnt 2282 3853 Pnt 2282 3781 Pnt 3548 3766 Pnt 4170 3749 Pnt 2370 3774 Pnt 4150 3761 Pnt 3226 3810 Pnt 3574 3750 Pnt 2812 3750 Pnt 2617 3749 Pnt 2131 3750 Pnt 3391 3815 Pnt 4487 3780 Pnt 2233 3821 Pnt 2783 3787 Pnt 2367 3821 Pnt 2175 3798 Pnt 2818 3808 Pnt 2775 3762 Pnt 2221 3838 Pnt 4082 3763 Pnt 2307 3769 Pnt 3255 3762 Pnt 2662 3848 Pnt 3002 3800 Pnt 4086 3759 Pnt 2994 3800 Pnt 2261 3804 Pnt 2701 3797 Pnt 2557 3869 Pnt 2743 3768 Pnt 3020 3870 Pnt 2693 3754 Pnt 2320 3755 Pnt 4047 3754 Pnt 2597 3807 Pnt 3163 3754 Pnt 2811 3900 Pnt 2820 3872 Pnt 2451 3900 Pnt 2258 3796 Pnt 2351 3771 Pnt 2738 3823 Pnt 2571 3800 Pnt 3723 3775 Pnt 2711 3787 Pnt 2172 3848 Pnt 4180 3759 Pnt 2255 3870 Pnt 3675 3793 Pnt 2643 3759 Pnt 3125 3816 Pnt 2765 3829 Pnt 4186 3760 Pnt 2729 3771 Pnt 2501 3759 Pnt 3097 3817 Pnt 2499 3785 Pnt 2415 3772 Pnt 2731 3758 Pnt 2357 3780 Pnt 2380 3837 Pnt 2264 3762 Pnt 2487 3803 Pnt 4254 3758 Pnt 2931 3753 Pnt 2328 3821 Pnt 2575 2924 Pnt 2430 3788 Pnt 1947 3771 Pnt 2742 3767 Pnt 3106 3821 Pnt 2566 3807 Pnt 2741 3814 Pnt 2436 3798 Pnt 3253 3763 Pnt 3010 3768 Pnt 4254 3765 Pnt 2939 3750 Pnt 3112 3752 Pnt 2002 3804 Pnt 2591 3841 Pnt 3978 3750 Pnt 2363 3796 Pnt 2320 3841 Pnt 2521 3804 Pnt 3993 3804 Pnt 2708 3767 Pnt 2983 3753 Pnt 2860 3858 Pnt 2615 3797 Pnt 3735 3792 Pnt 2114 3765 Pnt 2909 3768 Pnt 2605 3780 Pnt 2589 3763 Pnt 2951 3773 Pnt 2178 3847 Pnt 2689 3849 Pnt 3178 3774 Pnt 3207 3774 Pnt 3341 3758 Pnt 2505 3764 Pnt 2805 3753 Pnt 2368 3804 Pnt 4114 3750 Pnt 2728 3743 Pnt 2846 3766 Pnt 2664 3808 Pnt 2957 3777 Pnt 2359 3775 Pnt 2500 3774 Pnt 2304 3784 Pnt 1894 3834 Pnt 2391 3756 Pnt 2421 3804 Pnt 2445 3789 Pnt 2117 3811 Pnt 3197 3840 Pnt 4421 3773 Pnt 2811 3778 Pnt 2655 3768 Pnt 2698 3099 Pnt 3846 3791 Pnt 2968 3784 Pnt 2777 3766 Pnt 3302 3825 Pnt 2156 3794 Pnt 2336 3791 Pnt 2304 3777 Pnt 2342 3774 Pnt 2373 3777 Pnt 3838 3791 Pnt 3706 3762 Pnt 3018 3752 Pnt 2650 3763 Pnt 3208 3802 Pnt 3614 3760 Pnt 2097 3802 Pnt 3168 3769 Pnt 2873 3825 Pnt 3103 3762 Pnt 2927 3774 Pnt 3028 3759 Pnt 2989 3809 Pnt 3243 3827 Pnt 2257 3861 Pnt 2948 3776 Pnt 2237 3804 Pnt 4543 3752 Pnt 2685 3776 Pnt 3474 3752 Pnt 2801 3770 Pnt 2187 3788 Pnt 2816 3757 Pnt 3787 3806 Pnt 2729 3784 Pnt 2413 3805 Pnt 2712 3765 Pnt 1957 3823 Pnt 2571 3808 Pnt 2893 3783 Pnt 3678 3795 Pnt 3239 3759 Pnt 2972 3774 Pnt 2718 3780 Pnt 2799 3775 Pnt 2229 3933 Pnt 2140 3803 Pnt 2658 3806 Pnt 2984 3820 Pnt 1800 3793 Pnt 2150 3826 Pnt 3536 3820 Pnt 4211 3770 Pnt 2539 3767 Pnt 2252 3810 Pnt 2872 3752 Pnt 2803 3793 Pnt 2401 3766 Pnt 1926 3803 Pnt 2570 3798 Pnt 2146 3784 Pnt 4210 3793 Pnt 2946 3766 Pnt 2496 3798 Pnt 2425 3799 Pnt 3315 3776 Pnt 2589 3807 Pnt 3302 3751 Pnt 2575 3798 Pnt 2094 3742 Pnt 2757 3754 Pnt 2385 3826 Pnt 2254 3799 Pnt 4390 2905 Pnt 2978 3767 Pnt 2780 3770 Pnt 1973 3777 Pnt 2790 3841 Pnt 2240 3807 Pnt 2264 3752 Pnt 2549 3757 Pnt 3842 3770 Pnt 1792 3795 Pnt 2902 3821 Pnt 2825 3858 Pnt 2690 3803 Pnt 2600 3753 Pnt 2646 3777 Pnt 2298 3829 Pnt 3591 3809 Pnt 2646 3814 Pnt 3115 3760 Pnt 2415 3796 Pnt 2694 3762 Pnt 3373 3765 Pnt 3239 3814 Pnt 2539 3747 Pnt 2779 3807 Pnt 3318 3762 Pnt 2615 3807 Pnt 2393 3774 Pnt 2731 3777 Pnt 2656 3785 Pnt 2906 3756 Pnt 2638 3769 Pnt 1918 3867 Pnt 2753 3784 Pnt 3162 3777 Pnt 2606 3847 Pnt 3125 3776 Pnt 2386 3841 Pnt 2827 3750 Pnt 2460 3806 Pnt 2393 3768 Pnt 3556 3765 Pnt 2615 3740 Pnt 2308 3855 Pnt 2734 3756 Pnt 2770 3810 Pnt 2267 3799 Pnt 2335 3912 Pnt 2588 3803 Pnt 3384 3756 Pnt 3144 3753 Pnt 3158 3776 Pnt 2507 3775 Pnt 2571 3753 Pnt 2645 3758 Pnt 2424 3747 Pnt 2381 3753 Pnt 1987 3822 Pnt 1857 3753 Pnt 2753 3786 Pnt 2643 3764 Pnt 2786 3797 Pnt 2680 3775 Pnt 2229 3763 Pnt 1906 3773 Pnt 2341 3814 Pnt 1882 3820 Pnt 2641 3764 Pnt 2532 3763 Pnt 2631 3818 Pnt 2216 3819 Pnt 2415 3791 Pnt 2124 3784 Pnt 3938 3768 Pnt 3459 3753 Pnt 2840 3796 Pnt 2502 3748 Pnt 3118 3755 Pnt 2941 3751 Pnt 2805 3750 Pnt 2818 3764 Pnt 2737 3775 Pnt 2134 3824 Pnt 3045 3751 Pnt 2174 3766 Pnt 2927 3874 Pnt 2597 3783 Pnt 2758 3874 Pnt 3262 3761 Pnt 3717 3765 Pnt 2669 3780 Pnt 2757 3791 Pnt 2491 3780 Pnt 3024 3770 Pnt 2307 3838 Pnt 3706 3743 Pnt 2426 3827 Pnt 2486 3786 Pnt 2987 3827 Pnt 2996 3796 Pnt 2845 3759 Pnt 3476 3804 Pnt 2699 3814 Pnt 2886 3805 Pnt 3383 3737 Pnt 2199 3800 Pnt 2880 3798 Pnt 2820 3813 Pnt 2598 3770 Pnt 1994 3822 Pnt 3135 3800 Pnt 3043 3804 Pnt 2727 3741 Pnt 2574 3756 Pnt 2447 3822 Pnt 2626 3836 Pnt 2394 3832 Pnt 2695 3800 Pnt 2465 3799 Pnt 2596 3943 Pnt 2166 3792 Pnt 1887 3787 Pnt 2437 3812 Pnt 2972 3832 Pnt 2376 3826 Pnt 2022 3775 Pnt 3659 3847 Pnt 2562 3763 Pnt 3506 3843 Pnt 1741 3786 Pnt 4071 3763 Pnt 3060 3791 Pnt 2907 3844 Pnt 2630 3768 Pnt 1988 3824 Pnt 2493 3797 Pnt 2818 3754 Pnt 2642 3833 Pnt 2495 3797 Pnt 2541 3812 Pnt 2866 3765 Pnt 3091 3817 Pnt 3979 3780 Pnt 2887 3754 Pnt 2719 3839 Pnt 2149 3790 Pnt 2979 3783 Pnt 3515 3754 Pnt 2919 3829 Pnt 2012 3826 Pnt 2939 3799 Pnt 2736 3753 Pnt 1910 3781 Pnt 2931 3830 Pnt 2794 3792 Pnt 2280 3757 Pnt 2302 3839 Pnt 3225 3830 Pnt 2403 3799 Pnt 3004 3757 Pnt 4128 3800 Pnt 2369 3822 Pnt 2784 3756 Pnt 2193 3788 Pnt 2379 3778 Pnt 2338 3823 Pnt 3050 3818 Pnt 2433 3765 Pnt 2309 3901 Pnt 3109 3817 Pnt 2762 3758 Pnt 2789 3825 Pnt 2240 3892 Pnt 2987 3892 Pnt 2464 3802 Pnt 2492 3771 Pnt 2448 3784 Pnt 2578 3767 Pnt 3047 3846 Pnt 3201 3762 Pnt 3643 3770 Pnt 2045 3799 Pnt 3433 3777 Pnt 2206 3773 Pnt 2595 3802 Pnt 2305 3804 Pnt 4139 3851 Pnt 2771 3763 Pnt 2398 3777 Pnt 2368 3765 Pnt 2631 3801 Pnt 4540 2988 Pnt 2129 3795 Pnt 2682 3788 Pnt 2274 3803 Pnt 3165 3801 Pnt 2598 3766 Pnt 2573 3820 Pnt 2512 3777 Pnt 2682 3770 Pnt 3541 3772 Pnt 3477 3749 Pnt 2684 3838 Pnt 3162 3820 Pnt 2857 3785 Pnt 2686 3790 Pnt 2571 3866 Pnt 3282 3762 Pnt 2558 3810 Pnt 2546 3766 Pnt 2773 3785 Pnt 2617 3747 Pnt 1955 3934 Pnt 2717 3761 Pnt 2234 3825 Pnt 2503 3805 Pnt 2657 3778 Pnt 2602 3827 Pnt 2228 3746 Pnt 2258 3834 Pnt 3034 3778 Pnt 2868 3762 Pnt 3042 3813 Pnt 2575 3812 Pnt 2667 3745 Pnt 1858 3750 Pnt 4131 3810 Pnt 2893 3769 Pnt 2485 3755 Pnt 1746 3813 Pnt 3468 3772 Pnt 2625 3899 Pnt 2601 3770 Pnt 3450 3770 Pnt 4042 3757 Pnt 3725 3770 Pnt 2247 3775 Pnt 3652 3767 Pnt 3151 3777 Pnt 4459 3779 Pnt 3360 3769 Pnt 2928 3774 Pnt 2611 3782 Pnt 2693 3774 Pnt 2185 3762 Pnt 3381 3785 Pnt 2784 3818 Pnt 4047 3752 Pnt 2112 3789 Pnt 2918 3809 Pnt 2732 3818 Pnt 2870 3753 Pnt 2967 3755 Pnt 3243 3747 Pnt 2704 3930 Pnt 2178 3804 Pnt 2757 3765 Pnt 2887 3761 Pnt 2393 3754 Pnt 2548 3761 Pnt 3607 3767 Pnt 3570 3765 Pnt 4179 3747 Pnt 2976 3743 Pnt 2451 3761 Pnt 2497 3799 Pnt 2427 3808 Pnt 4158 2957 Pnt 2438 3807 Pnt 3031 3755 Pnt 2591 3815 Pnt 2299 3799 Pnt 2483 3754 Pnt 4172 3759 Pnt 2724 3778 Pnt 2279 3804 Pnt 3374 3778 Pnt 2322 3826 Pnt 4000 3751 Pnt 2620 3837 Pnt 2420 3753 Pnt 3165 3805 Pnt 2800 3753 Pnt 2082 3778 Pnt 3525 3753 Pnt 2819 3760 Pnt 2789 3814 Pnt 3026 3747 Pnt 4127 3765 Pnt 2127 3778 Pnt 4305 2839 Pnt 4026 3757 Pnt 2817 3773 Pnt 3191 3747 Pnt 4003 3779 Pnt 3183 3771 Pnt 2320 3797 Pnt 2373 3815 Pnt 3163 3752 Pnt 2938 3791 Pnt 2403 3823 Pnt 3075 3815 Pnt 2689 3760 Pnt 2196 3839 Pnt 2199 3764 Pnt 2510 3748 Pnt 3145 3839 Pnt 2188 3808 Pnt 2421 3779 Pnt 2630 3772 Pnt 3807 3779 Pnt 2512 3809 Pnt 2814 3760 Pnt 2039 3925 Pnt 4255 3778 Pnt 2563 3778 Pnt 2362 3747 Pnt 2575 3816 Pnt 2627 3745 Pnt 2052 3762 Pnt 4035 3753 Pnt 2360 3761 Pnt 2793 3754 Pnt 2322 3764 Pnt 2798 3760 Pnt 3449 3745 Pnt 2306 3760 Pnt 2569 3762 Pnt 2401 3742 Pnt 2657 3763 Pnt 2322 3742 Pnt 1820 3796 Pnt 3882 3765 Pnt 2918 3745 Pnt 2457 3840 Pnt 2708 3805 Pnt 2576 3786 Pnt 3933 3843 Pnt 3366 3787 Pnt 2893 3811 Pnt 3089 3748 Pnt 2621 3797 Pnt 3421 3836 Pnt 3020 3756 Pnt 2352 3807 Pnt 2003 3832 Pnt 3066 3748 Pnt 2910 3808 Pnt 2806 3771 Pnt 2483 3751 Pnt 2429 3760 Pnt 2325 3751 Pnt 2675 3792 Pnt 3450 3795 Pnt 2703 3751 Pnt 3030 3808 Pnt 2508 3758 Pnt 2497 3751 Pnt 2040 3796 Pnt 2549 3774 Pnt 2407 3806 Pnt 3109 3834 Pnt 2845 3757 Pnt 2817 3812 Pnt 2895 3799 Pnt 3010 3787 Pnt 3484 3806 Pnt 2989 3774 Pnt 2261 3799 Pnt 2479 3789 Pnt 3341 3781 Pnt 2390 3770 Pnt 3037 3789 Pnt 2100 3784 Pnt 3399 3794 Pnt 2119 3751 Pnt 3281 3762 Pnt 3124 3804 Pnt 2135 3752 Pnt 1980 3839 Pnt 3609 3781 Pnt 2957 3782 Pnt 2250 3809 Pnt 3483 3752 Pnt 1831 3821 Pnt 3047 3771 Pnt 2429 3773 Pnt 2856 3779 Pnt 3025 3765 Pnt 2034 3800 Pnt 3740 3746 Pnt 2792 2855 Pnt 2804 3808 Pnt 2490 3879 Pnt 2880 3772 Pnt 2345 3802 Pnt 2823 3825 Pnt 2089 3806 Pnt 2834 3780 Pnt 2469 3783 Pnt 2779 3806 Pnt 2019 3782 Pnt 2924 3760 Pnt 2588 3815 Pnt 3026 3805 Pnt 3032 3786 Pnt 3038 3743 Pnt 2930 3779 Pnt 3743 3736 Pnt 2788 3746 Pnt 3090 3771 Pnt 2535 3744 Pnt 3045 3743 Pnt 2727 3760 Pnt 2329 3798 Pnt 2199 3818 Pnt 2236 3806 Pnt 2952 3759 Pnt 2364 3834 Pnt 2145 3768 Pnt 3359 3778 Pnt 2454 3811 Pnt 3137 3774 Pnt 2684 3816 Pnt 2880 3748 Pnt 2550 3807 Pnt 2417 3763 Pnt 3913 3748 Pnt 2201 3794 Pnt 3498 3816 Pnt 2876 3791 Pnt 2851 3804 Pnt 2417 3808 Pnt 2318 3774 Pnt 1995 3819 Pnt 2327 3791 Pnt 2721 3772 Pnt 2862 3772 Pnt 1987 3805 Pnt 2689 3804 Pnt 2718 3768 Pnt 2299 3781 Pnt 3204 3809 Pnt 1922 3763 Pnt 3179 3776 Pnt 2786 3774 Pnt 2399 3840 Pnt 2061 3797 Pnt 2653 3839 Pnt 2771 3867 Pnt 3242 3839 Pnt 3142 3752 Pnt 2647 3776 Pnt 2058 3853 Pnt 2939 3753 Pnt 2884 3757 Pnt 2299 3842 Pnt 2902 3758 Pnt 2360 3858 Pnt 2137 3788 Pnt 2661 3782 Pnt 2713 3806 Pnt 2947 3827 Pnt 2562 3781 Pnt 2531 3768 Pnt 2609 3830 Pnt 3967 3798 Pnt 3054 3771 Pnt 2867 3811 Pnt 3427 3768 Pnt 4159 3765 Pnt 2166 3748 Pnt 2211 3808 Pnt 2774 3801 Pnt 2469 3802 Pnt 2812 3775 Pnt 3416 2986 Pnt 2774 3751 Pnt 2788 3740 Pnt 3126 3789 Pnt 2746 3791 Pnt 4083 3744 Pnt 2835 3797 Pnt 2197 3756 Pnt 2988 3748 Pnt 4164 3791 Pnt 3414 3789 Pnt 2557 3750 Pnt 3701 3750 Pnt 2762 3753 Pnt 2719 3790 Pnt 3476 3815 Pnt 2117 3743 Pnt 2084 3750 Pnt 2845 3916 Pnt 2560 3800 Pnt 2194 3823 Pnt 2191 3821 Pnt 2198 3901 Pnt 2434 3791 Pnt 2949 3791 Pnt 2781 3765 Pnt 1991 3790 Pnt 3861 3793 Pnt 2396 3810 Pnt 2252 3774 Pnt 2072 3844 Pnt 2769 3746 Pnt 4394 3772 Pnt 2090 3798 Pnt 3031 3809 Pnt 2472 3879 Pnt 2290 3808 Pnt 2997 3879 Pnt 2707 3762 Pnt 2288 3926 Pnt 3225 3759 Pnt 3343 3754 Pnt 2674 3769 Pnt 2289 3810 Pnt 2590 3848 Pnt 3309 3810 Pnt 2816 3787 Pnt 4447 3760 Pnt 2524 3750 Pnt 2507 3758 Pnt 4066 3759 Pnt 2320 3829 Pnt 2853 3797 Pnt 2268 3796 Pnt 2723 3755 Pnt 3653 3780 Pnt 2355 3743 Pnt 2407 3790 Pnt 2626 3755 Pnt 2975 3748 Pnt 2360 3793 Pnt 2911 3755 Pnt 2403 3754 Pnt 2442 3831 Pnt 3034 3754 Pnt 2435 3823 Pnt 2328 3823 Pnt 2420 3793 Pnt 2173 3808 Pnt 2349 3759 Pnt 3990 3756 Pnt 2894 3808 Pnt 3988 3779 Pnt 2979 3753 Pnt 2300 3839 Pnt 2937 3777 Pnt 3807 3741 Pnt 2469 3757 Pnt 1936 3790 Pnt 2690 2853 Pnt 1971 3757 Pnt 2864 3787 Pnt 2329 3783 Pnt 2782 3785 Pnt 2508 3762 Pnt 3248 3783 Pnt 3579 3779 Pnt 3213 3945 Pnt 3770 3793 Pnt 4326 3752 Pnt 3950 3759 Pnt 2605 3780 Pnt 2853 3763 Pnt 2526 3780 Pnt 2364 3795 Pnt 2155 3792 Pnt 2296 3777 Pnt 3788 3798 Pnt 2691 3755 Pnt 2761 3785 Pnt 2677 3762 Pnt 2166 3773 Pnt 3686 3757 Pnt 2065 3854 Pnt 2916 3780 Pnt 2884 3807 Pnt 2644 3800 Pnt 2856 3900 Pnt 2803 3803 Pnt 2073 3872 Pnt 3001 3763 Pnt 3448 3742 Pnt 2629 3853 Pnt 4139 3759 Pnt 2759 3815 Pnt 2962 3753 Pnt 2376 3770 Pnt 2299 3776 Pnt 3292 2984 Pnt 3820 3742 Pnt 2770 3774 Pnt 2575 3791 Pnt 3455 3759 Pnt 2779 3761 Pnt 3166 3765 Pnt 2159 3819 Pnt 3636 3792 Pnt 2570 3837 Pnt 2340 3786 Pnt 2705 3764 Pnt 2356 3780 Pnt 2144 3775 Pnt 3085 3779 Pnt 2479 3770 Pnt 2811 3775 Pnt 2784 3759 Pnt 2039 3741 Pnt 2810 3776 Pnt 2318 3783 Pnt 4380 3779 Pnt 2030 3771 Pnt 4203 3759 Pnt 2834 3804 Pnt 2564 3783 Pnt 2779 2851 Pnt 2563 3824 Pnt 2836 3778 Pnt 3678 3769 Pnt 2816 3824 Pnt 2545 3757 Pnt 3411 3762 Pnt 2702 3812 Pnt 2541 3812 Pnt 2265 3814 Pnt 2959 3812 Pnt 3737 3812 Pnt 3486 3791 Pnt 2338 3745 Pnt 2685 3753 Pnt 2527 3798 Pnt 3034 3775 Pnt 3864 3798 Pnt 3011 3812 Pnt 2302 3808 Pnt 3232 2914 Pnt 3562 3759 Pnt 2775 3808 Pnt 2799 3774 Pnt 2813 3781 Pnt 2330 3811 Pnt 4127 3760 Pnt 2440 3805 Pnt 3257 3781 Pnt 2042 3824 Pnt 2730 3747 Pnt 2654 3808 Pnt 2894 3792 Pnt 2996 3793 Pnt 2311 3777 Pnt 4050 3753 Pnt 3970 3749 Pnt 3647 3784 Pnt 2665 3780 Pnt 2286 3763 Pnt 4200 3748 Pnt 2412 3777 Pnt 3275 3754 Pnt 1962 3804 Pnt 3025 3782 Pnt 2653 3806 Pnt 1944 3834 Pnt 3240 3785 Pnt 2632 3775 Pnt 2680 3806 Pnt 2321 3792 Pnt 2745 3756 Pnt 3181 3761 Pnt 2121 3800 Pnt 3248 3765 Pnt 2132 3788 Pnt 3091 3768 Pnt 4099 3789 Pnt 4366 3801 Pnt 3428 3840 Pnt 2273 3806 Pnt 2415 3812 Pnt 4174 3775 Pnt 2843 3775 Pnt 1843 3806 Pnt 3570 3825 Pnt 3817 3756 Pnt 2093 3794 Pnt 3856 3783 Pnt 2800 3759 Pnt 3031 3791 Pnt 3237 3806 Pnt 2826 3767 Pnt 1871 3759 Pnt 2791 3752 Pnt 2625 3827 Pnt 2762 3785 Pnt 3293 3763 Pnt 3543 3760 Pnt 3257 3762 Pnt 2390 3809 Pnt 3202 3743 Pnt 3140 3762 Pnt 3975 3764 Pnt 3049 3774 Pnt 3820 3769 Pnt 3304 3753 Pnt 2299 3850 Pnt 2491 3752 Pnt 2138 3804 Pnt 4525 3789 Pnt 3763 3748 Pnt 2269 3821 Pnt 3402 3752 Pnt 3000 3776 Pnt 2404 3774 Pnt 2768 3788 Pnt 2532 3757 Pnt 2224 3774 Pnt 2654 3770 Pnt 2967 3752 Pnt 3997 3752 Pnt 2847 3749 Pnt 2274 3799 Pnt 2169 3763 Pnt 3291 3763 Pnt 2248 3810 Pnt 3486 3799 Pnt 2780 3793 Pnt 2697 3798 Pnt 2031 3803 Pnt 2730 3802 Pnt 2840 3779 Pnt 2235 3823 Pnt 2383 3827 Pnt 2488 3805 Pnt 3148 3749 Pnt 2848 3759 Pnt 2853 3797 Pnt 2699 3781 Pnt 2739 3804 Pnt 2642 3800 Pnt 2235 3800 Pnt 3762 3781 Pnt 2937 3777 Pnt 2676 3827 Pnt 3185 3795 Pnt 2909 3784 Pnt 2832 3841 Pnt 2727 3762 Pnt 2783 3756 Pnt 3312 3765 Pnt 2496 3786 Pnt 2150 3792 Pnt 3238 3803 Pnt 2714 3870 Pnt 2535 3814 Pnt 3267 3779 Pnt 2582 3810 Pnt 2490 3760 Pnt 3950 3759 Pnt 2762 3812 Pnt 2408 3912 Pnt 3314 3759 Pnt 2459 3823 Pnt 3198 3823 Pnt 3614 3812 Pnt 2926 3785 Pnt 3307 3770 Pnt 2470 3749 Pnt 2680 3785 Pnt 2356 3814 Pnt 3693 3766 Pnt 1871 3787 Pnt 3026 3755 Pnt 2604 3755 Pnt 2234 3763 Pnt 3273 3826 Pnt 3124 3824 Pnt 2440 3842 Pnt 3195 3770 Pnt 4210 3870 Pnt 2436 3746 Pnt 3684 3775 Pnt 2518 3746 Pnt 2470 3808 Pnt 3021 3765 Pnt 2684 3757 Pnt 2718 3753 Pnt 3138 3802 Pnt 4132 3758 Pnt 2896 3753 Pnt 2609 3829 Pnt 2659 3757 Pnt 4156 3775 Pnt 2413 3839 Pnt 2278 3818 Pnt 3180 3839 Pnt 1879 3818 Pnt 2864 3845 Pnt 3958 3799 Pnt 2388 3822 Pnt 2648 3806 Pnt 3276 3809 Pnt 3292 3808 Pnt 3894 2911 Pnt 2886 3858 Pnt 2612 3844 Pnt 3258 3760 Pnt 3702 3797 Pnt 2704 3807 Pnt 2907 3769 Pnt 2703 3770 Pnt 2956 3770 Pnt 3733 3756 Pnt 3512 3763 Pnt 2483 3866 Pnt 2815 3754 Pnt 3434 3796 Pnt 2743 3747 Pnt 2591 3795 Pnt 2686 3745 Pnt 2681 3754 Pnt 2562 3822 Pnt 2089 3785 Pnt 1952 3852 Pnt 3241 3790 Pnt 3076 3856 Pnt 2785 3754 Pnt 2784 3789 Pnt 4377 3775 Pnt 3066 3754 Pnt 2583 3775 Pnt 3380 3745 Pnt 2947 3749 Pnt 3168 3756 Pnt 3308 3805 Pnt 2397 3930 Pnt 3527 3775 Pnt 3869 2965 Pnt 2740 3761 Pnt 2188 3796 Pnt 2277 3842 Pnt 3370 3763 Pnt 2388 3843 Pnt 2115 3780 Pnt 2444 3812 Pnt 2912 3792 Pnt 2846 3771 Pnt 2484 3786 Pnt 2896 3780 Pnt 2477 3848 Pnt 2776 3764 Pnt 2078 3762 Pnt 2400 3789 Pnt 2954 3782 Pnt 2651 3847 Pnt 3394 3756 Pnt 2817 3764 Pnt 2467 3775 Pnt 1979 3766 Pnt 2788 3825 Pnt 3373 3754 Pnt 2931 3756 Pnt 2661 3798 Pnt 3365 3761 Pnt 2268 3870 Pnt 3124 3763 Pnt 2384 3892 Pnt 2893 3827 Pnt 2480 3765 Pnt 2528 3815 Pnt 3369 3747 Pnt 3087 3767 Pnt 3472 3760 Pnt 2573 3812 Pnt 2322 3796 Pnt 3309 3801 Pnt 2712 3825 Pnt 2335 3899 Pnt 2378 3808 Pnt 2012 3780 Pnt 2751 3777 Pnt 3578 3808 Pnt 2757 3807 Pnt 3138 3770 Pnt 2756 3786 Pnt 2123 3778 Pnt 3393 3748 Pnt 3007 3755 Pnt 2911 3770 Pnt 2454 3760 Pnt 2707 3805 Pnt 3964 3783 Pnt 2740 3777 Pnt 2389 3770 Pnt 4283 3762 Pnt 2165 3779 Pnt 2316 3758 Pnt 2654 3796 Pnt 3809 3787 Pnt 3031 3803 Pnt 2736 3831 Pnt 1968 3788 Pnt 3906 3788 Pnt 2656 3768 Pnt 3830 2887 Pnt 3405 3831 Pnt 3609 3750 Pnt 2818 3769 Pnt 2163 3839 Pnt 2626 3756 Pnt 2373 3829 Pnt 2455 3786 Pnt 3163 3808 Pnt 3171 3752 Pnt 2482 3753 Pnt 1971 3821 Pnt 2132 3804 Pnt 3732 3763 Pnt 3374 3753 Pnt 2684 3760 Pnt 2806 3841 Pnt 3585 3753 Pnt 3161 3767 Pnt 2234 3812 Pnt 3465 3760 Pnt 2980 3755 Pnt 2198 3802 Pnt 4496 3779 Pnt 2177 3808 Pnt 2658 3114 Pnt 2923 3752 Pnt 1986 3779 Pnt 3275 3799 Pnt 2680 3788 Pnt 2080 3752 Pnt 2215 3809 Pnt 3666 3788 Pnt 3158 3802 Pnt 2790 3798 Pnt 2480 3778 Pnt 2397 3926 Pnt 3088 3761 Pnt 2735 3804 Pnt 2749 3755 Pnt 3143 3808 Pnt 4038 2714 Pnt 2288 3826 Pnt 2824 3766 Pnt 4167 3758 Pnt 2371 3821 Pnt 2943 3778 Pnt 2380 3837 Pnt 3185 3790 Pnt 2463 3827 Pnt 3096 3836 Pnt 2731 3769 Pnt 2401 3753 Pnt 2817 3747 Pnt 2564 3778 Pnt 2288 3834 Pnt 2020 3762 Pnt 2686 3802 Pnt 2912 3776 Pnt 2449 3761 Pnt 2859 3776 Pnt 2774 3753 Pnt 2622 3756 Pnt 2432 3755 Pnt 2413 3808 Pnt 2741 3764 Pnt 2608 3747 Pnt 3960 3769 Pnt 3983 3761 Pnt 2707 3804 Pnt 3254 3779 Pnt 3169 3806 Pnt 3526 3750 Pnt 2591 3796 Pnt 2686 3772 Pnt 2923 3836 Pnt 2790 3806 Pnt 2565 3791 Pnt 2318 3839 Pnt 2734 3943 Pnt 2322 3815 Pnt 3659 3774 Pnt 4375 3758 Pnt 2734 3761 Pnt 2591 3800 Pnt 2161 3797 Pnt 2544 3777 Pnt 2346 3799 Pnt 3082 3767 Pnt 2740 3824 Pnt 2915 3760 Pnt 3732 3092 Pnt 2648 3832 Pnt 2967 3753 Pnt 2284 3761 Pnt 2819 3853 Pnt 2234 3797 Pnt 2905 3791 Pnt 2263 3754 Pnt 2969 3752 Pnt 2639 3802 Pnt 4108 3756 Pnt 2378 3825 Pnt 2594 3760 Pnt 2126 3803 Pnt 3126 3855 Pnt 2293 3769 Pnt 2815 3761 Pnt 2824 3870 Pnt 2311 3780 Pnt 3171 3743 Pnt 3085 3789 Pnt 3757 3745 Pnt 2614 3789 Pnt 2518 3744 Pnt 3319 3870 Pnt 2466 3760 Pnt 2840 3787 Pnt 2416 3799 Pnt 2476 3763 Pnt 1890 3839 Pnt 2931 3870 Pnt 3302 3768 Pnt 2724 3765 Pnt 3268 3779 Pnt 2205 3799 Pnt 3055 3782 Pnt 2851 3760 Pnt 2670 3843 Pnt 4493 3766 Pnt 2620 3766 Pnt 2131 3810 Pnt 3652 3769 Pnt 2416 3818 Pnt 2728 3808 Pnt 3318 3113 Pnt 2377 3777 Pnt 2651 3751 Pnt 4329 3768 Pnt 2358 3802 Pnt 2298 3796 Pnt 2669 3820 Pnt 2426 3758 Pnt 2268 3788 Pnt 2867 3804 Pnt 2664 3783 Pnt 1778 3795 Pnt 1965 3752 Pnt 3928 3749 Pnt 2493 3823 Pnt 2439 3843 Pnt 2959 3782 Pnt 2387 3820 Pnt 4006 2898 Pnt 2107 3771 Pnt 3367 3815 Pnt 2817 3803 Pnt 3182 3772 Pnt 2476 3751 Pnt 2839 3812 Pnt 3568 3814 Pnt 3022 3816 Pnt 2838 3786 Pnt 4226 3772 Pnt 2245 3788 Pnt 3496 3763 Pnt 3349 3831 Pnt 2569 3775 Pnt 3036 2990 Pnt 2971 3836 Pnt 2153 3781 Pnt 3517 3817 Pnt 2549 3832 Pnt 3083 3751 Pnt 2800 3772 Pnt 2705 3784 Pnt 2810 3751 Pnt 2544 3771 Pnt 2788 3771 Pnt 3776 3765 Pnt 2369 3798 Pnt 1962 3933 Pnt 3012 3759 Pnt 2827 3811 Pnt 3018 3765 Pnt 2367 3800 Pnt 3739 3801 Pnt 3653 3747 Pnt 2386 3751 Pnt 1888 3802 Pnt 3175 3800 Pnt 2691 3820 Pnt 2335 3757 Pnt 3054 3759 Pnt 3021 3808 Pnt 2328 3772 Pnt 3104 3834 Pnt 2671 3744 Pnt 2886 3765 Pnt 2724 3751 Pnt 2390 3828 Pnt 2337 3775 Pnt 2174 3778 Pnt 2031 3767 Pnt 1966 3796 Pnt 2892 3749 Pnt 2284 3819 Pnt 2259 3798 Pnt 3066 3815 Pnt 3875 3751 Pnt 2269 3774 Pnt 2455 3788 Pnt 3566 3800 Pnt 4252 3778 Pnt 3364 2980 Pnt 2984 3785 Pnt 2409 3792 Pnt 2894 3784 Pnt 2584 3903 Pnt 2567 3935 Pnt 2075 3797 Pnt 2005 3784 Pnt 2452 3771 Pnt 3703 3771 Pnt 2752 3762 Pnt 2070 3796 Pnt 2764 3784 Pnt 2238 3813 Pnt 4022 3785 Pnt 2918 3762 Pnt 3349 3784 Pnt 2273 3762 Pnt 2457 3810 Pnt 3262 3755 Pnt 2667 3745 Pnt 2512 3823 Pnt 4091 3761 Pnt 2345 3806 Pnt 3415 3743 Pnt 4116 3797 Pnt 2906 3780 Pnt 2586 3747 Pnt 2696 2933 Pnt 1982 3753 Pnt 2026 3798 Pnt 3262 3783 Pnt 3225 3753 Pnt 2670 3777 Pnt 2169 3822 Pnt 2851 3754 Pnt 2712 3762 Pnt 2277 3806 Pnt 2741 3777 Pnt 2523 3820 Pnt 2491 3773 Pnt 2792 3774 Pnt 2607 3817 Pnt 2266 3796 Pnt 2173 3782 Pnt 2058 3750 Pnt 2031 3802 Pnt 3020 3774 Pnt 2131 3775 Pnt 2382 3790 Pnt 2343 3811 Pnt 3200 3799 Pnt 2209 3804 Pnt 2905 3767 Pnt 2752 3769 Pnt 2498 3768 Pnt 4185 3753 Pnt 2931 3748 Pnt 2368 3943 Pnt 3032 3841 Pnt 2686 3778 Pnt 2282 3793 Pnt 3150 3841 Pnt 2733 3799 Pnt 2867 3792 Pnt 2129 3808 Pnt 3158 3766 Pnt 2632 3754 Pnt 2810 3760 Pnt 2387 3789 Pnt 3155 3831 Pnt 3550 3779 Pnt 4023 3753 Pnt 2497 3842 Pnt 3831 3787 Pnt 2397 3768 Pnt 3563 3804 Pnt 2489 3774 Pnt 2522 3830 Pnt 2975 3772 Pnt 2922 3787 Pnt 2650 3750 Pnt 2691 3784 Pnt 3947 3784 Pnt 2495 3773 Pnt 2241 3792 Pnt 3359 3795 Pnt 2515 3847 Pnt 2872 3750 Pnt 2579 3777 Pnt 2543 3807 Pnt 3936 3764 Pnt 1914 3774 Pnt 4116 3754 Pnt 2273 3768 Pnt 2375 3776 Pnt 2687 3803 Pnt 3053 3748 Pnt 2993 3743 Pnt 2333 3789 Pnt 2885 3744 Pnt 2026 3811 Pnt 2636 3762 Pnt 2309 3879 Pnt 2088 3854 Pnt 3056 3866 Pnt 3364 3808 Pnt 3105 3770 Pnt 2047 3832 Pnt 2834 3759 Pnt 3871 2773 Pnt 2371 3769 Pnt 3003 3810 Pnt 2719 3771 Pnt 3998 3779 Pnt 2889 3769 Pnt 3082 3759 Pnt 2893 3794 Pnt 2688 3763 Pnt 2448 3759 Pnt 3537 3771 Pnt 2959 3751 Pnt 2845 3763 Pnt 3383 3763 Pnt 2461 3786 Pnt 2793 3753 Pnt 2018 3812 Pnt 2643 3792 Pnt 2129 3775 Pnt 2860 3775 Pnt 2010 3792 Pnt 2609 3775 Pnt 2306 3816 Pnt 4465 3775 Pnt 2517 3808 Pnt 2995 3816 Pnt 1982 3822 Pnt 3729 3078 Pnt 4018 3880 Pnt 1825 3753 Pnt 3740 3788 Pnt 3290 3793 Pnt 2317 3780 Pnt 3267 3751 Pnt 3155 3805 Pnt 3643 2857 Pnt 3166 3785 Pnt 2907 3757 Pnt 3113 3805 Pnt 3126 3799 Pnt 2403 3804 Pnt 2478 3780 Pnt 3298 3783 Pnt 2904 3799 Pnt 2514 3820 Pnt 2457 3773 Pnt 2121 3780 Pnt 2872 3780 Pnt 1978 3806 Pnt 2635 3785 Pnt 2275 3797 Pnt 3061 3753 Pnt 2945 3780 Pnt 3034 3812 Pnt 3361 3797 Pnt 2933 3773 Pnt 1992 3795 Pnt 3213 3840 Pnt 3098 3773 Pnt 2952 3796 Pnt 2828 3736 Pnt 2856 3779 Pnt 2424 3745 Pnt 2934 3773 Pnt 2308 3808 Pnt 2418 3834 Pnt 2463 3774 Pnt 3509 3773 Pnt 1870 3819 Pnt 2046 3742 Pnt 1835 3757 Pnt 3965 3755 Pnt 2810 3808 Pnt 2486 3807 Pnt 2108 3808 Pnt 2499 3796 Pnt 2815 3805 Pnt 2561 3805 Pnt 2187 3775 Pnt 2532 3763 Pnt 2496 3805 Pnt 3181 3796 Pnt 2454 3785 Pnt 2297 3748 Pnt 3325 3775 Pnt 2319 3794 Pnt 2034 3780 Pnt 2300 3822 Pnt 3455 3748 Pnt 2749 3800 Pnt 2653 3753 Pnt 2475 3765 Pnt 2516 3791 Pnt 1906 3852 Pnt 2229 3819 Pnt 2008 3900 Pnt 2789 3852 Pnt 2695 3781 Pnt 2399 3791 Pnt 2105 3762 Pnt 2632 3821 Pnt 2695 3784 Pnt 2499 3777 Pnt 3104 3809 Pnt 2127 3798 Pnt 3725 3766 Pnt 3039 3779 Pnt 4503 3776 Pnt 2621 3758 Pnt 2133 3872 Pnt 3051 3809 Pnt 2660 3788 Pnt 2375 3768 Pnt 2292 3774 Pnt 2045 3797 Pnt 2906 3784 Pnt 2644 3763 Pnt 2962 3798 Pnt 2278 3872 Pnt 3268 3784 Pnt 2602 3770 Pnt 3058 3776 Pnt 2730 3811 Pnt 3001 3770 Pnt 3960 3771 Pnt 2827 3759 Pnt 2409 3761 Pnt 3331 3811 Pnt 2096 3781 Pnt 2953 3756 Pnt 2025 3741 Pnt 3043 3752 Pnt 2290 3793 Pnt 3739 3756 Pnt 3698 2754 Pnt 2988 3776 Pnt 3431 3785 Pnt 2853 3827 Pnt 2147 3833 Pnt 2724 3815 Pnt 3707 3821 Pnt 2981 3804 Pnt 2075 3768 Pnt 2432 3761 Pnt 2430 3797 Pnt 2927 3799 Pnt 2344 3837 Pnt 2383 3812 Pnt 2917 3779 Pnt 2721 3854 Pnt 2968 3817 Pnt 3893 3799 Pnt 4048 3813 Pnt 2861 3778 Pnt 2854 3783 Pnt 2696 3748 Pnt 3088 3844 Pnt 2448 3824 Pnt 2901 3772 Pnt 2201 3819 Pnt 2628 3789 Pnt 3164 3772 Pnt 2703 3743 Pnt 4091 3753 Pnt 2756 3789 Pnt 2529 3826 Pnt 2219 3775 Pnt 3802 3743 Pnt 4267 3789 Pnt 3172 3742 Pnt 2919 3801 Pnt 2348 3823 Pnt 3643 3800 Pnt 3514 3823 Pnt 1981 3916 Pnt 3849 3800 Pnt 3073 3770 Pnt 2025 3800 Pnt 4097 3756 Pnt 3481 2829 Pnt 2247 3823 Pnt 2935 3781 Pnt 2188 3821 Pnt 2992 3789 Pnt 2152 3795 Pnt 4137 3742 Pnt 2244 3795 Pnt 2614 3766 Pnt 2680 3901 Pnt 2368 3803 Pnt 3777 3789 Pnt 3210 3777 Pnt 3346 3754 Pnt 4211 3761 Pnt 2944 3777 Pnt 2484 3780 Pnt 2773 3844 Pnt 3326 3759 Pnt 2638 3765 Pnt 2602 3840 Pnt 3189 3778 Pnt 2250 3785 Pnt 2718 3787 Pnt 2118 3818 Pnt 2669 3811 Pnt 2102 3810 Pnt 3853 3820 Pnt 2550 3751 Pnt 4038 3787 Pnt 3159 3811 Pnt 2857 3810 Pnt 2285 3774 Pnt 2107 3866 Pnt 3447 2878 Pnt 2646 3764 Pnt 2328 3754 Pnt 2639 3810 Pnt 2924 3806 Pnt 2734 3756 Pnt 2593 3745 Pnt 1858 3837 Pnt 2064 3800 Pnt 2283 3912 Pnt 2380 3812 Pnt 3265 3751 Pnt 3023 2749 Pnt 2137 3762 Pnt 2979 3812 Pnt 2913 3799 Pnt 2774 3765 Pnt 3500 3754 Pnt 2747 3809 Pnt 3153 3809 Pnt 2681 3799 Pnt 2486 3772 Pnt 2041 3788 Pnt 2083 3804 Pnt 2205 3926 Pnt 2858 3768 Pnt 2851 3796 Pnt 2636 3746 Pnt 2931 3743 Pnt 2038 3746 Pnt 3199 3766 Pnt 3134 3759 Pnt 3184 3775 Pnt 2579 3763 Pnt 2546 3752 Pnt 3119 3759 Pnt 3028 3756 Pnt 2426 3774 Pnt 2575 3762 Pnt 2639 3808 Pnt 2464 3810 Pnt 2657 3763 Pnt 2305 3826 Pnt 2941 3760 Pnt 2983 3774 Pnt 2626 3798 Pnt 4256 3770 Pnt 2691 3746 Pnt 3252 3755 Pnt 2507 3814 Pnt 2689 3749 Pnt 2549 3850 Pnt 2200 3807 Pnt 2466 3802 Pnt 2755 3816 Pnt 3623 3867 Pnt 2637 3752 Pnt 3125 3807 Pnt 2337 3807 Pnt 3205 3749 Pnt 2654 3853 Pnt 3018 3752 Pnt 2167 3776 Pnt 2329 3757 Pnt 3216 3792 Pnt 2564 3755 Pnt 2500 3788 Pnt 3275 3777 Pnt 2260 3852 Pnt 2564 3826 Pnt 2686 3788 Pnt 3354 3760 Pnt 2546 3753 Pnt 2435 3812 Pnt 3183 3783 Pnt 2074 3778 Pnt 3028 3772 Pnt 2942 3757 Pnt 2803 3755 Pnt 3092 3746 Pnt 2424 3758 Pnt 2075 3745 Pnt 3624 3772 Pnt 2931 3824 Pnt 2597 3808 Pnt 2869 3802 Pnt 2851 3808 Pnt 3291 3761 Pnt 2474 3798 Pnt 2867 3859 Pnt 3196 3832 Pnt 2618 3806 Pnt 4079 3756 Pnt 2240 3823 Pnt 2248 3805 Pnt 2645 3858 Pnt 2981 3827 Pnt 2959 3858 Pnt 2639 3827 Pnt 2527 3797 Pnt 3615 3827 Pnt 2504 3791 Pnt 2356 3828 Pnt 3048 3765 Pnt 2753 3804 Pnt 2626 3763 Pnt 2793 3786 Pnt 3249 3763 Pnt 2825 3762 Pnt 2445 3756 Pnt 3695 3782 Pnt 2314 3849 Pnt 2581 3758 Pnt 4229 3841 Pnt 2322 3813 Pnt 2662 3814 Pnt 3011 3834 Pnt 2692 3754 Pnt 2261 3811 Pnt 2594 3809 Pnt 2122 3803 Pnt 3257 3817 Pnt 2171 3763 Pnt 2675 3754 Pnt 2214 3822 Pnt 2822 3799 Pnt 3162 3782 Pnt 2923 3870 Pnt 2858 3755 Pnt 2664 3779 Pnt 3407 3749 Pnt 2462 3753 Pnt 2243 3805 Pnt 3430 3775 Pnt 2745 3746 Pnt 3596 3815 Pnt 2389 3798 Pnt 2905 3786 Pnt 2701 3806 Pnt 2758 3771 Pnt 2610 3812 Pnt 1869 3799 Pnt 2891 3764 Pnt 2298 3756 Pnt 2827 3930 Pnt 2005 3762 Pnt 2783 3843 Pnt 3057 3765 Pnt 2852 3764 Pnt 2502 3780 Pnt 2183 3772 Pnt 3772 3930 Pnt 3096 3763 Pnt 2719 3761 Pnt 3555 3761 Pnt 2681 3797 Pnt 2539 3765 Pnt 2144 3764 Pnt 3675 3801 Pnt 4617 3756 Pnt 2756 3752 Pnt 3143 3802 Pnt 3400 3756 Pnt 3005 3805 Pnt 2610 3752 Pnt 3112 3182 Pnt 2394 3802 Pnt 2678 3820 Pnt 2773 3763 Pnt 2277 3747 Pnt 2970 3768 Pnt 2538 3761 Pnt 2998 3805 Pnt 2719 3926 Pnt 2400 3754 Pnt 2988 3762 Pnt 2292 3770 Pnt 3107 3926 Pnt 2041 3839 Pnt 2872 3787 Pnt 3045 3756 Pnt 2121 3845 Pnt 3652 3756 Pnt 3547 3787 Pnt 2595 3824 Pnt 3304 3851 Pnt 2159 3808 Pnt 2989 3831 Pnt 1967 3791 Pnt 2741 3868 Pnt 4218 3756 Pnt 2938 3759 Pnt 2822 3832 Pnt 2985 3760 Pnt 2881 3836 Pnt 2690 3834 Pnt 2394 3747 Pnt 2141 3839 Pnt 2472 3762 Pnt 2396 3810 Pnt 3504 3806 Pnt 3817 3770 Pnt 2159 3805 Pnt 2908 3808 Pnt 2728 3767 Pnt 2358 3802 Pnt 2038 3785 Pnt 3999 3768 Pnt 2078 3797 Pnt 3128 3777 Pnt 3084 3769 Pnt 3647 3824 Pnt 1990 3796 Pnt 3368 3769 Pnt 3065 3802 Pnt 3330 3856 Pnt 2232 3798 Pnt 4157 3776 Pnt 2581 3747 Pnt 2355 3808 Pnt 4110 3853 Pnt 4061 3754 Pnt 2667 3765 Pnt 2148 3796 Pnt 2545 3834 Pnt 2721 3829 Pnt 2825 3827 Pnt 2430 3826 Pnt 3190 3752 Pnt 2567 3771 Pnt 2617 3842 Pnt 2391 3760 Pnt 2907 3770 Pnt 2890 3771 Pnt 2229 3842 Pnt 2671 3766 Pnt 3616 3790 Pnt 2648 3781 Pnt 2280 3826 Pnt 3224 3826 Pnt 2617 3753 Pnt 4103 3785 Pnt 2766 3789 Pnt 2714 3753 Pnt 2233 3769 Pnt 3088 3755 Pnt 2922 3755 Pnt 2536 3808 Pnt 2687 3754 Pnt 4094 2833 Pnt 3391 3805 Pnt 3060 3769 Pnt 4043 3767 Pnt 2997 3762 Pnt 2871 3803 Pnt 2935 3870 Pnt 2679 3804 Pnt 2402 3821 Pnt 2505 3807 Pnt 3241 3787 Pnt 2737 3847 Pnt 2268 3804 Pnt 2113 3761 Pnt 3067 3765 Pnt 3957 3748 Pnt 2739 3784 Pnt 2552 3765 Pnt 2426 3844 Pnt 2846 3753 Pnt 2751 3841 Pnt 2236 3743 Pnt 3031 3785 Pnt 2813 3808 Pnt 3291 3779 Pnt 2682 3799 Pnt 3136 3753 Pnt 2885 3799 Pnt 2613 3769 Pnt 2367 3791 Pnt 2479 3799 Pnt 2195 3839 Pnt 2688 3764 Pnt 2725 3786 Pnt 2445 3808 Pnt 2334 3775 Pnt 4110 3752 Pnt 3396 3950 Pnt 2662 3755 Pnt 2441 3753 Pnt 2834 3761 Pnt 4208 3761 Pnt 2581 3825 Pnt 3290 3748 Pnt 3146 3755 Pnt 3232 3800 Pnt 2034 3803 Pnt 2802 3806 Pnt 2542 3808 Pnt 3744 3788 Pnt 3872 3759 Pnt 3087 3808 Pnt 3033 3767 Pnt 2596 3778 Pnt 2475 3855 Pnt 2878 3767 Pnt 2720 3806 Pnt 2577 3836 Pnt 2106 3767 Pnt 2589 3791 Pnt 2747 3821 Pnt 2686 3772 Pnt 3822 3796 Pnt 2643 3815 Pnt 2147 3823 Pnt 2554 3799 Pnt 3568 3756 Pnt 2686 3824 Pnt 4017 3773 Pnt 3873 2865 Pnt 2578 3839 Pnt 2139 3788 Pnt 3299 3791 Pnt 3281 3803 Pnt 2731 3780 Pnt 4047 2768 Pnt 2919 3795 Pnt 2495 3803 Pnt 2560 3773 Pnt 2652 3760 Pnt 2722 3814 Pnt 2561 3814 Pnt 4024 3747 Pnt 3237 2846 Pnt 2706 3871 Pnt 2631 3781 Pnt 2882 3781 Pnt 3865 3021 Pnt 4547 3784 Pnt 2665 3766 Pnt 4143 3759 Pnt 3742 3790 Pnt 1874 3751 Pnt 2463 3776 Pnt 3505 2909 Pnt 2577 3783 Pnt 3722 3772 Pnt 2698 3802 Pnt 2552 3788 Pnt 1938 3784 Pnt 2672 3802 Pnt 2688 3754 Pnt 1979 3754 Pnt 2526 3834 Pnt 2425 3799 Pnt 3400 3825 Pnt 2516 3843 Pnt 2904 3744 Pnt 3591 3843 Pnt 2531 3801 Pnt 2642 3744 Pnt 2065 3815 Pnt 2539 3832 Pnt 4192 3763 Pnt 2249 3771 Pnt 2791 3789 Pnt 2525 3784 Pnt 2785 3806 Pnt 3486 3777 Pnt 2943 3806 Pnt 2575 3771 Pnt 2969 3747 Pnt 2772 3804 Pnt 2736 3780 Pnt 2952 3827 Pnt 3387 3818 Pnt 2872 3768 Pnt 2474 3739 Pnt 2252 3798 Pnt 3020 3800 Pnt 2344 3796 Pnt 2779 3765 Pnt 2669 3792 Pnt 2514 3804 Pnt 2364 3943 Pnt 2898 3820 Pnt 2492 3759 Pnt 3714 3804 Pnt 4191 3761 Pnt 2625 3772 Pnt 2100 3841 Pnt 1893 3802 Pnt 2292 3791 Pnt 3899 3772 Pnt 3000 3841 Pnt 3849 3851 Pnt 2309 3810 Pnt 2117 3804 Pnt 2029 3806 Pnt 2917 3767 Pnt 2885 3767 Pnt 2628 3820 Pnt 3551 3831 Pnt 3702 3806 Pnt 2281 3758 Pnt 2763 3782 Pnt 3419 3765 Pnt 3554 3758 Pnt 3008 3814 Pnt 3912 3776 Pnt 4005 3776 Pnt 2864 3791 Pnt 2980 3749 Pnt 2854 3752 Pnt 2458 3800 Pnt 3453 3782 Pnt 2738 3932 Pnt 2692 3825 Pnt 2899 3792 Pnt 2594 3932 Pnt 3131 3782 Pnt 3967 3792 Pnt 2654 3747 Pnt 2919 3748 Pnt 3076 3779 Pnt 3231 3755 Pnt 3519 3796 Pnt 2222 3755 Pnt 3888 3779 Pnt 3314 3779 Pnt 3354 3851 Pnt 2447 3768 Pnt 3342 3770 Pnt 3220 3813 Pnt 2747 3822 Pnt 3031 3751 Pnt 2673 3804 Pnt 2292 3812 Pnt 2727 3777 Pnt 2002 3765 Pnt 2782 3830 Pnt 3729 2933 Pnt 2590 3811 Pnt 2866 3811 Pnt 2891 3828 Pnt 2955 3787 Pnt 2042 3773 Pnt 2892 3761 Pnt 2439 3775 Pnt 3566 3787 Pnt 3436 3803 Pnt 3151 3784 Pnt 1926 3767 Pnt 2108 3798 Pnt 2372 3798 Pnt 2137 3820 Pnt 3091 3781 Pnt 3568 3767 Pnt 2866 3745 Pnt 3403 3763 Pnt 2776 3798 Pnt 2692 3768 Pnt 2334 3765 Pnt 3078 3801 Pnt 3868 3744 Pnt 2894 3750 Pnt 2249 3792 Pnt 3364 3745 Pnt 2250 3787 Pnt 2697 3801 Pnt 2722 3779 Pnt 2675 3747 Pnt 2655 3847 Pnt 2346 3774 Pnt 3472 3803 Pnt 2994 3811 Pnt 2774 3828 Pnt 2440 3777 Pnt 2962 3773 Pnt 2225 3866 Pnt 2934 3828 Pnt 2564 3789 Pnt 2008 3776 Pnt 3612 3800 Pnt 2596 3769 Pnt 1961 3807 Pnt 2161 3768 Pnt 3495 3800 Pnt 2447 3826 Pnt 1717 3787 Pnt 3241 3762 Pnt 3018 3761 Pnt 3778 3759 Pnt 3064 3770 Pnt 2035 3842 Pnt 2664 3769 Pnt 3108 3770 Pnt 3316 3771 Pnt 3219 3833 Pnt 4038 3784 Pnt 3336 3809 Pnt 2581 3807 Pnt 3070 3794 Pnt 2711 3935 Pnt 2604 3844 Pnt 2580 3817 Pnt 2815 3763 Pnt 2621 3771 Pnt 2529 3799 Pnt 2085 3782 Pnt 2038 3806 Pnt 2863 3779 Pnt 3793 3765 Pnt 2285 3770 Pnt 2120 3796 Pnt 2479 3788 Pnt 3834 3763 Pnt 2307 3751 Pnt 2459 3811 Pnt 2917 3778 Pnt 2072 3763 Pnt 3384 3811 Pnt 3214 3784 Pnt 2833 3780 Pnt 3271 3765 Pnt 2687 3753 Pnt 3544 3747 Pnt 2194 3780 Pnt 2168 3751 Pnt 2350 3812 Pnt 2918 3770 Pnt 2311 3780 Pnt 2461 3780 Pnt 2411 3806 Pnt 2494 3753 Pnt 2904 3793 Pnt 2619 3754 Pnt 2526 3765 Pnt 3306 3779 Pnt 2795 3781 Pnt 2328 3795 Pnt 3607 3785 Pnt 2581 3823 Pnt 3027 3805 Pnt 3009 3745 Pnt 2738 3805 Pnt 3944 3748 Pnt 2508 3778 Pnt 3073 3805 Pnt 2742 3755 Pnt 2978 3759 Pnt 2843 3773 Pnt 2004 3781 Pnt 2886 3777 Pnt 2481 3780 Pnt 2329 3785 Pnt 3006 3783 Pnt 2551 3765 Pnt 3327 3756 Pnt 4152 3774 Pnt 2210 3772 Pnt 3913 3765 Pnt 2335 3761 Pnt 2459 3791 Pnt 1960 3892 Pnt 2072 3832 Pnt 4135 3774 Pnt 3077 3763 Pnt 1974 3852 Pnt 2718 3801 Pnt 2497 3810 Pnt 2079 3848 Pnt 2521 3763 Pnt 2454 3899 Pnt 2057 3796 Pnt 3033 3821 Pnt 3202 3810 Pnt 2167 3896 Pnt 3966 3744 Pnt 2620 3765 Pnt 2304 3896 Pnt 2326 3833 Pnt 1940 3798 Pnt 2038 3773 Pnt 2523 3736 Pnt 2244 3807 Pnt 2435 3761 Pnt 3700 3803 Pnt 1918 3830 Pnt 2768 3819 Pnt 2309 3815 Pnt 2926 3799 Pnt 2655 3770 Pnt 2738 3764 Pnt 2533 3808 Pnt 2108 3786 Pnt 1955 3774 Pnt 3238 3809 Pnt 2399 3783 Pnt 2807 3805 Pnt 2671 3768 Pnt 3151 3783 Pnt 2645 3824 Pnt 2615 3745 Pnt 3175 3761 Pnt 2463 3775 Pnt 1970 3872 Pnt 2103 3824 Pnt 2635 3753 Pnt 1884 3805 Pnt 2203 3774 Pnt 2797 3816 Pnt 2071 3808 Pnt 2403 3780 Pnt 3225 3772 Pnt 2768 3753 Pnt 3062 3784 Pnt 2139 3775 Pnt 2797 3770 Pnt 2925 3823 Pnt 3318 3784 Pnt 2622 3809 Pnt 4587 3775 Pnt 2362 3822 Pnt 3039 3772 Pnt 3026 3800 Pnt 2989 3811 Pnt 2285 3822 Pnt 2260 3778 Pnt 3240 3754 Pnt 2337 3795 Pnt 2857 3761 Pnt 3346 3761 Pnt 2033 3803 Pnt 2687 3747 Pnt 3541 3763 Pnt 3055 3784 Pnt 1921 3741 Pnt 3759 3761 Pnt 2728 3747 Pnt 2665 3758 Pnt 3103 3741 Pnt 2890 3752 Pnt 3049 3810 Pnt 2067 3802 Pnt 3709 3748 Pnt 2751 3781 Pnt 2134 3826 Pnt 2131 3799 Pnt 3568 3823 Pnt 2878 3758 Pnt 3617 3782 Pnt 2469 3770 Pnt 2691 3760 Pnt 3018 3758 Pnt 2499 3756 Pnt 2806 3790 Pnt 1899 3799 Pnt 2201 3793 Pnt 2777 3760 Pnt 2558 3770 Pnt 2929 3764 Pnt 2429 3745 Pnt 2828 3748 Pnt 4002 3760 Pnt 2391 3766 Pnt 2980 3766 Pnt 2673 3798 Pnt 2652 3797 Pnt 2680 3760 Pnt 2731 3808 Pnt 2591 3802 Pnt 2494 3834 Pnt 4139 3757 Pnt 2636 3763 Pnt 2670 3761 Pnt 2075 3841 Pnt 2908 3781 Pnt 2686 3771 Pnt 2622 3802 Pnt 3186 3867 Pnt 4299 3747 Pnt 2662 3811 Pnt 2931 3769 Pnt 3064 3776 Pnt 2345 3776 Pnt 2145 3774 Pnt 2736 3838 Pnt 3688 3776 Pnt 2741 3781 Pnt 3145 3821 Pnt 2530 3750 Pnt 3178 3865 Pnt 2629 3821 Pnt 3305 3789 Pnt 3027 3865 Pnt 2454 3742 Pnt 2214 3844 Pnt 2459 3755 Pnt 3174 3765 Pnt 2609 3765 Pnt 3246 3765 Pnt 2609 3771 Pnt 2953 3820 Pnt 4109 3754 Pnt 3029 3772 Pnt 2240 3754 Pnt 3077 3815 Pnt 4197 3765 Pnt 2238 3757 Pnt 2951 3844 Pnt 2768 3766 Pnt 3082 2995 Pnt 2234 3775 Pnt 2735 3812 Pnt 2103 3826 Pnt 3006 3801 Pnt 2407 3807 Pnt 2753 3812 Pnt 2509 3752 Pnt 2287 3819 Pnt 2557 3763 Pnt 4079 3839 Pnt 2403 3778 Pnt 2956 3821 Pnt 2835 3763 Pnt 2639 3789 Pnt 3402 3787 Pnt 3288 3810 Pnt 2682 3749 Pnt 2593 3903 Pnt 2489 3763 Pnt 3132 3859 Pnt 2716 3779 Pnt 2604 3746 Pnt 3145 3903 Pnt 2056 3797 Pnt 2965 3859 Pnt 2667 3805 Pnt 3344 3812 Pnt 3020 3779 Pnt 2023 3797 Pnt 3344 3753 Pnt 2749 3853 Pnt 2634 3751 Pnt 2426 3812 Pnt 1930 3811 Pnt 2909 3806 Pnt 2743 3827 Pnt 3655 3776 Pnt 2417 3842 Pnt 2950 3796 Pnt 2809 3759 Pnt 2870 3760 Pnt 2560 3805 Pnt 3889 3764 Pnt 2052 3824 Pnt 2715 3776 Pnt 2558 3768 Pnt 2912 3842 Pnt 2484 3821 Pnt 2758 3794 Pnt 2661 3759 Pnt 2612 3792 Pnt 2333 3827 Pnt 2347 3770 Pnt 3292 3832 Pnt 2020 3788 Pnt 3733 3783 Pnt 3129 3773 Pnt 1846 3913 Pnt 2655 3792 Pnt 2491 3880 Pnt 2812 3797 Pnt 2786 3815 Pnt 2731 3799 Pnt 2614 3755 Pnt 2180 3852 Pnt 2718 3785 Pnt 2623 3766 Pnt 2662 3791 Pnt 2571 3816 Pnt 2738 3816 Pnt 3019 3796 Pnt 2666 3766 Pnt 2510 3831 Pnt 2505 3825 Pnt 2989 3790 Pnt 2530 3849 Pnt 2037 3804 Pnt 3241 3827 Pnt 2736 3799 Pnt 2332 3797 Pnt 2182 3789 Pnt 3329 3827 Pnt 2489 3808 Pnt 2891 3771 Pnt 2511 3782 Pnt 2048 3814 Pnt 2699 3759 Pnt 2388 3901 Pnt 2965 3787 Pnt 2820 3802 Pnt 2252 3758 Pnt 1876 3798 Pnt 2019 3763 Pnt 2831 3792 Pnt 3320 3765 Pnt 2513 3762 Pnt 2881 3832 Pnt 3554 3749 Pnt 3312 3759 Pnt 2460 3746 Pnt 2719 3804 Pnt 3160 3746 Pnt 2609 3767 Pnt 2409 3763 Pnt 2785 3762 Pnt 2381 3843 Pnt 2230 3763 Pnt 3267 3763 Pnt 2870 3779 Pnt 3508 3749 Pnt 2524 3765 Pnt 2249 3761 Pnt 2160 3912 Pnt 2713 3749 Pnt 2219 3774 Pnt 2881 3854 Pnt 2976 3758 Pnt 1834 3812 Pnt 2816 3791 Pnt 2960 3748 Pnt 2338 3799 Pnt 3486 3772 Pnt 3532 3798 Pnt 2027 3800 Pnt 2579 3798 Pnt 3851 3754 Pnt 2847 3798 Pnt 3302 3870 Pnt 3671 3813 Pnt 2890 3754 Pnt 2580 3770 Pnt 3201 3806 Pnt 3754 3772 Pnt 2531 3766 Pnt 2501 3814 Pnt 3012 3751 Pnt 2870 3766 Pnt 2133 3779 Pnt 3140 3770 Pnt 3785 3755 Pnt 2809 3763 Pnt 2630 3775 Pnt 2212 3786 Pnt 2684 3780 Pnt 2810 3843 Pnt 2932 3786 Pnt 4199 3764 Pnt 2653 3763 Pnt 3110 3929 Pnt 2826 3930 Pnt 2555 3763 Pnt 4004 3775 Pnt 2757 3801 Pnt 2272 3850 Pnt 3072 3764 Pnt 2795 3766 Pnt 2469 3765 Pnt 2530 3763 Pnt 2208 3807 Pnt 2964 3764 Pnt 3044 3796 Pnt 2635 3752 Pnt 2306 3779 Pnt 3297 3752 Pnt 2643 3749 Pnt 3552 3751 Pnt 2390 3787 Pnt 3278 3752 Pnt 2118 3808 Pnt 3626 3779 Pnt 2805 3810 Pnt 3123 3763 Pnt 2350 3872 Pnt 2092 3809 Pnt 3091 3762 Pnt 2593 3754 Pnt 3307 3805 Pnt 2311 3820 Pnt 2868 3766 Pnt 4357 3762 Pnt 2846 3834 Pnt 3406 3768 Pnt 2515 3770 Pnt 2659 3756 Pnt 3668 3803 Pnt 2669 3755 Pnt 2747 3747 Pnt 2671 3791 Pnt 2060 3839 Pnt 2655 3793 Pnt 2406 3811 Pnt 2164 3810 Pnt 2857 3790 Pnt 2667 3810 Pnt 2999 3776 Pnt 3184 3787 Pnt 2604 3826 Pnt 2574 3762 Pnt 3889 3761 Pnt 2930 3787 Pnt 2645 3762 Pnt 3017 3827 Pnt 2664 3868 Pnt 2178 3805 Pnt 2775 3754 Pnt 2497 3864 Pnt 3076 3841 Pnt 2821 3815 Pnt 3014 3759 Pnt 2552 3808 Pnt 3239 3813 Pnt 3014 3766 Pnt 4440 3763 Pnt 2406 3775 Pnt 3557 3759 Pnt 3221 3807 Pnt 3005 3760 Pnt 2040 3797 Pnt 2107 3835 Pnt 2812 3765 Pnt 2776 3755 Pnt 2445 3786 Pnt 3299 3780 Pnt 2851 3779 Pnt 2775 3836 Pnt 2898 3798 Pnt 2894 3810 Pnt 2252 3770 Pnt 3016 3800 Pnt 2883 3818 Pnt 2501 3806 Pnt 2573 3746 Pnt 3158 3783 Pnt 3064 3768 Pnt 2609 3783 Pnt 2993 3776 Pnt 2535 3802 Pnt 2407 3760 Pnt 2027 3768 Pnt 4011 3767 Pnt 3425 3800 Pnt 2475 3791 Pnt 4318 3766 Pnt 2919 3776 Pnt 2948 3771 Pnt 2146 3803 Pnt 2687 3856 Pnt 2898 3785 Pnt 2298 3800 Pnt 2212 3806 Pnt 3158 3809 Pnt 2067 3798 Pnt 2819 3785 Pnt 2814 3754 Pnt 2351 3785 Pnt 2849 3831 Pnt 2593 3747 Pnt 2775 3785 Pnt 2190 3823 Pnt 4032 3793 Pnt 2459 3810 Pnt 3027 3785 Pnt 3376 3744 Pnt 2758 3793 Pnt 2620 3799 Pnt 3346 3800 Pnt 2373 3830 Pnt 2152 3805 Pnt 2658 3789 Pnt 3196 3800 Pnt 2667 3778 Pnt 2517 3754 Pnt 3960 3817 Pnt 2411 3808 Pnt 2812 3784 Pnt 2537 3810 Pnt 2830 3810 Pnt 2738 3806 Pnt 1872 3803 Pnt 2686 3805 Pnt 2195 3803 Pnt 3961 3775 Pnt 2472 3764 Pnt 2597 3832 Pnt 1872 3807 Pnt 2265 3826 Pnt 2636 3833 Pnt 2278 3821 Pnt 2450 3797 Pnt 3046 3753 Pnt 2833 3836 Pnt 1913 3794 Pnt 3059 3797 Pnt 2486 3847 Pnt 3020 3764 Pnt 1999 3844 Pnt 3998 3785 Pnt 3204 3804 Pnt 3176 3753 Pnt 3211 3789 Pnt 2619 3793 Pnt 2701 3793 Pnt 2559 3839 Pnt 3037 3809 Pnt 2421 3803 Pnt 3908 3799 Pnt 3081 3762 Pnt 2909 3803 Pnt 2858 3830 Pnt 2576 3855 Pnt 2352 3834 Pnt 2543 3834 Pnt 2218 3775 Pnt 3930 3827 Pnt 2076 3926 Pnt 2058 3789 Pnt 2592 3804 Pnt 4076 3827 Pnt 4387 3777 Pnt 2912 3756 Pnt 2916 3768 Pnt 2995 3773 Pnt 2803 3749 Pnt 3253 3783 Pnt 2525 3778 Pnt 2485 3798 Pnt 1992 3803 Pnt 3372 3803 Pnt 1969 3761 Pnt 2895 3752 Pnt 3257 3767 Pnt 2286 3742 Pnt 2935 3743 Pnt 2674 3761 Pnt 3790 3755 Pnt 4165 3756 Pnt 3053 2893 Pnt 2930 3813 Pnt 2763 3769 Pnt 2447 3755 Pnt 2226 3824 Pnt 2920 3788 Pnt 4195 3774 Pnt 2370 3798 Pnt 3317 3842 Pnt 3018 3822 Pnt 2846 3756 Pnt 3612 3799 Pnt 2670 3788 Pnt 2715 3804 Pnt 2860 3822 Pnt 2865 3756 Pnt 2643 3786 Pnt 2770 3776 Pnt 2711 3812 Pnt 2293 3801 Pnt 3587 3780 Pnt 3097 3791 Pnt 2119 3791 Pnt 2751 3809 Pnt 2615 3795 Pnt 2331 3943 Pnt 3592 3801 Pnt 3224 3760 Pnt 2065 3814 Pnt 2954 3950 Pnt 3573 3943 Pnt 2999 3771 Pnt 2963 3808 Pnt 2705 3831 Pnt 2915 3755 Pnt 2644 3788 Pnt 2399 3781 Pnt 3092 3808 Pnt 2298 3753 Pnt 3895 3755 Pnt 2490 3771 Pnt 2494 3781 Pnt 2348 3808 Pnt 2994 3765 Pnt 2468 3748 Pnt 3503 3783 Pnt 3309 3748 Pnt 2537 3816 Pnt 2132 3825 Pnt 2070 3812 Pnt 3567 3828 Pnt 2222 3810 Pnt 2783 3805 Pnt 3147 3841 Pnt 2359 3822 Pnt 2171 3800 Pnt 2538 3843 Pnt 3281 3843 Pnt 2566 3832 Pnt 3257 3768 Pnt 3735 3832 Pnt 3529 3777 Pnt 2847 3770 Pnt 2478 3827 Pnt 2286 3808 Pnt 2967 3765 Pnt 4152 3763 Pnt 4100 3808 Pnt 4233 3795 Pnt 3843 3770 Pnt 3417 3765 Pnt 2639 3743 Pnt 2694 3779 Pnt 2821 3755 Pnt 2685 3810 Pnt 3708 3757 Pnt 2438 3753 Pnt 3038 3754 Pnt 3025 3754 Pnt 2851 3806 Pnt 3142 3813 Pnt 2642 3765 Pnt 2979 3786 Pnt 4265 3765 Pnt 2248 3812 Pnt 2454 3803 Pnt 2305 3750 Pnt 2258 3803 Pnt 2649 3803 Pnt 2632 3773 Pnt 2599 3788 Pnt 2937 3788 Pnt 3475 3765 Pnt 2976 3749 Pnt 2958 3778 Pnt 3245 3761 Pnt 2441 3836 Pnt 3128 3772 Pnt 2224 3801 Pnt 2557 3806 Pnt 3825 3768 Pnt 2854 3792 Pnt 2597 3821 Pnt 2219 3834 Pnt 2353 3815 Pnt 4148 3759 Pnt 2552 3799 Pnt 2942 3767 Pnt 2528 3787 Pnt 2266 3769 Pnt 2880 3822 Pnt 3806 3783 Pnt 2682 3779 Pnt 4214 3779 Pnt 1944 3842 Pnt 2845 3762 Pnt 3033 3839 Pnt 3925 3779 Pnt 2196 3801 Pnt 3101 2751 Pnt 2126 3788 Pnt 3063 3772 Pnt 2714 3858 Pnt 2027 3815 Pnt 2044 3780 Pnt 2518 3849 Pnt 2584 3773 Pnt 2660 3782 Pnt 3251 3849 Pnt 2061 3776 Pnt 2552 3739 Pnt 3349 3747 Pnt 3189 3739 Pnt 2187 3800 Pnt 2800 3815 Pnt 2661 3811 Pnt 2969 3804 Pnt 4091 3782 Pnt 2041 3789 Pnt 2734 3780 Pnt 2418 3759 Pnt 2842 3790 Pnt 3494 3781 Pnt 3148 3826 Pnt 3116 3777 Pnt 2728 3769 Pnt 2710 3752 Pnt 2178 3851 Pnt 3615 3764 Pnt 2066 3792 Pnt 3452 3845 Pnt 3537 3752 Pnt 2441 3794 Pnt 3489 3774 Pnt 2981 3780 Pnt 3060 3825 Pnt 2484 3772 Pnt 2968 3810 Pnt 3392 3781 Pnt 4379 3774 Pnt 3012 3758 Pnt 2454 3837 Pnt 1953 3796 Pnt 2773 3810 Pnt 2978 3772 Pnt 2496 3791 Pnt 3034 3777 Pnt 3057 3807 Pnt 2525 3744 Pnt 2382 3761 Pnt 2345 3751 Pnt 3159 3764 Pnt 4026 3791 Pnt 2534 3770 Pnt 2685 3825 Pnt 2606 3777 Pnt 2156 3772 Pnt 2060 3794 Pnt 2859 3778 Pnt 3090 3751 Pnt 2763 3772 Pnt 2647 3811 Pnt 2173 3863 Pnt 2677 3932 Pnt 2677 3811 Pnt 2162 3899 Pnt 3163 3933 Pnt 2987 3769 Pnt 2355 3792 Pnt 2858 3753 Pnt 2698 3835 Pnt 2056 3784 Pnt 2513 3825 Pnt 4323 3825 Pnt 2366 3775 Pnt 2648 3779 Pnt 2126 3814 Pnt 3221 3753 Pnt 2564 3755 Pnt 3055 3763 Pnt 3946 3020 Pnt 2490 3751 Pnt 2140 3823 Pnt 2739 3822 Pnt 2256 3780 Pnt 3205 3770 Pnt 3466 3817 Pnt 2585 3755 Pnt 2956 3836 Pnt 2650 3769 Pnt 3889 3749 Pnt 2193 3803 Pnt 2905 3823 Pnt 3663 3769 Pnt 2916 3787 Pnt 2806 3746 Pnt 2493 3753 Pnt 4008 3780 Pnt 2029 3802 Pnt 2345 3852 Pnt 2798 3805 Pnt 1845 3768 Pnt 2663 3794 Pnt 2523 3781 Pnt 3576 3776 Pnt 3691 3775 Pnt 2952 3761 Pnt 2933 3763 Pnt 2618 3761 Pnt 2590 3756 Pnt 2574 3780 Pnt 2473 3795 Pnt 2566 3745 Pnt 2999 3792 Pnt 2903 3743 Pnt 2468 3824 Pnt 2096 3799 Pnt 2481 3785 Pnt 4117 3794 Pnt 2179 3798 Pnt 2613 3805 Pnt 2708 3779 Pnt 2437 3765 Pnt 3381 3770 Pnt 2913 3783 Pnt 2790 3765 Pnt 2341 3793 Pnt 2832 3783 Pnt 2484 3765 Pnt 3940 2962 Pnt 2743 3774 Pnt 3103 3783 Pnt 1898 3796 Pnt 2748 3805 Pnt 3761 3760 Pnt 2227 3820 Pnt 2444 3766 Pnt 2681 3805 Pnt 3568 3756 Pnt 2604 3801 Pnt 2287 3774 Pnt 3067 3748 Pnt 2047 3811 Pnt 2556 3765 Pnt 3968 3773 Pnt 2869 3763 Pnt 3460 3752 Pnt 2655 3811 Pnt 2822 3828 Pnt 3519 3766 Pnt 2557 3776 Pnt 2002 3838 Pnt 2900 3821 Pnt 1975 3833 Pnt 2108 3896 Pnt 3408 3766 Pnt 2872 3774 Pnt 3376 3896 Pnt 3128 3785 Pnt 3019 3834 Pnt 3009 3762 Pnt 2433 3738 Pnt 2214 3844 Pnt 2569 3780 Pnt 3011 3761 Pnt 4146 3759 Pnt 3074 3836 Pnt 3603 3738 Pnt 3851 3761 Pnt 2823 3791 Pnt 2625 3805 Pnt 2690 3819 Pnt 2651 3867 Pnt 1857 3872 Pnt 3034 3800 Pnt 2489 3811 Pnt 2259 3822 Pnt 2032 3774 Pnt 2886 3871 Pnt 2072 3775 Pnt 2784 3761 Pnt 2547 3778 Pnt 3456 3755 Pnt 3211 3781 Pnt 2197 3824 Pnt 3311 3770 Pnt 3209 3824 Pnt 3277 3804 Pnt 2944 3754 Pnt 2935 3753 Pnt 2119 3879 Pnt 2256 3805 Pnt 2878 3807 Pnt 2421 3741 Pnt 2079 3774 Pnt 2588 3798 Pnt 2403 3804 Pnt 3696 3763 Pnt 2686 3797 Pnt 3123 3761 Pnt 2929 3804 Pnt 2904 3781 Pnt 2521 3750 Pnt 2949 3775 Pnt 2328 3793 Pnt 2648 3780 Pnt 2274 3841 Pnt 1947 3932 Pnt 4307 3769 Pnt 3378 3780 Pnt 3394 3841 Pnt 2744 3794 Pnt 2865 3800 Pnt 2514 3771 Pnt 2032 3844 Pnt 2770 3772 Pnt 2524 3795 Pnt 2871 3802 Pnt 2016 3826 Pnt 1907 3821 Pnt 3532 3789 Pnt 2336 3812 Pnt 4137 3769 Pnt 2628 3813 Pnt 2648 3763 Pnt 2658 3799 Pnt 2602 3827 Pnt 2716 3754 Pnt 2385 3799 Pnt 3136 3771 Pnt 2409 3758 Pnt 2591 3805 Pnt 4054 3789 Pnt 2185 3810 Pnt 3743 3809 Pnt 2518 3770 Pnt 3176 3765 Pnt 2725 3781 Pnt 2312 3821 Pnt 3016 3738 Pnt 2044 3806 Pnt 2779 3738 Pnt 2525 3796 Pnt 3425 3810 Pnt 2715 3779 Pnt 3241 3758 Pnt 2702 3820 Pnt 2785 3754 Pnt 3575 3799 Pnt 2375 3775 Pnt 3525 3771 Pnt 2236 3770 Pnt 2666 3812 Pnt 3247 3804 Pnt 3646 3799 Pnt 2495 3801 Pnt 2558 3796 Pnt 3112 3756 Pnt 2097 3773 Pnt 3077 3796 Pnt 2748 3754 Pnt 3329 3767 Pnt 3036 3788 Pnt 2892 3823 Pnt 2691 3755 Pnt 3844 3766 Pnt 2447 3749 Pnt 2891 3771 Pnt 3092 3789 Pnt 2542 3752 Pnt 2855 3771 Pnt 2718 3805 Pnt 2480 3778 Pnt 2136 3821 Pnt 2947 3805 Pnt 2047 3805 Pnt 2079 3815 Pnt 4169 3757 Pnt 2567 3838 Pnt 3021 3753 Pnt 2161 3826 Pnt 4035 2922 Pnt 2444 3855 Pnt 2293 3775 Pnt 4151 3753 Pnt 3095 3760 Pnt 2906 3763 Pnt 3949 3758 Pnt 2302 3777 Pnt 2626 3763 Pnt 3546 3765 Pnt 2340 3810 Pnt 2023 3793 Pnt 4051 3779 Pnt 3944 3747 Pnt 2713 3810 Pnt 3627 3764 Pnt 2920 3764 Pnt 2220 3895 Pnt 2589 3815 Pnt 2918 3752 Pnt 2358 3872 Pnt 3332 2795 Pnt 2545 3786 Pnt 2448 3832 Pnt 2436 3779 Pnt 4199 3872 Pnt 2619 3831 Pnt 3536 3831 Pnt 2563 3815 Pnt 3100 3805 Pnt 2548 3806 Pnt 3167 2859 Pnt 2662 3818 Pnt 2401 3790 Pnt 3064 3773 Pnt 2331 3773 Pnt 2910 3818 Pnt 2371 3880 Pnt 3379 3815 Pnt 2126 3789 Pnt 2442 3802 Pnt 2162 3805 Pnt 2821 3809 Pnt 2119 3826 Pnt 2344 3915 Pnt 2784 3797 Pnt 2813 3841 Pnt 2354 3795 Pnt 4065 3915 Pnt 3792 3823 Pnt 3152 3749 Pnt 2417 3770 Pnt 2535 3815 Pnt 3372 3802 Pnt 2586 3802 Pnt 3117 2878 Pnt 2404 3816 Pnt 3257 3795 Pnt 2560 3816 Pnt 2146 3786 Pnt 3391 3802 Pnt 2188 3852 Pnt 2171 3820 Pnt 4067 3776 Pnt 3401 3795 Pnt 2593 3766 Pnt 2040 3774 Pnt 2787 3765 Pnt 3001 3852 Pnt 2555 3819 Pnt 2156 3790 Pnt 3749 3798 Pnt 2005 3787 Pnt 2725 3808 Pnt 3231 3817 Pnt 2424 3766 Pnt 2335 3783 Pnt 2909 3792 Pnt 3190 3771 Pnt 2619 3770 Pnt 2323 3783 Pnt 3795 3768 Pnt 2763 3801 Pnt 2396 3791 Pnt 3030 3768 Pnt 1944 3804 Pnt 2737 3831 Pnt 2980 3929 Pnt 2926 3809 Pnt 2608 3763 Pnt 3100 3929 Pnt 2931 3760 Pnt 3670 3777 Pnt 2735 3784 Pnt 2647 3803 Pnt 3852 3809 Pnt 2681 3754 Pnt 2555 3859 Pnt 2923 3771 Pnt 2318 3850 Pnt 2083 3785 Pnt 3446 3754 Pnt 2669 3779 Pnt 2468 3767 Pnt 2329 3901 Pnt 3148 3785 Pnt 2435 3763 Pnt 2341 3806 Pnt 2671 3772 Pnt 2867 3772 Pnt 2143 3758 Pnt 1981 3797 Pnt 2586 3763 Pnt 3193 3810 Pnt 4108 3771 Pnt 1729 3797 Pnt 2771 3758 Pnt 1874 3763 Pnt 2765 3751 Pnt 2543 3831 Pnt 2678 3784 Pnt 2565 3806 Pnt 3010 3787 Pnt 2807 3831 Pnt 2719 3759 Pnt 2505 3810 Pnt 3473 3810 Pnt 3326 3759 Pnt 2221 3838 Pnt 2928 3760 Pnt 3259 3793 Pnt 2838 3760 Pnt 2684 3842 Pnt 3114 3757 Pnt 2457 3811 Pnt 4020 3751 Pnt 2973 3798 Pnt 2565 3768 Pnt 3385 3754 Pnt 2694 2882 Pnt 4045 3765 Pnt 2886 3762 Pnt 2221 3760 Pnt 2350 3801 Pnt 3084 3762 Pnt 2531 3797 Pnt 3483 3760 Pnt 2600 3797 Pnt 2605 3808 Pnt 2476 3801 Pnt 2590 3785 Pnt 2862 3812 Pnt 4509 3808 Pnt 2485 3785 Pnt 3046 3836 Pnt 2294 3824 Pnt 3223 3802 Pnt 2511 3764 Pnt 2445 3760 Pnt 2605 3843 Pnt 2609 3849 Pnt 2462 3836 Pnt 3801 3760 Pnt 2779 3789 Pnt 3587 3772 Pnt 1989 3836 Pnt 1956 3807 Pnt 2123 3827 Pnt 3422 3789 Pnt 3305 3839 Pnt 2789 3769 Pnt 2468 3783 Pnt 2521 3857 Pnt 2713 3753 Pnt 2337 3794 Pnt 2909 3865 Pnt 2596 3854 Pnt 1997 3800 Pnt 4319 3775 Pnt 3010 3812 Pnt 2923 3747 Pnt 2743 3866 Pnt 2389 3779 Pnt 2100 3912 Pnt 3010 3847 Pnt 2657 3810 Pnt 2136 3757 Pnt 3416 3762 Pnt 2130 3839 Pnt 2849 3749 Pnt 3402 3847 Pnt 3158 3776 Pnt 3538 3810 Pnt 2587 3766 Pnt 3043 3749 Pnt 2497 3774 Pnt 3036 3755 Pnt 3065 3776 Pnt 2318 3749 Pnt 1840 3761 Pnt 2456 3755 Pnt 2516 3870 Pnt 2238 3930 Pnt 2371 3803 Pnt 2111 3821 Pnt 3054 3819 Pnt 2580 3870 Pnt 1757 3775 Pnt 2718 3803 Pnt 2856 3839 Pnt 2528 3764 Pnt 3906 3747 Pnt 2526 3827 Pnt 2819 3798 Pnt 3190 3782 Pnt 2555 3786 Pnt 1906 3796 Pnt 2721 3827 Pnt 2014 3789 Pnt 3130 3779 Pnt 3009 3781 Pnt 2918 3810 Pnt 2865 3798 Pnt 3451 3798 Pnt 2904 3809 Pnt 2900 3797 Pnt 2611 3803 Pnt 3090 3851 Pnt 4062 3750 Pnt 2696 3779 Pnt 3694 3809 Pnt 2707 3768 Pnt 3120 3796 Pnt 2843 3808 Pnt 2136 3782 Pnt 3971 3768 Pnt 2724 3812 Pnt 2150 3814 Pnt 2028 3809 Pnt 2806 3802 Pnt 2759 3856 Pnt 1919 3798 Pnt 3241 3767 Pnt 2892 3755 Pnt 2305 3747 Pnt 2176 3799 Pnt 3263 3758 Pnt 2705 3748 Pnt 2926 3754 Pnt 4112 3753 Pnt 2591 3813 Pnt 3245 3813 Pnt 4360 3754 Pnt 3260 3767 Pnt 2308 3770 Pnt 3670 3825 Pnt 2696 3870 Pnt 2668 3799 Pnt 2474 3748 Pnt 2680 3754 Pnt 3442 3762 Pnt 2857 3772 Pnt 3932 3767 Pnt 2650 3780 Pnt 2537 3781 Pnt 2243 3834 Pnt 2789 3803 Pnt 2130 3786 Pnt 3242 3805 Pnt 2423 3776 Pnt 4054 3762 Pnt 3377 3789 Pnt 2176 3791 Pnt 2879 3765 Pnt 3043 3813 Pnt 2460 3843 Pnt 2332 3809 Pnt 2480 3810 Pnt 4110 3810 Pnt 3181 3799 Pnt 3707 3765 Pnt 2437 3943 Pnt 2918 3751 Pnt 2649 3763 Pnt 2902 3943 Pnt 2919 3779 Pnt 2833 3779 Pnt 3582 3769 Pnt 3626 3787 Pnt 2999 3950 Pnt 2800 3762 Pnt 2571 3770 Pnt 2325 3833 Pnt 2702 3764 Pnt 2909 3950 Pnt 2656 3766 Pnt 2662 3808 Pnt 2453 3750 Pnt 3179 3813 Pnt 3175 3808 Pnt 2519 3765 Pnt 2934 3762 Pnt 3494 3765 Pnt 2791 3754 Pnt 2314 3800 Pnt 3746 3786 Pnt 2835 3775 Pnt 2775 3822 Pnt 3278 3768 Pnt 2053 3844 Pnt 2891 3766 Pnt 2403 3784 Pnt 2060 3826 Pnt 2648 3799 Pnt 2317 3804 Pnt 3019 3768 Pnt 3050 3803 Pnt 2725 3801 Pnt 2862 3807 Pnt 2676 3784 Pnt 1984 3801 Pnt 2930 3793 Pnt 2694 3791 Pnt 2035 3834 Pnt 4015 3792 Pnt 2816 3803 Pnt 3709 3787 Pnt 2516 3808 Pnt 2562 3806 Pnt 2313 3922 Pnt 3080 3770 Pnt 2155 3789 Pnt 3020 3805 Pnt 2808 3834 Pnt 2521 3792 Pnt 3691 3742 Pnt 2658 3793 Pnt 3912 3772 Pnt 3735 3766 Pnt 2957 3815 Pnt 2071 3815 Pnt 2888 3781 Pnt 2653 3758 Pnt 2344 3811 Pnt 3233 3813 Pnt 2781 3813 Pnt 2831 3790 Pnt 2708 3765 Pnt 2511 3788 Pnt 3434 3782 Pnt 1977 3796 Pnt 2640 3765 Pnt 2616 3821 Pnt 2468 3765 Pnt 2991 3755 Pnt 3363 3767 Pnt 2638 3781 Pnt 2674 3773 Pnt 2667 3849 Pnt 3286 3816 Pnt 2265 3739 Pnt 3839 3764 Pnt 2850 3779 Pnt 3265 3827 Pnt 2674 3773 Pnt 2496 3779 Pnt 2508 3836 Pnt 3270 3826 Pnt 2591 3815 Pnt 2473 3778 Pnt 2589 3802 Pnt 3011 3765 Pnt 3491 3777 Pnt 2542 3749 Pnt 2583 3780 Pnt 3217 3800 Pnt 2829 3790 Pnt 2764 3787 Pnt 2760 3801 Pnt 2911 3798 Pnt 4480 3749 Pnt 3390 3787 Pnt 2714 3806 Pnt 3195 3798 Pnt 2755 3779 Pnt 2331 3794 Pnt 2980 3104 Pnt 2046 3788 Pnt 2702 3779 Pnt 2807 3818 Pnt 3962 3786 Pnt 2697 3814 Pnt 3144 3810 Pnt 2419 3770 Pnt 3990 3794 Pnt 3865 3797 Pnt 2818 3746 Pnt 3213 3797 Pnt 2745 3777 Pnt 2985 3782 Pnt 4307 3746 Pnt 3046 3783 Pnt 2267 3845 Pnt 3118 3766 Pnt 2491 3803 Pnt 3476 3762 Pnt 2363 3818 Pnt 2619 3783 Pnt 2564 3811 Pnt 2490 3811 Pnt 3832 3803 Pnt 2040 3792 Pnt 2732 3748 Pnt 2776 3811 Pnt 2237 3820 Pnt 3176 3768 Pnt 2842 3794 Pnt 2729 3762 Pnt 2468 3799 Pnt 2678 3815 Pnt 2168 3778 Pnt 3758 3825 Pnt 2216 3742 Pnt 2731 3760 Pnt 3111 3769 Pnt 2649 3769 Pnt 2368 3767 Pnt 2085 3791 Pnt 4378 3764 Pnt 2982 3769 Pnt 2047 3814 Pnt 2909 3767 Pnt 2664 3839 Pnt 2036 3772 Pnt 2720 3761 Pnt 3030 3802 Pnt 2770 3772 Pnt 2661 3769 Pnt 2055 3798 Pnt 2954 3769 Pnt 2054 3821 Pnt 3534 3761 Pnt 2541 3806 Pnt 2176 3834 Pnt 2556 3805 Pnt 3447 3797 Pnt 3556 3810 Pnt 2782 3770 Pnt 2448 3788 Pnt 2727 3766 Pnt 3201 3746 Pnt 2775 3816 Pnt 3905 3778 Pnt 2424 3759 Pnt 2496 3773 Pnt 3171 3754 Pnt 2367 3933 Pnt 2777 3769 Pnt 2629 3933 Pnt 2503 3775 Pnt 2512 3843 Pnt 2323 3803 Pnt 3056 3759 Pnt 3232 3842 Pnt 2506 3765 Pnt 2700 3805 Pnt 2527 3755 Pnt 4342 3777 Pnt 2860 3770 Pnt 2248 3804 Pnt 3010 3805 Pnt 2212 3754 Pnt 2796 3757 Pnt 2483 3783 Pnt 2555 3804 Pnt 2619 3796 Pnt 3003 3789 Pnt 3787 3758 Pnt 2957 3765 Pnt 2403 3765 Pnt 2748 3765 Pnt 3289 3820 Pnt 2769 3780 Pnt 2867 3777 Pnt 2491 3765 Pnt 2922 3820 Pnt 2666 3836 Pnt 3013 3777 Pnt 3225 3836 Pnt 2287 3801 Pnt 2312 3803 Pnt 3347 3780 Pnt 3792 3747 Pnt 3044 3826 Pnt 2773 3807 Pnt 2596 3780 Pnt 2996 3753 Pnt 2124 3814 Pnt 3803 3780 Pnt 3038 3817 Pnt 3313 3790 Pnt 3575 3789 Pnt 2991 3820 Pnt 2925 3760 Pnt 4331 3768 Pnt 3066 3779 Pnt 2140 3863 Pnt 3444 3751 Pnt 2006 3780 Pnt 3115 3850 Pnt 2387 3771 Pnt 2612 3745 Pnt 2222 3745 Pnt 2432 3773 Pnt 3459 3746 Pnt 3125 3755 Pnt 2961 3760 Pnt 2770 3819 Pnt 3440 3766 Pnt 2644 3773 Pnt 3406 3760 Pnt 3249 3775 Pnt 2333 3824 Pnt 2866 3800 Pnt 2393 3808 Pnt 2868 3824 Pnt 3285 3748 Pnt 2944 3794 Pnt 2629 3748 Pnt 2034 3828 Pnt 4121 3792 Pnt 3441 3758 Pnt 2349 3755 Pnt 2707 3774 Pnt 3468 3824 Pnt 2626 3813 Pnt 3046 3791 Pnt 3323 3755 Pnt 2516 3780 Pnt 2653 3781 Pnt 2661 3798 Pnt 2443 3805 Pnt 2193 3900 Pnt 2921 3805 Pnt 3613 3783 Pnt 2063 3820 Pnt 2737 3843 Pnt 2544 3765 Pnt 2370 3766 Pnt 3094 3794 Pnt 2439 3744 Pnt 3788 3796 Pnt 3443 3766 Pnt 2024 3811 Pnt 2880 3767 Pnt 2421 3777 Pnt 4545 3825 Pnt 3402 3783 Pnt 2839 3811 Pnt 2183 3814 Pnt 2182 3772 Pnt 3258 3791 Pnt 3171 3783 Pnt 2364 3784 Pnt 3280 3778 Pnt 3082 3748 Pnt 2832 3797 Pnt 2482 3791 Pnt 3221 3784 Pnt 2563 3822 Pnt 1925 3871 Pnt 2989 3753 Pnt 2225 3899 Pnt 2757 3781 Pnt 3171 3753 Pnt 2096 3799 Pnt 3822 3758 Pnt 2400 3821 Pnt 2634 3821 Pnt 2017 3896 Pnt 2226 3822 Pnt 2561 3755 Pnt 2726 3738 Pnt 2234 3810 Pnt 3913 3748 Pnt 4015 3826 Pnt 2539 3778 Pnt 2037 3823 Pnt 3085 3791 Pnt 3668 2778 Pnt 1977 3824 Pnt 2518 3836 Pnt 2751 3803 Pnt 2289 3782 Pnt 2129 3827 Pnt 3221 3760 Pnt 2687 3787 Pnt 2567 3767 Pnt 3584 3836 Pnt 2470 3825 Pnt 3173 3761 Pnt 2115 3808 Pnt 2006 3774 Pnt 2138 3834 Pnt 2615 3772 Pnt 3066 3761 Pnt 2976 3743 Pnt 3752 3768 Pnt 2781 3759 Pnt 2744 3781 Pnt 2859 3809 Pnt 2085 3781 Pnt 2419 3810 Pnt 2913 3753 Pnt 2831 3793 Pnt 2778 3776 Pnt 2814 3753 Pnt 2886 3804 Pnt 2305 3932 Pnt 4281 3764 Pnt 2920 3743 Pnt 2247 3879 Pnt 2863 3932 Pnt 2218 3798 Pnt 3042 3769 Pnt 4189 3781 Pnt 2097 3814 Pnt 2576 3798 Pnt 2196 3807 Pnt 2789 3813 Pnt 2830 3804 Pnt 1832 3741 Pnt 2718 3754 Pnt 2594 3756 Pnt 2517 3778 Pnt 2081 3844 Pnt 1879 3763 Pnt 1963 3767 Pnt 3901 3768 Pnt 2864 3750 Pnt 3045 3763 Pnt 2412 3799 Pnt 2282 3841 Pnt 2599 3797 Pnt 2634 3775 Pnt 2076 3844 Pnt 1801 3819 Pnt 2466 3827 Pnt 2929 3847 Pnt 2608 3820 Pnt 2576 3774 Pnt 2328 3821 Pnt 2655 3822 Pnt 2598 3812 Pnt 2963 3799 Pnt 2563 3782 Pnt 3132 3761 Pnt 3849 3810 Pnt 3507 3782 Pnt 2511 3752 Pnt 3178 3769 Pnt 2959 3772 Pnt 2510 3751 Pnt 2891 3805 Pnt 2431 3772 Pnt 1943 3761 Pnt 3277 3772 Pnt 2414 3751 Pnt 3083 3823 Pnt 2973 3763 Pnt 2969 3763 Pnt 3055 3773 Pnt 3081 3770 Pnt 2671 3776 Pnt 2666 3827 Pnt 2867 3749 Pnt 2691 3843 Pnt 3233 3773 Pnt 3013 3827 Pnt 3669 3763 Pnt 2683 3756 Pnt 2990 3738 Pnt 2675 3828 Pnt 2139 3821 Pnt 2070 3780 Pnt 3372 3763 Pnt 2380 3745 Pnt 2543 3822 Pnt 2752 3776 Pnt 2359 3805 Pnt 2731 3802 Pnt 2366 3815 Pnt 2055 3773 Pnt 2722 3813 Pnt 2373 3771 Pnt 2442 3779 Pnt 3706 3763 Pnt 2349 3804 Pnt 2974 3774 Pnt 2441 3755 Pnt 2287 3835 Pnt 1967 3803 Pnt 2832 3838 Pnt 3354 3774 Pnt 2057 3812 Pnt 4041 2136 Pnt 2994 3815 Pnt 2900 3772 Pnt 2832 3813 Pnt 2613 3808 Pnt 3334 3815 Pnt 2652 3789 Pnt 2962 3831 Pnt 1913 3796 Pnt 2136 3779 Pnt 4186 3808 Pnt 3547 3789 Pnt 2837 3755 Pnt 2471 3820 Pnt 3352 3764 Pnt 3545 3776 Pnt 3484 3755 Pnt 2983 3774 Pnt 2647 3773 Pnt 3992 3764 Pnt 2993 3771 Pnt 3036 3752 Pnt 2988 3773 Pnt 3506 3743 Pnt 2844 3766 Pnt 2678 3761 Pnt 2215 3753 Pnt 3275 3805 Pnt 2867 3751 Pnt 2301 3895 Pnt 3335 3751 Pnt 2477 3881 Pnt 2136 3793 Pnt 2396 3786 Pnt 3226 3835 Pnt 2263 3793 Pnt 2615 3756 Pnt 2110 3826 Pnt 3100 3826 Pnt 3070 3794 Pnt 2096 3794 Pnt 2453 3815 Pnt 2456 3776 Pnt 2676 3915 Pnt 2815 3818 Pnt 2465 3763 Pnt 2389 3802 Pnt 1861 3760 Pnt 2261 3779 Pnt 1967 3801 Pnt 2965 3841 Pnt 2488 3772 Pnt 2169 3823 Pnt 2179 3809 Pnt 2380 3809 Pnt 2612 3802 Pnt 2281 3796 Pnt 3111 3785 Pnt 2376 3763 Pnt 2360 3795 Pnt 3286 3794 Pnt 2417 3749 Pnt 3023 3784 Pnt 3393 3806 Pnt 2747 3782 Pnt 2339 3765 Pnt 2680 3816 Pnt 2381 3810 Pnt 4406 3772 Pnt 2940 3833 Pnt 2409 3106 Pnt 2598 3792 Pnt 2622 3792 Pnt 2934 3798 Pnt 2921 3790 Pnt 2431 3810 Pnt 3020 3809 Pnt 4211 3775 Pnt 2105 3826 Pnt 3073 3768 Pnt 2697 3785 Pnt 2594 3751 Pnt 2639 3762 Pnt 3020 3767 Pnt 3456 3785 Pnt 2622 3811 Pnt 2253 3760 Pnt 3126 3783 Pnt 3319 3810 Pnt 4422 3762 Pnt 2598 3783 Pnt 3295 3788 Pnt 2553 3768 Pnt 2259 3818 Pnt 2917 3788 Pnt 2587 3784 Pnt 2290 3785 Pnt 3167 3808 Pnt 2247 3872 Pnt 1990 3794 Pnt 3075 3784 Pnt 3034 3760 Pnt 2665 3803 Pnt 3015 3806 Pnt 2228 3800 Pnt 2865 3789 Pnt 3030 3752 Pnt 2988 3872 Pnt 2827 3793 Pnt 3027 3746 Pnt 2650 3763 Pnt 2957 3789 Pnt 2644 3770 Pnt 2137 3757 Pnt 2494 3738 Pnt 2328 3779 Pnt 2551 3831 Pnt 2510 3832 Pnt 2016 3912 Pnt 2954 3754 Pnt 2631 3827 Pnt 3112 3783 Pnt 3057 3806 Pnt 2827 3806 Pnt 2712 3836 Pnt 2956 3810 Pnt 2925 3793 Pnt 3506 3847 Pnt 2996 3759 Pnt 2609 3765 Pnt 3738 3783 Pnt 3101 3762 Pnt 2356 3783 Pnt 3194 3749 Pnt 2279 3831 Pnt 2892 3766 Pnt 4206 3797 Pnt 3348 3798 Pnt 2778 3857 Pnt 2499 3801 Pnt 3154 3759 Pnt 2707 3859 Pnt 2204 3852 Pnt 2674 3806 Pnt 4181 2869 Pnt 2658 3759 Pnt 3022 3797 Pnt 3082 3786 Pnt 2484 3850 Pnt 2049 3797 Pnt 2687 3765 Pnt 2518 3854 Pnt 2957 3788 Pnt 2116 3782 Pnt 3016 3798 Pnt 3765 3786 Pnt 3204 3798 Pnt 2886 3853 Pnt 2746 3815 Pnt 2635 3822 Pnt 2334 3785 Pnt 2506 3783 Pnt 3293 3815 Pnt 2674 3790 Pnt 2309 3824 Pnt 2494 3749 Pnt 2185 3822 Pnt 2457 3836 Pnt 2659 3793 Pnt 2554 3817 Pnt 2437 3764 Pnt 2645 3766 Pnt 2849 3812 Pnt 2751 3803 Pnt 2656 3778 Pnt 2368 3839 Pnt 2698 3780 Pnt 3960 3793 Pnt 3476 3812 Pnt 2507 3790 Pnt 2049 3776 Pnt 2313 3758 Pnt 1870 3807 Pnt 2499 3754 Pnt 2380 3789 Pnt 2044 3786 Pnt 2846 3753 Pnt 2033 3794 Pnt 3318 3816 Pnt 2469 3820 Pnt 2021 3843 Pnt 2808 3786 Pnt 1989 3791 Pnt 2279 3747 Pnt 2757 3776 Pnt 2359 3783 Pnt 2541 3804 Pnt 3580 3791 Pnt 3015 3753 Pnt 2329 3787 Pnt 3438 3804 Pnt 3255 3758 Pnt 2850 3785 Pnt 3076 3797 Pnt 2757 3753 Pnt 3191 3784 Pnt 2489 3773 Pnt 1993 3839 Pnt 2356 3810 Pnt 2988 3926 Pnt 2930 3773 Pnt 2812 3774 Pnt 2257 3901 Pnt 2438 3745 Pnt 2472 3745 Pnt 3201 3754 Pnt 2675 3782 Pnt 3842 3773 Pnt 2997 3901 Pnt 2779 3819 Pnt 2516 3761 Pnt 2893 3763 Pnt 2250 3801 Pnt 2574 3766 Pnt 2791 3765 Pnt 2427 3870 Pnt 1984 3797 Pnt 3668 3760 Pnt 2096 3866 Pnt 3013 3758 Pnt 2143 3764 Pnt 3085 3745 Pnt 2971 3839 Pnt 2513 3775 Pnt 3781 3758 Pnt 2766 3792 Pnt 2988 3800 Pnt 3583 3950 Pnt 3013 3810 Pnt 1924 3844 Pnt 4109 3950 Pnt 2942 3779 Pnt 2552 3757 Pnt 3968 3775 Pnt 2533 3800 Pnt 4073 3792 Pnt 2450 3777 Pnt 3039 3784 Pnt 2802 3813 Pnt 2487 3842 Pnt 2904 3765 Pnt 3345 3803 Pnt 2391 3793 Pnt 3965 3813 Pnt 4383 3812 Pnt 2760 3799 Pnt 3444 3771 Pnt 2628 3822 Pnt 2953 3770 Pnt 2729 3779 Pnt 2567 3812 Pnt 2659 3773 Pnt 2575 3768 Pnt 3440 3812 Pnt 2451 3804 Pnt 2432 3849 Pnt 3367 3782 Pnt 2189 3799 Pnt 2762 3767 Pnt 2561 3779 Pnt 2921 3782 Pnt 2164 3747 Pnt 2898 3800 Pnt 2190 3870 Pnt 2793 3771 Pnt 1989 3835 Pnt 2680 3747 Pnt 4056 3758 Pnt 4048 3802 Pnt 2966 3774 Pnt 2235 3813 Pnt 2870 3835 Pnt 2549 3808 Pnt 2743 3754 Pnt 2887 3809 Pnt 2105 3739 Pnt 2801 3762 Pnt 3084 3808 Pnt 3028 3786 Pnt 2375 3821 Pnt 2541 3834 Pnt 2356 3834 Pnt 3168 3754 Pnt 2673 3789 Pnt 2644 3828 Pnt 2933 3821 Pnt 2382 3839 Pnt 2632 3827 Pnt 2524 3848 Pnt 2698 3770 Pnt 3236 3827 Pnt 3227 3848 Pnt 3045 3765 Pnt 2232 3834 Pnt 2937 3780 Pnt 2551 3765 Pnt 2342 3806 Pnt 2372 3777 Pnt 2647 3751 Pnt 2237 3801 Pnt 4134 3758 Pnt 3025 3768 Pnt 2909 3779 Pnt 4403 3775 Pnt 3409 3851 Pnt 3704 3779 Pnt 3203 3746 Pnt 2475 3817 Pnt 3313 3752 Pnt 2107 3814 Pnt 2750 3769 Pnt 2331 3844 Pnt 2437 3772 Pnt 2466 3802 Pnt 2023 3809 Pnt 2173 3833 Pnt 4039 3788 Pnt 2913 3786 Pnt 3162 3788 Pnt 2853 3754 Pnt 3231 3809 Pnt 2711 3764 Pnt 2784 3809 Pnt 1953 3792 Pnt 2611 3802 Pnt 3113 3764 Pnt 3151 3856 Pnt 2318 3799 Pnt 3757 3856 Pnt 2702 3754 Pnt 3978 3799 Pnt 2347 3758 Pnt 3011 3758 Pnt 2532 3775 Pnt 3173 2749 Pnt 2223 3811 Pnt 2290 3813 Pnt 3389 3755 Pnt 2323 3826 Pnt 3859 3768 Pnt 3149 3766 Pnt 2979 3757 Pnt 2828 3825 Pnt 2044 3803 Pnt 2757 3769 Pnt 2128 3770 Pnt 2542 3770 Pnt 4500 3798 Pnt 3200 3812 Pnt 2608 3761 Pnt 2632 3933 Pnt 2556 3832 Pnt 2499 3748 Pnt 2323 3784 Pnt 2404 3767 Pnt 4297 3766 Pnt 3040 3805 Pnt 2761 3759 Pnt 2636 3812 Pnt 3885 3792 Pnt 3289 3754 Pnt 3092 3795 Pnt 2426 3775 Pnt 3006 3753 Pnt 3156 3754 Pnt 2845 3812 Pnt 3138 3835 Pnt 3553 3812 Pnt 2954 3790 Pnt 2532 3872 Pnt 1960 3796 Pnt 2922 3812 Pnt 2949 3804 Pnt 3130 3810 Pnt 2994 3872 Pnt 2646 3760 Pnt 2509 3783 Pnt 4353 3759 Pnt 3470 3778 Pnt 2715 3783 Pnt 2559 3820 Pnt 3391 3766 Pnt 2457 3868 Pnt 3262 3819 Pnt 2878 3786 Pnt 3599 3868 Pnt 2525 3821 Pnt 2993 3780 Pnt 2588 3750 Pnt 2256 3790 Pnt 2413 3852 Pnt 2603 3791 Pnt 3786 3773 Pnt 3105 3773 Pnt 3337 3793 Pnt 2965 3782 Pnt 2923 3793 Pnt 2560 3757 Pnt 3193 3780 Pnt 2565 3766 Pnt 2235 3818 Pnt 2241 3804 Pnt 3370 3766 Pnt 2913 3822 Pnt 2841 3825 Pnt 2652 3836 Pnt 2760 3783 Pnt 4132 3797 Pnt 2323 3931 Pnt 3094 3836 Pnt 3266 3822 Pnt 2972 3768 Pnt 2051 3820 Pnt 3003 3817 Pnt 4399 3758 Pnt 2609 3779 Pnt 2843 3758 Pnt 2517 3777 Pnt 2524 3810 Pnt 2472 3790 Pnt 2669 3764 Pnt 3261 3762 Pnt 2436 3820 Pnt 2411 3763 Pnt 3451 3765 Pnt 2349 3778 Pnt 2402 3828 Pnt 3417 3793 Pnt 3006 3858 Pnt 2948 3807 Pnt 2871 3800 Pnt 2115 3835 Pnt 2667 3760 Pnt 2364 3793 Pnt 2718 3797 Pnt 2327 3758 Pnt 3446 3807 Pnt 2763 3798 Pnt 2430 3837 Pnt 4156 3858 Pnt 2731 3775 Pnt 2487 3770 Pnt 2809 3789 Pnt 2833 3773 Pnt 2963 3798 Pnt 3045 3810 Pnt 2618 3751 Pnt 2013 3775 Pnt 3379 3814 Pnt 2285 3805 Pnt 2469 3799 Pnt 2859 3751 Pnt 2778 3805 Pnt 2595 3824 Pnt 3628 3771 Pnt 2546 3771 Pnt 3309 3898 Pnt 2114 3770 Pnt 2300 3800 Pnt 3312 3816 Pnt 2855 3755 Pnt 2369 3797 Pnt 3085 3764 Pnt 3718 3764 Pnt 2844 3777 Pnt 2274 3772 Pnt 2913 3748 Pnt 3772 3767 Pnt 2567 3778 Pnt 2098 3800 Pnt 4514 3793 Pnt 2989 3858 Pnt 3193 3783 Pnt 2118 3745 Pnt 3333 3783 Pnt 4001 3783 Pnt 2661 3766 Pnt 2423 3791 Pnt 3317 3765 Pnt 3031 3790 Pnt 4189 3749 Pnt 2123 3818 Pnt 2683 3787 Pnt 3245 3826 Pnt 4002 3778 Pnt 2267 3843 Pnt 3401 3801 Pnt 2984 3803 Pnt 3122 3801 Pnt 2252 3819 Pnt 3255 3763 Pnt 3804 2846 Pnt 3540 3766 Pnt 3006 3783 Pnt 3448 3818 Pnt 4352 3167 Pnt 3884 3810 Pnt 3313 3824 Pnt 2528 3780 Pnt 3528 3777 Pnt 2461 3814 Pnt 2708 3788 Pnt 2686 3762 Pnt 2059 3811 Pnt 2973 3798 Pnt 2967 3789 Pnt 2436 3803 Pnt 2926 3803 Pnt 2088 3797 Pnt 2806 3791 Pnt 4175 3762 Pnt 2194 3871 Pnt 3028 3770 Pnt 2519 3753 Pnt 2191 3834 Pnt 2072 3753 Pnt 3544 3753 Pnt 2919 3778 Pnt 3911 3753 Pnt 3946 3788 Pnt 2890 3821 Pnt 2068 3821 Pnt 2121 3825 Pnt 4163 3789 Pnt 3148 3750 Pnt 2663 3778 Pnt 4001 3754 Pnt 3037 3772 Pnt 3409 3791 Pnt 3345 3810 Pnt 2368 3791 Pnt 2754 3773 Pnt 2805 3822 Pnt 2437 3756 Pnt 3488 3760 Pnt 2821 3760 Pnt 4223 2900 Pnt 2707 3830 Pnt 3558 3830 Pnt 2873 3771 Pnt 3345 3747 Pnt 2661 3867 Pnt 2105 3760 Pnt 3168 3759 Pnt 2670 3796 Pnt 2008 3896 Pnt 2920 3759 Pnt 3975 3751 Pnt 2774 3898 Pnt 3499 3768 Pnt 2830 3786 Pnt 2967 3784 Pnt 2482 3793 Pnt 2831 3825 Pnt 3683 3763 Pnt 2353 3791 Pnt 2911 3761 Pnt 2717 3776 Pnt 3321 3791 Pnt 2626 3904 Pnt 2592 3813 Pnt 2839 3814 Pnt 4134 3825 Pnt 2499 3753 Pnt 2026 3804 Pnt 3221 3753 Pnt 2925 3753 Pnt 2956 3771 Pnt 3569 3776 Pnt 2523 3743 Pnt 3171 3813 Pnt 2902 3809 Pnt 2614 3807 Pnt 2307 3798 Pnt 3044 3738 Pnt 4152 3753 Pnt 2118 3755 Pnt 2771 3798 Pnt 3086 3769 Pnt 2043 3803 Pnt 2755 3804 Pnt 1944 3756 Pnt 2017 3823 Pnt 2743 3775 Pnt 3281 3768 Pnt 2719 3823 Pnt 2644 3845 Pnt 4126 3768 Pnt 2455 3819 Pnt 2338 3823 Pnt 3065 3836 Pnt 2528 3749 Pnt 2499 3839 Pnt 3649 3809 Pnt 2888 3839 Pnt 2489 3757 Pnt 2770 3836 Pnt 2810 3809 Pnt 2654 3781 Pnt 2217 3922 Pnt 2478 3774 Pnt 2737 3820 Pnt 2764 3818 Pnt 2117 3805 Pnt 3824 3776 Pnt 2851 3846 Pnt 2854 3834 Pnt 4310 3780 Pnt 2526 3821 Pnt 2034 3776 Pnt 2504 3787 Pnt 3296 3834 Pnt 2383 3822 Pnt 2016 3780 Pnt 2693 3771 Pnt 3299 3821 Pnt 2973 3915 Pnt 2646 3810 Pnt 2454 3802 Pnt 2323 3782 Pnt 2280 3779 Pnt 2415 3803 Pnt 3359 3802 Pnt 3576 3738 Pnt 2579 3763 Pnt 3012 3779 Pnt 2741 3843 Pnt 2490 3771 Pnt 1939 3798 Pnt 2951 3774 Pnt 2517 3752 Pnt 2874 3843 Pnt 3168 2754 Pnt 2582 3855 Pnt 2503 3779 Pnt 2656 3754 Pnt 3101 3787 Pnt 3008 3771 Pnt 2356 3804 Pnt 2869 3776 Pnt 4326 3769 Pnt 2527 3811 Pnt 3260 3796 Pnt 2300 3773 Pnt 3733 3060 Pnt 3719 3776 Pnt 2728 3824 Pnt 2362 3895 Pnt 3098 3824 Pnt 2939 3771 Pnt 3922 3746 Pnt 2673 3764 Pnt 3128 3751 Pnt 2497 3773 Pnt 3240 3749 Pnt 2523 3762 Pnt 3772 3813 Pnt 3245 3773 Pnt 3222 3758 Pnt 2006 3767 Pnt 2616 3820 Pnt 3127 3774 Pnt 2480 3814 Pnt 4002 3750 Pnt 3187 3811 Pnt 2822 3790 Pnt 2521 3756 Pnt 2667 3755 Pnt 2837 3785 Pnt 3225 3766 Pnt 2050 3801 Pnt 2582 3757 Pnt 3102 3764 Pnt 2112 3843 Pnt 2597 3794 Pnt 2382 3784 Pnt 2691 3799 Pnt 2427 3779 Pnt 2623 3801 Pnt 2571 3763 Pnt 2967 3767 Pnt 2491 3824 Pnt 2746 3847 Pnt 2195 3767 Pnt 3646 3847 Pnt 2583 3772 Pnt 3231 3810 Pnt 2935 3822 Pnt 2746 3751 Pnt 2494 3791 Pnt 2873 3772 Pnt 2664 3782 Pnt 2123 3810 Pnt 2670 3805 Pnt 2755 3790 Pnt 2807 3802 Pnt 2419 3772 Pnt 2403 3833 Pnt 2079 3780 Pnt 2701 3797 Pnt 2629 3816 Pnt 2043 3826 Pnt 2870 3770 Pnt 2217 3796 Pnt 1925 3760 Pnt 3715 3775 Pnt 2435 3759 Pnt 3107 3763 Pnt 2415 3794 Pnt 4241 3764 Pnt 3235 3805 Pnt 2856 3841 Pnt 2589 3775 Pnt 3174 3794 Pnt 2491 3796 Pnt 3277 3784 Pnt 2931 3796 Pnt 2551 3812 Pnt 2409 3749 Pnt 3208 3785 Pnt 3526 3773 Pnt 3811 3785 Pnt 2815 3782 Pnt 2749 3768 Pnt 2299 3815 Pnt 2264 3806 Pnt 2885 3789 Pnt 2888 3745 Pnt 3742 3749 Pnt 2838 3772 Pnt 2649 3794 Pnt 4653 3756 Pnt 2418 3762 Pnt 2752 3783 Pnt 3527 3772 Pnt 2789 3795 Pnt 2626 3765 Pnt 2776 3779 Pnt 4039 3781 Pnt 2477 3872 Pnt 3325 3774 Pnt 2464 3771 Pnt 2423 3755 Pnt 2859 3764 Pnt 3864 3748 Pnt 3630 3806 Pnt 2775 3755 Pnt 3340 3789 Pnt 2634 3779 Pnt 2469 3793 Pnt 2590 3825 Pnt 2855 3793 Pnt 3141 3792 Pnt 2354 3835 Pnt 2117 3757 Pnt 3050 3769 Pnt 2025 3800 Pnt 4355 3785 Pnt 2266 3747 Pnt 2140 3852 Pnt 2286 3804 Pnt 2666 3760 Pnt 2978 3853 Pnt 2670 3753 Pnt 3438 3792 Pnt 2688 3838 Pnt 2931 3754 Pnt 3613 3757 Pnt 2441 3812 Pnt 3222 3804 Pnt 3263 3839 Pnt 3456 3780 Pnt 3267 3808 Pnt 2722 3756 Pnt 2475 3772 Pnt 3230 3760 Pnt 3403 3800 Pnt 2471 3857 Pnt 2675 3772 Pnt 2894 3857 Pnt 2878 3811 Pnt 2449 3836 Pnt 3491 3763 Pnt 2142 3810 Pnt 2937 3798 Pnt 2926 3773 Pnt 2562 3805 Pnt 2281 3808 Pnt 3045 3793 Pnt 2893 3793 Pnt 3459 3798 Pnt 2263 3943 Pnt 2786 3759 Pnt 3133 3762 Pnt 2458 3801 Pnt 3014 3793 Pnt 2515 3764 Pnt 3310 3754 Pnt 3115 3758 Pnt 2831 3783 Pnt 3294 3784 Pnt 2794 3763 Pnt 3850 3802 Pnt 2613 3762 Pnt 3238 3842 Pnt 2982 3810 Pnt 2671 3866 Pnt 2862 3790 Pnt 2191 3753 Pnt 3516 2815 Pnt 2565 3867 Pnt 2201 3822 Pnt 2212 3738 Pnt 2264 3786 Pnt 3269 3813 Pnt 2591 3766 Pnt 3257 3765 Pnt 2897 3763 Pnt 2746 3810 Pnt 2096 3803 Pnt 3373 3758 Pnt 2553 3762 Pnt 2492 3765 Pnt 2069 3827 Pnt 2097 3848 Pnt 2867 3766 Pnt 2542 3768 Pnt 2057 3789 Pnt 2044 3786 Pnt 2756 3832 Pnt 2188 3780 Pnt 3043 3788 Pnt 2261 3765 Pnt 2964 3765 Pnt 2476 3824 Pnt 2956 3783 Pnt 2367 3818 Pnt 2624 3810 Pnt 3074 3850 Pnt 2508 3749 Pnt 2776 3827 Pnt 2184 3847 Pnt 2573 3772 Pnt 2717 3765 Pnt 2496 3801 Pnt 3054 3836 Pnt 3252 3847 Pnt 3843 3767 Pnt 2779 3769 Pnt 2737 3751 Pnt 2678 3780 Pnt 3680 3769 Pnt 2641 3808 Pnt 2993 3772 Pnt 2427 3789 Pnt 2094 3834 Pnt 3511 3755 Pnt 2552 3770 Pnt 3436 3814 Pnt 2669 3779 Pnt 2374 3777 Pnt 3144 3753 Pnt 3616 3825 Pnt 2070 3912 Pnt 2845 3767 Pnt 2682 3781 Pnt 2687 3817 Pnt 2426 3834 Pnt 3265 3785 Pnt 3028 3773 Pnt 2875 3785 Pnt 2615 3850 Pnt 2951 3805 Pnt 3312 3796 Pnt 2208 3799 Pnt 3492 3755 Pnt 2775 3926 Pnt 2509 3789 Pnt 2589 3813 Pnt 4565 3783 Pnt 2441 3796 Pnt 2561 3764 Pnt 2598 3810 Pnt 1953 3821 Pnt 2870 3745 Pnt 2477 3745 Pnt 2406 3764 Pnt 3162 3779 Pnt 2905 3926 Pnt 2519 3747 Pnt 2520 3901 Pnt 3253 3812 Pnt 2596 3772 Pnt 2487 3798 Pnt 1900 3805 Pnt 2619 3762 Pnt 2567 3805 Pnt 1980 3839 Pnt 3217 3796 Pnt 2685 3778 Pnt 2817 3771 Pnt 2475 3772 Pnt 1729 3932 Pnt 2124 3767 Pnt 2826 3809 Pnt 2009 3776 Pnt 2145 3782 Pnt 3198 3772 Pnt 2224 3831 Pnt 2104 3801 Pnt 3001 3798 Pnt 3279 3788 Pnt 2210 3739 Pnt 3060 3753 Pnt 2767 3775 Pnt 1981 3809 Pnt 2700 3793 Pnt 2478 3778 Pnt 1737 3771 Pnt 2849 3789 Pnt 3166 3754 Pnt 2757 3754 Pnt 2916 3774 Pnt 2728 3754 Pnt 2178 3763 Pnt 3140 3797 Pnt 3842 3774 Pnt 2896 3792 Pnt 3466 3763 Pnt 2435 3780 Pnt 2302 3827 Pnt 3840 3754 Pnt 2635 3797 Pnt 2734 3792 Pnt 2120 3851 Pnt 4299 3764 Pnt 3060 2952 Pnt 2687 3782 Pnt 3232 3753 Pnt 3444 3782 Pnt 2859 3805 Pnt 3269 3777 Pnt 2170 3850 Pnt 3185 3754 Pnt 2445 3751 Pnt 2602 3763 Pnt 2680 3819 Pnt 3097 3783 Pnt 4046 3754 Pnt 2378 3804 Pnt 3011 3773 Pnt 2951 3789 Pnt 2631 3802 Pnt 3736 3802 Pnt 2759 3754 Pnt 2281 3765 Pnt 4044 3773 Pnt 3234 3765 Pnt 2385 3808 Pnt 2477 3760 Pnt 2208 3770 Pnt 2073 3866 Pnt 4011 3761 Pnt 1958 3789 Pnt 4290 2889 Pnt 2058 3794 Pnt 2589 3812 Pnt 3393 3745 Pnt 2307 3820 Pnt 3540 3771 Pnt 2385 3781 Pnt 2824 3812 Pnt 3064 3847 Pnt 2791 3757 Pnt 2000 3791 Pnt 3100 3804 Pnt 3004 3804 Pnt 2796 3804 Pnt 3357 3812 Pnt 3904 3797 Pnt 2721 3806 Pnt 3345 3759 Pnt 4072 3771 Pnt 2150 3788 Pnt 2735 3799 Pnt 4284 3764 Pnt 1984 3798 Pnt 2141 3810 Pnt 3212 3799 Pnt 3055 3752 Pnt 3774 3782 Pnt 2422 3763 Pnt 3191 3778 Pnt 2153 3801 Pnt 3903 3038 Pnt 3191 3778 Pnt 2717 3797 Pnt 3627 3806 Pnt 2595 3786 Pnt 3122 3754 Pnt 2828 3856 Pnt 2676 3797 Pnt 3000 3809 Pnt 2734 3822 Pnt 2533 3758 Pnt 2231 3764 Pnt 2731 3792 Pnt 2642 3780 Pnt 3056 3839 Pnt 3315 3766 Pnt 2834 3768 Pnt 2677 3810 Pnt 2459 3766 Pnt 2833 3819 Pnt 4018 3756 Pnt 4180 3790 Pnt 1833 3790 Pnt 3009 3835 Pnt 3008 3806 Pnt 2819 3790 Pnt 2981 3777 Pnt 3052 3782 Pnt 3482 3770 Pnt 3240 3950 Pnt 2960 3777 Pnt 2936 3780 Pnt 2477 3848 Pnt 3398 3793 Pnt 1954 3812 Pnt 3375 3770 Pnt 2438 3782 Pnt 2184 3931 Pnt 2749 3858 Pnt 2463 3800 Pnt 2621 3820 Pnt 4069 2951 Pnt 3482 3800 Pnt 2394 3784 Pnt 2852 3775 Pnt 2652 3872 Pnt 2152 3754 Pnt 2916 3755 Pnt 3193 3749 Pnt 2738 3758 Pnt 3267 3783 Pnt 3043 3793 Pnt 2271 3824 Pnt 2020 3772 Pnt 2316 3828 Pnt 3235 3782 Pnt 3407 3753 Pnt 2893 3766 Pnt 3267 3769 Pnt 2476 3803 Pnt 2752 3751 Pnt 4410 3827 Pnt 2964 3836 Pnt 2872 3833 Pnt 2597 3777 Pnt 3750 3786 Pnt 2743 3773 Pnt 2594 3790 Pnt 2909 3787 Pnt 2567 3792 Pnt 2363 3820 Pnt 4028 3761 Pnt 1959 3835 Pnt 3154 3792 Pnt 2183 3763 Pnt 2809 3802 Pnt 2321 3812 Pnt 2117 3870 Pnt 2983 3858 Pnt 3309 3858 Pnt 2660 3826 Pnt 4004 3800 Pnt 3203 3774 Pnt 2691 3816 Pnt 2647 3760 Pnt 2842 3786 Pnt 3886 3798 Pnt 2931 3817 Pnt 4516 3805 Pnt 3192 3817 Pnt 2289 3774 Pnt 3293 3792 Pnt 2833 3776 Pnt 2227 3815 Pnt 2920 3762 Pnt 2706 3868 Pnt 4069 3777 Pnt 2491 3750 Pnt 2719 3781 Pnt 4019 3799 Pnt 2334 3808 Pnt 3034 3773 Pnt 2066 3814 Pnt 4093 3808 Pnt 2075 3825 Pnt 2144 3804 Pnt 3365 3759 Pnt 3077 3777 Pnt 2718 3786 Pnt 2095 3767 Pnt 3103 3758 Pnt 4274 3771 Pnt 2382 3786 Pnt 2880 3803 Pnt 2595 3815 Pnt 3094 3820 Pnt 2037 3797 Pnt 2814 3779 Pnt 2532 3826 Pnt 3487 3820 Pnt 2427 3826 Pnt 4046 3753 Pnt 2356 3790 Pnt 2099 3871 Pnt 4408 3803 Pnt 3064 3871 Pnt 2935 3800 Pnt 2583 3770 Pnt 2890 3755 Pnt 2161 3811 Pnt 2894 3761 Pnt 2561 3752 Pnt 3496 3817 Pnt 1906 3807 Pnt 1965 3753 Pnt 2501 3798 Pnt 1877 3826 Pnt 3079 3833 Pnt 4117 3761 Pnt 1916 3810 Pnt 2127 3824 Pnt 2844 3757 Pnt 2917 3760 Pnt 2753 3762 Pnt 2814 3827 Pnt 2331 3777 Pnt 2599 3777 Pnt 2350 3762 Pnt 2000 3808 Pnt 2959 3791 Pnt 2519 3813 Pnt 2379 3755 Pnt 2565 3787 Pnt 3317 3791 Pnt 2999 3753 Pnt 2185 3821 Pnt 2653 3800 Pnt 3482 3800 Pnt 2496 3821 Pnt 2939 3787 Pnt 2908 3800 Pnt 3190 3825 Pnt 3656 3773 Pnt 3037 3825 Pnt 2869 3767 Pnt 3324 3822 Pnt 2790 3768 Pnt 2611 3830 Pnt 3050 3779 Pnt 2242 3756 Pnt 2745 3755 Pnt 2533 3797 Pnt 3774 3825 Pnt 2811 3770 Pnt 2721 3760 Pnt 3331 3817 Pnt 2758 3803 Pnt 3275 3817 Pnt 3717 3759 Pnt 2859 3801 Pnt 2673 3822 Pnt 3266 3800 Pnt 2652 3799 Pnt 3388 3766 Pnt 3065 3826 Pnt 2801 3760 Pnt 1907 3791 Pnt 2795 3770 Pnt 3264 3781 Pnt 3433 3756 Pnt 2915 3792 Pnt 2638 3813 Pnt 3194 3778 Pnt 3497 3770 Pnt 3469 3792 Pnt 2606 3883 Pnt 3159 3801 Pnt 2642 3933 Pnt 2444 3771 Pnt 3439 3883 Pnt 2679 3775 Pnt 3126 3770 Pnt 2158 3827 Pnt 3101 3784 Pnt 2505 3773 Pnt 2624 3807 Pnt 2340 3805 Pnt 2967 3812 Pnt 2468 3779 Pnt 3058 3813 Pnt 3291 3832 Pnt 3057 3804 Pnt 2839 3805 Pnt 3016 3748 Pnt 3279 3779 Pnt 2870 3825 Pnt 2588 3768 Pnt 2574 3792 Pnt 3303 3768 Pnt 2528 3904 Pnt 2863 3759 Pnt 2316 3823 Pnt 2343 3784 Pnt 2123 3898 Pnt 2313 3797 Pnt 2615 3845 Pnt 2338 3767 Pnt 2782 3774 Pnt 2557 3818 Pnt 3684 3774 Pnt 3106 3805 Pnt 2836 3776 Pnt 2498 3757 Pnt 3710 3805 Pnt 3085 3778 Pnt 2390 3759 Pnt 2349 3811 Pnt 2573 3794 Pnt 1889 3891 Pnt 2808 3795 Pnt 3800 3749 Pnt 2068 3812 Pnt 2819 3821 Pnt 2782 3864 Pnt 3303 3781 Pnt 4072 3778 Pnt 2961 3810 Pnt 2538 3830 Pnt 2088 3898 Pnt 3195 3777 Pnt 3147 3801 Pnt 2450 3790 Pnt 2817 3753 Pnt 2446 3802 Pnt 2806 3764 Pnt 2951 3793 Pnt 2791 3813 Pnt 2129 3855 Pnt 2043 3798 Pnt 2562 3766 Pnt 3284 3853 Pnt 2498 3821 Pnt 2856 3758 Pnt 2009 3914 Pnt 2972 3855 Pnt 2988 3758 Pnt 2879 3790 Pnt 2580 3810 Pnt 2371 3810 Pnt 2942 3828 Pnt 2907 3763 Pnt 2343 3804 Pnt 3445 3828 Pnt 4108 3750 Pnt 3343 3765 Pnt 2427 3787 Pnt 1980 3835 Pnt 2041 3765 Pnt 2913 3783 Pnt 2969 3835 Pnt 2702 3758 Pnt 2477 3795 Pnt 2263 3794 Pnt 2635 3798 Pnt 2664 3781 Pnt 4273 3795 Pnt 2996 3829 Pnt 2541 3773 Pnt 2612 3818 Pnt 2383 3769 Pnt 2942 3771 Pnt 2401 3814 Pnt 2650 3768 Pnt 3128 3768 Pnt 3802 3771 Pnt 2591 3748 Pnt 2255 3815 Pnt 3312 3809 Pnt 3004 3788 Pnt 2571 3777 Pnt 3148 3767 Pnt 2750 3806 Pnt 2624 3805 Pnt 2539 3809 Pnt 2829 3811 Pnt 3980 3752 Pnt 2799 3777 Pnt 3376 3788 Pnt 2728 3764 Pnt 3661 2916 Pnt 3445 3785 Pnt 2827 3771 Pnt 2416 3788 Pnt 2605 3794 Pnt 2792 3825 Pnt 2780 3766 Pnt 2838 3766 Pnt 3136 3786 Pnt 2812 3804 Pnt 3174 3791 Pnt 2481 3779 Pnt 3063 3801 Pnt 2556 3858 Pnt 2268 3771 Pnt 2611 3782 Pnt 2347 3824 Pnt 3275 3801 Pnt 2917 3826 Pnt 2706 3763 Pnt 3308 3763 Pnt 2582 3847 Pnt 3167 3809 Pnt 2885 3780 Pnt 3118 3809 Pnt 2922 3822 Pnt 2806 3810 Pnt 2818 3808 Pnt 3518 3780 Pnt 4353 3771 Pnt 3018 3772 Pnt 2682 3808 Pnt 3093 3749 Pnt 2055 3833 Pnt 3108 3811 Pnt 3869 3770 Pnt 2531 3839 Pnt 2590 3814 Pnt 2574 3772 Pnt 2950 3793 Pnt 2390 3803 Pnt 2240 3810 Pnt 3169 3824 Pnt 2591 3800 Pnt 2897 3748 Pnt 3074 3805 Pnt 4556 3800 Pnt 3119 3749 Pnt 2913 3775 Pnt 2664 3766 Pnt 3158 3810 Pnt 2571 3797 Pnt 3069 3775 Pnt 2363 3789 Pnt 4032 3754 Pnt 2880 3772 Pnt 2034 3826 Pnt 2310 3802 Pnt 2736 3828 Pnt 3302 2901 Pnt 3901 3749 Pnt 2740 3771 Pnt 2265 3816 Pnt 2725 3776 Pnt 2507 3819 Pnt 2623 3859 Pnt 2664 3796 Pnt 3190 3850 Pnt 1987 3796 Pnt 2930 3818 Pnt 2517 3862 Pnt 2649 3776 Pnt 2253 3943 Pnt 2111 3847 Pnt 3239 3764 Pnt 3046 3812 Pnt 4266 3771 Pnt 2429 3775 Pnt 3307 3789 Pnt 2841 3801 Pnt 2360 3754 Pnt 3209 3784 Pnt 2802 3841 Pnt 3415 3844 Pnt 2453 3749 Pnt 2410 3830 Pnt 3757 3794 Pnt 2518 3789 Pnt 2476 3792 Pnt 3467 3830 Pnt 3108 3753 Pnt 2209 3822 Pnt 2852 3773 Pnt 2441 3809 Pnt 2600 3832 Pnt 2044 3842 Pnt 3496 3773 Pnt 2534 3911 Pnt 3961 3857 Pnt 2785 3765 Pnt 2012 3911 Pnt 2703 3767 Pnt 3161 2824 Pnt 2002 3793 Pnt 4265 3760 Pnt 2905 3780 Pnt 2310 3767 Pnt 3011 3850 Pnt 2037 3781 Pnt 2827 3796 Pnt 2169 3821 Pnt 2989 3772 Pnt 2953 3778 Pnt 3402 3778 Pnt 2714 3764 Pnt 2320 3784 Pnt 3037 3816 Pnt 4357 3784 Pnt 2320 3926 Pnt 2553 3779 Pnt 3310 3867 Pnt 2354 3759 Pnt 2186 3747 Pnt 3452 3867 Pnt 2898 3766 Pnt 3230 3747 Pnt 2162 3853 Pnt 3476 3766 Pnt 3174 3762 Pnt 3146 3812 Pnt 2712 3780 Pnt 4414 3764 Pnt 2353 3817 Pnt 4121 3771 Pnt 2713 3834 Pnt 2427 3803 Pnt 3105 3786 Pnt 1967 3755 Pnt 3487 3834 Pnt 2700 3821 Pnt 2981 3787 Pnt 2807 3786 Pnt 2176 3763 Pnt 2504 3818 Pnt 2977 3785 Pnt 2726 3750 Pnt 3866 3762 Pnt 2130 3780 Pnt 2963 3762 Pnt 3194 3829 Pnt 2747 3780 Pnt 2782 3835 Pnt 2707 3797 Pnt 2403 3841 Pnt 3225 3745 Pnt 2330 3786 Pnt 2783 3833 Pnt 2765 3794 Pnt 2981 3767 Pnt 2485 3801 Pnt 2864 3794 Pnt 2573 3796 Pnt 2688 3772 Pnt 2722 3777 Pnt 2018 3823 Pnt 2632 3824 Pnt 2655 3795 Pnt 2913 3782 Pnt 3811 3824 Pnt 2403 3775 Pnt 2014 3872 Pnt 2767 3773 Pnt 3268 3754 Pnt 2866 3753 Pnt 2916 3754 Pnt 2689 3819 Pnt 3109 3771 Pnt 2282 3836 Pnt 2680 3753 Pnt 4250 3772 Pnt 1969 3809 Pnt 2522 3805 Pnt 3652 3836 Pnt 2886 3806 Pnt 2704 3798 Pnt 2650 3804 Pnt 2203 3753 Pnt 4467 3776 Pnt 2981 3806 Pnt 2813 3808 Pnt 2534 3753 Pnt 3217 3809 Pnt 3053 3787 Pnt 2594 3922 Pnt 2991 3783 Pnt 1957 3794 Pnt 2800 3789 Pnt 2851 3765 Pnt 2648 3769 Pnt 3429 3784 Pnt 3269 3846 Pnt 3528 3789 Pnt 3154 3774 Pnt 2802 3822 Pnt 2463 3784 Pnt 2355 3809 Pnt 2666 3803 Pnt 2878 3753 Pnt 4119 3784 Pnt 3210 3769 Pnt 3776 3760 Pnt 2914 3772 Pnt 3154 3784 Pnt 2958 3782 Pnt 4040 3782 Pnt 3627 2853 Pnt 2456 3763 Pnt 2671 3763 Pnt 2976 3798 Pnt 3429 3756 Pnt 4037 2884 Pnt 2915 3754 Pnt 4026 3798 Pnt 2242 3765 Pnt 2762 3773 Pnt 2629 3801 Pnt 2557 3774 Pnt 2587 3799 Pnt 4055 3847 Pnt 1961 3810 Pnt 2852 3797 Pnt 2380 3755 Pnt 3953 3748 Pnt 2425 3793 Pnt 2397 3792 Pnt 2946 3786 Pnt 1862 3822 Pnt 3001 3786 Pnt 3174 3824 Pnt 4104 3781 Pnt 2764 3797 Pnt 3764 3791 Pnt 2695 3765 Pnt 2604 3785 Pnt 2404 3788 Pnt 3230 2730 Pnt 2280 3850 Pnt 2766 3870 Pnt 2720 3881 Pnt 2380 3804 Pnt 3357 3765 Pnt 2343 3838 Pnt 2506 3815 Pnt 3274 3790 Pnt 2056 3828 Pnt 3282 3757 Pnt 3645 3828 Pnt 2227 3782 Pnt 2956 3762 Pnt 3184 3801 Pnt 2620 3762 Pnt 3604 3796 Pnt 2719 3780 Pnt 2693 3820 Pnt 2362 3812 Pnt 4280 3764 Pnt 2856 3806 Pnt 3874 3780 Pnt 3075 3806 Pnt 3801 3812 Pnt 2476 3759 Pnt 2551 3805 Pnt 1958 3843 Pnt 1972 3801 Pnt 2439 3759 Pnt 2364 3859 Pnt 3796 2917 Pnt 2382 3784 Pnt 2755 3810 Pnt 3334 3859 Pnt 2608 3770 Pnt 3736 3764 Pnt 3590 3786 Pnt 2922 3812 Pnt 2121 3858 Pnt 2854 3768 Pnt 2017 3758 Pnt 2340 3784 Pnt 2438 3755 Pnt 2492 3848 Pnt 2334 3846 Pnt 2966 3784 Pnt 2252 3826 Pnt 3306 3767 Pnt 3701 3803 Pnt 2873 3837 Pnt 2607 3738 Pnt 2617 3805 Pnt 2369 3796 Pnt 1952 3772 Pnt 1948 3780 Pnt 3607 3789 Pnt 2689 3832 Pnt 2570 3791 Pnt 2807 3748 Pnt 2966 3791 Pnt 1752 3790 Pnt 2739 3786 Pnt 3623 3762 Pnt 2563 3764 Pnt 2889 3791 Pnt 3477 3786 Pnt 2444 3790 Pnt 3476 3788 Pnt 2803 3839 Pnt 3780 3831 Pnt 2186 3792 Pnt 1977 3803 Pnt 3010 3826 Pnt 2439 3789 Pnt 2649 3823 Pnt 2546 3808 Pnt 3616 3780 Pnt 2849 3817 Pnt 2666 3758 Pnt 1948 3835 Pnt 2618 3810 Pnt 2603 3770 Pnt 2572 3828 Pnt 2868 3846 Pnt 2884 3846 Pnt 2500 3851 Pnt 3369 3788 Pnt 3650 3773 Pnt 2136 3783 Pnt 2041 3806 Pnt 2448 3808 Pnt 2731 3872 Pnt 3310 3774 Pnt 2453 3872 Pnt 3183 3771 Pnt 2944 3757 Pnt 2707 3806 Pnt 2716 3775 Pnt 2710 3821 Pnt 4220 3760 Pnt 3070 2951 Pnt 2578 3784 Pnt 3471 3805 Pnt 2499 3809 Pnt 2478 3758 Pnt 3462 3784 Pnt 2281 3772 Pnt 2358 3789 Pnt 2774 3815 Pnt 3654 3768 Pnt 3950 3758 Pnt 3460 3775 Pnt 2319 3936 Pnt 2857 3793 Pnt 2859 3753 Pnt 2503 3776 Pnt 2457 3745 Pnt 2226 3810 Pnt 1945 3831 Pnt 4009 3757 Pnt 2915 3810 Pnt 2167 3901 Pnt 2295 3827 Pnt 3199 3757 Pnt 2536 3791 Pnt 3509 3756 Pnt 3714 3800 Pnt 2513 3804 Pnt 2466 3798 Pnt 2366 3783 Pnt 2231 3762 Pnt 2769 3763 Pnt 1995 3810 Pnt 2525 3761 Pnt 3828 3743 Pnt 3175 3762 Pnt 2867 3752 Pnt 2404 3815 Pnt 2070 3765 Pnt 2570 3755 Pnt 2436 3772 Pnt 2876 3772 Pnt 2429 3774 Pnt 2755 3779 Pnt 2310 3798 Pnt 2407 3774 Pnt 3223 3820 Pnt 2228 3788 Pnt 2741 3779 Pnt 3055 3783 Pnt 2868 3813 Pnt 2375 3792 Pnt 2915 3760 Pnt 2028 3871 Pnt 2806 3785 Pnt 3078 3803 Pnt 2740 3786 Pnt 2628 3753 Pnt 3157 3769 Pnt 4063 3777 Pnt 2825 3786 Pnt 3111 3763 Pnt 3355 3773 Pnt 2109 3767 Pnt 2874 3778 Pnt 3016 3787 Pnt 2786 3759 Pnt 2695 3812 Pnt 3364 3790 Pnt 3165 3785 Pnt 2427 3753 Pnt 2060 3839 Pnt 3018 3812 Pnt 2856 3764 Pnt 2904 3762 Pnt 2807 3841 Pnt 2296 3767 Pnt 3072 3808 Pnt 3803 3764 Pnt 3053 3812 Pnt 2919 3782 Pnt 2142 3812 Pnt 2574 3767 Pnt 2874 2822 Pnt 2505 3755 Pnt 2633 3768 Pnt 2978 3791 Pnt 2452 3751 Pnt 2971 3763 Pnt 2745 3826 Pnt 2350 3760 Pnt 2557 3815 Pnt 2107 3821 Pnt 2211 3811 Pnt 3258 3760 Pnt 2875 3752 Pnt 1763 3807 Pnt 2938 3783 Pnt 3679 3763 Pnt 3405 3756 Pnt 3375 3788 Pnt 2274 3802 Pnt 3172 3766 Pnt 2546 3803 Pnt 2476 3753 Pnt 2531 3789 Pnt 2878 3814 Pnt 2609 3803 Pnt 2371 3796 Pnt 3453 3757 Pnt 3035 3768 Pnt 2823 3754 Pnt 1992 3820 Pnt 2931 3781 Pnt 2900 3810 Pnt 2519 3765 Pnt 3287 3826 Pnt 3515 3830 Pnt 2823 3771 Pnt 2627 3760 Pnt 2839 3756 Pnt 2613 3813 Pnt 1974 3804 Pnt 3016 3773 Pnt 4137 3756 Pnt 2679 3752 Pnt 3040 3807 Pnt 2533 3937 Pnt 2937 3800 Pnt 2532 3771 Pnt 2722 3770 Pnt 4260 3752 Pnt 2929 3765 Pnt 3061 3809 Pnt 2017 3866 Pnt 2794 3747 Pnt 3207 3770 Pnt 2574 3800 Pnt 3681 3754 Pnt 1844 3757 Pnt 2268 3790 Pnt 2504 3792 Pnt 2243 3832 Pnt 2786 3762 Pnt 2667 3768 Pnt 2601 3795 Pnt 2464 3809 Pnt 2123 3759 Pnt 2730 3830 Pnt 2599 3809 Pnt 2142 3779 Pnt 2508 3830 Pnt 3647 3778 Pnt 2427 3814 Pnt 2538 3825 Pnt 3292 3813 Pnt 2696 3770 Pnt 2561 3775 Pnt 2648 3809 Pnt 3263 3759 Pnt 2562 3819 Pnt 2652 3810 Pnt 2649 3793 Pnt 2923 3776 Pnt 4275 3759 Pnt 3522 3776 Pnt 2010 3898 Pnt 3331 3754 Pnt 2309 3809 Pnt 2337 3790 Pnt 2428 3853 Pnt 3073 3800 Pnt 2630 3812 Pnt 2530 3821 Pnt 3705 3804 Pnt 4014 3853 Pnt 2675 3758 Pnt 2734 3792 Pnt 2980 3758 Pnt 1975 3914 Pnt 2274 3838 Pnt 3130 3758 Pnt 2119 3788 Pnt 2813 3819 Pnt 2418 3779 Pnt 3193 3763 Pnt 3824 3754 Pnt 2445 3798 Pnt 2787 3794 Pnt 2911 3828 Pnt 2821 3781 Pnt 2424 3844 Pnt 3233 3765 Pnt 3129 3787 Pnt 2869 3796 Pnt 2538 3763 Pnt 4142 3807 Pnt 3083 3768 Pnt 3479 3763 Pnt 2962 3794 Pnt 2919 3763 Pnt 3530 3763 Pnt 2704 3814 Pnt 3216 3761 Pnt 2625 3761 Pnt 2829 3761 Pnt 3372 3766 Pnt 2914 3768 Pnt 2849 3812 Pnt 2468 3763 Pnt 3464 3766 Pnt 2813 3813 Pnt 3009 3809 Pnt 2112 3807 Pnt 3428 3782 Pnt 2660 3807 Pnt 3352 3791 Pnt 2285 3771 Pnt 3763 3809 Pnt 2165 3826 Pnt 2196 3777 Pnt 3222 3772 Pnt 3505 3779 Pnt 3391 3779 Pnt 2642 3950 Pnt 3335 3781 Pnt 2810 3797 Pnt 4265 3767 Pnt 1908 3891 Pnt 3191 3816 Pnt 2952 3794 Pnt 3485 3028 Pnt 3307 3780 Pnt 3808 3794 Pnt 2740 3755 Pnt 2670 3847 Pnt 2333 3778 Pnt 2839 3754 Pnt 2843 3759 Pnt 2947 3809 Pnt 2492 3931 Pnt 2862 3817 Pnt 2717 3802 Pnt 2378 3800 Pnt 3405 3817 Pnt 2468 3799 Pnt 2456 3808 Pnt 3490 3814 Pnt 3431 3820 Pnt 2225 3808 Pnt 3433 3756 Pnt 2893 3749 Pnt 2757 3835 Pnt 2616 3825 Pnt 2515 3811 Pnt 2515 3777 Pnt 2754 3784 Pnt 2961 3814 Pnt 2996 3792 Pnt 3267 3792 Pnt 2904 3787 Pnt 4100 3814 Pnt 2408 3823 Pnt 3130 3787 Pnt 2388 3776 Pnt 3296 3805 Pnt 2742 3800 Pnt 2148 3823 Pnt 4652 3782 Pnt 3473 3800 Pnt 2205 3898 Pnt 4214 3761 Pnt 3274 3035 Pnt 4068 3751 Pnt 3048 3818 Pnt 1980 3785 Pnt 2899 3845 Pnt 2778 3869 Pnt 3909 3846 Pnt 2805 3766 Pnt 3245 3782 Pnt 2608 3793 Pnt 2391 3818 Pnt 2886 3775 Pnt 2209 3818 Pnt 2848 3830 Pnt 2885 3797 Pnt 2933 3764 Pnt 3833 3830 Pnt 2097 3857 Pnt 2888 3753 Pnt 3125 3763 Pnt 2170 3810 Pnt 2189 3802 Pnt 1951 3793 Pnt 2634 3816 Pnt 4319 3800 Pnt 2726 3813 Pnt 3737 3816 Pnt 2104 3753 Pnt 3068 3800 Pnt 2332 3796 Pnt 2083 3800 Pnt 2756 3773 Pnt 2080 3811 Pnt 3597 3806 Pnt 2260 3823 Pnt 2481 3842 Pnt 2257 3832 Pnt 3258 3809 Pnt 2971 3777 Pnt 3055 3823 Pnt 2400 3764 Pnt 2633 3764 Pnt 3155 3812 Pnt 3380 3812 Pnt 3417 3857 Pnt 2971 3775 Pnt 3390 3839 Pnt 2590 3904 Pnt 1933 3835 Pnt 2299 3830 Pnt 4580 3833 Pnt 2353 3765 Pnt 2858 3787 Pnt 2770 3773 Pnt 2306 3829 Pnt 2992 3791 Pnt 3076 3791 Pnt 2844 3817 Pnt 3020 3772 Pnt 2314 3758 Pnt 3877 3773 Pnt 2926 3821 Pnt 2813 3759 Pnt 3550 3760 Pnt 2275 3779 Pnt 2633 3813 Pnt 2524 3868 Pnt 2731 3853 Pnt 4365 3771 Pnt 3841 3868 Pnt 2663 3750 Pnt 3051 3777 Pnt 4046 3095 Pnt 2827 3798 Pnt 2627 3781 Pnt 2335 3804 Pnt 2046 3809 Pnt 3519 3781 Pnt 2559 3773 Pnt 3022 3786 Pnt 4011 3750 Pnt 3548 3774 Pnt 2621 3818 Pnt 3754 3772 Pnt 2008 3814 Pnt 3051 3805 Pnt 2268 3794 Pnt 2738 3818 Pnt 2393 3753 Pnt 2692 3780 Pnt 2027 3825 Pnt 2829 3810 Pnt 2743 3797 Pnt 4335 3753 Pnt 2872 3809 Pnt 2618 3779 Pnt 3445 3777 Pnt 2510 3779 Pnt 2915 3804 Pnt 2578 3835 Pnt 3456 3794 Pnt 2868 3762 Pnt 3244 3783 Pnt 2869 3770 Pnt 2253 3783 Pnt 2713 3790 Pnt 3066 3794 Pnt 2644 3810 Pnt 1948 3796 Pnt 2823 3793 Pnt 2402 3815 Pnt 2802 3802 Pnt 2672 3798 Pnt 2267 3838 Pnt 2373 3795 Pnt 2394 3870 Pnt 2847 3838 Pnt 2300 3943 Pnt 2779 3782 Pnt 2162 3819 Pnt 2878 3754 Pnt 2631 3803 Pnt 3166 3789 Pnt 2690 3798 Pnt 3355 3753 Pnt 2539 3789 Pnt 2347 3781 Pnt 2317 3805 Pnt 2670 3760 Pnt 2601 3753 Pnt 2709 3784 Pnt 2566 3782 Pnt 2476 3765 Pnt 2641 3764 Pnt 2792 3799 Pnt 3138 3847 Pnt 2994 3799 Pnt 2778 3763 Pnt 4415 3783 Pnt 2608 3776 Pnt 3173 3847 Pnt 2428 3753 Pnt 1909 3780 Pnt 4066 3806 Pnt 4635 3824 Pnt 3108 3814 Pnt 4227 3777 Pnt 2453 3803 Pnt 2625 3834 Pnt 2970 3798 Pnt 2395 3805 Pnt 2599 3782 Pnt 4201 3784 Pnt 1990 3826 Pnt 3920 3787 Pnt 2594 3776 Pnt 3904 3776 Pnt 1937 3922 Pnt 2532 3776 Pnt 2839 3808 Pnt 2260 3824 Pnt 3119 3809 Pnt 2915 3765 Pnt 2351 3795 Pnt 3304 3828 Pnt 2803 3754 Pnt 3679 3742 Pnt 2795 3786 Pnt 3884 3750 Pnt 3962 2859 Pnt 2841 3799 Pnt 2475 3838 Pnt 3023 2907 Pnt 2696 3835 Pnt 3664 3763 Pnt 2517 3811 Pnt 2274 3781 Pnt 2786 3765 Pnt 2551 3797 Pnt 2765 3822 Pnt 2382 3793 Pnt 2343 3812 Pnt 2767 3755 Pnt 2407 3796 Pnt 4119 3754 Pnt 3541 3791 Pnt 2484 3748 Pnt 4268 3781 Pnt 4058 2898 Pnt 4023 3756 Pnt 2500 3803 Pnt 2736 3788 Pnt 2787 3790 Pnt 3112 2845 Pnt 2179 3801 Pnt 3284 3784 Pnt 2791 3790 Pnt 3306 3017 Pnt 3161 3784 Pnt 2350 3858 Pnt 2991 3780 Pnt 3606 3786 Pnt 2762 3806 Pnt 3398 3800 Pnt 2655 3847 Pnt 1986 3759 Pnt 1980 3843 Pnt 3200 3806 Pnt 3211 3768 Pnt 2282 3784 Pnt 2421 3795 Pnt 2119 3804 Pnt 3227 3781 Pnt 3138 3768 Pnt 3095 3858 Pnt 3889 3800 Pnt 2328 3799 Pnt 3891 3758 Pnt 4307 3800 Pnt 3069 3765 Pnt 4384 3781 Pnt 4525 3798 Pnt 2636 3826 Pnt 2240 3784 Pnt 2613 3769 Pnt 2845 3779 Pnt 2469 3806 Pnt 1908 3831 Pnt 3507 3844 Pnt 2787 3803 Pnt 3160 3846 Pnt 2765 3835 Pnt 1875 3776 Pnt 2954 3774 Pnt 2157 3800 Pnt 2617 3759 Pnt 2245 3753 Pnt 2091 3792 Pnt 3428 3846 Pnt 2699 3802 Pnt 2350 3785 Pnt 3217 3783 Pnt 2040 3804 Pnt 2725 3786 Pnt 2830 3773 Pnt 2762 3778 Pnt 2636 3872 Pnt 2037 3765 Pnt 4086 3773 Pnt 2883 3810 Pnt 3884 3761 Pnt 2204 3790 Pnt 2943 2970 Pnt 2671 3761 Pnt 3047 3768 Pnt 3153 3834 Pnt 2854 3815 Pnt 2492 3828 Pnt 3598 3771 Pnt 2725 3773 Pnt 2420 3801 Pnt 2451 3803 Pnt 2585 3809 Pnt 2412 3851 Pnt 3909 3773 Pnt 3172 3813 Pnt 2657 3758 Pnt 2576 3788 Pnt 3098 2797 Pnt 2516 3753 Pnt 4215 3851 Pnt 3841 3798 Pnt 4077 3808 Pnt 2881 3776 Pnt 3483 3752 Pnt 2885 3804 Pnt 3347 3779 Pnt 2760 3911 Pnt 2588 3787 Pnt 3085 3804 Pnt 3331 3800 Pnt 2438 3810 Pnt 2453 3792 Pnt 2056 3831 Pnt 2861 3776 Pnt 2224 3765 Pnt 1964 3902 Pnt 3053 3779 Pnt 2665 3757 Pnt 2808 3778 Pnt 2007 3805 Pnt 3262 3757 Pnt 2106 3827 Pnt 3775 3808 Pnt 3174 3746 Pnt 2623 3774 Pnt 4389 3779 Pnt 2900 3787 Pnt 3004 3738 Pnt 2600 3767 Pnt 2560 3937 Pnt 3335 3778 Pnt 3009 3757 Pnt 4193 3763 Pnt 2741 3772 Pnt 2376 3864 Pnt 3337 3937 Pnt 3632 3753 Pnt 2359 3812 Pnt 2279 3761 Pnt 3518 3774 Pnt 1831 3821 Pnt 3179 3812 Pnt 3771 3772 Pnt 2667 3759 Pnt 2451 3772 Pnt 3778 3793 Pnt 2168 3780 Pnt 3778 3828 Pnt 2526 3763 Pnt 3910 3771 Pnt 2850 3778 Pnt 3050 3759 Pnt 2411 3859 Pnt 2013 3839 Pnt 2772 3859 Pnt 2596 3756 Pnt 2495 3810 Pnt 2098 3816 Pnt 2437 3926 Pnt 3684 3780 Pnt 2935 3764 Pnt 2733 3802 Pnt 3676 3756 Pnt 3715 3762 Pnt 2901 3802 Pnt 3138 3758 Pnt 2520 3803 Pnt 4171 3758 Pnt 2193 3853 Pnt 1996 3747 Pnt 2968 3766 Pnt 3621 2908 Pnt 2450 3748 Pnt 3209 3817 Pnt 1961 3767 Pnt 3189 3818 Pnt 3357 3751 Pnt 2419 3787 Pnt 4085 3753 Pnt 2130 3750 Pnt 3281 3770 Pnt 2869 3830 Pnt 2658 3826 Pnt 2810 3804 Pnt 4057 3800 Pnt 2470 3763 Pnt 2947 3767 Pnt 2421 3814 Pnt 2182 3799 Pnt 2315 3760 Pnt 1895 3819 Pnt 4049 3785 Pnt 3088 3814 Pnt 2321 3770 Pnt 2729 3811 Pnt 3524 3785 Pnt 3074 3819 Pnt 3035 3813 Pnt 2787 3795 Pnt 2934 3774 Pnt 2695 3791 Pnt 3150 3791 Pnt 3308 3796 Pnt 3047 3782 Pnt 2907 3828 Pnt 2710 3792 Pnt 2679 3825 Pnt 2442 3841 Pnt 2456 3782 Pnt 2178 3801 Pnt 3372 3826 Pnt 2707 3819 Pnt 2579 3762 Pnt 3321 3826 Pnt 2238 3771 Pnt 2624 3771 Pnt 4151 3774 Pnt 4083 3756 Pnt 2056 3761 Pnt 2691 3770 Pnt 1976 3779 Pnt 4184 3819 Pnt 2400 3794 Pnt 2787 3804 Pnt 2764 3779 Pnt 1935 3779 Pnt 3534 3778 Pnt 2566 3858 Pnt 2339 3788 Pnt 3399 3783 Pnt 2979 3828 Pnt 2048 3823 Pnt 2561 3826 Pnt 2373 3812 Pnt 2261 3809 Pnt 3051 3812 Pnt 3530 3826 Pnt 3352 3807 Pnt 1956 3778 Pnt 3023 3831 Pnt 3926 3791 Pnt 2991 3773 Pnt 2020 3760 Pnt 3865 3807 Pnt 2588 3839 Pnt 2373 3804 Pnt 3762 3839 Pnt 2898 3764 Pnt 2391 3772 Pnt 2419 3823 Pnt 3180 3796 Pnt 4305 3794 Pnt 2844 3796 Pnt 2557 3811 Pnt 1981 3763 Pnt 2181 3836 Pnt 2895 3791 Pnt 3236 3811 Pnt 3965 3780 Pnt 2954 3804 Pnt 2254 3801 Pnt 2975 3775 Pnt 2775 3762 Pnt 2771 3814 Pnt 2582 3797 Pnt 2780 3763 Pnt 3518 3806 Pnt 2940 3828 Pnt 2882 3761 Pnt 2879 3789 Pnt 4128 3754 Pnt 3844 3806 Pnt 3348 3789 Pnt 3092 3768 Pnt 3232 3784 Pnt 2165 3807 Pnt 3538 3788 Pnt 4283 3823 Pnt 3657 3807 Pnt 2275 3822 Pnt 2099 3791 Pnt 2748 3807 Pnt 2865 3784 Pnt 2508 3793 Pnt 2959 3771 Pnt 2591 3852 Pnt 3081 3769 Pnt 2520 3784 Pnt 3484 3773 Pnt 3796 3781 Pnt 2883 3775 Pnt 4205 3774 Pnt 2589 3764 Pnt 2693 3803 Pnt 2269 3898 Pnt 4312 3796 Pnt 3211 3901 Pnt 2824 3777 Pnt 2549 3794 Pnt 3048 3808 Pnt 4368 3775 Pnt 3044 3794 Pnt 2491 3798 Pnt 3010 3804 Pnt 3245 3792 Pnt 3973 3809 Pnt 3561 3817 Pnt 2713 3809 Pnt 4204 3800 Pnt 3774 3798 Pnt 2591 3756 Pnt 3321 3757 Pnt 2559 3823 Pnt 2017 3764 Pnt 2934 3825 Pnt 2503 3800 Pnt 2712 3854 Pnt 2129 3832 Pnt 3654 3805 Pnt 2496 3811 Pnt 1976 3798 Pnt 2123 3839 Pnt 1904 3809 Pnt 3617 3768 Pnt 2664 3870 Pnt 3055 3784 Pnt 3499 3761 Pnt 2776 3825 Pnt 3076 3904 Pnt 2867 3787 Pnt 2712 3846 Pnt 4230 3832 Pnt 2573 3793 Pnt 2582 3785 Pnt 2832 3750 Pnt 2792 3818 Pnt 2298 3881 Pnt 2614 3814 Pnt 2467 3801 Pnt 3303 3757 Pnt 2677 3773 Pnt 3915 3807 Pnt 2066 3828 Pnt 2996 3830 Pnt 2118 3845 Pnt 3878 3807 Pnt 1857 3757 Pnt 2935 3798 Pnt 2777 3761 Pnt 4005 3833 Pnt 2182 3802 Pnt 2124 3802 Pnt 1759 3789 Pnt 2842 3763 Pnt 2547 3751 Pnt 2385 3848 Pnt 3376 3782 Pnt 2847 3832 Pnt 2122 3769 Pnt 2789 3751 Pnt 3030 3762 Pnt 4206 3775 Pnt 2700 3818 Pnt 2263 3755 Pnt 3107 3772 Pnt 2763 3816 Pnt 2790 3811 Pnt 2661 3790 Pnt 2739 3749 Pnt 2707 3788 Pnt 2171 3796 Pnt 2495 3774 Pnt 2112 3846 Pnt 2744 3768 Pnt 2592 3846 Pnt 2284 3823 Pnt 3705 3846 Pnt 2790 3820 Pnt 3620 3791 Pnt 3179 3816 Pnt 2123 3790 Pnt 3054 3775 Pnt 2272 3792 Pnt 3428 3820 Pnt 3206 3773 Pnt 4097 3784 Pnt 2495 3809 Pnt 2470 3792 Pnt 2327 3838 Pnt 3209 3854 Pnt 2217 3870 Pnt 2397 3811 Pnt 2280 3812 Pnt 2521 3800 Pnt 2633 3805 Pnt 2369 3780 Pnt 3361 3811 Pnt 3704 3781 Pnt 3276 3804 Pnt 2613 3759 Pnt 2936 3758 Pnt 2514 3777 Pnt 3315 3870 Pnt 2434 3798 Pnt 3006 3832 Pnt 3344 3805 Pnt 2552 3794 Pnt 2262 3738 Pnt 3090 3758 Pnt 2439 3775 Pnt 3225 3742 Pnt 2625 3821 Pnt 2416 3753 Pnt 2898 3775 Pnt 2852 3787 Pnt 2775 3800 Pnt 2672 3837 Pnt 2558 3832 Pnt 1783 3790 Pnt 2792 3853 Pnt 3574 3786 Pnt 2981 3800 Pnt 2863 3837 Pnt 2032 3765 Pnt 2916 3848 Pnt 2077 3765 Pnt 2535 3791 Pnt 2658 3800 Pnt 2959 3812 Pnt 2758 3848 Pnt 2444 3764 Pnt 2719 3787 Pnt 2313 3768 Pnt 2712 3812 Pnt 2711 3775 Pnt 2794 3787 Pnt 2784 3792 Pnt 3343 3775 Pnt 2740 3820 Pnt 2562 3821 Pnt 3262 3792 Pnt 2843 3755 Pnt 3417 3763 Pnt 2632 3761 Pnt 2782 3774 Pnt 3341 3780 Pnt 2468 3779 Pnt 2640 3813 Pnt 2647 3777 Pnt 2454 3789 Pnt 2473 3826 Pnt 2125 3821 Pnt 3291 3755 Pnt 1938 3803 Pnt 2788 3755 Pnt 3822 3753 Pnt 2665 3775 Pnt 2398 3756 Pnt 2968 3777 Pnt 2105 3823 Pnt 2427 3822 Pnt 3196 3775 Pnt 2610 3936 Pnt 2315 3808 Pnt 2570 3772 Pnt 2435 3755 Pnt 3298 3782 Pnt 2601 3776 Pnt 3554 3798 Pnt 2999 3781 Pnt 2828 3817 Pnt 3866 3775 Pnt 3054 3950 Pnt 2898 3833 Pnt 2770 3810 Pnt 2114 3805 Pnt 2769 3838 Pnt 2676 3824 Pnt 3454 3824 Pnt 3098 3760 Pnt 3460 3800 Pnt 2767 3815 Pnt 4045 3755 Pnt 3614 3762 Pnt 3206 3788 Pnt 2978 3810 Pnt 2651 3799 Pnt 3925 3766 Pnt 2911 3799 Pnt 3172 3754 Pnt 2730 3777 Pnt 3022 2882 Pnt 2052 3791 Pnt 2330 3753 Pnt 2151 3759 Pnt 2169 3800 Pnt 2486 3800 Pnt 2668 3774 Pnt 2945 3777 Pnt 2544 3763 Pnt 2507 3866 Pnt 2383 3805 Pnt 2870 3866 Pnt 2742 3753 Pnt 3053 3764 Pnt 2678 3759 Pnt 2475 3753 Pnt 2728 3815 Pnt 2542 3792 Pnt 2552 3782 Pnt 3160 3782 Pnt 2141 3832 Pnt 2585 3762 Pnt 2986 3763 Pnt 2533 3768 Pnt 3496 3768 Pnt 2204 3803 Pnt 2704 3752 Pnt 3905 3793 Pnt 3405 3803 Pnt 3412 3798 Pnt 2544 3814 Pnt 2349 3814 Pnt 3398 3759 Pnt 2487 3793 Pnt 2574 3824 Pnt 2623 3813 Pnt 4505 3763 Pnt 3275 3813 Pnt 3070 3776 Pnt 2767 3784 Pnt 2604 3776 Pnt 4375 3760 Pnt 3638 3784 Pnt 3170 3779 Pnt 3130 3862 Pnt 3458 3794 Pnt 2378 3827 Pnt 4258 3755 Pnt 2596 3763 Pnt 2436 3869 Pnt 3275 3798 Pnt 2747 3766 Pnt 2541 3794 Pnt 3253 3796 Pnt 3370 3766 Pnt 4095 3765 Pnt 3138 3754 Pnt 3345 3766 Pnt 2909 3840 Pnt 3142 3754 Pnt 2896 3781 Pnt 3829 3767 Pnt 2601 3778 Pnt 1939 3891 Pnt 3316 3809 Pnt 2908 3768 Pnt 3254 3892 Pnt 2711 3759 Pnt 2768 3816 Pnt 2151 3761 Pnt 2624 3805 Pnt 2605 3808 Pnt 3271 3756 Pnt 3212 3794 Pnt 2918 3791 Pnt 2844 3932 Pnt 2399 3802 Pnt 4357 2914 Pnt 2424 3790 Pnt 3429 3085 Pnt 3628 3809 Pnt 2800 3801 Pnt 3448 3817 Pnt 2222 3779 Pnt 2915 3788 Pnt 2610 3824 Pnt 2277 3804 Pnt 2565 3797 Pnt 2690 3816 Pnt 2718 3784 Pnt 2419 3830 Pnt 4320 3770 Pnt 2030 3830 Pnt 2309 3807 Pnt 2945 3044 Pnt 2530 3848 Pnt 2327 3793 Pnt 2746 3771 Pnt 2120 3808 Pnt 2610 3809 Pnt 3495 3783 Pnt 2411 3809 Pnt 2511 3808 Pnt 2686 3793 Pnt 2990 3819 Pnt 2284 3749 Pnt 2952 3771 Pnt 2536 3770 Pnt 2723 3819 Pnt 2691 3883 Pnt 2005 3898 Pnt 2588 3796 Pnt 3008 3806 Pnt 2645 3793 Pnt 2443 3849 Pnt 3222 3794 Pnt 2385 3822 Pnt 3861 3794 Pnt 2701 3791 Pnt 2255 3809 Pnt 3362 3777 Pnt 2650 3809 Pnt 1958 3825 Pnt 2538 3754 Pnt 4441 3797 Pnt 2695 3844 Pnt 2807 3790 Pnt 3207 3829 Pnt 3072 3785 Pnt 2366 3809 Pnt 2438 3844 Pnt 2461 3774 Pnt 2385 3853 Pnt 2353 3835 Pnt 3029 3795 Pnt 2804 3810 Pnt 2709 3776 Pnt 2135 3790 Pnt 2825 3804 Pnt 2191 3943 Pnt 2829 3846 Pnt 2139 3801 Pnt 2311 3776 Pnt 2586 3804 Pnt 3166 3846 Pnt 2097 3823 Pnt 3036 3759 Pnt 2416 3814 Pnt 2218 3785 Pnt 3906 3748 Pnt 3608 3758 Pnt 3378 3759 Pnt 4166 3798 Pnt 2751 3760 Pnt 2707 3802 Pnt 2531 3772 Pnt 2696 3802 Pnt 2882 3767 Pnt 2540 3807 Pnt 2344 3765 Pnt 3251 3828 Pnt 2387 3771 Pnt 2211 3838 Pnt 3581 3810 Pnt 2493 3870 Pnt 3085 3809 Pnt 3648 3771 Pnt 3272 3786 Pnt 2360 3789 Pnt 3660 3811 Pnt 1875 3781 Pnt 2410 3786 Pnt 3357 3799 Pnt 3063 3781 Pnt 2697 3780 Pnt 1933 3843 Pnt 2983 3760 Pnt 3495 3813 Pnt 2589 3761 Pnt 2428 3784 Pnt 3202 3806 Pnt 3590 3809 Pnt 2848 3761 Pnt 2216 3771 Pnt 2990 3787 Pnt 2787 3814 Pnt 2848 3826 Pnt 2075 3831 Pnt 2910 3781 Pnt 2672 3746 Pnt 2495 3834 Pnt 2671 3779 Pnt 2313 3795 Pnt 3022 3755 Pnt 2613 3767 Pnt 2571 3805 Pnt 4042 3753 Pnt 2366 3801 Pnt 2983 3753 Pnt 2016 3902 Pnt 2359 3782 Pnt 3294 3794 Pnt 2484 3798 Pnt 2676 3761 Pnt 2512 3748 Pnt 2011 3769 Pnt 2923 3787 Pnt 2907 3756 Pnt 2592 3937 Pnt 2620 3832 Pnt 2026 3801 Pnt 2854 3769 Pnt 3535 3786 Pnt 2036 3776 Pnt 2869 3757 Pnt 2163 3806 Pnt 2924 3851 Pnt 2696 3822 Pnt 2004 3922 Pnt 3291 3773 Pnt 2529 3804 Pnt 2630 3772 Pnt 2591 3748 Pnt 3782 3747 Pnt 2634 3776 Pnt 2441 3810 Pnt 2197 3788 Pnt 3238 3755 Pnt 1975 3808 Pnt 2774 3814 Pnt 2973 3767 Pnt 3487 3814 Pnt 2621 3796 Pnt 3828 3767 Pnt 2586 3757 Pnt 2215 3795 Pnt 2933 3796 Pnt 2711 3759 Pnt 3193 3752 Pnt 2828 3812 Pnt 2418 3926 Pnt 3351 3754 Pnt 1958 3800 Pnt 2338 3774 Pnt 3078 3828 Pnt 2250 3802 Pnt 2041 3839 Pnt 2552 3784 Pnt 2499 3766 Pnt 2375 3809 Pnt 2969 3803 Pnt 2615 3769 Pnt 2828 3769 Pnt 2660 3826 Pnt 2888 3792 Pnt 2458 3780 Pnt 3605 3769 Pnt 2832 3752 Pnt 2920 3752 Pnt 3535 3776 Pnt 2669 3775 Pnt 2622 3753 Pnt 3649 3754 Pnt 2512 3859 Pnt 2213 3783 Pnt 3163 3814 Pnt 2866 3869 Pnt 2746 3763 Pnt 2635 3760 Pnt 2554 3869 Pnt 2600 3808 Pnt 4288 3755 Pnt 2890 3799 Pnt 2927 3814 Pnt 2739 3781 Pnt 2594 3762 Pnt 2064 3781 Pnt 3409 3781 Pnt 3961 3799 Pnt 2895 3819 Pnt 2664 3864 Pnt 2449 3758 Pnt 2444 3803 Pnt 2744 3781 Pnt 2176 3801 Pnt 2775 3816 Pnt 2881 3820 Pnt 2868 3754 Pnt 3080 3817 Pnt 2773 3769 Pnt 3490 3817 Pnt 2305 3826 Pnt 2683 3802 Pnt 3226 3766 Pnt 2706 3782 Pnt 4017 3802 Pnt 3350 3786 Pnt 2643 3756 Pnt 2489 3792 Pnt 3332 3767 Pnt 1837 3799 Pnt 3043 3787 Pnt 2624 3756 Pnt 2090 3819 Pnt 2583 3779 Pnt 2802 3770 Pnt 4495 3834 Pnt 2469 3835 Pnt 2840 3811 Pnt 2834 3811 Pnt 2468 3814 Pnt 3070 3779 Pnt 2490 3872 Pnt 3001 3778 Pnt 4339 3794 Pnt 2793 3795 Pnt 2168 3831 Pnt 3500 3781 Pnt 2759 3814 Pnt 2730 3829 Pnt 2017 3765 Pnt 3012 3781 Pnt 2581 3841 Pnt 2170 3768 Pnt 3192 3807 Pnt 1918 3761 Pnt 4056 3829 Pnt 2655 3796 Pnt 2669 3901 Pnt 2084 3790 Pnt 2687 3858 Pnt 2384 3819 Pnt 1906 3779 Pnt 3817 3761 Pnt 3260 3786 Pnt 2850 3805 Pnt 2890 3804 Pnt 2913 3804 Pnt 3092 3772 Pnt 3381 3783 Pnt 3725 3766 Pnt 2862 3826 Pnt 2723 3812 Pnt 3628 3826 Pnt 4131 3780 Pnt 2538 3813 Pnt 3686 3771 Pnt 2597 3824 Pnt 2005 3758 Pnt 2863 3801 Pnt 2181 3763 Pnt 2407 3818 Pnt 4451 3776 Pnt 2291 3806 Pnt 2134 3777 Pnt 2897 3764 Pnt 2541 3800 Pnt 2489 3054 Pnt 4247 3764 Pnt 2483 3804 Pnt 3321 3806 Pnt 1921 3831 Pnt 2873 3854 Pnt 2551 3796 Pnt 3432 3832 Pnt 2174 3803 Pnt 1998 3763 Pnt 2869 3801 Pnt 3754 3773 Pnt 3448 3757 Pnt 2663 3814 Pnt 2322 3753 Pnt 2805 3802 Pnt 3968 2914 Pnt 2385 3791 Pnt 2167 3804 Pnt 2248 3762 Pnt 2087 3857 Pnt 3228 3802 Pnt 2195 3790 Pnt 3877 3773 Pnt 2120 3801 Pnt 3223 3792 Pnt 3251 3788 Pnt 2427 3807 Pnt 3013 3871 Pnt 2588 3787 Pnt 2322 3797 Pnt 3084 3762 Pnt 2771 3773 Pnt 1915 3779 Pnt 3720 3788 Pnt 3097 3762 Pnt 2222 3815 Pnt 3217 3749 Pnt 2330 3793 Pnt 2517 3751 Pnt 3357 3765 Pnt 2708 3792 Pnt 2479 3792 Pnt 3475 3793 Pnt 2740 3774 Pnt 2457 3809 Pnt 2643 3803 Pnt 3461 3773 Pnt 2644 3800 Pnt 3176 2754 Pnt 2190 3780 Pnt 3164 3800 Pnt 2595 3830 Pnt 2976 3808 Pnt 2457 3870 Pnt 3354 3808 Pnt 3085 3798 Pnt 4206 3784 Pnt 3049 3761 Pnt 2939 3778 Pnt 3148 2936 Pnt 2726 3831 Pnt 2184 3822 Pnt 2759 3763 Pnt 3468 3750 Pnt 2727 3759 Pnt 3383 3784 Pnt 3005 3759 Pnt 3305 3768 Pnt 2582 3819 Pnt 2453 3777 Pnt 3311 3785 Pnt 2632 3861 Pnt 3125 3785 Pnt 2831 3839 Pnt 2320 3818 Pnt 3497 3774 Pnt 2766 3769 Pnt 4056 3750 Pnt 2582 3825 Pnt 2740 3787 Pnt 2373 3772 Pnt 2519 3751 Pnt 3059 3811 Pnt 3800 3742 Pnt 2066 3832 Pnt 2602 3784 Pnt 3040 3793 Pnt 2076 3823 Pnt 2485 3748 Pnt 2066 3817 Pnt 2540 3793 Pnt 2988 3764 Pnt 2065 3870 Pnt 3132 3817 Pnt 2702 3777 Pnt 3227 3833 Pnt 1946 3828 Pnt 3129 3764 Pnt 2695 3758 Pnt 2494 3808 Pnt 1785 3757 Pnt 3623 3758 Pnt 3216 3782 Pnt 3572 3777 Pnt 2194 3753 Pnt 2761 3820 Pnt 1877 3789 Pnt 3358 3779 Pnt 2780 3791 Pnt 2919 3779 Pnt 2720 3775 Pnt 2415 3751 Pnt 2782 3763 Pnt 4656 3790 Pnt 3584 3797 Pnt 2178 3790 Pnt 3079 3816 Pnt 2649 3763 Pnt 2292 3848 Pnt 2653 3813 Pnt 2124 3749 Pnt 3055 3753 Pnt 2210 3839 Pnt 3124 3822 Pnt 2426 3810 Pnt 3810 3822 Pnt 2669 3796 Pnt 2903 3832 Pnt 3042 3813 Pnt 1907 3809 Pnt 2789 3820 Pnt 2661 3775 Pnt 2074 3749 Pnt 2561 3755 Pnt 2833 3761 Pnt 3381 3788 Pnt 2934 3764 Pnt 2720 3768 Pnt 2998 3816 Pnt 2523 3846 Pnt 2151 3782 Pnt 2972 3770 Pnt 2294 3846 Pnt 2273 3758 Pnt 2469 3792 Pnt 3504 3782 Pnt 2141 3808 Pnt 2819 3775 Pnt 2835 3792 Pnt 2720 3775 Pnt 2614 3854 Pnt 3289 3800 Pnt 2671 3791 Pnt 2479 3838 Pnt 3273 3854 Pnt 2771 3790 Pnt 3149 3777 Pnt 2741 3766 Pnt 3292 3838 Pnt 2346 3800 Pnt 2730 3766 Pnt 3012 3758 Pnt 2382 3754 Pnt 2127 3808 Pnt 2437 3811 Pnt 2604 3837 Pnt 1872 3777 Pnt 3052 3813 Pnt 2515 3837 Pnt 2686 3826 Pnt 2017 3791 Pnt 2486 3826 Pnt 2661 3853 Pnt 3545 3804 Pnt 2814 3853 Pnt 2584 3832 Pnt 2048 3799 Pnt 2301 3763 Pnt 2457 3815 Pnt 2407 3759 Pnt 2274 3765 Pnt 3762 3786 Pnt 2975 3789 Pnt 4189 3809 Pnt 3442 3786 Pnt 3523 3789 Pnt 3214 3755 Pnt 2169 3803 Pnt 3175 3792 Pnt 3111 3830 Pnt 3553 3759 Pnt 4338 3807 Pnt 2716 3792 Pnt 2089 3820 Pnt 2450 3794 Pnt 2723 3783 Pnt 3255 3781 Pnt 2873 3828 Pnt 2606 3792 Pnt 2511 3774 Pnt 2544 3766 Pnt 3299 3768 Pnt 2454 3814 Pnt 2840 3783 Pnt 2618 3814 Pnt 2642 3783 Pnt 2388 3809 Pnt 3935 3751 Pnt 2749 3774 Pnt 4612 3781 Pnt 2875 3791 Pnt 3746 3755 Pnt 2595 3787 Pnt 2445 3866 Pnt 3398 3084 Pnt 2438 3869 Pnt 1783 3797 Pnt 3207 3791 Pnt 2697 3866 Pnt 2187 3750 Pnt 2627 3807 Pnt 2803 3764 Pnt 2783 3794 Pnt 2779 3796 Pnt 2436 3759 Pnt 2789 3827 Pnt 2559 3816 Pnt 2149 3800 Pnt 4202 3762 Pnt 2022 3768 Pnt 2742 3754 Pnt 3383 3755 Pnt 2157 3753 Pnt 2905 3805 Pnt 2538 3781 Pnt 2764 3789 Pnt 2989 3758 Pnt 3035 3766 Pnt 2892 3766 Pnt 3740 3789 Pnt 4065 3766 Pnt 2474 3892 Pnt 3680 3840 Pnt 3395 3763 Pnt 2662 3774 Pnt 2102 3803 Pnt 3506 3892 Pnt 3084 3757 Pnt 3819 3766 Pnt 3146 3785 Pnt 2009 3771 Pnt 2447 3771 Pnt 2716 3809 Pnt 3593 3767 Pnt 3387 3809 Pnt 2573 3778 Pnt 3359 3762 Pnt 2634 3808 Pnt 2722 3816 Pnt 3024 3830 Pnt 4130 3811 Pnt 2793 3811 Pnt 4190 3802 Pnt 4238 3785 Pnt 2771 3807 Pnt 2749 3794 Pnt 2668 3819 Pnt 4344 3813 Pnt 2522 3798 Pnt 3441 3774 Pnt 2552 3808 Pnt 2888 3775 Pnt 4219 3771 Pnt 2846 3770 Pnt 2616 3797 Pnt 2649 3749 Pnt 3488 3759 Pnt 2307 3802 Pnt 1937 3917 Pnt 3414 2841 Pnt 2460 3806 Pnt 2606 3793 Pnt 3435 3781 Pnt 2554 3791 Pnt 2716 3748 Pnt 2533 3799 Pnt 2794 3846 Pnt 2596 3796 Pnt 3512 3793 Pnt 2691 3778 Pnt 3094 3842 Pnt 2285 3844 Pnt 2232 3768 Pnt 3628 3788 Pnt 2880 3849 Pnt 2838 3816 Pnt 2733 3794 Pnt 3573 3849 Pnt 2382 3788 Pnt 2195 3761 Pnt 2847 3793 Pnt 2596 3774 Pnt 2485 3805 Pnt 2708 3810 Pnt 2638 3756 Pnt 1974 3794 Pnt 2654 3795 Pnt 3461 3802 Pnt 2470 3932 Pnt 2228 3794 Pnt 3709 3810 Pnt 2453 3780 Pnt 2287 3790 Pnt 4338 3767 Pnt 2152 3943 Pnt 2521 3855 Pnt 3062 3790 Pnt 2399 3806 Pnt 2901 3786 Pnt 2358 3789 Pnt 2785 3806 Pnt 2591 3796 Pnt 4482 3778 Pnt 2577 3820 Pnt 2233 3788 Pnt 3695 3781 Pnt 2069 3779 Pnt 2691 3759 Pnt 2549 3828 Pnt 3368 3755 Pnt 2648 3760 Pnt 3251 3841 Pnt 2420 3828 Pnt 2536 3772 Pnt 3384 3828 Pnt 2960 3787 Pnt 2478 3812 Pnt 2672 3802 Pnt 2587 3787 Pnt 3383 3803 Pnt 2813 3791 Pnt 2628 3765 Pnt 2735 3807 Pnt 3383 3784 Pnt 2615 3814 Pnt 1817 3781 Pnt 3390 3814 Pnt 2451 3843 Pnt 1984 3785 Pnt 3235 3775 Pnt 2505 3829 Pnt 2388 3883 Pnt 3010 3877 Pnt 2487 3808 Pnt 2556 3793 Pnt 2853 3761 Pnt 2228 3782 Pnt 2287 3799 Pnt 2005 3790 Pnt 2666 3870 Pnt 2575 3899 Pnt 3931 3766 Pnt 2728 3813 Pnt 2680 3870 Pnt 2460 3801 Pnt 2606 3799 Pnt 2102 3777 Pnt 2759 3822 Pnt 3779 3783 Pnt 2129 3809 Pnt 2622 3780 Pnt 3550 3801 Pnt 2571 3817 Pnt 2241 3777 Pnt 3166 3804 Pnt 2523 3808 Pnt 2257 3936 Pnt 2417 3809 Pnt 2366 3786 Pnt 2168 3836 Pnt 2269 3795 Pnt 2427 3768 Pnt 2055 3801 Pnt 3588 3936 Pnt 2789 3803 Pnt 2917 3767 Pnt 3267 3797 Pnt 2796 3780 Pnt 3212 3778 Pnt 1997 3800 Pnt 2664 3824 Pnt 3010 3803 Pnt 2610 3775 Pnt 3248 3778 Pnt 2431 3844 Pnt 3013 3771 Pnt 2851 3771 Pnt 3797 3844 Pnt 3164 3772 Pnt 3323 3756 Pnt 2775 3790 Pnt 3053 3762 Pnt 2888 3781 Pnt 2094 3824 Pnt 2629 3772 Pnt 3703 3750 Pnt 3262 3824 Pnt 2773 3828 Pnt 2310 3834 Pnt 2296 3808 Pnt 2866 3762 Pnt 2695 3853 Pnt 2361 3806 Pnt 3016 3808 Pnt 2520 3761 Pnt 3903 3762 Pnt 2444 3808 Pnt 3133 3806 Pnt 1807 3799 Pnt 2954 3773 Pnt 3147 3835 Pnt 2634 3814 Pnt 2813 3804 Pnt 2770 3814 Pnt 2531 3836 Pnt 2758 3781 Pnt 4127 3773 Pnt 2897 3783 Pnt 2148 3771 Pnt 3025 3782 Pnt 3159 3779 Pnt 2289 3746 Pnt 2881 3764 Pnt 2495 3818 Pnt 2325 3819 Pnt 2798 3846 Pnt 2788 3786 Pnt 3157 3762 Pnt 2238 3767 Pnt 3098 3762 Pnt 2904 3838 Pnt 2861 3785 Pnt 2082 3824 Pnt 2950 3807 Pnt 3475 3811 Pnt 3266 3827 Pnt 2803 3771 Pnt 1978 3902 Pnt 3033 3771 Pnt 2534 3761 Pnt 2438 3814 Pnt 2697 3814 Pnt 2100 3756 Pnt 2958 3794 Pnt 3863 3779 Pnt 1855 3769 Pnt 2179 3782 Pnt 3185 3795 Pnt 2516 3756 Pnt 3500 3769 Pnt 2903 3832 Pnt 2757 3765 Pnt 2646 3756 Pnt 2213 3822 Pnt 4207 3788 Pnt 2978 3794 Pnt 4176 3796 Pnt 2802 3814 Pnt 2700 3830 Pnt 2561 3754 Pnt 2234 3814 Pnt 2611 3795 Pnt 2240 3769 Pnt 2599 3812 Pnt 2418 3801 Pnt 2270 3866 Pnt 1874 3806 Pnt 2249 3859 Pnt 3269 3812 Pnt 2811 3781 Pnt 2671 3773 Pnt 2634 3841 Pnt 2909 3804 Pnt 2492 3923 Pnt 3931 3781 Pnt 3221 3841 Pnt 3725 3773 Pnt 2728 3807 Pnt 2755 3783 Pnt 2420 3747 Pnt 2676 3771 Pnt 2615 3826 Pnt 2646 3752 Pnt 3103 3783 Pnt 2718 3796 Pnt 3521 3773 Pnt 2901 3805 Pnt 2092 3826 Pnt 2645 3813 Pnt 2468 3771 Pnt 2966 3776 Pnt 2440 3752 Pnt 4636 3794 Pnt 2985 3817 Pnt 3494 3756 Pnt 2571 3767 Pnt 3236 3814 Pnt 4484 3817 Pnt 2831 3814 Pnt 2761 3791 Pnt 3193 3769 Pnt 3417 3791 Pnt 4172 3113 Pnt 3267 3762 Pnt 2295 3792 Pnt 2018 3911 Pnt 2475 3862 Pnt 2461 3809 Pnt 2158 3761 Pnt 2237 3753 Pnt 3944 3809 Pnt 3060 3763 Pnt 3044 3750 Pnt 2991 3827 Pnt 2533 3830 Pnt 3297 3757 Pnt 2509 3798 Pnt 3236 3805 Pnt 2147 3870 Pnt 4552 3825 Pnt 3090 3781 Pnt 2531 3796 Pnt 2719 3831 Pnt 3769 3787 Pnt 2601 3824 Pnt 2466 3779 Pnt 3266 3781 Pnt 2585 3804 Pnt 3065 3759 Pnt 2734 3755 Pnt 2815 3839 Pnt 2371 3777 Pnt 2711 3802 Pnt 4477 3839 Pnt 2807 3840 Pnt 2431 3765 Pnt 2431 3779 Pnt 2758 3870 Pnt 2451 3791 Pnt 2912 3791 Pnt 2584 3777 Pnt 3586 3845 Pnt 3295 3787 Pnt 2174 3835 Pnt 3276 3775 Pnt 2304 3803 Pnt 2587 3831 Pnt 4079 3785 Pnt 2901 3779 Pnt 2423 3832 Pnt 2618 3758 Pnt 3228 3818 Pnt 2619 3768 Pnt 2234 3850 Pnt 4234 3769 Pnt 3199 3758 Pnt 2096 3796 Pnt 2912 3774 Pnt 3308 3791 Pnt 3976 3074 Pnt 2578 3814 Pnt 3334 3798 Pnt 1737 3749 Pnt 3183 3776 Pnt 2522 3901 Pnt 2685 3841 Pnt 3212 3783 Pnt 2459 3790 Pnt 2145 3804 Pnt 2913 3813 Pnt 3334 3821 Pnt 3800 3802 Pnt 2311 3847 Pnt 2733 3766 Pnt 2227 3832 Pnt 3151 3807 Pnt 2648 3752 Pnt 2964 3831 Pnt 2582 3801 Pnt 2527 3801 Pnt 2941 3824 Pnt 2752 3752 Pnt 4294 3757 Pnt 2909 3792 Pnt 2779 3782 Pnt 2384 3838 Pnt 2937 3772 Pnt 3485 3788 Pnt 2962 3782 Pnt 2173 3792 Pnt 3098 3816 Pnt 3562 3792 Pnt 2886 3816 Pnt 2962 3787 Pnt 4350 3765 Pnt 2633 3775 Pnt 3616 3756 Pnt 2159 3824 Pnt 3247 3791 Pnt 3154 3763 Pnt 3880 3824 Pnt 2724 3775 Pnt 2641 3856 Pnt 2660 3813 Pnt 2061 3818 Pnt 2063 3765 Pnt 3532 3777 Pnt 2340 3792 Pnt 2820 3790 Pnt 3215 3777 Pnt 2242 3848 Pnt 2284 3904 Pnt 2225 3790 Pnt 2649 3792 Pnt 3240 3776 Pnt 2656 3787 Pnt 2916 3825 Pnt 2182 3803 Pnt 3253 3853 Pnt 4352 3772 Pnt 2904 3787 Pnt 4058 3772 Pnt 3002 3778 Pnt 2921 3763 Pnt 3133 3792 Pnt 3311 3773 Pnt 2725 3749 Pnt 2758 3802 Pnt 2186 3881 Pnt 2896 3799 Pnt 2026 3790 Pnt 2619 3814 Pnt 3046 3823 Pnt 2855 3807 Pnt 2361 3843 Pnt 3343 3757 Pnt 2624 3773 Pnt 4100 3765 Pnt 2522 3777 Pnt 3038 3782 Pnt 2920 3847 Pnt 2196 3749 Pnt 4293 3780 Pnt 2290 3809 Pnt 3333 3774 Pnt 2062 3800 Pnt 3033 3799 Pnt 3256 3784 Pnt 2820 3754 Pnt 2162 3781 Pnt 4107 3759 Pnt 3462 3772 Pnt 4111 3774 Pnt 2864 3798 Pnt 2392 3765 Pnt 3924 3772 Pnt 2727 3828 Pnt 2260 3807 Pnt 2077 3797 Pnt 2197 3772 Pnt 2881 3814 Pnt 2672 3787 Pnt 2193 3803 Pnt 2744 3780 Pnt 2448 3786 Pnt 2141 3745 Pnt 4155 3814 Pnt 2818 3785 Pnt 2923 3745 Pnt 2654 3804 Pnt 2704 3837 Pnt 2817 3826 Pnt 2741 3828 Pnt 2654 3763 Pnt 3510 3828 Pnt 2297 3817 Pnt 2890 3782 Pnt 2985 3781 Pnt 2769 3832 Pnt 2592 3805 Pnt 4056 3748 Pnt 2381 3798 Pnt 2814 3809 Pnt 2481 3793 Pnt 1887 3794 Pnt 2426 3866 Pnt 2347 3759 Pnt 2096 3784 Pnt 3791 3793 Pnt 3217 3833 Pnt 2126 3750 Pnt 2744 3815 Pnt 3580 3786 Pnt 2683 3775 Pnt 3849 3815 Pnt 3210 3776 Pnt 2844 3814 Pnt 4637 2732 Pnt 2863 3790 Pnt 2550 3827 Pnt 4441 3815 Pnt 3374 3751 Pnt 2131 3774 Pnt 3003 3790 Pnt 3530 3764 Pnt 2071 3807 Pnt 3006 3755 Pnt 3229 3796 Pnt 2664 3806 Pnt 2964 3807 Pnt 2111 3808 Pnt 2682 3871 Pnt 2557 3769 Pnt 2465 3774 Pnt 2636 3784 Pnt 3233 3783 Pnt 3095 3784 Pnt 2884 3817 Pnt 2880 3765 Pnt 2478 3791 Pnt 3253 3814 Pnt 2486 3805 Pnt 2508 3751 Pnt 3192 3758 Pnt 2785 3794 Pnt 3835 3758 Pnt 2770 3752 Pnt 1918 3780 Pnt 3078 3827 Pnt 2832 3796 Pnt 4269 3767 Pnt 3018 3760 Pnt 2836 3774 Pnt 2853 3802 Pnt 3608 3760 Pnt 3028 3760 Pnt 2972 3755 Pnt 2614 3842 Pnt 2668 3755 Pnt 2249 3822 Pnt 3073 3761 Pnt 2651 3776 Pnt 3024 3808 Pnt 2904 3798 Pnt 3262 3836 Pnt 2781 3807 Pnt 2538 3794 Pnt 2686 3794 Pnt 3273 3773 Pnt 2883 3768 Pnt 2445 3771 Pnt 2795 3763 Pnt 2554 3771 Pnt 2914 3771 Pnt 2806 3802 Pnt 2498 3812 Pnt 2973 3846 Pnt 2362 3937 Pnt 2219 3846 Pnt 3219 3819 Pnt 3058 3809 Pnt 2695 3846 Pnt 3400 3825 Pnt 2937 3793 Pnt 3136 3846 Pnt 2889 3848 Pnt 2706 3758 Pnt 2588 3793 Pnt 2293 3785 Pnt 3564 3848 Pnt 2071 3943 Pnt 4319 3794 Pnt 2621 3813 Pnt 1987 3776 Pnt 2689 3787 Pnt 2737 3757 Pnt 2405 3806 Pnt 3108 3812 Pnt 2328 3811 Pnt 2224 3782 Pnt 2980 3855 Pnt 2773 3775 Pnt 2448 3796 Pnt 2495 3851 Pnt 2508 3855 Pnt 2187 3820 Pnt 4008 3750 Pnt 2731 3786 Pnt 3147 3820 Pnt 2188 3822 Pnt 2813 3754 Pnt 3204 3822 Pnt 3326 3816 Pnt 3785 3750 Pnt 2343 3808 Pnt 2965 3822 Pnt 2868 3822 Pnt 2667 3772 Pnt 2474 3816 Pnt 2813 2667 Pnt 2012 3808 Pnt 2562 3813 Pnt 3011 3766 Pnt 2330 3757 Pnt 2412 3828 Pnt 2262 3825 Pnt 2743 3805 Pnt 2697 3828 Pnt 3681 3793 Pnt 2887 3828 Pnt 2466 3772 Pnt 2462 3776 Pnt 2883 3796 Pnt 2973 3809 Pnt 2829 3796 Pnt 2271 3899 Pnt 2954 3784 Pnt 3623 3785 Pnt 2667 3802 Pnt 2932 3825 Pnt 2448 3785 Pnt 3838 3816 Pnt 2174 3825 Pnt 3028 3791 Pnt 2270 3794 Pnt 2392 3926 Pnt 2714 3838 Pnt 2067 3822 Pnt 3355 3841 Pnt 2135 3849 Pnt 2460 3814 Pnt 2919 3759 Pnt 2684 3808 Pnt 2671 3816 Pnt 2441 3777 Pnt 3850 3836 Pnt 2374 3802 Pnt 2950 3817 Pnt 4371 3764 Pnt 2670 3788 Pnt 2443 3766 Pnt 2155 3793 Pnt 2695 3761 Pnt 3047 3784 Pnt 3989 3796 Pnt 2374 3870 Pnt 3977 3817 Pnt 3229 3805 Pnt 2563 3774 Pnt 2926 3778 Pnt 2080 3834 Pnt 2843 3767 Pnt 2658 3870 Pnt 3663 3810 Pnt 2850 3825 Pnt 2082 3794 Pnt 3066 3794 Pnt 2829 3772 Pnt 2500 3774 Pnt 2272 3828 Pnt 3133 3777 Pnt 2620 3790 Pnt 2606 3774 Pnt 2183 3800 Pnt 2744 3785 Pnt 2431 3766 Pnt 2485 3758 Pnt 3007 3796 Pnt 2092 3784 Pnt 2995 3820 Pnt 2000 3824 Pnt 2777 3806 Pnt 2689 3804 Pnt 2157 3803 Pnt 2225 3788 Pnt 3863 3820 Pnt 2619 3780 Pnt 2510 3772 Pnt 2361 3800 Pnt 2627 3782 Pnt 2415 3781 Pnt 3414 3773 Pnt 2759 3800 Pnt 2742 3786 Pnt 2685 3828 Pnt 2519 3777 Pnt 3905 3774 Pnt 2580 3809 Pnt 2405 3826 Pnt 3198 3823 Pnt 2570 3767 Pnt 2649 3759 Pnt 2263 3834 Pnt 3481 3819 Pnt 3369 3793 Pnt 3173 3834 Pnt 2559 3808 Pnt 2997 3820 Pnt 2316 3820 Pnt 3000 3763 Pnt 2597 3762 Pnt 2132 3797 Pnt 3373 3750 Pnt 1890 3785 Pnt 2205 3848 Pnt 4020 3848 Pnt 2428 3779 Pnt 2823 3843 Pnt 2057 3753 Pnt 3843 3763 Pnt 2519 3749 Pnt 2841 3820 Pnt 2933 3759 Pnt 2487 3773 Pnt 3156 3810 Pnt 2912 3775 Pnt 2762 3814 Pnt 2910 3790 Pnt 2413 3814 Pnt 3660 3790 Pnt 2417 3836 Pnt 3305 3817 Pnt 2613 3804 Pnt 2503 3760 Pnt 3926 3827 Pnt 2241 3936 Pnt 3300 3782 Pnt 1807 3763 Pnt 4021 3762 Pnt 3494 3788 Pnt 2491 3811 Pnt 3250 3785 Pnt 2698 3798 Pnt 2348 3801 Pnt 3526 3767 Pnt 2586 3854 Pnt 1988 3813 Pnt 2794 3764 Pnt 3557 3762 Pnt 2758 3753 Pnt 2530 3814 Pnt 3025 3809 Pnt 4222 3854 Pnt 2719 3804 Pnt 2315 3802 Pnt 2562 3841 Pnt 2056 3786 Pnt 3237 3804 Pnt 2309 3801 Pnt 3024 3808 Pnt 2877 3869 Pnt 1972 3807 Pnt 3139 3784 Pnt 3050 3846 Pnt 3622 3810 Pnt 3584 3846 Pnt 4145 3815 Pnt 2989 3862 Pnt 2740 3774 Pnt 2612 3762 Pnt 2420 3769 Pnt 4126 3782 Pnt 3129 3768 Pnt 2760 3784 Pnt 3248 3784 Pnt 3067 3830 Pnt 2555 3942 Pnt 2942 3794 Pnt 2739 3762 Pnt 3633 3790 Pnt 2521 3942 Pnt 3993 3752 Pnt 2655 3771 Pnt 2524 3762 Pnt 2798 3816 Pnt 2613 3757 Pnt 2713 3833 Pnt 2957 3812 Pnt 2694 3861 Pnt 2377 3814 Pnt 3643 3790 Pnt 3521 3779 Pnt 3207 3787 Pnt 3591 3833 Pnt 2909 3776 Pnt 2726 3857 Pnt 2682 3814 Pnt 3996 3811 Pnt 2953 3759 Pnt 3275 3761 Pnt 2760 3787 Pnt 2664 3791 Pnt 3598 3759 Pnt 3575 3796 Pnt 2562 3771 Pnt 3478 3779 Pnt 3705 3759 Pnt 2702 3787 Pnt 2363 3892 Pnt 2937 3759 Pnt 3041 3756 Pnt 2012 3823 Pnt 3743 3764 Pnt 2979 3773 Pnt 2219 3832 Pnt 2119 3911 Pnt 1999 3817 Pnt 3412 3832 Pnt 3557 3773 Pnt 2523 3791 Pnt 2647 3773 Pnt 1973 3862 Pnt 3499 3773 Pnt 2429 3764 Pnt 3415 3763 Pnt 2519 3747 Pnt 3929 3813 Pnt 2507 3764 Pnt 2282 3794 Pnt 4107 3815 Pnt 2017 3808 Pnt 2709 3834 Pnt 2246 3754 Pnt 3041 3754 Pnt 2856 3764 Pnt 2465 3757 Pnt 2557 3827 Pnt 2738 3764 Pnt 3444 3773 Pnt 2840 3805 Pnt 3140 3775 Pnt 2680 3798 Pnt 3283 3807 Pnt 3181 3779 Pnt 3469 3805 Pnt 2773 3787 Pnt 4400 3766 Pnt 3342 3805 Pnt 2205 3901 Pnt 4053 3755 Pnt 2978 3813 Pnt 2760 3817 Pnt 2596 3835 Pnt 3724 3817 Pnt 2261 3769 Pnt 2584 3767 Pnt 3437 3835 Pnt 3643 3814 Pnt 2329 3791 Pnt 3124 3788 Pnt 2927 3769 Pnt 2722 3814 Pnt 2991 3815 Pnt 2457 3845 Pnt 3260 3814 Pnt 2828 3792 Pnt 3122 3792 Pnt 2288 3797 Pnt 3017 3754 Pnt 2615 3801 Pnt 3255 3771 Pnt 2200 3769 Pnt 2174 3782 Pnt 2487 3866 Pnt 2831 3770 Pnt 3965 3769 Pnt 3850 3784 Pnt 3225 3814 Pnt 2995 3807 Pnt 3037 3831 Pnt 2918 3781 Pnt 3051 3762 Pnt 2592 3923 Pnt 2695 3781 Pnt 4226 3781 Pnt 3704 3779 Pnt 3512 3800 Pnt 2850 3807 Pnt 4479 3784 Pnt 2575 3750 Pnt 2207 3801 Pnt 3205 3840 Pnt 2824 3824 Pnt 2827 3775 Pnt 2699 3824 Pnt 2653 3798 Pnt 3129 3752 Pnt 2817 3794 Pnt 3125 3823 Pnt 4078 3752 Pnt 3079 3823 Pnt 2882 3824 Pnt 2601 3809 Pnt 2985 3786 Pnt 2718 3782 Pnt 3162 3781 Pnt 3596 2865 Pnt 3015 3802 Pnt 2718 3816 Pnt 2574 3790 Pnt 2671 3809 Pnt 2988 3798 Pnt 3040 3809 Pnt 2622 3840 Pnt 2733 3807 Pnt 2717 3807 Pnt 2510 3765 Pnt 3726 3832 Pnt 2304 3779 Pnt 3003 3817 Pnt 3325 3779 Pnt 3029 3819 Pnt 3397 3797 Pnt 2962 3870 Pnt 2634 3792 Pnt 4519 3808 Pnt 2718 3828 Pnt 3452 3784 Pnt 2942 3777 Pnt 2812 3796 Pnt 2230 3853 Pnt 2854 3787 Pnt 2688 3787 Pnt 3590 3777 Pnt 2211 3775 Pnt 2740 3813 Pnt 2323 3806 Pnt 2792 3799 Pnt 4194 3841 Pnt 2440 3824 Pnt 3031 3813 Pnt 2836 3779 Pnt 3125 3773 Pnt 3068 3778 Pnt 2873 3808 Pnt 3223 3779 Pnt 2425 3843 Pnt 2205 3792 Pnt 2659 3773 Pnt 2998 3809 Pnt 2159 3847 Pnt 2399 3749 Pnt 2450 3781 Pnt 2602 3807 Pnt 2396 3818 Pnt 3168 3840 Pnt 2243 3809 Pnt 2533 3850 Pnt 2119 3797 Pnt 2316 3818 Pnt 3184 3797 Pnt 2704 3799 Pnt 2947 3774 Pnt 2822 3784 Pnt 2217 3781 Pnt 2466 3791 Pnt 3908 3779 Pnt 4746 3805 Pnt 2953 3814 Pnt 2486 3754 Pnt 4306 3763 Pnt 3707 3762 Pnt 3231 3901 Pnt 3091 3856 Pnt 2971 3765 Pnt 2075 3768 Pnt 2935 3802 Pnt 2815 3787 Pnt 2466 3804 Pnt 2640 3831 Pnt 2902 3787 Pnt 2146 3848 Pnt 3345 3787 Pnt 2309 3755 Pnt 2798 3772 Pnt 2531 3837 Pnt 2218 3904 Pnt 2542 3824 Pnt 2940 3764 Pnt 2110 3790 Pnt 2818 3839 Pnt 4216 3773 Pnt 3433 3839 Pnt 2559 3814 Pnt 2542 3828 Pnt 2593 3827 Pnt 2724 3785 Pnt 2490 3792 Pnt 2389 3792 Pnt 2632 3766 Pnt 2579 3762 Pnt 2728 3772 Pnt 2311 3803 Pnt 2886 3822 Pnt 2250 3803 Pnt 2828 3809 Pnt 3537 3822 Pnt 2018 3745 Pnt 2027 3818 Pnt 3720 3772 Pnt 2787 3825 Pnt 1997 3765 Pnt 3516 3771 Pnt 3525 3833 Pnt 2765 3778 Pnt 2722 3793 Pnt 3137 3768 Pnt 3339 3794 Pnt 2896 3796 Pnt 4211 3758 Pnt 3821 3774 Pnt 2416 3784 Pnt 3773 3759 Pnt 2517 3805 Pnt 3492 3784 Pnt 2635 3814 Pnt 2403 3798 Pnt 3695 3796 Pnt 2578 3832 Pnt 4569 3787 Pnt 3565 3782 Pnt 3286 3152 Pnt 1814 3794 Pnt 3059 3796 Pnt 2989 3828 Pnt 2480 3866 Pnt 3630 3814 Pnt 2093 3797 Pnt 2962 3755 Pnt 2714 3759 Pnt 3514 3780 Pnt 2602 3798 Pnt 2532 3779 Pnt 2043 3784 Pnt 2799 3769 Pnt 2030 3807 Pnt 2907 3814 Pnt 2538 3804 Pnt 3169 3804 Pnt 3704 3788 Pnt 3358 3775 Pnt 2569 3761 Pnt 2772 3752 Pnt 3247 3787 Pnt 2018 3776 Pnt 4129 3790 Pnt 3077 3792 Pnt 3735 3782 Pnt 2903 3790 Pnt 3987 3786 Pnt 3876 3776 Pnt 4134 3785 Pnt 2284 3811 Pnt 2032 3775 Pnt 2993 3786 Pnt 2736 3778 Pnt 2961 3778 Pnt 2778 3825 Pnt 3504 3764 Pnt 2645 3855 Pnt 2086 3792 Pnt 2575 3791 Pnt 2273 3774 Pnt 3523 3765 Pnt 2597 3807 Pnt 3274 3805 Pnt 3235 3807 Pnt 3882 3783 Pnt 3717 3791 Pnt 3386 3766 Pnt 2754 3765 Pnt 2507 3827 Pnt 3208 3776 Pnt 2718 3761 Pnt 2646 3791 Pnt 2160 3820 Pnt 2808 3824 Pnt 3975 3761 Pnt 2756 3770 Pnt 3257 3771 Pnt 2631 3814 Pnt 2941 3758 Pnt 4325 3768 Pnt 3175 3827 Pnt 3974 3757 Pnt 2335 3846 Pnt 2683 3814 Pnt 2861 3777 Pnt 2282 3846 Pnt 3573 3802 Pnt 2991 3789 Pnt 4180 3754 Pnt 2031 3807 Pnt 2847 3763 Pnt 2557 3807 Pnt 2225 3775 Pnt 3429 3772 Pnt 2222 3805 Pnt 3827 3813 Pnt 2760 3751 Pnt 2214 3879 Pnt 2702 3773 Pnt 2080 3943 Pnt 2523 3766 Pnt 2358 3774 Pnt 3014 3799 Pnt 3203 3757 Pnt 2127 3798 Pnt 2816 3766 Pnt 2011 3812 Pnt 2651 3799 Pnt 4106 3879 Pnt 2552 3805 Pnt 3077 3798 Pnt 2493 3899 Pnt 2597 3785 Pnt 3279 3803 Pnt 2101 3917 Pnt 2824 3755 Pnt 2054 3808 Pnt 3449 3813 Pnt 2910 3755 Pnt 2124 3822 Pnt 2580 3812 Pnt 2917 3836 Pnt 3708 3783 Pnt 2399 3749 Pnt 2755 3813 Pnt 2587 3847 Pnt 2567 3771 Pnt 1920 3806 Pnt 2994 3808 Pnt 2391 3802 Pnt 2272 3937 Pnt 3587 3789 Pnt 3302 3761 Pnt 2504 3808 Pnt 1965 3780 Pnt 2932 3770 Pnt 2221 3846 Pnt 2398 3793 Pnt 2831 3771 Pnt 2480 3827 Pnt 2728 3783 Pnt 3788 3793 Pnt 2729 3771 Pnt 3279 3804 Pnt 2390 3817 Pnt 2740 3774 Pnt 3031 3777 Pnt 3361 3802 Pnt 2410 3748 Pnt 2553 3803 Pnt 2301 3842 Pnt 3360 3848 Pnt 2568 3803 Pnt 2657 3796 Pnt 3449 3766 Pnt 2318 3782 Pnt 4519 3793 Pnt 2711 3791 Pnt 2830 3850 Pnt 4113 3757 Pnt 2285 3852 Pnt 3008 3780 Pnt 4087 3822 Pnt 2448 3807 Pnt 2219 3775 Pnt 3790 3820 Pnt 3106 3793 Pnt 2986 3802 Pnt 2852 3766 Pnt 3530 3816 Pnt 3035 3795 Pnt 2877 3757 Pnt 2287 3781 Pnt 2692 3828 Pnt 3107 3763 Pnt 2714 3757 Pnt 2633 3932 Pnt 4365 3820 Pnt 2199 3776 Pnt 2811 3780 Pnt 2568 3823 Pnt 2580 3870 Pnt 3150 3772 Pnt 2673 3802 Pnt 3076 3796 Pnt 2609 3810 Pnt 2960 3764 Pnt 2618 3822 Pnt 2894 3785 Pnt 3892 3785 Pnt 2854 3795 Pnt 2714 3841 Pnt 3224 3841 Pnt 1783 3849 Pnt 2615 3785 Pnt 2171 3806 Pnt 3142 3854 Pnt 2614 3806 Pnt 4040 3803 Pnt 2891 2883 Pnt 4354 3801 Pnt 2419 3835 Pnt 2867 2935 Pnt 3264 3835 Pnt 2683 3784 Pnt 2907 3822 Pnt 3464 3816 Pnt 2442 3843 Pnt 2360 3779 Pnt 1859 3784 Pnt 3665 3768 Pnt 2456 3942 Pnt 2159 3794 Pnt 3147 3828 Pnt 4398 3774 Pnt 2235 3813 Pnt 3250 3853 Pnt 2715 3777 Pnt 2558 3806 Pnt 3507 3766 Pnt 2447 3794 Pnt 2358 3773 Pnt 2907 3766 Pnt 3384 3808 Pnt 3617 3850 Pnt 2426 3794 Pnt 2546 3775 Pnt 2146 3836 Pnt 3335 3780 Pnt 2732 3790 Pnt 2998 3777 Pnt 3712 3749 Pnt 3067 3758 Pnt 2842 3825 Pnt 2749 3833 Pnt 2937 3767 Pnt 2340 3834 Pnt 2878 3804 Pnt 4072 3758 Pnt 2186 3753 Pnt 3073 3790 Pnt 3319 3761 Pnt 2080 3799 Pnt 3055 3779 Pnt 2810 3802 Pnt 3262 3825 Pnt 2083 3801 Pnt 2903 3799 Pnt 2777 3762 Pnt 2467 3791 Pnt 2760 3774 Pnt 3209 3828 Pnt 2802 3792 Pnt 2918 3780 Pnt 2144 3825 Pnt 2767 3830 Pnt 2059 3784 Pnt 2891 3828 Pnt 2294 3796 Pnt 2440 3757 Pnt 2512 3800 Pnt 2056 3794 Pnt 2993 3824 Pnt 2856 3758 Pnt 3097 3759 Pnt 2378 3926 Pnt 2020 3844 Pnt 3236 3837 Pnt 2654 3812 Pnt 3034 3791 Pnt 2427 3775 Pnt 4168 3794 Pnt 2927 3777 Pnt 2785 3781 Pnt 3341 3811 Pnt 2491 3821 Pnt 2614 3760 Pnt 3299 3821 Pnt 2821 3780 Pnt 2419 3818 Pnt 2246 3936 Pnt 4053 3769 Pnt 3674 3807 Pnt 3648 3764 Pnt 3158 3814 Pnt 3509 3763 Pnt 3653 3781 Pnt 3018 3809 Pnt 2813 3823 Pnt 2846 3772 Pnt 2560 3759 Pnt 3896 3817 Pnt 2330 3825 Pnt 2672 3773 Pnt 2228 3767 Pnt 2270 3786 Pnt 2968 3765 Pnt 1797 3823 Pnt 2815 3760 Pnt 3808 3767 Pnt 2177 3820 Pnt 2750 3760 Pnt 3548 3828 Pnt 2388 3804 Pnt 1984 3793 Pnt 2513 3788 Pnt 2855 3801 Pnt 1988 3786 Pnt 2658 3826 Pnt 4314 3788 Pnt 4150 3827 Pnt 1850 3800 Pnt 4034 3781 Pnt 3211 3808 Pnt 2772 3830 Pnt 2733 3801 Pnt 3109 3801 Pnt 2646 3834 Pnt 2660 3810 Pnt 1983 3785 Pnt 2823 3819 Pnt 3313 3803 Pnt 3456 3819 Pnt 2003 3797 Pnt 3198 3820 Pnt 3500 3807 Pnt 2174 3801 Pnt 3009 3811 Pnt 2750 3798 Pnt 2419 3810 Pnt 2145 3848 Pnt 2617 3752 Pnt 3573 3810 Pnt 2880 3801 Pnt 2325 3765 Pnt 2250 3824 Pnt 3087 3752 Pnt 2618 3762 Pnt 2334 3795 Pnt 2378 3870 Pnt 3955 3821 Pnt 2430 3836 Pnt 2518 3845 Pnt 2277 3816 Pnt 2647 3777 Pnt 3247 3870 Pnt 2652 3814 Pnt 2283 3825 Pnt 3695 3807 Pnt 2063 3811 Pnt 3407 3764 Pnt 2620 3765 Pnt 3252 3799 Pnt 1767 3785 Pnt 3127 3809 Pnt 3808 3799 Pnt 2766 3771 Pnt 3537 3764 Pnt 2582 3790 Pnt 2852 3813 Pnt 3274 3769 Pnt 2799 3828 Pnt 3105 3800 Pnt 2182 3783 Pnt 2483 3812 Pnt 2967 3892 Pnt 2046 3801 Pnt 2959 3784 Pnt 2192 3779 Pnt 3511 3807 Pnt 2807 3788 Pnt 3285 3784 Pnt 2964 3770 Pnt 2756 3778 Pnt 3038 3857 Pnt 4952 3807 Pnt 3065 3790 Pnt 2590 3810 Pnt 2094 3823 Pnt 2950 3857 Pnt 2878 3816 Pnt 2978 3815 Pnt 2867 3810 Pnt 2730 3757 Pnt 2320 3798 Pnt 2601 3817 Pnt 2603 3823 Pnt 3074 3766 Pnt 2476 3854 Pnt 3005 3772 Pnt 2705 3809 Pnt 3689 3823 Pnt 2594 3787 Pnt 2391 3832 Pnt 2646 3869 Pnt 2043 3841 Pnt 3027 3786 Pnt 3284 3787 Pnt 2759 3846 Pnt 2220 3751 Pnt 3051 3786 Pnt 2861 3862 Pnt 2404 3832 Pnt 3449 3815 Pnt 3291 3791 Pnt 2421 3765 Pnt 3088 3806 Pnt 2346 3794 Pnt 3299 3765 Pnt 2442 3802 Pnt 2915 3812 Pnt 3005 3819 Pnt 2957 3802 Pnt 2713 3808 Pnt 2358 3764 Pnt 3120 3773 Pnt 2637 3794 Pnt 2224 3763 Pnt 3132 3760 Pnt 3415 3799 Pnt 2397 3747 Pnt 2868 3774 Pnt 3318 3824 Pnt 2602 3813 Pnt 4001 3871 Pnt 2972 3784 Pnt 2888 3830 Pnt 3432 3777 Pnt 2681 3775 Pnt 4486 3807 Pnt 2624 3861 Pnt 2370 3757 Pnt 2516 3866 Pnt 3676 3856 Pnt 3594 3777 Pnt 2688 3757 Pnt 2390 3787 Pnt 3076 3818 Pnt 2296 3809 Pnt 2358 3773 Pnt 3754 3779 Pnt 2380 3809 Pnt 2844 3818 Pnt 3234 3811 Pnt 2812 3858 Pnt 2397 3807 Pnt 3591 3809 Pnt 3885 3818 Pnt 2363 3843 Pnt 2428 3901 Pnt 3213 3784 Pnt 2548 3767 Pnt 2690 3766 Pnt 3243 3901 Pnt 2364 3798 Pnt 2875 3843 Pnt 2021 3793 Pnt 2834 3835 Pnt 2389 3911 Pnt 2198 3812 Pnt 2960 3778 Pnt 2679 3787 Pnt 2295 3777 Pnt 2816 3817 Pnt 2697 3779 Pnt 2382 3825 Pnt 2565 3777 Pnt 2377 3776 Pnt 3135 3778 Pnt 4390 3825 Pnt 2635 3777 Pnt 3268 3829 Pnt 2952 3829 Pnt 2742 3791 Pnt 2340 3809 Pnt 3190 3789 Pnt 2586 3773 Pnt 2504 3817 Pnt 2706 3807 Pnt 3346 3798 Pnt 2218 3799 Pnt 2109 3861 Pnt 2562 3764 Pnt 2530 3774 Pnt 2214 3839 Pnt 2663 3794 Pnt 3067 3785 Pnt 2494 3754 Pnt 3068 3772 Pnt 2124 3811 Pnt 2990 3798 Pnt 4095 3784 Pnt 2471 3801 Pnt 2543 3758 Pnt 2344 3754 Pnt 3015 3809 Pnt 2745 3785 Pnt 2166 3850 Pnt 2768 3771 Pnt 2770 3824 Pnt 2613 3766 Pnt 2563 3764 Pnt 2151 3799 Pnt 2088 3866 Pnt 2672 3755 Pnt 2524 3783 Pnt 3308 3805 Pnt 2742 3826 Pnt 2726 3787 Pnt 3214 3770 Pnt 2535 3791 Pnt 2311 3800 Pnt 2179 3777 Pnt 3055 3814 Pnt 3009 3814 Pnt 2436 3805 Pnt 2823 3781 Pnt 4305 3769 Pnt 3720 3792 Pnt 3122 3762 Pnt 2924 3858 Pnt 4060 3812 Pnt 3331 3798 Pnt 3693 3771 Pnt 3128 3767 Pnt 2619 3841 Pnt 3000 3800 Pnt 2540 3840 Pnt 2398 3770 Pnt 2272 3801 Pnt 2971 3780 Pnt 2667 3779 Pnt 2611 3795 Pnt 2506 3792 Pnt 3177 3785 Pnt 2834 3779 Pnt 4193 3779 Pnt 3145 3831 Pnt 3549 3828 Pnt 2410 3923 Pnt 3410 3769 Pnt 2913 3790 Pnt 4194 3858 Pnt 3157 3781 Pnt 4137 3756 Pnt 3381 3753 Pnt 2783 3854 Pnt 2593 3797 Pnt 3041 3773 Pnt 4369 3841 Pnt 2751 3785 Pnt 3882 3775 Pnt 3823 3771 Pnt 2847 3772 Pnt 2822 3781 Pnt 2864 3822 Pnt 3716 3770 Pnt 3287 3765 Pnt 2111 3791 Pnt 3504 3787 Pnt 2835 3820 Pnt 3539 3795 Pnt 2584 3827 Pnt 2975 3782 Pnt 3208 3761 Pnt 2454 3825 Pnt 2879 3778 Pnt 2794 3802 Pnt 3024 3809 Pnt 2732 3756 Pnt 2338 3775 Pnt 1979 3818 Pnt 4066 3802 Pnt 2511 3772 Pnt 3226 3821 Pnt 2464 3769 Pnt 2698 3833 Pnt 3992 3757 Pnt 3230 3777 Pnt 3367 3755 Pnt 3670 3784 Pnt 3271 3785 Pnt 3339 3796 Pnt 2882 3787 Pnt 4888 3813 Pnt 2333 3846 Pnt 2040 3943 Pnt 2530 3828 Pnt 2101 3775 Pnt 2490 3754 Pnt 3595 3263 Pnt 2235 3772 Pnt 2539 3901 Pnt 3033 3754 Pnt 2191 3763 Pnt 2510 3856 Pnt 3101 3807 Pnt 2366 3798 Pnt 3132 3812 Pnt 2831 3765 Pnt 1966 3899 Pnt 2698 3812 Pnt 3035 3896 Pnt 1920 3824 Pnt 3586 3766 Pnt 2510 3766 Pnt 2958 3813 Pnt 2752 3827 Pnt 2538 3766 Pnt 2709 3799 Pnt 2384 3804 Pnt 2057 3808 Pnt 2749 3879 Pnt 1979 3782 Pnt 3517 3827 Pnt 4706 3792 Pnt 3012 3779 Pnt 2619 3766 Pnt 3356 3829 Pnt 4409 3799 Pnt 3004 3761 Pnt 2721 3762 Pnt 2559 3792 Pnt 3792 3781 Pnt 2993 3776 Pnt 2737 3792 Pnt 3286 3836 Pnt 2920 3809 Pnt 2806 3785 Pnt 3506 3836 Pnt 3223 3808 Pnt 3558 3771 Pnt 3428 3771 Pnt 2589 3802 Pnt 2818 3932 Pnt 2693 3804 Pnt 4083 3789 Pnt 2926 3823 Pnt 4312 3767 Pnt 2552 3809 Pnt 3921 3810 Pnt 2889 3831 Pnt 2207 3846 Pnt 2705 3772 Pnt 2740 3795 Pnt 2111 3806 Pnt 3288 3772 Pnt 2539 3841 Pnt 2338 3877 Pnt 2203 3834 Pnt 3540 3808 Pnt 2575 3808 Pnt 2067 3755 Pnt 3523 3763 Pnt 2349 3837 Pnt 2769 3804 Pnt 4308 3767 Pnt 2867 3778 Pnt 3581 3773 Pnt 4458 3778 Pnt 2124 3794 Pnt 2872 3774 Pnt 3036 3768 Pnt 2329 3784 Pnt 3239 3805 Pnt 3642 3777 Pnt 2574 3757 Pnt 3260 3767 Pnt 2420 3832 Pnt 3331 3777 Pnt 3734 3790 Pnt 2331 3866 Pnt 3147 3874 Pnt 3976 3777 Pnt 2814 3771 Pnt 2517 3850 Pnt 2047 3762 Pnt 2975 3773 Pnt 2821 3785 Pnt 2371 3749 Pnt 1854 3794 Pnt 2565 3773 Pnt 2352 3766 Pnt 2739 3813 Pnt 3094 3790 Pnt 2717 3830 Pnt 4472 3780 Pnt 3114 3828 Pnt 2994 3759 Pnt 2954 3791 Pnt 2880 3764 Pnt 2479 3798 Pnt 3947 3108 Pnt 2983 3845 Pnt 2931 3790 Pnt 2029 3792 Pnt 2127 3817 Pnt 3054 3778 Pnt 2436 3812 Pnt 3415 3764 Pnt 2307 3781 Pnt 2460 3822 Pnt 2903 3809 Pnt 2525 3807 Pnt 3094 3761 Pnt 3221 3779 Pnt 2805 3785 Pnt 1745 3780 Pnt 2543 3771 Pnt 3604 3798 Pnt 2727 3774 Pnt 2591 3847 Pnt 2488 3854 Pnt 2049 3776 Pnt 2635 3786 Pnt 4031 3783 Pnt 2687 3854 Pnt 2344 3808 Pnt 2210 3870 Pnt 3859 3774 Pnt 2523 3811 Pnt 3219 3781 Pnt 2650 3805 Pnt 2640 3764 Pnt 3812 3811 Pnt 2762 3825 Pnt 2881 3806 Pnt 2391 3802 Pnt 1992 3792 Pnt 2240 3788 Pnt 2174 3814 Pnt 2746 3791 Pnt 3282 3778 Pnt 3073 3769 Pnt 3731 3779 Pnt 2611 3805 Pnt 3910 3778 Pnt 2477 3780 Pnt 2077 3835 Pnt 2608 3751 Pnt 2613 3811 Pnt 3172 3829 Pnt 3715 3829 Pnt 2243 3775 Pnt 3092 3776 Pnt 2126 3766 Pnt 2342 3804 Pnt 4203 3760 Pnt 2617 3752 Pnt 2557 3814 Pnt 2649 3824 Pnt 2509 3824 Pnt 2364 3748 Pnt 3101 3787 Pnt 2941 3824 Pnt 2868 3748 Pnt 2644 3758 Pnt 2755 3803 Pnt 2718 3807 Pnt 2407 3799 Pnt 3739 3864 Pnt 2289 3805 Pnt 1866 3803 Pnt 4047 3837 Pnt 2893 3794 Pnt 4361 3807 Pnt 2972 3762 Pnt 2193 3796 Pnt 2765 3864 Pnt 3255 3839 Pnt 2881 3825 Pnt 2505 3846 Pnt 2776 3804 Pnt 3564 3762 Pnt 2693 3816 Pnt 2506 3833 Pnt 3040 3846 Pnt 3224 3821 Pnt 2980 3825 Pnt 2740 3771 Pnt 3145 3802 Pnt 2465 3852 Pnt 2236 3795 Pnt 3184 3793 Pnt 2370 3784 Pnt 2327 3793 Pnt 2211 3892 Pnt 2072 3917 Pnt 2751 3771 Pnt 3495 3809 Pnt 2363 3814 Pnt 2029 3807 Pnt 2058 3941 Pnt 2672 3807 Pnt 3637 3807 Pnt 3447 3944 Pnt 2215 3799 Pnt 2060 3777 Pnt 2844 3776 Pnt 2368 3816 Pnt 2903 3828 Pnt 3061 3799 Pnt 3854 3783 Pnt 2828 3814 Pnt 2870 3799 Pnt 2583 3801 Pnt 2516 3785 Pnt 2423 3781 Pnt 2432 3806 Pnt 3292 3785 Pnt 3077 3817 Pnt 2940 3766 Pnt 2755 3766 Pnt 3347 3817 Pnt 2811 3770 Pnt 2338 3813 Pnt 3153 3776 Pnt 2692 3832 Pnt 3128 3832 Pnt 2978 3810 Pnt 2780 3759 Pnt 2633 3774 Pnt 2153 3786 Pnt 2699 3774 Pnt 3238 3764 Pnt 2381 3786 Pnt 3217 3799 Pnt 2279 3937 Pnt 2434 3760 Pnt 4040 3803 Pnt 2722 3838 Pnt 2653 3813 Pnt 3252 3750 Pnt 2643 3751 Pnt 3263 3780 Pnt 2587 3843 Pnt 3030 3760 Pnt 2481 3771 Pnt 2078 3846 Pnt 3039 3771 Pnt 2416 3777 Pnt 2170 3801 Pnt 3304 3806 Pnt 4053 3777 Pnt 4503 3784 Pnt 2540 3794 Pnt 2099 3793 Pnt 2593 3756 Pnt 2643 3812 Pnt 2166 3848 Pnt 3043 3156 Pnt 2349 3843 Pnt 1984 3783 Pnt 2961 3835 Pnt 3046 3788 Pnt 2784 3770 Pnt 3312 3788 Pnt 3105 3843 Pnt 3741 3835 Pnt 2756 3817 Pnt 2746 3792 Pnt 3884 3776 Pnt 2695 3777 Pnt 3275 3780 Pnt 3174 3817 Pnt 2523 3842 Pnt 2313 3784 Pnt 2593 3780 Pnt 2191 3857 Pnt 2815 3837 Pnt 3020 3774 Pnt 2382 3798 Pnt 3344 3774 Pnt 2698 3842 Pnt 3440 3825 Pnt 2774 3785 Pnt 3554 3771 Pnt 2599 3765 Pnt 2587 3792 Pnt 2169 3833 Pnt 3051 3754 Pnt 3933 3777 Pnt 4375 3799 Pnt 2450 3824 Pnt 3106 3804 Pnt 2765 3838 Pnt 2460 3785 Pnt 2702 3747 Pnt 3695 3777 Pnt 2780 3798 Pnt 3009 3785 Pnt 2752 3777 Pnt 3122 3815 Pnt 2234 3850 Pnt 3061 3828 Pnt 3139 3837 Pnt 2790 3758 Pnt 2663 3775 Pnt 3182 3815 Pnt 2967 3821 Pnt 2271 3771 Pnt 2184 3851 Pnt 2544 3771 Pnt 3475 3802 Pnt 2833 3820 Pnt 2441 3824 Pnt 3693 3775 Pnt 2936 3768 Pnt 2691 3804 Pnt 2849 3777 Pnt 3561 3820 Pnt 2155 3866 Pnt 2753 3792 Pnt 3575 3815 Pnt 3342 3768 Pnt 2422 3807 Pnt 2215 3809 Pnt 2074 3763 Pnt 2958 3802 Pnt 2462 3755 Pnt 2603 3818 Pnt 3562 3801 Pnt 2214 3809 Pnt 3500 3818 Pnt 2543 3793 Pnt 2678 3757 Pnt 2901 3824 Pnt 2171 3829 Pnt 3780 3820 Pnt 3843 3757 Pnt 2838 3779 Pnt 2561 3798 Pnt 3879 3771 Pnt 4053 3785 Pnt 2540 3797 Pnt 1998 3788 Pnt 3920 3765 Pnt 2892 3819 Pnt 3803 3762 Pnt 4372 3769 Pnt 3004 3792 Pnt 2869 3801 Pnt 2450 3827 Pnt 2420 3828 Pnt 2528 3802 Pnt 3737 3767 Pnt 1921 3796 Pnt 3416 3802 Pnt 2887 3786 Pnt 3348 3756 Pnt 2607 3768 Pnt 2477 3765 Pnt 2613 3756 Pnt 2747 3923 Pnt 4127 3753 Pnt 2817 3773 Pnt 2769 3773 Pnt 2998 3923 Pnt 2136 3833 Pnt 2762 3753 Pnt 2317 3757 Pnt 3799 3803 Pnt 3532 3828 Pnt 2374 3810 Pnt 2596 3822 Pnt 4018 2910 Pnt 2306 3797 Pnt 2827 3866 Pnt 2022 3779 Pnt 3145 3819 Pnt 3136 3793 Pnt 3000 3823 Pnt 3150 3836 Pnt 2984 3773 Pnt 2030 3870 Pnt 2672 3785 Pnt 2714 3830 Pnt 3470 3779 Pnt 2876 3757 Pnt 3120 3799 Pnt 3553 3830 Pnt 2631 3810 Pnt 2502 3811 Pnt 3064 3762 Pnt 2403 3838 Pnt 3440 3773 Pnt 2297 3948 Pnt 1986 3816 Pnt 2650 3765 Pnt 3191 3768 Pnt 2776 3948 Pnt 3586 3764 Pnt 2626 3828 Pnt 2592 3779 Pnt 3245 3784 Pnt 2754 3790 Pnt 2790 3796 Pnt 2845 3778 Pnt 2776 3810 Pnt 3249 3828 Pnt 2863 3810 Pnt 2418 3836 Pnt 2894 3772 Pnt 3393 3809 Pnt 2679 3796 Pnt 2598 3825 Pnt 2751 3775 Pnt 3015 3836 Pnt 3037 3812 Pnt 3654 3823 Pnt 2421 3854 Pnt 4005 3775 Pnt 3023 3836 Pnt 2378 3821 Pnt 1983 3775 Pnt 2782 3814 Pnt 2568 3772 Pnt 2465 3775 Pnt 3005 3813 Pnt 2719 3809 Pnt 2280 3804 Pnt 3322 3807 Pnt 2093 3869 Pnt 3385 3816 Pnt 3008 3779 Pnt 4004 3817 Pnt 2089 3879 Pnt 3896 3745 Pnt 3184 3771 Pnt 2068 3832 Pnt 3759 3759 Pnt 2080 3758 Pnt 2690 3756 Pnt 3629 3770 Pnt 3810 2890 Pnt 4721 3794 Pnt 2328 3818 Pnt 2914 3765 Pnt 3169 3762 Pnt 2936 3829 Pnt 2761 3800 Pnt 3202 3801 Pnt 2162 3792 Pnt 2334 3777 Pnt 2562 3799 Pnt 3381 3836 Pnt 2496 3762 Pnt 2693 3828 Pnt 2375 3936 Pnt 3004 3774 Pnt 2902 3771 Pnt 3182 3769 Pnt 3912 3828 Pnt 2701 3768 Pnt 2745 3772 Pnt 2285 3801 Pnt 3401 3768 Pnt 2421 3806 Pnt 3051 3834 Pnt 2245 3803 Pnt 3599 3813 Pnt 2681 3806 Pnt 2333 3929 Pnt 2576 3788 Pnt 2253 3841 Pnt 2308 3792 Pnt 2707 3781 Pnt 3234 3856 Pnt 4134 3834 Pnt 2628 3846 Pnt 2571 3766 Pnt 3256 3781 Pnt 2728 3846 Pnt 2591 3777 Pnt 3086 3769 Pnt 2241 3854 Pnt 2990 3841 Pnt 2994 3773 Pnt 2627 3809 Pnt 2286 3828 Pnt 2738 3799 Pnt 2449 3809 Pnt 2269 3768 Pnt 2052 3799 Pnt 3086 3789 Pnt 3185 3790 Pnt 2678 3847 Pnt 2694 3784 Pnt 3927 3773 Pnt 2727 3805 Pnt 2999 3830 Pnt 3498 3814 Pnt 2453 3776 Pnt 2794 3777 Pnt 2194 3826 Pnt 4388 3799 Pnt 2245 3796 Pnt 2849 3812 Pnt 3263 3006 Pnt 2020 3757 Pnt 3679 3765 Pnt 2949 3787 Pnt 2373 3802 Pnt 2107 3781 Pnt 2719 3780 Pnt 2530 3773 Pnt 2364 3829 Pnt 3254 3773 Pnt 2697 3793 Pnt 2645 3818 Pnt 2604 3866 Pnt 2451 3800 Pnt 2749 3793 Pnt 2769 3790 Pnt 1895 3777 Pnt 2736 3797 Pnt 2771 3763 Pnt 2428 3807 Pnt 2162 3850 Pnt 2986 3786 Pnt 2674 3811 Pnt 2170 3768 Pnt 2652 3926 Pnt 2729 3814 Pnt 2700 3874 Pnt 2364 3769 Pnt 2397 3858 Pnt 2499 3811 Pnt 2847 3874 Pnt 2058 3771 Pnt 3100 3812 Pnt 2059 3901 Pnt 2652 3819 Pnt 4319 3760 Pnt 2435 3774 Pnt 2337 3839 Pnt 4051 3788 Pnt 2455 3805 Pnt 2928 3805 Pnt 2692 3794 Pnt 2602 3911 Pnt 1886 3797 Pnt 2909 3817 Pnt 2884 3762 Pnt 2588 3858 Pnt 2193 3775 Pnt 2063 3799 Pnt 2608 3762 Pnt 2653 3777 Pnt 2607 3775 Pnt 2254 3846 Pnt 2330 3812 Pnt 2670 3778 Pnt 2556 3783 Pnt 3144 3777 Pnt 3354 3798 Pnt 2886 3791 Pnt 3132 3787 Pnt 2742 3777 Pnt 2408 3813 Pnt 2476 3904 Pnt 2236 3825 Pnt 3486 3813 Pnt 2339 3845 Pnt 2868 3807 Pnt 2220 3788 Pnt 2978 3784 Pnt 3378 3770 Pnt 4284 3846 Pnt 2543 3808 Pnt 3308 3807 Pnt 2866 3763 Pnt 3458 3770 Pnt 2644 3797 Pnt 3443 3764 Pnt 2526 3821 Pnt 1921 3809 Pnt 2930 3764 Pnt 1743 3822 Pnt 2711 3778 Pnt 3179 3789 Pnt 2291 3808 Pnt 2541 3785 Pnt 2116 3801 Pnt 2763 3805 Pnt 3433 3809 Pnt 2685 3809 Pnt 3958 3805 Pnt 3016 3807 Pnt 4518 3817 Pnt 2628 3754 Pnt 3045 3785 Pnt 2850 3802 Pnt 2577 3764 Pnt 2490 3787 Pnt 3019 3764 Pnt 4000 3785 Pnt 2210 3805 Pnt 1936 3792 Pnt 4284 3062 Pnt 2461 3810 Pnt 2070 3788 Pnt 3698 3781 Pnt 2970 3797 Pnt 2518 3764 Pnt 1963 3814 Pnt 3035 3811 Pnt 2516 3803 Pnt 2635 3809 Pnt 3285 3809 Pnt 3443 3762 Pnt 2109 3766 Pnt 4178 3757 Pnt 2639 3767 Pnt 2686 3830 Pnt 2982 3750 Pnt 4259 3771 Pnt 2873 3814 Pnt 2162 3822 Pnt 3205 3790 Pnt 2914 3781 Pnt 3360 3781 Pnt 4158 3757 Pnt 2260 3801 Pnt 3276 3770 Pnt 3972 3778 Pnt 2752 3754 Pnt 3969 3790 Pnt 2923 3780 Pnt 2236 3779 Pnt 2752 3759 Pnt 2116 3802 Pnt 2138 3824 Pnt 3759 3779 Pnt 2462 3795 Pnt 2837 3812 Pnt 3633 3795 Pnt 2418 3786 Pnt 2904 3748 Pnt 2444 3785 Pnt 3299 3795 Pnt 2706 3854 Pnt 2371 3825 Pnt 3908 3780 Pnt 2814 3779 Pnt 3272 3780 Pnt 2675 3814 Pnt 3641 3789 Pnt 3135 3806 Pnt 2592 3803 Pnt 2637 3760 Pnt 3435 3807 Pnt 2832 3809 Pnt 3001 3804 Pnt 2851 3780 Pnt 2349 3864 Pnt 2752 3800 Pnt 3456 3850 Pnt 2664 3761 Pnt 2131 3846 Pnt 2547 3848 Pnt 3605 3771 Pnt 3652 3775 Pnt 2837 3804 Pnt 3150 3802 Pnt 2536 3751 Pnt 2718 3756 Pnt 4027 3751 Pnt 3023 3789 Pnt 1999 3802 Pnt 2798 3829 Pnt 2483 3804 Pnt 3107 3804 Pnt 2631 3775 Pnt 2635 3785 Pnt 2863 3831 Pnt 2896 3944 Pnt 2772 3879 Pnt 2097 3834 Pnt 3028 3799 Pnt 2436 3816 Pnt 2170 3780 Pnt 1950 3812 Pnt 3745 3816 Pnt 4120 3776 Pnt 3061 3811 Pnt 2933 3770 Pnt 2393 3843 Pnt 4082 3835 Pnt 2431 3900 Pnt 2198 3774 Pnt 4168 3757 Pnt 2897 3812 Pnt 2188 3786 Pnt 2741 3775 Pnt 4341 3816 Pnt 3468 3786 Pnt 1848 3783 Pnt 2918 3831 Pnt 2878 3784 Pnt 2842 3799 Pnt 2686 3795 Pnt 2433 3935 Pnt 2898 3775 Pnt 2691 3760 Pnt 2678 3816 Pnt 3440 3788 Pnt 2492 3770 Pnt 2555 3793 Pnt 2833 3771 Pnt 2522 3833 Pnt 2781 3833 Pnt 3150 3817 Pnt 3070 3802 Pnt 2887 3833 Pnt 1959 3892 Pnt 4181 3793 Pnt 2843 3792 Pnt 2166 3914 Pnt 2751 3828 Pnt 3291 3801 Pnt 2638 3771 Pnt 2763 3837 Pnt 2464 3797 Pnt 2599 3777 Pnt 2532 3766 Pnt 4099 3784 Pnt 3143 3770 Pnt 2717 3816 Pnt 3599 3766 Pnt 2818 3766 Pnt 2244 3782 Pnt 3262 3774 Pnt 2519 3780 Pnt 2334 3804 Pnt 3216 3770 Pnt 2954 3817 Pnt 2572 3789 Pnt 2883 3857 Pnt 2650 3807 Pnt 2560 3804 Pnt 2403 3774 Pnt 3006 3807 Pnt 2912 3774 Pnt 2195 3842 Pnt 2761 3798 Pnt 3938 3785 Pnt 3085 3785 Pnt 2538 3842 Pnt 2460 3832 Pnt 2699 3800 Pnt 2252 3832 Pnt 2693 3838 Pnt 2707 3774 Pnt 2597 3774 Pnt 2249 3811 Pnt 4103 3800 Pnt 3381 3784 Pnt 3173 3838 Pnt 3019 3759 Pnt 2749 3856 Pnt 2706 3781 Pnt 2386 3781 Pnt 2680 3804 Pnt 2456 3794 Pnt 3665 3792 Pnt 2951 3781 Pnt 2863 3755 Pnt 2294 3896 Pnt 2540 3841 Pnt 3133 3781 Pnt 2835 3786 Pnt 2757 3824 Pnt 2686 3804 Pnt 2115 3848 Pnt 3112 3789 Pnt 2380 3780 Pnt 3824 3821 Pnt 2910 3835 Pnt 3155 3777 Pnt 2783 3813 Pnt 2374 3806 Pnt 2929 3836 Pnt 2558 3756 Pnt 3104 3823 Pnt 2747 3762 Pnt 2095 3829 Pnt 2973 3761 Pnt 2591 3771 Pnt 2749 3813 Pnt 3278 3825 Pnt 4346 3762 Pnt 2835 3797 Pnt 2865 3809 Pnt 2561 3792 Pnt 2701 3747 Pnt 3361 3826 Pnt 3592 3747 Pnt 2148 3828 Pnt 3438 3827 Pnt 2618 3782 Pnt 4218 3827 Pnt 4469 3782 Pnt 2955 3812 Pnt 2825 3818 Pnt 3036 3778 Pnt 2355 3785 Pnt 2936 3799 Pnt 2485 3843 Pnt 2541 3837 Pnt 3441 3843 Pnt 2919 3800 Pnt 2623 3776 Pnt 3624 3778 Pnt 2624 3768 Pnt 2662 3815 Pnt 2368 3837 Pnt 1950 3816 Pnt 2572 3826 Pnt 2798 3777 Pnt 2740 3801 Pnt 2729 3836 Pnt 3470 3777 Pnt 2816 3847 Pnt 4439 3836 Pnt 2972 3775 Pnt 3454 3823 Pnt 2895 3823 Pnt 2853 3773 Pnt 2728 3758 Pnt 2499 3871 Pnt 2196 3771 Pnt 2973 3801 Pnt 3617 3771 Pnt 2313 3757 Pnt 2091 3850 Pnt 2079 3817 Pnt 3627 3757 Pnt 2311 3833 Pnt 2953 3751 Pnt 3023 3817 Pnt 2748 3772 Pnt 3290 3824 Pnt 2793 3822 Pnt 3003 3802 Pnt 2403 3797 Pnt 2962 3802 Pnt 1985 3775 Pnt 3163 3773 Pnt 3790 3785 Pnt 2921 3785 Pnt 2924 3767 Pnt 2710 3866 Pnt 2567 3809 Pnt 3856 3767 Pnt 2978 3756 Pnt 3856 3762 Pnt 3286 3768 Pnt 2666 3819 Pnt 2597 3790 Pnt 2935 3754 Pnt 2378 3803 Pnt 2524 3777 Pnt 3710 2858 Pnt 2707 3777 Pnt 2638 3773 Pnt 2559 3821 Pnt 2852 3790 Pnt 2741 3784 Pnt 2664 3864 Pnt 2463 3769 Pnt 2299 3809 Pnt 1964 3869 Pnt 2029 3792 Pnt 3968 3838 Pnt 2643 3799 Pnt 3577 3798 Pnt 2878 3815 Pnt 2766 3874 Pnt 3348 3768 Pnt 2561 3825 Pnt 2784 3799 Pnt 2595 3790 Pnt 2866 3874 Pnt 2314 3785 Pnt 3116 3807 Pnt 2764 3765 Pnt 3414 3823 Pnt 2744 3793 Pnt 2453 3868 Pnt 2744 3757 Pnt 2638 3769 Pnt 2388 3807 Pnt 2734 3757 Pnt 2162 3748 Pnt 3099 3847 Pnt 2357 3757 Pnt 2352 3833 Pnt 2877 3777 Pnt 2712 3816 Pnt 3171 3789 Pnt 2738 3786 Pnt 3319 3816 Pnt 2067 3763 Pnt 2279 3828 Pnt 4043 3776 Pnt 3209 3778 Pnt 2538 3797 Pnt 2715 3847 Pnt 3895 3804 Pnt 2948 3797 Pnt 2758 3777 Pnt 2322 3870 Pnt 2561 3801 Pnt 3414 3778 Pnt 3039 3828 Pnt 2532 3771 Pnt 2951 3834 Pnt 2531 3798 Pnt 3794 3802 Pnt 2889 3782 Pnt 2586 3818 Pnt 3677 3832 Pnt 2646 3818 Pnt 3478 3782 Pnt 2551 3818 Pnt 2981 3923 Pnt 2631 3812 Pnt 2022 3757 Pnt 3567 3812 Pnt 3151 3807 Pnt 3099 3766 Pnt 2492 3838 Pnt 3187 3779 Pnt 2946 3773 Pnt 3081 3803 Pnt 2770 3762 Pnt 2786 3809 Pnt 2517 3762 Pnt 3125 3820 Pnt 2037 3770 Pnt 3216 3809 Pnt 3052 3807 Pnt 3424 3769 Pnt 3778 3808 Pnt 2089 3796 Pnt 3931 3809 Pnt 2793 3796 Pnt 2781 3810 Pnt 2991 3793 Pnt 2764 3804 Pnt 4321 3767 Pnt 2729 3826 Pnt 2350 3852 Pnt 2150 3879 Pnt 2344 3828 Pnt 2711 3825 Pnt 3877 3791 Pnt 4402 3768 Pnt 2460 3833 Pnt 2924 3816 Pnt 2757 3806 Pnt 2205 3009 Pnt 2875 3854 Pnt 2652 3846 Pnt 2317 3858 Pnt 2531 3766 Pnt 2689 3759 Pnt 2889 3765 Pnt 3938 3844 Pnt 2740 3810 Pnt 3001 3765 Pnt 2338 3795 Pnt 2863 3766 Pnt 2997 3762 Pnt 2593 3813 Pnt 3240 3763 Pnt 2959 3810 Pnt 2245 3808 Pnt 2895 3771 Pnt 3124 3805 Pnt 2375 3812 Pnt 2873 3763 Pnt 2501 3810 Pnt 2198 3768 Pnt 3124 3797 Pnt 2619 3822 Pnt 3134 3768 Pnt 2180 3911 Pnt 1849 3798 Pnt 2516 3858 Pnt 3464 3760 Pnt 1983 3799 Pnt 3115 3765 Pnt 2650 3817 Pnt 2033 3775 Pnt 2812 3778 Pnt 2465 3806 Pnt 2197 3766 Pnt 3486 3836 Pnt 3325 3811 Pnt 2296 3812 Pnt 2249 3814 Pnt 3315 3836 Pnt 3006 3799 Pnt 3306 3783 Pnt 3125 3807 Pnt 3283 3830 Pnt 2977 3762 Pnt 3688 3830 Pnt 3906 3803 Pnt 2671 3777 Pnt 2591 3795 Pnt 2128 3813 Pnt 2853 3795 Pnt 2284 3818 Pnt 3341 3813 Pnt 2344 3790 Pnt 2941 3770 Pnt 2840 3789 Pnt 2597 3774 Pnt 2185 3776 Pnt 2699 3764 Pnt 2637 3784 Pnt 2324 3850 Pnt 2736 3800 Pnt 3204 3784 Pnt 2043 3810 Pnt 2850 3756 Pnt 2512 3803 Pnt 2081 3768 Pnt 3112 3814 Pnt 3005 3812 Pnt 2758 3812 Pnt 2718 3801 Pnt 2614 3837 Pnt 3538 3801 Pnt 4617 3793 Pnt 2527 3772 Pnt 3614 3799 Pnt 2698 3778 Pnt 2148 3799 Pnt 4355 3766 Pnt 2620 3796 Pnt 2360 3787 Pnt 3045 3796 Pnt 3581 3764 Pnt 2871 3811 Pnt 2680 3764 Pnt 2175 3766 Pnt 2904 3807 Pnt 2274 3948 Pnt 3328 3764 Pnt 2839 3803 Pnt 4017 3811 Pnt 2880 3781 Pnt 2137 3816 Pnt 3257 3814 Pnt 3199 3777 Pnt 2453 3788 Pnt 2675 3785 Pnt 2415 3810 Pnt 2786 3800 Pnt 2733 3773 Pnt 2656 3788 Pnt 2560 3805 Pnt 3068 3765 Pnt 2530 3773 Pnt 2066 3802 Pnt 2479 3839 Pnt 2762 3790 Pnt 2589 3777 Pnt 2370 3819 Pnt 3348 3820 Pnt 2912 3780 Pnt 2431 3762 Pnt 2893 3812 Pnt 4078 3780 Pnt 3283 3828 Pnt 2442 3818 Pnt 2901 3760 Pnt 3115 3785 Pnt 2570 3803 Pnt 2413 3836 Pnt 2570 3760 Pnt 2199 3788 Pnt 2896 3839 Pnt 4354 3785 Pnt 2467 3796 Pnt 4149 3803 Pnt 2537 3796 Pnt 3725 3864 Pnt 2967 3783 Pnt 2664 3797 Pnt 3595 3804 Pnt 2294 3841 Pnt 2494 3937 Pnt 3527 3841 Pnt 1984 3792 Pnt 2961 3775 Pnt 2374 3822 Pnt 3572 3778 Pnt 2466 3856 Pnt 3432 3825 Pnt 2793 3846 Pnt 2442 3786 Pnt 3400 3777 Pnt 2445 3804 Pnt 2511 3824 Pnt 2174 3811 Pnt 2488 3811 Pnt 3863 3854 Pnt 2619 3757 Pnt 3595 3775 Pnt 2835 3929 Pnt 2701 3822 Pnt 2605 3799 Pnt 2355 3843 Pnt 3484 3816 Pnt 2369 3809 Pnt 2672 3775 Pnt 2391 3829 Pnt 3137 3784 Pnt 3579 3784 Pnt 3005 3760 Pnt 2507 3804 Pnt 3895 3750 Pnt 2049 3816 Pnt 2913 3788 Pnt 2671 3840 Pnt 3648 3816 Pnt 2841 3763 Pnt 3219 3830 Pnt 3054 3854 Pnt 2632 3774 Pnt 2341 3825 Pnt 3235 3774 Pnt 3358 3831 Pnt 2188 3833 Pnt 4049 2922 Pnt 2324 3781 Pnt 2476 3789 Pnt 2282 3892 Pnt 2777 3800 Pnt 2222 3866 Pnt 4126 3833 Pnt 2541 3866 Pnt 3269 3807 Pnt 3626 3800 Pnt 3090 3771 Pnt 3534 3769 Pnt 2774 3763 Pnt 3560 3761 Pnt 2698 3804 Pnt 2343 3926 Pnt 4573 3784 Pnt 3281 3802 Pnt 2291 3799 Pnt 3422 3811 Pnt 3295 3811 Pnt 2054 3792 Pnt 3224 3811 Pnt 2718 3775 Pnt 2777 3775 Pnt 2377 3775 Pnt 2456 3751 Pnt 4325 3833 Pnt 2317 3781 Pnt 2860 3807 Pnt 3930 3794 Pnt 3547 3789 Pnt 2855 3805 Pnt 4356 3087 Pnt 2415 3798 Pnt 3961 3774 Pnt 2641 3782 Pnt 2341 3832 Pnt 2685 3766 Pnt 2730 3774 Pnt 3314 3790 Pnt 2761 3794 Pnt 2612 3784 Pnt 2738 3787 Pnt 3251 3814 Pnt 4092 3754 Pnt 2363 3904 Pnt 3054 3800 Pnt 2341 3825 Pnt 4374 3784 Pnt 2831 3759 Pnt 2435 3783 Pnt 2431 3845 Pnt 3402 3792 Pnt 2508 3779 Pnt 2484 3848 Pnt 2148 3788 Pnt 2338 3786 Pnt 4442 3779 Pnt 2636 3784 Pnt 2217 3808 Pnt 2998 3795 Pnt 3472 3784 Pnt 3486 3798 Pnt 2343 3763 Pnt 2660 3748 Pnt 2163 3778 Pnt 4360 2929 Pnt 2516 3801 Pnt 3113 3779 Pnt 2559 3785 Pnt 2734 3785 Pnt 3282 3788 Pnt 2516 3797 Pnt 2292 3843 Pnt 2355 3747 Pnt 2419 3821 Pnt 3185 3750 Pnt 2143 3809 Pnt 2889 3782 Pnt 3127 3834 Pnt 3065 3782 Pnt 2936 3764 Pnt 2841 3837 Pnt 4339 3764 Pnt 2631 3796 Pnt 2317 3837 Pnt 2088 3777 Pnt 4021 3792 Pnt 2194 3846 Pnt 2751 3804 Pnt 2783 3801 Pnt 3648 3792 Pnt 2673 3814 Pnt 2563 3823 Pnt 2035 3786 Pnt 3304 3777 Pnt 2734 3777 Pnt 4381 3758 Pnt 2707 3775 Pnt 2636 3814 Pnt 2482 3914 Pnt 3014 3778 Pnt 3195 3758 Pnt 2246 3820 Pnt 3074 3782 Pnt 2867 3763 Pnt 1934 3805 Pnt 2556 3763 Pnt 3340 3823 Pnt 3678 3799 Pnt 2704 3935 Pnt 2433 3824 Pnt 2397 3935 Pnt 3090 3807 Pnt 2134 3770 Pnt 2992 3778 Pnt 2892 3760 Pnt 2819 3807 Pnt 2629 3770 Pnt 2449 3754 Pnt 2403 3817 Pnt 2782 3770 Pnt 3117 3770 Pnt 2955 3757 Pnt 2592 3805 Pnt 4028 3757 Pnt 2666 3817 Pnt 3004 3761 Pnt 2235 3858 Pnt 2892 3944 Pnt 3406 3764 Pnt 3219 3761 Pnt 2950 3764 Pnt 2586 3881 Pnt 1956 3792 Pnt 3288 3764 Pnt 2187 3821 Pnt 2912 3881 Pnt 2267 3805 Pnt 2981 3834 Pnt 3678 3756 Pnt 3771 3811 Pnt 3197 3788 Pnt 2451 3816 Pnt 2941 3866 Pnt 2463 3785 Pnt 2923 3788 Pnt 3005 3864 Pnt 2051 3840 Pnt 3564 3789 Pnt 2689 3776 Pnt 4238 3771 Pnt 2597 3771 Pnt 2835 3798 Pnt 3148 3780 Pnt 3070 3798 Pnt 2270 3850 Pnt 2775 3773 Pnt 1966 3799 Pnt 2722 3774 Pnt 2628 3848 Pnt 2900 3829 Pnt 3939 3773 Pnt 4316 3773 Pnt 4807 3835 Pnt 3651 3835 Pnt 2959 3755 Pnt 3251 3813 Pnt 2785 3831 Pnt 3197 3841 Pnt 2691 3819 Pnt 2449 3774 Pnt 2891 3900 Pnt 2474 3793 Pnt 2836 3793 Pnt 2417 3804 Pnt 2661 3804 Pnt 2351 3805 Pnt 3356 3819 Pnt 3124 3760 Pnt 3591 3820 Pnt 2099 3795 Pnt 3963 3802 Pnt 3054 3800 Pnt 2761 3818 Pnt 2655 3789 Pnt 2367 3793 Pnt 2116 3785 Pnt 3211 3766 Pnt 3657 3802 Pnt 2794 3754 Pnt 2711 3791 Pnt 2621 3784 Pnt 3075 3793 Pnt 3041 3801 Pnt 2893 3766 Pnt 2204 3896 Pnt 3413 3800 Pnt 2667 3784 Pnt 2418 3841 Pnt 2834 3774 Pnt 2746 3802 Pnt 2665 3792 Pnt 2823 3773 Pnt 2719 3810 Pnt 3016 3816 Pnt 2308 3804 Pnt 2755 3832 Pnt 2800 3824 Pnt 3361 3824 Pnt 2780 3871 Pnt 1989 3780 Pnt 2405 3817 Pnt 3040 3766 Pnt 2276 3771 Pnt 2522 3801 Pnt 3164 3816 Pnt 4438 3801 Pnt 3294 3780 Pnt 3154 3762 Pnt 2171 3817 Pnt 4334 3768 Pnt 2266 3806 Pnt 3949 3799 Pnt 2112 3796 Pnt 2290 3829 Pnt 3439 3780 Pnt 3431 3015 Pnt 2666 3836 Pnt 3282 3838 Pnt 2511 3802 Pnt 3000 3779 Pnt 3156 3751 Pnt 2646 3810 Pnt 2634 3804 Pnt 2810 3752 Pnt 3058 3756 Pnt 2818 3772 Pnt 2595 3852 Pnt 2856 3852 Pnt 2659 3762 Pnt 1952 3879 Pnt 2559 3823 Pnt 2099 3842 Pnt 2201 3828 Pnt 2716 3797 Pnt 2132 3813 Pnt 3152 3797 Pnt 3176 3813 Pnt 2558 3807 Pnt 3123 3809 Pnt 2470 3807 Pnt 3224 3832 Pnt 3771 3791 Pnt 2911 3819 Pnt 2769 3779 Pnt 2617 3759 Pnt 3171 3827 Pnt 2451 3821 Pnt 2911 3770 Pnt 2449 3799 Pnt 2270 3856 Pnt 3064 3806 Pnt 2312 3770 Pnt 2479 3856 Pnt 4217 3786 Pnt 2485 3781 Pnt 2795 3797 Pnt 4356 3814 Pnt 2657 3844 Pnt 2504 3781 Pnt 1882 3780 Pnt 3133 3798 Pnt 2602 3844 Pnt 3110 3001 Pnt 2785 3759 Pnt 2403 3815 Pnt 2789 3776 Pnt 2628 3768 Pnt 2626 3771 Pnt 2632 3763 Pnt 3247 3790 Pnt 2143 3850 Pnt 2833 3768 Pnt 1800 3816 Pnt 2448 3790 Pnt 2087 3808 Pnt 4621 3795 Pnt 2585 3786 Pnt 2305 3757 Pnt 2650 3834 Pnt 2971 3784 Pnt 4049 3759 Pnt 2520 3807 Pnt 3294 3752 Pnt 3359 3749 Pnt 3247 3798 Pnt 2970 3780 Pnt 2741 3836 Pnt 2411 3799 Pnt 3437 3758 Pnt 3002 3782 Pnt 3073 3808 Pnt 2825 3822 Pnt 3168 3818 Pnt 1944 3829 Pnt 2594 3923 Pnt 2532 3765 Pnt 2744 3767 Pnt 3512 3773 Pnt 2704 3760 Pnt 2790 3810 Pnt 3711 3758 Pnt 4118 3930 Pnt 3749 3820 Pnt 2638 3782 Pnt 4641 3834 Pnt 2440 3803 Pnt 2652 3801 Pnt 3203 3782 Pnt 3191 3803 Pnt 3443 3829 Pnt 2380 3811 Pnt 3079 3805 Pnt 2527 3792 Pnt 3189 3790 Pnt 2188 3854 Pnt 2903 3781 Pnt 2087 3838 Pnt 3678 3790 Pnt 2638 3826 Pnt 3388 3809 Pnt 2692 3769 Pnt 2812 3858 Pnt 2794 3808 Pnt 2357 3811 Pnt 2600 3808 Pnt 2824 3777 Pnt 3027 3768 Pnt 3071 3777 Pnt 2443 3802 Pnt 2891 3796 Pnt 2916 3803 Pnt 2488 3813 Pnt 2363 3833 Pnt 1929 3812 Pnt 3774 3805 Pnt 2564 3790 Pnt 2600 3808 Pnt 3231 3808 Pnt 3054 3765 Pnt 2235 3868 Pnt 4343 3807 Pnt 2596 3765 Pnt 4102 3757 Pnt 2520 3754 Pnt 2475 3823 Pnt 2594 3758 Pnt 2690 3762 Pnt 2136 3754 Pnt 2221 3791 Pnt 3008 3805 Pnt 2993 3816 Pnt 2472 3813 Pnt 3167 3765 Pnt 2497 3778 Pnt 3120 3799 Pnt 3616 3763 Pnt 2596 3748 Pnt 4457 3762 Pnt 2231 3822 Pnt 2064 3763 Pnt 2716 3787 Pnt 2894 3841 Pnt 3560 3830 Pnt 2986 3847 Pnt 3537 3763 Pnt 2753 3778 Pnt 3941 3096 Pnt 2542 3843 Pnt 2877 3858 Pnt 2843 3797 Pnt 2749 3870 Pnt 2569 3815 Pnt 3163 3797 Pnt 2793 3828 Pnt 2292 3814 Pnt 2483 3771 Pnt 2375 3816 Pnt 2927 3830 Pnt 3142 3808 Pnt 2080 3811 Pnt 1959 3802 Pnt 2466 3818 Pnt 2483 3817 Pnt 2834 3819 Pnt 3014 3782 Pnt 2556 3776 Pnt 2579 3819 Pnt 3089 3768 Pnt 4055 3756 Pnt 4057 3755 Pnt 2593 3838 Pnt 2983 3778 Pnt 2656 3794 Pnt 2696 3838 Pnt 2681 3770 Pnt 2678 3779 Pnt 2420 3776 Pnt 3775 2912 Pnt 3283 3785 Pnt 2943 3764 Pnt 2540 3824 Pnt 3348 3763 Pnt 3790 3765 Pnt 2886 3789 Pnt 2196 3931 Pnt 2932 3783 Pnt 2720 3807 Pnt 2498 3762 Pnt 4329 3778 Pnt 2939 3779 Pnt 2796 3830 Pnt 3394 3864 Pnt 2588 3765 Pnt 3790 3856 Pnt 3985 3779 Pnt 2825 3778 Pnt 2412 3799 Pnt 2431 3841 Pnt 2472 3795 Pnt 2674 3798 Pnt 2953 3873 Pnt 3335 3789 Pnt 3239 3873 Pnt 2665 3777 Pnt 2984 3808 Pnt 2523 3837 Pnt 2795 3770 Pnt 2411 3756 Pnt 2186 3804 Pnt 2590 3766 Pnt 3579 3756 Pnt 3812 3807 Pnt 2610 3810 Pnt 2528 3757 Pnt 3085 3814 Pnt 3301 3757 Pnt 2485 3778 Pnt 2158 3811 Pnt 3164 3814 Pnt 2875 3787 Pnt 2672 3800 Pnt 3337 3808 Pnt 2669 3768 Pnt 4387 3851 Pnt 3026 3775 Pnt 3483 3779 Pnt 2862 3762 Pnt 2229 3948 Pnt 2383 3784 Pnt 2077 3911 Pnt 2847 3788 Pnt 3182 3796 Pnt 3738 3788 Pnt 3639 3778 Pnt 2457 3764 Pnt 3324 3817 Pnt 2974 3778 Pnt 3376 3760 Pnt 2805 3812 Pnt 2254 3866 Pnt 3040 3775 Pnt 2938 3758 Pnt 2469 3866 Pnt 2591 3892 Pnt 2700 3770 Pnt 2451 3833 Pnt 3136 3766 Pnt 2419 3766 Pnt 2440 3813 Pnt 2415 3827 Pnt 2775 3774 Pnt 3461 3827 Pnt 2643 3784 Pnt 1883 3784 Pnt 2736 3800 Pnt 2763 3762 Pnt 3913 3780 Pnt 2134 3796 Pnt 2300 3827 Pnt 3910 3780 Pnt 3288 3796 Pnt 2140 3788 Pnt 3011 3805 Pnt 2270 3801 Pnt 2678 3812 Pnt 2468 3786 Pnt 2284 3766 Pnt 2720 3777 Pnt 4210 3805 Pnt 2840 3803 Pnt 2447 3837 Pnt 3685 3777 Pnt 4193 3799 Pnt 2186 3847 Pnt 3244 3781 Pnt 3514 3792 Pnt 3105 3799 Pnt 2769 3764 Pnt 3267 3802 Pnt 2768 3807 Pnt 3470 3807 Pnt 2522 3800 Pnt 3590 3807 Pnt 3397 3800 Pnt 2610 3904 Pnt 3219 3825 Pnt 2215 3814 Pnt 3146 3773 Pnt 3717 3904 Pnt 2512 3784 Pnt 2658 3805 Pnt 2663 3782 Pnt 2175 3790 Pnt 2568 3824 Pnt 1952 3807 Pnt 2515 3825 Pnt 3521 3773 Pnt 2827 3805 Pnt 2900 3822 Pnt 2648 3758 Pnt 2777 3833 Pnt 2262 3851 Pnt 1983 3839 Pnt 3499 3872 Pnt 3210 3793 Pnt 2611 3796 Pnt 3349 3783 Pnt 2897 3827 Pnt 3381 3788 Pnt 3075 3793 Pnt 2199 3788 Pnt 3249 3807 Pnt 2567 3805 Pnt 2657 3797 Pnt 2368 3821 Pnt 4171 3783 Pnt 2011 3792 Pnt 2261 3811 Pnt 2929 3770 Pnt 2463 3848 Pnt 3528 3821 Pnt 2550 3829 Pnt 2472 3754 Pnt 3398 3829 Pnt 2831 3819 Pnt 3225 3792 Pnt 2877 3770 Pnt 3589 3777 Pnt 2376 3808 Pnt 2764 3811 Pnt 2099 3817 Pnt 2879 3777 Pnt 2852 3798 Pnt 2616 3822 Pnt 2477 3770 Pnt 2877 3780 Pnt 2260 3786 Pnt 2868 3782 Pnt 3423 3786 Pnt 2541 3789 Pnt 2769 3839 Pnt 2405 3785 Pnt 3206 3839 Pnt 2357 3836 Pnt 3245 3831 Pnt 3413 3788 Pnt 2818 3799 Pnt 2563 3825 Pnt 2827 3937 Pnt 3334 3841 Pnt 2734 3824 Pnt 2351 3793 Pnt 3934 3750 Pnt 2310 3841 Pnt 2732 3804 Pnt 2519 3929 Pnt 2235 3843 Pnt 1922 3809 Pnt 3074 3757 Pnt 3378 3782 Pnt 2599 3829 Pnt 2984 3811 Pnt 2610 3760 Pnt 2259 3811 Pnt 2124 3818 Pnt 2774 3818 Pnt 2053 3816 Pnt 4411 3756 Pnt 3070 3827 Pnt 3163 3784 Pnt 2685 3784 Pnt 4734 3764 Pnt 3273 3788 Pnt 2217 3820 Pnt 2853 3788 Pnt 2500 3854 Pnt 2296 3766 Pnt 2884 3840 Pnt 2375 3858 Pnt 4099 3789 Pnt 2722 3785 Pnt 2331 3853 Pnt 2597 3866 Pnt 4394 3770 Pnt 2787 3866 Pnt 2846 3844 Pnt 2526 3794 Pnt 3173 3844 Pnt 4247 3763 Pnt 2711 3798 Pnt 2543 3791 Pnt 2582 3810 Pnt 4032 3774 Pnt 2706 3784 Pnt 2550 3781 Pnt 2055 3914 Pnt 3056 3773 Pnt 2432 3832 Pnt 2196 3829 Pnt 3001 3911 Pnt 2761 3783 Pnt 3476 3771 Pnt 2670 3789 Pnt 2883 3821 Pnt 2529 3807 Pnt 2787 3800 Pnt 3201 3770 Pnt 2132 3782 Pnt 3558 3792 Pnt 2921 3763 Pnt 3625 3802 Pnt 2766 3776 Pnt 2498 3763 Pnt 3579 3795 Pnt 2037 3782 Pnt 2077 3842 Pnt 3299 3752 Pnt 2079 3779 Pnt 2988 3798 Pnt 2385 3935 Pnt 2880 3811 Pnt 2942 3783 Pnt 2022 3792 Pnt 2350 3824 Pnt 2119 3797 Pnt 2635 3807 Pnt 2772 3819 Pnt 2517 3770 Pnt 3611 3805 Pnt 2558 3775 Pnt 3080 3809 Pnt 2882 3763 Pnt 4441 3798 Pnt 2575 3787 Pnt 3828 3765 Pnt 3562 3166 Pnt 2587 3826 Pnt 3100 3775 Pnt 2374 3801 Pnt 3382 3800 Pnt 2739 3799 Pnt 3776 3826 Pnt 2460 3749 Pnt 3379 3789 Pnt 2636 3903 Pnt 2444 3751 Pnt 2778 3774 Pnt 3390 3775 Pnt 3632 3749 Pnt 3750 3762 Pnt 2960 3807 Pnt 3529 3792 Pnt 2659 3796 Pnt 2788 3793 Pnt 2529 3896 Pnt 3561 3763 Pnt 3569 3792 Pnt 4235 3775 Pnt 3253 3756 Pnt 4086 3852 Pnt 3613 3789 Pnt 2263 3811 Pnt 3978 3793 Pnt 2861 3757 Pnt 2731 3771 Pnt 2340 3820 Pnt 3874 3762 Pnt 2834 3783 Pnt 3307 3820 Pnt 2700 3796 Pnt 2682 3823 Pnt 2626 3796 Pnt 3119 3810 Pnt 3655 3761 Pnt 2337 3803 Pnt 2952 3755 Pnt 2179 3829 Pnt 2824 3881 Pnt 3013 3822 Pnt 2688 3831 Pnt 3739 3881 Pnt 3037 3792 Pnt 2451 3805 Pnt 2919 3820 Pnt 2354 3758 Pnt 2350 3841 Pnt 2191 3787 Pnt 2787 3778 Pnt 2421 3817 Pnt 4198 3765 Pnt 2721 3788 Pnt 2521 3790 Pnt 2999 3760 Pnt 2418 3773 Pnt 2969 3798 Pnt 2104 3771 Pnt 2440 3810 Pnt 2041 3854 Pnt 2384 3797 Pnt 3297 3810 Pnt 2924 3793 Pnt 2838 3864 Pnt 3052 3801 Pnt 2422 3841 Pnt 3163 3793 Pnt 2757 3864 Pnt 3210 3801 Pnt 3013 3804 Pnt 3024 3776 Pnt 2844 3780 Pnt 2764 3777 Pnt 2585 3811 Pnt 2302 3816 Pnt 2770 3789 Pnt 2613 3790 Pnt 3298 3780 Pnt 3062 3789 Pnt 2721 3801 Pnt 2691 3790 Pnt 2840 3841 Pnt 2933 3784 Pnt 2704 3790 Pnt 2845 3774 Pnt 3072 3832 Pnt 4453 3841 Pnt 3846 3790 Pnt 2850 3804 Pnt 3260 3788 Pnt 3189 3790 Pnt 2535 3808 Pnt 2963 3799 Pnt 2708 3769 Pnt 3269 3764 Pnt 2621 3808 Pnt 2577 3774 Pnt 3114 3816 Pnt 2496 3804 Pnt 1993 3777 Pnt 2687 3900 Pnt 3302 3772 Pnt 2909 3809 Pnt 2625 3858 Pnt 2929 3809 Pnt 2491 3808 Pnt 2853 3754 Pnt 1978 3810 Pnt 2989 3819 Pnt 2467 3808 Pnt 2884 3871 Pnt 2027 3805 Pnt 2743 3842 Pnt 3029 3786 Pnt 2664 3774 Pnt 2731 3802 Pnt 4228 3754 Pnt 2068 3780 Pnt 2112 3813 Pnt 2760 3804 Pnt 2839 3808 Pnt 3714 3819 Pnt 2670 3766 Pnt 2811 3768 Pnt 2640 3801 Pnt 3290 3763 Pnt 2058 3763 Pnt 2779 3802 Pnt 1959 3786 Pnt 3144 3772 Pnt 2581 3823 Pnt 2935 3797 Pnt 2314 3758 Pnt 2804 3796 Pnt 2773 3808 Pnt 2622 3812 Pnt 3080 3766 Pnt 2268 3817 Pnt 3891 3804 Pnt 2543 3787 Pnt 4097 3798 Pnt 2647 3787 Pnt 3308 3812 Pnt 2215 3802 Pnt 2732 3833 Pnt 2556 3763 Pnt 3127 3801 Pnt 3620 3763 Pnt 4311 3833 Pnt 2188 3828 Pnt 2851 3829 Pnt 2948 3823 Pnt 3537 3764 Pnt 2696 3800 Pnt 3717 3769 Pnt 3672 3770 Pnt 2379 3821 Pnt 2661 3758 Pnt 2334 3844 Pnt 2250 3802 Pnt 2794 3838 Pnt 2137 3805 Pnt 3659 3801 Pnt 2385 3870 Pnt 1890 3782 Pnt 2155 3781 Pnt 3339 3772 Pnt 2828 3870 Pnt 2233 3856 Pnt 1993 3818 Pnt 1842 3780 Pnt 2691 3841 Pnt 2895 3815 Pnt 3181 3841 Pnt 2680 3819 Pnt 3441 3799 Pnt 3211 3864 Pnt 2910 3819 Pnt 4095 3765 Pnt 2651 3848 Pnt 2638 3810 Pnt 2069 3838 Pnt 3419 3795 Pnt 2475 3781 Pnt 1903 3792 Pnt 3537 3059 Pnt 2946 3798 Pnt 3483 3812 Pnt 2623 3781 Pnt 3137 3848 Pnt 3099 3798 Pnt 2208 3771 Pnt 2950 3785 Pnt 2597 3778 Pnt 2755 3809 Pnt 2062 3803 Pnt 1675 3816 Pnt 3058 3824 Pnt 3131 3816 Pnt 2485 3880 Pnt 3839 3803 Pnt 3451 3789 Pnt 2468 3765 Pnt 2820 3837 Pnt 2468 3834 Pnt 2149 3806 Pnt 2845 3823 Pnt 2355 3802 Pnt 1978 3781 Pnt 2042 3808 Pnt 3287 3806 Pnt 3080 3804 Pnt 2826 3819 Pnt 2656 3789 Pnt 2290 3767 Pnt 2575 3786 Pnt 2717 3767 Pnt 3240 3789 Pnt 2706 3756 Pnt 2166 3931 Pnt 2729 3766 Pnt 2807 3827 Pnt 2519 3803 Pnt 2088 3804 Pnt 3699 3760 Pnt 2066 3788 Pnt 2629 3762 Pnt 2093 3748 Pnt 4178 3827 Pnt 3805 3779 Pnt 3190 3810 Pnt 2706 3805 Pnt 2731 3766 Pnt 2599 3776 Pnt 2511 3787 Pnt 3342 3779 Pnt 2770 3814 Pnt 2643 3805 Pnt 2110 3827 Pnt 2524 3777 Pnt 2709 3793 Pnt 2595 3816 Pnt 4163 3825 Pnt 2252 3790 Pnt 1817 3768 Pnt 2812 3816 Pnt 2272 3850 Pnt 2872 2872 Pnt 2219 3758 Pnt 2844 3849 Pnt 2853 3781 Pnt 2632 3788 Pnt 2575 3944 Pnt 3040 3816 Pnt 2518 3904 Pnt 2268 3911 Pnt 3385 3814 Pnt 3034 3904 Pnt 2501 3759 Pnt 2211 3784 Pnt 2377 3892 Pnt 1970 3803 Pnt 3543 3784 Pnt 2525 3816 Pnt 2210 3827 Pnt 3200 3766 Pnt 3630 3819 Pnt 4303 3787 Pnt 2893 3766 Pnt 2631 3784 Pnt 3013 3807 Pnt 2858 3835 Pnt 2294 3818 Pnt 3547 3819 Pnt 1940 3807 Pnt 2939 3778 Pnt 2892 3784 Pnt 2869 3803 Pnt 2261 3796 Pnt 2272 3930 Pnt 2342 3868 Pnt 2308 3822 Pnt 2582 3841 Pnt 2750 3813 Pnt 3385 3813 Pnt 2897 3835 Pnt 2426 3807 Pnt 3211 3822 Pnt 2655 3786 Pnt 3520 3807 Pnt 2606 3784 Pnt 3120 3806 Pnt 3035 3792 Pnt 3067 3826 Pnt 3248 3775 Pnt 2693 3762 Pnt 2384 3792 Pnt 3129 3779 Pnt 2196 3825 Pnt 3481 3782 Pnt 3022 3782 Pnt 2625 3812 Pnt 2521 3841 Pnt 2997 3793 Pnt 2563 3809 Pnt 2518 3848 Pnt 2833 3766 Pnt 1912 3821 Pnt 4423 3930 Pnt 3170 3829 Pnt 4348 3851 Pnt 2615 3757 Pnt 3074 3782 Pnt 2797 3759 Pnt 2651 3798 Pnt 2532 3815 Pnt 3125 3792 Pnt 2325 3827 Pnt 4001 3759 Pnt 3450 3778 Pnt 3973 3814 Pnt 2934 3757 Pnt 3441 3792 Pnt 2774 3758 Pnt 2558 3800 Pnt 2854 3777 Pnt 3128 3872 Pnt 3714 3817 Pnt 2273 3784 Pnt 3741 3799 Pnt 2248 3812 Pnt 3946 3777 Pnt 2934 3788 Pnt 3270 3807 Pnt 2575 3776 Pnt 3511 3788 Pnt 2575 3774 Pnt 2627 3809 Pnt 3599 3758 Pnt 3008 3809 Pnt 2786 3758 Pnt 2185 3866 Pnt 3136 3807 Pnt 3376 3775 Pnt 2193 3848 Pnt 2808 3866 Pnt 2528 3791 Pnt 2659 3779 Pnt 2221 3754 Pnt 2723 3799 Pnt 4203 3757 Pnt 2786 3793 Pnt 2847 3816 Pnt 1959 3813 Pnt 2978 3819 Pnt 2092 3811 Pnt 3474 3811 Pnt 2245 3816 Pnt 3207 3779 Pnt 3499 3816 Pnt 3443 3778 Pnt 2561 3773 Pnt 2654 3798 Pnt 2095 3804 Pnt 1988 3911 Pnt 2726 3822 Pnt 4554 3872 Pnt 3005 3828 Pnt 2558 3790 Pnt 2409 3841 Pnt 2742 3783 Pnt 4097 3791 Pnt 2114 3804 Pnt 3107 3783 Pnt 2610 3847 Pnt 4331 3770 Pnt 2367 3932 Pnt 3844 3804 Pnt 3640 3847 Pnt 3096 3834 Pnt 2233 3802 Pnt 2859 3763 Pnt 2159 3766 Pnt 2276 3843 Pnt 2603 3843 Pnt 3137 3773 Pnt 2568 3777 Pnt 3792 3788 Pnt 2361 3783 Pnt 2930 3807 Pnt 3385 3777 Pnt 2648 3802 Pnt 3122 3802 Pnt 2827 3796 Pnt 2669 3827 Pnt 3030 3762 Pnt 2852 3858 Pnt 2243 3815 Pnt 3962 3759 Pnt 2851 3798 Pnt 4005 3842 Pnt 2662 3797 Pnt 2365 3800 Pnt 3205 3770 Pnt 2909 3776 Pnt 2893 3777 Pnt 2596 3815 Pnt 3505 3786 Pnt 2552 3811 Pnt 2893 3832 Pnt 2173 3790 Pnt 2891 3798 Pnt 2162 3809 Pnt 2080 3782 Pnt 2215 3828 Pnt 2789 3832 Pnt 2431 3762 Pnt 2590 3810 Pnt 2246 3763 Pnt 2700 3829 Pnt 2884 3770 Pnt 2526 3762 Pnt 3087 3763 Pnt 2673 3822 Pnt 3290 3780 Pnt 3112 3811 Pnt 2329 3786 Pnt 3017 3789 Pnt 3136 3833 Pnt 2742 3830 Pnt 2633 3760 Pnt 3196 3795 Pnt 2611 3799 Pnt 3081 3780 Pnt 2621 3785 Pnt 2519 3785 Pnt 2520 3784 Pnt 2951 3823 Pnt 2436 3751 Pnt 1964 3796 Pnt 2960 3798 Pnt 2403 3774 Pnt 2557 3789 Pnt 2249 3820 Pnt 3160 3788 Pnt 2761 3775 Pnt 2486 3839 Pnt 2807 3776 Pnt 2555 3783 Pnt 2090 3818 Pnt 2379 3768 Pnt 3264 3845 Pnt 3167 3807 Pnt 3126 3801 Pnt 2453 3824 Pnt 2474 3794 Pnt 3072 3796 Pnt 2936 3840 Pnt 1962 3896 Pnt 3709 3792 Pnt 2099 3763 Pnt 3098 3765 Pnt 3069 3873 Pnt 2999 3792 Pnt 2863 3844 Pnt 2131 3776 Pnt 4659 3760 Pnt 2765 3756 Pnt 2993 3810 Pnt 2978 3801 Pnt 4396 3772 Pnt 2687 3753 Pnt 2651 3792 Pnt 3180 3780 Pnt 3483 3851 Pnt 2121 3847 Pnt 3574 3863 Pnt 3268 3832 Pnt 2409 3765 Pnt 2276 3828 Pnt 4191 3027 Pnt 2651 3771 Pnt 2732 3816 Pnt 2456 3826 Pnt 3167 3764 Pnt 3195 3802 Pnt 2699 3769 Pnt 3121 3764 Pnt 2604 3801 Pnt 2079 3809 Pnt 4608 2907 Pnt 2309 3903 Pnt 4180 3764 Pnt 3052 3784 Pnt 2854 3809 Pnt 3255 2964 Pnt 2954 3793 Pnt 2964 3757 Pnt 2849 3854 Pnt 4255 3788 Pnt 2119 3819 Pnt 3156 3819 Pnt 2902 3788 Pnt 2516 3820 Pnt 3756 3039 Pnt 2860 3808 Pnt 2572 3827 Pnt 2144 3759 Pnt 2647 3807 Pnt 2098 3820 Pnt 2752 3774 Pnt 3983 3771 Pnt 2423 3793 Pnt 3303 3770 Pnt 2843 3777 Pnt 2589 3809 Pnt 2582 3782 Pnt 2467 3824 Pnt 2134 3772 Pnt 3420 3760 Pnt 2088 3804 Pnt 3027 3858 Pnt 2421 3858 Pnt 3904 3812 Pnt 2402 3797 Pnt 3078 3812 Pnt 2278 3839 Pnt 3029 3804 Pnt 2444 3829 Pnt 2682 3811 Pnt 2902 3760 Pnt 2116 3804 Pnt 2792 3881 Pnt 2973 3799 Pnt 2303 3782 Pnt 3933 3774 Pnt 2428 3812 Pnt 2021 3900 Pnt 3268 3780 Pnt 2554 3809 Pnt 3600 3778 Pnt 4058 3809 Pnt 2160 3808 Pnt 3331 3767 Pnt 2367 3802 Pnt 4152 3802 Pnt 3362 3808 Pnt 2845 3772 Pnt 2753 3842 Pnt 2448 3811 Pnt 3560 3842 Pnt 2985 3772 Pnt 2753 3816 Pnt 2673 3766 Pnt 2499 3836 Pnt 2643 3789 Pnt 3274 3770 Pnt 2791 3782 Pnt 2581 3789 Pnt 2939 3758 Pnt 2697 3763 Pnt 2313 3802 Pnt 4197 3762 Pnt 2416 3766 Pnt 3506 3802 Pnt 1974 3792 Pnt 3070 3763 Pnt 2844 3767 Pnt 3387 3771 Pnt 4779 3806 Pnt 2357 3844 Pnt 3324 3763 Pnt 3664 3770 Pnt 2920 3828 Pnt 3300 3772 Pnt 2541 3802 Pnt 2005 3782 Pnt 3454 3806 Pnt 2671 3821 Pnt 3347 3782 Pnt 2100 3795 Pnt 2736 3824 Pnt 2029 3842 Pnt 2185 3770 Pnt 2918 3817 Pnt 2466 3870 Pnt 2310 3870 Pnt 3008 3880 Pnt 2710 3821 Pnt 2526 3804 Pnt 2458 3799 Pnt 2976 3775 Pnt 2176 3819 Pnt 2757 3854 Pnt 3821 3838 Pnt 1988 3834 Pnt 2201 3787 Pnt 3396 3822 Pnt 1921 3781 Pnt 2780 3802 Pnt 2272 3767 Pnt 2822 3778 Pnt 3174 3796 Pnt 2708 3831 Pnt 3086 3796 Pnt 2068 3825 Pnt 2992 3779 Pnt 2101 3770 Pnt 2430 3786 Pnt 2573 3816 Pnt 3088 3848 Pnt 2926 3819 Pnt 2540 3773 Pnt 3070 3819 Pnt 4385 3771 Pnt 2369 3798 Pnt 2785 3798 Pnt 2606 3830 Pnt 3047 3849 Pnt 2911 3833 Pnt 4442 3799 Pnt 2374 3801 Pnt 4015 3832 Pnt 2276 3824 Pnt 3244 3821 Pnt 2133 3811 Pnt 2611 3811 Pnt 1918 3809 Pnt 3660 3779 Pnt 3568 3788 Pnt 2704 3768 Pnt 2432 3814 Pnt 3643 3766 Pnt 2996 3866 Pnt 2740 3803 Pnt 3481 3814 Pnt 2599 3763 Pnt 3685 3795 Pnt 2299 3779 Pnt 2861 3820 Pnt 3402 3816 Pnt 3100 3784 Pnt 3151 3779 Pnt 2702 3805 Pnt 3503 3772 Pnt 2156 3807 Pnt 3308 3795 Pnt 3928 3775 Pnt 2763 3860 Pnt 2555 3836 Pnt 2980 3805 Pnt 1940 3818 Pnt 3620 3795 Pnt 3148 3816 Pnt 2796 3810 Pnt 3300 3778 Pnt 2464 3786 Pnt 2215 3874 Pnt 2147 3797 Pnt 1939 3830 Pnt 2298 3925 Pnt 2407 3868 Pnt 2702 3811 Pnt 3622 3801 Pnt 3845 3796 Pnt 2490 3827 Pnt 3026 3813 Pnt 3328 3828 Pnt 2708 3812 Pnt 2689 3788 Pnt 3178 3788 Pnt 3184 3794 Pnt 2395 3812 Pnt 2979 3775 Pnt 4090 3805 Pnt 2567 3782 Pnt 2600 3784 Pnt 3023 3801 Pnt 2399 3822 Pnt 2837 3809 Pnt 2251 3811 Pnt 3275 3822 Pnt 2337 3819 Pnt 4203 3778 Pnt 2043 3829 Pnt 3272 3829 Pnt 2635 3757 Pnt 3160 3793 Pnt 2867 3823 Pnt 2432 3807 Pnt 3599 3825 Pnt 2969 3783 Pnt 2546 3783 Pnt 3071 3814 Pnt 4024 3790 Pnt 2902 3911 Pnt 3144 3767 Pnt 2391 3786 Pnt 2823 3788 Pnt 3347 3822 Pnt 3031 3814 Pnt 2733 3767 Pnt 2866 3792 Pnt 2655 3838 Pnt 3427 3775 Pnt 2347 3892 Pnt 2791 3782 Pnt 3030 3839 Pnt 2395 3815 Pnt 3390 3782 Pnt 2292 3827 Pnt 3051 3828 Pnt 3037 3777 Pnt 3252 3831 Pnt 3973 3775 Pnt 2753 3777 Pnt 3210 3766 Pnt 3656 3807 Pnt 2652 3758 Pnt 1997 3810 Pnt 4317 3775 Pnt 2948 3790 Pnt 2970 3775 Pnt 2495 3808 Pnt 3080 3790 Pnt 2832 3788 Pnt 3034 3786 Pnt 2727 3758 Pnt 2854 3764 Pnt 3105 3799 Pnt 2192 3810 Pnt 2784 3806 Pnt 2317 3792 Pnt 2630 3773 Pnt 2583 3841 Pnt 2781 3864 Pnt 2722 3779 Pnt 2490 3816 Pnt 2904 3800 Pnt 2843 3801 Pnt 2373 3819 Pnt 3635 3779 Pnt 2299 3822 Pnt 1827 3771 Pnt 4031 3763 Pnt 2148 3787 Pnt 2598 3763 Pnt 1892 3811 Pnt 2190 3825 Pnt 2314 3841 Pnt 3686 3771 Pnt 2998 3785 Pnt 3305 3830 Pnt 2860 3785 Pnt 3056 3798 Pnt 2615 3812 Pnt 2436 3771 Pnt 2813 3813 Pnt 3272 3783 Pnt 2539 3812 Pnt 2281 3841 Pnt 4538 3770 Pnt 3229 3788 Pnt 2569 3843 Pnt 2959 3841 Pnt 2527 3834 Pnt 2775 3848 Pnt 2630 3815 Pnt 2410 3803 Pnt 3456 3843 Pnt 2512 3843 Pnt 2604 3823 Pnt 2446 3802 Pnt 2350 3767 Pnt 2795 3764 Pnt 4031 3774 Pnt 3157 3774 Pnt 2432 3800 Pnt 3090 3767 Pnt 2607 3865 Pnt 2256 3757 Pnt 3402 3834 Pnt 2836 3776 Pnt 2385 3777 Pnt 2980 3823 Pnt 2881 3871 Pnt 3295 3798 Pnt 2759 3773 Pnt 2600 3800 Pnt 2506 3827 Pnt 2223 3783 Pnt 2583 3834 Pnt 2814 3761 Pnt 2401 3816 Pnt 2910 3827 Pnt 2598 3815 Pnt 2485 3852 Pnt 2071 3806 Pnt 2916 3786 Pnt 2549 3780 Pnt 2490 3858 Pnt 2571 3798 Pnt 2546 3765 Pnt 2541 3811 Pnt 3108 3833 Pnt 4059 3822 Pnt 2732 3776 Pnt 2483 3777 Pnt 3086 3784 Pnt 2606 3782 Pnt 2270 3787 Pnt 3785 3784 Pnt 2684 3801 Pnt 2336 3785 Pnt 2800 3798 Pnt 2198 3819 Pnt 3405 3799 Pnt 3202 3781 Pnt 3051 3789 Pnt 2553 3776 Pnt 2523 3841 Pnt 2058 3810 Pnt 2595 3776 Pnt 3005 3777 Pnt 2303 3763 Pnt 2127 3779 Pnt 2841 3774 Pnt 2189 3829 Pnt 2527 3809 Pnt 2797 3804 Pnt 1969 3790 Pnt 3889 3779 Pnt 3788 3798 Pnt 2550 3783 Pnt 3359 3779 Pnt 4077 3805 Pnt 2990 3802 Pnt 2954 3800 Pnt 3532 3802 Pnt 2948 3789 Pnt 2280 3810 Pnt 3021 3804 Pnt 3178 3756 Pnt 2828 3786 Pnt 2807 3784 Pnt 3110 3804 Pnt 2989 3782 Pnt 3264 3787 Pnt 2154 3819 Pnt 3071 3776 Pnt 2890 3844 Pnt 1983 3896 Pnt 2763 3780 Pnt 3447 3762 Pnt 3799 3808 Pnt 3055 3839 Pnt 3277 3788 Pnt 2418 3930 Pnt 4263 3763 Pnt 3054 3863 Pnt 3356 3016 Pnt 2590 3833 Pnt 2093 3826 Pnt 2414 3824 Pnt 2111 3792 Pnt 3432 3824 Pnt 3213 3764 Pnt 3402 3829 Pnt 2600 3759 Pnt 2061 3809 Pnt 4173 3790 Pnt 3992 3774 Pnt 3280 3873 Pnt 2143 3801 Pnt 3081 3785 Pnt 3055 3854 Pnt 2626 3816 Pnt 2763 3751 Pnt 3098 3789 Pnt 2667 3801 Pnt 2393 3774 Pnt 3288 3789 Pnt 2590 3769 Pnt 2875 3864 Pnt 2599 3775 Pnt 2813 3862 Pnt 2511 3766 Pnt 2015 3759 Pnt 3330 3793 Pnt 3016 3839 Pnt 2534 3763 Pnt 1993 3819 Pnt 2715 3784 Pnt 3192 3819 Pnt 1992 3838 Pnt 2814 3783 Pnt 4352 3779 Pnt 2443 3827 Pnt 4114 3816 Pnt 2628 3809 Pnt 2882 3786 Pnt 2741 3773 Pnt 3172 3003 Pnt 2450 3858 Pnt 3245 3788 Pnt 2316 3903 Pnt 3189 3798 Pnt 2495 3903 Pnt 3269 3797 Pnt 3283 3810 Pnt 3156 3800 Pnt 3408 3805 Pnt 2664 3820 Pnt 3217 3837 Pnt 1887 3783 Pnt 2437 3781 Pnt 2125 3804 Pnt 2456 3789 Pnt 4036 3788 Pnt 4187 3757 Pnt 2358 3795 Pnt 2599 3932 Pnt 2985 3769 Pnt 3253 3753 Pnt 2854 3836 Pnt 2342 3760 Pnt 2878 3814 Pnt 2706 3748 Pnt 3945 3801 Pnt 2636 3807 Pnt 2842 3792 Pnt 2625 3808 Pnt 2880 3767 Pnt 3892 3748 Pnt 2027 3807 Pnt 2845 3781 Pnt 2422 3781 Pnt 2414 3796 Pnt 2348 3824 Pnt 3923 3824 Pnt 2781 3775 Pnt 3353 3818 Pnt 2551 3786 Pnt 3130 3760 Pnt 4261 3766 Pnt 4069 3776 Pnt 2163 3839 Pnt 2734 3805 Pnt 1923 3829 Pnt 3812 3058 Pnt 3116 3821 Pnt 3963 3770 Pnt 2536 3825 Pnt 2545 3811 Pnt 2868 3814 Pnt 2999 3811 Pnt 2697 3793 Pnt 3197 3804 Pnt 2829 3815 Pnt 2571 3804 Pnt 4406 3814 Pnt 2046 3804 Pnt 3336 3815 Pnt 3870 3770 Pnt 2818 3760 Pnt 2218 3770 Pnt 3216 3807 Pnt 2793 3794 Pnt 3516 3038 Pnt 2597 3794 Pnt 2476 3774 Pnt 3038 3881 Pnt 2542 3944 Pnt 3033 3881 Pnt 2692 3812 Pnt 2043 3904 Pnt 2681 3898 Pnt 4344 3794 Pnt 2649 3773 Pnt 2550 3809 Pnt 2720 3847 Pnt 2990 3807 Pnt 2483 3799 Pnt 2513 3842 Pnt 3139 3807 Pnt 2820 3801 Pnt 2507 3811 Pnt 2388 3782 Pnt 2756 3811 Pnt 4092 3758 Pnt 2652 3810 Pnt 2666 3768 Pnt 1996 3770 Pnt 2966 3770 Pnt 3618 3819 Pnt 2285 3799 Pnt 2707 3777 Pnt 3122 3816 Pnt 2340 3829 Pnt 3130 3816 Pnt 2893 3782 Pnt 2676 3763 Pnt 2373 3803 Pnt 3452 3763 Pnt 2907 3778 Pnt 4335 3765 Pnt 2943 3822 Pnt 2243 3799 Pnt 2651 3841 Pnt 3178 3835 Pnt 2310 3758 Pnt 2895 3751 Pnt 3222 3835 Pnt 3537 3765 Pnt 3096 3800 Pnt 3294 3777 Pnt 2442 3786 Pnt 3757 3834 Pnt 2523 3807 Pnt 2099 3874 Pnt 3911 3802 Pnt 2377 3829 Pnt 2763 3763 Pnt 2794 3867 Pnt 2671 3873 Pnt 2605 3925 Pnt 4042 3787 Pnt 4217 3763 Pnt 2498 3873 Pnt 2174 3798 Pnt 2126 3795 Pnt 2313 3812 Pnt 3258 3811 Pnt 2712 3817 Pnt 3001 3792 Pnt 2594 3778 Pnt 2580 3813 Pnt 4166 3778 Pnt 2347 3780 Pnt 2882 3870 Pnt 2764 3792 Pnt 2836 3798 Pnt 2157 3935 Pnt 3722 3811 Pnt 4073 3805 Pnt 3193 3937 Pnt 2779 3782 Pnt 2945 3775 Pnt 3336 3782 Pnt 3214 3819 Pnt 2937 3772 Pnt 1985 3811 Pnt 4370 3775 Pnt 2171 3937 Pnt 2959 3854 Pnt 1991 3802 Pnt 2001 3829 Pnt 3611 3801 Pnt 2025 3781 Pnt 2416 3852 Pnt 3689 3772 Pnt 2801 3831 Pnt 2815 3834 Pnt 2586 3798 Pnt 2045 3809 Pnt 2423 3798 Pnt 2304 3784 Pnt 2301 3824 Pnt 2858 3841 Pnt 3120 3781 Pnt 2762 3814 Pnt 3237 3781 Pnt 2315 3835 Pnt 4318 3792 Pnt 2772 3812 Pnt 2527 3779 Pnt 4007 3849 Pnt 2355 3820 Pnt 2415 3777 Pnt 3146 3803 Pnt 2196 3779 Pnt 4144 3754 Pnt 3222 3779 Pnt 2437 3810 Pnt 3374 3789 Pnt 3242 3810 Pnt 2737 3807 Pnt 3710 3872 Pnt 2664 3800 Pnt 2059 3788 Pnt 3647 3760 Pnt 2728 3872 Pnt 3178 3760 Pnt 1937 3807 Pnt 2903 3799 Pnt 2109 3866 Pnt 4452 3779 Pnt 4164 3824 Pnt 2041 3787 Pnt 2232 3848 Pnt 3247 3805 Pnt 2649 3836 Pnt 2278 3763 Pnt 3047 3829 Pnt 2377 3816 Pnt 2865 3763 Pnt 1809 3771 Pnt 2676 3834 Pnt 2666 3834 Pnt 2977 3828 Pnt 2386 3765 Pnt 3170 3830 Pnt 3075 3794 Pnt 2929 3830 Pnt 3218 3771 Pnt 2567 3812 Pnt 2938 3788 Pnt 4156 3792 Pnt 2763 3852 Pnt 2338 3788 Pnt 3152 3802 Pnt 3704 3852 Pnt 2940 3806 Pnt 2760 3806 Pnt 2562 3843 Pnt 2637 3911 Pnt 3349 3913 Pnt 3184 3834 Pnt 4431 3776 Pnt 3390 3769 Pnt 3225 3828 Pnt 2764 3823 Pnt 2083 3911 Pnt 2375 3813 Pnt 2728 3841 Pnt 2278 3834 Pnt 2961 3847 Pnt 3246 3814 Pnt 2892 3761 Pnt 2220 3822 Pnt 2815 3759 Pnt 2534 3810 Pnt 2026 3809 Pnt 2696 3809 Pnt 2032 3807 Pnt 2309 3785 Pnt 4137 3058 Pnt 3228 3780 Pnt 3257 3839 Pnt 2750 3781 Pnt 4559 3767 Pnt 4124 3798 Pnt 2752 3825 Pnt 3097 3839 Pnt 2839 3798 Pnt 2626 3828 Pnt 3014 3827 Pnt 2702 3830 Pnt 3123 3795 Pnt 3148 3777 Pnt 2775 3789 Pnt 3861 3760 Pnt 2944 3777 Pnt 2005 3892 Pnt 3005 3814 Pnt 2455 3797 Pnt 3569 3851 Pnt 2841 3775 Pnt 3122 3797 Pnt 2785 3780 Pnt 2153 3782 Pnt 2758 3786 Pnt 1914 3796 Pnt 3724 3828 Pnt 2825 3800 Pnt 2354 3772 Pnt 2354 3798 Pnt 2324 3776 Pnt 2655 3826 Pnt 2095 3801 Pnt 2735 3801 Pnt 3629 3776 Pnt 4723 3804 Pnt 2879 3826 Pnt 2799 3782 Pnt 2905 3813 Pnt 2779 3777 Pnt 3452 3814 Pnt 2336 3799 Pnt 2800 3785 Pnt 2753 3788 Pnt 4012 3784 Pnt 3005 3831 Pnt 2124 3855 Pnt 3705 3790 Pnt 2581 3776 Pnt 3337 3785 Pnt 2949 3793 Pnt 2057 3751 Pnt 2202 3756 Pnt 2102 3818 Pnt 3110 3742 Pnt 2770 3789 Pnt 3935 3783 Pnt 2442 3783 Pnt 2820 3767 Pnt 2046 3769 Pnt 2646 3813 Pnt 3893 3783 Pnt 3551 3843 Pnt 3186 3771 Pnt 4254 3785 Pnt 2123 3776 Pnt 3225 3788 Pnt 2815 3794 Pnt 2386 3757 Pnt 3472 3785 Pnt 3682 3789 Pnt 2454 3767 Pnt 3443 3788 Pnt 3330 3754 Pnt 2691 3775 Pnt 2581 3763 Pnt 3020 3773 Pnt 2071 3819 Pnt 3104 3786 Pnt 2552 3762 Pnt 2681 3777 Pnt 2323 3834 Pnt 4284 3770 Pnt 2399 3798 Pnt 3491 3804 Pnt 2396 3777 Pnt 2656 3777 Pnt 2759 3772 Pnt 2812 3809 Pnt 2769 3875 Pnt 2631 3816 Pnt 2370 3784 Pnt 3272 3875 Pnt 2551 3772 Pnt 2558 3785 Pnt 1889 3782 Pnt 2714 3761 Pnt 2494 3808 Pnt 3441 3786 Pnt 2392 3829 Pnt 2674 3788 Pnt 2513 3811 Pnt 3407 3830 Pnt 1872 3810 Pnt 3866 3782 Pnt 3251 3806 Pnt 4365 3761 Pnt 2597 3809 Pnt 2204 3903 Pnt 2969 3779 Pnt 2675 3801 Pnt 2678 3880 Pnt 3082 3819 Pnt 2124 3793 Pnt 2620 3805 Pnt 2543 3808 Pnt 3807 3801 Pnt 3527 3788 Pnt 2746 3802 Pnt 3305 3805 Pnt 2597 3781 Pnt 2962 3753 Pnt 2744 3826 Pnt 3521 3790 Pnt 2790 3753 Pnt 2999 3822 Pnt 2642 3790 Pnt 3290 3798 Pnt 2295 3758 Pnt 2943 3836 Pnt 2841 3798 Pnt 2844 3838 Pnt 2665 3774 Pnt 3031 3758 Pnt 2752 3797 Pnt 3009 3838 Pnt 2791 3815 Pnt 2142 3819 Pnt 2815 3807 Pnt 3836 3793 Pnt 1991 3847 Pnt 4031 3839 Pnt 2426 3788 Pnt 2466 3813 Pnt 2089 3787 Pnt 2710 3841 Pnt 3212 3808 Pnt 3029 3784 Pnt 2712 3841 Pnt 2467 3827 Pnt 2972 3827 Pnt 3300 3784 Pnt 2570 3767 Pnt 2311 3824 Pnt 3772 3863 Pnt 2510 3863 Pnt 4107 3828 Pnt 3317 3774 Pnt 2466 3808 Pnt 2658 3830 Pnt 3275 3824 Pnt 2735 3805 Pnt 2233 3857 Pnt 2159 3801 Pnt 3142 3759 Pnt 3048 3801 Pnt 3724 3826 Pnt 2523 3800 Pnt 2367 3798 Pnt 3145 3785 Pnt 2041 3814 Pnt 4165 3811 Pnt 2349 3798 Pnt 2618 3782 Pnt 2790 3800 Pnt 2746 3774 Pnt 2829 3860 Pnt 3659 3800 Pnt 2680 3811 Pnt 2619 3848 Pnt 3776 3777 Pnt 2108 3839 Pnt 3026 3757 Pnt 2430 3833 Pnt 2132 3788 Pnt 2864 3842 Pnt 2613 3775 Pnt 2103 3805 Pnt 2699 3771 Pnt 4571 3783 Pnt 2543 3802 Pnt 2749 3777 Pnt 2854 3829 Pnt 3745 3833 Pnt 2639 3810 Pnt 2884 3807 Pnt 2688 3767 Pnt 2371 3807 Pnt 1944 3821 Pnt 2800 3809 Pnt 2499 3807 Pnt 2402 3841 Pnt 3049 3808 Pnt 2433 3825 Pnt 2728 3800 Pnt 2332 3766 Pnt 3104 3775 Pnt 2616 3766 Pnt 3227 3774 Pnt 3370 3800 Pnt 3125 3771 Pnt 2798 3759 Pnt 2715 3811 Pnt 2767 3774 Pnt 2652 3796 Pnt 3315 3814 Pnt 2099 3822 Pnt 3187 3760 Pnt 2879 3843 Pnt 2653 3827 Pnt 3362 3764 Pnt 2739 3794 Pnt 2391 3813 Pnt 2127 3814 Pnt 2530 3779 Pnt 2364 3806 Pnt 3330 3763 Pnt 3508 3779 Pnt 2177 3881 Pnt 2665 3806 Pnt 3800 3764 Pnt 2821 3780 Pnt 2139 3848 Pnt 2783 3810 Pnt 2217 3841 Pnt 2906 3770 Pnt 2270 3898 Pnt 2744 3858 Pnt 3590 3774 Pnt 2565 3773 Pnt 2940 3898 Pnt 2761 3856 Pnt 2835 3809 Pnt 2610 3798 Pnt 2197 3864 Pnt 1935 3773 Pnt 2646 3902 Pnt 2184 3761 Pnt 3102 3774 Pnt 2528 3818 Pnt 4567 3768 Pnt 2893 3781 Pnt 2006 3811 Pnt 2894 3764 Pnt 2456 3771 Pnt 3070 3779 Pnt 2412 3784 Pnt 2910 3845 Pnt 2553 3771 Pnt 2776 3779 Pnt 2609 3822 Pnt 2609 3776 Pnt 3533 3792 Pnt 2577 3858 Pnt 2777 3776 Pnt 2434 3798 Pnt 2585 3812 Pnt 2985 3769 Pnt 2155 3799 Pnt 2392 3841 Pnt 3508 3777 Pnt 2566 3825 Pnt 2324 3760 Pnt 2804 3798 Pnt 3624 3798 Pnt 3947 3798 Pnt 3293 3801 Pnt 4371 3151 Pnt 2679 3828 Pnt 2186 3823 Pnt 3430 3801 Pnt 2312 3800 Pnt 2386 3792 Pnt 1820 3841 Pnt 3341 3812 Pnt 2982 3814 Pnt 3716 3756 Pnt 2605 3792 Pnt 2983 3793 Pnt 2663 3838 Pnt 2636 3807 Pnt 2679 3799 Pnt 2566 3870 Pnt 2027 3804 Pnt 4065 3834 Pnt 2796 3806 Pnt 2572 3759 Pnt 2419 3798 Pnt 2520 3806 Pnt 2689 3767 Pnt 3413 3806 Pnt 2430 3930 Pnt 3115 3835 Pnt 2655 3937 Pnt 2965 3792 Pnt 2800 3781 Pnt 2237 3795 Pnt 2408 3796 Pnt 2850 3782 Pnt 2309 3824 Pnt 2250 3932 Pnt 3601 3937 Pnt 1959 3937 Pnt 2628 3778 Pnt 2328 3775 Pnt 3499 3783 Pnt 3018 3775 Pnt 2448 3809 Pnt 3338 3748 Pnt 2493 3815 Pnt 3225 3772 Pnt 2550 3808 Pnt 2946 3786 Pnt 2671 3770 Pnt 2803 3760 Pnt 2439 3760 Pnt 3120 3763 Pnt 4517 3756 Pnt 2887 3807 Pnt 3673 3764 Pnt 2403 3766 Pnt 3126 3779 Pnt 2567 3794 Pnt 2518 3773 Pnt 2673 3844 Pnt 2365 3799 Pnt 2504 3844 Pnt 2872 3801 Pnt 3717 3835 Pnt 2959 3847 Pnt 2845 3811 Pnt 2749 3803 Pnt 2572 3807 Pnt 3845 3832 Pnt 2551 3802 Pnt 2819 3776 Pnt 2765 3820 Pnt 2612 3773 Pnt 2814 3782 Pnt 2142 3744 Pnt 3876 3827 Pnt 2763 3784 Pnt 3305 3867 Pnt 2754 3814 Pnt 2332 3817 Pnt 2217 3796 Pnt 3215 3789 Pnt 3766 3800 Pnt 2867 3778 Pnt 2244 3829 Pnt 2522 3800 Pnt 3320 3799 Pnt 3109 3852 Pnt 2851 3799 Pnt 2929 3872 Pnt 2760 3775 Pnt 2416 3831 Pnt 3130 3803 Pnt 2610 3777 Pnt 2496 3809 Pnt 3387 3763 Pnt 3328 3801 Pnt 2286 3816 Pnt 2204 3798 Pnt 2947 3792 Pnt 2287 3856 Pnt 2865 3842 Pnt 4290 3810 Pnt 2294 3812 Pnt 2672 3763 Pnt 2935 3804 Pnt 3838 2985 Pnt 2962 3774 Pnt 3749 3813 Pnt 3712 3808 Pnt 2619 3763 Pnt 2388 3941 Pnt 3026 3771 Pnt 3404 3773 Pnt 2496 3759 Pnt 2886 3778 Pnt 2289 3799 Pnt 2488 3795 Pnt 3079 3854 Pnt 2863 3836 Pnt 2950 3809 Pnt 2351 3816 Pnt 2749 3834 Pnt 2597 3822 Pnt 4062 3836 Pnt 3144 3834 Pnt 2635 3798 Pnt 2339 3784 Pnt 3187 3834 Pnt 3021 3811 Pnt 1878 3844 Pnt 2667 3751 Pnt 2569 3834 Pnt 2718 3781 Pnt 2266 3913 Pnt 3183 3812 Pnt 2180 3782 Pnt 2712 3816 Pnt 2134 3785 Pnt 3539 3816 Pnt 2682 3806 Pnt 2820 3781 Pnt 2646 3785 Pnt 2585 3781 Pnt 2253 3807 Pnt 3107 3781 Pnt 2986 3776 Pnt 2755 3781 Pnt 2283 3824 Pnt 2894 3944 Pnt 3237 3800 Pnt 2733 3783 Pnt 2929 3798 Pnt 2164 3943 Pnt 2793 3813 Pnt 2522 3902 Pnt 2329 3786 Pnt 2002 3788 Pnt 2520 3871 Pnt 2081 3911 Pnt 3225 3783 Pnt 2915 3871 Pnt 2675 3792 Pnt 2255 3779 Pnt 2345 3834 Pnt 2889 3779 Pnt 2185 3842 Pnt 4449 3776 Pnt 2450 3802 Pnt 3062 3779 Pnt 2464 3767 Pnt 2824 3768 Pnt 2404 3799 Pnt 2109 3874 Pnt 3051 3772 Pnt 3486 3799 Pnt 2350 3925 Pnt 3666 3875 Pnt 2373 3788 Pnt 2545 3760 Pnt 3251 3796 Pnt 3095 3760 Pnt 3543 3824 Pnt 3429 3815 Pnt 3144 3806 Pnt 2339 3810 Pnt 2419 3765 Pnt 3366 3832 Pnt 3751 3775 Pnt 4178 3761 Pnt 4538 3788 Pnt 4753 3827 Pnt 4439 3825 Pnt 2689 3805 Pnt 2127 3866 Pnt 2628 3805 Pnt 2834 3830 Pnt 2950 3147 Pnt 3211 3830 Pnt 2199 3801 Pnt 2296 3788 Pnt 2200 3824 Pnt 3706 2970 Pnt 2905 3777 Pnt 3616 3839 Pnt 2738 3806 Pnt 2898 3806 Pnt 2429 3790 Pnt 3856 3778 Pnt 2808 3786 Pnt 1935 3892 Pnt 2262 3801 Pnt 2158 3855 Pnt 2476 3797 Pnt 3572 3870 Pnt 2737 3783 Pnt 2808 3807 Pnt 3720 3769 Pnt 2992 3847 Pnt 2878 3813 Pnt 2770 3780 Pnt 2774 3775 Pnt 3821 3803 Pnt 3299 3788 Pnt 3576 3775 Pnt 2550 3826 Pnt 3031 3827 Pnt 2415 3816 Pnt 2474 3767 Pnt 2077 3772 Pnt 2404 3805 Pnt 2524 3791 Pnt 2120 3784 Pnt 4221 3836 Pnt 2734 3842 Pnt 2593 3831 Pnt 3261 3842 Pnt 3456 3862 Pnt 3006 3835 Pnt 3600 3781 Pnt 4484 3786 Pnt 4773 3841 Pnt 2762 3793 Pnt 2868 3767 Pnt 2540 3777 Pnt 3090 3770 Pnt 2714 3828 Pnt 2215 3742 Pnt 3111 3771 Pnt 2889 3772 Pnt 2040 3756 Pnt 2813 3754 Pnt 3629 3770 Pnt 3926 3760 Pnt 5085 3262 Pnt 4327 3772 Pnt 4583 3830 Pnt 2773 3837 Pnt 2841 3813 Pnt 2951 3785 Pnt 2547 3873 Pnt 3058 3870 Pnt 2081 3802 Pnt 2495 3834 Pnt 2282 3783 Pnt 2746 3802 Pnt 3615 3783 Pnt 2034 3769 Pnt 2345 3797 Pnt 3139 3776 Pnt 2627 3875 Pnt 3401 3814 Pnt 3398 3797 Pnt 3009 3816 Pnt 3265 3809 Pnt 2797 3785 Pnt 2612 3816 Pnt 2585 3814 Pnt 3307 3783 Pnt 2493 3808 Pnt 4119 3780 Pnt 3387 3828 Pnt 3092 3790 Pnt 2482 3773 Pnt 2908 3773 Pnt 2268 3777 Pnt 3260 3815 Pnt 3427 3760 Pnt 2789 3758 Pnt 2623 3834 Pnt 2568 3807 Pnt 2578 3777 Pnt 2236 3903 Pnt 1771 3793 Pnt 2253 3877 Pnt 2160 3801 Pnt 2640 3760 Pnt 3675 3815 Pnt 3297 3826 Pnt 2831 3830 Pnt 4357 3903 Pnt 3194 3793 Pnt 3089 3817 Pnt 2455 3808 Pnt 2257 3841 Pnt 4485 3826 Pnt 2466 3812 Pnt 3359 3784 Pnt 4567 3766 Pnt 3959 3830 Pnt 2499 3793 Pnt 2920 3800 Pnt 3913 3863 Pnt 2893 3843 Pnt 3626 3789 Pnt 3065 3857 Pnt 2302 3798 Pnt 3030 3833 Pnt 2698 3842 Pnt 2562 3774 Pnt 4564 3802 Pnt 2675 3798 Pnt 3581 3784 Pnt 2835 3760 Pnt 2562 3774 Pnt 3696 3785 Pnt 2862 3827 Pnt 3781 3789 Pnt 3655 3122 Pnt 2932 3785 Pnt 2929 3797 Pnt 2060 3813 Pnt 3745 3809 Pnt 3029 3808 Pnt 2327 3761 Pnt 2951 3794 Pnt 2413 3777 Pnt 2919 3801 Pnt 1831 3799 Pnt 2654 3814 Pnt 2666 3824 Pnt 2420 3785 Pnt 2189 3829 Pnt 3398 3809 Pnt 3885 3826 Pnt 2598 3871 Pnt 2650 3759 Pnt 2010 3804 Pnt 2425 3781 Pnt 2941 3766 Pnt 3501 3759 Pnt 2474 3825 Pnt 3006 3796 Pnt 3524 3796 Pnt 2847 3775 Pnt 3478 3812 Pnt 3993 3778 Pnt 3034 3779 Pnt 2982 3814 Pnt 2224 3848 Pnt 2374 3841 Pnt 3057 3811 Pnt 3472 3847 Pnt 2959 3811 Pnt 3836 3901 Pnt 2618 3816 Pnt 3025 3809 Pnt 2945 3816 Pnt 2253 3864 Pnt 4205 3763 Pnt 3130 3788 Pnt 3738 2922 Pnt 2521 3823 Pnt 2069 3761 Pnt 2719 3837 Pnt 4322 3789 Pnt 2778 3764 Pnt 4111 3797 Pnt 4588 3791 Pnt 2075 3792 Pnt 2989 3837 Pnt 3396 3824 Pnt 2760 3800 Pnt 3035 3772 Pnt 2602 3782 Pnt 3249 3797 Pnt 3670 3769 Pnt 2779 3802 Pnt 3226 3802 Pnt 2640 3826 Pnt 3364 3855 Pnt 2730 3830 Pnt 2179 3841 Pnt 2773 3858 Pnt 3409 3809 Pnt 3047 3858 Pnt 2805 3810 Pnt 2781 3808 Pnt 4191 3808 Pnt 3508 3812 Pnt 2917 3815 Pnt 2963 3815 Pnt 2315 3796 Pnt 2724 3786 Pnt 2160 3799 Pnt 1994 3786 Pnt 2939 3803 Pnt 2214 3796 Pnt 2968 3802 Pnt 2598 3932 Pnt 2444 3784 Pnt 2498 3776 Pnt 2386 3932 Pnt 2551 3798 Pnt 2999 3800 Pnt 2803 3798 Pnt 2842 3838 Pnt 2424 3848 Pnt 3589 3839 Pnt 3018 3779 Pnt 2492 3759 Pnt 4355 3771 Pnt 2873 3823 Pnt 3532 2942 Pnt 3469 3779 Pnt 2847 3792 Pnt 4401 3824 Pnt 2697 3815 Pnt 3044 3822 Pnt 2938 3807 Pnt 3723 3780 Pnt 2675 3777 Pnt 2635 3801 Pnt 2546 3810 Pnt 2658 3764 Pnt 3385 3817 Pnt 2910 3781 Pnt 4535 3805 Pnt 2463 3812 Pnt 2415 3766 Pnt 3439 3808 Pnt 3194 3781 Pnt 2839 3808 Pnt 2993 3782 Pnt 3015 3779 Pnt 4006 3777 Pnt 3268 3777 Pnt 2375 3833 Pnt 2794 3830 Pnt 3326 3779 Pnt 2203 3805 Pnt 3354 3777 Pnt 2531 3786 Pnt 2150 3827 Pnt 2293 3809 Pnt 3156 3763 Pnt 2538 3802 Pnt 3642 3830 Pnt 2974 3804 Pnt 2612 3814 Pnt 3123 3761 Pnt 2546 3792 Pnt 2750 3811 Pnt 3498 3781 Pnt 2906 3811 Pnt 2651 3855 Pnt 2340 3817 Pnt 3186 3788 Pnt 2473 3811 Pnt 2860 3798 Pnt 3301 3817 Pnt 2527 3831 Pnt 2104 3796 Pnt 3116 3800 Pnt 1684 3810 Pnt 2895 3795 Pnt 3530 3811 Pnt 2740 3789 Pnt 2106 3819 Pnt 2329 3785 Pnt 2970 3817 Pnt 3786 3762 Pnt 2761 3834 Pnt 2692 3771 Pnt 2445 3822 Pnt 3295 3834 Pnt 3226 3807 Pnt 4494 3855 Pnt 3766 3776 Pnt 2324 3783 Pnt 3165 3792 Pnt 3132 3782 Pnt 2890 3872 Pnt 3091 3822 Pnt 2804 3843 Pnt 3461 3787 Pnt 2759 3842 Pnt 2374 3827 Pnt 3567 3761 Pnt 2855 3788 Pnt 3506 3788 Pnt 2956 3775 Pnt 2558 3811 Pnt 3571 3775 Pnt 3372 3775 Pnt 3788 3786 Pnt 2780 3801 Pnt 2970 3783 Pnt 3798 3842 Pnt 2347 3787 Pnt 2955 3813 Pnt 3066 3778 Pnt 2726 3801 Pnt 2995 3826 Pnt 3715 3756 Pnt 2891 3768 Pnt 3004 3764 Pnt 2483 3790 Pnt 2821 3767 Pnt 3786 3784 Pnt 3045 3811 Pnt 2567 3834 Pnt 2406 3941 Pnt 2607 3828 Pnt 3098 3759 Pnt 2347 3879 Pnt 3782 3941 Pnt 1933 3801 Pnt 2727 3776 Pnt 3462 3784 Pnt 3057 3822 Pnt 2427 3806 Pnt 3010 3806 Pnt 2825 3774 Pnt 2581 3784 Pnt 2561 3854 Pnt 2806 3811 Pnt 2310 3799 Pnt 2782 3811 Pnt 2419 3818 Pnt 2141 3913 Pnt 2713 3785 Pnt 2591 3799 Pnt 2334 3807 Pnt 1962 3811 Pnt 2157 3782 Pnt 3127 3799 Pnt 4152 3785 Pnt 2539 3836 Pnt 2008 3814 Pnt 2140 3812 Pnt 2152 3770 Pnt 3076 3799 Pnt 3026 3798 Pnt 2959 3779 Pnt 3539 3819 Pnt 2505 3806 Pnt 2928 3779 Pnt 2638 3822 Pnt 2245 3807 Pnt 3280 3774 Pnt 2948 3751 Pnt 2192 3824 Pnt 2628 3776 Pnt 2617 3835 Pnt 2956 3769 Pnt 2529 3853 Pnt 2099 3814 Pnt 3103 3853 Pnt 2492 3902 Pnt 2522 3773 Pnt 2492 3782 Pnt 2158 3773 Pnt 2769 3776 Pnt 3268 3792 Pnt 2458 3780 Pnt 2196 3779 Pnt 2282 3775 Pnt 2144 3842 Pnt 2953 3816 Pnt 3426 3781 Pnt 3507 3777 Pnt 2464 3815 Pnt 3822 3838 Pnt 2590 3799 Pnt 2501 3828 Pnt 2672 3770 Pnt 2449 3841 Pnt 3010 3786 Pnt 3794 3799 Pnt 2977 3844 Pnt 2542 3763 Pnt 2891 3781 Pnt 2639 3760 Pnt 2601 3781 Pnt 4648 3784 Pnt 3214 3814 Pnt 2861 3781 Pnt 2552 3793 Pnt 2605 3784 Pnt 3113 3790 Pnt 2723 3806 Pnt 2577 3838 Pnt 3566 3806 Pnt 3351 3774 Pnt 2807 3786 Pnt 2425 3773 Pnt 2446 3844 Pnt 2754 3783 Pnt 4197 3773 Pnt 2402 3783 Pnt 2014 3811 Pnt 3290 3845 Pnt 2201 3793 Pnt 2717 3802 Pnt 3823 3793 Pnt 2768 3792 Pnt 3345 3802 Pnt 2830 3827 Pnt 3872 3091 Pnt 2508 3810 Pnt 3213 3810 Pnt 4191 3800 Pnt 2731 3807 Pnt 3206 3793 Pnt 2805 3778 Pnt 2951 3859 Pnt 3058 3798 Pnt 2833 3774 Pnt 3941 3808 Pnt 2758 3806 Pnt 2567 3763 Pnt 2228 3824 Pnt 3271 3798 Pnt 2295 3790 Pnt 3308 3806 Pnt 3197 3763 Pnt 3079 3755 Pnt 2917 3827 Pnt 2442 3767 Pnt 2999 3902 Pnt 3040 3767 Pnt 2351 3742 Pnt 1980 3772 Pnt 2964 3767 Pnt 3468 3852 Pnt 2356 3929 Pnt 2181 3805 Pnt 2722 3760 Pnt 3037 3777 Pnt 2191 3824 Pnt 2753 3803 Pnt 2317 3791 Pnt 2788 3772 Pnt 2258 3801 Pnt 3153 3770 Pnt 2109 3784 Pnt 1808 3798 Pnt 3186 3776 Pnt 2735 3785 Pnt 3178 3804 Pnt 2503 3842 Pnt 2136 3856 Pnt 2250 3809 Pnt 2558 3762 Pnt 2742 3842 Pnt 2211 3826 Pnt 2619 3804 Pnt 3079 3800 Pnt 3083 3814 Pnt 2493 3773 Pnt 2215 3783 Pnt 2641 3797 Pnt 2931 3771 Pnt 2893 3875 Pnt 3374 3783 Pnt 3790 3783 Pnt 2967 3786 Pnt 3807 3754 Pnt 3255 3816 Pnt 4630 3789 Pnt 2838 3815 Pnt 2845 3810 Pnt 3369 3809 Pnt 2822 3800 Pnt 2898 3760 Pnt 2631 3813 Pnt 2555 3784 Pnt 2562 3799 Pnt 2650 3822 Pnt 3660 3813 Pnt 3076 3870 Pnt 2305 3925 Pnt 2171 3837 Pnt 2087 3801 Pnt 3362 3834 Pnt 2532 3788 Pnt 2236 3802 Pnt 2432 3831 Pnt 2910 3866 Pnt 2824 3824 Pnt 2071 3830 Pnt 2122 3809 Pnt 2596 3767 Pnt 3787 3831 Pnt 4092 3776 Pnt 2701 3815 Pnt 3328 3815 Pnt 2537 3834 Pnt 3148 3803 Pnt 3690 2958 Pnt 2500 3802 Pnt 3189 3823 Pnt 1977 3807 Pnt 2361 3807 Pnt 2609 3774 Pnt 3136 3785 Pnt 2484 3848 Pnt 3283 3851 Pnt 2097 3903 Pnt 3376 3776 Pnt 1845 3793 Pnt 1940 3744 Pnt 2527 3811 Pnt 2561 3877 Pnt 2619 3873 Pnt 4024 3807 Pnt 2168 3800 Pnt 2573 3803 Pnt 4404 3785 Pnt 2804 3828 Pnt 2604 3760 Pnt 2955 3803 Pnt 3847 3802 Pnt 2087 3783 Pnt 3406 3782 Pnt 3232 3821 Pnt 2911 3796 Pnt 2028 3842 Pnt 2724 3826 Pnt 2326 3818 Pnt 4001 3843 Pnt 3925 3794 Pnt 2603 3763 Pnt 3151 3813 Pnt 3516 3826 Pnt 3571 3789 Pnt 2290 3788 Pnt 2270 3760 Pnt 2107 3796 Pnt 2046 3911 Pnt 3372 3789 Pnt 2536 3844 Pnt 2781 3776 Pnt 3329 3813 Pnt 4111 3773 Pnt 3288 3812 Pnt 2672 3816 Pnt 2431 3769 Pnt 2397 3792 Pnt 2433 3826 Pnt 2085 3826 Pnt 2783 3782 Pnt 2675 3826 Pnt 2100 3817 Pnt 2788 3789 Pnt 2435 3871 Pnt 2570 3871 Pnt 2713 3789 Pnt 2803 3829 Pnt 2479 3808 Pnt 2147 3816 Pnt 2640 3832 Pnt 3431 3779 Pnt 2116 3842 Pnt 3348 3809 Pnt 3014 3842 Pnt 4481 3826 Pnt 2481 3801 Pnt 2423 3756 Pnt 2867 3777 Pnt 3371 3812 Pnt 2731 3828 Pnt 3119 3839 Pnt 2288 3761 Pnt 2407 3800 Pnt 2542 3823 Pnt 2805 3843 Pnt 3231 3823 Pnt 3359 3811 Pnt 4514 3783 Pnt 3161 3837 Pnt 2488 3814 Pnt 2914 3852 Pnt 2902 3790 Pnt 2377 3847 Pnt 2486 3797 Pnt 2243 3847 Pnt 4087 3860 Pnt 2466 3771 Pnt 2657 3807 Pnt 3354 3771 Pnt 3452 3825 Pnt 2801 3771 Pnt 3790 3785 Pnt 3122 3810 Pnt 2429 3850 Pnt 3327 3801 Pnt 2788 3805 Pnt 2426 3802 Pnt 2227 3813 Pnt 3477 3784 Pnt 2696 3855 Pnt 2810 3841 Pnt 2375 3830 Pnt 2969 3783 Pnt 3490 3768 Pnt 2537 3774 Pnt 2871 3830 Pnt 2494 3858 Pnt 4263 3764 Pnt 2718 3772 Pnt 2603 3797 Pnt 2561 3783 Pnt 2015 3841 Pnt 1986 3814 Pnt 2377 3790 Pnt 2108 3815 Pnt 2623 3813 Pnt 2598 3806 Pnt 2276 3814 Pnt 4555 3820 Pnt 2647 3796 Pnt 3252 3817 Pnt 3065 3761 Pnt 2454 3833 Pnt 3054 3785 Pnt 2998 3798 Pnt 2691 3871 Pnt 4397 2982 Pnt 3493 3871 Pnt 2248 3759 Pnt 4077 3774 Pnt 2644 3759 Pnt 2675 3791 Pnt 2653 3753 Pnt 2496 3808 Pnt 1993 3823 Pnt 2576 3786 Pnt 2690 3796 Pnt 3161 3812 Pnt 4154 3786 Pnt 2498 3789 Pnt 3878 3812 Pnt 2596 3867 Pnt 2713 3802 Pnt 2422 3784 Pnt 3738 3802 Pnt 1953 3932 Pnt 3557 3793 Pnt 2270 3827 Pnt 2526 3776 Pnt 2887 3777 Pnt 3768 3795 Pnt 2446 3778 Pnt 2248 3840 Pnt 2576 3810 Pnt 2515 3809 Pnt 4328 3768 Pnt 1936 3798 Pnt 3027 3811 Pnt 3086 3798 Pnt 2942 3842 Pnt 3076 3800 Pnt 3064 3760 Pnt 2550 3842 Pnt 2244 3811 Pnt 2419 3766 Pnt 2381 3777 Pnt 3076 3808 Pnt 2028 3805 Pnt 2991 3792 Pnt 4229 3766 Pnt 3084 3804 Pnt 3612 3826 Pnt 2563 3792 Pnt 2107 3819 Pnt 2750 3822 Pnt 3283 3819 Pnt 2261 3826 Pnt 2871 3802 Pnt 3997 3822 Pnt 3066 3761 Pnt 2483 3833 Pnt 2881 3786 Pnt 3337 3775 Pnt 2711 3761 Pnt 2829 3788 Pnt 2852 3827 Pnt 3281 3811 Pnt 2578 3801 Pnt 2638 3792 Pnt 2675 3805 Pnt 2387 3783 Pnt 2233 3844 Pnt 3122 3821 Pnt 3902 3794 Pnt 3325 3787 Pnt 4237 3833 Pnt 2897 3793 Pnt 2827 3789 Pnt 2524 3860 Pnt 2256 3811 Pnt 2145 3801 Pnt 2324 3852 Pnt 2941 3812 Pnt 2930 3784 Pnt 2584 3849 Pnt 2999 3823 Pnt 2271 3799 Pnt 3026 3779 Pnt 2638 3805 Pnt 2727 3808 Pnt 3510 3843 Pnt 2665 3791 Pnt 2477 3761 Pnt 2808 3780 Pnt 2400 3811 Pnt 2772 3791 Pnt 2017 3789 Pnt 2920 3817 Pnt 2798 3913 Pnt 2293 3800 Pnt 2949 3775 Pnt 3314 3784 Pnt 2861 3762 Pnt 2062 3816 Pnt 2236 3808 Pnt 2112 3790 Pnt 2239 3875 Pnt 2847 3806 Pnt 1913 3892 Pnt 3467 3830 Pnt 3682 3836 Pnt 2211 3801 Pnt 2739 3811 Pnt 3150 3811 Pnt 3417 3756 Pnt 2094 3770 Pnt 2699 3839 Pnt 2847 3799 Pnt 2574 3764 Pnt 2258 3790 Pnt 3308 3870 Pnt 2611 3941 Pnt 3105 3870 Pnt 3339 3775 Pnt 2780 3941 Pnt 2765 3780 Pnt 2958 3826 Pnt 2647 3751 Pnt 2544 3759 Pnt 2778 3824 Pnt 2400 3757 Pnt 3382 3759 Pnt 3561 3828 Pnt 2643 3853 Pnt 3030 3775 Pnt 3614 3811 Pnt 2922 3782 Pnt 3086 3804 Pnt 2918 3823 Pnt 2667 3809 Pnt 4746 3801 Pnt 2571 3943 Pnt 4571 3804 Pnt 4157 3768 Pnt 2375 3935 Pnt 3188 3815 Pnt 3746 3838 Pnt 2388 3848 Pnt 3171 3785 Pnt 3126 3792 Pnt 2575 3809 Pnt 2891 3819 Pnt 3793 3788 Pnt 2504 3807 Pnt 3554 3812 Pnt 3299 3778 Pnt 2404 3779 Pnt 2898 3802 Pnt 2879 3807 Pnt 2128 3842 Pnt 3244 3862 Pnt 3591 3788 Pnt 3139 3782 Pnt 3421 3802 Pnt 2840 3799 Pnt 2677 3809 Pnt 3270 3844 Pnt 2567 3806 Pnt 2929 3787 Pnt 2368 3777 Pnt 3178 3838 Pnt 2494 3809 Pnt 2354 3814 Pnt 3253 3801 Pnt 3083 3777 Pnt 3341 3784 Pnt 3052 3835 Pnt 2107 3811 Pnt 2831 3790 Pnt 2158 3781 Pnt 2771 3786 Pnt 2497 3773 Pnt 2707 3817 Pnt 3625 3807 Pnt 2839 3799 Pnt 2530 3784 Pnt 2098 3812 Pnt 2260 3847 Pnt 3403 3814 Pnt 2731 3783 Pnt 2648 3808 Pnt 3618 3779 Pnt 2645 3808 Pnt 2436 3834 Pnt 2572 3805 Pnt 2614 3792 Pnt 2635 3786 Pnt 2658 3770 Pnt 2240 3771 Pnt 3735 3834 Pnt 2750 3859 Pnt 3008 3779 Pnt 3207 3831 Pnt 2961 3782 Pnt 2959 3763 Pnt 3374 3823 Pnt 3708 3859 Pnt 2542 3830 Pnt 2807 3822 Pnt 2837 3798 Pnt 2534 3788 Pnt 3183 3767 Pnt 3659 3798 Pnt 3384 3788 Pnt 2559 3838 Pnt 2873 3788 Pnt 3183 3813 Pnt 2372 3801 Pnt 3459 3783 Pnt 2939 3787 Pnt 3979 3801 Pnt 3362 3813 Pnt 3132 3762 Pnt 3046 3761 Pnt 2539 3786 Pnt 3324 3828 Pnt 3150 3832 Pnt 2825 3774 Pnt 2308 3767 Pnt 2567 3847 Pnt 2355 3929 Pnt 3625 3772 Pnt 3436 3776 Pnt 2610 3760 Pnt 3314 3807 Pnt 2701 3862 Pnt 2203 3815 Pnt 3202 3776 Pnt 2109 3803 Pnt 2796 3812 Pnt 3279 3842 Pnt 2924 3813 Pnt 2490 3781 Pnt 2605 3768 Pnt 3172 3791 Pnt 2983 3763 Pnt 2160 3786 Pnt 2733 3770 Pnt 3440 3781 Pnt 3040 3783 Pnt 3127 3770 Pnt 3318 3783 Pnt 4379 3791 Pnt 3180 3834 Pnt 3139 3937 Pnt 3030 3851 Pnt 3046 3839 Pnt 2997 3821 Pnt 2280 3879 Pnt 4458 3761 Pnt 3005 3763 Pnt 3271 3879 Pnt 3152 3762 Pnt 2922 3763 Pnt 2942 3783 Pnt 2216 3844 Pnt 2683 3789 Pnt 3508 3777 Pnt 2450 3841 Pnt 2617 3841 Pnt 2004 3809 Pnt 2904 3802 Pnt 2375 3822 Pnt 3078 3763 Pnt 2694 3810 Pnt 3135 3813 Pnt 2903 3828 Pnt 2609 3813 Pnt 2595 3834 Pnt 2812 3812 Pnt 2284 3809 Pnt 3334 3834 Pnt 2344 3826 Pnt 4280 3766 Pnt 2372 3780 Pnt 2878 3767 Pnt 2784 3781 Pnt 3892 3774 Pnt 3844 3786 Pnt 2723 3767 Pnt 2881 3780 Pnt 2600 3803 Pnt 3357 3838 Pnt 2337 3785 Pnt 2197 3810 Pnt 3108 3802 Pnt 2440 3808 Pnt 3682 3792 Pnt 2516 3813 Pnt 3182 3810 Pnt 3986 3851 Pnt 2744 3803 Pnt 3350 3803 Pnt 2086 3756 Pnt 2390 3792 Pnt 2593 3793 Pnt 2814 3826 Pnt 2994 3785 Pnt 2716 3799 Pnt 3023 3823 Pnt 2531 3771 Pnt 2364 3800 Pnt 2557 3826 Pnt 2485 3796 Pnt 2666 3792 Pnt 2336 3843 Pnt 2405 3784 Pnt 3153 3871 Pnt 2305 3771 Pnt 3843 3847 Pnt 2568 3779 Pnt 2470 3772 Pnt 3434 3789 Pnt 1964 3744 Pnt 3630 3769 Pnt 3810 3807 Pnt 2913 3802 Pnt 2305 3807 Pnt 2399 3902 Pnt 2057 3776 Pnt 2828 3805 Pnt 2647 3782 Pnt 3220 3837 Pnt 3776 3858 Pnt 3565 3798 Pnt 3765 3837 Pnt 2594 3828 Pnt 2958 3802 Pnt 2499 3847 Pnt 3749 3782 Pnt 2757 3782 Pnt 2687 3844 Pnt 3126 3842 Pnt 3060 3855 Pnt 2892 3782 Pnt 2026 3903 Pnt 2961 3760 Pnt 2049 3799 Pnt 3485 3806 Pnt 2746 3838 Pnt 2513 3742 Pnt 3083 3754 Pnt 3140 3791 Pnt 2930 3807 Pnt 2890 3760 Pnt 3023 3742 Pnt 2714 3877 Pnt 2822 3841 Pnt 2863 3776 Pnt 2333 3804 Pnt 2011 3817 Pnt 3272 3877 Pnt 3174 3804 Pnt 2937 3873 Pnt 3473 3837 Pnt 3130 3780 Pnt 3012 3774 Pnt 3246 3873 Pnt 3019 3801 Pnt 2415 3825 Pnt 2881 3809 Pnt 3214 3774 Pnt 2589 3828 Pnt 3431 3811 Pnt 2975 3769 Pnt 3006 3877 Pnt 2796 3802 Pnt 3476 3828 Pnt 3012 3801 Pnt 3270 3793 Pnt 2778 3779 Pnt 2847 3832 Pnt 2464 3782 Pnt 2218 3810 Pnt 2427 3783 Pnt 2722 3830 Pnt 2570 3826 Pnt 3431 3792 Pnt 2448 3756 Pnt 2183 3826 Pnt 3825 3782 Pnt 3312 3770 Pnt 3250 3809 Pnt 2653 3802 Pnt 3788 3756 Pnt 2600 3804 Pnt 2743 3871 Pnt 2607 3773 Pnt 3778 3809 Pnt 2178 3786 Pnt 3138 3783 Pnt 2213 3814 Pnt 2115 3797 Pnt 2587 3774 Pnt 2740 3796 Pnt 2624 3771 Pnt 2231 3827 Pnt 2678 3790 Pnt 3539 3796 Pnt 3004 3875 Pnt 2473 3902 Pnt 2807 3786 Pnt 2704 3753 Pnt 2780 3805 Pnt 2917 3753 Pnt 3758 3820 Pnt 2590 3818 Pnt 2811 3815 Pnt 2605 3867 Pnt 2445 3824 Pnt 3105 3814 Pnt 4210 3815 Pnt 2420 3802 Pnt 2650 3808 Pnt 4454 3776 Pnt 4532 3785 Pnt 2837 3824 Pnt 2642 3842 Pnt 2614 3071 Pnt 2212 3761 Pnt 2946 3807 Pnt 2861 3777 Pnt 2212 3799 Pnt 3509 3803 Pnt 2857 3760 Pnt 3348 3807 Pnt 2644 3828 Pnt 3490 3777 Pnt 3176 3803 Pnt 2865 3870 Pnt 2207 3761 Pnt 2939 3812 Pnt 2313 3767 Pnt 2077 3801 Pnt 3319 3766 Pnt 2335 3822 Pnt 2831 3808 Pnt 3020 3798 Pnt 1851 3788 Pnt 2942 3769 Pnt 2429 3925 Pnt 2300 3798 Pnt 3061 3842 Pnt 2745 3823 Pnt 4337 3794 Pnt 3409 3831 Pnt 3974 3819 Pnt 4124 3823 Pnt 2577 3822 Pnt 2811 3811 Pnt 2234 3815 Pnt 3718 3807 Pnt 3004 3854 Pnt 2930 3784 Pnt 2337 3785 Pnt 3982 3784 Pnt 2826 3784 Pnt 1937 3932 Pnt 3340 3929 Pnt 2145 3827 Pnt 3994 3824 Pnt 2957 3787 Pnt 3514 3792 Pnt 3994 3827 Pnt 4569 3829 Pnt 4956 3784 Pnt 2826 3777 Pnt 2514 3818 Pnt 2710 3824 Pnt 2076 3792 Pnt 3230 3786 Pnt 3264 3802 Pnt 3823 3839 Pnt 3681 3786 Pnt 2990 3816 Pnt 3545 3796 Pnt 3015 3826 Pnt 3110 3760 Pnt 2469 3860 Pnt 2398 3911 Pnt 2796 3789 Pnt 2049 3784 Pnt 2562 3789 Pnt 3479 3844 Pnt 2588 3849 Pnt 4128 3794 Pnt 2597 3793 Pnt 2399 3849 Pnt 2503 3803 Pnt 2971 3796 Pnt 2191 3852 Pnt 3670 3780 Pnt 3456 3809 Pnt 3618 3773 Pnt 4218 3785 Pnt 3612 3780 Pnt 2591 3839 Pnt 2119 3785 Pnt 2971 3833 Pnt 2720 3841 Pnt 2586 3941 Pnt 2492 3782 Pnt 3165 3824 Pnt 2743 3782 Pnt 2851 3759 Pnt 2469 3813 Pnt 2916 3901 Pnt 4225 3941 Pnt 3078 3785 Pnt 4559 3777 Pnt 2713 3775 Pnt 2260 3794 Pnt 2850 3767 Pnt 2670 3794 Pnt 1812 3844 Pnt 2966 3809 Pnt 2610 3801 Pnt 3626 3794 Pnt 1932 3810 Pnt 1982 3779 Pnt 2351 3816 Pnt 2377 3815 Pnt 4692 3800 Pnt 2848 3805 Pnt 3120 3814 Pnt 4353 3775 Pnt 2596 3769 Pnt 3500 3802 Pnt 4076 3769 Pnt 3677 3200 Pnt 2627 3809 Pnt 3156 3848 Pnt 2951 3807 Pnt 2791 3789 Pnt 2808 3826 Pnt 3355 3807 Pnt 2807 3791 Pnt 2904 3791 Pnt 3829 3806 Pnt 2294 3808 Pnt 3048 3763 Pnt 2726 3811 Pnt 2964 3830 Pnt 3598 3774 Pnt 2443 3816 Pnt 3273 3786 Pnt 2605 3813 Pnt 4516 3790 Pnt 3119 3792 Pnt 2984 3870 Pnt 4212 3763 Pnt 2340 3808 Pnt 2677 3170 Pnt 3921 3763 Pnt 2898 3826 Pnt 2327 3759 Pnt 3078 3804 Pnt 4047 3788 Pnt 3043 3834 Pnt 2876 3777 Pnt 2417 3757 Pnt 2680 3791 Pnt 2186 3813 Pnt 2236 3777 Pnt 2950 3791 Pnt 2541 3808 Pnt 2956 3782 Pnt 2000 3814 Pnt 3299 3827 Pnt 3306 3810 Pnt 3240 3780 Pnt 3070 3822 Pnt 2289 3805 Pnt 2702 3780 Pnt 2579 3847 Pnt 4372 3778 Pnt 2175 3789 Pnt 3594 3811 Pnt 2113 3790 Pnt 3589 3847 Pnt 2237 3929 Pnt 2719 3776 Pnt 1940 3834 Pnt 3562 3860 Pnt 2796 3810 Pnt 2862 3778 Pnt 4244 3788 Pnt 3053 3778 Pnt 3327 3838 Pnt 3179 3767 Pnt 2896 3809 Pnt 3198 3796 Pnt 2698 3827 Pnt 2325 3809 Pnt 3912 3794 Pnt 3323 3809 Pnt 2036 3841 Pnt 2432 3800 Pnt 3585 3811 Pnt 3519 3794 Pnt 3331 3800 Pnt 2690 3838 Pnt 2486 3813 Pnt 2438 3763 Pnt 2380 3784 Pnt 3244 3811 Pnt 2150 3871 Pnt 2329 3794 Pnt 3801 3787 Pnt 3059 3871 Pnt 1974 3819 Pnt 2863 3831 Pnt 3510 3794 Pnt 3046 3769 Pnt 2474 3806 Pnt 2280 3827 Pnt 2559 3815 Pnt 2389 3772 Pnt 2423 3790 Pnt 2141 3801 Pnt 3415 3806 Pnt 2258 3842 Pnt 3211 3842 Pnt 2525 3875 Pnt 3391 3761 Pnt 2561 3813 Pnt 3697 3774 Pnt 2770 3761 Pnt 2500 3838 Pnt 2407 3762 Pnt 2776 3845 Pnt 2833 3760 Pnt 3790 3812 Pnt 2214 3828 Pnt 2864 3818 Pnt 3558 3760 Pnt 2938 3810 Pnt 2473 3832 Pnt 2971 3851 Pnt 2886 3792 Pnt 2965 3851 Pnt 4467 3771 Pnt 3003 3763 Pnt 2365 3779 Pnt 4473 3802 Pnt 2611 3843 Pnt 3718 3069 Pnt 3086 3836 Pnt 2599 3803 Pnt 3217 3781 Pnt 3588 3768 Pnt 2536 3811 Pnt 2488 3811 Pnt 3133 3826 Pnt 2482 3811 Pnt 2738 3780 Pnt 1993 3789 Pnt 2591 3805 Pnt 2794 3809 Pnt 1704 3914 Pnt 3027 3809 Pnt 2204 3830 Pnt 2712 3789 Pnt 1981 3817 Pnt 3952 3784 Pnt 1945 3935 Pnt 3509 3914 Pnt 2562 3800 Pnt 4172 3830 Pnt 2738 3782 Pnt 4431 3803 Pnt 2841 3771 Pnt 3091 3902 Pnt 3549 3811 Pnt 3486 3771 Pnt 3019 3762 Pnt 3783 3768 Pnt 2494 3807 Pnt 2084 3830 Pnt 2557 3896 Pnt 3881 3810 Pnt 2497 3777 Pnt 3338 3818 Pnt 2371 3753 Pnt 3720 3762 Pnt 2169 3825 Pnt 2806 3842 Pnt 3286 3805 Pnt 3044 3825 Pnt 2990 3873 Pnt 2056 3811 Pnt 2901 3828 Pnt 2188 3801 Pnt 2586 3786 Pnt 3463 3865 Pnt 2978 3844 Pnt 2768 3793 Pnt 3094 3781 Pnt 2729 3811 Pnt 2415 3807 Pnt 3279 3772 Pnt 2382 3756 Pnt 2620 3831 Pnt 3426 3807 Pnt 3011 3776 Pnt 2554 3830 Pnt 3671 3807 Pnt 3529 3826 Pnt 2575 3814 Pnt 2479 3867 Pnt 3856 3826 Pnt 2349 3771 Pnt 2821 3774 Pnt 3294 3774 Pnt 2728 3824 Pnt 2065 3778 Pnt 3071 3822 Pnt 2427 3776 Pnt 2018 3786 Pnt 2929 3779 Pnt 2231 3801 Pnt 4062 3784 Pnt 2490 3815 Pnt 2753 3780 Pnt 2937 3761 Pnt 2545 3838 Pnt 3116 3779 Pnt 3150 3761 Pnt 2328 3810 Pnt 4014 3771 Pnt 2830 3810 Pnt 4669 3867 Pnt 3654 3798 Pnt 2387 3802 Pnt 2842 3853 Pnt 2469 3781 Pnt 2209 3929 Pnt 2137 3808 Pnt 2440 3802 Pnt 4056 3809 Pnt 2700 3820 Pnt 1798 3782 Pnt 2772 3770 Pnt 2923 3810 Pnt 3013 3804 Pnt 2731 3813 Pnt 2357 3792 Pnt 2262 3803 Pnt 1954 3756 Pnt 3082 3943 Pnt 2899 3759 Pnt 2792 3759 Pnt 2934 3780 Pnt 2817 3839 Pnt 2547 3793 Pnt 2477 3937 Pnt 3088 3769 Pnt 4262 3796 Pnt 3135 3777 Pnt 3383 3799 Pnt 2551 3790 Pnt 2482 3844 Pnt 3505 3782 Pnt 4442 3782 Pnt 3874 3799 Pnt 3137 3849 Pnt 2583 3742 Pnt 3072 3859 Pnt 3401 3824 Pnt 2922 3756 Pnt 4420 3767 Pnt 3218 3793 Pnt 3120 3788 Pnt 2392 3852 Pnt 3329 3808 Pnt 3253 3870 Pnt 2221 3833 Pnt 3486 3852 Pnt 2652 3780 Pnt 3081 3772 Pnt 2932 3772 Pnt 2339 3862 Pnt 4268 3799 Pnt 2848 3773 Pnt 3420 3807 Pnt 2073 3841 Pnt 2895 3788 Pnt 1970 3744 Pnt 4653 3790 Pnt 2686 3802 Pnt 2570 3207 Pnt 4427 3781 Pnt 2215 3788 Pnt 2161 3776 Pnt 3744 3793 Pnt 4022 3810 Pnt 3063 3787 Pnt 2662 3833 Pnt 2890 3833 Pnt 3378 3781 Pnt 3829 3784 Pnt 3175 3811 Pnt 2365 3821 Pnt 2748 3782 Pnt 2788 3824 Pnt 3634 3824 Pnt 2372 3837 Pnt 3175 3811 Pnt 2210 3879 Pnt 2428 3828 Pnt 3088 3811 Pnt 4023 3769 Pnt 3122 3841 Pnt 2688 3806 Pnt 4196 3803 Pnt 3749 3876 Pnt 2684 3784 Pnt 3368 3872 Pnt 2606 3814 Pnt 2913 3805 Pnt 2720 3802 Pnt 3807 3802 Pnt 3022 3838 Pnt 3517 3784 Pnt 3489 3840 Pnt 2774 3834 Pnt 3326 3840 Pnt 3066 3826 Pnt 2818 3826 Pnt 2701 3808 Pnt 3626 3826 Pnt 2722 3787 Pnt 2357 3824 Pnt 2613 3796 Pnt 2934 3796 Pnt 2210 3792 Pnt 4453 3779 Pnt 3246 3781 Pnt 3678 3824 Pnt 3149 3792 Pnt 2594 3810 Pnt 2462 3786 Pnt 2133 3818 Pnt 3038 3842 Pnt 2171 3792 Pnt 3560 3821 Pnt 2912 3803 Pnt 3208 3835 Pnt 2988 3770 Pnt 3299 3770 Pnt 2504 3802 Pnt 2892 3826 Pnt 2273 3804 Pnt 3390 3802 Pnt 2883 3823 Pnt 3365 3823 Pnt 2884 3810 Pnt 3104 3775 Pnt 2502 3826 Pnt 2718 3826 Pnt 2480 3860 Pnt 2778 3860 Pnt 2940 3804 Pnt 2371 3911 Pnt 2562 3771 Pnt 3833 3782 Pnt 2840 3789 Pnt 2612 3802 Pnt 3576 3771 Pnt 3392 3782 Pnt 3199 3844 Pnt 2947 3875 Pnt 2365 3902 Pnt 3047 3846 Pnt 4371 3862 Pnt 2889 3858 Pnt 3262 3862 Pnt 3726 3820 Pnt 2467 3782 Pnt 2605 3787 Pnt 2525 3807 Pnt 2809 3787 Pnt 3082 3798 Pnt 3751 3798 Pnt 3158 3812 Pnt 2597 3816 Pnt 2326 3825 Pnt 3554 3825 Pnt 3663 3840 Pnt 2663 3805 Pnt 2705 3805 Pnt 2706 3784 Pnt 2624 3814 Pnt 3516 3816 Pnt 2560 3901 Pnt 2395 3756 Pnt 4320 3901 Pnt 3205 3756 Pnt 3137 3804 Pnt 2754 3814 Pnt 2737 3810 Pnt 2295 3817 Pnt 3616 3776 Pnt 3409 3826 Pnt 3200 3819 Pnt 3072 3809 Pnt 2897 3784 Pnt 3059 3763 Pnt 2645 3784 Pnt 2194 3807 Pnt 1991 3803 Pnt 2228 3925 Pnt 2827 3845 Pnt 2853 3777 Pnt 3386 3845 Pnt 2769 3783 Pnt 2007 3816 Pnt 4422 3771 Pnt 2283 3769 Pnt 2722 3772 Pnt 2725 3804 Pnt 2902 3803 Pnt 3461 3807 Pnt 3028 3770 Pnt 2645 3789 Pnt 2781 3787 Pnt 3126 3787 Pnt 4739 3847 Pnt 2976 3774 Pnt 2007 3799 Pnt 2442 3805 Pnt 2551 3794 Pnt 3679 3829 Pnt 2808 3761 Pnt 3062 3769 Pnt 2681 3847 Pnt 2483 3782 Pnt 4153 2996 Pnt 3496 3769 Pnt 2037 3806 Pnt 2969 3843 Pnt 2963 3804 Pnt 2814 3753 Pnt 2788 3838 Pnt 2441 3860 Pnt 3069 3860 Pnt 2379 3902 Pnt 2446 3767 Pnt 3311 3782 Pnt 3008 3814 Pnt 2939 3756 Pnt 2755 3786 Pnt 3158 3782 Pnt 4526 3783 Pnt 2449 3838 Pnt 3203 3786 Pnt 2873 3829 Pnt 2474 3769 Pnt 2040 3822 Pnt 2800 3760 Pnt 2099 3799 Pnt 1916 3827 Pnt 2432 3772 Pnt 2432 3807 Pnt 2873 3801 Pnt 2681 3809 Pnt 2302 3809 Pnt 2627 3822 Pnt 3308 3776 Pnt 2776 3817 Pnt 2681 3772 Pnt 2257 3848 Pnt 3742 3799 Pnt 2268 3832 Pnt 2890 3802 Pnt 2703 3820 Pnt 2876 3851 Pnt 2746 3806 Pnt 3290 3784 Pnt 2743 3814 Pnt 3212 3782 Pnt 3123 3811 Pnt 3445 3793 Pnt 2687 3762 Pnt 2385 3779 Pnt 2977 3809 Pnt 3591 3811 Pnt 2538 3853 Pnt 3124 3830 Pnt 2900 3838 Pnt 2119 3897 Pnt 2751 3784 Pnt 3250 3810 Pnt 3749 3799 Pnt 2573 3830 Pnt 2650 3812 Pnt 2820 3794 Pnt 3498 3799 Pnt 2922 3763 Pnt 3292 3794 Pnt 2908 3838 Pnt 2526 3806 Pnt 3007 3790 Pnt 2646 3810 Pnt 2849 3834 Pnt 3745 3795 Pnt 2799 3809 Pnt 2496 3822 Pnt 3069 3762 Pnt 2665 3774 Pnt 2637 3832 Pnt 3315 3810 Pnt 2519 3871 Pnt 2027 3829 Pnt 3083 3831 Pnt 2731 3858 Pnt 2344 3832 Pnt 2792 3782 Pnt 2576 3763 Pnt 2270 3771 Pnt 3465 3831 Pnt 2951 3896 Pnt 2548 3801 Pnt 3331 3763 Pnt 3020 3772 Pnt 2591 3789 Pnt 2162 3814 Pnt 2355 3842 Pnt 2732 3761 Pnt 2208 3825 Pnt 2810 3774 Pnt 3479 3813 Pnt 2723 3802 Pnt 2277 3798 Pnt 2525 3842 Pnt 2543 3813 Pnt 3688 3784 Pnt 2770 3846 Pnt 3901 3756 Pnt 2406 3769 Pnt 2828 3829 Pnt 3396 3805 Pnt 3229 3789 Pnt 2896 3805 Pnt 2700 3845 Pnt 2672 3844 Pnt 2703 3810 Pnt 2905 3774 Pnt 2548 3786 Pnt 2496 3834 Pnt 2798 3810 Pnt 2549 3767 Pnt 3482 3794 Pnt 3710 3853 Pnt 3340 3767 Pnt 2657 3769 Pnt 3180 3805 Pnt 2481 3771 Pnt 3341 3778 Pnt 3147 3813 Pnt 2938 3768 Pnt 2749 3802 Pnt 2603 3805 Pnt 2907 3777 Pnt 2501 3768 Pnt 2349 3755 Pnt 1914 3792 Pnt 2523 3811 Pnt 2165 3815 Pnt 2228 3820 Pnt 2979 3805 Pnt 2455 3804 Pnt 3195 3805 Pnt 3284 3778 Pnt 2992 3781 Pnt 2542 3808 Pnt 3972 3767 Pnt 3078 3814 Pnt 3339 3809 Pnt 1950 3817 Pnt 2072 3841 Pnt 2640 3802 Pnt 3197 3842 Pnt 2015 3838 Pnt 3206 3772 Pnt 3101 3789 Pnt 3055 3801 Pnt 1966 3810 Pnt 4252 3772 Pnt 2732 3781 Pnt 2344 3934 Pnt 2568 3777 Pnt 1952 3791 Pnt 3142 3779 Pnt 3334 3828 Pnt 2844 3806 Pnt 1956 3800 Pnt 4069 3779 Pnt 2757 3778 Pnt 2467 3765 Pnt 2791 3877 Pnt 2735 3790 Pnt 2555 3790 Pnt 3597 3881 Pnt 2507 3776 Pnt 2298 3810 Pnt 2659 3838 Pnt 2848 3844 Pnt 2546 3759 Pnt 2851 3778 Pnt 3077 3774 Pnt 2569 3801 Pnt 2687 3778 Pnt 2774 3773 Pnt 2633 3849 Pnt 3130 3776 Pnt 3835 3774 Pnt 2611 3798 Pnt 2360 3774 Pnt 2755 3742 Pnt 2623 3846 Pnt 2925 3796 Pnt 2993 3846 Pnt 3200 3778 Pnt 2626 3800 Pnt 3061 3859 Pnt 2659 3790 Pnt 2891 3778 Pnt 2403 3927 Pnt 2284 3763 Pnt 3072 3756 Pnt 1741 3927 Pnt 2371 3802 Pnt 2319 3802 Pnt 2585 3753 Pnt 2268 3842 Pnt 2376 3918 Pnt 1954 3791 Pnt 2482 3753 Pnt 2554 3792 Pnt 2959 3753 Pnt 2512 3759 Pnt 4441 3756 Pnt 2868 3813 Pnt 2883 3772 Pnt 2535 3800 Pnt 2103 3820 Pnt 2945 3813 Pnt 2732 3800 Pnt 2524 3840 Pnt 1955 3815 Pnt 2289 3815 Pnt 2631 3802 Pnt 2926 3800 Pnt 3370 3805 Pnt 2337 3875 Pnt 4121 3870 Pnt 4106 3804 Pnt 3400 3786 Pnt 2805 3762 Pnt 2541 3798 Pnt 2795 3833 Pnt 2627 3810 Pnt 3476 3811 Pnt 2682 3779 Pnt 2454 3855 Pnt 2460 3782 Pnt 3634 3855 Pnt 3829 3786 Pnt 2485 3793 Pnt 3109 3793 Pnt 3329 3802 Pnt 3256 3777 Pnt 2553 3810 Pnt 2662 3769 Pnt 2111 3827 Pnt 3121 3773 Pnt 2509 3811 Pnt 3165 3772 Pnt 2048 3871 Pnt 2411 3834 Pnt 3326 3809 Pnt 3467 3794 Pnt 3049 3787 Pnt 2944 3826 Pnt 2911 3791 Pnt 3834 3775 Pnt 3017 3783 Pnt 3327 3803 Pnt 3080 3776 Pnt 2159 3782 Pnt 3087 3774 Pnt 3937 3826 Pnt 2586 3826 Pnt 2708 3796 Pnt 3214 3772 Pnt 2654 3801 Pnt 2923 3774 Pnt 2619 3814 Pnt 3077 3799 Pnt 2804 3826 Pnt 2335 3792 Pnt 2190 3794 Pnt 2218 3837 Pnt 2770 3792 Pnt 2610 3775 Pnt 2562 3813 Pnt 2088 3802 Pnt 2153 3879 Pnt 2804 3767 Pnt 2660 3879 Pnt 3391 3767 Pnt 3331 3838 Pnt 3027 3794 Pnt 3233 3769 Pnt 3992 3810 Pnt 2533 3860 Pnt 4493 3796 Pnt 2321 3840 Pnt 2744 3753 Pnt 2776 3787 Pnt 3465 3858 Pnt 2967 3753 Pnt 2721 3786 Pnt 3073 3813 Pnt 2902 3786 Pnt 2710 3786 Pnt 4565 3787 Pnt 2596 3786 Pnt 3117 3830 Pnt 2650 3785 Pnt 2191 3840 Pnt 3506 3830 Pnt 2438 3771 Pnt 3289 3821 Pnt 2153 3929 Pnt 2890 3840 Pnt 2284 3792 Pnt 2940 3824 Pnt 2961 3862 Pnt 2448 3781 Pnt 2024 3802 Pnt 3170 3771 Pnt 2666 3784 Pnt 3021 3802 Pnt 3903 3790 Pnt 2520 3802 Pnt 2913 3805 Pnt 2189 3823 Pnt 3318 3805 Pnt 2894 3820 Pnt 4404 3153 Pnt 2393 3834 Pnt 2023 3770 Pnt 3609 3824 Pnt 3236 3768 Pnt 2321 3847 Pnt 2539 3826 Pnt 2396 3840 Pnt 2450 3809 Pnt 3314 3844 Pnt 2872 3804 Pnt 3528 3801 Pnt 3714 3788 Pnt 3994 3005 Pnt 2546 3858 Pnt 2321 3911 Pnt 1937 3833 Pnt 3072 3826 Pnt 2903 3826 Pnt 2924 3828 Pnt 4317 3804 Pnt 3893 3808 Pnt 3212 3820 Pnt 2532 3782 Pnt 2761 3780 Pnt 3234 3801 Pnt 2843 3811 Pnt 2320 3780 Pnt 3389 3769 Pnt 2972 3811 Pnt 2477 3787 Pnt 2511 3934 Pnt 3758 3827 Pnt 1854 3789 Pnt 2693 3807 Pnt 2723 3903 Pnt 2330 3862 Pnt 2655 3796 Pnt 2157 3805 Pnt 2728 3798 Pnt 3834 3780 Pnt 2791 3773 Pnt 3553 3781 Pnt 2154 3816 Pnt 3005 3813 Pnt 2768 3818 Pnt 2878 3828 Pnt 2280 3744 Pnt 3808 3814 Pnt 3263 3771 Pnt 2907 3744 Pnt 2699 3802 Pnt 2905 3771 Pnt 3414 3784 Pnt 3006 3814 Pnt 3892 3811 Pnt 3074 3786 Pnt 4066 3820 Pnt 3823 3814 Pnt 4224 3786 Pnt 2740 3781 Pnt 2199 3810 Pnt 3418 3819 Pnt 3151 3901 Pnt 2327 3822 Pnt 2812 3804 Pnt 3773 3877 Pnt 3165 3819 Pnt 2357 3756 Pnt 2130 3811 Pnt 2586 3821 Pnt 2053 3821 Pnt 1993 3865 Pnt 2152 3801 Pnt 2580 3822 Pnt 4002 3782 Pnt 2781 3778 Pnt 2604 3793 Pnt 3712 3813 Pnt 2807 3811 Pnt 3712 3793 Pnt 2390 3807 Pnt 3715 3780 Pnt 2652 3778 Pnt 2322 3799 Pnt 3002 3784 Pnt 2349 3777 Pnt 3280 3811 Pnt 2048 3778 Pnt 3138 3787 Pnt 2614 3777 Pnt 3619 3802 Pnt 2447 3872 Pnt 2192 3925 Pnt 3093 3769 Pnt 2892 3822 Pnt 2575 3845 Pnt 3085 3784 Pnt 4424 3774 Pnt 2752 3776 Pnt 2580 3057 Pnt 3192 3786 Pnt 2004 3799 Pnt 2540 3769 Pnt 2025 3795 Pnt 2575 3772 Pnt 2452 3838 Pnt 3566 3809 Pnt 2377 3807 Pnt 3688 3785 Pnt 2505 3860 Pnt 2619 3794 Pnt 2355 3824 Pnt 3368 3807 Pnt 2411 3834 Pnt 2787 3837 Pnt 2542 3761 Pnt 3104 3806 Pnt 3069 3770 Pnt 2808 3781 Pnt 3752 3806 Pnt 2278 3810 Pnt 3051 3772 Pnt 2543 3807 Pnt 2020 3842 Pnt 3229 3787 Pnt 2740 3841 Pnt 4540 3815 Pnt 2451 3790 Pnt 2102 3818 Pnt 2667 3826 Pnt 2512 3795 Pnt 3078 3818 Pnt 2394 3765 Pnt 2966 3769 Pnt 2693 3768 Pnt 2810 3770 Pnt 2069 3792 Pnt 4398 3803 Pnt 2161 3847 Pnt 3773 3823 Pnt 2942 3771 Pnt 3307 3787 Pnt 2627 3829 Pnt 2510 3838 Pnt 2198 3816 Pnt 2631 3804 Pnt 3020 3810 Pnt 2058 3814 Pnt 2941 3838 Pnt 2258 3811 Pnt 2900 3853 Pnt 3251 3811 Pnt 2858 3830 Pnt 3027 3830 Pnt 3745 3772 Pnt 2484 3847 Pnt 2825 3814 Pnt 3844 3782 Pnt 2957 3814 Pnt 2521 3813 Pnt 2982 3778 Pnt 2820 3805 Pnt 2502 3838 Pnt 4412 3853 Pnt 2641 3790 Pnt 3734 3816 Pnt 4010 3772 Pnt 3471 3805 Pnt 2675 3774 Pnt 2918 3790 Pnt 3398 3811 Pnt 3103 3771 Pnt 2351 3814 Pnt 3613 3768 Pnt 2438 3790 Pnt 3021 3768 Pnt 2923 3813 Pnt 3554 3804 Pnt 2084 3802 Pnt 3527 3780 Pnt 2787 3757 Pnt 1979 3806 Pnt 2764 3792 Pnt 2792 3847 Pnt 2515 3776 Pnt 3323 3813 Pnt 2395 3771 Pnt 2259 3820 Pnt 2992 3838 Pnt 2991 3828 Pnt 2570 3805 Pnt 4094 3788 Pnt 3729 3838 Pnt 2372 3813 Pnt 3080 3769 Pnt 3117 3813 Pnt 2902 3855 Pnt 2098 3814 Pnt 2525 3856 Pnt 1957 3817 Pnt 2370 3771 Pnt 2142 3825 Pnt 2984 3815 Pnt 3995 3795 Pnt 2718 3796 Pnt 2959 3807 Pnt 2409 3774 Pnt 2696 3858 Pnt 3097 3774 Pnt 4093 3777 Pnt 2745 3789 Pnt 3244 3786 Pnt 2503 3780 Pnt 1979 3810 Pnt 2973 3820 Pnt 2677 3838 Pnt 2969 3820 Pnt 2840 3781 Pnt 3546 3842 Pnt 2551 3759 Pnt 3240 3793 Pnt 2850 3798 Pnt 3831 3759 Pnt 2457 3774 Pnt 2874 3793 Pnt 2550 3806 Pnt 3155 3774 Pnt 2579 3777 Pnt 2494 3822 Pnt 3246 3803 Pnt 2834 3779 Pnt 2642 3778 Pnt 4418 3805 Pnt 2445 3841 Pnt 3180 3775 Pnt 2820 3778 Pnt 3110 3779 Pnt 2624 3881 Pnt 2614 3802 Pnt 3193 3848 Pnt 2855 3769 Pnt 2679 3794 Pnt 2737 3753 Pnt 2562 3791 Pnt 4742 3816 Pnt 2982 3831 Pnt 2595 3800 Pnt 3230 3794 Pnt 2525 3813 Pnt 2736 3810 Pnt 3207 3796 Pnt 2897 3846 Pnt 3423 3772 Pnt 3502 3817 Pnt 2802 3829 Pnt 3125 3770 Pnt 2365 3793 Pnt 2848 3833 Pnt 3910 3778 Pnt 2204 3778 Pnt 3639 3762 Pnt 3017 3833 Pnt 2527 3802 Pnt 2224 3846 Pnt 2206 3808 Pnt 2652 3809 Pnt 2644 3813 Pnt 2812 3813 Pnt 3287 3803 Pnt 2718 3844 Pnt 2032 3802 Pnt 3193 3805 Pnt 3359 3845 Pnt 4107 3811 Pnt 2233 3852 Pnt 3806 3786 Pnt 2933 3794 Pnt 2699 3852 Pnt 2289 3826 Pnt 2152 3816 Pnt 2608 3918 Pnt 2816 3773 Pnt 1998 3838 Pnt 2862 3803 Pnt 2015 3753 Pnt 3743 3768 Pnt 3062 3775 Pnt 2279 3826 Pnt 2512 3842 Pnt 3301 3842 Pnt 2472 3804 Pnt 2866 3804 Pnt 2361 3792 Pnt 2491 3774 Pnt 2618 3782 Pnt 2328 3820 Pnt 3774 3793 Pnt 2603 3805 Pnt 3211 3786 Pnt 3048 3801 Pnt 2594 3800 Pnt 3399 3767 Pnt 3322 3785 Pnt 4674 3814 Pnt 3232 3781 Pnt 3580 3785 Pnt 2286 3810 Pnt 3813 3800 Pnt 3907 3781 Pnt 3472 3822 Pnt 2451 3869 Pnt 3424 3828 Pnt 3003 3753 Pnt 2518 3794 Pnt 3261 3773 Pnt 3433 3794 Pnt 2741 3828 Pnt 4628 3810 Pnt 3394 3773 Pnt 3462 3816 Pnt 2560 3812 Pnt 2640 3805 Pnt 2624 3807 Pnt 2500 3795 Pnt 2379 3875 Pnt 2396 3765 Pnt 2643 3769 Pnt 3826 3765 Pnt 2673 3867 Pnt 2049 3827 Pnt 3511 3773 Pnt 3075 3790 Pnt 2300 3792 Pnt 2400 3821 Pnt 2484 3785 Pnt 2506 3754 Pnt 3874 3827 Pnt 2465 3834 Pnt 2589 3775 Pnt 2388 3813 Pnt 3400 3810 Pnt 2875 3775 Pnt 2896 3780 Pnt 2430 3834 Pnt 2900 3794 Pnt 2094 3823 Pnt 2130 3929 Pnt 2757 3848 Pnt 4633 3784 Pnt 2789 3806 Pnt 2746 3843 Pnt 2753 3771 Pnt 2291 3840 Pnt 3569 3848 Pnt 4568 3811 Pnt 3291 3771 Pnt 2757 3840 Pnt 2612 3741 Pnt 3360 3862 Pnt 3386 3776 Pnt 2484 3781 Pnt 2880 3787 Pnt 2333 3830 Pnt 2397 3830 Pnt 2133 3785 Pnt 2850 3781 Pnt 2200 3840 Pnt 3698 3787 Pnt 2578 3783 Pnt 3474 3772 Pnt 4149 3780 Pnt 2094 3941 Pnt 3408 3941 Pnt 2644 3827 Pnt 2712 3781 Pnt 2974 3834 Pnt 2709 3795 Pnt 2461 3802 Pnt 3766 3802 Pnt 2645 3796 Pnt 2653 3768 Pnt 2555 3842 Pnt 2865 3826 Pnt 2253 3911 Pnt 3509 3806 Pnt 2173 3943 Pnt 2656 3927 Pnt 2968 3923 Pnt 2825 3828 Pnt 2764 3828 Pnt 2730 3844 Pnt 3384 3820 Pnt 2941 3787 Pnt 4474 3808 Pnt 2761 3811 Pnt 3601 3878 Pnt 3538 3787 Pnt 2208 3798 Pnt 2844 3799 Pnt 2282 3810 Pnt 3638 3800 Pnt 2411 3855 Pnt 2134 3879 Pnt 2286 3787 Pnt 2106 3782 Pnt 2367 3787 Pnt 3368 3791 Pnt 3807 3787 Pnt 2415 3811 Pnt 4364 3811 Pnt 2843 3805 Pnt 3294 3802 Pnt 1905 3801 Pnt 2766 3800 Pnt 3760 3813 Pnt 2677 3858 Pnt 3830 3805 Pnt 4342 3837 Pnt 2553 3828 Pnt 4260 3783 Pnt 2798 3789 Pnt 2405 3828 Pnt 1865 3744 Pnt 3979 3801 Pnt 3117 3789 Pnt 2540 3768 Pnt 2786 3787 Pnt 2869 3787 Pnt 2376 3819 Pnt 3104 3826 Pnt 2190 3837 Pnt 3854 3801 Pnt 3099 3837 Pnt 2429 3794 Pnt 2450 3800 Pnt 3653 3780 Pnt 3149 3814 Pnt 3945 3800 Pnt 3901 3818 Pnt 2900 3811 Pnt 2283 3934 Pnt 4151 3817 Pnt 3412 3770 Pnt 2003 3825 Pnt 2629 3813 Pnt 2387 3777 Pnt 3267 3762 Pnt 1951 3757 Pnt 2750 3903 Pnt 2623 3778 Pnt 3659 3760 Pnt 3307 3834 Pnt 3226 3771 Pnt 3318 3803 Pnt 2627 3771 Pnt 3422 3877 Pnt 3052 3826 Pnt 3247 3803 Pnt 3551 3876 Pnt 2984 3789 Pnt 3258 3786 Pnt 3143 3795 Pnt 2850 3789 Pnt 2527 3784 Pnt 2113 3792 Pnt 2885 3780 Pnt 3513 3820 Pnt 2570 3806 Pnt 2929 3806 Pnt 3020 3826 Pnt 2494 3761 Pnt 2664 3820 Pnt 2538 3791 Pnt 2370 3836 Pnt 3000 3786 Pnt 1959 3801 Pnt 3954 3786 Pnt 2784 3782 Pnt 3847 3761 Pnt 2893 3838 Pnt 3176 3840 Pnt 2013 3896 Pnt 3381 3796 Pnt 3198 3896 Pnt 2614 3843 Pnt 3822 3797 Pnt 3390 3843 Pnt 4152 3821 Pnt 2893 3830 Pnt 3239 3762 Pnt 2689 3796 Pnt 2603 3826 Pnt 2117 3850 Pnt 2722 3821 Pnt 2632 3790 Pnt 2020 3754 Pnt 4377 3796 Pnt 1990 3865 Pnt 3009 3814 Pnt 2974 3828 Pnt 3111 3828 Pnt 2015 3818 Pnt 3285 3772 Pnt 2868 3817 Pnt 3395 3811 Pnt 2732 3769 Pnt 4361 3809 Pnt 3323 3811 Pnt 2626 3810 Pnt 2805 3792 Pnt 3669 3800 Pnt 3518 3792 Pnt 3160 3775 Pnt 4245 3819 Pnt 2370 3834 Pnt 3770 3768 Pnt 4251 3795 Pnt 2678 3811 Pnt 2208 3810 Pnt 3063 3806 Pnt 2449 3808 Pnt 4407 3767 Pnt 2532 3772 Pnt 2914 3808 Pnt 3492 3794 Pnt 2483 3807 Pnt 3508 3795 Pnt 2427 3841 Pnt 3531 3822 Pnt 3515 3828 Pnt 4467 2917 Pnt 3261 3841 Pnt 2789 3807 Pnt 3736 3794 Pnt 1994 3813 Pnt 2840 3785 Pnt 3105 3812 Pnt 3502 3801 Pnt 2965 3778 Pnt 2694 3809 Pnt 3021 3788 Pnt 3536 3778 Pnt 2827 3788 Pnt 2262 3822 Pnt 4069 3807 Pnt 2912 3851 Pnt 3760 3805 Pnt 4091 3806 Pnt 3588 3814 Pnt 2253 3903 Pnt 4290 3771 Pnt 2647 3903 Pnt 2308 3820 Pnt 2861 3848 Pnt 4341 3055 Pnt 2401 3769 Pnt 2316 3804 Pnt 3720 3765 Pnt 3135 3083 Pnt 2182 3796 Pnt 3551 3793 Pnt 2503 3807 Pnt 2660 3792 Pnt 2080 3796 Pnt 3606 3856 Pnt 2779 3770 Pnt 2655 3858 Pnt 2259 3815 Pnt 2665 3786 Pnt 2895 3829 Pnt 2912 3820 Pnt 2676 3820 Pnt 4235 3770 Pnt 2750 3778 Pnt 2495 3805 Pnt 3962 3778 Pnt 2702 3813 Pnt 4211 3795 Pnt 2446 3774 Pnt 1976 3823 Pnt 3402 3849 Pnt 2811 3809 Pnt 2148 3829 Pnt 3161 3774 Pnt 3603 3781 Pnt 2869 3857 Pnt 4494 3832 Pnt 2425 3857 Pnt 2171 3803 Pnt 2208 3838 Pnt 2959 3777 Pnt 3145 3815 Pnt 3343 3803 Pnt 2176 3797 Pnt 2067 3807 Pnt 3570 3780 Pnt 2119 3780 Pnt 2907 3794 Pnt 2436 3784 Pnt 2461 3807 Pnt 4363 3797 Pnt 2221 3816 Pnt 2775 3774 Pnt 3308 3770 Pnt 3544 3778 Pnt 2197 3807 Pnt 2981 3816 Pnt 3286 3820 Pnt 2502 3853 Pnt 2351 3836 Pnt 3176 3811 Pnt 2442 3822 Pnt 3244 3762 Pnt 2799 3796 Pnt 2540 3881 Pnt 2102 3897 Pnt 3274 3802 Pnt 2597 3811 Pnt 3356 3811 Pnt 2518 3897 Pnt 3172 3819 Pnt 3128 3830 Pnt 2865 3796 Pnt 3034 3802 Pnt 2711 3782 Pnt 2659 3846 Pnt 2677 3804 Pnt 2633 3838 Pnt 3090 3794 Pnt 3016 3761 Pnt 3786 3846 Pnt 3739 3794 Pnt 3403 3761 Pnt 2882 3824 Pnt 3000 3764 Pnt 2996 3799 Pnt 2421 3790 Pnt 2090 3822 Pnt 3471 3813 Pnt 2834 3802 Pnt 3408 3832 Pnt 2800 3815 Pnt 2627 3832 Pnt 3186 3817 Pnt 2683 3778 Pnt 2593 3801 Pnt 2363 3871 Pnt 2322 3788 Pnt 3102 3802 Pnt 2854 3811 Pnt 2771 3788 Pnt 3831 3811 Pnt 2742 3825 Pnt 2447 3807 Pnt 2573 3757 Pnt 3780 3808 Pnt 3479 3830 Pnt 3033 3852 Pnt 2719 3802 Pnt 2696 3806 Pnt 2347 3771 Pnt 3152 3845 Pnt 1987 3814 Pnt 3368 3777 Pnt 4337 3852 Pnt 2617 3828 Pnt 2490 3824 Pnt 3191 3896 Pnt 3270 3838 Pnt 2593 3822 Pnt 3961 3822 Pnt 3641 3828 Pnt 4122 3760 Pnt 2505 3918 Pnt 3083 3807 Pnt 2861 3802 Pnt 2694 3809 Pnt 2798 3869 Pnt 2800 3771 Pnt 2259 3784 Pnt 2430 3805 Pnt 2145 3842 Pnt 3222 3918 Pnt 3619 3779 Pnt 2610 3811 Pnt 2459 3872 Pnt 3169 3809 Pnt 2455 3801 Pnt 3415 3817 Pnt 2775 3829 Pnt 2720 3783 Pnt 2495 3804 Pnt 2015 3800 Pnt 3115 3786 Pnt 2170 3925 Pnt 2302 3828 Pnt 3068 3801 Pnt 2889 3804 Pnt 2779 3794 Pnt 3051 3753 Pnt 2401 3828 Pnt 3135 3794 Pnt 2716 3771 Pnt 2602 3765 Pnt 2700 3767 Pnt 3387 3769 Pnt 2583 3815 Pnt 2416 3821 Pnt 2748 3870 Pnt 2962 3752 Pnt 1953 3934 Pnt 2880 3773 Pnt 2377 3776 Pnt 2287 3792 Pnt 2670 3773 Pnt 3558 3934 Pnt 3084 3808 Pnt 2502 3754 Pnt 2892 3780 Pnt 3292 3773 Pnt 2894 3774 Pnt 2798 3788 Pnt 2933 3834 Pnt 2150 3823 Pnt 3445 3786 Pnt 2337 3790 Pnt 2501 3803 Pnt 2520 3773 Pnt 2080 3929 Pnt 1943 3834 Pnt 2995 3813 Pnt 3345 3848 Pnt 2191 3806 Pnt 2054 3827 Pnt 3222 3838 Pnt 3126 3872 Pnt 2891 3779 Pnt 3634 3772 Pnt 2913 3759 Pnt 2742 3841 Pnt 2779 3788 Pnt 2745 3788 Pnt 3729 3841 Pnt 2660 3763 Pnt 4375 3794 Pnt 2173 3941 Pnt 3497 3786 Pnt 3208 3827 Pnt 2780 3753 Pnt 3502 3787 Pnt 3492 3856 Pnt 3612 3785 Pnt 2727 3759 Pnt 3204 3824 Pnt 3954 3787 Pnt 2637 3785 Pnt 3072 3833 Pnt 4381 3768 Pnt 3379 3824 Pnt 3025 3806 Pnt 3393 3867 Pnt 2934 3789 Pnt 2342 3927 Pnt 2886 3787 Pnt 3511 3774 Pnt 2716 3811 Pnt 3010 3785 Pnt 4303 3811 Pnt 2524 3852 Pnt 3762 3817 Pnt 3683 3772 Pnt 2899 3857 Pnt 3467 3795 Pnt 2529 3876 Pnt 3212 3775 Pnt 3060 3876 Pnt 3197 3804 Pnt 2440 3837 Pnt 3097 3813 Pnt 2966 3837 Pnt 2641 3793 Pnt 2513 3896 Pnt 3443 3797 Pnt 2660 3812 Pnt 3295 3787 Pnt 3088 3762 Pnt 3264 3843 Pnt 2107 3837 Pnt 3161 3762 Pnt 3257 3828 Pnt 2288 3782 Pnt 2693 3741 Pnt 3126 3841 Pnt 2415 3793 Pnt 2525 3782 Pnt 2447 3811 Pnt 3974 3785 Pnt 2916 3817 Pnt 2765 3834 Pnt 2442 3811 Pnt 3199 3805 Pnt 3194 3814 Pnt 2323 3846 Pnt 3201 3760 Pnt 3663 3771 Pnt 3211 3769 Pnt 3528 3765 Pnt 3024 3876 Pnt 2974 3773 Pnt 4114 3785 Pnt 4542 3763 Pnt 3028 3812 Pnt 2667 3786 Pnt 2599 3830 Pnt 2104 3785 Pnt 2913 3801 Pnt 4041 3853 Pnt 4006 3785 Pnt 2915 3820 Pnt 3465 3801 Pnt 2845 3775 Pnt 2422 3811 Pnt 3500 2981 Pnt 1983 3783 Pnt 2165 3842 Pnt 2964 3783 Pnt 2914 3878 Pnt 2528 3826 Pnt 3049 3784 Pnt 4409 3779 Pnt 2533 3772 Pnt 3375 3803 Pnt 2453 3820 Pnt 3834 3878 Pnt 2991 3783 Pnt 2606 3785 Pnt 2560 3795 Pnt 2433 3834 Pnt 3458 3785 Pnt 3121 3771 Pnt 2428 3855 Pnt 3551 3836 Pnt 2756 3797 Pnt 2371 3771 Pnt 2191 3885 Pnt 3105 3840 Pnt 2178 3826 Pnt 3716 3797 Pnt 4162 3801 Pnt 2410 3808 Pnt 3052 3796 Pnt 2942 3773 Pnt 3894 3800 Pnt 3384 3781 Pnt 2540 3774 Pnt 2419 3943 Pnt 3295 3774 Pnt 2488 3783 Pnt 3337 3923 Pnt 2380 3798 Pnt 2171 3807 Pnt 2680 3804 Pnt 3335 3837 Pnt 3587 3794 Pnt 2604 3800 Pnt 3085 3809 Pnt 3424 3796 Pnt 2923 3826 Pnt 2252 3841 Pnt 3043 3791 Pnt 3968 3786 Pnt 2739 3781 Pnt 2524 3778 Pnt 2396 3867 Pnt 3473 3778 Pnt 2880 3822 Pnt 2637 3806 Pnt 3099 3827 Pnt 2743 3802 Pnt 3424 3806 Pnt 3410 3827 Pnt 2942 3790 Pnt 3342 3810 Pnt 2983 3795 Pnt 2449 3842 Pnt 2973 3795 Pnt 4359 3790 Pnt 2292 3792 Pnt 2261 3828 Pnt 2496 3800 Pnt 2158 3825 Pnt 2325 3814 Pnt 2910 3828 Pnt 3966 3778 Pnt 1916 3826 Pnt 3957 3814 Pnt 2281 3821 Pnt 2101 3794 Pnt 2427 3791 Pnt 2719 3772 Pnt 2494 3786 Pnt 2480 3800 Pnt 3625 3787 Pnt 2709 3817 Pnt 4637 3797 Pnt 2749 3800 Pnt 2688 3811 Pnt 3174 3795 Pnt 3326 3809 Pnt 2090 3853 Pnt 2572 3934 Pnt 1938 3825 Pnt 4079 3932 Pnt 3051 3765 Pnt 3202 3825 Pnt 2596 3816 Pnt 3449 3849 Pnt 2198 3762 Pnt 2820 3848 Pnt 2742 3774 Pnt 2590 3813 Pnt 2432 3760 Pnt 2860 3844 Pnt 2432 3828 Pnt 2713 3760 Pnt 2384 3808 Pnt 2661 3809 Pnt 2844 3801 Pnt 3243 3903 Pnt 2384 3828 Pnt 2347 3796 Pnt 4194 3796 Pnt 3104 3792 Pnt 2888 3768 Pnt 2723 3774 Pnt 1889 3744 Pnt 3301 3774 Pnt 4482 3768 Pnt 3174 3792 Pnt 2862 3803 Pnt 2916 3770 Pnt 3139 3792 Pnt 2639 3856 Pnt 3385 3862 Pnt 2531 3834 Pnt 3541 3770 Pnt 3118 3826 Pnt 2531 3787 Pnt 2736 3790 Pnt 2135 3821 Pnt 3545 3813 Pnt 2334 3827 Pnt 3318 3761 Pnt 2946 3770 Pnt 3194 3809 Pnt 2657 3782 Pnt 4387 3756 Pnt 2291 3778 Pnt 4314 3813 Pnt 4083 3826 Pnt 3432 3804 Pnt 3140 3784 Pnt 3416 3836 Pnt 1839 3813 Pnt 3050 3836 Pnt 3055 3840 Pnt 2605 3760 Pnt 1978 3897 Pnt 3677 3819 Pnt 2492 3782 Pnt 2177 3815 Pnt 3243 3819 Pnt 3180 3782 Pnt 2277 3791 Pnt 2770 3811 Pnt 4148 3791 Pnt 2686 3809 Pnt 3039 3786 Pnt 2753 3779 Pnt 4147 3821 Pnt 2635 3815 Pnt 2489 3832 Pnt 3338 3829 Pnt 2755 3785 Pnt 3407 3815 Pnt 2617 3820 Pnt 3058 3807 Pnt 2475 3903 Pnt 1883 3803 Pnt 2652 3804 Pnt 3275 3830 Pnt 2576 3813 Pnt 2873 3813 Pnt 2895 3821 Pnt 3250 3780 Pnt 2368 3842 Pnt 3181 3820 Pnt 2220 3816 Pnt 2971 3845 Pnt 3817 3795 Pnt 2943 3774 Pnt 3168 3754 Pnt 2107 3813 Pnt 3190 3770 Pnt 3066 3802 Pnt 1961 3865 Pnt 2757 3881 Pnt 2964 3802 Pnt 2142 3830 Pnt 2992 3814 Pnt 2341 3806 Pnt 3329 3849 Pnt 2923 3849 Pnt 2250 3845 Pnt 2160 3848 Pnt 3774 3777 Pnt 4439 3845 Pnt 2696 3775 Pnt 2677 3771 Pnt 2614 3788 Pnt 2897 3828 Pnt 2491 3857 Pnt 2096 3803 Pnt 2374 3791 Pnt 2128 3853 Pnt 2009 3782 Pnt 2717 3850 Pnt 3921 3822 Pnt 3043 3784 Pnt 4472 3780 Pnt 2455 3807 Pnt 2773 3127 Pnt 3375 3809 Pnt 2530 3828 Pnt 2110 3842 Pnt 3260 3822 Pnt 3674 3828 Pnt 3484 3830 Pnt 2604 3794 Pnt 1982 3820 Pnt 2406 3805 Pnt 4070 3794 Pnt 4005 3765 Pnt 3229 3801 Pnt 2674 3812 Pnt 3434 3801 Pnt 3612 3778 Pnt 2172 3829 Pnt 2716 3811 Pnt 3333 3830 Pnt 3194 3837 Pnt 1917 3807 Pnt 3004 3837 Pnt 2622 3765 Pnt 4135 3811 Pnt 2348 3819 Pnt 2156 3797 Pnt 3122 3834 Pnt 3431 3817 Pnt 2934 3815 Pnt 3257 3801 Pnt 3250 3834 Pnt 2985 3870 Pnt 2894 3807 Pnt 2328 3799 Pnt 2808 3799 Pnt 2398 3836 Pnt 2618 3773 Pnt 2668 3788 Pnt 3043 3855 Pnt 2944 3788 Pnt 3645 3870 Pnt 3042 3779 Pnt 2883 3787 Pnt 2007 3934 Pnt 2884 3778 Pnt 3461 3787 Pnt 2851 3841 Pnt 2632 3759 Pnt 2352 3871 Pnt 3210 3773 Pnt 2233 3785 Pnt 2557 3787 Pnt 3160 3824 Pnt 3409 3794 Pnt 2551 3794 Pnt 3098 3811 Pnt 3540 3774 Pnt 2875 3789 Pnt 2613 3814 Pnt 2498 3771 Pnt 2858 3774 Pnt 4200 3792 Pnt 2535 3815 Pnt 2955 3802 Pnt 3147 3815 Pnt 3044 3794 Pnt 2355 3857 Pnt 2844 3802 Pnt 2566 3835 Pnt 2673 3797 Pnt 2390 3784 Pnt 2922 3771 Pnt 3615 3807 Pnt 2786 3820 Pnt 3062 3770 Pnt 3488 3810 Pnt 3310 3808 Pnt 2960 3836 Pnt 3596 3790 Pnt 2194 3797 Pnt 3169 3802 Pnt 3675 3811 Pnt 2966 3752 Pnt 3306 3838 Pnt 2404 3896 Pnt 4391 3797 Pnt 3183 3803 Pnt 2374 3941 Pnt 3218 3761 Pnt 2600 3847 Pnt 3228 3807 Pnt 2653 3876 Pnt 2813 3761 Pnt 4001 3783 Pnt 2497 3816 Pnt 3289 3769 Pnt 2732 3787 Pnt 2317 3852 Pnt 2124 3762 Pnt 2892 3804 Pnt 2747 3857 Pnt 3768 3765 Pnt 2500 3837 Pnt 2786 3852 Pnt 2138 3802 Pnt 2593 3823 Pnt 3317 3846 Pnt 2729 3878 Pnt 2445 3796 Pnt 2167 3788 Pnt 2517 3772 Pnt 3259 3783 Pnt 2753 3811 Pnt 2730 3783 Pnt 2773 3777 Pnt 2469 3813 Pnt 2120 3929 Pnt 3793 3834 Pnt 3938 3781 Pnt 3202 3766 Pnt 3113 3929 Pnt 3132 3809 Pnt 2131 3811 Pnt 3646 3819 Pnt 1990 3828 Pnt 2826 3797 Pnt 2224 3846 Pnt 3816 3800 Pnt 2359 3838 Pnt 2863 3806 Pnt 3612 3802 Pnt 2597 3789 Pnt 3695 3867 Pnt 2889 3789 Pnt 1916 3783 Pnt 2752 3791 Pnt 2821 3880 Pnt 2460 3793 Pnt 2512 3788 Pnt 2232 3848 Pnt 2920 3791 Pnt 2891 3817 Pnt 3393 3840 Pnt 2643 3782 Pnt 3060 3817 Pnt 2780 3834 Pnt 3778 3789 Pnt 2652 3827 Pnt 2731 3812 Pnt 2815 3789 Pnt 2400 3811 Pnt 2320 3795 Pnt 2202 3830 Pnt 2998 3795 Pnt 2502 3821 Pnt 3052 3814 Pnt 2871 3827 Pnt 2060 3747 Pnt 3071 3747 Pnt 2902 3759 Pnt 4331 3779 Pnt 4042 3814 Pnt 2859 3826 Pnt 2968 3785 Pnt 3255 3785 Pnt 3717 3822 Pnt 3069 3784 Pnt 3262 3765 Pnt 4363 3763 Pnt 3150 3784 Pnt 2881 3765 Pnt 3290 3794 Pnt 2886 3803 Pnt 3215 3775 Pnt 3511 3821 Pnt 2923 3782 Pnt 2549 3795 Pnt 3624 3787 Pnt 2532 3801 Pnt 2646 3811 Pnt 2508 3785 Pnt 2120 3828 Pnt 4021 3757 Pnt 1969 3800 Pnt 2185 3814 Pnt 3144 3792 Pnt 3237 3814 Pnt 2729 3792 Pnt 2302 3932 Pnt 3834 3823 Pnt 3992 3813 Pnt 2685 3771 Pnt 2640 3813 Pnt 2075 3925 Pnt 2547 3774 Pnt 2231 3828 Pnt 3834 3777 Pnt 3215 3844 Pnt 3508 3803 Pnt 2281 3767 Pnt 3650 3803 Pnt 2880 3774 Pnt 2711 3779 Pnt 3047 3806 Pnt 4099 3815 Pnt 3309 3783 Pnt 2339 3927 Pnt 2989 3828 Pnt 2855 3780 Pnt 2218 3811 Pnt 2707 3817 Pnt 3776 3799 Pnt 2762 3813 Pnt 3091 3774 Pnt 3741 3792 Pnt 3191 3785 Pnt 3275 3849 Pnt 3030 3804 Pnt 2951 3789 Pnt 4251 3760 Pnt 2696 3804 Pnt 2197 3836 Pnt 3102 3790 Pnt 3293 3789 Pnt 2731 3821 Pnt 1836 3803 Pnt 2783 3824 Pnt 2465 3824 Pnt 2384 3828 Pnt 2666 3893 Pnt 2412 3773 Pnt 2250 3809 Pnt 2388 3803 Pnt 3312 3893 Pnt 3180 3803 Pnt 3647 3760 Pnt 2851 3838 Pnt 4591 3814 Pnt 3099 3790 Pnt 3160 3246 Pnt 3371 3838 Pnt 2936 3823 Pnt 3321 3801 Pnt 3274 3827 Pnt 2837 3817 Pnt 4606 3783 Pnt 3122 3808 Pnt 2608 3858 Pnt 2441 3869 Pnt 2917 3780 Pnt 2357 3832 Pnt 3091 3764 Pnt 3993 3807 Pnt 2826 3807 Pnt 2929 3801 Pnt 3282 3780 Pnt 2396 3781 Pnt 3895 3135 Pnt 3186 3784 Pnt 3162 3809 Pnt 2142 3903 Pnt 2045 3943 Pnt 2588 3800 Pnt 2577 3872 Pnt 3155 3812 Pnt 2753 3800 Pnt 2516 3792 Pnt 2636 3783 Pnt 2112 3845 Pnt 2086 3833 Pnt 2219 3798 Pnt 2205 3816 Pnt 3293 3833 Pnt 2090 3807 Pnt 3570 3760 Pnt 3022 3823 Pnt 2404 3804 Pnt 3225 3802 Pnt 2992 3769 Pnt 2292 3791 Pnt 2209 3787 Pnt 2202 3793 Pnt 3073 3830 Pnt 3286 3786 Pnt 2779 3800 Pnt 2775 3828 Pnt 2617 3822 Pnt 2863 3826 Pnt 3600 3797 Pnt 2121 3806 Pnt 3154 3797 Pnt 1948 3827 Pnt 3042 3850 Pnt 3796 3774 Pnt 4437 3826 Pnt 2840 3844 Pnt 2662 3838 Pnt 2299 3867 Pnt 3386 3820 Pnt 1901 3806 Pnt 2942 3795 Pnt 2709 3795 Pnt 3445 3795 Pnt 2860 3849 Pnt 3102 3811 Pnt 3542 3872 Pnt 2867 3816 Pnt 3176 3781 Pnt 3018 3793 Pnt 2867 3775 Pnt 2722 3801 Pnt 2747 3794 Pnt 2438 3802 Pnt 4634 3775 Pnt 2217 3796 Pnt 2502 3784 Pnt 2884 3862 Pnt 2618 3799 Pnt 2883 3811 Pnt 2200 3806 Pnt 2824 3830 Pnt 3606 3809 Pnt 2810 3799 Pnt 3052 3790 Pnt 2828 3800 Pnt 2919 3790 Pnt 2555 3806 Pnt 3264 3815 Pnt 2420 3800 Pnt 2159 3765 Pnt 3433 3815 Pnt 3088 3809 Pnt 2843 3783 Pnt 2208 3741 Pnt 3277 3816 Pnt 2585 3831 Pnt 2019 3797 Pnt 1967 3825 Pnt 4875 3872 Pnt 2608 3824 Pnt 2280 3796 Pnt 1976 3820 Pnt 2656 3840 Pnt 2368 3813 Pnt 2629 3772 Pnt 3120 3813 Pnt 4395 3796 Pnt 3425 3839 Pnt 3029 3801 Pnt 2770 3774 Pnt 2664 3807 Pnt 3803 3832 Pnt 3307 3801 Pnt 2664 3809 Pnt 2514 3762 Pnt 2296 3803 Pnt 2966 3811 Pnt 2770 3810 Pnt 2328 3848 Pnt 2760 3808 Pnt 2083 3846 Pnt 2241 3819 Pnt 2769 3847 Pnt 2497 3760 Pnt 3877 3770 Pnt 2478 3846 Pnt 2803 3780 Pnt 2316 3808 Pnt 2403 3830 Pnt 3073 3836 Pnt 2585 3808 Pnt 4050 3810 Pnt 2561 3828 Pnt 2885 3789 Pnt 2773 3828 Pnt 2608 3821 Pnt 2867 3801 Pnt 2644 3767 Pnt 2621 3788 Pnt 3187 3847 Pnt 2769 3780 Pnt 2488 3787 Pnt 3045 3847 Pnt 2681 3818 Pnt 2328 3794 Pnt 2664 3852 Pnt 2123 3832 Pnt 2651 3799 Pnt 2339 3774 Pnt 2538 3816 Pnt 2594 3815 Pnt 2254 3814 Pnt 3764 3799 Pnt 2140 3797 Pnt 2220 3797 Pnt 1951 3796 Pnt 4227 3778 Pnt 1712 3896 Pnt 4143 3841 Pnt 4537 3806 Pnt 3120 3766 Pnt 2774 3752 Pnt 3705 3800 Pnt 3682 3849 Pnt 1948 3941 Pnt 2704 3800 Pnt 2906 3783 Pnt 3987 3773 Pnt 3661 3792 Pnt 3056 3814 Pnt 2293 3808 Pnt 3018 3767 Pnt 2991 3794 Pnt 2930 3811 Pnt 2130 3804 Pnt 2603 3810 Pnt 3304 3767 Pnt 3057 3812 Pnt 1994 3929 Pnt 2982 3929 Pnt 2375 3845 Pnt 2760 3766 Pnt 2857 3807 Pnt 2527 3805 Pnt 3429 3807 Pnt 2900 3761 Pnt 2772 3828 Pnt 2531 3810 Pnt 3424 3780 Pnt 2749 3780 Pnt 2799 3832 Pnt 2582 3779 Pnt 2594 3818 Pnt 2632 3830 Pnt 2166 3756 Pnt 2731 3812 Pnt 2349 3846 Pnt 1932 3897 Pnt 2752 3789 Pnt 3195 3819 Pnt 4423 3804 Pnt 2172 3790 Pnt 3338 3782 Pnt 2608 3788 Pnt 2336 3754 Pnt 4505 3783 Pnt 2534 3828 Pnt 3162 3786 Pnt 2850 3821 Pnt 3386 3791 Pnt 2685 3815 Pnt 3942 3750 Pnt 2898 3876 Pnt 4267 3824 Pnt 4263 3173 Pnt 3521 3806 Pnt 4329 3876 Pnt 3556 3923 Pnt 3629 3817 Pnt 4635 3782 Pnt 3142 3759 Pnt 3469 3840 Pnt 3540 3856 Pnt 3214 3793 Pnt 2640 3789 Pnt 2613 3827 Pnt 2957 3782 Pnt 3666 3823 Pnt 3219 3793 Pnt 2282 3826 Pnt 3164 3755 Pnt 2721 3834 Pnt 3454 3773 Pnt 2375 3794 Pnt 3068 3834 Pnt 2201 3821 Pnt 1993 3865 Pnt 2368 3747 Pnt 3226 3779 Pnt 3080 3784 Pnt 2861 3776 Pnt 2335 3785 Pnt 3623 3881 Pnt 2350 3785 Pnt 3058 3790 Pnt 2581 3836 Pnt 3274 3802 Pnt 2923 3822 Pnt 3306 3816 Pnt 2889 3765 Pnt 2710 3801 Pnt 2670 3781 Pnt 2374 3800 Pnt 2730 3800 Pnt 3166 3809 Pnt 2472 3814 Pnt 4374 3826 Pnt 2233 3787 Pnt 2689 3771 Pnt 2189 3828 Pnt 3388 3778 Pnt 3477 3828 Pnt 3013 3778 Pnt 3016 3792 Pnt 4553 3779 Pnt 2559 3802 Pnt 4306 3789 Pnt 3364 3802 Pnt 3891 3790 Pnt 3365 3775 Pnt 2346 3807 Pnt 3003 3826 Pnt 4502 3821 Pnt 2845 3815 Pnt 2525 3855 Pnt 3101 3813 Pnt 2084 3794 Pnt 3416 3855 Pnt 2331 3844 Pnt 3116 3783 Pnt 3646 3813 Pnt 3717 3844 Pnt 2902 3804 Pnt 2365 3811 Pnt 2179 3822 Pnt 3038 3789 Pnt 2544 3840 Pnt 3454 3789 Pnt 2870 3844 Pnt 2622 3836 Pnt 3868 3852 Pnt 2404 3824 Pnt 3082 3815 Pnt 3387 3850 Pnt 2107 3809 Pnt 3148 3824 Pnt 3119 3857 Pnt 2694 3803 Pnt 2764 3878 Pnt 2301 3828 Pnt 4133 3789 Pnt 3267 3803 Pnt 2864 3770 Pnt 2696 3796 Pnt 2443 3893 Pnt 2461 3796 Pnt 2092 3788 Pnt 2770 3795 Pnt 2329 3760 Pnt 2985 3788 Pnt 2944 3837 Pnt 2336 3777 Pnt 4370 3850 Pnt 3323 3778 Pnt 3567 3838 Pnt 4341 3893 Pnt 2590 3817 Pnt 2711 3842 Pnt 3051 3792 Pnt 3774 3811 Pnt 3638 3778 Pnt 3412 3812 Pnt 2877 3829 Pnt 3132 3769 Pnt 2523 3791 Pnt 3285 3780 Pnt 2874 3768 Pnt 4353 3814 Pnt 2532 3943 Pnt 3888 3820 Pnt 2557 3846 Pnt 3520 3814 Pnt 3182 3814 Pnt 2106 3823 Pnt 2713 3790 Pnt 2180 3834 Pnt 3441 3800 Pnt 2786 3783 Pnt 2392 3793 Pnt 4328 3814 Pnt 4037 3781 Pnt 3349 3789 Pnt 2856 3781 Pnt 2662 3836 Pnt 3319 3831 Pnt 3414 3811 Pnt 2832 3804 Pnt 2510 3770 Pnt 3078 3828 Pnt 4045 3804 Pnt 3017 3810 Pnt 2966 3815 Pnt 2271 3804 Pnt 2307 3822 Pnt 3071 3817 Pnt 2662 3802 Pnt 2898 3826 Pnt 3237 3826 Pnt 2772 3781 Pnt 2124 3806 Pnt 2193 3850 Pnt 2839 3826 Pnt 3072 3791 Pnt 4061 3778 Pnt 3857 3802 Pnt 4064 3797 Pnt 2702 3849 Pnt 3435 3785 Pnt 3502 3797 Pnt 2444 3783 Pnt 3207 3811 Pnt 4161 3808 Pnt 2942 3800 Pnt 2475 3815 Pnt 3654 3773 Pnt 3309 3777 Pnt 4487 3778 Pnt 3175 3776 Pnt 2832 3798 Pnt 2523 3840 Pnt 2286 3826 Pnt 2248 3771 Pnt 3561 3840 Pnt 3286 3836 Pnt 2916 3823 Pnt 4219 3789 Pnt 3704 3856 Pnt 1931 3828 Pnt 2744 3822 Pnt 3379 3814 Pnt 4510 3824 Pnt 3420 3827 Pnt 2999 3811 Pnt 2282 3802 Pnt 3607 3783 Pnt 4030 3790 Pnt 2016 3812 Pnt 2591 3806 Pnt 3197 3806 Pnt 3069 3815 Pnt 2261 3811 Pnt 2427 3795 Pnt 2993 3847 Pnt 2129 3846 Pnt 2888 3870 Pnt 2241 3819 Pnt 3563 3788 Pnt 2985 3824 Pnt 2633 3773 Pnt 2471 3824 Pnt 2769 3773 Pnt 2556 3786 Pnt 4213 3829 Pnt 2600 3791 Pnt 2518 3824 Pnt 2414 3819 Pnt 2494 3784 Pnt 2644 3808 Pnt 2481 3807 Pnt 2156 3839 Pnt 2486 3799 Pnt 3242 3822 Pnt 3136 3918 Pnt 2739 3807 Pnt 3232 3823 Pnt 3660 3830 Pnt 4323 3918 Pnt 2494 3903 Pnt 2903 3812 Pnt 2639 3793 Pnt 3257 3817 Pnt 3292 3814 Pnt 2839 3812 Pnt 1837 3783 Pnt 2013 3845 Pnt 2107 3833 Pnt 3766 3781 Pnt 1898 3798 Pnt 3388 3790 Pnt 3503 3801 Pnt 3695 3799 Pnt 2679 3822 Pnt 2911 3788 Pnt 5065 3833 Pnt 3105 3814 Pnt 3325 3822 Pnt 2074 3810 Pnt 3409 3830 Pnt 3253 3809 Pnt 2363 3809 Pnt 4159 3798 Pnt 3006 3809 Pnt 3820 3786 Pnt 2665 3832 Pnt 2987 3808 Pnt 2525 3793 Pnt 4399 3325 Pnt 2883 3801 Pnt 2125 3784 Pnt 3197 3867 Pnt 2262 3752 Pnt 2682 3825 Pnt 3714 3823 Pnt 3416 3789 Pnt 2671 3789 Pnt 3094 3819 Pnt 2194 3828 Pnt 2796 3832 Pnt 2322 3897 Pnt 3539 3773 Pnt 2316 3815 Pnt 3997 3815 Pnt 1941 3929 Pnt 3487 3932 Pnt 2230 3852 Pnt 3083 3786 Pnt 2994 3786 Pnt 2988 3803 Pnt 4409 3813 Pnt 2918 3825 Pnt 3604 3824 Pnt 2789 3862 Pnt 2801 3766 Pnt 3009 3785 Pnt 2673 3837 Pnt 4281 3766 Pnt 3240 3029 Pnt 2826 3832 Pnt 3314 3800 Pnt 3286 3793 Pnt 2752 3793 Pnt 4245 3762 Pnt 2914 3796 Pnt 2383 3010 Pnt 3024 3794 Pnt 2636 3855 Pnt 2337 3840 Pnt 2538 3806 Pnt 2725 3765 Pnt 3178 3811 Pnt 2229 3778 Pnt 3926 3784 Pnt 1954 3818 Pnt 2466 3759 Pnt 2571 3821 Pnt 4074 3801 Pnt 2282 3871 Pnt 2327 3814 Pnt 3761 3871 Pnt 4310 3785 Pnt 2352 3797 Pnt 3650 3824 Pnt 2167 3765 Pnt 4578 3770 Pnt 2623 3809 Pnt 3664 3773 Pnt 3517 3809 Pnt 2198 3741 Pnt 2650 3754 Pnt 3526 3801 Pnt 2535 3790 Pnt 3779 3166 Pnt 2411 3923 Pnt 2399 3759 Pnt 3548 3912 Pnt 3191 3767 Pnt 2914 3841 Pnt 3479 3767 Pnt 4197 3820 Pnt 2521 3796 Pnt 3826 3841 Pnt 3075 3844 Pnt 3851 3794 Pnt 2652 3776 Pnt 2756 3836 Pnt 3354 3776 Pnt 2108 3762 Pnt 3568 3836 Pnt 2939 3807 Pnt 2104 3826 Pnt 4348 3764 Pnt 3325 3826 Pnt 2082 3807 Pnt 3118 3795 Pnt 2102 3800 Pnt 3608 3793 Pnt 2440 3792 Pnt 2725 3800 Pnt 2842 3834 Pnt 1997 3941 Pnt 2817 3783 Pnt 4008 3809 Pnt 3814 3794 Pnt 1892 3865 Pnt 2900 3785 Pnt 2966 3783 Pnt 2721 3790 Pnt 2814 3770 Pnt 2776 3842 Pnt 2256 3811 Pnt 3559 3790 Pnt 3526 3804 Pnt 2363 3770 Pnt 3158 3808 Pnt 2108 3821 Pnt 2089 3772 Pnt 2197 3822 Pnt 2838 3833 Pnt 2820 3821 Pnt 2654 3803 Pnt 2605 3880 Pnt 2870 3790 Pnt 3390 3817 Pnt 2887 3880 Pnt 2516 3840 Pnt 2711 3789 Pnt 2042 3844 Pnt 2629 3799 Pnt 3397 3837 Pnt 2408 3796 Pnt 3319 3837 Pnt 2740 3767 Pnt 2841 3767 Pnt 2677 3795 Pnt 2827 3781 Pnt 1910 3796 Pnt 2651 3857 Pnt 4187 3843 Pnt 2517 3788 Pnt 3396 3817 Pnt 2098 3789 Pnt 3757 3795 Pnt 2964 3857 Pnt 2992 3771 Pnt 2197 3843 Pnt 3002 3832 Pnt 2487 3783 Pnt 3242 3814 Pnt 4673 3783 Pnt 2615 3814 Pnt 3148 3842 Pnt 2949 3788 Pnt 2563 3809 Pnt 2912 3809 Pnt 2652 3816 Pnt 3402 3789 Pnt 2846 3809 Pnt 3310 3839 Pnt 2726 3815 Pnt 2673 3812 Pnt 3090 3787 Pnt 2138 3804 Pnt 2864 3836 Pnt 2930 3782 Pnt 3142 3862 Pnt 3089 3789 Pnt 2553 3795 Pnt 3881 3813 Pnt 2592 3805 Pnt 2929 3811 Pnt 2816 3801 Pnt 3126 3807 Pnt 2243 3932 Pnt 4089 3862 Pnt 2582 3804 Pnt 2257 3794 Pnt 4222 3794 Pnt 2943 3811 Pnt 2175 3856 Pnt 2621 3823 Pnt 3386 3804 Pnt 2662 3816 Pnt 2270 3804 Pnt 2117 3925 Pnt 3782 3799 Pnt 2599 3797 Pnt 3296 3858 Pnt 3124 3774 Pnt 2349 3900 Pnt 3021 3824 Pnt 2451 3798 Pnt 2724 3826 Pnt 1839 3815 Pnt 2869 3798 Pnt 3787 3823 Pnt 2649 3782 Pnt 2952 3876 Pnt 2715 3862 Pnt 2936 3832 Pnt 2355 3827 Pnt 3115 3760 Pnt 2595 3779 Pnt 3594 3769 Pnt 2976 3806 Pnt 2496 3748 Pnt 4076 3806 Pnt 2701 3849 Pnt 2477 3818 Pnt 2267 3926 Pnt 1987 3756 Pnt 3849 3830 Pnt 2852 3780 Pnt 4638 3811 Pnt 3930 3756 Pnt 2724 3780 Pnt 3045 3789 Pnt 2570 3782 Pnt 2825 3845 Pnt 2416 3843 Pnt 4002 3787 Pnt 2740 3807 Pnt 2551 3782 Pnt 3699 3811 Pnt 2771 3782 Pnt 2034 3854 Pnt 4559 3782 Pnt 2940 3777 Pnt 2378 3786 Pnt 3514 3809 Pnt 2587 3814 Pnt 2673 3777 Pnt 2583 3812 Pnt 2792 3823 Pnt 2699 3786 Pnt 3213 3823 Pnt 3261 3785 Pnt 3213 3770 Pnt 2420 3747 Pnt 3327 3775 Pnt 2336 3881 Pnt 3361 3754 Pnt 2356 3802 Pnt 3095 3849 Pnt 2367 3785 Pnt 2235 3836 Pnt 3668 3784 Pnt 3336 3815 Pnt 2708 3818 Pnt 3077 3816 Pnt 2484 3816 Pnt 3678 3815 Pnt 4211 3758 Pnt 1987 3845 Pnt 3394 3788 Pnt 3194 3758 Pnt 3071 3810 Pnt 2551 3798 Pnt 2212 3828 Pnt 3127 3823 Pnt 2540 3781 Pnt 3213 3840 Pnt 4231 3823 Pnt 4400 3781 Pnt 3678 3780 Pnt 3107 3771 Pnt 2897 3855 Pnt 2716 3869 Pnt 2637 3771 Pnt 2252 3874 Pnt 3649 3773 Pnt 2785 3802 Pnt 2139 3781 Pnt 2637 3830 Pnt 4243 3771 Pnt 2692 3824 Pnt 2728 3794 Pnt 2276 3830 Pnt 2249 3821 Pnt 2944 3821 Pnt 2277 3792 Pnt 2839 3807 Pnt 2650 3813 Pnt 2033 3799 Pnt 2131 3791 Pnt 2056 3784 Pnt 2192 3791 Pnt 3239 3893 Pnt 4018 3775 Pnt 3985 3778 Pnt 2946 3895 Pnt 2350 3792 Pnt 3183 3847 Pnt 3863 3781 Pnt 3326 3867 Pnt 2827 3847 Pnt 2545 3820 Pnt 2552 3844 Pnt 3124 3781 Pnt 1959 3810 Pnt 2533 3795 Pnt 4438 3778 Pnt 2898 3844 Pnt 2163 3844 Pnt 2723 3795 Pnt 2493 3836 Pnt 2151 3832 Pnt 2102 3832 Pnt 4583 3809 Pnt 3648 3832 Pnt 3204 3831 Pnt 3096 3872 Pnt 2761 3897 Pnt 2680 3775 Pnt 2691 3817 Pnt 2715 3897 Pnt 2148 3815 Pnt 3597 3760 Pnt 2649 3838 Pnt 2205 3830 Pnt 3304 3791 Pnt 3045 3830 Pnt 2598 3802 Pnt 2668 3821 Pnt 2823 3823 Pnt 3106 3821 Pnt 2568 3806 Pnt 3717 3806 Pnt 4416 3775 Pnt 3340 3806 Pnt 2940 3790 Pnt 3665 3776 Pnt 2721 3792 Pnt 3197 3778 Pnt 2267 3829 Pnt 2986 3829 Pnt 3650 3800 Pnt 3074 3796 Pnt 3407 3850 Pnt 3470 3774 Pnt 2706 3774 Pnt 4381 3817 Pnt 2401 3791 Pnt 3558 3809 Pnt 3292 3794 Pnt 3560 3809 Pnt 3848 3799 Pnt 3389 3793 Pnt 3671 3808 Pnt 3113 3765 Pnt 2938 3780 Pnt 3054 3781 Pnt 2346 3793 Pnt 2741 3811 Pnt 3401 3765 Pnt 2454 3943 Pnt 3387 3814 Pnt 2398 3781 Pnt 4649 3789 Pnt 2234 3819 Pnt 3794 3821 Pnt 2315 3801 Pnt 2868 3846 Pnt 2857 3810 Pnt 4436 3814 Pnt 2395 3823 Pnt 2948 3055 Pnt 3182 3810 Pnt 2333 3871 Pnt 2790 3792 Pnt 2388 3799 Pnt 3420 3807 Pnt 2714 3834 Pnt 2950 3759 Pnt 2397 3807 Pnt 3262 3827 Pnt 3186 3878 Pnt 2859 3793 Pnt 2476 3787 Pnt 2475 3837 Pnt 2788 3908 Pnt 2084 3782 Pnt 2903 3908 Pnt 3645 3837 Pnt 2714 3833 Pnt 2344 3912 Pnt 2331 3854 Pnt 3735 3783 Pnt 2635 3820 Pnt 3107 3854 Pnt 2122 3807 Pnt 3053 3814 Pnt 2353 3795 Pnt 1805 3826 Pnt 3172 3828 Pnt 1952 3845 Pnt 2103 3822 Pnt 2611 3822 Pnt 2527 3838 Pnt 2000 3806 Pnt 2520 3755 Pnt 1914 3798 Pnt 2919 3791 Pnt 2792 3811 Pnt 2703 3797 Pnt 2074 3811 Pnt 3015 3801 Pnt 2505 3862 Pnt 3010 3790 Pnt 2363 3760 Pnt 4542 3783 Pnt 2765 3832 Pnt 2618 3832 Pnt 3069 3759 Pnt 2665 3876 Pnt 2194 3778 Pnt 2360 3815 Pnt 3724 3833 Pnt 3071 3842 Pnt 2577 3855 Pnt 2985 3821 Pnt 3371 3838 Pnt 2168 3840 Pnt 2333 3944 Pnt 2630 3776 Pnt 2730 3806 Pnt 2875 3872 Pnt 2655 3808 Pnt 3578 3806 Pnt 2621 3827 Pnt 2757 3808 Pnt 2407 3764 Pnt 3230 3842 Pnt 3210 3801 Pnt 2919 3842 Pnt 2900 3770 Pnt 3197 3770 Pnt 2421 3822 Pnt 2878 3842 Pnt 4275 3827 Pnt 4425 3126 Pnt 2791 3808 Pnt 2815 3806 Pnt 2715 3765 Pnt 2728 3787 Pnt 3360 3767 Pnt 2391 3826 Pnt 2615 3829 Pnt 2207 3791 Pnt 2771 3789 Pnt 2245 3811 Pnt 2730 3836 Pnt 4279 3765 Pnt 2754 3790 Pnt 2721 3764 Pnt 2872 3857 Pnt 2631 3791 Pnt 2378 3807 Pnt 3090 3814 Pnt 2967 3799 Pnt 2934 3803 Pnt 2363 3805 Pnt 3740 3764 Pnt 2282 3800 Pnt 2118 3839 Pnt 2631 3792 Pnt 3699 3805 Pnt 3382 3880 Pnt 2733 3841 Pnt 2130 3918 Pnt 2139 3838 Pnt 3098 3791 Pnt 2294 3793 Pnt 3184 3791 Pnt 3157 3804 Pnt 2755 3810 Pnt 3923 3766 Pnt 3224 3800 Pnt 3428 3857 Pnt 3369 3798 Pnt 2598 3781 Pnt 3531 3858 Pnt 2239 3808 Pnt 2033 3791 Pnt 3076 3808 Pnt 2537 3809 Pnt 4641 3781 Pnt 2345 3800 Pnt 3355 3797 Pnt 2745 3774 Pnt 3225 3774 Pnt 2783 3842 Pnt 2984 3802 Pnt 4187 3793 Pnt 2762 3832 Pnt 4009 3785 Pnt 3152 3780 Pnt 3115 3806 Pnt 3173 3849 Pnt 2858 3841 Pnt 2683 3791 Pnt 3468 3849 Pnt 3326 3841 Pnt 2463 3809 Pnt 2690 3812 Pnt 2643 3809 Pnt 2241 3812 Pnt 2734 3831 Pnt 3332 3818 Pnt 3027 3813 Pnt 2502 3777 Pnt 2068 3777 Pnt 3637 3813 Pnt 2046 3807 Pnt 3332 3932 Pnt 2831 3803 Pnt 2447 3769 Pnt 4593 3789 Pnt 3149 3769 Pnt 2182 3794 Pnt 4169 3765 Pnt 2583 3819 Pnt 3278 2956 Pnt 2793 3783 Pnt 3475 3819 Pnt 3263 3789 Pnt 2963 3809 Pnt 2920 3826 Pnt 2613 3809 Pnt 2765 3819 Pnt 3033 3754 Pnt 2975 3819 Pnt 3081 3845 Pnt 4491 3787 Pnt 2476 3795 Pnt 3393 3862 Pnt 2395 3932 Pnt 3291 3850 Pnt 3364 3850 Pnt 3240 3786 Pnt 2472 3782 Pnt 2528 3825 Pnt 2714 3816 Pnt 2018 3805 Pnt 4211 3757 Pnt 3014 3824 Pnt 4067 3749 Pnt 3717 3795 Pnt 4316 3825 Pnt 2571 3818 Pnt 2526 3795 Pnt 2151 3851 Pnt 4625 3754 Pnt 2866 3782 Pnt 2479 3926 Pnt 3175 3818 Pnt 2086 3800 Pnt 2432 3756 Pnt 3304 3808 Pnt 2364 3786 Pnt 2722 3815 Pnt 4295 3755 Pnt 2061 3812 Pnt 2373 3895 Pnt 2834 3825 Pnt 2929 3807 Pnt 2735 3844 Pnt 3516 3778 Pnt 2763 3776 Pnt 2881 3785 Pnt 2982 3847 Pnt 2964 3809 Pnt 2877 3798 Pnt 3863 3843 Pnt 2264 3809 Pnt 3095 3809 Pnt 2431 3804 Pnt 3038 3794 Pnt 4296 2978 Pnt 2238 3771 Pnt 3346 3840 Pnt 2141 3800 Pnt 4185 3802 Pnt 3104 3759 Pnt 2969 3780 Pnt 2769 3824 Pnt 2343 3805 Pnt 3590 3795 Pnt 2639 3805 Pnt 2904 3781 Pnt 2337 3784 Pnt 3077 3771 Pnt 2547 3847 Pnt 2191 3844 Pnt 2931 3809 Pnt 2881 3824 Pnt 3509 3841 Pnt 2941 3869 Pnt 3175 3847 Pnt 2895 3836 Pnt 3148 3857 Pnt 2827 3783 Pnt 2373 3832 Pnt 3103 3869 Pnt 2356 3802 Pnt 2120 3845 Pnt 2871 3781 Pnt 2874 3823 Pnt 2613 3840 Pnt 2566 3858 Pnt 2243 3809 Pnt 3559 3781 Pnt 2674 3828 Pnt 2145 3828 Pnt 3312 3785 Pnt 3020 3802 Pnt 2943 3798 Pnt 3119 3793 Pnt 2143 3823 Pnt 2867 3785 Pnt 3191 3803 Pnt 4402 3798 Pnt 2453 3815 Pnt 3109 3776 Pnt 3271 3128 Pnt 2113 3821 Pnt 3161 3874 Pnt 2354 3872 Pnt 1996 3772 Pnt 3206 3776 Pnt 2319 3778 Pnt 2966 3839 Pnt 2463 3821 Pnt 3684 3821 Pnt 2649 3840 Pnt 2732 3807 Pnt 2893 3801 Pnt 2811 3831 Pnt 2125 3791 Pnt 2877 3789 Pnt 4100 3831 Pnt 2485 3788 Pnt 2471 3765 Pnt 2054 3815 Pnt 2681 3793 Pnt 3381 3780 Pnt 2925 3837 Pnt 3892 3815 Pnt 3044 3820 Pnt 3051 3779 Pnt 3728 3820 Pnt 3143 3844 Pnt 3212 3832 Pnt 2542 3817 Pnt 2218 3829 Pnt 2646 3824 Pnt 2172 3800 Pnt 3055 3760 Pnt 4466 3808 Pnt 3124 3839 Pnt 2865 3815 Pnt 1999 3808 Pnt 2181 3792 Pnt 3551 3803 Pnt 3012 3810 Pnt 3210 3823 Pnt 4159 3810 Pnt 2541 3937 Pnt 2634 3810 Pnt 2525 3806 Pnt 3437 3937 Pnt 2639 3815 Pnt 3136 3778 Pnt 3568 3814 Pnt 3500 3799 Pnt 2571 3774 Pnt 4472 3106 Pnt 3830 3774 Pnt 3242 3840 Pnt 4027 3844 Pnt 3463 3858 Pnt 3199 3836 Pnt 2818 3855 Pnt 2701 3800 Pnt 2297 3819 Pnt 3227 3782 Pnt 3013 3821 Pnt 1968 3806 Pnt 3628 3774 Pnt 2566 3872 Pnt 3299 3793 Pnt 2396 3801 Pnt 2701 3808 Pnt 2567 3781 Pnt 4234 3800 Pnt 3174 3833 Pnt 3297 3834 Pnt 3690 3810 Pnt 3620 3817 Pnt 4186 3803 Pnt 2527 3807 Pnt 2640 3827 Pnt 3882 3872 Pnt 2903 3782 Pnt 2583 3834 Pnt 2478 3838 Pnt 4379 3769 Pnt 2129 3830 Pnt 2874 3787 Pnt 3176 3811 Pnt 2750 3821 Pnt 3873 3767 Pnt 2911 3837 Pnt 2762 3813 Pnt 2671 3912 Pnt 3545 3777 Pnt 4375 3765 Pnt 3904 3781 Pnt 2279 3854 Pnt 2680 3829 Pnt 2951 3791 Pnt 3069 3842 Pnt 2705 3820 Pnt 3732 3791 Pnt 3135 3783 Pnt 2730 3780 Pnt 3657 3804 Pnt 2834 3794 Pnt 2929 3830 Pnt 2727 3822 Pnt 2838 3846 Pnt 1987 3845 Pnt 2928 3822 Pnt 3898 3846 Pnt 2165 3811 Pnt 3363 3784 Pnt 2883 3784 Pnt 3001 3832 Pnt 2820 3867 Pnt 3097 3849 Pnt 2507 3867 Pnt 3030 3788 Pnt 2764 3788 Pnt 2602 3792 Pnt 2690 3800 Pnt 3500 3793 Pnt 3058 3770 Pnt 3272 3759 Pnt 3756 3770 Pnt 2895 3806 Pnt 2450 3807 Pnt 4415 3775 Pnt 5174 3782 Pnt 2884 3845 Pnt 1970 3873 Pnt 2606 3074 Pnt 4432 3827 Pnt 3312 3823 Pnt 3351 3781 Pnt 2932 3837 Pnt 3156 3831 Pnt 3670 3814 Pnt 2043 3782 Pnt 2986 3768 Pnt 3503 3763 Pnt 2602 3768 Pnt 2370 3811 Pnt 3535 3821 Pnt 2436 3943 Pnt 2804 3801 Pnt 3466 3805 Pnt 3654 3757 Pnt 2195 3822 Pnt 3472 3758 Pnt 2367 3856 Pnt 2464 3804 Pnt 3292 3774 Pnt 2786 3823 Pnt 3076 3798 Pnt 3863 3769 Pnt 3622 3828 Pnt 2214 3922 Pnt 3087 3797 Pnt 2636 3796 Pnt 2648 3826 Pnt 2281 3804 Pnt 3835 3802 Pnt 2456 3903 Pnt 3058 3832 Pnt 2861 3832 Pnt 2426 3833 Pnt 2921 3832 Pnt 2841 3838 Pnt 2736 3769 Pnt 2972 3841 Pnt 2477 3808 Pnt 3359 3820 Pnt 2136 3809 Pnt 2924 3797 Pnt 3231 3807 Pnt 2249 3783 Pnt 3027 3814 Pnt 2602 3819 Pnt 2295 3900 Pnt 2393 3797 Pnt 2871 3816 Pnt 2767 3777 Pnt 3284 3816 Pnt 2530 3798 Pnt 2049 3836 Pnt 4622 3856 Pnt 4579 3782 Pnt 2967 3792 Pnt 2958 3836 Pnt 2559 3825 Pnt 2765 3774 Pnt 2098 3932 Pnt 3396 3783 Pnt 3370 3206 Pnt 1957 3815 Pnt 3185 3830 Pnt 2506 3842 Pnt 2413 3819 Pnt 3000 3850 Pnt 2488 3862 Pnt 3103 3826 Pnt 2673 3813 Pnt 2531 3788 Pnt 2823 3871 Pnt 2739 3780 Pnt 3304 3790 Pnt 2471 3827 Pnt 4021 3780 Pnt 2691 3760 Pnt 2960 3760 Pnt 2542 3824 Pnt 3486 3780 Pnt 2276 3778 Pnt 4012 3780 Pnt 3807 3781 Pnt 3181 3781 Pnt 2630 3759 Pnt 4031 3750 Pnt 2699 3759 Pnt 2253 3792 Pnt 2162 3868 Pnt 1917 3825 Pnt 4526 3782 Pnt 3060 3784 Pnt 3241 3837 Pnt 2706 3815 Pnt 3088 3867 Pnt 2859 3818 Pnt 2091 3800 Pnt 3721 3867 Pnt 2164 3932 Pnt 2203 3926 Pnt 3328 3932 Pnt 2133 3756 Pnt 1920 3812 Pnt 2548 3830 Pnt 3657 3765 Pnt 3474 3833 Pnt 2478 3808 Pnt 2932 3787 Pnt 2013 3807 Pnt 2555 3819 Pnt 2608 3786 Pnt 3052 3791 Pnt 3370 3831 Pnt 2345 3944 Pnt 2856 3791 Pnt 2042 3810 Pnt 2765 3769 Pnt 2457 3788 Pnt 2535 3827 Pnt 2585 3809 Pnt 2776 3824 Pnt 3032 3819 Pnt 3750 3791 Pnt 2127 3806 Pnt 3275 3773 Pnt 3685 3783 Pnt 3648 3806 Pnt 3232 3760 Pnt 2923 3797 Pnt 2757 3821 Pnt 3177 3790 Pnt 2557 3789 Pnt 2498 3795 Pnt 3023 3862 Pnt 2682 3780 Pnt 2998 3854 Pnt 2695 3782 Pnt 3862 3771 Pnt 4470 3778 Pnt 2588 3780 Pnt 2986 3786 Pnt 2412 3816 Pnt 2886 3843 Pnt 2785 3775 Pnt 2659 3824 Pnt 2135 3805 Pnt 3154 3857 Pnt 2253 3897 Pnt 2648 3795 Pnt 3720 3857 Pnt 2851 3795 Pnt 2967 3775 Pnt 3866 3833 Pnt 2692 3815 Pnt 4156 3775 Pnt 4870 3810 Pnt 2620 3851 Pnt 2487 3840 Pnt 2381 3840 Pnt 2343 3821 Pnt 2841 3817 Pnt 2225 3800 Pnt 3350 3800 Pnt 2478 3880 Pnt 3516 3833 Pnt 2601 3801 Pnt 2374 3895 Pnt 2473 3919 Pnt 2520 3838 Pnt 3015 3825 Pnt 2772 3789 Pnt 3810 3806 Pnt 3938 3825 Pnt 4228 3190 Pnt 3699 2961 Pnt 4207 3806 Pnt 4237 3792 Pnt 3243 3795 Pnt 3101 3810 Pnt 3586 3779 Pnt 2728 3806 Pnt 2615 3775 Pnt 2846 3785 Pnt 2376 3802 Pnt 2839 3831 Pnt 2217 3799 Pnt 4330 3778 Pnt 2626 3775 Pnt 2971 3774 Pnt 3518 3817 Pnt 2969 3774 Pnt 2952 3817 Pnt 2160 3829 Pnt 3494 3851 Pnt 4120 3835 Pnt 2206 3824 Pnt 3225 3818 Pnt 2844 3760 Pnt 3171 3809 Pnt 3072 3816 Pnt 4275 3793 Pnt 3082 3782 Pnt 2281 3793 Pnt 2769 3820 Pnt 2981 3804 Pnt 2751 3790 Pnt 2476 3841 Pnt 2711 3785 Pnt 3525 3790 Pnt 2696 3802 Pnt 2567 3872 Pnt 2031 3845 Pnt 2620 3801 Pnt 3395 3817 Pnt 2898 3781 Pnt 4676 3796 Pnt 2828 3839 Pnt 2792 3814 Pnt 3481 3830 Pnt 2615 3858 Pnt 2267 3809 Pnt 3600 3803 Pnt 3075 3826 Pnt 2923 3807 Pnt 2870 3838 Pnt 4492 3826 Pnt 2729 3858 Pnt 2945 3832 Pnt 4008 3775 Pnt 2868 3801 Pnt 2924 3836 Pnt 3026 3836 Pnt 2783 3785 Pnt 3019 3836 Pnt 2044 3791 Pnt 4378 3782 Pnt 3305 3778 Pnt 2887 3791 Pnt 1993 3804 Pnt 3707 3778 Pnt 2494 3791 Pnt 2491 3937 Pnt 2984 3804 Pnt 2847 3781 Pnt 4311 3778 Pnt 2464 3805 Pnt 3442 3765 Pnt 2669 3834 Pnt 2801 3780 Pnt 3201 3818 Pnt 2637 3805 Pnt 3454 3818 Pnt 3861 3842 Pnt 3366 3791 Pnt 4126 3805 Pnt 2512 3754 Pnt 4704 3817 Pnt 2551 3854 Pnt 3226 3794 Pnt 4378 3878 Pnt 3086 3804 Pnt 3962 3825 Pnt 4141 3773 Pnt 2942 3814 Pnt 3755 3780 Pnt 2963 3847 Pnt 4010 3825 Pnt 2099 3822 Pnt 2997 3794 Pnt 4448 3781 Pnt 2198 3811 Pnt 2943 3800 Pnt 2701 3784 Pnt 2373 3829 Pnt 2713 3794 Pnt 3758 3829 Pnt 2772 3807 Pnt 3077 3837 Pnt 2514 3815 Pnt 2995 3867 Pnt 2856 3779 Pnt 2811 3801 Pnt 2518 3841 Pnt 2081 3841 Pnt 3911 3769 Pnt 2058 3823 Pnt 2363 3831 Pnt 4707 3800 Pnt 2894 3836 Pnt 2162 3922 Pnt 2626 3822 Pnt 2778 3781 Pnt 2762 3908 Pnt 2860 3801 Pnt 3371 3798 Pnt 2872 3790 Pnt 2075 3832 Pnt 3846 3817 Pnt 2299 3853 Pnt 2905 3818 Pnt 3634 3821 Pnt 4655 3880 Pnt 2960 3783 Pnt 2436 3791 Pnt 2177 3783 Pnt 3272 3800 Pnt 2414 3943 Pnt 3645 3837 Pnt 2975 3759 Pnt 2768 3842 Pnt 3303 3818 Pnt 3491 3792 Pnt 3342 3774 Pnt 2622 3790 Pnt 3652 3816 Pnt 2022 3856 Pnt 2648 3798 Pnt 3267 3790 Pnt 2828 3803 Pnt 2329 3759 Pnt 2897 3803 Pnt 2888 3787 Pnt 2040 3823 Pnt 2775 3774 Pnt 3703 3757 Pnt 2624 3823 Pnt 4445 3792 Pnt 3172 3781 Pnt 2591 3801 Pnt 2935 3809 Pnt 3239 3802 Pnt 2787 3826 Pnt 2667 3799 Pnt 1946 3828 Pnt 3130 3802 Pnt 2160 3791 Pnt 2232 3760 Pnt 2942 3838 Pnt 3406 3794 Pnt 2580 3826 Pnt 4323 3828 Pnt 3495 3826 Pnt 2594 3792 Pnt 2248 3804 Pnt 3334 3789 Pnt 3343 3874 Pnt 3273 3818 Pnt 2078 3821 Pnt 2446 3903 Pnt 3475 3793 Pnt 2808 3820 Pnt 2546 3807 Pnt 3069 3903 Pnt 2048 3772 Pnt 2055 3799 Pnt 2295 3827 Pnt 2828 3812 Pnt 1990 3873 Pnt 3077 3820 Pnt 2500 3796 Pnt 2367 3839 Pnt 2934 3808 Pnt 2586 3792 Pnt 2392 3769 Pnt 3728 3796 Pnt 2720 3810 Pnt 2918 3777 Pnt 2430 3865 Pnt 3479 3778 Pnt 2874 3807 Pnt 2142 3837 Pnt 2082 3819 Pnt 2918 3807 Pnt 2802 3867 Pnt 2635 3900 Pnt 2832 3793 Pnt 3742 3900 Pnt 2732 3816 Pnt 1914 3780 Pnt 2187 3793 Pnt 3192 3816 Pnt 2755 3830 Pnt 2709 3836 Pnt 2040 3836 Pnt 2883 3820 Pnt 2513 3777 Pnt 2911 3838 Pnt 2602 3791 Pnt 4566 3788 Pnt 1963 3932 Pnt 3484 3755 Pnt 3231 3766 Pnt 4366 3859 Pnt 3176 3832 Pnt 2726 3803 Pnt 2225 3829 Pnt 2874 3819 Pnt 2498 3838 Pnt 3242 3797 Pnt 2796 3797 Pnt 3685 3803 Pnt 3756 3835 Pnt 3296 3781 Pnt 2984 3801 Pnt 2883 3808 Pnt 2733 3814 Pnt 2523 3802 Pnt 2305 3826 Pnt 2168 3792 Pnt 2434 3787 Pnt 2699 3850 Pnt 3073 3830 Pnt 2554 3821 Pnt 4002 3787 Pnt 2353 3842 Pnt 2154 3881 Pnt 3793 3781 Pnt 3288 3830 Pnt 3798 3820 Pnt 2492 3813 Pnt 2324 3805 Pnt 1889 3800 Pnt 2139 3754 Pnt 3246 3821 Pnt 2603 3775 Pnt 2386 3932 Pnt 2650 3844 Pnt 3499 3757 Pnt 2658 3822 Pnt 3338 3775 Pnt 2107 3926 Pnt 3091 3795 Pnt 2227 3812 Pnt 2879 3787 Pnt 3253 3808 Pnt 2496 3765 Pnt 3680 3782 Pnt 3912 3787 Pnt 2001 3807 Pnt 2993 3809 Pnt 2675 3803 Pnt 2621 3802 Pnt 2703 3808 Pnt 2643 3819 Pnt 2890 3769 Pnt 2800 3769 Pnt 2743 3776 Pnt 3166 3765 Pnt 3340 3789 Pnt 2544 3824 Pnt 2740 3854 Pnt 4504 3824 Pnt 3824 3777 Pnt 2664 3780 Pnt 3291 3773 Pnt 3128 3798 Pnt 4380 3774 Pnt 2800 3781 Pnt 2240 3830 Pnt 3259 3776 Pnt 2987 3797 Pnt 2535 3822 Pnt 2882 3816 Pnt 3519 3776 Pnt 2272 3833 Pnt 4055 3833 Pnt 3101 3846 Pnt 2417 3912 Pnt 2728 3775 Pnt 3072 3862 Pnt 2069 3784 Pnt 2680 3824 Pnt 2058 3810 Pnt 3270 3778 Pnt 2614 3807 Pnt 4323 3778 Pnt 3400 3797 Pnt 3942 3806 Pnt 3213 3826 Pnt 3971 3853 Pnt 3227 3770 Pnt 3652 3826 Pnt 3017 3787 Pnt 2393 3919 Pnt 3263 3809 Pnt 2423 3845 Pnt 3491 3792 Pnt 2146 3837 Pnt 2813 3793 Pnt 3167 3817 Pnt 3417 3795 Pnt 3820 3793 Pnt 2609 3807 Pnt 2720 3806 Pnt 2431 3851 Pnt 4333 3806 Pnt 2829 3808 Pnt 2757 3778 Pnt 2581 3816 Pnt 2861 3778 Pnt 4522 3783 Pnt 3660 3856 Pnt 3005 3780 Pnt 3062 3143 Pnt 2477 3786 Pnt 2937 3825 Pnt 3451 3804 Pnt 2818 3774 Pnt 2618 3841 Pnt 2219 3944 Pnt 2690 3819 Pnt 2208 3780 Pnt 4388 3856 Pnt 3222 3849 Pnt 2440 3862 Pnt 2848 3810 Pnt 3173 3834 Pnt 2648 3845 Pnt 2086 3849 Pnt 2879 3799 Pnt 2443 3788 Pnt 3017 3801 Pnt 2981 3815 Pnt 2508 3839 Pnt 2384 3805 Pnt 3099 3817 Pnt 4533 3788 Pnt 2745 3805 Pnt 2489 3821 Pnt 2609 3809 Pnt 3358 3827 Pnt 3226 3836 Pnt 2676 3827 Pnt 2591 3847 Pnt 2217 3778 Pnt 3321 3836 Pnt 3014 3804 Pnt 3677 3817 Pnt 2636 3791 Pnt 3351 3846 Pnt 2279 3815 Pnt 2456 3824 Pnt 2465 3808 Pnt 3470 3782 Pnt 2978 3782 Pnt 2963 3937 Pnt 2478 3789 Pnt 3654 3819 Pnt 3254 3817 Pnt 3512 3766 Pnt 3820 3808 Pnt 3594 3809 Pnt 2650 3812 Pnt 3107 3805 Pnt 4053 3766 Pnt 2803 3790 Pnt 2618 3811 Pnt 3016 3872 Pnt 2429 3826 Pnt 3337 3836 Pnt 3837 3826 Pnt 2737 3809 Pnt 2518 3857 Pnt 3201 3787 Pnt 2601 3847 Pnt 2820 3847 Pnt 1898 3822 Pnt 3379 3773 Pnt 3670 3785 Pnt 2488 3813 Pnt 2326 3804 Pnt 2753 3811 Pnt 4217 3831 Pnt 2970 3791 Pnt 2806 3805 Pnt 4020 3791 Pnt 2347 3834 Pnt 2277 3817 Pnt 2230 3800 Pnt 2952 3785 Pnt 3392 3780 Pnt 3829 3788 Pnt 2520 3780 Pnt 2146 3786 Pnt 2182 3806 Pnt 4431 3817 Pnt 4427 3787 Pnt 2362 3814 Pnt 4547 3785 Pnt 2826 3801 Pnt 3525 3809 Pnt 3674 3769 Pnt 2699 3830 Pnt 4272 3791 Pnt 2504 3754 Pnt 3063 3792 Pnt 2066 3832 Pnt 2833 3805 Pnt 2614 3863 Pnt 2214 3790 Pnt 2735 3818 Pnt 2557 3802 Pnt 2886 3880 Pnt 2510 3851 Pnt 3540 3863 Pnt 2100 3853 Pnt 3675 3880 Pnt 2903 3807 Pnt 2133 3847 Pnt 4130 3809 Pnt 3368 3797 Pnt 2716 3840 Pnt 2599 3838 Pnt 2282 3783 Pnt 4116 3878 Pnt 2442 3797 Pnt 2392 3759 Pnt 2676 3796 Pnt 2624 3801 Pnt 2257 3793 Pnt 2852 3858 Pnt 2142 3841 Pnt 3264 3804 Pnt 2910 3821 Pnt 3891 3784 Pnt 2715 3816 Pnt 2384 3823 Pnt 3070 3855 Pnt 2771 3803 Pnt 3172 3855 Pnt 3644 3825 Pnt 2835 3836 Pnt 2761 3769 Pnt 2825 3823 Pnt 2676 3843 Pnt 3418 3832 Pnt 2782 3767 Pnt 2986 3908 Pnt 2461 3807 Pnt 3068 3809 Pnt 4543 3823 Pnt 2625 3836 Pnt 3446 3908 Pnt 3093 3818 Pnt 2560 3799 Pnt 2804 3791 Pnt 3188 3817 Pnt 3544 3125 Pnt 3466 3799 Pnt 3522 3818 Pnt 3204 3818 Pnt 3006 3811 Pnt 2784 3781 Pnt 3392 3783 Pnt 2916 3816 Pnt 2882 3816 Pnt 3436 3797 Pnt 3367 3774 Pnt 3759 3778 Pnt 3789 3778 Pnt 3012 3802 Pnt 2911 3802 Pnt 2919 3801 Pnt 2744 3798 Pnt 3316 3818 Pnt 4666 3836 Pnt 2043 3782 Pnt 2900 3782 Pnt 3231 3233 Pnt 2409 3781 Pnt 3039 3813 Pnt 3364 3781 Pnt 3968 3816 Pnt 2901 3821 Pnt 3390 3826 Pnt 2445 3796 Pnt 2966 3794 Pnt 2293 3932 Pnt 2665 3874 Pnt 2503 3793 Pnt 2729 3844 Pnt 2460 3819 Pnt 2381 3820 Pnt 2926 3779 Pnt 2111 3867 Pnt 3669 3779 Pnt 3342 3814 Pnt 3191 3790 Pnt 2108 3926 Pnt 4227 3794 Pnt 3205 3824 Pnt 2630 3796 Pnt 3259 3787 Pnt 2150 3922 Pnt 1867 3840 Pnt 4638 3801 Pnt 2627 3777 Pnt 3514 3846 Pnt 3698 3846 Pnt 3081 3778 Pnt 3044 3776 Pnt 3459 3801 Pnt 2951 3807 Pnt 4148 3801 Pnt 3956 3815 Pnt 3893 3805 Pnt 2973 3779 Pnt 3147 3813 Pnt 3780 3788 Pnt 3146 3841 Pnt 2890 3791 Pnt 2532 3822 Pnt 3215 3790 Pnt 3365 3828 Pnt 2867 3824 Pnt 2719 3826 Pnt 3351 3810 Pnt 3395 3837 Pnt 2626 3837 Pnt 3246 3850 Pnt 3416 3810 Pnt 3012 3795 Pnt 2268 3840 Pnt 3121 3787 Pnt 2229 3840 Pnt 3393 3790 Pnt 3613 3798 Pnt 2186 3831 Pnt 2671 3919 Pnt 2207 3802 Pnt 2801 3820 Pnt 2063 3809 Pnt 2680 3793 Pnt 2404 3788 Pnt 2306 3805 Pnt 3177 3788 Pnt 3010 3903 Pnt 4626 3792 Pnt 2426 3845 Pnt 2731 3807 Pnt 3520 3822 Pnt 2635 3807 Pnt 2232 3827 Pnt 2893 3825 Pnt 2493 3808 Pnt 2851 3827 Pnt 2464 3793 Pnt 2824 3877 Pnt 2759 3772 Pnt 2967 3772 Pnt 2855 3877 Pnt 2205 3849 Pnt 3111 3837 Pnt 3317 3782 Pnt 2861 3851 Pnt 2366 3782 Pnt 2458 3816 Pnt 2141 3792 Pnt 2689 3820 Pnt 4434 3784 Pnt 2607 3095 Pnt 2063 3807 Pnt 1835 3778 Pnt 2086 3837 Pnt 2000 3819 Pnt 2452 3862 Pnt 4390 3785 Pnt 2425 3900 Pnt 3632 3080 Pnt 2141 3802 Pnt 2438 3801 Pnt 2496 3817 Pnt 4552 3781 Pnt 2541 3944 Pnt 2602 3846 Pnt 3568 3827 Pnt 2460 3844 Pnt 4302 3844 Pnt 2646 3804 Pnt 3841 3769 Pnt 3251 3780 Pnt 2672 3769 Pnt 3056 3792 Pnt 1899 3755 Pnt 2875 3780 Pnt 2744 3829 Pnt 2222 3872 Pnt 3160 3801 Pnt 2189 3826 Pnt 3353 3821 Pnt 2686 3798 Pnt 2591 3850 Pnt 3137 3836 Pnt 3496 3868 Pnt 2751 3760 Pnt 2950 3763 Pnt 2625 3830 Pnt 3022 3821 Pnt 3918 3790 Pnt 2634 3826 Pnt 2724 3844 Pnt 3187 3833 Pnt 4731 3805 Pnt 2209 3816 Pnt 3744 3837 Pnt 2609 3822 Pnt 1975 3804 Pnt 3653 3837 Pnt 3213 3879 Pnt 2787 3809 Pnt 3783 3879 Pnt 2665 3772 Pnt 2742 3780 Pnt 3658 3776 Pnt 2327 3799 Pnt 2869 3776 Pnt 3217 3780 Pnt 2545 3895 Pnt 2858 3807 Pnt 3332 3785 Pnt 3434 3893 Pnt 4056 3784 Pnt 3636 3787 Pnt 2411 3824 Pnt 2399 3833 Pnt 3347 3780 Pnt 4007 3786 Pnt 3032 3765 Pnt 3273 3808 Pnt 3685 3797 Pnt 3309 3806 Pnt 3175 3765 Pnt 2609 3854 Pnt 2528 3833 Pnt 3016 3783 Pnt 3178 3854 Pnt 2918 3835 Pnt 2480 3754 Pnt 2902 3817 Pnt 2905 3778 Pnt 2666 3825 Pnt 3117 3776 Pnt 2844 3833 Pnt 4890 3822 Pnt 4290 3812 Pnt 2972 3785 Pnt 3239 3831 Pnt 2692 3816 Pnt 2545 3831 Pnt 2223 3790 Pnt 4300 3755 Pnt 2735 3783 Pnt 2454 3790 Pnt 3534 3818 Pnt 2955 3800 Pnt 2737 3788 Pnt 3281 3793 Pnt 2644 3811 Pnt 2931 3880 Pnt 2410 3777 Pnt 3440 3807 Pnt 2228 3930 Pnt 3440 3817 Pnt 2962 3807 Pnt 4448 3812 Pnt 2984 3830 Pnt 3072 3840 Pnt 3106 3825 Pnt 4205 3794 Pnt 3211 3797 Pnt 2601 3857 Pnt 2564 3836 Pnt 3332 3802 Pnt 4530 3055 Pnt 2571 3836 Pnt 2544 3807 Pnt 2870 3835 Pnt 2665 3826 Pnt 2686 3806 Pnt 3486 3812 Pnt 3041 3767 Pnt 2704 3808 Pnt 3472 3781 Pnt 2975 3782 Pnt 2712 3849 Pnt 3445 3778 Pnt 3180 3791 Pnt 2590 3825 Pnt 2895 3845 Pnt 3790 3778 Pnt 3025 3825 Pnt 4213 3845 Pnt 2858 3790 Pnt 2661 3805 Pnt 2694 3841 Pnt 2863 3816 Pnt 2639 3781 Pnt 4583 3784 Pnt 2954 3780 Pnt 3484 3815 Pnt 2767 3825 Pnt 3264 3774 Pnt 3197 3802 Pnt 2866 3826 Pnt 2261 3944 Pnt 2861 3802 Pnt 4445 3782 Pnt 2467 3944 Pnt 2684 3823 Pnt 2513 3836 Pnt 2113 3823 Pnt 3272 3766 Pnt 3609 3836 Pnt 3893 3791 Pnt 3224 3838 Pnt 3474 3815 Pnt 3443 3837 Pnt 3957 3788 Pnt 2461 3835 Pnt 2534 3835 Pnt 2991 3845 Pnt 2144 3798 Pnt 3569 3783 Pnt 2794 3816 Pnt 2665 3810 Pnt 3100 3798 Pnt 4415 3871 Pnt 4964 3824 Pnt 2204 3922 Pnt 2309 3784 Pnt 2922 3804 Pnt 2651 3814 Pnt 2661 3788 Pnt 3571 3821 Pnt 2339 3842 Pnt 3472 3830 Pnt 3205 3844 Pnt 2416 3831 Pnt 2700 3777 Pnt 3974 3818 Pnt 2996 3757 Pnt 2464 3778 Pnt 3021 3871 Pnt 3563 3818 Pnt 3576 3835 Pnt 3808 3778 Pnt 3619 3806 Pnt 2298 3778 Pnt 2239 3802 Pnt 3345 3791 Pnt 2743 3791 Pnt 3588 3871 Pnt 3161 3818 Pnt 2156 3808 Pnt 3451 3769 Pnt 3735 3835 Pnt 3580 3859 Pnt 2261 3815 Pnt 2918 3809 Pnt 2651 3828 Pnt 3532 3829 Pnt 3070 3799 Pnt 3111 3824 Pnt 3581 3827 Pnt 2026 3826 Pnt 4016 3826 Pnt 4022 3845 Pnt 3714 3844 Pnt 4205 3777 Pnt 3818 3839 Pnt 2690 3790 Pnt 4087 3812 Pnt 2531 3820 Pnt 4091 3790 Pnt 2684 3809 Pnt 3555 3807 Pnt 3042 3793 Pnt 3384 3811 Pnt 2153 3857 Pnt 2886 3770 Pnt 2436 3800 Pnt 2819 3815 Pnt 4424 3800 Pnt 2615 3787 Pnt 2517 3797 Pnt 2238 3840 Pnt 3165 3800 Pnt 4373 3837 Pnt 2536 3847 Pnt 3631 3840 Pnt 2571 3790 Pnt 2645 3831 Pnt 2919 3807 Pnt 2868 3787 Pnt 2546 3831 Pnt 2916 3836 Pnt 2921 3807 Pnt 2171 3827 Pnt 2764 3843 Pnt 3022 3763 Pnt 2790 3801 Pnt 3180 3772 Pnt 2074 3849 Pnt 3956 3796 Pnt 3146 3796 Pnt 2921 3832 Pnt 2306 3837 Pnt 4503 3780 Pnt 2605 3781 Pnt 3456 3823 Pnt 2336 3806 Pnt 3024 3797 Pnt 3502 3823 Pnt 3066 3812 Pnt 4407 3857 Pnt 2648 3846 Pnt 2642 3780 Pnt 2056 3792 Pnt 2121 3810 Pnt 3982 3820 Pnt 2030 3912 Pnt 2786 3792 Pnt 4494 3777 Pnt 2475 3794 Pnt 2981 3839 Pnt 3631 3775 Pnt 4500 3118 Pnt 2521 3812 Pnt 3627 3812 Pnt 2446 3944 Pnt 2459 3846 Pnt 3940 3778 Pnt 2144 3844 Pnt 2842 3810 Pnt 2674 3804 Pnt 3668 3837 Pnt 4307 3812 Pnt 4362 3839 Pnt 2702 3769 Pnt 2730 3846 Pnt 3382 3801 Pnt 2582 3788 Pnt 3566 3829 Pnt 3824 3785 Pnt 3401 3782 Pnt 4277 3782 Pnt 2675 3816 Pnt 2640 3840 Pnt 3684 3038 Pnt 3821 3828 Pnt 2686 3932 Pnt 4087 3827 Pnt 3630 3828 Pnt 2554 3874 Pnt 2506 3893 Pnt 4164 3801 Pnt 2972 3893 Pnt 2724 3807 Pnt 2283 3844 Pnt 2937 3817 Pnt 2691 3824 Pnt 2476 3824 Pnt 2053 3833 Pnt 3515 3807 Pnt 2977 3779 Pnt 3974 3776 Pnt 3404 3825 Pnt 3425 3779 Pnt 2663 3824 Pnt 2371 3833 Pnt 4140 3771 Pnt 2444 3927 Pnt 2985 3927 Pnt 2918 3790 Pnt 3326 3793 Pnt 3344 3793 Pnt 3262 3790 Pnt 4257 3807 Pnt 2838 3796 Pnt 3271 3816 Pnt 2309 3790 Pnt 3370 3835 Pnt 3063 3846 Pnt 4176 3815 Pnt 3102 3783 Pnt 2903 3783 Pnt 2004 3779 Pnt 3033 3811 Pnt 3204 3805 Pnt 2750 3841 Pnt 3862 3787 Pnt 3210 3841 Pnt 2694 3828 Pnt 2638 3825 Pnt 2174 3930 Pnt 4625 3828 Pnt 2621 3805 Pnt 3174 3805 Pnt 3033 3810 Pnt 2468 3793 Pnt 3648 3812 Pnt 3186 3850 Pnt 3831 3808 Pnt 2990 3808 Pnt 2069 3831 Pnt 1796 3914 Pnt 2433 3798 Pnt 2400 3802 Pnt 3524 3794 Pnt 3514 3778 Pnt 2810 3794 Pnt 2072 3802 Pnt 2788 3779 Pnt 2266 3903 Pnt 4504 3807 Pnt 2389 3937 Pnt 2132 3944 Pnt 3166 3944 Pnt 2467 3794 Pnt 2800 3877 Pnt 2693 3823 Pnt 4673 3845 Pnt 2932 3871 Pnt 3515 3228 Pnt 3273 3814 Pnt 2738 3785 Pnt 2305 3806 Pnt 2775 3835 Pnt 2297 3862 Pnt 4145 3802 Pnt 2166 3806 Pnt 2868 3866 Pnt 2442 3898 Pnt 2080 3798 Pnt 2852 3898 Pnt 4864 3777 Pnt 2110 3802 Pnt 1957 3801 Pnt 2010 3817 Pnt 2785 3879 Pnt 2646 3776 Pnt 1754 3799 Pnt 3017 3791 Pnt 3858 3243 Pnt 2505 3844 Pnt 2889 3798 Pnt 2661 3784 Pnt 2338 3825 Pnt 4533 3788 Pnt 2053 3826 Pnt 3223 3163 Pnt 2415 3822 Pnt 2788 3764 Pnt 4225 3760 Pnt 4263 3797 Pnt 3939 3818 Pnt 3277 2944 Pnt 2465 3784 Pnt 2457 3796 Pnt 3341 3811 Pnt 2637 3829 Pnt 3451 3816 Pnt 3208 3791 Pnt 4527 3829 Pnt 2220 3872 Pnt 2961 3805 Pnt 3364 3816 Pnt 2897 3781 Pnt 2263 3801 Pnt 3300 3836 Pnt 4533 2999 Pnt 2697 3790 Pnt 2727 3857 Pnt 2989 3821 Pnt 2255 3818 Pnt 1975 3826 Pnt 2503 3813 Pnt 2300 3812 Pnt 1883 3793 Pnt 2719 3813 Pnt 2572 3819 Pnt 2915 3817 Pnt 5168 3785 Pnt 2873 3824 Pnt 2725 3790 Pnt 2402 3321 Pnt 2624 3800 Pnt 2549 3795 Pnt 2661 3811 Pnt 2890 3810 Pnt 2002 3845 Pnt 2740 3844 Pnt 4071 3816 Pnt 3813 3807 Pnt 2582 3830 Pnt 3683 3800 Pnt 2627 3821 Pnt 4293 3809 Pnt 2968 3835 Pnt 3133 3821 Pnt 2995 3821 Pnt 2636 3773 Pnt 3421 3836 Pnt 3883 3880 Pnt 2882 3819 Pnt 2807 3832 Pnt 3358 3880 Pnt 2419 3817 Pnt 3891 3839 Pnt 3678 3819 Pnt 2439 3832 Pnt 2451 3781 Pnt 3399 3832 Pnt 3065 3782 Pnt 2791 3782 Pnt 3585 3791 Pnt 2813 3796 Pnt 3036 3831 Pnt 4175 3832 Pnt 3574 3831 Pnt 2406 3805 Pnt 3447 3823 Pnt 3305 3845 Pnt 3935 3840 Pnt 3958 3763 Pnt 2378 3834 Pnt 2614 3819 Pnt 2961 3780 Pnt 2819 3824 Pnt 2050 3792 Pnt 4677 3787 Pnt 3201 3790 Pnt 3212 3774 Pnt 2362 3774 Pnt 3981 3780 Pnt 3501 3817 Pnt 3595 3780 Pnt 3853 3781 Pnt 3345 3796 Pnt 2827 3817 Pnt 2554 3836 Pnt 2842 3812 Pnt 2740 3814 Pnt 2210 3846 Pnt 2882 3821 Pnt 2930 3804 Pnt 2453 3878 Pnt 4265 3811 Pnt 2642 3815 Pnt 2629 3900 Pnt 3167 3810 Pnt 2032 3922 Pnt 4233 3801 Pnt 2715 3788 Pnt 2990 3821 Pnt 2632 3825 Pnt 2535 3814 Pnt 3515 3794 Pnt 2855 3833 Pnt 2481 3833 Pnt 2930 3830 Pnt 4114 3805 Pnt 2870 3863 Pnt 2689 3830 Pnt 2576 3842 Pnt 2929 3800 Pnt 2489 3810 Pnt 2265 3798 Pnt 2947 3855 Pnt 2212 3847 Pnt 3806 3792 Pnt 2513 3772 Pnt 2239 3783 Pnt 2659 3831 Pnt 3929 3783 Pnt 3239 3827 Pnt 2715 3783 Pnt 3473 3772 Pnt 3055 3777 Pnt 4477 3784 Pnt 2851 3793 Pnt 2523 3817 Pnt 2385 3778 Pnt 3079 3777 Pnt 3696 3793 Pnt 2549 3836 Pnt 3589 3796 Pnt 2770 3817 Pnt 4099 3827 Pnt 3040 3788 Pnt 2868 3837 Pnt 2840 3820 Pnt 2681 3827 Pnt 2797 3818 Pnt 3492 3871 Pnt 2905 3820 Pnt 2583 3833 Pnt 2138 3818 Pnt 3392 3843 Pnt 2152 3825 Pnt 3474 3835 Pnt 2681 3840 Pnt 3219 3855 Pnt 2221 3932 Pnt 3446 3815 Pnt 2289 3927 Pnt 3078 3824 Pnt 2636 3870 Pnt 2594 3790 Pnt 2741 3790 Pnt 2854 3893 Pnt 2154 3844 Pnt 3146 3787 Pnt 2704 3813 Pnt 2412 3824 Pnt 3190 3831 Pnt 4064 3893 Pnt 2089 3794 Pnt 3645 3779 Pnt 3229 3776 Pnt 4073 3785 Pnt 2825 3806 Pnt 4527 3785 Pnt 2034 3833 Pnt 2861 3809 Pnt 3233 3765 Pnt 3540 3783 Pnt 4562 3789 Pnt 2507 3793 Pnt 3082 3801 Pnt 2695 3833 Pnt 2970 3777 Pnt 4242 3781 Pnt 2343 3936 Pnt 3147 3790 Pnt 3346 3796 Pnt 2653 3823 Pnt 2607 3802 Pnt 3009 3835 Pnt 3829 3871 Pnt 3491 3811 Pnt 3271 3814 Pnt 2977 3846 Pnt 2368 3800 Pnt 2712 3844 Pnt 2711 3815 Pnt 2706 3866 Pnt 3506 3810 Pnt 4226 3809 Pnt 2157 3930 Pnt 3379 3845 Pnt 3108 3845 Pnt 3020 3805 Pnt 2272 3805 Pnt 3024 3830 Pnt 3763 3812 Pnt 3095 3812 Pnt 2695 3850 Pnt 2775 3794 Pnt 2515 3771 Pnt 3222 3824 Pnt 3482 3825 Pnt 2053 3802 Pnt 2731 3771 Pnt 2528 3857 Pnt 4432 3802 Pnt 2490 3903 Pnt 2445 3777 Pnt 4348 3784 Pnt 3201 3771 Pnt 2142 3944 Pnt 3414 3778 Pnt 2737 3785 Pnt 2986 3785 Pnt 2177 3806 Pnt 2960 3794 Pnt 2176 3840 Pnt 3531 3776 Pnt 3710 3806 Pnt 2161 3847 Pnt 3197 3767 Pnt 2375 3793 Pnt 3200 3767 Pnt 3204 3825 Pnt 2296 3805 Pnt 2247 3841 Pnt 2244 3815 Pnt 3699 3831 Pnt 4011 3815 Pnt 3899 3780 Pnt 2831 3850 Pnt 4091 3793 Pnt 2434 3796 Pnt 4334 3770 Pnt 3014 3771 Pnt 2938 3782 Pnt 2670 3784 Pnt 1862 3825 Pnt 3861 3828 Pnt 4378 3780 Pnt 2710 3801 Pnt 4484 3826 Pnt 3223 3872 Pnt 4437 3812 Pnt 4114 3807 Pnt 3224 3845 Pnt 3607 3859 Pnt 4057 3784 Pnt 3941 3788 Pnt 3160 3779 Pnt 4229 3766 Pnt 2443 3805 Pnt 3023 3785 Pnt 4708 3837 Pnt 4403 3769 Pnt 2869 3807 Pnt 4607 3783 Pnt 4676 3804 Pnt 2280 3813 Pnt 2730 3857 Pnt 2505 3817 Pnt 2364 3865 Pnt 2177 3812 Pnt 1895 3793 Pnt 2948 3944 Pnt 3043 3824 Pnt 2641 3846 Pnt 2839 3760 Pnt 5091 3834 Pnt 3938 3760 Pnt 3502 3944 Pnt 2743 3854 Pnt 3519 3816 Pnt 2444 3801 Pnt 3653 3811 Pnt 2949 3801 Pnt 3130 3811 Pnt 2437 3832 Pnt 2926 3788 Pnt 2767 3801 Pnt 3694 3801 Pnt 3131 3846 Pnt 4068 3801 Pnt 2832 3791 Pnt 4458 3832 Pnt 4023 3823 Pnt 2834 3831 Pnt 3097 3831 Pnt 3990 3847 Pnt 2309 3842 Pnt 3210 3816 Pnt 2069 3912 Pnt 3199 3817 Pnt 3046 3816 Pnt 2253 3818 Pnt 2849 3847 Pnt 2591 3839 Pnt 3853 3830 Pnt 2829 3795 Pnt 3007 3773 Pnt 2267 3836 Pnt 2306 3819 Pnt 3438 3839 Pnt 2913 3861 Pnt 2489 3830 Pnt 2831 3834 Pnt 3158 3812 Pnt 2880 3819 Pnt 2697 3796 Pnt 4073 3861 Pnt 3653 3816 Pnt 3816 3831 Pnt 2842 3817 Pnt 4180 3801 Pnt 2598 3817 Pnt 3467 3778 Pnt 4481 3856 Pnt 4883 3821 Pnt 2186 3757 Pnt 2364 3783 Pnt 3354 3835 Pnt 3055 3796 Pnt 3555 3800 Pnt 3284 3800 Pnt 3146 3801 Pnt 3030 3792 Pnt 4146 3775 Pnt 2932 3811 Pnt 3193 3846 Pnt 3939 3129 Pnt 3055 3859 Pnt 2700 3846 Pnt 4809 3816 Pnt 3334 3841 Pnt 2998 3821 Pnt 2063 3782 Pnt 2747 3819 Pnt 3165 3833 Pnt 3122 3825 Pnt 3090 3800 Pnt 3656 3782 Pnt 2191 3826 Pnt 2263 3793 Pnt 2703 3795 Pnt 2280 3844 Pnt 2451 3810 Pnt 3048 3812 Pnt 3407 3839 Pnt 3513 3810 Pnt 2861 3847 Pnt 2095 3837 Pnt 4067 3795 Pnt 2131 3814 Pnt 3364 3837 Pnt 2901 3800 Pnt 1859 3914 Pnt 3017 3843 Pnt 4807 3800 Pnt 2551 3798 Pnt 2999 3787 Pnt 3433 3835 Pnt 3409 3838 Pnt 3360 3828 Pnt 2124 3844 Pnt 2544 3844 Pnt 2767 3863 Pnt 4132 3805 Pnt 3691 3835 Pnt 3273 3863 Pnt 3767 3813 Pnt 2666 3809 Pnt 3142 3810 Pnt 4604 3858 Pnt 2806 3839 Pnt 3718 3808 Pnt 2553 3803 Pnt 2239 3783 Pnt 2804 3811 Pnt 3353 3831 Pnt 3096 3800 Pnt 2743 3829 Pnt 3153 3800 Pnt 3072 3774 Pnt 2960 3878 Pnt 2594 3781 Pnt 3698 3866 Pnt 2463 3774 Pnt 3970 3173 Pnt 3892 3774 Pnt 3665 3788 Pnt 2943 3822 Pnt 2873 3779 Pnt 3189 3807 Pnt 2796 3837 Pnt 2148 3930 Pnt 3619 3815 Pnt 2907 3807 Pnt 2166 3827 Pnt 2899 3818 Pnt 2314 3871 Pnt 3091 3788 Pnt 2786 3785 Pnt 2758 3830 Pnt 2277 3803 Pnt 2387 3806 Pnt 2378 3927 Pnt 3259 3855 Pnt 2665 3763 Pnt 4023 3807 Pnt 2380 3908 Pnt 2740 3802 Pnt 2216 3818 Pnt 3001 3819 Pnt 3190 3802 Pnt 2535 3819 Pnt 2348 3898 Pnt 4717 3927 Pnt 2703 3810 Pnt 3772 3833 Pnt 2730 3849 Pnt 2375 3790 Pnt 3288 3806 Pnt 2905 3900 Pnt 2064 3851 Pnt 2069 3922 Pnt 3207 3893 Pnt 3517 3807 Pnt 2786 3803 Pnt 3059 3794 Pnt 4105 3807 Pnt 3563 3803 Pnt 4357 3803 Pnt 2293 3763 Pnt 2544 3825 Pnt 2948 3763 Pnt 2238 3798 Pnt 3330 3832 Pnt 2040 3817 Pnt 2932 3798 Pnt 2645 3850 Pnt 2407 3828 Pnt 2429 3879 Pnt 2598 3791 Pnt 2749 3755 Pnt 2583 3767 Pnt 2931 3776 Pnt 3457 3807 Pnt 2700 3777 Pnt 3475 3777 Pnt 2619 3817 Pnt 3389 3797 Pnt 2889 3822 Pnt 2766 3827 Pnt 4393 3790 Pnt 3872 3794 Pnt 2804 3780 Pnt 2717 3809 Pnt 2747 3800 Pnt 2666 3835 Pnt 3332 3831 Pnt 2498 3847 Pnt 3533 3835 Pnt 2798 3824 Pnt 2910 3782 Pnt 2670 3790 Pnt 3550 3772 Pnt 2601 3813 Pnt 3051 3832 Pnt 2531 3853 Pnt 2390 3820 Pnt 3474 3797 Pnt 4037 3793 Pnt 2625 3833 Pnt 3397 3815 Pnt 3042 3829 Pnt 2717 3794 Pnt 2427 3787 Pnt 4673 3793 Pnt 2518 3794 Pnt 3816 3783 Pnt 2810 3790 Pnt 3533 3779 Pnt 4761 3812 Pnt 2538 3844 Pnt 3708 3777 Pnt 3471 3810 Pnt 2779 3783 Pnt 2761 3824 Pnt 2426 3822 Pnt 2608 3797 Pnt 2218 3836 Pnt 3661 3796 Pnt 2375 3784 Pnt 2999 3829 Pnt 4159 3784 Pnt 2828 3784 Pnt 2301 3793 Pnt 4125 3783 Pnt 2827 3845 Pnt 3411 3816 Pnt 2489 3790 Pnt 4445 3811 Pnt 2693 3857 Pnt 3323 3805 Pnt 3310 3821 Pnt 2516 3818 Pnt 3546 3812 Pnt 2779 3784 Pnt 3981 3846 Pnt 2681 3850 Pnt 4612 3790 Pnt 2608 3824 Pnt 3696 3828 Pnt 2655 3793 Pnt 2635 3781 Pnt 2435 3801 Pnt 3223 3801 Pnt 4328 3771 Pnt 4258 3846 Pnt 3839 3823 Pnt 3138 3095 Pnt 3549 3804 Pnt 2931 3826 Pnt 2032 3826 Pnt 2806 3785 Pnt 3132 3816 Pnt 2754 3872 Pnt 2892 3816 Pnt 2451 3903 Pnt 2284 3845 Pnt 2579 3784 Pnt 3857 3806 Pnt 3124 3859 Pnt 3070 3809 Pnt 3281 3816 Pnt 3626 3839 Pnt 2408 3779 Pnt 2717 3839 Pnt 3123 3785 Pnt 2115 3840 Pnt 3141 3785 Pnt 3405 3796 Pnt 2545 3880 Pnt 1976 3817 Pnt 4348 3866 Pnt 3451 3794 Pnt 2776 3793 Pnt 4803 3781 Pnt 3697 3801 Pnt 3527 3176 Pnt 2847 3877 Pnt 2594 3805 Pnt 2888 3812 Pnt 3283 3778 Pnt 2331 3838 Pnt 2516 3817 Pnt 2975 3835 Pnt 2584 3815 Pnt 2107 3850 Pnt 2371 3878 Pnt 3390 3795 Pnt 3377 3801 Pnt 4403 3828 Pnt 2655 3798 Pnt 2540 3788 Pnt 4219 3824 Pnt 3051 3830 Pnt 2807 3831 Pnt 3208 3855 Pnt 4972 3815 Pnt 3876 3831 Pnt 2688 3222 Pnt 3005 3793 Pnt 3121 3846 Pnt 3068 3785 Pnt 2814 3760 Pnt 4749 3825 Pnt 2766 3814 Pnt 4157 3808 Pnt 2839 3801 Pnt 2924 3783 Pnt 3029 3830 Pnt 3630 3783 Pnt 3718 3816 Pnt 2626 3773 Pnt 2772 3788 Pnt 3144 3809 Pnt 4443 3760 Pnt 3042 3829 Pnt 4759 3798 Pnt 2658 3795 Pnt 3502 3828 Pnt 3630 3809 Pnt 2974 3828 Pnt 3689 3792 Pnt 3764 3795 Pnt 3291 3816 Pnt 4343 3795 Pnt 3299 3831 Pnt 4541 3783 Pnt 2584 3842 Pnt 3945 3814 Pnt 2889 3800 Pnt 3222 3817 Pnt 2835 3817 Pnt 3000 3840 Pnt 4000 3830 Pnt 3537 3795 Pnt 3034 3835 Pnt 3374 3835 Pnt 3042 3780 Pnt 2790 3780 Pnt 3273 3799 Pnt 3192 3834 Pnt 2525 3788 Pnt 3097 3834 Pnt 2538 3813 Pnt 2938 3813 Pnt 2902 3819 Pnt 3201 3776 Pnt 2734 3816 Pnt 2502 3803 Pnt 3150 3803 Pnt 2225 3835 Pnt 2296 3810 Pnt 2628 3871 Pnt 3102 3815 Pnt 3017 3813 Pnt 2299 3800 Pnt 4679 3835 Pnt 3986 3813 Pnt 3050 3844 Pnt 2215 3783 Pnt 4533 3787 Pnt 3580 3783 Pnt 2938 3839 Pnt 3199 3796 Pnt 3200 3845 Pnt 3526 3779 Pnt 2594 3800 Pnt 2958 3811 Pnt 2586 3800 Pnt 2323 3871 Pnt 2880 3824 Pnt 1987 3802 Pnt 2754 3814 Pnt 4014 3871 Pnt 2900 3800 Pnt 3510 3779 Pnt 3004 3807 Pnt 2760 3798 Pnt 2851 3801 Pnt 2831 3857 Pnt 2631 3942 Pnt 2568 3824 Pnt 3480 3846 Pnt 2748 3803 Pnt 3499 3804 Pnt 2718 3804 Pnt 2625 3763 Pnt 3129 3801 Pnt 3479 3806 Pnt 4941 3824 Pnt 2699 3781 Pnt 3286 3781 Pnt 2857 3908 Pnt 3374 3904 Pnt 4006 3807 Pnt 2687 3782 Pnt 2851 3798 Pnt 2503 3807 Pnt 3869 3302 Pnt 3453 3812 Pnt 2385 3844 Pnt 3121 3851 Pnt 2107 3843 Pnt 2668 3825 Pnt 3427 3844 Pnt 3421 3819 Pnt 2331 3854 Pnt 2578 3847 Pnt 2439 3798 Pnt 3161 3800 Pnt 3814 3825 Pnt 1981 3837 Pnt 2985 3900 Pnt 3457 3797 Pnt 3382 3801 Pnt 3041 3866 Pnt 2074 3790 Pnt 2996 3807 Pnt 2270 3798 Pnt 2138 3930 Pnt 2257 3803 Pnt 3711 3805 Pnt 2586 3781 Pnt 2353 3763 Pnt 3038 3810 Pnt 3109 3837 Pnt 2709 3770 Pnt 3614 3763 Pnt 2610 3791 Pnt 4390 3801 Pnt 2806 3788 Pnt 3068 3788 Pnt 2821 3838 Pnt 3394 3788 Pnt 4007 3788 Pnt 2436 3868 Pnt 2320 3858 Pnt 1969 3844 Pnt 2660 3807 Pnt 2652 3863 Pnt 3317 3830 Pnt 3024 3777 Pnt 2952 3802 Pnt 2550 3800 Pnt 3338 3797 Pnt 2893 3870 Pnt 2574 3835 Pnt 4402 3800 Pnt 4107 3870 Pnt 3262 3809 Pnt 2804 3819 Pnt 3061 3801 Pnt 2378 3844 Pnt 2017 3811 Pnt 4341 3800 Pnt 2186 3790 Pnt 2654 3767 Pnt 4386 3790 Pnt 2307 3851 Pnt 3427 3801 Pnt 2033 3922 Pnt 2141 3911 Pnt 4140 3806 Pnt 2386 3892 Pnt 2823 3838 Pnt 2061 3849 Pnt 2602 3838 Pnt 2290 3819 Pnt 2498 3879 Pnt 2072 3784 Pnt 3118 3861 Pnt 2289 3842 Pnt 4508 3788 Pnt 2491 3775 Pnt 3187 3790 Pnt 2912 3803 Pnt 3468 3755 Pnt 2660 3811 Pnt 4228 3799 Pnt 1938 3754 Pnt 2029 3810 Pnt 2893 3783 Pnt 3296 3825 Pnt 4263 3807 Pnt 2508 3800 Pnt 2734 3826 Pnt 2901 3795 Pnt 3466 3829 Pnt 3206 3811 Pnt 2931 3915 Pnt 4124 3916 Pnt 2673 3844 Pnt 3165 3810 Pnt 3425 3831 Pnt 2466 3927 Pnt 4161 3797 Pnt 2178 3936 Pnt 3200 3898 Pnt 3035 3784 Pnt 3697 3870 Pnt 2369 3824 Pnt 3282 3824 Pnt 3200 3790 Pnt 2701 3790 Pnt 2556 3822 Pnt 2384 3836 Pnt 3910 3828 Pnt 2836 3790 Pnt 2517 3813 Pnt 2983 3826 Pnt 2679 3853 Pnt 4580 3804 Pnt 1940 3853 Pnt 3582 3823 Pnt 4824 3833 Pnt 4406 3778 Pnt 2637 3828 Pnt 3411 3259 Pnt 1926 3824 Pnt 2515 3781 Pnt 3351 3775 Pnt 3131 3859 Pnt 2843 3799 Pnt 2579 3833 Pnt 2812 3824 Pnt 2443 3791 Pnt 2371 3800 Pnt 4185 3782 Pnt 2683 3839 Pnt 2741 3782 Pnt 2746 3797 Pnt 2401 3786 Pnt 2835 3790 Pnt 2763 3829 Pnt 3322 3785 Pnt 4251 3790 Pnt 2431 3793 Pnt 3065 3814 Pnt 1944 3787 Pnt 3299 3794 Pnt 2897 3793 Pnt 2833 3836 Pnt 3060 3820 Pnt 2888 3793 Pnt 2779 3872 Pnt 3945 3818 Pnt 2453 3901 Pnt 4644 3797 Pnt 4571 3778 Pnt 3310 3801 Pnt 3200 3802 Pnt 3020 3815 Pnt 2561 3788 Pnt 3456 3785 Pnt 3841 3797 Pnt 3019 3830 Pnt 2600 3801 Pnt 3027 3831 Pnt 3211 3783 Pnt 2279 3855 Pnt 3626 3795 Pnt 2787 3817 Pnt 2694 3780 Pnt 3945 3795 Pnt 2080 3818 Pnt 3203 3794 Pnt 2742 3835 Pnt 2608 3933 Pnt 2689 3780 Pnt 2939 3848 Pnt 2429 3796 Pnt 2786 3830 Pnt 4554 3792 Pnt 3465 3820 Pnt 3640 3820 Pnt 2586 3783 Pnt 4310 3825 Pnt 3236 3776 Pnt 4031 3846 Pnt 2938 3809 Pnt 3904 3783 Pnt 3231 3871 Pnt 3752 3862 Pnt 2829 3844 Pnt 5044 3201 Pnt 3012 3831 Pnt 3339 3838 Pnt 2673 3795 Pnt 3024 3796 Pnt 2971 3796 Pnt 2933 3791 Pnt 4094 3816 Pnt 2836 3779 Pnt 2203 3842 Pnt 3192 3818 Pnt 4227 3801 Pnt 2773 3808 Pnt 3010 3827 Pnt 3065 3813 Pnt 3295 3827 Pnt 4382 3777 Pnt 2725 3809 Pnt 4752 3810 Pnt 2649 3783 Pnt 2987 3798 Pnt 3088 3812 Pnt 2759 3812 Pnt 3511 3796 Pnt 2259 3843 Pnt 2765 3857 Pnt 4122 3778 Pnt 2244 3852 Pnt 2939 3819 Pnt 2823 3878 Pnt 2703 3797 Pnt 2487 3795 Pnt 3164 3840 Pnt 2265 3809 Pnt 2492 3798 Pnt 2043 3930 Pnt 4058 3793 Pnt 2159 3809 Pnt 2329 3788 Pnt 2179 3797 Pnt 4351 3768 Pnt 2280 3812 Pnt 3135 3870 Pnt 2049 3811 Pnt 3654 3807 Pnt 3147 3767 Pnt 2651 3767 Pnt 2760 3829 Pnt 2600 3842 Pnt 2630 3807 Pnt 2522 3835 Pnt 2239 3863 Pnt 2810 3777 Pnt 4158 3815 Pnt 3561 3845 Pnt 4454 3814 Pnt 2407 3857 Pnt 3472 3853 Pnt 3481 3806 Pnt 2702 3824 Pnt 2442 3818 Pnt 3736 3754 Pnt 4510 3780 Pnt 3072 3812 Pnt 2286 3892 Pnt 4622 3799 Pnt 4259 3751 Pnt 2966 3795 Pnt 2803 3784 Pnt 3000 3772 Pnt 2697 3773 Pnt 2392 3772 Pnt 3170 3838 Pnt 2831 3850 Pnt 2831 3850 Pnt 2919 3790 Pnt 2310 3836 Pnt 3899 3784 Pnt 3759 3788 Pnt 2825 3782 Pnt 2811 3829 Pnt 2998 3848 Pnt 3822 3819 Pnt 2761 3825 Pnt 3347 3843 Pnt 2991 3824 Pnt 2132 3841 Pnt 3965 3828 Pnt 2686 3786 Pnt 2230 3857 Pnt 4530 3850 Pnt 4546 3776 Pnt 4823 3807 Pnt 2985 3807 Pnt 3704 3807 Pnt 3017 3857 Pnt 3413 3813 Pnt 3144 3857 Pnt 3921 3809 Pnt 3368 3804 Pnt 2087 3843 Pnt 2025 3810 Pnt 3034 3811 Pnt 2010 3783 Pnt 3777 3819 Pnt 2248 3825 Pnt 2924 3798 Pnt 3994 3776 Pnt 2576 3839 Pnt 2214 3900 Pnt 3568 3866 Pnt 2773 3801 Pnt 2068 3865 Pnt 2675 3866 Pnt 2004 3790 Pnt 4695 3827 Pnt 2622 3800 Pnt 3430 3763 Pnt 3000 3038 Pnt 2860 3762 Pnt 3127 3785 Pnt 3670 3828 Pnt 2711 3828 Pnt 3008 3788 Pnt 3205 3833 Pnt 3049 3816 Pnt 2667 3835 Pnt 3212 3819 Pnt 2480 3904 Pnt 3164 3811 Pnt 2203 3845 Pnt 2043 3904 Pnt 2486 3936 Pnt 3214 3801 Pnt 3030 3785 Pnt 3655 3807 Pnt 2790 3795 Pnt 3888 3800 Pnt 2273 3824 Pnt 3224 3839 Pnt 2247 3805 Pnt 3049 3944 Pnt 3040 3839 Pnt 3183 3782 Pnt 3942 3829 Pnt 4052 3810 Pnt 3182 3782 Pnt 2893 3783 Pnt 2919 3811 Pnt 2772 3834 Pnt 2929 3834 Pnt 3380 3789 Pnt 3248 3823 Pnt 3281 3785 Pnt 4256 3831 Pnt 4034 3815 Pnt 3507 3823 Pnt 2881 3833 Pnt 2693 3859 Pnt 2585 3810 Pnt 2844 3862 Pnt 2551 3763 Pnt 1874 3785 Pnt 2970 3821 Pnt 4956 3829 Pnt 3739 3859 Pnt 3028 3796 Pnt 3251 3770 Pnt 3028 3791 Pnt 2860 3778 Pnt 2540 3825 Pnt 2676 3798 Pnt 3258 3779 Pnt 2115 3793 Pnt 2504 3842 Pnt 3372 3809 Pnt 3104 3858 Pnt 3849 3778 Pnt 4771 3916 Pnt 2611 3791 Pnt 2522 3786 Pnt 4344 3851 Pnt 2281 3829 Pnt 3526 3254 Pnt 2290 3829 Pnt 2840 3816 Pnt 2595 3803 Pnt 3814 3817 Pnt 3338 3798 Pnt 3989 3816 Pnt 3439 3774 Pnt 2577 3795 Pnt 3487 3805 Pnt 1930 3930 Pnt 4421 3775 Pnt 2894 3785 Pnt 3157 3821 Pnt 2519 3805 Pnt 3535 3096 Pnt 2742 3782 Pnt 2667 3838 Pnt 3253 3848 Pnt 2598 3870 Pnt 3537 3856 Pnt 2488 3770 Pnt 2996 3815 Pnt 2052 3793 Pnt 3194 3821 Pnt 2638 3793 Pnt 2270 3800 Pnt 2359 3866 Pnt 2669 3836 Pnt 3292 3793 Pnt 3463 3794 Pnt 4130 3836 Pnt 3079 3807 Pnt 1961 3820 Pnt 3262 3801 Pnt 3031 3820 Pnt 3483 3820 Pnt 2577 3783 Pnt 3339 3767 Pnt 2219 3822 Pnt 3037 3820 Pnt 2535 3809 Pnt 2894 3877 Pnt 2305 3863 Pnt 2897 3845 Pnt 2354 3780 Pnt 2641 3813 Pnt 2637 3772 Pnt 2634 3800 Pnt 4557 3901 Pnt 2325 3772 Pnt 3521 3812 Pnt 3543 3802 Pnt 2709 3807 Pnt 3146 3789 Pnt 2409 3817 Pnt 2189 3822 Pnt 3451 3805 Pnt 2319 3811 Pnt 3320 3815 Pnt 3244 3811 Pnt 2058 3824 Pnt 3480 3824 Pnt 3324 3844 Pnt 3911 3846 Pnt 3210 3828 Pnt 2572 3806 Pnt 3071 3833 Pnt 3648 3845 Pnt 4057 3833 Pnt 3039 3781 Pnt 4080 3798 Pnt 3175 3795 Pnt 3454 3782 Pnt 3612 3830 Pnt 2668 3837 Pnt 3280 3793 Pnt 3156 3798 Pnt 4692 3821 Pnt 2724 3817 Pnt 3428 3774 Pnt 2801 3780 Pnt 2553 3838 Pnt 4317 3785 Pnt 2040 3818 Pnt 1941 3843 Pnt 3771 3142 Pnt 2680 3835 Pnt 2884 3832 Pnt 2307 3933 Pnt 2989 3815 Pnt 4313 3795 Pnt 2734 3830 Pnt 2837 3808 Pnt 3353 3933 Pnt 3996 3799 Pnt 4088 3815 Pnt 3874 3780 Pnt 2523 3799 Pnt 2368 3922 Pnt 2825 3800 Pnt 2182 3911 Pnt 3232 3797 Pnt 1983 3834 Pnt 2382 3813 Pnt 3728 3788 Pnt 2948 3819 Pnt 2723 3826 Pnt 3457 3819 Pnt 2736 3844 Pnt 3176 3781 Pnt 2432 3835 Pnt 2469 3781 Pnt 2249 3790 Pnt 2267 3868 Pnt 2661 3871 Pnt 2576 3803 Pnt 3041 3807 Pnt 2382 3801 Pnt 2009 3881 Pnt 2970 3832 Pnt 2080 3842 Pnt 2551 3781 Pnt 2369 3942 Pnt 2980 3807 Pnt 2733 3861 Pnt 4566 3826 Pnt 4998 3830 Pnt 4840 3781 Pnt 3631 3776 Pnt 4932 3824 Pnt 2582 3816 Pnt 2441 3842 Pnt 2091 3775 Pnt 2934 3892 Pnt 2387 3844 Pnt 3489 3812 Pnt 3733 3831 Pnt 3365 3820 Pnt 4645 3892 Pnt 4756 3819 Pnt 2705 3772 Pnt 3137 3828 Pnt 4601 3839 Pnt 3131 3834 Pnt 2748 3850 Pnt 3511 3851 Pnt 3636 3809 Pnt 2792 3769 Pnt 4492 3816 Pnt 3092 3790 Pnt 2486 3822 Pnt 2431 3857 Pnt 3657 3851 Pnt 2013 3845 Pnt 2569 3836 Pnt 2468 3853 Pnt 3555 3810 Pnt 3197 3831 Pnt 2949 3853 Pnt 2861 3782 Pnt 2066 3927 Pnt 2486 3853 Pnt 3889 3800 Pnt 2734 3828 Pnt 2507 3817 Pnt 3724 3808 Pnt 2107 3936 Pnt 3160 3808 Pnt 2305 3824 Pnt 3264 3842 Pnt 2314 3818 Pnt 3153 3788 Pnt 2929 3781 Pnt 3408 3800 Pnt 4434 3851 Pnt 4022 3824 Pnt 2793 3801 Pnt 3014 3783 Pnt 3222 3792 Pnt 4008 3843 Pnt 2771 3828 Pnt 3092 3791 Pnt 2696 3840 Pnt 2797 3791 Pnt 3164 3791 Pnt 2946 3824 Pnt 3728 3826 Pnt 2225 3800 Pnt 3950 3879 Pnt 3604 3800 Pnt 2605 3839 Pnt 2397 3839 Pnt 2259 3831 Pnt 3040 3831 Pnt 3557 3833 Pnt 4052 3849 Pnt 2720 3797 Pnt 3770 3864 Pnt 3008 3795 Pnt 4672 3836 Pnt 3505 3795 Pnt 3237 3780 Pnt 2537 3816 Pnt 2351 3843 Pnt 3394 3794 Pnt 3500 3843 Pnt 3664 3819 Pnt 4270 3825 Pnt 4882 3810 Pnt 4904 3823 Pnt 2592 3786 Pnt 2639 3793 Pnt 3174 3813 Pnt 2696 3793 Pnt 2820 3808 Pnt 2646 3827 Pnt 2984 3783 Pnt 3586 3809 Pnt 3852 3848 Pnt 3032 3813 Pnt 4266 3808 Pnt 3345 3799 Pnt 3606 3807 Pnt 2682 3857 Pnt 3245 3819 Pnt 2872 3809 Pnt 4462 3809 Pnt 2631 3791 Pnt 3435 3804 Pnt 4618 3786 Pnt 2718 3805 Pnt 3356 3844 Pnt 4472 3783 Pnt 2609 3811 Pnt 2767 3809 Pnt 3285 3145 Pnt 2573 3812 Pnt 4080 3808 Pnt 2817 3810 Pnt 3571 3795 Pnt 2462 3825 Pnt 3541 3839 Pnt 2494 3831 Pnt 2179 3852 Pnt 2917 3782 Pnt 2987 3819 Pnt 2794 3776 Pnt 3841 3835 Pnt 2774 3870 Pnt 2195 3878 Pnt 2959 3870 Pnt 2930 3810 Pnt 2807 3833 Pnt 2498 3751 Pnt 2725 3796 Pnt 3194 3751 Pnt 3383 3856 Pnt 2074 3865 Pnt 2593 3766 Pnt 4238 3800 Pnt 2799 3833 Pnt 2318 3844 Pnt 3342 3826 Pnt 2191 3810 Pnt 4624 3810 Pnt 2397 3786 Pnt 2497 3862 Pnt 3981 3799 Pnt 3920 3823 Pnt 2924 3867 Pnt 4641 3853 Pnt 3432 3796 Pnt 2543 3793 Pnt 3308 3860 Pnt 2712 3795 Pnt 2753 3790 Pnt 2709 3797 Pnt 3046 3821 Pnt 3531 3859 Pnt 3745 3779 Pnt 3616 3779 Pnt 3292 3798 Pnt 3697 3796 Pnt 3597 3829 Pnt 2855 3825 Pnt 2913 3858 Pnt 2336 3864 Pnt 2018 3793 Pnt 3353 3817 Pnt 2812 3849 Pnt 4466 3833 Pnt 4443 3849 Pnt 3277 3845 Pnt 3492 3785 Pnt 3878 3775 Pnt 2429 3772 Pnt 2536 3824 Pnt 3261 3824 Pnt 2537 3829 Pnt 3435 3798 Pnt 3299 3849 Pnt 3855 3850 Pnt 3071 3831 Pnt 2772 3797 Pnt 3159 3800 Pnt 2008 3930 Pnt 3683 3783 Pnt 3086 3797 Pnt 4543 3789 Pnt 2591 3798 Pnt 2649 3820 Pnt 3737 3844 Pnt 2567 3803 Pnt 2480 3837 Pnt 3171 3833 Pnt 3899 3781 Pnt 3331 3797 Pnt 3025 3830 Pnt 2678 3838 Pnt 2631 3848 Pnt 3126 3793 Pnt 3906 3825 Pnt 4172 3796 Pnt 2608 3840 Pnt 2830 3871 Pnt 2350 3812 Pnt 2839 3794 Pnt 2725 3770 Pnt 3751 3798 Pnt 2555 3800 Pnt 2303 3818 Pnt 2881 3816 Pnt 2833 3838 Pnt 2230 3800 Pnt 3747 3809 Pnt 2233 3866 Pnt 3584 3820 Pnt 3094 3805 Pnt 2976 3805 Pnt 3030 3808 Pnt 2885 3815 Pnt 2731 3815 Pnt 2775 3819 Pnt 3895 3815 Pnt 3127 3799 Pnt 2741 3831 Pnt 2840 3833 Pnt 2519 3760 Pnt 2090 3844 Pnt 2531 3774 Pnt 2265 3911 Pnt 2606 3772 Pnt 4040 3789 Pnt 2243 3822 Pnt 3818 3773 Pnt 3100 3827 Pnt 1855 3843 Pnt 3017 3787 Pnt 2876 3863 Pnt 3493 3785 Pnt 4654 3804 Pnt 2500 3811 Pnt 3080 3832 Pnt 2630 3797 Pnt 2758 3857 Pnt 2595 3806 Pnt 3263 3809 Pnt 3995 3831 Pnt 2630 3933 Pnt 3494 3826 Pnt 3249 3933 Pnt 2817 3808 Pnt 3065 3807 Pnt 2683 3844 Pnt 3110 3818 Pnt 2114 3848 Pnt 1989 3781 Pnt 2402 3790 Pnt 2554 3942 Pnt 2191 3868 Pnt 2628 3871 Pnt 3971 3800 Pnt 2552 3803 Pnt 2180 3800 Pnt 3475 3834 Pnt 2807 3834 Pnt 2366 3882 Pnt 3012 3800 Pnt 3168 3810 Pnt 3972 3794 Pnt 2638 3803 Pnt 2437 3847 Pnt 2067 3842 Pnt 2808 3847 Pnt 4161 3798 Pnt 2676 3853 Pnt 2676 3797 Pnt 2901 3800 Pnt 4364 3853 Pnt 2729 3862 Pnt 3121 3777 Pnt 3448 3862 Pnt 3090 3801 Pnt 2881 3853 Pnt 3346 3816 Pnt 4541 3802 Pnt 3038 3852 Pnt 2369 3780 Pnt 2397 3837 Pnt 3338 3791 Pnt 2775 3796 Pnt 2797 3826 Pnt 2364 3923 Pnt 3729 3824 Pnt 3053 3850 Pnt 3533 3826 Pnt 2240 3831 Pnt 2540 3840 Pnt 2987 3794 Pnt 2709 3782 Pnt 3740 3782 Pnt 3115 3824 Pnt 2812 3795 Pnt 2763 3839 Pnt 2176 3800 Pnt 2652 3832 Pnt 3608 3832 Pnt 4843 3876 Pnt 3520 3780 Pnt 3188 3775 Pnt 3472 3839 Pnt 2204 3892 Pnt 3493 3848 Pnt 2896 3864 Pnt 2942 3810 Pnt 4594 3789 Pnt 3744 3830 Pnt 3375 3795 Pnt 4503 3801 Pnt 2293 3843 Pnt 3486 3194 Pnt 2963 3832 Pnt 2531 3829 Pnt 4385 3841 Pnt 3858 3813 Pnt 2217 3827 Pnt 4119 3812 Pnt 3201 3870 Pnt 2397 3878 Pnt 3002 3794 Pnt 3875 3799 Pnt 2655 3833 Pnt 2715 3834 Pnt 4446 3800 Pnt 2899 3751 Pnt 2733 3796 Pnt 4199 3839 Pnt 4623 3818 Pnt 3249 3794 Pnt 2263 3840 Pnt 3211 3801 Pnt 4620 3785 Pnt 3791 3796 Pnt 3540 3866 Pnt 2035 3847 Pnt 2897 3795 Pnt 2542 3826 Pnt 4650 3791 Pnt 2507 3762 Pnt 3653 3836 Pnt 3150 3766 Pnt 3201 3826 Pnt 3911 3836 Pnt 2945 3866 Pnt 2532 3797 Pnt 3315 3810 Pnt 2929 3867 Pnt 3949 3790 Pnt 2481 3798 Pnt 2792 3798 Pnt 2863 3797 Pnt 2455 3798 Pnt 2016 3784 Pnt 2114 3809 Pnt 2963 3798 Pnt 3482 3796 Pnt 3394 3865 Pnt 3838 3805 Pnt 3403 3828 Pnt 3410 3787 Pnt 2913 3794 Pnt 2517 3812 Pnt 2779 3785 Pnt 3337 3836 Pnt 2527 3826 Pnt 3735 3785 Pnt 2888 3809 Pnt 2585 3824 Pnt 2753 3811 Pnt 2947 3811 Pnt 4088 3834 Pnt 2590 3904 Pnt 3595 3837 Pnt 2628 3835 Pnt 2352 3825 Pnt 3472 3904 Pnt 3130 3835 Pnt 2245 3798 Pnt 3897 3809 Pnt 2923 3807 Pnt 2891 3798 Pnt 1901 3793 Pnt 3695 3831 Pnt 2266 3824 Pnt 2560 3817 Pnt 3445 3797 Pnt 3213 3835 Pnt 2791 3944 Pnt 2400 3856 Pnt 2838 3849 Pnt 2235 3829 Pnt 2629 3843 Pnt 3854 3817 Pnt 2784 3851 Pnt 3173 3782 Pnt 3917 3840 Pnt 3320 3811 Pnt 4419 3815 Pnt 2845 3784 Pnt 3927 3784 Pnt 3044 3785 Pnt 2579 3773 Pnt 2884 3859 Pnt 2954 3824 Pnt 4001 3829 Pnt 3034 3779 Pnt 2839 3804 Pnt 2156 3793 Pnt 2711 3778 Pnt 3341 3851 Pnt 2319 3808 Pnt 2413 3786 Pnt 2588 3845 Pnt 3099 3811 Pnt 2843 3819 Pnt 4418 3811 Pnt 2770 3824 Pnt 4746 3806 Pnt 4180 3811 Pnt 2146 3857 Pnt 3497 3800 Pnt 3873 3815 Pnt 1958 3930 Pnt 2823 3838 Pnt 2368 3805 Pnt 3515 3805 Pnt 3260 3856 Pnt 2780 3827 Pnt 4653 3266 Pnt 2775 3838 Pnt 2881 3785 Pnt 2016 3807 Pnt 3022 3830 Pnt 2347 3779 Pnt 4082 3830 Pnt 3707 3832 Pnt 2664 3790 Pnt 2844 3805 Pnt 3636 3790 Pnt 4611 3779 Pnt 2742 3792 Pnt 4617 3021 Pnt 3542 3134 Pnt 4649 3840 Pnt 4883 3819 Pnt 2556 3833 Pnt 3767 3773 Pnt 3887 3862 Pnt 4249 3828 Pnt 3996 3832 Pnt 2656 3825 Pnt 3674 3828 Pnt 2609 3826 Pnt 2127 3852 Pnt 2730 3787 Pnt 2907 3800 Pnt 2784 3782 Pnt 3303 3848 Pnt 2403 3900 Pnt 4038 3793 Pnt 3014 3780 Pnt 2546 3830 Pnt 2947 3857 Pnt 3929 3856 Pnt 1939 3844 Pnt 4028 3827 Pnt 2991 3828 Pnt 3613 3830 Pnt 2781 3827 Pnt 3706 3855 Pnt 3132 3827 Pnt 4011 3827 Pnt 2925 3811 Pnt 3909 3826 Pnt 2367 3837 Pnt 3974 3811 Pnt 2235 3808 Pnt 3613 3838 Pnt 2966 3832 Pnt 1991 3811 Pnt 3389 3811 Pnt 4152 3785 Pnt 2321 3844 Pnt 3945 3850 Pnt 3597 3807 Pnt 3515 3847 Pnt 3686 3847 Pnt 3193 3818 Pnt 3123 3837 Pnt 3309 3769 Pnt 2936 3808 Pnt 2579 3809 Pnt 2445 3800 Pnt 2182 3810 Pnt 2681 3882 Pnt 2557 3786 Pnt 3059 3877 Pnt 2460 3796 Pnt 2069 3847 Pnt 2682 3876 Pnt 2907 3854 Pnt 4679 3835 Pnt 1955 3842 Pnt 2411 3901 Pnt 2744 3834 Pnt 2696 3789 Pnt 3153 3800 Pnt 4109 3798 Pnt 3663 3835 Pnt 3871 3864 Pnt 2595 3862 Pnt 3862 3805 Pnt 2399 3852 Pnt 2384 3852 Pnt 2591 3772 Pnt 2781 3801 Pnt 2949 3808 Pnt 3226 3860 Pnt 2977 3796 Pnt 3648 3811 Pnt 4473 3852 Pnt 2758 3132 Pnt 3244 3831 Pnt 1981 3936 Pnt 2185 3824 Pnt 3419 3795 Pnt 3922 3792 Pnt 2742 3838 Pnt 2795 3799 Pnt 3032 3830 Pnt 2889 3795 Pnt 2511 3776 Pnt 1986 3791 Pnt 3841 3830 Pnt 3788 3838 Pnt 2196 3800 Pnt 3128 3846 Pnt 2416 3899 Pnt 2767 3796 Pnt 2587 3832 Pnt 2059 3878 Pnt 3308 3899 Pnt 2125 3825 Pnt 2818 3848 Pnt 3204 3848 Pnt 4415 3796 Pnt 3684 3841 Pnt 3080 3841 Pnt 2264 3857 Pnt 2181 3836 Pnt 3921 3806 Pnt 3405 3766 Pnt 4189 3834 Pnt 3231 3824 Pnt 2882 3836 Pnt 2805 3786 Pnt 3566 3796 Pnt 3474 3805 Pnt 3993 3785 Pnt 4899 3822 Pnt 2322 3837 Pnt 3323 3791 Pnt 4022 3815 Pnt 3680 3847 Pnt 2263 3923 Pnt 3698 3794 Pnt 2116 3763 Pnt 2309 3824 Pnt 2669 3782 Pnt 3439 3785 Pnt 2743 3827 Pnt 3306 3795 Pnt 4558 3864 Pnt 3262 3817 Pnt 3504 3788 Pnt 2064 3818 Pnt 3059 3817 Pnt 2862 3802 Pnt 2198 3799 Pnt 3211 3791 Pnt 3470 3791 Pnt 2975 3792 Pnt 2811 3801 Pnt 2855 3780 Pnt 4054 3792 Pnt 4647 3791 Pnt 1802 3892 Pnt 2228 3795 Pnt 2591 3798 Pnt 2212 3798 Pnt 2859 3864 Pnt 3400 3854 Pnt 4285 3775 Pnt 4249 3843 Pnt 3280 3808 Pnt 3251 3816 Pnt 4127 3798 Pnt 3628 3815 Pnt 3914 3093 Pnt 3385 3873 Pnt 3541 3873 Pnt 3015 3751 Pnt 2690 3785 Pnt 2822 3826 Pnt 4036 3753 Pnt 3128 3779 Pnt 4040 3785 Pnt 3251 3810 Pnt 2143 3798 Pnt 3364 3804 Pnt 1904 3784 Pnt 2167 3809 Pnt 2688 3904 Pnt 3636 3835 Pnt 2372 3825 Pnt 4412 3826 Pnt 2941 3775 Pnt 4493 3788 Pnt 2825 3831 Pnt 3622 3831 Pnt 2164 3826 Pnt 2216 3812 Pnt 2314 3798 Pnt 3004 3797 Pnt 2591 3797 Pnt 2453 3807 Pnt 4161 3823 Pnt 2508 3792 Pnt 4749 3831 Pnt 3065 3792 Pnt 2378 3820 Pnt 2607 3817 Pnt 3086 3831 Pnt 3544 3848 Pnt 4688 3791 Pnt 3046 3930 Pnt 4135 3829 Pnt 3532 3848 Pnt 3921 3836 Pnt 3107 3838 Pnt 2840 3837 Pnt 2881 3838 Pnt 2863 3874 Pnt 3030 3779 Pnt 3073 3857 Pnt 3514 3835 Pnt 2482 3782 Pnt 3439 3830 Pnt 3838 3857 Pnt 2601 3827 Pnt 2689 3838 Pnt 3632 3807 Pnt 2405 3847 Pnt 2390 3857 Pnt 2690 3785 Pnt 3515 3811 Pnt 2512 3847 Pnt 3102 3847 Pnt 2604 3791 Pnt 3198 3811 Pnt 4606 3168 Pnt 2124 3805 Pnt 2650 3804 Pnt 3495 3811 Pnt 2797 3793 Pnt 4443 3848 Pnt 2979 3837 Pnt 2838 3844 Pnt 3020 3809 Pnt 3392 3809 Pnt 2456 3800 Pnt 2714 3800 Pnt 4582 3794 Pnt 4109 3800 Pnt 3696 3805 Pnt 4803 3809 Pnt 4567 3788 Pnt 5007 3837 Pnt 2683 3798 Pnt 2208 3936 Pnt 2984 3805 Pnt 2542 3833 Pnt 2584 3764 Pnt 2347 3820 Pnt 2073 3816 Pnt 3334 3832 Pnt 2867 3772 Pnt 2238 3846 Pnt 2792 3857 Pnt 3659 3816 Pnt 2802 3838 Pnt 2210 3824 Pnt 3621 3773 Pnt 2860 3837 Pnt 2655 3776 Pnt 2801 3804 Pnt 2735 3773 Pnt 3650 3805 Pnt 2538 3800 Pnt 3054 3825 Pnt 2130 3793 Pnt 2453 3816 Pnt 3400 3774 Pnt 2803 3805 Pnt 2833 3816 Pnt 3295 3778 Pnt 2971 3882 Pnt 2689 3830 Pnt 2437 3808 Pnt 3152 3828 Pnt 3044 3830 Pnt 2754 3848 Pnt 3246 3848 Pnt 2933 3786 Pnt 3065 3786 Pnt 2700 3824 Pnt 2563 3824 Pnt 3971 3850 Pnt 4340 3809 Pnt 3647 3860 Pnt 3058 3848 Pnt 3203 3838 Pnt 2841 3898 Pnt 3464 3791 Pnt 2914 3780 Pnt 2195 3854 Pnt 2763 3854 Pnt 4107 3780 Pnt 2730 3844 Pnt 3285 3828 Pnt 2513 3827 Pnt 4169 3818 Pnt 3549 3792 Pnt 2316 3808 Pnt 2945 3808 Pnt 3179 3916 Pnt 4267 3822 Pnt 3230 3835 Pnt 3056 3871 Pnt 5307 3778 Pnt 3964 3808 Pnt 3641 3772 Pnt 2544 3866 Pnt 3145 3820 Pnt 2700 3836 Pnt 4122 3777 Pnt 2830 3816 Pnt 2212 3882 Pnt 2621 3824 Pnt 2479 3877 Pnt 3830 3826 Pnt 2571 3799 Pnt 2378 3790 Pnt 4161 3835 Pnt 2985 3860 Pnt 3034 3876 Pnt 3476 3784 Pnt 4304 3838 Pnt 4832 3813 Pnt 2992 3901 Pnt 2716 3840 Pnt 2845 3840 Pnt 2409 3812 Pnt 3527 3817 Pnt 2588 3825 Pnt 3246 3794 Pnt 3363 3824 Pnt 3138 3775 Pnt 2532 3796 Pnt 2604 3775 Pnt 4062 3811 Pnt 4199 3237 Pnt 2211 3812 Pnt 3057 3850 Pnt 2707 3799 Pnt 2766 3816 Pnt 3334 3821 Pnt 3175 3821 Pnt 3130 3838 Pnt 2343 3792 Pnt 3293 3830 Pnt 2257 3809 Pnt 2450 3813 Pnt 2567 3809 Pnt 3057 3776 Pnt 2837 3806 Pnt 4062 3811 Pnt 2565 3913 Pnt 2140 3933 Pnt 4161 3933 Pnt 2736 3814 Pnt 3206 3806 Pnt 2573 3844 Pnt 2333 3849 Pnt 2829 3860 Pnt 4935 3808 Pnt 2888 3847 Pnt 3685 3862 Pnt 1952 3781 Pnt 4635 3794 Pnt 2671 3820 Pnt 2067 3942 Pnt 3294 3821 Pnt 2288 3868 Pnt 4019 3276 Pnt 2207 3796 Pnt 3270 3799 Pnt 3190 3811 Pnt 2565 3857 Pnt 2665 3810 Pnt 2748 3809 Pnt 2524 3826 Pnt 2480 3827 Pnt 2541 3803 Pnt 2591 3800 Pnt 2816 3807 Pnt 3027 3817 Pnt 2933 3824 Pnt 2844 3811 Pnt 3154 3810 Pnt 3346 3802 Pnt 2745 3835 Pnt 4500 3779 Pnt 3097 3803 Pnt 3072 3810 Pnt 2388 3853 Pnt 3287 3836 Pnt 3140 3823 Pnt 3258 3836 Pnt 1950 3786 Pnt 2168 3849 Pnt 4342 3815 Pnt 2112 3799 Pnt 2816 3791 Pnt 3403 3791 Pnt 2743 3759 Pnt 2562 3840 Pnt 2102 3833 Pnt 2946 3794 Pnt 4203 3831 Pnt 3252 3782 Pnt 3903 3840 Pnt 4097 3799 Pnt 2756 3839 Pnt 3851 3831 Pnt 2724 3923 Pnt 4117 3923 Pnt 2725 3794 Pnt 3059 3784 Pnt 2578 3779 Pnt 3325 3813 Pnt 2521 3778 Pnt 2073 3829 Pnt 2224 3824 Pnt 4095 3838 Pnt 3413 3824 Pnt 3241 3801 Pnt 2544 3810 Pnt 2128 3804 Pnt 3343 3851 Pnt 1824 3845 Pnt 4236 3810 Pnt 3750 3811 Pnt 2493 3816 Pnt 3541 3845 Pnt 3411 3820 Pnt 3947 3819 Pnt 2807 3820 Pnt 4500 3787 Pnt 4735 3799 Pnt 2535 3820 Pnt 2667 3762 Pnt 2633 3904 Pnt 2732 3861 Pnt 2735 3782 Pnt 2811 3828 Pnt 2404 3899 Pnt 2215 3800 Pnt 2183 3799 Pnt 3108 3858 Pnt 2678 3828 Pnt 3354 3826 Pnt 3198 3792 Pnt 2564 3879 Pnt 4059 3858 Pnt 2440 3807 Pnt 3866 3830 Pnt 2770 3830 Pnt 2261 3840 Pnt 2071 3808 Pnt 2837 3832 Pnt 3289 3826 Pnt 3146 3831 Pnt 3134 3828 Pnt 3986 3799 Pnt 2949 3817 Pnt 2118 3786 Pnt 2857 3838 Pnt 2108 3800 Pnt 4362 3811 Pnt 3138 3805 Pnt 3829 3826 Pnt 3256 3824 Pnt 3065 3804 Pnt 2567 3781 Pnt 4283 3809 Pnt 3838 3804 Pnt 3778 3822 Pnt 2667 3797 Pnt 2898 3781 Pnt 3093 3866 Pnt 2316 3854 Pnt 3135 3866 Pnt 2923 3827 Pnt 2755 3830 Pnt 2025 3807 Pnt 3614 3848 Pnt 3740 3830 Pnt 2871 3867 Pnt 3282 3841 Pnt 2561 3920 Pnt 3419 3838 Pnt 2722 3874 Pnt 3334 3838 Pnt 3902 3874 Pnt 4220 3784 Pnt 2801 3786 Pnt 2952 3811 Pnt 4276 3819 Pnt 3533 3878 Pnt 4030 3779 Pnt 3543 3770 Pnt 2920 3811 Pnt 3144 3833 Pnt 3407 3838 Pnt 2490 3791 Pnt 2586 3811 Pnt 4890 3866 Pnt 4049 3309 Pnt 3053 3829 Pnt 2574 3876 Pnt 4337 3833 Pnt 2233 3901 Pnt 2303 3837 Pnt 2972 3840 Pnt 3852 3776 Pnt 2914 3791 Pnt 2714 3800 Pnt 2986 3798 Pnt 2658 3815 Pnt 2894 3824 Pnt 2813 3794 Pnt 3654 3784 Pnt 4586 3801 Pnt 3283 3775 Pnt 3884 3775 Pnt 3034 3810 Pnt 2248 3798 Pnt 3315 3207 Pnt 2729 3772 Pnt 3722 3772 Pnt 2576 3798 Pnt 2263 3812 Pnt 4631 3790 Pnt 2172 3868 Pnt 2613 3786 Pnt 2471 3935 Pnt 2534 3831 Pnt 3633 3804 Pnt 2167 3847 Pnt 3768 3785 Pnt 3019 3837 Pnt 2919 3796 Pnt 2647 3783 Pnt 2548 3854 Pnt 2441 3827 Pnt 3342 3785 Pnt 2238 3871 Pnt 3003 3824 Pnt 2569 3842 Pnt 4530 3935 Pnt 2607 3810 Pnt 2896 3795 Pnt 2195 3764 Pnt 3389 3816 Pnt 2835 3804 Pnt 2742 3820 Pnt 3467 3816 Pnt 2939 3795 Pnt 2642 3807 Pnt 2532 3832 Pnt 1924 3838 Pnt 2020 3816 Pnt 2855 3862 Pnt 3667 3807 Pnt 2748 3780 Pnt 3191 3772 Pnt 3903 3860 Pnt 2845 3852 Pnt 2819 3816 Pnt 2223 3813 Pnt 3549 3810 Pnt 2410 3926 Pnt 3088 3813 Pnt 2572 3785 Pnt 3348 3862 Pnt 2712 3809 Pnt 2550 3895 Pnt 3018 3803 Pnt 2741 3806 Pnt 3218 3895 Pnt 2621 3855 Pnt 2350 3853 Pnt 2911 3798 Pnt 2802 3830 Pnt 2443 3824 Pnt 2880 3913 Pnt 2289 3933 Pnt 3222 3773 Pnt 3561 3853 Pnt 2352 3846 Pnt 3183 3863 Pnt 3659 3823 Pnt 3612 3798 Pnt 2617 3839 Pnt 2525 3826 Pnt 2181 3849 Pnt 3061 3834 Pnt 3308 3787 Pnt 2736 3834 Pnt 2539 3791 Pnt 4582 3804 Pnt 3601 3791 Pnt 3330 3840 Pnt 2809 3829 Pnt 2040 3812 Pnt 2854 3782 Pnt 2569 3848 Pnt 2866 3820 Pnt 4036 3794 Pnt 2730 3930 Pnt 2135 3848 Pnt 3306 3837 Pnt 3177 3848 Pnt 3907 3837 Pnt 3272 3798 Pnt 2977 3779 Pnt 2268 3806 Pnt 2954 3800 Pnt 3301 3821 Pnt 2516 3848 Pnt 2689 3817 Pnt 2688 3838 Pnt 3253 3825 Pnt 2582 3803 Pnt 2455 3898 Pnt 2891 3780 Pnt 2400 3844 Pnt 2937 3827 Pnt 3706 3778 Pnt 3555 3837 Pnt 2458 3780 Pnt 3247 3836 Pnt 3215 3866 Pnt 4500 3871 Pnt 3133 3816 Pnt 4128 3821 Pnt 2790 3799 Pnt 2528 3944 Pnt 3543 3758 Pnt 2565 3794 Pnt 3603 3830 Pnt 2088 3759 Pnt 3088 3833 Pnt 3634 3837 Pnt 2965 3794 Pnt 2270 3838 Pnt 3540 3831 Pnt 2887 3839 Pnt 2735 3764 Pnt 2486 3842 Pnt 2669 3828 Pnt 2399 3923 Pnt 3913 3833 Pnt 2322 3824 Pnt 2741 3784 Pnt 4411 3782 Pnt 2951 3786 Pnt 3082 3805 Pnt 3699 3847 Pnt 4332 3818 Pnt 3683 3779 Pnt 2838 3820 Pnt 3717 3787 Pnt 3606 3820 Pnt 3373 3792 Pnt 2238 3807 Pnt 2614 3860 Pnt 2655 3815 Pnt 3804 3831 Pnt 2748 3873 Pnt 2794 3851 Pnt 2204 3832 Pnt 2497 3810 Pnt 2925 3832 Pnt 3345 3801 Pnt 2712 3799 Pnt 2922 3817 Pnt 2661 3799 Pnt 2609 3790 Pnt 3008 3817 Pnt 3463 3828 Pnt 2349 3812 Pnt 2823 3787 Pnt 2103 3800 Pnt 3043 3799 Pnt 3895 3784 Pnt 4472 3828 Pnt 2513 3824 Pnt 2985 3796 Pnt 3181 3804 Pnt 2000 3786 Pnt 2579 3809 Pnt 2566 3804 Pnt 3834 3838 Pnt 4507 3790 Pnt 2829 3802 Pnt 1955 3810 Pnt 3641 3811 Pnt 3083 3840 Pnt 3796 3811 Pnt 3050 3841 Pnt 3920 3843 Pnt 2669 3838 Pnt 4036 3841 Pnt 2944 3920 Pnt 4871 3212 Pnt 3977 3815 Pnt 3666 3802 Pnt 3142 3874 Pnt 2240 3804 Pnt 3721 3835 Pnt 4233 3825 Pnt 2853 3835 Pnt 3500 3826 Pnt 3252 3878 Pnt 2768 3826 Pnt 4323 3835 Pnt 3243 3791 Pnt 2934 3040 Pnt 3022 3784 Pnt 3300 3798 Pnt 3875 3796 Pnt 3453 3811 Pnt 3187 3794 Pnt 2619 3811 Pnt 3406 3842 Pnt 3020 3842 Pnt 3430 3801 Pnt 2308 3790 Pnt 3000 3809 Pnt 2779 3809 Pnt 3322 3791 Pnt 2150 3764 Pnt 2614 3876 Pnt 4290 3827 Pnt 2432 3901 Pnt 3506 3830 Pnt 2107 3837 Pnt 3380 3837 Pnt 2074 3820 Pnt 2782 3840 Pnt 2068 3785 Pnt 2075 3816 Pnt 2875 3776 Pnt 1754 3838 Pnt 2799 3772 Pnt 2724 3852 Pnt 3905 3819 Pnt 2477 3785 Pnt 4992 3827 Pnt 2708 3837 Pnt 3075 3834 Pnt 3803 3791 Pnt 2937 3895 Pnt 4209 3784 Pnt 3202 3824 Pnt 3881 3819 Pnt 4075 3788 Pnt 2279 3798 Pnt 2893 3829 Pnt 2936 3772 Pnt 2128 3812 Pnt 3786 3821 Pnt 4644 3791 Pnt 4824 3821 Pnt 2288 3838 Pnt 4470 3780 Pnt 3761 3833 Pnt 3339 3898 Pnt 2071 3871 Pnt 3735 3808 Pnt 4562 3786 Pnt 3292 3833 Pnt 4241 3758 Pnt 4152 3818 Pnt 2626 2942 Pnt 4467 3819 Pnt 2518 3819 Pnt 2423 3784 Pnt 3176 3846 Pnt 5106 3833 Pnt 3920 3784 Pnt 2912 3801 Pnt 4010 3801 Pnt 4359 3828 Pnt 4193 3783 Pnt 3624 3810 Pnt 4172 3804 Pnt 2173 3827 Pnt 2263 3824 Pnt 4504 3783 Pnt 2496 3842 Pnt 3909 3780 Pnt 4362 3873 Pnt 2625 3883 Pnt 3296 3804 Pnt 4868 3338 Pnt 2744 3846 Pnt 3081 3804 Pnt 2900 3817 Pnt 3408 3778 Pnt 2464 3830 Pnt 2678 3824 Pnt 4534 3824 Pnt 4185 3835 Pnt 4033 3810 Pnt 4376 3811 Pnt 2862 3944 Pnt 4441 3275 Pnt 3993 3807 Pnt 2586 3802 Pnt 3654 3838 Pnt 3593 3794 Pnt 3078 3794 Pnt 3640 3775 Pnt 2768 3775 Pnt 4491 3812 Pnt 2302 3804 Pnt 3241 3853 Pnt 3002 3805 Pnt 2591 3795 Pnt 2192 3839 Pnt 4611 3179 Pnt 2326 3807 Pnt 2727 3807 Pnt 4039 3839 Pnt 2840 3862 Pnt 2799 3842 Pnt 3736 3826 Pnt 4799 3850 Pnt 2497 3826 Pnt 2982 3878 Pnt 2968 3821 Pnt 2797 3841 Pnt 2092 3923 Pnt 3729 3813 Pnt 3807 3821 Pnt 2808 3794 Pnt 2501 3820 Pnt 3641 3811 Pnt 2918 3818 Pnt 3122 3816 Pnt 1965 3820 Pnt 3331 3854 Pnt 3001 3781 Pnt 4545 3839 Pnt 2328 3931 Pnt 4769 3781 Pnt 3145 3834 Pnt 4093 3830 Pnt 3819 3829 Pnt 3592 3830 Pnt 4417 3865 Pnt 3825 3813 Pnt 3859 3838 Pnt 3089 3820 Pnt 3812 3776 Pnt 4337 3863 Pnt 4698 3841 Pnt 4216 3862 Pnt 3401 3814 Pnt 3044 3782 Pnt 2847 3191 Pnt 4988 3827 Pnt 3280 3814 Pnt 2877 3814 Pnt 3613 3816 Pnt 2406 3844 Pnt 3754 3809 Pnt 3253 3857 Pnt 3240 3780 Pnt 2376 3901 Pnt 2698 3901 Pnt 2113 3837 Pnt 2752 3785 Pnt 3919 3813 Pnt 3173 3849 Pnt 3131 3820 Pnt 2542 3815 Pnt 2449 3873 Pnt 2416 3832 Pnt 3665 3811 Pnt 2407 3810 Pnt 2684 3810 Pnt 2179 3797 Pnt 3574 3946 Pnt 3029 3817 Pnt 2908 3799 Pnt 3029 3790 Pnt 2698 3861 Pnt 4346 3818 Pnt 2574 3812 Pnt 2105 3809 Pnt 2771 3827 Pnt 2798 3838 Pnt 2666 3827 Pnt 4408 3826 Pnt 2728 3826 Pnt 2596 3831 Pnt 2745 3800 Pnt 3274 3836 Pnt 2510 3824 Pnt 3069 3805 Pnt 2163 3866 Pnt 2042 3882 Pnt 3118 3815 Pnt 3851 3871 Pnt 3482 3816 Pnt 3252 3818 Pnt 3539 3826 Pnt 2862 3837 Pnt 2807 3851 Pnt 2955 3832 Pnt 2856 3844 Pnt 2796 3815 Pnt 2672 3801 Pnt 3005 3799 Pnt 2956 3779 Pnt 3143 3827 Pnt 3174 3827 Pnt 3257 3812 Pnt 4796 3815 Pnt 2751 3830 Pnt 3316 3830 Pnt 4790 3830 Pnt 2154 3868 Pnt 2154 3759 Pnt 3006 3820 Pnt 3479 3863 Pnt 2332 3831 Pnt 2689 3809 Pnt 2748 3762 Pnt 2623 3787 Pnt 2753 3904 Pnt 3214 3796 Pnt 2563 3824 Pnt 3597 3817 Pnt 3167 3861 Pnt 2681 3802 Pnt 2980 3837 Pnt 2706 3785 Pnt 2468 3791 Pnt 2563 3854 Pnt 2621 3811 Pnt 2029 3873 Pnt 2977 3898 Pnt 3184 3801 Pnt 2802 3785 Pnt 2429 3799 Pnt 4337 3901 Pnt 4788 3788 Pnt 3397 3811 Pnt 2118 3842 Pnt 1957 3800 Pnt 3262 3785 Pnt 2505 3796 Pnt 2427 3810 Pnt 2301 3838 Pnt 2380 3800 Pnt 3305 3831 Pnt 2514 3794 Pnt 2974 3831 Pnt 3726 3826 Pnt 3035 3830 Pnt 2989 3836 Pnt 2809 3879 Pnt 2522 3838 Pnt 2410 3897 Pnt 2097 3871 Pnt 2819 3805 Pnt 3776 3811 Pnt 3297 3819 Pnt 4041 3870 Pnt 2340 3802 Pnt 2969 3799 Pnt 3301 3811 Pnt 3262 3847 Pnt 3003 3819 Pnt 3099 3795 Pnt 3002 3866 Pnt 2165 3807 Pnt 2935 3795 Pnt 2804 3816 Pnt 5048 3825 Pnt 3382 3852 Pnt 3017 3866 Pnt 3268 3348 Pnt 2960 3764 Pnt 2378 3766 Pnt 3011 3860 Pnt 2493 3860 Pnt 2840 3935 Pnt 2833 3826 Pnt 4746 3836 Pnt 2994 3862 Pnt 2486 3837 Pnt 3415 3935 Pnt 2192 3788 Pnt 2634 3855 Pnt 2651 3807 Pnt 2553 3819 Pnt 2855 3830 Pnt 2554 3773 Pnt 2872 3806 Pnt 3982 3826 Pnt 2052 3824 Pnt 2785 3931 Pnt 2220 3775 Pnt 2753 3853 Pnt 2904 3913 Pnt 3030 3798 Pnt 3196 3835 Pnt 2031 3933 Pnt 3117 3835 Pnt 2199 3797 Pnt 3539 3768 Pnt 3174 3830 Pnt 3249 3791 Pnt 2730 3800 Pnt 3112 3801 Pnt 2999 3800 Pnt 2946 3823 Pnt 2817 3814 Pnt 3026 3895 Pnt 2633 3895 Pnt 3032 3843 Pnt 2503 3843 Pnt 2976 3808 Pnt 3423 3864 Pnt 2842 3864 Pnt 2831 3837 Pnt 2726 3807 Pnt 2786 3820 Pnt 3241 3830 Pnt 3841 3780 Pnt 2399 3848 Pnt 3352 3828 Pnt 2415 3807 Pnt 3176 3798 Pnt 3048 3838 Pnt 3114 3857 Pnt 4388 3827 Pnt 4681 3782 Pnt 2269 3901 Pnt 3044 3779 Pnt 2835 3820 Pnt 2948 3783 Pnt 2804 3793 Pnt 4806 3796 Pnt 2476 3850 Pnt 3483 3812 Pnt 3330 3802 Pnt 3527 3851 Pnt 2716 3819 Pnt 3289 3804 Pnt 2884 3829 Pnt 2402 3827 Pnt 2313 3827 Pnt 2587 3838 Pnt 2936 3803 Pnt 3051 3787 Pnt 2743 3831 Pnt 4159 3803 Pnt 2978 3831 Pnt 2644 3795 Pnt 4470 3791 Pnt 2062 3800 Pnt 3834 3838 Pnt 4333 3782 Pnt 2343 3839 Pnt 3341 3831 Pnt 2122 3820 Pnt 3051 3805 Pnt 3226 3867 Pnt 3265 3842 Pnt 2427 3828 Pnt 3694 3871 Pnt 2652 3878 Pnt 2415 3799 Pnt 3552 3821 Pnt 2800 3794 Pnt 2554 3816 Pnt 2541 3821 Pnt 1747 3820 Pnt 2724 3854 Pnt 2182 3837 Pnt 4458 3883 Pnt 2303 3791 Pnt 4229 3808 Pnt 3623 3797 Pnt 4545 3829 Pnt 3056 3807 Pnt 3403 3841 Pnt 3627 3804 Pnt 2805 3834 Pnt 3386 3807 Pnt 2972 3837 Pnt 2859 3785 Pnt 3353 3762 Pnt 3038 3782 Pnt 1992 3836 Pnt 2035 3882 Pnt 2838 3879 Pnt 3397 3785 Pnt 4269 3848 Pnt 2689 3838 Pnt 3312 3817 Pnt 2800 3813 Pnt 2874 3778 Pnt 3207 3788 Pnt 3859 3852 Pnt 2971 3811 Pnt 4292 3823 Pnt 2805 3876 Pnt 3903 3876 Pnt 2850 3901 Pnt 3877 3861 Pnt 2471 3796 Pnt 3435 3796 Pnt 2737 3811 Pnt 2675 3830 Pnt 3468 3802 Pnt 2996 3935 Pnt 4904 3813 Pnt 3166 3798 Pnt 2860 3848 Pnt 2391 3895 Pnt 3800 3783 Pnt 2594 3849 Pnt 2888 3819 Pnt 2732 3843 Pnt 2487 3787 Pnt 3089 3866 Pnt 2764 3864 Pnt 1892 3840 Pnt 2580 3820 Pnt 3047 3832 Pnt 2686 3831 Pnt 4679 3788 Pnt 4398 3833 Pnt 3384 3846 Pnt 4456 3801 Pnt 3885 3828 Pnt 2225 3841 Pnt 4683 3867 Pnt 3411 3783 Pnt 3219 3828 Pnt 3440 3832 Pnt 3482 3801 Pnt 2686 3809 Pnt 3813 3824 Pnt 3228 3788 Pnt 3956 3788 Pnt 2029 3799 Pnt 2600 3831 Pnt 2223 3801 Pnt 2330 3809 Pnt 2935 3766 Pnt 3674 3783 Pnt 2226 3838 Pnt 3237 3807 Pnt 2961 3837 Pnt 2526 3803 Pnt 2068 3800 Pnt 2999 3920 Pnt 2569 3855 Pnt 2123 3824 Pnt 3035 3835 Pnt 2885 3802 Pnt 2096 3800 Pnt 3190 3780 Pnt 3670 3800 Pnt 3144 3874 Pnt 4586 3782 Pnt 3069 3831 Pnt 2360 3828 Pnt 3459 3826 Pnt 3160 3818 Pnt 3773 3801 Pnt 2464 3794 Pnt 2656 3807 Pnt 2314 3802 Pnt 2953 3870 Pnt 4699 3800 Pnt 2781 3799 Pnt 2978 3794 Pnt 3949 3814 Pnt 3488 3805 Pnt 2550 3815 Pnt 2553 3821 Pnt 2653 3815 Pnt 3525 3823 Pnt 2426 3873 Pnt 3222 3873 Pnt 1926 3832 Pnt 2820 3866 Pnt 2540 3810 Pnt 4829 3787 Pnt 2776 3769 Pnt 3152 3811 Pnt 2503 3810 Pnt 2685 3837 Pnt 2630 3813 Pnt 2756 3797 Pnt 4003 3830 Pnt 2530 3808 Pnt 2336 3822 Pnt 2287 3819 Pnt 3117 3946 Pnt 3028 3826 Pnt 3635 3946 Pnt 3231 3804 Pnt 3226 3799 Pnt 4547 3872 Pnt 3267 3861 Pnt 3505 3806 Pnt 2958 3841 Pnt 2620 3854 Pnt 3350 3831 Pnt 2048 3809 Pnt 3115 3835 Pnt 3131 3798 Pnt 2759 3831 Pnt 2725 3803 Pnt 2817 3792 Pnt 2680 3805 Pnt 3022 3792 Pnt 2382 3807 Pnt 2976 3795 Pnt 2508 3806 Pnt 3125 3806 Pnt 4576 3852 Pnt 2790 3827 Pnt 2429 3775 Pnt 3305 3816 Pnt 2742 3913 Pnt 2732 3860 Pnt 3809 3816 Pnt 3933 3775 Pnt 2910 3877 Pnt 2395 3926 Pnt 3955 3850 Pnt 3132 3816 Pnt 2513 3876 Pnt 2137 3933 Pnt 3079 3870 Pnt 3303 3869 Pnt 2460 3876 Pnt 3105 3853 Pnt 1952 3831 Pnt 2419 3868 Pnt 3115 3818 Pnt 3487 3820 Pnt 2924 3818 Pnt 2248 3837 Pnt 3238 3868 Pnt 2539 3901 Pnt 2400 3852 Pnt 4476 3814 Pnt 2157 3797 Pnt 2557 3861 Pnt 3193 3807 Pnt 2413 3796 Pnt 3082 3856 Pnt 2042 3882 Pnt 3251 3877 Pnt 2326 3823 Pnt 3062 3825 Pnt 3303 3812 Pnt 2707 3863 Pnt 3804 3827 Pnt 3643 3863 Pnt 2550 3772 Pnt 3480 3829 Pnt 2960 3819 Pnt 4238 3820 Pnt 3913 3833 Pnt 3517 3845 Pnt 3720 3819 Pnt 4875 3798 Pnt 2614 3787 Pnt 4419 3797 Pnt 2865 3818 Pnt 3271 3829 Pnt 4096 2961 Pnt 4040 3199 Pnt 2766 3844 Pnt 2902 3844 Pnt 3530 3829 Pnt 3214 3785 Pnt 3803 3798 Pnt 2584 3785 Pnt 3333 3788 Pnt 3224 3819 Pnt 4053 3819 Pnt 2051 3842 Pnt 2145 3895 Pnt 3484 3826 Pnt 2305 3935 Pnt 2405 3843 Pnt 3996 3791 Pnt 3065 3802 Pnt 2380 3846 Pnt 2825 3801 Pnt 3256 3819 Pnt 3147 3830 Pnt 3776 3799 Pnt 2420 3803 Pnt 2942 3866 Pnt 3521 3866 Pnt 2012 3786 Pnt 3126 3831 Pnt 3175 3831 Pnt 2686 3831 Pnt 4108 3801 Pnt 2624 3834 Pnt 2475 3787 Pnt 3561 3831 Pnt 2515 3861 Pnt 2417 3830 Pnt 2142 3840 Pnt 3640 3808 Pnt 2363 3801 Pnt 3034 3824 Pnt 2898 3837 Pnt 2189 3801 Pnt 2301 3825 Pnt 2949 3810 Pnt 3110 3837 Pnt 3149 3944 Pnt 2279 3920 Pnt 2105 3824 Pnt 2486 3800 Pnt 3850 3785 Pnt 4514 3783 Pnt 3701 3809 Pnt 3422 3787 Pnt 3104 3834 Pnt 2655 3862 Pnt 2516 3834 Pnt 2710 3841 Pnt 2053 3923 Pnt 2667 3812 Pnt 3354 3823 Pnt 2543 3791 Pnt 2932 3823 Pnt 2337 3866 Pnt 3872 3797 Pnt 3480 3781 Pnt 4622 3818 Pnt 2853 3844 Pnt 2978 3814 Pnt 2685 3835 Pnt 3131 3826 Pnt 3175 3819 Pnt 2514 3773 Pnt 3345 3818 Pnt 4045 3801 Pnt 2079 3931 Pnt 2454 3853 Pnt 2822 3794 Pnt 3367 3815 Pnt 3251 3808 Pnt 3106 3831 Pnt 2911 3779 Pnt 4617 3788 Pnt 2402 3815 Pnt 3243 3826 Pnt 2001 3795 Pnt 2650 3830 Pnt 2521 3791 Pnt 3002 3873 Pnt 2854 3820 Pnt 3538 3785 Pnt 2323 3904 Pnt 2752 3833 Pnt 2543 3824 Pnt 2941 3811 Pnt 3202 3801 Pnt 2808 3769 Pnt 3613 3811 Pnt 4629 3849 Pnt 3179 3804 Pnt 2825 3799 Pnt 2764 3897 Pnt 3562 3854 Pnt 2145 3805 Pnt 3040 3798 Pnt 2645 3813 Pnt 2776 3845 Pnt 3215 3799 Pnt 2986 3797 Pnt 2701 3802 Pnt 2919 3857 Pnt 2410 3808 Pnt 4373 3787 Pnt 2172 3822 Pnt 3274 3836 Pnt 2695 3812 Pnt 2910 3861 Pnt 2230 3825 Pnt 3095 3862 Pnt 3266 3861 Pnt 2322 3848 Pnt 2244 3782 Pnt 4673 3805 Pnt 3227 3277 Pnt 3623 3812 Pnt 2724 3827 Pnt 2416 3781 Pnt 3919 3798 Pnt 2107 3913 Pnt 4223 3812 Pnt 2630 3900 Pnt 4047 3832 Pnt 4544 3827 Pnt 3510 3877 Pnt 3912 3829 Pnt 4155 3806 Pnt 3637 3820 Pnt 4351 3770 Pnt 4902 3854 Pnt 2907 3868 Pnt 2877 3769 Pnt 2162 3837 Pnt 3472 3846 Pnt 3087 3784 Pnt 2962 3781 Pnt 3900 3877 Pnt 3081 3819 Pnt 2448 3807 Pnt 4228 3812 Pnt 4557 3851 Pnt 3557 3860 Pnt 2858 3795 Pnt 4801 3852 Pnt 4809 3838 Pnt 3875 3850 Pnt 2779 3811 Pnt 2746 3847 Pnt 2188 3841 Pnt 2194 3795 Pnt 3012 3810 Pnt 2324 3838 Pnt 3021 3872 Pnt 2747 3798 Pnt 2711 3852 Pnt 2508 3806 Pnt 2266 3817 Pnt 2471 3796 Pnt 2895 3775 Pnt 3849 3803 Pnt 2278 3877 Pnt 3310 3798 Pnt 4542 3850 Pnt 2516 3934 Pnt 2238 3854 Pnt 2046 3879 Pnt 3405 3827 Pnt 3195 3828 Pnt 3030 3816 Pnt 3324 3787 Pnt 3953 3851 Pnt 3132 3866 Pnt 2601 3876 Pnt 3368 3816 Pnt 3198 3866 Pnt 2457 3807 Pnt 3631 3829 Pnt 4007 3802 Pnt 2671 3809 Pnt 2376 3819 Pnt 2942 3876 Pnt 3287 3809 Pnt 3628 3859 Pnt 2907 3823 Pnt 1982 3833 Pnt 3757 3864 Pnt 3254 3876 Pnt 3867 3823 Pnt 2460 3816 Pnt 3366 3871 Pnt 2935 3800 Pnt 3829 3901 Pnt 2165 3809 Pnt 3402 3863 Pnt 3788 3800 Pnt 3360 3797 Pnt 3748 3844 Pnt 2966 3766 Pnt 2705 3797 Pnt 2709 3785 Pnt 2801 3814 Pnt 3991 3870 Pnt 2859 3812 Pnt 3844 3869 Pnt 3440 3825 Pnt 2801 3852 Pnt 2793 3803 Pnt 2960 3856 Pnt 2908 3791 Pnt 3670 3856 Pnt 2249 3843 Pnt 3058 3827 Pnt 2928 3855 Pnt 3834 3824 Pnt 2384 3846 Pnt 2992 3846 Pnt 2593 3830 Pnt 3962 3853 Pnt 2696 3828 Pnt 2728 3803 Pnt 4005 3851 Pnt 3635 3858 Pnt 2335 3874 Pnt 2862 3784 Pnt 3453 3825 Pnt 3413 3829 Pnt 2646 3831 Pnt 3760 3791 Pnt 2763 3791 Pnt 2377 3794 Pnt 2991 3827 Pnt 2214 3800 Pnt 4558 3843 Pnt 3388 3797 Pnt 2853 3787 Pnt 3398 3176 Pnt 2323 3841 Pnt 2319 3802 Pnt 1756 3932 Pnt 2078 3870 Pnt 2776 3901 Pnt 3442 3809 Pnt 3854 3838 Pnt 2579 3839 Pnt 3972 3840 Pnt 3464 3791 Pnt 3492 3834 Pnt 3112 3805 Pnt 2102 3866 Pnt 2565 3843 Pnt 2470 3799 Pnt 3091 3843 Pnt 3576 3777 Pnt 4068 3799 Pnt 2163 3801 Pnt 2562 3810 Pnt 3791 3801 Pnt 2001 3826 Pnt 4625 3769 Pnt 3257 3837 Pnt 2528 3819 Pnt 2570 3837 Pnt 2712 3842 Pnt 3650 3837 Pnt 2523 3944 Pnt 2664 3818 Pnt 4187 3833 Pnt 2406 3920 Pnt 2813 3826 Pnt 2447 3931 Pnt 3253 3799 Pnt 2172 3859 Pnt 2907 3859 Pnt 3725 3804 Pnt 3704 3823 Pnt 2282 3897 Pnt 3856 3799 Pnt 4146 3799 Pnt 2183 3805 Pnt 2868 3815 Pnt 2970 3826 Pnt 2268 3815 Pnt 2836 3856 Pnt 3529 3853 Pnt 1995 3795 Pnt 2737 3856 Pnt 2620 3807 Pnt 2176 3830 Pnt 2372 3791 Pnt 2605 3835 Pnt 2285 3873 Pnt 2758 3785 Pnt 3515 3799 Pnt 2800 3834 Pnt 3190 3904 Pnt 3127 3824 Pnt 2662 3811 Pnt 3279 3803 Pnt 2974 3769 Pnt 2956 3807 Pnt 4197 3833 Pnt 2719 3926 Pnt 3375 3807 Pnt 3062 3797 Pnt 3209 3799 Pnt 3548 3801 Pnt 2798 3813 Pnt 2648 3825 Pnt 2573 3847 Pnt 1838 3797 Pnt 3132 3853 Pnt 2832 3946 Pnt 3176 3802 Pnt 2714 3792 Pnt 4347 3802 Pnt 2944 3788 Pnt 4839 3849 Pnt 3436 3857 Pnt 4643 3769 Pnt 3299 3805 Pnt 2397 3808 Pnt 1943 3857 Pnt 2351 3827 Pnt 3083 3257 Pnt 2688 3822 Pnt 2428 3900 Pnt 2772 3837 Pnt 2677 3812 Pnt 2152 3781 Pnt 2893 3842 Pnt 3108 3781 Pnt 3111 3806 Pnt 2980 3781 Pnt 2857 3818 Pnt 3822 3861 Pnt 4985 3819 Pnt 2360 3848 Pnt 3898 3836 Pnt 2641 3784 Pnt 4663 3784 Pnt 3215 3812 Pnt 3993 3861 Pnt 2159 3838 Pnt 3228 3829 Pnt 2736 3798 Pnt 4669 3825 Pnt 2506 3868 Pnt 2837 3817 Pnt 3084 3844 Pnt 3550 3798 Pnt 3711 3798 Pnt 4367 3143 Pnt 2744 3059 Pnt 2609 3787 Pnt 4374 3787 Pnt 4291 3783 Pnt 3274 3803 Pnt 3791 3785 Pnt 2777 3848 Pnt 2705 3877 Pnt 2936 3877 Pnt 3442 3783 Pnt 3313 3859 Pnt 4304 3783 Pnt 2684 3839 Pnt 3207 3859 Pnt 2258 3901 Pnt 2576 3902 Pnt 4028 3824 Pnt 4800 3855 Pnt 2621 3818 Pnt 4092 3826 Pnt 3473 3827 Pnt 2416 3846 Pnt 3347 3846 Pnt 3424 3797 Pnt 3041 3828 Pnt 3438 3804 Pnt 2934 3807 Pnt 2912 3831 Pnt 3395 3799 Pnt 1988 3936 Pnt 3440 3823 Pnt 2932 3834 Pnt 2912 3816 Pnt 2795 3861 Pnt 3073 3831 Pnt 4449 3828 Pnt 2134 3847 Pnt 2306 3809 Pnt 4175 3862 Pnt 3451 3831 Pnt 2401 3786 Pnt 3811 3871 Pnt 2919 3824 Pnt 2744 3849 Pnt 2628 3843 Pnt 2374 3814 Pnt 2611 3901 Pnt 2269 3825 Pnt 4271 3800 Pnt 3200 3781 Pnt 2503 3901 Pnt 2827 3815 Pnt 1947 3923 Pnt 2753 3816 Pnt 3253 3861 Pnt 3512 3838 Pnt 3954 3831 Pnt 4517 3815 Pnt 4516 3861 Pnt 2443 3838 Pnt 2460 3766 Pnt 2393 3845 Pnt 2240 3839 Pnt 2316 3831 Pnt 3469 3794 Pnt 2825 3814 Pnt 3779 3795 Pnt 3324 3790 Pnt 2919 3775 Pnt 2577 3775 Pnt 3449 3815 Pnt 2447 3842 Pnt 3189 3785 Pnt 3406 3800 Pnt 2935 3856 Pnt 3171 3797 Pnt 2953 3814 Pnt 2491 3934 Pnt 3904 3840 Pnt 3710 3796 Pnt 5084 3833 Pnt 2863 3791 Pnt 2414 3844 Pnt 2406 3845 Pnt 2457 3843 Pnt 3290 3812 Pnt 2966 3843 Pnt 2956 3828 Pnt 2804 3884 Pnt 3326 3837 Pnt 2898 3825 Pnt 3590 3806 Pnt 3243 3799 Pnt 2748 3835 Pnt 2586 3855 Pnt 3254 3799 Pnt 2808 3852 Pnt 2617 3837 Pnt 3174 3855 Pnt 2541 3942 Pnt 2938 3802 Pnt 3374 3803 Pnt 3296 3861 Pnt 3547 3825 Pnt 3087 3837 Pnt 2702 3824 Pnt 2606 3843 Pnt 2967 3817 Pnt 2033 3915 Pnt 2580 3876 Pnt 1891 3797 Pnt 4095 3877 Pnt 3114 3844 Pnt 2664 3841 Pnt 2414 3945 Pnt 2789 3798 Pnt 3139 3872 Pnt 3772 3844 Pnt 2837 3806 Pnt 3654 3799 Pnt 2693 3798 Pnt 2136 3801 Pnt 3101 3857 Pnt 2778 3831 Pnt 2578 3900 Pnt 4642 3831 Pnt 2201 3802 Pnt 2672 3830 Pnt 3855 3852 Pnt 2502 3842 Pnt 3114 3812 Pnt 3259 3877 Pnt 3926 3821 Pnt 3222 3773 Pnt 3304 3810 Pnt 3396 3781 Pnt 2022 3859 Pnt 2093 3841 Pnt 2515 3784 Pnt 3083 3823 Pnt 2380 3813 Pnt 4320 3784 Pnt 2716 3847 Pnt 3199 3855 Pnt 2484 3805 Pnt 4106 3817 Pnt 2698 3807 Pnt 2842 3803 Pnt 3212 3834 Pnt 3256 3848 Pnt 4742 3834 Pnt 2412 3877 Pnt 3530 3809 Pnt 2847 3864 Pnt 4156 3848 Pnt 4305 3851 Pnt 2452 3830 Pnt 2868 3926 Pnt 3297 3866 Pnt 2036 3807 Pnt 3893 3807 Pnt 3281 3844 Pnt 1920 3839 Pnt 3050 3818 Pnt 3953 3871 Pnt 2768 3818 Pnt 3825 3783 Pnt 2609 3792 Pnt 3748 3797 Pnt 3715 3797 Pnt 3652 3788 Pnt 2245 3832 Pnt 3356 3824 Pnt 2257 3827 Pnt 4407 3769 Pnt 2989 3859 Pnt 2352 3840 Pnt 2643 3841 Pnt 2606 3902 Pnt 3100 3841 Pnt 2577 3829 Pnt 2391 3842 Pnt 3917 3841 Pnt 1785 3807 Pnt 2509 3846 Pnt 2804 3792 Pnt 2866 3828 Pnt 3561 3792 Pnt 2822 3804 Pnt 1963 3799 Pnt 3562 3802 Pnt 2625 3841 Pnt 4642 3902 Pnt 2908 3838 Pnt 3778 3831 Pnt 2968 3827 Pnt 2645 3784 Pnt 2505 3871 Pnt 4154 3831 Pnt 1889 3825 Pnt 3135 3830 Pnt 3050 3825 Pnt 3040 3825 Pnt 2458 3843 Pnt 2175 3814 Pnt 2423 3781 Pnt 3766 3822 Pnt 4537 3782 Pnt 2849 3781 Pnt 2395 3923 Pnt 2469 3864 Pnt 2855 3836 Pnt 3367 3864 Pnt 2739 3798 Pnt 2579 3803 Pnt 1951 3932 Pnt 3413 3803 Pnt 3374 3856 Pnt 2997 3878 Pnt 2944 3852 Pnt 2976 3834 Pnt 1993 3816 Pnt 3425 3784 Pnt 2526 3861 Pnt 4942 3830 Pnt 2642 3867 Pnt 4704 3799 Pnt 2798 3840 Pnt 2773 3809 Pnt 2726 3791 Pnt 2332 3801 Pnt 2897 3797 Pnt 2403 3794 Pnt 3881 3791 Pnt 2444 3831 Pnt 2482 3859 Pnt 4235 3811 Pnt 3256 3797 Pnt 4137 3819 Pnt 3109 3787 Pnt 3219 3789 Pnt 3969 3796 Pnt 3030 3791 Pnt 2568 3825 Pnt 2814 3873 Pnt 3051 3805 Pnt 2444 3798 Pnt 4352 3787 Pnt 3059 3783 Pnt 2937 3808 Pnt 3972 3811 Pnt 3137 3800 Pnt 2040 3844 Pnt 4704 3803 Pnt 2236 3055 Pnt 3164 3845 Pnt 4413 3806 Pnt 2801 3828 Pnt 4034 3828 Pnt 2655 3884 Pnt 2785 3826 Pnt 3160 3837 Pnt 2585 3799 Pnt 3356 3799 Pnt 3287 3804 Pnt 4247 3783 Pnt 3567 3835 Pnt 2231 3859 Pnt 2129 3801 Pnt 4799 3819 Pnt 4226 3818 Pnt 2888 3897 Pnt 3104 3857 Pnt 3054 3809 Pnt 2535 3868 Pnt 2175 3781 Pnt 2143 3800 Pnt 4486 3800 Pnt 4792 3809 Pnt 2852 3842 Pnt 2611 3225 Pnt 3852 3832 Pnt 2448 3826 Pnt 2360 3821 Pnt 2974 3821 Pnt 3428 3842 Pnt 2490 3846 Pnt 3158 3773 Pnt 4052 3815 Pnt 2154 3859 Pnt 3564 3806 Pnt 4911 3825 Pnt 2004 3841 Pnt 3264 3792 Pnt 2930 3797 Pnt 2512 3854 Pnt 2185 3784 Pnt 3667 3808 Pnt 3139 3795 Pnt 2694 3802 Pnt 2938 3868 Pnt 3325 3864 Pnt 2634 3841 Pnt 2014 3790 Pnt 3036 3838 Pnt 3305 3838 Pnt 2994 3790 Pnt 2522 3785 Pnt 2586 3856 Pnt 2019 3807 Pnt 2598 3784 Pnt 2507 3871 Pnt 3008 3902 Pnt 2472 3830 Pnt 3678 3831 Pnt 3500 3807 Pnt 2920 3838 Pnt 2144 3830 Pnt 3338 3807 Pnt 2796 3822 Pnt 2300 3791 Pnt 3359 3793 Pnt 2014 3781 Pnt 2912 3899 Pnt 2887 3835 Pnt 4274 3784 Pnt 4561 3812 Pnt 4059 3825 Pnt 2440 3789 Pnt 2444 3873 Pnt 3409 3847 Pnt 3150 3813 Pnt 3608 3870 Pnt 2415 3831 Pnt 2870 3878 Pnt 3393 3843 Pnt 2587 3832 Pnt 3264 3785 Pnt 2744 3834 Pnt 2900 3843 Pnt 2290 3797 Pnt 2748 3834 Pnt 3693 3838 Pnt 1931 3816 Pnt 2820 3799 Pnt 3885 3878 Pnt 3472 3852 Pnt 2890 3867 Pnt 3099 3831 Pnt 3054 3806 Pnt 2967 3834 Pnt 2005 3915 Pnt 3141 3834 Pnt 4745 3797 Pnt 3032 3904 Pnt 2655 3801 Pnt 2596 3877 Pnt 2649 3824 Pnt 3537 3797 Pnt 4149 3824 Pnt 3822 3815 Pnt 3025 3819 Pnt 2066 3839 Pnt 4199 3861 Pnt 3370 3783 Pnt 2281 3830 Pnt 2947 3830 Pnt 3109 3884 Pnt 4276 3877 Pnt 3774 3789 Pnt 3094 3798 Pnt 4365 3814 Pnt 2308 3825 Pnt 3337 3844 Pnt 3342 3873 Pnt 4199 3802 Pnt 4098 3828 Pnt 3365 3850 Pnt 4101 3810 Pnt 2987 3814 Pnt 2391 3845 Pnt 2919 3814 Pnt 2183 3923 Pnt 3856 3842 Pnt 4403 3923 Pnt 2870 3934 Pnt 3000 3783 Pnt 3561 3840 Pnt 3198 3843 Pnt 2655 3864 Pnt 1945 3790 Pnt 2511 3838 Pnt 3289 3812 Pnt 3703 3808 Pnt 2972 3818 Pnt 3526 3838 Pnt 2936 3838 Pnt 2813 3822 Pnt 2652 3837 Pnt 2289 3824 Pnt 3058 3835 Pnt 2341 3817 Pnt 4490 3808 Pnt 2178 3876 Pnt 2327 3842 Pnt 2871 3789 Pnt 2432 3766 Pnt 3015 3811 Pnt 2737 3766 Pnt 2128 3870 Pnt 2107 3852 Pnt 2956 3852 Pnt 3159 3805 Pnt 3082 3842 Pnt 2671 3790 Pnt 3180 3842 Pnt 3726 3769 Pnt 2696 3796 Pnt 2769 3833 Pnt 4694 3789 Pnt 3164 3769 Pnt 2816 3900 Pnt 3634 3785 Pnt 2582 3792 Pnt 2630 3900 Pnt 2209 3822 Pnt 2929 3834 Pnt 3094 3813 Pnt 4569 3834 Pnt 3316 3852 Pnt 5098 3823 Pnt 3286 3852 Pnt 2845 3201 Pnt 3854 3790 Pnt 2816 3813 Pnt 3163 3935 Pnt 2782 3821 Pnt 2850 3836 Pnt 2750 3836 Pnt 3474 3866 Pnt 2918 3798 Pnt 3627 3866 Pnt 2847 3824 Pnt 3319 3798 Pnt 2276 3932 Pnt 2881 3799 Pnt 3145 3856 Pnt 3041 3856 Pnt 4081 3784 Pnt 2917 3931 Pnt 2492 3806 Pnt 3370 3823 Pnt 2426 3808 Pnt 2785 3861 Pnt 3176 3812 Pnt 2520 3805 Pnt 4763 3864 Pnt 2550 3807 Pnt 3915 3804 Pnt 3196 3834 Pnt 3450 3786 Pnt 4205 3822 Pnt 2223 3877 Pnt 2201 3835 Pnt 2422 3783 Pnt 2583 3859 Pnt 2912 3792 Pnt 2168 3897 Pnt 3558 3899 Pnt 4140 3792 Pnt 3132 3795 Pnt 2929 3852 Pnt 4011 3791 Pnt 3381 3846 Pnt 2271 3799 Pnt 2999 3798 Pnt 2228 3784 Pnt 2940 3837 Pnt 3180 3798 Pnt 3859 3797 Pnt 2648 3784 Pnt 2081 3826 Pnt 2144 3913 Pnt 3286 3826 Pnt 4360 3818 Pnt 2410 3942 Pnt 3154 3884 Pnt 3018 3819 Pnt 3001 3856 Pnt 2804 3802 Pnt 2865 3802 Pnt 2660 3810 Pnt 2473 3902 Pnt 3459 3833 Pnt 2736 3825 Pnt 2021 3833 Pnt 2787 3850 Pnt 3348 3853 Pnt 1780 3797 Pnt 3310 3850 Pnt 2420 3945 Pnt 2952 3838 Pnt 2706 3827 Pnt 3481 3841 Pnt 2786 3843 Pnt 2741 3829 Pnt 3685 3829 Pnt 2911 3776 Pnt 2701 3831 Pnt 4345 3806 Pnt 1857 3813 Pnt 2919 3807 Pnt 4512 3826 Pnt 2719 3847 Pnt 3763 3813 Pnt 4479 3813 Pnt 3166 3828 Pnt 3510 3809 Pnt 3009 3855 Pnt 2782 3809 Pnt 2844 3831 Pnt 2604 3813 Pnt 2379 3825 Pnt 2801 3831 Pnt 2757 3816 Pnt 2320 3821 Pnt 2987 3792 Pnt 3154 3816 Pnt 2071 3852 Pnt 3282 3804 Pnt 2793 3797 Pnt 2539 3839 Pnt 3373 3848 Pnt 1865 3816 Pnt 3013 3854 Pnt 3427 3821 Pnt 2466 3827 Pnt 3034 3828 Pnt 3739 3838 Pnt 2558 3816 Pnt 3501 3838 Pnt 3603 3816 Pnt 2683 3831 Pnt 3048 3831 Pnt 2305 3817 Pnt 2948 3819 Pnt 4207 3806 Pnt 2254 3867 Pnt 3149 3811 Pnt 2989 3777 Pnt 2812 3766 Pnt 3076 3797 Pnt 2057 3839 Pnt 2007 3841 Pnt 2410 3785 Pnt 2178 3870 Pnt 3799 3797 Pnt 2947 3783 Pnt 2281 3852 Pnt 2946 3786 Pnt 3082 3842 Pnt 3473 3781 Pnt 3221 3878 Pnt 5094 3808 Pnt 3382 3884 Pnt 3983 3842 Pnt 2964 3878 Pnt 2370 3796 Pnt 2675 3798 Pnt 2868 3819 Pnt 2812 3789 Pnt 3281 3821 Pnt 2310 3789 Pnt 2440 3900 Pnt 3260 3794 Pnt 3289 3798 Pnt 3195 3900 Pnt 2976 3792 Pnt 2922 3799 Pnt 3527 3792 Pnt 2742 3873 Pnt 2989 3832 Pnt 3392 3807 Pnt 3343 3832 Pnt 2936 3786 Pnt 3060 3877 Pnt 3392 3866 Pnt 4371 3798 Pnt 3692 3814 Pnt 4918 3816 Pnt 2772 3813 Pnt 3053 3841 Pnt 2542 3844 Pnt 3109 3935 Pnt 2635 3835 Pnt 2415 3841 Pnt 2791 3864 Pnt 2833 3836 Pnt 3231 3792 Pnt 2338 3845 Pnt 2902 3845 Pnt 3182 3861 Pnt 2288 3899 Pnt 2831 3850 Pnt 3319 3868 Pnt 4879 3821 Pnt 2687 3931 Pnt 3286 3930 Pnt 3089 3799 Pnt 2926 3811 Pnt 2138 3822 Pnt 3663 3795 Pnt 3815 3797 Pnt 3259 3805 Pnt 2871 3796 Pnt 3496 3796 Pnt 2959 3813 Pnt 2715 3827 Pnt 4762 3823 Pnt 2814 3777 Pnt 3045 3834 Pnt 3362 3237 Pnt 2480 3824 Pnt 2909 3849 Pnt 2230 3932 Pnt 2755 3833 Pnt 3450 3829 Pnt 4188 3838 Pnt 2681 3850 Pnt 3172 3856 Pnt 2754 3834 Pnt 2862 3834 Pnt 2483 3806 Pnt 2256 3831 Pnt 2682 3843 Pnt 2826 3843 Pnt 2545 3813 Pnt 2387 3842 Pnt 3818 3832 Pnt 4417 3777 Pnt 2487 3805 Pnt 2953 3831 Pnt 4600 3802 Pnt 3456 3827 Pnt 2904 3807 Pnt 2386 3812 Pnt 1857 3813 Pnt 3698 3801 Pnt 4105 3164 Pnt 3799 3814 Pnt 2176 3847 Pnt 3657 3853 Pnt 2623 3784 Pnt 3010 3831 Pnt 2410 3821 Pnt 2680 3853 Pnt 3570 3804 Pnt 3749 3817 Pnt 3961 3785 Pnt 2635 3823 Pnt 2331 3923 Pnt 3426 3805 Pnt 3111 3806 Pnt 3241 3824 Pnt 2795 3805 Pnt 3176 3838 Pnt 3327 3806 Pnt 2888 3809 Pnt 2646 3826 Pnt 2825 3813 Pnt 2931 3811 Pnt 2663 3904 Pnt 4036 3829 Pnt 2939 3831 Pnt 3319 3904 Pnt 3446 3853 Pnt 4509 3826 Pnt 4661 3783 Pnt 2743 3801 Pnt 3112 3843 Pnt 3057 3802 Pnt 2517 3824 Pnt 3077 3826 Pnt 3688 3824 Pnt 3646 3792 Pnt 2669 3832 Pnt 2359 3867 Pnt 3577 3781 Pnt 2917 3807 Pnt 2853 3816 Pnt 2734 3781 Pnt 2426 3830 Pnt 2356 3843 Pnt 4007 3843 Pnt 2683 3766 Pnt 2560 3795 Pnt 2666 3797 Pnt 2072 3781 Pnt 2895 3797 Pnt 4147 3805 Pnt 4068 3765 Pnt 2635 3839 Pnt 2146 3807 Pnt 3737 3839 Pnt 1931 3841 Pnt 3655 3800 Pnt 3030 3801 Pnt 3184 3800 Pnt 2669 3840 Pnt 2609 3920 Pnt 2329 3785 Pnt 3066 3842 Pnt 3230 3844 Pnt 3619 3785 Pnt 2278 3870 Pnt 2760 3773 Pnt 3900 3777 Pnt 2597 3802 Pnt 2310 3819 Pnt 3489 3871 Pnt 2265 3852 Pnt 2238 3789 Pnt 2817 3850 Pnt 2845 3796 Pnt 2093 3801 Pnt 2769 3778 Pnt 3485 3808 Pnt 2582 3792 Pnt 2963 3807 Pnt 2494 3845 Pnt 5198 3813 Pnt 2912 3832 Pnt 3596 3332 Pnt 2197 3877 Pnt 3770 3832 Pnt 2841 3814 Pnt 3701 3825 Pnt 3225 3795 Pnt 3529 3841 Pnt 3170 3788 Pnt 2013 3868 Pnt 4046 3834 Pnt 2677 3859 Pnt 2906 3832 Pnt 2439 3793 Pnt 2144 3792 Pnt 2076 3842 Pnt 2459 3845 Pnt 1791 3778 Pnt 2553 3899 Pnt 2736 3899 Pnt 1968 3930 Pnt 3453 3930 Pnt 2749 3822 Pnt 2476 3822 Pnt 2173 3822 Pnt 4074 3831 Pnt 3067 3821 Pnt 2946 3805 Pnt 1890 3790 Pnt 3020 3838 Pnt 3436 3838 Pnt 2789 3808 Pnt 4027 3847 Pnt 2623 3847 Pnt 2640 3829 Pnt 4567 3788 Pnt 2457 3852 Pnt 2086 3799 Pnt 3444 3794 Pnt 2808 3798 Pnt 4747 3805 Pnt 3641 3808 Pnt 3213 3836 Pnt 3168 3846 Pnt 2631 3912 Pnt 4076 3808 Pnt 2462 3839 Pnt 2928 3834 Pnt 2898 3942 Pnt 4930 3860 Pnt 3667 3783 Pnt 2780 3843 Pnt 2764 3813 Pnt 3096 3871 Pnt 4028 3884 Pnt 3026 3869 Pnt 3376 3869 Pnt 3638 3816 Pnt 2842 3869 Pnt 2793 3833 Pnt 2405 3808 Pnt 2603 3860 Pnt 3768 3786 Pnt 2671 3837 Pnt 3226 3837 Pnt 3450 3816 Pnt 2317 3945 Pnt 3699 3831 Pnt 4512 3831 Pnt 2408 3826 Pnt 2269 3854 Pnt 4439 3779 Pnt 3059 3833 Pnt 2404 3807 Pnt 2208 3796 Pnt 2841 3829 Pnt 2959 3790 Pnt 2957 3884 Pnt 2773 3864 Pnt 2211 3799 Pnt 3930 3830 Pnt 2980 3790 Pnt 3368 3852 Pnt 4888 3823 Pnt 2520 3790 Pnt 1912 3795 Pnt 3665 3813 Pnt 4470 3864 Pnt 3067 3805 Pnt 2316 3797 Pnt 3474 3795 Pnt 3122 3790 Pnt 2850 3781 Pnt 2736 3806 Pnt 2994 3873 Pnt 2190 3807 Pnt 3156 3839 Pnt 1888 3864 Pnt 3908 3805 Pnt 2802 3840 Pnt 2984 3786 Pnt 3726 3839 Pnt 2177 3920 Pnt 2778 3807 Pnt 4160 3783 Pnt 2377 3785 Pnt 3263 3858 Pnt 2406 3814 Pnt 2785 3827 Pnt 2166 3847 Pnt 3070 3844 Pnt 2450 3812 Pnt 1771 3784 Pnt 3247 3813 Pnt 4119 3795 Pnt 2560 3819 Pnt 2454 3821 Pnt 2414 3812 Pnt 2553 3801 Pnt 3091 3823 Pnt 2785 3935 Pnt 3250 3807 Pnt 4512 3797 Pnt 1859 3877 Pnt 3708 3807 Pnt 3060 3802 Pnt 2855 3811 Pnt 3596 3825 Pnt 3593 3811 Pnt 4340 3785 Pnt 3084 3824 Pnt 4070 3825 Pnt 4653 3782 Pnt 4063 3080 Pnt 3560 3862 Pnt 2476 3784 Pnt 3182 3835 Pnt 3823 3824 Pnt 3709 3832 Pnt 2783 3868 Pnt 2235 3867 Pnt 4357 3835 Pnt 2826 3832 Pnt 3063 3806 Pnt 3400 3811 Pnt 2463 3781 Pnt 3082 3841 Pnt 2592 3795 Pnt 3790 3833 Pnt 2182 3899 Pnt 2804 3843 Pnt 3308 3811 Pnt 2879 3816 Pnt 1798 3778 Pnt 3061 3813 Pnt 3712 3843 Pnt 3217 3899 Pnt 2671 3796 Pnt 3135 3813 Pnt 2360 3800 Pnt 2392 3838 Pnt 2943 3849 Pnt 2513 3870 Pnt 3660 3797 Pnt 2855 3837 Pnt 3228 3871 Pnt 3700 3796 Pnt 2921 3813 Pnt 3390 3848 Pnt 2692 3831 Pnt 2821 3831 Pnt 3174 3808 Pnt 3287 3827 Pnt 3015 3837 Pnt 2615 3852 Pnt 2609 3817 Pnt 3456 3837 Pnt 2113 3895 Pnt 3422 3830 Pnt 2620 3800 Pnt 2543 3871 Pnt 2322 3934 Pnt 2742 3816 Pnt 2080 3872 Pnt 2816 3850 Pnt 3803 3823 Pnt 2007 3821 Pnt 3480 3841 Pnt 2130 3778 Pnt 3631 3836 Pnt 2925 3856 Pnt 2528 3842 Pnt 3061 3835 Pnt 2797 3853 Pnt 4549 3833 Pnt 3455 3853 Pnt 4565 3872 Pnt 3753 3842 Pnt 4485 3807 Pnt 3776 3803 Pnt 2400 3924 Pnt 3574 3847 Pnt 3583 3792 Pnt 4653 3816 Pnt 2428 3807 Pnt 2934 3790 Pnt 3205 3213 Pnt 2097 3930 Pnt 2882 3831 Pnt 2840 3935 Pnt 2597 3822 Pnt 2364 3830 Pnt 2512 3822 Pnt 3845 3854 Pnt 3269 3794 Pnt 3760 3806 Pnt 2981 3826 Pnt 3115 3818 Pnt 3604 3794 Pnt 3341 3831 Pnt 3511 3801 Pnt 2970 3794 Pnt 3130 3801 Pnt 3696 3828 Pnt 2643 3842 Pnt 2581 3807 Pnt 2542 3829 Pnt 2099 3799 Pnt 3346 3777 Pnt 3813 3837 Pnt 2462 3818 Pnt 2297 3852 Pnt 2799 3867 Pnt 2740 3796 Pnt 3313 3808 Pnt 2728 3793 Pnt 2319 3839 Pnt 4276 3796 Pnt 2876 3836 Pnt 3586 3808 Pnt 2869 3852 Pnt 2635 3794 Pnt 4548 3826 Pnt 3393 3849 Pnt 4618 3831 Pnt 2615 3812 Pnt 3358 3846 Pnt 3155 3805 Pnt 2690 3942 Pnt 2674 3803 Pnt 2529 3912 Pnt 2567 3904 Pnt 2142 3843 Pnt 2653 3850 Pnt 3560 3804 Pnt 2958 3839 Pnt 2543 3884 Pnt 2694 3804 Pnt 2481 3783 Pnt 3286 3834 Pnt 4668 3839 Pnt 3420 3813 Pnt 2731 3900 Pnt 3394 3813 Pnt 3805 3843 Pnt 3805 3817 Pnt 2277 3816 Pnt 2964 3796 Pnt 2451 3812 Pnt 4297 3884 Pnt 2694 3869 Pnt 2658 3821 Pnt 3535 3821 Pnt 2424 3808 Pnt 2384 3801 Pnt 3235 3819 Pnt 2833 3808 Pnt 2794 3834 Pnt 2846 3860 Pnt 2835 3860 Pnt 3130 3935 Pnt 2473 3786 Pnt 2957 3823 Pnt 1855 3868 Pnt 2460 3824 Pnt 3981 3826 Pnt 2969 3863 Pnt 2324 3830 Pnt 3286 3790 Pnt 3625 3859 Pnt 4151 3832 Pnt 3350 3799 Pnt 3465 3831 Pnt 3790 3884 Pnt 2926 3811 Pnt 4154 3884 Pnt 3827 3797 Pnt 4291 3816 Pnt 3272 3824 Pnt 3434 3834 Pnt 3303 3834 Pnt 2458 3868 Pnt 2660 3837 Pnt 2763 3799 Pnt 3883 3862 Pnt 2454 3841 Pnt 2306 3808 Pnt 2890 3811 Pnt 2468 3782 Pnt 3624 3862 Pnt 2447 3781 Pnt 3417 3791 Pnt 3169 3783 Pnt 2719 3795 Pnt 2352 3832 Pnt 2669 3837 Pnt 2432 3899 Pnt 1756 3867 Pnt 4525 3782 Pnt 2699 3833 Pnt 2604 3843 Pnt 2161 3838 Pnt 3826 3843 Pnt 3224 3871 Pnt 2592 3871 Pnt 2759 3831 Pnt 4218 3852 Pnt 3504 3858 Pnt 2280 3865 Pnt 4245 3842 Pnt 3881 3869 Pnt 2668 3823 Pnt 2286 3945 Pnt 3002 3827 Pnt 3310 3800 Pnt 3703 3827 Pnt 1954 3821 Pnt 3670 3830 Pnt 2414 3808 Pnt 2623 3778 Pnt 4542 3868 Pnt 3966 3792 Pnt 3336 3855 Pnt 3421 3855 Pnt 3910 3834 Pnt 2639 3827 Pnt 2802 3935 Pnt 4084 3829 Pnt 2712 3924 Pnt 3263 3807 Pnt 3067 3924 Pnt 2392 3790 Pnt 3490 3829 Pnt 2604 3852 Pnt 3577 3822 Pnt 3727 3795 Pnt 4980 3841 Pnt 4651 3863 Pnt 4250 3814 Pnt 2751 3818 Pnt 3226 3796 Pnt 2467 3853 Pnt 2840 3801 Pnt 3978 3797 Pnt 2555 3839 Pnt 3104 3864 Pnt 2438 3794 Pnt 2831 3816 Pnt 3988 3808 Pnt 3701 3801 Pnt 2066 3942 Pnt 2303 3799 Pnt 3015 3803 Pnt 2849 3777 Pnt 3391 3839 Pnt 2098 3843 Pnt 1994 3800 Pnt 4049 3777 Pnt 2490 3850 Pnt 3137 3824 Pnt 2400 3870 Pnt 4259 3846 Pnt 2625 3833 Pnt 2616 3833 Pnt 3146 3870 Pnt 3038 3797 Pnt 3071 3820 Pnt 3161 3808 Pnt 3557 3783 Pnt 3200 3849 Pnt 2561 3895 Pnt 3556 3820 Pnt 3113 3795 Pnt 3251 3843 Pnt 3044 3833 Pnt 2350 3819 Pnt 3378 3795 Pnt 2740 3806 Pnt 3204 3847 Pnt 4827 3807 Pnt 1931 3930 Pnt 3293 3799 Pnt 2923 3847 Pnt 2687 3859 Pnt 3243 3800 Pnt 2936 3817 Pnt 2822 3854 Pnt 2784 3854 Pnt 3223 3853 Pnt 3934 3884 Pnt 3742 3853 Pnt 2480 3912 Pnt 2652 3843 Pnt 3639 3838 Pnt 2871 3839 Pnt 2682 3839 Pnt 2264 3788 Pnt 2553 3812 Pnt 2213 3934 Pnt 2655 3807 Pnt 2186 3869 Pnt 2946 3869 Pnt 2402 3821 Pnt 2855 3811 Pnt 2021 3841 Pnt 4840 3819 Pnt 2260 3843 Pnt 4388 3806 Pnt 2472 3807 Pnt 4831 3815 Pnt 3344 3869 Pnt 2236 3832 Pnt 4078 3807 Pnt 2976 3816 Pnt 2817 3837 Pnt 2830 3808 Pnt 2651 3829 Pnt 2928 3837 Pnt 1736 3867 Pnt 2777 3845 Pnt 2025 3899 Pnt 2726 3845 Pnt 2520 3860 Pnt 4717 3811 Pnt 2324 3842 Pnt 3925 3183 Pnt 3051 3845 Pnt 2886 3879 Pnt 3059 3792 Pnt 2959 3829 Pnt 3853 3866 Pnt 2680 3792 Pnt 2257 3855 Pnt 4099 3798 Pnt 3167 3813 Pnt 2825 3884 Pnt 2870 3803 Pnt 3027 3798 Pnt 3339 3824 Pnt 2641 3873 Pnt 4109 3825 Pnt 2736 3832 Pnt 4066 3873 Pnt 3763 3818 Pnt 2752 3863 Pnt 2737 3799 Pnt 3975 3832 Pnt 2671 3799 Pnt 2931 3842 Pnt 2291 3942 Pnt 3211 3816 Pnt 3745 3842 Pnt 4622 3815 Pnt 4644 3784 Pnt 4865 3820 Pnt 2906 3846 Pnt 4983 3832 Pnt 2288 3808 Pnt 2706 3164 Pnt 2927 3148 Pnt 2957 3833 Pnt 3583 3794 Pnt 3505 3802 Pnt 3022 3820 Pnt 3618 3831 Pnt 2195 3913 Pnt 2155 3807 Pnt 3983 3811 Pnt 2981 3792 Pnt 3721 3849 Pnt 2648 3849 Pnt 3925 3837 Pnt 4175 3833 Pnt 2991 3858 Pnt 2234 3899 Pnt 3067 3858 Pnt 3278 3824 Pnt 2386 3814 Pnt 4311 3328 Pnt 2446 3765 Pnt 4280 3824 Pnt 2703 3827 Pnt 2636 3847 Pnt 3072 3765 Pnt 2866 3865 Pnt 3573 3824 Pnt 3709 3813 Pnt 3710 3864 Pnt 2809 3805 Pnt 3196 3866 Pnt 2267 3823 Pnt 2121 3945 Pnt 2345 3827 Pnt 3714 3813 Pnt 2865 3808 Pnt 2572 3871 Pnt 2668 3798 Pnt 4459 3808 Pnt 3100 3834 Pnt 2838 3935 Pnt 2341 3924 Pnt 3103 3807 Pnt 4444 3795 Pnt 2100 3790 Pnt 2749 3802 Pnt 2728 3798 Pnt 2460 3824 Pnt 2234 3852 Pnt 3211 3835 Pnt 3097 3847 Pnt 4812 3849 Pnt 3058 3796 Pnt 3108 3833 Pnt 4689 3799 Pnt 4569 3784 Pnt 4351 3815 Pnt 2734 3840 Pnt 3424 3805 Pnt 2707 3837 Pnt 2455 3930 Pnt 3077 3789 Pnt 2462 3930 Pnt 2670 3836 Pnt 2609 3849 Pnt 2656 3836 Pnt 3391 3783 Pnt 2282 3859 Pnt 2102 3816 Pnt 2201 3839 Pnt 3686 3849 Pnt 4491 3781 Pnt 3135 3789 Pnt 2728 3843 Pnt 3420 3164 Pnt 2422 3904 Pnt 4025 3835 Pnt 2887 3853 Pnt 3068 3847 Pnt 3526 3817 Pnt 3441 3904 Pnt 2258 3884 Pnt 2065 3839 Pnt 3569 3839 Pnt 3898 3884 Pnt 2594 3827 Pnt 2521 3812 Pnt 3554 3840 Pnt 2828 3808 Pnt 2274 3934 Pnt 3136 3803 Pnt 2817 3777 Pnt 3746 3772 Pnt 3443 3839 Pnt 2688 3803 Pnt 3955 3819 Pnt 2287 3853 Pnt 2665 3808 Pnt 2389 3811 Pnt 2303 3850 Pnt 2757 3854 Pnt 2480 3870 Pnt 2744 3904 Pnt 3981 3869 Pnt 2388 3783 Pnt 3074 3869 Pnt 2478 3912 Pnt 3090 3816 Pnt 2376 3838 Pnt 3034 3820 Pnt 2666 3837 Pnt 2280 3815 Pnt 2973 3895 Pnt 2781 3845 Pnt 2165 3899 Pnt 4334 3812 Pnt 3322 3784 Pnt 3268 3900 Pnt 2771 3821 Pnt 3058 3792 Pnt 4538 3796 Pnt 2144 3843 Pnt 3312 3795 Pnt 2213 3795 Pnt 3119 3935 Pnt 2262 3824 Pnt 3698 3823 Pnt 2827 3864 Pnt 2881 3806 Pnt 2476 3813 Pnt 2415 3828 Pnt 2538 3806 Pnt 3599 3790 Pnt 2714 3833 Pnt 3369 3829 Pnt 2165 3808 Pnt 3279 3799 Pnt 2178 3779 Pnt 2433 3779 Pnt 1771 3867 Pnt 2600 3826 Pnt 2363 3829 Pnt 3784 3790 Pnt 3851 3830 Pnt 2600 3829 Pnt 2322 3868 Pnt 2907 3812 Pnt 2424 3845 Pnt 2609 3785 Pnt 2556 3837 Pnt 2165 3842 Pnt 3450 3863 Pnt 2805 3782 Pnt 1932 3942 Pnt 2952 3837 Pnt 3000 3879 Pnt 2400 3862 Pnt 2557 3873 Pnt 2926 3862 Pnt 2844 3820 Pnt 2629 3808 Pnt 3843 3808 Pnt 3125 3802 Pnt 2965 3792 Pnt 2754 3843 Pnt 2489 3835 Pnt 2795 3814 Pnt 2185 3824 Pnt 4464 3824 Pnt 2490 3844 Pnt 2546 3765 Pnt 4810 3820 Pnt 4479 3807 Pnt 2673 3847 Pnt 3570 3259 Pnt 4228 3802 Pnt 3002 3823 Pnt 2522 3863 Pnt 2225 3872 Pnt 3074 3845 Pnt 2754 3799 Pnt 3457 3796 Pnt 3457 3832 Pnt 3449 3831 Pnt 3531 3835 Pnt 2474 3858 Pnt 2501 3870 Pnt 3523 3860 Pnt 3425 3837 Pnt 2943 3805 Pnt 2277 3836 Pnt 2694 3930 Pnt 3157 3836 Pnt 4387 3833 Pnt 2784 3797 Pnt 2918 3866 Pnt 3080 3866 Pnt 4434 3860 Pnt 4646 3789 Pnt 3894 3864 Pnt 2408 3804 Pnt 3336 3853 Pnt 3190 3848 Pnt 4793 3817 Pnt 2821 3807 Pnt 4880 3821 Pnt 3698 3307 Pnt 2750 3934 Pnt 2093 3842 Pnt 3017 3792 Pnt 4054 3330 Pnt 4488 3841 Pnt 3163 3831 Pnt 3426 3803 Pnt 3862 3840 Pnt 2829 3869 Pnt 2942 3840 Pnt 3525 3854 Pnt 3940 3820 Pnt 4568 3833 Pnt 2624 3900 Pnt 2495 3784 Pnt 3798 3784 Pnt 2499 3792 Pnt 4126 3855 Pnt 2517 3872 Pnt 3460 3801 Pnt 3643 3829 Pnt 4042 3803 Pnt 3341 3833 Pnt 2867 3847 Pnt 2120 3839 Pnt 2591 3827 Pnt 3144 3845 Pnt 4462 3802 Pnt 2130 3812 Pnt 3004 3863 Pnt 2284 3872 Pnt 3464 3867 Pnt 3521 3857 Pnt 4117 3840 Pnt 4423 3864 Pnt 2536 3843 Pnt 3684 3821 Pnt 2649 3904 Pnt 3403 3803 Pnt 3947 3845 Pnt 4738 3860 Pnt 3302 3860 Pnt 4392 3804 Pnt 3626 3835 Pnt 3748 3839 Pnt 4675 3865 Pnt 2413 3819 Pnt 4325 3839 Pnt 3668 3819 Pnt 3800 3776 Pnt 3410 3858 Pnt 2431 3930 Pnt 2589 3843 Pnt 2736 3854 Pnt 3020 3805 Pnt 2823 3935 Pnt 2834 3870 Pnt 3390 3805 Pnt 2575 3904 Pnt 2388 3797 Pnt 3196 3828 Pnt 3409 3828 Pnt 2827 3789 Pnt 2495 3912 Pnt 2895 3881 Pnt 3358 3786 Pnt 2477 3829 Pnt 3076 3816 Pnt 3582 3789 Pnt 2384 3779 Pnt 2891 3864 Pnt 2609 3838 Pnt 3171 3864 Pnt 2407 3825 Pnt 2409 3804 Pnt 3055 3820 Pnt 4481 3837 Pnt 2225 3848 Pnt 3275 3805 Pnt 2739 3812 Pnt 2468 3831 Pnt 2266 3901 Pnt 3801 3820 Pnt 4464 3862 Pnt 3278 3833 Pnt 2677 3901 Pnt 2915 3837 Pnt 2574 3811 Pnt 3359 3790 Pnt 3410 3879 Pnt 3682 3845 Pnt 2877 3835 Pnt 2707 3833 Pnt 4743 3833 Pnt 2858 3824 Pnt 3770 3850 Pnt 2844 3792 Pnt 2254 3824 Pnt 3337 3858 Pnt 2641 3823 Pnt 2409 3899 Pnt 3313 3809 Pnt 3055 3803 Pnt 3772 3795 Pnt 3278 3827 Pnt 2586 3835 Pnt 3914 3801 Pnt 2861 3818 Pnt 2470 3830 Pnt 4561 3848 Pnt 2995 3830 Pnt 4935 3820 Pnt 2792 3805 Pnt 3374 3827 Pnt 2792 3866 Pnt 2813 3845 Pnt 2626 3845 Pnt 1987 3832 Pnt 4639 3812 Pnt 2083 3945 Pnt 2264 3827 Pnt 3801 3795 Pnt 3373 3819 Pnt 2532 3836 Pnt 3219 3823 Pnt 3549 3799 Pnt 3034 3813 Pnt 2910 3808 Pnt 2586 3864 Pnt 2522 3871 Pnt 2917 3871 Pnt 4712 3807 Pnt 3186 3820 Pnt 3420 3186 Pnt 2364 3934 Pnt 2300 3924 Pnt 2452 3807 Pnt 3103 3807 Pnt 3130 3791 Pnt 3333 3850 Pnt 2653 3826 Pnt 4546 3862 Pnt 4082 3823 Pnt 2006 3853 Pnt 2807 3815 Pnt 3636 3823 Pnt 2771 3847 Pnt 2313 3884 Pnt 2974 3796 Pnt 3304 3796 Pnt 4506 3827 Pnt 4538 3862 Pnt 4152 3858 Pnt 3151 3863 Pnt 3830 3838 Pnt 2654 3799 Pnt 3922 3852 Pnt 2918 3837 Pnt 4109 3833 Pnt 3661 3833 Pnt 2502 3806 Pnt 3064 3849 Pnt 4106 3862 Pnt 3467 3803 Pnt 3598 3817 Pnt 3489 3796 Pnt 3727 3867 Pnt 4097 3806 Pnt 2718 3849 Pnt 3020 3831 Pnt 2082 3804 Pnt 4281 3869 Pnt 2785 3821 Pnt 2238 3904 Pnt 2692 3810 Pnt 3767 3798 Pnt 3711 3827 Pnt 4741 3810 Pnt 3462 3192 Pnt 2578 3823 Pnt 3900 3808 Pnt 3192 3832 Pnt 2439 3788 Pnt 3019 3804 Pnt 2340 3819 Pnt 2486 3829 Pnt 2404 3835 Pnt 2147 3870 Pnt 2219 3837 Pnt 2955 3798 Pnt 2559 3797 Pnt 2754 3860 Pnt 3184 3828 Pnt 3773 3839 Pnt 3418 3828 Pnt 2425 3854 Pnt 3208 3864 Pnt 2786 3785 Pnt 4823 3803 Pnt 2874 3796 Pnt 2567 3943 Pnt 3261 3805 Pnt 2718 3930 Pnt 2551 3935 Pnt 2613 3935 Pnt 2513 3901 Pnt 3610 3837 Pnt 2419 3811 Pnt 3329 3901 Pnt 2697 3837 Pnt 2275 3798 Pnt 2221 3779 Pnt 2112 3831 Pnt 2879 3850 Pnt 2780 3838 Pnt 3041 3825 Pnt 3224 3824 Pnt 3275 3818 Pnt 4546 3817 Pnt 2747 3830 Pnt 2980 3830 Pnt 2845 3820 Pnt 3058 3805 Pnt 2678 3845 Pnt 3565 3845 Pnt 2810 3805 Pnt 1735 3913 Pnt 2581 3864 Pnt 3133 3841 Pnt 4147 3840 Pnt 2599 3823 Pnt 2089 3823 Pnt 4831 3815 Pnt 2399 3895 Pnt 2756 3846 Pnt 3192 3809 Pnt 2700 3803 Pnt 2988 3827 Pnt 3293 3818 Pnt 2825 3791 Pnt 4603 3791 Pnt 5097 3845 Pnt 2818 3796 Pnt 4410 3865 Pnt 3479 3881 Pnt 2681 3796 Pnt 3193 3849 Pnt 4913 3867 Pnt 3114 3827 Pnt 4158 3860 Pnt 4171 3819 Pnt 2492 3900 Pnt 2365 3784 Pnt 3208 3815 Pnt 4066 3858 Pnt 2574 3808 Pnt 3655 3805 Pnt 2365 3811 Pnt 2856 3852 Pnt 2682 3837 Pnt 4050 3823 Pnt 3015 3812 Pnt 4481 3776 Pnt 2490 3832 Pnt 2444 3792 Pnt 2042 3810 Pnt 3094 3826 Pnt 4090 3801 Pnt 4331 3825 Pnt 4963 3827 Pnt 3398 3799 Pnt 3218 3864 Pnt 2868 3789 Pnt 2491 3869 Pnt 2930 3808 Pnt 2684 3796 Pnt 3192 3865 Pnt 2526 3844 Pnt 2107 3945 Pnt 2230 3930 Pnt 3554 3789 Pnt 2230 3848 Pnt 2215 3819 Pnt 2207 3935 Pnt 2945 3829 Pnt 2353 3778 Pnt 3595 3823 Pnt 3888 3826 Pnt 2528 3828 Pnt 3622 3854 Pnt 2791 3805 Pnt 2787 3812 Pnt 2489 3943 Pnt 2035 3901 Pnt 3617 3829 Pnt 4067 3943 Pnt 3282 3811 Pnt 3954 3854 Pnt 3144 3836 Pnt 4095 3809 Pnt 3337 3840 Pnt 3870 3840 Pnt 4441 3819 Pnt 3168 3813 Pnt 2573 3798 Pnt 2812 3833 Pnt 3392 3806 Pnt 2832 3862 Pnt 2135 3839 Pnt 2871 3862 Pnt 2475 3871 Pnt 3660 3860 Pnt 4251 3837 Pnt 3352 3788 Pnt 3573 3879 Pnt 2741 3866 Pnt 2019 3871 Pnt 4118 3841 Pnt 2879 3844 Pnt 3218 3860 Pnt 2742 3818 Pnt 2474 3934 Pnt 3047 3818 Pnt 2626 3827 Pnt 3060 3856 Pnt 1961 3934 Pnt 2118 3808 Pnt 2383 3820 Pnt 3710 3860 Pnt 2012 3842 Pnt 2873 3924 Pnt 3304 3860 Pnt 3633 3856 Pnt 2569 3855 Pnt 2904 3794 Pnt 2514 3807 Pnt 3215 3805 Pnt 3300 3792 Pnt 3574 3813 Pnt 2461 3845 Pnt 2653 3789 Pnt 3552 3861 Pnt 3063 3861 Pnt 3705 3792 Pnt 3961 3830 Pnt 2600 3872 Pnt 3049 3813 Pnt 3631 3813 Pnt 2348 3872 Pnt 2891 3864 Pnt 3821 3812 Pnt 4491 3875 Pnt 3092 3815 Pnt 4153 3872 Pnt 4160 3815 Pnt 4108 3799 Pnt 4307 3874 Pnt 4503 3836 Pnt 2943 3850 Pnt 2259 3803 Pnt 2891 3863 Pnt 2016 3826 Pnt 4871 3868 Pnt 1944 3842 Pnt 4430 3845 Pnt 2252 3858 Pnt 3280 3823 Pnt 2647 3850 Pnt 4768 3869 Pnt 4229 3871 Pnt 3229 3846 Pnt 3533 3854 Pnt 2868 3904 Pnt 3387 3843 Pnt 2551 3912 Pnt 2944 3823 Pnt 4574 3865 Pnt 3188 3823 Pnt 4116 3855 Pnt 4292 3842 Pnt 2971 3817 Pnt 3454 3884 Pnt 4700 3863 Pnt 2799 3849 Pnt 3627 3792 Pnt 3577 3855 Pnt 2712 3867 Pnt 3506 3804 Pnt 4249 3804 Pnt 2105 3804 Pnt 2464 3835 Pnt 2244 3821 Pnt 4665 3873 Pnt 2667 3821 Pnt 2698 3904 Pnt 3182 3810 Pnt 3684 3810 Pnt 4734 3808 Pnt 3405 3823 Pnt 3027 3803 Pnt 2288 3802 Pnt 4473 3812 Pnt 2398 3931 Pnt 2454 3835 Pnt 3355 3842 Pnt 3598 3828 Pnt 3133 3846 Pnt 4676 3842 Pnt 3261 3846 Pnt 3035 3943 Pnt 2522 3829 Pnt 2328 3819 Pnt 2272 3835 Pnt 3041 3862 Pnt 3013 3874 Pnt 2514 3871 Pnt 2141 3837 Pnt 3993 3874 Pnt 4438 3834 Pnt 2675 3820 Pnt 3000 3788 Pnt 2771 3866 Pnt 2418 3808 Pnt 2789 3844 Pnt 2213 3797 Pnt 2272 3809 Pnt 2981 3934 Pnt 2418 3860 Pnt 2521 3935 Pnt 2767 3809 Pnt 2971 3855 Pnt 3747 3809 Pnt 3930 3855 Pnt 3423 3804 Pnt 2529 3825 Pnt 2687 3872 Pnt 3006 3838 Pnt 2744 3864 Pnt 3481 3872 Pnt 2874 3830 Pnt 4566 3839 Pnt 3313 3805 Pnt 2767 3808 Pnt 4969 3832 Pnt 5034 3824 Pnt 3333 3802 Pnt 2923 3846 Pnt 2612 3789 Pnt 2513 3817 Pnt 3769 3789 Pnt 4165 3327 Pnt 3288 3803 Pnt 2634 3854 Pnt 3106 3861 Pnt 2514 3904 Pnt 3243 3791 Pnt 4780 3820 Pnt 3127 3854 Pnt 2538 3790 Pnt 2677 3843 Pnt 2587 3912 Pnt 3114 3790 Pnt 3318 3814 Pnt 3036 3789 Pnt 2981 3823 Pnt 3034 3860 Pnt 2553 3881 Pnt 4524 3838 Pnt 3660 3881 Pnt 4287 3262 Pnt 3456 3802 Pnt 3033 3840 Pnt 3682 3827 Pnt 2619 3805 Pnt 3412 3821 Pnt 3462 3855 Pnt 4244 3820 Pnt 4335 3823 Pnt 3034 3880 Pnt 3935 3813 Pnt 2204 3804 Pnt 3661 3871 Pnt 4214 3865 Pnt 3143 3835 Pnt 1756 3913 Pnt 3444 3915 Pnt 4272 3865 Pnt 3857 3846 Pnt 4273 3838 Pnt 3233 3869 Pnt 2467 3821 Pnt 2739 3842 Pnt 3336 3828 Pnt 2700 3841 Pnt 3225 3833 Pnt 2495 3841 Pnt 2741 3830 Pnt 2691 3842 Pnt 4499 3837 Pnt 2681 3895 Pnt 3222 3810 Pnt 3979 3830 Pnt 4112 3843 Pnt 3358 3834 Pnt 2827 3935 Pnt 3059 3809 Pnt 3449 3802 Pnt 4134 3849 Pnt 3649 3845 Pnt 1817 3837 Pnt 2454 3854 Pnt 5189 3859 Pnt 3012 3857 Pnt 2231 3803 Pnt 2317 3829 Pnt 2311 3778 Pnt 2513 3846 Pnt 2953 3815 Pnt 2934 3793 Pnt 3489 3829 Pnt 2818 3850 Pnt 2911 3840 Pnt 2818 3822 Pnt 2568 3829 Pnt 3660 3862 Pnt 4146 3807 Pnt 2927 3828 Pnt 3829 3849 Pnt 2321 3845 Pnt 2752 3862 Pnt 2460 3805 Pnt 3174 3832 Pnt 3121 3887 Pnt 2795 3943 Pnt 3870 3832 Pnt 2926 3871 Pnt 3100 3943 Pnt 2754 3812 Pnt 3472 3849 Pnt 2872 3788 Pnt 3188 3812 Pnt 2951 3900 Pnt 3223 3943 Pnt 2427 3837 Pnt 3900 3809 Pnt 2836 3836 Pnt 2738 3820 Pnt 3698 3900 Pnt 3536 3812 Pnt 3275 3841 Pnt 2344 3840 Pnt 2657 3851 Pnt 2918 3825 Pnt 3167 3837 Pnt 3558 3786 Pnt 3292 3820 Pnt 2627 3809 Pnt 2735 3833 Pnt 2644 3806 Pnt 2547 3841 Pnt 2602 3833 Pnt 3019 3830 Pnt 4314 3829 Pnt 2725 3837 Pnt 4499 3844 Pnt 2830 3841 Pnt 2896 3872 Pnt 3859 3829 Pnt 3748 3841 Pnt 2971 3820 Pnt 2644 3808 Pnt 3196 3809 Pnt 2556 3850 Pnt 2171 3861 Pnt 2763 3818 Pnt 2832 3825 Pnt 2656 3829 Pnt 4228 3808 Pnt 3886 3857 Pnt 2956 3829 Pnt 2696 3820 Pnt 2806 3832 Pnt 4468 3825 Pnt 2288 3924 Pnt 2721 3836 Pnt 3288 3836 Pnt 3293 3794 Pnt 4188 3818 Pnt 2639 3789 Pnt 3085 3804 Pnt 3844 3794 Pnt 2839 3813 Pnt 2518 3875 Pnt 2931 3827 Pnt 4202 3826 Pnt 4042 3804 Pnt 3027 3810 Pnt 3041 3809 Pnt 4366 3813 Pnt 2918 3824 Pnt 2731 3912 Pnt 3049 3815 Pnt 2597 3851 Pnt 3607 3842 Pnt 3098 3842 Pnt 3635 3824 Pnt 2812 3849 Pnt 2483 3869 Pnt 3548 3799 Pnt 4354 3820 Pnt 3614 3827 Pnt 3215 3815 Pnt 4524 3825 Pnt 4040 3804 Pnt 3231 3863 Pnt 3482 3813 Pnt 2702 3828 Pnt 2065 3915 Pnt 2191 3842 Pnt 4040 3827 Pnt 3293 3806 Pnt 2892 3806 Pnt 3085 3870 Pnt 3152 3841 Pnt 3045 3902 Pnt 2782 3862 Pnt 2581 3902 Pnt 3256 3829 Pnt 2250 3850 Pnt 3133 3770 Pnt 2652 3855 Pnt 3181 3903 Pnt 2811 3854 Pnt 2526 3841 Pnt 4299 3817 Pnt 2902 3860 Pnt 2899 3863 Pnt 3047 3833 Pnt 2578 3813 Pnt 3647 3809 Pnt 2768 3809 Pnt 2580 3819 Pnt 3026 3829 Pnt 3081 3860 Pnt 3081 3830 Pnt 4448 3822 Pnt 2948 3887 Pnt 2573 3805 Pnt 3711 3822 Pnt 3004 3943 Pnt 2306 3819 Pnt 3635 3862 Pnt 3322 3900 Pnt 2730 3836 Pnt 3028 3841 Pnt 4323 3841 Pnt 3294 3851 Pnt 2600 3837 Pnt 4316 3819 Pnt 3871 3834 Pnt 2616 3837 Pnt 3361 3840 Pnt 3460 3848 Pnt 4871 3812 Pnt 3090 3840 Pnt 2620 3809 Pnt 2366 3841 Pnt 3017 3847 Pnt 4111 3845 Pnt 2551 3833 Pnt 3133 3833 Pnt 2767 3862 Pnt 3440 3872 Pnt 3570 3881 Pnt 3813 3789 Pnt 2808 3829 Pnt 2374 3829 Pnt 3608 3874 Pnt 2752 3803 Pnt 2731 3929 Pnt 3384 3820 Pnt 3284 3866 Pnt 4277 3811 Pnt 2776 3820 Pnt 2697 3800 Pnt 2877 3823 Pnt 2666 3804 Pnt 3174 3836 Pnt 4058 3809 Pnt 2656 3934 Pnt 3113 3846 Pnt 2459 3860 Pnt 3324 3853 Pnt 2847 3873 Pnt 3302 3810 Pnt 2626 3935 Pnt 2781 3849 Pnt 2726 3873 Pnt 3662 3843 Pnt 3642 3804 Pnt 3739 3855 Pnt 3777 3820 Pnt 3140 3864 Pnt 3259 3817 Pnt 4281 3813 Pnt 3657 3805 Pnt 2763 3842 Pnt 2127 3817 Pnt 1806 3817 Pnt 2700 3813 Pnt 2689 3828 Pnt 4687 3864 Pnt 2033 3915 Pnt 3945 3805 Pnt 2889 3870 Pnt 4174 3849 Pnt 3287 3806 Pnt 2716 3902 Pnt 5108 3871 Pnt 3084 3806 Pnt 3781 3169 Pnt 2797 3862 Pnt 3429 3862 Pnt 2847 3828 Pnt 3083 3841 Pnt 3630 3815 Pnt 3544 3852 Pnt 2992 3770 Pnt 3054 3824 Pnt 3704 3768 Pnt 3118 3904 Pnt 3578 3903 Pnt 4338 3830 Pnt 2815 3796 Pnt 3489 3800 Pnt 2944 3843 Pnt 3161 3880 Pnt 3449 3866 Pnt 2174 3823 Pnt 2324 3833 Pnt 4739 3880 Pnt 2822 3807 Pnt 4118 3869 Pnt 2985 3833 Pnt 2792 3823 Pnt 2296 3863 Pnt 2732 3854 Pnt 2382 3825 Pnt 2729 3863 Pnt 2000 3842 Pnt 3230 3842 Pnt 3304 3809 Pnt 3669 3791 Pnt 2665 3836 Pnt 3190 3836 Pnt 2560 3841 Pnt 3250 3828 Pnt 2712 3831 Pnt 2813 3837 Pnt 2536 3789 Pnt 2964 3834 Pnt 2743 3826 Pnt 4305 3841 Pnt 3746 3822 Pnt 3634 3826 Pnt 3039 3837 Pnt 2544 3871 Pnt 3360 3832 Pnt 3165 3809 Pnt 4970 3878 Pnt 3583 3879 Pnt 3267 3815 Pnt 2445 3825 Pnt 3185 3838 Pnt 3343 3845 Pnt 2649 3833 Pnt 3290 3847 Pnt 4825 3809 Pnt 2789 3836 Pnt 3804 3847 Pnt 2707 3788 Pnt 3629 3872 Pnt 2217 3800 Pnt 2823 3825 Pnt 2867 3830 Pnt 2899 3829 Pnt 2310 3857 Pnt 3104 3804 Pnt 3804 3792 Pnt 2449 3808 Pnt 2699 3810 Pnt 2685 3944 Pnt 2869 3849 Pnt 4275 3847 Pnt 2966 3873 Pnt 4022 3801 Pnt 3208 3830 Pnt 2656 3818 Pnt 2472 3804 Pnt 2730 3862 Pnt 2606 3802 Pnt 3839 3855 Pnt 2758 3768 Pnt 4285 3816 Pnt 4699 3810 Pnt 3139 3904 Pnt 3564 3848 Pnt 3422 3800 Pnt 3825 3822 Pnt 3211 3860 Pnt 2923 3829 Pnt 4075 3805 Pnt 2951 3809 Pnt 2744 3824 Pnt 2754 3868 Pnt 2053 3842 Pnt 2188 3823 Pnt 2241 3833 Pnt 2523 3806 Pnt 2629 3825 Pnt 5047 3826 Pnt 3012 3857 Pnt 2320 3863 Pnt 4815 3938 Pnt 2820 3809 Pnt 3061 3846 Pnt 4163 3791 Pnt 2772 3856 Pnt 2199 3831 Pnt 2273 3872 Pnt 2732 3823 Pnt 2980 3837 Pnt 3970 3790 Pnt 4592 3850 Pnt 4455 3068 Pnt 3441 3879 Pnt 3378 3829 Pnt 3773 3788 Pnt 3453 3848 Pnt 3495 3789 Pnt 2668 3790 Pnt 2877 3865 Pnt 2177 3881 Pnt 2813 3817 Pnt 3074 3840 Pnt 2653 3839 Pnt 2145 3805 Pnt 4441 3851 Pnt 3606 3821 Pnt 4729 3820 Pnt 4814 3885 Pnt 2990 3804 Pnt 2862 3784 Pnt 3119 3871 Pnt 3262 3865 Pnt 2909 3817 Pnt 1882 3830 Pnt 4712 3838 Pnt 4265 3845 Pnt 3851 3840 Pnt 2346 3931 Pnt 4741 3817 Pnt 3959 3851 Pnt 3220 3830 Pnt 2556 3818 Pnt 2139 3810 Pnt 3006 3842 Pnt 4775 3842 Pnt 2661 3895 Pnt 2840 3895 Pnt 2584 3810 Pnt 5028 3830 Pnt 3030 3843 Pnt 4339 3841 Pnt 2461 3837 Pnt 4667 3819 Pnt 4105 3807 Pnt 3933 3829 Pnt 2607 3791 Pnt 3318 3791 Pnt 1971 3840 Pnt 2833 3847 Pnt 2823 3844 Pnt 3000 3809 Pnt 2165 3829 Pnt 3615 3836 Pnt 3047 3830 Pnt 4744 3822 Pnt 2280 3802 Pnt 3708 3809 Pnt 2997 3826 Pnt 2987 3816 Pnt 2800 3946 Pnt 2811 3944 Pnt 3029 3860 Pnt 4185 3881 Pnt 3025 3860 Pnt 3965 3881 Pnt 3044 3813 Pnt 2292 3803 Pnt 3040 3809 Pnt 2857 3868 Pnt 2545 3854 Pnt 2316 3833 Pnt 2554 3929 Pnt 2593 3806 Pnt 3379 3806 Pnt 2265 3825 Pnt 2917 3820 Pnt 2802 3811 Pnt 2857 3857 Pnt 2157 3863 Pnt 3801 3825 Pnt 3511 3866 Pnt 2111 3934 Pnt 3617 3936 Pnt 3385 3853 Pnt 2531 3853 Pnt 2422 3804 Pnt 2594 3788 Pnt 3257 3878 Pnt 3474 3794 Pnt 4242 3828 Pnt 4733 3853 Pnt 3296 3793 Pnt 3522 3820 Pnt 3159 3848 Pnt 4842 3260 Pnt 3741 3832 Pnt 3591 3781 Pnt 4715 3820 Pnt 3686 3821 Pnt 2769 3850 Pnt 4843 3818 Pnt 4595 3774 Pnt 4639 3843 Pnt 4116 3849 Pnt 3934 3812 Pnt 4928 3831 Pnt 2641 3146 Pnt 2573 3873 Pnt 2692 3818 Pnt 3509 3827 Pnt 2065 3817 Pnt 2955 3812 Pnt 3519 3842 Pnt 2333 3813 Pnt 3541 3786 Pnt 2545 3828 Pnt 3618 3785 Pnt 2058 3915 Pnt 2746 3870 Pnt 3104 3847 Pnt 2490 3838 Pnt 3948 3849 Pnt 2685 3794 Pnt 3428 3849 Pnt 2978 3791 Pnt 2686 3800 Pnt 4122 3794 Pnt 3371 3806 Pnt 3345 3836 Pnt 2990 3829 Pnt 2786 3847 Pnt 2874 3847 Pnt 4216 3915 Pnt 3653 3824 Pnt 3706 3828 Pnt 2541 3841 Pnt 2442 3852 Pnt 2927 3854 Pnt 3546 3852 Pnt 3209 3830 Pnt 2262 3855 Pnt 3079 3903 Pnt 3794 3903 Pnt 3677 3880 Pnt 2756 3816 Pnt 2981 3841 Pnt 4763 3829 Pnt 3145 3946 Pnt 2580 3946 Pnt 2600 3944 Pnt 3237 3944 Pnt 4264 3844 Pnt 2775 3836 Pnt 4287 3869 Pnt 2947 3866 Pnt 3193 3866 Pnt 3783 3881 Pnt 2467 3810 Pnt 4864 3843 Pnt 2518 3929 Pnt 4505 3841 Pnt 3516 3810 Pnt 2492 3810 Pnt 2652 3788 Pnt 3207 3852 Pnt 3494 3852 Pnt 3104 3867 Pnt 2441 3936 Pnt 2699 3789 Pnt 3898 3864 Pnt 2725 3795 Pnt 3811 3824 Pnt 2993 3875 Pnt 2498 3846 Pnt 3390 3851 Pnt 3478 3810 Pnt 2364 3823 Pnt 2420 3912 Pnt 3702 3850 Pnt 3453 3851 Pnt 4641 3851 Pnt 4735 3843 Pnt 3835 3832 Pnt 4506 3832 Pnt 2756 3823 Pnt 4662 3936 Pnt 2579 3812 Pnt 5312 3878 Pnt 2800 3824 Pnt 3016 3832 Pnt 4622 3832 Pnt 2854 3847 Pnt 3129 3812 Pnt 2770 3870 Pnt 2245 3812 Pnt 2604 3869 Pnt 3040 3842 Pnt 2323 3800 Pnt 2221 3849 Pnt 2278 3813 Pnt 4529 3483 Pnt 2667 3804 Pnt 3360 3817 Pnt 4009 3783 Pnt 2638 3805 Pnt 2480 3901 Pnt 2388 3814 Pnt 2900 3813 Pnt 3554 3901 Pnt 2764 3814 Pnt 4177 3824 Pnt 2827 3804 Pnt 1969 3793 Pnt 2867 3819 Pnt 3373 3938 Pnt 2617 3860 Pnt 3273 3938 Pnt 3294 3862 Pnt 2779 3887 Pnt 2840 3862 Pnt 2727 3805 Pnt 2508 3855 Pnt 3811 3847 Pnt 2846 3855 Pnt 1821 3819 Pnt 3199 3768 Pnt 2574 3900 Pnt 2188 3900 Pnt 3422 3900 Pnt 4712 3827 Pnt 2354 3841 Pnt 3165 3800 Pnt 3552 3858 Pnt 2991 3800 Pnt 2463 3801 Pnt 2831 3845 Pnt 3397 3822 Pnt 2845 3845 Pnt 2736 3827 Pnt 2713 3832 Pnt 3412 3837 Pnt 3146 3837 Pnt 2913 3828 Pnt 3626 3828 Pnt 2468 3868 Pnt 2772 3843 Pnt 4493 3836 Pnt 3184 3836 Pnt 3207 3827 Pnt 3145 3866 Pnt 4567 3784 Pnt 2268 3811 Pnt 3886 3774 Pnt 4488 3049 Pnt 2876 3828 Pnt 3778 3772 Pnt 3202 3848 Pnt 2059 3915 Pnt 3407 3848 Pnt 5034 3828 Pnt 2698 3841 Pnt 3500 3824 Pnt 2708 3788 Pnt 3207 3856 Pnt 2535 3852 Pnt 3640 3771 Pnt 2225 3831 Pnt 3181 3856 Pnt 2852 3854 Pnt 3043 3854 Pnt 4578 3848 Pnt 3381 3769 Pnt 2935 3875 Pnt 2674 3903 Pnt 2650 3823 Pnt 3047 3768 Pnt 2641 3815 Pnt 2866 3817 Pnt 3333 3817 Pnt 3105 3824 Pnt 3741 3835 Pnt 2989 3879 Pnt 2751 3850 Pnt 3066 3852 Pnt 2792 3792 Pnt 4370 3831 Pnt 2943 3817 Pnt 4181 3826 Pnt 4491 3849 Pnt 3443 3809 Pnt 3017 3797 Pnt 3235 3860 Pnt 3086 3852 Pnt 2152 3803 Pnt 3645 3809 Pnt 2457 3820 Pnt 2788 3806 Pnt 4117 3795 Pnt 4832 3824 Pnt 2420 3854 Pnt 4713 3875 Pnt 2473 3846 Pnt 2662 3839 Pnt 2053 3805 Pnt 3014 3804 Pnt 2715 3784 Pnt 2762 3817 Pnt 2121 3830 Pnt 3991 3810 Pnt 4085 3851 Pnt 4670 3848 Pnt 2952 3811 Pnt 2405 3823 Pnt 2595 3912 Pnt 3053 3931 Pnt 2128 3854 Pnt 4423 3816 Pnt 2527 3815 Pnt 2429 3811 Pnt 2273 3810 Pnt 3728 3870 Pnt 3172 3828 Pnt 3149 3870 Pnt 3741 3832 Pnt 4805 3799 Pnt 4211 3824 Pnt 3478 3849 Pnt 2579 3807 Pnt 3957 3830 Pnt 2880 3901 Pnt 2844 3813 Pnt 2812 3804 Pnt 4160 3828 Pnt 2061 3854 Pnt 3121 3848 Pnt 4030 3851 Pnt 2772 3887 Pnt 2893 3871 Pnt 2572 3815 Pnt 3035 3823 Pnt 2930 3847 Pnt 2199 3824 Pnt 3281 3817 Pnt 2666 3832 Pnt 2723 3879 Pnt 3395 3832 Pnt 2807 3847 Pnt 2433 3814 Pnt 2939 3879 Pnt 4351 3830 Pnt 2696 3806 Pnt 1961 3824 Pnt 3213 3813 Pnt 3212 3826 Pnt 2413 3868 Pnt 2380 3869 Pnt 2714 3829 Pnt 2067 3800 Pnt 3265 3817 Pnt 2273 3895 Pnt 3207 3826 Pnt 2504 3810 Pnt 3176 3804 Pnt 2479 3783 Pnt 2234 3814 Pnt 2759 3785 Pnt 2393 3791 Pnt 1844 3793 Pnt 2108 3938 Pnt 2781 3806 Pnt 4203 3813 Pnt 2848 3862 Pnt 3072 3807 Pnt 2518 3805 Pnt 2909 3807 Pnt 3421 3873 Pnt 2597 3855 Pnt 3024 3873 Pnt 1839 3819 Pnt 1889 3848 Pnt 3067 3768 Pnt 2694 3871 Pnt 4754 3883 Pnt 2995 3900 Pnt 2249 3900 Pnt 3082 3900 Pnt 2235 3841 Pnt 4060 3817 Pnt 3224 3800 Pnt 3554 3849 Pnt 2705 3946 Pnt 2585 3946 Pnt 2501 3801 Pnt 3071 3815 Pnt 3317 3845 Pnt 2916 3821 Pnt 3019 3885 Pnt 2864 3879 Pnt 2644 3832 Pnt 2949 3820 Pnt 3057 3844 Pnt 4305 3847 Pnt 2758 3794 Pnt 4501 3858 Pnt 3538 3828 Pnt 2566 3800 Pnt 2952 3821 Pnt 3220 3874 Pnt 4993 3886 Pnt 3065 3815 Pnt 2995 3827 Pnt 3571 3935 Pnt 2261 3827 Pnt 3086 3809 Pnt 3254 3828 Pnt 3285 3828 Pnt 2605 3846 Pnt 3406 3847 Pnt 2289 3825 Pnt 3147 3834 Pnt 3926 3837 Pnt 2740 3812 Pnt 3545 3796 Pnt 3085 3889 Pnt 1989 3915 Pnt 4761 3801 Pnt 2421 3810 Pnt 2717 3812 Pnt 2528 3929 Pnt 3568 3856 Pnt 3441 3841 Pnt 2707 3825 Pnt 3810 3881 Pnt 2867 3861 Pnt 2447 3804 Pnt 3202 3820 Pnt 3047 3841 Pnt 3847 3849 Pnt 3171 3867 Pnt 2526 3875 Pnt 4704 3189 Pnt 3351 3862 Pnt 1981 3901 Pnt 3029 3823 Pnt 2971 3838 Pnt 4065 3823 Pnt 4292 3835 Pnt 3056 3824 Pnt 2888 3792 Pnt 3996 3828 Pnt 2782 3792 Pnt 2129 3895 Pnt 2083 3799 Pnt 4285 3861 Pnt 3272 3811 Pnt 2596 3804 Pnt 2574 3813 Pnt 2101 3806 Pnt 2984 3788 Pnt 3647 3811 Pnt 2392 3814 Pnt 2787 3826 Pnt 2564 3785 Pnt 4722 3869 Pnt 2472 3874 Pnt 2752 3791 Pnt 4885 3816 Pnt 2436 3828 Pnt 3999 3788 Pnt 2730 3944 Pnt 4545 3823 Pnt 2956 3827 Pnt 4307 3843 Pnt 2759 3828 Pnt 2710 3825 Pnt 2911 3829 Pnt 4537 3824 Pnt 3058 3843 Pnt 4787 3808 Pnt 2125 3831 Pnt 4626 3803 Pnt 4511 3781 Pnt 2960 3860 Pnt 2965 3814 Pnt 2360 3852 Pnt 3222 3881 Pnt 4193 3811 Pnt 4456 3828 Pnt 2383 3807 Pnt 2667 3809 Pnt 3778 3809 Pnt 3488 3887 Pnt 2868 3795 Pnt 3454 3807 Pnt 2683 3854 Pnt 2667 3873 Pnt 2914 3854 Pnt 3293 3839 Pnt 4424 3203 Pnt 3362 3900 Pnt 4428 3819 Pnt 4685 3850 Pnt 3156 3849 Pnt 2572 3938 Pnt 3680 3824 Pnt 1881 3830 Pnt 3815 3771 Pnt 3339 3826 Pnt 3237 3946 Pnt 4537 3946 Pnt 2611 3879 Pnt 3105 3845 Pnt 2530 3838 Pnt 3284 3826 Pnt 3064 3820 Pnt 2502 3912 Pnt 2025 3931 Pnt 3470 3844 Pnt 3047 3862 Pnt 3912 3818 Pnt 2908 3800 Pnt 3035 3814 Pnt 2871 3844 Pnt 3843 3800 Pnt 3723 3862 Pnt 2250 3815 Pnt 3566 3828 Pnt 1832 3811 Pnt 3064 3874 Pnt 2559 3817 Pnt 2620 3836 Pnt 1830 3816 Pnt 2609 3929 Pnt 4479 3929 Pnt 2252 3827 Pnt 3036 3846 Pnt 2480 3834 Pnt 2317 3810 Pnt 2826 3775 Pnt 3722 3809 Pnt 2816 3811 Pnt 2858 3865 Pnt 4385 3820 Pnt 4427 3821 Pnt 3076 3825 Pnt 3135 3844 Pnt 4483 3861 Pnt 2752 3812 Pnt 4397 3825 Pnt 3091 3852 Pnt 3618 3825 Pnt 2351 3918 Pnt 3422 3918 Pnt 2982 3788 Pnt 2204 3810 Pnt 2587 3841 Pnt 2918 3823 Pnt 2170 3824 Pnt 4946 3862 Pnt 4255 3820 Pnt 3730 3824 Pnt 2990 3849 Pnt 3668 3854 Pnt 3104 3792 Pnt 4318 3816 Pnt 3094 3784 Pnt 3091 3842 Pnt 4095 3818 Pnt 2660 3818 Pnt 4321 3811 Pnt 2370 3799 Pnt 4627 3871 Pnt 3958 3874 Pnt 2595 3788 Pnt 5245 3864 Pnt 4649 3788 Pnt 2012 3800 Pnt 3208 3827 Pnt 3368 3823 Pnt 3874 3812 Pnt 4192 3870 Pnt 3598 3769 Pnt 4537 3769 Pnt 4823 3815 Pnt 4265 3870 Pnt 4696 3801 Pnt 4029 3807 Pnt 3806 3827 Pnt 3592 3814 Pnt 3425 3828 Pnt 2663 3879 Pnt 3809 3796 Pnt 2344 3936 Pnt 5229 3863 Pnt 4327 3936 Pnt 4666 3836 Pnt 3740 3840 Pnt 3456 3840 Pnt 4498 3846 Pnt 4604 3855 Pnt 3997 3849 Pnt 3403 3855 Pnt 4456 3820 Pnt 3226 3849 Pnt 2752 3867 Pnt 3710 3860 Pnt 3946 3847 Pnt 2423 3847 Pnt 2525 3821 Pnt 3073 3862 Pnt 4709 3854 Pnt 2459 3901 Pnt 2635 3843 Pnt 3816 3849 Pnt 3768 3847 Pnt 3407 3788 Pnt 4322 3901 Pnt 2857 3944 Pnt 2563 3918 Pnt 2672 3918 Pnt 2065 3802 Pnt 4496 3832 Pnt 2548 3823 Pnt 2661 3854 Pnt 4430 3830 Pnt 3316 3823 Pnt 4556 3889 Pnt 3120 3836 Pnt 2976 3824 Pnt 2422 3831 Pnt 3801 3868 Pnt 3691 3826 Pnt 2110 3795 Pnt 4382 3829 Pnt 3685 3869 Pnt 3056 3842 Pnt 4716 3850 Pnt 2622 3845 Pnt 2606 3838 Pnt 3392 3818 Pnt 4220 3886 Pnt 3940 3784 Pnt 3123 3838 Pnt 3284 3819 Pnt 2289 3814 Pnt 3817 3847 Pnt 3013 3844 Pnt 4361 3834 Pnt 2751 3855 Pnt 2758 3869 Pnt 2522 3823 Pnt 2425 3828 Pnt 3057 3868 Pnt 2522 3817 Pnt 3007 3831 Pnt 4491 3831 Pnt 4290 3817 Pnt 3202 3929 Pnt 3096 3766 Pnt 3065 3818 Pnt 3596 3830 Pnt 3357 3830 Pnt 2714 3811 Pnt 3431 3775 Pnt 2503 3788 Pnt 2895 3929 Pnt 3543 3824 Pnt 2701 3814 Pnt 2663 3844 Pnt 2562 3812 Pnt 3276 3862 Pnt 3764 3826 Pnt 3567 3866 Pnt 3794 3796 Pnt 2468 3779 Pnt 2448 3841 Pnt 2449 3824 Pnt 4645 3840 Pnt 3255 3855 Pnt 4751 3834 Pnt 5175 3820 Pnt 3090 3848 Pnt 2550 3799 Pnt 3300 3881 Pnt 4527 3827 Pnt 3739 3885 Pnt 3046 3823 Pnt 4480 3823 Pnt 3208 3821 Pnt 3838 3825 Pnt 2512 3846 Pnt 2761 3847 Pnt 3720 3824 Pnt 3819 3821 Pnt 2264 3840 Pnt 3174 3826 Pnt 2466 3895 Pnt 3490 3840 Pnt 2240 3875 Pnt 2189 3799 Pnt 4196 3875 Pnt 2816 3820 Pnt 3263 3857 Pnt 3019 3818 Pnt 2208 3821 Pnt 2582 3843 Pnt 2843 3804 Pnt 2041 3901 Pnt 4620 3901 Pnt 2864 3806 Pnt 2820 3788 Pnt 2604 3819 Pnt 3628 3836 Pnt 2463 3826 Pnt 2805 3824 Pnt 2959 3901 Pnt 2135 3869 Pnt 1700 3828 Pnt 2904 3816 Pnt 3354 3811 Pnt 3296 3838 Pnt 3270 3838 Pnt 3070 3841 Pnt 4570 3825 Pnt 3074 3792 Pnt 3216 3860 Pnt 2864 3929 Pnt 2879 3804 Pnt 2981 3804 Pnt 3060 3764 Pnt 2859 3813 Pnt 2612 3847 Pnt 2993 3811 Pnt 4537 3823 Pnt 3498 3811 Pnt 2233 3788 Pnt 3069 3827 Pnt 4660 3824 Pnt 2673 3809 Pnt 3848 3830 Pnt 3243 3947 Pnt 4572 3901 Pnt 3087 3841 Pnt 2172 3918 Pnt 1955 3800 Pnt 3304 3812 Pnt 2584 3802 Pnt 3541 3841 Pnt 3144 3827 Pnt 2860 3795 Pnt 2312 3854 Pnt 3270 3823 Pnt 3033 3871 Pnt 3163 3854 Pnt 4181 3827 Pnt 2243 3839 Pnt 2378 3818 Pnt 3875 3839 Pnt 2697 3818 Pnt 2631 3792 Pnt 2975 3903 Pnt 3210 3775 Pnt 2103 3849 Pnt 1939 3831 Pnt 2788 3841 Pnt 2733 3811 Pnt 2503 3938 Pnt 2092 3795 Pnt 2243 3811 Pnt 5037 3882 Pnt 4294 3938 Pnt 2448 3830 Pnt 3317 3874 Pnt 2385 3946 Pnt 2730 3788 Pnt 2541 3879 Pnt 2361 3929 Pnt 3594 3884 Pnt 3770 3944 Pnt 3881 3853 Pnt 2440 3912 Pnt 4402 3810 Pnt 2422 3901 Pnt 3853 3770 Pnt 5196 3886 Pnt 4414 3870 Pnt 2319 3814 Pnt 1934 3931 Pnt 2353 3839 Pnt 2428 3818 Pnt 3421 3877 Pnt 3426 3943 Pnt 3442 3859 Pnt 3721 3800 Pnt 4999 3883 Pnt 4692 3877 Pnt 2696 3847 Pnt 5281 3920 Pnt 3443 3894 Pnt 2273 3841 Pnt 2732 3814 Pnt 2810 3841 Pnt 3134 3802 Pnt 2954 3836 Pnt 2687 3802 Pnt 2154 3827 Pnt 2813 3834 Pnt 2495 3846 Pnt 2579 3801 Pnt 3208 3846 Pnt 2661 3834 Pnt 3989 3826 Pnt 3036 3834 Pnt 3026 3815 Pnt 2106 3918 Pnt 3150 3815 Pnt 2532 3802 Pnt 3019 3821 Pnt 2500 3800 Pnt 3214 3818 Pnt 3162 3800 Pnt 3899 3885 Pnt 2773 3854 Pnt 3678 3881 Pnt 3250 3852 Pnt 2736 3865 Pnt 2147 3840 Pnt 2978 3840 Pnt 1974 3799 Pnt 4935 3881 Pnt 5166 3819 Pnt 3940 3799 Pnt 2743 3852 Pnt 2033 3833 Pnt 4071 3820 Pnt 3070 3838 Pnt 3840 3820 Pnt 3898 3838 Pnt 3096 3866 Pnt 2384 3779 Pnt 4620 3892 Pnt 2174 3869 Pnt 2819 3779 Pnt 3391 3869 Pnt 3747 3835 Pnt 2070 3828 Pnt 3335 3828 Pnt 3749 3821 Pnt 3024 3813 Pnt 3573 3791 Pnt 2473 3828 Pnt 4791 3814 Pnt 3125 3838 Pnt 3044 3847 Pnt 3535 3811 Pnt 2658 3845 Pnt 2180 3929 Pnt 2894 3929 Pnt 2209 3788 Pnt 2888 3827 Pnt 3666 3804 Pnt 3140 3812 Pnt 4304 3129 Pnt 3882 3827 Pnt 2792 3866 Pnt 2652 3839 Pnt 2939 3811 Pnt 4432 3888 Pnt 2434 3818 Pnt 3209 3841 Pnt 3522 3818 Pnt 2271 3877 Pnt 2743 3835 Pnt 2810 3795 Pnt 2660 3822 Pnt 2901 3859 Pnt 3265 3871 Pnt 3091 3805 Pnt 3451 3871 Pnt 2920 3818 Pnt 2615 3843 Pnt 3877 3883 Pnt 3020 3847 Pnt 2816 3773 Pnt 2735 3804 Pnt 2201 3841 Pnt 2318 3901 Pnt 3972 3822 Pnt 2678 3814 Pnt 3285 3811 Pnt 2126 3806 Pnt 2783 3857 Pnt 2727 3874 Pnt 3025 3859 Pnt 2713 3874 Pnt 2506 3929 Pnt 1975 3918 Pnt 2853 3815 Pnt 3571 3788 Pnt 2094 3901 Pnt 3161 3859 Pnt 3100 3901 Pnt 4822 3824 Pnt 2822 3938 Pnt 4331 3814 Pnt 3694 3788 Pnt 3788 3938 Pnt 3150 3802 Pnt 2708 3867 Pnt 3028 3800 Pnt 3274 3881 Pnt 2942 3818 Pnt 2918 3818 Pnt 3393 3800 Pnt 3132 3885 Pnt 3065 3821 Pnt 3046 3834 Pnt 3425 3865 Pnt 4037 3818 Pnt 3156 3852 Pnt 2537 3846 Pnt 2556 3840 Pnt 3233 3779 Pnt 2035 3828 Pnt 3111 3835 Pnt 2365 3852 Pnt 3605 3825 Pnt 4119 3847 Pnt 2471 3833 Pnt 3823 3829 Pnt 2387 3834 Pnt 5096 3829 Pnt 2873 3834 Pnt 2441 3863 Pnt 3797 3812 Pnt 2154 3929 Pnt 3610 3844 Pnt 2871 3811 Pnt 3446 3844 Pnt 2993 3834 Pnt 3863 3821 Pnt 2804 3792 Pnt 2172 3875 Pnt 2733 3813 Pnt 4015 3813 Pnt 3228 3874 Pnt 3650 3791 Pnt 2677 3839 Pnt 2478 3838 Pnt 3257 3791 Pnt 2217 3823 Pnt 2129 3848 Pnt 2590 3845 Pnt 3360 3811 Pnt 2813 3841 Pnt 2310 3818 Pnt 2070 3869 Pnt 3096 3822 Pnt 2413 3944 Pnt 4052 3829 Pnt 2626 3809 Pnt 3140 3837 Pnt 2216 3828 Pnt 4601 3811 Pnt 4058 3841 Pnt 2770 3809 Pnt 4748 3813 Pnt 3108 3793 Pnt 3385 3824 Pnt 3179 3827 Pnt 2696 3824 Pnt 2843 3947 Pnt 3384 3835 Pnt 3775 3835 Pnt 1988 3877 Pnt 2430 3895 Pnt 3013 3843 Pnt 3699 3828 Pnt 2983 3837 Pnt 4106 3827 Pnt 2854 3823 Pnt 2604 3837 Pnt 3335 3773 Pnt 2310 3773 Pnt 4000 3870 Pnt 2605 3857 Pnt 2154 3842 Pnt 2460 3828 Pnt 4687 3794 Pnt 2775 3852 Pnt 2473 3818 Pnt 2762 3826 Pnt 3540 3887 Pnt 3005 3852 Pnt 2082 3839 Pnt 1960 3795 Pnt 2563 3903 Pnt 3673 3792 Pnt 4075 3885 Pnt 1984 3883 Pnt 3996 3792 Pnt 1756 3848 Pnt 2423 3814 Pnt 2930 3819 Pnt 3087 3772 Pnt 3081 3871 Pnt 2702 3915 Pnt 4680 3806 Pnt 2323 3305 Pnt 2347 3814 Pnt 4130 3901 Pnt 3280 3881 Pnt 3123 3943 Pnt 3236 3881 Pnt 2518 3903 Pnt 4672 3903 Pnt 4706 3841 Pnt 4697 3943 Pnt 3090 3811 Pnt 3316 3122 Pnt 2126 3806 Pnt 2954 3865 Pnt 4552 3833 Pnt 2641 3874 Pnt 3794 3859 Pnt 3643 3828 Pnt 2882 3791 Pnt 2134 3929 Pnt 3343 3926 Pnt 2067 3901 Pnt 3564 3823 Pnt 2773 3912 Pnt 3432 3817 Pnt 4691 3828 Pnt 3816 3826 Pnt 3137 3859 Pnt 3331 3823 Pnt 4657 3894 Pnt 4458 3802 Pnt 3800 3788 Pnt 4663 3820 Pnt 2712 3835 Pnt 2967 3938 Pnt 3585 3854 Pnt 2905 3821 Pnt 3216 3810 Pnt 3656 3819 Pnt 2200 3834 Pnt 2740 3871 Pnt 3720 3839 Pnt 2621 3838 Pnt 2723 3863 Pnt 3225 3783 Pnt 3225 3812 Pnt 3987 3835 Pnt 2277 3831 Pnt 3248 3837 Pnt 3735 3837 Pnt 2437 3841 Pnt 4024 3844 Pnt 4936 3819 Pnt 2684 3823 Pnt 3968 3844 Pnt 2677 3822 Pnt 3031 3947 Pnt 2719 3853 Pnt 2712 3826 Pnt 4237 3853 Pnt 3677 3767 Pnt 2902 3793 Pnt 3208 3773 Pnt 4095 3870 Pnt 3293 3772 Pnt 4568 3871 Pnt 3424 3824 Pnt 3321 3853 Pnt 2612 3812 Pnt 3018 3824 Pnt 2473 3892 Pnt 3016 3847 Pnt 2267 3822 Pnt 2750 3838 Pnt 4595 3835 Pnt 2362 3828 Pnt 2888 3823 Pnt 2089 3855 Pnt 3164 3833 Pnt 2661 3792 Pnt 2415 3828 Pnt 2271 3869 Pnt 2216 3848 Pnt 3015 3887 Pnt 3669 3827 Pnt 3609 3828 Pnt 2955 3823 Pnt 3130 3950 Pnt 2177 3854 Pnt 3242 3802 Pnt 2464 3868 Pnt 4826 3818 Pnt 3752 3950 Pnt 2698 3835 Pnt 3018 3831 Pnt 2850 3882 Pnt 2216 3805 Pnt 3375 3882 Pnt 1695 3818 Pnt 3993 3860 Pnt 3348 3826 Pnt 3831 3881 Pnt 3140 3842 Pnt 2603 3903 Pnt 3799 3818 Pnt 2510 3832 Pnt 2992 3852 Pnt 4410 3871 Pnt 2850 3903 Pnt 4498 3852 Pnt 3968 3847 Pnt 4547 3832 Pnt 2643 3802 Pnt 3654 3824 Pnt 2516 3885 Pnt 4161 3812 Pnt 4658 3820 Pnt 3402 3831 Pnt 4384 3795 Pnt 3485 3860 Pnt 2358 3852 Pnt 3459 3823 Pnt 2953 3791 Pnt 3150 3830 Pnt 3607 3837 Pnt 2973 3926 Pnt 2344 3897 Pnt 3818 3897 Pnt 3412 3839 Pnt 2757 3929 Pnt 2446 3839 Pnt 4121 3825 Pnt 2487 3800 Pnt 3083 3794 Pnt 2258 3831 Pnt 2812 3792 Pnt 3224 3837 Pnt 3729 3825 Pnt 4039 3817 Pnt 3176 3820 Pnt 2885 3842 Pnt 1950 3799 Pnt 4629 3818 Pnt 3599 3835 Pnt 4508 3837 Pnt 3520 3821 Pnt 2602 3814 Pnt 2986 3845 Pnt 3153 3828 Pnt 3312 3823 Pnt 2871 3879 Pnt 4485 3835 Pnt 2289 3936 Pnt 3603 3870 Pnt 3621 3811 Pnt 3795 3844 Pnt 3195 3791 Pnt 3550 3791 Pnt 3733 3846 Pnt 3223 3828 Pnt 2879 3840 Pnt 2624 3809 Pnt 4726 3809 Pnt 2697 3884 Pnt 4124 3857 Pnt 3616 3884 Pnt 3477 3766 Pnt 2649 3871 Pnt 4562 3786 Pnt 4223 3819 Pnt 3179 3915 Pnt 2535 3783 Pnt 2637 3901 Pnt 3125 3848 Pnt 3970 3848 Pnt 2966 3874 Pnt 3258 3833 Pnt 2829 3874 Pnt 4060 3783 Pnt 4431 3822 Pnt 3684 3887 Pnt 4039 3872 Pnt 3715 3822 Pnt 3879 3794 Pnt 2989 3871 Pnt 2367 3892 Pnt 3888 3887 Pnt 3676 3812 Pnt 3628 3772 Pnt 2800 3841 Pnt 3433 3847 Pnt 2964 3871 Pnt 2871 3812 Pnt 2634 3838 Pnt 3670 3834 Pnt 2870 3863 Pnt 4709 3812 Pnt 4187 3807 Pnt 3113 3841 Pnt 2937 3824 Pnt 3554 3824 Pnt 2876 3810 Pnt 2583 3842 Pnt 4548 3848 Pnt 2551 3903 Pnt 3049 3947 Pnt 3688 3903 Pnt 4455 3947 Pnt 2217 3852 Pnt 3183 3852 Pnt 4401 3821 Pnt 2667 3853 Pnt 2438 3842 Pnt 2609 3826 Pnt 2621 3802 Pnt 3452 3791 Pnt 3369 3791 Pnt 2676 3805 Pnt 3119 3823 Pnt 3083 3839 Pnt 2967 3929 Pnt 2593 3926 Pnt 2904 3793 Pnt 2916 3825 Pnt 2278 3897 Pnt 2831 3772 Pnt 4082 3853 Pnt 3065 3870 Pnt 3287 3866 Pnt 3350 3834 Pnt 3127 3813 Pnt 3651 3813 Pnt 2699 3823 Pnt 2622 3809 Pnt 2293 3854 Pnt 4468 3856 Pnt 4018 3813 Pnt 3879 3823 Pnt 3263 3827 Pnt 5107 3856 Pnt 3103 3830 Pnt 5027 3853 Pnt 2361 3857 Pnt 1712 3818 Pnt 3506 3842 Pnt 4680 3830 Pnt 2162 3810 Pnt 1847 3848 Pnt 3359 3110 Pnt 2097 3832 Pnt 3793 3792 Pnt 2579 3792 Pnt 3333 3817 Pnt 3012 3876 Pnt 3847 3903 Pnt 3416 3823 Pnt 4729 3846 Pnt 3504 3815 Pnt 3516 3826 Pnt 3327 3829 Pnt 2528 3794 Pnt 3116 3814 Pnt 3613 3815 Pnt 3494 3943 Pnt 2599 3811 Pnt 3829 3808 Pnt 4715 3796 Pnt 2111 3797 Pnt 4306 3765 Pnt 3759 3869 Pnt 3449 3769 Pnt 2953 3950 Pnt 3684 3839 Pnt 2700 3882 Pnt 2704 3839 Pnt 2925 3826 Pnt 2384 3802 Pnt 3803 3865 Pnt 1951 3912 Pnt 3826 3863 Pnt 2813 3824 Pnt 3467 3882 Pnt 3459 3817 Pnt 3734 3812 Pnt 2924 3842 Pnt 3157 3859 Pnt 2570 3826 Pnt 2744 3802 Pnt 2136 3938 Pnt 2859 3854 Pnt 4395 3882 Pnt 3888 3808 Pnt 3260 3820 Pnt 3093 3805 Pnt 3077 3817 Pnt 2966 3823 Pnt 4578 3864 Pnt 5051 3842 Pnt 3579 3839 Pnt 3599 3808 Pnt 3403 3810 Pnt 3217 3810 Pnt 2884 3791 Pnt 3546 3806 Pnt 4395 3931 Pnt 3685 3824 Pnt 2784 3817 Pnt 2860 3860 Pnt 4643 3794 Pnt 3623 3926 Pnt 3968 3928 Pnt 2567 3884 Pnt 3783 3884 Pnt 2621 3871 Pnt 2655 3915 Pnt 2999 3833 Pnt 3972 3826 Pnt 4248 3856 Pnt 1897 3818 Pnt 4598 3793 Pnt 4840 3838 Pnt 4139 3819 Pnt 3211 3830 Pnt 3876 3881 Pnt 3505 3850 Pnt 2686 3799 Pnt 3950 3810 Pnt 2864 3799 Pnt 2678 3837 Pnt 2716 3837 Pnt 3478 3812 Pnt 4103 3846 Pnt 1855 3848 Pnt 3331 3852 Pnt 4426 3820 Pnt 3610 3858 Pnt 4176 3850 Pnt 2812 3834 Pnt 2633 3823 Pnt 3351 3872 Pnt 2288 3891 Pnt 2774 3807 Pnt 2831 3841 Pnt 2795 3841 Pnt 3277 3832 Pnt 2833 3812 Pnt 4231 3841 Pnt 2996 3903 Pnt 3810 3807 Pnt 3297 3810 Pnt 2880 3794 Pnt 2527 3815 Pnt 3165 3903 Pnt 3989 3815 Pnt 4008 3827 Pnt 3164 3791 Pnt 3847 3789 Pnt 3032 3816 Pnt 3342 3859 Pnt 2794 3866 Pnt 3048 3857 Pnt 4478 3811 Pnt 2157 3816 Pnt 2686 3842 Pnt 2754 3805 Pnt 3701 3805 Pnt 2608 3835 Pnt 3972 3813 Pnt 2856 3823 Pnt 3775 3768 Pnt 2942 3848 Pnt 2829 3836 Pnt 2923 3845 Pnt 3390 3848 Pnt 2746 3842 Pnt 4416 3842 Pnt 2686 3860 Pnt 3634 3766 Pnt 3277 3828 Pnt 2064 3928 Pnt 3429 3818 Pnt 2733 3868 Pnt 3291 3823 Pnt 2800 3833 Pnt 2713 3879 Pnt 2074 3936 Pnt 2942 3937 Pnt 3941 3817 Pnt 4683 3876 Pnt 3357 3881 Pnt 2612 3799 Pnt 3372 3886 Pnt 2535 3871 Pnt 4272 3817 Pnt 2515 3837 Pnt 3067 3826 Pnt 3535 3832 Pnt 4071 3879 Pnt 2560 3854 Pnt 4933 3823 Pnt 3065 3817 Pnt 3008 3216 Pnt 3203 3818 Pnt 2255 3828 Pnt 3119 3823 Pnt 3297 3834 Pnt 4431 3871 Pnt 2823 3840 Pnt 3699 3783 Pnt 2586 3841 Pnt 2374 3782 Pnt 2705 3838 Pnt 2832 3855 Pnt 3187 3812 Pnt 5236 3857 Pnt 3152 3812 Pnt 3895 3855 Pnt 2811 3810 Pnt 2795 3842 Pnt 3023 3819 Pnt 2853 3815 Pnt 2183 3901 Pnt 2457 3848 Pnt 4565 3815 Pnt 4099 3887 Pnt 3407 3880 Pnt 2928 3874 Pnt 2665 3937 Pnt 3869 3848 Pnt 2401 3868 Pnt 3422 3874 Pnt 2974 3868 Pnt 3127 3829 Pnt 3021 3822 Pnt 2150 3799 Pnt 3002 3897 Pnt 3305 3846 Pnt 4484 3809 Pnt 2455 3871 Pnt 3072 3877 Pnt 3376 3772 Pnt 4110 3812 Pnt 2992 3817 Pnt 3916 3815 Pnt 2779 3834 Pnt 3291 3876 Pnt 3275 3831 Pnt 3124 3815 Pnt 3008 3870 Pnt 2631 3807 Pnt 2688 3823 Pnt 3658 3819 Pnt 2975 3809 Pnt 2911 3833 Pnt 2587 3856 Pnt 2844 3931 Pnt 2938 3796 Pnt 2974 3796 Pnt 1775 3821 Pnt 4552 3822 Pnt 3494 3882 Pnt 4380 3819 Pnt 4950 3825 Pnt 3597 3873 Pnt 2963 3792 Pnt 2773 3820 Pnt 3573 3835 Pnt 2518 3834 Pnt 3436 3818 Pnt 2549 3782 Pnt 3430 3876 Pnt 3249 3840 Pnt 3531 3840 Pnt 2531 3812 Pnt 4067 3872 Pnt 4149 3847 Pnt 3555 3813 Pnt 3131 3842 Pnt 2624 3947 Pnt 2113 3852 Pnt 2437 3852 Pnt 3792 3872 Pnt 4025 3839 Pnt 2625 3832 Pnt 4318 3815 Pnt 3004 3902 Pnt 3782 3872 Pnt 2573 3819 Pnt 3343 3842 Pnt 3704 3793 Pnt 3082 3829 Pnt 2964 3791 Pnt 4622 3855 Pnt 4004 3850 Pnt 4294 3851 Pnt 4782 3834 Pnt 3567 3859 Pnt 3421 3789 Pnt 2985 3866 Pnt 2739 3842 Pnt 5301 3823 Pnt 3056 3857 Pnt 3664 3880 Pnt 3225 3836 Pnt 2642 3842 Pnt 3810 3871 Pnt 3258 3871 Pnt 2699 3818 Pnt 4003 3805 Pnt 2938 3831 Pnt 4630 3818 Pnt 2315 3943 Pnt 2547 3852 Pnt 3155 3822 Pnt 4276 3813 Pnt 3320 3811 Pnt 3340 3822 Pnt 2041 3797 Pnt 3476 3797 Pnt 3512 3895 Pnt 2968 3872 Pnt 3110 3763 Pnt 2737 3823 Pnt 2568 3874 Pnt 3280 3874 Pnt 2941 3848 Pnt 2379 3844 Pnt 3320 3950 Pnt 3064 3848 Pnt 2435 3901 Pnt 2958 3839 Pnt 2184 3839 Pnt 2874 3802 Pnt 4461 3794 Pnt 2877 3937 Pnt 5045 3950 Pnt 2875 3865 Pnt 2382 3426 Pnt 2173 3897 Pnt 4269 3794 Pnt 2780 3824 Pnt 4003 3843 Pnt 2998 3832 Pnt 3217 3772 Pnt 2750 3879 Pnt 3648 3832 Pnt 3170 3812 Pnt 3070 3817 Pnt 2377 3826 Pnt 2961 3842 Pnt 3740 3834 Pnt 3620 3826 Pnt 4135 3824 Pnt 2105 3802 Pnt 1977 3938 Pnt 3227 3808 Pnt 3570 3809 Pnt 4427 3858 Pnt 2985 3851 Pnt 4238 3808 Pnt 3309 3805 Pnt 3098 3854 Pnt 5078 3835 Pnt 3873 3865 Pnt 3588 3864 Pnt 2240 3891 Pnt 2878 3807 Pnt 3307 3812 Pnt 2815 3903 Pnt 2560 3895 Pnt 3151 3810 Pnt 3274 3816 Pnt 2610 3822 Pnt 4140 3886 Pnt 4429 3353 Pnt 2850 3882 Pnt 3817 3830 Pnt 3381 3810 Pnt 3680 3832 Pnt 2155 3923 Pnt 2097 3835 Pnt 4723 3821 Pnt 3310 3825 Pnt 2952 3827 Pnt 3234 3868 Pnt 3603 3826 Pnt 4648 3826 Pnt 4162 3809 Pnt 4149 3823 Pnt 4930 3824 Pnt 3665 3822 Pnt 3088 3837 Pnt 2566 3919 Pnt 4015 3325 Pnt 2903 3871 Pnt 2079 3794 Pnt 2964 3876 Pnt 2866 3884 Pnt 3029 3831 Pnt 4538 3856 Pnt 2508 3807 Pnt 2930 3831 Pnt 3228 3842 Pnt 2598 3797 Pnt 4507 3833 Pnt 3368 3819 Pnt 2848 3815 Pnt 3949 3873 Pnt 2590 3874 Pnt 3353 3872 Pnt 3382 3872 Pnt 2120 3882 Pnt 3411 3792 Pnt 2277 3868 Pnt 2915 3874 Pnt 2162 3909 Pnt 2205 3799 Pnt 2468 3834 Pnt 2528 3871 Pnt 3961 3803 Pnt 2477 3840 Pnt 3372 3848 Pnt 3939 3857 Pnt 3364 3842 Pnt 3154 3812 Pnt 2996 3820 Pnt 2333 3901 Pnt 3715 3820 Pnt 3190 3815 Pnt 2569 3839 Pnt 2656 3822 Pnt 3760 3812 Pnt 3200 3876 Pnt 3150 3818 Pnt 4411 3815 Pnt 4551 3835 Pnt 3055 3815 Pnt 3022 3832 Pnt 3980 3801 Pnt 2452 3843 Pnt 2856 3771 Pnt 2709 3826 Pnt 2781 3834 Pnt 2161 3826 Pnt 4099 3821 Pnt 4280 3843 Pnt 3682 3800 Pnt 2443 3938 Pnt 2910 3842 Pnt 3063 3855 Pnt 2898 3814 Pnt 2433 3819 Pnt 4457 3842 Pnt 2383 3842 Pnt 3806 3808 Pnt 4033 3851 Pnt 3093 3808 Pnt 3170 3822 Pnt 3251 3835 Pnt 3041 3835 Pnt 2854 3782 Pnt 2679 3861 Pnt 4858 3871 Pnt 3391 3864 Pnt 4701 3864 Pnt 3031 3891 Pnt 3904 3891 Pnt 4297 3850 Pnt 2884 3947 Pnt 2527 3860 Pnt 2595 3838 Pnt 3762 3875 Pnt 3856 3875 Pnt 2801 3833 Pnt 2314 3902 Pnt 3823 3857 Pnt 4904 3796 Pnt 2849 3855 Pnt 3528 3816 Pnt 2511 3880 Pnt 2650 3818 Pnt 3810 3857 Pnt 2741 3926 Pnt 3089 3848 Pnt 2174 3835 Pnt 3077 3847 Pnt 2931 3827 Pnt 2551 3868 Pnt 3533 3842 Pnt 2612 3860 Pnt 2699 3818 Pnt 3812 3840 Pnt 3314 3795 Pnt 2715 3876 Pnt 2375 3932 Pnt 2223 3831 Pnt 2610 3807 Pnt 2984 3852 Pnt 4793 3854 Pnt 2412 3895 Pnt 4700 3819 Pnt 3311 3811 Pnt 3479 3895 Pnt 3007 3808 Pnt 2794 3851 Pnt 2716 3838 Pnt 2765 3810 Pnt 3054 3838 Pnt 2305 3822 Pnt 3457 3823 Pnt 3129 3886 Pnt 3453 3863 Pnt 4608 3822 Pnt 2787 3884 Pnt 4622 3801 Pnt 3270 3870 Pnt 2836 3905 Pnt 2728 3792 Pnt 2157 3844 Pnt 2467 3835 Pnt 2312 3826 Pnt 3435 3824 Pnt 2759 3834 Pnt 3386 3824 Pnt 2914 3821 Pnt 2906 3821 Pnt 3078 3842 Pnt 2438 3819 Pnt 3954 3842 Pnt 3008 3937 Pnt 3379 3808 Pnt 2295 3891 Pnt 4006 3891 Pnt 2083 3822 Pnt 3440 3884 Pnt 3774 3885 Pnt 2071 3835 Pnt 2822 3801 Pnt 2429 3900 Pnt 2672 3832 Pnt 3101 3831 Pnt 3079 3813 Pnt 3566 3827 Pnt 3000 3827 Pnt 2495 3853 Pnt 2925 3822 Pnt 2719 3879 Pnt 3082 3892 Pnt 2538 3842 Pnt 2783 3876 Pnt 3009 3866 Pnt 2721 3875 Pnt 3637 3878 Pnt 2686 3850 Pnt 2994 3932 Pnt 4823 3879 Pnt 2639 3926 Pnt 3213 3835 Pnt 2159 3836 Pnt 2750 3789 Pnt 2237 3868 Pnt 2737 3864 Pnt 3129 3852 Pnt 2993 3872 Pnt 3275 3819 Pnt 3381 3842 Pnt 2788 3810 Pnt 3824 3842 Pnt 3624 3806 Pnt 2619 3840 Pnt 4135 3822 Pnt 2065 3895 Pnt 2638 3811 Pnt 2969 3851 Pnt 2914 3838 Pnt 4867 3850 Pnt 3834 3832 Pnt 3930 3831 Pnt 3391 3771 Pnt 3257 3812 Pnt 3446 3870 Pnt 2605 3884 Pnt 4254 3818 Pnt 3894 3861 Pnt 2660 3905 Pnt 2693 3792 Pnt 2070 3844 Pnt 2692 3835 Pnt 4336 3863 Pnt 2901 3826 Pnt 2858 3835 Pnt 2627 3834 Pnt 3145 3821 Pnt 2470 3819 Pnt 4340 3815 Pnt 3483 3814 Pnt 2745 3950 Pnt 2666 3842 Pnt 5181 3884 Pnt 3053 3861 Pnt 2454 3937 Pnt 2382 3826 Pnt 4633 3862 Pnt 3285 3824 Pnt 2388 3799 Pnt 3011 3803 Pnt 2788 3799 Pnt 2867 3891 Pnt 4660 3859 Pnt 2395 3900 Pnt 3545 3832 Pnt 3820 3884 Pnt 3651 3827 Pnt 3133 3879 Pnt 2929 3866 Pnt 2889 3818 Pnt 3479 3855 Pnt 2756 3932 Pnt 3742 3811 Pnt 3894 3838 Pnt 2634 3837 Pnt 3509 3838 Pnt 3042 3838 Pnt 3671 3814 Pnt 2046 3794 Pnt 2198 3836 Pnt 2480 3856 Pnt 2412 3884 Pnt 3041 3789 Pnt 2367 3931 Pnt 2382 3797 Pnt 3070 3872 Pnt 4140 3797 Pnt 2088 3856 Pnt 3306 3806 Pnt 3228 3857 Pnt 2581 3895 Pnt 2846 3842 Pnt 2940 3811 Pnt 2299 3879 Pnt 4317 3796 Pnt 2672 3831 Pnt 2514 3782 Pnt 2799 3861 Pnt 3214 3838 Pnt 2662 3872 Pnt 2478 3822 Pnt 2891 3947 Pnt 2869 3860 Pnt 2610 3853 Pnt 2804 3833 Pnt 2719 3906 Pnt 4157 3833 Pnt 2975 3812 Pnt 2167 3868 Pnt 4857 3882 Pnt 4023 3788 Pnt 2562 3909 Pnt 2454 3871 Pnt 3722 3835 Pnt 3468 3801 Pnt 2754 3946 Pnt 3902 3819 Pnt 2522 3842 Pnt 4834 3868 Pnt 3932 3876 Pnt 3093 3868 Pnt 4652 3846 Pnt 3229 3861 Pnt 2509 3874 Pnt 2603 3933 Pnt 2844 3799 Pnt 3128 3884 Pnt 3563 3875 Pnt 4160 3884 Pnt 4007 3813 Pnt 4235 3864 Pnt 3251 3856 Pnt 2278 3797 Pnt 4654 3860 Pnt 3681 3875 Pnt 3261 3857 Pnt 2898 3833 Pnt 3525 3875 Pnt 3146 3832 Pnt 4504 3841 Pnt 4543 3884 Pnt 4102 3857 Pnt 3987 3836 Pnt 2769 3838 Pnt 3835 3833 Pnt 2955 3919 Pnt 3084 3919 Pnt 2835 3799 Pnt 2867 3813 Pnt 3472 3820 Pnt 2726 3820 Pnt 3216 3833 Pnt 4846 3819 Pnt 3191 3782 Pnt 1864 3856 Pnt 1615 3797 Pnt 3314 3809 Pnt 2475 3822 Pnt 3433 3857 Pnt 3264 3840 Pnt 4422 3835 Pnt 3186 3906 Pnt 4402 3847 Pnt 3066 3836 Pnt 2301 3868 Pnt 3101 3807 Pnt 3917 3835 Pnt 2394 3803 Pnt 2108 3822 Pnt 2842 3832 Pnt 3770 3829 Pnt 4826 3832 Pnt 2279 3864 Pnt 3347 3885 Pnt 2725 3824 Pnt 2739 3826 Pnt 3743 3885 Pnt 2691 3840 Pnt 3239 3834 Pnt 3774 3841 Pnt 2444 3835 Pnt 3198 3834 Pnt 2576 3842 Pnt 2006 3799 Pnt 2642 3831 Pnt 2495 3811 Pnt 3462 3831 Pnt 2855 3813 Pnt 4645 3840 Pnt 3558 3833 Pnt 2944 3853 Pnt 3212 3814 Pnt 4065 3857 Pnt 2719 3853 Pnt 2194 3829 Pnt 3125 3822 Pnt 2836 3872 Pnt 3731 3822 Pnt 3934 3237 Pnt 2502 3947 Pnt 3457 3829 Pnt 2629 3858 Pnt 3008 3858 Pnt 2909 3809 Pnt 3548 3823 Pnt 3304 3824 Pnt 4412 3854 Pnt 3483 3869 Pnt 2834 3826 Pnt 3919 3845 Pnt 2813 3806 Pnt 3620 3826 Pnt 2006 3844 Pnt 4849 3880 Pnt 2359 3833 Pnt 2746 3838 Pnt 2395 3838 Pnt 3958 3876 Pnt 2097 3919 Pnt 3471 3224 Pnt 2383 3909 Pnt 3069 3833 Pnt 2413 3871 Pnt 2616 3782 Pnt 2748 3833 Pnt 2124 3801 Pnt 2599 3946 Pnt 2842 3812 Pnt 2740 3846 Pnt 2644 3854 Pnt 2439 3874 Pnt 2940 3933 Pnt 4268 3836 Pnt 3064 3884 Pnt 2728 3802 Pnt 4337 3836 Pnt 2949 3875 Pnt 2935 3871 Pnt 2517 3822 Pnt 2612 3799 Pnt 3226 3882 Pnt 2799 3848 Pnt 2726 3820 Pnt 2698 3855 Pnt 2737 3830 Pnt 2544 3829 Pnt 3131 3835 Pnt 2880 3906 Pnt 4826 3879 Pnt 2253 3864 Pnt 2770 3832 Pnt 4835 3872 Pnt 3099 3824 Pnt 3450 3885 Pnt 2693 3826 Pnt 3605 3826 Pnt 3748 3801 Pnt 3257 3857 Pnt 4217 3802 Pnt 3529 3834 Pnt 3197 3838 Pnt 3841 3840 Pnt 2328 3810 Pnt 2494 3838 Pnt 2106 3860 Pnt 2935 3858 Pnt 2090 3919 Pnt 2645 3809 Pnt 2863 3812 Pnt 2668 3824 Pnt 2266 3909 Pnt 2669 3910 Pnt 2749 3846 Pnt 3160 3833 Pnt 2320 3860 Pnt 2748 3782 Pnt 3341 3860 Pnt 2532 3833 Pnt 1999 3844 Pnt 4601 3875 Pnt 2486 3862 Pnt 1975 3801 Pnt 2648 3851 Pnt 3422 3839 Pnt 3238 3835 Pnt 4601 3889 Pnt 5038 3864 Pnt 2341 3836 Pnt 2901 3879 Pnt 4085 3850 Pnt 4455 3817 Pnt 4359 3818 Pnt 4329 3815 Pnt 3310 3861 Pnt 2667 3802 Pnt 3194 3864 Pnt 4048 3834 Pnt 3157 3821 Pnt 3086 3771 Pnt 2954 3810 Pnt 4272 3835 Pnt 2792 3790 Pnt 2963 3858 Pnt 1883 3916 Pnt 3301 3803 Pnt 2828 3938 Pnt 4047 3813 Pnt 2388 3900 Pnt 3198 3830 Pnt 3860 3807 Pnt 4185 3808 Pnt 3765 3828 Pnt 3464 3834 Pnt 3393 3857 Pnt 3334 3826 Pnt 3540 3839 Pnt 2964 3840 Pnt 3162 3837 Pnt 4178 3840 Pnt 2607 3944 Pnt 3861 3838 Pnt 3244 3838 Pnt 2685 3944 Pnt 2349 3836 Pnt 2373 3910 Pnt 2657 3836 Pnt 2394 3835 Pnt 2549 3826 Pnt 4210 3858 Pnt 2767 3851 Pnt 3588 3809 Pnt 3137 3806 Pnt 2451 3860 Pnt 2556 3828 Pnt 3509 3806 Pnt 3228 3836 Pnt 2446 3781 Pnt 4787 3867 Pnt 1875 3895 Pnt 4942 3832 Pnt 2865 3806 Pnt 2540 3838 Pnt 2450 3879 Pnt 2921 3848 Pnt 2761 3862 Pnt 3513 3819 Pnt 3732 3848 Pnt 3213 3868 Pnt 4213 3833 Pnt 3389 3823 Pnt 3867 3865 Pnt 4129 3845 Pnt 3986 3793 Pnt 4239 3848 Pnt 2325 3851 Pnt 2564 3823 Pnt 3985 3815 Pnt 2031 3799 Pnt 3324 3850 Pnt 2628 3831 Pnt 2912 3853 Pnt 2107 3820 Pnt 4918 3830 Pnt 3051 3838 Pnt 2967 3813 Pnt 2183 3891 Pnt 3273 3850 Pnt 3973 3892 Pnt 3001 3866 Pnt 3362 3906 Pnt 2683 3834 Pnt 3765 3814 Pnt 2962 3840 Pnt 4341 3834 Pnt 3260 3802 Pnt 2679 3811 Pnt 4322 3872 Pnt 3389 3835 Pnt 4393 3878 Pnt 2712 3813 Pnt 4692 3895 Pnt 4157 3817 Pnt 2938 3821 Pnt 3201 3813 Pnt 3563 3843 Pnt 4643 3807 Pnt 4580 3813 Pnt 3640 3830 Pnt 4631 3830 Pnt 3126 3833 Pnt 4583 3893 Pnt 2970 3841 Pnt 4343 3846 Pnt 4106 3891 Pnt 3797 3866 Pnt 3164 3828 Pnt 3041 3840 Pnt 4276 3893 Pnt 4537 3805 Pnt 2415 3944 Pnt 2863 3842 Pnt 2798 3872 Pnt 2861 3836 Pnt 5167 3841 Pnt 3313 3810 Pnt 4033 3851 Pnt 4811 3857 Pnt 3045 3812 Pnt 3038 3847 Pnt 2316 3826 Pnt 2409 3796 Pnt 2633 3846 Pnt 2803 3793 Pnt 3111 3839 Pnt 2754 3854 Pnt 3769 3843 Pnt 3121 3933 Pnt 4756 3271 Pnt 3242 3837 Pnt 2515 3884 Pnt 3205 3864 Pnt 5275 3871 Pnt 3624 3838 Pnt 4021 3418 Pnt 2599 3910 Pnt 3366 3871 Pnt 2519 3858 Pnt 2125 3828 Pnt 1911 3895 Pnt 3265 3821 Pnt 3714 3839 Pnt 3094 3799 Pnt 2849 3814 Pnt 3441 3843 Pnt 2690 3813 Pnt 3124 3882 Pnt 3199 3882 Pnt 2633 3872 Pnt 3277 3848 Pnt 2619 3848 Pnt 2317 3848 Pnt 2504 3829 Pnt 3690 3835 Pnt 4515 3829 Pnt 3080 3824 Pnt 4685 3865 Pnt 4955 3842 Pnt 4299 3835 Pnt 3820 3876 Pnt 2412 3852 Pnt 3196 3852 Pnt 3183 3878 Pnt 4121 3835 Pnt 3729 3848 Pnt 3306 3846 Pnt 2748 3908 Pnt 3097 3820 Pnt 2689 3824 Pnt 3628 3820 Pnt 3355 3835 Pnt 4924 3848 Pnt 4341 3834 Pnt 3848 3843 Pnt 2686 3882 Pnt 3645 3830 Pnt 4244 3818 Pnt 3955 3837 Pnt 3717 3819 Pnt 3892 3860 Pnt 4832 3842 Pnt 3804 3837 Pnt 3327 3867 Pnt 2410 3829 Pnt 3099 3851 Pnt 2985 3838 Pnt 2703 3860 Pnt 2644 3806 Pnt 3688 3838 Pnt 3765 3826 Pnt 2838 3852 Pnt 3026 3846 Pnt 4082 3812 Pnt 4093 3850 Pnt 5280 3865 Pnt 3712 3386 Pnt 3057 3824 Pnt 3871 3824 Pnt 3003 3834 Pnt 2727 3843 Pnt 4532 3864 Pnt 3753 3834 Pnt 2203 3884 Pnt 2683 3864 Pnt 3746 3819 Pnt 2090 3848 Pnt 3614 3892 Pnt 2652 3829 Pnt 4359 3831 Pnt 2538 3867 Pnt 3193 3851 Pnt 3628 3835 Pnt 4637 3851 Pnt 2518 3835 Pnt 2758 3781 Pnt 2686 3806 Pnt 3126 3821 Pnt 4998 3833 Pnt 2695 3826 Pnt 2235 3813 Pnt 3408 3821 Pnt 2489 3872 Pnt 3144 3830 Pnt 1993 3799 Pnt 2510 3853 Pnt 3105 3905 Pnt 2074 3820 Pnt 3188 3835 Pnt 3119 3813 Pnt 2956 3832 Pnt 2733 3855 Pnt 2819 3821 Pnt 4223 3855 Pnt 3363 3821 Pnt 2978 3910 Pnt 2821 3834 Pnt 2898 3840 Pnt 4837 3851 Pnt 2402 3826 Pnt 1971 3796 Pnt 2721 3846 Pnt 2675 3793 Pnt 2827 3843 Pnt 3075 3933 Pnt 2762 3837 Pnt 4428 3872 Pnt 2436 3866 Pnt 2500 3818 Pnt 2671 3855 Pnt 3896 3838 Pnt 2337 3932 Pnt 2793 3932 Pnt 2687 3811 Pnt 3627 3848 Pnt 3619 3837 Pnt 2701 3851 Pnt 2417 3926 Pnt 2007 3794 Pnt 2870 3836 Pnt 2023 3884 Pnt 2515 3790 Pnt 2611 3932 Pnt 2428 3947 Pnt 4914 3796 Pnt 4238 3115 Pnt 3869 3880 Pnt 2803 3821 Pnt 3029 3814 Pnt 2755 3833 Pnt 2666 3835 Pnt 5251 3287 Pnt 2535 3910 Pnt 2759 3834 Pnt 4871 3876 Pnt 3493 3818 Pnt 3818 3813 Pnt 1972 3932 Pnt 2553 3821 Pnt 2556 3811 Pnt 2578 3844 Pnt 3489 3878 Pnt 4095 3821 Pnt 2042 3830 Pnt 2078 3878 Pnt 2329 3823 Pnt 2609 3823 Pnt 2168 3806 Pnt 2905 3814 Pnt 2444 3855 Pnt 3222 3908 Pnt 2557 3882 Pnt 4248 3872 Pnt 2972 3853 Pnt 2445 3810 Pnt 2574 3810 Pnt 2847 3932 Pnt 3722 3820 Pnt 2974 3844 Pnt 2333 3865 Pnt 2793 3833 Pnt 5246 3813 Pnt 2817 3859 Pnt 2788 3882 Pnt 2287 3886 Pnt 1741 3916 Pnt 4195 3880 Pnt 3243 3837 Pnt 3201 3860 Pnt 3627 3802 Pnt 3074 3838 Pnt 2925 3855 Pnt 3601 3808 Pnt 2941 3852 Pnt 2265 3933 Pnt 3170 3841 Pnt 2186 3897 Pnt 2727 3846 Pnt 4071 3897 Pnt 3991 3849 Pnt 3476 3850 Pnt 3636 3891 Pnt 2657 3843 Pnt 3839 3891 Pnt 4964 3825 Pnt 3101 3923 Pnt 3355 3848 Pnt 2831 3944 Pnt 3181 3947 Pnt 2957 3842 Pnt 2676 3842 Pnt 3961 3839 Pnt 2408 3893 Pnt 3115 3872 Pnt 2452 3829 Pnt 2958 3853 Pnt 2424 3836 Pnt 2891 3831 Pnt 2785 3905 Pnt 2399 3781 Pnt 2812 3819 Pnt 4016 3781 Pnt 2993 3847 Pnt 3540 3835 Pnt 3621 3810 Pnt 2801 3832 Pnt 3227 3847 Pnt 4004 3878 Pnt 3043 3855 Pnt 4565 3886 Pnt 2745 3840 Pnt 2782 3834 Pnt 2821 3910 Pnt 2234 3871 Pnt 2671 3818 Pnt 3580 3840 Pnt 2853 3858 Pnt 4710 3855 Pnt 5060 3857 Pnt 4221 3849 Pnt 3620 3844 Pnt 2878 3935 Pnt 2455 3799 Pnt 2991 3846 Pnt 3008 3819 Pnt 3114 3830 Pnt 2791 3821 Pnt 2365 3817 Pnt 3002 3834 Pnt 1956 3830 Pnt 3105 3815 Pnt 2524 3926 Pnt 3541 3820 Pnt 2608 3866 Pnt 3437 3838 Pnt 2726 3823 Pnt 2540 3872 Pnt 3197 3818 Pnt 2907 3882 Pnt 2598 3790 Pnt 3226 3882 Pnt 2564 3860 Pnt 3749 3860 Pnt 3293 3826 Pnt 2329 3826 Pnt 3017 3885 Pnt 3232 3885 Pnt 2972 3830 Pnt 2982 3827 Pnt 2198 3861 Pnt 4119 3833 Pnt 2745 3855 Pnt 5186 3818 Pnt 2496 3209 Pnt 2988 3855 Pnt 2776 3813 Pnt 2219 3852 Pnt 2002 3933 Pnt 3255 3933 Pnt 3502 3880 Pnt 3174 3841 Pnt 2850 3846 Pnt 3182 3846 Pnt 3070 3849 Pnt 3338 3849 Pnt 3130 3837 Pnt 2517 3845 Pnt 5060 3880 Pnt 3451 3839 Pnt 3697 3832 Pnt 2676 3897 Pnt 3038 3835 Pnt 4730 3838 Pnt 3678 3840 Pnt 2844 3850 Pnt 2762 3814 Pnt 2872 3886 Pnt 4218 3799 Pnt 3130 3814 Pnt 4919 3824 Pnt 3104 3882 Pnt 3237 3824 Pnt 3846 3842 Pnt 3618 3851 Pnt 4562 3882 Pnt 4561 3842 Pnt 4645 3830 Pnt 3621 3817 Pnt 2498 3815 Pnt 4463 3889 Pnt 2762 3860 Pnt 3116 3855 Pnt 3044 3856 Pnt 5027 3853 Pnt 2444 3943 Pnt 2663 3826 Pnt 2687 3854 Pnt 2720 3885 Pnt 2320 3933 Pnt 4826 3834 Pnt 3236 3813 Pnt 4489 3933 Pnt 2574 3870 Pnt 3557 3861 Pnt 5214 3854 Pnt 2843 3849 Pnt 3164 3837 Pnt 2999 3845 Pnt 3727 3813 Pnt 3339 3840 Pnt 3340 3845 Pnt 3801 3841 Pnt 5102 3840 Pnt 4270 3813 Pnt 4313 3845 Pnt 4313 3819 Pnt 3288 3837 Pnt 2130 3947 Pnt 2375 3867 Pnt 2231 3897 Pnt 2938 3835 Pnt 3851 3897 Pnt 3546 3799 Pnt 3759 3842 Pnt 2865 3893 Pnt 3583 3893 Pnt 3085 3829 Pnt 4222 3830 Pnt 3144 3825 Pnt 2912 3767 Pnt 3878 3765 Pnt 3410 3847 Pnt 3601 3765 Pnt 4397 3847 Pnt 3914 3821 Pnt 4956 3851 Pnt 3128 3837 Pnt 4555 3857 Pnt 4101 3832 Pnt 3281 3832 Pnt 5101 3862 Pnt 2474 3917 Pnt 3013 3858 Pnt 2859 3847 Pnt 3259 3910 Pnt 2826 3874 Pnt 4698 3837 Pnt 2565 3840 Pnt 3399 3839 Pnt 3351 3822 Pnt 2359 3910 Pnt 2444 3822 Pnt 3750 3839 Pnt 3321 3800 Pnt 2294 3871 Pnt 4827 3872 Pnt 2577 3846 Pnt 2513 3818 Pnt 2471 3935 Pnt 3496 3810 Pnt 3089 3840 Pnt 2897 3846 Pnt 3310 3846 Pnt 2144 3806 Pnt 3106 3843 Pnt 2422 3841 Pnt 2768 3821 Pnt 4344 3813 Pnt 2471 3934 Pnt 3074 3847 Pnt 3968 3806 Pnt 3019 3844 Pnt 3317 3893 Pnt 3127 3831 Pnt 2927 3819 Pnt 2018 3830 Pnt 3173 3945 Pnt 3603 3831 Pnt 2675 3837 Pnt 2939 3846 Pnt 4051 3945 Pnt 3502 3872 Pnt 2440 3820 Pnt 2999 3786 Pnt 2444 3926 Pnt 3274 3844 Pnt 3523 3926 Pnt 2808 3865 Pnt 3227 3866 Pnt 2924 3932 Pnt 4036 3829 Pnt 2961 3897 Pnt 2508 3830 Pnt 3161 3899 Pnt 2803 3817 Pnt 3538 3835 Pnt 2413 3799 Pnt 3107 3835 Pnt 2226 3842 Pnt 2798 3834 Pnt 3943 3834 Pnt 3242 3893 Pnt 2530 3882 Pnt 2235 3825 Pnt 2343 3819 Pnt 2684 3822 Pnt 2304 3858 Pnt 2816 3942 Pnt 3487 3811 Pnt 4336 3810 Pnt 4139 3814 Pnt 4899 3849 Pnt 3016 3826 Pnt 2143 3885 Pnt 3523 3846 Pnt 2617 3933 Pnt 3542 3832 Pnt 3180 3861 Pnt 2922 3870 Pnt 2795 3849 Pnt 3339 3870 Pnt 3913 3805 Pnt 3507 3843 Pnt 2856 3917 Pnt 2980 3841 Pnt 3402 3841 Pnt 2669 3858 Pnt 2687 3934 Pnt 2273 3829 Pnt 2816 3847 Pnt 4328 3891 Pnt 4639 3854 Pnt 5202 3816 Pnt 5050 3864 Pnt 4075 3847 Pnt 5019 3868 Pnt 2952 3910 Pnt 2661 3872 Pnt 3408 3908 Pnt 3436 3425 Pnt 3138 3870 Pnt 3711 3822 Pnt 3059 3853 Pnt 2553 3830 Pnt 2797 3945 Pnt 3145 3846 Pnt 3329 3846 Pnt 2187 3819 Pnt 3927 3945 Pnt 2853 3874 Pnt 3348 3818 Pnt 1945 3910 Pnt 3638 3786 Pnt 2758 3866 Pnt 4226 3831 Pnt 3336 3786 Pnt 3647 3868 Pnt 3100 3844 Pnt 3160 3823 Pnt 2337 3932 Pnt 2650 3899 Pnt 3928 3835 Pnt 2875 3830 Pnt 3403 3819 Pnt 3568 3899 Pnt 2599 3855 Pnt 2862 3926 Pnt 3005 3835 Pnt 4575 3841 Pnt 3431 3844 Pnt 3807 3804 Pnt 3100 3817 Pnt 2764 3817 Pnt 2289 3799 Pnt 3303 3804 Pnt 2816 3905 Pnt 2029 3882 Pnt 3883 3838 Pnt 4417 3894 Pnt 2030 3823 Pnt 2806 3872 Pnt 2490 3818 Pnt 2426 3790 Pnt 4414 3851 Pnt 2963 3803 Pnt 4882 3853 Pnt 3029 3851 Pnt 3049 3829 Pnt 3913 3880 Pnt 4946 3830 Pnt 3132 3840 Pnt 3358 3867 Pnt 3079 3935 Pnt 2115 3806 Pnt 4869 3355 Pnt 3774 3868 Pnt 4409 3813 Pnt 4782 3863 Pnt 4343 3828 Pnt 4772 3868 Pnt 5033 3882 Pnt 3664 3810 Pnt 2956 3942 Pnt 2674 3826 Pnt 4183 3814 Pnt 3914 3827 Pnt 2735 3808 Pnt 4102 3827 Pnt 3257 3805 Pnt 3434 3886 Pnt 1914 3933 Pnt 3182 3841 Pnt 3052 3870 Pnt 4292 3842 Pnt 2398 3917 Pnt 4224 3846 Pnt 3423 3886 Pnt 4195 3837 Pnt 3902 3839 Pnt 4009 3822 Pnt 4122 3826 Pnt 2418 3818 Pnt 4682 3818 Pnt 1991 3910 Pnt 2476 3786 Pnt 3634 3910 Pnt 3017 3823 Pnt 4077 3810 Pnt 2493 3845 Pnt 4367 3842 Pnt 3859 3823 Pnt 3419 3819 Pnt 2624 3860 Pnt 3572 3835 Pnt 2532 3838 Pnt 3865 3805 Pnt 3488 3805 Pnt 4030 3839 Pnt 2524 3855 Pnt 3705 3819 Pnt 2816 3804 Pnt 2621 3905 Pnt 2288 3858 Pnt 2207 3872 Pnt 2771 3817 Pnt 5139 3797 Pnt 2322 3874 Pnt 4798 3886 Pnt 2832 3878 Pnt 3085 3790 Pnt 2159 3858 Pnt 2969 3804 Pnt 3269 3816 Pnt 2719 3868 Pnt 3722 3844 Pnt 2222 3930 Pnt 4181 3816 Pnt 3112 3855 Pnt 2998 3899 Pnt 3681 3860 Pnt 2689 3830 Pnt 2631 3905 Pnt 3732 3883 Pnt 2962 3883 Pnt 3444 3846 Pnt 3005 3789 Pnt 3303 3789 Pnt 2929 3926 Pnt 4386 3817 Pnt 3041 3867 Pnt 2536 3843 Pnt 2859 3933 Pnt 2674 3858 Pnt 2345 3934 Pnt 3557 3894 Pnt 2734 3808 Pnt 1801 3933 Pnt 3342 3808 Pnt 1906 3841 Pnt 4048 3841 Pnt 3024 3942 Pnt 2909 3880 Pnt 2905 3827 Pnt 2914 3857 Pnt 3894 3847 Pnt 2736 3917 Pnt 3913 3800 Pnt 3207 3917 Pnt 3113 3868 Pnt 4878 3819 Pnt 2886 3826 Pnt 1896 3910 Pnt 3571 3846 Pnt 2302 3845 Pnt 2418 3860 Pnt 3060 3870 Pnt 2701 3818 Pnt 3155 3835 Pnt 1939 3786 Pnt 2469 3838 Pnt 2556 3948 Pnt 3199 3805 Pnt 4158 3948 Pnt 4407 3807 Pnt 3707 3823 Pnt 4245 3822 Pnt 2810 3855 Pnt 3505 3847 Pnt 3381 3819 Pnt 2963 3856 Pnt 3162 3904 Pnt 4156 3862 Pnt 2623 3872 Pnt 2983 3804 Pnt 2496 3908 Pnt 3106 3790 Pnt 3007 3905 Pnt 4606 3813 Pnt 3499 3872 Pnt 3703 3816 Pnt 2460 3846 Pnt 3514 3789 Pnt 3937 3849 Pnt 3368 3894 Pnt 2698 3808 Pnt 2681 3827 Pnt 2988 3917 Pnt 4740 3816 Pnt 4094 3846 Pnt 5128 3813 Pnt 3452 3863 Pnt 4054 3828 Pnt 3767 3837 Pnt 2492 3872 Pnt 3223 3834 Pnt 4372 3816 Pnt 3790 3826 Pnt 5026 3810 Pnt 3982 3813 Pnt 2920 3818 Pnt 3195 3853 Pnt 4619 3811 Pnt 3441 3810 Pnt 4039 3809 Pnt 2853 3845 Pnt 1999 3860 Pnt 3765 3829 Pnt 3801 3848 Pnt 3317 3813 Pnt 3736 3829 Pnt 2114 3838 Pnt 4246 3860 Pnt 2777 3790 Pnt 4476 3835 Pnt 3956 3827 Pnt 2671 3849 Pnt 4027 3813 Pnt 2757 3832 Pnt 3992 3872 Pnt 3413 3817 Pnt 3533 3864 Pnt 3308 3816 Pnt 2859 3894 Pnt 2712 3827 Pnt 1973 3917 Pnt 4416 3916 Pnt 4326 3814 Pnt 4180 3816 Pnt 3751 3817 Pnt 4172 3885 Pnt 3126 3842 Pnt 2802 3804 Pnt 3935 3812 Pnt 4136 3815 Pnt 3139 3868 Pnt 5041 3882 Pnt 2224 3323 Pnt 3503 3933 Pnt 3520 3811 Pnt 1961 3899 Pnt 1841 3933 Pnt 1852 3841 Pnt 2763 3840 Pnt 2207 3830 Pnt 3006 3942 Pnt 3257 3905 Pnt 3519 3851 Pnt 2823 3838 Pnt 2536 3857 Pnt 2684 3840 Pnt 2948 3800 Pnt 2705 3928 Pnt 2802 3881 Pnt 3043 3881 Pnt 2876 3843 Pnt 3366 3858 Pnt 2768 3934 Pnt 2143 3809 Pnt 4486 3856 Pnt 2877 3826 Pnt 2747 3921 Pnt 4262 3921 Pnt 3448 3846 Pnt 3898 3822 Pnt 3226 3869 Pnt 3385 3822 Pnt 2578 3948 Pnt 3318 3807 Pnt 4961 3818 Pnt 2702 3855 Pnt 4461 3807 Pnt 3362 3842 Pnt 5100 3854 Pnt 3499 3819 Pnt 2817 3837 Pnt 3120 3834 Pnt 4700 3872 Pnt 4783 3833 Pnt 4138 3824 Pnt 3849 3815 Pnt 4853 3434 Pnt 5144 3859 Pnt 4183 3831 Pnt 4097 3811 Pnt 3383 3837 Pnt 2843 3853 Pnt 3441 3886 Pnt 3193 3806 Pnt 4118 3812 Pnt 4795 3886 Pnt 3965 3818 Pnt 3751 3808 Pnt 4058 3813 Pnt 3825 3841 Pnt 2770 3797 Pnt 4186 3797 Pnt 4372 3814 Pnt 2907 3851 Pnt 3654 3862 Pnt 3799 3857 Pnt 2738 3802 Pnt 4186 3863 Pnt 2826 3847 Pnt 3261 3802 Pnt 3219 3819 Pnt 4387 3815 Pnt 3409 3856 Pnt 3770 3835 Pnt 2772 3904 Pnt 3135 3894 Pnt 3164 3880 Pnt 3915 3809 Pnt 4206 3904 Pnt 2762 3908 Pnt 2938 3848 Pnt 2862 3905 Pnt 2418 3846 Pnt 4956 3846 Pnt 3431 3790 Pnt 2166 3818 Pnt 3785 3813 Pnt 4037 3801 Pnt 5064 3835 Pnt 2364 3869 Pnt 3494 3861 Pnt 4278 3827 Pnt 3949 3849 Pnt 2637 3820 Pnt 3823 3851 Pnt 2619 3800 Pnt 3091 3881 Pnt 2965 3881 Pnt 3367 3843 Pnt 3088 3921 Pnt 4297 3887 Pnt 5186 3861 Pnt 3172 3867 Pnt 3694 3883 Pnt 3017 3855 Pnt 3575 3848 Pnt 2862 3822 Pnt 3122 3842 Pnt 4682 3867 Pnt 4198 3813 Pnt 3590 3804 Pnt 3678 3807 Pnt 2375 3925 Pnt 2015 3933 Pnt 4760 3394 Pnt 2213 3899 Pnt 2437 3860 Pnt 2781 3935 Pnt 2353 3839 Pnt 4109 3869 Pnt 2775 3840 Pnt 2564 3855 Pnt 2395 3830 Pnt 3629 3860 Pnt 3971 3860 Pnt 2867 3833 Pnt 5085 3850 Pnt 4270 3825 Pnt 3867 3790 Pnt 3496 3821 Pnt 4282 3867 Pnt 4927 3801 Pnt 4364 3816 Pnt 3870 3809 Pnt 4772 3819 Pnt 3527 3807 Pnt 4837 3872 Pnt 4184 3813 Pnt 2718 3827 Pnt 2959 3872 Pnt 2958 3849 Pnt 3298 3826 Pnt 3040 3841 Pnt 4138 3825 Pnt 4599 3871 Pnt 3543 3841 Pnt 4151 3841 Pnt 2745 3863 Pnt 3873 3877 Pnt 2950 3862 Pnt 2033 3859 Pnt 3081 3864 Pnt 2970 3816 Pnt 2862 3916 Pnt 3512 3856 Pnt 3941 3862 Pnt 4154 3870 Pnt 3470 3813 Pnt 4434 3826 Pnt 3736 3804 Pnt 2261 3935 Pnt 3184 3869 Pnt 4083 3869 Pnt 3518 3834 Pnt 4437 3818 Pnt 3490 3801 Pnt 2414 3821 Pnt 3313 3867 Pnt 2628 3827 Pnt 3047 3872 Pnt 3918 3834 Pnt 2949 3833 Pnt 2745 3843 Pnt 5375 3872 Pnt 3461 3880 Pnt 4626 3839 Pnt 5050 3845 Pnt 4128 3880 Pnt 2432 3859 Pnt 2830 3813 Pnt 4927 3864 Pnt 3046 3801 Pnt 3259 3820 Pnt 2730 3827 Pnt 5273 3866 Pnt 2949 3368 Pnt 4274 3815 Pnt 3028 3843 Pnt 4312 3815 Pnt 4975 3918 Pnt 4305 3807 Pnt 4168 3856 Pnt 4194 3880 Pnt 3761 3874 Pnt 3533 3825 Pnt 2687 3813 Pnt 4321 3911 Pnt 3527 3801 Pnt 3389 3814 Pnt 4603 3837 Pnt 3187 3889 Pnt 4470 3863 Pnt 3815 3889 Pnt 4642 3814 Pnt 2709 3825 Pnt 4930 3856 Pnt 3590 3814 Pnt 4379 3884 Pnt 2693 3882 Pnt 2316 3900 Pnt 3916 3885 Pnt 2758 3846 Pnt 2758 3790 Pnt 3887 3846 Pnt 2284 3818 Pnt 3446 3837 Pnt 2992 3831 Pnt 2670 3869 Pnt 2676 3834 Pnt 3275 3834 Pnt 2974 3895 Pnt 3111 3841 Pnt 4062 3876 Pnt 3306 3819 Pnt 3344 3921 Pnt 4603 3860 Pnt 3728 3860 Pnt 4725 3921 Pnt 4284 3867 Pnt 2952 3860 Pnt 2923 3834 Pnt 4546 3857 Pnt 4027 3842 Pnt 4730 3905 Pnt 4895 3914 Pnt 4463 3821 Pnt 3805 3890 Pnt 4244 3863 Pnt 4301 3871 Pnt 3682 3888 Pnt 3333 3863 Pnt 3718 3888 Pnt 4506 3856 Pnt 3164 3881 Pnt 3511 3864 Pnt 2874 3816 Pnt 3357 3864 Pnt 1877 3915 Pnt 4098 3886 Pnt 2790 3882 Pnt 3352 3856 Pnt 2453 3905 Pnt 2835 3880 Pnt 3289 3935 Pnt 2709 3836 Pnt 3273 3878 Pnt 3223 3866 Pnt 2785 3839 Pnt 3100 3928 Pnt 2760 3863 Pnt 2740 3939 Pnt 4099 3939 Pnt 2206 3872 Pnt 3177 3809 Pnt 3018 3843 Pnt 5008 3864 Pnt 4294 3852 Pnt 3805 3800 Pnt 1741 3777 Pnt 4769 3833 Pnt 2984 3856 Pnt 2887 3948 Pnt 2506 3921 Pnt 3747 3875 Pnt 3158 3841 Pnt 5019 3837 Pnt 5290 3830 Pnt 3412 3846 Pnt 4347 3864 Pnt 4859 3866 Pnt 4382 3289 Pnt 3441 3855 Pnt 3063 3849 Pnt 3977 3834 Pnt 3187 3857 Pnt 4254 3841 Pnt 3286 3855 Pnt 4304 3849 Pnt 4362 3841 Pnt 4889 3890 Pnt 4849 3835 Pnt 3215 3839 Pnt 3874 3877 Pnt 3154 3928 Pnt 3561 3872 Pnt 2543 3853 Pnt 4111 3861 Pnt 3115 3939 Pnt 3521 3861 Pnt 3740 3861 Pnt 3708 3843 Pnt 2433 3800 Pnt 3625 3861 Pnt 2992 3877 Pnt 2548 3948 Pnt 2124 3910 Pnt 3165 3841 Pnt 5133 3910 Pnt 4308 3870 Pnt 4946 3861 Pnt 4974 3834 Pnt 5056 3871 Pnt 4497 3864 Pnt 2863 3814 Pnt 3358 3884 Pnt 2717 3810 Pnt 3183 3853 Pnt 2935 3886 Pnt 3712 3886 Pnt 3733 3857 Pnt 2819 3843 Pnt 2965 3882 Pnt 2778 3869 Pnt 2869 3797 Pnt 2205 3900 Pnt 2377 3846 Pnt 3172 3862 Pnt 2487 3790 Pnt 3957 3814 Pnt 2909 3837 Pnt 3442 3843 Pnt 2764 3839 Pnt 4229 3833 Pnt 2594 3857 Pnt 4706 3858 Pnt 3059 3802 Pnt 4009 3799 Pnt 3924 3818 Pnt 2205 3843 Pnt 2323 3800 Pnt 3752 3863 Pnt 2874 3904 Pnt 2386 3908 Pnt 2802 3848 Pnt 2861 3801 Pnt 4097 3908 Pnt 3121 3809 Pnt 4182 3854 Pnt 3460 3847 Pnt 4957 3817 Pnt 2954 3855 Pnt 3173 3848 Pnt 4203 3801 Pnt 2517 3822 Pnt 4891 3831 Pnt 3199 3866 Pnt 3701 3842 Pnt 2789 3925 Pnt 3487 3860 Pnt 3437 3933 Pnt 3286 3842 Pnt 2503 3836 Pnt 4415 3860 Pnt 2466 3865 Pnt 3004 3821 Pnt 2334 3839 Pnt 2707 3840 Pnt 3376 3879 Pnt 3342 3855 Pnt 3343 3856 Pnt 2569 3884 Pnt 2833 3816 Pnt 3305 3920 Pnt 4793 3920 Pnt 3598 3856 Pnt 2681 3895 Pnt 3343 3880 Pnt 5019 3833 Pnt 2972 3871 Pnt 3157 3835 Pnt 3290 3874 Pnt 3227 3849 Pnt 4219 3871 Pnt 2370 3833 Pnt 2892 3884 Pnt 2394 3853 Pnt 3638 3825 Pnt 3391 3886 Pnt 3277 3801 Pnt 2778 3873 Pnt 2497 3900 Pnt 3926 3794 Pnt 5611 3860 Pnt 4412 3474 Pnt 3739 3830 Pnt 5131 3805 Pnt 5172 3803 Pnt 1932 3777 Pnt 4255 3888 Pnt 3608 3783 Pnt 4227 3831 Pnt 4735 3831 Pnt 3232 3839 Pnt 2867 3857 Pnt 3013 3799 Pnt 4737 3801 Pnt 2031 3832 Pnt 2133 3928 Pnt 2679 3843 Pnt 2427 3800 Pnt 4243 3864 Pnt 3133 3904 Pnt 2864 3908 Pnt 2937 3827 Pnt 2936 3809 Pnt 3786 3881 Pnt 4200 3852 Pnt 5112 3858 Pnt 2600 3882 Pnt 5291 3806 Pnt 3273 3882 Pnt 2334 3935 Pnt 3232 3833 Pnt 2726 3836 Pnt 3181 3934 Pnt 3174 3843 Pnt 2876 3843 Pnt 3198 3855 Pnt 2943 3933 Pnt 2450 3822 Pnt 4159 3820 Pnt 2403 3872 Pnt 4375 3837 Pnt 5028 3869 Pnt 4253 3866 Pnt 3069 3818 Pnt 2888 3865 Pnt 4054 3818 Pnt 2874 3839 Pnt 4143 3826 Pnt 2437 3836 Pnt 3368 3843 Pnt 4543 3836 Pnt 2537 3943 Pnt 2387 3899 Pnt 2864 3816 Pnt 3131 3846 Pnt 2545 3920 Pnt 3212 3840 Pnt 4068 3836 Pnt 3335 3871 Pnt 2999 3884 Pnt 4435 3850 Pnt 3197 3858 Pnt 2818 3856 Pnt 2225 3900 Pnt 2548 3895 Pnt 4276 3861 Pnt 3178 3880 Pnt 2729 3874 Pnt 3212 3827 Pnt 2992 3884 Pnt 2693 3858 Pnt 4185 3839 Pnt 2836 3877 Pnt 4572 3877 Pnt 3717 3801 Pnt 3922 3837 Pnt 2702 3794 Pnt 3323 3834 Pnt 4619 3853 Pnt 4292 3870 Pnt 5377 3871 Pnt 4620 3834 Pnt 4344 3848 Pnt 3838 3811 Pnt 5009 3895 Pnt 4089 3838 Pnt 3739 3836 Pnt 5050 3878 Pnt 4150 3866 Pnt 3539 3831 Pnt 4670 3885 Pnt 3634 3864 Pnt 2577 3853 Pnt 3170 3839 Pnt 3231 3839 Pnt 3017 3871 Pnt 4574 3868 Pnt 2969 3799 Pnt 3220 3861 Pnt 3946 3806 Pnt 4764 3889 Pnt 3986 3849 Pnt 3261 3800 Pnt 3568 3810 Pnt 2886 3814 Pnt 2878 3904 Pnt 2828 3857 Pnt 2098 3857 Pnt 2686 3843 Pnt 2956 3827 Pnt 4053 3906 Pnt 4000 3878 Pnt 3097 3882 Pnt 2780 3933 Pnt 5071 3843 Pnt 2976 3856 Pnt 2626 3820 Pnt 2155 3832 Pnt 3422 3856 Pnt 2168 3928 Pnt 3230 3289 Pnt 2808 3948 Pnt 4177 3809 Pnt 2422 3846 Pnt 3221 3948 Pnt 2440 3910 Pnt 4804 3378 Pnt 3148 3865 Pnt 4259 3825 Pnt 2910 3818 Pnt 3670 3805 Pnt 3523 3862 Pnt 2604 3865 Pnt 3396 3815 Pnt 3946 3815 Pnt 2737 3882 Pnt 4101 3843 Pnt 4131 3874 Pnt 4429 3814 Pnt 4565 3866 Pnt 2771 3848 Pnt 2040 3934 Pnt 4618 3811 Pnt 3166 3836 Pnt 3289 3863 Pnt 4513 3851 Pnt 3088 3858 Pnt 4472 3863 Pnt 3811 3842 Pnt 3084 3818 Pnt 2768 3843 Pnt 4263 3811 Pnt 4751 3836 Pnt 3552 3843 Pnt 3130 3925 Pnt 2516 3943 Pnt 4836 3863 Pnt 3038 3148 Pnt 2855 3899 Pnt 2836 3814 Pnt 2785 3816 Pnt 3237 3846 Pnt 4001 3807 Pnt 4073 3848 Pnt 2159 3920 Pnt 2728 3840 Pnt 3225 3860 Pnt 4342 3813 Pnt 2917 3884 Pnt 4352 3884 Pnt 2759 3801 Pnt 4267 3812 Pnt 4466 3828 Pnt 4005 3808 Pnt 3514 3801 Pnt 4168 3810 Pnt 3363 3825 Pnt 4421 3812 Pnt 2735 3858 Pnt 2510 3877 Pnt 3754 3825 Pnt 2983 3794 Pnt 2437 3834 Pnt 3504 3885 Pnt 3132 3882 Pnt 5137 3882 Pnt 4104 3858 Pnt 4878 3837 Pnt 4360 3811 Pnt 3134 3869 Pnt 4964 3889 Pnt 4013 3868 Pnt 4748 3869 Pnt 3286 3861 Pnt 4318 3875 Pnt 4849 3868 Pnt 3666 3875 Pnt 3399 3839 Pnt 3946 3839 Pnt 2696 3906 Pnt 3645 3839 Pnt 4112 3806 Pnt 2354 3857 Pnt 4632 3854 Pnt 2983 3856 Pnt 2918 3809 Pnt 3831 3809 Pnt 3717 3818 Pnt 2177 3927 Pnt 2879 3846 Pnt 2029 3910 Pnt 2940 3820 Pnt 3407 3852 Pnt 3083 3852 Pnt 3146 3843 Pnt 2795 3848 Pnt 2525 3948 Pnt 2373 3934 Pnt 4140 3858 Pnt 3572 3834 Pnt 3718 3836 Pnt 3620 3834 Pnt 4023 3863 Pnt 4720 3857 Pnt 3195 3858 Pnt 4515 3851 Pnt 3759 3843 Pnt 2889 3866 Pnt 2924 3877 Pnt 3232 3816 Pnt 3480 3869 Pnt 2842 3858 Pnt 2929 3831 Pnt 3050 3837 Pnt 2992 3864 Pnt 2943 3868 Pnt 2942 3853 Pnt 4118 3848 Pnt 4388 3834 Pnt 3103 3829 Pnt 4991 3812 Pnt 2835 3874 Pnt 3568 3871 Pnt 3795 3874 Pnt 3948 3860 Pnt 2637 3843 Pnt 3016 3810 Pnt 3498 3860 Pnt 3342 3839 Pnt 3654 3944 Pnt 2678 3904 Pnt 2369 3899 Pnt 3326 3837 Pnt 4111 3809 Pnt 4373 3834 Pnt 3134 3801 Pnt 4734 3831 Pnt 3967 3885 Pnt 2051 3928 Pnt 3583 3924 Pnt 3887 3822 Pnt 3284 3791 Pnt 2681 3882 Pnt 3549 3855 Pnt 4264 3830 Pnt 4175 3861 Pnt 2713 3783 Pnt 3256 3783 Pnt 2946 3805 Pnt 3064 3836 Pnt 3123 3878 Pnt 2990 3873 Pnt 4294 3829 Pnt 2966 3856 Pnt 2542 3900 Pnt 4243 3873 Pnt 3700 3895 Pnt 3717 3878 Pnt 1946 3927 Pnt 2344 3846 Pnt 2880 3918 Pnt 2859 3852 Pnt 4266 3866 Pnt 1855 3934 Pnt 2821 3834 Pnt 3280 3842 Pnt 2144 3924 Pnt 5047 3804 Pnt 3953 3834 Pnt 2572 3866 Pnt 2466 3877 Pnt 4474 3274 Pnt 3176 3889 Pnt 3836 3816 Pnt 5007 3865 Pnt 2635 3916 Pnt 5136 3814 Pnt 2995 3808 Pnt 4930 3798 Pnt 3458 3884 Pnt 4520 3797 Pnt 3697 3843 Pnt 3991 3828 Pnt 2402 3857 Pnt 4167 3830 Pnt 3772 3867 Pnt 4699 3850 Pnt 4585 3884 Pnt 4284 3809 Pnt 4940 3871 Pnt 3065 3896 Pnt 4435 3832 Pnt 3638 3809 Pnt 3390 3875 Pnt 4339 3834 Pnt 1908 3830 Pnt 3931 3843 Pnt 3119 3874 Pnt 5263 3802 Pnt 4279 3808 Pnt 2978 3825 Pnt 3781 3797 Pnt 4757 3801 Pnt 3748 3801 Pnt 4186 3814 Pnt 3006 3806 Pnt 2445 3924 Pnt 4615 3924 Pnt 4162 3829 Pnt 3875 3791 Pnt 2392 3834 Pnt 2764 3878 Pnt 3897 3871 Pnt 2693 3839 Pnt 4618 3864 Pnt 3686 3838 Pnt 4576 3808 Pnt 3182 3814 Pnt 3317 3944 Pnt 4337 3840 Pnt 3755 3807 Pnt 4979 3868 Pnt 3777 3885 Pnt 2513 3843 Pnt 4726 3840 Pnt 3094 3843 Pnt 2729 3834 Pnt 4169 3831 Pnt 2292 3939 Pnt 2748 3924 Pnt 3916 3924 Pnt 4317 3846 Pnt 4355 3835 Pnt 3076 3856 Pnt 3205 3831 Pnt 4107 3871 Pnt 4206 3887 Pnt 4790 3856 Pnt 4134 3806 Pnt 3880 3804 Pnt 3102 3843 Pnt 3713 3860 Pnt 4334 3853 Pnt 4615 3866 Pnt 3155 3868 Pnt 3959 3810 Pnt 4682 3889 Pnt 4216 3800 Pnt 3777 3905 Pnt 3737 3818 Pnt 3112 3813 Pnt 4118 3818 Pnt 4913 3822 Pnt 4043 3801 Pnt 2519 3838 Pnt 3835 3783 Pnt 4702 3809 Pnt 4354 3809 Pnt 2604 3906 Pnt 3350 3797 Pnt 4616 3858 Pnt 2296 3857 Pnt 2193 3860 Pnt 2555 3843 Pnt 2934 3870 Pnt 4048 3858 Pnt 4242 3806 Pnt 2927 3851 Pnt 4021 3804 Pnt 4905 3886 Pnt 3556 3800 Pnt 2776 3835 Pnt 4277 3832 Pnt 3745 3818 Pnt 4005 3835 Pnt 4172 3797 Pnt 3763 3811 Pnt 2930 3820 Pnt 3096 3866 Pnt 3181 3796 Pnt 2973 3848 Pnt 3611 3796 Pnt 2974 3834 Pnt 2893 3948 Pnt 3100 3862 Pnt 2749 3944 Pnt 4773 3840 Pnt 3486 3862 Pnt 2584 3862 Pnt 2953 3862 Pnt 2822 3843 Pnt 2715 3858 Pnt 2875 3858 Pnt 3622 3871 Pnt 2535 3935 Pnt 3214 3851 Pnt 2549 3860 Pnt 5024 3900 Pnt 3311 3874 Pnt 2794 3829 Pnt 3859 3846 Pnt 4477 3851 Pnt 3502 3869 Pnt 4133 3805 Pnt 2737 3857 Pnt 2351 3882 Pnt 4925 3834 Pnt 3514 3855 Pnt 4206 3882 Pnt 3079 3916 Pnt 3227 3867 Pnt 2234 3900 Pnt 2073 3895 Pnt 3079 3878 Pnt 2326 3927 Pnt 2046 3846 Pnt 2742 3918 Pnt 2843 3852 Pnt 2073 3937 Pnt 3160 3834 Pnt 3270 3842 Pnt 5101 3842 Pnt 2457 3834 Pnt 2679 3866 Pnt 2143 3877 Pnt 4406 3891 Pnt 3323 3798 Pnt 4999 3867 Pnt 3544 3814 Pnt 3135 3889 Pnt 3888 3802 Pnt 4776 3854 Pnt 3308 3813 Pnt 2754 3853 Pnt 3271 3812 Pnt 4984 3131 Pnt 4463 3808 Pnt 3390 3861 Pnt 4840 3808 Pnt 3956 3875 Pnt 3919 3800 Pnt 3682 3862 Pnt 3407 3828 Pnt 3023 3813 Pnt 2472 3840 Pnt 4054 3859 Pnt 2812 3806 Pnt 2577 3862 Pnt 2632 3899 Pnt 3070 3809 Pnt 2348 3924 Pnt 2048 3836 Pnt 3305 3843 Pnt 3223 3858 Pnt 2825 3801 Pnt 2847 3935 Pnt 1800 3924 Pnt 2064 3784 Pnt 2784 3860 Pnt 4650 3843 Pnt 3136 3906 Pnt 3195 3878 Pnt 4198 3906 Pnt 2172 3873 Pnt 2833 3814 Pnt 5151 3258 Pnt 3842 3878 Pnt 3659 3437 Pnt 2818 3870 Pnt 2759 3851 Pnt 4210 3870 Pnt 4804 3832 Pnt 2797 3829 Pnt 3585 3829 Pnt 3053 3846 Pnt 4150 3238 Pnt 2862 3846 Pnt 3187 3857 Pnt 2752 3882 Pnt 3428 3882 Pnt 4088 3805 Pnt 2809 3797 Pnt 3588 3797 Pnt 2910 3838 Pnt 1848 3867 Pnt 3039 3855 Pnt 3941 3855 Pnt 3236 3796 Pnt 4637 3869 Pnt 5178 3853 Pnt 2571 3905 Pnt 4102 3802 Pnt 3132 3854 Pnt 2687 3862 Pnt 2867 3809 Pnt 2567 3836 Pnt 2545 3935 Pnt 3351 3878 Pnt 4986 3853 Pnt 4385 3878 Pnt 3231 3841 Pnt 2865 3829 Pnt 5156 3858 Pnt 2916 3846 Pnt 4398 3829 Pnt 3749 3838 Pnt 2873 3859 Pnt 2609 3838 Pnt 4777 3858 Pnt 3278 3801 Pnt 1800 3924 Pnt 3637 3316 Pnt 2737 3860 Pnt 3253 3906 Pnt 4334 3906 Pnt 3545 3857 Pnt 2600 3869 Pnt 3924 3813 Pnt 5035 3356 Pnt 1992 3784 Pnt 3191 3882 Pnt 5066 3857 Pnt 3133 3797 Pnt 4351 3865 Pnt 4415 3860 Pnt 3336 3838 Pnt 2900 3881 Pnt 2888 3905 Pnt 4195 3815 Pnt 4166 3817 Pnt 3759 3798 Pnt 4150 3845 Pnt 3810 3870 Pnt 4359 3806 Pnt 3821 3858 Pnt 4543 3891 Pnt 4611 3890 Pnt 1870 3867 Pnt 2922 3855 Pnt 4015 3801 Pnt 4009 3861 Pnt 3548 3797 Pnt 4345 3840 Pnt 2865 3869 Pnt 3523 3862 Pnt 2994 3828 Pnt 4718 3840 Pnt 2568 3840 Pnt 3190 3806 Pnt 3559 3854 Pnt 3108 3899 Pnt 3028 3924 Pnt 3266 3843 Pnt 4395 3802 Pnt 2871 3851 Pnt 4473 3889 Pnt 2821 3878 Pnt 2428 3948 Pnt 2914 3862 Pnt 3130 3834 Pnt 4340 3832 Pnt 4730 3878 Pnt 3256 3859 Pnt 4252 3871 Pnt 4922 3836 Pnt 4195 3840 Pnt 4161 3834 Pnt 3599 3838 Pnt 3677 3853 Pnt 3212 3855 Pnt 4382 3840 Pnt 3696 3916 Pnt 2710 3817 Pnt 2286 3895 Pnt 2472 3932 Pnt 4116 3809 Pnt 3697 3918 Pnt 3402 3835 Pnt 2891 3852 Pnt 4248 3782 Pnt 4604 3879 Pnt 2564 3862 Pnt 2062 3937 Pnt 3098 3854 Pnt 3488 3850 Pnt 3044 3834 Pnt 3283 3809 Pnt 3195 3829 Pnt 2951 3809 Pnt 2840 3935 Pnt 3568 3796 Pnt 2931 3814 Pnt 3139 3944 Pnt 4695 3796 Pnt 3617 3851 Pnt 4270 3846 Pnt 3659 3889 Pnt 4639 3847 Pnt 4174 3829 Pnt 3774 3813 Pnt 2728 3836 Pnt 3311 3878 Pnt 4136 3838 Pnt 2791 3801 Pnt 4049 3858 Pnt 2797 3926 Pnt 2912 3851 Pnt 2665 3950 Pnt 3733 3862 Pnt 3922 3834 Pnt 5136 3782 Pnt 4609 3851 Pnt 4606 3851 Pnt 3602 3817 Pnt 5096 3806 Pnt 2447 3802 Pnt 2847 3860 Pnt 2306 3906 Pnt 2760 3857 Pnt 3023 3869 Pnt 3695 3815 Pnt 4754 3815 Pnt 4932 3836 Pnt 3375 3809 Pnt 3630 3858 Pnt 5179 3840 Pnt 2696 3882 Pnt 2932 3787 Pnt 2827 3881 Pnt 4381 3881 Pnt 4746 3848 Pnt 4812 3830 Pnt 2777 3845 Pnt 3216 3820 Pnt 3089 3848 Pnt 2228 3916 Pnt 3203 3890 Pnt 2439 3867 Pnt 3412 3859 Pnt 2581 3869 Pnt 2877 3862 Pnt 4150 3849 Pnt 2943 3828 Pnt 4858 3859 Pnt 4458 3841 Pnt 3307 3832 Pnt 2950 3838 Pnt 2370 3853 Pnt 4298 3855 Pnt 5211 3843 Pnt 3072 3840 Pnt 4118 3849 Pnt 3716 3854 Pnt 5362 3854 Pnt 4930 3916 Pnt 4240 3855 Pnt 2791 3863 Pnt 3890 3899 Pnt 4905 3863 Pnt 2614 3905 Pnt 2185 3924 Pnt 3206 3840 Pnt 3030 3874 Pnt 3317 3843 Pnt 4850 3874 Pnt 4482 3840 Pnt 2682 3832 Pnt 4437 3362 Pnt 3182 3832 Pnt 3879 3843 Pnt 2009 3828 Pnt 3356 3878 Pnt 2809 3913 Pnt 2775 3833 Pnt 2670 3869 Pnt 2034 3937 Pnt 3091 3866 Pnt 3961 3869 Pnt 3094 3832 Pnt 4299 3832 Pnt 4304 3817 Pnt 3955 3809 Pnt 3908 3810 Pnt 4217 3796 Pnt 3450 3850 Pnt 3410 3796 Pnt 2384 3840 Pnt 3205 3851 Pnt 2384 3856 Pnt 2368 3840 Pnt 3039 3846 Pnt 3065 3874 Pnt 3566 3849 Pnt 2360 3802 Pnt 2771 3906 Pnt 3641 3914 Pnt 3013 3858 Pnt 3903 3858 Pnt 3373 3817 Pnt 3555 3865 Pnt 3278 3815 Pnt 4885 3861 Pnt 3409 3858 Pnt 2714 3882 Pnt 4920 3814 Pnt 3557 3859 Pnt 3167 3787 Pnt 4913 3787 Pnt 3388 3881 Pnt 4407 3824 Pnt 2685 3848 Pnt 2208 3867 Pnt 4515 3848 Pnt 4003 3859 Pnt 4659 3857 Pnt 4574 3844 Pnt 4002 3835 Pnt 5106 3854 Pnt 4653 3847 Pnt 3727 3869 Pnt 5278 3857 Pnt 3657 3892 Pnt 4308 3898 Pnt 4246 3838 Pnt 4599 3821 Pnt 3318 3810 Pnt 3864 3810 Pnt 1951 3900 Pnt 4130 3814 Pnt 3081 3847 Pnt 4715 3898 Pnt 3805 3859 Pnt 4293 3862 Pnt 3358 3858 Pnt 4394 3868 Pnt 4003 3806 Pnt 4583 3805 Pnt 3482 3880 Pnt 4343 3870 Pnt 4119 3840 Pnt 3080 3852 Pnt 3200 3827 Pnt 2625 3863 Pnt 4213 3880 Pnt 4254 3806 Pnt 4950 3872 Pnt 2786 3932 Pnt 2140 3935 Pnt 2668 3784 Pnt 3803 3219 Pnt 2939 3814 Pnt 4245 3828 Pnt 3590 3782 Pnt 3484 3944 Pnt 3242 3944 Pnt 3227 3858 Pnt 3505 3874 Pnt 4035 3843 Pnt 2764 3900 Pnt 4490 3859 Pnt 2008 3859 Pnt 4567 3845 Pnt 2805 3842 Pnt 3900 3882 Pnt 2180 3840 Pnt 3628 3840 Pnt 2512 3859 Pnt 4465 3865 Pnt 3628 3881 Pnt 4594 3823 Pnt 2667 3848 Pnt 5312 3840 Pnt 4179 3861 Pnt 5035 3849 Pnt 3994 3860 Pnt 2914 3787 Pnt 3139 3913 Pnt 3529 3856 Pnt 3478 3833 Pnt 1975 3932 Pnt 3326 3832 Pnt 3017 3850 Pnt 4027 3830 Pnt 2871 3840 Pnt 2533 3926 Pnt 5105 3863 Pnt 3182 3845 Pnt 2471 3874 Pnt 2735 3950 Pnt 2262 3802 Pnt 3220 3889 Pnt 3368 3890 Pnt 3523 3890 Pnt 2535 3869 Pnt 3422 3815 Pnt 4585 3817 Pnt 3808 3849 Pnt 4720 3400 Pnt 3386 3828 Pnt 4693 3888 Pnt 3262 3838 Pnt 1995 3853 Pnt 3848 3810 Pnt 4208 3840 Pnt 2456 3916 Pnt 4671 3852 Pnt 3858 3852 Pnt 3719 3866 Pnt 3699 3868 Pnt 3835 3876 Pnt 4598 3898 Pnt 3232 3902 Pnt 2465 3932 Pnt 4682 3845 Pnt 3608 3880 Pnt 3054 3944 Pnt 2949 3814 Pnt 2507 3881 Pnt 2689 3843 Pnt 2387 3900 Pnt 3706 3787 Pnt 3910 3859 Pnt 2838 3926 Pnt 4754 3810 Pnt 4368 3872 Pnt 3422 3852 Pnt 3974 3796 Pnt 4867 3814 Pnt 1914 3867 Pnt 3525 3846 Pnt 3401 3857 Pnt 4571 3846 Pnt 2832 3894 Pnt 2018 3900 Pnt 2910 3847 Pnt 5299 3864 Pnt 4706 3868 Pnt 2424 3858 Pnt 4158 3847 Pnt 2882 3899 Pnt 4325 3857 Pnt 2887 3857 Pnt 4107 3914 Pnt 3054 3908 Pnt 3283 3815 Pnt 3030 3861 Pnt 4259 3866 Pnt 3764 3858 Pnt 5023 3858 Pnt 1920 3828 Pnt 2911 3858 Pnt 2597 3835 Pnt 3271 3820 Pnt 2894 3878 Pnt 2472 3854 Pnt 2115 3869 Pnt 2543 3831 Pnt 3902 3873 Pnt 3023 3796 Pnt 1713 3867 Pnt 3138 3840 Pnt 2950 3935 Pnt 3444 3858 Pnt 2095 3924 Pnt 5184 3815 Pnt 4364 3840 Pnt 3126 3842 Pnt 4062 3846 Pnt 2359 3842 Pnt 2355 3848 Pnt 2358 3859 Pnt 3070 3840 Pnt 3103 3890 Pnt 3130 3848 Pnt 3996 3857 Pnt 2585 3894 Pnt 2049 3900 Pnt 4611 3935 Pnt 5069 3874 Pnt 4112 3894 Pnt 3343 3932 Pnt 4137 3857 Pnt 4316 3847 Pnt 2496 3899 Pnt 3127 3857 Pnt 2631 3908 Pnt 4285 3793 Pnt 2542 3830 Pnt 3275 3861 Pnt 3732 3859 Pnt 4326 3908 Pnt 3604 3926 Pnt 4878 3854 Pnt 5032 3858 Pnt 4213 3871 Pnt 4888 3833 Pnt 3966 3870 Pnt 2260 3863 Pnt 4791 3830 Pnt 4831 3878 Pnt 4711 3887 Pnt 5020 3874 Pnt 4367 3858 Pnt 3842 3858 Pnt 4996 3856 Pnt 3520 3817 Pnt 4980 3909 Pnt 2221 3826 Pnt 2863 3867 Pnt 3443 3858 Pnt 3329 3823 Pnt 2693 3835 Pnt 3468 3806 Pnt 3116 3820 Pnt 3430 3806 Pnt 4225 3806 Pnt 4275 3811 Pnt 3585 3878 Pnt 3686 3913 Pnt 4722 3872 Pnt 3818 3849 Pnt 2024 3916 Pnt 3442 3831 Pnt 3384 3856 Pnt 2411 3932 Pnt 3017 3932 Pnt 4798 3779 Pnt 3519 3862 Pnt 2927 3840 Pnt 3157 3832 Pnt 4160 3843 Pnt 4139 3834 Pnt 3522 3850 Pnt 3701 3844 Pnt 2955 3840 Pnt 3845 3847 Pnt 2561 3874 Pnt 3328 3894 Pnt 2897 3894 Pnt 3221 3944 Pnt 3906 3850 Pnt 2744 3950 Pnt 2901 3814 Pnt 4105 3874 Pnt 2452 3881 Pnt 4273 3848 Pnt 4481 3872 Pnt 3618 3832 Pnt 3615 3842 Pnt 3270 3900 Pnt 3909 3843 Pnt 3340 3793 Pnt 2702 3857 Pnt 3408 3857 Pnt 3024 3908 Pnt 3227 3861 Pnt 2658 3927 Pnt 3050 3927 Pnt 2137 3826 Pnt 3880 3849 Pnt 4328 3837 Pnt 2030 3831 Pnt 4732 3835 Pnt 4684 3826 Pnt 4865 3818 Pnt 4883 3815 Pnt 3913 3817 Pnt 3845 3864 Pnt 4850 3826 Pnt 3507 3875 Pnt 4461 3317 Pnt 3883 3858 Pnt 5101 3839 Pnt 4119 3811 Pnt 2700 3915 Pnt 4303 3915 Pnt 2377 3932 Pnt 3345 3935 Pnt 3263 3866 Pnt 3808 3873 Pnt 2963 3868 Pnt 3070 3832 Pnt 3532 3935 Pnt 2475 3934 Pnt 3084 3876 Pnt 3847 3843 Pnt 2693 3874 Pnt 2934 3944 Pnt 2420 3894 Pnt 3366 3843 Pnt 3354 3846 Pnt 2825 3846 Pnt 2929 3826 Pnt 2451 3874 Pnt 4790 3904 Pnt 2655 3848 Pnt 2593 3842 Pnt 3325 3843 Pnt 3121 3857 Pnt 2832 3927 Pnt 4854 3806 Pnt 5152 3818 Pnt 4847 3843 Pnt 5092 3883 Pnt 4621 3791 Pnt 4902 3843 Pnt 4343 3848 Pnt 4314 3887 Pnt 4921 3803 Pnt 3965 3892 Pnt 3461 3850 Pnt 4830 3874 Pnt 3170 3840 Pnt 4679 3834 Pnt 3013 3881 Pnt 3244 3858 Pnt 3628 3832 Pnt 2499 3832 Pnt 2825 3843 Pnt 2293 3935 Pnt 3115 3876 Pnt 2739 3916 Pnt 2390 3874 Pnt 3254 3868 Pnt 3312 3868 Pnt 2580 3946 Pnt 2262 3894 Pnt 2906 3846 Pnt 2759 3826 Pnt 2706 3874 Pnt 2745 3950 Pnt 2115 3842 Pnt 3425 3904 Pnt 4631 3870 Pnt 3615 3857 Pnt 3653 3860 Pnt 2527 3927 Pnt 5231 3904 Pnt 4304 3814 Pnt 2681 3781 Pnt 4934 3945 Pnt 3414 3779 Pnt 4905 3817 Pnt 4517 3861 Pnt 2647 3198 Pnt 5032 3858 Pnt 2737 3858 Pnt 4253 3847 Pnt 3519 3832 Pnt 2900 3843 Pnt 3909 3858 Pnt 3379 3823 Pnt 3142 3946 Pnt 4540 3946 Pnt 4207 3817 Pnt 3326 3826 Pnt 3197 3927 Pnt 3937 3927 Pnt 3538 3861 Pnt 4598 3819 Pnt 4399 3815 Pnt 3660 3861 Pnt 4767 3900 Pnt 2958 3815 Pnt 3800 3806 Pnt 5424 3892 Pnt 3595 3779 Pnt 4242 3811 Pnt 3515 3820 Pnt 3444 3878 Pnt 3120 3849 Pnt 2746 3829 Pnt 4297 3864 Pnt 4076 3820 Pnt 4759 3830 Pnt 2808 3858 Pnt 4649 3803 Pnt 2982 3843 Pnt 4237 3097 Pnt 3857 3844 Pnt 4281 3776 Pnt 2901 3814 Pnt 3376 3855 Pnt 2787 3881 Pnt 3080 3854 Pnt 2233 3900 Pnt 3479 3868 Pnt 2870 3793 Pnt 4465 3775 Pnt 2547 3908 Pnt 3330 3861 Pnt 4226 3819 Pnt 3773 3819 Pnt 4739 3866 Pnt 3604 3864 Pnt 3338 3854 Pnt 4646 3864 Pnt 4999 3792 Pnt 4370 3860 Pnt 3442 3866 Pnt 2804 3876 Pnt 3740 3850 Pnt 2748 3858 Pnt 2961 3927 Pnt 4185 3875 Pnt 3027 3840 Pnt 2638 3837 Pnt 4775 3881 Pnt 3560 3840 Pnt 4626 3254 Pnt 2978 3890 Pnt 4628 3840 Pnt 3105 3848 Pnt 3775 3838 Pnt 3467 3903 Pnt 2208 3932 Pnt 4590 3903 Pnt 3411 3840 Pnt 2791 3851 Pnt 1973 3915 Pnt 2194 3935 Pnt 3395 3840 Pnt 3175 3865 Pnt 2653 3917 Pnt 2413 3874 Pnt 2617 3874 Pnt 3561 3899 Pnt 2824 3945 Pnt 2927 3830 Pnt 4723 3884 Pnt 2485 3867 Pnt 3129 3946 Pnt 2888 3834 Pnt 2598 3927 Pnt 3802 3847 Pnt 3320 3861 Pnt 4577 3847 Pnt 3197 3806 Pnt 4650 3820 Pnt 3727 3832 Pnt 4447 3815 Pnt 4926 3865 Pnt 4875 3888 Pnt 3914 3804 Pnt 4004 3826 Pnt 4222 3806 Pnt 3030 3842 Pnt 3612 3820 Pnt 2613 3878 Pnt 4150 3878 Pnt 3672 3858 Pnt 4722 3861 Pnt 4538 3815 Pnt 2744 3778 Pnt 3840 3849 Pnt 3594 3776 Pnt 2777 3881 Pnt 4527 3819 Pnt 2389 3876 Pnt 2527 3934 Pnt 2922 3934 Pnt 2714 3894 Pnt 2423 3900 Pnt 3465 3908 Pnt 3617 3846 Pnt 2139 3854 Pnt 2066 3842 Pnt 4440 3825 Pnt 2689 3842 Pnt 2641 3866 Pnt 2930 3835 Pnt 3919 3835 Pnt 3869 3850 Pnt 2491 3840 Pnt 3983 3850 Pnt 2443 3837 Pnt 2823 3822 Pnt 3423 3840 Pnt 3438 3840 Pnt 3103 3851 Pnt 1911 3915 Pnt 2491 3935 Pnt 3575 3935 Pnt 3037 3917 Pnt 4859 3803 Pnt 2338 3874 Pnt 4812 3821 Pnt 3307 3876 Pnt 2072 3899 Pnt 2733 3945 Pnt 4442 3899 Pnt 3231 3946 Pnt 4019 3917 Pnt 2991 3834 Pnt 2386 3927 Pnt 4106 3880 Pnt 4950 3835 Pnt 3664 3833 Pnt 4423 3868 Pnt 3872 3832 Pnt 4275 3831 Pnt 3213 3870 Pnt 2455 3864 Pnt 3130 3806 Pnt 3427 3864 Pnt 3263 3876 Pnt 3093 3833 Pnt 3258 3858 Pnt 2710 3927 Pnt 4116 3808 Pnt 2283 3843 Pnt 3596 3877 Pnt 2621 3848 Pnt 3499 3842 Pnt 2273 3838 Pnt 2495 3903 Pnt 2346 3931 Pnt 4180 3842 Pnt 4657 3804 Pnt 4641 3877 Pnt 4258 3858 Pnt 4600 3857 Pnt 3128 3852 Pnt 4293 3876 Pnt 2517 3878 Pnt 3211 3872 Pnt 3108 3872 Pnt 2910 3835 Pnt 2796 3837 Pnt 2808 3821 Pnt 5379 3887 Pnt 4309 3811 Pnt 3489 3821 Pnt 3593 3819 Pnt 4622 3883 Pnt 3574 3817 Pnt 2779 3876 Pnt 3835 3803 Pnt 4677 3855 Pnt 2257 3899 Pnt 2584 3866 Pnt 3309 3855 Pnt 3789 3818 Pnt 3291 3882 Pnt 3409 3815 Pnt 2896 3814 Pnt 5032 3827 Pnt 2277 3881 Pnt 4627 3849 Pnt 3880 3850 Pnt 2883 3934 Pnt 3760 3846 Pnt 3498 3877 Pnt 3171 3840 Pnt 3478 3850 Pnt 3099 3819 Pnt 4615 3881 Pnt 2606 3900 Pnt 2847 3899 Pnt 3992 3081 Pnt 2516 3908 Pnt 2380 3874 Pnt 3802 3819 Pnt 2277 3854 Pnt 2217 3842 Pnt 3994 3850 Pnt 1972 3915 Pnt 4439 3829 Pnt 2512 3935 Pnt 3068 3917 Pnt 4445 3814 Pnt 4613 3812 Pnt 2867 3834 Pnt 4764 3772 Pnt 2030 3927 Pnt 4865 3936 Pnt 3943 3843 Pnt 4732 3773 Pnt 4804 3821 Pnt 4560 3845 Pnt 4712 3843 Pnt 4905 3858 Pnt 4487 3812 Pnt 4489 3817 Pnt 4111 3831 Pnt 4507 3838 Pnt 2730 3864 Pnt 3949 3945 Pnt 3280 3876 Pnt 3114 3833 Pnt 2786 3858 Pnt 4443 3833 Pnt 3362 3927 Pnt 4276 3833 Pnt 2688 3903 Pnt 4199 3832 Pnt 2522 3931 Pnt 2858 3848 Pnt 4036 3830 Pnt 5416 3800 Pnt 3731 3842 Pnt 3348 3826 Pnt 2798 3842 Pnt 4659 3848 Pnt 5306 3824 Pnt 3618 3852 Pnt 3184 3854 Pnt 3332 3847 Pnt 4602 3861 Pnt 3905 3852 Pnt 3384 3868 Pnt 4335 3877 Pnt 4362 3849 Pnt 3031 3934 Pnt 2398 3877 Pnt 3144 3841 Pnt 4662 3804 Pnt 2916 3850 Pnt 4666 3880 Pnt 4946 3850 Pnt 5037 3831 Pnt 4414 3838 Pnt 4326 3823 Pnt 2656 3774 Pnt 3679 3836 Pnt 3311 3813 Pnt 2065 3935 Pnt 3685 3845 Pnt 4865 3935 Pnt 4458 3810 Pnt 4725 3876 Pnt 4112 3805 Pnt 2762 3872 Pnt 5253 3827 Pnt 4962 3870 Pnt 5394 3880 Pnt 5382 3813 Pnt 3176 3819 Pnt 2832 3876 Pnt 3814 3885 Pnt 3091 3900 Pnt 2454 3852 Pnt 2804 3850 Pnt 2668 3923 Pnt 3884 3800 Pnt 2707 3904 Pnt 2976 3911 Pnt 2324 3931 Pnt 3785 3931 Pnt 3901 3832 Pnt 2513 3835 Pnt 3047 3872 Pnt 3884 3823 Pnt 3484 3837 Pnt 2761 3876 Pnt 3708 3852 Pnt 2979 3903 Pnt 3963 3903 Pnt 2560 3866 Pnt 3021 3855 Pnt 4439 3909 Pnt 2064 3881 Pnt 3834 3826 Pnt 3592 3832 Pnt 3234 3823 Pnt 4454 3823 Pnt 3084 3881 Pnt 3887 3878 Pnt 3319 3899 Pnt 2351 3908 Pnt 2260 3874 Pnt 3396 3859 Pnt 3952 3792 Pnt 2394 3917 Pnt 4542 3881 Pnt 3198 3880 Pnt 4263 3807 Pnt 3416 3772 Pnt 2262 3945 Pnt 4253 3890 Pnt 3717 3833 Pnt 4782 3890 Pnt 4605 3880 Pnt 3757 3865 Pnt 4996 3831 Pnt 2765 3946 Pnt 4509 3865 Pnt 4090 3824 Pnt 5604 3829 Pnt 2654 3842 Pnt 4238 3806 Pnt 3925 3868 Pnt 4504 3258 Pnt 3600 3773 Pnt 4630 3562 Pnt 3590 3849 Pnt 2696 3940 Pnt 4549 3822 Pnt 2451 3877 Pnt 3299 3841 Pnt 2740 3850 Pnt 4571 3841 Pnt 2891 3936 Pnt 1964 3935 Pnt 4215 3847 Pnt 3357 3821 Pnt 4405 3827 Pnt 3511 3854 Pnt 3065 3847 Pnt 5061 3838 Pnt 4654 3856 Pnt 2542 3904 Pnt 2527 3920 Pnt 3024 3931 Pnt 3379 3835 Pnt 4369 3868 Pnt 4669 3816 Pnt 4839 3874 Pnt 4587 3788 Pnt 4313 3874 Pnt 4384 3079 Pnt 2905 3856 Pnt 2741 3904 Pnt 2338 3920 Pnt 3779 3841 Pnt 1896 3931 Pnt 2821 3837 Pnt 4682 3823 Pnt 4390 3856 Pnt 2823 3946 Pnt 3769 3817 Pnt 2896 3813 Pnt 3445 3868 Pnt 3074 3848 Pnt 2714 3876 Pnt 3255 3838 Pnt 3175 3885 Pnt 4614 3885 Pnt 2027 3864 Pnt 2917 3900 Pnt 3202 3876 Pnt 2943 3852 Pnt 2667 3903 Pnt 3079 3850 Pnt 3713 3903 Pnt 2134 3923 Pnt 3301 3907 Pnt 5364 3923 Pnt 3239 3832 Pnt 3759 3880 Pnt 3652 3881 Pnt 5156 3854 Pnt 3448 3838 Pnt 4834 3839 Pnt 4111 3841 Pnt 2995 3834 Pnt 3725 3832 Pnt 3743 3827 Pnt 3331 3824 Pnt 1987 3935 Pnt 4428 3822 Pnt 3055 3854 Pnt 4141 3887 Pnt 3558 3819 Pnt 3552 3819 Pnt 4210 3869 Pnt 2962 3904 Pnt 4332 3872 Pnt 3089 3848 Pnt 3999 3904 Pnt 2556 3876 Pnt 2756 3788 Pnt 2638 3838 Pnt 3758 3882 Pnt 3277 3849 Pnt 1924 3851 Pnt 3349 3885 Pnt 2828 3868 Pnt 2532 3900 Pnt 3355 3837 Pnt 3083 3876 Pnt 2777 3852 Pnt 2582 3903 Pnt 3951 3885 Pnt 4831 3817 Pnt 4548 3901 Pnt 3016 3819 Pnt 2741 3907 Pnt 3603 3815 Pnt 3385 3814 Pnt 4664 3852 Pnt 3348 3855 Pnt 4430 3871 Pnt 4261 3880 Pnt 3767 3866 Pnt 3802 3883 Pnt 2420 3923 Pnt 2873 3900 Pnt 2293 3874 Pnt 3145 3900 Pnt 3360 3859 Pnt 2636 3943 Pnt 2806 3890 Pnt 4612 3832 Pnt 3652 3876 Pnt 4920 3849 Pnt 3246 3891 Pnt 4111 3872 Pnt 5165 3848 Pnt 3090 3946 Pnt 3955 3847 Pnt 3229 3868 Pnt 4789 3848 Pnt 3442 3819 Pnt 4716 3868 Pnt 3969 3847 Pnt 4506 3832 Pnt 2702 3927 Pnt 5292 3830 Pnt 3993 3824 Pnt 3999 3841 Pnt 4879 3817 Pnt 4518 3910 Pnt 3670 3841 Pnt 3137 3940 Pnt 4905 3924 Pnt 2911 3843 Pnt 3041 3855 Pnt 2555 3883 Pnt 5343 3909 Pnt 2203 3874 Pnt 3808 3829 Pnt 2553 3855 Pnt 3732 3829 Pnt 4624 3369 Pnt 4690 3837 Pnt 4490 3831 Pnt 2723 3904 Pnt 4738 3839 Pnt 4618 3835 Pnt 3976 3788 Pnt 5205 3868 Pnt 3765 3885 Pnt 4131 3885 Pnt 4427 3829 Pnt 3315 3821 Pnt 3682 3900 Pnt 3324 3841 Pnt 4536 3833 Pnt 4037 3874 Pnt 3374 3866 Pnt 4658 3836 Pnt 3471 3887 Pnt 3873 3887 Pnt 3460 3863 Pnt 3581 3871 Pnt 3849 3817 Pnt 4278 3885 Pnt 3751 3823 Pnt 3601 3832 Pnt 4871 3832 Pnt 3544 3819 Pnt 3438 3830 Pnt 4852 3871 Pnt 4624 3834 Pnt 4371 3826 Pnt 4893 3858 Pnt 3712 3825 Pnt 3268 3866 Pnt 4215 3827 Pnt 3527 3856 Pnt 4851 3843 Pnt 4442 3851 Pnt 4609 3858 Pnt 4519 3866 Pnt 3332 3846 Pnt 3868 3863 Pnt 4782 3827 Pnt 3522 3913 Pnt 5169 3866 Pnt 4139 3376 Pnt 2274 3874 Pnt 3823 3830 Pnt 3239 3829 Pnt 3022 3855 Pnt 2760 3904 Pnt 3855 3829 Pnt 4886 3904 Pnt 3915 3826 Pnt 5022 3908 Pnt 5250 3856 Pnt 4247 3871 Pnt 2934 3863 Pnt 3918 3843 Pnt 3416 3818 Pnt 4695 3823 Pnt 3485 3818 Pnt 4731 3824 Pnt 4649 3822 Pnt 4016 3847 Pnt 4415 3868 Pnt 3223 3822 Pnt 4627 3820 Pnt 3834 3841 Pnt 4896 3905 Pnt 5480 3891 Pnt 2744 3872 Pnt 3242 3872 Pnt 2688 3946 Pnt 5028 3927 Pnt 3689 3871 Pnt 4627 3946 Pnt 4338 3870 Pnt 3147 3868 Pnt 4418 3827 Pnt 3433 3865 Pnt 2942 3812 Pnt 3705 3917 Pnt 2557 3876 Pnt 3992 3873 Pnt 3961 3824 Pnt 3718 3838 Pnt 2599 3847 Pnt 2410 3852 Pnt 2762 3823 Pnt 1922 3913 Pnt 3191 3910 Pnt 3606 3903 Pnt 2484 3940 Pnt 4005 3903 Pnt 4333 3828 Pnt 3400 3869 Pnt 2836 3849 Pnt 3502 3854 Pnt 3889 3901 Pnt 2570 3883 Pnt 3008 3847 Pnt 3078 3819 Pnt 3541 3855 Pnt 4524 3854 Pnt 4040 3885 Pnt 2860 3848 Pnt 2154 3920 Pnt 2224 3930 Pnt 3617 3825 Pnt 2984 3868 Pnt 3592 3930 Pnt 2806 3866 Pnt 3384 3814 Pnt 2851 3837 Pnt 2792 3872 Pnt 2490 3923 Pnt 2982 3872 Pnt 2550 3943 Pnt 2572 3936 Pnt 3985 3936 Pnt 2804 3946 Pnt 5144 3867 Pnt 3010 3873 Pnt 2713 3841 Pnt 2461 3847 Pnt 2790 3852 Pnt 2713 3913 Pnt 2369 3903 Pnt 4153 3834 Pnt 4369 3834 Pnt 3886 3864 Pnt 2936 3885 Pnt 5363 3872 Pnt 3264 3871 Pnt 2401 3916 Pnt 3247 3829 Pnt 2421 3930 Pnt 2949 3868 Pnt 3175 3843 Pnt 2628 3899 Pnt 2589 3856 Pnt 2624 3872 Pnt 2363 3923 Pnt 2464 3936 Pnt 2472 3899 Pnt 3525 3818 Pnt 3308 3858 Pnt 3623 3858 Pnt 3846 3872 Pnt 2625 3847 Pnt 3037 3848 Pnt 4028 3848 Pnt 3203 3868 Pnt 3506 3871 Pnt 2868 3876 Pnt 2879 3923 Pnt 3212 3869 Pnt 4910 3824 Pnt 4067 3820 Pnt 4962 3816 Pnt 3694 3923 Pnt 5212 3850 Pnt 4645 3897 Pnt 4274 3828 Pnt 5303 3819 Pnt 2637 3923 Pnt 3362 3847 Pnt 3354 3852 Pnt 2337 3848 Pnt 2631 3913 Pnt 2981 3868 Pnt 3154 3834 Pnt 2729 3876 Pnt 2652 3936 Pnt 3272 3899 Pnt 5078 3817 Pnt 4127 3827 Pnt 3538 3885 Pnt 3164 3830 Pnt 2480 3901 Pnt 4361 3885 Pnt 2426 3935 Pnt 3055 3843 Pnt 3489 3899 Pnt 3872 3872 Pnt 3097 3930 Pnt 3138 3871 Pnt 2159 3874 Pnt 2471 3855 Pnt 3460 3818 Pnt 2516 3904 Pnt 3136 3864 Pnt 4697 3946 Pnt 2240 3885 Pnt 5285 3832 Pnt 4947 3443 Pnt 3828 3832 Pnt 5237 3843 Pnt 3965 3856 Pnt 3771 3851 Pnt 4126 3821 Pnt 4918 3874 Pnt 4525 3827 Pnt 4764 3822 Pnt 5026 3820 Pnt 3700 3816 Pnt 2517 3923 Pnt 4062 3851 Pnt 5304 3923 Pnt 4745 3343 Pnt 3441 3849 Pnt 5072 3843 Pnt 3161 3885 Pnt 2916 3899 Pnt 4870 3876 Pnt 3793 3930 Pnt 4210 3821 Pnt 3521 3852 Pnt 5113 3866 Pnt 4534 3827 Pnt 3825 3924 Pnt 2928 3885 Pnt 2744 3946 Pnt 4402 3824 Pnt 4687 3264 Pnt 3907 3844 Pnt 3319 3884 Pnt 4648 3830 Pnt 3867 3817 Pnt 4869 3860 Pnt 3707 3849 Pnt 4575 3829 Pnt 4444 3842 Pnt 4668 3830 Pnt 3902 3908 Pnt 2648 3831 Pnt 3998 3907 Pnt 2826 3943 Pnt 2723 3942 Pnt 4593 3829 Pnt 2950 3873 Pnt 3107 3841 Pnt 2341 3916 Pnt 2789 3829 Pnt 2432 3930 Pnt 2318 3856 Pnt 3011 3872 Pnt 5118 3846 Pnt 5156 3872 Pnt 4510 3828 Pnt 4860 3835 Pnt 3210 3847 Pnt 3826 3213 Pnt 3037 3853 Pnt 4150 3820 Pnt 4987 3330 Pnt 4888 3846 Pnt 3279 3849 Pnt 5405 3897 Pnt 4888 3821 Pnt 4501 3880 Pnt 3343 3815 Pnt 5083 3856 Pnt 4711 3846 Pnt 2708 3848 Pnt 4554 3868 Pnt 2760 3823 Pnt 3208 3910 Pnt 3539 3887 Pnt 4148 3873 Pnt 4218 3857 Pnt 3058 3819 Pnt 3239 3874 Pnt 3885 3843 Pnt 2150 3862 Pnt 2788 3837 Pnt 2792 3930 Pnt 2128 3835 Pnt 3356 3855 Pnt 3769 3837 Pnt 4093 3852 Pnt 2877 3885 Pnt 3244 3946 Pnt 3377 3844 Pnt 5253 3868 Pnt 4158 3843 Pnt 2582 3847 Pnt 2645 3814 Pnt 2236 3847 Pnt 5357 3930 Pnt 3060 3852 Pnt 3052 3852 Pnt 2454 3852 Pnt 4977 3810 Pnt 3344 3913 Pnt 3703 3924 Pnt 4884 3874 Pnt 2677 3868 Pnt 2731 3841 Pnt 3212 3876 Pnt 3745 3865 Pnt 3113 3940 Pnt 3694 3822 Pnt 3021 3849 Pnt 3352 3897 Pnt 3907 3852 Pnt 3061 3848 Pnt 2902 3846 Pnt 4861 3862 Pnt 5235 3870 Pnt 3417 3846 Pnt 3140 3871 Pnt 2710 3871 Pnt 2203 3855 Pnt 3015 3907 Pnt 2179 3904 Pnt 3620 3864 Pnt 4662 3887 Pnt 4356 3822 Pnt 2342 3848 Pnt 4163 3848 Pnt 4156 3817 Pnt 2701 3831 Pnt 4657 3846 Pnt 4001 3819 Pnt 2529 3901 Pnt 3825 3813 Pnt 4995 3901 Pnt 3074 3843 Pnt 3467 3820 Pnt 4569 3866 Pnt 3455 3873 Pnt 2957 3874 Pnt 4676 3843 Pnt 3940 3862 Pnt 4582 3844 Pnt 3801 3908 Pnt 3171 3946 Pnt 3676 3943 Pnt 3066 3942 Pnt 2671 3873 Pnt 2713 3841 Pnt 2954 3916 Pnt 4208 3857 Pnt 3025 3830 Pnt 3601 3866 Pnt 4946 3845 Pnt 5086 3221 Pnt 4933 3846 Pnt 3820 3894 Pnt 5077 3903 Pnt 3496 3893 Pnt 3548 3849 Pnt 4621 3846 Pnt 4928 3824 Pnt 4813 3907 Pnt 3656 3834 Pnt 2491 3832 Pnt 4137 3880 Pnt 4771 3237 Pnt 4875 3866 Pnt 4409 3817 Pnt 4596 3840 Pnt 4253 3868 Pnt 3852 3875 Pnt 4280 3870 Pnt 4045 3871 Pnt 2902 3871 Pnt 4829 3891 Pnt 3117 3850 Pnt 2669 3907 Pnt 2248 3904 Pnt 3163 3887 Pnt 4418 3885 Pnt 4602 3826 Pnt 4610 3868 Pnt 4718 3844 Pnt 2873 3923 Pnt 4510 3860 Pnt 4031 3843 Pnt 4084 3864 Pnt 4043 3870 Pnt 3670 3852 Pnt 3418 3857 Pnt 2086 3890 Pnt 2678 3930 Pnt 2756 3855 Pnt 4939 3827 Pnt 4201 3852 Pnt 3724 3848 Pnt 4868 3855 Pnt 2374 3847 Pnt 3305 3809 Pnt 4407 3818 Pnt 3618 3862 Pnt 3659 3810 Pnt 4709 3842 Pnt 5081 3852 Pnt 4290 3817 Pnt 3753 3862 Pnt 3293 3908 Pnt 3458 3862 Pnt 2508 3946 Pnt 3476 3830 Pnt 3510 3950 Pnt 5233 3864 Pnt 3260 3942 Pnt 5194 3823 Pnt 2259 3873 Pnt 3519 3841 Pnt 4993 3431 Pnt 4886 3840 Pnt 4230 3815 Pnt 4614 3838 Pnt 2977 3860 Pnt 3850 3812 Pnt 2785 3857 Pnt 4955 3858 Pnt 2868 3918 Pnt 3233 3845 Pnt 3920 3846 Pnt 4248 3848 Pnt 5132 3858 Pnt 3896 3835 Pnt 4032 3813 Pnt 3555 3847 Pnt 3774 3844 Pnt 3567 3853 Pnt 4761 3824 Pnt 5259 3873 Pnt 4728 3846 Pnt 3345 3880 Pnt 5567 3912 Pnt 3961 3846 Pnt 4751 3823 Pnt 4803 3891 Pnt 4999 3862 Pnt 5130 3261 Pnt 4809 3846 Pnt 2466 3854 Pnt 3715 3893 Pnt 4247 3911 Pnt 4393 3858 Pnt 4504 3871 Pnt 3752 3855 Pnt 4422 3822 Pnt 5088 3866 Pnt 2238 3872 Pnt 4725 3822 Pnt 5176 3864 Pnt 4196 3847 Pnt 4507 3819 Pnt 4769 3870 Pnt 3059 3930 Pnt 2261 3836 Pnt 2691 3864 Pnt 3598 3842 Pnt 2374 3868 Pnt 4240 3840 Pnt 2964 3819 Pnt 3090 3876 Pnt 3391 3896 Pnt 3175 3940 Pnt 2430 3897 Pnt 3966 3894 Pnt 3373 3846 Pnt 4697 3816 Pnt 3123 3863 Pnt 2996 3849 Pnt 4288 3846 Pnt 4058 3846 Pnt 2421 3842 Pnt 2858 3874 Pnt 4971 3818 Pnt 5148 3814 Pnt 4850 3789 Pnt 5066 3800 Pnt 4854 3782 Pnt 4309 3820 Pnt 4747 3791 Pnt 4106 3851 Pnt 3893 3849 Pnt 2550 3831 Pnt 4763 3782 Pnt 4718 3882 Pnt 2953 3901 Pnt 3046 3843 Pnt 3459 3843 Pnt 4868 3847 Pnt 4556 3903 Pnt 3881 3845 Pnt 2702 3879 Pnt 3135 3849 Pnt 2369 3844 Pnt 2606 3871 Pnt 3242 3871 Pnt 3548 3844 Pnt 3090 3850 Pnt 2957 3860 Pnt 2968 3817 Pnt 4413 3892 Pnt 2717 3907 Pnt 2703 3853 Pnt 2322 3904 Pnt 2765 3943 Pnt 3102 3943 Pnt 3492 3830 Pnt 5036 3792 Pnt 2902 3945 Pnt 3570 3942 Pnt 4263 3889 Pnt 2704 3885 Pnt 3231 3841 Pnt 3361 3853 Pnt 4849 3803 Pnt 4586 3075 Pnt 1974 3836 Pnt 5059 3836 Pnt 3353 3857 Pnt 4627 3312 Pnt 2508 3804 Pnt 1947 3930 Pnt 2837 3855 Pnt 4619 3837 Pnt 3388 3862 Pnt 2193 3873 Pnt 4540 3864 Pnt 3678 3819 Pnt 2179 3842 Pnt 4575 3850 Pnt 4569 3848 Pnt 3224 3912 Pnt 3679 3885 Pnt 5459 3844 Pnt 3326 3521 Pnt 3089 3816 Pnt 4494 3861 Pnt 5020 3872 Pnt 4888 3846 Pnt 3244 3847 Pnt 4750 3820 Pnt 4566 3889 Pnt 4862 3854 Pnt 2903 3923 Pnt 3560 3846 Pnt 4703 3895 Pnt 4892 3877 Pnt 4566 3858 Pnt 5126 3842 Pnt 4657 3809 Pnt 4395 3864 Pnt 3558 3870 Pnt 4283 3899 Pnt 4288 3799 Pnt 4749 3846 Pnt 2571 3895 Pnt 4037 3895 Pnt 4773 3808 Pnt 3291 3782 Pnt 3786 3791 Pnt 2960 3879 Pnt 2884 3849 Pnt 2412 3844 Pnt 4006 3860 Pnt 2388 3918 Pnt 2617 3857 Pnt 3689 3849 Pnt 2760 3907 Pnt 2019 3905 Pnt 2903 3885 Pnt 4042 3894 Pnt 3530 3830 Pnt 2866 3945 Pnt 4526 3945 Pnt 4720 3830 Pnt 4725 3842 Pnt 3568 3942 Pnt 2305 3885 Pnt 4577 3857 Pnt 2633 3943 Pnt 3718 3841 Pnt 3311 3853 Pnt 4196 3874 Pnt 4140 3842 Pnt 2311 3901 Pnt 3462 3818 Pnt 3310 3847 Pnt 4358 3866 Pnt 3034 3871 Pnt 3224 3860 Pnt 2939 3817 Pnt 4119 3853 Pnt 3320 3854 Pnt 5063 3866 Pnt 2451 3788 Pnt 2254 3873 Pnt 4884 3854 Pnt 4730 3850 Pnt 4224 3862 Pnt 4255 3846 Pnt 4848 3820 Pnt 2810 3854 Pnt 4202 3798 Pnt 3633 3789 Pnt 4648 3821 Pnt 4124 3836 Pnt 4419 3861 Pnt 2749 3838 Pnt 5097 3880 Pnt 2044 3836 Pnt 4322 3893 Pnt 4079 3836 Pnt 3983 3841 Pnt 3782 3897 Pnt 3686 3876 Pnt 4918 3876 Pnt 3436 3896 Pnt 2648 3937 Pnt 4413 3804 Pnt 4939 3407 Pnt 2471 3897 Pnt 3881 3849 Pnt 4506 3856 Pnt 4764 3897 Pnt 4697 3826 Pnt 3301 3875 Pnt 4073 3848 Pnt 2534 3784 Pnt 3472 3782 Pnt 4717 3846 Pnt 4810 3855 Pnt 4897 3872 Pnt 4574 3843 Pnt 3924 3912 Pnt 4845 3803 Pnt 4716 3868 Pnt 3536 3896 Pnt 3284 3896 Pnt 2504 3850 Pnt 3286 3889 Pnt 4243 3854 Pnt 2715 3895 Pnt 3520 3923 Pnt 3103 3923 Pnt 4655 3862 Pnt 3437 3846 Pnt 3673 3846 Pnt 2936 3943 Pnt 3431 3874 Pnt 2475 3900 Pnt 2797 3860 Pnt 3137 3854 Pnt 3343 3862 Pnt 4648 3814 Pnt 4550 3808 Pnt 4267 3848 Pnt 2435 3900 Pnt 3619 3840 Pnt 4940 3830 Pnt 3616 3885 Pnt 5020 3882 Pnt 3089 3945 Pnt 3448 3841 Pnt 2942 3788 Pnt 4154 3840 Pnt 2733 3932 Pnt 3044 3877 Pnt 4221 3247 Pnt 4893 3839 Pnt 3946 3792 Pnt 3282 3848 Pnt 3478 3847 Pnt 4891 3847 Pnt 2789 3871 Pnt 4584 3877 Pnt 3764 3845 Pnt 2959 3937 Pnt 2471 3897 Pnt 3603 3897 Pnt 2572 3861 Pnt 4062 3802 Pnt 4554 3847 Pnt 4607 3838 Pnt 2229 3930 Pnt 3480 3817 Pnt 2847 3838 Pnt 3869 3840 Pnt 4486 3837 Pnt 4937 3814 Pnt 4699 3840 Pnt 3768 3875 Pnt 4768 3858 Pnt 4895 3824 Pnt 5139 3816 Pnt 5161 3861 Pnt 5090 3868 Pnt 4196 3849 Pnt 3065 3842 Pnt 3705 3859 Pnt 4972 3859 Pnt 4686 3815 Pnt 4096 3848 Pnt 2504 3917 Pnt 4376 3875 Pnt 3801 3862 Pnt 3061 3900 Pnt 2924 3860 Pnt 3180 3851 Pnt 3425 3908 Pnt 4219 3851 Pnt 4608 3840 Pnt 3384 3861 Pnt 2416 3897 Pnt 3812 3859 Pnt 2402 3840 Pnt 4773 3860 Pnt 4027 3840 Pnt 3845 3869 Pnt 3734 3844 Pnt 4170 3896 Pnt 3508 3896 Pnt 5028 3885 Pnt 4699 3858 Pnt 3999 3793 Pnt 2632 3849 Pnt 2561 3943 Pnt 4984 3902 Pnt 4625 3849 Pnt 3872 3945 Pnt 3685 3942 Pnt 4400 3861 Pnt 2570 3836 Pnt 3726 3836 Pnt 4632 3875 Pnt 2366 3836 Pnt 3792 3837 Pnt 3922 3868 Pnt 4826 3891 Pnt 3382 3903 Pnt 2254 3876 Pnt 3997 3893 Pnt 3343 3862 Pnt 3102 3856 Pnt 3703 3856 Pnt 4433 3868 Pnt 3832 3885 Pnt 3398 3847 Pnt 2498 3871 Pnt 4867 3875 Pnt 4328 3873 Pnt 5530 3892 Pnt 5353 3891 Pnt 5174 3859 Pnt 3507 3895 Pnt 3643 3801 Pnt 2242 3930 Pnt 5079 3868 Pnt 3899 3878 Pnt 4522 3858 Pnt 3282 3857 Pnt 3785 3875 Pnt 3192 3900 Pnt 3029 3851 Pnt 4465 3895 Pnt 4185 3847 Pnt 4454 3859 Pnt 4081 3864 Pnt 4617 3900 Pnt 3480 3815 Pnt 3310 3854 Pnt 4401 3864 Pnt 4400 3861 Pnt 2156 3840 Pnt 2664 3869 Pnt 3035 3849 Pnt 4841 3872 Pnt 5332 3299 Pnt 2274 3895 Pnt 1795 3942 Pnt 2383 3923 Pnt 4709 3923 Pnt 2800 3836 Pnt 2355 3836 Pnt 3403 3879 Pnt 4169 3859 Pnt 3670 3896 Pnt 4116 3885 Pnt 4644 3875 Pnt 4013 3846 Pnt 3146 3943 Pnt 3041 3848 Pnt 2792 3900 Pnt 4242 3937 Pnt 4568 3900 Pnt 4253 3877 Pnt 5048 3855 Pnt 4231 3886 Pnt 5324 3885 Pnt 4849 3804 Pnt 5179 3806 Pnt 4878 3794 Pnt 4554 3780 Pnt 4566 3865 Pnt 2491 3918 Pnt 2369 3868 Pnt 4429 3907 Pnt 3261 3907 Pnt 4625 3871 Pnt 3405 3907 Pnt 3742 3830 Pnt 2786 3944 Pnt 4303 3830 Pnt 4295 3860 Pnt 4601 3893 Pnt 3990 3875 Pnt 4639 3875 Pnt 4405 3873 Pnt 5345 3781 Pnt 2772 3846 Pnt 5142 3892 Pnt 2256 3900 Pnt 3918 3915 Pnt 3955 3866 Pnt 2951 3886 Pnt 5491 3915 Pnt 5247 3891 Pnt 5076 3886 Pnt 4460 3875 Pnt 3947 3846 Pnt 4876 3910 Pnt 4920 3911 Pnt 5352 3882 Pnt 3230 3932 Pnt 5238 3868 Pnt 3503 3860 Pnt 3064 3937 Pnt 2790 3861 Pnt 4611 3444 Pnt 3102 3814 Pnt 4031 3895 Pnt 3053 3869 Pnt 2849 3851 Pnt 3815 3842 Pnt 3458 3862 Pnt 3068 3944 Pnt 2031 3923 Pnt 2780 3846 Pnt 4745 3908 Pnt 3125 3885 Pnt 4773 3885 Pnt 3496 3865 Pnt 3543 3846 Pnt 2285 3937 Pnt 4412 3803 Pnt 2574 3782 Pnt 3271 3780 Pnt 2551 3916 Pnt 2881 3853 Pnt 3625 3907 Pnt 4449 3862 Pnt 5224 3912 Pnt 4869 3814 Pnt 3705 3849 Pnt 2794 3944 Pnt 3927 3858 Pnt 2691 3893 Pnt 4710 3789 Pnt 4023 3851 Pnt 4063 3792 Pnt 3527 3843 Pnt 3024 3875 Pnt 4009 3876 Pnt 3374 3874 Pnt 2709 3917 Pnt 3139 3855 Pnt 2966 3856 Pnt 4099 3864 Pnt 4860 3855 Pnt 3881 3888 Pnt 4107 3862 Pnt 3098 3859 Pnt 3125 3929 Pnt 4766 3909 Pnt 5672 3851 Pnt 3368 3878 Pnt 3867 3877 Pnt 4630 3864 Pnt 3288 3846 Pnt 3673 3857 Pnt 2316 3900 Pnt 4810 3468 Pnt 3731 3902 Pnt 2595 3857 Pnt 3807 3843 Pnt 2831 3900 Pnt 3423 3854 Pnt 3593 3841 Pnt 4772 3818 Pnt 2379 3838 Pnt 4536 3843 Pnt 2732 3886 Pnt 4940 3854 Pnt 4881 3788 Pnt 4383 3802 Pnt 3476 3781 Pnt 4911 3826 Pnt 4692 3848 Pnt 4541 3813 Pnt 2691 3930 Pnt 4650 3779 Pnt 4869 3842 Pnt 3613 3845 Pnt 3351 3846 Pnt 4779 3811 Pnt 4700 3819 Pnt 4899 3807 Pnt 3375 3839 Pnt 4556 3808 Pnt 4594 3815 Pnt 4063 3794 Pnt 4491 3804 Pnt 3496 3846 Pnt 4971 3846 Pnt 4420 3851 Pnt 3255 3847 Pnt 4841 3803 Pnt 4884 3883 Pnt 3876 3843 Pnt 3836 3801 Pnt 2885 3877 Pnt 3633 3788 Pnt 3719 3857 Pnt 3049 3840 Pnt 4521 3871 Pnt 4736 3786 Pnt 4654 3870 Pnt 3974 3791 Pnt 4476 3873 Pnt 4269 3864 Pnt 4531 3796 Pnt 4678 3807 Pnt 3289 3843 Pnt 2859 3907 Pnt 4789 3804 Pnt 3769 3830 Pnt 5509 3910 Pnt 4412 3800 Pnt 4517 3877 Pnt 4797 3555 Pnt 4716 3799 Pnt 5426 3898 Pnt 3591 3846 Pnt 3381 3519 Pnt 4392 3799 Pnt 4577 3807 Pnt 5131 3866 Pnt 5529 3888 Pnt 4721 3915 Pnt 4986 3853 Pnt 3639 3895 Pnt 5175 3414 Pnt 4262 3895 Pnt 4314 3873 Pnt 3662 3849 Pnt 3956 3882 Pnt 2753 3945 Pnt 5351 3884 Pnt 5234 3798 Pnt 2986 3893 Pnt 3025 3937 Pnt 2648 3861 Pnt 3367 3878 Pnt 3428 3851 Pnt 2395 3851 Pnt 2547 3902 Pnt 3528 3862 Pnt 2732 3857 Pnt 2011 3900 Pnt 2743 3944 Pnt 1890 3923 Pnt 3279 3854 Pnt 3391 3885 Pnt 5017 3461 Pnt 4945 3924 Pnt 4561 3893 Pnt 4312 3798 Pnt 3199 3850 Pnt 2401 3937 Pnt 2548 3916 Pnt 4650 3851 Pnt 3150 3853 Pnt 3718 3907 Pnt 3977 3871 Pnt 4518 3803 Pnt 4648 3845 Pnt 5087 3842 Pnt 2083 3838 Pnt 2887 3887 Pnt 3286 3848 Pnt 4797 3835 Pnt 3953 3789 Pnt 4164 3848 Pnt 4036 3845 Pnt 3520 3841 Pnt 4521 3806 Pnt 4432 3882 Pnt 3086 3877 Pnt 4155 3858 Pnt 4781 3814 Pnt 3344 3873 Pnt 4848 3836 Pnt 3869 3789 Pnt 3135 3851 Pnt 4599 3837 Pnt 2520 3875 Pnt 2731 3876 Pnt 4850 3860 Pnt 2671 3874 Pnt 2158 3917 Pnt 4703 3917 Pnt 4137 3846 Pnt 4062 3875 Pnt 3821 3855 Pnt 4375 3882 Pnt 3115 3849 Pnt 3723 3842 Pnt 3298 3779 Pnt 4038 3855 Pnt 3073 3888 Pnt 3350 3929 Pnt 4420 3849 Pnt 2504 3781 Pnt 4059 3792 Pnt 4210 3796 Pnt 2802 3846 Pnt 3468 3846 Pnt 2941 3877 Pnt 2285 3930 Pnt 3641 3786 Pnt 5618 3863 Pnt 4599 3806 Pnt 3657 3880 Pnt 4780 3795 Pnt 4039 3907 Pnt 3827 3851 Pnt 2859 3902 Pnt 3066 3862 Pnt 2044 3900 Pnt 4739 3811 Pnt 3596 3944 Pnt 3316 3885 Pnt 4869 3910 Pnt 2254 3937 Pnt 2397 3861 Pnt 3501 3878 Pnt 2519 3900 Pnt 2665 3857 Pnt 2671 3924 Pnt 3577 3850 Pnt 4299 3796 Pnt 2451 3937 Pnt 1948 3916 Pnt 2659 3860 Pnt 3000 3871 Pnt 4657 3806 Pnt 4915 3915 Pnt 5223 3854 Pnt 2340 3840 Pnt 3919 3849 Pnt 2788 3945 Pnt 4091 3881 Pnt 5230 3915 Pnt 4887 3881 Pnt 4371 3798 Pnt 4991 3845 Pnt 3906 3840 Pnt 4635 3868 Pnt 3159 3848 Pnt 4889 3838 Pnt 3392 3862 Pnt 3292 3887 Pnt 3879 3836 Pnt 3527 3877 Pnt 4163 3887 Pnt 3477 3877 Pnt 3423 3892 Pnt 3247 3896 Pnt 3994 3902 Pnt 2581 3928 Pnt 5146 3850 Pnt 4422 3877 Pnt 4216 3882 Pnt 3402 3849 Pnt 2464 3902 Pnt 2815 3846 Pnt 4359 3895 Pnt 2759 3877 Pnt 3268 3846 Pnt 4214 3900 Pnt 2152 3937 Pnt 2840 3930 Pnt 1925 3916 Pnt 2914 3862 Pnt 3614 3862 Pnt 2522 3937 Pnt 4395 3838 Pnt 3235 3835 Pnt 2461 3900 Pnt 4093 3836 Pnt 3271 3857 Pnt 4351 3910 Pnt 2926 3882 Pnt 4974 3895 Pnt 3601 3893 Pnt 3737 3890 Pnt 3214 3856 Pnt 3689 3839 Pnt 2315 3836 Pnt 3441 3887 Pnt 4036 3882 Pnt 3239 3892 Pnt 3287 3902 Pnt 3142 3896 Pnt 3298 3882 Pnt 2899 3846 Pnt 4696 3884 Pnt 3238 3879 Pnt 2515 3931 Pnt 1871 3916 Pnt 3152 3862 Pnt 3797 3878 Pnt 3326 3890 Pnt 2736 3937 Pnt 4913 3890 Pnt 4886 3835 Pnt 3273 3835 Pnt 3839 3874 Pnt 2426 3872 Pnt 2717 3900 Pnt 2666 3857 Pnt 3188 3882 Pnt 4057 3877 Pnt 4940 3862 Pnt 4709 3892 Pnt 3624 3924 Pnt 3079 3890 Pnt 3949 3842 Pnt 3008 3882 Pnt 4476 3804 Pnt 3276 3879 Pnt 2798 3931 Pnt 2840 3937 Pnt 4624 3863 Pnt 2343 3835 Pnt 2236 3900 Pnt 5010 3840 Pnt 3255 3857 Pnt 3626 3919 Pnt 1912 3926 Pnt 2413 3896 Pnt 4138 3838 Pnt 4376 3917 Pnt 4676 3923 Pnt 2652 3882 Pnt 2574 3835 Pnt 4704 3838 Pnt 3126 3879 Pnt 2170 3937 Pnt 2806 3900 Pnt 2482 3857 Pnt 3694 3815 Pnt 4360 3849 Pnt 3066 3856 Pnt 3041 3873 Pnt 3813 3788 Pnt 2834 3876 Pnt 4115 3881 Pnt 2179 3917 Pnt 4596 3835 Pnt 5081 3910 Pnt 3784 3865 Pnt 4566 3865 Pnt 4863 3917 Pnt 4409 3858 Pnt 4966 3906 Pnt 4163 3915 Pnt 3878 3919 Pnt 3579 3851 Pnt 5051 3851 Pnt 3391 3860 Pnt 3739 3883 Pnt 2553 3896 Pnt 3407 3885 Pnt 2554 3869 Pnt 2730 3835 Pnt 3370 3882 Pnt 2577 3935 Pnt 4795 3902 Pnt 3453 3900 Pnt 3142 3860 Pnt 4568 3920 Pnt 2908 3870 Pnt 2709 3928 Pnt 4540 3882 Pnt 4084 3900 Pnt 3607 3899 Pnt 2119 3917 Pnt 2046 3935 Pnt 5080 3883 Pnt 2068 3900 Pnt 2474 3860 Pnt 4628 3837 Pnt 3381 3870 Pnt 3640 3932 Pnt 2394 3899 Pnt 3267 3843 Pnt 2171 3911 Pnt 4564 3788 Pnt 2814 3935 Pnt 2408 3840 Pnt 2833 3900 Pnt 2737 3945 Pnt 2536 3860 Pnt 4597 3859 Pnt 4822 3860 Pnt 4758 3789 Pnt 4379 3915 Pnt 3975 3856 Pnt 4974 3777 Pnt 4515 3875 Pnt 2653 3901 Pnt 3906 3880 Pnt 2094 3937 Pnt 2684 3946 Pnt 3075 3851 Pnt 2854 3868 Pnt 2636 3910 Pnt 3374 3860 Pnt 3994 3837 Pnt 2759 3896 Pnt 2991 3869 Pnt 3750 3893 Pnt 4066 3890 Pnt 4886 3889 Pnt 4781 3833 Pnt 3059 3929 Pnt 3423 3921 Pnt 4788 3887 Pnt 3511 3880 Pnt 2906 3852 Pnt 3585 3849 Pnt 4896 3198 Pnt 4596 3863 Pnt 4587 3887 Pnt 4743 3861 Pnt 3971 3888 Pnt 4774 3849 Pnt 4794 3814 Pnt 3772 3836 Pnt 3647 3923 Pnt 4436 3850 Pnt 3009 3838 Pnt 3403 3878 Pnt 4822 3888 Pnt 4431 3800 Pnt 4198 3793 Pnt 4615 3785 Pnt 4826 3890 Pnt 4644 3810 Pnt 4572 3883 Pnt 4273 3795 Pnt 4764 3920 Pnt 2593 3900 Pnt 5292 3892 Pnt 4521 3869 Pnt 2457 3911 Pnt 4071 3880 Pnt 4675 3887 Pnt 3938 3788 Pnt 3809 3889 Pnt 4680 3811 Pnt 5037 3918 Pnt 4040 3837 Pnt 3524 3850 Pnt 2215 3836 Pnt 4980 3843 Pnt 3723 3887 Pnt 3426 3844 Pnt 4881 3842 Pnt 4757 3889 Pnt 4461 3850 Pnt 2789 3899 Pnt 3840 3896 Pnt 3994 3896 Pnt 3638 3846 Pnt 4054 3789 Pnt 2376 3916 Pnt 3670 3916 Pnt 3219 3862 Pnt 4885 3880 Pnt 4563 3917 Pnt 3553 3890 Pnt 3795 3893 Pnt 4565 3895 Pnt 4938 3916 Pnt 4459 3919 Pnt 4656 3862 Pnt 3883 3912 Pnt 5210 3881 Pnt 4012 3851 Pnt 2917 3860 Pnt 4494 3802 Pnt 3215 3896 Pnt 4041 3917 Pnt 4739 3813 Pnt 3466 3869 Pnt 4137 3792 Pnt 4918 3892 Pnt 4830 3891 Pnt 3473 3778 Pnt 3126 3939 Pnt 2717 3945 Pnt 3211 3860 Pnt 4574 3806 Pnt 4310 3904 Pnt 4794 3904 Pnt 4568 3912 Pnt 4651 3804 Pnt 3951 3889 Pnt 4011 3911 Pnt 2670 3929 Pnt 3514 3931 Pnt 4342 3796 Pnt 4654 3914 Pnt 2840 3887 Pnt 3243 3893 Pnt 4951 3871 Pnt 3862 3888 Pnt 3312 3841 Pnt 3791 3786 Pnt 4379 3797 Pnt 3010 3840 Pnt 2500 3779 Pnt 3828 3882 Pnt 3300 3777 Pnt 2923 3852 Pnt 4634 3913 Pnt 3785 3856 Pnt 3489 3841 Pnt 3805 3849 Pnt 4319 3860 Pnt 2643 3846 Pnt 4863 3856 Pnt 3814 3838 Pnt 4177 3890 Pnt 3608 3836 Pnt 4545 3900 Pnt 3356 3835 Pnt 4188 3889 Pnt 3962 3911 Pnt 4241 3892 Pnt 2063 3924 Pnt 3672 3785 Pnt 2015 3911 Pnt 2914 3880 Pnt 2357 3834 Pnt 3133 3888 Pnt 4684 3854 Pnt 4566 3924 Pnt 4426 3895 Pnt 3296 3842 Pnt 2445 3888 Pnt 2289 3899 Pnt 4736 3876 Pnt 3309 3911 Pnt 2826 3896 Pnt 3153 3846 Pnt 2660 3916 Pnt 2745 3888 Pnt 3851 3893 Pnt 3302 3893 Pnt 2714 3916 Pnt 4945 3840 Pnt 3117 3810 Pnt 3225 3808 Pnt 2052 3937 Pnt 3018 3846 Pnt 3942 3804 Pnt 2336 3917 Pnt 4500 3907 Pnt 2757 3950 Pnt 2833 3792 Pnt 3356 3931 Pnt 3330 3776 Pnt 3511 3899 Pnt 2941 3917 Pnt 2869 3880 Pnt 1907 3834 Pnt 4772 3775 Pnt 2987 3882 Pnt 4310 3883 Pnt 3279 3852 Pnt 4835 3783 Pnt 3321 3841 Pnt 2655 3900 Pnt 1909 3924 Pnt 4786 3925 Pnt 4788 3882 Pnt 5383 3790 Pnt 4781 3904 Pnt 4682 3852 Pnt 4710 3811 Pnt 4556 3884 Pnt 4638 3808 Pnt 3645 3907 Pnt 3275 3860 Pnt 2358 3917 Pnt 3140 3950 Pnt 4508 3917 Pnt 4600 3950 Pnt 4403 3799 Pnt 4185 3792 Pnt 4631 3907 Pnt 4373 3796 Pnt 3480 3776 Pnt 4284 3793 Pnt 3340 3868 Pnt 2178 3931 Pnt 3167 3868 Pnt 4873 3889 Pnt 4024 3883 Pnt 5133 3863 Pnt 3686 3852 Pnt 3809 3785 Pnt 3934 3786 Pnt 3161 3875 Pnt 3400 3846 Pnt 2560 3868 Pnt 3045 3888 Pnt 3386 3888 Pnt 2793 3876 Pnt 4353 3873 Pnt 2847 3917 Pnt 3367 3899 Pnt 4063 3917 Pnt 2864 3899 Pnt 2564 3917 Pnt 4174 3850 Pnt 3904 3850 Pnt 2938 3859 Pnt 3284 3903 Pnt 2882 3904 Pnt 2917 3860 Pnt 2673 3925 Pnt 2951 3950 Pnt 2453 3932 Pnt 3458 3869 Pnt 3791 3907 Pnt 2596 3868 Pnt 3805 3869 Pnt 3413 3884 Pnt 3273 3883 Pnt 1982 3917 Pnt 4460 3883 Pnt 3622 3912 Pnt 3094 3797 Pnt 2872 3859 Pnt 2077 3925 Pnt 2734 3882 Pnt 2490 3868 Pnt 2904 3860 Pnt 2495 3950 Pnt 2458 3932 Pnt 4441 3872 Pnt 4110 3791 Pnt 3147 3891 Pnt 2973 3876 Pnt 3299 3859 Pnt 3885 3859 Pnt 4700 3894 Pnt 4722 3866 Pnt 3443 3863 Pnt 3689 3850 Pnt 2489 3899 Pnt 1828 3917 Pnt 3677 3862 Pnt 3427 3854 Pnt 3457 3858 Pnt 2233 3896 Pnt 4892 3888 Pnt 2752 3939 Pnt 2438 3942 Pnt 3567 3860 Pnt 4685 3939 Pnt 4407 3797 Pnt 2659 3876 Pnt 2976 3859 Pnt 3945 3904 Pnt 3070 3869 Pnt 4565 3804 Pnt 2756 3931 Pnt 3291 3856 Pnt 3303 3841 Pnt 2512 3935 Pnt 4269 3872 Pnt 4729 3839 Pnt 4830 3871 Pnt 4071 3789 Pnt 3958 3855 Pnt 3212 3891 Pnt 1992 3916 Pnt 2526 3849 Pnt 3153 3849 Pnt 3408 3858 Pnt 1908 3896 Pnt 4504 3854 Pnt 4366 3892 Pnt 4870 3875 Pnt 3648 3783 Pnt 3896 3939 Pnt 4703 3898 Pnt 3837 3883 Pnt 3425 3861 Pnt 3602 3939 Pnt 2455 3939 Pnt 2923 3858 Pnt 4748 3809 Pnt 3053 3881 Pnt 5265 3900 Pnt 4301 3883 Pnt 3827 3479 Pnt 3893 3917 Pnt 3337 3881 Pnt 3954 3899 Pnt 2861 3904 Pnt 3006 3852 Pnt 4526 3881 Pnt 3783 3865 Pnt 4251 3903 Pnt 2536 3932 Pnt 3216 3888 Pnt 2922 3865 Pnt 3776 3883 Pnt 2856 3883 Pnt 2400 3932 Pnt 4758 3870 Pnt 3258 3912 Pnt 2492 3888 Pnt 4741 3852 Pnt 4124 3868 Pnt 2739 3942 Pnt 2175 3916 Pnt 2510 3925 Pnt 2362 3865 Pnt 2987 3860 Pnt 2758 3879 Pnt 2984 3860 Pnt 3416 3857 Pnt 2256 3902 Pnt 3123 3876 Pnt 2557 3942 Pnt 2908 3942 Pnt 2262 3916 Pnt 3533 3942 Pnt 2934 3860 Pnt 2917 3912 Pnt 2377 3902 Pnt 3283 3950 Pnt 2907 3852 Pnt 3785 3904 Pnt 3380 3950 Pnt 3153 3900 Pnt 1986 3942 Pnt 3275 3904 Pnt 1882 3857 Pnt 4269 3876 Pnt 3434 3869 Pnt 2851 3860 Pnt 2198 3932 Pnt 3371 3931 Pnt 3166 3938 Pnt 3521 3931 Pnt 2851 3950 Pnt 2647 3935 Pnt 2264 3860 Pnt 3769 3860 Pnt 3160 3868 Pnt 2735 3865 Pnt 3763 3943 Pnt 2779 3857 Pnt 2352 3902 Pnt 3152 3876 Pnt 3497 3874 Pnt 3614 3902 Pnt 2712 3913 Pnt 2556 3913 Pnt 3173 3860 Pnt 2598 3945 Pnt 3355 3847 Pnt 3312 3945 Pnt 2297 3860 Pnt 2631 3874 Pnt 2396 3865 Pnt 2522 3866 Pnt 3525 3868 Pnt 2960 3913 Pnt 3255 3887 Pnt 2163 3931 Pnt 2414 3945 Pnt 2783 3847 Pnt 3490 3913 Pnt 2436 3847 Pnt 5181 3916 Pnt 3111 3866 Pnt 2360 3932 Pnt 1639 3931 Pnt 2138 3945 Pnt 3841 3932 Pnt 3206 3847 Pnt 2134 3902 Pnt 3238 3866 Pnt 2869 3903 Pnt 2351 3866 Pnt 4707 3945 Pnt 2196 3903 Pnt 3587 3866 Pnt 3802 3903 Pnt 3197 3902 Pnt 2781 3902 Pnt 3206 3870 Pnt 3223 3909 Pnt 2524 3870 Pnt 4997 3891 Pnt 4552 3847 Pnt 4680 3874 Pnt 2342 3943 Pnt 3980 3943 Pnt 3742 3902 Pnt 3121 3870 Pnt 2755 3874 Pnt 5443 3909 Pnt 2668 3902 Pnt 3334 3912 Pnt 2211 3912 Pnt 2704 3920 Pnt 2792 3892 Pnt 3882 3890 Pnt 3828 3888 Pnt 4771 3907 Pnt 2853 3849 Pnt 4664 3867 Pnt 3330 3942 Pnt 4194 3878 Pnt 4515 3899 Pnt 3442 3908 Pnt 4788 3942 Pnt 2491 3943 Pnt 3540 3903 Pnt 3050 3870 Pnt 3195 3902 Pnt 4094 3915 Pnt 3214 3891 Pnt 4538 3936 Pnt 3224 3894 Pnt 2604 3874 Pnt 3440 3887 Pnt 2731 3942 Pnt 3909 3902 Pnt 2580 3874 Pnt 3042 3887 Pnt 3216 3889 Pnt 2376 3889 Pnt 2459 3889 Pnt 5330 3894 Pnt 3197 3864 Pnt 4962 3891 Pnt 3746 3898 Pnt 4859 3891 Pnt 3971 3907 Pnt 4607 3854 Pnt 2492 3902 Pnt 2377 3942 Pnt 3106 3916 Pnt 3131 3855 Pnt 5390 3890 Pnt 2709 3932 Pnt 3678 3491 Pnt 2893 3932 Pnt 2514 3938 Pnt 3380 3847 Pnt 4906 3911 Pnt 3911 3888 Pnt 4271 3890 Pnt 4098 3858 Pnt 4928 3932 Pnt 3525 3853 Pnt 2232 3903 Pnt 2720 3867 Pnt 2740 3915 Pnt 3645 3915 Pnt 2157 3853 Pnt 2234 3903 Pnt 2704 3867 Pnt 5315 3847 Pnt 3278 3915 Pnt 2783 3857 Pnt 3977 3891 Pnt 5220 3894 Pnt 2657 3889 Pnt 3102 3889 Pnt 3360 3455 Pnt 2589 3899 Pnt 2317 3867 Pnt 3215 3907 Pnt 3214 3924 Pnt 2517 3902 Pnt 4149 3889 Pnt 2773 3857 Pnt 2493 3942 Pnt 2678 3886 Pnt 2427 3916 Pnt 3728 3891 Pnt 3694 3867 Pnt 4207 3861 Pnt 3008 3878 Pnt 2781 3889 Pnt 3893 3878 Pnt 2599 3945 Pnt 2995 3944 Pnt 3356 3855 Pnt 3175 3907 Pnt 2450 3936 Pnt 3088 3891 Pnt 2583 3923 Pnt 3880 3907 Pnt 3638 3924 Pnt 2791 3914 Pnt 2059 3912 Pnt 2233 3902 Pnt 3318 3912 Pnt 3250 3861 Pnt 3161 3857 Pnt 3348 3857 Pnt 3057 3868 Pnt 3069 3878 Pnt 3053 3924 Pnt 2646 3912 Pnt 3176 3907 Pnt 2623 3902 Pnt 3583 3924 Pnt 2527 3899 Pnt 3485 3857 Pnt 5629 3942 Pnt 2637 3564 Pnt 2668 3902 Pnt 2160 3899 Pnt 2733 3863 Pnt 4176 3855 Pnt 3471 3913 Pnt 3002 3915 Pnt 2443 3902 Pnt 2498 3897 Pnt 2436 3855 Pnt 3818 3897 Pnt 3574 3906 Pnt 3740 3918 Pnt 4657 3872 Pnt 5366 3868 Pnt 5067 3906 Pnt 4533 3916 Pnt 4981 3849 Pnt 3395 3925 Pnt 5239 3869 Pnt 3269 3878 Pnt 2889 3887 Pnt 2834 3936 Pnt 3353 3887 Pnt 2833 3923 Pnt 2715 3944 Pnt 3496 3920 Pnt 2312 3914 Pnt 3634 3847 Pnt 3023 3897 Pnt 2934 3942 Pnt 4316 3923 Pnt 4501 3889 Pnt 3785 3917 Pnt 4060 3886 Pnt 5025 3892 Pnt 4192 3886 Pnt 3257 3849 Pnt 5366 3888 Pnt 3137 3920 Pnt 3692 3915 Pnt 3623 3920 Pnt 3382 3913 Pnt 2509 3913 Pnt 3895 3914 Pnt 3671 3907 Pnt 4059 3915 Pnt 4240 3863 Pnt 3717 3917 Pnt 5403 3861 Pnt 4413 3870 Pnt 5494 3909 Pnt 4819 3915 Pnt 5364 3908 Pnt 4655 3893 Pnt 2982 3887 Pnt 2629 3917 Pnt 2496 3267 Pnt 2452 3933 Pnt 2618 3867 Pnt 2183 3942 Pnt 3116 3886 Pnt 2147 3915 Pnt 2707 3902 Pnt 2967 3855 Pnt 3830 3855 Pnt 2915 3906 Pnt 3744 3885 Pnt 3512 3923 Pnt 4317 3914 Pnt 4756 3304 Pnt 3954 3916 Pnt 4931 3900 Pnt 3730 3877 Pnt 5364 3905 Pnt 3452 3873 Pnt 4997 3885 Pnt 5224 3903 Pnt 4588 3913 Pnt 4891 3897 Pnt 3656 3888 Pnt 5295 3873 Pnt 4405 3911 Pnt 3357 3906 Pnt 5307 3929 Pnt 3725 3863 Pnt 3206 3917 Pnt 4022 3926 Pnt 2544 3867 Pnt 2795 3906 Pnt 5197 3903 Pnt 4914 3917 Pnt 3921 3885 Pnt 5271 3891 Pnt 3046 3906 Pnt 5463 3945 Pnt 3565 3915 Pnt 4065 3917 Pnt 4437 3918 Pnt 4821 3915 Pnt 3790 3926 Pnt 2542 3867 Pnt 3308 3906 Pnt 4148 3917 Pnt 4525 3912 Pnt 3868 3907 Pnt 4430 3871 Pnt 4780 3884 Pnt 3707 3868 Pnt 3484 3927 Pnt 3750 3884 Pnt 4174 3869 Pnt 5193 3887 Pnt 5401 3863 Pnt 4677 3915 Pnt 2810 3940 Pnt 4118 3872 Pnt 4300 3914 Pnt 4170 3914 Pnt 3127 3928 Pnt 4968 3902 Pnt 2867 3878 Pnt 4283 3878 Pnt 5437 3932 Pnt 3187 3940 Pnt 4021 3868 Pnt 5322 3890 Pnt 4659 3867 Pnt 3001 3920 Pnt 3886 3920 Pnt 2667 3895 Pnt 3727 3913 Pnt 2435 3905 Pnt 2366 3915 Pnt 4288 3915 Pnt 4261 3895 Pnt 2798 3928 Pnt 2695 3878 Pnt 3476 3940 Pnt 4436 3874 Pnt 2858 3856 Pnt 4870 3855 Pnt 4044 3805 Pnt 4315 3822 Pnt 4340 3877 Pnt 3615 3877 Pnt 3907 3863 Pnt 5540 3801 Pnt 4949 3820 Pnt 3697 3897 Pnt 2698 3867 Pnt 1994 3865 Pnt 2302 3920 Pnt 2667 3895 Pnt 4528 3867 Pnt 4732 3591 Pnt 5283 3808 Pnt 3518 3873 Pnt 4063 3915 Pnt 3242 3931 Pnt 3971 3878 Pnt 5079 3877 Pnt 5533 3821 Pnt 4647 3931 Pnt 4950 3895 Pnt 3001 3933 Pnt 2362 3945 Pnt 3833 3918 Pnt 2380 3936 Pnt 2024 3942 Pnt 1881 3915 Pnt 4072 3936 Pnt 2467 3902 Pnt 2414 3855 Pnt 4102 3860 Pnt 4922 3867 Pnt 5039 3819 Pnt 4361 3887 Pnt 2968 3849 Pnt 5326 3860 Pnt 4600 3294 Pnt 4408 3919 Pnt 4616 3890 Pnt 2800 3866 Pnt 2284 3915 Pnt 4306 3910 Pnt 5053 3870 Pnt 4775 3158 Pnt 4981 3856 Pnt 5195 3555 Pnt 4576 3855 Pnt 4733 3861 Pnt 4736 3864 Pnt 2745 3867 Pnt 3945 3807 Pnt 5380 3874 Pnt 4266 3859 Pnt 3118 3801 Pnt 5349 3937 Pnt 2827 3913 Pnt 2977 3895 Pnt 3617 3913 Pnt 5002 3868 Pnt 4417 3458 Pnt 3226 3888 Pnt 5126 3913 Pnt 3433 3933 Pnt 2120 3942 Pnt 2308 3913 Pnt 2169 3902 Pnt 3843 3820 Pnt 5177 3874 Pnt 2079 3855 Pnt 4234 3897 Pnt 4875 3913 Pnt 4540 3861 Pnt 3666 3804 Pnt 4583 3856 Pnt 2791 3811 Pnt 3336 3809 Pnt 3800 3855 Pnt 2435 3906 Pnt 5003 3803 Pnt 4696 3877 Pnt 2704 3933 Pnt 5027 3908 Pnt 4937 3802 Pnt 5205 3807 Pnt 4253 3838 Pnt 4999 3842 Pnt 4712 3473 Pnt 3595 3819 Pnt 3177 3863 Pnt 4114 3822 Pnt 3069 3877 Pnt 4840 3803 Pnt 2831 3945 Pnt 4248 3858 Pnt 3390 3936 Pnt 5042 3847 Pnt 3457 3803 Pnt 4007 3856 Pnt 2919 3863 Pnt 3775 3887 Pnt 4801 3942 Pnt 2993 3839 Pnt 3503 3867 Pnt 2672 3913 Pnt 2279 3933 Pnt 3377 3802 Pnt 2712 3944 Pnt 4189 3913 Pnt 4861 3861 Pnt 2854 3913 Pnt 2106 3902 Pnt 3772 3930 Pnt 3352 3818 Pnt 2988 3930 Pnt 4355 3861 Pnt 4355 3866 Pnt 4632 3900 Pnt 5146 3900 Pnt 3533 3862 Pnt 3132 3866 Pnt 4981 3866 Pnt 4028 3856 Pnt 2270 3867 Pnt 5137 3862 Pnt 5165 3900 Pnt 5166 3889 Pnt 4684 3859 Pnt 3163 3855 Pnt 3982 3808 Pnt 4726 3857 Pnt 3934 3931 Pnt 4564 3806 Pnt 5105 3868 Pnt 2720 3903 Pnt 2795 3809 Pnt 4250 3857 Pnt 3962 3805 Pnt 5236 3940 Pnt 4403 3903 Pnt 3107 3799 Pnt 4669 3860 Pnt 4575 3857 Pnt 5547 3917 Pnt 4665 3802 Pnt 4459 3927 Pnt 4835 3891 Pnt 3357 3890 Pnt 3940 3806 Pnt 3136 3839 Pnt 2947 3933 Pnt 3644 3909 Pnt 3493 3910 Pnt 3450 3802 Pnt 3805 3930 Pnt 3879 3950 Pnt 3643 3809 Pnt 3577 3900 Pnt 4887 3925 Pnt 3640 3866 Pnt 4262 3856 Pnt 2813 3856 Pnt 3727 3913 Pnt 4797 3889 Pnt 4260 3862 Pnt 4818 3822 Pnt 4685 3857 Pnt 4798 3860 Pnt 4574 3853 Pnt 3958 3867 Pnt 5109 3851 Pnt 3827 3803 Pnt 4601 3867 Pnt 3787 3891 Pnt 3898 3839 Pnt 3325 3867 Pnt 3245 3926 Pnt 5135 3839 Pnt 4036 3891 Pnt 3299 3867 Pnt 5202 3866 Pnt 4927 3837 Pnt 5163 3930 Pnt 3744 3884 Pnt 2708 3867 Pnt 4015 3821 Pnt 5005 3841 Pnt 4627 3910 Pnt 2119 3799 Pnt 4744 3862 Pnt 4864 3932 Pnt 4993 3927 Pnt 5366 3943 Pnt 4475 3853 Pnt 3426 3829 Pnt 4162 3890 Pnt 2711 3933 Pnt 4475 3961 Pnt 3774 3908 Pnt 5228 3889 Pnt 3214 3854 Pnt 4009 3806 Pnt 4478 3914 Pnt 3282 3903 Pnt 4692 3802 Pnt 4811 3852 Pnt 5359 3829 Pnt 2760 3867 Pnt 4050 3807 Pnt 4305 3881 Pnt 4661 3878 Pnt 3868 3905 Pnt 2651 3933 Pnt 4029 3895 Pnt 5113 3876 Pnt 4026 3895 Pnt 3652 3913 Pnt 4413 3902 Pnt 4720 3852 Pnt 4674 3854 Pnt 3990 3829 Pnt 3753 3918 Pnt 2550 3933 Pnt 2902 3950 Pnt 4829 3933 Pnt 4716 3918 Pnt 3790 3930 Pnt 3598 3807 Pnt 4960 3858 Pnt 3154 3900 Pnt 3187 3800 Pnt 2831 3856 Pnt 2103 3913 Pnt 3508 3860 Pnt 3417 3876 Pnt 4645 3911 Pnt 4991 3803 Pnt 3820 3805 Pnt 5055 3861 Pnt 4020 3863 Pnt 2868 3877 Pnt 5036 3145 Pnt 4926 3925 Pnt 4589 3834 Pnt 2591 3940 Pnt 4366 3881 Pnt 3480 3801 Pnt 2927 3938 Pnt 2927 3863 Pnt 4934 3885 Pnt 3857 3887 Pnt 4959 3865 Pnt 3703 3849 Pnt 4875 3884 Pnt 2972 3944 Pnt 5141 3198 Pnt 2903 3913 Pnt 2179 3902 Pnt 2834 3861 Pnt 3909 3884 Pnt 3824 3877 Pnt 4282 3884 Pnt 4553 3923 Pnt 4392 3858 Pnt 4838 3895 Pnt 2584 3927 Pnt 3537 3890 Pnt 4862 3891 Pnt 4313 3894 Pnt 4408 3857 Pnt 3399 3807 Pnt 5693 3851 Pnt 4618 3892 Pnt 4034 3878 Pnt 2534 3924 Pnt 2995 3902 Pnt 3990 3855 Pnt 4462 3925 Pnt 4576 3857 Pnt 4430 3883 Pnt 4638 3883 Pnt 3289 3852 Pnt 2764 3807 Pnt 4311 3860 Pnt 3999 3859 Pnt 3089 3797 Pnt 3538 3918 Pnt 2311 3911 Pnt 3409 3915 Pnt 3215 3861 Pnt 3253 3877 Pnt 2889 3812 Pnt 3473 3832 Pnt 4979 3827 Pnt 4122 3824 Pnt 4098 3884 Pnt 3227 3927 Pnt 2466 3924 Pnt 5049 3914 Pnt 2838 3902 Pnt 4945 3829 Pnt 2946 3855 Pnt 3487 3900 Pnt 3240 3893 Pnt 5034 3826 Pnt 4258 3903 Pnt 4049 3900 Pnt 3528 3859 Pnt 5126 3855 Pnt 2844 3877 Pnt 4499 3903 Pnt 5180 3859 Pnt 2770 3867 Pnt 4678 3833 Pnt 4422 3858 Pnt 4243 3855 Pnt 4699 3895 Pnt 4330 3882 Pnt 3794 3801 Pnt 3659 3800 Pnt 3398 3885 Pnt 4735 3898 Pnt 4590 3853 Pnt 2783 3950 Pnt 4782 3882 Pnt 4175 3879 Pnt 2312 3875 Pnt 4348 3857 Pnt 2367 3911 Pnt 2977 3915 Pnt 4017 3836 Pnt 4735 3802 Pnt 3884 3905 Pnt 4449 3846 Pnt 4790 3930 Pnt 3571 3938 Pnt 3482 3933 Pnt 5169 3859 Pnt 4743 3799 Pnt 4742 3860 Pnt 4410 3895 Pnt 4051 3832 Pnt 4294 3894 Pnt 2911 3824 Pnt 3358 3927 Pnt 3419 3924 Pnt 4099 3893 Pnt 4043 3918 Pnt 2164 3890 Pnt 3426 3900 Pnt 4582 3852 Pnt 4786 3918 Pnt 4805 3900 Pnt 4747 3903 Pnt 3936 3803 Pnt 4875 3900 Pnt 3485 3891 Pnt 4498 3851 Pnt 4673 3828 Pnt 4757 3813 Pnt 4750 3832 Pnt 3901 3830 Pnt 4210 3836 Pnt 3453 3877 Pnt 3027 3905 Pnt 3798 3887 Pnt 2931 3869 Pnt 3929 3829 Pnt 3271 3849 Pnt 3977 3892 Pnt 3101 3944 Pnt 3649 3882 Pnt 2169 3913 Pnt 2263 3899 Pnt 3484 3861 Pnt 3778 3828 Pnt 4892 3851 Pnt 3371 3802 Pnt 2146 3933 Pnt 4671 3798 Pnt 4321 3804 Pnt 3747 3914 Pnt 2841 3855 Pnt 4771 3853 Pnt 3400 3905 Pnt 4088 3917 Pnt 4679 3855 Pnt 3657 3905 Pnt 3616 3807 Pnt 4170 3902 Pnt 2209 3893 Pnt 3877 3902 Pnt 2994 3852 Pnt 4299 3837 Pnt 4907 3854 Pnt 4265 3859 Pnt 3604 3827 Pnt 2994 3915 Pnt 4484 3918 Pnt 3729 3950 Pnt 2421 3891 Pnt 3587 3864 Pnt 2818 3875 Pnt 2920 3911 Pnt 4947 3811 Pnt 4689 3827 Pnt 4782 3836 Pnt 2842 3905 Pnt 4169 3848 Pnt 3087 3940 Pnt 3044 3837 Pnt 4202 3856 Pnt 3979 3833 Pnt 1820 3798 Pnt 3659 3849 Pnt 3212 3860 Pnt 2685 3899 Pnt 2644 3930 Pnt 2356 3924 Pnt 4062 3852 Pnt 4263 3887 Pnt 4672 3905 Pnt 3055 3869 Pnt 3232 3944 Pnt 2153 3913 Pnt 4683 3860 Pnt 4223 3917 Pnt 3315 3807 Pnt 3837 3882 Pnt 4577 3944 Pnt 4416 3840 Pnt 3181 3852 Pnt 2774 3806 Pnt 4549 3130 Pnt 3632 3802 Pnt 3112 3797 Pnt 2963 3940 Pnt 4016 3806 Pnt 1965 3933 Pnt 4454 3829 Pnt 3775 3861 Pnt 3441 3933 Pnt 4774 3831 Pnt 3918 3802 Pnt 3796 3803 Pnt 3155 3799 Pnt 4425 3880 Pnt 4382 3880 Pnt 3359 3826 Pnt 4013 3853 Pnt 4824 3838 Pnt 3558 3905 Pnt 4728 3834 Pnt 4726 3853 Pnt 4359 3856 Pnt 4596 3854 Pnt 3450 3798 Pnt 5159 3874 Pnt 4781 3859 Pnt 4242 3854 Pnt 3936 3829 Pnt 5160 3870 Pnt 3590 3825 Pnt 4418 3915 Pnt 3163 3886 Pnt 4039 3860 Pnt 5119 3863 Pnt 5125 3905 Pnt 4220 3834 Pnt 2415 3933 Pnt 4787 3861 Pnt 2311 3861 Pnt 4740 3861 Pnt 4671 3828 Pnt 4745 3860 Pnt 4561 3853 Pnt 4053 3830 Pnt 2907 3823 Pnt 4333 3940 Pnt 3978 3804 Pnt 3483 3858 Pnt 4560 3851 Pnt 4394 3857 Pnt 4677 3855 Pnt 4220 3905 Pnt 3642 3800 Pnt 3793 3801 Pnt 2914 3864 Pnt 2077 3823 Pnt 3370 3823 Pnt 3116 3855 Pnt 2994 3911 Pnt 2964 3853 Pnt 2742 3950 Pnt 3065 3947 Pnt 4767 3899 Pnt 3052 3841 Pnt 3184 3841 Pnt 4244 3855 Pnt 1823 3911 Pnt 3547 3912 Pnt 2660 3853 Pnt 2340 3823 Pnt 2958 3853 Pnt 3707 3947 Pnt 5532 3917 Pnt 4707 3858 Pnt 3265 3888 Pnt 4684 3827 Pnt 2539 3902 Pnt 2220 3899 Pnt 4002 3562 Pnt 3111 3930 Pnt 1988 3924 Pnt 3435 3903 Pnt 4402 3930 Pnt 3550 3920 Pnt 2820 3864 Pnt 2911 3949 Pnt 3935 3949 Pnt 4080 3908 Pnt 4074 3852 Pnt 4685 3881 Pnt 4795 3810 Pnt 4775 3811 Pnt 3990 3852 Pnt 1968 3822 Pnt 4047 3822 Pnt 2910 3888 Pnt 2846 3903 Pnt 2588 3899 Pnt 4275 3836 Pnt 2640 3940 Pnt 4224 3899 Pnt 3736 3930 Pnt 2392 3922 Pnt 2580 3912 Pnt 3534 3868 Pnt 3860 3914 Pnt 3865 3837 Pnt 4344 3837 Pnt 2678 3949 Pnt 3273 3944 Pnt 3088 3944 Pnt 4638 3856 Pnt 3578 3949 Pnt 2333 3822 Pnt 4730 3833 Pnt 4175 3837 Pnt 2557 3888 Pnt 3696 3805 Pnt 3431 3903 Pnt 2324 3899 Pnt 3335 3869 Pnt 2175 3934 Pnt 2139 3934 Pnt 4323 3903 Pnt 2909 3930 Pnt 1950 3922 Pnt 2706 3944 Pnt 1961 3914 Pnt 4379 3852 Pnt 3012 3868 Pnt 3814 3840 Pnt 4546 3852 Pnt 3779 3949 Pnt 2730 3905 Pnt 5139 3177 Pnt 3236 3869 Pnt 4681 3869 Pnt 2496 3830 Pnt 3298 3886 Pnt 4028 3922 Pnt 2788 3933 Pnt 2414 3905 Pnt 2470 3861 Pnt 3542 3852 Pnt 2873 3937 Pnt 3215 3949 Pnt 3765 3849 Pnt 4513 3803 Pnt 3112 3903 Pnt 4238 3844 Pnt 2961 3886 Pnt 2818 3905 Pnt 2265 3937 Pnt 2193 3949 Pnt 3060 3851 Pnt 3618 3910 Pnt 3588 3805 Pnt 3066 3868 Pnt 2713 3934 Pnt 2337 3922 Pnt 4341 3930 Pnt 3235 3852 Pnt 2845 3852 Pnt 2630 3915 Pnt 3278 3869 Pnt 2650 3913 Pnt 2721 3933 Pnt 2946 3859 Pnt 4091 3879 Pnt 4706 3859 Pnt 4663 3830 Pnt 3303 3805 Pnt 3996 3804 Pnt 4566 3880 Pnt 4915 3822 Pnt 3905 3803 Pnt 3252 3922 Pnt 3115 3836 Pnt 2522 3905 Pnt 4483 3828 Pnt 3463 3799 Pnt 3621 3800 Pnt 3150 3797 Pnt 3177 3920 Pnt 2877 3949 Pnt 4817 3905 Pnt 2838 3952 Pnt 2761 3952 Pnt 4893 3823 Pnt 3797 3801 Pnt 2856 3915 Pnt 1789 3796 Pnt 2760 3852 Pnt 3456 3805 Pnt 4058 3851 Pnt 3097 3805 Pnt 2998 3937 Pnt 3642 3868 Pnt 2426 3918 Pnt 2388 3933 Pnt 3192 3859 Pnt 4004 3930 Pnt 4396 3868 Pnt 5372 3922 Pnt 4727 3918 Pnt 4772 3932 Pnt 4803 3910 Pnt 3084 3838 Pnt 4693 3828 Pnt 2921 3852 Pnt 4191 3838 Pnt 4681 3825 Pnt 4770 3830 Pnt 4420 3838 Pnt 4237 3837 Pnt 3697 3825 Pnt 2914 3822 Pnt 4384 3878 Pnt 3872 3914 Pnt 4227 3833 Pnt 3903 3878 Pnt 4053 3829 Pnt 1933 3821 Pnt 2432 3918 Pnt 4287 3836 Pnt 3153 3905 Pnt 3088 3952 Pnt 4051 3830 Pnt 3584 3824 Pnt 3898 3828 Pnt 3092 3937 Pnt 1934 3933 Pnt 3345 3823 Pnt 3043 3863 Pnt 4656 3952 Pnt 3629 3805 Pnt 3158 3932 Pnt 4558 3920 Pnt 3048 3853 Pnt 3651 3908 Pnt 4413 3800 Pnt 3272 3796 Pnt 4415 3852 Pnt 4781 3879 Pnt 3632 3833 Pnt 3963 3822 Pnt 3557 3910 Pnt 3954 3821 Pnt 2962 3939 Pnt 3932 3868 Pnt 2383 3930 Pnt 4298 3837 Pnt 3256 3863 Pnt 2834 3853 Pnt 3184 3797 Pnt 4008 3920 Pnt 3865 3907 Pnt 4301 3833 Pnt 4732 3862 Pnt 4068 3878 Pnt 3462 3799 Pnt 4685 3827 Pnt 4918 3871 Pnt 4939 3849 Pnt 4363 3836 Pnt 3377 3805 Pnt 4617 3922 Pnt 4051 3804 Pnt 3875 3827 Pnt 2392 3949 Pnt 3773 3801 Pnt 2064 3934 Pnt 3647 3800 Pnt 4734 3826 Pnt 4690 3935 Pnt 3282 3915 Pnt 4390 3877 Pnt 4329 3851 Pnt 5350 3828 Pnt 4730 3831 Pnt 4755 3829 Pnt 4406 3837 Pnt 2171 3915 Pnt 3577 3908 Pnt 2035 3796 Pnt 3927 3852 Pnt 5466 3823 Pnt 4659 3826 Pnt 4082 3433 Pnt 3508 3851 Pnt 1946 3915 Pnt 4273 3832 Pnt 4291 3915 Pnt 5012 3900 Pnt 3917 3827 Pnt 4892 3913 Pnt 3354 3822 Pnt 4357 3831 Pnt 2377 3932 Pnt 3340 3939 Pnt 4086 3829 Pnt 2705 3871 Pnt 2814 3929 Pnt 2167 3932 Pnt 2456 3939 Pnt 2411 3871 Pnt 5189 3914 Pnt 3492 3871 Pnt 3143 3868 Pnt 3176 3838 Pnt 2826 3934 Pnt 2046 3948 Pnt 2675 3935 Pnt 3714 3903 Pnt 2435 3871 Pnt 4478 3836 Pnt 3841 3838 Pnt 2090 3935 Pnt 2250 3871 Pnt 4048 3902 Pnt 4161 3917 Pnt 3130 3939 Pnt 2422 3871 Pnt 2115 3939 Pnt 2644 3871 Pnt 4799 3835 Pnt 2612 3871 Pnt 4841 3891 Pnt 1913 3871 Pnt 3915 3938 Pnt 3453 3852 Pnt 3744 3825 Pnt 2915 3821 Pnt 3174 3849 Pnt 3758 3852 Pnt 2108 3915 Pnt 2195 3935 Pnt 4006 3849 Pnt 4085 3938 Pnt 3635 3852 Pnt 4694 3828 Pnt 2636 3938 Pnt 3241 3852 Pnt 4836 3839 Pnt 4279 3947 Pnt 3975 3803 Pnt 4457 3947 Pnt 3154 3947 Pnt 4675 3879 Pnt 5408 3871 Pnt 4769 3866 Pnt 3157 3852 Pnt 4066 3828 Pnt 3559 3874 Pnt 4772 3865 Pnt 2891 3930 Pnt 5288 3890 Pnt 4597 3891 Pnt 3355 3868 Pnt 3738 3917 Pnt 3697 3868 Pnt 2065 3915 Pnt 2559 3939 Pnt 3674 3952 Pnt 4494 3939 Pnt 4492 3952 Pnt 5238 3917 Pnt 3574 3849 Pnt 4310 3866 Pnt 4460 3872 Pnt 3965 3866 Pnt 3164 3874 Pnt 2869 3930 Pnt 3703 3891 Pnt 4160 3869 Pnt 3491 3868 Pnt 2985 3864 Pnt 2963 3917 Pnt 3740 3865 Pnt 2837 3939 Pnt 2952 3866 Pnt 2364 3931 Pnt 2774 3891 Pnt 2462 3868 Pnt 3383 3864 Pnt 2538 3917 Pnt 5259 3910 Pnt 2934 3939 Pnt 4242 3882 Pnt 2726 3931 Pnt 3325 3864 Pnt 2000 3939 Pnt 2998 3942 Pnt 2805 3931 Pnt 2747 3864 Pnt 1895 3939 Pnt 2495 3942 Pnt 5349 3925 Pnt 4118 3866 Pnt 2163 3929 Pnt 2520 3938 Pnt 3274 3942 Pnt 2572 3929 Pnt 2846 3938 Pnt 2614 3929 Pnt 2155 3938 Pnt 5184 3864 Pnt 2869 3932 Pnt 4191 3942 Pnt 3358 3917 Pnt 3422 3938 Pnt 1771 3938 Pnt 1631 3938 Pnt 2356 3936 Pnt 2323 3936 Pnt 3491 3864 Pnt 2442 3864 Pnt 2291 3932 Pnt 2288 3917 Pnt 4748 3910 Pnt 2450 3821 Pnt 3845 3932 Pnt 1873 3936 Pnt 3243 3918 Pnt 5203 3864 Pnt 3169 3905 Pnt 4043 3913 Pnt 3623 3849 Pnt 3116 3952 Pnt 3103 3919 Pnt 2442 3903 Pnt 5291 3868 Pnt 2170 3903 Pnt 1708 3913 Pnt 2738 3903 Pnt 3447 3805 Pnt 2071 3805 Pnt 3381 3805 Pnt 2535 3903 Pnt 3867 3920 Pnt 3588 3935 Pnt 2439 3903 Pnt 4381 3916 Pnt 2033 3932 Pnt 2619 3952 Pnt 2337 3934 Pnt 2325 3916 Pnt 4205 3831 Pnt 2629 3952 Pnt 5812 3886 Pnt 4141 3849 Pnt 2638 3934 Pnt 2159 3960 Pnt 2801 3952 Pnt 3616 3823 Pnt 3513 3849 Pnt 3930 3826 Pnt 4387 3871 Pnt 4971 3917 Pnt 4032 3868 Pnt 3538 3872 Pnt 4613 3831 Pnt 3223 3878 Pnt 3455 3929 Pnt 2727 3934 Pnt 2983 3949 Pnt 5376 3866 Pnt 5313 3916 Pnt 3700 3942 Pnt 5319 3949 Pnt 3843 3868 Pnt 4523 3483 Pnt 5065 3886 Pnt 2477 3916 Pnt 2324 3820 Pnt 3641 3875 Pnt 3594 3951 Pnt 3729 3951 Pnt 5257 3413 Pnt 5023 3919 Pnt 3357 3934 Pnt 3625 3935 Pnt 2426 3952 Pnt 2909 3952 Pnt 2413 3935 Pnt 2269 3952 Pnt 2464 3935 Pnt 3620 3951 Pnt 2721 3945 Pnt 4296 3940 Pnt 3508 3949 Pnt 5140 3949 Pnt 4160 3939 Pnt 1789 3939 Pnt 1710 3939 Pnt 2555 3940 Pnt 2889 3940 Pnt 3641 3940 Pnt 2078 3940 Pnt 2700 3940 Pnt 3067 3940 Pnt 4824 3905 Pnt 4536 3883 Pnt 3548 3916 Pnt 2258 3934 Pnt 4163 3905 Pnt 2459 3820 Pnt 2629 3945 Pnt 2562 3932 Pnt 3426 3905 Pnt 3021 3949 Pnt 3921 3919 Pnt 3014 3921 Pnt 2608 3921 Pnt 4888 3883 Pnt 3704 3883 Pnt 3269 3883 Pnt 4199 3883 Pnt 2199 3921 Pnt 2804 3883 Pnt 2615 3876 Pnt 4282 3874 Pnt 2930 3915 Pnt 5469 3865 Pnt 4673 3951 Pnt 2104 3916 Pnt 2252 3934 Pnt 2578 3941 Pnt 2659 3945 Pnt 5063 3867 Pnt 3084 3932 Pnt 2946 3949 Pnt 4591 3866 Pnt 3183 3887 Pnt 5811 3861 Pnt 5319 3636 Pnt 2909 3902 Pnt 3215 3836 Pnt 5354 3901 Pnt 5281 3391 Pnt 5002 3878 Pnt 4245 3864 Pnt 3947 3915 Pnt 2915 3945 Pnt 4005 3862 Pnt 5193 3884 Pnt 4349 3929 Pnt 3770 3876 Pnt 3730 3925 Pnt 5212 3876 Pnt 3882 3924 Pnt 3603 3870 Pnt 3315 3906 Pnt 3266 3877 Pnt 4345 3954 Pnt 2048 3919 Pnt 2905 3933 Pnt 2767 3941 Pnt 3273 3932 Pnt 2694 3866 Pnt 3174 3887 Pnt 3878 3901 Pnt 2980 3906 Pnt 4459 3868 Pnt 4503 3906 Pnt 2639 3941 Pnt 3562 3941 Pnt 4032 3863 Pnt 3287 3879 Pnt 4726 3905 Pnt 4263 3936 Pnt 3805 3902 Pnt 3926 3933 Pnt 2938 3933 Pnt 2279 3933 Pnt 3295 3902 Pnt 3945 3933 Pnt 2927 3932 Pnt 4188 3875 Pnt 2546 3902 Pnt 2291 3902 Pnt 3408 3932 Pnt 3120 3902 Pnt 2201 3932 Pnt 2265 3902 Pnt 2944 3936 Pnt 2491 3902 Pnt 2294 3936 Pnt 2455 3902 Pnt 2393 3902 Pnt 4768 3906 Pnt 3492 3936 Pnt 5405 3836 Pnt 2034 3936 Pnt 3669 3903 Pnt 5131 3949 Pnt 4341 3876 Pnt 4351 3903 Pnt 3098 3906 Pnt 2236 3941 Pnt 2118 3941 Pnt 4419 3866 Pnt 2977 3940 Pnt 2264 3940 Pnt 3765 3861 Pnt 3518 3940 Pnt 2627 3940 Pnt 2535 3940 Pnt 4122 3942 Pnt 2731 3947 Pnt 2946 3942 Pnt 2222 3942 Pnt 3153 3947 Pnt 2611 3947 Pnt 2479 3947 Pnt 3445 3942 Pnt 2871 3948 Pnt 3395 3947 Pnt 3256 3948 Pnt 3811 3873 Pnt 3476 3899 Pnt 3484 3906 Pnt 4139 3948 Pnt 5399 3856 Pnt 5621 3862 Pnt 2300 3936 Pnt 5132 3877 Pnt 5229 3522 Pnt 5289 3572 Pnt 4699 3904 Pnt 4313 3861 Pnt 4449 3863 Pnt 4090 3878 Pnt 4166 3948 Pnt 2170 3915 Pnt 3931 3857 Pnt 2696 3945 Pnt 2947 3899 Pnt 5301 3945 Pnt 2385 3948 Pnt 4180 3948 Pnt 3805 3876 Pnt 3144 3878 Pnt 3216 3958 Pnt 3513 3870 Pnt 2763 3865 Pnt 2078 3899 Pnt 2313 3948 Pnt 2617 3958 Pnt 3607 3954 Pnt 2378 3917 Pnt 4344 3906 Pnt 3520 3917 Pnt 2996 3933 Pnt 3070 3930 Pnt 2902 3866 Pnt 2855 3899 Pnt 3821 3877 Pnt 2550 3945 Pnt 4067 3945 Pnt 2158 3917 Pnt 3156 3865 Pnt 5180 3882 Pnt 2959 3914 Pnt 3061 3956 Pnt 2532 3899 Pnt 2927 3936 Pnt 2431 3945 Pnt 3429 3958 Pnt 3940 3958 Pnt 3368 3914 Pnt 3377 3914 Pnt 4385 3941 Pnt 3847 3958 Pnt 3758 3856 Pnt 4498 3887 Pnt 4388 3921 Pnt 5004 3943 Pnt 5771 3952 Pnt 3580 3865 Pnt 3277 3877 Pnt 3530 3917 Pnt 4397 3851 Pnt 2800 3930 Pnt 2211 3939 Pnt 2353 3900 Pnt 2661 3938 Pnt 2650 3945 Pnt 2885 3958 Pnt 4535 3938 Pnt 2833 3933 Pnt 4057 3858 Pnt 4046 3914 Pnt 3582 3862 Pnt 4260 3858 Pnt 4917 3871 Pnt 4484 3943 Pnt 2420 3940 Pnt 3991 3940 Pnt 3806 3918 Pnt 3318 3876 Pnt 5459 3924 Pnt 4989 3923 Pnt 5122 3870 Pnt 3779 3851 Pnt 4727 3954 Pnt 3544 3858 Pnt 4416 3954 Pnt 2137 3917 Pnt 5411 3928 Pnt 2611 3929 Pnt 2327 3900 Pnt 3043 3938 Pnt 4483 3859 Pnt 5266 3876 Pnt 4919 3866 Pnt 5618 3927 Pnt 4387 3956 Pnt 5169 3946 Pnt 4055 3926 Pnt 4860 3955 Pnt 5002 3930 Pnt 5317 3950 Pnt 4261 3926 Pnt 4104 3923 Pnt 2455 3954 Pnt 2051 3917 Pnt 2758 3929 Pnt 4986 3956 Pnt 4343 3856 Pnt 2827 3900 Pnt 2625 3942 Pnt 3380 3958 Pnt 3676 3958 Pnt 2794 3933 Pnt 1796 3933 Pnt 5374 3945 Pnt 3991 3936 Pnt 4055 3853 Pnt 2466 3900 Pnt 4135 3873 Pnt 2350 3885 Pnt 3307 3890 Pnt 4484 3934 Pnt 3805 3931 Pnt 3925 3836 Pnt 2297 3836 Pnt 2138 3940 Pnt 3055 3920 Pnt 3104 3873 Pnt 2844 3871 Pnt 4027 3911 Pnt 3121 3876 Pnt 4941 3938 Pnt 4038 3941 Pnt 4095 3931 Pnt 4448 3952 Pnt 5026 3955 Pnt 4507 3836 Pnt 2122 3940 Pnt 3516 3861 Pnt 5162 3861 Pnt 3529 3920 Pnt 3369 3873 Pnt 2651 3871 Pnt 5289 3946 Pnt 3971 3871 Pnt 3643 3893 Pnt 3400 3918 Pnt 3177 3876 Pnt 4460 3920 Pnt 4843 3933 Pnt 4227 3888 Pnt 5320 3940 Pnt 5213 3892 Pnt 4969 3330 Pnt 4907 3881 Pnt 5029 3937 Pnt 4259 3855 Pnt 4024 3889 Pnt 5072 3955 Pnt 4196 3929 Pnt 4037 3889 Pnt 4189 3919 Pnt 4798 3929 Pnt 5108 3919 Pnt 4815 3903 Pnt 4905 3928 Pnt 5046 3930 Pnt 3428 3926 Pnt 5282 3919 Pnt 4807 3895 Pnt 5145 3918 Pnt 4546 3939 Pnt 4438 3946 Pnt 4950 3954 Pnt 3133 3904 Pnt 3645 3955 Pnt 4310 3911 Pnt 4867 3927 Pnt 5125 3936 Pnt 3021 3958 Pnt 4819 3952 Pnt 3019 3946 Pnt 3329 3933 Pnt 3861 3951 Pnt 1913 3917 Pnt 3605 3938 Pnt 2488 3900 Pnt 2947 3885 Pnt 2874 3942 Pnt 4081 3917 Pnt 3434 3890 Pnt 2098 3940 Pnt 2733 3900 Pnt 3055 3885 Pnt 4118 3895 Pnt 5357 3954 Pnt 3712 3924 Pnt 5903 3902 Pnt 4190 3647 Pnt 1942 3917 Pnt 2898 3942 Pnt 5344 3933 Pnt 4595 3948 Pnt 5254 3890 Pnt 3371 3861 Pnt 2840 3871 Pnt 4849 3942 Pnt 5107 3938 Pnt 3598 3936 Pnt 2441 3900 Pnt 2577 3885 Pnt 5665 3922 Pnt 3904 3895 Pnt 4535 3903 Pnt 4986 3929 Pnt 3433 3904 Pnt 3541 3870 Pnt 5178 3904 Pnt 2566 3942 Pnt 1859 3936 Pnt 2332 3856 Pnt 5172 3916 Pnt 4881 3909 Pnt 4309 3870 Pnt 4364 3901 Pnt 4381 3946 Pnt 3490 3918 Pnt 4797 3892 Pnt 3206 3889 Pnt 5266 3942 Pnt 3433 3939 Pnt 4119 3850 Pnt 3972 3939 Pnt 3982 3954 Pnt 4286 3851 Pnt 4175 3920 Pnt 3708 3919 Pnt 3269 3875 Pnt 3390 3929 Pnt 5004 3852 Pnt 3515 3946 Pnt 3257 3951 Pnt 4367 3951 Pnt 3503 3922 Pnt 3355 3880 Pnt 3277 3890 Pnt 4044 3890 Pnt 4519 3852 Pnt 4352 3850 Pnt 4938 3848 Pnt 3376 3954 Pnt 2956 3931 Pnt 2931 3916 Pnt 2948 3951 Pnt 4393 3855 Pnt 3741 3945 Pnt 5060 3951 Pnt 3847 3937 Pnt 3408 3871 Pnt 4914 3905 Pnt 4317 3852 Pnt 4167 3889 Pnt 5030 3903 Pnt 4989 3901 Pnt 3801 3322 Pnt 3091 3937 Pnt 5232 3902 Pnt 5125 3918 Pnt 4889 3894 Pnt 5076 3878 Pnt 4259 3851 Pnt 5223 3904 Pnt 4624 3934 Pnt 4974 3849 Pnt 4438 3858 Pnt 5126 3851 Pnt 3931 3850 Pnt 4408 3902 Pnt 2490 3942 Pnt 1859 3936 Pnt 3524 3857 Pnt 4756 3888 Pnt 4743 3950 Pnt 4068 3852 Pnt 4619 3909 Pnt 4859 3892 Pnt 4977 3868 Pnt 4243 3853 Pnt 4339 3924 Pnt 3355 3846 Pnt 3874 3849 Pnt 4042 3849 Pnt 5187 3874 Pnt 3611 3854 Pnt 2886 3920 Pnt 4135 3890 Pnt 4111 3920 Pnt 5066 3909 Pnt 4665 3875 Pnt 5069 3909 Pnt 4733 3886 Pnt 4214 3946 Pnt 4250 3942 Pnt 5043 3939 Pnt 3642 3847 Pnt 3324 3891 Pnt 3017 3943 Pnt 4712 3943 Pnt 2818 3931 Pnt 5199 3943 Pnt 5402 3909 Pnt 4259 3854 Pnt 3739 3848 Pnt 4447 3955 Pnt 4900 3954 Pnt 5553 3929 Pnt 3224 3931 Pnt 3979 3897 Pnt 3262 3905 Pnt 3618 3916 Pnt 3611 3857 Pnt 4758 3916 Pnt 4967 3931 Pnt 3340 3860 Pnt 5433 3914 Pnt 4063 3887 Pnt 4787 3846 Pnt 4439 3844 Pnt 3971 3947 Pnt 4072 3851 Pnt 5237 3852 Pnt 4349 3904 Pnt 5108 3909 Pnt 5362 3847 Pnt 5371 3891 Pnt 5136 3924 Pnt 5188 3904 Pnt 5068 3954 Pnt 5475 3360 Pnt 3738 3932 Pnt 3507 3928 Pnt 4706 3942 Pnt 5157 3939 Pnt 3588 3931 Pnt 4248 3931 Pnt 3472 3960 Pnt 4999 3952 Pnt 4194 3916 Pnt 4910 3951 Pnt 3504 3967 Pnt 3944 3860 Pnt 4920 3858 Pnt 5203 3944 Pnt 4669 3930 Pnt 4983 3848 Pnt 4648 3950 Pnt 5284 3915 Pnt 4151 3903 Pnt 3948 3909 Pnt 3417 3891 Pnt 2718 3943 Pnt 4563 3937 Pnt 5020 3891 Pnt 5051 3314 Pnt 5393 3931 Pnt 5007 3953 Pnt 4972 3866 Pnt 4997 3851 Pnt 4415 3856 Pnt 4302 3949 Pnt 4939 3897 Pnt 4326 3849 Pnt 4107 3851 Pnt 3967 3849 Pnt 4308 3904 Pnt 3390 3844 Pnt 3854 3934 Pnt 4780 3946 Pnt 2691 3942 Pnt 1959 3936 Pnt 5054 3869 Pnt 4315 3942 Pnt 2824 3909 Pnt 4960 3895 Pnt 4449 3865 Pnt 4133 3909 Pnt 3413 3904 Pnt 4370 3910 Pnt 4141 3909 Pnt 4996 3945 Pnt 4707 3882 Pnt 4825 3890 Pnt 3753 3846 Pnt 3423 3920 Pnt 3416 3891 Pnt 3520 3905 Pnt 5087 3955 Pnt 4986 3889 Pnt 5029 3928 Pnt 4889 3891 Pnt 4448 3934 Pnt 3923 3934 Pnt 5067 3874 Pnt 4937 3844 Pnt 3116 3844 Pnt 4308 3945 Pnt 3649 3945 Pnt 2163 3945 Pnt 2881 3843 Pnt 1909 3945 Pnt 3524 3920 Pnt 3229 3920 Pnt 4296 3854 Pnt 3302 3891 Pnt 2443 3920 Pnt 4902 3951 Pnt 3297 3944 Pnt 3599 3891 Pnt 3972 3946 Pnt 2611 3870 Pnt 5130 3879 Pnt 4189 3891 Pnt 3469 3920 Pnt 3839 3920 Pnt 3658 3921 Pnt 4520 3928 Pnt 2673 3916 Pnt 3182 3916 Pnt 3539 3901 Pnt 4378 3946 Pnt 2798 3946 Pnt 4015 3946 Pnt 5073 3946 Pnt 3018 3957 Pnt 3388 3957 Pnt 4567 3929 Pnt 4863 3916 Pnt 5666 3914 Pnt 4466 3957 Pnt 5004 3886 Pnt 4240 3952 Pnt 3310 3922 Pnt 3293 3886 Pnt 3701 3922 Pnt 2539 3923 Pnt 2054 3923 Pnt 3735 3886 Pnt 3552 3886 Pnt 4711 3884 Pnt 3623 3886 Pnt 1880 3923 Pnt 1680 3923 Pnt 1525 3923 Pnt 3498 3886 Pnt 3925 3886 Pnt 4220 3853 Pnt 5041 3865 Pnt 2169 3843 Pnt 3584 3845 Pnt 2451 3843 Pnt 4239 3937 Pnt 4968 3869 Pnt 4614 3932 Pnt 2526 3919 Pnt 5067 3876 Pnt 5063 3883 Pnt 5580 3941 Pnt 3613 3952 Pnt 4789 3937 Pnt 3092 3937 Pnt 4033 3960 Pnt 3344 3937 Pnt 4531 3873 Pnt 3446 3932 Pnt 3918 3918 Pnt 3381 3967 Pnt 3180 3858 Pnt 4774 3887 Pnt 3826 3950 Pnt 3916 3881 Pnt 3797 3932 Pnt 2890 3942 Pnt 4755 3859 Pnt 5102 3878 Pnt 4582 3868 Pnt 2278 3931 Pnt 2635 3942 Pnt 5141 3942 Pnt 2200 3842 Pnt 3463 3517 Pnt 4542 3909 Pnt 5009 3854 Pnt 3874 3858 Pnt 4812 3857 Pnt 3648 3864 Pnt 3823 3863 Pnt 4863 3878 Pnt 3840 3857 Pnt 3994 3858 Pnt 2745 3942 Pnt 3417 3856 Pnt 3044 3927 Pnt 5129 3856 Pnt 5031 3940 Pnt 5457 3842 Pnt 5597 3843 Pnt 3744 3856 Pnt 2475 3919 Pnt 3521 3881 Pnt 5053 3947 Pnt 4151 3859 Pnt 4954 3928 Pnt 5025 3848 Pnt 5072 3880 Pnt 5133 3305 Pnt 5138 3895 Pnt 5159 3859 Pnt 4985 3865 Pnt 4260 3862 Pnt 5065 3870 Pnt 4269 3861 Pnt 4988 3868 Pnt 3072 3952 Pnt 4894 3916 Pnt 4711 3917 Pnt 3937 3847 Pnt 4244 3852 Pnt 4705 3883 Pnt 2395 3942 Pnt 2408 3842 Pnt 3004 3919 Pnt 4791 3918 Pnt 3922 3880 Pnt 4272 3853 Pnt 3743 3862 Pnt 2585 3916 Pnt 5139 3964 Pnt 1867 3942 Pnt 4967 3952 Pnt 4300 3854 Pnt 1921 3840 Pnt 3890 3846 Pnt 4985 3918 Pnt 2416 3937 Pnt 3390 3937 Pnt 3189 3857 Pnt 3718 3863 Pnt 4862 3890 Pnt 4913 3896 Pnt 2413 3931 Pnt 5208 3862 Pnt 2084 3342 Pnt 4931 3894 Pnt 4226 3851 Pnt 4982 3928 Pnt 2064 3942 Pnt 2441 3937 Pnt 3700 3845 Pnt 3087 3909 Pnt 3839 3909 Pnt 2675 3928 Pnt 4436 3856 Pnt 4394 3928 Pnt 3372 3843 Pnt 3933 3983 Pnt 4088 3849 Pnt 3299 3946 Pnt 2994 3946 Pnt 3033 3909 Pnt 3424 3879 Pnt 4137 3909 Pnt 3077 3964 Pnt 3507 3964 Pnt 4719 3856 Pnt 4920 3857 Pnt 4431 3875 Pnt 3102 3909 Pnt 3381 3940 Pnt 4494 3978 Pnt 4323 3918 Pnt 2352 3928 Pnt 5182 3900 Pnt 3230 3932 Pnt 5146 3851 Pnt 5130 3849 Pnt 5149 3850 Pnt 5090 3840 Pnt 4175 3322 Pnt 4982 3898 Pnt 4232 3857 Pnt 4791 3871 Pnt 4888 3875 Pnt 4807 3885 Pnt 3828 3978 Pnt 5763 3851 Pnt 4124 3978 Pnt 4305 3884 Pnt 3595 3945 Pnt 4251 3922 Pnt 4994 3843 Pnt 4963 3625 Pnt 4601 3920 Pnt 4139 3918 Pnt 2403 3840 Pnt 3906 3857 Pnt 2678 3943 Pnt 4975 3943 Pnt 4998 3866 Pnt 4933 3893 Pnt 5132 3876 Pnt 4387 3853 Pnt 4272 3850 Pnt 4945 3845 Pnt 4740 3882 Pnt 4869 3888 Pnt 5648 3928 Pnt 4367 3852 Pnt 5054 3884 Pnt 3353 3901 Pnt 4920 3895 Pnt 4105 3855 Pnt 4569 3919 Pnt 3913 3877 Pnt 3843 3917 Pnt 2594 3919 Pnt 4528 3900 Pnt 3936 3860 Pnt 3824 3853 Pnt 4389 3860 Pnt 4113 3850 Pnt 5181 3296 Pnt 3625 3852 Pnt 2724 3907 Pnt 2601 3928 Pnt 3923 3933 Pnt 4074 3848 Pnt 5241 3917 Pnt 2945 3840 Pnt 3402 3841 Pnt 3688 3978 Pnt 4323 3898 Pnt 4063 3847 Pnt 3360 3945 Pnt 4438 3899 Pnt 3585 3842 Pnt 2477 3967 Pnt 1829 3839 Pnt 5065 3919 Pnt 3109 3856 Pnt 2544 3943 Pnt 3946 3849 Pnt 5314 3548 Pnt 5053 3458 Pnt 5982 3845 Pnt 4708 3875 Pnt 4258 3840 Pnt 2681 3919 Pnt 5199 3889 Pnt 4608 3876 Pnt 5075 3919 Pnt 3672 3902 Pnt 3151 3851 Pnt 4812 3886 Pnt 5084 3849 Pnt 4224 3849 Pnt 3822 3848 Pnt 3733 3843 Pnt 3728 3932 Pnt 4147 3858 Pnt 5072 3885 Pnt 3418 3852 Pnt 5135 3885 Pnt 4772 3932 Pnt 3387 3946 Pnt 4714 3881 Pnt 5303 3850 Pnt 4864 3883 Pnt 4405 3853 Pnt 4077 3847 Pnt 4916 3894 Pnt 3902 3844 Pnt 4050 3845 Pnt 5062 3963 Pnt 4375 3852 Pnt 3367 3840 Pnt 4253 3850 Pnt 4897 3884 Pnt 3918 3845 Pnt 4840 3920 Pnt 3480 3877 Pnt 5131 3931 Pnt 5123 3925 Pnt 3821 3860 Pnt 4248 3854 Pnt 2724 3907 Pnt 3029 3933 Pnt 4140 3933 Pnt 2949 3945 Pnt 2553 3967 Pnt 2387 3839 Pnt 3706 3837 Pnt 4006 3851 Pnt 3821 3856 Pnt 3623 3849 Pnt 2823 3943 Pnt 4183 3848 Pnt 4984 3921 Pnt 4781 3304 Pnt 3675 3858 Pnt 3753 3858 Pnt 3398 3849 Pnt 4273 3849 Pnt 4751 3855 Pnt 3595 3841 Pnt 4295 3963 Pnt 5062 3907 Pnt 4405 3919 Pnt 5110 3911 Pnt 5886 3831 Pnt 4260 3902 Pnt 4965 3920 Pnt 3909 3850 Pnt 5088 3910 Pnt 4560 3925 Pnt 4183 3946 Pnt 4945 3716 Pnt 5003 3842 Pnt 5399 3887 Pnt 4312 3851 Pnt 4969 3890 Pnt 5034 3287 Pnt 3602 3893 Pnt 5390 3912 Pnt 5423 3913 Pnt 4805 3867 Pnt 5065 3867 Pnt 4947 3888 Pnt 4997 3865 Pnt 4791 3891 Pnt 4724 3442 Pnt 4906 3886 Pnt 4360 3843 Pnt 4544 3885 Pnt 4533 3884 Pnt 4715 3888 Pnt 2766 3833 Pnt 4724 3878 Pnt 3848 3838 Pnt 3023 3839 Pnt 3682 3831 Pnt 3989 3839 Pnt 3889 3843 Pnt 5045 3894 Pnt 5019 3892 Pnt 4224 3921 Pnt 3849 3920 Pnt 3435 3934 Pnt 5184 3934 Pnt 4890 3889 Pnt 5029 3880 Pnt 4891 3887 Pnt 4992 3889 Pnt 5107 3845 Pnt 3950 3847 Pnt 2856 3933 Pnt 4322 3838 Pnt 4631 3843 Pnt 3710 3960 Pnt 2252 3837 Pnt 3236 3854 Pnt 2863 3943 Pnt 4854 3854 Pnt 4228 3837 Pnt 3201 3846 Pnt 4769 3960 Pnt 3702 3845 Pnt 4169 3855 Pnt 3536 3974 Pnt 3407 3910 Pnt 5200 3933 Pnt 4259 3855 Pnt 3521 3831 Pnt 4432 3910 Pnt 5279 3837 Pnt 4418 3368 Pnt 4127 3840 Pnt 4869 3926 Pnt 5155 3974 Pnt 5546 3892 Pnt 4976 3347 Pnt 4989 3452 Pnt 4243 3848 Pnt 5093 3907 Pnt 4922 3893 Pnt 5174 3909 Pnt 4181 3846 Pnt 4371 3851 Pnt 3854 3842 Pnt 3399 3941 Pnt 4536 3914 Pnt 4051 3845 Pnt 3856 3854 Pnt 3356 3838 Pnt 3668 3855 Pnt 5208 3925 Pnt 4120 3911 Pnt 4702 3911 Pnt 3627 3839 Pnt 2511 3943 Pnt 3797 3845 Pnt 5364 3925 Pnt 4094 3974 Pnt 4549 3946 Pnt 3900 3856 Pnt 3943 3911 Pnt 3375 3907 Pnt 2607 3943 Pnt 3975 3845 Pnt 5144 3921 Pnt 3614 3897 Pnt 3297 3853 Pnt 3016 3907 Pnt 4450 3832 Pnt 2958 3907 Pnt 3465 3948 Pnt 4290 3912 Pnt 5450 3843 Pnt 3730 3856 Pnt 2851 3943 Pnt 5041 3857 Pnt 4786 3869 Pnt 4234 3847 Pnt 3692 3841 Pnt 3945 3894 Pnt 2823 3910 Pnt 5141 3921 Pnt 4868 3899 Pnt 5067 3902 Pnt 3994 3896 Pnt 2531 3837 Pnt 5239 3880 Pnt 3874 3876 Pnt 5124 3826 Pnt 4974 3890 Pnt 5198 3919 Pnt 5179 3845 Pnt 5174 3847 Pnt 5266 3843 Pnt 3093 3856 Pnt 4567 3873 Pnt 4424 3866 Pnt 3913 3853 Pnt 3554 3831 Pnt 2422 3829 Pnt 4302 3867 Pnt 4764 3883 Pnt 4698 3882 Pnt 3942 3907 Pnt 4497 3871 Pnt 3780 3832 Pnt 4419 3933 Pnt 3540 3863 Pnt 4440 3941 Pnt 4499 3960 Pnt 4911 3889 Pnt 4149 3948 Pnt 2426 3943 Pnt 5017 3883 Pnt 5313 3943 Pnt 2392 3855 Pnt 4475 3869 Pnt 4100 3891 Pnt 5082 3874 Pnt 4694 3887 Pnt 5090 3888 Pnt 3549 3974 Pnt 4026 3860 Pnt 4802 3881 Pnt 5284 3911 Pnt 4698 3892 Pnt 5220 3888 Pnt 4156 3863 Pnt 5286 3974 Pnt 5321 3879 Pnt 3805 3873 Pnt 4982 3902 Pnt 5234 3855 Pnt 5193 3849 Pnt 4775 3843 Pnt 5105 3967 Pnt 4979 3970 Pnt 3555 3889 Pnt 4966 3970 Pnt 5129 3968 Pnt 5109 3969 Pnt 5067 3918 Pnt 2643 3925 Pnt 4796 3887 Pnt 4481 3852 Pnt 4074 3934 Pnt 4997 3875 Pnt 3884 3934 Pnt 5395 3866 Pnt 5415 3840 Pnt 4222 3837 Pnt 3481 3876 Pnt 5019 3889 Pnt 3718 3845 Pnt 2715 3856 Pnt 4567 3426 Pnt 4726 3885 Pnt 4139 3866 Pnt 4016 3834 Pnt 5095 3909 Pnt 4277 3838 Pnt 4786 3855 Pnt 3547 3872 Pnt 3275 3842 Pnt 4583 3886 Pnt 5104 3871 Pnt 4370 3839 Pnt 4904 3882 Pnt 5191 3915 Pnt 4569 3880 Pnt 4061 3848 Pnt 5048 3865 Pnt 4915 3888 Pnt 5100 3843 Pnt 4931 3866 Pnt 5236 3919 Pnt 5088 3863 Pnt 4364 3850 Pnt 4472 3912 Pnt 4171 3864 Pnt 4069 3844 Pnt 2982 3837 Pnt 4702 3858 Pnt 2869 3828 Pnt 4949 3871 Pnt 2169 3836 Pnt 3692 3836 Pnt 3418 3846 Pnt 4696 3889 Pnt 5053 3878 Pnt 5077 3861 Pnt 2479 3948 Pnt 4742 3868 Pnt 3863 3874 Pnt 4277 3853 Pnt 3855 3859 Pnt 3848 3847 Pnt 4539 3886 Pnt 4662 3866 Pnt 2717 3933 Pnt 4964 3878 Pnt 3516 3863 Pnt 5111 3891 Pnt 4206 3882 Pnt 3519 3826 Pnt 2559 3943 Pnt 4571 3836 Pnt 4041 3865 Pnt 4618 3970 Pnt 4708 3888 Pnt 4658 3887 Pnt 4262 3968 Pnt 5179 3891 Pnt 5051 3863 Pnt 4395 3899 Pnt 2982 3912 Pnt 5144 3863 Pnt 3808 3858 Pnt 4942 3900 Pnt 2521 3836 Pnt 4333 3974 Pnt 4921 3960 Pnt 4399 3877 Pnt 4065 3875 Pnt 5338 3895 Pnt 4881 3869 Pnt 3979 3888 Pnt 4667 3878 Pnt 4428 3881 Pnt 4351 3880 Pnt 5033 3859 Pnt 3577 3857 Pnt 5315 3979 Pnt 4314 3879 Pnt 5185 3858 Pnt 4468 3969 Pnt 4532 3868 Pnt 4887 3882 Pnt 4654 3865 Pnt 5343 3901 Pnt 3180 3871 Pnt 5175 3830 Pnt 4476 3824 Pnt 3870 3840 Pnt 3840 3833 Pnt 2251 3870 Pnt 3986 3967 Pnt 2915 3982 Pnt 3904 3870 Pnt 4504 3850 Pnt 2495 3948 Pnt 3754 3855 Pnt 2250 3853 Pnt 4260 3863 Pnt 4566 3864 Pnt 4175 3877 Pnt 3002 3854 Pnt 4688 3854 Pnt 2792 3933 Pnt 5563 3975 Pnt 5127 3865 Pnt 4700 3888 Pnt 5297 3837 Pnt 4086 3859 Pnt 5085 3875 Pnt 4107 3876 Pnt 5700 3844 Pnt 4782 3974 Pnt 5113 3427 Pnt 5158 3346 Pnt 4453 3933 Pnt 4146 3861 Pnt 5189 3891 Pnt 3414 3960 Pnt 3959 3960 Pnt 3847 3825 Pnt 2431 3823 Pnt 5233 3980 Pnt 4075 3840 Pnt 5187 3842 Pnt 3556 3915 Pnt 5405 3982 Pnt 3298 3886 Pnt 2718 3870 Pnt 3456 3938 Pnt 3583 3875 Pnt 4350 3938 Pnt 5031 3898 Pnt 2596 3854 Pnt 2621 3933 Pnt 3769 3856 Pnt 4580 3900 Pnt 3466 3855 Pnt 4469 3873 Pnt 4699 3870 Pnt 5086 3905 Pnt 4797 3864 Pnt 3795 3941 Pnt 4751 3876 Pnt 3287 3960 Pnt 5083 3884 Pnt 2172 3943 Pnt 5644 3851 Pnt 4221 3865 Pnt 5011 3849 Pnt 5285 3848 Pnt 4483 3867 Pnt 3273 3912 Pnt 5266 3858 Pnt 5224 3912 Pnt 5327 3980 Pnt 5233 3853 Pnt 5220 3884 Pnt 5106 3909 Pnt 5314 3897 Pnt 5263 3895 Pnt 5075 3431 Pnt 4604 3883 Pnt 4703 3886 Pnt 5074 3906 Pnt 5183 3893 Pnt 4422 3878 Pnt 5511 3972 Pnt 3487 3869 Pnt 2122 3867 Pnt 4340 3867 Pnt 4376 3877 Pnt 3238 3938 Pnt 4718 3857 Pnt 4527 3866 Pnt 3089 3868 Pnt 3772 3861 Pnt 4386 3973 Pnt 3832 3818 Pnt 3482 3817 Pnt 4181 3874 Pnt 2423 3816 Pnt 4558 3936 Pnt 4555 3973 Pnt 5123 3880 Pnt 4163 3864 Pnt 4068 3873 Pnt 4472 3889 Pnt 2698 3925 Pnt 4958 3898 Pnt 4555 3823 Pnt 4030 3872 Pnt 4359 3866 Pnt 5054 3862 Pnt 4969 3900 Pnt 5060 3863 Pnt 5027 3902 Pnt 5086 3871 Pnt 4655 3863 Pnt 5080 3889 Pnt 4703 3832 Pnt 5185 3835 Pnt 5201 3823 Pnt 3566 3941 Pnt 4308 3864 Pnt 4234 3878 Pnt 3415 3863 Pnt 4770 3852 Pnt 4768 3830 Pnt 5299 3954 Pnt 4997 3882 Pnt 5336 3829 Pnt 4581 3876 Pnt 4363 3873 Pnt 4421 3864 Pnt 5214 3857 Pnt 5256 3877 Pnt 4937 3844 Pnt 3941 3850 Pnt 4120 3837 Pnt 3201 3912 Pnt 4182 3910 Pnt 2004 3847 Pnt 4450 3874 Pnt 1984 3943 Pnt 4052 3857 Pnt 3683 3849 Pnt 3965 3853 Pnt 5062 3853 Pnt 4269 3861 Pnt 3684 3854 Pnt 5185 3885 Pnt 4274 3854 Pnt 3389 3848 Pnt 4498 3867 Pnt 4341 3863 Pnt 4983 3900 Pnt 5076 3858 Pnt 3565 3984 Pnt 4510 3984 Pnt 3937 3973 Pnt 3546 3853 Pnt 3889 3871 Pnt 4672 3884 Pnt 2536 3867 Pnt 3122 3852 Pnt 5311 3812 Pnt 4050 3871 Pnt 5035 3898 Pnt 3786 3925 Pnt 4640 3925 Pnt 5377 3868 Pnt 4245 3980 Pnt 5068 3980 Pnt 4973 3883 Pnt 5054 3962 Pnt 3280 3936 Pnt 5126 3900 Pnt 5191 3874 Pnt 5080 3406 Pnt 4497 3862 Pnt 5055 3886 Pnt 4810 3862 Pnt 4649 3878 Pnt 4863 3878 Pnt 4927 3881 Pnt 4546 3876 Pnt 4482 3875 Pnt 4540 3877 Pnt 3052 3910 Pnt 3702 3855 Pnt 4993 3882 Pnt 3090 3947 Pnt 5256 3893 Pnt 4910 3879 Pnt 4023 3851 Pnt 3621 3886 Pnt 4699 3881 Pnt 3909 3885 Pnt 3985 3830 Pnt 4720 3882 Pnt 4617 3879 Pnt 3825 3829 Pnt 3147 3837 Pnt 3635 3836 Pnt 4251 3891 Pnt 2788 3824 Pnt 4210 3832 Pnt 4246 3984 Pnt 3678 3823 Pnt 3740 3984 Pnt 4766 3895 Pnt 5016 3887 Pnt 5371 3861 Pnt 4456 3882 Pnt 4476 3875 Pnt 4900 3869 Pnt 5270 3882 Pnt 3522 3954 Pnt 4674 3862 Pnt 4930 3878 Pnt 4146 3831 Pnt 3838 3857 Pnt 4359 3835 Pnt 3526 3822 Pnt 4207 3852 Pnt 5248 3411 Pnt 5289 3935 Pnt 5195 3831 Pnt 5224 3914 Pnt 5236 3963 Pnt 2489 3851 Pnt 4536 3865 Pnt 5319 3892 Pnt 5214 3852 Pnt 5102 3904 Pnt 5147 3908 Pnt 5087 3902 Pnt 5019 3420 Pnt 4985 3896 Pnt 5048 3882 Pnt 3552 3811 Pnt 4103 3871 Pnt 4541 3878 Pnt 4602 3817 Pnt 2466 3809 Pnt 4373 3876 Pnt 3482 3867 Pnt 4568 3880 Pnt 3063 3866 Pnt 2214 3925 Pnt 2028 3865 Pnt 5080 3906 Pnt 4315 3874 Pnt 4343 3864 Pnt 4984 3858 Pnt 2912 3910 Pnt 5115 3861 Pnt 4680 3883 Pnt 4347 3875 Pnt 4739 3824 Pnt 3779 3812 Pnt 2730 3852 Pnt 3421 3864 Pnt 3794 3873 Pnt 5042 3848 Pnt 4531 3844 Pnt 4698 3842 Pnt 4743 3876 Pnt 4694 3885 Pnt 3795 3836 Pnt 4572 3836 Pnt 4632 3861 Pnt 4171 3872 Pnt 5049 3865 Pnt 3477 3980 Pnt 5092 3874 Pnt 3481 3962 Pnt 3014 3936 Pnt 4239 3852 Pnt 4276 3862 Pnt 5285 3879 Pnt 4252 3875 Pnt 5317 3980 Pnt 5158 3860 Pnt 3826 3508 Pnt 4746 3942 Pnt 4211 3863 Pnt 3517 3963 Pnt 5198 3862 Pnt 4370 3861 Pnt 3409 3947 Pnt 3908 3869 Pnt 4069 3855 Pnt 4947 3855 Pnt 3067 3936 Pnt 4022 3870 Pnt 5202 3962 Pnt 5199 3863 Pnt 5096 3887 Pnt 5338 3864 Pnt 4600 3872 Pnt 4167 3882 Pnt 4263 3877 Pnt 5314 3825 Pnt 3623 3851 Pnt 3744 3852 Pnt 5063 3868 Pnt 5206 3830 Pnt 3818 3850 Pnt 4379 3829 Pnt 4156 3856 Pnt 4518 3869 Pnt 4986 3879 Pnt 2524 3865 Pnt 3446 3873 Pnt 2251 3849 Pnt 5522 3826 Pnt 2984 3850 Pnt 4031 3850 Pnt 1974 3842 Pnt 3989 3956 Pnt 4227 3866 Pnt 4062 3871 Pnt 4571 3882 Pnt 4463 3870 Pnt 4320 3858 Pnt 3636 3861 Pnt 2851 3910 Pnt 3927 3845 Pnt 4034 3963 Pnt 3383 3843 Pnt 4113 3980 Pnt 4107 3910 Pnt 4576 3963 Pnt 4522 3864 Pnt 4439 3879 Pnt 4474 3881 Pnt 3887 3880 Pnt 3112 3936 Pnt 3738 3982 Pnt 5293 3922 Pnt 5186 3936 Pnt 5262 3893 Pnt 5233 3409 Pnt 5185 3891 Pnt 5254 3890 Pnt 5221 3982 Pnt 4549 3871 Pnt 3615 3962 Pnt 4395 3869 Pnt 3695 3844 Pnt 5100 3902 Pnt 5003 3896 Pnt 3104 3863 Pnt 4478 3860 Pnt 5101 3860 Pnt 4977 3895 Pnt 3573 3864 Pnt 4394 3872 Pnt 4959 3893 Pnt 5258 3912 Pnt 4623 3874 Pnt 3576 3818 Pnt 5115 3894 Pnt 4078 3868 Pnt 2677 3850 Pnt 4325 3871 Pnt 4556 3867 Pnt 3417 3861 Pnt 3719 3910 Pnt 5006 3880 Pnt 5104 3910 Pnt 5045 3882 Pnt 4181 3827 Pnt 5072 3881 Pnt 3752 3882 Pnt 5061 3893 Pnt 3835 3865 Pnt 4164 3882 Pnt 5107 3884 Pnt 4169 3860 Pnt 4663 3861 Pnt 4749 3877 Pnt 3997 3826 Pnt 4882 3875 Pnt 4955 3877 Pnt 4365 3831 Pnt 4237 3839 Pnt 5051 3876 Pnt 5122 3838 Pnt 4738 3843 Pnt 4409 3873 Pnt 2160 3929 Pnt 3705 3832 Pnt 4294 3830 Pnt 4918 3842 Pnt 3949 3881 Pnt 4496 3881 Pnt 4920 3876 Pnt 4672 3882 Pnt 5028 3878 Pnt 4460 3872 Pnt 3176 3834 Pnt 2705 3820 Pnt 3713 3819 Pnt 5107 3963 Pnt 4179 3869 Pnt 2120 3862 Pnt 2897 3947 Pnt 4231 3873 Pnt 4779 3879 Pnt 4668 3947 Pnt 3888 3866 Pnt 5403 3853 Pnt 4823 3880 Pnt 5502 3889 Pnt 4398 3862 Pnt 4604 3873 Pnt 4661 3875 Pnt 3887 3825 Pnt 4583 3879 Pnt 4861 3879 Pnt 3392 3861 Pnt 2963 3910 Pnt 3830 3980 Pnt 4194 3895 Pnt 5058 3897 Pnt 4682 3858 Pnt 4566 3882 Pnt 4963 3900 Pnt 5509 3893 Pnt 4933 3902 Pnt 5464 3893 Pnt 4849 3892 Pnt 4123 3860 Pnt 5049 3899 Pnt 5209 3880 Pnt 4185 3893 Pnt 5540 3860 Pnt 5065 3898 Pnt 4452 3877 Pnt 4501 3866 Pnt 3757 3839 Pnt 3683 3845 Pnt 5253 3884 Pnt 3903 3832 Pnt 3895 3841 Pnt 2047 3837 Pnt 3594 3956 Pnt 4969 3989 Pnt 5088 3936 Pnt 4945 3492 Pnt 4569 3867 Pnt 4060 3927 Pnt 4337 3895 Pnt 3674 3871 Pnt 3880 3859 Pnt 4723 3881 Pnt 2611 3862 Pnt 4264 3844 Pnt 4389 3982 Pnt 3164 3941 Pnt 3858 3853 Pnt 4445 3897 Pnt 2331 3889 Pnt 4711 3982 Pnt 4564 3879 Pnt 4571 3860 Pnt 5138 3956 Pnt 5398 3906 Pnt 5321 3956 Pnt 4325 3894 Pnt 3665 3890 Pnt 5168 3866 Pnt 4429 3870 Pnt 5262 3876 Pnt 4048 3867 Pnt 4859 3891 Pnt 4564 3899 Pnt 5224 3910 Pnt 5242 3977 Pnt 3336 3910 Pnt 4619 3869 Pnt 5224 3397 Pnt 4451 3865 Pnt 5070 3875 Pnt 4177 3843 Pnt 3220 3947 Pnt 5045 3947 Pnt 5097 3872 Pnt 3511 3859 Pnt 4727 3902 Pnt 3443 3838 Pnt 2180 3878 Pnt 4956 3891 Pnt 4648 3901 Pnt 4301 3870 Pnt 5165 3904 Pnt 4384 3860 Pnt 5234 3912 Pnt 3829 3862 Pnt 4162 3858 Pnt 4695 3879 Pnt 4114 3977 Pnt 3188 3910 Pnt 3329 3947 Pnt 3477 3908 Pnt 5105 3906 Pnt 5187 3893 Pnt 3551 3861 Pnt 4990 3895 Pnt 3047 3860 Pnt 4057 3892 Pnt 4620 3891 Pnt 4694 3904 Pnt 4162 3858 Pnt 4963 3918 Pnt 3722 3941 Pnt 5040 3910 Pnt 4555 3873 Pnt 4152 3866 Pnt 3261 3910 Pnt 2883 3947 Pnt 5159 3886 Pnt 5230 3863 Pnt 5217 3933 Pnt 3838 3860 Pnt 5877 3888 Pnt 4735 3877 Pnt 3497 3859 Pnt 5102 3899 Pnt 5381 3982 Pnt 5233 3910 Pnt 5112 3900 Pnt 4996 3981 Pnt 5186 3899 Pnt 4428 3869 Pnt 4196 3857 Pnt 4059 3832 Pnt 4179 3867 Pnt 5045 3897 Pnt 3835 3864 Pnt 5096 3895 Pnt 3233 3956 Pnt 3146 3858 Pnt 4245 3868 Pnt 5992 3890 Pnt 4721 3670 Pnt 4975 3891 Pnt 4130 3927 Pnt 5425 3865 Pnt 5402 3898 Pnt 5810 3870 Pnt 3682 3841 Pnt 4484 3871 Pnt 5522 3836 Pnt 4448 3870 Pnt 4915 3867 Pnt 2827 3947 Pnt 4608 3876 Pnt 3341 3890 Pnt 4885 3868 Pnt 4897 3874 Pnt 4071 3863 Pnt 4561 3875 Pnt 4983 3872 Pnt 5072 3893 Pnt 3782 3941 Pnt 5080 3896 Pnt 4553 3898 Pnt 5080 3886 Pnt 4479 3928 Pnt 2797 3859 Pnt 5473 3835 Pnt 4941 3874 Pnt 4745 3877 Pnt 5056 3894 Pnt 5123 3857 Pnt 4953 3889 Pnt 5163 3875 Pnt 5369 3933 Pnt 4228 3864 Pnt 5512 3934 Pnt 5061 3922 Pnt 4984 3861 Pnt 4094 3837 Pnt 4540 3870 Pnt 4993 3893 Pnt 4545 3941 Pnt 4543 3863 Pnt 4924 3940 Pnt 3794 3841 Pnt 4486 3862 Pnt 5839 3981 Pnt 3890 4029 Pnt 4577 3874 Pnt 4374 3866 Pnt 4549 3889 Pnt 4650 3895 Pnt 4442 3874 Pnt 3405 3956 Pnt 4204 3865 Pnt 4543 3896 Pnt 5105 3888 Pnt 5160 3871 Pnt 2989 3940 Pnt 4388 3940 Pnt 4630 3865 Pnt 4483 3893 Pnt 4259 3949 Pnt 3745 3963 Pnt 4202 3838 Pnt 2931 3947 Pnt 4575 3965 Pnt 4027 3947 Pnt 4591 3874 Pnt 5855 3984 Pnt 4431 3860 Pnt 6092 4022 Pnt 4397 3867 Pnt 2939 3890 Pnt 5266 3896 Pnt 3684 3886 Pnt 2274 3857 Pnt 5391 3950 Pnt 4213 3927 Pnt 2958 3940 Pnt 4448 3973 Pnt 4761 3899 Pnt 4024 3947 Pnt 3903 3861 Pnt 4473 3862 Pnt 5697 3936 Pnt 4612 3869 Pnt 2501 3857 Pnt 4186 3889 Pnt 4699 3898 Pnt 4308 3840 Pnt 3417 3834 Pnt 1999 3832 Pnt 5610 3939 Pnt 3381 4014 Pnt 4661 3857 Pnt 4407 3868 Pnt 4534 3894 Pnt 5268 3880 Pnt 5240 3937 Pnt 5332 3950 Pnt 3553 3940 Pnt 5445 4029 Pnt 4038 3862 Pnt 5325 3885 Pnt 5223 3876 Pnt 4031 3936 Pnt 3079 3936 Pnt 3378 3857 Pnt 3323 3885 Pnt 2631 3885 Pnt 4995 3942 Pnt 5387 3429 Pnt 4218 3927 Pnt 3299 3947 Pnt 2410 3884 Pnt 3354 3947 Pnt 2430 3947 Pnt 3667 4029 Pnt 4277 4029 Pnt 4129 4029 Pnt 5058 3864 Pnt 3275 3948 Pnt 4802 3939 Pnt 5007 3896 Pnt 3187 3948 Pnt 2831 3948 Pnt 2464 3948 Pnt 2798 3948 Pnt 2690 3948 Pnt 3072 3947 Pnt 2656 3947 Pnt 3400 3947 Pnt 3436 3947 Pnt 2801 3947 Pnt 4483 3861 Pnt 3697 3835 Pnt 3801 3947 Pnt 3028 3947 Pnt 3914 3887 Pnt 3964 3947 Pnt 2925 3951 Pnt 2534 3951 Pnt 2890 3951 Pnt 2954 3951 Pnt 2773 3951 Pnt 2981 3951 Pnt 2959 3947 Pnt 2711 3947 Pnt 2610 3947 Pnt 2866 3947 Pnt 2606 3947 Pnt 2585 3947 Pnt 2577 3947 Pnt 4981 3892 Pnt 2832 3947 Pnt 3062 3954 Pnt 3351 3889 Pnt 3636 3970 Pnt 4900 3886 Pnt 5225 3889 Pnt 5279 3880 Pnt 4807 3875 Pnt 5882 3882 Pnt 5381 3883 Pnt 4693 3870 Pnt 4523 3410 Pnt 3579 3855 Pnt 4674 3869 Pnt 3706 3850 Pnt 4115 3853 Pnt 3998 3852 Pnt 4496 3869 Pnt 5303 3881 Pnt 4243 3940 Pnt 4658 3970 Pnt 4577 3868 Pnt 4839 3876 Pnt 6070 3884 Pnt 5338 3885 Pnt 4409 3891 Pnt 5302 3949 Pnt 4829 3874 Pnt 4506 3866 Pnt 4380 3871 Pnt 2126 3847 Pnt 4752 3970 Pnt 4852 3877 Pnt 3875 3967 Pnt 5519 3892 Pnt 5459 3678 Pnt 4740 3872 Pnt 5078 3892 Pnt 4729 3895 Pnt 4432 3864 Pnt 3855 3851 Pnt 4223 3886 Pnt 4189 3967 Pnt 5591 3887 Pnt 4832 3883 Pnt 4518 3891 Pnt 3669 3882 Pnt 5398 3902 Pnt 5358 3988 Pnt 5026 3890 Pnt 4441 3972 Pnt 3654 3972 Pnt 4818 3882 Pnt 5636 3998 Pnt 3461 3849 Pnt 4423 3955 Pnt 3719 3956 Pnt 4901 3954 Pnt 4455 3951 Pnt 4531 3969 Pnt 5447 3990 Pnt 4700 3894 Pnt 3989 3884 Pnt 4834 3971 Pnt 5040 3891 Pnt 5381 3953 Pnt 4403 3968 Pnt 4833 3882 Pnt 5404 3949 Pnt 4969 3954 Pnt 4174 3885 Pnt 2331 3880 Pnt 4985 3889 Pnt 4413 3928 Pnt 5565 3929 Pnt 4602 3931 Pnt 3866 3392 Pnt 5411 3928 Pnt 4957 3930 Pnt 4785 3956 Pnt 5696 3962 Pnt 4956 3958 Pnt 4668 3843 Pnt 3301 3881 Pnt 4501 3845 Pnt 5181 3869 Pnt 4310 3887 Pnt 3914 3982 Pnt 4945 3946 Pnt 5499 3844 Pnt 4580 3946 Pnt 4694 3871 Pnt 4263 3854 Pnt 3912 3954 Pnt 5526 3982 Pnt 5255 3867 Pnt 5344 3936 Pnt 5295 3302 Pnt 5291 3934 Pnt 5644 3850 Pnt 4948 3968 Pnt 5258 3970 Pnt 5332 3973 Pnt 5178 3984 Pnt 5489 3982 Pnt 5502 3968 Pnt 4825 3931 Pnt 4636 3967 Pnt 4900 3933 Pnt 4267 3967 Pnt 5315 3935 Pnt 4498 3930 Pnt 4930 3957 Pnt 4924 3862 Pnt 4815 3936 Pnt 4366 3952 Pnt 3100 3951 Pnt 3509 3932 Pnt 4104 3928 Pnt 4532 3866 Pnt 3987 3937 Pnt 3917 3954 Pnt 4354 3888 Pnt 4858 3873 Pnt 5233 3938 Pnt 4817 3930 Pnt 5436 3939 Pnt 4902 4039 Pnt 4018 3848 Pnt 5302 3972 Pnt 3848 3846 Pnt 2109 3843 Pnt 2829 3881 Pnt 3911 3934 Pnt 4821 3869 Pnt 4085 3931 Pnt 4321 3946 Pnt 5281 3933 Pnt 4828 3935 Pnt 4700 3931 Pnt 3856 3967 Pnt 3675 3851 Pnt 3060 3937 Pnt 3451 3932 Pnt 5344 3966 Pnt 4116 3849 Pnt 5056 3946 Pnt 3678 3845 Pnt 4660 3865 Pnt 3409 3881 Pnt 5255 3986 Pnt 4687 3873 Pnt 4486 3882 Pnt 4709 3818 Pnt 4390 3830 Pnt 2274 3931 Pnt 4905 3815 Pnt 3871 3934 Pnt 3362 3931 Pnt 2896 3951 Pnt 3136 3948 Pnt 4895 3846 Pnt 4826 3948 Pnt 3545 3932 Pnt 3389 3966 Pnt 5122 3886 Pnt 4397 3929 Pnt 4645 3879 Pnt 4424 3882 Pnt 5159 3884 Pnt 4839 3883 Pnt 4509 3873 Pnt 4124 3952 Pnt 4532 3862 Pnt 5300 3881 Pnt 4944 3939 Pnt 4929 3841 Pnt 4386 3866 Pnt 3995 3946 Pnt 5160 3846 Pnt 4721 3881 Pnt 4195 3833 Pnt 5041 3881 Pnt 4094 3830 Pnt 4983 3879 Pnt 4416 3931 Pnt 4998 3877 Pnt 5139 3872 Pnt 5361 3946 Pnt 4782 3882 Pnt 4905 3872 Pnt 4807 3390 Pnt 4765 3868 Pnt 4579 3852 Pnt 3477 3816 Pnt 4973 3835 Pnt 4404 3838 Pnt 3056 3815 Pnt 4802 3848 Pnt 5030 3844 Pnt 4263 3834 Pnt 4833 3886 Pnt 4570 3851 Pnt 3034 3834 Pnt 4716 3293 Pnt 2701 3820 Pnt 3812 3819 Pnt 3649 3818 Pnt 4917 3855 Pnt 4444 3839 Pnt 4930 3842 Pnt 4669 3863 Pnt 5001 3842 Pnt 4936 3846 Pnt 3531 3851 Pnt 4809 3884 Pnt 3211 3948 Pnt 4181 3948 Pnt 4928 3853 Pnt 4954 3890 Pnt 4876 3849 Pnt 3605 3966 Pnt 4982 3966 Pnt 4483 3846 Pnt 4466 3844 Pnt 6055 3875 Pnt 4869 3886 Pnt 4536 3861 Pnt 4946 3888 Pnt 5005 3876 Pnt 5037 3840 Pnt 4363 3932 Pnt 4609 3853 Pnt 5083 3888 Pnt 6156 3876 Pnt 4910 3880 Pnt 4988 3883 Pnt 5035 3887 Pnt 4862 3720 Pnt 5022 3885 Pnt 4596 3935 Pnt 4498 3885 Pnt 3663 3877 Pnt 5322 3877 Pnt 4208 3933 Pnt 4529 3886 Pnt 4822 3877 Pnt 4015 3879 Pnt 5410 3836 Pnt 4293 3882 Pnt 3628 3835 Pnt 4706 3866 Pnt 4898 3881 Pnt 4248 3839 Pnt 4948 3882 Pnt 4037 3829 Pnt 4920 3845 Pnt 4265 3850 Pnt 3403 3966 Pnt 3912 3932 Pnt 4204 3958 Pnt 4719 3890 Pnt 4684 3889 Pnt 4650 3888 Pnt 4365 3844 Pnt 3493 3846 Pnt 4241 3882 Pnt 3656 3851 Pnt 3140 3948 Pnt 4432 3948 Pnt 4759 3883 Pnt 4297 3946 Pnt 5228 3876 Pnt 3474 3834 Pnt 3320 3855 Pnt 3330 3857 Pnt 4482 3839 Pnt 4363 3846 Pnt 4419 3850 Pnt 3794 3836 Pnt 4475 3879 Pnt 4259 3879 Pnt 4184 3831 Pnt 4212 3869 Pnt 4913 3839 Pnt 4643 3934 Pnt 4945 3866 Pnt 5161 3875 Pnt 4803 3937 Pnt 3427 3958 Pnt 4997 3958 Pnt 4877 3851 Pnt 4954 3284 Pnt 4241 3849 Pnt 4872 3856 Pnt 3628 3833 Pnt 3259 3948 Pnt 4935 3852 Pnt 4995 3878 Pnt 4783 3881 Pnt 4815 3880 Pnt 3011 3839 Pnt 4830 3839 Pnt 4149 3849 Pnt 4231 3849 Pnt 3771 3835 Pnt 4856 3834 Pnt 4277 3817 Pnt 4916 3814 Pnt 3649 3858 Pnt 3990 3878 Pnt 4469 3849 Pnt 4340 3835 Pnt 3288 3828 Pnt 3399 3844 Pnt 4534 3846 Pnt 3581 3850 Pnt 3659 3879 Pnt 4423 3877 Pnt 4898 3852 Pnt 5218 3863 Pnt 4313 3879 Pnt 5306 3864 Pnt 3406 3839 Pnt 4895 3870 Pnt 3612 3846 Pnt 4281 3845 Pnt 5473 3861 Pnt 4107 3440 Pnt 4579 3849 Pnt 3866 3842 Pnt 4419 3847 Pnt 2978 3839 Pnt 5289 3881 Pnt 3261 3948 Pnt 2166 3838 Pnt 4626 3836 Pnt 3270 3856 Pnt 3409 3958 Pnt 4432 3888 Pnt 4177 3838 Pnt 2322 3875 Pnt 4405 3862 Pnt 4823 3880 Pnt 4883 3849 Pnt 5192 3879 Pnt 4362 3840 Pnt 5139 3848 Pnt 4493 3952 Pnt 5142 3957 Pnt 4113 3844 Pnt 5404 3954 Pnt 5058 3951 Pnt 5166 3949 Pnt 5011 3878 Pnt 4980 3957 Pnt 4872 3877 Pnt 4925 3870 Pnt 5028 3841 Pnt 3925 3878 Pnt 4994 3873 Pnt 3173 3876 Pnt 4928 3872 Pnt 4912 3869 Pnt 5008 3839 Pnt 4798 3882 Pnt 4700 3879 Pnt 4412 3836 Pnt 4264 3832 Pnt 4764 3876 Pnt 4748 3881 Pnt 4703 3878 Pnt 3642 3816 Pnt 4186 3829 Pnt 4202 3831 Pnt 3476 3814 Pnt 2668 3818 Pnt 4962 3893 Pnt 4368 3834 Pnt 4786 3883 Pnt 3798 3817 Pnt 4554 3892 Pnt 4844 3869 Pnt 4367 3833 Pnt 4680 3861 Pnt 3966 3837 Pnt 2921 3839 Pnt 4460 3842 Pnt 4571 3849 Pnt 3334 3828 Pnt 3549 3850 Pnt 4588 3850 Pnt 4320 3878 Pnt 4709 3832 Pnt 4061 3827 Pnt 3030 3813 Pnt 3929 3876 Pnt 4498 3877 Pnt 4557 3847 Pnt 4877 3860 Pnt 4857 3869 Pnt 4906 3867 Pnt 4019 3843 Pnt 3656 3841 Pnt 4702 3864 Pnt 4224 3865 Pnt 4904 3845 Pnt 3509 3838 Pnt 4196 3843 Pnt 4911 3865 Pnt 4950 3849 Pnt 4854 3883 Pnt 3144 3948 Pnt 4821 3948 Pnt 4160 3958 Pnt 4989 3885 Pnt 5022 3879 Pnt 4871 3880 Pnt 4865 3877 Pnt 4872 3884 Pnt 4916 3847 Pnt 4475 3837 Pnt 4599 3950 Pnt 4111 3828 Pnt 5362 3874 Pnt 5229 3871 Pnt 4267 3952 Pnt 4785 3952 Pnt 3725 3877 Pnt 5424 3882 Pnt 4330 3839 Pnt 4661 3954 Pnt 4839 3839 Pnt 5581 3884 Pnt 3988 3836 Pnt 5548 3847 Pnt 4973 3957 Pnt 4548 3361 Pnt 4674 3860 Pnt 5583 3960 Pnt 4180 3952 Pnt 3012 3838 Pnt 5404 3841 Pnt 4877 3957 Pnt 3413 3843 Pnt 3606 3839 Pnt 3478 3831 Pnt 4396 3952 Pnt 2957 3828 Pnt 4939 3957 Pnt 4445 3851 Pnt 2968 3876 Pnt 5005 3872 Pnt 4301 3838 Pnt 4391 3858 Pnt 3633 3832 Pnt 4853 3867 Pnt 4309 3877 Pnt 5644 3963 Pnt 5277 3849 Pnt 4823 3854 Pnt 5459 3954 Pnt 5515 3963 Pnt 4907 3865 Pnt 4526 3881 Pnt 2896 3952 Pnt 4884 3849 Pnt 5077 3883 Pnt 4522 3857 Pnt 4755 3955 Pnt 5010 3880 Pnt 4146 3841 Pnt 4489 3844 Pnt 4842 3862 Pnt 5034 3881 Pnt 4574 3846 Pnt 4808 3873 Pnt 4354 3879 Pnt 5330 3949 Pnt 3656 3873 Pnt 4567 3864 Pnt 2643 3843 Pnt 5199 3961 Pnt 3794 3833 Pnt 4274 3833 Pnt 3351 3853 Pnt 3872 3853 Pnt 3282 3826 Pnt 4442 3844 Pnt 3523 3858 Pnt 4408 3841 Pnt 4894 3856 Pnt 4299 3869 Pnt 5381 3853 Pnt 4998 3849 Pnt 4487 3846 Pnt 4142 3826 Pnt 3508 3849 Pnt 4117 3838 Pnt 3651 3836 Pnt 4594 3812 Pnt 4704 3847 Pnt 3785 3838 Pnt 3079 3847 Pnt 1970 3833 Pnt 3564 3853 Pnt 3862 3837 Pnt 3309 3826 Pnt 4236 3853 Pnt 3203 3872 Pnt 4363 3872 Pnt 4840 3835 Pnt 4622 3856 Pnt 4865 3956 Pnt 5234 3841 Pnt 3919 3951 Pnt 4558 3852 Pnt 4735 3858 Pnt 4236 3841 Pnt 4866 3857 Pnt 4994 3849 Pnt 4980 3962 Pnt 5176 3836 Pnt 4825 3861 Pnt 5146 3854 Pnt 5156 3860 Pnt 5062 3365 Pnt 4540 3856 Pnt 3068 3948 Pnt 4753 3886 Pnt 5034 3882 Pnt 4545 3882 Pnt 4994 3871 Pnt 5023 3875 Pnt 5013 3876 Pnt 5017 3874 Pnt 4969 3860 Pnt 4908 3876 Pnt 4525 3852 Pnt 4839 3848 Pnt 4893 3869 Pnt 4912 3867 Pnt 4913 3870 Pnt 4683 3885 Pnt 4845 3867 Pnt 4177 3876 Pnt 4786 3882 Pnt 3980 3875 Pnt 2299 3871 Pnt 4705 3877 Pnt 4763 3878 Pnt 5400 3894 Pnt 4713 3876 Pnt 4759 3879 Pnt 4700 3884 Pnt 4942 3846 Pnt 5123 3853 Pnt 5171 3420 Pnt 5227 3862 Pnt 4815 3338 Pnt 3850 3837 Pnt 3346 3836 Pnt 5045 3853 Pnt 4598 3849 Pnt 4028 3825 Pnt 3050 3811 Pnt 4691 3859 Pnt 4272 3842 Pnt 3964 3890 Pnt 3664 3879 Pnt 4125 3840 Pnt 4827 3880 Pnt 5070 3849 Pnt 4401 3877 Pnt 4192 3827 Pnt 4472 3862 Pnt 3998 3834 Pnt 4191 3829 Pnt 4197 3841 Pnt 3058 3872 Pnt 4465 3834 Pnt 3562 3812 Pnt 3923 3832 Pnt 5137 3883 Pnt 4506 3875 Pnt 4123 3826 Pnt 4273 3830 Pnt 3914 3874 Pnt 3650 3814 Pnt 4490 3842 Pnt 4377 3832 Pnt 3652 3831 Pnt 4124 3835 Pnt 3119 3838 Pnt 4639 3852 Pnt 4548 3850 Pnt 4835 3875 Pnt 4925 3836 Pnt 4457 3853 Pnt 4460 3833 Pnt 4830 3863 Pnt 3669 3842 Pnt 3357 3835 Pnt 4261 3830 Pnt 4544 3847 Pnt 4349 3831 Pnt 2660 3816 Pnt 3819 3824 Pnt 4674 3885 Pnt 3558 3837 Pnt 4676 3877 Pnt 3355 3849 Pnt 3548 3836 Pnt 4479 3866 Pnt 4389 3876 Pnt 3082 3826 Pnt 4746 3869 Pnt 4361 3841 Pnt 5227 3859 Pnt 4924 3867 Pnt 4527 3328 Pnt 4950 3852 Pnt 4432 3841 Pnt 3811 3833 Pnt 4996 3890 Pnt 5164 3848 Pnt 5125 3356 Pnt 4945 3886 Pnt 4902 3849 Pnt 4980 3356 Pnt 4963 3871 Pnt 4347 3877 Pnt 4818 3879 Pnt 3686 3875 Pnt 4932 3868 Pnt 3968 3834 Pnt 4979 3888 Pnt 2336 3829 Pnt 3991 3872 Pnt 4376 3874 Pnt 4759 3833 Pnt 4032 3823 Pnt 4281 3828 Pnt 3463 3810 Pnt 5739 3846 Pnt 2674 3814 Pnt 4806 3880 Pnt 4235 3827 Pnt 3657 3811 Pnt 4993 3892 Pnt 4100 3824 Pnt 4410 3830 Pnt 3800 3813 Pnt 4856 3879 Pnt 4874 3694 Pnt 4270 3836 Pnt 3673 3837 Pnt 4483 3843 Pnt 4853 3856 Pnt 3237 3948 Pnt 4881 3881 Pnt 3725 3832 Pnt 3401 3843 Pnt 5047 3847 Pnt 2995 3837 Pnt 4977 3837 Pnt 5007 3967 Pnt 4988 3846 Pnt 4963 3851 Pnt 4838 3862 Pnt 5063 3875 Pnt 5403 3857 Pnt 4913 3858 Pnt 4860 3881 Pnt 4853 3869 Pnt 5149 3399 Pnt 4931 3847 Pnt 4688 3881 Pnt 4935 3866 Pnt 4714 3875 Pnt 4998 3873 Pnt 4680 3882 Pnt 4648 3880 Pnt 4425 3832 Pnt 4165 3836 Pnt 4183 3825 Pnt 3363 3831 Pnt 4874 3883 Pnt 4547 3879 Pnt 5131 3855 Pnt 3066 3838 Pnt 4831 3835 Pnt 3722 3831 Pnt 4852 3865 Pnt 4354 3874 Pnt 4901 3872 Pnt 4139 3838 Pnt 4321 3873 Pnt 2303 3866 Pnt 4459 3876 Pnt 4244 3872 Pnt 3649 3868 Pnt 4579 3848 Pnt 4329 3837 Pnt 4714 3876 Pnt 3613 3848 Pnt 4221 3843 Pnt 5034 3878 Pnt 3385 3824 Pnt 4580 3824 Pnt 4999 3874 Pnt 4567 3847 Pnt 4581 3831 Pnt 4692 3853 Pnt 3654 3842 Pnt 4360 3853 Pnt 5177 3826 Pnt 3572 3846 Pnt 4968 3828 Pnt 3296 3896 Pnt 4894 3867 Pnt 4354 3840 Pnt 4540 3855 Pnt 4538 3874 Pnt 4804 3874 Pnt 4144 3831 Pnt 3976 3870 Pnt 3169 3867 Pnt 4804 3842 Pnt 4750 3871 Pnt 3075 3809 Pnt 4505 3879 Pnt 4658 3825 Pnt 3214 3851 Pnt 4513 3828 Pnt 4928 3809 Pnt 4512 3833 Pnt 3884 3833 Pnt 4685 3807 Pnt 3797 3837 Pnt 4139 3871 Pnt 5021 3851 Pnt 4927 3826 Pnt 3862 3863 Pnt 4474 3845 Pnt 5070 3856 Pnt 3601 3834 Pnt 4506 3850 Pnt 3847 3829 Pnt 4853 3872 Pnt 4726 3855 Pnt 4398 3843 Pnt 5044 3847 Pnt 4854 3857 Pnt 4210 3833 Pnt 3643 3828 Pnt 4792 3853 Pnt 4621 3848 Pnt 4794 3856 Pnt 5082 3861 Pnt 5065 3858 Pnt 4378 3850 Pnt 4337 3837 Pnt 3990 3830 Pnt 3998 3834 Pnt 3702 3855 Pnt 5132 3855 Pnt 5055 3853 Pnt 3974 3845 Pnt 4575 3846 Pnt 3575 3842 Pnt 5051 3890 Pnt 3457 3840 Pnt 5101 3863 Pnt 3704 3349 Pnt 2828 3867 Pnt 5078 3844 Pnt 3019 3824 Pnt 4963 3845 Pnt 5070 3861 Pnt 5061 3863 Pnt 5073 3874 Pnt 4994 3883 Pnt 5065 3872 Pnt 4972 3868 Pnt 5197 3833 Pnt 4911 3827 Pnt 4700 3830 Pnt 5009 3830 Pnt 4982 3829 Pnt 5000 3831 Pnt 4447 3871 Pnt 4549 3874 Pnt 4801 3864 Pnt 5029 3826 Pnt 4347 3870 Pnt 4694 3946 Pnt 4823 3940 Pnt 5174 3952 Pnt 4879 3943 Pnt 4831 3947 Pnt 4962 3956 Pnt 4272 3868 Pnt 4376 3828 Pnt 4912 3866 Pnt 2296 3825 Pnt 4701 3873 Pnt 4964 3868 Pnt 5145 3948 Pnt 4994 3883 Pnt 4075 3357 Pnt 4703 3850 Pnt 4765 3831 Pnt 4839 3877 Pnt 3967 3855 Pnt 4685 3856 Pnt 3441 3851 Pnt 4114 3822 Pnt 2759 3812 Pnt 4357 3827 Pnt 4772 3851 Pnt 3473 3808 Pnt 3665 3809 Pnt 4923 3866 Pnt 4223 3825 Pnt 5098 3855 Pnt 4555 3856 Pnt 4170 3867 Pnt 3031 3839 Pnt 3826 3811 Pnt 5409 3967 Pnt 4419 3851 Pnt 3047 3807 Pnt 3494 3826 Pnt 4249 3847 Pnt 4894 3865 Pnt 4374 3847 Pnt 4395 3850 Pnt 3726 3864 Pnt 4514 3845 Pnt 4321 3855 Pnt 4747 3863 Pnt 4521 3852 Pnt 5004 3966 Pnt 3232 3863 Pnt 4654 3862 Pnt 4568 3845 Pnt 4706 3874 Pnt 4648 3858 Pnt 2957 3837 Pnt 4353 3869 Pnt 4092 3821 Pnt 3873 3844 Pnt 3380 3822 Pnt 4667 3861 Pnt 4297 3854 Pnt 5166 3903 Pnt 3928 3838 Pnt 4814 3902 Pnt 4533 3872 Pnt 4564 3872 Pnt 5045 3848 Pnt 5095 3839 Pnt 4280 3826 Pnt 3667 3827 Pnt 3814 3828 Pnt 4289 3833 Pnt 3365 3826 Pnt 4197 3956 Pnt 5129 3852 Pnt 5119 3872 Pnt 4063 3285 Pnt 2867 3940 Pnt 5098 3894 Pnt 4819 3830 Pnt 4178 3893 Pnt 4941 3837 Pnt 4065 3846 Pnt 4773 3852 Pnt 2883 3863 Pnt 2971 3837 Pnt 4210 3846 Pnt 4496 3943 Pnt 4574 3855 Pnt 4574 3875 Pnt 4433 3825 Pnt 5243 3822 Pnt 4506 3854 Pnt 5068 3808 Pnt 3739 3946 Pnt 5006 3810 Pnt 4691 3856 Pnt 5068 3811 Pnt 5486 3827 Pnt 4476 3831 Pnt 5092 3834 Pnt 3378 3854 Pnt 5422 3807 Pnt 4882 3854 Pnt 5148 3946 Pnt 4774 3862 Pnt 5071 3831 Pnt 4547 3873 Pnt 5026 3835 Pnt 4555 3855 Pnt 3977 3843 Pnt 3578 3840 Pnt 3662 3872 Pnt 5178 3897 Pnt 4978 3882 Pnt 4673 3845 Pnt 4945 3864 Pnt 2621 3862 Pnt 4381 3847 Pnt 3395 3839 Pnt 4551 3852 Pnt 4017 3871 Pnt 5287 3947 Pnt 5059 3886 Pnt 5380 3949 Pnt 4395 3830 Pnt 4592 3850 Pnt 4938 3880 Pnt 4582 3855 Pnt 4665 3857 Pnt 4196 3853 Pnt 5095 3871 Pnt 4358 3824 Pnt 4428 3846 Pnt 3135 3838 Pnt 4021 3956 Pnt 4616 3825 Pnt 4639 3857 Pnt 4886 3823 Pnt 5022 3821 Pnt 4980 3824 Pnt 5195 3899 Pnt 4720 3873 Pnt 5342 3952 Pnt 4902 3865 Pnt 3729 3810 Pnt 3583 3966 Pnt 4997 3966 Pnt 3339 3822 Pnt 3960 3854 Pnt 4929 3867 Pnt 4822 3877 Pnt 5064 3874 Pnt 4428 3830 Pnt 4236 3825 Pnt 4732 3874 Pnt 2719 3812 Pnt 3497 3808 Pnt 3967 3834 Pnt 4773 3404 Pnt 4397 3840 Pnt 4985 3849 Pnt 4127 3822 Pnt 4197 3847 Pnt 4775 3875 Pnt 4044 3821 Pnt 4499 3872 Pnt 4413 3872 Pnt 3814 3811 Pnt 2936 3837 Pnt 5078 3856 Pnt 4466 3831 Pnt 4575 3853 Pnt 5018 3870 Pnt 4936 3832 Pnt 3536 3835 Pnt 4932 3832 Pnt 4143 3827 Pnt 4832 3837 Pnt 3840 3823 Pnt 3988 3871 Pnt 4015 3845 Pnt 4806 3815 Pnt 5005 3835 Pnt 5076 3889 Pnt 4636 3845 Pnt 4334 3826 Pnt 5133 3836 Pnt 4612 3847 Pnt 4300 3852 Pnt 4180 3827 Pnt 3383 3821 Pnt 4710 3861 Pnt 4867 3879 Pnt 4826 3854 Pnt 5027 3836 Pnt 4808 3956 Pnt 5096 3859 Pnt 4409 3829 Pnt 3954 3966 Pnt 2983 3822 Pnt 3898 3842 Pnt 4913 3966 Pnt 3082 3807 Pnt 4048 3820 Pnt 3153 3849 Pnt 3674 3872 Pnt 4611 3946 Pnt 3635 3837 Pnt 4872 3853 Pnt 4458 3832 Pnt 4964 3833 Pnt 4468 3852 Pnt 4778 3851 Pnt 4044 3966 Pnt 4602 3846 Pnt 3470 3849 Pnt 5184 3885 Pnt 4331 3840 Pnt 4391 3841 Pnt 5053 3826 Pnt 3760 3825 Pnt 4684 3838 Pnt 3510 3820 Pnt 4937 3827 Pnt 4476 3829 Pnt 4488 3858 Pnt 3473 3853 Pnt 4593 3837 Pnt 4660 3829 Pnt 4430 3966 Pnt 4710 3824 Pnt 4131 3823 Pnt 3582 3815 Pnt 4596 3812 Pnt 5098 3841 Pnt 3010 3819 Pnt 2953 3835 Pnt 5094 3835 Pnt 5066 3817 Pnt 5162 3817 Pnt 5137 3820 Pnt 5063 3846 Pnt 4944 3879 Pnt 5039 3842 Pnt 5189 3828 Pnt 5085 3856 Pnt 4992 3881 Pnt 5036 3883 Pnt 4496 3849 Pnt 4985 3881 Pnt 4683 3859 Pnt 5191 3882 Pnt 4661 3856 Pnt 4751 3860 Pnt 5165 3878 Pnt 5061 3885 Pnt 5182 3881 Pnt 4693 3858 Pnt 5174 3847 Pnt 4595 3853 Pnt 4553 3851 Pnt 5122 3398 Pnt 5101 3873 Pnt 5181 3900 Pnt 5057 3886 Pnt 4429 3847 Pnt 4436 3848 Pnt 4597 3852 Pnt 5194 3879 Pnt 5017 3887 Pnt 5125 3873 Pnt 4958 3878 Pnt 4959 3879 Pnt 5103 3875 Pnt 4960 3883 Pnt 4380 3853 Pnt 5003 3882 Pnt 4937 3881 Pnt 5082 3888 Pnt 5032 3884 Pnt 4886 3874 Pnt 4700 3855 Pnt 4841 3875 Pnt 3445 3838 Pnt 4802 3873 Pnt 4847 3872 Pnt 4986 3885 Pnt 4460 3832 Pnt 4611 3840 Pnt 4918 3880 Pnt 4536 3834 Pnt 4548 3837 Pnt 4593 3839 Pnt 4916 3876 Pnt 3032 3836 Pnt 4334 3829 Pnt 3478 3817 Pnt 4070 3823 Pnt 4230 3826 Pnt 4617 3838 Pnt 4286 3828 Pnt 3426 3820 Pnt 4441 3846 Pnt 3636 3818 Pnt 3871 3821 Pnt 4002 3843 Pnt 4500 3833 Pnt 3583 3839 Pnt 4884 3877 Pnt 4463 3856 Pnt 4022 3822 Pnt 4320 3825 Pnt 4698 3858 Pnt 4448 3850 Pnt 3050 3837 Pnt 4672 3837 Pnt 4935 3834 Pnt 4783 3871 Pnt 4580 3833 Pnt 4962 3830 Pnt 4168 3244 Pnt 3305 3816 Pnt 4867 3857 Pnt 4116 3820 Pnt 4558 3854 Pnt 4325 3823 Pnt 3920 3853 Pnt 3851 3841 Pnt 4506 3966 Pnt 5021 3843 Pnt 3568 3812 Pnt 2874 3816 Pnt 4538 3835 Pnt 3988 3854 Pnt 3757 3835 Pnt 3631 3817 Pnt 4230 3822 Pnt 4314 3827 Pnt 4789 3865 Pnt 3786 3819 Pnt 4100 3821 Pnt 3350 3817 Pnt 3816 3818 Pnt 3062 3837 Pnt 4142 3847 Pnt 3074 3820 Pnt 4937 3835 Pnt 5070 3851 Pnt 5044 3826 Pnt 4924 3832 Pnt 5132 3830 Pnt 3988 3842 Pnt 4769 3821 Pnt 3093 3837 Pnt 4692 3824 Pnt 3323 3847 Pnt 3430 3820 Pnt 4285 3820 Pnt 4896 3815 Pnt 4842 3818 Pnt 5129 3815 Pnt 4802 3854 Pnt 5077 3821 Pnt 5150 3851 Pnt 5167 3976 Pnt 5184 3822 Pnt 5041 3886 Pnt 5158 3839 Pnt 5022 3840 Pnt 5091 3891 Pnt 4759 3837 Pnt 4990 3880 Pnt 5062 3884 Pnt 4950 3877 Pnt 4982 3880 Pnt 4420 3847 Pnt 4559 3852 Pnt 2999 3835 Pnt 4602 3851 Pnt 3589 3837 Pnt 4669 3857 Pnt 4423 3846 Pnt 4672 3854 Pnt 5034 3882 Pnt 5060 3889 Pnt 4448 3826 Pnt 4450 3848 Pnt 4380 3845 Pnt 3370 3836 Pnt 4589 3830 Pnt 4543 3849 Pnt 3934 3841 Pnt 4782 3821 Pnt 3581 3847 Pnt 4094 3817 Pnt 3720 3837 Pnt 2858 3813 Pnt 3308 3820 Pnt 4668 3858 Pnt 3556 3809 Pnt 4929 3832 Pnt 4028 3842 Pnt 4911 3854 Pnt 4860 3826 Pnt 3263 3852 Pnt 4575 3853 Pnt 4679 3855 Pnt 4349 3851 Pnt 5059 3223 Pnt 4313 3822 Pnt 5189 3826 Pnt 5079 3828 Pnt 5150 3825 Pnt 5126 3832 Pnt 5117 3827 Pnt 5102 3839 Pnt 5110 3875 Pnt 5156 3830 Pnt 4939 3392 Pnt 5065 3885 Pnt 5006 3884 Pnt 5029 3886 Pnt 5008 3881 Pnt 5023 3883 Pnt 4879 3873 Pnt 4952 3882 Pnt 4940 3877 Pnt 4922 3879 Pnt 5071 3887 Pnt 4850 3874 Pnt 4955 3878 Pnt 4622 3839 Pnt 4876 3876 Pnt 4805 3871 Pnt 4597 3838 Pnt 4697 3840 Pnt 4480 3832 Pnt 4772 3869 Pnt 4531 3835 Pnt 4221 3824 Pnt 4320 3828 Pnt 4173 3976 Pnt 3632 3817 Pnt 4925 3875 Pnt 4034 3822 Pnt 4845 3870 Pnt 4605 3976 Pnt 3943 3851 Pnt 4283 3826 Pnt 3477 3851 Pnt 4540 3833 Pnt 2949 3820 Pnt 3870 3819 Pnt 4157 3831 Pnt 3810 3818 Pnt 4297 3827 Pnt 3482 3815 Pnt 4461 3864 Pnt 4524 3834 Pnt 4003 3821 Pnt 4692 3854 Pnt 3560 3835 Pnt 4470 3840 Pnt 4730 3823 Pnt 3305 3815 Pnt 4576 3810 Pnt 4458 3823 Pnt 3816 3827 Pnt 3883 3839 Pnt 3098 3853 Pnt 4113 3849 Pnt 3974 3828 Pnt 3501 3826 Pnt 4166 3846 Pnt 4306 3890 Pnt 2968 3858 Pnt 5022 3848 Pnt 2670 3839 Pnt 5221 3879 Pnt 4861 3876 Pnt 4867 3833 Pnt 5121 3814 Pnt 4338 3819 Pnt 2851 3810 Pnt 4099 3814 Pnt 4435 3817 Pnt 3093 3849 Pnt 4922 3813 Pnt 3566 3849 Pnt 4516 3823 Pnt 5077 3818 Pnt 4266 3830 Pnt 3426 3847 Pnt 5062 3815 Pnt 4750 3822 Pnt 4254 3847 Pnt 4382 3831 Pnt 4796 3829 Pnt 4585 3828 Pnt 5161 3339 Pnt 5182 3838 Pnt 5092 3976 Pnt 5207 3896 Pnt 5084 3887 Pnt 5186 3898 Pnt 4717 3857 Pnt 5057 3883 Pnt 4775 3522 Pnt 3821 3835 Pnt 4948 3876 Pnt 5056 3850 Pnt 4981 3878 Pnt 4980 3878 Pnt 4564 3852 Pnt 4648 3853 Pnt 4676 3854 Pnt 5021 3881 Pnt 4545 3848 Pnt 4422 3846 Pnt 4340 3850 Pnt 4361 3843 Pnt 3361 3835 Pnt 3597 3836 Pnt 3939 3839 Pnt 4663 3855 Pnt 4588 3849 Pnt 3054 3834 Pnt 4413 3844 Pnt 4552 3851 Pnt 4457 3847 Pnt 4006 3840 Pnt 5109 3873 Pnt 5145 3852 Pnt 5028 3835 Pnt 5194 3877 Pnt 5168 3875 Pnt 5130 3854 Pnt 5124 3872 Pnt 5094 3871 Pnt 5017 3883 Pnt 4978 3881 Pnt 5046 3386 Pnt 5017 3880 Pnt 5049 3882 Pnt 5078 3886 Pnt 5059 3884 Pnt 4012 3850 Pnt 4934 3879 Pnt 4951 3876 Pnt 4878 3875 Pnt 4959 3877 Pnt 4842 3872 Pnt 4924 3878 Pnt 4931 3822 Pnt 4881 3825 Pnt 4548 3820 Pnt 4611 3819 Pnt 4657 3817 Pnt 4772 3821 Pnt 4604 3836 Pnt 4623 3835 Pnt 4290 3825 Pnt 4845 3832 Pnt 4463 3829 Pnt 3870 3818 Pnt 4826 3870 Pnt 3514 3814 Pnt 4339 3827 Pnt 4307 3824 Pnt 3085 3849 Pnt 4533 3830 Pnt 3688 3976 Pnt 3315 3813 Pnt 3644 3849 Pnt 4545 3832 Pnt 3788 3817 Pnt 4231 3988 Pnt 3478 3847 Pnt 3905 3838 Pnt 3997 3819 Pnt 4032 3820 Pnt 4525 3833 Pnt 4379 3829 Pnt 4247 3850 Pnt 4156 3822 Pnt 4689 3852 Pnt 4540 3850 Pnt 4197 3847 Pnt 3784 3869 Pnt 4434 3871 Pnt 4711 3851 Pnt 3222 3819 Pnt 3981 3848 Pnt 4455 3812 Pnt 3582 3901 Pnt 5018 3904 Pnt 5137 3881 Pnt 4421 3883 Pnt 2555 3817 Pnt 4432 3235 Pnt 4467 3892 Pnt 4621 3838 Pnt 4735 3844 Pnt 5012 3893 Pnt 4890 3850 Pnt 3972 3826 Pnt 4826 3846 Pnt 4200 3821 Pnt 4475 3834 Pnt 5165 3826 Pnt 3799 3820 Pnt 5229 3891 Pnt 4298 3829 Pnt 5040 3862 Pnt 5102 3872 Pnt 5087 3869 Pnt 5115 3308 Pnt 5136 3875 Pnt 5092 3842 Pnt 5133 3870 Pnt 5030 3881 Pnt 5051 3883 Pnt 4979 3380 Pnt 5002 3879 Pnt 4999 3882 Pnt 5072 3885 Pnt 4933 3877 Pnt 4851 3871 Pnt 4804 3869 Pnt 4939 3872 Pnt 4854 3868 Pnt 4648 3837 Pnt 4944 3874 Pnt 4550 3833 Pnt 4893 3870 Pnt 4530 3831 Pnt 4337 3825 Pnt 5781 3988 Pnt 4967 3875 Pnt 4563 3830 Pnt 3800 3815 Pnt 4226 4005 Pnt 3637 3848 Pnt 4624 3836 Pnt 4287 3824 Pnt 4052 3819 Pnt 3712 3849 Pnt 4492 3848 Pnt 3724 3814 Pnt 3354 3812 Pnt 4646 3834 Pnt 4309 3823 Pnt 4213 3820 Pnt 4782 3842 Pnt 3476 3812 Pnt 4815 3867 Pnt 3897 3816 Pnt 4735 3851 Pnt 4482 3829 Pnt 3998 3818 Pnt 5167 3873 Pnt 5409 3886 Pnt 5477 3933 Pnt 5450 3931 Pnt 5399 3924 Pnt 5499 3935 Pnt 5408 3927 Pnt 4999 3878 Pnt 5068 3897 Pnt 5128 3515 Pnt 4930 3873 Pnt 5149 3902 Pnt 5411 3926 Pnt 5117 3899 Pnt 4646 3835 Pnt 5325 3918 Pnt 4976 3891 Pnt 4991 3892 Pnt 5366 3922 Pnt 4755 3852 Pnt 5046 3895 Pnt 5015 3887 Pnt 5094 3900 Pnt 4781 3903 Pnt 4859 3906 Pnt 4969 3889 Pnt 4790 3904 Pnt 4583 3896 Pnt 4858 3905 Pnt 4668 3898 Pnt 3493 3882 Pnt 4418 3893 Pnt 4974 3890 Pnt 4737 3901 Pnt 4659 3899 Pnt 4651 3897 Pnt 3702 3883 Pnt 4526 3894 Pnt 4434 3892 Pnt 4156 3844 Pnt 5342 3920 Pnt 4777 3902 Pnt 4108 3817 Pnt 5326 3920 Pnt 3564 3857 Pnt 3168 3848 Pnt 4894 3848 Pnt 3211 3848 Pnt 4129 3886 Pnt 4759 3848 Pnt 4627 3895 Pnt 4537 3820 Pnt 4437 3819 Pnt 4324 3891 Pnt 4276 3842 Pnt 3523 3811 Pnt 3974 3836 Pnt 4997 3895 Pnt 3138 3848 Pnt 4109 3831 Pnt 2480 3810 Pnt 3957 3848 Pnt 3939 3885 Pnt 4003 3895 Pnt 4298 3815 Pnt 5039 3848 Pnt 3775 3178 Pnt 5099 3898 Pnt 4691 3900 Pnt 4398 3826 Pnt 4748 3836 Pnt 4838 3927 Pnt 3960 3884 Pnt 4303 3885 Pnt 3208 3880 Pnt 5010 3889 Pnt 5101 3890 Pnt 5028 3883 Pnt 5158 3848 Pnt 4310 3848 Pnt 4499 3818 Pnt 4595 3882 Pnt 3862 3870 Pnt 4659 3805 Pnt 4879 3802 Pnt 4497 3828 Pnt 4549 3895 Pnt 3113 3881 Pnt 5403 3879 Pnt 5387 3806 Pnt 5438 3807 Pnt 5471 3813 Pnt 5402 3924 Pnt 5331 3918 Pnt 5377 3892 Pnt 5112 3899 Pnt 5158 3900 Pnt 5087 3898 Pnt 5352 3507 Pnt 5321 3916 Pnt 5059 3894 Pnt 5098 3896 Pnt 4956 3889 Pnt 5055 3892 Pnt 5026 3891 Pnt 4864 3903 Pnt 5002 3893 Pnt 4992 3888 Pnt 4949 3887 Pnt 4763 3901 Pnt 4774 3900 Pnt 4777 3902 Pnt 4673 3896 Pnt 3951 3883 Pnt 4662 3897 Pnt 3460 3848 Pnt 4750 3899 Pnt 4538 3849 Pnt 4033 3884 Pnt 4598 3893 Pnt 4590 3847 Pnt 4693 3898 Pnt 3542 3880 Pnt 3736 3881 Pnt 4146 3885 Pnt 4467 3890 Pnt 4366 3889 Pnt 4439 3851 Pnt 3838 3848 Pnt 5962 3806 Pnt 5172 3818 Pnt 5115 3374 Pnt 5124 3826 Pnt 5061 3733 Pnt 5103 3822 Pnt 5120 3830 Pnt 4205 3843 Pnt 5059 3883 Pnt 5006 3881 Pnt 5020 3877 Pnt 5039 3880 Pnt 4964 3878 Pnt 5052 3882 Pnt 4925 3875 Pnt 4952 3874 Pnt 5418 3926 Pnt 4852 3867 Pnt 4882 3872 Pnt 4886 3869 Pnt 4932 3871 Pnt 4948 3873 Pnt 4808 3868 Pnt 4536 3830 Pnt 4621 3835 Pnt 4784 3866 Pnt 4273 3823 Pnt 4612 3834 Pnt 4637 3832 Pnt 4535 3829 Pnt 4659 3836 Pnt 4452 3826 Pnt 4485 3828 Pnt 4217 3820 Pnt 3635 3812 Pnt 4342 3825 Pnt 4447 3810 Pnt 4272 3821 Pnt 3500 3803 Pnt 2436 3802 Pnt 4034 3817 Pnt 4325 3824 Pnt 3987 3816 Pnt 4278 3809 Pnt 3789 3805 Pnt 3293 3810 Pnt 3789 3814 Pnt 3102 3879 Pnt 4450 3811 Pnt 5132 3897 Pnt 3471 3811 Pnt 4500 3813 Pnt 3976 3806 Pnt 4220 3201 Pnt 3675 3847 Pnt 4529 3892 Pnt 4850 3905 Pnt 4726 3849 Pnt 3537 3850 Pnt 4716 3851 Pnt 4979 3890 Pnt 4447 3822 Pnt 4715 3831 Pnt 3112 3847 Pnt 3917 3847 Pnt 4985 3847 Pnt 3068 3847 Pnt 5090 3830 Pnt 2865 3847 Pnt 4832 3835 Pnt 4286 3848 Pnt 2875 3847 Pnt 3269 3856 Pnt 3769 3890 Pnt 3983 3892 Pnt 4249 3889 Pnt 4878 3880 Pnt 4775 3808 Pnt 4714 3792 Pnt 4033 3893 Pnt 4635 3860 Pnt 5084 3867 Pnt 5400 3869 Pnt 5414 3867 Pnt 3694 3856 Pnt 5453 3871 Pnt 5409 3856 Pnt 5400 3867 Pnt 4975 3864 Pnt 5102 3897 Pnt 5138 3898 Pnt 4857 3870 Pnt 5348 3866 Pnt 5374 3869 Pnt 4625 3831 Pnt 5347 3875 Pnt 5387 3918 Pnt 4181 3819 Pnt 3866 3815 Pnt 4173 3806 Pnt 5090 3813 Pnt 5117 3893 Pnt 5055 3892 Pnt 5055 3890 Pnt 3668 3859 Pnt 5014 3891 Pnt 5107 3785 Pnt 4965 3980 Pnt 4954 3845 Pnt 5019 3889 Pnt 4859 3971 Pnt 4986 4005 Pnt 4972 3971 Pnt 4797 3900 Pnt 4685 3896 Pnt 4976 4002 Pnt 4754 3899 Pnt 4106 3882 Pnt 4665 3895 Pnt 3292 3848 Pnt 4669 3845 Pnt 3960 3880 Pnt 4835 3901 Pnt 4592 3891 Pnt 4737 3897 Pnt 4515 3850 Pnt 4429 3887 Pnt 4339 3847 Pnt 3476 3877 Pnt 3687 3879 Pnt 4763 3898 Pnt 4576 3892 Pnt 3076 3876 Pnt 4522 3889 Pnt 4734 3969 Pnt 4673 3805 Pnt 4789 3814 Pnt 4432 3972 Pnt 4743 3971 Pnt 4367 3191 Pnt 4856 3902 Pnt 4683 3809 Pnt 4506 3803 Pnt 4180 3792 Pnt 4711 3810 Pnt 4457 3802 Pnt 4630 3829 Pnt 4028 3832 Pnt 4487 3801 Pnt 4800 3813 Pnt 4035 3881 Pnt 4580 3833 Pnt 4269 3831 Pnt 3925 3849 Pnt 4551 3825 Pnt 4054 3790 Pnt 4672 3819 Pnt 2502 3778 Pnt 4370 3835 Pnt 3465 3777 Pnt 4635 3810 Pnt 4274 3811 Pnt 3635 3784 Pnt 4335 3795 Pnt 4131 3816 Pnt 4642 3820 Pnt 3302 3776 Pnt 4453 3826 Pnt 4722 3825 Pnt 3955 3808 Pnt 4848 3829 Pnt 5002 3820 Pnt 4879 3860 Pnt 5136 3827 Pnt 5107 3891 Pnt 5029 3881 Pnt 5091 3867 Pnt 5111 3870 Pnt 5071 3988 Pnt 4938 3874 Pnt 5004 3879 Pnt 5012 3876 Pnt 5039 3878 Pnt 5059 3880 Pnt 4040 3815 Pnt 3798 3812 Pnt 4952 3368 Pnt 4966 3988 Pnt 4570 3982 Pnt 4969 3842 Pnt 4784 3864 Pnt 4879 3985 Pnt 3878 3983 Pnt 3070 3845 Pnt 4896 3986 Pnt 4933 3870 Pnt 4801 3867 Pnt 4852 3866 Pnt 4425 3845 Pnt 3836 3830 Pnt 4733 3850 Pnt 4607 3817 Pnt 4936 3875 Pnt 4851 3869 Pnt 4314 3821 Pnt 4881 3980 Pnt 4644 3980 Pnt 4489 3826 Pnt 4468 3916 Pnt 4338 3890 Pnt 4198 3894 Pnt 4315 3885 Pnt 4801 3802 Pnt 4718 3794 Pnt 5380 3807 Pnt 5417 3790 Pnt 4436 3824 Pnt 4233 3819 Pnt 5173 3802 Pnt 5345 3808 Pnt 4879 3984 Pnt 4552 3827 Pnt 3075 3845 Pnt 4447 3971 Pnt 5445 3788 Pnt 4289 3980 Pnt 5034 3785 Pnt 3561 3972 Pnt 4635 3831 Pnt 3316 3809 Pnt 5032 3987 Pnt 4060 3891 Pnt 4551 3799 Pnt 4312 3820 Pnt 3638 3811 Pnt 3480 3810 Pnt 4057 3816 Pnt 4970 3986 Pnt 5104 3988 Pnt 4569 3830 Pnt 4207 3817 Pnt 5386 3859 Pnt 5554 4005 Pnt 3783 3845 Pnt 5622 3320 Pnt 5443 3980 Pnt 5428 3784 Pnt 4766 3847 Pnt 4685 3835 Pnt 5113 3891 Pnt 4731 3849 Pnt 5326 3491 Pnt 5150 3803 Pnt 5395 3920 Pnt 5408 3922 Pnt 5153 3988 Pnt 4979 3880 Pnt 5403 3971 Pnt 5053 3866 Pnt 5060 3863 Pnt 4487 3825 Pnt 4751 3865 Pnt 4834 3864 Pnt 5096 3868 Pnt 4447 3885 Pnt 5107 3873 Pnt 4855 3900 Pnt 4987 3889 Pnt 4977 3806 Pnt 4823 3812 Pnt 5060 3986 Pnt 4708 3877 Pnt 3639 3982 Pnt 4629 3890 Pnt 5349 3802 Pnt 3498 3875 Pnt 4484 3801 Pnt 4182 3842 Pnt 3075 3874 Pnt 4983 3985 Pnt 5033 3887 Pnt 4204 3875 Pnt 4786 3181 Pnt 4662 3805 Pnt 4368 3795 Pnt 3055 3845 Pnt 4720 3845 Pnt 4333 3794 Pnt 3945 3825 Pnt 4608 3826 Pnt 4988 3817 Pnt 4429 3886 Pnt 4855 3899 Pnt 3293 3775 Pnt 4203 3972 Pnt 4543 3799 Pnt 2539 3777 Pnt 3473 3775 Pnt 4676 3830 Pnt 4378 3797 Pnt 3623 3782 Pnt 4030 3815 Pnt 4671 3808 Pnt 3689 3876 Pnt 3780 3784 Pnt 4781 3827 Pnt 4411 3818 Pnt 3958 3878 Pnt 3052 3845 Pnt 4877 3828 Pnt 4759 3808 Pnt 4081 3879 Pnt 5344 3914 Pnt 4674 3891 Pnt 4741 3846 Pnt 4588 3889 Pnt 5383 3918 Pnt 4522 3802 Pnt 4759 3833 Pnt 4150 3790 Pnt 5080 3884 Pnt 5087 3889 Pnt 5139 3883 Pnt 5079 3886 Pnt 5128 3891 Pnt 5054 3887 Pnt 4883 3901 Pnt 4997 3888 Pnt 4938 3874 Pnt 5019 3880 Pnt 4954 3872 Pnt 5119 3890 Pnt 4981 3885 Pnt 4694 3892 Pnt 4894 3898 Pnt 4008 3813 Pnt 4154 3880 Pnt 3860 3812 Pnt 4930 3890 Pnt 4849 3361 Pnt 4816 3883 Pnt 3776 3811 Pnt 3346 3855 Pnt 4802 3863 Pnt 4349 3884 Pnt 4314 3792 Pnt 4792 3882 Pnt 4964 3876 Pnt 4698 3807 Pnt 4537 3888 Pnt 4633 3815 Pnt 4863 3824 Pnt 4941 3266 Pnt 3989 3802 Pnt 3503 3808 Pnt 4998 3875 Pnt 5030 3895 Pnt 3747 3972 Pnt 4599 3802 Pnt 4165 3816 Pnt 4661 3802 Pnt 4888 3866 Pnt 4105 3815 Pnt 4739 3820 Pnt 4610 3831 Pnt 4085 3788 Pnt 4064 3982 Pnt 4070 3889 Pnt 4586 3828 Pnt 4150 3980 Pnt 4227 3817 Pnt 4307 3806 Pnt 3652 3809 Pnt 4367 3896 Pnt 4750 3884 Pnt 3829 3852 Pnt 4525 3866 Pnt 4545 3863 Pnt 4479 3797 Pnt 4263 3818 Pnt 4602 3790 Pnt 4636 3801 Pnt 4571 3826 Pnt 3953 3845 Pnt 4877 3858 Pnt 3368 3807 Pnt 4650 3830 Pnt 5409 3801 Pnt 5381 3799 Pnt 4732 3847 Pnt 5376 3792 Pnt 5149 3877 Pnt 4408 3821 Pnt 5323 3802 Pnt 5347 3798 Pnt 5344 3912 Pnt 5098 3889 Pnt 4994 3881 Pnt 5112 3892 Pnt 5083 3891 Pnt 5049 3888 Pnt 4980 3884 Pnt 5017 3885 Pnt 4774 3894 Pnt 4696 3892 Pnt 3707 3874 Pnt 5364 3914 Pnt 4983 3886 Pnt 4844 3896 Pnt 3507 3873 Pnt 3077 3872 Pnt 4750 3893 Pnt 4670 3889 Pnt 4859 3897 Pnt 4787 3896 Pnt 4614 3887 Pnt 4664 3891 Pnt 4429 3884 Pnt 3534 3855 Pnt 4585 3888 Pnt 5016 3887 Pnt 4349 3882 Pnt 5099 3855 Pnt 5035 3886 Pnt 4831 3898 Pnt 4944 3883 Pnt 4731 3844 Pnt 4664 3890 Pnt 4518 3878 Pnt 4558 3887 Pnt 4462 3823 Pnt 4771 3895 Pnt 4860 3858 Pnt 4959 3880 Pnt 4475 3821 Pnt 4948 3816 Pnt 4364 3820 Pnt 5000 3862 Pnt 4228 3980 Pnt 5002 3817 Pnt 5004 3825 Pnt 5220 3865 Pnt 4957 3809 Pnt 5282 3862 Pnt 4982 3864 Pnt 4841 3857 Pnt 5222 3865 Pnt 4685 3852 Pnt 4075 3876 Pnt 5222 3863 Pnt 5149 3810 Pnt 4775 3853 Pnt 4355 3845 Pnt 4782 3858 Pnt 4747 3855 Pnt 4468 3871 Pnt 4544 3873 Pnt 4434 3872 Pnt 4598 3877 Pnt 4171 3866 Pnt 4077 3863 Pnt 5142 3873 Pnt 4573 3880 Pnt 4255 3868 Pnt 4720 3879 Pnt 4718 3875 Pnt 3579 3858 Pnt 4757 3809 Pnt 4112 3864 Pnt 4647 3801 Pnt 4652 3170 Pnt 4420 3797 Pnt 4378 3795 Pnt 4682 3826 Pnt 4036 3785 Pnt 4682 3872 Pnt 4211 3817 Pnt 3927 3784 Pnt 4058 3877 Pnt 4264 3867 Pnt 4399 3821 Pnt 4600 3846 Pnt 3761 3874 Pnt 3284 3773 Pnt 4769 3806 Pnt 3622 3844 Pnt 3645 3781 Pnt 4543 3816 Pnt 3479 3774 Pnt 4509 3801 Pnt 4114 3831 Pnt 4565 3855 Pnt 4505 3798 Pnt 4550 3828 Pnt 4729 3847 Pnt 4389 3847 Pnt 4634 3848 Pnt 4033 3886 Pnt 4272 3791 Pnt 3808 3782 Pnt 2522 3775 Pnt 4372 3826 Pnt 4377 3822 Pnt 3825 3818 Pnt 4313 3814 Pnt 4344 3792 Pnt 3786 3845 Pnt 4083 3821 Pnt 3327 3815 Pnt 3492 3862 Pnt 4279 3823 Pnt 4775 3812 Pnt 4858 3816 Pnt 5040 3808 Pnt 3977 3819 Pnt 4904 3876 Pnt 4098 3787 Pnt 4755 3808 Pnt 4494 3847 Pnt 4837 3829 Pnt 4893 3845 Pnt 4848 3859 Pnt 4006 3812 Pnt 5005 3850 Pnt 3794 3809 Pnt 4900 3865 Pnt 5072 3847 Pnt 5124 3848 Pnt 4834 3863 Pnt 4773 3862 Pnt 3227 3844 Pnt 4734 3886 Pnt 4925 3872 Pnt 4930 3799 Pnt 3906 3864 Pnt 4214 3802 Pnt 4958 3804 Pnt 5052 3805 Pnt 5070 3805 Pnt 4267 3822 Pnt 4522 3826 Pnt 4573 3862 Pnt 3627 3817 Pnt 3498 3858 Pnt 3305 3806 Pnt 4087 3794 Pnt 4301 3872 Pnt 2838 3784 Pnt 4945 3800 Pnt 4384 3821 Pnt 2119 3814 Pnt 3487 3807 Pnt 4221 3816 Pnt 3451 3853 Pnt 4695 3853 Pnt 4981 3867 Pnt 4545 3825 Pnt 4810 3782 Pnt 4721 3847 Pnt 4622 3831 Pnt 4627 3828 Pnt 4148 3797 Pnt 4488 3799 Pnt 2820 3862 Pnt 4985 3875 Pnt 4853 3869 Pnt 4279 3818 Pnt 4928 3791 Pnt 3683 3821 Pnt 5028 3812 Pnt 5035 3811 Pnt 4958 3868 Pnt 4490 3822 Pnt 4923 3808 Pnt 5021 3845 Pnt 5212 3812 Pnt 4795 3856 Pnt 4792 3857 Pnt 5278 3816 Pnt 5213 3891 Pnt 4672 3851 Pnt 5223 3871 Pnt 5002 3848 Pnt 3781 3845 Pnt 4736 3853 Pnt 4712 3855 Pnt 3798 3844 Pnt 3220 3844 Pnt 4691 3850 Pnt 4593 3847 Pnt 4744 3852 Pnt 3665 3843 Pnt 5163 3306 Pnt 4623 3881 Pnt 4632 3863 Pnt 5142 3862 Pnt 4858 3866 Pnt 4610 3847 Pnt 5143 3891 Pnt 5381 3863 Pnt 5397 3808 Pnt 5392 3809 Pnt 5326 3810 Pnt 5107 3890 Pnt 5338 3910 Pnt 5339 3910 Pnt 5097 3474 Pnt 5054 3886 Pnt 5102 3887 Pnt 5048 3884 Pnt 5110 3888 Pnt 5014 3882 Pnt 4976 3881 Pnt 5015 3885 Pnt 4858 3895 Pnt 4845 3896 Pnt 4986 3884 Pnt 4953 3878 Pnt 4951 3880 Pnt 4842 3894 Pnt 4768 3893 Pnt 4662 3889 Pnt 4586 3886 Pnt 4749 3892 Pnt 4961 3879 Pnt 3084 3869 Pnt 4648 3887 Pnt 4740 3890 Pnt 3488 3871 Pnt 4497 3820 Pnt 3697 3872 Pnt 4665 3821 Pnt 4575 3885 Pnt 4762 3891 Pnt 3959 3874 Pnt 4676 3819 Pnt 4719 3843 Pnt 4584 3800 Pnt 4647 3799 Pnt 4730 3806 Pnt 4773 3805 Pnt 4650 3802 Pnt 4208 3788 Pnt 4669 3801 Pnt 4171 3864 Pnt 4034 3872 Pnt 4533 3872 Pnt 4687 3159 Pnt 4087 3862 Pnt 3648 3844 Pnt 4354 3819 Pnt 4386 3845 Pnt 4412 3879 Pnt 3309 3826 Pnt 3352 3847 Pnt 3636 3780 Pnt 3471 3772 Pnt 3939 3782 Pnt 4269 3866 Pnt 4249 3824 Pnt 3666 3853 Pnt 4032 3814 Pnt 4496 3815 Pnt 4454 3873 Pnt 4122 3876 Pnt 4098 3877 Pnt 4509 3799 Pnt 3315 3862 Pnt 3788 3781 Pnt 4332 3791 Pnt 4360 3829 Pnt 4112 3816 Pnt 4374 3822 Pnt 4002 3884 Pnt 4065 3785 Pnt 3831 3814 Pnt 2530 3774 Pnt 3959 3806 Pnt 3613 3812 Pnt 4659 3817 Pnt 4195 3817 Pnt 3333 3811 Pnt 4772 3855 Pnt 4367 3868 Pnt 3173 3844 Pnt 4423 3801 Pnt 4272 3844 Pnt 4451 3881 Pnt 4360 3878 Pnt 4861 3844 Pnt 4907 3894 Pnt 4481 3842 Pnt 5002 3848 Pnt 4454 3846 Pnt 4837 3850 Pnt 4897 3828 Pnt 4889 3847 Pnt 4779 3204 Pnt 4826 3863 Pnt 4918 3844 Pnt 3836 3808 Pnt 4839 3862 Pnt 3901 3809 Pnt 4035 3810 Pnt 4316 3819 Pnt 4331 3820 Pnt 4403 3821 Pnt 4373 3819 Pnt 5075 3863 Pnt 4700 3800 Pnt 3068 3844 Pnt 4724 3787 Pnt 3359 3804 Pnt 2793 3847 Pnt 4551 3803 Pnt 4232 3814 Pnt 4207 3787 Pnt 4529 3794 Pnt 4042 3812 Pnt 3489 3805 Pnt 4278 3869 Pnt 4934 3871 Pnt 4570 3872 Pnt 4949 3868 Pnt 4614 3881 Pnt 4153 3813 Pnt 4609 3829 Pnt 4717 3863 Pnt 4945 3782 Pnt 4997 3780 Pnt 4476 3822 Pnt 3646 3806 Pnt 4912 3873 Pnt 4531 3823 Pnt 4309 3862 Pnt 3862 3844 Pnt 5038 3790 Pnt 5087 3795 Pnt 4480 3821 Pnt 4593 3791 Pnt 4862 3866 Pnt 5009 3869 Pnt 4974 3871 Pnt 4961 3788 Pnt 5056 3299 Pnt 5028 3868 Pnt 4949 3843 Pnt 5217 3870 Pnt 4848 3857 Pnt 4795 3856 Pnt 5274 3867 Pnt 5014 3844 Pnt 5208 3890 Pnt 4767 3852 Pnt 5153 3880 Pnt 4728 3854 Pnt 5221 3886 Pnt 3640 3841 Pnt 4807 3855 Pnt 3819 3877 Pnt 4746 3851 Pnt 4700 3878 Pnt 3774 3844 Pnt 4603 3847 Pnt 4580 3879 Pnt 4586 3846 Pnt 4628 3828 Pnt 4695 3803 Pnt 3296 3770 Pnt 2850 3846 Pnt 5123 3861 Pnt 4201 3860 Pnt 3541 3771 Pnt 4646 3805 Pnt 4661 3810 Pnt 4766 3804 Pnt 4428 3819 Pnt 3671 3778 Pnt 3979 3844 Pnt 4419 3857 Pnt 4724 3808 Pnt 4701 3810 Pnt 4783 3803 Pnt 3941 3781 Pnt 4389 3818 Pnt 4626 3798 Pnt 5134 3889 Pnt 5111 3888 Pnt 5388 3811 Pnt 5329 3905 Pnt 5092 3887 Pnt 5355 3907 Pnt 5374 3824 Pnt 5335 3465 Pnt 5151 3885 Pnt 4974 3878 Pnt 5029 3882 Pnt 5060 3881 Pnt 5111 3886 Pnt 5053 3884 Pnt 5033 3880 Pnt 4981 3879 Pnt 4778 3890 Pnt 4784 3891 Pnt 4982 3877 Pnt 4853 3894 Pnt 4852 3893 Pnt 4960 3876 Pnt 4986 3882 Pnt 4578 3882 Pnt 4822 3892 Pnt 4050 3782 Pnt 4650 3815 Pnt 4671 3885 Pnt 4765 3889 Pnt 3712 3869 Pnt 4592 3883 Pnt 4277 3864 Pnt 4686 3887 Pnt 3479 3868 Pnt 4668 3886 Pnt 3082 3815 Pnt 3971 3871 Pnt 3792 3780 Pnt 4494 3817 Pnt 4170 3812 Pnt 2562 3772 Pnt 4077 3843 Pnt 4734 3888 Pnt 4266 3888 Pnt 4463 3814 Pnt 4119 3862 Pnt 4135 3873 Pnt 4049 3872 Pnt 4517 3826 Pnt 4270 3869 Pnt 4290 3886 Pnt 3575 3820 Pnt 3519 3861 Pnt 4066 3845 Pnt 4337 3876 Pnt 2203 3810 Pnt 4431 3870 Pnt 4373 3831 Pnt 4369 3816 Pnt 4517 3873 Pnt 4522 3871 Pnt 4334 3823 Pnt 4007 3879 Pnt 4341 3877 Pnt 3346 3806 Pnt 4791 3893 Pnt 3334 3846 Pnt 4440 3840 Pnt 4470 3841 Pnt 4423 3842 Pnt 3839 3809 Pnt 3325 3804 Pnt 4281 3878 Pnt 4092 3812 Pnt 4901 3850 Pnt 3612 3808 Pnt 4858 3845 Pnt 3959 3810 Pnt 3473 3805 Pnt 4843 3769 Pnt 4392 3769 Pnt 4925 3847 Pnt 3919 3808 Pnt 4536 3801 Pnt 4882 3797 Pnt 4141 3785 Pnt 4777 3797 Pnt 3820 3807 Pnt 4875 3798 Pnt 4357 3818 Pnt 3632 3806 Pnt 4215 3814 Pnt 4768 3843 Pnt 4534 3825 Pnt 4617 3792 Pnt 4836 3861 Pnt 3651 3856 Pnt 4040 3811 Pnt 2834 3861 Pnt 3993 3890 Pnt 4791 3862 Pnt 4712 3794 Pnt 4145 3812 Pnt 4688 3777 Pnt 5045 3791 Pnt 4273 3815 Pnt 4357 3819 Pnt 4499 3821 Pnt 4692 3868 Pnt 4469 3820 Pnt 4412 3788 Pnt 4552 3781 Pnt 4959 3879 Pnt 4295 3816 Pnt 4870 3866 Pnt 4994 3871 Pnt 2872 3846 Pnt 4936 3883 Pnt 5005 3869 Pnt 4361 3814 Pnt 4300 3886 Pnt 4642 3829 Pnt 5162 3867 Pnt 5227 3852 Pnt 4995 3873 Pnt 4679 3849 Pnt 4631 3864 Pnt 4955 3870 Pnt 5153 3861 Pnt 4955 3842 Pnt 4629 3828 Pnt 3369 3769 Pnt 2685 3771 Pnt 5217 3797 Pnt 3966 3780 Pnt 5078 3879 Pnt 5224 3870 Pnt 4765 3795 Pnt 4446 3792 Pnt 3821 3841 Pnt 4606 3876 Pnt 4842 3856 Pnt 3824 3778 Pnt 5035 3878 Pnt 3622 3840 Pnt 5028 3874 Pnt 4685 3875 Pnt 4448 3866 Pnt 4714 3802 Pnt 4347 3890 Pnt 3513 3802 Pnt 4797 3806 Pnt 4740 3801 Pnt 3358 3857 Pnt 5005 3843 Pnt 4587 3802 Pnt 4341 3798 Pnt 4366 3843 Pnt 4395 3791 Pnt 4599 3292 Pnt 4365 3790 Pnt 4025 3781 Pnt 4688 3784 Pnt 3653 3777 Pnt 4774 3855 Pnt 4491 3794 Pnt 4290 3787 Pnt 4647 3797 Pnt 5272 3897 Pnt 4727 3852 Pnt 3775 3842 Pnt 5115 3877 Pnt 4749 3850 Pnt 5143 3887 Pnt 4641 3797 Pnt 3392 3861 Pnt 5110 3886 Pnt 4201 3785 Pnt 5371 3868 Pnt 4699 3798 Pnt 5340 3905 Pnt 5034 3880 Pnt 5344 3905 Pnt 5081 3882 Pnt 5048 3881 Pnt 5028 3878 Pnt 5085 3456 Pnt 4987 3877 Pnt 4950 3873 Pnt 4775 3889 Pnt 4981 3875 Pnt 4992 3880 Pnt 4838 3890 Pnt 5310 3903 Pnt 4651 3882 Pnt 4845 3891 Pnt 4671 3884 Pnt 5032 3879 Pnt 4602 3880 Pnt 3966 3869 Pnt 3492 3866 Pnt 4774 3887 Pnt 4686 3885 Pnt 4535 3883 Pnt 4193 3862 Pnt 4110 3860 Pnt 4007 3880 Pnt 4101 3861 Pnt 4527 3879 Pnt 4545 3845 Pnt 4757 3811 Pnt 4521 3870 Pnt 4960 3876 Pnt 4042 3870 Pnt 4839 3892 Pnt 4344 3867 Pnt 4412 3869 Pnt 4427 3876 Pnt 4472 3795 Pnt 4060 3782 Pnt 4333 3875 Pnt 4359 3866 Pnt 4221 3808 Pnt 4332 3888 Pnt 4262 3863 Pnt 3626 3854 Pnt 2272 3805 Pnt 3292 3852 Pnt 4086 3807 Pnt 4665 3797 Pnt 3965 3796 Pnt 4759 3791 Pnt 3712 3779 Pnt 3839 3776 Pnt 4147 3768 Pnt 2841 3845 Pnt 3324 3802 Pnt 4261 3782 Pnt 3516 3854 Pnt 3699 3885 Pnt 3421 3852 Pnt 4768 3781 Pnt 4583 3812 Pnt 4316 3811 Pnt 4426 3841 Pnt 4098 3878 Pnt 3182 3869 Pnt 4673 3863 Pnt 4885 3810 Pnt 4467 3860 Pnt 4359 3841 Pnt 4055 3782 Pnt 4974 3859 Pnt 4371 3127 Pnt 2525 3771 Pnt 4640 3866 Pnt 3790 3778 Pnt 3277 3768 Pnt 3647 3776 Pnt 3464 3769 Pnt 4113 3784 Pnt 4340 3860 Pnt 4660 3830 Pnt 4747 3801 Pnt 4487 3877 Pnt 4398 3883 Pnt 4566 3881 Pnt 4040 3877 Pnt 4532 3877 Pnt 4672 3868 Pnt 4642 3797 Pnt 4259 3786 Pnt 4393 3792 Pnt 3365 3845 Pnt 4177 3785 Pnt 4341 3788 Pnt 4835 3845 Pnt 3955 3779 Pnt 3225 3843 Pnt 4941 3841 Pnt 5154 3866 Pnt 5239 3883 Pnt 5223 3865 Pnt 4800 3843 Pnt 4786 3854 Pnt 4652 3847 Pnt 4605 3845 Pnt 4579 3844 Pnt 4726 3849 Pnt 4178 3861 Pnt 4285 3863 Pnt 4518 3869 Pnt 4114 3860 Pnt 4716 3851 Pnt 5224 3284 Pnt 4455 3867 Pnt 3515 3860 Pnt 5150 3880 Pnt 3815 3841 Pnt 5283 3896 Pnt 4121 3859 Pnt 4408 3866 Pnt 4622 3843 Pnt 4767 3801 Pnt 4266 3862 Pnt 4708 3846 Pnt 3613 3839 Pnt 4431 3868 Pnt 4367 3873 Pnt 3802 3840 Pnt 3662 3853 Pnt 4583 3798 Pnt 4296 3810 Pnt 5107 3794 Pnt 5136 3969 Pnt 5338 3874 Pnt 5362 3798 Pnt 5335 3862 Pnt 5096 3880 Pnt 5082 3882 Pnt 5126 3881 Pnt 5024 3878 Pnt 5050 3879 Pnt 4962 3784 Pnt 5045 3780 Pnt 4980 3788 Pnt 4984 3767 Pnt 4973 3768 Pnt 5015 3778 Pnt 4771 3886 Pnt 4857 3777 Pnt 4844 3888 Pnt 4859 3889 Pnt 4968 3871 Pnt 4653 3880 Pnt 4592 3878 Pnt 4769 3885 Pnt 3696 3865 Pnt 4769 3887 Pnt 4664 3882 Pnt 4008 3808 Pnt 2837 3860 Pnt 4674 3881 Pnt 4676 3883 Pnt 2668 3845 Pnt 4280 3860 Pnt 4501 3877 Pnt 3971 3880 Pnt 4004 3843 Pnt 4742 3884 Pnt 4423 3875 Pnt 3829 3800 Pnt 3632 3798 Pnt 4580 3851 Pnt 3470 3863 Pnt 4084 3802 Pnt 4199 3804 Pnt 4118 3869 Pnt 3347 3797 Pnt 2173 3800 Pnt 4219 3969 Pnt 3072 3862 Pnt 3960 3798 Pnt 4788 3794 Pnt 4029 3805 Pnt 4431 3858 Pnt 4364 3839 Pnt 4532 3862 Pnt 4515 3860 Pnt 4650 3840 Pnt 4371 3790 Pnt 4691 3838 Pnt 4048 3781 Pnt 2488 3769 Pnt 4322 3787 Pnt 3450 3768 Pnt 4392 3791 Pnt 4017 3780 Pnt 4126 3783 Pnt 3648 3775 Pnt 3801 3777 Pnt 4682 3799 Pnt 3354 3882 Pnt 4367 3881 Pnt 3934 3880 Pnt 3516 3886 Pnt 4407 3876 Pnt 4270 3875 Pnt 4541 3878 Pnt 4372 3864 Pnt 4620 3865 Pnt 4580 3793 Pnt 4535 3794 Pnt 4284 3786 Pnt 3286 3767 Pnt 4205 3784 Pnt 4771 3852 Pnt 4374 3856 Pnt 4358 3806 Pnt 4730 3850 Pnt 5157 3796 Pnt 5216 3794 Pnt 4841 3861 Pnt 5221 3798 Pnt 5151 3877 Pnt 5236 3891 Pnt 4680 3845 Pnt 4165 3860 Pnt 4628 3844 Pnt 4762 3849 Pnt 4603 3842 Pnt 4113 3859 Pnt 4592 3842 Pnt 4794 3851 Pnt 3800 3839 Pnt 4736 3848 Pnt 4261 3862 Pnt 4445 3867 Pnt 4381 3863 Pnt 5280 3895 Pnt 4115 3858 Pnt 3616 3838 Pnt 4484 3866 Pnt 3776 3840 Pnt 4649 3870 Pnt 4553 3775 Pnt 4270 3766 Pnt 4341 3864 Pnt 5135 3531 Pnt 5318 3783 Pnt 5102 3778 Pnt 5076 3777 Pnt 5340 3766 Pnt 5078 3878 Pnt 5110 3879 Pnt 5053 3437 Pnt 5024 3876 Pnt 4966 3871 Pnt 4980 3872 Pnt 5044 3874 Pnt 4965 3868 Pnt 4981 3870 Pnt 5018 3873 Pnt 4975 3875 Pnt 4762 3884 Pnt 4851 3887 Pnt 3676 3851 Pnt 4841 3859 Pnt 4835 3888 Pnt 4767 3883 Pnt 4597 3851 Pnt 3086 3860 Pnt 4681 3880 Pnt 2832 3844 Pnt 4785 3885 Pnt 3562 3852 Pnt 4611 3801 Pnt 4138 3866 Pnt 4957 3869 Pnt 4019 3875 Pnt 3951 3864 Pnt 4684 3844 Pnt 4028 3865 Pnt 4690 3881 Pnt 3334 3856 Pnt 3473 3861 Pnt 3690 3862 Pnt 4002 3854 Pnt 4137 3804 Pnt 4440 3871 Pnt 3349 3793 Pnt 4434 3872 Pnt 4658 3878 Pnt 3847 3796 Pnt 4343 3870 Pnt 2250 3796 Pnt 4479 3792 Pnt 4748 3882 Pnt 4393 3797 Pnt 4508 3794 Pnt 3779 3775 Pnt 4640 3794 Pnt 4269 3784 Pnt 4174 3783 Pnt 4483 3791 Pnt 4588 3794 Pnt 4499 3875 Pnt 4014 3778 Pnt 4122 3781 Pnt 4366 3788 Pnt 3643 3774 Pnt 3274 3766 Pnt 4232 3800 Pnt 3937 3777 Pnt 4371 3787 Pnt 4326 3881 Pnt 3494 3859 Pnt 3629 3794 Pnt 4579 3851 Pnt 2698 3859 Pnt 3432 3843 Pnt 3327 3844 Pnt 3266 3967 Pnt 3282 3859 Pnt 2595 3844 Pnt 3621 3850 Pnt 3618 3858 Pnt 2595 3858 Pnt 3468 3841 Pnt 3231 3858 Pnt 3448 3857 Pnt 2554 3857 Pnt 4273 3881 Pnt 3209 3857 Pnt 3260 3849 Pnt 4447 3880 Pnt 3486 3879 Pnt 4284 3878 Pnt 4578 3882 Pnt 4686 3880 Pnt 4365 3916 Pnt 4065 3913 Pnt 2541 3768 Pnt 4626 3906 Pnt 3455 3791 Pnt 4385 3801 Pnt 4341 3802 Pnt 5081 3904 Pnt 5100 3905 Pnt 5139 3902 Pnt 5102 3907 Pnt 3512 3854 Pnt 4422 3804 Pnt 4587 3889 Pnt 5030 3879 Pnt 5055 3874 Pnt 5345 3903 Pnt 4986 3870 Pnt 5040 3872 Pnt 5016 3860 Pnt 4953 3866 Pnt 4848 3885 Pnt 5082 3876 Pnt 4974 3868 Pnt 3698 3849 Pnt 4979 3447 Pnt 4846 3884 Pnt 4782 3882 Pnt 4847 3883 Pnt 4700 3840 Pnt 4757 3879 Pnt 2940 3842 Pnt 4682 3877 Pnt 4782 3880 Pnt 4673 3876 Pnt 4426 3842 Pnt 4573 3874 Pnt 4424 3792 Pnt 4651 3789 Pnt 4959 3869 Pnt 4112 3782 Pnt 4511 3774 Pnt 4082 3777 Pnt 4387 3765 Pnt 4071 3862 Pnt 4807 3764 Pnt 4606 3873 Pnt 4018 3873 Pnt 5178 3778 Pnt 5154 3905 Pnt 5035 3900 Pnt 5488 3893 Pnt 5093 3901 Pnt 5498 3928 Pnt 5189 3907 Pnt 5536 3932 Pnt 5577 3781 Pnt 5548 3935 Pnt 4888 3518 Pnt 5044 3897 Pnt 4915 3918 Pnt 4959 3918 Pnt 4996 3897 Pnt 4853 3915 Pnt 5062 3899 Pnt 4757 3913 Pnt 2265 3791 Pnt 4669 3911 Pnt 5105 3904 Pnt 3160 3858 Pnt 4552 3795 Pnt 3493 3859 Pnt 4756 3914 Pnt 3755 3860 Pnt 4728 3912 Pnt 4677 3910 Pnt 4285 3879 Pnt 4463 3906 Pnt 4253 3840 Pnt 4359 3904 Pnt 4496 3791 Pnt 4449 3905 Pnt 4890 3917 Pnt 4403 3788 Pnt 4482 3789 Pnt 3782 3774 Pnt 4291 3889 Pnt 4357 3785 Pnt 2518 3766 Pnt 3813 3893 Pnt 3456 3765 Pnt 4117 3780 Pnt 4599 3793 Pnt 4591 3887 Pnt 4024 3777 Pnt 4357 3787 Pnt 2513 3840 Pnt 3655 3772 Pnt 3256 3848 Pnt 3289 3764 Pnt 4008 3894 Pnt 5104 3903 Pnt 3429 3848 Pnt 3946 3848 Pnt 4568 3795 Pnt 4284 3782 Pnt 4314 3887 Pnt 4534 3874 Pnt 4506 3861 Pnt 4370 3839 Pnt 4702 3792 Pnt 5017 3898 Pnt 4338 3900 Pnt 4082 3903 Pnt 4653 3904 Pnt 5128 3911 Pnt 5079 3899 Pnt 5149 3902 Pnt 5057 3909 Pnt 5139 3910 Pnt 4383 3903 Pnt 3475 3840 Pnt 3405 3842 Pnt 4668 3877 Pnt 4006 3895 Pnt 4001 3872 Pnt 4549 3792 Pnt 4983 3869 Pnt 5023 3875 Pnt 5079 3900 Pnt 4219 3781 Pnt 5184 3882 Pnt 4990 3876 Pnt 5116 3880 Pnt 4816 3884 Pnt 4809 3883 Pnt 5183 3903 Pnt 4878 3886 Pnt 5014 3870 Pnt 4547 3874 Pnt 4614 3876 Pnt 3550 3861 Pnt 5015 3872 Pnt 5056 3350 Pnt 3483 3853 Pnt 5062 3873 Pnt 4085 3875 Pnt 4736 3880 Pnt 4839 3885 Pnt 4398 3870 Pnt 2553 3839 Pnt 4895 3887 Pnt 4893 3888 Pnt 4915 3877 Pnt 5110 3900 Pnt 4674 3878 Pnt 4569 3771 Pnt 4155 3866 Pnt 4727 3881 Pnt 4772 3882 Pnt 4053 3865 Pnt 3707 3862 Pnt 4642 3906 Pnt 2900 3842 Pnt 4480 3871 Pnt 4987 3890 Pnt 3121 3860 Pnt 4714 3879 Pnt 4574 3905 Pnt 5154 3902 Pnt 4478 3858 Pnt 5518 3856 Pnt 5529 3855 Pnt 4489 3833 Pnt 4387 3884 Pnt 5128 3505 Pnt 3829 3890 Pnt 4272 3877 Pnt 4587 3792 Pnt 5096 3847 Pnt 5019 3854 Pnt 4995 3891 Pnt 4470 3789 Pnt 4626 3791 Pnt 5473 3830 Pnt 4423 3787 Pnt 4680 3906 Pnt 5467 3852 Pnt 5076 3898 Pnt 4528 3791 Pnt 4786 3909 Pnt 4936 3097 Pnt 4222 3899 Pnt 4368 3784 Pnt 4284 3781 Pnt 4111 3778 Pnt 4490 3788 Pnt 4326 3782 Pnt 4019 3775 Pnt 4889 3914 Pnt 2526 3764 Pnt 3783 3772 Pnt 3264 3762 Pnt 4090 3776 Pnt 4020 3890 Pnt 4384 3785 Pnt 4835 3912 Pnt 3927 3774 Pnt 4768 3910 Pnt 3470 3763 Pnt 4196 3779 Pnt 3633 3771 Pnt 4325 3876 Pnt 5056 3896 Pnt 4829 3911 Pnt 4712 3908 Pnt 4559 3876 Pnt 4335 3841 Pnt 4700 3907 Pnt 4443 3902 Pnt 5081 3858 Pnt 5043 3860 Pnt 5054 3849 Pnt 4380 3901 Pnt 4996 3856 Pnt 4999 3855 Pnt 5017 3852 Pnt 4937 3850 Pnt 4944 3851 Pnt 5017 3854 Pnt 4958 3849 Pnt 4939 3848 Pnt 5041 3861 Pnt 4844 3344 Pnt 4771 3863 Pnt 4880 3867 Pnt 4854 3866 Pnt 4793 3865 Pnt 4802 3862 Pnt 4764 3861 Pnt 4596 3854 Pnt 4691 3859 Pnt 4311 3844 Pnt 4671 3855 Pnt 4746 3858 Pnt 3937 3836 Pnt 4710 3857 Pnt 4953 3854 Pnt 3631 3833 Pnt 4115 3838 Pnt 1991 3830 Pnt 2823 3841 Pnt 4641 3856 Pnt 4165 3840 Pnt 4128 3839 Pnt 3416 3832 Pnt 3412 3847 Pnt 4002 3837 Pnt 4490 3849 Pnt 3749 3835 Pnt 4403 3854 Pnt 4562 3850 Pnt 3562 3849 Pnt 4029 3788 Pnt 3498 3790 Pnt 4719 3860 Pnt 4381 3856 Pnt 4414 3852 Pnt 4345 3851 Pnt 4500 3862 Pnt 4467 3860 Pnt 4542 3836 Pnt 3484 3841 Pnt 4337 3834 Pnt 4059 3831 Pnt 4366 3853 Pnt 4188 3838 Pnt 4309 3841 Pnt 3611 3847 Pnt 3158 3847 Pnt 4117 3778 Pnt 3510 3830 Pnt 3938 3774 Pnt 2496 3765 Pnt 3642 3771 Pnt 4021 3775 Pnt 4363 3874 Pnt 3314 3762 Pnt 4394 3852 Pnt 4550 3921 Pnt 5018 3909 Pnt 5032 3890 Pnt 5054 3910 Pnt 5057 3852 Pnt 4996 3907 Pnt 5002 3902 Pnt 4633 3792 Pnt 4943 3900 Pnt 4838 3899 Pnt 4950 3896 Pnt 4928 3897 Pnt 4308 3781 Pnt 4882 3828 Pnt 4974 3898 Pnt 3808 3772 Pnt 5035 3851 Pnt 4737 3859 Pnt 4775 3860 Pnt 4767 3862 Pnt 4804 3861 Pnt 4697 3858 Pnt 4740 3857 Pnt 4547 3849 Pnt 4484 3848 Pnt 3424 3831 Pnt 4850 3864 Pnt 4347 3844 Pnt 4923 3850 Pnt 4408 3886 Pnt 4097 3837 Pnt 3161 3830 Pnt 4603 3853 Pnt 4659 3854 Pnt 4024 3836 Pnt 3523 3838 Pnt 3924 3834 Pnt 4167 3838 Pnt 4715 3856 Pnt 4809 3863 Pnt 4321 3842 Pnt 3758 3833 Pnt 2836 3841 Pnt 4628 3855 Pnt 4164 3839 Pnt 5117 3896 Pnt 4562 3847 Pnt 3624 3832 Pnt 5144 3899 Pnt 5166 3900 Pnt 4319 3841 Pnt 5477 3872 Pnt 5478 3874 Pnt 5092 3838 Pnt 5110 3895 Pnt 5055 3892 Pnt 5003 3889 Pnt 5523 3925 Pnt 5142 3897 Pnt 4563 3491 Pnt 4830 3907 Pnt 3534 3852 Pnt 4879 3908 Pnt 4892 3888 Pnt 4988 3890 Pnt 4838 3909 Pnt 4994 3968 Pnt 4674 3904 Pnt 4782 3906 Pnt 4566 3855 Pnt 5017 3836 Pnt 4458 3832 Pnt 4722 3838 Pnt 4677 3829 Pnt 4370 3852 Pnt 4315 3837 Pnt 3974 3888 Pnt 4340 3872 Pnt 4922 3833 Pnt 4449 3898 Pnt 2586 3838 Pnt 4554 3900 Pnt 3865 3968 Pnt 4686 3902 Pnt 2064 3828 Pnt 4009 3887 Pnt 4864 3849 Pnt 3822 3886 Pnt 4197 3895 Pnt 4539 3874 Pnt 5056 3837 Pnt 4995 3852 Pnt 5064 3847 Pnt 5000 3854 Pnt 5022 3848 Pnt 4929 3893 Pnt 4849 3898 Pnt 5023 3899 Pnt 4956 3896 Pnt 4964 3891 Pnt 4958 3897 Pnt 4928 3894 Pnt 4840 3892 Pnt 4898 3864 Pnt 4700 3857 Pnt 4723 3858 Pnt 4776 3859 Pnt 4799 3862 Pnt 4767 3861 Pnt 4818 3860 Pnt 4327 3840 Pnt 4705 3855 Pnt 3614 3831 Pnt 4322 3841 Pnt 4365 3842 Pnt 3406 3829 Pnt 3060 3968 Pnt 1761 3827 Pnt 4081 3836 Pnt 4736 3856 Pnt 4095 3837 Pnt 4142 3838 Pnt 3474 3837 Pnt 4667 3852 Pnt 4635 3854 Pnt 4598 3851 Pnt 3770 3832 Pnt 4033 3834 Pnt 3922 3833 Pnt 4267 3874 Pnt 3146 3828 Pnt 4417 3852 Pnt 4538 3849 Pnt 4568 3848 Pnt 4510 3847 Pnt 4576 3871 Pnt 5118 3827 Pnt 5169 3831 Pnt 5150 3850 Pnt 5080 3832 Pnt 5086 3833 Pnt 5188 3896 Pnt 4998 3887 Pnt 5057 3888 Pnt 5029 3889 Pnt 5480 3828 Pnt 4989 3886 Pnt 5478 3851 Pnt 4931 3908 Pnt 4741 3476 Pnt 4798 3903 Pnt 4873 3904 Pnt 4822 3902 Pnt 4846 3905 Pnt 4913 3906 Pnt 5021 3886 Pnt 4888 3907 Pnt 4438 3894 Pnt 4449 3895 Pnt 3276 3846 Pnt 4379 3846 Pnt 4320 3892 Pnt 3979 3884 Pnt 4558 3897 Pnt 4193 3891 Pnt 4644 3898 Pnt 4012 3883 Pnt 3330 3896 Pnt 3344 3968 Pnt 4666 3899 Pnt 3866 3882 Pnt 4716 3896 Pnt 4568 3896 Pnt 5011 3848 Pnt 4330 3869 Pnt 4941 3882 Pnt 5010 3851 Pnt 5019 3847 Pnt 4955 3867 Pnt 5062 3854 Pnt 5016 3849 Pnt 4775 3860 Pnt 4889 3863 Pnt 4864 3862 Pnt 4969 3844 Pnt 4840 3864 Pnt 4959 3845 Pnt 4795 3861 Pnt 4955 3851 Pnt 4697 3856 Pnt 4753 3854 Pnt 4653 3852 Pnt 4789 3858 Pnt 4724 3853 Pnt 4166 3837 Pnt 4721 3857 Pnt 4810 3859 Pnt 4091 3834 Pnt 1974 3826 Pnt 3761 3831 Pnt 4116 3835 Pnt 4665 3851 Pnt 4320 3839 Pnt 3715 3896 Pnt 3624 3829 Pnt 3424 3828 Pnt 3136 3827 Pnt 4411 3851 Pnt 3556 3846 Pnt 4359 3841 Pnt 4305 3840 Pnt 4592 3850 Pnt 4006 3833 Pnt 4558 3896 Pnt 4336 3882 Pnt 3899 3832 Pnt 3038 3896 Pnt 4489 3846 Pnt 4540 3848 Pnt 4318 3867 Pnt 4357 3851 Pnt 3259 3851 Pnt 4575 3892 Pnt 3105 3892 Pnt 3663 3892 Pnt 4215 3880 Pnt 3588 3892 Pnt 2853 3892 Pnt 4273 3853 Pnt 3144 3841 Pnt 4586 3882 Pnt 4596 3846 Pnt 4947 3837 Pnt 5010 3889 Pnt 5017 3887 Pnt 5022 3892 Pnt 4939 3890 Pnt 5020 3888 Pnt 4945 3894 Pnt 4780 3859 Pnt 4840 3863 Pnt 4862 3861 Pnt 4956 3843 Pnt 4959 3316 Pnt 4881 3862 Pnt 4807 3860 Pnt 4814 3858 Pnt 4708 3854 Pnt 4730 3855 Pnt 4678 3850 Pnt 4733 3852 Pnt 4637 3851 Pnt 4592 3849 Pnt 4794 3857 Pnt 4744 3853 Pnt 4293 3839 Pnt 4168 3835 Pnt 4106 3834 Pnt 4362 3840 Pnt 4543 3847 Pnt 4493 3844 Pnt 4411 3850 Pnt 4326 3837 Pnt 3715 3889 Pnt 4563 3845 Pnt 3434 3827 Pnt 3774 3878 Pnt 3615 3828 Pnt 3154 3826 Pnt 3913 3879 Pnt 4089 3833 Pnt 4025 3832 Pnt 2421 3841 Pnt 1775 3824 Pnt 5044 3841 Pnt 5111 3888 Pnt 5150 3880 Pnt 5108 3889 Pnt 5094 3886 Pnt 5145 3891 Pnt 5180 3892 Pnt 4871 3903 Pnt 4937 3904 Pnt 4989 3882 Pnt 4981 3882 Pnt 4997 3883 Pnt 4888 3902 Pnt 5052 3884 Pnt 5474 3913 Pnt 4653 3468 Pnt 4787 3899 Pnt 4838 3901 Pnt 4708 3889 Pnt 4802 3898 Pnt 4734 3897 Pnt 4853 3900 Pnt 4447 3891 Pnt 2556 3837 Pnt 4356 3889 Pnt 4320 3888 Pnt 4695 3895 Pnt 4643 3894 Pnt 4551 3892 Pnt 3991 3879 Pnt 4446 3890 Pnt 3819 3878 Pnt 4534 3893 Pnt 3117 3889 Pnt 2507 3841 Pnt 3507 3889 Pnt 3974 3880 Pnt 4196 3887 Pnt 2953 3889 Pnt 4460 3848 Pnt 4374 3849 Pnt 3238 3849 Pnt 3100 3840 Pnt 2015 3840 Pnt 2235 3840 Pnt 4607 3834 Pnt 4420 3830 Pnt 4274 3848 Pnt 4321 3872 Pnt 4989 3890 Pnt 5016 3895 Pnt 4932 3898 Pnt 5025 3885 Pnt 4948 3893 Pnt 4948 3309 Pnt 4935 3894 Pnt 4800 3885 Pnt 4847 3888 Pnt 4871 3887 Pnt 4794 3855 Pnt 4824 3856 Pnt 4894 3889 Pnt 4777 3858 Pnt 4989 3848 Pnt 4647 3850 Pnt 4557 3845 Pnt 4598 3848 Pnt 4731 3854 Pnt 4701 3853 Pnt 4743 3852 Pnt 4315 3836 Pnt 3302 3885 Pnt 4703 3878 Pnt 4348 3839 Pnt 4666 3849 Pnt 4417 3848 Pnt 4109 3885 Pnt 2575 3835 Pnt 4151 3834 Pnt 3624 3827 Pnt 1764 3823 Pnt 3895 3829 Pnt 4007 3830 Pnt 3707 3885 Pnt 4487 3843 Pnt 3211 3824 Pnt 4109 3832 Pnt 4321 3837 Pnt 3768 3828 Pnt 4567 3844 Pnt 4425 3848 Pnt 3424 3826 Pnt 4629 3877 Pnt 4246 3885 Pnt 3830 3876 Pnt 3965 3877 Pnt 5122 3887 Pnt 5102 3846 Pnt 5139 3889 Pnt 5087 3884 Pnt 5033 3883 Pnt 5175 3848 Pnt 5137 3888 Pnt 4933 3902 Pnt 4994 3880 Pnt 4875 3901 Pnt 4890 3366 Pnt 4990 3881 Pnt 5048 3882 Pnt 4966 3880 Pnt 4721 3895 Pnt 4682 3894 Pnt 4675 3893 Pnt 4785 3896 Pnt 3984 3878 Pnt 4447 3889 Pnt 4835 3898 Pnt 3689 3885 Pnt 4756 3897 Pnt 4819 3899 Pnt 4464 3830 Pnt 4326 3836 Pnt 4556 3828 Pnt 4633 3867 Pnt 4330 3864 Pnt 4384 3863 Pnt 3155 3885 Pnt 4466 3888 Pnt 4941 3870 Pnt 3487 3848 Pnt 5036 3866 Pnt 4968 3865 Pnt 5018 3839 Pnt 4860 3849 Pnt 4964 3302 Pnt 4928 3843 Pnt 4868 3860 Pnt 4699 3852 Pnt 4798 3857 Pnt 4949 3841 Pnt 4728 3871 Pnt 4802 3855 Pnt 4765 3863 Pnt 4487 3867 Pnt 4842 3870 Pnt 4535 3852 Pnt 4081 3830 Pnt 4735 3851 Pnt 4660 3855 Pnt 3129 3823 Pnt 4604 3864 Pnt 4562 3843 Pnt 4775 3865 Pnt 4131 3866 Pnt 4312 3861 Pnt 1932 3822 Pnt 3620 3825 Pnt 3745 3881 Pnt 4375 3837 Pnt 4324 3835 Pnt 4639 3849 Pnt 3762 3827 Pnt 4413 3847 Pnt 4013 3829 Pnt 3890 3828 Pnt 4700 3850 Pnt 4151 3833 Pnt 3414 3824 Pnt 5137 3844 Pnt 5065 3864 Pnt 5062 3859 Pnt 5080 3862 Pnt 5084 3860 Pnt 4996 3857 Pnt 5098 3867 Pnt 5008 3858 Pnt 4898 3875 Pnt 4852 3876 Pnt 4921 3880 Pnt 4954 3879 Pnt 4920 3359 Pnt 5025 3857 Pnt 5017 3860 Pnt 4770 3868 Pnt 4727 3869 Pnt 4805 3874 Pnt 2678 3834 Pnt 4961 3881 Pnt 3106 3839 Pnt 4601 3863 Pnt 4690 3867 Pnt 4816 3872 Pnt 4649 3865 Pnt 4569 3871 Pnt 4579 3870 Pnt 3621 3852 Pnt 4699 3839 Pnt 4874 3878 Pnt 4807 3870 Pnt 4481 3867 Pnt 4643 3849 Pnt 4154 3858 Pnt 4300 3861 Pnt 4725 3866 Pnt 4029 3857 Pnt 4460 3848 Pnt 2226 3839 Pnt 4555 3868 Pnt 3859 3855 Pnt 4138 3839 Pnt 2355 3839 Pnt 4424 3864 Pnt 4479 3866 Pnt 4249 3860 Pnt 4787 3873 Pnt 4460 3844 Pnt 4296 3875 Pnt 4248 3867 Pnt 4600 3848 Pnt 3109 3881 Pnt 4157 3865 Pnt 4385 3843 Pnt 2785 3890 Pnt 3657 3872 Pnt 4369 3866 Pnt 3560 3853 Pnt 4390 3862 Pnt 4345 3863 Pnt 5074 3822 Pnt 5004 3824 Pnt 5101 3825 Pnt 3858 3853 Pnt 5089 3861 Pnt 5133 3829 Pnt 5022 3862 Pnt 5080 3823 Pnt 4876 3877 Pnt 4909 3852 Pnt 4944 3878 Pnt 4973 3880 Pnt 4921 3876 Pnt 5012 3856 Pnt 4386 3867 Pnt 4726 3353 Pnt 4801 3887 Pnt 4802 3871 Pnt 4816 3869 Pnt 4693 3866 Pnt 4771 3867 Pnt 4460 3842 Pnt 5009 3855 Pnt 4832 3875 Pnt 4711 3865 Pnt 4468 3866 Pnt 4646 3864 Pnt 4561 3875 Pnt 3356 3857 Pnt 4580 3838 Pnt 4677 3863 Pnt 4025 3855 Pnt 4147 3845 Pnt 4453 3856 Pnt 3078 3881 Pnt 4263 3859 Pnt 4155 3846 Pnt 3868 3847 Pnt 3624 3843 Pnt 4462 3864 Pnt 4821 3870 Pnt 4883 3841 Pnt 4385 3836 Pnt 4578 3869 Pnt 4609 3862 Pnt 4403 3846 Pnt 4954 3855 Pnt 3193 3822 Pnt 4934 3843 Pnt 3811 3852 Pnt 4119 3830 Pnt 4966 3846 Pnt 3416 3823 Pnt 5016 3844 Pnt 4957 3840 Pnt 4313 3860 Pnt 4434 3863 Pnt 3094 3838 Pnt 4041 3853 Pnt 1917 3820 Pnt 3660 3824 Pnt 3811 3850 Pnt 2768 3887 Pnt 4354 3862 Pnt 4313 3846 Pnt 4307 3861 Pnt 3770 3851 Pnt 4300 3834 Pnt 4150 3869 Pnt 4791 3865 Pnt 4884 3865 Pnt 4592 3863 Pnt 4667 3864 Pnt 4855 3868 Pnt 3950 3861 Pnt 4942 3860 Pnt 4113 3829 Pnt 4501 3841 Pnt 2225 3838 Pnt 4644 3867 Pnt 4557 3843 Pnt 4650 3852 Pnt 4721 3850 Pnt 4824 3866 Pnt 4820 3854 Pnt 4449 3879 Pnt 4830 3845 Pnt 4471 3841 Pnt 4690 3864 Pnt 4740 3868 Pnt 4563 3842 Pnt 4775 3819 Pnt 4776 3852 Pnt 5012 3838 Pnt 5106 3844 Pnt 5029 3839 Pnt 5077 3822 Pnt 5090 3820 Pnt 5083 3861 Pnt 5008 3854 Pnt 4916 3878 Pnt 4830 3346 Pnt 5007 3855 Pnt 4953 3877 Pnt 4847 3873 Pnt 4883 3875 Pnt 4884 3872 Pnt 4969 3879 Pnt 4669 3863 Pnt 4747 3867 Pnt 4021 3854 Pnt 2519 3838 Pnt 4830 3869 Pnt 4739 3864 Pnt 4814 3868 Pnt 3855 3852 Pnt 4794 3873 Pnt 3659 3850 Pnt 4929 3874 Pnt 4779 3866 Pnt 4159 3855 Pnt 4592 3844 Pnt 4263 3857 Pnt 4456 3864 Pnt 3525 3851 Pnt 4141 3856 Pnt 4478 3854 Pnt 4686 3842 Pnt 3805 3851 Pnt 3322 3879 Pnt 4451 3846 Pnt 4574 3855 Pnt 4694 3840 Pnt 4299 3859 Pnt 4453 3863 Pnt 4308 3848 Pnt 4563 3856 Pnt 4587 3867 Pnt 4369 3858 Pnt 4298 3834 Pnt 4170 3830 Pnt 4332 3832 Pnt 4943 3850 Pnt 4418 3845 Pnt 3650 3823 Pnt 4949 3838 Pnt 4931 3841 Pnt 1894 3819 Pnt 4081 3828 Pnt 3758 3824 Pnt 4111 3829 Pnt 3422 3822 Pnt 3153 3820 Pnt 4955 3853 Pnt 4026 3827 Pnt 3893 3825 Pnt 4957 3844 Pnt 4336 3873 Pnt 4459 3862 Pnt 4354 3861 Pnt 4611 3852 Pnt 3479 3850 Pnt 4496 3839 Pnt 4661 3839 Pnt 4537 3858 Pnt 3724 3879 Pnt 2777 3883 Pnt 4697 3853 Pnt 4630 3860 Pnt 4549 3851 Pnt 4774 3848 Pnt 4787 3861 Pnt 4721 3855 Pnt 4842 3856 Pnt 4701 3863 Pnt 4833 3853 Pnt 3243 3837 Pnt 4841 3843 Pnt 4725 3838 Pnt 4883 3867 Pnt 3245 3879 Pnt 4491 3845 Pnt 4452 3849 Pnt 4815 3879 Pnt 5087 3859 Pnt 5007 3866 Pnt 5084 3836 Pnt 4986 3853 Pnt 5002 3854 Pnt 5059 3855 Pnt 4971 3861 Pnt 4874 3874 Pnt 4912 3876 Pnt 5023 3339 Pnt 4887 3871 Pnt 4954 3875 Pnt 4920 3873 Pnt 4843 3872 Pnt 4788 3869 Pnt 4797 3867 Pnt 4806 3868 Pnt 4024 3853 Pnt 4811 3870 Pnt 4723 3862 Pnt 4150 3854 Pnt 4688 3843 Pnt 4732 3844 Pnt 4643 3861 Pnt 3621 3848 Pnt 4767 3865 Pnt 4140 3838 Pnt 3878 3851 Pnt 4256 3845 Pnt 4452 3840 Pnt 4291 3846 Pnt 4489 3847 Pnt 4305 3854 Pnt 4689 3860 Pnt 4610 3848 Pnt 4468 3862 Pnt 3817 3852 Pnt 4567 3853 Pnt 4363 3833 Pnt 4319 3831 Pnt 4399 3855 Pnt 4292 3832 Pnt 4093 3828 Pnt 3760 3823 Pnt 3134 3819 Pnt 3890 3824 Pnt 4081 3826 Pnt 4148 3829 Pnt 3440 3820 Pnt 4925 3839 Pnt 2824 3879 Pnt 3626 3821 Pnt 4948 3278 Pnt 4010 3842 Pnt 1956 3818 Pnt 3545 3849 Pnt 2262 3837 Pnt 4350 3859 Pnt 4955 3843 Pnt 4938 3836 Pnt 4623 3845 Pnt 4441 3861 Pnt 4588 3851 Pnt 4489 3856 Pnt 4569 3867 Pnt 4593 3856 Pnt 4660 3857 Pnt 4619 3871 Pnt 4527 3858 Pnt 4700 3847 Pnt 4770 3849 Pnt 4788 3852 Pnt 4734 3860 Pnt 4694 3861 Pnt 4549 3856 Pnt 4056 3856 Pnt 4467 3836 Pnt 4853 3825 Pnt 4833 3835 Pnt 2688 3837 Pnt 4772 3871 Pnt 4832 3842 Pnt 4874 3859 Pnt 4528 3860 Pnt 4729 3849 Pnt 5092 3864 Pnt 5002 3847 Pnt 5016 3866 Pnt 4915 3858 Pnt 4980 3865 Pnt 5014 3852 Pnt 5064 3854 Pnt 4993 3332 Pnt 4842 3871 Pnt 4866 3873 Pnt 4944 3874 Pnt 4790 3868 Pnt 4875 3870 Pnt 4815 3867 Pnt 4806 3869 Pnt 4722 3864 Pnt 4800 3866 Pnt 4917 3872 Pnt 4714 3861 Pnt 4769 3863 Pnt 4175 3853 Pnt 4600 3858 Pnt 4173 3843 Pnt 3838 3848 Pnt 4655 3838 Pnt 4054 3844 Pnt 3861 3849 Pnt 4036 3839 Pnt 4317 3856 Pnt 4258 3855 Pnt 4695 3859 Pnt 4300 3857 Pnt 4703 3841 Pnt 4475 3862 Pnt 3640 3853 Pnt 4359 3832 Pnt 4298 3831 Pnt 4416 3842 Pnt 4297 3830 Pnt 4071 3825 Pnt 4007 3824 Pnt 4141 3828 Pnt 4455 3861 Pnt 3619 3820 Pnt 3142 3818 Pnt 3754 3821 Pnt 4093 3852 Pnt 3421 3819 Pnt 3914 3823 Pnt 1929 3816 Pnt 4951 3844 Pnt 4450 3841 Pnt 4957 3875 Pnt 4334 3871 Pnt 4940 3837 Pnt 3477 3847 Pnt 4439 3859 Pnt 4461 3860 Pnt 4572 3864 Pnt 4342 3837 Pnt 4575 3849 Pnt 4580 3854 Pnt 4671 3850 Pnt 4563 3855 Pnt 4589 3841 Pnt 4538 3856 Pnt 2774 3875 Pnt 4636 3844 Pnt 3064 3835 Pnt 4637 3862 Pnt 4742 3847 Pnt 4462 3861 Pnt 4695 3858 Pnt 4689 3848 Pnt 4538 3837 Pnt 4788 3855 Pnt 4760 3856 Pnt 4441 3815 Pnt 4805 3841 Pnt 4854 3834 Pnt 4836 3816 Pnt 4726 3819 Pnt 2282 3835 Pnt 4873 3817 Pnt 4803 3864 Pnt 5029 3862 Pnt 5004 3859 Pnt 4911 3857 Pnt 4977 3324 Pnt 4997 3850 Pnt 4949 3873 Pnt 5018 3858 Pnt 4859 3872 Pnt 4791 3866 Pnt 5065 3853 Pnt 4813 3868 Pnt 4917 3871 Pnt 4812 3864 Pnt 4881 3869 Pnt 4825 3865 Pnt 4067 3853 Pnt 4711 3863 Pnt 4688 3861 Pnt 4162 3853 Pnt 4161 3851 Pnt 3551 3842 Pnt 4613 3841 Pnt 3861 3848 Pnt 4731 3860 Pnt 4016 3836 Pnt 4840 3870 Pnt 3613 3840 Pnt 4688 3843 Pnt 3805 3847 Pnt 4658 3838 Pnt 4255 3854 Pnt 4299 3855 Pnt 4291 3844 Pnt 4333 3845 Pnt 4489 3861 Pnt 4453 3851 Pnt 4359 3846 Pnt 4284 3830 Pnt 3999 3823 Pnt 3155 3816 Pnt 4103 3825 Pnt 4151 3826 Pnt 1956 3815 Pnt 4769 3850 Pnt 4077 3824 Pnt 4398 3841 Pnt 3757 3820 Pnt 3413 3817 Pnt 3905 3821 Pnt 3613 3819 Pnt 2840 3873 Pnt 2507 3835 Pnt 4341 3857 Pnt 4959 3847 Pnt 4942 3868 Pnt 4457 3859 Pnt 4560 3849 Pnt 4431 3858 Pnt 4580 3852 Pnt 4566 3864 Pnt 4651 3854 Pnt 4640 3843 Pnt 4461 3836 Pnt 4658 3855 Pnt 4539 3852 Pnt 4497 3860 Pnt 4595 3847 Pnt 4542 3859 Pnt 4352 3868 Pnt 4733 3866 Pnt 4445 3846 Pnt 4697 3856 Pnt 4693 3855 Pnt 4793 3853 Pnt 4761 3849 Pnt 3511 3845 Pnt 4031 3834 Pnt 4707 3859 Pnt 4804 3815 Pnt 4879 3839 Pnt 4851 3858 Pnt 4837 3817 Pnt 4822 3848 Pnt 4991 3840 Pnt 4998 3862 Pnt 5067 3816 Pnt 4877 3871 Pnt 4950 3872 Pnt 4974 3874 Pnt 5021 3863 Pnt 4836 3317 Pnt 4910 3873 Pnt 4820 3866 Pnt 4807 3863 Pnt 4916 3870 Pnt 4818 3864 Pnt 4787 3865 Pnt 4874 3867 Pnt 4191 3851 Pnt 4693 3860 Pnt 4171 3850 Pnt 3859 3847 Pnt 4734 3840 Pnt 4610 3855 Pnt 3609 3837 Pnt 4776 3841 Pnt 3798 3834 Pnt 4030 3849 Pnt 4733 3839 Pnt 4679 3856 Pnt 4316 3866 Pnt 4317 3853 Pnt 4259 3852 Pnt 4472 3835 Pnt 4481 3842 Pnt 4651 3857 Pnt 4480 3859 Pnt 2706 3849 Pnt 4334 3850 Pnt 4333 3843 Pnt 4352 3846 Pnt 4615 3843 Pnt 4297 3855 Pnt 4334 3827 Pnt 4008 3821 Pnt 4080 3845 Pnt 1973 3813 Pnt 4143 3825 Pnt 4404 3840 Pnt 3418 3816 Pnt 3604 3817 Pnt 4099 3824 Pnt 3757 3819 Pnt 3891 3820 Pnt 3137 3815 Pnt 4460 3858 Pnt 4423 3857 Pnt 4959 3847 Pnt 4562 3861 Pnt 4556 3851 Pnt 4583 3848 Pnt 4641 3852 Pnt 3391 3891 Pnt 4493 3864 Pnt 3463 3857 Pnt 4549 3854 Pnt 4565 3858 Pnt 4668 3855 Pnt 2676 3848 Pnt 4595 3856 Pnt 4058 3848 Pnt 4739 3840 Pnt 4792 3833 Pnt 4685 3849 Pnt 4725 3859 Pnt 4715 3846 Pnt 2593 3891 Pnt 4764 3854 Pnt 4763 3858 Pnt 4796 3852 Pnt 4843 3851 Pnt 4862 3853 Pnt 5034 3828 Pnt 4911 3821 Pnt 4989 3827 Pnt 5005 3824 Pnt 4972 3822 Pnt 4875 3826 Pnt 4945 3831 Pnt 4885 3853 Pnt 4811 3864 Pnt 4814 3309 Pnt 4834 3867 Pnt 4813 3865 Pnt 4878 3862 Pnt 4722 3861 Pnt 4804 3862 Pnt 3637 3843 Pnt 4143 3850 Pnt 4597 3854 Pnt 4721 3857 Pnt 4907 3868 Pnt 3791 3844 Pnt 4030 3848 Pnt 4655 3856 Pnt 2854 3891 Pnt 4692 3858 Pnt 4684 3855 Pnt 4150 3842 Pnt 4490 3833 Pnt 4317 3842 Pnt 4260 3850 Pnt 4356 3854 Pnt 4293 3849 Pnt 4467 3847 Pnt 4470 3837 Pnt 4636 3846 Pnt 4781 3868 Pnt 4122 3830 Pnt 1995 3821 Pnt 4451 3849 Pnt 4426 3852 Pnt 3866 3845 Pnt 4345 3856 Pnt 4404 3851 Pnt 3802 3826 Pnt 4559 3844 Pnt 4052 3828 Pnt 4572 3861 Pnt 4192 3832 Pnt 3197 3822 Pnt 4327 3835 Pnt 3422 3842 Pnt 4473 3859 Pnt 4140 3831 Pnt 3930 3827 Pnt 4025 3857 Pnt 3676 3839 Pnt 4446 3846 Pnt 4536 3869 Pnt 3482 3861 Pnt 4598 3854 Pnt 4347 3858 Pnt 4495 3853 Pnt 4577 3841 Pnt 4676 3843 Pnt 4578 3842 Pnt 4747 3856 Pnt 4726 3847 Pnt 4634 3850 Pnt 4781 3850 Pnt 4641 3846 Pnt 2624 3846 Pnt 4743 3849 Pnt 4838 3857 Pnt 4810 3856 Pnt 4840 3855 Pnt 4762 3852 Pnt 4841 3855 Pnt 4997 3857 Pnt 4906 3856 Pnt 4957 3853 Pnt 5005 3301 Pnt 4823 3854 Pnt 4783 3858 Pnt 4908 3858 Pnt 4826 3859 Pnt 4923 3859 Pnt 3669 3842 Pnt 4699 3860 Pnt 3336 3888 Pnt 3443 3841 Pnt 4157 3848 Pnt 4884 3888 Pnt 4027 3848 Pnt 4742 3859 Pnt 4149 3849 Pnt 3800 3838 Pnt 4023 3846 Pnt 4886 3868 Pnt 4912 3860 Pnt 4455 3856 Pnt 4954 3869 Pnt 4898 3870 Pnt 4458 3836 Pnt 3892 3844 Pnt 4597 3853 Pnt 4490 3861 Pnt 4416 3845 Pnt 4255 3850 Pnt 4322 3853 Pnt 2450 3888 Pnt 4802 3864 Pnt 4540 3859 Pnt 4289 3851 Pnt 4790 3850 Pnt 4811 3861 Pnt 4571 3853 Pnt 2640 3845 Pnt 2585 3888 Pnt 4632 3847 Pnt 4317 3843 Pnt 4572 3847 Pnt 4652 3835 Pnt 4462 3855 Pnt 4688 3854 Pnt 4732 3859 Pnt 4929 3860 Pnt 4959 3855 Pnt 4854 3853 Pnt 5014 3845 Pnt 4935 3854 Pnt 4825 3865 Pnt 4913 3866 Pnt 4870 3864 Pnt 4800 3859 Pnt 4504 3856 Pnt 4746 3858 Pnt 4705 3856 Pnt 4820 3863 Pnt 4776 3857 Pnt 4614 3851 Pnt 4572 3857 Pnt 4148 3846 Pnt 4494 3855 Pnt 4023 3845 Pnt 4158 3847 Pnt 4260 3848 Pnt 3645 3841 Pnt 3447 3839 Pnt 4344 3852 Pnt 3862 3843 Pnt 4300 3850 Pnt 4438 3853 Pnt 3799 3842 Pnt 4047 3847 Pnt 4436 3835 Pnt 4294 3851 Pnt 4485 3847 Pnt 4572 3858 Pnt 4552 3846 Pnt 4784 3844 Pnt 4455 3854 Pnt 4651 3854 Pnt 4819 3860 Pnt 4668 3853 Pnt 4405 3846 Pnt 3309 3884 Pnt 2241 3884 Pnt 4709 3855 Pnt 2516 3884 Pnt 4654 3845 Pnt 2677 3844 Pnt 3913 3869 Pnt 4359 3870 Pnt 4424 3842 Pnt 4803 3843 Pnt 4827 3841 Pnt 4910 3846 Pnt 4934 3850 Pnt 4907 3840 Pnt 4884 3867 Pnt 4966 3854 Pnt 4935 3429 Pnt 4048 3844 Pnt 4724 3858 Pnt 4816 3861 Pnt 4688 3856 Pnt 4433 3853 Pnt 3410 3880 Pnt 4812 3863 Pnt 4834 3865 Pnt 3952 3880 Pnt 2235 3880 Pnt 2436 3880 Pnt 4772 3857 Pnt 4727 3855 Pnt 4582 3858 Pnt 4568 3860 Pnt 4486 3856 Pnt 4146 3847 Pnt 4612 3852 Pnt 4017 3845 Pnt 4503 3843 Pnt 3622 3841 Pnt 4466 3855 Pnt 4250 3849 Pnt 3459 3840 Pnt 4659 3854 Pnt 3794 3842 Pnt 4683 3853 Pnt 3858 3843 Pnt 2639 3842 Pnt 4292 3851 Pnt 4385 3842 Pnt 4328 3852 Pnt 3291 3876 Pnt 2166 3876 Pnt 2409 3876 Pnt 4133 3846 Pnt 4443 3832 Pnt 2619 3841 Pnt 4553 3857 Pnt 4291 3850 Pnt 4388 3841 Pnt 4322 3831 Pnt 4446 3874 Pnt 3362 3874 Pnt 1980 3874 Pnt 2617 3885 Pnt 2711 3840 Pnt 5201 3823 Pnt 5224 3825 Pnt 5204 3823 Pnt 5232 3837 Pnt 5246 3838 Pnt 5253 3826 Pnt 5257 3828 Pnt 5191 3884 Pnt 4584 3840 Pnt 5093 3850 Pnt 5133 3424 Pnt 5142 3882 Pnt 5157 3881 Pnt 5149 3879 Pnt 5070 3876 Pnt 5180 3883 Pnt 5253 3891 Pnt 5004 3880 Pnt 5080 3882 Pnt 5011 3881 Pnt 5092 3883 Pnt 5044 3884 Pnt 4960 3876 Pnt 4995 3877 Pnt 5114 3877 Pnt 4954 3873 Pnt 4831 3868 Pnt 4886 3872 Pnt 4917 3871 Pnt 4927 3875 Pnt 4964 3874 Pnt 4859 3870 Pnt 4721 3861 Pnt 4727 3862 Pnt 4674 3848 Pnt 4776 3865 Pnt 4735 3860 Pnt 5018 3878 Pnt 4869 3871 Pnt 4864 3867 Pnt 4589 3845 Pnt 4539 3843 Pnt 4610 3844 Pnt 4606 3846 Pnt 4471 3838 Pnt 4506 3842 Pnt 4533 3841 Pnt 4263 3835 Pnt 4032 3830 Pnt 3283 3823 Pnt 4138 3831 Pnt 4269 3833 Pnt 4340 3837 Pnt 3623 3825 Pnt 4317 3836 Pnt 3489 3823 Pnt 4210 3832 Pnt 3876 3827 Pnt 3788 3826 Pnt 4887 3869 Pnt 4477 3838 Pnt 2568 3838 Pnt 3165 3850 Pnt 2568 3837 Pnt 2049 3850 Pnt 2529 3837 Pnt 2281 3850 Pnt 3060 3849 Pnt 2024 3849 Pnt 2288 3849 Pnt 4800 3875 Pnt 4481 3844 Pnt 4773 3822 Pnt 4492 3823 Pnt 3997 3828 Pnt 5180 3862 Pnt 5209 3827 Pnt 5226 3832 Pnt 5248 3835 Pnt 5169 3838 Pnt 5186 3884 Pnt 5234 3886 Pnt 5170 3883 Pnt 5120 3879 Pnt 5149 3881 Pnt 5089 3877 Pnt 5168 3420 Pnt 5153 3878 Pnt 5119 3876 Pnt 5063 3875 Pnt 5173 3882 Pnt 5015 3879 Pnt 4994 3878 Pnt 5044 3882 Pnt 5056 3880 Pnt 4994 3876 Pnt 5069 3881 Pnt 4953 3875 Pnt 5021 3877 Pnt 4882 3871 Pnt 4921 3870 Pnt 4965 3873 Pnt 4825 3867 Pnt 4858 3869 Pnt 4923 3874 Pnt 4948 3872 Pnt 4891 3868 Pnt 4691 3860 Pnt 4665 3846 Pnt 4788 3865 Pnt 4720 3861 Pnt 4730 3859 Pnt 4849 3870 Pnt 4853 3866 Pnt 4576 3844 Pnt 4447 3837 Pnt 4755 3864 Pnt 4589 3845 Pnt 4142 3830 Pnt 4352 3836 Pnt 4269 3833 Pnt 4601 3843 Pnt 4210 3831 Pnt 4535 3842 Pnt 3866 3826 Pnt 4537 3839 Pnt 3618 3823 Pnt 4490 3841 Pnt 3158 3848 Pnt 3986 3827 Pnt 2116 3848 Pnt 4036 3828 Pnt 2425 3848 Pnt 4474 3838 Pnt 4273 3832 Pnt 3291 3822 Pnt 3796 3825 Pnt 4317 3835 Pnt 3465 3822 Pnt 4482 3837 Pnt 4772 3862 Pnt 3101 3846 Pnt 2080 3846 Pnt 2231 3846 Pnt 4342 3836 Pnt 3094 3845 Pnt 2029 3845 Pnt 2338 3845 Pnt 4424 3830 Pnt 5174 3833 Pnt 5192 3844 Pnt 5204 3820 Pnt 5228 3825 Pnt 5232 3822 Pnt 5243 3821 Pnt 5186 3881 Pnt 5197 3884 Pnt 5153 3880 Pnt 5109 3876 Pnt 5132 3875 Pnt 5180 3415 Pnt 5157 3877 Pnt 5055 3881 Pnt 5138 3878 Pnt 5076 3874 Pnt 4951 3873 Pnt 4971 3874 Pnt 5007 3877 Pnt 5015 3875 Pnt 5039 3876 Pnt 5008 3878 Pnt 5065 3879 Pnt 5076 3880 Pnt 4902 3870 Pnt 4917 3867 Pnt 4872 3865 Pnt 4868 3868 Pnt 4982 3872 Pnt 4837 3866 Pnt 4934 3869 Pnt 4961 3871 Pnt 4699 3859 Pnt 4664 3845 Pnt 4732 3858 Pnt 4790 3864 Pnt 4718 3860 Pnt 4788 3861 Pnt 4764 3863 Pnt 4848 3869 Pnt 4570 3843 Pnt 4539 3838 Pnt 4489 3837 Pnt 4599 3844 Pnt 4508 3839 Pnt 4209 3830 Pnt 4540 3841 Pnt 4616 3842 Pnt 4469 3836 Pnt 4032 3827 Pnt 3777 3823 Pnt 4268 3832 Pnt 4274 3831 Pnt 3981 3826 Pnt 3283 3820 Pnt 4145 3828 Pnt 3471 3821 Pnt 3626 3822 Pnt 4340 3835 Pnt 4317 3833 Pnt 3209 3844 Pnt 2161 3844 Pnt 3884 3825 Pnt 2512 3844 Pnt 4473 3833 Pnt 3063 3842 Pnt 2065 3842 Pnt 2252 3842 Pnt 4368 3878 Pnt 5152 3819 Pnt 5198 3821 Pnt 5192 3828 Pnt 5201 3832 Pnt 5217 3831 Pnt 5239 3830 Pnt 5251 3822 Pnt 5189 3881 Pnt 5041 3880 Pnt 5067 3873 Pnt 5124 3877 Pnt 5074 3879 Pnt 5126 3410 Pnt 3249 3841 Pnt 5104 3875 Pnt 5150 3876 Pnt 5156 3878 Pnt 5027 3841 Pnt 5060 3878 Pnt 4937 3872 Pnt 4952 3873 Pnt 4997 3874 Pnt 4987 3876 Pnt 5007 3877 Pnt 4958 3871 Pnt 4833 3865 Pnt 4891 3869 Pnt 4922 3866 Pnt 4866 3867 Pnt 4865 3864 Pnt 4927 3868 Pnt 4959 3870 Pnt 4799 3863 Pnt 4658 3844 Pnt 4701 3857 Pnt 4733 3856 Pnt 4723 3859 Pnt 4597 3843 Pnt 4772 3862 Pnt 4791 3860 Pnt 4847 3868 Pnt 4580 3842 Pnt 4487 3836 Pnt 4472 3835 Pnt 4535 3837 Pnt 4515 3838 Pnt 4540 3839 Pnt 4605 3841 Pnt 4357 3833 Pnt 4268 3830 Pnt 4262 3831 Pnt 3878 3823 Pnt 4318 3832 Pnt 4213 3828 Pnt 3981 3825 Pnt 4031 3826 Pnt 4141 3827 Pnt 3462 3820 Pnt 3271 3819 Pnt 3646 3821 Pnt 2278 3841 Pnt 3837 3822 Pnt 2458 3841 Pnt 4520 3839 Pnt 3030 3840 Pnt 2059 3840 Pnt 2248 3840 Pnt 3043 3838 Pnt 1981 3838 Pnt 2349 3838 Pnt 3101 3838 Pnt 1765 3838 Pnt 2205 3838 Pnt 4827 3826 Pnt 5147 3825 Pnt 5180 3818 Pnt 5188 3828 Pnt 5184 3827 Pnt 5203 3818 Pnt 5193 3820 Pnt 5228 3883 Pnt 5146 3877 Pnt 5041 3405 Pnt 5063 3872 Pnt 5098 3874 Pnt 5127 3873 Pnt 5160 3875 Pnt 5121 3876 Pnt 5072 3878 Pnt 5043 3877 Pnt 4929 3871 Pnt 5000 3875 Pnt 4993 3876 Pnt 4973 3870 Pnt 4998 3873 Pnt 5023 3874 Pnt 4936 3872 Pnt 4930 3869 Pnt 4882 3868 Pnt 4851 3863 Pnt 4796 3862 Pnt 4864 3866 Pnt 4896 3865 Pnt 4830 3864 Pnt 4762 3861 Pnt 4904 3867 Pnt 4707 3857 Pnt 4780 3859 Pnt 4651 3843 Pnt 4840 3867 Pnt 4693 3856 Pnt 4580 3841 Pnt 4723 3855 Pnt 4593 3842 Pnt 4445 3833 Pnt 4354 3832 Pnt 4328 3831 Pnt 3795 3821 Pnt 4488 3835 Pnt 4281 3828 Pnt 3472 3818 Pnt 4520 3838 Pnt 4535 3836 Pnt 4616 3839 Pnt 4263 3830 Pnt 3284 3818 Pnt 4487 3837 Pnt 4035 3825 Pnt 3988 3823 Pnt 4143 3826 Pnt 3877 3822 Pnt 4209 3827 Pnt 3632 3820 Pnt 4807 3855 Pnt 5135 3821 Pnt 5170 3817 Pnt 5162 3817 Pnt 5185 3818 Pnt 5193 3820 Pnt 5117 3875 Pnt 5238 3828 Pnt 5193 3880 Pnt 5017 3400 Pnt 5065 3871 Pnt 5051 3876 Pnt 5143 3872 Pnt 5044 3878 Pnt 5102 3873 Pnt 5153 3874 Pnt 5065 3877 Pnt 5035 3873 Pnt 4972 3869 Pnt 4944 3870 Pnt 4986 3874 Pnt 4960 3871 Pnt 4960 3868 Pnt 4998 3872 Pnt 4901 3867 Pnt 4774 3860 Pnt 4799 3861 Pnt 4791 3857 Pnt 4857 3865 Pnt 4898 3864 Pnt 4847 3862 Pnt 4819 3863 Pnt 4908 3866 Pnt 4651 3842 Pnt 4716 3856 Pnt 4703 3855 Pnt 4615 3841 Pnt 4622 3838 Pnt 4600 3839 Pnt 4731 3854 Pnt 4494 3836 Pnt 4854 3866 Pnt 4477 3833 Pnt 4527 3835 Pnt 4451 3832 Pnt 4037 3823 Pnt 4201 3826 Pnt 4352 3831 Pnt 3471 3817 Pnt 4524 3837 Pnt 3624 3818 Pnt 4330 3830 Pnt 3985 3822 Pnt 4137 3825 Pnt 4810 3862 Pnt 3865 3821 Pnt 3779 3820 Pnt 4264 3828 Pnt 4269 3827 Pnt 3284 3817 Pnt 4683 3861 Pnt 4783 3821 Pnt 5126 3823 Pnt 5149 3816 Pnt 5173 3815 Pnt 5165 3820 Pnt 5180 3858 Pnt 5185 3825 Pnt 5182 3879 Pnt 5143 3873 Pnt 5024 3874 Pnt 5056 3395 Pnt 5113 3872 Pnt 5078 3870 Pnt 5081 3876 Pnt 5129 3871 Pnt 5052 3875 Pnt 4990 3873 Pnt 4960 3867 Pnt 5000 3871 Pnt 4932 3869 Pnt 4984 3868 Pnt 4957 3870 Pnt 5031 3872 Pnt 4897 3866 Pnt 4918 3865 Pnt 4800 3860 Pnt 4869 3864 Pnt 4828 3862 Pnt 4795 3856 Pnt 4719 3855 Pnt 4774 3858 Pnt 4846 3861 Pnt 4892 3863 Pnt 4594 3838 Pnt 4531 3836 Pnt 4617 3837 Pnt 4689 3854 Pnt 4729 3853 Pnt 4600 3839 Pnt 4846 3864 Pnt 4642 3841 Pnt 4487 3835 Pnt 4441 3831 Pnt 4517 3833 Pnt 3782 3818 Pnt 4323 3828 Pnt 4274 3827 Pnt 3362 3815 Pnt 4369 3830 Pnt 4297 3826 Pnt 3690 3817 Pnt 4001 3821 Pnt 3474 3816 Pnt 4041 3822 Pnt 4483 3832 Pnt 4157 3823 Pnt 4205 3825 Pnt 3868 3820 Pnt 4791 3858 Pnt 4786 3820 Pnt 5123 3818 Pnt 5145 3821 Pnt 5147 3814 Pnt 5175 3823 Pnt 5182 3822 Pnt 5188 3856 Pnt 5167 3874 Pnt 5080 3871 Pnt 4993 3872 Pnt 5005 3873 Pnt 5060 3390 Pnt 5058 3869 Pnt 5069 3875 Pnt 5131 3870 Pnt 5044 3876 Pnt 5012 3871 Pnt 4959 3869 Pnt 4940 3868 Pnt 4983 3867 Pnt 4891 3865 Pnt 5008 3870 Pnt 4948 3866 Pnt 4860 3863 Pnt 4913 3864 Pnt 4721 3854 Pnt 4796 3858 Pnt 4852 3859 Pnt 4687 3853 Pnt 4794 3855 Pnt 4830 3861 Pnt 4899 3862 Pnt 4775 3857 Pnt 4612 3838 Pnt 4521 3833 Pnt 4610 3837 Pnt 4543 3835 Pnt 4620 3836 Pnt 4852 3863 Pnt 4647 3839 Pnt 4745 3852 Pnt 4265 3825 Pnt 4339 3828 Pnt 3985 3820 Pnt 4223 3823 Pnt 4516 3832 Pnt 4473 3831 Pnt 4145 3822 Pnt 4283 3826 Pnt 4326 3827 Pnt 4449 3830 Pnt 3470 3815 Pnt 3264 3814 Pnt 3784 3817 Pnt 3624 3816 Pnt 4029 3821 Pnt 3861 3818 Pnt 4780 3856 Pnt 5153 3815 Pnt 5091 3817 Pnt 5130 3816 Pnt 5124 3820 Pnt 5154 3821 Pnt 5169 3818 Pnt 5187 3384 Pnt 5132 3872 Pnt 5069 3868 Pnt 5033 3875 Pnt 5026 3870 Pnt 4990 3871 Pnt 4998 3869 Pnt 5066 3874 Pnt 5062 3873 Pnt 4965 3868 Pnt 5022 3872 Pnt 4875 3862 Pnt 4935 3863 Pnt 4962 3865 Pnt 4828 3859 Pnt 4892 3864 Pnt 4937 3867 Pnt 4984 3866 Pnt 4894 3861 Pnt 4731 3851 Pnt 4796 3857 Pnt 4720 3853 Pnt 4704 3852 Pnt 4813 3855 Pnt 4769 3856 Pnt 4854 3858 Pnt 4781 3854 Pnt 4537 3831 Pnt 4545 3833 Pnt 4521 3832 Pnt 4599 3836 Pnt 4623 3835 Pnt 4654 3838 Pnt 4201 3822 Pnt 4606 3837 Pnt 3623 3815 Pnt 4343 3827 Pnt 4274 3825 Pnt 4470 3830 Pnt 4849 3862 Pnt 4320 3826 Pnt 4444 3828 Pnt 3488 3813 Pnt 4268 3823 Pnt 3869 3817 Pnt 3991 3818 Pnt 3797 3816 Pnt 3287 3813 Pnt 4031 3820 Pnt 4156 3821 Pnt 5070 3816 Pnt 5092 3812 Pnt 5118 3815 Pnt 5130 3818 Pnt 5152 3813 Pnt 5170 3820 Pnt 5195 3817 Pnt 5145 3873 Pnt 5006 3379 Pnt 5039 3874 Pnt 4993 3870 Pnt 5087 3873 Pnt 5057 3872 Pnt 5031 3869 Pnt 5004 3868 Pnt 4962 3867 Pnt 4865 3860 Pnt 4896 3863 Pnt 4922 3862 Pnt 4826 3858 Pnt 4900 3859 Pnt 4928 3866 Pnt 4967 3865 Pnt 4943 3864 Pnt 4794 3853 Pnt 4699 3851 Pnt 4862 3857 Pnt 4797 3856 Pnt 4727 3852 Pnt 4739 3850 Pnt 4771 3855 Pnt 4808 3854 Pnt 4532 3830 Pnt 4515 3831 Pnt 4604 3836 Pnt 4535 3832 Pnt 4587 3835 Pnt 4638 3837 Pnt 4335 3826 Pnt 4609 3833 Pnt 4317 3825 Pnt 3280 3811 Pnt 4471 3828 Pnt 4264 3823 Pnt 4844 3861 Pnt 3784 3815 Pnt 4447 3827 Pnt 3471 3812 Pnt 4271 3822 Pnt 3630 3813 Pnt 4208 3821 Pnt 3865 3816 Pnt 4038 3818 Pnt 3974 3817 Pnt 4132 3820 Pnt 5048 3811 Pnt 5070 3810 Pnt 5101 3813 Pnt 5123 3815 Pnt 5127 3816 Pnt 5148 3812 Pnt 5163 3826 Pnt 5152 3869 Pnt 4939 3865 Pnt 5007 3870 Pnt 4990 3869 Pnt 5069 3871 Pnt 5074 3373 Pnt 5030 3868 Pnt 5006 3867 Pnt 4956 3866 Pnt 4832 3857 Pnt 4916 3858 Pnt 4884 3862 Pnt 4933 3860 Pnt 4865 3859 Pnt 4956 3863 Pnt 4974 3864 Pnt 4856 3856 Pnt 4711 3850 Pnt 4740 3851 Pnt 4802 3855 Pnt 4795 3852 Pnt 4805 3853 Pnt 4734 3848 Pnt 4757 3854 Pnt 4845 3860 Pnt 4581 3833 Pnt 4504 3830 Pnt 4639 3836 Pnt 4539 3828 Pnt 4600 3835 Pnt 4522 3831 Pnt 4613 3832 Pnt 4151 3818 Pnt 4489 3827 Pnt 4316 3823 Pnt 4336 3825 Pnt 3281 3810 Pnt 4214 3820 Pnt 3983 3816 Pnt 3626 3812 Pnt 4037 3817 Pnt 4268 3822 Pnt 4276 3821 Pnt 3465 3811 Pnt 3782 3813 Pnt 4452 3826 Pnt 3863 3815 Pnt 5070 3822 Pnt 5073 3811 Pnt 5096 3809 Pnt 5124 3813 Pnt 5135 3823 Pnt 5155 3809 Pnt 5172 3812 Pnt 5068 3872 Pnt 5009 3368 Pnt 4963 3865 Pnt 5015 3869 Pnt 4937 3864 Pnt 5035 3867 Pnt 5003 3866 Pnt 4965 3863 Pnt 5045 3870 Pnt 4842 3856 Pnt 4869 3858 Pnt 4935 3859 Pnt 4864 3855 Pnt 4911 3857 Pnt 4897 3860 Pnt 4971 3861 Pnt 4803 3854 Pnt 4716 3849 Pnt 4699 3848 Pnt 4667 3835 Pnt 4791 3851 Pnt 4739 3847 Pnt 4768 3853 Pnt 4809 3852 Pnt 4492 3828 Pnt 4843 3859 Pnt 4534 3830 Pnt 4606 3831 Pnt 4601 3833 Pnt 4539 3827 Pnt 4489 3826 Pnt 4313 3822 Pnt 4585 3832 Pnt 4454 3825 Pnt 4140 3817 Pnt 4265 3821 Pnt 4211 3818 Pnt 4034 3816 Pnt 3284 3809 Pnt 3627 3811 Pnt 4275 3820 Pnt 3983 3815 Pnt 3467 3809 Pnt 4340 3823 Pnt 3863 3813 Pnt 3775 3812 Pnt 5084 3809 Pnt 5070 3820 Pnt 5067 3362 Pnt 5078 3815 Pnt 5096 3807 Pnt 5129 3817 Pnt 5151 3808 Pnt 5012 3868 Pnt 5063 3871 Pnt 4940 3863 Pnt 4967 3864 Pnt 4892 3859 Pnt 5000 3867 Pnt 4957 3860 Pnt 5034 3866 Pnt 4979 3861 Pnt 4998 3865 Pnt 4820 3851 Pnt 4877 3857 Pnt 4795 3853 Pnt 4828 3855 Pnt 4940 3858 Pnt 4906 3856 Pnt 4859 3854 Pnt 4770 3852 Pnt 4595 3831 Pnt 4602 3832 Pnt 4715 3848 Pnt 4660 3833 Pnt 4693 3847 Pnt 4730 3846 Pnt 4851 3858 Pnt 4781 3849 Pnt 4486 3827 Pnt 3909 3812 Pnt 4476 3823 Pnt 3621 3809 Pnt 4613 3830 Pnt 4541 3828 Pnt 4347 3821 Pnt 4493 3825 Pnt 4544 3826 Pnt 4365 3822 Pnt 3787 3811 Pnt 3281 3807 Pnt 4036 3815 Pnt 4202 3817 Pnt 3988 3813 Pnt 4143 3816 Pnt 4272 3820 Pnt 3462 3808 Pnt 4260 3818 Pnt 5047 3817 Pnt 5070 3818 Pnt 5064 3816 Pnt 5076 3815 Pnt 5098 3808 Pnt 5125 3806 Pnt 5026 3867 Pnt 5153 3813 Pnt 4936 3356 Pnt 4961 3862 Pnt 4989 3866 Pnt 4972 3860 Pnt 4892 3858 Pnt 4949 3859 Pnt 5000 3864 Pnt 5018 3865 Pnt 4865 3856 Pnt 4802 3852 Pnt 4825 3849 Pnt 4866 3853 Pnt 4839 3854 Pnt 4929 3857 Pnt 4770 3851 Pnt 4904 3855 Pnt 4607 3831 Pnt 4595 3830 Pnt 4693 3846 Pnt 4722 3845 Pnt 4657 3832 Pnt 4715 3847 Pnt 4773 3848 Pnt 4520 3827 Pnt 4840 3857 Pnt 4485 3823 Pnt 4503 3826 Pnt 4533 3825 Pnt 4612 3828 Pnt 4460 3822 Pnt 4340 3821 Pnt 4275 3818 Pnt 3904 3811 Pnt 4069 3813 Pnt 4348 3820 Pnt 3623 3808 Pnt 4171 3815 Pnt 4014 3812 Pnt 4233 3816 Pnt 4293 3817 Pnt 3461 3807 Pnt 3784 3809 Pnt 3275 3806 Pnt 4990 3805 Pnt 5012 3812 Pnt 5065 3815 Pnt 5064 3816 Pnt 5080 3811 Pnt 5100 3813 Pnt 5128 3807 Pnt 5058 3869 Pnt 4946 3861 Pnt 5004 3350 Pnt 4901 3857 Pnt 4955 3858 Pnt 4937 3860 Pnt 4925 3856 Pnt 5027 3864 Pnt 4959 3859 Pnt 4778 3849 Pnt 4869 3855 Pnt 4802 3850 Pnt 4831 3853 Pnt 4903 3854 Pnt 4818 3848 Pnt 4858 3852 Pnt 4796 3847 Pnt 4604 3830 Pnt 4594 3828 Pnt 4712 3846 Pnt 4726 3844 Pnt 4651 3831 Pnt 4610 3827 Pnt 4686 3845 Pnt 4516 3826 Pnt 4329 3818 Pnt 4473 3822 Pnt 4495 3825 Pnt 4841 3856 Pnt 4340 3820 Pnt 4032 3812 Pnt 4523 3823 Pnt 4448 3821 Pnt 3994 3811 Pnt 4204 3815 Pnt 4137 3813 Pnt 3866 3809 Pnt 3783 3808 Pnt 4279 3817 Pnt 3277 3805 Pnt 3463 3805 Pnt 3625 3807 Pnt 4265 3816 Pnt 5027 3822 Pnt 5097 3804 Pnt 4994 3344 Pnt 5005 3808 Pnt 5042 3809 Pnt 5063 3811 Pnt 5073 3805 Pnt 4986 3803 Pnt 4959 3860 Pnt 5032 3862 Pnt 4895 3856 Pnt 4826 3852 Pnt 4862 3854 Pnt 4925 3855 Pnt 4974 3858 Pnt 4953 3857 Pnt 4895 3853 Pnt 4925 3859 Pnt 4740 3843 Pnt 4736 3845 Pnt 4797 3849 Pnt 4855 3850 Pnt 4696 3844 Pnt 4819 3847 Pnt 4775 3848 Pnt 4772 3846 Pnt 4531 3822 Pnt 4502 3823 Pnt 4593 3827 Pnt 4644 3830 Pnt 4613 3826 Pnt 4603 3828 Pnt 4307 3817 Pnt 4521 3825 Pnt 4212 3813 Pnt 4279 3816 Pnt 4346 3818 Pnt 4138 3812 Pnt 4280 3815 Pnt 4470 3821 Pnt 3284 3803 Pnt 3780 3807 Pnt 4841 3854 Pnt 3621 3805 Pnt 3469 3804 Pnt 3865 3808 Pnt 3987 3809 Pnt 4435 3820 Pnt 4043 3811 Pnt 4993 3811 Pnt 4998 3809 Pnt 4995 3804 Pnt 5039 3802 Pnt 5057 3812 Pnt 5058 3808 Pnt 5069 3807 Pnt 5033 3861 Pnt 4872 3338 Pnt 4909 3855 Pnt 4939 3858 Pnt 4910 3852 Pnt 4984 3857 Pnt 4929 3854 Pnt 4960 3856 Pnt 4940 3859 Pnt 4792 3848 Pnt 4724 3844 Pnt 4768 3847 Pnt 4855 3849 Pnt 4821 3850 Pnt 4791 3845 Pnt 4806 3846 Pnt 4689 3843 Pnt 4600 3826 Pnt 4523 3822 Pnt 4655 3828 Pnt 4625 3825 Pnt 4532 3823 Pnt 4611 3827 Pnt 4730 3841 Pnt 4275 3815 Pnt 4443 3818 Pnt 4849 3853 Pnt 4464 3820 Pnt 4338 3817 Pnt 3781 3805 Pnt 3625 3804 Pnt 3275 3802 Pnt 4319 3816 Pnt 4279 3813 Pnt 4139 3811 Pnt 4514 3821 Pnt 4029 3809 Pnt 4217 3812 Pnt 3479 3803 Pnt 3978 3808 Pnt 3872 3807 Pnt 4948 3856 Pnt 4985 3854 Pnt 4999 3848 Pnt 4996 3847 Pnt 5026 3827 Pnt 5027 3825 Pnt 5051 3820 Pnt 4859 3811 Pnt 4885 3804 Pnt 4926 3808 Pnt 4966 3809 Pnt 4897 3801 Pnt 4916 3803 Pnt 4946 3807 Pnt 5071 3864 Pnt 4723 3843 Pnt 4858 3848 Pnt 4794 3847 Pnt 4791 3844 Pnt 4773 3846 Pnt 4825 3849 Pnt 4810 3845 Pnt 4688 3841 Pnt 4711 3840 Pnt 4534 3822 Pnt 4611 3823 Pnt 4601 3826 Pnt 4645 3827 Pnt 4588 3825 Pnt 4490 3821 Pnt 4265 3813 Pnt 4842 3852 Pnt 4338 3816 Pnt 4473 3818 Pnt 4322 3815 Pnt 3796 3804 Pnt 4137 3809 Pnt 4270 3812 Pnt 4521 3820 Pnt 4029 3808 Pnt 4217 3811 Pnt 3470 3801 Pnt 3631 3803 Pnt 3983 3807 Pnt 4493 3817 Pnt 3868 3805 Pnt 3285 3801 Pnt 5046 3812 Pnt 5061 3816 Pnt 5087 3815 Pnt 5099 3826 Pnt 5092 3811 Pnt 5108 3813 Pnt 5146 3817 Pnt 5058 3864 Pnt 4933 3857 Pnt 4987 3862 Pnt 4959 3860 Pnt 4959 3374 Pnt 5033 3863 Pnt 5010 3861 Pnt 5108 3871 Pnt 4895 3855 Pnt 4821 3850 Pnt 4837 3851 Pnt 4872 3854 Pnt 4917 3853 Pnt 4862 3849 Pnt 4895 3852 Pnt 4774 3847 Pnt 4770 3842 Pnt 4982 3858 Pnt 4781 3845 Pnt 4795 3844 Pnt 4704 3841 Pnt 4733 3839 Pnt 4803 3843 Pnt 4585 3832 Pnt 4671 3837 Pnt 4559 3833 Pnt 4482 3830 Pnt 4509 3831 Pnt 4566 3835 Pnt 4658 3836 Pnt 4170 3820 Pnt 4233 3822 Pnt 4123 3819 Pnt 3835 3815 Pnt 4281 3824 Pnt 4249 3821 Pnt 4300 3825 Pnt 3443 3811 Pnt 3589 3812 Pnt 4448 3827 Pnt 3753 3813 Pnt 3271 3810 Pnt 3946 3816 Pnt 4982 3860 Pnt 4409 3826 Pnt 4637 3838 Pnt 4498 3809 Pnt 4010 3817 Pnt 5022 3810 Pnt 5043 3812 Pnt 5069 3811 Pnt 5077 3821 Pnt 5098 3827 Pnt 5122 3824 Pnt 5086 3816 Pnt 5034 3863 Pnt 4928 3369 Pnt 4996 3861 Pnt 4994 3857 Pnt 4956 3858 Pnt 5041 3862 Pnt 5008 3860 Pnt 4956 3855 Pnt 4901 3854 Pnt 4866 3853 Pnt 4929 3852 Pnt 4865 3847 Pnt 4837 3850 Pnt 4898 3851 Pnt 4820 3849 Pnt 4773 3845 Pnt 4976 3859 Pnt 4738 3838 Pnt 4707 3840 Pnt 4801 3843 Pnt 4660 3837 Pnt 4772 3841 Pnt 4778 3844 Pnt 4783 3842 Pnt 4662 3836 Pnt 4451 3826 Pnt 4481 3829 Pnt 4567 3834 Pnt 4582 3831 Pnt 4557 3832 Pnt 4496 3830 Pnt 4644 3835 Pnt 4170 3819 Pnt 3251 3809 Pnt 4270 3822 Pnt 4105 3817 Pnt 4419 3825 Pnt 4239 3820 Pnt 4230 3821 Pnt 3949 3815 Pnt 3437 3810 Pnt 3588 3811 Pnt 3827 3813 Pnt 4292 3824 Pnt 3734 3812 Pnt 3981 3816 Pnt 4483 3827 Pnt 5027 3811 Pnt 5042 3822 Pnt 5039 3808 Pnt 5059 3808 Pnt 5080 3810 Pnt 5088 3817 Pnt 5088 3820 Pnt 5089 3866 Pnt 4891 3852 Pnt 4937 3855 Pnt 4981 3363 Pnt 4993 3860 Pnt 4958 3854 Pnt 4999 3856 Pnt 5013 3858 Pnt 4907 3853 Pnt 4831 3847 Pnt 4780 3844 Pnt 4833 3849 Pnt 4895 3850 Pnt 4919 3851 Pnt 4766 3843 Pnt 4864 3846 Pnt 4991 3858 Pnt 4685 3838 Pnt 4739 3837 Pnt 4791 3842 Pnt 4670 3836 Pnt 4689 3835 Pnt 4673 3834 Pnt 4773 3840 Pnt 4784 3841 Pnt 4492 3826 Pnt 4567 3832 Pnt 4546 3831 Pnt 4494 3829 Pnt 4431 3824 Pnt 4577 3830 Pnt 4179 3817 Pnt 4471 3827 Pnt 4228 3820 Pnt 4453 3825 Pnt 3994 3815 Pnt 4233 3819 Pnt 4103 3816 Pnt 3945 3814 Pnt 3246 3808 Pnt 4272 3821 Pnt 3741 3811 Pnt 3584 3810 Pnt 3438 3808 Pnt 3826 3812 Pnt 4294 3822 Pnt 4991 3807 Pnt 5022 3819 Pnt 5041 3814 Pnt 5038 3816 Pnt 5068 3820 Pnt 5087 3810 Pnt 5099 3806 Pnt 5048 3861 Pnt 4883 3851 Pnt 4971 3856 Pnt 4936 3854 Pnt 4968 3358 Pnt 4908 3852 Pnt 4924 3850 Pnt 5008 3857 Pnt 4977 3855 Pnt 4819 3846 Pnt 4778 3843 Pnt 4837 3847 Pnt 4776 3842 Pnt 4854 3845 Pnt 4896 3849 Pnt 4989 3857 Pnt 4776 3841 Pnt 4650 3835 Pnt 4724 3836 Pnt 4667 3832 Pnt 4681 3834 Pnt 4566 3831 Pnt 4762 3838 Pnt 4783 3840 Pnt 4672 3837 Pnt 4436 3822 Pnt 4325 3821 Pnt 4579 3829 Pnt 4506 3825 Pnt 4506 3827 Pnt 4466 3824 Pnt 3832 3811 Pnt 4558 3830 Pnt 4236 3817 Pnt 4473 3826 Pnt 3742 3810 Pnt 4274 3820 Pnt 3443 3807 Pnt 4104 3815 Pnt 4176 3816 Pnt 3246 3806 Pnt 3995 3814 Pnt 4231 3819 Pnt 3945 3812 Pnt 3580 3808 Pnt 4996 3806 Pnt 5022 3807 Pnt 5019 3816 Pnt 5037 3814 Pnt 5038 3817 Pnt 5091 3812 Pnt 5101 3815 Pnt 5052 3860 Pnt 4897 3851 Pnt 4926 3853 Pnt 4959 3855 Pnt 4966 3852 Pnt 4903 3352 Pnt 4986 3854 Pnt 4920 3849 Pnt 4882 3850 Pnt 4786 3841 Pnt 4834 3845 Pnt 4842 3846 Pnt 4792 3838 Pnt 4782 3842 Pnt 4868 3844 Pnt 4783 3840 Pnt 4982 3856 Pnt 4659 3834 Pnt 4691 3836 Pnt 4575 3830 Pnt 4672 3832 Pnt 4654 3831 Pnt 4718 3835 Pnt 4746 3837 Pnt 4551 3829 Pnt 4447 3823 Pnt 4491 3826 Pnt 4473 3825 Pnt 4429 3821 Pnt 4572 3828 Pnt 4498 3824 Pnt 4273 3819 Pnt 4302 3820 Pnt 3827 3810 Pnt 3754 3808 Pnt 3992 3812 Pnt 4228 3817 Pnt 3579 3807 Pnt 3423 3806 Pnt 4233 3816 Pnt 3949 3811 Pnt 4173 3815 Pnt 4095 3814 Pnt 3241 3805 Pnt 4959 3810 Pnt 4978 3811 Pnt 5013 3804 Pnt 5014 3815 Pnt 5039 3812 Pnt 5056 3806 Pnt 5087 3804 Pnt 5038 3861 Pnt 4888 3849 Pnt 4948 3346 Pnt 4843 3845 Pnt 4911 3850 Pnt 4935 3847 Pnt 5000 3853 Pnt 4965 3851 Pnt 4890 3846 Pnt 4799 3838 Pnt 4814 3844 Pnt 4775 3837 Pnt 4770 3840 Pnt 4778 3841 Pnt 4859 3843 Pnt 4754 3836 Pnt 4985 3855 Pnt 4573 3829 Pnt 4694 3835 Pnt 4655 3832 Pnt 4665 3830 Pnt 4565 3828 Pnt 4721 3834 Pnt 4670 3831 Pnt 4579 3826 Pnt 4484 3823 Pnt 4465 3824 Pnt 4489 3825 Pnt 4285 3818 Pnt 4423 3820 Pnt 4440 3821 Pnt 3955 3810 Pnt 3750 3807 Pnt 4302 3819 Pnt 3830 3808 Pnt 3419 3804 Pnt 3243 3804 Pnt 4231 3816 Pnt 3991 3811 Pnt 3584 3806 Pnt 4105 3812 Pnt 4229 3815 Pnt 4159 3814 Pnt 4965 3812 Pnt 4985 3808 Pnt 5018 3811 Pnt 5035 3807 Pnt 5017 3810 Pnt 5043 3803 Pnt 5053 3804 Pnt 4994 3852 Pnt 4841 3340 Pnt 4899 3847 Pnt 4826 3843 Pnt 4892 3849 Pnt 4925 3846 Pnt 4971 3850 Pnt 4907 3845 Pnt 4930 3851 Pnt 4798 3836 Pnt 4791 3837 Pnt 4876 3842 Pnt 4778 3839 Pnt 4769 3835 Pnt 4780 3840 Pnt 4692 3834 Pnt 4997 3854 Pnt 4585 3825 Pnt 4571 3828 Pnt 4665 3829 Pnt 4560 3826 Pnt 4649 3831 Pnt 4671 3830 Pnt 4497 3824 Pnt 4706 3833 Pnt 4282 3816 Pnt 4302 3818 Pnt 4417 3819 Pnt 4462 3823 Pnt 4439 3820 Pnt 4231 3814 Pnt 4099 3811 Pnt 4230 3815 Pnt 4167 3812 Pnt 3954 3808 Pnt 4493 3821 Pnt 3753 3806 Pnt 3444 3803 Pnt 3835 3807 Pnt 4008 3810 Pnt 3371 3803 Pnt 3646 3804 Pnt 4935 3852 Pnt 4960 3846 Pnt 4988 3835 Pnt 4977 3837 Pnt 4999 3334 Pnt 5020 3828 Pnt 4877 3802 Pnt 4897 3807 Pnt 4843 3811 Pnt 4893 3810 Pnt 4947 3801 Pnt 4917 3812 Pnt 4947 3809 Pnt 5054 3856 Pnt 4772 3839 Pnt 4815 3842 Pnt 4778 3835 Pnt 4786 3836 Pnt 4769 3837 Pnt 4858 3841 Pnt 4986 3853 Pnt 4746 3834 Pnt 4653 3828 Pnt 4657 3830 Pnt 4691 3833 Pnt 4677 3842 Pnt 4721 3844 Pnt 4595 3830 Pnt 4564 3826 Pnt 4452 3834 Pnt 4496 3828 Pnt 4465 3829 Pnt 4311 3820 Pnt 4280 3823 Pnt 4421 3825 Pnt 3962 3807 Pnt 4176 3815 Pnt 4234 3814 Pnt 3756 3806 Pnt 3998 3816 Pnt 4109 3812 Pnt 3836 3810 Pnt 3445 3805 Pnt 3608 3809 Pnt 3302 3801 Pnt 4604 3814 Pnt 4514 3823 Pnt 4246 3812 Pnt 4933 3849 Pnt 4978 3821 Pnt 4995 3850 Pnt 4962 3824 Pnt 5032 3802 Pnt 5054 3807 Pnt 5009 3800 Pnt 4967 3847 Pnt 4877 3845 Pnt 4839 3842 Pnt 4822 3841 Pnt 4899 3843 Pnt 4866 3840 Pnt 4923 3844 Pnt 4899 3846 Pnt 4686 3831 Pnt 4766 3836 Pnt 4784 3834 Pnt 4721 3830 Pnt 4770 3837 Pnt 4776 3835 Pnt 4991 3851 Pnt 4460 3818 Pnt 4570 3825 Pnt 4646 3829 Pnt 4474 3820 Pnt 4580 3823 Pnt 3969 3806 Pnt 4298 3815 Pnt 4181 3810 Pnt 4667 3828 Pnt 4508 3819 Pnt 3424 3801 Pnt 4234 3812 Pnt 3826 3805 Pnt 3578 3802 Pnt 3243 3800 Pnt 4405 3816 Pnt 3999 3807 Pnt 4776 3833 Pnt 4273 3814 Pnt 4535 3824 Pnt 4478 3821 Pnt 4226 3811 Pnt 4640 3826 Pnt 3756 3803 Pnt 4115 3845 Pnt 4923 3847 Pnt 4942 3850 Pnt 4970 3852 Pnt 4952 3842 Pnt 5010 3824 Pnt 5025 3823 Pnt 4836 3801 Pnt 4884 3802 Pnt 4821 3803 Pnt 4907 3807 Pnt 4894 3806 Pnt 4915 3799 Pnt 4858 3805 Pnt 4994 3849 Pnt 4773 3831 Pnt 4697 3830 Pnt 4780 3835 Pnt 4805 3834 Pnt 4781 3836 Pnt 4792 3833 Pnt 4989 3850 Pnt 4714 3829 Pnt 4548 3823 Pnt 4572 3824 Pnt 4582 3821 Pnt 4648 3828 Pnt 4668 3826 Pnt 4654 3825 Pnt 4471 3819 Pnt 4484 3820 Pnt 4439 3816 Pnt 4311 3814 Pnt 4490 3818 Pnt 4280 3813 Pnt 4424 3815 Pnt 4222 3811 Pnt 3956 3805 Pnt 4232 3810 Pnt 3835 3803 Pnt 3580 3801 Pnt 3243 3799 Pnt 3749 3802 Pnt 3989 3806 Pnt 4098 3807 Pnt 4906 3844 Pnt 4926 3846 Pnt 4948 3849 Pnt 4972 3851 Pnt 4962 3838 Pnt 4986 3837 Pnt 5009 3828 Pnt 4277 3809 Pnt 3446 3799 Pnt 4827 3843 Pnt 4785 3845 Pnt 4852 3837 Pnt 4863 3847 Pnt 4912 3844 Pnt 4930 3849 Pnt 4883 3843 Pnt 4737 3836 Pnt 4698 3841 Pnt 4774 3834 Pnt 4802 3838 Pnt 5000 3828 Pnt 4773 3830 Pnt 4785 3829 Pnt 4580 3848 Pnt 4563 3823 Pnt 4559 3822 Pnt 4684 3822 Pnt 4505 3819 Pnt 4478 3818 Pnt 4654 3818 Pnt 4652 3830 Pnt 4237 3809 Pnt 4239 3816 Pnt 3258 3797 Pnt 4289 3823 Pnt 4116 3806 Pnt 4312 3810 Pnt 3948 3811 Pnt 4421 3825 Pnt 3759 3801 Pnt 4453 3805 Pnt 3606 3799 Pnt 3837 3813 Pnt 4499 3798 Pnt 4196 3807 Pnt 4033 3805 Pnt 3442 3798 Pnt 4946 3801 Pnt 4893 3806 Pnt 4926 3845 Pnt 4949 3844 Pnt 4822 3837 Pnt 4979 3815 Pnt 4998 3803 Pnt 4777 3834 Pnt 4833 3838 Pnt 4687 3828 Pnt 4858 3836 Pnt 4734 3827 Pnt 4769 3833 Pnt 4919 3309 Pnt 4894 3840 Pnt 4875 3842 Pnt 4588 3819 Pnt 4566 3820 Pnt 4571 3822 Pnt 4778 3830 Pnt 4791 3831 Pnt 4766 3829 Pnt 4677 3824 Pnt 3279 3796 Pnt 4243 3807 Pnt 4457 3816 Pnt 4486 3818 Pnt 4244 3809 Pnt 4980 3848 Pnt 3746 3799 Pnt 3954 3802 Pnt 4286 3810 Pnt 4101 3805 Pnt 3578 3798 Pnt 3444 3797 Pnt 3832 3801 Pnt 4648 3823 Pnt 4643 3825 Pnt 4415 3813 Pnt 4309 3811 Pnt 3993 3803 Pnt 4441 3814 Pnt 4177 3806 Pnt 4493 3815 Pnt 4883 3795 Pnt 4902 3805 Pnt 4908 3806 Pnt 4927 3807 Pnt 4927 3803 Pnt 4957 3797 Pnt 4990 3802 Pnt 4957 3843 Pnt 4777 3833 Pnt 4820 3836 Pnt 4779 3829 Pnt 4871 3302 Pnt 4836 3837 Pnt 4774 3832 Pnt 4777 3830 Pnt 4982 3847 Pnt 4578 3820 Pnt 4666 3822 Pnt 4676 3823 Pnt 4734 3825 Pnt 4691 3827 Pnt 4760 3828 Pnt 4568 3819 Pnt 4649 3824 Pnt 4306 3810 Pnt 4493 3814 Pnt 4568 3818 Pnt 4491 3817 Pnt 4280 3809 Pnt 4468 3815 Pnt 4421 3811 Pnt 3845 3799 Pnt 4227 3807 Pnt 3955 3801 Pnt 4440 3813 Pnt 3240 3795 Pnt 4177 3805 Pnt 3990 3802 Pnt 3579 3797 Pnt 3757 3798 Pnt 4226 3806 Pnt 4103 3803 Pnt 3435 3795 Pnt 4846 3802 Pnt 4886 3795 Pnt 4899 3799 Pnt 4903 3805 Pnt 4934 3793 Pnt 4962 3801 Pnt 4988 3794 Pnt 4922 3838 Pnt 4772 3830 Pnt 4776 3832 Pnt 4815 3295 Pnt 4868 3834 Pnt 4788 3828 Pnt 4764 3827 Pnt 4780 3829 Pnt 4987 3846 Pnt 4552 3818 Pnt 4569 3819 Pnt 4663 3820 Pnt 4727 3824 Pnt 4661 3823 Pnt 4696 3825 Pnt 4591 3817 Pnt 4672 3822 Pnt 4463 3814 Pnt 4490 3813 Pnt 4285 3807 Pnt 4419 3810 Pnt 3841 3798 Pnt 3248 3793 Pnt 4239 3806 Pnt 3959 3799 Pnt 4453 3811 Pnt 4494 3815 Pnt 4311 3809 Pnt 3589 3795 Pnt 4228 3805 Pnt 4102 3802 Pnt 3743 3797 Pnt 3989 3801 Pnt 3425 3794 Pnt 4162 3803 Pnt 4832 3794 Pnt 4849 3795 Pnt 4899 3799 Pnt 4904 3797 Pnt 4928 3801 Pnt 4936 3802 Pnt 4963 3798 Pnt 4895 3838 Pnt 4771 3829 Pnt 4796 3828 Pnt 4787 3827 Pnt 4778 3830 Pnt 4690 3824 Pnt 4877 3833 Pnt 4772 3825 Pnt 4992 3288 Pnt 4578 3818 Pnt 4558 3817 Pnt 4588 3815 Pnt 4654 3819 Pnt 4677 3820 Pnt 4652 3822 Pnt 4500 3814 Pnt 4716 3823 Pnt 4297 3806 Pnt 4462 3813 Pnt 4333 3807 Pnt 4246 3805 Pnt 4504 3811 Pnt 4267 3803 Pnt 4438 3809 Pnt 3999 3799 Pnt 3584 3794 Pnt 4468 3810 Pnt 3434 3793 Pnt 3757 3795 Pnt 3233 3792 Pnt 4175 3802 Pnt 4100 3801 Pnt 3826 3797 Pnt 3942 3798 Pnt 4820 3791 Pnt 4839 3791 Pnt 4879 3798 Pnt 4898 3795 Pnt 4910 3794 Pnt 4924 3793 Pnt 4956 3799 Pnt 4863 3831 Pnt 4782 3281 Pnt 4705 3823 Pnt 4771 3824 Pnt 4792 3825 Pnt 4776 3828 Pnt 4734 3822 Pnt 4786 3827 Pnt 4988 3844 Pnt 4490 3813 Pnt 4649 3820 Pnt 4552 3815 Pnt 4561 3817 Pnt 4665 3819 Pnt 4652 3818 Pnt 4573 3814 Pnt 4466 3811 Pnt 4474 3810 Pnt 3439 3791 Pnt 4281 3805 Pnt 4310 3806 Pnt 4243 3804 Pnt 4431 3808 Pnt 4239 3802 Pnt 4173 3801 Pnt 4454 3809 Pnt 3243 3791 Pnt 3822 3795 Pnt 3757 3794 Pnt 3989 3798 Pnt 3598 3793 Pnt 4099 3799 Pnt 3943 3797 Pnt 4818 3790 Pnt 4834 3794 Pnt 4877 3791 Pnt 4891 3793 Pnt 4900 3797 Pnt 4918 3795 Pnt 4868 3830 Pnt 4987 3789 Pnt 4778 3273 Pnt 4696 3822 Pnt 4779 3828 Pnt 4764 3823 Pnt 4783 3824 Pnt 4785 3826 Pnt 4651 3819 Pnt 4723 3820 Pnt 4506 3812 Pnt 4572 3815 Pnt 4478 3810 Pnt 4667 3817 Pnt 4595 3813 Pnt 4514 3809 Pnt 4684 3818 Pnt 4566 3814 Pnt 4290 3805 Pnt 4234 3802 Pnt 4112 3798 Pnt 4172 3800 Pnt 3446 3790 Pnt 3835 3794 Pnt 3591 3791 Pnt 4244 3801 Pnt 4273 3804 Pnt 3741 3793 Pnt 4435 3808 Pnt 4408 3806 Pnt 3249 3789 Pnt 3989 3797 Pnt 3935 3795 Pnt 4779 3793 Pnt 4828 3789 Pnt 4842 3788 Pnt 4881 3794 Pnt 4903 3791 Pnt 4926 3805 Pnt 4868 3829 Pnt 4993 3790 Pnt 4687 3821 Pnt 4778 3824 Pnt 4764 3826 Pnt 4778 3266 Pnt 4727 3819 Pnt 4649 3818 Pnt 4763 3822 Pnt 4664 3817 Pnt 4559 3814 Pnt 4497 3810 Pnt 4511 3808 Pnt 4583 3812 Pnt 4656 3815 Pnt 4473 3809 Pnt 4547 3813 Pnt 4444 3806 Pnt 4232 3800 Pnt 3994 3795 Pnt 4293 3804 Pnt 4175 3798 Pnt 4106 3797 Pnt 4278 3802 Pnt 3245 3788 Pnt 3433 3789 Pnt 4228 3801 Pnt 3827 3793 Pnt 3943 3794 Pnt 3738 3791 Pnt 3586 3790 Pnt 4408 3805 Pnt 4774 3789 Pnt 4779 3790 Pnt 4819 3786 Pnt 4833 3801 Pnt 4894 3802 Pnt 4912 3800 Pnt 4858 3828 Pnt 4988 3787 Pnt 4684 3819 Pnt 4758 3821 Pnt 4655 3258 Pnt 4784 3822 Pnt 4788 3823 Pnt 4731 3818 Pnt 4675 3815 Pnt 4659 3814 Pnt 4554 3812 Pnt 4484 3808 Pnt 4590 3810 Pnt 4499 3809 Pnt 4570 3813 Pnt 4459 3805 Pnt 4500 3806 Pnt 4423 3804 Pnt 4177 3797 Pnt 4000 3794 Pnt 3244 3786 Pnt 4301 3802 Pnt 3949 3793 Pnt 3747 3790 Pnt 4240 3798 Pnt 4275 3801 Pnt 4237 3800 Pnt 4106 3796 Pnt 3444 3787 Pnt 3824 3791 Pnt 3585 3789 Pnt 4777 3796 Pnt 4785 3789 Pnt 4781 3798 Pnt 4820 3785 Pnt 4867 3797 Pnt 4903 3787 Pnt 4837 3829 Pnt 4988 3800 Pnt 4688 3818 Pnt 4723 3817 Pnt 4761 3819 Pnt 4679 3250 Pnt 4783 3821 Pnt 4661 3813 Pnt 4646 3816 Pnt 4562 3812 Pnt 4427 3802 Pnt 4565 3809 Pnt 4301 3801 Pnt 4471 3806 Pnt 4457 3804 Pnt 4493 3808 Pnt 4550 3810 Pnt 4490 3805 Pnt 3960 3791 Pnt 4109 3794 Pnt 3996 3793 Pnt 3250 3785 Pnt 3843 3790 Pnt 3750 3789 Pnt 4174 3796 Pnt 3582 3787 Pnt 4244 3797 Pnt 4274 3800 Pnt 3426 3786 Pnt 4224 3798 Pnt 4773 3796 Pnt 4778 3794 Pnt 4768 3784 Pnt 4782 3784 Pnt 4815 3797 Pnt 4832 3793 Pnt 4865 3786 Pnt 4974 3838 Pnt 4569 3810 Pnt 4656 3242 Pnt 4681 3813 Pnt 4687 3817 Pnt 4650 3814 Pnt 4725 3816 Pnt 4756 3818 Pnt 4321 3800 Pnt 4554 3809 Pnt 4459 3802 Pnt 4497 3806 Pnt 4442 3801 Pnt 4506 3804 Pnt 4574 3808 Pnt 4482 3805 Pnt 4218 3797 Pnt 3943 3790 Pnt 4271 3798 Pnt 3832 3789 Pnt 4171 3794 Pnt 3582 3786 Pnt 4106 3793 Pnt 3986 3791 Pnt 3418 3784 Pnt 4232 3796 Pnt 3242 3784 Pnt 3743 3787 Pnt 4746 3782 Pnt 4766 3792 Pnt 4773 3794 Pnt 4772 3783 Pnt 4808 3793 Pnt 4782 3790 Pnt 4850 3824 Pnt 4981 3784 Pnt 4564 3809 Pnt 4654 3233 Pnt 4651 3813 Pnt 4671 3812 Pnt 4690 3816 Pnt 4716 3814 Pnt 4535 3808 Pnt 4554 3806 Pnt 4298 3798 Pnt 4430 3801 Pnt 4458 3804 Pnt 4486 3805 Pnt 4271 3797 Pnt 4420 3800 Pnt 4492 3802 Pnt 4223 3796 Pnt 4166 3793 Pnt 3759 3786 Pnt 4230 3794 Pnt 3833 3787 Pnt 3581 3784 Pnt 3939 3789 Pnt 4097 3792 Pnt 3425 3783 Pnt 3242 3782 Pnt 3989 3790 Pnt 4816 3823 Pnt 4678 3786 Pnt 4707 3790 Pnt 4766 3783 Pnt 4759 3789 Pnt 4778 3818 Pnt 4773 3813 Pnt 4751 3821 Pnt 4975 3816 Pnt 4547 3814 Pnt 4641 3812 Pnt 4640 3817 Pnt 4563 3808 Pnt 4660 3820 Pnt 4567 3805 Pnt 4482 3834 Pnt 4471 3804 Pnt 4287 3809 Pnt 4422 3808 Pnt 4320 3803 Pnt 4495 3810 Pnt 4449 3800 Pnt 4230 3794 Pnt 4233 3801 Pnt 4165 3798 Pnt 3824 3786 Pnt 3597 3783 Pnt 3446 3790 Pnt 4099 3793 Pnt 3267 3781 Pnt 3766 3785 Pnt 3999 3782 Pnt 3972 3785 Pnt 4684 3813 Pnt 4739 3789 Pnt 4764 3780 Pnt 4760 3818 Pnt 4777 3783 Pnt 4774 3787 Pnt 4764 3820 Pnt 4546 3805 Pnt 4965 3834 Pnt 4489 3306 Pnt 4557 3807 Pnt 4639 3808 Pnt 4559 3804 Pnt 4645 3810 Pnt 4654 3809 Pnt 4268 3794 Pnt 4235 3792 Pnt 3604 3782 Pnt 4484 3801 Pnt 4324 3796 Pnt 4252 3793 Pnt 4435 3797 Pnt 4452 3798 Pnt 4199 3790 Pnt 4501 3800 Pnt 3427 3780 Pnt 3232 3780 Pnt 3829 3785 Pnt 3743 3783 Pnt 3983 3787 Pnt 4097 3789 Pnt 3932 3786 Pnt 4864 3831 Pnt 4862 3830 Pnt 4584 3803 Pnt 4668 3804 Pnt 4756 3796 Pnt 4782 3798 Pnt 4687 3819 Pnt 4816 3799 Pnt 4863 3794 Pnt 4864 3802 Pnt 4559 3813 Pnt 4352 3806 Pnt 4596 3816 Pnt 3535 3795 Pnt 4207 3803 Pnt 4676 3811 Pnt 4276 3789 Pnt 4764 3788 Pnt 4814 3815 Pnt 4341 3786 Pnt 4853 3797 Pnt 3715 3796 Pnt 4559 3810 Pnt 4399 3808 Pnt 4569 3812 Pnt 4430 3812 Pnt 3897 3798 Pnt 4651 3796 Pnt 4805 3807 Pnt 4132 3802 Pnt 3957 3799 Pnt 4535 3785 Pnt 4489 3793 Pnt 4260 3795 Pnt 4064 3800 Pnt 3372 3794 Pnt 4711 3198 Pnt 4219 3791 Pnt 4574 3783 Pnt 4674 3808 Pnt 4131 3786 Pnt 3614 3779 Pnt 3474 3778 Pnt 4793 3782 Pnt 4711 3777 Pnt 4510 3800 Pnt 4793 3815 Pnt 4295 3792 Pnt 4196 3788 Pnt 4441 3796 Pnt 4578 3804 Pnt 3772 3781 Pnt 4322 3793 Pnt 3262 3777 Pnt 3847 3782 Pnt 3974 3783 Pnt 4509 3797 Pnt 4672 3807 Pnt 4427 3797 Pnt 4034 3789 Pnt 4768 3776 Pnt 4612 3806 Pnt 4714 3783 Pnt 4708 3776 Pnt 4774 3786 Pnt 4787 3788 Pnt 4661 3811 Pnt 4686 3807 Pnt 4577 3188 Pnt 4487 3797 Pnt 4328 3792 Pnt 4309 3791 Pnt 4464 3795 Pnt 4575 3800 Pnt 4579 3802 Pnt 4523 3799 Pnt 4508 3796 Pnt 3852 3781 Pnt 3456 3776 Pnt 3987 3782 Pnt 3789 3779 Pnt 4262 3789 Pnt 3269 3776 Pnt 4138 3785 Pnt 4207 3786 Pnt 3623 3778 Pnt 4428 3793 Pnt 4265 3788 Pnt 4011 3783 Pnt 4760 3775 Pnt 4652 3776 Pnt 4666 3786 Pnt 4677 3774 Pnt 4709 3778 Pnt 4606 3802 Pnt 4730 3810 Pnt 4795 3788 Pnt 4563 3800 Pnt 4439 3178 Pnt 4509 3797 Pnt 4463 3793 Pnt 4496 3796 Pnt 4332 3791 Pnt 4561 3799 Pnt 4511 3795 Pnt 4297 3789 Pnt 3846 3779 Pnt 3981 3781 Pnt 3459 3775 Pnt 4250 3786 Pnt 4116 3783 Pnt 4012 3782 Pnt 3617 3776 Pnt 4195 3785 Pnt 3280 3774 Pnt 4247 3788 Pnt 3776 3778 Pnt 4753 3773 Pnt 4581 3781 Pnt 4641 3773 Pnt 4667 3783 Pnt 4668 3775 Pnt 4575 3799 Pnt 4701 3808 Pnt 4716 3782 Pnt 4516 3797 Pnt 4315 3788 Pnt 4334 3789 Pnt 4507 3796 Pnt 4479 3795 Pnt 4458 3792 Pnt 4442 3791 Pnt 4504 3793 Pnt 4262 3786 Pnt 3842 3778 Pnt 3279 3773 Pnt 4009 3781 Pnt 4194 3783 Pnt 3774 3776 Pnt 3972 3779 Pnt 3453 3773 Pnt 4251 3785 Pnt 3614 3775 Pnt 4117 3782 Pnt 4742 3808 Pnt 4559 3781 Pnt 4581 3772 Pnt 4651 3771 Pnt 4541 3796 Pnt 4676 3782 Pnt 4671 3779 Pnt 4696 3783 Pnt 4729 3778 Pnt 4250 3156 Pnt 4305 3786 Pnt 4320 3788 Pnt 4478 3793 Pnt 4510 3795 Pnt 3843 3776 Pnt 4445 3791 Pnt 4502 3792 Pnt 4430 3789 Pnt 3769 3775 Pnt 3439 3772 Pnt 3618 3773 Pnt 4188 3782 Pnt 4110 3781 Pnt 3264 3771 Pnt 4009 3779 Pnt 4241 3783 Pnt 3967 3778 Pnt 4514 3772 Pnt 4558 3770 Pnt 4584 3773 Pnt 4489 3793 Pnt 4628 3775 Pnt 4653 3778 Pnt 4654 3781 Pnt 4695 3776 Pnt 4194 3782 Pnt 4242 3783 Pnt 4466 3144 Pnt 4312 3786 Pnt 4456 3792 Pnt 4433 3789 Pnt 4288 3785 Pnt 4408 3788 Pnt 3448 3770 Pnt 3619 3772 Pnt 4103 3779 Pnt 3257 3770 Pnt 3999 3778 Pnt 3764 3773 Pnt 3837 3775 Pnt 3957 3776 Pnt 4182 3781 Pnt 4480 3769 Pnt 4522 3770 Pnt 4554 3768 Pnt 4571 3776 Pnt 4447 3791 Pnt 4620 3772 Pnt 4640 3778 Pnt 4646 3773 Pnt 4223 3781 Pnt 4156 3779 Pnt 4303 3785 Pnt 4394 3786 Pnt 4247 3782 Pnt 4279 3783 Pnt 4420 3132 Pnt 4470 3789 Pnt 3283 3768 Pnt 3832 3773 Pnt 3451 3769 Pnt 3965 3775 Pnt 3751 3772 Pnt 4004 3776 Pnt 4105 3778 Pnt 4478 3767 Pnt 4500 3772 Pnt 4543 3785 Pnt 4423 3788 Pnt 4570 3770 Pnt 4602 3773 Pnt 4625 3775 Pnt 4104 3119 Pnt 3665 3770 Pnt 3273 3767 Pnt 4297 3783 Pnt 4275 3782 Pnt 4237 3781 Pnt 4401 3786 Pnt 4211 3779 Pnt 4396 3769 Pnt 3821 3772 Pnt 3455 3767 Pnt 3746 3770 Pnt 3596 3769 Pnt 3948 3773 Pnt 3996 3775 Pnt 4486 3783 Pnt 4173 3778 Pnt 4451 3767 Pnt 4472 3766 Pnt 4497 3765 Pnt 4404 3788 Pnt 4540 3779 Pnt 4558 3770 Pnt 4596 3769 Pnt 3954 3772 Pnt 3997 3773 Pnt 4200 3778 Pnt 4108 3775 Pnt 4267 3781 Pnt 4298 3782 Pnt 4232 3106 Pnt 3277 3765 Pnt 4392 3783 Pnt 3443 3766 Pnt 3741 3769 Pnt 3602 3767 Pnt 3816 3770 Pnt 4136 3783 Pnt 4445 3782 Pnt 4395 3779 Pnt 4284 3786 Pnt 4444 3778 Pnt 4471 3764 Pnt 4510 3772 Pnt 4382 3782 Pnt 4540 3764 Pnt 4563 3767 Pnt 3821 3769 Pnt 3594 3766 Pnt 4013 3092 Pnt 3958 3770 Pnt 4216 3778 Pnt 4205 3776 Pnt 4104 3773 Pnt 4131 3775 Pnt 4292 3779 Pnt 3280 3764 Pnt 3441 3764 Pnt 3746 3767 Pnt 4448 3764 Pnt 4354 3776 Pnt 4256 3785 Pnt 4400 3775 Pnt 4451 3773 Pnt 4469 3763 Pnt 4488 3762 Pnt 4287 3779 Pnt 4529 3770 Pnt 3734 3766 Pnt 3806 3767 Pnt 3952 3769 Pnt 4199 3078 Pnt 4185 3775 Pnt 4100 3772 Pnt 4137 3773 Pnt 4000 3770 Pnt 3269 3762 Pnt 3592 3764 Pnt 3432 3763 Pnt 4435 3776 Pnt 4287 3783 Pnt 4192 3775 Pnt 4362 3772 Pnt 4247 3776 Pnt 4393 3770 Pnt 4429 3769 Pnt 4458 3767 Pnt 3594 3763 Pnt 4484 3760 Pnt 3803 3766 Pnt 3734 3764 Pnt 3424 3761 Pnt 4168 3773 Pnt 3985 3769 Pnt 3939 3767 Pnt 4123 3772 Pnt 4088 3770 Pnt 3264 3760 Pnt 4262 3770 Pnt 4438 3769 Pnt 4301 3772 Pnt 4196 3782 Pnt 4362 3767 Pnt 4392 3766 Pnt 4433 3759 Pnt 3420 3760 Pnt 4468 3761 Pnt 3727 3763 Pnt 3807 3764 Pnt 4109 3770 Pnt 3932 3047 Pnt 3983 3767 Pnt 4084 3769 Pnt 3264 3759 Pnt 4175 3772 Pnt 3592 3761 Pnt 4424 3760 Pnt 4202 3767 Pnt 4101 3769 Pnt 4249 3764 Pnt 4285 3766 Pnt 4146 3770 Pnt 4350 3763 Pnt 4375 3781 Pnt 4417 3757 Pnt 3594 3760 Pnt 3424 3758 Pnt 3920 3764 Pnt 3724 3761 Pnt 3805 3763 Pnt 3973 3766 Pnt 4073 3767 Pnt 3255 3757 Pnt 4413 3781 Pnt 4163 3766 Pnt 4201 3764 Pnt 4107 3767 Pnt 4250 3756 Pnt 4281 3763 Pnt 4341 3760 Pnt 4370 3758 Pnt 4406 3757 Pnt 3800 3761 Pnt 3604 3758 Pnt 3437 3757 Pnt 3971 3764 Pnt 3734 3760 Pnt 3929 3763 Pnt 4076 3766 Pnt 3279 3756 Pnt 3915 3761 Pnt 4101 3763 Pnt 4159 3764 Pnt 4200 3760 Pnt 4243 3757 Pnt 4284 3758 Pnt 4325 3755 Pnt 4351 3754 Pnt 3596 3757 Pnt 3421 3755 Pnt 3272 3754 Pnt 3794 3760 Pnt 3964 3763 Pnt 3718 3758 Pnt 4066 3764 Pnt 3599 3755 Pnt 4072 3760 Pnt 4100 3761 Pnt 4155 3758 Pnt 4198 3757 Pnt 4243 3753 Pnt 4276 3753 Pnt 4326 3772 Pnt 3272 3753 Pnt 3416 3753 Pnt 3793 3758 Pnt 3724 3757 Pnt 3913 3760 Pnt 3962 3761 Pnt 3272 3751 Pnt 3971 3757 Pnt 4075 3758 Pnt 4099 3755 Pnt 4155 3753 Pnt 4199 3752 Pnt 4244 3767 Pnt 4277 3769 Pnt 3420 3752 Pnt 3799 3757 Pnt 3595 3753 Pnt 3719 3755 Pnt 3910 3758 Pnt 3924 3753 Pnt 3974 3752 Pnt 4076 3755 Pnt 4100 3750 Pnt 4155 3749 Pnt 4197 3764 Pnt 4244 3766 Pnt 3592 3752 Pnt 3418 3750 Pnt 3716 3753 Pnt 3271 3749 Pnt 3799 3755 Pnt 3806 3750 Pnt 3919 3752 Pnt 3969 3749 Pnt 4074 3748 Pnt 4099 3760 Pnt 4155 3761 Pnt 3600 3750 Pnt 3433 3749 Pnt 4200 3763 Pnt 3283 3748 Pnt 3726 3752 Pnt 3729 3747 Pnt 3813 3749 Pnt 3920 3746 Pnt 3972 3755 Pnt 3417 3747 Pnt 4075 3757 Pnt 4098 3758 Pnt 3266 3746 Pnt 4150 3760 Pnt 3593 3749 Pnt 3601 3745 Pnt 3729 3745 Pnt 3804 3750 Pnt 3260 3745 Pnt 3918 3752 Pnt 3970 3753 Pnt 3415 3745 Pnt 4094 3757 Pnt 4072 3755 Pnt 3427 3744 Pnt 3600 3743 Pnt 3727 3747 Pnt 3805 3749 Pnt 3258 3743 Pnt 3918 3750 Pnt 3970 3752 Pnt 4068 3753 Pnt 3293 3741 Pnt 3432 3742 Pnt 3606 3744 Pnt 3729 3745 Pnt 3809 3747 Pnt 3919 3749 Pnt 3973 3750 Pnt 3306 3740 Pnt 3436 3741 Pnt 3605 3742 Pnt 3732 3744 Pnt 3807 3745 Pnt 3915 3747 Pnt 3301 3738 Pnt 3441 3739 Pnt 3604 3741 Pnt 3729 3742 Pnt 3804 3744 Pnt 3312 3736 Pnt 3441 3737 Pnt 3606 3739 Pnt 3730 3741 Pnt 3291 3735 Pnt 3431 3736 Pnt 3601 3737 Pnt 3301 3733 Pnt 3433 3734 Pnt 3296 3731 Pnt 6579 4346 Pnt % End plot #2 1.000 UL LTb 938 4619 N 938 448 L 6009 0 V 0 4171 V -6009 0 V Z stroke 1.000 UP 1.000 UL LTb stroke grestore end showpage %%Trailer %%DocumentFonts: Helvetica starpu-1.2.3+dfsg/doc/doxygen/chapters/images/data_trace.pdf000066400000000000000000023265251320135501600240470ustar00rootroot00000000000000%PDF-1.4 %쏢 5 0 obj <> stream xɮ-re׿_LZ݄ @@B!TBi$I@^;|i6}||kĎVx_kyo_8??1񺿶ǹ,?~/?V~}?rx"MnRy-}֓ 37Х sfxi MzU:g/#]/[VY/?*QHxk"K;ov1-?U;ao7WmZȮ[iNݚtu}4 Β)';7/~q?_O3lM[zZ?x-mrS)V5t"=k4?Dm?9D{ >cflUXmZMu,煫|YW-[zQ"%W_Y˚T{u-;Cޭ?z")|m+%#XgM|[ic(%op -T&Pk,Y]^ӽ?ozMykO=$'ZfOD-aU3v6riQ/[aO<5q9mF~Y߰[OXMzuXJj٨dڠ<_L\7h Ȕ{ tO&zWYX&JN{dQ}==2:R{oAi۷l/K݉)V{%z5;[˶=3-vM襉~uj")T_i]ˑmz6' Kލl5}#7 ꬧?ȑ(8ڪ,J:ɚ?m]-oAˎQF͌>;Ki{A#ڼK9+.=QlD-8cP-IsDl1$o4džn3 Y9ļ]MYdy<6y9ՃjY2~c=(ɉU|^GFsv|d<%nJK}G\/ڹR/A4䲇K&[2.hWM񝒱"򤧳dZܤ_֑&]i\]^;NwOLzVR2-lڶ9j;fwW{  +ޏ]DLV^r49osd#&lXT H8/3l 5ԱwY = Y%}ҔDqCDQdʽkuKecd"E}wyzl"%\'mܡA5r <~Xidvkl.]O&^9/=Tْe,j^2+ӛhЎ#R_mO(wGiWy`ZODxiIm.+߼"sk݇l}A'd|=S,Ziu7%s,KWiO]VV x#8}@ON4aoJ&&u؟(^"7"Ly֛.CW Qw\kfMDϔ }M^5\2q\O%~-Pg-jYx<ĄҢ̌\QAmD["$EGgI#=14(0w6KǫW9.kI2tDotējʣ~_!go>ֳr 'M7[FV2oN:1t47_^xSZL 2ߪ҈4Zxϭ<g4jb=ž%9GZEL#*\UX}5561ev_{$y1-siۗķo711'<ȈeexHƪ̾ťJ&OOz6j1IwQDk:CtuM- h"kS YAs:hMFxDfʷko2V֍E:'97{h,]XKΊ=KsU_pOc~k &g̕W[悸tO<Ǜd {[r_kIQ}b"=]\g̢H5T2CU#g**y&dら?м&R%2璩+ j-@=\OƾHk.ALK MRyА G9_&m$-O9jWooi:+=fW/]:J̗-gfu/57x`rMh{Eܻ~OqSo\XSKVj%Ϭ{GUc'Mał뚿>&YOV-ķޑ?e|\}Azdksc&WZA&.5[<_XQW钱pWQZ9O0hϕ5th>3hjM&] JFDYT"!SQQwEQC=,['DSki&޾̿ɜ"]=Dw4a^s4^Ax1zZU~dS/JHֶ JD4OY(m0/Ql)$(O_ɛ#S[U,#,Ǩ f2%?knw7sfZV} %gD5qIGeMO ‚q-cim˪gmf='&w޿ԶH&ʔ{ihҫ6a!E-U-V'iݕuLhF32(;jK0A<ˈwQr-8k &;cz)KVѺubnis"gjqCyDv[+9/2evijQL^qŦ|ejؽf *TDoT21=5PnsıOF0O7^z%v4Zd Oy:{ߨΣ*|:H|?^I1c%ܳUMVuAZ#2ٴ8[W\s.h3Iuxaj.Z&*\X{LVuAxUZ2q "g mwdAh+2 /-qL qb"orWϜJ7XU;^("웾c9M1 ^yvƩ&tܚЀ;~+Pƽg֯mf\ZX`qv5DAwaՏs r4Ucٗt$vmќ&jgX5 nέhў7O2Zn{LJ\SXA_u{R=LL+79rts3XW&^ ě1QV;8׻WgxdohM>}ĜEfhf0QҽTIx2fWZ ?f TH0.L MQU}9حDz33Zؗ;&rL)wo%mKyVO,-T6Qv,BcVᖳ }XM !9ّx M1Ō/E8M52IHY3'!!J&zߴ/ oɯ'kUO񼳧Q1&Zܰ<[[wDYW!ޑIPRx*K&Y_1kv ?MXǫ܊qu -j%>oG MNFTIqFisX",Q޺dr”wML窸 {?l;3A w, 3[뉱[i7Zdо{\-.r{ADgJQkL2 x}Z,f ܫGh3KDLy(bBkG;r4|f4LQ#ɔ5jMCn%I빙[>%˙n76cml)=z ԯЄflYEUzM)L\L ⒙Ѽ0 VoA`#?VJV)"&lc-+4aA73Zd+-YLUZy\QDM U;a'X҄J^ꏴL_ n -n/5xF2Bk m[RXV\5; K&v=1lFAԯ eO]пs׫j陽{`USSjǙQn 1=fM\&ی`'.iʘ[Y2uVnɎ hEu8#w_ =]lmrSyBAxi7)xMxDŽU;h鹻swA" 3%oܲlt'}ºov͞.Y|-Ib9MkjglLk"ZywM6${ V7{_Ag;gHv4]J *Rǣ|^q~ϸaӷ; Ό-;~f2~z_]f9Ж)Xl=zuUtm~~r&ZȒs산++97aK &^dh_hrT2$SDδM[j%Ԉ犹Ζߤl&҂"̱3idP&ӆU݆x=h쯉Ш3ZHƎз;s&L+FlzS3OnZRCޠֻAn=#Xek!H,Γy.Ex}G%&cjcsk򞟟qFywY{%އ^1ĘMG׮e5w3R ׬&|OнxM8NG;aw?4мgݯg/^2أ$cǙ#<=Z" ylWYcvCpa<,}> l-= H)㹕LL$J`v-NA)Ә#\)ߨ٧A3J.Mz?ф_Њ:,/NL aD2EߜAȐlӒ՞j/ўcfrT˔ؿ"{̂X{OϾ 3O\cɴǞ[ =9ϧg_~^N6 FWɗm8[&;#* ʫtdֈ*K>tz̙|0MekׄN[wSS\s o>JFFu9<9Y1ֻ1~ ՘hJIzw]&{т8 L3jhֻ>zO~F`ѱ1k}M=-]:" ËS/=ح~Mhҵg0 oo?ķ3'HVwg_2|包<~۪ڲJn֢h&%GdyE\ь6ǁ֦,vlQ3]՟j1\wڠr7yb']Wۋrʳau6Um}1ãV%eU"$u,Ž1؄mU"T+]EXzV*`IAiW{,sDy3HPzxvO39)7}Mw~yYD킰cњQ6kj-lahbltFHƲs$O`H=XO7F4Taw\2rn3ns rg뮶[o71O3:,;"w/YO{flvb2P9kz0fzc+ey̠?{dyqǩ|Wv4$K9!Ǒ/qFJ&[;0B3(k;DqjTd_{5K0YM΅eY3} qEzѳZT Nxednһ~lB[>5G(tdYA\e5;9wLkĒ']bԎS̃1nmgOzC[;إ֏w<6Wo K-zdg (,(I0DdD)zyc_ "ֈ,O-wjRזʾue$ǕZڄ#G W7'Z_/;c5E:^O%wKfɝ=uZqۭN5aɴ*s ө VkybQO}^()m, {0=͟oWW^<;bb^6~`ysdgm٦[<+ɉe+E䒉._[$]yf>ݫ#&}'6ٜP烙6yw\x &Nзn*=*}1ClLLM ɶygEh]=%SVz?g" ޵eтFE r7lb+pB`bެvo4i_Eɳ.x-p4}a* R}F%/ߧE)9EhZBZG2Q}ބ'gq"aJFψ+J i'ۺ"R̷ 䠌[}!x<‡?mm~mS3v)/8Zy~k$_[^L}HI]nSO}sMb؁&?~=Q/'&]PL^( EnXu4ӔACWZ&;c&ZjRӂ(gz{UEsjGxe堾Y%EsW*cyuAW|jG`~_3m[g|^!W/>\sJ m_c~)}BYcȴE&Ie|ZWk+YhyG y|GDTMmrKf0cת49go–L؛GF'U(yMfKu3'eqH|dyqY2eUe *:֭^s+UzRzmJ 4%M*Hy(&JyMX1?dj{c?҄.ZF+J >{Y 7xTԋ|IwڢG0<m_}jnAV&ۯuV^ I#N^KKgc*SEeKֽO&XTc,d]Rm|"rIQƕ+2)v<] s}"r1ˣ MăL\sj{ئzjd2Sܧs.,+vh<-;+zi&j/2b>"D8{fӄmw)m/H]6d`kWfy+fi79[pzt 땔6q/Zº";v;s>:u\2~TP2^gџ|2 "jbSM`"iǣ%"b3r ޳˖)_b5}5  E[mv YWj?q  $u黟 b}YY5oΓT_et큃9c1HW_KGOItWk׌]s{,D\}AǮG!4wF% d(l5kLfbX4ag8qc_ݴ(&V})#<EJ3R+,lKޮao/)YȎ#N'F sBo7鍞AA'2vS ǣybFMx&fLˑ]N tQ %Ѽ9Y2~CZ?1!;_'x>{>ʄ[E@1a\,}ʅzi2RD,A7;DͣW=Ye5gtUXPZ??}X}N$+/\Dih :؈#!iq~&y] ǑzL4:gEXFfWfQ# JsS}>()sO(9j NLVDYT/Wpgg-1>roj_QʶyǣDJFGzuQɪv_hkw'.9#pLYQK0Msb/L!߶/j^AU2^os.ݲ+#FIWAԸי΃˱Rd\D >X+ ևkEu-p|,D}WEd\o{EϔGޓ-;h'Ȼ|c фJ}׸cle"d.ȱWiݰhǜdY9c#^m3 l޿vjI&ڻg$Ǘ.Y푓1oEՑ][ByljYJN{k˓YCC/}>}W2i_6ٷ>ώAi&kFzMe4&׿al",ޣ~V6;kcSɴ]z_jE!MbsbJmiR,iIv~|)CٸhO*oۊFN<>SHQ;d[Gkg_`4OqmBksW s<h%2^/cRZ2D/ c6Ev{o#4_%~>y*g];>HWǞD#rO相˻?(3zǖdb2d컲\L\/S]M~|Dgt0Nk֖$wswTloo{UhJV~gOgN^sO$Z7 e-S":;ZT{}$š߇whOnD4FK|,qVD5gǼηfT*=v/TD{ޒ`m`etrϖ=3:3ujO3)Kɔsjadok YO9>7D# 'Vj5Q!PQB*3FT;>7`ge2*`c۩w(țY.dmf/M}<(kJz"~&v]CKZV}`~' )^|՛(2- 1Eq>oѴ3K gU':~ g-`2rpO7>f4N7~c*}Ҏ% ڌW/;yN{|[832~i /Dͣɼ:i+Z6B&BػYߓmɾbYL[==l;Kk,]y6vniۃON/wG.iGe6NRCL3g]w%uO =Z8~ ] T"&ygBb⩾V V1-q/)r k$]ՎW-sԜ!z~ʵcw`WczJVظV+XSׁUMԜEʨ3=)$[C譊qM3:XZQׄҙZEx;fCqadZ,}#W9D3/L=LpM5)~N|wImB'wf0}v\3ߝAzeMי\&kwǟAQd2@UGb"d ˼G#{ch.dz҄X L] ,ثM yn͑sk21չSR{sǃsL91lO5շL^fd"tV ֙Αwb+RwD[8!j$4gH\mSYQzyVQ16Aظ13ۑd%θ_x^OO1Iz)B/=;^zYѓیeHjrn?žyvղ#}duЄ]f^,cf!cMy~78cJeٚ>oD\'5Y|_wЄ'gהZwLV{y [g$sw׼Ed~}bCΈ#&,3XYDyzW=lw{O I%)oŮY`9E(,ӷ̌U vohj-pviٱQ%˟ݴ.L43!šs"YGEE̘KB*\c`?PՄ]k!y:tMgLl^~b"Co95=d4rM{ʙlJ4){OL{AD6#Rq\SZD~4a_ֹv~&4h%ߨAfD#[i̮?l_&f3f.ޏ=v@mU+qOEhߨgٱNek%$)R_`~{lXԶ[/Ͽ`5ʯ^^Tdeqg_wouQ~2[ 0+>"䏞jW6e6~_eKv~G<3>s啊EywWCyF o\D=33<IV+Է܍ H_`oĊ3ϊXErۍ:vIO}a_D>5ES&ӈ8_k'ƽ?NvWI ֎:Xm%2J)jyjKϫ"NqG^nWhxɮ5a=FhcwCI߽VfbXjq}Mq9ޤ%Lh *7OFdwV-{ e2v-LtNK?{ԜwK8ӣceiyNMY?پ{#ȷ7x^'dRkMy?&lkd+SdEfj}WMx?=ܟd}h2v䌯 L84$6NŵyfeoZ涎hcu]*ջ3ǕQQGGJt%3g88eDm*z]*nMX*_r eZμ?Dl5[)HwGhɼX žʆ4֘aKs#lkxnE-SCԙmdZeױ ;fir4nһ2gs)%cP}U+k'&??zINKG,̍,䶬Z2]++{dY=-iձvy>I4>Dz{NL&tqYb6acg$,Jٝ5_2=3n:)cGMhl4e]'V[eŸM>qxMt2=f5 Yɴ88vjfm'-w`K^wV#FӻY&Zh2Yboy|PFInɔ}VA9bT03-3MԲTu9[}j%ۮ}W_d񌱘 q-tSF,qZ3[86 FV5+匸^qo/_]-cW΢DFoԛS`ɪ{v^$YjN05bZnQ21^d{i둔ca=E5ZS|͉-W-lֈ׌~U㎜v&Z+*B ij\4cA!ZL+|g+jV-e *>Ȓ#wyj*ZX,;ó;"ę 6,Bώ4L/ch 0CԖ33_vzŚi(ss =˛L4}Iyy}{Uv.of)o" Rm}bL۠͹ k<[4_6gd*oI3 2Y,I52Hb-M3*cϰһ"}Ar+~ L0&>dI} NFɔQ3q1ⱁꞷ]_w2u,?L&S[>Q3(\HLZkz<\lOcud'o6==g)kvNM)d2[Nӫ>S9/W2qҳw '3_&j!.͓qY&ᴶIx ";ysz H_9`曈4F*"uM./I8Jv ֎ ;eP&6(B{ȺrFvdj0YXÊ&#}}F#5ϩWoaM̼"h]kL/}6Xu?ԟ[2VL(|d1'~Hݶ `w1eT{nNq})=C1w{- A1U)ZL:6uWJl}aqeoLf.A@*(}LU%[T2'sE߮i+YYExk@Z9zDԿi걪; d9vSMӯOLTOS2z҄wŕw(j[sQXZ^=i~Mlx`P26X#ޯ牖oUD ̫'FǸвiM\z(KQ_3u:Nj"SyH0gM$mś`d%mDv)my7-.x5L轍Js驎MD.cD[>eX^f$"v+K֕1*sN"2~m>ɯ!;Ki/wOHFCg覉[qdںhbwOC%VR&&3nʤ7(Mx.Vy^+&QM,Mהی_YE T2QѴ.ifgRAX>nɼW݊К) N"֑\I}l-wxCDn#Dnd{lFYϑZa蓆ǩb"L-~=v8'фk޸dJf1&J~Zj2Vxq>}ͬ,g^3*mijъU{FLL7^pMD@G zG*{&lZc?%q`=s{b&&NyWV_2`Z83Q>YUMdw LjM3֥'4 wWK+p<3Uì&4m}#Y֜|cSW#g%2m9e{o0V2",1Y;a!niMdiH'6ŌN7΄M8jW83WOqd;m%ݤe}FuJ׋V 81vU2TX%ĞE 2Vd3m%6$; 'Bd!'u9U2mfjsZgD (y5c2-\+ vy<{}$_AsSueIx}*щlG;j,H E7 BWR^ߙīZp3xidj5@z3fK.Nә7Q97z_-\{! v-+IE_ۤbM~_2e\lZ0X-&XWcؐ9 =kVCi۸;r+m{&,ˑ>\J=ѩ1=~v1XVkH[[p6ŖzSwcm@{? 1Z9Pf.߹59b_eWFҭ`jram"J' oh12ѡMȘ(IW-Y)̀"~-_4ٔfW%1x7Nv+D6;f׾*EҢ cE K[WVj-^ya;&1d]}|赫tE3z4W}X)_Tګd25K Xf4y Ħ,q휳{؏er"nM8O5u&ͩEV*>zׇOl;u~e/z+#&g"GKa>N~; Z0Yډma(}I?d>ǽlJe + z1 Mmh6OeiO}~12ZL%f5?*,w'㭆߫պEؘޟV=k;8_;=sޙTnc{[WU+ fh(YN_Bz#=.M9aimS[Sͫ%'OrOq5\\4ɲ5+ej7w2~mk&K{GN ޯ{fxp[R;xZGxE]9qiW.M*yTef؏],5;QqS0eN-‹L<7>3L*m F=5+k7yYt;XDL$aKˬ9㑚TD&;$M<׼l^SĚ8:nmɮl36r._gO>u‚QWhAqv{eoEXߔ5W^̢+RiqZ$"y&]\+͒c&?!Mz5g?RcOog?Rd4kDXu6jY]JPb5_5+EDԣxjžʬ Z/5;6vL-c$跉ZΌϜjR- $;.)+L JkZ]'_'dϵ68HoÎ̼M⮕,%CȇYMxA1քQ/2^ns$jK"]K>_&A]Noops^wRjxXXO?͠hg)wi&q94*cG>Izãɴ^P2myO3Eƺn?OɴmNqlc/4Q{f+M[1YuL!s B{?_vJ&zbZEO̻2{g F9G',v@'u[CAXkl52AٺgdLli<:[f?>gYXw6Us |8E%TV{dR{fR͊fʪk@2pd94~w&v!/~dٽ!КIWi{v[[m7[+5٪~Oy3p߼)qM.Uד3B9Zcv< $7S2WWNVhj"d>nO=ܽ>>XL{[+qbϱ!a5TJJzNYaMC|`Gg*No(7وoZ'kWgU5˖'\KӋ(8{2:^oc(6>X$LdJ'c&UWD}Ib-˂UF'V=܂^U2mԢf:7I07V+),HoFb4KK|)D̯ aY5sj4M6%]xKEq|v]Mح=e'jx0%-Sru[ԇbԚs^yϦBceUj=Xkgc}% l!IdScɴx&*:9WK&Nef7Fu}9A֕}VYCL;֮5jE+2VuZk9F!;5魴s6ɗqgɎbOk)\٪ЧSLw9/Z~eڭ>7N.y&MZ3Chw jKrEkro{3 a߭3h k_}>ɇkvO뱿slXsZ;{w9jr#2aG\H?26xd2,Hr"̜yTDAW;˴W[a?ՙׄeVT!EfMO4Z협'yճ"eGPڄP:n".f9YoK?AěOekbƝh +h[wUcY U)]-_=D)̫sEOEʊsX 8J-(}'zH&"!rD gD }F:=b}ҽތ-&~#g(xv.&Z&y]AFg%kAh2ϒqGc2vdJ~dP{/*-)s%wДSvtJ՜e$[Ư_g;2[=_4h^Ui;7WSSWz-eД_r^96d]%Rc$܎dJ55g&~ m7Yƃh~ʴ֓cAEjA1S9czW?NjD9K7q4рQ5H%8rd-5'7#h]qjv-̹ s􃈀eҽ>god#rkscs5Z=D}fz}h#D^ "$,hnM+ ۴[SfsVN p`}Sfyɼ_SϚiFZUu\LP{)UЭK&[og4lN~rQJ͘nr5+|; MшՓb(LslˊH#Ɏ ܟ^2m1fL"G "1z5Ť-[hflGXO^2QP_nNMxf4͈s.ڟ=~LM[7TZ1NE#JMX;R\)cp施k\:?ioclvۄZBh/vս7ϓ\mڝ$󖴙ڙ9{?9DlwZ6kb2'7 LN-GLl&L1/52NWD[jeapLEd{mo!"GXuOcs <4ʹ̣lE/^U;M&&k[RM`iawe|"Nc]}>Ӣd=WvZyž#Mĩdj5t3-[dYTg*4і&U:{mެiCrg%c{}kɴѕդE77f%IMuVN3r_ mowys{6$+>]zb4fQ޶ڹcyknr|lA~+[aӒGF8bJvt;‰1ݹ6.HWuwZ)v=ZLr%7~L-Lpq`QGZ:*&qH[=@- *٭ÿ 25'tMl5uAQ,\ b-2䃖)%m{|,FDe#%9 - tEd#tVIC*kǾE҇g/U/%cqs' jq'x+,|UŃt1ic9fx7iK;G (B^הL(Z"ʺO,Y,frd"Yl|dy:1LwϺJzIᚰb{F:Mcdo&"=|g}Iz >R󤚤wǝb]7eoanxgiRMD$q JM:;&0"Ӳ=MXB9zf}y5{3Nؑg.Z;B'a6[_ }3kdYGN;_iOҌحV%{}ũA"#EXܑ=;L64Ͳlb#l6坈d <3Evد]=%[?&;81n-$9C>y0_B&lҽ׼Ĵ>LVLD}M)3cC;,)v0LveAXWI)me5˦cdF{dǖQAu>L~Yy`a7 n.΅mh7[&waD WnɼrJse s;wQVcY~R,O- κЫ܍)H^$J?H|9Gl#AH+ɜQDl|ݙri~GDqAv\YW[IDpìU>ýOv%mR+W]&1OH46=&Vx{4QF4N{ȘRDN@)&FW nɎ*fSJ֯{P1L2y!Aacߴڳ>cʛ]oyr1M#qů΁y9nf-iV={kX1[\-9HPUdMjyOy}Lik&pɶCCje5۔|JdM<{\clelބ^Uޕe7W$I~KL"| 5F7$gPa;G=[(ob.fjf &W.93 nko ["[Ukh<&RY~Jގ+APz}кtn-[Ge}Dj)a]xh=P2g-v6>=TӦA7ElJdYLƖi=ʛ"w~'nhR}{wDn%y>Z+]Wlܻl~WfYuѲ$;e`jQ/}4Zuq{Ϲ ("tpGQ=D[,+xDTn_L0^wQʐ ʻf&h{h6qTk)ۮ׀37>/W}F|+7.E/^=LAw /y)$cAjlJ(IV+VM'yŶw.a$b$|,}iӶiO :vdoBGLj'G-'d4`N IU;=pZ>3KI7S]g( JY.2}'tThgGdJ1g]d𫽮 W+})UiM"9US{ `bOY7StjZWɋCgO힜lXay]ٿpd}"rj#wAY͖u:tx:q^3z_ŕɺ\3VREldt߃ Ǹ|&ދǃo*2ڋsd%_%Ž%ӳ8QOhRO}%`ތV~="r}kPX=^U+QANE.WEīOY t:eKdZ`fr:st', F"iBdA'w6Yd=~w+~b߲- Zz;6(dZwxyO?V:Iŧ-BSfj5Q ~;kK+7 ]a2gV=D_f5Fܚ?hd(cj[jg-[#5Bx˼ԗ6ᕱ:"ۇ'ڻȔG"7W+&v;)һG>D㈱eJ.W$cw7Hd4؛JFsq S}\DEG2FzTN@nJ*x_e}Jvr =HM&\r rE^o׶̳/іL#hL.TowvDxdw!_/u`M56Lo2JƧPhZWwcQ釲|SqGzh[%{!w {gHt2Aho8e,^r$ݦWdЦY{4тrǬ Z/cL"רqav-Ÿ2JhJ_fo&٥;?Ӕkըc2[ߜMD"*y$L vhR^Ax52efb߱se&,!odiԄ';NkwWQϿ<L?ZAlEўIz~0}$< όY㿞 .Y5]ه$ T8-H\kOO*<ިPϒm:H%y2Iv,hk2w~lP>˞oդ/R<9>c[=oVFX░LZ $E%;s@EhVZȽ%u}7L`gv1p;KTc'vʪZMꏲOg _h7mc<2z#EMy;oh'޾F^}m wWvQ,Y=竗NV4[d &Q65{]FUPĊϽl4w)֝j}T}dߘ[ w2%7o":z _t,^2-wגjv'7ߪwd{ =Zb_~#!w4ƙ%v:{$ͦѩM9AzsbEEO>AXOڇ&{b5BX2Y+K`>;fYl1~{Z{uX_6)4VLּ]lFHjf9dfωd|ueҤ M7XZc Q$uY٫#Jy$ɴ{F˙o."Bki glQ5%6yL=(s_)hsY[PU | pHFb"k~ߴ!Ԛ-jGd9w=~qx+F6Y&Z̝\ڈ'4鍬M_x] Oc&'}++<"+JqDԉdZ䓈zn160Ұ}SVLN7>6tvnwRxn[Կ·EmSdد'{ Ղf,ɴ^s ({n9lm=4临PjO_߆1s^eYW87;F#) Ah[wk'7+cdFj$+mʌH`_Cmjk%/:^zf,5FQ]oyO,vһ?n`1_C֒ez5g~xU*x춀ݚ蹿ܢyvGc# wn}"~*uEMX1yG;jSG%dle[:rN'hnLmYzL,l{MlnEh-| ߵw¦vt6Jp8u^;T*"m̒m}emKO.^,Y c%yE8!GFS ڛ8K׎-)=ol!$yһfc4kȢXU@J֛yF՚3 ꉻO$,l",2euQm?Óݾ{}%o3q'vHOtn5Qfk_W 5WL#2w\Ls[&}.*X~!iO֩5/Ͷ^xO6'የď򐂱=ИO=óµ3-S  l;<|: 7Vo1ZZp*Rۮ޷1Iw&C;7mg-!2~ӻ4d)6Hmcq {h2L[1{z,3R[OT͏j <~RsMܹZJc¾%ӻ>:I5Oɺuxe{ qZV*J=F<yk虯 KduR2$zQ{n#!fd"yXN*˖u?=_=5?uL˼sxI3S<Xglv5Q)o޶r Ro]ŎE# tlωn-=L ⍃dMˈȊ<FFT_ܴGeU/ ^[NUzS~bti^wMj\okgY (Y~rdc/fUkϻdl,,!jC9IM^y!rͮ bOrUMD _f@޾Vd(~A'EZ;^Z`dq`br=gx^!odbL26s<=޺*z8JY%}K&^5uc"`u5DPL]?>ӲIV,YLvs#jN϶vLYl[o2m,5?凕Ixi20c!_ZVOm Ѭ8oVجl@S{d1zO k=>KR?Q[h.χ$bwi6eVESO6^%WchؙL-|Bkzppg٧}tM=o6_se{Lͽ"BrMGov'綬ꁖ~[n9zFKP]z=7jgEEdL^jF Vk/9,`4v9- _N4acי Ɂx_/Qe{mnA;ڭ5g+J"NUm]&m!1F;D]gsr{gO3$v8HuX5*vڬ ʱrjWQ վ=sSclgg)=-/.Εl x^Ew&Z~g4zX$v"ye5y>zp|Io 9;L&+{lW{|e{4ʦ tz+ö^Od1 NDꖉuZO.+qf\blwDkrOweQ6h+J5"Ws$;v>=:c2v J18gZV_Lg]>8/C{y%},gmnɴw$c̾ƮabѲdj?;jS(ebJF{əiZWۦ]`ƢMxE0ڬ Mfoqj1Մ&H ]ߖGxRGxJ 3ydݧ_7N2r't+WQOk-Tkpe26ؑu$Ex͕Z'}g|N,gsҙE^A2=KsE^c|{ZYCo{*3Zpk3A0YN&̵f٨Ax@[GIhȹOb;$wo8Ճ\v,~{>+gm;dUdʃfeFc2<$u ^ })\tWnZ?΃l[4EwI)^H'}UYhY}}{uFVчֹx!SMnŠB#>Z$yUMh}{W&8 ,vLɏhf_'K&'ED#2dW%dDQ[umua?Oθ>Y{z19=>,YΩqwyyF "~t~ cCcVMV5i!]@X1X. }fGXAxt^M{r6{47Pi݊4qb)nbSD)p֮:"Y.}|&lIU4DM>%[=kV%͎*"z+iF/y!%H|܎bd+=&&Wj\Mn6:e}W^%j^ Yח??rt>u$$ͰsdݝM䲵65S4Hd0Q4ײݾNֶZn^YdX.̏lr61'D2l DoeV(#lL,LVF$|<}yAjrsyAA~V;d,19'tq_GæiVp{[ƶy@ߝkR-258%-P988MW*s-Hd)-Z=Xe˺"O2a9,V6]k-H. gmLj$2߲v]iYvVFQv~ZRk8or:"{3~,^ܯI*oN$eZ12SD9KB7gE%T|)-E(~hS֛[qNe*}g qjš?*-9D* :uu[ۥk֮%SۿTEͺ7ޣoCn"_˓yk79 mzLG.Z&|yGMw,rQdznϴe}ч"QcR̻>cn[Ev֮~_# ߣZQzoI8|_k$G)ydL}9g=xu}&4wTYhEhG'M_|ވݵ}nRҌ{2^OE[%m>$?گO.y&]= Zƻmgڲ]k7^nXnAhfBHl)kvv[-cnM8-~ݒܓ%ʻ!S+ۧ)R})Cg%sKbo${X*%"Zl[͔. VyNzy27kɣ>G&)ӟ񾃱_[ΩuX='-F[>wyx=u_}E,(8;2cufY5PYMdi#'*j(4v쾿,=_2W=2W'W_D.LJUtE{H~J׶L[ZyLu06oěIhRjFM#˽y0O ;2Mt& lIگ=mݞpe{"cr0\{>-Ut=8[MJF'+ۤ)<r,=| fkgY{щ/&SZ3rG>ȅ).oֳcmxgh h{d|VW^c(ll]bÿMhdȲˁLu&WǴ2 %Z Q2oRL?8mTaO,dj;T_Lnw}JV< dW_9d;~gnB>='% .CLudQ%#~j>26Li}՛2KW{}A5H5| mů O,SD5D9ܵl`$iN 2MK;5%׻dk_q=Y2v7 zg\/і֯IһζbI__D&Iwݣ&z>+f,̖V{'dۼ&*XcL-4QmEZѪ],gy2<_哮Y֚,« V_ޛO]Ќ_l;bf5v5-'1z$SڱͧƟfI?}^m)EE^#gZ&2j\EE*jA"~0;aXkR-YgEz2<ѤrfUʖ}칇+`j?8t5t_d rկ?rՙgUKMԊ;WMF(7mvveitfJ2]}A9㯉~~#J~q~#:׭{8#vISshAD[?I%8# B2/)fۛy?fVk-s`%i~Q:0FĒo^O8R3iOۺd@j!r>Z& V\Q#}rtZ0H|2WyyXW}8x?O'c/.ؿPu?kJ?tk]#HX{D+^w)?m;rY͝\H=93,oeWzח zLW ˊzD}Ӻߺ9z*{L}e4;& zgG^W{q SwJ O^aOnx ,woͫ4ֈ#-ȎŢ_ѫ\Ю#la>759)}'{"5W*cM皧TGNԢELP綘mj0ZԶyUPzM-Mo3L<+)ZH g7١mo0E~>LyX bx)3*›{W2z]r͛(rAF=^6[X&4aCZc"hA<e[h[As-_:5لWc0OJM㝃uR"6˜=w߲W^t:ѵg`r[o JqSZ= P4et>l`4P =ۧ)7Ie`|5'MwjY~|fd>y*/'6e vܗL=W1gϣ+7k\2}gEvU*^|',b>&%)j0[e\y0i~0=/mcη`d̙}̣ycs^(wDfTFy03g'\Զge5b1jF{*ч%S{[66w 39cd";<Vi}ۮJ&W}4}84{>"[~LKy'|VGNJCeQ_Ow}Ik߿i]}AN_oi]OtkuA˴e5d?E49+~pi=ix2Z1Le=~S]O-ܭʼ䌼:a%vQ%l/.9[0(Wnԯdho}2$J9@] xƓ+"GF,?hsTf07[{$#;'VF^BDpE)+zXw^^=&|chhO%7mS7^΂xo;Y֕oܙD7s뙎2 J_׭I-{zdy05ys2\EWe#۳5dz*,kDy|e2L E#H|}K/ބ5I]?fxJN.! .+dG{icF=/%U=zC_< R2+,APJ"Y~eh̒M^e7Ko76AXDEF;>]Td4繤ܲ|o.XVS$kz?G7bbɺkL[N o5"=_kKl˴-ÖZY,֥SنӢiH]Mz>KӮl}ծDz< j {_Ŋ55RQrk/j>.TE\ؒlwS֦o7KU%>mq>QVur8(gW>L=Mڠ M1GtSf}аV&mN,;c_&.]W})D%sf[n 8V}lO읱Nn߃hWG [Vd$U}^JԿ^kV_JOn/.uѴs_2oF陾cX9(Z[y]MĄ#"W#O%4a?DK9͖ҞdUW_1郏Ai*Y9CHΫ=3^m䭋^HD;}_C/cK;O3t+=hX瑶֩")}+rL?T4Qƾd)dl<&޳}Ғue]҂ݼ#Hɸ}dZj- ZpUF1 YOAJrĂ ߿%[7G~*!*YWϲ%cyz^~rjOhΎ -~^rd}#]F1M{t]Z;9tkջ f}>V M9xxLuJgʧmz_4kdϷ?iגܪ)5{iiC>hxKM\ڟ얍uߡ%h Z .m@{[_I}q [zb|V۲~fWMԚ۝꬈>>o=;g;hGeʲ&M,c ^_>[0>r\P>o˫mUv{bpwo].9wD_V[h H_# /y^G-Bk˚":/2ahEn5\`21{fm7aߗ7h |zn\o ٻJ,`JWH=HϷ5X^Q,>/w²oU%qhZ43y9u׹D wxe7?8Hm~GyS i#M M1F@*ҝj"*z[cz{4>'P2ޓZS=^喬;2'l2XH୓$_z49PoJ]_b e | W9xWK:6L \=6LKz{!(N 4*Gٕ瘌ǭ5:$U1᷼+åYRo1&,¾6he|# bho_gGȺ6CT`Z2с"=l&OO_y{nAtȄWp$Q szj6;~leH|.-}Xe^rz\#Z'E?6XfKowz/Mh5`oV#m +LZ#^2.} '6!=ﲮ52dfzvsy=Q6}:/O8Vw5qSަezF3JoYWV\ L~կKh3RHgfx6cMg b5Fn25wTD)"^.3_טE2zK&Zg)DI피dzq-9K| xGemLR})o2G&LYiCOl="t%3/)dUe7_|[qT=v"We[&ZxV-Y!C`'"ի8:Ժ{Y<AP5?'+wI3kik/MqAF^{չ#z:bssBI.GhY=.߫^V] ⯎B3idr=^+g6Y<ʚ=U{=7ߣ-Z8b'XUž#:x .Jqe#:Ąu9yW>x޷-﵄ܝh#?DdEʲ 7=Q&0my{ebDa{FWVM/>DC&ҟ%z$RH-ڑsDQ--G#'_E$7L y<+N~TGa˭i;d3]$ (wj&Ge;Kt{NF:d~zX8Ye(%UKEvZRȤ2R̊^S:(ڷnY fg3|s\uv`W:d]Y8>&E=Y'w7ʴ ]U*HW1O6*U'{7*.E\FuL#IWӖY֕>ON+Hd֞~M98׉|>tky|fmѤ흹xF`K5j'V>x2mg1IW n>g/}YεA߫?r.|׀~m.??z&xu_g|/i:2#YWB|=aX!h]z~кzxKa~=XE&/~`!۔/UQ2Izwmwo^֪sv: }FzfɺRDyr;U:ߩz=1A{Z pmD ❳uMݗJQ^li=|VhU۴]g\oDxemtzβvN WEV0JKƒf~hV{ҫEzYϷu ѓ-?f R]Md}Gm,H?6Xߗ{{?Cƍ]:u]ji/ëwYshćj_v:mEeɴs`#zAsOQރ Mjkk5(2%i;n -w05b0OPkPɔ'Qګd\S$}RS-F;3XzKܞԲ}QrAz7J \QAvp{kyZT >[}L`[] '( KQGԽ׽SvW2}1:߿fu=ZS%GQ FN3mud5Q2 0s#k'{uhX31h'G $gg, |F-zٚYfѩU ~F =nDzA,,k}XWl˺]Qb>˫hs OA[\ BָK"}#Ʌ9Pzӣdq|5a'?'~VL ]?X~܂T*K O>4#.V},W̧cdp>> }SK5aUsLLFg?m ˴h߃~;X~bk7ͥDDzF {`{O\IkLQiQdO7[Yd¨6VJ+<&3|:fIYWY1yxIG* շ7w9c%c]u}։Ln k(FcI྽%H WJZǚɱg;YVrV$7:^LWSƯq0h~rg÷y Qɫ4`oDVI|֚2nzsN,oFYMLF] 7Y_;J+Ͻe;OzZzE Z̰, xޤ򻍵ϳKxm[YoMx)3#~yeh-VJ9u`,W~.*fZ]gK&b%db0cla<61كvYѦMmAnykÕZ+wzlfFUWg9M JBLee?jfL}6"RSVQKf$ON}?//K~v,Y%],I>t"KHy:̷[QԄJ]4B3&SyMjG ~Z ZW?+qshDx {mϘZz.F$HO3 H֙`bmXi+"p/g>OcDwǎl&їnq돸fߜ D+K%BQ#mJVz굲P/b5G 5Q&Aՙ-ɞ } Ĥb܄g1sdTZj^тtuԯ\Go/GlWNE%k OR~e,0ZPڮ&sGM~dٙ1Aόsz0m{:?_XAXzV5;21̼,q[!cؾGn^5BG81|L6Vl!?1cTKΒM߬ʮ(mEL5lX@M֕5ֳӳN%cn۽ ^TJτ_vV6^0zlS:Whin Esv[vb&Zj[Ec.==  tE§zZ=Z~YXvo;-m`$c2Gh >[x/ld4uk̒Qcwh:-)G:X̝ jw "v>be޹S2m(Inomy%{ +FSKq0==#oLg{߹F=Xߣu|v"7ޫHU{y !h.i&cInGt>s%qPٜ&-=o{<ָ"c ]N9کS,7VK k?C8WjX(%j%io ):S?g>y[wL ܂W-m#,SG9F#.A+_ԡ-m{Yk3}|B*[aȒXs/dx3`0z_vQyaM[=n m=_^sݤ&|\;d-zs_eԉf;"+`D!&O k 7_h!ԃ(90=4219:ۋۚc?XNZY7sdߟ{yQv1 +"҃͌:%sr/'8Q}Kv[9}H,Az³AVS2vo;X-zn*9 f!gj J|E/lO%S=QJ`ϱ z\?vl7zTs-33/qAйW`>\Gr'侟e﹎-vdyml}VuLϴfzؤXjY%zfY]nvnH1oG҄;^p[g}sBQNjoun-"%]f쟩}XJq?n紌)dy]ZdcP2J&ʐ)R>A|IjǰTu.ɣ2]ݴmdouZA˶ZSKFKQAOX ~Ahox < ܫ[ zo P|rwРWٽu[zqogŕsm W).z]$AxNfK֕(s{zoG2_B\QzN!$_GQin{k6db"VY;#-Y̦۷mg8\{: _lfC-h(u;՜E.f雜a u7j:d}w# Jf;.?ٖ Ieǟ%SWgr$ u[{LOP~˜%${Rm7YS |b?JӣK dtdf6-蛁'ci%5A:F`ҙ<޳lzWߢY Bo?}hȌm퓑tř3ARRm\׏n@ EeiwkA*|G-,1_gAeg -%mGJ]f#6v,nPOw&VnkV^5D-7kKR9_iSaD \z⍂(M!xQ:d~wE_Bwd3RW9uMG]kE aqW؜ }LzIW_X^Eh'rۡYڎeY#[t^M }h}~zgM^Qzo4Q6YJhoŽ1k_[%rPnyMz;z;FN s?\2&m㏝J-\<WO(ߴ ȣd*>Y81q;1AxT=y>?f%j3:eMO5WXws<&G~(=PYdY"}9Nj8o:drn8j佽<|̶hD4&(v,Si˂zs<+H^wx?Y=G93=2g}Cة/ّ^e5&[KR=c1Ȯ~mJk& 9njyQҨG{n9t4QwF=ߟt͡:@{ :]]QOA X׼u{}EXc%{}mpVbٝcy[p:SSWt=*/?(yBtu>DWJ=5\jYuEXvU/*A8vd9} zM/ڢqAmQ>ۼv얦M݂ٕlK%ac㺍wܫku1ܚdN,yɆX vlG ъe,{ {ο"ftG+*}O+R:[g=U2tź\qUCM-5q0z?w "d"bs=G^=y8[դ};I(k':2ZHJ2Ǜ?cp̱-231ʌ =Ҷ7)^g=5t}ڿ7 «~1EtWyM؎@ZG};Lڒ飹z+=m"h6i [|"zaM=fR2>f 7&ꫵq ׯ|`lHth`9 ev]eM<Дwossqy(\h*iiZ6au.X6yYQz}+7Nia.2(qq{UAY~"iJ,{_sm:D&$' 3!f>o'*8H~כ)J7r*';kQk"NpgQz`[x`v̨b sA>q;?&H~ZuqM/|"x |~\G? Z ӲxD;vM5ۋvĚLwkP/ƒ<n:sAXڞq`5=dzZkj9M*Q[I$㺏vyA{ٸVR_W+uyq6C3)8+ T2<=#y8ޓ'^g)Y%c!n>17{}F͛VF+?72V?ǕnĆ&RsMh8> O\=$=Sd6ށQ(y2,K[Xt&-4YQd ?O>)mVcVӪ恶u}4]®y46gj 4+5]}3hc0!\+˛ad0k&>R7O*JFi{Jy,c’,,㕻K+Z=9kq.U1;Iq[Ϛ=l6{?YwՏY9[`8 ]kTG?d޻ǰK&Upmg41+(g6v~̱mWiВi÷1> jȘ'і _=OS2H5'oq^sVB.2=yZB2^"_~^f2Jd;2kALkLÎSoZT2=#<#=g}8ݘkVs7O>wv@ ${,qxG98d{3S{#ϨTTddiDELj=T2|fن.YW)}Wu?_OB[]OONoة[;ȞvEYr6WZk$~X1ζog[8[Mč5d4s.=F+U-#IL-ΣcG;SFee fOZ K~gYT$5Y_%]D~a%SkǨ[6{nc#-X6U_[J5~~>s-xJ+Jk4oۨH2s>|Dž>YTYėq7W2fD%"b>ád1N6}LNs DZOIF}i>a;,X/U\n)msK}3mt>銖~ʓ0(3'7Vgyi n=|Iws83gw.9#4*z㖡tkV)jR9x'$uϻih&4lEx9V҃Vy|-~kh- ^dNRլ3z TW~ᕮuiUWSӥ,'?L-d?mՃT7xv{ȔnF6M{~k=BZz* bwE^d= W#Ws2ȱ֏˄U .3Ac~ Vnh›{V26$Oh=Esz^Y5Ӧ=n21{L,-=H殖no";K_h -j4|3`&!Hm|*+!&b筑ϷWkv-EuJ*ƌy"5*XY)MDg\|n<"d3$bzW=AjjM;8Hmrtq&tb{6%-kĭ![}cM72α +޶am'3>%sV")# 34`6(|fy-O X{R{{/?w<+{3 8wkr={f>ދ࡫چw68s{>ݞKDr -=@$f蛈fy ƻ3\K$oydؑ3V|dwM?>rv̭."|Fo9oM=VMkS2Ch;ë<{c%?Kc;cW_5@,Q 데BAW@u;4cjgd>3^^,ؿJ5Y|l*Z_ф/e6_7u&Uㄓ=t@jFzdpgЗDc.GjUߚ䥬d$RR{: ^a֓@Wj JdeM*wF ³Xx:+YoKMed2rnLj9s֞}!N8-v]mǦU;s}r9SQA~rjϗE [+L1Z}]:d,`J͏K{6jձfPWlWxFOr; Ϋ 龦VM¾u5V^7?6;9;N̝x |Dt矫EJ^e]QL֚=M*mm# (ruAh LS*Bh9Ƹ98VoûϞ5ɹc&;^Sowc_d/ct\ o5:hG la0}}Hg!MWZKFD.au/( t'e,%S(۾όw.Yncm` kuofN%GUn dƪ] Jn-7D3.F*]|ejՃ&k;?oɳą7=V8k:YQAKt}rB{LQ-G,^L!zsΌYhƼjsv9;3riM {6Z^-Y)%GM{̿",ޭ^-Q%4n9KQuڳr%O~ q_MRg5a~~UOsҋt'* &~A*3w?visDŽx}y{lOiCNk kV^:3mLVW;%>IP[({?Ǭ_lcX9cϷ?X߃꼻";XV)f=fv{VnqciK}?~ M@Ƭ+0z1 4sgT,K>:3o(bɎJ3l\5~qq]S*캂(G" %+piD 4 }sfgϹb{,Kwقfݳw.n!V`KAʾl7?}ZɎ,' ~S_MxBW͏mW9&2XoǙLM'<6gy< YrA%go=|x|M\|=z }MŰ{ ђqdj zxjuDפoŲ MarߎZ U M\DZ q{2{+NI35kD WZ7rF ^~w#;fwz~e5X@ to3{5of۷)YW^S?ud,C}=Rmߢ-"[-V|݃Цi|cZ zܯx0:D bD( lv/UzvKc%\hJZg_/˒o)聯j%}kjqR%SV%L=1x M!76|w j3Hsjv'nBv@Ɋ94j4doFAغF?գ:YwA{e5V$'JI櫓[&{?5׫9~ߘ:ԓKV:.RzW<-gk<-GÒ7!L;;ћ_dɵK(;[n~e5=^"|fVd{V;dCVY}vnZκ.t'=^&]?w"mJQ]Ш׭ ѲOOy0!HwDN뷸;_Ln_uݿ_PٟC3$b9g  dz#[uq_ߩ7Q%~xm#&sYmͼӰSMK痬+Wd֤:[ߚeuC0_ #2Jx<ƒJɺYxre;mqBQj+ h(&i@#f'c7 a"B~޲OgϔL;ui˸6aNi|:vҶd,;4x>& 5vkl{2'/('UӃ1ڗݓiuӤv|I-o5*hʃ0I~χә%ϵ˶R!I7Z ju  \~Yפq=5jE[Χ+ɒ$qWijy8T@_Y#&$:qќ74G` R1l݈zo̐ l'^oDz;UIn"_5C:rs5+P|` 2yĎ?kYNၨ3-oݺhrk[45TOlf+v5B݈lӮ3KQhxh2l%t4c{lw^4$N(ߏe!ry&i,j =%knB# 灲hlGΘcjȕ)L"z֫!򠪗aH7zF|/H#ӊ{Ό/o4Ӏ\%$qqQcGex#z8l7rcWiDK#;yrWă&GNcՕ'G^z~֜cF{ tIx܉!o`cF1j\$eSEsܟiv̢Ǜak 6!4-7^jTՊg@UfAti)qԨ*07 ,V#٬\)ZJZB\^lsUHE2?k젔ٰECZ-0c8Ƥ6Xc3~]W8p}[֌#HtWEWbhDLvT E+ ~˚kҴ3 }nC)%V~fLZZ9œi9mESx/Cje6P(. VsNs޲F1IBוzc9B>9x. Lcx PfLʪvߏ1ębD[Lٯ([M.uVtGR+ӲLs/ɐ %84%$; ӢrEx.6dq1ES&c|v-,:tY,v &29hZg߻]hl=7蹱* u6d, 稓vҲ8F93:m6R;~fr8N:w!1iCmP5suGø3"{!M=4x!z=5Vkh)[\Nc.1,FfTߏFuM.v`iim*;e>us2?;1󱣧A^>f:&#g޶sh#澻!)2"= R_*qeu`J|(81dۖbѼ6:5|!t1Z!XQ$}AK[4uBa0ئD% P;J6Lxe!d{kCtqbj#3!Zw) 9h?n5KxbXַ4¯腫n#⵮ 7_"afM)UTIQ(~]O*3I}?t!|kܦސ[M'ȿ}ߊzX,DM=BiTU4(?%V ޛE_/#{ 6E?( sg i^;֒rޏmD?U9&/Xh1Vv=}>h!?eYVh2SOx{!pK8oHx}MѴ:P4dcWAU 8R ieQOL׮1Dzke;kyQ۴ ᯂC 70σ*!FM$4~}3lpJwXLLWi!,T\O*>^ _ym;cbv!*':H7òaYHeQX*hrk1CaF=lH>(E; Qο˿x!Z֢iջd1z]M-dr>mL2`UW$d?6`?zY(G7u9ϔWNدI] z.2g/edߒ7Bx^rK:ޢhɟoѐy~KD8Eh Ciqd~>gQOm$h{qTnDK̫9 q| ^{Cx+ e[?JcՑ9ڑ)#7\)ΧhxF(k@hcW1SoԦ}&5~]fXvU=0eߺ$Y1  EvL{Π=G'gdmB|^w*rm`EVXyxĴBSYϴE`-L! ўlTCx_U#ӈsX"ʦiĵ;>Ec>)mDtpiS)2?>\ڽkyDw|aԤ=_9UDsE?Zq4ǜidSQ;󑟻ǭhj娫ӺA6׈? )hmԞ 5B`~AIMӷLUV}As**:x}و1Cw휲9SוKt)sW+W1ԅL|T{iԒ)ZbVV[*Vao)!#y({Co$͢$ӄF[gt2:ӓ(#ϝDC q}X3N 瀦0_ҹq %*$rhbĈ Q 3*Cr=~tuHv#^oD/R_#jNtc,1m{x54:B}:(ާJC>Y!dIJN'SH4CxwWC.2oy[$?'SB!vGiu2!~'(D˪oEӆͽ仓Ӣi_ȟ Lҕ?F|:AB1{V&gW8G맋ƝwvLI=BX)ډ*į:>C\Ŝ* ss"JbjV!Z"{g">-Q4-{c4dz󕝊pyES+@0m̮,uۮ|OX8COkG6^C1U2;(<6eޞڸjwg" Y;4am5pD7c~Fo964ޚeAcsX8sZ!c洢y׆ho6GlW9+MiDkϴ1Dù :Ҕ OZ֦!$NCGBlCqjXP+2 S+_u1h L=D#ڶh:vn1Nrw^c _U1Tbzkv] qĐpf\`ׅGC:kJ"(?fC`ZZ`Thڲ63n _8Evfhp֦"! ~AC}CC~cu;&`##n&\]pu!| +w^-&'%4 Wis?:0-Ԩͥ!j7VB`\۹B0^gtnDiu7ţm'ȕa!= Gzpǵ[B>hx , C{YӈpJ!,\)qiHdʜή o٢iwM9ƎĞ7*k7Ձ)#O # O{.1u8:da;G n꽤c";9E~fhQU VY_l qQn(Dߣ_\{]8R:X( 0s|k2hk722Eb}#TQRUكOT%5uF9rL?Vh[7Vo|FUHֽcY]6ʆp Qz\>'׵O,~ۊ3 Q70D;Վ));Kw:a}vEsVg@r5sm ̐,JcH6ۢ cy$<{j;BSau([UxhnK1IF\whw¿,dr][˖ΌnQg]8;yGC3_4φ0N=Zw*UC\m·K[~ ~rT6MםWi9z%!e]&G۩0FvddX+Tq_Yz|I[U2L8-sLu>H{DRmƁ8:A)5Y2 M(\jCw缥kԦVCQ+-D*qCOQ8%o+]uɩs1hESl& q {/ZC2 >lgT툺/2AN#"{tX[q]n56W AnUgZ{ۅ0 0S,1Pft zWDrp9o(,KƢq&?y >Sko֛8̼Z/-n7`ÓZ|,.'9b)}]~ǔ4Q/وWmZc$Li-^l)E;o)wջ`Tv}ْ KUaQkd<>uw8E̻\e{=hZ^io -P_k.hyPj7LnXAlPzF&ՈL5"M孩2@{OQ}Gh~D!Jt] ?]L%'MmН73G$}ʸTtVqW_YnocH9=,u\=&*=ef9&͌*FU˰iPXnt:} QRj˱k@D#\3~Y@8Չ2Z=^Y*EӪ]l ђ鄀51 jkjgmWcM6^J:p̼ϻ߲N_sucJfkߣ}m.hǴ!q᩼wf<0C}Uo\M<#n?>QMr+HOfΙCsA;~L2\BEʫ,2 l7t03xtO3%^#jֈ}KЕ:د}okk}w9s`̯qL+uY4uf_.W Q&I]EzcFL"'yP-4\ckIy"\!\Sª*0ٴ|ɞ+Ε*027+41܉ ^nVd8j5D+"X*qkuyӈ-MT4}Lo\svvۡ==M` e5Bo5"I(*dCYK/ l t3hȾnZz΃?{9hL+\єP{IwDI19[ܓ/=KGD`1ʍLp̯S *e)*ZD khZ=EYcgin1+ęSqi`Eu95")LJ!鍔qӹXUȘ3E5C\k)ݚkJ~Wv1K8.L8ʊ+D>mKe!| 8D4Qi93mi18lm)]4ݹhc<_!f8ձJMX]ӈ\su.%/ҁvw}GŐxuєZ6|˷P q3'!ۡ6K--ǩ*tʥ)O1FV0(ǯ)זͮ<[+/5NLJͰ~Gvծphj#*auz=;B䂰gִg*]isӞԡ1^!,~4Fm-_Z6kC1j_M>5Lyֲ!ʂ>Ӱhyk%%ffG8z(I#Ug݈S޶6 Qdut`pΕk!0u`cX%J*hF+'09-BX0r{mG+?^__ 7k!44΍WES7Q4u!$s8AOyCW+OMH8,z'% CYc]c#J)xKJwoW~9[M]%KT?=g2bG>RromL\p%v̑}#|VY(vӒ( ,M^}nrO:0m;E(VmZ"aeE~O ^uo9aHC tl0 F~;{*w{x,T4mܐO2DMu)8!|ԳYGnōEճ3 ڌ9իҰi>m:fQ4xm>0=5͟KOC㛺H#:360G"yƠ}0(W\oʜ¾u~J)Dǽ3C\^h|yڝ =;8b&cEׯ.?8!|MT]SsyX;.Nv5_x7ګ[H, y\ZvEk qfVFW4]z]S4#EUawvL!~%φϭN>FЊ(xCeo!٦yՍi-\CΝY4<Ѝ=}~`\bHH X†9[4z A^ q(1uXe;wן9> w/(FfVeFnfUpUA=g˰""o;Ezlz]h6y(ќuwyAC:˳eN (mYh+GC@#ʡ؋n='i+/bJYCbnM7:V!Z||h1l}n7$[24f`pԇõ_'=:su<0Ov'mVE~'HZh~2mlhD=GMs+sFW#Uۆ8rkZ{6$+1!^\4s8aGtNj#j HWlL)ӟYi΂/ A!|] <o'>W"_d'XyJ)iS;RZ{ёFIТŏS;:\ʪO*2Dۯ=آc-q5KrIw=5%[`|tu1iKKVrD>[WC)7 .=C>*"O=LClј 8ǔ#i Cc#8F>$lB͸< yIѴl_5R6 |cgyy;08VՖG6,FqgwmEuөtjdY$-UǷwL:keV;3ԲicJ]7dc|ʽ=G#row| q~CuDFaՁ(ʻWıaLKi8Y ~&P~8\]lRsj"uEZlw-5F'OYymׯxlC\}g!4µ,v:iv!mCcbWXd 7ՙCOze7B+=;k\49IW)+fԙjȟhDO]ǒ&*7)߻Y:v{UNRC)Ovs3yj˔vK+;$pףTESâ'M&Skft5@{'|ߴxw!Jq(eBVcJ@;CT4SW{&]^+SxSCizшt),B\C+V!@o`ZDiuCATi`IkGr6;>X#),Dڭ=C\uCacGfq>>1r_ zҩ>\er||&a6)=,etgC)8qԈVh|f6FW_zC +D2SYSL5?49⼌=3 i)z)Hk4"Cǯף474f*0$UCaVt13Dr|˾qSz{䘢%fVl- a#6ơh]Y/ 0 C~&2D5;_1rtћ#xvɭVOEF"iթ01khN\XRG`:C^ϾȭiD/g,3#N6Q#ڬQl\Z4d?Akj<2]M5d(87ќ16kuE3X]isHoi#nUV^EN Lj;U}DеK L;2SG&F|aZjPUW ᫖,Cnֆpc}ꧾSIg&NmnY zG/ƳtF 74j? = ׳WEUQ{OzFyIs7xǼ6Q^! UŵK_a3k:6|q&}C3-iCeO#z{\X\\h|YF_'%VL!X|M#!BƸֽً^!q7vS:5y?9!3`73D_.ĕKͧc\6xm2ќ=9o3$9j%3: j34*CXW˶)vLhd\ξX?dѸqWBጦ.\wmDmBZ`Ǵv.[Q8H}Z+ :F񴵰^߭hcL4zhF>cs;Aj6qo< TfGz#zGqZݩWU})Y]V3ZB1Zz8!XћzS~S5yǜ uZlU]}5N̴+H*1R{͆mŞTEcm(}̦!ZXY{ZY+Gm `hrk+2a.P{$9͋{׆hz,sR1n߹sє0^i#jQϝ{m,Fu]GUV Fn7<_=ߛz ѩ3}ݴoãN0s81u>Khi F7+A1Vqղ QvVO] F%УZrS`J5Q\-e꠴(}Si2Pt19g3F_6K[1l+NҮ\_ Ó8]Uh/|  ?sDNiNh[ty=6$+J1WQ=6۱ qT+1)DΌ/!{`ᄉ]4;r8=Y4!sI]O 7zϰ15gᅳD2DYr#=j)nߧߧ}C=] yxLC]ukeS$j#Q[4~aGh&}l Ѝ5VrGRhŞgF|WwQFxcA4z09Se)\!\R4|hrcI_]Sv3fS#j4eK30yl2C}KF!1z&{ȥ󑵔:[hߺ4SOO_z@8V''+zy[ح=~k#O <'-EMT3 aNK}B^I5j8h%(VB!BtiD-=0ތr "露n@|!zzE׻#2*t";^hj۽EÐROnDM3?etD-U#j!ew4|n>n^+izD=WE;y̖,L F^m q}^%!Fڷy|-nifH榹<,i7a5Y,^o+o*pLmm" /J\@OgvQ4-|1j}D,jU~?1f)IY^w%Yz63@1&CZyTߢFZ5TD2i5^c713 q:hZCߩ6Dyfw晱]bCү0D1M=i>15.e7op]}d 9TU3tg!rlVƈhє~=vqwh-cvZ^~N O53Wu9J:M]Ve{5@o#CՎ?G*0V sɢeiƝ⾤!J^5"sMK0+Eȕ5|æ~ԁeOռN]%!zF3;5jS7M냻bՈUvm9L$♙dMtjD+O6e\,+|עNz80x2E=7״|jôģ6We=yGxLR5z) a5PVȚ LI9`wq2@ƨ+[_nXu{ņ0}nX%:UqoSFV禔P|'r,8ޙ0r ]6"w&8&IE˦k+go{6uDohG\?nAq} dCx+,niDnrƼ]c.㭪cx6{siZ=kIkӾ1HE{igiEKWPi|e@dƖγl!J~83lU4Ffχ39R&=wLRhmF s=mX8S ˵39 q~dѐcB{M)ܙE Q϶GQ4})Xmr(ZQԌqUYo5jc6u }PN5Sm\yWVeBiǨm?I6GSDl=m*)yIOJUb㹋mSnۼ]wj^kw]:+h{]J'& _Lc[ǴW,D7͝;Qʽv {gVK4寯c컮=L-FGFNN' Uꜿ _zD',w}=}VCh5D:Vf%R˅)W6ved4C>6.tOg )v<>hY%8V%OUe6ibQ4x7*2634k?p=YQd;Qk.Sbj`sXؽ9!JLAbVUXQ?!d!iΞC |)Ͼ% bijUKYE8[#J%T4[K מQ' ^#_I@4WCє]eݧZk7D-wcݘm>ۆFѽgN0a yMv L>Y<!QѲ@݁!̋N Wc227$}۾6eNcD4$[Stlܧ6(>Skd6[TmllD QG>uϢ)yij_7ȂqlV;ш/ 65.ё|/ۺX;uKģU]]Zo>tFcSc>: NKt KTl?ʑպzjCC!UQOlg ɮi=!ᓈ]Er/$0ߗ0*3}ˑmN{zhArhl}GwaC|bƶ{,bgˮ}ğ?(cFb:1/gʐ {frȡGS}ҝen|iJ: w.}]Q& QF|)0WEk߫}$}aZmDm1u/C퓆[2zӽq|Dr-Z"LuBؽܻlcxwLݨc!Ϡ!p֛30Li NͲcǿ {&@h6C6jٕ wU= ]qT7Flt}u\F, 5c֗s _RlhHBj5WS̴F{en#nH^\T4g:vߔX\Ԭ:x\H2%ӔZ5+mGlĻn.Q2&w;Nh'(r҈29|Q.EFԪta'ZE]XU^{Íd_56b6Cꝴ#v㪆( XwΏv[p#ꍔO^h3/]D#<[UΊ:Fӯ }[$ FHEIWmza9ۈ-~j&/X+pd!`wA(_1G DjʯpL=y(9sކ8sngǷl]gak?e<ˆ'Gh]S}/X!hXDmđѾ5Fe9"vنh2b[ɏ}!Z=jso3_9|IͬBz9k+4+jW?QbHVktahyYwetEќ;f$zDOYCQr-\vn=tsO7Ǒe _'1 _'/uV#0^4fXzsqVμcc1<'rbګX+c"ҩjYWZE뱛. kyP>b`lc%'_ĺʈpLm9p`pz\Gs=TJGp\žX&{J!J8'm7J\ _ϯ E+0$֮5_u\cQLƳ~W?o?.葛vvXg8B"w˯j=wǚ5H=1^W7%8{tu!.c^S5vM?fhN?L}e}F+s:ڊϊw=3DS{8(9C3,OF'xu9[ic>K%K_Vej7Do=gCOoZ(Bg_X#|'sE-Ǯӎ+ fOfQȭF.c 2.ozim5EӖZRC}l ᫎKE+z?Jdjl@>qD*?{/hg”[G`ZmSU# ~geoWvϧWOwu+Xځ:CcZ`iE_VTyJǘ"ɫGg^$!շBr1>2[=l}C٭Dǔc # nmnRFhl 72#x0{!n³?Vddr5GuحUDw+s0 QzE5ٷc-ܗZHuh `!J;;=>2W4AF9>]vV:hy]N|xU!Hp g;vvCN6JW4Nj딣Usհ8{~2!JOx{kY+_#{FV*בIΫqCѥctL~EFk˂|tDjFյpe3mw^n%wrh$Wtآ/'_`IQ8vsSEpsќݓS 2L|>HҴ&=wm'ZoݥnQNM|iTs4Ds4-ha|D6uB lvC q4ym[]%} ^+mj*z5΁kD {h}~NM#<7\͕{NEM"inÊ^C:^ aӾ Qn9e /Wi{!κΆcIenkቆ6w@7$}|]h-+G 豊C4m[4&x?C,*CDC?ѫ)Z}ܫ3jNn\e2m,TRq]֝~  Sx~!Y5E[u[ c6k1x\F2_0eݜp`xả} ;u/&1ObM|\e[u˓;q~m, Qx:ƛXF._Ѱy38'M;w\2PR\*0[b!jTϦT'C:2 K7Nܱz) ?6YΎ~ єE·+;x!_^h*oV _{Ehx CԔr|e%rPvҖQ}DOX5Ԉalr2>Rמ. (C%qv:+z*̢a@wִy3xfdlsVMg#`iϏ>vp!= &3,B)/_5 .Un|!~m+%կvf.UUcD+?FYoě=f[Mg/WJ~<ˢ[/{=W4(\,8tbΔknw6]aj@ ES{+1c49o8N)}iSy F^4=770w݈w};z✼F^.it?>&פ!zS6ƍ(E;VR,dF}]6:Qo'yzGC\YV#__.n%"RK;]q?DF!ʹ= Nr3tz!Xq!Tػ]PƓEcT58ƻU0 >F.w`ןZP/je*X QzwCxߝ9H؉l4~}1ܓF~ HGGթ;9kȥs {fl͵$DG7f U#3ASW.!S+{Hѐ,N!0oWM:.٣'͙ꗢ)2t ]/OL߽vZkq^5Ӓy9g* m3apgl—=L;t,z謼q*X*G#k`gls}ƙhizrBc,̵VՖE9ְ77$ wy c7 G׵!AO:{kn/~Ǎm;/>φH틵Cdz5iwoiS E?>R$%G /LC:#C#j8S<2=ы2cѱ_fWm|tǧZm\4m9>$掰*0-Ȅn$ncjk-cbC]}l Esy? C\g%oT5 x_#]/5 u&BѴ 2/oDn+=I+ĕۑ#":ﲳXg})`"~H!~`{!roůE_EDӷ< Ct6 dsSKp];]vUW!9rNfLinpWcZ5]P4y _EU>WWF<(~ts}yiUQIF䭣~f V{,KR:6UutG_rz`\:Rv,u0pjvL]SKtC`|ݢ݊ nu $į[S6nmm[4*>/ٟd; {*8b C[KRQUJZk?_zgnKoy! D(<>F9r8qVh 2} KjhVo2{\=H$dzOR1Wu| 3Exw}@˴]l+99zȶhD޲MHG>a~ G#fr|=NQ:;nYIa2ލ:"gzNJ NCkD}] Q{tߊ1?O8.xh '1V1x]6E6۾*!:N{ٝHOv*,kaTUi*~e#WL,9Uį PM*<K:Yު B|# Q9ڸFV'? g5⽸w4DIɨ"d!ge_B%~ۮ7_oy+b\̱-8ܙsEh;/Cx>zcW"ol&xuB4:k K.294rdf3忔,ZgZW\V8F5%nҮFhZ;gk۱-Z֛kF3h{ftL[WYѴ~đrL}.;h]nLGi |չ*p\}wCvO`*oko[h2ky94iC*{}]5E:C aD֮6+׵W4ޥ(w3.Zz-O1%%b6nvv̵z SZ>b z1=wh7amqY11=CN3\LˣN{ E3BrjG娷)Z$!㑛F\Od)8GUY$v}RX_S$59gZuwSh]!~\\-zFT;74"/юhgz!29s̱N~ L7խ8=x'CGʏwtgg6XJyd7}XzƢj%uDMeS49wĹsy4ĬVаQS' 17~w~dQޱ.Z+θiDk;B2Dʫ? MO¯{{єF޽WvZm_QxӉދrŋ1Ov L[Y4~y4D` Fxsd s IXvi#H[4߈(!l+LzS|~Y~]ru^qǎ-;/!u:*4syXr/#CԾZ<=mHYmD[-z4 idL5]s=lVҔF#:ĪH)^sD%N($HBԜ=.Y0?'(uSL)3$?#}I5:7^Sm5[e#qrl&c[\4+n^4߿9|6ʫ8\#rE[̉g}vLє[#Σ{q·r;7<|r6IXy1`^#;FÏ6Ҫ!imŶ3w5Qs,4c2h|'-?p]D qGO#ڜ߬*ô3[*0!i6»S hZ=s[Άch1a#Z%kb4 )ct w1mco)Qs}G~M0G]2"CSߡvE5 UT`ީ_#vCߣ>6uu(Y+!Zih|/TmcB6j`땨hKdeUFm:ZZ+d%KU^伓EGmhwhGER1>S'Y`ݿKf(c_ŜHE"GTS莬F&/gQ#A<1D+NgcU'Rxjʹ#{50Jw =+ {Z_M9Lܧ 2qm`s);#ՑHyW4_WCvk~+_|Q!e6d~sSVՀ`?- !x1{ 7U^өW'3]eը=3R0FQR9S6 P yu:U*#Ј|= [')19,>稵Qt#zP` zQEcqMZz]^7Mķ[ĸ1{My{]a#z LՐV=t'{~nK#J]}q==.k+|Ҍ?=?U)mEҳODc F;17{z52*#ujXǘ 5au]ЩŒi1zWcCdl* ˞45V*QOsItu,giǴ6ĆY3D?vUK(pv iWg)@4XC'8oOB$S 3Q^cJ+:ðhrG< ]58yRڡT#WFZ يمǯ5$_^`.[7˺pL9KF!ёR5͆(Kjw0gW!֤czbQHnrgtsI#@ES^ ݈:ۣch/TCԮoUV(g~t?U#:yl*rǜ$ѳC`ߐG6HJYE1Va܁ٿv`mvi1F1sO'J?`4ީ~u&cǴ{~FV0FiQQ+K>v qx TTO,Ug05ō86YNOyҀvѴ|0n^#zfr6עixu!<̒EO}jC3AZ 3il6AV&׏j I`*0Yv{j )1Oۑ87D{D;UG I`jtFӞc ]^25JH^lF\Ikx& q;p9&w WqFԘyZ!nෑ\X~'%ak54}2 sV(w!|sZ'G(Dˀ-ƾ}1)(s00;J$DgzX'*M^ _51P#l%gg֍!pyvLtCyẃc UeO{D}F5;1~VGi/f5N|UwTff,#0\{ o 1oۑ1xf(<+<)ghMk5Y[oe8vaֈcl݃o%\5Jg]h8zGf*_pڷ1 x.){YgjF9KK̑pW4G9{!_ƹVUf}_"W+/V|mc1Z~-onR :I6¯YzjrLrjW9WqYMcq j KnX#XbW)q~m+q^ ߐUihL{ izuxj^1eyuIհb_71q-44p햑^otS\GhsQZJ 9w h{_-u)jp;Sk0~q2Q߈=B a^߻1~וEӎk8N?/=Iӓj{hvh;01;BjDljnx+u]`l%Ql12'g]e5 ɢ:B̚|E*6{s-wVmyz!*S±VRvcq~S#U*:|.UhzuYصaŝ ѣ{cCGv=AawUoƪw"qVٛovⴙ.D[a-]4_^՞gւNHCpOL:Ulkߞ)'1_O}aZ,A@4Gk !苏ddS+OhOgʚs -skulUnت?^\LϽዦqn7ڵNGXуs{p3qò@]M-5ܢ>u$ QǼTCxz|W \OQq61Ǽfa A=ϧhESw_uzf=i4z] __t`8=FhbTؕWǴ磦mC\k0H'Һеmaly (+Vou/^!kg [\4΋ *HF#l ɂ ̕g'0[9kK$1hhxF.7/ٻr!uPFGyN|gҸN/+! 1-'[?oUwEUݴO-#_՛:3n1*C|W?~ݣ?B#ڝS.cjI1t}shڬCOVk3L QvmT̚䉧4@xώ3DSŞtzՍ|ZI?00Wݍh%1 =b{>wue⵲Rpm![T4:uۿ:/o6>\!ZAhͫE4'DOHS|Jqǒ\ 4]WzqϱŌo9u^>*323z)|Jn#Q00ߌqQXfpz* [_tfbl-C)o⩢y-jqiuX6$Y|e:_^v"R$S')_ȅc\HV%lB82O?F}3v#וT</efP+e<\2٠!AmֵDwJAx#1o2xQ؄u{B/-Meww#d<8kܓڭ7KV?3lk$Y@26ANxv_Zkh4.]dݙĈ 41@ߜ+oAq?I&x3XzHZNYik<2ԯ{׼-=կwdFORmCA=[roa26ypds |&-n+܉&a1zmɴzd'REDenvئJd~R._ 7?-;l3N߅l"~}B]r>HkWKf>ID5oaY,햴.7?!N2zxdiiܟuc56V˭TpYu/jV7]z9Yś'3GA] 'ZϽk ϰLj }}|+k7>IW31w oH,7<<3EJ>##ʲٙ%oK2#} ѓiə?XqP=ƍ5emϚ4>yE{:yd[-+sAx4ss鹷J~tUy9`; 4Xϔ|Wȸz`.9s)=ohX T iGw?COo}Fe]bMKnwt N TkAQ% _NRU.95liWԾzmc{ѿ?P%[-ˡ{ɻ'z&<|%y]l};/cY;{K{=ZiSm+g2w`dYMke5<'k} SeKs^=[TrʼHw5юue;kriAel&z ]4_a kHN1粲K4\최ulTĿ[)妻ߝEr"Ysd?kSMxRY4}N]ބ^=9XPgYVy"4R7 &z=zib4YH73SrLj'6Ko"}ޣL`I#Ax7%Y=#H]'=&nruICX??9[ƓOJWo}L&>#Sy5~c`c`8zgfjjfO#-߄5s$EV&UOɏnFMk0g[h^?-cdl[Lγ5]1xPݳ-=FM{g-fPz;ٺ/Gd{zdJG&>sT, Oha{d5 Q d=zv<&mۇuv#|x:߄o#3d'#FԬcKԞSGU?oht|&,ƽZilmcO[cm=X߮eo+؄ ?rD_^m׾e'kZ2R [[fNe|ٖ2>;3H#6wz2:m>K0Wzōl[kgy!Y+ /3A-r$\^cz{FdnuRɌW 1b-7A9Yo~,=|}%3z-1Ϻ?56?LگkB#}cGܮUr$k<ϳ7M/=|d}J`/)b.ͬ{^r'$2Cd<N_r00K'> ">}ט+Ŷ>]%PĜ;kc0Z23R眡sʃ_nbQ 8 f\?c/NF-nOd2VG+W!vz,S2; އ2LP7O{̘.RED-y8P)Y^cհ` ^]L(Re#*O}sۿy |G?1>ffW(~Nes5dc`i"ccO|d4޾eQm }WK֝M<ħY\j]Ghўko)ۼb&Yc<W+vVh?S2\>~=5XolVl}V"v-. O`~]%dfDwVA.sMqi"i~V7zݻgkl/㥩*w-8ԯy/g0OI=]qT}d==]dVAIйT5N[_ޭU`z MHǨ'mnmYX o{sF`Ek7:I6| ķ| EdlQhGj#idAu*r^[,lhk><[T#b|F{'W,hcLR2"c s>]41v2>N˚ß̑~?7LqϷOpӒ]%dlf鹵+b"b~v̝ |ЃG ZCz]U.W V}2*l 3^gTMTfAov&*琋6gEkVyVYM+*HmgK'[oLQϤ"߼wcYo2;Nv/q~<F "gmPD3.k& *Ϭ4Qlj_jTΫi"k K/;}4o8X{EmݵV^P,bԍsXCֲCg7''DhCc_u| + AQ[23,ҧoZ0YCzIkB%[33%%YO찺A'9Jf=GF\PڷwX7[g>Qco ~<"GVl Bz?<}_ڼT2-dk_$XfăYyZ*o=ϫZv)TNՎ[ƈj$e% ly[{-=̮˦YO1N16in ڗ[Ԧ\~и7 wArEjKuv,u (ω>s֚Qx=Ac̦ؽm*H]]uٙFDh}k%땵$WxN_eN9oMx\Y,HǓ  }-i?}f\ѷY2ob f3MgLE LJw?A[_ Ϡ{Q0~ֻlP-_ZA.y+7X#cz-ujO1 <抦  n:X&s#yd~*^\%{֯x>az3 >}'GT ۼץČ6']KM_0,3ҨUD0LSk08Ԅi7{G:\0>Z.hUb>>^q3e}N;.d}+kAcc3%jŸ@+c Y*&@V b.ZہP1ju'imX}AknV4ۄ'J&%/&c{dtYX9NFGPU^JfƿoJַ[rZ] &u1^ v}m Ÿ9P'ai1,M|sǰ$jI]ǡd=#%/R[-7&>~ޘS:ք.`Drz ^jHQ_> }&¨դOj |0KQuug vk#vHCzndZP2'}yl#S?߫sywpi[Vzѹ̗ 6OdFMT+"&}:l˙>|F39gl*-U?j,ug'o^lr<lK90<>Xbh*8Xuhm Iߒy;3޺.ٛ_s-o[Scbu9[1a=ĤOCao,#WUð̿ә+Muo!჈ )Y}L;1}j.51RqzvAh)tXACo⍾gIΙO{[3W̌H2|4z3;vFFc"ϋze-?Y1"H{-csX֏uSmU"hk}ηIse.SGwOT95r>7tWq.VojC2(1A'w]#VFŽA3wRWz^chD 6٧u_'d}뽞EU D 0)ΟG,'Jff"-ڤ?rтyA&ަcź fܯKAz!:bIfFk'-+r9(,dlhڡ ,MX2V%X1U4?ޟ(u@f$YJPAO?=<91T>(AӫD7;3#۶+mz<,i|cac{+YČ? _>[(my%{>,s׸{U^r2;[Z 1`egճxc=ܯ8> x%033]Vu[\i9/Ά5U9'oW)tfq+쯌Y4:YDBSDzݪ"}ռ)Ym[m)K.&t#?,`%o^6_3ո#xݻNeЌH][ֳ.֯uSGsa_Uֱ? KX#˗3$b?W?A\ .yw6OɼQf+gd7N=2 5LTMz=I,,5*'MxFpILE:hmm_P)V_}t%kXD\jrUdZV {YKƊ2Ѷv_jOuBj&c(6KKus0#6V G96/"5}6\̩Ǽ K?6dFkKW"jvW^dt}Je;ͮl s کtl_˟DNޭ\2=+ᝒο3̘}k41V BZ+ZfrJo˃w^NU2⣭ecfy>-=X}stΒle"~z츗VnE2~V続;]-dn,ݧ^iBؚt}&Fܣ4Tx3Cq0:Og'9O58b^o:AjO^m^ol y2K'oo!gdi]2;eW6ْZX+g7]ṟ)kB_F(B9*o-{#Oa'.՗X 35qU$*zW.^01Qeum&){Q*HZ8N&j1z&U`ۢ@)pO҈F7jnBf$DRCVF\"XW9{^qϤ1fsni.]ΒR#.WQՑ y3H^¸ $mQ2ܜf*^15r2MhxdKl2+I>}A}>ygUJ)xvK3j_j!Sp/鴦e<3OO5fߙJ^E;BOnyKTϠ;sЯ <Ϡ}ge4\\%7!YA{xAqֽ8睿t %*@zԣi»_ʿ f?B1F=-v-+lQǖQaL+Lg_YbYxRkd Wq=dڪEh%&?}K5U ^eWJf.Ǹx%3+=ϛϹ:ef]m?)Z {ěe ;a xƒ<1ָ:ǧMK[mg7}6%^hK|d 1?|*{$\r=9"dic9%-k g#MJa~꼈'xLO2||ndz'O[rk|x A&L]}}ʇ-z0D'"wGSenJuK>mpnBKW9E6i0=1~1NeZYS5>Z\[V#=Ӯg o^yEuTeXD @C}bV%xpގ% 'JR#Ѳy>ZΧ#}_2Ϩs0ۻwJf$~dԺGi^$ލޢt۰`bgzv=uJ߬~ }е!K7~t[# ;AzVn.b y%Pu!3Ingvv&JɞeK ? 48suQkMrO(s34Z|G$ у~"~۾uaz]mvk~Fe'_T<<>(k8?wgAc r,&M71ʩf>>ϚT2}^#QY2jÐh%cfr}=&z-%I3#}j'(sYӤOy[K5޻Ⱦ0ϼ9hfO?w};oZ7ɡfDzy8njHGÿ,_7| u^2hf= ֓}d}S^nBk:J1[Z"=޷/l;TOS2q'x/W{g𽟳ouG%ӾGtƟAAh].2 ?f7pK^]?9g?xk}3wy0Qk^drϹ4zMs+,\aZHZ?Y|9Gg|̺ό}LQhKE`=lW lDTk5ZEHKV-`Q -7s33o Ӝ-e&>y{?52VNdͨs1ו\wֳ`1N%W9F{\MG^Oں?JFg% yȚn2/j)9xFL%+j"4Ȩ٤r4HoV6|+nrE|^yd[Azs-(bZj쀵Ahg]rV1N;OyQg3gN{h=FKܜUlGx%.ZuM:O-Z` ; >]TƱL?8>r"ux%R9u[dz@U%߾=E=e]~Y? f Eg oB-@>ȌA1~s5iwsܧv.K̷-= fZmMJϢy/#!5s CY!o)Z:e^rznno&HY%yf/1svUAcC&o"zi+yY~Aŷc[Y&| !/`WVLpɑaYI4雽jH)Le6']qr)W ]UtꥉwB}1+Bte)pñ蝷ءY'3me={/V6)z05wg`?gXIV"2KMi pVO-~^jB['ӗ3g0-K{ }VF=^oQ 4Z+߮(3t*c^shͯo,qOJh9ys OaAw#AgFA1m3C?ٿ;lfv JVoī-ҧwYK:m Tķ~=ˉ1VkیRcײ>v>f Ζ#44V$}ZAh= R;+w;5:67ؿϗzҲ~Oqx 1VS{od[771b\"]OQ?)Oc]wD}#NɌ[Ǚ%[B2-țTfhku{4ѬzE%kTB;F}cXؑR ͖rϻIwΞ,ӧMXi J?F$1A-`Y2g2iSv+->qbIj٫{ثsl㶆t&ZӪƮˑn㓟kYÒ7%3Ԉ" ]kAAݟΡ/V稚:R'Y1弞oV?{qN|0m=5X]+s71grV>"H۹½w.Ysj|=H 2'w7iL~/#{[N.'\B[cmۼX-LKh 8kggr5gP{ZZz%kFޫxUgIO!TOayhCNFfeFޓ 2yܝd݄THTnbfXKѶU2)3ł·."jk [8KЄ%G[߄6ϳ >$Gj!n-~̆?%,Y-yX{Jo=TLGςLɌ3j /+s?n,_ukY8{õҿ%T&4 =n)"=.OA)绉Xc96G]&nυ^UN4zdt&tgj ߓh¯ڢ z X~4i:}SS; ez9kjNBJf$պ_0#b]o[ؚw<<]짲l;;"ykPAXqsLjճ20KީPl d"{mY]0׋fLd;حσw8U+-K?h_-EA<Ӟ˩穨qzӜAT7AA;O<4W.iuMz3ߞrVYCxY2mW;c`zA-;{;sJ_?*=PDلy}nync4 "&|e9|̮&^γAQJx_ې[@"F}T}r xZZd"̣BD[Kw27ڵEo?A_ccGj&4_{%>gqNFW_R4m`.,ؓfj[dU2-׏\ѷo>T&rzi?O>=d5x~(%#d&΋ќ/B_hUm3Fł&l;Q-xzY%73y_sɕpn`!2fuI޺I9yEy `4sjU:ɚ{}-{ć. MjqY>%׍f\%uf;f;6{'mlUEfna'GaYAjyyX'%#|@>φ Fd iXu{X9e~۩$qo2bѧYD}ַqߤ7xy!x:l^Zycw{L~{e5a?5Kf&>J8El􍯬Kz55>-7n {ϹgtGbDڳ>ɒ.IvFce ynHe7=\kb]7iE'd/W,3z<?fs_!z;פ}tdQ2Eε SsfY72$%Cr#{[FvUlVt@<͸jPƮVUMu<&ɓAzZb|]_O#f8vkv\AҎsLwk4FZrR6ɚxܝYWAL`| 9|2?bkYLgz]c?׬3 MhlK#vO.b&|)(Ҙ j:UҤtݱS7e/~yNue¨F{-hyho“d~wαcv8kL 4WcݵTr8[9f.9nl=- {A̶xرqFr]+|0a6[u^k"4`,\}q̾1B:O;c͈ \eĹRPY=疬~RUmF-&DkʡMk ֛F>2o~U6y~ ¼HN?֥=Ǖ&NЄN=ԼDM%ߞ!3^]`ɚ9g{e%NOXqIuxk`\ ?~ 5s mwKԁRVP;H^yzU$#kj@3cuN:ZA}^>sd@\I\,Y*hW`lN&f="YVib^AT~ 'M?+`v>hq"w!}U- XF?~'rG<^kv>Oه5YsH:coYcZnା"!]Q5ooNe7pI6Eiߒi5XT{ ',gSPxQcȧ㖪-s ,ϥҲeNFI[]ɠ5sO]L4y'331{MĺrŌpZ}ߥZ Eҁ+R2v%־wxtG fӒLo /{)'D=G蕠]SJU!xfq QV~b5~w-<6m2&z=7QVmо =&W'`]k%3jsXOqrG4 Y%=ĘPO %Yw|}\ BO6Veq]Di_w>D;7ѯ"6-G=@%ͺGߋ5<l [^|lV ZknMΖu{{ 7ˌ5JpZQ~ / lNW5agxq2S扰w p2~mxZ}'MFdԄ݇hŨ5pkd녇&FzfFdfXC+dFݶzc\v\9L\qTGU䛛{ԛ⩾k|O4ϰ#AXx*o`g 'L,"}fѯuWkk6nږ=/jI%Ò 27x %xt˟m6{xRg~*e?Y2IKW[SQ-D$%eܲ?wڴ<6l]/oL5OO3($/?218;YzeOtKx-ihC}}zch58*{JF)}J' I7Ӽ= ,M\Y"{cֳF&<Մn\Ԟ›QG;si2>(c-"vO%7D [lk-DM|k6(YOt ƎZGlڄ3yєOuuj2ٸN$j?N9q?L0*҆MtVQ2qʫ+}[?G~FQ;ᣪ8%Cª$_[&'dzv|q-=^Ν ,F&<6k>&9]\4kؚ:YO5gwRF5Kf.Ov޷sRy+W&7\aQi2mvg'4#v{ڶao]V+=ݯzx2XO(:QT3'wP542!-tcc7{#q>;%+uuny$7 [LUN~sˬ3|xEz0- )A00sJooi}dF]eV»h]l>z䕬'mc"^u.569c#f~`E(YwwIַ' ogg0E~Č[2׏|"Jײf߻DdcY:֘=ݞudD*y`}{~՗a7=g`|#lkd [VFìEmTx6њW?3 ,;a߸_GV ҧo/:%Sa!~>M~xGoEz\7V f=\>ё۫^Jonwވv,c/⶙Q-鏕[U !3Ks}?>M9I;51Rb>sQϣd}=jEIm{ۭoTaBno]-]?s:ek~,7x ºCvi?-FzOb{w|MSdWyKlueм30J[=71ںZh|!w;#qgvem b{;MJF,4?dߵ]*E]-MlG6xn_>[z^w_y# MyFe#h }`@2=̇}J|ϥn /ķfAaf5A2of.ߟU;U;MMص߃ck܃P癒)cd ̨*ބg ;ҚX5LOi&~,ߟJ;Q̚#\"b#?me[$+}ZQh=Kxz=M?{;׼{dzFNu.̼c[]Nʌ=qg{?zU\w~G_},+Ŭb}B#/9{1qymf\W beD4A6ք=oUz'2tU>P4Zh7{ DLsusub6*uX|= 6#=Ϭ-OW:wʷ-`YYbҼmJWM p탎;+k#ϸO_ҊetHֱ F|d FqXvQ֩iF)}!ru V2 봯V{-[[hKZ+ӕ '!6}[mU  w1fk:5>zI:d4L䂘oR2[dѧeEaY-w>uj2l=:%;=X-謑ʇq79vR5JG܁k٦-'A̸\ RKO*GUX?Gg?ZF\S>P+5m0ϕ1YuUXNz'ӊca45M?ϻ\"wݕhj;|߹M,ẎlbĵDt{f`2]hһx홪EE<='ُW5@vD!<jں6bɌKj\ MVWwu^o2c#=)3ķ'5|V&3+wY2n +}!3k,vv3SLmYuuFɌdxz7wy7U@xξ9nh٩MLvz Y#tbsy91cz{5"kF瞧 ;KFsMvM.m;Q2>WfT_|Uڥmg,JfnтA'IK^no;Ob`c@SOdPnФg NWAػuz,N׸Zn8nsͧPQ`fݲTAm: Ӂc hQuzrGh{{V R yeTqCZ3XS:um.1r(nY^' *.Eflu}uAM<кGjZ륺ܫ8KG3D\Y Mw{<%W,w$31"DoxI}Qߡww OW-vht kA/rk|Ό(x>R2wid=ށ`|4|mA{.-h:=;Dz//r^/vY 4Uޒg&53 MzX,O*ȿmD[FAz* '%_C;3ޖ=J'{k'lPd|㬼DϽr515Kf*BV*,ۯ'O6)+YϮ=q?}GA|ۗgqOS|9%&pUNUaѤS+8ۇ.K%7D9\2ȭoq%]4$3&UB&9yUQd؝c5ۧb#ӷ "w.*VS2 7VsdG.PJYum>&]Dix=h}txR+MhլDO]NZu`g}[RuQMȲ-{ƾs%%ϛ9Ѣ&=/^w0\5;TJ{&XEG~d}e J'_cn sF%~1<*?m9AyW׹|YF7LM9D[olwۼ xԡР{:w'nZɹdG%S&˜)]Vg|?4t,߹nx;~v5&e!h=rZS+xl%_y46mwq5xg]2i`kےd=B|DsxDֽ[d=먲qU6tǫL6t9krs$#I}zLk7v:/nV̘g̚=^{}Of7әDOgO#rʒJ@=mhw^K~瓺28uywgevf릶]kLoq^ƒu&ۋ%c;;d>3LV(5M=V\w36 DNoZ3[9f6صܮq]ûm^N e}SZ&nYhKm\1ƊC0#xGU1Z|}V2=|:˞%8 Ѳ<]QQwåslҚ]7<֛k%Qj^T#/es%?3ߝ%ӴksVH6aJ צw_YfvuF~́>S2c*|-|'R`繎xx?Hgdf7Yd[n~vӖ,1}BHyuu+ݥEK@Uq20Ǔ:Xф|W١ƨnYߦ1[=n|]}MVW#k UJƚv͇]'%S=^wO$-:glm}N;\3}Ȇ"@/oG.k\kKzYy96W$q}XFZ=\8=WiBo8ʚ#]2c=+;H=;;6s gd}e$T<<}X弆UUUF5OFA;Y/MxSk}L-{TZDË/b*[3{X4?4m>\ڛ:Uw\;|)5췶5M#h/Y Moپl_I# [g~ޣWJ蹟3}I"Z7騟!ӡ--\LDTéVߋ F?-G&cwdZeYpSUn0D)27/A*z(b\wU2q?֪W%ɽ"1hg}Hocn5zd}JlL+YzbYZӮ`ۤu҄-[.JFqxEs'=ߝYȹ[&c?'rZ=IOJyȵ}g>^kт+?&Mf9{M'W^+Jh(!/^sw?>Ӡ1X}BxQJWw;qA'g?c}"V)wN׈|ە̣-7b[w=-$w864=}G}iw=~dϑV*>Dm̡|R]gOLS,Mwۄwr^'\EV,_$8gӤw9!k%Y*CF!ணՀF)?7EUlZKmMD8`[z'kҜT|DԔ~ZA{N4a;;ىO ߾G=l]Z42p}zd(?җ| ʭ>ф8*%[yzUDKHkOZIo⒱xJg2gقs}0%USWsqKJv[Do'VuC?yH=S%GZKC]So3~y&}7?.6ѓIߝ>Gj} bk;1NM?F>=h "a4E9LM yߟ ַJ&m~268+{%cά[v7\pӼwch40Y5J7ѲU?2w3Hf5םeߝ9TFww7I'uOJ擙8/)V\)~L!,Ji26tl֓ tBoY]r-.ݟQk5hW P/y,4rGۃ(KfvM i?fwYzr}Za AEߞG[gJ"Q!21JfԙsfW2 DlH3lu;;7oii/ wJoMO31²~ 92'P}_W$8/3V)8n x |EMklꬳ[Ɠ<6̀fU>[q3{&,+-!?ڻ[_73|&4}"8EuU8O"""^ GFxwڶd> <2/EYSU? p\7@6VT;K؜g F<="h1:#gdcdX4a8\3u>+yx ]G]R}Y.d=/xfL_e4DF;jͧ>X.[Ln;Jn?lXGņ-3ui4/GDm_ٗDZۃ[ŴAZ2Z N[>QgL5M(ݒ%>\,ȱAu`ɌduFAzm9L 4OfnTA̜{OM9'eN>"z:Q' >XsܢQsHw+,V幆 ,hiɾ {KYh)\2hbݬwMVA㖶"zk PM>>OV.m 7}x&>`2 BSÓFc{GD:+A9NCg1Н@}]>}o2j51kSS7aўiѶϑ]ٵLj?%8q&JTŜ`!^2?!Cr=ؿϽ w}`bvr}mT;>u<z,J%kdREn0^i+Yy}\>ZFy+6蛬֊5^{ռ6,g7q513Wd[n g9Nr51Ge4$5Or|ڒLAVN37›z7uafD/[}V+u$"y粌9U&ZX3"YO^13 4s~m1g,DCoB猝c$=y3{'+{R^󮄭zrzU;g%RInQIn_"Goi5>qN<Q--!gоI`hlqȴ^j,A&XZWoS7l߾m3=[O!s L 7ur9K}-hW%rvd<~ld2]2<8߱G71&ͥkuwJ{.=Mħ3p_sEʓ8Axu6fR1К]^Feگ# YY VgD=-;"Ⱦh[3;HÛԊNNn!縮Hݵmtjg ,oUEqϱ~ 8*Hz5O mևA4oOomZܿ^= $g3N1f '4&td%i9gxa3LL13q{Xot{xJ(Zށ vt]} KDXVF_g~D;tvKD,5j}\ J2>gmqNj<23+mo3e͡Y-)~[[ek}tM3̼I2a;hR˽S3"cjF[[VsΜjW/JUx97{ӱ{W~@0_a.EI}"Ғg^Hϻߣ 92ڣ:*NAFFu +59~w|`m9{ǹǣ#ɒfN`G Ao^7D(3̨ 7"5ӎKyZb !3~0.4Zfe{82>^}_ǨeijgD/َdlbxiچ}db"b\ 8t>dDG:'{=g,9At|qܳזKST>gcUKڰ6zٺe:1'A4싗/1g"Jzץd-7xΠqquyQާMcظ{9p+xGߥbyVuJ'[z A+ekw5Ug6^Q2z5V?R_6͹ v=s$aTP? ㉏<&FgvFN3"֠3=q1n{x=e;~R_znr8MHUUbY3ޚE<ջuj5ܳDs1~fWޣȻ.KPlNqCeđizs^խo]1 F#$[V "j jbKjϳd3}?>4kq{gDG|tXh/99cwĨל>jc&8#2|Ŗgsdy <=:˺]MxV߮~e d;bh<=7~saliɴD 1W>uj{ 8#DU\znz5HǺ<4y27( zZ?oXhBŵjFO>ZiԹ8|W`=Y?%?oi%rV/WݺiZ:ܚĜn 73{3j0oAl5ma#7蜹A;7)^yn Bw A~M3ȶ%Xj&?Ow] ~dr3`o;MAtS3~_VJ&"%kge]|ή\z ]io<`G,=w19W1SY|*64ӯgphO3ϸAjv:8/~h+C.XqKf,̒{_LGb&|P[gEXwے`Wʼnދ'|2wm{Wd<f ֻ,#_틍ײ'{Amgd[72eCTgm?vy̝\ b6.+s/huAx:.&Dܢx[ݥx1]YdiYn0l ff׃hgYH541Nck<2G3+%eAm~/3۬ sO?Ib\hdJ >WFҠn;3(cҽ~yyQ m*AEW R=zȱ|Ǐhb$7mYYql5M1ۏkm抿 >;F)Y= S[Edxed{:ש},g`3@z~tyr\O#k谾dHL[ZZfZv"T%c-Z6b%/2EZfug`~IZ"֞?cy=m[==OaGN1s¶{ib}3Al'~ \ b̖k0^/${4Iomuʶo "͸{A!EM"չFRo&iԖw3nֱ:++~&ZóDQU?`Fwq:E"9+I{!AX<"Qn:asGҪZT0X" ~] r<6>6ifW~ F|[touoNT [>x٭Q2Zf\DħgCW^Y8 7-ɌWgeQf&WnBoYMɯ*_'} |q#DuKF?߿Ka!RK}8&pF9ʿlR> 6Mrxg}\gZ tXc13 ߡb{ WD̳y.*-1E1d4U1~㮊Rlk%fCZ}iK ;QO2<Ή59ջAϮV;dbye6 ^Kkej׏W+_^7CUQo˳*"8}N{0cwO%ny@Q^X Iǰq'I<&"3%HO_y ֢w]x5AU9e=|/f]5>Rk◑ܝ" kROZ*K)J=!ZQҊez"okxߎhq:Q1vfY:J âr]"TWe$wH-Ex1ZMWޔ24zEӟ(SsFƊ!hsf.Չ}K@f\׼sNꅔ}\{N 2$5pGgQ;)}~|(dD Y4_l&ѮSE2g,5n0cF"\}Qػ.yõYƲ6#]|g(jx/hʪ2eUƌF?csF薭(ghe LlKnV|[b_GovRn mLTX1rzI9JZQv#g_k?4bTJRvH{$N"*Z :V[Y0B=Y#<6_|{ҨБkIuDکn7fVCDo9o_xgSy>`ȜDƯ_vk<,>?Ym9l+EI}~#,-vY^sA|Y3keٌ\귧{SDjE]`N땐3kc,攬zo<2BiF6ɘw25&qh7n0r<3q~71֣΋FzR[8)HˆwķFh%+n+#ezm=Ϭ\n yU<>6괃ѷ̶xwLmUhڕM=C/3%˛kOFP^68LjJOU3efv&6ݺp\c.)2=Iש&Uyo^ʳ}4~>IE(d_yYOIDIM?AiT:VQ23k{>|/"Ĕ%6cHo7W2R'S&cPWE1Z#*"ڍvW~~?orw kMIA$1tOs6N]7 YӍ1z>dQ|~86^7-Ju5ذRE؛ڻKw-Eö#w"籑-B3z#JԒV#͍/04vH6ϓ778N>I"W5O0L'S=9vxgfF\ypCՔվz`_UFok˪AOȰ^Zem̮EVβ,TD5cf"40i֚S |{ZeƊIfy=(#ҳ/ŲNwb}`;/miDO*ƙ8ˈ8wiTk9T'ڈ2,uZIR_3RǜʝocSת(*e|j5ҨVDZ\$߆uE?+b)B=Yvr^؛ܻ\JdOj#EL$]_.M/7gΕ_<cm/⎑$43h}Fj/(3w \$g[Hgu_oYk9wu8e]>lE fXWF}Dxk{~Q4Ư8Q-]ݏFKCĥ]E5-e4;"D#9p=F-()o)e2^.ڣqwm?3G}9j2¦y*&w?$awksa5zιnC@6K0yʺ[YՈxݓQ;ӳ^|#XlⲐc\%jzo\K'>ExFcPFFh"U#H_1IX>% %V+ Ov^7L 4|N;OY"F2}FQeE)3ؙ96} zJsI{dWgiĂɗc_%ƾ3M9(U&ʄgQ""9d:&37XR>V6x#9S:Y]5~֥$ڴJ%;xPʴK-b>[ ͬh,s?[{F9۷·ћŸM${1mmܧ5pcnј1N- )"ӊeܕid,Ⱦ*}FĒoCq&sh?}?1XZtQ=rMTT8"kŌ4=˨ȳHi[ۦչCgXo_*L{)cqF+#NwNcwI+D!O=d})cQyZ]"Nc֘~ƕL||U}yqv.R|/ )e=؈dmoEx~bوYUΩ>uX: m?{V9#y|ֈNnsNIc[I#FN JjݖT\o)B^&>h2#bwՄss~!^̵u+Mkyա/Bug3~=ce73pf<iɳit#kq?~1mqF,ULd=Ѻ `9O">׬ڭ_nzLy""w#Ѫ2T)șٝxͽrB#InNeS򟒘~YwR~i=̭+l}/QXxzqLc}¨JcD1󳞛s|Lj~"5μ-eZoпt*?E613Ȍ-B] tr|i[9vFiE+\R]ϕ2ƴ5E,B}Sm!4غS썱JËl+h:q&V4ዤ9ٌUXS,BOc$GOBt^lqF9>JH'{'<gުx_9^kNuE^U%Fe5+F<4{5k *YqZ-+F?cfSxEDC#]6;ʁS9eVNpx+¿PzI1Fڞ֘xo7rk5Fk5b5d|{Q>Tq>VeeDŚT|W #< 5ܗ3B]"Oft1Kb̘|:#iS;5n M9zn^qcZw#FkEZqv0{Qv=7:KĿ䎦q1+ne2l|*%M aV4Fg/%imc,9ژ^#JY/[ښ\=|/_ZO1ߨej}D)%_4GzV7OdaEc{?3j|=9nTcaKbL)G[Y2Lm~5.^zƲ6xYkԦQ6{/~t8) )~[uA gc|bM]ɈΚiDuƶuteoOC錰 u~)eJej+cEe~l"lĖc#eu7keDKn_=ڿ͟x)3\cXg[qZyDDΩBi}v\[2+F7V]i$~#Q[!Sn-wNk%M9o_1Bnt?-&yz1jJf6uسLmJ[1IVL}cs?am딹yқr[=8'ezL3{T#O26 ӹcʶ>7~{c"LɌ1#Hiz#cfƺw5cƲwFy'̞` xi~4b X#Eoh0^?kj`W8#g^ݜȌ(1¿n8bdHyɽ(|--"b#G4BYExS;m{묮z+2pF/m~pQV_Q1@ Zq؜;O _U,E͞ߓ=jڜ;UωKZq EؠJmu]kUH9qdscI’O9:M=Gh|Hq؏%MFc#geWnc>BJ΢w{}}ܵF1uvUy`Fht|}""Ke5kT,d_*<ck5Z펢q4'sޱ$Y>QۆO$B3Te剥۷ UπG_}@w޺R{mfD+)-f˒vjXKt]fgF4&jk6aKXUS8X<;cϬD1s|c7e<rGo׍w:g}wE -j{V #4#XrgulSRSH❫eῬ$1b^ʲ?Gčd,b݈gl+W_TwVcbN6ߖY-F}ޒeכ>K*)Jh14fWD8zns6itjcf~9%9FوQלc2cWl{/{g<vi# Y21vy)^؋,cw6}|.Sms1?8fs~Vg὜#\`Vf7= K5Gcb7*۴Bޤ}:}-}>cnsj #tRe리贽Qlr]ߜ?+VyiΚ68SU{Lg}6>•Øvvpλ]clXD>ƌզF\nLVouzLclw_yoCcw p;;}Uᰂ^6J sA%K )[Bʴ@bH_LCez6bLݾg#7"p,t l\B.dz۔qcP^<g:J: ߊ='8$-/hhTxɈgërkFIjDܟ׼3mD4fZdF{tŸu).FؕZTĨj`+J>鶼--2fvԾQn/;>9~v^{}6eg5UgF__kXq+h"ŋWi-رrƲȬx]dY\{ #li{?yD2eN7F-{d3c{UI~1 !q8}GQ)liuKyyu$o=ncZbSIGr<+"*bS]gț+#)t>TLEj[5;mtڢu[g/ma͔>Ow7 Gy.Q<ͰD+;G|-2DbݮⷯڗI9)['Ꞅ]kJF?fqDtĽՂ ?p>}\vϫ΅ct[lVᣥ2Ϩ͙㚣] cl߮*8zK,ub<2CӘvR#fakܼ-xd%aFo>mf.N;X6-+X=~(]c:2(iޣ>fjOK'1.7Ή'_>㯅^N?Xv.k9[{'m9eѧHcr\2s]1Gxv㒛Z)3w'F9+S:e|bmz}.jY~NQ̨뽰CEVkbB+FΊ@Sf\sHB,b23_a> s\C[sx=7=u5=}O՟K낧iޱAd̍^iy1cu■D}%6xʤ>)F0L:dYd&.$Flj'ʱ l ,-=ޣuv~bU`Q'1b)؊VGD6= l,OƘ=kLd-[,__g\g}̿yju_vi|kL֋b|֯:x,¿LBɴڑ#(etK;F$)[cR:*)4ї㶟}nzZ~(N/S!=}SLDE{E{z`-LN83eyb$&fݒ_乶zETe{]6{:BZLh)3IY#+溁swŌxVDM{[;i,-ϙ9\\tIcl@կN9rH79jg8cZ^ץug:;glnuލIcm3+k,@ֽMcfgoVkʬ(~~j%O-9R}W~߭S3ho=X3JcF^s[2[ۑ*sC)ǯ(4۪Lad~b~C%.6EZt)-UAG?jybn618L]:͆IҔm4&w7Q[{r>ޓFSFl\L EQ2dSmV'8 k"-+r"wq]~ԒKuFcVRF,ԺWyk*7]EĸUڿ*^B$j_kruSjδiz҈ujq0a F^vþ/c, Scڽn<üH<,LC@ֆw`\]+REp{,X򠃉bOdeQke)}$?_*LL к^kHmp~cW%1R/e4o>q@{FQ ϝl2c]˪*BGkVwF/`D{3LtobFEC 7bƚ1kK9X304Ŗ܈{W7V;ㅔ77o "ea-{V +qU'gSfLY_75ukOmAyFkxnՌaogMkFQ̴=E#{W#0_[bF1r>;@j#Zc̟O?y}aZyؗV`|ӽ<m9F*Wr_~YT`8EO+-_uo|3<߱c˻{n;i4#Fv>嫧,2>zo٣g6&{ [ uc㰢yMS#3Sdt_EVI/P __1Ψ9k<"z'+ʜ{m>չVY3-L+ENŧXI#ƌXufݎ&y]U~:!6ʱ?El\E{cƦk)4!8I.A,OQ2zvϵEhjNoE5*E-I>^Kfaf%5?Si͑kim;ERf~ٖ=sm:fe,9~Y^L׺sʌ*_ۘo1"9~+b1dT6~noˆ;E7=s R[OD:nn)Rg(}Gڹ޻[S:AkQỈUͽ'(y_MVI2~^ݛ6*"G?~"?U5c:f&Uؙ҄k!zըcO3 "(4C3/š1U.2=G?)#ϩ~nB&2آ,‹ 2WyH?i>rOanqSW$EkuN.vxϏ<6E):c4)o4.[9ekxfߩmg:{+}vS>m+Җut13C箾dϠ33$?7|ݟoMXYNٷEoFJ[*lx=G;Eo|() vU!;x?bN\t깔^Im7ŭnlcK]zNnmU۽',މ5ƕФUW>q1zK)t^3}\֮3>'`RwZ 9,D榈в>b4nq464³ ޳qiOuJ+\ _c=Y[@|֍¦U2SnSfqA0tNv;](wƊ-M71[.;+V@Е-c>sWAf?qjfq#ަyJo"}egqI2L+#<,UIvՒbfՋW xla6ZQ0vgmH_:[z)vנdlJ}NI;3Ǩ{v_:MV{$Zqw3fmh0FV>gϜCg.#igE/];֕!2m!uagZH0|U=f)yT$E6R}[O%OyN -i6^ۘw5_HK_VeS8UJfv6723#sS͑IX%Zg9usʄ1ķ_1F%%x24NFy#6ldEa+XƴFl4添o* 7RkYϭmbfE7=,g{F{F̏jEFwBFs3n )w/#vѝFxPϸՙ1P:鸥Ko;릁z)NåTqѬ?gFU?=2)?d)X/+IĈOb*'0m}cۏ˔X1A-K9ZpX%eW-e>g>x\D_U=͔A3^("?℈h}g#<=;Kw;!T:RR_$hϙG{8In7e iGç]ٗ^=jc5ͳƌϾ84{y֥qUe贪<Ͽˍ-b*C[3kjEOR)M>kԘ/6S ,mc<"ȅOu.e8ic)j{*WDKTNVSkإU}ǗzkI7>e:p.t3clؾolqY_r1_"vQQ/3SY|iyl,zu;|0dfrPm+E~zGe3!gUMZ1qxj㴓Z(js`$+|$~m#nOvXL#OxNW|dgU\ZO !vحF)`TO):F3G[*"{>Qu1}/_o\ ߾~:Z-y6=Y79y^M{Kr:I]ww&rido2^XOΜ$z?S+ $ǻ@z}_1qeX=mG3;=h)ӓ6$Ze}U?bgOY g?']# uEDT^M}?[uwݛ'ڨ3Ͽ&!3T26waF6U=tV8x'蟊 GQ|n)eůVc:J!LT'kQ]oyy Try/2oU3e1y]D@[7u׌{qC2v1?ls?O12mFnaO_cT]^q(5H~)Gk^k"Ɍv(_Q zUV*yE~΀sQs~4WWVrC#Za4⛗dlw}@f ?~"lϴ|~ŝ9㭊M EgpǛG͵k=zRTObZ(Uloc"}/"#,uȏeUS)coo_gfMftk֒ mlgڰѭ~ky=E׈O—]D՟GEy;Q[}$7"Z+5WхOs c|2%Ifz3|ecDwP+8)93yjgfΔ㛛X&%*O(XH2=i/63oξ\}]݂`.I͇֜m'z҈/ꈙFλΖ%Y~!O5{Ik;+ ky>>i|,gʵtf|Ukg1QjMxgդUpϖ?yN'lXRGlNG۩y!g)G{Ɗپ1EW4ݞchDL{/FXJەaۈ",NR4Mrqb^;QE&g+N1Fk!D-H:DpWd׆܏w^5b֏F~zBrs9`Vy6m̛]?c19fh,1?t_>s|oB93Rƴ눆s-. Vv*zޢ3g?̂ǍJV[g86;l{ߵގ)͵UFiy;ŘL4N%kdVd~Kk%suVr(u;2=^(=NE+>G۶߬r_2Uosfyb(14쇯eӻlL,daX[ږŊGF|E(lyu3wD܃VQq$}s+*:iUQ2Dc&a;2FxmJck+hUm嫦}Y,e}#<ӭ9_bFj6J3=Cf$7=eK ^>S5kq?ꫬ}MUrRFOMwt|iF/oTۛ5ol~_3mE #* } T"qY)Q{I}]}o-C|2u[Q6ƒo'h77v )7RVv|(˙2+ ef0[_ߚﳳ1}㞼⽴K)GהTpLk6dTYch7O83FkqeV,bEFT|< )Ldf4?<@7SV&*f1c_J]WT) Wڽ15 \t#-llGvެgrgHZ) WU!(Yg"(,^sVL2FF#)og+G}4wWFokjmi{)K[ͮsExwx]ᬬy-Ge){^We= Th13-)|--gzdJO3Fx5 Eq_o}keاhb*\Oy(>րqڥeOWj=ˤ{HZd⽞=ԘG1cxF1un X 'Ÿ/g8jLfƩQv1Jdl"de3bRƎSzؔ@!wQ⭷:y]WI7Ūa^ lsko܍9|ZɌƌQChs )3ks&+Y9(dFj獙%'9EƱZmwm펠M9}MK]Kdhf=Q1|kdFs*eEz5ab}F{rЬ:'Lv5)ggGUʈx$씷9ksa2~1+v1[,t_6+$)Ȉyn[dm-nKGӣ_̎0fƑ;tw2Z׹(QΡвE;LFxIՈݚq6%ɪpK|#O#35Bo0u>sbF9њ1(_u6w/R{"vzg砍/VmVr`R?_6.֜U[>sGM+kIsj< Q;۠2KژZ'S}6F/v ?ЉQ1F'JZ_tMnwe)ֽUY^n'I7cXj_)exFi:~}_}/(GsҐ{VTFs|,2[vom/v d~*czەCO6WdzuI1{`)9vǗj?~i}lwQGQǝn qb~52}}[}=#$zE{YKa{#2y*L"3xa[*nm[pPL^5Ɉ^MWa;7ͽn^V*:@;="bY,]CB1xX2 b-T1׹,[~)ͣ蹆cZ{aHH1iR|vX+#2Uƈ3}p M(9e8L#ٜGWeCœQQw&'_O▌추æD\/RD)cz>AcfV\c&EυQd|鞭RzZ>6F,%υ"_5¢{#SMDT&]_Sά+C\܏7u~c){4);T-C!~~'ǛF|;ߨuÍzD gW6K=lY vղs|V DGοŞre97ۡȡ1ֳjq6+:3rmcf3OƊydIBo{sʬ?2<p߱oȻ]_[tqپ׉&YvnqCݦᢂmS4GDFxrzL0NQx_\X #@hII=)Exn#E%]#MV(n(Bj"lVVƲ:}cF2[OQ5hIF0{Rgk)3zE1:mq֪S*گv]cI3j$Oj9V~c3oPsSʓ[Z)3%s-2gġE+˚XoDv8G/EEGS'KoJ(tMyaoBJ/$S9Ljiae9^qr¨YEXY)Ab)+w1)?SSΡc'ÊЫ#gڪ=V!)o%R^{|?ވQU$f8o:21α5>%x18CM_-NakN5ٚɝi+Dxy~k<2We_{ؚ.o?^pfFow髍I"tz:>6{=Gw;uO硶̇}}")cј|jHFԽ)3RUcxC#&yccEx{fO/;.즞_(MS75Em u:=I^k"J5yGob̉"l=Iֳ%1Y՘q2"2) ]ૻFx/QOt!M4\g'#RWDˢ3m4Q|}вZcPaĠ5R^wصUV}1V~'J{FrklQ8Uݬ\g*:fnnWu;?yTN-2WVri`^j+_%1'F)Y:|*(roYDoџwjٔ-~YUqV.OjZ:7E-n͌M4:j{7y͞(FJ珧OYޔgIll,-?GnnnλЍtOLj.n72j6 _(yx2T_8T`)VmIbwWTI-RvQP#vϱkƊvN%ђɄUo}H핦Nuo8F]:"mOp=3rȆ]FS1#F*D5ztk21Bқ{iƌUO5Am%1-kg_~}kmZݾ~׸W'/0dļT>GQ؋\^83{СNGHpN?B}Z#l2Ub5"fc؈qFTB^Ϝf}PV2ywvuYH+eb;F ,9򖏛2Z12PÿHqy`δ1rr*wIf%[Y:ke6@OkǼFbEhv=ݣ_{W뽧~&cDS/Y|MySu79f;/ gʅNYOyAF#iF7{oس1'ڝtFG0z8w~٬6b.LUGę^YF,Vdz5E؈g.}guO랲"~*JxF^Nl[͛87ePEL|ۈmgsA=EֿpmZ_mYO%I#?gExE{W(?bJ[J.kϴmSYͲ=cI;vV{gjlk}Ő){oQ}n_ΩɍzE?=վ(Z1NׁߋғE2Ce?lTﺷ~1>f9|Fhm?-h+Z?*‹_6Bc3eEWc^r<{"eFzI %;{kvFka󼭏~ƞrWoްyg\s;ǜ86 xˑkIؖvgnZ%i-KcĻ^mxV[rz9 6LdUepSL5؈V͋O1":PQ]i fϵ-wU̸oj0KQ#v)yvؘ뻘b}Y0g}$vEDY31soИщխgv6;捣3~geU#YEct{Fnsw8AQޣ|z~ߙ81:'H}vƴܞLu:XkWqJV"F9=yx}KYfQ{Wfz$]Ž}8rgV|0-t4-t#Z2O_SU'\&Qw#p6y- BTH13-0edK|G֨+4x=>e|Ğ_u*#4і2v1<[dL\@3cj1b_VYeO91q̛Z'eye3NOcҟJ[z};ح6KfW-X}+{Uc#Ǘǔә}C><=kFuθ݈_9Gk}8Gˆ[lU@> ۻL:7yαֱXY߲j)%|ňqUx"tۧ~ )jN>/ՐNf'mw:u vOr'Tch2l?`ݶn~:وЍKu~+ kDFD }FϡlV6j:^{;W:ё>q| V}{59Xnϥ6=j7"ExT^_ȈjVusFYMIVhVe_g_h3Z]Tf7R<[Ӟ,DڃŻ+3!vƶBNKW?ңA6gE汻CVѧGg|LNj/>|3>BR|یǚEU߸jQh^"fJgvU&ova5Fr,78F8QInZhcEt=ҞL+z2cX?+9Y'U&MKAQOv=T3hݎr:Wh-zhg$>k{wٳzW I"Np$K)C+dF y8Z^u7"Vruda34etQ;J9j"&Ϊ#9E)u`2[ߠۚ~~>j]=erW(Z3GG7(gʠ蝉WFY7fV^6ڬY=RZ<=}c4ϨIm^gM4g=uabQӝW;;~g? b%k\KY6mmcZ.e@_ܾ3yK{9gfۛO2W"&(h+Y 4VĿ#`mU wjL92Lۧ,"?ǧQF̋~ﻲZy)cڹwysQV{/jFWt3URyN?b$VˆG<%Ǜ޵$,H!wruX}m~9 QN+5;(Lx(as*Stkqߗ ;&EZfQ0>> m#'4Ɍ-A;SZFD+5eEn[wbM9,ѤQuib.]34F?Og]VYEqmfQgYǚt?ϹI2QOܙ/Ji_ؽ哅N"g\Q^#c1.Q0NE#ֳ,#>}<&our+2#C%$f{LF^/qnPJQԣ+z{tNB ͍"ea?wґE#?1e?)G[)Gz.3_Qojo{$v.x**vbCV2s9v+ufcinO2f5rLr*ФL\Z$~VJ(6O3o˄{{&;Gx~2Oq}gʹ-Cx̞lul^Two7wƓl'EtR_IFS|IYQ|՞x;N:-9~N{uהE䌗lwZSb"/S+c&1mE6eDUɲ2g^f\8ŦȻl%uw^w" ,"r14mf1ShUpL_emY$3LozĹOgl] ynXGh<*ߔ'3iB/$2C%5`V$p(U3qKh﷍D5MS)z\?ɲ~aWQȟJBkyS]^Zj:L|ˆw]ehRwv_|x#]Ho̸W#>wo(s.$=Sf]c5m꽦f5=p׸ȧKYַXvvUh{b.ک*9Jdǒ}!Otzk)փɢەjgωw3_yX+Ŭ.떍O(Z痛>?wm]V}u]<$Z".bxJӪtʅ]iŊS|LyLYnJ\ɼgE)=v&3m=0W44Kּ5oèͣ|26ŕFTeo|SwnC~}[ydtfδK&nh_DL`S}NCY{K.B݄#k -'iCkjʑuf> dtKђVl*~ɫv4R *Uؒu5ܝ -2J csgIig\[v硱-E;cdJ晴/Tp{=#WosڲY@Vj(2pdzEGoTZ|I֫d%LZr&2?)?=\rAzoܴd'&gW9_B%a"{Dr8g`l?d\GdZvθV8X%^~Gk,$k. @}ʿn\KPҤ;Çh#,Rx}3c<(3PꑖO]b\XjX ,x}NqZ湗]%4_?v nuVM}w hK˼ȯmX/[&Zm̗LMk XqvC:y@N.] Xkh t_⛈OȔ?>[ : ;szO.NuĒԓ:Xo"}"ko%V˪GEv4)+MҥM۲K3<Y,K{^awq!{$A( }LǙtos aAÜ[L]|~݋B7UMzsk m:zĵm?,AMh9뉯anHN5`p+n"gFY}0AhCv MS2osAև$f\Y`Ez^;srrvjB_dqrkS{T֏%^?ϗf,`C֮H{Hx^[@g >׿iS,hعX՚5Qo*mI^ك "oe̕ be bԗ#ue;E.h#u(v!L4i1r\s~{gߛk|ct*PSY4U2Z{]6gzĞ>Q.k(9oA~&.Y{uca0m™&&#eJnDp%{7&| ] 1|XiQKƊQwVX\2cO6?vGAJ.8>㹃~Sk2^g֩dk_#cA"w`C$ޣ%]ǧw2UtSzg[;Xݲ %W|_9OoM{Xĵ]ջ[ |?:Ihu`wc-W!;K0 )~ZcOJLKۜmghs1/yLr8 =Z5#K=8G~_K(ق*;>yhDkd}5A"Ξ{hGјh[&c`:>]#RgmGE  k/_}Ans@}d=oF-c =]6`ZD?d~]A`Ur|< WVd^Y!z6XA6g~owtpΆayCyS}Ҋe498I\O V)=zu/ vPlkl}:gklJVIpM4݂F({xdjc*ӄqZՖxqj&:XAk ?MބF6Q_>MK8 XAq j2zluV˴<%Hvu湂Ȇ6%3cX[n"LU$DFxDl~"zo/9J0rjT%9\Pys-Y=c30M2Z`Zm{%zWk%<kq}d,]ÃhSU?JcOY!5`g?fKWzY:Rvvm22Mcx933LE? cShwYmZ Y*v_sd 'Mb#k%*o'VxcK]ۤ6Cc28Msu"lVx`K3 /|rҵץ WJ_lqXl{5l{ȺV#,SF(a>vӖƾZZq^gIw9[8KUВGod{{ #e,JϭsL zߘiJ~2`,Q6hB0Zq7wb=oA7%Ӧie.kȉ9X*^s_mof*?)猺ᕍ|AzgMO3|qtf\>]L-jv~k`־hɴkUue[Aن i{<=JG%34H_}L\ٓd4*H~r/A^^nh +s dVq D.Wr-D #mydFe ]2TFxqJZ(3N.e )1l| V+甛|vw]c%S:cvN6xjm%SCᅽӂtc$ّ]dOjώY/ɞrf})U2}界l9d:CuFᇖԔvV]^^%SqɈcl$%)[˺F;ue:6o?xQM} XuN9vT5cY2zG?Vlk˓x5eJNc˭s.CV+$niSRB{4slsnFYc؅+v_*}zGεwƁiIqb>.kLG=YŖAqjm0}t;gG̻z /#`Yu]u1޼\%òФ23L2׎&yNJƏ|T%7Ai#WK=[DӖиAj5oD&{βF}FtjO3@쏖J):M}Czg^}SǑg=Ax3g`Z-Q<&,~fhm"Mx13i와{٣mD31음~?eo3C'_QO~Fҷ2L#ٖ<";ilzwGڍ>̗<֣Tћ{NF+>O!q2a1e,cDK)9DG{]}3`} 5%Rl˓L?-QzM*?evG'/x}Yv:C+;YƊ-Ŏ"̄4Xwg;v0kCA~Q߃'_M>b>y-l]?_u]݄,xq{wdG?$K9>Xu=ZǴ\`g疌NhXchdb,hgEx8aͨ3|с Hrgv1v=[1L콠܂Rr, G>#$l<9^қurduTI(|q&2V [Q+kΠԗcG_f+x28|Eza)j˜>^ɴ}buWm yAjo9Ǹ1CXcL Z*$WE)MU50q87ZZ#y#L)lɴ2X31:=O@3qZw||lWjq5zwg)?m7aY$"/xmMRLKO'_N B~>ヘ,3K𼖧祌;OuNeu f,ɹ39/N|HV,F' ^3pɶ9L{߶Id|n^3 MYݛWm3{`vj =a}&~UHFLk@u)sϛlX_OSU2uz_hmט''''/Abq{5{fLM<,ڻǣvOy~x"у{Gډ#*3zg ?;k91>5dB\FS"i` 5y n՞, Χ-b;!w r{k_U*#>ZfD]lM+eA|뫼UG߱d|ny_ׄ7iR]<&F?Smi%y\W,wno/)HgdJ.*ι&wADDvwRe:kZU]ZԬtɴ߱{j iNT=g˃fpJs-5#\蝯xZzoJtIhd$|ΧT2,M%_͵L1k{}\sgwy^s4>h昘dǽQYJ{~S^ ojG"G{&3_ثځFz~2-KFSr25ygES %JM >=SZۈS&#gC5== s咽+kKߡtg?1KjQEOޒ]Uc%5-wݭՑ%31 Wg&-qV G[_g[_9Œk#%4f63˗s\o_;{l_֗v(⍛A9}>kw籒QBAw]no^5:=9?##fһs%_ 3kA*GG~vtpFAY5Y2a</*WV3ǻ| ț4Iζ~h)_]S~Gj&ʡ#JƓVսd|oMF FW eg+YTz=DقM\puP0q,\Q4=dI56IW˺fOwz~2Z;N/~^Jn2vF4qb}k2cӌ7 ?!hLK,]z} ү )^WOSX}nkyɴ0[X}m›4t9G̬dL` 2}V,҄]9Ysj_ϙWkZF}dVǨ7airMek* F5^_}%Y^;,3ע;w\,=M#5wGOL;)nMy%l몿H}c3"A}OňqO3XwW4 +{KD2N%y[vzVXq=,:G=$bZ^ ^ >.FV&^Lj-~X+:W+2g0IYv ҝk%;'3$TMr:ix}U0i9 h&J455{qO(EɔI=,.N^g4]v21Hh26ߑG23gWT&F|[L ֈ3|XHm }Yɮ)#[gvwf ׯyuP?{ {ML*ֲJʈ ḧmܵ=NX2'2:S3 Vm{UaM'l0WX&I %o)\%;tA^g VM8Sg6anKjBq=_^'/FL{z-߼dՂJm3Ȫd[1i.QAr~SmC.e:*.3vq^ gf d[{-AZo)Et%(V6d7O՗B7QxtE56h=)}Og8Aod|XV|Z@Sgs`aÛ{=9!Vt)fڐn%}9#d4SkxH*Kw6e9XpMGݱ?u±W6Zko]JƳk.dR6d}eMhۤ6yWQskL!llҳyU&=5䵒dƜi —+s5T.dDX h kh7£&'Ύ{0ּ3!vfSeYeμ]qVz,+M-9|I|DyQdO0G&񀶨 z'dz8Irs^[ Z=Lƞi֬( [zd}O-OiVԘg0^.ҭEK̋x`ƶ嫓㯈G4A5)KGh_?OYm4iM Euh; J>ն,MrYmN%>M؀ ҝ>'|j[~[6۷zG.I ?V%V*(2wX+̝}}-wO|ݚVf5._i 鴋{ zpDFӻu.F׫ %Ӯf`Ǘ+qU;LChfes*d0>c0b;41jJ^Bޞ{ljT8gPĚ乗dFbJUZM@VkTMPmJ:S\2hf L]GIk:!st3͎pNƳϱm+I`l50G [ְ:B4||6bȴ/ݾY R}gGcDESĈ<4b-үVa);L/qԃU{ J9ela+򛫳i̓xGv0}t-]]2:m洺"J ;$r O-r{m?f}w &z~S3c+Kqdib,gΗ_̻d nݕ.cre`FZ*o1wZFzOjuZ}W|G# [8:2i$%\k]MLtT`|W|icșr>sQe2>!,n{v2wҕ'#UzKfUUѾ{a|ŕ~H:E֦;Ǽ{>v4ygF9t~P&4ggd`ԼN~Ev7"Uhү/yۚ/JFy-Z,;_ 2}}΅]g͸^,Si3^5h906z:{w33;-JƲ,dg2VeƲdn>޶{\#@I%޿3{ L{){_?pc]xz"KhM4X!_1r>TDM/y;{q0%*"~ &V;h)M}#󾹶_=.s?ŗskN(F.^Uw%P/YrS_in9hJ d~ tl G Ǚ+AoDװܥs•L EWu* iM3wnBx7kIϞnVGBWxtEqƖ; Vj\+ęp׃nTĈ;4)TzKELd)QSk8gdAw_A5QR mJr{.֜ +9I߸Ml,?ܟ{`JׄKn|Tx̋`FZ-ެ tU%sǏAZ%s|4 l\aJl~|5>'}&>W'y W'WsIh ү\ RzOG>t¬jރק2_n^GkB(rxκ6rin#T5v]s]udZN krjHYUߧk3>=]rH LeYu ȣκd|5 4xT̚3# =/V6r_4튤Ό 0_'Iǹo(OھF:.:KR-wLC/qĨ(]4zCkYsr,Yek#֜Q Z(BϬ7ѧ78QULd_l k~`Ւz,?LWKj*ve%.X:r&Ԕ:ʜ̙ff^se)h\K/k§~ ;2X߭ɖ4^ɪ#Y+%Sֻ$=wg%t尹-5ʫ)޽I5JFȃuD`=s]{2~ꗒU'K(S|5"dTW(陏 ,̎Wk Ϲ_g`ݵdj=8Y^Z-wOv[߃м:Iքn-i"اs2] ķЁA]o)#X5fCoQڄ;EvdF/if= @)gIvynֶ+X1km] `tz|Lc0=%㔂h1:Ɩ_Tn:ȾIo_ȇ/`@d7*K2^gֶ>'dK%2H튙E&?a"J1= ggkE"gsg Ri*q&ebG%Uj[hXiF\D.͒lGsShI'_E#{di<[d{=,ό'[X=K0vњAΦ[2)㞣*Yov\zx+*Ke2-Yw}oR2#S&}`l{Xᙽ~QS3Ed}YԾ=rh?rhlߑMlCA2_J۪j⅃џGepw`>Xm#KǍ$c<"+MX诙#HoEDd

    FFFÇ?XbH,, xl 6mt={̟?ԩS@@mvui=o5 ȑ#ׯ˻xC\\\/b7olٲv#K|nnn322T!¢vIIIZ0 y-BȣGT͛i=(~0Hƍ1cF``4h;wꃐ4VZ:tի+WwUBr#"i0T...[8$ m̙Eg9G46IIIׯ_oӦ!i0lcǎULLL:t\T(...׏qY|.6sŧzNN\tiFFƲev訕@H?'2݆?Uݙ?~љUTaYv 'F{.))ֶrʪA:88h1ŋE=zH*r:cƌ͛k=0`&M?nݺuO>=!!A뱐4gϞ,`ʕ+B[ni=fnnnbbR蝖ZUV&ٳ'99YfZ ! D"y͛7kcc󼥥g}FsM0s4i0l>{!i0lW(<`ؖ.]@8PѬ]622Rř?{ׯ_LJJx񢙙ٜ9s I{/ƍP]v5iM40WWב#GvA}\.]vc!i0`nnnSdccXH UgddB͛ū($ ŋ:tm___-߼yIh 4T@r654r1I%yaŋmmmI@owTsێ. iӦM{qvv^paڵW^ݪU5jh=yݻwϝ;K.K,!iӦ%%%i=\V;6,99`̙>>>wz,=% rхgff޿??? BSSS9duy!.==]4lݺʪK.jOTf{{:8::|̘1Dp#G|7^^^nݪU!XPה*Çoժ[YYiԛ4GRQ U+*JcccRqqFFFԈ:0+VG* W^~}FQFjߟh>ov۶m[lT3U޽+tF߾} mgɒ%0ƊĭEWNW%E]R]).ŕPt(\ Z#"#.Q9% -~,}p-O$" h|:>ŋުRjF=|PIot҆ ݻ1BZlyewnn;w7oN@Oe(((tqqz,' _hYp!!?… ###G]v-Z4RZuу211[njSNVEW^9s={Ν;Н'"s ͫZ*+WҋinjӡCy_Oj:q@^^Mf:0Ripppxx#G۶m+rQ!jlvyYZZO>K.Z\ٳgO85jXnʕ+/_kB`?н{w՜ƍ7iĀ_ =g6==]ӧnլYz̙ل?{,88X뱐40LaÆBܹsܹ~z{{{Bu477uB~GlILa;|˗/ !:Ct۷o!~0l׮]fypd|™lٲ[nzM6Op)I&߿ʕ+]߿XH ,Xcii5i$__ߛ7oj=&$},˲c!i0`~~~YYY͋'O>mԨc!i0`fff֭{͹s!˗/wuuz,=`تW>qDoooB˚5ktg ی3⋔N:uqԩ??_G4vڭ_ȑ#ׯo߾ٳI@EljXaq;("8Nt}D(RBIxe0#*-,uW!?ݗBcߝ/\)%A FoW( dD"rڛE(J4MJ%q2Lo B J5-'0 BDrJR4!4BuHeEc4%z2#4-C?>Xbcdd$|i&$BR' OdRYuU3J̿hr%S+ ,iШC3#"DE(ZhbpeOK=/&lS>⚯Dt0FYs<Lo`I<|B H@$ IA iA4 H@{4@y|R41~4h8oU^F{U I_a)yjeh~+I䂔j&h{ I4{*ϑ,u HmB5YŊG~A4 H@yM7{ǫ)`B ?O̙3ٳg7^d5@?ǞY=kZtLCnnn&M!}]ddd׮]z4H>裝iؽ{;$'|t֭ 4 @4\vCbooߨQׯ=ʭv͛7~~~Ioߪ/0k֬[nϩUV~~+Bsx_7p,[ʦR$<4͟S 0Ih}||>||Qʕ4 2… ϟ?'iiizB{[3g6jԨv<عs%O;wѣ={V^=[[[4@yrYrʕ+? A iA4 H@es _>G]˙ 4}**)óWr^"GVS֭رcPPԩS̬I&5nxРAQQQ,@ǭ]688q'NLMMJ˛7oޭ[W/bYk׮j޽{۵k׶mݻwfT FQCMHHHTl1`С=R w4hгgϛ7o~ߖBGѠAvرCÇ `-o>"ٳgO9:_Gv100pϟ?Q:uҥKu=|֬Y޻TA>ZS 1bjNNN>ܲeK:?22xܹZɓ55yd''m۶=zAZR*<Ϸnݺe˖6lXJ5V%Ce˖9::n۶?hԨQ֭o{޽ .422-=!d׮]tr޽[lٲe޽{K/pժU6mRbBرc0wQQܿlܸqOo߿ ~~~:u:qƍt7| ooosss .TTw5>ILLիW:ugBJ:|BΟ?/ɖ.]گ_?WW׬,O#GB&LPz-}Q7nah4ihӦ;j-[Uq󩩩R4,,QFۗ.s% ˲IHH }ݻw%Irr2Jz6l(ժUn۷oB222233Ξ=K8pذa<ϗT M]|Q4ԫWo+Vԭ[Q}dgϞ_R3[ zAG2nܸO>D5駟?^w&Hrrrѣ?3  -['ᣑo.AGRKw2l0722tWreJIDATUҠIÆ >(ZG?O\x#FϼvZ55~:!?ܹ3]e˖Dž ;rVZIz+`NN4hPR%B0:t?K)p?C޽666<(((hݺ5駟͖T ~ذa;w477srrr;uD';vSR1{51iڵʢm/ LUHݺuǍdtuT!nnnGQ5trrsgϞ͟?_5Gw˗^^^駟nܸAgthjŊ !z\\\޾}KW\YuDvttLLLY++7W?> A B*WL7[R1իWʕ=ڣG#FlݺU*yQ Ņ+1bĐ!CZl^tkpĒѐS*y9sj׮ML%.UѣK>x U{=!|MӦM!^GÇӧ۷O>QQQv矯\Ү]nVwG+tT!%tW!jװa ԨQCwÇtRss &>iii_˗5k^|YG4#''G[lnnn5ŝaaa6mھ}{:>r|֬Y;t۷_5jn$8;;ot%CSm۶]lYXXӧϝ;Th/*U$HJ*@JrɁk׮]jUffSvDQmsI^zf͢Ǎ VR3TһtT!ԪUɓ'C 3u]!~֭[Ν;yd ݻwťZСC bժU>_~ꮄ ܺuKGGtW!t]!-z*˲?ϔ)Swܹjժϟ߫Vy^GiѢEtrȑϟ?OOOݧ!iÇU=-4?11155G-5GV='22RLdd$lI(##tΎLKK +;##ߗ山O>urrTHddSI… /^TMrgggWR3T .UիWGsݽ ٺuޮ];ڻJFt1| ƍ u0 -tQ!tT!mڴ9}4["TR~h|'ִedd{|o>%,,,t}؈#w),ĉVz]+{Μ9Egfwdgg[ZZ=z/^+K*p}ԩSFFFիo޼!QFuET*Ν;嗪C;vXYYzڵk/Zf*F/TLUHnݺv޻bbbtW!7o411guQwGݙ3gTwOn4idРArǏ~Z?G#7oV{BGRKw2tN:}z衟-HFY`uf,-->Lg޽{6lYCCCjt =zҲys-]p_L%CtW!%Q;88ԪUK} fGԫWOz>BJ yŋqqqbTQR5k_#B H@%%%###//o2 C`u)ufffnnneZAAA\\h\r48p􌍍رu}$4kLš6m*9\xbXFBٳ#"":IA۩S'7B||MٷӨQE>>9887iD}I& 666eߎT*U>5kܹs ! m۶w;vڵksssG<}t Z[[lݺUHe˖-[ 4pttٳgzz={֭kmmݦMW^%322ƏeeeU~Ç9$ _xxxDD!K. 0j֭ןÇ6mZvy.\xZjW 2e ]r2dȚ5k*Uԯ_?ZH(>3)@ZhfΝw|^^!dذat~FF!>cce˖<glln:F&L`jj]h<7 4t>322z 5jTjxW*s̡󳳳tr):{zz5i X[[&mmm[3]&?}?ڵkWB*Uz>0۷o ˳8ydΝ:BwR{cEtt4!ZjEyVO9tPʕ `mmݢE[|P 33ϟ࠭ջuVLLŋ80zׯ_/\PnL?///==>|8sLa#G<{l۶mϝ;(ϐ4@1ڴiSn>DŽǏ2ݻwz9gΜT*o߾<@y0LHHT*UEZwء[ZZ_vvvAAA...˗/G#<(𨨨*U4nܸ&'D<۷iذjYvލwO7JdddԨQFh+Wڵ+P ЂϞ=yE>}Hi gL+˾5SSS-{{{-@yk@< iA4 H@$ IA iAL62IENDB`starpu-1.2.3+dfsg/doc/doxygen/chapters/images/parallel_worker2.eps000066400000000000000000000745351320135501600252440ustar00rootroot00000000000000%!PS-Adobe-3.0 EPSF-3.0 %Produced by poppler pdftops version: 0.32.0 (http://poppler.freedesktop.org) %%Creator: cairo 1.14.2 (http://cairographics.org) %%LanguageLevel: 2 %%DocumentSuppliedResources: (atend) %%BoundingBox: 0 0 88 82 %%HiResBoundingBox: 0 0 87.961258 81.24324 %%DocumentSuppliedResources: (atend) %%EndComments %%BeginProlog %%BeginResource: procset xpdf 3.00 0 %%Copyright: Copyright 1996-2011 Glyph & Cog, LLC /xpdf 75 dict def xpdf begin % PDF special state /pdfDictSize 15 def /pdfSetup { /setpagedevice where { pop 2 dict begin /Policies 1 dict dup begin /PageSize 6 def end def { /Duplex true def } if currentdict end setpagedevice } { pop } ifelse } def /pdfSetupPaper { % Change paper size, but only if different from previous paper size otherwise % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size % so we use the same when checking if the size changes. /setpagedevice where { pop currentpagedevice /PageSize known { 2 copy currentpagedevice /PageSize get aload pop exch 4 1 roll sub abs 5 gt 3 1 roll sub abs 5 gt or } { true } ifelse { 2 array astore 2 dict begin /PageSize exch def /ImagingBBox null def currentdict end setpagedevice } { pop pop } ifelse } { pop } ifelse } def /pdfStartPage { pdfDictSize dict begin /pdfFillCS [] def /pdfFillXform {} def /pdfStrokeCS [] def /pdfStrokeXform {} def /pdfFill [0] def /pdfStroke [0] def /pdfFillOP false def /pdfStrokeOP false def /pdfLastFill false def /pdfLastStroke false def /pdfTextMat [1 0 0 1 0 0] def /pdfFontSize 0 def /pdfCharSpacing 0 def /pdfTextRender 0 def /pdfPatternCS false def /pdfTextRise 0 def /pdfWordSpacing 0 def /pdfHorizScaling 1 def /pdfTextClipPath [] def } def /pdfEndPage { end } def % PDF color state /cs { /pdfFillXform exch def dup /pdfFillCS exch def setcolorspace } def /CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def setcolorspace } def /sc { pdfLastFill not { pdfFillCS setcolorspace } if dup /pdfFill exch def aload pop pdfFillXform setcolor /pdfLastFill true def /pdfLastStroke false def } def /SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if dup /pdfStroke exch def aload pop pdfStrokeXform setcolor /pdfLastStroke true def /pdfLastFill false def } def /op { /pdfFillOP exch def pdfLastFill { pdfFillOP setoverprint } if } def /OP { /pdfStrokeOP exch def pdfLastStroke { pdfStrokeOP setoverprint } if } def /fCol { pdfLastFill not { pdfFillCS setcolorspace pdfFill aload pop pdfFillXform setcolor pdfFillOP setoverprint /pdfLastFill true def /pdfLastStroke false def } if } def /sCol { pdfLastStroke not { pdfStrokeCS setcolorspace pdfStroke aload pop pdfStrokeXform setcolor pdfStrokeOP setoverprint /pdfLastStroke true def /pdfLastFill false def } if } def % build a font /pdfMakeFont { 4 3 roll findfont 4 2 roll matrix scale makefont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /Encoding exch def currentdict end definefont pop } def /pdfMakeFont16 { exch findfont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /WMode exch def currentdict end definefont pop } def % graphics state operators /q { gsave pdfDictSize dict begin } def /Q { end grestore /pdfLastFill where { pop pdfLastFill { pdfFillOP setoverprint } { pdfStrokeOP setoverprint } ifelse } if } def /cm { concat } def /d { setdash } def /i { setflat } def /j { setlinejoin } def /J { setlinecap } def /M { setmiterlimit } def /w { setlinewidth } def % path segment operators /m { moveto } def /l { lineto } def /c { curveto } def /re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath } def /h { closepath } def % path painting operators /S { sCol stroke } def /Sf { fCol stroke } def /f { fCol fill } def /f* { fCol eofill } def % clipping operators /W { clip newpath } def /W* { eoclip newpath } def /Ws { strokepath clip newpath } def % text state operators /Tc { /pdfCharSpacing exch def } def /Tf { dup /pdfFontSize exch def dup pdfHorizScaling mul exch matrix scale pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put exch findfont exch makefont setfont } def /Tr { /pdfTextRender exch def } def /Tp { /pdfPatternCS exch def } def /Ts { /pdfTextRise exch def } def /Tw { /pdfWordSpacing exch def } def /Tz { /pdfHorizScaling exch def } def % text positioning operators /Td { pdfTextMat transform moveto } def /Tm { /pdfTextMat exch def } def % text string operators /xyshow where { pop /xyshow2 { dup length array 0 2 2 index length 1 sub { 2 index 1 index 2 copy get 3 1 roll 1 add get pdfTextMat dtransform 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put } for exch pop xyshow } def }{ /xyshow2 { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval show moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval show moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /cshow where { pop /xycp { 0 3 2 roll { pop pop currentpoint 3 2 roll 1 string dup 0 4 3 roll put false charpath moveto 2 copy get 2 index 2 index 1 add get pdfTextMat dtransform rmoveto 2 add } exch cshow pop pop } def }{ /xycp { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval false charpath moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval false charpath moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /Tj { fCol 0 pdfTextRise pdfTextMat dtransform rmoveto currentpoint 4 2 roll pdfTextRender 1 and 0 eq { 2 copy xyshow2 } if pdfTextRender 3 and dup 1 eq exch 2 eq or { 3 index 3 index moveto 2 copy currentfont /FontType get 3 eq { fCol } { sCol } ifelse xycp currentpoint stroke moveto } if pdfTextRender 4 and 0 ne { 4 2 roll moveto xycp /pdfTextClipPath [ pdfTextClipPath aload pop {/moveto cvx} {/lineto cvx} {/curveto cvx} {/closepath cvx} pathforall ] def currentpoint newpath moveto } { pop pop pop pop } ifelse 0 pdfTextRise neg pdfTextMat dtransform rmoveto } def /TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 pdfTextMat dtransform rmoveto } def /TJmV { 0.001 mul pdfFontSize mul neg 0 exch pdfTextMat dtransform rmoveto } def /Tclip { pdfTextClipPath cvx exec clip newpath /pdfTextClipPath [] def } def /Tclip* { pdfTextClipPath cvx exec eoclip newpath /pdfTextClipPath [] def } def % Level 2/3 image operators /pdfImBuf 100 string def /pdfImStr { 2 copy exch length lt { 2 copy get exch 1 add exch } { () } ifelse } def /skipEOD { { currentfile pdfImBuf readline not { pop exit } if (%-EOD-) eq { exit } if } loop } def /pdfIm { image skipEOD } def /pdfImM { fCol imagemask skipEOD } def /pr { 2 index 2 index 3 2 roll putinterval 4 add } def /pdfImClip { gsave 0 2 4 index length 1 sub { dup 4 index exch 2 copy get 5 index div put 1 add 3 index exch 2 copy get 3 index div put } for pop pop rectclip } def /pdfImClipEnd { grestore } def % shading operators /colordelta { false 0 1 3 index length 1 sub { dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { pop true } if } for exch pop exch pop } def /funcCol { func n array astore } def /funcSH { dup 0 eq { true } { dup 6 eq { false } { 4 index 4 index funcCol dup 6 index 4 index funcCol dup 3 1 roll colordelta 3 1 roll 5 index 5 index funcCol dup 3 1 roll colordelta 3 1 roll 6 index 8 index funcCol dup 3 1 roll colordelta 3 1 roll colordelta or or or } ifelse } ifelse { 1 add 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch 6 index 6 index 4 index 4 index 4 index funcSH 2 index 6 index 6 index 4 index 4 index funcSH 6 index 2 index 4 index 6 index 4 index funcSH 5 3 roll 3 2 roll funcSH pop pop } { pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul funcCol sc dup 4 index exch mat transform m 3 index 3 index mat transform l 1 index 3 index mat transform l mat transform l pop pop h f* } ifelse } def /axialCol { dup 0 lt { pop t0 } { dup 1 gt { pop t1 } { dt mul t0 add } ifelse } ifelse func n array astore } def /axialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index axialCol 2 index axialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index axialSH exch 3 2 roll axialSH } { pop 2 copy add 0.5 mul axialCol sc exch dup dx mul x0 add exch dy mul y0 add 3 2 roll dup dx mul x0 add exch dy mul y0 add dx abs dy abs ge { 2 copy yMin sub dy mul dx div add yMin m yMax sub dy mul dx div add yMax l 2 copy yMax sub dy mul dx div add yMax l yMin sub dy mul dx div add yMin l h f* } { exch 2 copy xMin sub dx mul dy div add xMin exch m xMax sub dx mul dy div add xMax exch l exch 2 copy xMax sub dx mul dy div add xMax exch l xMin sub dx mul dy div add xMin exch l h f* } ifelse } ifelse } def /radialCol { dup t0 lt { pop t0 } { dup t1 gt { pop t1 } if } ifelse func n array astore } def /radialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index dt mul t0 add radialCol 2 index dt mul t0 add radialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index radialSH exch 3 2 roll radialSH } { pop 2 copy add 0.5 mul dt mul t0 add radialCol sc encl { exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 0 360 arc h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 360 0 arcn h f } { 2 copy dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arcn dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arcn h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arc dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arc h f } ifelse } ifelse } def end %%EndResource %%EndProlog %%BeginSetup xpdf begin %%BeginResource: font GMYFIE+DejaVuSans %!PS-TrueTypeFont- 1 10 dict begin /FontName /GMYFIE+DejaVuSans def /FontType 42 def /FontMatrix [1 0 0 1 0 0] def /FontBBox [-2090 -948 3673 2524] def /PaintType 0 def /Encoding 256 array dup 0 /.notdef put dup 1 /.notdef put dup 2 /.notdef put dup 3 /.notdef put dup 4 /.notdef put dup 5 /.notdef put dup 6 /.notdef put dup 7 /.notdef put dup 8 /.notdef put dup 9 /.notdef put dup 10 /.notdef put dup 11 /.notdef put dup 12 /.notdef put dup 13 /.notdef put dup 14 /.notdef put dup 15 /.notdef put dup 16 /.notdef put dup 17 /.notdef put dup 18 /.notdef put dup 19 /.notdef put dup 20 /.notdef put dup 21 /.notdef put dup 22 /.notdef put dup 23 /.notdef put dup 24 /.notdef put dup 25 /.notdef put dup 26 /.notdef put dup 27 /.notdef put dup 28 /.notdef put dup 29 /.notdef put dup 30 /.notdef put dup 31 /.notdef put dup 32 /space put dup 33 /exclam put dup 34 /quotedbl put dup 35 /numbersign put dup 36 /dollar put dup 37 /percent put dup 38 /ampersand put dup 39 /quotesingle put dup 40 /parenleft put dup 41 /parenright put dup 42 /asterisk put dup 43 /plus put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 60 /less put dup 61 /equal put dup 62 /greater put dup 63 /question put dup 64 /at put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 90 /Z put dup 91 /bracketleft put dup 92 /backslash put dup 93 /bracketright put dup 94 /asciicircum put dup 95 /underscore put dup 96 /grave put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /braceleft put dup 124 /bar put dup 125 /braceright put dup 126 /asciitilde put dup 127 /bullet put dup 128 /Euro put dup 129 /bullet put dup 130 /quotesinglbase put dup 131 /florin put dup 132 /quotedblbase put dup 133 /ellipsis put dup 134 /dagger put dup 135 /daggerdbl put dup 136 /circumflex put dup 137 /perthousand put dup 138 /Scaron put dup 139 /guilsinglleft put dup 140 /OE put dup 141 /bullet put dup 142 /Zcaron put dup 143 /bullet put dup 144 /bullet put dup 145 /quoteleft put dup 146 /quoteright put dup 147 /quotedblleft put dup 148 /quotedblright put dup 149 /bullet put dup 150 /endash put dup 151 /emdash put dup 152 /tilde put dup 153 /trademark put dup 154 /scaron put dup 155 /guilsinglright put dup 156 /oe put dup 157 /bullet put dup 158 /zcaron put dup 159 /Ydieresis put dup 160 /space put dup 161 /exclamdown put dup 162 /cent put dup 163 /sterling put dup 164 /currency put dup 165 /yen put dup 166 /brokenbar put dup 167 /section put dup 168 /dieresis put dup 169 /copyright put dup 170 /ordfeminine put dup 171 /guillemotleft put dup 172 /logicalnot put dup 173 /hyphen put dup 174 /registered put dup 175 /macron put dup 176 /degree put dup 177 /plusminus put dup 178 /twosuperior put dup 179 /threesuperior put dup 180 /acute put dup 181 /mu put dup 182 /paragraph put dup 183 /periodcentered put dup 184 /cedilla put dup 185 /onesuperior put dup 186 /ordmasculine put dup 187 /guillemotright put dup 188 /onequarter put dup 189 /onehalf put dup 190 /threequarters put dup 191 /questiondown put dup 192 /Agrave put dup 193 /Aacute put dup 194 /Acircumflex put dup 195 /Atilde put dup 196 /Adieresis put dup 197 /Aring put dup 198 /AE put dup 199 /Ccedilla put dup 200 /Egrave put dup 201 /Eacute put dup 202 /Ecircumflex put dup 203 /Edieresis put dup 204 /Igrave put dup 205 /Iacute put dup 206 /Icircumflex put dup 207 /Idieresis put dup 208 /Eth put dup 209 /Ntilde put dup 210 /Ograve put dup 211 /Oacute put dup 212 /Ocircumflex put dup 213 /Otilde put dup 214 /Odieresis put dup 215 /multiply put dup 216 /Oslash put dup 217 /Ugrave put dup 218 /Uacute put dup 219 /Ucircumflex put dup 220 /Udieresis put dup 221 /Yacute put dup 222 /Thorn put dup 223 /germandbls put dup 224 /agrave put dup 225 /aacute put dup 226 /acircumflex put dup 227 /atilde put dup 228 /adieresis put dup 229 /aring put dup 230 /ae put dup 231 /ccedilla put dup 232 /egrave put dup 233 /eacute put dup 234 /ecircumflex put dup 235 /edieresis put dup 236 /igrave put dup 237 /iacute put dup 238 /icircumflex put dup 239 /idieresis put dup 240 /eth put dup 241 /ntilde put dup 242 /ograve put dup 243 /oacute put dup 244 /ocircumflex put dup 245 /otilde put dup 246 /odieresis put dup 247 /divide put dup 248 /oslash put dup 249 /ugrave put dup 250 /uacute put dup 251 /ucircumflex put dup 252 /udieresis put dup 253 /yacute put dup 254 /thorn put dup 255 /ydieresis put readonly def /CharStrings 256 dict dup begin /.notdef 0 def /U 3 def /P 2 def /C 1 def end readonly def /sfnts [ <0001000000090080000300106376742000691d390000009c000001fe6670676d 7134766a0000029c000000ab676c796694328f4900000348000001e068656164 0862f3530000052800000036686865610d9f07710000056000000024686d7478 1511025400000584000000106c6f63610000045c00000594000000146d617870 04710671000005a800000020707265703b07f100000005c80000056800> <013500b800cb00cb00c100aa009c01a600b800660000007100cb00a002b20085 007500b800c301cb0189022d00cb00a600f000d300aa008700cb03aa0400014a 003300cb000000d9050200f4015400b4009c01390114013907060400044e04b4 045204b804e704cd0037047304cd04600473013303a2055605a60556053903c5 021200c9001f00b801df007300ba03e9033303bc0444040e00df03cd03aa00e5 03aa0404000000cb008f00a4007b00b80014016f007f027b0252008f00c705cd 009a009a006f00cb00cd019e01d300f000ba018300d5009803040248009e01d5 00c100cb00f600830354027f00000333026600d300c700a400cd008f009a0073 040005d5010a00fe022b00a400b4009c00000062009c0000001d032d05d505d5 05d505f0007f007b005400a406b80614072301d300b800cb00a601c301ec0693 00a000d3035c037103db0185042304a80448008f0139011401390360008f05d5 019a0614072306660179046004600460047b009c00000277046001aa00e90460 0762007b00c5007f027b000000b4025205cd006600bc00660077061000cd013b 01850389008f007b0000001d00cd074a042f009c009c0000077d006f0000006f 0335006a006f007b00ae00b2002d0396008f027b00f600830354063705f6008f 009c04e10266008f018d02f600cd03440029006604ee0073000014000096000000> <00020066fe96046605a400030007001a400c04fb0006fb0108057f0204002fc4 d4ec310010d4ecd4ec301311211125211121660400fc73031bfce5fe96070ef8 f272062900> <00010073ffe3052705f000190036401a0da10eae0a951101a100ae0495179111 8c1a07190d003014101a10fcec32ec310010e4f4ecf4ec10eef6ee30b40f1b1f 1b02015d01152e0123200011100021323637150e012320001110002132160527 66e782ff00fef00110010082e7666aed84feadfe7a0186015386ed0562d55f5e fec7fed8fed9fec75e5fd34848019f01670168019f47000000> <000200c90000048d05d500080013003a40180195100095098112100a08020400 05190d3f11001c09041410fcec32fcec11173931002ff4ecd4ec30400b0f151f 153f155f15af1505015d011133323635342623252132041514042b0111230193 fe8d9a9a8dfe3801c8fb0101fefffbfeca052ffdcf92878692a6e3dbdde2fda800> <000100b2ffe3052905d50011004040160802110b0005950e8c09008112081c0a 38011c00411210fc4bb0105458b90000ffc03859ecfcec310010e432f4ec1139 3939393001b61f138f139f13035d133311141633323635113311100021200011 b2cbaec3c2aecbfedffee6fee5fedf05d5fc75f0d3d3f0038bfc5cfedcfed601 2a01240000> <00010000000259991c1973f85f0f3cf5001f080000000000d180a74a00000000 d180a74af7d6fc4c0e5909dc00000008000000010000000000> <00010000076dfe1d00000efef7d6fa510e590001000000000000000000000000 0000000400> <04cd00660596007304d300c905db00b200> <0000000000000044000000dc0000015c000001e000> <0001000000040354002b0068000c00020010009900080000041502160008000400> ] def FontName currentdict end definefont pop %%EndResource /F5_0 /GMYFIE+DejaVuSans 1 1 [ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash /zero/one/two/three/four/five/six/seven /eight/nine/colon/semicolon/less/equal/greater/question /at/A/B/C/D/E/F/G /H/I/J/K/L/M/N/O /P/Q/R/S/T/U/V/W /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore /grave/a/b/c/d/e/f/g /h/i/j/k/l/m/n/o /p/q/r/s/t/u/v/w /x/y/z/braceleft/bar/braceright/asciitilde/bullet /Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl /circumflex/perthousand/Scaron/guilsinglleft/OE/bullet/Zcaron/bullet /bullet/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash /tilde/trademark/scaron/guilsinglright/oe/bullet/zcaron/Ydieresis /space/exclamdown/cent/sterling/currency/yen/brokenbar/section /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] pdfMakeFont %%EndSetup pdfStartPage %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer 0 0 87.961258 81.24324 re W q q /DeviceRGB {} cs [0.8902 0.8588 0.8588] sc /DeviceRGB {} CS [0 0 0] SC 0.397022 w 0 J 0 j [] 0 d 4 M q [1 0 0 -1 0 81.24324] cm 1 55.191 85.961 25.055 re f* 1 55.191 85.961 25.055 re S Q /DeviceRGB {} cs [0 0.502 0] sc 27.758 13.603 m 27.762 9.224 23.719 5.673 18.73 5.673 c 13.738 5.673 9.695 9.224 9.699 13.603 c 9.695 17.978 13.738 21.528 18.73 21.528 c 23.719 21.528 27.762 17.978 27.758 13.603 c h f* /DeviceRGB {} cs [0 0 0] sc [1 0 0 1 0 0] Tm 0 0 Td [6 0 0 6 12.385878 11.624634] Tm 0 0 Td /F5_0 1 Tf (CPU) [0.698 0 0.603 0 0.731 0] Tj /DeviceRGB {} cs [0 0.502 0] sc 54.215 14.056 m 54.215 9.677 50.172 6.13 45.184 6.13 c 40.195 6.13 36.152 9.677 36.152 14.056 c 36.152 18.435 40.195 21.982 45.184 21.982 c 50.172 21.982 54.215 18.435 54.215 14.056 c h f* /DeviceRGB {} cs [0 0 0] sc [1 0 0 1 0 0] Tm 0 0 Td [6 0 0 6 38.84062 12.079468] Tm 0 0 Td /F5_0 1 Tf (CPU) [0.698 0 0.603 0 0.731 0] Tj /DeviceRGB {} cs [0 0.502 0] sc 79.758 14.399 m 79.758 10.024 75.715 6.478 70.73 6.478 c 65.742 6.478 61.699 10.024 61.699 14.399 c 61.695 18.778 65.742 22.329 70.73 22.329 c 75.719 22.329 79.762 18.778 79.758 14.399 c h f* /DeviceRGB {} cs [0 0 0] sc [1 0 0 1 0 0] Tm 0 0 Td [6 0 0 6 64.385878 12.424634] Tm 0 0 Td /F5_0 1 Tf (CPU) [0.698 0 0.603 0 0.731 0] Tj /DeviceRGB {} CS [0 0 0] SC 2.855118 w q [1 0 0 -1 0 81.24324] cm 19.879 37.316 m 18.477 39.121 l 18.129 39.574 17.777 40.023 17.426 40.477 c 17.309 40.625 17.141 40.766 17.074 40.93 c 16.996 41.129 17.074 41.797 17.074 42.059 c 17.074 42.27 17.008 43.059 17.074 43.188 c 17.129 43.289 17.375 43.312 17.426 43.41 c 17.5 43.555 17.352 43.723 17.426 43.863 c 17.559 44.125 18.262 44.176 18.477 44.316 c 19.844 45.195 18.398 44.438 18.828 44.992 c 18.902 45.09 19.105 45.125 19.18 45.219 c 19.23 45.285 19.141 45.371 19.18 45.445 c 19.262 45.605 19.445 45.734 19.527 45.895 c 19.594 46.02 19.547 47.227 19.527 47.25 c 19.422 47.387 18.238 48.059 18.125 48.152 c 16.512 49.539 18.812 47.723 17.777 49.059 c 17.629 49.246 17.273 49.34 17.074 49.508 c 16.918 49.645 16.844 49.809 16.727 49.961 c 16.609 50.113 16.438 50.25 16.375 50.414 c 16.316 50.559 16.375 50.715 16.375 50.863 c 16.375 51.016 16.301 51.172 16.375 51.316 c 16.797 52.133 16.539 51.477 17.074 51.992 c 17.219 52.133 17.281 52.305 17.426 52.445 c 17.52 52.535 17.703 52.574 17.777 52.672 c 18.02 52.98 17.352 52.871 18.125 53.121 c 18.23 53.156 18.395 53.07 18.477 53.121 c 18.492 53.133 18.477 54.145 18.477 54.25 c S Q 0.8 w q [1 0 0 -1 0 81.24324] cm 21.836 28.066 m 18.938 35.984 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC 0.281706 w 1 j q [0.366197 1 1 -0.366197 0 81.24324] cm -21.683 30.136 m -26.608 28.326 l -21.681 26.514 l -22.469 27.584 -22.465 29.047 -21.683 30.136 c h f* -21.683 30.136 m -26.608 28.326 l -21.681 26.514 l -22.469 27.584 -22.465 29.047 -21.683 30.136 c h S Q 0.8 w 0 j q [1 0 0 -1 0 81.24324] cm 44.355 28.289 m 44.578 35.426 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC 0.299854 w 1 j q [-0.0312501 1 1 0.0312501 0 81.24324] cm -32.601 45.364 m -37.842 43.439 l -32.598 41.509 l -33.438 42.646 -33.432 44.205 -32.601 45.364 c h f* -32.601 45.364 m -37.842 43.439 l -32.598 41.509 l -33.438 42.646 -33.432 44.205 -32.601 45.364 c h S Q 0.8 w 0 j q [1 0 0 -1 0 81.24324] cm 64.645 28.066 m 68.211 35.312 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC 0.269151 w 1 j q [-0.492307 1 1 0.492307 0 81.24324] cm -51.7 42.649 m -56.406 40.918 l -51.699 39.189 l -52.451 40.209 -52.449 41.609 -51.7 42.649 c h f* -51.7 42.649 m -56.406 40.918 l -51.699 39.189 l -52.451 40.209 -52.449 41.609 -51.7 42.649 c h S Q /DeviceRGB {} CS [0.0078 0 0.0078] SC 3.612224 w 0 j q [1 0 0 -1 0 81.24324] cm 69.5 13.961 m 69.492 20.227 57.676 25.301 43.105 25.301 c 28.531 25.301 16.715 20.227 16.707 13.961 c 16.699 7.691 28.52 2.605 43.105 2.605 c 57.688 2.605 69.508 7.691 69.5 13.961 c h S Q /DeviceRGB {} CS [1 0 1] SC 2.855118 w q [1 0 0 -1 0 81.24324] cm 45.715 5.758 m 44.312 7.562 l 43.965 8.016 43.613 8.465 43.262 8.918 c 43.145 9.07 42.977 9.207 42.914 9.371 c 42.836 9.57 42.914 10.238 42.914 10.5 c 42.914 10.711 42.848 11.5 42.914 11.629 c 42.965 11.73 43.211 11.754 43.262 11.855 c 43.336 11.996 43.188 12.164 43.262 12.305 c 43.398 12.566 44.102 12.617 44.312 12.758 c 45.684 13.637 44.234 12.879 44.664 13.434 c 44.738 13.531 44.941 13.566 45.016 13.66 c 45.066 13.727 44.977 13.816 45.016 13.887 c 45.098 14.047 45.281 14.18 45.367 14.336 c 45.43 14.461 45.383 15.668 45.367 15.691 c 45.258 15.828 44.074 16.5 43.965 16.598 c 42.352 17.98 44.648 16.164 43.613 17.5 c 43.465 17.691 43.109 17.781 42.914 17.949 c 42.754 18.086 42.68 18.25 42.562 18.402 c 42.445 18.555 42.273 18.691 42.211 18.855 c 42.156 19 42.211 19.156 42.211 19.305 c 42.211 19.457 42.137 19.613 42.211 19.758 c 42.637 20.574 42.379 19.918 42.914 20.434 c 43.059 20.574 43.117 20.746 43.262 20.887 c 43.355 20.977 43.539 21.016 43.613 21.113 c 43.855 21.422 43.188 21.312 43.965 21.562 c 44.066 21.598 44.23 21.512 44.312 21.562 c 44.328 21.574 44.312 22.586 44.312 22.691 c S Q q [1 0 0 -1 0 81.24324] cm 56.145 5.637 m 54.742 7.441 l 54.395 7.895 54.043 8.344 53.691 8.797 c 53.574 8.949 53.406 9.086 53.34 9.25 c 53.262 9.449 53.34 10.117 53.34 10.379 c 53.34 10.59 53.273 11.379 53.34 11.508 c 53.395 11.609 53.641 11.633 53.691 11.734 c 53.766 11.875 53.617 12.043 53.691 12.184 c 53.824 12.445 54.527 12.496 54.742 12.637 c 56.109 13.516 54.66 12.758 55.094 13.312 c 55.168 13.41 55.371 13.445 55.445 13.539 c 55.496 13.605 55.406 13.695 55.445 13.766 c 55.527 13.926 55.711 14.059 55.793 14.215 c 55.859 14.34 55.812 15.547 55.793 15.57 c 55.688 15.707 54.504 16.379 54.391 16.477 c 52.777 17.859 55.078 16.043 54.043 17.379 c 53.895 17.57 53.539 17.66 53.34 17.828 c 53.184 17.965 53.105 18.129 52.992 18.281 c 52.875 18.434 52.703 18.57 52.641 18.734 c 52.582 18.879 52.641 19.035 52.641 19.184 c 52.641 19.336 52.566 19.492 52.641 19.637 c 53.062 20.453 52.805 19.797 53.34 20.312 c 53.484 20.453 53.547 20.625 53.691 20.766 c 53.785 20.855 53.969 20.895 54.043 20.992 c 54.285 21.301 53.617 21.191 54.391 21.441 c 54.496 21.477 54.66 21.391 54.742 21.441 c 54.758 21.453 54.742 22.465 54.742 22.57 c S Q /DeviceRGB {} CS [0 0 0] SC 0.693989 w [0.693989 2.081968] 0 d q [1 0 0 -1 0 81.24324] cm 6.082 57.828 75.07 20.207 re S Q Q Q showpage %%PageTrailer pdfEndPage %%Trailer end %%DocumentSuppliedResources: %%+ font GMYFIE+DejaVuSans %%EOF starpu-1.2.3+dfsg/doc/doxygen/chapters/images/parallel_worker2.pdf000066400000000000000000000146031320135501600252140ustar00rootroot00000000000000%PDF-1.5 % 3 0 obj << /Length 4 0 R /Filter /FlateDecode >> stream xXMϯ11c~46$L,trOU55֑!Hz5i|>9fLcds1#۟1Vf9=_dF:8>)z¨l)zZ×w߄9Y ys?{!> .z i_|<۬z`n~+<.p{%͗¿+͊vς0stlXxt|)>E|_ڙ6`c4 c[shg*a [ߚqZ=a}.t`_}RQX3im0PvbAVСWd0Gf_a-7~vz9V;͌湼.pG|XRi_#?4p>}ϒ(fTg)|$N p#1jT!܈ /qA:yQo()n"Y=>iCNpq+CtnJyLy*o .'%[ ժr4lf..d$2 nR3 M9G xF7oX&g9Mwu1KanjVie@"И˶N F;l.Ȇah@%"E#^hۘ4,ĔSTc{aS@5B5_JlSR97 KL0}p\x(&"J}lѡԡfrQX̬.:te{DTbݤZY'3a-U:he *. RWux^ksj4Mm*UršСR2J KmK&UM}t[ g/%D{ O7r'L $Q8S&Wg/bcMqgGG&>HQZ@]0H9"G*bqGbQ<4c,P I \aQ)bh?(:JP `+I6~<7V4%%Ƃh3 pľBHvT!QmW XXU2#h(;T~(` >don@2;##Q"4u,sWh+qj$Ű֒BR֫D XySML \rnJ+g.݋yWG}1Umo C"m fU{s:*;:Z@͂U"DC 5 `YPo#I%-"`ּ"rTd_& BA[1>%ASlVhmM'3E wK47N!5jMcz|Rx@갓A7E>+/# 4R;l 7jjtw6uueBhm5AلMmdex o~7EC.Xyec/飖Q%ZW+G3^leT M_,.T Xni^;ْ-*Ț%;7&C =o#Shᆭv1v}p! wjKr9s1-6F^6Vr( .pG1 [G`ٕ4[v6bsx}ʛ揶%G.x" 1؇w,o **ZVxiŮ3QEDC-!K O GShk$E-W\0k$>pJw"c]&ih厵Lpn";%Xe5CBV ͏4VJ90/H.5S.>E''9dG#~,wVbl}BSJ?k \[U3rqɒ95oc7z2{u`}ֲ"FXfu]= [ qjz@GR(Vu~WڰmQzXqR<&z8&xeR&x\2-c2-}q-*nOEuS򚸖Eܡsj̶Z> f̾,%#%:}Ix D endstream endobj 4 0 obj 2217 endobj 2 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Font << /f-0-0 5 0 R >> >> endobj 6 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 87.961258 81.24324 ] /Contents 3 0 R /Group << /Type /Group /S /Transparency /I true /CS /DeviceRGB >> /Resources 2 0 R >> endobj 7 0 obj << /Length 8 0 R /Filter /FlateDecode /Length1 3484 >> stream xU{p?}7nl! l  $,K)%` A0dՈJQ1XjEDۈQOz6X3L3=g~%EDѴ@鳧}#7d]7[cj rWD)}mo }I['8Bۄn3}L)$gO?ל!n=so1w F dP2EQWy"ΫH0)C:z5+ޙ9Lj@r)~ysD/RTqBmD9G;kQit߹-NYn ;;2U3=e|SGVLU6 z]zZH3)&.)$0'Dp^.)lXL\Ba SIВ3ۗ3p@toLp}3]յy:x^)8oZ|ڭ'|wOJ_vI_zI|'3tcULRhjWg=Gζ:sԞQt'pf#ոs+;̧ni O|XVg@?X2Fp:T;ZcqÓH#<+YMR"^/? JbUj({/xPYOJvE?@FimP[*S[:MJ*-n[D wlڧZ#fjdL74GSwm&L-XnnmYj&_ W$1w2zA4D- 4,M&X3SŃJ&4KvvQT-:ω\V ԋ3k$HMz:;&PX9X_Heф:O}GDŽ"3Y:x#Lo;nB{Y/"ن)a d~,N{73ܳZҚq028xJЯ{Ho/zb?nQu.\yfs*9(ѹcʄC3H//@,&N+ԇ$6 ~(L0mr ߽ևo8׌ҁ/h3A|Dk ᯌOf|éT'EdN|OQ&3>d/n|Qޯ{ xqXW(RCNnff)773/u)x-21^axGƋ?0^`40we^~ogS6`"sϳ^߁=~Y/v3~.ug;xځ۽zG۷v/$TO2`leօ-s}x́G,*Hx$Nx'Cx@Ю` ֯sbkCMDiEf}^]]jyW1퇕RXqO^=1X.,N-bw3,v%NXXwYUdTU7T&J/`,`wX[P! a.c׌p#csUU)Dc#ΘƘE WEѺ8h\(L@tEız"cB ~3p%cH1ƎxI1F1 FϸW0Ƹ2܍ˆ\:Į;0Ď> stream x]Pn -/ .ҸCq)ƅ>k|H)`gٙѰ=w1l|pN Y .rm'dq.$ù '| !8ON (Ѷг݋ɯfBU|CY,c|\&s6V}+0ˮ6$ㅙJqQsa츩7}.DFB7U=J3s| endstream endobj 10 0 obj 235 endobj 11 0 obj << /Type /FontDescriptor /FontName /GMYFIE+DejaVuSans /FontFamily (DejaVu Sans) /Flags 32 /FontBBox [ -1020 -462 1793 1232 ] /ItalicAngle 0 /Ascent 928 /Descent -235 /CapHeight 1232 /StemV 80 /StemH 80 /FontFile2 7 0 R >> endobj 5 0 obj << /Type /Font /Subtype /TrueType /BaseFont /GMYFIE+DejaVuSans /FirstChar 32 /LastChar 85 /FontDescriptor 11 0 R /Encoding /WinAnsiEncoding /Widths [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 698 0 0 0 0 0 0 0 0 0 0 0 0 603 0 0 0 0 731 ] /ToUnicode 9 0 R >> endobj 1 0 obj << /Type /Pages /Kids [ 6 0 R ] /Count 1 >> endobj 12 0 obj << /Creator (cairo 1.14.2 (http://cairographics.org)) /Producer (cairo 1.14.2 (http://cairographics.org)) >> endobj 13 0 obj << /Type /Catalog /Pages 1 0 R >> endobj xref 0 14 0000000000 65535 f 0000005919 00000 n 0000002332 00000 n 0000000015 00000 n 0000002309 00000 n 0000005593 00000 n 0000002441 00000 n 0000002666 00000 n 0000004963 00000 n 0000004986 00000 n 0000005299 00000 n 0000005322 00000 n 0000005984 00000 n 0000006112 00000 n trailer << /Size 14 /Root 13 0 R /Info 12 0 R >> startxref 6165 %%EOF starpu-1.2.3+dfsg/doc/doxygen/chapters/images/parallel_worker2.png000066400000000000000000000065241320135501600252320ustar00rootroot00000000000000PNG  IHDR^l\FgAMA a cHRMz&u0`:pQ<PLTE\\((MM%$$EE55VV$$xx[XXyuujffۈ=::ž̦áyujfLIϾ=:[Xɯ-,^<DfMw "3+oU̡0ZtRNS"DwUf30"Upf3PwD"UDݻf̄3p٭`zkwߗ몮bKGDH pHYsqFtIME *:β IDATx p28-$YiFNGKmqitBAZIa7 ;;;S7|͛7o,ǽ , a]"r+h !C| ["7~ Iwwa>%" :alA&Oi LPS+'mHN6ǻpteldmw%t삧_LN$Uv"eͨ%I%t6ϭ ,xlr |˂6v @&ih!3IiT2t,Ȏs~>+Mhʁ@v-fgw~F{)rja?Ze *9݃hbzitG#~#%~ Z㡰gfy9 M&}D(gy> c\I,%^ \\Vdw}y\榏̒y[!;F!63=ƽܚ\!Lm \m??VH6;ݟ6!v*gq}1or)c nߡϭ#|_ n{#&|D _t>w|~p[ yM _s?)*}N&*o!wĦ<%KAO xLG°_x"x'{^6XޗÙSx(Sd <,;3Ž~-zNv^3܀I6̽Y`s%s8F6c{zd-*6cd [l=_g,#Tʎ,.>M&SBcw>*Ǧʫ b]`!DZiov &KX%bۨ2k0ָ49n؛IJšo wƚTpϔ{P(}Pm]VfMWo4%kDIۂ(vkqUdJլ((7Em6#Yl uǽ.1$Dlti{Zu}Ngq.õ1z1P\{. ϔV6Э989FhëKLtx='8'N B9xG+IxX t$>7@hn@tPsCs_J!8 U`~}m* 95|s}avCrK{%85m8wON.^\2x-kK@thW\]5C#w 嘝 cKxVηq(J8hw]$(=wJĭC$H#_EHk6 db@gWw= Ze_\'CڎMfOϷ=a;V}\ /}׺v]FVrQ>ם{^EO  nJ9vRwUGxu'jm^jٝ^SIrb $@hH!KFG񼡮ks#zskndB 6}3T}E[saU밢^&(6Ǫ5r/y|l%tEXtdate:create2015-12-11T17:42:58+01:00%tEXtdate:modify2015-12-11T17:42:58+01:00S!(tEXtpdf:HiResBoundingBox87.9613x81.2432+0+0(tEXtpdf:VersionPDF-1.5 \ 9IENDB`starpu-1.2.3+dfsg/doc/doxygen/chapters/images/runtime-par.eps000066400000000000000000056427711320135501600242500ustar00rootroot00000000000000%!PS-Adobe-3.0 EPSF-3.0 %Produced by poppler pdftops version: 0.32.0 (http://poppler.freedesktop.org) %%Creator: cairo 1.14.2 (http://cairographics.org) %%LanguageLevel: 2 %%DocumentSuppliedResources: (atend) %%BoundingBox: 0 0 393 302 %%HiResBoundingBox: 0 0 392.235779 301.275146 %%DocumentSuppliedResources: (atend) %%EndComments %%BeginProlog %%BeginResource: procset xpdf 3.00 0 %%Copyright: Copyright 1996-2011 Glyph & Cog, LLC /xpdf 75 dict def xpdf begin % PDF special state /pdfDictSize 15 def /pdfSetup { /setpagedevice where { pop 2 dict begin /Policies 1 dict dup begin /PageSize 6 def end def { /Duplex true def } if currentdict end setpagedevice } { pop } ifelse } def /pdfSetupPaper { % Change paper size, but only if different from previous paper size otherwise % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size % so we use the same when checking if the size changes. /setpagedevice where { pop currentpagedevice /PageSize known { 2 copy currentpagedevice /PageSize get aload pop exch 4 1 roll sub abs 5 gt 3 1 roll sub abs 5 gt or } { true } ifelse { 2 array astore 2 dict begin /PageSize exch def /ImagingBBox null def currentdict end setpagedevice } { pop pop } ifelse } { pop } ifelse } def /pdfStartPage { pdfDictSize dict begin /pdfFillCS [] def /pdfFillXform {} def /pdfStrokeCS [] def /pdfStrokeXform {} def /pdfFill [0] def /pdfStroke [0] def /pdfFillOP false def /pdfStrokeOP false def /pdfLastFill false def /pdfLastStroke false def /pdfTextMat [1 0 0 1 0 0] def /pdfFontSize 0 def /pdfCharSpacing 0 def /pdfTextRender 0 def /pdfPatternCS false def /pdfTextRise 0 def /pdfWordSpacing 0 def /pdfHorizScaling 1 def /pdfTextClipPath [] def } def /pdfEndPage { end } def % PDF color state /cs { /pdfFillXform exch def dup /pdfFillCS exch def setcolorspace } def /CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def setcolorspace } def /sc { pdfLastFill not { pdfFillCS setcolorspace } if dup /pdfFill exch def aload pop pdfFillXform setcolor /pdfLastFill true def /pdfLastStroke false def } def /SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if dup /pdfStroke exch def aload pop pdfStrokeXform setcolor /pdfLastStroke true def /pdfLastFill false def } def /op { /pdfFillOP exch def pdfLastFill { pdfFillOP setoverprint } if } def /OP { /pdfStrokeOP exch def pdfLastStroke { pdfStrokeOP setoverprint } if } def /fCol { pdfLastFill not { pdfFillCS setcolorspace pdfFill aload pop pdfFillXform setcolor pdfFillOP setoverprint /pdfLastFill true def /pdfLastStroke false def } if } def /sCol { pdfLastStroke not { pdfStrokeCS setcolorspace pdfStroke aload pop pdfStrokeXform setcolor pdfStrokeOP setoverprint /pdfLastStroke true def /pdfLastFill false def } if } def % build a font /pdfMakeFont { 4 3 roll findfont 4 2 roll matrix scale makefont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /Encoding exch def currentdict end definefont pop } def /pdfMakeFont16 { exch findfont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /WMode exch def currentdict end definefont pop } def % graphics state operators /q { gsave pdfDictSize dict begin } def /Q { end grestore /pdfLastFill where { pop pdfLastFill { pdfFillOP setoverprint } { pdfStrokeOP setoverprint } ifelse } if } def /cm { concat } def /d { setdash } def /i { setflat } def /j { setlinejoin } def /J { setlinecap } def /M { setmiterlimit } def /w { setlinewidth } def % path segment operators /m { moveto } def /l { lineto } def /c { curveto } def /re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath } def /h { closepath } def % path painting operators /S { sCol stroke } def /Sf { fCol stroke } def /f { fCol fill } def /f* { fCol eofill } def % clipping operators /W { clip newpath } def /W* { eoclip newpath } def /Ws { strokepath clip newpath } def % text state operators /Tc { /pdfCharSpacing exch def } def /Tf { dup /pdfFontSize exch def dup pdfHorizScaling mul exch matrix scale pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put exch findfont exch makefont setfont } def /Tr { /pdfTextRender exch def } def /Tp { /pdfPatternCS exch def } def /Ts { /pdfTextRise exch def } def /Tw { /pdfWordSpacing exch def } def /Tz { /pdfHorizScaling exch def } def % text positioning operators /Td { pdfTextMat transform moveto } def /Tm { /pdfTextMat exch def } def % text string operators /xyshow where { pop /xyshow2 { dup length array 0 2 2 index length 1 sub { 2 index 1 index 2 copy get 3 1 roll 1 add get pdfTextMat dtransform 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put } for exch pop xyshow } def }{ /xyshow2 { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval show moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval show moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /cshow where { pop /xycp { 0 3 2 roll { pop pop currentpoint 3 2 roll 1 string dup 0 4 3 roll put false charpath moveto 2 copy get 2 index 2 index 1 add get pdfTextMat dtransform rmoveto 2 add } exch cshow pop pop } def }{ /xycp { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval false charpath moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval false charpath moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /Tj { fCol 0 pdfTextRise pdfTextMat dtransform rmoveto currentpoint 4 2 roll pdfTextRender 1 and 0 eq { 2 copy xyshow2 } if pdfTextRender 3 and dup 1 eq exch 2 eq or { 3 index 3 index moveto 2 copy currentfont /FontType get 3 eq { fCol } { sCol } ifelse xycp currentpoint stroke moveto } if pdfTextRender 4 and 0 ne { 4 2 roll moveto xycp /pdfTextClipPath [ pdfTextClipPath aload pop {/moveto cvx} {/lineto cvx} {/curveto cvx} {/closepath cvx} pathforall ] def currentpoint newpath moveto } { pop pop pop pop } ifelse 0 pdfTextRise neg pdfTextMat dtransform rmoveto } def /TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 pdfTextMat dtransform rmoveto } def /TJmV { 0.001 mul pdfFontSize mul neg 0 exch pdfTextMat dtransform rmoveto } def /Tclip { pdfTextClipPath cvx exec clip newpath /pdfTextClipPath [] def } def /Tclip* { pdfTextClipPath cvx exec eoclip newpath /pdfTextClipPath [] def } def % Level 2/3 image operators /pdfImBuf 100 string def /pdfImStr { 2 copy exch length lt { 2 copy get exch 1 add exch } { () } ifelse } def /skipEOD { { currentfile pdfImBuf readline not { pop exit } if (%-EOD-) eq { exit } if } loop } def /pdfIm { image skipEOD } def /pdfImM { fCol imagemask skipEOD } def /pr { 2 index 2 index 3 2 roll putinterval 4 add } def /pdfImClip { gsave 0 2 4 index length 1 sub { dup 4 index exch 2 copy get 5 index div put 1 add 3 index exch 2 copy get 3 index div put } for pop pop rectclip } def /pdfImClipEnd { grestore } def % shading operators /colordelta { false 0 1 3 index length 1 sub { dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { pop true } if } for exch pop exch pop } def /funcCol { func n array astore } def /funcSH { dup 0 eq { true } { dup 6 eq { false } { 4 index 4 index funcCol dup 6 index 4 index funcCol dup 3 1 roll colordelta 3 1 roll 5 index 5 index funcCol dup 3 1 roll colordelta 3 1 roll 6 index 8 index funcCol dup 3 1 roll colordelta 3 1 roll colordelta or or or } ifelse } ifelse { 1 add 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch 6 index 6 index 4 index 4 index 4 index funcSH 2 index 6 index 6 index 4 index 4 index funcSH 6 index 2 index 4 index 6 index 4 index funcSH 5 3 roll 3 2 roll funcSH pop pop } { pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul funcCol sc dup 4 index exch mat transform m 3 index 3 index mat transform l 1 index 3 index mat transform l mat transform l pop pop h f* } ifelse } def /axialCol { dup 0 lt { pop t0 } { dup 1 gt { pop t1 } { dt mul t0 add } ifelse } ifelse func n array astore } def /axialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index axialCol 2 index axialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index axialSH exch 3 2 roll axialSH } { pop 2 copy add 0.5 mul axialCol sc exch dup dx mul x0 add exch dy mul y0 add 3 2 roll dup dx mul x0 add exch dy mul y0 add dx abs dy abs ge { 2 copy yMin sub dy mul dx div add yMin m yMax sub dy mul dx div add yMax l 2 copy yMax sub dy mul dx div add yMax l yMin sub dy mul dx div add yMin l h f* } { exch 2 copy xMin sub dx mul dy div add xMin exch m xMax sub dx mul dy div add xMax exch l exch 2 copy xMax sub dx mul dy div add xMax exch l xMin sub dx mul dy div add xMin exch l h f* } ifelse } ifelse } def /radialCol { dup t0 lt { pop t0 } { dup t1 gt { pop t1 } if } ifelse func n array astore } def /radialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index dt mul t0 add radialCol 2 index dt mul t0 add radialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index radialSH exch 3 2 roll radialSH } { pop 2 copy add 0.5 mul dt mul t0 add radialCol sc encl { exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 0 360 arc h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 360 0 arcn h f } { 2 copy dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arcn dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arcn h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arc dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arc h f } ifelse } ifelse } def end %%EndResource %%EndProlog %%BeginSetup xpdf begin %%BeginResource: font TMSTYU+DejaVuSans %!PS-TrueTypeFont- 1 10 dict begin /FontName /TMSTYU+DejaVuSans def /FontType 42 def /FontMatrix [1 0 0 1 0 0] def /FontBBox [-2090 -948 3673 2524] def /PaintType 0 def /Encoding 256 array dup 0 /.notdef put dup 1 /.notdef put dup 2 /.notdef put dup 3 /.notdef put dup 4 /.notdef put dup 5 /.notdef put dup 6 /.notdef put dup 7 /.notdef put dup 8 /.notdef put dup 9 /.notdef put dup 10 /.notdef put dup 11 /.notdef put dup 12 /.notdef put dup 13 /.notdef put dup 14 /.notdef put dup 15 /.notdef put dup 16 /.notdef put dup 17 /.notdef put dup 18 /.notdef put dup 19 /.notdef put dup 20 /.notdef put dup 21 /.notdef put dup 22 /.notdef put dup 23 /.notdef put dup 24 /.notdef put dup 25 /.notdef put dup 26 /.notdef put dup 27 /.notdef put dup 28 /.notdef put dup 29 /.notdef put dup 30 /.notdef put dup 31 /.notdef put dup 32 /space put dup 33 /exclam put dup 34 /quotedbl put dup 35 /numbersign put dup 36 /dollar put dup 37 /percent put dup 38 /ampersand put dup 39 /quotesingle put dup 40 /parenleft put dup 41 /parenright put dup 42 /asterisk put dup 43 /plus put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 60 /less put dup 61 /equal put dup 62 /greater put dup 63 /question put dup 64 /at put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 90 /Z put dup 91 /bracketleft put dup 92 /backslash put dup 93 /bracketright put dup 94 /asciicircum put dup 95 /underscore put dup 96 /grave put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /braceleft put dup 124 /bar put dup 125 /braceright put dup 126 /asciitilde put dup 127 /bullet put dup 128 /Euro put dup 129 /bullet put dup 130 /quotesinglbase put dup 131 /florin put dup 132 /quotedblbase put dup 133 /ellipsis put dup 134 /dagger put dup 135 /daggerdbl put dup 136 /circumflex put dup 137 /perthousand put dup 138 /Scaron put dup 139 /guilsinglleft put dup 140 /OE put dup 141 /bullet put dup 142 /Zcaron put dup 143 /bullet put dup 144 /bullet put dup 145 /quoteleft put dup 146 /quoteright put dup 147 /quotedblleft put dup 148 /quotedblright put dup 149 /bullet put dup 150 /endash put dup 151 /emdash put dup 152 /tilde put dup 153 /trademark put dup 154 /scaron put dup 155 /guilsinglright put dup 156 /oe put dup 157 /bullet put dup 158 /zcaron put dup 159 /Ydieresis put dup 160 /space put dup 161 /exclamdown put dup 162 /cent put dup 163 /sterling put dup 164 /currency put dup 165 /yen put dup 166 /brokenbar put dup 167 /section put dup 168 /dieresis put dup 169 /copyright put dup 170 /ordfeminine put dup 171 /guillemotleft put dup 172 /logicalnot put dup 173 /hyphen put dup 174 /registered put dup 175 /macron put dup 176 /degree put dup 177 /plusminus put dup 178 /twosuperior put dup 179 /threesuperior put dup 180 /acute put dup 181 /mu put dup 182 /paragraph put dup 183 /periodcentered put dup 184 /cedilla put dup 185 /onesuperior put dup 186 /ordmasculine put dup 187 /guillemotright put dup 188 /onequarter put dup 189 /onehalf put dup 190 /threequarters put dup 191 /questiondown put dup 192 /Agrave put dup 193 /Aacute put dup 194 /Acircumflex put dup 195 /Atilde put dup 196 /Adieresis put dup 197 /Aring put dup 198 /AE put dup 199 /Ccedilla put dup 200 /Egrave put dup 201 /Eacute put dup 202 /Ecircumflex put dup 203 /Edieresis put dup 204 /Igrave put dup 205 /Iacute put dup 206 /Icircumflex put dup 207 /Idieresis put dup 208 /Eth put dup 209 /Ntilde put dup 210 /Ograve put dup 211 /Oacute put dup 212 /Ocircumflex put dup 213 /Otilde put dup 214 /Odieresis put dup 215 /multiply put dup 216 /Oslash put dup 217 /Ugrave put dup 218 /Uacute put dup 219 /Ucircumflex put dup 220 /Udieresis put dup 221 /Yacute put dup 222 /Thorn put dup 223 /germandbls put dup 224 /agrave put dup 225 /aacute put dup 226 /acircumflex put dup 227 /atilde put dup 228 /adieresis put dup 229 /aring put dup 230 /ae put dup 231 /ccedilla put dup 232 /egrave put dup 233 /eacute put dup 234 /ecircumflex put dup 235 /edieresis put dup 236 /igrave put dup 237 /iacute put dup 238 /icircumflex put dup 239 /idieresis put dup 240 /eth put dup 241 /ntilde put dup 242 /ograve put dup 243 /oacute put dup 244 /ocircumflex put dup 245 /otilde put dup 246 /odieresis put dup 247 /divide put dup 248 /oslash put dup 249 /ugrave put dup 250 /uacute put dup 251 /ucircumflex put dup 252 /udieresis put dup 253 /yacute put dup 254 /thorn put dup 255 /ydieresis put readonly def /CharStrings 256 dict dup begin /.notdef 0 def /space 8 def /y 10 def /u 2 def /t 4 def /s 11 def /n 3 def /m 6 def /i 5 def /e 7 def /U 14 def /S 9 def /R 1 def /P 13 def /G 15 def /C 12 def /space 8 def end readonly def /sfnts [ <0001000000090080000300106376742000691d390000009c000001fe6670676d 7134766a0000029c000000ab676c7966cb0b6e950000034800000b2068656164 0862f35300000e6800000036686865610d9f077d00000ea000000024686d7478 4d90084e00000ec4000000406c6f63610000581800000f04000000446d617870 047d067100000f4800000020707265703b07f10000000f680000056800> <013500b800cb00cb00c100aa009c01a600b800660000007100cb00a002b20085 007500b800c301cb0189022d00cb00a600f000d300aa008700cb03aa0400014a 003300cb000000d9050200f4015400b4009c01390114013907060400044e04b4 045204b804e704cd0037047304cd04600473013303a2055605a60556053903c5 021200c9001f00b801df007300ba03e9033303bc0444040e00df03cd03aa00e5 03aa0404000000cb008f00a4007b00b80014016f007f027b0252008f00c705cd 009a009a006f00cb00cd019e01d300f000ba018300d5009803040248009e01d5 00c100cb00f600830354027f00000333026600d300c700a400cd008f009a0073 040005d5010a00fe022b00a400b4009c00000062009c0000001d032d05d505d5 05d505f0007f007b005400a406b80614072301d300b800cb00a601c301ec0693 00a000d3035c037103db0185042304a80448008f0139011401390360008f05d5 019a0614072306660179046004600460047b009c00000277046001aa00e90460 0762007b00c5007f027b000000b4025205cd006600bc00660077061000cd013b 01850389008f007b0000001d00cd074a042f009c009c0000077d006f0000006f 0335006a006f007b00ae00b2002d0396008f027b00f600830354063705f6008f 009c04e10266008f018d02f600cd03440029006604ee0073000014000096000000> <00020066fe96046605a400030007001a400c04fb0006fb0108057f0204002fc4 d4ec310010d4ecd4ec301311211125211121660400fc73031bfce5fe96070ef8 f272062900> <000200c90000055405d50013001c00b14035090807030a061103040305110404 034206040015030415950914950d810b040506031109001c160e050a19190411 3f140a1c0c041d10fcec32fcc4ec1117391139393931002f3cf4ecd4ec123912 391239304b5358071005ed071005ed1117395922b2401e01015d40427a130105 0005010502060307041500150114021603170425002501250226032706260726 082609201e3601360246014602680575047505771388068807980698071f5d00 5d011e01171323032e012b01112311212016151406011133323635342623038d 417b3ecdd9bf4a8b78dcca01c80100fc83fd89fe9295959202bc16907efe6801 7f9662fd8905d5d6d88dba024ffdee878383850000> <000200aeffe30458047b00130014003b401c030900030e0106870e118c0a01bc 14b80c0d0908140b4e020800461510fcecf439ec3231002fe4e432f4c4ec1112 173930b46f15c01502015d1311331114163332363511331123350e0123222601 aeb87c7c95adb8b843b175c1c801cf01ba02a6fd619f9fbea4027bfba0ac6663 f003a80000> <000100ba00000464047b001300364019030900030e0106870e11b80cbc0a0102 08004e0d09080b461410fcec32f4ec31002f3ce4f4c4ec1112173930b46015cf 1502015d0111231134262322061511231133153e013332160464b87c7c95acb9 b942b375c1c602a4fd5c029e9f9ebea4fd870460ae6564ef00> <00010037000002f2059e0013003840190e05080f03a9001101bc08870a0b0809 0204000810120e461410fc3cc4fc3cc432393931002fecf43cc4ec3211393930 b2af1501015d01112115211114163b01152322263511233533110177017bfe85 4b73bdbdd5a28787059efec28ffda0894e9a9fd202608f013e00000000> <000200c100000179061400030007002b400e06be04b100bc0205010804004608 10fc3cec3231002fe4fcec30400b1009400950096009700905015d1333112311 331523c1b8b8b8b80460fba00614e90000> <000100ba0000071d047b0022005a4026061209180f00061d07150c871d2003b8 1bbc19100700110f0808065011080f501c18081a462310fcec32fcfcfcec1112 3931002f3c3ce4f43cc4ec32111217393040133024502470249024a024a024bf 24df24ff2409015d013e01333216151123113426232206151123113426232206 1511231133153e01333216042945c082afbeb972758fa6b972778da6b9b93fb0 797aab03897c76f5e2fd5c029ea19cbea4fd87029ea29bbfa3fd870460ae6762 7c00000000> <00020071ffe3047f047b0014001b00704024001501098608880515a90105b90c 01bb18b912b80c8c1c1b1502081508004b02120f451c10fcecf4ecc411123931 0010e4f4ece410ee10ee10f4ee1112393040293f1d701da01dd01df01d053f00 3f013f023f153f1b052c072f082f092c0a6f006f016f026f156f1b095d71015d 0115211e0133323637150e01232000111000333200072e0123220607047ffcb2 0ccdb76ac76263d06bfef4fec70129fce20107b802a5889ab90e025e5abec734 34ae2a2c0138010a01130143feddc497b4ae9e0000> <00010087ffe304a205f00027007e403c0d0c020e0b021e1f1e080902070a021f 1f1e420a0b1e1f0415010015a11494189511049500942591118c281e0a0b1f1b 0700221b190e2d071914222810dcc4ecfcece4111239393939310010e4f4e4ec 10eef6ee10c6111739304b535807100eed11173907100eed1117395922b20f29 01015db61f292f294f29035d01152e012322061514161f011e01151404212226 27351e013332363534262f012e01353424333216044873cc5fa5b377a67ae2d7 feddfee76aef807bec72adbc879a7be2ca0117f569da05a4c53736807663651f 192bd9b6d9e0302fd04546887e6e7c1f182dc0abc6e4260000> <0001003dfe56047f0460000f018b40430708020911000f0a110b0a00000f0e11 0f000f0d110c0d00000f0d110e0d0a0b0a0c110b0b0a420d0b0910000b058703 bd0e0bbc100e0d0c0a09060300080f040f0b1010d44bb00a544bb008545b58b9 000b004038594bb0145458b9000bffc03859c4c4111739310010e432f4ec1139 11391239304b5358071005ed071008ed071008ed071005ed071008ed0705ed17 3259220140f0060005080609030d160a170d100d230d350d490a4f0a4e0d5a09 5a0a6a0a870d800d930d120a000a09060b050c0b0e0b0f170115021004100517 0a140b140c1a0e1a0f2700240124022004200529082809250a240b240c270d2a 0e2a0f201137003501350230043005380a360b360c380d390e390f3011410040 0140024003400440054006400740084209450a470d490e490f40115400510151 025503500450055606550756085709570a550b550c590e590f50116601660268 0a690e690f60117b08780e780f89008a09850b850c890d890e890f9909950b95 0c9a0e9a0fa40ba40cab0eab0fb011cf11df11ff11655d005d050e012b013533 32363f01013309013302934e947c936c4c543321fe3bc3015e015ec368c87a9a 488654044efc94036c00000000> <0001006fffe303c7047b002700e7403c0d0c020e0b531f1e080902070a531f1f 1e420a0b1e1f041500860189041486158918b91104b925b8118c281e0a0b1f1b 0700521b080e07081422452810fcc4ecd4ece4111239393939310010e4f4ec10 fef5ee10f5ee121739304b535807100eed111739070eed1117395922b2002701 015d406d1c0a1c0b1c0c2e092c0a2c0b2c0c3b093b0a3b0b3b0c0b2000200124 02280a280b2a132f142f152a16281e281f292029212427860a860b860c860d12 000000010202060a060b030c030d030e030f03100319031a031b031c041d0927 2f293f295f297f2980299029a029f029185d005d7101152e012322061514161f 011e0115140623222627351e013332363534262f012e01353436333216038b4e a85a898962943fc4a5f7d85ac36c66c661828c65ab40ab98e0ce66b4043fae28 2854544049210e2a99899cb62323be353559514b50250f2495829eac1e00000000> <00010073ffe3052705f000190036401a0da10eae0a951101a100ae0495179111 8c1a07190d003014101a10fcec32ec310010e4f4ecf4ec10eef6ee30b40f1b1f 1b02015d01152e0123200011100021323637150e012320001110002132160527 66e782ff00fef00110010082e7666aed84feadfe7a0186015386ed0562d55f5e fec7fed8fed9fec75e5fd34848019f01670168019f47000000> <000200c90000048d05d500080013003a40180195100095098112100a08020400 05190d3f11001c09041410fcec32fcec11173931002ff4ecd4ec30400b0f151f 153f155f15af1505015d011133323635342623252132041514042b0111230193 fe8d9a9a8dfe3801c8fb0101fefffbfeca052ffdcf92878692a6e3dbdde2fda800> <000100b2ffe3052905d50011004040160802110b0005950e8c09008112081c0a 38011c00411210fc4bb0105458b90000ffc03859ecfcec310010e432f4ec1139 3939393001b61f138f139f13035d133311141633323635113311100021200011 b2cbaec3c2aecbfedffee6fee5fedf05d5fc75f0d3d3f0038bfc5cfedcfed601 2a01240000> <00010073ffe3058b05f0001d0039402000051b0195031b950812a111ae15950e 91088c1e02001c1134043318190b101e10fcecfce4fcc4310010e4f4ecf4ec10 fed4ee11393930251121352111060423200011100021320417152e0123200011 100021323604c3feb6021275fee6a0fea2fe75018b015e9201076f70fc8bfeee feed011301126ba8d50191a6fd7f53550199016d016e01994846d75f60fecefe d1fed2fece25000000> <00010000000259993d50bfcc5f0f3cf5001f080000000000d180a74a00000000 d180a74af7d6fc4c0e5909dc00000008000000010000000000> <00010000076dfe1d00000efef7d6fa510e590001000000000000000000000000 0000001000> <04cd0066058f00c9051200ae051200ba03230037023900c107cb00ba04ec0071 028b00000514008704bc003d042b006f0596007304d300c905db00b20633007300> <000000000000004400000158000001dc00000254000002d000000320000003e4 000004b8000004b8000005b00000077c000008dc00000974000009f400000a78 00000b2000> <0001000000100354002b0068000c00020010009900080000041502160008000400> ] def FontName currentdict end definefont pop %%EndResource /F5_0 /TMSTYU+DejaVuSans 1 1 [ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash /zero/one/two/three/four/five/six/seven /eight/nine/colon/semicolon/less/equal/greater/question /at/A/B/C/D/E/F/G /H/I/J/K/L/M/N/O /P/Q/R/S/T/U/V/W /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore /grave/a/b/c/d/e/f/g /h/i/j/k/l/m/n/o /p/q/r/s/t/u/v/w /x/y/z/braceleft/bar/braceright/asciitilde/bullet /Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl /circumflex/perthousand/Scaron/guilsinglleft/OE/bullet/Zcaron/bullet /bullet/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash /tilde/trademark/scaron/guilsinglright/oe/bullet/zcaron/Ydieresis /space/exclamdown/cent/sterling/currency/yen/brokenbar/section /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] pdfMakeFont %%EndSetup pdfStartPage %%EndPageSetup gsave [392.16 0 0 301.2 0 0] concat /DeviceRGB setcolorspace << /ImageType 1 /Width 1634 /Height 1255 /ImageMatrix [1634 0 0 -1255 0 1255] /BitsPerComponent 8 /Decode [0 1 0 1 0 1] /DataSource currentfile /ASCII85Decode filter /RunLengthDecode filter >> image JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$j8Z4]JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcERdJH5WKJcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcG'9JH47$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$P5g(5Y5j.R JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcE:\^Au7QMu\G/JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcF@%b5d_* OoU(5JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcGNFd/\atkl7"MJcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcD&9 e,Y("_>g2/JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcE"Te,Y("T`:niJcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcEjlf)UC%K)_hNJcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcFg2f)UC%JcFg2XT3qPJcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$r;YINJcC<$`rE@FJcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$OoO5;JcC<$X8fL+JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$XT.)VJcGTHg&Q^(^AkVAJcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcEOcf)UC%JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcDhOh#N$+ !<:"o/e JcC<$JcC<$JcC<$JcC<$JcFX-VZ;;JJcC<$JcC<$JcC<$JcD8?^AribJcC<$JcC<$ JcC<$rVtdUJcG]KT`BZDQiFo&JcC<$JcC<$JcC<$p&D>uJcC<$JcC<$JcC<$JcC<$ JcC<$li3XYJcC<$JcC<$JcC<$JcC<$V>mk%JcC<$JcC<$JcC<$N;q]6JcGTHQiM^; OoN8uJcC<$JcC<$JcCN*VZ;;JJcC<$JcC<$JcC<$JcC<$JcGKEd/a2S!<<(,!<<(, !<<(,!<:FHJcC<$JcC<$JcC<$JcC<$Z2^^%JcC<$JcC<$JcC<$R/c(EJcGBBh#RI_ !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:aQJcCH( `;kJhJcC<$JcC<$QN*WYJcC<$JcC<$JcC<$JcC<$JcC<$rVt[Rs'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,h#N$+JcC<$ JcC<$JcC<$JcE=]ScF?AJcC<$JcC<$JcDGDhuJ?.nc.MIs'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, huJ?.JcGQGa8gekJcC<$JcC<$W;k-Cs'Pj,s'Pj,d/\atJcC<$JcC<$JcC<$JcC<$ KE'j0s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,huJ?.JcC<$JcC<$JcC<$JcEOce,]MV!<<(, !<<(,!<<(,!<<(,!<<(,!<:OKJcC<$JcC<$JcC<$XoI;ZJcG0AklC`k!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<;9`JcC<$JcC<$JcC<$JcC<$g]-L][Zs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7JcC<$JcC<$JcC<$JcC<$ U&XHZs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:JcC<$JcC<$JcC<$ JcFU,klC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`JcC<$JcC<$JcC<$i;_^8JcF=$li@&n !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcC<$[/\MRJcC<$JcC<$ L&^B;s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7JcC<$JcC<$JcC<$JcC<$VuQ)` s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:JcC<$JcC<$ JcC<$JcF^/li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`JcC<$JcC<$JcC<$ l2TZAJcF4!li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<;BcJcC<$Y5clLJcC<$JcC<$OoOYGs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,li;V:JcC<$JcC<$JcC<$JcC<$VuQ2cs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcC<$JcC<$JcC<$JcFg2li@&n!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcC<$JcC<$JcC<$n,M;GJcF!p mfoHRJcDDCmf`MmfH s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,g&Q^(JcC<$JcC<$JcC<$JcC<$`W,9)s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,b5d+nJcC<$JcC<$JcC<$MuW5Gs'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,g&Q^( JcC<$JcC<$jT"-huJ?.JcG$8mfmfJcC<$JcC<$JcC<$JcD;@mfuDhuJ?. JcC<$bQ$K#JcC<$JcDGDli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<;Bco)IVJJcC<$JcC<$JcC<$JcC<$JcF@%klC`k!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<;9`i;_^8JcC<$JcC<$JcC<$JcDMFli@&n!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<;Bco)IMGJcC<$JcC<$RfD1DJcC<$ec4k6s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,klBH;huJ?.JcC<$aT(9#JcC<$JcDYJklC`k!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<;Bcl2TZAJcC<$JcC<$JcC<$JcC<$JcFI(klC`k!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<;9`fDjb/JcC<$JcC<$JcC<$JcD_LklC`k!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;Bck5X?>JcC<$JcC<$VZ5QSJcC<$aoCT*s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, klB-2huJ?.JcC<$aT(9#JcC<$JcDbMklC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9` j8\$;JcC<$JcC<$JcC<$JcC<$JcF[.joGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`cMuf&JcC<$JcC<$JcC<$ JcDhOklC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;Bch>cC5JcC<$JcC<$ZN&h_JcC<$ _uJj!s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,joEL&huJ?.JcC<$aT(9#JcC<$JcDkPli@&n!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9` fDjb/JcC<$JcC<$JcC<$JcC<$JcFm4joGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]aT(/uJcC<$JcC<$JcC<$JcDqRklC`k !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;9`fDjb/JcC<$JcC<$^Am*kJcC<$])Udjs'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joE0rhuJ?.JcC<$aT(9#JcC<$JcE(V joGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<;9`cMuf&JcC<$JcC<$JcC<$JcC<$JcG!7irK*e!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<;'Z^]33lJcC<$JcC<$JcC<$JcE.XjoGEh!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<;9`cMuf&JcC<$JcC<$c2ZT"JcC<$Z2`_^s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, huL=fh#N$+JcC<$bQ$T&JcC<$JcE1YjoGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]aT(/uJcC<$JcC<$JcC<$JcC<$JcG*: huNdb!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<:sWZiAq`JcC<$JcC<$JcC<$JcE@^joGEh!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]`W+irJcC<$ JcC<$g&Kk.JcC<$W;kZRs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,h#OSWhuJ?.JcC<$bQ$T&JcC<$JcE:\irK*e !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;'Z^]33lJcC<$JcC<$JcC<$ JcC<$JcG3=g&V.\!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<:aQWrLuWJcC<$JcC<$JcC<$JcEIairK*e!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;0]]`6dfJcC<$JcC<$li5c@JcC<$RK(b:s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,e,Z3BhuJ?.JcC<$bQ$T&JcC<$JcEC_huNdb!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<:sW[f>7cJcC<$JcC<$JcC<$JcC<$JcG<@PlRNXhuJ?.JcC<$JcC<$JcC<$_>iEn s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irH=`huJ?.JcC<$JcGKEh#N$+JcCi3ScG/XhuJ?. JcC<$bQ$T&JcC<$JcELbh#RI_!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<:aQXoI;ZJcC<$JcC<$JcC<$JcC<$JcG<@T`CAXhuJ?. JcC<$JcC<$JcC<$`;eNks'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,g&S&NhuJ?.JcC<$LB#s-JcC<$L]=.MO8n,`MhuJ?.JcC<$JcC<$JcC<$JcC<$o)I;AJcFX-huJ?.JcC<$JcC<$JcC<$b5]!P JcG]KhuJ?.JcC<$^]2mcJcC<$JcF$qmf7q=`;e`qJcC<$JcF-tjoBu4JcC<$^]2.N JcG9?huJ?.JcC<$JcC<$JcC<$JcC<$p&FR_JcERdhuJ?.JcC<$JcC<$JcC<$b5]E\ JcG0iEnJcC<$JcG3=e,Y("JcC<$\c;4#JcDhOhuKeWf)UC%JcF:#joBu4JcC<$_Z0') JcE@^huJ?.JcC<$JcC<$JcC<$JcCi3mf7q=XT.2YXoHlNJcC<$JcC<$JcC<$eGo(> JcE7[huJ?.JcC<$d/\atJcC<$ZiBIoJcDVIhuL=f`;kJhJcFC&kl?;7JcC<$`W,K/ JcE%UhuJ?.JcC<$JcC<$JcC<$JcD&9nc47@U]96P]`5_HJcC<$JcC<$JcC<$j8\QJ JcE%UhuK&Bp],mFL&]O#JcC<$JcDbMnc47@Sc@LGaT&[KJcC<$hZ)^JcC<$JcDPGnc47@OoO>>fDh`KJcC<$hZ)g?JcC<$ JcF-tnc47@U]96P]`5hKJcC<$JcC<$JcC<$JcD_Lnc47@OoO>>fDh`KJcC<$JcC<$ JcC<$o)J.YJcDMFh#P=l]E!N_^Al@VJcC<$JcD,;nc47@MuV]8i;]JNJcC<$hZ)^< JcC<$JcFI(nc47@RfD:GaT&[KJcC<$JcC<$JcC<$JcE%Unc47@M#ZB5j8Y\NJcC<$ JcC<$JcC<$p&FR_JcD):huM(&YQ07Sd/V/eJcC<$JcCo5nc47@K)aa/l2R+NJcC<$ hZ)g?JcC<$JcF[.mf7q=PlKYAeGlNKJcC<$JcC<$JcC<$JcE@^mf7q=K)aa/m/PQ8 s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,e,Y("JcC<$JcC<$JcGWImf7q=OoO>>gAdrKJcFs6 _>o/eJcC<$M?!#EJcC<$r;Y[Tp&E_Gs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,g&Q^(JcFU,kl?;7JcC<$j8\ZMJcCQ+huMg;ScF?A JcC<$JcC<$JcC<$_>j'+JcC<$q>]@Qq#B%Js'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,h#N$+JcC<$JcC<$JcG9@JcCQ+ huMg;ScF?ArVsM1JcC<$JcC<$rVuEgJcC<$oDd_Krr:mVs'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,huJ?.JcFL)kl?;7JcC<$m/QMSJcC?%huN-Dd/a2S!<<(,!<<(,!<:FHJcC<$ JcC<$JcC<$JcEdjmf7q=JcG?AhuNcVirK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sW JcC<$JcC<$JcCN*nc47@JcGcMhuN6Gf)YhY!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<:XNR/aAjJcC<$JcC<$o`+@[JcC<$mJk6-s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,irFZ1JcFL)kl?;7JcC<$n,MqYJcC<$q>]@Qq#B%Js'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,g&Q^( JcC<$JcC<$JcC<$c2[>7JcC<$kPrg-s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,irFZ1JcC<$JcC<$MZ<5IJcC<$q>]@Qq#B.Ms'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,]E%X) L&cf)JcC<$JcFs6nc47@JcF^/f)YhY!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<;0]JcC<$f`1:_>sUD!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<7TM blE=pJcC<$JcFF'mf7q=JcFL)huNdb!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]JcC<$f`119JcC<$JcGWInc47@ JcG$8b5hQM!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]JcC<$ JcC<$JcC<$JcF4!nc47@JcFC&irK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`JcC<$JcC<$JcCr6mf7q= JcFp5d/a2S!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<7TM jT'l3JcC<$JcEdjnc47@JcF0uklC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`JcC<$ec4k6JcC<$ JcG9@JcC<$iW%C-s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,joBu4JcC<$JcC<$JcC<$g&LUCJcC<$df8P3s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,kl?;7JcC<$JcC<$QN-LUJcC<$hZ):0s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,JH,ZMJcC<$JcC<$[K#dtJcC<$ df8P3s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7JcF0uli;V:JcCE'nc47@JcFL) huNdb!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;9`JcC<$JcC<$JcC<$JcFO*nc47@JcF0uli@&n!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<;BcJcC<$JcC<$JcD/p)dJcC<$df8Y6s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,li;V:JcC<$JcC<$hZ*$EJcC<$df8b9s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcEaili;V:JcDABnc47@ JcF0uli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;Bc JcC<$JcC<$JcC<$JcG0ouaJcC<$df8b9s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcC<$ JcC<$JcC<$nc/%XJcC<$df8Y6s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcC<$JcC<$X8h_jJcC<$ci\H%3\JcEsomf[c$JcC<$bl@,3s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcC<$JcC<$JcEUeScF?AJcF:#mf[>mJcC<$cigJcC<$ec51?s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcC<$JcEIahuNdb!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<:XNJcC<$hZ*-Hs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,huJ?.JcEF`li;V:OoLdKJcC<$f`1C?s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,mf7q=JcC<$JcC<$JcEpnirK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:aQJcC<$hZ*$Es'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, mf7q=JcC<$JcC?%d/a2S!<<(,!<<(,!<<(,!<<(,!<:OKJcC<$f`1C?s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, mf7q=JcC<$JcERdirK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;ors'Pj,irFZ1JcF^/ mfc>huJ?.JcFC& mf7q=[K#Rns'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:JcFp5li@&n!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcC<$JcC<$JcC<$ fDk1;s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:JcFp5klC`k !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;Bcn,Ll;JcC<$JcC<$c2[#.s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:JcFp5li@&n!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;KfJcC<$JcC<$a8bT.s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:M#ZK8rr;3_s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,klB65h#N$+JcFU,mf7q=]Dq3ts'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,kl?;7JcFp5li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<;BcJcC<$JcC<$JcC<$fDk1;s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:NrR&us'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,li?)Ge,Y("JcC<$JcF=$li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<;BcJcC<$kPslKs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, li;V:JcC<$JcEmmli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<;KfJcD2=ZN1#5!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`bQ$AuJcC<$jT"ZKJcEIa li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcC<$kPslK s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:JcC<$JcC<$JcF@% mfij%s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,mf7q=MuU`rs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, li;V:JcC<$JcC<$JcF7"mfs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,li;V:ZN$9ls'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,joE0re,Y("JcC<$JcGKEmfnc47@a8bK+s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=VZ3Oos'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,kl?;7JcC<$JcC<$JcF7"mfiEn]`6dfs'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, h#NrEh#N$+JcGZJmf7q=c2[54s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=\Gs_Prr:%>s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joBu4JcC<$JcC<$JcF$qmf.GJcC<$JcC<$o`+@[s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,mf7q=b5^K%YlE)Ns'Pj,s'Pj,s'Pj,s'Pj,d/]@0h#N$+JcGcMnc47@c2[54 s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,mf7q=^AlmecMu]#s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irFZ1JcC<$ JcC<$JcEpnmfi3haT(&rs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,huN6Ge,Y("JcC<$JcG]KmfuGrVtdUJcCQ+mf7q=e,St=s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=b5^K%XoFag JcC<$JcC<$JcC<$`W,B,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=e,SP1VuN"^JcGTHe,Y("JcC<$YlF7o s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,mf7q=b5^K%XoFageGn"uJcC<$JcCo5mf-,JH3^jJcG]Ke,Y(" JcC<$bQ%,5s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=f)Ot7N;p![ZiAMTJcC<$JcDkPli@&n!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;Kf JcFO*li;V:\Gu+"JcFj3h#N$+T`=H\JcFF'mfo/e JcC<$JcC<$JcE(Vli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<;BcJcFX-li>?2[K,.`ScF?A!<:XNJcC<$JcF7"mfZ;f)UI'o`5!k ]E!fge,Y("JcC<$m/QDPs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=h#H^@JcE7[nc50Zd/\atJcF'rc2bNWnc8[h mfc1/JcGKEnc8.Y_>oPpe,Y("JcC<$qu>[Vs'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=huE-FJcDqR o`1'Qe,Y("JcF^/]E$.Tmf<7bli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<;BcJcFj3mf7q=VZ6;hJcEmmh#N$+[K#[qh>cC5YlEV]s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:irA?FJcC<$ JcC<$JcC<$JcGBB\H'qTmf<._li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<;BcJcFa0mf;;Gh#N$+mf2hXi;^arO8m]0JcC<$r;YINZiAq`s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:irAHIJcDhO o`0aHe,Y("JcG6>YQ3;Tmf<%\li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<;BcJcFj3mf7q=U]9ueJcERdhuJ?.\Gu+"l2Sg)^]3j)rr;5qu?!_s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:jo=ZIJcC<$JcC<$JcC<$JcGTHT`F-Qmf;_S li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcFj3mf;DJirFZ1h#I$I`W+*] P5j#3JcDDC[K+VQnc8Ibli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<;BcJcFj3mf7q=VZ62eJcGKEe,Y("NrPRKl2U2Pk5XcJs'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,kl?;7jo=cLJcDDCnc47@\Gt@bJcE[gnc8IbXT6uQnc87\li@&n!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcFj3mf7q=JcC<$JcC<$JcC<$ qZ!#bm/QMSk5XZGs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7kl:)Ok5XHAJcF=$o`2Q& c2a%-e,Y("YQ(U&gAgUAo)J%Vs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, kl?;7kl:)OJcDMFnc47@mf1c:JcD2=f)YhY!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<:XNo)J7\i;`$As'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irFZ1li6DRJcD;@nc47@ZN&_\ JcEmmnc8[hT`F-Qmf;hVklC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcFj3 mf7q=JcC<$JcC<$JcC<$rVtROs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,f)YLDmf;;GklC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]JcFs6nc7hPjoBu4d/Wb= XoHZHQ2f>6JcE@^T`F-Qnc7qSli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`JcFj3 mf7q=U]9lbJcFj3d/\atWW1lVs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,huNZSmf;)AjoGEh!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sWJcG'9 nc47@RfDpYJcD_LhuJ?.c2Wh)m/QMSk5XZGs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V: jo=cLJcC<$JcC<$JcC<$JcG]KhuNdb!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sWrr;EefDjt5 s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,h#N$+ mf2_Ul2TuJJcEmmnc5Kcd/]I3e,Y("b5[h/m/QMSk5XZGs'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, kl?;7jo=cLJcDDCnc47@g&KP%JcE.XirK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<:OKdJr>/s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,g&Q^(nc/%XJcD):o`0RCU]9-MJcF=$d/a2S!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<:aQo)J.Yi;`$As'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joBu4kl:2RJcC<$ JcC<$JcC<$JcG]KirK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:XN cN!#,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,f)UC%nc/.[ l2TuJJcEdjnc50Zd/]I3e,Y("f)OG(s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,g&UpJmf;2DklC`k!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;'ZJcG'9mf7q=RfE$\ JcF*se,Y("_>iWts'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,g&T=rirK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:FHJcGBBnc47@PlLCV JcD;@h#N$+h#H11s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,huNZSmf;)AjoGEh!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:jTJcG0j'+O8m]0Q2f>6JcFa0huNdb!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;'Zqu?*bfDjt5 s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,h#N$+ mf2hXJcD):o`0RCa8aWhJcF!pjoGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]_Z/Els'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,h#R?Pnc47@p]'daJcCl4 o`0RCPlKYAJcFa0irK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:OKdJr5, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,g&Q^(mf2hXJcC<$ JcC<$JcC<$JcG]KklC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<;9`_Z/`MklC`k!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;'Z^]0l* n,MqYJcG]Knc87\li;V:ZN'RtJcGBBe,Y[3e,Y@*joGEh!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`_Z/`M nc47@NrSYMJcC?%huJ?.rVu*^s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,klAKud/a2S!<<(,!<<(, !<:FHp&FI\JcG]Knc47@JcC<$JcC<$JcC<$rVu3as'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, irHXiWW;;`mf8"?nc87\li;V:YQ+.nJcG0u]mf8"?nc47@JcC<$JcC<$JcC<$rVu3as'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li=9i_>r3fmf84Eo`4R_mf7q= WW2MhJcFO*f)Um3e,ZNKklC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;'Z\c8Z0l2U2PKE(KB JcCZ.o`0RCOoNo2O8nYKs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,li='cd/_Jlnc4OHnc47@M#[,JJcC<$nGh;ER/cLQs'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,rW)t+!<;Bc[f`Mli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<;KfV#T-KbQ%#2N;rGKp&FI\JcDVInc47@e,S#"O8m]0ZiB@ls'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,rW)t+!<<(,!<;KfZi@H6i;`6GLB$fEJcCZ.o`0RCM#Ys) R/cUTs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,mf8XQrW'D,mf8FKnc47@L&^]DJcC<$lMocBT)\6Zs'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li=9i_>r3fnc4OHnc47@JcC<$JcC<$ JcC<$rVui3h N;qB-aT(T,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,mf90`g&T=rmf8=Hnc47@M#[#GJcC<$q>\qEXoIhis'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:`;f9+Q2gCT JcCH(nc47@JcFU,h#O\Zmfj'+Q2gCTq#Bd_JcD;@o`0RC]DpRbM>u'*dJrY8s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:a8bT.O8nkQJcCH( nc47@JcG6>d/^`Wmfdr s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,mf7q=`;fB.O8nkQJcC<$JcC<$JcC<$JcGTHnc8\t!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;KfJcERdmf:l; qZ+h>nc8Remf7q=RfDpYJcE.Xg&R!0e,\>)li@&n!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;KfJcE[gnc4jQnc47@K)bKD JcC<$kPrp0_Z0')s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=_>is(k5X$5i;`?JJcC<$s8V`lJcC<$ci;f$ _Z/s&s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,mf7q=`;f9+Q2gCTJcC<$JcC<$JcC<$JcG]Kmfis(R/c^WJcC<$JcC<$JcC<$JcG]K mfs'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,mf7q=]DqF%qu5s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q= ^Ama(k5Wp2i;`HMJcC<$JcC<$JcC<$JcGTHmfd$Gs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=]Dn5uq#C!eJcC<$ r;ZcpDs'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, nc47@]Dq="rr9;)o)J7\JcC<$JcC<$JcC<$JcGTHmfnc47@NrSYMJcCZ.h#N$+qZ#.Is'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,nc47@\Gqorqu?3e JcC<$s8VWiJcC<$Z2`2Oqu?*bs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=\Gt@bs'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,d/\atJcGQGo`0RCJcD\K huN$AmfJJcC?%h#N$+qZ#IRs'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q= [JuTorr;NhJcC<$r;ZEiJcC<$V>nL7s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:]Dpmks'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,g&Q^(JcGQGo`0RCJcDJEh#R$Gmf^*fJcC<$SH%CFq#Bd_s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=\Gt@bs'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,e,Y("JcC<$JcC<$JcC<$ o`+@[s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,mf7q=^Am*ks'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, e,Y("M#[#GJcC<$pA`qKJcGKEmf^*fJcC<$PQ0,4s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,mf7q=^Am!hs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,joBu4JcGQGnc47@JcD&9huNZSmf^!cJcC<$OT3T+s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,li;V:^Am*ks'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,irFZ1JcC<$JcC<$JcC<$nc/%Xs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=^Almes'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,h#N$+L&^fGJcC<$kPs?dYs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, li;V:_>ij%s'Pj,s'Pj,s'Pj,qZ-Y(!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`JcC<$s8VWibQ"[EJcCZ.g&V.\ !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;KfJcEIa g&V.\!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`JcC<$ JcC<$JcC<$JcGBBli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;Bc JcERdklC`k!<<(,!<<(,!<<#us'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joBu4K)bBAJcC<$g]-13O8nPH s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:_>ia" s'Pj,nc8\t!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9` JcC<$q>^*fJcC<$JcGNFjoGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcERdli@&n !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcC<$r;ZEigAd*3JcD): h#RI_!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcERdklC`k !<;]ls'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,li;V:JcC<$JcC<$JcC<$nc.qUs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, kl?;7_>ij%s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7K)bBA JcC<$ec4P-P5jkKs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, li;V:_>ij%s'Pj,s'Pj,p]1>%!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcC<$q>^*fJcC<$JcGECklC`k!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<;9`JcERdli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<;BcJcC<$s8V`lk5Tu4nGn.?T`ia"s'Pj,s'Pj,s'Pj,rW)t+!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcC<$JcC<$JcC<$ JcG9?li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcERdli@&n!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`JcC?%nc47@JcF'rh#NrEli@&n!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcERdli@&n!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<;BcJcC<$r;ZEiJcC<$JcGECklC`k!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<;9`JcEIamfij%s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:JcC<$JcC<$JcC<$o`+.U s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,kl?;7_>ij%s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,kl?;7JcGcMo`0RCJcEjlh#O&Hli@&n!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<;9`JcE[gklC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<;BcJcC<$s8VWiJcC<$JcGECjoGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]JcERdli@&n!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcC<$s8VWirr:%>^]1qHJcDqRh#RI_ !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<;9`JcERdli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;Bc JcC<$JcC<$JcC<$JcG9?joGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<;0]JcEIamfij%s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,li;V:JcGcMnc47@JcC<$o)IhPs'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irFZ1^AmX%s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:K)`diT)ZP*JcE@^huNdb !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0] JcERdli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcC<$ JcC<$JcC<$JcG0o/ec2Zo+s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,joBu4^AmO"s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcC<$JcC<$JcC<$li5lCs'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, h#N$+\Gu!ts'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,li;V:K)bBAJcC<$Z2`V[YlEhcs'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irFZ1^AmX%s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcGcMo`0RCJcC<$l2T?8 s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,L&d)1mfc]YmfCXoIhi s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,mf7q=Sc@1>JcE@^`;kJhjo=-:s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,huJ?.\Gu!ts'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,mf7q=JcC<$JcC<$JcC<$kl626RK0\omfd$Gs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcGcMo`0RC JcCr6huLOlJH2#:\c;*us'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=K)bBAJcC<$JcF@%WW:$5s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=K)bBAJcC<$JcF$qc2`Fq rVrYnqu?*bs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,mf7q=_>i!bm/QVVJcCQ+a8gkmJH16$q#K@Qmfs'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcGcMnc47@ JcCE'h#P=l^Asc'QiQ^Wmfa8h(sd/\atp]%,kqu?3es'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,mf7q=JcC<$JcC<$JcC<$JcC<$i;^Xos'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcGcMnc47@JcC<$ qu>RS^]2d`JcG'9XT8A#nc8\t!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;KfJcC<$s8V`lJcC<$JcC<$JcF0u c2dlP!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;fos'Pj,mf7q= job5d+nJcE+W^B":A!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;KfJcC<$JcC<$ JcC<$JcC<$JcEC_huNdb!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;KfJcC<$q>^*fqu>m\JcC<$NW7f7JcC<$iW$aps'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q= JcGZJnc47@JcC<$JcC<$\,Y[ms'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,d/][9]E#MBb5d+nJcGHDb5d+nJcDnQb5hQM!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;KfJcC<$JcC<$JcC<$JcC<$JcDkPmf\M9JcC<$QN,b@JcC<$ec4,!s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcGZJnc47@JcC<$JcC<$Z2a7ms'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,WW;2]U]@Y!]E!N_JcGHDb5d+n JcDeNg&V.\!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<;KfJcC<$JcC<$JcC<$JcC<$JcDkPli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<;KfJcC<$r;X;-JcC<$QN,kCJcC<$bl?T$s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcGZJ d/\atJcC<$JcC<$df8Y6s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,JH3Ca WrK:'JcC<$nGgc6JcC<$V>oZXs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,li;V:JcC<$JcC<$JcC<$JcC<$WrMDcs'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,li;V:K)_qQJcC<$QN,b@JcC<$`rGK-s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcGQG`;kJhJcC<$ JcC<$hZ)g?s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,JH4$sU&UngJcC<$ lMo63JcC<$[/]%as'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, mf7q=JcC<$JcC<$JcC<$JcC<$VuQ)`s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,kl?;7M#X.KJcC<$QN,b@JcC<$bl@#0s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,li;V:JcGZJ\H%3\JcC<$JcC<$jT"QHs'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,klCDVK)h)7ScF?AJcFg2c2`FqJcEaih#RI_!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcC<$JcC<$JcC<$JcC<$JcDPG li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`JcCQ+RfJ$>JcCi3huJ?.JcF0uli@&n !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcCH(WW7VMJcC<$ JcC<$kPslKs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,klB65]E!N_rVtILs'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,f)UC%JcFL)d/\atJcF0uf)YhY!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<;BcJcC<$JcC<$JcC<$JcC<$JcDGDklC`k!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<;9`JcCZ.f)YhY!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<:aQJcC<$NW7o:JcC<$ec4t9s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, li;V:L&[qKJcC<$JcC<$JcG$8joGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`JcCZ.h#RI_!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:jTJcC<$ f`0>!JcC<$iW%1's'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7JcC<$JcC<$JcC<$ JcC<$T)\$Ts'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,JH16$cN*uQ!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sWJcC<$MZ;K4JcC<$g]-U? s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7MuT.EJcC<$JcC<$JcG-;joGEh!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<7TMJH44# s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,huJ?.JcF'rd/\atJcG?AirJuVklC`k !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;9`JcC<$JcC<$JcC<$JcC<$JcD,;joGEh!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<7TMJH44#s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irFZ1JcCN*h#N$+JcF^/klC`k!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<;9`JcCZ.g&V.\!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<:aQJcC<$JcC<$JcG-;joGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<7TMJH44#s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,joBu4JcEaid/\atK)aj2o)IqSs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joBu4JcC<$JcC<$JcC<$JcC<$ Q2fkEs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,JH16$dK';T!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]JcC<$JcFX.JcC<$jT"HE s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,JH16$dK';T!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sWJcC<$JcC<$JcG-;huNdb!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<7TMJH4*us'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7JcEF`e,Y("OoOGAl2TlGs'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joBu4JcC<$JcC<$ JcC<$JcC<$O8n,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irFZ1JcC<$JcC<$JcC<$JcC<$P5io0s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,g&Q^(MuW#As'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,kl?;7JcC<$qu>IPJcC<$mJl2Hs'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,JH16$eH#VW!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;0]JcC<$JcC<$JcGZJ^B":A!<:=EJcCQ+klC`k!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<;9`JcC<$Z2`;RJcDqRirIg5huNdb!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sW JcC<$JcC<$JcC<$JcC<$JcD,;K)gK&MuW#As'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, li;V:JcC<$p&EhJJcC<$nGhDHs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,JH16$cN*uQ!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]JcC<$JcC<$ M#W)-JcCQ+klC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcC<$W;k?IJcEIa irI^2e,]MV!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<:aQJcC<$JcC<$JcC<$JcC<$JcD5>K)gK&L&^K>s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,li;V:JcC<$n,M;GJcC<$s8U@Es'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,f)UC%MuW#As'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7JcC<$ JcCu7g&V-PU]>uGM#ZfAs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, li;V:JcDJEe,Y("c2Zf(fDgR*JcC<$JcC<$JcC<$JcC<$JcDGDg&V$MU]>uGMuW,D s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:JcC<$m/PlA JcCc1L&cf)M#Z]>s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:JcC<$JcD2=g&U^D U]>uGOoObJs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V: JcD&9f)UC%h#HC7gAcd*JcC<$JcC<$JcC<$JcC<$JcDGDg&UUAU]>uGOoObJs'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:JcC<$k5X6;JcD;@ JH,ZMJcCQ+klC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcC<$JcC<$ U]9-Mk5W0rrr;*\JcD):li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<;BcJcC<$OT3o4JcG'9irIg5h#R?PWW7VMJcC<$JcC<$JcC<$JcC<$ V#T6Nj8Zsrqu>dYJcD2=li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;KfJcC<$JcFR+huJ?.WW1ZPqubOro)IhPJcD2= mfs+JcGTHirIp8g&UUA\H%3\JcC<$JcC<$JcC<$JcC<$V#T6Nh>bXu m/Q2JJcD;@mfc:2j8ZjoJcC<$JcC<$JcC<$JcC<$JcDYJh#Q1/ mf:-&joBu4U]9c_s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcC<$eGn>)JcEdjh#QL8_>sB2kl?;7QiHCPs'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcC<$ JcE@^huM:,mf:$#joBu4VZ6)bs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:JcC<$qu>7JQ2fkEi;_U5h>b+fJcC<$ JcC<$JcC<$JcC<$JcDkPh#Q(,mf9oujoBu4VZ6)bs'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcC<$cMu]#JcF4! h#Q:2mf<@eirJ?DjoBu4ScA-Ys'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcC<$JcERdhuM1)mf9]ojoBu4XT._hs'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,mf7q=JcC<$o)I;AV#THTi;_U5gAgUAgAg^DJcC<$JcC<$JcC<$JcC<$JcE(V huM(&mf9]ojoBu4YQ+%ks'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcC<$`W+irJcFX-huMC/mf:-&joBu4 VZ5u_s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,li;V:JcC<$JcEmmhuM(&li=0fjoBu4ZN'@ns'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcC<$l2TH; YlE_`i;_U5fDk:>fDk:>JcC<$JcC<$JcC<$JcC<$JcEC_huLt#mf9BfjoBu4[K#[q s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,nc47@JcC<$^]3*iJcG9?h#Pt)mf9oujoBu4WW2Des'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, mf7q=JcC<$JcF*shuLjumf99cjoBu4[K#[qs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcC<$i;_L2^]3JcC<$JcC<$JcC<$JcC<$JcEUehuLjumf90`joBu4\Gu!ts'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,nc47@JcC<$\c:IcJcG]Kh#Pk&mf9TljoBu4YQ+%ks'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q= JcC<$JcF=$irHsrmf8sZjoBu4]DqF%s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcC<$fDjY,bQ$T& i;_^8bQ%#2dJrb;JcC<$JcC<$JcC<$JcC<$JcEgkirHsrmf8jWjoBu4^AmX%s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,mf7q=JcC<$ZiAq`M>uK6bQ$o/WrM2]JcE.XmfcL8[f>drLB$B9JcF!pmf[oKE('6JcF!pmf$)nc47@JcC<$ JcC<$JcC<$JcC<$j8\->ZiBIoJc>`MjoBu4c2[>7s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irFZ1JcC<$Q2fY?^]33l]`7F#N;r#?JcEdj mfdr_Z0')JcC<$JcC<$JcC<$JcC<$JcG*:irH=`mf7q=p]'@U JcF4!mfuB3eGnP/[f>[oJc>`MjoBu4d/WP7s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q= JcC<$JcG]KjoDF]mf7q=li6)IJcFF'mf`MhuM^8irH=`mf7q= p]'@UJcF=$li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;KfJcC<$JcCB&joD=Zmf7q=irA-@JcFX-mf; irH4]mf9frnc47@JcC<$JcC<$JcC<$JcC<$qu>[VVuQ2cJcFa0joBu4huE-Fs'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joBu4JcC<$JcG]K h#QpDirH4]mf7q=nc._OJcF=$mf[V WrMMfJcFs6joBu4h#HgCs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcC<$N;qocC5VuQ2cWrMViJcC<$JcC<$JcC<$JcC<$PQ0bFS,_pW JcE[gjoBu4mf2MOs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li@%bjoBu4JcC<$JcGBB h#O8Nli;V:e,SP1JcFs6li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<;BcJcC<$JcD#8joCnNmf7q=^AmbOr\c;*uU&XZ`JcC<$JcC<$JcC<$JcC<$TE"$R R/cLQJcE7[joBu4nc.hRs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joFuPjoBu4JcC<$Jc>`Mb5f!Nmf7q=`;es"JcG0< klC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<;9`JcC<$JcD>AjoC\Hli;V:ZN'%eJcGBBjoGEh !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]JcC<$ JcEgkhuML2joG2VirHsrliAjoC\Hli;V:WW2)\JcGTHhuNdb!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<;'ZJcC<$JcEpnhuML2joFcJirI:&li`Mf)YhY!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<:sWJcC<$JcF$qhuMC/klBZAirIL,mf8aTnc47@ JcC<$JcC<$JcC<$JcDnQkl?eEmf7q=T`=-SJc>`Mf)YhY!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sWgAgC; JcC<$JcD5>joFQDh#Pt)li;V:YQ*_bJcGKEirK*e!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<;0]JcC<$JcDPGkl?\Bmf7q=RfDLMM>ta!s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,g&Q^(JcC<$dJr,) fDjt5fDjk2gAgUAQ2gCTJcC<$JcC<$JcC<$JcC<$[/]7gO8nYKJcD):joC8mf8ONnc47@JcC<$ JcC<$JcC<$JcE4Zkl?\Bli;V:PlKkGO8nYKrr8GfbQ$f,JcC<$JcDkPjoE^,huMg; mf7q=T`=-SKE'F$s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,h#N$+JcC<$VuPu]M?!#EJcCZ.joCeKli?q_T`BZD JcC<$dJr5,eGnY2_Z/Wrm/QMSN;rGKJcC<$JcC<$JcC<$JcC<$_#NNsN;r5EJcCZ. joCnNli?h\U]A:3joBu4JcC<$[f>Rl_Z/Eln,MhVJcD):joCA?`;opG!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<:XNJcC<$JcDbMjoC8/XoID]rr;lAa8gek JcC<$dJr5,cN!,/U&WUBKE(KBJcC<$JcC<$JcC<$JcC<$ci<50KE(B?JcC<$oDdqQ ZiB@lgAfFuT)\$TJcC<$JcF-tjoD+Tf)UC%JcGcMjoD4Wli?MSYQ07SJcC<$VuPu] KE(9`Mmf7q=JcFp5joE9uli=Trnc47@JcC<$ cMuo)bQ$f,N;r#?JcG]Knc47@JcC<$JcC<$JcC<$JcFC&kl?;7!<;KfJcC<$jT"?B `W,0&\c;4#N;r#?JcC<$JcFm4joC8Z;d/\atJcC<$T)\$T Jc>`Mmf7q=JcFU,joEU)li=Blnc47@JcC<$fDjk2bQ$])LB$96KE(B?JcC<$JcC<$ JcC<$JcC<$hZ)g?Jc>`Mmf7q=JcFL)joE^,li=Blnc4OHjoBu4JcC<$m/Q;MKE'O' JcC<$s8V<`]`7`Md/\atK)as5`W,9)[f>muJcC<$JcD>A kl?;7rVuc^>WrMViJcC<$JcFm4irI'ukl?;7!<:XNM?!,HJcC<$ JcC<$JcC<$JcC<$kPscHJcG]Kli;V:JcF'rjoF?>kl@a`nc4=BjoBu4JcC<$rr;3_ JcG]Kmf<7bh#N$+L&^98cN!52ZiBRrJcC<$JcDGDli;V:qZ$!aJcC<$`rG0$k5XcJ V#TucJcC<$JcG*:irI'ukl?;7rVudYO8nbNJcC<$JcC<$JcC<$JcC<$lMp)K JcG]Kli;V:JcEaijoFZGkl@OZnc47@!<;0]JcC<$L]?T=JcG]Kmf;qYh#N$+M#ZT; fDk(8XoIqlJcC<$JcDbMkl?;7qZ#m^JcEdjo`0jKjoFlMkl@FWmf7q=JcC<$p&F%P _Z/j#JcG]Kli?h\joCJBnc47@JcC<$JcC<$JcC<$JcG6>li;V:p]'[^JcF*sirG/? joFuPkl@=Tnc47@qZ#d[JcC<$NW85CJcG]Kmf;VPh#N$+M#ZT;i;`$AWrMViJcC<$ JcDkPkl?;7qZ#m^JcFF'c2a.0joG2Vkl@4Qnc47@JcC<$qu>[V^]3NuJcG]Kli?MS joC\Hnc47@JcC<$JcC<$JcC<$JcGHDkl?;7p]'[^JcFF'b5dh-joG;Ykl@+Nnc47@ qZ#[XJcC<$RK)LOJcGTHmf;2Dh#N$+MuW#Al2TuJU&XZ`JcC<$JcE(Vli;V:p]'R[ JcFX-]E"H$c2a.0mf7q=JcCE'irHalli;V:qZ#m^k5XZGR/c^Wq#BRYJcC<$JcC<$ JcC<$JcD2=kl?;7p]'[^JcFX-\H&-!d/]@0nc47@o`+.UJcC<$TE"-UJcGTHli>Z; h#O/Kh#NW[oJcGBBmf7q=ir?4_S,_(?O8nbNJcC<$ MZ;]:]`73rJcGKEmf;;GjoCnN`;kJhJcC<$JcC<$JcC<$XT.VeJcGBBmf7q=ir?+\ S,_1BN;rGKJcGBBjoBu4JcD\Kkl?;7qZ#m^bQ$Au[f=;HR/c:Krr;*\S,_pWJcC<$ JcELbkl?;7o`+@[JcFj3U]?nairFr9mf7q=JcCr6irHXikl?;7p]'[^fDk(8U&VY' JcC<$JcC<$JcC<$JcE7[li;V:o`+@[JcFj3T`CS^irFr9nc47@mf2MOJcC<$Y5dhg JcGKEli=p&h#P=l\H&-!d/]@0nc47@JcC<$_Z/j#JcGBBmf7q=jo:nPT)[gNLB$fE JcC<$RK):I[f>[oJcGBBmf:c8joDO`XT3qPJcC<$JcC<$JcC<$`;f'%JcGBBli;V: kl7+PU&X$NLB$fEJcG0dYP5k(QJcC<$Y5dM^YlEqfJcGBBli=]uklA^&g&V.\!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:aQJcC<$JcC<$JcC<$JcFF'li;V:mf2_U JcFs6irK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;'Z^]3RlbQ$Aus'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,h#N$+JcC<$JcC<$ JcC<$irA?FJcG0H5irK*e!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<;'ZJcC<$JcC<$JcC<$JcFj3li;V:mf2_UJcFs6joGEh !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<;9`dJr,)j8\6AR/c^WJcFO*kl?;7JcFU,li;V:nc.qULB# h#Q(,joD"Qnc47@g&L17JcC<$lMp)KJcG9?li;V:rVt@Is'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joEL&irJ?DjoCeKnc47@JcC<$ j8\HGJcG'9mf7q=kl9lIs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,klBcDh#Pb#joD+Tnc47@ JcEsoirGnTli;V:mf2_UU&X?Wi;_p>s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7JcC<$JcC<$JcC<$o`+.UJcG0< mf7q=jo=ZIs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,klBlGh#PXukl@=Tnc47@f)Ot7 JcC<$nGhhTJcG0]d]JcG'9mf7q=kl9lIs'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,klBQ>huM:,joD"Qnc47@JcC<$m/QDPJcG'9mf7q=jo=ZIs'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li?q_f)W8ZjoD=Znc47@JcFL)huKSQ li;V:li6DRP5jkKl2U)Ms'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7JcC<$JcC<$ JcC<$!<;BcJcG'9li;V:kl9lIs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,li@%bf)W/WjoD=Znc47@d/W>1JcC<$s8VEcJcG'9mf7q=kl9lIs'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,klBuJh#POrkl@=Tnc47@JcC<$o)J%VJcG'9li;V:jo=cL s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,a8i7?joD=Z nc47@JcFg2huKJNli;V:li6;OO8nPHn,M_Ss'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,li;V:JcC<$JcC<$JcCB&li;V:kl:)OJcFj3li@&n!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:+?VuPlZWrMViJcF!pjoBu4M#ZfAJcG'9 mf7q=jo=ZIs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li?VVg&SnfjoD4W nc47@JcC<$p&F@YJcG'9li;V:jo=ZIs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,c2aI9joDO`nc47@JcG$8huKAKli;V:li6;OM>uoBp&F@Y s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:JcC<$JcC<$ JcCT,li;V:kl:)OJcFa0mfph?joD=Znc47@JcC<$ qu?!_JcFs6mf7q=irAHIs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,g&R36joDafmf7q=JcG?AhuK8Hli;V:li6;OKE(9u]]@QR/cLQJcFs6mf7q= qZ$!aqu?*bs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,mf7q=JcC<$JcC<$JcCf2li;V:kl:)OJcFX-mfli;V:jo=cLJcFF'mfAli;V:jo=cLJcF=$ nc8\t!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;KfJcFj3joEC#mf7q=\Gt[kJcERdli;V:jo=cLJcFF'nc8\t !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<;TiJcG0uoBJcFs6li;V:huE$Cs'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q= JcC<$JcC<$JcDPGli;V:jo=cLJcF=$mf`Mli;V:jo=cLJcF4!mfouaJcFa0li;V:c2[54s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=c2Zo+eGo(>JcE7[irFZ1 rVu3aJcFj3mf7q=d/WP7s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcC<$JcC<$JcDtSli;V:irAHI JcEmmmfiNqJcGTHmf7q=irA?FJcF!pnc8\t!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;KfJcC<$ JcC<$JcC<$ZiB@lJcFa0mf7q=a8bT.s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=a8b9%fDkCAJcDMFjoBu4li6DR JcFa0mf7q=c2[54s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,nc47@d/W5.dJrb;JcC<$Y5dqjJcFX-mf7q= a8bK+s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,li;V:`;es"gAg^Dj8\->KE's3JcGKEli;V:irAHIJcEmmmfiWtgAg^Dl2TH;JcFX- kl?;7nc/%XJcFa0li;V:b5^o1s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=b5^T(eGo(>JcC<$s8V!WfDk:>JcFX- mf7q=_>is(s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,mf7q=]Dq!nh>d$Go)Hl5Q2fkEJcGBBli;V:irAHIJcEdjmfnc8@_`;kJhjo=HC JcGTHmf7q=huE-FJcEdjmfnc8[h[K(mYkl9lIJc>`Mmf7q=huE-F JcE[gmfJcFa0mf7q=_>ij%s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:JcC<$JcC<$PQ/&kp&F@YJcFX-mf7q=]Dq3t s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:YQ*_bk5V"Q JcG'9joF$5f)XY,mf7q=huE-FJcERdli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcE@^klBQ>nc8Ib^Aribjo;F_qu?!_JcFX- mf7q=\Gtmqs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:XT.D_ k5V"Q\c:[i^]27Ql2U)MJcFX-mf7q=^AmX%s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcC<$JcC<$QN*rbrr;U]>uGnc+XMJcFX-mf7q=[K#Ik s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:VZ5cYm/NFQ`W+ru^]1_B p&F@YJcFX-mf7q=]Dq3ts'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,li;V:JcC<$JcC<$SH"WMJcFX-mf7q=ZN'.hs'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,li;V:U]9HVm/NFQJcG'9joFuPZN0[umf7q=h#HgCJcE@^li@&n!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcDqRjoFQDScF?AqYuTV JcFX-mf7q=YQ*hes'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:Sc@gPp&EVDs'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,g&TFuirHjoWW<%uli;V: huE-FJcE7[li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;Bc JcC<$JcC<$JcDABNrXb2h#HgCJcDqRli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9` JcD;@joG2Vg&V.\!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<:aQJcFs6klCV\VZ?_rmf7q=h#HgCJcE7[li@&n!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<;9`JcDhOjoFZGRfJ*@f)YhY!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<:OKJcFX-mf7q=WW22_s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, kl?;7RfDLMqu>RSs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,huMC/irHjoNrXb2huE-FJcE%Uli@&n !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcC<$JcC<$JcDABh#RI_!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:XNJcFO*mf7q= XT.Mbs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7QiH1Jrr:mVs'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, huJ?.kl626pAfdEhuE-FJcE%Uli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9` JcDMFjoFlMc2dlP!<<(,!<:=EN;qf9s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,huJ?.h#HgCJcD_L joGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<;0]JcCl4b5hQM!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;'Zi;_g; ]`4#mJcFO*mf7q=YQ*qhs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7JcC<$JcC<$ UAs6Rs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,huJ?.huE-FJcDVIjoGEh!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`JcCc1c2dlP !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;'ZJcFj3_>sUD!<<(,!<:"< JcFX-mf7q=XT.Ves'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:RfDUPp&E_Gs'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,h#NW< irK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;'ZJcFa0mf7q=U]9HVs'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joBu4MuV9, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joFZG irHalg&V.\!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<:XNJcFO*mf7q=XT.Mbs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7JcC<$JcC<$UAs?Us'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irFZ1jo=cLJcDDCjoGEh!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]JcCQ+e,]MV!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]JcFj3f)YhY !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<:aQJcFO*mf7q=XT.Mbs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7QiH1Jrr:mVs'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,huK/EjoGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;0]JcFs6mf7q=Sc@^Ms'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,irFZ1K)aX,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joFuPirHXihuNdb!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sW JcFX-mf7q=VZ5cYs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,kl?;7JcC<$JcC<$UAs?Us'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joBu4kl:)OJcD;@irK*e!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<:sWJcC?%huNdb!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]JcFj3huNdb!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<:sWJcFX-mf7q=VZ5cYs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joBu4NrRB)s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,irG\NjoGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`JcG'9nc47@QiGtDs'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,huJ?.JcGQGjoGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`qu>[VZiB.fs'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irFZ1jo=cLJcDDCjoGEh!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]JcC<$JcC<$JcDJEklC`k !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<;0]JcG0s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,joD4Wli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`JcGKEmf7q= MuSq?JcC<$JcC<$JcDSHli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<;BcJcG]Kmf7q=JcGZJYQ4S#mf7q=L&^K>s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=p]'IXs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, kl?;7p]'[^JcCZ.OoU(5JcGZJli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<;BcXoIhis'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, li;V:!<;KfJcCl4nc8@_\H)=&mf7q=M#ZfAs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf9']li@&n!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<;9`JcGTHmf7q=M#WV`Mnc47@JcG?A]E%O&mf7q= M#ZoDs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, li;V:qZ#m^s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7qZ$*dJcC?% PlQC8K)b0;s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li=Bl li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;Kf KE(B?JcCl4nc8%Va8kK)mf7q=MuW5Gs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,licpDJcCc1mf`Mmf7q=JcG?A^B!a&mf7q= MuW,Ds'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, li=Komf`Mmfdrs'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf8=H mf7q=OoOkMaT(f2gAgUAJcCu7mf5JcCc1mfJcD):mf5JcD;@mfJcFO*mfo/eli6DRs'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf9fr mfqZ$!a s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, mf7q=!<;Kfs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,mf8aTnc47@JcF^/nc50ZU]>uGnc/%Xs'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf9frmfrVu3as'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,li`Mli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<;BcVuQ)`s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,mf8jWnc47@JcFU,o`19WScF?AJcC<$JcDDCli@&n!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcT)\?]JcC<$hZ*-H R/bk?s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,g&Q^( !<;Bcs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:rVu3a s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, mf8sZmf7q=JcF^/nc4sTRfJ$>rVu3as'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li=Blli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;BcT)\?]JcCc1mf9ouo`2c,huNdb!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sW KE(9uG JcGQGnc5Kcli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<;KfJcGTHScF?Ae,S>+s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,huLOl[K(mYJcG6> nc5B`li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJc>`Mg&V.\ !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:jT rr;WkQ2duGo`*_Is'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,h#P=lXT3qP JcG?Anc5B`mfuGJcGQGnc5Kcli@&n!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;KfJcC<$JcC<$U]7+i_Z/Iis'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joBu4a8b]1XoIqlbQ%#2 s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,mf7q=g&LL@JcEmmU]A10huNdb!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sWJcCQ+nc5Kc mfIis'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joBu4f)P:@bQ%,5U&XQ]s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, mf7q=f)P:@JcDDCU]A:3huNdb!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sWJcCQ+o`1]cmfrWrnc5flirJ$;o`1oiklC`k!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]JcF!pmf9Kinc6l5nc8\t !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<;KfJcF=$nc47@d/TmA]`7!ls'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,irFZ1NrSYMU&XQ]s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcC<$JcE@^irFZ1qZ#[Xs'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, joBu4li561h>d$GU&XQ]s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,nc47@e,St=JcD_LU]A10irK*e!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;'ZJcCc1nc5B`mf5 s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,mf7q=e,St=JcF=$irJcPe,ZrWjoGEh!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]JcF=$o`3)5nc5B`mfIiJcGBBklC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;Bc JcF4!nc5Tfo`328mfia" JcG9?klC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`Jc>`MXT7hinc59]mf7JcG07bQ%,5cN!>5JcFX-mfmf7q=h#HgCs'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=kl:)OV#Tuc _Z0')s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, li;V:`;fB.Jc>`Mli;V:jo=ZIs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf8aTirK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<:aQQ2g:Qs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,li;V:JcC<$JcFF'li;V:huE-Fs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf9']joGEh!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]Q2g1N s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:`;f9+ JcFF'mf7q=irA?Fs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,mf8aTirK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:aQQ2g:Q s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, mf7q=a8bT.cN!G8fDk:>JcFO*mfj'+JcFO*mf7q=huE-Fs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf8jWjoGEh!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<:sWQ2g:Qs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=`;fB.cN!G8gAgUAJcFF'mfk5XuP JcF!pmfB s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joBu4XT._h JcGKEmf7q=e,Sk:s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf9Bfli@&n!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;9`P5jbHs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7ZN'IqdJrb;m/QMSJcF!p mf7s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf9BfmfBs'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joBu4XT.hk eGo(>m/QVVJcEdjmfuK6s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,h#N$+U]9c_JcG]Kmf7q=c2[54s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf9Kili@&n !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcO8n>B s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joBu4WW2MheGo(> n,MhVJcEdjmfu'*s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,e,Y("ScA6\ JcG]Knc47@b5^o1s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf9Kimfo)J7\JcE[gmfQiHUV WrMMfJcEmmmfnc87\nc47@`;f0(s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=p]'daQ2gLWS,]8aJcCu7mf9Ki nc47@a8bK+s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,mf9Bfmfij%s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li='cnc8\t!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;KfJc>`MVZ;;JOoOtP KE(KBJcEdjli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<;KfWrMVis'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,nc4FEd/a2S!<<(,!<<(,!<:FHJcD2= nc7;Anc8@_nc47@_>ia"s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,li;V:qZ$!aR/c^WQ2drdJcCc1nc5oomf7q=`;f9+s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf9Bfnc8\t!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<;KfLB!hFJcC<$JcC<$d/WY:JcERdli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<;KfVuQ;fs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=qZ!c"JcCc1mf84E nc47@_>is(s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,li=0fmfo`4[bnc47@_>ia"s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7qZ$*dQ2gCTO8lNdJcCc1 mf9]onc47@_>is(s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,li='cnc8\t!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;KfKE%_IJcC<$JcC<$d/WY:JcERdjoGEh !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcVuQ;fs'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, mf7q=o`)5tJcCc1nc4OHnc47@_>ij%s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,mf9Bfmf`MWW7VMNrSYMfDkCA qu?3eJcEIajoGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcGTHmf8XQ nc4FEc2dkDnc47@MuW>JZiBRrJcERdli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;BcWrMMfs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=rVru"JcC<$JcC<$c2[>7 JcERdirK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcV#Tucs'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, mf7q=li5?4qu?3eJcCZ.nc4aNnc47@_>ia"s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,li='cmfiWts'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,li='cmfiEns'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,kl@OZmfioc!nc47@_>iNqs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,liii*es'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joD+T mfj'+rr;!Ys'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joBu4p]'daO8nbN JcEdjnc47@b5\dJ^]3j)JcERdg&V.\!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`U&XQ]s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,nc47@ YQ+.nJcC<$JcC<$f)P:@JcE[gnc8ReirK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;'ZT)\6Zs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=XT.hkJcF!pYQ1'jnc47@_>i3hs'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,kl@FWmfcL8JcERdnc8ReirK*e!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;'ZJcGKEmf8FKo`0RC_>j'+JcF=$VZ=U6 nc47@_>i*es'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,kl@=Tmfj'+q#B7P s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,huK8Hli@&n!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;KfJcDhOnc47@e,Qj'+qu>[Vs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joCnN mfc^>JcERdnc87\f)YhY!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<:aQJcGBBmf8FKnc47@_>j'+JcFO*d/a2S!<<(, !<<(,!<:FHbQ%58JcERdnc8IbirK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sW S,_gTs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,mf7q=XT.hkJcC<$JcC<$h#HpFJcE[gnc8.Yf)YhY!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<:XNO8nPHs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,mf7q=VZ62eJcFX-f)YhY!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<:XNVuQ;fJcERdnc8IbhuNdb!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;'ZR/cLQ s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V: XT.hkJcF=$U]B?Qkl?;7`;fB.l2R4QJcG9?nc4XKnc47@^Ama(JcFj3g&V.\!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:jTdJrb; JcERdnc8@_huNdb!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<:jTQ2g:Qs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:XT.hkJcC<$JcC<$h#HpFJcE[gnc7qS ScFWIli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcDVInc47@ ir@p:s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,h#OJTnc47@`;fB.o)IMGs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,h#NWuGmf2_UN;rGKJcEIanc47@kl9Q@s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,irIU/nc47@`;fB.n,Lu>s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,g&R36li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;Bc JcDVInc47@JcC<$JcFX-nc47@`;fB.k5V4WLB$T?s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,li;V:T`=Q_JcFs6irK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<;'ZXoIqlJcE[gnc8.Yd/a2S!<<(,!<<(,!<<(,!<<(,!<:OKO8nPHs'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:VZ62eJcFa0f)YhY!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:XNk5XcJJcE[gnc7VJXT3qPli6MU M?!5KJcE7[nc47@mf2;Is'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,joF$5nc47@`;fB.m/NOTN;r5Es'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,li;V:VZ62eJcC<$JcC<$huE?LJcE[gnc7MGYQ07SrVu3as'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7T`=Q_JcG'9joGEh!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]YlF@rJcERdnc7qSScF`Lli@&n!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcDVInc47@jo=-:s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,huN$Ali;V:a8b]1fDiA]JcFs6mf84Eo`0RC\Gu+"JcG0 o`0RC`;fB.h>a\ZJcG]Kli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`JcDDCnc47@ JcC<$JcFa0o`0RCa8b]1bQ#riJcFs6joGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]JcD2=nc47@o`+.Us'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,klA0lo`0RC`;fB.h>ae]JcGTHli@&n!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<;BcJcD;@nc47@mf2;Is'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,joFcJmf7q=a8b]1^]33lJcFO*nc4FEnc47@[K#dtJcGKEklC`k!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;9`i;`HMJcE[gnc7;A]E!N_p]'IXs'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, kl?;7RfDpYJcC<$JcC<$jo=uRJcEdjnc6,ujoBu4jo=HCs'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joBu4PlL:SJcGKEli@&n!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<;Bc[f?"#JcE[go`3MA^Aribo`+.Us'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,kl?;7ScA-YJcG9?klC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<;0]n,MhVJcEmmnc5]imf7q=huE6ILB$oHJcE%U nc47@p]'R[s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li>uDo`0RCa8b]1bQ#if JcG'9klC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;9`JcD):nc47@JcC<$JcFj3o`0RCa8b]1XoIhiJcFa0irK*e !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;'ZJcCl4nc47@qZ#m^s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,klA9oo`0RCa8b]1aT'`iJcFs6joGEh!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]JcD):nc47@ o`+.Us'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,joFuPmf7q=b5_#4WrMMfJcFa0nc4=Bo`0RCYQ+.nJcG]K li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;Bcj8\cPJcEdjnc66# joBu4irA-@s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, irFZ1QiHUVJcC<$JcC<$jo=uRJcEmmnc5Tfmf7q=ir@^4s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,huJ?.NrSYM JcG]Kli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`]`7X)JcEdj nc5oomf7q=irA-@s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,joBu4PlL:SJcGKEklC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`o)J.YJcF!pnc5Kc mf7q=kl:)OLB$fEJcDqRnc47@rVu7U&XQ]JcG'9 nc4=Bnc47@XT.hkKE(9K)bBAJc>`MmfJJcG]Kli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<;Bco)J7\JcF!pnc59]mf7q=nc/%XKE(KBJcDhOnc4=BmfJJJcC?%nc47@JcC<$JcG'9nc47@d/WY:S,_pWJcFO*T`BZDK)bBALB$]Bs'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, mf:-&o`0RCc2[>7T)\6ZJcFa0RfJ$>K)bBAKE(97T)\6Z JcFX-ScF?AK)bBAKE(B?s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,mf;qYnc47@e,T(@P5jtNJcGTHnc47@!<;TiJcDVInc4OH mf`Mmf7q=!<;TiJcDMFnc4XK mfJN;r>Hs'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,nc6H)o`0RC d/WY:Q2g:QJcFO*U]>uGK)bBAM>uoBs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf<%\nc47@f)P:@N;r>HKE(KBJcG]K nc47@U]9lbN;r>Hs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf;VPnc47@e,St=P5jtNJcFX-^B!s,li;V:L&^]D JcC<$JcC<$mf2q[JcF=$nc4XKmf7q=kl:)Oi;`?Jl2TcDJcCl4nc4aNmf@Mm/Q;MJcCZ.nc47@JcC<$JcG0HJcFs6 li?VVirJHGkl?;7MuW>JN;r>Hs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf<%\mf7q=h#HpFLB$]BM?!,HJcG]K nc47@ScA6\O8nbNs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf;VPnc47@f)P:@N;r>HJcFs6mf;;Gnc8%V huJ?.PlL1PJcC<$JcC<$nc/.[JcFF'o`0XEmf7q=o`+@[gAggGh>cL8JcD2=mf8ON mfd-Jk5X6;JcD):nc47@JcC<$JcG9?nc47@ h#HpFJc>`Mmf7q=qZ#m^gAggGfDjt5JcD2=nc4jQmfd-Jj8\$;JcD):nc4aNmf`M li>Z;o`3D>joBu4T`=Q_P5jtNs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,nc6?&o`0RCg&LUCKE(B?JcGBB mf;)Ao`3hJirFZ1RfDpYO8nYKs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,nc87\mf7q=irAQLJcGTHmf8aT nc47@p]'mdJcD):nc4jQmfc> o`3_GirFZ1RfDpYJcC<$JcC<$nc/.[JcFa0nc47@qZ$!aJc>`Mmf:u>nc6l5li;V: ScA6\P5k(Qs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,nc6?&nc47@h#HpFJc>`Mmf7q=qZ$!agAg^DfDjt5 JcD2=nc4jQmf`Mmf7q=rVu3agAg^DgAh0Q!<<'! !<<'!!<;9`JcD;@nc47@JcC<$JcG9?nc47@irAQLJcGKEmf8+Bmf:l;nc6Z/mf7q= T`=Q_P5jtNs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,mf:$#nc47@huE6IJcG]Kli;V:!<;KffDkCAcN!52JcD;@nc4jQ mfrr<'!rr<'!rr<'!rr<'!mf7q=ScA6\JcC<$JcC<$nc/.[_Z/No aT(f2JcG0Q8o`2u2mf7q=ScA6\Q2g1Ns'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf;_Snc6u8c2c8lnc47@li6DRVuQ;fJcGBB huJ?.U]9lbrr;uDnc47@jo=lOJcG9?mf8=Hmf:c8o`3D>rr<'!rr<'!rr<'! rr<'!rr<'!rr<'!nc47@T`=Q_JcC<$JcC<$nc/.[cMtrceGo(>JcG'9mf8aTmf:Q2 o`2u2h#N$+XT-ZJ[f>[os'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,mf9frnc47@jo=lOJcG9?mf8FKli>H5o`2c,nc47@T`=Q_P5jtN s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,mf;_Snc7;A]E$[cnc47@kl:)OXoIhiJcGKEc2`FqZN&)J]`7lAnc6Q,irI'unc47@ mf2_UP5jtNcN!P;cN!nE!<<'!!<<'!!<<'!!<<'!!<;TiJcD;@nc47@JcC<$JcG9? nc7DD\H(Icnc47@kl:)OS,_gTcN!G8dJq/cJcE.Xa8j!Tli@&n!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcZiBRr`W+`oaT(f2JcG0h.J _Z0')s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li>c>nc6u8 b5frinc47@mf2_UQ2g:QbQ%58cN!nE!<<'!!<<'!!<<'!!<<'!!<<'!!<;9`JcD_L d/\atJcC<$P5k(Qi;]nZj8\ZMJcFj3mf9']li>6/nc7;A\H%3\`;d@J`W,9)s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li=Blnc7);`;nEfo`0RC li6DRQ2g:QcN!G8aT'roJcDhOd/^WTli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<;Kfk5XuPk5V4Wl2U;SJcFa0mf;_Sh#QgAnc47@ !<98'JcF!pYQ2cEli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;Bc gAgUAgAe\`h>d$GJcFs6mf8jWmf:Q2nc7);q#CEprr<'!rr<'!rr<'!rr<'!h#N$+ ZN&)JJcC<$JcD,;nc7qST`F?Wnc47@irAHIn,M)Ah>cpDaT(f2h>aSWJcF*sXT6HB li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcYlF.lgAe\`h>d$GJcFs6 mf8jWmf:Q2nc72>_>o/e\GsMJ^]3a&s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,li?2Jmf;_SRfMpWnc47@huE-Fqu=V8q#BmbLB"%LJcFF' U]AUi;]nZj8\ZMJcFj3 mf9']li>6/nc7;Ao)Jdjrr<'!rr<'!rr<'!rr<'!rr<'!f)UC%`;d@JJcC<$JcDGD nc8%VRfMpWnc47@h#HgCrr9h8m/QMS`W,K/j8YeQJcFO*T`EC huB/GdJrG2s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,klB65mf;VPT`F?Wnc47@irAHIn,M)A i;`-DaT(f2h>ca?!<<'!!<<'!!<<'!!<<'!!<:FHJcF*sXT3qPJcC<$V#Tuco)IDD s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,g&UgGnc47@ g&J&Pp&FI\_Z09/j8YSKJcFa0QiPP6klC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`WrMMfl2RFW m/QVVJcFX-mf;qYe,\P/mf:?,o`3hJWW7VMe,QuDmf<._h#RI_!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sWq#BmbJcF=$ScF`L f)YhY!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:XNJcG'9d/a2S!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<:XNdJrG2s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,klB$/nc8%VRfMpW nc47@h#HgCrr9h8m/QMS`W,T2i;_jcgA rr:mVs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irJuVnc47@f)MEDN;qf9s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,huJ?.nc.MIs'Pj,s'Pj,nc8\t!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<:sWdJr>/s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joEU)mf;qYg&V.\!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<:XNp&FR_JcFO*VZ?Dimf:6)o`4%Ph>dQUrr<'!rr<'! rr<'!a8gekir>JJJcC<$JcDbMmf<@eirK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<;'Zrr;NhJcF=$OoW8snc8%VhuNdb!<<(,!<<(,!<<(,!<<(,!<<(,!<;Ti s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,huJ?.nc.MIs'Pj,nc8\t!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sWeGnY2s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joD+Tmf<%\g&V.\!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:aQp&FR_JcFO* VZ?Mlli=p&o`4.SQiM^;jo:\JcN!,/s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,klBQ>c2dlP!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:XNJcF=$RfJWOirK*e !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;'ZJcGKEirK*e!<<(,!<<(,!<<(, !<;]ls'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,irIL,joGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sW bQ%#2q#B7Ps'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,h#R?Pnc47@f)MNGrr;Ee_Z00,l2TB9!<<'!!<<'! !<;Tis'Pj,s'Pj,s'Pj,g&Q^(kl9$1s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, f)UC%JcC<$YlE2Qs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,f)UC%g&I38]`7O&n,MDJs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, nc8\t!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;'ZJcGKEjoGEh !<<(,!<<(,!<<(,!<<(,!<;fos'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irIU/irK*e!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;'ZT)\6Zqu>RSs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,huNZSnc47@ f)MNGrr;Ee_Z00,l2TH;s'Pj,s'Pj,s'Pj,nc8\t!<<(,!<<(,!<<(,!<:aQJcG0< c2dlP!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:aQeGnY2s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joF$5f)YhY !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<:aQJcFO*f)YhY!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:XN S,_UNs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irFZ1 rVtmXs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,qZ-Y(!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]eGnG,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,g&T4onc8ReirK*e!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<;'Zrr;NhJcF=$OoW8snc8%VhuNdb!<<(,!<<(,!<<(,!<<'!!<<'! !<;Tis'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,huJ?.nc.DFs'Pj,nc8\t!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sWJcC<$JcDtSh#RI_!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<:jTJcFF'h#RI_!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<:aQ]`7O&o)IhPs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,nc8\t!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0] JcGTHjoGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<;0]eGnG,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,huK/Enc8[hirK*e!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<;'Zrr;NhJcF=$OoW8snc8%VhuNdb!<<(,!<<(, !<<(,!<<(,!<;Kfs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irFZ1nc.MIs'Pj, s'Pj,nc8\t!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sW eGnY2s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, joEp2g&V.\!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<:jTJcFX-huNdb!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sWU&X6T s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,joC&6joGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;0]eGn5&s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,c2c&fe,]MV!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<:OKJcFF'OoW/pnc8.YirK*e!<<(,!<<(,!<<(,!<<(, !<<(,!<<'!!<;Tis'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irFZ1 o`+%Rs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,o`5#"!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;'ZJcC<$JcDtSirK*e!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<:sWJcFO*irK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;'Z]`7X)n,MVPs'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,nc8\t!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`Jc>`MklC`k!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0] eGn5&s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,f)V*9 f)YhY!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<:aQJcF=$d/a2S!<<(,!<<(,!<:4B]`7O&n,MDJs'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,nc8\t!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0] JcGKEirK*e!<<(,!<<(,!<<(,!<<(,!<;fos'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irIU/irK*e!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<;'ZdJr#&s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irFZ1huD^: s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irH"WklC`k!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<;9`KE(09s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,klB-2QiR-cnc6c2h#RI_!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:jT JcFF'h#RI_!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<:XN]`7O&o)IhPs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,nc8\t !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]JcGTHjoGEh !<<(,!<<(,!<<(,!<<(,!<<(,!<<#us'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irFZ1JcC<$YlEqf s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irFZ1huDg=s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joE0ro`4R_klC`k!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;fos'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?Juf?s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,klB$/ScJQcnc6c2 irK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<:sWJcFO*irK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sW]`7X) o)IhPs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,o`5#"!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]Jc>`M klC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<;9`JcC<$JcDtSli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<;9`JcFX-joGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<;0]_Z09/p&F7Vs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?S?li@&n!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<;9`cMsRuoBs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,klAp,WW;Vimf:Q2joGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;'ZJcFX-joGEh !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;'Z^]3s,o)IqSs'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,p]1>%!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9` LB$K-,WW7\OjoGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]JcFX- irK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]_Z00,o)J%V s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, p]1>%!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<;9`LB$Kuf?s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7 JcC<$\c;!rs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, mf7q=jo=QFs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,klAp,nc8Ibli@&n!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcP5jkKs'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li>$)ZN,RVrVu3as'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,kl?;7irA-@s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joEC#nc8@_li@&n!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<;BcM>uf?s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,klB$/U]A(-li@&n!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcFs6klC`k!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<;9`[f>[os'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,mf8FKmf6/nc8Ibli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;Bc P5jkKs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf:-& \H%3\!<;Bcs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V: irA6Cs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,klAg)nc8IbklC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<;BcN;r5Es'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li>-,XT5p3 mfdrs'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li<=Nli@&n!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;Bc[f>%]q#Bmbm/QVV cN!52s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:jo=QF s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,klAp,nc8Ibli@&n!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;BcO8nPHs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,li;V:JcC<$^]3X#s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,li;V:li6;Os'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,li>?2o`4deli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;KfP5jtNs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,li=Koh#R-Jo`0RC!<;Bcs'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:jo=QFs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,klAp, o`4[bli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcO8nPHs'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li>$)ZN.Q9mf6/o`4[b mf?2o`4demf6/ o`4deli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;Bc P5jkKs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li=]ub5hPA o`2Z)li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<;9`JcG0?2o`4deli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<;KfP5jtNs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcC<$^]3a&s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joBu4nc.qUs'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li>H5o`4demfq#Bd_s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf8aTmfH5 nc8IbmfQ8nc8Ibmfqu?!_s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, mf8aTmfqu?!_s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf8aTmfd$Gs'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irFZ1nc/%Xs'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf:l;nc8Remfo`4de mfZ;o`4demfcpDj8\QJs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,huJ?.o`+@[s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf:u>o`4demfk5XuPs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=o`+@[s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, mf;)Anc8Ibmfk5XlMs'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,nc47@ nc/.[s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,mf;)Anc8Ibmf%!<<(,!<;KfM?!5KJc>`M mfdrs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=mf2hXs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,nc6H)li@&n!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;KfQ2g:Q s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, li<"Eo`3D>mf;VPmf`Mmf[os'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, mf7q=mf2_Us'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,mf:$#mfd$Go)J%Vs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,li<=Nmf`Mmfd$Gp&F@Ys'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf8aTmfd$Go)J.Ys'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,lid$Gn,MhVs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,mf8ONli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:jTN;rGK Jc>`Mli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<;BcJcG9?mfd$Go)J.Ys'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,lid$Go)J.Ys'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf8XQli@&n!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcC<$JcEC_li@&n!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcG'9mfd$Go)J.Ys'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf8XQli@&n !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcN;rGK YlF%is'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7li6;Os'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li=Trli@&n!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcO8nPHs'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,li;nBnc6c2nc8%Vli@&n!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<;BcJcG0d$Go)J%Vs'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li<4Kmfd$Go)J%Vs'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li<4KmfuoB s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?S?nc6c2mf;hVklC`k!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcG0.`s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7jo=ZI s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li=BlklC`k!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;9`M>uf?s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?Jc>nc7qSklC`k!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;9`LB$Kc>nc7hPklC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]LB$K`Mnc6?& nc7qSjoGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0] JcFF'li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcfDkCAj8\?Ds'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joBu4 !<;0]s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,joBu4JcC<$U&WpKs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,h#N$+e,SY4s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,klB65o`3_G irK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;'ZJcGBBirK*e!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;'Zk5XHA[f?"#JcG'9joGEh!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<;'ZJcFO*li@&n!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<;BcfDkLDi;_p>s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,joBu4!<;0]s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joC&6o`3;;irJHGf)YhY!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:aQJcF!pjoGEh!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]T)[^Ks'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,huJ?.nc.MIs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,huJ?.rVuEg\c;4#l2TcDs'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irFZ1f)Ot7s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,klB?8 o`3hJjoGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0] JcGTHjoGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0] JcC<$JcD5>f)YhY!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:XNJcEmmjoGEh !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]dJrk> fDjb/s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,h#N$+mf2)Cs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,huMU5irHalo`0RCkl9ZCs'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,g&Q^(huDp@s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li>Q8 o`3hJjoGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;'ZJcGTH joGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]Jc>`M o`3MAirJ$;RfJ$>a8b9%s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,joCeKf)YhY!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:XN JcG'9d/a2S!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:XNJcGTHo`2H#mf;VPhuNdb !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<:sWJcF*sklC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`eGo1Ah>cC5s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,irFZ1o`*qOs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, irFZ1JcC<$P5h*RJcE[gjoGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<;0]cN!P;eGn,#s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,e,Y(" li5?4s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,f)X>#irI'unc47@jo=-:s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,b5d+n irA6Cs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,joEp2o`3_GirK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sWJcGBB irK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sWJcG]Ko`3_GirIg5T`BZD^Am3ns'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irG8BOoU(5kl7+PJcGKEo`2>unc7hPf)YhY !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:XNJcF!pjoGEh!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]dJrk>gAft/s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,huJ?.mf22Fs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,huJ?.JcC<$P5h*RJcEIairK*e!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<:sWdJrb;dJoI3JcFj3ScHt6irI:&nc47@ir@L.s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,\H%3\jo=HCs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joEp2nc7;Ah#RI_!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:jTJcG0u mf;MMRfJ$>a8b0"s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, joEg/nc72>f)YhY!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:OKJcG'9e,]MV !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:XNJcC<$JcCo5T`BZD[K#%_s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,g&TFunc6l5 QiM^;jo;4Y^]3d/a2S!<<(,!<<(,!<<(,!<:=EJcG'9d/a2S !<<(,!<<(,!<<(,!<:FHJcGTHnc7_MjoEp2VZ;;JXT-lPs'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,f)UC%!<98'qu?3eJcFa0YQ07Smf2hXYlF7ok5V"QJcERd huNdb!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;'ZcN!G8dJoI3JcFs6RfJ$>JcC<$P5jkK rr9V2JcDhOd/a2S!<<(,!<<(,!<:FHaT(f2`W*7Equ?*bJcFa0ZN.?3irI^2o`0RC huB8Jn,MDJJcG9?h#RI_!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sWcN!G8dJoI3JcFj3T`BZD o`+Rak5XHAeGnt;o)Hl5JcDVIQiM^;p]%l+p&FR_JcFO*]E!N_kl:2RYlF.lm/NaZ JcE7[h#RI_!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<:aQcN!G8cMs.0JcFj3VZ;;JJcC<$O8nPHo)I);JcDDCRfLG-o`2Z) ^B!j)nc47@h#G+hVuPcWh>d-JJcFX-U]BHTjoBu4p]&V@s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,g&T=ro`3)5QiM^;jo;4YJcG9? o`4@YirIL,mf;DJjoBu4RfAiWJcG9?`;o0&nc47@f)O"qJcFX-o`2#lnc8.Yli@%b ]E!N_XT-cMs'Pj,s'Pj,s'Pj,s'Pj,d/_8fo`2u2YQ4S#nc47@huC"_JcC<$JcC]/ li>lAo`0RCOoM!Q^]3s,^]27Ql2U2PJcF=$d/]R6irJ6Anc47@irAHIqu=D2fDjt5 Jc>`ML&fuDmf7q=PlI`Mmf7q=JcF^/ mf<%\_>q%Enc6H)nc66#mf7q=g&LUCJcG'9irJZMo`0RCjo=cLJc>`MjoEg/b5h,5 mf<%\WW9p9nc6H)a8kB&nc47@e,RntJcFO*nc8RejoEC#mf7q=JcF^/mf;_Sd/\at huE6I[f>muJcFF'nc47@^Ama(V#Tucrr; JcF=$nc8[ho`0RCJcC<$JcG9?mf7q=JcF^/mf;VPe,ZWNnc6H)o`2>unc47@g&LUC JcFj3irJlSo`0RCkl:)OJcGKEjoF?>\H)X/mf;_S[K*u?nc6H)o`2H#nc47@f)P:@ JcEIao`5!kirI'umf7q=JcF^/mf:l;qZ)3Ib5_#4ZiBRrJcFO*nc47@^Ama(V#T6N JcC<$iW&?Hp&Dl/[f>mu^]3s,[f>muJcF=$nc47@JcC<$JcFj3mf7q=JcF^/li;V: kl:2R^]3s,ZiBIoJcFX-nc47@h#HC7rr;WkJcG'9mf7q=mf2MOl2RFWj8Zsr[f>mu ^]3s,[f>muJcF=$nc47@^Alme_Z0')JcC<$iW&?HJcCu7o`25rmf7q=huE?LJcE@^ o`1T`irFZ1JcF^/mf;VPe,ZWNnc6H)o`2>unc47@g&L^FJcC<$JcC<$jo=cLJcC<$ iW&6EJcFj3o`2c,nc5oonc47@huE6IJcF=$g&Q^(li6MUJcFs6joG)SScI:?g&S/Q o`2c,nc6#rnc47@h#HpFJcEIah#P4imf7q=JcF^/mf7q=OoP(SXoIqlJcFa0nc47@ ]DqO(T)[pQJcC<$iW&?HJcFj3o`2c,nc6#rnc47@h#HpFJcC<$JcC<$jo=cLJcC<$ jT"QHJcFa0o`2c,nc5oomf7q=irAQLJcF*shuJ?.mf2_UJcFa0klCV\RfJ$>f)PCC ^]3j)ZiBIoJcFX-nc47@^Am3n\c;4#JcC<$iW&6EJcCu7nc5flmf7q=jo=lOJcEIa nc50Zli;V:JcF^/li;V:jo=uR^]3j)YlF7oJcFX-nc47@JcC<$JcFs6mf7q=JcF^/ mf7q=irAQL^]3s,WrMViJcFj3nc47@a8b0"JcGBBmf7q=h#G4ks'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,g&Q^(h#HpF^]3j)YlF7oJcFX-nc47@ _>iNq\c;*uJcC<$jT"QHJcCl4nc5]inc47@jo=uRJcE@^nc5'Wnc47@JcF^/li;V: jo=lO^]3j)YlF.lJcFa0o`0RCJcC<$JcFj3nc47@JcF^/mf7q=huE6I^]3s,WrMMf JcFs6nc47@_>iNqJcGTHnc47@e,Reqs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,huJ?.huE6I^]3s,XoIhi JcFj3nc47@`;eitZiBRrJcC<$jT"QHJcCc1nc5]imf7q=li6MUJcE@^o`1BZli;V: JcFp5li;V:irAQL^]3s,WrMViJcFj3nc47@JcC<$JcFs6mf7q=JcFg2mf7q=h#HpF _Z00,VuQ;fJcFs6nc47@^Am*kKE(B?JcF=$f)YhY!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<;'ZJcFa0nc6H)o`2#lnc47@jo=lOJcEmmirH=`mf7q=JcFg2mf7q= MuWGMV#TucJcG'9nc47@^Ama(R/cLQJcC<$kPsuNJcFX-nc6H)o`2#lmf7q=kl:2R JcC<$JcC<$kl:2RJcC<$jT"ZKJcFF'o`2c,nc5Kcnc47@mf2hXJcE@^g&R*3mf7q= g&KP%s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joBu4 jo=lO_Z00,WrMMfJcFs6nc47@c2Zf(XoIqlJcC<$jT"ZKJcCQ+o`1ffmf7q=nc/.[ JcE@^nc50ZjoBu4JcG-;mf7q=h#I$I^]3j)VuQ;fJcFs6o`0RCJcC<$JcFs6nc47@ JcFg2mf7q=f)PCC^]3j)V#TucJcG0]m` JcF=$nc6H)o`1]cmf7q=nc/7^JcC<$JcC<$kl:2RJcC<$lMp2NJcF4!nc6Q,nc50Z nc47@p]'daJcE@^o`4@YhuKeWmf7q=b5^f.s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,li;V:nc/.[^]3s,U&XQ]JcGBBnc47@huD^:qu?3eYlF7oJcC<$lMp;Q JcC<$s8V`lS,_pWJcGTHnc47@]DqF%T)\?]q#BmbJcC<$s8VEcJcF=$nc6H)o`1T` nc47@o`+I^JcC<$JcC<$kl:2RJcC<$mJlMQJcF*snc6Q,nc50Znc47@p]'mdJcE7[ o`4.ShuL"]nc47@b5^f.s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, kl?;7o`+I^_Z00,T)\?]JcGBBnc47@irA-@p&F[bXoIqlJcC<$mJlMQJcC<$s8V`l R/c^WJcGTHnc47@]DqO(S,`$Zq#Bd_JcCH(li;V:e,St=_Z00,T)\6ZJcGKEnc47@ JcC<$JcG'9nc47@JcG$8mf7q=c2[G:^]3j)R/c^WJcG]Knc47@]DqF%i;_^8[f>mu JcEmmli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcGBB o`2c,nc59]mf7q=p]'daJcFs6joFlMo`25rnc47@JcG-;li;V:JcGcMnc5'Wmf7q= !<;TiJcE@^nc59]nc87\nc47@M#ZfAJcF*so`2c,nc50Znc47@qZ$*dJcC<$JcC<$ kl:2RJcC<$mJlVTJcEmmo`2c,o`19Wnc47@rVuEgJcE@^nc7DDirHalnc47@b5^f. s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q= o`+Ra^]3j)S,`$ZJcGTHnc47@li5uFn,MqYYlF7oJcC<$nGhhTJcC<$r;Z`Mnc47@]DqF%T)\?]o)J.YJcCZ.mf7q=c2[G:^]3j)S,_pWJcG]Knc47@JcC<$ JcFs6o`0RCJcG-;mf7q=a8bf4^]3s,P5k(QJc>`Mo`0RC\Gu4%dJr5,_Z00,JcEmm mfmf7q=JcGQG nc4jQnc4=Bnc47@]DqF%T)\?]n,MqYJcCc1mf7q=b5_,7^]3s,Q2gCTJcG]Knc47@ JcC<$JcG'9nc47@JcG6>mf7q=a8b]1_Z00,P5k(QKE(KBJcE@^nc6l5irI1#o`0RC a8bT.s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,mf7q=qZ$*d^]3s,Q2gCTJcG]Ko`0RCo`*qOj8\cPXoJ%oJcC<$nGhqW JcC<$pAadcO8nbNLB$fEJcE7[o`1T`nc8%Vmf7q=PlL1PJcEmmnc6Q,nc4sTmf8"? nc47@JcC<$JcFs6nc47@JcG?Amf7q=`;fB._Z00,O8nbNLB$fEJcE@^nc6Z/irIL, nc47@a8bT.s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,mf7q=qZ$*d_Z00,P5k(QKE(KBJcGKEjoF?>nc5oonc47@JcG?A mf7q=JcGHDnc4XKnc4OHnc47@]DqF%T)\?]l2U;SJcD):mf7q=a8b]1_Z00,P5k(Q KE(KBJcC<$JcC<$kl:2RJcC<$pAaIZJcE[gnc6Q,nc4aNmf84Eo`0RC\Gu4%]`7!l fDkCAJcEmmmfd$GYlF7o JcC<$pAaR]JcC<$oDe@]N;rGKM?!,HJcE@^nc59]nc7hPnc47@ScA-YJcE[gnc6Q, nc4aNnc4FEnc47@JcC<$JcFs6o`0RCJcGHDli;V:_>j0.^]3s,M?!,HN;rGKJcE@^ nc6,uirIp8nc47@b5^o1s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,nc47@qZ$3g^]3j)O8nbNLB$oHJc>`M irI^2o`2,oo`0RCJcGHDmf7q=JcG6>nc4OHnc4aNnc47@\Gu4%S,`-]j8\QJJcDMF mf7q=_>j0.^]3s,N;rGKM?!,HJcC<$JcC<$kl:2RJcC<$q>]d]JcEIao`2c,o`0jK mf8FKnc47@]DqF%YlE_`j8\cPJcEdjmfj0.^]3s,M?!,HN;rGKJcC<$JcC<$kl:2RJcC<$q>]m`JcEIa nc6Q,nc4FEnc4aNo`0RC\Gu4%VuPcWm/QVVJcEdjmf`Mnc6Q,nc4OHnc4XKo`0sNjoEL&o`2,onc47@JcGcMli;V:JcG-;nc4=B nc6u8joFHAnc47@\Gu4%S,`$Zh>d$GJcDqRli;V:^Ama(_Z00,LB$fEP5k(QJcC<$ JcC<$jo=uRJcC<$r;Z3cJcE7[nc6Q,nc4=Bnc72>h#QU;nc47@]DqF%S,_LKq#Bmb JcEdjmfbXuo)J7\JcE@^nc50Znc7MGmf7q=ZN'@nJcE@^ nc6Q,nc4FEnc4jQnc47@JcC<$JcFj3o`0RCJcGcMmf7q=[K#dt_Z09/Jc>`Mmf;DJ `;oT2nc47@\Gu4%P5jPBrr;WkJcE[gmfJcC<$kPt)QJc>`Mmf;VP]E%a,o`0RC\Gu+" S,`-]fDkCAJcE.Xmf7q=\Gu+"_Z09/Jc>`Mnc72>h#QU;nc47@JcC<$JcFj3o`0RC K)b9>JcE%Uo`2c,o`0RCrVuEgl2S9oqu?3eJcE@^nc4XKg&Q^(`;f9+s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, mf7q=rVuNj^]3s,Jc>`Mnc7;Af)Y(8o`1K]irHalo`2#lnc47@L&^TAJcC<$jT"lQ JcGTHnc8.YT`BZD]DqF%R/cgZeGo(>JcE@^mf7q=[K#n"^]3s,Jc>`Mnc7VJ`;oT2 nc47@JcC<$JcFa0o`0RCL&^TAJcDqRo`2l/nc47@rVuis(s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,mf7q=rVuNj^]3s,Jc>`Mmf;DJ`;oT2nc59]joDslnc5]inc47@M#ZoD JcC<$iW&QNJcGTHmf<._RfJ$>]DqF%R/cgZeGnt;JcERdmf7q=ZN'Rt_Z00,JcG]K nc7qS\H)O,nc47@JcC<$JcFa0o`0RCM#ZfAJcE%Unc6Q,nc47@qZ$*dq#?f`JcE7[ o`0RCrVtmXJcE[gmf`Mnc6Q,nc47@rVuEgm/OBlrr;NhV#TQWZiBRr WrM_lJcCQ+mf7q=ZN'\"\c;4#JcGKEnc8ReRfJ$>\Gu+"R/cgZdJrb;JcE[gmf7q= ZN'Iq_Z00,JcG]Kmf;qYScF?AJcC<$JcFa0o`0RCMuW,DJcE@^joE9unc47@qZ$!a rr8>cJcE@^nc47@p]'7RJcEmmmf`Mnc6Q,nc47@rVuhm_cN!G8JcGKEa8l6J!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<:aQJcEIanc4sTo`3D>mf7q=b5^o1JcDqRnc6Q,nc47@qZ$*d q#?f`JcC<$JcC<$huE?LJcCc1li;V:a8a<_cN!P;JcGBBc2dlP!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:aQJcEIanc47@nc.VLJcF*s li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;Kf JcG]Knc6Q,nc47@qZ$*dq#?f`XoID]XoIqlVuQDiJcCc1li;V:b5]3VfDkCAJcGBB f)YhY!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<:sWJcERdnc5'Wnc6u8nc47@c2[,1JcE7[klAU#o`0RC p]'[^rr8>cJcC<$JcC<$huE?LJcCc1mf7q=b5]*SfDkLDJcG9?g&V.\!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<:sWJcE[gnc47@mf2)CJcF4!li@&n!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<;BcO8n#9`W,T2JcGKEK)i7XirH"Wnc5Tfo`0RCOoObJ JcF*sYQ3MZo`0RCnc.DFs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irFZ1 `;fK1Q2gCTcN!>5JcF4!li;V:`;e*_cN!P;JcGBBb5hQM!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:aQJcC<$JcC<$irAZOJcCl4mf7q=c2Y!J i;`?JJcG9?huNdb!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;'ZJcEdj nc47@mf1l=JcFF'li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;ors'Pj,li<=Na8j`i nc47@o`*2:s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,g&S\`joD+To`1ffnc47@QiHCPJcF4!U]BHTo`0RCmf2DLs'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irFZ1b5_#4Q2gCTbQ%,5JcF4! mf7q=b5]*SgAg^DJcGBBf)YhY!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sWJcC<$JcC<$jo=uR JcCu7mf7q=d/TmAk5XuPJcG0$gAg^DJcGBBf)YhY!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sW_Z/WrU&XZ`V#TucJcD): mf7q=e,Q!>l2U;SJcG9?joGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<;0]JcF!pnc4jQo`3)5nc47@g&LL@JcF!pYQ3V] nc47@nc.MIs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irFZ1JcC<$ JcFs6o`0RCQiHLSJcF4!RfM^Qnc47@nc.hRs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joBu4d/WY:JcG'9nc8Re huJ?.irA6Cs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irGeQXT7;Znc47@nc.MIs'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irI:&irGSKnc5Kcnc47@RfDgVJcF4!f)YhY!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:XNn,MqYJcG9?klC`k!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<;9`JcF4!nc4aNo`3)5mf7q=huE-FJcF*sU]BQWnc47@nc.VLs'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irFZ1JcC<$JcG'9o`0RCRfDgV JcF4!f)YhY!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:XNn,N%\JcG9? klC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<;9`JcF*snc47@li6MUp&EqMJcFj3klC`k!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sWVuNFj k5Y)SJcG0+s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,h#R$Gnc47@o`+%R s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:e,St=O8nkQ`W,K/JcFa0mf7q=e,Pm;l2UDV JcG0N;rPNS,`-] JcDMFmf7q=e,SP1s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,joG2Vo`0RCo`+7Xs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, li;V:g&LUCN;rPN_Z00,JcG'9mf7q=e,S>+s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,h#R-Jnc47@o`+%R s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7JcC<$JcG9?nc47@VZ5u_JcF=$joGEh!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]qu?3eJcGKE li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcFF'nc47@ jo=uRj8\$;JcG0 JcF=$klC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<;9`rr;WkJcGBBmfm\`W,'#s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joG;Yo`0RC o`+7Xs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li?h\irF`3 nc5'Wnc4OH`;nruli;V:f)Ot7s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,g&Q^(p]'[^s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q= huE6IM?!,H^]3j)JcGTHli;V:f)Ok4s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,klCV\o`0RCo`+7Xs'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:JcC<$JcG9?o`0jK_>rWrmf7q= e,Sb7s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,h#N$+p]'R[s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=irAQLJcFX-nc72> irF`3Mu`PNjoE^,klC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<;9`qu?dYJcG]Knc5'Wnc4aN\H(momf7q= e,Sb7s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,huJ?.o`+@[s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:jo=lOLB$fE ^]3a&dJqo#eGnt;JcF=$klC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`rr;WkJcGBBmfrWrmf7q=e,Sb7s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,h#N$+p]'R[s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcC<$ JcGBBnc5'WVZ?Mlmf7q=d/WG4s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,irFZ1p]'[^s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,li;V:kl:2RJcFO*nc6c2irJ->^B!s,li?h\YQ3V]joF-8 li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:jTJcGKEmfs'Pj,^Aribc2[54s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7o`+I^s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,mf7q=JcC<$JcGBBnc5]iirK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:jTJcF!p li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<;BcJcGKEmfRls'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joBu4e,Sk:s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=o`+@[s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,mf7q=mf2hXJcGKEnc6,uh#RI_!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<;0]JcEmmmfRls'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7d/WP7s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=o`+@[s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, mf7q=nc/.[JcF!pnc5ooirK*e!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<;0]JcFa0f)YhY!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<;KfJcGBBmfIis'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joBu4huDL4s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, mf7q=p]'[^s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=nc/.[JcG]Knc6H)klC`k!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<;9`JcF=$mfRls'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7d/WP7s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=o`+I^s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,mf7q=JcC<$JcG0Rls'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,kl?;7h#HL:s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=o`+I^s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,nc47@ mf2hXJcG]Knc6H)li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcF=$ mfj'+^]3Nus'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,li;V:f)P1=s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=o`+@[s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=nc/.[ JcGKEmf:H/li@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;Bc JcFF'mfmf nc8\t!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;KfJcFF'mfs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,mf7q=g&LL@s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:kl9lIs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7JcC<$ JcF!pmf;2Dmfs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=g&LL@s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=jo=HCs'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joBu4 o`+I^JcFF'mf;;GmfuDmfcpDs'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q= f)P(:s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:huDU7s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joBu4JcC<$JcE[gli?)GmfcpDs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=f)P(:s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,li;V:huDU7s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, irFZ1o`+@[JcF4!li?2Jmfmf2hXJcEIali?)GmfuGjo=lOJcE.Xli?;MmfJcC<$JcDhOklC;Sli@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;KfJcEmmirK*e!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;'ZJcEdjVZ;;Jjo=cLJcCc1li?;MmfuGJcC<$JcD):klCMYmfuGjo=lOJcE%UjoG;Ymfb5^o1JcD2=nc47@JcGHDklCMYmf7JcD): nc47@RfDUPqu?!_s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,li;V:^AjGuJcEmmmf;)AqZ)3IJcC<$JcC<$kPs$3s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;V:YQ(g,rr;WkJcF!pmf7q=RfDgVJcC<$oDdqQ rr;o6Ls'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7MuW,D i;`?JJcF=$mf7q=RfDgVJcC<$iW%C-s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,kl?;7 VZ4C2p&F[bJcF*smf7q=RfDgVJcCZ.g&V.\!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]JcC<$df8t?JcF=$mf7q=RfDgVJcC?% f)YhY!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<;9`JcDDCb5h#2o`0RCd/WP7JcC<$JcC<$JcDAB g&V.\!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0] JcC<$df8k g&V.\!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0] JcC<$df8t?JcF4!nc47@JcC<$JcC<$L]?B7s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, huJ?.JcF'rnc47@h#HgCJcD2=mf7q=JcEjlg&V.\!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]JcC<$df8t?JcF=$mf7q=RfDgVJcC<$ nGh;Es'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,g&Q^(JcEsoo`0RCh#HgCJcD2=mf7q=JcFp5huNdb!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;0]JcC<$cio/eJcF0unc47@huE-FJcC<$JcC<$JcC<$o)G]irr;!Y JcC<$g]-pHJcFa0nc47@RfDgVJcC<$W;heVJcC<$df8kEqj8\->JcC<$kPt2TJcFs6mf7q=ScA-YJcC<$JcFR+irFZ1JcG?A o`0RCmf2_UJcD;@mf7q=JcDSHg&TY&joBu4JcG$8o`0RCkl:2RJcC<$JcC<$JcC<$ JcG9?irFZ1JcGHDnc47@mf2hXJcD2=nc47@JcC<$qu>@MeGnP/JcC<$mJlhZJcG'9 mf7q=RfDpYJcC<$JcF7"irFZ1JcGQGo`0RCnc/%XJcD;@mf7q=JcC<$bQ$T&JcC<$ nGi.]JcG'9mf7q=JcC<$JcC<$JcC<$li5uFJcC<$r;Zo`0RCli6MUJcD2=mf7q=JcC<$cMuo)JcC<$s8V`lJcG9?nc47@ RfDpYJcC<$JcEUeirFZ1JcGHDo`0RCmf2_UJcC<$JcC<$JcC<$JcFa0irFZ1K)bBA JcGBBmf7q=ScA-YJcC<$JcD5>irFZ1JcGHDo`0RCmf2_UJcD;@mf7q=JcC<$`W+ru JcCH(o`0RCo`+@[JcD;@mf7q=JcC<$]`7!lJcC<$r;Z`MirFZ1M#[#GJcGKEmf7q=ScA-YJcC<$JcDtSirFZ1PlL:SJcG]Kmf7q= T`=H\JcC<$JcDPGirFZ1MuW>JJcGKEnc47@JcC<$JcC<$JcC<$`;eitJcCu7o`0RC qZ$*dJcD;@mf7q=JcC<$JcGTHjoBu4MuW>JJcGKEnc47@ScA-YJcC<$JcDYJirFZ1 RfDpYJcG]Knc47@ScA6\JcC<$JcD5>irFZ1OoOtPJcGTHmf7q=JcC<$JcC<$JcC<$ ^Am3nJcD2=o`0RCrVuAirFZ1T`=Q_Jc>`Mmf7q=T`=H\JcC<$JcD#8irFZ1PlLCVJcGTHnc47@ JcC<$JcC<$JcC<$[K#7eJcDDCo`0RC!<;KfJcDDCmf7q=JcC<$JcG'9irFZ1QiHUV JcG]Kmf7q=T`=H\JcC<$JcD#8joBu4U]9lbKE(B?JcDDCmf7q=JcC<$N;qo`Mnc47@T`=H\JcC<$JcC<$ irA$=JcD2=o`0RCrVuEgJcD;@mf7q=JcC<$O8n>BJcDVIo`0XEnc47@T`=H\JcC<$ JcCB&joBu4ScA?_Jc>`Mmf7q=JcC<$JcC<$JcC<$VZ5cYJcD_Lnc4FEmf7q=U]9c_ JcC<$JcC<$g&L(4JcDDCo`0RC!<;KfJcDDCmf7q=JcC<$M>uT9JcDhOo`0aHmf7q= U]9c_JcC<$JcC<$rVtmXJcDMFo`0RC!<;TiJcC<$JcC<$JcC<$JcDDCirFZ1YQ+.n M?!#EJcDDCmf7q=JcC<$JcF4!joBu4U]9ueKE(B?JcDDCmf7q=JcC<$Jc>`MirFZ1 ZN'RtM?!#EJcDMFmf7q=JcC<$JcGBBirFZ1WW2VkKE(B?JcC<$JcC<$JcC<$JcD2= irFZ1[K#dtM?!,HJcDDCmf7q=JcC<$JcEmmjoBu4WW2VkKE(KBJcDDCmf7q=JcC<$ JcGKEirFZ1\Gu4%M?!,HJcDMFli;V:JcC<$JcG0HJcDMFmf7q=JcC<$JcE[girFZ1YQ+7qLB$]BJcDMF mf7q=JcC<$JcG0HJcDVIli;V:JcC<$JcFj3irFZ1[K#dtM?!,H JcC<$JcC<$JcC<$JcCQ+irFZ1_>j'+O8nYKJcDMFmf7q=JcC<$JcE@^irFZ1[K#n" M?!#EJcDMFmf7q=JcC<$JcFj3joBu4_>j0.O8nYKJcDMFmf7q=JcC<$JcFO*joBu4 \Gu+"N;r>HJcC<$JcC<$JcC<$JcC?%joBu4_>j0.O8nbNJcDMFmf7q=JcC<$JcE%U irFZ1]DqF%N;rGKJcDMFli;V:JcC<$JcFa0irFZ1a8bf4O8nbNJcDMFmf7q=JcC<$ JcF4!joBu4^Ama(O8nYKJcC<$JcC<$JcC<$JcC<$r;YdWJcEdjo`10Tmf7q=VZ6)b JcC<$JcC<$WW1uYJcERdnc4aNmf7q=VZ5u_JcC<$JcC<$g&L(4JcF!pnc4sTmf7q= VZ6)bJcC<$JcC<$c2Zf(JcE[gnc4aNnc47@JcC<$JcC<$JcC<$JcG?AirFZ1c2[G: Q2g:QJcDVImf7q=JcC<$JcDDCjoBu4`;fB.P5jtNJcDMFmf7q=JcC<$JcF*sirFZ1 e,St=R/cUTJcDVImf7q=JcC<$JcE[girFZ1b5_#4P5jtNJcC<$JcC<$JcC<$JcC<$ mJl2HJcF4!o`19Wnc47@VZ6)bJcC<$JcC<$RfDCJJcEmmnc4jQnc47@U]9c_JcC<$ JcC<$a8b0"JcFF'nc5'Wnc47@VZ6)bJcC<$JcC<$]DpmkJcF!po`19Wmf7q=JcC<$ JcC<$JcC<$JcFg2irFZ1g&L^FR/cUTJcD_Lli;V:JcC<$JcCu7irFZ1d/WY:Q2g:Q JcDVImf7q=JcC<$JcEIajoBu4h#HpFS,_pWJcD_Lmf7q=JcC<$JcE%UjoBu4d/Wb= Q2gCTJcC<$JcC<$JcC<$JcC<$g]-C9JcFO*o`1BZnc47@WW2;bJcC<$JcC<$MuVf; JcF4!o`1BZmf7q=VZ6)bJcC<$JcC<$[K#@hJcFX-o`1T`mf7q=WW2DeJcC<$JcC<$ WW2)\JcF=$o`1BZmf7q=JcC<$JcC<$JcC<$JcF:#joBu4irAQLT)\?]JcD_Lli;V: JcC<$JcC?%irFZ1g&L^FR/c^WJcDVImf7q=JcC<$JcDqRirFZ1jo=uRT)\?]JcD_L mf7q=JcC<$JcDMFirFZ1h#I$IS,_pWJcC<$JcC<$JcC<$JcC<$ci<#*JcFs6nc5B` mf7q=XT.VeJcC<$JcC<$JcGQGjoBu4h#I$IS,_pWJcD_Lmf7q=JcC<$JcDVIirFZ1 li6VXU&XQ]JcDhOmf7q=JcC<$JcD2=irFZ1irAZOS,`$ZJcC<$JcC<$JcC<$JcC<$ `rG'!JcG0joBu4irAZOS,`$ZJcD_Lmf7q= JcC<$JcD;@irFZ1nc/7^V#Tl`JcDhOmf7q=JcC<$JcCl4irFZ1kl:;UT)\6ZJcC<$ JcC<$JcC<$JcC<$_#NEpJcGBBnc5Kcmf7q=YQ*qhJcC<$JcC<$JcG$8irFZ1kl:;U T)\?]JcD_Lmf7q=JcC<$JcCu7irFZ1p]'mdV#TucJcDhOmf7q=JcC<$JcCQ+irFZ1 mf2hXV#Tl`JcC<$JcC<$JcC<$JcC<$\,YRjJcGKEnc5Tfmf7q=YQ*qhJcC<$JcC<$ JcF^/irFZ1mf2q[U&XQ]JcDhOmf7q=JcC<$JcCZ.joBu4qZ$3gVuQ2cJcDqRmf7q= JcC<$JcC<$s8V3]JcG9?nc5Kcnc47@JcC<$JcC<$JcC<$JcDnQjoBu4qZ$3gVuQ;f JcDqRli;V:JcC<$JcC<$f`0t3JcGBBnc5Kcnc47@XT._hJcC<$JcC<$L&^05Jc>`M o`1oinc47@YQ+%kJcC<$JcC<$JcGQGirFZ1p]'daVuQ2cJcC<$JcC<$JcC<$JcC<$ X8h2[Jc>`Mo`2#lmf7q=ZN'7kJcC<$JcC<$JcF'rirFZ1qZ$*dVuQ2cJcDqRmf7q= JcC<$JcC<$r;YdWLB$fEXoIhiJcE%Umf7q=JcC<$JcC<$nGhMKJcG]Knc5Tfnc47@ JcC<$JcC<$JcC<$JcDJEirFi6o`2,omf7q=ZN'7kJcC<$JcC<$JcEaijoBu4rVuEg WrMMfJcDqRmf7q=JcC<$JcC<$oDdhNN;rGKYlF.lJcE%Umf7q=JcC<$JcC<$kPsQB KE(KBWrMViJcC<$JcC<$JcC<$JcC<$RK):IN;rPNXoIqlJcE%Uli;V:JcC<$JcC<$ _#NEpKE(KBWrMViJcDqRmf7q=JcC<$JcC<$lMolEP5k(QYlF7oJcE%Umf7q=JcC<$ JcC<$hZ)U9LB$oHXoIhiJcC<$JcC<$JcC<$JcC<$PQ0YCP5k1TYlF.lJcE.Xli;V: JcC<$JcC<$\,YIgM?!,HXoIhiJcE%Umf7q=JcC<$JcC<$iW&$?Q2gCTZiBIoJcE7[ li;V:JcC<$JcC<$ec4b3M?!5KXoIqlJcC<$JcC<$JcC<$JcC<$MZ;f=Q2gLWZiBIo JcE.Xli;V:JcC<$JcC<$Y5dM^N;rPNYlF.lJcE%Umf7q=JcC<$JcC<$g]-:6R/cgZ [f>drJcE7[li;V:JcC<$JcC<$bl?f*O8nkQYlF.lJcC<$JcC<$JcC<$JcC<$L]?B7 S,`$Z[f>muJcE.Xli;V:JcC<$JcC<$V>oQUP5k1TYlF7oJcE.Xli;V:JcC<$JcC<$ df8>-T)\H`[f>muJcE7[li;V:JcC<$JcC<$`rG'!Q2gLWZiBIoJcC<$JcC<$JcC<$ JcC<$JcG`LirGeQnc66#mf7q=\Gu!tJcC<$JcC<$JcD/umf7q=\Gtmq JcC<$JcC<$JcEjlirGnTo`2Q&mf7q=]Dq3tJcC<$JcC<$JcEF`irGSKo`2>unc47@ JcC<$JcC<$JcC<$JcC<$p&F%PVuQ;f]`7F#JcE@^li;V:JcC<$JcC<$OT4GCS,`-] [f>drJcE7[li;V:JcC<$JcC<$_#NEpWrM_l]`7F#JcE@^li;V:JcC<$JcC<$[/].d U&Xcc[f>drJcC<$JcC<$JcC<$JcC<$JcG3=irH4]nc6?&nc47@]Dq3tJcC<$JcC<$ JcCW-irGeQo`2H#nc47@\GtmqJcC<$JcC<$JcE4ZjoDO`o`2Z)nc47@]Dq3tJcC<$ JcC<$JcDeNirH"Wnc6?&mf7q=JcC<$JcC<$JcC<$JcC<$k5XQDYlF7o^]3a&JcEIa li;V:JcC<$JcC<$JcFa1VuQDi\c;*uJcE@^li;V:JcC<$JcC<$Y5dVaZiB[u^]3a& JcEIali;V:JcC<$JcC<$UAs?UWrMVi]`7O&JcC<$JcC<$JcC<$JcC<$JcFR+joDaf o`2l/mf7q=^AmO"JcC<$JcC<$JcC<$q#B@SXoIql^]3a&JcE@^li;V:JcC<$JcC<$ W;klX\c;=&_Z0')JcERdkl?;7JcC<$JcC<$SH%ULYlF7o^]3a&JcC<$JcC<$JcC<$ JcC<$JcFI(irHXio`2l/nc47@^AmO"JcC<$JcC<$JcC<$n,MMMYlF7o^]3j)JcE@^ li;V:JcC<$JcC<$TE!pO^]3j)`W,K/JcERdli;V:JcC<$JcC<$OT4>@[f>mu_Z0') JcC<$JcC<$JcC<$JcC<$JcF-tirHjoo`2u2mf7q=`;f'%JcC<$JcC<$JcC<$k5XQD [f>mu_Z0')JcERdkl?;7JcC<$JcC<$QN,tF`W,K/aT(]/JcE[gli;V:JcC<$JcC<$ L]?B7]`7O&_Z00,JcC<$JcC<$JcC<$JcC<$JcEgkirI'uo`2u2nc47@`;f0(JcC<$ JcC<$JcC<$h>cL8]`7O&`W,B,JcERdli;V:JcC<$JcC<$MZ;]:bQ%,5bQ%#2JcE[g li;V:JcC<$JcC<$JcG`LirHjoo`2u2mf7q=JcC<$JcC<$JcC<$JcC<$_Z/WrbQ%58 aT(f2JcE[gli;V:JcC<$JcC<$JcF7"irHjoo`2u2nc47@_>ij%JcC<$JcC<$JcC<$ joE^,nc6l5nc47@a8bB(JcC<$JcC<$JcC<$p&F.S_Z09/aT(]/JcC<$JcC<$JcC<$ JcC<$JcE:\joE^,o`328mf7q=a8bK+JcC<$JcC<$JcC<$bQ$T&`W,T2aT(]/JcE[g li;V:JcC<$JcC<$JcGWIirIL,o`3;;mf7q=b5^]+JcC<$JcC<$JcC<$n,MDJaT(o5 aT(f2JcC<$JcC<$JcC<$JcC<$JcE(VirIU/nc6u8nc47@b5^]+JcC<$JcC<$JcC<$ _Z/WrbQ%58aT(f2JcEdjkl?;7JcC<$JcC<$JcG<@irI^2o`3D>mf7q=b5^f.JcC<$ JcC<$JcC<$j8\->cN!P;bQ%#2JcC<$JcC<$JcC<$JcC<$JcDkPirIg5nc7);mf7q= c2[#.JcC<$JcC<$JcC<$\c:dlcN!P;bQ%,5JcEdjkl?;7JcC<$JcC<$JcG!7irIp8 o`3D>nc47@c2[#.JcC<$JcC<$JcC<$gAg15eGo1AcN!>5JcC<$JcC<$JcC<$JcC<$ JcDPGirJ$;nc72>mf7q=c2[,1JcC<$JcC<$JcC<$YlE_`eGo1AcN!>5JcEmmli;V: JcC<$JcC<$JcFR+irJ?DrW)rto`3MAmf7q=d/W>1JcC<$JcC<$JcC<$dJr5,gAggG cN!G8JcC<$JcC<$JcC<$JcC<$JcD5>irJZMjoEp2nc47@d/W>1JcC<$JcC<$JcC<$ VuPcWgAggGcN!G8JcEmmli;V:JcC<$JcC<$JcF7"\H(@`nc47@d/WG4JcC<$JcC<$ JcC<$`W,'#h>d$GeGnt;JcC<$JcC<$JcC<$JcC<$JcD#8\H(Icmf7q=e,SY4JcC<$ JcC<$JcC<$T)[gNi;`HMdJrY8JcF*skl?;7JcC<$JcC<$JcEpn[K,Iimf7q=f)Ot7 JcC<$JcC<$JcC<$]`7*on,MMMeGo(>JcC<$JcC<$JcC<$JcC<$JcC]/[K,Rlmf7q= f)Ot7JcC<$JcC<$JcC<$P5jPBq#B7PfDk:>JcF*skl?;7JcC<$JcC<$JcE^hZN0Io mf7q=f)Ot7JcC<$JcC<$JcC<$[fd$GJcC<$JcC<$JcC<$JcC<$JcCT,YQ4.l nc47@f)Ot7JcC<$JcC<$JcC<$M>t!ai;`?JJcF4!kl?;7JcC<$JcC<$JcE^hVZ?Di nc47@g&L::JcC<$JcC<$JcC<$WrKC*l2U2PJcC<$JcC<$JcC<$JcC<$JcCf2U]C2i mf7q=g&L::JcC<$JcC<$JcC<$Jc>`M[K,Rlmf7q=f)Ot7JcC<$JcC<$JcC<$`W)M0 rr;EeJcFO*kl?;7JcC<$JcC<$JcDPGYQ4.lnc47@JcC<$JcC<$JcC<$JcC<$O8k%: JcFO*kl?;7JcC<$JcC<$JcC<$qZ!c"o)J.YJcF=$kl?;7JcC<$JcC<$JcEgke,]MV !<<(,!<<(,!<<(,!<<(,!<9n9JcFX-joBu4JcC<$JcC<$JcDYJU]C2imf7q=JcC<$ JcC<$JcC<$JcC<$P5j59s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,`;kJhh#HU= JcC<$JcC<$JcC<$JcG]KU]C2inc47@g&L::JcC<$JcC<$JcC<$`W+`os'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,`;kJhhuDp@JcC<$JcC<$JcC<$V#R"d rr;EeJcC<$JcC<$JcC<$JcC<$JcD#8h#RI_!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<;]ls'Pj,s'Pj,f)UC%irA6CJcC<$JcC<$JcC<$JcG]KL&cf) h#HU=JcC<$JcC<$JcC<$`W+rus'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,o`5#"!<<(,!<<(,!<:jTJcFj3joBu4JcC<$JcC<$ JcDYJf)YhY!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:"AklC`k !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<;BcJcG]KjoBu4JcC<$JcC<$JcC<$p]'@Us'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, joBu4nc.hRJcC<$JcC<$JcC<$\c:mos'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, li;\klC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`JcC<$JcC<$JcC<$JcC<$ JcD>Ali@&n!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`LB$B9JcC<$JcC<$JcC<$ JcG9?klC`k!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<;9`JcGKEjoBu4JcC<$JcC<$JcE1Yli@&n!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcN;r#?JcC<$JcC<$JcC<$R/cCNs'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,kl?;7JcC<$JcC<$JcC<$JcC<$V#Tc]s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li;nBjoBu4JcC<$JcC<$JcC<$nc.hRs'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,kl?;7!<;0]JcC<$JcC<$JcC<$ZiB@ls'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,li<+HjoBu4JcC<$JcC<$JcD#8li@&n !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;9`JcC<$JcC<$JcC<$JcC<$JcDYJli@&n !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<;BcP5jYEJcC<$JcC<$ JcC<$JcG0Hs'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf:Q2irFZ1 JcC<$JcC<$JcC<$li6DRs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf7q=JcC<$JcC<$JcC<$JcC<$ZiBIos'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,nc6l5irFZ1JcC<$JcC<$JcC<$_>is(s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,mf:6)huJ?.JcC<$ JcC<$JcCB&nc8\t!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<;KfeGnG,JcC<$JcC<$JcC<$JcFj3mfJcC<$JcC<$JcC<$JcD_Lmfc:2JcC<$ JcC<$JcC<$JcG'9mf]RWs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,joBu4JcC<$JcC<$JcC<$JcC<$Q2fkE s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,irFZ1JcC<$JcC<$JcC<$JcF'r joGEh!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<;0]JcC<$JcC<$JcC<$JcCH(huNdb!<<(,!<<(,!<<(,!<<(,!<<(,!<<(, !<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:sWJcC<$ JcC<$JcC<$JcC<$oDdqQs'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,joBu4JcC<$JcC<$JcC<$JcC<$O8n,T`BZDJcC<$JcC<$JcC<$JcFU, g&V.\!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<<(,!<:aQJcC<$ JcC<$JcC<$JcC<$JcC<$qZ!>kJcC<$JcC<$JcC<$JcC<$[/\_Xs'Pj,s'Pj,s'Pj, s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,s'Pj,f)UC%JcC<$JcC<$JcC<$JcFp5WW7VMJcC<$ JcC<$JcC<$JcFC&QiM^;JcC<$JcC<$JcC<$JcC<$JcG9?XT3qPJcC<$JcC<$JcC<$ JcDeNScF?AJcC<$JcC<$JcC<$JcFL)\H%3\JcC<$JcC<$JcC<$JcEjlU]>uGJcC<$ JcC<$JcC<$JcC<$JcFj3\H%3\JcC<$JcC<$JcC<$JcDJEU]>uGJcC<$JcC<$JcC<$ JcF0u`;kJhJcC<$JcC<$JcC<$JcEF`XT3qPJcC<$JcC<$JcC<$JcC<$JcFF'b5d+n JcC<$JcC<$JcC<$JcCr6YQ07SJcC<$JcC<$JcC<$JcEOch#N$+JcC<$JcC<$JcC<$ JcDeN\H%3\JcC<$JcC<$JcC<$JcC<$JcEdjjoBu4JcC<$JcC<$JcC<$JcC<$rr9V2 JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcE=]a8gekJcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$QiG>2JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcDSHhuJ?.JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcGQGnc47@JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcF0u JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$ JH16$JH16$JH16$JH16$JH16$JH16$o)S%TJH16$JH16$JH16$JH16$JH16$JH16$ JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$ o)S%TJH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$ JH16$JH16$JH16$JH16$JH16$JH16$JH16$o)S%TJH16$JH16$JH16$JH16$JH16$ JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$ JH16$o)S%TJH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$ JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$o)S%TJH16$JH16$JH16$JH16$ JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$ JH16$JH16$o)S%TJH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$ JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$JH16$o)S%Tli;V:JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$ScA$Vl2U)MJcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcD;@li?;Mli;V: JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$ScA$Vl2U)MJcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcD;@ li?;Mli;V:JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ScA$Vl2U)MJcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcD;@li?;Mli;V:JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ScA$Vl2U)MJcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcD;@li?;Mli;V:JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ScA$Vl2U)M JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcD;@li?;Mli;V:JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ ScA$Vl2U)MJcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcD;@li?;Mli;V:JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$ScA$Vl2U)MJcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcD;@li?;Mli;V:JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$ScA$Vl2U)MJcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcD;@li?;M li;V:JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ScA$Vl2U)MJcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcD;@li?;Mli;V:JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ScA$Vl2U)MJcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcD;@li?;Mli;V:JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ScA$Vl2U)MJcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcD;@li?;Mli;V:JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ScA$V l2U)MJcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcD;@li?;Mli;V:JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$ScA$Vl2U)MJcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcD;@li?;Mli;V:JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcC<$h>c^>JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$g&LC=l2U)MJcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ JcFR+kl?;7JcC<$JcGBBb5d+nJcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$ SH%pUl2U)MJcC<$JcC<$JcC<$JcC<$JcC<$JcGZJYQ07SJcC<$ZiB7iJcC<$JcC<$ !<9/$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcDnQli?;Mli;V:JcC<$ JcC<$JcC<$JcC<$JcC<$r;WPmJcC<$SH%pU\c:moJcC<$JcCK)U]>uGJcF'rli;V: JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$q#B[\l2U)MJcC<$JcC<$JcC<$JcC<$ JcC<$JcGZJScF?AJcDJEli=Trkl?;7JcC<$N;oILJcC<$ci<>3JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$JcC<$JcGNFli?;Mli;V:JcC<$JcC<$JcC<$JcC<$JcC<$r;W5d JcC<$V>ol^\c:moJcC<$JcCf2h#Q(,kl?;7JcF'rli;V:JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$JcC<$q#B[\l2U)MJcC<$JcC<$JcC<$JcC<$JcC<$JcGZJklB-2huJ?. JcD\Kli;V:JcC<$JcE%UjoE0ro`0RCJcF'rli;V:JcC<$JcC<$JcC<$JcC<$JcC<$ JcC<$JcC<$q#B[\l2U)MJcC<$JcC<$JcC<$JcC<$JcC<$JcGZJklAp,irFZ1JcDeN li;V:JcC<$JcE.XjoBu4JcC<$rr;^]3X#fDk1; n,LZ5eGl`Qk5XZGfDk1;o)Hu8i;_(&XoH??JcG]Kkl?S?li=BlklBQ>[K,RlYQ2uK `;mdTli?VVc2cf&c2`FqJcC<$JcC<$JcC<$JcC<$JcC<$JcG`Lli?;Mli;V:JcC<$ JcC<$JcC<$JcC<$JcC<$r;Z!]_Z/j#gAgL>^]3X#fDk1;q#A)/gAeAWk5XZGfDk1; q#A22m/Op&\c9)[oi;^"]l2RsfeGlrWbQ$o/q#A22m/Op&JcC<$ JcC<$JcC<$JcC<$JcC<$JcCE'li?;Mli;V:JcC<$JcC<$JcC<$JcC<$JcC<$r;Z!] _Z/j#gAgL>^]3X#fDk1;qu=2,h>a\Zk5XZGfDk1;qu=;/o)H?&_Z-_uf? ]`73rj8Z4]l2RsfgAe8TcN!52qu=;/o)H?&JcC<$JcC<$JcC<$JcC<$JcC<$JcCN* li?;Mli;V:JcC<$JcC<$JcC<$JcC<$JcC<$r;Z!]`W,'#gAgL>^]3X#fDk1;rr;Ee j8\->dJrP5\c:mofDk1;rr;Eek5XHAqu?!_k5XHAbQ$K#i;_g;N;r#?M>uoB^]3Nu j8\6AeGo(>gAgL>ZiAq`i;_g;eGnk8rr;Eek5XHAqu?!_k5XHAJcC<$JcC<$JcC<$ JcC<$JcC<$JcCW-li?;Mli;V:JcC<$JcC<$JcC<$JcC<$JcC<$r;Z!]aT(B&fDk1; ^]3X#fDjY,fDjt5eGnk8\c:mofDjY,fDjG&gAg:8dJr>/dJr>/O8n#9P5jbH_Z/s& j8\?D_Z0T8gAgL>[f>IidJr>/fDjY,fDjG&gAg:8JcC<$JcC<$JcC<$JcC<$JcC<$ JcC`0li?;Mli;V:JcC<$JcC<$JcC<$JcC<$JcC<$r;Z!]bQ$T&fDk1;^]3X#fDjk2 bQ$o/eGnk8\c:mofDjk2cMuf&cN!52eGnb5`W,9)N;q0'U&X?WaT(K)j8\HGQ2g1N \c:mo`W,9)fDjk2cMuf&cN!52JcC<$JcC<$JcC<$JcC<$JcC<$JcC`0li?;Mli;V: JcC<$JcC<$JcC<$JcC<$JcC<$r;Z!]dJr,)eGnk8^]3X#fDjt5aT(K)fDk1;\c:mo fDjt5bQ$T&bQ$f,gAgC;^]3X#M>t]`7cgAQ2g1N]`7c^>\c;!rJc>`MZN/)H li>H5klBQ>li<=Nli=g#klA9oli>lAklA^&klA^&li;V:JcC<$JcC<$JcC<$JcC<$ JcC<$OT4YIl2U)MJcC<$JcC<$JcC<$JcC<$JcC<$JcGZJWW9p9li=g#li>Z;klAU# li>Z;li=TrklB?8klA^&li=p&li>lAli=Koli;V:o`)H%bQ$o/eGnk8gAg:8S,_gT ^]3X#[f>[oh>c^>`W,9)_Z/s&JcC<$JcC<$JcC<$JcC<$JcC<$JcCi3li?;Mli;V: JcC<$JcC<$JcC<$JcC<$JcC<$r;Wbs_Z/s&^]3X#fDk1;^]3X#fDk1;\c:mofDk1; _Z/s&_Z/s&h>cgA[f>[oJcFX-b5fifklBH;li>Q8h#OAQli=g#li=Koli>lAli=p& li=p&li;V:JcC<$JcC<$JcC<$JcC<$JcC<$OT4YIl2U)MJcC<$JcC<$JcC<$JcC<$ JcC<$JcGZJU]AL9li=g#li>Z;li=g#li>Z;li=TrklB?8li=p&li=p&li>uDM#`,, c2ZAqdJrP5h>c^>dJqJl\c;!r_Z,Gmh>cgA_Z/s&_Z/s&JcC<$JcC<$JcC<$JcC<$ JcC<$JcCi3li?;Mli;V:JcC<$JcC<$JcC<$JcC<$JcC<$r;Z!]eGnY2bQ$o/^]3X# fDk1;^]3X#fDk1;\c:mofDk1;_Z/s&_Z/s&i;\W6JcERdirIC)li>uDli>6/_>q[W li=p&M#cB3li=p&li=p&li;V:JcC<$JcC<$JcC<$JcC<$JcC<$OT4YIl2U)MJcC<$ JcC<$JcC<$JcC<$JcC<$JcGZJklB$/klB$/li=g#li>Z;li=g#li>Z;li=TrklB?8 li=p&li=p&li>uDM#`,,]Dq!ndJrG2k5XZG_Z.@NeGnk8_Z,Gmh>cgA_Z/s&_Z/s& JcC<$JcC<$JcC<$JcC<$JcC<$JcCi3li?;Mli;V:JcC<$JcC<$JcC<$JcC<$JcC<$ r;Z!]bQ$f,dJrP5^]3X#fDk1;^]3X#fDk1;\c:mofDk1;_Z/s&_Z/s&i;`$AJcC<$ f`119cN!52l2TuJZiA)HfDk1;_Z/j#JcG]Kli=p&li=p&li;V:JcC<$JcC<$JcC<$ JcC<$JcC<$OT4YIl2U)MJcC<$JcC<$JcC<$JcC<$JcC<$JcGZJklAg)klB65li=g# li>Z;li=g#li>Z;li=TrklB?8li=p&li=p&li>uDkl?;7JcFC&joE^,li?DPlicgAJcC<$f`1(6cN!52n,MVPN;r#?h>cgA^]3X#JcG]K li=p&li=p&li;V:JcC<$JcC<$JcC<$JcC<$JcC<$OT4YIl2U)MJcC<$JcC<$JcC<$ JcC<$JcC<$JcGZJklAU#klBH;li=p&klB?8li=g#li>Z;li=TrklB?8li=p&li=p& li>lAkl?;7JcFC&klAp,li?VVli;\cgA_Z/j#fDk1;^]3X#fDk1;\c:mofDk1;_Z/s&_Z/s&h>c^>JcC<$g]-C9 aT(T,q#B[\JcG]Kli>uDli=g#kl?;7!<;Bc_Z/s&_Z/s&JcC<$JcC<$JcC<$JcC<$ JcC<$JcCi3li?;Mli;V:JcC<$JcC<$JcC<$JcC<$JcC<$r;Z!]^]3Eri;`-D`W,'# fDk1;^]3X#fDk(8]`73rfDk1;_Z/s&_Z/s&gAgC;JcC<$hZ)g?`W,9)qu>m\JcG]K li>uDklAKukl?A9li=p&li=p&li;V:JcC<$JcC<$JcC<$JcC<$JcC<$OT4YIl2U)M JcC<$JcC<$JcC<$JcC<$JcC<$JcGZJklABrklBZAklAg)joF$5li=g#li>Q8li=]u klB?8li=p&li=p&li>Z;kl?;7_>jK7VuPlZ_Z/s&rr;lAli=]ukl?J< li=p&li=p&li;V:JcC<$JcC<$JcC<$JcC<$JcC<$OT4YIl2U)MJcC<$JcC<$JcC<$ JcC<$JcC<$JcGZJklA9oklBZAklB-2huMC/li=g#li>Q8li=]uklB?8li=p&li=p& li>Z;joDafrW&5`o`2>ujoE'of)WnlrW'M/klBQ>li=]ujoDafrW([Pli=p&li=p& li;V:JcC<$JcC<$JcC<$JcC<$JcC<$OT4YIl2U)MJcC<$JcC<$JcC<$JcC<$JcC<$ JcGZJklA0lklBcDjoF$5h#Q(,li=g#li>Q8klAKuklB?8li=p&li=p&li>Q8irHsr o`19WklA^&huLFig&T+lo`2u2klBH;klABrirHsro`3_Gli=p&li=p&li;V:JcC<$ JcC<$JcC<$JcC<$JcC<$OT4YIl2U)MJcC<$JcC<$JcC<$JcC<$JcC<$JcGZJklA0l joFHAh#QpDklC__li>Z;li=g#li>H5`;o'#klB?8li=p&li=p&li>?2h#QC5irGAE e,\t;d/^NQhuLXoirJ$;irIU/`;n`oh#QC5irIg5li=p&li=p&li;V:JcC<$JcC<$ JcC<$JcC<$JcC<$OT4YIl2U)MJcC<$JcC<$JcC<$JcC<$JcC<$JcGZJklA'ijoFHA \H)O,li>Z;li=g#li>?2a8kB&klB?8li=p&li=p&li>6/T`CAXPlS&ghuLXoVZ>$B a8jroT`EgHli=p&li=p&li;V:JcC<$JcC<$JcC<$JcC<$JcC<$OT4YIl2U)MJcC<$ JcC<$JcC<$JcC<$JcC<$JcGZJkl@sfklBQ>`;oT2li>Z;li=g#li>6/b5g])klB?8 li=p&li=p&li=p&WW84^ScG\gjoE0rXT6??b5friWW:cQli=p&li=p&li;V:JcC<$ JcC<$JcC<$JcC<$JcC<$OT4YIl2U)MJcC<$JcC<$JcC<$JcC<$JcC<$JcGZJkl@jc klBH;d/`Y8li>Z;li=g#li=g#f)Xt5klB?8li=p&li=p&li=Tr^Aribp]%Z%S,_gT Zi@Zli?;Mli;V:h#HL:JcC<$ JcC<$JcEaikl?;7JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$RK)CLJcC<$ JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc47@b5_#4JcE[gli?;Mli;V:h#HL:JcC<$ JcC<$JcEaikl?;7OoPC\JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcC]/joBu4 JcC<$JcC<$`rG9'JcF=$o`0RCa8bf4Q2gCTJcEmmnc47@`;f0(l2U)MJcFO*joBu4 JcC<$JcC<$`rG9'JcCl4joBu4JcC<$JcC<$aoCT*JcC<$JcC<$JcC<$JcC<$JcC<$ o`+%RJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc47@b5_#4JcE[gli?;Mli;V: h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$ JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc47@b5_#4 JcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7 JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdj o`19Wnc47@b5_#4JcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$ JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEai kl?;7f)PCCJcEdjo`19Wnc47@b5_#4JcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEai kl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZ JcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc47@b5_#4JcE[gli?;Mli;V:h#HL: JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$ `rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc47@b5_#4JcE[g li?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5 joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19W nc47@b5_#4JcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$ JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7 f)PCCJcEdjo`19Wnc47@b5_#4JcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7 OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$ JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc47@b5_#4JcE[gli?;Mli;V:h#HL:JcC<$ JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9' JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc47@b5_#4JcE[gli?;M li;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4 JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc47@ b5_#4JcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjl kl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCC JcEdjo`19Wnc47@b5_#4JcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPD JcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$ JcEaikl?;7f)PCCJcEdjo`19Wnc6#rg&Snfnc47@`;f0(l2U)MJcFO*joBu4JcC<$ JcC<$`rG9'JcCl4joBu4JcC<$JcC<$aoCT*JcC<$kPsZEJcC<$JcC<$JcEaikl?;7 JcGZJjoBu4JcC<$JcC<$`rG9'JcF=$o`0RCa8bf4Q2gCT]`6%QaT(f2JcE[gli?;M li;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4 JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc6Z/ [K+_Tnc47@`;f0(l2U)MJcFO*joBu4JcC<$JcC<$`rG9'JcCl4joBu4JcC<$JcC<$ aoCT*JcC<$kPsZEJcC<$JcC<$JcEaikl?;7JcGZJjoBu4JcC<$JcC<$`rG9'JcF=$ o`0RCa8bf4Q2gCTbQ"RBfDkCAJcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7 OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$ JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc7);T`EgHnc47@`;f0(l2U)MJcFO*joBu4 JcC<$JcC<$`rG9'JcCl4joBu4JcC<$JcC<$aoCT*JcC<$kPsZEJcC<$JcC<$JcEai kl?;7JcGZJjoBu4JcC<$JcC<$`rG9'JcF=$o`0RCa8bf4Q2gCTeGkm9i;`?JJcE[g li?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5 joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19W nc7;Ag&M0R@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/np\ j8\ZMJcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjl kl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCC JcEdjo`19Wnc7DDhuEfX@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/o-bk5XuPJcE[gli?;Mli;V:h#HL: JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$ `rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc7MGirB,[@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/o6el2U;SJcE[gli?;Mli;V:h#HL:JcC<$ JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9' JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc7VJjo>G^@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/o?hm/QVVJcE[gli?;M li;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4 JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc7_M jo>G^@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6-@/o?hn,MqYJcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$ JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEai kl?;7f)PCCJcEdjo`19Wnc7hPkl:ba@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oQnn,MqYJcE[g li?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5 joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19W nc7hPli7(d@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oQno)J7\JcE[gli?;Mli;V: h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$ JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc7qSli7(d @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oHkp&FR_JcE[gli?;Mli;V:h#HL: JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$ `rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc7qSli7(d@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oQnp&FR_JcE[gli?;Mli;V:h#HL: JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$ `rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc8%Vli7(d@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oQnq#BmbJcE[gli?;M li;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4 JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc8%V mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oQn q#BmbJcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjl kl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCC JcEdjo`19Wnc8%Vmf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6-@/oZqq#BmbJcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7 OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$ JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc8.Yli7(d@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oQnqu?3eJcE[gli?;Mli;V:h#HL: JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$ `rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc8.Ymf3Cg@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6- @/oZqqu?3eJcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$ JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7 f)PCCJcEdjo`19Wnc8.Ymf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZqqu?3eJcE[gli?;Mli;V:h#HL:JcC<$ JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9' JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc8.Ymf3Cg@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZq qu?3eJcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjl kl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCC JcEdjo`19Wnc8.Ymf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6-@/oZqqu?3eJcE[gli?;Mli;V:h#HL:JcC<$JcC<$ JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$ r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc8.Ync/^j@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZq qu?3eJcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjl kl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCC JcEdjo`19Wnc8.Ymf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6-@/oZqqu?3eJcE[gli?;Mli;V:h#HL:JcC<$JcC<$ JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$ r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc8.Ymf3Cg@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZqqu?3e JcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7 JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdj o`19Wnc8.Ymf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6-@/oZqqu?3eJcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEai kl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZ JcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc8.Ymf3Cg@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZqqu?3eJcE[g li?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5 joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19W nc8.Ymf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6-@/oQnqu?3eJcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPD JcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$ JcEaikl?;7f)PCCJcEdjo`19Wnc8.Yli7(d@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZqq#BmbJcE[gli?;Mli;V:h#HL:JcC<$ JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9' JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc8%Vmf3Cg@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZqq#BmbJcE[g li?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5 joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19W nc8%Vli7(d@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oQn q#BmbJcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjl kl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCC JcEdjo`19Wnc8%Vli7(d@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6- @/oQnp&FR_JcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$ JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7 f)PCCJcEdjo`19Wnc7qSli7(d@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6- @/oQnp&FR_JcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$ JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7 f)PCCJcEdjo`19Wnc7hPli7(d@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oQno)J7\ JcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7 JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdj o`19Wnc7hPkl:ba@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oHko)J7\JcE[gli?;Mli;V:h#HL: JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$ `rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc7_Mkl:ba@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6-@/oHkn,MqYJcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$ JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEai kl?;7f)PCCJcEdjo`19Wnc7_Mjo>G^@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oHkm/QVVJcE[gli?;Mli;V:h#HL:JcC<$ JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9' JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc7VJirB,[@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/o6em/QVVJcE[gli?;Mli;V:h#HL: JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$ `rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc7MGhuEfX@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6-@/o-bl2U;SJcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEai kl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZ JcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc7DDh#IKU@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/o$_k5XuPJcE[g li?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5 joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19W nc7;Ae,TOL@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/ngYi;`?JJcE[gli?;Mli;V: h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$ JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc7);ScIUH nc47@`;f0(l2U)MJcFO*joBu4JcC<$JcC<$`rG9'JcCl4joBu4JcC<$JcC<$aoCT* JcC<$kPsZEJcC<$JcC<$JcEaikl?;7JcGZJjoBu4JcC<$JcC<$`rG9'JcF=$o`0RC a8bf4Q2gCTcMs[?gAg^DJcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPD JcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$ JcEaikl?;7f)PCCJcEdjo`19Wnc6c2YQ32Qnc47@`;f0(l2U)MJcFO*joBu4JcC<$ JcC<$`rG9'JcCl4joBu4JcC<$JcC<$aoCT*JcC<$kPsZEJcC<$JcC<$JcEaikl?;7 JcGZJjoBu4JcC<$JcC<$`rG9'JcF=$o`0RCa8bf4Q2gCT_Z.@NbQ%,5JcE[gli?;M li;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4 JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc6,u e,[Acnc47@`;f0(l2U)MJcFO*joBu4JcGHDJH4d3JcC<$mJlDNJcCl4joBu4JcC<$ JcC<$aoCT*JcC<$kPsZEJcC<$JcC<$JcEaikl?;7JcGZJjoBu4JcC<$JcC<$`rG9' JcF=$o`0RCa8bf4Q2gCTU&Y)lXoIqlJcE[gli?;Mli;V:h#HL:JcD):JH2GFJcCc1 kl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZ JcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc47@b5_#4JcE[gli?;Mli;V:h#HL: JcDqRJH16$o)O@AVZ5l\JcCl4joBu4JcC<$JcC<$aoCT*JcC<$kPsZEJcC<$JcC<$ JcEaikl?;7JcGZJjoBu4JcC<$JcC<$`rG9'JcF=$o`0RCa8bf4Q2gCTJcEmmnc47@ `;f0(l2U)MJcFO*joBu4`;bAgJH3dlJcE@^kl?;7OoOPDJcC<$JcC<$JcEjlkl?;7 JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdj o`19Wnc47@b5_#4JcE[gli?;Mli;V:h#HL:JcF4!JH16$WrR_Nb5^]+JcCl4joBu4 JcC<$JcC<$aoCT*JcC<$kPsZEJcC<$JcC<$JcEaikl?;7JcGZJjoBu4JcC<$JcC<$ `rG9'JcF=$o`0RCa8bf4Q2gCTJcEmmnc47@`;f0(l2U)MJcFO*joBu4ir=Q0JH1Z0 JcFF'kl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$ r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc47@b5_#4JcE[gli?;Mli;V: h#HL:JcG0`Mkl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9' JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc47@b5_#4JcE[gli?;M li;V:h#HL:P5g(5pAb6o@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6-@/kcXpAg'Mkl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$ JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCC[f=hW^]3s,Q2gCT[f=hW _Z00,JcE[gli?;Mli;V:h#HL:R/`*F!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-Mu\q=kl?;7OoOPD JcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$ JcEaikl?;7f)PCC^]2%KbQ%58Q2gCT^]2.NbQ%,5JcE[gli?;Mli;V:h#HL:S,]&[ !WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rrHO-ScFrRkl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5 joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCC`W*7EdJrk> Q2gCTaT&RHdJrb;JcE[gli?;Mli;V:h#HL:U&V+m!WQR-rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-WW8Fd kl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZ JcC<$JcC<$JcEaikl?;7f)PCCbQ"I?fDkLDQ2gCTcMsdBfDkCAJcE[gli?;Mli;V: h#HL:V#Rb$!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rrHO-ZN-Kpkl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9' JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCdJodd$GJcE[g li?;Mli;V:h#HL:WrKU0!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-\H&?'kl?;7 OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$ JcC<$JcEaikl?;7f)PCCeGmnr!WQR-rr?I,rr?I,rrHO-d/`,)o`19Wnc72>e,TOL @/p6,@/p6,@/p6-@/nUSi;`?JJcE[gli?;Mli;V:h#HL:XoH6pD3 kl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZ JcC<$JcC<$JcEaikl?;7f)PCCfDjY,!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-h#QL8o`19Wnc7DDh#IKU@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/np\k5XuP JcE[gli?;Mli;V:h#HL:XoHQE!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO- b5e@o`19Wnc7MGhuEfX@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/o6ek5XuPJcE[gli?;M li;V:h#HL:YlE)N!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rrHO-d/^*Ekl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4 JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCh>cU;!WQR-rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-irJ?Do`19Wnc7VJirB,[@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/o?hl2U;SJcE[gli?;Mli;V: h#HL:YlE;T!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-f)V`Kkl?;7OoOPDJcC<$JcC<$JcEjl kl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCC i;_p>!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rrHO-joFcJo`19Wnc7_Mjo>G^@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6-@/o?hm/QVVJcE[gli?;Mli;V:h#HL:ZiA_Z!WQR-rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-g&S/Qkl?;7OoOPDJcC<$JcC<$JcEjl kl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCC j8\?D!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rrHO-klC)Mo`19Wnc7_Mkl:ba@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oHkn,MqYJcE[g li?;Mli;V:h#HL:ZiAh]!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rrHO-h#OJTkl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$ `rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCj8\HG!WQR-rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rrHO-klC2Po`19Wnc7hPkl:ba@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oHko)J7\JcE[gli?;M li;V:h#HL:ZiB%c!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rrHO-irH+Zkl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5 joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCk5XcJ!WQR- rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-klC;So`19Wnc7hPli7(d@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6-@/oQno)J7\JcE[gli?;Mli;V:h#HL:ZiB%c!WQR-rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-irH+Z kl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZ JcC<$JcC<$JcEaikl?;7f)PCCl2U)M!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rrHO-li?VVo`19Wnc7qSli7(d@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6-@/oQnp&FR_JcE[gli?;Mli;V:h#HL:ZiAq`!WQR-rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-huKeWkl?;7OoOPDJcC<$JcC<$ JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7 f)PCCl2U)M!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-li?_Y o`19Wnc7qSmf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oQn p&FR_JcE[gli?;Mli;V:h#HL:ZiAh]!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rrHO-h#OJTkl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4 JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCl2U2P!WQR-rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-li?_Yo`19Wnc8%Vli7(d @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oQnq#BmbJcE[g li?;Mli;V:h#HL:ZiAVW!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-f)ViNkl?;7 OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$ JcC<$JcEaikl?;7f)PCCm/QDP!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rrHO-mf<%\o`19Wnc8%Vmf3Cg@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZqq#BmbJcE[gli?;Mli;V:h#HL: YlE2Q!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rrHO-e,ZEHkl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4 JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCm/QMS!WQR-rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-li?h\o`19W nc8.Yli7(d@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6-@/oZqq#BmbJcE[gli?;Mli;V:h#HL:YlDuK!WQR-rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-c2adBkl?;7OoOPDJcC<$JcC<$JcEjl kl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCC m/QMS!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rrHO-mf<._o`19Wnc8.Ymf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oQnqu?3eJcE[gli?;Mli;V:h#HL:XoHHB !WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-a8i%9kl?;7OoOPDJcC<$JcC<$JcEjlkl?;7 JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCn,MhV !WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rrHO-mf<._o`19Wnc8.Ymf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZqqu?3eJcE[gli?;Mli;V:h#HL: WrKp9!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rrHO-_>p;0kl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9' JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCn,MhV!WQR-rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-mf<._o`19Wnc8.Y mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6-@/oZqqu?3eJcE[gli?;Mli;V:h#HL:VuOC0!WQR-rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rrHO-]E"Q'kl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$ JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCn,MhV!WQR-rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO- nc8Ibo`19Wnc8.Ymf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6-@/oZqqu?3eJcE[gli?;Mli;V:h#HL:V#RY!!WQR- rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-YQ10mkl?;7OoOPDJcC<$ JcC<$JcEjlkl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEai kl?;7f)PCCn,MhV!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc8Ibo`19Wnc8.Ymf3Cg@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZqqu?3e JcE[gli?;Mli;V:h#HL:U&Ung!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rrHO-U]?e^kl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5 joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCn,MhV!WQR- rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rrHO-nc8Ibo`19Wnc8.Ync/^j@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZqqu?3eJcE[gli?;Mli;V: h#HL:S,\iU!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rrHO-QiNr,,aoDJB@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6- @/kcXaoI"m!<;9`JcCl4joBu4JcC<$JcC<$aoCT*JcC<$kPsZEJcC<$JcC<$JcEai kl?;7JcGZJjoBu4JcC<$JcC<$`rG9'JcF=$o`4I\mf3Cg@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZqq#C!eQ2gCT n,MhV!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rrHO-mf<7bnc47@`;f0(l2U)MJcFO*joBu4!<7TMJH16$d/\atp]'IX JcCl4joBu4JcC<$JcC<$aoCT*JcC<$kPsZEJcC<$JcC<$JcEaikl?;7JcGZJjoBu4 JcC<$JcC<$`rG9'JcF=$o`4@Ymf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZqq#C!eQ2gCTn,M_S!WQR-rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-li?q_nc47@`;f0( l2U)MJcFO*joBu4p]#dEJH16$irFZ1mf2MOJcCl4joBu4JcC<$JcC<$aoCT*JcC<$ kPsZEJcC<$JcC<$JcEaikl?;7JcGZJjoBu4JcC<$JcC<$`rG9'JcF=$o`4@Ymf3Cg @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oQn q#C!eQ2gCTm/QMS!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rrHO-mf<._nc47@`;f0(l2U)MJcFO*joBu4li2M9JH16$qZ)3IirA6C JcCl4joBu4JcC<$JcC<$aoCT*JcC<$kPsZEJcC<$JcC<$JcEaikl?;7JcGZJjoBu4 JcC<$JcC<$`rG9'JcF=$o`4@Yli7(d@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6-@/oZqp&F[bQ2gCTm/QMS!WQR-rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-mf<._nc47@`;f0(l2U)MJcFO* joBu4huA6-JH1l6JcF=$kl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$ JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCl2U2P!WQR-rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-li?_Yo`19Wnc8%Vli7(d@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oQnq#BmbJcE[gli?;M li;V:h#HL:JcF*sJH16$YlK@Ta8bB(JcCl4joBu4JcC<$JcC<$aoCT*JcC<$kPsZE JcC<$JcC<$JcEaikl?;7JcGZJjoBu4JcC<$JcC<$`rG9'JcF=$o`47Vli7(d@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oQnp&F[bQ2gCTl2U)M!WQR- rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-li?_Ync47@`;f0(l2U)MJcFO* joBu4_>f&dJH4!rJcE7[kl?;7OoOPDJcC<$JcC<$JcEjlkl?;7JcFp5joBu4JcC<$ JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCl2TuJ!WQR-rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rrHO-li?VVo`19Wnc7qSli7(d@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6-@/oQnp&FR_JcE[gli?;Mli;V:h#HL:JcDhOJH16$q#H!G U]9QYJcCl4joBu4JcC<$JcC<$aoCT*JcC<$kPsZEJcC<$JcC<$JcEaikl?;7JcGZJ joBu4JcC<$JcC<$`rG9'JcF=$o`4.Skl:ba@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oQn n,N%\Q2gCTk5XcJ!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-li?VVnc47@`;f0( l2U)MJcFO*joBu4OoKt4Y5j.RM#Z]>JcCl4joBu4JcC<$JcC<$aoCT*JcC<$kPsZE JcC<$JcC<$JcEaikl?;7JcGZJjoBu4JcC<$JcC<$`rG9'JcF=$o`4%Pkl:ba@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6-@/oHkn,N%\Q2gCTk5XZG!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-klC;Snc47@ `;f0(l2U)MJcFO*joBu4JcG-;JH5EEJcC<$jT"HEJcCl4joBu4JcC<$JcC<$aoCT* JcC<$kPsZEJcC<$JcC<$JcEaikl?;7JcGZJjoBu4JcC<$JcC<$`rG9'JcF=$o`4%P jo>G^@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6-@/oHkm/Q_YQ2gCTj8\?D!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-joFlMnc47@`;f0(l2U)MJcFO* joBu4JcC<$JcC<$`rG9'JcCl4joBu4JcC<$JcC<$aoCT*JcC<$kPsZEJcC<$JcC<$ JcEaikl?;7JcGZJjoBu4JcC<$JcC<$`rG9'JcF=$o`3qMjo>G^@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/o?hl2UDVQ2gCTi;_p>!WQR- rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-joFcJnc47@ `;f0(l2U)MJcFO*joBu4JcC<$JcC<$`rG9'JcCl4joBu4JcC<$JcC<$aoCT*JcC<$ kPsZEJcC<$JcC<$JcEaikl?;7JcGZJjoBu4JcC<$JcC<$`rG9'JcF=$o`3hJirB,[ @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/o6el2UDVQ2gCTh>cU;!WQR- rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-joFZGnc47@`;f0(l2U)M JcFO*joBu4JcC<$JcC<$`rG9'JcCl4joBu4JcC<$JcC<$aoCT*JcC<$kPsZEJcC<$ JcC<$JcEaikl?;7JcGZJjoBu4JcC<$JcC<$`rG9'JcF=$o`3_GhuEfX@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6-@/o-bk5Y)SQ2gCTgAg15!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-huMp>nc47@ `;f0(l2U)MJcFO*joBu4JcC<$JcC<$`rG9'JcCl4joBu4JcC<$JcC<$aoCT*JcC<$ kPsZEJcC<$JcC<$JcEaikl?;7JcGZJjoBu4JcC<$JcC<$`rG9'JcF=$o`3VDg&M0R @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/np\j8\cP Q2gCTfDjY,!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rrHO-h#QL8nc47@`;f0(l2U)MJcFO*joBu4JcC<$JcC<$`rG9'JcCl4joBu4 JcC<$JcC<$aoCT*JcC<$kPsZEJcC<$JcC<$JcEaikl?;7JcGZJjoBu4JcC<$JcC<$ `rG9'JcF=$o`3MAQiPtBo`19Wnc72>QiQ(Enc47@`;f0(l2U)MJcFO*joBu4JcC<$ JcC<$`rG9'JcCl4joBu4JcC<$JcC<$aoCT*JcC<$kPsZEJcC<$JcC<$JcEaikl?;7 JcGZJjoBu4JcC<$JcC<$`rG9'JcF=$o`3;;T`EgHo`19Wnc7);ScIUHnc47@`;f0( l2U)MJcFO*joBu4JcC<$JcC<$`rG9'JcCl4joBu4JcF0uK)gK&JcGHDkl?;7JcFp5 joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCbQ"RBeGo1A Q2gCTbQ"RBfDkCAJcE[gli?;Mli;V:h#HL:JcC<$JcC<$JcEaikl?;7OoOPDJcC<$ r;V][ZJcCl4 joBu4]DmE^JH3%WJcFO*kl?;7JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$ JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc47@b5_#4JcE[gli?;Mli;V:h#HL:JcDDC JH1f4JcD):kl?;7OoOPDJcEmmJH16$Q2lL9li62LJcC<$kPsZEJcC<$JcC<$JcEai kl?;7JcGZJjoBu4JcC<$JcC<$`rG9'JcF=$o`0RCa8bf4Q2gCTJcEmmnc47@`;f0( l2U)MJcFO*joBu4\Gq*[JH4X/JcDqRkl?;7OoOPDJcF=$JH16$JH5ZLJcGKEkl?;7 JcFp5joBu4JcC<$JcC<$`rG9'JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdj o`19Wnc47@b5_#4JcE[gli?;Mli;V:h#HL:JcEmmJH16$]`ia"JcCl4joBu4 ir=Q0JH16$joC&6kl?;7JcFp5joBu4JcFC&JH4[0JcCc1kl?;7JcGZJjoBu4JcC<$ JcC<$`rG9'JcF=$o`0RCa8bf4Q2gCTJcEmmnc47@`;f0(l2U)MJcFO*joBu4g&HU' JH2;BJcF*skl?;7OoOPDJcG'9JH16$JH41"N;r,BJcC<$kPsZEJcC<$q>Z!GTE'QC YQ*heJcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc47@b5_#4JcE[g li?;Mli;V:h#HL:JcFj3JH16$LB)o*h#HU=JcCl4joBu4o`'IB_#ON9@/p6,@/p6, @/p6-@/om"!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rrHO-JH3UgQ2g(KJcC<$kPsZEJcCl4JH16$n,S%>a8bB(JcC<$r;YmZ JcC<$JcC<$JcEaikl?;7f)PCCJcEdjo`19Wnc47@b5_#4JcE[gli?;Mli;V:h#HL: JcG9?JH16$JH5-=JcFs6kl?;7OoOPDJcGTHJH53?!WQR-rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/kcXkQ%4Skl?;7JcFp5joBu4VZ22IJH3dl JcFF'kl?;7JcGZJjoBu4JcC<$JcC<$`rG9'JcF=$o`25rh#P+fo`19Wnc6?&h#Oe] nc47@`;f0(l2U)MJcFO*joBu4qYu*HJH16$h#N$+nc.hRJcCl4joBu4!<7TMpAb6o @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZq!WQR- rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO- nc/^j@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/kr]V#TZZJcC<$kPsZEJcE.X JH16$VuVDKli62LJcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCC]`5qNaT(o5Q2gCT aT'3Z^]3j)JcE[gli?;Mli;V:h#HL:KE$K&JH16$b5d+nqZ#d[JcCl4joC/9QiI0e @/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO- QiO/dkl?;7JcFp5joBu4`;bAgJH1Z0JcGKEkl?;7JcGZJjoBu4JcC<$JcC<$`rG9' JcF=$o`2l/\H'qTo`19Wnc6u8\H'VKnc47@`;f0(l2U)MJcFO*joCA?JH4d3!WQR- rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6-@/kcXjT'r5kl?;7OoOPDN;o[R!WQR-rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZq!WQR-rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6-@/m,)XoIVcJcC<$kPsZEJcF*sJH16$JH5?CKE(09 JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCbQ"RBeGo1AQ2gCTeGlWNbQ%,5JcE[g li?;Mli;V:h#HL:P5g(5oDepl@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6-@/kiZM>uf?JcCl4 joCJBYQ+_(@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-YQ2$0kl?;7 JcFp5joBu4g&HU'JH16$huJiRlJcC<$kPsZEJcFa0JH16$JH3sqR/cCNJcC<$r;YmZJcC<$JcC<$ JcEaikl?;7f)PCCeGkm9h>d-JQ2gCTh>`rEeGo(>JcE[gli?;Mli;V:h#HL:T)YJa !WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO- nc/^j@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6- @/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/lo#Q2g(KJcCl4joCeK^An<7 @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/om"!WQR- rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO- o`,$m@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO- ^AthEkl?;7JcFp5joBu4li2M9ec5aN@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-JH47$ U&X?WJcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCfDjP)!WQR-rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-g&U(2o`19Wnc7_Mg&M0R@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/np\gAg^DJcE[gli?;M li;V:h#HL:V#RFp!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/m5,S,_^QJcCl4joCeKa8c8@ @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6-@/om"!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-a8imQkl?;7JcFp5joBu4nc+.?q>^Qr@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO- nc/^j@/p6-@/kcXq>dGnkl?;7JcGZJjoBu4JcC<$JcC<$`rG9'JcF=$o`3_GhuEfX @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6-@/o6ej8\cPQ2gCTk5X?>!WQR-rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO- huMU5nc47@`;f0(l2U)MJcFO*joD=Z[K$@.@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rrHO-o`,$m@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-[K)p!kl?;7OoOPD S,^b6!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/nLP]`73r JcC<$kPsZEJcGKENrT4\@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-Mu^![kl?;7JcGZJjoBu4JcC<$JcC<$ `rG9'JcF=$o`3hJirB,[@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/o?h k5Y)SQ2gCTl2TcD!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-irJ$; nc47@`;f0(l2U)MJcFO*joDF]^An<7@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-o`,$m@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/om"!WQR-rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rrHO-^Asu-kl?;7OoOPDT)[:?!WQR-rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6-@/oZq!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/n^V^]3NuJcC<$kPsZE JcG]KScAfk@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6- @/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-RfKepkl?;7JcGZJjoBu4JcC<$JcC<$`rG9' JcF=$o`3qMjo>G^@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6-@/o?hl2UDVQ2gCTm/Q)G!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rrHO-joFHAnc47@`;f0(l2U)MJcFO*joDO``;fr=@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6- @/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rrHO-o`,$m@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6-@/om"!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rrHO-`;l_6kl?;7OoOPDT)[LE!WQR-rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6-@/oQn!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/np\^]3NuJcC<$ kPsZEKE%hL!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6-@/m5,[f>RlJcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCC j8\6A!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rrHO-klC)Mo`19Wnc8%Vkl:ba@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/o?hk5XuPJcE[gli?;Mli;V: h#HL:XoHZH!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/nLPV#TZZ JcCl4joD"Qh#IKU@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6-@/oZq!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-huLOlkl?;7 JcFp5joC/9ZN(%+@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/om"!WQR-rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-o`,$m@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct !WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rrHO-ZN.Zt3g!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-o`,$m@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/om" !WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/mk>^]3NuJcC<$ r;YmZJcC<$JcC<$JcEaikl?;7f)PCCk5XZG!WQR-rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO- li?MSo`19Wnc87\kl:ba@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oHkl2U;SJcE[gli?;M li;V:h#HL:ZiAVW!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6-@/oZq!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/ngYWrM;`JcCl4joD+TirB,[@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6- @/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rrHO-nc/^j@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6-@/om"!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rrHO-irHsrkl?;7JcFp5joCA?`;fr=@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-_>qIQkl?;7JcGZJjoBu4JcC<$JcC<$ `rG9'JcF=$o`47Vkl:ba@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oQno)J@_ Q2gCTo)J%V!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-li?;Mnc47@`;f0( l2U)MJcFO*joDafg&M0R@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6-@/oZq!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6-@/oZq!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-g&S/Qkl?;7OoOPD T)[gN!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6-@/oZq!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/o-b _Z/j#JcC<$kPsZEO8mB'!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZq!WQR-rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-mf3Cg@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/n:J`W,0&JcC<$r;YmZ JcC<$JcC<$JcEaikl?;7f)PCCl2U)M!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rrHO-li?_Yo`19Wnc8@_li7(d@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6-@/oQnm/QVVJcE[gli?;Mli;V:h#HL:ZiAq`!WQR-rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO- nc/^j@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6- @/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/o-bWrM;`JcCl4joD"QhuEfX @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZq !WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-mf3Cg @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZq !WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-h#P=lkl?;7JcFp5joCSEc2[nF @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6-@/oZq!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6-@/oQn!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-d/_/ckl?;7JcGZJjoBu4JcC<$ JcC<$`rG9'JcF=$o`47Vmf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6-@/oQnp&F[bQ2gCTp&F@Y!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rrHO-li?DPnc47@`;f0(l2U)MJcFO*joDafirB,[@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6-@/om"!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rrHO-o`,$m@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO- irH+Zkl?;7OoOPDT)[LE!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6- @/oZq!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/o$_^]3NuJcC<$kPsZE P5j,6!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-mf3Cg@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZq!WQR-rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-mf3Cg@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6-@/n^VaT(K)JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCm/QDP!WQR- rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-mf<%\o`19W nc8@_mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6- @/oQnn,MqYJcE[gli?;Mli;V:h#HL:ZiB%c!WQR-rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR- rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rrHO-nc/^j@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/o6eWrM;`JcCl4joD"Qe,TOL @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZq!WQR-rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rrHO-f)WSckl?;7JcFp5joCSEh#IKU@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZq!WQR-rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rrHO-g&T4okl?;7JcGZJjoBu4JcC<$JcC<$`rG9'JcF=$o`4@Ymf3Cg@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oQnq#C!e Q2gCTq#B[\!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rrHO-mf;hVnc47@`;f0(l2U)MJcFO*joDafhuEfX@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZq!WQR-rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-mf3Cg@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZq!WQR- rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rrHO-huKeWkl?;7OoOPDS,^k9!WQR-rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6- @/oZq!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/nUS^]3NuJcC<$kPsZEQ2fY?!WQR-rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct !WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rrHO-nc/^j@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/o-baT(K)JcC<$r;YmZ JcC<$JcC<$JcEaikl?;7f)PCCm/QMS!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-mf<._o`19Wnc8Ibmf3Cg@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZqn,MqY JcE[gli?;Mli;V:h#HL:ZiAh]!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6-@/o$_WrM;`JcCl4joCnNb5_SC@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR- rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rrHO-b5f3Tkl?;7JcFp5joC\HhuEfX@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rrHO-irI1#kl?;7JcGZJjoBu4JcC<$JcC<$`rG9'JcF=$ o`4I\li7(d@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6-@/oZqq#C!eQ2gCTq#Bd_!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-mf;hVnc47@`;f0(l2U)MJcFO*joDaf f)PjO@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZq!WQR- rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-mf3Cg@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct !WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rrHO-f)ViNkl?;7OoOPDR/b,*!WQR-rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZq!WQR-rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/n1G\c:moJcC<$ kPsZEQ2fkE!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6-@/oZq!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6-@/o6ebQ$f,JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCn,MhV!WQR-rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO- mf<._o`19Wnc8Ibmf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6-@/octn,MqYJcE[gli?;Mli;V:h#HL:YlE2Q!WQR- rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-mf3Cg@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6- @/n^VVuPu]JcCl4joC\H]Dr!4@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6- @/oQn!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO- mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6- @/oZq!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-^At_Bkl?;7JcFp5joC\H huEfX@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6-@/oZq!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-irI1# kl?;7JcGZJjoBu4JcC<$JcC<$`rG9'JcF=$o`4I\mf3Cg@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZqq#C!eQ2gCT q#Bmb!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rrHO-mf;qYnc47@`;f0(l2U)MJcFO*joDXcb5_SC@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rrHO-o`,$m@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-b5eI?kl?;7OoOPDP5hig!WQR- rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6-@/oZq!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/mP5ZiB7iJcC<$kPsZEQ2fY? !WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct !WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/o$_aT(K)JcC<$r;YmZ JcC<$JcC<$JcEaikl?;7f)PCCn,MhV!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc8Ibo`19Wnc8Remf3Cg @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6-@/oZqo)J7\JcE[gli?;Mli;V:h#HL:XoH??!WQR-rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct !WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rrHO-nc/^j@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/n1G V#TZZJcCl4joCJBVZ6bt@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6-@/oZq!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-WW9:'kl?;7JcFp5joCSEg&M0R@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZq!WQR-rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rrHO-g&T4okl?;7JcGZJjoBu4JcC<$JcC<$`rG9'JcF=$o`4I\mf3Cg @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6-@/octq#C!eQ2gCTqu?*b!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-mf;qYnc47@`;f0(l2U)M JcFO*joDF]^An<7@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6-@/oZq!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6-@/oQn!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-^Asu-kl?;7OoOPDM>s.I !WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO- o`,$m@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/leuWrM;`JcC<$kPsZEP5j#3!WQR-rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6-@/n^VaT(K)JcC<$r;YmZJcC<$JcC<$JcEaikl?;7f)PCCn,MhV!WQR-rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rrHO-nc8Ibo`19Wnc8Remf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZqo)J7\JcE[gli?;Mli;V:h#HL: VuO1*!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-mf3Cg@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-mf3Cg @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6-@/mY8T)\$TJcCl4joC&6NrT4\@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/p*(!WQR-rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-NrZ*Xkl?;7JcFp5 joCJBd/X4I@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/om"!WQR-rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rrHO-c2bi`kl?;7JcGZJjoBu4JcC<$JcC<$`rG9'JcF=$o`4I\mf3Cg@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6- @/octq#C!eQ2gCTq#Bmb!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-mf;qYnc47@`;f0(l2U)MJcFO*joD4W XT/D%@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oct!WQR-rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZq!WQR-rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-XT4jjkl?;7OoOPDJcG]KJH5WK!WQR- rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rrHO-JH5WKT)\$TJcC<$kPsZEO8m9$!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-li7(d@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oQn!WQR-rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/nCM_Z/j#JcC<$r;YmZJcC<$ JcC<$JcEaikl?;7f)PCCn,MhV!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-mf<._o`19Wnc8Ibnc/^j@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6- @/oZqo)J7\JcE[gli?;Mli;V:h#HL:T)YSd!WQR-rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/om"!WQR-rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO-nc/^j @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6-@/m#&Q2g(KJcCl4joBu4p]#dEg].BT@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/kcX g]3`Akl?;7JcFp5joCA?_>jW:@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6-@/oZq!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rrHO-mf3Cg@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6-@/oZq!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rrHO-^Au.Nkl?;7JcGZJjoBu4JcC<$JcC<$`rG9'JcF=$o`4I\mf3Cg@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/oZq q#C!eQ2gCTq#Bd_!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rrHO-mf;hVnc47@`;f0(l2U)MJcFO*joCnNOoPO_@/p6,@/p6, @/p6,@/p6,@/p6,@/p6,@/p6-@/om"!WQR-rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I, rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rr?I,rrHO- nc/^j@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6,@/p6-@/lAi P5jbHJcCl4joBu4mf.hj,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!FYqY!!!"Xs60N7s,m?D!.k13s+(0$!.b..!/COj,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!FYru!!3+-s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N+-s7--js'Ym,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!FYr6!4i-o !.k0$s8;oZ!.k0$s+13$s+13is60N7s475C!:9aS!!3+-s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N+-s6Ka\s7HAWs7-0bs6fpgs'Ym, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!FYrr !:TsY!.k0gs6KaMs6K`:s4mY:!0$r/!:'Ucs'Ym,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!FYqY!:'W;s60N7s,m?D!.k1*s+(0$!.b.@ !.k1Ks60N7s+145s5j<4rrE(s!!3+-s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N+-s7--js'Ym,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !FYs#!!3+-s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N+-s/,k*s60N7 s+14Js5j<4s+13$s+13$s2P*'!.k1$s7HBYs6fpgs'Ym,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!FYrr!;6Bb!1!TT!;QT\!!3+-s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N+-s6KaSs7-/@s2=s( !9sOM!.k1*s5j<9s+(0$!.b-h!.k1Ks60N7s,m?D!.k0ss+(0$!/^c-s7--R!.k0$ s6'FE!.k1Ks-Nces'Ym,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!FYqs!3lLf!.k0$s8;oZ!.k0$s+13$s+13is60N7s475C !:9aP!!3+-s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N+-s6KaY s7HAWs7-0_s6fpgs'Ym,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!FYrr!:9aV!.k0gs6KaMs6K`:s4mY:!.k1Ks+(0$!.b.%!.k1Bs60N7s,m?D !.k0ds+(0$!2T[Hs5j:F!.k0$s6'FE!.k1Es+p^Vs'Ym,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!FYqa!3Q:c!.k0$s8;oZ!.k0$ s+13$s+13is60N7s475C!9sOM!!3+-s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N+-s6KaYs7HAWs7-0_s6K^ds'Ym,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!FYro!:9aV!.k0gs6KaMs6K`:s4mY:!.k1Bs+(0$!.b.7!.k19s60N7 s,m?D!.k0Us+(0$!6,"is3q#4!.k0$s6'FE!.k1?s+(1?!!3+-s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N+-s+(1B!2TYZ!.k0$s8;oZ!.k0$s+13$s+13is60N7s475C!9sOM !!3+-s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N+-s6KaVs7HAWs7-0\s6K^d s'Ym,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!FYro!:9aV!.k0gs6KaMs6K`: s4mY:!.k16s+(0$!.b-$s53k@!.k04s5j<4s.KCC!.b.8!.k0ds60N7s+145s5j<4 s60K6!6P9Bs'Ym,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!FYqY!6P;5s60N7s+14Js5j<4s+13$s+13$s2P*'!.k1$s7HBSs6K^d s'Ym,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!FYrl!:p0_!1!TT!:p0S!!3+-s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N+-s6KaMs7-/@s2=s(!9sOM!.k1*s5j<4s4RF'!.b-B!.k0s s60N7s,m?D!.k0+s+(0=!.k0Ls60N7s+145s5j<4s5O'0!.b-$!7:e3s60N7s+14J s5j<4s+13$s+13$s2P*'!.k1$s7HBSs60Las'Ym,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!FYrl!:Ts\ !1!TT!:TsP!!3+-s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N+-s6KaJs7-/@s2=s(!9sOM!.k1*s5j<4 s2t@m!.b-`!.k0ds60N7s,m?D!.k0$s6'E5!8IR*s+p^>!.k0$s6'FE!.k1$s+(0$ !.b.4!0$sB!.k0$s8;oZ!.k0$s+13$s+13is60N7s475C!9=+D!!3+-s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N+- s60OMs7HAWs7-0Ys5j:^s'Ym,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!FYrl!9X=P!.k0gs6KaMs6K`:s4mY:!.k0[ s+(0$!9!p/s0)Ie!.k04s5j<4s+13$s+13$s2k<*!.k0$s6'FE!.k0ps+(0$!.b.I !.k.Ms60N7s+14Js5j<4s+13$s+13$s2P*'!.k1$s7HBMs5j:^s'Ym,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!FYri!:9aY!1!TT!:9aJ !!3+-s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N+- s5j=As7-/@s2=s(!9sOM!.k1*s5j<4s.fUF!/gi.s-iuP!.k04s5j<4s+13$s+13$ s2k<*!.k0$s6'FE!.k0ds+(0$!0[D6s7H?U!.k0$s8;oZ!.k0$s+13$s+13is60N7 s475C!8[\;!!3+-s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N+- s5j=Gs7HAWs7-0Ss5j:^s'Ym,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!FYri!9!nJ!.k0gs6KaMs6K`:s4mY:!.k0+s+(0d!.k0$s8W,`!.k04s5j<4 s+13$s+13$s2k<*!.k0$s6'FE!.k0Us+(0$!3lNTs5j:F!.k0$s8;oZ!.k0$s+13$ s+13is60N7s475C!8@J5!!3+-s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N+-s53n>s7HAWs7-0P s5O([s'Ym,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!FYrf!8[\G!.k0gs6KaMs6K`:s4mY: !.k0$s4I@F!.k0$s3L`0!.k04s5j<4s+13$s+13$s2k<*!.k0$s6'FE!.k0Cs+(0$ !7Cjus4757!.k0$s8;oZ!.k0$s+13$s+13is60N7s475C!8%8/!!3+-s8N(,s8N(, s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N(,s8N+-s4m\8 s7HAWs7-0Ms4mYUs'Ym,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j,!+>j, !+>j,!+>j,!+>j,!FYr`!8@JD!.k0gs6KaMs6K`:s4mY:!.k0$s+13$s+13is60N7 s,m?D!.k0$s+13$s+13ls60N7s+145s5j<4s,6o.!.b.J!.k0ds60N7s+14Js5j<4 s+13$s+13$s2P*'!.k1$s7HBAs3q#Ls'Ym,!+>j,!+>j,!+>j,!+>j,!FYrW!9!nM !1!TT!9!n,!!3+-s8N(,s8N(,s8N(,s8N(,s8N+-s3q&#s7-/@s2=s(!9sOM!.k1* s5j<4s+13$s+13$s2P*'!.k04s5j<4s+13$s+13$s2k<*!.k0$s6'FE!.k0$s7?8A !3ZBRs/,h\!.k0$s8;oZ!.k0$s+13$s+13is60N7s475C!7Ch!.k0gs6KaMs6K`:s4mY:!.k0$s+13$s+13is60N7s,m?D!.k0$s+13$s+13l s60N7s+145s5j<4s+13os+(1H!.k0%s60N7s+14Js5j<4s+13$s+13$s2P*'!.k1$ s7HB8s/,kKs7HAWs7-0As/,kBs7-/@s2=s(!9sOM!.k1*s5j<4s+13$s+13$s2P*' !.k04s5j<4s+13$s+13$s2k<*!.k0$s6'FE!.k0$s+13$s+13is60N7s+14Js5j<4 s+13$s+13$s2P*'!.k1$s7HB2s0D^Qs7HAWs7-0;s0D^Hs7-/@s2=s(!9sOM!.k1* s5j<4s+13$s+13$s2P*'!.k04s5j<4s+13$s+13$s2k<*!.k0$s6'FE!.k0$s+13$ s+13is60N7s+14Js5j<4s+13$s+13$s2P*'!.k1$s7HB,s1\QWs7HAWs7-05s1\QN s7-/@s2=s(!9sOM!.k1*s5j<4s+13$s+13$s2P*'!.k04s5j<4s+13$s+13$s2k<* !.k0$s6'FE!.k0$s+13$s+13is60N7s+14Js5j<4s+13$s+13$s2P*'!.k1$s7HB# s3q%`s7HAWs7-0,s3UhWs7-/@s2=s(!9sOM!.k1*s5j<4s+13$s+13$s2P*'!.k04 s5j<4s+13$s+13$s2k<*!.k0$s6'FE!.k0$s+13$s+13is60N7s+14Js5j<4s+13$ s+13$s2P*'!.k1$s7HAcs8E"us7HAWs7-/is8E"os7-/@s2=s(!9sOM!.k1*s+(0$ !.b-$!.b-6!.k04s+(0$!.b-$!.b-9!.k0$s6'E5!.b-$!.b-$!0[D6s+14Js+(0$ !.b-$!.b-6!.k1$s+(0R!1!S8!3?0Os2=s(!9sOM!.k1*s+(0$!.b-$!.b-6!.k04 s+(0$!.b-$!.b-9!.k0$s6'E5!.b-$!.b-$!0[D6s+14Js+(0$!.b-$!.b-6!.k1$ s+(0R!1!S8!3?0Os2=s(!9sOM!.k1*s+(0$!.b-$!.b-6!.k04s+(0$!.b-$!.b-9 !.k0$s6'E5!.b-$!.b-$!0[D6s+14Js+(0$!.b-$!.b-6!.k1$s+(0R!1!S8!3?0O s2=s(!9sOM!.k1*s+(0$!.b-$!.b-6!.k04s+(0$!.b-$!.b-9!.k0$s6'E5!.b-$ !.b-$!0[D6s+14Js+(0$!.b-$!.b-6!.k1$s+(0R!1!S8!3?0Os2=s(!9sOM!.k1* s+(0$!.b-$!.b-6!.k04s+(0$!.b-$!.b-9!.k0$s6'E5!.b-$!.b-$!0[D6s+14J s+(0$!.b-$!.b-6!.k1$s+(0R!1!S8!3?0Os2=s(!9sOM!.k1*s+(0$!.b-$!.b-6 !.k04s+(0$!.b-$!.b-9!.k0$s6'E5!.b-$!.b-$!0[D6s+14Js+(0$!.b-$!.b-6 !.k0$s+13$s+13$s+^R?!9sOM!.k1*s+(0$!.b-$!.b-6!.k04s+(0$!.b-$!.b-9 !.k0$s6'E5!.b-$!.b-$!0[D6s+14Js+(0$!.b-$!.b-6!.k0$s+13$s+13$s+^R? !9sOM!.k1*s+(0$!.b-$!.b-6!.k04s+(0$!.b-$!.b-9!.k0$s6'E5!.b-$!.b-$ !0[D6s+14Js+(0$!.b-$!.b-6!.k0$s+13$s+13$s+^R?!9sOM!.k1*s+(0$!.b-$ !.b-6!.k04s+(0$!.b-$!.b-9!.k0$s6'E5!.b-$!.b-$!0[D6s+14Js+(0$!.b-$ !.b-6!.k0$s+13$s+13$s+^R?!9sOM!.k0$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13@s6KaM s6K`:s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s.02V!9sOM!.k0$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13@s6KaMs6K`:s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s.02V!9sOM!.k0$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13@s6KaMs6K`:s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s.02V!9sOM!.k0$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13@s6KaMs6K`:s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s.02V !9sOM!.k0$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13@s6KaMs6K`:s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s.02V!9sN7!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$ !.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b.A!9sN7!.b-$!.b-$!.b-$ !.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$ !.b-$!.b-$!.b.A!9sN7!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$ !.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b.A!9sN7!.b-$!.b-$ !.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$ !.b-$!.b-$!.b-$!.b.A!9sN7!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$ !.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b.A!9sN7!.b-$ !.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$ !.b-$!.b-$!.b-$!.b-$!.b.A!9sN7!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$ !.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b.A!.k0$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s,I'X!.k0$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s5F"H!.k0$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s7?9Q!.k0$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s7u]Q !.k0$s+13$s+13$s+137s8)eIs+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+14@s4RI(s+13$s+13$s+13$s-Nc\!<3#q !.k0$s+13$s+13$s+13ms8)eIs+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13as3q%"s+13$s+13$s+13$s.02S!.k0$s+13$s+13$s+13ss6K`: s+13$s+13$s+13$s,m?P!.k0$s+13$s+13$s+13$s+13$s+13$s+13$s31N0!<3#\ !.k0$s+13$s+13$s+13Fs5O*1s+13$s+13$s+13$s4754!.k0$s+13$s+13$s+13: s6K`:s+13$s+13$s+13$s+13$s+13$s+13$s+13us6Ka_s8)fqs6K`:s+13$s+13$ s+13$s/H%S!.k0$s+13$s+13$s+14*s53m.s+13$s+13$s+13$s.02P!.k0$s+13$ s+13$s+13$s+13$s+13$s+13$s4IAs6fsMs7cTYs6fr=s+13$s+13$s+13$s4mY@!:9a\!:9aS!.k0$ s+13$s/,hn!.k0$s1SI0!.k0$s+13$s+13$s2+g&!8%8J!8[\A!.k0$s+13$s+13$ s+149s6fsMs7cTVs6K`:s+13$s+13$s+13Ds6fsJs7cTVs6fr=s+13$s+13$s+13$ s53kF!9sOY!9sOP!.k0$s+13$s/H%q!.k0$s1SI0!.k0$s+13$s+13$s2G$,!7CiD !8@J>!.k0$s+13$s+13$s+14?s6fsJs7cTSs6K`:s+13$s+13$s+13Js6fsGs7cTV s6K`:s+13$s+13$s+13$s5j:L!9X=V!9X=M!.k0$s+13$s/c7t!.k0$s1SI0!.k0$ s+13$s+13$s2b6/!7(WA!8%8;!.k0$s+13$s+13$s+14Es6fsGs7cTPs6K`:s+13$ s+13$s+13Ps6fsDs7cTSs6K`:s+13$s+13$s+13$s6K^R!9=+S!9X=J!.k0$s+13$ s0)J"!.k0$s1SI0!.k0$s+13$s+13$s3(H2!6bE>!7_&8!.k0$s+13$s+13$s+14K s6fsDs7cTMs6K`:s+13$s+13$s+13Vs6fsAs7cTPs6K`:s+13$s+13$s+13$s7--X !9!nP!9=+G!.k0$s+13$s0D\%!.k0$s1SI0!.k0$s+13$s+13$s3CZ5!6G3;!7Ci5 !.k0$s+13$s+13$s+C@?!8@JJ!8@J>!.k0$s+13$s+13$s1/0u!8%8G!8[\A!.k0$ s+13$s+13$s+14Es6fsDs7cTPs6K`:s+13$s+13Xs8)eIs+13`s8)eIs+13$s+13$ s+13ts6fs,s8)fAs6K`:s+13$s+13$s+13,s6fs>s7cTGs6K`:s+13$s+13$s+13b s6fs;s7cTJs6K`:s+13$s+13$s+13$s8Dud!8@JJ!8[\A!.k0$s+13$s1&++!.k0$ s1SI0!.k0$s+13$s+13$s4%);!5ed5!6bE/!.k0$s+13$s+13$s,[3K!7_&D!7_&; !.k0$s+13$s+13$s2+g)!7CiA!8%8;!.k0$s+13$s+13$s+C@?!8%8G!8@J>!.k0$ s+13$s1A=.!.k0$s1SI0!.k0$s+13$s+13$s4@;>!5JR2!6G3,!.k0$s+13$s+13$ s-!7_&8!.k0$s+13$s+13$s,$dE !7_&D!8%8;!.k0$s+13$s1\O1!.k0$s1SI0!.k0$s+13$s+13$s4[MA!5/@/!6,!, !.k0$s+13$s+13$s-WiT!7(W>!7(W5!.k0$s+13$s+13$s3CZ5!6bE;!7Ci5!.k0$ s+13$s+13$s,[3K!7CiA!7_&8!.k0$s+13$s2"a4!.k0$s1SI0!.k0$s+13$s+13$ s5!_D!4i.,!5ed)!.k0$s+13$s+13$s.98Z!6bE;!6bE2!.k0$s+13$s+13$s4%); !6G38!7(W2!.k0$s+13$s+13$s-!7Ci5!.k0$s+13$s2=s7!.k0$s1SI0 !.k0$s+13$s+13$s5!3lLu!3lLi!.k0$s+13$s+136s6K`cs7cT# s6K`:s+13$s+13$s+13qs6frls7cT&s6K`:s+13$s+14Es2tCns+14;s2tCns+13$ s+13$s-E]R!1X!0@0W!1X#T!.k0$s+13$s+13$ s6p!V!2TYi!2TY`!.k0$s+13$s+13Ks6K`Ws7cSls6K`:s+13$s+13$s+144s6fr` s7cSos6K`:s+13$s+11Ms3Ugts+145s3Ugts+13$s+13$s.]P[!0$sT!1ta!/(=K!0@0K!.k0$s+13$s+13's6frTs7cS]s6fr=s+13$s+13$s1n[' !0@0T!1X#W!.k0$s+13$s+13$s82ib!1ta!.k.Ms8)eTs6fr=s+13$s+13$s,-jF!1!TZ!1!TQ!.k0$s+13$ s+13is6frHs7cS]s6fr=s+13$s+13$s+14=!1!TZ!1X#W!.k0$s+13)s4m[+s+14) s4m[+s+13$s+13$s/Z1d!.k1Ks8)eQs6fr=s+13$s+13$s,d9L!0[BW!0[BN!.k0$ s+13$s+13os6frEs7cSZs6fr=s+13$s+13$s+gXC!0[BW!1X!/^aN!0$sH!.k0$s+132s60N7s+13rs60N7s+13$s+13$s0Vgm!.k1< s8)eIs8Dua!:Ts_!.k0$s+13$s+13is6frBs7cSKs6K`:s+13$s+13$s6BXQ!.k1H s7cSNs6K`:s+13$s+13$s/#b^!/COK!/^aE!.k0$s+135s60N7s+13rs60N7s+13$ s+13$s0r$p!.k19s8)eIs8)c^!:p0_!.k0$s+13$s+13os6fr?s7cSHs6K`:s+13$ s+13$s7$'W!.k1Es7cSKs6K`:s+13$s+13$s/Z1d!/(=H!/^aB!.k0$s+135s6fr= s+13ls6fr=s+13$s+13$s3grB!:TsS!.k16s8)eIs7cQ[!;6Bb!.k0$s+13$s+13r s6fr=rrE)o!.k.Ms6K`:s+13$s+13$s7ZK]!.k1Bs7cSHs6K`:s+13$s+13$s0;Uj !.k.Ms7cSKs6K`:s+13$s-!.k0ps6K`:s2Y01!.k0$s+13$s+139 s60N7s3Uf7!.k0$s+13$s/,h_!.k0ps60N7s3Uf4!.k0$s+13$s+13$s+13$s+13$ s+13$s+11Ms7HACs+13$s+13$s+14%s7-/@s2Y0+!.k0ds7cSFs+13$s+13$s-E]O !.k0js7-/@s+13$s+13Os6fr=s2Y0(!.k0ms7-/@s+13$s+13$s+13$s+13$s+13$ s+13$rrE)l!.k0$s+13$s+13$s4@;G!.k0as6fr=s+13$s+13$s+13$s3:T1!.k0d s8)eIs+13$s+13Ls7HACs1\O"!.k0gs7cSFs+13$s+13$s+13$s+13$s+13$s+13$ rrE)o!.k0$s+13$s+13$s+13+s7-/@s+13$s+13$s+13$s2Y0.!.k0$s+13$s+13$ s5X.V!.k0[s6fr=s+13$s+13$s+13$s+13$s+13$s+13$s+13Ws8)eIs+13$s+13$ s+13$s+p^G!.k0$s+13$s+13$s+13js7-/@s+13$s+13$s+13$s,m?M!.k0$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s0D[t!.k0$s+13$s+13$ s+13gs7HACs+13$s+13$s+13$s,R-M!.k0$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s0D\"!.k0$s+13$s+13$s+13ds7cSFs+13$s+13$s+13$ s,6pM!.k0$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s/c7t !.k0$s+13$s+13$s+13ds7cSFs+13$s+13$s+13$s+p^M!.k0$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s5X.V!.k0$ s+13$s+13$s+13+s8)eIs+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+14,s8E"Ls+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$ s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13$s+13+s+(0$!.b-$!.b-$ !.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$ !.b-$!.b-$!.b-$!:9dTs+(0$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$ !.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!:9dTs+(0$!.b-$ !.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$!.b-$ !.b-$!.b-$!.b-$!.b-$!:9dTs7H?lj8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[m,!:Ts\!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g[tR8s7H?lj8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'Z gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m# !!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m,!:Ts\!!)'ZgAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n? j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n? j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m& !!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g[>+B j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m&!!)'Z gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g[>+Bj8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'Z gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g[tR8s7H?lj8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m# !!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m# !!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 g[>+Bj8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m& !!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g[>+B j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m&!!)'Z gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n? j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m,!:Ts\!!)'ZgAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'Z gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'Z gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[m&!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 g[>+Bj8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m& !!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g[>+B j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'Z gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m# !!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g[tR8s7H?lj8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n? j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n? j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6g[>+Bj8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[m&!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 g[>+Bj8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m& !!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n? j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m,!:Ts\!!)'ZgAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'Z gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m# !!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m# !!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[m&!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6g[>+Bj8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[m&!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 g[>+Bj8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m# !!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g[tR8s7H?lj8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n? j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gZ\\+Bj8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m&!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g[>+Bj8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[m&!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n? j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[m,!:Ts\!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'Z gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6g["n?j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 g["n?j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gZ\\Ml)s4p]Th,XL2) s4p]Th,XL2) s4p]Th,XL2)s4p]T h,XL2)s4p]Th,XL2)s4p]T h,XL2)s4p]Th,XL2dP+rr<%Lrr<%Lrr<%Lp&G)Crr<%Lrr<%L rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lq#CDFrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%L rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<+N!9=+6!9=+6!9=+6!9=+6!9=+6 !9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6 !9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6 !9=+6!9=+6!9=+6!9=+6!9=+6!<@ZM!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL !!%QL!!%QL!!%QL!!%QL!!%QC!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL !!%QL!!%QL!!%QL!!%QL!!%QL!!%QC!!%QL!!%QL!!%QL!!%QL!!%QL!!%QC!!%QL !!%QL!!%QC!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QF!!%QL!!%QL !!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL !!7ZNj8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j7!.b(L!.b(L!.b(L !.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.aG:!.aP=!.b(L !.b(L!.b(L!.`o+!.b(L!.b(L!.b(L!.abC!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L !.b(L!.b(L!.akF!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L !.b(L!.b(L!.b(L!.b(L!e::2s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6 s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6 s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6 s4[P6s4[PSJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TL JH#TLJG&sCJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TL JH#TLJH#TLJG&sCJH#TLJH#TLJH#TLJH#TLJH#TLJG&sCJH#TLJH#TLJG&sCJH#TL JH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJGB0FJH#TLJH#TLJH#TLJH#TLJH#TL JH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TNJ,nX0gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAq;)rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%L rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lm/R-:n,NH=rr<%Lrr<%Lrr<%Lh>dP+ rr<%Lrr<%Lrr<%Lp&G)Crr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lq#CDF rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%L rr<+N!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6 !9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6 !9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!<@ZM!!%QL !!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QC!!%QL!!%QL !!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QC!!%QL !!%QL!!%QL!!%QL!!%QL!!%QC!!%QL!!%QL!!%QC!!%QL!!%QL!!%QL!!%QL!!%QL !!%QL!!%QL!!%QL!!%QF!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL !!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!7ZNj8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j7!.b(L!.b(L!.b(L !.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.aG:!.aP=!.b(L !.b(L!.`o+!.b(L!.b(L!.b(L!.abC!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L !.b(L!.akF!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L !.b(L!.b(L!.b(L!.b(L!e::2s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6 s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6 s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6 s4[PSJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TL JH#TLJG&sCJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TL JH#TLJH#TLJG&sCJH#TLJH#TLJH#TLJH#TLJH#TLJG&sCJH#TLJH#TLJG&sCJH#TL JH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJGB0FJH#TLJH#TLJH#TLJH#TLJH#TL JH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TNJ,nX0gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAq;)rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%L rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lm/R-:n,NH=rr<%Lrr<%Lh>dP+rr<%L rr<%Lrr<%Lp&G)Crr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lq#CDFrr<%L rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%L rr<+N!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6 !9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6 !9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!<@ZM!!%QL!!%QL !!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QC!!%QL!!%QL !!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QC!!%QL !!%QL!!%QL!!%QL!!%QL!!%QC!!%QL!!%QL!!%QC!!%QL!!%QL!!%QL!!%QL!!%QL !!%QL!!%QL!!%QL!!%QF!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL !!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!7ZNj8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j_s4p]Th,XL27 !.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.abC!.b(L!.b(L!.b(L!.b(L!.b(L !.b(L!.b(L!.b(L!.akF!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L !.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!e::2s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6 s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6 s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6 s4[P6s4[PSJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TL JG&sCJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TL JH#TLJH#TLJH#TLJG&sCJH#TLJH#TLJH#TLJF`a@JH#TLJH#TLJH#TLJG&sCJH#TL JH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJGB0FJH#TLJH#TLJH#TLJH#TLJH#TL JH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TNJ,nX0gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAq;)rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%L rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lq#CDFrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%L rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Ll2Ug7rr<%Lrr<%Lrr<%Lrr<%L rr<%Lrr<%Lrr<%Lp&G)Crr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lq#CDF rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%L rr<%Lrr<+N!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6 !9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6 li7%Gs4[P6s4[P6s4[PSJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TL JH#TLJH#TLJG&sCJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TL JH#TLJH#TLJH#TLJH#TLJH#TLJG&sCJH#TLJH#TLJH#TLJF`a@JH#TLJH#TLJH#TL JG&sCJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJGB0FJH#TLJH#TLJH#TL JH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TNJ,nX0 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAq;)rr<%Lrr<%Lrr<%Lrr<%Lrr<%L rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lq#CDFrr<%Lrr<%Lrr<%Lrr<%Lrr<%L rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Ll2Ug7rr<%Lrr<%L rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lp&G)Crr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%L rr<%Lq#CDFrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%L rr<%Lrr<%Lrr<%Lrr<+N!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6 !9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6 !9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6 !9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!<@ZM!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL !!%QL!!%QL!!%QL!!%QL!!%QC!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL !!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QC!!%QL!!%QL!!%QL!!%Q@!!%QL!!%QL !!%QL!!%QC!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QF!!%QL!!%QL !!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL !!%QL!!7ZNj8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j7!.b(L!.b(L!.b(L !.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.akF!.b(L!.b(L!.b(L !.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.a>7 !.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.abC!.b(L!.b(L!.b(L!.b(L!.b(L !.b(L!.b(L!.b(L!.akF!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L !.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!e::2s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6 s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6 s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6 s4[P6s4[PSJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TL JG&sCJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TL JH#TLJH#TLJG&sCJH#TLJH#TLJH#TLJF`a@JH#TLJH#TLJH#TLJG&sCJH#TLJH#TL JH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJGB0FJH#TLJH#TLJH#TLJH#TLJH#TLJH#TL JH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TNJ,nX0gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAq;)rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%L rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lq#CDFrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%L rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Ll2Ug7rr<%Lrr<%Lrr<%Lrr<%L rr<%Lrr<%Lrr<%Lp&G)Crr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lq#CDF rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%L rr<%Lrr<+N!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6 !9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6 !9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6,QHS"s4p]Th,XL2 7!.b(L!.b(L!.b(L!.b(L !.b(L!.b(L!.b(L!.abC!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.akF !.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L !.b(L!.b(L!.b(L!e::2s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6 s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6 s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[PSJH#TL JH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJG&sCJH#TL JH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJG&sC JH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJG&sCJH#TL JH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJGB0FJH#TLJH#TLJH#TLJH#TLJH#TL JH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TNJ,nX0gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAq;)rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%L rr<%Lrr<%Lp&G)Crr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%L rr<%Lrr<%Lrr<%Lrr<%Lp&G)Crr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%L rr<%Lrr<%Lrr<%Lp&G)Crr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lp&G)Crr<%L rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%L rr<+N!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6 !9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6li7%Gs4[P6s4[P6s4[P6 s4[P6s4[P6s4[P6s4[PSJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TL JH#TLJH#TLJH#TLJH#TLJG&sCJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJGB0FJH#TL JH#TLJH#TLJG&sCJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TL JH#TLJH#TLJG&sCJH#TLJH#TLJH#TLJH#TLJH#TLJG&sCJH#TLJH#TLJH#TLJH#TL JH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TNJ,nX0 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAq;)rr<%Lrr<%Lrr<%Lrr<%Lrr<%L rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lp&G)Crr<%Lrr<%Lrr<%Lrr<%Lrr<%L rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lp&G)Crr<%Lrr<%Lrr<%L rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lp&G)Crr<%Lrr<%Lrr<%Lrr<%L rr<%Lrr<%Lrr<%Lp&G)Crr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%L rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<+N!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6 !9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6 !9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6 !9=+6!9=+6!<@ZM!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL !!%QL!!%QL!!%QC!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QF!!%QL!!%QL!!%QL !!%QC!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL !!%QC!!%QL!!%QL!!%QL!!%QL!!%QL!!%QC!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL !!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!7ZNj8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[m#!!)'ZgAp:6gAp:6gAq;) rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lp&G)C rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%L rr<%Lp&G)Crr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%L p&G)Crr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lp&G)Crr<%Lrr<%Lrr<%Lrr<%L rr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<%Lrr<+N!9=+6!9=+6 !9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6 !9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6 !9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!<@ZM!!%QL!!%QL!!%QL!!%QL!!%QL !!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QC!!%QL!!%QL!!%QL!!%QL!!%QL !!%QL!!%QF!!%QL!!%QL!!%QL!!%QC!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL !!%QL!!%QL!!%QL!!%QL!!%QL!!%QC!!%QL!!%QL!!%QL!!%QL!!%QL!!%QC!!%QL !!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL !!%QL!!%QL!!7ZNj8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j7!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L !.b(L!.b(L!.b(L!.b(L!.abC!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L !.b(L!.b(L!.b(L!.b(L!.b(L!.abC!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L !.b(L!.b(L!.b(L!.b(L!.abC!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.abC !.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L !.b(L!.b(L!.b(L!e::2s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6 s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4cl?!9=+6!9=+6 !9=+6!9=+6!9=+6!9=+6!9=+6!9=+6!<@ZM!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL !!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QC!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL !!%QF!!%QL!!%QL!!%QL!!%QC!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL !!%QL!!%QL!!%QL!!%QL!!%QC!!%QL!!%QL!!%QL!!%QL!!%QL!!%QC!!%QL!!%QL !!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL!!%QL !!%QL!!7ZNj8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6 j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j6j8[j7!.b(L!.b(L!.b(L !.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.abC!.b(L!.b(L!.b(L !.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.abC!.b(L!.b(L !.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.abC!.b(L!.b(L!.b(L !.b(L!.b(L!.b(L!.b(L!.abC!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L !.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!.b(L!e::2s4[P6s4[P6s4[P6s4[P6 s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6 s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6s4[P6 s4[P6s4[P6s4[P6s4[P6s4[PSJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TL JH#TLJH#TLJH#TLJH#TLJH#TLJG&sCJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJGB0F JH#TLJH#TLJH#TLJG&sCJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TL JH#TLJH#TLJH#TLJG&sCJH#TLJH#TLJH#TLJH#TLJH#TLJG&sCJH#TLJH#TLJH#TL JH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TLJH#TN J,nX0gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6 gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gAp:6gEusVs4p]Th,XL2?1^Z)s4p]T h,XL2)s4p]Th,XL2)s4p]Th,XL2)s4p]Th,XL2)s4p]Th,XL2)s4p]Th,XL2)s4p]Th,XL2)s4p]Th,XL2)s4p]Th,XL2)s4p]Th,XL2M grestore showpage %%PageTrailer pdfEndPage %%Trailer end %%DocumentSuppliedResources: %%+ font TMSTYU+DejaVuSans %%EOF starpu-1.2.3+dfsg/doc/doxygen/chapters/images/runtime-par.pdf000066400000000000000000000723451320135501600242170ustar00rootroot00000000000000%PDF-1.5 % 3 0 obj << /Length 4 0 R /Filter /FlateDecode >> stream x]5n&v_/m]/n 0 392|'1N U۽9mjEv<{k6_4?ⷵ?{?OK2mo{+YԽlc۶|g}[c>_:zA{kZ[Y| pMv`y/[\ vrlh_qKyߗ3Z5pScI}_3wd` ۫wbP;:>߷ҁn}Ԭs;Se \@#op;usMdD~ڼ15E,}bc i}iQ;k1RSHjHXr8M" KBya? 5oߺr9:x˂^8:Yudi 4g6Ȃ.{wՎIUS_5 @]M''~F_9ۼ0;, (O! o7rX-)> !.Bϒ1_$,|7n$ܗ.|ux>jx_۶vVDO? Įٛ8iܼSY}a8~3h5< ԀC_yRKK!@?MBS|@7b q܉]jRY9oFa|`1&U0aٰ=A4Y[ߔ ѻ+$mBQvXy{yo)o}>c5R SF5S`u_׾paA Qw/H}\K5v揷(]זBv NYhص[Ns;}eaw~,b絯nt }kNal]}1}JINAӐM1@[xhXАAj y"oq,P` F-6*}Ke'(5ARkͣZMcՅآ)GNOԓg^BGߒ!l򠦕)X5j@j8e닺Q>54 )Iw/"Hηdp! hw,}ĝ:|@IwhqQ/pzj1 NiB_>HO ?$uBJ3C/qB iEK5da(E!x NM1CK`v54 \$ F`oX++eդϚ~G@}̶0J DvYOpRko>Ѵ@ o߃Lc?Q ^?1ڷ6zEnw'Ͼ'R C F4n67oythII3Ν IW.R#+9gW{"j kB&fӏQxm҇uѶ@|gv޲ N7},粷b8\ !,ce7"hk!7* x ua|'_~A}8f~e@ xcr26}s: Ev܏S4سJ',X@OBtr>~cTrD=y~fŏ-tG4:YBRݨD_[G g(;$_}w,yX9A'6{ L}9͈D[i&Fh130]xR'}Tb~?s776fֺYChx>P Bpf lń4j5nXEh  $_^iuPi`t߇5,e >+TQa9؆#t.BcSIПHᙛ/B;cȢ0xY= (!x24fC }z+[So;u 2 "]|Q}ke+ޥa'8sϖ0<PYM8EGc]!)<$HżR1O݁}'3'/*F2;`SW VАᔃ0mb GRs\ Zo?n^򿴷?Q ,;;Œ}%&_'+ۚ# M̮a˞ X$RO4ƋV!%Z$P@p  ѐ@ ~w0 ` ۍ AVN n}p}/ė,]=/>@vAgNH?vU2ZݻBf'3;/~\4Vՠg=e6SSV0FOPy{Ky,j~JxIП#j ;4ڧF+H9׷+9m|`B@'XGK\){O ?Fw 6 =@[by#*XF^A!C.rDUЗ[N^Rs a/_h+\eV>a ')+v# .c ]O7?%PG:~zi ge?tf+VS/ у}7?1U};Rsc BF*dw6yh{\< g"Y8qƝk r[yg^zj1>ܺISXix孞}bah?Ը\))J[4QҘW])! $B*dPfv L3(YkrLS `؇vX?EQMtxcWWJO/?L% ~'nC>R9ZWFj &K)$b\SfC .! #?}Dr(8e/FIpð+2lK)KM7zxdRhzWgABVό:ߗs-s)!Sltʣ`1f4D0da;WA#}FskovۼbyeC֬sKKPcMR{_Ưx4fo]\@B?ud(*@]wq7FҢ5L~~#ݓk`/4cƾvv/{-8ŸEW4-\Hd!~?N:w`:~u9P4KED3Ը@8v tkPIGWWH\ po Ì RXͺ$M3^~b:wR|S^{̋U.7h[Ə+w>:s6uP_! Aaw;Pq Y)a#JosX MBa|c Pј9,}W}kr7vp,R.7/oG+VrݞazǢr|mM,%) >ҕcP94?! c U ^ o `Yg~I)Jb q刅D[3B.8y7x*Ýv(+tҍ/fUI-.e;z/mj-ri6ZN~.q̸Sc) ~uVR`:Ek F c;d/'hT}/?V{gs|0  ]MO#й򤮆CЁqb_މA>Y\;[ph뇘A^,Ȭ;_xj]+'',rpK-BG=ar}E* z?ش"xzRm/ WS7_[!-7vj-Я׆w|q<[_rf0`4r`S2͜K]4϶o}cm 3O:ݶ?oO8?}>)wa3A \sxG/(?'!+*Kk},4GX^*iXC00yGF w&x>|œc" eMYlC!S &p-#|$B,C*B7.h$HFE ʗfD@m[fMX3Hl[q׳RɁoi[e-]UkHVY6݁F[N.tb ^.{qsG:pҹ'N(Oܽh;1>tz 2ۖٹ%S0oST\bQC(;!]͹)D7گn8U>J({L)<$XhJ#r<:bE_hʒ~B@9fOA[ ժ`9:@?Gǥ#.{Ax݋]9]D,A3%/ b; !~m`uKOD wI3WĥVSn:%8!@ `X0*l"aB1 Ĕg8w)pcAxbC?~< } Br\ ^u`R),["e@Bf;Wi$7_Tuy;KEߖ _z~кiTkJ6:y\J@mRً ؋pɠMJU oRDZXM0<0^T@pɠMODwI.(I[̭`a+R:(ˬ 0fhӨR6߳Rr\;{('Ndp{1a飆ld ,sxl06Es:YUMB& <)! FU榙oܗ(iYҵO]V^(،6tzCh!;d7~5q;PnćTϼzP@(`Ss0G9ac b7r(n9]d$~8攒dJQSz#4x8XocDTqYPcjcDÍ=H"Ieć4g^"+" 0dEi0,̀G99"ŧ$0wwoNO?p(DI_ox>ܵ!RoFP (k In೅R/ 'IPYO,hE|fA}=YzkRק!) S0 SM!Tx\j)1Ƽze?zC(*p=uxN'Q{iއD/gYDq)A=`(%N7ĉg^g(- ;Tȹ5hOك .rqɠP-{|0[ `+dmIR[0s<0'Ŋ3aʷh @2+qAx)lmL?z_quw<;#L_R"sl\[A.8[Jłل88!~1MV2|ʸY)~h %ܢҙ k(PS-R $:ۛ&@n3'sâ5dnΫ40h ιS$uX 0İ3*:'ct •Fo?)V҈!: qU'v8#(W&܏~0h#gA5psˆ F^ GYJhE&S\ŧ"R*c1$JmWgjB/= ~)<B-ǩ$#!z!@|-;o0FtKʅefr2f҉ፈ)@x 8?P+7Ta8?}ъlQGbb6>Yxm"'Xt}\Փ+~0mfB兯n-lrXbK8ֻ8lC5ƍͩ|OsvܛQـpC0Z?$8X&ٜ_Ɂ ᰽ډnbx ]8 &2Wae%p4CkIk[ D2RpŪ `HN(>?@vO9g+~bWYw!l)]aPmeIs] TZf>=6uMde>QyM2D'="D.nBŝKYhXf=&.\wE ^_o@sb|qz P\0L"qC"4R 9i78],@,@S3}_g%i8{f;7Y/_D7s%}Q+y}MT?Cc O? w5DZ,Z1*Ix‬a`|1r b=irHNdn:רZ'CQ!5(/G&~R[da5#݅zj[eR^6 c,x Jg^B_eMNyPd;la]T0Dejbеdㄦ, /?>^Tfx%㩡qiZpyw- ?Y.U`4pu2QM(JtB˥P OlO8 4Nj[tFTŒ~'*˱PrRx] 1+x 5"< rH3]t!p'((fx*: %Ad4pg?8:N|,M&@5"qv%.8h 6.h"~eƽ}C2h3-|",ET̛HQ_g4*KMNw݄^6{ً ؋pɠMZ]<.%TcpɠMt1*-vKæZp)(vJT0h :D?AAJRC˒!,R50 ;D{"76iAE ;WI$'_$O;?%)zT¡6V)xA68(oTve 6ЫIu! ߋP)Lk J=Ap -`RCM% ~! 'Ů/%)Z{YjjA:gqq![HX}_7ȵ"i:x4 JY߃icևP\I֧DwwovNdEhQsc.ީ48=Q0h!`w l&UywNSᒤ:1eWvc0٣&5ȟc5qә>(d?iE+   _oJKMY⩽+ \[dz~6Rea l"^m5AG֩E\dMKhܽ'}>6a|d߮)oib_ _EUxHf`tHFɸ`P\^'FCYgy{ n"Ye<pQ˂ lcAtS< Y%H&,Ħzgu0U,^A#]U0QŬG ͼ˒)pE4.dGw6nI־Htuxjĵ{ID ?2Sf'"&ZZ<.%ov T)gp/*T.hY݋2 ]erD/ L[ n~~̬.i:2 Iߩ $zLl:̾hLD.R G85]#\Bh @dW+-Nl 1"-իcAzi"<"$t!)S0kDj6%QQH{4][}*d"q="E5HE}2<rIpaݨ 7t`JxrpqҍP /bĘГO-|@0X8!<NR:留7i1LtWbp@nO2RٺURJUTԵ_ # H7t:ptƷȲUy9Z%r =>8n | MHRR榧Tu#ݔ0^C@:pu #Ӫ#tkoxQޛ>8.ķ{Q0qC`\g$Ba8,|igF_1|cĄW0jM?ԕ֧ x%p:p'mpe.me~;> o)j K`icOcb p\锸&oS"r7UaюצfXXʬJ#@1]T3\Vؽws?*@?hAOfVu7`<4KL`9|%[}r33[в7M7:lLG$|+;t>`Jc\2 AҞ'&}sU?-=feCcEj&9ph1AM9d¾W |ThOh%M[;jc(ç,>ȣ+G"Xе_L ;{07&mBҿv,V3յRARB{짜}`'h FM>DwX}҄&¼^ha۩TT~=TC15xv$oNn@م A"Zm4qc'gP1͡P R d R.m Br8 .2 IHH$r0 |NVĕQ,qJd?9DGs~Oʬ0 d'Cu r<]Ը/5KD- Ϝv6_ȓRQ^)L)c[ n|cUXC?)8i7/Hf zZ3Jda8qz1\h/ w*cVVTQ |^ oE.x "\2tOlO8ɜ$7hZD%*kc:vh2)@I34/G0T7s4D *tUL7`L{|jTaBlxĻϛˮJ) f?@?P0>X0DRt)5i`?Y . AT_|9 6=;za1֫.isHF218h59Bq)*ZԔ]L b!',e wul1&R.6Ƈ(R QpC2(wjI$+_]^HFKQf#4 u%n(6:WaGIed[лJH4M+k&E0YAlzj~ʶRtSC&Q!3@E=4˗0F FuWWؾfD—y$z3!mk? م  R{U_~uȥ*UJ'C$ ^vV4OPv'C ),/G¡LT7, sU8]ui! 6Skn!3v(a֯5`^`u'T$>`0>yMD\*i6ryw1'\p40!sZM[`i#r<`QD]]?.*6yKRҁ-wt.t;GҐ̩bACI6xKVӁB5LpE3 ._ }mf7}~<Խ_^ge Xv(.DUh&A] Ą*ό8ߥ7·R"_ !&@f-p#*@~EeA!Y{c@ \x㼐"Xw0v):%ddǥDf'~^T@tdP&8qW ‡M8:Jt/ b;,mfB(Dn|28MQ_e|mZplbnQ< y'5jKt#$; :O?q]Ac/(dlfiq  Bp,ƍۃMX` .V]b|}=tA3}X}])m4zxdOWoS`1HpI-<1W/tLx- kē'Lɲ G?/_vPX,h#~7]}#&3}aQf_1MXctQ ic/j\tǥN+~,xJk;:F?YAM> L<20%¨JǞ zL٩6EF|A?=yq1J<3%Dp dlAB+?FugJl"\6c n!B3^^TA`:\2tOHܽ: "kU8'~O _Uh"M9mFAqfFWٸd&|D}}z8ʗfU&Ve ?.쇍*Nʼ)w4AxN\[vʋIwBfUDąTg^=>:Nɔ B>1h6|LT eny}d'*J%!hቍh O<$ Qu/¥p(oрUQeE-$>jA; ً lg9F-v gʺC'%g YO|8JYlEA- EoCT2 R 'l.i /|Je(zp}4~ҟd}bT4B ޷j+|({3z^eØwn8൵c d/onۑ q:g_(sUWkأFgC:* \. Svq1/hL mIE' P?S~`zc ǴkipW;+T}[@pah1 _ĿCui\b̺wi sTg󲈁V}`/[X&Iɋ R;mk{"m T=Hf&]DI|n.juVPH)N 9\¯*09WTu?|8b Mi?|0=Cs- [Vҹ0 -z˚@N%='/"ƔS٥}uV=_ȫg>Vvb9h:x NzM`m?rrS)W4AՃ!iCPskMb ĕjw=b wz=&;/-bOOGƝot1a1DXw6tvЬ/X3ibOyfZSot{`CopC=3Yy@o~ZA.Uv%E}a&9/lY ۊatSeOZܡk A4oU8mt-k(l -$[|NA~z+[|CޏhƒRƞ—C,lV}SJ»{\ia)$cwY~Z/6.;:NzW`8O= w̾`}@̮;/ s{͈j eoE30P'7Cz4PY[nzxM6e vS"|5.rS軺WETח78֎-.OEE̳[ t矶3A+_U=Hew0bڛ^9Ҡ mrT388V;$- ~@j CEc@]=рC9nYp뺡4GoM+=}xDRx8S gSH' >hfӨȃ5T,5 Vl(! IB |([(V(u.Hk>ăy1|PT D !SOÉjA @b&dg}B͎QgÛHtpGVi:'懲b8Q'ra^3A1ڱQT;Zd,zmi: $qSHZ3?Iw$g7,*zx}S*\u'07pΘ-Լ`7,?6W z6ljs[ | p4؛%|lÙYhv4=.j.(z'C\Rژf\O"%kkNLo<x, :ZL/IhG4j <]`^)xăz"u`&|+w5A#I‘t"=f@jI1afԿgp vS%'>3;c:Oxy|k MN1xozuP'>C4F-5p P3--bsk35p$SVw~GR|7/[1cko|o b[,JIC.8v0 juIzd&,!g%:[?{QE@Q&8hpzAsOtN&$3xuyEμá cchg1wl'CzPjhDFN_ku1&2D&p'1Qt1V.cB1'1}9&*ӓ°g\k qš\k*P[,1ZFSBW`hw?KDxz[9Me8"_T@ BDILodX!,\!,lE0߬ApLCc]8++NQ,p ('7j\I.~7F-v:}Y\S<(P5܏ 5 my5}%%!vw.Bn=`%h6Xg4sIOh%2c@lf\]3gϪuQ5Lo_8Nf0Cr5uhwϞ GBXǴ;Z.^ @cIޝZ u&x˒>cG)#U>wn=lw2d }JLCS TоaҘI/|_A\$%u%_C"뼉WLpd@!r}j.2&6S%Pu CyU Tn}v  |2Y*Y uf7PAP8dNϘnz2ߺs;h` ^ϘgLa?}=c&+_p #ixρU*0c;x; OH:/eA h9WtOA)ĽQ.;/mƎ[! Xҏ81*G6ayD'C Y)^&NTpJX; ξh>0oN< Q<n\(O.B?/y쑎]R3ME"Q"q I0d>!|مч .bK4U2U򍬂tDFxIifXlA^Ir]|iD(zx%L]h@DPU4/g(1ӿO\oPq)hWlJwԤt;n 2VlQ}"zR|L5<(kC@" '/5Aמz܎HTU +^\>V'cY}˭~-UA EQohV:CL+Cf1ИT˵ ZLAr[FzOVԾ{+͔c4Vx/|Y|# @4+c`}A4-t'WsW[j"pc/ +dCrVwv+5,W^Y,{T"`[ w8$˪3%xd3۪(W]( ,wsZ[ @X+4 O~ra۔ZcAh #<}tevC^BOJ-?l\CX XMQϭJz?r9>ɸX[Zyam|΃%_s*M\6Bx]rcXT^o@o_X[@a{*C>'-""^NoeWgT|uEC(eyr<(mT8b(8940ǐy=I΀REW%֨mțE>XԻE1zB^ZۥkU'kʪ60W'r)7 ,Vh(=^K`/ETwshy,"G2ǂevo2 ^50uTk_wnXSbRG `dr>T1b,kWYT.R8f= >zSζ"Bj]Xpm=zFZATW]ٮ s!OOG]$lG^ZDV$E`",ƣid_ŖkVxZ/N@-feLI`񺀝TX\H(7~,I3 +^H`+ϗ q kQ񢂏rYc$!KzĨvs9$AZ+%͉Lž{ȸ mN9 ۾}s*Qn8%K>+2wbUx~i/ pXs2{bniup rDC^%[BChp͛Wr)}WZo,V~;Ҿ OcjY(B~dX]voZp>uiġ 1^Df,9&>2_Z~["-U#:>UŎ]]\}j,CP '31.6_C$0{r' 59,4lpxtM^pq8NOR8db]FFdq;'0F~ qV )5E^GYБ7Ơb*O%iԶͧ_Jb\G xըya"q3~S ?G8꒍xP?5_L Hz^"Pj[Sg{ޚV򏯶&2ۺ`Mc< )4١a|O|w=7K|S6fXý\ןN;>͇&7{Y}=x)eW咾a:S۾|~|}μL(d\|]J}=(S(z.M|uRE~Iʼn!wjӜ^=*V,u-OsdӾЊ'f?~K^w|!Ns2 EɉYLjO6 B gwձZecdy4.DWO[ ?,ٵ0 E3m%J2ʡq0,r_G{)ykqVh"vO2*21](ALc az[Aҹ(NmCz{ur-t|A;|swX4a)%Ɛ<.?FKBYK 9t!cdr}etV(կr&WrV[t}Ayn[.(? CNzwX&<" I%n&q=Z8\s6ęKLXBzj[d:uG6> ]iVMwHSfIs< 'Ǻ V\'t^>-05"Z.JWس;hߚrmy U\håjd4S֯ sEYZ ͋[h}ִ=py'V7= *kzg]>)ZC4,O]{!,Y92{~}}Ez g8n'%X#\ؐ6p5 K{'iv Y]+Cnᣐ> &V8YZQ cɼlXV%גTMX̘e㞏ahR.ZVFy5b'.~G5A-no;T uЂ:| Z1!j+1 Mdh`dbrpyTfs3*P0s4b΢Y3Ye=+>bUAR֍)(/#~ O,:lj B%yӓ \6Xb2qJ>7]5%]Nĝ^PP8bb$(P`&ե%^ٕCXs|{X]XrV,fZbM [ <]sBL6|`1'f| y8bnuh,&ץ?Z{'l:8`bHyBEoV#͂Snyp渵S1%^N7qS(m02m*ˀXH,X(g|<6]%$(44&G%j9x3N/'k ɘ SdcM^*z)y2JBQF'Z Oۢ *NEj5貙,!⊲%ݦ4QOEI"J^,Oҍ&-v{t;ȓC.zLs^c*prIkv*͒:qyG IilynS}ղ}lʭX0Ճ2d,ٷt,yk')4;@Z5@hiܽ. h s*/U|`M ա YˆbHTx/Òڎ !)xniw[fK<k| 1l*3)t^} bY P]1FvWs,abSNBK(AP GC&Q+;UH-نa&<ϝTε4ӭ2 XQrjx=&S*F XuuMьŽ0Vtؿs-ʟAɄgt:=CJfg)B*?Pg'S;d9413 qE}`hpN.2ۢ*/M(XKdڭ?8Ҭ~GQPuȡքs&$ <5VhTc`>:9j+^X έOY%Qf돇LV Iڦk ǭ6㿅WMhyf%rmHYFjk1๠ՆeS[ 9焢pEgUUjscIMk:(9.vm'U*?`b_&IԱV)WZk'/fvKsisjc{ 4l"sl3v> endstream endobj 4 0 obj 23394 endobj 2 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> /a1 << /CA 0.623529 /ca 0.623529 >> >> /Font << /f-0-0 5 0 R >> >> endobj 6 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 392.235779 301.275146 ] /Contents 3 0 R /Group << /Type /Group /S /Transparency /I true /CS /DeviceRGB >> /Resources 2 0 R >> endobj 7 0 obj << /Length 8 0 R /Filter /FlateDecode /Length1 5948 >> stream xX{\UU_k:g95A| BIh9 JIj''REszs{bo=~wo ,'@\gO-6!?<JKŏΞ3ਖ਼X'D1SMQRvc)!Q\'`;hTB&bfO]X,` ]sg @ xXvFkomjb7o 5oK"4wQ y6*nssGBkdA&aDgQe}Z43 W$j)"mmZ@zҎzzN̞`Tu`aNf,0E'qR[C1mva!|oa9sId ~ПZw: TKJLI 뇖s⛣.=MI;|cUFR^HUOSZ.|+W¥&u]W b r i0P\I`My`"#=-1&#ԄEη%i|LVhdhZװdI+ 6i!="3uc۵ ߄=^!bφo4X$Ǡ |{xOuB'$9Ib|ccvyDض}۱]wżߢށHwl R/6%dF2vE;}>->NkpF 4DɈ *Q?z/كuu)GL;MCzX-" aa^FIːpIscs`&Vgual$8cwzmmSo|C=;(zy`yA{=z8I1wtL2xڟ&p݋ίvyIWkJGn='띁)˟>#[vYf<=q)M2$aӘK6ͺ?')׌,tnY*}Cpv g¤V2gE`&6~q&hryo|MnnևtaC97m?%͜&iE\~+w;džņ{\2L.Y:A0H,`lB`C1t2rO'i͒֎3b~tY'X7cws_|PpPLPlz(2Xrr,-jŶab0F˺C4ԉU z$u[7kpb "&U)Yq`WbZFˮi-S&SS~<ȑt;}1ޗx_2 9HTRe~ڮJ&<Y5]#!fw0w_~# w;8_u2칤#E A)y1&^D[(=% YFh6JҥtpRv%Gڤy^?DQ%ZCmk{I̧il7dy~b`_忘d=O2cޝM& d/JwcsPR+ |gh&9=+:$L 49RsK#lj 5,(ϊy<;Cl7TxGc ' 2G7M0Q!,%_?C*.R8hY&Pr%5,z9]IZs #6ڂΐJIB :kT!}I!FFc)6˽xB M{nqh7|]3}F5\7 ̀kNZWЊ[xv×p9W%Op(|vP -c-p>8I0;`G>0>3a^"* w os8-or8 Mr8Ac5rh8|5p8|h;|/Mv!7z5zrˇWؿþv {2r{9d]^ܩa;Vv^=`|ʞHgYVAUհy6&6v3g8l6 ߹Y$szg8k暡PZfX-C9 *s* ~a B9,簌kii)[ʡCIa1E*OI0Ó0v(P "q3 63PX b sa`7&rȝ  ADxx<>rMU0v!K9y@ec8<2%Q*Bl #p0qWcv@Q ^qCln; I!.Ya0T:ؠHIY 2 $+$%Dwɐ/+?g~з͇>;bc,v(ĸ!-heɡ "g\a!,B p^ LpAA4ĪeZ |P8X-- sT0s0a7 bǨ2! mӾ6Ku endstream endobj 8 0 obj 4215 endobj 9 0 obj << /Length 10 0 R /Filter /FlateDecode >> stream x]n0 y CPT)B F! /NVbg&@gaXqW+hj"mK,3&7=y'ٻ荽ұխ6@.4k !K1o¶_t>ԬqqB+ qlZ/wFu뽐UK<!*> endobj 5 0 obj << /Type /Font /Subtype /TrueType /BaseFont /TMSTYU+DejaVuSans /FirstChar 32 /LastChar 121 /FontDescriptor 11 0 R /Encoding /WinAnsiEncoding /Widths [ 317 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 698 0 0 0 774 0 0 0 0 0 0 0 0 603 0 694 634 0 731 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 615 0 0 0 277 0 0 0 974 633 0 0 0 0 520 392 633 0 0 0 591 ] /ToUnicode 9 0 R >> endobj 1 0 obj << /Type /Pages /Kids [ 6 0 R ] /Count 1 >> endobj 12 0 obj << /Creator (cairo 1.14.2 (http://cairographics.org)) /Producer (cairo 1.14.2 (http://cairographics.org)) >> endobj 13 0 obj << /Type /Catalog /Pages 1 0 R >> endobj xref 0 14 0000000000 65535 f 0000029312 00000 n 0000023510 00000 n 0000000015 00000 n 0000023486 00000 n 0000028889 00000 n 0000023661 00000 n 0000023889 00000 n 0000028198 00000 n 0000028221 00000 n 0000028595 00000 n 0000028618 00000 n 0000029377 00000 n 0000029505 00000 n trailer << /Size 14 /Root 13 0 R /Info 12 0 R >> startxref 29558 %%EOF starpu-1.2.3+dfsg/doc/doxygen/chapters/images/runtime-par.png000066400000000000000000002177161320135501600242350ustar00rootroot00000000000000PNG  IHDR1t"tgAMA a cHRMz&u0`:pQ<bKGD pHYsqFIDATx}|\gy'@)( L5X]1JT1xa78&e Kw[$}R' H6NOCCnpMgjDAjǐZ$J/q߷u93s^6ϱ-Y:s^뾮Q`0 `0i+`0텼 ̏` j 1 `0R <2\ߛ$ď`Z#1 `$JA$+EI#:* 'j`0F\((k_ yr~Q7dG|a0Lb XeJR@}ZXI.JP4JWSG3(BCGp `09XL$@MGHNh0 &1 `Eyd5C%4^ 佻Ic0Lb0 (~^ 9F}^)"7%pԆ`0id`8!Ѝě?`J^%yQ(KF~VN#/:5=G&PVϿaC<0҈"3j.3d0V L6I9~Tqm퍶 QzM=;S2辔xx˸ y?ˏI #|8U/]gg7\21 |m-L7P\80̠)X_ʼn|2hLh8rOW,67z7R>0ܒEi$0a$V"+׼J'pKRle5RGc5RhCk2pB_n?@eI #Qo>6T>I~Qb9%ǀk*OQ&c0a+Gj_p6*BҤ9$F"J HLb0O`n,W爐2i1  fE}gpM&/I!/kKoXX\ g* 2#Tl֝9܉л,t k+I HK+OrNc0R'#4k<(L^^HҞ>p/:-7% Ir2qFx`n"ti9:I #aJ98 5Kf# #K`z31t~yX1E2 *ݒI*̞s2q`mFL^N^?J?ejQLsdMg"yg0a$ #̱^|rF YC^ϸ-M1y!>N/8v쬧`Ϩ.fy ͟s[+3ax@"2!'9 On*hi#U*s{؈k;2F^VH\_[K8BIph=͆YJ"!ZSS˘0DR+T8L`4ּy8v4*[wϪ|!k@4/ D$EXCNJoJq&u8َYF%nU.C'{wolb; ZIL0j5Ki\@/pe8$XXIG"/I2p׌m <'P3"؈KQ&]rH3 9]>|4Z"A}!2[]cGn85(a0MVPy6 \#h2XXq"'oF_FR楌Zl%g a.Svf 3mM>7*:?ϟF'7YekvƽC 4W$јDląt|F=ꆹ֧ zF.܂:W99%'u?wF/AN-&1 ^I *lj[{:#aJqưg~wxg=5(zaVI&<U w:0ȢrjdI BY crA4%6Qɐ *69Ht@y4p zTƸVpI'_>eF 5h/ +#.\/aU5q:O?$(} LpTTt~28$fUC `®˔Aͬu0lqo u`RafH6#s۬˷XqҬcƠ&zurT:Q,04kD~D0+_WaS0N3aؑ\Fbc \wa6΂C=G"{=<q&}qjVd-Lbҏ$z 2X?נUaI!րZG_z-u#/^mFXFѸ.l(}*e*I›sP2!dSpu#=sI^$aDIMtciyJa8 \1d{qJ~Iv8+ʔ˓a1aMyoeuaTYP/ RjGeXّĚ07zSA$r33TY8mTQ<}ƴ ]l^'>#S׫yɬ:`yɪ5]NnYl7E_qS$n^2Tʒ }OXS_w<m6cb 4۪yee>}fWϕ+[KiĤ-]mBWxawBHPBY iͪ\j?#N)| ذM6[^H!s)%͌oW+Ohg'0'a$vi^S kfn><ڗ$&H❲ {/<씗\N"2Z]Pi9z˽e:ogk%^NN{2O~J~HC&.]͙jKnwFb^=4V:$3Bo)dCm2r !ݑ?ڊ9ݾ^GoUV9RI4F%;ŬY2C`hsm$#9/XSް +J Z.&U'>4K;6{Pw I%ۼ(&kd+:FPIᷝ2{Ĭ*-hO͘3#%zA3G J#d>1>`WVlX)Bd j=@3N{Ţ\!J0b]l?(l\h3${*OyAqQ\;OȽkY#SCREI{͆e ӯ徽f)Xsw{Km=FH̨TX N{Y!9w"1yQLbr=@3 H.F1H{͟MKRo 6 / sH>[̟=uD1Inct8s=\ц{ZxOk7LA4k tT0a-S52"qV0 Vhx%'M*wmSמ5N .v6;f] @t}*ax6ĿQa=˓^MR~pwMAMH'H5H#i^~p|W#pTxx0l7~".W,c^co&y*DHؑ!Q4n(HEKEҊ^Kh_@{uc?vӿ||O]px}*G]%d+|\:eFD(?کx PJ{Ss#~Z*6?b'"UXdz0jJ?>~alVf"!s=w &$[_Y]Z/z@ʵ5,?m6#qE9@Wn")idxYNm{NK'P̓:G\D]64s#6"r 8X9ؼlG@x!xtȔVȔ1>7@8FQI&p:#+or}<-Af|<-IUnd,c,EyQ5|zlGS^ .{#c5৬iΘcĬ~n%#j[%X5zu[2z$l}ԿԻ in1Ml;7H#VN$eǎ9^ܕkn]`ȏ2ϥ9u)CK^s<<*m [T " F 8N*R!߄~HbZeN AN`vr 2DD#B3r_&d}90ǩ}n% Lݨ0[*'Jc$IjLb1>dE;Ɇܑ0 !z?`1T2&FpMxu]"TίM>K Q@LJZG73kAH5pnêHzlBZhZKQWOxKeCFmb!r$؜YCF7B Dl3"" dFauݹ *);lJQ"`ǬHh%z.zX< P)5\VMn mP}NI~ůw7%V''͑hKR*u2p_u3w h}^A4A:/8ibZlјD$0n'e /q]O=ynw82J2HAyNe[Z6TD_/vS=}_? = reBE*w<,Q^TaP_XY"x7X?{[]WCE'2HHh^6@aM 2ی(w9Dz 5[9"#U;F],b<2d3vjsK7dRf)O{>Yy׊"!wS 07n%09JFi+IJQma9=h3͝Κ5K%s䞫ڈ{J-9 u'ip,%S.\I2;Gi7)"oHGZ8IrNàTĊ2LF^,A(UW@[=xBZTs@mlԫH]~ݠi4·7 IΫ?S^uirJ רmftЈ4i4ӊ߃$2 %*#qkv}Q(fLy(uÎYJ'P8֡}i V0|l^,{F>I#WQo* 'IMIc,&"ȨLJtgܟYwDVHuN_XNN~&0LbdD?Wnݛ@/pkauVHY. 1Bxn̽VD/xuDQ/TKś*bC7֤GٍQ&SO߼d{D6l*V w-G vm4T2962X0D6bkew{<Qw}u3J'p:.&pJ6"&F3rt-WV Ddq@s*DγN9UeZ^h_' ?p yzi|B *uBjL#0ԔrȨ= ʋT5/L, B s<Ȉ"n*:RU7C5ih-%vuNb8dӨs3L\[qnaFFQ(~ہ7l<;,!% t7!kTyOjǒ>OEfrH>`>8XxK"Aل-D`Rֳ4TDpRR4%(R Qho~<1z"4>@u9bʔRI7L506/ǎ;[==fQ"IIѝ\qS_Z1%ĉ$͇n;J6׆^O"0Ąbd\#@ks(PNEndYPSc7W"טiАHP9L x G)Rmĩt$nZ7񤽿5KHlA*N͕̻y͚r|$t kUB`AP't7gH{iE  ۙUĬ"#Yx2Nk6,CMNEHkTJQ뤎92`ws j81ҀÔL44N%EW[^qbt&Y?(8ACiAi"Db|kA[cA.mWFe&imFb$T̟Ҋb X BM MJFz6v:2C:0 %fT>aCDh7!4d~ذ\r:!1hOI~ޅ!%FEHL鄒=͠V`+ ϛ=&!H/i[jGJ/gw_ZV/섏.88e3K!^|IL:A[%! F/ 6S^Fpgd}G(%H+eftD5#4r^_1Ww١ .59ɟHdQBXJ>f"C1A6G#.P&D %\Bf5bk?^r6BKI/pDSL='ݙ2u%YWfd>@p- x*2I^$]wXz6=JzĀI3$ڢM8 k.B*-EP6Yأ6Ɣ2 F]}}/ fOxXhص,ǁ{ınzfM>f~0& /Q/Xݠάcup?)㕫^ $ILJG6;/sゖz$nB>DSFb2UU;a9kL;bRQiTeAhZ ʇ)BC;}_+f<Ƿ#3b 8(?(HGD?!}FU$^-jԡLlf~ J'P#ƭ߁H+K8 q f)A'5S\7ܝ#8i8};ޭg{Le+I->JٚJ04VjD.)8tH@3II&QFTj aʀOZDBr'3xMm{8JT4:ݾ [h*v)Vh_CugeD9y{_1SPC?'.KɻVm4%wb7l'|i*[EyB.& ݊ e"H:;ZG|G`w8&1!Cе \?%x).&5{]פP@3iMEU1]Yn̛:I)'gw%4hGcN=ҕNt!pdnfG7(QhQx5-9\GksԵM FZ_1wјMnHOD5Q { ?:x e+l98zQ#-P+Xa6R hisiJ)kVڡ&; \]^<Կ'0~%.UM&Y6KkF؄AjJ)Ei!/x"uiynhSp$Ɲ!YMQe](,pp[eP)T y()(I!_q}9d?9ɼiti[kb5q1_& <I 䳨w<L=RdAڠ Tin:q9F`oD~-u2Zp:Y R*Y|m+&2:'7]jȤ=%8T6V/}^3]:>}C>P_=%vH['U 1Q 5uD`5Lb>IoFLyU-~zʫh`Qŭ3iFց2L׍"Ih*vilaJ?\n9.~MK'J:|Y/$5NA4Z&WmR\VOS F@`F^6awiy ܚ#ĽѼnirnQw7J _7*? ښB'FMuaOwG7t~2p팷tJ'p.WIqT 7j$mLdҷ+v]h,zgid'~oZ'n_Mޮ!+|El(N*yiH;f)wye+ 7 up+?e~X-B1fEO_t YXLbp#b ΥUaOJz'ije▭$ub9ERdI{VyBADDzགྷOܚ6iǃ J74K6'J/0L~&Qcg20{ 6[RBϤC54^K*\^Cs&1T((Pb-kކ2]Ľt-/k@dbo3)[4祜Q1m5 ʘ{/˵QN4Ց e^N YOnhXPU[yUF_,i.6jz6nZ:wFAht 6J2j,} "B}fˋdOx+o5Lb+('=/Ll{}8#irJL$e}բY'/jDT2:ݳ4QC$RyqYsy/{%f=HֆhBF14Gܟ4cH 4G%/cMPF:zwOkR]H9R>*TEF[()E@)-Yg) y6dR1K+y)Ę\ۤR $.9*}J,q_ EBE)j e0Epdda#&s^'gzB7 IT2MꤜQ5 H&0R7%{$*˟#W:Y\+7BIL*(e 5R\d6u/I uZ8Q0&={ lK&]Hrb@Y^māЊ؎#òB_ I%4C[TB8fyBݐI!/j֙0a2H|yF4%5^̝paX3{P9-h6]E9X+BU-6dv@"s nҸT ]~`-I?cO_H9Fk!eXiUIyΫ M9=2I&&y J,gJ g^g1 j;TsNμ\cN[6z犤 s:hk2Iug5/O2{j[ Vns5/c}Xok;\*<' Ҫ ޺cUvK &&Y q*ʋwM72R4qyDu#׶IPzDoej r]o$CղLq Pz 6LR?B.~+u"/ʛ81M.=JvٺRSOo:ޙՈa'NYGc&1cؠLՉ,+@ (+7?]ﲈ\;fT1\頵a:@!?:|mSaC.<4R6ǿ%{$WήI"r]>mF?{M{!$'{3yuVK?e&1Ň,!JAmC&W҈O zi445f^ӔMK`+/Zh^IlE<IɁ>x{_4QEԃ(R(mմsaز"/ng|Y]7NɭN'XиR,Ԡ˦c^n`O j7ۃqLspnfQp(1P #P9P9WhW-CN`<Ib5^| 4L)r金w=/ٵ AVy>} QhJ$i0" a*'Lq3WPA;+\6JV7#1~Z,G1%U~M6t9YB4C[Luʐ>dnuή)^ȋg|BQ ^L^Qnq&1al& $go2lS!ǚ;ZI-.l!:I, wwq)ܧBpj4sd}_F`Nir2֨10)'ͤ@[ zbH{ a;]6d&.f0i[}Q `.ƙgFv_M^#O:(3.<5 nwkfID+ hĺ0vh?͆q>9)@賆!ثΩ|38Ӭ= ћ!˃~Ĵ%Š{Z ]iHɑMn|8FfZ^S8*|M%Y8Őӝ3"Q'WGCcnL` NX )z.K3feT7F2ꑼҡ:$Pfb$9MH@ߴ%b&i&sT:BR;MaN P"s RI$JHNʽd;K>x۝-efZ=,?e~СD{T29{zi66OL /gڱHf `:$f(3/&7n5s={wj,2oCTM禜osڢ2qxUs( RcJFVG}tRs%AqIrc L0}ὯY~rn*d$gp좺9m?LD#a*bR#XF*lQ* ff(l@Z^~G2 Qi4JQyy0)K#!.8EeђdCN;F>d>|| eS6WΎ՞Ǻ1}D F4xG2=׉{MRK\vB&K_pp@ $~ LAgFE`Xn?V vX+ `\^ UNpk@2= ÐST^QYC[ U D֐=gLwLTa.0faO!yӿgQ쩻Inj;`E2ENR]u& <9肳ad bf%t1{QF:6yi9AI2ASzQy;B1.=N/~#d{$uījDh5}V#ENs%kg_{6:\I_QWT3(XHt-7W,FBĴ121U|#m<*AnnCr=q)8:Ȼϐ[_ V[(l҈yXOiFú9<n J]eB]1 /jMNŠGe'a9zw! /:Gu^&1L@`rlqg͟4*)@ymȩڠhKZyHV]=`yU*T\N{>8Ty$+SP;)4J*<}a$f5SE~qV6G̟ωT<4HDTLȄ ːS8=2ma6Lmڐ['0BDڢ1y%tUd.{Ȭ8;0:6KA/LjǸܣM )لI^ⴓb S8gB'b+AwRq &`M¹}"د)98G[gjr c\k!aQT&ύ'D||Ͱ7}Ο) F$ff4Sljǽ l7p:sd3b٥:S9zt\ 4x?eyX8`MJ:%YS=fOA-<" E`LO5-dM@to)dM:v3?<<?Og*9:;u^S9F$1rԀ{.CF9MF2# F|T%*]ZcQDeGyxM[[ٸ[; by]yB 6ձjl%K z^#*9nc1{g0}N>&KNuC~3,IaO^/ǎ+brIJN>?. kkCXw]=xB=21)ݏU^2,/۴: N}ڐ)0R(|p&u,JlCWgcoxy A#ܑw{^#u !rې˨wz݇]Uu T Zw5"yчAEmn5.CIs.l'6CRLb5(r oۉW:w hF\ ]wV*LB,y+_>uOr)ō8zpgP0cggZoZF2ĩ='Q 9L\jdfc2d$_*n>6t>r L1W^`aJDD7"N=Qr,Ceofqyn @}24;Aɋ$K+b mݔ?'#H"2t͉*3lؔ{F|@+ȞK=>6[6?$YR(n6N5psTQDe "HIX#럭s{%#IK1єk2p?"sp7]gIҬG\brk9>=@=by&=VcŘJ?P0m7b@sjvB0~ԻO9>!J?%/ƶODNy}Nk=F6Hׇf#}z57wDp7e52߻5t'Mj\Zq%`O?~P/Gr)AmX\}[I͉Enirt97f 1pݳ}O۲@ة]ISx˯ -}F?EOR&#tPL~*X]Srآ|A ڃgkgum;f7=S9 $1EoU30z6r(CZ0{{M@@slpd TR `͟B }1&N V5m _H Y™7lf(Q {C)#'IQR6{ R9C!_{6i9z'͐wdՠ|6+ǡ%@z[ /e@'q˥@ĘQ56,5mԻK5oJ A7-t"лL"ped͒Y%k05/X={vK'Ⱦ00%Hڼ`[!5A: 8FbJޓ 5ĴA*$.:mj CvJLIk+S2_Bk eILR`] ).CC1LG*SktZ:Ɉ*&KyRטě̟w6E{!릮mn3hGD8xOXd^nGzA$Eb*)v.5tC-PE=y; yӻt1kQZD*TJA'^Lohd\EĴXfڡFl=}sM|AӞJ#D̯)N3S1"]0vAtw)ȍk6N^)y/ Ow6)42R`Xk7,.;!%? RݔLF{ 1\nњN/&}fT?x3RY(qig)Uh >۟=/g:J9Ȱu9B܇IK:2uh i~°'d_kBŻP2JjP?_f3{?[) CFMaC.MQ)1y(o废h< kvӠ?rYR?KȒgI~A^cf L[X׶rƕ=^ L[_!M MgkI)'YT̴P\cPJdʐChtۆdJIwF5K޲;3xEa)n2DM3<g>(Ued,2A1 MKa2%&n{t74$? dO )!ptB/<|x^1GĿֿ+alϣ}G6(}ɜ|LQtx&҉w89Q,IL Kf sp0wVFom఻fDW-u,ǎuY>yiђLܝ n U:Ol"0S ڽiioYG:3aR.#z#:BL Zd^s{g4#kej;ױ'Y_t7M{I&=tVȫqhg. sjO~] K"G,tU9 ˬ~?9sYXo2Hw= HJ4qǬX'>L^'1tZ\zk/_T!ڡ!1i8یtQ`ތ_<}+dSSy)3Md-Z>ꯥu@s@-3iZug7| iB$,2@d wx `ܯD_a Z:C O>&4߲s#y~2<m>Lh)˶lPޖ{1JJB2p BoL+b3!`2pV޺܃ bT iD".n'Z5+;~ |)MA=8< $SXRQ ~bdsdݗz x5x;|ɎĨsy"pHQE,kti9d!޻|PF @/~V:n%ްLb2yi];>#/>6jGC-"ͭck 4o^)bAQ Pytq}y1 \s#Ek!'I> U.thY_~A#F=Mse]ꢪ0pMcVL0ofd6~*u%m2ʩdѫ䳺#;釰0jovo^>pʾ3=`5d`};Z~X=v7-//r=`*[E7vxsb#11`@hEO?v#qQLYVޜ=ח kWf@#5KgKs6$Bб(/u8nhT^ˇu*"u!| c$7)4BEf .#-?/ \3>=|O3Ip8E]5KbkPvӽeVrSݚA큽@#MGTr< uA佷Ą|a fJ'ًh.<,>njT N,GɯCIL+}nI.yBeQ&5J=Rbb2FjRIZI荹5O OY)6s^mñmqkoz'j=oλ7.xj+ZP3f UD^U'i@}m`sxuarrYsR\SzM1BpTKAwd^N-^JdN7$cHG *҉׌]E j[]X0b Ŷ;f HOZ~Nܸ5Rs.Zb*Olpsjx`knqH%JSQLxl dxStcڞ>hZy% ^2_/]j#* ( q F4 b^x7D@BOi/ڻ/9s>2; |GKJm2,$9to-hژZWsO,RR=_70lb]$z,wA-&YJ]jbA JL@yܨ}N[p)~֍ʓ9ɭHV'U}nzb/uH ѽ<&fe?}":X~+]x?T9y҅LhmC!^ 6ՕUU~ub4ˮe))ɦ(Ha#_Ռfg5H[ܺ Ӗ\-.v-GT֣4X5:72o]"!/Ĵ;~2\5J> W{K\sV 45ΚGu/ͷ,:d=0Run$ƐƂy]`mV<al^sp쎣:^Moȃ5ץ"@0(eVX)*'{~d)o#j+!?A!ayr(֔A6Hi6NAه|Lhư5vǯQZLc"!ARy $D!G"^DfIIa6d;8XFRktR2K]w Q2RHbh2(mH}Ԍ16eMUE漣I%щd#){5R&j@x;tc_[[9C<255\%sT֨=G5h:z'ĥ_taMJ#аknňf$5lֽ#uC2|6/y"^8l Y/fasb}x:he!ǻgcEd "+,Lbb&0Q .8I63³}Pz嚊PO<":u-M&9ϗ +c4D׬\K]2pD׹+^I6[eg!GUb&#SXSx7zXQ} Nۻ |h^ANTZzp݀[:ܣ͸B7a'Gtd}^;|[֋)2" xHk>XcG/vS>bpmtwB`U'$9hPB`,6+RqM} OX큋EcnYGwqtUiϑ!G3N{%8=X߻,,~N,&w9+ȡ"{Gʴ=.ĽҴ~pgd3\1Nc[5aF㴓Ƚ|i7,,, ҠipQja6?B"3xfUK5g$ $K.U"(A8[;/wx^oZ/u$L|lJ"Nn>QFc4H [M)#5]B;^NoX*gEq Lwk2RY>D+K-9O1b~ۼو1D"G69$If>.Csy9uj 'jo]ѼZ0xDL 4J#1)a#Z$<}WSQ2,kG(HE2{'anڼ|/QDc1ryːb2 v"~\;wژ][5{ot+3Jv"! ~H~xVM[*bJ~i}F^uOGmjmZcGI_9tȹ^0HJH[7bWhJ* ^/nX!&k'CDdB5zLy{= | L3>)ؾs&"#V꼥C}Q-쓽f< MsPsݓM?< l-*yo!N\] 2LGh$wjLb$>ۻ 4Kﲁtψ́^'D;䤑Zd%kW: Z d>Zw8Q*v^l`E@b`jVLᦕ ,#!+ =~8!kCj+8/J@prIFV:EchF~հ~0#*"d>*SvYN|89֯>O;ɹ y5&s&Bt"]w̚kt p l$ -ۖ|Z5$daPB*#}fOmؖtO3}4F79xOlu\r91ӿ atO۰DR.ÈqX"ŀ:c "&jFZ p:P) !u4wHcLE)KP n L6R]{lCɴNl%C/L֪ 1&ș0i}c[jWn"y?6G9{B>mRanUKZUdͥ:T@-5 dm^es(n ~BUb|gMG+o4PSY~ٮקE$EXsL9ḂnWmD/0_zjZ/ISnS|ȼ|΍%W@ێFF-!z[{M8#>wMa lu@IbcɌhO8# 1TIr&jR"yyO :~hD'<x΀T-5mXئ WkJ'ԘK|421.ekZ3IL(O˅zƭF&`!Sഇ-hɴr;v['=v(0=lEe:y5A$xh]μ4HǔsmZ{NcEOSI8tO d",1¼z"2Il޸nF%׵[߫ PĠZ>gE( Rh'_n?׹;TuhZg>P\ՕD>M7 42e0aÝؘkBg^]rq%S) b#u- qG/yFSK""GM|iDkt]9pk\楌L yxQt; ~ZL>1wϘsu`.  I~(]Y ^8e}EN*Md߁ *不3r-_T Uڡt$)830;Ձ^`VBmRt@EEeݒyֻ"6RTg'FIĨ|I$YI9 8S曪b* aFD>m3$_<N,bǵMkB[*{ǤZg;LgDhcVM <_ڶʇ2Vfs/'":VV='}~̺!#׳PRWێh;ӽL 4 :$4?l`5_V0@?d|US&0^@wQkF[%<9CmlIĐڴm$u'Kp6#^% hөJ%Iݝ~_]gE sݔ=HVr3#3&ф3 m bp($ʐJ.8k`nZx|ĒzSb ;HMrl5 !ް$HzJj\R6*o{"tjUDA _aA>j@62 )YaKIQx"!3toIw;x* HJ^^3>'37{ՁN' *rn+P@,Y1WZQZ*.ԭ F VASTuR00Ԡn9}?wd71t >,>␠tR:̄U/Ԉ<چR><@`0Sf#'̝wЬF\i~ʫ6ʰOl/D,DT^+HJ"߹KُRC 73E`o3T}>i] { SjkMA&wI'{)bpgLUJ儁Y~\Y)W^^!0/ɿd +˨m\L C© MURDFkx:Nʟlk-HIʘ΄SfO Οp#f1FVCؑzɟ}?-J!Yfږ*||,h)gj*m7l0j|5'~9rؼ`Sq&Kx&@ ^p -$c F>I7QdJՀ@Hv?!lD!Dl`݌"-39 >#HeA{A=Uqx&BY߮,fX&O$J: # rr@`u?!*g<0[E#!"IbKi9{͡|׭Fh%^ ֽHDnfEhי83Ip<Γ!/"kVo@&4(TKC&^1*M!jXԕSݶ{Tv!2RM! .]4η8_,Oi 1bakDQ^ eX 1;Y)cS ^3Jom9\@TRzq@^3&fJGNoFyʧNFm4ԟŖ&aUxMqBH2UZ2&2kbiUBth(iGZR 3b`:L?:Kwf#XR@gEP3Gj6aA643jWi#gH״ 0im" 4ǴqH5NzW 2`ʋC6 +uPH^#2+R.Ð}Z #%Vlx=lAS>mux/#9& 3 tgEG=KDBHj2naH@}"MVjŘtB!U˙ĄHWjVK+oRC]<5K@~~Ow=i { Wz` plߛEQ*N?t-Oy>#{~^E# TWDǿV #kE=zdYd(L7Zg r*b5!uC7CVW8_2"3ƎDnm<"~mEbh6%Ł^QʨI83 \_rq9!7{ Ơ1^e:>dN1!V^];Kbz#cjeIoZggM(tōf)^6IX.:gI>56ܨ (Ѐx"Ҵ SkKJ90͋'f稔y X)}ſgFeR@t:lXA=;v[j*#KZaS7/^3ݢ|'uFSnps0&IDATں }CeAuy?tgn􃦏WӚ@;~2D=7ψʞF-bFW5UV#cpGo{ryx_xqxO׺eR#: [ul&rK8[ ak/bmE*2A}}!o4Z F؄\_ÆHߤ"j@DNx#{[y( u}Mv9P~N %'Wn~t9rVNZq W49q5hHscܲ&YS2 > Ll x=@__inܼ%,`PJd֍~p *?-=L$k=v5x"#k}޲lZܰN#:Je[ԑJ4+@kʴ=. \U<;[i°uHgg 4$1/ǎ#0 ذyNZ`S6丸\&ռl6}}o.5mքu؈F u'!2n;ZhVOՊ,4SeÏ34+.'D:F$F" xf/tKbX62*_Aב4'O>S| pRn8G1w:/e3?8Q4p0<&KAJCuopjgsas'!Y{8&.R6K@-nr?27j⠜1$aȀڋG}=Ƕz&1œ/E; cbjw WS unL+Q,^7~W9n0{hx3xyC : v$D ը@<^SW\hEH3'JSjft=[ӆgcMZMUkrnX5q &Rp+w$zֵ L/Ǟ\5{g+QD gM- ֬8 ] i@zdF17Wu+N)ޮ9tN Fr A;,c$$$=)s-~xG{> }ʀ>G̙_lk H0۵ltʠ:SkĘѡhv+ bo,R@ɳvƧU'RT$D댹Ws׌0<,TJK[mݼ`NF.DR@K}4blJ(:Իgq5#3i$:%qe6F/.B1BBE˷2%لQŶ '%M^r9;O2,o UqcȥK` e&B90ɀQVy;3%O(!r`‰娳rUtH 1L*)[e 6e>\,ݍ!(bTR6#(fYW[*N{wQ`~wrpR]Tpû*կ 'gBx 4]&N띇Zzv\&{@~4Yg2 BsZ6gHX(;|a/Fm#iN#f2y9AQkas8WlEmHě ExdѬS/#B8vf<)|6?i]Z1zlXFK)u`_ [Fͤ ZTKS ᭹+Գ%rvBk!~A#$osDA"$ hb{ e-RFCM]o%ɩE0+4|I21Ɉu^)E'7?{C2Zc}߷tZܴ(0俏@ VfL_ PP vϦ9^)ls=f p[t;c챻 {m{kry?Zge.IwNU[ |, dW.h+31)$D# iM}{t=ƭr:&gdpuNspM\Oc~زߚRwe_ jsjӑ7q5jHjlNDh'Ն:Mwwn۟vNl mcVg9vZ mEbޝbe 嶲W/;ϻw #fħ1N^Av:;E5MzQJw'!\C>1a|D#37tįmtQB*aS/DY42g{`.Ui(g8b= i58%2``1)Qg7\]ݲN{;@꣎,$u}Л'tn i_>Kr@-G'{E;cpbˠ8aUC{[|{9E•;7'2ӜXQ:v8+:JGE-!ēW6e)mrK6`c PSɳ rnQz;~G\S!/b&{FLn6/uB_6=ՠf z|/DaK3Xz.e x aǎ?-17F,ðԺYkM* 픥3urR{i:PKy7$}&Z%mKN[]{@y}m,06~U:u~rr_3=p14XquW_|bޥP; Vk sRAo^,7n e t-Vv&rO%݋g۵ \;n0si@#ɼ=п|8#d: Z-$F)oW>X 6FaΉb;mdQiZy2bn@a#xyyZ_}x{8_*{g͋d%39iL>G 'L\ۜϞ'~Fܔ݀kĢ{G -ۚW:E=Tshr{8 ;CO\蠯M`$LAx Ng׭Qmjqi׸$)`%qnߙq`sU$1kt0=>/Sgr yYS1< +Ϣ=8_]Nq7?w!KsqB\]gOňa_sʺ' ɉW"pTθx]:/ۚNn^C֙zg?sh=<ȺzУnPr5l2D`zdI/y"<yyAB_{θ'a<ØJla41( 险5 !%3 13\Cc58-z%wJ(+EFcL+29hjE&( óPGR'0N׎ߣLDFZ_'L{fzJ#^!G{l&{h-~̯?iyE}>2ޢ"nS-L6 0i54sr12|~i[`D ^O5 9qS4 LȪ w!'N7rFs~l^V֧A߉xջɏV75E1_:d`W"~{׏0e4& NfG9qHl} u# n$7: dz۸YaPs)sÆmI)qMϤVKug@.N;oT$ Ms1~(>T=MGhA3ܑȶ3QyDQ{TꭩpYWd͚q$3?FMԳI:<ٖdI%16PRIHpLxu%=Af8h'0o!nQǠ閺|G׽Cq&$'%!5\GQ\l o離ZU#>t_E'\k_1n]? >F ;ZZQTZ{<נNlJ{OJIXa0ek?Nކ.Ij:~Rt?)IHTrAA'%Oɢ~>20"]Ȍt=O$ж=x/4UNè EE>C咏G↞Z3!gW{i'lqj Ճy ܰ:&IB/IK'S4-CzH5 +Ukgq1Kby 3A(/Sdt({ZK>FTkr Vߐ\._~&LP<aDa3U(~iϭ8&M=7I`IIMUJd? |m[mrp3ur1ҙDx7vRϣ@@eMEGew ?DZ Z I!1Б6J~ē] ݭ@jy~U-:{cvuo^~fs#ZeH<|Qvo9جn gFu򛦺8eufGjp\>yA!AP] %`)^Z}n{Q}jRF楌!1:%ĝ[%4^wL p{3I~Pka }a=_=ϠS׃5 HK殕bj)3uCj/}xh1Lb8ZF%`dKE5`d,ǀ KOq,Ѝd#)\+HaC;Q!n kr``7L8rpeV(K(h@Y{pgLw4%Vr|ʐϷI W7 .f x)g^lIv/~bi xs5< *odsaI}3}?s Xvݏ38 |lPH DBbԝD6$++E&bl,pQ|?'GaX^ܕ:n7>W"QtL\ "X_GcGɆ%_uaV]9Y7P3Qd` J/uC"0?>"!3DkT@wFM` R4"coY8QF}*bT: cOo6 O "9 $**=Mr#B9ݰl\S k>!6ׄ3!׽ |`kFl@+e85F7N2C&*ˁ-[1q=/Nǟ_S^3ƥ|~yA)s E+X_ݚ;`~("syaͷ} !Dݐ!Ff;-Њ^Spq^2D?Do |)!ɰ\^C-%Gڮ#XTd^9jjRsDe'g/'ܥR]_ $Q$)L1]{G}Rũ\ʳ1s%)\By۬> P0Oae`/Eز.TWpg*E vk뿽{ظX; |m-ąEY^Eƚ%?θMRBQ=?9|2gr𪴎iL1Ap&%!w-]"$:>M1L4&k:oL1Dem͒H4 ۽De\@pk 9)KicK"/BP:vƭzW@Ȑ&C%r[($ ۇ tx1vpiTBo2W Yt@n*0u 0g*%4er̻Qr@$ BmW]B>f0t(bU맀w.:Z$4Wš;5H jVCi 1hJ 1aD 9jP/E=Qy))Q9ȁ5dⅽ~ Cļ2a4!'Yuje=%#!`~Nsyg#8 ! %1*"(\ *!uS=@O*s73M<u yXi=GH2$7}B.9m/UAϚAE@/͹&o~Ò8.7 cB8YFrWV̞zK-XY&ߋ J I+i4 |? Y_z@/,3(ˤ>慐)y ~[mץ,i&+H+ѕ`ٝqaI;N-ZLV7`~-1yD$&Q>ӿ迋# tGfJ=}YGC"*mĭr!7Y6;Eb_ {%|?}H^Օ3g5f$fg7r$mec}y/ۃM& ž 2M!DW6 z|8kup6&ʖ{Ϝ~xV{(L'/6xٵ lKuI @ yһ`27֙ψ DyL!CXscJ'P(VaQ4T5D1^͉M>G!EҰˮNk;W)B C3.־ĕ f/ ΟbSOꇫsAO9d\l$gNAݙ>h!.xa NG6iޅ0G(,ObB0he\(ۺF!h lE)F>cGaAq&),j8i 4Ah @^ ǰHܷΜ~8CRZܶBA?wH`o&yAYVQ~PgG$#Y)X6Goۥ%4im"w/]4+G'Џl2s[֑6l8Ƈ&zGvk(F+[HfɜNᝧaș %$9d%.#,HZM9?)+ B3@rWbb>-ҧ.=$ˁ?2{Nnj!"upJe#eZEr`c/3wګsDJW4^\qbms~}{`y'c`qG{hp=5"~~ | 9\rPl+eV0Ty~m:G[q0߻3BR GWޏ~x7~4LK,񼸯}}nAطlahj$7̵%׀"u lɨfekmeJ3VoOo quز8zg)W9cwY@=~=zE^,p?`,R'pV1Y˅cVb4` CUQ(+"Fqaz7/I/rд|22a_k|;/k*qX>PO0qɈ*8L8a>{WqUK?\# E9"p7]o}o--\.BI' fJM,x\JA-L-|㴑Po#METb#l+(L+{W瀷ʈoX{djHuꞶ!IẻfP' ն_/.kbPIzI9߇(h0S$&gu}85d#=1)q%ƏzO,8@38 MKe(-*CQnaLn)[-NJR\kA?t-W9[醛H IQ[p5pݏR7d͑ϪAm$EBu [i͒\lMvxKn@DmN3Y3^ y)QRCbKFqײ(k*s_80,l;fKN8e7*MlCl3r9FܘFH +#d}J򲉗7g?yٜ+7܏x<9MNrm,#?6E#4y{w2Uz5ΈYLJY_\x=y)z;hO<n|N_psww>GF\ʰZO Y:Y!Q#|ز>dv{T) ,Ă$y@8{.5.Lb@2g`+XT:EƊaE)m͒⹚0* I%kȌPBpn>zS%#qoj*{.Qxx=+RPܿHYS݈Gi%UFtC, bXQ$cvإ놃>x#ْ4rﱓRj,Rc^HAD*{w&HK#j= H)1k̉CUQs=/M \%6R֔IC3QidI&jQjeq'Ϥ:1 F׉/ǎK:GrV@R|q)4HR-UbgL'ͧa;y{Ť辛dr:I|дK.')Is%eBKDRȴ1&1 ַ7/wnLkT(M6$nAXވ1 M#2P#lT*;)q(0N E֚%9lȿ6`4 :nkFt86AIC:1oiF&Ĉ? r3GY`S_j_r>6?c= mlE=jR~xVEG!r~lr'59)3p '5ΥXF5ZG^N3D]zt\$`N^`߯L'׾q,T^&cx7g`114aFg :*'uP!OGGmxRhsqOw|C(F$ 9y_\ , 2i#Quc58"_ϵWD:{H9i_ׯ'|>qX; rdťm11h񠠦`=v~Jb fS`bͤ{#Pb Eu8$.J,6<1Z*h} gtَ,y^3Ҷjtck2G#ļ( r3tq)B>|L2iH#O"M%CZHPc3Ӧu "Q"iHj}9̘+8(4{T`iXV,F#CD܏pOQdu0tÍFHWSB΁\eV2HC4IL!)QbŸE O!l%KCI.r42}Ti0ܦ>FӞUmj1I BDDb^Ɲ@Qbi%JAFV[)daIKX!K6OZ42&11}ӜiCHsHKZ1Sp'z&I'Ɯ>OCd(8ILLZBa4D8YiA% [AFV̼aGh MbVQ"mua׆h$3I BUFeJdNa/[|QZX ,id\+Jz>,p 7J`8'n20Nex-!԰eč2&$ S%}5V,$n,H} 7uj+V9ILjj2I/Rc<%va)O'gC.Z8Ս%a] $p ,xǻb;VidLbRPC0\&d&hR`I&0$EMwVfQÝ{V7PidLbRi%%j:]&ɽL` C%YFh L. {Ia4N#c&[!T2IM#B)$5jrQ=ruبA.wL`P7i6F#@!"& &(f,2i?Y76,H&1XFoLҊԆ P IQ`IeCnU{?nԹőG^~t_h$Fb 6S!T?2I*RSx%+1h7'3rоȒ}]s~3>Hp 7vnonoZ%1aؠz}Iiɞe[%7˯KR[A7c/q ڝ/dgTݤ@sF a B.SD2سhd(Z+Չ uc^ҍg ;ֿZ^kÒ:ؘI #BIslgᕈiGE%%,ry^@b`s6,)H&1l^BJܤ]ƞeFP%y96MPoU7;_ 7vn1ܮunu@RLbGj^쒘]ƞeFXJ㶸9 Er_l1QX^ay<&+-g+qvn1LFp[idLb!5`{v/:3 qF؆^K'GمKB[Yz?dAo7#p>[ G\4*o?n`cN#c0qǃr2queF1FrQTg^\A*nQa\sy?Lb0Q _Y`3)`q49o*s0hE<q9@idX{ dO P8~xBo 7Q ScvgkR3ava[]9cI3' ruAXR=n (+HG CwKrq(vVqho8v?e/VjDkO3ig5wSBY2)sa? Bb:j:::iÖAյ \u8Xn{++@q#:CLD`T*F1~0h']3]3?zuw=,ˀ'{z[oį9^'=\74-;7/uFZV^qRo7/w K?ؿ;5@/peX0q08b'(^q `4LCu Q^ iUu21hлM6sDK#QXy0 #0}Quh%u28,?&ȉW(t<6dFڿ(pBSR!EY**ӛ anC-|mߩ*\!C!]%{ [৴m+MJH;j;zmm`R,$~ G2v'0+\#5xP)L`!t1"rBr9ѪyL`>\W92BjuJ-k Ô~* Ql`]8hP9ibfq#Ff"Ւb1$/sU @?C#8>dd<\(,Ft:kټ.ĀW#h,|r(bb!yw12"quюPFlƤpԅ6>{iau<˹U:#0Oltj*lŀZ~EϾ&`^H|̉Y}L4R^hFڐ~.}?swFBqƬWn"d~<+rj5Ĵ³wŁ^uF Cz>))}!0p H&ψt7k+!0?ywFt6#p$}0"ήe1QdJ'ppTN FVH2pJ'7^?QF1 %crT။I1.?VF:e?c߾>ƭdV1i3Ltuu_ B~ãVyMݲs#1J4`a]U'.8;Ow_[rs}#6wdp~F2Q&1 cPs[^pi`݋{3=t/1 U2PX›; ܚl1RG:kvײ}jzA6)FȬY>4+d .H;z@bvI50x,ik4)o{]gYNmabga<0OtY FX(H3D9MJB`%DH-25k Fa|3@b8lu NTcDQEA)AX^ mm+=``0DV#2LZ H(t2`0 *. `0 F$`0 `0a0 `0 &1 `0 $`0 `0a0 `0 &1 `0 $`0 `0a0 `0 &1 `0 $`0 `0a0 `0 &1 `0 $`0 `0a0 `0 &1 `0 $`0 `$`0 `01Z Pg`0 `0mZd `0 #U``0 `0RW6 ~< `0 #Fݒ*?3`0 #Nt2`0 *0a0 `0Lb `0 I `0 `0a0 `0Lb `0 I `0 `0a0 `0Lb `0 I `0 `0a0 `0+0 + $_w# yydUeHQ{Mܡ&l|"=+e 9or \Nw5C˽ЂuZK^Χ?o[N^|gf UF'ntm4Z9sT*+934w`0N`_.L7jp$ޢFu6:]^#8˸ϝ$oAn~o{rnzmְ~ 2@qxne4w`0dLbIb a.$f/{  >z/ѩ"MОSas ynQuss!o9X+a.5=ךi( ~;Nf0Lb F\ߍQ9^fSI qcދpNVaÝW~J^ˠG253L\a8q7``0RHbg\8q)E9[\$L0>.^?(H5ʶ6Yϔ\<:'kΐju>I(fw`051 -?6du6Ǫ_&D[aBh>s͇,3 ccfPqD7t<#yt/yns=0#wjl2kqkuX[#.Q4N I 0ӜEew-m`x!u g8\Zw#WMZB+&;o sɵ{e~G<[%nΓ#<XH4`0̂0cv.?͎IIrΉ Z_.?ދvLJwGoeܟGugxzCZQ4o>pÅ cV1qG^,`c%yoIVyB9,ddȳ)_])\^ פ^Zu %Tn6:jYѮYJj4I`0̂#1 F'0i"?`0IGb69U< ^f& `0.g0 j%04`<`a0 jʝ.ê]Qb0 `0Z讀PLca0 &1 `$  }51 `0 I `0 `0a0 `0 &1 `0 I `0 `0a0 `0 &1 `0 I `0 `0a0 `0 &1 `0 I `0 `0a0 `0 &1 `0 I `0 `0a0 `0 &1 `0 I `0 `0a0 `0 &1 `0 I `0 `0a0 `0 &1 `0 I `0 `0a0 `0 &1 `0 I `0 `0a0 `0 &1 `0 I `0 `0a0 `0 &1 `0 I `0 `0a0 `0 &1 `0 I `0 `0a0 `0 &1 `0 I `0 `0a0 `0 &1 `0 I `0 `0a0 `0 &1 `0 I `0 `0a0 `0 &1 `0 I `0 `0a0 `0 &1 `0 I `0 `0a0 `0 &1 `0 I `0 `$Lu䵯hdT0 `0Jb&G i6%~4 `0`0 ζhopI JrRe0g[~wŤ%qs0 `P#{J50a0X29&7@yw<` X``07pĬw\b`0V;2`0 ``0 `0Lb `0 I `0 H`0 hd!=%>eq&1 `0 F([+dHRI `0 Nd ZkbI<٫ި$5C&1 `0 #TCDa뱾r-}޵_8{B >3a0 `0҅ %0]ZO݆f5r Lcze$:3`)J/d `0 FB`v`,fkE`(6`x⑛qqtj$`0 `0d?06Ջe?' 2P{DLI `0 0Uȏ.pTי!M!d!@ےe+R vN BnĐ!cؚMY 37 n0#E$TL#,y,ɯ n0v#h=iݾtn߾?[OU->99xN? >Dԋ8I(b!B!Z)QjTxvwe#[*B!B^DƳx} *z!xFC!BI &edJB!B.,Y1So!B!8 B!B0/Ot%B!Bksgr|+?"B!.~KztwH&`)b!B!zmhδLAxzUldO,¢O`D F˰, r!=|:?dz oCʹx8]:ԏVB!dzĉu2|1h/G \gD"ƋBqr,)LR!gL%xNt p/?E'Y"2{!,!BN ^DvG JO[ǦWdӀR)Ue) P0T7N,<1fZA{؂!  aS#=rB! ~u1߆eb*/V`2-3E ~L1 C˱<(L Fl zpliv??Mͻ lF!gb,<Bx`;ΕX: DVe\9EqDfeIqOb%*B!X ٗ г{{⭾FuH P:,+pm326/ٮ15@s'Kt1=g=@ !0 K~݊րKt$N8<CzrۂDaxY}]mۊI}%*j<5DO, _=Uxy2 t:&B1bY<ba(@_Fl vu@Q:Q%DT6'^+'b@o",泃8"*Pqũ D*&!`Ćwd#{H͖bsxKU3/t羆NfD3#u3밮<:a]y3jB!Ħbzl)؊GzgcjpZXm{rB!(bLq*ђXD3F3Lf4E E\L\s rl6d#{b}R2, =tWfс^N7ЗIpL230B!"4!,L1:ss8nC[y7 F`D F˱<$)O̞ "PMt]3,}!B9~̲L}=Cv+NoL4dkwt[ U}cȽ>dk0yB!A8뙁'pH9&q@9st9p+>֩gN" Ыd])9=!B2awHπ%T$[ov 4 ߌ"t"R3ۯƙ9MU)?3"ŋ;yZw@!psuB!f#Xő~8ch^Y[Y&G2RĤ<`,wyi-FP&GȇX$v畉eHt\YF~$!B2m0-0]A;)VFnZq43cpɫ$ VyӠbPA&lcrĈKҦPN+B!1 <­$/AG?4~ ۵E"rAK$|Mlf|͝ᾱx׎`d`1J6hP~D)h]"bB(b, B|]$Ϻ!\a^٘}n}<e)~CPJP8]W:XuGqI\B' )oeꆙӨn|_Xşᾱ\ϗaY(1M.7.$zBntGG#7p˟ә:ԋ\ȵ084*S ba!<EX}E.P}1{ov8]K$E8Z;_yow;}Wp%G*'-e?t4j:L,qmSH&$>AyXVDV2n1"42F`Xj#D6l![Sy:yo]#"yH57G.zR W@&h4MlTrOh9j/h."$U# lö^-//X:y)JmA]~9c W:~Ip4;mr/ ߋ{GwK$Ucr08(D|x,bEĉt0+Ʋ=qVA4H^cH"^t9-ى%!ah~=w( cD Ote\yܻnr r~Gy7ZX}%U!')ߢ*T}:1S\{b#6 "jFsYG!OF88׽RHXUrݏP6O%x>>#]j> F!(>e|y <i !j$!j|Rle-֞_ WeEVɅx_[MсS8s# <>jU 33`H,2, mVA)Уˍcܵ CZF@s?O|EP%Tԍ|^iJfm3Y%zԟO-*wO =jc ֬:z̙"[~Awc¯J02Ʒhײ CnG P0*fPeGqd-֞W+B%j|@>c@u!x 2c#MRi߄Ljf a[o Vl؊/ᥢ&4yeq,sb܀ ={7i_P5Cy`;{$Q#U2Fē翇 Le*{]Ra .A&Z38ߋBp:wW -{P|v܎V4J zQ>stot(x>ه}=[ӌfov`!GD(ލ'Z Eě;Б rͬ,C:{9b_ a'X.3#,F/%[SA1əe &a>J{Gc*i0[,KktagdX'K$x^z#`D]UD0,KȞk9+rϟyY#|8z<+1FDxzaK1C(ĤFl .|gik<ȓR>y >Ab61C35Z%*ų]~>u+ZG,0`/?ա:ЊY}C|"^<zNPIc"[ x*`,lFAХX:.Y_%d$CM/gqu=y7:q׫x55h>WqUSۈ" b/ Dv:rgp.GlGҮT؉%byWgND0([cf!H$baY<58yy<>U1"uXWE[œe("_vbgI:$5 O~L4XAba( 8:ƶը=g~"%xu鹤E(`6,:]Vl~1"bsxKMqwPCџvwzs2#R4üg X*r;a!``I5{- NFuh6@zRKtT 11xG>ćm;&_BqD8yL8P#5{=| ()yϟD~WƊ;6J®ry=8NtsD4^D2bh-Eԛ8ޅ]j꘤š m<;Сy(zԧ ZN6'b&(251~D^xB .aky6`CY}]e[u@h~7qS@؋2scʈp83UlbzK[u@v?טTú=@ϡ1e=qW=M78"^,yxA(;":xt@I:a]y=3S4 f(K@{㮣8Zk[EաΛK.rKԄ ǸE2PڳJA];d֕_mض*a80Fďzljzo) 7N<]jbdUꓥXd+"A<߲٬dA;W|cŪ% dLLQδ@Jh p*4"9%`q=kKrӂD'L؏6yQh^93 ʿǿ?/{h)%/"x<rI':Б;KP]E݋{78Z2š~ dFqI)WbcI40_܎!@D!:aT%v#%V3HJ ,rEL FM.F͓$v-bI?7vrqNL ükoYg%r m)hhy?wbgV!s). gaÏHZ&H ][x`%ce(݈8.-K bojeS~#r{;Y"gn`d`C/Im\/k8]֢جyF3" _-j5ghMѬ7K K c]Ĥ_џ/F7csLPXP{THIT:k))@J"FsGt?O9}˿T ȹ֟an1]fq;^/3x+FYr1/`ZtT7ίCWdyRg8m)ѠxyxeXz OS4̔4t/ew*D@d?W:Ӂ?/b1@C9ñzei@Z,d٠cfgfh{ dGUp((0 Ln?kbM㍖+OPN46Qpbf&GOMAD[Vތ)yHQ_[`ә=RG wӆ6l6,`)JCjfEv8Zv`FN+ZǸ9k"-A ~$N{Dw ȓnA]ˬAf(blVIb& bF<y/h}/Ye!qVBi| = pX  VpXz4J"JzxaBk3ȱ~O i{̀$dnBҾX} UgkZ@21Stދ5K04N W50X$b? L Q懿(`^)fNFy*Pށù rIV7 g1zv+~wAyR`{m[RoA򁠅XٷKQ"?bY>KGbh::. (gB"6c*T* el05\˩EmI<֡ΫUr2Me Kw2!(Tӑ04im'/V< )[7!Gmh/ڋPW1L'0m"B鸇-I?]E#m )Te te3 !B!N!Bg41E !B`Z2L%SEbarl ?;?%Ӷ'G e& !B!b:*sc?!B!YPB!B(b!B!(mARB!BTDLq !B!JB!BC!B!F!_N B!B!B(b!B!"B!B(b!B!1B!BC!B!1B!B!B!B!B!BE !B!PB!BE !B!"h ~'B!LE8f%XC {ؘbV!Bl_(b,'0HwS0lB/ L0> .klj6HL󊾞BQ9.9= bg/Q!V1wkbgӭ2Pd @tYeFIz|_~V1QxO>F c8Wƕ"zay uƢ SvJ,0 rVgvx@e132g(b2B$jX Rİ+\İ  FcKa1@$f TE )1B"b}Z0}"Ɓ&Ι)` 6 O1)`R1Ī>C!c U**"Nu|3ش"bR12Ċ>UC!cA,&^"^eS3@0@$ lv"bN@x6ZD:rm gزQX/`1JJJvrF]#D L _m[N  ;\+=l1Nq`y EL"'-2^Ĩ &AƬ #D 4%bqJ?}l1v8N`oEMEL Ft;Ρ%`1L+)gF㔎8 `XdG1 @̓R!dSNd&"F.dU o.籶AnMҬ168ȆX//%_i1K(;OM2*bDGoe+ep7HՍF{?ɐr'f+On>xbS(hLj=,oK☢r] Y"&0L^s3J4k,#:.}// ELfwį " xKzP O&Қ∙wN@̚J?mBG,M?'9$p(rb "F28N8)1s} Dנ{D܃@rq nBA!vDFt)g8 iBD7r1#Fǥػ+g6cKm)F{lx\h>I0m!' 1M3#F%|&xRdIDATYv8<.obrz7 %ӰwKB! O$&X1&RԘ7+\gAo}#/#=/\>(_ij30,`(*|5M$QKCdx)6P&iGHȴ1xV-s6VK2"rDgM]*츌8NiV{|@&gev7bZ;ϼ2G 12&gHω ItӧM&3>{͂P8~d؏H6w-<3ވ-DEx7K| _fҏ;Ħ>>n=hٟ_crqŋ_>k)9)_YbD:X7! f1E]NW&Dr:( ,p R[-t3]S E E S)UX1#mP'fB'a,'U61AJ1CM(b4g!5XoX@u}>tႪz]+vtvuaC}}f;o7:שQ=1צzL)P{]Oo/^ػ7|mu5jkSnMy]k{;vt|R=~:-K:-S^vKuIH{gV߬FwvzܬFwvKBCOooH3:-ܸy3:5~!u߿ySuCCc]WZS^gG)j;֥$D"Nui~]B!BŊnmu"mEyPw :eYu9ujB! j`Ѕ Zufײ^uK}ӓ뽸1q={1r{$o2rQ9fnsc[aN g(ڍ >L\L 33ſ3u\٤=1 F]E !Qv+LDk wV.qdިGh*pMǷ~BՆ7 u@>{T±~uRP} o3cCXmۦ\#ۖ@v%Z" [/#5;>-7v.Mݷ_Od@O9YL0}0^Mceg621 oԣ@ߪ )ؐo<_~C.-Enn\UŒJ;ת!{f7=h7-O6zZm(-5g}\d T bh/;MOhjϚG^oe@߅-Y&zӶt[N6tB;;33>Ӫ#gdA1띾>G:u6dLi7m* vX]b{;i7-]Y=T}f[fee3`}1c!^|2z;u$ ~.hv D})+BMMm0Q߭-I: b͙v[sm>l3q [Ϋ]E1VUv %Gh>J[/Ž&S}kU2hqG;t=z#rgGnΫ]G,/I/(NIשx]Z+**bh~20 `]K?7JsPrW',[ץZhM2nSEn;hC8z9bt7L !p4?];j>z߲@ҙ 8e?u y_,U_M)/.ȾD>a0#Ɠ44oY ˈ7P\om<#zа!x_ n}$z]|;i˔Sz#;lEn^WzhKhK @TƷ~~GGlWze޺E9nJqp4*;`C1Q8@%";ܡ i7g0V.bf:>\]ʖ0D^+{ LMO}=XwD>"d ;iyoҔf =GqnhnKoptЗl:'w|<&94w7oɮH^ֲǵ}PCQ,s/QpYnfT]5vنSei7gK28~p%4H/Ѱ!k# 0aO}{c Ԭ/*bYU4lz?2#fO9{Ϋ]Gq, @u##˔Gwei0:crec7vؠ>6=bl,#6}6mkD_Q44i,M&`r:-څ: ) B N*yz-/Ed$ͻ3n 0;[ߜx}Z쨗Xi;ȎI}vB}f+ "o{«f}K0}#4lz(:Ŭ41 G, r fqy˘, q|V$8OQ.O~Mr]m"ܟ@$;ZkDp s h7ڍvsfRkGlQ imDY䁾<,"Зg%S1^| -.Fӏ=ش3KcxdSK: c@vԙܲ)ͤ8YS;@G:-[kO]$/ߩ_Bӊ;:)LΌ/+~L*Fdsh:O?`ݬ[Oo/nܼ99ژ`bsrΡx)I8ꭇ5P4IkG6ԫl3hBߜXX\(߳}xP>zg{I}QIaC(.=ߋ,oY|-FæTƿ}~?OxΈ1]Ĩi ףNxCZ-[+kW- ڍvUp)~o*b4rz1`@_Nz]an`ӥnQniM;l׽}ӵ[ JƴMmʄvxl#նcELݢl?rѴ9˥w']9*ܲG.՞msSw,rOnzf)}GjA$,/Oo [}]k=b>ܨcGĴM-|l;Ie3gD&pe"X8X1iv*(7[LG[(k>]ƜR:o hjBr~9_RNbv{aޘsrSt[s_ vdfFhz}-iQ[CO͙v3*П81;:vE [ag_l'bE+3 o V/7|cݢZ]tvuaC}diJ-:21֋+R XPa`vӯnZD ͨr~96,7SWœ_^9mvR\T/NJf2nvٙj7E#\⮬-U|p;bIl!bp|z9;wzюP=^t^R"BӉ1w.uTy^.DkN$)@ NQnZE -[Wy>3,jG#DR;=}."Af$j7#4ݕՃ/.47u>ĬOEY"K^d1zve;#;NB('1G. bpNpv(Ɉ'kݜLOo/nܼ ʞmz086cC1-ʅgn]`7BnٙL\KoK\|,F,+([msfPsKWB+5髆.\`۴M,ဎ#DZqcr+E3IE#}ew32Qȑߎukwiu2D3R6 Q1qI/[£S{"Hu###xoR|@U9,;zPKfG@~]mή9B(bq8e,r;}}紶kմuamuu3Zm ή6P^guIKʹ^'O_XP*EZۣWTTή.ujr?L]m*ʺ$!"FyfU^gW焺#ӕT!"L؟u#FG^'CC1׉kSb[QQ/g]N~"1ʛ܎7::>'%!Bq!ĎlM&P# ӹVTTN> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall currentdict end definefont pop /MFshow { { dup 5 get 3 ge { 5 get 3 eq {gsave} {grestore} ifelse } {dup dup 0 get findfont exch 1 get scalefont setfont [ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6 get exch 4 get {Gshow} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq {dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5 get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop pop aload pop M} ifelse }ifelse }ifelse } ifelse } forall} def /Gswidth {dup type /stringtype eq {stringwidth} {pop (n) stringwidth} ifelse} def /MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse } {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont 6 get Gswidth pop add} {pop} ifelse} ifelse} forall} def /MLshow { currentpoint stroke M 0 exch R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MRshow { currentpoint stroke M exch dup MFwidth neg 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MCshow { currentpoint stroke M exch dup MFwidth -2 div 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /XYsave { [( ) 1 2 true false 3 ()] } bind def /XYrestore { [( ) 1 2 true false 4 ()] } bind def Level1 SuppressPDFMark or {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (starpu_chol_model_11.type.eps) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 4) /Author (samy) % /Producer (gnuplot) % /Keywords () /CreationDate (Fri Nov 8 14:30:51 2013) /DOCINFO pdfmark end } ifelse end %%EndProlog %%Page: 1 1 gnudict begin gsave doclip 50 50 translate 0.050 0.050 scale 0 setgray newpath (Helvetica) findfont 140 scalefont setfont BackgroundColor 0 lt 3 1 roll 0 lt exch 0 lt or or not {BackgroundColor C 1.000 0 0 7200.00 5040.00 BoxColFill} if 1.000 UL LTb LCb setrgbcolor 854 448 M 63 0 V 6030 0 R -63 0 V stroke 770 448 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.001)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 854 762 M 31 0 V 6062 0 R -31 0 V 854 946 M 31 0 V 6062 0 R -31 0 V 854 1076 M 31 0 V 6062 0 R -31 0 V 854 1177 M 31 0 V 6062 0 R -31 0 V 854 1259 M 31 0 V 6062 0 R -31 0 V 854 1329 M 31 0 V 6062 0 R -31 0 V 854 1390 M 31 0 V 6062 0 R -31 0 V 854 1443 M 31 0 V 6062 0 R -31 0 V 854 1491 M 63 0 V 6030 0 R -63 0 V stroke 770 1491 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.01)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 854 1805 M 31 0 V 6062 0 R -31 0 V 854 1988 M 31 0 V 6062 0 R -31 0 V 854 2119 M 31 0 V 6062 0 R -31 0 V 854 2220 M 31 0 V 6062 0 R -31 0 V 854 2302 M 31 0 V 6062 0 R -31 0 V 854 2372 M 31 0 V 6062 0 R -31 0 V 854 2432 M 31 0 V 6062 0 R -31 0 V 854 2486 M 31 0 V 6062 0 R -31 0 V 854 2534 M 63 0 V 6030 0 R -63 0 V stroke 770 2534 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.1)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 854 2847 M 31 0 V 6062 0 R -31 0 V 854 3031 M 31 0 V 6062 0 R -31 0 V 854 3161 M 31 0 V 6062 0 R -31 0 V 854 3262 M 31 0 V 6062 0 R -31 0 V 854 3345 M 31 0 V 6062 0 R -31 0 V 854 3415 M 31 0 V 6062 0 R -31 0 V 854 3475 M 31 0 V 6062 0 R -31 0 V 854 3529 M 31 0 V 6062 0 R -31 0 V 854 3576 M 63 0 V 6030 0 R -63 0 V stroke 770 3576 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 854 3890 M 31 0 V 6062 0 R -31 0 V 854 4074 M 31 0 V 6062 0 R -31 0 V 854 4204 M 31 0 V 6062 0 R -31 0 V 854 4305 M 31 0 V 6062 0 R -31 0 V 854 4388 M 31 0 V 6062 0 R -31 0 V 854 4457 M 31 0 V 6062 0 R -31 0 V 854 4518 M 31 0 V 6062 0 R -31 0 V 854 4571 M 31 0 V 6062 0 R -31 0 V 854 4619 M 63 0 V 6030 0 R -63 0 V stroke 770 4619 M [ [(Helvetica) 140.0 0.0 true true 0 ( 10)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 854 448 M 0 63 V 0 4108 R 0 -63 V stroke 854 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1058 448 M 0 31 V 0 4140 R 0 -31 V 1327 448 M 0 31 V 0 4140 R 0 -31 V 1465 448 M 0 31 V 0 4140 R 0 -31 V 1531 448 M 0 63 V 0 4108 R 0 -63 V stroke 1531 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 10)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1735 448 M 0 31 V 0 4140 R 0 -31 V 2004 448 M 0 31 V 0 4140 R 0 -31 V 2142 448 M 0 31 V 0 4140 R 0 -31 V 2208 448 M 0 63 V 0 4108 R 0 -63 V stroke 2208 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 100)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 2412 448 M 0 31 V 0 4140 R 0 -31 V 2681 448 M 0 31 V 0 4140 R 0 -31 V 2819 448 M 0 31 V 0 4140 R 0 -31 V 2885 448 M 0 63 V 0 4108 R 0 -63 V stroke 2885 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1000)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 3089 448 M 0 31 V 0 4140 R 0 -31 V 3358 448 M 0 31 V 0 4140 R 0 -31 V 3496 448 M 0 31 V 0 4140 R 0 -31 V 3562 448 M 0 63 V 0 4108 R 0 -63 V stroke 3562 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 10000)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 3766 448 M 0 31 V 0 4140 R 0 -31 V 4035 448 M 0 31 V 0 4140 R 0 -31 V 4173 448 M 0 31 V 0 4140 R 0 -31 V 4239 448 M 0 63 V 0 4108 R 0 -63 V stroke 4239 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 100000)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 4443 448 M 0 31 V 0 4140 R 0 -31 V 4712 448 M 0 31 V 0 4140 R 0 -31 V 4850 448 M 0 31 V 0 4140 R 0 -31 V 4916 448 M 0 63 V 0 4108 R 0 -63 V stroke 4916 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1e+06)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 5120 448 M 0 31 V 0 4140 R 0 -31 V 5389 448 M 0 31 V 0 4140 R 0 -31 V 5527 448 M 0 31 V 0 4140 R 0 -31 V 5593 448 M 0 63 V 0 4108 R 0 -63 V stroke 5593 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1e+07)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 5797 448 M 0 31 V 0 4140 R 0 -31 V 6066 448 M 0 31 V 0 4140 R 0 -31 V 6204 448 M 0 31 V 0 4140 R 0 -31 V 6270 448 M 0 63 V 0 4108 R 0 -63 V stroke 6270 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1e+08)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 6474 448 M 0 31 V 0 4140 R 0 -31 V 6743 448 M 0 31 V 0 4140 R 0 -31 V 6881 448 M 0 31 V 0 4140 R 0 -31 V 6947 448 M 0 63 V 0 4108 R 0 -63 V stroke 6947 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1e+09)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 854 4619 N 854 448 L 6093 0 V 0 4171 V -6093 0 V Z stroke LCb setrgbcolor 112 2533 M currentpoint gsave translate -270 rotate 0 0 moveto [ [(Helvetica) 140.0 0.0 true true 0 (GFlops)] ] -46.7 MCshow grestore LTb LCb setrgbcolor 3900 98 M [ [(Helvetica) 140.0 0.0 true true 0 (Total data size)] ] -46.7 MCshow LTb 3900 4829 M [ [(Helvetica) 140.0 0.0 true true 0 (Model for codelet chol_model_11.type)] ] -46.7 MCshow 1.000 UP 1.000 UL LTb LCb setrgbcolor % Begin plot #1 1.000 UP 1.000 UL LT0 LC0 setrgbcolor LCb setrgbcolor 3038 4486 M [ [(Helvetica) 140.0 0.0 true true 0 (Average cpu0_ncore0_impl0)] ] -46.7 MRshow LT0 3122 4486 M 399 0 V -399 31 R 0 -62 V 399 62 R 0 -62 V 1262 478 M 407 565 V 408 696 V 407 682 V 408 603 V 408 500 V 407 297 V 408 331 V 407 59 V 408 -98 V 408 -106 V 1262 496 M 0 -37 V -31 37 R 62 0 V -62 -37 R 62 0 V 376 605 R 0 -42 V -31 42 R 62 0 V -62 -42 R 62 0 V 377 734 R 0 -35 V -31 35 R 62 0 V -62 -35 R 62 0 V 376 716 R 0 -32 V -31 32 R 62 0 V -62 -32 R 62 0 V 377 633 R 0 -29 V -31 29 R 62 0 V -62 -29 R 62 0 V 377 534 R 0 -39 V -31 39 R 62 0 V -62 -39 R 62 0 V 376 332 R 0 -30 V -31 30 R 62 0 V -62 -30 R 62 0 V 377 364 R 0 -37 V -31 37 R 62 0 V -62 -37 R 62 0 V 376 92 R 0 -29 V -31 29 R 62 0 V -62 -29 R 62 0 V 377 -67 R 0 -33 V -31 33 R 62 0 V -62 -33 R 62 0 V 377 -68 R 0 -43 V -31 43 R 62 0 V -62 -43 R 62 0 V 1262 478 Pls 1669 1043 Pls 2077 1739 Pls 2484 2421 Pls 2892 3024 Pls 3300 3524 Pls 3707 3821 Pls 4115 4152 Pls 4522 4211 Pls 4930 4113 Pls 5338 4007 Pls 3321 4486 Pls % End plot #1 1.000 UL LTb LCb setrgbcolor 854 4619 N 854 448 L 6093 0 V 0 4171 V -6093 0 V Z stroke 1.000 UP 1.000 UL LTb LCb setrgbcolor stroke grestore end showpage %%Trailer %%DocumentFonts: Helvetica starpu-1.2.3+dfsg/doc/doxygen/chapters/images/starpu_chol_model_11_type.pdf000066400000000000000000000176441320135501600270220ustar00rootroot00000000000000%PDF-1.4 %쏢 5 0 obj <> stream xKo7+ 1|WwÐ׎)e'ACvU\Y@ܞcϛf?}{M>~9 !9CeҾ9=mE]n?_ʖtm7[wl؜M e=|Ff/W2_lBpCG7kD!xޣ/#G4 s.= #^$hשBA JM*5) UDUKPPS ԤhJaw|nE8Wvg8/j2l15e UdR0/{5q}k`Ҷ8.& .D+$DI BEB!].& /D+$Dʣ.D,XRt_i/N:}Z%a난ݫ!+dq%!'6HuAsF\H$ »,0p@)*/U?\!+ 9IA ҟHgBpA2K*egw{JNzރУ aqgX-σ17GXB7.& q} >\z'bG[[7ew7\.\ %q@xW}Use8ŦM瞬V9+z+>50 ɗhsr]eRhWLi& ۤT@P)N mjP ,/(/uGlsЪؽʠ1d(0DAD&(!Mb,)ִV̬Xg-M-(3B)i, IR(RI%BBh(' 3Zg3*0AWX ?eh* @PJ De'MMIHԅimjܔwix!wDxs> 5$K$  Y*' sUٜ%mvBJ M AFOTB De 1 ,9m`s,M+(59%U(R9O|$R~#I2<'RgJ-s:|:xh#@ر]@FGL$iskfx؅BFF*Rl* [ርO܌A${a|+'~s@&H9;?/zGy>/_oNƚhB+=f{˧O=E%{ut}{خ{umoݿseE(,؟:=xڮ4o{8noux7V0mLz'߬]Xr+#UM0o5ϕ?cdց%&'hQi_s&hr]Swbj?odi.1ɍ$ByH w ~Qlէmg34"bY0'iӄ ;p7Gǜ([$YGvsXZ)I[iLyX:JH8=+8]ԅ\鏣 ?oꇊNc /Qd~KU-a,>7?;wqMYRέ(]OQ^ۏendstream endobj 6 0 obj 1931 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 10 0 obj <> endobj 11 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 12 0 obj <>stream xUU TSW}ϐWP|I"@P,(*Bj(oűjpE[GZj"*R:"VQQ+-R01:snX3/8ZYwryg>42izpZSg9w؃cᱢﰗRqE"R5f<ܠMJDegf镞LnF<8c q0 &LVl5maд 쪩WLb^&eg -\e(S!h?D 7%ɈgK42 7Gu\CB lKV!;vD:69zg׶=M#YVY>@3eީ̝L^BVe^F6XD8KTPq^uVa*VVUԣRR>_sPn'6`g2;Ж0V@:Kӊ3(B'F?SrnQ\j?7V3Te`fwaO;c?SQ%@ţyz&{G)+'=٣~q`=P>љÅf)PFqx[{/!8M8l(Ѕ3{R|t1:!|;e֡y,4'u} &kW 0F}ԲhΩ/jW؊~W݈5VmCʷ Q+O|k8prT~P*)޹~{)bSW*fD˺2SDÜeXNwrH[iD{Q K"$+Nh jF;JPĆʒeW۸ws-;ٹܐ ;M=8}~_3ƱBbRC;8dϢm2=q'`Z#.Em•kmK+j[㮼\^H!OpTc";]]2{\73`vL^na=kB 13r?wo`=rzYӕ-UGIۛ3b[d'l6(GX DD13\.~ h4b:(ACүb WDŤ KP_A.pYo$Ϟ8oծMLp>isR) (A_?V`HOi3 5(HT~$,qV*kaa87RM7+sۍ=6*D >stream Fri -No-v T 8: 1:4:30::1 Fri -No-v T 8: 1:4:30::1 gnuplot 4.6 patchlevel 4 starpu_chol_model_11.type.epssamygnuplot plot endstream endobj 2 0 obj <>endobj xref 0 14 0000000000 65535 f 0000002246 00000 n 0000007433 00000 n 0000002187 00000 n 0000002036 00000 n 0000000015 00000 n 0000002016 00000 n 0000002311 00000 n 0000002412 00000 n 0000002817 00000 n 0000002352 00000 n 0000002382 00000 n 0000003154 00000 n 0000005839 00000 n trailer << /Size 14 /Root 1 0 R /Info 2 0 R /ID [<0E024CFD9531401022D4D5BF29AE3A76><0E024CFD9531401022D4D5BF29AE3A76>] >> startxref 7667 %%EOF starpu-1.2.3+dfsg/doc/doxygen/chapters/images/starpu_chol_model_11_type.png000066400000000000000000000133571320135501600270320ustar00rootroot00000000000000PNG  IHDR,2PLTE@Ai @0`@ԥ**@333MMMfff22U݂d"".Wp͇PErz挽k ܠ ݠݐP@Uk/@@``@@`pͷ|@ ___???64>I~:k_ceXhޯzCElZϘfueug~y ؿl8 |磿-,i4Xd9 ">-gL^R[XU5uJeH6Ȫ ZX474>~e$l.[&|3/mg> -3/K;-,n4>~8yL4_Z ȯ ;{^͖Χ#;haܲ\i< hb}&`u /M_Y4=Jpq 7~ hap x2"d>﫳fMAzL;JnPVC3R {*`3 i_@x2"Ih|j'Qp>j+yM^S-lc#|7;<0cAȻ0ML%p)@.!&\ B}/KA@7G#_cE뉙h⶯q2;nqh*֞{`(C~ce3X=uE7]~^_t{VfI\4^,̅1UϨ^%lE=T8a>|;ie_0q"|[ #գѬp靌ʢZk&|d*jO K&'LQIe6DhO}AEgiYIXW_N?T:^E{7Fj/o7Lv4ܣh}K]|]egA^pQ uG rruz;$3ivǢلnG=ַlvh\rAϘdv[M]?7F2&671?s0M[6Z?6ʲњIf5Vc> 8~t]3yhڕ=?[.d~UC'7jW=Fk׏MLzcBfG\v^8S~e߯9,ۗ0ѷ<4:p|y z+Ay,'ٻh8C黹!Q9*T &z7F2dëSߣ[N䪭]tn;qP=Vu7h6XٗV/Nτ2tWOxQ hOS6{.ʛ84փnM7pLmno.l> Q)J«Q)J«Q)J#:eW%PP*y2>7P*yh0je7yCJP)J ̻c"vP*yhg*WCcIX$:^%c OPP*yP:|QSx<`TJUΏ*W#43mI^B|&TNUCOdT)J!qfGRx<j«o:hMU^%`uAgZ*y_2ORx<ƃ%:W#ALe GBi NUB7«gSx<|td gLU ^%<|ѢRxü~JeWנRx<-*W?]P)J>c1Rx<#r *W9*᩠Rx<<}cT s^%0Rx<{sT [oJUp ~+^%*WJUp T #o «D*y8Q)Jo«{o/Vo+ i>G@; @reÿC!1] U~9| c9ޘ}mdqe…NSv<NRx<*WkDnB *9;NU;JU;JU ;JU كqq«qQ)J05*Wc9*Wc9*Wc=*Wc=*WcsJU\Rx2), g1օھs͙ys 9~G"s Q]yx`"z Dt{.~~i":`nYlTN@󃗉<˛4K>(RXկVʵ r G" 8s:Qm თG' yCF@G]"? EZz{UѵX>778Eڽ8-_8_, ~- ӧc =¿Xn"`, ߏ=z. e?ޕw:¶Ż2G a()лPd 9 >4 _PĿ _X0ԆAF@3OD_hl/8Ay 0OG rnC16[!{1+1`bwhWSu6ޜ8>[. yMMV^aJ}2]nLIi;>&[zۉK]M\%q ~/:ød<+0.oD@AGCykMϲ62p>^3z^ۤk. 1Z>ލxR&k.̒k4$L_Wݡ_vU?ECMkIENDB`starpu-1.2.3+dfsg/doc/doxygen/chapters/images/starpu_non_linear_memset_regression_based.eps000066400000000000000000000573331320135501600324640ustar00rootroot00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Title: starpu_non_linear_memset_regression_based.type.eps %%Creator: gnuplot 4.6 patchlevel 3 %%CreationDate: Wed Jul 3 12:21:49 2013 %%DocumentFonts: (atend) %%BoundingBox: 50 50 410 302 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following true/false flags may be edited by hand if desired. % The unit line width and grayscale image gamma correction may also be changed. % /Color true def /Blacktext false def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /ClipToBoundingBox false def /SuppressPDFMark false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def /Gamma 1.0 def /BackgroundColor {-1.000 -1.000 -1.000} def % /vshift -46 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def /doclip { ClipToBoundingBox { newpath 50 50 moveto 410 50 lineto 410 302 lineto 50 302 lineto closepath clip } if } def % % Gnuplot Prolog Version 4.6 (September 2012) % %/SuppressPDFMark true def % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} bind def /C {setrgbcolor} bind def /f {rlineto fill} bind def /g {setgray} bind def /Gshow {show} def % May be redefined later in the file to support UTF-8 /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow {currentpoint stroke M 0 vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /UP {dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def} def /DL {Color {setrgbcolor Solid {pop []} if 0 setdash} {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse} def /BL {stroke userlinewidth 2 mul setlinewidth Rounded {1 setlinejoin 1 setlinecap} if} def /AL {stroke userlinewidth 2 div setlinewidth Rounded {1 setlinejoin 1 setlinecap} if} def /UL {dup gnulinewidth mul /userlinewidth exch def dup 1 lt {pop 1} if 10 mul /udl exch def} def /PL {stroke userlinewidth setlinewidth Rounded {1 setlinejoin 1 setlinecap} if} def 3.8 setmiterlimit % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 DL} def /Pnt {stroke [] 0 setdash gsave 1 setlinecap M 0 0 V stroke grestore} def /Dia {stroke [] 0 setdash 2 copy vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke Pnt} def /Pls {stroke [] 0 setdash vpt sub M 0 vpt2 V currentpoint stroke M hpt neg vpt neg R hpt2 0 V stroke } def /Box {stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke Pnt} def /Crs {stroke [] 0 setdash exch hpt sub exch vpt add M hpt2 vpt2 neg V currentpoint stroke M hpt2 neg 0 R hpt2 vpt2 V stroke} def /TriU {stroke [] 0 setdash 2 copy vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke Pnt} def /Star {2 copy Pls Crs} def /BoxF {stroke [] 0 setdash exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath fill} def /TriUF {stroke [] 0 setdash vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath fill} def /TriD {stroke [] 0 setdash 2 copy vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V closepath stroke Pnt} def /TriDF {stroke [] 0 setdash vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V closepath fill} def /DiaF {stroke [] 0 setdash vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath fill} def /Pent {stroke [] 0 setdash 2 copy gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat closepath stroke grestore Pnt} def /PentF {stroke [] 0 setdash gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat closepath fill grestore} def /Circle {stroke [] 0 setdash 2 copy hpt 0 360 arc stroke Pnt} def /CircleF {stroke [] 0 setdash hpt 0 360 arc fill} def /C0 {BL [] 0 setdash 2 copy moveto vpt 90 450 arc} bind def /C1 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 90 arc closepath fill vpt 0 360 arc closepath} bind def /C2 {BL [] 0 setdash 2 copy moveto 2 copy vpt 90 180 arc closepath fill vpt 0 360 arc closepath} bind def /C3 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 180 arc closepath fill vpt 0 360 arc closepath} bind def /C4 {BL [] 0 setdash 2 copy moveto 2 copy vpt 180 270 arc closepath fill vpt 0 360 arc closepath} bind def /C5 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 90 arc 2 copy moveto 2 copy vpt 180 270 arc closepath fill vpt 0 360 arc} bind def /C6 {BL [] 0 setdash 2 copy moveto 2 copy vpt 90 270 arc closepath fill vpt 0 360 arc closepath} bind def /C7 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 270 arc closepath fill vpt 0 360 arc closepath} bind def /C8 {BL [] 0 setdash 2 copy moveto 2 copy vpt 270 360 arc closepath fill vpt 0 360 arc closepath} bind def /C9 {BL [] 0 setdash 2 copy moveto 2 copy vpt 270 450 arc closepath fill vpt 0 360 arc closepath} bind def /C10 {BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill 2 copy moveto 2 copy vpt 90 180 arc closepath fill vpt 0 360 arc closepath} bind def /C11 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 180 arc closepath fill 2 copy moveto 2 copy vpt 270 360 arc closepath fill vpt 0 360 arc closepath} bind def /C12 {BL [] 0 setdash 2 copy moveto 2 copy vpt 180 360 arc closepath fill vpt 0 360 arc closepath} bind def /C13 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 90 arc closepath fill 2 copy moveto 2 copy vpt 180 360 arc closepath fill vpt 0 360 arc closepath} bind def /C14 {BL [] 0 setdash 2 copy moveto 2 copy vpt 90 360 arc closepath fill vpt 0 360 arc} bind def /C15 {BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill vpt 0 360 arc closepath} bind def /Rec {newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath} bind def /Square {dup Rec} bind def /Bsquare {vpt sub exch vpt sub exch vpt2 Square} bind def /S0 {BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare} bind def /S1 {BL [] 0 setdash 2 copy vpt Square fill Bsquare} bind def /S2 {BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def /S3 {BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare} bind def /S4 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def /S5 {BL [] 0 setdash 2 copy 2 copy vpt Square fill exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def /S6 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare} bind def /S7 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill 2 copy vpt Square fill Bsquare} bind def /S8 {BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare} bind def /S9 {BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare} bind def /S10 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def /S11 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare} bind def /S12 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare} bind def /S13 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill 2 copy vpt Square fill Bsquare} bind def /S14 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def /S15 {BL [] 0 setdash 2 copy Bsquare fill Bsquare} bind def /D0 {gsave translate 45 rotate 0 0 S0 stroke grestore} bind def /D1 {gsave translate 45 rotate 0 0 S1 stroke grestore} bind def /D2 {gsave translate 45 rotate 0 0 S2 stroke grestore} bind def /D3 {gsave translate 45 rotate 0 0 S3 stroke grestore} bind def /D4 {gsave translate 45 rotate 0 0 S4 stroke grestore} bind def /D5 {gsave translate 45 rotate 0 0 S5 stroke grestore} bind def /D6 {gsave translate 45 rotate 0 0 S6 stroke grestore} bind def /D7 {gsave translate 45 rotate 0 0 S7 stroke grestore} bind def /D8 {gsave translate 45 rotate 0 0 S8 stroke grestore} bind def /D9 {gsave translate 45 rotate 0 0 S9 stroke grestore} bind def /D10 {gsave translate 45 rotate 0 0 S10 stroke grestore} bind def /D11 {gsave translate 45 rotate 0 0 S11 stroke grestore} bind def /D12 {gsave translate 45 rotate 0 0 S12 stroke grestore} bind def /D13 {gsave translate 45 rotate 0 0 S13 stroke grestore} bind def /D14 {gsave translate 45 rotate 0 0 S14 stroke grestore} bind def /D15 {gsave translate 45 rotate 0 0 S15 stroke grestore} bind def /DiaE {stroke [] 0 setdash vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke} def /BoxE {stroke [] 0 setdash exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke} def /TriUE {stroke [] 0 setdash vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke} def /TriDE {stroke [] 0 setdash vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V closepath stroke} def /PentE {stroke [] 0 setdash gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat closepath stroke grestore} def /CircE {stroke [] 0 setdash hpt 0 360 arc stroke} def /Opaque {gsave closepath 1 setgray fill grestore 0 setgray closepath} def /DiaW {stroke [] 0 setdash vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V Opaque stroke} def /BoxW {stroke [] 0 setdash exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V Opaque stroke} def /TriUW {stroke [] 0 setdash vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V Opaque stroke} def /TriDW {stroke [] 0 setdash vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V Opaque stroke} def /PentW {stroke [] 0 setdash gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat Opaque stroke grestore} def /CircW {stroke [] 0 setdash hpt 0 360 arc Opaque stroke} def /BoxFill {gsave Rec 1 setgray fill grestore} def /Density { /Fillden exch def currentrgbcolor /ColB exch def /ColG exch def /ColR exch def /ColR ColR Fillden mul Fillden sub 1 add def /ColG ColG Fillden mul Fillden sub 1 add def /ColB ColB Fillden mul Fillden sub 1 add def ColR ColG ColB setrgbcolor} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave closepath fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % Usage: x y w h s a XX PatternFill % x,y = lower left corner of box to be filled % w,h = width and height of box % a = angle in degrees between lines and x-axis % XX = 0/1 for no/yes cross-hatch % /PatternFill {gsave /PFa [ 9 2 roll ] def PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse clip currentlinewidth 0.5 mul setlinewidth /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def 0 0 M PFa 5 get rotate PFs -2 div dup translate 0 1 PFs PFa 4 get div 1 add floor cvi {PFa 4 get mul 0 M 0 PFs V} for 0 PFa 6 get ne { 0 1 PFs PFa 4 get div 1 add floor cvi {PFa 4 get mul 0 2 1 roll M PFs 0 V} for } if stroke grestore} def % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall currentdict end definefont pop /MFshow { { dup 5 get 3 ge { 5 get 3 eq {gsave} {grestore} ifelse } {dup dup 0 get findfont exch 1 get scalefont setfont [ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6 get exch 4 get {Gshow} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq {dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5 get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop pop aload pop M} ifelse }ifelse }ifelse } ifelse } forall} def /Gswidth {dup type /stringtype eq {stringwidth} {pop (n) stringwidth} ifelse} def /MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse } {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont 6 get Gswidth pop add} {pop} ifelse} ifelse} forall} def /MLshow { currentpoint stroke M 0 exch R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MRshow { currentpoint stroke M exch dup MFwidth neg 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MCshow { currentpoint stroke M exch dup MFwidth -2 div 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /XYsave { [( ) 1 2 true false 3 ()] } bind def /XYrestore { [( ) 1 2 true false 4 ()] } bind def Level1 SuppressPDFMark or {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (starpu_non_linear_memset_regression_based.type.eps) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 3) /Author (samy) % /Producer (gnuplot) % /Keywords () /CreationDate (Wed Jul 3 12:21:49 2013) /DOCINFO pdfmark end } ifelse end %%EndProlog %%Page: 1 1 gnudict begin gsave doclip 50 50 translate 0.050 0.050 scale 0 setgray newpath (Helvetica) findfont 140 scalefont setfont BackgroundColor 0 lt 3 1 roll 0 lt exch 0 lt or or not {BackgroundColor C 1.000 0 0 7200.00 5040.00 BoxColFill} if 1.000 UL LTb LCb setrgbcolor 938 448 M 63 0 V 5946 0 R -63 0 V stroke 854 448 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.0001)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 938 657 M 31 0 V 5978 0 R -31 0 V 938 934 M 31 0 V 5978 0 R -31 0 V 938 1076 M 31 0 V 5978 0 R -31 0 V 938 1143 M 63 0 V 5946 0 R -63 0 V stroke 854 1143 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.001)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 938 1352 M 31 0 V 5978 0 R -31 0 V 938 1629 M 31 0 V 5978 0 R -31 0 V 938 1771 M 31 0 V 5978 0 R -31 0 V 938 1838 M 63 0 V 5946 0 R -63 0 V stroke 854 1838 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.01)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 938 2048 M 31 0 V 5978 0 R -31 0 V 938 2324 M 31 0 V 5978 0 R -31 0 V 938 2466 M 31 0 V 5978 0 R -31 0 V 938 2534 M 63 0 V 5946 0 R -63 0 V stroke 854 2534 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.1)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 938 2743 M 31 0 V 5978 0 R -31 0 V 938 3019 M 31 0 V 5978 0 R -31 0 V 938 3161 M 31 0 V 5978 0 R -31 0 V 938 3229 M 63 0 V 5946 0 R -63 0 V stroke 854 3229 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 938 3438 M 31 0 V 5978 0 R -31 0 V 938 3715 M 31 0 V 5978 0 R -31 0 V 938 3856 M 31 0 V 5978 0 R -31 0 V 938 3924 M 63 0 V 5946 0 R -63 0 V stroke 854 3924 M [ [(Helvetica) 140.0 0.0 true true 0 ( 10)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 938 4133 M 31 0 V 5978 0 R -31 0 V 938 4410 M 31 0 V 5978 0 R -31 0 V 938 4552 M 31 0 V 5978 0 R -31 0 V 938 4619 M 63 0 V 5946 0 R -63 0 V stroke 854 4619 M [ [(Helvetica) 140.0 0.0 true true 0 ( 100)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 938 448 M 0 63 V 0 4108 R 0 -63 V stroke 938 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1139 448 M 0 31 V 0 4140 R 0 -31 V 1405 448 M 0 31 V 0 4140 R 0 -31 V 1541 448 M 0 31 V 0 4140 R 0 -31 V 1606 448 M 0 63 V 0 4108 R 0 -63 V stroke 1606 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 10)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1807 448 M 0 31 V 0 4140 R 0 -31 V 2072 448 M 0 31 V 0 4140 R 0 -31 V 2209 448 M 0 31 V 0 4140 R 0 -31 V 2273 448 M 0 63 V 0 4108 R 0 -63 V stroke 2273 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 100)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 2474 448 M 0 31 V 0 4140 R 0 -31 V 2740 448 M 0 31 V 0 4140 R 0 -31 V 2876 448 M 0 31 V 0 4140 R 0 -31 V 2941 448 M 0 63 V 0 4108 R 0 -63 V stroke 2941 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1000)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 3142 448 M 0 31 V 0 4140 R 0 -31 V 3408 448 M 0 31 V 0 4140 R 0 -31 V 3544 448 M 0 31 V 0 4140 R 0 -31 V 3609 448 M 0 63 V 0 4108 R 0 -63 V stroke 3609 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 10000)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 3810 448 M 0 31 V 0 4140 R 0 -31 V 4075 448 M 0 31 V 0 4140 R 0 -31 V 4212 448 M 0 31 V 0 4140 R 0 -31 V 4276 448 M 0 63 V 0 4108 R 0 -63 V stroke 4276 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 100000)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 4477 448 M 0 31 V 0 4140 R 0 -31 V 4743 448 M 0 31 V 0 4140 R 0 -31 V 4879 448 M 0 31 V 0 4140 R 0 -31 V 4944 448 M 0 63 V 0 4108 R 0 -63 V stroke 4944 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1e+06)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 5145 448 M 0 31 V 0 4140 R 0 -31 V 5411 448 M 0 31 V 0 4140 R 0 -31 V 5547 448 M 0 31 V 0 4140 R 0 -31 V 5612 448 M 0 63 V 0 4108 R 0 -63 V stroke 5612 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1e+07)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 5813 448 M 0 31 V 0 4140 R 0 -31 V 6078 448 M 0 31 V 0 4140 R 0 -31 V 6215 448 M 0 31 V 0 4140 R 0 -31 V 6279 448 M 0 63 V 0 4108 R 0 -63 V stroke 6279 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1e+08)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 6480 448 M 0 31 V 0 4140 R 0 -31 V 6746 448 M 0 31 V 0 4140 R 0 -31 V 6882 448 M 0 31 V 0 4140 R 0 -31 V 6947 448 M 0 63 V 0 4108 R 0 -63 V stroke 6947 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1e+09)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 938 4619 N 938 448 L 6009 0 V 0 4171 V -6009 0 V Z stroke LCb setrgbcolor 112 2533 M currentpoint gsave translate -270 rotate 0 0 moveto [ [(Helvetica) 140.0 0.0 true true 0 (Time \(ms\))] ] -46.7 MCshow grestore LTb LCb setrgbcolor 3942 98 M [ [(Helvetica) 140.0 0.0 true true 0 (Total data size)] ] -46.7 MCshow LTb 3942 4829 M [ [(Helvetica) 140.0 0.0 true true 0 (Model for codelet non_linear_memset_regression_based.type)] ] -46.7 MCshow 1.000 UP 1.000 UL LTb LCb setrgbcolor % Begin plot #1 1.000 UL LT0 LC0 setrgbcolor LCb setrgbcolor 3710 4486 M [ [(Helvetica) 140.0 0.0 true true 0 (Non-Linear Regression cpu_impl_0)] ] -46.7 MRshow LT0 3794 4486 M 399 0 V 938 1112 M 61 0 V 60 0 V 61 0 V 61 0 V 60 0 V 61 0 V 61 0 V 61 0 V 60 1 V 61 0 V 61 0 V 60 0 V 61 1 V 61 0 V 60 0 V 61 1 V 61 1 V 61 0 V 60 1 V 61 1 V 61 2 V 60 1 V 61 2 V 61 2 V 60 3 V 61 3 V 61 4 V 61 4 V 60 6 V 61 6 V 61 7 V 60 8 V 61 10 V 61 11 V 60 13 V 61 15 V 61 17 V 60 19 V 61 22 V 61 24 V 61 26 V 60 29 V 61 31 V 61 34 V 60 36 V 61 38 V 61 40 V 60 42 V 61 43 V 61 45 V 61 47 V 60 48 V 61 48 V 61 50 V 60 50 V 61 51 V 61 52 V 60 52 V 61 53 V 61 52 V 61 54 V 60 53 V 61 54 V 61 53 V 60 54 V 61 54 V 61 55 V 60 54 V 61 54 V 61 55 V 60 54 V 61 55 V 61 54 V 61 55 V 60 54 V 61 55 V 61 54 V 60 55 V 61 55 V 61 54 V 60 55 V 61 55 V 61 54 V 61 55 V 60 55 V 61 54 V 61 55 V 60 55 V 61 54 V 61 55 V 60 55 V 61 54 V 61 55 V 61 55 V 60 54 V 61 55 V 61 55 V 60 55 V 61 54 V % End plot #1 % Begin plot #2 1.000 UP stroke LT1 LC1 setrgbcolor LCb setrgbcolor 3710 4346 M [ [(Helvetica) 140.0 0.0 true true 0 (Measured cpu_impl_0)] ] -46.7 MRshow LT1 3794 4346 M 399 0 V -399 31 R 0 -62 V 399 62 R 0 -62 V 3350 1614 M 201 -289 V 201 113 V 201 142 V 201 125 V 201 176 V 201 140 V 201 145 V 201 330 V 201 138 V 201 279 V 201 209 V 201 185 V 201 193 V 3350 1562 M 0 97 V -31 -97 R 62 0 V -62 97 R 62 0 V 170 -369 R 0 67 V -31 -67 R 62 0 V -62 67 R 62 0 V 170 59 R 0 42 V -31 -42 R 62 0 V -62 42 R 62 0 V 170 96 R 0 50 V -31 -50 R 62 0 V -62 50 R 62 0 V 170 57 R 0 82 V -31 -82 R 62 0 V -62 82 R 62 0 V 170 102 R 0 69 V -31 -69 R 62 0 V -62 69 R 62 0 V 170 96 R 0 21 V -31 -21 R 62 0 V -62 21 R 62 0 V 170 126 R 0 18 V -31 -18 R 62 0 V -62 18 R 62 0 V 4958 448 M 0 2385 V 4927 448 M 62 0 V -62 2385 R 62 0 V 170 -203 R 0 8 V -31 -8 R 62 0 V -62 8 R 62 0 V 5360 448 M 0 2676 V 5329 448 M 62 0 V -62 2676 R 62 0 V 170 -369 R 0 527 V -31 -527 R 62 0 V -62 527 R 62 0 V 170 -168 R 0 309 V -31 -309 R 62 0 V -62 309 R 62 0 V 170 -20 R 0 170 V -31 -170 R 62 0 V -62 170 R 62 0 V 3350 1614 Crs 3551 1325 Crs 3752 1438 Crs 3953 1580 Crs 4154 1705 Crs 4355 1881 Crs 4556 2021 Crs 4757 2166 Crs 4958 2496 Crs 5159 2634 Crs 5360 2913 Crs 5561 3122 Crs 5762 3307 Crs 5963 3500 Crs 3993 4346 Crs % End plot #2 1.000 UL LTb LCb setrgbcolor 938 4619 N 938 448 L 6009 0 V 0 4171 V -6009 0 V Z stroke 1.000 UP 1.000 UL LTb LCb setrgbcolor stroke grestore end showpage %%Trailer %%DocumentFonts: Helvetica starpu-1.2.3+dfsg/doc/doxygen/chapters/images/starpu_non_linear_memset_regression_based.pdf000066400000000000000000000212641320135501600324400ustar00rootroot00000000000000%PDF-1.4 %쏢 5 0 obj <> stream xZˎ\ Wܥo~l]&ht5.A|}8TU/Ϲ(J6?x:}>C _-ٹ=tF('RR?~;xiMԶzЩS/[p+mw9wŇMx:j3Ɣ۰1+:8,α 4A븠I5.M}xmPBCiio~ yLJ-_ju% c6aD,#2,$*:&yHToES$" _d2jRZb V&CMP2$4, d"EW$~DcDd"܍y:Y]_NiVe6wua &,Cg0kXEd(\vǙ CfYT\ ,2,U @a5 q -.5)|9 d8k&78], PRwiLdL5aea:$~%ڡy yͮ(:Vg 11D4*PKbI67F&'mUlzE%ch U(0j !(e5ݠXhEP]fMwoUl~E:67ʤ$6R8c$*!b}? NWbNjNV L(4՘Ufs0ŘӰ`Tт`Qͺ\a?2#܇L1M5 ^W'1M5a\έ y0l3EHDTԍ%w(RuFWb^jV.Z_"XP)R2Kcj<Âd) m"Gi^PŐlR\WŦW(*Cc(J)ޠ1TUQzY{[hEAhUn N??-OT/tv{g|:n9O5JRi{||oe) #Kۗ_>9><ߟg27}`֐ސ+}BOߞ /ߺGQ5h R}$|FG!|H9`zcI>E7XG睜6\IAX*)Jb h킪N*Bkb耫Vwh֒Q*N%ZV٨&r蠢ߊ0ea+cK 1`y Tr /{ۚK:Z5|:Bt6@;}佺 O"QVpp_mKz֏굢S|" ZBd#&A.e"ؼaa{^MTX z콦yr sT\lWJR%I(0HXEN,K焷hD J!xK^q9D5Gk69,:ϟרgR ]l;o$n|KVr7D>|'DAP&<h]N!Z ƥZd\&mE\nD]cz˞Bozw|xwb?ʮQ RFY{2K{h( aHKU="e)(PQcR+'LlnBUZF+pSTrR[&zz|լyxŕ-J^} mhTG{m"2nxkAX ] CKX_Ҥ N!q*,bU~ޏ+ ΪZqmVVY+3-iYrqz"i o[xG<7l4 8cQ52mIY]nRtN-&caEƊH@/Iwrf41,ȪΚ"WjEgӦM:V즣{jjd-R?WQA т 5 &$TT.jK%+-% E;YV9j{.1:`$^E:sr1R-xཤ^cD^T!EjM%p>L!ȏ Aahb%X}6W([QűD<+ܞұ> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 10 0 obj <> endobj 11 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 12 0 obj <>stream xUU TSW}{E(y>I-UQAD> XIűjrjUE~D-~WZDM\u3f8370iʺ+{;{}a ˲juyڜ xQi3 j'O[rf:]f:]WNIKӦRtUL]fV<9j_oot ԯVǥu6=WOy۰:kMvNn MajtQZvezlfN?E=uZ8 '%{0|fcELa&2IL3y g&3L$3c&a c3#'f ̸0LJ*-U%܀edF9u8hrse\k\Jx[.r4))}A."lvwç] Ҋ+$V u?[7եj]X͛=%%ꗆ fFt` L28JdhF̣LPm ~i &C ɓb;@eEeOb~0)Ď uCwjQ}v3 0`QDK]-H#|m:q#b{\<0\1Ŷ,o;;9fbw纓>D 'UǓ߿Йg,_g-/|iQ掜7T#LᶏXȈN8 \G(DK= -g'ÙN([,`{2W!#FN]>(;8jKo 8 <]#@>Q' r Ȇy;CB@r8jckVCn>-4[Eg;LM\' ,2] @~A4P/4z)S};{7N;WI^~4m}G, IkL9I7-}Fg}FnxldO==2f.aV aP צh#wVX >z 1<>kVf7NG |GMn~jvdטv*s{dx5Qȑ q@_?d[ |}ڞ( ec'ԁ2#7 "w eJi F}@ = )^t?jq~.9b^RI4ן"M0rW׵FslX#`)j)"܋c>stream Wed -Ju-l T 3: 1:2:21::9 Wed -Ju-l T 3: 1:2:21::9 gnuplot 4.6 patchlevel 3 starpu_non_linear_memset_regression_based.type.epssamygnuplot plot endstream endobj 2 0 obj <>endobj xref 0 14 0000000000 65535 f 0000002881 00000 n 0000008196 00000 n 0000002822 00000 n 0000002671 00000 n 0000000015 00000 n 0000002651 00000 n 0000002946 00000 n 0000003047 00000 n 0000003456 00000 n 0000002987 00000 n 0000003017 00000 n 0000003819 00000 n 0000006581 00000 n trailer << /Size 14 /Root 1 0 R /Info 2 0 R /ID [<13F05726BC6E54C4550C63E506EBBE3A><13F05726BC6E54C4550C63E506EBBE3A>] >> startxref 8451 %%EOF starpu-1.2.3+dfsg/doc/doxygen/chapters/images/starpu_non_linear_memset_regression_based.png000066400000000000000000000205511320135501600324510ustar00rootroot00000000000000PNG  IHDRc)PLTE{sjfffǦwwwDDD333UUUݪ"""  UUdddUU99 /UrrU9&&U9rU99 9&&UB B rrr/LLL pHYs  ~tIME SU IDATx}8v|";6[ۛn̩l3L llF%!SW0B#F`0B< Sm8l;"*ѣZE:Ҩ3?=i w~H+7UWcƚC}n p?w#?-oóyXQ4oTWuu>pj!6Nu]<n$  鷧T @94LŸ2?nY*,6F_OA\z,\ ,N-D2usH"ؗxo8Pmo{8\X^aU;,pVwo.D7c_+ \y|SXrܐkmw6*nXXPޙs7(%l@ Sgznઝ u%B \n`q-rWipn+kf 44 f)~;/Ai[7Jto8o S^DGV{]j B?7 ,\Yl.5 /BKMo!z,tY2;yhfY{J_QۈrBAIkҠg%.3\p{vK*R EWw3ot^7;ZK =y?=ΫRbGgzJ0hHkBf>C^DO `"Fk?wL5֊\ V\+5-iu/ѳbYvdzV B8lEn=r-_>j49I %avxrVoLꩃVmzȵ*-V}h$Ng?O?8G3FՎ\+r(*qSG%E{ek2\kYє | `70^ȵmǗU]ŜwN%ݳk%^\Ef!k̃Њ25_PExajEAhĮ l#_Q< cL4ڌp!#}u80Cz H[~0Қ_F:(io^ 0nvV/Z io /Z i/>0I F6n 0dvV/#`Gh0Z:_F pNtwjw*]}~߮;5*t}~wZ᜽xNm+LZ`4ߣX09n﫡 K߮6 |l>?F= -90Ynѵp~yx%-ߣX6̡| n 3v^0ZH~-E`b0Қ_F(0z>ߎB'yOjC3=}v'F: 0z`l~ǰ80ҁ_FZ :#` ~JR"_F3}; F|0a.@o' hbk^L/IC96 ˉ `4) .#x"~MF|h\7&W,A̋_߸0ˋX[gqGSMVɴ0Hj0ZWL7 hB89F4N0 ल3Ѩǟ hq\D w&wʤg&ABw^[LB mNTN_F~2mr>@ّ|Ww">}ds`4r`tsV_0OqkT'.D6z{ FcB 6Q0ߟL4ƣ'8hY@v] o H/'`t8.n H)C]}!G'`t'q)ݤuf!6Nli)"ڏ/iX`1s?=FMי@Zcmu[eF6J%zlXN`lvRDSpO&v g"Y% ygD8?z]YalxӿBئ-̽ozz=  !_΅ @X#~5?\ޛk"cEg$홮mO<{1Du l[JRX[=#pD^h).'˜rc"Wpb-вe>4Rkxg/p~)}{J45x4XNb=p2.> _A$Ϗ5<ѓS7vK~v+a!ZjqR q;'noE㭫$:vڃ 1 ށ ˅H; B[2 7/`XpMϛ10xWL:vH/kVFo|!כR}`,/Y2wu<{v$ 8I]cׅ7z_IpAU_SWN#I~-Xnୣn3HbVs"od ;5l"SrF47+kDf`c)EI"cMl2`mZ/xu,{7<6ͩA.> &xqmʾ~ɍV~xBneCC!7*ǯzul>j.gh,~?_`rlOŷ:F[G@ h7ua,|gD{}[rH0sV.?qA4`{sB<n>~X8R8^ Cx(WU}z ˟~8,/ߕ_E^gA<Oo'I' `jp8{g? p.D$},÷]S|3y_Z÷8vL0mVG]z,Ĉg|`^~+0+Ѧ&(N qY?UoWw<7>0_sr'|{l'q `~,ĭ3`r|,l%_}'ӫdܒ=P=3B?oQq'En 5u{0"xT>*X37f~E]B0+;gP-;N)!xAU e~ Fod}ޒS +G0?0q rzJp!~{W ӓQz'2rX'=#y$ O>yv 7_\,߬\BwvL#1wJ&Q[Q&e tJc>V:c&=-[B Xa  CC |6|l WLfVK,0Z_|` 9h07Gxx^k|d{5vCg}Rvuy_anvkXN};V +F !ks>p%Bܭ z4MKpjVfաo^ l3 2]hkH0!>Jա3}Tx_q5E[Gpr6xWXcIg]x2:N[n2 :1 Qo{!F 3"\=6 #C)KoX`00[B0` `  0h0000`>0 |I- G^E4oo_Wm< Gg!poSnk; l{5v[qx }Nwۭa\F4-m #%ŸVuuaʋ d΋W۲Q7ﶷ)`^( Pj޶ӛԗ5}Q_A-to8o S^DGƸ^os^D}l@ӟX\춷M`ob)/2Q"?n{4` @rVzn0Z.DO)w[FXmoZ.0B\v-ڷ6 YzFZݪ5+ݷN9J=-]-'O{b7k!D׾U7dWi^vtk|vY ;+UhwPt [s/h!pҭ=%О;kB}k#Yj_ku٭ZCR֭QV֒֠ϮT-noh` A-twa/~pZ ؤZ: !!KԾH[wEN`/zn7:iABaBOd.ZooDYzFݪ5+2VGb5R}-  &-u!_Fdj_oq٭Zû"۶FٗBhB lˊ! A`m\ !('7di\v𮨿!SMI(rF g]|9bzkވ,@4.UkxWJ/Ʒƶ= -mv"|k0}s#vo#6ҼV]ra߾"BZBBHeh@ }]@Օ\ =RFP\}ej Jf vg_ޠ9Olـe8Wp"\1-5XRO큍Ժ+Ovn`w5{ ;[N,Z!F#0B!~)9FqWobZ<mp/9jF295 OS۝ww)Dio%`2V,ō2ܥS-ON亞,JA !0NnAP}/jaZ~T(vEHg#٪/nD<bnvT,WÈSJdү0,t傄Fs\x^BXNyT(v̅hjq#-\;7.DairW^eHW.7"Ns6 ` _Z`[SMKWA\6r-nD<,k8I]7c-1AYq4-bWۢ aODōSxї+m;GXM0IDATv{#0`4B!nl_IENDB`starpu-1.2.3+dfsg/doc/doxygen/chapters/images/starpu_non_linear_memset_regression_based_2.eps000066400000000000000000002123511320135501600326760ustar00rootroot00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Title: starpu_non_linear_memset_regression_based.eps %%Creator: gnuplot 4.6 patchlevel 4 %%CreationDate: Fri Nov 8 15:21:37 2013 %%DocumentFonts: (atend) %%BoundingBox: 50 50 410 302 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following true/false flags may be edited by hand if desired. % The unit line width and grayscale image gamma correction may also be changed. % /Color true def /Blacktext false def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /ClipToBoundingBox false def /SuppressPDFMark false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def /Gamma 1.0 def /BackgroundColor {-1.000 -1.000 -1.000} def % /vshift -46 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def /doclip { ClipToBoundingBox { newpath 50 50 moveto 410 50 lineto 410 302 lineto 50 302 lineto closepath clip } if } def % % Gnuplot Prolog Version 4.6 (September 2012) % %/SuppressPDFMark true def % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} bind def /C {setrgbcolor} bind def /f {rlineto fill} bind def /g {setgray} bind def /Gshow {show} def % May be redefined later in the file to support UTF-8 /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow {currentpoint stroke M 0 vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /UP {dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def} def /DL {Color {setrgbcolor Solid {pop []} if 0 setdash} {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse} def /BL {stroke userlinewidth 2 mul setlinewidth Rounded {1 setlinejoin 1 setlinecap} if} def /AL {stroke userlinewidth 2 div setlinewidth Rounded {1 setlinejoin 1 setlinecap} if} def /UL {dup gnulinewidth mul /userlinewidth exch def dup 1 lt {pop 1} if 10 mul /udl exch def} def /PL {stroke userlinewidth setlinewidth Rounded {1 setlinejoin 1 setlinecap} if} def 3.8 setmiterlimit % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 DL} def /Pnt {stroke [] 0 setdash gsave 1 setlinecap M 0 0 V stroke grestore} def /Dia {stroke [] 0 setdash 2 copy vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke Pnt} def /Pls {stroke [] 0 setdash vpt sub M 0 vpt2 V currentpoint stroke M hpt neg vpt neg R hpt2 0 V stroke } def /Box {stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke Pnt} def /Crs {stroke [] 0 setdash exch hpt sub exch vpt add M hpt2 vpt2 neg V currentpoint stroke M hpt2 neg 0 R hpt2 vpt2 V stroke} def /TriU {stroke [] 0 setdash 2 copy vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke Pnt} def /Star {2 copy Pls Crs} def /BoxF {stroke [] 0 setdash exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath fill} def /TriUF {stroke [] 0 setdash vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath fill} def /TriD {stroke [] 0 setdash 2 copy vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V closepath stroke Pnt} def /TriDF {stroke [] 0 setdash vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V closepath fill} def /DiaF {stroke [] 0 setdash vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath fill} def /Pent {stroke [] 0 setdash 2 copy gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat closepath stroke grestore Pnt} def /PentF {stroke [] 0 setdash gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat closepath fill grestore} def /Circle {stroke [] 0 setdash 2 copy hpt 0 360 arc stroke Pnt} def /CircleF {stroke [] 0 setdash hpt 0 360 arc fill} def /C0 {BL [] 0 setdash 2 copy moveto vpt 90 450 arc} bind def /C1 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 90 arc closepath fill vpt 0 360 arc closepath} bind def /C2 {BL [] 0 setdash 2 copy moveto 2 copy vpt 90 180 arc closepath fill vpt 0 360 arc closepath} bind def /C3 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 180 arc closepath fill vpt 0 360 arc closepath} bind def /C4 {BL [] 0 setdash 2 copy moveto 2 copy vpt 180 270 arc closepath fill vpt 0 360 arc closepath} bind def /C5 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 90 arc 2 copy moveto 2 copy vpt 180 270 arc closepath fill vpt 0 360 arc} bind def /C6 {BL [] 0 setdash 2 copy moveto 2 copy vpt 90 270 arc closepath fill vpt 0 360 arc closepath} bind def /C7 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 270 arc closepath fill vpt 0 360 arc closepath} bind def /C8 {BL [] 0 setdash 2 copy moveto 2 copy vpt 270 360 arc closepath fill vpt 0 360 arc closepath} bind def /C9 {BL [] 0 setdash 2 copy moveto 2 copy vpt 270 450 arc closepath fill vpt 0 360 arc closepath} bind def /C10 {BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill 2 copy moveto 2 copy vpt 90 180 arc closepath fill vpt 0 360 arc closepath} bind def /C11 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 180 arc closepath fill 2 copy moveto 2 copy vpt 270 360 arc closepath fill vpt 0 360 arc closepath} bind def /C12 {BL [] 0 setdash 2 copy moveto 2 copy vpt 180 360 arc closepath fill vpt 0 360 arc closepath} bind def /C13 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 90 arc closepath fill 2 copy moveto 2 copy vpt 180 360 arc closepath fill vpt 0 360 arc closepath} bind def /C14 {BL [] 0 setdash 2 copy moveto 2 copy vpt 90 360 arc closepath fill vpt 0 360 arc} bind def /C15 {BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill vpt 0 360 arc closepath} bind def /Rec {newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath} bind def /Square {dup Rec} bind def /Bsquare {vpt sub exch vpt sub exch vpt2 Square} bind def /S0 {BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare} bind def /S1 {BL [] 0 setdash 2 copy vpt Square fill Bsquare} bind def /S2 {BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def /S3 {BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare} bind def /S4 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def /S5 {BL [] 0 setdash 2 copy 2 copy vpt Square fill exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def /S6 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare} bind def /S7 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill 2 copy vpt Square fill Bsquare} bind def /S8 {BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare} bind def /S9 {BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare} bind def /S10 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def /S11 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare} bind def /S12 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare} bind def /S13 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill 2 copy vpt Square fill Bsquare} bind def /S14 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def /S15 {BL [] 0 setdash 2 copy Bsquare fill Bsquare} bind def /D0 {gsave translate 45 rotate 0 0 S0 stroke grestore} bind def /D1 {gsave translate 45 rotate 0 0 S1 stroke grestore} bind def /D2 {gsave translate 45 rotate 0 0 S2 stroke grestore} bind def /D3 {gsave translate 45 rotate 0 0 S3 stroke grestore} bind def /D4 {gsave translate 45 rotate 0 0 S4 stroke grestore} bind def /D5 {gsave translate 45 rotate 0 0 S5 stroke grestore} bind def /D6 {gsave translate 45 rotate 0 0 S6 stroke grestore} bind def /D7 {gsave translate 45 rotate 0 0 S7 stroke grestore} bind def /D8 {gsave translate 45 rotate 0 0 S8 stroke grestore} bind def /D9 {gsave translate 45 rotate 0 0 S9 stroke grestore} bind def /D10 {gsave translate 45 rotate 0 0 S10 stroke grestore} bind def /D11 {gsave translate 45 rotate 0 0 S11 stroke grestore} bind def /D12 {gsave translate 45 rotate 0 0 S12 stroke grestore} bind def /D13 {gsave translate 45 rotate 0 0 S13 stroke grestore} bind def /D14 {gsave translate 45 rotate 0 0 S14 stroke grestore} bind def /D15 {gsave translate 45 rotate 0 0 S15 stroke grestore} bind def /DiaE {stroke [] 0 setdash vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke} def /BoxE {stroke [] 0 setdash exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke} def /TriUE {stroke [] 0 setdash vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke} def /TriDE {stroke [] 0 setdash vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V closepath stroke} def /PentE {stroke [] 0 setdash gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat closepath stroke grestore} def /CircE {stroke [] 0 setdash hpt 0 360 arc stroke} def /Opaque {gsave closepath 1 setgray fill grestore 0 setgray closepath} def /DiaW {stroke [] 0 setdash vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V Opaque stroke} def /BoxW {stroke [] 0 setdash exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V Opaque stroke} def /TriUW {stroke [] 0 setdash vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V Opaque stroke} def /TriDW {stroke [] 0 setdash vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V Opaque stroke} def /PentW {stroke [] 0 setdash gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat Opaque stroke grestore} def /CircW {stroke [] 0 setdash hpt 0 360 arc Opaque stroke} def /BoxFill {gsave Rec 1 setgray fill grestore} def /Density { /Fillden exch def currentrgbcolor /ColB exch def /ColG exch def /ColR exch def /ColR ColR Fillden mul Fillden sub 1 add def /ColG ColG Fillden mul Fillden sub 1 add def /ColB ColB Fillden mul Fillden sub 1 add def ColR ColG ColB setrgbcolor} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave closepath fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % Usage: x y w h s a XX PatternFill % x,y = lower left corner of box to be filled % w,h = width and height of box % a = angle in degrees between lines and x-axis % XX = 0/1 for no/yes cross-hatch % /PatternFill {gsave /PFa [ 9 2 roll ] def PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse clip currentlinewidth 0.5 mul setlinewidth /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def 0 0 M PFa 5 get rotate PFs -2 div dup translate 0 1 PFs PFa 4 get div 1 add floor cvi {PFa 4 get mul 0 M 0 PFs V} for 0 PFa 6 get ne { 0 1 PFs PFa 4 get div 1 add floor cvi {PFa 4 get mul 0 2 1 roll M PFs 0 V} for } if stroke grestore} def % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall currentdict end definefont pop /MFshow { { dup 5 get 3 ge { 5 get 3 eq {gsave} {grestore} ifelse } {dup dup 0 get findfont exch 1 get scalefont setfont [ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6 get exch 4 get {Gshow} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq {dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5 get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop pop aload pop M} ifelse }ifelse }ifelse } ifelse } forall} def /Gswidth {dup type /stringtype eq {stringwidth} {pop (n) stringwidth} ifelse} def /MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse } {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont 6 get Gswidth pop add} {pop} ifelse} ifelse} forall} def /MLshow { currentpoint stroke M 0 exch R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MRshow { currentpoint stroke M exch dup MFwidth neg 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MCshow { currentpoint stroke M exch dup MFwidth -2 div 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /XYsave { [( ) 1 2 true false 3 ()] } bind def /XYrestore { [( ) 1 2 true false 4 ()] } bind def Level1 SuppressPDFMark or {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (starpu_non_linear_memset_regression_based.eps) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 4) /Author (samy) % /Producer (gnuplot) % /Keywords () /CreationDate (Fri Nov 8 15:21:37 2013) /DOCINFO pdfmark end } ifelse end %%EndProlog %%Page: 1 1 gnudict begin gsave doclip 50 50 translate 0.050 0.050 scale 0 setgray newpath (Helvetica) findfont 140 scalefont setfont BackgroundColor 0 lt 3 1 roll 0 lt exch 0 lt or or not {BackgroundColor C 1.000 0 0 7200.00 5040.00 BoxColFill} if 1.000 UL LTb LCb setrgbcolor 938 448 M 63 0 V 5946 0 R -63 0 V stroke 854 448 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.0001)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 938 699 M 31 0 V 5978 0 R -31 0 V 938 1031 M 31 0 V 5978 0 R -31 0 V 938 1201 M 31 0 V 5978 0 R -31 0 V 938 1282 M 63 0 V 5946 0 R -63 0 V stroke 854 1282 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.001)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 938 1533 M 31 0 V 5978 0 R -31 0 V 938 1865 M 31 0 V 5978 0 R -31 0 V 938 2036 M 31 0 V 5978 0 R -31 0 V 938 2116 M 63 0 V 5946 0 R -63 0 V stroke 854 2116 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.01)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 938 2368 M 31 0 V 5978 0 R -31 0 V 938 2699 M 31 0 V 5978 0 R -31 0 V 938 2870 M 31 0 V 5978 0 R -31 0 V 938 2951 M 63 0 V 5946 0 R -63 0 V stroke 854 2951 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.1)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 938 3202 M 31 0 V 5978 0 R -31 0 V 938 3534 M 31 0 V 5978 0 R -31 0 V 938 3704 M 31 0 V 5978 0 R -31 0 V 938 3785 M 63 0 V 5946 0 R -63 0 V stroke 854 3785 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 938 4036 M 31 0 V 5978 0 R -31 0 V 938 4368 M 31 0 V 5978 0 R -31 0 V 938 4538 M 31 0 V 5978 0 R -31 0 V 938 4619 M 63 0 V 5946 0 R -63 0 V stroke 854 4619 M [ [(Helvetica) 140.0 0.0 true true 0 ( 10)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 938 448 M 0 63 V 0 4108 R 0 -63 V stroke 938 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1000)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1300 448 M 0 31 V 0 4140 R 0 -31 V 1778 448 M 0 31 V 0 4140 R 0 -31 V 2023 448 M 0 31 V 0 4140 R 0 -31 V 2140 448 M 0 63 V 0 4108 R 0 -63 V stroke 2140 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 10000)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 2502 448 M 0 31 V 0 4140 R 0 -31 V 2980 448 M 0 31 V 0 4140 R 0 -31 V 3225 448 M 0 31 V 0 4140 R 0 -31 V 3342 448 M 0 63 V 0 4108 R 0 -63 V stroke 3342 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 100000)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 3703 448 M 0 31 V 0 4140 R 0 -31 V 4182 448 M 0 31 V 0 4140 R 0 -31 V 4427 448 M 0 31 V 0 4140 R 0 -31 V 4543 448 M 0 63 V 0 4108 R 0 -63 V stroke 4543 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1e+06)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 4905 448 M 0 31 V 0 4140 R 0 -31 V 5383 448 M 0 31 V 0 4140 R 0 -31 V 5629 448 M 0 31 V 0 4140 R 0 -31 V 5745 448 M 0 63 V 0 4108 R 0 -63 V stroke 5745 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1e+07)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 6107 448 M 0 31 V 0 4140 R 0 -31 V 6585 448 M 0 31 V 0 4140 R 0 -31 V 6831 448 M 0 31 V 0 4140 R 0 -31 V 6947 448 M 0 63 V 0 4108 R 0 -63 V stroke 6947 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1e+08)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 938 4619 N 938 448 L 6009 0 V 0 4171 V -6009 0 V Z stroke LCb setrgbcolor 112 2533 M currentpoint gsave translate -270 rotate 0 0 moveto [ [(Helvetica) 140.0 0.0 true true 0 (Time \(ms\))] ] -46.7 MCshow grestore LTb LCb setrgbcolor 3942 98 M [ [(Helvetica) 140.0 0.0 true true 0 (Total data size)] ] -46.7 MCshow LTb 3942 4829 M [ [(Helvetica) 140.0 0.0 true true 0 (Model for codelet non_linear_memset_regression_based)] ] -46.7 MCshow 1.000 UP 1.000 UL LTb LCb setrgbcolor % Begin plot #1 1.000 UP 1.000 UL LT0 LC0 setrgbcolor LCb setrgbcolor 4298 4486 M [ [(Helvetica) 140.0 0.0 true true 0 (Profiling cpu0_ncore0_impl0)] ] -46.7 MRshow LT0 950 1906 Pls 950 1521 Pls 950 1232 Pls 950 1181 Pls 950 1200 Pls 950 1142 Pls 950 1518 Pls 950 1088 Pls 950 1155 Pls 950 1169 Pls 950 1542 Pls 950 1151 Pls 950 1184 Pls 950 1167 Pls 950 1170 Pls 950 1430 Pls 950 1241 Pls 950 1306 Pls 950 1131 Pls 950 1096 Pls 950 1318 Pls 950 1076 Pls 950 1245 Pls 950 1191 Pls 950 1158 Pls 950 1148 Pls 950 1181 Pls 950 1179 Pls 950 1129 Pls 950 1117 Pls 950 1152 Pls 950 1117 Pls 950 1208 Pls 950 1145 Pls 950 1164 Pls 950 1198 Pls 950 1188 Pls 950 1129 Pls 950 1253 Pls 950 1398 Pls 950 1182 Pls 950 1252 Pls 950 1235 Pls 950 1132 Pls 950 1109 Pls 950 1075 Pls 950 1089 Pls 950 1100 Pls 950 1075 Pls 950 1085 Pls 950 1195 Pls 950 1355 Pls 950 1155 Pls 950 1245 Pls 950 1096 Pls 950 1164 Pls 950 1071 Pls 950 1115 Pls 950 1054 Pls 950 1094 Pls 950 1087 Pls 950 1104 Pls 950 1063 Pls 950 1220 Pls 950 1095 Pls 950 1118 Pls 950 1092 Pls 950 1144 Pls 950 1110 Pls 950 1073 Pls 950 1184 Pls 950 1105 Pls 950 1110 Pls 950 1221 Pls 950 1317 Pls 950 1115 Pls 950 1114 Pls 950 1246 Pls 950 1127 Pls 950 1145 Pls 950 1107 Pls 950 1107 Pls 950 1134 Pls 950 1140 Pls 950 1102 Pls 950 1119 Pls 950 1108 Pls 950 1147 Pls 950 1092 Pls 950 1135 Pls 950 1135 Pls 950 1107 Pls 950 1073 Pls 950 1128 Pls 950 1077 Pls 950 1098 Pls 950 1087 Pls 950 1119 Pls 950 1148 Pls 950 1110 Pls 950 1138 Pls 950 1150 Pls 950 1137 Pls 950 1107 Pls 950 1133 Pls 950 1105 Pls 950 1101 Pls 950 1141 Pls 950 1085 Pls 950 1098 Pls 950 1116 Pls 950 1081 Pls 950 1082 Pls 950 1071 Pls 950 1198 Pls 950 1213 Pls 950 1106 Pls 950 1104 Pls 950 1100 Pls 950 1259 Pls 950 1164 Pls 950 1111 Pls 950 1153 Pls 950 1092 Pls 950 1113 Pls 950 1118 Pls 950 1072 Pls 950 1124 Pls 950 1168 Pls 950 1150 Pls 950 1140 Pls 950 1090 Pls 950 1093 Pls 950 1097 Pls 950 1085 Pls 950 1110 Pls 950 1169 Pls 950 1062 Pls 950 1166 Pls 950 1075 Pls 950 1150 Pls 950 1282 Pls 950 1103 Pls 950 1092 Pls 950 1151 Pls 950 1143 Pls 950 1095 Pls 950 1098 Pls 950 1118 Pls 950 1147 Pls 950 1145 Pls 950 1151 Pls 950 1073 Pls 950 1156 Pls 950 1072 Pls 950 1094 Pls 950 1087 Pls 950 1136 Pls 950 1100 Pls 950 1070 Pls 950 1149 Pls 950 1107 Pls 950 1086 Pls 950 1095 Pls 950 1139 Pls 950 1094 Pls 950 1165 Pls 950 1127 Pls 950 1097 Pls 950 1064 Pls 950 1072 Pls 950 1092 Pls 950 1084 Pls 950 1159 Pls 950 1150 Pls 950 1090 Pls 950 1085 Pls 950 1074 Pls 950 1087 Pls 950 1099 Pls 950 1173 Pls 950 1097 Pls 950 1165 Pls 950 1110 Pls 950 1135 Pls 950 1101 Pls 950 1169 Pls 950 1153 Pls 950 1118 Pls 950 1244 Pls 950 1083 Pls 950 1303 Pls 950 1242 Pls 950 1145 Pls 950 1192 Pls 950 1172 Pls 950 1121 Pls 950 1177 Pls 950 1108 Pls 950 1104 Pls 1312 1280 Pls 1312 1318 Pls 1312 1343 Pls 1312 1195 Pls 1312 1213 Pls 1312 1207 Pls 1312 1246 Pls 1312 1130 Pls 1312 1165 Pls 1312 1243 Pls 1312 1540 Pls 1312 1132 Pls 1312 1322 Pls 1312 1247 Pls 1312 1291 Pls 1312 1252 Pls 1312 1162 Pls 1312 1230 Pls 1312 1303 Pls 1312 1126 Pls 1312 1180 Pls 1312 1444 Pls 1312 1180 Pls 1312 1300 Pls 1312 1295 Pls 1312 1199 Pls 1312 1213 Pls 1312 1210 Pls 1312 1182 Pls 1312 1202 Pls 1312 1215 Pls 1312 1217 Pls 1312 1177 Pls 1312 1224 Pls 1312 1194 Pls 1312 1197 Pls 1312 1209 Pls 1312 1228 Pls 1312 1144 Pls 1312 1283 Pls 1312 1152 Pls 1312 1147 Pls 1312 1226 Pls 1312 1199 Pls 1312 1156 Pls 1312 1235 Pls 1312 1232 Pls 1312 1175 Pls 1312 1212 Pls 1312 1200 Pls 1312 1207 Pls 1312 1186 Pls 1312 1198 Pls 1312 1406 Pls 1312 1180 Pls 1312 1174 Pls 1312 1135 Pls 1312 1228 Pls 1312 1159 Pls 1312 1140 Pls 1312 1129 Pls 1312 1276 Pls 1312 1134 Pls 1312 1163 Pls 1312 1200 Pls 1312 1167 Pls 1312 1193 Pls 1312 1151 Pls 1312 1183 Pls 1312 1215 Pls 1312 1199 Pls 1312 1140 Pls 1312 1166 Pls 1312 1201 Pls 1312 1187 Pls 1312 1184 Pls 1312 1167 Pls 1312 1141 Pls 1312 1180 Pls 1312 1138 Pls 1312 1146 Pls 1312 1132 Pls 1312 1153 Pls 1312 1201 Pls 1312 1186 Pls 1312 1143 Pls 1312 1164 Pls 1312 1142 Pls 1312 1132 Pls 1312 1210 Pls 1312 1155 Pls 1312 1216 Pls 1312 1194 Pls 1312 1153 Pls 1312 1191 Pls 1312 1163 Pls 1312 1168 Pls 1312 1154 Pls 1312 1226 Pls 1312 1475 Pls 1312 1222 Pls 1312 1216 Pls 1312 1234 Pls 1312 1206 Pls 1312 1153 Pls 1312 1174 Pls 1312 1147 Pls 1312 1164 Pls 1312 1145 Pls 1312 1221 Pls 1312 1152 Pls 1312 1188 Pls 1312 1190 Pls 1312 1227 Pls 1312 1145 Pls 1312 1197 Pls 1312 1276 Pls 1312 1163 Pls 1312 1221 Pls 1312 1146 Pls 1312 1211 Pls 1312 1284 Pls 1312 1186 Pls 1312 1173 Pls 1312 1211 Pls 1312 1127 Pls 1312 1223 Pls 1312 1145 Pls 1312 1300 Pls 1312 1173 Pls 1312 1166 Pls 1312 1146 Pls 1312 1118 Pls 1312 1156 Pls 1312 1156 Pls 1312 1190 Pls 1312 1170 Pls 1312 1178 Pls 1312 1155 Pls 1312 1140 Pls 1312 1219 Pls 1312 1145 Pls 1312 1195 Pls 1312 1195 Pls 1312 1191 Pls 1312 1168 Pls 1312 1153 Pls 1312 1188 Pls 1312 1193 Pls 1312 1186 Pls 1312 1175 Pls 1312 1348 Pls 1312 1163 Pls 1312 1276 Pls 1312 1205 Pls 1312 1184 Pls 1312 1152 Pls 1312 1110 Pls 1312 1218 Pls 1312 1152 Pls 1312 1201 Pls 1312 1139 Pls 1312 1163 Pls 1312 1133 Pls 1312 1164 Pls 1312 1224 Pls 1312 1152 Pls 1312 1143 Pls 1312 1298 Pls 1312 1134 Pls 1312 1298 Pls 1312 1156 Pls 1312 1166 Pls 1312 1153 Pls 1312 1152 Pls 1312 1198 Pls 1312 1160 Pls 1312 1195 Pls 1312 1189 Pls 1312 1191 Pls 1312 1166 Pls 1312 1158 Pls 1312 1142 Pls 1312 1193 Pls 1312 1184 Pls 1312 1122 Pls 1312 1154 Pls 1312 1122 Pls 1312 1156 Pls 1312 1122 Pls 1312 1280 Pls 1312 1219 Pls 1312 1183 Pls 1312 1163 Pls 1312 1163 Pls 1312 1137 Pls 1312 1152 Pls 1312 1191 Pls 1312 1179 Pls 1312 1314 Pls 1674 1201 Pls 1674 1513 Pls 1674 1381 Pls 1674 1431 Pls 1674 1295 Pls 1674 1415 Pls 1674 1348 Pls 1674 1318 Pls 1674 1438 Pls 1674 1289 Pls 1674 1362 Pls 1674 1274 Pls 1674 1310 Pls 1674 1294 Pls 1674 1312 Pls 1674 1269 Pls 1674 1293 Pls 1674 1320 Pls 1674 1285 Pls 1674 1296 Pls 1674 1306 Pls 1674 1313 Pls 1674 1499 Pls 1674 1288 Pls 1674 1270 Pls 1674 1337 Pls 1674 1364 Pls 1674 1273 Pls 1674 1261 Pls 1674 1293 Pls 1674 1263 Pls 1674 1267 Pls 1674 1259 Pls 1674 1269 Pls 1674 1265 Pls 1674 1266 Pls 1674 1321 Pls 1674 1275 Pls 1674 1292 Pls 1674 1271 Pls 1674 1279 Pls 1674 1254 Pls 1674 1320 Pls 1674 1301 Pls 1674 1276 Pls 1674 1254 Pls 1674 1271 Pls 1674 1234 Pls 1674 1276 Pls 1674 1269 Pls 1674 1260 Pls 1674 1258 Pls 1674 1294 Pls 1674 1252 Pls 1674 1267 Pls 1674 1312 Pls 1674 1251 Pls 1674 1276 Pls 1674 1296 Pls 1674 1300 Pls 1674 1268 Pls 1674 1296 Pls 1674 1255 Pls 1674 1298 Pls 1674 1271 Pls 1674 1265 Pls 1674 1253 Pls 1674 1240 Pls 1674 1228 Pls 1674 1440 Pls 1674 1263 Pls 1674 1290 Pls 1674 1242 Pls 1674 1267 Pls 1674 1262 Pls 1674 1354 Pls 1674 1238 Pls 1674 1268 Pls 1674 1277 Pls 1674 1247 Pls 1674 1298 Pls 1674 1247 Pls 1674 1272 Pls 1674 1228 Pls 1674 1307 Pls 1674 1251 Pls 1674 1259 Pls 1674 1242 Pls 1674 1264 Pls 1674 1288 Pls 1674 1242 Pls 1674 1304 Pls 1674 1257 Pls 1674 1289 Pls 1674 1242 Pls 1674 1268 Pls 1674 1232 Pls 1674 1332 Pls 1674 1293 Pls 1674 1269 Pls 1674 1297 Pls 1674 1257 Pls 1674 1342 Pls 1674 1249 Pls 1674 1274 Pls 1674 1296 Pls 1674 1237 Pls 1674 1260 Pls 1674 1247 Pls 1674 1241 Pls 1674 1352 Pls 1674 1292 Pls 1674 1246 Pls 1674 1260 Pls 1674 1296 Pls 1674 1262 Pls 1674 1268 Pls 1674 1298 Pls 1674 1253 Pls 1674 1294 Pls 1674 1297 Pls 1674 1236 Pls 1674 1262 Pls 1674 1280 Pls 1674 1271 Pls 1674 1289 Pls 1674 1303 Pls 1674 1252 Pls 1674 1290 Pls 1674 1290 Pls 1674 1236 Pls 1674 1294 Pls 1674 1310 Pls 1674 1265 Pls 1674 1304 Pls 1674 1273 Pls 1674 1253 Pls 1674 1377 Pls 1674 1244 Pls 1674 1289 Pls 1674 1254 Pls 1674 1368 Pls 1674 1259 Pls 1674 1301 Pls 1674 1275 Pls 1674 1276 Pls 1674 1248 Pls 1674 1293 Pls 1674 1256 Pls 1674 1260 Pls 1674 1261 Pls 1674 1281 Pls 1674 1366 Pls 1674 1259 Pls 1674 1278 Pls 1674 1262 Pls 1674 1297 Pls 1674 1304 Pls 1674 1275 Pls 1674 1276 Pls 1674 1316 Pls 1674 1307 Pls 1674 1241 Pls 1674 1277 Pls 1674 1268 Pls 1674 1293 Pls 1674 1252 Pls 1674 1287 Pls 1674 1240 Pls 1674 1303 Pls 1674 1244 Pls 1674 1279 Pls 1674 1262 Pls 1674 1264 Pls 1674 1269 Pls 1674 1299 Pls 1674 1264 Pls 1674 1259 Pls 1674 1254 Pls 1674 1269 Pls 1674 1287 Pls 1674 1238 Pls 1674 1264 Pls 1674 1256 Pls 1674 1260 Pls 1674 1281 Pls 1674 1244 Pls 1674 1270 Pls 1674 1283 Pls 1674 1268 Pls 1674 1272 Pls 1674 1259 Pls 1674 1262 Pls 1674 1267 Pls 1674 1246 Pls 1674 1260 Pls 1674 1232 Pls 1674 1358 Pls 1674 1286 Pls 1674 1262 Pls 2036 1301 Pls 2036 1363 Pls 2036 1432 Pls 2036 1410 Pls 2036 1406 Pls 2036 1349 Pls 2036 1396 Pls 2036 1400 Pls 2036 1426 Pls 2036 1347 Pls 2036 1575 Pls 2036 1375 Pls 2036 1554 Pls 2036 1425 Pls 2036 1476 Pls 2036 1384 Pls 2036 1391 Pls 2036 1463 Pls 2036 1387 Pls 2036 1396 Pls 2036 1402 Pls 2036 1403 Pls 2036 1397 Pls 2036 1475 Pls 2036 1504 Pls 2036 1463 Pls 2036 1393 Pls 2036 1390 Pls 2036 1433 Pls 2036 1407 Pls 2036 1389 Pls 2036 1428 Pls 2036 1384 Pls 2036 1397 Pls 2036 1415 Pls 2036 1382 Pls 2036 1403 Pls 2036 1416 Pls 2036 1385 Pls 2036 1400 Pls 2036 1377 Pls 2036 1435 Pls 2036 1389 Pls 2036 1407 Pls 2036 1401 Pls 2036 1411 Pls 2036 1411 Pls 2036 1390 Pls 2036 1411 Pls 2036 1394 Pls 2036 1388 Pls 2036 1397 Pls 2036 1393 Pls 2036 1385 Pls 2036 1386 Pls 2036 1432 Pls 2036 1398 Pls 2036 1412 Pls 2036 1387 Pls 2036 1420 Pls 2036 1409 Pls 2036 1396 Pls 2036 1375 Pls 2036 1385 Pls 2036 1413 Pls 2036 1384 Pls 2036 1382 Pls 2036 1394 Pls 2036 1390 Pls 2036 1387 Pls 2036 1419 Pls 2036 1386 Pls 2036 1390 Pls 2036 1389 Pls 2036 1394 Pls 2036 1400 Pls 2036 1402 Pls 2036 1372 Pls 2036 1379 Pls 2036 1374 Pls 2036 1378 Pls 2036 1381 Pls 2036 1433 Pls 2036 1390 Pls 2036 1462 Pls 2036 1396 Pls 2036 1421 Pls 2036 1402 Pls 2036 1426 Pls 2036 1397 Pls 2036 1400 Pls 2036 1375 Pls 2036 1394 Pls 2036 1376 Pls 2036 1392 Pls 2036 1393 Pls 2036 1435 Pls 2036 1384 Pls 2036 1390 Pls 2036 1407 Pls 2036 1384 Pls 2036 1388 Pls 2036 1411 Pls 2036 1387 Pls 2036 1440 Pls 2036 1399 Pls 2036 1405 Pls 2036 1400 Pls 2036 1388 Pls 2036 1375 Pls 2036 1372 Pls 2036 1380 Pls 2036 1416 Pls 2036 1420 Pls 2036 1386 Pls 2036 1399 Pls 2036 1373 Pls 2036 1390 Pls 2036 1378 Pls 2036 1435 Pls 2036 1398 Pls 2036 1388 Pls 2036 1413 Pls 2036 1388 Pls 2036 1385 Pls 2036 1408 Pls 2036 1386 Pls 2036 1399 Pls 2036 1394 Pls 2036 1382 Pls 2036 1399 Pls 2036 1424 Pls 2036 1398 Pls 2036 1381 Pls 2036 1405 Pls 2036 1379 Pls 2036 1420 Pls 2036 1471 Pls 2036 1393 Pls 2036 1420 Pls 2036 1399 Pls 2036 1384 Pls 2036 1429 Pls 2036 1395 Pls 2036 1395 Pls 2036 1471 Pls 2036 1410 Pls 2036 1389 Pls 2036 1400 Pls 2036 1415 Pls 2036 1373 Pls 2036 1384 Pls 2036 1378 Pls 2036 1384 Pls 2036 1395 Pls 2036 1386 Pls 2036 1408 Pls 2036 1394 Pls 2036 1405 Pls 2036 1466 Pls 2036 1416 Pls 2036 1391 Pls 2036 1379 Pls 2036 1386 Pls 2036 1389 Pls 2036 1421 Pls 2036 1385 Pls 2036 1395 Pls 2036 1414 Pls 2036 1372 Pls 2036 1386 Pls 2036 1416 Pls 2036 1380 Pls 2036 1418 Pls 2036 1389 Pls 2036 1394 Pls 2036 1410 Pls 2036 1381 Pls 2036 1400 Pls 2036 1395 Pls 2036 1411 Pls 2036 1405 Pls 2036 1396 Pls 2036 1414 Pls 2036 1405 Pls 2036 1386 Pls 2036 1429 Pls 2036 1407 Pls 2036 1396 Pls 2036 1422 Pls 2036 1393 Pls 2036 1394 Pls 2036 1411 Pls 2036 1414 Pls 2036 1392 Pls 2036 1395 Pls 2036 1382 Pls 2036 1396 Pls 2036 1394 Pls 2036 1395 Pls 2397 1384 Pls 2397 1476 Pls 2397 1575 Pls 2397 1564 Pls 2397 1686 Pls 2397 1537 Pls 2397 1660 Pls 2397 1568 Pls 2397 1620 Pls 2397 1677 Pls 2397 1735 Pls 2397 1556 Pls 2397 1659 Pls 2397 1553 Pls 2397 1674 Pls 2397 1559 Pls 2397 1592 Pls 2397 1578 Pls 2397 1520 Pls 2397 1586 Pls 2397 1562 Pls 2397 1667 Pls 2397 1545 Pls 2397 1729 Pls 2397 1555 Pls 2397 1575 Pls 2397 1556 Pls 2397 1557 Pls 2397 1561 Pls 2397 1562 Pls 2397 1568 Pls 2397 1661 Pls 2397 1559 Pls 2397 1586 Pls 2397 1556 Pls 2397 1577 Pls 2397 1567 Pls 2397 1553 Pls 2397 1551 Pls 2397 1553 Pls 2397 1552 Pls 2397 1576 Pls 2397 1546 Pls 2397 1566 Pls 2397 1547 Pls 2397 1570 Pls 2397 1558 Pls 2397 1565 Pls 2397 1559 Pls 2397 1557 Pls 2397 1571 Pls 2397 1551 Pls 2397 1555 Pls 2397 1569 Pls 2397 1621 Pls 2397 1557 Pls 2397 1561 Pls 2397 1549 Pls 2397 1553 Pls 2397 1583 Pls 2397 1562 Pls 2397 1554 Pls 2397 1563 Pls 2397 1556 Pls 2397 1561 Pls 2397 1561 Pls 2397 1570 Pls 2397 1553 Pls 2397 1552 Pls 2397 1568 Pls 2397 1557 Pls 2397 1574 Pls 2397 1549 Pls 2397 1578 Pls 2397 1558 Pls 2397 1548 Pls 2397 1553 Pls 2397 1559 Pls 2397 1556 Pls 2397 1609 Pls 2397 1575 Pls 2397 1561 Pls 2397 1570 Pls 2397 1551 Pls 2397 1569 Pls 2397 1553 Pls 2397 1569 Pls 2397 1575 Pls 2397 1574 Pls 2397 1566 Pls 2397 1566 Pls 2397 1566 Pls 2397 1570 Pls 2397 1578 Pls 2397 1559 Pls 2397 1554 Pls 2397 1554 Pls 2397 1555 Pls 2397 1559 Pls 2397 1555 Pls 2397 1555 Pls 2397 1558 Pls 2397 1572 Pls 2397 1557 Pls 2397 1599 Pls 2397 1604 Pls 2397 1562 Pls 2397 1574 Pls 2397 1556 Pls 2397 1575 Pls 2397 1556 Pls 2397 1553 Pls 2397 1552 Pls 2397 1554 Pls 2397 1570 Pls 2397 1545 Pls 2397 1581 Pls 2397 1575 Pls 2397 1550 Pls 2397 1558 Pls 2397 1570 Pls 2397 1566 Pls 2397 1567 Pls 2397 1561 Pls 2397 1552 Pls 2397 1556 Pls 2397 1567 Pls 2397 1572 Pls 2397 1571 Pls 2397 1565 Pls 2397 1572 Pls 2397 1571 Pls 2397 1556 Pls 2397 1561 Pls 2397 1555 Pls 2397 1588 Pls 2397 1574 Pls 2397 1573 Pls 2397 1553 Pls 2397 1606 Pls 2397 1570 Pls 2397 1565 Pls 2397 1549 Pls 2397 1565 Pls 2397 1551 Pls 2397 1554 Pls 2397 1578 Pls 2397 1571 Pls 2397 1554 Pls 2397 1556 Pls 2397 1554 Pls 2397 1612 Pls 2397 1569 Pls 2397 1561 Pls 2397 1549 Pls 2397 1556 Pls 2397 1549 Pls 2397 1574 Pls 2397 1554 Pls 2397 1573 Pls 2397 1564 Pls 2397 1553 Pls 2397 1564 Pls 2397 1600 Pls 2397 1566 Pls 2397 1560 Pls 2397 1569 Pls 2397 1550 Pls 2397 1569 Pls 2397 1556 Pls 2397 1545 Pls 2397 1561 Pls 2397 1549 Pls 2397 1546 Pls 2397 1564 Pls 2397 1548 Pls 2397 1555 Pls 2397 1563 Pls 2397 1569 Pls 2397 1552 Pls 2397 1554 Pls 2397 1597 Pls 2397 1552 Pls 2397 1557 Pls 2397 1569 Pls 2397 1572 Pls 2397 1562 Pls 2397 1557 Pls 2397 1571 Pls 2397 1555 Pls 2397 1548 Pls 2397 1552 Pls 2397 1559 Pls 2397 1546 Pls 2397 1558 Pls 2397 1554 Pls 2397 1556 Pls 2397 1562 Pls 2397 1552 Pls 2397 1569 Pls 2759 1576 Pls 2759 1751 Pls 2759 1741 Pls 2759 1720 Pls 2759 1737 Pls 2759 1749 Pls 2759 2362 Pls 2759 1720 Pls 2759 1722 Pls 2759 1750 Pls 2759 1717 Pls 2759 1737 Pls 2759 1710 Pls 2759 1714 Pls 2759 1755 Pls 2759 1751 Pls 2759 1723 Pls 2759 1761 Pls 2759 1753 Pls 2759 1711 Pls 2759 1751 Pls 2759 1702 Pls 2759 1754 Pls 2759 1751 Pls 2759 1742 Pls 2759 1750 Pls 2759 1747 Pls 2759 1738 Pls 2759 1736 Pls 2759 1755 Pls 2759 1736 Pls 2759 1738 Pls 2759 1734 Pls 2759 1770 Pls 2759 1742 Pls 2759 1767 Pls 2759 1748 Pls 2759 1757 Pls 2759 1743 Pls 2759 1732 Pls 2759 1742 Pls 2759 1812 Pls 2759 1736 Pls 2759 1767 Pls 2759 1736 Pls 2759 1743 Pls 2759 1751 Pls 2759 1747 Pls 2759 1743 Pls 2759 1765 Pls 2759 1749 Pls 2759 1747 Pls 2759 1745 Pls 2759 1743 Pls 2759 1743 Pls 2759 1739 Pls 2759 1758 Pls 2759 1746 Pls 2759 1746 Pls 2759 1748 Pls 2759 1748 Pls 2759 1747 Pls 2759 1743 Pls 2759 1743 Pls 2759 1737 Pls 2759 1739 Pls 2759 1750 Pls 2759 1743 Pls 2759 1751 Pls 2759 1739 Pls 2759 1753 Pls 2759 1741 Pls 2759 1736 Pls 2759 1750 Pls 2759 1743 Pls 2759 1736 Pls 2759 1739 Pls 2759 1771 Pls 2759 1770 Pls 2759 1752 Pls 2759 1752 Pls 2759 1751 Pls 2759 1745 Pls 2759 1744 Pls 2759 1747 Pls 2759 1741 Pls 2759 1737 Pls 2759 1748 Pls 2759 1735 Pls 2759 1747 Pls 2759 1736 Pls 2759 1737 Pls 2759 1747 Pls 2759 1736 Pls 2759 1759 Pls 2759 1741 Pls 2759 1735 Pls 2759 1738 Pls 2759 1745 Pls 2759 1755 Pls 2759 1749 Pls 2759 1745 Pls 2759 1747 Pls 2759 1740 Pls 2759 1740 Pls 2759 1747 Pls 2759 1737 Pls 2759 1739 Pls 2759 1742 Pls 2759 1739 Pls 2759 1727 Pls 2759 1746 Pls 2759 1737 Pls 2759 1738 Pls 2759 1750 Pls 2759 1750 Pls 2759 1752 Pls 2759 1737 Pls 2759 1735 Pls 2759 1742 Pls 2759 1741 Pls 2759 1741 Pls 2759 1771 Pls 2759 1734 Pls 2759 1766 Pls 2759 1747 Pls 2759 1735 Pls 2759 1745 Pls 2759 1737 Pls 2759 1765 Pls 2759 1738 Pls 2759 1749 Pls 2759 1759 Pls 2759 1741 Pls 2759 1750 Pls 2759 1738 Pls 2759 1745 Pls 2759 1751 Pls 2759 1739 Pls 2759 1754 Pls 2759 1736 Pls 2759 1745 Pls 2759 1741 Pls 2759 1741 Pls 2759 1752 Pls 2759 1745 Pls 2759 1743 Pls 2759 1748 Pls 2759 1739 Pls 2759 1746 Pls 2759 1738 Pls 2759 1738 Pls 2759 1745 Pls 2759 1733 Pls 2759 1736 Pls 2759 1747 Pls 2759 1736 Pls 2759 1749 Pls 2759 1750 Pls 2759 1748 Pls 2759 1743 Pls 2759 1742 Pls 2759 1735 Pls 2759 1739 Pls 2759 1745 Pls 2759 1739 Pls 2759 1737 Pls 2759 1735 Pls 2759 1745 Pls 2759 1741 Pls 2759 1735 Pls 2759 1751 Pls 2759 1736 Pls 2759 1655 Pls 2759 1742 Pls 2759 1762 Pls 2759 1750 Pls 2759 1745 Pls 2759 1748 Pls 2759 1735 Pls 2759 1737 Pls 2759 1739 Pls 2759 1742 Pls 2759 1751 Pls 2759 1746 Pls 2759 1742 Pls 2759 1739 Pls 2759 1741 Pls 2759 1747 Pls 2759 1736 Pls 2759 1737 Pls 2759 1741 Pls 2759 1750 Pls 2759 1739 Pls 2759 1745 Pls 2759 1746 Pls 2759 1740 Pls 2759 1735 Pls 2759 1737 Pls 2759 1737 Pls 3121 1688 Pls 3121 1869 Pls 3121 1936 Pls 3121 1933 Pls 3121 1913 Pls 3121 1936 Pls 3121 1908 Pls 3121 1892 Pls 3121 1941 Pls 3121 1899 Pls 3121 1935 Pls 3121 1901 Pls 3121 1927 Pls 3121 1871 Pls 3121 1935 Pls 3121 1941 Pls 3121 1939 Pls 3121 1854 Pls 3121 1927 Pls 3121 1972 Pls 3121 1922 Pls 3121 1949 Pls 3121 1930 Pls 3121 1933 Pls 3121 1928 Pls 3121 1923 Pls 3121 2086 Pls 3121 1929 Pls 3121 1926 Pls 3121 1950 Pls 3121 1919 Pls 3121 1936 Pls 3121 1922 Pls 3121 1927 Pls 3121 1926 Pls 3121 1930 Pls 3121 1929 Pls 3121 1927 Pls 3121 1924 Pls 3121 1927 Pls 3121 1960 Pls 3121 1922 Pls 3121 1926 Pls 3121 1931 Pls 3121 1929 Pls 3121 1922 Pls 3121 1927 Pls 3121 1924 Pls 3121 1926 Pls 3121 1928 Pls 3121 1930 Pls 3121 1930 Pls 3121 1931 Pls 3121 1932 Pls 3121 1925 Pls 3121 1939 Pls 3121 1921 Pls 3121 1921 Pls 3121 1923 Pls 3121 1927 Pls 3121 1921 Pls 3121 1921 Pls 3121 1923 Pls 3121 1929 Pls 3121 1945 Pls 3121 1928 Pls 3121 1941 Pls 3121 1922 Pls 3121 1928 Pls 3121 1926 Pls 3121 1928 Pls 3121 1937 Pls 3121 1931 Pls 3121 1940 Pls 3121 1928 Pls 3121 1927 Pls 3121 1931 Pls 3121 1939 Pls 3121 1919 Pls 3121 1922 Pls 3121 1931 Pls 3121 1926 Pls 3121 1925 Pls 3121 1930 Pls 3121 1927 Pls 3121 1923 Pls 3121 1927 Pls 3121 1927 Pls 3121 1922 Pls 3121 1935 Pls 3121 1929 Pls 3121 1928 Pls 3121 1933 Pls 3121 1930 Pls 3121 1947 Pls 3121 1926 Pls 3121 1925 Pls 3121 1931 Pls 3121 1921 Pls 3121 1924 Pls 3121 1918 Pls 3121 1914 Pls 3121 1927 Pls 3121 1926 Pls 3121 1935 Pls 3121 1925 Pls 3121 1925 Pls 3121 1930 Pls 3121 1938 Pls 3121 1925 Pls 3121 1928 Pls 3121 1936 Pls 3121 1926 Pls 3121 1933 Pls 3121 1928 Pls 3121 1935 Pls 3121 1919 Pls 3121 1927 Pls 3121 1925 Pls 3121 1926 Pls 3121 1930 Pls 3121 1929 Pls 3121 1921 Pls 3121 1924 Pls 3121 1935 Pls 3121 1922 Pls 3121 1951 Pls 3121 1923 Pls 3121 1932 Pls 3121 1925 Pls 3121 1935 Pls 3121 1926 Pls 3121 1932 Pls 3121 1926 Pls 3121 1924 Pls 3121 1936 Pls 3121 1942 Pls 3121 1935 Pls 3121 1929 Pls 3121 1937 Pls 3121 1923 Pls 3121 1925 Pls 3121 1922 Pls 3121 1936 Pls 3121 1926 Pls 3121 1926 Pls 3121 1926 Pls 3121 1928 Pls 3121 1929 Pls 3121 1925 Pls 3121 1936 Pls 3121 1927 Pls 3121 1932 Pls 3121 1926 Pls 3121 1936 Pls 3121 1921 Pls 3121 1924 Pls 3121 1933 Pls 3121 1923 Pls 3121 1930 Pls 3121 1921 Pls 3121 1927 Pls 3121 1946 Pls 3121 1923 Pls 3121 1930 Pls 3121 1923 Pls 3121 1929 Pls 3121 1924 Pls 3121 1929 Pls 3121 1937 Pls 3121 1928 Pls 3121 1931 Pls 3121 1921 Pls 3121 1933 Pls 3121 1925 Pls 3121 1933 Pls 3121 1925 Pls 3121 1925 Pls 3121 1930 Pls 3121 1920 Pls 3121 1933 Pls 3121 1926 Pls 3121 1935 Pls 3121 1923 Pls 3121 1926 Pls 3121 1923 Pls 3121 1932 Pls 3121 1924 Pls 3121 1922 Pls 3121 1929 Pls 3121 1944 Pls 3121 1926 Pls 3121 1932 Pls 3121 1932 Pls 3121 1935 Pls 3121 1942 Pls 3121 1924 Pls 3121 1927 Pls 3121 1930 Pls 3121 1920 Pls 3483 1911 Pls 3483 2130 Pls 3483 2147 Pls 3483 2145 Pls 3483 2145 Pls 3483 2151 Pls 3483 2140 Pls 3483 2186 Pls 3483 2105 Pls 3483 2161 Pls 3483 2126 Pls 3483 2139 Pls 3483 2154 Pls 3483 2103 Pls 3483 2141 Pls 3483 2144 Pls 3483 2137 Pls 3483 2135 Pls 3483 2145 Pls 3483 2152 Pls 3483 2141 Pls 3483 2142 Pls 3483 2136 Pls 3483 2135 Pls 3483 2140 Pls 3483 2143 Pls 3483 2138 Pls 3483 2149 Pls 3483 2140 Pls 3483 2138 Pls 3483 2136 Pls 3483 2142 Pls 3483 2137 Pls 3483 2142 Pls 3483 2136 Pls 3483 2138 Pls 3483 2135 Pls 3483 2147 Pls 3483 2130 Pls 3483 2153 Pls 3483 2134 Pls 3483 2141 Pls 3483 2144 Pls 3483 2157 Pls 3483 2161 Pls 3483 2129 Pls 3483 2135 Pls 3483 2137 Pls 3483 2150 Pls 3483 2144 Pls 3483 2141 Pls 3483 2151 Pls 3483 2131 Pls 3483 2146 Pls 3483 2143 Pls 3483 2142 Pls 3483 2140 Pls 3483 2143 Pls 3483 2146 Pls 3483 2133 Pls 3483 2146 Pls 3483 2141 Pls 3483 2139 Pls 3483 2140 Pls 3483 2143 Pls 3483 2136 Pls 3483 2139 Pls 3483 2148 Pls 3483 2140 Pls 3483 2142 Pls 3483 2139 Pls 3483 2139 Pls 3483 2141 Pls 3483 2135 Pls 3483 2142 Pls 3483 2141 Pls 3483 2135 Pls 3483 2140 Pls 3483 2137 Pls 3483 2131 Pls 3483 2143 Pls 3483 2140 Pls 3483 2135 Pls 3483 2147 Pls 3483 2152 Pls 3483 2139 Pls 3483 2142 Pls 3483 2141 Pls 3483 2143 Pls 3483 2132 Pls 3483 2136 Pls 3483 2136 Pls 3483 2156 Pls 3483 2143 Pls 3483 2147 Pls 3483 2141 Pls 3483 2142 Pls 3483 2148 Pls 3483 2138 Pls 3483 2156 Pls 3483 2131 Pls 3483 2154 Pls 3483 2138 Pls 3483 2150 Pls 3483 2134 Pls 3483 2143 Pls 3483 2148 Pls 3483 2136 Pls 3483 2142 Pls 3483 2138 Pls 3483 2141 Pls 3483 2153 Pls 3483 2137 Pls 3483 2143 Pls 3483 2136 Pls 3483 2155 Pls 3483 2137 Pls 3483 2142 Pls 3483 2125 Pls 3483 2139 Pls 3483 2139 Pls 3483 2148 Pls 3483 2141 Pls 3483 2144 Pls 3483 2137 Pls 3483 2263 Pls 3483 2089 Pls 3483 2132 Pls 3483 2141 Pls 3483 2145 Pls 3483 2140 Pls 3483 2140 Pls 3483 2134 Pls 3483 2144 Pls 3483 2147 Pls 3483 2139 Pls 3483 2135 Pls 3483 2143 Pls 3483 2142 Pls 3483 2135 Pls 3483 2150 Pls 3483 2137 Pls 3483 2146 Pls 3483 2149 Pls 3483 2135 Pls 3483 2156 Pls 3483 2143 Pls 3483 2140 Pls 3483 2142 Pls 3483 2148 Pls 3483 2142 Pls 3483 2134 Pls 3483 2142 Pls 3483 2140 Pls 3483 2143 Pls 3483 2140 Pls 3483 2141 Pls 3483 2140 Pls 3483 2149 Pls 3483 2135 Pls 3483 2142 Pls 3483 2138 Pls 3483 2148 Pls 3483 2130 Pls 3483 2148 Pls 3483 2133 Pls 3483 2152 Pls 3483 2137 Pls 3483 2140 Pls 3483 2138 Pls 3483 2144 Pls 3483 2130 Pls 3483 2146 Pls 3483 2139 Pls 3483 2130 Pls 3483 2140 Pls 3483 2146 Pls 3483 2140 Pls 3483 2147 Pls 3483 2138 Pls 3483 2138 Pls 3483 2147 Pls 3483 2137 Pls 3483 2144 Pls 3483 2139 Pls 3483 2157 Pls 3483 2134 Pls 3483 2140 Pls 3483 2149 Pls 3483 2140 Pls 3483 2140 Pls 3483 2141 Pls 3483 2150 Pls 3483 2134 Pls 3483 2144 Pls 3483 2139 Pls 3483 2141 Pls 3483 2136 Pls 3483 2138 Pls 3483 2143 Pls 3845 2267 Pls 3845 2272 Pls 3845 2309 Pls 3845 2310 Pls 3845 2250 Pls 3845 2276 Pls 3845 2301 Pls 3845 2308 Pls 3845 2315 Pls 3845 2314 Pls 3845 2331 Pls 3845 2313 Pls 3845 2312 Pls 3845 2311 Pls 3845 2311 Pls 3845 2318 Pls 3845 2312 Pls 3845 2304 Pls 3845 2324 Pls 3845 2320 Pls 3845 2308 Pls 3845 2306 Pls 3845 2313 Pls 3845 2313 Pls 3845 2317 Pls 3845 2314 Pls 3845 2313 Pls 3845 2308 Pls 3845 2312 Pls 3845 2310 Pls 3845 2316 Pls 3845 2309 Pls 3845 2313 Pls 3845 2319 Pls 3845 2306 Pls 3845 2310 Pls 3845 2358 Pls 3845 2251 Pls 3845 2361 Pls 3845 2243 Pls 3845 2290 Pls 3845 2307 Pls 3845 2361 Pls 3845 2277 Pls 3845 2307 Pls 3845 2437 Pls 3845 2248 Pls 3845 2530 Pls 3845 2279 Pls 3845 2304 Pls 3845 2312 Pls 3845 2304 Pls 3845 2312 Pls 3845 2311 Pls 3845 2305 Pls 3845 2312 Pls 3845 2316 Pls 3845 2315 Pls 3845 2315 Pls 3845 2298 Pls 3845 2313 Pls 3845 2543 Pls 3845 2250 Pls 3845 2306 Pls 3845 2305 Pls 3845 2302 Pls 3845 2310 Pls 3845 2322 Pls 3845 2314 Pls 3845 2318 Pls 3845 2308 Pls 3845 2315 Pls 3845 2310 Pls 3845 2309 Pls 3845 2313 Pls 3845 2320 Pls 3845 2308 Pls 3845 2316 Pls 3845 2311 Pls 3845 2314 Pls 3845 2309 Pls 3845 2313 Pls 3845 2321 Pls 3845 2309 Pls 3845 2313 Pls 3845 2308 Pls 3845 2309 Pls 3845 2312 Pls 3845 2324 Pls 3845 2302 Pls 3845 2311 Pls 3845 2311 Pls 3845 2319 Pls 3845 2311 Pls 3845 2314 Pls 3845 2314 Pls 3845 2324 Pls 3845 2304 Pls 3845 2316 Pls 3845 2320 Pls 3845 2309 Pls 3845 2319 Pls 3845 2315 Pls 3845 2315 Pls 3845 2307 Pls 3845 2312 Pls 3845 2312 Pls 3845 2308 Pls 3845 2305 Pls 3845 2310 Pls 3845 2264 Pls 3845 2315 Pls 3845 2307 Pls 3845 2312 Pls 3845 2306 Pls 3845 2313 Pls 3845 2306 Pls 3845 2315 Pls 3845 2312 Pls 3845 2315 Pls 3845 2313 Pls 3845 2304 Pls 3845 2315 Pls 3845 2310 Pls 3845 2310 Pls 3845 2312 Pls 3845 2317 Pls 3845 2310 Pls 3845 2314 Pls 3845 2310 Pls 3845 2309 Pls 3845 2315 Pls 3845 2312 Pls 3845 2313 Pls 3845 2323 Pls 3845 2315 Pls 3845 2312 Pls 3845 2303 Pls 3845 2313 Pls 3845 2316 Pls 3845 2310 Pls 3845 2311 Pls 3845 2315 Pls 3845 2328 Pls 3845 2311 Pls 3845 2317 Pls 3845 2306 Pls 3845 2322 Pls 3845 2318 Pls 3845 2305 Pls 3845 2310 Pls 3845 2310 Pls 3845 2306 Pls 3845 2316 Pls 3845 2307 Pls 3845 2311 Pls 3845 2310 Pls 3845 2311 Pls 3845 2308 Pls 3845 2312 Pls 3845 2322 Pls 3845 2307 Pls 3845 2323 Pls 3845 2307 Pls 3845 2311 Pls 3845 2316 Pls 3845 2315 Pls 3845 2304 Pls 3845 2310 Pls 3845 2308 Pls 3845 2317 Pls 3845 2311 Pls 3845 2311 Pls 3845 2319 Pls 3845 2306 Pls 3845 2311 Pls 3845 2311 Pls 3845 2328 Pls 3845 2307 Pls 3845 2315 Pls 3845 2315 Pls 3845 2309 Pls 3845 2311 Pls 3845 2309 Pls 3845 2309 Pls 3845 2312 Pls 3845 2308 Pls 3845 2311 Pls 3845 2312 Pls 3845 2315 Pls 3845 2303 Pls 3845 2316 Pls 3845 2307 Pls 3845 2305 Pls 3845 2310 Pls 3845 2305 Pls 3845 2300 Pls 3845 2312 Pls 3845 2314 Pls 3845 2313 Pls 4206 2413 Pls 4206 2653 Pls 4206 2462 Pls 4206 2491 Pls 4206 2495 Pls 4206 2494 Pls 4206 2501 Pls 4206 2494 Pls 4206 2501 Pls 4206 2496 Pls 4206 2492 Pls 4206 2516 Pls 4206 2491 Pls 4206 2498 Pls 4206 2496 Pls 4206 2500 Pls 4206 2495 Pls 4206 2498 Pls 4206 2496 Pls 4206 2498 Pls 4206 2491 Pls 4206 2497 Pls 4206 2497 Pls 4206 2500 Pls 4206 2500 Pls 4206 2492 Pls 4206 2497 Pls 4206 2493 Pls 4206 2496 Pls 4206 2502 Pls 4206 2497 Pls 4206 2498 Pls 4206 2501 Pls 4206 2501 Pls 4206 2501 Pls 4206 2499 Pls 4206 2498 Pls 4206 2494 Pls 4206 2497 Pls 4206 2489 Pls 4206 2501 Pls 4206 2495 Pls 4206 2499 Pls 4206 2496 Pls 4206 2502 Pls 4206 2493 Pls 4206 2503 Pls 4206 2827 Pls 4206 2487 Pls 4206 2492 Pls 4206 2495 Pls 4206 2497 Pls 4206 2494 Pls 4206 2496 Pls 4206 2499 Pls 4206 2498 Pls 4206 2496 Pls 4206 2500 Pls 4206 2498 Pls 4206 2500 Pls 4206 2500 Pls 4206 2495 Pls 4206 2502 Pls 4206 2493 Pls 4206 2490 Pls 4206 2494 Pls 4206 2503 Pls 4206 2497 Pls 4206 2498 Pls 4206 2501 Pls 4206 2497 Pls 4206 2499 Pls 4206 2497 Pls 4206 2500 Pls 4206 2498 Pls 4206 2505 Pls 4206 2501 Pls 4206 2490 Pls 4206 2495 Pls 4206 2499 Pls 4206 2501 Pls 4206 2496 Pls 4206 2498 Pls 4206 2499 Pls 4206 2496 Pls 4206 2495 Pls 4206 2500 Pls 4206 2495 Pls 4206 2495 Pls 4206 2502 Pls 4206 2497 Pls 4206 2501 Pls 4206 2497 Pls 4206 2501 Pls 4206 2499 Pls 4206 2500 Pls 4206 2499 Pls 4206 2502 Pls 4206 2497 Pls 4206 2495 Pls 4206 2496 Pls 4206 2493 Pls 4206 2494 Pls 4206 2500 Pls 4206 2499 Pls 4206 2500 Pls 4206 2501 Pls 4206 2497 Pls 4206 2498 Pls 4206 2496 Pls 4206 2500 Pls 4206 2492 Pls 4206 2489 Pls 4206 2495 Pls 4206 2492 Pls 4206 2495 Pls 4206 2502 Pls 4206 2497 Pls 4206 2501 Pls 4206 2495 Pls 4206 2500 Pls 4206 2497 Pls 4206 2499 Pls 4206 2500 Pls 4206 2500 Pls 4206 2495 Pls 4206 2495 Pls 4206 2504 Pls 4206 2495 Pls 4206 2492 Pls 4206 2496 Pls 4206 2500 Pls 4206 2502 Pls 4206 2494 Pls 4206 2499 Pls 4206 2497 Pls 4206 2506 Pls 4206 2496 Pls 4206 2500 Pls 4206 2497 Pls 4206 2498 Pls 4206 2501 Pls 4206 2499 Pls 4206 2494 Pls 4206 2498 Pls 4206 2494 Pls 4206 2496 Pls 4206 2492 Pls 4206 2497 Pls 4206 2560 Pls 4206 2449 Pls 4206 2550 Pls 4206 2452 Pls 4206 2533 Pls 4206 2459 Pls 4206 2550 Pls 4206 2449 Pls 4206 2496 Pls 4206 2491 Pls 4206 2496 Pls 4206 2559 Pls 4206 2478 Pls 4206 2501 Pls 4206 2493 Pls 4206 2497 Pls 4206 2495 Pls 4206 2497 Pls 4206 2491 Pls 4206 2494 Pls 4206 2497 Pls 4206 2498 Pls 4206 2494 Pls 4206 2494 Pls 4206 2497 Pls 4206 2496 Pls 4206 2499 Pls 4206 2501 Pls 4206 2496 Pls 4206 2505 Pls 4206 2487 Pls 4206 2491 Pls 4206 2496 Pls 4206 2497 Pls 4206 2498 Pls 4206 2502 Pls 4206 2496 Pls 4206 2501 Pls 4206 2500 Pls 4206 2498 Pls 4206 2499 Pls 4206 2501 Pls 4206 2863 Pls 4206 2462 Pls 4206 2490 Pls 4206 2491 Pls 4206 2494 Pls 4206 2502 Pls 4206 2494 Pls 4206 2496 Pls 4206 2499 Pls 4568 2838 Pls 4568 2830 Pls 4568 2823 Pls 4568 2825 Pls 4568 2825 Pls 4568 2826 Pls 4568 2827 Pls 4568 2833 Pls 4568 2828 Pls 4568 2828 Pls 4568 2828 Pls 4568 2820 Pls 4568 2820 Pls 4568 2828 Pls 4568 2820 Pls 4568 2825 Pls 4568 2819 Pls 4568 2829 Pls 4568 2820 Pls 4568 2822 Pls 4568 2822 Pls 4568 2823 Pls 4568 2828 Pls 4568 2821 Pls 4568 2826 Pls 4568 2824 Pls 4568 2849 Pls 4568 2823 Pls 4568 2822 Pls 4568 2822 Pls 4568 2827 Pls 4568 2822 Pls 4568 2825 Pls 4568 2822 Pls 4568 2827 Pls 4568 2834 Pls 4568 2828 Pls 4568 2823 Pls 4568 2819 Pls 4568 2814 Pls 4568 2821 Pls 4568 2816 Pls 4568 2820 Pls 4568 2816 Pls 4568 2815 Pls 4568 2815 Pls 4568 2822 Pls 4568 2819 Pls 4568 2819 Pls 4568 2822 Pls 4568 2821 Pls 4568 2824 Pls 4568 2827 Pls 4568 2823 Pls 4568 2821 Pls 4568 2822 Pls 4568 2832 Pls 4568 2827 Pls 4568 2829 Pls 4568 2825 Pls 4568 2820 Pls 4568 2823 Pls 4568 2826 Pls 4568 2818 Pls 4568 2967 Pls 4568 2823 Pls 4568 2828 Pls 4568 2822 Pls 4568 2821 Pls 4568 2823 Pls 4568 2828 Pls 4568 2823 Pls 4568 2819 Pls 4568 2831 Pls 4568 2820 Pls 4568 2821 Pls 4568 2818 Pls 4568 2820 Pls 4568 2828 Pls 4568 2853 Pls 4568 2829 Pls 4568 2823 Pls 4568 2824 Pls 4568 2829 Pls 4568 2823 Pls 4568 2832 Pls 4568 2827 Pls 4568 2828 Pls 4568 2824 Pls 4568 2829 Pls 4568 2832 Pls 4568 2823 Pls 4568 2831 Pls 4568 2821 Pls 4568 2825 Pls 4568 2822 Pls 4568 2827 Pls 4568 2824 Pls 4568 2821 Pls 4568 2930 Pls 4568 2818 Pls 4568 2829 Pls 4568 2820 Pls 4568 2824 Pls 4568 2822 Pls 4568 2827 Pls 4568 2829 Pls 4568 2827 Pls 4568 2832 Pls 4568 2868 Pls 4568 2821 Pls 4568 2830 Pls 4568 2819 Pls 4568 2826 Pls 4568 2822 Pls 4568 2821 Pls 4568 2826 Pls 4568 2819 Pls 4568 2821 Pls 4568 2822 Pls 4568 2826 Pls 4568 2822 Pls 4568 2824 Pls 4568 2823 Pls 4568 2819 Pls 4568 2823 Pls 4568 2820 Pls 4568 2826 Pls 4568 2820 Pls 4568 2823 Pls 4568 2833 Pls 4568 2837 Pls 4568 2830 Pls 4568 2823 Pls 4568 2828 Pls 4568 2823 Pls 4568 2828 Pls 4568 2821 Pls 4568 2825 Pls 4568 2825 Pls 4568 2821 Pls 4568 2824 Pls 4568 2827 Pls 4568 2822 Pls 4568 2822 Pls 4568 2823 Pls 4568 2820 Pls 4568 2822 Pls 4568 2819 Pls 4568 2826 Pls 4568 2828 Pls 4568 2823 Pls 4568 2826 Pls 4568 2820 Pls 4568 2875 Pls 4568 2816 Pls 4568 2824 Pls 4568 2827 Pls 4568 2819 Pls 4568 2823 Pls 4568 2818 Pls 4568 2830 Pls 4568 2821 Pls 4568 2828 Pls 4568 2825 Pls 4568 2819 Pls 4568 2826 Pls 4568 2818 Pls 4568 2825 Pls 4568 2821 Pls 4568 2827 Pls 4568 2819 Pls 4568 2821 Pls 4568 2824 Pls 4568 2828 Pls 4568 2823 Pls 4568 2821 Pls 4568 2820 Pls 4568 2820 Pls 4568 2827 Pls 4568 2818 Pls 4568 2824 Pls 4568 2819 Pls 4568 2850 Pls 4568 2826 Pls 4568 2821 Pls 4568 2880 Pls 4568 2825 Pls 4568 2880 Pls 4568 2828 Pls 4568 2876 Pls 4568 2828 Pls 4568 2826 Pls 4568 2859 Pls 4568 2849 Pls 4568 2843 Pls 4568 2872 Pls 4568 2825 Pls 4568 2826 Pls 4568 2833 Pls 4930 3080 Pls 4930 3075 Pls 4930 3077 Pls 4930 3071 Pls 4930 3074 Pls 4930 3071 Pls 4930 3168 Pls 4930 3072 Pls 4930 3079 Pls 4930 3073 Pls 4930 3079 Pls 4930 3080 Pls 4930 3079 Pls 4930 3075 Pls 4930 3078 Pls 4930 3075 Pls 4930 3078 Pls 4930 3076 Pls 4930 3075 Pls 4930 3071 Pls 4930 3083 Pls 4930 3074 Pls 4930 3069 Pls 4930 3066 Pls 4930 3064 Pls 4930 3074 Pls 4930 3067 Pls 4930 3078 Pls 4930 3072 Pls 4930 3155 Pls 4930 3072 Pls 4930 3077 Pls 4930 3075 Pls 4930 3133 Pls 4930 3073 Pls 4930 3077 Pls 4930 3071 Pls 4930 3072 Pls 4930 3079 Pls 4930 3076 Pls 4930 3072 Pls 4930 3081 Pls 4930 3071 Pls 4930 3075 Pls 4930 3071 Pls 4930 3074 Pls 4930 3073 Pls 4930 3079 Pls 4930 3071 Pls 4930 3156 Pls 4930 3073 Pls 4930 3078 Pls 4930 3072 Pls 4930 3073 Pls 4930 3078 Pls 4930 3072 Pls 4930 3080 Pls 4930 3072 Pls 4930 3163 Pls 4930 3072 Pls 4930 3074 Pls 4930 3079 Pls 4930 3074 Pls 4930 3073 Pls 4930 3074 Pls 4930 3084 Pls 4930 3112 Pls 4930 3082 Pls 4930 3073 Pls 4930 3081 Pls 4930 3071 Pls 4930 3073 Pls 4930 3070 Pls 4930 3072 Pls 4930 3073 Pls 4930 3072 Pls 4930 3080 Pls 4930 3072 Pls 4930 3071 Pls 4930 3112 Pls 4930 3067 Pls 4930 3078 Pls 4930 3069 Pls 4930 3081 Pls 4930 3074 Pls 4930 3072 Pls 4930 3080 Pls 4930 3130 Pls 4930 3078 Pls 4930 3079 Pls 4930 3071 Pls 4930 3073 Pls 4930 3131 Pls 4930 3078 Pls 4930 3073 Pls 4930 3080 Pls 4930 3071 Pls 4930 3079 Pls 4930 3072 Pls 4930 3108 Pls 4930 3071 Pls 4930 3120 Pls 4930 3071 Pls 4930 3077 Pls 4930 3070 Pls 4930 3075 Pls 4930 3071 Pls 4930 3123 Pls 4930 3074 Pls 4930 3136 Pls 4930 3072 Pls 4930 3074 Pls 4930 3070 Pls 4930 3111 Pls 4930 3071 Pls 4930 3118 Pls 4930 3072 Pls 4930 3101 Pls 4930 3075 Pls 4930 3075 Pls 4930 3075 Pls 4930 3081 Pls 4930 3072 Pls 4930 3078 Pls 4930 3071 Pls 4930 3078 Pls 4930 3074 Pls 4930 3074 Pls 4930 3078 Pls 4930 3142 Pls 4930 3092 Pls 4930 3077 Pls 4930 3144 Pls 4930 3072 Pls 4930 3073 Pls 4930 3065 Pls 4930 3067 Pls 4930 3065 Pls 4930 3073 Pls 4930 3073 Pls 4930 3079 Pls 4930 3075 Pls 4930 3081 Pls 4930 3072 Pls 4930 3077 Pls 4930 3084 Pls 4930 3077 Pls 4930 3123 Pls 4930 3086 Pls 4930 3074 Pls 4930 3083 Pls 4930 3074 Pls 4930 3083 Pls 4930 3115 Pls 4930 3082 Pls 4930 3078 Pls 4930 3084 Pls 4930 3078 Pls 4930 3083 Pls 4930 3140 Pls 4930 3076 Pls 4930 3081 Pls 4930 3117 Pls 4930 3076 Pls 4930 3085 Pls 4930 3072 Pls 4930 3161 Pls 4930 3078 Pls 4930 3077 Pls 4930 3076 Pls 4930 3082 Pls 4930 3091 Pls 4930 3100 Pls 4930 3140 Pls 4930 3084 Pls 4930 3080 Pls 4930 3085 Pls 4930 3074 Pls 4930 3085 Pls 4930 3110 Pls 4930 3083 Pls 4930 3074 Pls 4930 3079 Pls 4930 3073 Pls 4930 3084 Pls 4930 3073 Pls 4930 3077 Pls 4930 3072 Pls 4930 3084 Pls 4930 3073 Pls 4930 3161 Pls 4930 3067 Pls 4930 3076 Pls 4930 3070 Pls 4930 3082 Pls 4930 3111 Pls 4930 3072 Pls 4930 3080 Pls 4930 3071 Pls 4930 3072 Pls 5292 3324 Pls 5292 3329 Pls 5292 3323 Pls 5292 3328 Pls 5292 3324 Pls 5292 3325 Pls 5292 3329 Pls 5292 3325 Pls 5292 3328 Pls 5292 3324 Pls 5292 3328 Pls 5292 3323 Pls 5292 3323 Pls 5292 3329 Pls 5292 3323 Pls 5292 3329 Pls 5292 3322 Pls 5292 3318 Pls 5292 3315 Pls 5292 3322 Pls 5292 3332 Pls 5292 3327 Pls 5292 3329 Pls 5292 3322 Pls 5292 3327 Pls 5292 3323 Pls 5292 3324 Pls 5292 3328 Pls 5292 3321 Pls 5292 3328 Pls 5292 3322 Pls 5292 3329 Pls 5292 3324 Pls 5292 3327 Pls 5292 3326 Pls 5292 3327 Pls 5292 3322 Pls 5292 3324 Pls 5292 3329 Pls 5292 3323 Pls 5292 3328 Pls 5292 3324 Pls 5292 3322 Pls 5292 3329 Pls 5292 3321 Pls 5292 3328 Pls 5292 3321 Pls 5292 3323 Pls 5292 3326 Pls 5292 3327 Pls 5292 3324 Pls 5292 3333 Pls 5292 3323 Pls 5292 3329 Pls 5292 3322 Pls 5292 3328 Pls 5292 3324 Pls 5292 3328 Pls 5292 3323 Pls 5292 3327 Pls 5292 3323 Pls 5292 3329 Pls 5292 3325 Pls 5292 3321 Pls 5292 3328 Pls 5292 3323 Pls 5292 3329 Pls 5292 3325 Pls 5292 3329 Pls 5292 3324 Pls 5292 3328 Pls 5292 3323 Pls 5292 3328 Pls 5292 3323 Pls 5292 3327 Pls 5292 3319 Pls 5292 3325 Pls 5292 3320 Pls 5292 3330 Pls 5292 3325 Pls 5292 3329 Pls 5292 3325 Pls 5292 3328 Pls 5292 3322 Pls 5292 3328 Pls 5292 3324 Pls 5292 3321 Pls 5292 3324 Pls 5292 3329 Pls 5292 3322 Pls 5292 3336 Pls 5292 3325 Pls 5292 3329 Pls 5292 3325 Pls 5292 3324 Pls 5292 3324 Pls 5292 3322 Pls 5292 3329 Pls 5292 3321 Pls 5292 3328 Pls 5292 3320 Pls 5292 3327 Pls 5292 3324 Pls 5292 3329 Pls 5292 3325 Pls 5292 3325 Pls 5292 3319 Pls 5292 3327 Pls 5292 3323 Pls 5292 3327 Pls 5292 3323 Pls 5292 3328 Pls 5292 3323 Pls 5292 3329 Pls 5292 3321 Pls 5292 3327 Pls 5292 3321 Pls 5292 3327 Pls 5292 3324 Pls 5292 3391 Pls 5292 3323 Pls 5292 3328 Pls 5292 3321 Pls 5292 3329 Pls 5292 3327 Pls 5292 3329 Pls 5292 3325 Pls 5292 3335 Pls 5292 3370 Pls 5292 3334 Pls 5292 3328 Pls 5292 3400 Pls 5292 3328 Pls 5292 3323 Pls 5292 3318 Pls 5292 3329 Pls 5292 3323 Pls 5292 3329 Pls 5292 3322 Pls 5292 3323 Pls 5292 3322 Pls 5292 3328 Pls 5292 3322 Pls 5292 3325 Pls 5292 3321 Pls 5292 3331 Pls 5292 3321 Pls 5292 3324 Pls 5292 3329 Pls 5292 3323 Pls 5292 3321 Pls 5292 3322 Pls 5292 3328 Pls 5292 3323 Pls 5292 3329 Pls 5292 3324 Pls 5292 3322 Pls 5292 3329 Pls 5292 3324 Pls 5292 3325 Pls 5292 3323 Pls 5292 3328 Pls 5292 3322 Pls 5292 3319 Pls 5292 3322 Pls 5292 3328 Pls 5292 3323 Pls 5292 3321 Pls 5292 3322 Pls 5292 3321 Pls 5292 3329 Pls 5292 3323 Pls 5292 3324 Pls 5292 3327 Pls 5292 3323 Pls 5292 3328 Pls 5292 3325 Pls 5292 3329 Pls 5292 3324 Pls 5292 3322 Pls 5292 3327 Pls 5292 3325 Pls 5292 3322 Pls 5292 3328 Pls 5292 3321 Pls 5292 3324 Pls 5292 3321 Pls 5292 3331 Pls 5292 3323 Pls 5292 3328 Pls 5292 3320 Pls 5292 3322 Pls 5292 3317 Pls 5292 3320 Pls 5292 3324 Pls 5292 3329 Pls 5292 3324 Pls 5292 3321 Pls 5292 3400 Pls 5292 3332 Pls 5653 3576 Pls 5653 3588 Pls 5653 3579 Pls 5653 3609 Pls 5653 3574 Pls 5653 3582 Pls 5653 3576 Pls 5653 3577 Pls 5653 3583 Pls 5653 3578 Pls 5653 3576 Pls 5653 3578 Pls 5653 3575 Pls 5653 3584 Pls 5653 3576 Pls 5653 3580 Pls 5653 3608 Pls 5653 3577 Pls 5653 3575 Pls 5653 3574 Pls 5653 3575 Pls 5653 3596 Pls 5653 3580 Pls 5653 3607 Pls 5653 3577 Pls 5653 3575 Pls 5653 3600 Pls 5653 3577 Pls 5653 3575 Pls 5653 3577 Pls 5653 3576 Pls 5653 3578 Pls 5653 3575 Pls 5653 3599 Pls 5653 3577 Pls 5653 3612 Pls 5653 3575 Pls 5653 3613 Pls 5653 3575 Pls 5653 3626 Pls 5653 3574 Pls 5653 3580 Pls 5653 3575 Pls 5653 3585 Pls 5653 3578 Pls 5653 3580 Pls 5653 3601 Pls 5653 3595 Pls 5653 3577 Pls 5653 3577 Pls 5653 3574 Pls 5653 3583 Pls 5653 3576 Pls 5653 3585 Pls 5653 3575 Pls 5653 3582 Pls 5653 3575 Pls 5653 3577 Pls 5653 3574 Pls 5653 3582 Pls 5653 3575 Pls 5653 3580 Pls 5653 3570 Pls 5653 3574 Pls 5653 3578 Pls 5653 3580 Pls 5653 3575 Pls 5653 3579 Pls 5653 3575 Pls 5653 3581 Pls 5653 3582 Pls 5653 3575 Pls 5653 3581 Pls 5653 3573 Pls 5653 3582 Pls 5653 3580 Pls 5653 3571 Pls 5653 3572 Pls 5653 3577 Pls 5653 3581 Pls 5653 3580 Pls 5653 3575 Pls 5653 3579 Pls 5653 3575 Pls 5653 3581 Pls 5653 3578 Pls 5653 3580 Pls 5653 3576 Pls 5653 3579 Pls 5653 3575 Pls 5653 3579 Pls 5653 3573 Pls 5653 3579 Pls 5653 3576 Pls 5653 3576 Pls 5653 3576 Pls 5653 3574 Pls 5653 3576 Pls 5653 3575 Pls 5653 3576 Pls 5653 3582 Pls 5653 3573 Pls 5653 3576 Pls 5653 3579 Pls 5653 3574 Pls 5653 3576 Pls 5653 3573 Pls 5653 3574 Pls 5653 3583 Pls 5653 3576 Pls 5653 3583 Pls 5653 3572 Pls 5653 3585 Pls 5653 3576 Pls 5653 3583 Pls 5653 3575 Pls 5653 3583 Pls 5653 3574 Pls 5653 3574 Pls 5653 3578 Pls 5653 3576 Pls 5653 3574 Pls 5653 3581 Pls 5653 3574 Pls 5653 3573 Pls 5653 3583 Pls 5653 3574 Pls 5653 3584 Pls 5653 3573 Pls 5653 3581 Pls 5653 3574 Pls 5653 3581 Pls 5653 3574 Pls 5653 3579 Pls 5653 3582 Pls 5653 3573 Pls 5653 3582 Pls 5653 3574 Pls 5653 3580 Pls 5653 3573 Pls 5653 3579 Pls 5653 3573 Pls 5653 3574 Pls 5653 3580 Pls 5653 3574 Pls 5653 3579 Pls 5653 3573 Pls 5653 3580 Pls 5653 3579 Pls 5653 3574 Pls 5653 3569 Pls 5653 3580 Pls 5653 3574 Pls 5653 3579 Pls 5653 3574 Pls 5653 3577 Pls 5653 3580 Pls 5653 3573 Pls 5653 3578 Pls 5653 3573 Pls 5653 3575 Pls 5653 3573 Pls 5653 3575 Pls 5653 3579 Pls 5653 3567 Pls 5653 3573 Pls 5653 3575 Pls 5653 3574 Pls 5653 3573 Pls 5653 3583 Pls 5653 3574 Pls 5653 3578 Pls 5653 3572 Pls 5653 3575 Pls 5653 3574 Pls 5653 3575 Pls 5653 3573 Pls 5653 3579 Pls 5653 3573 Pls 5653 3577 Pls 5653 3572 Pls 5653 3578 Pls 5653 3574 Pls 5653 3582 Pls 5653 3575 Pls 5653 3579 Pls 5653 3573 Pls 5653 3579 Pls 5653 3573 Pls 5653 3580 Pls 5653 3576 Pls 5653 3579 Pls 5653 3572 Pls 5653 3572 Pls 5653 3568 Pls 5653 3582 Pls 5653 3576 Pls 5653 3581 Pls 5653 3572 Pls 5653 3579 Pls 6015 3829 Pls 6015 3831 Pls 6015 3824 Pls 6015 3832 Pls 6015 3824 Pls 6015 3830 Pls 6015 3823 Pls 6015 3831 Pls 6015 3825 Pls 6015 3826 Pls 6015 3826 Pls 6015 3825 Pls 6015 3831 Pls 6015 3823 Pls 6015 3831 Pls 6015 3826 Pls 6015 3830 Pls 6015 3826 Pls 6015 3831 Pls 6015 3825 Pls 6015 3827 Pls 6015 3826 Pls 6015 3830 Pls 6015 3824 Pls 6015 3825 Pls 6015 3826 Pls 6015 3830 Pls 6015 3824 Pls 6015 3825 Pls 6015 3825 Pls 6015 3830 Pls 6015 3825 Pls 6015 3827 Pls 6015 3825 Pls 6015 3831 Pls 6015 3823 Pls 6015 3839 Pls 6015 3826 Pls 6015 3824 Pls 6015 3826 Pls 6015 3824 Pls 6015 3825 Pls 6015 3827 Pls 6015 3824 Pls 6015 3824 Pls 6015 3831 Pls 6015 3824 Pls 6015 3831 Pls 6015 3826 Pls 6015 3831 Pls 6015 3822 Pls 6015 3824 Pls 6015 3826 Pls 6015 3825 Pls 6015 3831 Pls 6015 3824 Pls 6015 3826 Pls 6015 3823 Pls 6015 3830 Pls 6015 3824 Pls 6015 3830 Pls 6015 3826 Pls 6015 3832 Pls 6015 3825 Pls 6015 3825 Pls 6015 3828 Pls 6015 3825 Pls 6015 3831 Pls 6015 3824 Pls 6015 3831 Pls 6015 3825 Pls 6015 3832 Pls 6015 3824 Pls 6015 3830 Pls 6015 3827 Pls 6015 3824 Pls 6015 3831 Pls 6015 3824 Pls 6015 3831 Pls 6015 3822 Pls 6015 3830 Pls 6015 3826 Pls 6015 3830 Pls 6015 3824 Pls 6015 3826 Pls 6015 3832 Pls 6015 3825 Pls 6015 3829 Pls 6015 3824 Pls 6015 3826 Pls 6015 3825 Pls 6015 3831 Pls 6015 3826 Pls 6015 3830 Pls 6015 3827 Pls 6015 3832 Pls 6015 3824 Pls 6015 3826 Pls 6015 3824 Pls 6015 3828 Pls 6015 3830 Pls 6015 3826 Pls 6015 3829 Pls 6015 3826 Pls 6015 3830 Pls 6015 3827 Pls 6015 3825 Pls 6015 3831 Pls 6015 3826 Pls 6015 3827 Pls 6015 3825 Pls 6015 3830 Pls 6015 3825 Pls 6015 3826 Pls 6015 3824 Pls 6015 3830 Pls 6015 3823 Pls 6015 3831 Pls 6015 3824 Pls 6015 3829 Pls 6015 3825 Pls 6015 3831 Pls 6015 3824 Pls 6015 3829 Pls 6015 3825 Pls 6015 3824 Pls 6015 3831 Pls 6015 3827 Pls 6015 3825 Pls 6015 3824 Pls 6015 3827 Pls 6015 3822 Pls 6015 3827 Pls 6015 3823 Pls 6015 3832 Pls 6015 3826 Pls 6015 3825 Pls 6015 3831 Pls 6015 3824 Pls 6015 3824 Pls 6015 3825 Pls 6015 3831 Pls 6015 3826 Pls 6015 3824 Pls 6015 3826 Pls 6015 3824 Pls 6015 3829 Pls 6015 3823 Pls 6015 3827 Pls 6015 3825 Pls 6015 3826 Pls 6015 3831 Pls 6015 3827 Pls 6015 3821 Pls 6015 3826 Pls 6015 3831 Pls 6015 3825 Pls 6015 3831 Pls 6015 3823 Pls 6015 3832 Pls 6015 3826 Pls 6015 3828 Pls 6015 3824 Pls 6015 3831 Pls 6015 3824 Pls 6015 3830 Pls 6015 3825 Pls 6015 3831 Pls 6015 3822 Pls 6015 3824 Pls 6015 3828 Pls 6015 3831 Pls 6015 3827 Pls 6015 3824 Pls 6015 3827 Pls 6015 3829 Pls 6015 3825 Pls 6015 3831 Pls 6015 3824 Pls 6015 3830 Pls 6015 3826 Pls 6015 3830 Pls 6015 3826 Pls 6015 3828 Pls 6015 3826 Pls 6015 3824 Pls 6015 3826 Pls 6015 3824 Pls 6015 3831 Pls 6015 3826 Pls 6015 3829 Pls 6015 3827 Pls 6015 3831 Pls 6015 3824 Pls 6015 3826 Pls 6015 3825 Pls 6015 3831 Pls 6015 3824 Pls 6015 3824 Pls 6015 3827 Pls 6377 4081 Pls 6377 4076 Pls 6377 4077 Pls 6377 4082 Pls 6377 4075 Pls 6377 4082 Pls 6377 4078 Pls 6377 4075 Pls 6377 4076 Pls 6377 4082 Pls 6377 4077 Pls 6377 4082 Pls 6377 4077 Pls 6377 4082 Pls 6377 4076 Pls 6377 4080 Pls 6377 4075 Pls 6377 4081 Pls 6377 4077 Pls 6377 4080 Pls 6377 4075 Pls 6377 4083 Pls 6377 4075 Pls 6377 4075 Pls 6377 4077 Pls 6377 4076 Pls 6377 4080 Pls 6377 4076 Pls 6377 4077 Pls 6377 4075 Pls 6377 4076 Pls 6377 4082 Pls 6377 4076 Pls 6377 4076 Pls 6377 4074 Pls 6377 4081 Pls 6377 4078 Pls 6377 4081 Pls 6377 4075 Pls 6377 4082 Pls 6377 4077 Pls 6377 4081 Pls 6377 4077 Pls 6377 4083 Pls 6377 4077 Pls 6377 4082 Pls 6377 4076 Pls 6377 4081 Pls 6377 4077 Pls 6377 4075 Pls 6377 4081 Pls 6377 4075 Pls 6377 4080 Pls 6377 4076 Pls 6377 4077 Pls 6377 4082 Pls 6377 4076 Pls 6377 4082 Pls 6377 4075 Pls 6377 4076 Pls 6377 4075 Pls 6377 4082 Pls 6377 4075 Pls 6377 4076 Pls 6377 4076 Pls 6377 4084 Pls 6377 4082 Pls 6377 4073 Pls 6377 4081 Pls 6377 4078 Pls 6377 4075 Pls 6377 4077 Pls 6377 4082 Pls 6377 4077 Pls 6377 4076 Pls 6377 4083 Pls 6377 4077 Pls 6377 4082 Pls 6377 4074 Pls 6377 4077 Pls 6377 4076 Pls 6377 4076 Pls 6377 4081 Pls 6377 4077 Pls 6377 4076 Pls 6377 4077 Pls 6377 4075 Pls 6377 4082 Pls 6377 4075 Pls 6377 4081 Pls 6377 4075 Pls 6377 4082 Pls 6377 4077 Pls 6377 4081 Pls 6377 4077 Pls 6377 4075 Pls 6377 4081 Pls 6377 4075 Pls 6377 4082 Pls 6377 4075 Pls 6377 4081 Pls 6377 4075 Pls 6377 4082 Pls 6377 4075 Pls 6377 4080 Pls 6377 4075 Pls 6377 4082 Pls 6377 4078 Pls 6377 4081 Pls 6377 4075 Pls 6377 4082 Pls 6377 4076 Pls 6377 4076 Pls 6377 4078 Pls 6377 4081 Pls 6377 4074 Pls 6377 4082 Pls 6377 4076 Pls 6377 4076 Pls 6377 4098 Pls 6377 4077 Pls 6377 4076 Pls 6377 4081 Pls 6377 4078 Pls 6377 4076 Pls 6377 4077 Pls 6377 4074 Pls 6377 4082 Pls 6377 4078 Pls 6377 4075 Pls 6377 4077 Pls 6377 4075 Pls 6377 4082 Pls 6377 4074 Pls 6377 4082 Pls 6377 4076 Pls 6377 4077 Pls 6377 4081 Pls 6377 4077 Pls 6377 4082 Pls 6377 4084 Pls 6377 4080 Pls 6377 4075 Pls 6377 4081 Pls 6377 4075 Pls 6377 4081 Pls 6377 4075 Pls 6377 4082 Pls 6377 4075 Pls 6377 4084 Pls 6377 4075 Pls 6377 4082 Pls 6377 4076 Pls 6377 4082 Pls 6377 4076 Pls 6377 4080 Pls 6377 4075 Pls 6377 4081 Pls 6377 4078 Pls 6377 4074 Pls 6377 4082 Pls 6377 4075 Pls 6377 4082 Pls 6377 4074 Pls 6377 4077 Pls 6377 4082 Pls 6377 4077 Pls 6377 4077 Pls 6377 4082 Pls 6377 4076 Pls 6377 4076 Pls 6377 4083 Pls 6377 4076 Pls 6377 4081 Pls 6377 4077 Pls 6377 4081 Pls 6377 4077 Pls 6377 4082 Pls 6377 4078 Pls 6377 4077 Pls 6377 4075 Pls 6377 4082 Pls 6377 4077 Pls 6377 4082 Pls 6377 4075 Pls 6377 4080 Pls 6377 4075 Pls 6377 4082 Pls 6377 4075 Pls 6377 4076 Pls 6377 4075 Pls 6377 4082 Pls 6377 4074 Pls 6377 4082 Pls 6377 4078 Pls 6377 4082 Pls 6377 4076 Pls 6377 4075 Pls 6377 4077 Pls 6377 4075 Pls 6739 4326 Pls 6739 4333 Pls 6739 4326 Pls 6739 4328 Pls 6739 4333 Pls 6739 4326 Pls 6739 4333 Pls 6739 4328 Pls 6739 4333 Pls 6739 4326 Pls 6739 4333 Pls 6739 4326 Pls 6739 4332 Pls 6739 4327 Pls 6739 4332 Pls 6739 4326 Pls 6739 4332 Pls 6739 4326 Pls 6739 4332 Pls 6739 4328 Pls 6739 4326 Pls 6739 4328 Pls 6739 4332 Pls 6739 4328 Pls 6739 4332 Pls 6739 4326 Pls 6739 4332 Pls 6739 4326 Pls 6739 4333 Pls 6739 4326 Pls 6739 4329 Pls 6739 4332 Pls 6739 4328 Pls 6739 4333 Pls 6739 4326 Pls 6739 4332 Pls 6739 4328 Pls 6739 4333 Pls 6739 4327 Pls 6739 4334 Pls 6739 4328 Pls 6739 4326 Pls 6739 4334 Pls 6739 4328 Pls 6739 4328 Pls 6739 4327 Pls 6739 4332 Pls 6739 4327 Pls 6739 4332 Pls 6739 4326 Pls 6739 4333 Pls 6739 4335 Pls 6739 4333 Pls 6739 4326 Pls 6739 4333 Pls 6739 4326 Pls 6739 4333 Pls 6739 4328 Pls 6739 4333 Pls 6739 4326 Pls 6739 4333 Pls 6739 4326 Pls 6739 4343 Pls 6739 4335 Pls 6739 4332 Pls 6739 4328 Pls 6739 4333 Pls 6739 4329 Pls 6739 4410 Pls 6739 4328 Pls 6739 4342 Pls 6739 4334 Pls 6739 4327 Pls 6739 4334 Pls 6739 4326 Pls 6739 4334 Pls 6739 4326 Pls 6739 4334 Pls 6739 4327 Pls 6739 4334 Pls 6739 4333 Pls 6739 4334 Pls 6739 4326 Pls 6739 4335 Pls 6739 4326 Pls 6739 4333 Pls 6739 4326 Pls 6739 4333 Pls 6739 4328 Pls 6739 4333 Pls 6739 4325 Pls 6739 4333 Pls 6739 4326 Pls 6739 4333 Pls 6739 4326 Pls 6739 4332 Pls 6739 4327 Pls 6739 4333 Pls 6739 4328 Pls 6739 4326 Pls 6739 4328 Pls 6739 4326 Pls 6739 4328 Pls 6739 4332 Pls 6739 4326 Pls 6739 4332 Pls 6739 4328 Pls 6739 4326 Pls 6739 4328 Pls 6739 4328 Pls 6739 4332 Pls 6739 4326 Pls 6739 4332 Pls 6739 4326 Pls 6739 4332 Pls 6739 4327 Pls 6739 4328 Pls 6739 4326 Pls 6739 4328 Pls 6739 4326 Pls 6739 4329 Pls 6739 4326 Pls 6739 4333 Pls 6739 4328 Pls 6739 4327 Pls 6739 4333 Pls 6739 4327 Pls 6739 4328 Pls 6739 4333 Pls 6739 4326 Pls 6739 4328 Pls 6739 4333 Pls 6739 4327 Pls 6739 4333 Pls 6739 4328 Pls 6739 4333 Pls 6739 4328 Pls 6739 4333 Pls 6739 4327 Pls 6739 4333 Pls 6739 4326 Pls 6739 4328 Pls 6739 4332 Pls 6739 4329 Pls 6739 4326 Pls 6739 4332 Pls 6739 4326 Pls 6739 4328 Pls 6739 4327 Pls 6739 4332 Pls 6739 4328 Pls 6739 4326 Pls 6739 4333 Pls 6739 4326 Pls 6739 4333 Pls 6739 4328 Pls 6739 4332 Pls 6739 4328 Pls 6739 4333 Pls 6739 4327 Pls 6739 4333 Pls 6739 4326 Pls 6739 4332 Pls 6739 4327 Pls 6739 4332 Pls 6739 4328 Pls 6739 4332 Pls 6739 4328 Pls 6739 4326 Pls 6739 4328 Pls 6739 4332 Pls 6739 4327 Pls 6739 4333 Pls 6739 4328 Pls 6739 4327 Pls 6739 4327 Pls 6739 4337 Pls 6739 4326 Pls 6739 4328 Pls 6739 4326 Pls 6739 4328 Pls 6739 4333 Pls 6739 4334 Pls 6739 4333 Pls 6739 4327 Pls 6739 4333 Pls 6739 4326 Pls 6739 4328 Pls 6739 4326 Pls 6739 4334 Pls 6739 4327 Pls 6739 4333 Pls 6739 4326 Pls 6739 4332 Pls 6739 4326 Pls 6739 4332 Pls 6739 4326 Pls 6739 4332 Pls 6739 4328 Pls 6739 4326 Pls 4581 4486 Pls % End plot #1 % Begin plot #2 1.000 UL LT1 LC1 setrgbcolor LCb setrgbcolor 4298 4346 M [ [(Helvetica) 140.0 0.0 true true 0 (Non-Linear Regression cpu0_ncore0_impl0)] ] -46.7 MRshow LT1 4382 4346 M 399 0 V 950 1251 M 59 5 V 58 6 V 59 5 V 58 7 V 59 7 V 58 8 V 59 8 V 58 9 V 59 10 V 58 11 V 59 11 V 58 12 V 58 13 V 59 15 V 58 15 V 59 16 V 58 17 V 59 18 V 58 19 V 59 20 V 58 21 V 59 22 V 58 23 V 59 24 V 58 24 V 59 26 V 58 27 V 59 27 V 58 28 V 58 29 V 59 30 V 58 31 V 59 31 V 58 31 V 59 32 V 58 33 V 59 33 V 58 34 V 59 34 V 58 34 V 59 35 V 58 35 V 59 35 V 58 36 V 58 36 V 59 36 V 58 36 V 59 36 V 58 37 V 59 37 V 58 37 V 59 37 V 58 37 V 59 37 V 58 37 V 59 38 V 58 37 V 59 38 V 58 37 V 59 38 V 58 38 V 58 37 V 59 38 V 58 38 V 59 38 V 58 38 V 59 38 V 58 38 V 59 38 V 58 37 V 59 38 V 58 39 V 59 38 V 58 38 V 59 38 V 58 38 V 59 38 V 58 38 V 58 38 V 59 38 V 58 38 V 59 38 V 58 38 V 59 39 V 58 38 V 59 38 V 58 38 V 59 38 V 58 38 V 59 38 V 58 38 V 59 39 V 58 38 V 58 38 V 59 38 V 58 38 V 59 38 V 58 38 V 59 39 V % End plot #2 % Begin plot #3 1.000 UP stroke LT2 LC2 setrgbcolor LCb setrgbcolor 4298 4206 M [ [(Helvetica) 140.0 0.0 true true 0 (Average cpu0_ncore0_impl0)] ] -46.7 MRshow LT2 4382 4206 M 399 0 V -399 31 R 0 -62 V 399 62 R 0 -62 V 950 1245 M 362 65 V 362 60 V 362 100 V 361 140 V 362 165 V 362 174 V 362 204 V 362 167 V 361 182 V 362 324 V 362 251 V 362 249 V 361 252 V 362 249 V 362 251 V 362 252 V 950 1230 M 0 30 V -12 -30 R 43 0 V -43 30 R 43 0 V 331 29 R 0 41 V -31 -41 R 62 0 V -62 41 R 62 0 V 331 21 R 0 37 V -31 -37 R 62 0 V -62 37 R 62 0 V 331 67 R 0 29 V -31 -29 R 62 0 V -62 29 R 62 0 V 330 115 R 0 21 V -31 -21 R 62 0 V -62 21 R 62 0 V 331 145 R 0 21 V -31 -21 R 62 0 V -62 21 R 62 0 V 331 155 R 0 16 V -31 -16 R 62 0 V -62 16 R 62 0 V 331 189 R 0 14 V -31 -14 R 62 0 V -62 14 R 62 0 V 331 153 R 0 13 V -31 -13 R 62 0 V -62 13 R 62 0 V 330 170 R 0 12 V -31 -12 R 62 0 V -62 12 R 62 0 V 331 312 R 0 12 V -31 -12 R 62 0 V -62 12 R 62 0 V 331 239 R 0 11 V -31 -11 R 62 0 V -62 11 R 62 0 V 331 240 R 0 7 V -31 -7 R 62 0 V -62 7 R 62 0 V 330 242 R 0 15 V -31 -15 R 62 0 V stroke 5684 3571 M -62 15 R 62 0 V 331 238 R 0 6 V -31 -6 R 62 0 V -62 6 R 62 0 V 331 245 R 0 7 V -31 -7 R 62 0 V -62 7 R 62 0 V 331 244 R 0 7 V -31 -7 R 62 0 V -62 7 R 62 0 V 950 1245 Star 1312 1310 Star 1674 1370 Star 2036 1470 Star 2397 1610 Star 2759 1775 Star 3121 1949 Star 3483 2153 Star 3845 2320 Star 4206 2502 Star 4568 2826 Star 4930 3077 Star 5292 3326 Star 5653 3578 Star 6015 3827 Star 6377 4078 Star 6739 4330 Star 4581 4206 Star % End plot #3 1.000 UL LTb LCb setrgbcolor 938 4619 N 938 448 L 6009 0 V 0 4171 V -6009 0 V Z stroke 1.000 UP 1.000 UL LTb LCb setrgbcolor stroke grestore end showpage %%Trailer %%DocumentFonts: Helvetica starpu-1.2.3+dfsg/doc/doxygen/chapters/images/starpu_non_linear_memset_regression_based_2.pdf000066400000000000000000000574741320135501600326750ustar00rootroot00000000000000%PDF-1.4 %쏢 5 0 obj <> stream x}[FrFVw?ƀ8zA.dhn.-i h>~dUˋ_w?/!~/^>}?T]0??7_m ՗>ocjG|o6ʜsՇ8h!մۯN:͘r=PgկNyv(88Pꄚ7yJ8nR/NCBCeS\}-TH Ԍ:.&r1=M5.xCCbB 7#~15//V1f&O)"b\L$b>ɇr^Nl>]bB 9Q;.9"+ٗY9E]F䟗3gchbB 9Pg/&}ן?}ӟm77?rXh> }÷?}?}ũ]6޻c8R~c9<r5_%W6hj:d{s [HׄM'~1rAkkF'V\knt]ppy(\.X˧ &^Л)m[ZV^5+D\x%m~ybӀ}OuRNNj[n+zъ ~b׋h=XU5PbwH>|O#gn 5vgxPp<((hbe6 ?iOMې%@c $lIv=./:,_S6kV\7 㜂tˈ`.>bO*}ž kytLCQ> Yg|"} b_/Xφk zO{Oz\߀o@7MU|PzMW.%P]B5}n[v nU;aX13tf(c*` -Vo="̂DLOc1 瘄ry:ix f m$[1ľ~yXE2S]f:CqPh\(T'~kfkf`Q0Y1ӊuRNcM䱊XuӼF x=%yQ\:LT ΁ r`90UFPek$s9 85*w;͌A r8E<1t6EɊ=魂B-^Lq=0VjzA\@M_nkn+n+(6c0x|Wq,"DZ]mBu4}=Ydm:>>h œG6?J 59,,,|[3 :3ZAvPbziݧ,l6bVVX dlm9ҜRj\>i橊kqiC@>_\6k,jDkDŽkGu2:h NG&66,ـ\mHĹL g^~ZV:}`&U~F-v\zbP|7ml}>ᆭ%LLȳ?Ϭי;Ϭ ;焝s¹9'nF{>=Q'G=LۍmYq ;ӕh yN+M T7ddGr;*Q)gĐ dpG'@< ]@taS&)cXDu H-qT鑽7lw~cJ=3ba@&2.#%c㶳.v̛ŕ7ys\ b82X1[Bĭq vW3y,a ~Dpڰ6dyvel9!`$`+`Xag?=6v >`Dv[=Q-$!8L6Jk#֊e䄌Q"|Vg|&gB9_$y~/cW+ؕH\&4}\Qx\x/51a%;QY1MgQ~ +p\=ɶ5**lŚКx/b1ޡ:FQ#[(fplk׈\hzš mNĭZoy[B@"-47;V!k,jkkT1q2gȟ!V"[D "YR"(⓴{[cl1[oU\y^JR;:5O\䄜S#r4~Mįv= ZA(L$_aD_N -aFsgl-Q^>E~!8*Y> ^΢ˆhS46(V3gKL\6a{^ d̀ē:yǺ9М]x?\P.{iYHnP~x]π%`^uRHDjx,Yj{ԟpl lH͏Nрh=}㘅gU̢ E@l ⺧qݓ/gp·|XŬH@| (zFO{FO l&ili-Sq|bߑYe{ ϥ#8NēJIsާ|gwڂ,ƣuŬYFt,f3ޛhol1Ӹ  J4s'9!R\5Ӟ>>>\~r==v ~Zk갇f8?CLa"bX8oĹݸS3_x^,,>^د1>4W?u>w|>m %lC <^q=lo뉺⺢}JMgاjt%TnB˶4[U|.spykUݚ=?LX+,St"ibAqX?초9osj,W _qɬjU폗.r>`x/}c-N !W~>cy^+uyŹy^`K5ט\uǣsށyDŽ.RW"+a ]p0NdIT> 8va8;!y޾Gp{Nxiłtٰl 4S@ b=Li2Da}pTRfN/8 0U蚁lmŐ Wl#m$:h1h |u>2u^r6٬甈 [6Fb 8~N]V˺8e~_#mT؞y%i|z[0lF1,wl&l j b$ܒ|Nn6E4 >L$BzB5R ^ ^l?:(DHe(?U݅Lb &q8Yp,(ND_ W?l?Һ?aF!@Ok 8d"Ծ LḯVM } IܧtFL':33#:=$$P? O43x(|cf 8pTf B3}jl!c}VςY>5 ^5^?z' x*Oe(@@Zv߄l=/58]J}RƼFk`'O窀s\񾔢'Q͝Ogy( ,sƴ&AkΏof(l*jk,jkk9WSr5u&&Q,EdGDa~_ ԯO 2I'{jKR>ODSNc`z ̖Re~_%W۴g$taqp4:.buX]*!1 pqlKO65Rj<*=TfUCar~^jd8䌒%pWӉ(ℰJ5B@mTiST\~ _#&_liCИ Z✐Akd l8$^7/*ķ r(\D. cgߋؿH͕(LE61o4ݩ"p2thkE0ޡO y*xgm] jg>^XMVbPJےM.Vve+>Ա> ]Z z 0-:,5ں6i'1F[5t}͐a*a*a jf^1}41 {LcKscگ,k{ulVݮPSk㋶n' {ȍRʢ 46{<}dnlQj}BrPt >VX7V&Kw7w7wksnqL2_UMRؼ<gWXɜׂ}U ,b lu@|BV !pR&3Zm)X;h(i8O_ rбsښ81xy:~K,b' U<'7s8Y]ӕǹiZWqmR]n#cr}ϟF逯?՟N q81qO0O! ;5'LNLޟF5@V5lqi)'D`rY]H]d,ta(L`|x$|!yf1J{*̞ Q,=g8x>^Wg:q 0^@"呙=d!|P˰ی*y(b'ss&yy$hF,8CE 2>A-fU"[4'`kI;̎hhD3?&Uatq8]xΎ.Lu-7ha ZУE|h*uNC_ȃR%/R/a#2YurOSI`j^ &u*? z.:S}']UfWە^Vc6Yce o[y=Gco6>>X -dbUXUDM G bɜȢ{6qDqG-֨ws\g&Or6 mWV2Z=8,u|U~U_U1cJ ]m2Z`O3h,W\^7QWl[,,,V LXm͞Ƶ}7,XwY%ZbQ(g|$G`|~To%zk5>+gaS+|&Z`gVI,r^x|m|Xa7f96Wsu 7?qz{8큡_ck_Ga׵&>'2'Е ,6e;b\(T`jTtN&;HK;q4Nws{rx7x^ Ocx9!IO2GN.,(ؐH--Rn䒹\ -\@♿r~=Ɠ+7< O!$[A`-kF.nX*LlM\' 3?Ub}<ʿW'+7*_o8h78 Qê3f,BVbdd [aVZ(fXkvS^כo^jf_ =z->&='?A |f 73gIΌ-K;=1<ϏXY6>_[خUk'6ɢɢNosg=|#.Ճ26>dXio&g Z>hr"{̖r*g A4B2ê۫+~bEOfu~,uUfvg}*srY3¼3^//;[㈗O"_ׅ(8be'iɉђ%6FKq̰0H78LII2d~q8!hA?Ud$Kq$oh)iI'R1ZОcX=_VJ 8Optca㐴p HO<醧FW p-78Gp780G|58try|2>X/Q+չ Ox,xȏ DIEPe }I7ݘ9-pCX+ԇrCP: =J ,Ww/G4V_Pυx w˥2] fcFyȦ.&8,Ţmr/r}$Yߪ7=t㋑bme}Z₅b#_|RgŘLccԏV=#)7={@VM< O%Ov{seu妮Zxulb.PlB7lTso-&sfjfQ^VõGjUV^:?l,j)x<=gCB{Z&3Z+_Xh^f֋TwXf_*}^y]ܮ/C8qh|qሞI∁_\8Lg~="z #eGʔ)xpE|@|0DiIx/p ohJ7@'~Y?s5HyH7<40Q|#Ǵho-&v(trphA i|7.|8\7.\~i#V)|#ٌ61np$#>l^o*SF#&p$)-#d#y"v]Y^kkwo]R@|o_9GWצ"}P>G u^[Zm|UQoRz\nXۤNo=_`={Ԟ+gGktS^Ve:k73B1Ӎc r̴7} y9l` MQTF0][Ml4Dks6Fo٧5:So< W0ؗ8˱B^·smɷk]7'g 'YY ,~9go+BM]2^>1bfnOֺ%ckg .[-_G(z#pp"Pod) 톆iLpvGRxG)[oaˑk kŽ H V g^T(ipƱ (|"I\nl)p[ ܖ,tz,!9OhᆆB1SG8MnE| xCC4T<]S="ǡ+ {&u9*Vc,tk <\E״zstnn1TF볾osǩ5F-Ө:2#Nu3*̡C9kXUr.μ.rI8gQ#YޮLԛ6g0a[^&N%OcuՑh?w/ZԔ^iAsץ>g̥tB˷X'(tr8ξ {gy?3t]^ [XZ!>mI=##uӫ0ڞ[w-b~&5+.Wɹ 9Bo}ƦMטtlc9P[7-$z@p}$Om9r-&Gcf Ω͜:9uc{TC77r|>}_"[C>w[C%z~'78őnpTRQG82SY)X'4@%4&i`(|C<4&GGqqpCk4XG|6Fr4 o+pkLbD8đ<ÑqwG|$&BhHH1D LeP RA26@mt6]_jALsFsawVEVژ!Q@tJQU2:fBmp۴śwF`ZϵzzzN+_)o[4К4Ԥ֤Ԥ1S=fLׇ= eJ47*Owcha ZZ׳-| N=&Ƨuy"ElIzCp:ӡ,rʦLa3VVg:Z.^63]HϟhRn ϛ3M 9~_Ne 1s= @cuՙlګGZMyeepXs9ɝB['*3M_h_H $j|'I:;)Ԏ-@pz#p05-0=qrbXkWQZ`RS@Rd6 ð!Q(7odڹ6kmZ2{M[h[@c+7oƆr2 '-4ܗxK24PYYV.s>Whu 7 Rԯ3KmlX~_TMC3r3C|\^l&-hOzz9X IeWϻbF{o{n_'<D%^ا0G&8Pxg8*rC!pA/K:V-&W :NF'QA#O%s/i{*(ys C!;_ m>Wٷ2Ù#֛}D@@bR/(K6(^O~\-j+y7}gKlx\`eVdѳWebgΓ8'w#Fkuk9n2|ҿXmx]ll|oɜ|#H&WV#^ߟV6=Z:*Yc3_E=dCU"7ZZqa [{˭hf+n^aE~WWeVu-v:fgn%t-VJu,B^q~hzff:\#t1hgߛhsЕbFs6}j03j'rh%dsxNJcU|al8<np&Wu-+Qv9`d_Vy_9r]ɑ䂕b8r#@e^A5\AuZhfZ&νŢXIG[xq:u/|x[{ȕez}ߑn" &Q$jĕzٵj5=Vy%_ r:pk5zV,lo%|ȦfX#/d+W}:=ޗu_/ו;F d[Vɭla|p~Q cr  c=tq\yO_|҅cOkВ*np$#ˏ-_PFpH~"'r~hYE&ka; Ŷ%ųT9-iIlmپC-nx*KY3N/Ëۗ\-ϼ~Vok!Uq~ߠ x/H/Շ]})/_^6ƚqc?wӧ^ӿǟ>_}ca{}N^g`C.}:a 0 & r ݗ!` W}m{-@*}w8ßK+-ּݯZeumqq}VK9~;Vbņ1wʡxvQ:fKy)/郃MYu\]xuhDŽ~K1Ka\lK#$xXAC:~{Q㱔K%C6Yؿ?VoC[]?2 /B&][MPvvPf*x+UkaNnn{Զχ}-x8N[`d,jk=>o0dAsH6~5_$ݮmus F}ׇ}<^q=NmD6c?иy;2;|NC)kƍi?>o۬t[%a[4 |C;h(x7)T|P[AG9|o_Wonnp||mSw<>zj.B5M_a*vpauvbFoCFo۴ϛ/y O wH(FIwH(B3k?. jݔ??~揟a ;+;^~j;)$[=^7wߘ쏠S]`QkѶ.{xL/>[N&)սa/@ wkzK~} ||{$€皏o==d%kOzLKO疎tw<1?F,Z0]'#<\w/ǟ.:\Wli ={wۢygbߏ]tG';m>6x~ߟFy9UN^qqީNevy,5A;[j8>Ww}ߟ6{oqxθ:ӭEwI=1+t/'| rG?>iΡ rv[W=ts-1A0a!'$'cw:F̵DV3㺹E{QSɁ)Zg`F*c~^7w=@z:>Ɛ|,\ gJ3FA~3m!p>u-7B\:(ڲGQၦ׈~o]t4O]klK8#БECEH%߇G:RԵ| udqґ&A/G .y~Fq>2BZǙ΢|tL Zi>u-6B?uY?_2es>.ٜO] ͧZb(#V/K37&X8>0rF ˵x 5}6޳ gTQ/9DWτV|h&O&k=?z6&G͟::Bk_¥KlK߯|$lQ\Kͧxkx<~ {oiWNDZ>hxCH/N^i{>?> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 10 0 obj <> endobj 11 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 12 0 obj <>stream xU TWg dv&zgDQ6 IǪ+ڢVJTD"EJT[n {{N?qư,;|Q.?-73%پn,7 =k|<=d$r!'q# x F(|laYٛ7egjܗ/[1mxhoMXZNfA3>鲲i@NIm$ui5 3uY//tԯ&r4ZͲ<]?df|CVܼڔ 12t4f{L>#˛a&0Kf)1˙xf,`3a fd27e"&f ˌf0pƉqf\ƕQ0Sh]1WrmaIÈll0}r|$Up'_6aP-2i)Fw}nJ:?:X 1W6;m+Q9Cen+ڤ8HmsOSIɤ4\iݲOZY oRy<؄Vl(P}!m8g+&6oqrgylG6 vȈ X83 `|:GmAD#hmF;"-ث]qJi~Ҏ=H0l9|R xK"frY!tq;SaBB۹u2.Io77VA,l\ƺoUNԻA%dP΢M3]-niuתNwTd'Έ&.SԷtU P~U/ y'3 /jT5T0%AQsCVL2'P~`>=Ul1 Ml(l;l"V[J9yu&q $OAzmֺ0$̌kW@YozR>zael7p(H ٪'O2\"'T)6׊[8ݔb3^Bᱹ{6'yn%&^lHkvvοN8Q{*?·$^UEߣ+^+,ϓ"L?H 7riG η=B6 Ufu,=fl"lO6%7h Xo=V7%[f>A<2+*4IӅ;{О=*)M֪8JX0EGJ~WeGS5-BBOxDmu'^9p}b~h‘_T 0~N;"z uWi"pӒQ聯+؋&2o'XFxOPMjxjDO]jyc]!OnJ2-51<.{Ez/ostO=!K/ux,|VT"6kd3a#A=l~BA/?2@>U}}PLZ֚`LDA\}lת_椦%y4@RAʷg"GR夅OT[s_M8oΞ$Λ 3֚Pƶ>vړ)D%x#sDL5&&\~|k! G2 ɐ~DG S@)qf2EV7AB [d$)$]Zn)'aE!*+ `gl ľ&N|awv2F?sCdbAU N,FK Dz"*|HDmUޏSmsj^F5k{X !ӧĚf|K$[ٚ`+W$hyrl,2m9g=S p endstream endobj 13 0 obj <>stream Fri -No-v T 8: 1:5:21::7 Fri -No-v T 8: 1:5:21::7 gnuplot 4.6 patchlevel 4 starpu_non_linear_memset_regression_based.epssamygnuplot plot endstream endobj 2 0 obj <>endobj xref 0 14 0000000000 65535 f 0000018415 00000 n 0000023696 00000 n 0000018356 00000 n 0000018205 00000 n 0000000015 00000 n 0000018184 00000 n 0000018480 00000 n 0000018581 00000 n 0000018992 00000 n 0000018521 00000 n 0000018551 00000 n 0000019354 00000 n 0000022086 00000 n trailer << /Size 14 /Root 1 0 R /Info 2 0 R /ID [<28FBE29D01B455FE8B6EFEC7143F5EF8><28FBE29D01B455FE8B6EFEC7143F5EF8>] >> startxref 23946 %%EOF starpu-1.2.3+dfsg/doc/doxygen/chapters/images/starpu_non_linear_memset_regression_based_2.png000066400000000000000000000175751320135501600327060ustar00rootroot00000000000000PNG  IHDR,2PLTE@Ai @0`@ԥ**@333MMMfff22U݂d"".Wp͇PErz挽k ܠ ݠݐP@Uk/@@``@@`pͷ|@ ___???V>9mM% D݇BK}sVf+8# Dԅz/jRj_ѿJ%Zee+vׯOhSu2 ucmSPD˪;Ml~³7&~y6iw EX=4ރe~ڪm䵕lU6Y%Īݒ^ hO,~)ˤ?/QQ6_Ѵ]CDK}z2S 1iZ!6iw yHka!2^Q'x|7jKG_AFɩ$Q#@{IEє>Sg ǔiJEa!2BrD5YA)_ٞTeWͤ0JN'jL8/~楮&B9 comҰi|2h/B(Gf @,GR%ʻ2.@J[~rD,W79 pIæ5-Lޥ8!TuS؂;ϾbÔ3)UK*ק64s%`کؠ~?f9T>-li0+ ѷ&:6pp(Q~QTq'{e_1]'E!Վ##"TM YWX!fmwLd?d#)؍r$ ?ѨT)~mPߠ>{L~ vOů [GFEo W5=ا`6t'`OuӖM 8ۤQŒZGFq̣ Ǧ;4B&oB~#KUAE!B!B!B!B!4u`fC 9NU9LY 91z%D(@r) *Ζ^.[i"zY f C.LjK6j :!wf,yʿ+ooxU+$xFc3W2]3g~W4]Wzk-xb} +Jqf,ZCTy=ɩ'[vZnç"9Id}?i|_r }un?ֽȜ@U 6.\.k>jd@H~tˇ_%a룜@µPuA~u9^u]Ӽi ?\ZHhM>l=w-Kst7Eo|IN,ZG8~ ӿMB㭿T"1s,"[XReƳ x^TeƳA pY+s7Edw.ovҀg:`GK} }nPY"<q+.5}d-L~ƳhY58y/8[qY-OY?>"{[?@wYbԣjd(-P}Yogo:"&$DhG't7EQnJltdդwm? ɷ?Dτ䯌MsA܍gjNx 2^!a@jL%?FEUԷxF\f%)%V\D9nv8bטѐ|_ްװBt6Ek):2.2gPF}9?_M!,WGτO6L (m%즋j+ⶁ;5+qÐ3!g#m@A܍gJ*ۖ/gcm=%oȟ %"X|(,Z Fm&2^~&[ȏJ^ t7EwhG|NvwUVOQqMg.ڗ6PbTvwٴ/M˞\@rtwAfܐS-Go _ T)H^]jęvt/cSpڀ|Y.KQu+F6ٸ2^o&ݲ5,twUU5W`ժ2"tݶ,sw>>tཋlҘA:Dg?@ws0jۣ7~W9[{Oxea(?H Z~_}ֿ?[F4'4ī.`Q`+ô{ Yd#=r+:!BA !/5e[bwC 0B'o09P9[QTRS+5`4`#goKvBC0+C\{2vB\uyV6cDϢ kgꏳɟ? F&ϝxgCw0 5%Sn<2T5O n<21;\!Ϣݼ'x#<܌tG?@wYoz:/Ko{XUuKF2:OOwA'*$%ɏ`SRS-aeJKVbއ=|NfE/'DyĐ7 0xx%oˏU gK_;}2ȕf%0]&DJ݄7=(@y+#@ F t +Opye$(~ʏ/Y/;!K9Z8~Da'Yo3u Ϣyoq܍g^iM7^nxטyҠrMH,sP7MFu?K@@wY?~0jeƳh/ZccpgOT38!? L- N`Q~>h@79JEY<_';*R]0uѾ`nB?L7rN Birx xs:0+(ھ/CP ߲x /uq P۽sUݍ 0w縻QCίxe}]BC g#f] pˏ= :Ϣ(}"TB&MwA*f](DP#Us.0t L369:\`*^#𥟮ˑxCc˕ 0>> xh%`Ԧ{/!.oqRgtǃ 4iFUs߂I:^#@{wv/x O`\>u@F謚c"oA$ozw/^הn@^՗KK@0rd%_}K.(@[qfx hWSw_ Vn8ˇyljIRVe (tog+J IXKQ68|5ҽv 9 ,)ޕLiI(,nnFڈ9Ђ m@[E,?Ht#{0" m#L#j;N1I^l{Cm@hQO{IبFgc7*X*Y RBC w|bP%nxC%B}88PM{Vb|;8KAKɥ4O xveӾ4`c!M4B)ۍpq:MD2 ,A2NW@ڀ.ڗo=(@F rN8HPBC wc!]#B!B!BظH~*oޔ,8X-Us؂ˏ'N~{>R? oq+YKfQMbk[q*p~*q A߯:!YHMDYxTmL~W>S? 0dBҖ)RՔgyd_lͥӢ,2Dۓ|*xl8MW@]pRojgvYFv+8f,b8*UbpA6~g,LO'aW"L~W>S? f,Qql{:Y\)x~w<}bqŶԗe#etBt~7.)ʶO}=EYk/]N!B!B!B!B!xDdk5=ş6-}n TVNΞC֕^EϵnR/_e%WY?28OZ=Nؽhy8Je_!'|ս4'Gސ:uhy:ZKj}5+-}TSc͞tV!$R^E<ыJi#XEo6u*ۋ$/,U/6LPOO8#(}&FmӢ#vLͲ3nJ ڀ[nZrb{UY蕫vZJU ܥU )-e|.G$U?5*B!B!B?}B˟FyIENDB`starpu-1.2.3+dfsg/doc/doxygen/chapters/images/starpu_starpu_slu_lu_model_11.eps000066400000000000000000000554021320135501600277450ustar00rootroot00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Title: starpu_starpu_slu_lu_model_11.averell1.eps %%Creator: gnuplot 4.6 patchlevel 0 %%CreationDate: Wed Jul 3 12:09:46 2013 %%DocumentFonts: (atend) %%BoundingBox: 50 50 410 302 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following true/false flags may be edited by hand if desired. % The unit line width and grayscale image gamma correction may also be changed. % /Color true def /Blacktext false def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /ClipToBoundingBox false def /SuppressPDFMark false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def /Gamma 1.0 def /BackgroundColor {-1.000 -1.000 -1.000} def % /vshift -46 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def /doclip { ClipToBoundingBox { newpath 50 50 moveto 410 50 lineto 410 302 lineto 50 302 lineto closepath clip } if } def % % Gnuplot Prolog Version 4.4 (August 2010) % %/SuppressPDFMark true def % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} bind def /C {setrgbcolor} bind def /f {rlineto fill} bind def /g {setgray} bind def /Gshow {show} def % May be redefined later in the file to support UTF-8 /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow {currentpoint stroke M 0 vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /UP {dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def} def /DL {Color {setrgbcolor Solid {pop []} if 0 setdash} {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse} def /BL {stroke userlinewidth 2 mul setlinewidth Rounded {1 setlinejoin 1 setlinecap} if} def /AL {stroke userlinewidth 2 div setlinewidth Rounded {1 setlinejoin 1 setlinecap} if} def /UL {dup gnulinewidth mul /userlinewidth exch def dup 1 lt {pop 1} if 10 mul /udl exch def} def /PL {stroke userlinewidth setlinewidth Rounded {1 setlinejoin 1 setlinecap} if} def 3.8 setmiterlimit % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 DL} def /Pnt {stroke [] 0 setdash gsave 1 setlinecap M 0 0 V stroke grestore} def /Dia {stroke [] 0 setdash 2 copy vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke Pnt} def /Pls {stroke [] 0 setdash vpt sub M 0 vpt2 V currentpoint stroke M hpt neg vpt neg R hpt2 0 V stroke } def /Box {stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke Pnt} def /Crs {stroke [] 0 setdash exch hpt sub exch vpt add M hpt2 vpt2 neg V currentpoint stroke M hpt2 neg 0 R hpt2 vpt2 V stroke} def /TriU {stroke [] 0 setdash 2 copy vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke Pnt} def /Star {2 copy Pls Crs} def /BoxF {stroke [] 0 setdash exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath fill} def /TriUF {stroke [] 0 setdash vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath fill} def /TriD {stroke [] 0 setdash 2 copy vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V closepath stroke Pnt} def /TriDF {stroke [] 0 setdash vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V closepath fill} def /DiaF {stroke [] 0 setdash vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath fill} def /Pent {stroke [] 0 setdash 2 copy gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat closepath stroke grestore Pnt} def /PentF {stroke [] 0 setdash gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat closepath fill grestore} def /Circle {stroke [] 0 setdash 2 copy hpt 0 360 arc stroke Pnt} def /CircleF {stroke [] 0 setdash hpt 0 360 arc fill} def /C0 {BL [] 0 setdash 2 copy moveto vpt 90 450 arc} bind def /C1 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 90 arc closepath fill vpt 0 360 arc closepath} bind def /C2 {BL [] 0 setdash 2 copy moveto 2 copy vpt 90 180 arc closepath fill vpt 0 360 arc closepath} bind def /C3 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 180 arc closepath fill vpt 0 360 arc closepath} bind def /C4 {BL [] 0 setdash 2 copy moveto 2 copy vpt 180 270 arc closepath fill vpt 0 360 arc closepath} bind def /C5 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 90 arc 2 copy moveto 2 copy vpt 180 270 arc closepath fill vpt 0 360 arc} bind def /C6 {BL [] 0 setdash 2 copy moveto 2 copy vpt 90 270 arc closepath fill vpt 0 360 arc closepath} bind def /C7 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 270 arc closepath fill vpt 0 360 arc closepath} bind def /C8 {BL [] 0 setdash 2 copy moveto 2 copy vpt 270 360 arc closepath fill vpt 0 360 arc closepath} bind def /C9 {BL [] 0 setdash 2 copy moveto 2 copy vpt 270 450 arc closepath fill vpt 0 360 arc closepath} bind def /C10 {BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill 2 copy moveto 2 copy vpt 90 180 arc closepath fill vpt 0 360 arc closepath} bind def /C11 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 180 arc closepath fill 2 copy moveto 2 copy vpt 270 360 arc closepath fill vpt 0 360 arc closepath} bind def /C12 {BL [] 0 setdash 2 copy moveto 2 copy vpt 180 360 arc closepath fill vpt 0 360 arc closepath} bind def /C13 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 90 arc closepath fill 2 copy moveto 2 copy vpt 180 360 arc closepath fill vpt 0 360 arc closepath} bind def /C14 {BL [] 0 setdash 2 copy moveto 2 copy vpt 90 360 arc closepath fill vpt 0 360 arc} bind def /C15 {BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill vpt 0 360 arc closepath} bind def /Rec {newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath} bind def /Square {dup Rec} bind def /Bsquare {vpt sub exch vpt sub exch vpt2 Square} bind def /S0 {BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare} bind def /S1 {BL [] 0 setdash 2 copy vpt Square fill Bsquare} bind def /S2 {BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def /S3 {BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare} bind def /S4 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def /S5 {BL [] 0 setdash 2 copy 2 copy vpt Square fill exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def /S6 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare} bind def /S7 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill 2 copy vpt Square fill Bsquare} bind def /S8 {BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare} bind def /S9 {BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare} bind def /S10 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def /S11 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare} bind def /S12 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare} bind def /S13 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill 2 copy vpt Square fill Bsquare} bind def /S14 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def /S15 {BL [] 0 setdash 2 copy Bsquare fill Bsquare} bind def /D0 {gsave translate 45 rotate 0 0 S0 stroke grestore} bind def /D1 {gsave translate 45 rotate 0 0 S1 stroke grestore} bind def /D2 {gsave translate 45 rotate 0 0 S2 stroke grestore} bind def /D3 {gsave translate 45 rotate 0 0 S3 stroke grestore} bind def /D4 {gsave translate 45 rotate 0 0 S4 stroke grestore} bind def /D5 {gsave translate 45 rotate 0 0 S5 stroke grestore} bind def /D6 {gsave translate 45 rotate 0 0 S6 stroke grestore} bind def /D7 {gsave translate 45 rotate 0 0 S7 stroke grestore} bind def /D8 {gsave translate 45 rotate 0 0 S8 stroke grestore} bind def /D9 {gsave translate 45 rotate 0 0 S9 stroke grestore} bind def /D10 {gsave translate 45 rotate 0 0 S10 stroke grestore} bind def /D11 {gsave translate 45 rotate 0 0 S11 stroke grestore} bind def /D12 {gsave translate 45 rotate 0 0 S12 stroke grestore} bind def /D13 {gsave translate 45 rotate 0 0 S13 stroke grestore} bind def /D14 {gsave translate 45 rotate 0 0 S14 stroke grestore} bind def /D15 {gsave translate 45 rotate 0 0 S15 stroke grestore} bind def /DiaE {stroke [] 0 setdash vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke} def /BoxE {stroke [] 0 setdash exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke} def /TriUE {stroke [] 0 setdash vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke} def /TriDE {stroke [] 0 setdash vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V closepath stroke} def /PentE {stroke [] 0 setdash gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat closepath stroke grestore} def /CircE {stroke [] 0 setdash hpt 0 360 arc stroke} def /Opaque {gsave closepath 1 setgray fill grestore 0 setgray closepath} def /DiaW {stroke [] 0 setdash vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V Opaque stroke} def /BoxW {stroke [] 0 setdash exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V Opaque stroke} def /TriUW {stroke [] 0 setdash vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V Opaque stroke} def /TriDW {stroke [] 0 setdash vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V Opaque stroke} def /PentW {stroke [] 0 setdash gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat Opaque stroke grestore} def /CircW {stroke [] 0 setdash hpt 0 360 arc Opaque stroke} def /BoxFill {gsave Rec 1 setgray fill grestore} def /Density { /Fillden exch def currentrgbcolor /ColB exch def /ColG exch def /ColR exch def /ColR ColR Fillden mul Fillden sub 1 add def /ColG ColG Fillden mul Fillden sub 1 add def /ColB ColB Fillden mul Fillden sub 1 add def ColR ColG ColB setrgbcolor} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave closepath fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % Usage: x y w h s a XX PatternFill % x,y = lower left corner of box to be filled % w,h = width and height of box % a = angle in degrees between lines and x-axis % XX = 0/1 for no/yes cross-hatch % /PatternFill {gsave /PFa [ 9 2 roll ] def PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec gsave 1 setgray fill grestore clip currentlinewidth 0.5 mul setlinewidth /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def 0 0 M PFa 5 get rotate PFs -2 div dup translate 0 1 PFs PFa 4 get div 1 add floor cvi {PFa 4 get mul 0 M 0 PFs V} for 0 PFa 6 get ne { 0 1 PFs PFa 4 get div 1 add floor cvi {PFa 4 get mul 0 2 1 roll M PFs 0 V} for } if stroke grestore} def % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall currentdict end definefont pop /MFshow { { dup 5 get 3 ge { 5 get 3 eq {gsave} {grestore} ifelse } {dup dup 0 get findfont exch 1 get scalefont setfont [ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6 get exch 4 get {Gshow} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq {dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5 get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop pop aload pop M} ifelse }ifelse }ifelse } ifelse } forall} def /Gswidth {dup type /stringtype eq {stringwidth} {pop (n) stringwidth} ifelse} def /MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse } {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont 6 get Gswidth pop add} {pop} ifelse} ifelse} forall} def /MLshow { currentpoint stroke M 0 exch R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MRshow { currentpoint stroke M exch dup MFwidth neg 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MCshow { currentpoint stroke M exch dup MFwidth -2 div 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /XYsave { [( ) 1 2 true false 3 ()] } bind def /XYrestore { [( ) 1 2 true false 4 ()] } bind def Level1 SuppressPDFMark or {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (starpu_starpu_slu_lu_model_11.averell1.eps) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 0) /Author (sthibault) % /Producer (gnuplot) % /Keywords () /CreationDate (Wed Jul 3 12:09:46 2013) /DOCINFO pdfmark end } ifelse end %%EndProlog %%Page: 1 1 gnudict begin gsave doclip 50 50 translate 0.050 0.050 scale 0 setgray newpath (Helvetica) findfont 140 scalefont setfont BackgroundColor 0 lt 3 1 roll 0 lt exch 0 lt or or not {BackgroundColor C 1.000 0 0 7200.00 5040.00 BoxColFill} if 1.000 UL LTb 770 448 M 63 0 V 6114 0 R -63 0 V stroke 686 448 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.01)] ] -46.7 MRshow 1.000 UL LTb 770 699 M 31 0 V 6146 0 R -31 0 V 770 1031 M 31 0 V 6146 0 R -31 0 V 770 1201 M 31 0 V 6146 0 R -31 0 V 770 1282 M 63 0 V 6114 0 R -63 0 V stroke 686 1282 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.1)] ] -46.7 MRshow 1.000 UL LTb 770 1533 M 31 0 V 6146 0 R -31 0 V 770 1865 M 31 0 V 6146 0 R -31 0 V 770 2036 M 31 0 V 6146 0 R -31 0 V 770 2116 M 63 0 V 6114 0 R -63 0 V stroke 686 2116 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1)] ] -46.7 MRshow 1.000 UL LTb 770 2368 M 31 0 V 6146 0 R -31 0 V 770 2699 M 31 0 V 6146 0 R -31 0 V 770 2870 M 31 0 V 6146 0 R -31 0 V 770 2951 M 63 0 V 6114 0 R -63 0 V stroke 686 2951 M [ [(Helvetica) 140.0 0.0 true true 0 ( 10)] ] -46.7 MRshow 1.000 UL LTb 770 3202 M 31 0 V 6146 0 R -31 0 V 770 3534 M 31 0 V 6146 0 R -31 0 V 770 3704 M 31 0 V 6146 0 R -31 0 V 770 3785 M 63 0 V 6114 0 R -63 0 V stroke 686 3785 M [ [(Helvetica) 140.0 0.0 true true 0 ( 100)] ] -46.7 MRshow 1.000 UL LTb 770 4036 M 31 0 V 6146 0 R -31 0 V 770 4368 M 31 0 V 6146 0 R -31 0 V 770 4538 M 31 0 V 6146 0 R -31 0 V 770 4619 M 63 0 V 6114 0 R -63 0 V stroke 686 4619 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1000)] ] -46.7 MRshow 1.000 UL LTb 770 448 M 0 63 V 0 4108 R 0 -63 V stroke 770 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1)] ] -46.7 MCshow 1.000 UL LTb 977 448 M 0 31 V 0 4140 R 0 -31 V 1250 448 M 0 31 V 0 4140 R 0 -31 V 1390 448 M 0 31 V 0 4140 R 0 -31 V 1456 448 M 0 63 V 0 4108 R 0 -63 V stroke 1456 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 10)] ] -46.7 MCshow 1.000 UL LTb 1663 448 M 0 31 V 0 4140 R 0 -31 V 1936 448 M 0 31 V 0 4140 R 0 -31 V 2076 448 M 0 31 V 0 4140 R 0 -31 V 2143 448 M 0 63 V 0 4108 R 0 -63 V stroke 2143 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 100)] ] -46.7 MCshow 1.000 UL LTb 2349 448 M 0 31 V 0 4140 R 0 -31 V 2622 448 M 0 31 V 0 4140 R 0 -31 V 2762 448 M 0 31 V 0 4140 R 0 -31 V 2829 448 M 0 63 V 0 4108 R 0 -63 V stroke 2829 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1000)] ] -46.7 MCshow 1.000 UL LTb 3036 448 M 0 31 V 0 4140 R 0 -31 V 3309 448 M 0 31 V 0 4140 R 0 -31 V 3449 448 M 0 31 V 0 4140 R 0 -31 V 3515 448 M 0 63 V 0 4108 R 0 -63 V stroke 3515 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 10000)] ] -46.7 MCshow 1.000 UL LTb 3722 448 M 0 31 V 0 4140 R 0 -31 V 3995 448 M 0 31 V 0 4140 R 0 -31 V 4135 448 M 0 31 V 0 4140 R 0 -31 V 4202 448 M 0 63 V 0 4108 R 0 -63 V stroke 4202 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 100000)] ] -46.7 MCshow 1.000 UL LTb 4408 448 M 0 31 V 0 4140 R 0 -31 V 4681 448 M 0 31 V 0 4140 R 0 -31 V 4821 448 M 0 31 V 0 4140 R 0 -31 V 4888 448 M 0 63 V 0 4108 R 0 -63 V stroke 4888 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1e+06)] ] -46.7 MCshow 1.000 UL LTb 5095 448 M 0 31 V 0 4140 R 0 -31 V 5368 448 M 0 31 V 0 4140 R 0 -31 V 5508 448 M 0 31 V 0 4140 R 0 -31 V 5574 448 M 0 63 V 0 4108 R 0 -63 V stroke 5574 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1e+07)] ] -46.7 MCshow 1.000 UL LTb 5781 448 M 0 31 V 0 4140 R 0 -31 V 6054 448 M 0 31 V 0 4140 R 0 -31 V 6194 448 M 0 31 V 0 4140 R 0 -31 V 6261 448 M 0 63 V 0 4108 R 0 -63 V stroke 6261 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1e+08)] ] -46.7 MCshow 1.000 UL LTb 6467 448 M 0 31 V 0 4140 R 0 -31 V 6740 448 M 0 31 V 0 4140 R 0 -31 V 6880 448 M 0 31 V 0 4140 R 0 -31 V 6947 448 M 0 63 V 0 4108 R 0 -63 V stroke 6947 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1e+09)] ] -46.7 MCshow 1.000 UL LTb 1.000 UL LTb 770 4619 N 770 448 L 6177 0 V 0 4171 V -6177 0 V Z stroke LCb setrgbcolor 112 2533 M currentpoint gsave translate -270 rotate 0 0 moveto [ [(Helvetica) 140.0 0.0 true true 0 (Time \(ms\))] ] -46.7 MCshow grestore LTb LCb setrgbcolor 3858 98 M [ [(Helvetica) 140.0 0.0 true true 0 (Total data size)] ] -46.7 MCshow LTb 3858 4829 M [ [(Helvetica) 140.0 0.0 true true 0 (Model for codelet starpu_slu_lu_model_11.averell1)] ] -46.7 MCshow 1.000 UP 1.000 UL LTb % Begin plot #1 1.000 UP 1.000 UL LT0 LCb setrgbcolor 2618 4486 M [ [(Helvetica) 140.0 0.0 true true 0 (Average cpu_impl_0)] ] -46.7 MRshow LT0 2702 4486 M 399 0 V -399 31 R 0 -62 V 399 62 R 0 -62 V 3249 644 M 413 580 V 414 678 V 413 687 V 413 694 V 413 913 V 3249 514 M 0 226 V 3218 514 M 62 0 V -62 226 R 62 0 V 382 451 R 0 63 V -31 -63 R 62 0 V -62 63 R 62 0 V 383 635 R 0 25 V -31 -25 R 62 0 V -62 25 R 62 0 V 382 673 R 0 4 V -31 -4 R 62 0 V -62 4 R 62 0 V 382 689 R 0 6 V -31 -6 R 62 0 V -62 6 R 62 0 V 382 836 R 0 136 V -31 -136 R 62 0 V -62 136 R 62 0 V 3249 644 Pls 3662 1224 Pls 4076 1902 Pls 4489 2589 Pls 4902 3283 Pls 5315 4196 Pls 2901 4486 Pls % End plot #1 % Begin plot #2 1.000 UP 1.000 UL LT1 LCb setrgbcolor 2618 4346 M [ [(Helvetica) 140.0 0.0 true true 0 (Average cuda_0_impl_0)] ] -46.7 MRshow LT1 2702 4346 M 399 0 V -399 31 R 0 -62 V 399 62 R 0 -62 V 3662 2366 M 414 220 V 413 255 V 413 329 V 413 459 V 3662 2366 M -31 0 R 62 0 V -62 0 R 62 0 V 383 216 R 0 7 V -31 -7 R 62 0 V -62 7 R 62 0 V 382 251 R 0 1 V -31 -1 R 62 0 V -62 1 R 62 0 V 382 322 R 0 14 V -31 -14 R 62 0 V -62 14 R 62 0 V 382 439 R 0 26 V -31 -26 R 62 0 V -62 26 R 62 0 V 3662 2366 Crs 4076 2586 Crs 4489 2841 Crs 4902 3170 Crs 5315 3629 Crs 2901 4346 Crs % End plot #2 % Begin plot #3 1.000 UP 1.000 UL LT2 LCb setrgbcolor 2618 4206 M [ [(Helvetica) 140.0 0.0 true true 0 (Average cuda_1_impl_0)] ] -46.7 MRshow LT2 2702 4206 M 399 0 V -399 31 R 0 -62 V 399 62 R 0 -62 V 3249 2094 M 413 268 V 414 230 V 413 257 V 413 319 V 413 463 V 3249 2092 M 0 5 V -31 -5 R 62 0 V -62 5 R 62 0 V 382 232 R 0 62 V -31 -62 R 62 0 V -62 62 R 62 0 V 383 194 R 0 14 V -31 -14 R 62 0 V -62 14 R 62 0 V 382 239 R 0 21 V -31 -21 R 62 0 V -62 21 R 62 0 V 382 309 R -31 0 R 62 0 V -62 0 R 62 0 V 382 459 R 0 7 V -31 -7 R 62 0 V -62 7 R 62 0 V 3249 2094 Star 3662 2362 Star 4076 2592 Star 4489 2849 Star 4902 3168 Star 5315 3631 Star 2901 4206 Star % End plot #3 1.000 UL LTb 770 4619 N 770 448 L 6177 0 V 0 4171 V -6177 0 V Z stroke 1.000 UP 1.000 UL LTb stroke grestore end showpage %%Trailer %%DocumentFonts: Helvetica starpu-1.2.3+dfsg/doc/doxygen/chapters/images/starpu_starpu_slu_lu_model_11.pdf000066400000000000000000000177701320135501600277350ustar00rootroot00000000000000%PDF-1.4 %쏢 5 0 obj <> stream xZMo7_79X)D% C N${_dw9OH fMu=M7gȟN?'?[>OSL5n bJA߈鏓mϾm5Ʈw+oNzfw?nO?Q1}sdL)Ugb4U I5* I UF "F步 a+wj*be4INT$;ߦE0mVQ䆺´-x{#seֺxߒ:*Pk_V̧ht)C*++Ш*ط'mڕy qk:رBDω&f9.٤-*@RP"V%J*%R.Kejʜbj"w8}7y :Ē2JQN(~˂R'SQW֨g|Y#-R.axj"i8ᘜC,+7JPBXQ%5Q$bʡDsE+Z .mfMM@Qy* (8JNh2TAQWVfdZb)榨QU[ž(vU#p{Dž-O^wf: @,P1XTP z4?1:D_r_)~q/~z1ݸ|3TcO_=jzb?{#_=ޝ_>ae4.ݏ_Ͽ}y>痯wϿCiA{diNh8s3M r0nDzOG<ؑG޳#@э(ʄc ތQderPYfEb}OY8 奲0nGz>~P)C}Y..\sS<.pč`j6<9 uY"\mYM=9/F&aƛ ?av&7w4_zu=1/_y ͚ϫyMXCkb2?Spf_f/d]Cz f7&GArV37 uymO9;$&{-|ۖZKٷ0}d2}=_d e /siT6Q{;:Ca;t;Н(yfDxDa$KQFn `'bQZ _u`*lJ 3Jto-ǵuxu:ӂz{c?cF/1ng<[q1~)]8z7P}]ɇ5ahrq[K4%酩oVdXqrR5xˠ5nn~aA GwvnOpU+nΑ&Y#r~~8yWe&W'+ݮQ:XZ.Y_lϚş+/h=5mf͛vwًؐ7ca=1{"otkagLhzNrp2㱏'طz'.:WY3sf(3:&gE2i+q^y5畮n܅r4̣gtDБ5~__| 1endstream endobj 6 0 obj 2200 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 10 0 obj <> endobj 11 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 12 0 obj <>stream xUU Tg1df%1Z4ڣ (o1T@,IR[ʪ>U*T|+hLRsg'=g;~wOS.c(&<Ş4<O{t 9h=a_ESaǷRyYsw'z 6 9@įuq{NH$~;\8XX_i0a"eǬpi`A[o#G81Ɂ&$Jh@-k"D_nvы2Cbeg 1 tD\Ϙ-MM:ID,> eG*E%C3zmqm !;Κbs5InAQ.0|"|UԞP!E'[{ӮjE.ύV%t9rpթZb'{Vz0,a1Fˏ־y<ѓL  9w.Ky:;WP;B;W¢++D:T`Uݖ^,ѿ{g.ֵ8Y LR("'K3^LbMkŁaJ}PLnp 6ȸaӰD{ [{0Kt" G[n%GΏv9GQs?^q+]<üu"?i)K/yi+g+WG5B| ܲ X覇pnX$R8V_ȸQg5n-Α: (ab2J锻`տ=Eѹ auoy)l7oYybF >``3DML9 aC2/{";9< 5""=+Bwӑ.`  5$)am^~bd“P0 ~˻~#|"^̍O] nGsSn.JYtm`U,pLvB s1(Qߟ|g`ܺmRb{xΚIdxn+(kȂt($L>Jp/ ,<ʼE,0@lZd\<- 0_ (); SŵfZ ]L4[alza2vhCWס]S. endstream endobj 13 0 obj <>stream Wed -Ju-l T 3: 1:2:09::6 Wed -Ju-l T 3: 1:2:09::6 gnuplot 4.6 patchlevel 0 starpu_starpu_slu_lu_model_11.averell1.epssthibaultgnuplot plot endstream endobj 2 0 obj <>endobj xref 0 14 0000000000 65535 f 0000002515 00000 n 0000007499 00000 n 0000002456 00000 n 0000002305 00000 n 0000000015 00000 n 0000002285 00000 n 0000002580 00000 n 0000002681 00000 n 0000003080 00000 n 0000002621 00000 n 0000002651 00000 n 0000003428 00000 n 0000005887 00000 n trailer << /Size 14 /Root 1 0 R /Info 2 0 R /ID [<56A148CC594B81453EBBF8E95A0BF991><56A148CC594B81453EBBF8E95A0BF991>] >> startxref 7751 %%EOF starpu-1.2.3+dfsg/doc/doxygen/chapters/images/starpu_starpu_slu_lu_model_11.png000066400000000000000000000167151320135501600277460ustar00rootroot00000000000000PNG  IHDRծ;PLTE{sjfffǦwwwDDD333UUU""" UU 99UU99UU99Ur U 9U&r9UU9U&{ rrU9rr&9999 &&rrr&ULr&rU9LLL^w pHYs  ~tIME k IIDATxiHv:'@xZٕmj&ݕc{{c6  -xSG, {K3/B"E|_/BaƋavήDp+%UURf[;НRU\tqh=;A++ױK*Ww{H=;aLH|<}6u{tYx.׋+ƫI]ergIKq-.|vܞ&'F7_;euOQ5䵙N$~ӉG rKen^°"7)KJ=U1YJAVL-rw` aVNGZ:3{S5VO&aWЛҪLo9uqN!*+^_[kf &m\.}ygg%$,R%#7]'+f`GɟsiHOFdSIETe2+ _ل) Q>| uTב-Ni(}yb@Si"۶F߬0fj=Y1[M{ۑZdVv(fiwD4dWGvpw :=.V?J|ٮ"Q'KeY6 MA ߴ iF7M#ٕN_<3[ssg}&U,QwnMWS|U͹:1k]Yc0 كo^$Ju |N34)9*)IlWƻdl5wI_[_$V񁴴QfOazӄݑރ,)"P!G*pq f|F>%|w^<򐬆Q:9*~8ϵ CӉCRڨ~Qo0 iWzYwT(ٝfvGޞьPbvKV aME[:ڥqI/j4ۣӮ;otk|G*d%,ޔ{MsTfwfzkU|\(R|_/B"|zEDh&Y\||АMJ&"[A""-uǬE)DZ,r,3罝H}"RWFs=ݨinf7g-']dK7WDSbȗG47X*l>,6H7n'3kȗ?Ȯ,qo*?y0]K.3wqߓgnd7޽<5/ΌԱu]ֽ$#ր00Iwfx4w2-x%yPn|${ɿi|c|iKR׷pp(+( ҹEexZx.0yjo C9 GJjY2wilZfs7]^ŷP( G Ki2wilZ5 S|ڹ˫fJ?BCM:Bwd 0w>-e$Ӎg߉l˫ ,'!=}'ӂ2FIxƹˋ*/t3[`bdb|WhsundDhŷa]qAW=Uj]t38ߓ{Բ|+d}3ΖO4|JRd oV!*SVqvu>J{* ûwǷOjY~[MU(Fg)8{˥D {v(',Wڗr2eՁg5\#}{efovO+䮬2VJb)?w>hJ- $tK+@9Ќ3y@#ƷWjYf2U28B74^|e)ev* C3ΖyK-Sd sG93=CURflWXM42 9Me?bg{M|SU # |/geN2Κ4Po=,ǜu:W gٻs8TY}*=gr\n֛70۪3f{@ƙdU}ifq˾/vΗqVg5r-FKFtΌv|f9 #ַM8k-l|tތez;;߷M8ۏ/gquҌ="S _-Z _<-}q~g|૕vw :+yXjM/wfYF/% <MW_/g|mnq[6O|:wu sv|@fXÓzʷ,;6oy_ܶ_% :m?_m>|uV7OX_u׿mbrn_s}Wm#Qm_uX?;"7ۛ;&ە_S8xoz]-_|56/޾V5_BxYb&hS۪>`n3ghvR| [<!E^qqۉnCqnߘ\;c<}q[ݻ3{]%]Ѹ<ڑ0qksî5pq9T f޴=D߫8/⦍9n^^eG=6]l ݶp|5^b#/CAu^֛>}.q{|b o>. W_o>q-˲}A??}xOւc91}ZnVX6|pnOK1}څm|R/d|;nݧ}ȘCħbZ c65ӗuh6ma} OusuhW_O;X9y P>'m}Ș{Q;АiGIl]aj|Uf!l:˲ymF|߳8{T1ے;ww%AcZCVy$h4q[03M|ߡl-/v}jrmm';,+m/m ͘|3#B],'xYRa\_z#^vybTq~|Ýk{=?öߏwD\ns+:IyOۗ m 1 ә?ׯ~xRtq?;mכea=b;$=?۫[b||>}d»~uHG;֯_,w*uh7'SǟD{iZcl:v` [ui|[^P|V5}`vZC7׈t}/j#uZf# |28θM0; m#k2`,w> 9.ʋk1Eܼ=^סm|/jSq[gS|[x*^2ӏ/=y[/sS?}[Y,=g&aV_?;jAueiYleq`ikVFm|7_8g?mgװpDooס_o'jgq[߳8%/^Zϧ j݋o.=|pF2^6=0{˻9m{m-:;\KֆS9u{9a}W_a|Wϐ |uv{qΌ^\8||1gwj{Fۋ=LN/qۥ cha-6uHsu|O|n|c|}ϨϿ?`|WӘm9%n38lu8?E"Uרٙt3%n|9ɸ |1 m| | |o^6:A~{_/W×|ށ[HWy\_Nr_)՗^_\km/^\/q/"6"%n_u__Ӌ_6_\Em;)_6_\EmE;h1 m  ||à,c|"w@b|q|q|wƗSm  mE;h1 m  mEK|1|O/N7fi-cmMu_߰%i u/FF-a,N4qۉsuƼ/ڑ0qttcR?~ViFUvҍ.u_Ad/zVߘ~t!7oOژ|>i&vzݯtK3uohW`j K+FcCoߍHZN jMs @}ӌ*ի.~]~Cs|ߖĶ} Mt u럴}#<ЭԫzݯtC3oh_ 1LOn9MMg ϐ$ D3KUvҍv hiŹu4Ma;6, pLk7m&W]YfzTfGRāg 169Hc/_!E"/_[.)aems P9oɱ[uo[H"t.Lgjݝ,/7[,hnŏtL[%TD{|- ̙\Æ)r+R${ x>( ] def /f-0-0 currentdict end definefont pop %%Page: 1 1 %%BeginPageSetup %%PageBoundingBox: 0 0 360 216 %%EndPageSetup q 4 3 345 206 rectclip q 0 g 0.25 w 2 J 0 j [] 0.0 d 3.8 M q 1 0 0 -1 0 216 cm 32.75 186.75 m 36.449 186.75 l S Q q 1 0 0 -1 0 216 cm 345.148 186.75 m 341.449 186.75 l S Q BT 8 0 0 8 19.992188 26.5 Tm /f-0-0 1 Tf ( 0)Tj ET q 1 0 0 -1 0 216 cm 32.75 164.75 m 36.449 164.75 l S Q q 1 0 0 -1 0 216 cm 345.148 164.75 m 341.449 164.75 l S Q BT 8 0 0 8 19.992188 48.5 Tm /f-0-0 1 Tf ( 1)Tj ET q 1 0 0 -1 0 216 cm 32.75 142.75 m 36.449 142.75 l S Q q 1 0 0 -1 0 216 cm 345.148 142.75 m 341.449 142.75 l S Q BT 8 0 0 8 19.992188 70.5 Tm /f-0-0 1 Tf ( 2)Tj ET q 1 0 0 -1 0 216 cm 32.75 120.75 m 36.449 120.75 l S Q q 1 0 0 -1 0 216 cm 345.148 120.75 m 341.449 120.75 l S Q BT 8 0 0 8 19.992188 92.5 Tm /f-0-0 1 Tf ( 3)Tj ET q 1 0 0 -1 0 216 cm 32.75 98.75 m 36.449 98.75 l S Q q 1 0 0 -1 0 216 cm 345.148 98.75 m 341.449 98.75 l S Q BT 8 0 0 8 19.992188 114.5 Tm /f-0-0 1 Tf ( 4)Tj ET q 1 0 0 -1 0 216 cm 32.75 76.75 m 36.449 76.75 l S Q q 1 0 0 -1 0 216 cm 345.148 76.75 m 341.449 76.75 l S Q BT 8 0 0 8 19.992188 136.5 Tm /f-0-0 1 Tf ( 5)Tj ET q 1 0 0 -1 0 216 cm 32.75 54.75 m 36.449 54.75 l S Q q 1 0 0 -1 0 216 cm 345.148 54.75 m 341.449 54.75 l S Q BT 8 0 0 8 19.992188 158.5 Tm /f-0-0 1 Tf ( 6)Tj ET q 1 0 0 -1 0 216 cm 32.75 32.75 m 36.449 32.75 l S Q q 1 0 0 -1 0 216 cm 345.148 32.75 m 341.449 32.75 l S Q BT 8 0 0 8 19.992188 180.5 Tm /f-0-0 1 Tf ( 7)Tj ET q 1 0 0 -1 0 216 cm 32.75 10.75 m 36.449 10.75 l S Q q 1 0 0 -1 0 216 cm 345.148 10.75 m 341.449 10.75 l S Q BT 8 0 0 8 19.992188 202.5 Tm /f-0-0 1 Tf ( 8)Tj ET q 1 0 0 -1 0 216 cm 32.75 186.75 m 32.75 183.051 l S Q q 1 0 0 -1 0 216 cm 32.75 10.75 m 32.75 14.449 l S Q BT 8 0 0 8 28.910156 17.199219 Tm /f-0-0 1 Tf ( 1)Tj ET q 1 0 0 -1 0 216 cm 77.398 186.75 m 77.398 183.051 l S Q q 1 0 0 -1 0 216 cm 77.398 10.75 m 77.398 14.449 l S Q BT 8 0 0 8 73.558594 17.199219 Tm /f-0-0 1 Tf ( 2)Tj ET q 1 0 0 -1 0 216 cm 122 186.75 m 122 183.051 l S Q q 1 0 0 -1 0 216 cm 122 10.75 m 122 14.449 l S Q BT 8 0 0 8 118.160156 17.199219 Tm /f-0-0 1 Tf ( 3)Tj ET q 1 0 0 -1 0 216 cm 166.648 186.75 m 166.648 183.051 l S Q q 1 0 0 -1 0 216 cm 166.648 10.75 m 166.648 14.449 l S Q BT 8 0 0 8 162.808594 17.199219 Tm /f-0-0 1 Tf ( 4)Tj ET q 1 0 0 -1 0 216 cm 211.25 186.75 m 211.25 183.051 l S Q q 1 0 0 -1 0 216 cm 211.25 10.75 m 211.25 14.449 l S Q BT 8 0 0 8 207.410156 17.199219 Tm /f-0-0 1 Tf ( 5)Tj ET q 1 0 0 -1 0 216 cm 255.898 186.75 m 255.898 183.051 l S Q q 1 0 0 -1 0 216 cm 255.898 10.75 m 255.898 14.449 l S Q BT 8 0 0 8 252.058594 17.199219 Tm /f-0-0 1 Tf ( 6)Tj ET q 1 0 0 -1 0 216 cm 300.5 186.75 m 300.5 183.051 l S Q q 1 0 0 -1 0 216 cm 300.5 10.75 m 300.5 14.449 l S Q BT 8 0 0 8 296.660156 17.199219 Tm /f-0-0 1 Tf ( 7)Tj ET q 1 0 0 -1 0 216 cm 345.148 186.75 m 345.148 183.051 l S Q q 1 0 0 -1 0 216 cm 345.148 10.75 m 345.148 14.449 l S Q BT 8 0 0 8 341.308594 17.199219 Tm /f-0-0 1 Tf ( 8)Tj ET q 1 0 0 -1 0 216 cm 32.75 10.75 312.398 176 re S Q BT -0.00000000000000147 8 -8 -0.00000000000000147 10.449219 100.117188 Tm /f-0-0 1 Tf (speedup)Tj 8 0 0 8 156.15625 3.25 Tm [(number of cor)20(es)]TJ -11.602539 23.862305 Td (4)Tj ET 1 0 0 rg q 1 0 0 -1 0 216 cm 73.551 19.102 m 97.648 19.102 l S Q q 1 0 0 -1 0 216 cm 32.75 172.852 m 77.398 165.648 l 122 180.898 l 166.648 177.551 l 211.25 178.102 l 255.898 173.648 l 300.5 174.199 l 345.148 174.898 l S Q 33.25 43.148 m 33.25 42.484 32.25 42.484 32.25 43.148 c 32.25 43.816 33.25 43.816 33.25 43.148 c f q 1 0 0 -1 0 216 cm 29.75 172.852 m 35.75 172.852 l S Q q 1 0 0 -1 0 216 cm 32.75 169.852 m 32.75 175.852 l S Q 77.898 50.352 m 77.898 49.684 76.898 49.684 76.898 50.352 c 76.898 51.016 77.898 51.016 77.898 50.352 c f q 1 0 0 -1 0 216 cm 74.398 165.648 m 80.398 165.648 l S Q q 1 0 0 -1 0 216 cm 77.398 162.648 m 77.398 168.648 l S Q 122.5 35.102 m 122.5 34.434 121.5 34.434 121.5 35.102 c 121.5 35.766 122.5 35.766 122.5 35.102 c f q 1 0 0 -1 0 216 cm 119 180.898 m 125 180.898 l S Q q 1 0 0 -1 0 216 cm 122 177.898 m 122 183.898 l S Q 167.148 38.449 m 167.148 37.785 166.148 37.785 166.148 38.449 c 166.148 39.117 167.148 39.117 167.148 38.449 c f q 1 0 0 -1 0 216 cm 163.648 177.551 m 169.648 177.551 l S Q q 1 0 0 -1 0 216 cm 166.648 174.551 m 166.648 180.551 l S Q 211.75 37.898 m 211.75 37.234 210.75 37.234 210.75 37.898 c 210.75 38.566 211.75 38.566 211.75 37.898 c f q 1 0 0 -1 0 216 cm 208.25 178.102 m 214.25 178.102 l S Q q 1 0 0 -1 0 216 cm 211.25 175.102 m 211.25 181.102 l S Q 256.398 42.352 m 256.398 41.684 255.398 41.684 255.398 42.352 c 255.398 43.016 256.398 43.016 256.398 42.352 c f q 1 0 0 -1 0 216 cm 252.898 173.648 m 258.898 173.648 l S Q q 1 0 0 -1 0 216 cm 255.898 170.648 m 255.898 176.648 l S Q 301 41.801 m 301 41.133 300 41.133 300 41.801 c 300 42.465 301 42.465 301 41.801 c f q 1 0 0 -1 0 216 cm 297.5 174.199 m 303.5 174.199 l S Q q 1 0 0 -1 0 216 cm 300.5 171.199 m 300.5 177.199 l S Q 345.648 41.102 m 345.648 40.434 344.648 40.434 344.648 41.102 c 344.648 41.766 345.648 41.766 345.648 41.102 c f q 1 0 0 -1 0 216 cm 342.148 174.898 m 348.148 174.898 l S Q q 1 0 0 -1 0 216 cm 345.148 171.898 m 345.148 177.898 l S Q 86.102 196.898 m 86.102 196.234 85.102 196.234 85.102 196.898 c 85.102 197.566 86.102 197.566 86.102 196.898 c f q 1 0 0 -1 0 216 cm 82.602 19.102 m 88.602 19.102 l S Q q 1 0 0 -1 0 216 cm 85.602 16.102 m 85.602 22.102 l S Q 0 g BT 8 0 0 8 63.335938 184.847656 Tm /f-0-0 1 Tf (8)Tj ET 0 1 0 rg q 1 0 0 -1 0 216 cm 73.551 28.398 m 97.648 28.398 l S Q q 1 0 0 -1 0 216 cm 32.75 168.5 m 77.398 152.051 l 122 158.148 l 166.648 151.602 l 211.25 154.148 l 255.898 151.449 l 300.5 152.25 l 345.148 150.801 l S Q 33.25 47.5 m 33.25 46.832 32.25 46.832 32.25 47.5 c 32.25 48.168 33.25 48.168 33.25 47.5 c f q 1 0 0 -1 0 216 cm 29.75 165.5 m 35.75 171.5 l S Q q 1 0 0 -1 0 216 cm 29.75 171.5 m 35.75 165.5 l S Q 77.898 63.949 m 77.898 63.285 76.898 63.285 76.898 63.949 c 76.898 64.617 77.898 64.617 77.898 63.949 c f q 1 0 0 -1 0 216 cm 74.398 149.051 m 80.398 155.051 l S Q q 1 0 0 -1 0 216 cm 74.398 155.051 m 80.398 149.051 l S Q 122.5 57.852 m 122.5 57.184 121.5 57.184 121.5 57.852 c 121.5 58.516 122.5 58.516 122.5 57.852 c f q 1 0 0 -1 0 216 cm 119 155.148 m 125 161.148 l S Q q 1 0 0 -1 0 216 cm 119 161.148 m 125 155.148 l S Q 167.148 64.398 m 167.148 63.734 166.148 63.734 166.148 64.398 c 166.148 65.066 167.148 65.066 167.148 64.398 c f q 1 0 0 -1 0 216 cm 163.648 148.602 m 169.648 154.602 l S Q q 1 0 0 -1 0 216 cm 163.648 154.602 m 169.648 148.602 l S Q 211.75 61.852 m 211.75 61.184 210.75 61.184 210.75 61.852 c 210.75 62.516 211.75 62.516 211.75 61.852 c f q 1 0 0 -1 0 216 cm 208.25 151.148 m 214.25 157.148 l S Q q 1 0 0 -1 0 216 cm 208.25 157.148 m 214.25 151.148 l S Q 256.398 64.551 m 256.398 63.883 255.398 63.883 255.398 64.551 c 255.398 65.215 256.398 65.215 256.398 64.551 c f q 1 0 0 -1 0 216 cm 252.898 148.449 m 258.898 154.449 l S Q q 1 0 0 -1 0 216 cm 252.898 154.449 m 258.898 148.449 l S Q 301 63.75 m 301 63.082 300 63.082 300 63.75 c 300 64.418 301 64.418 301 63.75 c f q 1 0 0 -1 0 216 cm 297.5 149.25 m 303.5 155.25 l S Q q 1 0 0 -1 0 216 cm 297.5 155.25 m 303.5 149.25 l S Q 345.648 65.199 m 345.648 64.535 344.648 64.535 344.648 65.199 c 344.648 65.867 345.648 65.867 345.648 65.199 c f q 1 0 0 -1 0 216 cm 342.148 147.801 m 348.148 153.801 l S Q q 1 0 0 -1 0 216 cm 342.148 153.801 m 348.148 147.801 l S Q 86.102 187.602 m 86.102 186.934 85.102 186.934 85.102 187.602 c 85.102 188.266 86.102 188.266 86.102 187.602 c f q 1 0 0 -1 0 216 cm 82.602 25.398 m 88.602 31.398 l S Q q 1 0 0 -1 0 216 cm 82.602 31.398 m 88.602 25.398 l S Q 0 g BT 8 0 0 8 58.246094 175.550781 Tm /f-0-0 1 Tf (16)Tj ET 0 0 1 rg q 1 0 0 -1 0 216 cm 73.551 37.699 m 97.648 37.699 l S Q q 1 0 0 -1 0 216 cm 32.75 166.602 m 77.398 147.699 l 122 131.449 l 166.648 126.852 l 211.25 124.102 l 255.898 121.199 l 300.5 128.699 l 345.148 124.051 l S Q 33.25 49.398 m 33.25 48.734 32.25 48.734 32.25 49.398 c 32.25 50.066 33.25 50.066 33.25 49.398 c f q 1 0 0 -1 0 216 cm 29.75 166.602 m 35.75 166.602 l S Q q 1 0 0 -1 0 216 cm 32.75 163.602 m 32.75 169.602 l S Q q 1 0 0 -1 0 216 cm 29.75 163.602 m 35.75 169.602 l S Q q 1 0 0 -1 0 216 cm 29.75 169.602 m 35.75 163.602 l S Q 77.898 68.301 m 77.898 67.633 76.898 67.633 76.898 68.301 c 76.898 68.965 77.898 68.965 77.898 68.301 c f q 1 0 0 -1 0 216 cm 74.398 147.699 m 80.398 147.699 l S Q q 1 0 0 -1 0 216 cm 77.398 144.699 m 77.398 150.699 l S Q q 1 0 0 -1 0 216 cm 74.398 144.699 m 80.398 150.699 l S Q q 1 0 0 -1 0 216 cm 74.398 150.699 m 80.398 144.699 l S Q 122.5 84.551 m 122.5 83.883 121.5 83.883 121.5 84.551 c 121.5 85.215 122.5 85.215 122.5 84.551 c f q 1 0 0 -1 0 216 cm 119 131.449 m 125 131.449 l S Q q 1 0 0 -1 0 216 cm 122 128.449 m 122 134.449 l S Q q 1 0 0 -1 0 216 cm 119 128.449 m 125 134.449 l S Q q 1 0 0 -1 0 216 cm 119 134.449 m 125 128.449 l S Q 167.148 89.148 m 167.148 88.484 166.148 88.484 166.148 89.148 c 166.148 89.816 167.148 89.816 167.148 89.148 c f q 1 0 0 -1 0 216 cm 163.648 126.852 m 169.648 126.852 l S Q q 1 0 0 -1 0 216 cm 166.648 123.852 m 166.648 129.852 l S Q q 1 0 0 -1 0 216 cm 163.648 123.852 m 169.648 129.852 l S Q q 1 0 0 -1 0 216 cm 163.648 129.852 m 169.648 123.852 l S Q 211.75 91.898 m 211.75 91.234 210.75 91.234 210.75 91.898 c 210.75 92.566 211.75 92.566 211.75 91.898 c f q 1 0 0 -1 0 216 cm 208.25 124.102 m 214.25 124.102 l S Q q 1 0 0 -1 0 216 cm 211.25 121.102 m 211.25 127.102 l S Q q 1 0 0 -1 0 216 cm 208.25 121.102 m 214.25 127.102 l S Q q 1 0 0 -1 0 216 cm 208.25 127.102 m 214.25 121.102 l S Q 256.398 94.801 m 256.398 94.133 255.398 94.133 255.398 94.801 c 255.398 95.465 256.398 95.465 256.398 94.801 c f q 1 0 0 -1 0 216 cm 252.898 121.199 m 258.898 121.199 l S Q q 1 0 0 -1 0 216 cm 255.898 118.199 m 255.898 124.199 l S Q q 1 0 0 -1 0 216 cm 252.898 118.199 m 258.898 124.199 l S Q q 1 0 0 -1 0 216 cm 252.898 124.199 m 258.898 118.199 l S Q 301 87.301 m 301 86.633 300 86.633 300 87.301 c 300 87.965 301 87.965 301 87.301 c f q 1 0 0 -1 0 216 cm 297.5 128.699 m 303.5 128.699 l S Q q 1 0 0 -1 0 216 cm 300.5 125.699 m 300.5 131.699 l S Q q 1 0 0 -1 0 216 cm 297.5 125.699 m 303.5 131.699 l S Q q 1 0 0 -1 0 216 cm 297.5 131.699 m 303.5 125.699 l S Q 345.648 91.949 m 345.648 91.285 344.648 91.285 344.648 91.949 c 344.648 92.617 345.648 92.617 345.648 91.949 c f q 1 0 0 -1 0 216 cm 342.148 124.051 m 348.148 124.051 l S Q q 1 0 0 -1 0 216 cm 345.148 121.051 m 345.148 127.051 l S Q q 1 0 0 -1 0 216 cm 342.148 121.051 m 348.148 127.051 l S Q q 1 0 0 -1 0 216 cm 342.148 127.051 m 348.148 121.051 l S Q 86.102 178.301 m 86.102 177.633 85.102 177.633 85.102 178.301 c 85.102 178.965 86.102 178.965 86.102 178.301 c f q 1 0 0 -1 0 216 cm 82.602 37.699 m 88.602 37.699 l S Q q 1 0 0 -1 0 216 cm 85.602 34.699 m 85.602 40.699 l S Q q 1 0 0 -1 0 216 cm 82.602 34.699 m 88.602 40.699 l S Q q 1 0 0 -1 0 216 cm 82.602 40.699 m 88.602 34.699 l S Q 0 g BT 8 0 0 8 58.246094 166.25 Tm /f-0-0 1 Tf (32)Tj ET 1 0 1 rg q 1 0 0 -1 0 216 cm 73.551 47 m 97.648 47 l S Q q 1 0 0 -1 0 216 cm 32.75 165.602 m 77.398 145.301 l 122 126.102 l 166.648 117.199 l 211.25 106.449 l 255.898 95.199 l 300.5 84.648 l 345.148 82.648 l S Q 33.25 50.398 m 33.25 49.734 32.25 49.734 32.25 50.398 c 32.25 51.066 33.25 51.066 33.25 50.398 c f q 1 0 0 -1 0 216 cm 29.75 162.602 6 6 re S Q 77.898 70.699 m 77.898 70.035 76.898 70.035 76.898 70.699 c 76.898 71.367 77.898 71.367 77.898 70.699 c f q 1 0 0 -1 0 216 cm 74.398 142.301 6 6 re S Q 122.5 89.898 m 122.5 89.234 121.5 89.234 121.5 89.898 c 121.5 90.566 122.5 90.566 122.5 89.898 c f q 1 0 0 -1 0 216 cm 119 123.102 6 6 re S Q 167.148 98.801 m 167.148 98.133 166.148 98.133 166.148 98.801 c 166.148 99.465 167.148 99.465 167.148 98.801 c f q 1 0 0 -1 0 216 cm 163.648 114.199 6 6 re S Q 211.75 109.551 m 211.75 108.883 210.75 108.883 210.75 109.551 c 210.75 110.215 211.75 110.215 211.75 109.551 c f q 1 0 0 -1 0 216 cm 208.25 103.449 6 6 re S Q 256.398 120.801 m 256.398 120.133 255.398 120.133 255.398 120.801 c 255.398 121.465 256.398 121.465 256.398 120.801 c f q 1 0 0 -1 0 216 cm 252.898 92.199 6 6 re S Q 301 131.352 m 301 130.684 300 130.684 300 131.352 c 300 132.016 301 132.016 301 131.352 c f q 1 0 0 -1 0 216 cm 297.5 81.648 6 6 re S Q 345.648 133.352 m 345.648 132.684 344.648 132.684 344.648 133.352 c 344.648 134.016 345.648 134.016 345.648 133.352 c f q 1 0 0 -1 0 216 cm 342.148 79.648 6 6 re S Q 86.102 169 m 86.102 168.332 85.102 168.332 85.102 169 c 85.102 169.668 86.102 169.668 86.102 169 c f q 1 0 0 -1 0 216 cm 82.602 44 6 6 re S Q 0 g BT 8 0 0 8 58.246094 156.949219 Tm /f-0-0 1 Tf (64)Tj ET 0 1 1 rg q 1 0 0 -1 0 216 cm 73.551 56.301 m 97.648 56.301 l S Q q 1 0 0 -1 0 216 cm 32.75 165.148 m 77.398 144.102 l 122 123.25 l 166.648 104.352 l 211.25 93.801 l 255.898 76.551 l 300.5 65.801 l 345.148 51.699 l S Q 33.25 50.852 m 33.25 50.184 32.25 50.184 32.25 50.852 c 32.25 51.516 33.25 51.516 33.25 50.852 c f 29.75 53.852 6 -6 re f q 1 0 0 -1 0 216 cm 29.75 162.148 6 6 re S Q 77.898 71.898 m 77.898 71.234 76.898 71.234 76.898 71.898 c 76.898 72.566 77.898 72.566 77.898 71.898 c f 74.398 74.898 6 -6 re f q 1 0 0 -1 0 216 cm 74.398 141.102 6 6 re S Q 122.5 92.75 m 122.5 92.082 121.5 92.082 121.5 92.75 c 121.5 93.418 122.5 93.418 122.5 92.75 c f 119 95.75 6 -6 re f q 1 0 0 -1 0 216 cm 119 120.25 6 6 re S Q 167.148 111.648 m 167.148 110.984 166.148 110.984 166.148 111.648 c 166.148 112.316 167.148 112.316 167.148 111.648 c f 163.648 114.648 6 -6 re f q 1 0 0 -1 0 216 cm 163.648 101.352 6 6 re S Q 211.75 122.199 m 211.75 121.535 210.75 121.535 210.75 122.199 c 210.75 122.867 211.75 122.867 211.75 122.199 c f 208.25 125.199 6 -6 re f q 1 0 0 -1 0 216 cm 208.25 90.801 6 6 re S Q 256.398 139.449 m 256.398 138.785 255.398 138.785 255.398 139.449 c 255.398 140.117 256.398 140.117 256.398 139.449 c f 252.898 142.449 6 -6 re f q 1 0 0 -1 0 216 cm 252.898 73.551 6 6 re S Q 301 150.199 m 301 149.535 300 149.535 300 150.199 c 300 150.867 301 150.867 301 150.199 c f 297.5 153.199 6 -6 re f q 1 0 0 -1 0 216 cm 297.5 62.801 6 6 re S Q 345.648 164.301 m 345.648 163.633 344.648 163.633 344.648 164.301 c 344.648 164.965 345.648 164.965 345.648 164.301 c f 342.148 167.301 6 -6 re f q 1 0 0 -1 0 216 cm 342.148 48.699 6 6 re S Q 86.102 159.699 m 86.102 159.035 85.102 159.035 85.102 159.699 c 85.102 160.367 86.102 160.367 86.102 159.699 c f 82.602 162.699 6 -6 re f q 1 0 0 -1 0 216 cm 82.602 53.301 6 6 re S Q 0 g BT 8 0 0 8 53.15625 147.648438 Tm /f-0-0 1 Tf (128)Tj ET 1 1 0 rg q 1 0 0 -1 0 216 cm 73.551 65.602 m 97.648 65.602 l S Q q 1 0 0 -1 0 216 cm 32.75 164.949 m 77.398 143.449 l 122 122.102 l 166.648 101.352 l 211.25 85.602 l 255.898 67.602 l 300.5 50.352 l 345.148 18.801 l S Q 33.25 51.051 m 33.25 50.383 32.25 50.383 32.25 51.051 c 32.25 51.715 33.25 51.715 33.25 51.051 c f q 1 0 0 -1 0 216 cm 35.75 164.949 m 35.75 168.949 29.75 168.949 29.75 164.949 c 29.75 160.949 35.75 160.949 35.75 164.949 c S Q 77.898 72.551 m 77.898 71.883 76.898 71.883 76.898 72.551 c 76.898 73.215 77.898 73.215 77.898 72.551 c f q 1 0 0 -1 0 216 cm 80.398 143.449 m 80.398 147.449 74.398 147.449 74.398 143.449 c 74.398 139.449 80.398 139.449 80.398 143.449 c S Q 122.5 93.898 m 122.5 93.234 121.5 93.234 121.5 93.898 c 121.5 94.566 122.5 94.566 122.5 93.898 c f q 1 0 0 -1 0 216 cm 125 122.102 m 125 126.102 119 126.102 119 122.102 c 119 118.102 125 118.102 125 122.102 c S Q 167.148 114.648 m 167.148 113.984 166.148 113.984 166.148 114.648 c 166.148 115.316 167.148 115.316 167.148 114.648 c f q 1 0 0 -1 0 216 cm 169.648 101.352 m 169.648 105.352 163.648 105.352 163.648 101.352 c 163.648 97.352 169.648 97.352 169.648 101.352 c S Q 211.75 130.398 m 211.75 129.734 210.75 129.734 210.75 130.398 c 210.75 131.066 211.75 131.066 211.75 130.398 c f q 1 0 0 -1 0 216 cm 214.25 85.602 m 214.25 89.602 208.25 89.602 208.25 85.602 c 208.25 81.602 214.25 81.602 214.25 85.602 c S Q 256.398 148.398 m 256.398 147.734 255.398 147.734 255.398 148.398 c 255.398 149.066 256.398 149.066 256.398 148.398 c f q 1 0 0 -1 0 216 cm 258.898 67.602 m 258.898 71.602 252.898 71.602 252.898 67.602 c 252.898 63.602 258.898 63.602 258.898 67.602 c S Q 301 165.648 m 301 164.984 300 164.984 300 165.648 c 300 166.316 301 166.316 301 165.648 c f q 1 0 0 -1 0 216 cm 303.5 50.352 m 303.5 54.352 297.5 54.352 297.5 50.352 c 297.5 46.352 303.5 46.352 303.5 50.352 c S Q 345.648 197.199 m 345.648 196.535 344.648 196.535 344.648 197.199 c 344.648 197.867 345.648 197.867 345.648 197.199 c f q 1 0 0 -1 0 216 cm 348.148 18.801 m 348.148 22.801 342.148 22.801 342.148 18.801 c 342.148 14.801 348.148 14.801 348.148 18.801 c S Q 86.102 150.398 m 86.102 149.734 85.102 149.734 85.102 150.398 c 85.102 151.066 86.102 151.066 86.102 150.398 c f q 1 0 0 -1 0 216 cm 88.602 65.602 m 88.602 69.602 82.602 69.602 82.602 65.602 c 82.602 61.602 88.602 61.602 88.602 65.602 c S Q 0 g BT 8 0 0 8 53.15625 138.347656 Tm /f-0-0 1 Tf (256)Tj ET q 1 0 0 -1 0 216 cm 73.551 74.898 m 97.648 74.898 l S Q q 1 0 0 -1 0 216 cm 32.75 164.852 m 77.398 143.102 l 122 121.301 l 166.648 100 l 211.25 81.449 l 255.898 62.051 l 300.5 35.852 l 345.148 20.352 l S Q 33.25 51.148 m 33.25 50.484 32.25 50.484 32.25 51.148 c 32.25 51.816 33.25 51.816 33.25 51.148 c f 35.75 51.148 m 35.75 47.148 29.75 47.148 29.75 51.148 c 29.75 55.148 35.75 55.148 35.75 51.148 c f q 1 0 0 -1 0 216 cm 35.75 164.852 m 35.75 168.852 29.75 168.852 29.75 164.852 c 29.75 160.852 35.75 160.852 35.75 164.852 c S Q 77.898 72.898 m 77.898 72.234 76.898 72.234 76.898 72.898 c 76.898 73.566 77.898 73.566 77.898 72.898 c f 80.398 72.898 m 80.398 68.898 74.398 68.898 74.398 72.898 c 74.398 76.898 80.398 76.898 80.398 72.898 c f q 1 0 0 -1 0 216 cm 80.398 143.102 m 80.398 147.102 74.398 147.102 74.398 143.102 c 74.398 139.102 80.398 139.102 80.398 143.102 c S Q 122.5 94.699 m 122.5 94.035 121.5 94.035 121.5 94.699 c 121.5 95.367 122.5 95.367 122.5 94.699 c f 125 94.699 m 125 90.699 119 90.699 119 94.699 c 119 98.699 125 98.699 125 94.699 c f q 1 0 0 -1 0 216 cm 125 121.301 m 125 125.301 119 125.301 119 121.301 c 119 117.301 125 117.301 125 121.301 c S Q 167.148 116 m 167.148 115.332 166.148 115.332 166.148 116 c 166.148 116.668 167.148 116.668 167.148 116 c f 169.648 116 m 169.648 112 163.648 112 163.648 116 c 163.648 120 169.648 120 169.648 116 c f q 1 0 0 -1 0 216 cm 169.648 100 m 169.648 104 163.648 104 163.648 100 c 163.648 96 169.648 96 169.648 100 c S Q 211.75 134.551 m 211.75 133.883 210.75 133.883 210.75 134.551 c 210.75 135.215 211.75 135.215 211.75 134.551 c f 214.25 134.551 m 214.25 130.551 208.25 130.551 208.25 134.551 c 208.25 138.551 214.25 138.551 214.25 134.551 c f q 1 0 0 -1 0 216 cm 214.25 81.449 m 214.25 85.449 208.25 85.449 208.25 81.449 c 208.25 77.449 214.25 77.449 214.25 81.449 c S Q 256.398 153.949 m 256.398 153.285 255.398 153.285 255.398 153.949 c 255.398 154.617 256.398 154.617 256.398 153.949 c f 258.898 153.949 m 258.898 149.949 252.898 149.949 252.898 153.949 c 252.898 157.949 258.898 157.949 258.898 153.949 c f q 1 0 0 -1 0 216 cm 258.898 62.051 m 258.898 66.051 252.898 66.051 252.898 62.051 c 252.898 58.051 258.898 58.051 258.898 62.051 c S Q 301 180.148 m 301 179.484 300 179.484 300 180.148 c 300 180.816 301 180.816 301 180.148 c f 303.5 180.148 m 303.5 176.148 297.5 176.148 297.5 180.148 c 297.5 184.148 303.5 184.148 303.5 180.148 c f q 1 0 0 -1 0 216 cm 303.5 35.852 m 303.5 39.852 297.5 39.852 297.5 35.852 c 297.5 31.852 303.5 31.852 303.5 35.852 c S Q 345.648 195.648 m 345.648 194.984 344.648 194.984 344.648 195.648 c 344.648 196.316 345.648 196.316 345.648 195.648 c f 348.148 195.648 m 348.148 191.648 342.148 191.648 342.148 195.648 c 342.148 199.648 348.148 199.648 348.148 195.648 c f q 1 0 0 -1 0 216 cm 348.148 20.352 m 348.148 24.352 342.148 24.352 342.148 20.352 c 342.148 16.352 348.148 16.352 348.148 20.352 c S Q 86.102 141.102 m 86.102 140.434 85.102 140.434 85.102 141.102 c 85.102 141.766 86.102 141.766 86.102 141.102 c f 88.602 141.102 m 88.602 137.102 82.602 137.102 82.602 141.102 c 82.602 145.102 88.602 145.102 88.602 141.102 c f q 1 0 0 -1 0 216 cm 88.602 74.898 m 88.602 78.898 82.602 78.898 82.602 74.898 c 82.602 70.898 88.602 70.898 88.602 74.898 c S Q BT 8 0 0 8 53.15625 129.050781 Tm /f-0-0 1 Tf (512)Tj ET 1 0.3 0 rg q 1 0 0 -1 0 216 cm 73.551 84.199 m 97.648 84.199 l S Q q 1 0 0 -1 0 216 cm 32.75 164.801 m 77.398 142.949 l 122 121.148 l 166.648 99.352 l 211.25 79 l 255.898 58.199 l 300.5 37.602 l 345.148 17.051 l S Q 33.25 51.199 m 33.25 50.535 32.25 50.535 32.25 51.199 c 32.25 51.867 33.25 51.867 33.25 51.199 c f q 1 0 0 -1 0 216 cm 29.75 166.801 m 32.75 161.801 l 35.75 166.801 l h S Q 77.898 73.051 m 77.898 72.383 76.898 72.383 76.898 73.051 c 76.898 73.715 77.898 73.715 77.898 73.051 c f q 1 0 0 -1 0 216 cm 74.398 144.949 m 77.398 139.949 l 80.398 144.949 l h S Q 122.5 94.852 m 122.5 94.184 121.5 94.184 121.5 94.852 c 121.5 95.516 122.5 95.516 122.5 94.852 c f q 1 0 0 -1 0 216 cm 119 123.148 m 122 118.148 l 125 123.148 l h S Q 167.148 116.648 m 167.148 115.984 166.148 115.984 166.148 116.648 c 166.148 117.316 167.148 117.316 167.148 116.648 c f q 1 0 0 -1 0 216 cm 163.648 101.352 m 166.648 96.352 l 169.648 101.352 l h S Q 211.75 137 m 211.75 136.332 210.75 136.332 210.75 137 c 210.75 137.668 211.75 137.668 211.75 137 c f q 1 0 0 -1 0 216 cm 208.25 81 m 211.25 76 l 214.25 81 l h S Q 256.398 157.801 m 256.398 157.133 255.398 157.133 255.398 157.801 c 255.398 158.465 256.398 158.465 256.398 157.801 c f q 1 0 0 -1 0 216 cm 252.898 60.199 m 255.898 55.199 l 258.898 60.199 l h S Q 301 178.398 m 301 177.734 300 177.734 300 178.398 c 300 179.066 301 179.066 301 178.398 c f q 1 0 0 -1 0 216 cm 297.5 39.602 m 300.5 34.602 l 303.5 39.602 l h S Q 345.648 198.949 m 345.648 198.285 344.648 198.285 344.648 198.949 c 344.648 199.617 345.648 199.617 345.648 198.949 c f q 1 0 0 -1 0 216 cm 342.148 19.051 m 345.148 14.051 l 348.148 19.051 l h S Q 86.102 131.801 m 86.102 131.133 85.102 131.133 85.102 131.801 c 85.102 132.465 86.102 132.465 86.102 131.801 c f q 1 0 0 -1 0 216 cm 82.602 86.199 m 85.602 81.199 l 88.602 86.199 l h S Q 0 g BT 8 0 0 8 48.066406 119.75 Tm /f-0-0 1 Tf (1024)Tj ET 0.5 g q 1 0 0 -1 0 216 cm 73.551 93.5 m 97.648 93.5 l S Q q 1 0 0 -1 0 216 cm 32.75 164.801 m 77.398 142.898 l 122 121 l 166.648 99.051 l 211.25 77.449 l 255.898 56.699 l 300.5 35.199 l 345.148 14.25 l S Q 33.25 51.199 m 33.25 50.535 32.25 50.535 32.25 51.199 c 32.25 51.867 33.25 51.867 33.25 51.199 c f 29.75 49.199 m 32.75 54.199 l 35.75 49.199 l h f q 1 0 0 -1 0 216 cm 29.75 166.801 m 32.75 161.801 l 35.75 166.801 l h S Q 77.898 73.102 m 77.898 72.434 76.898 72.434 76.898 73.102 c 76.898 73.766 77.898 73.766 77.898 73.102 c f 74.398 71.102 m 77.398 76.102 l 80.398 71.102 l h f q 1 0 0 -1 0 216 cm 74.398 144.898 m 77.398 139.898 l 80.398 144.898 l h S Q 122.5 95 m 122.5 94.332 121.5 94.332 121.5 95 c 121.5 95.668 122.5 95.668 122.5 95 c f 119 93 m 122 98 l 125 93 l h f q 1 0 0 -1 0 216 cm 119 123 m 122 118 l 125 123 l h S Q 167.148 116.949 m 167.148 116.285 166.148 116.285 166.148 116.949 c 166.148 117.617 167.148 117.617 167.148 116.949 c f 163.648 114.949 m 166.648 119.949 l 169.648 114.949 l h f q 1 0 0 -1 0 216 cm 163.648 101.051 m 166.648 96.051 l 169.648 101.051 l h S Q 211.75 138.551 m 211.75 137.883 210.75 137.883 210.75 138.551 c 210.75 139.215 211.75 139.215 211.75 138.551 c f 208.25 136.551 m 211.25 141.551 l 214.25 136.551 l h f q 1 0 0 -1 0 216 cm 208.25 79.449 m 211.25 74.449 l 214.25 79.449 l h S Q 256.398 159.301 m 256.398 158.633 255.398 158.633 255.398 159.301 c 255.398 159.965 256.398 159.965 256.398 159.301 c f 252.898 157.301 m 255.898 162.301 l 258.898 157.301 l h f q 1 0 0 -1 0 216 cm 252.898 58.699 m 255.898 53.699 l 258.898 58.699 l h S Q 301 180.801 m 301 180.133 300 180.133 300 180.801 c 300 181.465 301 181.465 301 180.801 c f 297.5 178.801 m 300.5 183.801 l 303.5 178.801 l h f q 1 0 0 -1 0 216 cm 297.5 37.199 m 300.5 32.199 l 303.5 37.199 l h S Q 345.648 201.75 m 345.648 201.082 344.648 201.082 344.648 201.75 c 344.648 202.418 345.648 202.418 345.648 201.75 c f 342.148 199.75 m 345.148 204.75 l 348.148 199.75 l h f q 1 0 0 -1 0 216 cm 342.148 16.25 m 345.148 11.25 l 348.148 16.25 l h S Q 86.102 122.5 m 86.102 121.832 85.102 121.832 85.102 122.5 c 85.102 123.168 86.102 123.168 86.102 122.5 c f 82.602 120.5 m 85.602 125.5 l 88.602 120.5 l h f q 1 0 0 -1 0 216 cm 82.602 95.5 m 85.602 90.5 l 88.602 95.5 l h S Q 0 g BT 8 0 0 8 48.066406 110.449219 Tm /f-0-0 1 Tf (2048)Tj ET 1 0 0 rg q 1 0 0 -1 0 216 cm 73.551 102.801 m 97.648 102.801 l S Q q 1 0 0 -1 0 216 cm 32.75 164.75 m 77.398 142.801 l 122 120.949 l 166.648 98.898 l 211.25 77.352 l 255.898 55.898 l 300.5 34.148 l 345.148 12.449 l S Q 33.25 51.25 m 33.25 50.582 32.25 50.582 32.25 51.25 c 32.25 51.918 33.25 51.918 33.25 51.25 c f q 1 0 0 -1 0 216 cm 29.75 162.75 m 32.75 167.75 l 35.75 162.75 l h S Q 77.898 73.199 m 77.898 72.535 76.898 72.535 76.898 73.199 c 76.898 73.867 77.898 73.867 77.898 73.199 c f q 1 0 0 -1 0 216 cm 74.398 140.801 m 77.398 145.801 l 80.398 140.801 l h S Q 122.5 95.051 m 122.5 94.383 121.5 94.383 121.5 95.051 c 121.5 95.715 122.5 95.715 122.5 95.051 c f q 1 0 0 -1 0 216 cm 119 118.949 m 122 123.949 l 125 118.949 l h S Q 167.148 117.102 m 167.148 116.434 166.148 116.434 166.148 117.102 c 166.148 117.766 167.148 117.766 167.148 117.102 c f q 1 0 0 -1 0 216 cm 163.648 96.898 m 166.648 101.898 l 169.648 96.898 l h S Q 211.75 138.648 m 211.75 137.984 210.75 137.984 210.75 138.648 c 210.75 139.316 211.75 139.316 211.75 138.648 c f q 1 0 0 -1 0 216 cm 208.25 75.352 m 211.25 80.352 l 214.25 75.352 l h S Q 256.398 160.102 m 256.398 159.434 255.398 159.434 255.398 160.102 c 255.398 160.766 256.398 160.766 256.398 160.102 c f q 1 0 0 -1 0 216 cm 252.898 53.898 m 255.898 58.898 l 258.898 53.898 l h S Q 301 181.852 m 301 181.184 300 181.184 300 181.852 c 300 182.516 301 182.516 301 181.852 c f q 1 0 0 -1 0 216 cm 297.5 32.148 m 300.5 37.148 l 303.5 32.148 l h S Q 345.648 203.551 m 345.648 202.883 344.648 202.883 344.648 203.551 c 344.648 204.215 345.648 204.215 345.648 203.551 c f q 1 0 0 -1 0 216 cm 342.148 10.449 m 345.148 15.449 l 348.148 10.449 l h S Q 86.102 113.199 m 86.102 112.535 85.102 112.535 85.102 113.199 c 85.102 113.867 86.102 113.867 86.102 113.199 c f q 1 0 0 -1 0 216 cm 82.602 100.801 m 85.602 105.801 l 88.602 100.801 l h S Q 0 g BT 8 0 0 8 48.066406 101.148438 Tm /f-0-0 1 Tf (4096)Tj ET 0 1 0 rg q 1 0 0 -1 0 216 cm 73.551 112.102 m 97.648 112.102 l S Q q 1 0 0 -1 0 216 cm 32.75 164.75 m 77.398 142.75 l 122 120.949 l 166.648 98.852 l 211.25 77.051 l 255.898 55.148 l 300.5 33.551 l 345.148 11.551 l S Q 33.25 51.25 m 33.25 50.582 32.25 50.582 32.25 51.25 c 32.25 51.918 33.25 51.918 33.25 51.25 c f 29.75 53.25 m 32.75 48.25 l 35.75 53.25 l h f q 1 0 0 -1 0 216 cm 29.75 162.75 m 32.75 167.75 l 35.75 162.75 l h S Q 77.898 73.25 m 77.898 72.582 76.898 72.582 76.898 73.25 c 76.898 73.918 77.898 73.918 77.898 73.25 c f 74.398 75.25 m 77.398 70.25 l 80.398 75.25 l h f q 1 0 0 -1 0 216 cm 74.398 140.75 m 77.398 145.75 l 80.398 140.75 l h S Q 122.5 95.051 m 122.5 94.383 121.5 94.383 121.5 95.051 c 121.5 95.715 122.5 95.715 122.5 95.051 c f 119 97.051 m 122 92.051 l 125 97.051 l h f q 1 0 0 -1 0 216 cm 119 118.949 m 122 123.949 l 125 118.949 l h S Q 167.148 117.148 m 167.148 116.484 166.148 116.484 166.148 117.148 c 166.148 117.816 167.148 117.816 167.148 117.148 c f 163.648 119.148 m 166.648 114.148 l 169.648 119.148 l h f q 1 0 0 -1 0 216 cm 163.648 96.852 m 166.648 101.852 l 169.648 96.852 l h S Q 211.75 138.949 m 211.75 138.285 210.75 138.285 210.75 138.949 c 210.75 139.617 211.75 139.617 211.75 138.949 c f 208.25 140.949 m 211.25 135.949 l 214.25 140.949 l h f q 1 0 0 -1 0 216 cm 208.25 75.051 m 211.25 80.051 l 214.25 75.051 l h S Q 256.398 160.852 m 256.398 160.184 255.398 160.184 255.398 160.852 c 255.398 161.516 256.398 161.516 256.398 160.852 c f 252.898 162.852 m 255.898 157.852 l 258.898 162.852 l h f q 1 0 0 -1 0 216 cm 252.898 53.148 m 255.898 58.148 l 258.898 53.148 l h S Q 301 182.449 m 301 181.785 300 181.785 300 182.449 c 300 183.117 301 183.117 301 182.449 c f 297.5 184.449 m 300.5 179.449 l 303.5 184.449 l h f q 1 0 0 -1 0 216 cm 297.5 31.551 m 300.5 36.551 l 303.5 31.551 l h S Q 345.648 204.449 m 345.648 203.785 344.648 203.785 344.648 204.449 c 344.648 205.117 345.648 205.117 345.648 204.449 c f 342.148 206.449 m 345.148 201.449 l 348.148 206.449 l h f q 1 0 0 -1 0 216 cm 342.148 9.551 m 345.148 14.551 l 348.148 9.551 l h S Q 86.102 103.898 m 86.102 103.234 85.102 103.234 85.102 103.898 c 85.102 104.566 86.102 104.566 86.102 103.898 c f 82.602 105.898 m 85.602 100.898 l 88.602 105.898 l h f q 1 0 0 -1 0 216 cm 82.602 110.102 m 85.602 115.102 l 88.602 110.102 l h S Q 0 g BT 8 0 0 8 45.796875 91.847656 Tm /f-0-0 1 Tf (linear)Tj ET 0 0 1 rg q 1 0 0 -1 0 216 cm 73.551 121.398 m 97.648 121.398 l S Q q 1 0 0 -1 0 216 cm 32.75 164.75 m 35.898 163.199 l 39.051 161.648 l 42.199 160.102 l 45.352 158.551 l 48.551 156.949 l 51.699 155.398 l 54.852 153.852 l 61.148 150.75 l 64.301 149.199 l 67.449 147.648 l 70.602 146.102 l 73.75 144.551 l 76.949 142.949 l 80.102 141.398 l 83.25 139.852 l 86.398 138.301 l 89.551 136.75 l 92.699 135.199 l 95.852 133.648 l 99 132.102 l 102.148 130.551 l 105.352 128.949 l 108.5 127.398 l 111.648 125.852 l 114.801 124.301 l 117.949 122.75 l 121.102 121.199 l 124.25 119.648 l 127.398 118.102 l 130.551 116.551 l 133.75 114.949 l 136.898 113.398 l 140.051 111.852 l 143.199 110.301 l 146.352 108.75 l 152.648 105.648 l 155.801 104.102 l 158.949 102.551 l 162.148 100.949 l 165.301 99.398 l 168.449 97.852 l 171.602 96.301 l 177.898 93.199 l 181.051 91.648 l 184.199 90.102 l 187.352 88.551 l 190.551 86.949 l 193.699 85.398 l 196.852 83.852 l 203.148 80.75 l 206.301 79.199 l 209.449 77.648 l 212.602 76.102 l 215.75 74.551 l 218.949 72.949 l 222.102 71.398 l 225.25 69.852 l 228.398 68.301 l 231.551 66.75 l 234.699 65.199 l 237.852 63.648 l 241 62.102 l 244.148 60.551 l 247.352 58.949 l 250.5 57.398 l 253.648 55.852 l 256.801 54.301 l 259.949 52.75 l 263.102 51.199 l 266.25 49.648 l 269.398 48.102 l 272.551 46.551 l 275.75 44.949 l 278.898 43.398 l 282.051 41.852 l 285.199 40.301 l 288.352 38.75 l 294.648 35.648 l 297.801 34.102 l 300.949 32.551 l 304.148 30.949 l 307.301 29.398 l 310.449 27.852 l 313.602 26.301 l 319.898 23.199 l 323.051 21.648 l 326.199 20.102 l 329.352 18.551 l 332.551 16.949 l 335.699 15.398 l 338.852 13.852 l 345.148 10.75 l S Q 0 g q 1 0 0 -1 0 216 cm 32.75 10.75 312.398 176 re S Q Q Q showpage %%Trailer end restore %%EOF starpu-1.2.3+dfsg/doc/doxygen/chapters/images/tasks_size_overhead.pdf000066400000000000000000000347661320135501600260150ustar00rootroot00000000000000%PDF-1.4 %쏢 5 0 obj <> stream x]K,qϯ6@`@.EEr-& #?$]}9$[4_uaWUM??۟o%s?o+|Jaυ?}Ǹ-} _rK澶iQ@%TeI<&?q 8stOm}s?t R565xш2ȈXhhhDdDrFj` 4B4^4Lj쌈[+PChH\%[E$It^$ޒ( %R%i 7QQ`,n*W-eH!/cwodCխ}賝~6,[O5,oxuAH?=V;i[vpfPY#W,|ȊMAc55?D46Wht`'ޞ'Ღ7~^bF=YDzfR3rp鬱~J?Q)\1E>B{ֳg}W5Mo7֣FO5%3>V z<斛w -u"i_EkM.)8{bx 7£;K--"5gHvb9&ĖQD˧♫}&,grkOA 8c+u'.'R.P|Eۿie+PY;,dRf̡ڔK{ k=foˆϒ΃&9ȏ^.)wgv> =LQ߁85Y6#570cTE$dy &f;9a`aar[ɪglh#QODV[u4I` ~Jȋm~|F%֨ň-t5b+[Bu.[![Owcj!؆ ؒxPJ!ZD\L,XC񠇠.8 Tm{_蜡MCT=1]rо^WxƉd=Xl;4B 9x&g)u{:9l O:&3ڡi jb'س{ >㪁嚤O5EI.WL,K*d܃E%kq.Z(Z+]Zu{}oFk[_!; 2zys"O{}=qxuDLTȗ(bʈX eȆ"+&*a<B>.T)ij=EڏLQ@axCV@ vDMO-8IJ1j^2p=UO:60=2 JWL(?$IW {8=!yȵcLωiå+#6ґEi݊)I[]%s*׍y)r={&ΐ16x/!]*Ț(+Zߍւ0Ԍ<{=t "t!mI)u^@'?Γ)؁'7. 4Пß;xK*n&SIԙC qqPS qyC1O%a,Rf ԅRڥĻt #yDzƽsEq>D+د.Z(kbn[(8]"hs* @Eh;G 7H[\ :E/{j,re_1L/ qe껗yM`60( XBA5wC߻?)m4J,;S֙/PvUnW88'sT(j[0G'}w*Hv˅T(ST 'j+#A&HZ#'XWH.UNC&*v C)Z;6JY `3P AV':Yr CECs|hW^Uߕ]dL,}1ϭ3iiv-v͎M=.vM=.]g$|˸$T1xS L)v_ 3%,ԝsPPD 5\g=ނ2 `Frw"w>K/AY2{qX%`%*{[Pxƒ͡XZPq. lYK *OSCq-yjA+*Kf{Q ) 9ҧPSK|$X\h3j7P1 =$rqwsHL"e@#[2bcT'l.r(ӂcֽIrA%[_Ϊ5ftC{@/ /[R C%ɤ?Tߢ+^b!P,o 92BpPƸiPV)~C^ C8ieO9Z0]=F܂ )6<."8p |dC(~Φaqu\M!"u}x@ @B y@ NTa)SK1]t5zJzBj\ "H$5;ah ,0$v@j {#>[",Q"` ~!tq=K0axc!$&da$EHKL'q%縕ۄ#}i7/7p` #HA00w6߼ӊ4ЮB/x~y[.qإ()-A,S.-n )`rnbt.r10 Jf\@rsqVn緐u<܍Bki-/*?SN snJ]װv߈z^G;LgdVab>d& 5DG%+Bz.E7vTwEECtNLѠ=PZ:r0}Y\'Uu&dk@د î~]R+y%WT|S!)1z1ʀz*y4PuJ xSҠ}Di bHU€ ƸL$D҃ǃ#H!&Ra 2L %_Aԋ/p59(?81X4 ?\b1;_(~Z+A|tXJCRRW ݏF?]txKQ7yk\c3kP~.}G櫿0a+xePhF.eYġS̆ [D>@@K9(́osRߠ磨ct-Qpcgej'DQ#J>P5n._qk^8f؆5ekؘ= cOuZ.ա HB%Ȁsh GiŬ[( 1WwI%_D[RwoΩ 4`VawRl gŌb)s8c%r2a62.J:DYRUEt0y]KwF6Vi,nb28EV0ۏh!!Yc!3p?FeKZSݐPq7??}>2 y e᱘DG%DV{IU[qc{T${/ JrL|%_zxl kfWLJyRWDY_?16u8ob ܒe3g?c̈A=m$..eYDn3~4ɞgC=س,E>4;0UМN֮Ь^]v!U2ZRE94S@4SoNP0'wSWI< G%e4Wvqbh8fӁ{MEl8S˸^ol4SM]l/6%:N> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 10 0 obj <> endobj 11 0 obj <> endobj 13 0 obj <>stream x]=0 "7'T)BVU (С-w+q6/Xu~[4{gEgփR6,ko:?8'ȞH/Ů1K#0JZ%NR9f&B(Bɺ& ;ubF4J6IM(BT *mrIK 7[td9+9c/e endstream endobj 8 0 obj <> endobj 9 0 obj <> endobj 12 0 obj <>stream xX}\TU?>sgmށLͷ\hA\@LEiM 2ɷEsmPrH3dV=iQK"ߝ|{9w9|%j$i)i$t9Z1}¼p=]Bs]!rb=pѐG"`{hpBrBAl:Ai! .y,9 ɻs0"qǺ瑼sSs/>^)Z >MOڦO ;M/R \ i7+|X  *UpNv~ dg8qx9CK5mv]Npjr[Mop8s8uq8jrk| rxH{Z<;;#~w>8j8 zp ^1}>?Y>Yerrx^{,îF+ v|`@5}mM5/İ|xa^2<8l6- ,zldFx 6m<6qX6Ū|*S>xCÆ~:T`CE>#S>XkpxPf5Vs(UVPmc%>Xa9njLja)%]P`Qq(^x|6üUV 8aFBn<sa -34>\1miTfӢ^+3)!Kwsz̦rK)&&M٤42L0Wøja 'C&n۬phGh F`$]0l̆Yah !CC\n[t,-:HMѱT` , L>,l,?>ӱ~& C<8xQN<Ƞ b@ Vb8DC2!EƀC vp01 S>9A㠕AATVAď"Z 8F> @8 _$Mpkrb-bۍY5"]jV*$"Ff-Iw1ػ?*,pޏ*܁u$#,=ZnTjl8,[,fYHL#f)OaCͶmm5W]We~K M{Mb^+x1}.+ʞswY<6`kT$Q%7ɭM3nҞ֩8z&Q5 _kr:?OC'u''t#z+PfOCDbfL#h~n1;#VZG S\o˞\}zkzO <8a3G%/UKsDOOΦV+أm1b,n%Qiil}ǔŖn!9>!c(v/>NReFDURIœS^*VZ;M#nzgoI9!kP({RLlr͒#IJtD8ydX)I 2OzMHzDζv+rFNR_sy"ɡ.j޸~.e(ʕL3/7 vwg8]M;O)6~-iUyvﲢ⒄~=܇GF\0:UQXz-qHjQo:^BZG7nOCYBjϠj(J#2,#OU$M&h2 S i]JWZj@ejxsٛ(ϟy?Zotu؝A2؀YcTvE9D+K.ިY຿Ȋ+ +> MaD։JnR!'0p.[W9o։_yWy1OL߿z<ͷ9Џ(W!PLI 3 1I R 8"MJ>NqE80Ƞ!L[wۏ&ى-"6f %?rhl0ZjL%ޣ$oZ{ݎP͔}4)xB} 0{qQay0򿇂lEBzEz43 YĘP'H*lYb4EI3^`TDz2>o!P b6=^R͠rh<‰K(Igwa   !I FkPU+5Z0aKp41T=Dnφj#Yo 7NBzZnBn1dhD_a={6nܻ)DzvoZ.~U~uMm\&᭭[_(:shCSU|Uhޒ%XB~ H.GQ7Rkvչܢܶ>,6.mW{jJm_ gDHJEH+lTчH"9C  ԏҌҎҍR\jWK9> d鶐a"i&DF,9Kz{ϖ/)瀤{͗/7c [6]x,'Ք1˔5KP_MM& 8G(9i Á392E΀]geL)d2l*E*.$P(5jxf3p@T!C柞=݇y'?M/QUPسnkQxpC0ZA6m9|`{L$k>+ABl߉sIKS҈>fN7gIoC <67EVT7EP0~= )7\MnUf-!CHz8gXQSj&c8Ђ5*_@ dJ zfƜeŧ42tw [JNc9b`16oe\V:AC`P]DZ*7JŃQ`T-j{t؟q"k4" O:p`P̽+ PZ#xv4Fr`4{G (=h%Amўm`Nn:;pd ׏:S]TO75.3ne9\Y,O7+.+(qUTxmL $v$ uzrE"wȻڵڽڳ}V:oQ {2R8~au{Q-G!dv+; %&v+6|RCcS]"hq'B0.MʤVG@SP Yq?֔ E"RkQyl芵D 6>MͲUO"t3o\"9zK{{QXɿK@>E "jA+XH$11g4h2jSuV)&HKع/H" H^W}stpaQE,Xjcَ K- b2)dVrTl'wXQ&O"="(FAN*ELJ¶o.`o4[ qv߫w0,w $"7 endstream endobj 14 0 obj <>stream 2013-07-03T16:35:17+02:00 2013-07-03T16:35:17+02:00 cairo 1.12.2 (http://cairographics.org) Untitled endstream endobj 2 0 obj <>endobj xref 0 15 0000000000 65535 f 0000006231 00000 n 0000014209 00000 n 0000006172 00000 n 0000006021 00000 n 0000000015 00000 n 0000006001 00000 n 0000006296 00000 n 0000006671 00000 n 0000007044 00000 n 0000006337 00000 n 0000006367 00000 n 0000007260 00000 n 0000006397 00000 n 0000012767 00000 n trailer << /Size 15 /Root 1 0 R /Info 2 0 R /ID [<425A422124630E590201F819211030C8><425A422124630E590201F819211030C8>] >> startxref 14384 %%EOF starpu-1.2.3+dfsg/doc/doxygen/chapters/images/tasks_size_overhead.png000066400000000000000000000661311320135501600260170ustar00rootroot00000000000000PNG  IHDRb pHYs  ~tIME )H IDATx{x[WU[iBvڦHr&ʱݦ"ama IX043Јpf`KXSne ÔV2}a}w{"J)RaSY_yۻ:D봗̃Pv~*?ìf>}s jPB!g˱crc͚56m!Ls' aϮD*-~B!EJH)0]/}U_i}B\BR*q2H8[,Re!xB!UÀx`p%d75-b2L&P2BY:2>L #ӡ-QuObRX,@{R !CƉd+Nv޻#iV"BH%&,|" Haln8eݶn!Bumw}Gm_>~uݑ-/pĉ794֊iD!c !;;;xl<|x7Wrt69s3A!0=r7,R?~|A4X,x<O]AB!-s={N8+6ovo9p*0I* ~?H0&R0D uشiUW]\[kwRX7.KRXzNa4h4 u]w"BrAqF:z1/]< q0RIhC&iUB)XupClgqm]{r~~Y&^۽M Z@4L&#*M!PO![$:nxѴ{k:N{ DF~$i91O!-eCA s_?_bLbuC$x<>99kYv-\U^xuNB:ʑ\RyDwݼyGU&[3@gbG2`KA s'ͬPo^F.t᧮;;gdfɷ֬r#q6 000PH$244Ts8 !iF\@JiF٧J`躞`YV"D"AJ!u0QEѨC,KաP  9ah4H${ t갸b9 DŒ%P>(BH'þSRJ)L !֬???_Yu1#e@BH!!DVPq=+D fYk(V?2y!^ u )!n|(E\0a6/L|z (BHaŊWyLSrot0!j℅ItS RJH]&~GVƷBY:x< lC!LV0::g۷o/l1y`؃fx<m) @5^fM_5B:LMMtJa7HizBhuOO pXE'wU4B!UW7^uU23buWKђ qM9 H$ qJ BȊա N=KEWXLU&HX%095T'ע Ӏa0 p !ZR:(P6U!#^RQrYMizi+躮^ 9BB@-%u("b.xy(@h~GQMӔ4T*%j_;!h\u0 EUJWf pfEeԴ\S aNJ44k݊B)3n˅ӕC%.㞿^MZѨJu2~mq _.=zzBu(D龑.~Z:TZ!eQ)Ph޽jK&Yn{K HoLBH u"gzu0G2=;+7ˢ1h@M~^S %eBAHϺSSSS!ȏӸLݧ5cdA\"Hx 100ЮJtW},˲,RIA!R.a! Aa1eK#o4ξw|` K3ԗlHĽ%Z DR`0dTʚ&QgMA!uII wtJϞ<[Η,H@DX,6==]:܍3b1)u}hhv8KPA:!3'i1EuX(20NJ'O}kP=jbl:4mrr!(bAhu=+&0S}f4k{u_?ҲT*544ijZ5!}hv*)RY+vϊJt@ 5{oURPhًps iMFB!튐"WT dv|5 !T [d>oӽze\S_Xv^[-5!t*1eAuPlW*xbY߯N*>ŚݹOmB%V>EW {ix Q@ v 7!L?pP+ȗ,82vwwW5@ {Q{:y/Q]i=ou ܵkע7AUC*6"eAB!AJΦ|]73Yb?\sSO}3 Cy۶WP GC 2ɴM!JI)-J$L&OͨZL& P(TgbN-,\!O$kWq̝Mgk7损_۷ #xh7{h"P5DO<bnYV@,]U1p8\n ~hPI4{+_9{~ GÇ/d IJɆRPc{֡ePi~?HFeo[c!@iiui4L"i8ds7FmwY^ !_ц!4-L5mQ!hVWOWrY`Ԗ O>?p;|羨+ ~#(FUTT*ԧsBH{H;nٳsuݶWY}l<+/[Zk Dkd`P?LH1;qaI0eFG7nSO=<31 _OgqGUo:( C,W̥pX%TVabbɷO> >wM^sB::LMOgAl<y1~jxhA@B)eiX]$ ?!}AJi&!Z^!b5bü| ƃp)EكaJY]~*uTk; !a׮]p: X{۾>\hf33jR N 4MK$N҃eYeZۃl(l~A^U5f>һ%.(AH$TJhTu% CCCpGdԪ%Q[sA 4:I9RJi 1 չY눅 D,s˄S: iY& Wl!!M}"-Ab$ >h.vN̗,gaި^"%?9B:xM:9::ꪫ\vw* _к-j1bR !4Zvϊ$PpȑM6娃ro|jy-/YSB :ض*%iӦJjbdz+JB!-ҸL Ҩ3%)BZAS>8u QB!}>_MÍHt <(u$D"K~ggGk( ? Y[L#˶GGG1: _pP U.Ԥ@4lStRJdTIWI>MDVRBH!)SG8m3saƌdr.}nEpgQwaL&sرGST 4mzzVBȊۦTQ jWi\הu]մTu,Ǎ6` *upQ龑i5|BM D3aYV&IRDDZ$zC* < UC291rBxBM DFH$244Tpx<^V-9aA:*W?F4&PKR !w,4MM;$p8+<_KbLi-O/>BS龑q9/*DYRTOOO(ڻw u}ll,G,A_*#L$T2JH^19]K{_@ldAӬ&{S}LlUt]\x_RKe B!%TJR&- `,s~X%!:D:HPrY$}x@:gәgh~TR:,HDUp BAiyuԄ0ԥ آa D4 zx(BV RJllYIdKCQ HiR u.pAuA,roL6Q !C ,p-X9gc#@?\u +hT moM!:bzPͧ*$Q|@˲T[L&)Rku@+^1a]:H) è5s K@DQ˲UUB!Se!oyMD^~?9F:Z^CC, Wha*І!E)(ZJՍ{韚S\4oH)tNIJBY Bg|uPxrz_ʑ\6gܐC EיĎP(lR g7%Kرc*b۶2=mܿ&=".„0ag~p]n,!a (++mضm直ňj{|rT2/F !T)owsJ˽߿d|ӷmD,hEN~7hLBӴD" e;_.%eD<W}*g}Vq#Xl H Hw?xӮڞd6=|uTwK237ρ ===BL&|!P(#tVdD"7Y٧/Og iuGDwߞ5u%Ǟuvx#n255CͧɎl-hva4Mg4u`@ @4{7~ՇS}$0Rqƒ >1.laﴅ8~߹p z-~?buXC}i}j} 0¹Yo"U94e%H$6!:Wo}h5O??-[# ƻ 5hi.h~<.DrgffqTI9DX,V7BR>`VR^sD$}b$ [o4;;{Igx'?sGmS[9믿As }zCNRdok1bd-BijicccB*TH qi@ߺuoڴqƓ'Os bbәe=bN 9,h1b<f@HGYIBuo߾%{مK{+x<}}}oi|^s];USP !\ueot/7/.I8pΗ?/k4aѹ 23BKW8]K_Ga,Umn͚SO?]9 9b !:`???_ۙ 24BCWcEu(U#JI)U L&DCL&' Lՠtd2hTTJBu0?~F:k|P5CUPge+DU4MuUeD"1005M4Y.(B ,뺞J,066VJϿg&QAs M?<ܕW/ebE|wvd xCwTpth %q6jW~HilT* hT D",KNR===x 5EfA/:l_: [PftHWH!%ziTT]UiܮjQUK}H/7!uS $bD UAJ))عsgWb DS!hTMpT9BP : zO|lz|֍7nϑjpML  E| FRt0ʤH D ǝVI0ϹiilIB~$,Whysȯ&qwwO\F+Up)ّzI$p"R}jm+G TpE9?G:KG0ff 4MBǼCd0~ؘJbX(ڻwD֭[Ŝ-%oDgmYABp2}|nTUb@d9 OݮP Zx< n{@6iwITu.ԂBjǷn#xeP2/. ΝC۪gd)mkȮH$Ni)˲r$D_rC:~ӊWf:iiǐe6uC DkH$TJ%hTP(dYV8 c4VaH)@0d2E J,8%+3UC9uXlEThcCQvc`ж҇رcHIu4Z>SӶa"oHseB>1Sq ۆm[ %86 IDAT ʽ TňR֝x`$!U:Ƿn=kWWr$K,\g|Ht{ZkA~I%\Rd5Xs!UP_맶o++3+Xܡ6]F]4N6 BȲ{9Ц7,(XDr;hbSN*CKS !)8鵇w՛(VvZdbGaʦl^i BGFdzUQ*V%s`gq4EA!W޵%s$W,lȡ 9F^oI(p;m^f\Yȡ4 :liEN!XL& ;DQRD/F===֭x>FzP&uGo?xŷͷ޺83f:K x<΄Js$`d$K5ߡ֨d>i#d ꟩i4-J :96eYbpةl] m:NBaꠢ;޽c$[턱՛0\Wޒ<jzNʱ%,C؞U-OBRMOĸorŇ}ЬqI"XdN-H'Pg@DQw5ֲ1D '@eYHMͻkzd zF6dmMW]I=\*-ˬNȡ}0',HҼS%-Afh4JAŲT*&,RT&q:esSP*WU/tdVgPNW'+{Z2!hC x~?n]ו iQ'wj.@롡@Ζgpp뮻;<5ĝoܸqA*XY"M@i -,K"~-Bռ[000݆ǝRa5Riʵ  wq .GHuG,Ey~~?c[fF9yO$|KO2U9T]h dy4ouuoi"rawܹl)8D׈ #"LƝ=CR1Xitww$HoAJ@uwغs7gn/NtX -% 1DiYVN_}f*iKuf,?ʩoc=ęۦ67n,]lB=ԗwP(Hb1U)arru+JB$0=ӏ|mS7b>~?~A:x<i[uR4ߤ\RAG%QV0䨃{Ç?1ϝ>{#@>f'Ib= 9+hd{Yr,#GruX@BZU3}@J-| bv&78}ybk҄C2Ѩg)Dy4Jb10֭[xѨP&b======a>:8=-G6n܈<1'= xܷXݰ,mf9UQ y<beY,+~]5MSTm:Ad>ń4:L Ƭ:/}^+/|B48ǷnJT9EMӂCS j!]קHR@ C F̠@&W^/7߿EYC+Jz+0miKUF۱inbպ D4b-`X)F(X9U(EPmN("B 'ͧ'?o7߿Ԃ/A-cxhd'[f5ʧyPx!D(L&J)ѨDT* WQ5Y8y#2={ȲݷbbbC'ȱّdAuF˞ĹsrlifZ}8*]eY9Mj}9b2 i^upNQEX xخU`0 :E*0~ؘҕjB) q~!HrqZ:C B 1BB3uavw [U`0ݶwdN_֨UR{X | C&Q*@ɢRHvhLL.lXa8t+uX,d,YlB. Bh|MI0~]ׇ. ҕ A \mD}1;a1xNMs!(#A}uT҅wgm,2$W UY5 ב4t@D`iIKeYC$yՉD"K)~(r Ie2xoĞ={s9_=~luxw|/9@V YoXr!!WGx;l<שJ)'#ΈD"9 "2HLOOw}SSS7nL*To m~8x;Gr9 MّՔ:Qr D@g4کbn2L8D"u zǜo ݻWmbXVaTb o v|cVT=z+~7nd -7{^ ǜD$q('{RZH$"FפsTk68h%;|>{R0t5M ̄Bcǎ9GlYZ'fg?ss}дm[ϔ79Ӷmömu{Wտ—FkE@d:d#f(+ԊUgvބgϞ />]ţ7uQ\&pd 9;5rVV" :FV7#`Pu 'Nv|{mѧvvCI͇>;a_+KX dVPT =Apz4 IޒT*@3_יVgWޟ*`ԛ]P[.)e(P%]B8\QVFX4@ FSrߟJu iΝ]T<6co_Nua)$`ٵd%m1H"RD"բu iُNr'nz׌KBV|I}bP>HBU]׫XY]gsssN'@7t&Mؽ{w_i3WlxE?+f%XM9Uhd~ŵ9 zNuEW Z}g_dP꠸d9Ǥ&]*X@HewUCer t]W8-TʲtSٓEMx]3Ȇ Bj,e*rG9(;G D8ηDwtqh4 R2C*2&&ݍ^LL ^+-/Q ?ݯjG~i ,i!]3\m/ nZb@Ȋ(x%!UJ*!ɨQ~ ArC1iXVuؕrJi@V-`X!ȟ?hO *Iu c" Rͪb4mΎ:f!č00iP%'ie(,:v{*n0:O=CsOO͖,3ي!gJ I#iex b1xUkKsFў300aݺuatHeQ )7\z_/_w{M @Bvh&Aw4arb@ U F'-JO$,+RdDi8뺪QmYVNH ,Kdܿz/T%snѱi{ F *l=%UHjlllll4M!j?=D-$BR)ROOO۶===4z\pUR* s|}wJUJB]/ l=(3[,Xܨ|=dNYF *\4MMTH@D"ηJ*k \}뺦i9J}vlg,Lž+VQ!-2bYw(Ars4r&uw1wC&QTT*djZWcxJЇ> f H yǷſwחv|̕P h^)V&45f2>cdgFU䠒Rr)iZ<u]=40 FKӴjQ|81X:u}u#w^fɕNi!s( t@mG& HqPߺa(P~F;qGMpXVBʕ Z5wX"zi G?rȝ̾7G( ޽{slFرc94+BLU Ywʟpo}9>ysg?ztKK8 IDAT}Blբy萟DB:,ⴲwjF*rL&u2GdFUPC0TjBEq腳ڳv/G@x8Ie Wux01+=M6M!tELw!CDiHWaB8Q'O  A˲ ~QD"D=x<>44f.T%(!sܜ ^GD"$=XHdS2w 볟岃^^a +О4pnR@ L #& g޽{@ BR)){J,S[[d2{:J144{zzLFJiZU̝ٔ,ANJRW/M2׃jXiYY7-s@)A_@ct*#A];":Dc P]PkrrRUR֕//-DeB},\6C˿Ͻ޼)P8IhXEQ}켄i 9(S: *CJzzzjr/ iU`Q4yE.ևk 2[&R">1Lah6== ?MjZԎ\{Y:<]݇cquH, .Y.ЪA}$T2N)ұQɳ'Np9twD Bg:M{.1 =FRi#,,HeR}(B6 t =BQ 2L<O$2`0 8H3?=@2 !Ԋ-ˊFTJUcL$pQe.ѨQ%._ggn)~#ܖk^k=^!ػXF)(*r!܄$+Bv0Һ F7Rn!#OOObU&۸Sy䇮wd˖-sss^w||u+ s_5ls/0MLDJ )ar>@oQe'.tAo7U8  Oy3_c{f94u1R!:클@8XdR7ǥCCCm"PͅnHRxܲ,U3 9T*2x́W-?[ Z3sF8uXQ(x_^.ΟdG9PEB:kTi-뺮&,ܫRS N^:Q˿Yoxmǡ7ܨvę۾^Q1КQ;{ s^uQ$9Wd /JѮQE;/XD"֪444dF PVUhR4TMx\u畒[^zçN1௿|=ui{h:Cg:u,6qP A}hiRCB,5âUCbrr2ؘ*έiZ$QnszY_lKO=7\#'Nc7f? !1\Ֆіߏdߏ+,*$HТ%JJ!e cvZt7'ͨS?=!LF/9(N7,v415\sFG[ 3 |><$ygs]N0lW<\kyScY.,0?9ckh":bP:JR.,Y|ѾnKpl53 o@o/W41is :wMXA,X6 O΂M=!(ɥ=fa[Ta!u8 xXBE(kW2E m?!DuL3XVV) Ϗ!:P) ()* $TI:4:\ܷoCS͸Fx:8%H.ӔDK:A_o_֤U ̇E>"T٬2a~G"jz{_[8٥CR8p/յ@]¨w ECP Hco?zFn?u]V]ѱEJ58PJ~6@!*X !(B>οո r^=4C aegxs%>#+0Hҟ@n(gF+/Rzb]L)I%lI3bR H]g[ߐe KBJx7SJ7o )'&$J`v?'qE b]3=;W/,(lHx)蝅zM+'d8T1ůM *bI(Y7Ipn-/ɳa:g+ L ٍ^1H;2?x7>=!Hk+]b`k^gwF/R+3CQb3FĈ>s1 `brV&f dtź V4yE.__}K{ (_[*麒BMRE{@vbڻw:_=5]t/xEd|{{= x}W_u+!VC __{.k.m~ Oyp;>|lV0ŁBH eYp@0b!795| ]nLU0@!P Yƽ{; SBHÄʙ|*!P :;nͿak/3; BwL'~d~;a>x֜yY_=a! D{sɞO xYKŠލşZ.׻x\ !CDR`UqFk=0p^V[׋> =Y{su^/-!,Wtvci C { DKq+xC'nRtbPFV|}Ha0 C2 njJ!a=t&baWxo=>q ^xحq G`x !)MsdS@ vN?$dO{S"V(u{ŷ='OG?Eu9~% cAl FΉ7(6p 2`J·9z5=t"!h Nof70AMXB![>R3ffwAKaipA{`tPª;|C`u_>+Q\~o^wlꇹP$GNLs!LgjsP Ct|Y tɐ!PvfI# 69S ^,GRyPQ% Lx݁u2=;Ӏ1!.G(h9Pv?i=OhHȿ|_nֆa WUSS[zԏC"gy] ܎IU#߱'tJ.7m#%J$l $pO*5ubt Jָ.Ww 3)|#يFz9D';3PZ3lVUxkΑC4=+|*t0]M\-xE'4B Etm/NaTWNXOtp7ZnLPS@?6n78R&%V'F$ oiu#ڐm8~`@9+Oֵ͏"`im6,qLw%t? F"xH>>Çr_'䉬G5C3΂_b(2?}[ʿޤ7]D䔈N5f6 N?Ε&3:l4@xWjCR~k?bvߖo_K=rϰ5 *=!6jҰbWkL6OߵyWGyLu}Kt=C@;=7Cl)U mg%S{ #ߒ[fZӃ-1,:|8~Fhz+چ8l{/Rz/SEK'3#Ts0? 1-}o/tۘΡGW^-;CїlA>w:Mzt6Frvr !:gfFAVN2K5&ImZ_KnHHzӒB^|#g\wID֟Vb$-5Ҷ"O{|ybpW"W}{tgrWyPoCQ?':Ͽ+}L|\YfɧmfT>g:ꇖNqAIK"WH Jt3?ƭ5FB NۏIrz+7/e+++CGo^MO`{y?Dg{C>7ȨwUm='kkrLO_y]ޭ~ffFq[O~?ROE׿;N]]ێ|SS&뉁1{bd@}HpL<&krȆ8뭈"~x)ZR+_^zf+ƭ"c5 $IeYr9Ðo_wD?{s՟yϊ""N1M9bCU~~b3UCa(2D 8dfESp.:,G'b$SG&~p=}wM,.d=[ mKs(I4I E(+|y|+K3cg]/Ȋ25:q_6$m $rdZ^'ß9xE9q\]97.l#@$o+I9OYumlfZ$ @h O}#Ԡ];8ŚIc^剧{''թtNw#I@ "*@&!2paȓmoQZ|zSxą޲BOHE# 6JdIu IDATsشu=5@pwlyS](;n' 5U6It5:QKK""εGZ,IoAM'DGځ|a;˺xQ.^\ueEdrRr3OO%Heey 2e .=2}[?uJN|OlkL&e#Gzp{AjYw$@$1^%6T!,-I6BgO*CE~ފk!'I ߈"&Q? @m-1kkmkmFI "`[ځpXZ=$"ط:161zI$@DF]$whiY{:/g"en0vbTZ3_eԅj2W=EW._e/+ڛ)t|=Sh@Y-hCRI8ݾkk6M?>3aj-DdwF  0"Ibn5n0 =I{st%3m߾k oxQNZo30+_U2!UMՔ!"#@3Pբ: @@7y@9P^֘C 8<00 rIJ8]J>_ dqzBDi.,,FQ. h6|7(n(mj]mX%"I@۶4`h TYbfW曓OMMihS@9Pv13@ Xb` ܅8N[ m; lЃHH 1j $I277gYf3"uLDoQA.,˵Z8Joy @ @i6AxwA0|K4R4;;;;;yB`0 04\wuWҘ=x𠆻FF7RIdR5 cnnRDQ04-Io۶eYiFQEiZ ,UqGQi۩+ѹ,t2eYsssIX8B>oYVq M0 nߨR$mj0 0\XXPwؾhj4Fj-,,HZm… .\΅jThiu]uաSW+қ*r=B2i;b=UK?l==a욯~uGΓK˲[h(8/\T{|NO7ǢLTVk~di6jvݓ$IӴlXRj}o6 wf:,ft2jm۶mo:2al6w_ GIh[wժLjlyGKqFQԇ<5\4ZVύF<6z1&8T*:Ws,ngqah44\dǥR) C=[ՀAuLRNm٩uU}!zimǎ`uuU9o/K m{E^HV㐨}HjN2JeY*FP eٶpտM`D,)ui{\=\">m:@ZM\qx֭¨^Myg?=$IEٴ(pB._jF7Qq&qGmZ JdnnNUǵB:Yͦzhh;}~o{{UP # 4Mb%0vRUY͚'x(n8EzIe^ ˲}@ ȨjY-RD;'I"ahK27]rZ-bF -zժ/dP?FQԶ3T׀zD]Q0@XAlnu"\u'MS. Umn8I$c5lBDjyOeioj͹̆Yy3EJeX$IJR\6M3M(T@ƐeYz]S?o4Bj>c5\.ahAk4D@ [x6`sS.,,a xTWXlu=¶jOض=??dZ-Jl c   "*EIENDB`starpu-1.2.3+dfsg/doc/doxygen/chapters/images/temanejo.png000066400000000000000000003055401320135501600235650ustar00rootroot00000000000000PNG  IHDR!ZgAMA asRGB cHRMz&u0`:pQ<bKGD pHYs  ~IDATxuXKw-mRwwww[wu[wu*5PZJqHH$ 5igggϜݜh@ A{P@ Vw1@ !>@ !>@ !>@ !>@ !>oD"!F Oi>00(8Sv~dff^~иf o}@QˍR1cn}p;T,W߯e&ĀĆ??+>=*{TP݌̬77obllz?.N==KIM}Oze4-ԈtXblcekcNâ(txZҕ_j۪ye7i *:˗CGNkբu& F{&6!MlxvWvw+Wޑ%7jruJw3M {"4UCo{kcKS=UpPH WBvL\dʵ"p洩66bH,bD$3}'̝6͉M YӦXD$D,{'6ps3SWJL&Ŝ?~RbqrjjT\LTdqiYYBf4$=޹sU^,[ϟtd2LMM?|`gkfKkVߵܥ^l:ޅ=Lx)k|fy{8Tpx쩵KLsA c0"6ȈiblKDY%44,**s)%6!l0 6fXLX"E{zV &6|icc3[ȰM(_|>wUDtRjrʞNdeeݾݻLccEӴX,qyr@kMKOJ>y+| .?XͽbF2Ŷf\j}XV6HJϾ>^ώ6|6[{?|>_"qpFEǜ:{a)R`0(Ɓ69k9оSL\;wH缋D^֧o/64}~YYY^ay<ї_gg//) bb+@fVfRbj“߆ Uo>Ƨ&&Y [kS;;'fFӵW@F1?'ԭڴjnog+HpO=п_z<}Hduރ^:wJ(SmRlؾu4=|p.1`!6l&55ʧҥ9ROx]#g,FVm"߿ӫZC_Oݫ-~~Ĥ-wؠyM@QAVV&O_n:^~LQ`{===i1Hxcoꦦ&O>ykUajbR*B7QF˶|Q = ;V׍ j˔D`oƋHKĥ b l_~RtFtPd0CþwJ䡬لP,9zHZZ4sێ=,3LG[bCn]{zܹ [H\6~-wtرBff #..&*6Tރ*nkܤ?/_hΫe]3Lw{70srut8 !Hfe=;4ae b C ㏍.9,|rbd?鳧rjL&VZ}e2Yfa_»(6);lߺ]BK arbhGW>5l0if2YeކRi -Ii)ٙ;VP͛Wn\wTb PXiݪK%6' K=044~:j*Qk+8:M7aujնr oZeAxtz7?zU) <.Of D"F?~mhiɐPl ƟҀ ɤP~ 6ʽ# cD bC1(Pb8-=U]G\uJ*6VV4MOw񱒒¿EDGGGER FVmEGGI$4@K$;zjxy=xMۻ+2 _eǵE-vvl&b8Œpgޚbƻ"1?V(ĢK`I%{ 1ɊV|) \MPlRl;&W÷lB X ʮە,ZB3LbCP &EA>H$JOOm֤ybR7BBBUjh`P65>@ |g'$V]ROO/""<44DR|&Wr.WꕫV5}j\t \E"8E)z[bBёcW28Οbr_/瘙7 2Dd0}X\Yh*mfbP]bm^#?3˸ ](!s( 3Sn]z\|m7Kn2[DƶVZffYٙ> _XYY3KS .5X[[_rg_8/qRZv2Dym-a3O.h!Y,C##===[T߯޼+j֬ԪYK^@.{s.SڀJ(SmRl"w|j16\^˧:GGgQQg\\Pڏ`2@ɼ,Y[GWp שC4>o޾}@ pqqiڤ)IJNgB!!ʖcQ喑v*32N>MҥBx^[#=5%5-$$$++խ_Ri4@WWg> -iZlᎣ7|233uuuY,X,Hh)_S;:qX[kbCM D=~߾})Pb/Zթ}2?JX, Mۀ Kh j-Ā۰#P$`1٠@K͛6Q\٩CY+d>EQl6ege]q%&:j6V,8XmTg_SýYc!TR95%B'ss ss s3skR;KTI„ڕ[9uױb[7fJZ⤉0iڴQ11w+}Fi4}yg$<${:0bdr\##C33SSSsOb%6RZhH" 3RS32B#G0)!)Ź\YxM#;pD$D´Ԍ>?] ̢i:22z̄I Ćc1(d2Lb u8/_8|}.yVb,-{8;y888X찰/wIQݫKǎժVutp07stpx +8UtYZXf lm^|Qґrc֊ ) wQpυtY?wg0)5SӒ3UT=}ꌻk%.v}٫zlҳl*E[zbo{Kci?ESusvv1PՠN wZZSf !!n޾n [h~N *nDlB 0:*vVb1YقO!n޾vF =%v6 k)L&݇k &tuCC_VfV+RSS==--bX,*gXFDNWw/ESۧ7EQ4Mgde~Z!I7qAmyW%NɗkU(fWZ:|?z6nݼx>(¦< H-1]אˤXӫ[lG؄AΝA>V[D,࣭^n]G 2eĂ>ܻRv9IJ .OGK+X2)Yi`FVhzƕ $X,E"tQ +!)ȸsFzzzXA+ {]j".ީWP/)=;9C IDbi #>j9[r\# }Wzos6KlB Hl˱42۶lMQH((5k QQ_Tl߮I  0I)D"D"P(ق쬬̬lP( bD"a2YY٥]R6]KKMmaySJTYVfV&?3244~@ z굔dc#.[*hr,tG}{3wɫ3RS! )߿}p7Ma0{_N|rJ%6!$6DMW\%lpV,]kŚ|~ Q漁5lAQ`4MT{67`0,d2Bub ɰTh~aSb0ã!]ny;3ss3.WWWh{as.\ֶEӲyM g$ .d[60h؛7ժUݲy=BO~ޕԥ#OKb0(! 'M KogB{l!-cDX,(0 I[144d,SjXܻscq?Hۄt0AtvvvFFFzzF/hdp8<=@ ~?u]vHLL2mLMM5av?m"e+IKRBmͥX,HR3077P(Yl&!u)J#& J4p8BH,K;5Y,bXL&`cjjg"] bVW6%NHSֶ$ŸK) D !>@ !>@ !>/ 1p+U&"N.`/?A^n.m#|Oeߍם2bCG"5;6W  18v]Xk37Ǥ0yf}v7o? ~W]}*u[-\9ՙ֒y`0_yι[)5zigsow~]2L6d1Y,iILlFP GodcGxG~mtCռnBp ՝t1^x i1=itGɔ̤#+Ft}e$؀I\@lx?z#W`xrgHZgo|J)[[<rp=Kd$9hBQ;V}i=\LYLMݖ=>`+4SJ%*^,̃K'6qa&uᵽܽ =EL˟'lݨ_! W@J.k\<^ԼoL!!`j!ʫ/D*NH}=Z5pZaǕGqKnq5{cR##U~rް5yUncK\ZmR.y* nm뻹yk7'wl٠͐+koqWj~_C^⬯fKYLeQiPyC=h+#Ph;z6+\*ȓDuq`yfmg_(F *}Ӫoyڛ&+Vv5(+߂[گRZ[I{m!nooap/v@]oZ>iK8vxD乼ܗ_ypqYNJ_9(;ݗn)OhBT֕G% )J:!ǭk:kˋwo]i~`|sJoLM:Z 3dѝg}x~}Ha+si\[3阵}sԵzkM2.}xYO7ib&iG>˄eno<߈n[x@oZyiHwHFk0కW|fAEm)POoZr[ U' Ho.Ϫm%}ݗJW(Ύ8qO?}XvAe[{ t*מ<5&:ʙ]F~o ;/prPA TEPYindu:xzF23_5z[hG{R@]r4ԧb*Mt5suW?VF|| 7,< [h?zB*^pYQ~LS@e{  U`$E]N̏|aL:B)PL}ZUp:TV/aV|*hb( )J4:!.[5*vD{WdepSV,/ :\)uV-six:ja;/K_({'Qz 6I[0YږET-u 箨nPyCUߒ?{ EYG{(wFc\ ;X%a)%P4!IJdCo|L[pymv4i ޴J `4<{ϼ\SY}?5;OG+ 5[=b*Oiu ( XzL1Vi uB+\% }rQ#ޜ/X U:~A#sSf^0bR)].qVܻ.-NK[ ㉿&>pu[ڹF财sVܜkqgb*ojLJvm\( SWWl=d᠑osCI Zlɚ(_ U5y]k}| #ZԟXML=|t1-I ;faST;~$D_>q>e2b*͜a)YY)6OXnBVJtc2 GI]STUBN׿'HL&߭>uo^rʼno:˧̾bɛvqXydDq9qwZ*?VK+:BGk`c 3ooVZLCMŇxͦGvm\/@uID{.oS'7}^8JNbKDbZ[p jrK}#?>1 ^޵WΣ$UX)gVOҧO9y0-T3|4,z zdn)N.?|X嵅&uiOQVi uB7.ݣFyoܡϾsK_=ީOUgîj̗ ٽz9yx6:!mF:\Zi&~yۭtv_jŰǚBkiMu\e-Lԩ#^*:57fw_AYWXPw[&x~A-ODw@ hkOAo%Ҋt;K@ ~*izdk"& I [LC@ zE ?O+$@>"@>"@>"@>, @ @ P!+:ZHߍ!¯U`\GI(@ E"z k@ RI|,ƍ@ A|,D Ǣi ^Zgn'ϗFףU5v\ysժZͷߴmib:䈗QͫRev|n;A0E 6ro@ ^,4ݧO42?5Ż74z^?徫^=p׊Wyj1tϐEw!U‡ `N].n͙4f6Zujm4j}d+fkѢQ.W;y4~yz[n6jeԛĪנ7^ώݩ_urhqڞœ[4mެ]eN5@ J]h5vx *!2<*>y|UzrM\ֶkfq/w0q߉hhw3ߩP?t0zNmrO:!|qX-]>R1W3\[Lm[1i7iXn*g_dz߱wo,HfK{O*wH BiB/g#M_`eq7h_ݿ۶|j yJ 87gռ\<\닳¤ct2mƥ)<4c>Klϓ `c,ڍ^)z5b_} ut ~ux 6fWԉkjgP"Nζ+Sgu113g"i@ &T{3'OLQMY&G(3T~A)MP -V'֍DZP''8ST=#pH[$4ǚֱܼ)dgDl N׿'HL@Wm|IyJKt<yjLYܿ.gR]z.ȓe=Ke ҟ BQTs*r\9AE@ J}u1z֮Oc|/0w5λ4}yQ}իZ3Nfyjꑧ ٨hʧ@ !>s 2G  eC# C_#0!!HLDV ..+_:ױ{`YBIвxq)ieD;ӧ122 *ii ѣZ"u$,B"J+elwug~A;-F8Xbcq8:uE\1!!w /EB c$i=85ZܬRW\ ;ȗ'$`b/K!s^7S>F"nPlr3;7H=]~I"̳٬^n]G 2eX=yy<ԩ5 ;;x/_G%bE ̞p0 %hiЊN}_hK bk=)߈_n=WAMUVZ3S@x|唆|*UcܚDLI{ $O/EVT9(''l_ͻ^^'9cS?w7m\ O/$G7Gj^*8#_,uzn~m\ K٥9xW)*TR ճ1y҄l߮I~TG޹,mi$&u,Yд)օZo<{Xl݊5r B:غ%'a~Ƞ!Pn`@V䏯O穻Gu!741B5ɳP~q՛jz*VP:x\yen5TԕV ?D^}`sR*䤻T2Wp uS'^woAZZڀA޼ V=; ]8h=;6>>|>4NJ ecbbӹ\ [H"->|"shlDebV(0KK+?ydА@G){4oͥzot:BirAyWA>"_ѻ a}ü?UytH,SJYĀs3}kJ gOJrTRi:u`1-ga``s)f^LURbj L}}=~X?@b(a3l*-׾_Z9n ƌAÆ >27o=f 3B`Y²z2$=$"zոfwo1Z6RY].d}5{hI(*Møp&%h;wlW/+w:O6%VDTP`#~{:\]h)++\*Ud Al,1^RÆIaaa}fI<f[ `\!tVVٺ|&Sᨾ"nP\E h{3ӰO9&ڨ #ȉkodi&:XRE cJ?I5}`enݤϟ[hol4N= t:XRE cJ?>5/+=zȃ5]<6~I6+E[W)KGFr R`I!nPTE h]Gк/_G/UjH߾MnZu7@(,bý;7J?^l6֕&\,Mu#(5226ҥSJBF5a9sx@(c ("F(dd "BP<4yь ,4WLhp}P|LFg/IGUr6p'0pӷڏ ճdc~ɲj4< ֣Sb2Rgq@cPPbh PtЖ)T|J34;~Ҍ{jT4<r|G*+MuV>x5_,#S* A 3vExLL. vHb^_F9"Ўfr? D^ZSjkKrUis5)FQIHɓ)i)0LP_mo1ff2+ M YxYW œA BBPoS貳iyRkty,Wu)P\/!3߲IBaX,`oqVb~c6Ť zG D(DWoݼ}U&{{|ȐluoڕkZido*N8;P L.-wxyX3]_*4N^5.4 C$"ៜ @PBo-cn̏s\< 4M߼u766@D{L*޲HGɖ[\w0L5 p 5e sbx?dؖ-i* FJVq5e by'%oSZݩCzr4hƍ"(ɵHܫ7VDF%H{闯A/^߲~J.^ohhXްאvhCq|"݈L4&?"P$T&L3#ͶT1mYmfҟ\:0s7/>W$A 2]4'`׭ݩcGC#Ԕب☵E L$K=5kBoܖǵ-t̶M5UvbժN4^7n 2@ϞET8XBQۏ%/韧@~䟕suk;Rd\:̝ TBS^ݫSt Z=)߈l&ҭ6:dyoi"$תgt)bB?}P+ իұ8vLQFTZә7D}}}Ms=zAbh78XB1. ~_hܗ_ypqYK3߬5no`-(/nyג 'h}gZ)ɻmǫ]+T<)^MĖZ2˳jXv@EzreHwm9|mTg' ; Ǿ}4EaҼ y[e,`ţw/\B֫g ?4sƺXzYg,Z7Xk0fܰ,]L<Sufܸ6`s+B5Yk `'g[BϠA߽ÎdNZkɏeˋ{/9v2oVrmM Pl78XB)~| Sˆeh(#_X/a!J Zg7RJuY3z WIh[\$%2xء7>/.uy r1u*MΚVwb*q"8,n<,pN) s@PCs*.w qPˠŴ> +T\e=&ƹ,hU ]yF:yPLŇjqr;;üLW ;EZS,ɵ`ٺٷηAY6ͨA4axك@HNF{cfm97~o<h Ig#)JZH&@ns{Q5W/]E BXz)}>ctp7nӧ QF̱C:1*6a)YY)6OXn?Uӽ+V7^W䚁OjP%1W75Sͳg:|F h<hSYKo ŗٳG` D#>!B֔[cp!SN6pt{S11h?< <F :7ZyJVV8XBQ1V<Š\}[gy!~@9!&| ;-/H?|&e?zwұAv5@35l<6Ku}%V.+g̛ׯq`f` ?7oܽ{㑏%+E"Jf14nF Wf\߽Cǎ Q,Y&MH&hAv-b*bx " PSo:Ӯ- 08rMcYΕ+Ʈ]h*JGcƌRoNf]Ow܅fzq~,]y@(&"A.o^wזx<\Νq,'<͚sg,\ww岖@\3UYx1i!wrkwYjp1ƩNXQ#\oz~gs"M HqϕyTA۶8yY&ǖ-^-Zrtuu+,Ev"!=LW|luOOen|u<>Μs OC]E ҏE ` 6ȑHNeJ$x/BWufMzz_5$2+Uѣ$%X F;nՎ#.,(fJjhРE[.  ݸ(G;! Sc ۗg­[=&)f"x^ p> z`%0"4l6C4C(E1˕9H(b4E}^TA= G&6[-%S ; ލ)Sr%Avv.73èQ71,''3  @X` $Gnp}YG\-A2"S:J;?kKr,w 憽{f Nx"F-Z@G? aAt4*| UL.ZDr 2C{o)С5dddT"{LaYxi2H ~#BA69 bS:;I#=HrRq.`:(`U4х+ 8\ޘUG. ؟ْt)PjNfr coMOP})}鴿˧5N{S]+;% 3{?sCХ/47wACŸ>3sk@t@co JJJH$k 3Z)z $$\hP ( dZxR'+IKYC]yY)UDzH "C س4 @;D#F&`8xU4 tb /s HG#FF`(\ P >VaP9 (2@ \顟Sʫ%X(,M,CMN5ШX'd"LA:@ Q}oYH({6I]+h;tdԮv&<}i{$RN. vl4dbV >0 $K4|#iI "C4uut/- =yU{Aq:I^~zV%rH{~ x EMOzz P2jD W"^߃> OOksb0 īW Bx8e644J 4M\`*`]l{/Lb`` +r2"D(S `@$|#@`B>=@h S5bssi΅ۜ]T0x@?@TX:.GF)cӆBh餠ن~<BKVX(mٱP(& By3P.C ݵ+},Klz~ 6i_={>ϧҘ9t>Kh,sYD)_$_ -=h}-GMPic``;88 l/ `VN~[ە)@J&߀0 &*z<2A@@t*,g%M*nr * @ 0L\z6wa~i:8UrH ?? kc&|\%II8q:K . سnn툈(XZFrX J lڄѴ)CttB"#gmېEZ"C4郓Gl3 Xit ,6B<RjOL' @JL>@U ^#G`ہT)JBe:.^:/8uI (iMa22DF,}8#!4$X̩ν;7 / :h<Vtv' 1xbs̻)T:ܥ̀еx,Qbx'"$BcMƊ?b#Ե9R @D188`:tסf;-K]!-9Vr |\s hVS* 0+'_3.;0ߙ_%'~,|>&MŽ ~krvkSܻ H!++q(ʗך:Ǐͧ(xxaCT gg)Az:=˗+Cѿ??Fkš_?\06}0ZU4lHMEj*۷(އsgt]`fF'ᗠ́΀e |X @ H3rPmRÑ~0NQ{8b 8EHݧP_$PD!wSzXv~M[b Ne_%'POQ|. ss >} _h..f^ R"S <=qڷׂaa2mm1b]IErP,'* GbV|(vUhP >~.])$18/5ButA/ dp>[8{,^ĩSdKP/AMGT;H@oj':9Co* t4`6" T.0 $@ C< (ԝq`1`0WI@_X~LIyCm5Ku1Ϗ8˶*9y$xurj~2+)펹cq*XgϣR%ETt%]rͱu+>ܹu`DQ88(ТN(/I% Á`Z:Xif·f@HvյFpikPhp@7@?`h/ `UNM`jj (f -8vbY`<~yw%OTTpS`maE2Oĩ;95odJN i'޾EÆ&ek0e x +& ⻸,ٱ#yָ}-[".NVgOzU) E`Q|PPܑ#wO\ 5@FL̵+fZy@ϞAbHIAx FF ~ &甪,D+:Ryx,@aek5ݼ?~=6Xn5hJHVk*u XXSSѳ'D"h8v,sjQEsը1ҥ ]8XJip|Gf4j4W,yPxQĠo_irA 'r+;;{С4vvy,%4}&.n֝9zHn q 89aa>\OTB:E'wfp<-< zzx혘MwtǷr/_dNN8sF1' lڤc>uhVӺu kU.:sW|Y͚8tH16z&TógqpJ-}|X֦+];Y>۔;F~E  c*0w4)7iRܹŘA(ֽ~yNݺX@Q⯿_ ر.N0J:P @кv6n-IM-@UAAQLo&(JLk:86 ݻK)))ԙj|7oZת"$8PwXPD>ĝ;o/>bD/kd2͚BMCʲtj*֯/\xF64ƍ3úv3;֢_j\,Jx"Ct4v,\@VҨX<]i4O3h=5Sh~"ippVAC|,@("V)ңF#Zٻ7ԩI%˯:MytϜ,VV޴ XR1KXܽۯ{K$m?~*a2ksM06&NRŋ%gj.5z~Ɍc33̙>Cc䯴KdiSd%ٚ'\Sq鑝-|Çʓq\A#Y#GJ7n\.A+c?|ȉҭ F di[[  M=8|xzfLȸq9ᭇW, x_Lѐ~,@( ǎ)ft("ZhѰY0wъѣ]y"ݻh)3pq\, S;r+*_ט1 7\Ξ\ܙ+\CA@ >}ggg۷ &9[ א@",ƍɛ7ozLމgw^d\y粴j֔&/=YyK{??[[T"KGF"8X5߿#$Dvr0=rG{AׄNV,-~@u2" SlW:{<'e|Gi<(2Փw,]طmf5lFWϜQ˗yJeǏj7v"T(!%𻋢KBuLeB%o暗Ůvx!8pJL|_jXiz|YۨBiuwT׶ a ]D<F#^)@@aAZZRRIc)Y&U Ω9T%%XP(RMI&8~193{Bmx'l23nmt킷-&YQ'_xHw^f]ry/fffhnj80 .JC+o: +TmWXE_@H_~X"G@@1B%0Oݿ;776yJvOjgwGRATZф4r(q+ĉ1S"9ii']J1`<`TլUffll C3J),&#lD"?96)HCAKKMLTyV6ĥ&7NTZӴ%9PWͮ]32.hB9A OC$ZX/K$G]Q嵍::49 o5+/d&؈:T9?'>~bbImPZOOw@(>-p4(ý UˁFj8@aXB- Ip{<+@y`<gXB N?L`h!˔UǮi`6⻀b:8!5i5vgڒk֭'[Y/?9_ցGr Z k)> *(Ou< 7X...yj%Z [ZZFjV]JRf\9Ң ?>֋44WR>tNhSX%=&e:2U.4M 3/oޫ̤࿵"Ӗ.;0ߙ_hBn7A l\;(L/=ow/񚗅rkD $_ceƽWDy}2nnR'wOϷUmDea+TPxA9?'F<2spնN2yT4$] pUMZNdp:^/>&4$ 5m;nGÒlCם<˞фk`m-K: pDZTV=/nnȨxP>&y5Q}b fk]ËmH$lxyMVǨnxavN-DIJLpM _#sTƵSѭ;^A,A{ JZ$(J ~W7qڒVe0Vۀ!u#mNxho[X{EyYX]ˁoXuӴ"y<Ѱlhٵ>[UO~/mIv}jyNffN㛯8٫bEɃc/JVMN[+9[1̑fSv|([4ofP__!{WUAGG$يIQ`m- `[D/~b溭G5!>SWO suunn^ rb"# s8sv!C1W666 GGN?}v4]w&]߶r{11Z2X[_ 422x+'JQ Qn@$)@ t!Ht4bo>L+f6x:u9XQ8X5+b[[&`,!Ǜ|-`np`VUrAwwԮ-K''cfiܼߴicɥ]1G,OXh~2Oe4Px ۵IfRJcnXỏ3'OFsç)mle zaߦO~?T>e|q\-RA=2˗˷9iRTzV.7A#GʎCCnⴲ= K~2O t4a$׮qQgbtMܑ~34sf;3"K \zT1u(vPZV.:yظQ䉼d_]MM%ahx~+vٰO+ mޜkBuP6mR %\˥IsΝ͚76.fpc׭Zqu{BE&6K9@ )m?Ε>}íei&"Yʊ5a¹ {ܺZVL+WW̚8\[JE]mtu5rc,V++ǿ:v|}4IQnka5Jq8{6&9޳g-^\ IC1GGm5kv8yǜ4 XP,ƌAǎŋ!4nާO7mdL0`nC+k={ p""͛A˲=/sa\ oTt־k{!!ӦZY-00xFF0ǫkizذk#=3gн"kVVi ÊN}+88dVVޫ,ӫce9~͠ރݳC(&ԬŋI%4rb7 2?n hԯo9c۷o߳2ӗaHgH liMڵ37app&j*qqS'6&arY|> x\q 8B*#%nm)/iY3=RO9{Q,Ү^|~Ϟo( E$Vt8^5جys}db1 K*^}xXmdT"& bbdWѠ‰ٽObny-d}Np%pDj &,0 * '1E-::88 \z#Ybny*׮}vLJRAZrS)luX0>1/+jDž q894h 5OӘ7wb6@.ݺu @\bܽ{kLפ0)d;mY+FEx ^0DP SS/q?cB {hBwE=;1܈EF#x6y- C+}I6kb q,5*NNx-Z 4T)<=1r$M=-Am| ٗ#q\|Dl tM#>_!ĩ| ^*TXX%jB*{-Z *Js&T 8e-L-:vfQþxCHh~ߕy^ipppPτXP2llp.cS=_ v[fE= V~8tH jsvFUU҈[NNx=z(lqcC=%wrb Rs]JQ(/Qa( Uޡ}گc?N 5ZK<.ذݺwo oFF>޾uW}wUp L[==>yA~&"clg~puԯ.Ew^M萦Qckۊӓ|b62e aK]8>8¦:*UlTHXZu,Ze ģkt^Vz6]`BIGo;?zTc!`)Bc]k'\k ks\1H H0*wO!к(]N~$qH>)_ ~fROrWy[š ]FU 6lȵ$ U`{7* B|Y OAYᨙC܈[,\jAjaÆ<G?A" ʰUMƍ5*Kgb2էx>pgb~n&[O(9@ru'Uԩh^yU-[iZ[^œ`}oVTG(NH k܃zxQc F0u*ZPyβCa9E9aSBCzy}ܼ+p&$"h`ϧQv=F0m&Mha{I n KX؃U$hc`p:(}@ύңbX6KvO>oץ$A_&'eCkN"BţgP?#rAHLɓx!%E 65kiS  kgJި${*GCx@9Y1\2]]Ԯѳ'5P>pș QQƍѸ1}ѣr#3Sme<E˖(4|v].M PA@o_w|T VU$c@g`6`F@2ת͏Uo}6A'~\;uɡ:Oju/(_'7iTϊDN z4u23] rw\U-`AP}rʂ 9Ί)zaX/ OiiR>Ji)&\fqu`꾐 q?hX: Yl?C$§O K|,NJLI_LӮ(_Ց]4jh4} TjJMZgT153/(.32a>  0DD =#h ao9 wXp-S]._ʷ1Mhs$$޼:?'U4@ PNЁ.tA(EU@ %- -Sx)HHM><*0x Xk :@tv+յ X |jG; QFq>m~4Qt*zf:1]b 9xc3:˒_"'4"Hُgbk.B  "\0PMbO_݈25>eӊK2!b(54r0n'`SEI(!bR"XWP@E7{FHGBZ4VWB}^:'CP-[QU& L0j*!B(H \Rh,`3@13EҊ~2*S@xK? @g76\@KYN lhX UOcG\ju ,Ӳރ<˿([in80-yrHH g:r7eEee0)a   D}|̿;ξmªy!°ߕ`R'`|3,lVrח (3vNA)/,ʎ!$MPCݺz Gw(d)&ۜw2DF]ХBq4XP4QH*zL ";V`1]M:2z?3Szql)Ә޺`OBS˒`[KrElr$>:dǴI$ZD2)\&LG{px\ X&BOϝ/gt@x͑ 4/v#8.52MZБG>brĂ_%'B@XO W=/.tt* BGm/HZ$m c[ՐSX @!EVp( JBhl/iU+ͣi} C'PCB4h.J ('ʢYz\ h҅䕀Β}dʑOPvS fP 품BD- 2} f<hbP $)dc%-%P\P&Quh*Rs@. иnw%i@\Dzh/12c9@}`6к xL~AZla~uĂLͯGy y\Yt$3@YD:YOT͑{0 0\h?Tk@"B7d<:J=KrMY);T)MK-0IcuX|]ڜ f&:Z)LqS)~4Bvhٍ&gҬ)~}>^(Qd!.1܃\8wk"w,d!"8}GǪ\k&p-fNp#RZX7лl>Vz ?YzXv~M΂JgW#9^@|Q/&JQ[@{h2hU_^5;t[-Ƀ25:˶˞*9y$L9E|, {W֧V?}{Dʶ 5dDF)&P[독N6YJ70obi.xǬݍEt+~ (e7Z֋&Xqa<_h*TW"Ci4>'p }>U)%q>|4,HRj60 h !/ 4jU?uo@#j XS41RN` @iQ(5O#35[y$;>UNfI0i3l^<NP !%)!%;O2/IiE˂MGWRQ\QO  h9-RI>͛A9C9 oBAԟ"4E aڈ-(J:͕PI_ 0t#.UAjz5ZZ)^:?NtP%$vßѰ߽Ó'Fh(Ґ .zz3TAz0PsoHa+&0v(tRqB,ƛ7x 3.ۯvvpq'|}BdE9Â*x!J$At4Scb!e|61N)`cf;/xr"'-쫨ϞK!<K;: ==88R%xyfFˑ*)dT1?bGcr""DA(@]04)ae*`#Qc4G@El C"fd#y`DD 302*T jB**7 P(2G"\B X]ݻGC FK""5룚cKB$µk8t\;vEE^F. %˂8x7nȷ|λ_atNd)]]OtӴa9P*b(#3g!ܾ >?ש YФ zF6,b~Ǥr\T>Çq gkh-ЫZVG.m}H|I @@wQ*zûȣ8q#D65EVMw c|cJ RǪA|~ `J|Tkut~nT}S{kXиlaf&vڵUTXFOÆetXЩaIUm۰n)|OhccaQ'龊ᾊ2q#6nDb ѣabJPQ" >_Qv=ݍmiäI6,0 :( I*ĝr/dTY={򺧚PNŀ%1K+,3XW1vJꁻ醶s2Wt!ɳeg1iRgݖzZ)Lbcţkt5l1Zxߏ3|>̟q*`Hᣊ"oǜ9y;rS%K`Ȑ~>(|=xZ\{/llz5z*4Kr%h׎x ">MFƎ| a>&u(B| wMnjn=S9ԩ5 1hsJLԮ gg̴<,'RR3޿ǽ{!? =q\iÇ5 ѧn̛__4l*U³eХ+0Jx}d)GٹIG?lT1V{jrQ>4@pvRmG % կÇao_̷ rF٭kx@NvF ?@Gz Q>*WFŊ04t$'4}C([GػP/etb$"*G ןlAccA|yBWiiHLDp0^Ɲ;x bqjwǎ0$bcE|?m=vv3{pޯV+wS>x>"统<(cj&LЂh.` JFIDAT={*LXՂ"gNRwrHŖ-8P >x]aSSiF3d¥ b>"6U:LOǙ3ؼOsGQ14ľ}ر ]zdk'w;ˌjqQ>MMRzimRRp86mB@p7ւNE Y=- Vx{t"{vz8;%>5KlT{ E`аI"9ռjrbFFlܨ%_w+2*3X(/^u\c[ffXCy(Jcz'x.׃.^ƤIۏ<V$ EƶlllzV9&T|&c( atLENrX;JScɹq&[E-[0lX4Rr۶I*a1ĦFS1ܿc暪HxOImooogg/uv6 V)\"&N}bju+FRr8X&=ԜQE;N'"?VriZ1tL-[rɼ|p|,X8a x*K?|s3$N]]ʕ+g859cС\2oBZ䵤9*+XEDyv9r8Lb 4+m>jJ۷ؾ=KK'ikfJLZd ?~DHHr8ر+ ~迷og ]\ҭ%TZ76ZW5V֩S-r9[_];EWEA.^_ϞQ# <ӧOw ;0N:uj$wGСwm[d oB˖ 'Oq5ݻ; ]\+fX m)ϟڵnի sѣG1QGv׮:s"lG,SIOt}k7[ի|8W8FFUYmr9E=Dr…νxN\jIАY?4׺aa=zT\91f™ǨXeC߃_#^ =;_.#tݺ,"9h>rDׯ_ `Ѻ5u<|D6F(՟7\GOH$5L޽iAWї/+ ͼK\l˗FS:׫w)tx8榐oMDQ!Ȉ~H7ojmk֯n݂PZ=Ow7h{{|cci;mn`eE(qMMǃUk(=kl\?-,ml蘘iH+$/O*q󦛟 ?H$5pyϞ:v|>H!ٙNM-Gs8 td3W]pl~ffeNK {{!">VYXs*^E7Z6h@ݹh|,_|є)՚4BJl,]{{:9E;wN~F"L]ТI<{Ci2rd֭cccU|ˉqs33a׮\@%I$ :ռm[}_߼W$EZhHS$? `׼gO|;w:4##CQ˓'֭`@V\kaA$?׹TW[~utٳgAaÌǍR%?kO(* Ջ0n>yB3 ׭Shڽyj{51޵yWh]]EE jKe'5))VVzkMºx\͚}9w޲ES FLDD/ԩbhJEEE)*:}(E]'Nhڵlc`իАeKƍؑni̙g>|X&"k(-[V}\e~QzERP (}*jZTX%hZBwdggjՊcFFTeݺܬÇuXǏiXfQȌ~~NjYըV\5e̷oj֤?/ԓ'k#hW\mhj2O>T! g_d~uUJ+k#44O;g^~mU6BB!ĉ-Z(,nDQWÆ- dG.]Y,!:ȑeZ|ֱgt8˗/=Ѭ,-a…\gdi[HWo4ݦO&v-9j8tQP,c…8ofղabدS D͛_ʕ#v#M6sLE$҄lV]k233uagzxQk~}˖ZKٸQ1_reL"M&''77![Cqag7S,J5 .ejE1x4rР'J29]Х>}: $;(l٢u< B!>N{A S{ta!*ْSڙx&ݦGp%MH3cP0dr:8v69|xI[XDmf@|aڵ0Q)V2cRӉ 3n-/*UС:9E\QJ2XNqvvw&Ι33ir…ڵ;@*UϘwx١VP]^E@\k(.O;)SM8@VО=Gʉeh+A:ys9R1o*U*֭?4hNY[ Q طOqn<[ہc6o.vt{9޽o޽[v+$X1}2֏Qwq!iOfC_5tʴGB*~&*ag]rvjVGe;F")ڈܸ!KxX)))kO/((iյe~}Y:=Ot۷xR67G۷iECaǎSS_+9qZA߽$^<:n|*(F Ud z͛МWǀÅ hB|KCT`9OܹXQ06=F5?ǎ)6on3χҵkkEÔŋؑ.;:Uҥ\AJ PcI20+ `dW&:A9QEI0Ɛ%ii2*Xͅal8ۀMZpq 7_XZi=`a1N@2y-q`Q+BK/fqr#n% Mgp"\P j愾}a`zRNByw"Tr"e.hsWJ0l4L믱)~)@*XÇ]D.;Dsx9sdˆ:С.s-Zpyd|4 @!Jkܹ c9sҥC##Y6$ɔ˓gҚ#G.O(~8u êg5›r'U|dǡȈ 4aUGX" |+&Ӵ;~}gdduKYrlmcjּr5Wnח^FEEnT~x[79ܸQ]r ) zI?~ d0Ei_Wii?ԕJyq,uߏtvFZPܶWeM ,mb"߄sԢ}^-lëW&r]3U,,ɕ uS8 }5Z C.-5T0yWO8X9@W+ںa₨ Mu@%/g)NQQ\Dy]u?y8(ݿtܸB s׹>}˦NTPYYg,\':eKo09YIR϶{='ϱO)O׭$oCBTi7'/]*̞t}ΩwY]$TxN Nv)O2lw߰J%o%OAyx$ _Q|<,o:k#̖e 74NKSVj1#qTק R zk ͻzZ+XSǗJeULs]~}ZJ-U'(fel.Q`3>D(mQr85ѥun1*D㭪>W 6FYCOHx<&#EA(TWt%_NNZ/=ѷ.~$ y( . zXcJ]Bz||\U>rCPjz>ZNi[[B_Gs:t0Hﲺ;u%?_R]+a&fՊի^ښU+L7|Gg.L8clk _Tn'jZPK,FZ{G p WIn:f6F08D +`/ /V=O?P_hT1H5#"Ts4p/YqEF˝T`xMt,l+ OXm{lߺq4|92!Mw/[o7V]v]İa0ԸW[\zkxI-[(Y޼=գnիŴ3.-wjSyʘ1ߏӊl6% Ul2_'h#![ge@hu Q\.*_+$:~"O˻ܴ)җ:EǙ%,T}nCCeN؛6B< %0QOw ~E {wJ RC|Cϰ\0%z7)_O1&9bA%0{EL#!x$O\\Ti5Om4Y:t)+01Nٳ%QG2 PzϞ<銸8;G6bQC&XDׯ(]Z{WEn{PA{ MLL,Thu-a~s(塬ߥ Nd$BUHAAz4mlbʃbTrɡGǎs}i֯w%`o/Oz49R8]JdR%؃J!:+H>^>hj*1@?{IP5\ZIjj23u#azzڵ333FE$|@u-( F¸2uD"o |P:5U* iE'>|jRn$b&RewUZXK3d1a H?2]C,\9fNv8۶utt49u 㭭94~TYEQ{W2D0ڪUi=/NN9vTRf b1|}eI6iCurd4!C,ׯGJ<]v/ʕ$[x}>*Uׯ,w|yhJ\y˗7=':tCfUntZÇJ+ gWl}Vx8*UR9mJʕàA%F 21ȫYV޶ ر*9 a:C(YSf&oƌ"fq7l} mT //Ujh jrgFϟ--zQ Z~yy^(*K}h );ii>\6cEٹ#mۊ(Tj])J`edKuG)XZʊQkL'+]>qDfy/Rr5F$ 6@ ?||T.Ч}[ zxXjU6ż ny'q_4J,Q1C*wyVϟ?Z5˶mU{Z"L~]׆ 8%|jm7hVR{˒E_nE(lp C;ys x1\wl-7[|wrd?pg\y>lѳS;wvMS9DڵZubazzd@֬%lS}GC?+pz'6.XA_߅ 1kV!$1* D`׬I2$GAcMEQ4HCٸs+WؠQ3-D6 8gϝб#]o7hn\&C /\ڤɒ3LuWѭ*ʲ?u$<{Gc:MӇY_Fbǎt24?s._1gD#u] uvӧ Ks9sW blwsK M^$Hpi@zM=~ ;wB}WZ,FӦsG^ŪU*#@(ݶm͞=Y:aܪX[ ޝ:taX.Jl Wa̧>KyVO;wYYYm?qBТEͭqߟq{zvi9Vw{LsiiisV8r2mOZy7eJ.]TC$ ]ё#s[б 4~}3yB~Ưױ|hG"k>qp.!!!Gϝzt{b,CHH1lҥuV76`d k4>-[=UQKtppAkġ4Ȃ!eԩYsGӦMUHܹ* 7o%nIj*5RǦM WRÇ޹ɖfY[fpMHH̦$ yx4nX X3lvx'6 \3+W/\I$۷o?wڽ{, g%rX|FJhްဎ1Օ'cvUݓzU) fa\u]M(޼ysٳ<YFŔJ͙1ohӨQNj׮PWd6^GJ+E%5R2꺔@ ' Y.X|!`H,L^5f2=7۱c͚5stp񢪤Y3\HjѱXJ ֯~PMg+,ӄ5?Vn.dY@ٲU #* &@=>PIx*qp-*j4xb I 0]G#ʈ@Fu*`V4n}]ݩ['Gn *^HÇssܸTX>~DFQb<+~DGⓁ1mhG`JJµk9=/Ѥ U% b-Cq8X25S ] y>_#rh..s(*ѡ4.6miQ!!K,886ywѣsYׯ>\_YDhT8.WWbcѳ'5í[WO౯ִZ٥LkٳKϞaԪg ).^,ׯCݼ&<{wETY&5t_# CT&OF9,\^t =Sy{ѻ+LʬTr y(X_`HԪC*]w]䄻ws(@psС9011)W {w0h4ȡ`U۷`Zn8IwjMYiL#SaK<8y(XϟkW4o~Hд)U0\ʕ1}:bceѐ@Dy{ӹtѦ :uʡ`5m7UXձb/_%D#سwʈ(CC=aDr:4֭Cxxh pvFǎU II8!!9XW/|;wTYE Wv:uи1lQ}+X#XF(a;gѻ7ʕêU9$]\4pʹѣV -[bFةT7wjե1t gglݪrqcܻe"SޅzlvBtÇs!}Ob"@v\{zؾ=܁қkRC=H$:/ S,]SUbN4m WW>gOO\C q^e7+ ˖Lxz,~ O ,B7xzP{OEEaFԯORȑtI#5>!.]`bjCfGpq۷n4S3!aj4m#s+OLGGt\>"#Ѹ1=ÙEat_~I]`nl *}oc(T5 @?1@X7:͛1m224@P --I +}5\ ybY gBkk\Kp갧DspLTU^a A|w OZX0$." ųg!iw'BE#k7n,صc+ 4mq#rV~Tg 2tFO:X6ǂMG<{P< Pll`fʕꪭž}Ѫf®]`;UVy ԵMz5~tȨQSJ Mg x} 0Evf3`0^0e ΜɡH$x Ϟ!uc (~w*BOo_L 5IůW.~mka0`|} }@ ~=Ƹqꆌ[Gx=p?Pή~*^U@?l6…{!hy6sotNDaŀ5\G+V`d^ݻW335e0м9LQzRAQpvVi ^ijgą 8v ll`eWWTɁ%l7V~̀@2Ц Maݥsp8rDEÌBٻGN>=OktQN‹X O'=1u**WV˗/G@Zl^wޚWxaUmcDy<郩S%tuݻq+Vҥ+2~P5ĸ3ښc LXSckνo޼%sDhݪ~9>lܽ?n{C17F˖%Jhտ&sbWti_+p<ΟǍ ]3P(d 7Gi:0lߎkq,.^DMD`sgMU+t_ _:Dj*ΜŋqCv;GiSmΝ +ɓ߾?]NCn:vpwĘ/fmVYweYж-Π+58(4jP׸Pʠ}1$BԿڷGӑ }}dIL5B˖rslͻι>kBZ3II Cx8|dd\.l`~ƷHq66?w\>}4U 8Da.FFpp ufTXLL0p |F,Q.< 3ۢ|ymg]b S]Ō*E0Dx823FF(S*~OP;!ea|V_S(@Fx02Rk 0QRjJ&3$^&V? ͻOk0`0=U)E픖Fht~֩CJqԨ.o%P<= 4*=)Â+؆ϢK CL"Mx2f(S|`2 >8CBUçOiʋ1RL ؆m)|Cu@,.@m1g6 t]E(UݹXMpqfmtNeeH)k;0;9t[7l}MBEB1HjbH抳R@Hi6_s?s ==C.{lxAtDVm񕍴_M=@MMGn6B)Sv4ܝYlU ,W߀JǢn~<@EBqEj=+J4)$0 ΈG<*@[?Hd [ADO1=u fLDlY"Lr{,==HKT*wO0K=mXճCvTnK;; āȞ^_ !ױ.+!qQkZ2{) 1J/m3Slk b#TW4Ja$Bh( tZei?GQ<+`$ /\-JlA34H#&2y#Lŧ7d~؋Pd)(!4;Sneeu ::F  w!<<#w*,jaxj[P V (_QK< i0f0@ t+ƌVP-ZkQDP_M\\<|M-4z!lBz: cլ&M`i…*c/Pцl[$\ڀ-_|n NBæxeªAP=+z\EOPQapwǝ +ÇEvmON }Da|b'id9UzA _D :Gؽ (LCU_oTO6qUUTW@ HExbt+ܓxBjIE zqbg a8` }gGIc {'l?fe"/Gy3]Ea э[ ;cQX{¾}h.GP4h]:=eaMwѹ Uр/&r 9HX 7|B+_~xM]zU2M Vj`T,b?b@D,E7/e s1{662&L;iƉ8H  sFSpuōض \1k*xEY$`?0V0(v"mEI˲Knw"Xzߗ1ld~ xY0{H u Z4ef}> hKC^sI?7l=T¤}^޹[ݺd|qQP:vׯ}|}omLzD/vNo! px 9νX^emNOݭnzlJDkWYYobYK;;nX|*hI꺩]U^U ă7mXb&$4k*6~W^(I4sD5+lP.DYY-DdQ=[OK4kVUɓ/>zݪUL b1}^wF4iRR]Zw"DM oӻ|!Vߤ}ZPb)ҳ[Rbf.dNz5}#Vœk9S OHznVWxmsƣo\V5|ʗ*_xdЉ:>.xA6]w됻 #*܋U6+WO#+|xGz@娣}?ժ ߣ.y.|<|˻K=>^x :6^s_oc|*k:~uKMO_=:uad?V7#nlciVZ}(% E._~~ilA O| t}!XyTMvv~ۻͪU)Ujsf=v6mbbb/e˳|>zRmJ4]68z 6xl Np&x `Ҧ˜CWQ)vL ptjw-8鳘Ưަ|iբ&q/ 7100|nl]2ʈgذb~+`8#=C3{>eM 8cW|fMVVusmHc&ދ$-~^Ί,?測=oleY:*pmssTbTxtBpG1~ώn=6hFmK.,zzz6^իmڸVO1fd#5oZ:~?( Z5 ԌӰI7w'9hmmi+R}ֱc/_Kq,ly+[GO^a#4.G(v.CLX؁}.j&tɷ|[:G|#tUKeJ$ʗ Eyr_u᠘FD}WFE ='+lQ<NU2J2?qsmAw?ȣYf=F7b~=jJy<Q~7n}FcF%~Ny'(3QP_(Ĕ)14]n[#"I~x>PsĴJ[|ؒk&fhh-N~=P ;i/#檖u[ɧ@f@x<]ܷBdʤWE;Ja -,eȑ%&&ʋ5jRVHBе$!(ZIx B +8Qd2!G;*OH 8\.cW~ͧt*=kԈmM齝)Ό=T>T9 6ZW5wYiF|ct83U7adTt^+%]' H & m;3nfxwmRmnjzOKy1W&L (ȝk`*Uz\xp4hÆ}fNLY5rdyҥׯWgC& āad(%vuj֐k4_LUs AdžnnFT`r0V{;j۸Z>!eufiҽI}&}Clz];W*L7bn*5{LN=OXyNZSu\٭umjkխR真^+æ%CMjU_yL/5Uz~#7F-GU-/%(Z:gM0hI_8h`6~TjBܹh ))8wW~AO «^1qJt=2|`,3x11#hrWk:v2?s%ظܺXзn>a׶COu@ѹXo ;kQex=՗;iV}|lZvnP}Ҙh}*}aԷd Z%(HamFuÉ?c"q樓G"٠ŏ92=ȍ*cvʶKYHF6`C pːX? _l[2Ch=(HV8Mr)3~}lV:LDݽ8ؽ;Gt]TZ\'1 U_MSEzopm܎' ձl̵c^}\tbi%Hyn:) ~Q2|$-[$Qbh]ҳg psEˠPа,F : id9UzA O?Wn0xs,BQȎ &rVxIl7(X@j]!s«ZquXaCSy 5 / BhW 0G12R2xBjIE zqbg a8` }gGdɑ3k<ɷcx$"Da:Wa"_ Υv[Ec#Eur[\!.#b%-L9jjAO#_+wݝf?` (0ГBHu``U7ϗR>۞auzIb!Z TH"×D$!: єM1LkMLJUec`Iko6c7Y0(zPrI2V2zOTϰ.iO0 jȷ KcpSKbD1[[S!}M$Y6efs'ٸm/`J(9-Mg2 տDEwsTwSb=d^0 qmR]!@C PRH),t) u^YZTnU5q*Ds1ndQ"_1 H!Z g DR|$Ȋ`څcuzHsD1[!_M!HC egBֱ0n$@ +00j5UIN5gb`T!_aw+8v!OsD(0iB:W%$ yM"|ܐQtәjLf5b0`DTb}XhCp*[Xōh w"H@?cI;{Sɦ;es%)R)3~;dP Zb :G0|I 94z,R$Pь==V"5T6ka{uXg4/vW QB&!A{:ֿP(8DW:=s 'Lf2HX.l+? 'c}K76Tb&v=;-D$瑵عֱ`v1fkӐ f3BK= LCdJV3IqLS J'+T8"K ϴ6U'/VtgΙIO9^QD)SW=N钠/c &%bq =5,f6NBLW#}1Lş+$a7Ǣ>*JdQPE*$Y08MN@~ZI;MWM8Y=54s}_wf+>)ȗ/_+p`VP|G ^aE>H 0F |h,JOmJq =!3(^Zp&x `Ҧ˜C@ +f`VKod'MG2 Q<I,ob&{o ש`U5y@l2Z4-^^a#4.G(vzҽ`d Zw$9J 'j0q3As賷ѩkFP*ž}:u=BT<]*," Ljapw*vn?2?J 6yE @ \tUPBqɅ'>DθGMփff<|ݬY/+++y~~kdVB% AкAhB! ytc9T&sJ/}t69I1sD6`t>Pe/8< 26V7CX|TTb"QY#.#Mu-8Hc "ph~ڳdBzhv3..@DD;@L 4NV7% =[dX+h!`1c&OQ/GF<ݤI uH ڧ`Uzf J8A>0aec(-G}沬|-}6=}<2k;mmN[i9C`a\joo2A+J4ެXPO\CU=p&LPV9re  w;t(;f ֨b_+Uf@wBq =6p=aGC PC8l; }pqK:F,ik⃷ʹ *1*<:!y}o?gG7Þ)Vڌ% 'ﶾpV]H)1b 'EI Xc@aZ͚ɱOÇ{/q 5tUeʬwcf-U//]qc̛{' 5 [ӛQY",Nn ѐ@xBA¿7Bz~kjsajd {YMNwdgofD-f\9Muw=)E'$T/ kj]y2 .@ `&|{B=>u4yӤ`ڸqkZ1v,vV89 08iyGxݟ,+&R`Ҽ#jб(ί4ݾ*M]- `GP{x! 7Vl刹0 mĤH5^K>V;M_=Dbۖ@T6!ԢPe$ A+!ϣF [.] 'O\"2 F\-;71f ^R,tFX~R0;\*aR 06凴!0  v۱)3vRw68,^"2,uBljM?f{wg+-GU5wYiF|c L3gI/M+$O dOQ*@X$Ud?$\TQ!.mZ<{2SP!K`\>=дiR%ܿP0\6p+~w"-8`(fl@XK4Ӫ~JHfsŨѳF۔8hȕyM9 Gu O*Se&Sl^8`x1_ʳ#6yq8v6( )ѡ+~Sf"ςC @Fz wpr foÇm(\WQ:CP>T(>S)ƎţG ~{tݻaj{W oc"Ѽ-T_F}@ i_p/@4)srn2|q)3ON6[k "pe8:4zW5!5gHWi1B88 w=yW%=k_˗O TV]jewߦ"c<*to{-Ez V\P"@&d|_m,|#OߊOs>^ kj\{%JD[#Ւ+%I&Et* p-jErTM[fHJXkMCjC~b!`Zdd|j&@?xz,^͚00Dr\Q0@HoB q(W{Dj'zϰ7m&,5]GpXM|؜ɳbE ŕLk·18 uisv ڶC¦xea@Uuh+ZCMD'puG `)@{EUhWB4{@Al?/XPdEJ&AS~0$c)q#w^f BaRz?ZO]kWcO䳬=uG>Gg28IU$ޒήc1jX`%'!8:W"!t u{R3Ǭ, JhHLYV:x]+C߾8|s%aW43 La)V$iEU(,mW^oJ{,,M7!XB!ɥr؅Ϣ~UjoVojSxРJ.9yO3kkf&ӑkal F 4\6OTn @ٛ-jU/=RJʭ?a[}|S3RƼd[X[`ik*v'= 6) DvGp/A7+1Wt, 02Q2GKI,Z/U&<$&H7ggPϻ'UzRO #" {B5Y"7Q,nT+\0x0ʕìYx@@>_d *VD׮xk\GW/`f]e!HTctOgl$; ܹpv's4 06iC`H,< 7jVggdn߲Wc#.lָyf={MyU"%L̘UgDqi;sڬފ+99lḽa-J8}ubp$&1hc 5YŤw˴Jpy F07qޝ8tիcD[mq`WDݖmӷ|Ǐ~ Wi7iWݲ42W,PLcCk\fϟfM,];x^ lL$ ̖׿;Μĉ(sR*REnFؼR)vRټV_EQ8v AHLD` .]8~c#U+f jcQ\F}@ i+N:\l pTVkO) ,0L݈Jv=Y-Wvk]ܐmlUf3Io_?s[1k7n{Zn,') F B(PV~}J t36nDם $7JIS2NF V;<~AQ &-Z`2\׆ h r/ ߌKw0Jz+M5y2e ,&\\н;֯Ǐs={36Ν?>(¾F@rY#aDMB.] $@ [r:6h!S`>d/=XjZ~\B0Vuf柅(Xb Gs8{H&k֠" > wwR2|nZ q/;]w#44Qӧc1{6ƍX~g[/bY3+||pjSB8z_eKUH//,Xۛ.dN/ *G'sohUfIVj1MT}~aUxN< NbNHi[U"ꥅ͛1q*k`5k0|x.+.>;Rl ڄ27ST Z\&L-^M8u Na0$' ׬|}xQXHy&fݝ:2W )o0[8.&]i˲%7nlnU\=7@Ә;l6fGf!m*9Y2Ac)ս<Z)ߧPjM >V-K~aǕswKg|6G)EYI7?ksC ~7)"\ps0NmU/уX,>{;Gi[juna 3Q-jm[}+/C9Wsg=^ʎݏиeo,ܺn˙ݻcbW̴l!( xrCCn݇ 7t([g ԩveˢW ː#S0!8v`'y\QPN}&D PPw6Wyr/Zc[7AͿUcqO# 6goSj!ȳe=E#G:9ENѣ11 8Wcc|ɘ5 Ċ<.۷Q eJ=K9[v$RW\֌?3333P 4oN:={R@J{NN1l޿[uvY`' NF,`b'#p9&~( ܰ 24`Z*' H7?TwLО=`RiZ\=*'Ϳ 1"N"`PH[i!%E•+Jiii]7?r䅯_}23Kh}+**ۻyժJy \RbBK3"AV<[tȾPYjSORzUۅ0Hm6 U9^B0s[;l zN.Rc\ط, ?߆HLf4MB*ge6 dDDDMw E\l_|)/Xk֨j,[;JH…[Wŧ`׋OG(<աQQ#[VIXW՘=I ]  }`LB|ŸTzp7*0xΝ˖Ŝ9$жڈ? 5p8>ޫCxyСWORC7"=]QcqQ<,hU#ޗ Kbbo<8e*ur26o.T``#ߞ- O -B*Ѫƪ4֮Ue.t~P}YeC=| 64K>ݻQ.]Z͛7߮_ u"Q/ aCy:#gjj|"dɠf#kTiXO#p';i{ڊŢO(:vJHQQvM~N#лl6y$h Y"(X}7#]ѣGU!CgfH f''/0V  sofFtN_2_q&$Vb00t*0N|@(@JØ NHMAgT}e?}$}N$$\S.u }ύnѴl )UdkӇ9f:i訲:<`:cثʻ,C4$'5inAtrPHE ś7MCu*ũ|)Xw.蚜gϲ\tN]:OKBك噒%Uۅ_g @@L"yG BǢB!!63*@ A'  ߛQxp*X|V|_!vYԫ.:WJ?aZt3yI4 06ahA$  $l~OQ*@X$UD@yб-׼d٨IvnkM!İ@hQXpyֱt4,}e0KfY~C >|8TkܳI.گ4233|~Y@o@fN}71|>@Ŋj+2ڂakB"ȓH(D"ؼ~=tg 5jtׂ(ꅱ[in#MqpKLjBKlf  k@QsllqRټ54&DEE+PPx`* (QDaaaUTj_Jb9`?0>P4'P;ᗒ#z!š"U&Req^O!,jp Q5idD]UL"cbblE"Ե(h"ښ\^B a_p# 90PTE ŕcATpթVM TE E7=|爋/꛴O1 L֧@ \l( ,&C*)EOmO*U3]Ȝ ^UHX~bcQ&';"oq(m ~ZhcˈB1XEuiMcUzjSc[{Y6lrAl : p8mjZ?m)bUbc'ˎ&.VΖG:3aWf! CpQS f+b;fpC+2=nAji8gee΅ ]h&J ~Gf]]G=(ѱ|:me[K{lr#B. OBZ&z0+EL7XPCmWޕM56 n69 Moc[K} !QMdw|IBP(=2YFUu=OZԖ=RcOAhB' p-0HL[GPgX($[bKJ |1" .ާ!TssgUz='ɜh2Ob204t~\2,7xXuFY(u颪whhhč\]:\md4 l$Hc6%H#gD)y?Ohxt5EDž( ;)fF Y$H&ێ<\kB*ѪnwJgdߴ#!S}|h(C/S-\28mʶj{S'L8ba# KˁÇyyFk\0w 9e[Ǫi@S\A@K8KU^@Jn߸_~SҿnZ!{wO7b(KS yehUٹse)Z KKH^7o*|}Up[Iа,F : rڪb,Z$Ke{ `Ū,X9лl6 tM:@ꏰdSU>mDiX:XUj*zBgHx "o_%Ͷt~ǿPp_}7#ݢLn\:lɒ!?065|x;y lެ|5t܂_/q b*{ݽY&cǎ51dff}|נuQPTw#= ~yXVa\K"!c,8(WjoWhQ7lz~~\+˫)=ͳԱgb"kwV PLmmfTˮӳ[QyU ݻ4Λg;t3E1j$yQJ -WۢǏ9h7inAtrӠhY E)οF8siu#p "pCOȵEH~ .<*Ņ{aw员(϶igWslՓ'o{`N}yp3՛nai"ưa%wv#119.cP%L0<+*wo:}Cow)EFY[{-Z_bJ$\լO05)3 vy@JewCPXX`U%woA,, 33QҋU `CZYb]tQ+U#G0Yk„uAA]]GGi!a80bz:]S)X4q MQWNN05iC`H,O<^P~Tѣ AA Ϟ}qhvV tqSKV˗o>GII:g( 4L6om,^D3k ލ_~āPDlѲeWϝ>=ȑ |pʔ1b? L˵{w.6669A߾rf}ex^~~a2}!@#z!nl6ΜAV{W^rjҥ2 V^QVKDKFRz[5UsB>OP| q3׾0+p\.м9^\ձjzVֲR,gb­[@ѧ5ŋL|~G/ XRy~y4PTWvuhTPIDAT,+>< ¯X8@Eugix{+`X?Kx}лlm7Trz=H),@Ŋh7oHhթ=cR<"IhjK0fL»w◵{"SRocuP,5 G(J4e3ٖ `!Ҧb~#6fp3r /B)+X2X,,YM1l!>88$ƺQVW"KV+ѻ{9Yذ-Z`XqjdD7d8*Ks06FŊAa۷JZ9pp-6HHg¯co|B->{!FE>y8w!ǐ!@cw<~R{vEHј9?´) w'ٹ#蛁ӟٛst2* Hx9RJκ[jDxx SNs2EUja^-HLJ\4$ZdX$05UԎd 3Ҿ(5,~@L8qMnjGǢj ;tWiEb=*ǀkn('#?`&[$)His! )yuęH~C"(0B_ƀɑJK֨İ`MBE|j|Ҿ,)\(=l6y8-hOA J=w2j ǂ$X^WF{j8K؄B~#c=^upX@xANRY 7MCu] UX8K饪T擶B%= 챘ֺT"Ţ@ڻ9b`ez;˷r&>S=P6bae:CyѠRC{{XG6-,;; (\a/0́gT* OC4-bPbRt}ɫfL M?euzHsIYtFUf[PA챎S;G u [H%8:q9hQBTL!8R)^čx>@, )C ݀5nV@z0.2v #'zзRN)0yJ$ƭ[x> <)),P!e+;\ki搻|T*?U3Ox[OK.ǎ6$t$l^*r_ns *+G 8ټ3 4~8F@ mF~?s'BaFe~~J!;adn0`5L|(; waXeK _®]8ryi$'?0(}}nJ0hחUɶ`.QuǏgAR 80:XY̗]yX&I>CF X%h 3 ""^a< 4,@ +ػ'C/E[X@EЭÇXσִ͸ܛh`޸%mh(~Gl.UڑM,Xk4 up 2oS]@ gMcj9sРy t '0(L4q0KBAir@ 4̙!zWRSVE `EXV{0a˥:pFͨ6L&&btޝ6|gՎcN3X̻?IKF ۖnW6D]+X2G12BIT6M@赮,^K|Q+Wp*<=|9lmɃI]c.\jٱT.ϯ 8H'\@ 'Oл7>}]^":wFFi_0hX/ؙ:Z<فk0@:aZ ӝu:Cwj@ǎhիvɢSQiSƜgZW)͢폣HSEn@ؿ^^VX ڵ%_/hRt_"E[X~ #>^^[ßk`HԎ UsսݫSv<~dRcT,5k] HKMEϞ:Kǽ7ϝ sl_r6 c9WeH T;_] ǣM,Z~=/RfI6P0֒D =+Wb Vx,_b fBg}^L$?Ms_) &ШvB.HBooLC >`,W01@5caIOsL-(/հb0|8j˗cȑX@`QħOX{8uv2r[B ظaaW4f ;_N[ǚ Alތ)STY.6`\?~floh,GgOPjꙘ`J>}9SdEB??ع]}%0[ e:r8WӺۦdԤʪiTغahM5q"nUemmw|W]h^UO xy04/y` @ ʅ 7N-Q/JeP(\}Γ'^UDVtÀJΔvaaL`gg'oV6>E׮ c$-=9ɜp2ʕSdffܲ堿qrvQSHMAoӦq##;j5s8 E<ƍ9:tÇ-[`ks -ʕ9F \T)))K7nN(o\yժtLEPjӦnn۶!#4?umދgddȠU3k}ZOOCݺ y˗խ?4I޻׶V-5kU'&nn`~@  QBPʔRSSxxL ~=kxh [bI;vysk*UZyhLUs0h+DOO!=.\,WMiiQ7of{yPSW=bnZem]ygϟ q USدҴ0+ ٪UqKZ@4Mku8n$'*`$Y255A;vTK%?mܸyIh\bEYbU % p8͋.U‰]ǎQn bSL@  ɚ59 Ai> J׭8n 2&*Y'N7Mͥ'/,g/3fr&f˖JS Ew`mTY5^T@W5Je2s覛6A($2gCt,@( /^ $DO.~-hNNvg˕CT#G4~]幪|yt,K>yqvCHתZgjjΜJ3m2bbNVBE@F͟T[89sTyu 5k.[Z T -kT^qqqu9ܧ*`f }WTK -,6z<۱nIqCS{nb͚Gu@qNN=g{PER%琷u0?|;.(ڣkfs.)y4xDP=9w.KթӞsMR) r YЙ3qR;u pPnefӼۼy$Ek77x3g~;TΡ*>cTBCMc%$&kun/[\}i="@Mh([c)Ed)JJ1xZVwu@:?V +UZm;hP͛W_R[D~*y+i(k'MX]dZJ;ѫ\V!Jϩ|4,Qyφ#:a@ wLdoz9[@KR ma>F^ZwbdVg1y>bn$@(4 ە=¹@hlI 81p &0ίQU{Rg]Qz|]H$ggn@;iH6vl#\<[nM(J^t\#Du]\dӅymf\ 7ע0J`U4ͷA~FFn^.kDGGJw1q3.tw= @D{DNVMG1'@ UVcdLrX *o%]LzKsin lfƬ;1ͺ6~dn8>iE_3QBl! ]R"&_̝[AdEA`|[ . 0. 33UicƘuzG<~@b^4XffJ|%TI*-#Tp ) ,QHtNlnt(9$tD2U ђ\^/M||~zv[sEQEq+2;–f؟~D`3#YZ"d@ fF"6H .g7 B mQ, dJ&? mPtbXZ`\5p`:cTQg ZKM.}Z7;,^Z6@*j)b5wWo۹}A r}Q] vSSeK(TFђrc4(`3jjj*ϨQ7W|쯝;݃}2HwWܣ ҌKz9Vtx7 ХUswb+Ū{9A"FYGV7eTaARQl".ix>?w-}@ @q D#Nћ\ЫC%ۚj +S<'pP2L!mZx%xd1B8Ps;Oʕg5!#X:kc k>lDa \}X2v{6MYCVhՍX$5v1q+.5yYN00|鉾 qr~7NZ }F wPK#GZP:u~rgg| +";Cfi5%og gs8gaaMk}%ʑm2_',Tʊ7W*|@ yߧs4ܭϽ>>ʑXfn5sK|ȳ;Sư'@ KŊ(дUlIvm5;I߾ڦ|ˀe_qqR.yXZ/ {rPlݸ7sY>T,WW6bVJ+nժ} :޽&<['@bB֘,+=Yƺpo۶/';9V, :?H|U"͛ YS'65k$sGrgOܹJ 32cjʕM@  *|hO:!Z1@ϟwv}J8yR[ip0 klcǺx(Lί]$8Ǫlzf&.\%[j;w.j|ZSe "UFr1$~D" So^Ӧ-86ongn4Tw/X>}%:i~[Qn_}}}#֬ѡj+S1#s :@ ww7w_(u!-bݺy'˳عSf/eeܽ{d.!!p@?Jl#Fg~ő#4޽5JoX)E1hsЍ?޼9zUpE@  QjneU:y4oj`'Tms}}Z4I*SJ}RE߾[)Jӧm>ͤ:P5d2rw/[VOlKJ*ҧUgMzkwoU3w" 4H5PÇXFXDmYtIZXH/$FV(x{+UjxΝ!e?,k>x_۶]\!7nya>WLoUv}y{k&>3$= ptJ8qB1c,&v^%0AՒ7nnA h}۶4AeRJ]WS,ƿBsh(WW~P%1l,P;k8E]4̼̿T꫼>}TtA:co޽U|{sm۲3{\EϞ۴۳"$<<͍id,g},BɺѣU#Q%&K5isqz=g-͐"MNReM`*p0ܿXҥMmT,XBG}w?1~aeqm;[پJѻj`OCC0PN#zV>m0l^ g իZX7`XݕʣHK jcBHxزEt^LnU˶M}F~,uxTc(jz8~<<}޽>cƽ/5m^ IlnPɓŹǻ(,FN E $5m׺5Vd<nxƋUI4ݰwΝY.C[Z֭+ao7OhUf (9ۢEM\Z5UR"zC#cCHaAm,[ UR{7jNE,_|y]*E<"<]49O%OVM //UmUH-Oء RrDΟy}dWiV-Z{ +WT!M U,bjf{gg܉rRJLLnfnS8x9S52VHz/vEpq/`A`+WpWM(]_"30 4t+/#i.5^P@a|tɕK GI\'' `U`Boг:%d$X3HYX0Ertε1 FB/͋ذ6A2c+?!)渿߫pOVi\!iAҼH+bElSӈ^m9XۈiTիUOǩic…'뗭MT|fׁnUlʉsv]ȱ1ٿV=pO|&͂X? Z7߈ d=\Ν6 _硧-οJb,yWID0 `2.{9u/7YfMܽk1{6>}JL! ü2~= (RGch}qc<|1oOɡv;n؅Wg[6WokLD LAr!9tcw>q议O)WFo}Sl}A772=*Pxj{h`A,ߓ[ I;f> !yàgOxݻѬY،RKJ_}8 s٧AJq^Z9 ׯi\\6D͚X4x<j!C^nXa_֬۷6X~ĩSxwÇeʠzueK21p9xԽOoj} κT=\.Q4A˖(_>wd]U{,0{$I&o껩*LmxCgT;oD Xj QLc!={t>m2 %J/_<LLPx@롦-^_3fƸ~1^Ug-p>Lb?:9 .x|Gj-^8˥wIR oG],L.^ zD~YInɦ'NvB[|v/ہO/2s2ǿm9dZP-1+* sFi٬Ѐ fMë^RȧK}DV7 ¦灹#m,,l#[߃n(,|ukV4jpݚ|~N/qwM9XcԔ;se'H(GI &793cyH4k6`]A(He(b Lba`;x.?"S6cHB Q =JHGBH^(GcYG#E ]|Q,觟5ǡA!$6!ie^~5x$k!@lqiY)\92FF< 8 | 25 嗀E )*/X` $[HYTYƾ&aǃ( ˅09ko ,-eoI``])!oE #_$?hXV,'m%C9HR7q*.]½{x 5Rͥx^h%`c!"?AjcBg #FOr M)ؔ\ӷڰfgnf̍s ^ pT+&0e,Y==n ooi?+$Dp AG*Sha; _+˧}-a6]BG򱆎LCG|> ].jU%li 1 $'!:{{L OҺ l8 TPM|c@Q-RpbċW9A<‚AmR>H*=^|x7}R!!+Wb T];BJE[E#ҚB CP.fHaa -Cp|Ǥij+^5hA\ ''^2Ia`4&ɧ!S zv_tB d&egc`l,_{]5JXޡO9Օt黋֖-^tAݻѸbe e#,[!3# քH,;Cn+dRiYT;:+Ų|ʕKWdnVA6kVם;7R޳G5:|TsHKxvts0Ȑ]T|$ߙ`ï_ ј5K;;[7&N-{ZZر-[Ɯ={RT(6lPX/^d/2xIuRM|-m 7.p.BG4n5k4_+e/]ѹߚ+6 ӤnJU _.˛n`Wv)onlڰ]mx/nkTR]IϓR6LvTٱ^qf,3u=]͆yhUoIiɒCt#%oIh/:[ -֫TJ6Gc%Go.};#r@ U֪aaaÆu:t(H짭{'Nz"ukbY&C``R&j"_6X\R+6#@(KGά>;\qv{zRponQ5^uԺ"7)?]w鋒_|rhK~W5Ӈw&2\+kzO`ǟ<1`BړҒ%xgԧ%6l*S;gf=ʐzuΙ0)(RRbjuL|"8p`K|f}&&ض{߾2f/ܱHDpA!ߝ̡⦡..IiɒCtH~,٧~GS5+W,qtѱKtu3)@ΜjТ|18Kgg6WvR2ܾcCe5/AA?{HtE-'TR͈&'~^;]߿˞}$Bu/}!8\ ?2}v)3f̌rFg>))-YR+KǛe8WÅp4U1!>(Q|رG'͊ *E"ܽtNB |א\&!E.̔^\\u΍%ȩe]kkOyv W ; Wn[=s̿Tp72]Ls ce*㗭՞  =',NPl[ 8jռa[Ekf>))-YR+KǛ݆4C(I=GSBOxaC'Hoz{Ιu}i[߭2]$b/seù/G%q8hXGd)<{jre&ija4DSaBH e7!Pmlȧ*T/$yW.x6ʥs>#6]3"S=,ɋ/ǰavS9s>;Dh2.ϰ>U&lW a'3WH0 tFHBB Le3(0atu| >ܝqn$$7G0쁰v'ME!Hbb+H¡>-xf?'AP I" -n(DBrG!UB ;VW$ŴV};߀;12̐/`V}jqO >~)HBroT0: 5~z c'B5ȸи }enH`$Ϥ`6)%RgGS r- I&Dq-CJ96! +xCג0{|u˖5}G2|p`e$թ|"+c1&`a7 ꖰy.tho5.+W8&h"B8% +Q!RH+F1M^bV5Zdh+]DTW k>Z}6ɖZW4b(~dfK7IՋUP]~ 2;;9 1E jc4 C )ĬQ>O;O+i{M+#(|>CR)peomXHpbYONNsIy @|:R(Xym@EaXSY/ry!0?\^YV#FOضiu$?quŶmСjԨU/_J̵$&!ӫW=g 盆kk6ɀOZ 1$4,)TN`. '0[˾&g&0#FO3;+X6o6mԩ]ׯέ,^l4pD}ϛ7ɃVzCR Ti@gʰmGH~ղ%Q ~Ο;77 mݻSV.?'Nzub+EVw:zAR)p*ުU{b 3x@Ԝ&&Zhc-%]ۯ[5=tugX]1>'f;sd~O/^{(R@ԯ9sT.QQ5sWNN%.M}رfŗ-kx5k+8B!:vĮ]CS{^!"tCj=&$(:?=^$@[Gw' "Y3ĨKFvj@RG\8w,u`\lL0:HA0f ޾Ū޺5g%JXlL&sΘ'+C>\o*n`,^'AҮ/0;4 { F㎒N}7wkZ&wSƵae;NqS|vQJv}'=OJ:\Z3ٵSezǭ|JiRN݆/2̢E[#j3cc!Ez*UѲ/MyfyrtttnJ~S4kC Q;|KMyͼDA(~eVs5yji̋&4$"ʲeC#\\p8umMR=^kXYPV+vr  ҢR吂MMዚM\yM-QOotgl8K޲:.ݾrl}VƟtj+.<ŌWOW]\;Rp (5ճHfԧ%6S-Ҕ{s쎪q򭛧9-TQ;KRG81Eɣ#a.nwǬji9 !bv II…̙GKHX&!)IS`MCvYE 5m,cXdI*Wװῳ}¶mEb0|Z kx"{7 Iᠦ?ֆmsf-`|alZJ^^_q_RHBяt7CP aT~+BzgIhDwټW63 UGi_,I*KVy.T7T5$—\=l$3@Ղa=]y0/I63P;*:zn] sN~GQWloUZX kgr wH)z}jXUZoM+@6|tTn\PM Z\ t^]0k32 fzMҔg{y/US|ށwz*CXh7qLJTyQFo)h"B8T0P Ldذ! Ĉ)69913uP8lIJgc2ɷ{}=32z¬}iey^;=T_/8*I"IoI5I4W~N?Y2~Y[64x8AѲm&\@^ uZ1Qa3.#RMO?:ݭ.k&g3B"o۴gDBE{:Is)obPR:%vf-sSHC|~.O:}CR 5m|vqOKIxkPB  O?jth|Y-`N1Xx HXs" .he;?zؙʁg乛0ûoct^ Fq%[Qð2 [<'cxn !eYpA/BcBHa2Ea|/ v 0ʖ0&xH :[ R 0Z( IBm,B)4jآϣ>"Nqx\疟v ҋA}D2BDFY `Q(X-7jҔNB~M8lisylBd)"@<'kEt bϟh1?V ~7s )"oQ#"NܽW`\<>-0ç ؠzu4iQL¨; jx }q{z$g&1X`XRd8x6iHSMc6Zr2=ógر xygOcNT!H AQkE @! bv١Kn` y8N_G&si6r(_K"%EN Rj`‰cBHDpgxW )\ʜ6X/;fHuf W!;,DivRXeu\6_]):!kbHi|ڴ+4vGq ?bcU=}ƍ1e IH9$@0g„ʞNic}VZY݊<|I&TGI>+W ,YF_?lũ۶Ht숎|9oG` BC`ܻ]W|ZxrСWIE!@JѣGWʐ>CH,qGE $$(AB|RhQB .E߾ػWR"n̙}z~ta͛NDut0z4>D:WѾ=bѐ 52˯gA%o3gb6jƸ}5j(޿߯CK}Ev.x0X`OϦ{=yDNrF. 0hHG lG7HF0!t ӧVp~x=Ou9r+,lALL_fMxq{6m>}î]K{F!-.ǐ8B*fn)6RTqe*K9O')%$JJB>#W ɓV5jqwLQ8ɮuٷOb&xx(]޹qTǐT)>Vii/#"^1?5ˮ7&K9O')%$ ǏeSS ##ڱ}3eφo8pru+ʖW}xG lO I?XX äuqo<]U<3]Is]x-xn-|S.㾈wKd2ܦ?*w񗄰Φ'xDZo3 "1yݶ5kE/Ieu|r+K9O')%$_ZD5֨ Wݻ)}0A\`ӏOu"Q#tdzm׽B7 nW1'h>tsW kG37/[toōLK YES[HPUuuݦv}<|vXXL޽R~%yRq_/Ra yl nj5 ? q9vlޭ[Y %3LMDF 6{oT6V%bzkJUC8 T-o'22T$>Gޥ>0\UJ yq33EP}j[U>spyzQVrNSȃeKHhrݺhXx*(Ç@Ǩ +VWO/*pAwg!B6[9%?d\ p]2,Z*cS?z #޹h{efeC|9:pr+K9O')%$ٿ_%eٙ#GN OHXu8ӼQ3䁐*ߴ*sOIV 9HLՉ=Q)2C##PƟvPyocD跳{RVw{ܯj9ɭ,<˖%Ν勷o߮w@?N; )M+VIm$%QUB.ߴn= Ν?W_R_K5K*7h4mz<=ż=*ɭ,<˖|[|XZEO.2HuHJ:q~$uttm1OHa_2$`djM;hr5]8O՞ӥVä&)WbF7 ~jOro~*Ra yl W^(z0ԍvo7(fV? ӏ󶘁MxK€*XUNܨBHaoXB2խq"|lmx=7SM8 >W(ƴE `Yg !N!¬Z\1YBP SEA 9jcBH ]PVgfU2 ) Hտ">jryVˬn08!FLvg)o/=KYդhU>k4q7<)=z4!E\5'W5DJ2dRptA0ͧ);! pWY<үU&@1G|{SKK RQB JNzs6TīWڧSynh/;?@Fq8SfL\msS1~F =/'^|ryNgUKˍ_(յCu~]jr"dI/X~_u~{ D"+>Q6)䨍E!K&={VZ[ori_J+5<^&;QME}0pj GUA 9jcBHҵjyalƪUS#>=m=>Ĥݹ?{ymڤѥ !"iS(X qE'z8:^U]8cAdd%-k;1NTй3!"Ő!ɓ"_\kobsV.'/ :Љ7л7ͩ6!8X//ZYY-?peD[}^ի_X[5‰\O5@4>և޽!J,Y7!S`ĉpu#;pm.+f=叅E,[VcwH+||T1 BdɒΝ^zN͛2ePB5|86nDHׯ^oҥ~_(e.=GWwwmMڸ֭`$tHEE@eO\899}5;KNN633r'KW;wBgׯѪbbk+WpFŋkMI q8}0lh]K"!+*kWܺ0ش Te?VժUXe,z捻{^!ptҥ{Ok|>ԩBBގٸlٮE>`XZ/]-C ZKвjENR;Wyxx8pjժY˗/p=\:G@ -U>{Ze1djj:90pr`۷o][R> B"c/lR6mԥF+trBnH/?),KX1LŠeu+@~>\5V"Ò{} uT!X\.4!d6AӦMCCC39&&N_2;F͚}ule2JJ㺕M]"ʣE QH_W_P<q77[U7'(koehhe?ws~V:9L!ĉ8vL^Bb", 49y[IexGw ;u()Q6m"DlJ*e`` 39222b,{o&Fo rlГ {%!,&ާqn4vûxa1u^O~ͷ?tы>wOo-/ '[0:BmCt&eq:&NDzX0?&{fMʨ˞ohˋʕMe߄Th-R͛3.nnnI]t`yҏ~~ї'|+8fU(wn֬YᲢE!yaYRI%X\K;it(2qdG=*3BD'WR)Y|, **YfT1vEY%UP$ro8Rd0_)K#I8 LuL.wǘ)&53E6:P6meֻBrQB2<\[2_C)!3 #8Gl"D\kcq\gggϞ)RH"T7e+z_-Q7>ʧr#$8;+!ucY~~-(3qhFBBL'wk<ߌN!LZTs?}p(aG 60^ݡ{;57:14C yThCE@!)~"6oƆ {7upq `ƀ06$$C*B)DRRp!ʖŠAX/aGZ8>TMw0/^`8))SDeIvtB ѿ?BB|~Nsk׆ jV^ec" [` xxP "B@&h8} Æi?A \/zǣL4~v0r$t QXRЉHI۽relقϟt)7"ܺ2K~6ܹxIbh? U.Ο?;L!JJQcbDz?F۶ truQ>oeeuVTJK!8zTڮ\AŊʀtTMjOݯvvt^UK/)V AAQܺ޽ I-wXǎӳejfBt.TvW̊={61#8 ˉ~~JhĈog>Pmդ vV>zSǎg8xVLM |U]w iXrvvv[ndTʄMoEb.s߬۶ԩaǏ d-M{  P0 ֭bU$¨QT娍uq_Xr+WM,a@BH.1cUP|ٳ~vEy217Qu7[ɑ#qj䤍u KKK-qx<^JmFw!ϙ?_5V˖AkRb;^];M9sAX'Np8Xr<bŊ۶mc+BNtakd^YO$y S c4300+uƜgVNrB $lެZ1C/˲cLLr /rFD"Ev8>|z $;m czzz#:-vQa/;`_қƟ82"SzXI5<'9!G >^ܨԑ/=xK:͝XZF=_DT)UwŮ]Td**T}Hw{rje-yzeyyf`xn-|S.㾈9F QH_W_PXil@wsCU~sfknX8ptȒ^'^mRx:Z+J'~~={c>L@HX'OP4, _\;vd%$-x#L\-_>^٠'%2{n;KBXHgӓMOطhw˜cnq{6H$O>3W^<5fBe@5V|*(Gw1Iɩ'˗Mkk]6 z-qz\R.8儐BK4o`rU! 6)g)nEБnR2L^J3!!Nb{xx?~<{,DڳgO';aldě) [ hz7G +WZ^Èw.F\9MɆԸw{V5 `݇?3N9!zhmv/W7j3l}꠩߾bz"OIximL<uYIRhe!LÞ 9l`=%1[-["2gW'tG ÞBnA潍9Hmyr~[yn;=HJxy('R11p{r,{CQ:6:ȣl&MA xy :ښguؤow|^IEmM_ꋕ]^kvf Uf_Q- 7=+Gr&#<0y{dy{TvRʗ77HUs R%$ds@$譏5Ol&|ߐŠaYMhHYR>Sa sEHν />t^fi[eۦU>#^z:<_B`ng>ŗyuP )8 P+i xVع3 !Y=E ,B 8_ӯ`k jŏl&(PmBN''kO ,B~Nq/IuxQ:6>^ѳ+,|c𩀩OĢWciَ(y Y1s6&Y"yYDcF"SqR%#i-[nn!T /~jX[%mɊ׭)xP\")trį,j`O=K+Q)>UO`b6m<)-wwNC''ke RN(u,j`B_SV޾Żw.m9x0fwD\X62BZyr$ofSB&Tw* \r9!!-]kڴbDFKUA l yxxj`BZ޼RE'53gZ~f^秺_kWBr1B ,L`cXHkkدXXĉ\ s~iV~.^T,cGB=D )]S& #T'#9Y}ӧLVZVʲj2~hp,B@m,Rq ;:VXm\.})H׿?Q,G~`bbrj˖b{Ç'cѱsw˶mիe==R jc[Q֬@HA`dTOgPgggwjժ;3wf'P6mvLTٳ>4Æ"2e`nnqsss* Rp@9rUJ <=|ӧgailY>}ί]B.al,:uB\bjcBHA`vUϟ憰0Zҥ>=ں+2hK*1ukqTn2=.?J,HRCX?EMR nݰ`~EXRhb2<,ciYgl\s;m:z&1i\\8 N:|)F@ QV !47cN'P:!!;nrf6`M: !0W˗er'PFŊ5 f!$.]| 3ȧ40)ԁ-jք+a ɂ4 3쟮RzA2BAx a;Nn;'!*!P,B),Cr B-$`e$)@ اhP-eYTF$9k,m^Bȯ 3[5bH 1]zEͤRDz03[b<&!٣"={ғ!E,Q1|amÆDTd X0\n 1d"#, .}:BT} //=իadDLȯm'M}YH>#XB:u™3iׇ?ZBUaoѣqfFP;N@ѢT̄zB!Rl,5Ý;++,X=;  eW:Nnڱ-5ڑQΉ3;9VV[_%T*|۴V fI+R ۷kM EO}Fկ]Jmaet%sz(X>>+ِM#,'e{sfd,V&<}r1ԧu'n[?'zHL᧩K~f7x0p#CvjZf#ZEm7޸sCqzj&k$&E*סFlz;naOթ?:s@zPF^n}aoݽzp΍9y(] >9wN3`Ot)$5)>j;֨TNn:UݤC{S^]JiRN݆/ȤIQ>$~,`cps{`׆7nĻxM5vk1ezvo.MzkoOkFj[QsSMfL[xU1.d8Y̓4N-5~nM6[/35YiJ5jh&g!xC@* λs 5WԖM3ۻT3>vYʏQF)ڻ]$'EXZϢ_9vj(pof3Jc[s ՗U\:.ch >ߢ>< +ǐ0 IDAT`vdZJMUzAɯ *t ,jX-/;!wgiy5Ӈw<[ն<]w鋒_|rhK~WsVͮXq~3ҽ=6Da oZ#]2y͝췤cNUmj9zw|lzVl5GPqLAKkDigv+5#a.nw, kSp˴ݶ~=a2+}Uy-)u}vG8xSܜaD=`\rufsL- EUEy5]EjGM>oj^αyfM;kѫnP\?G =Kʗ KtFMK RK&:MUɯ *ݯ ,}o\֩Wck&ǰxblp6^4تE_-PwƥL4ujh,f, ݩmoc/xk2۵8.3. [VUokvjJ_-i\Tm_(%/g 7:(3.nl)7)u& <>`kS}i&;X™}Jgx,Y=]GIf,Qdfd{{נ_lʨs\dWTUEy5]tԔע*l=(p:k z0ϻIIDVLW񇆫[T&QhҥdNSgxk,]? v}iXE?>7gݐB17l3k6 +p` z(SS*OG߬ӧ># W..e{kqɮX5AKO:;i#lc@d^JSkji:ҔE TY5e@S to%7RÂk_-ZGQˁdKRK&:MU!MU>R>Kx޿2o#2kUFs5\vXsT&zohmG4]ug!]hɯYؕ)?*R6Mm~kz;D&>2>c5!KD^_?g&K$'"~f{Wӟ,y5M3>Zx,E#f#cە2jX(ӊFfI&K'9I'o2tt)Pvʘ bc?v76M8fݩ[Hn&ETŚZ"hpq  '9iD毱2<>&'~^;nF&]F9tћh0{vM/]VKm_/^4Uq4UA"! ,yw564x8AѲm&ఢuz1βl7'f{ i^Pa3.3Zy1dGlkMД:6u;mÕRzO\Ifnѽ֏mKg̗.ǥ6LVu8C KW}P M6jҔٸvM䗭|zZ@gaP[<QZ>.UqW1|ԫ6KB~ǯ兿^s} ߯S{ Tſvo`AB+M)d!H}:.˩i뤚T T$K2SA)Nr*&ِm,e eqB^B7!OWo-IENDB`starpu-1.2.3+dfsg/doc/doxygen/doxygen-config.cfg.in000066400000000000000000000063561320135501600222100ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2013 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016, 2017 CNRS # Copyright (C) 2011 Télécom-SudParis # Copyright (C) 2011, 2012 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. INPUT = @top_srcdir@/doc/doxygen/chapters \ @top_srcdir@/doc/doxygen/chapters/api \ @top_srcdir@/doc/doxygen/chapters/api/sc_hypervisor \ @top_builddir@/doc/doxygen/starpu_config.h \ @top_srcdir@/include/starpu_bitmap.h \ @top_srcdir@/include/starpu_bound.h \ @top_srcdir@/include/starpu_cublas.h \ @top_srcdir@/include/starpu_cuda.h \ @top_srcdir@/include/starpu_data_filters.h \ @top_srcdir@/include/starpu_data.h \ @top_srcdir@/include/starpu_data_interfaces.h \ @top_srcdir@/include/starpu_deprecated_api.h \ @top_srcdir@/include/starpu_disk.h \ @top_srcdir@/include/starpu_driver.h \ @top_srcdir@/include/starpu_expert.h \ @top_srcdir@/include/starpu_fxt.h \ @top_srcdir@/include/starpu.h \ @top_srcdir@/include/starpu_hash.h \ @top_srcdir@/include/starpu_mic.h \ @top_srcdir@/include/starpu_mod.f90 \ @top_srcdir@/include/starpu_opencl.h \ @top_srcdir@/include/starpu_openmp.h \ @top_srcdir@/include/starpu_perfmodel.h \ @top_srcdir@/include/starpu_profiling.h \ @top_srcdir@/include/starpu_rand.h \ @top_srcdir@/include/starpu_scc.h \ @top_srcdir@/include/starpu_sched_component.h \ @top_srcdir@/include/starpu_sched_ctx.h \ @top_srcdir@/include/starpu_sched_ctx_hypervisor.h \ @top_srcdir@/include/starpu_scheduler.h \ @top_srcdir@/include/starpu_simgrid_wrap.h \ @top_srcdir@/include/starpu_sink.h \ @top_srcdir@/include/starpu_stdlib.h \ @top_srcdir@/include/starpu_task_bundle.h \ @top_srcdir@/include/starpu_task.h \ @top_srcdir@/include/starpu_task_list.h \ @top_srcdir@/include/starpu_task_util.h \ @top_srcdir@/include/starpu_thread.h \ @top_srcdir@/include/starpu_thread_util.h \ @top_srcdir@/include/starpu_top.h \ @top_srcdir@/include/starpu_tree.h \ @top_srcdir@/include/starpu_util.h \ @top_srcdir@/include/starpu_worker.h \ @top_srcdir@/include/fstarpu_mod.f90 \ @top_srcdir@/mpi/include/ \ @top_srcdir@/mpi/include/fstarpu_mpi_mod.f90 \ @top_srcdir@/starpufft/include/starpufft.h \ @top_srcdir@/sc_hypervisor/include EXAMPLE_PATH = @top_srcdir@/doc/doxygen \ @top_srcdir@/doc/doxygen/chapters \ @top_srcdir@/doc/doxygen/chapters/code INPUT_FILTER = @top_builddir@/doc/doxygen/doxygen_filter.sh #LATEX_HEADER = @top_srcdir@/doc/doxygen/refman.tex IMAGE_PATH = @top_srcdir@/doc/doxygen/chapters/images starpu-1.2.3+dfsg/doc/doxygen/doxygen.cfg000066400000000000000000002366221320135501600203410ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2013 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014 CNRS # Copyright (C) 2011 Télécom-SudParis # Copyright (C) 2011, 2012 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # Doxyfile 1.8.3.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" "). # We include a file here that is generated by StarPU's configure # script. This file will contain some configure-set values, such as # version, source dir, etc. @INCLUDE = doxygen-config.cfg #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or sequence of words) that should # identify the project. Note that if you do not use Doxywizard you need # to put quotes around the project name if it contains spaces. PROJECT_NAME = "StarPU Handbook" # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer # a quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify an logo or icon that is # included in the documentation. The maximum height of the logo should not # exceed 55 pixels and the maximum width should not exceed 200 pixels. # Doxygen will copy the logo to the output directory. PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. Note that you specify absolute paths here, but also # relative paths, which will be relative from the directory where doxygen is # started. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful if your file system # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding # "class=itcl::class" will allow you to use the command class in the # itcl::class meaning. TCL_SUBST = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, # and language is one of the parsers supported by doxygen: IDL, Java, # Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, # C++. For instance to make doxygen treat .inc files as Fortran files (default # is PHP), and .f files as C (default is Fortran), use: inc=Fortran f=C. Note # that for custom extensions you also need to set FILE_PATTERNS otherwise the # files are not read by doxygen. EXTENSION_MAPPING = # If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all # comments according to the Markdown format, which allows for more readable # documentation. See http://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you # can mix doxygen, HTML, and XML commands with Markdown formatting. # Disable only in case of backward compatibilities issues. MARKDOWN_SUPPORT = NO # When enabled doxygen tries to link words that correspond to documented classes, # or namespaces to their corresponding documentation. Such a link can be # prevented in individual cases by by putting a % sign in front of the word or # globally by setting AUTOLINK_SUPPORT to NO. AUTOLINK_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also makes the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate # getter and setter methods for a property. Setting this option to YES (the # default) will make doxygen replace the get and set methods by a property in # the documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and # unions are shown inside the group in which they are included (e.g. using # @ingroup) instead of on a separate page (for HTML and Man pages) or # section (for LaTeX and RTF). INLINE_GROUPED_CLASSES = YES # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and # unions with only public data fields will be shown inline in the documentation # of the scope in which they are defined (i.e. file, namespace, or group # documentation), provided this scope is documented. If set to NO (the default), # structs, classes, and unions are shown on a separate page (for HTML and Man # pages) or section (for LaTeX and RTF). INLINE_SIMPLE_STRUCTS = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penalty. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will roughly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols. SYMBOL_CACHE_SIZE = 0 # Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be # set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given # their name and scope. Since this can be an expensive process and often the # same symbol appear multiple times in the code, doxygen keeps a cache of # pre-resolved symbols. If the cache is too small doxygen will become slower. # If the cache is too large, memory is wasted. The cache size is given by this # formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols. LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_PACKAGE tag is set to YES all members with package or internal # scope will be included in the documentation. EXTRACT_PACKAGE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespaces are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen # will list include files with double quotes in the documentation # rather than with sharp brackets. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = NO # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen # will sort the (brief and detailed) documentation of class members so that # constructors and destructors are listed first. If set to NO (the default) # the constructors will appear in the respective orders defined by # SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. # This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO # and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to # do proper type resolution of all parameters of a function it will reject a # match between the prototype and the implementation of a member function even # if there is only one candidate or it is obvious which candidate to choose # by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen # will still accept a match between prototype and implementation in such cases. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if section-label ... \endif # and \cond section-label ... \endcond blocks. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or macro consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and macros in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 0 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. # You can optionally specify a file name after the option, if omitted # DoxygenLayout.xml will be used as the name of the layout file. LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files # containing the references data. This must be a list of .bib files. The # .bib extension is automatically appended if omitted. Using this command # requires the bibtex tool to be installed. See also # http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style # of the bibliography can be controlled using LATEX_BIB_STYLE. To use this # feature you need bibtex and perl available in the search path. Do not use # file names with spaces, bibtex cannot handle them. CITE_BIB_FILES = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = NO # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = NO # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_NO_PARAMDOC option can be enabled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. #defined in doxygen-config.cfg #INPUT = # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py # *.f90 *.f *.for *.vhd *.vhdl FILE_PATTERNS = *.h *.doxy # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). #defined in doxygen-config.cfg #EXAMPLE_PATH # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). # From @INCLUDE, above #IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. #defined in doxygen-config.cfg.in #INPUT_FILTER # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty or if # non of the patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) # and it is also possible to disable source filtering for a specific pattern # using *.ext= (so without naming a filter). This option only has effect when # FILTER_SOURCE_FILES is enabled. FILTER_SOURCE_PATTERNS = # If the USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page (index.html). # This can be useful if you have a project on for instance GitHub and want reuse # the introduction page also for the doxygen output. USE_MDFILE_AS_MAINPAGE = #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C, C++ and Fortran comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. Note that when using a custom header you are responsible # for the proper inclusion of any scripts and style sheets that doxygen # needs, which is dependent on the configuration options used. # It is advised to generate a default header using "doxygen -w html # header.html footer.html stylesheet.css YourConfigFile" and then modify # that header. Note that the header is subject to change so you typically # have to redo this when upgrading to a newer version of doxygen or when # changing the value of configuration settings such as GENERATE_TREEVIEW! HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If left blank doxygen will # generate a default style sheet. Note that it is recommended to use # HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this # tag will in the future become obsolete. HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify an additional # user-defined cascading style sheet that is included after the standard # style sheets created by doxygen. Using this option one can overrule # certain style aspects. This is preferred over using HTML_STYLESHEET # since it does not replace the standard style sheet and is therefor more # robust against future updates. Doxygen will copy the style sheet file to # the output directory. HTML_EXTRA_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that # the files will be copied as-is; there are no commands or markers available. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. # Doxygen will adjust the colors in the style sheet and background images # according to this color. Hue is specified as an angle on a colorwheel, # see http://en.wikipedia.org/wiki/Hue for more information. # For instance the value 0 represents red, 60 is yellow, 120 is green, # 180 is cyan, 240 is blue, 300 purple, and 360 is red again. # The allowed range is 0 to 359. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of # the colors in the HTML output. For a value of 0 the output will use # grayscales only. A value of 255 will produce the most vivid colors. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to # the luminance component of the colors in the HTML output. Values below # 100 gradually make the output lighter, whereas values above 100 make # the output darker. The value divided by 100 is the actual gamma applied, # so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, # and 100 does not change the gamma. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting # this to NO can help when comparing the output of multiple runs. HTML_TIMESTAMP = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. HTML_DYNAMIC_SECTIONS = YES # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of # entries shown in the various tree structured indices initially; the user # can expand and collapse entries dynamically later on. Doxygen will expand # the tree to such a level that at most the specified number of entries are # visible (unless a fully collapsed tree already exceeds this amount). # So setting the number of entries 1 will produce a full collapsed tree by # default. 0 is a special value representing an infinite number of entries # and will result in a full expanded tree by default. HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely # identify the documentation publisher. This should be a reverse domain-name # style string, e.g. com.mycompany.MyDocSet.documentation. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated # that can be used as input for Qt's qhelpgenerator to generate a # Qt Compressed Help (.qch) of the generated HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to # add. For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see # # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's # filter section matches. # # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files # will be generated, which together with the HTML files, form an Eclipse help # plugin. To install this plugin and make it available under the help contents # menu in Eclipse, the contents of the directory containing the HTML and XML # files needs to be copied into the plugins directory of eclipse. The name of # the directory within the plugins directory should be the same as # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before # the help appears. GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have # this name. ECLIPSE_DOC_ID = org.doxygen.Project # The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) # at top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. Since the tabs have the same information as the # navigation tree you can set this option to NO if you already set # GENERATE_TREEVIEW to YES. DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. # Since the tree basically has the same information as the tab index you # could consider to set DISABLE_INDEX to NO when enabling this option. GENERATE_TREEVIEW = YES # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values # (range [0,1..20]) that doxygen will group on one line in the generated HTML # documentation. Note that a value of 0 will completely suppress the enum # values from appearing in the overview section. ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open # links to external symbols imported via tag files in a separate window. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are # not supported properly for IE 6.0, but are supported on all modern browsers. # Note that when changing this option you need to delete any form_*.png files # in the HTML output before the changes have effect. FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax # (see http://www.mathjax.org) which uses client side Javascript for the # rendering instead of using prerendered bitmaps. Use this if you do not # have LaTeX installed or if you want to formulas look prettier in the HTML # output. When enabled you may also need to install MathJax separately and # configure the path to it using the MATHJAX_RELPATH option. USE_MATHJAX = NO # When MathJax is enabled you can set the default output format to be used for # thA MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and # SVG. The default value is HTML-CSS, which is slower, but has the best # compatibility. MATHJAX_FORMAT = HTML-CSS # When MathJax is enabled you need to specify the location relative to the # HTML output directory using the MATHJAX_RELPATH option. The destination # directory should contain the MathJax.js script. For instance, if the mathjax # directory is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to # the MathJax Content Delivery Network so you can quickly see the result without # installing MathJax. # However, it is strongly recommended to install a local # copy of MathJax from http://www.mathjax.org before deployment. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest # The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension # names that should be enabled during MathJax rendering. MATHJAX_EXTENSIONS = # When the SEARCHENGINE tag is enabled doxygen will generate a search box # for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using # HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets # (GENERATE_DOCSET) there is already a search function so this one should # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a web server instead of a web client using Javascript. # There are two flavours of web server based search depending on the # EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for # searching and an index file used by the script. When EXTERNAL_SEARCH is # enabled the indexing and searching needs to be provided by external tools. # See the manual for details. SERVER_BASED_SEARCH = NO # When EXTERNAL_SEARCH is enabled doxygen will no longer generate the PHP # script for searching. Instead the search results are written to an XML file # which needs to be processed by an external indexer. Doxygen will invoke an # external search engine pointed to by the SEARCHENGINE_URL option to obtain # the search results. Doxygen ships with an example indexer (doxyindexer) and # search engine (doxysearch.cgi) which are based on the open source search engine # library Xapian. See the manual for configuration details. EXTERNAL_SEARCH = NO # The SEARCHENGINE_URL should point to a search engine hosted by a web server # which will returned the search results when EXTERNAL_SEARCH is enabled. # Doxygen ships with an example search engine (doxysearch) which is based on # the open source search engine library Xapian. See the manual for configuration # details. SEARCHENGINE_URL = # When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed # search data is written to a file for indexing by an external tool. With the # SEARCHDATA_FILE tag the name of this file can be specified. SEARCHDATA_FILE = searchdata.xml # When SERVER_BASED_SEARCH AND EXTERNAL_SEARCH are both enabled the # EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is # useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple # projects and redirect the results back to the right project. EXTERNAL_SEARCH_ID = # The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen # projects other than the one defined by this configuration file, but that are # all added to the same external search index. Each project needs to have a # unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id # of to a relative location where the documentation can be found. # The format is: EXTRA_SEARCH_MAPPINGS = id1=loc1 id2=loc2 ... EXTRA_SEARCH_MAPPINGS = #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. # Note that when enabling USE_PDFLATEX this option is only used for # generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4 # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! #defined in doxygen-config.cfg #LATEX_HEADER # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for # the generated latex document. The footer should contain everything after # the last chapter. If it is left blank doxygen will generate a # standard footer. Notice: only use this tag if you know what you are doing! LATEX_FOOTER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include # source code with syntax highlighting in the LaTeX output. # Note that which sources are shown also depends on other settings # such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See # http://en.wikipedia.org/wiki/BibTeX for more info. LATEX_BIB_STYLE = plain #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load style sheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # pointed to by INCLUDE_PATH will be searched when a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = STARPU_USE_OPENCL=1 \ STARPU_USE_CUDA=1 \ STARPU_USE_MIC=1 \ STARPU_USE_SCC=1 \ STARPU_USE_MPI=1 \ STARPU_HAVE_HWLOC=1 \ STARPU_USE_SC_HYPERVISOR=1 \ STARPU_SIMGRID=1 \ STARPU_OPENMP=1 \ __GCC__ # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition that # overrules the definition found in the source code. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all references to function-like macros # that are alone on a line, have an all uppercase name, and do not end with a # semicolon, because these will confuse the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. For each # tag file the location of the external documentation should be added. The # format of a tag file without this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths # or URLs. Note that each tag file must have a unique name (where the name does # NOT include the path). If a tag file is not located in the directory in which # doxygen is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = starpu.tag # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option also works with HAVE_DOT disabled, but it is recommended to # install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is # allowed to run in parallel. When set to 0 (the default) doxygen will # base this on the number of processors available in the system. You can set it # explicitly to a value larger than 0 to get control over the balance # between CPU load and processing speed. DOT_NUM_THREADS = 0 # By default doxygen will use the Helvetica font for all dot files that # doxygen generates. When you want a differently looking font you can specify # the font name using DOT_FONTNAME. You need to make sure dot is able to find # the font, which can be done by putting it in a standard location or by setting # the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the # directory containing the font. DOT_FONTNAME = Helvetica # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the Helvetica font. # If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to # set the path where dot can find it. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If the UML_LOOK tag is enabled, the fields and methods are shown inside # the class node. If there are many fields or methods and many nodes the # graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS # threshold limits the number of items for each type to make the size more # managable. Set this to 0 for no limit. Note that the threshold may be # exceeded by 50% before the limit is enforced. UML_LIMIT_NUM_FIELDS = 10 # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will generate a graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are svg, png, jpg, or gif. # If left blank png will be used. If you choose svg you need to set # HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible in IE 9+ (other browsers do not have this requirement). DOT_IMAGE_FORMAT = png # If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to # enable generation of interactive SVG images that allow zooming and panning. # Note that this requires a modern browser other than Internet Explorer. # Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you # need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible. Older versions of IE do not have SVG support. INTERACTIVE_SVG = NO # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the # \mscfile command). MSCFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES starpu-1.2.3+dfsg/doc/doxygen/doxygen_filter.sh.in000077500000000000000000000017741320135501600221670ustar00rootroot00000000000000#!/bin/bash # # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. if [ "$(basename $1)" == "starpufft.h" ] ; then gcc -E $1 -I @top_srcdir@/include/ -I @top_builddir@/include/ |grep starpufft else # the macro STARPU_DEPRECATED needs to be removed as it is not properly processed by doxygen # lines starting with // in the doxygen input files are considered as comments to be removed sed -e 's/STARPU_DEPRECATED//' $1 | sed 's/^\/\/.*//' fi starpu-1.2.3+dfsg/doc/doxygen/refman.tex000066400000000000000000000174131320135501600201700ustar00rootroot00000000000000\input{./version.sty} \begin{titlepage} \vspace*{4cm} {\Huge \textbf{StarPU Handbook}}\\ \rule{\textwidth}{1.5mm} \begin{flushright} {\Large for StarPU \STARPUVERSION} \end{flushright} \rule{\textwidth}{1mm} ~\\ \vspace*{15cm} \begin{flushright} Generated by Doxygen. \end{flushright} \end{titlepage} \begin{figure}[p] This manual documents the usage of StarPU version \STARPUVERSION. Its contents was last updated on \STARPUUPDATED.\\ Copyright © 2009–2013 Université de Bordeaux\\ Copyright © 2010-2016 CNRS Copyright © 2011, 2012, 2016 INRIA \medskip \begin{quote} Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled “GNU Free Documentation License”. \end{quote} \end{figure} \pagenumbering{roman} \tableofcontents \pagenumbering{arabic} \hypersetup{pageanchor=true,citecolor=blue} \chapter{Introduction} \label{index} \hypertarget{index}{} \input{index} \part{StarPU Basics} \chapter{Building and Installing StarPU} \label{BuildingAndInstallingStarPU} \hypertarget{BuildingAndInstallingStarPU}{} \input{BuildingAndInstallingStarPU} \chapter{Basic Examples} \label{BasicExamples} \hypertarget{BasicExamples}{} \input{BasicExamples} \part{StarPU Quick Programming Guide} \chapter{Advanced Examples} \label{AdvancedExamples} \hypertarget{AdvancedExamples}{} \input{AdvancedExamples} \chapter{Check List When Performance Are Not There} \label{CheckListWhenPerformanceAreNotThere} \hypertarget{CheckListWhenPerformanceAreNotThere}{} \input{CheckListWhenPerformanceAreNotThere} \part{StarPU Inside} \chapter{Tasks In StarPU} \label{TasksInStarPU} \hypertarget{TasksInStarPU}{} \input{TasksInStarPU} \chapter{Data Management} \label{DataManagement} \hypertarget{DataManagement}{} \input{DataManagement} \chapter{Scheduling} \label{Scheduling} \hypertarget{Scheduling}{} \input{Scheduling} \chapter{Scheduling Contexts} \label{SchedulingContexts} \hypertarget{SchedulingContexts}{} \input{SchedulingContexts} \chapter{Scheduling Context Hypervisor} \label{SchedulingContextHypervisor} \hypertarget{SchedulingContextHypervisor}{} \input{SchedulingContextHypervisor} \chapter{Modularized Scheduler} \label{ModularizedScheduler} \hypertarget{ModularizedScheduler}{} \input{ModularizedScheduler} \chapter{Debugging Tools} \label{DebuggingTools} \hypertarget{DebuggingTools}{} \input{DebuggingTools} \chapter{Online Performance Tools} \label{OnlinePerformanceTools} \hypertarget{OnlinePerformanceTools}{} \input{OnlinePerformanceTools} \chapter{Offline Performance Tools} \label{OfflinePerformanceTools} \hypertarget{OfflinePerformanceTools}{} \input{OfflinePerformanceTools} \chapter{Frequently Asked Questions} \label{FrequentlyAskedQuestions} \hypertarget{FrequentlyAskedQuestions}{} \input{FrequentlyAskedQuestions} \part{StarPU Extensions} \chapter{Out Of Core} \label{OutOfCore} \hypertarget{OutOfCore}{} \input{OutOfCore} \chapter{MPI Support} \label{MPISupport} \hypertarget{MPISupport}{} \input{MPISupport} \chapter{FFT Support} \label{FFTSupport} \hypertarget{FFTSupport}{} \input{FFTSupport} \chapter{MIC/SCC Support} \label{MICSCCSupport} \hypertarget{MICSCCSupport}{} \input{MICSCCSupport} \chapter{C Extensions} \label{cExtensions} \hypertarget{cExtensions}{} \input{cExtensions} \chapter{Native Fortran Support} \label{NativeFortranSupport} \hypertarget{NativeFortranSupport}{} \input{NativeFortranSupport} \chapter{SOCL OpenCL Extensions} \label{SOCLOpenclExtensions} \hypertarget{SOCLOpenclExtensions}{} \input{SOCLOpenclExtensions} \chapter{SimGrid Support} \label{SimGridSupport} \hypertarget{SimGridSupport}{} \input{SimGridSupport} \chapter{OpenMP Runtime Support} \label{OpenMPRuntimeSupport} \hypertarget{OpenMPRuntimeSupport}{} \input{OpenMPRuntimeSupport} \part{StarPU Reference API} \chapter{Execution Configuration Through Environment Variables} \label{ExecutionConfigurationThroughEnvironmentVariables} \hypertarget{ExecutionConfigurationThroughEnvironmentVariables}{} \input{ExecutionConfigurationThroughEnvironmentVariables} \chapter{Compilation Configuration} \label{CompilationConfiguration} \hypertarget{CompilationConfiguration}{} \input{CompilationConfiguration} \chapter{Module Index} \input{modules} \chapter{Module Documentation a.k.a StarPU's API} \label{ModuleDocumentation} \hypertarget{ModuleDocumentation}{} \input{group__API__Versioning} \input{group__API__Initialization__and__Termination} \input{group__API__Standard__Memory__Library} \input{group__API__Toolbox} \input{group__API__Threads} \input{group__API__Bitmap} \input{group__API__Workers__Properties} \input{group__API__Data__Management} \input{group__API__Data__Interfaces} \input{group__API__Data__Partition} \input{group__API__Out__Of__Core} \input{group__API__Multiformat__Data__Interface} \input{group__API__Codelet__And__Tasks} \input{group__API__Insert__Task} \input{group__API__Explicit__Dependencies} \input{group__API__Implicit__Data__Dependencies} \input{group__API__Performance__Model} \input{group__API__Profiling} \input{group__API__Theoretical__Lower__Bound__on__Execution__Time} \input{group__API__CUDA__Extensions} \input{group__API__OpenCL__Extensions} \input{group__API__OpenMP__Runtime__Support} \input{group__API__MIC__Extensions} \input{group__API__SCC__Extensions} \input{group__API__Miscellaneous__Helpers} \input{group__API__FxT__Support} \input{group__API__FFT__Support} \input{group__API__MPI__Support} \input{group__API__Task__Bundles} \input{group__API__Task__Lists} \input{group__API__Parallel__Tasks} \input{group__API__Running__Drivers} \input{group__API__Expert__Mode} \input{group__API__StarPUTop__Interface} \input{group__API__Scheduling__Contexts} \input{group__API__Scheduling__Policy} \input{group__API__Tree} \input{group__API__SC__Hypervisor__usage} \input{group__API__SC__Hypervisor} \input{group__API__Modularized__Scheduler} \chapter{File Index} \input{files} \chapter{File Documentation} \label{FileDocumentation} \hypertarget{FileDocumentation}{} \input{starpu_8h} \input{starpu__bitmap_8h} \input{starpu__bound_8h} \input{starpu__config_8h} \input{starpu__cublas_8h} \input{starpu__cuda_8h} \input{starpu__data_8h} \input{starpu__data__filters_8h} \input{starpu__data__interfaces_8h} \input{starpu__deprecated__api_8h} \input{starpu__disk_8h} \input{starpu__driver_8h} \input{starpu__expert_8h} \input{starpu__fxt_8h} \input{starpu__hash_8h} \input{starpu__mic_8h} \input{starpu__opencl_8h} \input{starpu__openmp_8h} \input{starpu__perfmodel_8h} \input{starpu__profiling_8h} \input{starpu__rand_8h} \input{starpu__scc_8h} \input{starpu__sched__ctx_8h} \input{starpu__sched__ctx__hypervisor_8h} \input{starpu__scheduler_8h} \input{starpu__sink_8h} \input{starpu__stdlib_8h} \input{starpu__task_8h} \input{starpu__task__bundle_8h} \input{starpu__task__list_8h} \input{starpu__task__util_8h} \input{starpu__thread_8h} \input{starpu__thread__util_8h} \input{starpu__top_8h} \input{starpu__tree_8h} \input{starpu__util_8h} \input{starpu__worker_8h} \input{starpu__mpi_8h} \input{starpufft_8h} \input{sc__hypervisor_8h} \input{sc__hypervisor__config_8h} \input{sc__hypervisor__lp_8h} \input{sc__hypervisor__monitoring_8h} \input{sc__hypervisor__policy_8h} \chapter{Deprecated List} \label{deprecated} \hypertarget{deprecated}{} \input{deprecated} \part{Appendix} \chapter{Full Source Code for the ’Scaling a Vector’ Example} \label{FullSourceCodeVectorScal} \hypertarget{FullSourceCodeVectorScal}{} \input{FullSourceCodeVectorScal} \chapter{GNU Free Documentation License} \label{GNUFreeDocumentationLicense} \hypertarget{GNUFreeDocumentationLicense}{} \input{GNUFreeDocumentationLicense} \part{Index} \addcontentsline{toc}{chapter}{Index} \printindex \end{document} starpu-1.2.3+dfsg/doc/tutorial/000077500000000000000000000000001320135501600163565ustar00rootroot00000000000000starpu-1.2.3+dfsg/doc/tutorial/Makefile000066400000000000000000000051471320135501600200250ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2011 Université de Bordeaux # Copyright (C) 2010-2014 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. CFLAGS += $$(pkg-config --cflags starpu-1.1) LDFLAGS += $$(pkg-config --libs starpu-1.1) HAS_CUDA = $(shell pkg-config --libs starpu-1.1 |grep -i cuda) NVCC ?= nvcc HAS_OPENCL = $(shell pkg-config --libs starpu-1.1 |grep -i opencl) %.o: %.cu nvcc $(CFLAGS) $< -c TARGETS = hello_world vector_scal hello_world_plugin vector_scal_plugin vector_scal_task_insert all: $(TARGETS) VECTOR_SCAL_PREREQUISITES = vector_scal.o vector_scal_cpu.o ifneq ($(strip $(HAS_CUDA)),) VECTOR_SCAL_PREREQUISITES += vector_scal_cuda.o VECTOR_SCAL_COMPILER = $(NVCC) else VECTOR_SCAL_COMPILER = $(CC) endif ifneq ($(strip $(HAS_OPENCL)),) VECTOR_SCAL_PREREQUISITES += vector_scal_opencl.o endif vector_scal: $(VECTOR_SCAL_PREREQUISITES) $(VECTOR_SCAL_COMPILER) $(LDFLAGS) $^ -o $@ VECTOR_SCAL_TASK_INSERT_PREREQUISITES = vector_scal_task_insert.o vector_scal_cpu.o ifneq ($(strip $(HAS_CUDA)),) VECTOR_SCAL_TASK_INSERT_PREREQUISITES += vector_scal_cuda.o VECTOR_SCAL_TASK_INSERT_COMPILER = $(NVCC) else VECTOR_SCAL_TASK_INSERT_COMPILER = $(CC) endif ifneq ($(strip $(HAS_OPENCL)),) VECTOR_SCAL_TASK_INSERT_PREREQUISITES += vector_scal_opencl.o endif vector_scal_task_insert: $(VECTOR_SCAL_TASK_INSERT_PREREQUISITES) $(VECTOR_SCAL_TASK_INSERT_COMPILER) $(LDFLAGS) $^ -o $@ hello_world_plugin: hello_world_plugin.c $(CC) $(CFLAGS) -fplugin=`pkg-config starpu-1.1 --variable=gccplugin` $(LDFLAGS) $^ -o $@ VECTOR_SCAL_PLUGIN_PREREQUISITES = vector_scal_plugin.o ifneq ($(strip $(HAS_CUDA)),) VECTOR_SCAL_PLUGIN_PREREQUISITES += vector_scal_plugin_cuda.o VECTOR_SCAL_PLUGIN_COMPILER = $(NVCC) else VECTOR_SCAL_PLUGIN_COMPILER = $(CC) endif vector_scal_plugin.o: vector_scal_plugin.c $(CC) -c $(CFLAGS) -fplugin=`pkg-config starpu-1.1 --variable=gccplugin` $^ -o $@ vector_scal_plugin: $(VECTOR_SCAL_PLUGIN_PREREQUISITES) $(CC) -fplugin=`pkg-config starpu-1.1 --variable=gccplugin` $(LDFLAGS) $(VECTOR_SCAL_PLUGIN_PREREQUISITES) -o $@ clean: rm -f $(TARGETS) *.o starpu-1.2.3+dfsg/doc/tutorial/README000066400000000000000000000025221320135501600172370ustar00rootroot00000000000000# # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2011 Université de Bordeaux # Copyright (C) 2010, 2011, 2013 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. Instructions on how to compile and run StarPU examples ------------------------------------------------------ % export STARPU_DIR= % export PKG_CONFIG_PATH=$STARPU_DIR/lib/pkgconfig:$PKG_CONFIG_PATH % export LD_LIBRARY_PATH=$STARPU_DIR/lib:$LD_LIBRARY_PATH % make hello_world % ./hello_world % make vector_scal % ./vector_scal % STARPU_NCPU=0 ./vector_scal % STARPU_NCPU=0 STARPU_NCUDA=0 ./vector_scal % make hello_world_plugin % ./hello_world_plugin % make vector_scal_plugin % STARPU_NCPU=0 STARPU_NCUDA=0 ./vector_scal_plugin % STARPU_NCPU=0 STARPU_NOPENCL=0 ./vector_scal_plugin % STARPU_NOPENCL=0 STARPU_NCUDA=0 ./vector_scal_plugin starpu-1.2.3+dfsg/doc/tutorial/hello_world.c000066400000000000000000000033731320135501600210420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011 Université de Bordeaux * Copyright (C) 2010-2011, 2013, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include struct params { int i; float f; }; void cpu_func(void *buffers[], void *cl_arg) { struct params *params = cl_arg; printf("Hello world (params = {%i, %f} )\n", params->i, params->f); } struct starpu_codelet cl = { .cpu_funcs = {cpu_func}, .nbuffers = 0 }; void callback_func(void *callback_arg) { printf("Callback function (arg %p)\n", callback_arg); } int main(int argc, char **argv) { int ret; /* initialize StarPU */ ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); struct starpu_task *task = starpu_task_create(); task->cl = &cl; /* Pointer to the codelet defined above */ struct params params = { 1, 2.0f }; task->cl_arg = ¶ms; task->cl_arg_size = sizeof(params); task->callback_func = callback_func; task->callback_arg = (void*) (uintptr_t) 0x42; /* starpu_task_submit will be a blocking call */ task->synchronous = 1; /* submit the task to StarPU */ ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); /* terminate StarPU */ starpu_shutdown(); return 0; } starpu-1.2.3+dfsg/doc/tutorial/hello_world_msvc.c000066400000000000000000000034611320135501600220700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2014 Université de Bordeaux * Copyright (C) 2010-2011, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include struct params { int i; float f; }; void cpu_func(void *buffers[], void *cl_arg) { struct params *params = cl_arg; printf("Hello world (params = {%i, %f} )\n", params->i, params->f); } void callback_func(void *callback_arg) { printf("Callback function (arg %x)\n", callback_arg); } int main(int argc, char **argv) { int ret; struct starpu_codelet cl; struct starpu_task *task; struct params params; starpu_codelet_init(&cl); cl.cpu_funcs[0] = cpu_func; cl.nbuffers = 0; /* initialize StarPU */ ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); task = starpu_task_create(); task->cl = &cl; /* Pointer to the codelet defined above */ params.i = 1; params.f = 2.0f; task->cl_arg = ¶ms; task->cl_arg_size = sizeof(params); task->callback_func = callback_func; task->callback_arg = (void*) (uintptr_t) 0x42; /* starpu_task_submit will be a blocking call */ task->synchronous = 1; /* submit the task to StarPU */ ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); /* terminate StarPU */ starpu_shutdown(); return 0; } starpu-1.2.3+dfsg/doc/tutorial/hello_world_plugin.c000066400000000000000000000021311320135501600224070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include /* Task declaration. */ static void my_task (int x) __attribute__ ((task)); /* Definition of the CPU implementation of ‘my task’. */ static void my_task (int x) { printf ("Hello, world! With x = %d\n", x); } int main () { /* Initialize StarPU. */ #pragma starpu initialize /* Do an asynchronous call to ‘my task’. */ my_task (42); /* Wait for the call to complete. */ #pragma starpu wait /* Terminate. */ #pragma starpu shutdown return 0; } starpu-1.2.3+dfsg/doc/tutorial/vector_scal.c000066400000000000000000000101751320135501600210320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012, 2013 CNRS * Copyright (C) 2010-2012 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This example demonstrates how to use StarPU to scale an array by a factor. * It shows how to manipulate data with StarPU's data management library. * 1- how to declare a piece of data to StarPU (starpu_vector_data_register) * 2- how to describe which data are accessed by a task (task->handle[0]) * 3- how a kernel can manipulate the data (buffers[0].vector.ptr) */ #include #define NX 2048 extern void vector_scal_cpu(void *buffers[], void *_args); extern void vector_scal_cuda(void *buffers[], void *_args); extern void vector_scal_opencl(void *buffers[], void *_args); static struct starpu_codelet cl = { /* CPU implementation of the codelet */ .cpu_funcs = {vector_scal_cpu}, #ifdef STARPU_USE_CUDA /* CUDA implementation of the codelet */ .cuda_funcs = {vector_scal_cuda}, #endif #ifdef STARPU_USE_OPENCL /* OpenCL implementation of the codelet */ .opencl_funcs = {vector_scal_opencl}, #endif .nbuffers = 1, .modes = {STARPU_RW} }; #ifdef STARPU_USE_OPENCL struct starpu_opencl_program programs; #endif int main(int argc, char **argv) { /* We consider a vector of float that is initialized just as any of C * data */ float vector[NX]; unsigned i; for (i = 0; i < NX; i++) vector[i] = 1.0f; fprintf(stderr, "BEFORE : First element was %f\n", vector[0]); /* Initialize StarPU with default configuration */ int ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_USE_OPENCL starpu_opencl_load_opencl_from_file("vector_scal_opencl_kernel.cl", &programs, NULL); #endif /* Tell StaPU to associate the "vector" vector with the "vector_handle" * identifier. When a task needs to access a piece of data, it should * refer to the handle that is associated to it. * In the case of the "vector" data interface: * - the first argument of the registration method is a pointer to the * handle that should describe the data * - the second argument is the memory node where the data (ie. "vector") * resides initially: STARPU_MAIN_RAM stands for an address in main memory, as * opposed to an adress on a GPU for instance. * - the third argument is the adress of the vector in RAM * - the fourth argument is the number of elements in the vector * - the fifth argument is the size of each element. */ starpu_data_handle_t vector_handle; starpu_vector_data_register(&vector_handle, STARPU_MAIN_RAM, (uintptr_t)vector, NX, sizeof(vector[0])); float factor = 3.14; /* create a synchronous task: any call to starpu_task_submit will block * until it is terminated */ struct starpu_task *task = starpu_task_create(); task->synchronous = 1; task->cl = &cl; /* the codelet manipulates one buffer in RW mode */ task->handles[0] = vector_handle; /* an argument is passed to the codelet, beware that this is a * READ-ONLY buffer and that the codelet may be given a pointer to a * COPY of the argument */ task->cl_arg = &factor; task->cl_arg_size = sizeof(factor); /* execute the task on any eligible computational ressource */ ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); /* StarPU does not need to manipulate the array anymore so we can stop * monitoring it */ starpu_data_unregister(vector_handle); #ifdef STARPU_USE_OPENCL starpu_opencl_unload_opencl(&programs); #endif /* terminate StarPU, no task can be submitted after */ starpu_shutdown(); fprintf(stderr, "AFTER First element is %f\n", vector[0]); return 0; } starpu-1.2.3+dfsg/doc/tutorial/vector_scal_cpu.c000066400000000000000000000035711320135501600217030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include /* This kernel takes a buffer and scales it by a constant factor */ void vector_scal_cpu(void *buffers[], void *cl_arg) { unsigned i; float *factor = cl_arg; /* * The "buffers" array matches the task->handles array: for instance * task->handles[0] is a handle that corresponds to a data with * vector "interface", so that the first entry of the array in the * codelet is a pointer to a structure describing such a vector (ie. * struct starpu_vector_interface *). Here, we therefore manipulate * the buffers[0] element as a vector: nx gives the number of elements * in the array, ptr gives the location of the array (that was possibly * migrated/replicated), and elemsize gives the size of each elements. */ struct starpu_vector_interface *vector = buffers[0]; /* length of the vector */ unsigned n = STARPU_VECTOR_GET_NX(vector); /* get a pointer to the local copy of the vector : note that we have to * cast it in (float *) since a vector could contain any type of * elements so that the .ptr field is actually a uintptr_t */ float *val = (float *)STARPU_VECTOR_GET_PTR(vector); /* scale the vector */ for (i = 0; i < n; i++) val[i] *= *factor; } starpu-1.2.3+dfsg/doc/tutorial/vector_scal_cuda.cu000066400000000000000000000027701320135501600222150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include static __global__ void vector_mult_cuda(float *val, unsigned int n, float factor) { unsigned i = blockIdx.x*blockDim.x + threadIdx.x; if (i < n) val[i] *= factor; } extern "C" void vector_scal_cuda(void *buffers[], void *_args) { float *factor = (float *)_args; /* length of the vector */ unsigned int n = STARPU_VECTOR_GET_NX(buffers[0]); /* local copy of the vector pointer */ float *val = (float *)STARPU_VECTOR_GET_PTR(buffers[0]); unsigned threads_per_block = 64; unsigned nblocks = (n + threads_per_block-1) / threads_per_block; vector_mult_cuda<<>>(val, n, *factor); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.2.3+dfsg/doc/tutorial/vector_scal_opencl.c000066400000000000000000000035601320135501600223720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include extern struct starpu_opencl_program programs; void vector_scal_opencl(void *buffers[], void *_args) { float *factor = _args; int id, devid, err; cl_kernel kernel; cl_command_queue queue; cl_event event; /* length of the vector */ unsigned n = STARPU_VECTOR_GET_NX(buffers[0]); /* OpenCL copy of the vector pointer */ cl_mem val = (cl_mem) STARPU_VECTOR_GET_DEV_HANDLE(buffers[0]); id = starpu_worker_get_id(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &programs, "vector_mult_opencl", devid); /* Name of the codelet defined above */ if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 0, sizeof(val), &val); err |= clSetKernelArg(kernel, 1, sizeof(n), &n); err |= clSetKernelArg(kernel, 2, sizeof(*factor), factor); if (err) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=1; size_t local=1; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } clFinish(queue); starpu_opencl_collect_stats(event); clReleaseEvent(event); starpu_opencl_release_kernel(kernel); } starpu-1.2.3+dfsg/doc/tutorial/vector_scal_opencl_kernel.cl000066400000000000000000000015121320135501600241010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ __kernel void vector_mult_opencl(unsigned int nx, __global float* val, float factor) { const int i = get_global_id(0); if (i < nx) { val[i] *= factor; } } starpu-1.2.3+dfsg/doc/tutorial/vector_scal_plugin.c000066400000000000000000000117051320135501600224100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* This example showcases features of the StarPU GCC plug-in. It defines a "vector scaling" task with multiple CPU implementations, an OpenCL implementation, and a CUDA implementation. Compiling it without `-fplugin=starpu.so' yields valid sequential code. */ #include #include #include #include /* Declare and define the standard CPU implementation. */ static void vector_scal (unsigned int size, float vector[size], float factor) __attribute__ ((task)); /* The CPU implementation. */ static void vector_scal (unsigned int size, float vector[size], float factor) { unsigned int i; for (i = 0; i < size; i++) vector[i] *= factor; } #if defined STARPU_GCC_PLUGIN && defined __SSE__ /* The SSE-capable CPU implementation. */ #include static void vector_scal_sse (unsigned int size, float vector[size], float factor) __attribute__ ((task_implementation ("cpu", vector_scal))); static void vector_scal_sse (unsigned int size, float vector[size], float factor) { unsigned int n_iterations = size / 4; __m128 *VECTOR = (__m128 *) vector; __m128 _FACTOR STARPU_ATTRIBUTE_ALIGNED(16); _FACTOR = _mm_set1_ps (factor); unsigned int i; for (i = 0; i < n_iterations; i++) VECTOR[i] = _mm_mul_ps (_FACTOR, VECTOR[i]); unsigned int remainder = size % 4; if (remainder != 0) { unsigned int start = 4 * n_iterations; for (i = start; i < start + remainder; ++i) vector[i] = factor * vector[i]; } } #endif /* __SSE__ */ /* Declaration and definition of the OpenCL implementation. */ #if defined STARPU_GCC_PLUGIN && defined STARPU_USE_OPENCL #include /* The OpenCL programs, loaded from `main'. */ static struct starpu_opencl_program cl_programs; static void vector_scal_opencl (unsigned int size, float vector[size], float factor) __attribute__ ((task_implementation ("opencl", vector_scal))); static void vector_scal_opencl (unsigned int size, float vector[size], float factor) { int id, devid, err; cl_kernel kernel; cl_command_queue queue; cl_event event; cl_mem val = (cl_mem) vector; id = starpu_worker_get_id (); devid = starpu_worker_get_devid (id); /* Prepare to invoke the kernel. In the future, this will be largely automated. */ err = starpu_opencl_load_kernel (&kernel, &queue, &cl_programs, "vector_mult_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR (err); err = clSetKernelArg (kernel, 0, sizeof (size), &size); err |= clSetKernelArg (kernel, 1, sizeof (val), &val); err |= clSetKernelArg (kernel, 2, sizeof (factor), &factor); if (err) STARPU_OPENCL_REPORT_ERROR (err); size_t global = size, local = 1; err = clEnqueueNDRangeKernel (queue, kernel, 1, NULL, &global, &local, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR (err); clFinish (queue); starpu_opencl_collect_stats (event); clReleaseEvent (event); starpu_opencl_release_kernel (kernel); } #endif #ifdef STARPU_USE_CUDA /* Declaration of the CUDA implementation. The definition itself is in the `.cu' file itself. */ extern void vector_scal_cuda (unsigned int size, float vector[size], float factor) __attribute__ ((task_implementation ("cuda", vector_scal))); #endif #define EPSILON 1e-3 static bool check (unsigned int size, float vector[size], float factor) { unsigned int i; for (i = 0; i < size; i++) { if (fabs(vector[i] - i * factor) > i*factor*EPSILON) { fprintf(stderr, "%.2f != %.2f\n", vector[i], i*factor); return false; } } fprintf(stderr, "computation is correct\n"); return true; } int main (void) { bool valid; #pragma starpu initialize #if defined STARPU_GCC_PLUGIN && defined STARPU_USE_OPENCL starpu_opencl_load_opencl_from_file ("vector_scal_opencl_kernel.cl", &cl_programs, ""); #endif #define NX 0x100000 #define FACTOR 3.14 { float vector[NX] __attribute__ ((heap_allocated, registered)); unsigned int i; for (i = 0; i < NX; i++) vector[i] = (float) i; vector_scal (NX, vector, FACTOR); #pragma starpu wait #pragma starpu acquire vector valid = check (NX, vector, FACTOR); #pragma starpu release vector } /* VECTOR is automatically freed here. */ #pragma starpu shutdown return valid ? EXIT_SUCCESS : EXIT_FAILURE; } starpu-1.2.3+dfsg/doc/tutorial/vector_scal_plugin_cuda.cu000066400000000000000000000025651320135501600235750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * Copyright (C) 2010, 2011, 2013 CNRS * Copyright (C) 2010 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* CUDA implementation of the `vector_scal' task. */ #include #include #include static __global__ void vector_mult_cuda (unsigned int n, float *val, float factor) { unsigned i = blockIdx.x * blockDim.x + threadIdx.x; if (i < n) val[i] *= factor; } extern "C" void vector_scal_cuda (unsigned int size, float vector[], float factor) { unsigned threads_per_block = 64; unsigned nblocks = (size + threads_per_block - 1) / threads_per_block; vector_mult_cuda <<< nblocks, threads_per_block, 0, starpu_cuda_get_local_stream () >>> (size, vector, factor); cudaStreamSynchronize (starpu_cuda_get_local_stream ()); } starpu-1.2.3+dfsg/examples/000077500000000000000000000000001320135501600155645ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/Makefile.am000066400000000000000000000716041320135501600176300ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2017 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2017 CNRS # Copyright (C) 2011 Télécom-SudParis # Copyright (C) 2011-2012 INRIA # Copyright (C) 2015-2016 Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. include $(top_srcdir)/starpu.mk if STARPU_SIMGRID STARPU_PERF_MODEL_DIR=$(abs_top_srcdir)/tools/perfmodels/sampling STARPU_HOSTNAME=mirage MALLOC_PERTURB_=0 export STARPU_PERF_MODEL_DIR export STARPU_HOSTNAME export MALLOC_PERTURB_ endif AM_CFLAGS = $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(GLOBAL_AM_CFLAGS) -Wno-unused AM_CXXFLAGS = $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) LIBS = $(top_builddir)/src/@LIBSTARPU_LINK@ $(MAGMA_LIBS) $(HWLOC_LIBS) @LIBS@ $(FXT_LIBS) AM_CPPFLAGS = -I$(top_srcdir)/include/ -I$(top_srcdir)/examples/ -I$(top_builddir)/include AM_LDFLAGS = @STARPU_EXPORT_DYNAMIC@ $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) $(STARPU_COI_LDFLAGS) $(STARPU_SCIF_LDFLAGS) SUBDIRS = stencil BUILT_SOURCES = if STARPU_USE_OPENCL nobase_STARPU_OPENCL_DATA_DATA = endif EXTRA_DIST = \ README.txt \ axpy/axpy.h \ axpy/axpy_opencl_kernel.cl \ basic_examples/vector_scal_opencl_kernel.cl \ basic_examples/multiformat_types.h \ basic_examples/multiformat_opencl_kernel.cl \ basic_examples/multiformat_conversion_codelets_opencl_kernel.cl \ common/blas_model.c \ spmd/vector_scal_spmd.c \ spmv/spmv_cuda.cu \ spmv/spmv_opencl.cl \ spmv/matrix_market/examples/fidapm05.mtx \ mult/xgemm.c \ lu/xlu.c \ lu/xlu_pivot.c \ lu/xlu_implicit.c \ lu/xlu_implicit_pivot.c \ lu/xlu_kernels.c \ lu/lu_example.c \ incrementer/incrementer_kernels_opencl_kernel.cl \ basic_examples/variable_kernels_opencl_kernel.cl \ matvecmult/matvecmult_kernel.cl \ basic_examples/block_opencl_kernel.cl \ filters/fblock_opencl_kernel.cl \ filters/custom_mf/conversion_opencl.cl \ filters/custom_mf/custom_opencl.cl \ filters/custom_mf/custom_types.h \ interface/complex_kernels.cl \ reductions/dot_product.h \ reductions/dot_product_opencl_kernels.cl \ scheduler/schedulers.sh \ scheduler/schedulers_context.sh \ fortran/Makefile \ heat/heat.sh \ lu/lu.sh CLEANFILES = *.gcno *.gcda *.linkinfo *.mod starpu_idle_microsec.log *.mps *.dot *.pl if STARPU_USE_CUDA NVCCFLAGS += --compiler-options -fno-strict-aliasing -I$(top_srcdir)/include/ -I$(top_builddir)/include/ -I$(top_srcdir)/examples/ $(HWLOC_CFLAGS) .cu.o: $(NVCC) $< -c -o $@ $(NVCCFLAGS) endif if STARPU_HAVE_ICC .icc.o: $(ICC) -x c $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) $< -c -o $@ endif examplebindir = $(libdir)/starpu/examples/ examplebin_PROGRAMS = noinst_HEADERS = \ axpy/axpy.h \ cg/cg.h \ heat/lu_kernels_model.h \ heat/dw_sparse_cg.h \ heat/heat.h \ heat/dw_factolu.h \ lu/xlu.h \ lu/xlu_kernels.h \ lu/lu-float.h \ lu/lu-double.h \ lu/complex_float.h \ lu/complex_double.h \ lu/blas_complex.h \ cholesky/cholesky.h \ sched_ctx_utils/sched_ctx_utils.h \ common/blas_model.h \ common/blas.h \ mult/simple.h \ mult/double.h \ fortran/StarPU_fortran.h \ ppm_downscaler/ppm_downscaler.h \ ppm_downscaler/yuv_downscaler.h \ spmv/matrix_market/mmio.h \ spmv/matrix_market/mm_to_bcsr.h \ spmv/spmv.h \ spmv/dw_block_spmv.h \ basic_examples/multiformat_types.h \ filters/custom_mf/custom_interface.h \ filters/custom_mf/custom_types.h \ interface/complex_interface.h \ interface/complex_codelet.h \ pi/pi.h \ pi/SobolQRNG/sobol.h \ pi/SobolQRNG/sobol_gold.h \ pi/SobolQRNG/sobol_gpu.h \ pi/SobolQRNG/sobol_primitives.h \ reductions/dot_product.h \ basic_examples/vector_scal_cpu_template.h ##################################### # What to install and what to check # ##################################### examplebin_PROGRAMS += $(STARPU_EXAMPLES) TESTS = $(STARPU_EXAMPLES) if STARPU_NEW_CHECK TESTS += scheduler/schedulers.sh TESTS += scheduler/schedulers_context.sh endif if STARPU_HAVE_WINDOWS check_PROGRAMS = $(STARPU_EXAMPLES) else check_PROGRAMS = $(LOADER) $(STARPU_EXAMPLES) endif if !STARPU_HAVE_WINDOWS ## test loader program if !STARPU_CROSS_COMPILING LOADER = loader loader_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -I$(top_builddir)/src/ LOADER_BIN = $(abs_top_builddir)/examples/$(LOADER) loader_SOURCES = ../tests/loader.c else LOADER = LOADER_BIN = $(top_builddir)/examples/loader-cross.sh endif if STARPU_HAVE_AM111 TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" LOG_COMPILER = $(LOADER_BIN) else TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(LOADER_BIN) endif endif # STARPU_EXAMPLES list all applications which have to be compiled and checked # Applications which should only be compiled are added directly in examplebin_PROGRAMS # see for instance mandelbrot/mandelbrot STARPU_EXAMPLES = STARPU_EXAMPLES += \ sched_ctx/prio \ worker_collections/worker_list_example if !STARPU_SIMGRID STARPU_EXAMPLES += \ basic_examples/hello_world \ basic_examples/vector_scal \ basic_examples/mult \ basic_examples/block \ basic_examples/variable \ basic_examples/multiformat \ basic_examples/dynamic_handles \ cpp/incrementer_cpp \ filters/fvector \ filters/fblock \ filters/fmatrix \ filters/fmultiple_manual \ filters/fmultiple_submit \ filters/fmultiple_submit_readonly \ tag_example/tag_example \ tag_example/tag_example2 \ tag_example/tag_example3 \ tag_example/tag_example4 \ tag_example/tag_restartable \ spmd/vector_scal_spmd \ spmv/spmv \ callback/callback \ callback/prologue \ incrementer/incrementer \ binary/binary \ interface/complex \ matvecmult/matvecmult \ profiling/profiling \ scheduler/dummy_sched \ sched_ctx/dummy_sched_with_ctx \ worker_collections/worker_tree_example \ reductions/dot_product \ reductions/minmax_reduction if STARPU_NEW_CHECK STARPU_EXAMPLES += \ sched_ctx/sched_ctx \ sched_ctx/two_cpu_contexts endif endif if !STARPU_SIMGRID STARPU_EXAMPLES += \ scheduler/dummy_sched if STARPU_HAVE_F77 if STARPU_HAVE_F77_H STARPU_EXAMPLES += \ fortran/hello endif STARPU_EXAMPLES += \ basic_examples/vector_scal_fortran endif if STARPU_HAVE_FC if !STARPU_SANITIZE STARPU_EXAMPLES += \ fortran90/f90_example \ native_fortran/nf_vector \ native_fortran/nf_matrix \ native_fortran/nf_example \ native_fortran/nf_dynbuf \ native_fortran/nf_varbuf \ native_fortran/nf_sched_ctx \ native_fortran/nf_partition if STARPU_NEW_CHECK STARPU_EXAMPLES += \ native_fortran/nf_sched_ctx endif endif endif endif if !NO_BLAS_LIB STARPU_EXAMPLES += \ mult/sgemm \ mult/dgemm \ cholesky/cholesky_tag \ cholesky/cholesky_tile_tag \ cholesky/cholesky_implicit if !STARPU_SIMGRID STARPU_EXAMPLES += \ axpy/axpy \ cholesky/cholesky_grain_tag \ lu/lu_example_float \ lu/lu_example_double \ lu/lu_implicit_example_float \ lu/lu_implicit_example_double \ heat/heat \ cg/cg \ pipeline/pipeline TESTS += \ heat/heat.sh \ lu/lu.sh endif endif if !STARPU_SIMGRID if MKL_BLAS_LIB STARPU_EXAMPLES += \ lu/lu_example_complex_float \ lu/lu_example_complex_double \ lu/lu_implicit_example_complex_float \ lu/lu_implicit_example_complex_double endif if ATLAS_BLAS_LIB STARPU_EXAMPLES += \ spmv/dw_block_spmv endif if !STARPU_SIMGRID if STARPU_HAVE_F77 if STARPU_HAVE_F77_H STARPU_EXAMPLES += \ fortran/hello endif STARPU_EXAMPLES += \ basic_examples/vector_scal_fortran endif endif if STARPU_HAVE_OPENMP STARPU_EXAMPLES += \ openmp/vector_scal_omp \ sched_ctx/sched_ctx_without_sched_policy\ sched_ctx/nested_sched_ctxs \ sched_ctx/sched_ctx_without_sched_policy\ sched_ctx/sched_ctx_without_sched_policy_awake\ sched_ctx/parallel_tasks_reuse_handle if STARPU_NEW_CHECK STARPU_EXAMPLES += \ sched_ctx/parallel_code endif endif endif !STARPU_SIMGRID ################## # Basic examples # ################## basic_examples_vector_scal_SOURCES = \ basic_examples/vector_scal.c \ basic_examples/vector_scal_cpu.c if STARPU_HAVE_ICC if STARPU_CROSS_COMPILING basic_examples_vector_scal_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) $(basic_examples_vector_scal_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ else basic_examples_vector_scal_SOURCES += \ basic_examples/vector_scal_cpu_icc.icc basic_examples_vector_scal_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(ICC) $(basic_examples_vector_scal_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ endif else basic_examples_vector_scal_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) $(basic_examples_vector_scal_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ endif if STARPU_USE_CUDA basic_examples_vector_scal_SOURCES += \ basic_examples/vector_scal_cuda.cu endif if STARPU_USE_OPENCL basic_examples_vector_scal_SOURCES += \ basic_examples/vector_scal_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ basic_examples/vector_scal_opencl_kernel.cl endif if STARPU_HAVE_F77 basic_examples_vector_scal_fortran_SOURCES = \ basic_examples/vector_scal_fortran.F \ basic_examples/vector_scal_c.c \ basic_examples/vector_scal_cpu.c if STARPU_USE_CUDA basic_examples_vector_scal_fortran_SOURCES += \ basic_examples/vector_scal_cuda.cu basic_examples_vector_scal_fortran_LDADD = \ $(STARPU_CUDA_FORTRAN_LDFLAGS) endif if STARPU_HAVE_F77_H fortran_hello_SOURCES = \ fortran/hello_c.c \ fortran/hello.F \ fortran/StarPU_fortran.h endif endif if STARPU_HAVE_FC fortran90_f90_example_SOURCES = \ fortran90/mod_types.f90 \ $(top_srcdir)/include/starpu_mod.f90 \ fortran90/mod_interface.f90 \ fortran90/mod_compute.f90 \ fortran90/marshalling.c \ fortran90/f90_example.f90 native_fortran_nf_vector_SOURCES = \ native_fortran/nf_codelets.f90 \ $(top_srcdir)/include/fstarpu_mod.f90 \ native_fortran/nf_vector.f90 native_fortran_nf_matrix_SOURCES = \ native_fortran/nf_codelets.f90 \ $(top_srcdir)/include/fstarpu_mod.f90 \ native_fortran/nf_matrix.f90 native_fortran_nf_example_SOURCES = \ native_fortran/nf_types.f90 \ native_fortran/nf_compute.f90 \ $(top_srcdir)/include/fstarpu_mod.f90 \ native_fortran/nf_example.f90 native_fortran_nf_dynbuf_SOURCES = \ native_fortran/nf_dynbuf_cl.f90 \ $(top_srcdir)/include/fstarpu_mod.f90 \ native_fortran/nf_dynbuf.f90 native_fortran_nf_varbuf_SOURCES = \ native_fortran/nf_varbuf_cl.f90 \ $(top_srcdir)/include/fstarpu_mod.f90 \ native_fortran/nf_varbuf.f90 native_fortran_nf_sched_ctx_SOURCES = \ native_fortran/nf_sched_ctx_cl.f90 \ $(top_srcdir)/include/fstarpu_mod.f90 \ native_fortran/nf_sched_ctx.f90 native_fortran_nf_partition_SOURCES = \ native_fortran/nf_partition_cl.f90 \ $(top_srcdir)/include/fstarpu_mod.f90 \ native_fortran/nf_partition.f90 endif ####################### # Multiformat example # ####################### basic_examples_multiformat_SOURCES = \ basic_examples/multiformat.c \ basic_examples/multiformat_conversion_codelets.c if STARPU_USE_CUDA basic_examples_multiformat_SOURCES += \ basic_examples/multiformat_cuda.cu \ basic_examples/multiformat_conversion_codelets_cuda.cu endif if STARPU_USE_OPENCL basic_examples_multiformat_SOURCES += \ basic_examples/multiformat_opencl.c \ basic_examples/multiformat_conversion_codelets_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ basic_examples/multiformat_opencl_kernel.cl \ basic_examples/multiformat_conversion_codelets_opencl_kernel.cl endif ################# # block example # ################# basic_examples_block_SOURCES = \ basic_examples/block.c \ basic_examples/block_cpu.c if STARPU_USE_CUDA basic_examples_block_SOURCES += \ basic_examples/block_cuda.cu endif if STARPU_USE_OPENCL basic_examples_block_SOURCES += \ basic_examples/block_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ basic_examples/block_opencl_kernel.cl endif #################### # Variable example # #################### basic_examples_variable_SOURCES = \ basic_examples/variable.c \ basic_examples/variable_kernels_cpu.c if STARPU_USE_CUDA basic_examples_variable_SOURCES += \ basic_examples/variable_kernels.cu endif if STARPU_USE_OPENCL basic_examples_variable_SOURCES += \ basic_examples/variable_kernels_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ basic_examples/variable_kernels_opencl_kernel.cl endif ########### # Filters # ########### filters_fblock_SOURCES = \ filters/fblock.c \ filters/fblock_cpu.c if STARPU_USE_CUDA filters_fblock_SOURCES += \ filters/fblock_cuda.cu endif if STARPU_USE_OPENCL filters_fblock_SOURCES += \ filters/fblock_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ filters/fblock_opencl_kernel.cl endif filters_fmultiple_manual_SOURCES = \ filters/fmultiple_manual.c if STARPU_USE_CUDA filters_fmultiple_manual_SOURCES += \ filters/fmultiple_cuda.cu endif filters_fmultiple_submit_SOURCES = \ filters/fmultiple_submit.c if STARPU_USE_CUDA filters_fmultiple_submit_SOURCES += \ filters/fmultiple_cuda.cu endif filters_fmultiple_submit_readonly_SOURCES = \ filters/fmultiple_submit_readonly.c if STARPU_USE_CUDA filters_fmultiple_submit_readonly_SOURCES += \ filters/fmultiple_cuda.cu endif examplebin_PROGRAMS += \ filters/shadow \ filters/shadow2d \ filters/shadow3d ############################# # Custom multiformat filter # ############################# #TODO: see why the application is failing #lt-custom_mf_filter: .../src/datawizard/malloc.c:784: starpu_free_on_node: Assertion `chunk != _starpu_chunk_list_end(chunks[dst_node])' failed. examplebin_PROGRAMS += \ filters/custom_mf/custom_mf_filter filters_custom_mf_custom_mf_filter_SOURCES=\ filters/custom_mf/custom_mf_filter.c \ filters/custom_mf/custom_interface.c \ filters/custom_mf/custom_conversion_codelets.c if STARPU_USE_CUDA filters_custom_mf_custom_mf_filter_SOURCES += \ filters/custom_mf/conversion.cu \ filters/custom_mf/cuda.cu endif if STARPU_USE_OPENCL filters_custom_mf_custom_mf_filter_SOURCES += \ filters/custom_mf/conversion_opencl.c \ filters/custom_mf/custom_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ filters/custom_mf/conversion_opencl.cl \ filters/custom_mf/custom_opencl.cl endif ################ # AXPY example # ################ if !NO_BLAS_LIB axpy_axpy_SOURCES = \ axpy/axpy.c \ common/blas.c if STARPU_USE_OPENCL axpy_axpy_SOURCES += \ axpy/axpy_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ axpy/axpy_opencl_kernel.cl endif axpy_axpy_LDADD = \ $(STARPU_BLAS_LDFLAGS) endif ################ # Mult example # ################ if !NO_BLAS_LIB mult_sgemm_SOURCES = \ mult/sgemm.c \ common/blas.c mult_sgemm_LDADD = \ $(STARPU_BLAS_LDFLAGS) mult_dgemm_SOURCES = \ mult/dgemm.c \ common/blas.c mult_dgemm_LDADD = \ $(STARPU_BLAS_LDFLAGS) endif #################### # Cholesky example # #################### if !NO_BLAS_LIB cholesky_cholesky_tag_SOURCES = \ cholesky/cholesky_tag.c \ cholesky/cholesky_models.c \ cholesky/cholesky_kernels.c \ common/blas.c cholesky_cholesky_tag_LDADD = \ $(STARPU_BLAS_LDFLAGS) cholesky_cholesky_tile_tag_SOURCES = \ cholesky/cholesky_tile_tag.c \ cholesky/cholesky_models.c \ cholesky/cholesky_kernels.c \ common/blas.c cholesky_cholesky_tile_tag_LDADD = \ $(STARPU_BLAS_LDFLAGS) cholesky_cholesky_grain_tag_SOURCES = \ cholesky/cholesky_grain_tag.c \ cholesky/cholesky_models.c \ cholesky/cholesky_kernels.c \ common/blas.c cholesky_cholesky_grain_tag_LDADD = \ $(STARPU_BLAS_LDFLAGS) cholesky_cholesky_implicit_SOURCES = \ cholesky/cholesky_implicit.c \ cholesky/cholesky_models.c \ cholesky/cholesky_kernels.c \ sched_ctx_utils/sched_ctx_utils.c \ common/blas.c cholesky_cholesky_implicit_LDADD = \ $(STARPU_BLAS_LDFLAGS) endif ############## # LU example # ############## if !NO_BLAS_LIB lu_lu_example_float_SOURCES = \ lu/lu_example_float.c \ lu/slu.c \ lu/slu_pivot.c \ lu/slu_kernels.c \ common/blas.c lu_lu_example_float_LDADD = \ $(STARPU_BLAS_LDFLAGS) lu_lu_example_double_SOURCES = \ lu/lu_example_double.c \ lu/dlu.c \ lu/dlu_pivot.c \ lu/dlu_kernels.c \ common/blas.c lu_lu_example_double_LDADD = \ $(STARPU_BLAS_LDFLAGS) lu_lu_implicit_example_float_SOURCES = \ lu/lu_example_float.c \ lu/slu_implicit.c \ lu/slu_implicit_pivot.c \ lu/slu_kernels.c \ common/blas.c lu_lu_implicit_example_float_LDADD = \ $(STARPU_BLAS_LDFLAGS) lu_lu_implicit_example_double_SOURCES = \ lu/lu_example_double.c \ lu/dlu_implicit.c \ lu/dlu_implicit_pivot.c \ lu/dlu_kernels.c \ common/blas.c lu_lu_implicit_example_double_LDADD = \ $(STARPU_BLAS_LDFLAGS) if MKL_BLAS_LIB lu_lu_example_complex_float_SOURCES = \ lu/lu_example_complex_float.c \ lu/clu.c \ lu/clu_pivot.c \ lu/clu_kernels.c \ lu/blas_complex.c \ common/blas.c lu_lu_example_complex_float_LDADD = \ $(STARPU_BLAS_LDFLAGS) lu_lu_implicit_example_complex_float_SOURCES = \ lu/lu_example_complex_float.c \ lu/clu_implicit.c \ lu/clu_implicit_pivot.c \ lu/clu_kernels.c \ lu/blas_complex.c \ common/blas.c lu_lu_implicit_example_complex_float_LDADD = \ $(STARPU_BLAS_LDFLAGS) lu_lu_example_complex_double_SOURCES = \ lu/lu_example_complex_double.c \ lu/zlu.c \ lu/zlu_pivot.c \ lu/zlu_kernels.c \ lu/blas_complex.c \ common/blas.c lu_lu_example_complex_double_LDADD = \ $(STARPU_BLAS_LDFLAGS) lu_lu_implicit_example_complex_double_SOURCES = \ lu/lu_example_complex_double.c \ lu/zlu_implicit.c \ lu/zlu_implicit_pivot.c \ lu/zlu_kernels.c \ lu/blas_complex.c \ common/blas.c lu_lu_implicit_example_complex_double_LDADD = \ $(STARPU_BLAS_LDFLAGS) endif endif ################ # Heat example # ################ if !NO_BLAS_LIB heat_heat_SOURCES = \ heat/heat.c \ heat/dw_factolu.c \ heat/dw_factolu_tag.c \ heat/dw_factolu_grain.c \ heat/dw_sparse_cg.c \ heat/heat_display.c \ heat/lu_kernels_model.c \ heat/dw_sparse_cg_kernels.c \ heat/dw_factolu_kernels.c \ common/blas.c heat_heat_LDADD = \ $(STARPU_OPENGL_RENDER_LDFLAGS) \ $(STARPU_BLAS_LDFLAGS) endif ############## # CG example # ############## if !NO_BLAS_LIB cg_cg_SOURCES = \ cg/cg.c \ cg/cg_kernels.c \ common/blas.c cg_cg_LDADD = \ $(STARPU_BLAS_LDFLAGS) endif ################ # SPMD example # ################ spmd_vector_scal_spmd_SOURCES = \ spmd/vector_scal_spmd.c ################ # SpMV example # ################ spmv_spmv_SOURCES = \ spmv/spmv.c \ spmv/spmv_kernels.c if STARPU_USE_CUDA spmv_spmv_SOURCES += \ spmv/spmv_cuda.cu endif if ATLAS_BLAS_LIB spmv_dw_block_spmv_SOURCES = \ spmv/dw_block_spmv.c \ spmv/dw_block_spmv_kernels.c \ spmv/matrix_market/mm_to_bcsr.c \ spmv/matrix_market/mmio.c spmv_dw_block_spmv_LDADD = \ $(STARPU_BLAS_LDFLAGS) endif ########################### # C++ Incrementer example # ########################### cpp_incrementer_cpp_SOURCES = \ cpp/incrementer_cpp.cpp if STARPU_USE_CUDA cpp_incrementer_cpp_SOURCES += \ incrementer/incrementer_kernels.cu endif if STARPU_USE_OPENCL cpp_incrementer_cpp_SOURCES += \ incrementer/incrementer_kernels_opencl.c endif ####################### # Incrementer example # ####################### incrementer_incrementer_SOURCES = \ incrementer/incrementer.c if STARPU_USE_CUDA incrementer_incrementer_SOURCES += \ incrementer/incrementer_kernels.cu endif if STARPU_USE_OPENCL incrementer_incrementer_SOURCES += \ incrementer/incrementer_kernels_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ incrementer/incrementer_kernels_opencl_kernel.cl endif ################## # Binary example # ################## binary_binary_SOURCES = \ binary/binary.c if STARPU_USE_OPENCL binary_binary_SOURCES += \ incrementer/incrementer_kernels_opencl.c endif ##################### # interface example # ##################### interface_complex_SOURCES = \ interface/complex.c \ interface/complex_interface.c if STARPU_USE_CUDA interface_complex_SOURCES += \ interface/complex_kernels.cu endif if STARPU_USE_OPENCL interface_complex_SOURCES +=\ interface/complex_kernels_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ interface/complex_kernels.cl endif ###################### # matVecMult example # ###################### if STARPU_USE_OPENCL nobase_STARPU_OPENCL_DATA_DATA += \ matvecmult/matvecmult_kernel.cl endif ####################### # dot_product example # ####################### reductions_dot_product_SOURCES = \ reductions/dot_product.c if STARPU_USE_CUDA reductions_dot_product_SOURCES += \ reductions/dot_product_kernels.cu endif if STARPU_USE_OPENCL nobase_STARPU_OPENCL_DATA_DATA += \ reductions/dot_product_opencl_kernels.cl endif ################## # Mandelbrot Set # ################## examplebin_PROGRAMS += \ mandelbrot/mandelbrot mandelbrot_mandelbrot_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) if HAVE_X11 mandelbrot_mandelbrot_CPPFLAGS += $(X_CFLAGS) mandelbrot_mandelbrot_LDADD = $(X_PRE_LIBS) $(X_LIBS) -lX11 $(X_EXTRA_LIBS) endif #################### # Image downscaler # #################### examplebin_PROGRAMS += \ ppm_downscaler/ppm_downscaler \ ppm_downscaler/yuv_downscaler ################ # Top Examples # ################ examplebin_PROGRAMS += \ top/hello_world_top top_hello_world_top_SOURCES = \ top/hello_world_top.c ###### # Pi # ###### if !STARPU_HAVE_WINDOWS examplebin_PROGRAMS += \ pi/pi \ pi/pi_redux pi_pi_SOURCES = \ pi/pi.c \ pi/SobolQRNG/sobol_gold.c \ pi/SobolQRNG/sobol_primitives.c if STARPU_USE_CUDA pi_pi_SOURCES += \ pi/pi_kernel.cu \ pi/SobolQRNG/sobol_gpu.cu endif pi_pi_redux_SOURCES = \ pi/pi_redux.c if STARPU_USE_CUDA pi_pi_redux_SOURCES += \ pi/pi_redux_kernel.cu pi_pi_redux_LDADD = \ $(STARPU_CURAND_LDFLAGS) endif endif ########################### # OpenGL interoperability # ########################### if HAVE_OPENGL examplebin_PROGRAMS += \ gl_interop/gl_interop \ gl_interop/gl_interop_idle gl_interop_gl_interop_SOURCES = \ gl_interop/gl_interop.c gl_interop_gl_interop_LDADD = \ $(STARPU_OPENGL_RENDER_LDFLAGS) gl_interop_gl_interop_idle_SOURCES = \ gl_interop/gl_interop_idle.c gl_interop_gl_interop_idle_LDADD = \ $(STARPU_OPENGL_RENDER_LDFLAGS) endif #################### # pipeline example # #################### if !NO_BLAS_LIB pipeline_pipeline_SOURCES = \ pipeline/pipeline.c \ common/blas.c pipeline_pipeline_LDADD = \ $(STARPU_BLAS_LDFLAGS) endif ################## # openmp example # ################## if STARPU_HAVE_OPENMP openmp_vector_scal_omp_CFLAGS = \ $(AM_CFLAGS) -fopenmp sched_ctx_parallel_code_CFLAGS = \ $(AM_CFLAGS) -fopenmp sched_ctx_sched_ctx_without_sched_policy_CFLAGS = \ $(AM_CFLAGS) -fopenmp sched_ctx_nested_sched_ctxs_CFLAGS = \ $(AM_CFLAGS) -fopenmp sched_ctx_parallel_tasks_reuse_handle_CFLAGS = \ $(AM_CFLAGS) -fopenmp endif if STARPU_HAVE_FC # Fortran90 example # - list explicit dependences to control proper module files generation # - the overriding rule fully disables the corresponing default rule, thus # the default rule body must be copied entirely mod_types.mod: mod_types.o mod_compute.mod: mod_compute.o mod_interface.mod: mod_interface.o starpu_mod.mod: starpu_mod.o starpu_mod.o: $(top_srcdir)/include/starpu_mod.f90 $(AM_V_FC)$(FC) $(fortran90_f90_example_FCFLAGS) $(FCFLAGS) -c -o $@ '$(top_srcdir)/'include/starpu_mod.f90 mod_compute.o: $(top_srcdir)/examples/fortran90/mod_compute.f90 mod_types.mod mod_interface.mod starpu_mod.mod $(AM_V_FC)$(FC) $(fortran90_f90_example_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'fortran90/mod_compute.f90' || echo '$(srcdir)/'`fortran90/mod_compute.f90 f90_example.o: $(top_srcdir)/examples/fortran90/f90_example.f90 $(top_srcdir)/examples/fortran90/marshalling.c mod_types.mod mod_interface.mod mod_compute.mod starpu_mod.mod $(AM_V_FC)$(FC) $(fortran90_f90_example_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'fortran90/f90_example.f90' || echo '$(srcdir)/'`fortran90/f90_example.f90 # Native Fortran example # - list explicit dependences to control proper module files generation # - the overriding rule fully disables the corresponing default rule, thus # the default rule body must be copied entirely nf_types.mod: nf_types.o nf_compute.mod: nf_compute.o fstarpu_mod.mod: fstarpu_mod.o nf_codelets.mod: nf_codelets.o nf_dynbuf_cl.mod: nf_dynbuf_cl.o nf_varbuf_cl.mod: nf_varbuf_cl.o nf_sched_ctx_cl.mod: nf_sched_ctx_cl.o nf_partition_cl.mod: nf_partition_cl.o fstarpu_mod.o: $(top_srcdir)/include/fstarpu_mod.f90 $(AM_V_FC)$(FC) $(native_fortran_nf_vector_FCFLAGS) $(FCFLAGS) -c -o $@ '$(top_srcdir)/'include/fstarpu_mod.f90 nf_codelets.o: $(top_srcdir)/examples/native_fortran/nf_codelets.f90 fstarpu_mod.mod $(AM_V_FC)$(FC) $(native_fortran_nf_vector_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_codelets.f90' || echo '$(srcdir)/'`native_fortran/nf_codelets.f90 nf_vector.o: $(top_srcdir)/examples/native_fortran/nf_vector.f90 nf_codelets.mod fstarpu_mod.mod $(AM_V_FC)$(FC) $(native_fortran_nf_vector_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_vector.f90' || echo '$(srcdir)/'`native_fortran/nf_vector.f90 nf_matrix.o: $(top_srcdir)/examples/native_fortran/nf_matrix.f90 nf_codelets.mod fstarpu_mod.mod $(AM_V_FC)$(FC) $(native_fortran_nf_matrix_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_matrix.f90' || echo '$(srcdir)/'`native_fortran/nf_matrix.f90 nf_compute.o: $(top_srcdir)/examples/native_fortran/nf_compute.f90 nf_types.mod fstarpu_mod.mod $(AM_V_FC)$(FC) $(native_fortran_nf_example_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_compute.f90' || echo '$(srcdir)/'`native_fortran/nf_compute.f90 nf_example.o: $(top_srcdir)/examples/native_fortran/nf_example.f90 nf_types.mod nf_compute.mod fstarpu_mod.mod $(AM_V_FC)$(FC) $(native_fortran_nf_example_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_example.f90' || echo '$(srcdir)/'`native_fortran/nf_example.f90 nf_dynbuf_cl.o: $(top_srcdir)/examples/native_fortran/nf_dynbuf_cl.f90 nf_types.mod fstarpu_mod.mod $(AM_V_FC)$(FC) $(native_fortran_nf_dynbuf_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_dynbuf_cl.f90' || echo '$(srcdir)/'`native_fortran/nf_dynbuf_cl.f90 nf_dynbuf.o: $(top_srcdir)/examples/native_fortran/nf_dynbuf.f90 nf_types.mod nf_dynbuf_cl.mod fstarpu_mod.mod $(AM_V_FC)$(FC) $(native_fortran_nf_dynbuf_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_dynbuf.f90' || echo '$(srcdir)/'`native_fortran/nf_dynbuf.f90 nf_varbuf_cl.o: $(top_srcdir)/examples/native_fortran/nf_varbuf_cl.f90 nf_types.mod fstarpu_mod.mod $(AM_V_FC)$(FC) $(native_fortran_nf_varbuf_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_varbuf_cl.f90' || echo '$(srcdir)/'`native_fortran/nf_varbuf_cl.f90 nf_varbuf.o: $(top_srcdir)/examples/native_fortran/nf_varbuf.f90 nf_types.mod nf_varbuf_cl.mod fstarpu_mod.mod $(AM_V_FC)$(FC) $(native_fortran_nf_varbuf_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_varbuf.f90' || echo '$(srcdir)/'`native_fortran/nf_varbuf.f90 nf_sched_ctx_cl.o: $(top_srcdir)/examples/native_fortran/nf_sched_ctx_cl.f90 nf_types.mod fstarpu_mod.mod $(AM_V_FC)$(FC) $(native_fortran_nf_sched_ctx_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_sched_ctx_cl.f90' || echo '$(srcdir)/'`native_fortran/nf_sched_ctx_cl.f90 nf_sched_ctx.o: $(top_srcdir)/examples/native_fortran/nf_sched_ctx.f90 nf_types.mod nf_sched_ctx_cl.mod fstarpu_mod.mod $(AM_V_FC)$(FC) $(native_fortran_nf_sched_ctx_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_sched_ctx.f90' || echo '$(srcdir)/'`native_fortran/nf_sched_ctx.f90 nf_partition_cl.o: $(top_srcdir)/examples/native_fortran/nf_partition_cl.f90 nf_types.mod fstarpu_mod.mod $(AM_V_FC)$(FC) $(native_fortran_nf_partition_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_partition_cl.f90' || echo '$(srcdir)/'`native_fortran/nf_partition_cl.f90 nf_partition.o: $(top_srcdir)/examples/native_fortran/nf_partition.f90 nf_types.mod nf_partition_cl.mod fstarpu_mod.mod $(AM_V_FC)$(FC) $(native_fortran_nf_partition_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_partition.f90' || echo '$(srcdir)/'`native_fortran/nf_partition.f90 endif starpu-1.2.3+dfsg/examples/Makefile.in000066400000000000000000016471531320135501600176520ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2017 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2017 CNRS # Copyright (C) 2011 Télécom-SudParis # Copyright (C) 2011-2012 INRIA # Copyright (C) 2015-2016 Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @STARPU_USE_CUDA_TRUE@am__append_1 = --compiler-options -fno-strict-aliasing -I$(top_srcdir)/include/ -I$(top_builddir)/include/ -I$(top_srcdir)/examples/ $(HWLOC_CFLAGS) examplebin_PROGRAMS = $(am__EXEEXT_15) filters/shadow$(EXEEXT) \ filters/shadow2d$(EXEEXT) filters/shadow3d$(EXEEXT) \ filters/custom_mf/custom_mf_filter$(EXEEXT) \ mandelbrot/mandelbrot$(EXEEXT) \ ppm_downscaler/ppm_downscaler$(EXEEXT) \ ppm_downscaler/yuv_downscaler$(EXEEXT) \ top/hello_world_top$(EXEEXT) $(am__EXEEXT_16) $(am__EXEEXT_17) TESTS = $(am__EXEEXT_15) $(am__append_2) $(am__append_12) @STARPU_NEW_CHECK_TRUE@am__append_2 = scheduler/schedulers.sh \ @STARPU_NEW_CHECK_TRUE@ scheduler/schedulers_context.sh @STARPU_HAVE_WINDOWS_FALSE@check_PROGRAMS = $(am__EXEEXT_1) \ @STARPU_HAVE_WINDOWS_FALSE@ $(am__EXEEXT_15) @STARPU_HAVE_WINDOWS_TRUE@check_PROGRAMS = $(am__EXEEXT_15) @STARPU_SIMGRID_FALSE@am__append_3 = \ @STARPU_SIMGRID_FALSE@ basic_examples/hello_world \ @STARPU_SIMGRID_FALSE@ basic_examples/vector_scal \ @STARPU_SIMGRID_FALSE@ basic_examples/mult \ @STARPU_SIMGRID_FALSE@ basic_examples/block \ @STARPU_SIMGRID_FALSE@ basic_examples/variable \ @STARPU_SIMGRID_FALSE@ basic_examples/multiformat \ @STARPU_SIMGRID_FALSE@ basic_examples/dynamic_handles \ @STARPU_SIMGRID_FALSE@ cpp/incrementer_cpp \ @STARPU_SIMGRID_FALSE@ filters/fvector \ @STARPU_SIMGRID_FALSE@ filters/fblock \ @STARPU_SIMGRID_FALSE@ filters/fmatrix \ @STARPU_SIMGRID_FALSE@ filters/fmultiple_manual \ @STARPU_SIMGRID_FALSE@ filters/fmultiple_submit \ @STARPU_SIMGRID_FALSE@ filters/fmultiple_submit_readonly \ @STARPU_SIMGRID_FALSE@ tag_example/tag_example \ @STARPU_SIMGRID_FALSE@ tag_example/tag_example2 \ @STARPU_SIMGRID_FALSE@ tag_example/tag_example3 \ @STARPU_SIMGRID_FALSE@ tag_example/tag_example4 \ @STARPU_SIMGRID_FALSE@ tag_example/tag_restartable \ @STARPU_SIMGRID_FALSE@ spmd/vector_scal_spmd \ @STARPU_SIMGRID_FALSE@ spmv/spmv \ @STARPU_SIMGRID_FALSE@ callback/callback \ @STARPU_SIMGRID_FALSE@ callback/prologue \ @STARPU_SIMGRID_FALSE@ incrementer/incrementer \ @STARPU_SIMGRID_FALSE@ binary/binary \ @STARPU_SIMGRID_FALSE@ interface/complex \ @STARPU_SIMGRID_FALSE@ matvecmult/matvecmult \ @STARPU_SIMGRID_FALSE@ profiling/profiling \ @STARPU_SIMGRID_FALSE@ scheduler/dummy_sched \ @STARPU_SIMGRID_FALSE@ sched_ctx/dummy_sched_with_ctx \ @STARPU_SIMGRID_FALSE@ worker_collections/worker_tree_example \ @STARPU_SIMGRID_FALSE@ reductions/dot_product \ @STARPU_SIMGRID_FALSE@ reductions/minmax_reduction @STARPU_NEW_CHECK_TRUE@@STARPU_SIMGRID_FALSE@am__append_4 = \ @STARPU_NEW_CHECK_TRUE@@STARPU_SIMGRID_FALSE@ sched_ctx/sched_ctx \ @STARPU_NEW_CHECK_TRUE@@STARPU_SIMGRID_FALSE@ sched_ctx/two_cpu_contexts @STARPU_SIMGRID_FALSE@am__append_5 = \ @STARPU_SIMGRID_FALSE@ scheduler/dummy_sched @STARPU_HAVE_F77_H_TRUE@@STARPU_HAVE_F77_TRUE@@STARPU_SIMGRID_FALSE@am__append_6 = \ @STARPU_HAVE_F77_H_TRUE@@STARPU_HAVE_F77_TRUE@@STARPU_SIMGRID_FALSE@ fortran/hello @STARPU_HAVE_F77_TRUE@@STARPU_SIMGRID_FALSE@am__append_7 = \ @STARPU_HAVE_F77_TRUE@@STARPU_SIMGRID_FALSE@ basic_examples/vector_scal_fortran @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@am__append_8 = \ @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@ fortran90/f90_example \ @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@ native_fortran/nf_vector \ @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@ native_fortran/nf_matrix \ @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@ native_fortran/nf_example \ @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@ native_fortran/nf_dynbuf \ @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@ native_fortran/nf_varbuf \ @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@ native_fortran/nf_sched_ctx \ @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@ native_fortran/nf_partition @STARPU_HAVE_FC_TRUE@@STARPU_NEW_CHECK_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@am__append_9 = \ @STARPU_HAVE_FC_TRUE@@STARPU_NEW_CHECK_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@ native_fortran/nf_sched_ctx @NO_BLAS_LIB_FALSE@am__append_10 = \ @NO_BLAS_LIB_FALSE@ mult/sgemm \ @NO_BLAS_LIB_FALSE@ mult/dgemm \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_tag \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_tile_tag \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_implicit @NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@am__append_11 = \ @NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ axpy/axpy \ @NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ cholesky/cholesky_grain_tag \ @NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ lu/lu_example_float \ @NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ lu/lu_example_double \ @NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ lu/lu_implicit_example_float \ @NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ lu/lu_implicit_example_double \ @NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ heat/heat \ @NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ cg/cg \ @NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ pipeline/pipeline @NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@am__append_12 = \ @NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ heat/heat.sh \ @NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ lu/lu.sh @MKL_BLAS_LIB_TRUE@@STARPU_SIMGRID_FALSE@am__append_13 = \ @MKL_BLAS_LIB_TRUE@@STARPU_SIMGRID_FALSE@ lu/lu_example_complex_float \ @MKL_BLAS_LIB_TRUE@@STARPU_SIMGRID_FALSE@ lu/lu_example_complex_double \ @MKL_BLAS_LIB_TRUE@@STARPU_SIMGRID_FALSE@ lu/lu_implicit_example_complex_float \ @MKL_BLAS_LIB_TRUE@@STARPU_SIMGRID_FALSE@ lu/lu_implicit_example_complex_double @ATLAS_BLAS_LIB_TRUE@@STARPU_SIMGRID_FALSE@am__append_14 = \ @ATLAS_BLAS_LIB_TRUE@@STARPU_SIMGRID_FALSE@ spmv/dw_block_spmv @STARPU_HAVE_F77_H_TRUE@@STARPU_HAVE_F77_TRUE@@STARPU_SIMGRID_FALSE@am__append_15 = \ @STARPU_HAVE_F77_H_TRUE@@STARPU_HAVE_F77_TRUE@@STARPU_SIMGRID_FALSE@ fortran/hello @STARPU_HAVE_F77_TRUE@@STARPU_SIMGRID_FALSE@am__append_16 = \ @STARPU_HAVE_F77_TRUE@@STARPU_SIMGRID_FALSE@ basic_examples/vector_scal_fortran @STARPU_HAVE_OPENMP_TRUE@@STARPU_SIMGRID_FALSE@am__append_17 = \ @STARPU_HAVE_OPENMP_TRUE@@STARPU_SIMGRID_FALSE@ openmp/vector_scal_omp \ @STARPU_HAVE_OPENMP_TRUE@@STARPU_SIMGRID_FALSE@ sched_ctx/sched_ctx_without_sched_policy\ @STARPU_HAVE_OPENMP_TRUE@@STARPU_SIMGRID_FALSE@ sched_ctx/nested_sched_ctxs \ @STARPU_HAVE_OPENMP_TRUE@@STARPU_SIMGRID_FALSE@ sched_ctx/sched_ctx_without_sched_policy\ @STARPU_HAVE_OPENMP_TRUE@@STARPU_SIMGRID_FALSE@ sched_ctx/sched_ctx_without_sched_policy_awake\ @STARPU_HAVE_OPENMP_TRUE@@STARPU_SIMGRID_FALSE@ sched_ctx/parallel_tasks_reuse_handle @STARPU_HAVE_OPENMP_TRUE@@STARPU_NEW_CHECK_TRUE@@STARPU_SIMGRID_FALSE@am__append_18 = \ @STARPU_HAVE_OPENMP_TRUE@@STARPU_NEW_CHECK_TRUE@@STARPU_SIMGRID_FALSE@ sched_ctx/parallel_code @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_ICC_TRUE@am__append_19 = \ @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_ICC_TRUE@ basic_examples/vector_scal_cpu_icc.icc @STARPU_USE_CUDA_TRUE@am__append_20 = \ @STARPU_USE_CUDA_TRUE@ basic_examples/vector_scal_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_21 = \ @STARPU_USE_OPENCL_TRUE@ basic_examples/vector_scal_opencl.c @STARPU_HAVE_F77_TRUE@@STARPU_USE_CUDA_TRUE@am__append_22 = \ @STARPU_HAVE_F77_TRUE@@STARPU_USE_CUDA_TRUE@ basic_examples/vector_scal_cuda.cu @STARPU_USE_CUDA_TRUE@am__append_23 = \ @STARPU_USE_CUDA_TRUE@ basic_examples/multiformat_cuda.cu \ @STARPU_USE_CUDA_TRUE@ basic_examples/multiformat_conversion_codelets_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_24 = \ @STARPU_USE_OPENCL_TRUE@ basic_examples/multiformat_opencl.c \ @STARPU_USE_OPENCL_TRUE@ basic_examples/multiformat_conversion_codelets_opencl.c @STARPU_USE_CUDA_TRUE@am__append_25 = \ @STARPU_USE_CUDA_TRUE@ basic_examples/block_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_26 = \ @STARPU_USE_OPENCL_TRUE@ basic_examples/block_opencl.c @STARPU_USE_CUDA_TRUE@am__append_27 = \ @STARPU_USE_CUDA_TRUE@ basic_examples/variable_kernels.cu @STARPU_USE_OPENCL_TRUE@am__append_28 = \ @STARPU_USE_OPENCL_TRUE@ basic_examples/variable_kernels_opencl.c @STARPU_USE_CUDA_TRUE@am__append_29 = \ @STARPU_USE_CUDA_TRUE@ filters/fblock_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_30 = \ @STARPU_USE_OPENCL_TRUE@ filters/fblock_opencl.c @STARPU_USE_CUDA_TRUE@am__append_31 = \ @STARPU_USE_CUDA_TRUE@ filters/fmultiple_cuda.cu @STARPU_USE_CUDA_TRUE@am__append_32 = \ @STARPU_USE_CUDA_TRUE@ filters/fmultiple_cuda.cu @STARPU_USE_CUDA_TRUE@am__append_33 = \ @STARPU_USE_CUDA_TRUE@ filters/fmultiple_cuda.cu @STARPU_USE_CUDA_TRUE@am__append_34 = \ @STARPU_USE_CUDA_TRUE@ filters/custom_mf/conversion.cu \ @STARPU_USE_CUDA_TRUE@ filters/custom_mf/cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_35 = \ @STARPU_USE_OPENCL_TRUE@ filters/custom_mf/conversion_opencl.c \ @STARPU_USE_OPENCL_TRUE@ filters/custom_mf/custom_opencl.c @NO_BLAS_LIB_FALSE@@STARPU_USE_OPENCL_TRUE@am__append_36 = \ @NO_BLAS_LIB_FALSE@@STARPU_USE_OPENCL_TRUE@ axpy/axpy_opencl.c @NO_BLAS_LIB_FALSE@@STARPU_USE_OPENCL_TRUE@am__append_37 = \ @NO_BLAS_LIB_FALSE@@STARPU_USE_OPENCL_TRUE@ axpy/axpy_opencl_kernel.cl @STARPU_USE_CUDA_TRUE@am__append_38 = \ @STARPU_USE_CUDA_TRUE@ spmv/spmv_cuda.cu @STARPU_USE_CUDA_TRUE@am__append_39 = \ @STARPU_USE_CUDA_TRUE@ incrementer/incrementer_kernels.cu @STARPU_USE_OPENCL_TRUE@am__append_40 = \ @STARPU_USE_OPENCL_TRUE@ incrementer/incrementer_kernels_opencl.c @STARPU_USE_CUDA_TRUE@am__append_41 = \ @STARPU_USE_CUDA_TRUE@ incrementer/incrementer_kernels.cu @STARPU_USE_OPENCL_TRUE@am__append_42 = \ @STARPU_USE_OPENCL_TRUE@ incrementer/incrementer_kernels_opencl.c @STARPU_USE_OPENCL_TRUE@am__append_43 = \ @STARPU_USE_OPENCL_TRUE@ incrementer/incrementer_kernels_opencl.c @STARPU_USE_CUDA_TRUE@am__append_44 = \ @STARPU_USE_CUDA_TRUE@ interface/complex_kernels.cu @STARPU_USE_OPENCL_TRUE@am__append_45 = \ @STARPU_USE_OPENCL_TRUE@ interface/complex_kernels_opencl.c @STARPU_USE_CUDA_TRUE@am__append_46 = \ @STARPU_USE_CUDA_TRUE@ reductions/dot_product_kernels.cu @HAVE_X11_TRUE@am__append_47 = $(X_CFLAGS) ###### # Pi # ###### @STARPU_HAVE_WINDOWS_FALSE@am__append_48 = \ @STARPU_HAVE_WINDOWS_FALSE@ pi/pi \ @STARPU_HAVE_WINDOWS_FALSE@ pi/pi_redux @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CUDA_TRUE@am__append_49 = \ @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CUDA_TRUE@ pi/pi_kernel.cu \ @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CUDA_TRUE@ pi/SobolQRNG/sobol_gpu.cu @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CUDA_TRUE@am__append_50 = \ @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CUDA_TRUE@ pi/pi_redux_kernel.cu ########################### # OpenGL interoperability # ########################### @HAVE_OPENGL_TRUE@am__append_51 = \ @HAVE_OPENGL_TRUE@ gl_interop/gl_interop \ @HAVE_OPENGL_TRUE@ gl_interop/gl_interop_idle subdir = examples ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = loader-cross.sh CONFIG_CLEAN_VPATH_FILES = @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@am__EXEEXT_1 = loader$(EXEEXT) @STARPU_SIMGRID_FALSE@am__EXEEXT_2 = \ @STARPU_SIMGRID_FALSE@ basic_examples/hello_world$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ basic_examples/vector_scal$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ basic_examples/mult$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ basic_examples/block$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ basic_examples/variable$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ basic_examples/multiformat$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ basic_examples/dynamic_handles$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ cpp/incrementer_cpp$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ filters/fvector$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ filters/fblock$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ filters/fmatrix$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ filters/fmultiple_manual$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ filters/fmultiple_submit$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ filters/fmultiple_submit_readonly$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ tag_example/tag_example$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ tag_example/tag_example2$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ tag_example/tag_example3$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ tag_example/tag_example4$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ tag_example/tag_restartable$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ spmd/vector_scal_spmd$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ spmv/spmv$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ callback/callback$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ callback/prologue$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ incrementer/incrementer$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ binary/binary$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ interface/complex$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ matvecmult/matvecmult$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ profiling/profiling$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ scheduler/dummy_sched$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ sched_ctx/dummy_sched_with_ctx$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ worker_collections/worker_tree_example$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ reductions/dot_product$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ reductions/minmax_reduction$(EXEEXT) @STARPU_NEW_CHECK_TRUE@@STARPU_SIMGRID_FALSE@am__EXEEXT_3 = sched_ctx/sched_ctx$(EXEEXT) \ @STARPU_NEW_CHECK_TRUE@@STARPU_SIMGRID_FALSE@ sched_ctx/two_cpu_contexts$(EXEEXT) @STARPU_SIMGRID_FALSE@am__EXEEXT_4 = scheduler/dummy_sched$(EXEEXT) @STARPU_HAVE_F77_H_TRUE@@STARPU_HAVE_F77_TRUE@@STARPU_SIMGRID_FALSE@am__EXEEXT_5 = fortran/hello$(EXEEXT) @STARPU_HAVE_F77_TRUE@@STARPU_SIMGRID_FALSE@am__EXEEXT_6 = basic_examples/vector_scal_fortran$(EXEEXT) @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@am__EXEEXT_7 = fortran90/f90_example$(EXEEXT) \ @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@ native_fortran/nf_vector$(EXEEXT) \ @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@ native_fortran/nf_matrix$(EXEEXT) \ @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@ native_fortran/nf_example$(EXEEXT) \ @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@ native_fortran/nf_dynbuf$(EXEEXT) \ @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@ native_fortran/nf_varbuf$(EXEEXT) \ @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@ native_fortran/nf_sched_ctx$(EXEEXT) \ @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@ native_fortran/nf_partition$(EXEEXT) @STARPU_HAVE_FC_TRUE@@STARPU_NEW_CHECK_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@am__EXEEXT_8 = native_fortran/nf_sched_ctx$(EXEEXT) @NO_BLAS_LIB_FALSE@am__EXEEXT_9 = mult/sgemm$(EXEEXT) \ @NO_BLAS_LIB_FALSE@ mult/dgemm$(EXEEXT) \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_tag$(EXEEXT) \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_tile_tag$(EXEEXT) \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_implicit$(EXEEXT) @NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@am__EXEEXT_10 = \ @NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ axpy/axpy$(EXEEXT) \ @NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ cholesky/cholesky_grain_tag$(EXEEXT) \ @NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ lu/lu_example_float$(EXEEXT) \ @NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ lu/lu_example_double$(EXEEXT) \ @NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ lu/lu_implicit_example_float$(EXEEXT) \ @NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ lu/lu_implicit_example_double$(EXEEXT) \ @NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ heat/heat$(EXEEXT) \ @NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ cg/cg$(EXEEXT) \ @NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ pipeline/pipeline$(EXEEXT) @MKL_BLAS_LIB_TRUE@@STARPU_SIMGRID_FALSE@am__EXEEXT_11 = lu/lu_example_complex_float$(EXEEXT) \ @MKL_BLAS_LIB_TRUE@@STARPU_SIMGRID_FALSE@ lu/lu_example_complex_double$(EXEEXT) \ @MKL_BLAS_LIB_TRUE@@STARPU_SIMGRID_FALSE@ lu/lu_implicit_example_complex_float$(EXEEXT) \ @MKL_BLAS_LIB_TRUE@@STARPU_SIMGRID_FALSE@ lu/lu_implicit_example_complex_double$(EXEEXT) @ATLAS_BLAS_LIB_TRUE@@STARPU_SIMGRID_FALSE@am__EXEEXT_12 = spmv/dw_block_spmv$(EXEEXT) @STARPU_HAVE_OPENMP_TRUE@@STARPU_SIMGRID_FALSE@am__EXEEXT_13 = openmp/vector_scal_omp$(EXEEXT) \ @STARPU_HAVE_OPENMP_TRUE@@STARPU_SIMGRID_FALSE@ sched_ctx/sched_ctx_without_sched_policy$(EXEEXT) \ @STARPU_HAVE_OPENMP_TRUE@@STARPU_SIMGRID_FALSE@ sched_ctx/nested_sched_ctxs$(EXEEXT) \ @STARPU_HAVE_OPENMP_TRUE@@STARPU_SIMGRID_FALSE@ sched_ctx/sched_ctx_without_sched_policy$(EXEEXT) \ @STARPU_HAVE_OPENMP_TRUE@@STARPU_SIMGRID_FALSE@ sched_ctx/sched_ctx_without_sched_policy_awake$(EXEEXT) \ @STARPU_HAVE_OPENMP_TRUE@@STARPU_SIMGRID_FALSE@ sched_ctx/parallel_tasks_reuse_handle$(EXEEXT) @STARPU_HAVE_OPENMP_TRUE@@STARPU_NEW_CHECK_TRUE@@STARPU_SIMGRID_FALSE@am__EXEEXT_14 = sched_ctx/parallel_code$(EXEEXT) am__EXEEXT_15 = sched_ctx/prio$(EXEEXT) \ worker_collections/worker_list_example$(EXEEXT) \ $(am__EXEEXT_2) $(am__EXEEXT_3) $(am__EXEEXT_4) \ $(am__EXEEXT_5) $(am__EXEEXT_6) $(am__EXEEXT_7) \ $(am__EXEEXT_8) $(am__EXEEXT_9) $(am__EXEEXT_10) \ $(am__EXEEXT_11) $(am__EXEEXT_12) $(am__EXEEXT_5) \ $(am__EXEEXT_6) $(am__EXEEXT_13) $(am__EXEEXT_14) @STARPU_HAVE_WINDOWS_FALSE@am__EXEEXT_16 = pi/pi$(EXEEXT) \ @STARPU_HAVE_WINDOWS_FALSE@ pi/pi_redux$(EXEEXT) @HAVE_OPENGL_TRUE@am__EXEEXT_17 = gl_interop/gl_interop$(EXEEXT) \ @HAVE_OPENGL_TRUE@ gl_interop/gl_interop_idle$(EXEEXT) am__installdirs = "$(DESTDIR)$(examplebindir)" \ "$(DESTDIR)$(STARPU_OPENCL_DATAdir)" PROGRAMS = $(examplebin_PROGRAMS) am__axpy_axpy_SOURCES_DIST = axpy/axpy.c common/blas.c \ axpy/axpy_opencl.c @NO_BLAS_LIB_FALSE@@STARPU_USE_OPENCL_TRUE@am__objects_1 = axpy_opencl.$(OBJEXT) @NO_BLAS_LIB_FALSE@am_axpy_axpy_OBJECTS = axpy.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) $(am__objects_1) axpy_axpy_OBJECTS = $(am_axpy_axpy_OBJECTS) am__DEPENDENCIES_1 = @NO_BLAS_LIB_FALSE@axpy_axpy_DEPENDENCIES = $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am__dirstamp = $(am__leading_dot)dirstamp am__basic_examples_block_SOURCES_DIST = basic_examples/block.c \ basic_examples/block_cpu.c basic_examples/block_cuda.cu \ basic_examples/block_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_2 = \ @STARPU_USE_CUDA_TRUE@ basic_examples/block_cuda.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_3 = block_opencl.$(OBJEXT) am_basic_examples_block_OBJECTS = block.$(OBJEXT) block_cpu.$(OBJEXT) \ $(am__objects_2) $(am__objects_3) basic_examples_block_OBJECTS = $(am_basic_examples_block_OBJECTS) basic_examples_block_LDADD = $(LDADD) basic_examples_dynamic_handles_SOURCES = \ basic_examples/dynamic_handles.c basic_examples_dynamic_handles_OBJECTS = dynamic_handles.$(OBJEXT) basic_examples_dynamic_handles_LDADD = $(LDADD) basic_examples_hello_world_SOURCES = basic_examples/hello_world.c basic_examples_hello_world_OBJECTS = hello_world.$(OBJEXT) basic_examples_hello_world_LDADD = $(LDADD) basic_examples_mult_SOURCES = basic_examples/mult.c basic_examples_mult_OBJECTS = mult.$(OBJEXT) basic_examples_mult_LDADD = $(LDADD) am__basic_examples_multiformat_SOURCES_DIST = \ basic_examples/multiformat.c \ basic_examples/multiformat_conversion_codelets.c \ basic_examples/multiformat_cuda.cu \ basic_examples/multiformat_conversion_codelets_cuda.cu \ basic_examples/multiformat_opencl.c \ basic_examples/multiformat_conversion_codelets_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_4 = basic_examples/multiformat_cuda.$(OBJEXT) \ @STARPU_USE_CUDA_TRUE@ basic_examples/multiformat_conversion_codelets_cuda.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_5 = multiformat_opencl.$(OBJEXT) \ @STARPU_USE_OPENCL_TRUE@ multiformat_conversion_codelets_opencl.$(OBJEXT) am_basic_examples_multiformat_OBJECTS = multiformat.$(OBJEXT) \ multiformat_conversion_codelets.$(OBJEXT) $(am__objects_4) \ $(am__objects_5) basic_examples_multiformat_OBJECTS = \ $(am_basic_examples_multiformat_OBJECTS) basic_examples_multiformat_LDADD = $(LDADD) am__basic_examples_variable_SOURCES_DIST = basic_examples/variable.c \ basic_examples/variable_kernels_cpu.c \ basic_examples/variable_kernels.cu \ basic_examples/variable_kernels_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_6 = basic_examples/variable_kernels.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_7 = \ @STARPU_USE_OPENCL_TRUE@ variable_kernels_opencl.$(OBJEXT) am_basic_examples_variable_OBJECTS = variable.$(OBJEXT) \ variable_kernels_cpu.$(OBJEXT) $(am__objects_6) \ $(am__objects_7) basic_examples_variable_OBJECTS = \ $(am_basic_examples_variable_OBJECTS) basic_examples_variable_LDADD = $(LDADD) am__basic_examples_vector_scal_SOURCES_DIST = \ basic_examples/vector_scal.c basic_examples/vector_scal_cpu.c \ basic_examples/vector_scal_cpu_icc.icc \ basic_examples/vector_scal_cuda.cu \ basic_examples/vector_scal_opencl.c @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_ICC_TRUE@am__objects_8 = basic_examples/vector_scal_cpu_icc.$(OBJEXT) @STARPU_USE_CUDA_TRUE@am__objects_9 = basic_examples/vector_scal_cuda.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_10 = vector_scal_opencl.$(OBJEXT) am_basic_examples_vector_scal_OBJECTS = vector_scal.$(OBJEXT) \ vector_scal_cpu.$(OBJEXT) $(am__objects_8) $(am__objects_9) \ $(am__objects_10) basic_examples_vector_scal_OBJECTS = \ $(am_basic_examples_vector_scal_OBJECTS) basic_examples_vector_scal_LDADD = $(LDADD) am__basic_examples_vector_scal_fortran_SOURCES_DIST = \ basic_examples/vector_scal_fortran.F \ basic_examples/vector_scal_c.c \ basic_examples/vector_scal_cpu.c \ basic_examples/vector_scal_cuda.cu @STARPU_HAVE_F77_TRUE@@STARPU_USE_CUDA_TRUE@am__objects_11 = basic_examples/vector_scal_cuda.$(OBJEXT) @STARPU_HAVE_F77_TRUE@am_basic_examples_vector_scal_fortran_OBJECTS = \ @STARPU_HAVE_F77_TRUE@ vector_scal_fortran.$(OBJEXT) \ @STARPU_HAVE_F77_TRUE@ vector_scal_c.$(OBJEXT) \ @STARPU_HAVE_F77_TRUE@ vector_scal_cpu.$(OBJEXT) \ @STARPU_HAVE_F77_TRUE@ $(am__objects_11) basic_examples_vector_scal_fortran_OBJECTS = \ $(am_basic_examples_vector_scal_fortran_OBJECTS) @STARPU_HAVE_F77_TRUE@@STARPU_USE_CUDA_TRUE@basic_examples_vector_scal_fortran_DEPENDENCIES = $(am__DEPENDENCIES_1) am__binary_binary_SOURCES_DIST = binary/binary.c \ incrementer/incrementer_kernels_opencl.c @STARPU_USE_OPENCL_TRUE@am__objects_12 = \ @STARPU_USE_OPENCL_TRUE@ incrementer_kernels_opencl.$(OBJEXT) am_binary_binary_OBJECTS = binary.$(OBJEXT) $(am__objects_12) binary_binary_OBJECTS = $(am_binary_binary_OBJECTS) binary_binary_LDADD = $(LDADD) callback_callback_SOURCES = callback/callback.c callback_callback_OBJECTS = callback.$(OBJEXT) callback_callback_LDADD = $(LDADD) callback_prologue_SOURCES = callback/prologue.c callback_prologue_OBJECTS = prologue.$(OBJEXT) callback_prologue_LDADD = $(LDADD) am__cg_cg_SOURCES_DIST = cg/cg.c cg/cg_kernels.c common/blas.c @NO_BLAS_LIB_FALSE@am_cg_cg_OBJECTS = cg.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ cg_kernels.$(OBJEXT) blas.$(OBJEXT) cg_cg_OBJECTS = $(am_cg_cg_OBJECTS) @NO_BLAS_LIB_FALSE@cg_cg_DEPENDENCIES = $(am__DEPENDENCIES_1) am__cholesky_cholesky_grain_tag_SOURCES_DIST = \ cholesky/cholesky_grain_tag.c cholesky/cholesky_models.c \ cholesky/cholesky_kernels.c common/blas.c @NO_BLAS_LIB_FALSE@am_cholesky_cholesky_grain_tag_OBJECTS = \ @NO_BLAS_LIB_FALSE@ cholesky_grain_tag.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ cholesky_models.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ cholesky_kernels.$(OBJEXT) blas.$(OBJEXT) cholesky_cholesky_grain_tag_OBJECTS = \ $(am_cholesky_cholesky_grain_tag_OBJECTS) @NO_BLAS_LIB_FALSE@cholesky_cholesky_grain_tag_DEPENDENCIES = \ @NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) am__cholesky_cholesky_implicit_SOURCES_DIST = \ cholesky/cholesky_implicit.c cholesky/cholesky_models.c \ cholesky/cholesky_kernels.c sched_ctx_utils/sched_ctx_utils.c \ common/blas.c @NO_BLAS_LIB_FALSE@am_cholesky_cholesky_implicit_OBJECTS = \ @NO_BLAS_LIB_FALSE@ cholesky_implicit.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ cholesky_models.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ cholesky_kernels.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ sched_ctx_utils.$(OBJEXT) blas.$(OBJEXT) cholesky_cholesky_implicit_OBJECTS = \ $(am_cholesky_cholesky_implicit_OBJECTS) @NO_BLAS_LIB_FALSE@cholesky_cholesky_implicit_DEPENDENCIES = \ @NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) am__cholesky_cholesky_tag_SOURCES_DIST = cholesky/cholesky_tag.c \ cholesky/cholesky_models.c cholesky/cholesky_kernels.c \ common/blas.c @NO_BLAS_LIB_FALSE@am_cholesky_cholesky_tag_OBJECTS = \ @NO_BLAS_LIB_FALSE@ cholesky_tag.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ cholesky_models.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ cholesky_kernels.$(OBJEXT) blas.$(OBJEXT) cholesky_cholesky_tag_OBJECTS = $(am_cholesky_cholesky_tag_OBJECTS) @NO_BLAS_LIB_FALSE@cholesky_cholesky_tag_DEPENDENCIES = \ @NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) am__cholesky_cholesky_tile_tag_SOURCES_DIST = \ cholesky/cholesky_tile_tag.c cholesky/cholesky_models.c \ cholesky/cholesky_kernels.c common/blas.c @NO_BLAS_LIB_FALSE@am_cholesky_cholesky_tile_tag_OBJECTS = \ @NO_BLAS_LIB_FALSE@ cholesky_tile_tag.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ cholesky_models.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ cholesky_kernels.$(OBJEXT) blas.$(OBJEXT) cholesky_cholesky_tile_tag_OBJECTS = \ $(am_cholesky_cholesky_tile_tag_OBJECTS) @NO_BLAS_LIB_FALSE@cholesky_cholesky_tile_tag_DEPENDENCIES = \ @NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) am__cpp_incrementer_cpp_SOURCES_DIST = cpp/incrementer_cpp.cpp \ incrementer/incrementer_kernels.cu \ incrementer/incrementer_kernels_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_13 = incrementer/incrementer_kernels.$(OBJEXT) am_cpp_incrementer_cpp_OBJECTS = incrementer_cpp.$(OBJEXT) \ $(am__objects_13) $(am__objects_12) cpp_incrementer_cpp_OBJECTS = $(am_cpp_incrementer_cpp_OBJECTS) cpp_incrementer_cpp_LDADD = $(LDADD) am__filters_custom_mf_custom_mf_filter_SOURCES_DIST = \ filters/custom_mf/custom_mf_filter.c \ filters/custom_mf/custom_interface.c \ filters/custom_mf/custom_conversion_codelets.c \ filters/custom_mf/conversion.cu filters/custom_mf/cuda.cu \ filters/custom_mf/conversion_opencl.c \ filters/custom_mf/custom_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_14 = \ @STARPU_USE_CUDA_TRUE@ filters/custom_mf/conversion.$(OBJEXT) \ @STARPU_USE_CUDA_TRUE@ filters/custom_mf/cuda.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_15 = conversion_opencl.$(OBJEXT) \ @STARPU_USE_OPENCL_TRUE@ custom_opencl.$(OBJEXT) am_filters_custom_mf_custom_mf_filter_OBJECTS = \ custom_mf_filter.$(OBJEXT) custom_interface.$(OBJEXT) \ custom_conversion_codelets.$(OBJEXT) $(am__objects_14) \ $(am__objects_15) filters_custom_mf_custom_mf_filter_OBJECTS = \ $(am_filters_custom_mf_custom_mf_filter_OBJECTS) filters_custom_mf_custom_mf_filter_LDADD = $(LDADD) am__filters_fblock_SOURCES_DIST = filters/fblock.c \ filters/fblock_cpu.c filters/fblock_cuda.cu \ filters/fblock_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_16 = filters/fblock_cuda.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_17 = fblock_opencl.$(OBJEXT) am_filters_fblock_OBJECTS = fblock.$(OBJEXT) fblock_cpu.$(OBJEXT) \ $(am__objects_16) $(am__objects_17) filters_fblock_OBJECTS = $(am_filters_fblock_OBJECTS) filters_fblock_LDADD = $(LDADD) filters_fmatrix_SOURCES = filters/fmatrix.c filters_fmatrix_OBJECTS = fmatrix.$(OBJEXT) filters_fmatrix_LDADD = $(LDADD) am__filters_fmultiple_manual_SOURCES_DIST = \ filters/fmultiple_manual.c filters/fmultiple_cuda.cu @STARPU_USE_CUDA_TRUE@am__objects_18 = \ @STARPU_USE_CUDA_TRUE@ filters/fmultiple_cuda.$(OBJEXT) am_filters_fmultiple_manual_OBJECTS = fmultiple_manual.$(OBJEXT) \ $(am__objects_18) filters_fmultiple_manual_OBJECTS = \ $(am_filters_fmultiple_manual_OBJECTS) filters_fmultiple_manual_LDADD = $(LDADD) am__filters_fmultiple_submit_SOURCES_DIST = \ filters/fmultiple_submit.c filters/fmultiple_cuda.cu am_filters_fmultiple_submit_OBJECTS = fmultiple_submit.$(OBJEXT) \ $(am__objects_18) filters_fmultiple_submit_OBJECTS = \ $(am_filters_fmultiple_submit_OBJECTS) filters_fmultiple_submit_LDADD = $(LDADD) am__filters_fmultiple_submit_readonly_SOURCES_DIST = \ filters/fmultiple_submit_readonly.c filters/fmultiple_cuda.cu am_filters_fmultiple_submit_readonly_OBJECTS = \ fmultiple_submit_readonly.$(OBJEXT) $(am__objects_18) filters_fmultiple_submit_readonly_OBJECTS = \ $(am_filters_fmultiple_submit_readonly_OBJECTS) filters_fmultiple_submit_readonly_LDADD = $(LDADD) filters_fvector_SOURCES = filters/fvector.c filters_fvector_OBJECTS = fvector.$(OBJEXT) filters_fvector_LDADD = $(LDADD) filters_shadow_SOURCES = filters/shadow.c filters_shadow_OBJECTS = shadow.$(OBJEXT) filters_shadow_LDADD = $(LDADD) filters_shadow2d_SOURCES = filters/shadow2d.c filters_shadow2d_OBJECTS = shadow2d.$(OBJEXT) filters_shadow2d_LDADD = $(LDADD) filters_shadow3d_SOURCES = filters/shadow3d.c filters_shadow3d_OBJECTS = shadow3d.$(OBJEXT) filters_shadow3d_LDADD = $(LDADD) am__fortran_hello_SOURCES_DIST = fortran/hello_c.c fortran/hello.F \ fortran/StarPU_fortran.h @STARPU_HAVE_F77_H_TRUE@@STARPU_HAVE_F77_TRUE@am_fortran_hello_OBJECTS = hello_c.$(OBJEXT) \ @STARPU_HAVE_F77_H_TRUE@@STARPU_HAVE_F77_TRUE@ hello.$(OBJEXT) fortran_hello_OBJECTS = $(am_fortran_hello_OBJECTS) fortran_hello_LDADD = $(LDADD) am__fortran90_f90_example_SOURCES_DIST = fortran90/mod_types.f90 \ $(top_srcdir)/include/starpu_mod.f90 \ fortran90/mod_interface.f90 fortran90/mod_compute.f90 \ fortran90/marshalling.c fortran90/f90_example.f90 @STARPU_HAVE_FC_TRUE@am_fortran90_f90_example_OBJECTS = \ @STARPU_HAVE_FC_TRUE@ mod_types.$(OBJEXT) starpu_mod.$(OBJEXT) \ @STARPU_HAVE_FC_TRUE@ mod_interface.$(OBJEXT) \ @STARPU_HAVE_FC_TRUE@ mod_compute.$(OBJEXT) \ @STARPU_HAVE_FC_TRUE@ marshalling.$(OBJEXT) \ @STARPU_HAVE_FC_TRUE@ f90_example.$(OBJEXT) fortran90_f90_example_OBJECTS = $(am_fortran90_f90_example_OBJECTS) fortran90_f90_example_LDADD = $(LDADD) am__gl_interop_gl_interop_SOURCES_DIST = gl_interop/gl_interop.c @HAVE_OPENGL_TRUE@am_gl_interop_gl_interop_OBJECTS = \ @HAVE_OPENGL_TRUE@ gl_interop.$(OBJEXT) gl_interop_gl_interop_OBJECTS = $(am_gl_interop_gl_interop_OBJECTS) @HAVE_OPENGL_TRUE@gl_interop_gl_interop_DEPENDENCIES = \ @HAVE_OPENGL_TRUE@ $(am__DEPENDENCIES_1) am__gl_interop_gl_interop_idle_SOURCES_DIST = \ gl_interop/gl_interop_idle.c @HAVE_OPENGL_TRUE@am_gl_interop_gl_interop_idle_OBJECTS = \ @HAVE_OPENGL_TRUE@ gl_interop_idle.$(OBJEXT) gl_interop_gl_interop_idle_OBJECTS = \ $(am_gl_interop_gl_interop_idle_OBJECTS) @HAVE_OPENGL_TRUE@gl_interop_gl_interop_idle_DEPENDENCIES = \ @HAVE_OPENGL_TRUE@ $(am__DEPENDENCIES_1) am__heat_heat_SOURCES_DIST = heat/heat.c heat/dw_factolu.c \ heat/dw_factolu_tag.c heat/dw_factolu_grain.c \ heat/dw_sparse_cg.c heat/heat_display.c \ heat/lu_kernels_model.c heat/dw_sparse_cg_kernels.c \ heat/dw_factolu_kernels.c common/blas.c @NO_BLAS_LIB_FALSE@am_heat_heat_OBJECTS = heat.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ dw_factolu.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ dw_factolu_tag.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ dw_factolu_grain.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ dw_sparse_cg.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ heat_display.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ lu_kernels_model.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ dw_sparse_cg_kernels.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ dw_factolu_kernels.$(OBJEXT) blas.$(OBJEXT) heat_heat_OBJECTS = $(am_heat_heat_OBJECTS) @NO_BLAS_LIB_FALSE@heat_heat_DEPENDENCIES = $(am__DEPENDENCIES_1) \ @NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) am__incrementer_incrementer_SOURCES_DIST = incrementer/incrementer.c \ incrementer/incrementer_kernels.cu \ incrementer/incrementer_kernels_opencl.c am_incrementer_incrementer_OBJECTS = incrementer.$(OBJEXT) \ $(am__objects_13) $(am__objects_12) incrementer_incrementer_OBJECTS = \ $(am_incrementer_incrementer_OBJECTS) incrementer_incrementer_LDADD = $(LDADD) am__interface_complex_SOURCES_DIST = interface/complex.c \ interface/complex_interface.c interface/complex_kernels.cu \ interface/complex_kernels_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_19 = \ @STARPU_USE_CUDA_TRUE@ interface/complex_kernels.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_20 = \ @STARPU_USE_OPENCL_TRUE@ complex_kernels_opencl.$(OBJEXT) am_interface_complex_OBJECTS = complex.$(OBJEXT) \ complex_interface.$(OBJEXT) $(am__objects_19) \ $(am__objects_20) interface_complex_OBJECTS = $(am_interface_complex_OBJECTS) interface_complex_LDADD = $(LDADD) am__loader_SOURCES_DIST = ../tests/loader.c @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@am_loader_OBJECTS = loader-loader.$(OBJEXT) loader_OBJECTS = $(am_loader_OBJECTS) loader_LDADD = $(LDADD) am__lu_lu_example_complex_double_SOURCES_DIST = \ lu/lu_example_complex_double.c lu/zlu.c lu/zlu_pivot.c \ lu/zlu_kernels.c lu/blas_complex.c common/blas.c @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@am_lu_lu_example_complex_double_OBJECTS = lu_example_complex_double.$(OBJEXT) \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ zlu.$(OBJEXT) \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ zlu_pivot.$(OBJEXT) \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ zlu_kernels.$(OBJEXT) \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ blas_complex.$(OBJEXT) \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) lu_lu_example_complex_double_OBJECTS = \ $(am_lu_lu_example_complex_double_OBJECTS) @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@lu_lu_example_complex_double_DEPENDENCIES = \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) am__lu_lu_example_complex_float_SOURCES_DIST = \ lu/lu_example_complex_float.c lu/clu.c lu/clu_pivot.c \ lu/clu_kernels.c lu/blas_complex.c common/blas.c @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@am_lu_lu_example_complex_float_OBJECTS = lu_example_complex_float.$(OBJEXT) \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ clu.$(OBJEXT) \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ clu_pivot.$(OBJEXT) \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ clu_kernels.$(OBJEXT) \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ blas_complex.$(OBJEXT) \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) lu_lu_example_complex_float_OBJECTS = \ $(am_lu_lu_example_complex_float_OBJECTS) @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@lu_lu_example_complex_float_DEPENDENCIES = \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) am__lu_lu_example_double_SOURCES_DIST = lu/lu_example_double.c \ lu/dlu.c lu/dlu_pivot.c lu/dlu_kernels.c common/blas.c @NO_BLAS_LIB_FALSE@am_lu_lu_example_double_OBJECTS = \ @NO_BLAS_LIB_FALSE@ lu_example_double.$(OBJEXT) dlu.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ dlu_pivot.$(OBJEXT) dlu_kernels.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) lu_lu_example_double_OBJECTS = $(am_lu_lu_example_double_OBJECTS) @NO_BLAS_LIB_FALSE@lu_lu_example_double_DEPENDENCIES = \ @NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) am__lu_lu_example_float_SOURCES_DIST = lu/lu_example_float.c lu/slu.c \ lu/slu_pivot.c lu/slu_kernels.c common/blas.c @NO_BLAS_LIB_FALSE@am_lu_lu_example_float_OBJECTS = \ @NO_BLAS_LIB_FALSE@ lu_example_float.$(OBJEXT) slu.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ slu_pivot.$(OBJEXT) slu_kernels.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) lu_lu_example_float_OBJECTS = $(am_lu_lu_example_float_OBJECTS) @NO_BLAS_LIB_FALSE@lu_lu_example_float_DEPENDENCIES = \ @NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) am__lu_lu_implicit_example_complex_double_SOURCES_DIST = \ lu/lu_example_complex_double.c lu/zlu_implicit.c \ lu/zlu_implicit_pivot.c lu/zlu_kernels.c lu/blas_complex.c \ common/blas.c @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@am_lu_lu_implicit_example_complex_double_OBJECTS = lu_example_complex_double.$(OBJEXT) \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ zlu_implicit.$(OBJEXT) \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ zlu_implicit_pivot.$(OBJEXT) \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ zlu_kernels.$(OBJEXT) \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ blas_complex.$(OBJEXT) \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) lu_lu_implicit_example_complex_double_OBJECTS = \ $(am_lu_lu_implicit_example_complex_double_OBJECTS) @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@lu_lu_implicit_example_complex_double_DEPENDENCIES = \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) am__lu_lu_implicit_example_complex_float_SOURCES_DIST = \ lu/lu_example_complex_float.c lu/clu_implicit.c \ lu/clu_implicit_pivot.c lu/clu_kernels.c lu/blas_complex.c \ common/blas.c @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@am_lu_lu_implicit_example_complex_float_OBJECTS = lu_example_complex_float.$(OBJEXT) \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ clu_implicit.$(OBJEXT) \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ clu_implicit_pivot.$(OBJEXT) \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ clu_kernels.$(OBJEXT) \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ blas_complex.$(OBJEXT) \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) lu_lu_implicit_example_complex_float_OBJECTS = \ $(am_lu_lu_implicit_example_complex_float_OBJECTS) @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@lu_lu_implicit_example_complex_float_DEPENDENCIES = \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) am__lu_lu_implicit_example_double_SOURCES_DIST = \ lu/lu_example_double.c lu/dlu_implicit.c \ lu/dlu_implicit_pivot.c lu/dlu_kernels.c common/blas.c @NO_BLAS_LIB_FALSE@am_lu_lu_implicit_example_double_OBJECTS = \ @NO_BLAS_LIB_FALSE@ lu_example_double.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ dlu_implicit.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ dlu_implicit_pivot.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ dlu_kernels.$(OBJEXT) blas.$(OBJEXT) lu_lu_implicit_example_double_OBJECTS = \ $(am_lu_lu_implicit_example_double_OBJECTS) @NO_BLAS_LIB_FALSE@lu_lu_implicit_example_double_DEPENDENCIES = \ @NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) am__lu_lu_implicit_example_float_SOURCES_DIST = lu/lu_example_float.c \ lu/slu_implicit.c lu/slu_implicit_pivot.c lu/slu_kernels.c \ common/blas.c @NO_BLAS_LIB_FALSE@am_lu_lu_implicit_example_float_OBJECTS = \ @NO_BLAS_LIB_FALSE@ lu_example_float.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ slu_implicit.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ slu_implicit_pivot.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ slu_kernels.$(OBJEXT) blas.$(OBJEXT) lu_lu_implicit_example_float_OBJECTS = \ $(am_lu_lu_implicit_example_float_OBJECTS) @NO_BLAS_LIB_FALSE@lu_lu_implicit_example_float_DEPENDENCIES = \ @NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) mandelbrot_mandelbrot_SOURCES = mandelbrot/mandelbrot.c mandelbrot_mandelbrot_OBJECTS = \ mandelbrot_mandelbrot-mandelbrot.$(OBJEXT) @HAVE_X11_TRUE@mandelbrot_mandelbrot_DEPENDENCIES = \ @HAVE_X11_TRUE@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ @HAVE_X11_TRUE@ $(am__DEPENDENCIES_1) matvecmult_matvecmult_SOURCES = matvecmult/matvecmult.c matvecmult_matvecmult_OBJECTS = matvecmult.$(OBJEXT) matvecmult_matvecmult_LDADD = $(LDADD) am__mult_dgemm_SOURCES_DIST = mult/dgemm.c common/blas.c @NO_BLAS_LIB_FALSE@am_mult_dgemm_OBJECTS = dgemm.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) mult_dgemm_OBJECTS = $(am_mult_dgemm_OBJECTS) @NO_BLAS_LIB_FALSE@mult_dgemm_DEPENDENCIES = $(am__DEPENDENCIES_1) am__mult_sgemm_SOURCES_DIST = mult/sgemm.c common/blas.c @NO_BLAS_LIB_FALSE@am_mult_sgemm_OBJECTS = sgemm.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) mult_sgemm_OBJECTS = $(am_mult_sgemm_OBJECTS) @NO_BLAS_LIB_FALSE@mult_sgemm_DEPENDENCIES = $(am__DEPENDENCIES_1) am__native_fortran_nf_dynbuf_SOURCES_DIST = \ native_fortran/nf_dynbuf_cl.f90 \ $(top_srcdir)/include/fstarpu_mod.f90 \ native_fortran/nf_dynbuf.f90 @STARPU_HAVE_FC_TRUE@am_native_fortran_nf_dynbuf_OBJECTS = \ @STARPU_HAVE_FC_TRUE@ nf_dynbuf_cl.$(OBJEXT) \ @STARPU_HAVE_FC_TRUE@ fstarpu_mod.$(OBJEXT) nf_dynbuf.$(OBJEXT) native_fortran_nf_dynbuf_OBJECTS = \ $(am_native_fortran_nf_dynbuf_OBJECTS) native_fortran_nf_dynbuf_LDADD = $(LDADD) am__native_fortran_nf_example_SOURCES_DIST = \ native_fortran/nf_types.f90 native_fortran/nf_compute.f90 \ $(top_srcdir)/include/fstarpu_mod.f90 \ native_fortran/nf_example.f90 @STARPU_HAVE_FC_TRUE@am_native_fortran_nf_example_OBJECTS = \ @STARPU_HAVE_FC_TRUE@ nf_types.$(OBJEXT) nf_compute.$(OBJEXT) \ @STARPU_HAVE_FC_TRUE@ fstarpu_mod.$(OBJEXT) \ @STARPU_HAVE_FC_TRUE@ nf_example.$(OBJEXT) native_fortran_nf_example_OBJECTS = \ $(am_native_fortran_nf_example_OBJECTS) native_fortran_nf_example_LDADD = $(LDADD) am__native_fortran_nf_matrix_SOURCES_DIST = \ native_fortran/nf_codelets.f90 \ $(top_srcdir)/include/fstarpu_mod.f90 \ native_fortran/nf_matrix.f90 @STARPU_HAVE_FC_TRUE@am_native_fortran_nf_matrix_OBJECTS = \ @STARPU_HAVE_FC_TRUE@ nf_codelets.$(OBJEXT) \ @STARPU_HAVE_FC_TRUE@ fstarpu_mod.$(OBJEXT) nf_matrix.$(OBJEXT) native_fortran_nf_matrix_OBJECTS = \ $(am_native_fortran_nf_matrix_OBJECTS) native_fortran_nf_matrix_LDADD = $(LDADD) am__native_fortran_nf_partition_SOURCES_DIST = \ native_fortran/nf_partition_cl.f90 \ $(top_srcdir)/include/fstarpu_mod.f90 \ native_fortran/nf_partition.f90 @STARPU_HAVE_FC_TRUE@am_native_fortran_nf_partition_OBJECTS = \ @STARPU_HAVE_FC_TRUE@ nf_partition_cl.$(OBJEXT) \ @STARPU_HAVE_FC_TRUE@ fstarpu_mod.$(OBJEXT) \ @STARPU_HAVE_FC_TRUE@ nf_partition.$(OBJEXT) native_fortran_nf_partition_OBJECTS = \ $(am_native_fortran_nf_partition_OBJECTS) native_fortran_nf_partition_LDADD = $(LDADD) am__native_fortran_nf_sched_ctx_SOURCES_DIST = \ native_fortran/nf_sched_ctx_cl.f90 \ $(top_srcdir)/include/fstarpu_mod.f90 \ native_fortran/nf_sched_ctx.f90 @STARPU_HAVE_FC_TRUE@am_native_fortran_nf_sched_ctx_OBJECTS = \ @STARPU_HAVE_FC_TRUE@ nf_sched_ctx_cl.$(OBJEXT) \ @STARPU_HAVE_FC_TRUE@ fstarpu_mod.$(OBJEXT) \ @STARPU_HAVE_FC_TRUE@ nf_sched_ctx.$(OBJEXT) native_fortran_nf_sched_ctx_OBJECTS = \ $(am_native_fortran_nf_sched_ctx_OBJECTS) native_fortran_nf_sched_ctx_LDADD = $(LDADD) am__native_fortran_nf_varbuf_SOURCES_DIST = \ native_fortran/nf_varbuf_cl.f90 \ $(top_srcdir)/include/fstarpu_mod.f90 \ native_fortran/nf_varbuf.f90 @STARPU_HAVE_FC_TRUE@am_native_fortran_nf_varbuf_OBJECTS = \ @STARPU_HAVE_FC_TRUE@ nf_varbuf_cl.$(OBJEXT) \ @STARPU_HAVE_FC_TRUE@ fstarpu_mod.$(OBJEXT) nf_varbuf.$(OBJEXT) native_fortran_nf_varbuf_OBJECTS = \ $(am_native_fortran_nf_varbuf_OBJECTS) native_fortran_nf_varbuf_LDADD = $(LDADD) am__native_fortran_nf_vector_SOURCES_DIST = \ native_fortran/nf_codelets.f90 \ $(top_srcdir)/include/fstarpu_mod.f90 \ native_fortran/nf_vector.f90 @STARPU_HAVE_FC_TRUE@am_native_fortran_nf_vector_OBJECTS = \ @STARPU_HAVE_FC_TRUE@ nf_codelets.$(OBJEXT) \ @STARPU_HAVE_FC_TRUE@ fstarpu_mod.$(OBJEXT) nf_vector.$(OBJEXT) native_fortran_nf_vector_OBJECTS = \ $(am_native_fortran_nf_vector_OBJECTS) native_fortran_nf_vector_LDADD = $(LDADD) openmp_vector_scal_omp_SOURCES = openmp/vector_scal_omp.c openmp_vector_scal_omp_OBJECTS = \ openmp_vector_scal_omp-vector_scal_omp.$(OBJEXT) openmp_vector_scal_omp_LDADD = $(LDADD) openmp_vector_scal_omp_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(openmp_vector_scal_omp_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ am__pi_pi_SOURCES_DIST = pi/pi.c pi/SobolQRNG/sobol_gold.c \ pi/SobolQRNG/sobol_primitives.c pi/pi_kernel.cu \ pi/SobolQRNG/sobol_gpu.cu @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CUDA_TRUE@am__objects_21 = pi/pi_kernel.$(OBJEXT) \ @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CUDA_TRUE@ pi/SobolQRNG/sobol_gpu.$(OBJEXT) @STARPU_HAVE_WINDOWS_FALSE@am_pi_pi_OBJECTS = pi.$(OBJEXT) \ @STARPU_HAVE_WINDOWS_FALSE@ sobol_gold.$(OBJEXT) \ @STARPU_HAVE_WINDOWS_FALSE@ sobol_primitives.$(OBJEXT) \ @STARPU_HAVE_WINDOWS_FALSE@ $(am__objects_21) pi_pi_OBJECTS = $(am_pi_pi_OBJECTS) pi_pi_LDADD = $(LDADD) am__pi_pi_redux_SOURCES_DIST = pi/pi_redux.c pi/pi_redux_kernel.cu @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CUDA_TRUE@am__objects_22 = pi/pi_redux_kernel.$(OBJEXT) @STARPU_HAVE_WINDOWS_FALSE@am_pi_pi_redux_OBJECTS = \ @STARPU_HAVE_WINDOWS_FALSE@ pi_redux.$(OBJEXT) \ @STARPU_HAVE_WINDOWS_FALSE@ $(am__objects_22) pi_pi_redux_OBJECTS = $(am_pi_pi_redux_OBJECTS) @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CUDA_TRUE@pi_pi_redux_DEPENDENCIES = $(am__DEPENDENCIES_1) am__pipeline_pipeline_SOURCES_DIST = pipeline/pipeline.c common/blas.c @NO_BLAS_LIB_FALSE@am_pipeline_pipeline_OBJECTS = pipeline.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) pipeline_pipeline_OBJECTS = $(am_pipeline_pipeline_OBJECTS) @NO_BLAS_LIB_FALSE@pipeline_pipeline_DEPENDENCIES = \ @NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) ppm_downscaler_ppm_downscaler_SOURCES = \ ppm_downscaler/ppm_downscaler.c ppm_downscaler_ppm_downscaler_OBJECTS = ppm_downscaler.$(OBJEXT) ppm_downscaler_ppm_downscaler_LDADD = $(LDADD) ppm_downscaler_yuv_downscaler_SOURCES = \ ppm_downscaler/yuv_downscaler.c ppm_downscaler_yuv_downscaler_OBJECTS = yuv_downscaler.$(OBJEXT) ppm_downscaler_yuv_downscaler_LDADD = $(LDADD) profiling_profiling_SOURCES = profiling/profiling.c profiling_profiling_OBJECTS = profiling.$(OBJEXT) profiling_profiling_LDADD = $(LDADD) am__reductions_dot_product_SOURCES_DIST = reductions/dot_product.c \ reductions/dot_product_kernels.cu @STARPU_USE_CUDA_TRUE@am__objects_23 = reductions/dot_product_kernels.$(OBJEXT) am_reductions_dot_product_OBJECTS = dot_product.$(OBJEXT) \ $(am__objects_23) reductions_dot_product_OBJECTS = $(am_reductions_dot_product_OBJECTS) reductions_dot_product_LDADD = $(LDADD) reductions_minmax_reduction_SOURCES = reductions/minmax_reduction.c reductions_minmax_reduction_OBJECTS = minmax_reduction.$(OBJEXT) reductions_minmax_reduction_LDADD = $(LDADD) sched_ctx_dummy_sched_with_ctx_SOURCES = \ sched_ctx/dummy_sched_with_ctx.c sched_ctx_dummy_sched_with_ctx_OBJECTS = \ dummy_sched_with_ctx.$(OBJEXT) sched_ctx_dummy_sched_with_ctx_LDADD = $(LDADD) sched_ctx_nested_sched_ctxs_SOURCES = sched_ctx/nested_sched_ctxs.c sched_ctx_nested_sched_ctxs_OBJECTS = \ sched_ctx_nested_sched_ctxs-nested_sched_ctxs.$(OBJEXT) sched_ctx_nested_sched_ctxs_LDADD = $(LDADD) sched_ctx_nested_sched_ctxs_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(sched_ctx_nested_sched_ctxs_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ sched_ctx_parallel_code_SOURCES = sched_ctx/parallel_code.c sched_ctx_parallel_code_OBJECTS = \ sched_ctx_parallel_code-parallel_code.$(OBJEXT) sched_ctx_parallel_code_LDADD = $(LDADD) sched_ctx_parallel_code_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(sched_ctx_parallel_code_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ sched_ctx_parallel_tasks_reuse_handle_SOURCES = \ sched_ctx/parallel_tasks_reuse_handle.c sched_ctx_parallel_tasks_reuse_handle_OBJECTS = sched_ctx_parallel_tasks_reuse_handle-parallel_tasks_reuse_handle.$(OBJEXT) sched_ctx_parallel_tasks_reuse_handle_LDADD = $(LDADD) sched_ctx_parallel_tasks_reuse_handle_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(sched_ctx_parallel_tasks_reuse_handle_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ sched_ctx_prio_SOURCES = sched_ctx/prio.c sched_ctx_prio_OBJECTS = prio.$(OBJEXT) sched_ctx_prio_LDADD = $(LDADD) sched_ctx_sched_ctx_SOURCES = sched_ctx/sched_ctx.c sched_ctx_sched_ctx_OBJECTS = sched_ctx.$(OBJEXT) sched_ctx_sched_ctx_LDADD = $(LDADD) sched_ctx_sched_ctx_without_sched_policy_SOURCES = \ sched_ctx/sched_ctx_without_sched_policy.c sched_ctx_sched_ctx_without_sched_policy_OBJECTS = sched_ctx_sched_ctx_without_sched_policy-sched_ctx_without_sched_policy.$(OBJEXT) sched_ctx_sched_ctx_without_sched_policy_LDADD = $(LDADD) sched_ctx_sched_ctx_without_sched_policy_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(sched_ctx_sched_ctx_without_sched_policy_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ sched_ctx_sched_ctx_without_sched_policy_awake_SOURCES = \ sched_ctx/sched_ctx_without_sched_policy_awake.c sched_ctx_sched_ctx_without_sched_policy_awake_OBJECTS = \ sched_ctx_without_sched_policy_awake.$(OBJEXT) sched_ctx_sched_ctx_without_sched_policy_awake_LDADD = $(LDADD) sched_ctx_two_cpu_contexts_SOURCES = sched_ctx/two_cpu_contexts.c sched_ctx_two_cpu_contexts_OBJECTS = two_cpu_contexts.$(OBJEXT) sched_ctx_two_cpu_contexts_LDADD = $(LDADD) scheduler_dummy_sched_SOURCES = scheduler/dummy_sched.c scheduler_dummy_sched_OBJECTS = dummy_sched.$(OBJEXT) scheduler_dummy_sched_LDADD = $(LDADD) am_spmd_vector_scal_spmd_OBJECTS = vector_scal_spmd.$(OBJEXT) spmd_vector_scal_spmd_OBJECTS = $(am_spmd_vector_scal_spmd_OBJECTS) spmd_vector_scal_spmd_LDADD = $(LDADD) am__spmv_dw_block_spmv_SOURCES_DIST = spmv/dw_block_spmv.c \ spmv/dw_block_spmv_kernels.c spmv/matrix_market/mm_to_bcsr.c \ spmv/matrix_market/mmio.c @ATLAS_BLAS_LIB_TRUE@am_spmv_dw_block_spmv_OBJECTS = \ @ATLAS_BLAS_LIB_TRUE@ dw_block_spmv.$(OBJEXT) \ @ATLAS_BLAS_LIB_TRUE@ dw_block_spmv_kernels.$(OBJEXT) \ @ATLAS_BLAS_LIB_TRUE@ mm_to_bcsr.$(OBJEXT) mmio.$(OBJEXT) spmv_dw_block_spmv_OBJECTS = $(am_spmv_dw_block_spmv_OBJECTS) @ATLAS_BLAS_LIB_TRUE@spmv_dw_block_spmv_DEPENDENCIES = \ @ATLAS_BLAS_LIB_TRUE@ $(am__DEPENDENCIES_1) am__spmv_spmv_SOURCES_DIST = spmv/spmv.c spmv/spmv_kernels.c \ spmv/spmv_cuda.cu @STARPU_USE_CUDA_TRUE@am__objects_24 = spmv/spmv_cuda.$(OBJEXT) am_spmv_spmv_OBJECTS = spmv.$(OBJEXT) spmv_kernels.$(OBJEXT) \ $(am__objects_24) spmv_spmv_OBJECTS = $(am_spmv_spmv_OBJECTS) spmv_spmv_LDADD = $(LDADD) tag_example_tag_example_SOURCES = tag_example/tag_example.c tag_example_tag_example_OBJECTS = tag_example.$(OBJEXT) tag_example_tag_example_LDADD = $(LDADD) tag_example_tag_example2_SOURCES = tag_example/tag_example2.c tag_example_tag_example2_OBJECTS = tag_example2.$(OBJEXT) tag_example_tag_example2_LDADD = $(LDADD) tag_example_tag_example3_SOURCES = tag_example/tag_example3.c tag_example_tag_example3_OBJECTS = tag_example3.$(OBJEXT) tag_example_tag_example3_LDADD = $(LDADD) tag_example_tag_example4_SOURCES = tag_example/tag_example4.c tag_example_tag_example4_OBJECTS = tag_example4.$(OBJEXT) tag_example_tag_example4_LDADD = $(LDADD) tag_example_tag_restartable_SOURCES = tag_example/tag_restartable.c tag_example_tag_restartable_OBJECTS = tag_restartable.$(OBJEXT) tag_example_tag_restartable_LDADD = $(LDADD) am_top_hello_world_top_OBJECTS = hello_world_top.$(OBJEXT) top_hello_world_top_OBJECTS = $(am_top_hello_world_top_OBJECTS) top_hello_world_top_LDADD = $(LDADD) worker_collections_worker_list_example_SOURCES = \ worker_collections/worker_list_example.c worker_collections_worker_list_example_OBJECTS = \ worker_list_example.$(OBJEXT) worker_collections_worker_list_example_LDADD = $(LDADD) worker_collections_worker_tree_example_SOURCES = \ worker_collections/worker_tree_example.c worker_collections_worker_tree_example_OBJECTS = \ worker_tree_example.$(OBJEXT) worker_collections_worker_tree_example_LDADD = $(LDADD) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/common -I$(top_builddir)/include -I$(top_builddir)/gcc-plugin/include/starpu-gcc -I$(top_builddir)/starpu-top depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f PPF77COMPILE = $(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) LTPPF77COMPILE = $(LIBTOOL) $(AM_V_lt) --tag=F77 $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(F77) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_FFLAGS) $(FFLAGS) AM_V_PPF77 = $(am__v_PPF77_@AM_V@) am__v_PPF77_ = $(am__v_PPF77_@AM_DEFAULT_V@) am__v_PPF77_0 = @echo " PPF77 " $@; am__v_PPF77_1 = F77LD = $(F77) F77LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(F77LD) $(AM_FFLAGS) $(FFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_F77LD = $(am__v_F77LD_@AM_V@) am__v_F77LD_ = $(am__v_F77LD_@AM_DEFAULT_V@) am__v_F77LD_0 = @echo " F77LD " $@; am__v_F77LD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = FCCOMPILE = $(FC) $(AM_FCFLAGS) $(FCFLAGS) LTFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS) AM_V_FC = $(am__v_FC_@AM_V@) am__v_FC_ = $(am__v_FC_@AM_DEFAULT_V@) am__v_FC_0 = @echo " FC " $@; am__v_FC_1 = FCLD = $(FC) FCLINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_FCLD = $(am__v_FCLD_@AM_V@) am__v_FCLD_ = $(am__v_FCLD_@AM_DEFAULT_V@) am__v_FCLD_0 = @echo " FCLD " $@; am__v_FCLD_1 = SOURCES = $(axpy_axpy_SOURCES) $(basic_examples_block_SOURCES) \ basic_examples/dynamic_handles.c basic_examples/hello_world.c \ basic_examples/mult.c $(basic_examples_multiformat_SOURCES) \ $(basic_examples_variable_SOURCES) \ $(basic_examples_vector_scal_SOURCES) \ $(basic_examples_vector_scal_fortran_SOURCES) \ $(binary_binary_SOURCES) callback/callback.c \ callback/prologue.c $(cg_cg_SOURCES) \ $(cholesky_cholesky_grain_tag_SOURCES) \ $(cholesky_cholesky_implicit_SOURCES) \ $(cholesky_cholesky_tag_SOURCES) \ $(cholesky_cholesky_tile_tag_SOURCES) \ $(cpp_incrementer_cpp_SOURCES) \ $(filters_custom_mf_custom_mf_filter_SOURCES) \ $(filters_fblock_SOURCES) filters/fmatrix.c \ $(filters_fmultiple_manual_SOURCES) \ $(filters_fmultiple_submit_SOURCES) \ $(filters_fmultiple_submit_readonly_SOURCES) filters/fvector.c \ filters/shadow.c filters/shadow2d.c filters/shadow3d.c \ $(fortran_hello_SOURCES) $(fortran90_f90_example_SOURCES) \ $(gl_interop_gl_interop_SOURCES) \ $(gl_interop_gl_interop_idle_SOURCES) $(heat_heat_SOURCES) \ $(incrementer_incrementer_SOURCES) \ $(interface_complex_SOURCES) $(loader_SOURCES) \ $(lu_lu_example_complex_double_SOURCES) \ $(lu_lu_example_complex_float_SOURCES) \ $(lu_lu_example_double_SOURCES) $(lu_lu_example_float_SOURCES) \ $(lu_lu_implicit_example_complex_double_SOURCES) \ $(lu_lu_implicit_example_complex_float_SOURCES) \ $(lu_lu_implicit_example_double_SOURCES) \ $(lu_lu_implicit_example_float_SOURCES) \ mandelbrot/mandelbrot.c matvecmult/matvecmult.c \ $(mult_dgemm_SOURCES) $(mult_sgemm_SOURCES) \ $(native_fortran_nf_dynbuf_SOURCES) \ $(native_fortran_nf_example_SOURCES) \ $(native_fortran_nf_matrix_SOURCES) \ $(native_fortran_nf_partition_SOURCES) \ $(native_fortran_nf_sched_ctx_SOURCES) \ $(native_fortran_nf_varbuf_SOURCES) \ $(native_fortran_nf_vector_SOURCES) openmp/vector_scal_omp.c \ $(pi_pi_SOURCES) $(pi_pi_redux_SOURCES) \ $(pipeline_pipeline_SOURCES) ppm_downscaler/ppm_downscaler.c \ ppm_downscaler/yuv_downscaler.c profiling/profiling.c \ $(reductions_dot_product_SOURCES) \ reductions/minmax_reduction.c sched_ctx/dummy_sched_with_ctx.c \ sched_ctx/nested_sched_ctxs.c sched_ctx/parallel_code.c \ sched_ctx/parallel_tasks_reuse_handle.c sched_ctx/prio.c \ sched_ctx/sched_ctx.c \ sched_ctx/sched_ctx_without_sched_policy.c \ sched_ctx/sched_ctx_without_sched_policy_awake.c \ sched_ctx/two_cpu_contexts.c scheduler/dummy_sched.c \ $(spmd_vector_scal_spmd_SOURCES) $(spmv_dw_block_spmv_SOURCES) \ $(spmv_spmv_SOURCES) tag_example/tag_example.c \ tag_example/tag_example2.c tag_example/tag_example3.c \ tag_example/tag_example4.c tag_example/tag_restartable.c \ $(top_hello_world_top_SOURCES) \ worker_collections/worker_list_example.c \ worker_collections/worker_tree_example.c DIST_SOURCES = $(am__axpy_axpy_SOURCES_DIST) \ $(am__basic_examples_block_SOURCES_DIST) \ basic_examples/dynamic_handles.c basic_examples/hello_world.c \ basic_examples/mult.c \ $(am__basic_examples_multiformat_SOURCES_DIST) \ $(am__basic_examples_variable_SOURCES_DIST) \ $(am__basic_examples_vector_scal_SOURCES_DIST) \ $(am__basic_examples_vector_scal_fortran_SOURCES_DIST) \ $(am__binary_binary_SOURCES_DIST) callback/callback.c \ callback/prologue.c $(am__cg_cg_SOURCES_DIST) \ $(am__cholesky_cholesky_grain_tag_SOURCES_DIST) \ $(am__cholesky_cholesky_implicit_SOURCES_DIST) \ $(am__cholesky_cholesky_tag_SOURCES_DIST) \ $(am__cholesky_cholesky_tile_tag_SOURCES_DIST) \ $(am__cpp_incrementer_cpp_SOURCES_DIST) \ $(am__filters_custom_mf_custom_mf_filter_SOURCES_DIST) \ $(am__filters_fblock_SOURCES_DIST) filters/fmatrix.c \ $(am__filters_fmultiple_manual_SOURCES_DIST) \ $(am__filters_fmultiple_submit_SOURCES_DIST) \ $(am__filters_fmultiple_submit_readonly_SOURCES_DIST) \ filters/fvector.c filters/shadow.c filters/shadow2d.c \ filters/shadow3d.c $(am__fortran_hello_SOURCES_DIST) \ $(am__fortran90_f90_example_SOURCES_DIST) \ $(am__gl_interop_gl_interop_SOURCES_DIST) \ $(am__gl_interop_gl_interop_idle_SOURCES_DIST) \ $(am__heat_heat_SOURCES_DIST) \ $(am__incrementer_incrementer_SOURCES_DIST) \ $(am__interface_complex_SOURCES_DIST) \ $(am__loader_SOURCES_DIST) \ $(am__lu_lu_example_complex_double_SOURCES_DIST) \ $(am__lu_lu_example_complex_float_SOURCES_DIST) \ $(am__lu_lu_example_double_SOURCES_DIST) \ $(am__lu_lu_example_float_SOURCES_DIST) \ $(am__lu_lu_implicit_example_complex_double_SOURCES_DIST) \ $(am__lu_lu_implicit_example_complex_float_SOURCES_DIST) \ $(am__lu_lu_implicit_example_double_SOURCES_DIST) \ $(am__lu_lu_implicit_example_float_SOURCES_DIST) \ mandelbrot/mandelbrot.c matvecmult/matvecmult.c \ $(am__mult_dgemm_SOURCES_DIST) $(am__mult_sgemm_SOURCES_DIST) \ $(am__native_fortran_nf_dynbuf_SOURCES_DIST) \ $(am__native_fortran_nf_example_SOURCES_DIST) \ $(am__native_fortran_nf_matrix_SOURCES_DIST) \ $(am__native_fortran_nf_partition_SOURCES_DIST) \ $(am__native_fortran_nf_sched_ctx_SOURCES_DIST) \ $(am__native_fortran_nf_varbuf_SOURCES_DIST) \ $(am__native_fortran_nf_vector_SOURCES_DIST) \ openmp/vector_scal_omp.c $(am__pi_pi_SOURCES_DIST) \ $(am__pi_pi_redux_SOURCES_DIST) \ $(am__pipeline_pipeline_SOURCES_DIST) \ ppm_downscaler/ppm_downscaler.c \ ppm_downscaler/yuv_downscaler.c profiling/profiling.c \ $(am__reductions_dot_product_SOURCES_DIST) \ reductions/minmax_reduction.c sched_ctx/dummy_sched_with_ctx.c \ sched_ctx/nested_sched_ctxs.c sched_ctx/parallel_code.c \ sched_ctx/parallel_tasks_reuse_handle.c sched_ctx/prio.c \ sched_ctx/sched_ctx.c \ sched_ctx/sched_ctx_without_sched_policy.c \ sched_ctx/sched_ctx_without_sched_policy_awake.c \ sched_ctx/two_cpu_contexts.c scheduler/dummy_sched.c \ $(spmd_vector_scal_spmd_SOURCES) \ $(am__spmv_dw_block_spmv_SOURCES_DIST) \ $(am__spmv_spmv_SOURCES_DIST) tag_example/tag_example.c \ tag_example/tag_example2.c tag_example/tag_example3.c \ tag_example/tag_example4.c tag_example/tag_restartable.c \ $(top_hello_world_top_SOURCES) \ worker_collections/worker_list_example.c \ worker_collections/worker_tree_example.c RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } DATA = $(nobase_STARPU_OPENCL_DATA_DATA) HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ check recheck distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/loader-cross.sh.in \ $(top_srcdir)/build-aux/depcomp \ $(top_srcdir)/build-aux/test-driver $(top_srcdir)/starpu.mk DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = $(top_builddir)/src/@LIBSTARPU_LINK@ $(MAGMA_LIBS) $(HWLOC_LIBS) @LIBS@ $(FXT_LIBS) LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ $(am__append_1) NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POTI_CFLAGS = @POTI_CFLAGS@ POTI_LIBS = @POTI_LIBS@ PROG_DATE = @PROG_DATE@ PROG_STAT = @PROG_STAT@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_COI_CPPFLAGS = @STARPU_COI_CPPFLAGS@ STARPU_COI_LDFLAGS = @STARPU_COI_LDFLAGS@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LEVELDB_LDFLAGS = @STARPU_LEVELDB_LDFLAGS@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RCCE_CFLAGS = @STARPU_RCCE_CFLAGS@ STARPU_RCCE_CPPFLAGS = @STARPU_RCCE_CPPFLAGS@ STARPU_RCCE_LDFLAGS = @STARPU_RCCE_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SCIF_CPPFLAGS = @STARPU_SCIF_CPPFLAGS@ STARPU_SCIF_LDFLAGS = @STARPU_SCIF_LDFLAGS@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SC_HYPERVISOR_DEBUG = @STARPU_SC_HYPERVISOR_DEBUG@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ mpifort_path = @mpifort_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ smpirun_path = @smpirun_path@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @STARPU_SIMGRID_TRUE@STARPU_PERF_MODEL_DIR = $(abs_top_srcdir)/tools/perfmodels/sampling @STARPU_SIMGRID_TRUE@STARPU_HOSTNAME = mirage @STARPU_SIMGRID_TRUE@MALLOC_PERTURB_ = 0 AM_CFLAGS = $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(GLOBAL_AM_CFLAGS) -Wno-unused AM_CXXFLAGS = $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) AM_CPPFLAGS = -I$(top_srcdir)/include/ -I$(top_srcdir)/examples/ -I$(top_builddir)/include AM_LDFLAGS = @STARPU_EXPORT_DYNAMIC@ $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) $(STARPU_COI_LDFLAGS) $(STARPU_SCIF_LDFLAGS) SUBDIRS = stencil BUILT_SOURCES = ###################### # matVecMult example # ###################### @STARPU_USE_OPENCL_TRUE@nobase_STARPU_OPENCL_DATA_DATA = basic_examples/vector_scal_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ basic_examples/multiformat_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ basic_examples/multiformat_conversion_codelets_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ basic_examples/block_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ basic_examples/variable_kernels_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ filters/fblock_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ filters/custom_mf/conversion_opencl.cl \ @STARPU_USE_OPENCL_TRUE@ filters/custom_mf/custom_opencl.cl \ @STARPU_USE_OPENCL_TRUE@ $(am__append_37) \ @STARPU_USE_OPENCL_TRUE@ incrementer/incrementer_kernels_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ interface/complex_kernels.cl \ @STARPU_USE_OPENCL_TRUE@ matvecmult/matvecmult_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ reductions/dot_product_opencl_kernels.cl EXTRA_DIST = \ README.txt \ axpy/axpy.h \ axpy/axpy_opencl_kernel.cl \ basic_examples/vector_scal_opencl_kernel.cl \ basic_examples/multiformat_types.h \ basic_examples/multiformat_opencl_kernel.cl \ basic_examples/multiformat_conversion_codelets_opencl_kernel.cl \ common/blas_model.c \ spmd/vector_scal_spmd.c \ spmv/spmv_cuda.cu \ spmv/spmv_opencl.cl \ spmv/matrix_market/examples/fidapm05.mtx \ mult/xgemm.c \ lu/xlu.c \ lu/xlu_pivot.c \ lu/xlu_implicit.c \ lu/xlu_implicit_pivot.c \ lu/xlu_kernels.c \ lu/lu_example.c \ incrementer/incrementer_kernels_opencl_kernel.cl \ basic_examples/variable_kernels_opencl_kernel.cl \ matvecmult/matvecmult_kernel.cl \ basic_examples/block_opencl_kernel.cl \ filters/fblock_opencl_kernel.cl \ filters/custom_mf/conversion_opencl.cl \ filters/custom_mf/custom_opencl.cl \ filters/custom_mf/custom_types.h \ interface/complex_kernels.cl \ reductions/dot_product.h \ reductions/dot_product_opencl_kernels.cl \ scheduler/schedulers.sh \ scheduler/schedulers_context.sh \ fortran/Makefile \ heat/heat.sh \ lu/lu.sh CLEANFILES = *.gcno *.gcda *.linkinfo *.mod starpu_idle_microsec.log *.mps *.dot *.pl examplebindir = $(libdir)/starpu/examples/ noinst_HEADERS = \ axpy/axpy.h \ cg/cg.h \ heat/lu_kernels_model.h \ heat/dw_sparse_cg.h \ heat/heat.h \ heat/dw_factolu.h \ lu/xlu.h \ lu/xlu_kernels.h \ lu/lu-float.h \ lu/lu-double.h \ lu/complex_float.h \ lu/complex_double.h \ lu/blas_complex.h \ cholesky/cholesky.h \ sched_ctx_utils/sched_ctx_utils.h \ common/blas_model.h \ common/blas.h \ mult/simple.h \ mult/double.h \ fortran/StarPU_fortran.h \ ppm_downscaler/ppm_downscaler.h \ ppm_downscaler/yuv_downscaler.h \ spmv/matrix_market/mmio.h \ spmv/matrix_market/mm_to_bcsr.h \ spmv/spmv.h \ spmv/dw_block_spmv.h \ basic_examples/multiformat_types.h \ filters/custom_mf/custom_interface.h \ filters/custom_mf/custom_types.h \ interface/complex_interface.h \ interface/complex_codelet.h \ pi/pi.h \ pi/SobolQRNG/sobol.h \ pi/SobolQRNG/sobol_gold.h \ pi/SobolQRNG/sobol_gpu.h \ pi/SobolQRNG/sobol_primitives.h \ reductions/dot_product.h \ basic_examples/vector_scal_cpu_template.h @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@LOADER = loader @STARPU_CROSS_COMPILING_TRUE@@STARPU_HAVE_WINDOWS_FALSE@LOADER = @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@loader_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -I$(top_builddir)/src/ @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@LOADER_BIN = $(abs_top_builddir)/examples/$(LOADER) @STARPU_CROSS_COMPILING_TRUE@@STARPU_HAVE_WINDOWS_FALSE@LOADER_BIN = $(top_builddir)/examples/loader-cross.sh @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@loader_SOURCES = ../tests/loader.c @STARPU_HAVE_AM111_FALSE@@STARPU_HAVE_WINDOWS_FALSE@TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(LOADER_BIN) @STARPU_HAVE_AM111_TRUE@@STARPU_HAVE_WINDOWS_FALSE@TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" @STARPU_HAVE_AM111_TRUE@@STARPU_HAVE_WINDOWS_FALSE@LOG_COMPILER = $(LOADER_BIN) # STARPU_EXAMPLES list all applications which have to be compiled and checked # Applications which should only be compiled are added directly in examplebin_PROGRAMS # see for instance mandelbrot/mandelbrot STARPU_EXAMPLES = sched_ctx/prio \ worker_collections/worker_list_example $(am__append_3) \ $(am__append_4) $(am__append_5) $(am__append_6) \ $(am__append_7) $(am__append_8) $(am__append_9) \ $(am__append_10) $(am__append_11) $(am__append_13) \ $(am__append_14) $(am__append_15) $(am__append_16) \ $(am__append_17) $(am__append_18) ################## # Basic examples # ################## basic_examples_vector_scal_SOURCES = basic_examples/vector_scal.c \ basic_examples/vector_scal_cpu.c $(am__append_19) \ $(am__append_20) $(am__append_21) @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_ICC_TRUE@basic_examples_vector_scal_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(ICC) $(basic_examples_vector_scal_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ @STARPU_CROSS_COMPILING_TRUE@@STARPU_HAVE_ICC_TRUE@basic_examples_vector_scal_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) $(basic_examples_vector_scal_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ @STARPU_HAVE_ICC_FALSE@basic_examples_vector_scal_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) $(basic_examples_vector_scal_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ @STARPU_HAVE_F77_TRUE@basic_examples_vector_scal_fortran_SOURCES = \ @STARPU_HAVE_F77_TRUE@ basic_examples/vector_scal_fortran.F \ @STARPU_HAVE_F77_TRUE@ basic_examples/vector_scal_c.c \ @STARPU_HAVE_F77_TRUE@ basic_examples/vector_scal_cpu.c \ @STARPU_HAVE_F77_TRUE@ $(am__append_22) @STARPU_HAVE_F77_TRUE@@STARPU_USE_CUDA_TRUE@basic_examples_vector_scal_fortran_LDADD = \ @STARPU_HAVE_F77_TRUE@@STARPU_USE_CUDA_TRUE@ $(STARPU_CUDA_FORTRAN_LDFLAGS) @STARPU_HAVE_F77_H_TRUE@@STARPU_HAVE_F77_TRUE@fortran_hello_SOURCES = \ @STARPU_HAVE_F77_H_TRUE@@STARPU_HAVE_F77_TRUE@ fortran/hello_c.c \ @STARPU_HAVE_F77_H_TRUE@@STARPU_HAVE_F77_TRUE@ fortran/hello.F \ @STARPU_HAVE_F77_H_TRUE@@STARPU_HAVE_F77_TRUE@ fortran/StarPU_fortran.h @STARPU_HAVE_FC_TRUE@fortran90_f90_example_SOURCES = \ @STARPU_HAVE_FC_TRUE@ fortran90/mod_types.f90 \ @STARPU_HAVE_FC_TRUE@ $(top_srcdir)/include/starpu_mod.f90 \ @STARPU_HAVE_FC_TRUE@ fortran90/mod_interface.f90 \ @STARPU_HAVE_FC_TRUE@ fortran90/mod_compute.f90 \ @STARPU_HAVE_FC_TRUE@ fortran90/marshalling.c \ @STARPU_HAVE_FC_TRUE@ fortran90/f90_example.f90 @STARPU_HAVE_FC_TRUE@native_fortran_nf_vector_SOURCES = \ @STARPU_HAVE_FC_TRUE@ native_fortran/nf_codelets.f90 \ @STARPU_HAVE_FC_TRUE@ $(top_srcdir)/include/fstarpu_mod.f90 \ @STARPU_HAVE_FC_TRUE@ native_fortran/nf_vector.f90 @STARPU_HAVE_FC_TRUE@native_fortran_nf_matrix_SOURCES = \ @STARPU_HAVE_FC_TRUE@ native_fortran/nf_codelets.f90 \ @STARPU_HAVE_FC_TRUE@ $(top_srcdir)/include/fstarpu_mod.f90 \ @STARPU_HAVE_FC_TRUE@ native_fortran/nf_matrix.f90 @STARPU_HAVE_FC_TRUE@native_fortran_nf_example_SOURCES = \ @STARPU_HAVE_FC_TRUE@ native_fortran/nf_types.f90 \ @STARPU_HAVE_FC_TRUE@ native_fortran/nf_compute.f90 \ @STARPU_HAVE_FC_TRUE@ $(top_srcdir)/include/fstarpu_mod.f90 \ @STARPU_HAVE_FC_TRUE@ native_fortran/nf_example.f90 @STARPU_HAVE_FC_TRUE@native_fortran_nf_dynbuf_SOURCES = \ @STARPU_HAVE_FC_TRUE@ native_fortran/nf_dynbuf_cl.f90 \ @STARPU_HAVE_FC_TRUE@ $(top_srcdir)/include/fstarpu_mod.f90 \ @STARPU_HAVE_FC_TRUE@ native_fortran/nf_dynbuf.f90 @STARPU_HAVE_FC_TRUE@native_fortran_nf_varbuf_SOURCES = \ @STARPU_HAVE_FC_TRUE@ native_fortran/nf_varbuf_cl.f90 \ @STARPU_HAVE_FC_TRUE@ $(top_srcdir)/include/fstarpu_mod.f90 \ @STARPU_HAVE_FC_TRUE@ native_fortran/nf_varbuf.f90 @STARPU_HAVE_FC_TRUE@native_fortran_nf_sched_ctx_SOURCES = \ @STARPU_HAVE_FC_TRUE@ native_fortran/nf_sched_ctx_cl.f90 \ @STARPU_HAVE_FC_TRUE@ $(top_srcdir)/include/fstarpu_mod.f90 \ @STARPU_HAVE_FC_TRUE@ native_fortran/nf_sched_ctx.f90 @STARPU_HAVE_FC_TRUE@native_fortran_nf_partition_SOURCES = \ @STARPU_HAVE_FC_TRUE@ native_fortran/nf_partition_cl.f90 \ @STARPU_HAVE_FC_TRUE@ $(top_srcdir)/include/fstarpu_mod.f90 \ @STARPU_HAVE_FC_TRUE@ native_fortran/nf_partition.f90 ####################### # Multiformat example # ####################### basic_examples_multiformat_SOURCES = basic_examples/multiformat.c \ basic_examples/multiformat_conversion_codelets.c \ $(am__append_23) $(am__append_24) ################# # block example # ################# basic_examples_block_SOURCES = basic_examples/block.c \ basic_examples/block_cpu.c $(am__append_25) $(am__append_26) #################### # Variable example # #################### basic_examples_variable_SOURCES = basic_examples/variable.c \ basic_examples/variable_kernels_cpu.c $(am__append_27) \ $(am__append_28) ########### # Filters # ########### filters_fblock_SOURCES = filters/fblock.c filters/fblock_cpu.c \ $(am__append_29) $(am__append_30) filters_fmultiple_manual_SOURCES = filters/fmultiple_manual.c \ $(am__append_31) filters_fmultiple_submit_SOURCES = filters/fmultiple_submit.c \ $(am__append_32) filters_fmultiple_submit_readonly_SOURCES = \ filters/fmultiple_submit_readonly.c $(am__append_33) filters_custom_mf_custom_mf_filter_SOURCES = \ filters/custom_mf/custom_mf_filter.c \ filters/custom_mf/custom_interface.c \ filters/custom_mf/custom_conversion_codelets.c \ $(am__append_34) $(am__append_35) ################ # AXPY example # ################ @NO_BLAS_LIB_FALSE@axpy_axpy_SOURCES = axpy/axpy.c common/blas.c \ @NO_BLAS_LIB_FALSE@ $(am__append_36) @NO_BLAS_LIB_FALSE@axpy_axpy_LDADD = \ @NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) ################ # Mult example # ################ @NO_BLAS_LIB_FALSE@mult_sgemm_SOURCES = \ @NO_BLAS_LIB_FALSE@ mult/sgemm.c \ @NO_BLAS_LIB_FALSE@ common/blas.c @NO_BLAS_LIB_FALSE@mult_sgemm_LDADD = \ @NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) @NO_BLAS_LIB_FALSE@mult_dgemm_SOURCES = \ @NO_BLAS_LIB_FALSE@ mult/dgemm.c \ @NO_BLAS_LIB_FALSE@ common/blas.c @NO_BLAS_LIB_FALSE@mult_dgemm_LDADD = \ @NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) #################### # Cholesky example # #################### @NO_BLAS_LIB_FALSE@cholesky_cholesky_tag_SOURCES = \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_tag.c \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_models.c \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_kernels.c \ @NO_BLAS_LIB_FALSE@ common/blas.c @NO_BLAS_LIB_FALSE@cholesky_cholesky_tag_LDADD = \ @NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) @NO_BLAS_LIB_FALSE@cholesky_cholesky_tile_tag_SOURCES = \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_tile_tag.c \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_models.c \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_kernels.c \ @NO_BLAS_LIB_FALSE@ common/blas.c @NO_BLAS_LIB_FALSE@cholesky_cholesky_tile_tag_LDADD = \ @NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) @NO_BLAS_LIB_FALSE@cholesky_cholesky_grain_tag_SOURCES = \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_grain_tag.c \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_models.c \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_kernels.c \ @NO_BLAS_LIB_FALSE@ common/blas.c @NO_BLAS_LIB_FALSE@cholesky_cholesky_grain_tag_LDADD = \ @NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) @NO_BLAS_LIB_FALSE@cholesky_cholesky_implicit_SOURCES = \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_implicit.c \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_models.c \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_kernels.c \ @NO_BLAS_LIB_FALSE@ sched_ctx_utils/sched_ctx_utils.c \ @NO_BLAS_LIB_FALSE@ common/blas.c @NO_BLAS_LIB_FALSE@cholesky_cholesky_implicit_LDADD = \ @NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) ############## # LU example # ############## @NO_BLAS_LIB_FALSE@lu_lu_example_float_SOURCES = \ @NO_BLAS_LIB_FALSE@ lu/lu_example_float.c \ @NO_BLAS_LIB_FALSE@ lu/slu.c \ @NO_BLAS_LIB_FALSE@ lu/slu_pivot.c \ @NO_BLAS_LIB_FALSE@ lu/slu_kernels.c \ @NO_BLAS_LIB_FALSE@ common/blas.c @NO_BLAS_LIB_FALSE@lu_lu_example_float_LDADD = \ @NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) @NO_BLAS_LIB_FALSE@lu_lu_example_double_SOURCES = \ @NO_BLAS_LIB_FALSE@ lu/lu_example_double.c \ @NO_BLAS_LIB_FALSE@ lu/dlu.c \ @NO_BLAS_LIB_FALSE@ lu/dlu_pivot.c \ @NO_BLAS_LIB_FALSE@ lu/dlu_kernels.c \ @NO_BLAS_LIB_FALSE@ common/blas.c @NO_BLAS_LIB_FALSE@lu_lu_example_double_LDADD = \ @NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) @NO_BLAS_LIB_FALSE@lu_lu_implicit_example_float_SOURCES = \ @NO_BLAS_LIB_FALSE@ lu/lu_example_float.c \ @NO_BLAS_LIB_FALSE@ lu/slu_implicit.c \ @NO_BLAS_LIB_FALSE@ lu/slu_implicit_pivot.c \ @NO_BLAS_LIB_FALSE@ lu/slu_kernels.c \ @NO_BLAS_LIB_FALSE@ common/blas.c @NO_BLAS_LIB_FALSE@lu_lu_implicit_example_float_LDADD = \ @NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) @NO_BLAS_LIB_FALSE@lu_lu_implicit_example_double_SOURCES = \ @NO_BLAS_LIB_FALSE@ lu/lu_example_double.c \ @NO_BLAS_LIB_FALSE@ lu/dlu_implicit.c \ @NO_BLAS_LIB_FALSE@ lu/dlu_implicit_pivot.c \ @NO_BLAS_LIB_FALSE@ lu/dlu_kernels.c \ @NO_BLAS_LIB_FALSE@ common/blas.c @NO_BLAS_LIB_FALSE@lu_lu_implicit_example_double_LDADD = \ @NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@lu_lu_example_complex_float_SOURCES = \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ lu/lu_example_complex_float.c \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ lu/clu.c \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ lu/clu_pivot.c \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ lu/clu_kernels.c \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ lu/blas_complex.c \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ common/blas.c @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@lu_lu_example_complex_float_LDADD = \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@lu_lu_implicit_example_complex_float_SOURCES = \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ lu/lu_example_complex_float.c \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ lu/clu_implicit.c \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ lu/clu_implicit_pivot.c \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ lu/clu_kernels.c \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ lu/blas_complex.c \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ common/blas.c @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@lu_lu_implicit_example_complex_float_LDADD = \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@lu_lu_example_complex_double_SOURCES = \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ lu/lu_example_complex_double.c \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ lu/zlu.c \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ lu/zlu_pivot.c \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ lu/zlu_kernels.c \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ lu/blas_complex.c \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ common/blas.c @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@lu_lu_example_complex_double_LDADD = \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@lu_lu_implicit_example_complex_double_SOURCES = \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ lu/lu_example_complex_double.c \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ lu/zlu_implicit.c \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ lu/zlu_implicit_pivot.c \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ lu/zlu_kernels.c \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ lu/blas_complex.c \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ common/blas.c @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@lu_lu_implicit_example_complex_double_LDADD = \ @MKL_BLAS_LIB_TRUE@@NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) ################ # Heat example # ################ @NO_BLAS_LIB_FALSE@heat_heat_SOURCES = \ @NO_BLAS_LIB_FALSE@ heat/heat.c \ @NO_BLAS_LIB_FALSE@ heat/dw_factolu.c \ @NO_BLAS_LIB_FALSE@ heat/dw_factolu_tag.c \ @NO_BLAS_LIB_FALSE@ heat/dw_factolu_grain.c \ @NO_BLAS_LIB_FALSE@ heat/dw_sparse_cg.c \ @NO_BLAS_LIB_FALSE@ heat/heat_display.c \ @NO_BLAS_LIB_FALSE@ heat/lu_kernels_model.c \ @NO_BLAS_LIB_FALSE@ heat/dw_sparse_cg_kernels.c \ @NO_BLAS_LIB_FALSE@ heat/dw_factolu_kernels.c \ @NO_BLAS_LIB_FALSE@ common/blas.c @NO_BLAS_LIB_FALSE@heat_heat_LDADD = \ @NO_BLAS_LIB_FALSE@ $(STARPU_OPENGL_RENDER_LDFLAGS) \ @NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) ############## # CG example # ############## @NO_BLAS_LIB_FALSE@cg_cg_SOURCES = \ @NO_BLAS_LIB_FALSE@ cg/cg.c \ @NO_BLAS_LIB_FALSE@ cg/cg_kernels.c \ @NO_BLAS_LIB_FALSE@ common/blas.c @NO_BLAS_LIB_FALSE@cg_cg_LDADD = \ @NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) ################ # SPMD example # ################ spmd_vector_scal_spmd_SOURCES = \ spmd/vector_scal_spmd.c ################ # SpMV example # ################ spmv_spmv_SOURCES = spmv/spmv.c spmv/spmv_kernels.c $(am__append_38) @ATLAS_BLAS_LIB_TRUE@spmv_dw_block_spmv_SOURCES = \ @ATLAS_BLAS_LIB_TRUE@ spmv/dw_block_spmv.c \ @ATLAS_BLAS_LIB_TRUE@ spmv/dw_block_spmv_kernels.c \ @ATLAS_BLAS_LIB_TRUE@ spmv/matrix_market/mm_to_bcsr.c \ @ATLAS_BLAS_LIB_TRUE@ spmv/matrix_market/mmio.c @ATLAS_BLAS_LIB_TRUE@spmv_dw_block_spmv_LDADD = \ @ATLAS_BLAS_LIB_TRUE@ $(STARPU_BLAS_LDFLAGS) ########################### # C++ Incrementer example # ########################### cpp_incrementer_cpp_SOURCES = cpp/incrementer_cpp.cpp $(am__append_39) \ $(am__append_40) ####################### # Incrementer example # ####################### incrementer_incrementer_SOURCES = incrementer/incrementer.c \ $(am__append_41) $(am__append_42) ################## # Binary example # ################## binary_binary_SOURCES = binary/binary.c $(am__append_43) ##################### # interface example # ##################### interface_complex_SOURCES = interface/complex.c \ interface/complex_interface.c $(am__append_44) \ $(am__append_45) ####################### # dot_product example # ####################### reductions_dot_product_SOURCES = reductions/dot_product.c \ $(am__append_46) mandelbrot_mandelbrot_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) \ $(am__append_47) @HAVE_X11_TRUE@mandelbrot_mandelbrot_LDADD = $(X_PRE_LIBS) $(X_LIBS) -lX11 $(X_EXTRA_LIBS) top_hello_world_top_SOURCES = \ top/hello_world_top.c @STARPU_HAVE_WINDOWS_FALSE@pi_pi_SOURCES = pi/pi.c \ @STARPU_HAVE_WINDOWS_FALSE@ pi/SobolQRNG/sobol_gold.c \ @STARPU_HAVE_WINDOWS_FALSE@ pi/SobolQRNG/sobol_primitives.c \ @STARPU_HAVE_WINDOWS_FALSE@ $(am__append_49) @STARPU_HAVE_WINDOWS_FALSE@pi_pi_redux_SOURCES = pi/pi_redux.c \ @STARPU_HAVE_WINDOWS_FALSE@ $(am__append_50) @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CUDA_TRUE@pi_pi_redux_LDADD = \ @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CUDA_TRUE@ $(STARPU_CURAND_LDFLAGS) @HAVE_OPENGL_TRUE@gl_interop_gl_interop_SOURCES = \ @HAVE_OPENGL_TRUE@ gl_interop/gl_interop.c @HAVE_OPENGL_TRUE@gl_interop_gl_interop_LDADD = \ @HAVE_OPENGL_TRUE@ $(STARPU_OPENGL_RENDER_LDFLAGS) @HAVE_OPENGL_TRUE@gl_interop_gl_interop_idle_SOURCES = \ @HAVE_OPENGL_TRUE@ gl_interop/gl_interop_idle.c @HAVE_OPENGL_TRUE@gl_interop_gl_interop_idle_LDADD = \ @HAVE_OPENGL_TRUE@ $(STARPU_OPENGL_RENDER_LDFLAGS) #################### # pipeline example # #################### @NO_BLAS_LIB_FALSE@pipeline_pipeline_SOURCES = \ @NO_BLAS_LIB_FALSE@ pipeline/pipeline.c \ @NO_BLAS_LIB_FALSE@ common/blas.c @NO_BLAS_LIB_FALSE@pipeline_pipeline_LDADD = \ @NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) ################## # openmp example # ################## @STARPU_HAVE_OPENMP_TRUE@openmp_vector_scal_omp_CFLAGS = \ @STARPU_HAVE_OPENMP_TRUE@ $(AM_CFLAGS) -fopenmp @STARPU_HAVE_OPENMP_TRUE@sched_ctx_parallel_code_CFLAGS = \ @STARPU_HAVE_OPENMP_TRUE@ $(AM_CFLAGS) -fopenmp @STARPU_HAVE_OPENMP_TRUE@sched_ctx_sched_ctx_without_sched_policy_CFLAGS = \ @STARPU_HAVE_OPENMP_TRUE@ $(AM_CFLAGS) -fopenmp @STARPU_HAVE_OPENMP_TRUE@sched_ctx_nested_sched_ctxs_CFLAGS = \ @STARPU_HAVE_OPENMP_TRUE@ $(AM_CFLAGS) -fopenmp @STARPU_HAVE_OPENMP_TRUE@sched_ctx_parallel_tasks_reuse_handle_CFLAGS = \ @STARPU_HAVE_OPENMP_TRUE@ $(AM_CFLAGS) -fopenmp all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .F .c .cpp .cu .f .f90 .icc .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/starpu.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign examples/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign examples/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/starpu.mk $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): loader-cross.sh: $(top_builddir)/config.status $(srcdir)/loader-cross.sh.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-examplebinPROGRAMS: $(examplebin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(examplebin_PROGRAMS)'; test -n "$(examplebindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(examplebindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(examplebindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(examplebindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(examplebindir)$$dir" || exit $$?; \ } \ ; done uninstall-examplebinPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(examplebin_PROGRAMS)'; test -n "$(examplebindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(examplebindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(examplebindir)" && rm -f $$files clean-examplebinPROGRAMS: @list='$(examplebin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list axpy/$(am__dirstamp): @$(MKDIR_P) axpy @: > axpy/$(am__dirstamp) axpy/axpy$(EXEEXT): $(axpy_axpy_OBJECTS) $(axpy_axpy_DEPENDENCIES) $(EXTRA_axpy_axpy_DEPENDENCIES) axpy/$(am__dirstamp) @rm -f axpy/axpy$(EXEEXT) $(AM_V_CCLD)$(LINK) $(axpy_axpy_OBJECTS) $(axpy_axpy_LDADD) $(LIBS) basic_examples/$(am__dirstamp): @$(MKDIR_P) basic_examples @: > basic_examples/$(am__dirstamp) basic_examples/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) basic_examples/$(DEPDIR) @: > basic_examples/$(DEPDIR)/$(am__dirstamp) basic_examples/block_cuda.$(OBJEXT): basic_examples/$(am__dirstamp) \ basic_examples/$(DEPDIR)/$(am__dirstamp) basic_examples/block$(EXEEXT): $(basic_examples_block_OBJECTS) $(basic_examples_block_DEPENDENCIES) $(EXTRA_basic_examples_block_DEPENDENCIES) basic_examples/$(am__dirstamp) @rm -f basic_examples/block$(EXEEXT) $(AM_V_CCLD)$(LINK) $(basic_examples_block_OBJECTS) $(basic_examples_block_LDADD) $(LIBS) basic_examples/dynamic_handles$(EXEEXT): $(basic_examples_dynamic_handles_OBJECTS) $(basic_examples_dynamic_handles_DEPENDENCIES) $(EXTRA_basic_examples_dynamic_handles_DEPENDENCIES) basic_examples/$(am__dirstamp) @rm -f basic_examples/dynamic_handles$(EXEEXT) $(AM_V_CCLD)$(LINK) $(basic_examples_dynamic_handles_OBJECTS) $(basic_examples_dynamic_handles_LDADD) $(LIBS) basic_examples/hello_world$(EXEEXT): $(basic_examples_hello_world_OBJECTS) $(basic_examples_hello_world_DEPENDENCIES) $(EXTRA_basic_examples_hello_world_DEPENDENCIES) basic_examples/$(am__dirstamp) @rm -f basic_examples/hello_world$(EXEEXT) $(AM_V_CCLD)$(LINK) $(basic_examples_hello_world_OBJECTS) $(basic_examples_hello_world_LDADD) $(LIBS) basic_examples/mult$(EXEEXT): $(basic_examples_mult_OBJECTS) $(basic_examples_mult_DEPENDENCIES) $(EXTRA_basic_examples_mult_DEPENDENCIES) basic_examples/$(am__dirstamp) @rm -f basic_examples/mult$(EXEEXT) $(AM_V_CCLD)$(LINK) $(basic_examples_mult_OBJECTS) $(basic_examples_mult_LDADD) $(LIBS) basic_examples/multiformat_cuda.$(OBJEXT): \ basic_examples/$(am__dirstamp) \ basic_examples/$(DEPDIR)/$(am__dirstamp) basic_examples/multiformat_conversion_codelets_cuda.$(OBJEXT): \ basic_examples/$(am__dirstamp) \ basic_examples/$(DEPDIR)/$(am__dirstamp) basic_examples/multiformat$(EXEEXT): $(basic_examples_multiformat_OBJECTS) $(basic_examples_multiformat_DEPENDENCIES) $(EXTRA_basic_examples_multiformat_DEPENDENCIES) basic_examples/$(am__dirstamp) @rm -f basic_examples/multiformat$(EXEEXT) $(AM_V_CCLD)$(LINK) $(basic_examples_multiformat_OBJECTS) $(basic_examples_multiformat_LDADD) $(LIBS) basic_examples/variable_kernels.$(OBJEXT): \ basic_examples/$(am__dirstamp) \ basic_examples/$(DEPDIR)/$(am__dirstamp) basic_examples/variable$(EXEEXT): $(basic_examples_variable_OBJECTS) $(basic_examples_variable_DEPENDENCIES) $(EXTRA_basic_examples_variable_DEPENDENCIES) basic_examples/$(am__dirstamp) @rm -f basic_examples/variable$(EXEEXT) $(AM_V_CCLD)$(LINK) $(basic_examples_variable_OBJECTS) $(basic_examples_variable_LDADD) $(LIBS) basic_examples/vector_scal_cpu_icc.$(OBJEXT): \ basic_examples/$(am__dirstamp) \ basic_examples/$(DEPDIR)/$(am__dirstamp) basic_examples/vector_scal_cuda.$(OBJEXT): \ basic_examples/$(am__dirstamp) \ basic_examples/$(DEPDIR)/$(am__dirstamp) basic_examples/vector_scal$(EXEEXT): $(basic_examples_vector_scal_OBJECTS) $(basic_examples_vector_scal_DEPENDENCIES) $(EXTRA_basic_examples_vector_scal_DEPENDENCIES) basic_examples/$(am__dirstamp) @rm -f basic_examples/vector_scal$(EXEEXT) $(AM_V_GEN)$(basic_examples_vector_scal_LINK) $(basic_examples_vector_scal_OBJECTS) $(basic_examples_vector_scal_LDADD) $(LIBS) basic_examples/vector_scal_fortran$(EXEEXT): $(basic_examples_vector_scal_fortran_OBJECTS) $(basic_examples_vector_scal_fortran_DEPENDENCIES) $(EXTRA_basic_examples_vector_scal_fortran_DEPENDENCIES) basic_examples/$(am__dirstamp) @rm -f basic_examples/vector_scal_fortran$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(basic_examples_vector_scal_fortran_OBJECTS) $(basic_examples_vector_scal_fortran_LDADD) $(LIBS) binary/$(am__dirstamp): @$(MKDIR_P) binary @: > binary/$(am__dirstamp) binary/binary$(EXEEXT): $(binary_binary_OBJECTS) $(binary_binary_DEPENDENCIES) $(EXTRA_binary_binary_DEPENDENCIES) binary/$(am__dirstamp) @rm -f binary/binary$(EXEEXT) $(AM_V_CCLD)$(LINK) $(binary_binary_OBJECTS) $(binary_binary_LDADD) $(LIBS) callback/$(am__dirstamp): @$(MKDIR_P) callback @: > callback/$(am__dirstamp) callback/callback$(EXEEXT): $(callback_callback_OBJECTS) $(callback_callback_DEPENDENCIES) $(EXTRA_callback_callback_DEPENDENCIES) callback/$(am__dirstamp) @rm -f callback/callback$(EXEEXT) $(AM_V_CCLD)$(LINK) $(callback_callback_OBJECTS) $(callback_callback_LDADD) $(LIBS) callback/prologue$(EXEEXT): $(callback_prologue_OBJECTS) $(callback_prologue_DEPENDENCIES) $(EXTRA_callback_prologue_DEPENDENCIES) callback/$(am__dirstamp) @rm -f callback/prologue$(EXEEXT) $(AM_V_CCLD)$(LINK) $(callback_prologue_OBJECTS) $(callback_prologue_LDADD) $(LIBS) cg/$(am__dirstamp): @$(MKDIR_P) cg @: > cg/$(am__dirstamp) cg/cg$(EXEEXT): $(cg_cg_OBJECTS) $(cg_cg_DEPENDENCIES) $(EXTRA_cg_cg_DEPENDENCIES) cg/$(am__dirstamp) @rm -f cg/cg$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cg_cg_OBJECTS) $(cg_cg_LDADD) $(LIBS) cholesky/$(am__dirstamp): @$(MKDIR_P) cholesky @: > cholesky/$(am__dirstamp) cholesky/cholesky_grain_tag$(EXEEXT): $(cholesky_cholesky_grain_tag_OBJECTS) $(cholesky_cholesky_grain_tag_DEPENDENCIES) $(EXTRA_cholesky_cholesky_grain_tag_DEPENDENCIES) cholesky/$(am__dirstamp) @rm -f cholesky/cholesky_grain_tag$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cholesky_cholesky_grain_tag_OBJECTS) $(cholesky_cholesky_grain_tag_LDADD) $(LIBS) cholesky/cholesky_implicit$(EXEEXT): $(cholesky_cholesky_implicit_OBJECTS) $(cholesky_cholesky_implicit_DEPENDENCIES) $(EXTRA_cholesky_cholesky_implicit_DEPENDENCIES) cholesky/$(am__dirstamp) @rm -f cholesky/cholesky_implicit$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cholesky_cholesky_implicit_OBJECTS) $(cholesky_cholesky_implicit_LDADD) $(LIBS) cholesky/cholesky_tag$(EXEEXT): $(cholesky_cholesky_tag_OBJECTS) $(cholesky_cholesky_tag_DEPENDENCIES) $(EXTRA_cholesky_cholesky_tag_DEPENDENCIES) cholesky/$(am__dirstamp) @rm -f cholesky/cholesky_tag$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cholesky_cholesky_tag_OBJECTS) $(cholesky_cholesky_tag_LDADD) $(LIBS) cholesky/cholesky_tile_tag$(EXEEXT): $(cholesky_cholesky_tile_tag_OBJECTS) $(cholesky_cholesky_tile_tag_DEPENDENCIES) $(EXTRA_cholesky_cholesky_tile_tag_DEPENDENCIES) cholesky/$(am__dirstamp) @rm -f cholesky/cholesky_tile_tag$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cholesky_cholesky_tile_tag_OBJECTS) $(cholesky_cholesky_tile_tag_LDADD) $(LIBS) incrementer/$(am__dirstamp): @$(MKDIR_P) incrementer @: > incrementer/$(am__dirstamp) incrementer/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) incrementer/$(DEPDIR) @: > incrementer/$(DEPDIR)/$(am__dirstamp) incrementer/incrementer_kernels.$(OBJEXT): \ incrementer/$(am__dirstamp) \ incrementer/$(DEPDIR)/$(am__dirstamp) cpp/$(am__dirstamp): @$(MKDIR_P) cpp @: > cpp/$(am__dirstamp) cpp/incrementer_cpp$(EXEEXT): $(cpp_incrementer_cpp_OBJECTS) $(cpp_incrementer_cpp_DEPENDENCIES) $(EXTRA_cpp_incrementer_cpp_DEPENDENCIES) cpp/$(am__dirstamp) @rm -f cpp/incrementer_cpp$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(cpp_incrementer_cpp_OBJECTS) $(cpp_incrementer_cpp_LDADD) $(LIBS) filters/custom_mf/$(am__dirstamp): @$(MKDIR_P) filters/custom_mf @: > filters/custom_mf/$(am__dirstamp) filters/custom_mf/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) filters/custom_mf/$(DEPDIR) @: > filters/custom_mf/$(DEPDIR)/$(am__dirstamp) filters/custom_mf/conversion.$(OBJEXT): \ filters/custom_mf/$(am__dirstamp) \ filters/custom_mf/$(DEPDIR)/$(am__dirstamp) filters/custom_mf/cuda.$(OBJEXT): filters/custom_mf/$(am__dirstamp) \ filters/custom_mf/$(DEPDIR)/$(am__dirstamp) filters/custom_mf/custom_mf_filter$(EXEEXT): $(filters_custom_mf_custom_mf_filter_OBJECTS) $(filters_custom_mf_custom_mf_filter_DEPENDENCIES) $(EXTRA_filters_custom_mf_custom_mf_filter_DEPENDENCIES) filters/custom_mf/$(am__dirstamp) @rm -f filters/custom_mf/custom_mf_filter$(EXEEXT) $(AM_V_CCLD)$(LINK) $(filters_custom_mf_custom_mf_filter_OBJECTS) $(filters_custom_mf_custom_mf_filter_LDADD) $(LIBS) filters/$(am__dirstamp): @$(MKDIR_P) filters @: > filters/$(am__dirstamp) filters/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) filters/$(DEPDIR) @: > filters/$(DEPDIR)/$(am__dirstamp) filters/fblock_cuda.$(OBJEXT): filters/$(am__dirstamp) \ filters/$(DEPDIR)/$(am__dirstamp) filters/fblock$(EXEEXT): $(filters_fblock_OBJECTS) $(filters_fblock_DEPENDENCIES) $(EXTRA_filters_fblock_DEPENDENCIES) filters/$(am__dirstamp) @rm -f filters/fblock$(EXEEXT) $(AM_V_CCLD)$(LINK) $(filters_fblock_OBJECTS) $(filters_fblock_LDADD) $(LIBS) filters/fmatrix$(EXEEXT): $(filters_fmatrix_OBJECTS) $(filters_fmatrix_DEPENDENCIES) $(EXTRA_filters_fmatrix_DEPENDENCIES) filters/$(am__dirstamp) @rm -f filters/fmatrix$(EXEEXT) $(AM_V_CCLD)$(LINK) $(filters_fmatrix_OBJECTS) $(filters_fmatrix_LDADD) $(LIBS) filters/fmultiple_cuda.$(OBJEXT): filters/$(am__dirstamp) \ filters/$(DEPDIR)/$(am__dirstamp) filters/fmultiple_manual$(EXEEXT): $(filters_fmultiple_manual_OBJECTS) $(filters_fmultiple_manual_DEPENDENCIES) $(EXTRA_filters_fmultiple_manual_DEPENDENCIES) filters/$(am__dirstamp) @rm -f filters/fmultiple_manual$(EXEEXT) $(AM_V_CCLD)$(LINK) $(filters_fmultiple_manual_OBJECTS) $(filters_fmultiple_manual_LDADD) $(LIBS) filters/fmultiple_submit$(EXEEXT): $(filters_fmultiple_submit_OBJECTS) $(filters_fmultiple_submit_DEPENDENCIES) $(EXTRA_filters_fmultiple_submit_DEPENDENCIES) filters/$(am__dirstamp) @rm -f filters/fmultiple_submit$(EXEEXT) $(AM_V_CCLD)$(LINK) $(filters_fmultiple_submit_OBJECTS) $(filters_fmultiple_submit_LDADD) $(LIBS) filters/fmultiple_submit_readonly$(EXEEXT): $(filters_fmultiple_submit_readonly_OBJECTS) $(filters_fmultiple_submit_readonly_DEPENDENCIES) $(EXTRA_filters_fmultiple_submit_readonly_DEPENDENCIES) filters/$(am__dirstamp) @rm -f filters/fmultiple_submit_readonly$(EXEEXT) $(AM_V_CCLD)$(LINK) $(filters_fmultiple_submit_readonly_OBJECTS) $(filters_fmultiple_submit_readonly_LDADD) $(LIBS) filters/fvector$(EXEEXT): $(filters_fvector_OBJECTS) $(filters_fvector_DEPENDENCIES) $(EXTRA_filters_fvector_DEPENDENCIES) filters/$(am__dirstamp) @rm -f filters/fvector$(EXEEXT) $(AM_V_CCLD)$(LINK) $(filters_fvector_OBJECTS) $(filters_fvector_LDADD) $(LIBS) filters/shadow$(EXEEXT): $(filters_shadow_OBJECTS) $(filters_shadow_DEPENDENCIES) $(EXTRA_filters_shadow_DEPENDENCIES) filters/$(am__dirstamp) @rm -f filters/shadow$(EXEEXT) $(AM_V_CCLD)$(LINK) $(filters_shadow_OBJECTS) $(filters_shadow_LDADD) $(LIBS) filters/shadow2d$(EXEEXT): $(filters_shadow2d_OBJECTS) $(filters_shadow2d_DEPENDENCIES) $(EXTRA_filters_shadow2d_DEPENDENCIES) filters/$(am__dirstamp) @rm -f filters/shadow2d$(EXEEXT) $(AM_V_CCLD)$(LINK) $(filters_shadow2d_OBJECTS) $(filters_shadow2d_LDADD) $(LIBS) filters/shadow3d$(EXEEXT): $(filters_shadow3d_OBJECTS) $(filters_shadow3d_DEPENDENCIES) $(EXTRA_filters_shadow3d_DEPENDENCIES) filters/$(am__dirstamp) @rm -f filters/shadow3d$(EXEEXT) $(AM_V_CCLD)$(LINK) $(filters_shadow3d_OBJECTS) $(filters_shadow3d_LDADD) $(LIBS) fortran/$(am__dirstamp): @$(MKDIR_P) fortran @: > fortran/$(am__dirstamp) fortran/hello$(EXEEXT): $(fortran_hello_OBJECTS) $(fortran_hello_DEPENDENCIES) $(EXTRA_fortran_hello_DEPENDENCIES) fortran/$(am__dirstamp) @rm -f fortran/hello$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(fortran_hello_OBJECTS) $(fortran_hello_LDADD) $(LIBS) fortran90/$(am__dirstamp): @$(MKDIR_P) fortran90 @: > fortran90/$(am__dirstamp) fortran90/f90_example$(EXEEXT): $(fortran90_f90_example_OBJECTS) $(fortran90_f90_example_DEPENDENCIES) $(EXTRA_fortran90_f90_example_DEPENDENCIES) fortran90/$(am__dirstamp) @rm -f fortran90/f90_example$(EXEEXT) $(AM_V_FCLD)$(FCLINK) $(fortran90_f90_example_OBJECTS) $(fortran90_f90_example_LDADD) $(LIBS) gl_interop/$(am__dirstamp): @$(MKDIR_P) gl_interop @: > gl_interop/$(am__dirstamp) gl_interop/gl_interop$(EXEEXT): $(gl_interop_gl_interop_OBJECTS) $(gl_interop_gl_interop_DEPENDENCIES) $(EXTRA_gl_interop_gl_interop_DEPENDENCIES) gl_interop/$(am__dirstamp) @rm -f gl_interop/gl_interop$(EXEEXT) $(AM_V_CCLD)$(LINK) $(gl_interop_gl_interop_OBJECTS) $(gl_interop_gl_interop_LDADD) $(LIBS) gl_interop/gl_interop_idle$(EXEEXT): $(gl_interop_gl_interop_idle_OBJECTS) $(gl_interop_gl_interop_idle_DEPENDENCIES) $(EXTRA_gl_interop_gl_interop_idle_DEPENDENCIES) gl_interop/$(am__dirstamp) @rm -f gl_interop/gl_interop_idle$(EXEEXT) $(AM_V_CCLD)$(LINK) $(gl_interop_gl_interop_idle_OBJECTS) $(gl_interop_gl_interop_idle_LDADD) $(LIBS) heat/$(am__dirstamp): @$(MKDIR_P) heat @: > heat/$(am__dirstamp) heat/heat$(EXEEXT): $(heat_heat_OBJECTS) $(heat_heat_DEPENDENCIES) $(EXTRA_heat_heat_DEPENDENCIES) heat/$(am__dirstamp) @rm -f heat/heat$(EXEEXT) $(AM_V_CCLD)$(LINK) $(heat_heat_OBJECTS) $(heat_heat_LDADD) $(LIBS) incrementer/incrementer$(EXEEXT): $(incrementer_incrementer_OBJECTS) $(incrementer_incrementer_DEPENDENCIES) $(EXTRA_incrementer_incrementer_DEPENDENCIES) incrementer/$(am__dirstamp) @rm -f incrementer/incrementer$(EXEEXT) $(AM_V_CCLD)$(LINK) $(incrementer_incrementer_OBJECTS) $(incrementer_incrementer_LDADD) $(LIBS) interface/$(am__dirstamp): @$(MKDIR_P) interface @: > interface/$(am__dirstamp) interface/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) interface/$(DEPDIR) @: > interface/$(DEPDIR)/$(am__dirstamp) interface/complex_kernels.$(OBJEXT): interface/$(am__dirstamp) \ interface/$(DEPDIR)/$(am__dirstamp) interface/complex$(EXEEXT): $(interface_complex_OBJECTS) $(interface_complex_DEPENDENCIES) $(EXTRA_interface_complex_DEPENDENCIES) interface/$(am__dirstamp) @rm -f interface/complex$(EXEEXT) $(AM_V_CCLD)$(LINK) $(interface_complex_OBJECTS) $(interface_complex_LDADD) $(LIBS) loader$(EXEEXT): $(loader_OBJECTS) $(loader_DEPENDENCIES) $(EXTRA_loader_DEPENDENCIES) @rm -f loader$(EXEEXT) $(AM_V_CCLD)$(LINK) $(loader_OBJECTS) $(loader_LDADD) $(LIBS) lu/$(am__dirstamp): @$(MKDIR_P) lu @: > lu/$(am__dirstamp) lu/lu_example_complex_double$(EXEEXT): $(lu_lu_example_complex_double_OBJECTS) $(lu_lu_example_complex_double_DEPENDENCIES) $(EXTRA_lu_lu_example_complex_double_DEPENDENCIES) lu/$(am__dirstamp) @rm -f lu/lu_example_complex_double$(EXEEXT) $(AM_V_CCLD)$(LINK) $(lu_lu_example_complex_double_OBJECTS) $(lu_lu_example_complex_double_LDADD) $(LIBS) lu/lu_example_complex_float$(EXEEXT): $(lu_lu_example_complex_float_OBJECTS) $(lu_lu_example_complex_float_DEPENDENCIES) $(EXTRA_lu_lu_example_complex_float_DEPENDENCIES) lu/$(am__dirstamp) @rm -f lu/lu_example_complex_float$(EXEEXT) $(AM_V_CCLD)$(LINK) $(lu_lu_example_complex_float_OBJECTS) $(lu_lu_example_complex_float_LDADD) $(LIBS) lu/lu_example_double$(EXEEXT): $(lu_lu_example_double_OBJECTS) $(lu_lu_example_double_DEPENDENCIES) $(EXTRA_lu_lu_example_double_DEPENDENCIES) lu/$(am__dirstamp) @rm -f lu/lu_example_double$(EXEEXT) $(AM_V_CCLD)$(LINK) $(lu_lu_example_double_OBJECTS) $(lu_lu_example_double_LDADD) $(LIBS) lu/lu_example_float$(EXEEXT): $(lu_lu_example_float_OBJECTS) $(lu_lu_example_float_DEPENDENCIES) $(EXTRA_lu_lu_example_float_DEPENDENCIES) lu/$(am__dirstamp) @rm -f lu/lu_example_float$(EXEEXT) $(AM_V_CCLD)$(LINK) $(lu_lu_example_float_OBJECTS) $(lu_lu_example_float_LDADD) $(LIBS) lu/lu_implicit_example_complex_double$(EXEEXT): $(lu_lu_implicit_example_complex_double_OBJECTS) $(lu_lu_implicit_example_complex_double_DEPENDENCIES) $(EXTRA_lu_lu_implicit_example_complex_double_DEPENDENCIES) lu/$(am__dirstamp) @rm -f lu/lu_implicit_example_complex_double$(EXEEXT) $(AM_V_CCLD)$(LINK) $(lu_lu_implicit_example_complex_double_OBJECTS) $(lu_lu_implicit_example_complex_double_LDADD) $(LIBS) lu/lu_implicit_example_complex_float$(EXEEXT): $(lu_lu_implicit_example_complex_float_OBJECTS) $(lu_lu_implicit_example_complex_float_DEPENDENCIES) $(EXTRA_lu_lu_implicit_example_complex_float_DEPENDENCIES) lu/$(am__dirstamp) @rm -f lu/lu_implicit_example_complex_float$(EXEEXT) $(AM_V_CCLD)$(LINK) $(lu_lu_implicit_example_complex_float_OBJECTS) $(lu_lu_implicit_example_complex_float_LDADD) $(LIBS) lu/lu_implicit_example_double$(EXEEXT): $(lu_lu_implicit_example_double_OBJECTS) $(lu_lu_implicit_example_double_DEPENDENCIES) $(EXTRA_lu_lu_implicit_example_double_DEPENDENCIES) lu/$(am__dirstamp) @rm -f lu/lu_implicit_example_double$(EXEEXT) $(AM_V_CCLD)$(LINK) $(lu_lu_implicit_example_double_OBJECTS) $(lu_lu_implicit_example_double_LDADD) $(LIBS) lu/lu_implicit_example_float$(EXEEXT): $(lu_lu_implicit_example_float_OBJECTS) $(lu_lu_implicit_example_float_DEPENDENCIES) $(EXTRA_lu_lu_implicit_example_float_DEPENDENCIES) lu/$(am__dirstamp) @rm -f lu/lu_implicit_example_float$(EXEEXT) $(AM_V_CCLD)$(LINK) $(lu_lu_implicit_example_float_OBJECTS) $(lu_lu_implicit_example_float_LDADD) $(LIBS) mandelbrot/$(am__dirstamp): @$(MKDIR_P) mandelbrot @: > mandelbrot/$(am__dirstamp) mandelbrot/mandelbrot$(EXEEXT): $(mandelbrot_mandelbrot_OBJECTS) $(mandelbrot_mandelbrot_DEPENDENCIES) $(EXTRA_mandelbrot_mandelbrot_DEPENDENCIES) mandelbrot/$(am__dirstamp) @rm -f mandelbrot/mandelbrot$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mandelbrot_mandelbrot_OBJECTS) $(mandelbrot_mandelbrot_LDADD) $(LIBS) matvecmult/$(am__dirstamp): @$(MKDIR_P) matvecmult @: > matvecmult/$(am__dirstamp) matvecmult/matvecmult$(EXEEXT): $(matvecmult_matvecmult_OBJECTS) $(matvecmult_matvecmult_DEPENDENCIES) $(EXTRA_matvecmult_matvecmult_DEPENDENCIES) matvecmult/$(am__dirstamp) @rm -f matvecmult/matvecmult$(EXEEXT) $(AM_V_CCLD)$(LINK) $(matvecmult_matvecmult_OBJECTS) $(matvecmult_matvecmult_LDADD) $(LIBS) mult/$(am__dirstamp): @$(MKDIR_P) mult @: > mult/$(am__dirstamp) mult/dgemm$(EXEEXT): $(mult_dgemm_OBJECTS) $(mult_dgemm_DEPENDENCIES) $(EXTRA_mult_dgemm_DEPENDENCIES) mult/$(am__dirstamp) @rm -f mult/dgemm$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mult_dgemm_OBJECTS) $(mult_dgemm_LDADD) $(LIBS) mult/sgemm$(EXEEXT): $(mult_sgemm_OBJECTS) $(mult_sgemm_DEPENDENCIES) $(EXTRA_mult_sgemm_DEPENDENCIES) mult/$(am__dirstamp) @rm -f mult/sgemm$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mult_sgemm_OBJECTS) $(mult_sgemm_LDADD) $(LIBS) native_fortran/$(am__dirstamp): @$(MKDIR_P) native_fortran @: > native_fortran/$(am__dirstamp) native_fortran/nf_dynbuf$(EXEEXT): $(native_fortran_nf_dynbuf_OBJECTS) $(native_fortran_nf_dynbuf_DEPENDENCIES) $(EXTRA_native_fortran_nf_dynbuf_DEPENDENCIES) native_fortran/$(am__dirstamp) @rm -f native_fortran/nf_dynbuf$(EXEEXT) $(AM_V_FCLD)$(FCLINK) $(native_fortran_nf_dynbuf_OBJECTS) $(native_fortran_nf_dynbuf_LDADD) $(LIBS) native_fortran/nf_example$(EXEEXT): $(native_fortran_nf_example_OBJECTS) $(native_fortran_nf_example_DEPENDENCIES) $(EXTRA_native_fortran_nf_example_DEPENDENCIES) native_fortran/$(am__dirstamp) @rm -f native_fortran/nf_example$(EXEEXT) $(AM_V_FCLD)$(FCLINK) $(native_fortran_nf_example_OBJECTS) $(native_fortran_nf_example_LDADD) $(LIBS) native_fortran/nf_matrix$(EXEEXT): $(native_fortran_nf_matrix_OBJECTS) $(native_fortran_nf_matrix_DEPENDENCIES) $(EXTRA_native_fortran_nf_matrix_DEPENDENCIES) native_fortran/$(am__dirstamp) @rm -f native_fortran/nf_matrix$(EXEEXT) $(AM_V_FCLD)$(FCLINK) $(native_fortran_nf_matrix_OBJECTS) $(native_fortran_nf_matrix_LDADD) $(LIBS) native_fortran/nf_partition$(EXEEXT): $(native_fortran_nf_partition_OBJECTS) $(native_fortran_nf_partition_DEPENDENCIES) $(EXTRA_native_fortran_nf_partition_DEPENDENCIES) native_fortran/$(am__dirstamp) @rm -f native_fortran/nf_partition$(EXEEXT) $(AM_V_FCLD)$(FCLINK) $(native_fortran_nf_partition_OBJECTS) $(native_fortran_nf_partition_LDADD) $(LIBS) native_fortran/nf_sched_ctx$(EXEEXT): $(native_fortran_nf_sched_ctx_OBJECTS) $(native_fortran_nf_sched_ctx_DEPENDENCIES) $(EXTRA_native_fortran_nf_sched_ctx_DEPENDENCIES) native_fortran/$(am__dirstamp) @rm -f native_fortran/nf_sched_ctx$(EXEEXT) $(AM_V_FCLD)$(FCLINK) $(native_fortran_nf_sched_ctx_OBJECTS) $(native_fortran_nf_sched_ctx_LDADD) $(LIBS) native_fortran/nf_varbuf$(EXEEXT): $(native_fortran_nf_varbuf_OBJECTS) $(native_fortran_nf_varbuf_DEPENDENCIES) $(EXTRA_native_fortran_nf_varbuf_DEPENDENCIES) native_fortran/$(am__dirstamp) @rm -f native_fortran/nf_varbuf$(EXEEXT) $(AM_V_FCLD)$(FCLINK) $(native_fortran_nf_varbuf_OBJECTS) $(native_fortran_nf_varbuf_LDADD) $(LIBS) native_fortran/nf_vector$(EXEEXT): $(native_fortran_nf_vector_OBJECTS) $(native_fortran_nf_vector_DEPENDENCIES) $(EXTRA_native_fortran_nf_vector_DEPENDENCIES) native_fortran/$(am__dirstamp) @rm -f native_fortran/nf_vector$(EXEEXT) $(AM_V_FCLD)$(FCLINK) $(native_fortran_nf_vector_OBJECTS) $(native_fortran_nf_vector_LDADD) $(LIBS) openmp/$(am__dirstamp): @$(MKDIR_P) openmp @: > openmp/$(am__dirstamp) openmp/vector_scal_omp$(EXEEXT): $(openmp_vector_scal_omp_OBJECTS) $(openmp_vector_scal_omp_DEPENDENCIES) $(EXTRA_openmp_vector_scal_omp_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/vector_scal_omp$(EXEEXT) $(AM_V_CCLD)$(openmp_vector_scal_omp_LINK) $(openmp_vector_scal_omp_OBJECTS) $(openmp_vector_scal_omp_LDADD) $(LIBS) pi/$(am__dirstamp): @$(MKDIR_P) pi @: > pi/$(am__dirstamp) pi/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) pi/$(DEPDIR) @: > pi/$(DEPDIR)/$(am__dirstamp) pi/pi_kernel.$(OBJEXT): pi/$(am__dirstamp) \ pi/$(DEPDIR)/$(am__dirstamp) pi/SobolQRNG/$(am__dirstamp): @$(MKDIR_P) pi/SobolQRNG @: > pi/SobolQRNG/$(am__dirstamp) pi/SobolQRNG/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) pi/SobolQRNG/$(DEPDIR) @: > pi/SobolQRNG/$(DEPDIR)/$(am__dirstamp) pi/SobolQRNG/sobol_gpu.$(OBJEXT): pi/SobolQRNG/$(am__dirstamp) \ pi/SobolQRNG/$(DEPDIR)/$(am__dirstamp) pi/pi$(EXEEXT): $(pi_pi_OBJECTS) $(pi_pi_DEPENDENCIES) $(EXTRA_pi_pi_DEPENDENCIES) pi/$(am__dirstamp) @rm -f pi/pi$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pi_pi_OBJECTS) $(pi_pi_LDADD) $(LIBS) pi/pi_redux_kernel.$(OBJEXT): pi/$(am__dirstamp) \ pi/$(DEPDIR)/$(am__dirstamp) pi/pi_redux$(EXEEXT): $(pi_pi_redux_OBJECTS) $(pi_pi_redux_DEPENDENCIES) $(EXTRA_pi_pi_redux_DEPENDENCIES) pi/$(am__dirstamp) @rm -f pi/pi_redux$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pi_pi_redux_OBJECTS) $(pi_pi_redux_LDADD) $(LIBS) pipeline/$(am__dirstamp): @$(MKDIR_P) pipeline @: > pipeline/$(am__dirstamp) pipeline/pipeline$(EXEEXT): $(pipeline_pipeline_OBJECTS) $(pipeline_pipeline_DEPENDENCIES) $(EXTRA_pipeline_pipeline_DEPENDENCIES) pipeline/$(am__dirstamp) @rm -f pipeline/pipeline$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pipeline_pipeline_OBJECTS) $(pipeline_pipeline_LDADD) $(LIBS) ppm_downscaler/$(am__dirstamp): @$(MKDIR_P) ppm_downscaler @: > ppm_downscaler/$(am__dirstamp) ppm_downscaler/ppm_downscaler$(EXEEXT): $(ppm_downscaler_ppm_downscaler_OBJECTS) $(ppm_downscaler_ppm_downscaler_DEPENDENCIES) $(EXTRA_ppm_downscaler_ppm_downscaler_DEPENDENCIES) ppm_downscaler/$(am__dirstamp) @rm -f ppm_downscaler/ppm_downscaler$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ppm_downscaler_ppm_downscaler_OBJECTS) $(ppm_downscaler_ppm_downscaler_LDADD) $(LIBS) ppm_downscaler/yuv_downscaler$(EXEEXT): $(ppm_downscaler_yuv_downscaler_OBJECTS) $(ppm_downscaler_yuv_downscaler_DEPENDENCIES) $(EXTRA_ppm_downscaler_yuv_downscaler_DEPENDENCIES) ppm_downscaler/$(am__dirstamp) @rm -f ppm_downscaler/yuv_downscaler$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ppm_downscaler_yuv_downscaler_OBJECTS) $(ppm_downscaler_yuv_downscaler_LDADD) $(LIBS) profiling/$(am__dirstamp): @$(MKDIR_P) profiling @: > profiling/$(am__dirstamp) profiling/profiling$(EXEEXT): $(profiling_profiling_OBJECTS) $(profiling_profiling_DEPENDENCIES) $(EXTRA_profiling_profiling_DEPENDENCIES) profiling/$(am__dirstamp) @rm -f profiling/profiling$(EXEEXT) $(AM_V_CCLD)$(LINK) $(profiling_profiling_OBJECTS) $(profiling_profiling_LDADD) $(LIBS) reductions/$(am__dirstamp): @$(MKDIR_P) reductions @: > reductions/$(am__dirstamp) reductions/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) reductions/$(DEPDIR) @: > reductions/$(DEPDIR)/$(am__dirstamp) reductions/dot_product_kernels.$(OBJEXT): reductions/$(am__dirstamp) \ reductions/$(DEPDIR)/$(am__dirstamp) reductions/dot_product$(EXEEXT): $(reductions_dot_product_OBJECTS) $(reductions_dot_product_DEPENDENCIES) $(EXTRA_reductions_dot_product_DEPENDENCIES) reductions/$(am__dirstamp) @rm -f reductions/dot_product$(EXEEXT) $(AM_V_CCLD)$(LINK) $(reductions_dot_product_OBJECTS) $(reductions_dot_product_LDADD) $(LIBS) reductions/minmax_reduction$(EXEEXT): $(reductions_minmax_reduction_OBJECTS) $(reductions_minmax_reduction_DEPENDENCIES) $(EXTRA_reductions_minmax_reduction_DEPENDENCIES) reductions/$(am__dirstamp) @rm -f reductions/minmax_reduction$(EXEEXT) $(AM_V_CCLD)$(LINK) $(reductions_minmax_reduction_OBJECTS) $(reductions_minmax_reduction_LDADD) $(LIBS) sched_ctx/$(am__dirstamp): @$(MKDIR_P) sched_ctx @: > sched_ctx/$(am__dirstamp) sched_ctx/dummy_sched_with_ctx$(EXEEXT): $(sched_ctx_dummy_sched_with_ctx_OBJECTS) $(sched_ctx_dummy_sched_with_ctx_DEPENDENCIES) $(EXTRA_sched_ctx_dummy_sched_with_ctx_DEPENDENCIES) sched_ctx/$(am__dirstamp) @rm -f sched_ctx/dummy_sched_with_ctx$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sched_ctx_dummy_sched_with_ctx_OBJECTS) $(sched_ctx_dummy_sched_with_ctx_LDADD) $(LIBS) sched_ctx/nested_sched_ctxs$(EXEEXT): $(sched_ctx_nested_sched_ctxs_OBJECTS) $(sched_ctx_nested_sched_ctxs_DEPENDENCIES) $(EXTRA_sched_ctx_nested_sched_ctxs_DEPENDENCIES) sched_ctx/$(am__dirstamp) @rm -f sched_ctx/nested_sched_ctxs$(EXEEXT) $(AM_V_CCLD)$(sched_ctx_nested_sched_ctxs_LINK) $(sched_ctx_nested_sched_ctxs_OBJECTS) $(sched_ctx_nested_sched_ctxs_LDADD) $(LIBS) sched_ctx/parallel_code$(EXEEXT): $(sched_ctx_parallel_code_OBJECTS) $(sched_ctx_parallel_code_DEPENDENCIES) $(EXTRA_sched_ctx_parallel_code_DEPENDENCIES) sched_ctx/$(am__dirstamp) @rm -f sched_ctx/parallel_code$(EXEEXT) $(AM_V_CCLD)$(sched_ctx_parallel_code_LINK) $(sched_ctx_parallel_code_OBJECTS) $(sched_ctx_parallel_code_LDADD) $(LIBS) sched_ctx/parallel_tasks_reuse_handle$(EXEEXT): $(sched_ctx_parallel_tasks_reuse_handle_OBJECTS) $(sched_ctx_parallel_tasks_reuse_handle_DEPENDENCIES) $(EXTRA_sched_ctx_parallel_tasks_reuse_handle_DEPENDENCIES) sched_ctx/$(am__dirstamp) @rm -f sched_ctx/parallel_tasks_reuse_handle$(EXEEXT) $(AM_V_CCLD)$(sched_ctx_parallel_tasks_reuse_handle_LINK) $(sched_ctx_parallel_tasks_reuse_handle_OBJECTS) $(sched_ctx_parallel_tasks_reuse_handle_LDADD) $(LIBS) sched_ctx/prio$(EXEEXT): $(sched_ctx_prio_OBJECTS) $(sched_ctx_prio_DEPENDENCIES) $(EXTRA_sched_ctx_prio_DEPENDENCIES) sched_ctx/$(am__dirstamp) @rm -f sched_ctx/prio$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sched_ctx_prio_OBJECTS) $(sched_ctx_prio_LDADD) $(LIBS) sched_ctx/sched_ctx$(EXEEXT): $(sched_ctx_sched_ctx_OBJECTS) $(sched_ctx_sched_ctx_DEPENDENCIES) $(EXTRA_sched_ctx_sched_ctx_DEPENDENCIES) sched_ctx/$(am__dirstamp) @rm -f sched_ctx/sched_ctx$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sched_ctx_sched_ctx_OBJECTS) $(sched_ctx_sched_ctx_LDADD) $(LIBS) sched_ctx/sched_ctx_without_sched_policy$(EXEEXT): $(sched_ctx_sched_ctx_without_sched_policy_OBJECTS) $(sched_ctx_sched_ctx_without_sched_policy_DEPENDENCIES) $(EXTRA_sched_ctx_sched_ctx_without_sched_policy_DEPENDENCIES) sched_ctx/$(am__dirstamp) @rm -f sched_ctx/sched_ctx_without_sched_policy$(EXEEXT) $(AM_V_CCLD)$(sched_ctx_sched_ctx_without_sched_policy_LINK) $(sched_ctx_sched_ctx_without_sched_policy_OBJECTS) $(sched_ctx_sched_ctx_without_sched_policy_LDADD) $(LIBS) sched_ctx/sched_ctx_without_sched_policy_awake$(EXEEXT): $(sched_ctx_sched_ctx_without_sched_policy_awake_OBJECTS) $(sched_ctx_sched_ctx_without_sched_policy_awake_DEPENDENCIES) $(EXTRA_sched_ctx_sched_ctx_without_sched_policy_awake_DEPENDENCIES) sched_ctx/$(am__dirstamp) @rm -f sched_ctx/sched_ctx_without_sched_policy_awake$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sched_ctx_sched_ctx_without_sched_policy_awake_OBJECTS) $(sched_ctx_sched_ctx_without_sched_policy_awake_LDADD) $(LIBS) sched_ctx/two_cpu_contexts$(EXEEXT): $(sched_ctx_two_cpu_contexts_OBJECTS) $(sched_ctx_two_cpu_contexts_DEPENDENCIES) $(EXTRA_sched_ctx_two_cpu_contexts_DEPENDENCIES) sched_ctx/$(am__dirstamp) @rm -f sched_ctx/two_cpu_contexts$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sched_ctx_two_cpu_contexts_OBJECTS) $(sched_ctx_two_cpu_contexts_LDADD) $(LIBS) scheduler/$(am__dirstamp): @$(MKDIR_P) scheduler @: > scheduler/$(am__dirstamp) scheduler/dummy_sched$(EXEEXT): $(scheduler_dummy_sched_OBJECTS) $(scheduler_dummy_sched_DEPENDENCIES) $(EXTRA_scheduler_dummy_sched_DEPENDENCIES) scheduler/$(am__dirstamp) @rm -f scheduler/dummy_sched$(EXEEXT) $(AM_V_CCLD)$(LINK) $(scheduler_dummy_sched_OBJECTS) $(scheduler_dummy_sched_LDADD) $(LIBS) spmd/$(am__dirstamp): @$(MKDIR_P) spmd @: > spmd/$(am__dirstamp) spmd/vector_scal_spmd$(EXEEXT): $(spmd_vector_scal_spmd_OBJECTS) $(spmd_vector_scal_spmd_DEPENDENCIES) $(EXTRA_spmd_vector_scal_spmd_DEPENDENCIES) spmd/$(am__dirstamp) @rm -f spmd/vector_scal_spmd$(EXEEXT) $(AM_V_CCLD)$(LINK) $(spmd_vector_scal_spmd_OBJECTS) $(spmd_vector_scal_spmd_LDADD) $(LIBS) spmv/$(am__dirstamp): @$(MKDIR_P) spmv @: > spmv/$(am__dirstamp) spmv/dw_block_spmv$(EXEEXT): $(spmv_dw_block_spmv_OBJECTS) $(spmv_dw_block_spmv_DEPENDENCIES) $(EXTRA_spmv_dw_block_spmv_DEPENDENCIES) spmv/$(am__dirstamp) @rm -f spmv/dw_block_spmv$(EXEEXT) $(AM_V_CCLD)$(LINK) $(spmv_dw_block_spmv_OBJECTS) $(spmv_dw_block_spmv_LDADD) $(LIBS) spmv/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) spmv/$(DEPDIR) @: > spmv/$(DEPDIR)/$(am__dirstamp) spmv/spmv_cuda.$(OBJEXT): spmv/$(am__dirstamp) \ spmv/$(DEPDIR)/$(am__dirstamp) spmv/spmv$(EXEEXT): $(spmv_spmv_OBJECTS) $(spmv_spmv_DEPENDENCIES) $(EXTRA_spmv_spmv_DEPENDENCIES) spmv/$(am__dirstamp) @rm -f spmv/spmv$(EXEEXT) $(AM_V_CCLD)$(LINK) $(spmv_spmv_OBJECTS) $(spmv_spmv_LDADD) $(LIBS) tag_example/$(am__dirstamp): @$(MKDIR_P) tag_example @: > tag_example/$(am__dirstamp) tag_example/tag_example$(EXEEXT): $(tag_example_tag_example_OBJECTS) $(tag_example_tag_example_DEPENDENCIES) $(EXTRA_tag_example_tag_example_DEPENDENCIES) tag_example/$(am__dirstamp) @rm -f tag_example/tag_example$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tag_example_tag_example_OBJECTS) $(tag_example_tag_example_LDADD) $(LIBS) tag_example/tag_example2$(EXEEXT): $(tag_example_tag_example2_OBJECTS) $(tag_example_tag_example2_DEPENDENCIES) $(EXTRA_tag_example_tag_example2_DEPENDENCIES) tag_example/$(am__dirstamp) @rm -f tag_example/tag_example2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tag_example_tag_example2_OBJECTS) $(tag_example_tag_example2_LDADD) $(LIBS) tag_example/tag_example3$(EXEEXT): $(tag_example_tag_example3_OBJECTS) $(tag_example_tag_example3_DEPENDENCIES) $(EXTRA_tag_example_tag_example3_DEPENDENCIES) tag_example/$(am__dirstamp) @rm -f tag_example/tag_example3$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tag_example_tag_example3_OBJECTS) $(tag_example_tag_example3_LDADD) $(LIBS) tag_example/tag_example4$(EXEEXT): $(tag_example_tag_example4_OBJECTS) $(tag_example_tag_example4_DEPENDENCIES) $(EXTRA_tag_example_tag_example4_DEPENDENCIES) tag_example/$(am__dirstamp) @rm -f tag_example/tag_example4$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tag_example_tag_example4_OBJECTS) $(tag_example_tag_example4_LDADD) $(LIBS) tag_example/tag_restartable$(EXEEXT): $(tag_example_tag_restartable_OBJECTS) $(tag_example_tag_restartable_DEPENDENCIES) $(EXTRA_tag_example_tag_restartable_DEPENDENCIES) tag_example/$(am__dirstamp) @rm -f tag_example/tag_restartable$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tag_example_tag_restartable_OBJECTS) $(tag_example_tag_restartable_LDADD) $(LIBS) top/$(am__dirstamp): @$(MKDIR_P) top @: > top/$(am__dirstamp) top/hello_world_top$(EXEEXT): $(top_hello_world_top_OBJECTS) $(top_hello_world_top_DEPENDENCIES) $(EXTRA_top_hello_world_top_DEPENDENCIES) top/$(am__dirstamp) @rm -f top/hello_world_top$(EXEEXT) $(AM_V_CCLD)$(LINK) $(top_hello_world_top_OBJECTS) $(top_hello_world_top_LDADD) $(LIBS) worker_collections/$(am__dirstamp): @$(MKDIR_P) worker_collections @: > worker_collections/$(am__dirstamp) worker_collections/worker_list_example$(EXEEXT): $(worker_collections_worker_list_example_OBJECTS) $(worker_collections_worker_list_example_DEPENDENCIES) $(EXTRA_worker_collections_worker_list_example_DEPENDENCIES) worker_collections/$(am__dirstamp) @rm -f worker_collections/worker_list_example$(EXEEXT) $(AM_V_CCLD)$(LINK) $(worker_collections_worker_list_example_OBJECTS) $(worker_collections_worker_list_example_LDADD) $(LIBS) worker_collections/worker_tree_example$(EXEEXT): $(worker_collections_worker_tree_example_OBJECTS) $(worker_collections_worker_tree_example_DEPENDENCIES) $(EXTRA_worker_collections_worker_tree_example_DEPENDENCIES) worker_collections/$(am__dirstamp) @rm -f worker_collections/worker_tree_example$(EXEEXT) $(AM_V_CCLD)$(LINK) $(worker_collections_worker_tree_example_OBJECTS) $(worker_collections_worker_tree_example_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f basic_examples/*.$(OBJEXT) -rm -f filters/*.$(OBJEXT) -rm -f filters/custom_mf/*.$(OBJEXT) -rm -f incrementer/*.$(OBJEXT) -rm -f interface/*.$(OBJEXT) -rm -f pi/*.$(OBJEXT) -rm -f pi/SobolQRNG/*.$(OBJEXT) -rm -f reductions/*.$(OBJEXT) -rm -f spmv/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/axpy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/axpy_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/binary.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blas.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blas_complex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/block.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/block_cpu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/block_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callback.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cg_kernels.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky_grain_tag.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky_implicit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky_kernels.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky_models.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky_tag.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky_tile_tag.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clu_implicit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clu_implicit_pivot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clu_kernels.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clu_pivot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/complex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/complex_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/complex_kernels_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conversion_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/custom_conversion_codelets.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/custom_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/custom_mf_filter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/custom_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgemm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlu_implicit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlu_implicit_pivot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlu_kernels.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlu_pivot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dot_product.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy_sched.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy_sched_with_ctx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dw_block_spmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dw_block_spmv_kernels.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dw_factolu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dw_factolu_grain.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dw_factolu_kernels.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dw_factolu_tag.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dw_sparse_cg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dw_sparse_cg_kernels.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dynamic_handles.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fblock.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fblock_cpu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fblock_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fmatrix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fmultiple_manual.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fmultiple_submit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fmultiple_submit_readonly.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fvector.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gl_interop.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gl_interop_idle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/heat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/heat_display.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hello_c.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hello_world.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hello_world_top.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/incrementer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/incrementer_cpp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/incrementer_kernels_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loader-loader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lu_example_complex_double.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lu_example_complex_float.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lu_example_double.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lu_example_float.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lu_kernels_model.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mandelbrot_mandelbrot-mandelbrot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/marshalling.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matvecmult.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minmax_reduction.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mm_to_bcsr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmio.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mult.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_conversion_codelets.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_conversion_codelets_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openmp_vector_scal_omp-vector_scal_omp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pi_redux.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pipeline.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppm_downscaler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prio.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/profiling.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prologue.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sched_ctx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sched_ctx_nested_sched_ctxs-nested_sched_ctxs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sched_ctx_parallel_code-parallel_code.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sched_ctx_parallel_tasks_reuse_handle-parallel_tasks_reuse_handle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sched_ctx_sched_ctx_without_sched_policy-sched_ctx_without_sched_policy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sched_ctx_utils.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sched_ctx_without_sched_policy_awake.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sgemm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shadow.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shadow2d.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shadow3d.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slu_implicit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slu_implicit_pivot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slu_kernels.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slu_pivot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sobol_gold.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sobol_primitives.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spmv_kernels.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_example.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_example2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_example3.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_example4.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_restartable.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/two_cpu_contexts.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variable.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variable_kernels_cpu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variable_kernels_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_scal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_scal_c.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_scal_cpu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_scal_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_scal_spmd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/worker_list_example.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/worker_tree_example.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/yuv_downscaler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zlu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zlu_implicit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zlu_implicit_pivot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zlu_kernels.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zlu_pivot.Po@am__quote@ .F.o: $(AM_V_PPF77)$(PPF77COMPILE) -c -o $@ $< .F.obj: $(AM_V_PPF77)$(PPF77COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .F.lo: $(AM_V_PPF77)$(LTPPF77COMPILE) -c -o $@ $< vector_scal_fortran.o: basic_examples/vector_scal_fortran.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o vector_scal_fortran.o `test -f 'basic_examples/vector_scal_fortran.F' || echo '$(srcdir)/'`basic_examples/vector_scal_fortran.F vector_scal_fortran.obj: basic_examples/vector_scal_fortran.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o vector_scal_fortran.obj `if test -f 'basic_examples/vector_scal_fortran.F'; then $(CYGPATH_W) 'basic_examples/vector_scal_fortran.F'; else $(CYGPATH_W) '$(srcdir)/basic_examples/vector_scal_fortran.F'; fi` hello.o: fortran/hello.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o hello.o `test -f 'fortran/hello.F' || echo '$(srcdir)/'`fortran/hello.F hello.obj: fortran/hello.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o hello.obj `if test -f 'fortran/hello.F'; then $(CYGPATH_W) 'fortran/hello.F'; else $(CYGPATH_W) '$(srcdir)/fortran/hello.F'; fi` .F.f: $(F77COMPILE) -F $< .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< axpy.o: axpy/axpy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT axpy.o -MD -MP -MF $(DEPDIR)/axpy.Tpo -c -o axpy.o `test -f 'axpy/axpy.c' || echo '$(srcdir)/'`axpy/axpy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/axpy.Tpo $(DEPDIR)/axpy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='axpy/axpy.c' object='axpy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o axpy.o `test -f 'axpy/axpy.c' || echo '$(srcdir)/'`axpy/axpy.c axpy.obj: axpy/axpy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT axpy.obj -MD -MP -MF $(DEPDIR)/axpy.Tpo -c -o axpy.obj `if test -f 'axpy/axpy.c'; then $(CYGPATH_W) 'axpy/axpy.c'; else $(CYGPATH_W) '$(srcdir)/axpy/axpy.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/axpy.Tpo $(DEPDIR)/axpy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='axpy/axpy.c' object='axpy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o axpy.obj `if test -f 'axpy/axpy.c'; then $(CYGPATH_W) 'axpy/axpy.c'; else $(CYGPATH_W) '$(srcdir)/axpy/axpy.c'; fi` blas.o: common/blas.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT blas.o -MD -MP -MF $(DEPDIR)/blas.Tpo -c -o blas.o `test -f 'common/blas.c' || echo '$(srcdir)/'`common/blas.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/blas.Tpo $(DEPDIR)/blas.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/blas.c' object='blas.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o blas.o `test -f 'common/blas.c' || echo '$(srcdir)/'`common/blas.c blas.obj: common/blas.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT blas.obj -MD -MP -MF $(DEPDIR)/blas.Tpo -c -o blas.obj `if test -f 'common/blas.c'; then $(CYGPATH_W) 'common/blas.c'; else $(CYGPATH_W) '$(srcdir)/common/blas.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/blas.Tpo $(DEPDIR)/blas.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/blas.c' object='blas.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o blas.obj `if test -f 'common/blas.c'; then $(CYGPATH_W) 'common/blas.c'; else $(CYGPATH_W) '$(srcdir)/common/blas.c'; fi` axpy_opencl.o: axpy/axpy_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT axpy_opencl.o -MD -MP -MF $(DEPDIR)/axpy_opencl.Tpo -c -o axpy_opencl.o `test -f 'axpy/axpy_opencl.c' || echo '$(srcdir)/'`axpy/axpy_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/axpy_opencl.Tpo $(DEPDIR)/axpy_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='axpy/axpy_opencl.c' object='axpy_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o axpy_opencl.o `test -f 'axpy/axpy_opencl.c' || echo '$(srcdir)/'`axpy/axpy_opencl.c axpy_opencl.obj: axpy/axpy_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT axpy_opencl.obj -MD -MP -MF $(DEPDIR)/axpy_opencl.Tpo -c -o axpy_opencl.obj `if test -f 'axpy/axpy_opencl.c'; then $(CYGPATH_W) 'axpy/axpy_opencl.c'; else $(CYGPATH_W) '$(srcdir)/axpy/axpy_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/axpy_opencl.Tpo $(DEPDIR)/axpy_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='axpy/axpy_opencl.c' object='axpy_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o axpy_opencl.obj `if test -f 'axpy/axpy_opencl.c'; then $(CYGPATH_W) 'axpy/axpy_opencl.c'; else $(CYGPATH_W) '$(srcdir)/axpy/axpy_opencl.c'; fi` block.o: basic_examples/block.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT block.o -MD -MP -MF $(DEPDIR)/block.Tpo -c -o block.o `test -f 'basic_examples/block.c' || echo '$(srcdir)/'`basic_examples/block.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/block.Tpo $(DEPDIR)/block.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/block.c' object='block.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o block.o `test -f 'basic_examples/block.c' || echo '$(srcdir)/'`basic_examples/block.c block.obj: basic_examples/block.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT block.obj -MD -MP -MF $(DEPDIR)/block.Tpo -c -o block.obj `if test -f 'basic_examples/block.c'; then $(CYGPATH_W) 'basic_examples/block.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/block.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/block.Tpo $(DEPDIR)/block.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/block.c' object='block.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o block.obj `if test -f 'basic_examples/block.c'; then $(CYGPATH_W) 'basic_examples/block.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/block.c'; fi` block_cpu.o: basic_examples/block_cpu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT block_cpu.o -MD -MP -MF $(DEPDIR)/block_cpu.Tpo -c -o block_cpu.o `test -f 'basic_examples/block_cpu.c' || echo '$(srcdir)/'`basic_examples/block_cpu.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/block_cpu.Tpo $(DEPDIR)/block_cpu.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/block_cpu.c' object='block_cpu.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o block_cpu.o `test -f 'basic_examples/block_cpu.c' || echo '$(srcdir)/'`basic_examples/block_cpu.c block_cpu.obj: basic_examples/block_cpu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT block_cpu.obj -MD -MP -MF $(DEPDIR)/block_cpu.Tpo -c -o block_cpu.obj `if test -f 'basic_examples/block_cpu.c'; then $(CYGPATH_W) 'basic_examples/block_cpu.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/block_cpu.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/block_cpu.Tpo $(DEPDIR)/block_cpu.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/block_cpu.c' object='block_cpu.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o block_cpu.obj `if test -f 'basic_examples/block_cpu.c'; then $(CYGPATH_W) 'basic_examples/block_cpu.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/block_cpu.c'; fi` block_opencl.o: basic_examples/block_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT block_opencl.o -MD -MP -MF $(DEPDIR)/block_opencl.Tpo -c -o block_opencl.o `test -f 'basic_examples/block_opencl.c' || echo '$(srcdir)/'`basic_examples/block_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/block_opencl.Tpo $(DEPDIR)/block_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/block_opencl.c' object='block_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o block_opencl.o `test -f 'basic_examples/block_opencl.c' || echo '$(srcdir)/'`basic_examples/block_opencl.c block_opencl.obj: basic_examples/block_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT block_opencl.obj -MD -MP -MF $(DEPDIR)/block_opencl.Tpo -c -o block_opencl.obj `if test -f 'basic_examples/block_opencl.c'; then $(CYGPATH_W) 'basic_examples/block_opencl.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/block_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/block_opencl.Tpo $(DEPDIR)/block_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/block_opencl.c' object='block_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o block_opencl.obj `if test -f 'basic_examples/block_opencl.c'; then $(CYGPATH_W) 'basic_examples/block_opencl.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/block_opencl.c'; fi` dynamic_handles.o: basic_examples/dynamic_handles.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dynamic_handles.o -MD -MP -MF $(DEPDIR)/dynamic_handles.Tpo -c -o dynamic_handles.o `test -f 'basic_examples/dynamic_handles.c' || echo '$(srcdir)/'`basic_examples/dynamic_handles.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dynamic_handles.Tpo $(DEPDIR)/dynamic_handles.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/dynamic_handles.c' object='dynamic_handles.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dynamic_handles.o `test -f 'basic_examples/dynamic_handles.c' || echo '$(srcdir)/'`basic_examples/dynamic_handles.c dynamic_handles.obj: basic_examples/dynamic_handles.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dynamic_handles.obj -MD -MP -MF $(DEPDIR)/dynamic_handles.Tpo -c -o dynamic_handles.obj `if test -f 'basic_examples/dynamic_handles.c'; then $(CYGPATH_W) 'basic_examples/dynamic_handles.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/dynamic_handles.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dynamic_handles.Tpo $(DEPDIR)/dynamic_handles.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/dynamic_handles.c' object='dynamic_handles.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dynamic_handles.obj `if test -f 'basic_examples/dynamic_handles.c'; then $(CYGPATH_W) 'basic_examples/dynamic_handles.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/dynamic_handles.c'; fi` hello_world.o: basic_examples/hello_world.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT hello_world.o -MD -MP -MF $(DEPDIR)/hello_world.Tpo -c -o hello_world.o `test -f 'basic_examples/hello_world.c' || echo '$(srcdir)/'`basic_examples/hello_world.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/hello_world.Tpo $(DEPDIR)/hello_world.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/hello_world.c' object='hello_world.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hello_world.o `test -f 'basic_examples/hello_world.c' || echo '$(srcdir)/'`basic_examples/hello_world.c hello_world.obj: basic_examples/hello_world.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT hello_world.obj -MD -MP -MF $(DEPDIR)/hello_world.Tpo -c -o hello_world.obj `if test -f 'basic_examples/hello_world.c'; then $(CYGPATH_W) 'basic_examples/hello_world.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/hello_world.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/hello_world.Tpo $(DEPDIR)/hello_world.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/hello_world.c' object='hello_world.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hello_world.obj `if test -f 'basic_examples/hello_world.c'; then $(CYGPATH_W) 'basic_examples/hello_world.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/hello_world.c'; fi` mult.o: basic_examples/mult.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mult.o -MD -MP -MF $(DEPDIR)/mult.Tpo -c -o mult.o `test -f 'basic_examples/mult.c' || echo '$(srcdir)/'`basic_examples/mult.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mult.Tpo $(DEPDIR)/mult.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/mult.c' object='mult.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mult.o `test -f 'basic_examples/mult.c' || echo '$(srcdir)/'`basic_examples/mult.c mult.obj: basic_examples/mult.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mult.obj -MD -MP -MF $(DEPDIR)/mult.Tpo -c -o mult.obj `if test -f 'basic_examples/mult.c'; then $(CYGPATH_W) 'basic_examples/mult.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/mult.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mult.Tpo $(DEPDIR)/mult.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/mult.c' object='mult.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mult.obj `if test -f 'basic_examples/mult.c'; then $(CYGPATH_W) 'basic_examples/mult.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/mult.c'; fi` multiformat.o: basic_examples/multiformat.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat.o -MD -MP -MF $(DEPDIR)/multiformat.Tpo -c -o multiformat.o `test -f 'basic_examples/multiformat.c' || echo '$(srcdir)/'`basic_examples/multiformat.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat.Tpo $(DEPDIR)/multiformat.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/multiformat.c' object='multiformat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat.o `test -f 'basic_examples/multiformat.c' || echo '$(srcdir)/'`basic_examples/multiformat.c multiformat.obj: basic_examples/multiformat.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat.obj -MD -MP -MF $(DEPDIR)/multiformat.Tpo -c -o multiformat.obj `if test -f 'basic_examples/multiformat.c'; then $(CYGPATH_W) 'basic_examples/multiformat.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/multiformat.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat.Tpo $(DEPDIR)/multiformat.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/multiformat.c' object='multiformat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat.obj `if test -f 'basic_examples/multiformat.c'; then $(CYGPATH_W) 'basic_examples/multiformat.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/multiformat.c'; fi` multiformat_conversion_codelets.o: basic_examples/multiformat_conversion_codelets.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_conversion_codelets.o -MD -MP -MF $(DEPDIR)/multiformat_conversion_codelets.Tpo -c -o multiformat_conversion_codelets.o `test -f 'basic_examples/multiformat_conversion_codelets.c' || echo '$(srcdir)/'`basic_examples/multiformat_conversion_codelets.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_conversion_codelets.Tpo $(DEPDIR)/multiformat_conversion_codelets.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/multiformat_conversion_codelets.c' object='multiformat_conversion_codelets.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_conversion_codelets.o `test -f 'basic_examples/multiformat_conversion_codelets.c' || echo '$(srcdir)/'`basic_examples/multiformat_conversion_codelets.c multiformat_conversion_codelets.obj: basic_examples/multiformat_conversion_codelets.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_conversion_codelets.obj -MD -MP -MF $(DEPDIR)/multiformat_conversion_codelets.Tpo -c -o multiformat_conversion_codelets.obj `if test -f 'basic_examples/multiformat_conversion_codelets.c'; then $(CYGPATH_W) 'basic_examples/multiformat_conversion_codelets.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/multiformat_conversion_codelets.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_conversion_codelets.Tpo $(DEPDIR)/multiformat_conversion_codelets.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/multiformat_conversion_codelets.c' object='multiformat_conversion_codelets.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_conversion_codelets.obj `if test -f 'basic_examples/multiformat_conversion_codelets.c'; then $(CYGPATH_W) 'basic_examples/multiformat_conversion_codelets.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/multiformat_conversion_codelets.c'; fi` multiformat_opencl.o: basic_examples/multiformat_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_opencl.o -MD -MP -MF $(DEPDIR)/multiformat_opencl.Tpo -c -o multiformat_opencl.o `test -f 'basic_examples/multiformat_opencl.c' || echo '$(srcdir)/'`basic_examples/multiformat_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_opencl.Tpo $(DEPDIR)/multiformat_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/multiformat_opencl.c' object='multiformat_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_opencl.o `test -f 'basic_examples/multiformat_opencl.c' || echo '$(srcdir)/'`basic_examples/multiformat_opencl.c multiformat_opencl.obj: basic_examples/multiformat_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_opencl.obj -MD -MP -MF $(DEPDIR)/multiformat_opencl.Tpo -c -o multiformat_opencl.obj `if test -f 'basic_examples/multiformat_opencl.c'; then $(CYGPATH_W) 'basic_examples/multiformat_opencl.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/multiformat_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_opencl.Tpo $(DEPDIR)/multiformat_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/multiformat_opencl.c' object='multiformat_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_opencl.obj `if test -f 'basic_examples/multiformat_opencl.c'; then $(CYGPATH_W) 'basic_examples/multiformat_opencl.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/multiformat_opencl.c'; fi` multiformat_conversion_codelets_opencl.o: basic_examples/multiformat_conversion_codelets_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_conversion_codelets_opencl.o -MD -MP -MF $(DEPDIR)/multiformat_conversion_codelets_opencl.Tpo -c -o multiformat_conversion_codelets_opencl.o `test -f 'basic_examples/multiformat_conversion_codelets_opencl.c' || echo '$(srcdir)/'`basic_examples/multiformat_conversion_codelets_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_conversion_codelets_opencl.Tpo $(DEPDIR)/multiformat_conversion_codelets_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/multiformat_conversion_codelets_opencl.c' object='multiformat_conversion_codelets_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_conversion_codelets_opencl.o `test -f 'basic_examples/multiformat_conversion_codelets_opencl.c' || echo '$(srcdir)/'`basic_examples/multiformat_conversion_codelets_opencl.c multiformat_conversion_codelets_opencl.obj: basic_examples/multiformat_conversion_codelets_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_conversion_codelets_opencl.obj -MD -MP -MF $(DEPDIR)/multiformat_conversion_codelets_opencl.Tpo -c -o multiformat_conversion_codelets_opencl.obj `if test -f 'basic_examples/multiformat_conversion_codelets_opencl.c'; then $(CYGPATH_W) 'basic_examples/multiformat_conversion_codelets_opencl.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/multiformat_conversion_codelets_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_conversion_codelets_opencl.Tpo $(DEPDIR)/multiformat_conversion_codelets_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/multiformat_conversion_codelets_opencl.c' object='multiformat_conversion_codelets_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_conversion_codelets_opencl.obj `if test -f 'basic_examples/multiformat_conversion_codelets_opencl.c'; then $(CYGPATH_W) 'basic_examples/multiformat_conversion_codelets_opencl.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/multiformat_conversion_codelets_opencl.c'; fi` variable.o: basic_examples/variable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT variable.o -MD -MP -MF $(DEPDIR)/variable.Tpo -c -o variable.o `test -f 'basic_examples/variable.c' || echo '$(srcdir)/'`basic_examples/variable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/variable.Tpo $(DEPDIR)/variable.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/variable.c' object='variable.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o variable.o `test -f 'basic_examples/variable.c' || echo '$(srcdir)/'`basic_examples/variable.c variable.obj: basic_examples/variable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT variable.obj -MD -MP -MF $(DEPDIR)/variable.Tpo -c -o variable.obj `if test -f 'basic_examples/variable.c'; then $(CYGPATH_W) 'basic_examples/variable.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/variable.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/variable.Tpo $(DEPDIR)/variable.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/variable.c' object='variable.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o variable.obj `if test -f 'basic_examples/variable.c'; then $(CYGPATH_W) 'basic_examples/variable.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/variable.c'; fi` variable_kernels_cpu.o: basic_examples/variable_kernels_cpu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT variable_kernels_cpu.o -MD -MP -MF $(DEPDIR)/variable_kernels_cpu.Tpo -c -o variable_kernels_cpu.o `test -f 'basic_examples/variable_kernels_cpu.c' || echo '$(srcdir)/'`basic_examples/variable_kernels_cpu.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/variable_kernels_cpu.Tpo $(DEPDIR)/variable_kernels_cpu.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/variable_kernels_cpu.c' object='variable_kernels_cpu.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o variable_kernels_cpu.o `test -f 'basic_examples/variable_kernels_cpu.c' || echo '$(srcdir)/'`basic_examples/variable_kernels_cpu.c variable_kernels_cpu.obj: basic_examples/variable_kernels_cpu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT variable_kernels_cpu.obj -MD -MP -MF $(DEPDIR)/variable_kernels_cpu.Tpo -c -o variable_kernels_cpu.obj `if test -f 'basic_examples/variable_kernels_cpu.c'; then $(CYGPATH_W) 'basic_examples/variable_kernels_cpu.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/variable_kernels_cpu.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/variable_kernels_cpu.Tpo $(DEPDIR)/variable_kernels_cpu.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/variable_kernels_cpu.c' object='variable_kernels_cpu.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o variable_kernels_cpu.obj `if test -f 'basic_examples/variable_kernels_cpu.c'; then $(CYGPATH_W) 'basic_examples/variable_kernels_cpu.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/variable_kernels_cpu.c'; fi` variable_kernels_opencl.o: basic_examples/variable_kernels_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT variable_kernels_opencl.o -MD -MP -MF $(DEPDIR)/variable_kernels_opencl.Tpo -c -o variable_kernels_opencl.o `test -f 'basic_examples/variable_kernels_opencl.c' || echo '$(srcdir)/'`basic_examples/variable_kernels_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/variable_kernels_opencl.Tpo $(DEPDIR)/variable_kernels_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/variable_kernels_opencl.c' object='variable_kernels_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o variable_kernels_opencl.o `test -f 'basic_examples/variable_kernels_opencl.c' || echo '$(srcdir)/'`basic_examples/variable_kernels_opencl.c variable_kernels_opencl.obj: basic_examples/variable_kernels_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT variable_kernels_opencl.obj -MD -MP -MF $(DEPDIR)/variable_kernels_opencl.Tpo -c -o variable_kernels_opencl.obj `if test -f 'basic_examples/variable_kernels_opencl.c'; then $(CYGPATH_W) 'basic_examples/variable_kernels_opencl.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/variable_kernels_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/variable_kernels_opencl.Tpo $(DEPDIR)/variable_kernels_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/variable_kernels_opencl.c' object='variable_kernels_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o variable_kernels_opencl.obj `if test -f 'basic_examples/variable_kernels_opencl.c'; then $(CYGPATH_W) 'basic_examples/variable_kernels_opencl.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/variable_kernels_opencl.c'; fi` vector_scal.o: basic_examples/vector_scal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vector_scal.o -MD -MP -MF $(DEPDIR)/vector_scal.Tpo -c -o vector_scal.o `test -f 'basic_examples/vector_scal.c' || echo '$(srcdir)/'`basic_examples/vector_scal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vector_scal.Tpo $(DEPDIR)/vector_scal.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/vector_scal.c' object='vector_scal.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vector_scal.o `test -f 'basic_examples/vector_scal.c' || echo '$(srcdir)/'`basic_examples/vector_scal.c vector_scal.obj: basic_examples/vector_scal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vector_scal.obj -MD -MP -MF $(DEPDIR)/vector_scal.Tpo -c -o vector_scal.obj `if test -f 'basic_examples/vector_scal.c'; then $(CYGPATH_W) 'basic_examples/vector_scal.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/vector_scal.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vector_scal.Tpo $(DEPDIR)/vector_scal.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/vector_scal.c' object='vector_scal.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vector_scal.obj `if test -f 'basic_examples/vector_scal.c'; then $(CYGPATH_W) 'basic_examples/vector_scal.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/vector_scal.c'; fi` vector_scal_cpu.o: basic_examples/vector_scal_cpu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vector_scal_cpu.o -MD -MP -MF $(DEPDIR)/vector_scal_cpu.Tpo -c -o vector_scal_cpu.o `test -f 'basic_examples/vector_scal_cpu.c' || echo '$(srcdir)/'`basic_examples/vector_scal_cpu.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vector_scal_cpu.Tpo $(DEPDIR)/vector_scal_cpu.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/vector_scal_cpu.c' object='vector_scal_cpu.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vector_scal_cpu.o `test -f 'basic_examples/vector_scal_cpu.c' || echo '$(srcdir)/'`basic_examples/vector_scal_cpu.c vector_scal_cpu.obj: basic_examples/vector_scal_cpu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vector_scal_cpu.obj -MD -MP -MF $(DEPDIR)/vector_scal_cpu.Tpo -c -o vector_scal_cpu.obj `if test -f 'basic_examples/vector_scal_cpu.c'; then $(CYGPATH_W) 'basic_examples/vector_scal_cpu.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/vector_scal_cpu.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vector_scal_cpu.Tpo $(DEPDIR)/vector_scal_cpu.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/vector_scal_cpu.c' object='vector_scal_cpu.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vector_scal_cpu.obj `if test -f 'basic_examples/vector_scal_cpu.c'; then $(CYGPATH_W) 'basic_examples/vector_scal_cpu.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/vector_scal_cpu.c'; fi` vector_scal_opencl.o: basic_examples/vector_scal_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vector_scal_opencl.o -MD -MP -MF $(DEPDIR)/vector_scal_opencl.Tpo -c -o vector_scal_opencl.o `test -f 'basic_examples/vector_scal_opencl.c' || echo '$(srcdir)/'`basic_examples/vector_scal_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vector_scal_opencl.Tpo $(DEPDIR)/vector_scal_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/vector_scal_opencl.c' object='vector_scal_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vector_scal_opencl.o `test -f 'basic_examples/vector_scal_opencl.c' || echo '$(srcdir)/'`basic_examples/vector_scal_opencl.c vector_scal_opencl.obj: basic_examples/vector_scal_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vector_scal_opencl.obj -MD -MP -MF $(DEPDIR)/vector_scal_opencl.Tpo -c -o vector_scal_opencl.obj `if test -f 'basic_examples/vector_scal_opencl.c'; then $(CYGPATH_W) 'basic_examples/vector_scal_opencl.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/vector_scal_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vector_scal_opencl.Tpo $(DEPDIR)/vector_scal_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/vector_scal_opencl.c' object='vector_scal_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vector_scal_opencl.obj `if test -f 'basic_examples/vector_scal_opencl.c'; then $(CYGPATH_W) 'basic_examples/vector_scal_opencl.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/vector_scal_opencl.c'; fi` vector_scal_c.o: basic_examples/vector_scal_c.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vector_scal_c.o -MD -MP -MF $(DEPDIR)/vector_scal_c.Tpo -c -o vector_scal_c.o `test -f 'basic_examples/vector_scal_c.c' || echo '$(srcdir)/'`basic_examples/vector_scal_c.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vector_scal_c.Tpo $(DEPDIR)/vector_scal_c.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/vector_scal_c.c' object='vector_scal_c.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vector_scal_c.o `test -f 'basic_examples/vector_scal_c.c' || echo '$(srcdir)/'`basic_examples/vector_scal_c.c vector_scal_c.obj: basic_examples/vector_scal_c.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vector_scal_c.obj -MD -MP -MF $(DEPDIR)/vector_scal_c.Tpo -c -o vector_scal_c.obj `if test -f 'basic_examples/vector_scal_c.c'; then $(CYGPATH_W) 'basic_examples/vector_scal_c.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/vector_scal_c.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vector_scal_c.Tpo $(DEPDIR)/vector_scal_c.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/vector_scal_c.c' object='vector_scal_c.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vector_scal_c.obj `if test -f 'basic_examples/vector_scal_c.c'; then $(CYGPATH_W) 'basic_examples/vector_scal_c.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/vector_scal_c.c'; fi` binary.o: binary/binary.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT binary.o -MD -MP -MF $(DEPDIR)/binary.Tpo -c -o binary.o `test -f 'binary/binary.c' || echo '$(srcdir)/'`binary/binary.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/binary.Tpo $(DEPDIR)/binary.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='binary/binary.c' object='binary.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o binary.o `test -f 'binary/binary.c' || echo '$(srcdir)/'`binary/binary.c binary.obj: binary/binary.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT binary.obj -MD -MP -MF $(DEPDIR)/binary.Tpo -c -o binary.obj `if test -f 'binary/binary.c'; then $(CYGPATH_W) 'binary/binary.c'; else $(CYGPATH_W) '$(srcdir)/binary/binary.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/binary.Tpo $(DEPDIR)/binary.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='binary/binary.c' object='binary.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o binary.obj `if test -f 'binary/binary.c'; then $(CYGPATH_W) 'binary/binary.c'; else $(CYGPATH_W) '$(srcdir)/binary/binary.c'; fi` incrementer_kernels_opencl.o: incrementer/incrementer_kernels_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT incrementer_kernels_opencl.o -MD -MP -MF $(DEPDIR)/incrementer_kernels_opencl.Tpo -c -o incrementer_kernels_opencl.o `test -f 'incrementer/incrementer_kernels_opencl.c' || echo '$(srcdir)/'`incrementer/incrementer_kernels_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/incrementer_kernels_opencl.Tpo $(DEPDIR)/incrementer_kernels_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='incrementer/incrementer_kernels_opencl.c' object='incrementer_kernels_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o incrementer_kernels_opencl.o `test -f 'incrementer/incrementer_kernels_opencl.c' || echo '$(srcdir)/'`incrementer/incrementer_kernels_opencl.c incrementer_kernels_opencl.obj: incrementer/incrementer_kernels_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT incrementer_kernels_opencl.obj -MD -MP -MF $(DEPDIR)/incrementer_kernels_opencl.Tpo -c -o incrementer_kernels_opencl.obj `if test -f 'incrementer/incrementer_kernels_opencl.c'; then $(CYGPATH_W) 'incrementer/incrementer_kernels_opencl.c'; else $(CYGPATH_W) '$(srcdir)/incrementer/incrementer_kernels_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/incrementer_kernels_opencl.Tpo $(DEPDIR)/incrementer_kernels_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='incrementer/incrementer_kernels_opencl.c' object='incrementer_kernels_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o incrementer_kernels_opencl.obj `if test -f 'incrementer/incrementer_kernels_opencl.c'; then $(CYGPATH_W) 'incrementer/incrementer_kernels_opencl.c'; else $(CYGPATH_W) '$(srcdir)/incrementer/incrementer_kernels_opencl.c'; fi` callback.o: callback/callback.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT callback.o -MD -MP -MF $(DEPDIR)/callback.Tpo -c -o callback.o `test -f 'callback/callback.c' || echo '$(srcdir)/'`callback/callback.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/callback.Tpo $(DEPDIR)/callback.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='callback/callback.c' object='callback.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o callback.o `test -f 'callback/callback.c' || echo '$(srcdir)/'`callback/callback.c callback.obj: callback/callback.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT callback.obj -MD -MP -MF $(DEPDIR)/callback.Tpo -c -o callback.obj `if test -f 'callback/callback.c'; then $(CYGPATH_W) 'callback/callback.c'; else $(CYGPATH_W) '$(srcdir)/callback/callback.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/callback.Tpo $(DEPDIR)/callback.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='callback/callback.c' object='callback.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o callback.obj `if test -f 'callback/callback.c'; then $(CYGPATH_W) 'callback/callback.c'; else $(CYGPATH_W) '$(srcdir)/callback/callback.c'; fi` prologue.o: callback/prologue.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prologue.o -MD -MP -MF $(DEPDIR)/prologue.Tpo -c -o prologue.o `test -f 'callback/prologue.c' || echo '$(srcdir)/'`callback/prologue.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/prologue.Tpo $(DEPDIR)/prologue.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='callback/prologue.c' object='prologue.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prologue.o `test -f 'callback/prologue.c' || echo '$(srcdir)/'`callback/prologue.c prologue.obj: callback/prologue.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prologue.obj -MD -MP -MF $(DEPDIR)/prologue.Tpo -c -o prologue.obj `if test -f 'callback/prologue.c'; then $(CYGPATH_W) 'callback/prologue.c'; else $(CYGPATH_W) '$(srcdir)/callback/prologue.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/prologue.Tpo $(DEPDIR)/prologue.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='callback/prologue.c' object='prologue.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prologue.obj `if test -f 'callback/prologue.c'; then $(CYGPATH_W) 'callback/prologue.c'; else $(CYGPATH_W) '$(srcdir)/callback/prologue.c'; fi` cg.o: cg/cg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cg.o -MD -MP -MF $(DEPDIR)/cg.Tpo -c -o cg.o `test -f 'cg/cg.c' || echo '$(srcdir)/'`cg/cg.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cg.Tpo $(DEPDIR)/cg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cg/cg.c' object='cg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cg.o `test -f 'cg/cg.c' || echo '$(srcdir)/'`cg/cg.c cg.obj: cg/cg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cg.obj -MD -MP -MF $(DEPDIR)/cg.Tpo -c -o cg.obj `if test -f 'cg/cg.c'; then $(CYGPATH_W) 'cg/cg.c'; else $(CYGPATH_W) '$(srcdir)/cg/cg.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cg.Tpo $(DEPDIR)/cg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cg/cg.c' object='cg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cg.obj `if test -f 'cg/cg.c'; then $(CYGPATH_W) 'cg/cg.c'; else $(CYGPATH_W) '$(srcdir)/cg/cg.c'; fi` cg_kernels.o: cg/cg_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cg_kernels.o -MD -MP -MF $(DEPDIR)/cg_kernels.Tpo -c -o cg_kernels.o `test -f 'cg/cg_kernels.c' || echo '$(srcdir)/'`cg/cg_kernels.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cg_kernels.Tpo $(DEPDIR)/cg_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cg/cg_kernels.c' object='cg_kernels.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cg_kernels.o `test -f 'cg/cg_kernels.c' || echo '$(srcdir)/'`cg/cg_kernels.c cg_kernels.obj: cg/cg_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cg_kernels.obj -MD -MP -MF $(DEPDIR)/cg_kernels.Tpo -c -o cg_kernels.obj `if test -f 'cg/cg_kernels.c'; then $(CYGPATH_W) 'cg/cg_kernels.c'; else $(CYGPATH_W) '$(srcdir)/cg/cg_kernels.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cg_kernels.Tpo $(DEPDIR)/cg_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cg/cg_kernels.c' object='cg_kernels.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cg_kernels.obj `if test -f 'cg/cg_kernels.c'; then $(CYGPATH_W) 'cg/cg_kernels.c'; else $(CYGPATH_W) '$(srcdir)/cg/cg_kernels.c'; fi` cholesky_grain_tag.o: cholesky/cholesky_grain_tag.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_grain_tag.o -MD -MP -MF $(DEPDIR)/cholesky_grain_tag.Tpo -c -o cholesky_grain_tag.o `test -f 'cholesky/cholesky_grain_tag.c' || echo '$(srcdir)/'`cholesky/cholesky_grain_tag.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_grain_tag.Tpo $(DEPDIR)/cholesky_grain_tag.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_grain_tag.c' object='cholesky_grain_tag.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cholesky_grain_tag.o `test -f 'cholesky/cholesky_grain_tag.c' || echo '$(srcdir)/'`cholesky/cholesky_grain_tag.c cholesky_grain_tag.obj: cholesky/cholesky_grain_tag.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_grain_tag.obj -MD -MP -MF $(DEPDIR)/cholesky_grain_tag.Tpo -c -o cholesky_grain_tag.obj `if test -f 'cholesky/cholesky_grain_tag.c'; then $(CYGPATH_W) 'cholesky/cholesky_grain_tag.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_grain_tag.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_grain_tag.Tpo $(DEPDIR)/cholesky_grain_tag.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_grain_tag.c' object='cholesky_grain_tag.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cholesky_grain_tag.obj `if test -f 'cholesky/cholesky_grain_tag.c'; then $(CYGPATH_W) 'cholesky/cholesky_grain_tag.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_grain_tag.c'; fi` cholesky_models.o: cholesky/cholesky_models.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_models.o -MD -MP -MF $(DEPDIR)/cholesky_models.Tpo -c -o cholesky_models.o `test -f 'cholesky/cholesky_models.c' || echo '$(srcdir)/'`cholesky/cholesky_models.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_models.Tpo $(DEPDIR)/cholesky_models.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_models.c' object='cholesky_models.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cholesky_models.o `test -f 'cholesky/cholesky_models.c' || echo '$(srcdir)/'`cholesky/cholesky_models.c cholesky_models.obj: cholesky/cholesky_models.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_models.obj -MD -MP -MF $(DEPDIR)/cholesky_models.Tpo -c -o cholesky_models.obj `if test -f 'cholesky/cholesky_models.c'; then $(CYGPATH_W) 'cholesky/cholesky_models.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_models.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_models.Tpo $(DEPDIR)/cholesky_models.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_models.c' object='cholesky_models.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cholesky_models.obj `if test -f 'cholesky/cholesky_models.c'; then $(CYGPATH_W) 'cholesky/cholesky_models.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_models.c'; fi` cholesky_kernels.o: cholesky/cholesky_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_kernels.o -MD -MP -MF $(DEPDIR)/cholesky_kernels.Tpo -c -o cholesky_kernels.o `test -f 'cholesky/cholesky_kernels.c' || echo '$(srcdir)/'`cholesky/cholesky_kernels.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_kernels.Tpo $(DEPDIR)/cholesky_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_kernels.c' object='cholesky_kernels.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cholesky_kernels.o `test -f 'cholesky/cholesky_kernels.c' || echo '$(srcdir)/'`cholesky/cholesky_kernels.c cholesky_kernels.obj: cholesky/cholesky_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_kernels.obj -MD -MP -MF $(DEPDIR)/cholesky_kernels.Tpo -c -o cholesky_kernels.obj `if test -f 'cholesky/cholesky_kernels.c'; then $(CYGPATH_W) 'cholesky/cholesky_kernels.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_kernels.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_kernels.Tpo $(DEPDIR)/cholesky_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_kernels.c' object='cholesky_kernels.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cholesky_kernels.obj `if test -f 'cholesky/cholesky_kernels.c'; then $(CYGPATH_W) 'cholesky/cholesky_kernels.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_kernels.c'; fi` cholesky_implicit.o: cholesky/cholesky_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_implicit.o -MD -MP -MF $(DEPDIR)/cholesky_implicit.Tpo -c -o cholesky_implicit.o `test -f 'cholesky/cholesky_implicit.c' || echo '$(srcdir)/'`cholesky/cholesky_implicit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_implicit.Tpo $(DEPDIR)/cholesky_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_implicit.c' object='cholesky_implicit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cholesky_implicit.o `test -f 'cholesky/cholesky_implicit.c' || echo '$(srcdir)/'`cholesky/cholesky_implicit.c cholesky_implicit.obj: cholesky/cholesky_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_implicit.obj -MD -MP -MF $(DEPDIR)/cholesky_implicit.Tpo -c -o cholesky_implicit.obj `if test -f 'cholesky/cholesky_implicit.c'; then $(CYGPATH_W) 'cholesky/cholesky_implicit.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_implicit.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_implicit.Tpo $(DEPDIR)/cholesky_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_implicit.c' object='cholesky_implicit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cholesky_implicit.obj `if test -f 'cholesky/cholesky_implicit.c'; then $(CYGPATH_W) 'cholesky/cholesky_implicit.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_implicit.c'; fi` sched_ctx_utils.o: sched_ctx_utils/sched_ctx_utils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sched_ctx_utils.o -MD -MP -MF $(DEPDIR)/sched_ctx_utils.Tpo -c -o sched_ctx_utils.o `test -f 'sched_ctx_utils/sched_ctx_utils.c' || echo '$(srcdir)/'`sched_ctx_utils/sched_ctx_utils.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_utils.Tpo $(DEPDIR)/sched_ctx_utils.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx_utils/sched_ctx_utils.c' object='sched_ctx_utils.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sched_ctx_utils.o `test -f 'sched_ctx_utils/sched_ctx_utils.c' || echo '$(srcdir)/'`sched_ctx_utils/sched_ctx_utils.c sched_ctx_utils.obj: sched_ctx_utils/sched_ctx_utils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sched_ctx_utils.obj -MD -MP -MF $(DEPDIR)/sched_ctx_utils.Tpo -c -o sched_ctx_utils.obj `if test -f 'sched_ctx_utils/sched_ctx_utils.c'; then $(CYGPATH_W) 'sched_ctx_utils/sched_ctx_utils.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx_utils/sched_ctx_utils.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_utils.Tpo $(DEPDIR)/sched_ctx_utils.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx_utils/sched_ctx_utils.c' object='sched_ctx_utils.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sched_ctx_utils.obj `if test -f 'sched_ctx_utils/sched_ctx_utils.c'; then $(CYGPATH_W) 'sched_ctx_utils/sched_ctx_utils.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx_utils/sched_ctx_utils.c'; fi` cholesky_tag.o: cholesky/cholesky_tag.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_tag.o -MD -MP -MF $(DEPDIR)/cholesky_tag.Tpo -c -o cholesky_tag.o `test -f 'cholesky/cholesky_tag.c' || echo '$(srcdir)/'`cholesky/cholesky_tag.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_tag.Tpo $(DEPDIR)/cholesky_tag.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_tag.c' object='cholesky_tag.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cholesky_tag.o `test -f 'cholesky/cholesky_tag.c' || echo '$(srcdir)/'`cholesky/cholesky_tag.c cholesky_tag.obj: cholesky/cholesky_tag.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_tag.obj -MD -MP -MF $(DEPDIR)/cholesky_tag.Tpo -c -o cholesky_tag.obj `if test -f 'cholesky/cholesky_tag.c'; then $(CYGPATH_W) 'cholesky/cholesky_tag.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_tag.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_tag.Tpo $(DEPDIR)/cholesky_tag.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_tag.c' object='cholesky_tag.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cholesky_tag.obj `if test -f 'cholesky/cholesky_tag.c'; then $(CYGPATH_W) 'cholesky/cholesky_tag.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_tag.c'; fi` cholesky_tile_tag.o: cholesky/cholesky_tile_tag.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_tile_tag.o -MD -MP -MF $(DEPDIR)/cholesky_tile_tag.Tpo -c -o cholesky_tile_tag.o `test -f 'cholesky/cholesky_tile_tag.c' || echo '$(srcdir)/'`cholesky/cholesky_tile_tag.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_tile_tag.Tpo $(DEPDIR)/cholesky_tile_tag.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_tile_tag.c' object='cholesky_tile_tag.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cholesky_tile_tag.o `test -f 'cholesky/cholesky_tile_tag.c' || echo '$(srcdir)/'`cholesky/cholesky_tile_tag.c cholesky_tile_tag.obj: cholesky/cholesky_tile_tag.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_tile_tag.obj -MD -MP -MF $(DEPDIR)/cholesky_tile_tag.Tpo -c -o cholesky_tile_tag.obj `if test -f 'cholesky/cholesky_tile_tag.c'; then $(CYGPATH_W) 'cholesky/cholesky_tile_tag.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_tile_tag.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_tile_tag.Tpo $(DEPDIR)/cholesky_tile_tag.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_tile_tag.c' object='cholesky_tile_tag.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cholesky_tile_tag.obj `if test -f 'cholesky/cholesky_tile_tag.c'; then $(CYGPATH_W) 'cholesky/cholesky_tile_tag.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_tile_tag.c'; fi` custom_mf_filter.o: filters/custom_mf/custom_mf_filter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT custom_mf_filter.o -MD -MP -MF $(DEPDIR)/custom_mf_filter.Tpo -c -o custom_mf_filter.o `test -f 'filters/custom_mf/custom_mf_filter.c' || echo '$(srcdir)/'`filters/custom_mf/custom_mf_filter.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/custom_mf_filter.Tpo $(DEPDIR)/custom_mf_filter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/custom_mf/custom_mf_filter.c' object='custom_mf_filter.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o custom_mf_filter.o `test -f 'filters/custom_mf/custom_mf_filter.c' || echo '$(srcdir)/'`filters/custom_mf/custom_mf_filter.c custom_mf_filter.obj: filters/custom_mf/custom_mf_filter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT custom_mf_filter.obj -MD -MP -MF $(DEPDIR)/custom_mf_filter.Tpo -c -o custom_mf_filter.obj `if test -f 'filters/custom_mf/custom_mf_filter.c'; then $(CYGPATH_W) 'filters/custom_mf/custom_mf_filter.c'; else $(CYGPATH_W) '$(srcdir)/filters/custom_mf/custom_mf_filter.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/custom_mf_filter.Tpo $(DEPDIR)/custom_mf_filter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/custom_mf/custom_mf_filter.c' object='custom_mf_filter.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o custom_mf_filter.obj `if test -f 'filters/custom_mf/custom_mf_filter.c'; then $(CYGPATH_W) 'filters/custom_mf/custom_mf_filter.c'; else $(CYGPATH_W) '$(srcdir)/filters/custom_mf/custom_mf_filter.c'; fi` custom_interface.o: filters/custom_mf/custom_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT custom_interface.o -MD -MP -MF $(DEPDIR)/custom_interface.Tpo -c -o custom_interface.o `test -f 'filters/custom_mf/custom_interface.c' || echo '$(srcdir)/'`filters/custom_mf/custom_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/custom_interface.Tpo $(DEPDIR)/custom_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/custom_mf/custom_interface.c' object='custom_interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o custom_interface.o `test -f 'filters/custom_mf/custom_interface.c' || echo '$(srcdir)/'`filters/custom_mf/custom_interface.c custom_interface.obj: filters/custom_mf/custom_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT custom_interface.obj -MD -MP -MF $(DEPDIR)/custom_interface.Tpo -c -o custom_interface.obj `if test -f 'filters/custom_mf/custom_interface.c'; then $(CYGPATH_W) 'filters/custom_mf/custom_interface.c'; else $(CYGPATH_W) '$(srcdir)/filters/custom_mf/custom_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/custom_interface.Tpo $(DEPDIR)/custom_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/custom_mf/custom_interface.c' object='custom_interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o custom_interface.obj `if test -f 'filters/custom_mf/custom_interface.c'; then $(CYGPATH_W) 'filters/custom_mf/custom_interface.c'; else $(CYGPATH_W) '$(srcdir)/filters/custom_mf/custom_interface.c'; fi` custom_conversion_codelets.o: filters/custom_mf/custom_conversion_codelets.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT custom_conversion_codelets.o -MD -MP -MF $(DEPDIR)/custom_conversion_codelets.Tpo -c -o custom_conversion_codelets.o `test -f 'filters/custom_mf/custom_conversion_codelets.c' || echo '$(srcdir)/'`filters/custom_mf/custom_conversion_codelets.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/custom_conversion_codelets.Tpo $(DEPDIR)/custom_conversion_codelets.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/custom_mf/custom_conversion_codelets.c' object='custom_conversion_codelets.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o custom_conversion_codelets.o `test -f 'filters/custom_mf/custom_conversion_codelets.c' || echo '$(srcdir)/'`filters/custom_mf/custom_conversion_codelets.c custom_conversion_codelets.obj: filters/custom_mf/custom_conversion_codelets.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT custom_conversion_codelets.obj -MD -MP -MF $(DEPDIR)/custom_conversion_codelets.Tpo -c -o custom_conversion_codelets.obj `if test -f 'filters/custom_mf/custom_conversion_codelets.c'; then $(CYGPATH_W) 'filters/custom_mf/custom_conversion_codelets.c'; else $(CYGPATH_W) '$(srcdir)/filters/custom_mf/custom_conversion_codelets.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/custom_conversion_codelets.Tpo $(DEPDIR)/custom_conversion_codelets.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/custom_mf/custom_conversion_codelets.c' object='custom_conversion_codelets.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o custom_conversion_codelets.obj `if test -f 'filters/custom_mf/custom_conversion_codelets.c'; then $(CYGPATH_W) 'filters/custom_mf/custom_conversion_codelets.c'; else $(CYGPATH_W) '$(srcdir)/filters/custom_mf/custom_conversion_codelets.c'; fi` conversion_opencl.o: filters/custom_mf/conversion_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT conversion_opencl.o -MD -MP -MF $(DEPDIR)/conversion_opencl.Tpo -c -o conversion_opencl.o `test -f 'filters/custom_mf/conversion_opencl.c' || echo '$(srcdir)/'`filters/custom_mf/conversion_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/conversion_opencl.Tpo $(DEPDIR)/conversion_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/custom_mf/conversion_opencl.c' object='conversion_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o conversion_opencl.o `test -f 'filters/custom_mf/conversion_opencl.c' || echo '$(srcdir)/'`filters/custom_mf/conversion_opencl.c conversion_opencl.obj: filters/custom_mf/conversion_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT conversion_opencl.obj -MD -MP -MF $(DEPDIR)/conversion_opencl.Tpo -c -o conversion_opencl.obj `if test -f 'filters/custom_mf/conversion_opencl.c'; then $(CYGPATH_W) 'filters/custom_mf/conversion_opencl.c'; else $(CYGPATH_W) '$(srcdir)/filters/custom_mf/conversion_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/conversion_opencl.Tpo $(DEPDIR)/conversion_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/custom_mf/conversion_opencl.c' object='conversion_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o conversion_opencl.obj `if test -f 'filters/custom_mf/conversion_opencl.c'; then $(CYGPATH_W) 'filters/custom_mf/conversion_opencl.c'; else $(CYGPATH_W) '$(srcdir)/filters/custom_mf/conversion_opencl.c'; fi` custom_opencl.o: filters/custom_mf/custom_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT custom_opencl.o -MD -MP -MF $(DEPDIR)/custom_opencl.Tpo -c -o custom_opencl.o `test -f 'filters/custom_mf/custom_opencl.c' || echo '$(srcdir)/'`filters/custom_mf/custom_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/custom_opencl.Tpo $(DEPDIR)/custom_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/custom_mf/custom_opencl.c' object='custom_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o custom_opencl.o `test -f 'filters/custom_mf/custom_opencl.c' || echo '$(srcdir)/'`filters/custom_mf/custom_opencl.c custom_opencl.obj: filters/custom_mf/custom_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT custom_opencl.obj -MD -MP -MF $(DEPDIR)/custom_opencl.Tpo -c -o custom_opencl.obj `if test -f 'filters/custom_mf/custom_opencl.c'; then $(CYGPATH_W) 'filters/custom_mf/custom_opencl.c'; else $(CYGPATH_W) '$(srcdir)/filters/custom_mf/custom_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/custom_opencl.Tpo $(DEPDIR)/custom_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/custom_mf/custom_opencl.c' object='custom_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o custom_opencl.obj `if test -f 'filters/custom_mf/custom_opencl.c'; then $(CYGPATH_W) 'filters/custom_mf/custom_opencl.c'; else $(CYGPATH_W) '$(srcdir)/filters/custom_mf/custom_opencl.c'; fi` fblock.o: filters/fblock.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fblock.o -MD -MP -MF $(DEPDIR)/fblock.Tpo -c -o fblock.o `test -f 'filters/fblock.c' || echo '$(srcdir)/'`filters/fblock.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fblock.Tpo $(DEPDIR)/fblock.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/fblock.c' object='fblock.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fblock.o `test -f 'filters/fblock.c' || echo '$(srcdir)/'`filters/fblock.c fblock.obj: filters/fblock.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fblock.obj -MD -MP -MF $(DEPDIR)/fblock.Tpo -c -o fblock.obj `if test -f 'filters/fblock.c'; then $(CYGPATH_W) 'filters/fblock.c'; else $(CYGPATH_W) '$(srcdir)/filters/fblock.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fblock.Tpo $(DEPDIR)/fblock.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/fblock.c' object='fblock.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fblock.obj `if test -f 'filters/fblock.c'; then $(CYGPATH_W) 'filters/fblock.c'; else $(CYGPATH_W) '$(srcdir)/filters/fblock.c'; fi` fblock_cpu.o: filters/fblock_cpu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fblock_cpu.o -MD -MP -MF $(DEPDIR)/fblock_cpu.Tpo -c -o fblock_cpu.o `test -f 'filters/fblock_cpu.c' || echo '$(srcdir)/'`filters/fblock_cpu.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fblock_cpu.Tpo $(DEPDIR)/fblock_cpu.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/fblock_cpu.c' object='fblock_cpu.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fblock_cpu.o `test -f 'filters/fblock_cpu.c' || echo '$(srcdir)/'`filters/fblock_cpu.c fblock_cpu.obj: filters/fblock_cpu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fblock_cpu.obj -MD -MP -MF $(DEPDIR)/fblock_cpu.Tpo -c -o fblock_cpu.obj `if test -f 'filters/fblock_cpu.c'; then $(CYGPATH_W) 'filters/fblock_cpu.c'; else $(CYGPATH_W) '$(srcdir)/filters/fblock_cpu.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fblock_cpu.Tpo $(DEPDIR)/fblock_cpu.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/fblock_cpu.c' object='fblock_cpu.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fblock_cpu.obj `if test -f 'filters/fblock_cpu.c'; then $(CYGPATH_W) 'filters/fblock_cpu.c'; else $(CYGPATH_W) '$(srcdir)/filters/fblock_cpu.c'; fi` fblock_opencl.o: filters/fblock_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fblock_opencl.o -MD -MP -MF $(DEPDIR)/fblock_opencl.Tpo -c -o fblock_opencl.o `test -f 'filters/fblock_opencl.c' || echo '$(srcdir)/'`filters/fblock_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fblock_opencl.Tpo $(DEPDIR)/fblock_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/fblock_opencl.c' object='fblock_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fblock_opencl.o `test -f 'filters/fblock_opencl.c' || echo '$(srcdir)/'`filters/fblock_opencl.c fblock_opencl.obj: filters/fblock_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fblock_opencl.obj -MD -MP -MF $(DEPDIR)/fblock_opencl.Tpo -c -o fblock_opencl.obj `if test -f 'filters/fblock_opencl.c'; then $(CYGPATH_W) 'filters/fblock_opencl.c'; else $(CYGPATH_W) '$(srcdir)/filters/fblock_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fblock_opencl.Tpo $(DEPDIR)/fblock_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/fblock_opencl.c' object='fblock_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fblock_opencl.obj `if test -f 'filters/fblock_opencl.c'; then $(CYGPATH_W) 'filters/fblock_opencl.c'; else $(CYGPATH_W) '$(srcdir)/filters/fblock_opencl.c'; fi` fmatrix.o: filters/fmatrix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fmatrix.o -MD -MP -MF $(DEPDIR)/fmatrix.Tpo -c -o fmatrix.o `test -f 'filters/fmatrix.c' || echo '$(srcdir)/'`filters/fmatrix.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fmatrix.Tpo $(DEPDIR)/fmatrix.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/fmatrix.c' object='fmatrix.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fmatrix.o `test -f 'filters/fmatrix.c' || echo '$(srcdir)/'`filters/fmatrix.c fmatrix.obj: filters/fmatrix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fmatrix.obj -MD -MP -MF $(DEPDIR)/fmatrix.Tpo -c -o fmatrix.obj `if test -f 'filters/fmatrix.c'; then $(CYGPATH_W) 'filters/fmatrix.c'; else $(CYGPATH_W) '$(srcdir)/filters/fmatrix.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fmatrix.Tpo $(DEPDIR)/fmatrix.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/fmatrix.c' object='fmatrix.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fmatrix.obj `if test -f 'filters/fmatrix.c'; then $(CYGPATH_W) 'filters/fmatrix.c'; else $(CYGPATH_W) '$(srcdir)/filters/fmatrix.c'; fi` fmultiple_manual.o: filters/fmultiple_manual.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fmultiple_manual.o -MD -MP -MF $(DEPDIR)/fmultiple_manual.Tpo -c -o fmultiple_manual.o `test -f 'filters/fmultiple_manual.c' || echo '$(srcdir)/'`filters/fmultiple_manual.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fmultiple_manual.Tpo $(DEPDIR)/fmultiple_manual.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/fmultiple_manual.c' object='fmultiple_manual.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fmultiple_manual.o `test -f 'filters/fmultiple_manual.c' || echo '$(srcdir)/'`filters/fmultiple_manual.c fmultiple_manual.obj: filters/fmultiple_manual.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fmultiple_manual.obj -MD -MP -MF $(DEPDIR)/fmultiple_manual.Tpo -c -o fmultiple_manual.obj `if test -f 'filters/fmultiple_manual.c'; then $(CYGPATH_W) 'filters/fmultiple_manual.c'; else $(CYGPATH_W) '$(srcdir)/filters/fmultiple_manual.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fmultiple_manual.Tpo $(DEPDIR)/fmultiple_manual.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/fmultiple_manual.c' object='fmultiple_manual.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fmultiple_manual.obj `if test -f 'filters/fmultiple_manual.c'; then $(CYGPATH_W) 'filters/fmultiple_manual.c'; else $(CYGPATH_W) '$(srcdir)/filters/fmultiple_manual.c'; fi` fmultiple_submit.o: filters/fmultiple_submit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fmultiple_submit.o -MD -MP -MF $(DEPDIR)/fmultiple_submit.Tpo -c -o fmultiple_submit.o `test -f 'filters/fmultiple_submit.c' || echo '$(srcdir)/'`filters/fmultiple_submit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fmultiple_submit.Tpo $(DEPDIR)/fmultiple_submit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/fmultiple_submit.c' object='fmultiple_submit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fmultiple_submit.o `test -f 'filters/fmultiple_submit.c' || echo '$(srcdir)/'`filters/fmultiple_submit.c fmultiple_submit.obj: filters/fmultiple_submit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fmultiple_submit.obj -MD -MP -MF $(DEPDIR)/fmultiple_submit.Tpo -c -o fmultiple_submit.obj `if test -f 'filters/fmultiple_submit.c'; then $(CYGPATH_W) 'filters/fmultiple_submit.c'; else $(CYGPATH_W) '$(srcdir)/filters/fmultiple_submit.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fmultiple_submit.Tpo $(DEPDIR)/fmultiple_submit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/fmultiple_submit.c' object='fmultiple_submit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fmultiple_submit.obj `if test -f 'filters/fmultiple_submit.c'; then $(CYGPATH_W) 'filters/fmultiple_submit.c'; else $(CYGPATH_W) '$(srcdir)/filters/fmultiple_submit.c'; fi` fmultiple_submit_readonly.o: filters/fmultiple_submit_readonly.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fmultiple_submit_readonly.o -MD -MP -MF $(DEPDIR)/fmultiple_submit_readonly.Tpo -c -o fmultiple_submit_readonly.o `test -f 'filters/fmultiple_submit_readonly.c' || echo '$(srcdir)/'`filters/fmultiple_submit_readonly.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fmultiple_submit_readonly.Tpo $(DEPDIR)/fmultiple_submit_readonly.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/fmultiple_submit_readonly.c' object='fmultiple_submit_readonly.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fmultiple_submit_readonly.o `test -f 'filters/fmultiple_submit_readonly.c' || echo '$(srcdir)/'`filters/fmultiple_submit_readonly.c fmultiple_submit_readonly.obj: filters/fmultiple_submit_readonly.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fmultiple_submit_readonly.obj -MD -MP -MF $(DEPDIR)/fmultiple_submit_readonly.Tpo -c -o fmultiple_submit_readonly.obj `if test -f 'filters/fmultiple_submit_readonly.c'; then $(CYGPATH_W) 'filters/fmultiple_submit_readonly.c'; else $(CYGPATH_W) '$(srcdir)/filters/fmultiple_submit_readonly.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fmultiple_submit_readonly.Tpo $(DEPDIR)/fmultiple_submit_readonly.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/fmultiple_submit_readonly.c' object='fmultiple_submit_readonly.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fmultiple_submit_readonly.obj `if test -f 'filters/fmultiple_submit_readonly.c'; then $(CYGPATH_W) 'filters/fmultiple_submit_readonly.c'; else $(CYGPATH_W) '$(srcdir)/filters/fmultiple_submit_readonly.c'; fi` fvector.o: filters/fvector.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fvector.o -MD -MP -MF $(DEPDIR)/fvector.Tpo -c -o fvector.o `test -f 'filters/fvector.c' || echo '$(srcdir)/'`filters/fvector.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fvector.Tpo $(DEPDIR)/fvector.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/fvector.c' object='fvector.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fvector.o `test -f 'filters/fvector.c' || echo '$(srcdir)/'`filters/fvector.c fvector.obj: filters/fvector.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fvector.obj -MD -MP -MF $(DEPDIR)/fvector.Tpo -c -o fvector.obj `if test -f 'filters/fvector.c'; then $(CYGPATH_W) 'filters/fvector.c'; else $(CYGPATH_W) '$(srcdir)/filters/fvector.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fvector.Tpo $(DEPDIR)/fvector.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/fvector.c' object='fvector.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fvector.obj `if test -f 'filters/fvector.c'; then $(CYGPATH_W) 'filters/fvector.c'; else $(CYGPATH_W) '$(srcdir)/filters/fvector.c'; fi` shadow.o: filters/shadow.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shadow.o -MD -MP -MF $(DEPDIR)/shadow.Tpo -c -o shadow.o `test -f 'filters/shadow.c' || echo '$(srcdir)/'`filters/shadow.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shadow.Tpo $(DEPDIR)/shadow.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/shadow.c' object='shadow.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shadow.o `test -f 'filters/shadow.c' || echo '$(srcdir)/'`filters/shadow.c shadow.obj: filters/shadow.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shadow.obj -MD -MP -MF $(DEPDIR)/shadow.Tpo -c -o shadow.obj `if test -f 'filters/shadow.c'; then $(CYGPATH_W) 'filters/shadow.c'; else $(CYGPATH_W) '$(srcdir)/filters/shadow.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shadow.Tpo $(DEPDIR)/shadow.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/shadow.c' object='shadow.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shadow.obj `if test -f 'filters/shadow.c'; then $(CYGPATH_W) 'filters/shadow.c'; else $(CYGPATH_W) '$(srcdir)/filters/shadow.c'; fi` shadow2d.o: filters/shadow2d.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shadow2d.o -MD -MP -MF $(DEPDIR)/shadow2d.Tpo -c -o shadow2d.o `test -f 'filters/shadow2d.c' || echo '$(srcdir)/'`filters/shadow2d.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shadow2d.Tpo $(DEPDIR)/shadow2d.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/shadow2d.c' object='shadow2d.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shadow2d.o `test -f 'filters/shadow2d.c' || echo '$(srcdir)/'`filters/shadow2d.c shadow2d.obj: filters/shadow2d.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shadow2d.obj -MD -MP -MF $(DEPDIR)/shadow2d.Tpo -c -o shadow2d.obj `if test -f 'filters/shadow2d.c'; then $(CYGPATH_W) 'filters/shadow2d.c'; else $(CYGPATH_W) '$(srcdir)/filters/shadow2d.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shadow2d.Tpo $(DEPDIR)/shadow2d.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/shadow2d.c' object='shadow2d.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shadow2d.obj `if test -f 'filters/shadow2d.c'; then $(CYGPATH_W) 'filters/shadow2d.c'; else $(CYGPATH_W) '$(srcdir)/filters/shadow2d.c'; fi` shadow3d.o: filters/shadow3d.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shadow3d.o -MD -MP -MF $(DEPDIR)/shadow3d.Tpo -c -o shadow3d.o `test -f 'filters/shadow3d.c' || echo '$(srcdir)/'`filters/shadow3d.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shadow3d.Tpo $(DEPDIR)/shadow3d.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/shadow3d.c' object='shadow3d.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shadow3d.o `test -f 'filters/shadow3d.c' || echo '$(srcdir)/'`filters/shadow3d.c shadow3d.obj: filters/shadow3d.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shadow3d.obj -MD -MP -MF $(DEPDIR)/shadow3d.Tpo -c -o shadow3d.obj `if test -f 'filters/shadow3d.c'; then $(CYGPATH_W) 'filters/shadow3d.c'; else $(CYGPATH_W) '$(srcdir)/filters/shadow3d.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shadow3d.Tpo $(DEPDIR)/shadow3d.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/shadow3d.c' object='shadow3d.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shadow3d.obj `if test -f 'filters/shadow3d.c'; then $(CYGPATH_W) 'filters/shadow3d.c'; else $(CYGPATH_W) '$(srcdir)/filters/shadow3d.c'; fi` hello_c.o: fortran/hello_c.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT hello_c.o -MD -MP -MF $(DEPDIR)/hello_c.Tpo -c -o hello_c.o `test -f 'fortran/hello_c.c' || echo '$(srcdir)/'`fortran/hello_c.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/hello_c.Tpo $(DEPDIR)/hello_c.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fortran/hello_c.c' object='hello_c.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hello_c.o `test -f 'fortran/hello_c.c' || echo '$(srcdir)/'`fortran/hello_c.c hello_c.obj: fortran/hello_c.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT hello_c.obj -MD -MP -MF $(DEPDIR)/hello_c.Tpo -c -o hello_c.obj `if test -f 'fortran/hello_c.c'; then $(CYGPATH_W) 'fortran/hello_c.c'; else $(CYGPATH_W) '$(srcdir)/fortran/hello_c.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/hello_c.Tpo $(DEPDIR)/hello_c.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fortran/hello_c.c' object='hello_c.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hello_c.obj `if test -f 'fortran/hello_c.c'; then $(CYGPATH_W) 'fortran/hello_c.c'; else $(CYGPATH_W) '$(srcdir)/fortran/hello_c.c'; fi` marshalling.o: fortran90/marshalling.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT marshalling.o -MD -MP -MF $(DEPDIR)/marshalling.Tpo -c -o marshalling.o `test -f 'fortran90/marshalling.c' || echo '$(srcdir)/'`fortran90/marshalling.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/marshalling.Tpo $(DEPDIR)/marshalling.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fortran90/marshalling.c' object='marshalling.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o marshalling.o `test -f 'fortran90/marshalling.c' || echo '$(srcdir)/'`fortran90/marshalling.c marshalling.obj: fortran90/marshalling.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT marshalling.obj -MD -MP -MF $(DEPDIR)/marshalling.Tpo -c -o marshalling.obj `if test -f 'fortran90/marshalling.c'; then $(CYGPATH_W) 'fortran90/marshalling.c'; else $(CYGPATH_W) '$(srcdir)/fortran90/marshalling.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/marshalling.Tpo $(DEPDIR)/marshalling.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fortran90/marshalling.c' object='marshalling.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o marshalling.obj `if test -f 'fortran90/marshalling.c'; then $(CYGPATH_W) 'fortran90/marshalling.c'; else $(CYGPATH_W) '$(srcdir)/fortran90/marshalling.c'; fi` gl_interop.o: gl_interop/gl_interop.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gl_interop.o -MD -MP -MF $(DEPDIR)/gl_interop.Tpo -c -o gl_interop.o `test -f 'gl_interop/gl_interop.c' || echo '$(srcdir)/'`gl_interop/gl_interop.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gl_interop.Tpo $(DEPDIR)/gl_interop.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gl_interop/gl_interop.c' object='gl_interop.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gl_interop.o `test -f 'gl_interop/gl_interop.c' || echo '$(srcdir)/'`gl_interop/gl_interop.c gl_interop.obj: gl_interop/gl_interop.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gl_interop.obj -MD -MP -MF $(DEPDIR)/gl_interop.Tpo -c -o gl_interop.obj `if test -f 'gl_interop/gl_interop.c'; then $(CYGPATH_W) 'gl_interop/gl_interop.c'; else $(CYGPATH_W) '$(srcdir)/gl_interop/gl_interop.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gl_interop.Tpo $(DEPDIR)/gl_interop.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gl_interop/gl_interop.c' object='gl_interop.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gl_interop.obj `if test -f 'gl_interop/gl_interop.c'; then $(CYGPATH_W) 'gl_interop/gl_interop.c'; else $(CYGPATH_W) '$(srcdir)/gl_interop/gl_interop.c'; fi` gl_interop_idle.o: gl_interop/gl_interop_idle.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gl_interop_idle.o -MD -MP -MF $(DEPDIR)/gl_interop_idle.Tpo -c -o gl_interop_idle.o `test -f 'gl_interop/gl_interop_idle.c' || echo '$(srcdir)/'`gl_interop/gl_interop_idle.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gl_interop_idle.Tpo $(DEPDIR)/gl_interop_idle.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gl_interop/gl_interop_idle.c' object='gl_interop_idle.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gl_interop_idle.o `test -f 'gl_interop/gl_interop_idle.c' || echo '$(srcdir)/'`gl_interop/gl_interop_idle.c gl_interop_idle.obj: gl_interop/gl_interop_idle.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gl_interop_idle.obj -MD -MP -MF $(DEPDIR)/gl_interop_idle.Tpo -c -o gl_interop_idle.obj `if test -f 'gl_interop/gl_interop_idle.c'; then $(CYGPATH_W) 'gl_interop/gl_interop_idle.c'; else $(CYGPATH_W) '$(srcdir)/gl_interop/gl_interop_idle.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gl_interop_idle.Tpo $(DEPDIR)/gl_interop_idle.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gl_interop/gl_interop_idle.c' object='gl_interop_idle.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gl_interop_idle.obj `if test -f 'gl_interop/gl_interop_idle.c'; then $(CYGPATH_W) 'gl_interop/gl_interop_idle.c'; else $(CYGPATH_W) '$(srcdir)/gl_interop/gl_interop_idle.c'; fi` heat.o: heat/heat.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT heat.o -MD -MP -MF $(DEPDIR)/heat.Tpo -c -o heat.o `test -f 'heat/heat.c' || echo '$(srcdir)/'`heat/heat.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/heat.Tpo $(DEPDIR)/heat.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='heat/heat.c' object='heat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o heat.o `test -f 'heat/heat.c' || echo '$(srcdir)/'`heat/heat.c heat.obj: heat/heat.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT heat.obj -MD -MP -MF $(DEPDIR)/heat.Tpo -c -o heat.obj `if test -f 'heat/heat.c'; then $(CYGPATH_W) 'heat/heat.c'; else $(CYGPATH_W) '$(srcdir)/heat/heat.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/heat.Tpo $(DEPDIR)/heat.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='heat/heat.c' object='heat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o heat.obj `if test -f 'heat/heat.c'; then $(CYGPATH_W) 'heat/heat.c'; else $(CYGPATH_W) '$(srcdir)/heat/heat.c'; fi` dw_factolu.o: heat/dw_factolu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dw_factolu.o -MD -MP -MF $(DEPDIR)/dw_factolu.Tpo -c -o dw_factolu.o `test -f 'heat/dw_factolu.c' || echo '$(srcdir)/'`heat/dw_factolu.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dw_factolu.Tpo $(DEPDIR)/dw_factolu.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='heat/dw_factolu.c' object='dw_factolu.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dw_factolu.o `test -f 'heat/dw_factolu.c' || echo '$(srcdir)/'`heat/dw_factolu.c dw_factolu.obj: heat/dw_factolu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dw_factolu.obj -MD -MP -MF $(DEPDIR)/dw_factolu.Tpo -c -o dw_factolu.obj `if test -f 'heat/dw_factolu.c'; then $(CYGPATH_W) 'heat/dw_factolu.c'; else $(CYGPATH_W) '$(srcdir)/heat/dw_factolu.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dw_factolu.Tpo $(DEPDIR)/dw_factolu.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='heat/dw_factolu.c' object='dw_factolu.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dw_factolu.obj `if test -f 'heat/dw_factolu.c'; then $(CYGPATH_W) 'heat/dw_factolu.c'; else $(CYGPATH_W) '$(srcdir)/heat/dw_factolu.c'; fi` dw_factolu_tag.o: heat/dw_factolu_tag.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dw_factolu_tag.o -MD -MP -MF $(DEPDIR)/dw_factolu_tag.Tpo -c -o dw_factolu_tag.o `test -f 'heat/dw_factolu_tag.c' || echo '$(srcdir)/'`heat/dw_factolu_tag.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dw_factolu_tag.Tpo $(DEPDIR)/dw_factolu_tag.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='heat/dw_factolu_tag.c' object='dw_factolu_tag.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dw_factolu_tag.o `test -f 'heat/dw_factolu_tag.c' || echo '$(srcdir)/'`heat/dw_factolu_tag.c dw_factolu_tag.obj: heat/dw_factolu_tag.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dw_factolu_tag.obj -MD -MP -MF $(DEPDIR)/dw_factolu_tag.Tpo -c -o dw_factolu_tag.obj `if test -f 'heat/dw_factolu_tag.c'; then $(CYGPATH_W) 'heat/dw_factolu_tag.c'; else $(CYGPATH_W) '$(srcdir)/heat/dw_factolu_tag.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dw_factolu_tag.Tpo $(DEPDIR)/dw_factolu_tag.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='heat/dw_factolu_tag.c' object='dw_factolu_tag.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dw_factolu_tag.obj `if test -f 'heat/dw_factolu_tag.c'; then $(CYGPATH_W) 'heat/dw_factolu_tag.c'; else $(CYGPATH_W) '$(srcdir)/heat/dw_factolu_tag.c'; fi` dw_factolu_grain.o: heat/dw_factolu_grain.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dw_factolu_grain.o -MD -MP -MF $(DEPDIR)/dw_factolu_grain.Tpo -c -o dw_factolu_grain.o `test -f 'heat/dw_factolu_grain.c' || echo '$(srcdir)/'`heat/dw_factolu_grain.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dw_factolu_grain.Tpo $(DEPDIR)/dw_factolu_grain.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='heat/dw_factolu_grain.c' object='dw_factolu_grain.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dw_factolu_grain.o `test -f 'heat/dw_factolu_grain.c' || echo '$(srcdir)/'`heat/dw_factolu_grain.c dw_factolu_grain.obj: heat/dw_factolu_grain.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dw_factolu_grain.obj -MD -MP -MF $(DEPDIR)/dw_factolu_grain.Tpo -c -o dw_factolu_grain.obj `if test -f 'heat/dw_factolu_grain.c'; then $(CYGPATH_W) 'heat/dw_factolu_grain.c'; else $(CYGPATH_W) '$(srcdir)/heat/dw_factolu_grain.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dw_factolu_grain.Tpo $(DEPDIR)/dw_factolu_grain.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='heat/dw_factolu_grain.c' object='dw_factolu_grain.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dw_factolu_grain.obj `if test -f 'heat/dw_factolu_grain.c'; then $(CYGPATH_W) 'heat/dw_factolu_grain.c'; else $(CYGPATH_W) '$(srcdir)/heat/dw_factolu_grain.c'; fi` dw_sparse_cg.o: heat/dw_sparse_cg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dw_sparse_cg.o -MD -MP -MF $(DEPDIR)/dw_sparse_cg.Tpo -c -o dw_sparse_cg.o `test -f 'heat/dw_sparse_cg.c' || echo '$(srcdir)/'`heat/dw_sparse_cg.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dw_sparse_cg.Tpo $(DEPDIR)/dw_sparse_cg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='heat/dw_sparse_cg.c' object='dw_sparse_cg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dw_sparse_cg.o `test -f 'heat/dw_sparse_cg.c' || echo '$(srcdir)/'`heat/dw_sparse_cg.c dw_sparse_cg.obj: heat/dw_sparse_cg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dw_sparse_cg.obj -MD -MP -MF $(DEPDIR)/dw_sparse_cg.Tpo -c -o dw_sparse_cg.obj `if test -f 'heat/dw_sparse_cg.c'; then $(CYGPATH_W) 'heat/dw_sparse_cg.c'; else $(CYGPATH_W) '$(srcdir)/heat/dw_sparse_cg.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dw_sparse_cg.Tpo $(DEPDIR)/dw_sparse_cg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='heat/dw_sparse_cg.c' object='dw_sparse_cg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dw_sparse_cg.obj `if test -f 'heat/dw_sparse_cg.c'; then $(CYGPATH_W) 'heat/dw_sparse_cg.c'; else $(CYGPATH_W) '$(srcdir)/heat/dw_sparse_cg.c'; fi` heat_display.o: heat/heat_display.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT heat_display.o -MD -MP -MF $(DEPDIR)/heat_display.Tpo -c -o heat_display.o `test -f 'heat/heat_display.c' || echo '$(srcdir)/'`heat/heat_display.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/heat_display.Tpo $(DEPDIR)/heat_display.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='heat/heat_display.c' object='heat_display.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o heat_display.o `test -f 'heat/heat_display.c' || echo '$(srcdir)/'`heat/heat_display.c heat_display.obj: heat/heat_display.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT heat_display.obj -MD -MP -MF $(DEPDIR)/heat_display.Tpo -c -o heat_display.obj `if test -f 'heat/heat_display.c'; then $(CYGPATH_W) 'heat/heat_display.c'; else $(CYGPATH_W) '$(srcdir)/heat/heat_display.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/heat_display.Tpo $(DEPDIR)/heat_display.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='heat/heat_display.c' object='heat_display.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o heat_display.obj `if test -f 'heat/heat_display.c'; then $(CYGPATH_W) 'heat/heat_display.c'; else $(CYGPATH_W) '$(srcdir)/heat/heat_display.c'; fi` lu_kernels_model.o: heat/lu_kernels_model.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lu_kernels_model.o -MD -MP -MF $(DEPDIR)/lu_kernels_model.Tpo -c -o lu_kernels_model.o `test -f 'heat/lu_kernels_model.c' || echo '$(srcdir)/'`heat/lu_kernels_model.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lu_kernels_model.Tpo $(DEPDIR)/lu_kernels_model.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='heat/lu_kernels_model.c' object='lu_kernels_model.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lu_kernels_model.o `test -f 'heat/lu_kernels_model.c' || echo '$(srcdir)/'`heat/lu_kernels_model.c lu_kernels_model.obj: heat/lu_kernels_model.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lu_kernels_model.obj -MD -MP -MF $(DEPDIR)/lu_kernels_model.Tpo -c -o lu_kernels_model.obj `if test -f 'heat/lu_kernels_model.c'; then $(CYGPATH_W) 'heat/lu_kernels_model.c'; else $(CYGPATH_W) '$(srcdir)/heat/lu_kernels_model.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lu_kernels_model.Tpo $(DEPDIR)/lu_kernels_model.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='heat/lu_kernels_model.c' object='lu_kernels_model.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lu_kernels_model.obj `if test -f 'heat/lu_kernels_model.c'; then $(CYGPATH_W) 'heat/lu_kernels_model.c'; else $(CYGPATH_W) '$(srcdir)/heat/lu_kernels_model.c'; fi` dw_sparse_cg_kernels.o: heat/dw_sparse_cg_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dw_sparse_cg_kernels.o -MD -MP -MF $(DEPDIR)/dw_sparse_cg_kernels.Tpo -c -o dw_sparse_cg_kernels.o `test -f 'heat/dw_sparse_cg_kernels.c' || echo '$(srcdir)/'`heat/dw_sparse_cg_kernels.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dw_sparse_cg_kernels.Tpo $(DEPDIR)/dw_sparse_cg_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='heat/dw_sparse_cg_kernels.c' object='dw_sparse_cg_kernels.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dw_sparse_cg_kernels.o `test -f 'heat/dw_sparse_cg_kernels.c' || echo '$(srcdir)/'`heat/dw_sparse_cg_kernels.c dw_sparse_cg_kernels.obj: heat/dw_sparse_cg_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dw_sparse_cg_kernels.obj -MD -MP -MF $(DEPDIR)/dw_sparse_cg_kernels.Tpo -c -o dw_sparse_cg_kernels.obj `if test -f 'heat/dw_sparse_cg_kernels.c'; then $(CYGPATH_W) 'heat/dw_sparse_cg_kernels.c'; else $(CYGPATH_W) '$(srcdir)/heat/dw_sparse_cg_kernels.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dw_sparse_cg_kernels.Tpo $(DEPDIR)/dw_sparse_cg_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='heat/dw_sparse_cg_kernels.c' object='dw_sparse_cg_kernels.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dw_sparse_cg_kernels.obj `if test -f 'heat/dw_sparse_cg_kernels.c'; then $(CYGPATH_W) 'heat/dw_sparse_cg_kernels.c'; else $(CYGPATH_W) '$(srcdir)/heat/dw_sparse_cg_kernels.c'; fi` dw_factolu_kernels.o: heat/dw_factolu_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dw_factolu_kernels.o -MD -MP -MF $(DEPDIR)/dw_factolu_kernels.Tpo -c -o dw_factolu_kernels.o `test -f 'heat/dw_factolu_kernels.c' || echo '$(srcdir)/'`heat/dw_factolu_kernels.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dw_factolu_kernels.Tpo $(DEPDIR)/dw_factolu_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='heat/dw_factolu_kernels.c' object='dw_factolu_kernels.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dw_factolu_kernels.o `test -f 'heat/dw_factolu_kernels.c' || echo '$(srcdir)/'`heat/dw_factolu_kernels.c dw_factolu_kernels.obj: heat/dw_factolu_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dw_factolu_kernels.obj -MD -MP -MF $(DEPDIR)/dw_factolu_kernels.Tpo -c -o dw_factolu_kernels.obj `if test -f 'heat/dw_factolu_kernels.c'; then $(CYGPATH_W) 'heat/dw_factolu_kernels.c'; else $(CYGPATH_W) '$(srcdir)/heat/dw_factolu_kernels.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dw_factolu_kernels.Tpo $(DEPDIR)/dw_factolu_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='heat/dw_factolu_kernels.c' object='dw_factolu_kernels.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dw_factolu_kernels.obj `if test -f 'heat/dw_factolu_kernels.c'; then $(CYGPATH_W) 'heat/dw_factolu_kernels.c'; else $(CYGPATH_W) '$(srcdir)/heat/dw_factolu_kernels.c'; fi` incrementer.o: incrementer/incrementer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT incrementer.o -MD -MP -MF $(DEPDIR)/incrementer.Tpo -c -o incrementer.o `test -f 'incrementer/incrementer.c' || echo '$(srcdir)/'`incrementer/incrementer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/incrementer.Tpo $(DEPDIR)/incrementer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='incrementer/incrementer.c' object='incrementer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o incrementer.o `test -f 'incrementer/incrementer.c' || echo '$(srcdir)/'`incrementer/incrementer.c incrementer.obj: incrementer/incrementer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT incrementer.obj -MD -MP -MF $(DEPDIR)/incrementer.Tpo -c -o incrementer.obj `if test -f 'incrementer/incrementer.c'; then $(CYGPATH_W) 'incrementer/incrementer.c'; else $(CYGPATH_W) '$(srcdir)/incrementer/incrementer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/incrementer.Tpo $(DEPDIR)/incrementer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='incrementer/incrementer.c' object='incrementer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o incrementer.obj `if test -f 'incrementer/incrementer.c'; then $(CYGPATH_W) 'incrementer/incrementer.c'; else $(CYGPATH_W) '$(srcdir)/incrementer/incrementer.c'; fi` complex.o: interface/complex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT complex.o -MD -MP -MF $(DEPDIR)/complex.Tpo -c -o complex.o `test -f 'interface/complex.c' || echo '$(srcdir)/'`interface/complex.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/complex.Tpo $(DEPDIR)/complex.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='interface/complex.c' object='complex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o complex.o `test -f 'interface/complex.c' || echo '$(srcdir)/'`interface/complex.c complex.obj: interface/complex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT complex.obj -MD -MP -MF $(DEPDIR)/complex.Tpo -c -o complex.obj `if test -f 'interface/complex.c'; then $(CYGPATH_W) 'interface/complex.c'; else $(CYGPATH_W) '$(srcdir)/interface/complex.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/complex.Tpo $(DEPDIR)/complex.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='interface/complex.c' object='complex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o complex.obj `if test -f 'interface/complex.c'; then $(CYGPATH_W) 'interface/complex.c'; else $(CYGPATH_W) '$(srcdir)/interface/complex.c'; fi` complex_interface.o: interface/complex_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT complex_interface.o -MD -MP -MF $(DEPDIR)/complex_interface.Tpo -c -o complex_interface.o `test -f 'interface/complex_interface.c' || echo '$(srcdir)/'`interface/complex_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/complex_interface.Tpo $(DEPDIR)/complex_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='interface/complex_interface.c' object='complex_interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o complex_interface.o `test -f 'interface/complex_interface.c' || echo '$(srcdir)/'`interface/complex_interface.c complex_interface.obj: interface/complex_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT complex_interface.obj -MD -MP -MF $(DEPDIR)/complex_interface.Tpo -c -o complex_interface.obj `if test -f 'interface/complex_interface.c'; then $(CYGPATH_W) 'interface/complex_interface.c'; else $(CYGPATH_W) '$(srcdir)/interface/complex_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/complex_interface.Tpo $(DEPDIR)/complex_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='interface/complex_interface.c' object='complex_interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o complex_interface.obj `if test -f 'interface/complex_interface.c'; then $(CYGPATH_W) 'interface/complex_interface.c'; else $(CYGPATH_W) '$(srcdir)/interface/complex_interface.c'; fi` complex_kernels_opencl.o: interface/complex_kernels_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT complex_kernels_opencl.o -MD -MP -MF $(DEPDIR)/complex_kernels_opencl.Tpo -c -o complex_kernels_opencl.o `test -f 'interface/complex_kernels_opencl.c' || echo '$(srcdir)/'`interface/complex_kernels_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/complex_kernels_opencl.Tpo $(DEPDIR)/complex_kernels_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='interface/complex_kernels_opencl.c' object='complex_kernels_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o complex_kernels_opencl.o `test -f 'interface/complex_kernels_opencl.c' || echo '$(srcdir)/'`interface/complex_kernels_opencl.c complex_kernels_opencl.obj: interface/complex_kernels_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT complex_kernels_opencl.obj -MD -MP -MF $(DEPDIR)/complex_kernels_opencl.Tpo -c -o complex_kernels_opencl.obj `if test -f 'interface/complex_kernels_opencl.c'; then $(CYGPATH_W) 'interface/complex_kernels_opencl.c'; else $(CYGPATH_W) '$(srcdir)/interface/complex_kernels_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/complex_kernels_opencl.Tpo $(DEPDIR)/complex_kernels_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='interface/complex_kernels_opencl.c' object='complex_kernels_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o complex_kernels_opencl.obj `if test -f 'interface/complex_kernels_opencl.c'; then $(CYGPATH_W) 'interface/complex_kernels_opencl.c'; else $(CYGPATH_W) '$(srcdir)/interface/complex_kernels_opencl.c'; fi` loader-loader.o: ../tests/loader.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT loader-loader.o -MD -MP -MF $(DEPDIR)/loader-loader.Tpo -c -o loader-loader.o `test -f '../tests/loader.c' || echo '$(srcdir)/'`../tests/loader.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/loader-loader.Tpo $(DEPDIR)/loader-loader.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../tests/loader.c' object='loader-loader.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o loader-loader.o `test -f '../tests/loader.c' || echo '$(srcdir)/'`../tests/loader.c loader-loader.obj: ../tests/loader.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT loader-loader.obj -MD -MP -MF $(DEPDIR)/loader-loader.Tpo -c -o loader-loader.obj `if test -f '../tests/loader.c'; then $(CYGPATH_W) '../tests/loader.c'; else $(CYGPATH_W) '$(srcdir)/../tests/loader.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/loader-loader.Tpo $(DEPDIR)/loader-loader.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../tests/loader.c' object='loader-loader.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o loader-loader.obj `if test -f '../tests/loader.c'; then $(CYGPATH_W) '../tests/loader.c'; else $(CYGPATH_W) '$(srcdir)/../tests/loader.c'; fi` lu_example_complex_double.o: lu/lu_example_complex_double.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lu_example_complex_double.o -MD -MP -MF $(DEPDIR)/lu_example_complex_double.Tpo -c -o lu_example_complex_double.o `test -f 'lu/lu_example_complex_double.c' || echo '$(srcdir)/'`lu/lu_example_complex_double.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lu_example_complex_double.Tpo $(DEPDIR)/lu_example_complex_double.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/lu_example_complex_double.c' object='lu_example_complex_double.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lu_example_complex_double.o `test -f 'lu/lu_example_complex_double.c' || echo '$(srcdir)/'`lu/lu_example_complex_double.c lu_example_complex_double.obj: lu/lu_example_complex_double.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lu_example_complex_double.obj -MD -MP -MF $(DEPDIR)/lu_example_complex_double.Tpo -c -o lu_example_complex_double.obj `if test -f 'lu/lu_example_complex_double.c'; then $(CYGPATH_W) 'lu/lu_example_complex_double.c'; else $(CYGPATH_W) '$(srcdir)/lu/lu_example_complex_double.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lu_example_complex_double.Tpo $(DEPDIR)/lu_example_complex_double.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/lu_example_complex_double.c' object='lu_example_complex_double.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lu_example_complex_double.obj `if test -f 'lu/lu_example_complex_double.c'; then $(CYGPATH_W) 'lu/lu_example_complex_double.c'; else $(CYGPATH_W) '$(srcdir)/lu/lu_example_complex_double.c'; fi` zlu.o: lu/zlu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zlu.o -MD -MP -MF $(DEPDIR)/zlu.Tpo -c -o zlu.o `test -f 'lu/zlu.c' || echo '$(srcdir)/'`lu/zlu.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/zlu.Tpo $(DEPDIR)/zlu.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/zlu.c' object='zlu.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zlu.o `test -f 'lu/zlu.c' || echo '$(srcdir)/'`lu/zlu.c zlu.obj: lu/zlu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zlu.obj -MD -MP -MF $(DEPDIR)/zlu.Tpo -c -o zlu.obj `if test -f 'lu/zlu.c'; then $(CYGPATH_W) 'lu/zlu.c'; else $(CYGPATH_W) '$(srcdir)/lu/zlu.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/zlu.Tpo $(DEPDIR)/zlu.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/zlu.c' object='zlu.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zlu.obj `if test -f 'lu/zlu.c'; then $(CYGPATH_W) 'lu/zlu.c'; else $(CYGPATH_W) '$(srcdir)/lu/zlu.c'; fi` zlu_pivot.o: lu/zlu_pivot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zlu_pivot.o -MD -MP -MF $(DEPDIR)/zlu_pivot.Tpo -c -o zlu_pivot.o `test -f 'lu/zlu_pivot.c' || echo '$(srcdir)/'`lu/zlu_pivot.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/zlu_pivot.Tpo $(DEPDIR)/zlu_pivot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/zlu_pivot.c' object='zlu_pivot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zlu_pivot.o `test -f 'lu/zlu_pivot.c' || echo '$(srcdir)/'`lu/zlu_pivot.c zlu_pivot.obj: lu/zlu_pivot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zlu_pivot.obj -MD -MP -MF $(DEPDIR)/zlu_pivot.Tpo -c -o zlu_pivot.obj `if test -f 'lu/zlu_pivot.c'; then $(CYGPATH_W) 'lu/zlu_pivot.c'; else $(CYGPATH_W) '$(srcdir)/lu/zlu_pivot.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/zlu_pivot.Tpo $(DEPDIR)/zlu_pivot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/zlu_pivot.c' object='zlu_pivot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zlu_pivot.obj `if test -f 'lu/zlu_pivot.c'; then $(CYGPATH_W) 'lu/zlu_pivot.c'; else $(CYGPATH_W) '$(srcdir)/lu/zlu_pivot.c'; fi` zlu_kernels.o: lu/zlu_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zlu_kernels.o -MD -MP -MF $(DEPDIR)/zlu_kernels.Tpo -c -o zlu_kernels.o `test -f 'lu/zlu_kernels.c' || echo '$(srcdir)/'`lu/zlu_kernels.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/zlu_kernels.Tpo $(DEPDIR)/zlu_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/zlu_kernels.c' object='zlu_kernels.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zlu_kernels.o `test -f 'lu/zlu_kernels.c' || echo '$(srcdir)/'`lu/zlu_kernels.c zlu_kernels.obj: lu/zlu_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zlu_kernels.obj -MD -MP -MF $(DEPDIR)/zlu_kernels.Tpo -c -o zlu_kernels.obj `if test -f 'lu/zlu_kernels.c'; then $(CYGPATH_W) 'lu/zlu_kernels.c'; else $(CYGPATH_W) '$(srcdir)/lu/zlu_kernels.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/zlu_kernels.Tpo $(DEPDIR)/zlu_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/zlu_kernels.c' object='zlu_kernels.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zlu_kernels.obj `if test -f 'lu/zlu_kernels.c'; then $(CYGPATH_W) 'lu/zlu_kernels.c'; else $(CYGPATH_W) '$(srcdir)/lu/zlu_kernels.c'; fi` blas_complex.o: lu/blas_complex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT blas_complex.o -MD -MP -MF $(DEPDIR)/blas_complex.Tpo -c -o blas_complex.o `test -f 'lu/blas_complex.c' || echo '$(srcdir)/'`lu/blas_complex.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/blas_complex.Tpo $(DEPDIR)/blas_complex.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/blas_complex.c' object='blas_complex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o blas_complex.o `test -f 'lu/blas_complex.c' || echo '$(srcdir)/'`lu/blas_complex.c blas_complex.obj: lu/blas_complex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT blas_complex.obj -MD -MP -MF $(DEPDIR)/blas_complex.Tpo -c -o blas_complex.obj `if test -f 'lu/blas_complex.c'; then $(CYGPATH_W) 'lu/blas_complex.c'; else $(CYGPATH_W) '$(srcdir)/lu/blas_complex.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/blas_complex.Tpo $(DEPDIR)/blas_complex.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/blas_complex.c' object='blas_complex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o blas_complex.obj `if test -f 'lu/blas_complex.c'; then $(CYGPATH_W) 'lu/blas_complex.c'; else $(CYGPATH_W) '$(srcdir)/lu/blas_complex.c'; fi` lu_example_complex_float.o: lu/lu_example_complex_float.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lu_example_complex_float.o -MD -MP -MF $(DEPDIR)/lu_example_complex_float.Tpo -c -o lu_example_complex_float.o `test -f 'lu/lu_example_complex_float.c' || echo '$(srcdir)/'`lu/lu_example_complex_float.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lu_example_complex_float.Tpo $(DEPDIR)/lu_example_complex_float.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/lu_example_complex_float.c' object='lu_example_complex_float.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lu_example_complex_float.o `test -f 'lu/lu_example_complex_float.c' || echo '$(srcdir)/'`lu/lu_example_complex_float.c lu_example_complex_float.obj: lu/lu_example_complex_float.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lu_example_complex_float.obj -MD -MP -MF $(DEPDIR)/lu_example_complex_float.Tpo -c -o lu_example_complex_float.obj `if test -f 'lu/lu_example_complex_float.c'; then $(CYGPATH_W) 'lu/lu_example_complex_float.c'; else $(CYGPATH_W) '$(srcdir)/lu/lu_example_complex_float.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lu_example_complex_float.Tpo $(DEPDIR)/lu_example_complex_float.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/lu_example_complex_float.c' object='lu_example_complex_float.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lu_example_complex_float.obj `if test -f 'lu/lu_example_complex_float.c'; then $(CYGPATH_W) 'lu/lu_example_complex_float.c'; else $(CYGPATH_W) '$(srcdir)/lu/lu_example_complex_float.c'; fi` clu.o: lu/clu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT clu.o -MD -MP -MF $(DEPDIR)/clu.Tpo -c -o clu.o `test -f 'lu/clu.c' || echo '$(srcdir)/'`lu/clu.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/clu.Tpo $(DEPDIR)/clu.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/clu.c' object='clu.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o clu.o `test -f 'lu/clu.c' || echo '$(srcdir)/'`lu/clu.c clu.obj: lu/clu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT clu.obj -MD -MP -MF $(DEPDIR)/clu.Tpo -c -o clu.obj `if test -f 'lu/clu.c'; then $(CYGPATH_W) 'lu/clu.c'; else $(CYGPATH_W) '$(srcdir)/lu/clu.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/clu.Tpo $(DEPDIR)/clu.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/clu.c' object='clu.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o clu.obj `if test -f 'lu/clu.c'; then $(CYGPATH_W) 'lu/clu.c'; else $(CYGPATH_W) '$(srcdir)/lu/clu.c'; fi` clu_pivot.o: lu/clu_pivot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT clu_pivot.o -MD -MP -MF $(DEPDIR)/clu_pivot.Tpo -c -o clu_pivot.o `test -f 'lu/clu_pivot.c' || echo '$(srcdir)/'`lu/clu_pivot.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/clu_pivot.Tpo $(DEPDIR)/clu_pivot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/clu_pivot.c' object='clu_pivot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o clu_pivot.o `test -f 'lu/clu_pivot.c' || echo '$(srcdir)/'`lu/clu_pivot.c clu_pivot.obj: lu/clu_pivot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT clu_pivot.obj -MD -MP -MF $(DEPDIR)/clu_pivot.Tpo -c -o clu_pivot.obj `if test -f 'lu/clu_pivot.c'; then $(CYGPATH_W) 'lu/clu_pivot.c'; else $(CYGPATH_W) '$(srcdir)/lu/clu_pivot.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/clu_pivot.Tpo $(DEPDIR)/clu_pivot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/clu_pivot.c' object='clu_pivot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o clu_pivot.obj `if test -f 'lu/clu_pivot.c'; then $(CYGPATH_W) 'lu/clu_pivot.c'; else $(CYGPATH_W) '$(srcdir)/lu/clu_pivot.c'; fi` clu_kernels.o: lu/clu_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT clu_kernels.o -MD -MP -MF $(DEPDIR)/clu_kernels.Tpo -c -o clu_kernels.o `test -f 'lu/clu_kernels.c' || echo '$(srcdir)/'`lu/clu_kernels.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/clu_kernels.Tpo $(DEPDIR)/clu_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/clu_kernels.c' object='clu_kernels.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o clu_kernels.o `test -f 'lu/clu_kernels.c' || echo '$(srcdir)/'`lu/clu_kernels.c clu_kernels.obj: lu/clu_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT clu_kernels.obj -MD -MP -MF $(DEPDIR)/clu_kernels.Tpo -c -o clu_kernels.obj `if test -f 'lu/clu_kernels.c'; then $(CYGPATH_W) 'lu/clu_kernels.c'; else $(CYGPATH_W) '$(srcdir)/lu/clu_kernels.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/clu_kernels.Tpo $(DEPDIR)/clu_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/clu_kernels.c' object='clu_kernels.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o clu_kernels.obj `if test -f 'lu/clu_kernels.c'; then $(CYGPATH_W) 'lu/clu_kernels.c'; else $(CYGPATH_W) '$(srcdir)/lu/clu_kernels.c'; fi` lu_example_double.o: lu/lu_example_double.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lu_example_double.o -MD -MP -MF $(DEPDIR)/lu_example_double.Tpo -c -o lu_example_double.o `test -f 'lu/lu_example_double.c' || echo '$(srcdir)/'`lu/lu_example_double.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lu_example_double.Tpo $(DEPDIR)/lu_example_double.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/lu_example_double.c' object='lu_example_double.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lu_example_double.o `test -f 'lu/lu_example_double.c' || echo '$(srcdir)/'`lu/lu_example_double.c lu_example_double.obj: lu/lu_example_double.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lu_example_double.obj -MD -MP -MF $(DEPDIR)/lu_example_double.Tpo -c -o lu_example_double.obj `if test -f 'lu/lu_example_double.c'; then $(CYGPATH_W) 'lu/lu_example_double.c'; else $(CYGPATH_W) '$(srcdir)/lu/lu_example_double.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lu_example_double.Tpo $(DEPDIR)/lu_example_double.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/lu_example_double.c' object='lu_example_double.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lu_example_double.obj `if test -f 'lu/lu_example_double.c'; then $(CYGPATH_W) 'lu/lu_example_double.c'; else $(CYGPATH_W) '$(srcdir)/lu/lu_example_double.c'; fi` dlu.o: lu/dlu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dlu.o -MD -MP -MF $(DEPDIR)/dlu.Tpo -c -o dlu.o `test -f 'lu/dlu.c' || echo '$(srcdir)/'`lu/dlu.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dlu.Tpo $(DEPDIR)/dlu.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/dlu.c' object='dlu.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dlu.o `test -f 'lu/dlu.c' || echo '$(srcdir)/'`lu/dlu.c dlu.obj: lu/dlu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dlu.obj -MD -MP -MF $(DEPDIR)/dlu.Tpo -c -o dlu.obj `if test -f 'lu/dlu.c'; then $(CYGPATH_W) 'lu/dlu.c'; else $(CYGPATH_W) '$(srcdir)/lu/dlu.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dlu.Tpo $(DEPDIR)/dlu.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/dlu.c' object='dlu.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dlu.obj `if test -f 'lu/dlu.c'; then $(CYGPATH_W) 'lu/dlu.c'; else $(CYGPATH_W) '$(srcdir)/lu/dlu.c'; fi` dlu_pivot.o: lu/dlu_pivot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dlu_pivot.o -MD -MP -MF $(DEPDIR)/dlu_pivot.Tpo -c -o dlu_pivot.o `test -f 'lu/dlu_pivot.c' || echo '$(srcdir)/'`lu/dlu_pivot.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dlu_pivot.Tpo $(DEPDIR)/dlu_pivot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/dlu_pivot.c' object='dlu_pivot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dlu_pivot.o `test -f 'lu/dlu_pivot.c' || echo '$(srcdir)/'`lu/dlu_pivot.c dlu_pivot.obj: lu/dlu_pivot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dlu_pivot.obj -MD -MP -MF $(DEPDIR)/dlu_pivot.Tpo -c -o dlu_pivot.obj `if test -f 'lu/dlu_pivot.c'; then $(CYGPATH_W) 'lu/dlu_pivot.c'; else $(CYGPATH_W) '$(srcdir)/lu/dlu_pivot.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dlu_pivot.Tpo $(DEPDIR)/dlu_pivot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/dlu_pivot.c' object='dlu_pivot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dlu_pivot.obj `if test -f 'lu/dlu_pivot.c'; then $(CYGPATH_W) 'lu/dlu_pivot.c'; else $(CYGPATH_W) '$(srcdir)/lu/dlu_pivot.c'; fi` dlu_kernels.o: lu/dlu_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dlu_kernels.o -MD -MP -MF $(DEPDIR)/dlu_kernels.Tpo -c -o dlu_kernels.o `test -f 'lu/dlu_kernels.c' || echo '$(srcdir)/'`lu/dlu_kernels.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dlu_kernels.Tpo $(DEPDIR)/dlu_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/dlu_kernels.c' object='dlu_kernels.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dlu_kernels.o `test -f 'lu/dlu_kernels.c' || echo '$(srcdir)/'`lu/dlu_kernels.c dlu_kernels.obj: lu/dlu_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dlu_kernels.obj -MD -MP -MF $(DEPDIR)/dlu_kernels.Tpo -c -o dlu_kernels.obj `if test -f 'lu/dlu_kernels.c'; then $(CYGPATH_W) 'lu/dlu_kernels.c'; else $(CYGPATH_W) '$(srcdir)/lu/dlu_kernels.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dlu_kernels.Tpo $(DEPDIR)/dlu_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/dlu_kernels.c' object='dlu_kernels.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dlu_kernels.obj `if test -f 'lu/dlu_kernels.c'; then $(CYGPATH_W) 'lu/dlu_kernels.c'; else $(CYGPATH_W) '$(srcdir)/lu/dlu_kernels.c'; fi` lu_example_float.o: lu/lu_example_float.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lu_example_float.o -MD -MP -MF $(DEPDIR)/lu_example_float.Tpo -c -o lu_example_float.o `test -f 'lu/lu_example_float.c' || echo '$(srcdir)/'`lu/lu_example_float.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lu_example_float.Tpo $(DEPDIR)/lu_example_float.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/lu_example_float.c' object='lu_example_float.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lu_example_float.o `test -f 'lu/lu_example_float.c' || echo '$(srcdir)/'`lu/lu_example_float.c lu_example_float.obj: lu/lu_example_float.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lu_example_float.obj -MD -MP -MF $(DEPDIR)/lu_example_float.Tpo -c -o lu_example_float.obj `if test -f 'lu/lu_example_float.c'; then $(CYGPATH_W) 'lu/lu_example_float.c'; else $(CYGPATH_W) '$(srcdir)/lu/lu_example_float.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lu_example_float.Tpo $(DEPDIR)/lu_example_float.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/lu_example_float.c' object='lu_example_float.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lu_example_float.obj `if test -f 'lu/lu_example_float.c'; then $(CYGPATH_W) 'lu/lu_example_float.c'; else $(CYGPATH_W) '$(srcdir)/lu/lu_example_float.c'; fi` slu.o: lu/slu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT slu.o -MD -MP -MF $(DEPDIR)/slu.Tpo -c -o slu.o `test -f 'lu/slu.c' || echo '$(srcdir)/'`lu/slu.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/slu.Tpo $(DEPDIR)/slu.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/slu.c' object='slu.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o slu.o `test -f 'lu/slu.c' || echo '$(srcdir)/'`lu/slu.c slu.obj: lu/slu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT slu.obj -MD -MP -MF $(DEPDIR)/slu.Tpo -c -o slu.obj `if test -f 'lu/slu.c'; then $(CYGPATH_W) 'lu/slu.c'; else $(CYGPATH_W) '$(srcdir)/lu/slu.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/slu.Tpo $(DEPDIR)/slu.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/slu.c' object='slu.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o slu.obj `if test -f 'lu/slu.c'; then $(CYGPATH_W) 'lu/slu.c'; else $(CYGPATH_W) '$(srcdir)/lu/slu.c'; fi` slu_pivot.o: lu/slu_pivot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT slu_pivot.o -MD -MP -MF $(DEPDIR)/slu_pivot.Tpo -c -o slu_pivot.o `test -f 'lu/slu_pivot.c' || echo '$(srcdir)/'`lu/slu_pivot.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/slu_pivot.Tpo $(DEPDIR)/slu_pivot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/slu_pivot.c' object='slu_pivot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o slu_pivot.o `test -f 'lu/slu_pivot.c' || echo '$(srcdir)/'`lu/slu_pivot.c slu_pivot.obj: lu/slu_pivot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT slu_pivot.obj -MD -MP -MF $(DEPDIR)/slu_pivot.Tpo -c -o slu_pivot.obj `if test -f 'lu/slu_pivot.c'; then $(CYGPATH_W) 'lu/slu_pivot.c'; else $(CYGPATH_W) '$(srcdir)/lu/slu_pivot.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/slu_pivot.Tpo $(DEPDIR)/slu_pivot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/slu_pivot.c' object='slu_pivot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o slu_pivot.obj `if test -f 'lu/slu_pivot.c'; then $(CYGPATH_W) 'lu/slu_pivot.c'; else $(CYGPATH_W) '$(srcdir)/lu/slu_pivot.c'; fi` slu_kernels.o: lu/slu_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT slu_kernels.o -MD -MP -MF $(DEPDIR)/slu_kernels.Tpo -c -o slu_kernels.o `test -f 'lu/slu_kernels.c' || echo '$(srcdir)/'`lu/slu_kernels.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/slu_kernels.Tpo $(DEPDIR)/slu_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/slu_kernels.c' object='slu_kernels.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o slu_kernels.o `test -f 'lu/slu_kernels.c' || echo '$(srcdir)/'`lu/slu_kernels.c slu_kernels.obj: lu/slu_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT slu_kernels.obj -MD -MP -MF $(DEPDIR)/slu_kernels.Tpo -c -o slu_kernels.obj `if test -f 'lu/slu_kernels.c'; then $(CYGPATH_W) 'lu/slu_kernels.c'; else $(CYGPATH_W) '$(srcdir)/lu/slu_kernels.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/slu_kernels.Tpo $(DEPDIR)/slu_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/slu_kernels.c' object='slu_kernels.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o slu_kernels.obj `if test -f 'lu/slu_kernels.c'; then $(CYGPATH_W) 'lu/slu_kernels.c'; else $(CYGPATH_W) '$(srcdir)/lu/slu_kernels.c'; fi` zlu_implicit.o: lu/zlu_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zlu_implicit.o -MD -MP -MF $(DEPDIR)/zlu_implicit.Tpo -c -o zlu_implicit.o `test -f 'lu/zlu_implicit.c' || echo '$(srcdir)/'`lu/zlu_implicit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/zlu_implicit.Tpo $(DEPDIR)/zlu_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/zlu_implicit.c' object='zlu_implicit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zlu_implicit.o `test -f 'lu/zlu_implicit.c' || echo '$(srcdir)/'`lu/zlu_implicit.c zlu_implicit.obj: lu/zlu_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zlu_implicit.obj -MD -MP -MF $(DEPDIR)/zlu_implicit.Tpo -c -o zlu_implicit.obj `if test -f 'lu/zlu_implicit.c'; then $(CYGPATH_W) 'lu/zlu_implicit.c'; else $(CYGPATH_W) '$(srcdir)/lu/zlu_implicit.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/zlu_implicit.Tpo $(DEPDIR)/zlu_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/zlu_implicit.c' object='zlu_implicit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zlu_implicit.obj `if test -f 'lu/zlu_implicit.c'; then $(CYGPATH_W) 'lu/zlu_implicit.c'; else $(CYGPATH_W) '$(srcdir)/lu/zlu_implicit.c'; fi` zlu_implicit_pivot.o: lu/zlu_implicit_pivot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zlu_implicit_pivot.o -MD -MP -MF $(DEPDIR)/zlu_implicit_pivot.Tpo -c -o zlu_implicit_pivot.o `test -f 'lu/zlu_implicit_pivot.c' || echo '$(srcdir)/'`lu/zlu_implicit_pivot.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/zlu_implicit_pivot.Tpo $(DEPDIR)/zlu_implicit_pivot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/zlu_implicit_pivot.c' object='zlu_implicit_pivot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zlu_implicit_pivot.o `test -f 'lu/zlu_implicit_pivot.c' || echo '$(srcdir)/'`lu/zlu_implicit_pivot.c zlu_implicit_pivot.obj: lu/zlu_implicit_pivot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zlu_implicit_pivot.obj -MD -MP -MF $(DEPDIR)/zlu_implicit_pivot.Tpo -c -o zlu_implicit_pivot.obj `if test -f 'lu/zlu_implicit_pivot.c'; then $(CYGPATH_W) 'lu/zlu_implicit_pivot.c'; else $(CYGPATH_W) '$(srcdir)/lu/zlu_implicit_pivot.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/zlu_implicit_pivot.Tpo $(DEPDIR)/zlu_implicit_pivot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/zlu_implicit_pivot.c' object='zlu_implicit_pivot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zlu_implicit_pivot.obj `if test -f 'lu/zlu_implicit_pivot.c'; then $(CYGPATH_W) 'lu/zlu_implicit_pivot.c'; else $(CYGPATH_W) '$(srcdir)/lu/zlu_implicit_pivot.c'; fi` clu_implicit.o: lu/clu_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT clu_implicit.o -MD -MP -MF $(DEPDIR)/clu_implicit.Tpo -c -o clu_implicit.o `test -f 'lu/clu_implicit.c' || echo '$(srcdir)/'`lu/clu_implicit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/clu_implicit.Tpo $(DEPDIR)/clu_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/clu_implicit.c' object='clu_implicit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o clu_implicit.o `test -f 'lu/clu_implicit.c' || echo '$(srcdir)/'`lu/clu_implicit.c clu_implicit.obj: lu/clu_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT clu_implicit.obj -MD -MP -MF $(DEPDIR)/clu_implicit.Tpo -c -o clu_implicit.obj `if test -f 'lu/clu_implicit.c'; then $(CYGPATH_W) 'lu/clu_implicit.c'; else $(CYGPATH_W) '$(srcdir)/lu/clu_implicit.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/clu_implicit.Tpo $(DEPDIR)/clu_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/clu_implicit.c' object='clu_implicit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o clu_implicit.obj `if test -f 'lu/clu_implicit.c'; then $(CYGPATH_W) 'lu/clu_implicit.c'; else $(CYGPATH_W) '$(srcdir)/lu/clu_implicit.c'; fi` clu_implicit_pivot.o: lu/clu_implicit_pivot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT clu_implicit_pivot.o -MD -MP -MF $(DEPDIR)/clu_implicit_pivot.Tpo -c -o clu_implicit_pivot.o `test -f 'lu/clu_implicit_pivot.c' || echo '$(srcdir)/'`lu/clu_implicit_pivot.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/clu_implicit_pivot.Tpo $(DEPDIR)/clu_implicit_pivot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/clu_implicit_pivot.c' object='clu_implicit_pivot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o clu_implicit_pivot.o `test -f 'lu/clu_implicit_pivot.c' || echo '$(srcdir)/'`lu/clu_implicit_pivot.c clu_implicit_pivot.obj: lu/clu_implicit_pivot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT clu_implicit_pivot.obj -MD -MP -MF $(DEPDIR)/clu_implicit_pivot.Tpo -c -o clu_implicit_pivot.obj `if test -f 'lu/clu_implicit_pivot.c'; then $(CYGPATH_W) 'lu/clu_implicit_pivot.c'; else $(CYGPATH_W) '$(srcdir)/lu/clu_implicit_pivot.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/clu_implicit_pivot.Tpo $(DEPDIR)/clu_implicit_pivot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/clu_implicit_pivot.c' object='clu_implicit_pivot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o clu_implicit_pivot.obj `if test -f 'lu/clu_implicit_pivot.c'; then $(CYGPATH_W) 'lu/clu_implicit_pivot.c'; else $(CYGPATH_W) '$(srcdir)/lu/clu_implicit_pivot.c'; fi` dlu_implicit.o: lu/dlu_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dlu_implicit.o -MD -MP -MF $(DEPDIR)/dlu_implicit.Tpo -c -o dlu_implicit.o `test -f 'lu/dlu_implicit.c' || echo '$(srcdir)/'`lu/dlu_implicit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dlu_implicit.Tpo $(DEPDIR)/dlu_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/dlu_implicit.c' object='dlu_implicit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dlu_implicit.o `test -f 'lu/dlu_implicit.c' || echo '$(srcdir)/'`lu/dlu_implicit.c dlu_implicit.obj: lu/dlu_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dlu_implicit.obj -MD -MP -MF $(DEPDIR)/dlu_implicit.Tpo -c -o dlu_implicit.obj `if test -f 'lu/dlu_implicit.c'; then $(CYGPATH_W) 'lu/dlu_implicit.c'; else $(CYGPATH_W) '$(srcdir)/lu/dlu_implicit.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dlu_implicit.Tpo $(DEPDIR)/dlu_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/dlu_implicit.c' object='dlu_implicit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dlu_implicit.obj `if test -f 'lu/dlu_implicit.c'; then $(CYGPATH_W) 'lu/dlu_implicit.c'; else $(CYGPATH_W) '$(srcdir)/lu/dlu_implicit.c'; fi` dlu_implicit_pivot.o: lu/dlu_implicit_pivot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dlu_implicit_pivot.o -MD -MP -MF $(DEPDIR)/dlu_implicit_pivot.Tpo -c -o dlu_implicit_pivot.o `test -f 'lu/dlu_implicit_pivot.c' || echo '$(srcdir)/'`lu/dlu_implicit_pivot.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dlu_implicit_pivot.Tpo $(DEPDIR)/dlu_implicit_pivot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/dlu_implicit_pivot.c' object='dlu_implicit_pivot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dlu_implicit_pivot.o `test -f 'lu/dlu_implicit_pivot.c' || echo '$(srcdir)/'`lu/dlu_implicit_pivot.c dlu_implicit_pivot.obj: lu/dlu_implicit_pivot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dlu_implicit_pivot.obj -MD -MP -MF $(DEPDIR)/dlu_implicit_pivot.Tpo -c -o dlu_implicit_pivot.obj `if test -f 'lu/dlu_implicit_pivot.c'; then $(CYGPATH_W) 'lu/dlu_implicit_pivot.c'; else $(CYGPATH_W) '$(srcdir)/lu/dlu_implicit_pivot.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dlu_implicit_pivot.Tpo $(DEPDIR)/dlu_implicit_pivot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/dlu_implicit_pivot.c' object='dlu_implicit_pivot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dlu_implicit_pivot.obj `if test -f 'lu/dlu_implicit_pivot.c'; then $(CYGPATH_W) 'lu/dlu_implicit_pivot.c'; else $(CYGPATH_W) '$(srcdir)/lu/dlu_implicit_pivot.c'; fi` slu_implicit.o: lu/slu_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT slu_implicit.o -MD -MP -MF $(DEPDIR)/slu_implicit.Tpo -c -o slu_implicit.o `test -f 'lu/slu_implicit.c' || echo '$(srcdir)/'`lu/slu_implicit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/slu_implicit.Tpo $(DEPDIR)/slu_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/slu_implicit.c' object='slu_implicit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o slu_implicit.o `test -f 'lu/slu_implicit.c' || echo '$(srcdir)/'`lu/slu_implicit.c slu_implicit.obj: lu/slu_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT slu_implicit.obj -MD -MP -MF $(DEPDIR)/slu_implicit.Tpo -c -o slu_implicit.obj `if test -f 'lu/slu_implicit.c'; then $(CYGPATH_W) 'lu/slu_implicit.c'; else $(CYGPATH_W) '$(srcdir)/lu/slu_implicit.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/slu_implicit.Tpo $(DEPDIR)/slu_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/slu_implicit.c' object='slu_implicit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o slu_implicit.obj `if test -f 'lu/slu_implicit.c'; then $(CYGPATH_W) 'lu/slu_implicit.c'; else $(CYGPATH_W) '$(srcdir)/lu/slu_implicit.c'; fi` slu_implicit_pivot.o: lu/slu_implicit_pivot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT slu_implicit_pivot.o -MD -MP -MF $(DEPDIR)/slu_implicit_pivot.Tpo -c -o slu_implicit_pivot.o `test -f 'lu/slu_implicit_pivot.c' || echo '$(srcdir)/'`lu/slu_implicit_pivot.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/slu_implicit_pivot.Tpo $(DEPDIR)/slu_implicit_pivot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/slu_implicit_pivot.c' object='slu_implicit_pivot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o slu_implicit_pivot.o `test -f 'lu/slu_implicit_pivot.c' || echo '$(srcdir)/'`lu/slu_implicit_pivot.c slu_implicit_pivot.obj: lu/slu_implicit_pivot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT slu_implicit_pivot.obj -MD -MP -MF $(DEPDIR)/slu_implicit_pivot.Tpo -c -o slu_implicit_pivot.obj `if test -f 'lu/slu_implicit_pivot.c'; then $(CYGPATH_W) 'lu/slu_implicit_pivot.c'; else $(CYGPATH_W) '$(srcdir)/lu/slu_implicit_pivot.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/slu_implicit_pivot.Tpo $(DEPDIR)/slu_implicit_pivot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lu/slu_implicit_pivot.c' object='slu_implicit_pivot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o slu_implicit_pivot.obj `if test -f 'lu/slu_implicit_pivot.c'; then $(CYGPATH_W) 'lu/slu_implicit_pivot.c'; else $(CYGPATH_W) '$(srcdir)/lu/slu_implicit_pivot.c'; fi` mandelbrot_mandelbrot-mandelbrot.o: mandelbrot/mandelbrot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mandelbrot_mandelbrot_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mandelbrot_mandelbrot-mandelbrot.o -MD -MP -MF $(DEPDIR)/mandelbrot_mandelbrot-mandelbrot.Tpo -c -o mandelbrot_mandelbrot-mandelbrot.o `test -f 'mandelbrot/mandelbrot.c' || echo '$(srcdir)/'`mandelbrot/mandelbrot.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mandelbrot_mandelbrot-mandelbrot.Tpo $(DEPDIR)/mandelbrot_mandelbrot-mandelbrot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mandelbrot/mandelbrot.c' object='mandelbrot_mandelbrot-mandelbrot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mandelbrot_mandelbrot_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mandelbrot_mandelbrot-mandelbrot.o `test -f 'mandelbrot/mandelbrot.c' || echo '$(srcdir)/'`mandelbrot/mandelbrot.c mandelbrot_mandelbrot-mandelbrot.obj: mandelbrot/mandelbrot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mandelbrot_mandelbrot_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mandelbrot_mandelbrot-mandelbrot.obj -MD -MP -MF $(DEPDIR)/mandelbrot_mandelbrot-mandelbrot.Tpo -c -o mandelbrot_mandelbrot-mandelbrot.obj `if test -f 'mandelbrot/mandelbrot.c'; then $(CYGPATH_W) 'mandelbrot/mandelbrot.c'; else $(CYGPATH_W) '$(srcdir)/mandelbrot/mandelbrot.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mandelbrot_mandelbrot-mandelbrot.Tpo $(DEPDIR)/mandelbrot_mandelbrot-mandelbrot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mandelbrot/mandelbrot.c' object='mandelbrot_mandelbrot-mandelbrot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mandelbrot_mandelbrot_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mandelbrot_mandelbrot-mandelbrot.obj `if test -f 'mandelbrot/mandelbrot.c'; then $(CYGPATH_W) 'mandelbrot/mandelbrot.c'; else $(CYGPATH_W) '$(srcdir)/mandelbrot/mandelbrot.c'; fi` matvecmult.o: matvecmult/matvecmult.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matvecmult.o -MD -MP -MF $(DEPDIR)/matvecmult.Tpo -c -o matvecmult.o `test -f 'matvecmult/matvecmult.c' || echo '$(srcdir)/'`matvecmult/matvecmult.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matvecmult.Tpo $(DEPDIR)/matvecmult.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matvecmult/matvecmult.c' object='matvecmult.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o matvecmult.o `test -f 'matvecmult/matvecmult.c' || echo '$(srcdir)/'`matvecmult/matvecmult.c matvecmult.obj: matvecmult/matvecmult.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matvecmult.obj -MD -MP -MF $(DEPDIR)/matvecmult.Tpo -c -o matvecmult.obj `if test -f 'matvecmult/matvecmult.c'; then $(CYGPATH_W) 'matvecmult/matvecmult.c'; else $(CYGPATH_W) '$(srcdir)/matvecmult/matvecmult.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matvecmult.Tpo $(DEPDIR)/matvecmult.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matvecmult/matvecmult.c' object='matvecmult.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o matvecmult.obj `if test -f 'matvecmult/matvecmult.c'; then $(CYGPATH_W) 'matvecmult/matvecmult.c'; else $(CYGPATH_W) '$(srcdir)/matvecmult/matvecmult.c'; fi` dgemm.o: mult/dgemm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dgemm.o -MD -MP -MF $(DEPDIR)/dgemm.Tpo -c -o dgemm.o `test -f 'mult/dgemm.c' || echo '$(srcdir)/'`mult/dgemm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dgemm.Tpo $(DEPDIR)/dgemm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mult/dgemm.c' object='dgemm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dgemm.o `test -f 'mult/dgemm.c' || echo '$(srcdir)/'`mult/dgemm.c dgemm.obj: mult/dgemm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dgemm.obj -MD -MP -MF $(DEPDIR)/dgemm.Tpo -c -o dgemm.obj `if test -f 'mult/dgemm.c'; then $(CYGPATH_W) 'mult/dgemm.c'; else $(CYGPATH_W) '$(srcdir)/mult/dgemm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dgemm.Tpo $(DEPDIR)/dgemm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mult/dgemm.c' object='dgemm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dgemm.obj `if test -f 'mult/dgemm.c'; then $(CYGPATH_W) 'mult/dgemm.c'; else $(CYGPATH_W) '$(srcdir)/mult/dgemm.c'; fi` sgemm.o: mult/sgemm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sgemm.o -MD -MP -MF $(DEPDIR)/sgemm.Tpo -c -o sgemm.o `test -f 'mult/sgemm.c' || echo '$(srcdir)/'`mult/sgemm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sgemm.Tpo $(DEPDIR)/sgemm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mult/sgemm.c' object='sgemm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sgemm.o `test -f 'mult/sgemm.c' || echo '$(srcdir)/'`mult/sgemm.c sgemm.obj: mult/sgemm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sgemm.obj -MD -MP -MF $(DEPDIR)/sgemm.Tpo -c -o sgemm.obj `if test -f 'mult/sgemm.c'; then $(CYGPATH_W) 'mult/sgemm.c'; else $(CYGPATH_W) '$(srcdir)/mult/sgemm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sgemm.Tpo $(DEPDIR)/sgemm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mult/sgemm.c' object='sgemm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sgemm.obj `if test -f 'mult/sgemm.c'; then $(CYGPATH_W) 'mult/sgemm.c'; else $(CYGPATH_W) '$(srcdir)/mult/sgemm.c'; fi` openmp_vector_scal_omp-vector_scal_omp.o: openmp/vector_scal_omp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(openmp_vector_scal_omp_CFLAGS) $(CFLAGS) -MT openmp_vector_scal_omp-vector_scal_omp.o -MD -MP -MF $(DEPDIR)/openmp_vector_scal_omp-vector_scal_omp.Tpo -c -o openmp_vector_scal_omp-vector_scal_omp.o `test -f 'openmp/vector_scal_omp.c' || echo '$(srcdir)/'`openmp/vector_scal_omp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/openmp_vector_scal_omp-vector_scal_omp.Tpo $(DEPDIR)/openmp_vector_scal_omp-vector_scal_omp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/vector_scal_omp.c' object='openmp_vector_scal_omp-vector_scal_omp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(openmp_vector_scal_omp_CFLAGS) $(CFLAGS) -c -o openmp_vector_scal_omp-vector_scal_omp.o `test -f 'openmp/vector_scal_omp.c' || echo '$(srcdir)/'`openmp/vector_scal_omp.c openmp_vector_scal_omp-vector_scal_omp.obj: openmp/vector_scal_omp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(openmp_vector_scal_omp_CFLAGS) $(CFLAGS) -MT openmp_vector_scal_omp-vector_scal_omp.obj -MD -MP -MF $(DEPDIR)/openmp_vector_scal_omp-vector_scal_omp.Tpo -c -o openmp_vector_scal_omp-vector_scal_omp.obj `if test -f 'openmp/vector_scal_omp.c'; then $(CYGPATH_W) 'openmp/vector_scal_omp.c'; else $(CYGPATH_W) '$(srcdir)/openmp/vector_scal_omp.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/openmp_vector_scal_omp-vector_scal_omp.Tpo $(DEPDIR)/openmp_vector_scal_omp-vector_scal_omp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/vector_scal_omp.c' object='openmp_vector_scal_omp-vector_scal_omp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(openmp_vector_scal_omp_CFLAGS) $(CFLAGS) -c -o openmp_vector_scal_omp-vector_scal_omp.obj `if test -f 'openmp/vector_scal_omp.c'; then $(CYGPATH_W) 'openmp/vector_scal_omp.c'; else $(CYGPATH_W) '$(srcdir)/openmp/vector_scal_omp.c'; fi` pi.o: pi/pi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pi.o -MD -MP -MF $(DEPDIR)/pi.Tpo -c -o pi.o `test -f 'pi/pi.c' || echo '$(srcdir)/'`pi/pi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pi.Tpo $(DEPDIR)/pi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pi/pi.c' object='pi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pi.o `test -f 'pi/pi.c' || echo '$(srcdir)/'`pi/pi.c pi.obj: pi/pi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pi.obj -MD -MP -MF $(DEPDIR)/pi.Tpo -c -o pi.obj `if test -f 'pi/pi.c'; then $(CYGPATH_W) 'pi/pi.c'; else $(CYGPATH_W) '$(srcdir)/pi/pi.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pi.Tpo $(DEPDIR)/pi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pi/pi.c' object='pi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pi.obj `if test -f 'pi/pi.c'; then $(CYGPATH_W) 'pi/pi.c'; else $(CYGPATH_W) '$(srcdir)/pi/pi.c'; fi` sobol_gold.o: pi/SobolQRNG/sobol_gold.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sobol_gold.o -MD -MP -MF $(DEPDIR)/sobol_gold.Tpo -c -o sobol_gold.o `test -f 'pi/SobolQRNG/sobol_gold.c' || echo '$(srcdir)/'`pi/SobolQRNG/sobol_gold.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sobol_gold.Tpo $(DEPDIR)/sobol_gold.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pi/SobolQRNG/sobol_gold.c' object='sobol_gold.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sobol_gold.o `test -f 'pi/SobolQRNG/sobol_gold.c' || echo '$(srcdir)/'`pi/SobolQRNG/sobol_gold.c sobol_gold.obj: pi/SobolQRNG/sobol_gold.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sobol_gold.obj -MD -MP -MF $(DEPDIR)/sobol_gold.Tpo -c -o sobol_gold.obj `if test -f 'pi/SobolQRNG/sobol_gold.c'; then $(CYGPATH_W) 'pi/SobolQRNG/sobol_gold.c'; else $(CYGPATH_W) '$(srcdir)/pi/SobolQRNG/sobol_gold.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sobol_gold.Tpo $(DEPDIR)/sobol_gold.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pi/SobolQRNG/sobol_gold.c' object='sobol_gold.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sobol_gold.obj `if test -f 'pi/SobolQRNG/sobol_gold.c'; then $(CYGPATH_W) 'pi/SobolQRNG/sobol_gold.c'; else $(CYGPATH_W) '$(srcdir)/pi/SobolQRNG/sobol_gold.c'; fi` sobol_primitives.o: pi/SobolQRNG/sobol_primitives.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sobol_primitives.o -MD -MP -MF $(DEPDIR)/sobol_primitives.Tpo -c -o sobol_primitives.o `test -f 'pi/SobolQRNG/sobol_primitives.c' || echo '$(srcdir)/'`pi/SobolQRNG/sobol_primitives.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sobol_primitives.Tpo $(DEPDIR)/sobol_primitives.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pi/SobolQRNG/sobol_primitives.c' object='sobol_primitives.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sobol_primitives.o `test -f 'pi/SobolQRNG/sobol_primitives.c' || echo '$(srcdir)/'`pi/SobolQRNG/sobol_primitives.c sobol_primitives.obj: pi/SobolQRNG/sobol_primitives.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sobol_primitives.obj -MD -MP -MF $(DEPDIR)/sobol_primitives.Tpo -c -o sobol_primitives.obj `if test -f 'pi/SobolQRNG/sobol_primitives.c'; then $(CYGPATH_W) 'pi/SobolQRNG/sobol_primitives.c'; else $(CYGPATH_W) '$(srcdir)/pi/SobolQRNG/sobol_primitives.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sobol_primitives.Tpo $(DEPDIR)/sobol_primitives.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pi/SobolQRNG/sobol_primitives.c' object='sobol_primitives.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sobol_primitives.obj `if test -f 'pi/SobolQRNG/sobol_primitives.c'; then $(CYGPATH_W) 'pi/SobolQRNG/sobol_primitives.c'; else $(CYGPATH_W) '$(srcdir)/pi/SobolQRNG/sobol_primitives.c'; fi` pi_redux.o: pi/pi_redux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pi_redux.o -MD -MP -MF $(DEPDIR)/pi_redux.Tpo -c -o pi_redux.o `test -f 'pi/pi_redux.c' || echo '$(srcdir)/'`pi/pi_redux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pi_redux.Tpo $(DEPDIR)/pi_redux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pi/pi_redux.c' object='pi_redux.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pi_redux.o `test -f 'pi/pi_redux.c' || echo '$(srcdir)/'`pi/pi_redux.c pi_redux.obj: pi/pi_redux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pi_redux.obj -MD -MP -MF $(DEPDIR)/pi_redux.Tpo -c -o pi_redux.obj `if test -f 'pi/pi_redux.c'; then $(CYGPATH_W) 'pi/pi_redux.c'; else $(CYGPATH_W) '$(srcdir)/pi/pi_redux.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pi_redux.Tpo $(DEPDIR)/pi_redux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pi/pi_redux.c' object='pi_redux.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pi_redux.obj `if test -f 'pi/pi_redux.c'; then $(CYGPATH_W) 'pi/pi_redux.c'; else $(CYGPATH_W) '$(srcdir)/pi/pi_redux.c'; fi` pipeline.o: pipeline/pipeline.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pipeline.o -MD -MP -MF $(DEPDIR)/pipeline.Tpo -c -o pipeline.o `test -f 'pipeline/pipeline.c' || echo '$(srcdir)/'`pipeline/pipeline.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pipeline.Tpo $(DEPDIR)/pipeline.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipeline/pipeline.c' object='pipeline.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pipeline.o `test -f 'pipeline/pipeline.c' || echo '$(srcdir)/'`pipeline/pipeline.c pipeline.obj: pipeline/pipeline.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pipeline.obj -MD -MP -MF $(DEPDIR)/pipeline.Tpo -c -o pipeline.obj `if test -f 'pipeline/pipeline.c'; then $(CYGPATH_W) 'pipeline/pipeline.c'; else $(CYGPATH_W) '$(srcdir)/pipeline/pipeline.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pipeline.Tpo $(DEPDIR)/pipeline.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipeline/pipeline.c' object='pipeline.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pipeline.obj `if test -f 'pipeline/pipeline.c'; then $(CYGPATH_W) 'pipeline/pipeline.c'; else $(CYGPATH_W) '$(srcdir)/pipeline/pipeline.c'; fi` ppm_downscaler.o: ppm_downscaler/ppm_downscaler.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ppm_downscaler.o -MD -MP -MF $(DEPDIR)/ppm_downscaler.Tpo -c -o ppm_downscaler.o `test -f 'ppm_downscaler/ppm_downscaler.c' || echo '$(srcdir)/'`ppm_downscaler/ppm_downscaler.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppm_downscaler.Tpo $(DEPDIR)/ppm_downscaler.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ppm_downscaler/ppm_downscaler.c' object='ppm_downscaler.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ppm_downscaler.o `test -f 'ppm_downscaler/ppm_downscaler.c' || echo '$(srcdir)/'`ppm_downscaler/ppm_downscaler.c ppm_downscaler.obj: ppm_downscaler/ppm_downscaler.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ppm_downscaler.obj -MD -MP -MF $(DEPDIR)/ppm_downscaler.Tpo -c -o ppm_downscaler.obj `if test -f 'ppm_downscaler/ppm_downscaler.c'; then $(CYGPATH_W) 'ppm_downscaler/ppm_downscaler.c'; else $(CYGPATH_W) '$(srcdir)/ppm_downscaler/ppm_downscaler.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ppm_downscaler.Tpo $(DEPDIR)/ppm_downscaler.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ppm_downscaler/ppm_downscaler.c' object='ppm_downscaler.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ppm_downscaler.obj `if test -f 'ppm_downscaler/ppm_downscaler.c'; then $(CYGPATH_W) 'ppm_downscaler/ppm_downscaler.c'; else $(CYGPATH_W) '$(srcdir)/ppm_downscaler/ppm_downscaler.c'; fi` yuv_downscaler.o: ppm_downscaler/yuv_downscaler.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT yuv_downscaler.o -MD -MP -MF $(DEPDIR)/yuv_downscaler.Tpo -c -o yuv_downscaler.o `test -f 'ppm_downscaler/yuv_downscaler.c' || echo '$(srcdir)/'`ppm_downscaler/yuv_downscaler.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/yuv_downscaler.Tpo $(DEPDIR)/yuv_downscaler.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ppm_downscaler/yuv_downscaler.c' object='yuv_downscaler.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o yuv_downscaler.o `test -f 'ppm_downscaler/yuv_downscaler.c' || echo '$(srcdir)/'`ppm_downscaler/yuv_downscaler.c yuv_downscaler.obj: ppm_downscaler/yuv_downscaler.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT yuv_downscaler.obj -MD -MP -MF $(DEPDIR)/yuv_downscaler.Tpo -c -o yuv_downscaler.obj `if test -f 'ppm_downscaler/yuv_downscaler.c'; then $(CYGPATH_W) 'ppm_downscaler/yuv_downscaler.c'; else $(CYGPATH_W) '$(srcdir)/ppm_downscaler/yuv_downscaler.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/yuv_downscaler.Tpo $(DEPDIR)/yuv_downscaler.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ppm_downscaler/yuv_downscaler.c' object='yuv_downscaler.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o yuv_downscaler.obj `if test -f 'ppm_downscaler/yuv_downscaler.c'; then $(CYGPATH_W) 'ppm_downscaler/yuv_downscaler.c'; else $(CYGPATH_W) '$(srcdir)/ppm_downscaler/yuv_downscaler.c'; fi` profiling.o: profiling/profiling.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT profiling.o -MD -MP -MF $(DEPDIR)/profiling.Tpo -c -o profiling.o `test -f 'profiling/profiling.c' || echo '$(srcdir)/'`profiling/profiling.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/profiling.Tpo $(DEPDIR)/profiling.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='profiling/profiling.c' object='profiling.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o profiling.o `test -f 'profiling/profiling.c' || echo '$(srcdir)/'`profiling/profiling.c profiling.obj: profiling/profiling.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT profiling.obj -MD -MP -MF $(DEPDIR)/profiling.Tpo -c -o profiling.obj `if test -f 'profiling/profiling.c'; then $(CYGPATH_W) 'profiling/profiling.c'; else $(CYGPATH_W) '$(srcdir)/profiling/profiling.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/profiling.Tpo $(DEPDIR)/profiling.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='profiling/profiling.c' object='profiling.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o profiling.obj `if test -f 'profiling/profiling.c'; then $(CYGPATH_W) 'profiling/profiling.c'; else $(CYGPATH_W) '$(srcdir)/profiling/profiling.c'; fi` dot_product.o: reductions/dot_product.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dot_product.o -MD -MP -MF $(DEPDIR)/dot_product.Tpo -c -o dot_product.o `test -f 'reductions/dot_product.c' || echo '$(srcdir)/'`reductions/dot_product.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dot_product.Tpo $(DEPDIR)/dot_product.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='reductions/dot_product.c' object='dot_product.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dot_product.o `test -f 'reductions/dot_product.c' || echo '$(srcdir)/'`reductions/dot_product.c dot_product.obj: reductions/dot_product.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dot_product.obj -MD -MP -MF $(DEPDIR)/dot_product.Tpo -c -o dot_product.obj `if test -f 'reductions/dot_product.c'; then $(CYGPATH_W) 'reductions/dot_product.c'; else $(CYGPATH_W) '$(srcdir)/reductions/dot_product.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dot_product.Tpo $(DEPDIR)/dot_product.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='reductions/dot_product.c' object='dot_product.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dot_product.obj `if test -f 'reductions/dot_product.c'; then $(CYGPATH_W) 'reductions/dot_product.c'; else $(CYGPATH_W) '$(srcdir)/reductions/dot_product.c'; fi` minmax_reduction.o: reductions/minmax_reduction.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT minmax_reduction.o -MD -MP -MF $(DEPDIR)/minmax_reduction.Tpo -c -o minmax_reduction.o `test -f 'reductions/minmax_reduction.c' || echo '$(srcdir)/'`reductions/minmax_reduction.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/minmax_reduction.Tpo $(DEPDIR)/minmax_reduction.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='reductions/minmax_reduction.c' object='minmax_reduction.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o minmax_reduction.o `test -f 'reductions/minmax_reduction.c' || echo '$(srcdir)/'`reductions/minmax_reduction.c minmax_reduction.obj: reductions/minmax_reduction.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT minmax_reduction.obj -MD -MP -MF $(DEPDIR)/minmax_reduction.Tpo -c -o minmax_reduction.obj `if test -f 'reductions/minmax_reduction.c'; then $(CYGPATH_W) 'reductions/minmax_reduction.c'; else $(CYGPATH_W) '$(srcdir)/reductions/minmax_reduction.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/minmax_reduction.Tpo $(DEPDIR)/minmax_reduction.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='reductions/minmax_reduction.c' object='minmax_reduction.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o minmax_reduction.obj `if test -f 'reductions/minmax_reduction.c'; then $(CYGPATH_W) 'reductions/minmax_reduction.c'; else $(CYGPATH_W) '$(srcdir)/reductions/minmax_reduction.c'; fi` dummy_sched_with_ctx.o: sched_ctx/dummy_sched_with_ctx.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dummy_sched_with_ctx.o -MD -MP -MF $(DEPDIR)/dummy_sched_with_ctx.Tpo -c -o dummy_sched_with_ctx.o `test -f 'sched_ctx/dummy_sched_with_ctx.c' || echo '$(srcdir)/'`sched_ctx/dummy_sched_with_ctx.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dummy_sched_with_ctx.Tpo $(DEPDIR)/dummy_sched_with_ctx.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/dummy_sched_with_ctx.c' object='dummy_sched_with_ctx.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dummy_sched_with_ctx.o `test -f 'sched_ctx/dummy_sched_with_ctx.c' || echo '$(srcdir)/'`sched_ctx/dummy_sched_with_ctx.c dummy_sched_with_ctx.obj: sched_ctx/dummy_sched_with_ctx.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dummy_sched_with_ctx.obj -MD -MP -MF $(DEPDIR)/dummy_sched_with_ctx.Tpo -c -o dummy_sched_with_ctx.obj `if test -f 'sched_ctx/dummy_sched_with_ctx.c'; then $(CYGPATH_W) 'sched_ctx/dummy_sched_with_ctx.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/dummy_sched_with_ctx.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dummy_sched_with_ctx.Tpo $(DEPDIR)/dummy_sched_with_ctx.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/dummy_sched_with_ctx.c' object='dummy_sched_with_ctx.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dummy_sched_with_ctx.obj `if test -f 'sched_ctx/dummy_sched_with_ctx.c'; then $(CYGPATH_W) 'sched_ctx/dummy_sched_with_ctx.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/dummy_sched_with_ctx.c'; fi` sched_ctx_nested_sched_ctxs-nested_sched_ctxs.o: sched_ctx/nested_sched_ctxs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sched_ctx_nested_sched_ctxs_CFLAGS) $(CFLAGS) -MT sched_ctx_nested_sched_ctxs-nested_sched_ctxs.o -MD -MP -MF $(DEPDIR)/sched_ctx_nested_sched_ctxs-nested_sched_ctxs.Tpo -c -o sched_ctx_nested_sched_ctxs-nested_sched_ctxs.o `test -f 'sched_ctx/nested_sched_ctxs.c' || echo '$(srcdir)/'`sched_ctx/nested_sched_ctxs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_nested_sched_ctxs-nested_sched_ctxs.Tpo $(DEPDIR)/sched_ctx_nested_sched_ctxs-nested_sched_ctxs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/nested_sched_ctxs.c' object='sched_ctx_nested_sched_ctxs-nested_sched_ctxs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sched_ctx_nested_sched_ctxs_CFLAGS) $(CFLAGS) -c -o sched_ctx_nested_sched_ctxs-nested_sched_ctxs.o `test -f 'sched_ctx/nested_sched_ctxs.c' || echo '$(srcdir)/'`sched_ctx/nested_sched_ctxs.c sched_ctx_nested_sched_ctxs-nested_sched_ctxs.obj: sched_ctx/nested_sched_ctxs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sched_ctx_nested_sched_ctxs_CFLAGS) $(CFLAGS) -MT sched_ctx_nested_sched_ctxs-nested_sched_ctxs.obj -MD -MP -MF $(DEPDIR)/sched_ctx_nested_sched_ctxs-nested_sched_ctxs.Tpo -c -o sched_ctx_nested_sched_ctxs-nested_sched_ctxs.obj `if test -f 'sched_ctx/nested_sched_ctxs.c'; then $(CYGPATH_W) 'sched_ctx/nested_sched_ctxs.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/nested_sched_ctxs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_nested_sched_ctxs-nested_sched_ctxs.Tpo $(DEPDIR)/sched_ctx_nested_sched_ctxs-nested_sched_ctxs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/nested_sched_ctxs.c' object='sched_ctx_nested_sched_ctxs-nested_sched_ctxs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sched_ctx_nested_sched_ctxs_CFLAGS) $(CFLAGS) -c -o sched_ctx_nested_sched_ctxs-nested_sched_ctxs.obj `if test -f 'sched_ctx/nested_sched_ctxs.c'; then $(CYGPATH_W) 'sched_ctx/nested_sched_ctxs.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/nested_sched_ctxs.c'; fi` sched_ctx_parallel_code-parallel_code.o: sched_ctx/parallel_code.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sched_ctx_parallel_code_CFLAGS) $(CFLAGS) -MT sched_ctx_parallel_code-parallel_code.o -MD -MP -MF $(DEPDIR)/sched_ctx_parallel_code-parallel_code.Tpo -c -o sched_ctx_parallel_code-parallel_code.o `test -f 'sched_ctx/parallel_code.c' || echo '$(srcdir)/'`sched_ctx/parallel_code.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_parallel_code-parallel_code.Tpo $(DEPDIR)/sched_ctx_parallel_code-parallel_code.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/parallel_code.c' object='sched_ctx_parallel_code-parallel_code.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sched_ctx_parallel_code_CFLAGS) $(CFLAGS) -c -o sched_ctx_parallel_code-parallel_code.o `test -f 'sched_ctx/parallel_code.c' || echo '$(srcdir)/'`sched_ctx/parallel_code.c sched_ctx_parallel_code-parallel_code.obj: sched_ctx/parallel_code.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sched_ctx_parallel_code_CFLAGS) $(CFLAGS) -MT sched_ctx_parallel_code-parallel_code.obj -MD -MP -MF $(DEPDIR)/sched_ctx_parallel_code-parallel_code.Tpo -c -o sched_ctx_parallel_code-parallel_code.obj `if test -f 'sched_ctx/parallel_code.c'; then $(CYGPATH_W) 'sched_ctx/parallel_code.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/parallel_code.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_parallel_code-parallel_code.Tpo $(DEPDIR)/sched_ctx_parallel_code-parallel_code.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/parallel_code.c' object='sched_ctx_parallel_code-parallel_code.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sched_ctx_parallel_code_CFLAGS) $(CFLAGS) -c -o sched_ctx_parallel_code-parallel_code.obj `if test -f 'sched_ctx/parallel_code.c'; then $(CYGPATH_W) 'sched_ctx/parallel_code.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/parallel_code.c'; fi` sched_ctx_parallel_tasks_reuse_handle-parallel_tasks_reuse_handle.o: sched_ctx/parallel_tasks_reuse_handle.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sched_ctx_parallel_tasks_reuse_handle_CFLAGS) $(CFLAGS) -MT sched_ctx_parallel_tasks_reuse_handle-parallel_tasks_reuse_handle.o -MD -MP -MF $(DEPDIR)/sched_ctx_parallel_tasks_reuse_handle-parallel_tasks_reuse_handle.Tpo -c -o sched_ctx_parallel_tasks_reuse_handle-parallel_tasks_reuse_handle.o `test -f 'sched_ctx/parallel_tasks_reuse_handle.c' || echo '$(srcdir)/'`sched_ctx/parallel_tasks_reuse_handle.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_parallel_tasks_reuse_handle-parallel_tasks_reuse_handle.Tpo $(DEPDIR)/sched_ctx_parallel_tasks_reuse_handle-parallel_tasks_reuse_handle.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/parallel_tasks_reuse_handle.c' object='sched_ctx_parallel_tasks_reuse_handle-parallel_tasks_reuse_handle.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sched_ctx_parallel_tasks_reuse_handle_CFLAGS) $(CFLAGS) -c -o sched_ctx_parallel_tasks_reuse_handle-parallel_tasks_reuse_handle.o `test -f 'sched_ctx/parallel_tasks_reuse_handle.c' || echo '$(srcdir)/'`sched_ctx/parallel_tasks_reuse_handle.c sched_ctx_parallel_tasks_reuse_handle-parallel_tasks_reuse_handle.obj: sched_ctx/parallel_tasks_reuse_handle.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sched_ctx_parallel_tasks_reuse_handle_CFLAGS) $(CFLAGS) -MT sched_ctx_parallel_tasks_reuse_handle-parallel_tasks_reuse_handle.obj -MD -MP -MF $(DEPDIR)/sched_ctx_parallel_tasks_reuse_handle-parallel_tasks_reuse_handle.Tpo -c -o sched_ctx_parallel_tasks_reuse_handle-parallel_tasks_reuse_handle.obj `if test -f 'sched_ctx/parallel_tasks_reuse_handle.c'; then $(CYGPATH_W) 'sched_ctx/parallel_tasks_reuse_handle.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/parallel_tasks_reuse_handle.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_parallel_tasks_reuse_handle-parallel_tasks_reuse_handle.Tpo $(DEPDIR)/sched_ctx_parallel_tasks_reuse_handle-parallel_tasks_reuse_handle.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/parallel_tasks_reuse_handle.c' object='sched_ctx_parallel_tasks_reuse_handle-parallel_tasks_reuse_handle.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sched_ctx_parallel_tasks_reuse_handle_CFLAGS) $(CFLAGS) -c -o sched_ctx_parallel_tasks_reuse_handle-parallel_tasks_reuse_handle.obj `if test -f 'sched_ctx/parallel_tasks_reuse_handle.c'; then $(CYGPATH_W) 'sched_ctx/parallel_tasks_reuse_handle.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/parallel_tasks_reuse_handle.c'; fi` prio.o: sched_ctx/prio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prio.o -MD -MP -MF $(DEPDIR)/prio.Tpo -c -o prio.o `test -f 'sched_ctx/prio.c' || echo '$(srcdir)/'`sched_ctx/prio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/prio.Tpo $(DEPDIR)/prio.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/prio.c' object='prio.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prio.o `test -f 'sched_ctx/prio.c' || echo '$(srcdir)/'`sched_ctx/prio.c prio.obj: sched_ctx/prio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prio.obj -MD -MP -MF $(DEPDIR)/prio.Tpo -c -o prio.obj `if test -f 'sched_ctx/prio.c'; then $(CYGPATH_W) 'sched_ctx/prio.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/prio.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/prio.Tpo $(DEPDIR)/prio.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/prio.c' object='prio.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prio.obj `if test -f 'sched_ctx/prio.c'; then $(CYGPATH_W) 'sched_ctx/prio.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/prio.c'; fi` sched_ctx.o: sched_ctx/sched_ctx.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sched_ctx.o -MD -MP -MF $(DEPDIR)/sched_ctx.Tpo -c -o sched_ctx.o `test -f 'sched_ctx/sched_ctx.c' || echo '$(srcdir)/'`sched_ctx/sched_ctx.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx.Tpo $(DEPDIR)/sched_ctx.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/sched_ctx.c' object='sched_ctx.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sched_ctx.o `test -f 'sched_ctx/sched_ctx.c' || echo '$(srcdir)/'`sched_ctx/sched_ctx.c sched_ctx.obj: sched_ctx/sched_ctx.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sched_ctx.obj -MD -MP -MF $(DEPDIR)/sched_ctx.Tpo -c -o sched_ctx.obj `if test -f 'sched_ctx/sched_ctx.c'; then $(CYGPATH_W) 'sched_ctx/sched_ctx.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/sched_ctx.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx.Tpo $(DEPDIR)/sched_ctx.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/sched_ctx.c' object='sched_ctx.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sched_ctx.obj `if test -f 'sched_ctx/sched_ctx.c'; then $(CYGPATH_W) 'sched_ctx/sched_ctx.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/sched_ctx.c'; fi` sched_ctx_sched_ctx_without_sched_policy-sched_ctx_without_sched_policy.o: sched_ctx/sched_ctx_without_sched_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sched_ctx_sched_ctx_without_sched_policy_CFLAGS) $(CFLAGS) -MT sched_ctx_sched_ctx_without_sched_policy-sched_ctx_without_sched_policy.o -MD -MP -MF $(DEPDIR)/sched_ctx_sched_ctx_without_sched_policy-sched_ctx_without_sched_policy.Tpo -c -o sched_ctx_sched_ctx_without_sched_policy-sched_ctx_without_sched_policy.o `test -f 'sched_ctx/sched_ctx_without_sched_policy.c' || echo '$(srcdir)/'`sched_ctx/sched_ctx_without_sched_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_sched_ctx_without_sched_policy-sched_ctx_without_sched_policy.Tpo $(DEPDIR)/sched_ctx_sched_ctx_without_sched_policy-sched_ctx_without_sched_policy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/sched_ctx_without_sched_policy.c' object='sched_ctx_sched_ctx_without_sched_policy-sched_ctx_without_sched_policy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sched_ctx_sched_ctx_without_sched_policy_CFLAGS) $(CFLAGS) -c -o sched_ctx_sched_ctx_without_sched_policy-sched_ctx_without_sched_policy.o `test -f 'sched_ctx/sched_ctx_without_sched_policy.c' || echo '$(srcdir)/'`sched_ctx/sched_ctx_without_sched_policy.c sched_ctx_sched_ctx_without_sched_policy-sched_ctx_without_sched_policy.obj: sched_ctx/sched_ctx_without_sched_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sched_ctx_sched_ctx_without_sched_policy_CFLAGS) $(CFLAGS) -MT sched_ctx_sched_ctx_without_sched_policy-sched_ctx_without_sched_policy.obj -MD -MP -MF $(DEPDIR)/sched_ctx_sched_ctx_without_sched_policy-sched_ctx_without_sched_policy.Tpo -c -o sched_ctx_sched_ctx_without_sched_policy-sched_ctx_without_sched_policy.obj `if test -f 'sched_ctx/sched_ctx_without_sched_policy.c'; then $(CYGPATH_W) 'sched_ctx/sched_ctx_without_sched_policy.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/sched_ctx_without_sched_policy.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_sched_ctx_without_sched_policy-sched_ctx_without_sched_policy.Tpo $(DEPDIR)/sched_ctx_sched_ctx_without_sched_policy-sched_ctx_without_sched_policy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/sched_ctx_without_sched_policy.c' object='sched_ctx_sched_ctx_without_sched_policy-sched_ctx_without_sched_policy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sched_ctx_sched_ctx_without_sched_policy_CFLAGS) $(CFLAGS) -c -o sched_ctx_sched_ctx_without_sched_policy-sched_ctx_without_sched_policy.obj `if test -f 'sched_ctx/sched_ctx_without_sched_policy.c'; then $(CYGPATH_W) 'sched_ctx/sched_ctx_without_sched_policy.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/sched_ctx_without_sched_policy.c'; fi` sched_ctx_without_sched_policy_awake.o: sched_ctx/sched_ctx_without_sched_policy_awake.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sched_ctx_without_sched_policy_awake.o -MD -MP -MF $(DEPDIR)/sched_ctx_without_sched_policy_awake.Tpo -c -o sched_ctx_without_sched_policy_awake.o `test -f 'sched_ctx/sched_ctx_without_sched_policy_awake.c' || echo '$(srcdir)/'`sched_ctx/sched_ctx_without_sched_policy_awake.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_without_sched_policy_awake.Tpo $(DEPDIR)/sched_ctx_without_sched_policy_awake.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/sched_ctx_without_sched_policy_awake.c' object='sched_ctx_without_sched_policy_awake.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sched_ctx_without_sched_policy_awake.o `test -f 'sched_ctx/sched_ctx_without_sched_policy_awake.c' || echo '$(srcdir)/'`sched_ctx/sched_ctx_without_sched_policy_awake.c sched_ctx_without_sched_policy_awake.obj: sched_ctx/sched_ctx_without_sched_policy_awake.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sched_ctx_without_sched_policy_awake.obj -MD -MP -MF $(DEPDIR)/sched_ctx_without_sched_policy_awake.Tpo -c -o sched_ctx_without_sched_policy_awake.obj `if test -f 'sched_ctx/sched_ctx_without_sched_policy_awake.c'; then $(CYGPATH_W) 'sched_ctx/sched_ctx_without_sched_policy_awake.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/sched_ctx_without_sched_policy_awake.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_without_sched_policy_awake.Tpo $(DEPDIR)/sched_ctx_without_sched_policy_awake.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/sched_ctx_without_sched_policy_awake.c' object='sched_ctx_without_sched_policy_awake.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sched_ctx_without_sched_policy_awake.obj `if test -f 'sched_ctx/sched_ctx_without_sched_policy_awake.c'; then $(CYGPATH_W) 'sched_ctx/sched_ctx_without_sched_policy_awake.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/sched_ctx_without_sched_policy_awake.c'; fi` two_cpu_contexts.o: sched_ctx/two_cpu_contexts.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT two_cpu_contexts.o -MD -MP -MF $(DEPDIR)/two_cpu_contexts.Tpo -c -o two_cpu_contexts.o `test -f 'sched_ctx/two_cpu_contexts.c' || echo '$(srcdir)/'`sched_ctx/two_cpu_contexts.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/two_cpu_contexts.Tpo $(DEPDIR)/two_cpu_contexts.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/two_cpu_contexts.c' object='two_cpu_contexts.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o two_cpu_contexts.o `test -f 'sched_ctx/two_cpu_contexts.c' || echo '$(srcdir)/'`sched_ctx/two_cpu_contexts.c two_cpu_contexts.obj: sched_ctx/two_cpu_contexts.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT two_cpu_contexts.obj -MD -MP -MF $(DEPDIR)/two_cpu_contexts.Tpo -c -o two_cpu_contexts.obj `if test -f 'sched_ctx/two_cpu_contexts.c'; then $(CYGPATH_W) 'sched_ctx/two_cpu_contexts.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/two_cpu_contexts.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/two_cpu_contexts.Tpo $(DEPDIR)/two_cpu_contexts.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/two_cpu_contexts.c' object='two_cpu_contexts.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o two_cpu_contexts.obj `if test -f 'sched_ctx/two_cpu_contexts.c'; then $(CYGPATH_W) 'sched_ctx/two_cpu_contexts.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/two_cpu_contexts.c'; fi` dummy_sched.o: scheduler/dummy_sched.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dummy_sched.o -MD -MP -MF $(DEPDIR)/dummy_sched.Tpo -c -o dummy_sched.o `test -f 'scheduler/dummy_sched.c' || echo '$(srcdir)/'`scheduler/dummy_sched.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dummy_sched.Tpo $(DEPDIR)/dummy_sched.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scheduler/dummy_sched.c' object='dummy_sched.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dummy_sched.o `test -f 'scheduler/dummy_sched.c' || echo '$(srcdir)/'`scheduler/dummy_sched.c dummy_sched.obj: scheduler/dummy_sched.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dummy_sched.obj -MD -MP -MF $(DEPDIR)/dummy_sched.Tpo -c -o dummy_sched.obj `if test -f 'scheduler/dummy_sched.c'; then $(CYGPATH_W) 'scheduler/dummy_sched.c'; else $(CYGPATH_W) '$(srcdir)/scheduler/dummy_sched.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dummy_sched.Tpo $(DEPDIR)/dummy_sched.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scheduler/dummy_sched.c' object='dummy_sched.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dummy_sched.obj `if test -f 'scheduler/dummy_sched.c'; then $(CYGPATH_W) 'scheduler/dummy_sched.c'; else $(CYGPATH_W) '$(srcdir)/scheduler/dummy_sched.c'; fi` vector_scal_spmd.o: spmd/vector_scal_spmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vector_scal_spmd.o -MD -MP -MF $(DEPDIR)/vector_scal_spmd.Tpo -c -o vector_scal_spmd.o `test -f 'spmd/vector_scal_spmd.c' || echo '$(srcdir)/'`spmd/vector_scal_spmd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vector_scal_spmd.Tpo $(DEPDIR)/vector_scal_spmd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='spmd/vector_scal_spmd.c' object='vector_scal_spmd.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vector_scal_spmd.o `test -f 'spmd/vector_scal_spmd.c' || echo '$(srcdir)/'`spmd/vector_scal_spmd.c vector_scal_spmd.obj: spmd/vector_scal_spmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vector_scal_spmd.obj -MD -MP -MF $(DEPDIR)/vector_scal_spmd.Tpo -c -o vector_scal_spmd.obj `if test -f 'spmd/vector_scal_spmd.c'; then $(CYGPATH_W) 'spmd/vector_scal_spmd.c'; else $(CYGPATH_W) '$(srcdir)/spmd/vector_scal_spmd.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vector_scal_spmd.Tpo $(DEPDIR)/vector_scal_spmd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='spmd/vector_scal_spmd.c' object='vector_scal_spmd.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vector_scal_spmd.obj `if test -f 'spmd/vector_scal_spmd.c'; then $(CYGPATH_W) 'spmd/vector_scal_spmd.c'; else $(CYGPATH_W) '$(srcdir)/spmd/vector_scal_spmd.c'; fi` dw_block_spmv.o: spmv/dw_block_spmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dw_block_spmv.o -MD -MP -MF $(DEPDIR)/dw_block_spmv.Tpo -c -o dw_block_spmv.o `test -f 'spmv/dw_block_spmv.c' || echo '$(srcdir)/'`spmv/dw_block_spmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dw_block_spmv.Tpo $(DEPDIR)/dw_block_spmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='spmv/dw_block_spmv.c' object='dw_block_spmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dw_block_spmv.o `test -f 'spmv/dw_block_spmv.c' || echo '$(srcdir)/'`spmv/dw_block_spmv.c dw_block_spmv.obj: spmv/dw_block_spmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dw_block_spmv.obj -MD -MP -MF $(DEPDIR)/dw_block_spmv.Tpo -c -o dw_block_spmv.obj `if test -f 'spmv/dw_block_spmv.c'; then $(CYGPATH_W) 'spmv/dw_block_spmv.c'; else $(CYGPATH_W) '$(srcdir)/spmv/dw_block_spmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dw_block_spmv.Tpo $(DEPDIR)/dw_block_spmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='spmv/dw_block_spmv.c' object='dw_block_spmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dw_block_spmv.obj `if test -f 'spmv/dw_block_spmv.c'; then $(CYGPATH_W) 'spmv/dw_block_spmv.c'; else $(CYGPATH_W) '$(srcdir)/spmv/dw_block_spmv.c'; fi` dw_block_spmv_kernels.o: spmv/dw_block_spmv_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dw_block_spmv_kernels.o -MD -MP -MF $(DEPDIR)/dw_block_spmv_kernels.Tpo -c -o dw_block_spmv_kernels.o `test -f 'spmv/dw_block_spmv_kernels.c' || echo '$(srcdir)/'`spmv/dw_block_spmv_kernels.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dw_block_spmv_kernels.Tpo $(DEPDIR)/dw_block_spmv_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='spmv/dw_block_spmv_kernels.c' object='dw_block_spmv_kernels.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dw_block_spmv_kernels.o `test -f 'spmv/dw_block_spmv_kernels.c' || echo '$(srcdir)/'`spmv/dw_block_spmv_kernels.c dw_block_spmv_kernels.obj: spmv/dw_block_spmv_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dw_block_spmv_kernels.obj -MD -MP -MF $(DEPDIR)/dw_block_spmv_kernels.Tpo -c -o dw_block_spmv_kernels.obj `if test -f 'spmv/dw_block_spmv_kernels.c'; then $(CYGPATH_W) 'spmv/dw_block_spmv_kernels.c'; else $(CYGPATH_W) '$(srcdir)/spmv/dw_block_spmv_kernels.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dw_block_spmv_kernels.Tpo $(DEPDIR)/dw_block_spmv_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='spmv/dw_block_spmv_kernels.c' object='dw_block_spmv_kernels.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dw_block_spmv_kernels.obj `if test -f 'spmv/dw_block_spmv_kernels.c'; then $(CYGPATH_W) 'spmv/dw_block_spmv_kernels.c'; else $(CYGPATH_W) '$(srcdir)/spmv/dw_block_spmv_kernels.c'; fi` mm_to_bcsr.o: spmv/matrix_market/mm_to_bcsr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mm_to_bcsr.o -MD -MP -MF $(DEPDIR)/mm_to_bcsr.Tpo -c -o mm_to_bcsr.o `test -f 'spmv/matrix_market/mm_to_bcsr.c' || echo '$(srcdir)/'`spmv/matrix_market/mm_to_bcsr.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mm_to_bcsr.Tpo $(DEPDIR)/mm_to_bcsr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='spmv/matrix_market/mm_to_bcsr.c' object='mm_to_bcsr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mm_to_bcsr.o `test -f 'spmv/matrix_market/mm_to_bcsr.c' || echo '$(srcdir)/'`spmv/matrix_market/mm_to_bcsr.c mm_to_bcsr.obj: spmv/matrix_market/mm_to_bcsr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mm_to_bcsr.obj -MD -MP -MF $(DEPDIR)/mm_to_bcsr.Tpo -c -o mm_to_bcsr.obj `if test -f 'spmv/matrix_market/mm_to_bcsr.c'; then $(CYGPATH_W) 'spmv/matrix_market/mm_to_bcsr.c'; else $(CYGPATH_W) '$(srcdir)/spmv/matrix_market/mm_to_bcsr.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mm_to_bcsr.Tpo $(DEPDIR)/mm_to_bcsr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='spmv/matrix_market/mm_to_bcsr.c' object='mm_to_bcsr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mm_to_bcsr.obj `if test -f 'spmv/matrix_market/mm_to_bcsr.c'; then $(CYGPATH_W) 'spmv/matrix_market/mm_to_bcsr.c'; else $(CYGPATH_W) '$(srcdir)/spmv/matrix_market/mm_to_bcsr.c'; fi` mmio.o: spmv/matrix_market/mmio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mmio.o -MD -MP -MF $(DEPDIR)/mmio.Tpo -c -o mmio.o `test -f 'spmv/matrix_market/mmio.c' || echo '$(srcdir)/'`spmv/matrix_market/mmio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mmio.Tpo $(DEPDIR)/mmio.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='spmv/matrix_market/mmio.c' object='mmio.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mmio.o `test -f 'spmv/matrix_market/mmio.c' || echo '$(srcdir)/'`spmv/matrix_market/mmio.c mmio.obj: spmv/matrix_market/mmio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mmio.obj -MD -MP -MF $(DEPDIR)/mmio.Tpo -c -o mmio.obj `if test -f 'spmv/matrix_market/mmio.c'; then $(CYGPATH_W) 'spmv/matrix_market/mmio.c'; else $(CYGPATH_W) '$(srcdir)/spmv/matrix_market/mmio.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mmio.Tpo $(DEPDIR)/mmio.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='spmv/matrix_market/mmio.c' object='mmio.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mmio.obj `if test -f 'spmv/matrix_market/mmio.c'; then $(CYGPATH_W) 'spmv/matrix_market/mmio.c'; else $(CYGPATH_W) '$(srcdir)/spmv/matrix_market/mmio.c'; fi` spmv.o: spmv/spmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT spmv.o -MD -MP -MF $(DEPDIR)/spmv.Tpo -c -o spmv.o `test -f 'spmv/spmv.c' || echo '$(srcdir)/'`spmv/spmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/spmv.Tpo $(DEPDIR)/spmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='spmv/spmv.c' object='spmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o spmv.o `test -f 'spmv/spmv.c' || echo '$(srcdir)/'`spmv/spmv.c spmv.obj: spmv/spmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT spmv.obj -MD -MP -MF $(DEPDIR)/spmv.Tpo -c -o spmv.obj `if test -f 'spmv/spmv.c'; then $(CYGPATH_W) 'spmv/spmv.c'; else $(CYGPATH_W) '$(srcdir)/spmv/spmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/spmv.Tpo $(DEPDIR)/spmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='spmv/spmv.c' object='spmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o spmv.obj `if test -f 'spmv/spmv.c'; then $(CYGPATH_W) 'spmv/spmv.c'; else $(CYGPATH_W) '$(srcdir)/spmv/spmv.c'; fi` spmv_kernels.o: spmv/spmv_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT spmv_kernels.o -MD -MP -MF $(DEPDIR)/spmv_kernels.Tpo -c -o spmv_kernels.o `test -f 'spmv/spmv_kernels.c' || echo '$(srcdir)/'`spmv/spmv_kernels.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/spmv_kernels.Tpo $(DEPDIR)/spmv_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='spmv/spmv_kernels.c' object='spmv_kernels.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o spmv_kernels.o `test -f 'spmv/spmv_kernels.c' || echo '$(srcdir)/'`spmv/spmv_kernels.c spmv_kernels.obj: spmv/spmv_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT spmv_kernels.obj -MD -MP -MF $(DEPDIR)/spmv_kernels.Tpo -c -o spmv_kernels.obj `if test -f 'spmv/spmv_kernels.c'; then $(CYGPATH_W) 'spmv/spmv_kernels.c'; else $(CYGPATH_W) '$(srcdir)/spmv/spmv_kernels.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/spmv_kernels.Tpo $(DEPDIR)/spmv_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='spmv/spmv_kernels.c' object='spmv_kernels.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o spmv_kernels.obj `if test -f 'spmv/spmv_kernels.c'; then $(CYGPATH_W) 'spmv/spmv_kernels.c'; else $(CYGPATH_W) '$(srcdir)/spmv/spmv_kernels.c'; fi` tag_example.o: tag_example/tag_example.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tag_example.o -MD -MP -MF $(DEPDIR)/tag_example.Tpo -c -o tag_example.o `test -f 'tag_example/tag_example.c' || echo '$(srcdir)/'`tag_example/tag_example.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tag_example.Tpo $(DEPDIR)/tag_example.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tag_example/tag_example.c' object='tag_example.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tag_example.o `test -f 'tag_example/tag_example.c' || echo '$(srcdir)/'`tag_example/tag_example.c tag_example.obj: tag_example/tag_example.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tag_example.obj -MD -MP -MF $(DEPDIR)/tag_example.Tpo -c -o tag_example.obj `if test -f 'tag_example/tag_example.c'; then $(CYGPATH_W) 'tag_example/tag_example.c'; else $(CYGPATH_W) '$(srcdir)/tag_example/tag_example.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tag_example.Tpo $(DEPDIR)/tag_example.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tag_example/tag_example.c' object='tag_example.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tag_example.obj `if test -f 'tag_example/tag_example.c'; then $(CYGPATH_W) 'tag_example/tag_example.c'; else $(CYGPATH_W) '$(srcdir)/tag_example/tag_example.c'; fi` tag_example2.o: tag_example/tag_example2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tag_example2.o -MD -MP -MF $(DEPDIR)/tag_example2.Tpo -c -o tag_example2.o `test -f 'tag_example/tag_example2.c' || echo '$(srcdir)/'`tag_example/tag_example2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tag_example2.Tpo $(DEPDIR)/tag_example2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tag_example/tag_example2.c' object='tag_example2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tag_example2.o `test -f 'tag_example/tag_example2.c' || echo '$(srcdir)/'`tag_example/tag_example2.c tag_example2.obj: tag_example/tag_example2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tag_example2.obj -MD -MP -MF $(DEPDIR)/tag_example2.Tpo -c -o tag_example2.obj `if test -f 'tag_example/tag_example2.c'; then $(CYGPATH_W) 'tag_example/tag_example2.c'; else $(CYGPATH_W) '$(srcdir)/tag_example/tag_example2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tag_example2.Tpo $(DEPDIR)/tag_example2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tag_example/tag_example2.c' object='tag_example2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tag_example2.obj `if test -f 'tag_example/tag_example2.c'; then $(CYGPATH_W) 'tag_example/tag_example2.c'; else $(CYGPATH_W) '$(srcdir)/tag_example/tag_example2.c'; fi` tag_example3.o: tag_example/tag_example3.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tag_example3.o -MD -MP -MF $(DEPDIR)/tag_example3.Tpo -c -o tag_example3.o `test -f 'tag_example/tag_example3.c' || echo '$(srcdir)/'`tag_example/tag_example3.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tag_example3.Tpo $(DEPDIR)/tag_example3.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tag_example/tag_example3.c' object='tag_example3.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tag_example3.o `test -f 'tag_example/tag_example3.c' || echo '$(srcdir)/'`tag_example/tag_example3.c tag_example3.obj: tag_example/tag_example3.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tag_example3.obj -MD -MP -MF $(DEPDIR)/tag_example3.Tpo -c -o tag_example3.obj `if test -f 'tag_example/tag_example3.c'; then $(CYGPATH_W) 'tag_example/tag_example3.c'; else $(CYGPATH_W) '$(srcdir)/tag_example/tag_example3.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tag_example3.Tpo $(DEPDIR)/tag_example3.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tag_example/tag_example3.c' object='tag_example3.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tag_example3.obj `if test -f 'tag_example/tag_example3.c'; then $(CYGPATH_W) 'tag_example/tag_example3.c'; else $(CYGPATH_W) '$(srcdir)/tag_example/tag_example3.c'; fi` tag_example4.o: tag_example/tag_example4.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tag_example4.o -MD -MP -MF $(DEPDIR)/tag_example4.Tpo -c -o tag_example4.o `test -f 'tag_example/tag_example4.c' || echo '$(srcdir)/'`tag_example/tag_example4.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tag_example4.Tpo $(DEPDIR)/tag_example4.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tag_example/tag_example4.c' object='tag_example4.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tag_example4.o `test -f 'tag_example/tag_example4.c' || echo '$(srcdir)/'`tag_example/tag_example4.c tag_example4.obj: tag_example/tag_example4.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tag_example4.obj -MD -MP -MF $(DEPDIR)/tag_example4.Tpo -c -o tag_example4.obj `if test -f 'tag_example/tag_example4.c'; then $(CYGPATH_W) 'tag_example/tag_example4.c'; else $(CYGPATH_W) '$(srcdir)/tag_example/tag_example4.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tag_example4.Tpo $(DEPDIR)/tag_example4.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tag_example/tag_example4.c' object='tag_example4.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tag_example4.obj `if test -f 'tag_example/tag_example4.c'; then $(CYGPATH_W) 'tag_example/tag_example4.c'; else $(CYGPATH_W) '$(srcdir)/tag_example/tag_example4.c'; fi` tag_restartable.o: tag_example/tag_restartable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tag_restartable.o -MD -MP -MF $(DEPDIR)/tag_restartable.Tpo -c -o tag_restartable.o `test -f 'tag_example/tag_restartable.c' || echo '$(srcdir)/'`tag_example/tag_restartable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tag_restartable.Tpo $(DEPDIR)/tag_restartable.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tag_example/tag_restartable.c' object='tag_restartable.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tag_restartable.o `test -f 'tag_example/tag_restartable.c' || echo '$(srcdir)/'`tag_example/tag_restartable.c tag_restartable.obj: tag_example/tag_restartable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tag_restartable.obj -MD -MP -MF $(DEPDIR)/tag_restartable.Tpo -c -o tag_restartable.obj `if test -f 'tag_example/tag_restartable.c'; then $(CYGPATH_W) 'tag_example/tag_restartable.c'; else $(CYGPATH_W) '$(srcdir)/tag_example/tag_restartable.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tag_restartable.Tpo $(DEPDIR)/tag_restartable.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tag_example/tag_restartable.c' object='tag_restartable.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tag_restartable.obj `if test -f 'tag_example/tag_restartable.c'; then $(CYGPATH_W) 'tag_example/tag_restartable.c'; else $(CYGPATH_W) '$(srcdir)/tag_example/tag_restartable.c'; fi` hello_world_top.o: top/hello_world_top.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT hello_world_top.o -MD -MP -MF $(DEPDIR)/hello_world_top.Tpo -c -o hello_world_top.o `test -f 'top/hello_world_top.c' || echo '$(srcdir)/'`top/hello_world_top.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/hello_world_top.Tpo $(DEPDIR)/hello_world_top.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='top/hello_world_top.c' object='hello_world_top.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hello_world_top.o `test -f 'top/hello_world_top.c' || echo '$(srcdir)/'`top/hello_world_top.c hello_world_top.obj: top/hello_world_top.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT hello_world_top.obj -MD -MP -MF $(DEPDIR)/hello_world_top.Tpo -c -o hello_world_top.obj `if test -f 'top/hello_world_top.c'; then $(CYGPATH_W) 'top/hello_world_top.c'; else $(CYGPATH_W) '$(srcdir)/top/hello_world_top.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/hello_world_top.Tpo $(DEPDIR)/hello_world_top.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='top/hello_world_top.c' object='hello_world_top.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hello_world_top.obj `if test -f 'top/hello_world_top.c'; then $(CYGPATH_W) 'top/hello_world_top.c'; else $(CYGPATH_W) '$(srcdir)/top/hello_world_top.c'; fi` worker_list_example.o: worker_collections/worker_list_example.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT worker_list_example.o -MD -MP -MF $(DEPDIR)/worker_list_example.Tpo -c -o worker_list_example.o `test -f 'worker_collections/worker_list_example.c' || echo '$(srcdir)/'`worker_collections/worker_list_example.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/worker_list_example.Tpo $(DEPDIR)/worker_list_example.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='worker_collections/worker_list_example.c' object='worker_list_example.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o worker_list_example.o `test -f 'worker_collections/worker_list_example.c' || echo '$(srcdir)/'`worker_collections/worker_list_example.c worker_list_example.obj: worker_collections/worker_list_example.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT worker_list_example.obj -MD -MP -MF $(DEPDIR)/worker_list_example.Tpo -c -o worker_list_example.obj `if test -f 'worker_collections/worker_list_example.c'; then $(CYGPATH_W) 'worker_collections/worker_list_example.c'; else $(CYGPATH_W) '$(srcdir)/worker_collections/worker_list_example.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/worker_list_example.Tpo $(DEPDIR)/worker_list_example.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='worker_collections/worker_list_example.c' object='worker_list_example.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o worker_list_example.obj `if test -f 'worker_collections/worker_list_example.c'; then $(CYGPATH_W) 'worker_collections/worker_list_example.c'; else $(CYGPATH_W) '$(srcdir)/worker_collections/worker_list_example.c'; fi` worker_tree_example.o: worker_collections/worker_tree_example.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT worker_tree_example.o -MD -MP -MF $(DEPDIR)/worker_tree_example.Tpo -c -o worker_tree_example.o `test -f 'worker_collections/worker_tree_example.c' || echo '$(srcdir)/'`worker_collections/worker_tree_example.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/worker_tree_example.Tpo $(DEPDIR)/worker_tree_example.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='worker_collections/worker_tree_example.c' object='worker_tree_example.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o worker_tree_example.o `test -f 'worker_collections/worker_tree_example.c' || echo '$(srcdir)/'`worker_collections/worker_tree_example.c worker_tree_example.obj: worker_collections/worker_tree_example.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT worker_tree_example.obj -MD -MP -MF $(DEPDIR)/worker_tree_example.Tpo -c -o worker_tree_example.obj `if test -f 'worker_collections/worker_tree_example.c'; then $(CYGPATH_W) 'worker_collections/worker_tree_example.c'; else $(CYGPATH_W) '$(srcdir)/worker_collections/worker_tree_example.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/worker_tree_example.Tpo $(DEPDIR)/worker_tree_example.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='worker_collections/worker_tree_example.c' object='worker_tree_example.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o worker_tree_example.obj `if test -f 'worker_collections/worker_tree_example.c'; then $(CYGPATH_W) 'worker_collections/worker_tree_example.c'; else $(CYGPATH_W) '$(srcdir)/worker_collections/worker_tree_example.c'; fi` .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< incrementer_cpp.o: cpp/incrementer_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT incrementer_cpp.o -MD -MP -MF $(DEPDIR)/incrementer_cpp.Tpo -c -o incrementer_cpp.o `test -f 'cpp/incrementer_cpp.cpp' || echo '$(srcdir)/'`cpp/incrementer_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/incrementer_cpp.Tpo $(DEPDIR)/incrementer_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cpp/incrementer_cpp.cpp' object='incrementer_cpp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o incrementer_cpp.o `test -f 'cpp/incrementer_cpp.cpp' || echo '$(srcdir)/'`cpp/incrementer_cpp.cpp incrementer_cpp.obj: cpp/incrementer_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT incrementer_cpp.obj -MD -MP -MF $(DEPDIR)/incrementer_cpp.Tpo -c -o incrementer_cpp.obj `if test -f 'cpp/incrementer_cpp.cpp'; then $(CYGPATH_W) 'cpp/incrementer_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/cpp/incrementer_cpp.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/incrementer_cpp.Tpo $(DEPDIR)/incrementer_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cpp/incrementer_cpp.cpp' object='incrementer_cpp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o incrementer_cpp.obj `if test -f 'cpp/incrementer_cpp.cpp'; then $(CYGPATH_W) 'cpp/incrementer_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/cpp/incrementer_cpp.cpp'; fi` .f90.o: $(AM_V_FC)$(FCCOMPILE) -c -o $@ $< .f90.obj: $(AM_V_FC)$(FCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .f90.lo: $(AM_V_FC)$(LTFCCOMPILE) -c -o $@ $< mod_types.o: fortran90/mod_types.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o mod_types.o `test -f 'fortran90/mod_types.f90' || echo '$(srcdir)/'`fortran90/mod_types.f90 mod_types.obj: fortran90/mod_types.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o mod_types.obj `if test -f 'fortran90/mod_types.f90'; then $(CYGPATH_W) 'fortran90/mod_types.f90'; else $(CYGPATH_W) '$(srcdir)/fortran90/mod_types.f90'; fi` @STARPU_HAVE_FC_FALSE@starpu_mod.o: $(top_srcdir)/include/starpu_mod.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o starpu_mod.o `test -f '$(top_srcdir)/include/starpu_mod.f90' || echo '$(srcdir)/'`$(top_srcdir)/include/starpu_mod.f90 starpu_mod.obj: $(top_srcdir)/include/starpu_mod.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o starpu_mod.obj `if test -f '$(top_srcdir)/include/starpu_mod.f90'; then $(CYGPATH_W) '$(top_srcdir)/include/starpu_mod.f90'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/include/starpu_mod.f90'; fi` mod_interface.o: fortran90/mod_interface.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o mod_interface.o `test -f 'fortran90/mod_interface.f90' || echo '$(srcdir)/'`fortran90/mod_interface.f90 mod_interface.obj: fortran90/mod_interface.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o mod_interface.obj `if test -f 'fortran90/mod_interface.f90'; then $(CYGPATH_W) 'fortran90/mod_interface.f90'; else $(CYGPATH_W) '$(srcdir)/fortran90/mod_interface.f90'; fi` @STARPU_HAVE_FC_FALSE@mod_compute.o: fortran90/mod_compute.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o mod_compute.o `test -f 'fortran90/mod_compute.f90' || echo '$(srcdir)/'`fortran90/mod_compute.f90 mod_compute.obj: fortran90/mod_compute.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o mod_compute.obj `if test -f 'fortran90/mod_compute.f90'; then $(CYGPATH_W) 'fortran90/mod_compute.f90'; else $(CYGPATH_W) '$(srcdir)/fortran90/mod_compute.f90'; fi` @STARPU_HAVE_FC_FALSE@f90_example.o: fortran90/f90_example.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o f90_example.o `test -f 'fortran90/f90_example.f90' || echo '$(srcdir)/'`fortran90/f90_example.f90 f90_example.obj: fortran90/f90_example.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o f90_example.obj `if test -f 'fortran90/f90_example.f90'; then $(CYGPATH_W) 'fortran90/f90_example.f90'; else $(CYGPATH_W) '$(srcdir)/fortran90/f90_example.f90'; fi` @STARPU_HAVE_FC_FALSE@nf_dynbuf_cl.o: native_fortran/nf_dynbuf_cl.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_dynbuf_cl.o `test -f 'native_fortran/nf_dynbuf_cl.f90' || echo '$(srcdir)/'`native_fortran/nf_dynbuf_cl.f90 nf_dynbuf_cl.obj: native_fortran/nf_dynbuf_cl.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_dynbuf_cl.obj `if test -f 'native_fortran/nf_dynbuf_cl.f90'; then $(CYGPATH_W) 'native_fortran/nf_dynbuf_cl.f90'; else $(CYGPATH_W) '$(srcdir)/native_fortran/nf_dynbuf_cl.f90'; fi` @STARPU_HAVE_FC_FALSE@fstarpu_mod.o: $(top_srcdir)/include/fstarpu_mod.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o fstarpu_mod.o `test -f '$(top_srcdir)/include/fstarpu_mod.f90' || echo '$(srcdir)/'`$(top_srcdir)/include/fstarpu_mod.f90 fstarpu_mod.obj: $(top_srcdir)/include/fstarpu_mod.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o fstarpu_mod.obj `if test -f '$(top_srcdir)/include/fstarpu_mod.f90'; then $(CYGPATH_W) '$(top_srcdir)/include/fstarpu_mod.f90'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/include/fstarpu_mod.f90'; fi` @STARPU_HAVE_FC_FALSE@nf_dynbuf.o: native_fortran/nf_dynbuf.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_dynbuf.o `test -f 'native_fortran/nf_dynbuf.f90' || echo '$(srcdir)/'`native_fortran/nf_dynbuf.f90 nf_dynbuf.obj: native_fortran/nf_dynbuf.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_dynbuf.obj `if test -f 'native_fortran/nf_dynbuf.f90'; then $(CYGPATH_W) 'native_fortran/nf_dynbuf.f90'; else $(CYGPATH_W) '$(srcdir)/native_fortran/nf_dynbuf.f90'; fi` nf_types.o: native_fortran/nf_types.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_types.o `test -f 'native_fortran/nf_types.f90' || echo '$(srcdir)/'`native_fortran/nf_types.f90 nf_types.obj: native_fortran/nf_types.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_types.obj `if test -f 'native_fortran/nf_types.f90'; then $(CYGPATH_W) 'native_fortran/nf_types.f90'; else $(CYGPATH_W) '$(srcdir)/native_fortran/nf_types.f90'; fi` @STARPU_HAVE_FC_FALSE@nf_compute.o: native_fortran/nf_compute.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_compute.o `test -f 'native_fortran/nf_compute.f90' || echo '$(srcdir)/'`native_fortran/nf_compute.f90 nf_compute.obj: native_fortran/nf_compute.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_compute.obj `if test -f 'native_fortran/nf_compute.f90'; then $(CYGPATH_W) 'native_fortran/nf_compute.f90'; else $(CYGPATH_W) '$(srcdir)/native_fortran/nf_compute.f90'; fi` @STARPU_HAVE_FC_FALSE@nf_example.o: native_fortran/nf_example.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_example.o `test -f 'native_fortran/nf_example.f90' || echo '$(srcdir)/'`native_fortran/nf_example.f90 nf_example.obj: native_fortran/nf_example.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_example.obj `if test -f 'native_fortran/nf_example.f90'; then $(CYGPATH_W) 'native_fortran/nf_example.f90'; else $(CYGPATH_W) '$(srcdir)/native_fortran/nf_example.f90'; fi` @STARPU_HAVE_FC_FALSE@nf_codelets.o: native_fortran/nf_codelets.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_codelets.o `test -f 'native_fortran/nf_codelets.f90' || echo '$(srcdir)/'`native_fortran/nf_codelets.f90 nf_codelets.obj: native_fortran/nf_codelets.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_codelets.obj `if test -f 'native_fortran/nf_codelets.f90'; then $(CYGPATH_W) 'native_fortran/nf_codelets.f90'; else $(CYGPATH_W) '$(srcdir)/native_fortran/nf_codelets.f90'; fi` @STARPU_HAVE_FC_FALSE@nf_matrix.o: native_fortran/nf_matrix.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_matrix.o `test -f 'native_fortran/nf_matrix.f90' || echo '$(srcdir)/'`native_fortran/nf_matrix.f90 nf_matrix.obj: native_fortran/nf_matrix.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_matrix.obj `if test -f 'native_fortran/nf_matrix.f90'; then $(CYGPATH_W) 'native_fortran/nf_matrix.f90'; else $(CYGPATH_W) '$(srcdir)/native_fortran/nf_matrix.f90'; fi` @STARPU_HAVE_FC_FALSE@nf_partition_cl.o: native_fortran/nf_partition_cl.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_partition_cl.o `test -f 'native_fortran/nf_partition_cl.f90' || echo '$(srcdir)/'`native_fortran/nf_partition_cl.f90 nf_partition_cl.obj: native_fortran/nf_partition_cl.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_partition_cl.obj `if test -f 'native_fortran/nf_partition_cl.f90'; then $(CYGPATH_W) 'native_fortran/nf_partition_cl.f90'; else $(CYGPATH_W) '$(srcdir)/native_fortran/nf_partition_cl.f90'; fi` @STARPU_HAVE_FC_FALSE@nf_partition.o: native_fortran/nf_partition.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_partition.o `test -f 'native_fortran/nf_partition.f90' || echo '$(srcdir)/'`native_fortran/nf_partition.f90 nf_partition.obj: native_fortran/nf_partition.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_partition.obj `if test -f 'native_fortran/nf_partition.f90'; then $(CYGPATH_W) 'native_fortran/nf_partition.f90'; else $(CYGPATH_W) '$(srcdir)/native_fortran/nf_partition.f90'; fi` @STARPU_HAVE_FC_FALSE@nf_sched_ctx_cl.o: native_fortran/nf_sched_ctx_cl.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_sched_ctx_cl.o `test -f 'native_fortran/nf_sched_ctx_cl.f90' || echo '$(srcdir)/'`native_fortran/nf_sched_ctx_cl.f90 nf_sched_ctx_cl.obj: native_fortran/nf_sched_ctx_cl.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_sched_ctx_cl.obj `if test -f 'native_fortran/nf_sched_ctx_cl.f90'; then $(CYGPATH_W) 'native_fortran/nf_sched_ctx_cl.f90'; else $(CYGPATH_W) '$(srcdir)/native_fortran/nf_sched_ctx_cl.f90'; fi` @STARPU_HAVE_FC_FALSE@nf_sched_ctx.o: native_fortran/nf_sched_ctx.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_sched_ctx.o `test -f 'native_fortran/nf_sched_ctx.f90' || echo '$(srcdir)/'`native_fortran/nf_sched_ctx.f90 nf_sched_ctx.obj: native_fortran/nf_sched_ctx.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_sched_ctx.obj `if test -f 'native_fortran/nf_sched_ctx.f90'; then $(CYGPATH_W) 'native_fortran/nf_sched_ctx.f90'; else $(CYGPATH_W) '$(srcdir)/native_fortran/nf_sched_ctx.f90'; fi` @STARPU_HAVE_FC_FALSE@nf_varbuf_cl.o: native_fortran/nf_varbuf_cl.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_varbuf_cl.o `test -f 'native_fortran/nf_varbuf_cl.f90' || echo '$(srcdir)/'`native_fortran/nf_varbuf_cl.f90 nf_varbuf_cl.obj: native_fortran/nf_varbuf_cl.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_varbuf_cl.obj `if test -f 'native_fortran/nf_varbuf_cl.f90'; then $(CYGPATH_W) 'native_fortran/nf_varbuf_cl.f90'; else $(CYGPATH_W) '$(srcdir)/native_fortran/nf_varbuf_cl.f90'; fi` @STARPU_HAVE_FC_FALSE@nf_varbuf.o: native_fortran/nf_varbuf.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_varbuf.o `test -f 'native_fortran/nf_varbuf.f90' || echo '$(srcdir)/'`native_fortran/nf_varbuf.f90 nf_varbuf.obj: native_fortran/nf_varbuf.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_varbuf.obj `if test -f 'native_fortran/nf_varbuf.f90'; then $(CYGPATH_W) 'native_fortran/nf_varbuf.f90'; else $(CYGPATH_W) '$(srcdir)/native_fortran/nf_varbuf.f90'; fi` @STARPU_HAVE_FC_FALSE@nf_vector.o: native_fortran/nf_vector.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_vector.o `test -f 'native_fortran/nf_vector.f90' || echo '$(srcdir)/'`native_fortran/nf_vector.f90 nf_vector.obj: native_fortran/nf_vector.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_vector.obj `if test -f 'native_fortran/nf_vector.f90'; then $(CYGPATH_W) 'native_fortran/nf_vector.f90'; else $(CYGPATH_W) '$(srcdir)/native_fortran/nf_vector.f90'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf axpy/.libs axpy/_libs -rm -rf basic_examples/.libs basic_examples/_libs -rm -rf binary/.libs binary/_libs -rm -rf callback/.libs callback/_libs -rm -rf cg/.libs cg/_libs -rm -rf cholesky/.libs cholesky/_libs -rm -rf cpp/.libs cpp/_libs -rm -rf filters/.libs filters/_libs -rm -rf filters/custom_mf/.libs filters/custom_mf/_libs -rm -rf fortran/.libs fortran/_libs -rm -rf fortran90/.libs fortran90/_libs -rm -rf gl_interop/.libs gl_interop/_libs -rm -rf heat/.libs heat/_libs -rm -rf incrementer/.libs incrementer/_libs -rm -rf interface/.libs interface/_libs -rm -rf lu/.libs lu/_libs -rm -rf mandelbrot/.libs mandelbrot/_libs -rm -rf matvecmult/.libs matvecmult/_libs -rm -rf mult/.libs mult/_libs -rm -rf native_fortran/.libs native_fortran/_libs -rm -rf openmp/.libs openmp/_libs -rm -rf pi/.libs pi/_libs -rm -rf pipeline/.libs pipeline/_libs -rm -rf ppm_downscaler/.libs ppm_downscaler/_libs -rm -rf profiling/.libs profiling/_libs -rm -rf reductions/.libs reductions/_libs -rm -rf sched_ctx/.libs sched_ctx/_libs -rm -rf scheduler/.libs scheduler/_libs -rm -rf spmd/.libs spmd/_libs -rm -rf spmv/.libs spmv/_libs -rm -rf tag_example/.libs tag_example/_libs -rm -rf top/.libs top/_libs -rm -rf worker_collections/.libs worker_collections/_libs install-nobase_STARPU_OPENCL_DATADATA: $(nobase_STARPU_OPENCL_DATA_DATA) @$(NORMAL_INSTALL) @list='$(nobase_STARPU_OPENCL_DATA_DATA)'; test -n "$(STARPU_OPENCL_DATAdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(STARPU_OPENCL_DATAdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(STARPU_OPENCL_DATAdir)" || exit 1; \ fi; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ echo " $(MKDIR_P) '$(DESTDIR)$(STARPU_OPENCL_DATAdir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(STARPU_OPENCL_DATAdir)/$$dir"; }; \ echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(STARPU_OPENCL_DATAdir)/$$dir'"; \ $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(STARPU_OPENCL_DATAdir)/$$dir" || exit $$?; }; \ done uninstall-nobase_STARPU_OPENCL_DATADATA: @$(NORMAL_UNINSTALL) @list='$(nobase_STARPU_OPENCL_DATA_DATA)'; test -n "$(STARPU_OPENCL_DATAdir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ dir='$(DESTDIR)$(STARPU_OPENCL_DATAdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? sched_ctx/prio.log: sched_ctx/prio$(EXEEXT) @p='sched_ctx/prio$(EXEEXT)'; \ b='sched_ctx/prio'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) worker_collections/worker_list_example.log: worker_collections/worker_list_example$(EXEEXT) @p='worker_collections/worker_list_example$(EXEEXT)'; \ b='worker_collections/worker_list_example'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) basic_examples/hello_world.log: basic_examples/hello_world$(EXEEXT) @p='basic_examples/hello_world$(EXEEXT)'; \ b='basic_examples/hello_world'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) basic_examples/vector_scal.log: basic_examples/vector_scal$(EXEEXT) @p='basic_examples/vector_scal$(EXEEXT)'; \ b='basic_examples/vector_scal'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) basic_examples/mult.log: basic_examples/mult$(EXEEXT) @p='basic_examples/mult$(EXEEXT)'; \ b='basic_examples/mult'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) basic_examples/block.log: basic_examples/block$(EXEEXT) @p='basic_examples/block$(EXEEXT)'; \ b='basic_examples/block'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) basic_examples/variable.log: basic_examples/variable$(EXEEXT) @p='basic_examples/variable$(EXEEXT)'; \ b='basic_examples/variable'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) basic_examples/multiformat.log: basic_examples/multiformat$(EXEEXT) @p='basic_examples/multiformat$(EXEEXT)'; \ b='basic_examples/multiformat'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) basic_examples/dynamic_handles.log: basic_examples/dynamic_handles$(EXEEXT) @p='basic_examples/dynamic_handles$(EXEEXT)'; \ b='basic_examples/dynamic_handles'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) cpp/incrementer_cpp.log: cpp/incrementer_cpp$(EXEEXT) @p='cpp/incrementer_cpp$(EXEEXT)'; \ b='cpp/incrementer_cpp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) filters/fvector.log: filters/fvector$(EXEEXT) @p='filters/fvector$(EXEEXT)'; \ b='filters/fvector'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) filters/fblock.log: filters/fblock$(EXEEXT) @p='filters/fblock$(EXEEXT)'; \ b='filters/fblock'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) filters/fmatrix.log: filters/fmatrix$(EXEEXT) @p='filters/fmatrix$(EXEEXT)'; \ b='filters/fmatrix'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) filters/fmultiple_manual.log: filters/fmultiple_manual$(EXEEXT) @p='filters/fmultiple_manual$(EXEEXT)'; \ b='filters/fmultiple_manual'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) filters/fmultiple_submit.log: filters/fmultiple_submit$(EXEEXT) @p='filters/fmultiple_submit$(EXEEXT)'; \ b='filters/fmultiple_submit'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) filters/fmultiple_submit_readonly.log: filters/fmultiple_submit_readonly$(EXEEXT) @p='filters/fmultiple_submit_readonly$(EXEEXT)'; \ b='filters/fmultiple_submit_readonly'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tag_example/tag_example.log: tag_example/tag_example$(EXEEXT) @p='tag_example/tag_example$(EXEEXT)'; \ b='tag_example/tag_example'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tag_example/tag_example2.log: tag_example/tag_example2$(EXEEXT) @p='tag_example/tag_example2$(EXEEXT)'; \ b='tag_example/tag_example2'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tag_example/tag_example3.log: tag_example/tag_example3$(EXEEXT) @p='tag_example/tag_example3$(EXEEXT)'; \ b='tag_example/tag_example3'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tag_example/tag_example4.log: tag_example/tag_example4$(EXEEXT) @p='tag_example/tag_example4$(EXEEXT)'; \ b='tag_example/tag_example4'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tag_example/tag_restartable.log: tag_example/tag_restartable$(EXEEXT) @p='tag_example/tag_restartable$(EXEEXT)'; \ b='tag_example/tag_restartable'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) spmd/vector_scal_spmd.log: spmd/vector_scal_spmd$(EXEEXT) @p='spmd/vector_scal_spmd$(EXEEXT)'; \ b='spmd/vector_scal_spmd'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) spmv/spmv.log: spmv/spmv$(EXEEXT) @p='spmv/spmv$(EXEEXT)'; \ b='spmv/spmv'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) callback/callback.log: callback/callback$(EXEEXT) @p='callback/callback$(EXEEXT)'; \ b='callback/callback'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) callback/prologue.log: callback/prologue$(EXEEXT) @p='callback/prologue$(EXEEXT)'; \ b='callback/prologue'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) incrementer/incrementer.log: incrementer/incrementer$(EXEEXT) @p='incrementer/incrementer$(EXEEXT)'; \ b='incrementer/incrementer'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) binary/binary.log: binary/binary$(EXEEXT) @p='binary/binary$(EXEEXT)'; \ b='binary/binary'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) interface/complex.log: interface/complex$(EXEEXT) @p='interface/complex$(EXEEXT)'; \ b='interface/complex'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) matvecmult/matvecmult.log: matvecmult/matvecmult$(EXEEXT) @p='matvecmult/matvecmult$(EXEEXT)'; \ b='matvecmult/matvecmult'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) profiling/profiling.log: profiling/profiling$(EXEEXT) @p='profiling/profiling$(EXEEXT)'; \ b='profiling/profiling'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) scheduler/dummy_sched.log: scheduler/dummy_sched$(EXEEXT) @p='scheduler/dummy_sched$(EXEEXT)'; \ b='scheduler/dummy_sched'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) sched_ctx/dummy_sched_with_ctx.log: sched_ctx/dummy_sched_with_ctx$(EXEEXT) @p='sched_ctx/dummy_sched_with_ctx$(EXEEXT)'; \ b='sched_ctx/dummy_sched_with_ctx'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) worker_collections/worker_tree_example.log: worker_collections/worker_tree_example$(EXEEXT) @p='worker_collections/worker_tree_example$(EXEEXT)'; \ b='worker_collections/worker_tree_example'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) reductions/dot_product.log: reductions/dot_product$(EXEEXT) @p='reductions/dot_product$(EXEEXT)'; \ b='reductions/dot_product'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) reductions/minmax_reduction.log: reductions/minmax_reduction$(EXEEXT) @p='reductions/minmax_reduction$(EXEEXT)'; \ b='reductions/minmax_reduction'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) sched_ctx/sched_ctx.log: sched_ctx/sched_ctx$(EXEEXT) @p='sched_ctx/sched_ctx$(EXEEXT)'; \ b='sched_ctx/sched_ctx'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) sched_ctx/two_cpu_contexts.log: sched_ctx/two_cpu_contexts$(EXEEXT) @p='sched_ctx/two_cpu_contexts$(EXEEXT)'; \ b='sched_ctx/two_cpu_contexts'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) fortran/hello.log: fortran/hello$(EXEEXT) @p='fortran/hello$(EXEEXT)'; \ b='fortran/hello'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) basic_examples/vector_scal_fortran.log: basic_examples/vector_scal_fortran$(EXEEXT) @p='basic_examples/vector_scal_fortran$(EXEEXT)'; \ b='basic_examples/vector_scal_fortran'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) fortran90/f90_example.log: fortran90/f90_example$(EXEEXT) @p='fortran90/f90_example$(EXEEXT)'; \ b='fortran90/f90_example'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) native_fortran/nf_vector.log: native_fortran/nf_vector$(EXEEXT) @p='native_fortran/nf_vector$(EXEEXT)'; \ b='native_fortran/nf_vector'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) native_fortran/nf_matrix.log: native_fortran/nf_matrix$(EXEEXT) @p='native_fortran/nf_matrix$(EXEEXT)'; \ b='native_fortran/nf_matrix'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) native_fortran/nf_example.log: native_fortran/nf_example$(EXEEXT) @p='native_fortran/nf_example$(EXEEXT)'; \ b='native_fortran/nf_example'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) native_fortran/nf_dynbuf.log: native_fortran/nf_dynbuf$(EXEEXT) @p='native_fortran/nf_dynbuf$(EXEEXT)'; \ b='native_fortran/nf_dynbuf'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) native_fortran/nf_varbuf.log: native_fortran/nf_varbuf$(EXEEXT) @p='native_fortran/nf_varbuf$(EXEEXT)'; \ b='native_fortran/nf_varbuf'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) native_fortran/nf_sched_ctx.log: native_fortran/nf_sched_ctx$(EXEEXT) @p='native_fortran/nf_sched_ctx$(EXEEXT)'; \ b='native_fortran/nf_sched_ctx'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) native_fortran/nf_partition.log: native_fortran/nf_partition$(EXEEXT) @p='native_fortran/nf_partition$(EXEEXT)'; \ b='native_fortran/nf_partition'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) mult/sgemm.log: mult/sgemm$(EXEEXT) @p='mult/sgemm$(EXEEXT)'; \ b='mult/sgemm'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) mult/dgemm.log: mult/dgemm$(EXEEXT) @p='mult/dgemm$(EXEEXT)'; \ b='mult/dgemm'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) cholesky/cholesky_tag.log: cholesky/cholesky_tag$(EXEEXT) @p='cholesky/cholesky_tag$(EXEEXT)'; \ b='cholesky/cholesky_tag'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) cholesky/cholesky_tile_tag.log: cholesky/cholesky_tile_tag$(EXEEXT) @p='cholesky/cholesky_tile_tag$(EXEEXT)'; \ b='cholesky/cholesky_tile_tag'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) cholesky/cholesky_implicit.log: cholesky/cholesky_implicit$(EXEEXT) @p='cholesky/cholesky_implicit$(EXEEXT)'; \ b='cholesky/cholesky_implicit'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) axpy/axpy.log: axpy/axpy$(EXEEXT) @p='axpy/axpy$(EXEEXT)'; \ b='axpy/axpy'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) cholesky/cholesky_grain_tag.log: cholesky/cholesky_grain_tag$(EXEEXT) @p='cholesky/cholesky_grain_tag$(EXEEXT)'; \ b='cholesky/cholesky_grain_tag'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) lu/lu_example_float.log: lu/lu_example_float$(EXEEXT) @p='lu/lu_example_float$(EXEEXT)'; \ b='lu/lu_example_float'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) lu/lu_example_double.log: lu/lu_example_double$(EXEEXT) @p='lu/lu_example_double$(EXEEXT)'; \ b='lu/lu_example_double'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) lu/lu_implicit_example_float.log: lu/lu_implicit_example_float$(EXEEXT) @p='lu/lu_implicit_example_float$(EXEEXT)'; \ b='lu/lu_implicit_example_float'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) lu/lu_implicit_example_double.log: lu/lu_implicit_example_double$(EXEEXT) @p='lu/lu_implicit_example_double$(EXEEXT)'; \ b='lu/lu_implicit_example_double'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) heat/heat.log: heat/heat$(EXEEXT) @p='heat/heat$(EXEEXT)'; \ b='heat/heat'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) cg/cg.log: cg/cg$(EXEEXT) @p='cg/cg$(EXEEXT)'; \ b='cg/cg'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) pipeline/pipeline.log: pipeline/pipeline$(EXEEXT) @p='pipeline/pipeline$(EXEEXT)'; \ b='pipeline/pipeline'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) lu/lu_example_complex_float.log: lu/lu_example_complex_float$(EXEEXT) @p='lu/lu_example_complex_float$(EXEEXT)'; \ b='lu/lu_example_complex_float'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) lu/lu_example_complex_double.log: lu/lu_example_complex_double$(EXEEXT) @p='lu/lu_example_complex_double$(EXEEXT)'; \ b='lu/lu_example_complex_double'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) lu/lu_implicit_example_complex_float.log: lu/lu_implicit_example_complex_float$(EXEEXT) @p='lu/lu_implicit_example_complex_float$(EXEEXT)'; \ b='lu/lu_implicit_example_complex_float'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) lu/lu_implicit_example_complex_double.log: lu/lu_implicit_example_complex_double$(EXEEXT) @p='lu/lu_implicit_example_complex_double$(EXEEXT)'; \ b='lu/lu_implicit_example_complex_double'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) spmv/dw_block_spmv.log: spmv/dw_block_spmv$(EXEEXT) @p='spmv/dw_block_spmv$(EXEEXT)'; \ b='spmv/dw_block_spmv'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/vector_scal_omp.log: openmp/vector_scal_omp$(EXEEXT) @p='openmp/vector_scal_omp$(EXEEXT)'; \ b='openmp/vector_scal_omp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) sched_ctx/sched_ctx_without_sched_policy.log: sched_ctx/sched_ctx_without_sched_policy$(EXEEXT) @p='sched_ctx/sched_ctx_without_sched_policy$(EXEEXT)'; \ b='sched_ctx/sched_ctx_without_sched_policy'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) sched_ctx/nested_sched_ctxs.log: sched_ctx/nested_sched_ctxs$(EXEEXT) @p='sched_ctx/nested_sched_ctxs$(EXEEXT)'; \ b='sched_ctx/nested_sched_ctxs'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) sched_ctx/sched_ctx_without_sched_policy_awake.log: sched_ctx/sched_ctx_without_sched_policy_awake$(EXEEXT) @p='sched_ctx/sched_ctx_without_sched_policy_awake$(EXEEXT)'; \ b='sched_ctx/sched_ctx_without_sched_policy_awake'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) sched_ctx/parallel_tasks_reuse_handle.log: sched_ctx/parallel_tasks_reuse_handle$(EXEEXT) @p='sched_ctx/parallel_tasks_reuse_handle$(EXEEXT)'; \ b='sched_ctx/parallel_tasks_reuse_handle'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) sched_ctx/parallel_code.log: sched_ctx/parallel_code$(EXEEXT) @p='sched_ctx/parallel_code$(EXEEXT)'; \ b='sched_ctx/parallel_code'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) scheduler/schedulers.sh.log: scheduler/schedulers.sh @p='scheduler/schedulers.sh'; \ b='scheduler/schedulers.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) scheduler/schedulers_context.sh.log: scheduler/schedulers_context.sh @p='scheduler/schedulers_context.sh'; \ b='scheduler/schedulers_context.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) heat/heat.sh.log: heat/heat.sh @p='heat/heat.sh'; \ b='heat/heat.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) lu/lu.sh.log: lu/lu.sh @p='lu/lu.sh'; \ b='lu/lu.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(PROGRAMS) $(DATA) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(examplebindir)" "$(DESTDIR)$(STARPU_OPENCL_DATAdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f axpy/$(am__dirstamp) -rm -f basic_examples/$(DEPDIR)/$(am__dirstamp) -rm -f basic_examples/$(am__dirstamp) -rm -f binary/$(am__dirstamp) -rm -f callback/$(am__dirstamp) -rm -f cg/$(am__dirstamp) -rm -f cholesky/$(am__dirstamp) -rm -f cpp/$(am__dirstamp) -rm -f filters/$(DEPDIR)/$(am__dirstamp) -rm -f filters/$(am__dirstamp) -rm -f filters/custom_mf/$(DEPDIR)/$(am__dirstamp) -rm -f filters/custom_mf/$(am__dirstamp) -rm -f fortran/$(am__dirstamp) -rm -f fortran90/$(am__dirstamp) -rm -f gl_interop/$(am__dirstamp) -rm -f heat/$(am__dirstamp) -rm -f incrementer/$(DEPDIR)/$(am__dirstamp) -rm -f incrementer/$(am__dirstamp) -rm -f interface/$(DEPDIR)/$(am__dirstamp) -rm -f interface/$(am__dirstamp) -rm -f lu/$(am__dirstamp) -rm -f mandelbrot/$(am__dirstamp) -rm -f matvecmult/$(am__dirstamp) -rm -f mult/$(am__dirstamp) -rm -f native_fortran/$(am__dirstamp) -rm -f openmp/$(am__dirstamp) -rm -f pi/$(DEPDIR)/$(am__dirstamp) -rm -f pi/$(am__dirstamp) -rm -f pi/SobolQRNG/$(DEPDIR)/$(am__dirstamp) -rm -f pi/SobolQRNG/$(am__dirstamp) -rm -f pipeline/$(am__dirstamp) -rm -f ppm_downscaler/$(am__dirstamp) -rm -f profiling/$(am__dirstamp) -rm -f reductions/$(DEPDIR)/$(am__dirstamp) -rm -f reductions/$(am__dirstamp) -rm -f sched_ctx/$(am__dirstamp) -rm -f scheduler/$(am__dirstamp) -rm -f spmd/$(am__dirstamp) -rm -f spmv/$(DEPDIR)/$(am__dirstamp) -rm -f spmv/$(am__dirstamp) -rm -f tag_example/$(am__dirstamp) -rm -f top/$(am__dirstamp) -rm -f worker_collections/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-recursive clean-am: clean-checkPROGRAMS clean-examplebinPROGRAMS clean-generic \ clean-libtool mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-examplebinPROGRAMS \ install-nobase_STARPU_OPENCL_DATADATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-examplebinPROGRAMS \ uninstall-nobase_STARPU_OPENCL_DATADATA .MAKE: $(am__recursive_targets) all check check-am install install-am \ install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-TESTS check-am clean clean-checkPROGRAMS \ clean-examplebinPROGRAMS clean-generic clean-libtool \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-examplebinPROGRAMS install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-nobase_STARPU_OPENCL_DATADATA install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am recheck tags tags-am uninstall \ uninstall-am uninstall-examplebinPROGRAMS \ uninstall-nobase_STARPU_OPENCL_DATADATA .PRECIOUS: Makefile showcheck: -cat $(TEST_LOGS) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q " runtime error: " $(TEST_LOGS) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET @STARPU_SIMGRID_TRUE@export STARPU_PERF_MODEL_DIR @STARPU_SIMGRID_TRUE@export STARPU_HOSTNAME @STARPU_SIMGRID_TRUE@export MALLOC_PERTURB_ @STARPU_USE_CUDA_TRUE@.cu.o: @STARPU_USE_CUDA_TRUE@ $(NVCC) $< -c -o $@ $(NVCCFLAGS) @STARPU_HAVE_ICC_TRUE@.icc.o: @STARPU_HAVE_ICC_TRUE@ $(ICC) -x c $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ @STARPU_HAVE_ICC_TRUE@ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) $< -c -o $@ # Fortran90 example # - list explicit dependences to control proper module files generation # - the overriding rule fully disables the corresponing default rule, thus # the default rule body must be copied entirely @STARPU_HAVE_FC_TRUE@mod_types.mod: mod_types.o @STARPU_HAVE_FC_TRUE@mod_compute.mod: mod_compute.o @STARPU_HAVE_FC_TRUE@mod_interface.mod: mod_interface.o @STARPU_HAVE_FC_TRUE@starpu_mod.mod: starpu_mod.o @STARPU_HAVE_FC_TRUE@starpu_mod.o: $(top_srcdir)/include/starpu_mod.f90 @STARPU_HAVE_FC_TRUE@ $(AM_V_FC)$(FC) $(fortran90_f90_example_FCFLAGS) $(FCFLAGS) -c -o $@ '$(top_srcdir)/'include/starpu_mod.f90 @STARPU_HAVE_FC_TRUE@mod_compute.o: $(top_srcdir)/examples/fortran90/mod_compute.f90 mod_types.mod mod_interface.mod starpu_mod.mod @STARPU_HAVE_FC_TRUE@ $(AM_V_FC)$(FC) $(fortran90_f90_example_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'fortran90/mod_compute.f90' || echo '$(srcdir)/'`fortran90/mod_compute.f90 @STARPU_HAVE_FC_TRUE@f90_example.o: $(top_srcdir)/examples/fortran90/f90_example.f90 $(top_srcdir)/examples/fortran90/marshalling.c mod_types.mod mod_interface.mod mod_compute.mod starpu_mod.mod @STARPU_HAVE_FC_TRUE@ $(AM_V_FC)$(FC) $(fortran90_f90_example_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'fortran90/f90_example.f90' || echo '$(srcdir)/'`fortran90/f90_example.f90 # Native Fortran example # - list explicit dependences to control proper module files generation # - the overriding rule fully disables the corresponing default rule, thus # the default rule body must be copied entirely @STARPU_HAVE_FC_TRUE@nf_types.mod: nf_types.o @STARPU_HAVE_FC_TRUE@nf_compute.mod: nf_compute.o @STARPU_HAVE_FC_TRUE@fstarpu_mod.mod: fstarpu_mod.o @STARPU_HAVE_FC_TRUE@nf_codelets.mod: nf_codelets.o @STARPU_HAVE_FC_TRUE@nf_dynbuf_cl.mod: nf_dynbuf_cl.o @STARPU_HAVE_FC_TRUE@nf_varbuf_cl.mod: nf_varbuf_cl.o @STARPU_HAVE_FC_TRUE@nf_sched_ctx_cl.mod: nf_sched_ctx_cl.o @STARPU_HAVE_FC_TRUE@nf_partition_cl.mod: nf_partition_cl.o @STARPU_HAVE_FC_TRUE@fstarpu_mod.o: $(top_srcdir)/include/fstarpu_mod.f90 @STARPU_HAVE_FC_TRUE@ $(AM_V_FC)$(FC) $(native_fortran_nf_vector_FCFLAGS) $(FCFLAGS) -c -o $@ '$(top_srcdir)/'include/fstarpu_mod.f90 @STARPU_HAVE_FC_TRUE@nf_codelets.o: $(top_srcdir)/examples/native_fortran/nf_codelets.f90 fstarpu_mod.mod @STARPU_HAVE_FC_TRUE@ $(AM_V_FC)$(FC) $(native_fortran_nf_vector_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_codelets.f90' || echo '$(srcdir)/'`native_fortran/nf_codelets.f90 @STARPU_HAVE_FC_TRUE@nf_vector.o: $(top_srcdir)/examples/native_fortran/nf_vector.f90 nf_codelets.mod fstarpu_mod.mod @STARPU_HAVE_FC_TRUE@ $(AM_V_FC)$(FC) $(native_fortran_nf_vector_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_vector.f90' || echo '$(srcdir)/'`native_fortran/nf_vector.f90 @STARPU_HAVE_FC_TRUE@nf_matrix.o: $(top_srcdir)/examples/native_fortran/nf_matrix.f90 nf_codelets.mod fstarpu_mod.mod @STARPU_HAVE_FC_TRUE@ $(AM_V_FC)$(FC) $(native_fortran_nf_matrix_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_matrix.f90' || echo '$(srcdir)/'`native_fortran/nf_matrix.f90 @STARPU_HAVE_FC_TRUE@nf_compute.o: $(top_srcdir)/examples/native_fortran/nf_compute.f90 nf_types.mod fstarpu_mod.mod @STARPU_HAVE_FC_TRUE@ $(AM_V_FC)$(FC) $(native_fortran_nf_example_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_compute.f90' || echo '$(srcdir)/'`native_fortran/nf_compute.f90 @STARPU_HAVE_FC_TRUE@nf_example.o: $(top_srcdir)/examples/native_fortran/nf_example.f90 nf_types.mod nf_compute.mod fstarpu_mod.mod @STARPU_HAVE_FC_TRUE@ $(AM_V_FC)$(FC) $(native_fortran_nf_example_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_example.f90' || echo '$(srcdir)/'`native_fortran/nf_example.f90 @STARPU_HAVE_FC_TRUE@nf_dynbuf_cl.o: $(top_srcdir)/examples/native_fortran/nf_dynbuf_cl.f90 nf_types.mod fstarpu_mod.mod @STARPU_HAVE_FC_TRUE@ $(AM_V_FC)$(FC) $(native_fortran_nf_dynbuf_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_dynbuf_cl.f90' || echo '$(srcdir)/'`native_fortran/nf_dynbuf_cl.f90 @STARPU_HAVE_FC_TRUE@nf_dynbuf.o: $(top_srcdir)/examples/native_fortran/nf_dynbuf.f90 nf_types.mod nf_dynbuf_cl.mod fstarpu_mod.mod @STARPU_HAVE_FC_TRUE@ $(AM_V_FC)$(FC) $(native_fortran_nf_dynbuf_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_dynbuf.f90' || echo '$(srcdir)/'`native_fortran/nf_dynbuf.f90 @STARPU_HAVE_FC_TRUE@nf_varbuf_cl.o: $(top_srcdir)/examples/native_fortran/nf_varbuf_cl.f90 nf_types.mod fstarpu_mod.mod @STARPU_HAVE_FC_TRUE@ $(AM_V_FC)$(FC) $(native_fortran_nf_varbuf_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_varbuf_cl.f90' || echo '$(srcdir)/'`native_fortran/nf_varbuf_cl.f90 @STARPU_HAVE_FC_TRUE@nf_varbuf.o: $(top_srcdir)/examples/native_fortran/nf_varbuf.f90 nf_types.mod nf_varbuf_cl.mod fstarpu_mod.mod @STARPU_HAVE_FC_TRUE@ $(AM_V_FC)$(FC) $(native_fortran_nf_varbuf_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_varbuf.f90' || echo '$(srcdir)/'`native_fortran/nf_varbuf.f90 @STARPU_HAVE_FC_TRUE@nf_sched_ctx_cl.o: $(top_srcdir)/examples/native_fortran/nf_sched_ctx_cl.f90 nf_types.mod fstarpu_mod.mod @STARPU_HAVE_FC_TRUE@ $(AM_V_FC)$(FC) $(native_fortran_nf_sched_ctx_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_sched_ctx_cl.f90' || echo '$(srcdir)/'`native_fortran/nf_sched_ctx_cl.f90 @STARPU_HAVE_FC_TRUE@nf_sched_ctx.o: $(top_srcdir)/examples/native_fortran/nf_sched_ctx.f90 nf_types.mod nf_sched_ctx_cl.mod fstarpu_mod.mod @STARPU_HAVE_FC_TRUE@ $(AM_V_FC)$(FC) $(native_fortran_nf_sched_ctx_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_sched_ctx.f90' || echo '$(srcdir)/'`native_fortran/nf_sched_ctx.f90 @STARPU_HAVE_FC_TRUE@nf_partition_cl.o: $(top_srcdir)/examples/native_fortran/nf_partition_cl.f90 nf_types.mod fstarpu_mod.mod @STARPU_HAVE_FC_TRUE@ $(AM_V_FC)$(FC) $(native_fortran_nf_partition_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_partition_cl.f90' || echo '$(srcdir)/'`native_fortran/nf_partition_cl.f90 @STARPU_HAVE_FC_TRUE@nf_partition.o: $(top_srcdir)/examples/native_fortran/nf_partition.f90 nf_types.mod nf_partition_cl.mod fstarpu_mod.mod @STARPU_HAVE_FC_TRUE@ $(AM_V_FC)$(FC) $(native_fortran_nf_partition_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_partition.f90' || echo '$(srcdir)/'`native_fortran/nf_partition.f90 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.2.3+dfsg/examples/README.txt000066400000000000000000000055631320135501600172730ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016 Université de Bordeaux # Copyright (C) 2016 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. audio This applies a simple band filter over audio files axpy This computes the AXPY BLAS over a big vector basic_examples This contains very trivial examples: hello world, scaling a vector, etc. binary This shows how to store and load compiled OpenCL kernels on and from the file system callback This shows how to use task callbacks cg This computes a Conjugate Gradient cholesky This computes a Cholesky factorization common This holds common code for BLAS kernels cpp This shows how to use StarPU from C++ filters This contains several partitioning examples fortran90 This shows how to use StarPU from Fortran90 gl_interop This shows how interoperation can be done between StarPU CUDA computations and OpenGL rendering heat This uses a finite element method to compute heat propagation thanks to an LU factorization or a conjugate gradient incrementer This just increments a variable interface This shows how to implement a user-defined data type, here simply complex floats lu This computes an LU factorization mandelbrot This computes and outputs the mandelbrot set matvecmult This computes a matrix-vector multiplication mult This computes a matrix-matrix multiplication openmp This shows how to use an OpenMP code inside a StarPU parallel task pi This computes Pi thanks to random numbers pipeline This shows how to submit a pipeline to StarPU with limited buffer use, and avoiding submitted all the tasks at once ppm_downscaler This downscales PPM pictures profiling This examplifies how to get profiling information on executed tasks reductions This examplifies how to use value reductions sched_ctx This examplifies how to use scheduling contexts sched_ctx_utils This is just common code for scheduling contexts scheduler This examplifies how to implement a user-defined scheduler spmd This shows how to define a parallel task spmv This computes a sparse matrix-vector multiplication stencil This computes a dumb 3D stencil with 1D subdomain decomposition tag_example This examplifies how to use tags for dependencies top This examplifies how to enrich StarPU-top with information worker_collections This examplifies how to use worker collections starpu-1.2.3+dfsg/examples/axpy/000077500000000000000000000000001320135501600165455ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/axpy/axpy.c000066400000000000000000000137301320135501600176760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2015 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2013, 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This creates two dumb vectors, splits them into chunks, and for each pair of * chunk, run axpy on them. */ #include #include #include #include #include #include #ifdef STARPU_USE_CUDA #include #endif #include "axpy.h" #define AXPY STARPU_SAXPY #define CUBLASAXPY cublasSaxpy #define N (16*1024*1024) #define NBLOCKS 8 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #define EPSILON 1e-6 TYPE *_vec_x, *_vec_y; TYPE _alpha = 3.41; /* descriptors for StarPU */ starpu_data_handle_t _handle_y, _handle_x; void axpy_cpu(void *descr[], STARPU_ATTRIBUTE_UNUSED void *arg) { TYPE alpha = *((TYPE *)arg); unsigned n = STARPU_VECTOR_GET_NX(descr[0]); TYPE *block_x = (TYPE *)STARPU_VECTOR_GET_PTR(descr[0]); TYPE *block_y = (TYPE *)STARPU_VECTOR_GET_PTR(descr[1]); AXPY((int)n, alpha, block_x, 1, block_y, 1); } #ifdef STARPU_USE_CUDA void axpy_gpu(void *descr[], STARPU_ATTRIBUTE_UNUSED void *arg) { TYPE alpha = *((TYPE *)arg); unsigned n = STARPU_VECTOR_GET_NX(descr[0]); TYPE *block_x = (TYPE *)STARPU_VECTOR_GET_PTR(descr[0]); TYPE *block_y = (TYPE *)STARPU_VECTOR_GET_PTR(descr[1]); cublasStatus_t status = CUBLASAXPY(starpu_cublas_get_local_handle(), (int)n, &alpha, block_x, 1, block_y, 1); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); } #endif #ifdef STARPU_USE_OPENCL extern void axpy_opencl(void *buffers[], void *args); #endif static struct starpu_perfmodel axpy_model = { .type = STARPU_HISTORY_BASED, .symbol = "axpy" }; static struct starpu_codelet axpy_cl = { .cpu_funcs = {axpy_cpu}, .cpu_funcs_name = {"axpy_cpu"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {axpy_gpu}, #elif defined(STARPU_SIMGRID) .cuda_funcs = {(void*)1}, #endif .cuda_flags = {STARPU_CUDA_ASYNC}, #ifdef STARPU_USE_OPENCL .opencl_funcs = {axpy_opencl}, #elif defined(STARPU_SIMGRID) .opencl_funcs = {(void*)1}, #endif .opencl_flags = {STARPU_OPENCL_ASYNC}, .nbuffers = 2, .modes = {STARPU_R, STARPU_RW}, .name = "axpy", .model = &axpy_model }; static int check(void) { int i; for (i = 0; i < N; i++) { TYPE expected_value = _alpha * _vec_x[i] + 4.0; if (fabs(_vec_y[i] - expected_value) > expected_value * EPSILON) { FPRINTF(stderr,"at %d, %f*%f+%f=%f, expected %f\n", i, _alpha, _vec_x[i], 4.0, _vec_y[i], expected_value); return EXIT_FAILURE; } } return EXIT_SUCCESS; } #ifdef STARPU_USE_OPENCL struct starpu_opencl_program opencl_program; #endif int main(int argc, char **argv) { int ret, exit_value = 0; /* Initialize StarPU */ ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_load_opencl_from_file("examples/axpy/axpy_opencl_kernel.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif starpu_cublas_init(); /* This is equivalent to vec_a = malloc(N*sizeof(TYPE)); vec_b = malloc(N*sizeof(TYPE)); */ starpu_malloc((void **)&_vec_x, N*sizeof(TYPE)); assert(_vec_x); starpu_malloc((void **)&_vec_y, N*sizeof(TYPE)); assert(_vec_y); unsigned i; for (i = 0; i < N; i++) { _vec_x[i] = 1.0f; /*(TYPE)starpu_drand48(); */ _vec_y[i] = 4.0f; /*(TYPE)starpu_drand48(); */ } FPRINTF(stderr, "BEFORE x[0] = %2.2f\n", _vec_x[0]); FPRINTF(stderr, "BEFORE y[0] = %2.2f\n", _vec_y[0]); /* Declare the data to StarPU */ starpu_vector_data_register(&_handle_x, STARPU_MAIN_RAM, (uintptr_t)_vec_x, N, sizeof(TYPE)); starpu_vector_data_register(&_handle_y, STARPU_MAIN_RAM, (uintptr_t)_vec_y, N, sizeof(TYPE)); /* Divide the vector into blocks */ struct starpu_data_filter block_filter = { .filter_func = starpu_vector_filter_block, .nchildren = NBLOCKS }; starpu_data_partition(_handle_x, &block_filter); starpu_data_partition(_handle_y, &block_filter); double start; double end; start = starpu_timing_now(); unsigned b; for (b = 0; b < NBLOCKS; b++) { struct starpu_task *task = starpu_task_create(); task->cl = &axpy_cl; task->cl_arg = &_alpha; task->cl_arg_size = sizeof(_alpha); task->handles[0] = starpu_data_get_sub_data(_handle_x, 1, b); task->handles[1] = starpu_data_get_sub_data(_handle_y, 1, b); task->tag_id = b; ret = starpu_task_submit(task); if (ret == -ENODEV) { exit_value = 77; goto enodev; } STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_task_wait_for_all(); enodev: starpu_data_unpartition(_handle_x, STARPU_MAIN_RAM); starpu_data_unpartition(_handle_y, STARPU_MAIN_RAM); starpu_data_unregister(_handle_x); starpu_data_unregister(_handle_y); end = starpu_timing_now(); double timing = end - start; FPRINTF(stderr, "timing -> %2.2f us %2.2f MB/s\n", timing, 3*N*sizeof(TYPE)/timing); FPRINTF(stderr, "AFTER y[0] = %2.2f (ALPHA = %2.2f)\n", _vec_y[0], _alpha); if (exit_value != 77) exit_value = check(); starpu_free((void *)_vec_x); starpu_free((void *)_vec_y); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); #endif /* Stop StarPU */ starpu_shutdown(); return exit_value; } starpu-1.2.3+dfsg/examples/axpy/axpy.h000066400000000000000000000015001320135501600176730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef AXPY_H__ #define AXPY_H__ #define TYPE float #endif /* AXPY_H__ */ starpu-1.2.3+dfsg/examples/axpy/axpy_opencl.c000066400000000000000000000042161320135501600212350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* OpenCL codelet for axpy */ #include #include "axpy.h" extern struct starpu_opencl_program opencl_program; void axpy_opencl(void *buffers[], void *_args) { TYPE *alpha = _args; int id, devid; cl_int err; cl_kernel kernel; cl_command_queue queue; unsigned n = STARPU_VECTOR_GET_NX(buffers[0]); cl_mem x = (cl_mem) STARPU_VECTOR_GET_DEV_HANDLE(buffers[0]); cl_mem y = (cl_mem) STARPU_VECTOR_GET_DEV_HANDLE(buffers[1]); id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_program, "_axpy_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 0, sizeof(x), &x); err|= clSetKernelArg(kernel, 1, sizeof(y), &y); err|= clSetKernelArg(kernel, 2, sizeof(n), &n); err|= clSetKernelArg(kernel, 3, sizeof(*alpha), alpha); if (err) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=n; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local=global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } starpu_opencl_release_kernel(kernel); } starpu-1.2.3+dfsg/examples/axpy/axpy_opencl_kernel.cl000066400000000000000000000016121320135501600227460ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* OpenCL kernel implementing axpy */ #include "axpy.h" __kernel void _axpy_opencl(__global TYPE *x, __global TYPE *y, unsigned nx, TYPE alpha) { const int i = get_global_id(0); if (i < nx) y[i] = alpha * x[i] + y[i]; } starpu-1.2.3+dfsg/examples/basic_examples/000077500000000000000000000000001320135501600205435ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/basic_examples/block.c000066400000000000000000000076171320135501600220140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) extern void cpu_codelet(void *descr[], void *_args); #ifdef STARPU_USE_CUDA extern void cuda_codelet(void *descr[], void *_args); #endif #ifdef STARPU_USE_OPENCL extern void opencl_codelet(void *descr[], void *_args); struct starpu_opencl_program opencl_code; #endif typedef void (*device_func)(void **, void *); int execute_on(uint32_t where, device_func func, float *block, int pnx, int pny, int pnz, float multiplier) { struct starpu_codelet cl; starpu_data_handle_t block_handle; int i; starpu_block_data_register(&block_handle, STARPU_MAIN_RAM, (uintptr_t)block, pnx, pnx*pny, pnx, pny, pnz, sizeof(float)); starpu_codelet_init(&cl); cl.where = where; cl.cuda_funcs[0] = func; cl.cpu_funcs[0] = func; cl.opencl_funcs[0] = func; cl.nbuffers = 1; cl.modes[0] = STARPU_RW, cl.model = NULL; cl.name = "block_scale"; struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->callback_func = NULL; task->handles[0] = block_handle; task->cl_arg = &multiplier; task->cl_arg_size = sizeof(multiplier); int ret = starpu_task_submit(task); if (STARPU_UNLIKELY(ret == -ENODEV)) { FPRINTF(stderr, "No worker may execute this task\n"); task->destroy = 0; starpu_task_destroy(task); return 1; } starpu_task_wait_for_all(); /* update the array in RAM */ starpu_data_unregister(block_handle); for(i=0 ; i void cpu_codelet(void *descr[], void *_args) { float *block = (float *)STARPU_BLOCK_GET_PTR(descr[0]); int nx = (int)STARPU_BLOCK_GET_NX(descr[0]); int ny = (int)STARPU_BLOCK_GET_NY(descr[0]); int nz = (int)STARPU_BLOCK_GET_NZ(descr[0]); unsigned ldy = STARPU_BLOCK_GET_LDY(descr[0]); unsigned ldz = STARPU_BLOCK_GET_LDZ(descr[0]); float *multiplier = (float *)_args; int i, j, k; for(k=0; k static __global__ void cuda_block(float *block, int nx, int ny, int nz, unsigned ldy, unsigned ldz, float multiplier) { int i, j, k; for(k=0; k>>(block, nx, ny, nz, ldy, ldz, *multiplier); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.2.3+dfsg/examples/basic_examples/block_opencl.c000066400000000000000000000050231320135501600233410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #define CHECK_CL_SET_KERNEL_ARG(kernel, n, size, ptr) \ do \ { \ int check_err; \ check_err = clSetKernelArg(kernel, n, size, ptr); \ if (check_err != CL_SUCCESS) \ STARPU_OPENCL_REPORT_ERROR(check_err); \ } while (0) extern struct starpu_opencl_program opencl_code; void opencl_codelet(void *descr[], void *_args) { cl_kernel kernel; cl_command_queue queue; cl_event event; int id, devid, err; cl_mem block = (cl_mem)STARPU_BLOCK_GET_DEV_HANDLE(descr[0]); int nx = (int)STARPU_BLOCK_GET_NX(descr[0]); int ny = (int)STARPU_BLOCK_GET_NY(descr[0]); int nz = (int)STARPU_BLOCK_GET_NZ(descr[0]); int ldy = (int)STARPU_BLOCK_GET_LDY(descr[0]); int ldz = (int) STARPU_BLOCK_GET_LDZ(descr[0]); float *multiplier = (float *)_args; id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_code, "block", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); CHECK_CL_SET_KERNEL_ARG(kernel, 0, sizeof(block), &block); CHECK_CL_SET_KERNEL_ARG(kernel, 1, sizeof(nx), &nx); CHECK_CL_SET_KERNEL_ARG(kernel, 2, sizeof(ny), &ny); CHECK_CL_SET_KERNEL_ARG(kernel, 3, sizeof(nz), &nz); CHECK_CL_SET_KERNEL_ARG(kernel, 4, sizeof(ldy), &ldy); CHECK_CL_SET_KERNEL_ARG(kernel, 5, sizeof(ldz), &ldz); CHECK_CL_SET_KERNEL_ARG(kernel, 6, sizeof(*multiplier), multiplier); { size_t global=nx*ny*nz; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, NULL, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } clFinish(queue); starpu_opencl_collect_stats(event); clReleaseEvent(event); starpu_opencl_release_kernel(kernel); } starpu-1.2.3+dfsg/examples/basic_examples/block_opencl_kernel.cl000066400000000000000000000015221320135501600250550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ __kernel void block(__global float *b, int nx, int ny, int nz, int ldy, int ldz, float multiplier) { const int i = get_global_id(0); if (i < (nz*ldz)+(ny*ldy)+nx) b[i] = b[i] * multiplier; } starpu-1.2.3+dfsg/examples/basic_examples/dynamic_handles.c000066400000000000000000000102641320135501600240340ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013, 2014 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) void dummy_small_kernel(void *descr[], void *cl_arg) { int nb_data; int i; starpu_codelet_unpack_args(cl_arg, &nb_data); assert(nb_data == 1); FPRINTF(stderr, "Number of data: %d\n", nb_data); for(i=0 ; isynchronous = 1; task->cl = &dummy_small_cl; starpu_codelet_pack_args(&task->cl_arg, &task->cl_arg_size, STARPU_VALUE, &(task->cl->nbuffers), sizeof(task->cl->nbuffers), 0); task->dyn_handles = malloc(sizeof(*task->dyn_handles)); task->dyn_handles[0] = handle; task->cl_arg_free = 1; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); task2 = starpu_task_create(); task2->synchronous = 1; task2->cl = &dummy_big_cl; task2->cl_arg_free = 1; starpu_codelet_pack_args(&task2->cl_arg, &task2->cl_arg_size, STARPU_VALUE, &(task2->cl->nbuffers), sizeof(task2->cl->nbuffers), 0); task2->dyn_handles = malloc(task2->cl->nbuffers * sizeof(*(task2->dyn_handles))); task2->dyn_modes = malloc(task2->cl->nbuffers * sizeof(*(task2->dyn_modes))); for(i=0 ; icl->nbuffers ; i++) { task2->dyn_handles[i] = handle; task2->dyn_modes[i] = STARPU_RW; } ret = starpu_task_submit(task2); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_insert(&dummy_small_cl, STARPU_VALUE, &(dummy_small_cl.nbuffers), sizeof(dummy_small_cl.nbuffers), STARPU_RW, handle, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); descrs = malloc(dummy_big_cl.nbuffers * sizeof(struct starpu_data_descr)); for(i=0 ; icl_arg) * - how to declare a callback function that is called once the task has been * executed * - how to specify if starpu_task_submit is a blocking or non-blocking * operation (task->synchronous) */ #include #include #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) /* When the task is done, task->callback_func(task->callback_arg) is called. Any * callback function must have the prototype void (*)(void *). * NB: Callback are NOT allowed to perform potentially blocking operations */ void callback_func(void *callback_arg) { FPRINTF(stdout, "Callback function got argument %p\n", callback_arg); } /* Every implementation of a codelet must have this prototype, the first * argument (buffers) describes the buffers/streams that are managed by the * DSM; the second arguments references read-only data that is passed as an * argument of the codelet (task->cl_arg). Here, "buffers" is unused as there * are no data input/output managed by the DSM (cl.nbuffers = 0) */ struct params { int i; float f; }; void cpu_func(void *buffers[], void *cl_arg) { struct params *params = (struct params *) cl_arg; FPRINTF(stdout, "Hello world (params = {%i, %f} )\n", params->i, params->f); } int main(int argc, char **argv) { struct starpu_codelet cl; struct starpu_task *task; struct params params = {1, 2.0f}; int ret; /* initialize StarPU : passing a NULL argument means that we use * default configuration for the scheduling policies and the number of * processors/accelerators */ ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* create a new task that is non-blocking by default : the task is not * submitted to the scheduler until the starpu_task_submit function is * called */ task = starpu_task_create(); starpu_codelet_init(&cl); /* this codelet may only be executed on a CPU, and its cpu * implementation is function "cpu_func" */ cl.cpu_funcs[0] = cpu_func; cl.cpu_funcs_name[0] = "cpu_func"; /* the codelet does not manipulate any data that is managed * by our DSM */ cl.nbuffers = 0; cl.name="hello"; /* the task uses codelet "cl" */ task->cl = &cl; /* It is possible to pass buffers that are not managed by the DSM to the * kernels: the second argument of the "cpu_func" function is a pointer to a * buffer that contains information for the codelet (cl_arg stands for * codelet argument). In the case of accelerators, it is possible that * the codelet is given a pointer to a copy of that buffer: this buffer * is read-only so that any modification is not passed to other copies * of the buffer. For this reason, a buffer passed as a codelet * argument (cl_arg) is NOT a valid synchronization medium! */ task->cl_arg = ¶ms; task->cl_arg_size = sizeof(params); /* once the task has been executed, callback_func(0x42) * will be called on a CPU */ task->callback_func = callback_func; task->callback_arg = (void*) (uintptr_t) 0x42; /* starpu_task_submit will be a blocking call */ task->synchronous = 1; /* submit the task to StarPU */ ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); /* terminate StarPU: statistics and other debug outputs are not * guaranteed to be generated unless this function is called. Once it * is called, it is not possible to submit tasks anymore, and the user * is responsible for making sure all tasks have already been executed: * calling starpu_shutdown() before the termination of all the tasks * results in an undefined behaviour */ starpu_shutdown(); return 0; enodev: starpu_shutdown(); return 77; } starpu-1.2.3+dfsg/examples/basic_examples/mult.c000066400000000000000000000307631320135501600217010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013, 2015 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2013, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This example shows a simple implementation of a blocked matrix * multiplication. Note that this is NOT intended to be an efficient * implementation of sgemm! In this example, we show: * - how to declare dense matrices (starpu_matrix_data_register) * - how to manipulate matrices within codelets (eg. descr[0].blas.ld) * - how to use filters to partition the matrices into blocks * (starpu_data_partition and starpu_data_map_filters) * - how to unpartition data (starpu_data_unpartition) and how to stop * monitoring data (starpu_data_unregister) * - how to manipulate subsets of data (starpu_data_get_sub_data) * - how to construct an autocalibrated performance model (starpu_perfmodel) * - how to submit asynchronous tasks */ #include #include #include #include #include static float *A, *B, *C; static starpu_data_handle_t A_handle, B_handle, C_handle; static unsigned nslicesx = 4; static unsigned nslicesy = 4; #ifdef STARPU_QUICK_CHECK static unsigned xdim = 512; static unsigned ydim = 512; static unsigned zdim = 256; #else static unsigned xdim = 1024; static unsigned ydim = 1024; static unsigned zdim = 512; #endif /* * That program should compute C = A * B * * A of size (z,y) * B of size (x,z) * C of size (x,y) |---------------| z | B | |---------------| z x |----| |---------------| | | | | | | | | | A | y | C | | | | | | | | | |----| |---------------| */ /* * The codelet is passed 3 matrices, the "descr" union-type field gives a * description of the layout of those 3 matrices in the local memory (ie. RAM * in the case of CPU, GPU frame buffer in the case of GPU etc.). Since we have * registered data with the "matrix" data interface, we use the matrix macros. */ void cpu_mult(void *descr[], STARPU_ATTRIBUTE_UNUSED void *arg) { float *subA, *subB, *subC; uint32_t nxC, nyC, nyA; uint32_t ldA, ldB, ldC; /* .blas.ptr gives a pointer to the first element of the local copy */ subA = (float *)STARPU_MATRIX_GET_PTR(descr[0]); subB = (float *)STARPU_MATRIX_GET_PTR(descr[1]); subC = (float *)STARPU_MATRIX_GET_PTR(descr[2]); /* .blas.nx is the number of rows (consecutive elements) and .blas.ny * is the number of lines that are separated by .blas.ld elements (ld * stands for leading dimension). * NB: in case some filters were used, the leading dimension is not * guaranteed to be the same in main memory (on the original matrix) * and on the accelerator! */ nxC = STARPU_MATRIX_GET_NX(descr[2]); nyC = STARPU_MATRIX_GET_NY(descr[2]); nyA = STARPU_MATRIX_GET_NY(descr[0]); ldA = STARPU_MATRIX_GET_LD(descr[0]); ldB = STARPU_MATRIX_GET_LD(descr[1]); ldC = STARPU_MATRIX_GET_LD(descr[2]); /* we assume a FORTRAN-ordering! */ unsigned i,j,k; for (i = 0; i < nyC; i++) { for (j = 0; j < nxC; j++) { float sum = 0.0; for (k = 0; k < nyA; k++) { sum += subA[j+k*ldA]*subB[k+i*ldB]; } subC[j + i*ldC] = sum; } } } static void init_problem_data(void) { unsigned i,j; /* we initialize matrices A, B and C in the usual way */ A = (float *) malloc(zdim*ydim*sizeof(float)); B = (float *) malloc(xdim*zdim*sizeof(float)); C = (float *) malloc(xdim*ydim*sizeof(float)); /* fill the A and B matrices */ starpu_srand48(2009); for (j=0; j < ydim; j++) { for (i=0; i < zdim; i++) { A[j+i*ydim] = (float)(starpu_drand48()); } } for (j=0; j < zdim; j++) { for (i=0; i < xdim; i++) { B[j+i*zdim] = (float)(starpu_drand48()); } } for (j=0; j < ydim; j++) { for (i=0; i < xdim; i++) { C[j+i*ydim] = (float)(0); } } } static void partition_mult_data(void) { /* note that we assume a FORTRAN ordering here! */ /* The BLAS data interface is described by 4 parameters: * - the location of the first element of the matrix to monitor (3rd * argument) * - the number of elements between columns, aka leading dimension * (4th arg) * - the number of (contiguous) elements per column, ie. contiguous * elements (5th arg) * - the number of columns (6th arg) * The first elements is a pointer to the data_handle that will be * associated to the matrix, and the second elements gives the memory * node in which resides the matrix: 0 means that the 3rd argument is * an adress in main memory. */ starpu_matrix_data_register(&A_handle, STARPU_MAIN_RAM, (uintptr_t)A, ydim, ydim, zdim, sizeof(float)); starpu_matrix_data_register(&B_handle, STARPU_MAIN_RAM, (uintptr_t)B, zdim, zdim, xdim, sizeof(float)); starpu_matrix_data_register(&C_handle, STARPU_MAIN_RAM, (uintptr_t)C, ydim, ydim, xdim, sizeof(float)); /* A filter is a method to partition a data into disjoint chunks, it is * described by the means of the "struct starpu_data_filter" structure that * contains a function that is applied on a data handle to partition it * into smaller chunks, and an argument that is passed to the function * (eg. the number of blocks to create here). */ /* StarPU supplies some basic filters such as the partition of a matrix * into blocks, note that we are using a FORTRAN ordering so that the * name of the filters are a bit misleading */ struct starpu_data_filter vert = { .filter_func = starpu_matrix_filter_vertical_block, .nchildren = nslicesx }; struct starpu_data_filter horiz = { .filter_func = starpu_matrix_filter_block, .nchildren = nslicesy }; /* * Illustration with nslicex = 4 and nslicey = 2, it is possible to access * sub-data by using the "starpu_data_get_sub_data" method, which takes a data handle, * the number of filters to apply, and the indexes for each filters, for * instance: * * A' handle is starpu_data_get_sub_data(A_handle, 1, 1); * B' handle is starpu_data_get_sub_data(B_handle, 1, 2); * C' handle is starpu_data_get_sub_data(C_handle, 2, 2, 1); * * Note that here we applied 2 filters recursively onto C. * * "starpu_data_get_sub_data(C_handle, 1, 3)" would return a handle to the 4th column * of blocked matrix C for example. * * |---|---|---|---| * | | | B'| | B * |---|---|---|---| * 0 1 2 3 * |----| |---|---|---|---| * | | | | | | | * | | 0 | | | | | * |----| |---|---|---|---| * | A' | | | | C'| | * | | | | | | | * |----| |---|---|---|---| * A C * * IMPORTANT: applying filters is equivalent to partitionning a piece of * data in a hierarchical manner, so that memory consistency is enforced * for each of the elements independantly. The tasks should therefore NOT * access inner nodes (eg. one column of C or the whole C) but only the * leafs of the tree (ie. blocks here). Manipulating inner nodes is only * possible by disapplying the filters (using starpu_data_unpartition), to * enforce memory consistency. */ starpu_data_partition(B_handle, &vert); starpu_data_partition(A_handle, &horiz); /* starpu_data_map_filters is a variable-arity function, the first argument * is the handle of the data to partition, the second argument is the * number of filters to apply recursively. Filters are applied in the * same order as the arguments. * This would be equivalent to starpu_data_partition(C_handle, &vert) and * then applying horiz on each sub-data (ie. each column of C) */ starpu_data_map_filters(C_handle, 2, &vert, &horiz); } static struct starpu_perfmodel mult_perf_model = { .type = STARPU_HISTORY_BASED, .symbol = "mult_perf_model" }; static struct starpu_codelet cl = { /* we can only execute that kernel on a CPU yet */ /* CPU implementation of the codelet */ .cpu_funcs = {cpu_mult}, .cpu_funcs_name = {"cpu_mult"}, /* the codelet manipulates 3 buffers that are managed by the * DSM */ .nbuffers = 3, .modes = {STARPU_R, STARPU_R, STARPU_W}, /* in case the scheduling policy may use performance models */ .model = &mult_perf_model }; static int launch_tasks(void) { int ret; /* partition the work into slices */ unsigned taskx, tasky; for (taskx = 0; taskx < nslicesx; taskx++) { for (tasky = 0; tasky < nslicesy; tasky++) { /* C[taskx, tasky] = A[tasky] B[taskx] */ /* by default, starpu_task_create() returns an * asynchronous task (ie. task->synchronous = 0) */ struct starpu_task *task = starpu_task_create(); /* this task implements codelet "cl" */ task->cl = &cl; /* * |---|---|---|---| * | | * | | | B * |---|---|---|---| * X * |----| |---|---|---|---| * |****| Y | |***| | | * |****| | |***| | | * |----| |---|---|---|---| * | | | | | | | * | | | | | | | * |----| |---|---|---|---| * A C */ /* there was a single filter applied to matrices A * (respectively B) so we grab the handle to the chunk * identified by "tasky" (respectively "taskx). The "1" * tells StarPU that there is a single argument to the * variable-arity function starpu_data_get_sub_data */ task->handles[0] = starpu_data_get_sub_data(A_handle, 1, tasky); task->handles[1] = starpu_data_get_sub_data(B_handle, 1, taskx); /* 2 filters were applied on matrix C, so we give * starpu_data_get_sub_data 2 arguments. The order of the arguments * must match the order in which the filters were * applied. * NB: starpu_data_get_sub_data(C_handle, 1, k) would have returned * a handle to the column number k of matrix C. * NB2: starpu_data_get_sub_data(C_handle, 2, taskx, tasky) is * equivalent to * starpu_data_get_sub_data(starpu_data_get_sub_data(C_handle, 1, taskx), 1, tasky)*/ task->handles[2] = starpu_data_get_sub_data(C_handle, 2, taskx, tasky); /* this is not a blocking call since task->synchronous = 0 */ ret = starpu_task_submit(task); if (ret == -ENODEV) return ret; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } return 0; } int main(STARPU_ATTRIBUTE_UNUSED int argc, STARPU_ATTRIBUTE_UNUSED char **argv) { int ret; /* start the runtime */ ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* initialize matrices A, B and C and register them to StarPU */ init_problem_data(); /* partition matrices into blocks that can be manipulated by the * codelets */ partition_mult_data(); /* submit all tasks in an asynchronous fashion */ ret = launch_tasks(); if (ret == -ENODEV) goto enodev; /* wait for termination */ starpu_task_wait_for_all(); /* remove the filters applied by the means of starpu_data_map_filters; now * it's not possible to manipulate a subset of C using starpu_data_get_sub_data until * starpu_data_map_filters is called again on C_handle. * The second argument is the memory node where the different subsets * should be reassembled, 0 = main memory (RAM) */ starpu_data_unpartition(A_handle, STARPU_MAIN_RAM); starpu_data_unpartition(B_handle, STARPU_MAIN_RAM); starpu_data_unpartition(C_handle, STARPU_MAIN_RAM); /* stop monitoring matrix C : after this, it is not possible to pass C * (or any subset of C) as a codelet input/output. This also implements * a barrier so that the piece of data is put back into main memory in * case it was only available on a GPU for instance. */ starpu_data_unregister(A_handle); starpu_data_unregister(B_handle); starpu_data_unregister(C_handle); free(A); free(B); free(C); starpu_shutdown(); return 0; enodev: starpu_shutdown(); return 77; } starpu-1.2.3+dfsg/examples/basic_examples/multiformat.c000066400000000000000000000152701320135501600232570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "multiformat_types.h" static int ncpu = 0; #ifdef STARPU_USE_CUDA static int ncuda = 0; #endif #ifdef STARPU_USE_OPENCL static int nopencl = 0; #endif #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) static struct point array_of_structs[N_ELEMENTS]; static starpu_data_handle_t array_of_structs_handle; void multiformat_scal_cpu_func(void *buffers[], void *args) { struct point *aos; unsigned int n, i; aos = (struct point *) STARPU_MULTIFORMAT_GET_CPU_PTR(buffers[0]); n = STARPU_MULTIFORMAT_GET_NX(buffers[0]); for (i = 0; i < n; i++) { aos[i].x *= aos[i].y; } } #ifdef STARPU_USE_CUDA extern struct starpu_codelet cpu_to_cuda_cl; extern struct starpu_codelet cuda_to_cpu_cl; #endif #ifdef STARPU_USE_OPENCL extern struct starpu_codelet cpu_to_opencl_cl; extern struct starpu_codelet opencl_to_cpu_cl; #endif static struct starpu_multiformat_data_interface_ops format_ops = { #ifdef STARPU_USE_CUDA .cuda_elemsize = 2* sizeof(float), .cpu_to_cuda_cl = &cpu_to_cuda_cl, .cuda_to_cpu_cl = &cuda_to_cpu_cl, #endif #ifdef STARPU_USE_OPENCL .opencl_elemsize = 2 * sizeof(float), .cpu_to_opencl_cl = &cpu_to_opencl_cl, .opencl_to_cpu_cl = &opencl_to_cpu_cl, #endif .cpu_elemsize = sizeof(struct point), }; #ifdef STARPU_USE_CUDA extern void multiformat_scal_cuda_func(void *buffers[], void *arg); #endif #ifdef STARPU_USE_OPENCL extern void multiformat_scal_opencl_func(void *buffers[], void *arg); #endif #ifdef STARPU_USE_CPU static struct starpu_codelet cpu_cl = { .cpu_funcs = {multiformat_scal_cpu_func}, .cpu_funcs_name = {"multiformat_scal_cpu_func"}, .nbuffers = 1, .modes = { STARPU_RW }, .name = "codelet_real" }; #endif /* !STARPU_USE_CPU */ #ifdef STARPU_USE_CUDA static struct starpu_codelet cuda_cl = { .cuda_funcs = { multiformat_scal_cuda_func }, .nbuffers = 1, .modes = { STARPU_RW }, .name = "cuda_codelet" }; #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL static struct starpu_codelet opencl_cl = { .opencl_funcs = { multiformat_scal_opencl_func }, .nbuffers = 1, .modes = { STARPU_RW }, .name = "opencl_codelet" }; #endif /* !STARPU_USE_OPENCL */ /* * Main functions */ static void init_problem_data(void) { int i; for (i = 0; i < N_ELEMENTS; i++) { array_of_structs[i].x = 1.0 + i; array_of_structs[i].y = 42.0; } } static void register_data(void) { starpu_multiformat_data_register(&array_of_structs_handle, STARPU_MAIN_RAM, &array_of_structs, N_ELEMENTS, &format_ops); } static int create_and_submit_task(unsigned int dev) { struct starpu_task *task = starpu_task_create(); switch (dev) { #ifdef STARPU_USE_CPU case STARPU_CPU: task->cl = &cpu_cl; break; #endif #ifdef STARPU_USE_CUDA case STARPU_CUDA: task->cl = &cuda_cl; break; #endif #ifdef STARPU_USE_OPENCL case STARPU_OPENCL: task->cl = &opencl_cl; break; #endif default: assert(0); } task->synchronous = 1; task->handles[0] = array_of_structs_handle; task->cl_arg = NULL; task->cl_arg_size = 0; return starpu_task_submit(task); } static void create_and_submit_tasks(void) { #ifdef STARPU_USE_CUDA if (ncuda > 0) { int err; err = create_and_submit_task(STARPU_CUDA); if (err != 0) { FPRINTF(stderr, "Cuda : %s\n", strerror(-err)); return; } } #endif #ifdef STARPU_USE_CPU if (ncpu > 0) { int err; err = create_and_submit_task(STARPU_CPU); if (err != 0) { FPRINTF(stderr, "CPU : %s\n", strerror(-err)); return; } } #endif #ifdef STARPU_USE_OPENCL if (nopencl > 0) { int err; err = create_and_submit_task(STARPU_OPENCL); if (err != 0) { FPRINTF(stderr, "OpenCL : %s\n", strerror(-err)); return; } } #endif /* !STARPU_USE_OPENCL */ } static void unregister_data(void) { starpu_data_unregister(array_of_structs_handle); } static void print_it(void) { int i; for (i = 0; i < N_ELEMENTS; i++) { FPRINTF(stderr, "(%.2f %.2f) ", array_of_structs[i].x, array_of_structs[i].y); } FPRINTF(stderr, "\n"); } static int check_it(void) { int i; for (i = 0; i < N_ELEMENTS; i++) { float expected_value = i + 1.0; #ifdef STARPU_USE_CUDA if (ncuda > 0) expected_value *= array_of_structs[i].y; #endif #ifdef STARPU_USE_OPENCL if (nopencl > 0) expected_value *= array_of_structs[i].y; #endif expected_value *= array_of_structs[i].y; if (array_of_structs[i].x != expected_value) return EXIT_FAILURE; } return EXIT_SUCCESS; } #ifdef STARPU_USE_OPENCL struct starpu_opencl_program opencl_program; struct starpu_opencl_program opencl_conversion_program; #endif static int gpus_available(void) { #ifdef STARPU_USE_CUDA if (ncuda > 0) return 1; #endif #ifdef STARPU_USE_OPENCL if (nopencl > 0) return 1; #endif return 0; } int main(void) { #ifdef STARPU_USE_CPU int ret; ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ncpu = starpu_cpu_worker_get_count(); #ifdef STARPU_USE_CUDA ncuda = starpu_cuda_worker_get_count(); #endif #ifdef STARPU_USE_OPENCL nopencl = starpu_opencl_worker_get_count(); #endif if (ncpu == 0 || !gpus_available()) { starpu_shutdown(); return 77; } #ifdef STARPU_USE_OPENCL ret = starpu_opencl_load_opencl_from_file("examples/basic_examples/multiformat_opencl_kernel.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); ret = starpu_opencl_load_opencl_from_file("examples/basic_examples/multiformat_conversion_codelets_opencl_kernel.cl", &opencl_conversion_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif init_problem_data(); print_it(); register_data(); create_and_submit_tasks(); unregister_data(); print_it(); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); starpu_opencl_unload_opencl(&opencl_conversion_program); #endif starpu_shutdown(); return check_it(); #else /* Without the CPU, there is no point in using the multiformat * interface, so this test is pointless. */ return 77; #endif } starpu-1.2.3+dfsg/examples/basic_examples/multiformat_conversion_codelets.c000066400000000000000000000043051320135501600274030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "multiformat_types.h" #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #ifdef STARPU_USE_CUDA void cuda_to_cpu(void *buffers[], void *arg) { struct struct_of_arrays *src = STARPU_MULTIFORMAT_GET_CUDA_PTR(buffers[0]); struct point *dst = STARPU_MULTIFORMAT_GET_CPU_PTR(buffers[0]); int n = STARPU_MULTIFORMAT_GET_NX(buffers[0]); int i; for (i = 0; i < n; i++) { dst[i].x = src->x[i]; dst[i].y = src->y[i]; } } extern void cpu_to_cuda_cuda_func(void *buffers[], void *args); struct starpu_codelet cpu_to_cuda_cl = { .cuda_funcs = {cpu_to_cuda_cuda_func}, .cuda_flags = {STARPU_CUDA_ASYNC}, .nbuffers = 1, .name = "codelet_cpu_to_cuda" }; struct starpu_codelet cuda_to_cpu_cl = { .cpu_funcs = {cuda_to_cpu}, .nbuffers = 1, .name = "codelet_cude_to_cpu" }; #endif #ifdef STARPU_USE_OPENCL void opencl_to_cpu(void *buffers[], void *arg) { FPRINTF(stderr, "User Entering %s\n", __starpu_func__); struct struct_of_arrays *src = STARPU_MULTIFORMAT_GET_OPENCL_PTR(buffers[0]); struct point *dst = STARPU_MULTIFORMAT_GET_CPU_PTR(buffers[0]); int n = STARPU_MULTIFORMAT_GET_NX(buffers[0]); int i; for (i = 0; i < n; i++) { dst[i].x = src->x[i]; dst[i].y = src->y[i]; } } extern void cpu_to_opencl_opencl_func(void *buffers[], void *args); struct starpu_codelet cpu_to_opencl_cl = { .opencl_funcs = {cpu_to_opencl_opencl_func}, .opencl_flags = {STARPU_OPENCL_ASYNC}, .nbuffers = 1 }; struct starpu_codelet opencl_to_cpu_cl = { .cpu_funcs = {opencl_to_cpu}, .nbuffers = 1 }; #endif starpu-1.2.3+dfsg/examples/basic_examples/multiformat_conversion_codelets_cuda.cu000066400000000000000000000026501320135501600305650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "multiformat_types.h" static __global__ void cpu_to_cuda_cuda(struct point *src, struct struct_of_arrays *dst, unsigned n) { unsigned i = blockIdx.x*blockDim.x + threadIdx.x; if (i < n) { dst->x[i] = src[i].x; dst->y[i] = src[i].y; } } extern "C" void cpu_to_cuda_cuda_func(void *buffers[], void *_args) { struct point *src; struct struct_of_arrays *dst; src = (struct point *) STARPU_MULTIFORMAT_GET_CPU_PTR(buffers[0]); dst = (struct struct_of_arrays *) STARPU_MULTIFORMAT_GET_CUDA_PTR(buffers[0]); int n = STARPU_MULTIFORMAT_GET_NX(buffers[0]); unsigned threads_per_block = 64; unsigned nblocks = (n + threads_per_block-1) / threads_per_block; cpu_to_cuda_cuda<<>>(src, dst, n); } starpu-1.2.3+dfsg/examples/basic_examples/multiformat_conversion_codelets_opencl.c000066400000000000000000000044521320135501600307460ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include extern struct starpu_opencl_program opencl_conversion_program; void cpu_to_opencl_opencl_func(void *buffers[], void *args) { (void) args; int id, devid; cl_int err; cl_kernel kernel; cl_command_queue queue; unsigned n = STARPU_MULTIFORMAT_GET_NX(buffers[0]); cl_mem src = (cl_mem) STARPU_MULTIFORMAT_GET_CPU_PTR(buffers[0]); cl_mem dst = (cl_mem) STARPU_MULTIFORMAT_GET_OPENCL_PTR(buffers[0]); id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_conversion_program, "cpu_to_opencl_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 0, sizeof(src), &src); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 1, sizeof(dst), &dst); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 2, sizeof(n), &n); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=n; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local = global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } starpu_opencl_release_kernel(kernel); } starpu-1.2.3+dfsg/examples/basic_examples/multiformat_conversion_codelets_opencl_kernel.cl000066400000000000000000000016171320135501600324620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "multiformat_types.h" __kernel void cpu_to_opencl_opencl(__global struct point *src, __global struct struct_of_arrays *dst, unsigned int n) { const unsigned int i = get_global_id(0); if (i < n) { dst->x[i] = src[i].x; dst->y[i] = src[i].y; } } starpu-1.2.3+dfsg/examples/basic_examples/multiformat_cuda.cu000066400000000000000000000030531320135501600244340ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "multiformat_types.h" #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) static __global__ void multiformat_cuda(struct struct_of_arrays *soa, unsigned n) { unsigned i = blockIdx.x*blockDim.x + threadIdx.x; if (i < n) soa->x[i] *= soa->y[i]; } extern "C" void multiformat_scal_cuda_func(void *buffers[], void *_args) { (void) _args; FPRINTF(stderr, "Running the cuda kernel (%s)\n", __starpu_func__); unsigned int n = STARPU_MULTIFORMAT_GET_NX(buffers[0]); struct struct_of_arrays *soa; soa = (struct struct_of_arrays *) STARPU_MULTIFORMAT_GET_CUDA_PTR(buffers[0]); unsigned threads_per_block = 64; unsigned nblocks = (n + threads_per_block-1) / threads_per_block; multiformat_cuda<<>>(soa, n); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.2.3+dfsg/examples/basic_examples/multiformat_opencl.c000066400000000000000000000043211320135501600246120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include extern struct starpu_opencl_program opencl_program; void multiformat_scal_opencl_func(void *buffers[], void *args) { (void) args; int id, devid; cl_int err; cl_kernel kernel; cl_command_queue queue; cl_event event; unsigned n = STARPU_MULTIFORMAT_GET_NX(buffers[0]); cl_mem val = (cl_mem)STARPU_MULTIFORMAT_GET_OPENCL_PTR(buffers[0]); id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_program, "multiformat_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 0, sizeof(val), &val); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 1, sizeof(n), &n); if (err) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=n; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local = global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } clFinish(queue); starpu_opencl_collect_stats(event); clReleaseEvent(event); starpu_opencl_release_kernel(kernel); } starpu-1.2.3+dfsg/examples/basic_examples/multiformat_opencl_kernel.cl000066400000000000000000000015051320135501600263270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "multiformat_types.h" __kernel void multiformat_opencl(__global struct struct_of_arrays *soa, int nx) { const int i = get_global_id(0); if (i < nx) soa->x[i] *= soa->y[i]; } starpu-1.2.3+dfsg/examples/basic_examples/multiformat_types.h000066400000000000000000000014731320135501600245100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef MULTIFORMAT_TYPES_H #define MULTIFORMAT_TYPES_H #define N_ELEMENTS 10 struct struct_of_arrays { float x[N_ELEMENTS]; float y[N_ELEMENTS]; }; struct point { float x, y; }; #endif starpu-1.2.3+dfsg/examples/basic_examples/variable.c000066400000000000000000000061521320135501600225000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2013, 2015-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #ifdef STARPU_QUICK_CHECK static unsigned niter = 500; #elif !defined(STARPU_LONG_CHECK) static unsigned niter = 5000; #else static unsigned niter = 50000; #endif extern void cpu_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); #ifdef STARPU_USE_CUDA extern void cuda_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); #endif #ifdef STARPU_USE_OPENCL extern void opencl_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); struct starpu_opencl_program opencl_program; #endif int main(int argc, char **argv) { unsigned i; float foo; starpu_data_handle_t float_array_handle; struct starpu_codelet cl; int ret; ret = starpu_init(NULL); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); if (argc == 2) niter = atoi(argv[1]); foo = 0.0f; starpu_variable_data_register(&float_array_handle, STARPU_MAIN_RAM /* home node */, (uintptr_t)&foo, sizeof(float)); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_load_opencl_from_file("examples/basic_examples/variable_kernels_opencl_kernel.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif starpu_codelet_init(&cl); cl.cpu_funcs[0] = cpu_codelet; cl.cpu_funcs_name[0] = "cpu_codelet"; #ifdef STARPU_USE_CUDA cl.cuda_funcs[0] = cuda_codelet; #endif #ifdef STARPU_USE_OPENCL cl.opencl_funcs[0] = opencl_codelet; #endif cl.nbuffers = 1; cl.modes[0] = STARPU_RW; cl.model = NULL; cl.name = "variable_inc"; for (i = 0; i < niter; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->callback_func = NULL; task->handles[0] = float_array_handle; ret = starpu_task_submit(task); if (STARPU_UNLIKELY(ret == -ENODEV)) { FPRINTF(stderr, "No worker may execute this task\n"); starpu_data_unregister(float_array_handle); goto enodev; } } starpu_task_wait_for_all(); /* update the array in RAM */ starpu_data_unregister(float_array_handle); FPRINTF(stderr, "variable -> %f\n", foo); FPRINTF(stderr, "result is %scorrect\n", foo==niter?"":"IN"); starpu_shutdown(); return (foo == niter) ? EXIT_SUCCESS:EXIT_FAILURE; enodev: return 77; } starpu-1.2.3+dfsg/examples/basic_examples/variable_kernels.cu000066400000000000000000000020341320135501600244030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include static __global__ void cuda_variable(float * tab) { *tab += 1.0f; return; } extern "C" void cuda_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { float *val = (float *)STARPU_VARIABLE_GET_PTR(descr[0]); cuda_variable<<<1,1, 0, starpu_cuda_get_local_stream()>>>(val); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.2.3+dfsg/examples/basic_examples/variable_kernels_cpu.c000066400000000000000000000015221320135501600250660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include void cpu_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { float *val = (float *)STARPU_VARIABLE_GET_PTR(descr[0]); *val += 1.0f; } starpu-1.2.3+dfsg/examples/basic_examples/variable_kernels_opencl.c000066400000000000000000000031001320135501600255510ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012, 2016 CNRS * Copyright (C) 2011 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include extern struct starpu_opencl_program opencl_program; void opencl_codelet(void *descr[], void *_args) { cl_mem val = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); cl_kernel kernel; cl_command_queue queue; cl_event event; int id, devid, err; id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_program, "variable", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 0, sizeof(val), &val); if (err) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=1; size_t local=1; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } clFinish(queue); starpu_opencl_collect_stats(event); clReleaseEvent(event); starpu_opencl_release_kernel(kernel); } starpu-1.2.3+dfsg/examples/basic_examples/variable_kernels_opencl_kernel.cl000066400000000000000000000013721320135501600272760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ __kernel void variable(__global float* input) { const int i = get_global_id(0); if (i == 0) input[i] = input[i] + 1.0f; } starpu-1.2.3+dfsg/examples/basic_examples/vector_scal.c000066400000000000000000000146161320135501600232230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012, 2013, 2015 CNRS * Copyright (C) 2010-2017 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This example demonstrates how to use StarPU to scale an array by a factor. * It shows how to manipulate data with StarPU's data management library. * 1- how to declare a piece of data to StarPU (starpu_vector_data_register) * 2- how to describe which data are accessed by a task (task->handles[0]) * 3- how a kernel can manipulate the data (buffers[0].vector.ptr) */ #include #include #include #include #define NX 204800 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) extern void scal_cpu_func(void *buffers[], void *_args); extern void scal_cpu_func_icc(void *buffers[], void *_args); extern void scal_sse_func(void *buffers[], void *_args); extern void scal_sse_func_icc(void *buffers[], void *_args); extern void scal_cuda_func(void *buffers[], void *_args); extern void scal_opencl_func(void *buffers[], void *_args); static struct starpu_perfmodel vector_scal_model = { .type = STARPU_HISTORY_BASED, .symbol = "vector_scal" }; static struct starpu_perfmodel vector_scal_energy_model = { .type = STARPU_HISTORY_BASED, .symbol = "vector_scal_energy" }; static struct starpu_codelet cl = { /* CPU implementation of the codelet */ .cpu_funcs = { scal_cpu_func #if defined(STARPU_HAVE_ICC) && !defined(__KNC__) && !defined(__KNF__) , scal_cpu_func_icc #endif #ifdef __SSE__ , scal_sse_func #if defined(STARPU_HAVE_ICC) && !defined(__KNC__) && !defined(__KNF__) , scal_sse_func_icc #endif #endif }, .cpu_funcs_name = { "scal_cpu_func", #if defined(STARPU_HAVE_ICC) && !defined(__KNC__) && !defined(__KNF__) "scal_cpu_func_icc", #endif #ifdef __SSE__ "scal_sse_func", #if defined(STARPU_HAVE_ICC) && !defined(__KNC__) && !defined(__KNF__) "scal_sse_func_icc" #endif #endif }, #ifdef STARPU_USE_CUDA /* CUDA implementation of the codelet */ .cuda_funcs = {scal_cuda_func}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL /* OpenCL implementation of the codelet */ .opencl_funcs = {scal_opencl_func}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .nbuffers = 1, .modes = {STARPU_RW}, .model = &vector_scal_model, .energy_model = &vector_scal_energy_model }; #ifdef STARPU_USE_OPENCL struct starpu_opencl_program opencl_program; #endif static int approximately_equal(float a, float b) { #ifdef STARPU_HAVE_NEARBYINTF int ai = (int) nearbyintf(a * 1000.0); int bi = (int) nearbyintf(b * 1000.0); #elif defined(STARPU_HAVE_RINTF) int ai = (int) rintf(a * 1000.0); int bi = (int) rintf(b * 1000.0); #else #error "Please define either nearbyintf or rintf." #endif return ai == bi; } int main(int argc, char **argv) { /* We consider a vector of float that is initialized just as any of C * data */ float vector[NX]; unsigned i; for (i = 0; i < NX; i++) vector[i] = (i+1.0f); /* Initialize StarPU with default configuration */ int ret = starpu_init(NULL); if (ret == -ENODEV) goto enodev; FPRINTF(stderr, "[BEFORE] 1-th element : %3.2f\n", vector[1]); FPRINTF(stderr, "[BEFORE] (NX-1)th element: %3.2f\n", vector[NX-1]); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_load_opencl_from_file("examples/basic_examples/vector_scal_opencl_kernel.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif /* Tell StaPU to associate the "vector" vector with the "vector_handle" * identifier. When a task needs to access a piece of data, it should * refer to the handle that is associated to it. * In the case of the "vector" data interface: * - the first argument of the registration method is a pointer to the * handle that should describe the data * - the second argument is the memory node where the data (ie. "vector") * resides initially: STARPU_MAIN_RAM stands for an address in main memory, as * opposed to an adress on a GPU for instance. * - the third argument is the adress of the vector in RAM * - the fourth argument is the number of elements in the vector * - the fifth argument is the size of each element. */ starpu_data_handle_t vector_handle; starpu_vector_data_register(&vector_handle, STARPU_MAIN_RAM, (uintptr_t)vector, NX, sizeof(vector[0])); float factor = 3.14; /* create a synchronous task: any call to starpu_task_submit will block * until it is terminated */ struct starpu_task *task = starpu_task_create(); task->synchronous = 1; task->cl = &cl; /* the codelet manipulates one buffer in RW mode */ task->handles[0] = vector_handle; /* an argument is passed to the codelet, beware that this is a * READ-ONLY buffer and that the codelet may be given a pointer to a * COPY of the argument */ task->cl_arg = &factor; task->cl_arg_size = sizeof(factor); task->name = "foo"; /* execute the task on any eligible computational ressource */ ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); /* StarPU does not need to manipulate the array anymore so we can stop * monitoring it */ starpu_data_unregister(vector_handle); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); #endif /* terminate StarPU, no task can be submitted after */ starpu_shutdown(); ret = approximately_equal(vector[1], (1+1.0f) * factor) && approximately_equal(vector[NX-1], (NX-1+1.0f) * factor); FPRINTF(stderr, "[AFTER] 1-th element : %3.2f (should be %3.2f)\n", vector[1], (1+1.0f) * factor); FPRINTF(stderr, "[AFTER] (NX-1)-th element: %3.2f (should be %3.2f)\n", vector[NX-1], (NX-1+1.0f) * factor); FPRINTF(stderr, "[AFTER] Computation is%s correct\n", ret?"":" NOT"); return (ret ? EXIT_SUCCESS : EXIT_FAILURE); enodev: return 77; } starpu-1.2.3+dfsg/examples/basic_examples/vector_scal_c.c000066400000000000000000000074561320135501600235310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012, 2013 CNRS * Copyright (C) 2011, 2013-2014 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This example demonstrates how to use StarPU to scale an array by a factor. * It shows how to manipulate data with StarPU's data management library. * 1- how to declare a piece of data to StarPU (starpu_vector_data_register) * 2- how to describe which data are accessed by a task (task->handles[0]) * 3- how a kernel can manipulate the data (buffers[0].vector.ptr) * * This is a variant of vector_scal.c which shows it can be integrated with fortran. */ #include #include extern void scal_cpu_func(void *buffers[], void *_args); extern void scal_cuda_func(void *buffers[], void *_args); static struct starpu_perfmodel vector_scal_model = { .type = STARPU_HISTORY_BASED, .symbol = "vector_scal_model" }; static struct starpu_codelet cl = { .modes = { STARPU_RW }, /* CPU implementation of the codelet */ .cpu_funcs = {scal_cpu_func}, .cpu_funcs_name = {"scal_cpu_func"}, #ifdef STARPU_USE_CUDA /* CUDA implementation of the codelet */ .cuda_funcs = {scal_cuda_func}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif .nbuffers = 1, .model = &vector_scal_model }; int compute_(int *F_NX, float *vector) { int NX = *F_NX; int ret; /* Initialize StarPU with default configuration */ ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* Tell StaPU to associate the "vector" vector with the "vector_handle" * identifier. When a task needs to access a piece of data, it should * refer to the handle that is associated to it. * In the case of the "vector" data interface: * - the first argument of the registration method is a pointer to the * handle that should describe the data * - the second argument is the memory node where the data (ie. "vector") * resides initially: STARPU_MAIN_RAM stands for an address in main memory, as * opposed to an adress on a GPU for instance. * - the third argument is the adress of the vector in RAM * - the fourth argument is the number of elements in the vector * - the fifth argument is the size of each element. */ starpu_data_handle_t vector_handle; starpu_vector_data_register(&vector_handle, STARPU_MAIN_RAM, (uintptr_t)vector, NX, sizeof(vector[0])); float factor = 3.14; /* create a synchronous task: any call to starpu_task_submit will block * until it is terminated */ struct starpu_task *task = starpu_task_create(); task->synchronous = 1; task->cl = &cl; /* the codelet manipulates one buffer in RW mode */ task->handles[0] = vector_handle; /* an argument is passed to the codelet, beware that this is a * READ-ONLY buffer and that the codelet may be given a pointer to a * COPY of the argument */ task->cl_arg = &factor; task->cl_arg_size = sizeof(factor); /* execute the task on any eligible computational ressource */ ret = starpu_task_submit(task); if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); /* StarPU does not need to manipulate the array anymore so we can stop * monitoring it */ starpu_data_unregister(vector_handle); /* terminate StarPU, no task can be submitted after */ starpu_shutdown(); return ret; } starpu-1.2.3+dfsg/examples/basic_examples/vector_scal_cpu.c000066400000000000000000000015121320135501600240610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This example complements vector_scal.c: here we implement a CPU version. */ #include "vector_scal_cpu_template.h" VECTOR_SCAL_CPU_FUNC(scal_cpu_func) VECTOR_SCAL_SSE_FUNC(scal_sse_func) starpu-1.2.3+dfsg/examples/basic_examples/vector_scal_cpu_icc.icc000066400000000000000000000015621320135501600252200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This example complements vector_scal.c: here we implement a CPU version, * meant to be compiled by icc. */ #include "vector_scal_cpu_template.h" VECTOR_SCAL_CPU_FUNC(scal_cpu_func_icc) VECTOR_SCAL_SSE_FUNC(scal_sse_func_icc) starpu-1.2.3+dfsg/examples/basic_examples/vector_scal_cpu_template.h000066400000000000000000000121501320135501600257610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This example complements vector_scal.c: here we implement a CPU version. */ #ifndef __VECTOR_SCAL_CPU_TEMPLATE_H__ #define __VECTOR_SCAL_CPU_TEMPLATE_H__ #include #ifdef __SSE__ #include #endif /* This kernel takes a buffer and scales it by a constant factor */ #define VECTOR_SCAL_CPU_FUNC(func_name) \ void func_name(void *buffers[], void *cl_arg) \ { \ unsigned i; \ float *factor = (float *) cl_arg; \ \ /* \ * The "buffers" array matches the task->handles array: for instance \ * task->handles[0] is a handle that corresponds to a data with \ * vector "interface", so that the first entry of the array in the \ * codelet is a pointer to a structure describing such a vector (ie. \ * struct starpu_vector_interface *). Here, we therefore manipulate \ * the buffers[0] element as a vector: nx gives the number of elements \ * in the array, ptr gives the location of the array (that was possibly \ * migrated/replicated), and elemsize gives the size of each elements. \ */ \ \ struct starpu_vector_interface *vector = (struct starpu_vector_interface *) buffers[0]; \ \ /* length of the vector */ \ unsigned n = STARPU_VECTOR_GET_NX(vector); \ \ /* get a pointer to the local copy of the vector : note that we have to \ * cast it in (float *) since a vector could contain any type of \ * elements so that the .ptr field is actually a uintptr_t */ \ float *val = (float *)STARPU_VECTOR_GET_PTR(vector); \ \ /* scale the vector */ \ for (i = 0; i < n; i++) \ val[i] *= *factor; \ } #ifdef __SSE__ #define VECTOR_SCAL_SSE_FUNC(func_name) \ void func_name(void *buffers[], void *cl_arg) \ { \ float *vector = (float *) STARPU_VECTOR_GET_PTR(buffers[0]); \ unsigned int n = STARPU_VECTOR_GET_NX(buffers[0]); \ unsigned int n_iterations = n/4; \ \ __m128 *VECTOR = (__m128*) vector; \ __m128 FACTOR STARPU_ATTRIBUTE_ALIGNED(16); \ float factor = *(float *) cl_arg; \ FACTOR = _mm_set1_ps(factor); \ \ unsigned int i; \ for (i = 0; i < n_iterations; i++) \ VECTOR[i] = _mm_mul_ps(FACTOR, VECTOR[i]); \ \ unsigned int remainder = n%4; \ if (remainder != 0) \ { \ unsigned int start = 4 * n_iterations; \ for (i = start; i < start+remainder; ++i) \ { \ vector[i] = factor * vector[i]; \ } \ } \ } #else /* !__SSE__ */ #define VECTOR_SCAL_SSE_FUNC(func_name) #endif /* !__SSE__ */ #endif /* !__VECTOR_SCAL_CPU_TEMPLATE_H__ */ starpu-1.2.3+dfsg/examples/basic_examples/vector_scal_cuda.cu000066400000000000000000000030241320135501600243730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012, 2013 CNRS * Copyright (C) 2010, 2014 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This example complements vector_scal.c: here we implement a CUDA version. */ #include static __global__ void vector_mult_cuda(unsigned n, float *val, float factor) { unsigned i = blockIdx.x*blockDim.x + threadIdx.x; if (i < n) val[i] *= factor; } extern "C" void scal_cuda_func(void *buffers[], void *_args) { float *factor = (float *)_args; /* length of the vector */ unsigned n = STARPU_VECTOR_GET_NX(buffers[0]); /* local copy of the vector pointer */ float *val = (float *)STARPU_VECTOR_GET_PTR(buffers[0]); unsigned threads_per_block = 64; unsigned nblocks = (n + threads_per_block-1) / threads_per_block; vector_mult_cuda<<>>(n, val, *factor); } starpu-1.2.3+dfsg/examples/basic_examples/vector_scal_fortran.F000066400000000000000000000021371320135501600247140ustar00rootroot00000000000000C C StarPU --- Runtime system for heterogeneous multicore architectures. C C Copyright (C) 2010 CNRS C Copyright (C) 2010 INRIA C C StarPU is free software; you can redistribute it and/or modify C it under the terms of the GNU Lesser General Public License as published by C the Free Software Foundation; either version 2.1 of the License, or (at C your option) any later version. C C StarPU is distributed in the hope that it will be useful, but C WITHOUT ANY WARRANTY; without even the implied warranty of C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. C C See the GNU Lesser General Public License in COPYING.LGPL for more details. C PROGRAM VECTOR_SCAL INTEGER,PARAMETER :: F_NX=2048 REAL,DIMENSION(F_NX) :: VECTOR INTEGER :: I DO I=1,F_NX,1 VECTOR(I)=1.0 ENDDO WRITE (*,*) ' BEFORE : First element was ', VECTOR(1) WRITE (*,*) ' BEFORE : Last element was ', VECTOR(F_NX) CALL COMPUTE(F_NX, VECTOR) WRITE (*,*) ' AFTER : First element is ', VECTOR(1) WRITE (*,*) ' AFTER : Last element is ', VECTOR(F_NX) END PROGRAM starpu-1.2.3+dfsg/examples/basic_examples/vector_scal_opencl.c000066400000000000000000000043361320135501600245610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012, 2013, 2016 CNRS * Copyright (C) 2010 INRIA * Copyright (C) 2011, 2014 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This example complements vector_scal.c: here we implement a OpenCL version. */ #include extern struct starpu_opencl_program opencl_program; void scal_opencl_func(void *buffers[], void *_args) { float *factor = _args; int id, devid; cl_int err; cl_kernel kernel; cl_command_queue queue; /* length of the vector */ unsigned int n = STARPU_VECTOR_GET_NX(buffers[0]); /* OpenCL copy of the vector pointer */ cl_mem val = (cl_mem)STARPU_VECTOR_GET_DEV_HANDLE(buffers[0]); id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_program, "vector_mult_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 0, sizeof(n), &n); err |= clSetKernelArg(kernel, 1, sizeof(val), &val); err |= clSetKernelArg(kernel, 2, sizeof(*factor), factor); if (err) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=n; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local=global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } starpu_opencl_release_kernel(kernel); } starpu-1.2.3+dfsg/examples/basic_examples/vector_scal_opencl_kernel.cl000066400000000000000000000015121320135501600262660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ __kernel void vector_mult_opencl(unsigned int nx, __global float* val, float factor) { const int i = get_global_id(0); if (i < nx) { val[i] *= factor; } } starpu-1.2.3+dfsg/examples/binary/000077500000000000000000000000001320135501600170505ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/binary/binary.c000066400000000000000000000113231320135501600205000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011, 2013-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This shows how to load OpenCL programs, either from a .cl file, or from a * string containing the program itself. */ #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #ifdef STARPU_USE_OPENCL extern void opencl_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); struct starpu_opencl_program opencl_program; #endif struct starpu_codelet cl = { #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_codelet}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .nbuffers = 1, .modes = {STARPU_RW} }; int compute(char *file_name, int load_as_file, int with_malloc) { float float_array[4] STARPU_ATTRIBUTE_ALIGNED(16) = { 0.0f, 0.0f, 0.0f, 0.0f}; starpu_data_handle_t float_array_handle; unsigned i; int ret = 0; #ifdef STARPU_QUICK_CHECK unsigned niter = 50; #else unsigned niter = 500; #endif starpu_vector_data_register(&float_array_handle, STARPU_MAIN_RAM, (uintptr_t)&float_array, 4, sizeof(float)); #ifdef STARPU_USE_OPENCL if (load_as_file) { ret = starpu_opencl_compile_opencl_from_file(file_name, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_compile_opencl_from_file"); ret = starpu_opencl_load_binary_opencl(file_name, &opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_binary_opencl"); } else if (with_malloc) { char *located_file_name; char *located_dir_name; char *opencl_program_source; starpu_opencl_load_program_source_malloc(file_name, &located_file_name, &located_dir_name, &opencl_program_source); ret = starpu_opencl_compile_opencl_from_string(opencl_program_source, "incrementer", NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_compile_opencl_from_file"); ret = starpu_opencl_load_binary_opencl("incrementer", &opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_binary_opencl"); free(located_file_name); free(located_dir_name); free(opencl_program_source); } else { char located_file_name[1024]; char located_dir_name[1024]; char opencl_program_source[16384]; starpu_opencl_load_program_source(file_name, located_file_name, located_dir_name, opencl_program_source); ret = starpu_opencl_compile_opencl_from_string(opencl_program_source, "incrementer", NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_compile_opencl_from_file"); ret = starpu_opencl_load_binary_opencl("incrementer", &opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_binary_opencl"); } #endif for (i = 0; i < niter; i++) { ret = starpu_task_insert(&cl, STARPU_RW, float_array_handle, STARPU_TAG_ONLY, (starpu_tag_t) i, 0); if (STARPU_UNLIKELY(ret == -ENODEV)) { FPRINTF(stderr, "No worker may execute this task\n"); exit(0); } } starpu_task_wait_for_all(); /* update the array in RAM */ starpu_data_unregister(float_array_handle); #ifdef STARPU_USE_OPENCL starpu_opencl_unload_opencl(&opencl_program); #endif FPRINTF(stderr, "array -> %f, %f, %f, %f\n", float_array[0], float_array[1], float_array[2], float_array[3]); if (float_array[0] != niter || float_array[0] != float_array[1] + float_array[2] + float_array[3]) { FPRINTF(stderr, "Incorrect result\n"); ret = 1; } return ret; } int main(int argc, char **argv) { int ret = 0; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncpus = 0; conf.ncuda = 0; conf.nmic = 0; conf.nscc = 0; ret = starpu_init(&conf); if (STARPU_UNLIKELY(ret == -ENODEV)) { FPRINTF(stderr, "This application requires an OpenCL worker.\n"); return 77; } STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = compute("examples/incrementer/incrementer_kernels_opencl_kernel.cl", 1, -1); if (ret == 0) ret = compute("examples/incrementer/incrementer_kernels_opencl_kernel.cl", 0, 0); else FPRINTF(stderr, "Error when calling compute %d\n", ret); if (ret == 0) ret = compute("examples/incrementer/incrementer_kernels_opencl_kernel.cl", 0, 1); else FPRINTF(stderr, "Error when calling compute %d\n", ret); starpu_shutdown(); return ret; } starpu-1.2.3+dfsg/examples/callback/000077500000000000000000000000001320135501600173205ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/callback/callback.c000066400000000000000000000043551320135501600212270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2013, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This is an example of using a callback. We submit a task, whose callback * submits another task (without any callback). */ #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) starpu_data_handle_t handle; void cpu_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { int *val = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); *val += 1; } struct starpu_codelet cl = { .modes = { STARPU_RW }, .cpu_funcs = {cpu_codelet}, .cpu_funcs_name = {"cpu_codelet"}, .nbuffers = 1, .name = "callback" }; void callback_func(void *callback_arg) { int ret; struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->handles[0] = handle; ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } int main(int argc, char **argv) { int v=40; int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)&v, sizeof(int)); struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->callback_func = callback_func; task->callback_arg = NULL; task->handles[0] = handle; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_task_wait_for_all(); starpu_data_unregister(handle); FPRINTF(stderr, "v -> %d\n", v); starpu_shutdown(); return (v == 42) ? 0 : 1; enodev: starpu_shutdown(); return 77; } starpu-1.2.3+dfsg/examples/callback/prologue.c000066400000000000000000000057111320135501600213240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2013-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This is an example of using a prologue callback. We submit a task, whose * prologue callback (i.e. before task gets scheduled) prints a value, and * whose pop_prologue callback (i.e. after task gets scheduled, but before task * execution) prints another value. */ #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) starpu_data_handle_t handle; void cpu_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { int *val = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); *val += 1; printf("task executing \n"); } struct starpu_codelet cl = { .modes = { STARPU_RW }, .cpu_funcs = {cpu_codelet}, .cpu_funcs_name = {"cpu_codelet"}, .nbuffers = 1, .name = "callback" }; void prologue_callback_func(void *callback_arg) { double *x = (double*)callback_arg; printf("x = %lf\n", *x); STARPU_ASSERT(*x == -999.0); } void pop_prologue_callback_func(void *args) { unsigned val = (uintptr_t) args; printf("pop_prologue_callback val %u \n", val); STARPU_ASSERT(val == 5); } int main(int argc, char **argv) { int v=40; int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)&v, sizeof(int)); double x = -999.0; struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->prologue_callback_func = prologue_callback_func; task->prologue_callback_arg = &x; task->prologue_callback_pop_func = pop_prologue_callback_func; task->prologue_callback_pop_arg = (void*) 5; task->handles[0] = handle; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_insert(&cl, STARPU_RW, handle, STARPU_PROLOGUE_CALLBACK, prologue_callback_func, STARPU_PROLOGUE_CALLBACK_ARG, &x, STARPU_PROLOGUE_CALLBACK_POP, pop_prologue_callback_func, STARPU_PROLOGUE_CALLBACK_POP_ARG, 5, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); starpu_task_wait_for_all(); enodev: starpu_data_unregister(handle); FPRINTF(stderr, "v -> %d\n", v); starpu_shutdown(); return (ret == -ENODEV) ? 77 : 0; } starpu-1.2.3+dfsg/examples/cg/000077500000000000000000000000001320135501600161555ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/cg/cg.c000066400000000000000000000251151320135501600167160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012, 2014-2017 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #ifdef STARPU_USE_CUDA #include #endif #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) /* * Conjugate Gradient * * Input: * - matrix A * - vector b * - vector x (starting value) * - int i_max, error tolerance eps < 1. * Ouput: * - vector x * * Pseudo code: * * i <- 0 * r <- b - Ax * d <- r * delta_new <- dot(r,r) * delta_0 <- delta_new * * while (i < i_max && delta_new > eps^2 delta_0) * { * q <- Ad * alpha <- delta_new/dot(d, q) * x <- x + alpha d * * If (i is divisible by 50) * r <- b - Ax * else * r <- r - alpha q * * delta_old <- delta_new * delta_new <- dot(r,r) * beta <- delta_new/delta_old * d <- r + beta d * i <- i + 1 * } * * The dot() operations makes use of reduction to optimize parallelism. * */ #include "cg.h" static int long long n = 4096; static int nblocks = 8; static int use_reduction = 1; static starpu_data_handle_t A_handle, b_handle, x_handle; static TYPE *A, *b, *x; #ifdef STARPU_QUICK_CHECK static int i_max = 10; #elif !defined(STARPU_LONG_CHECK) static int i_max = 100; #else static int i_max = 1000; #endif static double eps = (10e-14); static starpu_data_handle_t r_handle, d_handle, q_handle; static TYPE *r, *d, *q; static starpu_data_handle_t dtq_handle, rtr_handle; static TYPE dtq, rtr; extern struct starpu_codelet accumulate_variable_cl; extern struct starpu_codelet accumulate_vector_cl; extern struct starpu_codelet bzero_variable_cl; extern struct starpu_codelet bzero_vector_cl; /* * Generate Input data */ static void generate_random_problem(void) { int i, j; starpu_malloc((void **)&A, n*n*sizeof(TYPE)); starpu_malloc((void **)&b, n*sizeof(TYPE)); starpu_malloc((void **)&x, n*sizeof(TYPE)); assert(A && b && x); for (j = 0; j < n; j++) { b[j] = (TYPE)1.0; x[j] = (TYPE)0.0; /* We take Hilbert matrix that is not well conditionned but definite positive: H(i,j) = 1/(1+i+j) */ for (i = 0; i < n; i++) { A[n*j + i] = (TYPE)(1.0/(1.0+i+j)); } } /* Internal vectors */ starpu_malloc((void **)&r, n*sizeof(TYPE)); starpu_malloc((void **)&d, n*sizeof(TYPE)); starpu_malloc((void **)&q, n*sizeof(TYPE)); assert(r && d && q); memset(r, 0, n*sizeof(TYPE)); memset(d, 0, n*sizeof(TYPE)); memset(q, 0, n*sizeof(TYPE)); } static void free_data(void) { starpu_free(A); starpu_free(b); starpu_free(x); starpu_free(r); starpu_free(d); starpu_free(q); } static void register_data(void) { starpu_matrix_data_register(&A_handle, STARPU_MAIN_RAM, (uintptr_t)A, n, n, n, sizeof(TYPE)); starpu_vector_data_register(&b_handle, STARPU_MAIN_RAM, (uintptr_t)b, n, sizeof(TYPE)); starpu_vector_data_register(&x_handle, STARPU_MAIN_RAM, (uintptr_t)x, n, sizeof(TYPE)); starpu_vector_data_register(&r_handle, STARPU_MAIN_RAM, (uintptr_t)r, n, sizeof(TYPE)); starpu_vector_data_register(&d_handle, STARPU_MAIN_RAM, (uintptr_t)d, n, sizeof(TYPE)); starpu_vector_data_register(&q_handle, STARPU_MAIN_RAM, (uintptr_t)q, n, sizeof(TYPE)); starpu_variable_data_register(&dtq_handle, STARPU_MAIN_RAM, (uintptr_t)&dtq, sizeof(TYPE)); starpu_variable_data_register(&rtr_handle, STARPU_MAIN_RAM, (uintptr_t)&rtr, sizeof(TYPE)); if (use_reduction) { starpu_data_set_reduction_methods(q_handle, &accumulate_vector_cl, &bzero_vector_cl); starpu_data_set_reduction_methods(r_handle, &accumulate_vector_cl, &bzero_vector_cl); starpu_data_set_reduction_methods(dtq_handle, &accumulate_variable_cl, &bzero_variable_cl); starpu_data_set_reduction_methods(rtr_handle, &accumulate_variable_cl, &bzero_variable_cl); } } static void unregister_data(void) { starpu_data_unpartition(A_handle, STARPU_MAIN_RAM); starpu_data_unpartition(b_handle, STARPU_MAIN_RAM); starpu_data_unpartition(x_handle, STARPU_MAIN_RAM); starpu_data_unpartition(r_handle, STARPU_MAIN_RAM); starpu_data_unpartition(d_handle, STARPU_MAIN_RAM); starpu_data_unpartition(q_handle, STARPU_MAIN_RAM); starpu_data_unregister(A_handle); starpu_data_unregister(b_handle); starpu_data_unregister(x_handle); starpu_data_unregister(r_handle); starpu_data_unregister(d_handle); starpu_data_unregister(q_handle); starpu_data_unregister(dtq_handle); starpu_data_unregister(rtr_handle); } /* * Data partitioning filters */ struct starpu_data_filter vector_filter; struct starpu_data_filter matrix_filter_1; struct starpu_data_filter matrix_filter_2; static void partition_data(void) { assert(n % nblocks == 0); /* * Partition the A matrix */ /* Partition into contiguous parts */ matrix_filter_1.filter_func = starpu_matrix_filter_block; matrix_filter_1.nchildren = nblocks; /* Partition into non-contiguous parts */ matrix_filter_2.filter_func = starpu_matrix_filter_vertical_block; matrix_filter_2.nchildren = nblocks; /* A is in FORTRAN ordering, starpu_data_get_sub_data(A_handle, 2, i, * j) designates the block in column i and row j. */ starpu_data_map_filters(A_handle, 2, &matrix_filter_1, &matrix_filter_2); /* * Partition the vectors */ vector_filter.filter_func = starpu_vector_filter_block; vector_filter.nchildren = nblocks; starpu_data_partition(b_handle, &vector_filter); starpu_data_partition(x_handle, &vector_filter); starpu_data_partition(r_handle, &vector_filter); starpu_data_partition(d_handle, &vector_filter); starpu_data_partition(q_handle, &vector_filter); } /* * Debug */ #if 0 static void display_vector(starpu_data_handle_t handle, TYPE *ptr) { unsigned block_size = n / nblocks; unsigned b, ind; for (b = 0; b < nblocks; b++) { starpu_data_acquire(starpu_data_get_sub_data(handle, 1, b), STARPU_R); for (ind = 0; ind < block_size; ind++) { FPRINTF(stderr, "%2.2e ", ptr[b*block_size + ind]); } FPRINTF(stderr, "| "); starpu_data_release(starpu_data_get_sub_data(handle, 1, b)); } FPRINTF(stderr, "\n"); } static void display_matrix(void) { unsigned i, j; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { FPRINTF(stderr, "%2.2e ", A[j*n + i]); } FPRINTF(stderr, "\n"); } } #endif /* * Main loop */ static int cg(void) { double delta_new, delta_0; int i = 0; int ret; /* r <- b */ ret = copy_handle(r_handle, b_handle, nblocks); if (ret == -ENODEV) return ret; /* r <- r - A x */ ret = gemv_kernel(r_handle, A_handle, x_handle, 1.0, -1.0, nblocks, use_reduction); if (ret == -ENODEV) return ret; /* d <- r */ ret = copy_handle(d_handle, r_handle, nblocks); if (ret == -ENODEV) return ret; /* delta_new = dot(r,r) */ ret = dot_kernel(r_handle, r_handle, rtr_handle, nblocks, use_reduction); if (ret == -ENODEV) return ret; starpu_data_acquire(rtr_handle, STARPU_R); delta_new = rtr; delta_0 = delta_new; starpu_data_release(rtr_handle); FPRINTF(stderr, "*************** INITIAL ************ \n"); FPRINTF(stderr, "Delta 0: %e\n", delta_new); double start; double end; start = starpu_timing_now(); while ((i < i_max) && ((double)delta_new > (double)(eps*eps*delta_0))) { double delta_old; double alpha, beta; starpu_iteration_push(i); /* q <- A d */ gemv_kernel(q_handle, A_handle, d_handle, 0.0, 1.0, nblocks, use_reduction); /* dtq <- dot(d,q) */ dot_kernel(d_handle, q_handle, dtq_handle, nblocks, use_reduction); /* alpha = delta_new / dtq */ starpu_data_acquire(dtq_handle, STARPU_R); alpha = delta_new/dtq; starpu_data_release(dtq_handle); /* x <- x + alpha d */ axpy_kernel(x_handle, d_handle, alpha, nblocks); if ((i % 50) == 0) { /* r <- b */ copy_handle(r_handle, b_handle, nblocks); /* r <- r - A x */ gemv_kernel(r_handle, A_handle, x_handle, 1.0, -1.0, nblocks, use_reduction); } else { /* r <- r - alpha q */ axpy_kernel(r_handle, q_handle, -alpha, nblocks); } /* delta_new = dot(r,r) */ dot_kernel(r_handle, r_handle, rtr_handle, nblocks, use_reduction); starpu_data_acquire(rtr_handle, STARPU_R); delta_old = delta_new; delta_new = rtr; beta = delta_new / delta_old; starpu_data_release(rtr_handle); /* d <- beta d + r */ scal_axpy_kernel(d_handle, beta, r_handle, 1.0, nblocks); if ((i % 10) == 0) { /* We here take the error as ||r||_2 / (n||b||_2) */ double error = sqrt(delta_new/delta_0)/(1.0*n); FPRINTF(stderr, "*****************************************\n"); FPRINTF(stderr, "iter %d DELTA %e - %e\n", i, delta_new, error); } starpu_iteration_pop(); i++; } end = starpu_timing_now(); double timing = end - start; FPRINTF(stderr, "Total timing : %2.2f seconds\n", timing/10e6); FPRINTF(stderr, "Seconds per iteration : %2.2e\n", timing/10e6/i); return 0; } static int check(void) { return 0; } static void parse_args(int argc, char **argv) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-n") == 0) { n = (int long long)atoi(argv[++i]); continue; } if (strcmp(argv[i], "-maxiter") == 0) { i_max = atoi(argv[++i]); continue; } if (strcmp(argv[i], "-nblocks") == 0) { nblocks = atoi(argv[++i]); continue; } if (strcmp(argv[i], "-no-reduction") == 0) { use_reduction = 0; continue; } if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "-help") == 0) { FPRINTF(stderr, "usage: %s [-h] [-nblocks #blocks] [-n problem_size] [-no-reduction] [-maxiter i]\n", argv[0]); exit(-1); } } } int main(int argc, char **argv) { int ret; /* Not supported yet */ if (starpu_get_env_number_default("STARPU_GLOBAL_ARBITER", 0) > 0) return 77; #ifdef STARPU_QUICK_CHECK i_max = 16; #endif parse_args(argc, argv); ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_cublas_init(); generate_random_problem(); register_data(); partition_data(); ret = cg(); if (ret == -ENODEV) { ret = 77; goto enodev; } ret = check(); starpu_task_wait_for_all(); enodev: unregister_data(); free_data(); starpu_cublas_shutdown(); starpu_shutdown(); return ret; } starpu-1.2.3+dfsg/examples/cg/cg.h000066400000000000000000000042511320135501600167210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_EXAMPLE_CG_H__ #define __STARPU_EXAMPLE_CG_H__ #include #include #include #ifdef STARPU_USE_CUDA #include #include #endif #define DOUBLE #ifdef DOUBLE #define TYPE double #define GEMV STARPU_DGEMV #define DOT STARPU_DDOT #define GEMV STARPU_DGEMV #define AXPY STARPU_DAXPY #define SCAL STARPU_DSCAL #define cublasdot cublasDdot #define cublasscal cublasDscal #define cublasaxpy cublasDaxpy #define cublasgemv cublasDgemv #define cublasscal cublasDscal #else #define TYPE float #define GEMV STARPU_SGEMV #define DOT STARPU_SDOT #define GEMV STARPU_SGEMV #define AXPY STARPU_SAXPY #define SCAL STARPU_SSCAL #define cublasdot cublasSdot #define cublasscal cublasSscal #define cublasaxpy cublasSaxpy #define cublasgemv cublasSgemv #define cublasscal cublasSscal #endif int dot_kernel(starpu_data_handle_t v1, starpu_data_handle_t v2, starpu_data_handle_t s, unsigned nblocks, int use_reduction); int gemv_kernel(starpu_data_handle_t v1, starpu_data_handle_t matrix, starpu_data_handle_t v2, TYPE p1, TYPE p2, unsigned nblocks, int use_reduction); int axpy_kernel(starpu_data_handle_t v1, starpu_data_handle_t v2, TYPE p1, unsigned nblocks); int scal_axpy_kernel(starpu_data_handle_t v1, TYPE p1, starpu_data_handle_t v2, TYPE p2, unsigned nblocks); int copy_handle(starpu_data_handle_t dst, starpu_data_handle_t src, unsigned nblocks); #endif /* __STARPU_EXAMPLE_CG_H__ */ starpu-1.2.3+dfsg/examples/cg/cg_kernels.c000066400000000000000000000413771320135501600204510ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * Standard BLAS kernels used by CG */ #include "cg.h" #include #include #ifdef STARPU_USE_CUDA #include static const TYPE p1 = 1.0; static const TYPE m1 = -1.0; #endif #if 0 static void print_vector_from_descr(unsigned nx, TYPE *v) { unsigned i; for (i = 0; i < nx; i++) { fprintf(stderr, "%2.2e ", v[i]); } fprintf(stderr, "\n"); } static void print_matrix_from_descr(unsigned nx, unsigned ny, unsigned ld, TYPE *mat) { unsigned i, j; for (j = 0; j < nx; j++) { for (i = 0; i < ny; i++) { fprintf(stderr, "%2.2e ", mat[j+i*ld]); } fprintf(stderr, "\n"); } } #endif static int can_execute(unsigned workerid, struct starpu_task *task, unsigned nimpl) { enum starpu_worker_archtype type = starpu_worker_get_type(workerid); if (type == STARPU_CPU_WORKER || type == STARPU_OPENCL_WORKER || type == STARPU_MIC_WORKER || type == STARPU_SCC_WORKER) return 1; #ifdef STARPU_USE_CUDA #ifdef STARPU_SIMGRID /* We don't know, let's assume it can */ return 1; #else /* Cuda device */ const struct cudaDeviceProp *props; props = starpu_cuda_get_device_properties(workerid); if (props->major >= 2 || props->minor >= 3) /* At least compute capability 1.3, supports doubles */ return 1; #endif #endif /* Old card, does not support doubles */ return 0; } /* * Reduction accumulation methods */ #ifdef STARPU_USE_CUDA static void accumulate_variable_cuda(void *descr[], void *cl_arg) { TYPE *v_dst = (TYPE *)STARPU_VARIABLE_GET_PTR(descr[0]); TYPE *v_src = (TYPE *)STARPU_VARIABLE_GET_PTR(descr[1]); cublasStatus_t status = cublasaxpy(starpu_cublas_get_local_handle(), 1, &p1, v_src, 1, v_dst, 1); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); } #endif void accumulate_variable_cpu(void *descr[], void *cl_arg) { TYPE *v_dst = (TYPE *)STARPU_VARIABLE_GET_PTR(descr[0]); TYPE *v_src = (TYPE *)STARPU_VARIABLE_GET_PTR(descr[1]); *v_dst = *v_dst + *v_src; } static struct starpu_perfmodel accumulate_variable_model = { .type = STARPU_HISTORY_BASED, .symbol = "accumulate_variable" }; struct starpu_codelet accumulate_variable_cl = { .can_execute = can_execute, .cpu_funcs = {accumulate_variable_cpu}, .cpu_funcs_name = {"accumulate_variable_cpu"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {accumulate_variable_cuda}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif .modes = {STARPU_RW, STARPU_R}, .nbuffers = 2, .model = &accumulate_variable_model }; #ifdef STARPU_USE_CUDA static void accumulate_vector_cuda(void *descr[], void *cl_arg) { TYPE *v_dst = (TYPE *)STARPU_VECTOR_GET_PTR(descr[0]); TYPE *v_src = (TYPE *)STARPU_VECTOR_GET_PTR(descr[1]); unsigned n = STARPU_VECTOR_GET_NX(descr[0]); cublasStatus_t status = cublasaxpy(starpu_cublas_get_local_handle(), n, &p1, v_src, 1, v_dst, 1); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); } #endif void accumulate_vector_cpu(void *descr[], void *cl_arg) { TYPE *v_dst = (TYPE *)STARPU_VECTOR_GET_PTR(descr[0]); TYPE *v_src = (TYPE *)STARPU_VECTOR_GET_PTR(descr[1]); unsigned n = STARPU_VECTOR_GET_NX(descr[0]); AXPY(n, (TYPE)1.0, v_src, 1, v_dst, 1); } static struct starpu_perfmodel accumulate_vector_model = { .type = STARPU_HISTORY_BASED, .symbol = "accumulate_vector" }; struct starpu_codelet accumulate_vector_cl = { .can_execute = can_execute, .cpu_funcs = {accumulate_vector_cpu}, .cpu_funcs_name = {"accumulate_vector_cpu"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {accumulate_vector_cuda}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif .modes = {STARPU_RW, STARPU_R}, .nbuffers = 2, .model = &accumulate_vector_model }; /* * Reduction initialization methods */ #ifdef STARPU_USE_CUDA extern void zero_vector(TYPE *x, unsigned nelems); static void bzero_variable_cuda(void *descr[], void *cl_arg) { TYPE *v = (TYPE *)STARPU_VARIABLE_GET_PTR(descr[0]); size_t size = STARPU_VARIABLE_GET_ELEMSIZE(descr[0]); cudaMemsetAsync(v, 0, size, starpu_cuda_get_local_stream()); } #endif void bzero_variable_cpu(void *descr[], void *cl_arg) { TYPE *v = (TYPE *)STARPU_VARIABLE_GET_PTR(descr[0]); *v = (TYPE)0.0; } static struct starpu_perfmodel bzero_variable_model = { .type = STARPU_HISTORY_BASED, .symbol = "bzero_variable" }; struct starpu_codelet bzero_variable_cl = { .can_execute = can_execute, .cpu_funcs = {bzero_variable_cpu}, .cpu_funcs_name = {"bzero_variable_cpu"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {bzero_variable_cuda}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif .modes = {STARPU_W}, .nbuffers = 1, .model = &bzero_variable_model }; #ifdef STARPU_USE_CUDA static void bzero_vector_cuda(void *descr[], void *cl_arg) { TYPE *v = (TYPE *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned n = STARPU_VECTOR_GET_NX(descr[0]); size_t elemsize = STARPU_VECTOR_GET_ELEMSIZE(descr[0]); cudaMemsetAsync(v, 0, n * elemsize, starpu_cuda_get_local_stream()); } #endif void bzero_vector_cpu(void *descr[], void *cl_arg) { TYPE *v = (TYPE *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned n = STARPU_VECTOR_GET_NX(descr[0]); memset(v, 0, n*sizeof(TYPE)); } static struct starpu_perfmodel bzero_vector_model = { .type = STARPU_HISTORY_BASED, .symbol = "bzero_vector" }; struct starpu_codelet bzero_vector_cl = { .can_execute = can_execute, .cpu_funcs = {bzero_vector_cpu}, .cpu_funcs_name = {"bzero_vector_cpu"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {bzero_vector_cuda}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif .modes = {STARPU_W}, .nbuffers = 1, .model = &bzero_vector_model }; /* * DOT kernel : s = dot(v1, v2) */ #ifdef STARPU_USE_CUDA static void dot_kernel_cuda(void *descr[], void *cl_arg) { TYPE *dot = (TYPE *)STARPU_VARIABLE_GET_PTR(descr[0]); TYPE *v1 = (TYPE *)STARPU_VECTOR_GET_PTR(descr[1]); TYPE *v2 = (TYPE *)STARPU_VECTOR_GET_PTR(descr[2]); unsigned n = STARPU_VECTOR_GET_NX(descr[1]); cublasHandle_t handle = starpu_cublas_get_local_handle(); cublasSetPointerMode(handle, CUBLAS_POINTER_MODE_DEVICE); cublasStatus_t status = cublasdot(handle, n, v1, 1, v2, 1, dot); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); cublasSetPointerMode(handle, CUBLAS_POINTER_MODE_HOST); } #endif void dot_kernel_cpu(void *descr[], void *cl_arg) { TYPE *dot = (TYPE *)STARPU_VARIABLE_GET_PTR(descr[0]); TYPE *v1 = (TYPE *)STARPU_VECTOR_GET_PTR(descr[1]); TYPE *v2 = (TYPE *)STARPU_VECTOR_GET_PTR(descr[2]); unsigned n = STARPU_VECTOR_GET_NX(descr[1]); TYPE local_dot; /* Note that we explicitely cast the result of the DOT kernel because * some BLAS library will return a double for sdot for instance. */ local_dot = (TYPE)DOT(n, v1, 1, v2, 1); *dot = *dot + local_dot; } static struct starpu_perfmodel dot_kernel_model = { .type = STARPU_HISTORY_BASED, .symbol = "dot_kernel" }; static struct starpu_codelet dot_kernel_cl = { .can_execute = can_execute, .cpu_funcs = {dot_kernel_cpu}, .cpu_funcs_name = {"dot_kernel_cpu"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {dot_kernel_cuda}, #endif .cuda_flags = {STARPU_CUDA_ASYNC}, .nbuffers = 3, .model = &dot_kernel_model }; int dot_kernel(starpu_data_handle_t v1, starpu_data_handle_t v2, starpu_data_handle_t s, unsigned nblocks, int use_reduction) { int ret; /* Blank the accumulation variable */ if (use_reduction) starpu_data_invalidate_submit(s); else { ret = starpu_task_insert(&bzero_variable_cl, STARPU_W, s, 0); if (ret == -ENODEV) return ret; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); } unsigned b; for (b = 0; b < nblocks; b++) { ret = starpu_task_insert(&dot_kernel_cl, use_reduction?STARPU_REDUX:STARPU_RW, s, STARPU_R, starpu_data_get_sub_data(v1, 1, b), STARPU_R, starpu_data_get_sub_data(v2, 1, b), STARPU_TAG_ONLY, (starpu_tag_t) b, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); } return 0; } /* * SCAL kernel : v1 = p1 v1 */ #ifdef STARPU_USE_CUDA static void scal_kernel_cuda(void *descr[], void *cl_arg) { TYPE p1; starpu_codelet_unpack_args(cl_arg, &p1); TYPE *v1 = (TYPE *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned n = STARPU_VECTOR_GET_NX(descr[0]); /* v1 = p1 v1 */ TYPE alpha = p1; cublasStatus_t status = cublasscal(starpu_cublas_get_local_handle(), n, &alpha, v1, 1); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); } #endif void scal_kernel_cpu(void *descr[], void *cl_arg) { TYPE alpha; starpu_codelet_unpack_args(cl_arg, &alpha); TYPE *v1 = (TYPE *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned n = STARPU_VECTOR_GET_NX(descr[0]); /* v1 = alpha v1 */ SCAL(n, alpha, v1, 1); } static struct starpu_perfmodel scal_kernel_model = { .type = STARPU_HISTORY_BASED, .symbol = "scal_kernel" }; static struct starpu_codelet scal_kernel_cl = { .can_execute = can_execute, .cpu_funcs = {scal_kernel_cpu}, .cpu_funcs_name = {"scal_kernel_cpu"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {scal_kernel_cuda}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif .nbuffers = 1, .model = &scal_kernel_model }; /* * GEMV kernel : v1 = p1 * v1 + p2 * M v2 */ #ifdef STARPU_USE_CUDA static void gemv_kernel_cuda(void *descr[], void *cl_arg) { TYPE *v1 = (TYPE *)STARPU_VECTOR_GET_PTR(descr[0]); TYPE *v2 = (TYPE *)STARPU_VECTOR_GET_PTR(descr[2]); TYPE *M = (TYPE *)STARPU_MATRIX_GET_PTR(descr[1]); unsigned ld = STARPU_MATRIX_GET_LD(descr[1]); unsigned nx = STARPU_MATRIX_GET_NX(descr[1]); unsigned ny = STARPU_MATRIX_GET_NY(descr[1]); TYPE alpha, beta; starpu_codelet_unpack_args(cl_arg, &beta, &alpha); /* Compute v1 = alpha M v2 + beta v1 */ cublasStatus_t status = cublasgemv(starpu_cublas_get_local_handle(), CUBLAS_OP_N, nx, ny, &alpha, M, ld, v2, 1, &beta, v1, 1); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); } #endif void gemv_kernel_cpu(void *descr[], void *cl_arg) { TYPE *v1 = (TYPE *)STARPU_VECTOR_GET_PTR(descr[0]); TYPE *v2 = (TYPE *)STARPU_VECTOR_GET_PTR(descr[2]); TYPE *M = (TYPE *)STARPU_MATRIX_GET_PTR(descr[1]); unsigned ld = STARPU_MATRIX_GET_LD(descr[1]); unsigned nx = STARPU_MATRIX_GET_NX(descr[1]); unsigned ny = STARPU_MATRIX_GET_NY(descr[1]); TYPE alpha, beta; starpu_codelet_unpack_args(cl_arg, &beta, &alpha); int worker_size = starpu_combined_worker_get_size(); if (worker_size > 1) { /* Parallel CPU task */ unsigned rank = starpu_combined_worker_get_rank(); unsigned block_size = (ny + worker_size - 1)/worker_size; unsigned new_nx = STARPU_MIN(nx, block_size*(rank+1)) - block_size*rank; nx = new_nx; v1 = &v1[block_size*rank]; M = &M[block_size*rank]; } /* Compute v1 = alpha M v2 + beta v1 */ GEMV("N", nx, ny, alpha, M, ld, v2, 1, beta, v1, 1); } static struct starpu_perfmodel gemv_kernel_model = { .type = STARPU_HISTORY_BASED, .symbol = "gemv_kernel" }; static struct starpu_codelet gemv_kernel_cl = { .can_execute = can_execute, .type = STARPU_SPMD, .max_parallelism = INT_MAX, .cpu_funcs = {gemv_kernel_cpu}, .cpu_funcs_name = {"gemv_kernel_cpu"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {gemv_kernel_cuda}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif .nbuffers = 3, .model = &gemv_kernel_model }; int gemv_kernel(starpu_data_handle_t v1, starpu_data_handle_t matrix, starpu_data_handle_t v2, TYPE p1, TYPE p2, unsigned nblocks, int use_reduction) { unsigned b1, b2; int ret; for (b2 = 0; b2 < nblocks; b2++) { ret = starpu_task_insert(&scal_kernel_cl, STARPU_RW, starpu_data_get_sub_data(v1, 1, b2), STARPU_VALUE, &p1, sizeof(p1), STARPU_TAG_ONLY, (starpu_tag_t) b2, 0); if (ret == -ENODEV) return ret; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); } for (b2 = 0; b2 < nblocks; b2++) { for (b1 = 0; b1 < nblocks; b1++) { TYPE one = 1.0; ret = starpu_task_insert(&gemv_kernel_cl, use_reduction?STARPU_REDUX:STARPU_RW, starpu_data_get_sub_data(v1, 1, b2), STARPU_R, starpu_data_get_sub_data(matrix, 2, b2, b1), STARPU_R, starpu_data_get_sub_data(v2, 1, b1), STARPU_VALUE, &one, sizeof(one), STARPU_VALUE, &p2, sizeof(p2), STARPU_TAG_ONLY, ((starpu_tag_t)b2) * nblocks + b1, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); } } return 0; } /* * AXPY + SCAL kernel : v1 = p1 * v1 + p2 * v2 */ #ifdef STARPU_USE_CUDA static void scal_axpy_kernel_cuda(void *descr[], void *cl_arg) { TYPE p1, p2; starpu_codelet_unpack_args(cl_arg, &p1, &p2); TYPE *v1 = (TYPE *)STARPU_VECTOR_GET_PTR(descr[0]); TYPE *v2 = (TYPE *)STARPU_VECTOR_GET_PTR(descr[1]); unsigned n = STARPU_VECTOR_GET_NX(descr[0]); /* Compute v1 = p1 * v1 + p2 * v2. * v1 = p1 v1 * v1 = v1 + p2 v2 */ cublasStatus_t status; status = cublasscal(starpu_cublas_get_local_handle(), n, &p1, v1, 1); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); status = cublasaxpy(starpu_cublas_get_local_handle(), n, &p2, v2, 1, v1, 1); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); } #endif void scal_axpy_kernel_cpu(void *descr[], void *cl_arg) { TYPE p1, p2; starpu_codelet_unpack_args(cl_arg, &p1, &p2); TYPE *v1 = (TYPE *)STARPU_VECTOR_GET_PTR(descr[0]); TYPE *v2 = (TYPE *)STARPU_VECTOR_GET_PTR(descr[1]); unsigned nx = STARPU_VECTOR_GET_NX(descr[0]); /* Compute v1 = p1 * v1 + p2 * v2. * v1 = p1 v1 * v1 = v1 + p2 v2 */ SCAL(nx, p1, v1, 1); AXPY(nx, p2, v2, 1, v1, 1); } static struct starpu_perfmodel scal_axpy_kernel_model = { .type = STARPU_HISTORY_BASED, .symbol = "scal_axpy_kernel" }; static struct starpu_codelet scal_axpy_kernel_cl = { .can_execute = can_execute, .cpu_funcs = {scal_axpy_kernel_cpu}, .cpu_funcs_name = {"scal_axpy_kernel_cpu"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {scal_axpy_kernel_cuda}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif .nbuffers = 2, .model = &scal_axpy_kernel_model }; int scal_axpy_kernel(starpu_data_handle_t v1, TYPE p1, starpu_data_handle_t v2, TYPE p2, unsigned nblocks) { unsigned b; for (b = 0; b < nblocks; b++) { int ret; ret = starpu_task_insert(&scal_axpy_kernel_cl, STARPU_RW, starpu_data_get_sub_data(v1, 1, b), STARPU_R, starpu_data_get_sub_data(v2, 1, b), STARPU_VALUE, &p1, sizeof(p1), STARPU_VALUE, &p2, sizeof(p2), STARPU_TAG_ONLY, (starpu_tag_t) b, 0); if (ret == -ENODEV) return ret; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); } return 0; } /* * AXPY kernel : v1 = v1 + p1 * v2 */ #ifdef STARPU_USE_CUDA static void axpy_kernel_cuda(void *descr[], void *cl_arg) { TYPE p1; starpu_codelet_unpack_args(cl_arg, &p1); TYPE *v1 = (TYPE *)STARPU_VECTOR_GET_PTR(descr[0]); TYPE *v2 = (TYPE *)STARPU_VECTOR_GET_PTR(descr[1]); unsigned n = STARPU_VECTOR_GET_NX(descr[0]); /* Compute v1 = v1 + p1 * v2. */ cublasStatus_t status = cublasaxpy(starpu_cublas_get_local_handle(), n, &p1, v2, 1, v1, 1); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); } #endif void axpy_kernel_cpu(void *descr[], void *cl_arg) { TYPE p1; starpu_codelet_unpack_args(cl_arg, &p1); TYPE *v1 = (TYPE *)STARPU_VECTOR_GET_PTR(descr[0]); TYPE *v2 = (TYPE *)STARPU_VECTOR_GET_PTR(descr[1]); unsigned nx = STARPU_VECTOR_GET_NX(descr[0]); /* Compute v1 = p1 * v1 + p2 * v2. */ AXPY(nx, p1, v2, 1, v1, 1); } static struct starpu_perfmodel axpy_kernel_model = { .type = STARPU_HISTORY_BASED, .symbol = "axpy_kernel" }; static struct starpu_codelet axpy_kernel_cl = { .can_execute = can_execute, .cpu_funcs = {axpy_kernel_cpu}, .cpu_funcs_name = {"axpy_kernel_cpu"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {axpy_kernel_cuda}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif .nbuffers = 2, .model = &axpy_kernel_model }; int axpy_kernel(starpu_data_handle_t v1, starpu_data_handle_t v2, TYPE p1, unsigned nblocks) { unsigned b; for (b = 0; b < nblocks; b++) { int ret; ret = starpu_task_insert(&axpy_kernel_cl, STARPU_RW, starpu_data_get_sub_data(v1, 1, b), STARPU_R, starpu_data_get_sub_data(v2, 1, b), STARPU_VALUE, &p1, sizeof(p1), STARPU_TAG_ONLY, (starpu_tag_t) b, 0); if (ret == -ENODEV) return ret; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); } return 0; } int copy_handle(starpu_data_handle_t dst, starpu_data_handle_t src, unsigned nblocks) { unsigned b; for (b = 0; b < nblocks; b++) starpu_data_cpy(starpu_data_get_sub_data(dst, 1, b), starpu_data_get_sub_data(src, 1, b), 1, NULL, NULL); return 0; } starpu-1.2.3+dfsg/examples/cholesky/000077500000000000000000000000001320135501600174055ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/cholesky/cholesky.h000066400000000000000000000221341320135501600214010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DW_CHOLESKY_H__ #define __DW_CHOLESKY_H__ #include #include #include #ifdef STARPU_USE_CUDA #include #include #endif #include #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #define PRINTF(fmt, ...) do { if (!getenv("STARPU_SSILENT")) {printf(fmt, ## __VA_ARGS__); }} while(0) #define NMAXBLOCKS 128 #define TAG11(k) ((starpu_tag_t)( (1ULL<<60) | (unsigned long long)(k))) #define TAG21(k,j) ((starpu_tag_t)(((3ULL<<60) | (((unsigned long long)(k))<<32) \ | (unsigned long long)(j)))) #define TAG22(k,i,j) ((starpu_tag_t)(((4ULL<<60) | ((unsigned long long)(k)<<32) \ | ((unsigned long long)(i)<<16) \ | (unsigned long long)(j)))) #define TAG11_AUX(k, prefix) ((starpu_tag_t)( (((unsigned long long)(prefix))<<60) | (1ULL<<56) | (unsigned long long)(k))) #define TAG21_AUX(k,j, prefix) ((starpu_tag_t)( (((unsigned long long)(prefix))<<60) \ | ((3ULL<<56) | (((unsigned long long)(k))<<32) \ | (unsigned long long)(j)))) #define TAG22_AUX(k,i,j, prefix) ((starpu_tag_t)( (((unsigned long long)(prefix))<<60) \ | ((4ULL<<56) | ((unsigned long long)(k)<<32) \ | ((unsigned long long)(i)<<16) \ | (unsigned long long)(j)))) #define BLOCKSIZE (size/nblocks) #define BLAS3_FLOP(n1,n2,n3) \ (2*((uint64_t)n1)*((uint64_t)n2)*((uint64_t)n3)) /* This is from magma -- Innovative Computing Laboratory -- Electrical Engineering and Computer Science Department -- University of Tennessee -- (C) Copyright 2009 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Tennessee, Knoxville nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #define FMULS_POTRF(__n) ((double)(__n) * (((1. / 6.) * (double)(__n) + 0.5) * (double)(__n) + (1. / 3.))) #define FADDS_POTRF(__n) ((double)(__n) * (((1. / 6.) * (double)(__n) ) * (double)(__n) - (1. / 6.))) #define FLOPS_SPOTRF(__n) ( FMULS_POTRF((__n)) + FADDS_POTRF((__n)) ) #define FMULS_TRMM_2(__m, __n) (0.5 * (double)(__n) * (double)(__m) * ((double)(__m)+1.)) #define FADDS_TRMM_2(__m, __n) (0.5 * (double)(__n) * (double)(__m) * ((double)(__m)-1.)) #define FMULS_TRMM(__m, __n) ( /*( (__side) == PlasmaLeft ) ? FMULS_TRMM_2((__m), (__n)) :*/ FMULS_TRMM_2((__n), (__m)) ) #define FADDS_TRMM(__m, __n) ( /*( (__side) == PlasmaLeft ) ? FADDS_TRMM_2((__m), (__n)) :*/ FADDS_TRMM_2((__n), (__m)) ) #define FMULS_TRSM FMULS_TRMM #define FADDS_TRSM FMULS_TRMM #define FLOPS_STRSM(__m, __n) ( FMULS_TRSM((__m), (__n)) + FADDS_TRSM((__m), (__n)) ) #define FMULS_GEMM(__m, __n, __k) ((double)(__m) * (double)(__n) * (double)(__k)) #define FADDS_GEMM(__m, __n, __k) ((double)(__m) * (double)(__n) * (double)(__k)) #define FLOPS_SGEMM(__m, __n, __k) ( FMULS_GEMM((__m), (__n), (__k)) + FADDS_GEMM((__m), (__n), (__k)) ) /* End of magma code */ static unsigned size; static unsigned nblocks; static unsigned nbigblocks; static inline void init_sizes(void) { int power = starpu_cpu_worker_get_count() + 32 * starpu_cuda_worker_get_count(); int power_cbrt = cbrt(power); #ifndef STARPU_LONG_CHECK power_cbrt /= 2; #endif if (power_cbrt < 1) power_cbrt = 1; #ifdef STARPU_QUICK_CHECK if (!size) size = 320*2*power_cbrt; if (!nblocks) nblocks = 2*power_cbrt; if (!nbigblocks) nbigblocks = power_cbrt; #else if (!size) size = 960*8*power_cbrt; if (!nblocks) nblocks = 8*power_cbrt; if (!nbigblocks) nbigblocks = 4*power_cbrt; #endif } static unsigned pinned = 1; static unsigned noprio = 0; static unsigned check = 0; static unsigned bound = 0; static unsigned bound_deps = 0; static unsigned bound_lp = 0; static unsigned bound_mps = 0; static unsigned with_ctxs = 0; static unsigned with_noctxs = 0; static unsigned chole1 = 0; static unsigned chole2 = 0; struct starpu_perfmodel chol_model_11; struct starpu_perfmodel chol_model_21; struct starpu_perfmodel chol_model_22; struct starpu_codelet cl11; struct starpu_codelet cl21; struct starpu_codelet cl22; void chol_cpu_codelet_update_u11(void **, void *); void chol_cpu_codelet_update_u21(void **, void *); void chol_cpu_codelet_update_u22(void **, void *); double cpu_chol_task_11_cost(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl); double cpu_chol_task_21_cost(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl); double cpu_chol_task_22_cost(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl); #ifdef STARPU_USE_CUDA void chol_cublas_codelet_update_u11(void *descr[], void *_args); void chol_cublas_codelet_update_u21(void *descr[], void *_args); void chol_cublas_codelet_update_u22(void *descr[], void *_args); double cuda_chol_task_11_cost(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl); double cuda_chol_task_21_cost(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl); double cuda_chol_task_22_cost(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl); #endif void initialize_chol_model(struct starpu_perfmodel* model, char* symbol, double (*cpu_cost_function)(struct starpu_task *, struct starpu_perfmodel_arch*, unsigned), double (*cuda_cost_function)(struct starpu_task *, struct starpu_perfmodel_arch*, unsigned)); static void STARPU_ATTRIBUTE_UNUSED parse_args(int argc, char **argv) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-with_ctxs") == 0) { with_ctxs = 1; break; } else if (strcmp(argv[i], "-with_noctxs") == 0) { with_noctxs = 1; break; } else if (strcmp(argv[i], "-chole1") == 0) { chole1 = 1; break; } else if (strcmp(argv[i], "-chole2") == 0) { chole2 = 1; break; } else if (strcmp(argv[i], "-size") == 0) { char *argptr; size = strtol(argv[++i], &argptr, 10); } else if (strcmp(argv[i], "-nblocks") == 0) { char *argptr; nblocks = strtol(argv[++i], &argptr, 10); } else if (strcmp(argv[i], "-nbigblocks") == 0) { char *argptr; nbigblocks = strtol(argv[++i], &argptr, 10); } else if (strcmp(argv[i], "-no-pin") == 0) { pinned = 0; } else if (strcmp(argv[i], "-no-prio") == 0) { noprio = 1; } else if (strcmp(argv[i], "-commute") == 0) { cl22.modes[2] |= STARPU_COMMUTE; } else if (strcmp(argv[i], "-bound") == 0) { bound = 1; } else if (strcmp(argv[i], "-bound-lp") == 0) { bound_lp = 1; } else if (strcmp(argv[i], "-bound-mps") == 0) { bound_mps = 1; } else if (strcmp(argv[i], "-bound-deps") == 0) { bound_deps = 1; } else if (strcmp(argv[i], "-check") == 0) { check = 1; } else /* if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i],"--help") == 0) */ { fprintf(stderr,"usage : %s [-size size] [-nblocks nblocks] [-no-pin] [-no-prio] [-bound] [-bound-deps] [-bound-lp] [-check]\n", argv[0]); fprintf(stderr,"Currently selected: %ux%u and %ux%u blocks\n", size, size, nblocks, nblocks); exit(0); } } } #endif /* __DW_CHOLESKY_H__ */ starpu-1.2.3+dfsg/examples/cholesky/cholesky_grain_tag.c000066400000000000000000000245301320135501600234110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2017 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This version of the Cholesky factorization uses explicit dependency * declaration through dependency tags. * It also uses data partitioning to split the matrix into submatrices. * It also changes the partitioning during execution: when called first, * cholesky_grain_rec splits the matrix with a big granularity (nblocks) and * processes nbigblocks blocks, before calling itself again, to process the * remainder of the matrix with a smaller granularity. */ #include "cholesky.h" #if defined(STARPU_USE_CUDA) && defined(STARPU_HAVE_MAGMA) #include "magma.h" #endif /* * Some useful functions */ static struct starpu_task *create_task(starpu_tag_t id) { struct starpu_task *task = starpu_task_create(); task->cl_arg = NULL; task->use_tag = 1; task->tag_id = id; return task; } /* * Create the codelets */ static struct starpu_task * create_task_11(starpu_data_handle_t dataA, unsigned k, unsigned reclevel) { /* FPRINTF(stdout, "task 11 k = %d TAG = %llx\n", k, (TAG11(k))); */ struct starpu_task *task = create_task(TAG11_AUX(k, reclevel)); task->cl = &cl11; /* which sub-data is manipulated ? */ task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, k); /* this is an important task */ task->priority = STARPU_MAX_PRIO; /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG11_AUX(k, reclevel), 1, TAG22_AUX(k-1, k, k, reclevel)); } int n = starpu_matrix_get_nx(task->handles[0]); task->flops = FLOPS_SPOTRF(n); return task; } static int create_task_21(starpu_data_handle_t dataA, unsigned k, unsigned j, unsigned reclevel) { int ret; struct starpu_task *task = create_task(TAG21_AUX(k, j, reclevel)); task->cl = &cl21; /* which sub-data is manipulated ? */ task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, k); task->handles[1] = starpu_data_get_sub_data(dataA, 2, k, j); if (j == k+1) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG21_AUX(k, j, reclevel), 2, TAG11_AUX(k, reclevel), TAG22_AUX(k-1, k, j, reclevel)); } else { starpu_tag_declare_deps(TAG21_AUX(k, j, reclevel), 1, TAG11_AUX(k, reclevel)); } int n = starpu_matrix_get_nx(task->handles[0]); task->flops = FLOPS_STRSM(n, n); ret = starpu_task_submit(task); if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); return ret; } static int create_task_22(starpu_data_handle_t dataA, unsigned k, unsigned i, unsigned j, unsigned reclevel) { int ret; /* FPRINTF(stdout, "task 22 k,i,j = %d,%d,%d TAG = %llx\n", k,i,j, TAG22_AUX(k,i,j)); */ struct starpu_task *task = create_task(TAG22_AUX(k, i, j, reclevel)); task->cl = &cl22; /* which sub-data is manipulated ? */ task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, i); task->handles[1] = starpu_data_get_sub_data(dataA, 2, k, j); task->handles[2] = starpu_data_get_sub_data(dataA, 2, i, j); if ( (i == k + 1) && (j == k +1) ) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG22_AUX(k, i, j, reclevel), 3, TAG22_AUX(k-1, i, j, reclevel), TAG21_AUX(k, i, reclevel), TAG21_AUX(k, j, reclevel)); } else { starpu_tag_declare_deps(TAG22_AUX(k, i, j, reclevel), 2, TAG21_AUX(k, i, reclevel), TAG21_AUX(k, j, reclevel)); } int n = starpu_matrix_get_nx(task->handles[0]); task->flops = FLOPS_SGEMM(n, n, n); ret = starpu_task_submit(task); if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); return ret; } /* * code to bootstrap the factorization * and construct the DAG */ static int cholesky_grain_rec(float *matA, unsigned size, unsigned ld, unsigned nblocks, unsigned nbigblocks, unsigned reclevel) { int ret; /* create a new codelet */ struct starpu_task *entry_task = NULL; /* create all the DAG nodes */ unsigned i,j,k; starpu_data_handle_t dataA; /* monitor and partition the A matrix into blocks : * one block is now determined by 2 unsigned (i,j) */ starpu_matrix_data_register(&dataA, STARPU_MAIN_RAM, (uintptr_t)matA, ld, size, size, sizeof(float)); starpu_data_set_sequential_consistency_flag(dataA, 0); struct starpu_data_filter f = { .filter_func = starpu_matrix_filter_vertical_block, .nchildren = nblocks }; struct starpu_data_filter f2 = { .filter_func = starpu_matrix_filter_block, .nchildren = nblocks }; starpu_data_map_filters(dataA, 2, &f, &f2); for (k = 0; k < nbigblocks; k++) { starpu_iteration_push(k); struct starpu_task *task = create_task_11(dataA, k, reclevel); /* we defer the launch of the first task */ if (k == 0) { entry_task = task; } else { ret = starpu_task_submit(task); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } for (j = k+1; j * Copyright (C) 2010, 2011, 2012, 2013, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This version of the Cholesky factorization uses implicit dependency computation. * The whole algorithm thus appears clearly in the task submission loop in _cholesky(). */ #include "cholesky.h" #include "../sched_ctx_utils/sched_ctx_utils.h" #if defined(STARPU_USE_CUDA) && defined(STARPU_HAVE_MAGMA) #include "magma.h" #endif /* * code to bootstrap the factorization * and construct the DAG */ static void callback_turn_spmd_on(void *arg STARPU_ATTRIBUTE_UNUSED) { cl22.type = STARPU_SPMD; } static int _cholesky(starpu_data_handle_t dataA, unsigned nblocks) { double start; double end; unsigned i,j,k; unsigned long n = starpu_matrix_get_nx(dataA); unsigned long nn = n/nblocks; unsigned unbound_prio = STARPU_MAX_PRIO == INT_MAX && STARPU_MIN_PRIO == INT_MIN; if (bound || bound_lp || bound_mps) starpu_bound_start(bound_deps, 0); starpu_fxt_start_profiling(); start = starpu_timing_now(); /* create all the DAG nodes */ for (k = 0; k < nblocks; k++) { int ret; starpu_iteration_push(k); starpu_data_handle_t sdatakk = starpu_data_get_sub_data(dataA, 2, k, k); ret = starpu_task_insert(&cl11, STARPU_PRIORITY, noprio ? STARPU_DEFAULT_PRIO : unbound_prio ? (int)(2*nblocks - 2*k) : STARPU_MAX_PRIO, STARPU_RW, sdatakk, STARPU_CALLBACK, (k == 3*nblocks/4)?callback_turn_spmd_on:NULL, STARPU_FLOPS, (double) FLOPS_SPOTRF(nn), STARPU_TAG_ONLY, TAG11(k), 0); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); for (j = k+1; j j) { mat[j+i*size] = 0.0f; /* debug */ } } } float *test_mat = malloc(size*size*sizeof(float)); STARPU_ASSERT(test_mat); STARPU_SSYRK("L", "N", size, size, 1.0f, mat, size, 0.0f, test_mat, size); FPRINTF(stderr, "comparing results ...\n"); #ifdef PRINT_OUTPUT for (j = 0; j < size; j++) { for (i = 0; i < size; i++) { if (i <= j) { FPRINTF(stdout, "%2.2f\t", test_mat[j +i*size]); } else { FPRINTF(stdout, ".\t"); } } FPRINTF(stdout, "\n"); } #endif for (j = 0; j < size; j++) { for (i = 0; i < size; i++) { if (i <= j) { float orig = (1.0f/(1.0f+i+j)) + ((i == j)?1.0f*size:0.0f); float err = abs(test_mat[j +i*size] - orig) / orig; if (err > 0.00001) { FPRINTF(stderr, "Error[%u, %u] --> %2.6f != %2.6f (err %2.6f)\n", i, j, test_mat[j +i*size], orig, err); assert(0); } } } } free(test_mat); } starpu_free_flags(mat, (size_t)size*size*sizeof(float), STARPU_MALLOC_PINNED|STARPU_MALLOC_SIMULATION_FOLDED); } int main(int argc, char **argv) { /* create a simple definite positive symetric matrix example * * Hilbert matrix : h(i,j) = 1/(i+j+1) * */ #ifdef STARPU_HAVE_MAGMA magma_init(); #endif int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); //starpu_fxt_stop_profiling(); init_sizes(); parse_args(argc, argv); if(with_ctxs || with_noctxs || chole1 || chole2) parse_args_ctx(argc, argv); #ifdef STARPU_USE_CUDA initialize_chol_model(&chol_model_11,"chol_model_11",cpu_chol_task_11_cost,cuda_chol_task_11_cost); initialize_chol_model(&chol_model_21,"chol_model_21",cpu_chol_task_21_cost,cuda_chol_task_21_cost); initialize_chol_model(&chol_model_22,"chol_model_22",cpu_chol_task_22_cost,cuda_chol_task_22_cost); #else initialize_chol_model(&chol_model_11,"chol_model_11",cpu_chol_task_11_cost,NULL); initialize_chol_model(&chol_model_21,"chol_model_21",cpu_chol_task_21_cost,NULL); initialize_chol_model(&chol_model_22,"chol_model_22",cpu_chol_task_22_cost,NULL); #endif starpu_cublas_init(); if(with_ctxs) { construct_contexts(execute_cholesky); start_2benchs(execute_cholesky); } else if(with_noctxs) start_2benchs(execute_cholesky); else if(chole1) start_1stbench(execute_cholesky); else if(chole2) start_2ndbench(execute_cholesky); else execute_cholesky(size, nblocks); starpu_cublas_shutdown(); starpu_shutdown(); return 0; } starpu-1.2.3+dfsg/examples/cholesky/cholesky_kernels.c000066400000000000000000000210621320135501600231160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012, 2014-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * Standard kernels for the Cholesky factorization * U22 is the gemm update * U21 is the trsm update * U11 is the cholesky factorization */ #include #include "cholesky.h" #include "../common/blas.h" #if defined(STARPU_USE_CUDA) #include #include #if defined(STARPU_HAVE_MAGMA) #include "magma.h" #include "magma_lapack.h" #endif #endif /* * U22 */ #if defined(STARPU_USE_CUDA) static const float p1 = 1.0; static const float m1 = -1.0; #endif static inline void chol_common_cpu_codelet_update_u22(void *descr[], int s, STARPU_ATTRIBUTE_UNUSED void *_args) { /* printf("22\n"); */ float *left = (float *)STARPU_MATRIX_GET_PTR(descr[0]); float *right = (float *)STARPU_MATRIX_GET_PTR(descr[1]); float *center = (float *)STARPU_MATRIX_GET_PTR(descr[2]); unsigned dx = STARPU_MATRIX_GET_NY(descr[2]); unsigned dy = STARPU_MATRIX_GET_NX(descr[2]); unsigned dz = STARPU_MATRIX_GET_NY(descr[0]); unsigned ld21 = STARPU_MATRIX_GET_LD(descr[0]); unsigned ld12 = STARPU_MATRIX_GET_LD(descr[1]); unsigned ld22 = STARPU_MATRIX_GET_LD(descr[2]); if (s == 0) { int worker_size = starpu_combined_worker_get_size(); if (worker_size == 1) { /* Sequential CPU kernel */ STARPU_SGEMM("N", "T", dy, dx, dz, -1.0f, left, ld21, right, ld12, 1.0f, center, ld22); } else { /* Parallel CPU kernel */ unsigned rank = starpu_combined_worker_get_rank(); unsigned block_size = (dx + worker_size - 1)/worker_size; unsigned new_dx = STARPU_MIN(dx, block_size*(rank+1)) - block_size*rank; float *new_left = &left[block_size*rank]; float *new_center = ¢er[block_size*rank]; STARPU_SGEMM("N", "T", dy, new_dx, dz, -1.0f, new_left, ld21, right, ld12, 1.0f, new_center, ld22); } } else { /* CUDA kernel */ #ifdef STARPU_USE_CUDA cublasStatus_t status = cublasSgemm(starpu_cublas_get_local_handle(), CUBLAS_OP_N, CUBLAS_OP_T, dy, dx, dz, &m1, left, ld21, right, ld12, &p1, center, ld22); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); #endif } } void chol_cpu_codelet_update_u22(void *descr[], void *_args) { chol_common_cpu_codelet_update_u22(descr, 0, _args); } #ifdef STARPU_USE_CUDA void chol_cublas_codelet_update_u22(void *descr[], void *_args) { chol_common_cpu_codelet_update_u22(descr, 1, _args); } #endif /* STARPU_USE_CUDA */ /* * U21 */ static inline void chol_common_codelet_update_u21(void *descr[], int s, STARPU_ATTRIBUTE_UNUSED void *_args) { /* printf("21\n"); */ float *sub11; float *sub21; sub11 = (float *)STARPU_MATRIX_GET_PTR(descr[0]); sub21 = (float *)STARPU_MATRIX_GET_PTR(descr[1]); unsigned ld11 = STARPU_MATRIX_GET_LD(descr[0]); unsigned ld21 = STARPU_MATRIX_GET_LD(descr[1]); unsigned nx21 = STARPU_MATRIX_GET_NY(descr[1]); unsigned ny21 = STARPU_MATRIX_GET_NX(descr[1]); #ifdef STARPU_USE_CUDA cublasStatus status; #endif switch (s) { case 0: STARPU_STRSM("R", "L", "T", "N", nx21, ny21, 1.0f, sub11, ld11, sub21, ld21); break; #ifdef STARPU_USE_CUDA case 1: status = cublasStrsm(starpu_cublas_get_local_handle(), CUBLAS_SIDE_RIGHT, CUBLAS_FILL_MODE_LOWER, CUBLAS_OP_T, CUBLAS_DIAG_NON_UNIT, nx21, ny21, &p1, sub11, ld11, sub21, ld21); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); break; #endif default: STARPU_ABORT(); break; } } void chol_cpu_codelet_update_u21(void *descr[], void *_args) { chol_common_codelet_update_u21(descr, 0, _args); } #ifdef STARPU_USE_CUDA void chol_cublas_codelet_update_u21(void *descr[], void *_args) { chol_common_codelet_update_u21(descr, 1, _args); } #endif /* * U11 */ static inline void chol_common_codelet_update_u11(void *descr[], int s, STARPU_ATTRIBUTE_UNUSED void *_args) { /* printf("11\n"); */ float *sub11; sub11 = (float *)STARPU_MATRIX_GET_PTR(descr[0]); unsigned nx = STARPU_MATRIX_GET_NY(descr[0]); unsigned ld = STARPU_MATRIX_GET_LD(descr[0]); unsigned z; switch (s) { case 0: #ifdef STARPU_MKL STARPU_SPOTRF("L", nx, sub11, ld); #else /* * - alpha 11 <- lambda 11 = sqrt(alpha11) * - alpha 21 <- l 21 = alpha 21 / lambda 11 * - A22 <- A22 - l21 trans(l21) */ for (z = 0; z < nx; z++) { float lambda11; lambda11 = sqrt(sub11[z+z*ld]); sub11[z+z*ld] = lambda11; STARPU_ASSERT(lambda11 != 0.0f); STARPU_SSCAL(nx - z - 1, 1.0f/lambda11, &sub11[(z+1)+z*ld], 1); STARPU_SSYR("L", nx - z - 1, -1.0f, &sub11[(z+1)+z*ld], 1, &sub11[(z+1)+(z+1)*ld], ld); } #endif break; #ifdef STARPU_USE_CUDA case 1: #ifdef STARPU_HAVE_MAGMA { int ret; int info; cudaStream_t stream = starpu_cuda_get_local_stream(); #if (MAGMA_VERSION_MAJOR > 1) || (MAGMA_VERSION_MAJOR == 1 && MAGMA_VERSION_MINOR >= 4) cublasSetKernelStream(stream); magmablasSetKernelStream(stream); #endif ret = magma_spotrf_gpu(MagmaLower, nx, sub11, ld, &info); if (ret != MAGMA_SUCCESS) { fprintf(stderr, "Error in Magma: %d\n", ret); STARPU_ABORT(); } #if (MAGMA_VERSION_MAJOR > 1) || (MAGMA_VERSION_MAJOR == 1 && MAGMA_VERSION_MINOR >= 4) cudaError_t cures = cudaStreamSynchronize(stream); #else cudaError_t cures = cudaThreadSynchronize(); #endif STARPU_ASSERT(!cures); } #else { float *lambda11; cublasStatus_t status; cudaStream_t stream = starpu_cuda_get_local_stream(); cublasHandle_t handle = starpu_cublas_get_local_handle(); cudaHostAlloc((void **)&lambda11, sizeof(float), 0); for (z = 0; z < nx; z++) { cudaMemcpyAsync(lambda11, &sub11[z+z*ld], sizeof(float), cudaMemcpyDeviceToHost, stream); cudaStreamSynchronize(stream); STARPU_ASSERT(*lambda11 != 0.0f); *lambda11 = sqrt(*lambda11); /* cublasSetVector(1, sizeof(float), lambda11, sizeof(float), &sub11[z+z*ld], sizeof(float)); */ cudaMemcpyAsync(&sub11[z+z*ld], lambda11, sizeof(float), cudaMemcpyHostToDevice, stream); float scal = 1.0f/(*lambda11); status = cublasSscal(handle, nx - z - 1, &scal, &sub11[(z+1)+z*ld], 1); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); status = cublasSsyr(handle, CUBLAS_FILL_MODE_UPPER, nx - z - 1, &m1, &sub11[(z+1)+z*ld], 1, &sub11[(z+1)+(z+1)*ld], ld); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); } cudaStreamSynchronize(stream); cudaFreeHost(lambda11); } #endif break; #endif default: STARPU_ABORT(); break; } } void chol_cpu_codelet_update_u11(void *descr[], void *_args) { chol_common_codelet_update_u11(descr, 0, _args); } #ifdef STARPU_USE_CUDA void chol_cublas_codelet_update_u11(void *descr[], void *_args) { chol_common_codelet_update_u11(descr, 1, _args); } #endif/* STARPU_USE_CUDA */ struct starpu_codelet cl11 = { .type = STARPU_SEQ, .cpu_funcs = {chol_cpu_codelet_update_u11}, .cpu_funcs_name = {"chol_cpu_codelet_update_u11"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {chol_cublas_codelet_update_u11}, #elif defined(STARPU_SIMGRID) .cuda_funcs = {(void*)1}, #endif .nbuffers = 1, .modes = { STARPU_RW }, .model = &chol_model_11 }; struct starpu_codelet cl21 = { .type = STARPU_SEQ, .cpu_funcs = {chol_cpu_codelet_update_u21}, .cpu_funcs_name = {"chol_cpu_codelet_update_u21"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {chol_cublas_codelet_update_u21}, #elif defined(STARPU_SIMGRID) .cuda_funcs = {(void*)1}, #endif .cuda_flags = {STARPU_CUDA_ASYNC}, .nbuffers = 2, .modes = { STARPU_R, STARPU_RW }, .model = &chol_model_21 }; struct starpu_codelet cl22 = { .type = STARPU_SEQ, .max_parallelism = INT_MAX, .cpu_funcs = {chol_cpu_codelet_update_u22}, .cpu_funcs_name = {"chol_cpu_codelet_update_u22"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {chol_cublas_codelet_update_u22}, #elif defined(STARPU_SIMGRID) .cuda_funcs = {(void*)1}, #endif .cuda_flags = {STARPU_CUDA_ASYNC}, .nbuffers = 3, .modes = { STARPU_R, STARPU_R, STARPU_RW }, .model = &chol_model_22 }; starpu-1.2.3+dfsg/examples/cholesky/cholesky_models.c000066400000000000000000000103461320135501600227410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2017 CNRS * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * Example of a cost model for BLAS operations. This is really just an * example! */ /* * As a convention, in that file, buffers[0] is represented by A, * buffers[1] is B ... */ /* * Number of flops of Gemm */ #include #include #include "cholesky.h" /* #define USE_PERTURBATION 1 */ #ifdef USE_PERTURBATION #define PERTURBATE(a) ((starpu_drand48()*2.0f*(AMPL) + 1.0f - (AMPL))*(a)) #else #define PERTURBATE(a) (a) #endif double cpu_chol_task_11_cost(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { uint32_t n; n = starpu_matrix_get_nx(task->handles[0]); double cost = (((double)(n)*n*n)/1000.0f*0.894/0.79176); #ifdef STARPU_MODEL_DEBUG FPRINTF(stdout, "cpu_chol_task_11_cost n %u cost %e\n", n, cost); #endif return PERTURBATE(cost); } double cuda_chol_task_11_cost(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { uint32_t n; n = starpu_matrix_get_nx(task->handles[0]); double cost = (((double)(n)*n*n)/50.0f/10.75/5.088633/0.9883); #ifdef STARPU_MODEL_DEBUG FPRINTF(stdout, "cuda_chol_task_11_cost n %u cost %e\n", n, cost); #endif return PERTURBATE(cost); } double cpu_chol_task_21_cost(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { uint32_t n; n = starpu_matrix_get_nx(task->handles[0]); double cost = (((double)(n)*n*n)/7706.674/0.95/0.9965); #ifdef STARPU_MODEL_DEBUG FPRINTF(stdout, "cpu_chol_task_21_cost n %u cost %e\n", n, cost); #endif return PERTURBATE(cost); } double cuda_chol_task_21_cost(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { uint32_t n; n = starpu_matrix_get_nx(task->handles[0]); double cost = (((double)(n)*n*n)/50.0f/10.75/87.29520); #ifdef STARPU_MODEL_DEBUG FPRINTF(stdout, "cuda_chol_task_21_cost n %u cost %e\n", n, cost); #endif return PERTURBATE(cost); } double cpu_chol_task_22_cost(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { uint32_t n; n = starpu_matrix_get_nx(task->handles[0]); double cost = (((double)(n)*n*n)/50.0f/10.75/8.0760); #ifdef STARPU_MODEL_DEBUG FPRINTF(stdout, "cpu_chol_task_22_cost n %u cost %e\n", n, cost); #endif return PERTURBATE(cost); } double cuda_chol_task_22_cost(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { uint32_t n; n = starpu_matrix_get_nx(task->handles[0]); double cost = (((double)(n)*n*n)/50.0f/10.75/76.30666); #ifdef STARPU_MODEL_DEBUG FPRINTF(stdout, "cuda_chol_task_22_cost n %u cost %e\n", n, cost); #endif return PERTURBATE(cost); } void initialize_chol_model(struct starpu_perfmodel* model, char * symbol, double (*cpu_cost_function)(struct starpu_task *, struct starpu_perfmodel_arch*, unsigned), double (*cuda_cost_function)(struct starpu_task *, struct starpu_perfmodel_arch*, unsigned)) { struct starpu_perfmodel_per_arch *per_arch; model->symbol = symbol; model->type = STARPU_HISTORY_BASED; starpu_perfmodel_init(model); per_arch = starpu_perfmodel_get_model_per_devices(model, 0, STARPU_CPU_WORKER, 0, 1, -1); per_arch->cost_function = cpu_cost_function; // We could also call directly: // starpu_perfmodel_set_per_devices_cost_function(model, 0, cpu_cost_function, STARPU_CPU_WORKER, 0, 1, -1); if(starpu_worker_get_count_by_type(STARPU_CUDA_WORKER) != 0) { per_arch = starpu_perfmodel_get_model_per_devices(model, 0, STARPU_CUDA_WORKER, 0, 1, -1); per_arch->cost_function = cuda_cost_function; } } starpu-1.2.3+dfsg/examples/cholesky/cholesky_tag.c000066400000000000000000000220001320135501600222170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2017 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This version of the Cholesky factorization uses explicit dependency * declaration through dependency tags. * It also uses data partitioning to split the matrix into submatrices */ #include "cholesky.h" #include #if defined(STARPU_USE_CUDA) && defined(STARPU_HAVE_MAGMA) #include "magma.h" #endif /* * Some useful functions */ static struct starpu_task *create_task(starpu_tag_t id) { struct starpu_task *task = starpu_task_create(); task->cl_arg = NULL; task->use_tag = 1; task->tag_id = id; return task; } /* * Create the codelets */ static struct starpu_task * create_task_11(starpu_data_handle_t dataA, unsigned k) { /* FPRINTF(stdout, "task 11 k = %d TAG = %llx\n", k, (TAG11(k))); */ struct starpu_task *task = create_task(TAG11(k)); task->cl = &cl11; /* which sub-data is manipulated ? */ task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, k); /* this is an important task */ if (!noprio) task->priority = STARPU_MAX_PRIO; /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG11(k), 1, TAG22(k-1, k, k)); } int n = starpu_matrix_get_nx(task->handles[0]); task->flops = FLOPS_SPOTRF(n); return task; } static void create_task_21(starpu_data_handle_t dataA, unsigned k, unsigned j) { struct starpu_task *task = create_task(TAG21(k, j)); task->cl = &cl21; /* which sub-data is manipulated ? */ task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, k); task->handles[1] = starpu_data_get_sub_data(dataA, 2, k, j); if (!noprio && (j == k+1)) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG21(k, j), 2, TAG11(k), TAG22(k-1, k, j)); } else { starpu_tag_declare_deps(TAG21(k, j), 1, TAG11(k)); } int n = starpu_matrix_get_nx(task->handles[0]); task->flops = FLOPS_STRSM(n, n); int ret = starpu_task_submit(task); if (STARPU_UNLIKELY(ret == -ENODEV)) { FPRINTF(stderr, "No worker may execute this task\n"); exit(0); } } static void create_task_22(starpu_data_handle_t dataA, unsigned k, unsigned i, unsigned j) { /* FPRINTF(stdout, "task 22 k,i,j = %d,%d,%d TAG = %llx\n", k,i,j, TAG22(k,i,j)); */ struct starpu_task *task = create_task(TAG22(k, i, j)); task->cl = &cl22; /* which sub-data is manipulated ? */ task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, i); task->handles[1] = starpu_data_get_sub_data(dataA, 2, k, j); task->handles[2] = starpu_data_get_sub_data(dataA, 2, i, j); if (!noprio && (i == k + 1) && (j == k +1) ) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG22(k, i, j), 3, TAG22(k-1, i, j), TAG21(k, i), TAG21(k, j)); } else { starpu_tag_declare_deps(TAG22(k, i, j), 2, TAG21(k, i), TAG21(k, j)); } int n = starpu_matrix_get_nx(task->handles[0]); task->flops = FLOPS_SGEMM(n, n, n); int ret = starpu_task_submit(task); if (STARPU_UNLIKELY(ret == -ENODEV)) { FPRINTF(stderr, "No worker may execute this task\n"); exit(0); } } /* * code to bootstrap the factorization * and construct the DAG */ static void _cholesky(starpu_data_handle_t dataA, unsigned nblocks) { double start; double end; struct starpu_task *entry_task = NULL; /* create all the DAG nodes */ unsigned i,j,k; start = starpu_timing_now(); for (k = 0; k < nblocks; k++) { starpu_iteration_push(k); struct starpu_task *task = create_task_11(dataA, k); /* we defer the launch of the first task */ if (k == 0) { entry_task = task; } else { int ret = starpu_task_submit(task); if (STARPU_UNLIKELY(ret == -ENODEV)) { FPRINTF(stderr, "No worker may execute this task\n"); exit(0); } } for (j = k+1; jcl_arg = NULL; task->use_tag = 1; task->tag_id = id; return task; } /* * Create the codelets */ static struct starpu_task * create_task_11(unsigned k, unsigned nblocks) { /* FPRINTF(stdout, "task 11 k = %d TAG = %llx\n", k, (TAG11(k))); */ struct starpu_task *task = create_task(TAG11(k)); task->cl = &cl11; /* which sub-data is manipulated ? */ task->handles[0] = A_state[k][k]; /* this is an important task */ task->priority = STARPU_MAX_PRIO; /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG11(k), 1, TAG22(k-1, k, k)); } int n = starpu_matrix_get_nx(task->handles[0]); task->flops = FLOPS_SPOTRF(n); return task; } static int create_task_21(unsigned k, unsigned j) { int ret; struct starpu_task *task = create_task(TAG21(k, j)); task->cl = &cl21; /* which sub-data is manipulated ? */ task->handles[0] = A_state[k][k]; task->handles[1] = A_state[j][k]; if (j == k+1) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG21(k, j), 2, TAG11(k), TAG22(k-1, k, j)); } else { starpu_tag_declare_deps(TAG21(k, j), 1, TAG11(k)); } int n = starpu_matrix_get_nx(task->handles[0]); task->flops = FLOPS_STRSM(n, n); ret = starpu_task_submit(task); if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); return ret; } static int create_task_22(unsigned k, unsigned i, unsigned j) { int ret; /* FPRINTF(stdout, "task 22 k,i,j = %d,%d,%d TAG = %llx\n", k,i,j, TAG22(k,i,j)); */ struct starpu_task *task = create_task(TAG22(k, i, j)); task->cl = &cl22; /* which sub-data is manipulated ? */ task->handles[0] = A_state[i][k]; task->handles[1] = A_state[j][k]; task->handles[2] = A_state[j][i]; if ( (i == k + 1) && (j == k +1) ) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG22(k, i, j), 3, TAG22(k-1, i, j), TAG21(k, i), TAG21(k, j)); } else { starpu_tag_declare_deps(TAG22(k, i, j), 2, TAG21(k, i), TAG21(k, j)); } int n = starpu_matrix_get_nx(task->handles[0]); task->flops = FLOPS_SGEMM(n, n, n); ret = starpu_task_submit(task); if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); return ret; } /* * code to bootstrap the factorization * and construct the DAG */ static int cholesky_no_stride(void) { int ret; double start; double end; struct starpu_task *entry_task = NULL; /* create all the DAG nodes */ unsigned i,j,k; for (k = 0; k < nblocks; k++) { starpu_iteration_push(k); struct starpu_task *task = create_task_11(k, nblocks); /* we defer the launch of the first task */ if (k == 0) { entry_task = task; } else { ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } for (j = k+1; j #include #include #include "blas.h" /* This files contains BLAS wrappers for the different BLAS implementations (eg. REFBLAS, ATLAS, GOTOBLAS ...). We assume a Fortran orientation as most libraries do not supply C-based ordering. */ #ifdef STARPU_ATLAS inline void STARPU_SGEMM(char *transa, char *transb, int M, int N, int K, float alpha, const float *A, int lda, const float *B, int ldb, float beta, float *C, int ldc) { enum CBLAS_TRANSPOSE ta = (toupper(transa[0]) == 'N')?CblasNoTrans:CblasTrans; enum CBLAS_TRANSPOSE tb = (toupper(transb[0]) == 'N')?CblasNoTrans:CblasTrans; cblas_sgemm(CblasColMajor, ta, tb, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc); } inline void STARPU_DGEMM(char *transa, char *transb, int M, int N, int K, double alpha, double *A, int lda, double *B, int ldb, double beta, double *C, int ldc) { enum CBLAS_TRANSPOSE ta = (toupper(transa[0]) == 'N')?CblasNoTrans:CblasTrans; enum CBLAS_TRANSPOSE tb = (toupper(transb[0]) == 'N')?CblasNoTrans:CblasTrans; cblas_dgemm(CblasColMajor, ta, tb, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc); } inline void STARPU_SGEMV(char *transa, int M, int N, float alpha, float *A, int lda, float *X, int incX, float beta, float *Y, int incY) { enum CBLAS_TRANSPOSE ta = (toupper(transa[0]) == 'N')?CblasNoTrans:CblasTrans; cblas_sgemv(CblasColMajor, ta, M, N, alpha, A, lda, X, incX, beta, Y, incY); } inline void STARPU_DGEMV(char *transa, int M, int N, double alpha, double *A, int lda, double *X, int incX, double beta, double *Y, int incY) { enum CBLAS_TRANSPOSE ta = (toupper(transa[0]) == 'N')?CblasNoTrans:CblasTrans; cblas_dgemv(CblasColMajor, ta, M, N, alpha, A, lda, X, incX, beta, Y, incY); } inline float STARPU_SASUM(int N, float *X, int incX) { return cblas_sasum(N, X, incX); } inline double STARPU_DASUM(int N, double *X, int incX) { return cblas_dasum(N, X, incX); } void STARPU_SSCAL(int N, float alpha, float *X, int incX) { cblas_sscal(N, alpha, X, incX); } void STARPU_DSCAL(int N, double alpha, double *X, int incX) { cblas_dscal(N, alpha, X, incX); } void STARPU_STRSM (const char *side, const char *uplo, const char *transa, const char *diag, const int m, const int n, const float alpha, const float *A, const int lda, float *B, const int ldb) { enum CBLAS_SIDE side_ = (toupper(side[0]) == 'L')?CblasLeft:CblasRight; enum CBLAS_UPLO uplo_ = (toupper(uplo[0]) == 'U')?CblasUpper:CblasLower; enum CBLAS_TRANSPOSE transa_ = (toupper(transa[0]) == 'N')?CblasNoTrans:CblasTrans; enum CBLAS_DIAG diag_ = (toupper(diag[0]) == 'N')?CblasNonUnit:CblasUnit; cblas_strsm(CblasColMajor, side_, uplo_, transa_, diag_, m, n, alpha, A, lda, B, ldb); } void STARPU_DTRSM (const char *side, const char *uplo, const char *transa, const char *diag, const int m, const int n, const double alpha, const double *A, const int lda, double *B, const int ldb) { enum CBLAS_SIDE side_ = (toupper(side[0]) == 'L')?CblasLeft:CblasRight; enum CBLAS_UPLO uplo_ = (toupper(uplo[0]) == 'U')?CblasUpper:CblasLower; enum CBLAS_TRANSPOSE transa_ = (toupper(transa[0]) == 'N')?CblasNoTrans:CblasTrans; enum CBLAS_DIAG diag_ = (toupper(diag[0]) == 'N')?CblasNonUnit:CblasUnit; cblas_dtrsm(CblasColMajor, side_, uplo_, transa_, diag_, m, n, alpha, A, lda, B, ldb); } void STARPU_SSYR (const char *uplo, const int n, const float alpha, const float *x, const int incx, float *A, const int lda) { enum CBLAS_UPLO uplo_ = (toupper(uplo[0]) == 'U')?CblasUpper:CblasLower; cblas_ssyr(CblasColMajor, uplo_, n, alpha, x, incx, A, lda); } void STARPU_SSYRK (const char *uplo, const char *trans, const int n, const int k, const float alpha, const float *A, const int lda, const float beta, float *C, const int ldc) { enum CBLAS_UPLO uplo_ = (toupper(uplo[0]) == 'U')?CblasUpper:CblasLower; enum CBLAS_TRANSPOSE trans_ = (toupper(trans[0]) == 'N')?CblasNoTrans:CblasTrans; cblas_ssyrk(CblasColMajor, uplo_, trans_, n, k, alpha, A, lda, beta, C, ldc); } void STARPU_SGER(const int m, const int n, const float alpha, const float *x, const int incx, const float *y, const int incy, float *A, const int lda) { cblas_sger(CblasColMajor, m, n, alpha, x, incx, y, incy, A, lda); } void STARPU_DGER(const int m, const int n, const double alpha, const double *x, const int incx, const double *y, const int incy, double *A, const int lda) { cblas_dger(CblasColMajor, m, n, alpha, x, incx, y, incy, A, lda); } void STARPU_STRSV (const char *uplo, const char *trans, const char *diag, const int n, const float *A, const int lda, float *x, const int incx) { enum CBLAS_UPLO uplo_ = (toupper(uplo[0]) == 'U')?CblasUpper:CblasLower; enum CBLAS_TRANSPOSE trans_ = (toupper(trans[0]) == 'N')?CblasNoTrans:CblasTrans; enum CBLAS_DIAG diag_ = (toupper(diag[0]) == 'N')?CblasNonUnit:CblasUnit; cblas_strsv(CblasColMajor, uplo_, trans_, diag_, n, A, lda, x, incx); } void STARPU_STRMM(const char *side, const char *uplo, const char *transA, const char *diag, const int m, const int n, const float alpha, const float *A, const int lda, float *B, const int ldb) { enum CBLAS_SIDE side_ = (toupper(side[0]) == 'L')?CblasLeft:CblasRight; enum CBLAS_UPLO uplo_ = (toupper(uplo[0]) == 'U')?CblasUpper:CblasLower; enum CBLAS_TRANSPOSE transA_ = (toupper(transA[0]) == 'N')?CblasNoTrans:CblasTrans; enum CBLAS_DIAG diag_ = (toupper(diag[0]) == 'N')?CblasNonUnit:CblasUnit; cblas_strmm(CblasColMajor, side_, uplo_, transA_, diag_, m, n, alpha, A, lda, B, ldb); } void STARPU_DTRMM(const char *side, const char *uplo, const char *transA, const char *diag, const int m, const int n, const double alpha, const double *A, const int lda, double *B, const int ldb) { enum CBLAS_SIDE side_ = (toupper(side[0]) == 'L')?CblasLeft:CblasRight; enum CBLAS_UPLO uplo_ = (toupper(uplo[0]) == 'U')?CblasUpper:CblasLower; enum CBLAS_TRANSPOSE transA_ = (toupper(transA[0]) == 'N')?CblasNoTrans:CblasTrans; enum CBLAS_DIAG diag_ = (toupper(diag[0]) == 'N')?CblasNonUnit:CblasUnit; cblas_dtrmm(CblasColMajor, side_, uplo_, transA_, diag_, m, n, alpha, A, lda, B, ldb); } void STARPU_STRMV(const char *uplo, const char *transA, const char *diag, const int n, const float *A, const int lda, float *X, const int incX) { enum CBLAS_UPLO uplo_ = (toupper(uplo[0]) == 'U')?CblasUpper:CblasLower; enum CBLAS_TRANSPOSE transA_ = (toupper(transA[0]) == 'N')?CblasNoTrans:CblasTrans; enum CBLAS_DIAG diag_ = (toupper(diag[0]) == 'N')?CblasNonUnit:CblasUnit; cblas_strmv(CblasColMajor, uplo_, transA_, diag_, n, A, lda, X, incX); } void STARPU_SAXPY(const int n, const float alpha, float *X, const int incX, float *Y, const int incY) { cblas_saxpy(n, alpha, X, incX, Y, incY); } void STARPU_DAXPY(const int n, const double alpha, double *X, const int incX, double *Y, const int incY) { cblas_daxpy(n, alpha, X, incX, Y, incY); } int STARPU_ISAMAX (const int n, float *X, const int incX) { int retVal; retVal = cblas_isamax(n, X, incX); return retVal; } int STARPU_IDAMAX (const int n, double *X, const int incX) { int retVal; retVal = cblas_idamax(n, X, incX); return retVal; } float STARPU_SDOT(const int n, const float *x, const int incx, const float *y, const int incy) { return cblas_sdot(n, x, incx, y, incy); } double STARPU_DDOT(const int n, const double *x, const int incx, const double *y, const int incy) { return cblas_ddot(n, x, incx, y, incy); } void STARPU_SSWAP(const int n, float *x, const int incx, float *y, const int incy) { cblas_sswap(n, x, incx, y, incy); } void STARPU_DSWAP(const int n, double *x, const int incx, double *y, const int incy) { cblas_dswap(n, x, incx, y, incy); } #elif defined(STARPU_GOTO) || defined(STARPU_SYSTEM_BLAS) || defined(STARPU_MKL) inline void STARPU_SGEMM(char *transa, char *transb, int M, int N, int K, float alpha, const float *A, int lda, const float *B, int ldb, float beta, float *C, int ldc) { sgemm_(transa, transb, &M, &N, &K, &alpha, A, &lda, B, &ldb, &beta, C, &ldc); } inline void STARPU_DGEMM(char *transa, char *transb, int M, int N, int K, double alpha, double *A, int lda, double *B, int ldb, double beta, double *C, int ldc) { dgemm_(transa, transb, &M, &N, &K, &alpha, A, &lda, B, &ldb, &beta, C, &ldc); } inline void STARPU_SGEMV(char *transa, int M, int N, float alpha, float *A, int lda, float *X, int incX, float beta, float *Y, int incY) { sgemv_(transa, &M, &N, &alpha, A, &lda, X, &incX, &beta, Y, &incY); } inline void STARPU_DGEMV(char *transa, int M, int N, double alpha, double *A, int lda, double *X, int incX, double beta, double *Y, int incY) { dgemv_(transa, &M, &N, &alpha, A, &lda, X, &incX, &beta, Y, &incY); } inline float STARPU_SASUM(int N, float *X, int incX) { return sasum_(&N, X, &incX); } inline double STARPU_DASUM(int N, double *X, int incX) { return dasum_(&N, X, &incX); } void STARPU_SSCAL(int N, float alpha, float *X, int incX) { sscal_(&N, &alpha, X, &incX); } void STARPU_DSCAL(int N, double alpha, double *X, int incX) { dscal_(&N, &alpha, X, &incX); } void STARPU_STRSM (const char *side, const char *uplo, const char *transa, const char *diag, const int m, const int n, const float alpha, const float *A, const int lda, float *B, const int ldb) { strsm_(side, uplo, transa, diag, &m, &n, &alpha, A, &lda, B, &ldb); } void STARPU_DTRSM (const char *side, const char *uplo, const char *transa, const char *diag, const int m, const int n, const double alpha, const double *A, const int lda, double *B, const int ldb) { dtrsm_(side, uplo, transa, diag, &m, &n, &alpha, A, &lda, B, &ldb); } void STARPU_SSYR (const char *uplo, const int n, const float alpha, const float *x, const int incx, float *A, const int lda) { ssyr_(uplo, &n, &alpha, x, &incx, A, &lda); } void STARPU_SSYRK (const char *uplo, const char *trans, const int n, const int k, const float alpha, const float *A, const int lda, const float beta, float *C, const int ldc) { ssyrk_(uplo, trans, &n, &k, &alpha, A, &lda, &beta, C, &ldc); } void STARPU_SGER(const int m, const int n, const float alpha, const float *x, const int incx, const float *y, const int incy, float *A, const int lda) { sger_(&m, &n, &alpha, x, &incx, y, &incy, A, &lda); } void STARPU_DGER(const int m, const int n, const double alpha, const double *x, const int incx, const double *y, const int incy, double *A, const int lda) { dger_(&m, &n, &alpha, x, &incx, y, &incy, A, &lda); } void STARPU_STRSV (const char *uplo, const char *trans, const char *diag, const int n, const float *A, const int lda, float *x, const int incx) { strsv_(uplo, trans, diag, &n, A, &lda, x, &incx); } void STARPU_STRMM(const char *side, const char *uplo, const char *transA, const char *diag, const int m, const int n, const float alpha, const float *A, const int lda, float *B, const int ldb) { strmm_(side, uplo, transA, diag, &m, &n, &alpha, A, &lda, B, &ldb); } void STARPU_DTRMM(const char *side, const char *uplo, const char *transA, const char *diag, const int m, const int n, const double alpha, const double *A, const int lda, double *B, const int ldb) { dtrmm_(side, uplo, transA, diag, &m, &n, &alpha, A, &lda, B, &ldb); } void STARPU_STRMV(const char *uplo, const char *transA, const char *diag, const int n, const float *A, const int lda, float *X, const int incX) { strmv_(uplo, transA, diag, &n, A, &lda, X, &incX); } void STARPU_SAXPY(const int n, const float alpha, float *X, const int incX, float *Y, const int incY) { saxpy_(&n, &alpha, X, &incX, Y, &incY); } void STARPU_DAXPY(const int n, const double alpha, double *X, const int incX, double *Y, const int incY) { daxpy_(&n, &alpha, X, &incX, Y, &incY); } int STARPU_ISAMAX (const int n, float *X, const int incX) { int retVal; retVal = isamax_ (&n, X, &incX); return retVal; } int STARPU_IDAMAX (const int n, double *X, const int incX) { int retVal; retVal = idamax_ (&n, X, &incX); return retVal; } float STARPU_SDOT(const int n, const float *x, const int incx, const float *y, const int incy) { float retVal = 0; /* GOTOBLAS will return a FLOATRET which is a double, not a float */ retVal = (float)sdot_(&n, x, &incx, y, &incy); return retVal; } double STARPU_DDOT(const int n, const double *x, const int incx, const double *y, const int incy) { return ddot_(&n, x, &incx, y, &incy); } void STARPU_SSWAP(const int n, float *X, const int incX, float *Y, const int incY) { sswap_(&n, X, &incX, Y, &incY); } void STARPU_DSWAP(const int n, double *X, const int incX, double *Y, const int incY) { dswap_(&n, X, &incX, Y, &incY); } #ifdef STARPU_MKL void STARPU_SPOTRF(const char*uplo, const int n, float *a, const int lda) { int info = 0; spotrf_(uplo, &n, a, &lda, &info); } void STARPU_DPOTRF(const char*uplo, const int n, double *a, const int lda) { int info = 0; dpotrf_(uplo, &n, a, &lda, &info); } #endif #elif defined(STARPU_SIMGRID) inline void STARPU_SGEMM(char *transa, char *transb, int M, int N, int K, float alpha, const float *A, int lda, const float *B, int ldb, float beta, float *C, int ldc) { } inline void STARPU_DGEMM(char *transa, char *transb, int M, int N, int K, double alpha, double *A, int lda, double *B, int ldb, double beta, double *C, int ldc) { } inline void STARPU_SGEMV(char *transa, int M, int N, float alpha, float *A, int lda, float *X, int incX, float beta, float *Y, int incY) { } inline void STARPU_DGEMV(char *transa, int M, int N, double alpha, double *A, int lda, double *X, int incX, double beta, double *Y, int incY) { } inline float STARPU_SASUM(int N, float *X, int incX) { return 0.; } inline double STARPU_DASUM(int N, double *X, int incX) { return 0.; } void STARPU_SSCAL(int N, float alpha, float *X, int incX) { } void STARPU_DSCAL(int N, double alpha, double *X, int incX) { } void STARPU_STRSM (const char *side, const char *uplo, const char *transa, const char *diag, const int m, const int n, const float alpha, const float *A, const int lda, float *B, const int ldb) { } void STARPU_DTRSM (const char *side, const char *uplo, const char *transa, const char *diag, const int m, const int n, const double alpha, const double *A, const int lda, double *B, const int ldb) { } void STARPU_SSYR (const char *uplo, const int n, const float alpha, const float *x, const int incx, float *A, const int lda) { } void STARPU_SSYRK (const char *uplo, const char *trans, const int n, const int k, const float alpha, const float *A, const int lda, const float beta, float *C, const int ldc) { } void STARPU_SGER(const int m, const int n, const float alpha, const float *x, const int incx, const float *y, const int incy, float *A, const int lda) { } void STARPU_DGER(const int m, const int n, const double alpha, const double *x, const int incx, const double *y, const int incy, double *A, const int lda) { } void STARPU_STRSV (const char *uplo, const char *trans, const char *diag, const int n, const float *A, const int lda, float *x, const int incx) { } void STARPU_STRMM(const char *side, const char *uplo, const char *transA, const char *diag, const int m, const int n, const float alpha, const float *A, const int lda, float *B, const int ldb) { } void STARPU_DTRMM(const char *side, const char *uplo, const char *transA, const char *diag, const int m, const int n, const double alpha, const double *A, const int lda, double *B, const int ldb) { } void STARPU_STRMV(const char *uplo, const char *transA, const char *diag, const int n, const float *A, const int lda, float *X, const int incX) { } void STARPU_SAXPY(const int n, const float alpha, float *X, const int incX, float *Y, const int incY) { } void STARPU_DAXPY(const int n, const double alpha, double *X, const int incX, double *Y, const int incY) { } int STARPU_ISAMAX (const int n, float *X, const int incX) { return 0; } int STARPU_IDAMAX (const int n, double *X, const int incX) { return 0; } float STARPU_SDOT(const int n, const float *x, const int incx, const float *y, const int incy) { return 0.; } double STARPU_DDOT(const int n, const double *x, const int incx, const double *y, const int incy) { return 0.; } void STARPU_SSWAP(const int n, float *X, const int incX, float *Y, const int incY) { } void STARPU_DSWAP(const int n, double *X, const int incX, double *Y, const int incY) { } void STARPU_SPOTRF(const char*uplo, const int n, float *a, const int lda) { } void STARPU_DPOTRF(const char*uplo, const int n, double *a, const int lda) { } #else #error "no BLAS lib available..." #endif starpu-1.2.3+dfsg/examples/common/blas.h000066400000000000000000000225021320135501600201470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __BLAS_H__ #define __BLAS_H__ #include #ifdef STARPU_ATLAS #include #endif void STARPU_SGEMM(char *transa, char *transb, int M, int N, int K, float alpha, const float *A, int lda, const float *B, int ldb, float beta, float *C, int ldc); void STARPU_DGEMM(char *transa, char *transb, int M, int N, int K, double alpha, double *A, int lda, double *B, int ldb, double beta, double *C, int ldc); void STARPU_SGEMV(char *transa, int M, int N, float alpha, float *A, int lda, float *X, int incX, float beta, float *Y, int incY); void STARPU_DGEMV(char *transa, int M, int N, double alpha, double *A, int lda, double *X, int incX, double beta, double *Y, int incY); float STARPU_SASUM(int N, float *X, int incX); double STARPU_DASUM(int N, double *X, int incX); void STARPU_SSCAL(int N, float alpha, float *X, int incX); void STARPU_DSCAL(int N, double alpha, double *X, int incX); void STARPU_STRSM (const char *side, const char *uplo, const char *transa, const char *diag, const int m, const int n, const float alpha, const float *A, const int lda, float *B, const int ldb); void STARPU_DTRSM (const char *side, const char *uplo, const char *transa, const char *diag, const int m, const int n, const double alpha, const double *A, const int lda, double *B, const int ldb); void STARPU_DGEMM(char *transa, char *transb, int M, int N, int K, double alpha, double *A, int lda, double *B, int ldb, double beta, double *C, int ldc); void STARPU_SSYR (const char *uplo, const int n, const float alpha, const float *x, const int incx, float *A, const int lda); void STARPU_SSYRK (const char *uplo, const char *trans, const int n, const int k, const float alpha, const float *A, const int lda, const float beta, float *C, const int ldc); void STARPU_SGER (const int m, const int n, const float alpha, const float *x, const int incx, const float *y, const int incy, float *A, const int lda); void STARPU_DGER(const int m, const int n, const double alpha, const double *x, const int incx, const double *y, const int incy, double *A, const int lda); void STARPU_STRSV (const char *uplo, const char *trans, const char *diag, const int n, const float *A, const int lda, float *x, const int incx); void STARPU_STRMM(const char *side, const char *uplo, const char *transA, const char *diag, const int m, const int n, const float alpha, const float *A, const int lda, float *B, const int ldb); void STARPU_DTRMM(const char *side, const char *uplo, const char *transA, const char *diag, const int m, const int n, const double alpha, const double *A, const int lda, double *B, const int ldb); void STARPU_STRMV(const char *uplo, const char *transA, const char *diag, const int n, const float *A, const int lda, float *X, const int incX); void STARPU_SAXPY(const int n, const float alpha, float *X, const int incX, float *Y, const int incy); void STARPU_DAXPY(const int n, const double alpha, double *X, const int incX, double *Y, const int incY); int STARPU_ISAMAX (const int n, float *X, const int incX); int STARPU_IDAMAX (const int n, double *X, const int incX); float STARPU_SDOT(const int n, const float *x, const int incx, const float *y, const int incy); double STARPU_DDOT(const int n, const double *x, const int incx, const double *y, const int incy); void STARPU_SSWAP(const int n, float *x, const int incx, float *y, const int incy); void STARPU_DSWAP(const int n, double *x, const int incx, double *y, const int incy); #ifdef STARPU_MKL void STARPU_SPOTRF(const char*uplo, const int n, float *a, const int lda); void STARPU_DPOTRF(const char*uplo, const int n, double *a, const int lda); #endif #if defined(STARPU_GOTO) || defined(STARPU_SYSTEM_BLAS) || defined(STARPU_MKL) extern void sgemm_ (const char *transa, const char *transb, const int *m, const int *n, const int *k, const float *alpha, const float *A, const int *lda, const float *B, const int *ldb, const float *beta, float *C, const int *ldc); extern void dgemm_ (const char *transa, const char *transb, const int *m, const int *n, const int *k, const double *alpha, const double *A, const int *lda, const double *B, const int *ldb, const double *beta, double *C, const int *ldc); extern void sgemv_(const char *trans, const int *m, const int *n, const float *alpha, const float *a, const int *lda, const float *x, const int *incx, const float *beta, float *y, const int *incy); extern void dgemv_(const char *trans, const int *m, const int *n, const double *alpha, const double *a, const int *lda, const double *x, const int *incx, const double *beta, double *y, const int *incy); extern void ssyr_ (const char *uplo, const int *n, const float *alpha, const float *x, const int *incx, float *A, const int *lda); extern void ssyrk_ (const char *uplo, const char *trans, const int *n, const int *k, const float *alpha, const float *A, const int *lda, const float *beta, float *C, const int *ldc); extern void strsm_ (const char *side, const char *uplo, const char *transa, const char *diag, const int *m, const int *n, const float *alpha, const float *A, const int *lda, float *B, const int *ldb); extern void dtrsm_ (const char *side, const char *uplo, const char *transa, const char *diag, const int *m, const int *n, const double *alpha, const double *A, const int *lda, double *B, const int *ldb); extern double sasum_ (const int *n, const float *x, const int *incx); extern double dasum_ (const int *n, const double *x, const int *incx); extern void sscal_ (const int *n, const float *alpha, float *x, const int *incx); extern void dscal_ (const int *n, const double *alpha, double *x, const int *incx); extern void sger_(const int *m, const int *n, const float *alpha, const float *x, const int *incx, const float *y, const int *incy, float *A, const int *lda); extern void dger_(const int *m, const int *n, const double *alpha, const double *x, const int *incx, const double *y, const int *incy, double *A, const int *lda); extern void strsv_ (const char *uplo, const char *trans, const char *diag, const int *n, const float *A, const int *lda, float *x, const int *incx); extern void strmm_(const char *side, const char *uplo, const char *transA, const char *diag, const int *m, const int *n, const float *alpha, const float *A, const int *lda, float *B, const int *ldb); extern void dtrmm_(const char *side, const char *uplo, const char *transA, const char *diag, const int *m, const int *n, const double *alpha, const double *A, const int *lda, double *B, const int *ldb); extern void strmv_(const char *uplo, const char *transA, const char *diag, const int *n, const float *A, const int *lda, float *X, const int *incX); extern void saxpy_(const int *n, const float *alpha, const float *X, const int *incX, float *Y, const int *incy); extern void daxpy_(const int *n, const double *alpha, const double *X, const int *incX, double *Y, const int *incy); extern int isamax_(const int *n, const float *X, const int *incX); extern int idamax_(const int *n, const double *X, const int *incX); /* for some reason, FLOATRET is not a float but a double in GOTOBLAS */ extern double sdot_(const int *n, const float *x, const int *incx, const float *y, const int *incy); extern double ddot_(const int *n, const double *x, const int *incx, const double *y, const int *incy); extern void sswap_(const int *n, float *x, const int *incx, float *y, const int *incy); extern void dswap_(const int *n, double *x, const int *incx, double *y, const int *incy); #ifdef STARPU_MKL extern void spotrf_(const char*uplo, const int *n, float *a, const int *lda, int *info); extern void dpotrf_(const char*uplo, const int *n, double *a, const int *lda, int *info); #endif #endif #endif /* __BLAS_H__ */ starpu-1.2.3+dfsg/examples/common/blas_model.c000066400000000000000000000024351320135501600213250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "blas_model.h" #include /* * As a convention, in that file, descr[0] is represented by A, * descr[1] is B ... */ /* * Number of flops of Gemm */ double gemm_cost(struct starpu_task *task, unsigned nimpl) { /* C = A * B */ uint32_t nxC, nyC, nxA; nxC = starpu_matrix_get_nx(task->descr[2].handle); nyC = starpu_matrix_get_ny(task->descr[2].handle); nxA = starpu_matrix_get_nx(task->descr[0].handle); /* printf("nxC %d nxC %d nxA %d\n", nxC, nyC, nxA); */ double cost = ((double)nxC)*((double)nyC)*((double)nxA/1000.0f/4.11f); /* printf("cost %e \n", cost); */ return cost; } starpu-1.2.3+dfsg/examples/common/blas_model.h000066400000000000000000000027731320135501600213370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __BLAS_MODEL_H__ #define __BLAS_MODEL_H__ #include double gemm_cost(struct starpu_task *task, unsigned nimpl); static struct starpu_perfmodel starpu_sgemm_model = { .type = STARPU_HISTORY_BASED, #ifdef STARPU_ATLAS .symbol = "sgemm_atlas" #elif defined(STARPU_GOTO) .symbol = "sgemm_goto" #else .symbol = "sgemm" #endif }; static struct starpu_perfmodel starpu_sgemm_model_common = { .cost_function = gemm_cost, .type = STARPU_COMMON, }; static struct starpu_perfmodel starpu_dgemm_model = { .type = STARPU_HISTORY_BASED, #ifdef STARPU_ATLAS .symbol = "dgemm_atlas" #elif defined(STARPU_GOTO) .symbol = "dgemm_goto" #else .symbol = "dgemm" #endif }; static struct starpu_perfmodel starpu_dgemm_model_common = { .cost_function = gemm_cost, .type = STARPU_COMMON, }; #endif /* __BLAS_MODEL_H__ */ starpu-1.2.3+dfsg/examples/cpp/000077500000000000000000000000001320135501600163465ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/cpp/incrementer_cpp.cpp000066400000000000000000000067151320135501600222400ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011, 2013-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014 CNRS * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This is a small example of a C++ program using starpu. We here just * increment two values of a vector several times. */ #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #ifdef STARPU_USE_CUDA extern "C" void cuda_codelet(void *descr[], __attribute__ ((unused)) void *_args); #endif #ifdef STARPU_USE_OPENCL extern "C" void opencl_codelet(void *descr[], __attribute__ ((unused)) void *_args); struct starpu_opencl_program opencl_program; #endif extern "C" void cpu_codelet(void *descr[], __attribute__ ((unused)) void *_args) { float *val = (float *)STARPU_VECTOR_GET_PTR(descr[0]); val[0] += 1.0f; val[1] += 1.0f; } int main(int argc, char **argv) { int ret = 0; starpu_data_handle_t float_array_handle; float float_array[4] __attribute__ ((aligned (16))) = { 0.0f, 0.0f, 0.0f, 0.0f}; struct starpu_codelet cl; unsigned i; unsigned niter = 50; ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_vector_data_register(&float_array_handle, STARPU_MAIN_RAM, (uintptr_t)&float_array, 4, sizeof(float)); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_load_opencl_from_file("examples/incrementer/incrementer_kernels_opencl_kernel.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif starpu_codelet_init(&cl); cl.cpu_funcs[0] = cpu_codelet; cl.cpu_funcs_name[0] = "cpu_codelet"; #ifdef STARPU_USE_CUDA cl.cuda_funcs[0] = cuda_codelet; cl.cuda_flags[0] = STARPU_CUDA_ASYNC; #endif #ifdef STARPU_USE_OPENCL cl.opencl_funcs[0] = opencl_codelet; cl.opencl_flags[0] = STARPU_OPENCL_ASYNC; #endif cl.nbuffers = 1; cl.modes[0] = STARPU_RW; cl.name = "incrementer"; for (i = 0; i < niter; i++) { ret = starpu_task_insert(&cl, STARPU_RW, float_array_handle, STARPU_TAG_ONLY, (starpu_tag_t) i, 0); if (STARPU_UNLIKELY(ret == -ENODEV)) { FPRINTF(stderr, "No worker may execute this task\n"); exit(77); } } starpu_task_wait_for_all(); /* update the array in RAM */ starpu_data_unregister(float_array_handle); FPRINTF(stderr, "array -> %f, %f, %f, %f\n", float_array[0], float_array[1], float_array[2], float_array[3]); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); #endif starpu_shutdown(); if (float_array[0] != niter || float_array[0] != float_array[1] + float_array[2] + float_array[3]) { FPRINTF(stderr, "Incorrect result\n"); return EXIT_FAILURE; } return EXIT_SUCCESS; } starpu-1.2.3+dfsg/examples/filters/000077500000000000000000000000001320135501600172345ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/filters/custom_mf/000077500000000000000000000000001320135501600212305ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/filters/custom_mf/conversion.cu000066400000000000000000000026421320135501600237520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "custom_types.h" #include "custom_interface.h" static __global__ void custom_cuda(struct point *aop, unsigned n, float *x, float *y) { unsigned i = blockIdx.x*blockDim.x + threadIdx.x; if (i < n) { x[i] = aop[i].x; y[i] = aop[i].y; } } extern "C" void cpu_to_cuda_cuda_func(void *buffers[], void *_args) { (void) _args; unsigned int n = CUSTOM_GET_NX(buffers[0]); float *x = (float*) CUSTOM_GET_X_PTR(buffers[0]); float *y = (float*) CUSTOM_GET_Y_PTR(buffers[0]); struct point *aop; aop = (struct point *) CUSTOM_GET_CPU_PTR(buffers[0]); unsigned threads_per_block = 64; unsigned nblocks = (n + threads_per_block-1) / threads_per_block; custom_cuda<<>>(aop, n, x, y); } starpu-1.2.3+dfsg/examples/filters/custom_mf/conversion_opencl.c000066400000000000000000000045711320135501600251300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "custom_types.h" #include "custom_interface.h" extern struct starpu_opencl_program _opencl_conversion_program; void cpu_to_opencl_opencl_func(void *buffers[], void *args) { (void) args; int id, devid; cl_int err; cl_kernel kernel; cl_command_queue queue; unsigned n = CUSTOM_GET_NX(buffers[0]); n*=2; struct point *aop; aop = (struct point *) CUSTOM_GET_CPU_PTR(buffers[0]); id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &_opencl_conversion_program, "custom_opencl_conversion", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); void *x = CUSTOM_GET_OPENCL_X_PTR(buffers[0]); if (starpu_opencl_set_kernel_args(&err, &kernel, sizeof(aop), &aop, sizeof(x), &x, sizeof(n), &n, 0) != 3) { STARPU_OPENCL_REPORT_ERROR(err); assert(0); } { size_t global=n; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local = global; err = clEnqueueNDRangeKernel( queue, kernel, 1, /* work_dim */ NULL, /* global_work_offset */ &global, /* global_work_size */ &local, /* local_work_size */ 0, /* num_events_in_wait_list */ NULL, /* event_wait_list */ NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } starpu_opencl_release_kernel(kernel); } starpu-1.2.3+dfsg/examples/filters/custom_mf/conversion_opencl.cl000066400000000000000000000017211320135501600252760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "custom_types.h" /* * The first n/2 values of x are actual xs. The last N/2 values are ys. */ __kernel void custom_opencl_conversion(__global struct point *aop, __global float *x, int nx) { const int i = get_global_id(0); if (i < nx/2) x[i] = aop[i].x; else if (i < nx) x[i] = aop[i-nx/2].y; } starpu-1.2.3+dfsg/examples/filters/custom_mf/cuda.cu000066400000000000000000000024341320135501600225000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "custom_types.h" #include "custom_interface.h" static __global__ void scal_cuda(unsigned n, float *x, float *y) { unsigned i = blockIdx.x*blockDim.x + threadIdx.x; if (i < n) x[i] *= y[i]; } extern "C" void custom_scal_cuda_func(void *buffers[], void *_args) { (void) _args; unsigned int n = CUSTOM_GET_NX(buffers[0]); float *x = (float*) CUSTOM_GET_X_PTR(buffers[0]); float *y = (float*) CUSTOM_GET_Y_PTR(buffers[0]); unsigned threads_per_block = 64; unsigned nblocks = (n + threads_per_block-1) / threads_per_block; scal_cuda<<>>(n, x, y); } starpu-1.2.3+dfsg/examples/filters/custom_mf/custom_conversion_codelets.c000066400000000000000000000044001320135501600270330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "custom_interface.h" #include "custom_types.h" #ifdef STARPU_USE_CUDA void cuda_to_cpu(void *buffers[], void *arg) { int n = CUSTOM_GET_NX(buffers[0]); float *x = (float*) CUSTOM_GET_X_PTR(buffers[0]); float *y = (float*) CUSTOM_GET_Y_PTR(buffers[0]); struct point *aop; aop = (struct point *) CUSTOM_GET_CPU_PTR(buffers[0]); int i; for (i = 0; i < n; i++) { aop[i].x = x[i]; aop[i].y = y[i]; } return; } extern void cpu_to_cuda_cuda_func(void *buffers[], void *args); struct starpu_codelet cpu_to_cuda_cl = { .cuda_funcs = {cpu_to_cuda_cuda_func}, .cuda_flags = {STARPU_CUDA_ASYNC}, .modes = { STARPU_RW }, .nbuffers = 1, .name = "codelet_cpu_to_cuda" }; struct starpu_codelet cuda_to_cpu_cl = { .cpu_funcs = {cuda_to_cpu}, .modes = { STARPU_RW }, .nbuffers = 1, .name = "codelet_cuda_to_cpu" }; #endif #ifdef STARPU_USE_OPENCL void opencl_to_cpu_cpu_func(void *buffers[], void *arg) { int n = CUSTOM_GET_NX(buffers[0]); float *x = (float *) CUSTOM_GET_OPENCL_X_PTR(buffers[0]); struct point *aop; aop = (struct point *) CUSTOM_GET_CPU_PTR(buffers[0]); int i; for (i = 0; i < n; i++) { aop[i].x = x[i]; aop[i].y = x[i+n]; } } extern void cpu_to_opencl_opencl_func(void *buffers[], void *arg); struct starpu_codelet cpu_to_opencl_cl = { .opencl_funcs = { cpu_to_opencl_opencl_func }, .opencl_flags = {STARPU_OPENCL_ASYNC}, .modes = { STARPU_RW }, .nbuffers = 1, .name = "codelet_cpu_to_opencl" }; struct starpu_codelet opencl_to_cpu_cl = { .cpu_funcs = { opencl_to_cpu_cpu_func }, .modes = { STARPU_RW }, .nbuffers = 1, .name = "codelet_opencl_to_cpu" }; #endif /* !STARPU_USE_OPENCL */ starpu-1.2.3+dfsg/examples/filters/custom_mf/custom_interface.c000066400000000000000000000336651320135501600247430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "custom_interface.h" #include "custom_types.h" #ifdef STARPU_USE_CUDA static int copy_ram_to_cuda_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cudaStream_t stream); static int copy_cuda_to_ram_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cudaStream_t stream); static int copy_cuda_to_cuda(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node); static int copy_cuda_to_cuda_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cudaStream_t stream); #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL static int copy_ram_to_opencl(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node); static int copy_opencl_to_ram(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node); static int copy_opencl_to_opencl(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node); static int copy_ram_to_opencl_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event); static int copy_opencl_to_ram_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event); #endif /* !STARPU_USE_OPENCL */ static const struct starpu_data_copy_methods custom_copy_data_methods_s = { .ram_to_ram = NULL, #ifdef STARPU_USE_CUDA .ram_to_cuda = NULL, .cuda_to_ram = NULL, .ram_to_cuda_async = copy_ram_to_cuda_async, .cuda_to_ram_async = copy_cuda_to_ram_async, .cuda_to_cuda = copy_cuda_to_cuda, .cuda_to_cuda_async = copy_cuda_to_cuda_async, #endif #ifdef STARPU_USE_OPENCL .ram_to_opencl = copy_ram_to_opencl, .opencl_to_ram = copy_opencl_to_ram, .opencl_to_opencl = copy_opencl_to_opencl, .ram_to_opencl_async = copy_ram_to_opencl_async, .opencl_to_ram_async = copy_opencl_to_ram_async, #endif }; static void register_custom_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface); static starpu_ssize_t allocate_custom_buffer_on_node(void *data_interface_, unsigned dst_node); static void* custom_handle_to_pointer(starpu_data_handle_t data_handle, unsigned node); static void free_custom_buffer_on_node(void *data_interface, unsigned node); static size_t custom_interface_get_size(starpu_data_handle_t handle); static uint32_t footprint_custom_interface_crc32(starpu_data_handle_t handle); static void display_custom_interface(starpu_data_handle_t handle, FILE *f); static uint32_t custom_get_nx(starpu_data_handle_t handle); static struct starpu_multiformat_data_interface_ops*get_mf_ops(void *data_interface) { struct custom_data_interface *custom; custom = (struct custom_data_interface *) data_interface; return custom->ops; } static struct starpu_data_interface_ops interface_custom_ops = { .register_data_handle = register_custom_handle, .allocate_data_on_node = allocate_custom_buffer_on_node, .handle_to_pointer = custom_handle_to_pointer, .free_data_on_node = free_custom_buffer_on_node, .copy_methods = &custom_copy_data_methods_s, .get_size = custom_interface_get_size, .footprint = footprint_custom_interface_crc32, .compare = NULL, .interfaceid = STARPU_UNKNOWN_INTERFACE_ID, .interface_size = sizeof(struct custom_data_interface), .display = display_custom_interface, .is_multiformat = 1, .get_mf_ops = get_mf_ops }; static void register_custom_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface) { struct custom_data_interface *custom_interface; custom_interface = (struct custom_data_interface *) data_interface; unsigned node; unsigned nnodes = starpu_memory_nodes_get_count(); for (node = 0; node < nnodes; node++) { struct custom_data_interface *local_interface = (struct custom_data_interface *) starpu_data_get_interface_on_node(handle, node); if (node == home_node) { local_interface->cpu_ptr = custom_interface->cpu_ptr; #ifdef STARPU_USE_CUDA local_interface->cuda_ptr = custom_interface->cuda_ptr; #endif #ifdef STARPU_USE_OPENCL local_interface->opencl_ptr = custom_interface->opencl_ptr; #endif } else { local_interface->cpu_ptr = NULL; #ifdef STARPU_USE_CUDA local_interface->cuda_ptr = NULL; #endif #ifdef STARPU_USE_OPENCL local_interface->opencl_ptr = NULL; #endif } local_interface->nx = custom_interface->nx; local_interface->ops = custom_interface->ops; } } static starpu_ssize_t allocate_custom_buffer_on_node(void *data_interface, unsigned node) { starpu_ssize_t size = 0; struct custom_data_interface *custom_interface; custom_interface = (struct custom_data_interface *) data_interface; size = custom_interface->nx * custom_interface->ops->cpu_elemsize; custom_interface->cpu_ptr = (void*) starpu_malloc_on_node(node, size); if (!custom_interface->cpu_ptr) goto fail_cpu; #ifdef STARPU_USE_CUDA custom_interface->cuda_ptr = (void*) starpu_malloc_on_node(node, size); if (!custom_interface->cuda_ptr) goto fail_cuda; #endif #ifdef STARPU_USE_OPENCL custom_interface->opencl_ptr = (void*) starpu_malloc_on_node(node, size); if (!custom_interface->opencl_ptr) goto fail_opencl; #endif return size #ifdef STARPU_USE_CUDA +size #endif #ifdef STARPU_USE_OPENCL +size #endif ; #ifdef STARPU_USE_OPENCL fail_opencl: #ifdef STARPU_USE_CUDA starpu_free_on_node(node, (uintptr_t) custom_interface->cuda_ptr, size); #endif #endif #ifdef STARPU_USE_CUDA fail_cuda: #endif starpu_free_on_node(node, (uintptr_t) custom_interface->cpu_ptr, size); fail_cpu: return -ENOMEM; } static void free_custom_buffer_on_node(void *data_interface, unsigned node) { struct custom_data_interface *custom_interface = (struct custom_data_interface *) data_interface; size_t size = custom_interface->nx * custom_interface->ops->cpu_elemsize; starpu_free_on_node(node, (uintptr_t) custom_interface->cpu_ptr, size); #ifdef STARPU_USE_CUDA starpu_free_on_node(node, (uintptr_t) custom_interface->cuda_ptr, size); #endif #ifdef STARPU_USE_OPENCL starpu_free_on_node(node, (uintptr_t) custom_interface->opencl_ptr, size); #endif } static void* custom_handle_to_pointer(starpu_data_handle_t handle, unsigned node) { struct custom_data_interface *data_interface = (struct custom_data_interface *) starpu_data_get_interface_on_node(handle, node); switch(starpu_node_get_kind(node)) { case STARPU_CPU_RAM: return data_interface->cpu_ptr; #ifdef STARPU_USE_CUDA case STARPU_CUDA_RAM: return data_interface->cuda_ptr; #endif #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_RAM: return data_interface->opencl_ptr; #endif default: assert(0); } } static size_t custom_interface_get_size(starpu_data_handle_t handle) { size_t size; struct custom_data_interface *data_interface; data_interface = (struct custom_data_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); size = data_interface->nx * data_interface->ops->cpu_elemsize; return size; } static uint32_t footprint_custom_interface_crc32(starpu_data_handle_t handle) { return starpu_hash_crc32c_be(custom_get_nx(handle), 0); } static void display_custom_interface(starpu_data_handle_t handle, FILE *f) { struct custom_data_interface *ci = (struct custom_data_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); fprintf(f, "Custom interface of size %u", ci->nx); } static uint32_t custom_get_nx(starpu_data_handle_t handle) { struct custom_data_interface *data_interface; data_interface = (struct custom_data_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); return data_interface->nx; } void custom_data_register(starpu_data_handle_t *handle, unsigned home_node, void *ptr, uint32_t nx, struct starpu_multiformat_data_interface_ops *format_ops) { struct custom_data_interface custom = { .cpu_ptr = ptr, #ifdef STARPU_USE_CUDA .cuda_ptr = NULL, #endif #ifdef STARPU_USE_OPENCL .opencl_ptr = NULL, #endif .nx = nx, .ops = format_ops }; if (interface_custom_ops.interfaceid == STARPU_UNKNOWN_INTERFACE_ID) { interface_custom_ops.interfaceid = starpu_data_interface_get_next_id(); } starpu_data_register(handle, home_node, &custom, &interface_custom_ops); } #ifdef STARPU_USE_CUDA static int copy_cuda_common_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cudaStream_t stream, enum cudaMemcpyKind kind) { struct custom_data_interface *src_custom, *dst_custom; src_custom = (struct custom_data_interface *) src_interface; dst_custom = (struct custom_data_interface *) dst_interface; starpu_ssize_t size = 0; cudaError_t err; switch (kind) { case cudaMemcpyHostToDevice: { size = src_custom->nx * src_custom->ops->cpu_elemsize; if (dst_custom->cpu_ptr == NULL) { err = cudaMalloc(&dst_custom->cpu_ptr, size); assert(err == cudaSuccess); } err = cudaMemcpyAsync(dst_custom->cpu_ptr, src_custom->cpu_ptr, size, kind, stream); assert(err == cudaSuccess); err = cudaMalloc(&dst_custom->cuda_ptr, size); assert(err == cudaSuccess); break; } case cudaMemcpyDeviceToHost: size = 2*src_custom->nx*sizeof(float); if (dst_custom->cuda_ptr == NULL) { dst_custom->cuda_ptr = malloc(size); if (dst_custom->cuda_ptr == NULL) return -ENOMEM; } err = cudaMemcpyAsync(dst_custom->cuda_ptr, src_custom->cuda_ptr, size, kind, stream); assert(err == cudaSuccess); break; default: assert(0); } return 0; } static int copy_ram_to_cuda_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cudaStream_t stream) { return copy_cuda_common_async(src_interface, src_node, dst_interface, dst_node, stream, cudaMemcpyHostToDevice); } static int copy_cuda_to_ram_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cudaStream_t stream) { return copy_cuda_common_async(src_interface, src_node, dst_interface, dst_node, stream, cudaMemcpyDeviceToHost); } static int copy_cuda_to_cuda(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) { assert(0); } static int copy_cuda_to_cuda_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cudaStream_t stream) { assert(0); } #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL static int copy_ram_to_opencl(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) { (void) src_interface; (void) src_node; (void) dst_interface; (void) dst_node; return 0; } static int copy_opencl_to_ram(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) { (void) src_interface; (void) src_node; (void) dst_interface; (void) dst_node; return 0; } static int copy_opencl_to_opencl(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) { (void) src_interface; (void) src_node; (void) dst_interface; (void) dst_node; return 0; } static int copy_ram_to_opencl_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event) { starpu_ssize_t size; struct custom_data_interface *src_custom, *dst_custom; src_custom = (struct custom_data_interface *) src_interface; dst_custom = (struct custom_data_interface *) dst_interface; /* * Opencl stuff. */ cl_context context; cl_command_queue queue; int id = starpu_worker_get_id_check(); int devid = starpu_worker_get_devid(id); starpu_opencl_get_queue(devid, &queue); starpu_opencl_get_context(devid, &context); /* Real stuff */ int err; cl_int ret; size = src_custom->nx * 2 * sizeof(float); if (dst_custom->cpu_ptr == NULL) { ret = starpu_opencl_allocate_memory(devid, (cl_mem*)&dst_custom->cpu_ptr, size, CL_MEM_READ_WRITE); assert(ret == CL_SUCCESS); } err = starpu_opencl_copy_ram_to_opencl(src_custom->cpu_ptr, src_node, dst_custom->cpu_ptr, dst_node, size, 0, NULL, &ret); assert(err == 0); return 0; } static int copy_opencl_to_ram_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event) { starpu_ssize_t size; struct custom_data_interface *src_custom, *dst_custom; src_custom = (struct custom_data_interface *) src_interface; dst_custom = (struct custom_data_interface *) dst_interface; /* * Opencl stuff. */ cl_context context; cl_command_queue queue; int id = starpu_worker_get_id_check(); int devid = starpu_worker_get_devid(id); starpu_opencl_get_queue(devid, &queue); starpu_opencl_get_context(devid, &context); /* real stuff */ int err; cl_int ret; size = src_custom->nx * 2 * sizeof(float); if (!dst_custom->opencl_ptr) { dst_custom->opencl_ptr = malloc(size); assert(dst_custom->opencl_ptr != NULL); } err = starpu_opencl_copy_opencl_to_ram(src_custom->opencl_ptr, src_node, dst_custom->opencl_ptr, dst_node, size, 0, NULL, &ret); assert(err == 0); return 0; } #endif /* !STARPU_USE_OPENCL */ starpu-1.2.3+dfsg/examples/filters/custom_mf/custom_interface.h000066400000000000000000000032041320135501600247320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __CUSTOM_INTERFACE_H__ #define __CUSTOM_INTERFACE_H__ #include struct custom_data_interface { void *cpu_ptr; void *cuda_ptr; void *opencl_ptr; struct starpu_multiformat_data_interface_ops *ops; uint32_t nx; }; void custom_data_register(starpu_data_handle_t *handle, unsigned home_node, void *ptr, uint32_t nx, struct starpu_multiformat_data_interface_ops* ops); #define CUSTOM_GET_NX(interface) (((struct custom_data_interface*)(interface))->nx) #define CUSTOM_GET_CPU_PTR(interface) (((struct custom_data_interface*)(interface))->cpu_ptr) #ifdef STARPU_USE_CUDA #define CUSTOM_GET_X_PTR(interface) (((struct custom_data_interface*)(interface))->cuda_ptr) #define CUSTOM_GET_Y_PTR(interface) \ (((struct custom_data_interface*)(interface))->cuda_ptr)+ \ CUSTOM_GET_NX((interface)) #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL #define CUSTOM_GET_OPENCL_X_PTR(interface) (((struct custom_data_interface *)(interface))->opencl_ptr) #endif #endif /* ! __CUSTOM_INTERFACE_H__ */ starpu-1.2.3+dfsg/examples/filters/custom_mf/custom_mf_filter.c000066400000000000000000000160651320135501600247450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "custom_interface.h" #include "custom_types.h" #define N 12 #define DEBUG 1 #ifdef STARPU_USE_CUDA static unsigned int _ncuda; #endif #ifdef STARPU_USE_OPENCL static unsigned int _nopencl; #endif static struct point _array_of_structs[N]; static starpu_data_handle_t _handle; static unsigned int _nchunks = 6; #ifdef STARPU_USE_CUDA extern struct starpu_codelet cpu_to_cuda_cl; extern struct starpu_codelet cuda_to_cpu_cl; #endif #ifdef STARPU_USE_OPENCL extern struct starpu_codelet cpu_to_opencl_cl; extern struct starpu_codelet opencl_to_cpu_cl; #endif static struct starpu_multiformat_data_interface_ops format_ops = { #ifdef STARPU_USE_CUDA .cuda_elemsize = sizeof(struct struct_of_arrays), .cpu_to_cuda_cl = &cpu_to_cuda_cl, .cuda_to_cpu_cl = &cuda_to_cpu_cl, #endif #ifdef STARPU_USE_OPENCL .opencl_elemsize = sizeof(struct struct_of_arrays), .cpu_to_opencl_cl = &cpu_to_opencl_cl, .opencl_to_cpu_cl = &opencl_to_cpu_cl, #endif .cpu_elemsize = sizeof(struct point), }; static void custom_filter(void *father, void *child, struct starpu_data_filter *f, unsigned id, unsigned nchunks) { struct custom_data_interface *custom_father, *custom_child; custom_father = (struct custom_data_interface *) father; custom_child = (struct custom_data_interface *) child; assert(N % nchunks == 0); // XXX starpu_ssize_t chunk_size = N/nchunks; if (custom_father->cpu_ptr) { struct point *tmp = (struct point *) custom_father->cpu_ptr; tmp += id * chunk_size; custom_child->cpu_ptr = tmp; } #ifdef STARPU_USE_CUDA else if (custom_father->cuda_ptr) { struct struct_of_arrays *soa_father, *soa_child; soa_father = (struct struct_of_arrays*) custom_father->cuda_ptr; soa_child = (struct struct_of_arrays*) custom_child->cuda_ptr; soa_child->x = soa_father->x + chunk_size; soa_child->y = soa_father->y + chunk_size; } #endif #ifdef STARPU_USE_OPENCL else if (custom_father->opencl_ptr) { struct struct_of_arrays *soa_father, *soa_child; soa_father = (struct struct_of_arrays*) custom_father->opencl_ptr; soa_child = (struct struct_of_arrays*) custom_child->opencl_ptr; soa_child->x = soa_father->x + chunk_size; soa_child->y = soa_father->y + chunk_size; } #endif /* !STARPU_USE_OPENCL */ custom_child->ops = custom_father->ops; custom_child->nx = chunk_size; } static void register_and_partition_data(void) { int i; for (i = 0; i < N; i++) { _array_of_structs[i].x = i+1.0; _array_of_structs[i].y = 42.0; } custom_data_register(&_handle, STARPU_MAIN_RAM, &_array_of_structs, N, &format_ops); struct starpu_data_filter f = { .filter_func = custom_filter, .nchildren = _nchunks, .get_nchildren = NULL, .get_child_ops = NULL }; starpu_data_partition(_handle, &f); } static void unpartition_and_unregister_data(void) { starpu_data_unpartition(_handle, STARPU_MAIN_RAM); starpu_data_unregister(_handle); } static void custom_scal_cpu_func(void *buffers[], void *args) { struct point *aos; unsigned int n, i; aos = CUSTOM_GET_CPU_PTR(buffers[0]); n = CUSTOM_GET_NX(buffers[0]); for (i = 0; i < n; i++) aos[i].x *= aos[i].y; } #ifdef STARPU_USE_CUDA extern void custom_scal_cuda_func(void *buffers[], void *args); #endif static struct starpu_codelet cpu_cl = { .cpu_funcs = { custom_scal_cpu_func}, .nbuffers = 1, .modes = { STARPU_RW }, .name = "codelet_real" }; #ifdef STARPU_USE_CUDA static struct starpu_codelet cuda_cl = { .cuda_funcs = { custom_scal_cuda_func }, .cuda_flags = {STARPU_CUDA_ASYNC}, .nbuffers = 1, .modes = { STARPU_RW }, .name = "cuda_codelet" }; #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL extern void custom_scal_opencl_func(void *buffers[], void *args); static struct starpu_codelet opencl_cl = { .opencl_funcs = { custom_scal_opencl_func }, .opencl_flags = {STARPU_OPENCL_ASYNC}, .nbuffers = 1, .modes = { STARPU_RW }, .name = "opencl_codelet" }; #endif /* !STARPU_USE_OPENCL */ static int create_and_submit_tasks(void) { int err; unsigned int i; for (i = 0; i < _nchunks; i++) { struct starpu_task *task = starpu_task_create(); switch (i%3) { case 0: task->cl = &cpu_cl; break; case 1: #ifdef STARPU_USE_CUDA if (_ncuda > 0) task->cl = &cuda_cl; else #endif task->cl = &cpu_cl; break; case 2: #ifdef STARPU_USE_OPENCL if (_nopencl > 0) task->cl = &opencl_cl; else #endif task->cl = &cpu_cl; break; default: /* We should never get here */ assert(0); } task->handles[0] = starpu_data_get_sub_data(_handle, 1, i); err = starpu_task_submit(task); if (err != 0) return err; } err = starpu_task_wait_for_all(); if (err != 0) return err; return 0; } #if DEBUG static void print_it(void) { int i; for (i = 0; i < N; i++) { FPRINTF(stderr, "(%.2f, %.2f) ", _array_of_structs[i].x, _array_of_structs[i].y); } FPRINTF(stderr, "\n"); } #endif static int check_it(void) { int i; for (i = 0; i < N; i++) { float expected_value = (i + 1.0)*42.0; if (_array_of_structs[i].x != expected_value) return EXIT_FAILURE; } return EXIT_SUCCESS; } #ifdef STARPU_USE_OPENCL struct starpu_opencl_program _opencl_program; struct starpu_opencl_program _opencl_conversion_program; #endif /* !STARPU_USE_OPENCL */ int main(void) { #ifndef STARPU_USE_CPU return 77; #else int err; err = starpu_init(NULL); if (err == -ENODEV) goto enodev; #ifdef STARPU_USE_CUDA _ncuda = starpu_cuda_worker_get_count(); #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL _nopencl = starpu_opencl_worker_get_count(); if (_nopencl > 0) { char *f1 = "examples/filters/custom_mf/custom_opencl.cl"; char *f2 = "examples/filters/custom_mf/conversion_opencl.cl"; err = starpu_opencl_load_opencl_from_file(f1, &_opencl_program, NULL); assert(err == 0); err = starpu_opencl_load_opencl_from_file(f2, &_opencl_conversion_program, NULL); assert(err == 0); } #endif /* !STARPU_USE_OPENCL */ register_and_partition_data(); #if DEBUG print_it(); #endif err = create_and_submit_tasks(); if (err != 0) { FPRINTF(stderr, "create_submit_task : %s\n", strerror(-err)); return EXIT_FAILURE; } unpartition_and_unregister_data(); #if DEBUG print_it(); #endif #ifdef STARPU_USE_OPENCL if (_nopencl > 0) { err = starpu_opencl_unload_opencl(&_opencl_program); assert(err == 0); err = starpu_opencl_unload_opencl(&_opencl_conversion_program); assert(err == 0); } #endif /* !STARPU_USE_OPENCL */ starpu_shutdown(); print_it(); return check_it(); enodev: return 77; #endif } starpu-1.2.3+dfsg/examples/filters/custom_mf/custom_opencl.c000066400000000000000000000045241320135501600242530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "custom_types.h" #include "custom_interface.h" extern struct starpu_opencl_program _opencl_program; void custom_scal_opencl_func(void *buffers[], void *args) { (void) args; int id, devid; cl_int err; cl_kernel kernel; cl_command_queue queue; unsigned n = CUSTOM_GET_NX(buffers[0]); struct point *aop; aop = (struct point *) CUSTOM_GET_CPU_PTR(buffers[0]); id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &_opencl_program, "custom_scal_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); void *x = CUSTOM_GET_OPENCL_X_PTR(buffers[0]); if (starpu_opencl_set_kernel_args(&err, &kernel, sizeof(aop), &aop, sizeof(x), &x, sizeof(n), &n, 0) != 3) { STARPU_OPENCL_REPORT_ERROR(err); assert(0); } { size_t global=n; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local = global; err = clEnqueueNDRangeKernel( queue, kernel, 1, /* work_dim */ NULL, /* global_work_offset */ &global, /* global_work_size */ &local, /* local_work_size */ 0, /* num_events_in_wait_list */ NULL, /* event_wait_list */ NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } starpu_opencl_release_kernel(kernel); } starpu-1.2.3+dfsg/examples/filters/custom_mf/custom_opencl.cl000066400000000000000000000015031320135501600244210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "custom_types.h" __kernel void custom_scal_opencl(__global struct point *aop, __global float *x, int nx) { const int i = get_global_id(0); if (i < nx) x[i] *= x[i+nx]; } starpu-1.2.3+dfsg/examples/filters/custom_mf/custom_types.h000066400000000000000000000015751320135501600241470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __CUSTOM_TYPES_H__ #define __CUSTOM_TYPES_H__ struct struct_of_arrays { float *x, *y; }; struct point { float x, y; }; #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #endif starpu-1.2.3+dfsg/examples/filters/fblock.c000066400000000000000000000126531320135501600206470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This examplifies how to use partitioning filters. We here just split a 3D * matrix into 3D slices (along the X axis), and run a dumb kernel on them. */ #include #define NX 5 #define NY 4 #define NZ 3 #define PARTS 2 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) extern void cpu_func(void *buffers[], void *cl_arg); #ifdef STARPU_USE_CUDA extern void cuda_func(void *buffers[], void *cl_arg); #endif #ifdef STARPU_USE_OPENCL extern void opencl_func(void *buffers[], void *cl_arg); #endif void print_block(int *block, int nx, int ny, int nz, unsigned ldy, unsigned ldz) { int i, j, k; FPRINTF(stderr, "block=%p nx=%d ny=%d nz=%d ldy=%u ldz=%u\n", block, nx, ny, nz, ldy, ldz); for(k=0 ; kcl = &cl; task->synchronous = 1; task->callback_func = NULL; task->handles[0] = starpu_data_get_sub_data(handle, 1, i); task->cl_arg = &multiplier; task->cl_arg_size = sizeof(multiplier); ret = starpu_task_submit(task); if (ret) { FPRINTF(stderr, "Error when submitting task\n"); exit(ret); } } /* Unpartition the data, unregister it from StarPU and shutdown */ starpu_data_unpartition(handle, STARPU_MAIN_RAM); print_data(handle); starpu_data_unregister(handle); /* Print result block */ FPRINTF(stderr, "OUT Block\n"); print_block(block, NX, NY, NZ, NX, NX*NY); free(block); starpu_shutdown(); return 0; } starpu-1.2.3+dfsg/examples/filters/fblock_cpu.c000066400000000000000000000024771320135501600215210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* dumb kernel to fill a 3D matrix */ #include void cpu_func(void *buffers[], void *cl_arg) { int i, j, k; int *factor = (int *) cl_arg; int *block = (int *)STARPU_BLOCK_GET_PTR(buffers[0]); int nx = (int)STARPU_BLOCK_GET_NX(buffers[0]); int ny = (int)STARPU_BLOCK_GET_NY(buffers[0]); int nz = (int)STARPU_BLOCK_GET_NZ(buffers[0]); unsigned ldy = STARPU_BLOCK_GET_LDY(buffers[0]); unsigned ldz = STARPU_BLOCK_GET_LDZ(buffers[0]); for(k=0; k static __global__ void fblock_cuda(int *block, int nx, int ny, int nz, unsigned ldy, unsigned ldz, float factor) { int i, j, k; for(k=0; k>>(block, nx, ny, nz, ldy, ldz, *factor); } starpu-1.2.3+dfsg/examples/filters/fblock_opencl.c000066400000000000000000000051251320135501600222030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012, 2013, 2016 CNRS * Copyright (C) 2011, 2014-2015 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* dumb OpenCL codelet to fill a 3D matrix */ #include #define CHECK_CL_SET_KERNEL_ARG(kernel, n, size, ptr) \ do \ { \ int check_err; \ check_err = clSetKernelArg(kernel, n, size, ptr); \ if (check_err != CL_SUCCESS) \ STARPU_OPENCL_REPORT_ERROR(check_err); \ } while (0) extern struct starpu_opencl_program opencl_program; void opencl_func(void *buffers[], void *cl_arg) { int id, devid, err; cl_kernel kernel; cl_command_queue queue; int *factor = cl_arg; cl_mem block = (cl_mem)STARPU_BLOCK_GET_DEV_HANDLE(buffers[0]); unsigned offset = STARPU_BLOCK_GET_OFFSET(buffers[0]); int nx = (int)STARPU_BLOCK_GET_NX(buffers[0]); int ny = (int)STARPU_BLOCK_GET_NY(buffers[0]); int nz = (int)STARPU_BLOCK_GET_NZ(buffers[0]); unsigned ldy = STARPU_BLOCK_GET_LDY(buffers[0]); unsigned ldz = STARPU_BLOCK_GET_LDZ(buffers[0]); id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_program, "fblock_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); CHECK_CL_SET_KERNEL_ARG(kernel, 0, sizeof(block), &block); CHECK_CL_SET_KERNEL_ARG(kernel, 1, sizeof(offset), &offset); CHECK_CL_SET_KERNEL_ARG(kernel, 2, sizeof(nx), &nx); CHECK_CL_SET_KERNEL_ARG(kernel, 3, sizeof(ny), &ny); CHECK_CL_SET_KERNEL_ARG(kernel, 4, sizeof(nz), &nz); CHECK_CL_SET_KERNEL_ARG(kernel, 5, sizeof(ldy), &ldy); CHECK_CL_SET_KERNEL_ARG(kernel, 6, sizeof(ldz), &ldz); CHECK_CL_SET_KERNEL_ARG(kernel, 7, sizeof(*factor), factor); { size_t global=nx*ny*nz; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, NULL, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } starpu_opencl_release_kernel(kernel); } starpu-1.2.3+dfsg/examples/filters/fblock_opencl_kernel.cl000066400000000000000000000021171320135501600237150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* dumb OpenCL kernel to fill a 3D matrix */ __kernel void fblock_opencl(__global int* block, unsigned offset, int nx, int ny, int nz, unsigned ldy, unsigned ldz, int factor) { int i, j, k; block = (__global char *)block + offset; for(k=0; k #define NX 5 #define NY 4 #define PARTS 2 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) void cpu_func(void *buffers[], void *cl_arg) { unsigned i, j; int *factor = (int *) cl_arg; /* length of the matrix */ unsigned nx = STARPU_MATRIX_GET_NX(buffers[0]); unsigned ny = STARPU_MATRIX_GET_NY(buffers[0]); unsigned ld = STARPU_MATRIX_GET_LD(buffers[0]); /* local copy of the matrix pointer */ int *val = (int *)STARPU_MATRIX_GET_PTR(buffers[0]); for(j=0; jhandles[0] = starpu_data_get_sub_data(handle, 1, i); task->cl = &cl; task->synchronous = 1; task->cl_arg = &factor; task->cl_arg_size = sizeof(factor); ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } /* Unpartition the data, unregister it from StarPU and shutdown */ starpu_data_unpartition(handle, STARPU_MAIN_RAM); starpu_data_unregister(handle); starpu_shutdown(); /* Print result matrix */ n=1; FPRINTF(stderr,"OUT Matrix: \n"); for(j=0 ; j static __global__ void _fmultiple_check_scale_cuda(int *val, int nx, int ny, unsigned ld, int start, int factor) { int i, j; for(j=0; j>>(val, nx, ny, ld, start, factor); } static __global__ void _fmultiple_check_cuda(int *val, int nx, int ny, unsigned ld, int start, int factor) { int i, j; for(j=0; j>>(val, nx, ny, ld, start, factor); } starpu-1.2.3+dfsg/examples/filters/fmultiple_manual.c000066400000000000000000000165661320135501600227540ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015 Université Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This examplifies how to access the same matrix with different partitioned * views, doing the coherency by hand. * We first run a kernel on the whole matrix to fill it, then run a kernel on * each vertical slice to check the value and multiply it by two, then run a * kernel on each horizontal slice to do the same. */ #include #define NX 6 #define NY 6 #define PARTS 2 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) void matrix_fill(void *buffers[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { unsigned i, j; /* length of the matrix */ unsigned nx = STARPU_MATRIX_GET_NX(buffers[0]); unsigned ny = STARPU_MATRIX_GET_NY(buffers[0]); unsigned ld = STARPU_MATRIX_GET_LD(buffers[0]); int *val = (int *)STARPU_MATRIX_GET_PTR(buffers[0]); for(j=0; j #define NX 6 #define NY 6 #define PARTS 2 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) void matrix_fill(void *buffers[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { unsigned i, j; /* length of the matrix */ unsigned nx = STARPU_MATRIX_GET_NX(buffers[0]); unsigned ny = STARPU_MATRIX_GET_NY(buffers[0]); unsigned ld = STARPU_MATRIX_GET_LD(buffers[0]); int *val = (int *)STARPU_MATRIX_GET_PTR(buffers[0]); for(j=0; j #define NX 6 #define NY 6 #define PARTS 2 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) void matrix_fill(void *buffers[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { unsigned i, j; /* length of the matrix */ unsigned nx = STARPU_MATRIX_GET_NX(buffers[0]); unsigned ny = STARPU_MATRIX_GET_NY(buffers[0]); unsigned ld = STARPU_MATRIX_GET_LD(buffers[0]); int *val = (int *)STARPU_MATRIX_GET_PTR(buffers[0]); for(j=0; j #define NX 21 #define PARTS 3 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) void cpu_func(void *buffers[], void *cl_arg) { unsigned i; int *factor = (int *) cl_arg; /* length of the vector */ unsigned n = STARPU_VECTOR_GET_NX(buffers[0]); /* local copy of the vector pointer */ int *val = (int *)STARPU_VECTOR_GET_PTR(buffers[0]); for (i = 0; i < n; i++) val[i] *= *factor; } int main(int argc, char **argv) { int i; int vector[NX]; starpu_data_handle_t handle; int factor=1; int ret; struct starpu_codelet cl = { .cpu_funcs = {cpu_func}, .cpu_funcs_name = {"cpu_func"}, .nbuffers = 1, .modes = {STARPU_RW}, .name = "vector_scal" }; for(i=0 ; ihandles[0] = sub_handle; task->cl = &cl; task->synchronous = 1; task->cl_arg = &factor; task->cl_arg_size = sizeof(factor); ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_data_unpartition(handle, STARPU_MAIN_RAM); starpu_data_unregister(handle); starpu_shutdown(); FPRINTF(stderr,"OUT Vector: "); for(i=0 ; i /* Shadow width */ #define SHADOW 2 #define NX 30 #define PARTS 3 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) void cpu_func(void *buffers[], void *cl_arg) { unsigned i; /* length of the shadowed source vector */ unsigned n = STARPU_VECTOR_GET_NX(buffers[0]); /* local copy of the shadowed source vector pointer */ int *val = (int *)STARPU_VECTOR_GET_PTR(buffers[0]); /* length of the destination vector */ unsigned n2 = STARPU_VECTOR_GET_NX(buffers[1]); /* local copy of the destination vector pointer */ int *val2 = (int *)STARPU_VECTOR_GET_PTR(buffers[1]); /* If things go right, sizes should match */ STARPU_ASSERT(n == n2); for (i = 0; i < n; i++) val2[i] = val[i]; } #ifdef STARPU_USE_CUDA void cuda_func(void *buffers[], void *cl_arg) { /* length of the shadowed source vector */ unsigned n = STARPU_VECTOR_GET_NX(buffers[0]); /* local copy of the shadowed source vector pointer */ int *val = (int *)STARPU_VECTOR_GET_PTR(buffers[0]); /* length of the destination vector */ unsigned n2 = STARPU_VECTOR_GET_NX(buffers[1]); /* local copy of the destination vector pointer */ int *val2 = (int *)STARPU_VECTOR_GET_PTR(buffers[1]); /* If things go right, sizes should match */ STARPU_ASSERT(n == n2); cudaMemcpyAsync(val2, val, n*sizeof(*val), cudaMemcpyDeviceToDevice, starpu_cuda_get_local_stream()); } #endif int main(int argc, char **argv) { unsigned j; int vector[NX + 2*SHADOW]; int vector2[NX + PARTS*2*SHADOW]; starpu_data_handle_t handle, handle2; int ret, i; struct starpu_codelet cl = { .cpu_funcs = {cpu_func}, .cpu_funcs_name = {"cpu_func"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_func}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif .nbuffers = 2, .modes = {STARPU_R, STARPU_W} }; for(i=0 ; ihandles[0] = sub_handle; task->handles[1] = sub_handle2; task->cl = &cl; task->synchronous = 1; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_data_unpartition(handle, STARPU_MAIN_RAM); starpu_data_unpartition(handle2, STARPU_MAIN_RAM); starpu_data_unregister(handle); starpu_data_unregister(handle2); starpu_shutdown(); FPRINTF(stderr,"OUT Vector: "); for(i=0 ; i /* Shadow width */ #define SHADOWX 3 #define SHADOWY 2 #define NX 20 #define NY 30 #define PARTSX 2 #define PARTSY 3 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) void cpu_func(void *buffers[], void *cl_arg) { /* length of the shadowed source matrix */ unsigned ld = STARPU_MATRIX_GET_LD(buffers[0]); unsigned n = STARPU_MATRIX_GET_NX(buffers[0]); unsigned m = STARPU_MATRIX_GET_NY(buffers[0]); /* local copy of the shadowed source matrix pointer */ int *val = (int *)STARPU_MATRIX_GET_PTR(buffers[0]); /* length of the destination matrix */ unsigned ld2 = STARPU_MATRIX_GET_LD(buffers[1]); unsigned n2 = STARPU_MATRIX_GET_NX(buffers[1]); unsigned m2 = STARPU_MATRIX_GET_NY(buffers[1]); /* local copy of the destination matrix pointer */ int *val2 = (int *)STARPU_MATRIX_GET_PTR(buffers[1]); unsigned i, j; /* If things go right, sizes should match */ STARPU_ASSERT(n == n2); STARPU_ASSERT(m == m2); for (j = 0; j < m; j++) for (i = 0; i < n; i++) val2[j*ld2+i] = val[j*ld+i]; } #ifdef STARPU_USE_CUDA void cuda_func(void *buffers[], void *cl_arg) { cudaError_t cures; /* length of the shadowed source matrix */ unsigned ld = STARPU_MATRIX_GET_LD(buffers[0]); unsigned n = STARPU_MATRIX_GET_NX(buffers[0]); unsigned m = STARPU_MATRIX_GET_NY(buffers[0]); /* local copy of the shadowed source matrix pointer */ int *val = (int *)STARPU_MATRIX_GET_PTR(buffers[0]); /* length of the destination matrix */ unsigned ld2 = STARPU_MATRIX_GET_LD(buffers[1]); unsigned n2 = STARPU_MATRIX_GET_NX(buffers[1]); unsigned m2 = STARPU_MATRIX_GET_NY(buffers[1]); /* local copy of the destination matrix pointer */ int *val2 = (int *)STARPU_MATRIX_GET_PTR(buffers[1]); /* If things go right, sizes should match */ STARPU_ASSERT(n == n2); STARPU_ASSERT(m == m2); cures = cudaMemcpy2DAsync(val2, ld2*sizeof(*val2), val, ld*sizeof(*val), n*sizeof(*val), m, cudaMemcpyDeviceToDevice, starpu_cuda_get_local_stream()); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); } #endif int main(int argc, char **argv) { unsigned i, j, k, l; int matrix[NY + 2*SHADOWY][NX + 2*SHADOWX]; int matrix2[NY + PARTSY*2*SHADOWY][NX + PARTSX*2*SHADOWX]; starpu_data_handle_t handle, handle2; int ret; struct starpu_codelet cl = { .cpu_funcs = {cpu_func}, .cpu_funcs_name = {"cpu_func"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_func}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif .nbuffers = 2, .modes = {STARPU_R, STARPU_W} }; memset(matrix, -1, sizeof(matrix)); for(j=1 ; j<=NY ; j++) for(i=1 ; i<=NX ; i++) matrix[SHADOWY+j-1][SHADOWX+i-1] = i+j; /* Copy borders */ for (j = SHADOWY ; jhandles[0] = sub_handle; task->handles[1] = sub_handle2; task->cl = &cl; task->synchronous = 1; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } starpu_data_unpartition(handle, STARPU_MAIN_RAM); starpu_data_unpartition(handle2, STARPU_MAIN_RAM); starpu_data_unregister(handle); starpu_data_unregister(handle2); starpu_shutdown(); FPRINTF(stderr,"OUT Matrix:\n"); for(j=0 ; j /* Shadow width */ #define SHADOWX 2 #define SHADOWY 3 #define SHADOWZ 4 #define NX 12 #define NY 9 #define NZ 6 #define PARTSX 4 #define PARTSY 3 #define PARTSZ 2 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) void cpu_func(void *buffers[], void *cl_arg) { /* length of the shadowed source matrix */ unsigned ldy = STARPU_BLOCK_GET_LDY(buffers[0]); unsigned ldz = STARPU_BLOCK_GET_LDZ(buffers[0]); unsigned x = STARPU_BLOCK_GET_NX(buffers[0]); unsigned y = STARPU_BLOCK_GET_NY(buffers[0]); unsigned z = STARPU_BLOCK_GET_NZ(buffers[0]); /* local copy of the shadowed source matrix pointer */ int *val = (int *)STARPU_BLOCK_GET_PTR(buffers[0]); /* length of the destination matrix */ unsigned ldy2 = STARPU_BLOCK_GET_LDY(buffers[1]); unsigned ldz2 = STARPU_BLOCK_GET_LDZ(buffers[1]); unsigned x2 = STARPU_BLOCK_GET_NX(buffers[1]); unsigned y2 = STARPU_BLOCK_GET_NY(buffers[1]); unsigned z2 = STARPU_BLOCK_GET_NZ(buffers[1]); /* local copy of the destination matrix pointer */ int *val2 = (int *)STARPU_BLOCK_GET_PTR(buffers[1]); unsigned i, j, k; /* If things go right, sizes should match */ STARPU_ASSERT(x == x2); STARPU_ASSERT(y == y2); STARPU_ASSERT(z == z2); for (k = 0; k < z; k++) for (j = 0; j < y; j++) for (i = 0; i < x; i++) val2[k*ldz2+j*ldy2+i] = val[k*ldz+j*ldy+i]; } #ifdef STARPU_USE_CUDA void cuda_func(void *buffers[], void *cl_arg) { /* length of the shadowed source matrix */ unsigned ldy = STARPU_BLOCK_GET_LDY(buffers[0]); unsigned ldz = STARPU_BLOCK_GET_LDZ(buffers[0]); unsigned x = STARPU_BLOCK_GET_NX(buffers[0]); unsigned y = STARPU_BLOCK_GET_NY(buffers[0]); unsigned z = STARPU_BLOCK_GET_NZ(buffers[0]); /* local copy of the shadowed source matrix pointer */ int *val = (int *)STARPU_BLOCK_GET_PTR(buffers[0]); /* length of the destination matrix */ unsigned ldy2 = STARPU_BLOCK_GET_LDY(buffers[1]); unsigned ldz2 = STARPU_BLOCK_GET_LDZ(buffers[1]); unsigned x2 = STARPU_BLOCK_GET_NX(buffers[1]); unsigned y2 = STARPU_BLOCK_GET_NY(buffers[1]); unsigned z2 = STARPU_BLOCK_GET_NZ(buffers[1]); /* local copy of the destination matrix pointer */ int *val2 = (int *)STARPU_BLOCK_GET_PTR(buffers[1]); unsigned k; cudaError_t cures; /* If things go right, sizes should match */ STARPU_ASSERT(x == x2); STARPU_ASSERT(y == y2); STARPU_ASSERT(z == z2); for (k = 0; k < z; k++) { cures = cudaMemcpy2DAsync(val2+k*ldz2, ldy2*sizeof(*val2), val+k*ldz, ldy*sizeof(*val), x*sizeof(*val), y, cudaMemcpyDeviceToDevice, starpu_cuda_get_local_stream()); STARPU_ASSERT(!cures); } } #endif int main(int argc, char **argv) { unsigned i, j, k, l, m, n; int matrix[NZ + 2*SHADOWZ][NY + 2*SHADOWY][NX + 2*SHADOWX]; int matrix2[NZ + PARTSZ*2*SHADOWZ][NY + PARTSY*2*SHADOWY][NX + PARTSX*2*SHADOWX]; starpu_data_handle_t handle, handle2; int ret; struct starpu_codelet cl = { .cpu_funcs = {cpu_func}, .cpu_funcs_name = {"cpu_func"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_func}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif .nbuffers = 2, .modes = {STARPU_R, STARPU_W} }; memset(matrix, -1, sizeof(matrix)); for(k=1 ; k<=NZ ; k++) for(j=1 ; j<=NY ; j++) for(i=1 ; i<=NX ; i++) matrix[SHADOWZ+k-1][SHADOWY+j-1][SHADOWX+i-1] = i+j+k; /* Copy planes */ for (k = SHADOWZ ; khandles[0] = sub_handle; task->handles[1] = sub_handle2; task->cl = &cl; task->synchronous = 1; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } } starpu_data_unpartition(handle, STARPU_MAIN_RAM); starpu_data_unpartition(handle2, STARPU_MAIN_RAM); starpu_data_unregister(handle); starpu_data_unregister(handle2); starpu_shutdown(); FPRINTF(stderr,"OUT Matrix:\n"); for(k=0 ; k mesh%elt(i) CALL starpu_register_element_c(numpar%Neq_max,elt%Np,elt%Ng,elt%ro,elt%dro, & elt%basis,elt%ro_h,elt%dro_h,elt%basis_h) ENDDO !Compute DO it = 1,it_tot ! compute new dro for each element DO i = 1,Nelt elt => mesh%elt(i) CALL starpu_loop_element_task_c(numpar%coeff,elt%ro_h,elt%dro_h,elt%basis_h) ENDDO ! sync (if needed by the algorithm) CALL starpu_task_wait_for_all() ! - - - - - ! copy dro to ro for each element DO i = 1,Nelt elt => mesh%elt(i) CALL starpu_copy_element_task_c(elt%ro_h,elt%dro_h) ENDDO ! sync (if needed by the algorithm) CALL starpu_task_wait_for_all() ENDDO !Unregistration of elements DO i = 1,Nelt elt => mesh%elt(i) CALL starpu_unregister_element_c(elt%ro_h,elt%dro_h,elt%basis_h) ENDDO !Terminate StarPU, no task can be submitted after CALL starpu_shutdown() !Check data with StarPU WRITE(6,'(a)') " " WRITE(6,'(a)') " %%%% RESULTS STARPU %%%% " WRITE(6,'(a)') " " DO i = 1,Nelt WRITE(6,'(a,i4,a)') " elt ", i , " ; elt%ro = " WRITE(6,'(10(1x,F11.2))') mesh%elt(i)%ro WRITE(6,'(a)') " ------------------------ " ENDDO !Same compute without StarPU DO i = 1,Nelt elt => mesh%elt(i) CALL init_element(elt%ro,elt%dro,elt%basis,numpar%Neq_max,elt%Np,elt%Ng,i) ENDDO DO it = 1, it_tot DO i = 1,Nelt elt => mesh%elt(i) CALL loop_element_cpu(elt%ro,elt%dro,elt%basis,numpar%coeff,numpar%Neq_max,elt%Ng,elt%Np) elt%ro = elt%ro + elt%dro ENDDO ENDDO WRITE(6,'(a)') " " WRITE(6,'(a)') " %%%% RESULTS VERIFICATION %%%% " WRITE(6,'(a)') " " DO i = 1,Nelt WRITE(6,'(a,i4,a)') " elt ", i , " ; elt%ro = " WRITE(6,'(10(1x,F11.2))') mesh%elt(i)%ro WRITE(6,'(a)') " ------------------------ " ENDDO WRITE(6,'(a)') " " !Deallocation DO i = 1,Nelt elt => mesh%elt(i) DEALLOCATE(elt%ro) DEALLOCATE(elt%dro) DEALLOCATE(elt%basis) ENDDO DEALLOCATE(mesh%elt) END PROGRAM f90_example starpu-1.2.3+dfsg/examples/fortran90/marshalling.c000066400000000000000000000115151320135501600220600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015 ONERA * Copyright (C) 2015 Inria * Copyright (C) 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Helper functions to initialize StarPU and register element matrices */ #include //--------------------------------------------------------------// void starpu_register_element_c(int Neq_max,int Np, int Ng,double **ro, double **dro, double **basis, void **ro_h, void **dro_h, void **basis_h) { starpu_data_handle_t ro_handle; starpu_data_handle_t dro_handle; starpu_data_handle_t basis_handle; starpu_matrix_data_register(&ro_handle, 0, (uintptr_t)ro,Neq_max,Neq_max,Np, sizeof(double)); starpu_matrix_data_register(&dro_handle, 0, (uintptr_t)dro,Neq_max,Neq_max,Np, sizeof(double)); starpu_matrix_data_register(&basis_handle, 0, (uintptr_t)basis,Np,Np,Ng, sizeof(double)); *ro_h = ro_handle; *dro_h = dro_handle; *basis_h = basis_handle; } void starpu_unregister_element_c(void **ro_h, void **dro_h, void **basis_h) { starpu_data_handle_t ro_handle = *ro_h; starpu_data_handle_t dro_handle = *dro_h; starpu_data_handle_t basis_handle = *basis_h; starpu_data_unregister(ro_handle); starpu_data_unregister(dro_handle); starpu_data_unregister(basis_handle); } //--------------------------------------------------------------// void loop_element_cpu_fortran(double coeff, int Neq_max, int Np, int Ng, void *ro_ptr, void *dro_ptr, void *basis_ptr, void *cl_arg); void loop_element_cpu_func(void *buffers[], void *cl_arg); struct starpu_codelet cl_loop_element = { .cpu_funcs = {loop_element_cpu_func}, .nbuffers = 3, .modes = {STARPU_R,STARPU_RW,STARPU_R}, .name = "LOOP_ELEMENT" }; void loop_element_cpu_func(void *buffers[], void *cl_arg) { double coeff; double **ro = (double **) STARPU_MATRIX_GET_PTR(buffers[0]); int Neq_max = STARPU_MATRIX_GET_NX(buffers[0]); double **dro = (double **) STARPU_MATRIX_GET_PTR(buffers[1]); double **basis = (double **) STARPU_MATRIX_GET_PTR(buffers[2]); int Np = STARPU_MATRIX_GET_NX(buffers[2]); int Ng = STARPU_MATRIX_GET_NY(buffers[2]); starpu_codelet_unpack_args(cl_arg, &coeff); void *ro_ptr = &ro; void *dro_ptr = &dro; void *basis_ptr = &basis; loop_element_cpu_fortran(coeff,Neq_max,Np,Ng, ro_ptr,dro_ptr,basis_ptr,cl_arg); } void starpu_loop_element_task_c(double coeff, void **ro_h, void **dro_h, void **basis_h) { int ret; starpu_data_handle_t ro_handle = *ro_h; starpu_data_handle_t dro_handle = *dro_h; starpu_data_handle_t basis_handle = *basis_h; /* execute the task on any eligible computational ressource */ ret = starpu_task_insert(&cl_loop_element, STARPU_VALUE, &coeff, sizeof(double), STARPU_R, ro_handle, STARPU_RW, dro_handle, STARPU_R, basis_handle, 0); /* verification */ STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); } //--------------------------------------------------------------// void copy_element_cpu_fortran(int Neq_max, int Np, void *ro_ptr, void *dro_ptr); void copy_element_cpu_func(void *buffers[], void *cl_arg); struct starpu_codelet cl_copy_element = { .cpu_funcs = {copy_element_cpu_func}, .nbuffers = 2, .modes = {STARPU_RW,STARPU_R}, .name = "COPY_ELEMENT" }; void copy_element_cpu_func(void *buffers[], void *cl_arg) { double **ro = (double **) STARPU_MATRIX_GET_PTR(buffers[0]); int Neq_max = STARPU_MATRIX_GET_NX(buffers[0]); int Np = STARPU_MATRIX_GET_NY(buffers[0]); double **dro = (double **) STARPU_MATRIX_GET_PTR(buffers[1]); void *ro_ptr = &ro; void *dro_ptr = &dro; copy_element_cpu_fortran(Neq_max,Np,ro_ptr,dro_ptr); } void starpu_copy_element_task_c(void **ro_h, void **dro_h) { int ret; starpu_data_handle_t ro_handle = *ro_h; starpu_data_handle_t dro_handle = *dro_h; /* execute the task on any eligible computational ressource */ ret = starpu_insert_task(&cl_copy_element, STARPU_RW, ro_handle, STARPU_R, dro_handle, 0); /* verification */ STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } //--------------------------------------------------------------// int starpu_my_init_c() { /* Initialize StarPU with default configuration */ int ret; struct starpu_conf conf; starpu_conf_init(&conf); conf.sched_policy_name = "dmda"; ret = starpu_init(&conf); /* int ret = starpu_init(NULL); */ return ret; } starpu-1.2.3+dfsg/examples/fortran90/mod_compute.f90000066400000000000000000000077111320135501600222510ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2015 ONERA ! Copyright (C) 2015 Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ! ! See the GNU Lesser General Public License in COPYING.LGPL for more details. ! Computation kernels for the simulation MODULE mod_compute USE mod_types USE starpu_mod USE mod_interface USE iso_c_binding IMPLICIT NONE CONTAINS !--------------------------------------------------------------! SUBROUTINE init_element(ro,dro,basis,Neq_max,Np,Ng,i) INTEGER(KIND=C_INT),INTENT(IN) :: Neq_max,Np,Ng,i REAL(KIND=C_DOUBLE),DIMENSION(:,:),POINTER,INTENT(INOUT) :: ro,basis,dro !Local variables INTEGER(KIND=C_INT) :: n,nb,neq DO nb=1,Np DO neq= 1,Neq_max ro(neq,nb) = 0.01*(nb+neq)*i END DO END DO DO nb=1,Np DO neq= 1,Neq_max dro(neq,nb) = 0.05*(nb-neq)*i END DO END DO DO n=1,Ng DO nb=1,Np basis(nb,n) = 0.05*(n+nb)*i END DO END DO END SUBROUTINE init_element !--------------------------------------------------------------! RECURSIVE SUBROUTINE loop_element_cpu_fortran(coeff,Neq_max,Np,Ng, & & ro_ptr,dro_ptr,basis_ptr) BIND(C) INTEGER(KIND=C_INT),VALUE :: Neq_max,Np,Ng REAL(KIND=C_DOUBLE),VALUE :: coeff TYPE(C_PTR) :: ro_ptr,dro_ptr,basis_ptr !Local variables REAL(KIND=C_DOUBLE),DIMENSION(:,:),POINTER :: ro,dro,basis CALL C_F_POINTER(ro_ptr,ro,[Neq_max,Np]) CALL C_F_POINTER(dro_ptr,dro,[Neq_max,Np]) CALL C_F_POINTER(basis_ptr,basis,[Np,Ng]) CALL loop_element_cpu(ro,dro,basis,coeff,Neq_max,Ng,Np) END SUBROUTINE loop_element_cpu_fortran !--------------------------------------------------------------! RECURSIVE SUBROUTINE loop_element_cpu(ro,dro,basis,coeff,Neq_max,Ng,Np) REAL(KIND=C_DOUBLE),INTENT(IN) :: coeff INTEGER(KIND=C_INT),INTENT(IN) :: Neq_max,Ng,Np REAL(KIND=C_DOUBLE),DIMENSION(:,:),POINTER,INTENT(IN) :: ro,basis REAL(KIND=C_DOUBLE),DIMENSION(:,:),POINTER,INTENT(INOUT) :: dro !Local variables REAL(KIND=C_DOUBLE) :: coeff2,r INTEGER(KIND=C_INT) :: n,nb,neq DO n=1,Ng r = 0. DO nb=1,Np DO neq= 1,Neq_max r = r + basis(nb,n) * ro(neq,nb) ENDDO ENDDO coeff2 = r + coeff DO nb=1,Np DO neq = 1,Neq_max dro(neq,nb) = coeff2 + dro(neq,nb) ENDDO ENDDO ENDDO END SUBROUTINE loop_element_cpu !--------------------------------------------------------------! RECURSIVE SUBROUTINE copy_element_cpu_fortran(Neq_max,Np, & & ro_ptr,dro_ptr) BIND(C) INTEGER(KIND=C_INT),VALUE :: Neq_max,Np TYPE(C_PTR) :: ro_ptr,dro_ptr !Local variables REAL(KIND=C_DOUBLE),DIMENSION(:,:),POINTER :: ro,dro CALL C_F_POINTER(ro_ptr,ro,[Neq_max,Np]) CALL C_F_POINTER(dro_ptr,dro,[Neq_max,Np]) CALL copy_element_cpu(ro,dro) END SUBROUTINE copy_element_cpu_fortran !--------------------------------------------------------------! RECURSIVE SUBROUTINE copy_element_cpu(ro,dro) REAL(KIND=C_DOUBLE),DIMENSION(:,:),POINTER,INTENT(INOUT) :: ro REAL(KIND=C_DOUBLE),DIMENSION(:,:),POINTER,INTENT(IN) :: dro ro = ro + dro END SUBROUTINE copy_element_cpu END MODULE mod_compute starpu-1.2.3+dfsg/examples/fortran90/mod_interface.f90000066400000000000000000000042511320135501600225310ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2015 ONERA ! Copyright (C) 2015 Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ! ! See the GNU Lesser General Public License in COPYING.LGPL for more details. ! Fortran module interface for StarPU initialization and element registration MODULE mod_interface INTERFACE FUNCTION starpu_my_init_c() BIND(C) USE iso_c_binding INTEGER(KIND=C_INT) :: starpu_my_init_c END FUNCTION starpu_my_init_c END INTERFACE INTERFACE SUBROUTINE starpu_register_element_c(Neq,Np,Ng,ro,dro,basis,ro_h,dro_h,basis_h) BIND(C) USE iso_c_binding INTEGER(KIND=C_INT),VALUE :: Neq,Np,Ng REAL(KIND=C_DOUBLE),DIMENSION(Neq,Np) :: ro,dro REAL(KIND=C_DOUBLE),DIMENSION(Np,Ng) :: basis TYPE(C_PTR), INTENT(OUT) :: ro_h, dro_h, basis_h END SUBROUTINE starpu_register_element_c END INTERFACE INTERFACE SUBROUTINE starpu_unregister_element_c( & ro_h,dro_h,basis_h) BIND(C) USE iso_c_binding TYPE(C_PTR), INTENT(IN) :: ro_h, dro_h, basis_h END SUBROUTINE starpu_unregister_element_c END INTERFACE INTERFACE SUBROUTINE starpu_loop_element_task_c(coeff, & ro_h,dro_h,basis_h) BIND(C) USE iso_c_binding REAL(KIND=C_DOUBLE),VALUE :: coeff TYPE(C_PTR), INTENT(IN) :: ro_h, dro_h, basis_h END SUBROUTINE starpu_loop_element_task_c END INTERFACE INTERFACE SUBROUTINE starpu_copy_element_task_c( & ro_h,dro_h) BIND(C) USE iso_c_binding TYPE(C_PTR), INTENT(IN) :: ro_h, dro_h END SUBROUTINE starpu_copy_element_task_c END INTERFACE END MODULE mod_interface starpu-1.2.3+dfsg/examples/fortran90/mod_types.f90000066400000000000000000000023431320135501600217350ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2015 ONERA ! Copyright (C) 2015 Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ! ! See the GNU Lesser General Public License in COPYING.LGPL for more details. MODULE mod_types USE iso_c_binding TYPE type_numpar REAL(KIND=C_DOUBLE) :: coeff INTEGER(KIND=C_INT) :: Neq_max END TYPE type_numpar TYPE type_mesh_elt INTEGER(KIND=C_INT) :: Ng, Np REAL(KIND=C_DOUBLE),POINTER,DIMENSION(:,:) :: ro, dro REAL(KIND=C_DOUBLE),POINTER,DIMENSION(:,:) :: basis TYPE(C_PTR) :: ro_h, dro_h, basis_h END TYPE type_mesh_elt TYPE type_mesh TYPE(type_mesh_elt), POINTER, DIMENSION(:) :: elt END TYPE type_mesh END MODULE mod_types starpu-1.2.3+dfsg/examples/gl_interop/000077500000000000000000000000001320135501600177265ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/gl_interop/gl_interop.c000066400000000000000000000067511320135501600222450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2013 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This example demonstrates how to use StarPU combined with OpenGL rendering, * which needs: * * - initializing GLUT first, * - enabling it at initialization, * - running the corresponding CUDA worker in the GLUT thread (here, the main * thread). */ #include #include #if (defined(STARPU_USE_CUDA) && defined(STARPU_OPENGL_RENDER)) #include void dummy(void *buffers[], void *cl_arg) { float *v = (float *) STARPU_VECTOR_GET_PTR(buffers[0]); printf("Codelet running\n"); cudaMemsetAsync(v, 0, STARPU_VECTOR_GET_NX(buffers[0]) * sizeof(float), starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); printf("Codelet done\n"); } struct starpu_codelet cl = { .cuda_funcs = { dummy }, .nbuffers = 1, .modes = { STARPU_W }, }; void foo(void) { } void display(float i) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1, 1, 1); glBegin(GL_LINES); glVertex2f(-i, -i); glVertex2f(i, i); glEnd(); glFinish(); glutPostRedisplay(); glutMainLoopEvent(); } void callback_func(void *foo) { printf("Callback running, rendering\n"); float i = 1.; while (i > 0) { usleep(100000); display(i); i -= 0.1; } printf("rendering done\n"); /* Tell it was already the last submitted task */ starpu_drivers_request_termination(); } #endif int main(int argc, char **argv) { #if !(defined(STARPU_USE_CUDA) && defined(STARPU_OPENGL_RENDER)) return 77; #else struct starpu_conf conf; int cuda_device = 0; int cuda_devices[] = { cuda_device }; struct starpu_driver drivers[] = { { .type = STARPU_CUDA_WORKER, .id.cuda_id = cuda_device } }; int ret; struct starpu_task *task; starpu_data_handle_t handle; glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition(0, 0); glutInitWindowSize(300,200); glutCreateWindow("StarPU OpenGL interoperability test"); glClearColor (0.5, 0.5, 0.5, 0.0); /* Enable OpenGL interoperability */ starpu_conf_init(&conf); conf.ncuda = 1; conf.ncpus = 0; conf.nopencl = 0; conf.cuda_opengl_interoperability = cuda_devices; conf.n_cuda_opengl_interoperability = sizeof(cuda_devices) / sizeof(*cuda_devices); conf.not_launched_drivers = drivers; conf.n_not_launched_drivers = sizeof(drivers) / sizeof(*drivers); ret = starpu_init(&conf); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_vector_data_register(&handle, -1, 0, 10, sizeof(float)); /* Submit just one dumb task */ task = starpu_task_create(); task->cl = &cl; task->handles[0] = handle; task->callback_func = callback_func; task->callback_arg = NULL; ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); /* And run the driver inside main, which will run the task */ printf("running the driver\n"); starpu_driver_run(&drivers[0]); printf("finished running the driver\n"); starpu_shutdown(); return 0; #endif } starpu-1.2.3+dfsg/examples/gl_interop/gl_interop_idle.c000066400000000000000000000077331320135501600232430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2013 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This example demonstrates how to use StarPU combined with OpenGL rendering, * which needs: * * - initializing GLUT first, * - enabling it at initialization, * - running the corresponding CUDA worker in the GLUT thread (here, the main * thread). * * The difference with gl_interop.c is that this version runs StarPU Tasks in * the glut idle handler. */ #include #include #if (defined(STARPU_USE_CUDA) && defined(STARPU_OPENGL_RENDER)) #include void dummy(void *buffers[], void *cl_arg) { float *v = (float *) STARPU_VECTOR_GET_PTR(buffers[0]); printf("Codelet running\n"); cudaMemsetAsync(v, 0, STARPU_VECTOR_GET_NX(buffers[0]) * sizeof(float), starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); printf("Codelet done\n"); } struct starpu_codelet cl = { .cuda_funcs = { dummy }, .nbuffers = 1, .modes = { STARPU_W }, }; void foo(void) { } void display(float i) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1, 1, 1); glBegin(GL_LINES); glVertex2f(-i, -i); glVertex2f(i, i); glEnd(); glFinish(); glutPostRedisplay(); } static int cuda_devices[] = { 0 }; static struct starpu_driver drivers[] = { { .type = STARPU_CUDA_WORKER } }; void callback_func(void *foo) { printf("Callback running, rendering\n"); float i = 1.; while (i > 0) { usleep(100000); display(i); i -= 0.1; } printf("rendering done\n"); /* Tell it was already the last submitted task */ starpu_drivers_request_termination(); /* And terminate StarPU */ starpu_driver_deinit(&drivers[0]); starpu_shutdown(); exit(0); } static void idle(void) { starpu_driver_run_once(&drivers[0]); } #endif int main(int argc, char **argv) { #if !(defined(STARPU_USE_CUDA) && defined(STARPU_OPENGL_RENDER)) return 77; #else struct starpu_conf conf; int ret; struct starpu_task *task; starpu_data_handle_t handle; int cuda_device = 0; cuda_devices[0] = cuda_device; drivers[0].id.cuda_id = cuda_device; glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition(0, 0); glutInitWindowSize(300,200); glutCreateWindow("StarPU OpenGL interoperability test"); glClearColor (0.5, 0.5, 0.5, 0.0); /* Enable OpenGL interoperability */ starpu_conf_init(&conf); conf.ncuda = 1; conf.ncpus = 0; conf.nopencl = 0; conf.cuda_opengl_interoperability = cuda_devices; conf.n_cuda_opengl_interoperability = sizeof(cuda_devices) / sizeof(*cuda_devices); conf.not_launched_drivers = drivers; conf.n_not_launched_drivers = sizeof(drivers) / sizeof(*drivers); ret = starpu_init(&conf); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_vector_data_register(&handle, -1, 0, 10, sizeof(float)); /* Submit just one dumb task */ task = starpu_task_create(); task->cl = &cl; task->handles[0] = handle; task->callback_func = callback_func; task->callback_arg = NULL; ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); /* And run the driver inside main, which will run the task */ printf("running the driver\n"); /* Initialize it */ starpu_driver_init(&drivers[0]); /* Register driver loop content as idle handler */ glutIdleFunc(idle); /* Now run the glut loop */ glutMainLoop(); /* And deinitialize driver */ starpu_driver_deinit(&drivers[0]); printf("finished running the driver\n"); starpu_shutdown(); return 0; #endif } starpu-1.2.3+dfsg/examples/heat/000077500000000000000000000000001320135501600165055ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/heat/dw_factolu.c000066400000000000000000000534611320135501600210110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2015 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This implements an LU factorization. * The task graph is submitted through continuation: the rest of the graph is * submitted as appropriate in the tasks' callback. */ #include "dw_factolu.h" #ifdef STARPU_HAVE_HELGRIND_H #include #endif #ifndef ANNOTATE_HAPPENS_BEFORE #define ANNOTATE_HAPPENS_BEFORE(obj) ((void)0) #endif #ifndef ANNOTATE_HAPPENS_AFTER #define ANNOTATE_HAPPENS_AFTER(obj) ((void)0) #endif #if 0 #define debug(fmt, ...) fprintf(stderr, fmt, ## __VA_ARGS__) #else #define debug(fmt, ...) #endif struct starpu_perfmodel model_11; struct starpu_perfmodel model_12; struct starpu_perfmodel model_21; struct starpu_perfmodel model_22; static unsigned *advance_11; /* size nblocks, whether the 11 task is done */ static unsigned *advance_12_21; /* size nblocks*nblocks */ static unsigned *advance_22; /* array of nblocks *nblocks*nblocks */ static double start; static double end; static unsigned no_prio = 0; static struct starpu_codelet cl11 = { .cpu_funcs = {dw_cpu_codelet_update_u11}, .cpu_funcs_name = {"dw_cpu_codelet_update_u11"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {dw_cublas_codelet_update_u11}, #endif .nbuffers = 1, .modes = {STARPU_RW}, .model = &model_11 }; static struct starpu_codelet cl12 = { .cpu_funcs = {dw_cpu_codelet_update_u12}, .cpu_funcs_name = {"dw_cpu_codelet_update_u12"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {dw_cublas_codelet_update_u12}, #endif .cuda_flags = {STARPU_CUDA_ASYNC}, .nbuffers = 2, .modes = {STARPU_R, STARPU_RW}, .model = &model_12 }; static struct starpu_codelet cl21 = { .cpu_funcs = {dw_cpu_codelet_update_u21}, .cpu_funcs_name = {"dw_cpu_codelet_update_u21"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {dw_cublas_codelet_update_u21}, #endif .cuda_flags = {STARPU_CUDA_ASYNC}, .nbuffers = 2, .modes = {STARPU_R, STARPU_RW}, .model = &model_21 }; static struct starpu_codelet cl22 = { .cpu_funcs = {dw_cpu_codelet_update_u22}, .cpu_funcs_name = {"dw_cpu_codelet_update_u22"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {dw_cublas_codelet_update_u22}, #endif .cuda_flags = {STARPU_CUDA_ASYNC}, .nbuffers = 3, .modes = {STARPU_R, STARPU_R, STARPU_RW}, .model = &model_22 }; #define STARTED 0x01 #define DONE 0x11 /* * Upgraded Callbacks : break the pipeline design ! */ void dw_callback_v2_codelet_update_u22(void *argcb) { int ret; cl_args *args = argcb; unsigned k = args->k; unsigned i = args->i; unsigned j = args->j; unsigned nblocks = args->nblocks; debug("u22 %d %d %d\n", k, i, j); /* we did task 22k,i,j */ advance_22[k*nblocks*nblocks + i + j*nblocks] = DONE; if ( (i == j) && (i == k+1)) { /* we now reduce the LU22 part (recursion appears there) */ cl_args *u11arg = malloc(sizeof(cl_args)); struct starpu_task *task = starpu_task_create(); task->callback_func = dw_callback_v2_codelet_update_u11; task->callback_arg = u11arg; task->cl = &cl11; task->cl_arg = u11arg; task->cl_arg_size = sizeof(*u11arg); task->handles[0] = starpu_data_get_sub_data(args->dataA, 2, k+1, k+1); u11arg->dataA = args->dataA; u11arg->i = k + 1; u11arg->nblocks = args->nblocks; /* schedule the codelet */ if (!no_prio) task->priority = STARPU_MAX_PRIO; debug( "u22 %d %d %d start u11 %d\n", k, i, j, k + 1); ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } /* 11k+1 + 22k,k+1,j => 21 k+1,j */ if ( i == k + 1 && j > k + 1) { uint8_t dep; /* 11 k+1*/ dep = advance_11[(k+1)]; if (dep & DONE) { /* try to push the task */ uint8_t u = STARPU_ATOMIC_OR(&advance_12_21[(k+1) + j*nblocks], STARTED); if ((u & STARTED) == 0) { /* we are the only one that should launch that task */ cl_args *u21a = malloc(sizeof(cl_args)); struct starpu_task *task21 = starpu_task_create(); task21->callback_func = dw_callback_v2_codelet_update_u21; task21->callback_arg = u21a; task21->cl = &cl21; task21->cl_arg = u21a; task21->cl_arg_size = sizeof(*u21a); u21a->i = k+1; u21a->k = j; u21a->nblocks = args->nblocks; u21a->dataA = args->dataA; task21->handles[0] = starpu_data_get_sub_data(args->dataA, 2, u21a->i, u21a->i); task21->handles[1] = starpu_data_get_sub_data(args->dataA, 2, u21a->i, u21a->k); debug( "u22 %d %d %d start u21 %d %d\n", k, i, j, k+1, j); ret = starpu_task_submit(task21); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } } /* 11k + 22k-1,i,k => 12 k,i */ if (j == k + 1 && i > k + 1) { uint8_t dep; /* 11 k+1*/ dep = advance_11[(k+1)]; if (dep & DONE) { /* try to push the task */ uint8_t u = STARPU_ATOMIC_OR(&advance_12_21[(k+1)*nblocks + i], STARTED); if ((u & STARTED) == 0) { /* we are the only one that should launch that task */ cl_args *u12a = malloc(sizeof(cl_args)); struct starpu_task *task12 = starpu_task_create(); task12->callback_func = dw_callback_v2_codelet_update_u12; task12->callback_arg = u12a; task12->cl = &cl12; task12->cl_arg = u12a; task12->cl_arg_size = sizeof(*u12a); u12a->i = k+1; u12a->k = i; u12a->nblocks = args->nblocks; u12a->dataA = args->dataA; task12->handles[0] = starpu_data_get_sub_data(args->dataA, 2, u12a->i, u12a->i); task12->handles[1] = starpu_data_get_sub_data(args->dataA, 2, u12a->k, u12a->i); debug( "u22 %d %d %d start u12 %d %d\n", k, i, j, k+1, i); ret = starpu_task_submit(task12); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } } free(args); } void dw_callback_v2_codelet_update_u12(void *argcb) { int ret; cl_args *args = argcb; /* now launch the update of LU22 */ unsigned i = args->i; unsigned k = args->k; unsigned nblocks = args->nblocks; debug( "u12 %d %d\n", i, k); /* we did task 21i,k */ advance_12_21[i*nblocks + k] = DONE; unsigned slicey; for (slicey = i+1; slicey < nblocks; slicey++) { /* can we launch 22 i,args->k,slicey ? */ /* deps : 21 args->k, slicey */ uint8_t dep; dep = advance_12_21[i + slicey*nblocks]; if (dep & DONE) { /* perhaps we may schedule the 22 i,args->k,slicey task */ uint8_t u = STARPU_ATOMIC_OR(&advance_22[i*nblocks*nblocks + slicey*nblocks + k], STARTED); if ((u & STARTED) == 0) { /* update that square matrix */ cl_args *u22a = malloc(sizeof(cl_args)); struct starpu_task *task22 = starpu_task_create(); task22->callback_func = dw_callback_v2_codelet_update_u22; task22->callback_arg = u22a; task22->cl = &cl22; task22->cl_arg = u22a; task22->cl_arg_size = sizeof(*u22a); u22a->k = i; u22a->i = k; u22a->j = slicey; u22a->dataA = args->dataA; u22a->nblocks = nblocks; task22->handles[0] = starpu_data_get_sub_data(args->dataA, 2, u22a->i, u22a->k); task22->handles[1] = starpu_data_get_sub_data(args->dataA, 2, u22a->k, u22a->j); task22->handles[2] = starpu_data_get_sub_data(args->dataA, 2, u22a->i, u22a->j); /* schedule that codelet */ if (!no_prio && (slicey == i+1)) task22->priority = STARPU_MAX_PRIO; debug( "u12 %d %d start u22 %d %d %d\n", i, k, i, k, slicey); ret = starpu_task_submit(task22); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } } free(argcb); } void dw_callback_v2_codelet_update_u21(void *argcb) { int ret; cl_args *args = argcb; /* now launch the update of LU22 */ unsigned i = args->i; unsigned k = args->k; unsigned nblocks = args->nblocks; /* we did task 21i,k */ advance_12_21[i + k*nblocks] = DONE; debug("u21 %d %d\n", i, k); unsigned slicex; for (slicex = i+1; slicex < nblocks; slicex++) { /* can we launch 22 i,slicex,k ? */ /* deps : 12 slicex k */ uint8_t dep; dep = advance_12_21[i*nblocks + slicex]; if (dep & DONE) { /* perhaps we may schedule the 22 i,args->k,slicey task */ uint8_t u = STARPU_ATOMIC_OR(&advance_22[i*nblocks*nblocks + k*nblocks + slicex], STARTED); if ((u & STARTED) == 0) { /* update that square matrix */ cl_args *u22a = malloc(sizeof(cl_args)); struct starpu_task *task22 = starpu_task_create(); task22->callback_func = dw_callback_v2_codelet_update_u22; task22->callback_arg = u22a; task22->cl = &cl22; task22->cl_arg = u22a; task22->cl_arg_size = sizeof(*u22a); u22a->k = i; u22a->i = slicex; u22a->j = k; u22a->dataA = args->dataA; u22a->nblocks = nblocks; task22->handles[0] = starpu_data_get_sub_data(args->dataA, 2, u22a->i, u22a->k); task22->handles[1] = starpu_data_get_sub_data(args->dataA, 2, u22a->k, u22a->j); task22->handles[2] = starpu_data_get_sub_data(args->dataA, 2, u22a->i, u22a->j); /* schedule that codelet */ if (!no_prio && (slicex == i+1)) task22->priority = STARPU_MAX_PRIO; debug( "u21 %d %d start u22 %d %d %d\n", i, k, i, slicex, k); ret = starpu_task_submit(task22); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } } free(argcb); } void dw_callback_v2_codelet_update_u11(void *argcb) { /* in case there remains work, go on */ cl_args *args = argcb; unsigned nblocks = args->nblocks; unsigned i = args->i; debug("u11 %d\n", i); /* we did task 11k */ advance_11[i] = DONE; if (i == nblocks - 1) { /* we are done */ free(argcb); return; } else { /* put new tasks */ unsigned slice; for (slice = i + 1; slice < nblocks; slice++) { /* can we launch 12i,slice ? */ uint8_t deps12; if (i == 0) { deps12 = DONE; } else { deps12 = advance_22[(i-1)*nblocks*nblocks + slice + i*nblocks]; } if (deps12 & DONE) { /* we may perhaps launch the task 12i,slice */ uint8_t u = STARPU_ATOMIC_OR(&advance_12_21[i*nblocks + slice], STARTED); if ((u & STARTED) == 0) { int ret; /* we are the only one that should launch that task */ cl_args *u12a = malloc(sizeof(cl_args)); struct starpu_task *task12 = starpu_task_create(); task12->callback_func = dw_callback_v2_codelet_update_u12; task12->callback_arg = u12a; task12->cl = &cl12; task12->cl_arg = u12a; task12->cl_arg_size = sizeof(*u12a); u12a->i = i; u12a->k = slice; u12a->nblocks = args->nblocks; u12a->dataA = args->dataA; task12->handles[0] = starpu_data_get_sub_data(args->dataA, 2, u12a->i, u12a->i); task12->handles[1] = starpu_data_get_sub_data(args->dataA, 2, u12a->k, u12a->i); if (!no_prio && (slice == i +1)) task12->priority = STARPU_MAX_PRIO; debug( "u11 %d start u12 %d %d\n", i, i, slice); ret = starpu_task_submit(task12); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } /* can we launch 21i,slice ? */ if (i == 0) { deps12 = DONE; } else { deps12 = advance_22[(i-1)*nblocks*nblocks + slice*nblocks + i]; } if (deps12 & DONE) { /* we may perhaps launch the task 12i,slice */ uint8_t u = STARPU_ATOMIC_OR(&advance_12_21[i + slice*nblocks], STARTED); if ((u & STARTED) == 0) { int ret; /* we are the only one that should launch that task */ cl_args *u21a = malloc(sizeof(cl_args)); struct starpu_task *task21 = starpu_task_create(); task21->callback_func = dw_callback_v2_codelet_update_u21; task21->callback_arg = u21a; task21->cl = &cl21; task21->cl_arg = u21a; task21->cl_arg_size = sizeof(*u21a); u21a->i = i; u21a->k = slice; u21a->nblocks = args->nblocks; u21a->dataA = args->dataA; task21->handles[0] = starpu_data_get_sub_data(args->dataA, 2, u21a->i, u21a->i); task21->handles[1] = starpu_data_get_sub_data(args->dataA, 2, u21a->i, u21a->k); if (!no_prio && (slice == i +1)) task21->priority = STARPU_MAX_PRIO; debug( "u11 %d start u21 %d %d\n", i, i, slice); ret = starpu_task_submit(task21); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } } } free(argcb); } /* * Callbacks */ void dw_callback_codelet_update_u11(void *argcb) { /* in case there remains work, go on */ cl_args *args = argcb; if (args->i == args->nblocks - 1) { /* we are done */ free(argcb); return; } else { /* put new tasks */ unsigned nslices; nslices = args->nblocks - 1 - args->i; unsigned *remaining = malloc(sizeof(unsigned)); *remaining = 2*nslices; unsigned slice; for (slice = args->i + 1; slice < args->nblocks; slice++) { int ret; /* update slice from u12 */ cl_args *u12a = malloc(sizeof(cl_args)); /* update slice from u21 */ cl_args *u21a = malloc(sizeof(cl_args)); struct starpu_task *task12 = starpu_task_create(); task12->callback_func = dw_callback_codelet_update_u12_21; task12->callback_arg = u12a; task12->cl = &cl12; task12->cl_arg = u12a; task12->cl_arg_size = sizeof(*u12a); struct starpu_task *task21 = starpu_task_create(); task21->callback_func = dw_callback_codelet_update_u12_21; task21->callback_arg = u21a; task21->cl = &cl21; task21->cl_arg = u21a; task21->cl_arg_size = sizeof(*u21a); u12a->i = args->i; u12a->k = slice; u12a->nblocks = args->nblocks; u12a->dataA = args->dataA; u12a->remaining = remaining; u21a->i = args->i; u21a->k = slice; u21a->nblocks = args->nblocks; u21a->dataA = args->dataA; u21a->remaining = remaining; task12->handles[0] = starpu_data_get_sub_data(args->dataA, 2, u12a->i, u12a->i); task12->handles[1] = starpu_data_get_sub_data(args->dataA, 2, u12a->k, u12a->i); task21->handles[0] = starpu_data_get_sub_data(args->dataA, 2, u21a->i, u21a->i); task21->handles[1] = starpu_data_get_sub_data(args->dataA, 2, u21a->i, u21a->k); ret = starpu_task_submit(task12); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(task21); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } free(remaining); } } void dw_callback_codelet_update_u22(void *argcb) { cl_args *args = argcb; unsigned remaining = STARPU_ATOMIC_ADD(args->remaining, (-1)); ANNOTATE_HAPPENS_BEFORE(args->remaining); if (remaining == 0) { int ret; ANNOTATE_HAPPENS_AFTER(args->remaining); /* all worker already used the counter */ free(args->remaining); /* we now reduce the LU22 part (recursion appears there) */ cl_args *u11arg = malloc(sizeof(cl_args)); struct starpu_task *task = starpu_task_create(); task->callback_func = dw_callback_codelet_update_u11; task->callback_arg = u11arg; task->cl = &cl11; task->cl_arg = u11arg; task->cl_arg_size = sizeof(*u11arg); task->handles[0] = starpu_data_get_sub_data(args->dataA, 2, args->k + 1, args->k + 1); u11arg->dataA = args->dataA; u11arg->i = args->k + 1; u11arg->nblocks = args->nblocks; /* schedule the codelet */ ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } free(args); } void dw_callback_codelet_update_u12_21(void *argcb) { cl_args *args = argcb; unsigned remaining = STARPU_ATOMIC_ADD(args->remaining, -1); ANNOTATE_HAPPENS_BEFORE(args->remaining); if (remaining == 0) { ANNOTATE_HAPPENS_AFTER(args->remaining); /* now launch the update of LU22 */ unsigned i = args->i; unsigned nblocks = args->nblocks; /* the number of tasks to be done */ unsigned *remaining = malloc(sizeof(unsigned)); *remaining = (nblocks - 1 - i)*(nblocks - 1 - i); unsigned slicey, slicex; for (slicey = i+1; slicey < nblocks; slicey++) { for (slicex = i+1; slicex < nblocks; slicex++) { int ret; /* update that square matrix */ cl_args *u22a = malloc(sizeof(cl_args)); struct starpu_task *task22 = starpu_task_create(); task22->callback_func = dw_callback_codelet_update_u22; task22->callback_arg = u22a; task22->cl = &cl22; task22->cl_arg = u22a; task22->cl_arg_size = sizeof(*u22a); u22a->k = i; u22a->i = slicex; u22a->j = slicey; u22a->dataA = args->dataA; u22a->nblocks = nblocks; u22a->remaining = remaining; task22->handles[0] = starpu_data_get_sub_data(args->dataA, 2, u22a->i, u22a->k); task22->handles[1] = starpu_data_get_sub_data(args->dataA, 2, u22a->k, u22a->j); task22->handles[2] = starpu_data_get_sub_data(args->dataA, 2, u22a->i, u22a->j); /* schedule that codelet */ ret = starpu_task_submit(task22); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } free(remaining); } } /* * code to bootstrap the factorization */ void dw_codelet_facto(starpu_data_handle_t dataA, unsigned nblocks) { int ret; cl_args *args = malloc(sizeof(cl_args)); args->i = 0; args->nblocks = nblocks; args->dataA = dataA; start = starpu_timing_now(); /* inject a new task with this codelet into the system */ struct starpu_task *task = starpu_task_create(); task->callback_func = dw_callback_codelet_update_u11; task->callback_arg = args; task->cl = &cl11; task->cl_arg = args; task->handles[0] = starpu_data_get_sub_data(dataA, 2, 0, 0); /* schedule the codelet */ ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_task_wait_for_all(); end = starpu_timing_now(); double timing = end - start; unsigned n = starpu_matrix_get_nx(dataA); double flop = (2.0f*n*n*n)/3.0f; PRINTF("# size\tms\tGFlops\n"); PRINTF("%u\t%.0f\t%.1f\n", n, timing/1000, flop/timing/1000.0f); } void dw_codelet_facto_v2(starpu_data_handle_t dataA, unsigned nblocks) { advance_11 = calloc(nblocks, sizeof(*advance_11)); STARPU_ASSERT(advance_11); advance_12_21 = calloc(nblocks*nblocks, sizeof(*advance_12_21)); STARPU_ASSERT(advance_12_21); advance_22 = calloc(nblocks*nblocks*nblocks, sizeof(*advance_22)); STARPU_ASSERT(advance_22); cl_args *args = malloc(sizeof(cl_args)); args->i = 0; args->nblocks = nblocks; args->dataA = dataA; start = starpu_timing_now(); /* inject a new task with this codelet into the system */ struct starpu_task *task = starpu_task_create(); task->callback_func = dw_callback_v2_codelet_update_u11; task->callback_arg = args; task->cl = &cl11; task->cl_arg = args; task->cl_arg_size = sizeof(*args); task->handles[0] = starpu_data_get_sub_data(dataA, 2, 0, 0); /* schedule the codelet */ int ret = starpu_task_submit(task); if (STARPU_UNLIKELY(ret == -ENODEV)) { FPRINTF(stderr, "No worker may execute this task\n"); exit(0); } starpu_task_wait_for_all(); end = starpu_timing_now(); double timing = end - start; unsigned n = starpu_matrix_get_nx(dataA); double flop = (2.0f*n*n*n)/3.0f; PRINTF("# size\tms\tGFlops\n"); PRINTF("%u\t%.0f\t%.1f\n", n, timing/1000, flop/timing/1000.0f); free(advance_11); free(advance_12_21); free(advance_22); } void initialize_system(float **A, float **B, unsigned dim, unsigned pinned) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) exit(77); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_ATLAS char * symbol_11 = "lu_model_11_atlas"; char * symbol_12 = "lu_model_12_atlas"; char * symbol_21 = "lu_model_21_atlas"; char * symbol_22 = "lu_model_22_atlas"; #elif defined(STARPU_GOTO) char * symbol_11 = "lu_model_11_goto"; char * symbol_12 = "lu_model_12_goto"; char * symbol_21 = "lu_model_21_goto"; char * symbol_22 = "lu_model_22_goto"; #else char * symbol_11 = "lu_model_11"; char * symbol_12 = "lu_model_12"; char * symbol_21 = "lu_model_21"; char * symbol_22 = "lu_model_22"; #endif initialize_lu_kernels_model(&model_11,symbol_11,task_11_cost,task_11_cost_cpu,task_11_cost_cuda); initialize_lu_kernels_model(&model_12,symbol_12,task_12_cost,task_12_cost_cpu,task_12_cost_cuda); initialize_lu_kernels_model(&model_21,symbol_21,task_21_cost,task_21_cost_cpu,task_21_cost_cuda); initialize_lu_kernels_model(&model_22,symbol_22,task_22_cost,task_22_cost_cpu,task_22_cost_cuda); starpu_cublas_init(); if (pinned) { starpu_malloc((void **)A, (size_t)dim*dim*sizeof(float)); starpu_malloc((void **)B, (size_t)dim*sizeof(float)); } else { *A = malloc((size_t)dim*dim*sizeof(float)); STARPU_ASSERT(*A); *B = malloc((size_t)dim*sizeof(float)); STARPU_ASSERT(*B); } } void free_system(float *A, float *B, unsigned dim, unsigned pinned) { if (pinned) { starpu_free(A); starpu_free(B); } else { free(A); free(B); } } void dw_factoLU(float *matA, unsigned size, unsigned ld, unsigned nblocks, unsigned version, unsigned _no_prio) { #ifdef CHECK_RESULTS FPRINTF(stderr, "Checking results ...\n"); float *Asaved; Asaved = malloc((size_t)ld*ld*sizeof(float)); memcpy(Asaved, matA, (size_t)ld*ld*sizeof(float)); #endif no_prio = _no_prio; starpu_data_handle_t dataA; /* monitor and partition the A matrix into blocks : * one block is now determined by 2 unsigned (i,j) */ starpu_matrix_data_register(&dataA, STARPU_MAIN_RAM, (uintptr_t)matA, ld, size, size, sizeof(float)); struct starpu_data_filter f = { .filter_func = starpu_matrix_filter_vertical_block, .nchildren = nblocks }; struct starpu_data_filter f2 = { .filter_func = starpu_matrix_filter_block, .nchildren = nblocks }; starpu_data_map_filters(dataA, 2, &f, &f2); switch (version) { case 1: dw_codelet_facto(dataA, nblocks); break; default: case 2: dw_codelet_facto_v2(dataA, nblocks); break; } /* gather all the data */ starpu_data_unpartition(dataA, STARPU_MAIN_RAM); starpu_data_unregister(dataA); #ifdef CHECK_RESULTS compare_A_LU(Asaved, matA, size, ld); #endif } starpu-1.2.3+dfsg/examples/heat/dw_factolu.h000066400000000000000000000110411320135501600210020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2012, 2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DW_FACTO_LU_H__ #define __DW_FACTO_LU_H__ #include #include #include #include #ifdef STARPU_USE_CUDA #include #include #endif #include "../common/blas.h" #include "lu_kernels_model.h" #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #define PRINTF(fmt, ...) do { if (!getenv("STARPU_SSILENT")) {printf(fmt, ## __VA_ARGS__); }} while(0) #define BLAS3_FLOP(n1,n2,n3) \ (2*((uint64_t)n1)*((uint64_t)n2)*((uint64_t)n3)) typedef struct { starpu_data_handle_t dataA; unsigned i; unsigned j; unsigned k; unsigned nblocks; unsigned *remaining; } cl_args; #ifdef CHECK_RESULTS static void STARPU_ATTRIBUTE_UNUSED compare_A_LU(float *A, float *LU, unsigned size, unsigned ld) { unsigned i,j; float *L; float *U; L = malloc(size*size*sizeof(float)); U = malloc(size*size*sizeof(float)); memset(L, 0, size*size*sizeof(float)); memset(U, 0, size*size*sizeof(float)); /* only keep the lower part */ for (j = 0; j < size; j++) { for (i = 0; i < j; i++) { L[j+i*size] = LU[j+i*ld]; } /* diag i = j */ L[j+j*size] = LU[j+j*ld]; U[j+j*size] = 1.0f; for (i = j+1; i < size; i++) { U[j+i*size] = LU[j+i*ld]; } } #if 0 /* display L */ FPRINTF(stdout, "(LU): \n"); for (j = 0; j < size; j++) { for (i = 0; i < size; i++) { /* if (i <= j) { */ FPRINTF(stdout, "%2.2f\t", LU[j +i*size]); /* } else { FPRINTF(stdout, ".\t"); } */ } FPRINTF(stdout, "\n"); } /* display L */ FPRINTF(stdout, "L: \n"); for (j = 0; j < size; j++) { for (i = 0; i < size; i++) { /* if (i <= j) { */ FPRINTF(stdout, "%2.2f\t", L[j +i*size]); /* } else { FPRINTF(stdout, ".\t"); } */ } FPRINTF(stdout, "\n"); } /* display U */ FPRINTF(stdout, "U: \n"); for (j = 0; j < size; j++) { for (i = 0; i < size; i++) { /* if (i <= j) { */ FPRINTF(stdout, "%2.2f\t", U[j +i*size]); /* } else { FPRINTF(stdout, ".\t"); } */ } FPRINTF(stdout, "\n"); } #endif /* now A_err = L, compute L*U */ STARPU_STRMM("R", "U", "N", "U", size, size, 1.0f, U, size, L, size); float max_err = 0.0f; for (i = 0; i < size ; i++) { for (j = 0; j < size; j++) { max_err = STARPU_MAX(max_err, fabs( L[j+i*size] - A[j+i*ld] )); } } #if 0 /* display A */ FPRINTF(stdout, "A: \n"); for (j = 0; j < size; j++) { for (i = 0; i < size; i++) { /* if (i <= j) { */ FPRINTF(stdout, "%2.2f\t", A[j +i*size]); /* } else { FPRINTF(stdout, ".\t"); } */ } FPRINTF(stdout, "\n"); } /* display LU */ FPRINTF(stdout, "LU: \n"); for (j = 0; j < size; j++) { for (i = 0; i < size; i++) { /* if (i <= j) { */ FPRINTF(stdout, "%2.2f\t", L[j +i*size]); /* } else { FPRINTF(stdout, ".\t"); } */ } FPRINTF(stdout, "\n"); } #endif FPRINTF(stdout, "max error between A and L*U = %f \n", max_err); } #endif /* CHECK_RESULTS */ void dw_cpu_codelet_update_u11(void **, void *); void dw_cpu_codelet_update_u12(void **, void *); void dw_cpu_codelet_update_u21(void **, void *); void dw_cpu_codelet_update_u22(void **, void *); #ifdef STARPU_USE_CUDA void dw_cublas_codelet_update_u11(void *descr[], void *_args); void dw_cublas_codelet_update_u12(void *descr[], void *_args); void dw_cublas_codelet_update_u21(void *descr[], void *_args); void dw_cublas_codelet_update_u22(void *descr[], void *_args); #endif void dw_callback_codelet_update_u11(void *); void dw_callback_codelet_update_u12_21(void *); void dw_callback_codelet_update_u22(void *); void dw_callback_v2_codelet_update_u11(void *); void dw_callback_v2_codelet_update_u12(void *); void dw_callback_v2_codelet_update_u21(void *); void dw_callback_v2_codelet_update_u22(void *); #endif /* __DW_FACTO_LU_H__ */ starpu-1.2.3+dfsg/examples/heat/dw_factolu_grain.c000066400000000000000000000237561320135501600221750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011, 2014-2015 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This implements an LU factorization. * The task graph is submitted through dependency tags. * It also changes the partitioning during execution: when called first, * dw_factoLU_grain_inner splits the matrix with a big granularity (nblocks) * and processes nbigblocks blocks, before calling itself again, to process the * remainder of the matrix with a smaller granularity. */ #include "dw_factolu.h" #define TAG11(k, prefix) ((starpu_tag_t)( (((unsigned long long)(prefix))<<60) | (1ULL<<56) | (unsigned long long)(k))) #define TAG12(k,i, prefix) ((starpu_tag_t)((((unsigned long long)(prefix))<<60) | ((2ULL<<56) | (((unsigned long long)(k))<<32) \ | (unsigned long long)(i)))) #define TAG21(k,j, prefix) ((starpu_tag_t)( (((unsigned long long)(prefix))<<60) | ((3ULL<<56) | (((unsigned long long)(k))<<32) \ | (unsigned long long)(j)))) #define TAG22(k,i,j, prefix) ((starpu_tag_t)( (((unsigned long long)(prefix))<<60) | ((4ULL<<56) | ((unsigned long long)(k)<<32) \ | ((unsigned long long)(i)<<16) \ | (unsigned long long)(j)))) struct starpu_perfmodel model_11; struct starpu_perfmodel model_12; struct starpu_perfmodel model_21; struct starpu_perfmodel model_22; /* * Construct the DAG */ static struct starpu_task *create_task(starpu_tag_t id) { struct starpu_task *task = starpu_task_create(); task->cl_arg = NULL; task->use_tag = 1; task->tag_id = id; return task; } static struct starpu_codelet cl11 = { .modes = { STARPU_RW }, .cpu_funcs = {dw_cpu_codelet_update_u11}, .cpu_funcs_name = {"dw_cpu_codelet_update_u11"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {dw_cublas_codelet_update_u11}, #endif .nbuffers = 1, .model = &model_11 }; static struct starpu_task *create_task_11(starpu_data_handle_t dataA, unsigned k, unsigned tag_prefix) { /* FPRINTF(stdout, "task 11 k = %d TAG = %llx\n", k, (TAG11(k))); */ struct starpu_task *task = create_task(TAG11(k, tag_prefix)); task->cl = &cl11; /* which sub-data is manipulated ? */ task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, k); /* this is an important task */ task->priority = STARPU_MAX_PRIO; /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG11(k, tag_prefix), 1, TAG22(k-1, k, k, tag_prefix)); } return task; } static struct starpu_codelet cl12 = { .modes = { STARPU_R, STARPU_RW }, .cpu_funcs = {dw_cpu_codelet_update_u12}, .cpu_funcs_name = {"dw_cpu_codelet_update_u12"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {dw_cublas_codelet_update_u12}, #endif .cuda_flags = {STARPU_CUDA_ASYNC}, .nbuffers = 2, .model = &model_12 }; static void create_task_12(starpu_data_handle_t dataA, unsigned k, unsigned i, unsigned tag_prefix) { int ret; /* FPRINTF(stdout, "task 12 k,i = %d,%d TAG = %llx\n", k,i, TAG12(k,i)); */ struct starpu_task *task = create_task(TAG12(k, i, tag_prefix)); task->cl = &cl12; /* which sub-data is manipulated ? */ task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, k); task->handles[1] = starpu_data_get_sub_data(dataA, 2, i, k); if (i == k+1) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG12(k, i, tag_prefix), 2, TAG11(k, tag_prefix), TAG22(k-1, i, k, tag_prefix)); } else { starpu_tag_declare_deps(TAG12(k, i, tag_prefix), 1, TAG11(k, tag_prefix)); } ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } static struct starpu_codelet cl21 = { .modes = { STARPU_R, STARPU_RW }, .cpu_funcs = {dw_cpu_codelet_update_u21}, .cpu_funcs_name = {"dw_cpu_codelet_update_u21"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {dw_cublas_codelet_update_u21}, #endif .cuda_flags = {STARPU_CUDA_ASYNC}, .nbuffers = 2, .model = &model_21 }; static void create_task_21(starpu_data_handle_t dataA, unsigned k, unsigned j, unsigned tag_prefix) { int ret; struct starpu_task *task = create_task(TAG21(k, j, tag_prefix)); task->cl = &cl21; /* which sub-data is manipulated ? */ task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, k); task->handles[1] = starpu_data_get_sub_data(dataA, 2, k, j); if (j == k+1) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG21(k, j, tag_prefix), 2, TAG11(k, tag_prefix), TAG22(k-1, k, j, tag_prefix)); } else { starpu_tag_declare_deps(TAG21(k, j, tag_prefix), 1, TAG11(k, tag_prefix)); } ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } static struct starpu_codelet cl22 = { .modes = { STARPU_R, STARPU_R, STARPU_RW }, .cpu_funcs = {dw_cpu_codelet_update_u22}, .cpu_funcs_name = {"dw_cpu_codelet_update_u22"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {dw_cublas_codelet_update_u22}, #endif .cuda_flags = {STARPU_CUDA_ASYNC}, .nbuffers = 3, .model = &model_22 }; static void create_task_22(starpu_data_handle_t dataA, unsigned k, unsigned i, unsigned j, unsigned tag_prefix) { int ret; /* FPRINTF(stdout, "task 22 k,i,j = %d,%d,%d TAG = %llx\n", k,i,j, TAG22(k,i,j)); */ struct starpu_task *task = create_task(TAG22(k, i, j, tag_prefix)); task->cl = &cl22; /* which sub-data is manipulated ? */ task->handles[0] = starpu_data_get_sub_data(dataA, 2, i, k); task->handles[1] = starpu_data_get_sub_data(dataA, 2, k, j); task->handles[2] = starpu_data_get_sub_data(dataA, 2, i, j); if ( (i == k + 1) && (j == k +1) ) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG22(k, i, j, tag_prefix), 3, TAG22(k-1, i, j, tag_prefix), TAG12(k, i, tag_prefix), TAG21(k, j, tag_prefix)); } else { starpu_tag_declare_deps(TAG22(k, i, j, tag_prefix), 2, TAG12(k, i, tag_prefix), TAG21(k, j, tag_prefix)); } ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } static void dw_factoLU_grain_inner(float *matA, unsigned size, unsigned inner_size, unsigned ld, unsigned blocksize, unsigned tag_prefix) { int ret; /* * (re)partition data */ starpu_data_handle_t dataA; starpu_matrix_data_register(&dataA, STARPU_MAIN_RAM, (uintptr_t)matA, ld, size, size, sizeof(float)); STARPU_ASSERT((size % blocksize) == 0); STARPU_ASSERT((inner_size % blocksize) == 0); unsigned nblocks = size / blocksize; unsigned maxk = inner_size / blocksize; struct starpu_data_filter f = { .filter_func = starpu_matrix_filter_vertical_block, .nchildren = nblocks }; struct starpu_data_filter f2 = { .filter_func = starpu_matrix_filter_block, .nchildren = nblocks }; starpu_data_map_filters(dataA, 2, &f, &f2); /* * submit tasks */ struct starpu_task *entry_task = NULL; /* create all the DAG nodes */ unsigned i,j,k; /* if maxk < nblocks we'll stop before the LU decomposition is totally done */ for (k = 0; k < maxk; k++) { struct starpu_task *task = create_task_11(dataA, k, tag_prefix); /* we defer the launch of the first task */ if (k == 0) { entry_task = task; } else { ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } for (i = k+1; i #endif #ifdef STARPU_USE_CUDA #include #include static const float p1 = 1.0; static const float m1 = -1.0; #endif unsigned count_11_per_worker[STARPU_NMAXWORKERS] = {0}; unsigned count_12_per_worker[STARPU_NMAXWORKERS] = {0}; unsigned count_21_per_worker[STARPU_NMAXWORKERS] = {0}; unsigned count_22_per_worker[STARPU_NMAXWORKERS] = {0}; unsigned count_total_per_worker[STARPU_NMAXWORKERS] = {0}; unsigned count_11_total = 0; unsigned count_12_total = 0; unsigned count_21_total = 0; unsigned count_22_total = 0; void display_stat_heat(void) { unsigned nworkers = starpu_worker_get_count(); FPRINTF(stderr, "STATS : \n"); unsigned worker; for (worker = 0; worker < nworkers; worker++) { count_total_per_worker[worker] = count_11_per_worker[worker] + count_12_per_worker[worker] + count_21_per_worker[worker] + count_22_per_worker[worker]; count_11_total += count_11_per_worker[worker]; count_12_total += count_12_per_worker[worker]; count_21_total += count_21_per_worker[worker]; count_22_total += count_22_per_worker[worker]; } FPRINTF(stderr, "\t11 (diagonal block LU)\n"); for (worker = 0; worker < nworkers; worker++) { if (count_total_per_worker[worker]) { char name[32]; starpu_worker_get_name(worker, name, 32); FPRINTF(stderr, "\t\t%s -> %u / %u (%2.2f %%)\n", name, count_11_per_worker[worker], count_11_total, (100.0*count_11_per_worker[worker])/count_11_total); } } FPRINTF(stderr, "\t12 (TRSM)\n"); for (worker = 0; worker < nworkers; worker++) { if (count_total_per_worker[worker]) { char name[32]; starpu_worker_get_name(worker, name, 32); FPRINTF(stderr, "\t\t%s -> %u / %u (%2.2f %%)\n", name, count_12_per_worker[worker], count_12_total, (100.0*count_12_per_worker[worker])/count_12_total); } } FPRINTF(stderr, "\t21 (TRSM)\n"); for (worker = 0; worker < nworkers; worker++) { if (count_total_per_worker[worker]) { char name[32]; starpu_worker_get_name(worker, name, 32); FPRINTF(stderr, "\t\t%s -> %u / %u (%2.2f %%)\n", name, count_21_per_worker[worker], count_21_total, (100.0*count_21_per_worker[worker])/count_21_total); } } FPRINTF(stderr, "\t22 (SGEMM)\n"); for (worker = 0; worker < nworkers; worker++) { if (count_total_per_worker[worker]) { char name[32]; starpu_worker_get_name(worker, name, 32); FPRINTF(stderr, "\t\t%s -> %u / %u (%2.2f %%)\n", name, count_22_per_worker[worker], count_22_total, (100.0*count_22_per_worker[worker])/count_22_total); } } } /* * U22 */ static inline void dw_common_cpu_codelet_update_u22(void *descr[], int s, STARPU_ATTRIBUTE_UNUSED void *_args) { float *left = (float *)STARPU_MATRIX_GET_PTR(descr[0]); float *right = (float *)STARPU_MATRIX_GET_PTR(descr[1]); float *center = (float *)STARPU_MATRIX_GET_PTR(descr[2]); unsigned dx = STARPU_MATRIX_GET_NX(descr[2]); unsigned dy = STARPU_MATRIX_GET_NY(descr[2]); unsigned dz = STARPU_MATRIX_GET_NY(descr[0]); unsigned ld12 = STARPU_MATRIX_GET_LD(descr[0]); unsigned ld21 = STARPU_MATRIX_GET_LD(descr[1]); unsigned ld22 = STARPU_MATRIX_GET_LD(descr[2]); #ifdef STARPU_USE_CUDA cublasStatus status; #endif switch (s) { case 0: STARPU_SGEMM("N", "N", dy, dx, dz, -1.0f, left, ld21, right, ld12, 1.0f, center, ld22); break; #ifdef STARPU_USE_CUDA case 1: status = cublasSgemm(starpu_cublas_get_local_handle(), CUBLAS_OP_N, CUBLAS_OP_N, dx, dy, dz, &m1, left, ld21, right, ld12, &p1, center, ld22); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); break; #endif default: STARPU_ABORT(); break; } } void dw_cpu_codelet_update_u22(void *descr[], void *_args) { dw_common_cpu_codelet_update_u22(descr, 0, _args); int id = starpu_worker_get_id_check(); count_22_per_worker[id]++; } #ifdef STARPU_USE_CUDA void dw_cublas_codelet_update_u22(void *descr[], void *_args) { dw_common_cpu_codelet_update_u22(descr, 1, _args); int id = starpu_worker_get_id_check(); count_22_per_worker[id]++; } #endif /* STARPU_USE_CUDA */ /* * U12 */ static inline void dw_common_codelet_update_u12(void *descr[], int s, STARPU_ATTRIBUTE_UNUSED void *_args) { float *sub11; float *sub12; sub11 = (float *)STARPU_MATRIX_GET_PTR(descr[0]); sub12 = (float *)STARPU_MATRIX_GET_PTR(descr[1]); unsigned ld11 = STARPU_MATRIX_GET_LD(descr[0]); unsigned ld12 = STARPU_MATRIX_GET_LD(descr[1]); unsigned nx12 = STARPU_MATRIX_GET_NX(descr[1]); unsigned ny12 = STARPU_MATRIX_GET_NY(descr[1]); #ifdef STARPU_USE_CUDA cublasStatus status; #endif /* solve L11 U12 = A12 (find U12) */ switch (s) { case 0: STARPU_STRSM("L", "L", "N", "N", nx12, ny12, 1.0f, sub11, ld11, sub12, ld12); break; #ifdef STARPU_USE_CUDA case 1: status = cublasStrsm(starpu_cublas_get_local_handle(), CUBLAS_SIDE_LEFT, CUBLAS_FILL_MODE_LOWER, CUBLAS_OP_N, CUBLAS_DIAG_NON_UNIT, ny12, nx12, &p1, sub11, ld11, sub12, ld12); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); break; #endif default: STARPU_ABORT(); break; } } void dw_cpu_codelet_update_u12(void *descr[], void *_args) { dw_common_codelet_update_u12(descr, 0, _args); int id = starpu_worker_get_id_check(); count_12_per_worker[id]++; } #ifdef STARPU_USE_CUDA void dw_cublas_codelet_update_u12(void *descr[], void *_args) { dw_common_codelet_update_u12(descr, 1, _args); int id = starpu_worker_get_id_check(); count_12_per_worker[id]++; } #endif /* STARPU_USE_CUDA */ /* * U21 */ static inline void dw_common_codelet_update_u21(void *descr[], int s, STARPU_ATTRIBUTE_UNUSED void *_args) { float *sub11; float *sub21; sub11 = (float *)STARPU_MATRIX_GET_PTR(descr[0]); sub21 = (float *)STARPU_MATRIX_GET_PTR(descr[1]); unsigned ld11 = STARPU_MATRIX_GET_LD(descr[0]); unsigned ld21 = STARPU_MATRIX_GET_LD(descr[1]); unsigned nx21 = STARPU_MATRIX_GET_NX(descr[1]); unsigned ny21 = STARPU_MATRIX_GET_NY(descr[1]); #ifdef STARPU_USE_CUDA cublasStatus status; #endif switch (s) { case 0: STARPU_STRSM("R", "U", "N", "U", nx21, ny21, 1.0f, sub11, ld11, sub21, ld21); break; #ifdef STARPU_USE_CUDA case 1: status = cublasStrsm(starpu_cublas_get_local_handle(), CUBLAS_SIDE_RIGHT, CUBLAS_FILL_MODE_UPPER, CUBLAS_OP_N, CUBLAS_DIAG_UNIT, ny21, nx21, &p1, sub11, ld11, sub21, ld21); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); break; #endif default: STARPU_ABORT(); break; } } void dw_cpu_codelet_update_u21(void *descr[], void *_args) { dw_common_codelet_update_u21(descr, 0, _args); int id = starpu_worker_get_id_check(); count_21_per_worker[id]++; } #ifdef STARPU_USE_CUDA void dw_cublas_codelet_update_u21(void *descr[], void *_args) { dw_common_codelet_update_u21(descr, 1, _args); int id = starpu_worker_get_id_check(); count_21_per_worker[id]++; } #endif /* * U11 */ static inline void debug_print(float *tab, unsigned ld, unsigned n) { unsigned j,i; for (j = 0; j < n; j++) { for (i = 0; i < n; i++) { FPRINTF(stderr, "%2.2f\t", tab[(size_t)j+(size_t)i*ld]); } FPRINTF(stderr, "\n"); } FPRINTF(stderr, "\n"); } static inline void dw_common_codelet_update_u11(void *descr[], int s, STARPU_ATTRIBUTE_UNUSED void *_args) { float *sub11; sub11 = (float *)STARPU_MATRIX_GET_PTR(descr[0]); unsigned long nx = STARPU_MATRIX_GET_NX(descr[0]); unsigned long ld = STARPU_MATRIX_GET_LD(descr[0]); unsigned long z; #ifdef STARPU_USE_CUDA cudaStream_t stream; cublasHandle_t handle; cublasStatus_t status; #endif switch (s) { case 0: for (z = 0; z < nx; z++) { float pivot; pivot = sub11[z+z*ld]; #ifdef STARPU_HAVE_VALGRIND_H if (RUNNING_ON_VALGRIND) { if (fpclassify(pivot) == FP_ZERO) /* Running in valgrind, don't care about the result */ pivot = 1.0f; } else #endif STARPU_ASSERT(fpclassify(pivot) != FP_ZERO); STARPU_SSCAL(nx - z - 1, (1.0f/pivot), &sub11[z+(z+1)*ld], ld); STARPU_SGER(nx - z - 1, nx - z - 1, -1.0f, &sub11[z+(z+1)*ld], ld, &sub11[(z+1)+z*ld], 1, &sub11[(z+1) + (z+1)*ld],ld); } break; #ifdef STARPU_USE_CUDA case 1: stream = starpu_cuda_get_local_stream(); handle = starpu_cublas_get_local_handle(); for (z = 0; z < nx; z++) { float pivot; cudaMemcpyAsync(&pivot, &sub11[z+z*ld], sizeof(float), cudaMemcpyDeviceToHost, stream); cudaStreamSynchronize(stream); #ifdef STARPU_HAVE_VALGRIND_H if (RUNNING_ON_VALGRIND) { if (fpclassify(pivot) == FP_ZERO) /* Running in valgrind, don't care about the result */ pivot = 1.0f; } else #endif STARPU_ASSERT(fpclassify(pivot) != FP_ZERO); float scal = 1.0f/pivot; status = cublasSscal(starpu_cublas_get_local_handle(), nx - z - 1, &scal, &sub11[z+(z+1)*ld], ld); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); status = cublasSger(starpu_cublas_get_local_handle(), nx - z - 1, nx - z - 1, &m1, &sub11[z+(z+1)*ld], ld, &sub11[(z+1)+z*ld], 1, &sub11[(z+1) + (z+1)*ld],ld); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); } cudaStreamSynchronize(stream); break; #endif default: STARPU_ABORT(); break; } } void dw_cpu_codelet_update_u11(void *descr[], void *_args) { dw_common_codelet_update_u11(descr, 0, _args); int id = starpu_worker_get_id_check(); count_11_per_worker[id]++; } #ifdef STARPU_USE_CUDA void dw_cublas_codelet_update_u11(void *descr[], void *_args) { dw_common_codelet_update_u11(descr, 1, _args); int id = starpu_worker_get_id_check(); count_11_per_worker[id]++; } #endif /* STARPU_USE_CUDA */ starpu-1.2.3+dfsg/examples/heat/dw_factolu_tag.c000066400000000000000000000176561320135501600216520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011, 2014-2015 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This implements an LU factorization. * The task graph is submitted through dependency tags. */ #include "dw_factolu.h" #define TAG11(k) ((starpu_tag_t)( (1ULL<<60) | (unsigned long long)(k))) #define TAG12(k,i) ((starpu_tag_t)(((2ULL<<60) | (((unsigned long long)(k))<<32) \ | (unsigned long long)(i)))) #define TAG21(k,j) ((starpu_tag_t)(((3ULL<<60) | (((unsigned long long)(k))<<32) \ | (unsigned long long)(j)))) #define TAG22(k,i,j) ((starpu_tag_t)(((4ULL<<60) | ((unsigned long long)(k)<<32) \ | ((unsigned long long)(i)<<16) \ | (unsigned long long)(j)))) struct starpu_perfmodel model_11; struct starpu_perfmodel model_12; struct starpu_perfmodel model_21; struct starpu_perfmodel model_22; static unsigned no_prio = 0; /* * Construct the DAG */ static struct starpu_task *create_task(starpu_tag_t id) { struct starpu_task *task = starpu_task_create(); task->cl_arg = NULL; task->use_tag = 1; task->tag_id = id; return task; } static struct starpu_codelet cl11 = { .modes = { STARPU_RW }, .cpu_funcs = {dw_cpu_codelet_update_u11}, .cpu_funcs_name = {"dw_cpu_codelet_update_u11"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {dw_cublas_codelet_update_u11}, #endif .nbuffers = 1, .model = &model_11 }; static struct starpu_task *create_task_11(starpu_data_handle_t dataA, unsigned k) { /* printf("task 11 k = %d TAG = %llx\n", k, (TAG11(k))); */ struct starpu_task *task = create_task(TAG11(k)); task->cl = &cl11; /* which sub-data is manipulated ? */ task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, k); /* this is an important task */ if (!no_prio) task->priority = STARPU_MAX_PRIO; /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG11(k), 1, TAG22(k-1, k, k)); } return task; } static struct starpu_codelet cl12 = { .modes = { STARPU_R, STARPU_RW }, .cpu_funcs = {dw_cpu_codelet_update_u12}, .cpu_funcs_name = {"dw_cpu_codelet_update_u12"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {dw_cublas_codelet_update_u12}, #endif .nbuffers = 2, .model = &model_12 }; static void create_task_12(starpu_data_handle_t dataA, unsigned k, unsigned i) { int ret; /* printf("task 12 k,i = %d,%d TAG = %llx\n", k,i, TAG12(k,i)); */ struct starpu_task *task = create_task(TAG12(k, i)); task->cl = &cl12; /* which sub-data is manipulated ? */ task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, k); task->handles[1] = starpu_data_get_sub_data(dataA, 2, i, k); if (!no_prio && (i == k+1)) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG12(k, i), 2, TAG11(k), TAG22(k-1, i, k)); } else { starpu_tag_declare_deps(TAG12(k, i), 1, TAG11(k)); } ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } static struct starpu_codelet cl21 = { .modes = { STARPU_R, STARPU_RW }, .cpu_funcs = {dw_cpu_codelet_update_u21}, .cpu_funcs_name = {"dw_cpu_codelet_update_u21"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {dw_cublas_codelet_update_u21}, #endif .nbuffers = 2, .model = &model_21 }; static void create_task_21(starpu_data_handle_t dataA, unsigned k, unsigned j) { int ret; struct starpu_task *task = create_task(TAG21(k, j)); task->cl = &cl21; /* which sub-data is manipulated ? */ task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, k); task->handles[1] = starpu_data_get_sub_data(dataA, 2, k, j); if (!no_prio && (j == k+1)) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG21(k, j), 2, TAG11(k), TAG22(k-1, k, j)); } else { starpu_tag_declare_deps(TAG21(k, j), 1, TAG11(k)); } ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } static struct starpu_codelet cl22 = { .modes = { STARPU_R, STARPU_R, STARPU_RW }, .cpu_funcs = {dw_cpu_codelet_update_u22}, .cpu_funcs_name = {"dw_cpu_codelet_update_u22"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {dw_cublas_codelet_update_u22}, #endif .nbuffers = 3, .model = &model_22 }; static void create_task_22(starpu_data_handle_t dataA, unsigned k, unsigned i, unsigned j) { int ret; /* printf("task 22 k,i,j = %d,%d,%d TAG = %llx\n", k,i,j, TAG22(k,i,j)); */ struct starpu_task *task = create_task(TAG22(k, i, j)); task->cl = &cl22; /* which sub-data is manipulated ? */ task->handles[0] = starpu_data_get_sub_data(dataA, 2, i, k); task->handles[1] = starpu_data_get_sub_data(dataA, 2, k, j); task->handles[2] = starpu_data_get_sub_data(dataA, 2, i, j); if (!no_prio && (i == k + 1) && (j == k +1) ) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG22(k, i, j), 3, TAG22(k-1, i, j), TAG12(k, i), TAG21(k, j)); } else { starpu_tag_declare_deps(TAG22(k, i, j), 2, TAG12(k, i), TAG21(k, j)); } ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } /* * code to bootstrap the factorization */ static void dw_codelet_facto_v3(starpu_data_handle_t dataA, unsigned nblocks) { int ret; double start; double end; struct starpu_task *entry_task = NULL; /* create all the DAG nodes */ unsigned i,j,k; for (k = 0; k < nblocks; k++) { struct starpu_task *task = create_task_11(dataA, k); /* we defer the launch of the first task */ if (k == 0) { entry_task = task; } else { ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } for (i = k+1; iuse_tag = 1; task->tag_id = id; return task; } static void create_data(float **_nzvalA, float **_vecb, float **_vecx, uint32_t *_nnz, uint32_t *_nrow, uint32_t **_colind, uint32_t **_rowptr) { /* we need a sparse symetric (definite positive ?) matrix and a "dense" vector */ /* example of 3-band matrix */ float *nzval; uint32_t nnz; uint32_t *colind; uint32_t *rowptr; nnz = 3*_size-2; nzval = malloc(nnz*sizeof(float)); colind = malloc(nnz*sizeof(uint32_t)); rowptr = malloc(_size*sizeof(uint32_t)); assert(nzval); assert(colind); assert(rowptr); /* fill the matrix */ unsigned row; unsigned pos = 0; for (row = 0; row < _size; row++) { rowptr[row] = pos; if (row > 0) { nzval[pos] = 1.0f; colind[pos] = row-1; pos++; } nzval[pos] = 5.0f; colind[pos] = row; pos++; if (row < _size - 1) { nzval[pos] = 1.0f; colind[pos] = row+1; pos++; } } *_nnz = nnz; *_nrow = _size; *_nzvalA = nzval; *_colind = colind; *_rowptr = rowptr; STARPU_ASSERT(pos == nnz); /* initiate the 2 vectors */ float *invec, *outvec; invec = malloc(_size*sizeof(float)); assert(invec); outvec = malloc(_size*sizeof(float)); assert(outvec); /* fill those */ unsigned ind; for (ind = 0; ind < _size; ind++) { invec[ind] = 2.0f; outvec[ind] = 0.0f; } *_vecb = invec; *_vecx = outvec; } void init_problem(void) { /* create the sparse input matrix */ float *nzval; float *vecb; float *vecx; uint32_t nnz; uint32_t nrow; uint32_t *colind; uint32_t *rowptr; create_data(&nzval, &vecb, &vecx, &nnz, &nrow, &colind, &rowptr); conjugate_gradient(nzval, vecb, vecx, nnz, nrow, colind, rowptr); } /* * cg initialization phase */ static struct starpu_codelet cl1 = { .cpu_funcs = { cpu_codelet_func_1 }, .cpu_funcs_name = { "cpu_codelet_func_1" }, .nbuffers = 4, .modes = { STARPU_R, STARPU_R, STARPU_W, STARPU_R }, }; static struct starpu_codelet cl2 = { .cpu_funcs = { cpu_codelet_func_2 }, .cpu_funcs_name = { "cpu_codelet_func_2" }, .nbuffers = 2, .modes = { STARPU_W, STARPU_R }, }; static struct starpu_codelet cl3 = { .cpu_funcs = { cpu_codelet_func_3 }, .cpu_funcs_name = { "cpu_codelet_func_3" }, #ifdef STARPU_USE_CUDA .cuda_funcs = { cublas_codelet_func_3 }, #endif .nbuffers = 1, .modes = { STARPU_R }, }; void init_cg(struct cg_problem *problem) { int ret; problem->i = 0; /* r = b - A x */ struct starpu_task *task1 = create_task(1UL); task1->cl = &cl1; task1->handles[0] = problem->ds_matrixA; task1->handles[1] = problem->ds_vecx; task1->handles[2] = problem->ds_vecr; task1->handles[3] = problem->ds_vecb; /* d = r */ struct starpu_task *task2 = create_task(2UL); task2->cl = &cl2; task2->handles[0] = problem->ds_vecd; task2->handles[1] = problem->ds_vecr; starpu_tag_declare_deps((starpu_tag_t)2UL, 1, (starpu_tag_t)1UL); /* delta_new = trans(r) r */ struct starpu_task *task3 = create_task(3UL); task3->cl = &cl3; task3->cl_arg = problem; task3->cl_arg_size = sizeof(*problem); task3->handles[0] = problem->ds_vecr; task3->callback_func = iteration_cg; task3->callback_arg = problem; /* XXX 3 should only depend on 1 ... */ starpu_tag_declare_deps((starpu_tag_t)3UL, 1, (starpu_tag_t)2UL); /* launch the computation now */ ret = starpu_task_submit(task1); if (STARPU_UNLIKELY(ret == -ENODEV)) { FPRINTF(stderr, "No worker may execute this task\n"); exit(0); } STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(task2); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(task3); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } /* * the inner iteration of the cg algorithm * the codelet code launcher is its own callback ! */ static struct starpu_codelet cl4 = { .cpu_funcs = { cpu_codelet_func_4 }, .cpu_funcs_name = { "cpu_codelet_func_4" }, .nbuffers = 3, .modes = { STARPU_R, STARPU_R, STARPU_W }, }; static struct starpu_codelet cl5 = { .cpu_funcs = { cpu_codelet_func_5 }, .cpu_funcs_name = { "cpu_codelet_func_5" }, #ifdef STARPU_USE_CUDA .cuda_funcs = { cublas_codelet_func_5 }, #endif .nbuffers = 2, .modes = { STARPU_R, STARPU_R }, }; static struct starpu_codelet cl6 = { .cpu_funcs = { cpu_codelet_func_6 }, .cpu_funcs_name = { "cpu_codelet_func_6" }, #ifdef STARPU_USE_CUDA .cuda_funcs = { cublas_codelet_func_6 }, .cuda_flags = { STARPU_CUDA_ASYNC }, #endif .nbuffers = 2, .modes = { STARPU_RW, STARPU_R }, }; static struct starpu_codelet cl7 = { .cpu_funcs = { cpu_codelet_func_7 }, .cpu_funcs_name = { "cpu_codelet_func_7" }, #ifdef STARPU_USE_CUDA .cuda_funcs = { cublas_codelet_func_7 }, .cuda_flags = { STARPU_CUDA_ASYNC }, #endif .nbuffers = 2, .modes = { STARPU_RW, STARPU_R }, }; static struct starpu_codelet cl8 = { .cpu_funcs = { cpu_codelet_func_8 }, .cpu_funcs_name = { "cpu_codelet_func_8" }, #ifdef STARPU_USE_CUDA .cuda_funcs = { cublas_codelet_func_8 }, #endif .nbuffers = 1, .modes = { STARPU_R }, }; static struct starpu_codelet cl9 = { .cpu_funcs = { cpu_codelet_func_9 }, .cpu_funcs_name = { "cpu_codelet_func_9" }, #ifdef STARPU_USE_CUDA .cuda_funcs = { cublas_codelet_func_9 }, .cuda_flags = { STARPU_CUDA_ASYNC }, #endif .nbuffers = 2, .modes = { STARPU_RW, STARPU_R }, }; void launch_new_cg_iteration(struct cg_problem *problem) { int ret; unsigned iter = problem->i; unsigned long long maskiter = ((unsigned long long)iter*1024); /* q = A d */ struct starpu_task *task4 = create_task(maskiter | 4UL); task4->cl = &cl4; task4->handles[0] = problem->ds_matrixA; task4->handles[1] = problem->ds_vecd; task4->handles[2] = problem->ds_vecq; /* alpha = delta_new / ( trans(d) q )*/ struct starpu_task *task5 = create_task(maskiter | 5UL); task5->cl = &cl5; task5->cl_arg = problem; task5->cl_arg_size = sizeof(*problem); task5->handles[0] = problem->ds_vecd; task5->handles[1] = problem->ds_vecq; starpu_tag_declare_deps((starpu_tag_t)(maskiter | 5UL), 1, (starpu_tag_t)(maskiter | 4UL)); /* x = x + alpha d */ struct starpu_task *task6 = create_task(maskiter | 6UL); task6->cl = &cl6; task6->cl_arg = problem; task6->cl_arg_size = sizeof(*problem); task6->handles[0] = problem->ds_vecx; task6->handles[1] = problem->ds_vecd; starpu_tag_declare_deps((starpu_tag_t)(maskiter | 6UL), 1, (starpu_tag_t)(maskiter | 5UL)); /* r = r - alpha q */ struct starpu_task *task7 = create_task(maskiter | 7UL); task7->cl = &cl7; task7->cl_arg = problem; task7->cl_arg_size = sizeof(*problem); task7->handles[0] = problem->ds_vecr; task7->handles[1] = problem->ds_vecq; starpu_tag_declare_deps((starpu_tag_t)(maskiter | 7UL), 1, (starpu_tag_t)(maskiter | 6UL)); /* update delta_* and compute beta */ struct starpu_task *task8 = create_task(maskiter | 8UL); task8->cl = &cl8; task8->cl_arg = problem; task8->cl_arg_size = sizeof(*problem); task8->handles[0] = problem->ds_vecr; starpu_tag_declare_deps((starpu_tag_t)(maskiter | 8UL), 1, (starpu_tag_t)(maskiter | 7UL)); /* d = r + beta d */ struct starpu_task *task9 = create_task(maskiter | 9UL); task9->cl = &cl9; task9->cl_arg = problem; task9->cl_arg_size = sizeof(*problem); task9->handles[0] = problem->ds_vecd; task9->handles[1] = problem->ds_vecr; starpu_tag_declare_deps((starpu_tag_t)(maskiter | 9UL), 1, (starpu_tag_t)(maskiter | 8UL)); task9->callback_func = iteration_cg; task9->callback_arg = problem; /* launch the computation now */ ret = starpu_task_submit(task4); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(task5); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(task6); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(task7); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(task8); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(task9); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } void iteration_cg(void *problem) { struct cg_problem *pb = problem; FPRINTF(stdout, "i : %d (MAX %d)\n\tdelta_new %f (%f)\n", pb->i, MAXITER, pb->delta_new, sqrt(pb->delta_new / pb->size)); if ((pb->i < MAXITER) && (pb->delta_new > pb->epsilon) ) { if (pb->i % 1000 == 0) FPRINTF(stdout, "i : %d\n\tdelta_new %f (%f)\n", pb->i, pb->delta_new, sqrt(pb->delta_new / pb->size)); pb->i++; /* we did not reach the stop condition yet */ launch_new_cg_iteration(problem); } else { /* we may stop */ FPRINTF(stdout, "We are done ... after %d iterations \n", pb->i - 1); FPRINTF(stdout, "i : %d\n\tdelta_new %2.5f\n", pb->i, pb->delta_new); sem_post(pb->sem); } } /* * initializing the problem */ void conjugate_gradient(float *nzvalA, float *vecb, float *vecx, uint32_t nnz, unsigned nrow, uint32_t *colind, uint32_t *rowptr) { /* first register all the data structures to StarPU */ starpu_data_handle_t ds_matrixA; starpu_data_handle_t ds_vecx, ds_vecb; starpu_data_handle_t ds_vecr, ds_vecd, ds_vecq; /* first the user-allocated data */ starpu_csr_data_register(&ds_matrixA, STARPU_MAIN_RAM, nnz, nrow, (uintptr_t)nzvalA, colind, rowptr, 0, sizeof(float)); starpu_vector_data_register(&ds_vecx, STARPU_MAIN_RAM, (uintptr_t)vecx, nrow, sizeof(float)); starpu_vector_data_register(&ds_vecb, STARPU_MAIN_RAM, (uintptr_t)vecb, nrow, sizeof(float)); /* then allocate the algorithm intern data */ float *ptr_vecr, *ptr_vecd, *ptr_vecq; unsigned i; ptr_vecr = malloc(nrow*sizeof(float)); ptr_vecd = malloc(nrow*sizeof(float)); ptr_vecq = malloc(nrow*sizeof(float)); for (i = 0; i < nrow; i++) { ptr_vecr[i] = 0.0f; ptr_vecd[i] = 0.0f; ptr_vecq[i] = 0.0f; } FPRINTF(stdout, "nrow = %u \n", nrow); /* and register them as well */ starpu_vector_data_register(&ds_vecr, STARPU_MAIN_RAM, (uintptr_t)ptr_vecr, nrow, sizeof(float)); starpu_vector_data_register(&ds_vecd, STARPU_MAIN_RAM, (uintptr_t)ptr_vecd, nrow, sizeof(float)); starpu_vector_data_register(&ds_vecq, STARPU_MAIN_RAM, (uintptr_t)ptr_vecq, nrow, sizeof(float)); /* we now have the complete problem */ struct cg_problem problem; problem.ds_matrixA = ds_matrixA; problem.ds_vecx = ds_vecx; problem.ds_vecb = ds_vecb; problem.ds_vecr = ds_vecr; problem.ds_vecd = ds_vecd; problem.ds_vecq = ds_vecq; problem.epsilon = EPSILON; problem.size = nrow; problem.delta_old = 1.0; problem.delta_new = 1.0; /* just to make sure we do at least one iteration */ /* we need a semaphore to synchronize with callbacks */ sem_t sem; sem_init(&sem, 0, 0U); problem.sem = &sem; init_cg(&problem); sem_wait(&sem); sem_destroy(&sem); starpu_task_wait_for_all(); print_results(vecx, nrow); starpu_data_unregister(ds_matrixA); starpu_data_unregister(ds_vecx); starpu_data_unregister(ds_vecb); starpu_data_unregister(ds_vecr); starpu_data_unregister(ds_vecd); starpu_data_unregister(ds_vecq); free(ptr_vecr); free(ptr_vecd); free(ptr_vecq); } void do_conjugate_gradient(float *nzvalA, float *vecb, float *vecx, uint32_t nnz, unsigned nrow, uint32_t *colind, uint32_t *rowptr) { /* start the runtime */ int ret; ret = starpu_init(NULL); if (ret == -ENODEV) exit(77); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_cublas_init(); conjugate_gradient(nzvalA, vecb, vecx, nnz, nrow, colind, rowptr); starpu_shutdown(); } starpu-1.2.3+dfsg/examples/heat/dw_sparse_cg.h000066400000000000000000000063031320135501600213200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DW_SPARSE_CG_H__ #define __DW_SPARSE_CG_H__ #include #include #include #include #include #include #include #include #include #include "../common/blas.h" #define MAXITER 100000 #define EPSILON 0.0000001f /* code parameters */ static uint32_t _size = 33554432; static unsigned _usecpu = 0; static unsigned _blocks = 512; static unsigned _grids = 8; struct cg_problem { starpu_data_handle_t ds_matrixA; starpu_data_handle_t ds_vecx; starpu_data_handle_t ds_vecb; starpu_data_handle_t ds_vecr; starpu_data_handle_t ds_vecd; starpu_data_handle_t ds_vecq; sem_t *sem; float alpha; float beta; float delta_0; float delta_old; float delta_new; float epsilon; int i; unsigned size; }; /* some useful functions */ static void STARPU_ATTRIBUTE_UNUSED parse_args(int argc, char **argv) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-size") == 0) { char *argptr; _size = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-block") == 0) { char *argptr; _blocks = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-grid") == 0) { char *argptr; _grids = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-cpu") == 0) { _usecpu = 1; } } } static void STARPU_ATTRIBUTE_UNUSED print_results(float *result, unsigned size) { printf("**** RESULTS **** \n"); unsigned i; for (i = 0; i < STARPU_MIN(size, 16); i++) { printf("%u -> %f\n", i, result[i]); } } void cpu_codelet_func_1(void *descr[], void *arg); void cpu_codelet_func_2(void *descr[], void *arg); void cublas_codelet_func_3(void *descr[], void *arg); void cpu_codelet_func_3(void *descr[], void *arg); void cpu_codelet_func_4(void *descr[], void *arg); void cpu_codelet_func_5(void *descr[], void *arg); void cublas_codelet_func_5(void *descr[], void *arg); void cublas_codelet_func_6(void *descr[], void *arg); void cpu_codelet_func_6(void *descr[], void *arg); void cublas_codelet_func_7(void *descr[], void *arg); void cpu_codelet_func_7(void *descr[], void *arg); void cublas_codelet_func_8(void *descr[], void *arg); void cpu_codelet_func_8(void *descr[], void *arg); void cublas_codelet_func_9(void *descr[], void *arg); void cpu_codelet_func_9(void *descr[], void *arg); void iteration_cg(void *problem); void conjugate_gradient(float *nzvalA, float *vecb, float *vecx, uint32_t nnz, unsigned nrow, uint32_t *colind, uint32_t *rowptr); #endif /* __DW_SPARSE_CG_H__ */ starpu-1.2.3+dfsg/examples/heat/dw_sparse_cg_kernels.c000066400000000000000000000241131320135501600230350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "dw_sparse_cg.h" #ifdef STARPU_USE_CUDA #include #endif /* * Algorithm : * * i = 0 * r = b - A x * ( d = A x ; r = r - d ) * d = r * delta_new = trans(r) r * delta_0 = delta_new * * while (i < i_max && delta_new > eps^2 delta_0) * { * q = A d * alpha = delta_new / ( trans(d) q ) * x = x + alpha d * if ( i is divisible by 50 ) * r = b - A x * else * r = r - alpha q * delta_old = delta_new * delta_new = trans(r) r * beta = delta_new / delta_old * d = r + beta d * i = i + 1 * } */ /* * compute r = b - A x * * descr[0] = A, descr[1] = x, descr [2] = r, descr[3] = b */ void cpu_codelet_func_1(void *descr[], STARPU_ATTRIBUTE_UNUSED void *arg) { float *nzval = (float *)STARPU_CSR_GET_NZVAL(descr[0]); uint32_t *colind = STARPU_CSR_GET_COLIND(descr[0]); uint32_t *rowptr = STARPU_CSR_GET_ROWPTR(descr[0]); uint32_t firstentry = STARPU_CSR_GET_ELEMSIZE(descr[0]); float *vecx = (float *)STARPU_VECTOR_GET_PTR(descr[1]); float *vecr = (float *)STARPU_VECTOR_GET_PTR(descr[2]); float *vecb = (float *)STARPU_VECTOR_GET_PTR(descr[3]); uint32_t nrow; nrow = STARPU_CSR_GET_NROW(descr[0]); unsigned row; for (row = 0; row < nrow; row++) { float tmp = 0.0f; unsigned index; unsigned firstindex = rowptr[row] - firstentry; unsigned lastindex = rowptr[row+1] - firstentry; for (index = firstindex; index < lastindex; index++) { unsigned col; col = colind[index]; tmp += nzval[index]*vecx[col]; } vecr[row] = vecb[row] - tmp; } } /* * compute d = r * descr[0] = d, descr[1] = r */ void cpu_codelet_func_2(void *descr[], STARPU_ATTRIBUTE_UNUSED void *arg) { /* simply copy r into d */ uint32_t nx = STARPU_VECTOR_GET_NX(descr[0]); size_t elemsize = STARPU_VECTOR_GET_ELEMSIZE(descr[0]); STARPU_ASSERT(STARPU_VECTOR_GET_NX(descr[0]) == STARPU_VECTOR_GET_NX(descr[1])); STARPU_ASSERT(STARPU_VECTOR_GET_ELEMSIZE(descr[0]) == STARPU_VECTOR_GET_ELEMSIZE(descr[1])); float *src = (float *)STARPU_VECTOR_GET_PTR(descr[1]); float *dst = (float *)STARPU_VECTOR_GET_PTR(descr[0]); memcpy(dst, src, nx*elemsize); } /* * compute delta_new = trans(r) r * delta_0 = delta_new * * args = &delta_new, &delta_0 */ void cpu_codelet_func_3(void *descr[], void *arg) { struct cg_problem *pb = arg; float dot; float *vec; int size; /* get the vector */ vec = (float *)STARPU_VECTOR_GET_PTR(descr[0]); size = (int)STARPU_VECTOR_GET_NX(descr[0]); dot = STARPU_SDOT(size, vec, 1, vec, 1); fprintf(stderr, "func 3 : DOT = %f\n", dot); pb->delta_new = dot; pb->delta_0 = dot; } #ifdef STARPU_USE_CUDA void cublas_codelet_func_3(void *descr[], void *arg) { struct cg_problem *pb = arg; float dot; float *vec; uint32_t size; /* get the vector */ vec = (float *)STARPU_VECTOR_GET_PTR(descr[0]); size = STARPU_VECTOR_GET_NX(descr[0]); cublasStatus_t status = cublasSdot (starpu_cublas_get_local_handle(), size, vec, 1, vec, 1, &dot); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); cudaStreamSynchronize(starpu_cuda_get_local_stream()); pb->delta_new = dot; pb->delta_0 = dot; } #endif /* * compute q with : q = A d * * descr[0] = A, descr[1] = d, descr [2] = q */ void cpu_codelet_func_4(void *descr[], STARPU_ATTRIBUTE_UNUSED void *arg) { float *nzval = (float *)STARPU_CSR_GET_NZVAL(descr[0]); uint32_t *colind = STARPU_CSR_GET_COLIND(descr[0]); uint32_t *rowptr = STARPU_CSR_GET_ROWPTR(descr[0]); uint32_t firstentry = STARPU_CSR_GET_FIRSTENTRY(descr[0]); float *vecd = (float *)STARPU_VECTOR_GET_PTR(descr[1]); float *vecq = (float *)STARPU_VECTOR_GET_PTR(descr[2]); uint32_t nrow; nrow = STARPU_CSR_GET_NROW(descr[0]); unsigned row; for (row = 0; row < nrow; row++) { float tmp = 0.0f; unsigned index; unsigned firstindex = rowptr[row] - firstentry; unsigned lastindex = rowptr[row+1] - firstentry; for (index = firstindex; index < lastindex; index++) { unsigned col; col = colind[index]; tmp += nzval[index]*vecd[col]; } vecq[row] = tmp; } } /* * compute alpha = delta_new / ( trans(d) q ) * * descr[0] = d, descr[1] = q * args = &alpha, &delta_new */ void cpu_codelet_func_5(void *descr[], void *arg) { float dot; struct cg_problem *pb = arg; float *vecd, *vecq; uint32_t size; /* get the vector */ vecd = (float *)STARPU_VECTOR_GET_PTR(descr[0]); vecq = (float *)STARPU_VECTOR_GET_PTR(descr[1]); STARPU_ASSERT(STARPU_VECTOR_GET_NX(descr[0]) == STARPU_VECTOR_GET_NX(descr[1])); size = STARPU_VECTOR_GET_NX(descr[0]); dot = STARPU_SDOT(size, vecd, 1, vecq, 1); pb->alpha = pb->delta_new / dot; } #ifdef STARPU_USE_CUDA void cublas_codelet_func_5(void *descr[], void *arg) { float dot; struct cg_problem *pb = arg; float *vecd, *vecq; uint32_t size; /* get the vector */ vecd = (float *)STARPU_VECTOR_GET_PTR(descr[0]); vecq = (float *)STARPU_VECTOR_GET_PTR(descr[1]); STARPU_ASSERT(STARPU_VECTOR_GET_NX(descr[0]) == STARPU_VECTOR_GET_NX(descr[1])); size = STARPU_VECTOR_GET_NX(descr[0]); cublasStatus_t status = cublasSdot (starpu_cublas_get_local_handle(), size, vecd, 1, vecq, 1, &dot); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); cudaStreamSynchronize(starpu_cuda_get_local_stream()); pb->alpha = pb->delta_new / dot; } #endif /* * compute x = x + alpha d * * descr[0] : x, descr[1] : d * args = &alpha */ void cpu_codelet_func_6(void *descr[], void *arg) { struct cg_problem *pb = arg; float *vecx, *vecd; uint32_t size; /* get the vector */ vecx = (float *)STARPU_VECTOR_GET_PTR(descr[0]); vecd = (float *)STARPU_VECTOR_GET_PTR(descr[1]); size = STARPU_VECTOR_GET_NX(descr[0]); STARPU_SAXPY(size, pb->alpha, vecd, 1, vecx, 1); } #ifdef STARPU_USE_CUDA void cublas_codelet_func_6(void *descr[], void *arg) { struct cg_problem *pb = arg; float *vecx, *vecd; uint32_t size; /* get the vector */ vecx = (float *)STARPU_VECTOR_GET_PTR(descr[0]); vecd = (float *)STARPU_VECTOR_GET_PTR(descr[1]); size = STARPU_VECTOR_GET_NX(descr[0]); cublasStatus_t status = cublasSaxpy (starpu_cublas_get_local_handle(), size, &pb->alpha, vecd, 1, vecx, 1); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); } #endif /* * compute r = r - alpha q * * descr[0] : r, descr[1] : q * args = &alpha */ void cpu_codelet_func_7(void *descr[], void *arg) { struct cg_problem *pb = arg; float *vecr, *vecq; uint32_t size; /* get the vector */ vecr = (float *)STARPU_VECTOR_GET_PTR(descr[0]); vecq = (float *)STARPU_VECTOR_GET_PTR(descr[1]); size = STARPU_VECTOR_GET_NX(descr[0]); STARPU_SAXPY(size, -pb->alpha, vecq, 1, vecr, 1); } #ifdef STARPU_USE_CUDA void cublas_codelet_func_7(void *descr[], void *arg) { struct cg_problem *pb = arg; float *vecr, *vecq; uint32_t size; /* get the vector */ vecr = (float *)STARPU_VECTOR_GET_PTR(descr[0]); vecq = (float *)STARPU_VECTOR_GET_PTR(descr[1]); size = STARPU_VECTOR_GET_NX(descr[0]); float scal = -pb->alpha; cublasStatus_t status = cublasSaxpy (starpu_cublas_get_local_handle(), size, &scal, vecq, 1, vecr, 1); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); } #endif /* * compute delta_old = delta_new * delta_new = trans(r) r * beta = delta_new / delta_old * * descr[0] = r * args = &delta_old, &delta_new, &beta */ void cpu_codelet_func_8(void *descr[], void *arg) { float dot; struct cg_problem *pb = arg; float *vecr; uint32_t size; /* get the vector */ vecr = (float *)STARPU_VECTOR_GET_PTR(descr[0]); size = STARPU_VECTOR_GET_NX(descr[0]); dot = STARPU_SDOT(size, vecr, 1, vecr, 1); pb->delta_old = pb->delta_new; pb->delta_new = dot; pb->beta = pb->delta_new/pb->delta_old; } #ifdef STARPU_USE_CUDA void cublas_codelet_func_8(void *descr[], void *arg) { float dot; struct cg_problem *pb = arg; float *vecr; uint32_t size; /* get the vector */ vecr = (float *)STARPU_VECTOR_GET_PTR(descr[0]); size = STARPU_VECTOR_GET_NX(descr[0]); cublasStatus_t status = cublasSdot(starpu_cublas_get_local_handle(), size, vecr, 1, vecr, 1, &dot); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); cudaStreamSynchronize(starpu_cuda_get_local_stream()); pb->delta_old = pb->delta_new; pb->delta_new = dot; pb->beta = pb->delta_new/pb->delta_old; } #endif /* * compute d = r + beta d * * descr[0] : d, descr[1] : r * args = &beta * */ void cpu_codelet_func_9(void *descr[], void *arg) { struct cg_problem *pb = arg; float *vecd, *vecr; uint32_t size; /* get the vector */ vecd = (float *)STARPU_VECTOR_GET_PTR(descr[0]); vecr = (float *)STARPU_VECTOR_GET_PTR(descr[1]); size = STARPU_VECTOR_GET_NX(descr[0]); /* d = beta d */ STARPU_SSCAL(size, pb->beta, vecd, 1); /* d = r + d */ STARPU_SAXPY (size, 1.0f, vecr, 1, vecd, 1); } #ifdef STARPU_USE_CUDA void cublas_codelet_func_9(void *descr[], void *arg) { struct cg_problem *pb = arg; float *vecd, *vecr; uint32_t size; /* get the vector */ vecd = (float *)STARPU_VECTOR_GET_PTR(descr[0]); vecr = (float *)STARPU_VECTOR_GET_PTR(descr[1]); size = STARPU_VECTOR_GET_NX(descr[0]); /* d = beta d */ cublasStatus_t status; status = cublasSscal(starpu_cublas_get_local_handle(), size, &pb->beta, vecd, 1); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); /* d = r + d */ float scal = 1.0f; status = cublasSaxpy (starpu_cublas_get_local_handle(), size, &scal, vecr, 1, vecd, 1); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); } #endif starpu-1.2.3+dfsg/examples/heat/heat.c000066400000000000000000000457221320135501600176040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2012, 2015, 2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * heat propagation simulation through either direct LU factorization or * iterative conjugate gradient. */ #include "heat.h" /* default values */ static unsigned ntheta = 32+2; static unsigned nthick = 32+2; static unsigned nblocks = 16; static unsigned nbigblocks = 8; static unsigned shape = 0; static unsigned pinned = 0; static unsigned check = 0; static unsigned version = 2; static unsigned use_cg = 0; /* use a LU decomposition of CG ? */ static unsigned no_prio = 0; extern void do_conjugate_gradient(float *nzvalA, float *vecb, float *vecx, uint32_t nnz, unsigned nrow, uint32_t *colind, uint32_t *rowptr); static void parse_args(int argc, char **argv) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-cg") == 0) { use_cg = 1; } if (strcmp(argv[i], "-shape") == 0) { char *argptr; shape = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-nthick") == 0) { char *argptr; nthick = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-ntheta") == 0) { char *argptr; ntheta = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-nblocks") == 0) { char *argptr; nblocks = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-nbigblocks") == 0) { char *argptr; nbigblocks = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-v1") == 0) { version = 1; } if (strcmp(argv[i], "-v2") == 0) { version = 2; } if (strcmp(argv[i], "-v3") == 0) { version = 3; } if (strcmp(argv[i], "-v4") == 0) { version = 4; } if (strcmp(argv[i], "-pin") == 0) { pinned = 1; } if (strcmp(argv[i], "-check") == 0) { check = 1; } if (strcmp(argv[i], "-no-prio") == 0) { no_prio = 1; } if (strcmp(argv[i], "-size") == 0) { char *argptr; unsigned size = strtol(argv[++i], &argptr, 10); nthick = 130; ntheta = (size/128) + 2; STARPU_ASSERT((nthick - 2)*(ntheta - 2) == size); } if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "-help") == 0) { printf("usage : %s [-v1|-v2|-v3|-v4] [-pin] [-nthick number] [-ntheta number] [-shape [0|1|2]] [-cg] [-size number] [-no-prio]\n", argv[0]); } } } /* * The Finite element method code * * B C * ********** * * 0 * * * * * * * * * 1 * * ********** * A D */ static inline float diff_psi(unsigned theta_tr, unsigned thick_tr, unsigned side_tr, unsigned theta_psi, unsigned thick_psi, unsigned xy, point *pmesh) { float xa,ya,xb,yb,xc,yc; float tmp; assert(theta_tr + 2 <= ntheta); assert(thick_tr + 2 <= nthick); /* A */ xa = pmesh[NODE_NUMBER(theta_tr, thick_tr)].x; ya = pmesh[NODE_NUMBER(theta_tr, thick_tr)].y; /* B */ if (side_tr) { /* lower D is actually B here */ xb = pmesh[NODE_NUMBER(theta_tr+1, thick_tr)].x; yb = pmesh[NODE_NUMBER(theta_tr+1, thick_tr)].y; } else { /* upper */ xb = pmesh[NODE_NUMBER(theta_tr, thick_tr+1)].x; yb = pmesh[NODE_NUMBER(theta_tr, thick_tr+1)].y; } xc = pmesh[NODE_NUMBER(theta_tr+1, thick_tr+1)].x; yc = pmesh[NODE_NUMBER(theta_tr+1, thick_tr+1)].y; /* now look for the actual psi node */ if (NODE_NUMBER(theta_tr, thick_tr) == NODE_NUMBER(theta_psi, thick_psi)) { /* A nothing to do */ } else if (NODE_NUMBER(theta_tr+1, thick_tr+1) == NODE_NUMBER(theta_psi, thick_psi)) { /* psi matches C */ /* swap A and C coordinates */ tmp = xa; xa = xc; xc = tmp; tmp = ya; ya = yc; yc = tmp; } else if (side_tr && (NODE_NUMBER(theta_tr+1, thick_tr) == NODE_NUMBER(theta_psi, thick_psi))) { /* psi is D (that was stored in C) XXX */ tmp = xa; xa = xb; xb = tmp; tmp = ya; ya = yb; yb = tmp; } else if (!side_tr && (NODE_NUMBER(theta_tr, thick_tr+1) == NODE_NUMBER(theta_psi, thick_psi))) { /* psi is C */ tmp = xa; xa = xb; xb = tmp; tmp = ya; ya = yb; yb = tmp; } else { /* the psi node is not a node of the current triangle */ return 0.0f; } /* now the triangle should have A as the psi node */ float denom; float value; denom = (xa - xb)*(yc - ya) - (xc - xb)*(ya - yb); switch (xy) { case X: value = (yc - yb)/denom; break; case Y: value = -(xc - xb)/denom; break; default: assert(0); } return value; } static inline float diff_y_psi(unsigned theta_tr, unsigned thick_tr, unsigned side_tr, unsigned theta_psi, unsigned thick_psi, point *pmesh) { return diff_psi(theta_tr, thick_tr, side_tr, theta_psi, thick_psi, Y, pmesh); } static inline float diff_x_psi(unsigned theta_tr, unsigned thick_tr, unsigned side_tr, unsigned theta_psi, unsigned thick_psi, point *pmesh) { return diff_psi(theta_tr, thick_tr, side_tr, theta_psi, thick_psi, X, pmesh); } static inline float surface_triangle(unsigned theta_tr, unsigned thick_tr, unsigned side_tr, point *pmesh) { float surface; float tmp; float xi, xj, xk, yi, yj, yk; STARPU_ASSERT(theta_tr + 2 <= ntheta); STARPU_ASSERT(thick_tr + 2 <= nthick); xi = pmesh[NODE_NUMBER(theta_tr, thick_tr)].x; yi = pmesh[NODE_NUMBER(theta_tr, thick_tr)].y; xj = pmesh[NODE_NUMBER(theta_tr+1, thick_tr+1)].x; yj = pmesh[NODE_NUMBER(theta_tr+1, thick_tr+1)].y; if (side_tr) { /* lower */ xk = pmesh[NODE_NUMBER(theta_tr+1, thick_tr)].x; yk = pmesh[NODE_NUMBER(theta_tr+1, thick_tr)].y; } else { xk = pmesh[NODE_NUMBER(theta_tr, thick_tr+1)].x; yk = pmesh[NODE_NUMBER(theta_tr, thick_tr+1)].y; } tmp = (xi - xj)*(yk -yj) - (xk - xj)*(yi -yj); surface = 0.5*fabs(tmp); return surface; } static inline float integral_triangle(int theta_tr, int thick_tr, unsigned side_tr, unsigned theta_i, unsigned thick_i, unsigned theta_j, unsigned thick_j, point *pmesh) { float surface; float value; float dxi, dxj, dyi, dyj; if (theta_tr < 0) return 0.0f; if (theta_tr + 2 > (int)ntheta) return 0.0f; if (thick_tr < 0) return 0.0f; if (thick_tr + 2 > (int)nthick) return 0.0f; dxi = diff_x_psi(theta_tr, thick_tr, side_tr, theta_i, thick_i, pmesh); dyi = diff_y_psi(theta_tr, thick_tr, side_tr, theta_i, thick_i, pmesh); dxj = diff_x_psi(theta_tr, thick_tr, side_tr, theta_j, thick_j, pmesh); dyj = diff_y_psi(theta_tr, thick_tr, side_tr, theta_j, thick_j, pmesh); surface = surface_triangle(theta_tr, thick_tr, side_tr, pmesh); value = (dxi*dxj + dyi*dyj)*surface; return value; } static inline float integrale_sum(unsigned theta_i, unsigned thick_i, unsigned theta_j, unsigned thick_j, point *pmesh) { float integral = 0.0f; integral += integral_triangle(theta_i - 1, thick_i - 1, 1, theta_i, thick_i, theta_j, thick_j, pmesh); integral += integral_triangle(theta_i - 1, thick_i - 1, 0, theta_i, thick_i, theta_j, thick_j, pmesh); integral += integral_triangle(theta_i - 1, thick_i, 1, theta_i, thick_i, theta_j, thick_j, pmesh); integral += integral_triangle(theta_i, thick_i, 0, theta_i, thick_i, theta_j, thick_j, pmesh); integral += integral_triangle(theta_i, thick_i, 1, theta_i, thick_i, theta_j, thick_j, pmesh); integral += integral_triangle(theta_i, thick_i - 1, 0, theta_i, thick_i, theta_j, thick_j, pmesh); return integral; } static float compute_A_value(unsigned i, unsigned j, point *pmesh) { float value = 0.0f; unsigned thick_i, thick_j; unsigned theta_i, theta_j; /* add all contributions from all connex triangles */ thick_i = NODE_TO_THICK(i); thick_j = NODE_TO_THICK(j); theta_i = NODE_TO_THETA(i); theta_j = NODE_TO_THETA(j); /* Compute the Sum of all the integral over all triangles */ if ( (abs(thick_i - thick_j) <= 1) && (abs(theta_i - theta_j) <= 1) ) { if ( (theta_j == theta_i -1) && (thick_j == thick_i +1)) goto done; if ( (theta_j == theta_i + 1) && (thick_j == thick_i - 1)) goto done; /* this may not be a null entry */ value += integrale_sum(theta_i, thick_i, theta_j, thick_j, pmesh); } done: return value; } #define TRANSLATE(k) (RefArray[(k)]) #define TRANSLATEBACK(k) (RefArrayBack[(k)]) static void solve_system(unsigned size, unsigned subsize, float *result, int *RefArray, float *Bformer, float *A, float *B) { unsigned i; /* solve the actual problem LU X = B */ /* solve LX' = Y with X' = UX */ /* solve UX = X' */ FPRINTF(stderr, "Solving the problem ...\n"); float *savedB = NULL; float *LUB = NULL; if (check) { savedB = malloc(subsize*sizeof(float)); memcpy(savedB, B, subsize*sizeof(float)); LUB = malloc(subsize*sizeof(float)); } /* L */ STARPU_STRSV("L", "N", "N", subsize, A, subsize, B, 1); /* U */ STARPU_STRSV("U", "N", "U", subsize, A, subsize, B, 1); STARPU_ASSERT(DIM == size); if (check) { /* compute the error on (LUB - savedB) which should be 0 */ /* LUB = B */ memcpy(LUB, B, subsize*sizeof(float)); /* LUB = U * LUB */ STARPU_STRMV("U", "N", "U", subsize, A, subsize, LUB, 1); /* LUB = L * LUB */ STARPU_STRMV("L", "N", "N", subsize, A, subsize, LUB, 1); /* LUB -= B */ STARPU_SAXPY(subsize, -1.0f, savedB, 1, LUB, 1); /* check if LUB is close to the 0 vector */ int maxind = STARPU_ISAMAX(subsize, LUB, 1); FPRINTF(stderr, "max error (LUX - B) = %e\n",LUB[maxind - 1]); float sum = STARPU_SASUM(subsize, LUB, 1); FPRINTF(stderr,"avg. error %e\n", sum/subsize); free(LUB); free(savedB); } /* now display back the ACTUAL result */ for (i = 0; i < subsize; i++) { result[TRANSLATE(i)] = B[i]; } for (i = subsize ; i < size; i++) { result[TRANSLATE(i)] = Bformer[TRANSLATE(i)]; } } unsigned compute_pivot_array(int *RefArray, int *RefArrayBack, unsigned size) { unsigned k; unsigned index = 0; unsigned theta, thick; unsigned newsize; for (k = 0; k < size; k++) { RefArray[k] = k; RefArrayBack[k] = k; } /* first inner nodes */ for (theta = 1; theta < ntheta - 1 ; theta++) { for (thick = 1; thick < nthick - 1; thick++) { /* inner nodes are unknown */ RefArrayBack[NODE_NUMBER(theta, thick)] = index; RefArray[index] = NODE_NUMBER(theta, thick); index++; } } newsize = index; for (theta=0; theta < ntheta; theta++) { /* Lower boundary "South" */ RefArrayBack[NODE_NUMBER(theta, 0)] = index; RefArray[index++] = NODE_NUMBER(theta, 0); /* Upper boundary "North" */ RefArrayBack[NODE_NUMBER(theta, nthick-1)] = index; RefArray[index++] = NODE_NUMBER(theta, nthick-1); } for (thick = 1; thick < nthick -1; thick++) { /* "West "*/ RefArrayBack[NODE_NUMBER(0, thick)] = index; RefArray[index++] = NODE_NUMBER(0, thick); /* "East" */ RefArrayBack[NODE_NUMBER(ntheta-1, thick)] = index; RefArray[index++] = NODE_NUMBER(ntheta-1, thick); } assert(index == size); return newsize; } void build_mesh(point *mesh) { unsigned theta, thick; /* first build the mesh by determining all points positions */ for (theta = 0; theta < ntheta; theta++) { float angle; angle = (ntheta - 1 - theta) * Pi/(ntheta-1); for (thick = 0; thick < nthick; thick++) { float r; r = thick * (RMAX - RMIN)/(nthick - 1) + RMIN; switch (shape) { default: case 0: mesh[NODE_NUMBER(theta,thick)].x = r*cosf(angle); mesh[NODE_NUMBER(theta,thick)].y = r*sinf(angle); break; case 1: mesh[NODE_NUMBER(theta,thick)].x = -100 + RMIN+((RMAX-RMIN)*theta)/(ntheta - 1); mesh[NODE_NUMBER(theta,thick)].y = RMIN+((RMAX-RMIN)*thick)/(nthick - 1); break; case 2: mesh[NODE_NUMBER(theta,thick)].x = r*(2.0f*theta/(ntheta - 1)- 1.0f); mesh[NODE_NUMBER(theta,thick)].y = r*(2.0f*thick/(nthick - 1)- 1.0f); break; } } } } static unsigned long build_neighbour_vector(unsigned long*neighbours, unsigned node, int *RefArray, int *RefArrayBack) { /* where is that point in the former space ? */ int former = TRANSLATE(node); int former_thick, former_theta; former_thick= (int)NODE_TO_THICK(former); former_theta = (int)NODE_TO_THETA(former); /* do a list of all the possible neighbours */ unsigned nneighbours = 0; int dtheta, dthick; for (dthick = -1; dthick <= 1; dthick++) { if ((former_thick + dthick) >= 0 && (former_thick + dthick) <= (int)nthick ) { for (dtheta = -1; dtheta <= 1; dtheta++) { if ((former_theta + dtheta) >= 0 && (former_theta + dtheta) <= (int)ntheta ) { /* we got a possible neighbour */ unsigned pnode = NODE_NUMBER((former_theta + dtheta), (former_thick + dthick)); neighbours[nneighbours++] = TRANSLATEBACK(pnode); } } } } unsigned i; /* order that list */ for (i = 0; i < nneighbours; i++) { /* find the i^th smallest entry for position i */ unsigned index; unsigned min , min_index; min = neighbours[i]; min_index = i; for (index = i+1; index < nneighbours; index++) { STARPU_ASSERT(neighbours[i] != neighbours[index]); if (neighbours[index] < min) { min = neighbours[index]; min_index = index; } } /* swap values */ neighbours[min_index] = neighbours[i]; neighbours[i] = min; } return nneighbours; } static void build_sparse_stiffness_matrix_B(point *pmesh, float *B, float *Bformer, unsigned size, unsigned newsize, int *RefArray, int *RefArrayBack) { unsigned i,j; /* first give the value of known nodes (at boundaries) */ for (i = 0; i < size; i++) { Bformer[i] = 0.0f; } for (i = 0; i < nthick; i++) { Bformer[i] = 200.0f; Bformer[size-1-i] = 200.0f; } for (i = 1; i < ntheta-1; i++) { Bformer[i*nthick] = 200.0f; Bformer[(i+1)*nthick-1] = 100.0f; } /* now the actual stiffness (reordered) matrix*/ for (j = 0 ; j < newsize ; j++) { unsigned long neighbour; unsigned long nneighbours; unsigned long neighbours[9]; nneighbours = build_neighbour_vector(&neighbours[0], j, RefArray, RefArrayBack); B[j] = Bformer[TRANSLATE(j)]; for (neighbour = 0; neighbour < nneighbours; neighbour++) { unsigned n = neighbours[neighbour]; if (n >= newsize) { B[j] -= compute_A_value(TRANSLATE(n), TRANSLATE(j), pmesh)*Bformer[TRANSLATE(n)]; } } } } static unsigned build_sparse_stiffness_matrix_A(point *pmesh, float **nzval, uint32_t **colind, uint32_t *rowptr, unsigned newsize, int *RefArray, int *RefArrayBack) { unsigned j; unsigned pos = 0; *nzval = NULL; *colind = NULL; /* now the actual stiffness (reordered) matrix*/ for (j = 0 ; j < newsize ; j++) { rowptr[j] = pos; unsigned long neighbour; unsigned long nneighbours; unsigned long neighbours[9]; nneighbours = build_neighbour_vector(&neighbours[0], j, RefArray, RefArrayBack); for (neighbour = 0; neighbour < nneighbours; neighbour++) { unsigned nodeneighbour = neighbours[neighbour]; if (nodeneighbour < newsize) { float val; val = compute_A_value(TRANSLATE(j), TRANSLATE(nodeneighbour), pmesh); if (val != 0.0f) { *nzval = realloc(*nzval, (pos+1)*sizeof(float)); *colind = realloc(*colind, (pos+1)*sizeof(uint32_t)); (*nzval)[pos] = val; (*colind)[pos] = nodeneighbour; pos++; } } } } rowptr[newsize] = pos; return pos; } static void build_dense_stiffness_matrix_A(point *pmesh, float *A, unsigned newsize, int *RefArray, int *RefArrayBack) { unsigned long j; /* touch all the memory */ memset(A, 0, newsize*newsize*sizeof(float)); /* now the actual stiffness (reordered) matrix*/ for (j = 0 ; j < newsize ; j++) { unsigned long neighbour; unsigned long nneighbours; unsigned long neighbours[9]; nneighbours = build_neighbour_vector(&neighbours[0], j, RefArray, RefArrayBack); for (neighbour = 0; neighbour < nneighbours; neighbour++) { unsigned long nodeneighbour = neighbours[neighbour]; if (nodeneighbour < newsize) { float val; val = compute_A_value(TRANSLATE(j), TRANSLATE(nodeneighbour), pmesh); A[j+ (unsigned long)newsize*nodeneighbour] = val; } } } } int main(int argc, char **argv) { float *A; float *B; unsigned newsize; float *result; int *RefArray, *RefArrayBack; point *pmesh; float *Bformer; parse_args(argc, argv); pmesh = malloc(DIM*sizeof(point)); RefArray = malloc(DIM*sizeof(int)); RefArrayBack = malloc(DIM*sizeof(int)); Bformer = malloc(DIM*sizeof(float)); result = malloc(DIM*sizeof(float)); build_mesh(pmesh); /* now simplify that problem given the boundary conditions * to do so, we remove the already known variables from the system * by pivoting the various know variable, RefArray keep track of that * pivoting */ newsize = compute_pivot_array(RefArray, RefArrayBack, DIM); /* we can either use a direct method (LU decomposition here) or an * iterative method (conjugate gradient here) */ if (use_cg) { unsigned nnz; float *nzval; uint32_t *colind; uint32_t *rowptr; rowptr = malloc((newsize+1)*sizeof(uint32_t)); B = malloc(newsize*sizeof(float)); build_sparse_stiffness_matrix_B(pmesh, B, Bformer, DIM, newsize, RefArray, RefArrayBack); nnz = build_sparse_stiffness_matrix_A(pmesh, &nzval, &colind, rowptr, newsize, RefArray, RefArrayBack); do_conjugate_gradient(nzval, B, result, nnz, newsize, colind, rowptr); /* XXX */ memcpy(B, result, newsize*sizeof(float)); /* now display back the ACTUAL result */ unsigned i; for (i = 0; i < newsize; i++) { result[TRANSLATE(i)] = B[i]; } for (i = newsize ; i < DIM; i++) { result[TRANSLATE(i)] = Bformer[TRANSLATE(i)]; } free(nzval); free(colind); free(rowptr); free(B); } else { /* unfortunately CUDA does not allow late memory registration, * we need to do the malloc using CUDA itself ... */ initialize_system(&A, &B, newsize, pinned); /* then build the stiffness matrix A */ build_sparse_stiffness_matrix_B(pmesh, B, Bformer, DIM, newsize, RefArray, RefArrayBack); build_dense_stiffness_matrix_A(pmesh, A, newsize, RefArray, RefArrayBack); FPRINTF(stderr, "Problem size : %ux%u (%ux%u) (%lu MB)\n", newsize, newsize, DIM, DIM, ((unsigned long)newsize*newsize*4UL)/(1024*1024)); STARPU_ASSERT(newsize % nblocks == 0); switch (version) { case 1: case 2: dw_factoLU(A, newsize, newsize, nblocks, version, no_prio); break; case 3: dw_factoLU_tag(A, newsize, newsize, nblocks, no_prio); break; case 4: dw_factoLU_grain(A, newsize, newsize, nblocks, nbigblocks); break; default: STARPU_ABORT(); } display_stat_heat(); if (check) solve_system(DIM, newsize, result, RefArray, Bformer, A, B); starpu_cublas_shutdown(); starpu_shutdown(); free_system(A, B, newsize, pinned); } #ifdef STARPU_OPENGL_RENDER opengl_render(ntheta, nthick, result, pmesh, argc, argv); #endif free(pmesh); free(RefArray); free(RefArrayBack); free(Bformer); free(result); return 0; } starpu-1.2.3+dfsg/examples/heat/heat.h000066400000000000000000000043771320135501600176120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2011-2012, 2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __HEAT_H__ #define __HEAT_H__ #include #include #include #include #include /* needed for STARPU_OPENGL_RENDER */ #include #include #ifdef STARPU_OPENGL_RENDER #include #include #include #endif #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #define PRINTF(fmt, ...) do { if (!getenv("STARPU_SSILENT")) {printf(fmt, ## __VA_ARGS__); }} while(0) #define X 0 #define Y 1 #define DIM ntheta*nthick #define RMIN (150.0f) #define RMAX (200.0f) #define Pi (3.141592f) #define NODE_NUMBER(theta, thick) ((unsigned long)((thick)+(theta)*nthick)) #define NODE_TO_THICK(n) ((n) % nthick) #define NODE_TO_THETA(n) ((n) / nthick) typedef struct point_t { float x; float y; } point; extern void dw_factoLU(float *matA, unsigned size, unsigned ld, unsigned nblocks, unsigned version, unsigned no_prio); extern void dw_factoLU_tag(float *matA, unsigned size, unsigned ld, unsigned nblocks, unsigned no_prio); extern void dw_factoLU_grain(float *matA, unsigned size, unsigned ld, unsigned nblocks, unsigned nbigblocks); extern void initialize_system(float **A, float **B, unsigned dim, unsigned pinned); extern void free_system(float *A, float *B, unsigned dim, unsigned pinned); void display_stat_heat(void); #ifdef STARPU_OPENGL_RENDER extern void opengl_render(unsigned _ntheta, unsigned _nthick, float *_result, point *_pmesh, int argc_, char **argv_); #endif #endif /* __HEAT_H__ */ starpu-1.2.3+dfsg/examples/heat/heat.sh000077500000000000000000000017101320135501600177640ustar00rootroot00000000000000#!/bin/bash # # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2017 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # Test various LU options set -e PREFIX=$(dirname $0) $PREFIX/heat -shape 0 $PREFIX/heat -shape 1 # sometimes lead to pivot being 0 #$PREFIX/heat -shape 2 $PREFIX/heat -cg # TODO: FIXME # segfault #$PREFIX/heat -v1 # (actually the default...) $PREFIX/heat -v2 # hang #$PREFIX/heat -v3 # hang #$PREFIX/heat -v4 starpu-1.2.3+dfsg/examples/heat/heat_display.c000066400000000000000000000141431320135501600213220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011 Université de Bordeaux * Copyright (C) 2010, 2011 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "heat.h" #ifdef STARPU_OPENGL_RENDER /* * Just some dummy OpenGL code to display our results * */ static float minval, maxval; static unsigned ntheta; static unsigned nthick; static float *result; static unsigned printmesh =0; static point *pmesh; float xmin, xmax, ymin, ymax; float xcenter, ycenter; static void generate_graph(void) { unsigned theta, thick; for (theta = 0; theta < ntheta-1; theta++) { for (thick = 0; thick < nthick-1; thick++) { unsigned nodeA = NODE_NUMBER(theta, thick); unsigned nodeB = NODE_NUMBER(theta, thick+1); unsigned nodeC = NODE_NUMBER(theta+1, thick+1); unsigned nodeD = NODE_NUMBER(theta+1, thick); float colorA_R, colorB_R, colorC_R, colorD_R; float colorA_G, colorB_G, colorC_G, colorD_G; float colorA_B, colorB_B, colorC_B, colorD_B; if (maxval == minval) { colorA_R = 1.0f; colorA_G = 1.0f; colorA_B = 1.0f; colorB_R = 1.0f; colorB_G = 1.0f; colorB_B = 1.0f; colorC_R = 1.0f; colorC_G = 1.0f; colorC_B = 1.0f; colorD_R = 1.0f; colorD_G = 1.0f; colorD_B = 1.0f; } else { float amplitude = maxval - minval; float coeffA, coeffB, coeffC, coeffD; coeffA = (result[nodeA] - minval)/amplitude; coeffB = (result[nodeB] - minval)/amplitude; coeffC = (result[nodeC] - minval)/amplitude; coeffD = (result[nodeD] - minval)/amplitude; colorA_R = coeffA>0.5f?1.0f:(2.0*coeffA)*1.0f; colorB_R = coeffB>0.5f?1.0f:(2.0*coeffB)*1.0f; colorC_R = coeffC>0.5f?1.0f:(2.0*coeffC)*1.0f; colorD_R = coeffD>0.5f?1.0f:(2.0*coeffD)*1.0f; colorA_B = 0.0f; colorB_B = 0.0f; colorC_B = 0.0f; colorD_B = 0.0f; colorA_G = coeffA<0.5f?1.0f:2.0*(1 - coeffA)*1.0f; colorB_G = coeffB<0.5f?1.0f:2.0*(1 - coeffB)*1.0f; colorC_G = coeffC<0.5f?1.0f:2.0*(1 - coeffC)*1.0f; colorD_G = coeffD<0.5f?1.0f:2.0*(1 - coeffD)*1.0f; } if (printmesh) { glColor3f (0.0f, 0.0f, 0.0f); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glLineWidth(3.0f); glBegin(GL_POLYGON); glVertex3f(pmesh[nodeA].x, pmesh[nodeA].y, 2.0f); glVertex3f(pmesh[nodeD].x, pmesh[nodeD].y, 2.0f); glVertex3f(pmesh[nodeC].x, pmesh[nodeC].y, 2.0f); glVertex3f(pmesh[nodeA].x, pmesh[nodeA].y, 2.0f); glEnd(); glBegin(GL_POLYGON); glVertex3f(pmesh[nodeA].x, pmesh[nodeA].y, 1.0f); glVertex3f(pmesh[nodeC].x, pmesh[nodeC].y, 1.0f); glVertex3f(pmesh[nodeB].x, pmesh[nodeB].y, 1.0f); glVertex3f(pmesh[nodeA].x, pmesh[nodeA].y, 1.0f); glEnd(); } glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glBegin(GL_POLYGON); glColor3f (colorA_R, colorA_G, colorA_B); glVertex3f(pmesh[nodeA].x, pmesh[nodeA].y, 0.0f); glColor3f (colorD_R, colorD_G, colorD_B); glVertex3f(pmesh[nodeD].x, pmesh[nodeD].y, 0.0f); glColor3f (colorC_R, colorC_G, colorC_B); glVertex3f(pmesh[nodeC].x, pmesh[nodeC].y, 0.0f); glEnd(); glBegin(GL_POLYGON); glColor3f (colorA_R, colorA_G, colorA_B); glVertex3f(pmesh[nodeA].x, pmesh[nodeA].y, 0.0f); glColor3f (colorC_R, colorC_G, colorC_B); glVertex3f(pmesh[nodeC].x, pmesh[nodeC].y, 0.0f); glColor3f (colorB_R, colorB_G, colorB_B); glVertex3f(pmesh[nodeB].x, pmesh[nodeB].y, 0.0f); glEnd(); } } } static void display(void) { glClear (GL_COLOR_BUFFER_BIT); glLoadIdentity (); /* clear the matrix */ float amplitude = STARPU_MAX(xmax - xmin, ymax - ymin); float factor = 1.0/amplitude; glScalef (factor, factor, factor); /* modeling transformation */ gluLookAt (xcenter, ycenter, 30.0f, xcenter, ycenter, 0.0f, 0.0f, 1.0f, 0.0f); /* printf("factor %f\n", factor); glRotatef(-0,0.0,0.0,0.0); */ generate_graph(); glFlush (); } static void pressKey(unsigned char key, int x STARPU_ATTRIBUTE_UNUSED, int y STARPU_ATTRIBUTE_UNUSED) { switch (key) { case 'q': exit(0); default: printmesh = !printmesh; display(); break; } } static void reshape (int w, int h) { glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); glFrustum (xmin, xmax, ymin, ymax, 5.0f, 5.0f); glMatrixMode (GL_MODELVIEW); } void find_limits(void) { minval = 100000000.0f; maxval = -10000000.0f; unsigned i; for (i = 0; i < DIM; i++) { /* find min */ minval = STARPU_MIN(result[i], minval); /* find max */ maxval = STARPU_MAX(result[i], maxval); } xmin = 10000000.0f; xmax = -10000000.0f; ymin = 10000000.0f; ymax = -10000000.0f; unsigned theta, thick; for (theta = 0; theta < ntheta; theta++) { for (thick = 0; thick < nthick; thick++) { point *p = &pmesh[NODE_NUMBER(theta, thick)]; if (p->x < xmin) xmin = p->x; if (p->x > xmax) xmax = p->x; if (p->y < ymin) ymin = p->y; if (p->y > ymax) ymax = p->y; } } ycenter = (ymin + ymax)/2; xcenter = (xmin + xmax)/2; } void opengl_render(unsigned _ntheta, unsigned _nthick, float *_result, point *_pmesh, int argc_, char **argv_) { FPRINTF(stderr, "OpenGL rendering ... \n"); ntheta = _ntheta; nthick = _nthick; result = _result; printmesh = 0; pmesh = _pmesh; find_limits(); glutInit(&argc_, argv_); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (800, 800); glutInitWindowPosition (100, 100); glutCreateWindow ("Temperature"); /* init */ glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_MODELVIEW); glutKeyboardFunc(pressKey); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); } #endif /* STARPU_OPENGL_RENDER */ starpu-1.2.3+dfsg/examples/heat/lu_kernels_model.c000066400000000000000000000124741320135501600222040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015 CNRS * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "lu_kernels_model.h" /* * As a convention, in that file, buffers[0] is represented by A, * buffers[1] is B ... */ /* * Number of flops of Gemm */ /* #define USE_PERTURBATION 1 */ #ifdef USE_PERTURBATION #define PERTURBATE(a) ((starpu_drand48()*2.0f*(AMPL) + 1.0f - (AMPL))*(a)) #else #define PERTURBATE(a) (a) #endif /* * * Generic models * */ double task_11_cost(struct starpu_task *task, unsigned nimpl) { uint32_t n; n = starpu_matrix_get_nx(task->handles[0]); double cost = ((n*n*n)/537.5); return PERTURBATE(cost); } double task_12_cost(struct starpu_task *task, unsigned nimpl) { uint32_t n; n = starpu_matrix_get_nx(task->handles[0]); /* double cost = ((n*n*n)/1744.695); */ double cost = ((n*n*n)/3210.80); /* fprintf(stderr, "task 12 predicts %e\n", cost); */ return PERTURBATE(cost); } double task_21_cost(struct starpu_task *task, unsigned nimpl) { uint32_t n; n = starpu_matrix_get_nx(task->handles[0]); /* double cost = ((n*n*n)/1744.695); */ double cost = ((n*n*n)/3691.53); /* fprintf(stderr, "task 12 predicts %e\n", cost); */ return PERTURBATE(cost); } double task_22_cost(struct starpu_task *task, unsigned nimpl) { uint32_t nx, ny, nz; nx = starpu_matrix_get_nx(task->handles[2]); ny = starpu_matrix_get_ny(task->handles[2]); nz = starpu_matrix_get_ny(task->handles[0]); double cost = ((nx*ny*nz)/4110.0); return PERTURBATE(cost); } /* * * Models for CUDA * */ double task_11_cost_cuda(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { uint32_t n; n = starpu_matrix_get_nx(task->handles[0]); double cost = ((n*n*n)/1853.7806); /* printf("CUDA task 11 ; predict %e\n", cost); */ return PERTURBATE(cost); } double task_12_cost_cuda(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { uint32_t n; n = starpu_matrix_get_nx(task->handles[0]); double cost = ((n*n*n)/42838.5718); /* printf("CUDA task 12 ; predict %e\n", cost); */ return PERTURBATE(cost); } double task_21_cost_cuda(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { uint32_t n; n = starpu_matrix_get_nx(task->handles[0]); double cost = ((n*n*n)/49208.667); /* printf("CUDA task 21 ; predict %e\n", cost); */ return PERTURBATE(cost); } double task_22_cost_cuda(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { uint32_t nx, ny, nz; nx = starpu_matrix_get_nx(task->handles[2]); ny = starpu_matrix_get_ny(task->handles[2]); nz = starpu_matrix_get_ny(task->handles[0]); double cost = ((nx*ny*nz)/57523.560); /* printf("CUDA task 22 ; predict %e\n", cost); */ return PERTURBATE(cost); } /* * * Models for CPUs * */ double task_11_cost_cpu(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { uint32_t n; n = starpu_matrix_get_nx(task->handles[0]); double cost = ((n*n*n)/537.5); /* printf("CPU task 11 ; predict %e\n", cost); */ return PERTURBATE(cost); } double task_12_cost_cpu(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { uint32_t n; n = starpu_matrix_get_nx(task->handles[0]); double cost = ((n*n*n)/6668.224); /* printf("CPU task 12 ; predict %e\n", cost); */ return PERTURBATE(cost); } double task_21_cost_cpu(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { uint32_t n; n = starpu_matrix_get_nx(task->handles[0]); double cost = ((n*n*n)/6793.8423); /* printf("CPU task 21 ; predict %e\n", cost); */ return PERTURBATE(cost); } double task_22_cost_cpu(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { uint32_t nx, ny, nz; nx = starpu_matrix_get_nx(task->handles[2]); ny = starpu_matrix_get_ny(task->handles[2]); nz = starpu_matrix_get_ny(task->handles[0]); double cost = ((nx*ny*nz)/4203.0175); /* printf("CPU task 22 ; predict %e\n", cost); */ return PERTURBATE(cost); } void initialize_lu_kernels_model(struct starpu_perfmodel* model, char * symbol, double (*cost_function)(struct starpu_task *, unsigned), double (*cpu_cost_function)(struct starpu_task *, struct starpu_perfmodel_arch*, unsigned), double (*cuda_cost_function)(struct starpu_task *, struct starpu_perfmodel_arch*, unsigned)) { model->symbol = symbol; model->type = STARPU_HISTORY_BASED; starpu_perfmodel_init(model); starpu_perfmodel_set_per_devices_cost_function(model, 0, cpu_cost_function, STARPU_CPU_WORKER, 0, 1, -1); if(starpu_worker_get_count_by_type(STARPU_CUDA_WORKER) != 0) { starpu_perfmodel_set_per_devices_cost_function(model, 0, cuda_cost_function, STARPU_CUDA_WORKER, 0, 1, -1); } } starpu-1.2.3+dfsg/examples/heat/lu_kernels_model.h000066400000000000000000000042641320135501600222070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __LU_KERNELS_MODEL_H__ #define __LU_KERNELS_MODEL_H__ #include double task_11_cost(struct starpu_task *task, unsigned nimpl); double task_12_cost(struct starpu_task *task, unsigned nimpl); double task_21_cost(struct starpu_task *task, unsigned nimpl); double task_22_cost(struct starpu_task *task, unsigned nimpl); double task_11_cost_cuda(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl); double task_12_cost_cuda(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl); double task_21_cost_cuda(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl); double task_22_cost_cuda(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl); double task_11_cost_cpu(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl); double task_12_cost_cpu(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl); double task_21_cost_cpu(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl); double task_22_cost_cpu(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl); void initialize_lu_kernels_model(struct starpu_perfmodel* model, char * symbol, double (*cost_function)(struct starpu_task *, unsigned), double (*cpu_cost_function)(struct starpu_task *, struct starpu_perfmodel_arch*, unsigned), double (*cuda_cost_function)(struct starpu_task *, struct starpu_perfmodel_arch*, unsigned)); #endif /* __LU_KERNELS_MODEL_H__ */ starpu-1.2.3+dfsg/examples/incrementer/000077500000000000000000000000001320135501600200775ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/incrementer/incrementer.c000066400000000000000000000072141320135501600225620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2011, 2013-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This is just a small example which increments two values of a vector several times. */ #include #include #ifdef STARPU_QUICK_CHECK static unsigned niter = 500; #elif !defined(STARPU_LONG_CHECK) static unsigned niter = 5000; #else static unsigned niter = 50000; #endif #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #ifdef STARPU_USE_CUDA extern void cuda_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); #endif #ifdef STARPU_USE_OPENCL extern void opencl_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); struct starpu_opencl_program opencl_program; #endif void cpu_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { float *val = (float *)STARPU_VECTOR_GET_PTR(descr[0]); val[0] += 1.0f; val[1] += 1.0f; } int main(int argc, char **argv) { int ret = 0; ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_QUICK_CHECK niter /= 100; #endif if (argc == 2) niter = atoi(argv[1]); float float_array[4] STARPU_ATTRIBUTE_ALIGNED(16) = { 0.0f, 0.0f, 0.0f, 0.0f}; starpu_data_handle_t float_array_handle; starpu_vector_data_register(&float_array_handle, STARPU_MAIN_RAM /* home node */, (uintptr_t)&float_array, 4, sizeof(float)); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_load_opencl_from_file("examples/incrementer/incrementer_kernels_opencl_kernel.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif struct starpu_codelet cl = { .cpu_funcs = {cpu_codelet}, .cpu_funcs_name = {"cpu_codelet"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_codelet}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_codelet}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .nbuffers = 1, .modes = {STARPU_RW}, .name = "increment" }; double start; double end; start = starpu_timing_now(); unsigned i; for (i = 0; i < niter; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->callback_func = NULL; task->handles[0] = float_array_handle; ret = starpu_task_submit(task); if (STARPU_UNLIKELY(ret == -ENODEV)) { FPRINTF(stderr, "No worker may execute this task\n"); exit(0); } } starpu_task_wait_for_all(); /* update the array in RAM */ starpu_data_unregister(float_array_handle); end = starpu_timing_now(); #ifdef STARPU_USE_OPENCL starpu_opencl_unload_opencl(&opencl_program); #endif FPRINTF(stderr, "array -> %f, %f, %f, %f\n", float_array[0], float_array[1], float_array[2], float_array[3]); if (float_array[0] != niter || float_array[0] != float_array[1] + float_array[2] + float_array[3]) { FPRINTF(stderr, "Incorrect result\n"); ret = 1; } double timing = end - start; FPRINTF(stderr, "%u elems took %f ms\n", niter, timing/1000); starpu_shutdown(); return ret; } starpu-1.2.3+dfsg/examples/incrementer/incrementer_kernels.cu000066400000000000000000000020711320135501600244660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014-2015 Université de Bordeaux * Copyright (C) 2010, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* CUDA kernel for incrementation */ #include static __global__ void cuda_incrementer(float * tab) { tab[0] = tab[0] + 1.0f; tab[2] = tab[2] + 1.0f; return; } extern "C" void cuda_codelet(void *descr[], void *_args) { (void)_args; float *val = (float *)STARPU_VECTOR_GET_PTR(descr[0]); cuda_incrementer<<<1,1, 0, starpu_cuda_get_local_stream()>>>(val); } starpu-1.2.3+dfsg/examples/incrementer/incrementer_kernels_opencl.c000066400000000000000000000035541320135501600256500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012, 2016 CNRS * Copyright (C) 2011, 2014-2015 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* OpenCL codelet for incrementation */ #include extern struct starpu_opencl_program opencl_program; void opencl_codelet(void *descr[], void *_args) { cl_mem val = (cl_mem)STARPU_VECTOR_GET_DEV_HANDLE(descr[0]); cl_kernel kernel; cl_command_queue queue; int id, devid, err; id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_program, "incrementer", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 0, sizeof(val), &val); if (err) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=4; size_t local, s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local=global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } starpu_opencl_release_kernel(kernel); } starpu-1.2.3+dfsg/examples/incrementer/incrementer_kernels_opencl_kernel.cl000066400000000000000000000014571320135501600273640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* OpenCL kernel for incrementation */ __kernel void incrementer(__global float* input) { const int i = get_global_id(0); if (i == 0 || i == 3) input[i] = input[i] + 1.0f; } starpu-1.2.3+dfsg/examples/interface/000077500000000000000000000000001320135501600175245ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/interface/complex.c000066400000000000000000000114221320135501600213370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "complex_interface.h" #include "complex_codelet.h" static int can_execute(unsigned workerid, struct starpu_task *task, unsigned nimpl) { if (starpu_worker_get_type(workerid) == STARPU_OPENCL_WORKER) return 1; #ifdef STARPU_USE_CUDA #ifdef STARPU_SIMGRID /* We don't know, let's assume it can */ return 1; #else /* Cuda device */ const struct cudaDeviceProp *props; props = starpu_cuda_get_device_properties(workerid); if (props->major >= 2 || props->minor >= 3) { /* At least compute capability 1.3, supports doubles */ return 1; } else { /* Old card does not support doubles */ return 0; } #endif #else return 1; #endif } #ifdef STARPU_USE_CUDA extern void copy_complex_codelet_cuda(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); #endif #ifdef STARPU_USE_OPENCL extern void copy_complex_codelet_opencl(void *buffers[], void *args); #endif struct starpu_codelet cl_copy = { #ifdef STARPU_USE_CUDA .cuda_funcs = {copy_complex_codelet_cuda}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {copy_complex_codelet_opencl}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .nbuffers = 2, .modes = {STARPU_R, STARPU_W}, .can_execute = can_execute, .name = "cl_copy" }; #ifdef STARPU_USE_OPENCL struct starpu_opencl_program opencl_program; #endif int main(int argc, char **argv) { int ret = 0; starpu_data_handle_t handle1; starpu_data_handle_t handle2; double real = 45.0; double imaginary = 12.0; double copy_real = 78.0; double copy_imaginary = 78.0; int compare; int *compare_ptr = &compare; ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_load_opencl_from_file("examples/interface/complex_kernels.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif starpu_complex_data_register(&handle1, STARPU_MAIN_RAM, &real, &imaginary, 1); starpu_complex_data_register(&handle2, STARPU_MAIN_RAM, ©_real, ©_imaginary, 1); ret = starpu_task_insert(&cl_display, STARPU_VALUE, "handle1", strlen("handle1")+1, STARPU_R, handle1, 0); if (ret == -ENODEV) goto end; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); ret = starpu_task_insert(&cl_display, STARPU_VALUE, "handle2", strlen("handle2")+1, STARPU_R, handle2, 0); if (ret == -ENODEV) goto end; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); ret = starpu_task_insert(&cl_compare, STARPU_R, handle1, STARPU_R, handle2, STARPU_VALUE, &compare_ptr, sizeof(compare_ptr), 0); if (ret == -ENODEV) goto end; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); starpu_task_wait_for_all(); if (compare != 0) { FPRINTF(stderr, "Complex numbers should NOT be similar\n"); goto end; } ret = starpu_task_insert(&cl_copy, STARPU_R, handle1, STARPU_W, handle2, 0); if (ret == -ENODEV) goto end; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); ret = starpu_task_insert(&cl_display, STARPU_VALUE, "handle1", strlen("handle1")+1, STARPU_R, handle1, 0); if (ret == -ENODEV) goto end; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); ret = starpu_task_insert(&cl_display, STARPU_VALUE, "handle2", strlen("handle2")+1, STARPU_R, handle2, 0); if (ret == -ENODEV) goto end; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); ret = starpu_task_insert(&cl_compare, STARPU_R, handle1, STARPU_R, handle2, STARPU_VALUE, &compare_ptr, sizeof(compare_ptr), 0); if (ret == -ENODEV) goto end; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); starpu_task_wait_for_all(); if (compare != 1) { FPRINTF(stderr, "Complex numbers should be similar\n"); } end: #ifdef STARPU_USE_OPENCL { int ret2 = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret2, "starpu_opencl_unload_opencl"); } #endif starpu_data_unregister(handle1); starpu_data_unregister(handle2); starpu_shutdown(); if (ret == -ENODEV) return 77; else return !compare; } starpu-1.2.3+dfsg/examples/interface/complex_codelet.h000066400000000000000000000045541320135501600230530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "complex_interface.h" #ifndef __COMPLEX_CODELET_H #define __COMPLEX_CODELET_H #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) void compare_complex_codelet(void *descr[], void *_args) { int nx1 = STARPU_COMPLEX_GET_NX(descr[0]); double *real1 = STARPU_COMPLEX_GET_REAL(descr[0]); double *imaginary1 = STARPU_COMPLEX_GET_IMAGINARY(descr[0]); int nx2 = STARPU_COMPLEX_GET_NX(descr[1]); double *real2 = STARPU_COMPLEX_GET_REAL(descr[1]); double *imaginary2 = STARPU_COMPLEX_GET_IMAGINARY(descr[1]); int *compare; starpu_codelet_unpack_args(_args, &compare); *compare = (nx1 == nx2); if (nx1 == nx2) { int i; for(i=0 ; i #include "complex_interface.h" double *starpu_complex_get_real(starpu_data_handle_t handle) { struct starpu_complex_interface *complex_interface = (struct starpu_complex_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); return complex_interface->real; } double *starpu_complex_get_imaginary(starpu_data_handle_t handle) { struct starpu_complex_interface *complex_interface = (struct starpu_complex_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); return complex_interface->imaginary; } int starpu_complex_get_nx(starpu_data_handle_t handle) { struct starpu_complex_interface *complex_interface = (struct starpu_complex_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); return complex_interface->nx; } static void complex_register_data_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface) { struct starpu_complex_interface *complex_interface = (struct starpu_complex_interface *) data_interface; unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct starpu_complex_interface *local_interface = (struct starpu_complex_interface *) starpu_data_get_interface_on_node(handle, node); local_interface->nx = complex_interface->nx; if (node == home_node) { local_interface->real = complex_interface->real; local_interface->imaginary = complex_interface->imaginary; } else { local_interface->real = 0; local_interface->imaginary = 0; } } } static starpu_ssize_t complex_allocate_data_on_node(void *data_interface, unsigned node) { struct starpu_complex_interface *complex_interface = (struct starpu_complex_interface *) data_interface; double *addr_real = 0; double *addr_imaginary = 0; starpu_ssize_t requested_memory = complex_interface->nx * sizeof(complex_interface->real[0]); addr_real = (double*) starpu_malloc_on_node(node, requested_memory); if (!addr_real) goto fail_real; addr_imaginary = (double*) starpu_malloc_on_node(node, requested_memory); if (!addr_imaginary) goto fail_imaginary; /* update the data properly in consequence */ complex_interface->real = addr_real; complex_interface->imaginary = addr_imaginary; return 2*requested_memory; fail_imaginary: starpu_free_on_node(node, (uintptr_t) addr_real, requested_memory); fail_real: return -ENOMEM; } static void complex_free_data_on_node(void *data_interface, unsigned node) { struct starpu_complex_interface *complex_interface = (struct starpu_complex_interface *) data_interface; starpu_ssize_t requested_memory = complex_interface->nx * sizeof(complex_interface->real[0]); starpu_free_on_node(node, (uintptr_t) complex_interface->real, requested_memory); starpu_free_on_node(node, (uintptr_t) complex_interface->imaginary, requested_memory); } static size_t complex_get_size(starpu_data_handle_t handle) { size_t size; struct starpu_complex_interface *complex_interface = (struct starpu_complex_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); size = complex_interface->nx * 2 * sizeof(double); return size; } static uint32_t complex_footprint(starpu_data_handle_t handle) { return starpu_hash_crc32c_be(starpu_complex_get_nx(handle), 0); } static int complex_pack_data(starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_complex_interface *complex_interface = (struct starpu_complex_interface *) starpu_data_get_interface_on_node(handle, node); *count = complex_get_size(handle); if (ptr != NULL) { char *data; starpu_malloc_flags((void**) &data, *count, 0); *ptr = data; memcpy(data, complex_interface->real, complex_interface->nx*sizeof(double)); memcpy(data+complex_interface->nx*sizeof(double), complex_interface->imaginary, complex_interface->nx*sizeof(double)); } return 0; } static int complex_unpack_data(starpu_data_handle_t handle, unsigned node, void *ptr, size_t count) { char *data = ptr; STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_complex_interface *complex_interface = (struct starpu_complex_interface *) starpu_data_get_interface_on_node(handle, node); STARPU_ASSERT(count == 2 * complex_interface->nx * sizeof(double)); memcpy(complex_interface->real, data, complex_interface->nx*sizeof(double)); memcpy(complex_interface->imaginary, data+complex_interface->nx*sizeof(double), complex_interface->nx*sizeof(double)); return 0; } static starpu_ssize_t complex_describe(void *data_interface, char *buf, size_t size) { struct starpu_complex_interface *complex_interface = (struct starpu_complex_interface *) data_interface; return snprintf(buf, size, "Complex%d", complex_interface->nx); } static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data) { struct starpu_complex_interface *src_complex = src_interface; struct starpu_complex_interface *dst_complex = dst_interface; int ret = 0; if (starpu_interface_copy((uintptr_t) src_complex->real, 0, src_node, (uintptr_t) dst_complex->real, 0, dst_node, src_complex->nx*sizeof(src_complex->real[0]), async_data)) ret = -EAGAIN; if (starpu_interface_copy((uintptr_t) src_complex->imaginary, 0, src_node, (uintptr_t) dst_complex->imaginary, 0, dst_node, src_complex->nx*sizeof(src_complex->imaginary[0]), async_data)) ret = -EAGAIN; return ret; } static const struct starpu_data_copy_methods complex_copy_methods = { .any_to_any = copy_any_to_any }; static struct starpu_data_interface_ops interface_complex_ops = { .register_data_handle = complex_register_data_handle, .allocate_data_on_node = complex_allocate_data_on_node, .free_data_on_node = complex_free_data_on_node, .copy_methods = &complex_copy_methods, .get_size = complex_get_size, .footprint = complex_footprint, .interfaceid = STARPU_UNKNOWN_INTERFACE_ID, .interface_size = sizeof(struct starpu_complex_interface), .handle_to_pointer = NULL, .pack_data = complex_pack_data, .unpack_data = complex_unpack_data, .describe = complex_describe }; void starpu_complex_data_register(starpu_data_handle_t *handleptr, unsigned home_node, double *real, double *imaginary, int nx) { struct starpu_complex_interface complex = { .real = real, .imaginary = imaginary, .nx = nx }; if (interface_complex_ops.interfaceid == STARPU_UNKNOWN_INTERFACE_ID) { interface_complex_ops.interfaceid = starpu_data_interface_get_next_id(); } starpu_data_register(handleptr, home_node, &complex, &interface_complex_ops); } starpu-1.2.3+dfsg/examples/interface/complex_interface.h000066400000000000000000000027271320135501600233740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #ifndef __COMPLEX_INTERFACE_H #define __COMPLEX_INTERFACE_H /* interface for complex numbers */ struct starpu_complex_interface { double *real; double *imaginary; int nx; }; void starpu_complex_data_register(starpu_data_handle_t *handle, unsigned home_node, double *real, double *imaginary, int nx); double *starpu_complex_get_real(starpu_data_handle_t handle); double *starpu_complex_get_imaginary(starpu_data_handle_t handle); int starpu_complex_get_nx(starpu_data_handle_t handle); #define STARPU_COMPLEX_GET_REAL(interface) (((struct starpu_complex_interface *)(interface))->real) #define STARPU_COMPLEX_GET_IMAGINARY(interface) (((struct starpu_complex_interface *)(interface))->imaginary) #define STARPU_COMPLEX_GET_NX(interface) (((struct starpu_complex_interface *)(interface))->nx) #endif /* __COMPLEX_INTERFACE_H */ starpu-1.2.3+dfsg/examples/interface/complex_kernels.cl000066400000000000000000000020041320135501600232320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Use the "double" type */ #pragma OPENCL EXTENSION cl_khr_fp64 : enable __kernel void complex_copy_opencl(__global double *o_real, __global double *o_imaginary, __global double *i_real, __global double *i_imaginary, unsigned nx) { const int i = get_global_id(0); if (i < nx) { o_real[i] = i_real[i]; o_imaginary[i] = i_imaginary[i]; } } starpu-1.2.3+dfsg/examples/interface/complex_kernels.cu000066400000000000000000000030661320135501600232540ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "complex_interface.h" static __global__ void complex_copy_cuda(double *o_real, double *o_imaginary, double *i_real, double *i_imaginary, unsigned n) { unsigned i = blockIdx.x*blockDim.x + threadIdx.x; if (i < n) { o_real[i] = i_real[i]; o_imaginary[i] = i_imaginary[i]; } } extern "C" void copy_complex_codelet_cuda(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { (void)_args; int nx = STARPU_COMPLEX_GET_NX(descr[0]); double *i_real = STARPU_COMPLEX_GET_REAL(descr[0]); double *i_imaginary = STARPU_COMPLEX_GET_IMAGINARY(descr[0]); double *o_real = STARPU_COMPLEX_GET_REAL(descr[1]); double *o_imaginary = STARPU_COMPLEX_GET_IMAGINARY(descr[1]); unsigned threads_per_block = 64; unsigned nblocks = (nx + threads_per_block-1) / threads_per_block; complex_copy_cuda<<>>(o_real, o_imaginary, i_real, i_imaginary, nx); } starpu-1.2.3+dfsg/examples/interface/complex_kernels_opencl.c000066400000000000000000000047241320135501600244310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "complex_interface.h" extern struct starpu_opencl_program opencl_program; void copy_complex_codelet_opencl(void *buffers[], void *_args) { (void) _args; int id, devid; cl_int err; cl_kernel kernel; cl_command_queue queue; /* length of the vector */ unsigned n = STARPU_COMPLEX_GET_NX(buffers[0]); /* OpenCL copy of the vector pointer */ cl_mem i_real = (cl_mem) STARPU_COMPLEX_GET_REAL(buffers[0]); cl_mem i_imaginary = (cl_mem) STARPU_COMPLEX_GET_IMAGINARY(buffers[0]); cl_mem o_real = (cl_mem) STARPU_COMPLEX_GET_REAL(buffers[1]); cl_mem o_imaginary = (cl_mem) STARPU_COMPLEX_GET_IMAGINARY(buffers[1]); id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_program, "complex_copy_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 0, sizeof(o_real), &o_real); err|= clSetKernelArg(kernel, 1, sizeof(o_imaginary), &o_imaginary); err|= clSetKernelArg(kernel, 2, sizeof(i_real), &i_real); err|= clSetKernelArg(kernel, 3, sizeof(i_imaginary), &i_imaginary); err|= clSetKernelArg(kernel, 4, sizeof(n), &n); if (err) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=n; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local=global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } starpu_opencl_release_kernel(kernel); } starpu-1.2.3+dfsg/examples/loader-cross.sh.in000066400000000000000000000023421320135501600211230ustar00rootroot00000000000000#!/bin/bash # # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2013, 2015 Universite de Bordeaux # Copyright (C) 2015 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. top_srcdir="@top_srcdir@" export top_builddir="@top_builddir@" exec="$1" shift if test -z "$exec" then echo "[Error] Syntax: $0 " exit 1 fi NATIVE=${PWD/\/build_mic\//\/build_host\/} DIR="$(dirname "$exec")" FILE="$(basename "$exec")" export SINK_LD_LIBRARY_PATH="$top_builddir/src/.libs:$SINK_LD_LIBRARY_PATH" export STARPU_MIC_SINK_PROGRAM_NAME="$exec" # in case libtool got into play [ -x "$DIR/.libs/$FILE" ] && STARPU_MIC_SINK_PROGRAM_NAME="$DIR/.libs/$FILE" $top_builddir/../build_host/tests/loader "$NATIVE/$exec" "$@" starpu-1.2.3+dfsg/examples/lu/000077500000000000000000000000001320135501600162045ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/lu/blas_complex.c000066400000000000000000000154231320135501600210250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include "blas_complex.h" /* This files contains BLAS wrappers for the different BLAS implementations (eg. REFBLAS, STARPU_ATLAS, GOTOBLAS ...). We assume a Fortran orientation as most libraries do not supply C-based ordering. */ #ifdef STARPU_ATLAS #error not implemented #elif defined(STARPU_GOTO) || defined(STARPU_SYSTEM_BLAS) #error not implemented #elif defined(STARPU_MKL) inline void CGEMM(char *transa, char *transb, int M, int N, int K, complex float alpha, complex float *A, int lda, complex float *B, int ldb, complex float beta, complex float *C, int ldc) { cgemm_(transa, transb, &M, &N, &K, &alpha, A, &lda, B, &ldb, &beta, C, &ldc); } inline void ZGEMM(char *transa, char *transb, int M, int N, int K, complex double alpha, complex double *A, int lda, complex double *B, int ldb, complex double beta, complex double *C, int ldc) { zgemm_(transa, transb, &M, &N, &K, &alpha, A, &lda, B, &ldb, &beta, C, &ldc); } inline void CGEMV(char *transa, int M, int N, complex float alpha, complex float *A, int lda, complex float *X, int incX, complex float beta, complex float *Y, int incY) { cgemv_(transa, &M, &N, &alpha, A, &lda, X, &incX, &beta, Y, &incY); } inline void ZGEMV(char *transa, int M, int N, complex double alpha, complex double *A, int lda, complex double *X, int incX, complex double beta, complex double *Y, int incY) { zgemv_(transa, &M, &N, &alpha, A, &lda, X, &incX, &beta, Y, &incY); } inline float SCASUM(int N, complex float *X, int incX) { return scasum_(&N, X, &incX); } inline double DZASUM(int N, complex double *X, int incX) { return dzasum_(&N, X, &incX); } void CSCAL(int N, complex float alpha, complex float *X, int incX) { cscal_(&N, &alpha, X, &incX); } void ZSCAL(int N, complex double alpha, complex double *X, int incX) { zscal_(&N, &alpha, X, &incX); } void CTRSM (const char *side, const char *uplo, const char *transa, const char *diag, const int m, const int n, const complex float alpha, const complex float *A, const int lda, complex float *B, const int ldb) { ctrsm_(side, uplo, transa, diag, &m, &n, &alpha, A, &lda, B, &ldb); } void ZTRSM (const char *side, const char *uplo, const char *transa, const char *diag, const int m, const int n, const complex double alpha, const complex double *A, const int lda, complex double *B, const int ldb) { ztrsm_(side, uplo, transa, diag, &m, &n, &alpha, A, &lda, B, &ldb); } void CSYR (const char *uplo, const int n, const complex float alpha, const complex float *x, const int incx, complex float *A, const int lda) { csyr_(uplo, &n, &alpha, x, &incx, A, &lda); } void CSYRK (const char *uplo, const char *trans, const int n, const int k, const complex float alpha, const complex float *A, const int lda, const complex float beta, complex float *C, const int ldc) { csyrk_(uplo, trans, &n, &k, &alpha, A, &lda, &beta, C, &ldc); } void CGERU(const int m, const int n, const complex float alpha, const complex float *x, const int incx, const complex float *y, const int incy, complex float *A, const int lda) { cgeru_(&m, &n, &alpha, x, &incx, y, &incy, A, &lda); } void ZGERU(const int m, const int n, const complex double alpha, const complex double *x, const int incx, const complex double *y, const int incy, complex double *A, const int lda) { zgeru_(&m, &n, &alpha, x, &incx, y, &incy, A, &lda); } void CTRSV (const char *uplo, const char *trans, const char *diag, const int n, const complex float *A, const int lda, complex float *x, const int incx) { ctrsv_(uplo, trans, diag, &n, A, &lda, x, &incx); } void CTRMM(const char *side, const char *uplo, const char *transA, const char *diag, const int m, const int n, const complex float alpha, const complex float *A, const int lda, complex float *B, const int ldb) { ctrmm_(side, uplo, transA, diag, &m, &n, &alpha, A, &lda, B, &ldb); } void ZTRMM(const char *side, const char *uplo, const char *transA, const char *diag, const int m, const int n, const complex double alpha, const complex double *A, const int lda, complex double *B, const int ldb) { ztrmm_(side, uplo, transA, diag, &m, &n, &alpha, A, &lda, B, &ldb); } void CTRMV(const char *uplo, const char *transA, const char *diag, const int n, const complex float *A, const int lda, complex float *X, const int incX) { ctrmv_(uplo, transA, diag, &n, A, &lda, X, &incX); } void CAXPY(const int n, const complex float alpha, complex float *X, const int incX, complex float *Y, const int incY) { caxpy_(&n, &alpha, X, &incX, Y, &incY); } void ZAXPY(const int n, const complex double alpha, complex double *X, const int incX, complex double *Y, const int incY) { zaxpy_(&n, &alpha, X, &incX, Y, &incY); } int ICAMAX (const int n, complex float *X, const int incX) { int retVal; retVal = icamax_ (&n, X, &incX); return retVal; } int IZAMAX (const int n, complex double *X, const int incX) { int retVal; retVal = izamax_ (&n, X, &incX); return retVal; } complex float CDOTU(const int n, const complex float *x, const int incx, const complex float *y, const int incy) { complex float retVal = 0; /* GOTOBLAS will return a FLOATRET which is a double, not a float */ retVal = (float)cdotu_(&n, x, &incx, y, &incy); return retVal; } complex double ZDOTU(const int n, const complex double *x, const int incx, const complex double *y, const int incy) { return zdotu_(&n, x, &incx, y, &incy); } void CSWAP(const int n, complex float *X, const int incX, complex float *Y, const int incY) { cswap_(&n, X, &incX, Y, &incY); } void ZSWAP(const int n, complex double *X, const int incX, complex double *Y, const int incY) { zswap_(&n, X, &incX, Y, &incY); } #else #error "no BLAS lib available..." #endif starpu-1.2.3+dfsg/examples/lu/blas_complex.h000066400000000000000000000233061320135501600210310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __BLAS_H__ #define __BLAS_H__ #include #if defined(STARPU_MKL) #define MKLcomplex8 complex float #define MKLcomplex16 complex double #endif void CGEMM(char *transa, char *transb, int M, int N, int K, complex float alpha, complex float *A, int lda, complex float *B, int ldb, complex float beta, complex float *C, int ldc); void ZGEMM(char *transa, char *transb, int M, int N, int K, complex double alpha, complex double *A, int lda, complex double *B, int ldb, complex double beta, complex double *C, int ldc); void CGEMV(char *transa, int M, int N, complex float alpha, complex float *A, int lda, complex float *X, int incX, complex float beta, complex float *Y, int incY); void ZGEMV(char *transa, int M, int N, complex double alpha, complex double *A, int lda, complex double *X, int incX, complex double beta, complex double *Y, int incY); float SCASUM(int N, complex float *X, int incX); double DZASUM(int N, complex double *X, int incX); void CSCAL(int N, complex float alpha, complex float *X, int incX); void ZSCAL(int N, complex double alpha, complex double *X, int incX); void CTRSM (const char *side, const char *uplo, const char *transa, const char *diag, const int m, const int n, const complex float alpha, const complex float *A, const int lda, complex float *B, const int ldb); void ZTRSM (const char *side, const char *uplo, const char *transa, const char *diag, const int m, const int n, const complex double alpha, const complex double *A, const int lda, complex double *B, const int ldb); void CSYR (const char *uplo, const int n, const complex float alpha, const complex float *x, const int incx, complex float *A, const int lda); void CSYRK (const char *uplo, const char *trans, const int n, const int k, const complex float alpha, const complex float *A, const int lda, const complex float beta, complex float *C, const int ldc); void CGERU (const int m, const int n, const complex float alpha, const complex float *x, const int incx, const complex float *y, const int incy, complex float *A, const int lda); void ZGERU(const int m, const int n, const complex double alpha, const complex double *x, const int incx, const complex double *y, const int incy, complex double *A, const int lda); void CTRSV (const char *uplo, const char *trans, const char *diag, const int n, const complex float *A, const int lda, complex float *x, const int incx); void CTRMM(const char *side, const char *uplo, const char *transA, const char *diag, const int m, const int n, const complex float alpha, const complex float *A, const int lda, complex float *B, const int ldb); void ZTRMM(const char *side, const char *uplo, const char *transA, const char *diag, const int m, const int n, const complex double alpha, const complex double *A, const int lda, complex double *B, const int ldb); void CTRMV(const char *uplo, const char *transA, const char *diag, const int n, const complex float *A, const int lda, complex float *X, const int incX); void CAXPY(const int n, const complex float alpha, complex float *X, const int incX, complex float *Y, const int incy); void ZAXPY(const int n, const complex double alpha, complex double *X, const int incX, complex double *Y, const int incY); int ICAMAX (const int n, complex float *X, const int incX); int IZAMAX (const int n, complex double *X, const int incX); complex float CDOTU(const int n, const complex float *x, const int incx, const complex float *y, const int incy); complex double ZDOTU(const int n, const complex double *x, const int incx, const complex double *y, const int incy); void CSWAP(const int n, complex float *x, const int incx, complex float *y, const int incy); void ZSWAP(const int n, complex double *x, const int incx, complex double *y, const int incy); #if defined(STARPU_GOTO) || defined(STARPU_SYSTEM_BLAS) #error not implemented #elif defined(STARPU_MKL) extern void cgemm_ (const char *transa, const char *transb, const int *m, const int *n, const int *k, const complex float *alpha, const complex float *A, const int *lda, const complex float *B, const int *ldb, const complex float *beta, complex float *C, const int *ldc); extern void zgemm_ (const char *transa, const char *transb, const int *m, const int *n, const int *k, const complex double *alpha, const complex double *A, const int *lda, const complex double *B, const int *ldb, const complex double *beta, complex double *C, const int *ldc); extern void cgemv_(const char *trans, int *m, int *n, complex float *alpha, void *a, int *lda, void *x, int *incx, complex float *beta, void *y, int *incy); extern void zgemv_(const char *trans, int *m, int *n, complex double *alpha, void *a, int *lda, void *x, int *incx, complex double *beta, void *y, int *incy); extern void csyr_ (const char *uplo, const int *n, const complex float *alpha, const complex float *x, const int *incx, complex float *A, const int *lda); extern void csyrk_ (const char *uplo, const char *trans, const int *n, const int *k, const complex float *alpha, const complex float *A, const int *lda, const complex float *beta, complex float *C, const int *ldc); extern void ctrsm_ (const char *side, const char *uplo, const char *transa, const char *diag, const int *m, const int *n, const complex float *alpha, const complex float *A, const int *lda, complex float *B, const int *ldb); extern void ztrsm_ (const char *side, const char *uplo, const char *transa, const char *diag, const int *m, const int *n, const complex double *alpha, const complex double *A, const int *lda, complex double *B, const int *ldb); extern complex double scasum_ (const int *n, const complex float *x, const int *incx); extern complex double dzasum_ (const int *n, const complex double *x, const int *incx); extern void cscal_ (const int *n, const complex float *alpha, complex float *x, const int *incx); extern void zscal_ (const int *n, const complex double *alpha, complex double *x, const int *incx); extern void cgeru_(const int *m, const int *n, const complex float *alpha, const complex float *x, const int *incx, const complex float *y, const int *incy, complex float *A, const int *lda); extern void zgeru_(const int *m, const int *n, const complex double *alpha, const complex double *x, const int *incx, const complex double *y, const int *incy, complex double *A, const int *lda); extern void ctrsv_ (const char *uplo, const char *trans, const char *diag, const int *n, const complex float *A, const int *lda, complex float *x, const int *incx); extern void ctrmm_(const char *side, const char *uplo, const char *transA, const char *diag, const int *m, const int *n, const complex float *alpha, const complex float *A, const int *lda, complex float *B, const int *ldb); extern void ztrmm_(const char *side, const char *uplo, const char *transA, const char *diag, const int *m, const int *n, const complex double *alpha, const complex double *A, const int *lda, complex double *B, const int *ldb); extern void ctrmv_(const char *uplo, const char *transA, const char *diag, const int *n, const complex float *A, const int *lda, complex float *X, const int *incX); extern void caxpy_(const int *n, const complex float *alpha, complex float *X, const int *incX, complex float *Y, const int *incy); extern void zaxpy_(const int *n, const complex double *alpha, complex double *X, const int *incX, complex double *Y, const int *incy); extern int icamax_(const int *n, complex float *X, const int *incX); extern int izamax_(const int *n, complex double *X, const int *incX); /* for some reason, FLOATRET is not a float but a double in GOTOBLAS */ extern complex double cdotu_(const int *n, const complex float *x, const int *incx, const complex float *y, const int *incy); extern complex double zdotu_(const int *n, const complex double *x, const int *incx, const complex double *y, const int *incy); extern void cswap_(const int *n, complex float *x, const int *incx, complex float *y, const int *incy); extern void zswap_(const int *n, complex double *x, const int *incx, complex double *y, const int *incy); #endif #endif /* __BLAS_COMPLEX_H__ */ starpu-1.2.3+dfsg/examples/lu/clu.c000066400000000000000000000014361320135501600171370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2015 Université de Bordeaux * Copyright (C) 2010, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Complex float LU version, explicit dependencies */ #include "complex_float.h" #include "xlu.c" starpu-1.2.3+dfsg/examples/lu/clu_implicit.c000066400000000000000000000014411320135501600210250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2015 Université de Bordeaux * Copyright (C) 2010, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Complex float LU version, implicit dependencies */ #include "complex_float.h" #include "xlu_implicit.c" starpu-1.2.3+dfsg/examples/lu/clu_implicit_pivot.c000066400000000000000000000014751320135501600222550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2015 Université de Bordeaux * Copyright (C) 2010, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Complex float LU version, implicit dependencies, and partial pivoting */ #include "complex_float.h" #include "xlu_implicit_pivot.c" starpu-1.2.3+dfsg/examples/lu/clu_kernels.c000066400000000000000000000014171320135501600206610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2015 Université de Bordeaux * Copyright (C) 2010, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Complex float LU kernels */ #include "complex_float.h" #include "xlu_kernels.c" starpu-1.2.3+dfsg/examples/lu/clu_pivot.c000066400000000000000000000014431320135501600203560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2015 Université de Bordeaux * Copyright (C) 2010, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Complex float LU kernels with partial pivoting */ #include "complex_float.h" #include "xlu_pivot.c" starpu-1.2.3+dfsg/examples/lu/complex_double.h000066400000000000000000000027171320135501600213650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014-2015, 2017 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Complex double macros */ #include #include "blas_complex.h" #define TYPE complex double #define CUBLAS_TYPE cuDoubleComplex #define STARPU_LU(name) starpu_zlu_##name #define COMPLEX_LU #define CUBLAS_GEMM cublasZgemm #define CUBLAS_TRSM cublasZtrsm #define CUBLAS_SCAL cublasZscal #define CUBLAS_GER cublasZgeru #define CUBLAS_SWAP cublasZswap #define CUBLAS_IAMAX cublasIzamax #define CPU_GEMM ZGEMM #define CPU_TRSM ZTRSM #define CPU_SCAL ZSCAL #define CPU_GER ZGERU #define CPU_SWAP ZSWAP #define CPU_TRMM ZTRMM #define CPU_AXPY ZAXPY #define CPU_ASUM DZASUM #define CPU_IAMAX IZAMAX #define PIVOT_THRESHHOLD 10e-5 #define CAN_EXECUTE .can_execute = can_execute, #define ISZERO(f) (fpclassify(creal(f)) == FP_ZERO && fpclassify(cimag(f)) == FP_ZERO) starpu-1.2.3+dfsg/examples/lu/complex_float.h000066400000000000000000000026531320135501600212170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014-2015, 2017 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Complex float macros */ #include #include "blas_complex.h" #define TYPE complex float #define CUBLAS_TYPE cuComplex #define STARPU_LU(name) starpu_clu_##name #define COMPLEX_LU #define CUBLAS_GEMM cublasCgemm #define CUBLAS_TRSM cublasCtrsm #define CUBLAS_SCAL cublasCscal #define CUBLAS_GER cublasCgeru #define CUBLAS_SWAP cublasCswap #define CUBLAS_IAMAX cublasIcamax #define CPU_GEMM CGEMM #define CPU_TRSM CTRSM #define CPU_SCAL CSCAL #define CPU_GER CGERU #define CPU_SWAP CSWAP #define CPU_TRMM CTRMM #define CPU_AXPY CAXPY #define CPU_ASUM SCASUM #define CPU_IAMAX ICAMAX #define PIVOT_THRESHHOLD 10e-5 #define CAN_EXECUTE #define ISZERO(f) (fpclassify(creal(f)) == FP_ZERO && fpclassify(cimag(f)) == FP_ZERO) starpu-1.2.3+dfsg/examples/lu/dlu.c000066400000000000000000000014221320135501600171330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2015 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Real double LU version, explicit dependencies */ #include "lu-double.h" #include "xlu.c" starpu-1.2.3+dfsg/examples/lu/dlu_implicit.c000066400000000000000000000014251320135501600210300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2015 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Real double LU version, implicit dependencies */ #include "lu-double.h" #include "xlu_implicit.c" starpu-1.2.3+dfsg/examples/lu/dlu_implicit_pivot.c000066400000000000000000000014611320135501600222510ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2015 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Real double LU version, implicit dependencies with partial pivoting */ #include "lu-double.h" #include "xlu_implicit_pivot.c" starpu-1.2.3+dfsg/examples/lu/dlu_kernels.c000066400000000000000000000014031320135501600206550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2015 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Real double LU kernels */ #include "lu-double.h" #include "xlu_kernels.c" starpu-1.2.3+dfsg/examples/lu/dlu_pivot.c000066400000000000000000000014271320135501600203610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2015 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Real double LU kernels with partial pivoting */ #include "lu-double.h" #include "xlu_pivot.c" starpu-1.2.3+dfsg/examples/lu/lu-double.h000066400000000000000000000026121320135501600202460ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014-2015, 2017 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Real double macros */ #define TYPE double #define CUBLAS_TYPE TYPE #define STARPU_LU(name) starpu_dlu_##name #define CUBLAS_GEMM cublasDgemm #define CUBLAS_TRSM cublasDtrsm #define CUBLAS_SCAL cublasDscal #define CUBLAS_GER cublasDger #define CUBLAS_SWAP cublasDswap #define CUBLAS_IAMAX cublasIdamax #define CPU_GEMM STARPU_DGEMM #define CPU_TRSM STARPU_DTRSM #define CPU_SCAL STARPU_DSCAL #define CPU_GER STARPU_DGER #define CPU_SWAP STARPU_DSWAP #define CPU_TRMM STARPU_DTRMM #define CPU_AXPY STARPU_DAXPY #define CPU_ASUM STARPU_DASUM #define CPU_IAMAX STARPU_IDAMAX #define PIVOT_THRESHHOLD 10e-10 #define CAN_EXECUTE .can_execute = can_execute, #define ISZERO(f) (fpclassify(f) == FP_ZERO) starpu-1.2.3+dfsg/examples/lu/lu-float.h000066400000000000000000000025531320135501600201050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014-2015, 2017 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Real float macros */ #define TYPE float #define CUBLAS_TYPE TYPE #define STARPU_LU(name) starpu_slu_##name #define CUBLAS_GEMM cublasSgemm #define CUBLAS_TRSM cublasStrsm #define CUBLAS_SCAL cublasSscal #define CUBLAS_GER cublasSger #define CUBLAS_SWAP cublasSswap #define CUBLAS_IAMAX cublasIsamax #define CPU_GEMM STARPU_SGEMM #define CPU_TRSM STARPU_STRSM #define CPU_SCAL STARPU_SSCAL #define CPU_GER STARPU_SGER #define CPU_SWAP STARPU_SSWAP #define CPU_TRMM STARPU_STRMM #define CPU_AXPY STARPU_SAXPY #define CPU_ASUM STARPU_SASUM #define CPU_IAMAX STARPU_ISAMAX #define PIVOT_THRESHHOLD 10e-5 #define CAN_EXECUTE #define ISZERO(f) (fpclassify(f) == FP_ZERO) starpu-1.2.3+dfsg/examples/lu/lu.sh000077500000000000000000000026321320135501600171660ustar00rootroot00000000000000#!/bin/sh # # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2017 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # Test various LU options set -e PREFIX=$(dirname $0) $PREFIX/lu_implicit_example_float -size $((960 * 4)) -nblocks 4 -piv $PREFIX/lu_implicit_example_float -size $((960 * 4)) -nblocks 4 -no-stride $PREFIX/lu_implicit_example_float -size $((960 * 4)) -nblocks 4 -bound $PREFIX/lu_implicit_example_float -size $((960 * 2)) -nblocks 2 -bounddeps $PREFIX/lu_implicit_example_float -size $((960 * 2)) -nblocks 2 -bound -bounddeps -bounddepsprio $PREFIX/lu_example_float -size $((960 * 4)) -nblocks 4 -piv $PREFIX/lu_example_float -size $((960 * 4)) -nblocks 4 -no-stride $PREFIX/lu_example_float -size $((960 * 4)) -nblocks 4 -bound $PREFIX/lu_example_float -size $((960 * 2)) -nblocks 2 -bounddeps $PREFIX/lu_example_float -size $((960 * 2)) -nblocks 2 -bound -bounddeps -bounddepsprio starpu-1.2.3+dfsg/examples/lu/lu_example.c000066400000000000000000000224151320135501600205070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Main body for the LU factorization: matrix initialization and result * checking */ #include #include #include #include #include #include #include "xlu.h" #include "xlu_kernels.h" static unsigned long size = 0; static unsigned nblocks = 0; static unsigned check = 0; static unsigned pivot = 0; static unsigned no_stride = 0; static unsigned profile = 0; unsigned bound = 0; unsigned bounddeps = 0; unsigned boundprio = 0; #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) TYPE *A, *A_saved; /* in case we use non-strided blocks */ TYPE **A_blocks; static void parse_args(int argc, char **argv) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-size") == 0) { char *argptr; size = strtol(argv[++i], &argptr, 10); } else if (strcmp(argv[i], "-nblocks") == 0) { char *argptr; nblocks = strtol(argv[++i], &argptr, 10); } #ifndef STARPU_SIMGRID else if (strcmp(argv[i], "-check") == 0) { check = 1; } else if (strcmp(argv[i], "-piv") == 0) { pivot = 1; } else if (strcmp(argv[i], "-no-stride") == 0) { no_stride = 1; } #endif else if (strcmp(argv[i], "-profile") == 0) { profile = 1; } else if (strcmp(argv[i], "-bound") == 0) { bound = 1; } else if (strcmp(argv[i], "-bounddeps") == 0) { bound = 1; bounddeps = 1; } else if (strcmp(argv[i], "-bounddepsprio") == 0) { bound = 1; bounddeps = 1; boundprio = 1; } else if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) { fprintf(stderr,"usage: lu [-size n] [-nblocks b] [-piv] [-no-stride] [-profile] [-bound] [-bounddeps] [-bounddepsprio]\n"); fprintf(stderr,"Default is size %lu and nblocks %u\n", size, nblocks); exit(0); } } } static void display_matrix(TYPE *m, unsigned n, unsigned ld, char *str) { #if 0 FPRINTF(stderr, "***********\n"); FPRINTF(stderr, "Display matrix %s\n", str); unsigned i,j; for (j = 0; j < n; j++) { for (i = 0; i < n; i++) { FPRINTF(stderr, "%2.2f\t", m[i+j*ld]); } FPRINTF(stderr, "\n"); } FPRINTF(stderr, "***********\n"); #endif } void copy_blocks_into_matrix(void) { unsigned blocksize = (size/nblocks); unsigned i, j; unsigned bi, bj; for (bj = 0; bj < nblocks; bj++) for (bi = 0; bi < nblocks; bi++) { for (j = 0; j < blocksize; j++) for (i = 0; i < blocksize; i++) { A[(i+bi*blocksize) + (j + bj*blocksize)*size] = A_blocks[bi+nblocks*bj][i + j * blocksize]; } starpu_free(A_blocks[bi+nblocks*bj]); } } void copy_matrix_into_blocks(void) { unsigned blocksize = (size/nblocks); unsigned i, j; unsigned bi, bj; for (bj = 0; bj < nblocks; bj++) for (bi = 0; bi < nblocks; bi++) { starpu_malloc((void **)&A_blocks[bi+nblocks*bj], (size_t)blocksize*blocksize*sizeof(TYPE)); for (j = 0; j < blocksize; j++) for (i = 0; i < blocksize; i++) { A_blocks[bi+nblocks*bj][i + j * blocksize] = A[(i+bi*blocksize) + (j + bj*blocksize)*size]; } } } static void init_matrix(void) { /* allocate matrix */ starpu_malloc_flags((void **)&A, (size_t)size*size*sizeof(TYPE), STARPU_MALLOC_PINNED|STARPU_MALLOC_SIMULATION_FOLDED); STARPU_ASSERT(A); starpu_srand48((long int)time(NULL)); /* starpu_srand48(0); */ #ifndef STARPU_SIMGRID /* initialize matrix content */ unsigned long i,j; for (j = 0; j < size; j++) { for (i = 0; i < size; i++) { A[i + j*size] = (TYPE)starpu_drand48(); #ifdef COMPLEX_LU /* also randomize the imaginary component for complex number cases */ A[i + j*size] += (TYPE)(I*starpu_drand48()); #endif if (i == j) { A[i + j*size] += 1; A[i + j*size] *= 100; } } } #endif } static void save_matrix(void) { A_saved = malloc((size_t)size*size*sizeof(TYPE)); STARPU_ASSERT(A_saved); memcpy(A_saved, A, (size_t)size*size*sizeof(TYPE)); } static double frobenius_norm(TYPE *v, unsigned n) { double sum2 = 0.0; /* compute sqrt(Sum(|x|^2)) */ unsigned i,j; for (j = 0; j < n; j++) for (i = 0; i < n; i++) { double a = fabsl((double)v[i+n*j]); sum2 += a*a; } return sqrt(sum2); } static void pivot_saved_matrix(unsigned *ipiv) { unsigned k; for (k = 0; k < size; k++) { if (k != ipiv[k]) { /* FPRINTF(stderr, "SWAP %d and %d\n", k, ipiv[k]); */ CPU_SWAP(size, &A_saved[k*size], 1, &A_saved[ipiv[k]*size], 1); } } } static void check_result(void) { unsigned i,j; TYPE *L, *U; L = malloc((size_t)size*size*sizeof(TYPE)); U = malloc((size_t)size*size*sizeof(TYPE)); memset(L, 0, size*size*sizeof(TYPE)); memset(U, 0, size*size*sizeof(TYPE)); /* only keep the lower part */ for (j = 0; j < size; j++) { for (i = 0; i < j; i++) { L[j+i*size] = A[j+i*size]; } /* diag i = j */ L[j+j*size] = A[j+j*size]; U[j+j*size] = 1.0; for (i = j+1; i < size; i++) { U[j+i*size] = A[j+i*size]; } } display_matrix(L, size, size, "L"); display_matrix(U, size, size, "U"); /* now A_err = L, compute L*U */ CPU_TRMM("R", "U", "N", "U", size, size, 1.0f, U, size, L, size); display_matrix(A_saved, size, size, "P A_saved"); display_matrix(L, size, size, "LU"); /* compute "LU - A" in L*/ CPU_AXPY(size*size, -1.0, A_saved, 1, L, 1); display_matrix(L, size, size, "Residuals"); #ifdef COMPLEX_LU double err = CPU_ASUM(size*size, L, 1); int max = CPU_IAMAX(size*size, L, 1); TYPE l_max = L[max]; FPRINTF(stderr, "Avg error : %e\n", err/(size*size)); FPRINTF(stderr, "Max error : %e\n", sqrt(creal(l_max)*creal(l_max)+cimag(l_max)*cimag(l_max))); #else TYPE err = CPU_ASUM(size*size, L, 1); int max = CPU_IAMAX(size*size, L, 1); FPRINTF(stderr, "Avg error : %e\n", err/(size*size)); FPRINTF(stderr, "Max error : %e\n", L[max]); #endif double residual = frobenius_norm(L, size); double matnorm = frobenius_norm(A_saved, size); FPRINTF(stderr, "||%sA-LU|| / (||A||*N) : %e\n", pivot?"P":"", residual/(matnorm*size)); if (residual/(matnorm*size) > 1e-5) exit(-1); free(L); free(U); free(A_saved); } int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); int power = starpu_cpu_worker_get_count() + 32 * starpu_cuda_worker_get_count(); int power_cbrt = cbrt(power); #ifndef STARPU_LONG_CHECK power_cbrt /= 2; #endif if (power_cbrt < 1) power_cbrt = 1; #ifdef STARPU_QUICK_CHECK if (!size) size = 320*2*power_cbrt; if (!nblocks) nblocks = 2*power_cbrt; #else if (!size) size = 960*8*power_cbrt; if (!nblocks) nblocks = 8*power_cbrt; #endif parse_args(argc, argv); starpu_cublas_init(); init_matrix(); #ifndef STARPU_SIMGRID unsigned *ipiv = NULL; if (check) save_matrix(); display_matrix(A, size, size, "A"); if (profile) starpu_profiling_status_set(STARPU_PROFILING_ENABLE); /* Factorize the matrix (in place) */ if (pivot) { ipiv = malloc(size*sizeof(unsigned)); if (no_stride) { /* in case the LU decomposition uses non-strided blocks, we _copy_ the matrix into smaller blocks */ A_blocks = malloc(nblocks*nblocks*sizeof(TYPE *)); copy_matrix_into_blocks(); ret = STARPU_LU(lu_decomposition_pivot_no_stride)(A_blocks, ipiv, size, size, nblocks); copy_blocks_into_matrix(); free(A_blocks); } else { double start; double end; start = starpu_timing_now(); ret = STARPU_LU(lu_decomposition_pivot)(A, ipiv, size, size, nblocks); end = starpu_timing_now(); double timing = end - start; unsigned n = size; double flop = (2.0f*n*n*n)/3.0f; FPRINTF(stderr, "Synthetic GFlops (TOTAL) : \n"); FPRINTF(stdout, "%u %6.2f\n", n, (flop/timing/1000.0f)); } } else #endif { ret = STARPU_LU(lu_decomposition)(A, size, size, nblocks); } if (profile) { FPRINTF(stderr, "Setting profile\n"); starpu_profiling_status_set(STARPU_PROFILING_DISABLE); starpu_profiling_bus_helper_display_summary(); } if (bound) { if (bounddeps) { FILE *f = fopen("lu.pl", "w"); starpu_bound_print_lp(f); FPRINTF(stderr,"system printed to lu.pl\n"); fclose(f); f = fopen("lu.mps", "w"); starpu_bound_print_mps(f); FPRINTF(stderr,"system printed to lu.mps\n"); fclose(f); f = fopen("lu.dot", "w"); starpu_bound_print_dot(f); FPRINTF(stderr,"system printed to lu.mps\n"); fclose(f); } } #ifndef STARPU_SIMGRID if (check) { FPRINTF(stderr, "Checking result\n"); if (pivot) { pivot_saved_matrix(ipiv); } check_result(); } #endif if (pivot) free(ipiv); starpu_free_flags(A, (size_t)size*size*sizeof(TYPE), STARPU_MALLOC_PINNED|STARPU_MALLOC_SIMULATION_FOLDED); starpu_cublas_shutdown(); starpu_shutdown(); if (ret == -ENODEV) return 77; else return 0; } starpu-1.2.3+dfsg/examples/lu/lu_example_complex_double.c000066400000000000000000000014611320135501600235660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2015 Université de Bordeaux * Copyright (C) 2010, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Main body for the LU factorization, complex double version */ #include "complex_double.h" #include "lu_example.c" starpu-1.2.3+dfsg/examples/lu/lu_example_complex_float.c000066400000000000000000000014571320135501600234260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2015 Université de Bordeaux * Copyright (C) 2010, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Main body for the LU factorization, complex float version */ #include "complex_float.h" #include "lu_example.c" starpu-1.2.3+dfsg/examples/lu/lu_example_double.c000066400000000000000000000014431320135501600220370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2015 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Main body for the LU factorization, real double version */ #include "lu-double.h" #include "lu_example.c" starpu-1.2.3+dfsg/examples/lu/lu_example_float.c000066400000000000000000000014411320135501600216700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2015 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Main body for the LU factorization, real float version */ #include "lu-float.h" #include "lu_example.c" starpu-1.2.3+dfsg/examples/lu/slu.c000066400000000000000000000014201320135501600171500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2015 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Real float LU version, explicit dependencies */ #include "lu-float.h" #include "xlu.c" starpu-1.2.3+dfsg/examples/lu/slu_implicit.c000066400000000000000000000014231320135501600210450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2015 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Real float LU version, implicit dependencies */ #include "lu-float.h" #include "xlu_implicit.c" starpu-1.2.3+dfsg/examples/lu/slu_implicit_pivot.c000066400000000000000000000014571320135501600222750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2015 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Real float LU version, implicit dependencies with partial pivoting */ #include "lu-float.h" #include "xlu_implicit_pivot.c" starpu-1.2.3+dfsg/examples/lu/slu_kernels.c000066400000000000000000000014011320135501600206720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2015 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Real float LU kernels */ #include "lu-float.h" #include "xlu_kernels.c" starpu-1.2.3+dfsg/examples/lu/slu_pivot.c000066400000000000000000000014251320135501600203760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2015 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Real float LU kernels with partial pivoting */ #include "lu-float.h" #include "xlu_pivot.c" starpu-1.2.3+dfsg/examples/lu/xlu.c000066400000000000000000000153121320135501600171620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011, 2014-2015, 2017 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* LU StarPU implementation using explicit tag dependencies */ #include "xlu.h" #include "xlu_kernels.h" static unsigned no_prio = 0; /* * Construct the DAG */ static struct starpu_task *create_task(starpu_tag_t id) { struct starpu_task *task = starpu_task_create(); task->cl_arg = NULL; task->use_tag = 1; task->tag_id = id; return task; } static struct starpu_task *create_task_11(starpu_data_handle_t dataA, unsigned k) { /* printf("task 11 k = %d TAG = %llx\n", k, (TAG11(k))); */ struct starpu_task *task = create_task(TAG11(k)); task->cl = &cl11; /* which sub-data is manipulated ? */ task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, k); /* this is an important task */ if (!no_prio) task->priority = STARPU_MAX_PRIO; /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG11(k), 1, TAG22(k-1, k, k)); } return task; } static int create_task_12(starpu_data_handle_t dataA, unsigned k, unsigned j) { int ret; /* printf("task 12 k,i = %d,%d TAG = %llx\n", k,i, TAG12(k,i)); */ struct starpu_task *task = create_task(TAG12(k, j)); task->cl = &cl12; /* which sub-data is manipulated ? */ task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, k); task->handles[1] = starpu_data_get_sub_data(dataA, 2, j, k); if (!no_prio && (j == k+1)) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG12(k, j), 2, TAG11(k), TAG22(k-1, k, j)); } else { starpu_tag_declare_deps(TAG12(k, j), 1, TAG11(k)); } ret = starpu_task_submit(task); if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); return ret; } static int create_task_21(starpu_data_handle_t dataA, unsigned k, unsigned i) { int ret; struct starpu_task *task = create_task(TAG21(k, i)); task->cl = &cl21; /* which sub-data is manipulated ? */ task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, k); task->handles[1] = starpu_data_get_sub_data(dataA, 2, k, i); if (!no_prio && (i == k+1)) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG21(k, i), 2, TAG11(k), TAG22(k-1, i, k)); } else { starpu_tag_declare_deps(TAG21(k, i), 1, TAG11(k)); } ret = starpu_task_submit(task); if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); return ret; } static int create_task_22(starpu_data_handle_t dataA, unsigned k, unsigned i, unsigned j) { int ret; /* printf("task 22 k,i,j = %d,%d,%d TAG = %llx\n", k,i,j, TAG22(k,i,j)); */ struct starpu_task *task = create_task(TAG22(k, i, j)); task->cl = &cl22; /* which sub-data is manipulated ? */ task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, i); /* produced by TAG21(k, i) */ task->handles[1] = starpu_data_get_sub_data(dataA, 2, j, k); /* produced by TAG12(k, j) */ task->handles[2] = starpu_data_get_sub_data(dataA, 2, j, i); /* produced by TAG22(k-1, i, j) */ if (!no_prio && (i == k + 1) && (j == k +1) ) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG22(k, i, j), 3, TAG22(k-1, i, j), TAG12(k, j), TAG21(k, i)); } else { starpu_tag_declare_deps(TAG22(k, i, j), 2, TAG12(k, j), TAG21(k, i)); } ret = starpu_task_submit(task); if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); return ret; } /* * code to bootstrap the factorization */ static int dw_codelet_facto_v3(starpu_data_handle_t dataA, unsigned nblocks) { int ret; double start; double end; struct starpu_task *entry_task = NULL; /* create all the DAG nodes */ unsigned i,j,k; if (bound) starpu_bound_start(bounddeps, boundprio); for (k = 0; k < nblocks; k++) { starpu_iteration_push(k); struct starpu_task *task = create_task_11(dataA, k); /* we defer the launch of the first task */ if (k == 0) { entry_task = task; } else { ret = starpu_task_submit(task); if (ret == -ENODEV) return ret; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } for (i = k+1; i #include #define TAG11(k) ((starpu_tag_t)( (1ULL<<60) | (unsigned long long)(k))) #define TAG12(k,i) ((starpu_tag_t)(((2ULL<<60) | (((unsigned long long)(k))<<32) \ | (unsigned long long)(i)))) #define TAG21(k,j) ((starpu_tag_t)(((3ULL<<60) | (((unsigned long long)(k))<<32) \ | (unsigned long long)(j)))) #define TAG22(k,i,j) ((starpu_tag_t)(((4ULL<<60) | ((unsigned long long)(k)<<32) \ | ((unsigned long long)(i)<<16) \ | (unsigned long long)(j)))) #define PIVOT(k,i) ((starpu_tag_t)(((5ULL<<60) | (((unsigned long long)(k))<<32) \ | (unsigned long long)(i)))) #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #define PRINTF(fmt, ...) do { if (!getenv("STARPU_SSILENT")) {printf(fmt, ## __VA_ARGS__); }} while(0) #define BLAS3_FLOP(n1,n2,n3) \ (2*((uint64_t)n1)*((uint64_t)n2)*((uint64_t)n3)) #ifdef CHECK_RESULTS static void STARPU_ATTRIBUTE_UNUSED compare_A_LU(float *A, float *LU, unsigned size, unsigned ld) { unsigned i,j; float *L; float *U; L = malloc(size*size*sizeof(float)); U = malloc(size*size*sizeof(float)); memset(L, 0, size*size*sizeof(float)); memset(U, 0, size*size*sizeof(float)); /* only keep the lower part */ for (j = 0; j < size; j++) { for (i = 0; i < j; i++) { L[j+i*size] = LU[j+i*ld]; } /* diag i = j */ L[j+j*size] = LU[j+j*ld]; U[j+j*size] = 1.0f; for (i = j+1; i < size; i++) { U[j+i*size] = LU[j+i*ld]; } } /* now A_err = L, compute L*U */ STARPU_STRMM("R", "U", "N", "U", size, size, 1.0f, U, size, L, size); float max_err = 0.0f; for (i = 0; i < size ; i++) { for (j = 0; j < size; j++) { max_err = STARPU_MAX(max_err, fabs( L[j+i*size] - A[j+i*ld] )); } } FPRINTF(stdout, "max error between A and L*U = %f \n", max_err); } #endif /* CHECK_RESULTS */ void dw_cpu_codelet_update_u11(void **, void *); void dw_cpu_codelet_update_u12(void **, void *); void dw_cpu_codelet_update_u21(void **, void *); void dw_cpu_codelet_update_u22(void **, void *); #ifdef STARPU_USE_CUDA void dw_cublas_codelet_update_u11(void *descr[], void *_args); void dw_cublas_codelet_update_u12(void *descr[], void *_args); void dw_cublas_codelet_update_u21(void *descr[], void *_args); void dw_cublas_codelet_update_u22(void *descr[], void *_args); #endif void dw_callback_codelet_update_u11(void *); void dw_callback_codelet_update_u12_21(void *); void dw_callback_codelet_update_u22(void *); void dw_callback_v2_codelet_update_u11(void *); void dw_callback_v2_codelet_update_u12(void *); void dw_callback_v2_codelet_update_u21(void *); void dw_callback_v2_codelet_update_u22(void *); extern struct starpu_perfmodel model_11; extern struct starpu_perfmodel model_12; extern struct starpu_perfmodel model_21; extern struct starpu_perfmodel model_22; extern unsigned bound; extern unsigned bounddeps; extern unsigned boundprio; struct piv_s { unsigned *piv; /* complete pivot array */ unsigned first; /* first element */ unsigned last; /* last element */ }; int STARPU_LU(lu_decomposition)(TYPE *matA, unsigned size, unsigned ld, unsigned nblocks); int STARPU_LU(lu_decomposition_pivot_no_stride)(TYPE **matA, unsigned *ipiv, unsigned size, unsigned ld, unsigned nblocks); int STARPU_LU(lu_decomposition_pivot)(TYPE *matA, unsigned *ipiv, unsigned size, unsigned ld, unsigned nblocks); #endif /* __XLU_H__ */ starpu-1.2.3+dfsg/examples/lu/xlu_implicit.c000066400000000000000000000126661320135501600210650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2014-2015, 2017 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2015, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* LU StarPU implementation using implicit task dependencies. */ #include "xlu.h" #include "xlu_kernels.h" static unsigned no_prio = 0; static int create_task_11(starpu_data_handle_t dataA, unsigned k) { int ret; struct starpu_task *task = starpu_task_create(); task->cl = &cl11; /* which sub-data is manipulated ? */ task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, k); task->tag_id = TAG11(k); /* this is an important task */ if (!no_prio) task->priority = STARPU_MAX_PRIO; ret = starpu_task_submit(task); if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); return ret; } static int create_task_12(starpu_data_handle_t dataA, unsigned k, unsigned j) { int ret; struct starpu_task *task = starpu_task_create(); task->cl = &cl12; /* which sub-data is manipulated ? */ task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, k); task->handles[1] = starpu_data_get_sub_data(dataA, 2, j, k); task->tag_id = TAG12(k,j); if (!no_prio && (j == k+1)) task->priority = STARPU_MAX_PRIO; ret = starpu_task_submit(task); if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); return ret; } static int create_task_21(starpu_data_handle_t dataA, unsigned k, unsigned i) { int ret; struct starpu_task *task = starpu_task_create(); task->cl = &cl21; /* which sub-data is manipulated ? */ task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, k); task->handles[1] = starpu_data_get_sub_data(dataA, 2, k, i); task->tag_id = TAG21(k,i); if (!no_prio && (i == k+1)) task->priority = STARPU_MAX_PRIO; ret = starpu_task_submit(task); if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); return ret; } static int create_task_22(starpu_data_handle_t dataA, unsigned k, unsigned i, unsigned j) { int ret; struct starpu_task *task = starpu_task_create(); task->cl = &cl22; /* which sub-data is manipulated ? */ task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, i); task->handles[1] = starpu_data_get_sub_data(dataA, 2, j, k); task->handles[2] = starpu_data_get_sub_data(dataA, 2, j, i); task->tag_id = TAG22(k,i,j); if (!no_prio && (i == k + 1) && (j == k +1) ) task->priority = STARPU_MAX_PRIO; ret = starpu_task_submit(task); if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); return ret; } /* * code to bootstrap the factorization */ static int dw_codelet_facto_v3(starpu_data_handle_t dataA, unsigned nblocks) { double start; double end; /* create all the DAG nodes */ unsigned i,j,k; if (bound) starpu_bound_start(bounddeps, boundprio); start = starpu_timing_now(); for (k = 0; k < nblocks; k++) { int ret; starpu_iteration_push(k); ret = create_task_11(dataA, k); if (ret == -ENODEV) return ret; for (i = k+1; i * Copyright (C) 2010, 2011, 2012, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* LU StarPU implementation using implicit task dependencies and partial * pivoting */ #include "xlu.h" #include "xlu_kernels.h" static unsigned no_prio = 0; /* * Construct the DAG */ static int create_task_pivot(starpu_data_handle_t *dataAp, unsigned nblocks, struct piv_s *piv_description, unsigned k, unsigned i, starpu_data_handle_t (* get_block)(starpu_data_handle_t *, unsigned, unsigned, unsigned)) { int ret; struct starpu_task *task = starpu_task_create(); task->cl = &cl_pivot; /* which sub-data is manipulated ? */ task->handles[0] = get_block(dataAp, nblocks, k, i); task->tag_id = PIVOT(k, i); task->cl_arg = &piv_description[k]; /* this is an important task */ if (!no_prio && (i == k+1)) task->priority = STARPU_MAX_PRIO; ret = starpu_task_submit(task); if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); return ret; } static int create_task_11_pivot(starpu_data_handle_t *dataAp, unsigned nblocks, unsigned k, struct piv_s *piv_description, starpu_data_handle_t (* get_block)(starpu_data_handle_t *, unsigned, unsigned, unsigned)) { int ret; struct starpu_task *task = starpu_task_create(); task->cl = &cl11_pivot; task->cl_arg = &piv_description[k]; /* which sub-data is manipulated ? */ task->handles[0] = get_block(dataAp, nblocks, k, k); task->tag_id = TAG11(k); /* this is an important task */ if (!no_prio) task->priority = STARPU_MAX_PRIO; ret = starpu_task_submit(task); if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); return ret; } static int create_task_12(starpu_data_handle_t *dataAp, unsigned nblocks, unsigned k, unsigned j, starpu_data_handle_t (* get_block)(starpu_data_handle_t *, unsigned, unsigned, unsigned)) { int ret; struct starpu_task *task = starpu_task_create(); task->cl = &cl12; /* which sub-data is manipulated ? */ task->handles[0] = get_block(dataAp, nblocks, k, k); task->handles[1] = get_block(dataAp, nblocks, j, k); task->tag_id = TAG12(k,j); if (!no_prio && (j == k+1)) task->priority = STARPU_MAX_PRIO; ret = starpu_task_submit(task); if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); return ret; } static int create_task_21(starpu_data_handle_t *dataAp, unsigned nblocks, unsigned k, unsigned i, starpu_data_handle_t (* get_block)(starpu_data_handle_t *, unsigned, unsigned, unsigned)) { int ret; struct starpu_task *task = starpu_task_create(); task->cl = &cl21; /* which sub-data is manipulated ? */ task->handles[0] = get_block(dataAp, nblocks, k, k); task->handles[1] = get_block(dataAp, nblocks, k, i); task->tag_id = TAG21(k,i); if (!no_prio && (i == k+1)) task->priority = STARPU_MAX_PRIO; ret = starpu_task_submit(task); if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); return ret; } static int create_task_22(starpu_data_handle_t *dataAp, unsigned nblocks, unsigned k, unsigned i, unsigned j, starpu_data_handle_t (* get_block)(starpu_data_handle_t *, unsigned, unsigned, unsigned)) { int ret; struct starpu_task *task = starpu_task_create(); task->cl = &cl22; /* which sub-data is manipulated ? */ task->handles[0] = get_block(dataAp, nblocks, k, i); task->handles[1] = get_block(dataAp, nblocks, j, k); task->handles[2] = get_block(dataAp, nblocks, j, i); task->tag_id = TAG22(k,i,j); if (!no_prio && (i == k + 1) && (j == k +1) ) task->priority = STARPU_MAX_PRIO; ret = starpu_task_submit(task); if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); return ret; } /* * code to bootstrap the factorization */ static int dw_codelet_facto_pivot(starpu_data_handle_t *dataAp, struct piv_s *piv_description, unsigned nblocks, starpu_data_handle_t (* get_block)(starpu_data_handle_t *, unsigned, unsigned, unsigned), double *timing) { double start; double end; /* create all the DAG nodes */ unsigned i,j,k; if (bound) starpu_bound_start(bounddeps, boundprio); start = starpu_timing_now(); for (k = 0; k < nblocks; k++) { int ret; starpu_iteration_push(k); ret = create_task_11_pivot(dataAp, nblocks, k, piv_description, get_block); if (ret == -ENODEV) return ret; for (i = 0; i < nblocks; i++) { if (i != k) { ret = create_task_pivot(dataAp, nblocks, piv_description, k, i, get_block); if (ret == -ENODEV) return ret; } } for (i = k+1; i #include #ifdef STARPU_USE_CUDA #include #include #endif #define str(s) #s #define xstr(s) str(s) #define STARPU_LU_STR(name) xstr(STARPU_LU(name)) #ifdef STARPU_USE_CUDA static const TYPE p1 = 1.0f; static const TYPE m1 = -1.0f; #endif /* * U22 */ static inline void STARPU_LU(common_u22)(void *descr[], int s, STARPU_ATTRIBUTE_UNUSED void *_args) { TYPE *right = (TYPE *)STARPU_MATRIX_GET_PTR(descr[0]); TYPE *left = (TYPE *)STARPU_MATRIX_GET_PTR(descr[1]); TYPE *center = (TYPE *)STARPU_MATRIX_GET_PTR(descr[2]); unsigned dx = STARPU_MATRIX_GET_NX(descr[2]); unsigned dy = STARPU_MATRIX_GET_NY(descr[2]); unsigned dz = STARPU_MATRIX_GET_NY(descr[0]); unsigned ld12 = STARPU_MATRIX_GET_LD(descr[0]); unsigned ld21 = STARPU_MATRIX_GET_LD(descr[1]); unsigned ld22 = STARPU_MATRIX_GET_LD(descr[2]); #ifdef STARPU_USE_CUDA cublasStatus status; cudaError_t cures; #endif switch (s) { case 0: CPU_GEMM("N", "N", dy, dx, dz, (TYPE)-1.0, right, ld21, left, ld12, (TYPE)1.0, center, ld22); break; #ifdef STARPU_USE_CUDA case 1: { status = CUBLAS_GEMM(starpu_cublas_get_local_handle(), CUBLAS_OP_N, CUBLAS_OP_N, dx, dy, dz, (CUBLAS_TYPE *)&m1, (CUBLAS_TYPE *)right, ld21, (CUBLAS_TYPE *)left, ld12, (CUBLAS_TYPE *)&p1, (CUBLAS_TYPE *)center, ld22); if (STARPU_UNLIKELY(status != CUBLAS_STATUS_SUCCESS)) STARPU_CUBLAS_REPORT_ERROR(status); break; } #endif default: STARPU_ABORT(); break; } } void STARPU_LU(cpu_u22)(void *descr[], void *_args) { STARPU_LU(common_u22)(descr, 0, _args); } #ifdef STARPU_USE_CUDA void STARPU_LU(cublas_u22)(void *descr[], void *_args) { STARPU_LU(common_u22)(descr, 1, _args); } #endif /* STARPU_USE_CUDA */ static struct starpu_perfmodel STARPU_LU(model_22) = { .type = STARPU_HISTORY_BASED, #ifdef STARPU_ATLAS .symbol = STARPU_LU_STR(lu_model_22_atlas) #elif defined(STARPU_GOTO) .symbol = STARPU_LU_STR(lu_model_22_goto) #else .symbol = STARPU_LU_STR(lu_model_22) #endif }; #ifdef STARPU_USE_CUDA static int can_execute(unsigned workerid, struct starpu_task *task, unsigned nimpl) { enum starpu_worker_archtype type = starpu_worker_get_type(workerid); if (type == STARPU_CPU_WORKER || type == STARPU_MIC_WORKER || type == STARPU_SCC_WORKER) return 1; #ifdef STARPU_SIMGRID /* We don't know, let's assume it can */ return 1; #else /* Cuda device */ const struct cudaDeviceProp *props; props = starpu_cuda_get_device_properties(workerid); if (props->major >= 2 || props->minor >= 3) { /* At least compute capability 1.3, supports doubles */ return 1; } else { /* Old card does not support doubles */ return 0; } #endif } #endif #define STRINGIFY_(x) #x #define STRINGIFY(x) STRINGIFY_(x) struct starpu_codelet cl22 = { .cpu_funcs = {STARPU_LU(cpu_u22)}, .cpu_funcs_name = {STRINGIFY(STARPU_LU(cpu_u22))}, #ifdef STARPU_USE_CUDA .cuda_funcs = {STARPU_LU(cublas_u22)}, CAN_EXECUTE #elif defined(STARPU_SIMGRID) .cuda_funcs = {(void*)1}, #endif .cuda_flags = {STARPU_CUDA_ASYNC}, .nbuffers = 3, .modes = {STARPU_R, STARPU_R, STARPU_RW}, .model = &STARPU_LU(model_22) }; /* * U12 */ static inline void STARPU_LU(common_u12)(void *descr[], int s, STARPU_ATTRIBUTE_UNUSED void *_args) { TYPE *sub11; TYPE *sub12; sub11 = (TYPE *)STARPU_MATRIX_GET_PTR(descr[0]); sub12 = (TYPE *)STARPU_MATRIX_GET_PTR(descr[1]); unsigned ld11 = STARPU_MATRIX_GET_LD(descr[0]); unsigned ld12 = STARPU_MATRIX_GET_LD(descr[1]); unsigned nx12 = STARPU_MATRIX_GET_NX(descr[1]); unsigned ny12 = STARPU_MATRIX_GET_NY(descr[1]); #ifdef STARPU_USE_CUDA cublasStatus status; cudaError_t cures; #endif /* solve L11 U12 = A12 (find U12) */ switch (s) { case 0: CPU_TRSM("L", "L", "N", "N", nx12, ny12, (TYPE)1.0, sub11, ld11, sub12, ld12); break; #ifdef STARPU_USE_CUDA case 1: status = CUBLAS_TRSM(starpu_cublas_get_local_handle(), CUBLAS_SIDE_LEFT, CUBLAS_FILL_MODE_LOWER, CUBLAS_OP_N, CUBLAS_DIAG_NON_UNIT, ny12, nx12, (CUBLAS_TYPE*)&p1, (CUBLAS_TYPE*)sub11, ld11, (CUBLAS_TYPE*)sub12, ld12); if (STARPU_UNLIKELY(status != CUBLAS_STATUS_SUCCESS)) STARPU_CUBLAS_REPORT_ERROR(status); break; #endif default: STARPU_ABORT(); break; } } void STARPU_LU(cpu_u12)(void *descr[], void *_args) { STARPU_LU(common_u12)(descr, 0, _args); } #ifdef STARPU_USE_CUDA void STARPU_LU(cublas_u12)(void *descr[], void *_args) { STARPU_LU(common_u12)(descr, 1, _args); } #endif /* STARPU_USE_CUDA */ static struct starpu_perfmodel STARPU_LU(model_12) = { .type = STARPU_HISTORY_BASED, #ifdef STARPU_ATLAS .symbol = STARPU_LU_STR(lu_model_12_atlas) #elif defined(STARPU_GOTO) .symbol = STARPU_LU_STR(lu_model_12_goto) #else .symbol = STARPU_LU_STR(lu_model_12) #endif }; struct starpu_codelet cl12 = { .cpu_funcs = {STARPU_LU(cpu_u12)}, .cpu_funcs_name = {STRINGIFY(STARPU_LU(cpu_u12))}, #ifdef STARPU_USE_CUDA .cuda_funcs = {STARPU_LU(cublas_u12)}, CAN_EXECUTE #elif defined(STARPU_SIMGRID) .cuda_funcs = {(void*)1}, #endif .cuda_flags = {STARPU_CUDA_ASYNC}, .nbuffers = 2, .modes = {STARPU_R, STARPU_RW}, .model = &STARPU_LU(model_12) }; /* * U21 */ static inline void STARPU_LU(common_u21)(void *descr[], int s, STARPU_ATTRIBUTE_UNUSED void *_args) { TYPE *sub11; TYPE *sub21; sub11 = (TYPE *)STARPU_MATRIX_GET_PTR(descr[0]); sub21 = (TYPE *)STARPU_MATRIX_GET_PTR(descr[1]); unsigned ld11 = STARPU_MATRIX_GET_LD(descr[0]); unsigned ld21 = STARPU_MATRIX_GET_LD(descr[1]); unsigned nx21 = STARPU_MATRIX_GET_NX(descr[1]); unsigned ny21 = STARPU_MATRIX_GET_NY(descr[1]); #ifdef STARPU_USE_CUDA cublasStatus status; #endif switch (s) { case 0: CPU_TRSM("R", "U", "N", "U", nx21, ny21, (TYPE)1.0, sub11, ld11, sub21, ld21); break; #ifdef STARPU_USE_CUDA case 1: status = CUBLAS_TRSM(starpu_cublas_get_local_handle(), CUBLAS_SIDE_RIGHT, CUBLAS_FILL_MODE_UPPER, CUBLAS_OP_N, CUBLAS_DIAG_UNIT, ny21, nx21, (CUBLAS_TYPE*)&p1, (CUBLAS_TYPE*)sub11, ld11, (CUBLAS_TYPE*)sub21, ld21); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); break; #endif default: STARPU_ABORT(); break; } } void STARPU_LU(cpu_u21)(void *descr[], void *_args) { STARPU_LU(common_u21)(descr, 0, _args); } #ifdef STARPU_USE_CUDA void STARPU_LU(cublas_u21)(void *descr[], void *_args) { STARPU_LU(common_u21)(descr, 1, _args); } #endif static struct starpu_perfmodel STARPU_LU(model_21) = { .type = STARPU_HISTORY_BASED, #ifdef STARPU_ATLAS .symbol = STARPU_LU_STR(lu_model_21_atlas) #elif defined(STARPU_GOTO) .symbol = STARPU_LU_STR(lu_model_21_goto) #else .symbol = STARPU_LU_STR(lu_model_21) #endif }; struct starpu_codelet cl21 = { .cpu_funcs = {STARPU_LU(cpu_u21)}, .cpu_funcs_name = {STRINGIFY(STARPU_LU(cpu_u21))}, #ifdef STARPU_USE_CUDA .cuda_funcs = {STARPU_LU(cublas_u21)}, CAN_EXECUTE #elif defined(STARPU_SIMGRID) .cuda_funcs = {(void*)1}, #endif .cuda_flags = {STARPU_CUDA_ASYNC}, .nbuffers = 2, .modes = {STARPU_R, STARPU_RW}, .model = &STARPU_LU(model_21) }; /* * U11 */ static inline void STARPU_LU(common_u11)(void *descr[], int s, STARPU_ATTRIBUTE_UNUSED void *_args) { TYPE *sub11; sub11 = (TYPE *)STARPU_MATRIX_GET_PTR(descr[0]); unsigned long nx = STARPU_MATRIX_GET_NX(descr[0]); unsigned long ld = STARPU_MATRIX_GET_LD(descr[0]); unsigned long z; #ifdef STARPU_USE_CUDA cublasStatus status; cublasHandle_t handle; cudaStream_t stream; #endif switch (s) { case 0: for (z = 0; z < nx; z++) { TYPE pivot; pivot = sub11[z+z*ld]; STARPU_ASSERT(!ISZERO(pivot)); CPU_SCAL(nx - z - 1, (1.0/pivot), &sub11[z+(z+1)*ld], ld); CPU_GER(nx - z - 1, nx - z - 1, -1.0, &sub11[(z+1)+z*ld], 1, &sub11[z+(z+1)*ld], ld, &sub11[(z+1) + (z+1)*ld],ld); } break; #ifdef STARPU_USE_CUDA case 1: handle = starpu_cublas_get_local_handle(); stream = starpu_cuda_get_local_stream(); for (z = 0; z < nx; z++) { TYPE pivot; TYPE inv_pivot; cudaMemcpyAsync(&pivot, &sub11[z+z*ld], sizeof(TYPE), cudaMemcpyDeviceToHost, stream); cudaStreamSynchronize(stream); STARPU_ASSERT(!ISZERO(pivot)); inv_pivot = 1.0/pivot; status = CUBLAS_SCAL(handle, nx - z - 1, (CUBLAS_TYPE*)&inv_pivot, (CUBLAS_TYPE*)&sub11[z+(z+1)*ld], ld); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); status = CUBLAS_GER(handle, nx - z - 1, nx - z - 1, (CUBLAS_TYPE*)&m1, (CUBLAS_TYPE*)&sub11[(z+1)+z*ld], 1, (CUBLAS_TYPE*)&sub11[z+(z+1)*ld], ld, (CUBLAS_TYPE*)&sub11[(z+1) + (z+1)*ld],ld); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); } cudaStreamSynchronize(stream); break; #endif default: STARPU_ABORT(); break; } } void STARPU_LU(cpu_u11)(void *descr[], void *_args) { STARPU_LU(common_u11)(descr, 0, _args); } #ifdef STARPU_USE_CUDA void STARPU_LU(cublas_u11)(void *descr[], void *_args) { STARPU_LU(common_u11)(descr, 1, _args); } #endif /* STARPU_USE_CUDA */ static struct starpu_perfmodel STARPU_LU(model_11) = { .type = STARPU_HISTORY_BASED, #ifdef STARPU_ATLAS .symbol = STARPU_LU_STR(lu_model_11_atlas) #elif defined(STARPU_GOTO) .symbol = STARPU_LU_STR(lu_model_11_goto) #else .symbol = STARPU_LU_STR(lu_model_11) #endif }; struct starpu_codelet cl11 = { .cpu_funcs = {STARPU_LU(cpu_u11)}, .cpu_funcs_name = {STRINGIFY(STARPU_LU(cpu_u11))}, #ifdef STARPU_USE_CUDA .cuda_funcs = {STARPU_LU(cublas_u11)}, CAN_EXECUTE #elif defined(STARPU_SIMGRID) .cuda_funcs = {(void*)1}, #endif .nbuffers = 1, .modes = {STARPU_RW}, .model = &STARPU_LU(model_11) }; /* * U11 with pivoting */ static inline void STARPU_LU(common_u11_pivot)(void *descr[], int s, void *_args) { TYPE *sub11; sub11 = (TYPE *)STARPU_MATRIX_GET_PTR(descr[0]); unsigned long nx = STARPU_MATRIX_GET_NX(descr[0]); unsigned long ld = STARPU_MATRIX_GET_LD(descr[0]); unsigned long z; struct piv_s *piv = _args; unsigned *ipiv = piv->piv; unsigned first = piv->first; #ifdef STARPU_USE_CUDA cublasStatus status; cublasHandle_t handle; cudaStream_t stream; #endif switch (s) { case 0: for (z = 0; z < nx; z++) { TYPE pivot; pivot = sub11[z+z*ld]; if (fabs((double)(pivot)) < PIVOT_THRESHHOLD) { /* find the pivot */ int piv_ind = CPU_IAMAX(nx - z, &sub11[z*(ld+1)], ld); ipiv[z + first] = piv_ind + z + first; /* swap if needed */ if (piv_ind != 0) { CPU_SWAP(nx, &sub11[z*ld], 1, &sub11[(z+piv_ind)*ld], 1); } pivot = sub11[z+z*ld]; } STARPU_ASSERT(!ISZERO(pivot)); CPU_SCAL(nx - z - 1, (1.0/pivot), &sub11[z+(z+1)*ld], ld); CPU_GER(nx - z - 1, nx - z - 1, -1.0, &sub11[(z+1)+z*ld], 1, &sub11[z+(z+1)*ld], ld, &sub11[(z+1) + (z+1)*ld],ld); } break; #ifdef STARPU_USE_CUDA case 1: handle = starpu_cublas_get_local_handle(); stream = starpu_cuda_get_local_stream(); for (z = 0; z < nx; z++) { TYPE pivot; TYPE inv_pivot; cudaMemcpyAsync(&pivot, &sub11[z+z*ld], sizeof(TYPE), cudaMemcpyDeviceToHost, stream); cudaStreamSynchronize(stream); if (fabs((double)(pivot)) < PIVOT_THRESHHOLD) { /* find the pivot */ int piv_ind; status = CUBLAS_IAMAX(handle, nx - z, (CUBLAS_TYPE*)&sub11[z*(ld+1)], ld, &piv_ind); piv_ind -= 1; if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); ipiv[z + first] = piv_ind + z + first; /* swap if needed */ if (piv_ind != 0) { status = CUBLAS_SWAP(handle, nx, (CUBLAS_TYPE*)&sub11[z*ld], 1, (CUBLAS_TYPE*)&sub11[(z+piv_ind)*ld], 1); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); } cudaMemcpyAsync(&pivot, &sub11[z+z*ld], sizeof(TYPE), cudaMemcpyDeviceToHost, stream); cudaStreamSynchronize(stream); } STARPU_ASSERT(!ISZERO(pivot)); inv_pivot = 1.0/pivot; status = CUBLAS_SCAL(handle, nx - z - 1, (CUBLAS_TYPE*)&inv_pivot, (CUBLAS_TYPE*)&sub11[z+(z+1)*ld], ld); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); status = CUBLAS_GER(handle, nx - z - 1, nx - z - 1, (CUBLAS_TYPE*)&m1, (CUBLAS_TYPE*)&sub11[(z+1)+z*ld], 1, (CUBLAS_TYPE*)&sub11[z+(z+1)*ld], ld, (CUBLAS_TYPE*)&sub11[(z+1) + (z+1)*ld],ld); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); } cudaStreamSynchronize(stream); break; #endif default: STARPU_ABORT(); break; } } void STARPU_LU(cpu_u11_pivot)(void *descr[], void *_args) { STARPU_LU(common_u11_pivot)(descr, 0, _args); } #ifdef STARPU_USE_CUDA void STARPU_LU(cublas_u11_pivot)(void *descr[], void *_args) { STARPU_LU(common_u11_pivot)(descr, 1, _args); } #endif /* STARPU_USE_CUDA */ static struct starpu_perfmodel STARPU_LU(model_11_pivot) = { .type = STARPU_HISTORY_BASED, #ifdef STARPU_ATLAS .symbol = STARPU_LU_STR(lu_model_11_pivot_atlas) #elif defined(STARPU_GOTO) .symbol = STARPU_LU_STR(lu_model_11_pivot_goto) #else .symbol = STARPU_LU_STR(lu_model_11_pivot) #endif }; struct starpu_codelet cl11_pivot = { .cpu_funcs = {STARPU_LU(cpu_u11_pivot)}, .cpu_funcs_name = {STRINGIFY(STARPU_LU(cpu_u11_pivot))}, #ifdef STARPU_USE_CUDA .cuda_funcs = {STARPU_LU(cublas_u11_pivot)}, CAN_EXECUTE #elif defined(STARPU_SIMGRID) .cuda_funcs = {(void*)1}, #endif .nbuffers = 1, .modes = {STARPU_RW}, .model = &STARPU_LU(model_11_pivot) }; /* * Pivoting */ static inline void STARPU_LU(common_pivot)(void *descr[], int s, void *_args) { TYPE *matrix; matrix = (TYPE *)STARPU_MATRIX_GET_PTR(descr[0]); unsigned long nx = STARPU_MATRIX_GET_NX(descr[0]); unsigned long ld = STARPU_MATRIX_GET_LD(descr[0]); unsigned row; struct piv_s *piv = _args; unsigned *ipiv = piv->piv; unsigned first = piv->first; #ifdef STARPU_USE_CUDA cublasStatus status; cublasHandle_t handle; #endif switch (s) { case 0: for (row = 0; row < nx; row++) { unsigned rowpiv = ipiv[row+first] - first; if (rowpiv != row) { CPU_SWAP(nx, &matrix[row*ld], 1, &matrix[rowpiv*ld], 1); } } break; #ifdef STARPU_USE_CUDA case 1: handle = starpu_cublas_get_local_handle(); for (row = 0; row < nx; row++) { unsigned rowpiv = ipiv[row+first] - first; if (rowpiv != row) { status = CUBLAS_SWAP(handle, nx, (CUBLAS_TYPE*)&matrix[row*ld], 1, (CUBLAS_TYPE*)&matrix[rowpiv*ld], 1); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); } } break; #endif default: STARPU_ABORT(); break; } } void STARPU_LU(cpu_pivot)(void *descr[], void *_args) { STARPU_LU(common_pivot)(descr, 0, _args); } #ifdef STARPU_USE_CUDA void STARPU_LU(cublas_pivot)(void *descr[], void *_args) { STARPU_LU(common_pivot)(descr, 1, _args); } #endif /* STARPU_USE_CUDA */ static struct starpu_perfmodel STARPU_LU(model_pivot) = { .type = STARPU_HISTORY_BASED, #ifdef STARPU_ATLAS .symbol = STARPU_LU_STR(lu_model_pivot_atlas) #elif defined(STARPU_GOTO) .symbol = STARPU_LU_STR(lu_model_pivot_goto) #else .symbol = STARPU_LU_STR(lu_model_pivot) #endif }; struct starpu_codelet cl_pivot = { .cpu_funcs = {STARPU_LU(cpu_pivot)}, .cpu_funcs_name = {STRINGIFY(STARPU_LU(cpu_pivot))}, #ifdef STARPU_USE_CUDA .cuda_funcs = {STARPU_LU(cublas_pivot)}, CAN_EXECUTE #elif defined(STARPU_SIMGRID) .cuda_funcs = {(void*)1}, #endif .cuda_flags = {STARPU_CUDA_ASYNC}, .nbuffers = 1, .modes = {STARPU_RW}, .model = &STARPU_LU(model_pivot) }; starpu-1.2.3+dfsg/examples/lu/xlu_kernels.h000066400000000000000000000032701320135501600207120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __XLU_KERNELS_H__ #define __XLU_KERNELS_H__ #include void STARPU_LU(cpu_pivot)(void *descr[], void *_args); void STARPU_LU(cpu_u11_pivot)(void *descr[], void *_args); void STARPU_LU(cpu_u11)(void *descr[], void *_args); void STARPU_LU(cpu_u12)(void *descr[], void *_args); void STARPU_LU(cpu_u21)(void *descr[], void *_args); void STARPU_LU(cpu_u22)(void *descr[], void *_args); #ifdef STARPU_USE_CUDA void STARPU_LU(cublas_pivot)(void *descr[], void *_args); void STARPU_LU(cublas_u11_pivot)(void *descr[], void *_args); void STARPU_LU(cublas_u11)(void *descr[], void *_args); void STARPU_LU(cublas_u12)(void *descr[], void *_args); void STARPU_LU(cublas_u21)(void *descr[], void *_args); void STARPU_LU(cublas_u22)(void *descr[], void *_args); #endif extern struct starpu_codelet cl11; extern struct starpu_codelet cl11_pivot; extern struct starpu_codelet cl12; extern struct starpu_codelet cl21; extern struct starpu_codelet cl22; extern struct starpu_codelet cl_pivot; #endif /* __XLU_KERNELS_H__ */ starpu-1.2.3+dfsg/examples/lu/xlu_pivot.c000066400000000000000000000300221320135501600203760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012, 2014-2015, 2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* LU Kernels with partial pivoting */ #include "xlu.h" #include "xlu_kernels.h" static unsigned no_prio = 0; /* * Construct the DAG */ static struct starpu_task *create_task(starpu_tag_t id) { struct starpu_task *task = starpu_task_create(); task->cl_arg = NULL; task->use_tag = 1; task->tag_id = id; return task; } static int create_task_pivot(starpu_data_handle_t *dataAp, unsigned nblocks, struct piv_s *piv_description, unsigned k, unsigned i, starpu_data_handle_t (* get_block)(starpu_data_handle_t *, unsigned, unsigned, unsigned)) { int ret; struct starpu_task *task = create_task(PIVOT(k, i)); task->cl = &cl_pivot; /* which sub-data is manipulated ? */ task->handles[0] = get_block(dataAp, nblocks, k, i); task->cl_arg = &piv_description[k]; /* this is an important task */ if (!no_prio && (i == k+1)) task->priority = STARPU_MAX_PRIO; /* enforce dependencies ... */ if (k == 0) { starpu_tag_declare_deps(PIVOT(k, i), 1, TAG11(k)); } else { if (i > k) { starpu_tag_declare_deps(PIVOT(k, i), 2, TAG11(k), TAG22(k-1, i, k)); } else { starpu_tag_t *tags = malloc((nblocks - k)*sizeof(starpu_tag_t)); tags[0] = TAG11(k); unsigned ind, ind2; for (ind = k + 1, ind2 = 0; ind < nblocks; ind++, ind2++) { tags[1 + ind2] = TAG22(k-1, ind, k); } /* perhaps we could do better ... :/ */ starpu_tag_declare_deps_array(PIVOT(k, i), (nblocks-k), tags); free(tags); } } ret = starpu_task_submit(task); if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); return ret; } static struct starpu_task *create_task_11_pivot(starpu_data_handle_t *dataAp, unsigned nblocks, unsigned k, struct piv_s *piv_description, starpu_data_handle_t (* get_block)(starpu_data_handle_t *, unsigned, unsigned, unsigned)) { struct starpu_task *task = create_task(TAG11(k)); task->cl = &cl11_pivot; task->cl_arg = &piv_description[k]; /* which sub-data is manipulated ? */ task->handles[0] = get_block(dataAp, nblocks, k, k); /* this is an important task */ if (!no_prio) task->priority = STARPU_MAX_PRIO; /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG11(k), 1, TAG22(k-1, k, k)); } return task; } static int create_task_12(starpu_data_handle_t *dataAp, unsigned nblocks, unsigned k, unsigned j, starpu_data_handle_t (* get_block)(starpu_data_handle_t *, unsigned, unsigned, unsigned)) { int ret; /* printf("task 12 k,i = %d,%d TAG = %llx\n", k,i, TAG12(k,i)); */ struct starpu_task *task = create_task(TAG12(k, j)); task->cl = &cl12; task->cl_arg = (void *)(task->tag_id); /* which sub-data is manipulated ? */ task->handles[0] = get_block(dataAp, nblocks, k, k); task->handles[1] = get_block(dataAp, nblocks, j, k); if (!no_prio && (j == k+1)) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ #if 0 starpu_tag_declare_deps(TAG12(k, i), 1, PIVOT(k, i)); #endif if (k > 0) { starpu_tag_declare_deps(TAG12(k, j), 2, TAG11(k), TAG22(k-1, k, j)); } else { starpu_tag_declare_deps(TAG12(k, j), 1, TAG11(k)); } ret = starpu_task_submit(task); if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); return ret; } static int create_task_21(starpu_data_handle_t *dataAp, unsigned nblocks, unsigned k, unsigned i, starpu_data_handle_t (* get_block)(starpu_data_handle_t *, unsigned, unsigned, unsigned)) { int ret; struct starpu_task *task = create_task(TAG21(k, i)); task->cl = &cl21; /* which sub-data is manipulated ? */ task->handles[0] = get_block(dataAp, nblocks, k, k); task->handles[1] = get_block(dataAp, nblocks, k, i); if (!no_prio && (i == k+1)) { task->priority = STARPU_MAX_PRIO; } task->cl_arg = (void *)(task->tag_id); /* enforce dependencies ... */ starpu_tag_declare_deps(TAG21(k, i), 1, PIVOT(k, i)); ret = starpu_task_submit(task); if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); return ret; } static int create_task_22(starpu_data_handle_t *dataAp, unsigned nblocks, unsigned k, unsigned i, unsigned j, starpu_data_handle_t (* get_block)(starpu_data_handle_t *, unsigned, unsigned, unsigned)) { int ret; /* printf("task 22 k,i,j = %d,%d,%d TAG = %llx\n", k,i,j, TAG22(k,i,j)); */ struct starpu_task *task = create_task(TAG22(k, i, j)); task->cl = &cl22; task->cl_arg = (void *)(task->tag_id); /* which sub-data is manipulated ? */ task->handles[0] = get_block(dataAp, nblocks, k, i); /* produced by TAG21(k, i) */ task->handles[1] = get_block(dataAp, nblocks, j, k); /* produced by TAG12(k, j) */ task->handles[2] = get_block(dataAp, nblocks, j, i); /* produced by TAG22(k-1, i, j) */ if (!no_prio && (i == k + 1) && (j == k +1) ) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG22(k, i, j), 3, TAG22(k-1, i, j), TAG12(k, j), TAG21(k, i)); } else { starpu_tag_declare_deps(TAG22(k, i, j), 2, TAG12(k, j), TAG21(k, i)); } ret = starpu_task_submit(task); if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); return ret; } /* * code to bootstrap the factorization */ static int dw_codelet_facto_pivot(starpu_data_handle_t *dataAp, struct piv_s *piv_description, unsigned nblocks, starpu_data_handle_t (* get_block)(starpu_data_handle_t *, unsigned, unsigned, unsigned), double *timing) { int ret; double start; double end; struct starpu_task *entry_task = NULL; /* create all the DAG nodes */ unsigned i,j,k; if (bound) starpu_bound_start(bounddeps, boundprio); for (k = 0; k < nblocks; k++) { starpu_iteration_push(k); struct starpu_task *task = create_task_11_pivot(dataAp, nblocks, k, piv_description, get_block); /* we defer the launch of the first task */ if (k == 0) { entry_task = task; } else { ret = starpu_task_submit(task); if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); if (ret == -ENODEV) return ret; } for (i = 0; i < nblocks; i++) { if (i != k) { ret = create_task_pivot(dataAp, nblocks, piv_description, k, i, get_block); if (ret == -ENODEV) return ret; } } for (i = k+1; i #include #include #ifdef STARPU_HAVE_X11 #include #include int use_x11 = 1; #endif #ifdef STARPU_HAVE_HELGRIND_H #include #endif #ifndef ANNOTATE_HAPPENS_BEFORE #define ANNOTATE_HAPPENS_BEFORE(obj) ((void)0) #endif #ifndef ANNOTATE_HAPPENS_AFTER #define ANNOTATE_HAPPENS_AFTER(obj) ((void)0) #endif int demo = 0; static double demozoom = 0.05; /* NB: The X11 code is inspired from the http://locklessinc.com/articles/mandelbrot/ article */ static int nblocks = 20; static int height = 400; static int width = 640; static int maxIt = 20000; /* max number of iteration in the Mandelbrot function */ static int niter = -1; /* number of loops in case we don't use X11, -1 means infinite */ static int use_spmd = 0; static double leftX = -0.745; static double rightX = -0.74375; static double topY = .15; static double bottomY = .14875; /* * X11 window management */ #ifdef STARPU_HAVE_X11 /* X11 data */ static Display *dpy; static Window win; static XImage *bitmap; static GC gc; static KeySym Left=-1, Right, Down, Up, Alt ; static void exit_x11(void) { XDestroyImage(bitmap); XDestroyWindow(dpy, win); XCloseDisplay(dpy); } static void init_x11(int width, int height, unsigned *buffer) { /* Attempt to open the display */ dpy = XOpenDisplay(NULL); /* Failure */ if (!dpy) exit(0); unsigned long white = WhitePixel(dpy,DefaultScreen(dpy)); unsigned long black = BlackPixel(dpy,DefaultScreen(dpy)); win = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 0, width, height, 0, black, white); /* We want to be notified when the window appears */ XSelectInput(dpy, win, StructureNotifyMask); /* Make it appear */ XMapWindow(dpy, win); XTextProperty tp; char name[128] = "Mandelbrot - StarPU"; char *n = name; Status st = XStringListToTextProperty(&n, 1, &tp); if (st) XSetWMName(dpy, win, &tp); /* Wait for the MapNotify event */ XFlush(dpy); int depth = DefaultDepth(dpy, DefaultScreen(dpy)); Visual *visual = DefaultVisual(dpy, DefaultScreen(dpy)); /* Make bitmap */ bitmap = XCreateImage(dpy, visual, depth, ZPixmap, 0, (char *)buffer, width, height, 32, 0); /* Init GC */ gc = XCreateGC(dpy, win, 0, NULL); XSetForeground(dpy, gc, black); XSelectInput(dpy, win, ExposureMask | KeyPressMask | StructureNotifyMask); Atom wmDeleteMessage; wmDeleteMessage = XInternAtom(dpy, "WM_DELETE_WINDOW", False); XSetWMProtocols(dpy, win, &wmDeleteMessage, 1); Left = XStringToKeysym ("Left"); Right = XStringToKeysym ("Right"); Up = XStringToKeysym ("Up"); Down = XStringToKeysym ("Down"); Alt = XStringToKeysym ("Alt"); } static int handle_events(void) { XEvent event; XNextEvent(dpy, &event); if (event.type == KeyPress) { KeySym key; char text[255]; XLookupString(&event.xkey,text,255,&key,0); if (key == Left) { double widthX = rightX - leftX; leftX -= 0.25*widthX; rightX -= 0.25*widthX; } else if (key == Right) { double widthX = rightX - leftX; leftX += 0.25*widthX; rightX += 0.25*widthX; } else if (key == Up) { double heightY = topY - bottomY; topY += 0.25*heightY; bottomY += 0.25*heightY; } else if (key == Down) { double heightY = topY - bottomY; topY -= 0.25*heightY; bottomY -= 0.25*heightY; } else { double widthX = rightX - leftX; double heightY = topY - bottomY; if (text[0] == '-') { /* Zoom out */ leftX -= 0.125*widthX; rightX += 0.125*widthX; topY += 0.125*heightY; bottomY -= 0.125*heightY; } else if (text[0] == '+') { /* Zoom in */ leftX += 0.125*widthX; rightX -= 0.125*widthX; topY -= 0.125*heightY; bottomY += 0.125*heightY; } } if (text[0]=='q') { return -1; } } if (event.type==ButtonPress) { /* tell where the mouse Button was Pressed */ printf("You pressed a button at (%i,%i)\n", event.xbutton.x,event.xbutton.y); } return 0; } #endif /* * OpenCL kernel */ #ifdef STARPU_USE_OPENCL char *mandelbrot_opencl_src = "\ #pragma OPENCL EXTENSION cl_khr_fp64 : enable\n\ #define MIN(a,b) (((a)<(b))? (a) : (b)) \n\ __kernel void mandelbrot_kernel(__global unsigned* a, \n\ double leftX, double topY, \n\ double stepX, double stepY, \n\ int maxIt, int iby, int block_size, int width) \n\ { \n\ size_t id_x = get_global_id(0); \n\ size_t id_y = get_global_id(1); \n\ if ((id_x < width) && (id_y < block_size)) \n\ { \n\ double xc = leftX + id_x * stepX; \n\ double yc = topY - (id_y + iby*block_size) * stepY; \n\ int it; \n\ double x,y; \n\ x = y = (double)0.0; \n\ for (it=0;it 4.0) break; \n\ double twoxy = (double)2.0*x*y; \n\ x = x2 - y2 + xc; \n\ y = twoxy + yc; \n\ } \n\ unsigned int v = MIN((1024*((float)(it)/(2000))), 256); \n\ a[id_x + width * id_y] = (v<<16|(255-v)<<8); \n\ } \n\ }"; static struct starpu_opencl_program opencl_programs; static void compute_block_opencl(void *descr[], void *cl_arg) { int iby, block_size; double stepX, stepY; int *pcnt; /* unused for CUDA tasks */ starpu_codelet_unpack_args(cl_arg, &iby, &block_size, &stepX, &stepY, &pcnt); cl_mem data = (cl_mem)STARPU_VECTOR_GET_DEV_HANDLE(descr[0]); cl_kernel kernel; cl_command_queue queue; cl_int err; int id = starpu_worker_get_id_check(); int devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_programs, "mandelbrot_kernel", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); clSetKernelArg(kernel, 0, sizeof(data), &data); clSetKernelArg(kernel, 1, sizeof(leftX), &leftX); clSetKernelArg(kernel, 2, sizeof(topY), &topY); clSetKernelArg(kernel, 3, sizeof(stepX), &stepX); clSetKernelArg(kernel, 4, sizeof(stepY), &stepY); clSetKernelArg(kernel, 5, sizeof(maxIt), &maxIt); clSetKernelArg(kernel, 6, sizeof(iby), &iby); clSetKernelArg(kernel, 7, sizeof(block_size), &block_size); clSetKernelArg(kernel, 8, sizeof(width), &width); unsigned dim = 16; size_t local[2] = {dim, 1}; size_t global[2] = {width, block_size}; err = clEnqueueNDRangeKernel(queue, kernel, 2, NULL, global, local, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); starpu_opencl_release_kernel(kernel); } #endif /* * CPU kernel */ static void compute_block(void *descr[], void *cl_arg) { int iby, block_size; double stepX, stepY; int *pcnt; /* unused for sequential tasks */ starpu_codelet_unpack_args(cl_arg, &iby, &block_size, &stepX, &stepY, &pcnt); unsigned *data = (unsigned *)STARPU_VECTOR_GET_PTR(descr[0]); int local_iy; for (local_iy = 0; local_iy < block_size; local_iy++) { int ix, iy; iy = iby*block_size + local_iy; for (ix = 0; ix < width; ix++) { double cx = leftX + ix * stepX; double cy = topY - iy * stepY; /* Z = X+I*Y */ double x = 0; double y = 0; int it; for (it = 0; it < maxIt; it++) { double x2 = x*x; double y2 = y*y; /* Stop iterations when |Z| > 2 */ if (x2 + y2 > 4.0) break; double twoxy = 2.0*x*y; /* Z = Z^2 + C */ x = x2 - y2 + cx; y = twoxy + cy; } unsigned int v = STARPU_MIN((1024*((float)(it)/(2000))), 256); data[ix + local_iy*width] = (v<<16|(255-v)<<8); } } } static void compute_block_spmd(void *descr[], void *cl_arg) { int iby, block_size; double stepX, stepY; int *pcnt; starpu_codelet_unpack_args(cl_arg, &iby, &block_size, &stepX, &stepY, &pcnt); unsigned *data = (unsigned *)STARPU_VECTOR_GET_PTR(descr[0]); while (1) { int ix, iy; /* global coordinates */ int local_iy; /* current line */ local_iy = STARPU_ATOMIC_ADD((unsigned int *)pcnt, 1) - 1; ANNOTATE_HAPPENS_BEFORE(pcnt); if (local_iy >= block_size) { ANNOTATE_HAPPENS_AFTER(pcnt); break; } iy = iby*block_size + local_iy; for (ix = 0; ix < width; ix++) { double cx = leftX + ix * stepX; double cy = topY - iy * stepY; /* Z = X+I*Y */ double x = 0; double y = 0; int it; for (it = 0; it < maxIt; it++) { double x2 = x*x; double y2 = y*y; /* Stop iterations when |Z| > 2 */ if (x2 + y2 > 4.0) break; double twoxy = 2.0*x*y; /* Z = Z^2 + C */ x = x2 - y2 + cx; y = twoxy + cy; } unsigned int v = STARPU_MIN((1024*((float)(it)/(2000))), 256); data[ix + local_iy*width] = (v<<16|(255-v)<<8); } } } static struct starpu_codelet spmd_mandelbrot_cl = { .type = STARPU_SPMD, .max_parallelism = INT_MAX, .cpu_funcs = {compute_block_spmd}, #ifdef STARPU_USE_OPENCL .opencl_funcs = {compute_block_opencl}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .nbuffers = 1 }; static struct starpu_codelet mandelbrot_cl = { .type = STARPU_SEQ, .cpu_funcs = {compute_block}, #ifdef STARPU_USE_OPENCL .opencl_funcs = {compute_block_opencl}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .nbuffers = 1 }; static void parse_args(int argc, char **argv) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-h") == 0) { fprintf(stderr, "Usage: %s [-h] [ -width 800] [-height 600] [-nblocks 16] [-no-x11] [-pos leftx:rightx:bottomy:topy] [-niter 1000] [-spmd] [-demo] [-demozoom 0.2]\n", argv[0]); exit(-1); } if (strcmp(argv[i], "-width") == 0) { char *argptr; width = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-height") == 0) { char *argptr; height = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-nblocks") == 0) { char *argptr; nblocks = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-niter") == 0) { char *argptr; niter = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-pos") == 0) { int ret = sscanf(argv[++i], "%lf:%lf:%lf:%lf", &leftX, &rightX, &bottomY, &topY); assert(ret == 4); } if (strcmp(argv[i], "-demo") == 0) { demo = 1; leftX = -50.22749575062760; rightX = 48.73874621262927; topY = -49.35016705749115; bottomY = 49.64891691946615; } if (strcmp(argv[i], "-demozoom") == 0) { char *argptr; demozoom = strtof(argv[++i], &argptr); } if (strcmp(argv[i], "-no-x11") == 0) { #ifdef STARPU_HAVE_X11 use_x11 = 0; #endif } if (strcmp(argv[i], "-spmd") == 0) { use_spmd = 1; } } } int main(int argc, char **argv) { int ret; parse_args(argc, argv); /* We don't use CUDA in that example */ struct starpu_conf conf; starpu_conf_init(&conf); conf.ncuda = 0; if (use_spmd) conf.sched_policy_name = "peager"; ret = starpu_init(&conf); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); unsigned *buffer; starpu_malloc((void **)&buffer, height*width*sizeof(unsigned)); #ifdef STARPU_HAVE_X11 if (use_x11) init_x11(width, height, buffer); #endif int block_size = height/nblocks; STARPU_ASSERT((height % nblocks) == 0); #ifdef STARPU_USE_OPENCL starpu_opencl_load_opencl_from_string(mandelbrot_opencl_src, &opencl_programs, NULL); #endif starpu_data_handle_t block_handles[nblocks]; int iby; for (iby = 0; iby < nblocks; iby++) { unsigned *data = &buffer[iby*block_size*width]; starpu_vector_data_register(&block_handles[iby], STARPU_MAIN_RAM, (uintptr_t)data, block_size*width, sizeof(unsigned)); } unsigned iter = 0; double start, end; start = starpu_timing_now(); while (niter-- != 0) { double stepX = (rightX - leftX)/width; double stepY = (topY - bottomY)/height; /* In case we have a SPMD task, each worker will grab tasks in * a greedy and select which piece of image to compute by * incrementing a counter shared by all the workers within the * parallel task. */ int per_block_cnt[nblocks]; starpu_iteration_push(niter); for (iby = 0; iby < nblocks; iby++) { per_block_cnt[iby] = 0; int *pcnt = &per_block_cnt[iby]; ret = starpu_task_insert(use_spmd?&spmd_mandelbrot_cl:&mandelbrot_cl, STARPU_VALUE, &iby, sizeof(iby), STARPU_VALUE, &block_size, sizeof(block_size), STARPU_VALUE, &stepX, sizeof(stepX), STARPU_VALUE, &stepY, sizeof(stepY), STARPU_W, block_handles[iby], STARPU_VALUE, &pcnt, sizeof(int *), STARPU_TAG_ONLY, ((starpu_tag_t)niter)*nblocks + iby, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); } for (iby = 0; iby < nblocks; iby++) { #ifdef STARPU_HAVE_X11 if (use_x11) { starpu_data_acquire(block_handles[iby], STARPU_R); XPutImage(dpy, win, gc, bitmap, 0, iby*block_size, 0, iby*block_size, width, block_size); starpu_data_release(block_handles[iby]); } #endif } starpu_iteration_pop(); if (demo) { /* Zoom in */ double zoom_factor = demozoom; double widthX = rightX - leftX; double heightY = topY - bottomY; iter++; /* If the window is too small, we reset the demo and display some statistics */ if ((fabs(widthX) < 1e-12) || (fabs(heightY) < 1e-12)) { leftX = -50.22749575062760; rightX = 48.73874621262927; topY = -49.35016705749115; bottomY = 49.64891691946615; end = starpu_timing_now(); double timing = end - start; fprintf(stderr, "Time to generate %u frames : %f s\n", iter, timing/1000000.0); fprintf(stderr, "Average FPS: %f\n", ((double)iter*1e+6)/timing); /* Reset counters */ iter = 0; start = starpu_timing_now(); } else { leftX += (zoom_factor/2)*widthX; rightX -= (zoom_factor/2)*widthX; topY -= (zoom_factor/2)*heightY; bottomY += (zoom_factor/2)*heightY; } } #ifdef STARPU_HAVE_X11 else if (use_x11 && handle_events()) break; #endif } #ifdef STARPU_HAVE_X11 if (use_x11) exit_x11(); #endif for (iby = 0; iby < nblocks; iby++) starpu_data_unregister(block_handles[iby]); /* starpu_data_free_pinned_if_possible(buffer); */ starpu_shutdown(); return 0; } starpu-1.2.3+dfsg/examples/matvecmult/000077500000000000000000000000001320135501600177455ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/matvecmult/matvecmult.c000066400000000000000000000152401320135501600222740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011-2012, 2014-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #ifdef STARPU_USE_OPENCL struct starpu_opencl_program opencl_code; void opencl_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { cl_kernel kernel; cl_command_queue queue; int id, devid, err, n; cl_mem matrix = (cl_mem)STARPU_MATRIX_GET_DEV_HANDLE(descr[0]); cl_mem vector = (cl_mem)STARPU_VECTOR_GET_DEV_HANDLE(descr[1]); cl_mem mult = (cl_mem)STARPU_VECTOR_GET_DEV_HANDLE(descr[2]); int nx = STARPU_MATRIX_GET_NX(descr[0]); int ny = STARPU_MATRIX_GET_NY(descr[0]); id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_code, "matVecMult", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); n=0; err = clSetKernelArg(kernel, n++, sizeof(matrix), &matrix); err |= clSetKernelArg(kernel, n++, sizeof(vector), &vector); err |= clSetKernelArg(kernel, n++, sizeof(nx), (void*)&nx); err |= clSetKernelArg(kernel, n++, sizeof(ny), (void*)&ny); err |= clSetKernelArg(kernel, n++, sizeof(mult), &mult); if (err) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=nx*ny; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, NULL, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } starpu_opencl_release_kernel(kernel); } #endif void fillArray(float* pfData, int iSize) { int i; const float fScale = 1.0f / (float)RAND_MAX; for (i = 0; i < iSize; ++i) { pfData[i] = fScale * rand(); } } #if 0 void printArray(float* pfData, int iSize) { int i; for (i = 0; i < iSize; ++i) { FPRINTF(stderr, "%f ", pfData[i]); } FPRINTF(stderr, "\n"); } #endif void matVecMult(const float *matrix, const float *vector, int width, int height, float *mult) { int i, j; for (i = 0; i < height; ++i) { double sum = 0; for (j = 0; j < width; ++j) { double a = matrix[i * width + j]; double b = vector[j]; sum += a * b; } mult[i] = (float)sum; } } int compareL2fe(const float* reference, const float* data, const unsigned int len, const float epsilon) { float error = 0; float ref = 0; unsigned int i; for(i = 0; i < len; ++i) { float diff = reference[i] - data[i]; error += diff * diff; ref += reference[i] * reference[i]; } float normRef = sqrtf(ref); if (fabs(ref) < 1e-7) return 1; float normError = sqrtf(error); error = normError / normRef; return error < epsilon ? 0 : 1; } static struct starpu_perfmodel starpu_matvecmult_model = { .type = STARPU_HISTORY_BASED, .symbol = "matvecmult" }; static struct starpu_codelet cl = { #ifdef STARPU_USE_OPENCL .opencl_funcs[0] = opencl_codelet, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .nbuffers = 3, .modes[0] = STARPU_R, .modes[1] = STARPU_R, .modes[2] = STARPU_RW, .model = &starpu_matvecmult_model }; int main(int argc, char **argv) { struct starpu_conf conf; starpu_conf_init(&conf); conf.ncpus = 0; conf.ncuda = 0; conf.nmic = 0; conf.nscc = 0; conf.nopencl = 1; /* int width=1100; */ /* int height=244021; */ int width=20; int height=4; float *matrix, *vector, *mult; float *correctResult; unsigned int mem_size_matrix, mem_size_vector, mem_size_mult; starpu_data_handle_t matrix_handle, vector_handle, mult_handle; int ret, submit; ret = starpu_init(&conf); if (STARPU_UNLIKELY(ret == -ENODEV)) { FPRINTF(stderr, "This application requires an OpenCL worker.\n"); return 77; } mem_size_matrix = width * height * sizeof(float); matrix = (float*)malloc(mem_size_matrix); mem_size_vector = width * sizeof(float); vector = (float*)malloc(mem_size_vector); mem_size_mult = height * sizeof(float); mult = (float*)malloc(mem_size_mult); correctResult = (float*)malloc(mem_size_mult); assert(matrix); assert(vector); assert(mult); assert(correctResult); fillArray(matrix, width*height); fillArray(vector, width); fillArray(mult, height); matVecMult(matrix, vector, width, height, correctResult); starpu_matrix_data_register(&matrix_handle, STARPU_MAIN_RAM, (uintptr_t)matrix, width, width, height, sizeof(float)); starpu_vector_data_register(&vector_handle, STARPU_MAIN_RAM, (uintptr_t)vector, width, sizeof(float)); starpu_vector_data_register(&mult_handle, STARPU_MAIN_RAM, (uintptr_t)mult, height, sizeof(float)); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_load_opencl_from_file("examples/matvecmult/matvecmult_kernel.cl", &opencl_code, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->callback_func = NULL; task->handles[0] = matrix_handle; task->handles[1] = vector_handle; task->handles[2] = mult_handle; submit = starpu_task_submit(task); if (STARPU_UNLIKELY(submit == -ENODEV)) { FPRINTF(stderr, "No worker may execute this task. This application requires an OpenCL worker.\n"); } else { starpu_task_wait_for_all(); } starpu_data_unregister(matrix_handle); starpu_data_unregister(vector_handle); starpu_data_unregister(mult_handle); if (STARPU_LIKELY(submit != -ENODEV)) { int res = compareL2fe(correctResult, mult, height, 1e-6f); FPRINTF(stdout, "TEST %s\n\n", (res == 0) ? "PASSED" : "FAILED !!!"); } #if 0 printArray(matrix, width*height); printArray(vector, width); printArray(mult, height); #endif free(matrix); free(vector); free(mult); free(correctResult); starpu_shutdown(); return (submit == -ENODEV) ? 77 : 0; } starpu-1.2.3+dfsg/examples/matvecmult/matvecmult_kernel.cl000066400000000000000000000016301320135501600240060ustar00rootroot00000000000000/* * StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ __kernel void matVecMult(const __global float *A, const __global float *X, int n, int m, __global float *Y) { const int i = get_global_id(0); if (i < m) { float val = 0; int j; for (j = 0; j < n; j++) val += A[i*n+j] * X[j]; Y[i] = val; } } starpu-1.2.3+dfsg/examples/mult/000077500000000000000000000000001320135501600165455ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/mult/dgemm.c000066400000000000000000000013271320135501600200050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "double.h" #include "xgemm.c" starpu-1.2.3+dfsg/examples/mult/double.h000066400000000000000000000016651320135501600202000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #define TYPE double #define CUBLAS_GEMM cublasDgemm #define CPU_GEMM STARPU_DGEMM #define CPU_ASUM STARPU_DASUM #define CPU_IAMAX STARPU_IDAMAX #define STARPU_GEMM(name) starpu_dgemm_##name #define str(s) #s #define xstr(s) str(s) #define STARPU_GEMM_STR(name) xstr(STARPU_GEMM(name)) starpu-1.2.3+dfsg/examples/mult/sgemm.c000066400000000000000000000013271320135501600200240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "simple.h" #include "xgemm.c" starpu-1.2.3+dfsg/examples/mult/simple.h000066400000000000000000000016631320135501600202150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #define TYPE float #define CUBLAS_GEMM cublasSgemm #define CPU_GEMM STARPU_SGEMM #define CPU_ASUM STARPU_SASUM #define CPU_IAMAX STARPU_ISAMAX #define STARPU_GEMM(name) starpu_sgemm_##name #define str(s) #s #define xstr(s) str(s) #define STARPU_GEMM_STR(name) xstr(STARPU_GEMM(name)) starpu-1.2.3+dfsg/examples/mult/xgemm.c000066400000000000000000000254221320135501600200330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2016 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2013, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * Simple parallel GEMM implementation: partition the output matrix in the two * dimensions, and the input matrices in the corresponding dimension, and * perform the output computations in parallel. */ #ifndef TYPE #error "Do not compile xgemm.c directly, compile sgemm.c or dgemm.c" #endif #include #include #include #include #include #include #include #ifdef STARPU_USE_CUDA #include #include static const TYPE p1 = 1.0; static const TYPE m1 = -1.0; static const TYPE v0 = 0.0; #endif static unsigned niter = 10; static unsigned nslicesx = 4; static unsigned nslicesy = 4; #if defined(STARPU_QUICK_CHECK) && !defined(STARPU_SIMGRID) static unsigned xdim = 256; static unsigned ydim = 256; static unsigned zdim = 64; #else static unsigned xdim = 960*4; static unsigned ydim = 960*4; static unsigned zdim = 960*4; #endif static unsigned check = 0; static unsigned bound = 0; static TYPE *A, *B, *C; static starpu_data_handle_t A_handle, B_handle, C_handle; #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #define PRINTF(fmt, ...) do { if (!getenv("STARPU_SSILENT")) {printf(fmt, ## __VA_ARGS__); }} while(0) static void check_output(void) { /* compute C = C - AB */ CPU_GEMM("N", "N", ydim, xdim, zdim, (TYPE)-1.0f, A, ydim, B, zdim, (TYPE)1.0f, C, ydim); /* make sure C = 0 */ TYPE err; err = CPU_ASUM(xdim*ydim, C, 1); if (err < xdim*ydim*0.001) { FPRINTF(stderr, "Results are OK\n"); } else { int max; max = CPU_IAMAX(xdim*ydim, C, 1); FPRINTF(stderr, "There were errors ... err = %f\n", err); FPRINTF(stderr, "Max error : %e\n", C[max]); } } static void init_problem_data(void) { #ifndef STARPU_SIMGRID unsigned i,j; #endif starpu_malloc_flags((void **)&A, zdim*ydim*sizeof(TYPE), STARPU_MALLOC_PINNED|STARPU_MALLOC_SIMULATION_FOLDED); starpu_malloc_flags((void **)&B, xdim*zdim*sizeof(TYPE), STARPU_MALLOC_PINNED|STARPU_MALLOC_SIMULATION_FOLDED); starpu_malloc_flags((void **)&C, xdim*ydim*sizeof(TYPE), STARPU_MALLOC_PINNED|STARPU_MALLOC_SIMULATION_FOLDED); #ifndef STARPU_SIMGRID /* fill the A and B matrices */ for (j=0; j < ydim; j++) { for (i=0; i < zdim; i++) { A[j+i*ydim] = (TYPE)(starpu_drand48()); } } for (j=0; j < zdim; j++) { for (i=0; i < xdim; i++) { B[j+i*zdim] = (TYPE)(starpu_drand48()); } } for (j=0; j < ydim; j++) { for (i=0; i < xdim; i++) { C[j+i*ydim] = (TYPE)(0); } } #endif } static void partition_mult_data(void) { starpu_matrix_data_register(&A_handle, STARPU_MAIN_RAM, (uintptr_t)A, ydim, ydim, zdim, sizeof(TYPE)); starpu_matrix_data_register(&B_handle, STARPU_MAIN_RAM, (uintptr_t)B, zdim, zdim, xdim, sizeof(TYPE)); starpu_matrix_data_register(&C_handle, STARPU_MAIN_RAM, (uintptr_t)C, ydim, ydim, xdim, sizeof(TYPE)); struct starpu_data_filter vert; memset(&vert, 0, sizeof(vert)); vert.filter_func = starpu_matrix_filter_vertical_block; vert.nchildren = nslicesx; struct starpu_data_filter horiz; memset(&horiz, 0, sizeof(horiz)); horiz.filter_func = starpu_matrix_filter_block; horiz.nchildren = nslicesy; starpu_data_partition(B_handle, &vert); starpu_data_partition(A_handle, &horiz); starpu_data_map_filters(C_handle, 2, &vert, &horiz); } #ifdef STARPU_USE_CUDA static void cublas_mult(void *descr[], STARPU_ATTRIBUTE_UNUSED void *arg) { TYPE *subA = (TYPE *)STARPU_MATRIX_GET_PTR(descr[0]); TYPE *subB = (TYPE *)STARPU_MATRIX_GET_PTR(descr[1]); TYPE *subC = (TYPE *)STARPU_MATRIX_GET_PTR(descr[2]); unsigned nxC = STARPU_MATRIX_GET_NX(descr[2]); unsigned nyC = STARPU_MATRIX_GET_NY(descr[2]); unsigned nyA = STARPU_MATRIX_GET_NY(descr[0]); unsigned ldA = STARPU_MATRIX_GET_LD(descr[0]); unsigned ldB = STARPU_MATRIX_GET_LD(descr[1]); unsigned ldC = STARPU_MATRIX_GET_LD(descr[2]); cublasStatus_t status = CUBLAS_GEMM(starpu_cublas_get_local_handle(), CUBLAS_OP_N, CUBLAS_OP_N, nxC, nyC, nyA, &p1, subA, ldA, subB, ldB, &v0, subC, ldC); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); } #endif void cpu_mult(void *descr[], STARPU_ATTRIBUTE_UNUSED void *arg) { TYPE *subA = (TYPE *)STARPU_MATRIX_GET_PTR(descr[0]); TYPE *subB = (TYPE *)STARPU_MATRIX_GET_PTR(descr[1]); TYPE *subC = (TYPE *)STARPU_MATRIX_GET_PTR(descr[2]); unsigned nxC = STARPU_MATRIX_GET_NX(descr[2]); unsigned nyC = STARPU_MATRIX_GET_NY(descr[2]); unsigned nyA = STARPU_MATRIX_GET_NY(descr[0]); unsigned ldA = STARPU_MATRIX_GET_LD(descr[0]); unsigned ldB = STARPU_MATRIX_GET_LD(descr[1]); unsigned ldC = STARPU_MATRIX_GET_LD(descr[2]); int worker_size = starpu_combined_worker_get_size(); if (worker_size == 1) { /* Sequential CPU task */ CPU_GEMM("N", "N", nxC, nyC, nyA, (TYPE)1.0, subA, ldA, subB, ldB, (TYPE)0.0, subC, ldC); } else { /* Parallel CPU task */ unsigned rank = starpu_combined_worker_get_rank(); unsigned block_size = (nyC + worker_size - 1)/worker_size; unsigned new_nyC = STARPU_MIN(nyC, block_size*(rank+1)) - block_size*rank; STARPU_ASSERT(nyC == STARPU_MATRIX_GET_NY(descr[1])); TYPE *new_subB = &subB[block_size*rank]; TYPE *new_subC = &subC[block_size*rank]; CPU_GEMM("N", "N", nxC, new_nyC, nyA, (TYPE)1.0, subA, ldA, new_subB, ldB, (TYPE)0.0, new_subC, ldC); } } static struct starpu_perfmodel starpu_gemm_model = { .type = STARPU_HISTORY_BASED, .symbol = STARPU_GEMM_STR(gemm) }; static struct starpu_codelet cl = { .type = STARPU_SEQ, /* changed to STARPU_SPMD if -spmd is passed */ .max_parallelism = INT_MAX, .cpu_funcs = {cpu_mult}, .cpu_funcs_name = {"cpu_mult"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cublas_mult}, #elif defined(STARPU_SIMGRID) .cuda_funcs = {(void*)1}, #endif .cuda_flags = {STARPU_CUDA_ASYNC}, .nbuffers = 3, .modes = {STARPU_R, STARPU_R, STARPU_RW}, .model = &starpu_gemm_model }; static void parse_args(int argc, char **argv) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-nblocks") == 0) { char *argptr; nslicesx = strtol(argv[++i], &argptr, 10); nslicesy = nslicesx; } else if (strcmp(argv[i], "-nblocksx") == 0) { char *argptr; nslicesx = strtol(argv[++i], &argptr, 10); } else if (strcmp(argv[i], "-nblocksy") == 0) { char *argptr; nslicesy = strtol(argv[++i], &argptr, 10); } else if (strcmp(argv[i], "-x") == 0) { char *argptr; xdim = strtol(argv[++i], &argptr, 10); } else if (strcmp(argv[i], "-y") == 0) { char *argptr; ydim = strtol(argv[++i], &argptr, 10); } else if (strcmp(argv[i], "-z") == 0) { char *argptr; zdim = strtol(argv[++i], &argptr, 10); } else if (strcmp(argv[i], "-size") == 0) { char *argptr; xdim = ydim = zdim = strtol(argv[++i], &argptr, 10); } else if (strcmp(argv[i], "-iter") == 0) { char *argptr; niter = strtol(argv[++i], &argptr, 10); } else if (strcmp(argv[i], "-bound") == 0) { bound = 1; } else if (strcmp(argv[i], "-check") == 0) { check = 1; } else if (strcmp(argv[i], "-spmd") == 0) { cl.type = STARPU_SPMD; } else if (strcmp(argv[i], "-help") == 0 || strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "-h") == 0) { fprintf(stderr,"Usage: %s [-nblocks n] [-nblocksx x] [-nblocksy y] [-x x] [-y y] [-z z] [-size size] [-iter iter] [-bound] [-check] [-spmd]\n", argv[0]); fprintf(stderr,"Currently selected: %ux%u * %ux%u and %ux%u blocks, %u iterations\n", zdim, ydim, xdim, zdim, nslicesx, nslicesy, niter); exit(EXIT_SUCCESS); } else { fprintf(stderr,"Unrecognized option %s", argv[i]); exit(EXIT_FAILURE); } } } int main(int argc, char **argv) { double start, end; int ret; parse_args(argc, argv); #ifdef STARPU_QUICK_CHECK niter /= 10; #endif starpu_fxt_autostart_profiling(0); ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_cublas_init(); init_problem_data(); partition_mult_data(); if (bound) starpu_bound_start(0, 0); starpu_fxt_start_profiling(); start = starpu_timing_now(); unsigned x, y, iter; for (iter = 0; iter < niter; iter++) { for (x = 0; x < nslicesx; x++) for (y = 0; y < nslicesy; y++) { struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->handles[0] = starpu_data_get_sub_data(A_handle, 1, y); task->handles[1] = starpu_data_get_sub_data(B_handle, 1, x); task->handles[2] = starpu_data_get_sub_data(C_handle, 2, x, y); task->flops = 2ULL * (xdim/nslicesx) * (ydim/nslicesy) * zdim; ret = starpu_task_submit(task); if (ret == -ENODEV) { ret = 77; goto enodev; } STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_data_wont_use(starpu_data_get_sub_data(C_handle, 2, x, y)); } starpu_task_wait_for_all(); } end = starpu_timing_now(); starpu_fxt_stop_profiling(); if (bound) starpu_bound_stop(); double timing = end - start; double min, min_int; double flops = 2.0*((unsigned long long)niter)*((unsigned long long)xdim) *((unsigned long long)ydim)*((unsigned long long)zdim); if (bound) starpu_bound_compute(&min, &min_int, 1); PRINTF("# x\ty\tz\tms\tGFlops"); if (bound) PRINTF("\tTms\tTGFlops\tTims\tTiGFlops"); PRINTF("\n"); PRINTF("%u\t%u\t%u\t%.0f\t%.1f", xdim, ydim, zdim, timing/niter/1000.0, flops/timing/1000.0); if (bound) PRINTF("\t%.0f\t%.1f\t%.0f\t%.1f", min, flops/min/1000000.0, min_int, flops/min_int/1000000.0); PRINTF("\n"); enodev: starpu_data_unpartition(C_handle, STARPU_MAIN_RAM); starpu_data_unpartition(B_handle, STARPU_MAIN_RAM); starpu_data_unpartition(A_handle, STARPU_MAIN_RAM); starpu_data_unregister(A_handle); starpu_data_unregister(B_handle); starpu_data_unregister(C_handle); if (check) check_output(); starpu_free_flags(A, zdim*ydim*sizeof(TYPE), STARPU_MALLOC_PINNED|STARPU_MALLOC_SIMULATION_FOLDED); starpu_free_flags(B, xdim*zdim*sizeof(TYPE), STARPU_MALLOC_PINNED|STARPU_MALLOC_SIMULATION_FOLDED); starpu_free_flags(C, xdim*ydim*sizeof(TYPE), STARPU_MALLOC_PINNED|STARPU_MALLOC_SIMULATION_FOLDED); starpu_cublas_shutdown(); starpu_shutdown(); return ret; } starpu-1.2.3+dfsg/examples/native_fortran/000077500000000000000000000000001320135501600206055ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/native_fortran/nf_codelets.f90000066400000000000000000000073441320135501600234220ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2016 Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ! ! See the GNU Lesser General Public License in COPYING.LGPL for more details. module nf_codelets contains ! 'cl_vec' codelet routine ! ! Note: codelet routines must: ! . be declared recursive (~ 'reentrant routine') ! . be declared with the 'bind(C)' attribute for proper C interfacing recursive subroutine cl_cpu_func_vec (buffers, cl_args) bind(C) use iso_c_binding ! C interfacing module use fstarpu_mod ! StarPU interfacing module implicit none type(c_ptr), value, intent(in) :: buffers, cl_args ! cl_args is unused real(8), dimension(:), pointer :: va integer, dimension(:), pointer :: vb integer :: nx_va,nx_vb,i write(*,*) "task -->" ! get 'va' number of elements nx_va = fstarpu_vector_get_nx(buffers, 0) write(*,*) "nx_va" write(*,*) nx_va ! get 'vb' number of elements nx_vb = fstarpu_vector_get_nx(buffers, 1) write(*,*) "nx_vb" write(*,*) nx_vb ! get 'va' converted Fortran pointer call c_f_pointer(fstarpu_vector_get_ptr(buffers, 0), va, shape=[nx_va]) write(*,*) "va" do i=1,nx_va write(*,*) i,va(i) end do ! get 'vb' converted Fortran pointer call c_f_pointer(fstarpu_vector_get_ptr(buffers, 1), vb, shape=[nx_vb]) write(*,*) "vb" do i=1,nx_vb write(*,*) i,vb(i) end do write(*,*) "task <--" end subroutine cl_cpu_func_vec ! 'cl_mat' codelet routine recursive subroutine cl_cpu_func_mat (buffers, cl_args) bind(C) use iso_c_binding ! C interfacing module use fstarpu_mod ! StarPU interfacing module implicit none type(c_ptr), value, intent(in) :: buffers, cl_args ! cl_args is unused real(8), dimension(:,:), pointer :: ma integer, dimension(:,:), pointer :: mb integer :: ld_ma,nx_ma,ny_ma integer :: ld_mb,nx_mb,ny_mb integer :: i,j write(*,*) "task -->" ld_ma = fstarpu_matrix_get_ld(buffers, 0) nx_ma = fstarpu_matrix_get_nx(buffers, 0) ny_ma = fstarpu_matrix_get_ny(buffers, 0) write(*,*) "ld_ma" write(*,*) ld_ma write(*,*) "nx_ma" write(*,*) nx_ma write(*,*) "ny_ma" write(*,*) ny_ma ld_mb = fstarpu_matrix_get_ld(buffers, 1) nx_mb = fstarpu_matrix_get_nx(buffers, 1) ny_mb = fstarpu_matrix_get_ny(buffers, 1) write(*,*) "ld_mb" write(*,*) ld_mb write(*,*) "nx_mb" write(*,*) nx_mb write(*,*) "ny_mb" write(*,*) ny_mb call c_f_pointer(fstarpu_matrix_get_ptr(buffers, 0), ma, shape=[ld_ma,ny_ma]) write(*,*) "ma" do i=1,nx_ma do j=1,ny_ma write(*,*) i,j,ma(i,j) end do write(*,*) '-' end do call c_f_pointer(fstarpu_matrix_get_ptr(buffers, 1), mb, shape=[ld_mb,ny_mb]) write(*,*) "mb" do i=1,nx_mb do j=1,ny_mb write(*,*) i,j,mb(i,j) end do write(*,*) '-' end do write(*,*) "task <--" end subroutine cl_cpu_func_mat end module nf_codelets starpu-1.2.3+dfsg/examples/native_fortran/nf_compute.f90000066400000000000000000000104321320135501600232640ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2015 ONERA ! Copyright (C) 2015-2016 Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ! ! See the GNU Lesser General Public License in COPYING.LGPL for more details. ! Computation kernels for the simulation MODULE nf_compute USE nf_types USE fstarpu_mod USE iso_c_binding IMPLICIT NONE CONTAINS !--------------------------------------------------------------! SUBROUTINE init_element(ro,dro,basis,Neq_max,Np,Ng,i) INTEGER(KIND=C_INT),INTENT(IN) :: Neq_max,Np,Ng,i REAL(KIND=C_DOUBLE),DIMENSION(:,:),POINTER,INTENT(INOUT) :: ro,basis,dro !Local variables INTEGER(KIND=C_INT) :: n,nb,neq DO nb=1,Np DO neq= 1,Neq_max ro(neq,nb) = 0.01*(nb+neq)*i END DO END DO DO nb=1,Np DO neq= 1,Neq_max dro(neq,nb) = 0.05*(nb-neq)*i END DO END DO DO n=1,Ng DO nb=1,Np basis(nb,n) = 0.05*(n+nb)*i END DO END DO END SUBROUTINE init_element !--------------------------------------------------------------! RECURSIVE SUBROUTINE loop_element_cpu_fortran(buffers, cl_args) BIND(C) TYPE(C_PTR), VALUE, INTENT(IN) :: buffers, cl_args INTEGER(KIND=C_INT) :: Neq_max,Np,Ng REAL(KIND=C_DOUBLE),DIMENSION(:,:),POINTER :: ro,dro,basis REAL(KIND=C_DOUBLE),TARGET :: coeff Neq_max = fstarpu_matrix_get_nx(buffers, 0) Np = fstarpu_matrix_get_nx(buffers, 2) Ng = fstarpu_matrix_get_ny(buffers, 2) CALL fstarpu_unpack_arg(cl_args,(/ c_loc(coeff) /)) CALL c_f_pointer(fstarpu_matrix_get_ptr(buffers, 0), ro, shape=[Neq_max,Np]) CALL c_f_pointer(fstarpu_matrix_get_ptr(buffers, 1), dro, shape=[Neq_max,Np]) CALL c_f_pointer(fstarpu_matrix_get_ptr(buffers, 2), basis, shape=[Np,Ng]) CALL loop_element_cpu(ro,dro,basis,coeff,Neq_max,Ng,Np) END SUBROUTINE loop_element_cpu_fortran !--------------------------------------------------------------! RECURSIVE SUBROUTINE loop_element_cpu(ro,dro,basis,coeff,Neq_max,Ng,Np) REAL(KIND=C_DOUBLE),INTENT(IN) :: coeff INTEGER(KIND=C_INT),INTENT(IN) :: Neq_max,Ng,Np REAL(KIND=C_DOUBLE),DIMENSION(:,:),POINTER,INTENT(IN) :: ro,basis REAL(KIND=C_DOUBLE),DIMENSION(:,:),POINTER,INTENT(INOUT) :: dro !Local variables REAL(KIND=C_DOUBLE) :: coeff2,r INTEGER(KIND=C_INT) :: n,nb,neq DO n=1,Ng r = 0. DO nb=1,Np DO neq= 1,Neq_max r = r + basis(nb,n) * ro(neq,nb) ENDDO ENDDO coeff2 = r + coeff DO nb=1,Np DO neq = 1,Neq_max dro(neq,nb) = coeff2 + dro(neq,nb) ENDDO ENDDO ENDDO END SUBROUTINE loop_element_cpu !--------------------------------------------------------------! RECURSIVE SUBROUTINE copy_element_cpu_fortran(buffers, cl_args) BIND(C) TYPE(C_PTR), VALUE, INTENT(IN) :: buffers, cl_args INTEGER(KIND=C_INT) :: Neq_max,Np REAL(KIND=C_DOUBLE),DIMENSION(:,:),POINTER :: ro,dro Neq_max = fstarpu_matrix_get_nx(buffers, 0) Np = fstarpu_matrix_get_ny(buffers, 0) CALL c_f_pointer(fstarpu_matrix_get_ptr(buffers, 0), ro, shape=[Neq_max,Np]) CALL c_f_pointer(fstarpu_matrix_get_ptr(buffers, 1), dro, shape=[Neq_max,Np]) CALL copy_element_cpu(ro,dro) END SUBROUTINE copy_element_cpu_fortran !--------------------------------------------------------------! RECURSIVE SUBROUTINE copy_element_cpu(ro,dro) REAL(KIND=C_DOUBLE),DIMENSION(:,:),POINTER,INTENT(INOUT) :: ro REAL(KIND=C_DOUBLE),DIMENSION(:,:),POINTER,INTENT(IN) :: dro ro = ro + dro END SUBROUTINE copy_element_cpu END MODULE nf_compute starpu-1.2.3+dfsg/examples/native_fortran/nf_dynbuf.f90000066400000000000000000000053521320135501600231040ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2016 Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ! ! See the GNU Lesser General Public License in COPYING.LGPL for more details. program nf_dynbuf use iso_c_binding ! C interfacing module use fstarpu_mod ! StarPU interfacing module use nf_dynbuf_cl implicit none type(c_ptr) :: cl_dynbuf_big ! a pointer for the codelet structure type(c_ptr) :: dh_var type(c_ptr) :: descrs_var integer(c_int),target :: nbuffers integer(c_int) :: err ! return status for fstarpu_init integer(c_int) :: ncpu ! number of cpus workers integer(c_int),target :: var integer(c_int) :: i var = 42 ! initialize StarPU with default settings err = fstarpu_init(C_NULL_PTR) if (err == -19) then stop 77 end if ! stop there if no CPU worker available ncpu = fstarpu_cpu_worker_get_count() if (ncpu == 0) then call fstarpu_shutdown() stop 77 end if ! allocate an empty codelet structure cl_dynbuf_big = fstarpu_codelet_allocate() call fstarpu_codelet_set_name(cl_dynbuf_big, C_CHAR_"dummy_big_kernel"//C_NULL_CHAR) call fstarpu_codelet_add_cpu_func(cl_dynbuf_big, C_FUNLOC(cl_cpu_func_dynbuf_big)) write(*,*) "FSTARPU_NMAXBUFS",FSTARPU_NMAXBUFS nbuffers = FSTARPU_NMAXBUFS+1 call fstarpu_codelet_set_nbuffers(cl_dynbuf_big, nbuffers) call fstarpu_variable_data_register(dh_var, 0, c_loc(var), c_sizeof(var)) descrs_var = fstarpu_data_descr_array_alloc(nbuffers) do i=0,nbuffers-1 call fstarpu_data_descr_array_set(descrs_var, i, dh_var, FSTARPU_RW) end do call fstarpu_insert_task((/ cl_dynbuf_big, & FSTARPU_VALUE, c_loc(nbuffers), FSTARPU_SZ_C_INT, & FSTARPU_DATA_MODE_ARRAY, descrs_var, c_loc(nbuffers), & C_NULL_PTR /)) call fstarpu_task_wait_for_all() call fstarpu_data_descr_array_free(descrs_var) call fstarpu_data_unregister(dh_var) ! free codelet structure call fstarpu_codelet_free(cl_dynbuf_big) ! shut StarPU down call fstarpu_shutdown() end program nf_dynbuf starpu-1.2.3+dfsg/examples/native_fortran/nf_dynbuf_cl.f90000066400000000000000000000026741320135501600235660ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2016 Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ! ! See the GNU Lesser General Public License in COPYING.LGPL for more details. module nf_dynbuf_cl contains recursive subroutine cl_cpu_func_dynbuf_big (buffers, cl_args) bind(C) use iso_c_binding ! C interfacing module use fstarpu_mod ! StarPU interfacing module implicit none type(c_ptr), value, intent(in) :: buffers, cl_args ! cl_args is unused integer(c_int),target :: nb_data integer(c_int),pointer :: val integer(c_int) :: i call fstarpu_unpack_arg(cl_args,(/ c_loc(nb_data) /)) write(*,*) "number of data:", nb_data do i=0,nb_data-1 call c_f_pointer(fstarpu_variable_get_ptr(buffers, i), val) write(*,*) "i:", i, ", val:", val if (val /= 42) then stop 1 end if end do end subroutine cl_cpu_func_dynbuf_big end module nf_dynbuf_cl starpu-1.2.3+dfsg/examples/native_fortran/nf_example.f90000066400000000000000000000135231320135501600232470ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2015 ONERA ! Copyright (C) 2015-2016 Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ! ! See the GNU Lesser General Public License in COPYING.LGPL for more details. ! This is an example of Fortran90 program making use of StarPU. ! It registers a few matrices for each element of a domain, performs ! update computations on them, and checks the result. PROGRAM f90_example USE nf_types USE fstarpu_mod USE nf_compute USE iso_c_binding IMPLICIT NONE TYPE(type_mesh) :: mesh TYPE(type_numpar),TARGET :: numpar TYPE(type_mesh_elt),POINTER :: elt => NULL() INTEGER(KIND=C_INT) :: i,Nelt,res,cpus INTEGER(KIND=C_INT) :: starpu_maj,starpu_min,starpu_rev INTEGER(KIND=C_INT) :: neq,ng,nb,it,it_tot REAL(KIND=C_DOUBLE) :: r, coeff2 TYPE(C_PTR) :: cl_loop_element = C_NULL_PTR ! loop codelet TYPE(C_PTR) :: cl_copy_element = C_NULL_PTR ! copy codelet !Initialization with arbitrary data Nelt = 2 it_tot = 2 numpar%Neq_max = 5 numpar%coeff = 1.0 ALLOCATE(mesh%elt(Nelt)) DO i = 1,Nelt elt => mesh%elt(i) elt%Ng = 4 elt%Np = 2 ALLOCATE(elt%ro(numpar%Neq_max,elt%Np)) ALLOCATE(elt%dro(numpar%Neq_max,elt%Np)) ALLOCATE(elt%basis(elt%Np,elt%Ng)) CALL init_element(elt%ro,elt%dro,elt%basis,numpar%Neq_max,elt%Np,elt%Ng,i) ENDDO !Initialization of StarPU res = fstarpu_init(C_NULL_PTR) IF (res == -19) THEN STOP 77 END IF CALL fstarpu_get_version(starpu_maj,starpu_min,starpu_rev) WRITE(6,'(a,i4,a,i4,a,i4)') "StarPU version: ", starpu_maj , "." , starpu_min , "." , starpu_rev cpus = fstarpu_cpu_worker_get_count() IF (cpus == 0) THEN CALL fstarpu_shutdown() STOP 77 END IF cl_loop_element = fstarpu_codelet_allocate() CALL fstarpu_codelet_add_cpu_func(cl_loop_element, C_FUNLOC(loop_element_cpu_fortran)) CALL fstarpu_codelet_add_buffer(cl_loop_element, FSTARPU_R) CALL fstarpu_codelet_add_buffer(cl_loop_element, FSTARPU_RW) CALL fstarpu_codelet_add_buffer(cl_loop_element, FSTARPU_R) CALL fstarpu_codelet_set_name(cl_loop_element, C_CHAR_"LOOP_ELEMENT"//C_NULL_CHAR) cl_copy_element = fstarpu_codelet_allocate() CALL fstarpu_codelet_add_cpu_func(cl_copy_element, C_FUNLOC(copy_element_cpu_fortran)) CALL fstarpu_codelet_add_buffer(cl_copy_element, FSTARPU_RW) CALL fstarpu_codelet_add_buffer(cl_copy_element, FSTARPU_R) CALL fstarpu_codelet_set_name(cl_copy_element, C_CHAR_"COPY_ELEMENT"//C_NULL_CHAR) !Registration of elements DO i = 1,Nelt elt => mesh%elt(i) call fstarpu_matrix_data_register(elt%ro_h, 0, c_loc(elt%ro), numpar%Neq_max, numpar%Neq_max, elt%Np, c_sizeof(elt%ro(1,1))) call fstarpu_matrix_data_register(elt%dro_h, 0, c_loc(elt%dro), numpar%Neq_max, numpar%Neq_max, elt%Np, c_sizeof(elt%dro(1,1))) call fstarpu_matrix_data_register(elt%basis_h, 0, c_loc(elt%basis), elt%Np, elt%Np, elt%Ng, c_sizeof(elt%basis(1,1))) ENDDO !Compute DO it = 1,it_tot ! compute new dro for each element DO i = 1,Nelt elt => mesh%elt(i) CALL fstarpu_insert_task((/ cl_loop_element, & FSTARPU_VALUE, c_loc(numpar%coeff), FSTARPU_SZ_C_DOUBLE, & FSTARPU_R, elt%ro_h, & FSTARPU_RW, elt%dro_h, & FSTARPU_R, elt%basis_h, & C_NULL_PTR /)) ENDDO ! sync (if needed by the algorithm) CALL fstarpu_task_wait_for_all() ! - - - - - ! copy dro to ro for each element DO i = 1,Nelt elt => mesh%elt(i) CALL fstarpu_insert_task((/ cl_copy_element, & FSTARPU_RW, elt%ro_h, & FSTARPU_R, elt%dro_h, & C_NULL_PTR /)) ENDDO ! sync (if needed by the algorithm) CALL fstarpu_task_wait_for_all() ENDDO !Unregistration of elements DO i = 1,Nelt elt => mesh%elt(i) CALL fstarpu_data_unregister(elt%ro_h) CALL fstarpu_data_unregister(elt%dro_h) CALL fstarpu_data_unregister(elt%basis_h) ENDDO !Terminate StarPU, no task can be submitted after CALL fstarpu_shutdown() !Check data with StarPU WRITE(6,'(a)') " " WRITE(6,'(a)') " %%%% RESULTS STARPU %%%% " WRITE(6,'(a)') " " DO i = 1,Nelt WRITE(6,'(a,i4,a)') " elt ", i , " ; elt%ro = " WRITE(6,'(10(1x,F11.2))') mesh%elt(i)%ro WRITE(6,'(a)') " ------------------------ " ENDDO !Same compute without StarPU DO i = 1,Nelt elt => mesh%elt(i) CALL init_element(elt%ro,elt%dro,elt%basis,numpar%Neq_max,elt%Np,elt%Ng,i) ENDDO DO it = 1, it_tot DO i = 1,Nelt elt => mesh%elt(i) CALL loop_element_cpu(elt%ro,elt%dro,elt%basis,numpar%coeff,numpar%Neq_max,elt%Ng,elt%Np) elt%ro = elt%ro + elt%dro ENDDO ENDDO WRITE(6,'(a)') " " WRITE(6,'(a)') " %%%% RESULTS VERIFICATION %%%% " WRITE(6,'(a)') " " DO i = 1,Nelt WRITE(6,'(a,i4,a)') " elt ", i , " ; elt%ro = " WRITE(6,'(10(1x,F11.2))') mesh%elt(i)%ro WRITE(6,'(a)') " ------------------------ " ENDDO WRITE(6,'(a)') " " !Deallocation CALL fstarpu_codelet_free(cl_loop_element) CALL fstarpu_codelet_free(cl_copy_element) DO i = 1,Nelt elt => mesh%elt(i) DEALLOCATE(elt%ro) DEALLOCATE(elt%dro) DEALLOCATE(elt%basis) ENDDO DEALLOCATE(mesh%elt) END PROGRAM f90_example starpu-1.2.3+dfsg/examples/native_fortran/nf_matrix.f90000066400000000000000000000071151320135501600231200ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2016 Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ! ! See the GNU Lesser General Public License in COPYING.LGPL for more details. program nf_matrix use iso_c_binding ! C interfacing module use fstarpu_mod ! StarPU interfacing module use nf_codelets implicit none real(8), dimension(:,:), allocatable, target :: ma integer, dimension(:,:), allocatable, target :: mb integer :: i,j type(c_ptr) :: cl_mat ! a pointer for the codelet structure type(c_ptr) :: dh_ma ! a pointer for the 'ma' vector data handle type(c_ptr) :: dh_mb ! a pointer for the 'mb' vector data handle integer(c_int) :: err ! return status for fstarpu_init integer(c_int) :: ncpu ! number of cpus workers allocate(ma(5,6)) do i=1,5 do j=1,6 ma(i,j) = (i*10)+j end do end do allocate(mb(7,8)) do i=1,7 do j=1,8 mb(i,j) = (i*10)+j end do end do ! initialize StarPU with default settings err = fstarpu_init(C_NULL_PTR) if (err == -19) then stop 77 end if ! stop there if no CPU worker available ncpu = fstarpu_cpu_worker_get_count() if (ncpu == 0) then call fstarpu_shutdown() stop 77 end if ! allocate an empty codelet structure cl_mat = fstarpu_codelet_allocate() ! set the codelet name call fstarpu_codelet_set_name(cl_mat, C_CHAR_"my_mat_codelet"//C_NULL_CHAR) ! add a CPU implementation function to the codelet call fstarpu_codelet_add_cpu_func(cl_mat, C_FUNLOC(cl_cpu_func_mat)) ! add a Read-only mode data buffer to the codelet call fstarpu_codelet_add_buffer(cl_mat, FSTARPU_R) ! add a Read-Write mode data buffer to the codelet call fstarpu_codelet_add_buffer(cl_mat, FSTARPU_RW) ! register 'ma', a vector of real(8) elements !dh_ma = fstarpu_matrix_data_register(c_loc(ma), 5, 5, 6, c_sizeof(ma(1,1)), 0) call fstarpu_matrix_data_register(dh_ma, 0, c_loc(ma), 5, 5, 6, c_sizeof(ma(1,1))) ! register 'mb', a vector of integer elements call fstarpu_matrix_data_register(dh_mb, 0, c_loc(mb), 7, 7, 8, c_sizeof(mb(1,1))) ! insert a task with codelet cl_mat, and vectors 'ma' and 'mb' ! ! Note: The array argument must follow the layout: ! (/ ! , ! [ [, ! [ [, ! [ [ #include #include #ifdef STARPU_QUICK_CHECK #define NX 2048 #else #define NX 2048000 #endif #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) void scal_cpu_func(void *buffers[], void *_args) { unsigned i; float *factor = _args, f = *factor; struct starpu_vector_interface *vector = buffers[0]; unsigned n = STARPU_VECTOR_GET_NX(vector); float *val = (float *)STARPU_VECTOR_GET_PTR(vector); FPRINTF(stderr, "running task with %d CPUs.\n", starpu_combined_worker_get_size()); #pragma omp parallel for num_threads(starpu_combined_worker_get_size()) for (i = 0; i < n; i++) { float v = val[i]; int j; for (j = 0; j < 100; j++) v = v * f; val[i] = v; } } static struct starpu_perfmodel vector_scal_model = { .type = STARPU_HISTORY_BASED, .symbol = "vector_scal_parallel" }; static struct starpu_codelet cl = { .modes = { STARPU_RW }, .type = STARPU_FORKJOIN, .max_parallelism = INT_MAX, .cpu_funcs = {scal_cpu_func}, .cpu_funcs_name = {"scal_cpu_func"}, .nbuffers = 1, .model = &vector_scal_model, }; int main(int argc, char **argv) { struct starpu_conf conf; float *vector; unsigned i; int ret; vector = malloc(NX*sizeof(*vector)); for (i = 0; i < NX; i++) vector[i] = (i+1.0f); FPRINTF(stderr, "BEFORE: First element was %f\n", vector[0]); FPRINTF(stderr, "BEFORE: Last element was %f\n", vector[NX-1]); starpu_conf_init(&conf); /* Most OpenMP implementations do not support concurrent parallel * sections, so only enable one combined worker at a time. */ conf.single_combined_worker = 1; conf.sched_policy_name = "pheft"; ret = starpu_init(&conf); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_data_handle_t vector_handle; starpu_vector_data_register(&vector_handle, STARPU_MAIN_RAM, (uintptr_t)vector, NX, sizeof(vector[0])); float factor = 1.001; for (i = 0; i < 100; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->handles[0] = vector_handle; task->cl_arg = &factor; task->cl_arg_size = sizeof(factor); ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_data_unregister(vector_handle); /* terminate StarPU, no task can be submitted after */ starpu_shutdown(); FPRINTF(stderr, "AFTER: First element is %f\n", vector[0]); FPRINTF(stderr, "AFTER: Last element is %f\n", vector[NX-1]); free(vector); return 0; enodev: starpu_data_unregister(vector_handle); free(vector); starpu_shutdown(); return 77; } starpu-1.2.3+dfsg/examples/pi/000077500000000000000000000000001320135501600161745ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/pi/pi.c000066400000000000000000000137421320135501600167570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013-2015 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2013, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This computes Pi by using drawing random coordinates (thanks to the sobol * generator) and check whether they fall within one quarter of a circle. The * proportion gives an approximation of Pi. For each task, we draw a number of * coordinates, and we gather the number of successful draws. * * TODO: use curandGenerateUniform instead of the sobol generator, like pi_redux.c does */ #include "SobolQRNG/sobol.h" #include "SobolQRNG/sobol_gold.h" #include "pi.h" #ifdef STARPU_USE_CUDA void cuda_kernel(void **descr, void *cl_arg); #endif #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) /* default value */ static unsigned ntasks = 1024; static unsigned long long nshot_per_task = 16*1024*1024ULL; void cpu_kernel(void *descr[], void *cl_arg) { unsigned *directions = (unsigned *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned nx = nshot_per_task; TYPE *random_numbers = malloc(2*nx*sizeof(TYPE)); sobolCPU(2*nx/n_dimensions, n_dimensions, directions, random_numbers); TYPE *random_numbers_x = &random_numbers[0]; TYPE *random_numbers_y = &random_numbers[nx]; unsigned current_cnt = 0; unsigned i; for (i = 0; i < nx; i++) { TYPE x = random_numbers_x[i]; TYPE y = random_numbers_y[i]; TYPE dist = (x*x + y*y); unsigned success = (dist <= 1.0); current_cnt += success; } unsigned *cnt = (unsigned *)STARPU_VECTOR_GET_PTR(descr[1]); *cnt = current_cnt; free(random_numbers); } /* The amount of work does not depend on the data size at all :) */ static size_t size_base(struct starpu_task *task, unsigned nimpl) { return nshot_per_task; } static void parse_args(int argc, char **argv) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-ntasks") == 0) { char *argptr; ntasks = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-nshot") == 0) { char *argptr; nshot_per_task = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) { fprintf(stderr,"Usage: %s [options...]\n", argv[0]); fprintf(stderr,"\n"); fprintf(stderr,"Options:\n"); fprintf(stderr,"-ntasks select the number of tasks\n"); fprintf(stderr,"-nshot select the number of shot per task\n"); exit(0); } } } static struct starpu_perfmodel model = { .type = STARPU_HISTORY_BASED, .size_base = size_base, .symbol = "monte_carlo_pi" }; static struct starpu_codelet pi_cl = { .cpu_funcs = {cpu_kernel}, .cpu_funcs_name = {"cpu_kernel"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_kernel}, #endif .nbuffers = 2, .modes = {STARPU_R, STARPU_W}, .model = &model }; int main(int argc, char **argv) { unsigned i; int ret; parse_args(argc, argv); ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* Initialize the random number generator */ unsigned *sobol_qrng_directions = malloc(n_dimensions*n_directions*sizeof(unsigned)); STARPU_ASSERT(sobol_qrng_directions); initSobolDirectionVectors(n_dimensions, sobol_qrng_directions); /* Any worker may use that array now */ starpu_data_handle_t sobol_qrng_direction_handle; starpu_vector_data_register(&sobol_qrng_direction_handle, STARPU_MAIN_RAM, (uintptr_t)sobol_qrng_directions, n_dimensions*n_directions, sizeof(unsigned)); unsigned *cnt_array = calloc(ntasks, sizeof(unsigned)); STARPU_ASSERT(cnt_array); starpu_data_handle_t cnt_array_handle; starpu_vector_data_register(&cnt_array_handle, STARPU_MAIN_RAM, (uintptr_t)cnt_array, ntasks, sizeof(unsigned)); /* Use a write-through policy : when the data is modified on an * accelerator, we know that it will only be modified once and be * accessed by the CPU later on */ starpu_data_set_wt_mask(cnt_array_handle, (1<<0)); struct starpu_data_filter f = { .filter_func = starpu_vector_filter_block, .nchildren = ntasks }; starpu_data_partition(cnt_array_handle, &f); double start; double end; start = starpu_timing_now(); for (i = 0; i < ntasks; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &pi_cl; STARPU_ASSERT(starpu_data_get_sub_data(cnt_array_handle, 1, i)); task->handles[0] = sobol_qrng_direction_handle; task->handles[1] = starpu_data_get_sub_data(cnt_array_handle, 1, i); ret = starpu_task_submit(task); STARPU_ASSERT(!ret); } starpu_task_wait_for_all(); /* Get the cnt_array back in main memory */ starpu_data_unpartition(cnt_array_handle, STARPU_MAIN_RAM); starpu_data_unregister(cnt_array_handle); starpu_data_unregister(sobol_qrng_direction_handle); /* Count the total number of entries */ unsigned long total_cnt = 0; for (i = 0; i < ntasks; i++) total_cnt += cnt_array[i]; end = starpu_timing_now(); double timing = end - start; unsigned long total_shot_cnt = ntasks * nshot_per_task; /* Total surface : Pi * r^ 2 = Pi*1^2, total square surface : 2^2 = 4, probability to impact the disk: pi/4 */ FPRINTF(stderr, "Pi approximation : %f (%lu / %lu)\n", ((TYPE)total_cnt*4)/(total_shot_cnt), total_cnt, total_shot_cnt); FPRINTF(stderr, "Total time : %f ms\n", timing/1000.0); FPRINTF(stderr, "Speed : %f GShot/s\n", total_shot_cnt/(1e3*timing)); if (!getenv("STARPU_SSILENT")) starpu_codelet_display_stats(&pi_cl); starpu_shutdown(); return 0; } starpu-1.2.3+dfsg/examples/pi/pi.h000066400000000000000000000016131320135501600167560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2013 Université de Bordeaux * Copyright (C) 2010, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __PI_H__ #define __PI_H__ #include #include #define TYPE float /* extern "C" void cuda_kernel(void *descr[], void *cl_arg); */ static int n_dimensions = 100; #endif /* __PI_H__ */ starpu-1.2.3+dfsg/examples/pi/pi_kernel.cu000066400000000000000000000105111320135501600204730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2013, 2015 Université de Bordeaux * Copyright (C) 2010, 2012, 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* First draw a series of coordinates, then count how many fall inside the * circle quarter */ #include "SobolQRNG/sobol_gpu.h" #include "pi.h" #define MAXNBLOCKS 128 #define MAXTHREADSPERBLOCK 256 static __global__ void monte_carlo(TYPE *random_numbers_x, TYPE *random_numbers_y, unsigned n, unsigned *output_cnt) { __shared__ unsigned scnt[MAXTHREADSPERBLOCK]; /* Do we have a successful shot ? */ const int tid = threadIdx.x + blockIdx.x*blockDim.x; const int nthreads = gridDim.x * blockDim.x; /* Blank the shared mem buffer */ if (threadIdx.x < MAXTHREADSPERBLOCK) scnt[threadIdx.x] = 0; __syncthreads(); int ind; for (ind = tid; ind < n; ind += nthreads) { TYPE x = random_numbers_x[ind]; TYPE y = random_numbers_y[ind]; TYPE dist = (x*x + y*y); unsigned success = (dist <= 1.0f)?1:0; scnt[threadIdx.x] += success; } __syncthreads(); /* Perform a reduction to compute the sum on each thread within that block */ /* NB: We assume that the number of threads per block is a power of 2 ! */ unsigned s; for (s = blockDim.x/2; s!=0; s>>=1) { if (threadIdx.x < s) scnt[threadIdx.x] += scnt[threadIdx.x + s]; __syncthreads(); } /* report the number of successful shots in the block */ if (threadIdx.x == 0) output_cnt[blockIdx.x] = scnt[0]; __syncthreads(); } static __global__ void sum_per_block_cnt(unsigned *output_cnt, unsigned *cnt) { __shared__ unsigned accumulator[MAXNBLOCKS]; unsigned i; /* Load the values from global mem */ for (i = 0; i < blockDim.x; i++) accumulator[i] = output_cnt[i]; __syncthreads(); /* Perform a reduction in shared memory */ unsigned s; for (s = blockDim.x/2; s!=0; s>>=1) { if (threadIdx.x < s) accumulator[threadIdx.x] += accumulator[threadIdx.x + s]; __syncthreads(); } /* Save the result in global memory */ if (threadIdx.x == 0) *cnt = accumulator[0]; } extern "C" void cuda_kernel(void *descr[], void *cl_arg) { cudaError_t cures; unsigned *directions = (unsigned *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned long long *nshot_per_task = (unsigned long long *) cl_arg; unsigned nx = *nshot_per_task; /* Generate Random numbers */ float *random_numbers; cudaMalloc((void **)&random_numbers, 2*nx*sizeof(float)); STARPU_ASSERT(random_numbers); sobolGPU(2*nx/n_dimensions, n_dimensions, directions, random_numbers); cudaStreamSynchronize(starpu_cuda_get_local_stream()); TYPE *random_numbers_x = &random_numbers[0]; TYPE *random_numbers_y = &random_numbers[nx]; unsigned *cnt = (unsigned *)STARPU_VECTOR_GET_PTR(descr[1]); /* How many blocks do we use ? */ unsigned nblocks = 128; // TODO STARPU_ASSERT(nblocks <= MAXNBLOCKS); unsigned *per_block_cnt; cudaMalloc((void **)&per_block_cnt, nblocks*sizeof(unsigned)); STARPU_ASSERT((nx % nblocks) == 0); /* How many threads per block ? At most 256, but no more threads than * there are entries to process per block. */ unsigned nthread_per_block = STARPU_MIN(MAXTHREADSPERBLOCK, (nx / nblocks)); /* each entry of per_block_cnt contains the number of successful shots * in the corresponding block. */ monte_carlo<<>>(random_numbers_x, random_numbers_y, nx, per_block_cnt); /* Note that we do not synchronize between kernel calls because there is an implicit serialization */ /* compute the total number of successful shots by adding the elements * of the per_block_cnt array */ sum_per_block_cnt<<<1, nblocks, 0, starpu_cuda_get_local_stream()>>>(per_block_cnt, cnt); cures = cudaStreamSynchronize(starpu_cuda_get_local_stream()); if (cures) STARPU_CUDA_REPORT_ERROR(cures); cudaFree(per_block_cnt); cudaFree(random_numbers); } starpu-1.2.3+dfsg/examples/pi/pi_redux.c000066400000000000000000000254701320135501600201670ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2015, 2017 Université de Bordeaux * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This computes Pi by using drawing random coordinates (thanks to the sobol * generator) and check whether they fall within one quarter of a circle. The * proportion gives an approximation of Pi. For each task, we draw a number of * coordinates, and we gather the number of successful draws. * * This version uses reduction to optimize gathering the number of successful * draws. */ #include #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #define PI 3.14159265358979323846 #if defined(STARPU_USE_CUDA) && !defined(STARPU_HAVE_CURAND) #warning CURAND is required to run that example on CUDA devices #endif #ifdef STARPU_HAVE_CURAND #include #include #endif static unsigned long long nshot_per_task = 16*1024*1024ULL; /* default value */ static unsigned long ntasks = 1024; static unsigned long ntasks_warmup = 0; static unsigned use_redux = 1; static unsigned do_warmup = 0; /* * Initialization of the Random Number Generators (RNG) */ #ifdef STARPU_HAVE_CURAND /* RNG for the CURAND library */ static curandGenerator_t curandgens[STARPU_NMAXWORKERS]; #endif /* state for the erand48 function : note the huge padding to avoid false-sharing */ #define PADDING 1024 static unsigned short xsubi[STARPU_NMAXWORKERS*PADDING]; static starpu_drand48_data randbuffer[STARPU_NMAXWORKERS*PADDING]; /* Function to initialize the random number generator in the current worker */ static void init_rng(void *arg STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_HAVE_CURAND curandStatus_t res; #endif int workerid = starpu_worker_get_id_check(); switch (starpu_worker_get_type(workerid)) { case STARPU_CPU_WORKER: case STARPU_MIC_WORKER: case STARPU_SCC_WORKER: /* create a seed */ starpu_srand48_r((long int)workerid, &randbuffer[PADDING*workerid]); xsubi[0 + PADDING*workerid] = (unsigned short)workerid; xsubi[1 + PADDING*workerid] = (unsigned short)workerid; xsubi[2 + PADDING*workerid] = (unsigned short)workerid; break; #ifdef STARPU_HAVE_CURAND case STARPU_CUDA_WORKER: /* Create a RNG */ res = curandCreateGenerator(&curandgens[workerid], CURAND_RNG_PSEUDO_DEFAULT); STARPU_ASSERT(res == CURAND_STATUS_SUCCESS); /* Seed it with worker's id */ res = curandSetPseudoRandomGeneratorSeed(curandgens[workerid], (unsigned long long)workerid); STARPU_ASSERT(res == CURAND_STATUS_SUCCESS); break; #endif default: STARPU_ABORT(); break; } } /* The amount of work does not depend on the data size at all :) */ static size_t size_base(struct starpu_task *task, unsigned nimpl) { return nshot_per_task; } static void parse_args(int argc, char **argv) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-ntasks") == 0) { char *argptr; ntasks = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-nshot") == 0) { char *argptr; nshot_per_task = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-noredux") == 0) { use_redux = 0; } if (strcmp(argv[i], "-warmup") == 0) { do_warmup = 1; ntasks_warmup = 8; /* arbitrary number of warmup tasks */ } if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) { fprintf(stderr, "Usage: %s [-ntasks n] [-noredux] [-warmup] [-h]\n", argv[0]); exit(-1); } } } /* * Monte-carlo kernel */ void pi_func_cpu(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { int workerid = starpu_worker_get_id_check(); unsigned short *worker_xsub; worker_xsub = &xsubi[PADDING*workerid]; starpu_drand48_data *buffer; buffer = &randbuffer[PADDING*workerid]; unsigned long local_cnt = 0; /* Fill the scratchpad with random numbers */ unsigned i; for (i = 0; i < nshot_per_task; i++) { double randx, randy; starpu_erand48_r(worker_xsub, buffer, &randx); starpu_erand48_r(worker_xsub, buffer, &randy); double x = (2.0*randx - 1.0); double y = (2.0*randy - 1.0); double dist = x*x + y*y; if (dist < 1.0) local_cnt++; } /* Put the contribution of that task into the counter */ unsigned long *cnt = (unsigned long *)STARPU_VARIABLE_GET_PTR(descr[1]); *cnt = *cnt + local_cnt; } extern void pi_redux_cuda_kernel(float *x, float *y, unsigned n, unsigned long *shot_cnt); #ifdef STARPU_HAVE_CURAND static void pi_func_cuda(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { curandStatus_t res; int workerid = starpu_worker_get_id_check(); /* CURAND is a bit silly: it assumes that any error is fatal. Calling * cudaGetLastError resets the last error value. */ (void) cudaGetLastError(); /* Fill the scratchpad with random numbers. Note that both x and y * arrays are in stored the same vector. */ float *scratchpad_xy = (float *)STARPU_VECTOR_GET_PTR(descr[0]); res = curandGenerateUniform(curandgens[workerid], scratchpad_xy, 2*nshot_per_task); STARPU_ASSERT(res == CURAND_STATUS_SUCCESS); float *x = &scratchpad_xy[0]; float *y = &scratchpad_xy[nshot_per_task]; unsigned long *shot_cnt = (unsigned long *)STARPU_VARIABLE_GET_PTR(descr[1]); pi_redux_cuda_kernel(x, y, nshot_per_task, shot_cnt); } #endif static struct starpu_perfmodel pi_model = { .type = STARPU_HISTORY_BASED, .size_base = size_base, .symbol = "monte_carlo_pi_scratch" }; static struct starpu_codelet pi_cl = { .cpu_funcs = {pi_func_cpu}, .cpu_funcs_name = {"pi_func_cpu"}, #ifdef STARPU_HAVE_CURAND .cuda_funcs = {pi_func_cuda}, #endif .nbuffers = 2, .modes = {STARPU_SCRATCH, STARPU_RW}, .model = &pi_model }; static struct starpu_perfmodel pi_model_redux = { .type = STARPU_HISTORY_BASED, .size_base = size_base, .symbol = "monte_carlo_pi_scratch_redux" }; static struct starpu_codelet pi_cl_redux = { .cpu_funcs = {pi_func_cpu}, .cpu_funcs_name = {"pi_func_cpu"}, #ifdef STARPU_HAVE_CURAND .cuda_funcs = {pi_func_cuda}, #endif .nbuffers = 2, .modes = {STARPU_SCRATCH, STARPU_REDUX}, .model = &pi_model_redux }; /* * Codelets to implement reduction */ void init_cpu_func(void *descr[], void *cl_arg) { unsigned long *val = (unsigned long *)STARPU_VARIABLE_GET_PTR(descr[0]); *val = 0; } #ifdef STARPU_HAVE_CURAND static void init_cuda_func(void *descr[], void *cl_arg) { unsigned long *val = (unsigned long *)STARPU_VARIABLE_GET_PTR(descr[0]); cudaMemsetAsync(val, 0, sizeof(unsigned long), starpu_cuda_get_local_stream()); } #endif static struct starpu_codelet init_codelet = { .cpu_funcs = {init_cpu_func}, .cpu_funcs_name = {"init_cpu_func"}, #ifdef STARPU_HAVE_CURAND .cuda_funcs = {init_cuda_func}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif .modes = {STARPU_W}, .nbuffers = 1 }; #ifdef STARPU_HAVE_CURAND /* Dummy implementation of the addition of two unsigned longs in CUDA */ static void redux_cuda_func(void *descr[], void *cl_arg) { unsigned long *d_a = (unsigned long *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned long *d_b = (unsigned long *)STARPU_VARIABLE_GET_PTR(descr[1]); unsigned long h_a, h_b; cudaMemcpyAsync(&h_a, d_a, sizeof(h_a), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaMemcpyAsync(&h_b, d_b, sizeof(h_b), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); h_a += h_b; cudaMemcpyAsync(d_a, &h_a, sizeof(h_a), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); } #endif void redux_cpu_func(void *descr[], void *cl_arg) { unsigned long *a = (unsigned long *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned long *b = (unsigned long *)STARPU_VARIABLE_GET_PTR(descr[1]); *a = *a + *b; } static struct starpu_codelet redux_codelet = { .cpu_funcs = {redux_cpu_func}, .cpu_funcs_name = {"redux_cpu_func"}, #ifdef STARPU_HAVE_CURAND .cuda_funcs = {redux_cuda_func}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif .modes = {STARPU_RW, STARPU_R}, .nbuffers = 2 }; /* * Main program */ int main(int argc, char **argv) { unsigned i; int ret; /* Not supported yet */ if (starpu_get_env_number_default("STARPU_GLOBAL_ARBITER", 0) > 0) return 77; parse_args(argc, argv); ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* Launch a Random Number Generator (RNG) on each worker */ starpu_execute_on_each_worker(init_rng, NULL, STARPU_CPU|STARPU_CUDA); /* Create a scratchpad data */ starpu_data_handle_t xy_scratchpad_handle; starpu_vector_data_register(&xy_scratchpad_handle, -1, (uintptr_t)NULL, 2*nshot_per_task, sizeof(float)); /* Create a variable that will be used to count the number of shots * that actually hit the unit circle when shooting randomly in * [-1,1]^2. */ unsigned long shot_cnt = 0; starpu_data_handle_t shot_cnt_handle; starpu_variable_data_register(&shot_cnt_handle, STARPU_MAIN_RAM, (uintptr_t)&shot_cnt, sizeof(shot_cnt)); starpu_data_set_reduction_methods(shot_cnt_handle, &redux_codelet, &init_codelet); double start; double end; for (i = 0; i < ntasks_warmup; i++) { struct starpu_task *task = starpu_task_create(); task->cl = use_redux?&pi_cl_redux:&pi_cl; task->handles[0] = xy_scratchpad_handle; task->handles[1] = shot_cnt_handle; ret = starpu_task_submit(task); STARPU_ASSERT(!ret); } start = starpu_timing_now(); for (i = 0; i < ntasks; i++) { struct starpu_task *task = starpu_task_create(); task->cl = use_redux?&pi_cl_redux:&pi_cl; task->handles[0] = xy_scratchpad_handle; task->handles[1] = shot_cnt_handle; ret = starpu_task_submit(task); STARPU_ASSERT(!ret); } starpu_data_unregister(shot_cnt_handle); starpu_data_unregister(xy_scratchpad_handle); end = starpu_timing_now(); double timing = end - start; /* Total surface : Pi * r^ 2 = Pi*1^2, total square surface : 2^2 = 4, * probability to impact the disk: pi/4 */ unsigned long total = (ntasks + ntasks_warmup)*nshot_per_task; double pi_approx = ((double)shot_cnt*4.0)/total; FPRINTF(stderr, "Reductions? %s\n", use_redux?"yes":"no"); FPRINTF(stderr, "Pi approximation : %f (%lu / %lu)\n", pi_approx, shot_cnt, total); FPRINTF(stderr, "Error %e \n", pi_approx - PI); FPRINTF(stderr, "Total time : %f ms\n", timing/1000.0); FPRINTF(stderr, "Speed : %f GShot/s\n", total/(1e3*timing)); starpu_shutdown(); if (abs(pi_approx - PI) > 1.0) return 1; return 0; } starpu-1.2.3+dfsg/examples/pi/pi_redux_kernel.cu000066400000000000000000000072141320135501600217100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2015 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* This counts how many fall inside the circle quarter */ #include #define MAXNBLOCKS 128 #define MAXTHREADSPERBLOCK 256 static __global__ void monte_carlo(float *x, float *y, unsigned n, unsigned long *output_cnt) { __shared__ unsigned scnt[MAXTHREADSPERBLOCK]; /* Do we have a successful shot ? */ const int tid = threadIdx.x + blockIdx.x*blockDim.x; const int nthreads = gridDim.x * blockDim.x; /* Blank the shared mem buffer */ if (threadIdx.x < MAXTHREADSPERBLOCK) scnt[threadIdx.x] = 0; __syncthreads(); int ind; for (ind = tid; ind < n; ind += nthreads) { float xval = (2.0f * x[ind] - 1.0f); float yval = (2.0f * y[ind] - 1.0f); float dist = (xval*xval + yval*yval); unsigned long success = (dist <= 1.0f)?1:0; scnt[threadIdx.x] += success; } __syncthreads(); /* Perform a reduction to compute the sum on each thread within that block */ /* NB: We assume that the number of threads per block is a power of 2 ! */ unsigned long s; for (s = blockDim.x/2; s!=0; s>>=1) { if (threadIdx.x < s) scnt[threadIdx.x] += scnt[threadIdx.x + s]; __syncthreads(); } /* report the number of successful shots in the block */ if (threadIdx.x == 0) output_cnt[blockIdx.x] = scnt[0]; __syncthreads(); } static __global__ void sum_per_block_cnt(unsigned long *output_cnt, unsigned long *cnt) { __shared__ unsigned long accumulator[MAXNBLOCKS]; unsigned i; /* Load the values from global mem */ for (i = 0; i < blockDim.x; i++) accumulator[i] = output_cnt[i]; __syncthreads(); /* Perform a reduction in shared memory */ unsigned s; for (s = blockDim.x/2; s!=0; s>>=1) { if (threadIdx.x < s) accumulator[threadIdx.x] += accumulator[threadIdx.x + s]; __syncthreads(); } /* Save the result in global memory */ if (threadIdx.x == 0) *cnt = *cnt + accumulator[0]; } extern "C" void pi_redux_cuda_kernel(float *x, float *y, unsigned n, unsigned long *shot_cnt) { cudaError_t cures; /* How many blocks do we use ? */ unsigned nblocks = 128; // TODO STARPU_ASSERT(nblocks <= MAXNBLOCKS); STARPU_ASSERT((n % nblocks) == 0); unsigned long *per_block_cnt; cudaMalloc((void **)&per_block_cnt, nblocks*sizeof(unsigned long)); /* How many threads per block ? At most 256, but no more threads than * there are entries to process per block. */ unsigned nthread_per_block = STARPU_MIN(MAXTHREADSPERBLOCK, (n / nblocks)); /* each entry of per_block_cnt contains the number of successful shots * in the corresponding block. */ monte_carlo<<>>(x, y, n, per_block_cnt); /* Note that we do not synchronize between kernel calls because there is an implicit serialization */ /* compute the total number of successful shots by adding the elements * of the per_block_cnt array */ sum_per_block_cnt<<<1, nblocks, 0, starpu_cuda_get_local_stream()>>>(per_block_cnt, shot_cnt); cures = cudaStreamSynchronize(starpu_cuda_get_local_stream()); if (cures) STARPU_CUDA_REPORT_ERROR(cures); cudaFree(per_block_cnt); } starpu-1.2.3+dfsg/examples/pipeline/000077500000000000000000000000001320135501600173715ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/pipeline/pipeline.c000066400000000000000000000146431320135501600213520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012, 2013, 2014 CNRS * Copyright (C) 2012, 2014, 2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This examples shows how to submit a pipeline to StarPU with limited buffer * use, and avoiding submitted all the tasks at once. * * This is a dumb example pipeline, depicted here: * * x--\ * >==axpy-->sum * y--/ * * x and y produce vectors full of x and y values, axpy multiplies them, and sum * sums it up. We thus have 3 temporary buffers */ #include #include #include #include #ifdef STARPU_USE_CUDA #include #endif #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) /* Vector size */ #ifdef STARPU_QUICK_CHECK #define N 16 #else #define N 1048576 #endif /* Number of iteration buffers, and thus overlapped pipeline iterations */ #define K 16 /* Number of concurrently submitted pipeline iterations */ #define C 64 /* Number of iterations */ #define L 256 /* X / Y codelets */ void pipeline_cpu_x(void *descr[], void *args) { float x; float *val = (float *) STARPU_VECTOR_GET_PTR(descr[0]); int n = STARPU_VECTOR_GET_NX(descr[0]); int i; starpu_codelet_unpack_args(args, &x); for (i = 0; i < n ; i++) val[i] = x; } static struct starpu_perfmodel pipeline_model_x = { .type = STARPU_HISTORY_BASED, .symbol = "pipeline_model_x" }; static struct starpu_codelet pipeline_codelet_x = { .cpu_funcs = {pipeline_cpu_x}, .cpu_funcs_name = {"pipeline_cpu_x"}, .nbuffers = 1, .modes = {STARPU_W}, .model = &pipeline_model_x }; /* axpy codelets */ void pipeline_cpu_axpy(void *descr[], void *arg) { float *x = (float *) STARPU_VECTOR_GET_PTR(descr[0]); float *y = (float *) STARPU_VECTOR_GET_PTR(descr[1]); int n = STARPU_VECTOR_GET_NX(descr[0]); STARPU_SAXPY(n, 1., x, 1, y, 1); } #ifdef STARPU_USE_CUDA void pipeline_cublas_axpy(void *descr[], void *arg) { float *x = (float *) STARPU_VECTOR_GET_PTR(descr[0]); float *y = (float *) STARPU_VECTOR_GET_PTR(descr[1]); int n = STARPU_VECTOR_GET_NX(descr[0]); float alpha = 1.; cublasSaxpy(starpu_cublas_get_local_handle(), n, &alpha, x, 1, y, 1); } #endif static struct starpu_perfmodel pipeline_model_axpy = { .type = STARPU_HISTORY_BASED, .symbol = "pipeline_model_axpy" }; static struct starpu_codelet pipeline_codelet_axpy = { .cpu_funcs = {pipeline_cpu_axpy}, .cpu_funcs_name = {"pipeline_cpu_axpy"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {pipeline_cublas_axpy}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif .nbuffers = 2, .modes = {STARPU_R, STARPU_RW}, .model = &pipeline_model_axpy }; /* sum codelet */ void pipeline_cpu_sum(void *descr[], void *_args) { float *x = (float *) STARPU_VECTOR_GET_PTR(descr[0]); int n = STARPU_VECTOR_GET_NX(descr[0]); float y; y = STARPU_SASUM(n, x, 1); FPRINTF(stderr,"CPU finished with %f\n", y); } #ifdef STARPU_USE_CUDA void pipeline_cublas_sum(void *descr[], void *arg) { float *x = (float *) STARPU_VECTOR_GET_PTR(descr[0]); int n = STARPU_VECTOR_GET_NX(descr[0]); float y; cublasSasum(starpu_cublas_get_local_handle(), n, x, 1, &y); FPRINTF(stderr,"CUBLAS finished with %f\n", y); } #endif static struct starpu_perfmodel pipeline_model_sum = { .type = STARPU_HISTORY_BASED, .symbol = "pipeline_model_sum" }; static struct starpu_codelet pipeline_codelet_sum = { .cpu_funcs = {pipeline_cpu_sum}, .cpu_funcs_name = {"pipeline_cpu_sum"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {pipeline_cublas_sum}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif .nbuffers = 1, .modes = {STARPU_R}, .model = &pipeline_model_sum }; int main(void) { int ret = 0; int k, l, c; starpu_data_handle_t buffersX[K], buffersY[K], buffersP[K]; sem_t sems[C]; ret = starpu_init(NULL); if (ret == -ENODEV) exit(77); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_cublas_init(); /* Initialize the K temporary buffers. No need to allocate it ourselves * Since it's the X and Y kernels which will fill the initial values. */ for (k = 0; k < K; k++) { starpu_vector_data_register(&buffersX[k], -1, 0, N, sizeof(float)); starpu_vector_data_register(&buffersY[k], -1, 0, N, sizeof(float)); starpu_vector_data_register(&buffersP[k], -1, 0, N, sizeof(float)); } /* Initialize way to wait for the C previous concurrent stages */ for (c = 0; c < C; c++) sem_init(&sems[c], 0, 0); /* Submits the l pipeline stages */ for (l = 0; l < L; l++) { float x = l; float y = 2*l; /* First wait for the C previous concurrent stages */ if (l >= C) { starpu_do_schedule(); sem_wait(&sems[l%C]); } /* Now submit the next stage */ ret = starpu_task_insert(&pipeline_codelet_x, STARPU_W, buffersX[l%K], STARPU_VALUE, &x, sizeof(x), STARPU_TAG_ONLY, (starpu_tag_t) (100*l), 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert x"); ret = starpu_task_insert(&pipeline_codelet_x, STARPU_W, buffersY[l%K], STARPU_VALUE, &y, sizeof(y), STARPU_TAG_ONLY, (starpu_tag_t) (100*l+1), 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert y"); ret = starpu_task_insert(&pipeline_codelet_axpy, STARPU_R, buffersX[l%K], STARPU_RW, buffersY[l%K], STARPU_TAG_ONLY, (starpu_tag_t) l, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert axpy"); ret = starpu_task_insert(&pipeline_codelet_sum, STARPU_R, buffersY[l%K], STARPU_CALLBACK_WITH_ARG, (void (*)(void*))sem_post, &sems[l%C], STARPU_TAG_ONLY, (starpu_tag_t) l, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert sum"); } starpu_task_wait_for_all(); enodev: for (k = 0; k < K; k++) { starpu_data_unregister(buffersX[k]); starpu_data_unregister(buffersY[k]); starpu_data_unregister(buffersP[k]); } starpu_shutdown(); return (ret == -ENODEV ? 77 : 0); } starpu-1.2.3+dfsg/examples/ppm_downscaler/000077500000000000000000000000001320135501600206015ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/ppm_downscaler/ppm_downscaler.c000066400000000000000000000115431320135501600237660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2013, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* This uses a dummy algorithm to downscale a ppm file. */ /* TODO: turn this into StarPU. */ #include "ppm_downscaler.h" #include #ifdef STARPU_HAVE_MALLOC_H #include #endif #include #include #include struct ppm_image *allocate_new_ppm(int ncols, int nlines, int coldepth) { struct ppm_image *ppm = (struct ppm_image *) malloc(sizeof(struct ppm_image)); assert(ppm); ppm->ncols = ncols; ppm->nlines = nlines; ppm->coldepth = coldepth; #ifdef STARPU_HAVE_MEMALIGN ppm->data = (struct ppm_color *) memalign(16384, ncols*nlines*sizeof(struct ppm_color)); #else ppm->data = (struct ppm_color *) malloc(ncols*nlines*sizeof(struct ppm_color)); #endif assert(ppm->data); return ppm; } struct ppm_image *file_to_ppm(char *filename) { int ret; struct ppm_image *ppm = (struct ppm_image *) malloc(sizeof(struct ppm_image)); assert(ppm); FILE *file = fopen(filename, "r"); assert(file); /* read the file's dimensions */ ret = fscanf(file, "P6\n%d %d\n%d\n", &ppm->ncols, &ppm->nlines, &ppm->coldepth); if (ret != 3) { fclose(file); fprintf(stderr, "file %s is not valid\n", filename); exit(-1); } /* allocate a buffer for the image */ #ifdef STARPU_HAVE_MEMALIGN ppm->data = (struct ppm_color *) memalign(16384, ppm->ncols*ppm->nlines*sizeof(struct ppm_color)); #else ppm->data = (struct ppm_color *) malloc(ppm->ncols*ppm->nlines*sizeof(struct ppm_color)); #endif assert(ppm->data); ret = fread(ppm->data, sizeof(struct ppm_color), ppm->ncols*ppm->nlines, file); STARPU_ASSERT(ret == ppm->ncols*ppm->nlines); int i; for (i = 0; i < ppm->ncols*ppm->nlines; i++) { /* fprintf(stderr, "READ (index %d) -> r %d g %d b %d\n", i, ppm->data[i].r, ppm->data[i].g, ppm->data[i].b); */ } fclose(file); return ppm; } void ppm_to_file(struct ppm_image *ppm, char *filename) { FILE *file = fopen(filename, "w+"); assert(file); /* read the file's dimensions */ fprintf(file, "P6\n%d %d\n%d\n", ppm->ncols, ppm->nlines, ppm->coldepth); fwrite(&ppm->data[0], sizeof(struct ppm_color), ppm->ncols*ppm->nlines, file); fclose(file); } char *filename_in = "serpents.ppm"; char *filename_out = "serpents.small.ppm"; void parse_args(int argc, char **argv) { if (argc == 3) { filename_in = argv[1]; filename_out = argv[2]; } } /* what is the downscaling factor ? */ #define FACTOR 2 void dummy_downscale(struct ppm_image *input_ppm, struct ppm_image *output_ppm) { struct ppm_color *in = input_ppm->data; struct ppm_color *out = output_ppm->data; int line, col; for (line = 0; line < output_ppm->nlines; line++) { for (col = 0; col < output_ppm->ncols; col++) { unsigned sum_r = 0, sum_g = 0, sum_b = 0; unsigned big_col = col*FACTOR; unsigned big_line = line*FACTOR; /* compute the average value of all components */ unsigned i, j; for (i = 0; i < FACTOR; i++) { for (j = 0; j < FACTOR; j++) { unsigned index = (big_col + i)+(big_line + j)*input_ppm->ncols; /* fprintf(stderr, "(col %d, line %d) i %d j %d index %d -> r %d g %d b %d\n", col, line, i, j, index, in[index].r, in[index].g, in[index].b); */ sum_r += (unsigned)in[index].r; sum_g += (unsigned)in[index].g; sum_b += (unsigned)in[index].b; } } out[col + line*output_ppm->ncols].r = (unsigned char)(sum_r/(FACTOR*FACTOR)); out[col + line*output_ppm->ncols].g = (unsigned char)(sum_g/(FACTOR*FACTOR)); out[col + line*output_ppm->ncols].b = (unsigned char)(sum_b/(FACTOR*FACTOR)); /* fprintf(stderr, "col %d line %d -> sum_r = %d out -> %d\n", col, line, sum_r, out[col + line*FACTOR].r); */ } } } int main(int argc, char **argv) { struct ppm_image *input_ppm, *output_ppm; parse_args(argc, argv); input_ppm = file_to_ppm(filename_in); fprintf(stderr, "Read input ppm file : ncols = %d, nlines = %d, coldept = %d\n", input_ppm->nlines, input_ppm->ncols, input_ppm->coldepth); assert(input_ppm->nlines % FACTOR == 0); assert(input_ppm->ncols % FACTOR == 0); output_ppm = allocate_new_ppm(input_ppm->ncols/FACTOR, input_ppm->nlines/FACTOR, input_ppm->coldepth); dummy_downscale(input_ppm, output_ppm); ppm_to_file(output_ppm, filename_out); free(input_ppm); free(output_ppm); return 0; } starpu-1.2.3+dfsg/examples/ppm_downscaler/ppm_downscaler.h000066400000000000000000000016271320135501600237750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010, 2011 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* we make the asumption that there are 256 color levels at most */ struct ppm_color { unsigned char r; unsigned char g; unsigned char b; }; struct ppm_image { int nlines; int ncols; int coldepth; struct ppm_color *data; }; starpu-1.2.3+dfsg/examples/ppm_downscaler/yuv_downscaler.c000066400000000000000000000223401320135501600240120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013-2014, 2017 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2013, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This uses a dummy algorithm to downscale a 1920x1080 yuv film. * Each frame is split in horizontal stripes which are processed in parallel. */ #include #include #include #include #include #include #include "yuv_downscaler.h" static double start; static double end; static const char *filename_in_default = "hugefile.2s.yuv"; static const char *filename_out_default = "hugefile.2s.out.yuv"; static char filename_in[1024]; static char filename_out[1024]; void parse_args(int argc, char **argv) { if (argc == 3) { strncpy(filename_in, argv[1], 1023); strncpy(filename_out, argv[2], 1023); } else { snprintf(filename_in, 1024, "%s/examples/ppm_downscaler/%s", STARPU_BUILD_DIR, filename_in_default); snprintf(filename_out, 1024, "%s/examples/ppm_downscaler/%s", STARPU_BUILD_DIR, filename_out_default); } } #define FRAMESIZE sizeof(struct yuv_frame) #define NEW_FRAMESIZE sizeof(struct yuv_new_frame) void ds_kernel_cpu(void *descr[], STARPU_ATTRIBUTE_UNUSED void *arg) { uint8_t *input = (uint8_t *)STARPU_MATRIX_GET_PTR(descr[0]); const unsigned input_ld = STARPU_MATRIX_GET_LD(descr[0]); uint8_t *output = (uint8_t *)STARPU_MATRIX_GET_PTR(descr[1]); const unsigned output_ld = STARPU_MATRIX_GET_LD(descr[1]); const unsigned ncols = STARPU_MATRIX_GET_NX(descr[0]); const unsigned nlines = STARPU_MATRIX_GET_NY(descr[0]); unsigned line, col; for (line = 0; line < nlines; line+=FACTOR) for (col = 0; col < ncols; col+=FACTOR) { unsigned sum = 0; unsigned lline, lcol; for (lline = 0; lline < FACTOR; lline++) for (lcol = 0; lcol < FACTOR; lcol++) { unsigned in_index = (lcol + col) + (lline + line)*input_ld; sum += input[in_index]; } unsigned out_index = (col / FACTOR) + (line / FACTOR)*output_ld; output[out_index] = (uint8_t)(sum/(FACTOR*FACTOR)); } } static struct starpu_codelet ds_codelet = { .cpu_funcs = {ds_kernel_cpu}, .cpu_funcs_name = {"ds_kernel_cpu"}, .nbuffers = 2, /* input -> output */ .modes = {STARPU_R, STARPU_W}, .model = NULL }; /* each block contains BLOCK_HEIGHT consecutive lines */ static struct starpu_data_filter filter_y = { .filter_func = starpu_matrix_filter_block, .nchildren= HEIGHT/BLOCK_HEIGHT }; static struct starpu_data_filter filter_uv = { .filter_func = starpu_matrix_filter_block, .nchildren = (HEIGHT/2)/BLOCK_HEIGHT }; int main(int argc, char **argv) { int ret; size_t sret; assert(HEIGHT % (2*BLOCK_HEIGHT) == 0); assert(HEIGHT % FACTOR == 0); parse_args(argc, argv); /* fprintf(stderr, "Reading input file ...\n"); */ /* how many frames ? */ struct stat stbuf; ret = stat(filename_in, &stbuf); assert(ret); size_t filesize = stbuf.st_size; unsigned nframes = filesize/FRAMESIZE; /* fprintf(stderr, "filesize %lx (FRAME SIZE %lx NEW SIZE %lx); nframes %d\n", filesize, FRAMESIZE, NEW_FRAMESIZE, nframes); */ assert((filesize % sizeof(struct yuv_frame)) == 0); struct yuv_frame *yuv_in_buffer = (struct yuv_frame *) malloc(nframes*FRAMESIZE); assert(yuv_in_buffer); /* fprintf(stderr, "Alloc output file ...\n"); */ struct yuv_new_frame *yuv_out_buffer = (struct yuv_new_frame *) calloc(nframes, NEW_FRAMESIZE); assert(yuv_out_buffer); /* fetch input data */ FILE *f_in = fopen(filename_in, "r"); assert(f_in); /* allocate room for an output buffer */ FILE *f_out = fopen(filename_out, "w+"); assert(f_out); sret = fread(yuv_in_buffer, FRAMESIZE, nframes, f_in); assert(sret == nframes); starpu_data_handle_t *frame_y_handle = (starpu_data_handle_t *) calloc(nframes, sizeof(starpu_data_handle_t)); starpu_data_handle_t *frame_u_handle = (starpu_data_handle_t *) calloc(nframes, sizeof(starpu_data_handle_t)); starpu_data_handle_t *frame_v_handle = (starpu_data_handle_t *) calloc(nframes, sizeof(starpu_data_handle_t)); starpu_data_handle_t *new_frame_y_handle = (starpu_data_handle_t *) calloc(nframes, sizeof(starpu_data_handle_t)); starpu_data_handle_t *new_frame_u_handle = (starpu_data_handle_t *) calloc(nframes, sizeof(starpu_data_handle_t)); starpu_data_handle_t *new_frame_v_handle = (starpu_data_handle_t *) calloc(nframes, sizeof(starpu_data_handle_t)); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* register and partition all layers */ unsigned frame; for (frame = 0; frame < nframes; frame++) { /* register Y layer */ starpu_matrix_data_register(&frame_y_handle[frame], STARPU_MAIN_RAM, (uintptr_t)&yuv_in_buffer[frame].y, WIDTH, WIDTH, HEIGHT, sizeof(uint8_t)); starpu_data_partition(frame_y_handle[frame], &filter_y); starpu_matrix_data_register(&new_frame_y_handle[frame], STARPU_MAIN_RAM, (uintptr_t)&yuv_out_buffer[frame].y, NEW_WIDTH, NEW_WIDTH, NEW_HEIGHT, sizeof(uint8_t)); starpu_data_partition(new_frame_y_handle[frame], &filter_y); /* register U layer */ starpu_matrix_data_register(&frame_u_handle[frame], STARPU_MAIN_RAM, (uintptr_t)&yuv_in_buffer[frame].u, WIDTH/2, WIDTH/2, HEIGHT/2, sizeof(uint8_t)); starpu_data_partition(frame_u_handle[frame], &filter_uv); starpu_matrix_data_register(&new_frame_u_handle[frame], STARPU_MAIN_RAM, (uintptr_t)&yuv_out_buffer[frame].u, NEW_WIDTH/2, NEW_WIDTH/2, NEW_HEIGHT/2, sizeof(uint8_t)); starpu_data_partition(new_frame_u_handle[frame], &filter_uv); /* register V layer */ starpu_matrix_data_register(&frame_v_handle[frame], STARPU_MAIN_RAM, (uintptr_t)&yuv_in_buffer[frame].v, WIDTH/2, WIDTH/2, HEIGHT/2, sizeof(uint8_t)); starpu_data_partition(frame_v_handle[frame], &filter_uv); starpu_matrix_data_register(&new_frame_v_handle[frame], STARPU_MAIN_RAM, (uintptr_t)&yuv_out_buffer[frame].v, NEW_WIDTH/2, NEW_WIDTH/2, NEW_HEIGHT/2, sizeof(uint8_t)); starpu_data_partition(new_frame_v_handle[frame], &filter_uv); } /* how many tasks are there ? */ unsigned nblocks_y = filter_y.nchildren; unsigned nblocks_uv = filter_uv.nchildren; unsigned ntasks = (nblocks_y + 2*nblocks_uv)*nframes; fprintf(stderr, "Start computation: there will be %u tasks for %u frames\n", ntasks, nframes); start = starpu_timing_now(); /* do the computation */ for (frame = 0; frame < nframes; frame++) { starpu_iteration_push(frame); unsigned blocky; for (blocky = 0; blocky < nblocks_y; blocky++) { struct starpu_task *task = starpu_task_create(); task->cl = &ds_codelet; /* input */ task->handles[0] = starpu_data_get_sub_data(frame_y_handle[frame], 1, blocky); /* output */ task->handles[1] = starpu_data_get_sub_data(new_frame_y_handle[frame], 1, blocky); ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } unsigned blocku; for (blocku = 0; blocku < nblocks_uv; blocku++) { struct starpu_task *task = starpu_task_create(); task->cl = &ds_codelet; /* input */ task->handles[0] = starpu_data_get_sub_data(frame_u_handle[frame], 1, blocku); /* output */ task->handles[1] = starpu_data_get_sub_data(new_frame_u_handle[frame], 1, blocku); ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } unsigned blockv; for (blockv = 0; blockv < nblocks_uv; blockv++) { struct starpu_task *task = starpu_task_create(); task->cl = &ds_codelet; /* input */ task->handles[0] = starpu_data_get_sub_data(frame_v_handle[frame], 1, blockv); /* output */ task->handles[1] = starpu_data_get_sub_data(new_frame_v_handle[frame], 1, blockv); ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_iteration_pop(); } /* make sure all output buffers are sync'ed */ for (frame = 0; frame < nframes; frame++) { starpu_data_unregister(frame_y_handle[frame]); starpu_data_unregister(frame_u_handle[frame]); starpu_data_unregister(frame_v_handle[frame]); starpu_data_unregister(new_frame_y_handle[frame]); starpu_data_unregister(new_frame_u_handle[frame]); starpu_data_unregister(new_frame_v_handle[frame]); } /* There is an implicit barrier: the unregister methods will block * until the computation is done and that the result was put back into * memory. */ end = starpu_timing_now(); double timing = end - start; printf("# s\tFPS\n"); printf("%f\t%f\n", timing/1000000, (1000000*nframes)/timing); fwrite(yuv_out_buffer, NEW_FRAMESIZE, nframes, f_out); /* partition the layers into smaller parts */ starpu_shutdown(); if (fclose(f_in) != 0) fprintf(stderr, "Could not close %s properly\n", filename_in); if (fclose(f_out) != 0) fprintf(stderr, "Could not close %s properly\n", filename_out); return 0; } starpu-1.2.3+dfsg/examples/ppm_downscaler/yuv_downscaler.h000066400000000000000000000021241320135501600240150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010, 2011 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #define WIDTH 1920 #define HEIGHT 1080 #define FACTOR 2 #define NEW_WIDTH (WIDTH/FACTOR) #define NEW_HEIGHT (HEIGHT/FACTOR) #define BLOCK_HEIGHT 20 #include struct yuv_frame { uint8_t y[WIDTH*HEIGHT]; uint8_t u[(WIDTH*HEIGHT)/4]; uint8_t v[(WIDTH*HEIGHT)/4]; }; struct yuv_new_frame { uint8_t y[NEW_WIDTH*NEW_HEIGHT]; uint8_t u[(NEW_WIDTH*NEW_HEIGHT)/4]; uint8_t v[(NEW_WIDTH*NEW_HEIGHT)/4]; }; starpu-1.2.3+dfsg/examples/profiling/000077500000000000000000000000001320135501600175555ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/profiling/profiling.c000066400000000000000000000106271320135501600217200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This examplifies how to get task execution profiling from the application. */ #include #include #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #ifdef STARPU_QUICK_CHECK static unsigned niter = 50; #else static unsigned niter = 500; #endif void sleep_codelet(STARPU_ATTRIBUTE_UNUSED void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { usleep(1000); } int main(int argc, char **argv) { int ret; if (argc == 2) niter = atoi(argv[1]); ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* Enable profiling */ starpu_profiling_status_set(STARPU_PROFILING_ENABLE); #ifdef STARPU_QUICK_CHECK /* We should observe at least 50ms in the sleep time reported by every * worker. */ usleep(50000); #else /* We should observe at least 500ms in the sleep time reported by every * worker. */ usleep(500000); #endif struct starpu_codelet cl = { .cpu_funcs = {sleep_codelet}, .cpu_funcs_name = {"sleep_codelet"}, .cuda_funcs = {sleep_codelet}, .opencl_funcs = {sleep_codelet}, .nbuffers = 0, .name = "sleep" }; struct starpu_task **tasks = (struct starpu_task **) malloc(niter*sizeof(struct starpu_task *)); assert(tasks); unsigned i; for (i = 0; i < niter; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &cl; /* We will destroy the task structure by hand so that we can * query the profiling info before the task is destroyed. */ task->destroy = 0; tasks[i] = task; ret = starpu_task_submit(task); if (STARPU_UNLIKELY(ret == -ENODEV)) { FPRINTF(stderr, "No worker may execute this task\n"); exit(0); } } starpu_task_wait_for_all(); double delay_sum = 0.0; double length_sum = 0.0; for (i = 0; i < niter; i++) { struct starpu_task *task = tasks[i]; struct starpu_profiling_task_info *info = task->profiling_info; /* How much time did it take before the task started ? */ delay_sum += starpu_timing_timespec_delay_us(&info->submit_time, &info->start_time); /* How long was the task execution ? */ length_sum += starpu_timing_timespec_delay_us(&info->start_time, &info->end_time); /* We don't need the task structure anymore */ starpu_task_destroy(task); } free(tasks); FPRINTF(stderr, "Avg. delay : %2.2lf us\n", (delay_sum)/niter); FPRINTF(stderr, "Avg. length : %2.2lf us\n", (length_sum)/niter); /* Display the occupancy of all workers during the test */ unsigned worker; for (worker = 0; worker < starpu_worker_get_count(); worker++) { struct starpu_profiling_worker_info worker_info; ret = starpu_profiling_worker_get_info(worker, &worker_info); STARPU_ASSERT(!ret); double total_time = starpu_timing_timespec_to_us(&worker_info.total_time); double executing_time = starpu_timing_timespec_to_us(&worker_info.executing_time); double sleeping_time = starpu_timing_timespec_to_us(&worker_info.sleeping_time); double overhead_time = total_time - executing_time - sleeping_time; float executing_ratio = 100.0*executing_time/total_time; float sleeping_ratio = 100.0*sleeping_time/total_time; float overhead_ratio = 100.0 - executing_ratio - sleeping_ratio; char workername[128]; starpu_worker_get_name(worker, workername, 128); FPRINTF(stderr, "Worker %s:\n", workername); FPRINTF(stderr, "\ttotal time : %.2lf ms\n", total_time*1e-3); FPRINTF(stderr, "\texec time : %.2lf ms (%.2f %%)\n", executing_time*1e-3, executing_ratio); FPRINTF(stderr, "\tblocked time : %.2lf ms (%.2f %%)\n", sleeping_time*1e-3, sleeping_ratio); FPRINTF(stderr, "\toverhead time: %.2lf ms (%.2f %%)\n", overhead_time*1e-3, overhead_ratio); } starpu_shutdown(); return 0; } starpu-1.2.3+dfsg/examples/reductions/000077500000000000000000000000001320135501600177435ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/reductions/dot_product.c000066400000000000000000000302401320135501600224340ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2015 Université de Bordeaux * Copyright (C) 2012 INRIA * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This computes the dot product of a big vector, using data reduction to * optimize the dot reduction. */ #include #include #include #include #ifdef STARPU_USE_CUDA #include #include #endif #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) static float *_x; static float *_y; static starpu_data_handle_t *_x_handles; static starpu_data_handle_t *_y_handles; #ifdef STARPU_USE_OPENCL static struct starpu_opencl_program _opencl_program; #endif #ifdef STARPU_QUICK_CHECK static unsigned _nblocks = 512; #else static unsigned _nblocks = 4096; #endif static unsigned _entries_per_block = 1024; static DOT_TYPE _dot = 0.0f; static starpu_data_handle_t _dot_handle; #ifdef STARPU_USE_CUDA static int cublas_version; #endif static int can_execute(unsigned workerid, struct starpu_task *task, unsigned nimpl) { enum starpu_worker_archtype type = starpu_worker_get_type(workerid); if (type == STARPU_CPU_WORKER || type == STARPU_OPENCL_WORKER || type == STARPU_MIC_WORKER || STARPU_SCC_WORKER) return 1; #ifdef STARPU_USE_CUDA #ifdef STARPU_SIMGRID /* We don't know, let's assume it can */ return 1; #else /* Cuda device */ const struct cudaDeviceProp *props; props = starpu_cuda_get_device_properties(workerid); if (props->major >= 2 || props->minor >= 3) /* At least compute capability 1.3, supports doubles */ return 1; #endif #endif /* Old card, does not support doubles */ return 0; } /* * Codelet to create a neutral element */ void init_cpu_func(void *descr[], void *cl_arg) { DOT_TYPE *dot = (DOT_TYPE *)STARPU_VARIABLE_GET_PTR(descr[0]); *dot = 0.0f; } #ifdef STARPU_USE_CUDA void init_cuda_func(void *descr[], void *cl_arg) { DOT_TYPE *dot = (DOT_TYPE *)STARPU_VARIABLE_GET_PTR(descr[0]); cudaMemsetAsync(dot, 0, sizeof(DOT_TYPE), starpu_cuda_get_local_stream()); } #endif #ifdef STARPU_USE_OPENCL void init_opencl_func(void *buffers[], void *args) { cl_int err; cl_command_queue queue; cl_mem dot = (cl_mem) STARPU_VARIABLE_GET_PTR(buffers[0]); starpu_opencl_get_current_queue(&queue); DOT_TYPE zero = (DOT_TYPE) 0.0; err = clEnqueueWriteBuffer(queue, dot, CL_TRUE, 0, sizeof(DOT_TYPE), &zero, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } #endif static struct starpu_codelet init_codelet = { .can_execute = can_execute, .cpu_funcs = {init_cpu_func}, .cpu_funcs_name = {"init_cpu_func"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {init_cuda_func}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {init_opencl_func}, #endif .modes = {STARPU_W}, .nbuffers = 1, .name = "init", }; /* * Codelet to perform the reduction of two elements */ void redux_cpu_func(void *descr[], void *cl_arg) { DOT_TYPE *dota = (DOT_TYPE *)STARPU_VARIABLE_GET_PTR(descr[0]); DOT_TYPE *dotb = (DOT_TYPE *)STARPU_VARIABLE_GET_PTR(descr[1]); *dota = *dota + *dotb; } #ifdef STARPU_USE_CUDA extern void redux_cuda_func(void *descr[], void *_args); #endif #ifdef STARPU_USE_OPENCL void redux_opencl_func(void *buffers[], void *args) { int id, devid; cl_int err; cl_kernel kernel; cl_command_queue queue; cl_mem dota = (cl_mem) STARPU_VARIABLE_GET_PTR(buffers[0]); cl_mem dotb = (cl_mem) STARPU_VARIABLE_GET_PTR(buffers[1]); id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &_opencl_program, "_redux_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 0, sizeof(dota), &dota); err|= clSetKernelArg(kernel, 1, sizeof(dotb), &dotb); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=1; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local=global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } starpu_opencl_release_kernel(kernel); } #endif static struct starpu_codelet redux_codelet = { .can_execute = can_execute, .cpu_funcs = {redux_cpu_func}, .cpu_funcs_name = {"redux_cpu_func"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {redux_cuda_func}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {redux_opencl_func}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .modes = {STARPU_RW, STARPU_R}, .nbuffers = 2, .name = "redux" }; /* * Dot product codelet */ void dot_cpu_func(void *descr[], void *cl_arg) { float *local_x = (float *)STARPU_VECTOR_GET_PTR(descr[0]); float *local_y = (float *)STARPU_VECTOR_GET_PTR(descr[1]); DOT_TYPE *dot = (DOT_TYPE *)STARPU_VARIABLE_GET_PTR(descr[2]); unsigned n = STARPU_VECTOR_GET_NX(descr[0]); DOT_TYPE local_dot = 0.0; unsigned i; for (i = 0; i < n; i++) { local_dot += (DOT_TYPE)local_x[i]*(DOT_TYPE)local_y[i]; } *dot = *dot + local_dot; } #ifdef STARPU_USE_CUDA void dot_cuda_func(void *descr[], void *cl_arg) { DOT_TYPE current_dot; float local_dot; float *local_x = (float *)STARPU_VECTOR_GET_PTR(descr[0]); float *local_y = (float *)STARPU_VECTOR_GET_PTR(descr[1]); DOT_TYPE *dot = (DOT_TYPE *)STARPU_VARIABLE_GET_PTR(descr[2]); unsigned n = STARPU_VECTOR_GET_NX(descr[0]); cudaMemcpyAsync(¤t_dot, dot, sizeof(DOT_TYPE), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); cublasStatus_t status = cublasSdot(starpu_cublas_get_local_handle(), n, local_x, 1, local_y, 1, &local_dot); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); cudaStreamSynchronize(starpu_cuda_get_local_stream()); /* FPRINTF(stderr, "current_dot %f local dot %f -> %f\n", current_dot, local_dot, current_dot + local_dot); */ current_dot += local_dot; cudaMemcpyAsync(dot, ¤t_dot, sizeof(DOT_TYPE), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } #endif #ifdef STARPU_USE_OPENCL void dot_opencl_func(void *buffers[], void *args) { int id, devid; cl_int err; cl_kernel kernel; cl_command_queue queue; cl_mem x = (cl_mem) STARPU_VECTOR_GET_DEV_HANDLE(buffers[0]); cl_mem y = (cl_mem) STARPU_VECTOR_GET_DEV_HANDLE(buffers[1]); cl_mem dot = (cl_mem) STARPU_VARIABLE_GET_PTR(buffers[2]); unsigned n = STARPU_VECTOR_GET_NX(buffers[0]); id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &_opencl_program, "_dot_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 0, sizeof(x), &x); err|= clSetKernelArg(kernel, 1, sizeof(y), &y); err|= clSetKernelArg(kernel, 2, sizeof(dot), &dot); err|= clSetKernelArg(kernel, 3, sizeof(n), &n); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=1; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local=global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } starpu_opencl_release_kernel(kernel); } #endif static struct starpu_codelet dot_codelet = { .can_execute = can_execute, .cpu_funcs = {dot_cpu_func}, .cpu_funcs_name = {"dot_cpu_func"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {dot_cuda_func}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {dot_opencl_func}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .nbuffers = 3, .modes = {STARPU_R, STARPU_R, STARPU_REDUX}, .name = "dot" }; /* * Tasks initialization */ int main(int argc, char **argv) { int ret; /* Not supported yet */ if (starpu_get_env_number_default("STARPU_GLOBAL_ARBITER", 0) > 0) return 77; ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_load_opencl_from_file("examples/reductions/dot_product_opencl_kernels.cl", &_opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif #ifdef STARPU_USE_CUDA unsigned devices = starpu_cuda_worker_get_count(); if (devices) { cublasHandle_t handle; cublasCreate(&handle); cublasGetVersion(handle, &cublas_version); cublasDestroy(handle); if (cublas_version >= 7050) starpu_cublas_init(); else /* Disable the sdot cublas kernel, it is bogus with a * non-blocking stream (Nvidia bugid 1669886) */ dot_codelet.cuda_funcs[0] = NULL; } #endif unsigned long nelems = _nblocks*_entries_per_block; size_t size = nelems*sizeof(float); _x = (float *) malloc(size); _y = (float *) malloc(size); _x_handles = (starpu_data_handle_t *) calloc(_nblocks, sizeof(starpu_data_handle_t)); _y_handles = (starpu_data_handle_t *) calloc(_nblocks, sizeof(starpu_data_handle_t)); assert(_x && _y); starpu_srand48(0); DOT_TYPE reference_dot = 0.0; unsigned long i; for (i = 0; i < nelems; i++) { _x[i] = (float)starpu_drand48(); _y[i] = (float)starpu_drand48(); reference_dot += (DOT_TYPE)_x[i]*(DOT_TYPE)_y[i]; } unsigned block; for (block = 0; block < _nblocks; block++) { starpu_vector_data_register(&_x_handles[block], STARPU_MAIN_RAM, (uintptr_t)&_x[_entries_per_block*block], _entries_per_block, sizeof(float)); starpu_vector_data_register(&_y_handles[block], STARPU_MAIN_RAM, (uintptr_t)&_y[_entries_per_block*block], _entries_per_block, sizeof(float)); } starpu_variable_data_register(&_dot_handle, STARPU_MAIN_RAM, (uintptr_t)&_dot, sizeof(DOT_TYPE)); /* * Compute dot product with StarPU */ starpu_data_set_reduction_methods(_dot_handle, &redux_codelet, &init_codelet); for (block = 0; block < _nblocks; block++) { struct starpu_task *task = starpu_task_create(); task->cl = &dot_codelet; task->destroy = 1; task->handles[0] = _x_handles[block]; task->handles[1] = _y_handles[block]; task->handles[2] = _dot_handle; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_ASSERT(!ret); } for (block = 0; block < _nblocks; block++) { starpu_data_unregister(_x_handles[block]); starpu_data_unregister(_y_handles[block]); } starpu_data_unregister(_dot_handle); FPRINTF(stderr, "Reference : %e vs. %e (Delta %e)\n", reference_dot, _dot, reference_dot - _dot); #ifdef STARPU_USE_CUDA if (cublas_version >= 7050) starpu_cublas_shutdown(); #endif #ifdef STARPU_USE_OPENCL ret = starpu_opencl_unload_opencl(&_opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); #endif starpu_shutdown(); free(_x); free(_y); free(_x_handles); free(_y_handles); if (fabs(reference_dot - _dot) < reference_dot * 1e-6) return EXIT_SUCCESS; else return EXIT_FAILURE; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ return 77; } starpu-1.2.3+dfsg/examples/reductions/dot_product.h000066400000000000000000000014251320135501600224440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 Université de Bordeaux * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef DOT_PRODUCT_H__ #define DOT_PRODUCT_H__ #define DOT_TYPE double #endif /* DOT_PRODUCT_H__ */ starpu-1.2.3+dfsg/examples/reductions/dot_product_kernels.cu000066400000000000000000000021251320135501600243450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Trivial dot reduction CUDA kernel */ #include #define DOT_TYPE double static __global__ void cuda_redux(DOT_TYPE *dota, DOT_TYPE *dotb) { *dota = *dota + *dotb; return; } extern "C" void redux_cuda_func(void *descr[], void *_args) { (void)_args; DOT_TYPE *dota = (DOT_TYPE *)STARPU_VARIABLE_GET_PTR(descr[0]); DOT_TYPE *dotb = (DOT_TYPE *)STARPU_VARIABLE_GET_PTR(descr[1]); cuda_redux<<<1,1, 0, starpu_cuda_get_local_stream()>>>(dota, dotb); } starpu-1.2.3+dfsg/examples/reductions/dot_product_opencl_kernels.cl000066400000000000000000000021451320135501600256760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Trivial dot reduction OpenCL kernel */ #include "dot_product.h" #pragma OPENCL EXTENSION cl_khr_fp64 : enable __kernel void _redux_opencl(__global DOT_TYPE *dota, __global DOT_TYPE *dotb) { const int i = get_global_id(0); *dota += *dotb; } __kernel void _dot_opencl(__global float *x, __global float *y, __global DOT_TYPE *dot, unsigned n) { unsigned i; __local double tmp; tmp = 0.0; for (i = 0; i < n ; i++) tmp += x[i]*y[i]; *dot += tmp; } starpu-1.2.3+dfsg/examples/reductions/minmax_reduction.c000066400000000000000000000130411320135501600234530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2013, 2015 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This computes the minimum and maximum values of a big vector, using data * reduction to optimize the computation. */ #include #include #include #include #ifdef STARPU_QUICK_CHECK static unsigned _nblocks = 512; static unsigned _entries_per_bock = 64; #else static unsigned _nblocks = 8192; static unsigned _entries_per_bock = 1024; #endif #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #define TYPE double #define TYPE_MAX DBL_MAX #define TYPE_MIN DBL_MIN static TYPE *_x; static starpu_data_handle_t *_x_handles; /* The first element (resp. second) stores the min element (resp. max). */ static TYPE _minmax[2]; static starpu_data_handle_t _minmax_handle; /* * Codelet to create a neutral element */ void minmax_neutral_cpu_func(void *descr[], void *cl_arg) { TYPE *array = (TYPE *)STARPU_VARIABLE_GET_PTR(descr[0]); /* Initialize current min to the greatest possible value. */ array[0] = TYPE_MAX; /* Initialize current max to the smallest possible value. */ array[1] = TYPE_MIN; } static struct starpu_codelet minmax_init_codelet = { .cpu_funcs = {minmax_neutral_cpu_func}, .cpu_funcs_name = {"minmax_neutral_cpu_func"}, .modes = {STARPU_W}, .nbuffers = 1, .name = "init" }; /* * Codelet to perform the reduction of two elements */ void minmax_redux_cpu_func(void *descr[], void *cl_arg) { TYPE *array_dst = (TYPE *)STARPU_VARIABLE_GET_PTR(descr[0]); TYPE *array_src = (TYPE *)STARPU_VARIABLE_GET_PTR(descr[1]); /* Compute the min value */ TYPE min_dst = array_dst[0]; TYPE min_src = array_src[0]; array_dst[0] = STARPU_MIN(min_dst, min_src); /* Compute the max value */ TYPE max_dst = array_dst[1]; TYPE max_src = array_src[1]; array_dst[1] = STARPU_MAX(max_dst, max_src); } static struct starpu_codelet minmax_redux_codelet = { .cpu_funcs = {minmax_redux_cpu_func}, .cpu_funcs_name = {"minmax_redux_cpu_func"}, .modes = {STARPU_RW, STARPU_R}, .nbuffers = 2, .name = "redux" }; /* * Compute max/min within a vector and update the min/max value */ void minmax_cpu_func(void *descr[], void *cl_arg) { /* The array containing the values */ TYPE *local_array = (TYPE *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned n = STARPU_VECTOR_GET_NX(descr[0]); TYPE *minmax = (TYPE *)STARPU_VARIABLE_GET_PTR(descr[1]); TYPE local_min = minmax[0]; TYPE local_max = minmax[1]; /* Compute the min and the max elements in the array */ unsigned i; for (i = 0; i < n; i++) { TYPE val = local_array[i]; local_min = STARPU_MIN(local_min, val); local_max = STARPU_MAX(local_max, val); } minmax[0] = local_min; minmax[1] = local_max; } static struct starpu_codelet minmax_codelet = { .cpu_funcs = {minmax_cpu_func}, .cpu_funcs_name = {"minmax_cpu_func"}, .nbuffers = 2, .modes = {STARPU_R, STARPU_REDUX}, .name = "minmax" }; /* * Tasks initialization */ int main(int argc, char **argv) { unsigned long i; int ret; /* Not supported yet */ if (starpu_get_env_number_default("STARPU_GLOBAL_ARBITER", 0) > 0) return 77; ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); unsigned long nelems = _nblocks*_entries_per_bock; size_t size = nelems*sizeof(TYPE); _x = (TYPE *) malloc(size); _x_handles = (starpu_data_handle_t *) calloc(_nblocks, sizeof(starpu_data_handle_t)); assert(_x && _x_handles); /* Initialize the vector with random values */ starpu_srand48(0); for (i = 0; i < nelems; i++) _x[i] = (TYPE)starpu_drand48(); unsigned block; for (block = 0; block < _nblocks; block++) { uintptr_t block_start = (uintptr_t)&_x[_entries_per_bock*block]; starpu_vector_data_register(&_x_handles[block], STARPU_MAIN_RAM, block_start, _entries_per_bock, sizeof(TYPE)); } /* Initialize current min */ _minmax[0] = TYPE_MAX; /* Initialize current max */ _minmax[1] = TYPE_MIN; starpu_variable_data_register(&_minmax_handle, STARPU_MAIN_RAM, (uintptr_t)_minmax, 2*sizeof(TYPE)); /* Set the methods to define neutral elements and to perform the reduction operation */ starpu_data_set_reduction_methods(_minmax_handle, &minmax_redux_codelet, &minmax_init_codelet); for (block = 0; block < _nblocks; block++) { struct starpu_task *task = starpu_task_create(); task->cl = &minmax_codelet; task->handles[0] = _x_handles[block]; task->handles[1] = _minmax_handle; ret = starpu_task_submit(task); if (ret) { STARPU_ASSERT(ret == -ENODEV); FPRINTF(stderr, "This test can only run on CPUs, but there are no CPU workers (this is not a bug).\n"); return 77; } } for (block = 0; block < _nblocks; block++) { starpu_data_unregister(_x_handles[block]); } starpu_data_unregister(_minmax_handle); FPRINTF(stderr, "Min : %e\n", _minmax[0]); FPRINTF(stderr, "Max : %e\n", _minmax[1]); STARPU_ASSERT(_minmax[0] <= _minmax[1]); free(_x); free(_x_handles); starpu_shutdown(); return 0; } starpu-1.2.3+dfsg/examples/sched_ctx/000077500000000000000000000000001320135501600175305ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/sched_ctx/dummy_sched_with_ctx.c000066400000000000000000000140171320135501600241110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2017 Université de Bordeaux * Copyright (C) 2010-2013, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This is an example of an application-defined scheduler run inside a * scheduling context. * This is a mere eager scheduler with a centralized list of tasks to schedule: * when a task becomes ready (push) it is put on the list. When a device * becomes ready (pop), a task is taken from the list. */ #include #include #include #ifdef STARPU_QUICK_CHECK #define NTASKS 320 #elif !defined(STARPU_LONG_CHECK) #define NTASKS 3200 #else #define NTASKS 32000 #endif #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) struct dummy_sched_data { struct starpu_task_list sched_list; starpu_pthread_mutex_t policy_mutex; }; static void init_dummy_sched(unsigned sched_ctx_id) { starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); struct dummy_sched_data *data = (struct dummy_sched_data*)malloc(sizeof(struct dummy_sched_data)); /* Create a linked-list of tasks and a condition variable to protect it */ starpu_task_list_init(&data->sched_list); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)data); STARPU_PTHREAD_MUTEX_INIT(&data->policy_mutex, NULL); FPRINTF(stderr, "Initialising Dummy scheduler\n"); } static void deinit_dummy_sched(unsigned sched_ctx_id) { struct dummy_sched_data *data = (struct dummy_sched_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); STARPU_ASSERT(starpu_task_list_empty(&data->sched_list)); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); STARPU_PTHREAD_MUTEX_DESTROY(&data->policy_mutex); free(data); FPRINTF(stderr, "Destroying Dummy scheduler\n"); } static int push_task_dummy(struct starpu_task *task) { unsigned sched_ctx_id = task->sched_ctx; struct dummy_sched_data *data = (struct dummy_sched_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); /* NB: In this simplistic strategy, we assume that the context in which we push task has at least one worker*/ /* lock all workers when pushing tasks on a list where all of them would pop for tasks */ STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); starpu_task_list_push_front(&data->sched_list, task); starpu_push_task_end(task); STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); /*if there are no tasks block */ /* wake people waiting for a task */ struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { unsigned worker; worker = workers->get_next(workers, &it); starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(worker, &sched_mutex, &sched_cond); STARPU_PTHREAD_MUTEX_LOCK(sched_mutex); STARPU_PTHREAD_COND_SIGNAL(sched_cond); STARPU_PTHREAD_MUTEX_UNLOCK(sched_mutex); } return 0; } /* The mutex associated to the calling worker is already taken by StarPU */ static struct starpu_task *pop_task_dummy(unsigned sched_ctx_id) { /* NB: In this simplistic strategy, we assume that all workers are able * to execute all tasks, otherwise, it would have been necessary to go * through the entire list until we find a task that is executable from * the calling worker. So we just take the head of the list and give it * to the worker. */ struct dummy_sched_data *data = (struct dummy_sched_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); #ifdef STARPU_NON_BLOCKING_DRIVERS if (starpu_task_list_empty(&data->sched_list)) return NULL; #endif STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); struct starpu_task *task = NULL; if (!starpu_task_list_empty(&data->sched_list)) task = starpu_task_list_pop_back(&data->sched_list); STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); return task; } static struct starpu_sched_policy dummy_sched_policy = { .init_sched = init_dummy_sched, .add_workers = NULL, .remove_workers = NULL, .deinit_sched = deinit_dummy_sched, .push_task = push_task_dummy, .pop_task = pop_task_dummy, .post_exec_hook = NULL, .pop_every_task = NULL, .policy_name = "dummy", .policy_description = "dummy scheduling strategy" }; void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .model = NULL, .nbuffers = 0, .name = "dummy", }; int main(int argc, char **argv) { int ntasks = NTASKS; int ret; /* struct starpu_conf conf; */ /* starpu_conf_init(&conf); */ /* conf.sched_policy = &dummy_sched_policy, */ ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); unsigned sched_ctx = starpu_sched_ctx_create(NULL, -1, "dummy", STARPU_SCHED_CTX_POLICY_STRUCT, &dummy_sched_policy, 0); #ifdef STARPU_QUICK_CHECK ntasks /= 100; #endif starpu_sched_ctx_set_context(&sched_ctx); int i; for (i = 0; i < ntasks; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &dummy_codelet; task->cl_arg = NULL; ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_task_wait_for_all(); starpu_shutdown(); return 0; } starpu-1.2.3+dfsg/examples/sched_ctx/nested_sched_ctxs.c000066400000000000000000000135361320135501600233750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2015 Université de Bordeaux * Copyright (C) 2010-2014, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #ifdef STARPU_QUICK_CHECK #define NTASKS 64 #else #define NTASKS 100 #endif int tasks_executed[2]; int parallel_code(int sched_ctx) { int i; int t = 0; int *cpuids = NULL; int ncpuids = 0; starpu_sched_ctx_get_available_cpuids(sched_ctx, &cpuids, &ncpuids); // printf("execute task of %d threads \n", ncpuids); #pragma omp parallel num_threads(ncpuids) { starpu_sched_ctx_bind_current_thread_to_cpuid(cpuids[omp_get_thread_num()]); // printf("cpu = %d ctx%d nth = %d\n", sched_getcpu(), sched_ctx, omp_get_num_threads()); #pragma omp for for(i = 0; i < NTASKS; i++) t++; } free(cpuids); return t; } static void sched_ctx_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg) { int w = starpu_worker_get_id(); (void) w; unsigned sched_ctx = (uintptr_t)arg; int n = parallel_code(sched_ctx); (void) n; //printf("w %d executed %d it \n", w, n); } static struct starpu_codelet sched_ctx_codelet = { .cpu_funcs = {sched_ctx_func}, .model = NULL, .nbuffers = 0, .name = "sched_ctx" }; int main(int argc, char **argv) { tasks_executed[0] = 0; tasks_executed[1] = 0; int ntasks = NTASKS; int ret, j, k; unsigned ncpus = 0; ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); int nprocs1 = 1; int nprocs2 = 1; int *procs1, *procs2; #ifdef STARPU_USE_CPU ncpus = starpu_cpu_worker_get_count(); procs1 = (int*)malloc(ncpus*sizeof(int)); starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, procs1, ncpus); if (ncpus > 1) { nprocs1 = ncpus/2; nprocs2 = nprocs1; k = 0; procs2 = (int*)malloc(nprocs2*sizeof(int)); for(j = nprocs1; j < nprocs1+nprocs2; j++) procs2[k++] = procs1[j]; } else { procs2 = (int*)malloc(nprocs2*sizeof(int)); procs2[0] = procs1[0]; } #endif if (ncpus == 0) { #ifdef STARPU_USE_CPU free(procs1); free(procs2); #endif starpu_shutdown(); return 77; } /*create contexts however you want*/ unsigned sched_ctx1 = starpu_sched_ctx_create(procs1, nprocs1, "ctx1", STARPU_SCHED_CTX_POLICY_NAME, "eager", 0); unsigned sched_ctx2 = starpu_sched_ctx_create(procs2, nprocs2, "ctx2", STARPU_SCHED_CTX_POLICY_NAME, "dmda", 0); /*indicate what to do with the resources when context 2 finishes (it depends on your application)*/ // starpu_sched_ctx_set_inheritor(sched_ctx2, sched_ctx1); int nprocs3 = nprocs1/2; int nprocs4 = nprocs1/2; int nprocs5 = nprocs2/2; int nprocs6 = nprocs2/2; int *procs3 = NULL; int *procs4 = NULL; int *procs5 = NULL; int *procs6 = NULL; if (nprocs3) procs3 = malloc(nprocs3 * sizeof(*procs3)); if (nprocs4) procs4 = malloc(nprocs4 * sizeof(*procs4)); if (nprocs5) procs5 = malloc(nprocs5 * sizeof(*procs5)); if (nprocs6) procs6 = malloc(nprocs6 * sizeof(*procs6)); k = 0; for(j = 0; j < nprocs3; j++) procs3[k++] = procs1[j]; k = 0; for(j = nprocs3; j < nprocs3+nprocs4; j++) procs4[k++] = procs1[j]; k = 0; for(j = 0; j < nprocs5; j++) procs5[k++] = procs2[j]; k = 0; for(j = nprocs5; j < nprocs5+nprocs6; j++) procs6[k++] = procs2[j]; int sched_ctx3 = -1; int sched_ctx4 = -1; int sched_ctx5 = -1; int sched_ctx6 = -1; if (nprocs3) sched_ctx3 = starpu_sched_ctx_create(procs3, nprocs3, "ctx3", STARPU_SCHED_CTX_NESTED, sched_ctx1, 0); if (nprocs4) sched_ctx4 = starpu_sched_ctx_create(procs4, nprocs4, "ctx4", STARPU_SCHED_CTX_NESTED, sched_ctx1, 0); if (nprocs5) sched_ctx5 = starpu_sched_ctx_create(procs5, nprocs5, "ctx5", STARPU_SCHED_CTX_NESTED, sched_ctx2, 0); if (nprocs6) sched_ctx6 = starpu_sched_ctx_create(procs6, nprocs6, "ctx6", STARPU_SCHED_CTX_NESTED, sched_ctx2, 0); int i; for (i = 0; i < ntasks; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &sched_ctx_codelet; task->cl_arg = (void*)(uintptr_t) sched_ctx1; task->possibly_parallel = 1; /*submit tasks to context*/ ret = starpu_task_submit_to_ctx(task,sched_ctx1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } for (i = 0; i < ntasks; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &sched_ctx_codelet; task->cl_arg = (void*)(uintptr_t) sched_ctx2; task->possibly_parallel = 1; /*submit tasks to context*/ ret = starpu_task_submit_to_ctx(task,sched_ctx2); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } /* tell starpu when you finished submitting tasks to this context in order to allow moving resources from this context to the inheritor one when its corresponding tasks finished executing */ /* wait for all tasks at the end*/ starpu_task_wait_for_all(); if (nprocs3) { starpu_sched_ctx_delete(sched_ctx3); free(procs3); } if (nprocs4) { starpu_sched_ctx_delete(sched_ctx4); free(procs4); } if (nprocs5) { starpu_sched_ctx_delete(sched_ctx5); free(procs5); } if (nprocs6) { starpu_sched_ctx_delete(sched_ctx6); free(procs6); } starpu_sched_ctx_delete(sched_ctx1); starpu_sched_ctx_delete(sched_ctx2); printf("ctx%u: tasks starpu executed %d out of %d\n", sched_ctx1, tasks_executed[0], NTASKS); printf("ctx%u: tasks starpu executed %d out of %d\n", sched_ctx2, tasks_executed[1], NTASKS); #ifdef STARPU_USE_CPU free(procs1); free(procs2); #endif starpu_shutdown(); return 0; } starpu-1.2.3+dfsg/examples/sched_ctx/parallel_code.c000066400000000000000000000140011320135501600224560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2014, 2016 Université de Bordeaux * Copyright (C) 2010-2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #ifdef STARPU_QUICK_CHECK #define NTASKS 64 #else #define NTASKS 10 #endif int tasks_executed[2]; starpu_pthread_mutex_t mut; int parallel_code(int sched_ctx) { int i; int t = 0; int *cpuids = NULL; int ncpuids = 0; starpu_sched_ctx_get_available_cpuids(sched_ctx, &cpuids, &ncpuids); // printf("execute task of %d threads \n", ncpuids); #pragma omp parallel num_threads(ncpuids) { starpu_sched_ctx_bind_current_thread_to_cpuid(cpuids[omp_get_thread_num()]); // printf("cpu = %d ctx%d nth = %d\n", sched_getcpu(), sched_ctx, omp_get_num_threads()); #pragma omp for for(i = 0; i < NTASKS; i++) t++; } free(cpuids); return t; } static void sched_ctx_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg) { int w = starpu_worker_get_id(); unsigned sched_ctx = (unsigned)arg; int n = parallel_code(sched_ctx); printf("w %d executed %d it \n", w, n); } static struct starpu_codelet sched_ctx_codelet = { .cpu_funcs = {sched_ctx_func}, .model = NULL, .nbuffers = 0, .name = "sched_ctx" }; void *th(void* p) { unsigned sched_ctx = (unsigned)p; tasks_executed[sched_ctx-1] += (int)starpu_sched_ctx_exec_parallel_code((void*)parallel_code, (void*)sched_ctx, sched_ctx); } int main(int argc, char **argv) { tasks_executed[0] = 0; tasks_executed[1] = 0; int ntasks = NTASKS; int ret, j, k; ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_pthread_mutex_init(&mut, NULL); int nprocs1; int nprocs2; int *procs1, *procs2; #ifdef STARPU_USE_CPU unsigned ncpus = starpu_cpu_worker_get_count(); procs1 = (int*)malloc(ncpus*sizeof(int)); procs2 = (int*)malloc(ncpus*sizeof(int)); starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, procs1, ncpus); nprocs1 = ncpus/2; nprocs2 = nprocs1; k = 0; for(j = nprocs1; j < nprocs1+nprocs2; j++) procs2[k++] = j; #else nprocs1 = 1; nprocs2 = 1; procs1 = (int*)malloc(nprocs1*sizeof(int)); procs2 = (int*)malloc(nprocs2*sizeof(int)); procs1[0] = 0; procs2[0] = 0; #endif if (nprocs1 < 4) { /* Not enough procs */ free(procs1); free(procs2); starpu_shutdown(); return 77; } /*create contexts however you want*/ unsigned sched_ctx1 = starpu_sched_ctx_create(procs1, nprocs1, "ctx1", STARPU_SCHED_CTX_POLICY_NAME, "dmda", 0); unsigned sched_ctx2 = starpu_sched_ctx_create(procs2, nprocs2, "ctx2", STARPU_SCHED_CTX_POLICY_NAME, "dmda", 0); /*indicate what to do with the resources when context 2 finishes (it depends on your application)*/ // starpu_sched_ctx_set_inheritor(sched_ctx2, sched_ctx1); int nprocs3 = nprocs1/2; int nprocs4 = nprocs1/2; int nprocs5 = nprocs2/2; int nprocs6 = nprocs2/2; int procs3[nprocs3]; int procs4[nprocs4]; int procs5[nprocs5]; int procs6[nprocs6]; k = 0; for(j = 0; j < nprocs3; j++) procs3[k++] = procs1[j]; k = 0; for(j = nprocs3; j < nprocs3+nprocs4; j++) procs4[k++] = procs1[j]; k = 0; for(j = 0; j < nprocs5; j++) procs5[k++] = procs2[j]; k = 0; for(j = nprocs5; j < nprocs5+nprocs6; j++) procs6[k++] = procs2[j]; int master3 = starpu_sched_ctx_book_workers_for_task(sched_ctx1, procs3, nprocs3); int master4 = starpu_sched_ctx_book_workers_for_task(sched_ctx1, procs4, nprocs4); int master5 = starpu_sched_ctx_book_workers_for_task(sched_ctx2, procs5, nprocs5); int master6 = starpu_sched_ctx_book_workers_for_task(sched_ctx2, procs6, nprocs6); /* int master1 = starpu_sched_ctx_book_workers_for_task(procs1, nprocs1); */ /* int master2 = starpu_sched_ctx_book_workers_for_task(procs2, nprocs2); */ int i; for (i = 0; i < ntasks; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &sched_ctx_codelet; task->cl_arg = sched_ctx1; /*submit tasks to context*/ ret = starpu_task_submit_to_ctx(task,sched_ctx1); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } for (i = 0; i < ntasks; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &sched_ctx_codelet; task->cl_arg = sched_ctx2; /*submit tasks to context*/ ret = starpu_task_submit_to_ctx(task,sched_ctx2); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } /* tell starpu when you finished submitting tasks to this context in order to allow moving resources from this context to the inheritor one when its corresponding tasks finished executing */ enodev: /* wait for all tasks at the end*/ starpu_task_wait_for_all(); /* starpu_sched_ctx_unbook_workers_for_task(sched_ctx1, master1); */ /* starpu_sched_ctx_unbook_workers_for_task(sched_ctx2, master2); */ starpu_sched_ctx_unbook_workers_for_task(sched_ctx1, master3); starpu_sched_ctx_unbook_workers_for_task(sched_ctx1, master4); starpu_sched_ctx_unbook_workers_for_task(sched_ctx2, master5); starpu_sched_ctx_unbook_workers_for_task(sched_ctx2, master6); pthread_t mp[2]; pthread_create(&mp[0], NULL, th, sched_ctx1); pthread_create(&mp[1], NULL, th, sched_ctx2); pthread_join(mp[0], NULL); pthread_join(mp[1], NULL); starpu_sched_ctx_delete(sched_ctx1); starpu_sched_ctx_delete(sched_ctx2); printf("ctx%u: tasks starpu executed %d out of %d\n", sched_ctx1, tasks_executed[0], NTASKS); printf("ctx%u: tasks starpu executed %d out of %d\n", sched_ctx2, tasks_executed[1], NTASKS); starpu_shutdown(); free(procs1); free(procs2); return (ret == -ENODEV ? 77 : 0); } starpu-1.2.3+dfsg/examples/sched_ctx/parallel_tasks_reuse_handle.c000066400000000000000000000130421320135501600254130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015 INRIA * Copyright (C) 2015, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #ifdef STARPU_QUICK_CHECK #define NTASKS 64 #define SIZE 40 #define LOOPS 4 #else #define NTASKS 100 #define SIZE 400 #define LOOPS 10 #endif struct context { int ncpus; int *cpus; unsigned id; }; /* Helper for the task that will initiate everything */ void parallel_task_prologue_init_once_and_for_all(void * sched_ctx_) { int sched_ctx = *(int *)sched_ctx_; int *cpuids = NULL; int ncpuids = 0; starpu_sched_ctx_get_available_cpuids(sched_ctx, &cpuids, &ncpuids); #pragma omp parallel num_threads(ncpuids) { starpu_sched_ctx_bind_current_thread_to_cpuid(cpuids[omp_get_thread_num()]); } omp_set_num_threads(ncpuids); free(cpuids); return; } void noop(void * buffers[], void * cl_arg) { } static struct starpu_codelet init_parallel_worker_cl= { .cpu_funcs = {noop}, .nbuffers = 0, .name = "init_parallel_worker" }; /* function called to initialize the parallel "workers" */ void parallel_task_init_one_context(unsigned * context_id) { struct starpu_task * t; int ret; t = starpu_task_build(&init_parallel_worker_cl, STARPU_SCHED_CTX, *context_id, 0); t->destroy = 1; t->prologue_callback_pop_func=parallel_task_prologue_init_once_and_for_all; if (t->prologue_callback_pop_arg_free) free(t->prologue_callback_pop_arg); t->prologue_callback_pop_arg=context_id; t->prologue_callback_pop_arg_free=0; ret = starpu_task_submit(t); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } struct context main_context; struct context *contexts; void parallel_task_init() { /* Context creation */ main_context.ncpus = starpu_cpu_worker_get_count(); main_context.cpus = (int *) malloc(main_context.ncpus*sizeof(int)); fprintf(stderr, "ncpus : %d \n",main_context.ncpus); starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, main_context.cpus, main_context.ncpus); main_context.id = starpu_sched_ctx_create(main_context.cpus, main_context.ncpus,"main_ctx", STARPU_SCHED_CTX_POLICY_NAME,"eager", 0); /* Initialize nested contexts */ /* WARNING : the number of contexts must be a divisor of the number of available cpus*/ contexts = malloc(sizeof(struct context)*2); int cpus_per_context = main_context.ncpus/2; int i; for(i = 0; i < 2; i++) { fprintf(stderr, "ncpus %d for context %d \n",cpus_per_context, i); contexts[i].ncpus = cpus_per_context; contexts[i].cpus = main_context.cpus+i*cpus_per_context; } for(i = 0; i < 2; i++) contexts[i].id = starpu_sched_ctx_create(contexts[i].cpus, contexts[i].ncpus,"nested_ctx", STARPU_SCHED_CTX_NESTED,main_context.id, 0); for (i = 0; i < 2; i++) { parallel_task_init_one_context(&contexts[i].id); } starpu_task_wait_for_all(); starpu_sched_ctx_set_context(&main_context.id); } void parallel_task_deinit() { int i; for (i=0; i<2;i++) starpu_sched_ctx_delete(contexts[i].id); free(contexts); free(main_context.cpus); } /* Codelet SUM */ static void sum_cpu(void * descr[], void *cl_arg) { double *v_dst = (double *) STARPU_VECTOR_GET_PTR(descr[0]); double *v_src0 = (double *) STARPU_VECTOR_GET_PTR(descr[1]); double *v_src1 = (double *) STARPU_VECTOR_GET_PTR(descr[2]); int size = STARPU_VECTOR_GET_NX(descr[0]); int i, k; for (k=0;kdestroy = 1; ret=starpu_task_submit(t); if (ret == -ENODEV) goto out; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } out: /* wait for all tasks at the end*/ starpu_task_wait_for_all(); starpu_data_unregister(handle1); starpu_data_unregister(handle2); parallel_task_deinit(); starpu_shutdown(); return 0; } starpu-1.2.3+dfsg/examples/sched_ctx/prio.c000066400000000000000000000040421320135501600206450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); unsigned sched_ctx1 = starpu_sched_ctx_create(NULL, -1, "ctx1", STARPU_SCHED_CTX_POLICY_NAME, "prio", 0); FPRINTF(stderr, "min prio %d\n", starpu_sched_ctx_get_min_priority(sched_ctx1)); FPRINTF(stderr, "max prio %d\n", starpu_sched_ctx_get_max_priority(sched_ctx1)); unsigned sched_ctx2 = starpu_sched_ctx_create(NULL, -1, "ctx2", STARPU_SCHED_CTX_POLICY_NAME, "prio", STARPU_SCHED_CTX_POLICY_MIN_PRIO, -12, STARPU_SCHED_CTX_POLICY_MAX_PRIO, 32, 0); FPRINTF(stderr, "min prio %d\n", starpu_sched_ctx_get_min_priority(sched_ctx2)); FPRINTF(stderr, "max prio %d\n", starpu_sched_ctx_get_max_priority(sched_ctx2)); if (starpu_sched_ctx_get_min_priority(sched_ctx2) != -12) { FPRINTF(stderr, "Error with min priority: %d != %d\n", starpu_sched_ctx_get_min_priority(sched_ctx2), -12); ret = 1; } if (starpu_sched_ctx_get_max_priority(sched_ctx2) != 32) { FPRINTF(stderr, "Error with max priority: %d != %d\n", starpu_sched_ctx_get_max_priority(sched_ctx2), 32); ret = 1; } starpu_sched_ctx_delete(sched_ctx1); starpu_sched_ctx_delete(sched_ctx2); starpu_shutdown(); return ret; } starpu-1.2.3+dfsg/examples/sched_ctx/sched_ctx.c000066400000000000000000000105731320135501600216460ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2014 Université de Bordeaux * Copyright (C) 2010-2014, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #ifdef STARPU_QUICK_CHECK #define NTASKS 64 #else #define NTASKS 1000 #endif int tasks_executed = 0; starpu_pthread_mutex_t mut; static void sched_ctx_cpu_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { STARPU_PTHREAD_MUTEX_LOCK(&mut); tasks_executed++; STARPU_PTHREAD_MUTEX_UNLOCK(&mut); } static void sched_ctx_cuda_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet sched_ctx_codelet1 = { .cpu_funcs = {sched_ctx_cpu_func}, .model = NULL, .nbuffers = 0, .name = "sched_ctx" }; static struct starpu_codelet sched_ctx_codelet2 = { .cpu_funcs = {sched_ctx_cpu_func}, .cuda_funcs = {sched_ctx_cuda_func}, .model = NULL, .nbuffers = 0, .name = "sched_ctx" }; int main(int argc, char **argv) { int ntasks = NTASKS; int ret; unsigned ncuda = 0; int nprocs1 = 0; int nprocs2 = 0; int procs1[STARPU_NMAXWORKERS], procs2[STARPU_NMAXWORKERS]; char *sched; ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); STARPU_PTHREAD_MUTEX_INIT(&mut, NULL); #ifdef STARPU_USE_CPU nprocs1 = starpu_cpu_worker_get_count(); starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, procs1, nprocs1); #endif // if there is no cpu, skip if (nprocs1 == 0) goto enodev; #ifdef STARPU_USE_CUDA ncuda = nprocs2 = starpu_cuda_worker_get_count(); starpu_worker_get_ids_by_type(STARPU_CUDA_WORKER, procs2, nprocs2); #endif if (nprocs2 == 0) { nprocs2 = 1; procs2[0] = procs1[0]; } /*create contexts however you want*/ sched = getenv("STARPU_SCHED"); unsigned sched_ctx1 = starpu_sched_ctx_create(procs1, nprocs1, "ctx1", STARPU_SCHED_CTX_POLICY_NAME, sched?sched:"eager", 0); unsigned sched_ctx2 = starpu_sched_ctx_create(procs2, nprocs2, "ctx2", STARPU_SCHED_CTX_POLICY_NAME, sched?sched:"eager", 0); /*indicate what to do with the resources when context 2 finishes (it depends on your application)*/ starpu_sched_ctx_set_inheritor(sched_ctx2, sched_ctx1); starpu_sched_ctx_display_workers(sched_ctx2, stderr); int i; for (i = 0; i < ntasks/2; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &sched_ctx_codelet1; task->cl_arg = NULL; /*submit tasks to context*/ ret = starpu_task_submit_to_ctx(task,sched_ctx1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } /* tell starpu when you finished submitting tasks to this context in order to allow moving resources from this context to the inheritor one when its corresponding tasks finished executing */ starpu_sched_ctx_finished_submit(sched_ctx1); /* task with no cuda impl submitted to a ctx with gpus only */ struct starpu_task *task2 = starpu_task_create(); task2->cl = &sched_ctx_codelet1; task2->cl_arg = NULL; /*submit tasks to context*/ ret = starpu_task_submit_to_ctx(task2,sched_ctx2); if (ncuda == 0) { STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } else { STARPU_ASSERT_MSG(ret == -ENODEV, "submit task should ret enodev when the ctx does not have the PUs needed by the task"); } for (i = 0; i < ntasks/2; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &sched_ctx_codelet2; task->cl_arg = NULL; ret = starpu_task_submit_to_ctx(task,sched_ctx2); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_sched_ctx_finished_submit(sched_ctx2); /* wait for all tasks at the end*/ starpu_task_wait_for_all(); starpu_sched_ctx_add_workers(procs1, nprocs1, sched_ctx2); starpu_sched_ctx_delete(sched_ctx1); starpu_sched_ctx_delete(sched_ctx2); printf("tasks executed %d out of %d\n", tasks_executed, ntasks/2); enodev: starpu_shutdown(); return nprocs1 == 0 ? 77 : 0; } starpu-1.2.3+dfsg/examples/sched_ctx/sched_ctx_without_sched_policy.c000066400000000000000000000104271320135501600261540ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2014 Université de Bordeaux * Copyright (C) 2010-2014, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #ifndef STARPU_QUICK_CHECK #define NTASKS 64 #else #define NTASKS 10 #endif int tasks_executed[2]; int parallel_code(int sched_ctx) { int i; int t = 0; int *cpuids = NULL; int ncpuids = 0; starpu_sched_ctx_get_available_cpuids(sched_ctx, &cpuids, &ncpuids); // printf("execute task of %d threads \n", ncpuids); #pragma omp parallel num_threads(ncpuids) { starpu_sched_ctx_bind_current_thread_to_cpuid(cpuids[omp_get_thread_num()]); // printf("cpu = %d ctx%d nth = %d\n", sched_getcpu(), sched_ctx, omp_get_num_threads()); #pragma omp for for(i = 0; i < NTASKS; i++) t++; } free(cpuids); return t; } static void sched_ctx_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg) { unsigned sched_ctx = (uintptr_t)arg; tasks_executed[sched_ctx-1] += parallel_code(sched_ctx); } static struct starpu_codelet sched_ctx_codelet = { .cpu_funcs = {sched_ctx_func}, #ifdef STARPU_DEVEL #warning FIXME: cuda_funcs should not need to be defined #endif .cuda_funcs = {sched_ctx_func}, .model = NULL, .nbuffers = 0, .name = "sched_ctx" }; int main(int argc, char **argv) { tasks_executed[0] = 0; tasks_executed[1] = 0; int ntasks = NTASKS; int ret, j, k; unsigned ncpus = 0; ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); int nprocs1 = 1; int nprocs2 = 1; int ncuda = 0; int *procs1, *procs2, *procscuda; #ifdef STARPU_USE_CUDA ncuda = starpu_cuda_worker_get_count(); procscuda = (int*)malloc(ncuda*sizeof(int)); starpu_worker_get_ids_by_type(STARPU_CUDA_WORKER, procscuda, ncuda); #endif #ifdef STARPU_USE_CPU ncpus = starpu_cpu_worker_get_count(); procs1 = (int*)malloc(ncpus*sizeof(int)); starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, procs1, ncpus); if(ncpus > 1) { nprocs1 = ncpus/2; nprocs2 = ncpus-nprocs1; k = 0; procs2 = (int*)malloc(nprocs2*sizeof(int)); for(j = nprocs1; j < nprocs1+nprocs2; j++) procs2[k++] = procs1[j]; } else { procs2 = (int*)malloc(nprocs2*sizeof(int)); procs2[0] = procs1[0]; } #endif if (ncpus == 0) goto enodev; if (ncuda > 0 && nprocs1 > 1) { procs1[nprocs1-1] = procscuda[0]; } /*create contexts however you want*/ unsigned sched_ctx1 = starpu_sched_ctx_create(procs1, nprocs1, "ctx1", 0); unsigned sched_ctx2 = starpu_sched_ctx_create(procs2, nprocs2, "ctx2", 0); int i; for (i = 0; i < ntasks; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &sched_ctx_codelet; task->cl_arg = (void*)(uintptr_t) sched_ctx1; /*submit tasks to context*/ ret = starpu_task_submit_to_ctx(task,sched_ctx1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } for (i = 0; i < ntasks; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &sched_ctx_codelet; task->cl_arg = (void*)(uintptr_t) sched_ctx2; /*submit tasks to context*/ ret = starpu_task_submit_to_ctx(task,sched_ctx2); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } /* tell starpu when you finished submitting tasks to this context in order to allow moving resources from this context to the inheritor one when its corresponding tasks finished executing */ /* wait for all tasks at the end*/ starpu_task_wait_for_all(); starpu_sched_ctx_delete(sched_ctx1); starpu_sched_ctx_delete(sched_ctx2); printf("ctx%u: tasks starpu executed %d out of %d\n", sched_ctx1, tasks_executed[0], NTASKS*NTASKS); printf("ctx%u: tasks starpu executed %d out of %d\n", sched_ctx2, tasks_executed[1], NTASKS*NTASKS); enodev: #ifdef STARPU_USE_CPU free(procs1); free(procs2); #endif starpu_shutdown(); return ncpus == 0 ? 77 : 0; } starpu-1.2.3+dfsg/examples/sched_ctx/sched_ctx_without_sched_policy_awake.c000066400000000000000000000077111320135501600273260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2014 Université de Bordeaux * Copyright (C) 2010-2014, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #ifdef STARPU_QUICK_CHECK #define NTASKS 64 #else #define NTASKS 100 #endif int tasks_executed[2][STARPU_NMAXWORKERS]; int parallel_code(int sched_ctx) { int i; int t = 0; int workerid = starpu_worker_get_id(); for(i = 0; i < NTASKS; i++) t++; tasks_executed[sched_ctx-1][workerid] = t; // printf("executed %d tasks on worker %d of sched_ctx %d \n", t, workerid, sched_ctx); return t; } static void sched_ctx_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg) { unsigned sched_ctx = (uintptr_t)arg; parallel_code(sched_ctx); } static struct starpu_codelet sched_ctx_codelet = { .cpu_funcs = {sched_ctx_func}, .model = NULL, .nbuffers = 0, .name = "sched_ctx" }; int main(int argc, char **argv) { int i; for(i = 0; i < STARPU_NMAXWORKERS; i++) { tasks_executed[0][i] = 0; tasks_executed[1][i] = 0; } int ntasks = NTASKS; int ret, j, k; unsigned ncpus = 0; ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); int nprocs1 = 1; int nprocs2 = 1; int *procs1, *procs2; #ifdef STARPU_USE_CPU ncpus = starpu_cpu_worker_get_count(); procs1 = (int*)malloc(ncpus*sizeof(int)); starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, procs1, ncpus); if(ncpus > 1) { nprocs1 = ncpus/2; nprocs2 = ncpus-nprocs1; k = 0; procs2 = (int*)malloc(nprocs2*sizeof(int)); for(j = nprocs1; j < nprocs1+nprocs2; j++) procs2[k++] = procs1[j]; } else { procs2 = (int*)malloc(nprocs2*sizeof(int)); procs2[0] = procs1[0]; } #endif if (ncpus == 0) goto enodev; /*create contexts however you want*/ unsigned sched_ctx1 = starpu_sched_ctx_create(procs1, nprocs1, "ctx1", STARPU_SCHED_CTX_AWAKE_WORKERS, 0); unsigned sched_ctx2 = starpu_sched_ctx_create(procs2, nprocs2, "ctx2", STARPU_SCHED_CTX_AWAKE_WORKERS, 0); for (i = 0; i < ntasks; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &sched_ctx_codelet; task->cl_arg = (void*)(uintptr_t) sched_ctx1; /*submit tasks to context*/ ret = starpu_task_submit_to_ctx(task,sched_ctx1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } for (i = 0; i < ntasks; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &sched_ctx_codelet; task->cl_arg = (void*)(uintptr_t) sched_ctx2; /*submit tasks to context*/ ret = starpu_task_submit_to_ctx(task,sched_ctx2); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } /* tell starpu when you finished submitting tasks to this context in order to allow moving resources from this context to the inheritor one when its corresponding tasks finished executing */ /* wait for all tasks at the end*/ starpu_task_wait_for_all(); starpu_sched_ctx_delete(sched_ctx1); starpu_sched_ctx_delete(sched_ctx2); int tasks_per_ctx[2]; tasks_per_ctx[0] = 0; tasks_per_ctx[1] = 0; for(i = 0; i < STARPU_NMAXWORKERS; i++) { tasks_per_ctx[0] += tasks_executed[0][i]; tasks_per_ctx[1] += tasks_executed[1][i]; } printf("ctx%u: tasks starpu executed %d out of %d\n", sched_ctx1, tasks_per_ctx[0]/nprocs1, NTASKS); printf("ctx%u: tasks starpu executed %d out of %d\n", sched_ctx2, tasks_per_ctx[1]/nprocs2, NTASKS); enodev: #ifdef STARPU_USE_CPU free(procs1); free(procs2); #endif starpu_shutdown(); return ncpus == 0 ? 77 : 0; } starpu-1.2.3+dfsg/examples/sched_ctx/two_cpu_contexts.c000066400000000000000000000066661320135501600233210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include /* This example case follows the same pattern its native Fortran version nf_sched_ctx.f90 */ static void sched_ctx_cpu_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *cl_args) { int task_id; starpu_codelet_unpack_args(cl_args, &task_id); printf("task: %d, workerid: %d\n", task_id, starpu_worker_get_id()); } static struct starpu_codelet sched_ctx_codelet = { .cpu_funcs = {sched_ctx_cpu_func}, .model = NULL, .nbuffers = 0, .name = "sched_ctx" }; int main(int argc, char **argv) { int ncpu; int nprocs1; int nprocs2; int *procs = NULL; int *procs1 = NULL; int *procs2 = NULL; int i; int n = 20; int ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ncpu = starpu_cpu_worker_get_count(); /* actually we really need at least 2 CPU workers such to allocate 2 * non overlapping contexts */ if (ncpu < 2) return 77; procs = calloc(ncpu, sizeof(int)); starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, procs, ncpu); nprocs1 = ncpu / 2; procs1 = calloc(nprocs1, sizeof(int)); for (i=0; i unsigned size1; unsigned size2; unsigned nblocks1; unsigned nblocks2; unsigned cpu1; unsigned cpu2; unsigned gpu; unsigned gpu1; unsigned gpu2; struct params { unsigned id; unsigned ctx; int the_other_ctx; int *procs; int nprocs; void (*bench)(unsigned, unsigned); unsigned size; unsigned nblocks; }; struct retvals { double flops; double avg_timing; }; #define NSAMPLES 1 int first = 1; starpu_pthread_mutex_t mut; struct retvals rv[2]; struct params p1, p2; starpu_pthread_key_t key; void init() { size1 = 4*1024; size2 = 4*1024; nblocks1 = 16; nblocks2 = 16; cpu1 = 0; cpu2 = 0; gpu = 0; gpu1 = 0; gpu2 = 0; rv[0].flops = 0.0; rv[1].flops = 0.0; rv[1].avg_timing = 0.0; rv[1].avg_timing = 0.0; p1.ctx = 0; p2.ctx = 0; p1.id = 0; p2.id = 1; starpu_pthread_key_create(&key, NULL); } void update_sched_ctx_timing_results(double flops, double avg_timing) { unsigned *id = starpu_pthread_getspecific(key); rv[*id].flops += flops; rv[*id].avg_timing += avg_timing; } void* start_bench(void *val) { struct params *p = (struct params*)val; int i; starpu_pthread_setspecific(key, &p->id); if(p->ctx != 0) starpu_sched_ctx_set_context(&p->ctx); for(i = 0; i < NSAMPLES; i++) p->bench(p->size, p->nblocks); if(p->ctx != 0) { starpu_pthread_mutex_lock(&mut); if(first) { starpu_sched_ctx_delete(p->ctx); } first = 0; starpu_pthread_mutex_unlock(&mut); } rv[p->id].flops /= NSAMPLES; rv[p->id].avg_timing /= NSAMPLES; return NULL; } void start_2benchs(void (*bench)(unsigned, unsigned)) { p1.bench = bench; p1.size = size1; printf("size %u\n", size1); p1.nblocks = nblocks1; p2.bench = bench; p2.size = size2; printf("size %u\n", size2); p2.nblocks = nblocks2; starpu_pthread_t tid[2]; starpu_pthread_mutex_init(&mut, NULL); double start; double end; start = starpu_timing_now(); starpu_pthread_create(&tid[0], NULL, (void*)start_bench, (void*)&p1); starpu_pthread_create(&tid[1], NULL, (void*)start_bench, (void*)&p2); starpu_pthread_join(tid[0], NULL); starpu_pthread_join(tid[1], NULL); end = starpu_timing_now(); starpu_pthread_mutex_destroy(&mut); double timing = end - start; timing /= 1000000; printf("%2.2f %2.2f ", rv[0].flops, rv[1].flops); printf("%2.2f %2.2f %2.2f\n", rv[0].avg_timing, rv[1].avg_timing, timing); } void start_1stbench(void (*bench)(unsigned, unsigned)) { p1.bench = bench; p1.size = size1; p1.nblocks = nblocks1; double start; double end; start = starpu_timing_now(); start_bench((void*)&p1); end = starpu_timing_now(); starpu_pthread_mutex_destroy(&mut); double timing = end - start; timing /= 1000000; printf("%2.2f ", rv[0].flops); printf("%2.2f %2.2f\n", rv[0].avg_timing, timing); } void start_2ndbench(void (*bench)(unsigned, unsigned)) { p2.bench = bench; p2.size = size2; p2.nblocks = nblocks2; double start; double end; start = starpu_timing_now(); start_bench((void*)&p2); end = starpu_timing_now(); starpu_pthread_mutex_destroy(&mut); double timing = end - start; timing /= 1000000; printf("%2.2f ", rv[1].flops); printf("%2.2f %2.2f\n", rv[1].avg_timing, timing); } void construct_contexts(void (*bench)(unsigned, unsigned)) { unsigned nprocs1 = cpu1 + gpu + gpu1; unsigned nprocs2 = cpu2 + gpu + gpu2; unsigned n_all_gpus = gpu + gpu1 + gpu2; int procs[nprocs1]; unsigned i; int k = 0; for(i = 0; i < gpu; i++) { procs[k++] = i; printf("%u ", i); } for(i = gpu; i < gpu + gpu1; i++) { procs[k++] = i; printf("%u ", i); } for(i = n_all_gpus; i < n_all_gpus + cpu1; i++) { procs[k++] = i; printf("%u ", i); } printf("\n "); p1.ctx = starpu_sched_ctx_create(procs, nprocs1, "sched_ctx1", STARPU_SCHED_CTX_POLICY_NAME, "heft", 0); p2.the_other_ctx = (int)p1.ctx; p1.procs = procs; p1.nprocs = nprocs1; int procs2[nprocs2]; k = 0; for(i = 0; i < gpu; i++) { procs2[k++] = i; printf("%u ", i); } for(i = gpu + gpu1; i < gpu + gpu1 + gpu2; i++) { procs2[k++] = i; printf("%u ", i); } for(i = n_all_gpus + cpu1; i < n_all_gpus + cpu1 + cpu2; i++) { procs2[k++] = i; printf("%u ", i); } printf("\n"); p2.ctx = starpu_sched_ctx_create(procs2, nprocs2, "sched_ctx2", STARPU_SCHED_CTX_POLICY_NAME, "heft", 0); p1.the_other_ctx = (int)p2.ctx; p2.procs = procs2; starpu_sched_ctx_set_inheritor(p1.ctx, p2.ctx); starpu_sched_ctx_set_inheritor(p2.ctx, p1.ctx); p2.nprocs = nprocs2; } void parse_args_ctx(int argc, char **argv) { init(); int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-size1") == 0) { char *argptr; size1 = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-nblocks1") == 0) { char *argptr; nblocks1 = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-size2") == 0) { char *argptr; size2 = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-nblocks2") == 0) { char *argptr; nblocks2 = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-cpu1") == 0) { char *argptr; cpu1 = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-cpu2") == 0) { char *argptr; cpu2 = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-gpu") == 0) { char *argptr; gpu = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-gpu1") == 0) { char *argptr; gpu1 = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-gpu2") == 0) { char *argptr; gpu2 = strtol(argv[++i], &argptr, 10); } } } starpu-1.2.3+dfsg/examples/sched_ctx_utils/sched_ctx_utils.h000066400000000000000000000021501320135501600243030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include void parse_args_ctx(int argc, char **argv); void update_sched_ctx_timing_results(double gflops, double timing); void construct_contexts(void (*bench)(unsigned size, unsigned nblocks)); void start_2benchs(void (*bench)(unsigned size, unsigned nblocks)); void start_1stbench(void (*bench)(unsigned size, unsigned nblocks)); void start_2ndbench(void (*bench)(unsigned size, unsigned nblocks)); starpu-1.2.3+dfsg/examples/scheduler/000077500000000000000000000000001320135501600175425ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/scheduler/dummy_sched.c000066400000000000000000000134241320135501600222130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2017 Université de Bordeaux * Copyright (C) 2010-2013, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This is an example of an application-defined scheduler. * This is a mere eager scheduler with a centralized list of tasks to schedule: * when a task becomes ready (push) it is put on the list. When a device * becomes ready (pop), a task is taken from the list. */ #include #include #include #ifdef STARPU_QUICK_CHECK #define NTASKS 320 #elif !defined(STARPU_LONG_CHECK) #define NTASKS 3200 #else #define NTASKS 32000 #endif #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) struct dummy_sched_data { struct starpu_task_list sched_list; starpu_pthread_mutex_t policy_mutex; }; static void init_dummy_sched(unsigned sched_ctx_id) { starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); struct dummy_sched_data *data = (struct dummy_sched_data*)malloc(sizeof(struct dummy_sched_data)); /* Create a linked-list of tasks and a condition variable to protect it */ starpu_task_list_init(&data->sched_list); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)data); STARPU_PTHREAD_MUTEX_INIT(&data->policy_mutex, NULL); FPRINTF(stderr, "Initialising Dummy scheduler\n"); } static void deinit_dummy_sched(unsigned sched_ctx_id) { struct dummy_sched_data *data = (struct dummy_sched_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); STARPU_ASSERT(starpu_task_list_empty(&data->sched_list)); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); STARPU_PTHREAD_MUTEX_DESTROY(&data->policy_mutex); free(data); FPRINTF(stderr, "Destroying Dummy scheduler\n"); } static int push_task_dummy(struct starpu_task *task) { unsigned sched_ctx_id = task->sched_ctx; struct dummy_sched_data *data = (struct dummy_sched_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); /* NB: In this simplistic strategy, we assume that the context in which we push task has at least one worker*/ /* lock all workers when pushing tasks on a list where all of them would pop for tasks */ STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); starpu_task_list_push_front(&data->sched_list, task); starpu_push_task_end(task); STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); /*if there are no tasks block */ /* wake people waiting for a task */ struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { unsigned worker; worker = workers->get_next(workers, &it); starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(worker, &sched_mutex, &sched_cond); STARPU_PTHREAD_MUTEX_LOCK(sched_mutex); STARPU_PTHREAD_COND_SIGNAL(sched_cond); STARPU_PTHREAD_MUTEX_UNLOCK(sched_mutex); } return 0; } /* The mutex associated to the calling worker is already taken by StarPU */ static struct starpu_task *pop_task_dummy(unsigned sched_ctx_id) { /* NB: In this simplistic strategy, we assume that all workers are able * to execute all tasks, otherwise, it would have been necessary to go * through the entire list until we find a task that is executable from * the calling worker. So we just take the head of the list and give it * to the worker. */ struct dummy_sched_data *data = (struct dummy_sched_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); #ifdef STARPU_NON_BLOCKING_DRIVERS if (starpu_task_list_empty(&data->sched_list)) return NULL; #endif STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); struct starpu_task *task = NULL; if (!starpu_task_list_empty(&data->sched_list)) task = starpu_task_list_pop_back(&data->sched_list); STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); return task; } static struct starpu_sched_policy dummy_sched_policy = { .init_sched = init_dummy_sched, .deinit_sched = deinit_dummy_sched, .push_task = push_task_dummy, .pop_task = pop_task_dummy, .policy_name = "dummy", .policy_description = "dummy scheduling strategy" }; void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .model = NULL, .nbuffers = 0, .name = "dummy", }; int main(int argc, char **argv) { int ntasks = NTASKS; int ret; struct starpu_conf conf; #ifdef STARPU_HAVE_UNSETENV unsetenv("STARPU_SCHED"); #endif starpu_conf_init(&conf); conf.sched_policy = &dummy_sched_policy, ret = starpu_init(&conf); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_QUICK_CHECK ntasks /= 100; #endif int i; for (i = 0; i < ntasks; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &dummy_codelet; task->cl_arg = NULL; ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_task_wait_for_all(); starpu_shutdown(); return 0; } starpu-1.2.3+dfsg/examples/scheduler/schedulers.sh000077500000000000000000000020501320135501600222370ustar00rootroot00000000000000#!/bin/sh # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2012, 2014 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. check_success() { if [ $1 -ne 0 ] ; then echo "failure" >&2 exit $1 fi } if test ! -x ./cholesky/cholesky_tag then echo "Application ./cholesky/cholesky_tag unavailable" exit 77 fi SCHEDULERS=`STARPU_SCHED="help" ./basic_examples/hello_world 2>&1 | awk '/\t->/ {print $1}'` for sched in $SCHEDULERS do echo "cholesky.$sched" STARPU_SCHED=$sched ./cholesky/cholesky_tag check_success $? done starpu-1.2.3+dfsg/examples/scheduler/schedulers_context.sh000077500000000000000000000020431320135501600240050ustar00rootroot00000000000000#!/bin/sh # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2012, 2014 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. check_success() { if [ $1 -ne 0 ] ; then echo "failure" >&2 exit $1 fi } if test ! -x ./sched_ctx/sched_ctx then echo "Application ./sched_ctx/sched_ctx unavailable" exit 77 fi SCHEDULERS=`STARPU_SCHED="help" ./basic_examples/hello_world 2>&1 | awk '/\t->/ {print $1}'` for sched in $SCHEDULERS do echo "sched_ctx.$sched" STARPU_SCHED=$sched ./sched_ctx/sched_ctx check_success $? done starpu-1.2.3+dfsg/examples/spmd/000077500000000000000000000000001320135501600165275ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/spmd/vector_scal_spmd.c000066400000000000000000000101511320135501600222200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012, 2013, 2015, 2016 CNRS * Copyright (C) 2010-2013, 2015 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This shows how to implement an spmd parallel StarPU task: scal_cpu_func is * called in parallel over several cores, and has to split the work accordingly. * This is a mere vector scaling example. */ /* gcc build: gcc -O2 -g vector_scal.c -o vector_scal $(pkg-config --cflags starpu-1.0) $(pkg-config --libs starpu-1.0) */ #include #include #include #define MIN(a,b) ((a)<(b)?(a):(b)) #define NX 204800 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #ifdef STARPU_QUICK_CHECK #define ITER 10 #else #define ITER 100 #endif static int get_first_element_rank(int nel, int rank, int nb_workers) { if(rank == 0) return 0; /* We get the number of bigger parts which stand before the part */ int nb_big_parts = MIN(nel % nb_workers, rank); return nb_big_parts * (nel / nb_workers + 1) + (rank - nb_big_parts) * (nel / nb_workers); } void scal_cpu_func(void *buffers[], void *_args) { int i; float *factor = _args, f = *factor; struct starpu_vector_interface *vector = buffers[0]; int n = STARPU_VECTOR_GET_NX(vector); float *val = (float *)STARPU_VECTOR_GET_PTR(vector); int nb_workers = starpu_combined_worker_get_size(); int rank = starpu_combined_worker_get_rank(); if (rank == 0) FPRINTF(stderr, "running task with %d CPUs.\n", starpu_combined_worker_get_size()); /* We add 1 to the (nel_total % nb_workers) first workers, thus we get an evenly splitted data. */ int nel_worker = (n / nb_workers) + ((rank < (n % nb_workers)) ? 1 : 0); int begin = get_first_element_rank(n, rank, nb_workers); for (i = 0; i < nel_worker; i++) { rank = i + begin; float v = val[rank]; int j; for (j = 0; j < 100; j++) v = v * f; val[rank] = v; } } static struct starpu_perfmodel vector_scal_model = { .type = STARPU_HISTORY_BASED, .symbol = "vector_scal_parallel" }; static struct starpu_codelet cl = { .modes = { STARPU_RW }, .type = STARPU_SPMD, .max_parallelism = INT_MAX, .cpu_funcs = {scal_cpu_func}, .cpu_funcs_name = {"scal_cpu_func"}, .nbuffers = 1, .model = &vector_scal_model, }; int main(int argc, char **argv) { struct starpu_conf conf; float *vector; unsigned i; int ret; starpu_conf_init(&conf); conf.single_combined_worker = 1; conf.sched_policy_name = "pheft"; ret = starpu_init(&conf); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); vector = malloc(NX*sizeof(*vector)); for (i = 0; i < NX; i++) vector[i] = (i+1.0f); FPRINTF(stderr, "BEFORE: First element was %f\n", vector[0]); FPRINTF(stderr, "BEFORE: Last element was %f\n", vector[NX-1]); starpu_data_handle_t vector_handle; starpu_vector_data_register(&vector_handle, STARPU_MAIN_RAM, (uintptr_t)vector, NX, sizeof(vector[0])); float factor = 1.001; for (i = 0; i < ITER; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->handles[0] = vector_handle; task->cl_arg = &factor; task->cl_arg_size = sizeof(factor); ret = starpu_task_submit(task); if (ret == -ENODEV) { ret = 77; break; } STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_data_unregister(vector_handle); /* terminate StarPU, no task can be submitted after */ starpu_shutdown(); FPRINTF(stderr, "AFTER: First element is %f\n", vector[0]); FPRINTF(stderr, "AFTER: Last element is %f\n", vector[NX-1]); free(vector); return ret; } starpu-1.2.3+dfsg/examples/spmv/000077500000000000000000000000001320135501600165515ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/spmv/dw_block_spmv.c000066400000000000000000000210051320135501600215440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012, 2014-2015 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This computes an SPMV on a BCSR sparse matrix. It simply splits the matrix * into its blocks, thus turning the problem into mere matrix-vector products * (GEMV) which can be run in parallel. */ #include "dw_block_spmv.h" #include "matrix_market/mm_to_bcsr.h" #ifdef STARPU_HAVE_HELGRIND_H #include #endif #ifndef ANNOTATE_HAPPENS_BEFORE #define ANNOTATE_HAPPENS_BEFORE(obj) ((void)0) #endif #ifndef ANNOTATE_HAPPENS_AFTER #define ANNOTATE_HAPPENS_AFTER(obj) ((void)0) #endif #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) static double start; static double end; static sem_t sem; static unsigned c = 256; static unsigned r = 256; static int remainingtasks = -1; static starpu_data_handle_t sparse_matrix; static starpu_data_handle_t vector_in, vector_out; static uint32_t size; static char *inputfile; static bcsr_t *bcsr_matrix; static float *vector_in_ptr; static float *vector_out_ptr; void create_data(void) { /* read the input file */ bcsr_matrix = mm_file_to_bcsr(inputfile, c, r); /* declare the corresponding block CSR to the runtime */ starpu_bcsr_data_register(&sparse_matrix, STARPU_MAIN_RAM, bcsr_matrix->nnz_blocks, bcsr_matrix->nrows_blocks, (uintptr_t)bcsr_matrix->val, bcsr_matrix->colind, bcsr_matrix->rowptr, 0, bcsr_matrix->r, bcsr_matrix->c, sizeof(float)); size = c*r*starpu_bcsr_get_nnz(sparse_matrix); /* printf("size = %d \n ", size); */ /* initiate the 2 vectors */ vector_in_ptr = malloc(size*sizeof(float)); assert(vector_in_ptr); vector_out_ptr = malloc(size*sizeof(float)); assert(vector_out_ptr); /* fill those */ unsigned ind; for (ind = 0; ind < size; ind++) { vector_in_ptr[ind] = 2.0f; vector_out_ptr[ind] = 0.0f; } starpu_vector_data_register(&vector_in, STARPU_MAIN_RAM, (uintptr_t)vector_in_ptr, size, sizeof(float)); starpu_vector_data_register(&vector_out, STARPU_MAIN_RAM, (uintptr_t)vector_out_ptr, size, sizeof(float)); } void unregister_data(void) { starpu_data_unpartition(sparse_matrix, STARPU_MAIN_RAM); starpu_data_unregister(sparse_matrix); starpu_data_unpartition(vector_in, STARPU_MAIN_RAM); starpu_data_unregister(vector_in); starpu_data_unpartition(vector_out, STARPU_MAIN_RAM); starpu_data_unregister(vector_out); } void init_problem_callback(void *arg) { unsigned *remaining = arg; unsigned val = STARPU_ATOMIC_ADD(remaining, -1); ANNOTATE_HAPPENS_BEFORE(&remaining); /* if (val < 10) printf("callback %d remaining \n", val); */ if ( val == 0 ) { ANNOTATE_HAPPENS_AFTER(&remaining); printf("DONE ...\n"); end = starpu_timing_now(); sem_post(&sem); } } unsigned get_bcsr_nchildren(STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, starpu_data_handle_t handle) { return (unsigned)starpu_bcsr_get_nnz(handle); } struct starpu_data_interface_ops *get_bcsr_child_ops(STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, STARPU_ATTRIBUTE_UNUSED unsigned child) { return &starpu_interface_matrix_ops; } void call_filters(void) { struct starpu_data_filter bcsr_f; struct starpu_data_filter vector_in_f, vector_out_f; bcsr_f.filter_func = starpu_bcsr_filter_canonical_block; bcsr_f.get_nchildren = get_bcsr_nchildren; /* the children use a matrix interface ! */ bcsr_f.get_child_ops = get_bcsr_child_ops; vector_in_f.filter_func = starpu_vector_filter_block; vector_in_f.nchildren = size/c; vector_in_f.get_nchildren = NULL; vector_in_f.get_child_ops = NULL; vector_out_f.filter_func = starpu_vector_filter_block; vector_out_f.nchildren = size/r; vector_out_f.get_nchildren = NULL; vector_out_f.get_child_ops = NULL; starpu_data_partition(sparse_matrix, &bcsr_f); starpu_data_partition(vector_in, &vector_in_f); starpu_data_partition(vector_out, &vector_out_f); } #define NSPMV 32 unsigned totaltasks; struct starpu_codelet cl = { .cpu_funcs = { cpu_block_spmv}, .cpu_funcs_name = { "cpu_block_spmv" }, #ifdef STARPU_USE_CUDA .cuda_funcs = {cublas_block_spmv}, #endif .cuda_flags = {STARPU_CUDA_ASYNC}, .nbuffers = 3, .modes = {STARPU_R, STARPU_R, STARPU_RW} }; void launch_spmv_codelets(void) { struct starpu_task *task_tab; uint8_t *is_entry_tab; /* we call one codelet per block */ unsigned nblocks = starpu_bcsr_get_nnz(sparse_matrix); unsigned nrows = starpu_bcsr_get_nrow(sparse_matrix); remainingtasks = NSPMV*nblocks; totaltasks = remainingtasks; unsigned taskid = 0; task_tab = calloc(totaltasks, sizeof(struct starpu_task)); STARPU_ASSERT(task_tab); is_entry_tab = calloc(totaltasks, sizeof(uint8_t)); STARPU_ASSERT(is_entry_tab); printf("there will be %d codelets\n", remainingtasks); uint32_t *rowptr = starpu_bcsr_get_local_rowptr(sparse_matrix); uint32_t *colind = starpu_bcsr_get_local_colind(sparse_matrix); start = starpu_timing_now(); unsigned loop; for (loop = 0; loop < NSPMV; loop++) { unsigned row; unsigned part = 0; for (row = 0; row < nrows; row++) { unsigned index; if (rowptr[row] == rowptr[row+1]) { continue; } for (index = rowptr[row]; index < rowptr[row+1]; index++, part++) { struct starpu_task *task = &task_tab[taskid]; starpu_task_init(task); task->use_tag = 1; task->tag_id = taskid; task->callback_func = init_problem_callback; task->callback_arg = &remainingtasks; task->cl = &cl; task->cl_arg = NULL; unsigned i = colind[index]; unsigned j = row; task->handles[0] = starpu_data_get_sub_data(sparse_matrix, 1, part); task->handles[1] = starpu_data_get_sub_data(vector_in, 1, i); task->handles[2] = starpu_data_get_sub_data(vector_out, 1, j); /* all tasks in the same row are dependant so that we don't wait too much for data * we need to wait on the previous task if we are not the first task of a row */ if (index != rowptr[row & ~0x3]) { /* this is not the first task in the row */ starpu_tag_declare_deps((starpu_tag_t)taskid, 1, (starpu_tag_t)(taskid-1)); is_entry_tab[taskid] = 0; } else { /* this is an entry task */ is_entry_tab[taskid] = 1; } taskid++; } } } printf("start submitting tasks !\n"); /* submit ALL tasks now */ unsigned nchains = 0; unsigned task; for (task = 0; task < totaltasks; task++) { int ret; if (is_entry_tab[task]) { nchains++; } ret = starpu_task_submit(&task_tab[task]); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } printf("end of task submission (there was %u chains for %u tasks : ratio %u tasks per chain) !\n", nchains, totaltasks, totaltasks/nchains); free(is_entry_tab); } void init_problem(void) { /* create the sparse input matrix */ create_data(); /* create a new codelet that will perform a SpMV on it */ call_filters(); } void print_results(void) { unsigned row; for (row = 0; row < STARPU_MIN(size, 16); row++) { printf("%2.2f\t%2.2f\n", vector_in_ptr[row], vector_out_ptr[row]); } } int main(STARPU_ATTRIBUTE_UNUSED int argc, STARPU_ATTRIBUTE_UNUSED char **argv) { int ret; if (argc < 2) { FPRINTF(stderr, "usage : %s filename [tile size]\n", argv[0]); exit(-1); } if (argc == 3) { /* third argument is the tile size */ char *argptr; r = strtol(argv[2], &argptr, 10); c = r; } inputfile = argv[1]; /* start the runtime */ ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_cublas_init(); sem_init(&sem, 0, 0U); init_problem(); launch_spmv_codelets(); sem_wait(&sem); sem_destroy(&sem); unregister_data(); print_results(); double totalflop = 2.0*c*r*totaltasks; double timing = end - start; FPRINTF(stderr, "Computation took (in ms)\n"); FPRINTF(stdout, "%2.2f\n", timing/1000); FPRINTF(stderr, "Flop %e\n", totalflop); FPRINTF(stderr, "GFlops : %2.2f\n", totalflop/timing/1000); return 0; } starpu-1.2.3+dfsg/examples/spmv/dw_block_spmv.h000066400000000000000000000021241320135501600215520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011 Université de Bordeaux * Copyright (C) 2010, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DW_BLOCK_SPMV_H__ #define __DW_BLOCK_SPMV_H__ #include #include #include #include #include #include #include #include void cpu_block_spmv(void *descr[], void *_args); #ifdef STARPU_USE_CUDA void cublas_block_spmv(void *descr[], void *_args); #endif /* STARPU_USE_CUDA */ #endif /* __DW_BLOCK_SPMV_H__ */ starpu-1.2.3+dfsg/examples/spmv/dw_block_spmv_kernels.c000066400000000000000000000041401320135501600232700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011, 2015, 2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * Standard GEMV kernel (on one matrix block of the sparse matrix) */ #include "dw_block_spmv.h" /* * U22 */ #ifdef STARPU_USE_CUDA #include static const float p1 = 1.0; static const float m1 = -1.0; #endif static inline void common_block_spmv(void *descr[], int s, STARPU_ATTRIBUTE_UNUSED void *_args) { /* printf("22\n"); */ float *block = (float *)STARPU_MATRIX_GET_PTR(descr[0]); float *in = (float *)STARPU_VECTOR_GET_PTR(descr[1]); float *out = (float *)STARPU_VECTOR_GET_PTR(descr[2]); unsigned dx = STARPU_MATRIX_GET_NX(descr[0]); unsigned dy = STARPU_MATRIX_GET_NY(descr[0]); unsigned ld = STARPU_MATRIX_GET_LD(descr[0]); switch (s) { case 0: cblas_sgemv(CblasRowMajor, CblasNoTrans, dx, dy, 1.0f, block, ld, in, 1, 1.0f, out, 1); break; #ifdef STARPU_USE_CUDA case 1: { cublasStatus_t status = cublasSgemv (starpu_cublas_get_local_handle(), CUBLAS_OP_T, dx, dy, &p1, block, ld, in, 1, &p1, out, 1); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); break; } #endif default: STARPU_ABORT(); break; } } void cpu_block_spmv(void *descr[], void *_args) { /* printf("CPU CODELET \n"); */ common_block_spmv(descr, 0, _args); } #ifdef STARPU_USE_CUDA void cublas_block_spmv(void *descr[], void *_args) { /* printf("CUBLAS CODELET \n"); */ common_block_spmv(descr, 1, _args); } #endif /* STARPU_USE_CUDA */ starpu-1.2.3+dfsg/examples/spmv/matrix_market/000077500000000000000000000000001320135501600214205ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/spmv/matrix_market/examples/000077500000000000000000000000001320135501600232365ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/spmv/matrix_market/examples/fidapm05.mtx000066400000000000000000000330101320135501600253720ustar00rootroot00000000000000%%MatrixMarket matrix coordinate real general 42 42 520 1 1 1.9555555555555e+00 2 1 -1.9999999999999e-01 10 1 -1.0666666666667e+00 11 1 -3.5555555555556e-01 19 1 1.3322676295502e-15 20 1 1.1111111111111e-01 25 1 1.3333333333333e-01 26 1 4.4444444444444e-03 27 1 1.3333333333333e-02 1 2 -1.9999999999999e-01 2 2 1.2444444444444e+00 3 2 -2.0000000000001e-01 4 2 -3.3333333333334e-02 10 2 -3.5555555555555e-01 11 2 -4.0000000000000e-01 12 2 -3.5555555555555e-01 13 2 1.1111111111111e-01 19 2 1.1111111111111e-01 20 2 -6.6666666666669e-02 21 2 1.1111111111111e-01 22 2 -2.2222222222222e-02 25 2 3.3333333333333e-02 26 2 1.1111111111111e-03 27 2 6.6666666666666e-03 28 2 3.3333333333334e-02 29 2 1.1111111111111e-03 30 2 6.6666666666669e-03 2 3 -2.0000000000001e-01 3 3 1.9555555555555e+00 4 3 -1.9999999999999e-01 11 3 -3.5555555555555e-01 12 3 -1.0666666666667e+00 13 3 -3.5555555555556e-01 20 3 1.1111111111111e-01 21 3 3.5527136788005e-15 22 3 1.1111111111111e-01 28 3 1.3333333333333e-01 29 3 4.4444444444444e-03 30 3 4.0000000000000e-02 2 4 -3.3333333333334e-02 3 4 -1.9999999999999e-01 4 4 1.2444444444444e+00 5 4 -2.0000000000001e-01 6 4 -3.3333333333337e-02 11 4 1.1111111111111e-01 12 4 -3.5555555555554e-01 13 4 -4.0000000000000e-01 14 4 -3.5555555555555e-01 15 4 1.1111111111112e-01 20 4 -2.2222222222222e-02 21 4 1.1111111111111e-01 22 4 -6.6666666666664e-02 23 4 1.1111111111111e-01 24 4 -2.2222222222223e-02 28 4 3.3333333333331e-02 29 4 1.1111111111111e-03 30 4 1.3333333333333e-02 31 4 3.3333333333334e-02 32 4 1.1111111111111e-03 33 4 1.3333333333334e-02 4 5 -2.0000000000001e-01 5 5 1.9555555555555e+00 6 5 -1.9999999999997e-01 13 5 -3.5555555555555e-01 14 5 -1.0666666666667e+00 15 5 -3.5555555555557e-01 22 5 1.1111111111111e-01 23 5 7.5495165674511e-15 24 5 1.1111111111111e-01 31 5 1.3333333333333e-01 32 5 4.4444444444444e-03 33 5 6.6666666666666e-02 4 6 -3.3333333333337e-02 5 6 -1.9999999999997e-01 6 6 1.2444444444445e+00 7 6 -2.0000000000003e-01 8 6 -3.3333333333331e-02 13 6 1.1111111111111e-01 14 6 -3.5555555555555e-01 15 6 -4.0000000000001e-01 16 6 -3.5555555555554e-01 17 6 1.1111111111111e-01 22 6 -2.2222222222223e-02 23 6 1.1111111111111e-01 24 6 -6.6666666666670e-02 31 6 3.3333333333334e-02 32 6 1.1111111111111e-03 33 6 2.0000000000000e-02 34 6 3.3333333333332e-02 35 6 1.1111111111110e-03 36 6 1.9999999999999e-02 40 6 1.1111111111111e-01 41 6 -2.2222222222222e-02 6 7 -2.0000000000003e-01 7 7 1.9555555555555e+00 8 7 -1.9999999999998e-01 15 7 -3.5555555555554e-01 16 7 -1.0666666666666e+00 17 7 -3.5555555555554e-01 24 7 1.1111111111110e-01 34 7 1.3333333333333e-01 35 7 4.4444444444444e-03 36 7 9.3333333333331e-02 40 7 -6.6613381477509e-15 41 7 1.1111111111112e-01 6 8 -3.3333333333331e-02 7 8 -1.9999999999998e-01 8 8 1.2444444444445e+00 9 8 -2.0000000000005e-01 15 8 1.1111111111111e-01 16 8 -3.5555555555558e-01 17 8 -3.9999999999998e-01 18 8 -3.5555555555556e-01 24 8 -2.2222222222222e-02 34 8 3.3333333333333e-02 35 8 1.1111111111112e-03 36 8 2.6666666666666e-02 37 8 3.3333333333334e-02 38 8 1.1111111111111e-03 39 8 2.6666666666667e-02 40 8 1.1111111111111e-01 41 8 -6.6666666666668e-02 42 8 1.1111111111111e-01 8 9 -2.0000000000005e-01 9 9 1.9555555555556e+00 17 9 -3.5555555555552e-01 18 9 -1.0666666666667e+00 37 9 1.3333333333333e-01 38 9 4.4444444444443e-03 39 9 1.2000000000000e-01 41 9 1.1111111111111e-01 42 9 3.1086244689504e-15 1 10 -1.0666666666667e+00 2 10 -3.5555555555555e-01 10 10 5.6888888888889e+00 11 10 -1.0666666666667e+00 19 10 -1.0666666666667e+00 20 10 -3.5555555555555e-01 25 10 1.1102230246252e-16 26 10 1.7777777777778e-02 27 10 1.3877787807814e-17 1 11 -3.5555555555556e-01 2 11 -4.0000000000000e-01 3 11 -3.5555555555555e-01 4 11 1.1111111111111e-01 10 11 -1.0666666666667e+00 11 11 3.9111111111110e+00 12 11 -1.0666666666666e+00 13 11 -5.3290705182007e-15 19 11 -3.5555555555555e-01 20 11 -3.9999999999999e-01 21 11 -3.5555555555555e-01 22 11 1.1111111111111e-01 26 11 4.4444444444443e-03 27 11 5.5511151231258e-17 28 11 5.5511151231258e-17 29 11 4.4444444444446e-03 30 11 -3.4694469519536e-17 2 12 -3.5555555555555e-01 3 12 -1.0666666666667e+00 4 12 -3.5555555555554e-01 11 12 -1.0666666666666e+00 12 12 5.6888888888888e+00 13 12 -1.0666666666667e+00 20 12 -3.5555555555555e-01 21 12 -1.0666666666667e+00 22 12 -3.5555555555555e-01 28 12 2.2204460492503e-16 29 12 1.7777777777778e-02 30 12 1.9428902930940e-16 2 13 1.1111111111111e-01 3 13 -3.5555555555556e-01 4 13 -4.0000000000000e-01 5 13 -3.5555555555555e-01 6 13 1.1111111111111e-01 11 13 -5.3290705182007e-15 12 13 -1.0666666666667e+00 13 13 3.9111111111111e+00 14 13 -1.0666666666667e+00 15 13 -2.6645352591004e-15 20 13 1.1111111111111e-01 21 13 -3.5555555555556e-01 22 13 -3.9999999999999e-01 23 13 -3.5555555555555e-01 24 13 1.1111111111111e-01 28 13 2.2204460492503e-16 29 13 4.4444444444443e-03 30 13 1.6653345369377e-16 31 13 1.1102230246252e-16 32 13 4.4444444444446e-03 33 13 6.9388939039072e-17 4 14 -3.5555555555555e-01 5 14 -1.0666666666667e+00 6 14 -3.5555555555555e-01 13 14 -1.0666666666667e+00 14 14 5.6888888888888e+00 15 14 -1.0666666666666e+00 22 14 -3.5555555555555e-01 23 14 -1.0666666666667e+00 24 14 -3.5555555555554e-01 31 14 -7.7715611723761e-16 32 14 1.7777777777778e-02 33 14 -1.6653345369377e-16 4 15 1.1111111111112e-01 5 15 -3.5555555555557e-01 6 15 -4.0000000000001e-01 7 15 -3.5555555555554e-01 8 15 1.1111111111111e-01 13 15 -2.6645352591004e-15 14 15 -1.0666666666666e+00 15 15 3.9111111111110e+00 16 15 -1.0666666666667e+00 22 15 1.1111111111112e-01 23 15 -3.5555555555557e-01 24 15 -3.9999999999999e-01 31 15 4.4408920985006e-16 32 15 4.4444444444444e-03 34 15 -4.7184478546569e-16 35 15 4.4444444444444e-03 36 15 -3.1918911957973e-16 40 15 -3.5555555555555e-01 41 15 1.1111111111111e-01 6 16 -3.5555555555554e-01 7 16 -1.0666666666666e+00 8 16 -3.5555555555558e-01 15 16 -1.0666666666667e+00 16 16 5.6888888888888e+00 17 16 -1.0666666666667e+00 24 16 -3.5555555555553e-01 35 16 1.7777777777777e-02 36 16 3.8857805861880e-16 40 16 -1.0666666666666e+00 41 16 -3.5555555555558e-01 6 17 1.1111111111111e-01 7 17 -3.5555555555554e-01 8 17 -3.9999999999998e-01 9 17 -3.5555555555552e-01 16 17 -1.0666666666667e+00 17 17 3.9111111111111e+00 18 17 -1.0666666666667e+00 24 17 1.1111111111111e-01 34 17 -2.2204460492503e-16 35 17 4.4444444444441e-03 36 17 -2.2204460492503e-16 37 17 -1.3877787807815e-16 38 17 4.4444444444448e-03 39 17 -2.7755575615629e-16 40 17 -3.5555555555553e-01 41 17 -3.9999999999997e-01 42 17 -3.5555555555551e-01 8 18 -3.5555555555556e-01 9 18 -1.0666666666667e+00 17 18 -1.0666666666667e+00 18 18 5.6888888888888e+00 37 18 -6.6613381477509e-16 38 18 1.7777777777778e-02 39 18 -3.3306690738755e-16 41 18 -3.5555555555555e-01 42 18 -1.0666666666667e+00 1 19 1.3322676295502e-15 2 19 1.1111111111111e-01 10 19 -1.0666666666667e+00 11 19 -3.5555555555555e-01 19 19 1.9555555555556e+00 20 19 -2.0000000000000e-01 25 19 -1.3333333333333e-01 26 19 -2.2222222222222e-02 27 19 -1.3333333333333e-02 1 20 1.1111111111111e-01 2 20 -6.6666666666669e-02 3 20 1.1111111111111e-01 4 20 -2.2222222222222e-02 10 20 -3.5555555555555e-01 11 20 -3.9999999999999e-01 12 20 -3.5555555555555e-01 13 20 1.1111111111111e-01 19 20 -2.0000000000000e-01 20 20 1.2444444444444e+00 21 20 -2.0000000000001e-01 22 20 -3.3333333333331e-02 25 20 -3.3333333333334e-02 26 20 -5.5555555555556e-03 27 20 -6.6666666666667e-03 28 20 -3.3333333333334e-02 29 20 -5.5555555555557e-03 30 20 -6.6666666666669e-03 2 21 1.1111111111111e-01 3 21 3.5527136788005e-15 4 21 1.1111111111111e-01 11 21 -3.5555555555555e-01 12 21 -1.0666666666667e+00 13 21 -3.5555555555556e-01 20 21 -2.0000000000001e-01 21 21 1.9555555555556e+00 22 21 -2.0000000000000e-01 28 21 -1.3333333333333e-01 29 21 -2.2222222222222e-02 30 21 -4.0000000000000e-02 2 22 -2.2222222222222e-02 3 22 1.1111111111111e-01 4 22 -6.6666666666664e-02 5 22 1.1111111111111e-01 6 22 -2.2222222222223e-02 11 22 1.1111111111111e-01 12 22 -3.5555555555555e-01 13 22 -3.9999999999999e-01 14 22 -3.5555555555555e-01 15 22 1.1111111111112e-01 20 22 -3.3333333333331e-02 21 22 -2.0000000000000e-01 22 22 1.2444444444444e+00 23 22 -2.0000000000001e-01 24 22 -3.3333333333335e-02 28 22 -3.3333333333332e-02 29 22 -5.5555555555553e-03 30 22 -1.3333333333333e-02 31 22 -3.3333333333334e-02 32 22 -5.5555555555556e-03 33 22 -1.3333333333333e-02 4 23 1.1111111111111e-01 5 23 7.5495165674511e-15 6 23 1.1111111111111e-01 13 23 -3.5555555555555e-01 14 23 -1.0666666666667e+00 15 23 -3.5555555555557e-01 22 23 -2.0000000000001e-01 23 23 1.9555555555555e+00 24 23 -1.9999999999998e-01 31 23 -1.3333333333333e-01 32 23 -2.2222222222222e-02 33 23 -6.6666666666667e-02 4 24 -2.2222222222223e-02 5 24 1.1111111111111e-01 6 24 -6.6666666666670e-02 7 24 1.1111111111110e-01 8 24 -2.2222222222222e-02 13 24 1.1111111111111e-01 14 24 -3.5555555555554e-01 15 24 -3.9999999999999e-01 16 24 -3.5555555555553e-01 17 24 1.1111111111111e-01 22 24 -3.3333333333335e-02 23 24 -1.9999999999998e-01 24 24 1.2444444444444e+00 31 24 -3.3333333333334e-02 32 24 -5.5555555555556e-03 33 24 -2.0000000000000e-02 34 24 -3.3333333333331e-02 35 24 -5.5555555555552e-03 36 24 -1.9999999999999e-02 40 24 -2.0000000000004e-01 41 24 -3.3333333333329e-02 1 25 1.3333333333333e-01 2 25 3.3333333333333e-02 10 25 1.1102230246252e-16 19 25 -1.3333333333333e-01 20 25 -3.3333333333334e-02 25 25 0.0000000000000e+00 1 26 4.4444444444444e-03 2 26 1.1111111111111e-03 10 26 1.7777777777778e-02 11 26 4.4444444444443e-03 19 26 -2.2222222222222e-02 20 26 -5.5555555555556e-03 26 26 0.0000000000000e+00 1 27 1.3333333333333e-02 2 27 6.6666666666666e-03 10 27 1.3877787807814e-17 11 27 5.5511151231258e-17 19 27 -1.3333333333333e-02 20 27 -6.6666666666667e-03 27 27 0.0000000000000e+00 2 28 3.3333333333334e-02 3 28 1.3333333333333e-01 4 28 3.3333333333331e-02 11 28 5.5511151231258e-17 12 28 2.2204460492503e-16 13 28 2.2204460492503e-16 20 28 -3.3333333333334e-02 21 28 -1.3333333333333e-01 22 28 -3.3333333333332e-02 28 28 0.0000000000000e+00 2 29 1.1111111111111e-03 3 29 4.4444444444444e-03 4 29 1.1111111111111e-03 11 29 4.4444444444446e-03 12 29 1.7777777777778e-02 13 29 4.4444444444443e-03 20 29 -5.5555555555557e-03 21 29 -2.2222222222222e-02 22 29 -5.5555555555553e-03 29 29 0.0000000000000e+00 2 30 6.6666666666669e-03 3 30 4.0000000000000e-02 4 30 1.3333333333333e-02 11 30 -3.4694469519536e-17 12 30 1.9428902930940e-16 13 30 1.6653345369377e-16 20 30 -6.6666666666669e-03 21 30 -4.0000000000000e-02 22 30 -1.3333333333333e-02 30 30 0.0000000000000e+00 4 31 3.3333333333334e-02 5 31 1.3333333333333e-01 6 31 3.3333333333334e-02 13 31 1.1102230246252e-16 14 31 -7.7715611723761e-16 15 31 4.4408920985006e-16 22 31 -3.3333333333334e-02 23 31 -1.3333333333333e-01 24 31 -3.3333333333334e-02 31 31 0.0000000000000e+00 4 32 1.1111111111111e-03 5 32 4.4444444444444e-03 6 32 1.1111111111111e-03 13 32 4.4444444444446e-03 14 32 1.7777777777778e-02 15 32 4.4444444444444e-03 22 32 -5.5555555555556e-03 23 32 -2.2222222222222e-02 24 32 -5.5555555555556e-03 32 32 0.0000000000000e+00 4 33 1.3333333333334e-02 5 33 6.6666666666666e-02 6 33 2.0000000000000e-02 13 33 6.9388939039072e-17 14 33 -1.6653345369377e-16 22 33 -1.3333333333333e-02 23 33 -6.6666666666667e-02 24 33 -2.0000000000000e-02 33 33 0.0000000000000e+00 6 34 3.3333333333332e-02 7 34 1.3333333333333e-01 8 34 3.3333333333333e-02 15 34 -4.7184478546569e-16 17 34 -2.2204460492503e-16 24 34 -3.3333333333331e-02 34 34 0.0000000000000e+00 40 34 -1.3333333333333e-01 41 34 -3.3333333333334e-02 6 35 1.1111111111110e-03 7 35 4.4444444444444e-03 8 35 1.1111111111112e-03 15 35 4.4444444444444e-03 16 35 1.7777777777777e-02 17 35 4.4444444444441e-03 24 35 -5.5555555555552e-03 35 35 0.0000000000000e+00 40 35 -2.2222222222222e-02 41 35 -5.5555555555555e-03 6 36 1.9999999999999e-02 7 36 9.3333333333331e-02 8 36 2.6666666666666e-02 15 36 -3.1918911957973e-16 16 36 3.8857805861880e-16 17 36 -2.2204460492503e-16 24 36 -1.9999999999999e-02 36 36 0.0000000000000e+00 40 36 -9.3333333333331e-02 41 36 -2.6666666666667e-02 8 37 3.3333333333334e-02 9 37 1.3333333333333e-01 17 37 -1.3877787807815e-16 18 37 -6.6613381477509e-16 37 37 0.0000000000000e+00 41 37 -3.3333333333334e-02 42 37 -1.3333333333333e-01 8 38 1.1111111111111e-03 9 38 4.4444444444443e-03 17 38 4.4444444444448e-03 18 38 1.7777777777778e-02 38 38 0.0000000000000e+00 41 38 -5.5555555555556e-03 42 38 -2.2222222222222e-02 8 39 2.6666666666667e-02 9 39 1.2000000000000e-01 17 39 -2.7755575615629e-16 18 39 -3.3306690738755e-16 39 39 0.0000000000000e+00 41 39 -2.6666666666667e-02 42 39 -1.2000000000000e-01 6 40 1.1111111111111e-01 7 40 -6.6613381477509e-15 8 40 1.1111111111111e-01 15 40 -3.5555555555555e-01 16 40 -1.0666666666666e+00 17 40 -3.5555555555553e-01 24 40 -2.0000000000004e-01 34 40 -1.3333333333333e-01 35 40 -2.2222222222222e-02 36 40 -9.3333333333331e-02 40 40 1.9555555555555e+00 41 40 -1.9999999999998e-01 6 41 -2.2222222222222e-02 7 41 1.1111111111112e-01 8 41 -6.6666666666668e-02 9 41 1.1111111111111e-01 15 41 1.1111111111111e-01 16 41 -3.5555555555558e-01 17 41 -3.9999999999997e-01 18 41 -3.5555555555555e-01 24 41 -3.3333333333329e-02 34 41 -3.3333333333334e-02 35 41 -5.5555555555555e-03 36 41 -2.6666666666667e-02 37 41 -3.3333333333334e-02 38 41 -5.5555555555556e-03 39 41 -2.6666666666667e-02 40 41 -1.9999999999998e-01 41 41 1.2444444444445e+00 42 41 -2.0000000000005e-01 8 42 1.1111111111111e-01 9 42 3.1086244689504e-15 17 42 -3.5555555555551e-01 18 42 -1.0666666666667e+00 37 42 -1.3333333333333e-01 38 42 -2.2222222222222e-02 39 42 -1.2000000000000e-01 41 42 -2.0000000000005e-01 42 42 1.9555555555556e+00 starpu-1.2.3+dfsg/examples/spmv/matrix_market/mm_to_bcsr.c000066400000000000000000000205061320135501600237130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2014, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "mm_to_bcsr.h" /* Some debug functions */ static void print_block(tmp_block_t *block, unsigned r, unsigned c) { printf(" **** block %u %u **** \n", block->i, block->j); unsigned i, j; for (j = 0; j < r; j++) { for (i = 0; i < c; i++) { printf("%2.2f\t", block->val[i + j*c]); } printf("\n"); } } static void print_all_blocks(tmp_block_t *block_list, unsigned r, unsigned c) { tmp_block_t *current_block = block_list; while(current_block) { print_block(current_block, r, c); current_block = current_block->next; } } static void print_bcsr(bcsr_t *bcsr) { fprintf(stderr, "** BSCR **\n"); fprintf(stderr, "non zero - blocks = %u\n", bcsr->nnz_blocks); fprintf(stderr, "nrows - blocks = %u\n", bcsr->nrows_blocks); fprintf(stderr, "block size : c %u r %u\n", bcsr->c, bcsr->r); } static unsigned count_blocks(tmp_block_t *block_list) { unsigned count = 0; tmp_block_t *current_block = block_list; while(current_block) { count++; current_block = current_block->next; } return count; } static unsigned count_row_blocks(tmp_block_t *block_list) { unsigned maxrow = 0; tmp_block_t *current_block = block_list; while(current_block) { if (current_block->j > maxrow) maxrow = current_block->j; current_block = current_block->next; } return (maxrow+1); } /* Find the block that corresponds to (i,j) if it exists in the list */ static tmp_block_t *search_block(tmp_block_t *block_list, unsigned i, unsigned j) { tmp_block_t *current_block = block_list; /* printf("search %d %d\n", i, j); */ while (current_block) { if ((current_block->i == i) && (current_block->j == j)) { /* we found the block */ return current_block; } current_block = current_block->next; }; /* no entry was found ... */ return NULL; } static tmp_block_t *create_block(unsigned c, unsigned r) { tmp_block_t *block; block = malloc(sizeof(tmp_block_t)); block->val = calloc(c*r, sizeof(float)); return block; } /* determine if next block is bigger in lexical order */ static unsigned next_block_is_bigger(tmp_block_t *block, unsigned i, unsigned j) { tmp_block_t *next = block->next; if (next) { /* we evaluate lexical order */ if (next->j < j) return 0; if (next->j > j) return 1; /* next->j == j */ return (next->i > i); } /* this is the last block, so it's bigger */ return 1; } /* we insert a block in the list, directly at the appropriate place */ static void insert_block(tmp_block_t *block, tmp_block_t **block_list, unsigned i, unsigned j) { /* insert block at the beginning of the list */ /*block->next = *block_list; *block_list = block; */ /* insert the block in lexicographical order */ /* first find an element that is bigger, then insert the block just before it */ tmp_block_t *current_block = *block_list; if (!current_block) { /* list was empty */ *block_list = block; block->next = NULL; return; } while (current_block) { if (next_block_is_bigger(current_block, i, j)) { /* insert block here */ block->next = current_block->next; current_block->next = block; return; } current_block = current_block->next; }; /* should not be reached ! */ } /* we add an element to the list of blocks, it is either added to an existing block or in a block specifically created if there was none */ static void insert_elem(tmp_block_t **block_list, unsigned abs_i, unsigned abs_j, float val, unsigned c, unsigned r) { /* we are looking for the block that contains (abs_i, abs_j) (abs = absolute) */ unsigned i,j; i = abs_i / c; j = abs_j / r; tmp_block_t *block; block = search_block(*block_list, i, j); if (!block) { /* the block does not exist yet */ /* create it */ block = create_block(c, r); block->i = i; block->j = j; /* printf("create block %d %d !\n", i, j); */ /* insert it in the block list */ insert_block(block, block_list, i, j); } /* now insert the value in the corresponding block */ unsigned local_i, local_j, local_index; local_i = abs_i % c; local_j = abs_j % r; local_index = local_j * c + local_i; block->val[local_index] = val; } /* transform a list of values (with coordinates) into a list of blocks that are easily processed into BCSR */ static tmp_block_t * mm_to_blocks(int nz, unsigned *I, unsigned *J, float *val, unsigned c, unsigned r) { int elem; /* at first, the list of block is empty */ tmp_block_t *block_list = NULL; for (elem = 0; elem < nz; elem++) { insert_elem(&block_list, I[elem], J[elem], val[elem], c, r); } return block_list; } static void fill_bcsr(tmp_block_t *block_list, unsigned c, unsigned r, bcsr_t *bcsr) { unsigned block = 0; unsigned current_offset = 0; size_t block_size = c*r*sizeof(float); tmp_block_t *current_block = block_list; while(current_block) { /* copy the val from the block to the contiguous area in the BCSR */ memcpy(&bcsr->val[current_offset], current_block->val, block_size); /* write the the index of the block * XXX should it be in blocks ? */ bcsr->colind[block] = current_block->i; if ((bcsr->rowptr[current_block->j] == 0) && (current_block->j != 0)) { /* this is the first element of the line */ bcsr->rowptr[current_block->j] = block; } block++; current_offset = block*c*r; current_block = current_block->next; }; /* for all lines where there were no block at all (XXX), fill the 0 in rowptr */ /* the first row must start at 0 ? */ bcsr->rowptr[0] = 0; unsigned row; for (row = 1; row < bcsr->nrows_blocks; row++) { if (bcsr->rowptr[row] == 0) bcsr->rowptr[row] = bcsr->rowptr[row-1]; } bcsr->rowptr[bcsr->nrows_blocks] = bcsr->nnz_blocks; } static bcsr_t * blocks_to_bcsr(tmp_block_t *block_list, unsigned c, unsigned r) { unsigned nblocks; /* print_all_blocks(block_list, r, c); */ nblocks = count_blocks(block_list); bcsr_t *bcsr = malloc(sizeof(bcsr_t)); bcsr->nnz_blocks = nblocks; bcsr->r = r; bcsr->c = c; unsigned nrows_blocks = count_row_blocks(block_list); bcsr->nrows_blocks = nrows_blocks; bcsr->val = malloc(nblocks*r*c*sizeof(float)); bcsr->colind = malloc(nblocks*sizeof(unsigned)); bcsr->rowptr = calloc((nrows_blocks + 1), sizeof(unsigned)); fill_bcsr(block_list, c, r, bcsr); return bcsr; } bcsr_t *mm_to_bcsr(unsigned nz, unsigned *I, unsigned *J, float *val, unsigned c, unsigned r) { bcsr_t *bcsr; tmp_block_t *block_list; block_list = mm_to_blocks(nz, I, J, val, c, r); bcsr = blocks_to_bcsr(block_list, c, r); print_bcsr(bcsr); return bcsr; } bcsr_t *mm_file_to_bcsr(char *filename, unsigned c, unsigned r) { FILE *f; MM_typecode matcode; int ret_code; int M, N; int nz; int i; unsigned *I, *J; float *val; bcsr_t *bcsr; if ((f = fopen(filename, "r")) == NULL) { fprintf(stderr, "File <%s> not found\n", filename); exit(1); } if (mm_read_banner(f, &matcode) != 0) { printf("Could not process Matrix Market banner.\n"); exit(1); } /* This is how one can screen matrix types if their application */ /* only supports a subset of the Matrix Market data types. */ if (mm_is_complex(matcode) && mm_is_matrix(matcode) && mm_is_sparse(matcode) ) { printf("Sorry, this application does not support "); printf("Market Market type: [%s]\n", mm_typecode_to_str(matcode)); exit(1); } /* find out size of sparse matrix .... */ if ((ret_code = mm_read_mtx_crd_size(f, &M, &N, &nz)) !=0) exit(1); /* reseve memory for matrices */ I = malloc(nz * sizeof(unsigned)); J = malloc(nz * sizeof(unsigned)); /* XXX float ! */ val = (float *) malloc(nz * sizeof(float)); for (i=0; i #include #include #include #include "mmio.h" /* convert a matrix stored in a file with the matrix market format into the * BCSR format */ typedef struct tmp_block { /* we have a linked list of blocks */ struct tmp_block *next; /* column i, row j*/ unsigned i, j; float *val; } tmp_block_t; typedef struct { unsigned r,c; unsigned nnz_blocks; unsigned nrows_blocks; float *val; uint32_t *colind; uint32_t *rowptr; } bcsr_t; /* directly read input from a file */ bcsr_t *mm_file_to_bcsr(char *filename, unsigned c, unsigned r); /* read the matrix as a set of valuated coordinates */ bcsr_t *mm_to_bcsr(unsigned nz, unsigned *I, unsigned *J, float *val, unsigned c, unsigned r); starpu-1.2.3+dfsg/examples/spmv/matrix_market/mmio.c000066400000000000000000000277671320135501600225500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2013, 2014, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * Matrix Market I/O library for ANSI C * * See http://math.nist.gov/MatrixMarket for details. * * */ #include #include #include #include #include "mmio.h" int mm_read_unsymmetric_sparse(const char *fname, int *M_, int *N_, int *nz_, double **val_, int **I_, int **J_) { FILE *f; MM_typecode matcode; int M, N, nz; int i; double *val; int *I, *J; if ((f = fopen(fname, "r")) == NULL) { fprintf(stderr, "File <%s> not found\n", fname); return -1; } if (mm_read_banner(f, &matcode) != 0) { fprintf(stderr, "mm_read_unsymetric: Could not process Matrix Market banner "); fprintf(stderr, " in file [%s]\n", fname); return -1; } if ( !(mm_is_real(matcode) && mm_is_matrix(matcode) && mm_is_sparse(matcode))) { fprintf(stderr, "Sorry, this application does not support "); fprintf(stderr, "Market Market type: [%s]\n", mm_typecode_to_str(matcode)); return -1; } /* find out size of sparse matrix: M, N, nz .... */ if (mm_read_mtx_crd_size(f, &M, &N, &nz) !=0) { fprintf(stderr, "read_unsymmetric_sparse(): could not parse matrix size.\n"); return -1; } *M_ = M; *N_ = N; *nz_ = nz; /* reseve memory for matrices */ I = (int *) malloc(nz * sizeof(int)); J = (int *) malloc(nz * sizeof(int)); val = (double *) malloc(nz * sizeof(double)); *val_ = val; *I_ = I; *J_ = J; /* NOTE: when reading in doubles, ANSI C requires the use of the "l" */ /* specifier as in "%lg", "%lf", "%le", otherwise errors will occur */ /* (ANSI C X3.159-1989, Sec. 4.9.6.2, p. 136 lines 13-15) */ for (i=0; i * Copyright (C) 2010, 2011, 2012, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This computes an SPMV with a CSR sparse matrix, by splitting it in * horizontal stripes and processing them in parallel. */ #include "spmv.h" unsigned nblocks = 4; uint32_t size = 4*1024*1024; starpu_data_handle_t sparse_matrix; starpu_data_handle_t vector_in, vector_out; static void parse_args(int argc, char **argv) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-size") == 0) { char *argptr; size = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-nblocks") == 0) { char *argptr; nblocks = strtol(argv[++i], &argptr, 10); } } } /* This filter function takes a CSR matrix, and divides it into nparts with the * same number of rows. */ static void csr_filter_func(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts) { struct starpu_csr_interface *csr_father = (struct starpu_csr_interface *) father_interface; struct starpu_csr_interface *csr_child = (struct starpu_csr_interface *) child_interface; uint32_t nrow = csr_father->nrow; size_t elemsize = csr_father->elemsize; uint32_t firstentry = csr_father->firstentry; /* Every sub-parts should contain the same number of non-zero entries */ uint32_t chunk_size = (nrow + nparts - 1)/nparts; uint32_t *rowptr = csr_father->rowptr; uint32_t first_index = id*chunk_size - firstentry; uint32_t local_firstentry = rowptr[first_index]; uint32_t child_nrow = STARPU_MIN(chunk_size, nrow - id*chunk_size); uint32_t local_nnz = rowptr[first_index + child_nrow] - rowptr[first_index]; csr_child->id = csr_father->id; csr_child->nnz = local_nnz; csr_child->nrow = child_nrow; csr_child->firstentry = local_firstentry; csr_child->elemsize = elemsize; if (csr_father->nzval) { csr_child->rowptr = &csr_father->rowptr[first_index]; csr_child->colind = &csr_father->colind[local_firstentry]; csr_child->nzval = csr_father->nzval + local_firstentry * elemsize; } } /* partition the CSR matrix along a block distribution */ static struct starpu_data_filter csr_f = { .filter_func = csr_filter_func, /* This value is defined later on */ .nchildren = -1, /* the children also use a csr interface */ }; static struct starpu_data_filter vector_f = { .filter_func = starpu_vector_filter_block, /* This value is defined later on */ .nchildren = -1, }; static struct starpu_codelet spmv_cl = { .cpu_funcs = {spmv_kernel_cpu}, .cpu_funcs_name = {"spmv_kernel_cpu"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {spmv_kernel_cuda}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {spmv_kernel_opencl}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .nbuffers = 3, .modes = {STARPU_R, STARPU_R, STARPU_W}, .model = NULL, .name = "spmv" }; int main(int argc, char **argv) { int ret; unsigned part; double timing; double start, end; unsigned row, pos; unsigned ind; /* CSR matrix description */ float *nzval; uint32_t nnz; uint32_t *colind; uint32_t *rowptr; /* Input and Output vectors */ float *vector_in_ptr; float *vector_out_ptr; /* * Parse command-line arguments */ parse_args(argc, argv); /* * Launch StarPU */ ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* * Create a 3-band sparse matrix as input example */ nnz = 3*size-2; starpu_malloc((void **)&nzval, nnz*sizeof(float)); starpu_malloc((void **)&colind, nnz*sizeof(uint32_t)); starpu_malloc((void **)&rowptr, (size+1)*sizeof(uint32_t)); assert(nzval && colind && rowptr); /* fill the matrix */ for (row = 0, pos = 0; row < size; row++) { rowptr[row] = pos; if (row > 0) { nzval[pos] = 1.0f; colind[pos] = row-1; pos++; } nzval[pos] = 5.0f; colind[pos] = row; pos++; if (row < size - 1) { nzval[pos] = 1.0f; colind[pos] = row+1; pos++; } } STARPU_ASSERT(pos == nnz); rowptr[size] = nnz; /* initiate the 2 vectors */ starpu_malloc((void **)&vector_in_ptr, size*sizeof(float)); starpu_malloc((void **)&vector_out_ptr, size*sizeof(float)); assert(vector_in_ptr && vector_out_ptr); /* fill them */ for (ind = 0; ind < size; ind++) { vector_in_ptr[ind] = 2.0f; vector_out_ptr[ind] = 0.0f; } /* * Register the CSR matrix and the 2 vectors */ starpu_csr_data_register(&sparse_matrix, STARPU_MAIN_RAM, nnz, size, (uintptr_t)nzval, colind, rowptr, 0, sizeof(float)); starpu_vector_data_register(&vector_in, STARPU_MAIN_RAM, (uintptr_t)vector_in_ptr, size, sizeof(float)); starpu_vector_data_register(&vector_out, STARPU_MAIN_RAM, (uintptr_t)vector_out_ptr, size, sizeof(float)); /* * Partition the CSR matrix and the output vector */ csr_f.nchildren = nblocks; vector_f.nchildren = nblocks; starpu_data_partition(sparse_matrix, &csr_f); starpu_data_partition(vector_out, &vector_f); /* * If we use OpenCL, we need to compile the SpMV kernel */ #ifdef STARPU_USE_OPENCL compile_spmv_opencl_kernel(); #endif start = starpu_timing_now(); /* * Create and submit StarPU tasks */ for (part = 0; part < nblocks; part++) { struct starpu_task *task = starpu_task_create(); task->cl = &spmv_cl; task->handles[0] = starpu_data_get_sub_data(sparse_matrix, 1, part); task->handles[1] = vector_in; task->handles[2] = starpu_data_get_sub_data(vector_out, 1, part); ret = starpu_task_submit(task); if (STARPU_UNLIKELY(ret == -ENODEV)) { FPRINTF(stderr, "No worker may execute this task\n"); exit(0); } } starpu_task_wait_for_all(); end = starpu_timing_now(); /* * Unregister the CSR matrix and the output vector */ starpu_data_unpartition(sparse_matrix, STARPU_MAIN_RAM); starpu_data_unpartition(vector_out, STARPU_MAIN_RAM); /* * Unregister data */ starpu_data_unregister(sparse_matrix); starpu_data_unregister(vector_in); starpu_data_unregister(vector_out); /* * Display the result */ for (row = 0; row < STARPU_MIN(size, 16); row++) { FPRINTF(stdout, "%2.2f\t%2.2f\n", vector_in_ptr[row], vector_out_ptr[row]); } starpu_free(nzval); starpu_free(colind); starpu_free(rowptr); starpu_free(vector_in_ptr); starpu_free(vector_out_ptr); /* * Stop StarPU */ starpu_shutdown(); timing = end - start; FPRINTF(stderr, "Computation took (in ms)\n"); FPRINTF(stdout, "%2.2f\n", timing/1000); return 0; } starpu-1.2.3+dfsg/examples/spmv/spmv.h000066400000000000000000000023531320135501600177120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __SPMV_H__ #define __SPMV_H__ #include #include #include #include #include #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #ifdef STARPU_USE_CUDA void spmv_kernel_cuda(void *descr[], void *args); #endif #ifdef STARPU_USE_OPENCL void spmv_kernel_opencl(void *descr[], void *args); void compile_spmv_opencl_kernel(void); #endif void spmv_kernel_cpu(void *descr[], void *arg); #endif /* __SPMV_H__ */ starpu-1.2.3+dfsg/examples/spmv/spmv_cuda.cu000066400000000000000000000063331320135501600210700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014-2015 Université de Bordeaux * Copyright (C) 2010, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* CUDA kernel for SPMV */ #include #define MIN(a,b) ((a)<(b)?(a):(b)) extern "C" __global__ void spmv_kernel(uint32_t nnz, uint32_t nrow, float *nzval, uint32_t *colind, uint32_t *rowptr, uint32_t firstentry, uint32_t elemsize, float *vecin, uint32_t nx_in, uint32_t elemsize1, float * vecout, uint32_t nx_out, uint32_t elemsize2) { /* only one dimension is used here */ unsigned nthreads = gridDim.x*blockDim.x; unsigned threadid = threadIdx.x + blockIdx.x*blockDim.x; unsigned rowstart = threadid * ((nrow + (nthreads - 1))/nthreads); unsigned rowend = MIN(nrow, (threadid+1) * ((nrow + (nthreads - 1))/nthreads)); unsigned row; for (row = rowstart; row < rowend; row++) { float tmp = 0.0f; unsigned index; unsigned firstindex = rowptr[row] - firstentry; unsigned lastindex = rowptr[row+1] - firstentry; for (index = firstindex; index < lastindex; index++) { tmp += nzval[index]*vecin[colind[index]]; } vecout[row] = tmp; } } extern "C" __global__ void spmv_kernel_3(uint32_t nnz, uint32_t nrow, float *nzval, uint32_t *colind, uint32_t *rowptr, uint32_t firstentry, float *vecin, uint32_t nx_in, float * vecout, uint32_t nx_out) { /* only one dimension is used here */ unsigned block_rowstart = blockIdx.x*( (nrow + gridDim.x - 1)/gridDim.x ); unsigned block_rowend = MIN((blockIdx.x+1)*( (nrow + gridDim.x - 1)/gridDim.x ), nrow); unsigned row; for (row = block_rowstart + threadIdx.x; row < block_rowend; row+=blockDim.x) { float tmp = 0.0f; unsigned index; unsigned firstindex = rowptr[row] - firstentry; unsigned lastindex = rowptr[row+1] - firstentry; for (index = firstindex; index < lastindex; index++) { tmp += nzval[index]*vecin[colind[index]]; } vecout[row] = tmp; } } extern "C" void spmv_kernel_cuda(void *descr[], void *args) { uint32_t nnz = STARPU_CSR_GET_NNZ(descr[0]); uint32_t nrow = STARPU_CSR_GET_NROW(descr[0]); float *nzval = (float *)STARPU_CSR_GET_NZVAL(descr[0]); uint32_t *colind = STARPU_CSR_GET_COLIND(descr[0]); uint32_t *rowptr = STARPU_CSR_GET_ROWPTR(descr[0]); uint32_t firstentry = STARPU_CSR_GET_FIRSTENTRY(descr[0]); float *vecin = (float *)STARPU_VECTOR_GET_PTR(descr[1]); uint32_t nx_in = STARPU_VECTOR_GET_NX(descr[1]); float *vecout = (float *)STARPU_VECTOR_GET_PTR(descr[2]); uint32_t nx_out = STARPU_VECTOR_GET_NX(descr[2]); dim3 dimBlock(8, 1); dim3 dimGrid(512, 1); spmv_kernel_3<<>> (nnz, nrow, nzval, colind, rowptr, firstentry, vecin, nx_in, vecout, nx_out); } starpu-1.2.3+dfsg/examples/spmv/spmv_kernels.c000066400000000000000000000104671320135501600214350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2011, 2014-2015 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* OpenCL codelet for SPMV */ #include "spmv.h" #ifdef STARPU_USE_OPENCL struct starpu_opencl_program opencl_codelet; void spmv_kernel_opencl(void *descr[], void *args) { cl_kernel kernel; cl_command_queue queue; int id, devid, err, n; int nnz = (int) STARPU_CSR_GET_NNZ(descr[0]); int nrow = (int) STARPU_CSR_GET_NROW(descr[0]); cl_mem nzval = (cl_mem)STARPU_CSR_GET_NZVAL(descr[0]); cl_mem colind = (cl_mem)STARPU_CSR_GET_COLIND(descr[0]); cl_mem rowptr = (cl_mem)STARPU_CSR_GET_ROWPTR(descr[0]); int firstentry = STARPU_CSR_GET_FIRSTENTRY(descr[0]); cl_mem vecin = (cl_mem)STARPU_VECTOR_GET_DEV_HANDLE(descr[1]); int nx_in = (int)STARPU_VECTOR_GET_NX(descr[1]); cl_mem vecout = (cl_mem)STARPU_VECTOR_GET_DEV_HANDLE(descr[2]); int nx_out = (int)STARPU_VECTOR_GET_NX(descr[2]); id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_codelet, "spmv", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); n=0; err = clSetKernelArg(kernel, n++, sizeof(nnz), &nnz); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, n++, sizeof(nrow), &nrow); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, n++, sizeof(nzval), &nzval); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, n++, sizeof(colind), &colind); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, n++, sizeof(rowptr), &rowptr); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, n++, sizeof(firstentry), &firstentry); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, n++, sizeof(vecin), &vecin); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, n++, sizeof(nx_in), &nx_in); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, n++, sizeof(vecout), &vecout); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, n++, sizeof(nx_out), &nx_out); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=nrow; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, NULL, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } starpu_opencl_release_kernel(kernel); } void compile_spmv_opencl_kernel(void) { int ret; ret = starpu_opencl_load_opencl_from_file("examples/spmv/spmv_opencl.cl", &opencl_codelet, NULL); if (ret) { FPRINTF(stderr, "Failed to compile OpenCL codelet\n"); exit(ret); } } #endif void spmv_kernel_cpu(void *descr[], STARPU_ATTRIBUTE_UNUSED void *arg) { float *nzval = (float *)STARPU_CSR_GET_NZVAL(descr[0]); uint32_t *colind = STARPU_CSR_GET_COLIND(descr[0]); uint32_t *rowptr = STARPU_CSR_GET_ROWPTR(descr[0]); float *vecin = (float *)STARPU_VECTOR_GET_PTR(descr[1]); float *vecout = (float *)STARPU_VECTOR_GET_PTR(descr[2]); uint32_t firstelem = STARPU_CSR_GET_FIRSTENTRY(descr[0]); uint32_t nrow; nrow = STARPU_CSR_GET_NROW(descr[0]); STARPU_ASSERT(nrow == STARPU_VECTOR_GET_NX(descr[2])); unsigned row; for (row = 0; row < nrow; row++) { float tmp = 0.0f; unsigned index; unsigned firstindex = rowptr[row] - firstelem; unsigned lastindex = rowptr[row+1] - firstelem; for (index = firstindex; index < lastindex; index++) { unsigned col; col = colind[index]; tmp += nzval[index]*vecin[col]; } vecout[row] = tmp; } } starpu-1.2.3+dfsg/examples/spmv/spmv_opencl.cl000066400000000000000000000024401320135501600214160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* OpenCL kernel for SPMV */ __kernel void spmv(int nnz, int nrow, __global float* nzval, __global unsigned* colind, __global unsigned* rowptr, int firstentry, __global float *vecin, int nx_in, __global float *vecout, int nx_out) { const int row = get_global_id(0); if (row < nrow) { float tmp = 0.0f; unsigned index; unsigned firstindex = rowptr[row] - firstentry; unsigned lastindex = rowptr[row+1] - firstentry; for (index = firstindex; index < lastindex; index++) { unsigned col; col = colind[index]; tmp += nzval[index]*vecin[col]; } vecout[row] = tmp; } } starpu-1.2.3+dfsg/examples/stencil/000077500000000000000000000000001320135501600172255ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/stencil/0.5.out000066400000000000000000000241551320135501600202670ustar00rootroot00000000000000| 0 0 2 0 2 1 2 1 0 1 2 1 0 1 0 1 0 0 1 0 2 0 2 1 0 1 1 0 2 0 2 1 0 2 0 0 1 0 2 2 0 1 0 1 2 1 2 1 0 0 2 0 1 0 0 1 0 1 2 0 2 2 1 0 | 0 0 0 2 2 2 1 2 1 1 1 1 1 0 1 0 0 0 0 1 0 2 1 1 1 1 1 2 0 2 2 2 0 2 0 0 0 0 2 2 0 0 0 2 2 2 2 0 0 0 0 2 0 0 0 0 1 2 2 2 2 2 2 0 | * 0 0 2 2 2 2 * 1 1 1 1 * * * * 0 0 * * * * * 1 1 * * * * * * * * 0 * * * 2 * * * * * * * * * * * * * * * * * * * * * * * * * * | 0 * * * * * * 1 * * * * 1 1 0 0 * * 0 1 1 1 1 * * 1 1 1 2 2 2 2 2 * 0 0 0 * 2 2 0 0 0 2 2 2 2 0 0 0 0 0 0 0 0 1 1 1 2 2 2 2 2 0 | 0 1 2 2 2 2 2 1 1 1 1 1 1 1 0 0 0 1 0 1 1 1 1 1 1 1 1 1 2 2 2 2 2 0 0 0 0 0 2 2 0 0 2 2 2 2 2 0 0 0 0 0 0 0 0 1 1 1 2 2 2 2 0 0 | 0 2 2 2 2 2 2 2 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 0 0 0 0 0 0 2 0 0 2 2 2 2 2 0 0 0 0 0 0 0 0 1 1 1 2 2 2 0 0 0 | 0 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 0 0 0 0 0 0 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 1 1 1 1 2 2 2 0 0 0 | 0 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 0 0 2 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 0 0 0 0 0 0 0 2 2 2 2 2 0 0 0 0 0 0 0 2 1 1 0 2 2 2 0 0 0 | 0 2 2 2 2 * * * * * 0 1 * * * * * 2 * * * * * * * * * 2 2 2 2 * * * * * * * * * 0 0 2 2 2 2 2 * * * 0 0 * 2 * * * * 2 2 2 * * * | * * * * * 0 0 0 0 0 * * 1 1 1 1 1 * 2 1 0 1 2 1 1 2 2 * * * * 2 1 1 1 1 0 0 0 0 * * * 2 2 * * 0 0 0 * * 0 * 2 1 1 2 * * * 2 1 0 | 2 2 2 2 2 0 0 0 0 0 1 1 1 1 1 0 0 2 2 1 1 1 1 1 1 2 2 2 2 2 2 0 1 1 0 1 0 0 0 0 1 2 2 * * 2 2 2 0 2 1 1 0 0 2 2 1 2 2 2 2 2 1 0 | 2 2 0 2 0 0 0 0 0 1 0 0 1 1 1 0 0 2 2 1 1 1 1 1 1 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 2 2 2 0 0 2 2 2 1 1 0 0 0 0 1 1 0 2 2 2 2 2 1 | 2 2 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 0 1 2 0 0 0 0 1 2 2 2 2 2 0 1 2 1 1 1 0 0 0 0 1 1 0 2 2 2 2 2 2 | * 0 0 0 0 0 0 0 0 0 0 * * * * * 0 * * * * * * * * * * 2 2 2 2 0 0 2 2 0 0 0 0 1 2 2 2 2 2 0 2 1 1 1 1 0 0 0 * * * * * * 2 2 2 * | 0 * 0 0 0 0 0 0 * * * 0 1 1 1 0 * 1 1 1 1 1 1 1 2 2 2 * * * * * * * * * 0 0 * * * * * * * * * * * * * * * * 0 1 1 0 2 2 * * * 2 | 0 0 * * * * * * 0 0 0 0 1 1 1 0 0 1 1 2 1 1 1 1 2 2 2 2 2 2 2 0 0 2 2 0 * * 0 0 2 2 2 2 2 0 1 1 1 1 1 0 0 1 1 1 1 0 0 2 1 2 2 2 | 0 0 0 0 0 0 0 0 0 0 0 0 1 1 2 0 0 2 2 0 1 1 1 2 2 2 2 2 2 2 2 0 0 2 2 1 0 2 0 2 0 2 2 2 2 0 1 1 1 1 1 0 1 1 1 1 1 0 0 1 1 2 2 2 | 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 2 2 2 2 0 1 1 2 2 0 2 1 1 2 0 0 0 2 2 0 0 0 2 2 1 2 2 2 2 0 1 1 1 1 0 1 1 1 1 1 2 0 0 1 1 2 2 2 | 1 0 0 0 0 0 0 0 0 0 0 * * * * * * 0 0 * * * * * * * 0 0 1 1 0 0 2 0 0 0 0 0 2 2 2 2 2 2 2 0 1 1 1 1 0 * * * * 2 2 0 * 1 1 2 2 2 | * * * * * 0 0 2 0 * * 0 1 1 1 1 0 * * 0 2 2 2 2 2 0 * * * * * * * * 2 0 0 0 * * * * 2 2 * * * * * * * 1 1 1 1 * * * 0 * * * * * | 2 0 0 0 0 * * * * 0 0 0 1 1 1 1 0 2 2 0 2 2 2 2 2 0 0 0 1 1 0 0 0 1 * * * * 2 2 2 2 * * 2 2 1 1 1 1 1 1 1 1 1 2 2 0 0 1 1 2 2 2 | 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 1 1 0 2 0 2 2 2 2 2 0 0 2 1 1 0 0 0 2 2 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 2 0 0 0 1 1 1 1 1 | 0 1 0 0 0 0 0 0 0 0 0 0 2 1 1 1 1 0 0 0 2 2 2 2 2 0 0 2 1 1 1 0 0 2 2 2 0 0 2 2 2 2 2 2 2 1 2 1 1 1 1 1 1 1 1 2 0 0 0 1 1 1 1 1 | 2 0 0 0 0 0 0 0 0 2 0 0 0 1 1 1 1 0 0 2 2 2 * * * * 0 2 2 1 2 0 0 0 2 0 0 0 0 2 2 2 2 2 1 1 2 1 1 1 1 1 1 1 * * * 2 0 1 0 1 1 1 | * * 0 0 0 0 2 0 * * * * * * 1 1 * * * * * * 2 2 0 0 * * * * * * 0 0 0 1 0 0 0 0 2 * * * * * * * 1 1 1 1 * * 1 2 0 * * * * * 1 * | 2 0 * * * * * * 2 2 2 0 0 1 * * 1 0 2 2 2 2 2 2 0 0 2 2 2 1 0 0 * * * * * * * * * 2 2 2 1 1 1 1 * * * * 1 1 1 0 0 0 0 0 0 1 * 1 | 2 0 0 1 0 0 2 0 2 2 2 0 0 1 1 1 1 1 2 2 2 2 2 2 0 0 2 2 2 2 0 0 0 0 0 2 1 2 0 0 0 2 2 2 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 | 2 0 0 1 0 0 0 2 2 2 2 0 0 1 1 1 1 1 2 2 2 2 2 2 0 0 2 2 2 2 0 0 0 0 0 2 2 2 0 0 0 2 2 2 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 | 1 0 0 1 0 0 0 2 2 2 2 0 0 1 1 1 1 1 2 2 2 2 2 2 0 0 2 2 2 2 0 0 0 0 2 2 2 0 0 0 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 | 1 0 0 1 0 0 0 2 2 2 2 0 0 1 1 1 1 1 2 2 2 2 2 2 0 0 2 2 2 2 0 0 0 0 2 2 2 0 0 0 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 | 1 0 0 0 0 0 0 2 2 2 0 * * * * * * * * 2 2 * * * * * * * 2 2 2 0 0 0 2 2 2 0 0 0 2 2 2 2 1 1 1 1 1 1 * * * * * * * * 1 1 1 1 1 1 | * * * * * * * * * * * 0 0 0 1 1 1 1 2 * * 2 2 2 0 0 2 2 * * * * * * * * * * * * * * * * * * * * * * 1 1 1 1 1 1 0 0 * * * * * * | 0 0 0 0 0 0 0 2 2 2 1 2 1 2 1 1 1 1 1 2 2 1 1 2 0 2 2 2 2 2 0 0 0 0 0 2 2 2 0 2 2 2 2 2 0 0 0 1 1 1 1 1 1 1 1 0 0 2 0 1 1 1 1 2 | 0 0 0 0 0 0 2 2 2 2 2 1 2 2 1 1 1 1 0 1 0 1 0 2 2 2 2 0 2 2 2 0 1 0 2 2 2 2 2 2 2 2 2 0 0 0 0 1 1 1 1 1 1 1 1 0 2 1 0 1 0 0 2 2 | 0 0 0 0 0 0 2 2 2 2 2 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 2 2 0 0 0 2 2 2 2 2 2 2 1 2 2 0 0 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 2 2 | 0 0 0 0 0 2 2 0 * * * * * * * * * 1 * 0 0 0 * * * * * * * * * 0 0 * * 1 1 1 2 2 2 1 1 2 0 0 2 1 * * 1 1 1 * * * * * * * 0 0 1 2 | * * * * * * * * 2 2 2 1 0 0 2 0 2 * 2 * * * 0 0 0 0 0 0 2 2 2 * * 2 2 * * * * * * * * * * * * * 1 1 * * * 1 1 1 1 1 1 0 * * * * | 0 0 1 0 0 0 0 0 2 2 2 1 0 2 0 2 1 2 2 0 0 0 0 0 0 0 0 2 2 2 2 0 0 2 2 1 1 1 2 2 2 1 2 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 2 2 | 2 0 0 0 0 0 0 0 2 2 1 1 2 0 2 1 2 2 2 0 0 0 0 0 0 0 0 2 2 2 2 0 2 2 2 1 1 1 2 2 2 2 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 2 2 2 | 0 0 0 0 0 0 0 2 2 2 1 1 2 2 2 1 2 2 2 1 0 0 0 0 0 0 2 2 2 2 2 0 0 2 1 1 1 1 2 2 2 2 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 | 0 0 0 2 0 2 0 * * * * * * * * 1 * 2 2 0 0 0 2 0 0 0 2 2 0 2 2 1 2 1 0 1 1 1 2 2 2 2 0 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 | * * * * * * * 2 2 0 1 0 2 2 2 * 2 * * * * * * * * * * * * * * * * * * * * * * * * * * 1 * * * * * * 1 1 * * * * * * * * * * * * | 0 1 0 0 0 2 0 2 2 0 1 1 2 2 2 2 2 2 2 0 0 0 0 0 0 0 2 0 0 2 2 2 2 0 1 1 1 1 1 2 2 2 0 * 2 2 2 0 1 0 * * 1 1 1 1 1 1 1 0 0 0 0 0 | 0 1 1 0 0 2 2 2 2 1 1 1 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 2 2 2 2 0 0 1 1 1 1 2 2 2 2 2 2 2 2 1 2 1 0 1 1 1 1 1 1 1 1 1 1 0 0 0 | 0 1 1 0 0 2 2 2 2 2 2 1 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 2 1 1 1 0 1 0 0 0 1 1 1 2 2 2 2 2 2 2 2 2 2 1 0 0 0 0 1 1 0 1 1 1 1 2 1 0 | 1 1 1 0 0 2 2 2 2 2 2 * * * 2 2 2 2 2 0 0 0 0 0 2 0 1 0 1 1 1 1 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 2 2 0 0 0 0 0 0 0 1 1 1 1 2 1 1 | * * * * * * * * * * * 2 2 2 * * * * * * 0 0 0 * * * * * * * * * * * * * * * * * * 2 2 2 2 1 0 0 2 0 0 0 0 0 0 0 * * * * * * * * | 1 2 1 0 0 2 2 1 1 2 2 2 2 2 0 1 2 2 1 0 * * * 0 0 2 0 1 1 1 1 1 0 0 0 0 0 1 1 2 2 * * * * * * * * * * * 0 0 * * 0 2 1 1 1 2 1 1 | 1 2 0 0 0 1 1 1 1 2 2 2 2 2 2 0 2 2 0 0 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 2 2 2 2 2 2 2 2 2 2 1 0 0 0 0 0 0 * * 0 1 0 0 1 1 1 2 1 1 | 1 2 0 0 0 1 1 1 1 1 1 2 2 2 2 2 0 2 0 0 1 1 0 0 0 0 0 1 1 1 1 1 1 0 0 2 2 2 2 2 2 2 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 1 | 1 2 2 0 0 1 1 1 1 1 1 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 2 2 2 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 2 1 | 1 2 2 0 * 1 1 1 1 1 1 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 2 2 2 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 | * * * * 0 * * * * * * * * * 2 * * * * * * * * * * * * * * * * * * * * * 2 2 2 2 2 2 2 2 2 2 0 0 0 0 2 0 0 0 * * * * * * * * * * | 2 2 2 0 0 1 1 1 1 1 1 2 2 2 * 2 2 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 * * * * * * 2 * * 2 * * * 0 * * * * 1 0 0 1 1 1 1 2 2 2 | 2 2 2 0 0 1 1 1 1 1 1 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 2 2 2 2 2 2 * 2 2 * 0 0 0 * 0 0 0 1 0 0 0 1 1 1 1 2 2 2 | 2 2 2 0 0 1 1 1 1 1 1 2 2 2 2 2 0 0 0 0 0 2 2 0 0 0 0 1 1 1 1 1 1 1 1 0 2 2 2 2 2 2 0 2 2 2 2 0 0 0 0 0 1 1 1 1 0 1 1 1 1 2 2 2 | 2 2 0 0 0 1 1 1 1 1 1 2 2 2 2 2 0 0 0 0 0 2 2 2 2 2 2 2 1 2 1 1 1 1 1 1 2 2 2 2 2 2 2 0 2 2 0 0 0 0 0 1 1 1 1 0 0 0 1 1 1 2 2 0 | 2 * 0 0 0 1 1 1 1 1 0 1 2 2 2 2 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 2 0 0 0 0 2 2 0 0 2 0 1 1 1 1 1 0 0 0 1 1 1 2 0 0 | * 2 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 0 0 0 2 0 0 0 0 0 1 1 * * * * * * * * * 0 * * | 2 2 0 0 0 2 1 1 1 1 1 1 2 2 2 2 0 0 0 0 0 2 2 2 2 2 2 2 0 2 2 1 1 1 1 1 2 2 2 2 0 * 0 * * * * * * * * * 1 1 1 0 0 0 1 1 2 * 2 0 | 2 2 0 0 0 0 1 1 1 1 1 1 2 2 2 2 0 0 0 0 0 2 2 2 2 2 2 2 2 0 1 1 1 1 1 1 2 1 2 0 0 0 * 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 2 1 0 1 | 2 0 0 0 0 0 1 1 1 2 2 2 2 2 2 2 0 0 0 0 2 2 2 2 1 2 1 0 0 0 1 1 1 1 1 1 1 1 0 2 0 0 0 0 0 0 0 0 0 0 1 1 2 2 2 0 0 0 1 1 1 0 0 0 | * * 0 0 0 0 2 1 1 2 2 1 2 2 2 2 0 0 0 0 2 2 2 1 1 1 1 0 0 0 1 2 1 1 2 1 1 1 2 0 0 0 0 0 0 0 0 0 0 0 1 1 2 2 2 0 0 0 1 2 1 0 0 0 | 2 1 * * * * * * * * * * * * * * * * * * * * * * * * * * 0 * * * * * * * * * * 0 * 0 1 0 0 0 0 0 0 0 0 1 2 2 2 2 * * * * * * * * | 2 1 0 0 0 2 2 1 1 2 1 2 2 2 2 2 0 0 0 0 0 2 1 1 1 1 1 0 * 1 1 2 2 0 1 0 1 0 1 * 2 * * * 0 0 0 0 0 * * * * * * * 1 2 0 2 1 0 0 0 | 2 1 0 0 0 0 2 1 1 2 0 2 2 2 2 2 0 0 0 0 0 2 1 1 1 1 1 0 0 1 1 2 2 1 0 0 1 1 1 1 2 1 0 0 * * * * * 0 0 2 2 2 2 1 1 0 0 2 2 0 0 0 | 2 1 0 0 0 0 2 1 1 2 0 0 2 1 2 2 0 0 0 0 0 0 1 1 1 1 0 0 0 1 1 1 1 1 0 0 1 1 1 1 2 2 0 0 0 2 0 2 0 0 0 2 2 2 2 2 2 0 2 2 2 0 0 0 | 0 0 * 0 0 0 0 1 1 1 1 2 2 2 2 2 0 0 0 0 0 0 1 1 1 1 0 0 0 1 2 2 1 1 0 0 1 1 1 1 2 2 0 0 0 2 1 2 0 0 0 2 2 2 2 2 2 2 2 2 2 0 0 0 | * * 0 * 0 * * * * * * * * * * * * * 0 0 0 * * * * * * 0 0 * 2 2 * * 0 * * * * * * * 0 0 0 2 1 1 0 0 0 2 2 2 2 2 * * * * * * * * | 0 0 0 0 * 0 0 1 1 1 1 2 1 1 2 1 2 0 * * * 0 1 1 1 1 0 * * 1 * * 2 1 * 0 1 1 1 0 1 2 * * * * * * * * * * * * * * 2 2 2 2 2 0 2 1 | 0 0 0 0 0 0 0 1 1 1 1 2 1 2 1 1 2 2 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 0 0 0 2 0 0 2 0 0 0 0 2 2 1 0 0 0 1 2 2 2 2 2 2 2 2 2 2 0 1 | 1 0 0 0 0 0 1 1 1 1 1 0 0 0 1 2 2 1 2 1 2 1 0 1 1 0 1 0 0 0 2 2 2 2 0 2 2 0 0 0 0 0 0 0 0 2 2 0 0 0 0 1 2 2 2 2 1 1 2 2 2 2 0 1 | * * 0 0 0 1 * * * * * * 0 0 0 0 0 0 1 1 1 1 1 1 1 1 * 0 0 2 2 2 2 2 2 2 2 0 0 2 2 1 1 0 0 2 2 2 2 2 0 1 2 2 2 1 1 1 2 2 2 2 * * | 1 0 * * * * 0 2 1 1 1 0 * * * * * * * * * * * * * * 0 * * * * * * * * * * * * * * * * * 0 2 2 2 2 0 0 * * 2 1 1 * * * * * * 2 1 | 1 0 1 1 1 1 0 2 1 1 0 0 0 0 0 0 0 0 1 1 1 2 0 1 1 1 0 0 0 1 2 2 2 2 2 0 2 2 2 2 1 1 1 2 * * * * * * * 0 0 * * * 1 1 2 2 2 0 0 1 | 1 1 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 2 2 2 2 0 0 1 1 0 0 0 0 2 2 2 2 0 0 2 2 2 2 1 1 2 2 0 2 2 2 2 0 0 0 0 1 1 1 1 2 2 2 2 0 0 1 | 2 1 1 1 2 2 1 1 1 1 0 0 0 0 0 0 0 0 2 0 2 2 0 0 0 0 0 0 0 0 2 2 1 1 0 0 0 2 2 2 1 1 2 0 2 0 2 2 2 0 0 0 0 1 1 1 1 1 1 2 2 0 2 1 | 1 1 1 2 2 2 1 1 1 1 0 1 0 2 2 0 0 0 0 2 2 2 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 2 2 2 1 1 1 0 0 0 0 2 2 0 0 0 0 1 1 1 1 1 2 2 0 2 2 2 | starpu-1.2.3+dfsg/examples/stencil/0.out000066400000000000000000000300321320135501600201130ustar00rootroot00000000000000| 0 0 2 1 0 1 1 1 0 1 1 0 1 1 0 0 1 2 0 2 0 0 1 0 2 1 0 2 1 0 2 1 2 0 0 1 0 1 2 0 1 2 2 0 0 1 2 0 1 0 1 0 0 1 2 0 2 0 0 1 2 1 0 2 | * * 2 0 * 0 * 0 * * 0 * * * * * * 0 * * 0 * * 0 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 0 * * * * * * * | 0 0 * * 1 * 1 * 2 2 * 0 2 0 1 1 2 * 1 2 * 1 2 * 2 0 1 2 0 1 0 1 2 1 0 1 2 2 2 0 0 0 1 2 0 0 0 0 1 1 0 2 0 2 1 0 * 2 0 2 2 0 1 0 | 0 2 1 2 1 1 1 0 2 1 1 2 0 1 2 0 1 1 0 1 2 0 1 1 0 2 0 1 1 0 2 0 1 2 0 0 1 0 0 0 0 1 2 0 1 2 0 0 0 0 1 0 0 0 2 1 0 1 0 0 0 1 2 2 | * * * 1 * 0 2 1 1 * 0 0 0 0 * * * * 0 * 0 * 0 * * 1 * * * * * * * * * * * * 0 0 * * * * 0 * * * * * * * 0 * * * * * * 0 0 * * * | 1 0 1 * 2 * * * * 2 * * * * 1 1 0 2 * 2 * 1 * 1 0 * 2 0 0 0 1 0 0 2 2 0 2 2 * * 2 1 0 1 * 0 0 2 1 2 1 0 * 0 1 0 1 0 2 * * 2 1 0 | 0 0 2 1 1 0 0 2 2 0 1 0 2 1 2 0 1 0 1 1 0 2 2 1 0 0 2 0 1 0 2 2 0 1 2 0 0 0 2 0 2 1 2 0 2 0 1 0 0 1 0 0 2 0 2 0 0 0 2 0 0 2 2 1 | * 1 1 2 * 1 0 0 2 2 0 0 0 2 0 0 2 0 * * 0 * * * * 1 0 * 0 * * 0 0 * * * * * * 2 * * * * 0 * * 0 * * * * 0 * * * * * * * * * * * | 1 * * * 1 * * * * * * * * * * * * * 2 1 * 2 2 1 2 * * 2 * 0 0 * * 1 0 0 1 2 0 * 2 0 2 1 * 2 1 * 0 2 0 1 * 0 0 1 0 1 2 0 1 0 2 1 | 1 2 1 2 1 1 0 1 0 0 0 2 0 0 1 1 0 0 2 0 2 0 0 0 1 1 2 0 1 2 1 1 0 0 0 0 2 1 0 0 0 1 2 0 2 2 2 0 0 2 0 1 2 0 2 0 1 1 0 1 0 0 0 1 | * * 0 0 1 1 1 2 1 0 0 1 0 2 2 0 1 0 0 0 * * 0 * * * 0 0 1 2 0 2 1 2 * * * 1 * * 0 * * 0 * * 0 2 * * 0 1 0 1 2 0 0 0 1 * * 2 * * | 1 0 * * * * * * 0 2 * * * * * * * * * * 2 1 * 2 1 0 * * * * * * * * 0 2 0 * 1 2 * 0 1 * 2 1 * * 1 2 * * * * * * * * * 2 1 * 1 2 | 0 1 1 1 2 1 0 0 * * 0 2 0 2 1 0 0 0 1 0 2 1 1 0 2 1 2 2 0 2 1 1 0 2 2 0 2 0 2 0 1 0 0 0 0 0 2 0 1 0 2 0 0 2 1 0 2 1 2 0 1 1 0 0 | 0 * * 1 2 1 2 1 2 0 0 0 1 1 0 2 0 2 0 0 0 * * 0 1 0 2 0 2 0 0 1 1 1 1 0 0 * * * 2 0 0 0 * * * * 2 0 0 * 0 0 1 2 0 0 2 2 2 * * * | * 0 2 * * * * 0 * 0 0 2 * * * * * * * * * 2 1 * * * * * * * * * * * * * * 2 0 2 * * * * 1 1 0 2 * * * 1 * * * * * * * * * 1 2 1 | 1 0 2 0 1 2 2 * 2 * * * 0 0 0 2 0 0 1 0 0 0 0 2 2 1 0 0 2 1 1 1 0 2 0 1 1 0 0 2 1 0 2 0 0 0 0 1 0 1 2 1 0 0 0 1 1 0 0 2 2 2 2 0 | 0 0 2 1 0 2 0 0 2 1 0 2 0 1 0 0 1 0 2 1 1 1 0 0 2 0 1 2 2 1 0 2 0 1 0 1 2 0 1 0 2 1 2 1 0 2 0 2 0 2 2 0 1 2 0 0 1 0 2 0 0 0 2 1 | * * * * * * * 0 2 2 0 2 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | 1 0 2 0 1 2 0 * * * * * 0 1 1 0 0 0 0 1 0 0 0 2 1 0 2 1 2 0 1 1 1 0 2 0 0 1 0 0 2 0 0 0 0 2 2 1 0 0 0 2 1 0 0 2 2 2 2 2 1 2 0 2 | 0 1 2 2 0 1 0 2 0 1 1 0 2 0 1 1 1 2 0 2 0 0 1 0 1 1 0 1 0 2 1 1 2 1 0 0 2 1 0 0 0 2 0 0 2 1 2 0 1 0 0 0 0 1 0 1 0 2 2 0 2 0 0 0 | * * * * * * * * 0 0 1 1 * * 0 * * * * * * * * * * * * 0 * * * * * * * * * * * * * * * * * * * * * * * * * * * 1 * * * * * * * * | 2 0 1 2 0 1 2 2 * * * * 2 2 * 1 0 2 2 0 1 1 0 0 2 0 1 * 0 0 0 0 2 0 2 0 1 0 0 1 0 1 0 2 0 1 1 2 0 1 0 2 0 1 2 * 1 0 0 2 1 1 1 0 | 2 1 0 0 2 0 2 2 2 0 1 2 0 0 2 0 1 0 0 1 1 0 2 0 2 1 2 0 1 0 0 0 0 1 1 2 2 2 2 2 0 0 0 2 0 2 0 1 1 1 2 1 0 1 0 0 0 0 2 2 0 1 0 1 | * * * * 0 * * * * * 0 * 0 0 * * * * * * * * * * * 2 2 0 2 0 0 * * * * * * * * * * * * * * * * * * * * * * * * * * 0 2 * * * * * | 2 0 2 0 * 2 0 2 2 1 * 2 * * 1 1 1 0 0 2 1 1 1 2 1 * * * * * * 1 0 0 0 2 1 0 0 0 0 0 0 2 2 1 0 2 0 0 1 2 1 2 1 1 2 * * 0 2 2 0 0 | 0 2 0 0 0 0 0 0 2 2 2 2 0 0 1 1 2 0 0 0 0 0 0 0 2 1 0 1 1 0 0 2 1 1 2 0 2 2 2 0 1 2 0 2 1 2 1 2 0 2 1 2 1 1 0 1 2 0 0 0 0 2 0 0 | * * * * * 0 0 * 1 * * 2 0 * * * 0 0 * 0 0 0 * 0 * 1 0 2 2 0 0 * * * 0 1 * 0 * 0 * * * * 0 * 0 1 * * * * * * * * * 2 0 * * 1 * * | 0 0 0 1 0 * * 2 * 2 1 * * 2 1 2 * * 1 * * * 1 * 1 * * * * * * 0 2 0 * * 2 * 1 * 2 0 1 2 * 2 * * 1 2 1 0 1 2 0 1 0 * * 0 0 * 2 0 | 1 2 1 0 1 0 1 2 0 0 1 0 1 0 2 0 1 1 1 1 0 0 2 1 0 1 2 1 2 0 0 1 1 0 1 0 0 0 2 1 0 0 2 0 2 1 0 0 1 1 1 2 0 2 0 0 1 2 2 1 1 0 0 2 | * 2 * * * * 1 1 2 2 0 * * * * * * * 0 0 1 0 0 0 2 1 0 1 0 2 0 * * * 0 0 0 2 0 2 0 * 0 * 2 1 1 0 0 1 0 * * * * * * * * 0 1 1 * * | 0 * 2 0 2 0 * * * * * 0 1 0 2 1 2 1 * * * * * * * * * * * * * 2 0 1 * * * * * * * 1 * 2 * * * * * * * 2 2 1 2 1 0 0 0 * * * 0 1 | 1 2 2 0 1 2 1 2 0 0 0 0 1 0 0 1 0 0 1 2 2 1 0 0 0 2 2 1 1 0 1 2 0 2 0 1 2 2 0 2 0 0 0 1 0 2 0 0 0 0 0 2 1 1 2 1 1 0 1 1 0 2 2 0 | 1 * 0 0 2 1 1 2 2 0 1 0 1 0 0 * 0 2 0 1 2 0 * * * * 0 0 2 0 * 0 2 1 2 0 0 1 1 0 1 1 0 * 0 2 1 0 0 2 1 0 * * * * * 2 0 0 0 0 1 1 | * 2 * * * * * * * * * * * * * 2 * * * * * * 2 1 0 1 * * * * 2 * * * * * * * * * * * * 2 * * * * * * * * 0 0 1 0 0 * * * * * * * | 0 2 0 0 1 0 2 2 0 0 1 0 0 0 1 1 0 2 0 0 0 2 2 0 1 0 1 1 2 1 0 2 2 1 0 1 2 1 0 1 2 1 0 1 0 0 2 1 1 0 2 1 0 0 0 2 2 0 0 1 0 0 2 1 | 2 2 0 2 1 0 1 2 1 2 0 1 0 * 2 0 0 0 0 1 0 2 0 2 0 1 1 2 1 0 2 0 1 0 2 2 0 0 2 2 1 1 0 0 2 2 0 1 2 0 1 0 1 * * * 0 0 2 0 0 0 0 2 | * * * * * * * * * * 0 1 * 1 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1 0 0 * * * * * * * * | 0 0 0 2 0 0 0 2 1 2 * * 1 2 0 1 0 2 0 2 0 2 2 0 1 0 0 1 0 2 1 0 0 2 0 0 0 0 0 2 0 0 1 2 1 0 0 2 0 1 0 2 0 2 1 0 2 2 1 0 2 0 1 1 | 2 1 0 1 2 0 0 0 2 0 0 2 1 1 2 0 0 2 0 2 1 0 0 0 1 2 0 0 2 0 1 0 0 0 1 2 0 1 2 1 2 1 0 2 1 0 0 2 1 1 1 0 0 0 0 2 1 0 0 2 0 2 1 0 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 0 * * * * * * * * * * * * * * * * * | 0 2 0 0 0 2 1 0 1 2 0 2 1 0 2 0 2 2 0 0 2 0 0 0 2 1 2 1 1 1 1 2 2 0 0 2 2 0 0 1 2 2 0 1 0 2 * 0 0 1 1 2 0 1 2 2 2 1 2 0 0 1 2 1 | 1 2 1 1 2 0 0 0 1 2 0 0 0 2 0 1 1 0 1 0 0 0 0 0 0 0 2 2 2 1 1 1 2 1 2 0 1 0 0 1 0 2 0 2 0 0 2 1 2 1 2 2 0 0 1 2 0 0 0 0 2 1 1 1 | * 2 * * 2 1 * * * * * * * * * * * 2 * * * * * 2 1 2 0 * * * * * * * 0 * 2 * * * * * * * * * * * * * * * 0 * * * * * * 0 2 0 0 2 | 1 * 2 1 * * 1 2 0 0 2 1 2 1 0 0 0 * 0 0 0 2 0 * * * * 0 2 0 1 0 0 1 * 2 * 1 0 2 1 2 2 2 0 2 1 0 0 0 1 2 * 2 1 2 0 0 1 * * * * * | 2 1 1 2 1 1 0 0 0 0 1 2 0 0 0 0 1 2 0 0 0 2 1 1 0 1 0 0 1 0 2 0 2 1 0 2 0 0 2 0 1 0 1 1 2 0 2 0 2 1 0 1 2 1 1 0 1 2 1 0 0 0 0 1 | 0 1 2 0 * 1 * * * * * * * 0 * * 1 0 2 * * * * * * 0 0 0 * * * * * * 0 2 1 * * * * * * * * * * * 0 1 0 0 * 0 2 0 1 2 * * 0 2 1 2 | * * * * 1 * 1 2 1 2 1 0 1 * 1 2 * * * 2 1 0 0 0 1 * * * 1 0 1 0 2 0 * * * 0 1 2 0 0 2 1 2 0 0 0 * * * * 2 * * * * * 0 0 * * * * | 2 2 0 0 0 2 0 0 1 1 1 0 1 0 2 0 0 1 0 0 2 2 1 2 0 2 2 1 0 1 0 2 2 2 0 0 0 2 0 2 2 0 1 2 0 1 1 1 2 0 0 0 0 2 1 0 0 2 2 1 0 1 0 2 | 0 0 0 2 0 1 2 * * * 0 * * * 2 2 1 0 * * * * * * 0 * * 2 1 1 2 * * * * * 0 * * * 2 1 1 0 * * * * 1 1 0 0 0 * * 0 1 0 0 0 * 2 0 0 | * * * * * * * 0 2 1 * 2 0 1 * * * * 1 0 2 0 0 2 * 0 2 * * * * 0 1 1 0 2 * 1 1 2 * * * * 1 0 2 1 * * * * * 0 0 * * * * * 2 * * * | 1 0 0 0 2 2 0 0 2 1 0 1 1 0 2 1 2 1 2 0 0 1 2 1 0 0 2 2 1 1 0 0 1 0 1 1 0 2 0 1 2 0 1 2 0 2 0 0 1 2 0 0 2 0 2 0 0 0 0 0 1 0 0 2 | 1 0 2 0 0 1 2 * * * * * 2 0 2 * 0 0 0 1 0 * * * * * 1 2 0 1 0 1 2 2 * * 1 2 0 1 2 0 2 2 * 0 0 * 0 2 0 * 2 0 0 0 0 0 2 0 1 0 2 0 | * * * * * * * 2 1 0 2 1 * * * 1 * * * * * 0 0 1 0 0 * * * * * * * * 1 0 * * * * * * * * 0 * * 1 * * * 1 * * * * * * * * * * * * | 1 2 2 2 1 2 1 0 2 1 2 0 2 0 2 0 1 1 1 2 0 0 2 0 2 1 0 2 1 0 2 1 2 1 0 0 0 0 0 0 0 1 0 1 1 0 1 2 0 1 2 0 0 0 2 0 2 0 2 1 0 2 0 0 | 2 0 0 2 0 0 2 * 1 * * 0 0 2 0 1 0 2 1 1 2 1 2 0 0 0 1 2 0 2 2 0 2 0 2 1 0 0 0 0 1 1 * 2 * 1 2 1 0 1 0 0 0 1 0 2 0 2 2 1 2 0 1 0 | * * * 2 * * * 0 * 0 1 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 0 * 0 * * * * * * * * * * * * * * * * * * * | 0 1 0 * 2 0 0 1 2 0 2 2 1 1 1 2 1 1 0 0 0 0 2 0 0 2 0 1 1 2 2 0 0 2 0 1 2 0 2 2 0 0 2 2 0 1 0 1 2 0 2 0 0 1 2 0 2 1 1 0 2 2 0 1 | 2 0 0 0 2 1 0 0 1 1 0 2 2 0 2 1 0 2 0 0 2 1 0 2 0 1 0 1 2 1 1 2 2 1 0 2 1 2 1 0 2 1 0 0 0 1 0 0 0 0 2 1 2 0 1 0 0 0 0 0 1 2 0 2 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | 1 0 1 2 2 1 0 1 0 1 0 1 2 0 1 0 1 0 1 0 1 1 0 0 0 2 2 1 0 2 0 2 0 2 1 0 2 0 1 0 0 0 0 2 0 1 0 2 2 1 2 0 2 0 0 2 0 1 1 2 1 0 2 0 | 1 0 1 0 0 0 2 1 0 2 1 2 2 1 0 2 2 0 0 0 1 1 0 0 1 2 0 1 2 0 0 0 0 0 0 0 1 1 2 0 2 1 0 2 0 1 0 1 2 2 0 0 0 2 0 1 2 1 2 0 0 2 1 2 | * * * * * * * * * * * * * * * * * * * * * * * * * 0 * * * 1 1 * 0 * * * 1 0 1 0 * * * * * * 1 * * * * * * * * * 0 1 0 * * * * * | 0 1 2 0 2 0 0 1 1 1 2 2 0 1 2 0 0 2 1 0 1 1 0 2 2 * 2 1 0 * * 2 * 0 0 1 * * * * 1 2 0 1 1 2 * 0 0 0 0 0 2 0 2 1 * * * 1 1 2 0 2 | 2 1 0 0 1 0 2 0 2 0 1 1 1 0 2 0 2 0 2 0 0 2 0 2 0 0 1 2 2 2 1 0 1 0 0 1 2 0 2 1 2 2 1 0 1 1 0 2 0 1 1 0 1 0 1 0 0 1 2 0 0 1 0 1 | 0 * 0 * * * * * * * 1 * * * * * 0 * 0 * * * * * * * * 1 * 1 1 0 0 0 0 0 1 * 0 * * * * * * * * 0 * * * * * * 0 0 0 2 0 0 * 2 0 0 | * 2 * 2 2 0 1 2 1 0 * 2 0 1 1 0 * 1 * 1 1 0 1 0 1 0 2 * 2 * * * * * * * * 2 * 1 1 2 0 0 0 1 0 * 0 2 0 0 0 1 * * * * * * 2 * * * | 1 0 1 0 0 0 0 1 2 0 0 0 2 1 1 1 2 0 0 0 0 2 1 1 0 0 1 1 2 0 2 0 2 2 2 1 0 0 2 2 0 1 1 1 0 2 1 0 2 0 0 2 0 2 0 0 0 2 1 0 0 2 2 1 | 0 1 2 0 2 0 * * * 0 * 2 * * * * * * 0 0 0 * * 0 * * * 0 1 0 2 2 0 2 2 2 1 1 0 0 * * * 1 0 0 1 1 0 2 * * * * * * 0 2 1 1 1 2 0 1 | * * * * * * 2 1 0 * 0 * 0 0 0 1 0 2 * * * 0 1 * 1 1 1 * * * * * * * * * * * * * 1 0 2 * * * * * * * 1 2 2 1 1 2 * * * * * * * * | 2 1 2 0 0 0 1 0 0 0 2 1 0 1 1 1 2 0 2 0 1 0 1 2 1 0 0 0 0 0 0 2 0 0 0 1 2 1 1 0 1 2 0 1 2 0 1 1 2 0 1 0 0 2 2 0 1 0 0 2 2 0 1 0 | 0 0 0 2 0 * * * 1 0 * 2 2 2 0 2 1 2 0 2 * * * * * * * 1 0 0 2 1 2 0 0 2 0 1 0 2 0 1 0 0 1 0 0 0 1 0 2 1 * * * * * * 1 0 0 1 0 2 | * * * * * 0 2 1 * * 1 * * * * * * * * * 0 1 1 0 0 1 0 * * * * * * * * * * * * * * * * * * * * * * * * * 2 2 0 1 0 1 * * * * * * | 1 1 0 2 0 2 0 1 0 1 0 1 0 0 0 2 0 0 0 2 1 2 1 2 2 0 0 1 0 2 0 1 2 0 0 1 2 2 2 1 1 0 1 0 1 0 0 1 2 1 0 0 2 1 2 0 2 0 0 2 1 0 2 0 | 0 0 1 0 0 0 1 2 0 2 1 0 * 0 1 2 0 0 0 * * * * * * 0 2 0 1 0 2 0 1 1 2 0 1 1 0 1 0 2 1 0 2 0 1 1 1 2 2 2 0 0 2 0 2 2 2 2 2 1 0 1 | * * * * * * * * * * * * 1 * * * * * * 0 1 1 0 0 0 * * * * * 1 2 2 0 0 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | 1 1 0 2 2 0 0 2 2 2 2 1 2 0 0 0 0 1 0 0 0 0 0 0 0 2 1 0 1 0 * * * * * 0 1 2 2 2 1 0 0 2 0 2 2 1 1 1 0 2 1 0 0 1 2 1 0 1 2 1 2 1 | 2 0 0 0 1 0 2 0 1 2 0 0 1 0 0 1 0 2 0 1 2 1 0 1 1 1 0 2 0 2 1 0 2 0 2 0 2 0 1 0 2 0 2 2 1 1 2 2 1 1 0 0 2 1 0 0 2 1 0 1 2 1 1 0 | * * 0 * * * * * * * * * * * * * * * * * * * * * * * * * * * 1 * 2 0 1 * 1 * * * * * * * * * * * * * 0 0 * * * * * * * * * * * * | 0 0 * 1 1 1 0 0 2 0 1 0 1 2 0 0 0 0 2 1 0 0 1 2 0 2 2 0 0 1 * 2 * * * 2 * 2 1 2 0 1 1 1 0 2 0 1 0 2 * * 1 0 2 1 0 0 1 2 1 2 0 1 | 0 0 2 2 0 2 1 2 0 1 0 1 2 0 2 1 1 0 1 1 1 0 0 1 2 0 0 1 1 1 0 1 2 2 0 0 1 0 0 0 1 0 0 1 2 1 0 0 1 1 2 0 0 1 2 0 1 2 1 1 0 0 2 0 | 2 * 0 * * * * * * * * * * * * * 2 0 * * * * * * * * * * * * 1 0 0 1 1 0 0 * 1 * * * 0 * * * * 2 1 0 * 0 2 0 * * * * * * * * * * | * 2 * 1 0 0 1 2 2 0 0 1 0 1 1 0 * * 0 1 1 0 2 1 2 0 1 1 2 1 * * * * * * * 2 * 2 0 1 * 1 2 0 2 * * * 2 * * * 1 0 0 0 0 1 2 2 2 0 | 0 2 1 0 2 2 2 0 2 2 1 2 1 0 1 2 0 1 2 2 0 1 1 0 2 0 0 1 2 1 0 0 2 2 0 0 0 1 0 0 2 0 2 1 2 0 0 1 1 1 2 0 1 1 0 1 1 2 0 0 0 2 0 0 | 2 * 0 2 2 * * * * * * * * * * * * 0 0 2 0 * * * * * * * * * * 0 0 0 0 2 1 1 2 * * * * * 0 * 0 2 1 0 2 1 * * 0 0 * * 0 1 2 0 2 2 | * 1 * * * 0 0 0 1 0 0 2 0 2 1 0 0 * * * * 0 0 2 0 2 0 1 0 2 0 * * * * * * * * 1 2 1 2 1 * 2 * * * * * * 1 2 * * 2 1 * * * * * * | 2 1 0 0 1 0 2 0 2 0 0 0 0 2 1 0 2 1 2 1 0 0 0 1 1 0 0 1 0 0 2 2 2 2 1 2 2 1 0 1 0 2 0 1 2 1 0 0 2 1 0 2 1 0 1 0 0 2 1 2 2 1 2 1 | 0 * 1 2 2 * * 2 0 0 0 1 0 1 2 0 * * 1 0 2 0 2 * 2 * 2 0 * 0 2 1 2 1 1 2 1 0 0 0 2 0 1 0 2 0 2 0 1 0 * 2 2 0 2 0 0 2 1 * * 0 0 1 | * 1 * * * 0 1 * * * * * * * * * 0 1 * * * * * 0 * 0 * * 1 * * * * * * * * * * * * * * * * * * * * * 0 * * * * * * * * 2 0 * * * | 0 0 1 2 1 1 2 1 2 1 1 0 1 0 1 0 2 2 0 1 2 1 1 2 1 0 1 0 0 2 2 1 0 2 0 0 1 0 0 2 0 0 2 0 0 0 0 2 1 0 1 2 2 0 0 1 0 1 0 1 2 0 0 0 | 0 1 1 0 2 1 1 0 0 2 1 1 2 2 2 2 0 0 0 0 2 1 2 0 1 1 1 0 * 0 1 0 0 0 2 2 2 2 1 2 0 2 0 2 0 2 0 0 0 1 0 * 1 0 0 0 0 1 * * * 2 2 0 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * 2 * * * * * * * * * * * * * * * * * * * * * * 2 * * * * * * 0 0 1 * * * | 0 1 2 2 0 1 0 0 0 0 1 2 1 2 0 1 0 1 1 1 2 0 1 2 2 2 0 2 0 1 1 2 1 2 0 1 0 0 1 0 0 1 1 0 2 0 2 0 2 0 0 0 0 0 2 1 2 1 0 2 1 0 0 1 | 0 0 0 2 0 2 2 0 2 1 2 0 0 0 1 2 0 2 0 1 1 2 0 1 0 2 1 2 0 1 2 0 1 0 1 1 0 0 1 2 0 1 0 2 0 2 0 0 1 0 2 0 2 1 2 0 0 0 0 1 0 0 2 2 | starpu-1.2.3+dfsg/examples/stencil/1.out000066400000000000000000000231411320135501600201170ustar00rootroot00000000000000| 2 0 2 0 2 0 2 0 2 0 1 1 1 1 1 0 2 0 2 0 2 0 2 0 2 1 2 1 1 1 1 0 2 0 2 0 2 0 2 0 2 1 0 1 1 1 1 2 0 2 0 2 0 2 0 2 1 0 1 1 1 1 0 0 | 0 2 0 2 0 2 0 2 0 2 1 1 1 1 1 2 0 2 0 2 0 2 0 2 1 2 1 1 1 1 1 1 0 2 0 2 0 2 0 2 1 1 0 1 1 1 1 0 2 0 2 0 2 0 2 1 1 0 1 1 1 0 0 0 | * * * 0 * 0 * 0 0 * 1 1 1 1 1 * * 0 * * * * * 1 * 1 1 1 1 1 1 1 * * * * * * * * * 1 1 1 1 1 1 * * * * * * * * * 1 1 1 1 1 0 0 0 | 0 0 2 * 2 * 2 * * 2 * * 1 * * 2 2 * 2 0 2 0 2 * 2 * * * 1 1 * * 0 0 2 0 2 0 2 0 1 * * * 1 * * 0 0 2 0 2 0 2 1 1 * * * 1 * * * * | 0 0 0 2 0 2 0 0 0 2 1 1 * 1 1 2 2 2 0 2 0 2 2 2 1 1 1 1 * * 1 1 0 0 0 2 0 2 0 0 1 1 1 1 * 1 1 0 0 0 2 0 2 1 1 1 1 1 1 * 1 0 0 0 | 0 0 0 0 2 0 0 0 0 2 1 1 1 1 1 2 2 2 2 0 2 2 2 2 1 1 1 1 1 1 1 1 0 0 0 0 2 0 0 0 1 1 1 1 1 1 1 0 0 2 2 2 2 1 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 2 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 2 2 2 2 1 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 2 0 0 0 0 0 0 1 1 1 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 2 2 2 2 2 1 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 0 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 * * 2 * 0 0 0 0 * * * * * 1 1 * * * * * 2 2 1 1 1 1 1 2 1 * * * 0 0 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1 1 * 0 * * * * 0 0 1 1 1 * * 1 1 0 0 1 * * * * * * * * * 1 1 0 * * | 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 2 2 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 0 0 1 1 2 2 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 2 2 2 2 0 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 0 0 1 1 2 2 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 2 2 2 2 1 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 0 0 1 1 2 2 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 2 2 2 2 1 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 0 0 1 1 2 2 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 2 2 2 2 1 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 0 0 1 1 * 1 0 0 0 2 0 0 * * * * 1 1 1 1 0 * * * 2 2 1 1 1 1 1 1 1 1 0 0 0 | * * * 0 0 0 * * * * 2 2 2 1 1 2 2 2 * * * * * * * * * * * * * 1 * * * * * * * 0 0 1 1 * * * * * 0 2 2 * * * * 1 * * * * * * * * | 0 2 0 * * * 0 0 2 2 * * * * * * * * 2 2 2 2 2 2 2 1 1 0 0 1 1 1 1 0 0 0 2 0 0 0 0 1 1 1 1 1 1 0 0 2 2 2 2 1 1 * 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 2 2 2 2 1 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 2 2 2 2 1 2 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 2 2 2 2 2 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 1 2 2 2 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 * * * 2 2 2 1 1 2 2 2 2 2 2 2 * * * * * * * * 1 * * * * * * * * * * * * 1 1 * * * * * * * * * * * * * 1 1 * * * * | * * * * * * * 0 2 2 * * * * * * * * * * * * 2 2 2 2 2 0 0 1 * 1 1 0 0 0 0 0 0 0 0 1 1 * * 1 1 0 0 0 2 2 2 2 1 1 1 1 * * 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 0 0 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 0 0 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 0 0 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 * 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 0 0 1 1 1 1 * * * * * * * * 1 1 1 1 1 1 * * * * 2 2 2 1 1 1 1 1 1 1 0 0 0 | * * * * * * * 0 * * * * 2 1 1 2 2 2 2 2 2 2 2 * * * * * * * * * * 0 0 0 0 0 0 0 1 * * 1 * * * 0 0 0 2 * * * 1 1 1 1 1 * * * * * | 0 0 0 0 0 0 0 0 2 2 2 2 * * * 2 2 2 * * * * * 2 2 2 2 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 * 1 1 1 0 0 0 2 2 2 2 * * * * * 1 1 2 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 * * * 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 0 0 0 0 0 0 * * * * * 1 1 * 0 0 0 2 2 2 2 1 1 1 1 1 1 1 0 0 0 | 0 * * * * * * * * * 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 * * * * * * * * * * * * * 0 1 1 1 1 * * 1 * * * * * * * * * * * * * * * * 0 | * 0 0 0 0 0 0 0 2 2 * * * * * * * * 2 2 * * * * * * 2 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 1 0 0 * | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 * * 2 2 2 2 2 2 2 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 * * * * * 0 0 0 0 0 0 * * * * * * * * * 0 0 2 2 2 2 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 * * * 1 1 1 1 1 * * * * * * 0 1 1 1 1 1 1 1 0 * * * * * * * * * * * * * * * 0 | * * 0 0 0 0 0 0 2 2 * * * * * * * * * 2 2 * * * * 2 2 2 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 1 0 0 * | 0 0 * * * * * * * * 2 2 2 1 1 2 2 2 2 * * 2 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 1 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 0 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 0 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 * * * * * * 0 0 0 0 0 0 * * * * * * * * * 0 0 2 2 2 2 1 1 1 1 1 * 0 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 * * * * 2 2 2 2 2 2 2 2 * * * 2 1 1 1 1 1 * * * 0 * * 0 1 1 1 1 1 1 1 0 * * * 2 * * * * * * * 1 * * 0 0 | 0 0 0 0 0 0 0 0 2 2 * * 2 1 1 2 * * 2 2 2 2 * * 2 2 2 2 1 1 1 1 1 0 0 0 * 0 0 0 1 1 1 1 1 1 1 0 0 0 2 * 2 2 1 1 1 1 1 1 0 0 * * | * * * 0 0 0 0 * * * 2 2 2 1 1 2 2 2 * * * * 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 0 0 0 0 | 0 0 0 * * * * 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 0 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 1 0 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 0 0 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 0 0 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 * * * * * * * 0 0 0 0 0 * * * * * * * * * 0 0 2 2 2 2 1 1 1 1 1 0 0 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 * * 2 2 2 2 2 2 2 2 2 * * * 2 1 1 1 1 1 0 * * * * * 0 1 1 1 1 1 1 1 0 * * * 2 * * * * * * * * * 0 0 0 | 0 0 0 0 0 0 0 0 2 * * * * 1 1 * * * * 2 2 * * * 2 2 2 2 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 * 2 2 1 1 1 1 1 0 0 * * 0 | * * * 0 0 0 0 * * 2 2 2 2 1 1 2 2 2 2 * * 2 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 0 0 0 0 * | 0 0 0 * * * * 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 0 0 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 0 0 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 0 0 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 0 0 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 0 0 * * * * * * * 0 0 0 2 2 2 2 1 1 1 1 1 0 0 0 0 0 | 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 * * * * * * * * * * * * * * * * 1 1 1 1 1 1 1 * * * * * * * * * * * * * 0 0 0 0 | * 0 0 0 0 0 0 0 2 * * * * * * * * * * * * * * * 2 2 2 2 1 1 1 1 0 0 0 0 0 0 0 0 1 0 2 0 1 1 1 0 0 0 2 2 2 2 1 1 1 1 1 0 * * * * | 0 _ _ _ _ _ _ _ _ 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 2 1 1 1 0 0 0 2 2 2 2 2 2 1 1 1 0 0 0 0 0 | starpu-1.2.3+dfsg/examples/stencil/2.out000066400000000000000000000227361320135501600201310ustar00rootroot00000000000000| 2 0 2 0 2 0 2 0 2 0 0 0 0 2 0 2 0 2 1 1 1 1 1 1 1 2 2 2 2 2 1 0 0 0 0 1 0 0 0 0 0 0 0 2 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 0 2 0 2 0 0 0 0 0 2 2 0 2 1 1 1 1 1 1 1 1 2 2 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 0 0 0 0 0 0 2 2 2 1 1 1 1 1 1 1 1 1 2 2 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 0 0 0 0 0 0 2 2 2 1 1 1 1 1 1 1 1 1 2 2 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | * * * * * * * * * * * * * * * * * 1 1 1 1 1 1 1 1 * * * * * * 0 0 0 0 * * * * * * * * 1 1 1 * * * * * * * * * * 1 1 1 * * * * * | 0 2 2 2 2 2 2 0 0 0 0 0 0 2 2 2 1 * 1 1 1 1 1 * * 2 2 2 2 2 1 * * * * 0 0 0 0 0 0 0 0 * * * 1 2 2 2 2 2 2 2 2 1 * * * 0 0 0 0 0 | 0 2 2 2 2 2 2 0 0 0 0 0 0 2 2 2 1 1 * 1 1 1 * 1 1 2 2 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 0 0 0 0 0 0 2 2 2 1 1 1 * 1 * 1 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 0 0 0 0 0 0 2 2 2 1 1 1 1 * 1 1 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 0 0 0 0 0 0 2 2 2 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 0 0 0 0 0 0 2 2 2 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | * * 2 2 2 2 2 0 0 0 0 0 * 2 2 2 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 * * * * | 0 2 * * * * * * * * * * 0 * * * * 1 1 1 1 1 1 1 1 1 1 * * * * * * * * * * * * * * * * * 1 1 * * * * * * * * * * 1 1 * * 0 0 0 0 | 0 2 2 2 2 2 2 0 0 0 0 0 0 2 2 2 1 * * 1 1 1 1 1 1 * * 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 * * 1 2 2 2 2 2 2 2 2 1 * * 1 0 0 0 0 0 | 0 2 2 2 2 2 2 0 0 0 0 0 0 2 2 2 1 1 1 * * 1 1 * * 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 0 0 0 0 0 0 2 2 2 1 1 1 1 1 * * 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 0 0 0 0 0 0 2 2 2 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 0 0 0 0 0 0 2 2 2 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 0 0 0 0 0 0 2 2 2 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | * * * 2 2 2 * * * * * * * * * 2 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 * * * 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 * * * * * * | 0 2 2 * * * 2 0 0 0 0 0 0 2 2 * * 1 1 1 1 1 1 1 1 1 1 2 2 * * * * * * * * * * * 0 0 0 * 1 1 1 2 2 2 2 2 2 2 2 1 * * 1 0 0 0 0 0 | 0 2 2 2 2 2 2 0 0 0 0 0 0 2 2 2 1 * * 1 1 1 1 1 1 1 1 * * 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 * * 1 2 2 2 * * * * * * 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 0 0 0 0 0 0 2 2 2 1 1 1 * * 1 1 1 1 * * 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 * * * * 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 0 0 0 0 0 0 2 2 2 1 1 1 1 1 * 1 * * 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 0 0 0 0 0 0 2 2 2 1 1 1 1 1 1 * 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 0 0 0 0 0 0 2 2 2 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 0 0 0 0 0 0 2 2 2 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 * * | * * * 2 2 * * * * * * * * * * 2 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 * * * * * * * * * * * * 1 1 1 1 2 2 2 2 2 2 2 2 1 1 * * * * * 0 0 | 0 2 2 * * 2 2 0 0 0 0 0 0 2 2 * * 1 1 1 1 1 1 1 1 1 1 2 2 * * 0 0 0 0 0 0 0 0 0 0 0 0 * * 1 1 2 2 2 2 2 2 2 2 1 * 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 0 0 0 0 0 0 2 2 2 1 * 1 1 1 1 1 1 1 1 1 * * 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 * 1 2 2 2 2 2 2 2 * * 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 0 0 0 0 0 2 2 2 1 1 * * 1 1 1 1 1 * * 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 * * 2 2 2 2 2 * 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 0 0 0 0 0 2 2 2 1 1 1 1 * * 1 1 * 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 * * * * * 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 0 0 0 0 0 2 2 2 1 1 1 1 1 1 * * 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 0 0 0 0 0 2 2 2 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | * * 2 2 2 2 2 2 * * * * * * 2 2 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 * * * * * * | 0 2 * 2 2 2 * * 0 0 0 0 0 2 * 2 1 1 1 1 1 1 1 1 1 1 1 2 2 2 * * * * * * * * * * * * * * 1 1 1 2 2 2 2 2 2 2 2 1 1 * 1 0 0 0 0 0 | 0 2 2 * * * 2 2 0 0 0 0 0 2 2 * * 1 1 1 1 1 1 1 1 1 1 2 2 * 1 0 0 0 0 0 0 0 0 0 0 0 0 1 * 1 1 2 2 2 2 2 2 2 2 1 * 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 0 0 0 0 0 2 2 2 1 * 1 1 1 1 1 1 1 1 1 * * 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 * 1 2 2 2 2 2 2 2 * * 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 0 0 0 0 0 2 2 2 1 1 * 1 1 1 1 1 1 1 * 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 * * 2 2 2 2 2 * 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 0 0 0 0 0 2 2 2 1 1 1 * * 1 1 1 * * 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 * * 2 * * 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 1 1 1 1 1 * 1 * 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 * 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 1 1 1 1 1 1 * 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | * * 2 2 2 2 2 2 * * * * * * 2 2 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 * * * 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 * * * * * * | 0 2 * * 2 2 * * 2 0 0 0 0 2 * * 1 1 1 1 1 1 1 1 1 1 1 2 2 2 * * * * * * * * * * 0 0 0 * 1 1 1 2 2 2 2 2 2 2 2 1 1 * 1 0 0 0 0 0 | 0 2 2 2 * * 2 2 2 0 0 0 0 2 2 2 * 1 1 1 1 1 1 1 1 1 1 2 * * 1 0 0 0 0 0 0 0 0 0 0 0 1 1 * 1 1 2 2 2 2 2 2 2 2 1 * 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 1 * 1 1 1 1 1 1 1 1 1 * 2 2 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 * 1 2 2 2 2 2 2 2 * * 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 1 1 * * 1 1 1 1 1 1 * 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 * * 2 2 2 2 * * 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 1 1 1 1 * 1 1 1 * * 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 * * 2 * 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 1 1 1 1 1 * 1 * 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 * 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 1 1 1 1 1 1 * 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | * * * 2 2 2 2 2 * 0 0 * * * 2 2 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 * * * | 0 2 2 * * * * * 2 * * 0 0 2 * * * 1 1 1 1 1 1 1 1 1 1 2 2 2 * * * * * * * * * * * * * 1 1 1 1 2 2 2 2 2 2 2 2 1 1 * * * * 0 0 0 | 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 1 * 1 1 1 1 1 1 1 1 1 * * * 1 0 0 0 0 0 0 0 0 0 0 0 1 * 1 1 1 2 2 2 2 2 2 2 2 1 * 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 1 1 * * 1 1 1 1 1 * * 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 1 1 * * 1 2 2 2 2 2 * * * * 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 1 1 1 1 * 1 1 1 * 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 * * 2 * * * 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 1 1 1 1 1 * 1 * 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 * 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 1 1 1 1 1 1 * 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | * * * 2 2 2 2 2 * 0 0 0 * * * 2 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 * * * * * 2 * * * 0 2 2 * * 1 1 1 1 1 1 1 1 1 1 2 2 2 1 0 0 0 0 0 0 * * * * * 1 1 1 1 1 2 2 2 2 2 2 2 2 1 1 * * * * * * * | 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 1 * * 1 1 1 1 1 1 1 * * * * * * * * * * * 0 0 0 0 0 * * 1 1 1 2 2 2 2 2 2 2 2 1 * 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 1 1 1 * * 1 1 1 1 * 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 1 1 * * 1 2 * * * * * * * * 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 1 1 1 1 1 * 1 * * 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 * * 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 1 1 1 1 1 1 * 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | * * * * * * * * * 0 0 0 * * * * 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 * | 0 2 2 2 2 2 2 2 2 * * * 0 2 2 2 * * 1 1 1 1 1 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 * * * * 0 | 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 1 1 * * 1 1 1 1 1 * * * * * * * * 0 0 0 0 0 0 * * * 1 1 1 1 1 2 2 2 2 2 2 2 2 1 1 * * 0 0 0 0 0 | 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 1 1 1 1 * * 1 * * 1 1 2 2 2 1 0 0 * * * * * * 0 0 0 * * * * * * * * * * * * * * * 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 1 1 1 1 1 1 * 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 | starpu-1.2.3+dfsg/examples/stencil/3.out000066400000000000000000000231411320135501600201210ustar00rootroot00000000000000| 2 0 2 0 2 0 2 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 1 1 1 1 1 1 1 1 1 1 1 1 2 1 0 0 0 0 0 0 0 0 0 2 2 2 0 2 0 1 2 1 1 1 1 1 2 2 2 | 2 2 0 2 0 2 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 0 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 0 2 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 * * * * * * * * * * 2 * 2 * * * * * * * 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 * * 0 0 0 0 * * * * 2 2 2 * 1 1 1 1 1 1 1 * * 2 2 | * * * * 0 0 0 0 0 0 0 0 0 0 * 0 * 0 2 0 2 0 2 2 * * * 1 1 1 1 1 1 1 * * * * * 0 0 * * * * 0 0 0 2 * * * 2 * * * * * * * 1 2 * * | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 2 2 1 1 1 * * * * * * * 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 * 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 * * * * * * * * * * * * 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 * * * * * * * * * * * * * * 0 * 2 2 2 2 2 1 1 1 1 1 1 1 1 1 * * * 1 1 1 0 0 0 0 0 0 0 0 0 * 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 * * 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 * * 2 2 * * * * * * * * * * 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 * * 2 2 1 1 * * * * * * 2 2 2 | * 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 * * 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 * * * * 1 1 1 1 1 1 * * 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 * | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 * 2 2 2 2 2 2 1 1 1 1 1 1 1 * * * * * * * * * * * * * * * * * 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 * * * * * * * * * * * * * * 0 * 2 2 2 2 2 1 1 * * * * * 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 * 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 * 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 * 2 2 2 2 * * 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 * 2 2 2 1 1 1 1 * * * * 2 2 2 | 2 * 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 * 2 2 * 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 * 2 * * * * * 1 1 1 1 * 2 2 | * 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 * * 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 * 2 1 1 1 1 1 1 1 1 2 * 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 * | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 * * * * * * 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 * * * * * * * * * * * 1 1 1 1 0 0 * * * * * * * 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 * * * * * * * * * * * * * * * 2 2 2 2 * 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 * * 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 * 2 2 * 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 * 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 * 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 * * 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 * * * * * * * * * * * 2 2 | * 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 * 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 * | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 1 1 1 * * * * * * * * * * * * * * * * * 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 * * * * 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 * * * * * 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 * * * * * * * * * * * 2 2 2 2 * 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 * 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 * * * * 0 0 0 0 0 0 0 0 0 0 0 * 2 2 * 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 * 2 2 1 1 1 1 1 1 * * 2 2 2 | 2 2 * 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 * * 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 * * * * * * * * 1 1 * 2 2 | * * 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 * 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 * | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 1 1 1 1 1 1 1 1 * * * * * * * * * * * * 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 * * * * * * * * 1 1 1 1 1 1 1 0 0 0 0 0 * * * * 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 * 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 * 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 * * 2 2 2 * * 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 * 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 * * * * * * * * * * * * * 0 0 * 2 * 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 * 2 2 1 1 1 1 * * * * 2 2 2 | 2 2 * 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 * 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 * * * * * * 1 1 1 1 * 2 2 | 2 * 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 * 2 | * 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 * | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 1 * * * * * * * * * * * * * * * * * * * * * * 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 * * 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 * * 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 * 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 * 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 * 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 * 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 * * * * * * * * * * * * * * 2 2 * 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 * 2 1 1 * * * * * * 2 2 2 | 2 2 2 * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * * 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 * * * 1 1 1 1 1 1 * 2 2 | 2 2 * 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 * 2 | 2 * 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 1 1 1 1 1 1 1 1 * * * * * * * * * * * * 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 * | * 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 * * * * * * * * * 1 1 1 1 1 1 1 0 0 0 0 0 * * * * 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 * 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 * 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 * 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 * 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 * 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 * * 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 * * * * * * * * 2 * 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 * * * * * * 1 1 1 2 2 2 | 2 2 2 * * * * * * * 0 0 0 0 0 0 0 0 * 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 * * * * 2 2 | 2 2 * 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 * 2 | 2 * 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 1 1 * * * * * * * * * * * * * * * * * * * * * * 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 * | * 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 * * * 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 * 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 * 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 * 2 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 * 2 2 1 1 1 1 1 1 * * * * * * * * * * 0 0 0 0 0 0 0 0 2 2 * 2 2 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 * 2 2 2 * * * * * * 1 1 1 1 1 1 1 1 1 0 * 0 0 0 0 0 0 0 2 2 2 * * 1 1 1 1 1 1 1 1 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 * * * * * * 2 2 2 * 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 * * 0 0 0 0 0 2 2 2 2 2 * * * * * * * * 2 2 2 | 2 2 2 * * * * * * * * * * * 0 0 0 0 2 2 2 2 * 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 * * * * * * 2 2 2 2 1 1 1 1 1 1 1 1 * 2 2 | 2 2 * 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 * 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 * 2 2 2 1 1 1 1 1 1 1 1 2 * 2 | 2 * 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 * 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 * 2 * * * * * * * * 1 2 2 * | _ 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 * 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 * 2 1 1 1 1 1 1 1 * * 2 2 | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 _ _ | starpu-1.2.3+dfsg/examples/stencil/4.out000066400000000000000000000237521320135501600201320ustar00rootroot00000000000000| 2 0 2 0 2 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 2 2 2 0 2 0 2 0 2 0 0 0 0 2 0 | 0 2 0 2 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 2 2 2 2 0 2 0 2 0 0 0 0 0 0 2 | * * * * * * 0 * * * * 2 * 2 * 2 * 2 * 2 * 2 * * * * * * * * * * 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 * * * 2 2 * * * * * * * * * * * * | 2 0 2 0 0 0 * 0 0 0 0 * 0 * 0 * 0 * 0 * 0 * 0 2 0 2 0 2 0 2 0 1 * * 1 1 1 1 1 1 1 1 1 1 1 1 * 0 0 2 * * 2 2 0 2 0 0 0 0 0 0 0 0 | 0 2 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 1 1 1 1 * 1 1 1 1 1 1 1 1 1 1 * 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 1 1 1 1 1 1 * 1 1 1 1 1 1 1 1 * 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 | * * * 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 1 1 1 1 1 1 1 1 * 1 1 1 1 1 1 * 1 1 1 0 0 2 2 2 2 2 2 0 0 * * * * * * * | 0 0 0 * * * * * * * * * * * * * * * * * * * * * * * * * * 1 1 1 1 1 1 1 1 * 1 1 1 1 * 1 1 1 * * * * 2 2 2 2 * * * 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 1 1 * 1 1 1 1 1 1 1 1 * 1 1 * 1 1 1 * 1 0 0 2 * 2 2 * 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 1 1 1 1 * 1 1 1 1 1 1 1 1 * * 1 1 1 * 1 1 0 0 2 2 * * 2 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 1 1 1 1 1 1 * 1 1 1 1 1 1 1 1 1 1 1 * 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 | * * * * * 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 1 1 1 1 1 1 1 * 1 1 1 1 1 1 1 1 1 * 1 1 1 1 0 0 2 2 2 2 2 2 0 0 0 * * * * * * | 0 0 0 0 0 * * * * * * * * * * * * * * * * * * * * 1 1 1 1 1 1 1 1 * * 1 1 1 1 1 * * 1 1 1 1 * * * * 2 2 2 2 * * * * 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 2 * 1 1 1 1 1 1 1 1 1 * * 1 1 * 1 1 1 1 1 * 1 0 0 2 * 2 2 * 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 2 2 1 * 1 1 1 1 1 1 1 1 1 1 * * 1 1 1 1 1 * 1 1 0 0 2 2 * * 2 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 * 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 * 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 * 1 1 1 1 1 1 1 1 1 1 1 1 1 * 1 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 | * * * * * * * * * * * 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 * * 1 1 1 1 1 1 1 1 1 1 * 1 1 1 1 1 0 0 2 2 2 2 2 2 * * * * * * * * * | 0 0 0 0 0 0 0 0 0 0 0 * * * * * * * * * * * 2 2 2 1 1 1 1 1 1 * 1 1 1 1 1 1 1 1 * 1 1 1 1 1 * * * * 2 2 2 2 * 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 * 2 2 1 1 1 1 1 1 1 * 1 1 1 1 1 * * 1 1 1 1 1 * 1 0 0 2 * 2 2 * 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 * 2 1 1 1 1 1 1 1 1 * * 1 1 * 1 1 1 1 1 1 * 1 1 0 0 2 2 * * 2 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 * 1 1 1 1 1 1 1 1 1 1 * * 1 1 1 1 1 1 * 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 * * 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 * 1 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 | * * * * * * * * * 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 * 1 1 1 1 1 1 1 1 1 1 1 1 1 * 1 1 1 1 1 0 0 2 2 2 2 2 2 * * * * * * * * * | 0 0 0 0 0 0 0 0 0 * * * * * * * * * * * * * 2 2 2 1 1 1 * 1 1 1 1 1 1 1 1 1 1 1 * 1 1 1 1 1 * * * * 2 2 2 2 * 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 * 2 2 1 1 1 1 * 1 1 1 1 1 1 1 1 1 * 1 1 1 1 1 * 1 0 0 2 * 2 2 * 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 * 2 1 1 1 1 1 * 1 1 1 1 1 1 1 * 1 1 1 1 1 * 1 1 0 0 2 2 * * 2 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 * 1 1 1 1 1 1 * 1 1 1 1 1 * 1 1 1 1 1 * 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 * 1 1 1 1 1 1 * 1 1 * * 1 1 1 1 1 * 1 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 | * * * * * * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 * * 1 1 1 1 1 * * 1 1 1 1 1 1 * 1 1 1 1 1 0 0 2 2 2 2 2 2 * * * * * * * * * | 0 0 0 0 0 0 0 * * * * * * * * * * * * * * * 2 2 2 1 1 1 * 1 1 1 1 1 1 1 1 1 1 1 * 1 1 1 1 1 * * * * 2 2 2 2 * 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 * 2 2 1 1 1 1 * 1 1 1 1 1 1 1 1 1 * 1 1 1 1 1 * 1 0 0 2 * 2 2 * 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 * 2 1 1 1 1 1 * 1 1 1 1 1 1 1 * 1 1 1 1 1 * 1 1 0 0 2 2 * * 2 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 * 1 1 1 1 1 1 * 1 1 1 1 1 * 1 1 1 1 1 * 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 * 1 1 1 1 1 1 * 1 1 * * 1 1 1 1 1 * 1 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 | * * * * * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 * 1 1 1 1 1 1 * * 1 1 1 1 1 1 * 1 1 1 1 1 0 0 2 2 2 2 2 2 0 * * * * * * * * | 0 0 0 0 0 0 * * * * * * * * * * * * * * * * 2 2 2 1 1 * * 1 1 1 1 1 1 1 1 1 1 1 * 1 1 1 1 1 * * * * 2 2 2 2 * * 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 * 2 2 1 1 1 1 * 1 1 1 1 1 1 1 1 1 * 1 1 1 1 1 * 1 0 0 2 * 2 2 * 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 * 2 1 1 1 1 1 * 1 1 1 1 1 1 1 * 1 1 1 1 1 * 1 1 0 0 2 2 * * 2 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 * 1 1 1 1 1 1 * 1 1 1 1 1 * 1 1 1 1 1 * 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 * 1 1 1 1 1 1 * 1 1 1 * 1 1 1 1 1 * 1 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 | * * * * * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 * 1 1 1 1 1 1 * * * 1 1 1 1 1 * 1 1 1 1 1 0 0 2 2 2 2 2 2 0 0 * * * * * * * | 0 0 0 0 0 0 * * * * * * * * * * * * * * * * 2 2 2 1 1 * 1 1 1 1 1 1 1 1 1 1 1 1 * 1 1 1 1 1 * * * * 2 2 2 2 * * * 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 * 2 2 1 1 1 * * 1 1 1 1 1 1 1 1 1 * 1 1 1 1 1 * 1 0 0 2 * 2 2 * 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 * 2 1 1 1 1 1 * 1 1 1 1 1 1 1 * 1 1 1 1 1 * 1 1 0 0 2 2 * * 2 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 * 1 1 1 1 1 1 * 1 1 1 1 1 * 1 1 1 1 1 * 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 * 1 1 1 1 1 1 * 1 1 1 * 1 1 1 1 1 * 1 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 | * * * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 * 1 1 1 1 1 1 * 1 * 1 1 1 1 1 * 1 1 1 1 1 0 0 2 2 2 2 2 2 0 0 0 * * * * * * | 0 0 0 0 * * * * * * * * * * * * * * * * * * 2 2 2 1 1 * 1 1 1 1 1 1 * 1 1 1 1 1 * 1 1 1 1 1 * * * * 2 2 2 2 * * * * 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 * 2 2 1 1 1 * 1 1 1 1 1 1 1 1 1 1 * 1 1 1 1 1 * 1 0 0 2 * 2 2 * 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 * 2 1 1 1 1 * * 1 1 1 1 1 1 1 * 1 1 1 1 1 * 1 1 0 0 2 2 * * 2 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 * 1 1 1 1 1 1 * 1 1 1 1 1 * 1 1 1 1 1 * 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 * 1 1 1 1 1 1 * 1 1 1 * 1 1 1 1 1 * 1 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 | * * * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 * 1 1 1 1 1 1 * 1 * 1 1 1 1 1 * 1 1 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 * * * * * | 0 0 0 0 * * * * * * * * * * * * * * * * * * 2 2 2 1 1 * 1 1 1 1 1 1 * 1 1 1 1 1 * 1 1 1 1 1 * * * * 2 2 2 2 * * * * * 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 * 2 2 1 1 1 * 1 1 1 1 1 1 1 1 1 1 * 1 1 1 1 1 * 1 0 0 2 * 2 2 * 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 * 2 1 1 1 1 * 1 1 1 1 1 1 1 1 * 1 1 1 1 1 * 1 1 0 0 2 2 * * 2 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 * 1 1 1 1 1 * 1 1 1 1 1 1 * 1 1 1 1 1 * 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 * 1 1 1 1 1 * 1 1 1 1 * 1 1 1 1 1 * 1 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 | * * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 * 1 1 1 1 1 * * 1 * 1 1 1 1 1 * 1 1 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 * * * * * | 0 0 0 * * * * * * * * * * * * * * * * * * * 2 2 2 1 1 * 1 1 1 1 1 1 * 1 1 1 1 1 * 1 1 1 1 1 * * * * 2 2 2 2 * * * * * 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 * 2 2 1 1 1 * 1 1 1 1 1 1 1 1 1 1 * 1 1 1 1 1 * 1 0 0 2 * 2 2 * 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 * 2 1 1 1 1 * 1 1 1 1 1 1 1 1 * 1 1 1 1 1 * 1 1 0 0 2 2 * * 2 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 * 1 1 1 1 1 * 1 1 1 1 1 1 * 1 1 1 1 1 * 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 * 1 1 1 1 1 * 1 1 1 1 * 1 1 1 1 1 * 1 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 | * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 * 1 1 1 1 1 * 1 1 * 1 1 1 1 1 * 1 1 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 * * * * | 0 0 * * * * * * * * * * * * * * * * * * * * 2 2 2 1 1 * 1 1 1 1 1 * * 1 1 1 1 1 * 1 1 1 1 1 * * * * 2 2 2 2 * * * * * * 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 * 2 2 1 1 1 * 1 1 1 1 1 1 1 1 1 1 * 1 1 1 1 1 * 1 0 0 2 * 2 2 * 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 * 2 1 1 1 1 * 1 1 1 1 1 1 1 1 * 1 1 1 1 1 * 1 1 0 0 2 2 * * 2 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 * 1 1 1 1 1 * 1 1 1 1 1 1 * 1 1 1 1 1 * 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 * 1 1 1 1 1 * 1 1 1 1 * 1 1 1 1 1 * 1 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 | * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 * 1 1 1 1 1 * 1 1 * 1 1 1 1 1 * 1 1 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 * * * | 0 * * * * * * * * * * * * * * * * * * * * * 2 2 2 1 1 * 1 1 1 1 1 * * 1 1 1 1 1 * 1 1 1 1 1 * * * * 2 2 2 2 * * * * * * * 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 * 2 2 1 1 1 * 1 1 1 1 1 1 1 1 1 1 * 1 1 1 1 1 * 1 0 0 2 * 2 2 * 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 * 2 1 1 1 1 * 1 1 1 1 1 1 1 1 * 1 1 1 1 1 * 1 1 0 0 2 2 * * 2 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 * 1 1 1 1 1 _ _ _ _ _ _ _ _ 1 1 1 1 1 * 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 1 1 1 1 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 | starpu-1.2.3+dfsg/examples/stencil/6.out000066400000000000000000000251711320135501600201310ustar00rootroot00000000000000| 2 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 0 0 0 2 0 2 0 2 0 2 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 | 2 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 0 0 0 0 0 2 0 2 0 2 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 | 2 * * * * * * 2 * 2 * 2 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1 1 1 1 1 1 1 1 1 1 1 1 | * 0 0 0 0 0 0 * 0 * 0 * 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 0 0 0 0 0 0 0 2 0 2 0 1 0 1 1 * 1 1 1 1 1 1 1 1 1 1 * | 2 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 0 0 0 0 0 0 0 0 0 2 0 1 0 1 1 1 1 * 1 1 1 1 1 1 1 1 * 1 | 2 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 * 1 1 1 1 1 1 * 1 1 | 2 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1 1 1 1 1 1 * 1 1 1 1 * 1 1 1 | * 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 * 1 1 1 1 1 1 * 1 1 * 1 1 1 * | 2 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 * 1 1 1 1 1 1 * * 1 1 1 * 1 | 2 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 * 1 1 1 1 1 1 1 1 1 * 1 1 | 2 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1 1 1 1 * 1 1 1 1 1 1 1 * 1 1 1 | * 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 * 1 1 1 1 * 1 1 1 1 1 * 1 1 1 * | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 * 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 * 1 1 1 1 * 1 * 1 1 1 * 1 1 | 2 0 0 0 * * * * * * * * * * * * 2 * 2 * 2 * * * * * * * * * * * * * * * * * * * * * * * * * * * 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 | * * * * 0 0 0 0 0 0 0 0 0 0 0 0 * 0 * 0 * 0 2 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 * 1 1 1 * 1 1 1 1 1 1 * 1 1 1 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 * * | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 * 1 1 1 * 1 1 * 1 1 1 * 1 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 0 0 * * * * * * * * * * * * * * * * * * * * 1 1 1 1 * 1 1 1 * * 1 1 1 * 1 1 1 | * * * * * * * * * * * * * * * * * * * * * * * * * * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * 1 1 1 1 * 1 1 1 1 1 1 * 1 1 1 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 * 1 1 1 1 * 1 1 * 1 1 1 1 * 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 * 1 1 1 1 * * 1 1 1 1 * 1 1 | 2 0 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1 1 1 * 1 1 1 1 1 1 1 1 * 1 1 1 | * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 * 1 1 1 * 1 1 1 1 1 1 * 1 1 1 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 1 * | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 * 1 1 1 * 1 1 * 1 1 1 * * 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * * * * * * * * * * * * * * * * 1 1 1 1 * 1 1 1 * * 1 1 1 * 1 1 1 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * 1 1 1 1 * 1 1 1 1 1 1 * 1 1 1 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 * 1 1 1 1 * 1 1 * 1 1 1 1 * 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 * 1 1 1 1 * * 1 1 1 1 * 1 1 | 2 0 0 0 0 0 0 0 0 0 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1 1 1 1 * 1 1 1 1 1 1 1 1 * 1 1 1 | * * * * * * * * * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * 1 1 1 1 * 1 1 1 1 1 1 * 1 1 1 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 * 1 1 1 1 * 1 1 * 1 1 1 1 * 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * * * * * * * * 1 1 1 * * 1 1 1 * * 1 1 1 1 * 1 1 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 0 0 0 0 0 0 0 0 * 1 1 1 1 * 1 1 1 1 1 1 1 * 1 1 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 * 1 1 1 1 * 1 1 1 1 * * 1 1 1 * | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 * 1 1 1 1 * 1 1 * 1 1 1 1 * 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 * 1 1 1 1 * * 1 1 1 1 * 1 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1 1 1 1 * 1 1 1 1 1 1 1 1 * 1 1 1 | * * * * * * * * * * * * * * * * * * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * 1 1 1 1 * 1 1 1 1 1 1 * 1 1 1 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 * 1 1 1 1 * 1 1 * 1 1 1 1 * 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 * 1 1 1 1 * * 1 1 1 1 * 1 1 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1 1 1 * 1 1 1 1 1 1 1 1 * 1 1 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 * 1 1 1 * 1 1 1 1 1 1 * 1 1 1 * | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 * 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 * 1 1 1 * 1 1 * 1 1 1 * 1 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * * * * * * * * * * * * * * * * * * * * 1 1 1 1 * 1 1 1 * * 1 1 1 * 1 1 1 | * * * * * * * * * * * * * * * * * * * * * * * * * * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * 1 1 1 1 * 1 1 1 1 1 1 * 1 1 1 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 * 1 1 1 1 * 1 1 * 1 1 1 1 * 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 * 1 1 1 1 * * 1 1 1 1 * 1 1 | 2 0 0 0 0 0 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1 1 1 1 * 1 1 1 1 1 1 1 1 * 1 1 1 | * * * * * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * 1 1 1 1 * 1 1 1 1 1 1 * 1 1 1 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 * * 1 1 1 * 1 1 1 1 * 1 1 1 1 * | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 * 1 1 1 * 1 1 * 1 1 1 1 * 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * * * * * * * * * * * * 1 1 1 1 * 1 1 1 * * 1 1 1 1 * 1 1 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 0 0 0 0 0 0 0 0 0 0 0 0 * 1 1 1 1 * 1 1 1 1 1 1 * * 1 1 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 * 1 1 1 1 * 1 1 * 1 1 1 1 * 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 * 1 1 1 1 * * 1 1 1 1 * 1 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1 1 1 1 * 1 1 1 1 1 1 1 1 * 1 1 1 | * * * * * * * * * * * * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * 1 1 1 1 * 1 1 1 1 1 1 * 1 1 1 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 * 1 1 1 1 * 1 1 * 1 1 1 1 * 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * * * * 1 1 1 * 1 1 1 1 * * 1 1 1 1 * 1 1 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 0 0 0 0 * 1 1 1 * 1 1 1 1 1 1 1 1 * 1 1 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 * 1 1 1 * * 1 1 1 1 1 * 1 1 1 * | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 * 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 * 1 1 1 1 * * * 1 1 1 * 1 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * * * * * * * * * * * * * * * * * * * * * * * * * 1 1 1 1 * 1 1 1 1 1 1 1 1 * 1 1 1 | * * * * * * * * * * * * * * * * * * * * * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * 1 1 1 1 * 1 1 1 1 1 1 * 1 1 1 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 * 1 1 1 1 * 1 1 * 1 1 1 1 * 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 * 1 1 1 1 * * 1 1 1 1 * 1 1 | 2 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1 1 1 * 1 1 1 1 1 1 1 1 * 1 1 1 | * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 * 1 1 1 * 1 1 1 1 1 1 * 1 1 1 1 | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 * 1 1 1 _ _ _ _ _ _ 1 1 1 * * | 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 _ _ _ _ _ _ _ _ _ _ _ _ 1 1 | starpu-1.2.3+dfsg/examples/stencil/Makefile.am000066400000000000000000000077551320135501600212770ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010-2012, 2015-2017 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. include $(top_srcdir)/starpu.mk if STARPU_SIMGRID STARPU_PERF_MODEL_DIR=$(abs_top_srcdir)/tools/perfmodels/sampling STARPU_HOSTNAME=mirage export STARPU_PERF_MODEL_DIR export STARPU_HOSTNAME endif AM_CFLAGS = $(HWLOC_CFLAGS) $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(GLOBAL_AM_CFLAGS) -Wno-unused LIBS = $(top_builddir)/src/@LIBSTARPU_LINK@ $(HWLOC_LIBS) @LIBS@ $(FXT_LIBS) AM_CPPFLAGS = -I$(top_srcdir)/include/ -I$(top_srcdir)/examples/ -I$(top_builddir)/include AM_LDFLAGS = @STARPU_EXPORT_DYNAMIC@ $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) $(STARPU_COI_LDFLAGS) $(STARPU_SCIF_LDFLAGS) if USE_MPI LIBS += $(top_builddir)/mpi/src/libstarpumpi-@STARPU_EFFECTIVE_VERSION@.la AM_CPPFLAGS += -I$(top_srcdir)/mpi/include endif CC = $(CC_OR_MPICC) if STARPU_USE_CUDA NVCCFLAGS += $(HWLOC_CFLAGS) .cu.cubin: $(MKDIR_P) `dirname $@` $(NVCC) -cubin $< -o $@ --compiler-options -fno-strict-aliasing $(NVCCFLAGS) .cu.o: $(MKDIR_P) `dirname $@` $(NVCC) $< -c -o $@ --compiler-options -fno-strict-aliasing -I$(top_srcdir)/include/ -I$(top_builddir)/include/ $(NVCCFLAGS) endif ##################################### # What to install and what to check # ##################################### if STARPU_HAVE_WINDOWS check_PROGRAMS = $(STARPU_EXAMPLES) else check_PROGRAMS = $(LOADER) $(STARPU_EXAMPLES) endif if !STARPU_SIMGRID if USE_MPI if STARPU_MPI_CHECK TESTS = $(STARPU_EXAMPLES) endif else TESTS = $(STARPU_EXAMPLES) endif endif if !STARPU_HAVE_WINDOWS ## test loader program if !STARPU_CROSS_COMPILING LOADER = loader loader_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -I$(top_builddir)/src/ LOADER_BIN = ./$(LOADER) loader_SOURCES = ../../tests/loader.c else LOADER = LOADER_BIN = $(top_builddir)/examples/stencil/loader-cross.sh endif if STARPU_HAVE_AM111 TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" LOG_COMPILER = $(LOADER_BIN) else TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(LOADER_BIN) endif endif ################### # stencil example # ################### STARPU_EXAMPLES = \ stencil examplebindir = $(libdir)/starpu/examples/stencil examplebin_PROGRAMS = \ stencil stencil_SOURCES = \ life.c \ stencil-kernels.c \ stencil-tasks.c \ stencil-blocks.c \ stencil.c noinst_HEADERS = \ stencil.h \ shadow.h if STARPU_USE_CUDA stencil_SOURCES += \ life_cuda.cu \ shadow.cu endif if STARPU_USE_OPENCL stencil_SOURCES += \ life_opencl.c \ shadow_opencl.c endif outs = \ 0.5.out \ 0.out \ 1.out \ 2.out \ 3.out \ 4.out \ 6.out \ mpi.out EXTRA_DIST = $(outs) results run README pics: $(outs:.out=.xpm) CLEANFILES = *.gcno *.gcda *.xpm starpu_idle_microsec.log .out.out2: grep '^|' $< | tr -d ' ' > $@ .out2.xpm: ( width=$$(expr $$(head -n 1 < $< | wc -c) - 1) ; \ height=`wc -l < $<` ; \ echo "/* XPM */" ; \ echo "static char * test_xpm[] = {" ; \ echo "\"$$width $$height 9 1\"," ; \ echo "\"_ c None\"," ; \ echo "\"0 c #FF0000\"," ; \ echo "\"1 c #00FF00\"," ; \ echo "\"2 c #0000FF\"," ; \ echo "\"3 c #FFFF00\"," ; \ echo "\"4 c #FF00FF\"," ; \ echo "\"5 c #00FFFF\"," ; \ echo "\"| c #FFFFFF\"," ; \ echo "\"* c #000000\"," ; \ < $< sed -e 's/^/"/' -e 's/$$/",/' | sed -e '$$s/",$$/"};/' ) > $@ view: feh --zoom 800 -F 0.xpm 0.5.xpm 1.xpm 2.xpm 3.xpm 4.xpm 6.xpm mpi.xpm starpu-1.2.3+dfsg/examples/stencil/Makefile.in000066400000000000000000001372741320135501600213100ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010-2012, 2015-2017 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @USE_MPI_TRUE@am__append_1 = $(top_builddir)/mpi/src/libstarpumpi-@STARPU_EFFECTIVE_VERSION@.la @USE_MPI_TRUE@am__append_2 = -I$(top_srcdir)/mpi/include @STARPU_USE_CUDA_TRUE@am__append_3 = $(HWLOC_CFLAGS) @STARPU_HAVE_WINDOWS_FALSE@check_PROGRAMS = $(am__EXEEXT_1) \ @STARPU_HAVE_WINDOWS_FALSE@ $(am__EXEEXT_2) @STARPU_HAVE_WINDOWS_TRUE@check_PROGRAMS = $(am__EXEEXT_2) @STARPU_MPI_CHECK_TRUE@@STARPU_SIMGRID_FALSE@@USE_MPI_TRUE@TESTS = $(am__EXEEXT_2) @STARPU_SIMGRID_FALSE@@USE_MPI_FALSE@TESTS = $(am__EXEEXT_2) examplebin_PROGRAMS = stencil$(EXEEXT) @STARPU_USE_CUDA_TRUE@am__append_4 = \ @STARPU_USE_CUDA_TRUE@ life_cuda.cu \ @STARPU_USE_CUDA_TRUE@ shadow.cu @STARPU_USE_OPENCL_TRUE@am__append_5 = \ @STARPU_USE_OPENCL_TRUE@ life_opencl.c \ @STARPU_USE_OPENCL_TRUE@ shadow_opencl.c subdir = examples/stencil ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = loader-cross.sh CONFIG_CLEAN_VPATH_FILES = @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@am__EXEEXT_1 = loader$(EXEEXT) am__EXEEXT_2 = stencil$(EXEEXT) am__installdirs = "$(DESTDIR)$(examplebindir)" PROGRAMS = $(examplebin_PROGRAMS) am__loader_SOURCES_DIST = ../../tests/loader.c @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@am_loader_OBJECTS = loader-loader.$(OBJEXT) loader_OBJECTS = $(am_loader_OBJECTS) loader_LDADD = $(LDADD) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am__stencil_SOURCES_DIST = life.c stencil-kernels.c stencil-tasks.c \ stencil-blocks.c stencil.c life_cuda.cu shadow.cu \ life_opencl.c shadow_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_1 = life_cuda.$(OBJEXT) \ @STARPU_USE_CUDA_TRUE@ shadow.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_2 = life_opencl.$(OBJEXT) \ @STARPU_USE_OPENCL_TRUE@ shadow_opencl.$(OBJEXT) am_stencil_OBJECTS = life.$(OBJEXT) stencil-kernels.$(OBJEXT) \ stencil-tasks.$(OBJEXT) stencil-blocks.$(OBJEXT) \ stencil.$(OBJEXT) $(am__objects_1) $(am__objects_2) stencil_OBJECTS = $(am_stencil_OBJECTS) stencil_LDADD = $(LDADD) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/common -I$(top_builddir)/include -I$(top_builddir)/gcc-plugin/include/starpu-gcc -I$(top_builddir)/starpu-top depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(loader_SOURCES) $(stencil_SOURCES) DIST_SOURCES = $(am__loader_SOURCES_DIST) $(am__stencil_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/loader-cross.sh.in \ $(top_srcdir)/build-aux/depcomp \ $(top_srcdir)/build-aux/test-driver $(top_srcdir)/starpu.mk \ README DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = $(CC_OR_MPICC) CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = $(top_builddir)/src/@LIBSTARPU_LINK@ $(HWLOC_LIBS) @LIBS@ \ $(FXT_LIBS) $(am__append_1) LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ $(am__append_3) NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POTI_CFLAGS = @POTI_CFLAGS@ POTI_LIBS = @POTI_LIBS@ PROG_DATE = @PROG_DATE@ PROG_STAT = @PROG_STAT@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_COI_CPPFLAGS = @STARPU_COI_CPPFLAGS@ STARPU_COI_LDFLAGS = @STARPU_COI_LDFLAGS@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LEVELDB_LDFLAGS = @STARPU_LEVELDB_LDFLAGS@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RCCE_CFLAGS = @STARPU_RCCE_CFLAGS@ STARPU_RCCE_CPPFLAGS = @STARPU_RCCE_CPPFLAGS@ STARPU_RCCE_LDFLAGS = @STARPU_RCCE_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SCIF_CPPFLAGS = @STARPU_SCIF_CPPFLAGS@ STARPU_SCIF_LDFLAGS = @STARPU_SCIF_LDFLAGS@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SC_HYPERVISOR_DEBUG = @STARPU_SC_HYPERVISOR_DEBUG@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ mpifort_path = @mpifort_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ smpirun_path = @smpirun_path@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @STARPU_SIMGRID_TRUE@STARPU_PERF_MODEL_DIR = $(abs_top_srcdir)/tools/perfmodels/sampling @STARPU_SIMGRID_TRUE@STARPU_HOSTNAME = mirage AM_CFLAGS = $(HWLOC_CFLAGS) $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(GLOBAL_AM_CFLAGS) -Wno-unused AM_CPPFLAGS = -I$(top_srcdir)/include/ -I$(top_srcdir)/examples/ \ -I$(top_builddir)/include $(am__append_2) AM_LDFLAGS = @STARPU_EXPORT_DYNAMIC@ $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) $(STARPU_COI_LDFLAGS) $(STARPU_SCIF_LDFLAGS) @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@LOADER = loader @STARPU_CROSS_COMPILING_TRUE@@STARPU_HAVE_WINDOWS_FALSE@LOADER = @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@loader_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -I$(top_builddir)/src/ @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@LOADER_BIN = ./$(LOADER) @STARPU_CROSS_COMPILING_TRUE@@STARPU_HAVE_WINDOWS_FALSE@LOADER_BIN = $(top_builddir)/examples/stencil/loader-cross.sh @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@loader_SOURCES = ../../tests/loader.c @STARPU_HAVE_AM111_FALSE@@STARPU_HAVE_WINDOWS_FALSE@TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(LOADER_BIN) @STARPU_HAVE_AM111_TRUE@@STARPU_HAVE_WINDOWS_FALSE@TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" @STARPU_HAVE_AM111_TRUE@@STARPU_HAVE_WINDOWS_FALSE@LOG_COMPILER = $(LOADER_BIN) ################### # stencil example # ################### STARPU_EXAMPLES = \ stencil examplebindir = $(libdir)/starpu/examples/stencil stencil_SOURCES = life.c stencil-kernels.c stencil-tasks.c \ stencil-blocks.c stencil.c $(am__append_4) $(am__append_5) noinst_HEADERS = \ stencil.h \ shadow.h outs = \ 0.5.out \ 0.out \ 1.out \ 2.out \ 3.out \ 4.out \ 6.out \ mpi.out EXTRA_DIST = $(outs) results run README CLEANFILES = *.gcno *.gcda *.xpm starpu_idle_microsec.log all: all-am .SUFFIXES: .SUFFIXES: .c .cu .cubin .lo .log .o .obj .out .out2 .test .test$(EXEEXT) .trs .xpm $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/starpu.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign examples/stencil/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign examples/stencil/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/starpu.mk $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): loader-cross.sh: $(top_builddir)/config.status $(srcdir)/loader-cross.sh.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-examplebinPROGRAMS: $(examplebin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(examplebin_PROGRAMS)'; test -n "$(examplebindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(examplebindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(examplebindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(examplebindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(examplebindir)$$dir" || exit $$?; \ } \ ; done uninstall-examplebinPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(examplebin_PROGRAMS)'; test -n "$(examplebindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(examplebindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(examplebindir)" && rm -f $$files clean-examplebinPROGRAMS: @list='$(examplebin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list loader$(EXEEXT): $(loader_OBJECTS) $(loader_DEPENDENCIES) $(EXTRA_loader_DEPENDENCIES) @rm -f loader$(EXEEXT) $(AM_V_CCLD)$(LINK) $(loader_OBJECTS) $(loader_LDADD) $(LIBS) stencil$(EXEEXT): $(stencil_OBJECTS) $(stencil_DEPENDENCIES) $(EXTRA_stencil_DEPENDENCIES) @rm -f stencil$(EXEEXT) $(AM_V_CCLD)$(LINK) $(stencil_OBJECTS) $(stencil_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/life.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/life_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loader-loader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shadow_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stencil-blocks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stencil-kernels.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stencil-tasks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stencil.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< loader-loader.o: ../../tests/loader.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT loader-loader.o -MD -MP -MF $(DEPDIR)/loader-loader.Tpo -c -o loader-loader.o `test -f '../../tests/loader.c' || echo '$(srcdir)/'`../../tests/loader.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/loader-loader.Tpo $(DEPDIR)/loader-loader.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../tests/loader.c' object='loader-loader.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o loader-loader.o `test -f '../../tests/loader.c' || echo '$(srcdir)/'`../../tests/loader.c loader-loader.obj: ../../tests/loader.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT loader-loader.obj -MD -MP -MF $(DEPDIR)/loader-loader.Tpo -c -o loader-loader.obj `if test -f '../../tests/loader.c'; then $(CYGPATH_W) '../../tests/loader.c'; else $(CYGPATH_W) '$(srcdir)/../../tests/loader.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/loader-loader.Tpo $(DEPDIR)/loader-loader.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../tests/loader.c' object='loader-loader.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o loader-loader.obj `if test -f '../../tests/loader.c'; then $(CYGPATH_W) '../../tests/loader.c'; else $(CYGPATH_W) '$(srcdir)/../../tests/loader.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? stencil.log: stencil$(EXEEXT) @p='stencil$(EXEEXT)'; \ b='stencil'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(PROGRAMS) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(examplebindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-examplebinPROGRAMS clean-generic \ clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-examplebinPROGRAMS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-examplebinPROGRAMS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-examplebinPROGRAMS clean-generic \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-examplebinPROGRAMS install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-examplebinPROGRAMS .PRECIOUS: Makefile showcheck: -cat $(TEST_LOGS) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q " runtime error: " $(TEST_LOGS) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET @STARPU_SIMGRID_TRUE@export STARPU_PERF_MODEL_DIR @STARPU_SIMGRID_TRUE@export STARPU_HOSTNAME @STARPU_USE_CUDA_TRUE@.cu.cubin: @STARPU_USE_CUDA_TRUE@ $(MKDIR_P) `dirname $@` @STARPU_USE_CUDA_TRUE@ $(NVCC) -cubin $< -o $@ --compiler-options -fno-strict-aliasing $(NVCCFLAGS) @STARPU_USE_CUDA_TRUE@.cu.o: @STARPU_USE_CUDA_TRUE@ $(MKDIR_P) `dirname $@` @STARPU_USE_CUDA_TRUE@ $(NVCC) $< -c -o $@ --compiler-options -fno-strict-aliasing -I$(top_srcdir)/include/ -I$(top_builddir)/include/ $(NVCCFLAGS) pics: $(outs:.out=.xpm) .out.out2: grep '^|' $< | tr -d ' ' > $@ .out2.xpm: ( width=$$(expr $$(head -n 1 < $< | wc -c) - 1) ; \ height=`wc -l < $<` ; \ echo "/* XPM */" ; \ echo "static char * test_xpm[] = {" ; \ echo "\"$$width $$height 9 1\"," ; \ echo "\"_ c None\"," ; \ echo "\"0 c #FF0000\"," ; \ echo "\"1 c #00FF00\"," ; \ echo "\"2 c #0000FF\"," ; \ echo "\"3 c #FFFF00\"," ; \ echo "\"4 c #FF00FF\"," ; \ echo "\"5 c #00FFFF\"," ; \ echo "\"| c #FFFFFF\"," ; \ echo "\"* c #000000\"," ; \ < $< sed -e 's/^/"/' -e 's/$$/",/' | sed -e '$$s/",$$/"};/' ) > $@ view: feh --zoom 800 -F 0.xpm 0.5.xpm 1.xpm 2.xpm 3.xpm 4.xpm 6.xpm mpi.xpm # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.2.3+dfsg/examples/stencil/README000066400000000000000000000026371320135501600201150ustar00rootroot00000000000000 # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010 Université de Bordeaux # Copyright (C) 2010, 2011 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. This is a sample 3D stencil application (here just using the game of life rules for simplicity), split on the z axis. This is a suggest order of read: life.c life.cu: Heart of the stencil computation: compute a new state from an old one. shadow.cu shadow.h: Perform replication of data on X and Y edges, to fold the domain on itself through mere replication of the source state. stencil.h: Declarations stencil-kernels.c: Computation Kernels stencil-blocks.c: Manage block and tags allocation stencil-tasks.c: Schedule tasks for updates and saves stencil.c: Main application *.out: various results according to beta value (communication vs computation penalty ratio), run make pics or make view to get pictures. mpi.out: results on MPI. results: a few results starpu-1.2.3+dfsg/examples/stencil/life.c000066400000000000000000000032361320135501600203140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "stencil.h" /* Heart of the stencil computation: compute a new state from an old one. */ void life_update(int bz, const TYPE *old, TYPE *newp, int nx, int ny, int nz, int ldy, int ldz, int iter) { int x, y, z, num, alive; for (z = iter; z < nz - iter; z++) { for (y = K; y < ny - K; y++) { for (x = K; x < nx - K; x++) { num = 0 + old[x+(y+1)*ldy+(z+0)*ldz] + old[x+(y+1)*ldy+(z+1)*ldz] + old[x+(y+0)*ldy+(z+1)*ldz] + old[x+(y-1)*ldy+(z+1)*ldz] + old[x+(y-1)*ldy+(z+0)*ldz] + old[x+(y-1)*ldy+(z-1)*ldz] + old[x+(y+0)*ldy+(z-1)*ldz] + old[x+(y+1)*ldy+(z-1)*ldz] ; alive = old[x+y*ldy+z*ldz]; alive = (alive && num == 2) || num == 3; newp[x+y*ldy+z*ldz] = alive; } } } } starpu-1.2.3+dfsg/examples/stencil/life_cuda.cu000066400000000000000000000057241320135501600215010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #define _externC extern "C" #include "stencil.h" /* Heart of the stencil computation: compute a new state from an old one. */ extern "C" __global__ void cuda_life_update(int bz, const TYPE *old, TYPE *newp, int nx, int ny, int nz, int ldy, int ldz, int iter) { unsigned idx = threadIdx.x + blockIdx.x * blockDim.x; unsigned idy = threadIdx.y + blockIdx.y * blockDim.y; //unsigned idz = threadIdx.z + blockIdx.z * blockDim.z; unsigned idz = 0; unsigned stepx = blockDim.x * gridDim.x; unsigned stepy = blockDim.y * gridDim.y; //unsigned stepz = blockDim.z * gridDim.z; unsigned stepz = 1; unsigned x, y, z; unsigned num, alive; for (z = iter + idz; z < nz - iter; z += stepz) for (y = K + idy; y < ny - K; y += stepy) { for (x = K + idx; x < nx - K; x += stepx) { unsigned index = x + y*ldy + z*ldz; num = 0 + old[index+1*ldy+0*ldz] + old[index+1*ldy+1*ldz] + old[index+0*ldy+1*ldz] + old[index-1*ldy+1*ldz] + old[index-1*ldy+0*ldz] + old[index-1*ldy-1*ldz] + old[index+0*ldy-1*ldz] + old[index+1*ldy-1*ldz] ; alive = old[index]; alive = (alive && num == 2) || num == 3; newp[index] = alive; } } } extern "C" void cuda_life_update_host(int bz, const TYPE *old, TYPE *newp, int nx, int ny, int nz, int ldy, int ldz, int iter) { unsigned max_parallelism = 512; unsigned threads_per_dim_x = max_parallelism; while (threads_per_dim_x / 2 >= nx) threads_per_dim_x /= 2; unsigned threads_per_dim_y = max_parallelism / threads_per_dim_x; while (threads_per_dim_y / 2 >= ny) threads_per_dim_y /= 2; #if 0 unsigned threads_per_dim_z = 4; dim3 dimBlock(threads_per_dim_x, threads_per_dim_y, threads_per_dim_z); dim3 dimGrid(nx / threads_per_dim_x, ny / threads_per_dim_y, nz / threads_per_dim_z); #else dim3 dimBlock(threads_per_dim_x, threads_per_dim_y); dim3 dimGrid((nx + threads_per_dim_x-1) / threads_per_dim_x, (ny + threads_per_dim_y-1) / threads_per_dim_y); #endif cuda_life_update <<>> (bz, old, newp, nx, ny, nz, ldy, ldz, iter); } starpu-1.2.3+dfsg/examples/stencil/life_opencl.c000066400000000000000000000073571320135501600216640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013-2014 Université de Bordeaux * Copyright (C) 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Heart of the stencil computation: compute a new state from an old one. */ /* #define _externC extern "C" */ #include #ifdef __APPLE__ #include #else #include #endif #include #define str(x) #x #define clsrc(t,k) "__kernel void\n\ #define TYPE " str(t) "\n\ #define K " str(k) "\n\ life_update(int bz, __global const TYPE *old, __global TYPE *newp, int nx, int ny, int nz, int ldy, int ldz, int iter)\n\ {\n\ unsigned idx = get_global_id(0);\n\ unsigned idy = get_global_id(1);\n\ //unsigned idz = threadIdx.z + blockIdx.z * blockDim.z;\n\ unsigned idz = 0;\n\ unsigned stepx = get_global_size(0);\n\ unsigned stepy = get_global_size(1);\n\ //unsigned stepz = blockDim.z * gridDim.z;\n\ unsigned stepz = 1;\n\ unsigned x, y, z;\n\ unsigned num, alive;\n\ \n\ for (z = iter + idz; z < nz - iter; z += stepz)\n\ for (y = K + idy; y < ny - K; y += stepy) \n\ {\n \ for (x = K + idx; x < nx - K; x += stepx) \ {\n \ unsigned index = x + y*ldy + z*ldz;\n\ num = 0\n\ + old[index+1*ldy+0*ldz]\n\ + old[index+1*ldy+1*ldz]\n\ + old[index+0*ldy+1*ldz]\n\ + old[index-1*ldy+1*ldz]\n\ + old[index-1*ldy+0*ldz]\n\ + old[index-1*ldy-1*ldz]\n\ + old[index+0*ldy-1*ldz]\n\ + old[index+1*ldy-1*ldz]\n\ ;\n\ alive = old[index];\n\ alive = (alive && num == 2) || num == 3;\n\ newp[index] = alive;\n\ }\n\ }\n\ }" static const char * src = clsrc(TYPE,K); static struct starpu_opencl_program program; void opencl_life_init(void) { starpu_opencl_load_opencl_from_string(src, &program, NULL); } void opencl_life_free(void) { int ret = starpu_opencl_unload_opencl(&program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); } void opencl_life_update_host(int bz, const TYPE *old, TYPE *newp, int nx, int ny, int nz, int ldy, int ldz, int iter) { #if 0 size_t dim[] = {nx, ny, nz}; #else size_t dim[] = {nx, ny, 1}; #endif int devid,id; cl_int err; id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); cl_kernel kernel; cl_command_queue cq; err = starpu_opencl_load_kernel(&kernel, &cq, &program, "life_update", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); clSetKernelArg(kernel, 0, sizeof(bz), &bz); clSetKernelArg(kernel, 1, sizeof(old), &old); clSetKernelArg(kernel, 2, sizeof(newp), &newp); clSetKernelArg(kernel, 3, sizeof(nx), &nx); clSetKernelArg(kernel, 4, sizeof(ny), &ny); clSetKernelArg(kernel, 5, sizeof(nz), &nz); clSetKernelArg(kernel, 6, sizeof(ldy), &ldy); clSetKernelArg(kernel, 7, sizeof(ldz), &ldz); clSetKernelArg(kernel, 8, sizeof(iter), &iter); err = clEnqueueNDRangeKernel(cq, kernel, 3, NULL, dim, NULL, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } starpu-1.2.3+dfsg/examples/stencil/loader-cross.sh.in000066400000000000000000000023421320135501600225640ustar00rootroot00000000000000#!/bin/bash # # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2013, 2015 Universite de Bordeaux # Copyright (C) 2015 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. top_srcdir="@top_srcdir@" export top_builddir="@top_builddir@" exec="$1" shift if test -z "$exec" then echo "[Error] Syntax: $0 " exit 1 fi NATIVE=${PWD/\/build_mic\//\/build_host\/} DIR="$(dirname "$exec")" FILE="$(basename "$exec")" export SINK_LD_LIBRARY_PATH="$top_builddir/src/.libs:$SINK_LD_LIBRARY_PATH" export STARPU_MIC_SINK_PROGRAM_NAME="$exec" # in case libtool got into play [ -x "$DIR/.libs/$FILE" ] && STARPU_MIC_SINK_PROGRAM_NAME="$DIR/.libs/$FILE" $top_builddir/../build_host/tests/loader "$NATIVE/$exec" "$@" starpu-1.2.3+dfsg/examples/stencil/mpi.out000066400000000000000000000260141320135501600205460ustar00rootroot00000000000000Warning: MPI only has funneled thread support, not serialized, hoping this will work Running on 2 nodes Warning: MPI only has funneled thread support, not serialized, hoping this will work 9 MB of memory were allocated on node 1 9 MB of memory were allocated on node 0 GO ! update: CPU 0 -> 2048 (100.00%) top: CPU 0 -> 2048 (100.00%) bottom: CPU 0 -> 2048 (100.00%) | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | * 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 * | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 * 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 * 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 * 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 * 1 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 1 * 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 * 1 1 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 1 1 * 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 * 1 1 1 1 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | * 1 1 1 1 * 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 * 1 1 1 1 * | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 * 1 1 1 1 * 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 * 1 1 1 1 * 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 * 1 1 1 1 * 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 * 1 1 1 1 * 1 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 1 * 1 1 1 1 * 1 1 1 1 1 1 1 1 1 1 1 1 1 1 * 1 1 1 1 * 1 1 1 | * * * * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * * * * | 1 1 1 1 * 1 1 1 1 * 1 1 1 1 1 1 1 1 1 1 1 1 * 1 1 1 1 * 1 1 1 1 | 0 0 0 0 0 * * * * * * * * * * * * * * * * * * * * * * * 0 0 0 0 | * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 1 1 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 | * * * * * * * * * 0 0 0 0 0 0 0 0 0 0 0 0 0 * * * * * * * * * * | 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 | 0 0 0 0 0 0 0 0 0 * * * * * * * * * * * * * 0 0 0 0 0 0 0 0 0 0 | * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | * 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 * | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 * 1 1 1 * 1 1 1 1 * 1 1 1 1 * * 1 1 1 1 * 1 1 1 1 * 1 1 1 * 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 1 1 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 | * * * * * * * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * * * * * * * | 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 | 0 0 0 0 0 0 0 0 * * * * * * * * * * * * * * * * * 0 0 0 0 0 0 0 | * 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 * | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 * * 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 | * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * * | 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 | 0 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 0 0 | * 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 * | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 * 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 * 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 * * 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 | * * * * * * * * * * 0 0 0 0 0 0 0 0 0 0 0 0 * * * * * * * * * * | 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 | 0 0 0 0 0 0 0 0 0 0 * * * * * * * * * * * * 0 0 0 0 0 0 0 0 0 0 | * 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 * | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 * * 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 | * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * * * | 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 | 0 0 * * * * * * * * * * * * * * * * * * * * * * * * * * * 0 0 0 | * 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 * | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 * 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 * 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 * * 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 | * * * * * * * * * * 0 0 0 0 0 0 0 0 0 0 0 0 * * * * * * * * * * | 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 | 0 0 0 0 0 0 0 0 0 0 * * * * * * * * * * * * 0 0 0 0 0 0 0 0 0 0 | * 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 * | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 * * 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 | * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * | 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 | 0 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 0 | * 1 1 1 * 1 1 1 1 * 1 1 1 * * 1 1 * * 1 1 1 * 1 1 1 1 * 1 1 1 * | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 * 1 1 1 * 1 1 1 1 * 1 1 1 1 * * 1 1 1 1 * 1 1 1 1 * 1 1 1 * 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 1 1 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 | * * * * * * * * * * * * 0 0 0 0 0 0 0 0 * * * * * * * * * * * * | 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 | 0 0 0 0 0 0 0 0 0 0 0 0 * * * * * * * * 0 0 0 0 0 0 0 0 0 0 0 0 | * 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 * | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 * * 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 | * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * | 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 | 0 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 0 | * 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 * | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 * 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 * 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 * * 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 | * * * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * * * | 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 | 0 0 0 0 * * * * * * * * * * * * * * * * * * * * * * * * * 0 0 0 | * 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 * | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 * * 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 | * * * * * * * * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * * * * * * * * * | 1 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 1 | 0 0 0 0 0 0 0 0 0 * * * * * * * * * * * * * * 0 0 0 0 0 0 0 0 0 | * 1 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 1 * | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 * * 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | * 1 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 * 1 1 1 1 * 1 1 1 1 * 1 1 1 * | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 * 1 1 1 * 1 1 1 1 * 1 1 1 1 * * 1 1 1 1 * 1 1 1 1 * 1 1 1 * 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 1 1 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 1 * 1 1 1 * 1 1 1 1 * 1 1 1 1 1 1 * 1 1 1 1 * 1 1 1 * 1 1 1 | * * * * * * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * * * * * * | 1 1 1 1 * 1 1 1 * 1 1 1 1 _ _ _ _ _ _ 1 1 1 1 * 1 1 1 * 1 1 1 1 | 0 0 0 0 0 0 0 * * * * * * * * * * * * * * * * * * * 0 0 0 0 0 0 | * 1 1 1 1 * 1 1 1 _ _ _ _ _ _ _ _ _ _ _ _ _ _ 1 1 1 * 1 1 1 1 * | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 * 1 1 1 1 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 1 1 1 1 * 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 1 1 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 1 1 | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ starpu-1.2.3+dfsg/examples/stencil/results000066400000000000000000001422401320135501600206540ustar00rootroot00000000000000B=0 | 0 1 1 1 2 0 0 1 0 1 1 0 2 0 0 2 1 0 2 1 0 2 0 1 2 0 2 1 2 0 0 1 0 1 1 2 0 1 0 2 0 1 0 0 2 0 1 2 0 2 2 1 0 0 2 1 0 0 2 0 0 1 2 1 | 0 0 0 1 2 1 1 0 0 0 1 1 0 2 1 0 1 0 0 1 1 0 1 0 1 0 0 1 0 2 0 2 1 0 0 0 1 1 2 0 0 2 0 0 1 2 0 1 2 0 2 0 1 0 2 0 1 2 0 1 2 0 2 2 | 2 0 1 2 1 2 0 2 0 1 0 2 2 1 0 0 2 0 0 0 2 0 0 0 1 0 1 0 1 0 2 1 2 0 2 2 0 2 2 1 0 0 1 0 0 1 2 1 0 0 0 2 2 0 1 0 2 1 2 0 1 0 0 1 | 0 0 1 0 0 2 1 0 0 1 2 1 1 2 1 2 1 0 2 2 1 0 0 0 0 1 2 1 0 0 1 2 1 0 0 1 0 2 0 1 2 1 2 1 0 1 0 2 0 0 0 0 2 1 0 0 2 0 1 0 1 2 1 2 | 1 0 0 0 0 2 1 2 2 0 2 1 2 0 1 1 0 0 1 2 0 1 2 1 1 0 0 2 2 1 0 1 2 0 0 0 0 2 1 0 2 0 0 2 0 1 1 0 2 1 2 2 0 1 1 1 2 0 0 0 0 2 0 2 | 0 0 1 1 0 1 1 2 1 2 2 1 0 1 0 2 2 0 1 2 1 0 1 0 1 0 0 2 1 0 2 1 0 0 2 0 0 1 0 1 2 0 2 0 1 2 0 1 1 0 2 0 0 2 1 0 1 0 0 1 2 0 2 0 | 2 0 1 2 1 0 0 0 1 0 2 0 1 2 0 0 0 2 0 1 0 0 0 0 1 1 0 2 1 0 0 1 0 2 1 2 0 2 2 0 2 1 1 1 0 0 0 0 1 2 2 1 1 0 0 0 2 0 2 1 2 0 2 1 | 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 2 0 2 0 0 2 0 0 2 1 2 2 2 0 1 1 0 1 1 1 1 1 0 1 0 2 2 2 0 1 0 1 0 2 0 1 1 0 0 1 2 1 0 2 1 2 | 2 0 1 2 0 2 0 1 0 2 1 0 0 0 0 0 2 2 1 0 2 2 1 0 2 0 1 0 0 2 0 0 2 0 1 1 0 0 0 2 2 1 2 0 1 2 0 2 0 0 2 2 1 0 0 2 0 2 1 0 1 0 2 0 | 0 0 2 1 2 0 2 2 1 0 0 2 1 2 0 1 0 2 1 2 0 2 0 0 1 0 0 0 1 1 0 1 2 1 2 1 1 0 1 2 1 0 2 0 1 2 0 0 0 2 2 2 0 2 0 2 0 0 0 0 1 0 2 0 | 0 0 0 1 2 0 0 1 0 1 2 2 0 0 1 1 0 2 1 0 2 2 1 1 0 0 2 0 1 2 0 0 0 0 1 2 0 0 0 2 1 0 0 2 0 2 1 2 0 0 2 1 2 0 2 1 2 1 2 1 0 2 0 1 | 1 1 1 1 2 2 0 1 2 1 0 0 0 1 2 2 0 1 2 1 2 0 1 1 2 0 1 1 0 2 0 1 0 1 2 0 2 0 2 0 1 0 2 0 2 2 1 2 0 1 2 0 0 0 1 2 0 0 0 0 0 2 2 0 | 0 2 0 0 2 0 1 1 1 0 0 1 2 0 1 1 2 0 0 0 0 1 0 0 2 0 1 0 0 1 0 0 1 2 1 0 2 2 1 1 0 2 1 2 0 2 1 0 0 0 1 0 2 1 2 1 0 2 0 1 2 1 0 0 | 1 1 0 0 1 1 1 0 1 2 2 0 1 2 2 0 1 2 0 2 1 1 2 2 1 0 0 1 2 2 2 1 2 0 2 0 0 0 0 2 2 0 0 1 0 0 1 0 0 2 0 1 2 0 0 1 1 2 0 1 0 2 1 2 | 1 2 2 1 0 0 0 1 0 2 0 0 2 1 1 1 1 1 0 1 2 1 2 1 0 2 2 0 2 0 2 1 0 0 1 2 0 1 2 0 1 2 0 0 1 0 2 1 1 2 0 1 0 2 2 0 0 0 0 0 1 0 0 1 | 0 0 2 0 2 2 0 1 2 0 1 0 2 0 2 0 1 0 1 2 2 1 0 1 2 2 1 0 0 1 0 1 0 2 0 1 0 0 2 1 2 0 0 0 1 1 1 1 1 0 0 0 2 0 1 0 0 0 2 2 0 2 0 0 | 0 0 1 0 0 0 1 0 0 1 2 0 2 0 2 0 2 1 0 1 0 1 0 2 0 0 0 1 0 0 1 2 1 0 2 2 1 1 2 0 2 1 1 2 2 2 0 0 2 1 2 0 0 0 2 1 1 2 2 0 1 0 1 0 | 2 1 1 0 2 2 0 1 0 2 1 1 0 0 1 0 0 0 2 1 0 1 0 2 2 2 0 1 2 2 0 2 0 0 0 2 0 1 2 0 1 2 2 0 1 0 0 1 1 0 2 0 2 1 0 2 0 1 1 0 1 0 0 0 | 2 0 2 0 2 1 1 0 1 0 1 2 1 0 2 0 0 1 0 2 0 2 0 2 0 1 0 1 0 2 0 1 2 0 0 0 1 0 1 0 0 2 1 2 1 0 2 1 2 0 1 2 2 0 2 0 0 0 1 1 2 0 2 2 | 2 1 0 2 0 2 1 2 0 2 0 0 1 0 0 1 0 0 0 0 2 1 2 0 2 1 2 2 0 2 1 0 2 0 2 2 2 1 0 2 2 1 0 2 1 0 0 0 1 0 0 1 2 1 0 0 0 2 1 1 1 0 2 1 | 2 2 0 0 1 0 0 1 0 1 0 0 0 2 0 2 1 0 1 2 2 0 2 0 2 0 2 0 0 2 1 0 0 1 0 0 2 1 2 2 1 1 2 0 1 2 2 0 2 0 0 2 0 0 0 1 0 2 0 1 2 2 0 1 | 2 0 2 1 2 0 2 2 1 2 0 0 0 2 1 0 0 2 2 0 0 1 2 2 0 2 2 0 0 0 1 2 1 0 0 0 2 0 2 2 2 0 0 1 2 0 1 1 0 1 2 1 0 0 0 0 1 0 0 2 1 1 0 1 | 0 0 1 1 1 0 1 0 2 1 0 0 2 1 2 0 1 1 2 0 1 1 0 0 1 2 0 1 2 0 0 0 2 0 1 0 1 0 0 2 1 0 2 1 2 0 0 2 0 2 1 0 1 2 2 2 1 0 2 0 1 0 1 2 | 2 2 0 2 1 0 2 0 0 0 0 0 1 2 0 1 0 2 0 1 0 0 2 0 2 0 2 1 0 2 1 0 2 2 0 1 0 1 0 1 2 0 0 1 2 1 0 0 1 2 1 2 0 1 0 1 2 2 0 0 1 2 1 1 | 0 2 0 0 1 0 1 2 0 0 0 2 1 0 2 2 2 1 0 1 2 0 0 1 1 2 1 0 1 1 0 2 1 2 0 0 0 1 0 1 1 0 0 0 1 0 2 2 1 0 0 2 0 2 1 2 0 2 0 0 1 1 0 2 | 2 1 1 2 0 2 0 0 0 0 1 2 2 0 0 2 0 2 1 0 2 0 2 0 1 1 0 2 1 0 1 0 0 0 2 2 0 2 1 0 0 2 2 2 0 1 2 1 0 0 2 0 1 0 0 0 0 1 2 1 0 2 0 2 | 1 0 2 1 0 0 0 1 0 1 0 2 2 0 1 1 0 2 0 0 2 1 1 2 1 0 0 0 2 2 2 2 1 1 1 2 1 0 1 2 0 2 0 2 0 0 2 0 1 0 0 2 1 0 0 2 1 2 0 2 0 0 1 0 | 1 1 2 2 1 2 0 2 0 0 2 0 2 0 1 0 1 0 0 2 1 0 1 2 1 1 2 0 2 1 2 1 0 0 2 2 0 2 0 0 0 2 0 0 0 1 0 1 0 2 0 1 1 2 2 0 0 2 2 0 2 0 0 0 | 0 2 0 1 0 0 1 0 1 2 1 1 2 0 0 0 0 2 2 1 0 1 0 2 0 2 0 1 2 0 2 0 2 0 0 2 1 0 2 2 1 0 2 1 2 0 0 0 1 1 1 1 2 1 1 0 1 2 1 2 1 2 1 2 | 0 2 0 0 0 1 1 0 1 1 2 0 0 2 2 0 2 2 2 2 2 0 2 0 1 2 0 0 0 0 1 1 0 2 0 1 2 0 2 1 0 2 2 0 0 2 2 0 1 0 2 2 1 2 0 0 2 2 1 0 0 0 0 1 | 2 0 0 2 0 2 2 0 2 0 0 0 1 0 0 0 1 0 2 2 2 0 2 0 0 2 0 2 0 1 2 0 2 1 0 2 1 2 0 0 2 0 0 1 0 2 2 2 0 1 0 0 2 0 0 0 1 1 0 1 0 2 0 1 | 0 2 2 0 0 2 0 2 0 0 2 1 1 0 0 0 2 0 1 2 0 2 2 1 0 2 0 0 1 0 2 2 0 0 0 1 1 2 1 1 0 2 0 1 0 0 2 1 0 2 1 0 1 0 2 0 2 2 2 2 1 1 0 2 | 0 1 2 1 0 1 0 2 1 1 2 0 0 2 0 0 1 1 0 2 1 0 2 2 2 0 1 0 0 0 0 0 0 0 2 2 1 1 0 1 2 0 1 0 0 1 0 1 0 2 2 0 0 0 1 0 2 2 0 2 0 2 1 0 | 1 0 1 0 2 0 2 2 0 2 1 1 0 2 0 0 0 2 2 0 2 2 0 1 0 0 1 0 2 1 0 0 0 1 2 0 0 2 0 0 0 0 2 2 1 1 2 2 1 0 2 1 1 0 0 1 1 0 2 0 1 1 0 2 | 0 2 0 2 1 1 0 2 0 1 2 0 2 1 2 2 2 2 0 0 0 1 1 0 2 0 1 2 0 1 2 2 0 0 0 1 2 0 0 0 2 0 1 0 2 1 2 0 0 0 0 0 2 0 0 2 0 2 2 2 0 0 0 2 | 1 2 0 2 1 0 2 0 1 1 2 0 0 2 1 2 0 2 0 1 2 2 1 0 2 0 2 0 2 2 0 1 2 2 0 0 2 0 0 2 0 1 0 0 2 2 1 0 1 2 0 0 2 2 0 0 0 0 2 2 0 1 2 1 | 1 0 1 1 0 1 0 2 1 0 1 1 1 1 1 0 0 0 2 2 1 0 0 1 1 0 0 2 0 2 0 0 2 0 0 0 0 2 2 0 0 1 1 0 2 1 1 2 1 0 2 1 1 0 0 0 0 0 1 2 0 0 0 0 | 2 0 0 2 1 0 2 0 1 2 0 2 0 1 2 1 0 0 0 1 0 2 0 2 0 2 1 0 0 0 2 0 0 1 0 2 2 2 1 2 2 0 1 0 1 1 0 2 0 0 0 1 2 0 1 2 2 1 1 0 1 1 1 1 | 1 0 2 0 1 0 0 0 0 0 0 0 0 2 2 2 2 0 2 0 0 0 1 0 2 1 0 0 0 2 0 1 2 2 2 0 2 0 1 1 2 2 2 2 2 0 1 0 2 2 2 0 1 1 0 1 2 2 0 1 1 2 0 2 | 2 0 0 0 0 1 2 1 1 0 1 1 1 0 2 1 0 2 0 1 0 2 1 2 2 1 0 2 0 1 1 0 2 0 0 2 2 0 0 2 0 0 2 1 0 1 0 1 0 1 2 1 2 0 0 2 0 2 0 2 0 2 0 0 | 1 0 1 2 2 0 1 2 1 0 0 2 1 2 2 1 0 1 0 0 0 1 1 0 0 2 1 0 0 2 1 1 1 0 0 0 0 0 0 2 1 1 0 2 2 1 1 0 2 2 2 0 1 0 0 0 2 0 0 2 1 1 0 2 | 1 1 1 0 1 2 0 2 1 2 0 2 0 2 1 0 2 0 2 0 0 0 1 2 0 2 0 2 2 0 0 1 1 2 1 2 0 1 2 0 0 1 0 0 2 0 1 0 2 1 0 0 2 2 0 2 0 2 2 2 1 2 0 1 | 1 1 0 2 2 1 2 0 0 1 0 2 2 0 2 0 1 0 2 1 0 0 0 0 2 0 2 1 0 1 2 1 0 0 1 2 0 1 0 1 0 1 1 0 0 2 2 2 2 0 1 1 0 0 0 0 2 0 1 2 2 1 2 0 | 0 0 0 0 1 0 2 2 1 2 1 0 2 2 1 2 1 0 2 0 1 2 2 0 1 0 2 0 0 0 2 1 0 2 1 0 1 0 0 0 0 0 0 1 0 2 0 1 0 1 0 2 1 0 0 0 2 0 2 2 2 0 1 2 | 0 1 0 2 0 0 1 0 1 1 0 0 0 1 2 2 0 1 0 2 2 1 0 0 2 0 1 1 2 2 2 0 1 1 2 2 1 1 2 0 2 1 2 2 2 0 0 2 2 0 1 0 0 0 0 0 2 0 1 1 2 2 1 0 | 0 0 0 2 1 0 2 2 1 0 1 1 1 0 1 2 2 2 1 0 0 2 0 2 2 1 0 1 0 1 2 1 0 0 0 0 1 0 1 0 2 2 0 1 2 2 0 1 0 0 0 2 2 1 0 0 2 0 0 0 2 0 1 0 | 0 1 0 0 0 0 0 1 0 0 0 1 0 1 1 2 0 2 0 1 1 2 2 0 1 1 0 1 2 1 0 1 0 2 1 0 1 1 0 2 1 1 0 2 2 1 1 0 2 2 0 0 0 0 2 1 0 2 0 0 0 1 2 2 | 1 1 2 1 2 2 0 0 2 1 2 0 2 0 0 0 0 0 0 1 1 2 2 2 1 0 1 0 2 0 0 2 0 1 2 1 0 2 1 1 0 1 0 2 0 1 1 0 2 0 1 2 2 0 1 2 0 2 0 0 1 0 2 0 | 2 0 0 0 1 0 2 0 2 0 0 0 2 1 1 0 1 2 0 2 1 1 1 1 1 0 2 1 1 2 0 2 0 2 1 2 0 2 1 0 0 2 1 1 0 2 0 2 0 0 1 0 0 0 1 0 2 0 2 0 1 0 2 0 | 2 0 2 0 1 0 0 1 1 0 0 0 1 2 2 1 0 2 1 1 0 1 0 2 1 0 0 0 1 2 0 0 0 0 1 2 1 2 1 0 0 0 0 0 1 2 0 1 0 2 2 0 0 0 2 1 0 1 2 0 0 1 0 0 | 0 1 0 1 2 0 0 1 0 2 0 0 2 1 2 1 0 0 0 2 1 0 2 0 0 0 0 2 2 0 0 0 2 1 0 2 2 0 1 2 2 2 0 2 2 0 2 2 2 1 0 2 1 0 1 2 1 2 0 2 0 1 0 1 | 2 0 2 0 1 2 0 1 0 0 2 1 1 0 0 0 1 0 1 2 0 2 1 0 1 1 2 2 0 0 2 0 0 0 2 1 0 0 1 2 2 0 0 0 0 2 0 2 2 2 1 0 0 0 0 1 0 0 2 1 1 2 0 2 | 0 0 1 0 2 2 1 0 2 2 0 1 0 1 1 0 0 1 1 2 0 0 2 0 0 0 2 1 2 0 0 0 1 2 0 1 0 1 2 1 0 0 1 0 2 1 0 0 1 0 2 0 1 1 0 2 1 1 0 2 2 0 2 1 | 1 0 1 1 0 1 2 0 2 1 0 0 1 0 0 0 0 0 0 0 0 2 0 2 0 0 0 2 1 0 2 2 0 2 1 1 1 2 0 1 0 0 0 1 2 0 1 2 1 2 2 0 2 0 1 1 2 1 2 0 1 2 1 0 | 0 2 0 1 0 1 2 0 1 0 1 0 2 0 0 1 0 0 2 0 2 0 2 0 1 2 0 0 1 2 1 1 0 0 0 1 1 0 1 0 2 2 0 1 2 2 0 2 1 2 2 0 0 2 1 0 0 2 0 2 1 2 0 0 | 2 2 2 0 0 0 0 2 1 0 0 0 2 2 1 2 0 1 0 2 0 0 1 0 2 0 1 2 0 0 0 2 0 2 0 1 1 2 1 0 2 2 2 1 2 2 2 1 2 2 0 1 1 1 2 0 2 0 0 2 2 0 1 0 | 0 0 2 0 1 2 2 1 0 0 2 0 2 1 1 0 1 0 0 1 1 1 2 1 1 0 1 2 0 2 0 1 0 0 0 1 0 2 0 0 1 0 0 0 1 0 1 2 0 1 0 1 0 0 0 1 0 2 0 0 2 2 0 2 | 0 2 1 0 1 1 0 2 0 2 2 1 2 1 1 1 0 0 1 2 2 2 0 1 0 0 1 2 1 0 2 0 0 1 0 2 0 0 0 2 2 1 0 0 0 2 1 2 0 2 1 0 1 0 1 0 2 0 2 0 1 2 2 2 | 0 1 0 2 2 1 2 0 2 0 0 1 2 1 0 0 2 2 0 0 2 0 2 1 0 1 2 2 0 1 1 0 0 0 2 1 1 0 2 0 0 0 0 0 1 0 0 0 0 0 0 2 1 2 2 1 1 0 0 1 0 1 2 0 | 2 1 0 0 1 1 2 2 0 1 0 2 0 2 1 0 2 0 1 0 0 2 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 2 0 1 0 1 0 2 1 0 2 2 2 0 0 2 1 1 2 1 2 1 1 0 1 2 0 1 | 1 0 0 2 1 0 2 0 2 1 2 2 1 0 1 2 0 1 1 1 2 1 0 0 0 0 2 1 0 2 0 1 2 2 0 0 0 0 2 2 1 0 1 0 0 2 0 2 0 0 2 0 2 1 0 2 1 0 0 1 0 0 0 0 | 0 1 0 2 0 2 1 0 1 2 0 0 2 0 0 2 2 0 1 2 1 2 1 0 0 2 2 0 1 2 2 0 0 2 0 1 2 0 1 2 0 1 0 2 0 1 0 2 0 0 0 0 0 0 1 2 1 1 0 0 1 1 0 2 | 0 2 1 0 2 0 0 1 0 1 2 2 1 2 0 1 0 2 0 1 0 0 0 0 1 0 0 2 2 2 1 2 2 1 0 0 2 1 0 1 2 0 0 1 0 0 2 2 1 0 0 2 0 2 1 0 2 0 0 0 2 0 2 1 | 0 0 1 2 0 2 2 2 1 0 2 0 2 2 0 0 1 0 1 0 2 2 0 0 0 1 2 2 1 1 1 0 0 1 2 1 0 1 0 1 2 2 0 2 0 2 2 0 2 0 2 2 0 2 1 2 0 0 2 0 2 2 0 0 B=1 | 0 0 2 0 2 0 2 0 2 0 1 1 1 1 1 1 0 0 0 0 2 2 2 1 0 1 2 2 2 2 2 1 2 1 0 0 0 0 1 0 0 2 0 2 0 1 1 1 2 2 2 2 1 1 1 0 0 0 0 2 0 1 1 1 | 0 0 0 2 0 2 0 2 0 0 1 1 1 1 1 1 0 0 0 0 2 2 2 1 1 1 2 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 0 2 1 1 1 2 2 2 2 1 1 1 0 0 0 0 0 2 1 1 1 | 0 0 0 0 2 0 2 0 0 0 1 1 1 1 1 1 0 0 0 0 2 2 2 1 1 1 2 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 1 1 1 2 2 2 2 1 1 1 0 0 0 0 0 2 1 1 1 | 0 0 0 0 0 2 0 0 0 0 1 1 1 1 1 1 0 0 0 0 2 2 2 1 1 1 2 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 1 1 1 2 2 2 2 1 1 1 0 0 0 0 0 2 1 1 1 | 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 2 2 2 1 1 1 2 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 1 1 1 2 2 2 2 1 1 1 0 0 0 0 2 2 1 1 1 | 0 0 0 0 0 0 2 0 2 1 1 1 1 1 1 1 2 2 0 2 2 2 2 1 1 1 2 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 1 1 1 2 2 2 2 1 1 1 0 0 0 0 2 2 1 1 1 | 0 0 0 0 0 0 0 2 0 1 1 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 1 1 1 2 2 2 2 1 1 1 0 0 0 0 2 2 1 1 1 | 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 1 1 1 2 2 2 2 1 1 1 0 0 0 0 2 2 1 1 1 | 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 1 1 1 2 2 2 2 1 1 1 0 0 0 0 2 2 1 1 1 | 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 1 1 1 2 2 2 2 1 1 1 0 0 0 0 2 2 1 1 1 | 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 1 1 1 2 2 2 2 1 1 0 0 0 0 0 0 2 1 1 0 | 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 1 1 1 2 2 2 2 1 1 0 0 0 0 0 0 0 1 1 0 | 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 1 1 1 2 2 2 2 1 1 0 0 0 0 0 0 0 1 1 0 | 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 1 1 0 0 0 0 0 0 0 1 1 0 | 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 1 1 0 0 0 0 0 0 0 1 1 0 | 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 1 1 0 0 0 0 0 0 0 1 1 0 | 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 1 1 0 0 0 0 0 0 0 1 1 0 | 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 1 1 0 0 0 0 0 0 0 1 1 0 | 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 1 1 0 0 0 0 0 0 0 1 1 0 | 0 0 0 0 0 0 0 0 0 1 1 2 2 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 1 1 0 0 0 0 0 0 0 1 1 0 | 0 0 0 0 0 0 0 0 0 1 1 2 2 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 1 1 0 0 0 0 0 0 0 1 1 0 | 0 0 0 0 0 0 0 0 0 1 1 2 2 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 1 1 0 0 0 0 0 0 0 1 1 0 | 0 0 0 0 0 0 0 0 0 1 1 2 2 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 1 1 0 0 0 0 0 0 0 1 1 0 | 0 0 0 0 0 0 0 0 0 1 1 2 2 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 1 1 0 0 0 0 0 0 0 1 1 0 | 0 0 0 0 0 0 0 0 0 1 1 2 2 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 1 1 0 0 0 0 0 0 0 1 1 0 | 0 0 0 0 0 0 0 0 0 1 1 2 2 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 2 1 1 2 2 2 2 1 1 0 0 0 0 0 0 0 1 1 0 | 0 0 0 0 0 0 0 0 0 1 1 2 2 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 1 1 1 2 2 2 1 1 1 0 0 0 0 0 0 0 1 1 0 | 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 1 0 0 0 0 0 0 2 2 2 2 1 1 1 2 2 2 1 1 1 0 0 0 0 0 0 0 1 1 0 | 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 1 1 0 0 0 0 0 0 2 2 2 2 1 1 1 2 2 2 1 1 1 0 0 0 0 0 0 0 1 1 0 | 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 1 1 0 0 0 0 0 0 2 2 2 2 1 1 1 2 2 2 1 1 1 0 0 0 0 0 0 0 1 1 0 | 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 1 1 0 0 0 0 0 0 2 2 2 2 1 1 1 2 2 2 1 1 1 0 0 0 0 0 0 0 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 1 1 0 0 0 0 0 0 2 2 2 2 1 1 1 2 2 2 1 1 1 0 0 0 0 0 0 0 2 2 0 | 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 1 1 0 0 0 0 0 0 2 2 2 2 1 1 1 2 2 2 1 1 1 0 0 0 0 0 0 0 2 2 0 | 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 1 1 0 0 0 0 0 0 2 2 2 2 1 1 1 2 2 2 1 1 1 0 0 0 0 0 0 0 2 2 0 | 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 1 1 0 0 0 0 0 0 2 2 2 2 1 1 1 2 2 2 1 1 1 0 0 0 0 0 0 0 2 2 0 | 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 1 1 0 0 0 0 0 0 2 2 2 2 1 1 1 2 2 2 1 1 1 0 0 0 0 0 0 0 2 2 0 | 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 1 1 0 0 0 0 0 0 2 2 2 2 1 1 1 2 2 1 1 1 1 0 0 0 0 0 0 0 2 2 0 | 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 1 1 0 0 0 0 0 0 2 2 2 2 1 1 1 2 1 1 1 1 1 0 0 0 0 0 0 0 2 2 0 | 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 1 2 2 2 1 1 1 1 2 2 2 2 2 1 1 1 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 2 2 2 2 | 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 1 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 | 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 1 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 | 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 1 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 | 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 1 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 | 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 1 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 | 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 1 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 | 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 1 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 | 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 1 1 0 0 0 0 0 0 2 2 2 2 2 | 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 1 1 0 0 0 0 0 0 2 2 2 2 2 | 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 1 1 0 0 0 0 0 0 2 2 2 2 2 | 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 1 1 0 0 0 0 0 0 2 2 2 2 2 | 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 1 1 0 0 0 0 0 0 2 2 2 2 2 | 0 0 0 0 0 0 2 1 0 0 0 0 0 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 1 1 0 2 2 2 1 2 2 2 2 2 2 | 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 2 2 2 2 2 2 2 1 0 1 1 2 2 2 2 2 2 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 2 2 2 0 0 0 0 2 2 2 | 0 1 1 0 0 0 1 1 1 1 0 0 0 0 0 1 2 2 2 2 2 2 2 0 1 1 1 2 2 2 2 2 2 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 0 1 2 2 2 2 0 0 0 0 2 2 2 | 1 1 1 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 2 2 2 2 2 0 1 1 1 2 2 2 2 2 2 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 0 2 2 2 2 0 0 0 0 2 2 2 | 1 1 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 2 2 2 2 2 0 1 1 1 2 2 2 2 2 2 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 0 2 2 2 2 0 0 0 0 2 2 2 | 1 1 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 2 2 2 2 2 0 1 1 1 2 2 2 2 2 2 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 2 0 0 0 0 2 2 2 | 1 1 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 2 0 0 0 0 2 2 2 | 1 1 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 2 0 0 0 0 2 2 2 | 1 1 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 2 2 2 0 0 0 0 2 2 2 | 1 1 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 2 2 2 0 0 0 0 2 2 2 | 1 1 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 2 2 2 0 0 0 0 2 2 2 | 1 1 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 2 2 2 0 0 0 0 2 2 2 | 1 1 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 1 2 2 2 2 0 0 0 0 0 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 2 2 0 0 0 0 0 2 2 2 B=2 | 2 0 2 0 2 0 0 0 2 2 2 0 0 0 0 2 0 2 1 1 1 1 1 1 1 1 2 0 2 0 2 0 2 1 1 1 1 0 2 0 2 0 2 0 2 0 1 2 1 1 1 1 1 0 0 0 2 0 2 0 2 0 2 0 | 0 2 0 2 0 0 0 0 2 2 2 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 0 2 0 2 0 1 1 1 1 0 0 2 0 2 0 2 0 1 1 1 1 1 1 1 1 0 0 0 0 2 0 2 0 2 0 2 | 2 0 2 0 0 0 0 0 2 2 2 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 0 2 0 1 1 1 1 1 0 0 0 2 0 2 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 0 2 0 2 0 | 0 2 2 0 0 0 0 0 2 2 2 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 0 2 1 1 1 1 1 0 0 0 0 2 0 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 0 2 0 2 | 2 2 2 0 0 0 0 0 2 2 2 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 0 2 0 | 2 2 2 0 0 0 0 0 2 2 2 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 0 2 | 2 2 2 0 0 0 0 0 2 2 2 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 2 2 2 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 2 2 2 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 2 2 2 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 2 2 2 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 2 2 2 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 2 2 2 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 2 2 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 2 2 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 2 2 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 2 2 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 2 2 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 2 2 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 2 2 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 2 0 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 B=3 | 0 0 2 0 2 0 0 0 2 2 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 0 2 0 2 0 1 0 1 2 1 1 1 1 1 2 1 2 0 2 0 0 | 0 0 0 2 0 0 0 0 2 2 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 0 2 0 1 0 1 1 1 1 1 1 1 1 1 2 1 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 2 0 2 0 2 0 2 0 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 0 1 0 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 2 0 2 0 2 0 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 0 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 2 0 2 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 2 0 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 | 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 B=4 | 2 0 2 0 2 0 2 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 2 1 2 2 2 2 2 2 2 | 2 2 0 2 0 2 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 0 2 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 | 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 B=6 | 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 0 0 0 2 0 2 0 2 0 2 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 0 0 0 0 0 2 0 2 0 2 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 0 0 0 0 0 0 0 2 0 2 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 0 0 0 0 0 0 0 0 0 2 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 starpu-1.2.3+dfsg/examples/stencil/run000077500000000000000000000021131320135501600177540ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010 Université de Bordeaux # Copyright (C) 2010, 2011 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. [ -z "$N" ] && N=1 export N [ -z "$STARPU_SCHED_BETA" ] && STARPU_SCHED_BETA="2" export STARPU_SCHED_BETA echo sched $STARPU_SCHED 1>&2 echo sched_beta $STARPU_SCHED_BETA 1>&2 echo prefetch $STARPU_PREFETCH 1>&2 echo calibrate $STARPU_CALIBRATE 1>&2 echo ncpus $STARPU_NCPUS 1>&2 echo ncuda $STARPU_NCUDA 1>&2 echo N $N ./stencil -nbz $(($N * 64)) -sizex 128 -sizey 128 -sizez $(( $((16 * $N)) * 128 )) -niter 64 "$@" starpu-1.2.3+dfsg/examples/stencil/shadow.cu000066400000000000000000000042121320135501600210420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #define _externC extern "C" #include "stencil.h" /* Perform replication of data on X and Y edges, to fold the domain on itself through mere replication of the source state. */ extern "C" __global__ void cuda_shadow( int bz, TYPE *ptr, int nx, int ny, int nz, int ldy, int ldz, int i) { unsigned idx = threadIdx.x + blockIdx.x * blockDim.x; unsigned idy = threadIdx.y + blockIdx.y * blockDim.y; //unsigned idz = threadIdx.z + blockIdx.z * blockDim.z; unsigned idz = 0; unsigned stepx = blockDim.x * gridDim.x; unsigned stepy = blockDim.y * gridDim.y; //unsigned stepz = blockDim.z * gridDim.z; unsigned stepz = 1; unsigned x, y, z; #include "shadow.h" } extern "C" void cuda_shadow_host(int bz, TYPE *ptr, int nx, int ny, int nz, int ldy, int ldz, int i) { unsigned max_parallelism = 512; unsigned threads_per_dim_x = max_parallelism; while (threads_per_dim_x / 2 >= nx) threads_per_dim_x /= 2; unsigned threads_per_dim_y = max_parallelism / threads_per_dim_x; while (threads_per_dim_y / 2 >= ny) threads_per_dim_y /= 2; #if 0 unsigned threads_per_dim_z = 4; dim3 dimBlock(threads_per_dim_x, threads_per_dim_y, threads_per_dim_z); dim3 dimGrid(nx / threads_per_dim_x, ny / threads_per_dim_y, nz / threads_per_dim_z); #else dim3 dimBlock(threads_per_dim_x, threads_per_dim_y); dim3 dimGrid((nx + threads_per_dim_x-1) / threads_per_dim_x, (ny + threads_per_dim_y-1) / threads_per_dim_y); #endif cuda_shadow <<>> (bz, ptr, nx, ny, nz, ldy, ldz, i); } starpu-1.2.3+dfsg/examples/stencil/shadow.h000066400000000000000000000032531320135501600206660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Perform replication of data on X and Y edges, to fold the domain on itself through mere replication of the source state. */ /* TODO: rather use a dummy for loop, to assign the job to the threads that will work on it? */ if (idy == 0) for (z = i-1 + idz; z < nz-(i-1); z += stepz) for (x = K + idx; x < nx-K; x += stepx) { unsigned index = x+z*ldz; ptr[index+(K-1)*ldy] = ptr[index+(ny-K-1)*ldy]; ptr[index+(ny-K)*ldy] = ptr[index+K*ldy]; } if (idx == 0) for (z = i-1 + idz; z < nz-(i-1); z += stepz) for (y = K + idy; y < ny-K; y += stepy) { unsigned index = y*ldy+z*ldz; ptr[(K-1)+index] = ptr[(nx-K-1)+index]; ptr[(nx-K)+index] = ptr[K+index]; } if (idx == 0 && idy == 0) for (z = i-1 + idz; z < nz-(i-1); z += stepz) { unsigned index = z*ldz; ptr[K-1+(K-1)*ldy+index] = ptr[(nx-K-1)+(ny-K-1)*ldy+index]; ptr[(nx-K)+(K-1)*ldy+index] = ptr[K+(ny-K-1)*ldy+index]; ptr[(K-1)+(ny-K)*ldy+index] = ptr[(nx-K-1)+K*ldy+index]; ptr[(nx-K)+(ny-K)*ldy+index] = ptr[K+K*ldy+index]; } starpu-1.2.3+dfsg/examples/stencil/shadow_opencl.c000066400000000000000000000072011320135501600222160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013-2014 Université de Bordeaux * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "stencil.h" /* Perform replication of data on X and Y edges, to fold the domain on itself through mere replication of the source state. */ #define str(x) #x #define clsrc(t,k) "__kernel void\n\ #define TYPE " str(t) "\n\ #define K " str(k) "\n\ shadow( int bz, __global TYPE *ptr, int nx, int ny, int nz, int ldy, int ldz, int i)\n\ {\n\ unsigned idx = get_global_id(0);\n\ unsigned idy = get_global_id(1);\n\ //unsigned idz = threadIdx.z + blockIdx.z * blockDim.z;\n\ unsigned idz = 0;\n\ unsigned stepx = get_global_size(0);\n\ unsigned stepy = get_global_size(1);\n\ //unsigned stepz = blockDim.z * gridDim.z;\n\ unsigned stepz = 1;\n\ unsigned x, y, z;\n\ if (idy == 0)\n\ for (z = i-1 + idz; z < nz-(i-1); z += stepz)\n\ for (x = K + idx; x < nx-K; x += stepx) \ {\n \ unsigned index = x+z*ldz;\n\ ptr[index+(K-1)*ldy] = ptr[index+(ny-K-1)*ldy];\n\ ptr[index+(ny-K)*ldy] = ptr[index+K*ldy];\n\ }\n\ \n\ if (idx == 0)\n\ for (z = i-1 + idz; z < nz-(i-1); z += stepz)\n\ for (y = K + idy; y < ny-K; y += stepy) \ {\n \ unsigned index = y*ldy+z*ldz;\n\ ptr[(K-1)+index] = ptr[(nx-K-1)+index];\n\ ptr[(nx-K)+index] = ptr[K+index];\n\ }\n\ \n\ if (idx == 0 && idy == 0)\n\ for (z = i-1 + idz; z < nz-(i-1); z += stepz) \ {\n \ unsigned index = z*ldz;\n\ ptr[K-1+(K-1)*ldy+index] = ptr[(nx-K-1)+(ny-K-1)*ldy+index];\n\ ptr[(nx-K)+(K-1)*ldy+index] = ptr[K+(ny-K-1)*ldy+index];\n\ ptr[(K-1)+(ny-K)*ldy+index] = ptr[(nx-K-1)+K*ldy+index];\n\ ptr[(nx-K)+(ny-K)*ldy+index] = ptr[K+K*ldy+index];\n\ }\n\ }" static const char * src = clsrc(TYPE,K); static struct starpu_opencl_program program; void opencl_shadow_init(void) { starpu_opencl_load_opencl_from_string(src, &program, NULL); } void opencl_shadow_free(void) { int ret = starpu_opencl_unload_opencl(&program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); } void opencl_shadow_host(int bz, TYPE *ptr, int nx, int ny, int nz, int ldy, int ldz, int i) { #if 0 size_t dim[] = {nx, ny, nz}; #else size_t dim[] = {nx, ny, 1}; #endif int devid,id; id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); cl_kernel kernel; cl_command_queue cq; cl_int err; err = starpu_opencl_load_kernel(&kernel, &cq, &program, "shadow", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); clSetKernelArg(kernel, 0, sizeof(bz), &bz); clSetKernelArg(kernel, 1, sizeof(ptr), &ptr); clSetKernelArg(kernel, 2, sizeof(nx), &nx); clSetKernelArg(kernel, 3, sizeof(ny), &ny); clSetKernelArg(kernel, 4, sizeof(nz), &nz); clSetKernelArg(kernel, 5, sizeof(ldy), &ldy); clSetKernelArg(kernel, 6, sizeof(ldz), &ldz); clSetKernelArg(kernel, 7, sizeof(i), &i); err = clEnqueueNDRangeKernel(cq, kernel, 3, NULL, dim, NULL, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } starpu-1.2.3+dfsg/examples/stencil/stencil-blocks.c000066400000000000000000000233261320135501600223130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2013-2014, 2016-2017 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "stencil.h" #include /* Manage block and tags allocation */ static struct block_description *blocks; static unsigned sizex, sizey, sizez; static unsigned nbz; static unsigned *block_sizes_z; /* * Tags for various codelet completion */ /* * common tag format: */ static starpu_tag_t tag_common(int z, int dir, int type) { return (((((starpu_tag_t)type) << 4) | ((dir+1)/2)) << 32)|(starpu_tag_t)z; } /* Completion of last update tasks */ starpu_tag_t TAG_FINISH(int z) { z = (z + nbz)%nbz; starpu_tag_t tag = tag_common(z, 0, 1); return tag; } /* Completion of the save codelet for MPI send/recv */ starpu_tag_t TAG_START(int z, int dir) { z = (z + nbz)%nbz; starpu_tag_t tag = tag_common(z, dir, 2); return tag; } /* * common MPI tag format: * iter is actually not needed for coherency, but it makes debugging easier */ static int mpi_tag_common(int z, int iter, int dir, int buffer) { return (((((iter << 12)|z)<<4) | ((1+dir)/2))<<4)|buffer; } int MPI_TAG0(int z, int iter, int dir) { z = (z + nbz)%nbz; int tag = mpi_tag_common(z, iter, dir, 0); return tag; } int MPI_TAG1(int z, int iter, int dir) { z = (z + nbz)%nbz; int tag = mpi_tag_common(z, iter, dir, 1); return tag; } /* * Block descriptors */ /* Compute the size of the different blocks */ static void compute_block_sizes(void) { block_sizes_z = (unsigned *) malloc(nbz*sizeof(unsigned)); STARPU_ASSERT(block_sizes_z); /* Perhaps the last chunk is smaller */ unsigned default_block_size = (sizez+nbz-1)/nbz; unsigned remaining = sizez; unsigned b; for (b = 0; b < nbz; b++) { block_sizes_z[b] = MIN(default_block_size, remaining); remaining -= block_sizes_z[b]; } STARPU_ASSERT(remaining == 0); } unsigned get_block_size(int bz) { return block_sizes_z[bz]; } struct block_description *get_block_description(int z) { z = (z + nbz)%nbz; STARPU_ASSERT(&blocks[z]); return &blocks[z]; } int get_block_mpi_node(int z) { z = (z + nbz)%nbz; return blocks[z].mpi_node; } void create_blocks_array(unsigned _sizex, unsigned _sizey, unsigned _sizez, unsigned _nbz) { /* Store the parameters */ nbz = _nbz; sizex = _sizex; sizey = _sizey; sizez = _sizez; /* Create a grid of block descriptors */ blocks = (struct block_description *) calloc(nbz, sizeof(struct block_description)); STARPU_ASSERT(blocks); /* What is the size of the different blocks ? */ compute_block_sizes(); unsigned bz; for (bz = 0; bz < nbz; bz++) { struct block_description * block = get_block_description(bz); /* Which block is it ? */ block->bz = bz; /* For simplicity, we store which are the neighbours blocks */ block->boundary_blocks[B] = get_block_description((bz-1+nbz)%nbz); block->boundary_blocks[T] = get_block_description((bz+1)%nbz); } } void free_blocks_array() { free(blocks); free(block_sizes_z); } /* * Initialization of the blocks */ void assign_blocks_to_workers(int rank) { unsigned bz; /* NB: perhaps we could count a GPU as multiple workers */ /* how many workers are there ? */ /*unsigned nworkers = starpu_worker_get_count();*/ /* how many blocks are on that MPI node ? */ unsigned nblocks = 0; for (bz = 0; bz < nbz; bz++) { struct block_description *block = get_block_description(bz); if (block->mpi_node == rank) nblocks++; } /* how many blocks per worker ? */ /*unsigned nblocks_per_worker = (nblocks + nworkers - 1)/nworkers;*/ /* we now attribute up to nblocks_per_worker blocks per workers */ unsigned attributed = 0; for (bz = 0; bz < nbz; bz++) { struct block_description *block = get_block_description(bz); if (block->mpi_node == rank) { unsigned workerid; /* Manage initial block distribution between CPU and GPU */ #if 0 #if 1 /* GPUs then CPUs */ if (attributed < 3*18) workerid = attributed / 18; else workerid = 3+ (attributed - 3*18) / 2; #else /* GPUs interleaved with CPUs */ if ((attributed % 20) <= 1) workerid = 3 + attributed / 20; else if (attributed < 60) workerid = attributed / 20; else workerid = (attributed - 60)/2 + 6; #endif #else /* Only GPUS */ workerid = (attributed / 21) % 3; #endif /*= attributed/nblocks_per_worker;*/ block->preferred_worker = workerid; attributed++; } } } void assign_blocks_to_mpi_nodes(int world_size) { unsigned nzblocks_per_process = (nbz + world_size - 1) / world_size; unsigned bz; for (bz = 0; bz < nbz; bz++) { struct block_description *block = get_block_description(bz); block->mpi_node = bz / nzblocks_per_process; } } static size_t allocated = 0; static void allocate_block_on_node(starpu_data_handle_t *handleptr, unsigned bz, TYPE **ptr, unsigned nx, unsigned ny, unsigned nz) { int ret; size_t block_size = nx*ny*nz*sizeof(TYPE); /* Allocate memory */ #if 1 ret = starpu_malloc_flags((void **)ptr, block_size, STARPU_MALLOC_PINNED|STARPU_MALLOC_SIMULATION_FOLDED); STARPU_ASSERT(ret == 0); #else *ptr = malloc(block_size); STARPU_ASSERT(*ptr); #endif allocated += block_size; #ifndef STARPU_SIMGRID /* Fill the blocks with 0 */ memset(*ptr, 0, block_size); #endif /* Register it to StarPU */ starpu_block_data_register(handleptr, STARPU_MAIN_RAM, (uintptr_t)*ptr, nx, nx*ny, nx, ny, nz, sizeof(TYPE)); starpu_data_set_coordinates(*handleptr, 1, bz); } static void free_block_on_node(starpu_data_handle_t handleptr, unsigned nx, unsigned ny, unsigned nz) { void *ptr = (void *) starpu_block_get_local_ptr(handleptr); size_t block_size = nx*ny*nz*sizeof(TYPE); starpu_data_unregister(handleptr); starpu_free_flags(ptr, block_size, STARPU_MALLOC_PINNED|STARPU_MALLOC_SIMULATION_FOLDED); } void display_memory_consumption(int rank) { FPRINTF(stderr, "%lu B of memory were allocated on node %d\n", (unsigned long) allocated, rank); } void allocate_memory_on_node(int rank) { unsigned bz; for (bz = 0; bz < nbz; bz++) { struct block_description *block = get_block_description(bz); int node = block->mpi_node; /* Main blocks */ if (node == rank) { unsigned size_bz = block_sizes_z[bz]; allocate_block_on_node(&block->layers_handle[0], bz, &block->layers[0], (sizex + 2*K), (sizey + 2*K), (size_bz + 2*K)); #ifndef STARPU_SIMGRID #ifdef LIFE unsigned x, y, z; unsigned sum = 0; for (x = 0; x < sizex; x++) for (y = 0; y < sizey; y++) for (z = 0; z < size_bz; z++) /* Just random data */ sum += block->layers[0][(K+x)+(K+y)*(sizex + 2*K)+(K+z)*(sizex+2*K)*(sizey+2*K)] = (int)((x/7.+y/13.+(bz*size_bz + z)/17.) * 10.) % 2; /* printf("block %d starts with %d/%d alive\n", bz, sum, sizex*sizey*size_bz);*/ #endif #endif allocate_block_on_node(&block->layers_handle[1], bz, &block->layers[1], (sizex + 2*K), (sizey + 2*K), (size_bz + 2*K)); } /* Boundary blocks : Top */ int top_node = block->boundary_blocks[T]->mpi_node; if ((node == rank) || (top_node == rank)) { allocate_block_on_node(&block->boundaries_handle[T][0], bz, &block->boundaries[T][0], (sizex + 2*K), (sizey + 2*K), K); allocate_block_on_node(&block->boundaries_handle[T][1], bz, &block->boundaries[T][1], (sizex + 2*K), (sizey + 2*K), K); } /* Boundary blocks : Bottom */ int bottom_node = block->boundary_blocks[B]->mpi_node; if ((node == rank) || (bottom_node == rank)) { allocate_block_on_node(&block->boundaries_handle[B][0], bz, &block->boundaries[B][0], (sizex + 2*K), (sizey + 2*K), K); allocate_block_on_node(&block->boundaries_handle[B][1], bz, &block->boundaries[B][1], (sizex + 2*K), (sizey + 2*K), K); } } } void free_memory_on_node(int rank) { unsigned bz; for (bz = 0; bz < nbz; bz++) { struct block_description *block = get_block_description(bz); int node = block->mpi_node; /* Main blocks */ if (node == rank) { free_block_on_node(block->layers_handle[0], (sizex + 2*K), (sizey + 2*K), K); free_block_on_node(block->layers_handle[1], (sizex + 2*K), (sizey + 2*K), K); } /* Boundary blocks : Top */ int top_node = block->boundary_blocks[T]->mpi_node; if ((node == rank) || (top_node == rank)) { free_block_on_node(block->boundaries_handle[T][0], (sizex + 2*K), (sizey + 2*K), K); free_block_on_node(block->boundaries_handle[T][1], (sizex + 2*K), (sizey + 2*K), K); } /* Boundary blocks : Bottom */ int bottom_node = block->boundary_blocks[B]->mpi_node; if ((node == rank) || (bottom_node == rank)) { free_block_on_node(block->boundaries_handle[B][0], (sizex + 2*K), (sizey + 2*K), K); free_block_on_node(block->boundaries_handle[B][1], (sizex + 2*K), (sizey + 2*K), K); } } } /* check how many cells are alive */ void check(int rank) { unsigned bz; for (bz = 0; bz < nbz; bz++) { struct block_description *block = get_block_description(bz); int node = block->mpi_node; /* Main blocks */ if (node == rank) { #ifdef LIFE unsigned size_bz = block_sizes_z[bz]; unsigned x, y, z; unsigned sum = 0; for (x = 0; x < sizex; x++) for (y = 0; y < sizey; y++) for (z = 0; z < size_bz; z++) sum += block->layers[0][(K+x)+(K+y)*(sizex + 2*K)+(K+z)*(sizex+2*K)*(sizey+2*K)]; printf("block %u got %u/%u alive\n", bz, sum, sizex*sizey*size_bz); #endif } } } starpu-1.2.3+dfsg/examples/stencil/stencil-kernels.c000066400000000000000000000552461320135501600225070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2015 Université de Bordeaux * Copyright (C) 2012, 2013, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "stencil.h" /* Computation Kernels */ /* * There are three codeletets: * * - cl_update, which takes a block and the boundaries of its neighbours, loads * the boundaries into the block and perform some update loops: * * comp. buffer save. buffers comp. buffer save. buffers comp. buffer * | ... | * | | +------------------+ +------------------+ * | #N+1 | | #N+1 bottom copy====>#N+1 bottom copy | * +-------------+ +------------------+ +------------------+ * | #N top copy | | #N top copy | | | * +-------------+ +------------------+ | | * | #N | * ... * | | +----------------+ +----------------------+ * | | | #N bottom copy | | block #N bottom copy | * ^ +------------------+ +----------------+ +----------------------+ * | | #N-1 top copy <====#N-1 top copy | | block #N-1 | * | +------------------+ +----------------+ | | * Z ... * * - save_cl_top, which take a block and its top boundary, and saves the top of * the block into the boundary (to be given as bottom of the neighbour above * this block). * * comp. buffer save. buffers comp. buffer save. buffers comp. buffer * | ... | * | | +------------------+ +------------------+ * | #N+1 | | #N+1 bottom copy | | #N+1 bottom copy | * +-------------+ +------------------+ +------------------+ * | #N top copy | | #N top copy <==== | * +-------------+ +------------------+ |..................| * | #N | * ... * | | +----------------+ +----------------------+ * | | | #N bottom copy | | block #N bottom copy | * ^ +------------------+ +----------------+ +----------------------+ * | | #N-1 top copy | | #N-1 top copy | | block #N-1 | * | +------------------+ +----------------+ | | * Z ... * * - save_cl_bottom, same for the bottom * comp. buffer save. buffers comp. buffer save. buffers comp. buffer * | ... | * | | +------------------+ +------------------+ * | #N+1 | | #N+1 bottom copy | | #N+1 bottom copy | * +-------------+ +------------------+ +------------------+ * | #N top copy | | #N top copy | | | * +-------------+ +------------------+ | | * | #N | * ... * |..................| +----------------+ +----------------------+ * | ====>#N bottom copy | | block #N bottom copy | * ^ +------------------+ +----------------+ +----------------------+ * | | #N-1 top copy | | #N-1 top copy | | block #N-1 | * | +------------------+ +----------------+ | | * Z ... * * The idea is that the computation buffers thus don't have to move, only their * boundaries are copied to buffers that do move (be it CPU/GPU, GPU/GPU or via * MPI) * * For each of the buffers above, there are two (0/1) buffers to make new/old switch costless. */ #if 0 # define DEBUG(fmt, ...) fprintf(stderr,fmt,##__VA_ARGS__) #else # define DEBUG(fmt, ...) (void) 0 #endif /* Record which GPU ran which block, for nice pictures */ int who_runs_what_len; int *who_runs_what; int *who_runs_what_index; double *last_tick; /* Achieved iterations */ static int achieved_iter; /* Record how many updates each worker performed */ unsigned update_per_worker[STARPU_NMAXWORKERS]; static void record_who_runs_what(struct block_description *block) { double now, now2, diff, delta = get_ticks() * 1000; int workerid = starpu_worker_get_id_check(); now = starpu_timing_now(); now2 = now - start; diff = now2 - last_tick[block->bz]; while (diff >= delta) { last_tick[block->bz] += delta; diff = now2 - last_tick[block->bz]; if (who_runs_what_index[block->bz] < who_runs_what_len) who_runs_what[block->bz + (who_runs_what_index[block->bz]++) * get_nbz()] = -1; } if (who_runs_what_index[block->bz] < who_runs_what_len) who_runs_what[block->bz + (who_runs_what_index[block->bz]++) * get_nbz()] = global_workerid(workerid); } static void check_load(struct starpu_block_interface *block, struct starpu_block_interface *boundary) { /* Sanity checks */ STARPU_ASSERT(block->nx == boundary->nx); STARPU_ASSERT(block->ny == boundary->ny); STARPU_ASSERT(boundary->nz == K); /* NB: this is not fully garanteed ... but it's *very* likely and that * makes our life much simpler */ STARPU_ASSERT(block->ldy == boundary->ldy); STARPU_ASSERT(block->ldz == boundary->ldz); } /* * Load a neighbour's boundary into block, CPU version */ static void load_subblock_from_buffer_cpu(void *_block, void *_boundary, unsigned firstz) { struct starpu_block_interface *block = (struct starpu_block_interface *)_block; struct starpu_block_interface *boundary = (struct starpu_block_interface *)_boundary; check_load(block, boundary); /* We do a contiguous memory transfer */ size_t boundary_size = K*block->ldz*block->elemsize; unsigned offset = firstz*block->ldz; TYPE *block_data = (TYPE *)block->ptr; TYPE *boundary_data = (TYPE *)boundary->ptr; memcpy(&block_data[offset], boundary_data, boundary_size); } /* * Load a neighbour's boundary into block, CUDA version */ #ifdef STARPU_USE_CUDA static void load_subblock_from_buffer_cuda(void *_block, void *_boundary, unsigned firstz) { struct starpu_block_interface *block = (struct starpu_block_interface *)_block; struct starpu_block_interface *boundary = (struct starpu_block_interface *)_boundary; check_load(block, boundary); /* We do a contiguous memory transfer */ size_t boundary_size = K*block->ldz*block->elemsize; unsigned offset = firstz*block->ldz; TYPE *block_data = (TYPE *)block->ptr; TYPE *boundary_data = (TYPE *)boundary->ptr; cudaMemcpyAsync(&block_data[offset], boundary_data, boundary_size, cudaMemcpyDeviceToDevice, starpu_cuda_get_local_stream()); } /* * cl_update (CUDA version) */ static void update_func_cuda(void *descr[], void *arg) { struct block_description *block = arg; int workerid = starpu_worker_get_id_check(); DEBUG( "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); if (block->bz == 0) FPRINTF(stderr,"!!! DO update_func_cuda z %u CUDA%d !!!\n", block->bz, workerid); else DEBUG( "!!! DO update_func_cuda z %u CUDA%d !!!\n", block->bz, workerid); #if defined(STARPU_USE_MPI) && !defined(STARPU_SIMGRID) int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, &rank); DEBUG( "!!! RANK %d !!!\n", rank); #endif DEBUG( "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); unsigned block_size_z = get_block_size(block->bz); unsigned i; update_per_worker[workerid]++; record_who_runs_what(block); /* * Load neighbours' boundaries : TOP */ /* The offset along the z axis is (block_size_z + K) */ load_subblock_from_buffer_cuda(descr[0], descr[2], block_size_z+K); load_subblock_from_buffer_cuda(descr[1], descr[3], block_size_z+K); /* * Load neighbours' boundaries : BOTTOM */ load_subblock_from_buffer_cuda(descr[0], descr[4], 0); load_subblock_from_buffer_cuda(descr[1], descr[5], 0); /* * Stencils ... do the actual work here :) TODO */ for (i=1; i<=K; i++) { struct starpu_block_interface *oldb = descr[i%2], *newb = descr[(i+1)%2]; TYPE *old = (void*) oldb->ptr, *newer = (void*) newb->ptr; /* Shadow data */ cuda_shadow_host(block->bz, old, oldb->nx, oldb->ny, oldb->nz, oldb->ldy, oldb->ldz, i); /* And perform actual computation */ #ifdef LIFE cuda_life_update_host(block->bz, old, newer, oldb->nx, oldb->ny, oldb->nz, oldb->ldy, oldb->ldz, i); #else cudaMemcpyAsync(newer, old, oldb->nx * oldb->ny * oldb->nz * sizeof(*newer), cudaMemcpyDeviceToDevice, starpu_cuda_get_local_stream()); #endif /* LIFE */ } if (block->bz == 0) starpu_top_update_data_integer(starpu_top_achieved_loop, ++achieved_iter); } #endif /* STARPU_USE_CUDA */ /* * Load a neighbour's boundary into block, OpenCL version */ #ifdef STARPU_USE_OPENCL static void load_subblock_from_buffer_opencl(struct starpu_block_interface *block, struct starpu_block_interface *boundary, unsigned firstz) { check_load(block, boundary); /* We do a contiguous memory transfer */ size_t boundary_size = K*block->ldz*block->elemsize; unsigned offset = firstz*block->ldz; cl_mem block_data = (cl_mem)block->dev_handle; cl_mem boundary_data = (cl_mem)boundary->dev_handle; cl_command_queue cq; starpu_opencl_get_current_queue(&cq); cl_int ret = clEnqueueCopyBuffer(cq, boundary_data, block_data, 0, offset, boundary_size, 0, NULL, NULL); if (ret != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(ret); } /* * cl_update (OpenCL version) */ static void update_func_opencl(void *descr[], void *arg) { struct block_description *block = arg; int workerid = starpu_worker_get_id_check(); DEBUG( "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); if (block->bz == 0) FPRINTF(stderr,"!!! DO update_func_opencl z %u OPENCL%d !!!\n", block->bz, workerid); else DEBUG( "!!! DO update_func_opencl z %u OPENCL%d !!!\n", block->bz, workerid); #if defined(STARPU_USE_MPI) && !defined(STARPU_SIMGRID) int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, &rank); DEBUG( "!!! RANK %d !!!\n", rank); #endif DEBUG( "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); unsigned block_size_z = get_block_size(block->bz); unsigned i; update_per_worker[workerid]++; record_who_runs_what(block); cl_command_queue cq; starpu_opencl_get_current_queue(&cq); /* * Load neighbours' boundaries : TOP */ /* The offset along the z axis is (block_size_z + K) */ load_subblock_from_buffer_opencl(descr[0], descr[2], block_size_z+K); load_subblock_from_buffer_opencl(descr[1], descr[3], block_size_z+K); /* * Load neighbours' boundaries : BOTTOM */ load_subblock_from_buffer_opencl(descr[0], descr[4], 0); load_subblock_from_buffer_opencl(descr[1], descr[5], 0); /* * Stencils ... do the actual work here :) TODO */ for (i=1; i<=K; i++) { struct starpu_block_interface *oldb = descr[i%2], *newb = descr[(i+1)%2]; TYPE *old = (void*) oldb->dev_handle, *newer = (void*) newb->dev_handle; /* Shadow data */ opencl_shadow_host(block->bz, old, oldb->nx, oldb->ny, oldb->nz, oldb->ldy, oldb->ldz, i); /* And perform actual computation */ #ifdef LIFE opencl_life_update_host(block->bz, old, newer, oldb->nx, oldb->ny, oldb->nz, oldb->ldy, oldb->ldz, i); #else cl_event event; cl_int ret = clEnqueueCopyBuffer(cq, old, newer, 0, 0, oldb->nx * oldb->ny * oldb->nz * sizeof(*newer), 0, NULL, &event); if (ret != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(ret); #endif /* LIFE */ } if (block->bz == 0) starpu_top_update_data_integer(starpu_top_achieved_loop, ++achieved_iter); } #endif /* STARPU_USE_OPENCL */ /* * cl_update (CPU version) */ void update_func_cpu(void *descr[], void *arg) { struct block_description *block = (struct block_description *) arg; int workerid = starpu_worker_get_id_check(); DEBUG( "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); if (block->bz == 0) FPRINTF(stderr,"!!! DO update_func_cpu z %u CPU%d !!!\n", block->bz, workerid); else DEBUG( "!!! DO update_func_cpu z %u CPU%d !!!\n", block->bz, workerid); #if defined(STARPU_USE_MPI) && !defined(STARPU_SIMGRID) int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, &rank); DEBUG( "!!! RANK %d !!!\n", rank); #endif DEBUG( "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); unsigned block_size_z = get_block_size(block->bz); unsigned i; update_per_worker[workerid]++; record_who_runs_what(block); /* * Load neighbours' boundaries : TOP */ /* The offset along the z axis is (block_size_z + K) */ load_subblock_from_buffer_cpu(descr[0], descr[2], block_size_z+K); load_subblock_from_buffer_cpu(descr[1], descr[3], block_size_z+K); /* * Load neighbours' boundaries : BOTTOM */ load_subblock_from_buffer_cpu(descr[0], descr[4], 0); load_subblock_from_buffer_cpu(descr[1], descr[5], 0); /* * Stencils ... do the actual work here :) TODO */ for (i=1; i<=K; i++) { struct starpu_block_interface *oldb = (struct starpu_block_interface *) descr[i%2], *newb = (struct starpu_block_interface *) descr[(i+1)%2]; TYPE *old = (TYPE*) oldb->ptr, *newer = (TYPE*) newb->ptr; /* Shadow data */ unsigned ldy = oldb->ldy, ldz = oldb->ldz; unsigned nx = oldb->nx, ny = oldb->ny, nz = oldb->nz; unsigned x, y, z; unsigned stepx = 1; unsigned stepy = 1; unsigned stepz = 1; unsigned idx = 0; unsigned idy = 0; unsigned idz = 0; TYPE *ptr = old; # include "shadow.h" /* And perform actual computation */ #ifdef LIFE life_update(block->bz, old, newer, oldb->nx, oldb->ny, oldb->nz, oldb->ldy, oldb->ldz, i); #else memcpy(newer, old, oldb->nx * oldb->ny * oldb->nz * sizeof(*newer)); #endif /* LIFE */ } if (block->bz == 0) starpu_top_update_data_integer(starpu_top_achieved_loop, ++achieved_iter); } /* Performance model and codelet structure */ static struct starpu_perfmodel cl_update_model = { .type = STARPU_HISTORY_BASED, .symbol = "cl_update" }; struct starpu_codelet cl_update = { .cpu_funcs = {update_func_cpu}, #ifdef STARPU_USE_CUDA .cuda_funcs = {update_func_cuda}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {update_func_opencl}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .model = &cl_update_model, .nbuffers = 6, .modes = {STARPU_RW, STARPU_RW, STARPU_R, STARPU_R, STARPU_R, STARPU_R} }; /* * Save the block internal boundaries to give them to our neighbours. */ /* CPU version */ static void load_subblock_into_buffer_cpu(void *_block, void *_boundary, unsigned firstz) { struct starpu_block_interface *block = (struct starpu_block_interface *)_block; struct starpu_block_interface *boundary = (struct starpu_block_interface *)_boundary; check_load(block, boundary); /* We do a contiguous memory transfer */ size_t boundary_size = K*block->ldz*block->elemsize; unsigned offset = firstz*block->ldz; TYPE *block_data = (TYPE *)block->ptr; TYPE *boundary_data = (TYPE *)boundary->ptr; memcpy(boundary_data, &block_data[offset], boundary_size); } /* CUDA version */ #ifdef STARPU_USE_CUDA static void load_subblock_into_buffer_cuda(void *_block, void *_boundary, unsigned firstz) { struct starpu_block_interface *block = (struct starpu_block_interface *)_block; struct starpu_block_interface *boundary = (struct starpu_block_interface *)_boundary; check_load(block, boundary); /* We do a contiguous memory transfer */ size_t boundary_size = K*block->ldz*block->elemsize; unsigned offset = firstz*block->ldz; TYPE *block_data = (TYPE *)block->ptr; TYPE *boundary_data = (TYPE *)boundary->ptr; cudaMemcpyAsync(boundary_data, &block_data[offset], boundary_size, cudaMemcpyDeviceToDevice, starpu_cuda_get_local_stream()); } #endif /* STARPU_USE_CUDA */ /* OPENCL version */ #ifdef STARPU_USE_OPENCL static void load_subblock_into_buffer_opencl(struct starpu_block_interface *block, struct starpu_block_interface *boundary, unsigned firstz) { check_load(block, boundary); /* We do a contiguous memory transfer */ size_t boundary_size = K*block->ldz*block->elemsize; unsigned offset = firstz*block->ldz; cl_mem block_data = (cl_mem)block->dev_handle; cl_mem boundary_data = (cl_mem)boundary->dev_handle; cl_command_queue cq; starpu_opencl_get_current_queue(&cq); cl_int ret = clEnqueueCopyBuffer(cq, block_data, boundary_data, offset, 0, boundary_size, 0, NULL, NULL); if (ret != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(ret); } #endif /* STARPU_USE_OPENCL */ /* Record how many top/bottom saves each worker performed */ unsigned top_per_worker[STARPU_NMAXWORKERS]; unsigned bottom_per_worker[STARPU_NMAXWORKERS]; /* top save, CPU version */ void dummy_func_top_cpu(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg) { struct block_description *block = (struct block_description *) arg; int workerid = starpu_worker_get_id_check(); top_per_worker[workerid]++; DEBUG( "DO SAVE Bottom block %d\n", block->bz); /* The offset along the z axis is (block_size_z + K)- K */ unsigned block_size_z = get_block_size(block->bz); load_subblock_into_buffer_cpu(descr[0], descr[2], block_size_z); load_subblock_into_buffer_cpu(descr[1], descr[3], block_size_z); } /* bottom save, CPU version */ void dummy_func_bottom_cpu(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg) { struct block_description *block = (struct block_description *) arg; (void) block; int workerid = starpu_worker_get_id_check(); bottom_per_worker[workerid]++; DEBUG( "DO SAVE Top block %d\n", block->bz); load_subblock_into_buffer_cpu(descr[0], descr[2], K); load_subblock_into_buffer_cpu(descr[1], descr[3], K); } /* top save, CUDA version */ #ifdef STARPU_USE_CUDA static void dummy_func_top_cuda(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg) { struct block_description *block = (struct block_description *) arg; int workerid = starpu_worker_get_id_check(); top_per_worker[workerid]++; DEBUG( "DO SAVE Top block %d\n", block->bz); /* The offset along the z axis is (block_size_z + K)- K */ unsigned block_size_z = get_block_size(block->bz); load_subblock_into_buffer_cuda(descr[0], descr[2], block_size_z); load_subblock_into_buffer_cuda(descr[1], descr[3], block_size_z); } /* bottom save, CUDA version */ static void dummy_func_bottom_cuda(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg) { struct block_description *block = (struct block_description *) arg; (void) block; int workerid = starpu_worker_get_id_check(); bottom_per_worker[workerid]++; DEBUG( "DO SAVE Bottom block %d on CUDA\n", block->bz); load_subblock_into_buffer_cuda(descr[0], descr[2], K); load_subblock_into_buffer_cuda(descr[1], descr[3], K); } #endif /* STARPU_USE_CUDA */ /* top save, OpenCL version */ #ifdef STARPU_USE_OPENCL static void dummy_func_top_opencl(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg) { struct block_description *block = (struct block_description *) arg; (void) block; int workerid = starpu_worker_get_id_check(); top_per_worker[workerid]++; DEBUG( "DO SAVE Top block %d\n", block->bz); /* The offset along the z axis is (block_size_z + K)- K */ unsigned block_size_z = get_block_size(block->bz); load_subblock_into_buffer_opencl(descr[0], descr[2], block_size_z); load_subblock_into_buffer_opencl(descr[1], descr[3], block_size_z); } /* bottom save, OPENCL version */ static void dummy_func_bottom_opencl(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg) { struct block_description *block = (struct block_description *) arg; (void) block; int workerid = starpu_worker_get_id_check(); bottom_per_worker[workerid]++; DEBUG( "DO SAVE Bottom block %d on OPENCL\n", block->bz); load_subblock_into_buffer_opencl(descr[0], descr[2], K); load_subblock_into_buffer_opencl(descr[1], descr[3], K); } #endif /* STARPU_USE_OPENCL */ /* Performance models and codelet for save */ static struct starpu_perfmodel save_cl_bottom_model = { .type = STARPU_HISTORY_BASED, .symbol = "save_cl_bottom" }; static struct starpu_perfmodel save_cl_top_model = { .type = STARPU_HISTORY_BASED, .symbol = "save_cl_top" }; struct starpu_codelet save_cl_bottom = { .cpu_funcs = {dummy_func_bottom_cpu}, #ifdef STARPU_USE_CUDA .cuda_funcs = {dummy_func_bottom_cuda}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {dummy_func_bottom_opencl}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .model = &save_cl_bottom_model, .nbuffers = 4, .modes = {STARPU_R, STARPU_R, STARPU_W, STARPU_W} }; struct starpu_codelet save_cl_top = { .cpu_funcs = {dummy_func_top_cpu}, #ifdef STARPU_USE_CUDA .cuda_funcs = {dummy_func_top_cuda}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {dummy_func_top_opencl}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .model = &save_cl_top_model, .nbuffers = 4, .modes = {STARPU_R, STARPU_R, STARPU_W, STARPU_W} }; starpu-1.2.3+dfsg/examples/stencil/stencil-tasks.c000066400000000000000000000227531320135501600221660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2013-2015, 2017 Université de Bordeaux * Copyright (C) 2012, 2013, 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "stencil.h" #define BIND_LAST 1 /* * Schedule tasks for updates and saves */ /* * NB: iter = 0: initialization phase, TAG_U(z, 0) = TAG_INIT * * dir is -1 or +1. */ #if 0 # define DEBUG(fmt, ...) fprintf(stderr,fmt,##__VA_ARGS__) #else # define DEBUG(fmt, ...) #endif /* * SAVE */ /* R(z) = R(z+d) = local, just call the save kernel */ static void create_task_save_local(unsigned iter, unsigned z, int dir, int local_rank) { struct starpu_task *save_task = starpu_task_create(); struct block_description *descr = get_block_description(z); save_task->cl = (dir == -1)?&save_cl_bottom:&save_cl_top; save_task->cl_arg = descr; /* Saving our border... */ save_task->handles[0] = descr->layers_handle[0]; save_task->handles[1] = descr->layers_handle[1]; /* ... to the neighbour's copy */ struct block_description *neighbour = descr->boundary_blocks[(1+dir)/2]; save_task->handles[2] = neighbour->boundaries_handle[(1-dir)/2][0]; save_task->handles[3] = neighbour->boundaries_handle[(1-dir)/2][1]; /* Bind */ if (iter <= BIND_LAST) save_task->execute_on_a_specific_worker = get_bind_tasks(); save_task->workerid = descr->preferred_worker; int ret = starpu_task_submit(save_task); if (ret) { FPRINTF(stderr, "Could not submit task save: %d\n", ret); if (ret == -ENODEV) exit(77); STARPU_ABORT(); } } /* R(z) = local & R(z+d) != local */ /* We need to send our save over MPI */ static void send_done(void *arg) { uintptr_t z = (uintptr_t) arg; (void) z; DEBUG("DO SEND %d\n", (int)z); } #ifdef STARPU_USE_MPI /* Post MPI send */ static void create_task_save_mpi_send(unsigned iter, unsigned z, int dir, int local_rank) { struct block_description *descr = get_block_description(z); STARPU_ASSERT(descr->mpi_node == local_rank); struct block_description *neighbour = descr->boundary_blocks[(1+dir)/2]; int dest = neighbour->mpi_node; STARPU_ASSERT(neighbour->mpi_node != local_rank); /* Send neighbour's border copy to the neighbour */ starpu_data_handle_t handle0 = neighbour->boundaries_handle[(1-dir)/2][0]; starpu_data_handle_t handle1 = neighbour->boundaries_handle[(1-dir)/2][1]; starpu_mpi_isend_detached(handle0, dest, MPI_TAG0(z, iter, dir), MPI_COMM_WORLD, send_done, (void*)(uintptr_t)z); starpu_mpi_isend_detached(handle1, dest, MPI_TAG1(z, iter, dir), MPI_COMM_WORLD, send_done, (void*)(uintptr_t)z); } /* R(z) != local & R(z+d) = local */ /* We need to receive over MPI */ static void recv_done(void *arg) { uintptr_t z = (uintptr_t) arg; (void) z; DEBUG("DO RECV %d\n", (int)z); } /* Post MPI recv */ static void create_task_save_mpi_recv(unsigned iter, unsigned z, int dir, int local_rank) { struct block_description *descr = get_block_description(z); STARPU_ASSERT(descr->mpi_node != local_rank); struct block_description *neighbour = descr->boundary_blocks[(1+dir)/2]; int source = descr->mpi_node; STARPU_ASSERT(neighbour->mpi_node == local_rank); /* Receive our neighbour's border in our neighbour copy */ starpu_data_handle_t handle0 = neighbour->boundaries_handle[(1-dir)/2][0]; starpu_data_handle_t handle1 = neighbour->boundaries_handle[(1-dir)/2][1]; starpu_mpi_irecv_detached(handle0, source, MPI_TAG0(z, iter, dir), MPI_COMM_WORLD, recv_done, (void*)(uintptr_t)z); starpu_mpi_irecv_detached(handle1, source, MPI_TAG1(z, iter, dir), MPI_COMM_WORLD, recv_done, (void*)(uintptr_t)z); } #endif /* STARPU_USE_MPI */ /* * Schedule saving boundaries of blocks to communication buffers */ void create_task_save(unsigned iter, unsigned z, int dir, int local_rank) { int node_z = get_block_mpi_node(z); int node_z_and_d = get_block_mpi_node(z+dir); #ifdef STARPU_USE_MPI if (node_z == local_rank) { /* Save data from update */ create_task_save_local(iter, z, dir, local_rank); if (node_z_and_d != local_rank) { /* R(z) = local & R(z+d) != local, We have to send the data */ create_task_save_mpi_send(iter, z, dir, local_rank); } } else { /* node_z != local_rank, this MPI node doesn't have the saved data */ if (node_z_and_d == local_rank) { create_task_save_mpi_recv(iter, z, dir, local_rank); } else { /* R(z) != local & R(z+d) != local We don't have the saved data and don't need it, we shouldn't even have been called! */ STARPU_ABORT(); } } #else /* !STARPU_USE_MPI */ STARPU_ASSERT((node_z == local_rank) && (node_z_and_d == local_rank)); create_task_save_local(iter, z, dir, local_rank); #endif /* STARPU_USE_MPI */ } /* * Schedule update computation in computation buffer */ void create_task_update(unsigned iter, unsigned z, int local_rank) { STARPU_ASSERT(iter != 0); struct starpu_task *task = starpu_task_create(); unsigned niter = get_niter(); /* We are going to synchronize with the last tasks */ if (iter == niter) { task->use_tag = 1; task->tag_id = TAG_FINISH(z); } unsigned old_layer = (K*(iter-1)) % 2; unsigned new_layer = (old_layer + 1) % 2; struct block_description *descr = get_block_description(z); task->handles[0] = descr->layers_handle[new_layer]; task->handles[1] = descr->layers_handle[old_layer]; task->handles[2] = descr->boundaries_handle[T][new_layer]; task->handles[3] = descr->boundaries_handle[T][old_layer]; task->handles[4] = descr->boundaries_handle[B][new_layer]; task->handles[5] = descr->boundaries_handle[B][old_layer]; task->cl = &cl_update; task->cl_arg = descr; if (iter <= BIND_LAST) task->execute_on_a_specific_worker = get_bind_tasks(); task->workerid = descr->preferred_worker; int ret = starpu_task_submit(task); if (ret) { FPRINTF(stderr, "Could not submit task update block: %d\n", ret); if (ret == -ENODEV) exit(77); STARPU_ABORT(); } } /* Dummy empty codelet taking one buffer */ void null_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static double null_cost_function(struct starpu_task *task, unsigned nimpl) { (void) task; (void) nimpl; return 0.000001; } static struct starpu_perfmodel null_model = { .type = STARPU_COMMON, .cost_function = null_cost_function, .symbol = "null" }; static struct starpu_codelet null = { .modes = { STARPU_W, STARPU_W }, .cpu_funcs = {null_func}, .cpu_funcs_name = {"null_func"}, .cuda_funcs = {null_func}, .opencl_funcs = {null_func}, .nbuffers = 2, .model = &null_model, .name = "start" }; void create_start_task(int z, int dir) { /* Dumb task depending on the init task and simulating writing the neighbour buffers, to avoid communications and computation running before we start measuring time */ struct starpu_task *wait_init = starpu_task_create(); struct block_description *descr = get_block_description(z); starpu_tag_t tag_init = TAG_INIT_TASK; wait_init->cl = &null; wait_init->use_tag = 1; wait_init->tag_id = TAG_START(z, dir); wait_init->handles[0] = descr->boundaries_handle[(1 + dir) / 2][0]; wait_init->handles[1] = descr->boundaries_handle[(1 + dir) / 2][1]; starpu_tag_declare_deps_array(wait_init->tag_id, 1, &tag_init); int ret = starpu_task_submit(wait_init); if (ret) { FPRINTF(stderr, "Could not submit task initial wait: %d\n", ret); if (ret == -ENODEV) exit(77); STARPU_ABORT(); } } /* * Create all the tasks */ void create_tasks(int rank) { int iter; int bz; int niter = get_niter(); int nbz = get_nbz(); for (bz = 0; bz < nbz; bz++) { if ((get_block_mpi_node(bz) == rank) || (get_block_mpi_node(bz+1) == rank)) create_start_task(bz, +1); if ((get_block_mpi_node(bz) == rank) || (get_block_mpi_node(bz-1) == rank)) create_start_task(bz, -1); } for (iter = 0; iter <= niter; iter++) { starpu_iteration_push(iter); for (bz = 0; bz < nbz; bz++) { if ((iter > 0) && (get_block_mpi_node(bz) == rank)) create_task_update(iter, bz, rank); } for (bz = 0; bz < nbz; bz++) { if (iter != niter) { if ((get_block_mpi_node(bz) == rank) || (get_block_mpi_node(bz+1) == rank)) create_task_save(iter, bz, +1, rank); if ((get_block_mpi_node(bz) == rank) || (get_block_mpi_node(bz-1) == rank)) create_task_save(iter, bz, -1, rank); } } starpu_iteration_pop(); } } /* * Wait for termination */ void wait_end_tasks(int rank) { int bz; int nbz = get_nbz(); for (bz = 0; bz < nbz; bz++) { if (get_block_mpi_node(bz) == rank) { /* Wait for the task producing block "bz" */ starpu_tag_wait(TAG_FINISH(bz)); /* Get the result back to memory */ struct block_description *block = get_block_description(bz); starpu_data_acquire(block->layers_handle[0], STARPU_R); starpu_data_acquire(block->layers_handle[1], STARPU_R); /* the data_acquire here is done to make sure * the data is sent back to the ram memory, we * can safely do a data_release, to avoid the * data_unregister to block later on */ starpu_data_release(block->layers_handle[0]); starpu_data_release(block->layers_handle[1]); } } } starpu-1.2.3+dfsg/examples/stencil/stencil.c000066400000000000000000000224701320135501600210370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012, 2013, 2016 CNRS * Copyright (C) 2010-2012, 2014, 2017 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "stencil.h" /* Main application */ /* default parameter values */ static unsigned bind_tasks = 0; static unsigned ticks = 1000; #ifdef STARPU_QUICK_CHECK static unsigned niter = 4; #define SIZE 16 #else static unsigned niter = 32; #define SIZE 128 #endif /* Problem size */ static unsigned sizex = SIZE; static unsigned sizey = SIZE; static unsigned sizez = 64*SIZE; /* Number of blocks (scattered over the different MPI processes) */ unsigned nbz = 64; /* StarPU top variables */ struct starpu_top_data* starpu_top_init_loop; struct starpu_top_data* starpu_top_achieved_loop; /* * Initialization */ unsigned get_bind_tasks(void) { return bind_tasks; } unsigned get_nbz(void) { return nbz; } unsigned get_niter(void) { return niter; } unsigned get_ticks(void) { return ticks; } static void parse_args(int argc, char **argv) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-b") == 0) { bind_tasks = 1; } if (strcmp(argv[i], "-nbz") == 0) { nbz = atoi(argv[++i]); } if (strcmp(argv[i], "-sizex") == 0) { sizex = atoi(argv[++i]); } if (strcmp(argv[i], "-sizey") == 0) { sizey = atoi(argv[++i]); } if (strcmp(argv[i], "-sizez") == 0) { sizez = atoi(argv[++i]); } if (strcmp(argv[i], "-niter") == 0) { niter = atoi(argv[++i]); } if (strcmp(argv[i], "-ticks") == 0) { ticks = atoi(argv[++i]); } if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) { fprintf(stderr, "Usage : %s [options...]\n", argv[0]); fprintf(stderr, "\n"); fprintf(stderr, "Options:\n"); fprintf(stderr, "-b bind tasks on CPUs/GPUs\n"); fprintf(stderr, "-nbz Number of blocks on Z axis (%u by default)\n", nbz); fprintf(stderr, "-size[xyz] Domain size on x/y/z axis (%ux%ux%u by default)\n", sizex, sizey, sizez); fprintf(stderr, "-niter Number of iterations (%u by default)\n", niter); fprintf(stderr, "-ticks How often to put ticks in the output (ms, %u by default)\n", ticks); exit(0); } } } static void init_problem(int argc, char **argv, int rank, int world_size) { parse_args(argc, argv); if (getenv("STARPU_TOP")) { starpu_top_init_loop = starpu_top_add_data_integer("Task creation iter", 0, niter, 1); starpu_top_achieved_loop = starpu_top_add_data_integer("Task achieved iter", 0, niter, 1); starpu_top_init_and_wait("stencil_top example"); } create_blocks_array(sizex, sizey, sizez, nbz); /* Select the MPI process which should compute the different blocks */ assign_blocks_to_mpi_nodes(world_size); assign_blocks_to_workers(rank); /* Allocate the different memory blocks, if used by the MPI process */ allocate_memory_on_node(rank); display_memory_consumption(rank); who_runs_what_len = 2*niter; who_runs_what = (int *) calloc(nbz * who_runs_what_len, sizeof(*who_runs_what)); who_runs_what_index = (int *) calloc(nbz, sizeof(*who_runs_what_index)); last_tick = (double *) calloc(nbz, sizeof(*last_tick)); } static void free_problem(int rank) { free_memory_on_node(rank); free_blocks_array(); free(who_runs_what); free(who_runs_what_index); free(last_tick); } /* * Main body */ double start; double begin, end; double timing; void f(unsigned task_per_worker[STARPU_NMAXWORKERS]) { unsigned total = 0; int worker; for (worker = 0; worker < STARPU_NMAXWORKERS; worker++) total += task_per_worker[worker]; for (worker = 0; worker < STARPU_NMAXWORKERS; worker++) { if (task_per_worker[worker]) { char name[32]; starpu_worker_get_name(worker, name, sizeof(name)); FPRINTF(stderr,"\t%s -> %u (%2.2f%%)\n", name, task_per_worker[worker], (100.0*task_per_worker[worker])/total); } } } unsigned global_workerid(unsigned local_workerid) { #ifdef STARPU_USE_MPI int rank; MPI_Comm_rank(MPI_COMM_WORLD, &rank); unsigned workers_per_node = starpu_worker_get_count(); return (local_workerid + rank*workers_per_node); #else return local_workerid; #endif } int main(int argc, char **argv) { int rank; int world_size; int ret; #if defined(STARPU_USE_MPI) && !defined(STARPU_SIMGRID) int thread_support; if (MPI_Init_thread(&argc, &argv, MPI_THREAD_SERIALIZED, &thread_support)) { FPRINTF(stderr, "MPI_Init_thread failed\n"); } if (thread_support == MPI_THREAD_FUNNELED) FPRINTF(stderr,"Warning: MPI only has funneled thread support, not serialized, hoping this will work\n"); if (thread_support < MPI_THREAD_FUNNELED) FPRINTF(stderr,"Warning: MPI does not have thread support!\n"); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &world_size); #else rank = 0; world_size = 1; #endif if (rank == 0) { FPRINTF(stderr, "Running on %d nodes\n", world_size); fflush(stderr); } ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #if defined(STARPU_USE_MPI) && !defined(STARPU_SIMGRID) ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #endif #ifdef STARPU_USE_OPENCL opencl_life_init(); opencl_shadow_init(); #endif /*STARPU_USE_OPENCL*/ init_problem(argc, argv, rank, world_size); create_tasks(rank); #if defined(STARPU_USE_MPI) && !defined(STARPU_SIMGRID) int barrier_ret = MPI_Barrier(MPI_COMM_WORLD); STARPU_ASSERT(barrier_ret == MPI_SUCCESS); #endif if (rank == 0) FPRINTF(stderr, "GO !\n"); start = starpu_timing_now(); begin = starpu_timing_now(); starpu_tag_notify_from_apps(TAG_INIT_TASK); wait_end_tasks(rank); end = starpu_timing_now(); #if defined(STARPU_USE_MPI) && !defined(STARPU_SIMGRID) barrier_ret = MPI_Barrier(MPI_COMM_WORLD); STARPU_ASSERT(barrier_ret == MPI_SUCCESS); #endif #if 0 check(rank); #endif /*display_debug(nbz, niter, rank);*/ #if defined(STARPU_USE_MPI) && !defined(STARPU_SIMGRID) starpu_mpi_shutdown(); #endif /* timing in us */ timing = end - begin; double min_timing = timing; double max_timing = timing; double sum_timing = timing; #if defined(STARPU_USE_MPI) && !defined(STARPU_SIMGRID) int reduce_ret; reduce_ret = MPI_Reduce(&timing, &min_timing, 1, MPI_DOUBLE, MPI_MIN, 0, MPI_COMM_WORLD); STARPU_ASSERT(reduce_ret == MPI_SUCCESS); reduce_ret = MPI_Reduce(&timing, &max_timing, 1, MPI_DOUBLE, MPI_MAX, 0, MPI_COMM_WORLD); STARPU_ASSERT(reduce_ret == MPI_SUCCESS); reduce_ret = MPI_Reduce(&timing, &sum_timing, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); STARPU_ASSERT(reduce_ret == MPI_SUCCESS); /* XXX we should do a gather instead, here we assume that non initialized values are still 0 */ int *who_runs_what_tmp = malloc(nbz * who_runs_what_len * sizeof(*who_runs_what)); reduce_ret = MPI_Reduce(who_runs_what, who_runs_what_tmp, nbz * who_runs_what_len, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); STARPU_ASSERT(reduce_ret == MPI_SUCCESS); memcpy(who_runs_what, who_runs_what_tmp, nbz * who_runs_what_len * sizeof(*who_runs_what)); free(who_runs_what_tmp); /* XXX we should do a gather instead, here we assume that non initialized values are still 0 */ int *who_runs_what_index_tmp = malloc(nbz * sizeof(*who_runs_what_index)); reduce_ret = MPI_Reduce(who_runs_what_index, who_runs_what_index_tmp, nbz, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); STARPU_ASSERT(reduce_ret == MPI_SUCCESS); memcpy(who_runs_what_index, who_runs_what_index_tmp, nbz * sizeof(*who_runs_what_index)); free(who_runs_what_index_tmp); #endif if (rank == 0) { #if 1 FPRINTF(stderr, "update:\n"); f(update_per_worker); FPRINTF(stderr, "top:\n"); f(top_per_worker); FPRINTF(stderr, "bottom:\n"); f(bottom_per_worker); #endif #if 1 unsigned nzblocks_per_process = (nbz + world_size - 1) / world_size; int iter; for (iter = 0; iter < who_runs_what_len; iter++) { starpu_iteration_push(iter); unsigned last, bz; last = 1; for (bz = 0; bz < nbz; bz++) { if ((bz % nzblocks_per_process) == 0) FPRINTF(stderr, "| "); if (who_runs_what_index[bz] <= iter) FPRINTF(stderr,"_ "); else { last = 0; if (who_runs_what[bz + iter * nbz] == -1) FPRINTF(stderr,"* "); else FPRINTF(stderr, "%d ", who_runs_what[bz + iter * nbz]); } } FPRINTF(stderr, "\n"); starpu_iteration_pop(); if (last) break; } #endif fflush(stderr); FPRINTF(stdout, "Computation took: %f ms on %d MPI processes\n", max_timing/1000, world_size); FPRINTF(stdout, "\tMIN : %f ms\n", min_timing/1000); FPRINTF(stdout, "\tMAX : %f ms\n", max_timing/1000); FPRINTF(stdout, "\tAVG : %f ms\n", sum_timing/(world_size*1000)); } free_problem(rank); starpu_shutdown(); #if defined(STARPU_USE_MPI) && !defined(STARPU_SIMGRID) MPI_Finalize(); #endif #ifdef STARPU_USE_OPENCL opencl_life_free(); opencl_shadow_free(); #endif /*STARPU_USE_OPENCL*/ return 0; } starpu-1.2.3+dfsg/examples/stencil/stencil.h000066400000000000000000000106751320135501600210500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012, 2013 CNRS * Copyright (C) 2010-2011, 2014 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STENCIL_H__ #define __STENCIL_H__ #include #include #include #ifndef __CUDACC__ #ifdef STARPU_USE_MPI #include #include #endif #endif #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #define LIFE #ifdef LIFE #define TYPE unsigned char extern void life_update(int bz, const TYPE *old, TYPE *newp, int nx, int ny, int nz, int ldy, int ldz, int iter); #else #define TYPE float #endif #define K 1 #define NDIRS 2 extern struct starpu_top_data* starpu_top_init_loop; extern struct starpu_top_data* starpu_top_achieved_loop; /* Split only on the z axis to make things simple */ typedef enum { B = 0, T = 1 } direction; /* Description of a domain block */ struct block_description { /* Which MPI node should process that block ? */ int mpi_node; unsigned preferred_worker; unsigned bz; /* For each of the following buffers, there are two (0/1) buffers to * make new/old switch costless. */ /* This is the computation buffer for this block, it includes * neighbours' border to make computation easier */ TYPE *layers[2]; starpu_data_handle_t layers_handle[2]; /* This is the "save" buffer, i.e. a copy of our neighbour's border. * This one is used for CPU/GPU or MPI communication (rather than the * whole domain block) */ TYPE *boundaries[NDIRS][2]; starpu_data_handle_t boundaries_handle[NDIRS][2]; /* Shortcut pointer to the neighbours */ struct block_description *boundary_blocks[NDIRS]; }; #define TAG_INIT_TASK ((starpu_tag_t)1) starpu_tag_t TAG_FINISH(int z); starpu_tag_t TAG_START(int z, int dir); int MPI_TAG0(int z, int iter, int dir); int MPI_TAG1(int z, int iter, int dir); #define MIN(a,b) ((a)<(b)?(a):(b)) void create_blocks_array(unsigned sizex, unsigned sizey, unsigned sizez, unsigned nbz); void free_blocks_array(); struct block_description *get_block_description(int z); void assign_blocks_to_mpi_nodes(int world_size); void allocate_memory_on_node(int rank); void assign_blocks_to_workers(int rank); void create_tasks(int rank); void wait_end_tasks(int rank); void check(int rank); void free_memory_on_node(int rank); void display_memory_consumption(int rank); int get_block_mpi_node(int z); unsigned get_block_size(int z); unsigned get_bind_tasks(void); unsigned get_nbz(void); unsigned get_niter(void); unsigned get_ticks(void); unsigned global_workerid(unsigned local_workerid); void create_task_update(unsigned iter, unsigned z, int local_rank); void create_task_save(unsigned iter, unsigned z, int dir, int local_rank); extern int starpu_mpi_initialize(void); extern int starpu_mpi_shutdown(void); /* kernels */ extern struct starpu_codelet cl_update; extern struct starpu_codelet save_cl_bottom; extern struct starpu_codelet save_cl_top; extern unsigned update_per_worker[STARPU_NMAXWORKERS]; extern unsigned top_per_worker[STARPU_NMAXWORKERS]; extern unsigned bottom_per_worker[STARPU_NMAXWORKERS]; extern double start; extern int who_runs_what_len; extern int *who_runs_what; extern int *who_runs_what_index; extern double *last_tick; #ifndef _externC #define _externC #endif _externC void cuda_life_update_host(int bz, const TYPE *old, TYPE *newp, int nx, int ny, int nz, int ldy, int ldz, int iter); _externC void cuda_shadow_host(int bz, TYPE *ptr, int nx, int ny, int nz, int ldy, int ldz, int i); _externC void opencl_shadow_init(void); _externC void opencl_shadow_free(void); _externC void opencl_shadow_host(int bz, TYPE *ptr, int nx, int ny, int nz, int ldy, int ldz, int i); _externC void opencl_life_init(void); _externC void opencl_life_free(void); _externC void opencl_life_update_host(int bz, const TYPE *old, TYPE *newp, int nx, int ny, int nz, int ldy, int ldz, int iter); #endif /* __STENCIL_H__ */ starpu-1.2.3+dfsg/examples/tag_example/000077500000000000000000000000001320135501600200525ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/tag_example/tag_example.c000066400000000000000000000127611320135501600225130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2010, 2012-2013, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* This example shows how to use tags to define a grid of dependencies, shaped this way: * * ... ... * v v * ... -> task (i, j) --> task (i, j+1) --> ... * v v * ... -> task (i+1,j) --> task (i+1,j+1) --> ... * v v * ... ... */ #include #include #include #include #include #ifdef STARPU_HAVE_HELGRIND_H #include #endif #ifndef ANNOTATE_HAPPENS_BEFORE #define ANNOTATE_HAPPENS_BEFORE(obj) ((void)0) #endif #ifndef ANNOTATE_HAPPENS_AFTER #define ANNOTATE_HAPPENS_AFTER(obj) ((void)0) #endif #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #define TAG(i, j, iter) ((starpu_tag_t) ( ((uint64_t)(iter)<<48) | ((uint64_t)(j)<<24) | (i)) ) struct starpu_codelet cl; #ifdef STARPU_QUICK_CHECK #define Ni 32 #define Nj 32 #define Nk 32 #else #define Ni 64 #define Nj 32 #define Nk 128 #endif static unsigned ni = Ni, nj = Nj, nk = Nk; static unsigned callback_cnt; static unsigned iter = 0; static void parse_args(int argc, char **argv) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-iter") == 0) { char *argptr; nk = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-i") == 0) { char *argptr; ni = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-j") == 0) { char *argptr; nj = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-h") == 0) { printf("usage : %s [-iter iter] [-i i] [-j j]\n", argv[0]); } } } void callback_cpu(void *argcb); static void express_deps(unsigned i, unsigned j, unsigned iter); static void tag_cleanup_grid(unsigned piter) { unsigned i,j; for (j = 0; j < nj; j++) for (i = 0; i < ni; i++) { starpu_tag_remove(TAG(i,j,piter)); } } static int create_task_grid(unsigned piter) { unsigned i, j; int ret; /* FPRINTF(stderr, "start iter %d...\n", piter); */ callback_cnt = (ni*nj); /* create non-entry tasks */ for (j = 0; j < nj; j++) for (i = 1; i < ni; i++) { /* create a new task */ struct starpu_task *task = starpu_task_create(); task->callback_func = callback_cpu; /* jb->argcb = &coords[i][j]; */ task->cl = &cl; task->cl_arg = NULL; task->use_tag = 1; task->tag_id = TAG(i, j, piter); /* express deps : (i,j) depends on (i-1, j-1) & (i-1, j+1) */ express_deps(i, j, piter); ret = starpu_task_submit(task); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } /* create entry tasks */ for (j = 0; j < nj; j++) { /* create a new task */ struct starpu_task *task = starpu_task_create(); task->callback_func = callback_cpu; task->cl = &cl; task->cl_arg = NULL; task->use_tag = 1; /* this is an entry task */ task->tag_id = TAG(0, j, piter); ret = starpu_task_submit(task); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } return 0; } void callback_cpu(void *argcb STARPU_ATTRIBUTE_UNUSED) { unsigned newcnt = STARPU_ATOMIC_ADD(&callback_cnt, -1); ANNOTATE_HAPPENS_BEFORE(&callback_cnt); if (newcnt == 0) { ANNOTATE_HAPPENS_AFTER(&callback_cnt); if (++iter < nk) { /* cleanup old grids ... */ if (iter > 2) tag_cleanup_grid(iter-2); /* create a new iteration */ create_task_grid(iter); } } } void cpu_codelet(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *_args STARPU_ATTRIBUTE_UNUSED) { /* printf("execute task\n"); */ } static void express_deps(unsigned i, unsigned j, unsigned piter) { if (j > 0) { /* (i,j-1) exists */ if (j < nj - 1) { /* (i,j+1) exists */ starpu_tag_declare_deps(TAG(i,j,piter), 2, TAG(i-1,j-1,piter), TAG(i-1,j+1,piter)); } else { /* (i,j+1) does not exist */ starpu_tag_declare_deps(TAG(i,j,piter), 1, TAG(i-1,j-1,piter)); } } else { /* (i, (j-1) does not exist */ if (j < nj - 1) { /* (i,j+1) exists */ starpu_tag_declare_deps(TAG(i,j,piter), 1, TAG(i-1,j+1,piter)); } else { /* (i,j+1) does not exist */ STARPU_ABORT(); } } } int main(int argc STARPU_ATTRIBUTE_UNUSED , char **argv STARPU_ATTRIBUTE_UNUSED) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) exit(77); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); parse_args(argc, argv); FPRINTF(stderr, "ITER: %u\n", nk); starpu_codelet_init(&cl); cl.cpu_funcs[0] = cpu_codelet; cl.cpu_funcs_name[0] = "cpu_codelet"; cl.cuda_funcs[0] = cpu_codelet; cl.opencl_funcs[0] = cpu_codelet; cl.nbuffers = 0; cl.name = "dummy"; ret = create_task_grid(0); if (ret == 0) starpu_task_wait_for_all(); tag_cleanup_grid(nk-2); tag_cleanup_grid(nk-1); starpu_shutdown(); FPRINTF(stderr, "TEST DONE ...\n"); return ret; } starpu-1.2.3+dfsg/examples/tag_example/tag_example2.c000066400000000000000000000064441320135501600225760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2012-2013, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* This example shows how to submit a series of tasks in a chain of dependency: * * ... -> task (i) --> task (i+1) --> ... * * This is repeated several times */ #include #include #include #include #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #define TAG(i, iter) ((starpu_tag_t) (((uint64_t)iter)<<32 | (i)) ) struct starpu_codelet cl; #define Ni 64 #define Nk 256 static unsigned ni = Ni, nk = Nk; static void parse_args(int argc, char **argv) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-iter") == 0) { char *argptr; nk = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-i") == 0) { char *argptr; ni = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-h") == 0) { printf("usage : %s [-iter iter] [-i i]\n", argv[0]); } } } void callback_cpu(void *argcb); static void tag_cleanup_grid(unsigned iter) { unsigned i; for (i = 0; i < ni; i++) starpu_tag_remove(TAG(i,iter)); } static int create_task_grid(unsigned iter) { unsigned i; /* FPRINTF(stderr, "start iter %d ni %d...\n", iter, ni); */ for (i = 0; i < ni; i++) { int ret; /* create a new task */ struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->cl_arg = NULL; task->use_tag = 1; task->tag_id = TAG(i, iter); if (i != 0) starpu_tag_declare_deps(TAG(i,iter), 1, TAG(i-1,iter)); ret = starpu_task_submit(task); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } return 0; } void cpu_codelet(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *_args STARPU_ATTRIBUTE_UNUSED) { } int main(int argc STARPU_ATTRIBUTE_UNUSED , char **argv STARPU_ATTRIBUTE_UNUSED) { unsigned i; int ret; ret = starpu_init(NULL); if (ret == -ENODEV) exit(77); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_QUICK_CHECK ni /= 4; nk /= 16; #endif parse_args(argc, argv); starpu_codelet_init(&cl); cl.cpu_funcs[0] = cpu_codelet; cl.cpu_funcs_name[0] = "cpu_codelet"; cl.cuda_funcs[0] = cpu_codelet; cl.opencl_funcs[0] = cpu_codelet; cl.nbuffers = 0; cl.name = "dummy"; FPRINTF(stderr, "ITER : %u\n", nk); for (i = 0; i < nk; i++) { ret = create_task_grid(i); if (ret == 77) goto enodev; starpu_tag_wait(TAG(ni-1, i)); /* cleanup old grids ... */ if (i > 1) tag_cleanup_grid(i-1); } starpu_task_wait_for_all(); enodev: tag_cleanup_grid(nk-1); starpu_shutdown(); FPRINTF(stderr, "TEST DONE ...\n"); return ret; } starpu-1.2.3+dfsg/examples/tag_example/tag_example3.c000066400000000000000000000064261320135501600225770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2012-2013, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* This example shows how to submit a series of tasks in a chain of dependency: * * ... -> task (i) --> task (i+1) --> ... * * but here submitted in reverse order. * * This is repeated several times */ #include #include #include #include #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #define TAG(i, iter) ((starpu_tag_t) (((uint64_t)iter)<<32 | (i)) ) struct starpu_codelet cl; #define Ni 64 #define Nk 256 static unsigned ni = Ni, nk = Nk; static void parse_args(int argc, char **argv) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-iter") == 0) { char *argptr; nk = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-i") == 0) { char *argptr; ni = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-h") == 0) { printf("usage : %s [-iter iter] [-i i]\n", argv[0]); } } } void callback_cpu(void *argcb); static void tag_cleanup_grid(unsigned iter) { unsigned i; for (i = 0; i < ni; i++) starpu_tag_remove(TAG(i,iter)); } static int create_task_grid(unsigned iter) { int i; /* FPRINTF(stderr, "start iter %d ni %d...\n", iter, ni); */ for (i = ni - 1; i > 0; i--) { int ret; /* create a new task */ struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->cl_arg = NULL; task->use_tag = 1; task->tag_id = TAG(i, iter); if (i != 1) starpu_tag_declare_deps(TAG(i,iter), 1, TAG(i-1,iter)); ret = starpu_task_submit(task); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } return 0; } void cpu_codelet(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *_args STARPU_ATTRIBUTE_UNUSED) { } int main(int argc STARPU_ATTRIBUTE_UNUSED , char **argv STARPU_ATTRIBUTE_UNUSED) { unsigned i; int ret; ret = starpu_init(NULL); if (ret == -ENODEV) exit(77); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_QUICK_CHECK ni /= 4; nk /= 16; #endif parse_args(argc, argv); starpu_codelet_init(&cl); cl.cpu_funcs[0] = cpu_codelet; cl.cpu_funcs_name[0] = "cpu_codelet"; cl.cuda_funcs[0] = cpu_codelet; cl.opencl_funcs[0] = cpu_codelet; cl.nbuffers = 0; cl.name = "dummy"; FPRINTF(stderr, "ITER : %u\n", nk); for (i = 0; i < nk; i++) { ret = create_task_grid(i); if (ret == 77) goto enodev; starpu_tag_wait(TAG(ni-1, i)); /* cleanup old grids ... */ if (i > 1) tag_cleanup_grid(i-1); } enodev: starpu_shutdown(); FPRINTF(stderr, "TEST DONE ...\n"); return ret; } starpu-1.2.3+dfsg/examples/tag_example/tag_example4.c000066400000000000000000000070421320135501600225730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2012-2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* This example shows how to make a task depend on either of a series of tasks. * * For each i, we submit i tasks of type A, which fill the i-th variable, and i * tasks of type B, which check that the i-th variable is filled. Thanks to * tag dependency, B tasks are scheduled as soon as one of the corresponding A * task is finished. */ #include #include #include #include #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #define TAG(i, iter) ((starpu_tag_t) (((uint64_t)i)<<32 | (iter)) ) void cpu_codelet_A(void *descr[], void *_args) { int *arg = _args; *arg = 1; fprintf(stderr,"A"); } void cpu_codelet_B(void *descr[], void *_args) { int *arg = _args; if (*arg != 1) exit(EXIT_FAILURE); fprintf(stderr,"B"); } struct starpu_codelet cl_A = { .cpu_funcs = { cpu_codelet_A}, .cuda_funcs = { cpu_codelet_A}, .opencl_funcs = { cpu_codelet_A}, .nbuffers = 0, .name = "dummyA" }; struct starpu_codelet cl_B = { .cpu_funcs = { cpu_codelet_B}, .cuda_funcs = { cpu_codelet_B}, .opencl_funcs = { cpu_codelet_B}, .nbuffers = 0, .name = "dummyB" }; #define Ni 64 static unsigned ni = Ni; static void parse_args(int argc, char **argv) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-iter") == 0) { char *argptr; ni = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-h") == 0) { printf("usage : %s [-iter iter]\n", argv[0]); } } } int main(int argc STARPU_ATTRIBUTE_UNUSED , char **argv STARPU_ATTRIBUTE_UNUSED) { unsigned i, j; int ret; ret = starpu_init(NULL); if (ret == -ENODEV) exit(77); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); parse_args(argc, argv); FPRINTF(stderr, "ITER : %u\n", ni); { int array[ni]; memset(array, 0, sizeof(array)); for (i = 1; i < ni; i++) { for (j = 1; j < i; j++) { struct starpu_task *task_A = starpu_task_create(); task_A->cl = &cl_A; task_A->cl_arg = &array[i]; task_A->use_tag = 1; task_A->tag_id = TAG(0, i); ret = starpu_task_submit(task_A); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } for (j = 1; j < i; j++) { struct starpu_task *task_B = starpu_task_create(); task_B->cl = &cl_B; task_B->cl_arg = &array[i]; task_B->use_tag = 1; task_B->tag_id = TAG(j, i); starpu_tag_declare_deps(TAG(j, i), 1, TAG(0, i)); ret = starpu_task_submit(task_B); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } starpu_task_wait_for_all(); } for (i = 1; i < ni; i++) { for (j = 0; j < i; j++) starpu_tag_remove(TAG(j, i)); } enodev: starpu_shutdown(); FPRINTF(stderr, "TEST DONE ...\n"); if (ret == -ENODEV) return 77; else return 0; } starpu-1.2.3+dfsg/examples/tag_example/tag_restartable.c000066400000000000000000000102631320135501600233630ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2013, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This example shows how to reuse a tag. * We define a series of dependency chains, shaped this way: * * ... ... * v v * ... task (i, j) task (i, j+1) ... * v v * ... task (i+1,j) task (i+1,j+1) ... * v v * ... ... * * And this grid is used several times, by waiting for the completion of a * chain before starting it over. */ #include #include #include #include #include #include #include #define Nrolls 4 #define SLEEP 1 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #define TAG(i, iter) ((starpu_tag_t) (((uint64_t)((iter)%Nrolls))<<32 | (i)) ) struct starpu_codelet cl; #define Ni 64 #define Nk 256 static unsigned ni = Ni, nk = Nk; struct starpu_task **tasks[Nrolls]; static void parse_args(int argc, char **argv) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-iter") == 0) { char *argptr; nk = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-i") == 0) { char *argptr; ni = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-h") == 0) { printf("usage : %s [-iter iter] [-i i]\n", argv[0]); } } } void callback_cpu(void *argcb); static void create_task_grid(unsigned iter) { unsigned i; FPRINTF(stderr, "init iter %u ni %u...\n", iter, ni); for (i = 0; i < ni; i++) { /* create a new task */ struct starpu_task *task = tasks[iter][i] = starpu_task_create(); task->cl = &cl; /* task->cl_arg = (void*)(uintptr_t) (i | (iter << 16)); */ task->use_tag = 1; task->tag_id = TAG(i, iter); task->detach = 1; task->destroy = 0; if (i != 0) starpu_tag_declare_deps(TAG(i,iter), 1, TAG(i-1,iter)); } } static int start_task_grid(unsigned iter) { unsigned i; /* FPRINTF(stderr, "start grid %d ni %d...\n", iter, ni); */ for (i = 0; i < ni; i++) { int ret; ret = starpu_task_submit(tasks[iter][i]); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } return 0; } void cpu_codelet(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *_args STARPU_ATTRIBUTE_UNUSED) { /* int i = (uintptr_t) _args; printf("doing %x\n", i); usleep(SLEEP); printf("done %x\n", i); */ } int main(int argc STARPU_ATTRIBUTE_UNUSED , char **argv STARPU_ATTRIBUTE_UNUSED) { unsigned i, j; int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_QUICK_CHECK ni /= 4; nk /= 16; #endif parse_args(argc, argv); starpu_codelet_init(&cl); cl.cpu_funcs[0] = cpu_codelet; cl.cpu_funcs_name[0] = "cpu_codelet"; cl.cuda_funcs[0] = cpu_codelet; cl.opencl_funcs[0] = cpu_codelet; cl.nbuffers = 0; cl.name = "dummy"; FPRINTF(stderr, "ITER : %u\n", nk); for (i = 0; i < Nrolls; i++) { tasks[i] = (struct starpu_task **) malloc(ni * sizeof(*tasks[i])); create_task_grid(i); } for (i = 0; i < nk; i++) { ret = start_task_grid(i % Nrolls); if (ret == 77) goto enodev; if (i+1 >= Nrolls) /* Wait before re-using same tasks & tags */ starpu_tag_wait(TAG(ni-1, i + 1)); } starpu_shutdown(); FPRINTF(stderr, "TEST DONE ...\n"); enodev: for (i = 0; i < Nrolls; i++) { for (j = 0; j < ni; j++) starpu_task_destroy(tasks[i][j]); free(tasks[i]); } return ret; } starpu-1.2.3+dfsg/examples/top/000077500000000000000000000000001320135501600163665ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/top/hello_world_top.c000066400000000000000000000157471320135501600217440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This examples demonstrates how to construct and submit a task to StarPU and * more precisely: * - how to allocate a new task structure (starpu_task_create) * - how to describe a multi-versionned computational kernel (ie. a codelet) * - how to pass an argument to the codelet (task->cl_arg) * - how to declare a callback function that is called once the task has been * executed * - how to specify if starpu_task_submit is a blocking or non-blocking * operation (task->synchronous) */ #include #include #include #include #include /* Example of enum param */ char* names[] = {"Paul", "Jean", "Jaques", "Alain", "Brian"}; int names_len = 5; int name_selected=2; //must be between 0 and names_len-1 /* Exemple of int param */ int number_of_addition = 30; /* Exemple of bool param */ int stop_after_5_task = 0; /* When the task is done, task->callback_func(task->callback_arg) is called. Any * callback function must have the prototype void (*)(void *). * NB: Callback are NOT allowed to perform potentially blocking operations */ void callback_func(void *callback_arg) { printf("Callback function got argument %p\n", callback_arg); } /* Every implementation of a codelet must have this prototype, the first * argument (buffers) describes the buffers/streams that are managed by the * DSM; the second arguments references read-only data that is passed as an * argument of the codelet (task->cl_arg). Here, "buffers" is unused as there * are no data input/output managed by the DSM (cl.nbuffers = 0) */ struct params { int i; float f; }; void cpu_func(void *buffers[], void *cl_arg) { struct params *params = (struct params *) cl_arg; //loosing time for top example... int sum = 0; int i = 0; while(ii, params->f, sum); } void callback_name_changed(struct starpu_top_param* param) { char* message = (char *) malloc(256); sprintf(message, "Name have been changed to %s", names[name_selected]); starpu_top_debug_log(message); free(message); } void callback_number_addition_changed(struct starpu_top_param* param) { char* message = (char *) malloc(256); sprintf(message, "Number of addition is now %d", number_of_addition); starpu_top_debug_log(message); free(message); } struct starpu_codelet cl = { /* this codelet may only be executed on a CPU, and its cpu * implementation is function "cpu_func" */ .cpu_funcs = {cpu_func}, /* the codelet does not manipulate any data that is managed * by our DSM */ .nbuffers = 0 }; int main(int argc, char **argv) { int ret; srand ( time(NULL) ); /* initialize StarPU : passing a NULL argument means that we use * default configuration for the scheduling policies and the number of * processors/accelerators */ ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /*init starpu_top*/ struct starpu_top_data * loop_count = starpu_top_add_data_integer("Loop count", 0,124,1); struct starpu_top_data * remain_count = starpu_top_add_data_integer("Remaining loop", 0,124,1); struct starpu_top_data * midle_reach = starpu_top_add_data_boolean("Midle reached", 1); struct starpu_top_param* name = starpu_top_register_parameter_enum("Your name : ", &name_selected, names, names_len, callback_name_changed); struct starpu_top_param * number_of_addition_param = starpu_top_register_parameter_integer("Number of Millions of addition", &number_of_addition, 0, 50, callback_number_addition_changed); STARPU_ASSERT(number_of_addition_param != NULL); struct starpu_top_param * stop5_param = starpu_top_register_parameter_boolean("Stop after 5 task ?", &stop_after_5_task, NULL); STARPU_ASSERT(stop5_param != NULL); //all parameters are initialized, we can connect to UI starpu_top_init_and_wait("Serveur de test HelloWorld"); //set "default value" starpu_top_update_data_boolean(midle_reach, 0); /* create a new task that is non-blocking by default : the task is not * submitted to the scheduler until the starpu_task_submit function is * called */ /* * For this simple example, we make 124 iter */ struct starpu_task *task[124]; int i; for(i=0; i<124; i++) { starpu_top_update_data_integer(loop_count, i); starpu_top_update_data_integer(remain_count, 124-i); if(i==62) { starpu_top_update_data_boolean(midle_reach, 1); } if(i==25) { //changing name name_selected = 1; starpu_top_update_parameter(name); } if(i>4 && stop_after_5_task) { break; } task[i]=starpu_task_create(); /* the task uses codelet "cl" */ task[i]->cl = &cl; /* It is possible to pass buffers that are not managed by the DSM to the * kernels: the second argument of the "cpu_func" function is a pointer to a * buffer that contains information for the codelet (cl_arg stands for * codelet argument). In the case of accelerators, it is possible that * the codelet is given a pointer to a copy of that buffer: this buffer * is read-only so that any modification is not passed to other copies * of the buffer. For this reason, a buffer passed as a codelet * argument (cl_arg) is NOT a valid synchronization medium! */ struct params params = { i, 2.0f }; task[i]->cl_arg = ¶ms; task[i]->cl_arg_size = sizeof(params); /* once the task has been executed, callback_func(0x42) * will be called on a CPU */ task[i]->callback_func = callback_func; task[i]->callback_arg = (void*) (uintptr_t) 0x42; /* starpu_task_submit will be a blocking call */ task[i]->synchronous = 1; /* submit the task to StarPU */ if(number_of_addition==42) starpu_top_debug_lock("debug stop point because of 42 !"); ret = starpu_task_submit(task[i]); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } /* terminate StarPU: statistics and other debug outputs are not * guaranteed to be generated unless this function is called. Once it * is called, it is not possible to submit tasks anymore, and the user * is responsible for making sure all tasks have already been executed: * calling starpu_shutdown() before the termination of all the tasks * results in an undefined behaviour */ starpu_shutdown(); return 0; } starpu-1.2.3+dfsg/examples/worker_collections/000077500000000000000000000000001320135501600214735ustar00rootroot00000000000000starpu-1.2.3+dfsg/examples/worker_collections/worker_list_example.c000066400000000000000000000047331320135501600257250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2015 Université de Bordeaux * Copyright (C) 2010-2014, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This shows how to manipulate worker lists. */ #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) int main() { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); int procs[STARPU_NMAXWORKERS]; unsigned ncpus = starpu_cpu_worker_get_count(); starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, procs, ncpus); struct starpu_worker_collection *co = (struct starpu_worker_collection*)malloc(sizeof(struct starpu_worker_collection)); co->has_next = worker_list.has_next; co->get_next = worker_list.get_next; co->add = worker_list.add; co->remove = worker_list.remove; co->init = worker_list.init; co->deinit = worker_list.deinit; co->init_iterator = worker_list.init_iterator; co->type = STARPU_WORKER_LIST; FPRINTF(stderr, "ncpus %u\n", ncpus); double start_time; double end_time; start_time = starpu_timing_now(); co->init(co); end_time = starpu_timing_now(); double timing = (end_time - start_time) / 1000; unsigned i; for(i = 0; i < ncpus; i++) { int added = co->add(co, procs[i]); FPRINTF(stderr, "added proc %d to the tree \n", added); } struct starpu_sched_ctx_iterator it; int pu; co->init_iterator(co, &it); while(co->has_next(co, &it)) { pu = co->get_next(co, &it); FPRINTF(stderr, "pu = %d out of %u workers \n", pu, co->nworkers); } for(i = 0; i < 6; i++) { co->remove(co, i); FPRINTF(stderr, "remove %u out of %u workers\n", i, co->nworkers); } while(co->has_next(co, &it)) { pu = co->get_next(co, &it); FPRINTF(stderr, "pu = %d out of %u workers\n", pu, co->nworkers); } FPRINTF(stderr, "timing init = %lf \n", timing); co->deinit(co); free(co); starpu_shutdown(); return 0; } starpu-1.2.3+dfsg/examples/worker_collections/worker_tree_example.c000066400000000000000000000052371320135501600257110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2016 Université de Bordeaux * Copyright (C) 2010-2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This shows how to manipulate worker trees. */ #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #if !defined(STARPU_HAVE_HWLOC) #warning hwloc is not enabled. Skipping test int main(int argc, char **argv) { return 77; } #else int main() { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); int procs[STARPU_NMAXWORKERS]; unsigned ncpus = starpu_cpu_worker_get_count(); starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, procs, ncpus); struct starpu_worker_collection *co = (struct starpu_worker_collection*)calloc(1, sizeof(struct starpu_worker_collection)); co->has_next = worker_tree.has_next; co->get_next = worker_tree.get_next; co->add = worker_tree.add; co->remove = worker_tree.remove; co->init = worker_tree.init; co->deinit = worker_tree.deinit; co->init_iterator = worker_tree.init_iterator; co->type = STARPU_WORKER_TREE; FPRINTF(stderr, "ncpus %u \n", ncpus); double start_time; double end_time; start_time = starpu_timing_now(); co->init(co); end_time = starpu_timing_now(); double timing = (end_time - start_time) / 1000; unsigned i; for(i = 0; i < ncpus; i++) { int added = co->add(co, procs[i]); FPRINTF(stderr, "added proc %d to the tree \n", added); } struct starpu_sched_ctx_iterator it; int pu; co->init_iterator(co, &it); while(co->has_next(co, &it)) { pu = co->get_next(co, &it); FPRINTF(stderr, "pu = %d out of %u workers \n", pu, co->nworkers); } unsigned six = 6; if (six < ncpus) six = ncpus/2; for(i = 0; i < six; i++) { co->remove(co, i); FPRINTF(stderr, "remove %u out of %u workers\n", i, co->nworkers); } while(co->has_next(co, &it)) { pu = co->get_next(co, &it); FPRINTF(stderr, "pu = %d out of %u workers \n", pu, co->nworkers); } FPRINTF(stderr, "timing init = %lf \n", timing); co->deinit(co); starpu_shutdown(); free(co); return 0; } #endif starpu-1.2.3+dfsg/gcc-plugin/000077500000000000000000000000001320135501600157765ustar00rootroot00000000000000starpu-1.2.3+dfsg/gcc-plugin/COPYING000066400000000000000000001045131320135501600170350ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . starpu-1.2.3+dfsg/gcc-plugin/ChangeLog000066400000000000000000000002041320135501600175440ustar00rootroot00000000000000This file should be generated when making a tarball from a Subversion checkout. If it's not, please refer to the output "svn log". starpu-1.2.3+dfsg/gcc-plugin/Makefile.am000066400000000000000000000035761320135501600200450ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011, 2012 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. SUBDIRS = src if BUILD_TESTS SUBDIRS += tests endif if BUILD_EXAMPLES SUBDIRS += examples endif EXTRA_DIST = \ COPYING \ README \ ChangeLog noinst_HEADERS = \ include/starpu-gcc/opencl.h \ include/starpu-gcc/tasks.h \ include/starpu-gcc/utils.h \ include/starpu-gcc/warn-unregistered.h showcheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET # Generate a GNU-style ChangeLog for inclusion in the tarball. # It requires network access and may be slow. gen-ChangeLog: if test "x$$CHANGELOG" = "xno"; then \ echo "ChangeLog not built, per user request" >&2; \ elif ! xsltproc --version > /dev/null 2>&1; then \ echo "xsltproc not found, ChangeLog not generated" >&2; \ elif ! test -d "$(srcdir)/.svn"; then \ echo "Subversion meta-data not found, ChangeLog not generated" >&2; \ elif ! svn --version > /dev/null 2>&1; then \ echo "Subversion not found, ChangeLog not generated" >&2; \ else \ ( cd "$(srcdir)"; \ svn log --xml --verbose ) | \ xsltproc "$(top_srcdir)/build-aux/svn2cl.xsl" - > "ChangeLog.tmp"; \ mv "ChangeLog.tmp" "$(distdir)/ChangeLog"; \ fi dist-hook: gen-ChangeLog .PHONY: showcheck dist-hook gen-ChangeLog starpu-1.2.3+dfsg/gcc-plugin/Makefile.in000066400000000000000000000624341320135501600200540ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011, 2012 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @BUILD_TESTS_TRUE@am__append_1 = tests @BUILD_EXAMPLES_TRUE@am__append_2 = examples subdir = gcc-plugin ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = src tests examples am__DIST_COMMON = $(srcdir)/Makefile.in COPYING ChangeLog README DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POTI_CFLAGS = @POTI_CFLAGS@ POTI_LIBS = @POTI_LIBS@ PROG_DATE = @PROG_DATE@ PROG_STAT = @PROG_STAT@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_COI_CPPFLAGS = @STARPU_COI_CPPFLAGS@ STARPU_COI_LDFLAGS = @STARPU_COI_LDFLAGS@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LEVELDB_LDFLAGS = @STARPU_LEVELDB_LDFLAGS@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RCCE_CFLAGS = @STARPU_RCCE_CFLAGS@ STARPU_RCCE_CPPFLAGS = @STARPU_RCCE_CPPFLAGS@ STARPU_RCCE_LDFLAGS = @STARPU_RCCE_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SCIF_CPPFLAGS = @STARPU_SCIF_CPPFLAGS@ STARPU_SCIF_LDFLAGS = @STARPU_SCIF_LDFLAGS@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SC_HYPERVISOR_DEBUG = @STARPU_SC_HYPERVISOR_DEBUG@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ mpifort_path = @mpifort_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ smpirun_path = @smpirun_path@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = src $(am__append_1) $(am__append_2) EXTRA_DIST = \ COPYING \ README \ ChangeLog noinst_HEADERS = \ include/starpu-gcc/opencl.h \ include/starpu-gcc/tasks.h \ include/starpu-gcc/utils.h \ include/starpu-gcc/warn-unregistered.h all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gcc-plugin/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gcc-plugin/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am check: check-recursive all-am: Makefile $(HEADERS) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am dist-hook distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am .PRECIOUS: Makefile showcheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET # Generate a GNU-style ChangeLog for inclusion in the tarball. # It requires network access and may be slow. gen-ChangeLog: if test "x$$CHANGELOG" = "xno"; then \ echo "ChangeLog not built, per user request" >&2; \ elif ! xsltproc --version > /dev/null 2>&1; then \ echo "xsltproc not found, ChangeLog not generated" >&2; \ elif ! test -d "$(srcdir)/.svn"; then \ echo "Subversion meta-data not found, ChangeLog not generated" >&2; \ elif ! svn --version > /dev/null 2>&1; then \ echo "Subversion not found, ChangeLog not generated" >&2; \ else \ ( cd "$(srcdir)"; \ svn log --xml --verbose ) | \ xsltproc "$(top_srcdir)/build-aux/svn2cl.xsl" - > "ChangeLog.tmp"; \ mv "ChangeLog.tmp" "$(distdir)/ChangeLog"; \ fi dist-hook: gen-ChangeLog .PHONY: showcheck dist-hook gen-ChangeLog # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.2.3+dfsg/gcc-plugin/README000066400000000000000000000017031320135501600166570ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. StarPU's GCC Plug-In ===================== This directory contains an (experimental) GCC plug-in that provides C language extensions to make it easier to define and invoke StarPU tasks. Plug-ins are supported starting from GCC 4.5. To run the test suite, GNU Guile 1.8.x or 2.0.x is needed. When building from SVN, GNU Bison 2.5+ is required. starpu-1.2.3+dfsg/gcc-plugin/examples/000077500000000000000000000000001320135501600176145ustar00rootroot00000000000000starpu-1.2.3+dfsg/gcc-plugin/examples/Makefile.am000066400000000000000000000051771320135501600216620ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011, 2012 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. include $(top_srcdir)/starpu.mk TESTS = examplebindir = $(libdir)/starpu/plugin if STARPU_USE_CPU if STARPU_HAVE_WINDOWS check_PROGRAMS = $(TESTS) else check_PROGRAMS = $(LOADER) $(TESTS) endif if !STARPU_HAVE_WINDOWS ## test loader program LOADER = loader loader_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -I$(top_builddir)/src/ LOADER_BIN = $(abs_top_builddir)/gcc-plugin/examples/$(LOADER) loader_SOURCES = ../../tests/loader.c if STARPU_HAVE_AM111 TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" LOG_COMPILER = $(LOADER_BIN) else TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(LOADER_BIN) endif endif CLEANFILES = starpu_idle_microsec.log examplebin_PROGRAMS = \ hello-starpu \ matrix-mult \ stencil5 \ vector_scal/vector_scal #if !NO_BLAS_LIB #examplebin_PROGRAMS += \ # cholesky/cholesky #endif !NO_BLAS_LIB endif STARPU_USE_CPU AM_LDFLAGS = $(top_builddir)/src/@LIBSTARPU_LINK@ AM_LDFLAGS += $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) AM_CPPFLAGS = \ -I$(top_srcdir)/include \ -I$(top_srcdir)/examples \ $(STARPU_OPENCL_CPPFLAGS) $(STARPU_CUDA_CPPFLAGS) AM_CFLAGS = \ -fplugin="$(builddir)/../src/.libs/starpu.so" \ -fplugin-arg-starpu-include-dir="$(top_srcdir)/include" \ -fplugin-arg-starpu-verbose \ -Wall $(HWLOC_CFLAGS) #noinst_HEADERS = \ # cholesky/cholesky.h \ # cholesky/cholesky_kernels.h #if !NO_BLAS_LIB #cholesky_cholesky_SOURCES = \ # cholesky/cholesky.c \ # cholesky/cholesky_models.c \ # cholesky/cholesky_kernels.c \ # $(top_srcdir)/examples/common/blas.c # #cholesky_cholesky_LDADD = \ # $(STARPU_BLAS_LDFLAGS) #endif vector_scal_vector_scal_SOURCES = vector_scal/vector_scal.c if STARPU_USE_CUDA vector_scal_vector_scal_SOURCES += vector_scal/vector_scal_cuda.cu .cu.o: $(NVCC) $< -c -o $@ $(NVCCFLAGS) \ -I$(top_builddir)/include -I$(top_srcdir)/include else !STARPU_USE_CUDA EXTRA_DIST = vector_scal/vector_scal_cuda.cu endif TESTS += $(examplebin_PROGRAMS) starpu-1.2.3+dfsg/gcc-plugin/examples/Makefile.in000066400000000000000000001443401320135501600216670ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011, 2012 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CPU_TRUE@check_PROGRAMS = $(am__EXEEXT_1) \ @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CPU_TRUE@ $(am__EXEEXT_3) @STARPU_HAVE_WINDOWS_TRUE@@STARPU_USE_CPU_TRUE@check_PROGRAMS = $(am__EXEEXT_3) @STARPU_USE_CPU_TRUE@examplebin_PROGRAMS = hello-starpu$(EXEEXT) \ @STARPU_USE_CPU_TRUE@ matrix-mult$(EXEEXT) stencil5$(EXEEXT) \ @STARPU_USE_CPU_TRUE@ vector_scal/vector_scal$(EXEEXT) @STARPU_USE_CUDA_TRUE@am__append_1 = vector_scal/vector_scal_cuda.cu subdir = gcc-plugin/examples ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CPU_TRUE@am__EXEEXT_1 = loader$(EXEEXT) @STARPU_USE_CPU_TRUE@am__EXEEXT_2 = hello-starpu$(EXEEXT) \ @STARPU_USE_CPU_TRUE@ matrix-mult$(EXEEXT) stencil5$(EXEEXT) \ @STARPU_USE_CPU_TRUE@ vector_scal/vector_scal$(EXEEXT) am__EXEEXT_3 = $(am__EXEEXT_2) am__installdirs = "$(DESTDIR)$(examplebindir)" PROGRAMS = $(examplebin_PROGRAMS) hello_starpu_SOURCES = hello-starpu.c hello_starpu_OBJECTS = hello-starpu.$(OBJEXT) hello_starpu_LDADD = $(LDADD) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am__loader_SOURCES_DIST = ../../tests/loader.c @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CPU_TRUE@am_loader_OBJECTS = loader-loader.$(OBJEXT) loader_OBJECTS = $(am_loader_OBJECTS) loader_LDADD = $(LDADD) matrix_mult_SOURCES = matrix-mult.c matrix_mult_OBJECTS = matrix-mult.$(OBJEXT) matrix_mult_LDADD = $(LDADD) stencil5_SOURCES = stencil5.c stencil5_OBJECTS = stencil5.$(OBJEXT) stencil5_LDADD = $(LDADD) am__vector_scal_vector_scal_SOURCES_DIST = vector_scal/vector_scal.c \ vector_scal/vector_scal_cuda.cu am__dirstamp = $(am__leading_dot)dirstamp @STARPU_USE_CUDA_TRUE@am__objects_1 = \ @STARPU_USE_CUDA_TRUE@ vector_scal/vector_scal_cuda.$(OBJEXT) am_vector_scal_vector_scal_OBJECTS = vector_scal.$(OBJEXT) \ $(am__objects_1) vector_scal_vector_scal_OBJECTS = \ $(am_vector_scal_vector_scal_OBJECTS) vector_scal_vector_scal_LDADD = $(LDADD) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/common -I$(top_builddir)/include -I$(top_builddir)/gcc-plugin/include/starpu-gcc -I$(top_builddir)/starpu-top depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = hello-starpu.c $(loader_SOURCES) matrix-mult.c stencil5.c \ $(vector_scal_vector_scal_SOURCES) DIST_SOURCES = hello-starpu.c $(am__loader_SOURCES_DIST) matrix-mult.c \ stencil5.c $(am__vector_scal_vector_scal_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/build-aux/depcomp \ $(top_srcdir)/build-aux/test-driver $(top_srcdir)/starpu.mk DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POTI_CFLAGS = @POTI_CFLAGS@ POTI_LIBS = @POTI_LIBS@ PROG_DATE = @PROG_DATE@ PROG_STAT = @PROG_STAT@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_COI_CPPFLAGS = @STARPU_COI_CPPFLAGS@ STARPU_COI_LDFLAGS = @STARPU_COI_LDFLAGS@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LEVELDB_LDFLAGS = @STARPU_LEVELDB_LDFLAGS@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RCCE_CFLAGS = @STARPU_RCCE_CFLAGS@ STARPU_RCCE_CPPFLAGS = @STARPU_RCCE_CPPFLAGS@ STARPU_RCCE_LDFLAGS = @STARPU_RCCE_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SCIF_CPPFLAGS = @STARPU_SCIF_CPPFLAGS@ STARPU_SCIF_LDFLAGS = @STARPU_SCIF_LDFLAGS@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SC_HYPERVISOR_DEBUG = @STARPU_SC_HYPERVISOR_DEBUG@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ mpifort_path = @mpifort_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ smpirun_path = @smpirun_path@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ TESTS = $(examplebin_PROGRAMS) examplebindir = $(libdir)/starpu/plugin @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CPU_TRUE@LOADER = loader @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CPU_TRUE@loader_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -I$(top_builddir)/src/ @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CPU_TRUE@LOADER_BIN = $(abs_top_builddir)/gcc-plugin/examples/$(LOADER) @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CPU_TRUE@loader_SOURCES = ../../tests/loader.c @STARPU_HAVE_AM111_FALSE@@STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CPU_TRUE@TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(LOADER_BIN) @STARPU_HAVE_AM111_TRUE@@STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CPU_TRUE@TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" @STARPU_HAVE_AM111_TRUE@@STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CPU_TRUE@LOG_COMPILER = $(LOADER_BIN) @STARPU_USE_CPU_TRUE@CLEANFILES = starpu_idle_microsec.log #if !NO_BLAS_LIB #examplebin_PROGRAMS += \ # cholesky/cholesky #endif !NO_BLAS_LIB AM_LDFLAGS = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) AM_CPPFLAGS = \ -I$(top_srcdir)/include \ -I$(top_srcdir)/examples \ $(STARPU_OPENCL_CPPFLAGS) $(STARPU_CUDA_CPPFLAGS) AM_CFLAGS = \ -fplugin="$(builddir)/../src/.libs/starpu.so" \ -fplugin-arg-starpu-include-dir="$(top_srcdir)/include" \ -fplugin-arg-starpu-verbose \ -Wall $(HWLOC_CFLAGS) #noinst_HEADERS = \ # cholesky/cholesky.h \ # cholesky/cholesky_kernels.h #if !NO_BLAS_LIB #cholesky_cholesky_SOURCES = \ # cholesky/cholesky.c \ # cholesky/cholesky_models.c \ # cholesky/cholesky_kernels.c \ # $(top_srcdir)/examples/common/blas.c # #cholesky_cholesky_LDADD = \ # $(STARPU_BLAS_LDFLAGS) #endif vector_scal_vector_scal_SOURCES = vector_scal/vector_scal.c \ $(am__append_1) @STARPU_USE_CUDA_FALSE@EXTRA_DIST = vector_scal/vector_scal_cuda.cu all: all-am .SUFFIXES: .SUFFIXES: .c .cu .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/starpu.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gcc-plugin/examples/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gcc-plugin/examples/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/starpu.mk $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-examplebinPROGRAMS: $(examplebin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(examplebin_PROGRAMS)'; test -n "$(examplebindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(examplebindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(examplebindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(examplebindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(examplebindir)$$dir" || exit $$?; \ } \ ; done uninstall-examplebinPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(examplebin_PROGRAMS)'; test -n "$(examplebindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(examplebindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(examplebindir)" && rm -f $$files clean-examplebinPROGRAMS: @list='$(examplebin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list hello-starpu$(EXEEXT): $(hello_starpu_OBJECTS) $(hello_starpu_DEPENDENCIES) $(EXTRA_hello_starpu_DEPENDENCIES) @rm -f hello-starpu$(EXEEXT) $(AM_V_CCLD)$(LINK) $(hello_starpu_OBJECTS) $(hello_starpu_LDADD) $(LIBS) loader$(EXEEXT): $(loader_OBJECTS) $(loader_DEPENDENCIES) $(EXTRA_loader_DEPENDENCIES) @rm -f loader$(EXEEXT) $(AM_V_CCLD)$(LINK) $(loader_OBJECTS) $(loader_LDADD) $(LIBS) matrix-mult$(EXEEXT): $(matrix_mult_OBJECTS) $(matrix_mult_DEPENDENCIES) $(EXTRA_matrix_mult_DEPENDENCIES) @rm -f matrix-mult$(EXEEXT) $(AM_V_CCLD)$(LINK) $(matrix_mult_OBJECTS) $(matrix_mult_LDADD) $(LIBS) stencil5$(EXEEXT): $(stencil5_OBJECTS) $(stencil5_DEPENDENCIES) $(EXTRA_stencil5_DEPENDENCIES) @rm -f stencil5$(EXEEXT) $(AM_V_CCLD)$(LINK) $(stencil5_OBJECTS) $(stencil5_LDADD) $(LIBS) vector_scal/$(am__dirstamp): @$(MKDIR_P) vector_scal @: > vector_scal/$(am__dirstamp) vector_scal/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) vector_scal/$(DEPDIR) @: > vector_scal/$(DEPDIR)/$(am__dirstamp) vector_scal/vector_scal_cuda.$(OBJEXT): vector_scal/$(am__dirstamp) \ vector_scal/$(DEPDIR)/$(am__dirstamp) vector_scal/vector_scal$(EXEEXT): $(vector_scal_vector_scal_OBJECTS) $(vector_scal_vector_scal_DEPENDENCIES) $(EXTRA_vector_scal_vector_scal_DEPENDENCIES) vector_scal/$(am__dirstamp) @rm -f vector_scal/vector_scal$(EXEEXT) $(AM_V_CCLD)$(LINK) $(vector_scal_vector_scal_OBJECTS) $(vector_scal_vector_scal_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f vector_scal/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hello-starpu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loader-loader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrix-mult.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stencil5.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_scal.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< loader-loader.o: ../../tests/loader.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT loader-loader.o -MD -MP -MF $(DEPDIR)/loader-loader.Tpo -c -o loader-loader.o `test -f '../../tests/loader.c' || echo '$(srcdir)/'`../../tests/loader.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/loader-loader.Tpo $(DEPDIR)/loader-loader.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../tests/loader.c' object='loader-loader.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o loader-loader.o `test -f '../../tests/loader.c' || echo '$(srcdir)/'`../../tests/loader.c loader-loader.obj: ../../tests/loader.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT loader-loader.obj -MD -MP -MF $(DEPDIR)/loader-loader.Tpo -c -o loader-loader.obj `if test -f '../../tests/loader.c'; then $(CYGPATH_W) '../../tests/loader.c'; else $(CYGPATH_W) '$(srcdir)/../../tests/loader.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/loader-loader.Tpo $(DEPDIR)/loader-loader.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../tests/loader.c' object='loader-loader.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o loader-loader.obj `if test -f '../../tests/loader.c'; then $(CYGPATH_W) '../../tests/loader.c'; else $(CYGPATH_W) '$(srcdir)/../../tests/loader.c'; fi` vector_scal.o: vector_scal/vector_scal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vector_scal.o -MD -MP -MF $(DEPDIR)/vector_scal.Tpo -c -o vector_scal.o `test -f 'vector_scal/vector_scal.c' || echo '$(srcdir)/'`vector_scal/vector_scal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vector_scal.Tpo $(DEPDIR)/vector_scal.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vector_scal/vector_scal.c' object='vector_scal.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vector_scal.o `test -f 'vector_scal/vector_scal.c' || echo '$(srcdir)/'`vector_scal/vector_scal.c vector_scal.obj: vector_scal/vector_scal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vector_scal.obj -MD -MP -MF $(DEPDIR)/vector_scal.Tpo -c -o vector_scal.obj `if test -f 'vector_scal/vector_scal.c'; then $(CYGPATH_W) 'vector_scal/vector_scal.c'; else $(CYGPATH_W) '$(srcdir)/vector_scal/vector_scal.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vector_scal.Tpo $(DEPDIR)/vector_scal.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vector_scal/vector_scal.c' object='vector_scal.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vector_scal.obj `if test -f 'vector_scal/vector_scal.c'; then $(CYGPATH_W) 'vector_scal/vector_scal.c'; else $(CYGPATH_W) '$(srcdir)/vector_scal/vector_scal.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf vector_scal/.libs vector_scal/_libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? hello-starpu.log: hello-starpu$(EXEEXT) @p='hello-starpu$(EXEEXT)'; \ b='hello-starpu'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) matrix-mult.log: matrix-mult$(EXEEXT) @p='matrix-mult$(EXEEXT)'; \ b='matrix-mult'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) stencil5.log: stencil5$(EXEEXT) @p='stencil5$(EXEEXT)'; \ b='stencil5'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) vector_scal/vector_scal.log: vector_scal/vector_scal$(EXEEXT) @p='vector_scal/vector_scal$(EXEEXT)'; \ b='vector_scal/vector_scal'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(examplebindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f vector_scal/$(DEPDIR)/$(am__dirstamp) -rm -f vector_scal/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-examplebinPROGRAMS clean-generic \ clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-examplebinPROGRAMS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-examplebinPROGRAMS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-examplebinPROGRAMS clean-generic \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-examplebinPROGRAMS install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-examplebinPROGRAMS .PRECIOUS: Makefile showcheck: -cat $(TEST_LOGS) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q " runtime error: " $(TEST_LOGS) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET @STARPU_USE_CUDA_TRUE@.cu.o: @STARPU_USE_CUDA_TRUE@ $(NVCC) $< -c -o $@ $(NVCCFLAGS) \ @STARPU_USE_CUDA_TRUE@ -I$(top_builddir)/include -I$(top_srcdir)/include # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.2.3+dfsg/gcc-plugin/examples/hello-starpu.c000066400000000000000000000021311320135501600223740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include /* Task declaration. */ static void my_task (int x) __attribute__ ((task)); /* Definition of the CPU implementation of ‘my task’. */ static void my_task (int x) { printf ("Hello, world! With x = %d\n", x); } int main () { /* Initialize StarPU. */ #pragma starpu initialize /* Do an asynchronous call to ‘my task’. */ my_task (42); /* Wait for the call to complete. */ #pragma starpu wait /* Terminate. */ #pragma starpu shutdown return 0; } starpu-1.2.3+dfsg/gcc-plugin/examples/matrix-mult.c000066400000000000000000000162461320135501600222540ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. Copyright (C) 2011, 2012 INRIA Copyright (C) 2010 Sylvain Gault StarPU is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ /* The classical matrix multiplication example, implemented as a StarPU task invoked for different slices of the matrices. Each invocation may of course execute in parallel. */ #ifndef STARPU_GCC_PLUGIN # error must be compiled with the StarPU GCC plug-in #endif /* Convenience macro. */ #define __heap __attribute__ ((__heap_allocated__)) #include #include #include #include #include #include /* Definition of the StarPU task and its CPU implementation. */ static void matmul (const float *A, const float *B, float *C, size_t nx, size_t ny, size_t nz) __attribute__ ((task)); static void matmul_cpu (const float *A, const float *B, float *C, size_t nx, size_t ny, size_t nz) __attribute__ ((task_implementation ("cpu", matmul))); static void matmul_cpu (const float *A, const float *B, float *C, size_t nx, size_t ny, size_t nz) { size_t i, j, k; for (j = 0; j < ny; j++) for (i = 0; i < nx; i++) { for (k = 0; k < nz; k++) C[j * nx + i] += A[j * nz + k] * B[k * nx + i]; } } static void print_matrix (const float *M, size_t nslicesx, size_t nslicesy, size_t bxdim, size_t bydim) __attribute__ ((unused)); static void print_matrix (const float *M, size_t nslicesx, size_t nslicesy, size_t bxdim, size_t bydim) { size_t a, b, i, j; for (b = 0; b < nslicesy; b++) for (j = 0; j < bydim; j++) { for (a = 0; a < nslicesx; a++) { for (i = 0; i < bxdim; i++) printf ("%f ", M[b * nslicesx * bxdim * bydim + j * bxdim + a * bxdim * bydim + i]); } printf ("\b\n"); } printf ("\n"); } static float my_rand (void) { return (float) rand () / (float) RAND_MAX; } static double mean (const double *v, size_t size) { double sum = 0; size_t i; for (i = 0; i < size; i++) sum += v[i]; return sum / size; } static double stddev (const double *v, size_t size) { double m = mean (v, size); double sqsum = 0; size_t i; for (i = 0; i < size; i++) sqsum += (v[i] - m) * (v[i] - m); return sqrt (sqsum / size); } int main (int argc, char **argv) { int mloop, nloop = 0; size_t i, j, k; size_t nslicesx; size_t nslicesy; size_t nslicesz; size_t xdim, ydim, zdim; size_t bxdim, bydim, bzdim; struct timeval start_all, end_all; struct timeval start_register, end_register; struct timeval start_tasks, end_tasks; struct timeval start_unregister, end_unregister; struct timeval start_compute, end_compute; if (argc < 4) { fprintf (stderr, "Using default values.\nCorrect usage: %s NLOOPS MATRIX-SIZE NSLICES\n", argv[0]); mloop = nloop = 10; zdim = ydim = xdim = 16; nslicesz = nslicesy = nslicesx = 4; } else { mloop = nloop = atoi (argv[1]); zdim = ydim = xdim = atoi (argv[2]); nslicesz = nslicesy = nslicesx = atoi (argv[3]); } bxdim = xdim / nslicesx; bydim = ydim / nslicesy; bzdim = zdim / nslicesz; if (xdim % nslicesx) { fprintf (stderr, "MATRIX-SIZE must be a multiple of NSLICES\n"); return EXIT_FAILURE; } fprintf (stderr, "running %d loops with %lux%lux%lu matrices and %lux%lux%lu blocks...\n", nloop, xdim, ydim, zdim, bxdim, bydim, bzdim); double computetime[nloop]; double starttaskstime[nloop]; #pragma starpu initialize gettimeofday (&start_all, NULL); float A[zdim * ydim]; float B[xdim * zdim]; float C[xdim * ydim]; srand (time (NULL)); for (i = 0; i < zdim * ydim; i++) A[i] = my_rand () * 100; for (i = 0; i < xdim * zdim; i++) B[i] = my_rand () * 100; #if 0 print_matrix (A, nslicesz, nslicesy, bzdim, bydim); print_matrix (B, nslicesx, nslicesz, bxdim, bzdim); #endif for (i = 0; i < xdim * ydim; i++) C[i] = 0; gettimeofday (&start_register, NULL); for (i = 0; i < nslicesy; i++) for (j = 0; j < nslicesz; j++) #pragma starpu register &A[i*zdim*bydim + j*bzdim*bydim] (bzdim * bydim) for (i = 0; i < nslicesz; i++) for (j = 0; j < nslicesx; j++) #pragma starpu register &B[i*xdim*bzdim + j*bxdim*bzdim] (bxdim * bzdim) for (i = 0; i < nslicesy; i++) for (j = 0; j < nslicesx; j++) #pragma starpu register &C[i*xdim*bydim + j*bxdim*bydim] (bxdim * bydim) gettimeofday (&end_register, NULL); while (nloop--) { gettimeofday (&start_tasks, NULL); gettimeofday (&start_compute, NULL); for (i = 0; i < nslicesy; i++) for (j = 0; j < nslicesx; j++) for (k = 0; k < nslicesz; k++) /* Make an asynchronous call to `matmul', leading to the instantiation of a StarPU task executing in parallel. */ matmul (&A[i * zdim * bydim + k * bzdim * bydim], &B[k * xdim * bzdim + j * bxdim * bzdim], &C[i * xdim * bydim + j * bxdim * bydim], bxdim, bydim, bzdim); gettimeofday (&end_tasks, NULL); starttaskstime[nloop] = (end_tasks.tv_sec - start_tasks.tv_sec) + (end_tasks.tv_usec - start_tasks.tv_usec) / 1000000.0; /* Wait for the asynchronous calls to complete. */ #pragma starpu wait gettimeofday (&end_compute, NULL); computetime[nloop] = (end_compute.tv_sec - start_compute.tv_sec) + (end_compute.tv_usec - start_compute. tv_usec) / 1000000.0; } #if 0 print_matrix (C, nslicesx, nslicesy, bxdim, bydim); #endif gettimeofday (&start_unregister, NULL); for (i = 0; i < nslicesy; i++) for (j = 0; j < nslicesz; j++) #pragma starpu unregister &A[i*zdim*bydim + j*bzdim*bydim] for (i = 0; i < nslicesz; i++) for (j = 0; j < nslicesx; j++) #pragma starpu unregister &B[i*xdim*bzdim + j*bxdim*bzdim] for (i = 0; i < nslicesy; i++) for (j = 0; j < nslicesx; j++) #pragma starpu unregister &C[i*xdim*bydim + j*bxdim*bydim] gettimeofday (&end_unregister, NULL); gettimeofday (&end_all, NULL); #pragma starpu shutdown printf ("total: %f\n", (end_all.tv_sec - start_all.tv_sec) + (end_all.tv_usec - start_all.tv_usec) / 1000000.0); printf ("register: %f\n", (end_register.tv_sec - start_register.tv_sec) + (end_register.tv_usec - start_register.tv_usec) / 1000000.0); printf ("unregister: %f\n", (end_unregister.tv_sec - start_unregister.tv_sec) + (end_unregister.tv_usec - start_unregister.tv_usec) / 1000000.0); printf ("mean task launch : %f\n", mean (starttaskstime, mloop)); printf ("std task launch: %f\n", stddev (starttaskstime, mloop)); printf ("mean compute: %f\n", mean (computetime, mloop)); printf ("std compute: %f\n", stddev (computetime, mloop)); printf ("Compute performance : %f GFLOPS\n", .002 * xdim * ydim * zdim / (mean (computetime, mloop) * 1000000)); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/gcc-plugin/examples/stencil5.c000066400000000000000000000066251320135501600215170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #ifndef STARPU_GCC_PLUGIN # error must be compiled with the StarPU GCC plug-in #endif /* Definition of the StarPU task and its CPU implementation. */ static void stencil5(float *xy, const float *xm1y, const float *xp1y, const float *xym1, const float *xyp1) __attribute__ ((task)); static void stencil5_cpu(float *xy, const float *xm1y, const float *xp1y, const float *xym1, const float *xyp1) __attribute__ ((task_implementation ("cpu", stencil5))); static void stencil5_cpu(float *xy, const float *xm1y, const float *xp1y, const float *xym1, const float *xyp1) { *xy = (*xy + *xm1y + *xp1y + *xym1 + *xyp1) / 5; } #define NITER_DEF 10 #define X 4 #define Y 4 int display = 0; int niter = NITER_DEF; static void parse_args(int argc, char **argv) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-iter") == 0) { char *argptr; niter = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-display") == 0) { display = 1; } } } static float my_rand (void) { return (float) rand () / (float) RAND_MAX; } int main(int argc, char **argv) { int x, y; float mean=0; float matrix[X][Y]; parse_args(argc, argv); srand (time (NULL)); for(x = 0; x < X; x++) { for (y = 0; y < Y; y++) { matrix[x][y] = my_rand () * 100; mean += matrix[x][y]; } } mean /= (x*y); if (display) { fprintf(stdout, "mean=%f\n", mean); for(x = 0; x < X; x++) { for (y = 0; y < Y; y++) { fprintf(stdout, "%3f ", matrix[x][y]); } fprintf(stdout, "\n"); } } #pragma starpu initialize for(x = 0; x < X; x++) { for (y = 0; y < Y; y++) { #pragma starpu register &matrix[x][y] 1 } } while(niter--) { for (x = 1; x < X-1; x++) { for (y = 1; y < Y-1; y++) { stencil5(&matrix[x][y], &matrix[x-1][y], &matrix[x+1][y], &matrix[x][y-1], &matrix[x][y+1]); } } } #pragma starpu wait for(x = 0; x < X; x++) { for (y = 0; y < Y; y++) { #pragma starpu unregister &matrix[x][y] } } #pragma starpu shutdown if (display) { fprintf(stdout, "mean=%f\n", mean); for(x = 0; x < X; x++) { for (y = 0; y < Y; y++) { fprintf(stdout, "%3f ", matrix[x][y]); } fprintf(stdout, "\n"); } } return EXIT_SUCCESS; } starpu-1.2.3+dfsg/gcc-plugin/examples/vector_scal/000077500000000000000000000000001320135501600221205ustar00rootroot00000000000000starpu-1.2.3+dfsg/gcc-plugin/examples/vector_scal/vector_scal.c000066400000000000000000000116601320135501600245740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* This example showcases features of the StarPU GCC plug-in. It defines a "vector scaling" task with multiple CPU implementations, an OpenCL implementation, and a CUDA implementation. Compiling it without `-fplugin=starpu.so' yields valid sequential code. */ #include #include #include #include /* Declare and define the standard CPU implementation. */ static void vector_scal (unsigned int size, float vector[size], float factor) __attribute__ ((task)); /* The CPU implementation. */ static void vector_scal (unsigned int size, float vector[size], float factor) { unsigned int i; for (i = 0; i < size; i++) vector[i] *= factor; } #if defined STARPU_GCC_PLUGIN && defined __SSE__ /* The SSE-capable CPU implementation. */ #include static void vector_scal_sse (unsigned int size, float vector[size], float factor) __attribute__ ((task_implementation ("cpu", vector_scal))); static void vector_scal_sse (unsigned int size, float vector[size], float factor) { unsigned int n_iterations = size / 4; __m128 *VECTOR = (__m128 *) vector; __m128 _FACTOR __attribute__ ((aligned (16))); _FACTOR = _mm_set1_ps (factor); unsigned int i; for (i = 0; i < n_iterations; i++) VECTOR[i] = _mm_mul_ps (_FACTOR, VECTOR[i]); unsigned int remainder = size % 4; if (remainder != 0) { unsigned int start = 4 * n_iterations; for (i = start; i < start + remainder; ++i) vector[i] = factor * vector[i]; } } #endif /* __SSE__ */ /* Declaration and definition of the OpenCL implementation. */ #if defined STARPU_GCC_PLUGIN && defined STARPU_USE_OPENCL #include /* The OpenCL programs, loaded from `main'. */ static struct starpu_opencl_program cl_programs; static void vector_scal_opencl (unsigned int size, float vector[size], float factor) __attribute__ ((task_implementation ("opencl", vector_scal))); static void vector_scal_opencl (unsigned int size, float vector[size], float factor) { int id, devid, err; cl_kernel kernel; cl_command_queue queue; cl_event event; cl_mem val = (cl_mem) vector; id = starpu_worker_get_id (); devid = starpu_worker_get_devid (id); /* Prepare to invoke the kernel. In the future, this will be largely automated. */ err = starpu_opencl_load_kernel (&kernel, &queue, &cl_programs, "vector_mult_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR (err); err = clSetKernelArg (kernel, 0, sizeof (size), &size); err |= clSetKernelArg (kernel, 1, sizeof (val), &val); err |= clSetKernelArg (kernel, 2, sizeof (factor), &factor); if (err) STARPU_OPENCL_REPORT_ERROR (err); size_t global = size, local = 1; err = clEnqueueNDRangeKernel (queue, kernel, 1, NULL, &global, &local, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR (err); clFinish (queue); starpu_opencl_collect_stats (event); clReleaseEvent (event); starpu_opencl_release_kernel (kernel); } #endif #ifdef STARPU_USE_CUDA /* Declaration of the CUDA implementation. The definition itself is in the `.cu' file itself. */ extern void vector_scal_cuda (unsigned int size, float vector[size], float factor) __attribute__ ((task_implementation ("cuda", vector_scal))); #endif #define EPSILON 1e-3 static bool check (unsigned int size, float vector[size], float factor) { unsigned int i; for (i = 0; i < size; i++) { if (fabs(vector[i] - i * factor) > i*factor*EPSILON) { fprintf(stderr, "%.2f != %.2f\n", vector[i], i*factor); return false; } } return true; } int main (void) { bool valid; #pragma starpu initialize #if defined STARPU_GCC_PLUGIN && defined STARPU_USE_OPENCL starpu_opencl_load_opencl_from_file ("examples/basic_examples/vector_scal_opencl_kernel.cl", &cl_programs, ""); #endif #define NX 0x100000 #define FACTOR 3.14 { float vector[NX] __attribute__ ((heap_allocated, registered)); unsigned int i; for (i = 0; i < NX; i++) vector[i] = (float) i; vector_scal (NX, vector, FACTOR); #pragma starpu wait #pragma starpu acquire vector valid = check (NX, vector, FACTOR); #pragma starpu release vector } /* VECTOR is automatically freed here. */ #pragma starpu shutdown return valid ? EXIT_SUCCESS : EXIT_FAILURE; } starpu-1.2.3+dfsg/gcc-plugin/examples/vector_scal/vector_scal_cuda.cu000066400000000000000000000025651320135501600257610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * Copyright (C) 2010, 2011, 2013 CNRS * Copyright (C) 2010 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* CUDA implementation of the `vector_scal' task. */ #include #include #include static __global__ void vector_mult_cuda (unsigned int n, float *val, float factor) { unsigned i = blockIdx.x * blockDim.x + threadIdx.x; if (i < n) val[i] *= factor; } extern "C" void vector_scal_cuda (unsigned int size, float vector[], float factor) { unsigned threads_per_block = 64; unsigned nblocks = (size + threads_per_block - 1) / threads_per_block; vector_mult_cuda <<< nblocks, threads_per_block, 0, starpu_cuda_get_local_stream () >>> (size, vector, factor); cudaStreamSynchronize (starpu_cuda_get_local_stream ()); } starpu-1.2.3+dfsg/gcc-plugin/include/000077500000000000000000000000001320135501600174215ustar00rootroot00000000000000starpu-1.2.3+dfsg/gcc-plugin/include/starpu-gcc/000077500000000000000000000000001320135501600214715ustar00rootroot00000000000000starpu-1.2.3+dfsg/gcc-plugin/include/starpu-gcc/config.h.in000066400000000000000000000024421320135501600235160ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011, 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* Hand-written config.h template for GCC-StarPU. Autoheader's generated template cannot be used because it defines PACKAGE_NAME & co., which GCC's header shamelessly defines. */ #undef HAVE_DECL_BUILD_CALL_EXPR_LOC_ARRAY #undef HAVE_DECL_BUILD_CALL_EXPR_LOC_VEC #undef HAVE_DECL_BUILD_ARRAY_REF #undef HAVE_DECL_BUILD_ZERO_CST #undef HAVE_DECL_BUILTIN_DECL_EXPLICIT #undef HAVE_ATTRIBUTE_SPEC_AFFECTS_TYPE_IDENTITY #undef HAVE_C_FAMILY_C_COMMON_H #undef HAVE_C_COMMON_H #undef HAVE_C_FAMILY_C_PRAGMA_H #undef HAVE_C_PRAGMA_H #undef STARPU_INCLUDE_DIR #undef HAVE_DECL_PTR_DEREFS_MAY_ALIAS_P starpu-1.2.3+dfsg/gcc-plugin/include/starpu-gcc/opencl.h000066400000000000000000000017051320135501600231250ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ #pragma once #include #include #include #include extern tree opencl_include_dirs; extern void handle_pragma_opencl (struct cpp_reader *reader); extern void validate_opencl_argument_type (location_t loc, const_tree type); starpu-1.2.3+dfsg/gcc-plugin/include/starpu-gcc/tasks.h000066400000000000000000000044701320135501600227740ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* Various utilities. */ #pragma once #include /* Note: Users of this file must first include , but we don't do that here because it has to be done very early, to avoid the dreaded "use of poisoned malloc" in xmmintrin.h. */ #include extern const char task_attribute_name[]; extern const char task_implementation_attribute_name[]; extern const char output_attribute_name[]; extern const char task_implementation_wrapper_attribute_name[]; extern const char task_implementation_list_attribute_name[]; extern bool task_p (const_tree decl); extern bool task_implementation_p (const_tree decl); extern int task_implementation_where (const_tree task_impl); extern int task_implementation_target_to_int (const_tree target); extern tree task_implementation_task (const_tree task_impl); extern tree task_codelet_declaration (const_tree task_decl); extern tree task_implementation_list (const_tree task_decl); extern tree task_pointer_parameter_types (const_tree task_decl); extern int task_where (const_tree task_decl); extern tree task_implementation_wrapper (const_tree task_impl); extern enum starpu_data_access_mode access_mode (const_tree type); extern bool output_type_p (const_tree type); extern tree codelet_type (void); extern void taskify_function (tree fn); extern tree build_codelet_identifier (tree task_decl); extern tree build_codelet_declaration (tree task_decl); extern tree build_codelet_initializer (tree task_decl); extern tree declare_codelet (tree task_decl); extern void define_task (tree task_decl); extern void add_task_implementation (tree task_decl, tree fn, const_tree where); starpu-1.2.3+dfsg/gcc-plugin/include/starpu-gcc/utils.h000066400000000000000000000103121320135501600227770ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* Various utilities. */ #pragma once #include #include /* GCC 4.7 requires compilation with `g++', and C++ lacks a number of GNU C features, so work around that. */ #ifdef __cplusplus /* G++ doesn't implement nested functions, so use C++11 lambdas instead. */ # include # define local_define(ret, name, parms) auto name = [=]parms # define function_parm(ret, name, parms) std::function name /* G++ lacks designated initializers. */ # define designated_field_init(name, value) value /* XXX: cross fingers */ #else /* !__cplusplus */ /* GNU C nested functions. */ # define local_define(ret, name, parms) ret name parms # define function_parm(ret, name, parms) ret (*name) parms /* Designated field initializer. */ # define designated_field_init(name, value) .name = value #endif /* !__cplusplus */ /* List and vector utilities, à la SRFI-1. */ extern tree chain_trees (tree t, ...) __attribute__ ((sentinel)); extern tree filter (function_parm (bool, pred, (const_tree)), tree t); extern tree list_remove (function_parm (bool, pred, (const_tree)), tree t); extern tree map (function_parm (tree, func, (const_tree)), tree t); extern void for_each (function_parm (void, func, (tree)), tree t); extern size_t count (function_parm (bool, pred, (const_tree)), const_tree t); /* Compatibility tricks & workarounds. */ #include #include /* This declaration is from `c-tree.h', but that header doesn't get installed. */ extern tree xref_tag (enum tree_code, tree); #if !HAVE_DECL_BUILTIN_DECL_EXPLICIT /* This function was introduced in GCC 4.7 as a replacement for the `built_in_decls' array. */ static inline tree builtin_decl_explicit (enum built_in_function fncode) { return built_in_decls[fncode]; } #endif #if !HAVE_DECL_BUILD_CALL_EXPR_LOC_ARRAY extern tree build_call_expr_loc_array (location_t loc, tree fndecl, int n, tree *argarray); #endif #if !HAVE_DECL_BUILD_CALL_EXPR_LOC_VEC extern tree build_call_expr_loc_vec (location_t loc, tree fndecl, VEC(tree,gc) *vec); #endif #if !HAVE_DECL_BUILD_ZERO_CST extern tree build_zero_cst (tree type); #endif #ifndef VEC_qsort /* This macro is missing in GCC 4.5. */ # define VEC_qsort(T,V,CMP) qsort(VEC_address (T,V), VEC_length(T,V), \ sizeof (T), CMP) #endif /* Helpers. */ extern bool verbose_output_p; extern tree build_pointer_lookup (tree pointer); extern tree build_starpu_error_string (tree error_var); extern tree build_constructor_from_unsorted_list (tree type, tree vals); extern tree read_pragma_expressions (const char *pragma, location_t loc); extern tree type_decl_for_struct_tag (const char *tag); extern tree build_function_arguments (tree fn); extern tree build_error_statements (location_t, tree, function_parm (tree, f, (tree)), const char *, ...) __attribute__ ((format (printf, 4, 5))); extern bool void_type_p (const_tree lst); extern bool pointer_type_p (const_tree lst); /* Lookup the StarPU function NAME in the global scope and store the result in VAR (this can't be done from `lower_starpu'.) */ #define LOOKUP_STARPU_FUNCTION(var, name) \ if ((var) == NULL_TREE) \ { \ (var) = lookup_name (get_identifier (name)); \ gcc_assert ((var) != NULL_TREE && TREE_CODE (var) == FUNCTION_DECL); \ } /* Don't warn about the unused `gcc_version' variable, from . */ static const struct plugin_gcc_version *starpu_gcc_version __attribute__ ((__unused__)) = &gcc_version; starpu-1.2.3+dfsg/gcc-plugin/include/starpu-gcc/warn-unregistered.h000066400000000000000000000015701320135501600253120ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* Buffer registration warning pass. */ #pragma once #include /* A pass that warns about use of possibly unregistered buffers. */ extern struct opt_pass pass_warn_starpu_unregistered; starpu-1.2.3+dfsg/gcc-plugin/src/000077500000000000000000000000001320135501600165655ustar00rootroot00000000000000starpu-1.2.3+dfsg/gcc-plugin/src/Makefile.am000066400000000000000000000030511320135501600206200ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011, 2012 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. include $(top_srcdir)/starpu.mk # `LIBRARIES' would be more appropriate than `LTLIBRARIES' but it # requires a name prefixed by `lib'. gccplugin_LTLIBRARIES = starpu.la starpu_la_SOURCES = \ c-expr.y \ opencl.c \ starpu.c \ tasks.c \ utils.c if HAVE_PTR_DEREFS_MAY_ALIAS_P # Only for GCC >= 4.6. starpu_la_SOURCES += warn-unregistered.c endif # Use the Yacc-compatibility mode so that Bison doesn't error out upon # reduce/reduce conflicts. AM_YFLAGS = -y AM_CPPFLAGS = \ -I$(top_builddir)/gcc-plugin/include \ -I$(top_srcdir)/gcc-plugin/include \ -I$(top_srcdir)/include \ -I$(GCC_PLUGIN_INCLUDE_DIR) -Wall -DYYERROR_VERBOSE=1 \ $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(HWLOC_CFLAGS) AM_LDFLAGS = -module # Use either `gcc' or `g++', whichever is appropriate to build # plug-ins for this version of GCC. AM_LIBTOOLFLAGS = --tag="$(GCC_FOR_PLUGIN_LIBTOOL_TAG)" CC = $(GCC_FOR_PLUGIN) starpu-1.2.3+dfsg/gcc-plugin/src/Makefile.in000066400000000000000000000715501320135501600206420ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011, 2012 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ # Only for GCC >= 4.6. @HAVE_PTR_DEREFS_MAY_ALIAS_P_TRUE@am__append_1 = warn-unregistered.c subdir = gcc-plugin/src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(gccplugindir)" LTLIBRARIES = $(gccplugin_LTLIBRARIES) starpu_la_LIBADD = am__starpu_la_SOURCES_DIST = c-expr.y opencl.c starpu.c tasks.c \ utils.c warn-unregistered.c @HAVE_PTR_DEREFS_MAY_ALIAS_P_TRUE@am__objects_1 = \ @HAVE_PTR_DEREFS_MAY_ALIAS_P_TRUE@ warn-unregistered.lo am_starpu_la_OBJECTS = c-expr.lo opencl.lo starpu.lo tasks.lo utils.lo \ $(am__objects_1) starpu_la_OBJECTS = $(am_starpu_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/common -I$(top_builddir)/include -I$(top_builddir)/gcc-plugin/include/starpu-gcc -I$(top_builddir)/starpu-top depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = am__yacc_c2h = sed -e s/cc$$/hh/ -e s/cpp$$/hpp/ -e s/cxx$$/hxx/ \ -e s/c++$$/h++/ -e s/c$$/h/ YACCCOMPILE = $(YACC) $(AM_YFLAGS) $(YFLAGS) LTYACCCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(YACC) $(AM_YFLAGS) $(YFLAGS) AM_V_YACC = $(am__v_YACC_@AM_V@) am__v_YACC_ = $(am__v_YACC_@AM_DEFAULT_V@) am__v_YACC_0 = @echo " YACC " $@; am__v_YACC_1 = YLWRAP = $(top_srcdir)/build-aux/ylwrap SOURCES = $(starpu_la_SOURCES) DIST_SOURCES = $(am__starpu_la_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/build-aux/depcomp $(top_srcdir)/build-aux/ylwrap \ $(top_srcdir)/starpu.mk c-expr.c DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = $(GCC_FOR_PLUGIN) CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POTI_CFLAGS = @POTI_CFLAGS@ POTI_LIBS = @POTI_LIBS@ PROG_DATE = @PROG_DATE@ PROG_STAT = @PROG_STAT@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_COI_CPPFLAGS = @STARPU_COI_CPPFLAGS@ STARPU_COI_LDFLAGS = @STARPU_COI_LDFLAGS@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LEVELDB_LDFLAGS = @STARPU_LEVELDB_LDFLAGS@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RCCE_CFLAGS = @STARPU_RCCE_CFLAGS@ STARPU_RCCE_CPPFLAGS = @STARPU_RCCE_CPPFLAGS@ STARPU_RCCE_LDFLAGS = @STARPU_RCCE_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SCIF_CPPFLAGS = @STARPU_SCIF_CPPFLAGS@ STARPU_SCIF_LDFLAGS = @STARPU_SCIF_LDFLAGS@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SC_HYPERVISOR_DEBUG = @STARPU_SC_HYPERVISOR_DEBUG@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ mpifort_path = @mpifort_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ smpirun_path = @smpirun_path@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # `LIBRARIES' would be more appropriate than `LTLIBRARIES' but it # requires a name prefixed by `lib'. gccplugin_LTLIBRARIES = starpu.la starpu_la_SOURCES = c-expr.y opencl.c starpu.c tasks.c utils.c \ $(am__append_1) # Use the Yacc-compatibility mode so that Bison doesn't error out upon # reduce/reduce conflicts. AM_YFLAGS = -y AM_CPPFLAGS = \ -I$(top_builddir)/gcc-plugin/include \ -I$(top_srcdir)/gcc-plugin/include \ -I$(top_srcdir)/include \ -I$(GCC_PLUGIN_INCLUDE_DIR) -Wall -DYYERROR_VERBOSE=1 \ $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(HWLOC_CFLAGS) AM_LDFLAGS = -module # Use either `gcc' or `g++', whichever is appropriate to build # plug-ins for this version of GCC. AM_LIBTOOLFLAGS = --tag="$(GCC_FOR_PLUGIN_LIBTOOL_TAG)" all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj .y $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/starpu.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gcc-plugin/src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gcc-plugin/src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/starpu.mk $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-gccpluginLTLIBRARIES: $(gccplugin_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(gccplugin_LTLIBRARIES)'; test -n "$(gccplugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(gccplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(gccplugindir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(gccplugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(gccplugindir)"; \ } uninstall-gccpluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(gccplugin_LTLIBRARIES)'; test -n "$(gccplugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(gccplugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(gccplugindir)/$$f"; \ done clean-gccpluginLTLIBRARIES: -test -z "$(gccplugin_LTLIBRARIES)" || rm -f $(gccplugin_LTLIBRARIES) @list='$(gccplugin_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } starpu.la: $(starpu_la_OBJECTS) $(starpu_la_DEPENDENCIES) $(EXTRA_starpu_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) -rpath $(gccplugindir) $(starpu_la_OBJECTS) $(starpu_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c-expr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/opencl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tasks.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/warn-unregistered.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< .y.c: $(AM_V_YACC)$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h `echo $@ | $(am__yacc_c2h)` y.output $*.output -- $(YACCCOMPILE) mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(gccplugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -rm -f c-expr.c clean: clean-am clean-am: clean-gccpluginLTLIBRARIES clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-gccpluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-gccpluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-gccpluginLTLIBRARIES clean-generic clean-libtool \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-gccpluginLTLIBRARIES \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-gccpluginLTLIBRARIES .PRECIOUS: Makefile showcheck: -cat $(TEST_LOGS) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q " runtime error: " $(TEST_LOGS) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.2.3+dfsg/gcc-plugin/src/c-expr.c000066400000000000000000001475501320135501600201430ustar00rootroot00000000000000/* A Bison parser, made by GNU Bison 3.0.4. */ /* Bison implementation for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "3.0.4" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 1 /* Push parsers. */ #define YYPUSH 0 /* Pull parsers. */ #define YYPULL 1 /* Copy the first part of user declarations. */ #line 25 "c-expr.y" /* yacc.c:339 */ #include #include #include #include #include #ifdef HAVE_C_FAMILY_C_COMMON_H # include #elif HAVE_C_COMMON_H # include #endif #ifdef HAVE_C_FAMILY_C_PRAGMA_H # include #elif HAVE_C_PRAGMA_H # include #endif #include #if !HAVE_DECL_BUILD_ARRAY_REF /* This declaration is missing in GCC 4.6.1. */ extern tree build_array_ref (location_t loc, tree array, tree index); #endif #define YYSTYPE tree #define YYLTYPE location_t static void yyerror (location_t loc, const char *pragma, tree *seq, char const *message) { error_at (loc, "parse error in pragma %qs: %s", pragma, message); } /* Return SOMETHING if it's a VAR_DECL, an identifier bound to a VAR_DECL, or another object; raise an error otherwise. */ static tree ensure_bound (location_t loc, tree something) { gcc_assert (something != NULL_TREE); if (DECL_P (something)) return something; else if (TREE_CODE (something) == IDENTIFIER_NODE) { tree var = lookup_name (something); if (var == NULL_TREE) { error_at (loc, "unbound variable %qE", something); return error_mark_node; } else return var; } return something; } static tree build_component_ref (location_t loc, tree what, tree field) { sorry ("struct field access not implemented yet"); /* XXX */ return error_mark_node; } /* Interpret the string beneath CST, and return a new string constant. */ static tree interpret_string (const_tree cst) { gcc_assert (TREE_CODE (cst) == STRING_CST); cpp_string input, interpreted; input.text = (unsigned char *) TREE_STRING_POINTER (cst); input.len = TREE_STRING_LENGTH (cst); bool success; success = cpp_interpret_string (parse_in, &input, 1, &interpreted, CPP_STRING); gcc_assert (success); return build_string (interpreted.len, (char *) interpreted.text); } #line 155 "c-expr.c" /* yacc.c:339 */ # ifndef YY_NULLPTR # if defined __cplusplus && 201103L <= __cplusplus # define YY_NULLPTR nullptr # else # define YY_NULLPTR 0 # endif # endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 1 #endif #if YYDEBUG extern int yydebug; #endif /* Token type. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE enum yytokentype { YCPP_NAME = 258, YCPP_NUMBER = 259, YCPP_AND = 260, YCPP_OPEN_SQUARE = 261, YCPP_CLOSE_SQUARE = 262, YCPP_OPEN_PAREN = 263, YCPP_CLOSE_PAREN = 264, YCPP_PLUS = 265, YCPP_MINUS = 266, YCPP_MULT = 267, YCPP_DIV = 268, YCPP_DOT = 269, YCPP_DEREF = 270, YCPP_STRING = 271 }; #endif /* Tokens. */ #define YCPP_NAME 258 #define YCPP_NUMBER 259 #define YCPP_AND 260 #define YCPP_OPEN_SQUARE 261 #define YCPP_CLOSE_SQUARE 262 #define YCPP_OPEN_PAREN 263 #define YCPP_CLOSE_PAREN 264 #define YCPP_PLUS 265 #define YCPP_MINUS 266 #define YCPP_MULT 267 #define YCPP_DIV 268 #define YCPP_DOT 269 #define YCPP_DEREF 270 #define YCPP_STRING 271 /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef int YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 #endif int yyparse (location_t loc, const char *pragma, tree *seq); /* Copy the second part of user declarations. */ #line 234 "c-expr.c" /* yacc.c:358 */ /* Unqualified %code blocks. */ #line 114 "c-expr.y" /* yacc.c:359 */ /* Mapping of libcpp token names to Bison-generated token names. This is not ideal but Bison cannot be told to use the `enum cpp_ttype' values. */ #define STARPU_CPP_TOKENS \ TK (CPP_NAME) \ TK (CPP_NUMBER) \ TK (CPP_AND) \ TK (CPP_OPEN_SQUARE) \ TK (CPP_CLOSE_SQUARE) \ TK (CPP_OPEN_PAREN) \ TK (CPP_CLOSE_PAREN) \ TK (CPP_PLUS) \ TK (CPP_MINUS) \ TK (CPP_MULT) \ TK (CPP_DIV) \ TK (CPP_DOT) \ TK (CPP_DEREF) \ TK (CPP_STRING) #ifndef __cplusplus static const int cpplib_bison_token_map[] = { # define TK(x) [x] = Y ## x, STARPU_CPP_TOKENS # undef TK }; #else /* __cplusplus */ /* No designated initializers in C++. */ static int cpplib_bison_token_map[CPP_PADDING]; #endif /* __cplusplus */ static int yylex (YYSTYPE *lvalp) { int ret; enum cpp_ttype type; location_t loc; #ifdef __cplusplus if (cpplib_bison_token_map[CPP_NAME] != YCPP_NAME) { /* Initialize the table. */ # define TK(x) cpplib_bison_token_map[x] = Y ## x; STARPU_CPP_TOKENS # undef TK } #endif /* First check whether EOL is reached, because the EOL token needs to be left to the C parser. */ type = cpp_peek_token (parse_in, 0)->type; if (type == CPP_PRAGMA_EOL) ret = -1; else { /* Tell the lexer to not concatenate adjacent strings like cpp and `pragma_lex' normally do, because we want to be able to distinguish adjacent STRING_CST. */ type = c_lex_with_flags (lvalp, &loc, NULL, C_LEX_STRING_NO_JOIN); if (type == CPP_STRING) /* XXX: When using `C_LEX_STRING_NO_JOIN', `c_lex_with_flags' doesn't call `cpp_interpret_string', leaving us with an uninterpreted string (with quotes, etc.) This hack works around that. */ *lvalp = interpret_string (*lvalp); if (type < sizeof cpplib_bison_token_map / sizeof cpplib_bison_token_map[0]) ret = cpplib_bison_token_map[type]; else ret = -1; } return ret; } #line 319 "c-expr.c" /* yacc.c:359 */ #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #else typedef signed char yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(Msgid) dgettext ("bison-runtime", Msgid) # endif # endif # ifndef YY_ # define YY_(Msgid) Msgid # endif #endif #ifndef YY_ATTRIBUTE # if (defined __GNUC__ \ && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \ || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C # define YY_ATTRIBUTE(Spec) __attribute__(Spec) # else # define YY_ATTRIBUTE(Spec) /* empty */ # endif #endif #ifndef YY_ATTRIBUTE_PURE # define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__)) #endif #ifndef YY_ATTRIBUTE_UNUSED # define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__)) #endif #if !defined _Noreturn \ && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112) # if defined _MSC_VER && 1200 <= _MSC_VER # define _Noreturn __declspec (noreturn) # else # define _Noreturn YY_ATTRIBUTE ((__noreturn__)) # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(E) ((void) (E)) #else # define YYUSE(E) /* empty */ #endif #if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ /* Suppress an incorrect diagnostic about yylval being uninitialized. */ # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") # define YY_IGNORE_MAYBE_UNINITIALIZED_END \ _Pragma ("GCC diagnostic pop") #else # define YY_INITIAL_VALUE(Value) Value #endif #ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN # define YY_IGNORE_MAYBE_UNINITIALIZED_END #endif #ifndef YY_INITIAL_VALUE # define YY_INITIAL_VALUE(Value) /* Nothing. */ #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS # include /* INFRINGES ON USER NAME SPACE */ /* Use EXIT_SUCCESS as a witness for stdlib.h. */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's 'empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined EXIT_SUCCESS void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined EXIT_SUCCESS void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss_alloc; YYSTYPE yyvs_alloc; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) # define YYCOPY_NEEDED 1 /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack_alloc, Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ Stack = &yyptr->Stack_alloc; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (0) #endif #if defined YYCOPY_NEEDED && YYCOPY_NEEDED /* Copy COUNT objects from SRC to DST. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(Dst, Src, Count) \ __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src))) # else # define YYCOPY(Dst, Src, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (Dst)[yyi] = (Src)[yyi]; \ } \ while (0) # endif # endif #endif /* !YYCOPY_NEEDED */ /* YYFINAL -- State number of the termination state. */ #define YYFINAL 20 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 25 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 17 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 13 /* YYNRULES -- Number of rules. */ #define YYNRULES 25 /* YYNSTATES -- Number of states. */ #define YYNSTATES 38 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned by yylex, with out-of-bounds checking. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 271 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM as returned by yylex, without out-of-bounds checking. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; #if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { 0, 218, 218, 223, 230, 235, 238, 241, 244, 247, 250, 251, 254, 259, 263, 264, 270, 271, 282, 285, 292, 293, 294, 295, 298, 301 }; #endif #if YYDEBUG || YYERROR_VERBOSE || 0 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "\"identifier\"", "\"integer\"", "\"&\"", "\"[\"", "\"]\"", "\"(\"", "\")\"", "\"+\"", "\"-\"", "\"*\"", "\"/\"", "\".\"", "\"->\"", "\"string\"", "$accept", "sequence", "expression", "identifier", "binary_expression", "multiplicative_expression", "additive_expression", "cast_expression", "unary_expression", "postfix_expression", "primary_expression", "constant", "string_literal", YY_NULLPTR }; #endif # ifdef YYPRINT /* YYTOKNUM[NUM] -- (External) token number corresponding to the (internal) symbol number NUM (which must be that of a token). */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271 }; # endif #define YYPACT_NINF -16 #define yypact_value_is_default(Yystate) \ (!!((Yystate) == (-16))) #define YYTABLE_NINF -1 #define yytable_value_is_error(Yytable_value) \ 0 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ static const yytype_int8 yypact[] = { -1, -16, -16, -1, -1, -16, 9, -1, -16, -16, -7, 0, -16, -16, 2, -16, -16, -16, -16, 5, -16, -16, -1, -1, -1, -1, -1, 20, 20, -16, -16, -16, -7, -7, 17, -16, -16, -16 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. Performed when YYTABLE does not specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { 0, 5, 24, 0, 0, 25, 0, 2, 20, 4, 10, 6, 9, 13, 14, 16, 21, 22, 15, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 23, 7, 8, 11, 12, 0, 18, 19, 17 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -16, 18, -4, -15, -16, -6, -16, -2, -16, -16, -16, -16, -16 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { -1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule whose number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_uint8 yytable[] = { 19, 18, 1, 2, 3, 22, 23, 4, 26, 20, 24, 25, 35, 36, 29, 5, 27, 28, 32, 33, 30, 31, 34, 1, 37, 21 }; static const yytype_uint8 yycheck[] = { 4, 3, 3, 4, 5, 12, 13, 8, 6, 0, 10, 11, 27, 28, 9, 16, 14, 15, 24, 25, 22, 23, 26, 3, 7, 7 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 3, 4, 5, 8, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 24, 19, 0, 18, 12, 13, 10, 11, 6, 14, 15, 9, 24, 24, 22, 22, 19, 20, 20, 7 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 17, 18, 18, 19, 20, 21, 22, 22, 22, 23, 23, 23, 24, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 29 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 1, 2, 1, 1, 1, 3, 3, 1, 1, 3, 3, 1, 1, 2, 1, 4, 3, 3, 1, 1, 1, 3, 1, 1 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY) \ { \ yychar = (Token); \ yylval = (Value); \ YYPOPSTACK (yylen); \ yystate = *yyssp; \ goto yybackup; \ } \ else \ { \ yyerror (loc, pragma, seq, YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (0) /* Error token number */ #define YYTERROR 1 #define YYERRCODE 256 /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (0) /* This macro is provided for backward compatibility. */ #ifndef YY_LOCATION_PRINT # define YY_LOCATION_PRINT(File, Loc) ((void) 0) #endif # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value, loc, pragma, seq); \ YYFPRINTF (stderr, "\n"); \ } \ } while (0) /*----------------------------------------. | Print this symbol's value on YYOUTPUT. | `----------------------------------------*/ static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, location_t loc, const char *pragma, tree *seq) { FILE *yyo = yyoutput; YYUSE (yyo); YYUSE (loc); YYUSE (pragma); YYUSE (seq); if (!yyvaluep) return; # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # endif YYUSE (yytype); } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, location_t loc, const char *pragma, tree *seq) { YYFPRINTF (yyoutput, "%s %s (", yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep, loc, pragma, seq); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ static void yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) { YYFPRINTF (stderr, "Stack now"); for (; yybottom <= yytop; yybottom++) { int yybot = *yybottom; YYFPRINTF (stderr, " %d", yybot); } YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (0) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ static void yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule, location_t loc, const char *pragma, tree *seq) { unsigned long int yylno = yyrline[yyrule]; int yynrhs = yyr2[yyrule]; int yyi; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { YYFPRINTF (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yystos[yyssp[yyi + 1 - yynrhs]], &(yyvsp[(yyi + 1) - (yynrhs)]) , loc, pragma, seq); YYFPRINTF (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyssp, yyvsp, Rule, loc, pragma, seq); \ } while (0) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ static YYSIZE_T yystrlen (const char *yystr) { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ static char * yystpcpy (char *yydest, const char *yysrc) { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message about the unexpected token YYTOKEN for the state stack whose top is YYSSP. Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is not large enough to hold the message. In that case, also set *YYMSG_ALLOC to the required number of bytes. Return 2 if the required number of bytes is too large to store. */ static int yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, yytype_int16 *yyssp, int yytoken) { YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]); YYSIZE_T yysize = yysize0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; /* Internationalized format string. */ const char *yyformat = YY_NULLPTR; /* Arguments of yyformat. */ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; /* Number of reported tokens (one for the "unexpected", one per "expected"). */ int yycount = 0; /* There are many possibilities here to consider: - If this state is a consistent state with a default action, then the only way this function was invoked is if the default action is an error action. In that case, don't check for expected tokens because there are none. - The only way there can be no lookahead present (in yychar) is if this state is a consistent state with a default action. Thus, detecting the absence of a lookahead is sufficient to determine that there is no unexpected or expected token to report. In that case, just report a simple "syntax error". - Don't assume there isn't a lookahead just because this state is a consistent state with a default action. There might have been a previous inconsistent state, consistent state with a non-default action, or user semantic action that manipulated yychar. - Of course, the expected token list depends on states to have correct lookahead information, and it depends on the parser not to perform extra reductions after fetching a lookahead from the scanner and before detecting a syntax error. Thus, state merging (from LALR or IELR) and default reductions corrupt the expected token list. However, the list is correct for canonical LR with one exception: it will still contain any token that will not be accepted due to an error action in a later state. */ if (yytoken != YYEMPTY) { int yyn = yypact[*yyssp]; yyarg[yycount++] = yytname[yytoken]; if (!yypact_value_is_default (yyn)) { /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. In other words, skip the first -YYN actions for this state because they are default actions. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yyx; for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR && !yytable_value_is_error (yytable[yyx + yyn])) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; break; } yyarg[yycount++] = yytname[yyx]; { YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]); if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) return 2; yysize = yysize1; } } } } switch (yycount) { # define YYCASE_(N, S) \ case N: \ yyformat = S; \ break YYCASE_(0, YY_("syntax error")); YYCASE_(1, YY_("syntax error, unexpected %s")); YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); # undef YYCASE_ } { YYSIZE_T yysize1 = yysize + yystrlen (yyformat); if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) return 2; yysize = yysize1; } if (*yymsg_alloc < yysize) { *yymsg_alloc = 2 * yysize; if (! (yysize <= *yymsg_alloc && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; return 1; } /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ { char *yyp = *yymsg; int yyi = 0; while ((*yyp = *yyformat) != '\0') if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyformat += 2; } else { yyp++; yyformat++; } } return 0; } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, location_t loc, const char *pragma, tree *seq) { YYUSE (yyvaluep); YYUSE (loc); YYUSE (pragma); YYUSE (seq); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN YYUSE (yytype); YY_IGNORE_MAYBE_UNINITIALIZED_END } /*----------. | yyparse. | `----------*/ int yyparse (location_t loc, const char *pragma, tree *seq) { /* The lookahead symbol. */ int yychar; /* The semantic value of the lookahead symbol. */ /* Default value used for initialization, for pacifying older GCCs or non-GCC compilers. */ YY_INITIAL_VALUE (static YYSTYPE yyval_default;) YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); /* Number of syntax errors so far. */ int yynerrs; int yystate; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* The stacks and their tools: 'yyss': related to states. 'yyvs': related to semantic values. Refer to the stacks through separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs; YYSTYPE *yyvsp; YYSIZE_T yystacksize; int yyn; int yyresult; /* Lookahead token as an internal (translated) token number. */ int yytoken = 0; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; yyssp = yyss = yyssa; yyvsp = yyvs = yyvsa; yystacksize = YYINITDEPTH; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss_alloc, yyss); YYSTACK_RELOCATE (yyvs_alloc, yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); if (yystate == YYFINAL) YYACCEPT; goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a lookahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; if (yypact_value_is_default (yyn)) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = yylex (&yylval); } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yytable_value_is_error (yyn)) goto yyerrlab; yyn = -yyn; goto yyreduce; } /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the lookahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token. */ yychar = YYEMPTY; yystate = yyn; YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; YY_IGNORE_MAYBE_UNINITIALIZED_END goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: '$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 2: #line 218 "c-expr.y" /* yacc.c:1646 */ { gcc_assert (*seq == NULL_TREE); *seq = tree_cons (NULL_TREE, (yyvsp[0]), NULL_TREE); (yyval) = *seq; } #line 1426 "c-expr.c" /* yacc.c:1646 */ break; case 3: #line 223 "c-expr.y" /* yacc.c:1646 */ { gcc_assert ((yyvsp[0]) == *seq); *seq = tree_cons (NULL_TREE, (yyvsp[-1]), (yyvsp[0])); (yyval) = *seq; } #line 1436 "c-expr.c" /* yacc.c:1646 */ break; case 5: #line 235 "c-expr.y" /* yacc.c:1646 */ { (yyval) = ensure_bound (loc, (yyvsp[0])); } #line 1442 "c-expr.c" /* yacc.c:1646 */ break; case 7: #line 241 "c-expr.y" /* yacc.c:1646 */ { (yyval) = build_binary_op (UNKNOWN_LOCATION, MULT_EXPR, (yyvsp[-2]), (yyvsp[0]), 0); } #line 1450 "c-expr.c" /* yacc.c:1646 */ break; case 8: #line 244 "c-expr.y" /* yacc.c:1646 */ { (yyval) = build_binary_op (UNKNOWN_LOCATION, TRUNC_DIV_EXPR, (yyvsp[-2]), (yyvsp[0]), 0); } #line 1458 "c-expr.c" /* yacc.c:1646 */ break; case 11: #line 251 "c-expr.y" /* yacc.c:1646 */ { (yyval) = build_binary_op (UNKNOWN_LOCATION, PLUS_EXPR, (yyvsp[-2]), (yyvsp[0]), 0); } #line 1466 "c-expr.c" /* yacc.c:1646 */ break; case 12: #line 254 "c-expr.y" /* yacc.c:1646 */ { (yyval) = build_binary_op (UNKNOWN_LOCATION, MINUS_EXPR, (yyvsp[-2]), (yyvsp[0]), 0); } #line 1474 "c-expr.c" /* yacc.c:1646 */ break; case 15: #line 264 "c-expr.y" /* yacc.c:1646 */ { (yyval) = build_addr (ensure_bound (loc, (yyvsp[0])), current_function_decl); } #line 1482 "c-expr.c" /* yacc.c:1646 */ break; case 17: #line 271 "c-expr.y" /* yacc.c:1646 */ { #if 1 /* Build the array ref with proper error checking. */ (yyval) = build_array_ref (loc, ensure_bound (loc, (yyvsp[-3])), ensure_bound (loc, (yyvsp[-1]))); #else /* TIMTOWTDI */ (yyval) = build_indirect_ref (loc, build_binary_op (loc, PLUS_EXPR, ensure_bound (loc, (yyvsp[-3])), ensure_bound (loc, (yyvsp[-1])), 0), RO_ARRAY_INDEXING); #endif } #line 1498 "c-expr.c" /* yacc.c:1646 */ break; case 18: #line 282 "c-expr.y" /* yacc.c:1646 */ { (yyval) = build_component_ref (loc, ensure_bound (loc, (yyvsp[-2])), (yyvsp[-1])); } #line 1506 "c-expr.c" /* yacc.c:1646 */ break; case 19: #line 285 "c-expr.y" /* yacc.c:1646 */ { (yyval) = build_component_ref (loc, build_indirect_ref (loc, ensure_bound (loc, (yyvsp[-2])), RO_ARRAY_INDEXING), (yyvsp[-1])); } #line 1516 "c-expr.c" /* yacc.c:1646 */ break; case 23: #line 295 "c-expr.y" /* yacc.c:1646 */ { (yyval) = (yyvsp[-1]); } #line 1522 "c-expr.c" /* yacc.c:1646 */ break; case 24: #line 298 "c-expr.y" /* yacc.c:1646 */ { (yyval) = (yyvsp[0]); } #line 1528 "c-expr.c" /* yacc.c:1646 */ break; case 25: #line 301 "c-expr.y" /* yacc.c:1646 */ { (yyval) = (yyvsp[0]); } #line 1534 "c-expr.c" /* yacc.c:1646 */ break; #line 1538 "c-expr.c" /* yacc.c:1646 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires that yytoken be updated with the new translation. We take the approach of translating immediately before every use of yytoken. One alternative is translating here after every semantic action, but that translation would be missed if the semantic action invokes YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an incorrect destructor might then be invoked immediately. In the case of YYERROR or YYBACKUP, subsequent parser actions might lead to an incorrect destructor call or verbose syntax error message before the lookahead is translated. */ YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now 'shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*--------------------------------------. | yyerrlab -- here on detecting error. | `--------------------------------------*/ yyerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (loc, pragma, seq, YY_("syntax error")); #else # define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ yyssp, yytoken) { char const *yymsgp = YY_("syntax error"); int yysyntax_error_status; yysyntax_error_status = YYSYNTAX_ERROR; if (yysyntax_error_status == 0) yymsgp = yymsg; else if (yysyntax_error_status == 1) { if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); if (!yymsg) { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; yysyntax_error_status = 2; } else { yysyntax_error_status = YYSYNTAX_ERROR; yymsgp = yymsg; } } yyerror (loc, pragma, seq, yymsgp); if (yysyntax_error_status == 2) goto yyexhaustedlab; } # undef YYSYNTAX_ERROR #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval, loc, pragma, seq); yychar = YYEMPTY; } } /* Else will try to reuse lookahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (!yypact_value_is_default (yyn)) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp, loc, pragma, seq); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; YY_IGNORE_MAYBE_UNINITIALIZED_END /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #if !defined yyoverflow || YYERROR_VERBOSE /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (loc, pragma, seq, YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEMPTY) { /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = YYTRANSLATE (yychar); yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, loc, pragma, seq); } /* Do not reclaim the symbols of the rule whose action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp, loc, pragma, seq); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif return yyresult; } #line 304 "c-expr.y" /* yacc.c:1906 */ starpu-1.2.3+dfsg/gcc-plugin/src/c-expr.y000066400000000000000000000174631320135501600201700ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011, 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* Parser for simple C expressions in pragmas. */ %define api.pure %parse-param { location_t loc } %parse-param { const char *pragma } %parse-param { tree *seq } %debug %{ #include #include #include #include #include #ifdef HAVE_C_FAMILY_C_COMMON_H # include #elif HAVE_C_COMMON_H # include #endif #ifdef HAVE_C_FAMILY_C_PRAGMA_H # include #elif HAVE_C_PRAGMA_H # include #endif #include #if !HAVE_DECL_BUILD_ARRAY_REF /* This declaration is missing in GCC 4.6.1. */ extern tree build_array_ref (location_t loc, tree array, tree index); #endif #define YYSTYPE tree #define YYLTYPE location_t static void yyerror (location_t loc, const char *pragma, tree *seq, char const *message) { error_at (loc, "parse error in pragma %qs: %s", pragma, message); } /* Return SOMETHING if it's a VAR_DECL, an identifier bound to a VAR_DECL, or another object; raise an error otherwise. */ static tree ensure_bound (location_t loc, tree something) { gcc_assert (something != NULL_TREE); if (DECL_P (something)) return something; else if (TREE_CODE (something) == IDENTIFIER_NODE) { tree var = lookup_name (something); if (var == NULL_TREE) { error_at (loc, "unbound variable %qE", something); return error_mark_node; } else return var; } return something; } static tree build_component_ref (location_t loc, tree what, tree field) { sorry ("struct field access not implemented yet"); /* XXX */ return error_mark_node; } /* Interpret the string beneath CST, and return a new string constant. */ static tree interpret_string (const_tree cst) { gcc_assert (TREE_CODE (cst) == STRING_CST); cpp_string input, interpreted; input.text = (unsigned char *) TREE_STRING_POINTER (cst); input.len = TREE_STRING_LENGTH (cst); bool success; success = cpp_interpret_string (parse_in, &input, 1, &interpreted, CPP_STRING); gcc_assert (success); return build_string (interpreted.len, (char *) interpreted.text); } %} %code { /* Mapping of libcpp token names to Bison-generated token names. This is not ideal but Bison cannot be told to use the `enum cpp_ttype' values. */ #define STARPU_CPP_TOKENS \ TK (CPP_NAME) \ TK (CPP_NUMBER) \ TK (CPP_AND) \ TK (CPP_OPEN_SQUARE) \ TK (CPP_CLOSE_SQUARE) \ TK (CPP_OPEN_PAREN) \ TK (CPP_CLOSE_PAREN) \ TK (CPP_PLUS) \ TK (CPP_MINUS) \ TK (CPP_MULT) \ TK (CPP_DIV) \ TK (CPP_DOT) \ TK (CPP_DEREF) \ TK (CPP_STRING) #ifndef __cplusplus static const int cpplib_bison_token_map[] = { # define TK(x) [x] = Y ## x, STARPU_CPP_TOKENS # undef TK }; #else /* __cplusplus */ /* No designated initializers in C++. */ static int cpplib_bison_token_map[CPP_PADDING]; #endif /* __cplusplus */ static int yylex (YYSTYPE *lvalp) { int ret; enum cpp_ttype type; location_t loc; #ifdef __cplusplus if (cpplib_bison_token_map[CPP_NAME] != YCPP_NAME) { /* Initialize the table. */ # define TK(x) cpplib_bison_token_map[x] = Y ## x; STARPU_CPP_TOKENS # undef TK } #endif /* First check whether EOL is reached, because the EOL token needs to be left to the C parser. */ type = cpp_peek_token (parse_in, 0)->type; if (type == CPP_PRAGMA_EOL) ret = -1; else { /* Tell the lexer to not concatenate adjacent strings like cpp and `pragma_lex' normally do, because we want to be able to distinguish adjacent STRING_CST. */ type = c_lex_with_flags (lvalp, &loc, NULL, C_LEX_STRING_NO_JOIN); if (type == CPP_STRING) /* XXX: When using `C_LEX_STRING_NO_JOIN', `c_lex_with_flags' doesn't call `cpp_interpret_string', leaving us with an uninterpreted string (with quotes, etc.) This hack works around that. */ *lvalp = interpret_string (*lvalp); if (type < sizeof cpplib_bison_token_map / sizeof cpplib_bison_token_map[0]) ret = cpplib_bison_token_map[type]; else ret = -1; } return ret; } } %token YCPP_NAME "identifier" %token YCPP_NUMBER "integer" %token YCPP_AND "&" %token YCPP_OPEN_SQUARE "[" %token YCPP_CLOSE_SQUARE "]" %token YCPP_OPEN_PAREN "(" %token YCPP_CLOSE_PAREN ")" %token YCPP_PLUS "+" %token YCPP_MINUS "-" %token YCPP_MULT "*" %token YCPP_DIV "/" %token YCPP_DOT "." %token YCPP_DEREF "->" %token YCPP_STRING "string" %% /* Grammar rules. */ /* Always return a TREE_LIST rather than a raw chain, because the elements of that list may be already chained for other purposes---e.g., PARM_DECLs of a function are chained together. */ sequence: expression { gcc_assert (*seq == NULL_TREE); *seq = tree_cons (NULL_TREE, $1, NULL_TREE); $$ = *seq; } | expression sequence { gcc_assert ($2 == *seq); *seq = tree_cons (NULL_TREE, $1, $2); $$ = *seq; } ; expression: binary_expression ; /* XXX: `ensure_bound' below leads to errors raised even for non-significant arguments---e.g., junk after pragma. */ identifier: YCPP_NAME { $$ = ensure_bound (loc, $1); } ; binary_expression: additive_expression ; multiplicative_expression: multiplicative_expression YCPP_MULT cast_expression { $$ = build_binary_op (UNKNOWN_LOCATION, MULT_EXPR, $1, $3, 0); } | multiplicative_expression YCPP_DIV cast_expression { $$ = build_binary_op (UNKNOWN_LOCATION, TRUNC_DIV_EXPR, $1, $3, 0); } | cast_expression ; additive_expression: multiplicative_expression | additive_expression YCPP_PLUS multiplicative_expression { $$ = build_binary_op (UNKNOWN_LOCATION, PLUS_EXPR, $1, $3, 0); } | additive_expression YCPP_MINUS multiplicative_expression { $$ = build_binary_op (UNKNOWN_LOCATION, MINUS_EXPR, $1, $3, 0); } ; cast_expression: unary_expression /* XXX: No support for '(' TYPE-NAME ')' UNARY-EXPRESSION. */ ; unary_expression: postfix_expression | YCPP_AND cast_expression { $$ = build_addr (ensure_bound (loc, $2), current_function_decl); } ; postfix_expression: primary_expression | postfix_expression YCPP_OPEN_SQUARE expression YCPP_CLOSE_SQUARE { #if 1 /* Build the array ref with proper error checking. */ $$ = build_array_ref (loc, ensure_bound (loc, $1), ensure_bound (loc, $3)); #else /* TIMTOWTDI */ $$ = build_indirect_ref (loc, build_binary_op (loc, PLUS_EXPR, ensure_bound (loc, $1), ensure_bound (loc, $3), 0), RO_ARRAY_INDEXING); #endif } | postfix_expression YCPP_DOT identifier { $$ = build_component_ref (loc, ensure_bound (loc, $1), $2); } | postfix_expression YCPP_DEREF identifier { $$ = build_component_ref (loc, build_indirect_ref (loc, ensure_bound (loc, $1), RO_ARRAY_INDEXING), $2); } ; primary_expression: identifier | constant | string_literal | YCPP_OPEN_PAREN expression YCPP_CLOSE_PAREN { $$ = $2; } ; constant: YCPP_NUMBER { $$ = $1; } ; string_literal: YCPP_STRING { $$ = $1; } ; %% starpu-1.2.3+dfsg/gcc-plugin/src/opencl.c000066400000000000000000000477721320135501600202320ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ #include /* We must include starpu.h here, otherwise gcc will complain about a poisoned malloc in xmmintrin.h. */ #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_C_FAMILY_C_COMMON_H # include #elif HAVE_C_COMMON_H # include #endif #include #include #include #include #include /* Search path for OpenCL source files for the `opencl' pragma, as a `TREE_LIST'. */ tree opencl_include_dirs = NULL_TREE; /* Names of data structures defined in . */ static const char opencl_program_struct_tag[] = "starpu_opencl_program"; /* Return the type corresponding to OPENCL_PROGRAM_STRUCT_TAG. */ static tree opencl_program_type (void) { tree t = TREE_TYPE (type_decl_for_struct_tag (opencl_program_struct_tag)); if (TYPE_SIZE (t) == NULL_TREE) { /* Incomplete type definition, for instance because wasn't included. */ error_at (UNKNOWN_LOCATION, "StarPU OpenCL support is lacking"); t = error_mark_node; } return t; } static tree opencl_kernel_type (void) { tree t = lookup_name (get_identifier ("cl_kernel")); gcc_assert (t != NULL_TREE); if (TREE_CODE (t) == TYPE_DECL) t = TREE_TYPE (t); gcc_assert (TYPE_P (t)); return t; } static tree opencl_command_queue_type (void) { tree t = lookup_name (get_identifier ("cl_command_queue")); gcc_assert (t != NULL_TREE); if (TREE_CODE (t) == TYPE_DECL) t = TREE_TYPE (t); gcc_assert (TYPE_P (t)); return t; } static tree opencl_event_type (void) { tree t = lookup_name (get_identifier ("cl_event")); gcc_assert (t != NULL_TREE); if (TREE_CODE (t) == TYPE_DECL) t = TREE_TYPE (t); gcc_assert (TYPE_P (t)); return t; } /* Return a private global string literal VAR_DECL, whose contents are the LEN bytes at CONTENTS. */ static tree build_string_variable (location_t loc, const char *name_seed, const char *contents, size_t len) { tree decl; decl = build_decl (loc, VAR_DECL, create_tmp_var_name (name_seed), string_type_node); TREE_PUBLIC (decl) = false; TREE_STATIC (decl) = true; TREE_USED (decl) = true; DECL_INITIAL (decl) = /* XXX: off-by-one? */ build_string_literal (len + 1, contents); DECL_ARTIFICIAL (decl) = true; return decl; } /* Return a VAR_DECL for a string variable containing the contents of FILE, which is looked for in each of the directories listed in SEARCH_PATH. If FILE could not be found, return NULL_TREE. */ static tree build_variable_from_file_contents (location_t loc, const char *name_seed, const char *file, const_tree search_path) { gcc_assert (search_path != NULL_TREE && TREE_CODE (search_path) == TREE_LIST); int err, dir_fd; struct stat st; const_tree dirs; tree var = NULL_TREE; /* Look for FILE in each directory in SEARCH_PATH, and pick the first one that matches. */ for (err = ENOENT, dir_fd = -1, dirs = search_path; (err != 0 || err == ENOENT) && dirs != NULL_TREE; dirs = TREE_CHAIN (dirs)) { gcc_assert (TREE_VALUE (dirs) != NULL_TREE && TREE_CODE (TREE_VALUE (dirs)) == STRING_CST); dir_fd = open (TREE_STRING_POINTER (TREE_VALUE (dirs)), O_DIRECTORY | O_RDONLY); if (dir_fd < 0) err = ENOENT; else { err = fstatat (dir_fd, file, &st, 0); if (err != 0) close (dir_fd); else /* Leave DIRS unchanged so it can be referred to in diagnostics below. */ break; } } if (err != 0 || dir_fd < 0) error_at (loc, "failed to access %qs: %m", file); else if (st.st_size == 0) { error_at (loc, "source file %qs is empty", file); close (dir_fd); } else { if (verbose_output_p) inform (loc, "found file %qs in %qs", file, TREE_STRING_POINTER (TREE_VALUE (dirs))); int fd; fd = openat (dir_fd, file, O_RDONLY); close (dir_fd); if (fd < 0) error_at (loc, "failed to open %qs: %m", file); else { void *contents; contents = mmap (NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0); if (contents == NULL) error_at (loc, "failed to map contents of %qs: %m", file); else { var = build_string_variable (loc, name_seed, (char *) contents, st.st_size); pushdecl (var); munmap (contents, st.st_size); } close (fd); } } return var; } /* Return an expression that, given the OpenCL error code in ERROR_VAR, returns a string. */ static tree build_opencl_error_string (tree error_var) { static tree clstrerror_fn; LOOKUP_STARPU_FUNCTION (clstrerror_fn, "starpu_opencl_error_string"); return build_call_expr (clstrerror_fn, 1, error_var); } /* Return an error-checking `clSetKernelArg' call for argument ARG, at index IDX, of KERNEL. */ static tree build_opencl_set_kernel_arg_call (location_t loc, tree fn, tree kernel, unsigned int idx, tree arg) { gcc_assert (TREE_CODE (fn) == FUNCTION_DECL && TREE_TYPE (kernel) == opencl_kernel_type ()); static tree setkernarg_fn; LOOKUP_STARPU_FUNCTION (setkernarg_fn, "clSetKernelArg"); tree call = build_call_expr (setkernarg_fn, 4, kernel, build_int_cst (integer_type_node, idx), size_in_bytes (TREE_TYPE (arg)), build_addr (arg, fn)); tree error_var = build_decl (loc, VAR_DECL, create_tmp_var_name ("setkernelarg_error"), integer_type_node); DECL_ARTIFICIAL (error_var) = true; DECL_CONTEXT (error_var) = fn; tree assignment = build2 (INIT_EXPR, TREE_TYPE (error_var), error_var, call); /* Build `if (ERROR_VAR != 0) error ();'. */ tree cond; cond = build3 (COND_EXPR, void_type_node, build2 (NE_EXPR, boolean_type_node, error_var, integer_zero_node), build_error_statements (loc, error_var, build_opencl_error_string, "failed to set OpenCL kernel " "argument %d", idx), NULL_TREE); tree stmts = NULL_TREE; append_to_statement_list (assignment, &stmts); append_to_statement_list (cond, &stmts); return build4 (TARGET_EXPR, void_type_node, error_var, stmts, NULL_TREE, NULL_TREE); } /* Return the sequence of `clSetKernelArg' calls for KERNEL. */ static tree build_opencl_set_kernel_arg_calls (location_t loc, tree task_impl, tree kernel) { gcc_assert (task_implementation_p (task_impl)); size_t n; tree arg, stmts = NULL_TREE; for (arg = DECL_ARGUMENTS (task_impl), n = 0; arg != NULL_TREE; arg = TREE_CHAIN (arg), n++) { tree call = build_opencl_set_kernel_arg_call (loc, task_impl, kernel, n, arg); append_to_statement_list (call, &stmts); } return stmts; } /* Define a body for TASK_IMPL that loads OpenCL source from FILE and calls KERNEL. */ static void define_opencl_task_implementation (location_t loc, tree task_impl, const char *file, const_tree kernel, tree groupsize) { gcc_assert (task_implementation_p (task_impl) && task_implementation_where (task_impl) == STARPU_OPENCL); gcc_assert (TREE_CODE (kernel) == STRING_CST); gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (groupsize))); local_define (tree, local_var, (tree type)) { tree var = build_decl (loc, VAR_DECL, create_tmp_var_name ("opencl_var"), type); DECL_ARTIFICIAL (var) = true; DECL_CONTEXT (var) = task_impl; return var; }; if (!verbose_output_p) /* No further warnings for this node. */ TREE_NO_WARNING (task_impl) = true; static tree load_fn, load_kern_fn, enqueue_kern_fn, wid_fn, devid_fn, clfinish_fn, collect_stats_fn, release_ev_fn; if (load_fn == NULL_TREE) { load_fn = lookup_name (get_identifier ("starpu_opencl_load_opencl_from_string")); if (load_fn == NULL_TREE) { inform (loc, "no OpenCL support, task implementation %qE " "not generated", DECL_NAME (task_impl)); return; } } LOOKUP_STARPU_FUNCTION (load_kern_fn, "starpu_opencl_load_kernel"); LOOKUP_STARPU_FUNCTION (wid_fn, "starpu_worker_get_id"); LOOKUP_STARPU_FUNCTION (devid_fn, "starpu_worker_get_devid"); LOOKUP_STARPU_FUNCTION (enqueue_kern_fn, "clEnqueueNDRangeKernel"); LOOKUP_STARPU_FUNCTION (clfinish_fn, "clFinish"); LOOKUP_STARPU_FUNCTION (collect_stats_fn, "starpu_opencl_collect_stats"); LOOKUP_STARPU_FUNCTION (release_ev_fn, "clReleaseEvent"); if (verbose_output_p) inform (loc, "defining %qE, with OpenCL kernel %qs from file %qs", DECL_NAME (task_impl), TREE_STRING_POINTER (kernel), file); tree source_var; source_var = build_variable_from_file_contents (loc, "opencl_source", file, opencl_include_dirs); if (source_var != NULL_TREE) { /* Give TASK_IMPL an actual argument list. */ DECL_ARGUMENTS (task_impl) = build_function_arguments (task_impl); tree prog_var, prog_loaded_var; /* Global variable to hold the `starpu_opencl_program' object. */ prog_var = build_decl (loc, VAR_DECL, create_tmp_var_name ("opencl_program"), opencl_program_type ()); TREE_PUBLIC (prog_var) = false; TREE_STATIC (prog_var) = true; TREE_USED (prog_var) = true; DECL_ARTIFICIAL (prog_var) = true; pushdecl (prog_var); /* Global variable indicating whether the program has already been loaded. */ prog_loaded_var = build_decl (loc, VAR_DECL, create_tmp_var_name ("opencl_prog_loaded"), boolean_type_node); TREE_PUBLIC (prog_loaded_var) = false; TREE_STATIC (prog_loaded_var) = true; TREE_USED (prog_loaded_var) = true; DECL_ARTIFICIAL (prog_loaded_var) = true; DECL_INITIAL (prog_loaded_var) = build_zero_cst (boolean_type_node); pushdecl (prog_loaded_var); /* Build `starpu_opencl_load_opencl_from_string (SOURCE_VAR, &PROG_VAR, "")'. */ tree load = build_call_expr (load_fn, 3, source_var, build_addr (prog_var, task_impl), build_string_literal (1, "")); tree load_stmts = NULL_TREE; append_to_statement_list (load, &load_stmts); append_to_statement_list (build2 (MODIFY_EXPR, boolean_type_node, prog_loaded_var, build_int_cst (boolean_type_node, 1)), &load_stmts); /* Build `if (!PROG_LOADED_VAR) { ...; PROG_LOADED_VAR = true; }'. */ tree load_cond = build3 (COND_EXPR, void_type_node, prog_loaded_var, NULL_TREE, load_stmts); /* Local variables. */ tree kernel_var, queue_var, event_var, group_size_var, ngroups_var, error_var; kernel_var = local_var (opencl_kernel_type ()); queue_var = local_var (opencl_command_queue_type ()); event_var = local_var (opencl_event_type ()); group_size_var = local_var (size_type_node); ngroups_var = local_var (size_type_node); error_var = local_var (integer_type_node); /* Build `starpu_opencl_load_kernel (...)'. TODO: Check return value. */ tree devid = build_call_expr (devid_fn, 1, build_call_expr (wid_fn, 0)); tree load_kern = build_call_expr (load_kern_fn, 5, build_addr (kernel_var, task_impl), build_addr (queue_var, task_impl), build_addr (prog_var, task_impl), build_string_literal (TREE_STRING_LENGTH (kernel) + 1, TREE_STRING_POINTER (kernel)), devid); tree enqueue_kern = build_call_expr (enqueue_kern_fn, 9, queue_var, kernel_var, build_int_cst (integer_type_node, 1), null_pointer_node, build_addr (group_size_var, task_impl), build_addr (ngroups_var, task_impl), integer_zero_node, null_pointer_node, build_addr (event_var, task_impl)); tree enqueue_err = build2 (INIT_EXPR, TREE_TYPE (error_var), error_var, enqueue_kern); tree enqueue_cond = build3 (COND_EXPR, void_type_node, build2 (NE_EXPR, boolean_type_node, error_var, integer_zero_node), build_error_statements (loc, error_var, build_opencl_error_string, "failed to enqueue kernel"), NULL_TREE); tree clfinish = build_call_expr (clfinish_fn, 1, queue_var); tree collect_stats = build_call_expr (collect_stats_fn, 1, event_var); tree release_ev = build_call_expr (release_ev_fn, 1, event_var); tree enqueue_stmts = NULL_TREE; append_to_statement_list (enqueue_err, &enqueue_stmts); append_to_statement_list (enqueue_cond, &enqueue_stmts); /* TODO: Build `clFinish', `clReleaseEvent', & co. */ /* Put it all together. */ tree stmts = NULL_TREE; append_to_statement_list (load_cond, &stmts); append_to_statement_list (load_kern, &stmts); append_to_statement_list (build_opencl_set_kernel_arg_calls (loc, task_impl, kernel_var), &stmts); /* TODO: Support user-provided values. */ append_to_statement_list (build2 (INIT_EXPR, TREE_TYPE (group_size_var), group_size_var, fold_convert (TREE_TYPE (group_size_var), groupsize)), &stmts); append_to_statement_list (build2 (INIT_EXPR, TREE_TYPE (ngroups_var), ngroups_var, build_int_cst (TREE_TYPE (ngroups_var), 1)), &stmts); append_to_statement_list (build4 (TARGET_EXPR, void_type_node, error_var, enqueue_stmts, NULL_TREE, NULL_TREE), &stmts); append_to_statement_list (clfinish, &stmts); append_to_statement_list (collect_stats, &stmts); append_to_statement_list (release_ev, &stmts); /* Bind the local vars. */ tree vars = chain_trees (kernel_var, queue_var, event_var, group_size_var, ngroups_var, NULL_TREE); tree bind = build3 (BIND_EXPR, void_type_node, vars, stmts, build_block (vars, NULL_TREE, task_impl, NULL_TREE)); TREE_USED (task_impl) = true; TREE_STATIC (task_impl) = true; DECL_EXTERNAL (task_impl) = false; DECL_ARTIFICIAL (task_impl) = true; DECL_SAVED_TREE (task_impl) = bind; DECL_INITIAL (task_impl) = BIND_EXPR_BLOCK (bind); DECL_RESULT (task_impl) = build_decl (loc, RESULT_DECL, NULL_TREE, void_type_node); /* Compile TASK_IMPL. */ rest_of_decl_compilation (task_impl, true, 0); allocate_struct_function (task_impl, false); cgraph_finalize_function (task_impl, false); cgraph_mark_needed_node (cgraph_get_node (task_impl)); /* Generate a wrapper for TASK_IMPL, and possibly the body of its task. This needs to be done explicitly here, because otherwise `handle_pre_genericize' would never see TASK_IMPL's task. */ tree task = task_implementation_task (task_impl); if (!TREE_STATIC (task)) { declare_codelet (task); define_task (task); /* Compile TASK's body. */ rest_of_decl_compilation (task, true, 0); allocate_struct_function (task, false); cgraph_finalize_function (task, false); cgraph_mark_needed_node (cgraph_get_node (task)); } } else DECL_SAVED_TREE (task_impl) = error_mark_node; return; } /* Handle the `opencl' pragma, which defines an OpenCL task implementation. */ void handle_pragma_opencl (struct cpp_reader *reader) { tree args; location_t loc; loc = cpp_peek_token (reader, 0)->src_loc; if (current_function_decl != NULL_TREE) { error_at (loc, "% pragma can only be used " "at the top-level"); return; } args = read_pragma_expressions ("opencl", loc); if (args == NULL_TREE) return; /* TODO: Add "number of groups" arguments. */ if (list_length (args) < 4) { error_at (loc, "wrong number of arguments for % pragma"); return; } if (task_implementation_p (TREE_VALUE (args))) { tree task_impl = TREE_VALUE (args); if (task_implementation_where (task_impl) == STARPU_OPENCL) { args = TREE_CHAIN (args); if (TREE_CODE (TREE_VALUE (args)) == STRING_CST) { tree file = TREE_VALUE (args); args = TREE_CHAIN (args); if (TREE_CODE (TREE_VALUE (args)) == STRING_CST) { tree kernel = TREE_VALUE (args); args = TREE_CHAIN (args); if (TREE_TYPE (TREE_VALUE (args)) != NULL_TREE && INTEGRAL_TYPE_P (TREE_TYPE (TREE_VALUE (args)))) { tree groupsize = TREE_VALUE (args); if (TREE_CHAIN (args) == NULL_TREE) define_opencl_task_implementation (loc, task_impl, TREE_STRING_POINTER (file), kernel, groupsize); else error_at (loc, "junk after % pragma"); } else error_at (loc, "% argument must be an integral type"); } else error_at (loc, "% argument must be a string constant"); } else error_at (loc, "% argument must be a string constant"); } else error_at (loc, "%qE is not an OpenCL task implementation", DECL_NAME (task_impl)); } else error_at (loc, "%qE is not a task implementation", TREE_VALUE (args)); } /* Diagnose use of C types that are either nonexistent or different in OpenCL. */ void validate_opencl_argument_type (location_t loc, const_tree type) { /* When TYPE is a pointer type, get to the base element type. */ for (; POINTER_TYPE_P (type); type = TREE_TYPE (type)); if (!RECORD_OR_UNION_TYPE_P (type) && !VOID_TYPE_P (type)) { tree decl = TYPE_NAME (type); if (DECL_P (decl)) { static const struct { const char *c; const char *cl; } type_map[] = { /* Scalar types defined in OpenCL 1.2. See . */ { "char", "cl_char" }, { "signed char", "cl_char" }, { "unsigned char", "cl_uchar" }, { "uchar", "cl_uchar" }, { "short int", "cl_short" }, { "unsigned short", "cl_ushort" }, { "int", "cl_int" }, { "unsigned int", "cl_uint" }, { "uint", "cl_uint" }, { "long int", "cl_long" }, { "long unsigned int", "cl_ulong" }, { "ulong", "cl_ulong" }, { "float", "cl_float" }, { "double", "cl_double" }, { NULL, NULL } }; const char *c_name = IDENTIFIER_POINTER (DECL_NAME (decl)); const char *cl_name = ({ size_t i; for (i = 0; type_map[i].c != NULL; i++) { if (strcmp (type_map[i].c, c_name) == 0) break; } type_map[i].cl; }); if (cl_name != NULL) { tree cl_type = lookup_name (get_identifier (cl_name)); if (cl_type != NULL_TREE) { if (DECL_P (cl_type)) cl_type = TREE_TYPE (cl_type); if (!lang_hooks.types_compatible_p ((tree) type, cl_type)) { tree st, sclt; st = c_common_signed_type ((tree) type); sclt = c_common_signed_type (cl_type); if (st == sclt) warning_at (loc, 0, "C type %qE differs in signedness " "from the same-named OpenCL type", DECL_NAME (decl)); else /* TYPE should be avoided because the it differs from CL_TYPE, and thus cannot be used safely in `clSetKernelArg'. */ warning_at (loc, 0, "C type %qE differs from the " "same-named OpenCL type", DECL_NAME (decl)); } } /* Otherwise we can't conclude. It could be that wasn't included in the program, for instance. */ } else /* Recommend against use of `size_t', etc. */ warning_at (loc, 0, "%qE does not correspond to a known " "OpenCL type", DECL_NAME (decl)); } } } starpu-1.2.3+dfsg/gcc-plugin/src/starpu.c000066400000000000000000001425501320135501600202560ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011, 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* Use extensions of the GNU C Library. */ #define _GNU_SOURCE 1 #include /* We must include starpu.h here, otherwise gcc will complain about a poisoned malloc in xmmintrin.h. */ #include /* for `STARPU_CPU' & co. */ /* #define ENABLE_TREE_CHECKING 1 */ #include #include #include #include #include #include #include /* for `optimize' */ #ifdef HAVE_C_FAMILY_C_COMMON_H # include #elif HAVE_C_COMMON_H # include #endif #ifdef HAVE_C_FAMILY_C_PRAGMA_H # include #elif HAVE_C_PRAGMA_H # include #endif #include #include #include #include #include #include #include #include #include #include #include /* Don't include the dreaded proprietary headers that we don't need anyway. In particular, this waives the obligation to reproduce their silly disclaimer. */ #define STARPU_DONT_INCLUDE_CUDA_HEADERS #ifndef STRINGIFY # define STRINGIFY_(x) # x # define STRINGIFY(x) STRINGIFY_ (x) #endif #ifdef __cplusplus extern "C" { #endif /* Declared with `C' linkage in . */ int plugin_is_GPL_compatible; /* The name of this plug-in. */ static const char plugin_name[] = "starpu"; /* Names of public attributes. */ static const char heap_allocated_attribute_name[] = "heap_allocated"; static const char registered_attribute_name[] = "registered"; /* Names of attributes used internally. */ static const char heap_allocated_orig_type_attribute_name[] = ".heap_allocated_original_type"; /* Cached function declarations. */ static tree unpack_fn; /* Targets supported by GCC-StarPU. */ static int supported_targets = 0 #ifdef STARPU_USE_CPU | STARPU_CPU #endif #ifdef STARPU_USE_CUDA | STARPU_CUDA #endif #ifdef STARPU_USE_OPENCL | STARPU_OPENCL #endif ; /* Forward declarations. */ static tree build_cpu_codelet_identifier (const_tree task); static bool implicit_cpu_task_implementation_p (const_tree fn); static bool heap_allocated_p (const_tree var_decl); static bool registered_p (const_tree var_decl); /* Compile-time assertions. */ #if STARPU_GNUC_PREREQ (4, 6) # define verify(cond, msg) _Static_assert ((cond), msg) #else # define verify(cond, msg) assert (cond); #endif /* Helpers. */ /* Return POINTER plus OFFSET, where OFFSET is in bytes. */ static tree pointer_plus (tree pointer, size_t offset) { gcc_assert (POINTER_TYPE_P (TREE_TYPE (pointer))); if (offset == 0) return pointer; else return build_binary_op (UNKNOWN_LOCATION, PLUS_EXPR, pointer, build_int_cstu (integer_type_node, offset), false); } /* Build a reference to the INDEXth element of ARRAY. `build_array_ref' is not exported, so we roll our own. FIXME: This version may not work for array types and doesn't do as much type-checking as `build_array_ref'. */ static tree array_ref (tree array, size_t index) { gcc_assert (POINTER_TYPE_P (TREE_TYPE (array))); return build_indirect_ref (UNKNOWN_LOCATION, pointer_plus (array, index), RO_ARRAY_INDEXING); } /* Return the number of elements of ARRAY_TYPE, or NULL_TREE if ARRAY_TYPE is an incomplete type. */ static tree array_type_element_count (location_t loc, const_tree array_type) { gcc_assert (TREE_CODE (array_type) == ARRAY_TYPE); tree count, domain = TYPE_DOMAIN (array_type); if (domain != NULL_TREE) { count = build_binary_op (loc, MINUS_EXPR, TYPE_MAX_VALUE (domain), TYPE_MIN_VALUE (domain), false); count = build_binary_op (loc, PLUS_EXPR, count, build_int_cstu (integer_type_node, 1), false); count = fold_convert (size_type_node, count); } else count = NULL_TREE; return count; } /* Debugging helpers. */ static tree build_printf (const char *, ...) __attribute__ ((format (printf, 1, 2))); static tree build_printf (const char *fmt, ...) { tree call; char *str; va_list args; va_start (args, fmt); vasprintf (&str, fmt, args); call = build_call_expr (builtin_decl_explicit (BUILT_IN_PUTS), 1, build_string_literal (strlen (str) + 1, str)); free (str); va_end (args); return call; } static tree build_hello_world (void) { return build_printf ("Hello, StarPU!"); } /* Pragmas. */ #define STARPU_PRAGMA_NAME_SPACE "starpu" static void handle_pragma_hello (struct cpp_reader *reader) { add_stmt (build_hello_world ()); } /* Process `#pragma starpu initialize'. TODO: Parse and initialize some of the fields of `starpu_conf'. */ static void handle_pragma_initialize (struct cpp_reader *reader) { static tree init_fn; LOOKUP_STARPU_FUNCTION (init_fn, "starpu_init"); location_t loc = cpp_peek_token (reader, 0)->src_loc; /* Call `starpu_init (NULL)'. */ tree init = build_call_expr (init_fn, 1, build_zero_cst (ptr_type_node)); /* Introduce a local variable to hold the error code. */ tree error_var = build_decl (loc, VAR_DECL, create_tmp_var_name (".initialize_error"), integer_type_node); DECL_CONTEXT (error_var) = current_function_decl; DECL_ARTIFICIAL (error_var) = true; tree assignment = build2 (INIT_EXPR, TREE_TYPE (error_var), error_var, init); tree cond = build3 (COND_EXPR, void_type_node, build2 (NE_EXPR, boolean_type_node, error_var, integer_zero_node), build_error_statements (loc, error_var, build_starpu_error_string, "failed to initialize StarPU"), NULL_TREE); tree stmts = NULL_TREE; append_to_statement_list (assignment, &stmts); append_to_statement_list (cond, &stmts); tree bind = build3 (BIND_EXPR, void_type_node, error_var, stmts, NULL_TREE); add_stmt (bind); } /* Process `#pragma starpu shutdown'. */ static void handle_pragma_shutdown (struct cpp_reader *reader) { static tree shutdown_fn; LOOKUP_STARPU_FUNCTION (shutdown_fn, "starpu_shutdown"); tree token; if (pragma_lex (&token) != CPP_EOF) error_at (cpp_peek_token (reader, 0)->src_loc, "junk after % pragma"); else /* Call `starpu_shutdown ()'. */ add_stmt (build_call_expr (shutdown_fn, 0)); } static void handle_pragma_wait (struct cpp_reader *reader) { if (task_implementation_p (current_function_decl)) { location_t loc; loc = cpp_peek_token (reader, 0)->src_loc; /* TODO: In the future we could generate a task for the continuation and have it depend on what's before here. */ error_at (loc, "task implementation is not allowed to wait"); } else { tree fndecl; fndecl = lookup_name (get_identifier ("starpu_task_wait_for_all")); gcc_assert (TREE_CODE (fndecl) == FUNCTION_DECL); add_stmt (build_call_expr (fndecl, 0)); } } /* Build a `starpu_vector_data_register' call for the COUNT elements pointed to by POINTER. */ static tree build_data_register_call (location_t loc, tree pointer, tree count) { tree pointer_type = TREE_TYPE (pointer); gcc_assert ((TREE_CODE (pointer_type) == ARRAY_TYPE && TYPE_DOMAIN (pointer_type) != NULL_TREE) || POINTER_TYPE_P (pointer_type)); gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (count))); static tree register_fn; LOOKUP_STARPU_FUNCTION (register_fn, "starpu_vector_data_register"); /* Introduce a local variable to hold the handle. */ tree handle_var = build_decl (loc, VAR_DECL, create_tmp_var_name (".handle"), ptr_type_node); DECL_CONTEXT (handle_var) = current_function_decl; DECL_ARTIFICIAL (handle_var) = true; DECL_INITIAL (handle_var) = NULL_TREE; /* If PTR is an array, take its address. */ tree actual_pointer = POINTER_TYPE_P (pointer_type) ? pointer : build_addr (pointer, current_function_decl); /* Build `starpu_vector_data_register (&HANDLE_VAR, 0, POINTER, COUNT, sizeof *POINTER)' */ tree call = build_call_expr (register_fn, 5, build_addr (handle_var, current_function_decl), build_zero_cst (uintptr_type_node), /* home node */ actual_pointer, count, size_in_bytes (TREE_TYPE (pointer_type))); return build3 (BIND_EXPR, void_type_node, handle_var, call, NULL_TREE); } /* Return a `starpu_data_unregister' call for VAR. */ static tree build_data_unregister_call (location_t loc, tree var) { static tree unregister_fn; LOOKUP_STARPU_FUNCTION (unregister_fn, "starpu_data_unregister"); /* If VAR is an array, take its address. */ tree pointer = POINTER_TYPE_P (TREE_TYPE (var)) ? var : build_addr (var, current_function_decl); /* Call `starpu_data_unregister (starpu_data_lookup (ptr))'. */ return build_call_expr (unregister_fn, 1, build_pointer_lookup (pointer)); } /* Process `#pragma starpu register VAR [COUNT]' and emit the corresponding `starpu_vector_data_register' call. */ static void handle_pragma_register (struct cpp_reader *reader) { tree args, ptr, count_arg; location_t loc; loc = cpp_peek_token (reader, 0)->src_loc; args = read_pragma_expressions ("register", loc); if (args == NULL_TREE) /* Parse error, presumably already handled by the parser. */ return; /* First argument should be a pointer expression. */ ptr = TREE_VALUE (args); args = TREE_CHAIN (args); if (ptr == error_mark_node) return; tree ptr_type; if (DECL_P (ptr)) { tree heap_attr = lookup_attribute (heap_allocated_orig_type_attribute_name, DECL_ATTRIBUTES (ptr)); if (heap_attr != NULL_TREE) /* PTR is `heap_allocated' so use its original array type to determine its size. */ ptr_type = TREE_VALUE (heap_attr); else ptr_type = TREE_TYPE (ptr); } else ptr_type = TREE_TYPE (ptr); if (ptr_type == NULL_TREE) { /* PTR is a type-less thing, such as a STRING_CST. */ error_at (loc, "invalid % argument"); return; } if (!POINTER_TYPE_P (ptr_type) && TREE_CODE (ptr_type) != ARRAY_TYPE) { error_at (loc, "%qE is neither a pointer nor an array", ptr); return; } /* Since we implicitly use sizeof (*PTR), `void *' is not allowed. */ if (VOID_TYPE_P (TREE_TYPE (ptr_type))) { error_at (loc, "pointers to % not allowed " "in % pragma"); return; } TREE_USED (ptr) = true; #ifdef DECL_READ_P if (DECL_P (ptr)) DECL_READ_P (ptr) = true; #endif if (TREE_CODE (ptr_type) == ARRAY_TYPE && !DECL_EXTERNAL (ptr) && !TREE_STATIC (ptr) && !(TREE_CODE (ptr) == VAR_DECL && heap_allocated_p (ptr)) && !MAIN_NAME_P (DECL_NAME (current_function_decl))) warning_at (loc, 0, "using an on-stack array as a task input " "considered unsafe"); /* Determine the number of elements in the vector. */ tree count = NULL_TREE; if (TREE_CODE (ptr_type) == ARRAY_TYPE) count = array_type_element_count (loc, ptr_type); /* Second argument is optional but should be an integer. */ count_arg = (args == NULL_TREE) ? NULL_TREE : TREE_VALUE (args); if (args != NULL_TREE) args = TREE_CHAIN (args); if (count_arg == NULL_TREE) { /* End of line reached: check whether the array size was determined. */ if (count == NULL_TREE) { error_at (loc, "cannot determine size of array %qE", ptr); return; } } else if (count_arg == error_mark_node) /* COUNT_ARG could not be parsed and an error was already reported. */ return; else if (!INTEGRAL_TYPE_P (TREE_TYPE (count_arg))) { error_at (loc, "%qE is not an integer", count_arg); return; } else { TREE_USED (count_arg) = true; #ifdef DECL_READ_P if (DECL_P (count_arg)) DECL_READ_P (count_arg) = true; #endif if (count != NULL_TREE) { /* The number of elements of this array was already determined. */ inform (loc, "element count can be omitted for bounded array %qE", ptr); if (count_arg != NULL_TREE) { if (TREE_CODE (count_arg) == INTEGER_CST) { if (!tree_int_cst_equal (count, count_arg)) error_at (loc, "specified element count differs " "from actual size of array %qE", ptr); } else /* Using a variable to determine the array size whereas the array size is actually known statically. This looks like unreasonable code, so error out. */ error_at (loc, "determining array size at run-time " "although array size is known at compile-time"); } } else count = count_arg; } /* Any remaining args? */ if (args != NULL_TREE) error_at (loc, "junk after % pragma"); /* Add a data register call. */ add_stmt (build_data_register_call (loc, ptr, count)); } /* Process `#pragma starpu acquire VAR' and emit the corresponding `starpu_data_acquire' call. */ static void handle_pragma_acquire (struct cpp_reader *reader) { static tree acquire_fn; LOOKUP_STARPU_FUNCTION (acquire_fn, "starpu_data_acquire"); tree args, var; location_t loc; loc = cpp_peek_token (reader, 0)->src_loc; args = read_pragma_expressions ("acquire", loc); if (args == NULL_TREE) return; var = TREE_VALUE (args); if (var == error_mark_node) return; else if (TREE_CODE (TREE_TYPE (var)) != POINTER_TYPE && TREE_CODE (TREE_TYPE (var)) != ARRAY_TYPE) { error_at (loc, "%qE is neither a pointer nor an array", var); return; } else if (TREE_CHAIN (args) != NULL_TREE) error_at (loc, "junk after % pragma"); /* If VAR is an array, take its address. */ tree pointer = POINTER_TYPE_P (TREE_TYPE (var)) ? var : build_addr (var, current_function_decl); /* Call `starpu_data_acquire (starpu_data_lookup (ptr), STARPU_RW)'. TODO: Support modes other than RW. */ add_stmt (build_call_expr (acquire_fn, 2, build_pointer_lookup (pointer), build_int_cst (integer_type_node, STARPU_RW))); } /* Process `#pragma starpu release VAR' and emit the corresponding `starpu_data_release' call. */ static void handle_pragma_release (struct cpp_reader *reader) { static tree release_fn; LOOKUP_STARPU_FUNCTION (release_fn, "starpu_data_release"); tree args, var; location_t loc; loc = cpp_peek_token (reader, 0)->src_loc; args = read_pragma_expressions ("release", loc); if (args == NULL_TREE) return; var = TREE_VALUE (args); if (var == error_mark_node) return; else if (TREE_CODE (TREE_TYPE (var)) != POINTER_TYPE && TREE_CODE (TREE_TYPE (var)) != ARRAY_TYPE) { error_at (loc, "%qE is neither a pointer nor an array", var); return; } else if (TREE_CHAIN (args) != NULL_TREE) error_at (loc, "junk after % pragma"); /* If VAR is an array, take its address. */ tree pointer = POINTER_TYPE_P (TREE_TYPE (var)) ? var : build_addr (var, current_function_decl); /* Call `starpu_data_release (starpu_data_lookup (ptr))'. */ add_stmt (build_call_expr (release_fn, 1, build_pointer_lookup (pointer))); } /* Process `#pragma starpu unregister VAR' and emit the corresponding `starpu_data_unregister' call. */ static void handle_pragma_unregister (struct cpp_reader *reader) { tree args, var; location_t loc; loc = cpp_peek_token (reader, 0)->src_loc; args = read_pragma_expressions ("unregister", loc); if (args == NULL_TREE) return; var = TREE_VALUE (args); if (var == error_mark_node) return; else if (TREE_CODE (TREE_TYPE (var)) != POINTER_TYPE && TREE_CODE (TREE_TYPE (var)) != ARRAY_TYPE) { error_at (loc, "%qE is neither a pointer nor an array", var); return; } else if (TREE_CHAIN (args) != NULL_TREE) error_at (loc, "junk after % pragma"); add_stmt (build_data_unregister_call (loc, var)); } /* Handle the `debug_tree' pragma (for debugging purposes.) */ static void handle_pragma_debug_tree (struct cpp_reader *reader) { tree args, obj; location_t loc; loc = cpp_peek_token (reader, 0)->src_loc; args = read_pragma_expressions ("debug_tree", loc); if (args == NULL_TREE) /* Parse error, presumably already handled by the parser. */ return; obj = TREE_VALUE (args); args = TREE_CHAIN (args); if (obj == error_mark_node) return; if (args != NULL_TREE) warning_at (loc, 0, "extraneous arguments ignored"); inform (loc, "debug_tree:"); debug_tree (obj); printf ("\n"); } /* Handle the `#pragma starpu add_target TARGET', which tells GCC-StarPU to consider TARGET ("cpu", "opencl", etc.) as supported. This pragma is undocumented and only meant to be used for testing purposes. */ static void handle_pragma_add_target (struct cpp_reader *reader) { tree args, obj; location_t loc; loc = cpp_peek_token (reader, 0)->src_loc; args = read_pragma_expressions ("add_target", loc); if (args == NULL_TREE) /* Parse error, presumably already handled by the parser. */ return; obj = TREE_VALUE (args); args = TREE_CHAIN (args); if (obj == error_mark_node) return; if (args != NULL_TREE) warning_at (loc, 0, "extraneous arguments ignored"); if (TREE_CODE (obj) == STRING_CST) { int new_target = task_implementation_target_to_int (obj); if (obj == 0) error_at (loc, "unsupported target %qE", obj); else supported_targets |= new_target; } else error_at (loc, "expecting string literal"); } static void register_pragmas (void *gcc_data, void *user_data) { c_register_pragma (STARPU_PRAGMA_NAME_SPACE, "hello", handle_pragma_hello); c_register_pragma (STARPU_PRAGMA_NAME_SPACE, "debug_tree", handle_pragma_debug_tree); c_register_pragma (STARPU_PRAGMA_NAME_SPACE, "add_target", handle_pragma_add_target); c_register_pragma_with_expansion (STARPU_PRAGMA_NAME_SPACE, "initialize", handle_pragma_initialize); c_register_pragma (STARPU_PRAGMA_NAME_SPACE, "wait", handle_pragma_wait); c_register_pragma_with_expansion (STARPU_PRAGMA_NAME_SPACE, "register", handle_pragma_register); c_register_pragma_with_expansion (STARPU_PRAGMA_NAME_SPACE, "acquire", handle_pragma_acquire); c_register_pragma_with_expansion (STARPU_PRAGMA_NAME_SPACE, "release", handle_pragma_release); c_register_pragma_with_expansion (STARPU_PRAGMA_NAME_SPACE, "unregister", handle_pragma_unregister); c_register_pragma_with_expansion (STARPU_PRAGMA_NAME_SPACE, "opencl", handle_pragma_opencl); c_register_pragma (STARPU_PRAGMA_NAME_SPACE, "shutdown", handle_pragma_shutdown); } /* Attributes. */ /* Handle the `task' function attribute. */ static tree handle_task_attribute (tree *node, tree name, tree args, int flags, bool *no_add_attrs) { tree fn; fn = *node; /* Get rid of the `task' attribute by default so that FN isn't further processed when it's erroneous. */ *no_add_attrs = true; if (TREE_CODE (fn) != FUNCTION_DECL) error_at (DECL_SOURCE_LOCATION (fn), "% attribute only applies to functions"); else { if (!VOID_TYPE_P (TREE_TYPE (TREE_TYPE (fn)))) /* Raise an error but keep going to avoid spitting out too many errors at the user's face. */ error_at (DECL_SOURCE_LOCATION (fn), "task return type must be %"); if (count (pointer_type_p, TYPE_ARG_TYPES (TREE_TYPE (fn))) > STARPU_NMAXBUFS) error_at (DECL_SOURCE_LOCATION (fn), "maximum number of pointer parameters exceeded"); /* Turn FN into an actual task. */ taskify_function (fn); } /* Lookup & cache function declarations for later reuse. */ LOOKUP_STARPU_FUNCTION (unpack_fn, "starpu_codelet_unpack_args"); return NULL_TREE; } /* Handle the `task_implementation (WHERE, TASK)' attribute. WHERE is a string constant ("cpu", "cuda", etc.), and TASK is the identifier of a function declared with the `task' attribute. */ static tree handle_task_implementation_attribute (tree *node, tree name, tree args, int flags, bool *no_add_attrs) { location_t loc; tree fn, where, task_decl; /* FIXME:TODO: To change the order to (TASK, WHERE): tree cleanup_id = TREE_VALUE (TREE_VALUE (attr)); tree cleanup_decl = lookup_name (cleanup_id); */ fn = *node; where = TREE_VALUE (args); task_decl = TREE_VALUE (TREE_CHAIN (args)); if (implicit_cpu_task_implementation_p (task_decl)) /* TASK_DECL is actually a CPU implementation. Implicit CPU task implementations can lead to this situation, because the task is renamed and modified to become a CPU implementation. */ task_decl = task_implementation_task (task_decl); loc = DECL_SOURCE_LOCATION (fn); /* Get rid of the `task_implementation' attribute by default so that FN isn't further processed when it's erroneous. */ *no_add_attrs = true; /* Mark FN as used to placate `-Wunused-function' when FN is erroneous anyway. */ TREE_USED (fn) = true; if (TREE_CODE (fn) != FUNCTION_DECL) error_at (loc, "% attribute only applies to functions"); else if (TREE_CODE (where) != STRING_CST) error_at (loc, "string constant expected " "as the first % argument"); else if (TREE_CODE (task_decl) != FUNCTION_DECL) error_at (loc, "%qE is not a function", task_decl); else if (lookup_attribute (task_attribute_name, DECL_ATTRIBUTES (task_decl)) == NULL_TREE) error_at (loc, "function %qE lacks the % attribute", DECL_NAME (task_decl)); else if (TYPE_CANONICAL (TREE_TYPE (fn)) != TYPE_CANONICAL (TREE_TYPE (task_decl))) error_at (loc, "type differs from that of task %qE", DECL_NAME (task_decl)); else { /* Add FN to the list of implementations of TASK_DECL. */ add_task_implementation (task_decl, fn, where); /* Keep the attribute. */ *no_add_attrs = false; } return NULL_TREE; } /* Return true when VAR is an automatic variable with complete array type; otherwise, return false, and emit error messages mentioning ATTRIBUTE. */ static bool automatic_array_variable_p (const char *attribute, tree var) { gcc_assert (TREE_CODE (var) == VAR_DECL); location_t loc; loc = DECL_SOURCE_LOCATION (var); if (DECL_EXTERNAL (var)) error_at (loc, "attribute %qs cannot be used on external declarations", attribute); else if (TREE_PUBLIC (var) || TREE_STATIC (var)) { error_at (loc, "attribute %qs cannot be used on global variables", attribute); TREE_TYPE (var) = error_mark_node; } else if (TREE_CODE (TREE_TYPE (var)) != ARRAY_TYPE) { error_at (loc, "variable %qE must have an array type", DECL_NAME (var)); TREE_TYPE (var) = error_mark_node; } else if (TYPE_SIZE (TREE_TYPE (var)) == NULL_TREE) { error_at (loc, "variable %qE has an incomplete array type", DECL_NAME (var)); TREE_TYPE (var) = error_mark_node; } else return true; return false; } /* Handle the `heap_allocated' attribute on variable *NODE. */ static tree handle_heap_allocated_attribute (tree *node, tree name, tree args, int flags, bool *no_add_attrs) { tree var = *node; if (automatic_array_variable_p (heap_allocated_attribute_name, var)) { /* Turn VAR into a pointer that feels like an array. This is what's done for PARM_DECLs that have an array type. */ location_t loc = DECL_SOURCE_LOCATION (var); tree array_type = TREE_TYPE (var); tree element_type = TREE_TYPE (array_type); tree pointer_type = build_pointer_type (element_type); /* Keep a copy of VAR's original type. */ DECL_ATTRIBUTES (var) = tree_cons (get_identifier (heap_allocated_orig_type_attribute_name), array_type, DECL_ATTRIBUTES (var)); TREE_TYPE (var) = pointer_type; DECL_SIZE (var) = TYPE_SIZE (pointer_type); DECL_SIZE_UNIT (var) = TYPE_SIZE_UNIT (pointer_type); DECL_ALIGN (var) = TYPE_ALIGN (pointer_type); DECL_USER_ALIGN (var) = false; DECL_MODE (var) = TYPE_MODE (pointer_type); tree malloc_fn = lookup_name (get_identifier ("starpu_malloc")); gcc_assert (malloc_fn != NULL_TREE); tree alloc = build_call_expr (malloc_fn, 2, build_addr (var, current_function_decl), TYPE_SIZE_UNIT (array_type)); TREE_SIDE_EFFECTS (alloc) = true; /* Add a destructor for VAR. Instead of consing the `cleanup' attribute for VAR, directly use `push_cleanup'. This guarantees that CLEANUP_ID is looked up in the right context, and allows us to pass VAR directly to `starpu_free', instead of `&VAR'. TODO: Provide a way to disable this. */ static tree cleanup_decl; LOOKUP_STARPU_FUNCTION (cleanup_decl, "starpu_free"); if (registered_p (var)) { /* A `registered' attribute has already been processed, and thus a cleanup for it has been pushed. However, we want that cleanup to appear before ours, and our allocation to appear before the registration, so swap them. */ tree_stmt_iterator it; tree parent, try_finally, registration; #ifdef stmt_list_stack # ifdef VEC_index /* 4.7 */ gcc_assert (VEC_length (tree, stmt_list_stack) > 1); parent = VEC_index (tree, stmt_list_stack, VEC_length (tree, stmt_list_stack) - 2); # else # error not ported to 4.8! # endif #else /* 4.6 and before */ parent = TREE_CHAIN (cur_stmt_list); #endif gcc_assert (parent != NULL_TREE && TREE_CODE (parent) == STATEMENT_LIST); it = tsi_last (parent); try_finally = tsi_stmt (it); gcc_assert (TREE_CODE (try_finally) == TRY_FINALLY_EXPR); tsi_prev (&it); registration = build_data_register_call (loc, var, array_type_element_count (loc, array_type)); add_stmt (registration); *tsi_stmt_ptr (it) = alloc; push_cleanup (var, build_data_unregister_call (loc, var), false); TREE_OPERAND (try_finally, 1) = build_call_expr (cleanup_decl, 1, var); } else { /* Push the allocation and cleanup in order. */ add_stmt (alloc); push_cleanup (var, build_call_expr (cleanup_decl, 1, var), false); } /* Keep the attribute. */ *no_add_attrs = false; } return NULL_TREE; } /* Handle the `registered' attribute on variable *NODE. */ static tree handle_registered_attribute (tree *node, tree name, tree args, int flags, bool *no_add_attrs) { location_t loc; tree var = *node; loc = DECL_SOURCE_LOCATION (var); bool heap_p = heap_allocated_p (var); /* When VAR has the `heap_allocated' attribute, we know it has a complete array type. */ if (heap_p || automatic_array_variable_p (registered_attribute_name, var)) { /* FIXME: This warning cannot be emitted here, because the `heap_allocated' attribute may be processed later. */ /* if (!heap_p */ /* && !MAIN_NAME_P (DECL_NAME (current_function_decl))) */ /* warning_at (loc, 0, "using an on-stack array as a task input " */ /* "considered unsafe"); */ tree ptr_type, heap_attr = lookup_attribute (heap_allocated_orig_type_attribute_name, DECL_ATTRIBUTES (var)); if (heap_attr != NULL_TREE) /* PTR is `heap_allocated' so use its original array type to determine its size. */ ptr_type = TREE_VALUE (heap_attr); else ptr_type = TREE_TYPE (var); tree count = array_type_element_count (loc, ptr_type); add_stmt (build_data_register_call (loc, var, count)); push_cleanup (var, build_data_unregister_call (DECL_SOURCE_LOCATION (var), var), false); } return NULL_TREE; } /* Handle the `output' attribute on type *NODE, which should be the type of a PARM_DECL of a task or task implementation. */ static tree handle_output_attribute (tree *node, tree name, tree args, int flags, bool *no_add_attrs) { tree type = *node; gcc_assert (TYPE_P (type)); if (!POINTER_TYPE_P (type) && TREE_CODE (type) != ARRAY_TYPE) error ("% attribute not allowed for non-pointer types"); else /* Keep the attribute. */ *no_add_attrs = false; return NULL_TREE; } /* Return true when FN is an implicit CPU task implementation. */ static bool implicit_cpu_task_implementation_p (const_tree fn) { if (task_implementation_p (fn) && task_implementation_where (fn) == STARPU_CPU) { /* XXX: Hackish heuristic. */ const_tree cpu_id; cpu_id = build_cpu_codelet_identifier (task_implementation_task (fn)); return cpu_id == DECL_NAME (fn); } return false; } /* Return true when VAR_DECL has the `heap_allocated' attribute. */ static bool heap_allocated_p (const_tree var_decl) { gcc_assert (TREE_CODE (var_decl) == VAR_DECL); return lookup_attribute (heap_allocated_attribute_name, DECL_ATTRIBUTES (var_decl)) != NULL_TREE; } /* Return true when VAR_DECL has the `registered' attribute. */ static bool registered_p (const_tree var_decl) { gcc_assert (TREE_CODE (var_decl) == VAR_DECL); return lookup_attribute (registered_attribute_name, DECL_ATTRIBUTES (var_decl)) != NULL_TREE; } static void register_task_attributes (void *gcc_data, void *user_data) { static const struct attribute_spec task_attr = { task_attribute_name, 0, 0, true, false, false, handle_task_attribute #ifdef HAVE_ATTRIBUTE_SPEC_AFFECTS_TYPE_IDENTITY , false #endif }; static const struct attribute_spec task_implementation_attr = { task_implementation_attribute_name, 2, 2, true, false, false, handle_task_implementation_attribute #ifdef HAVE_ATTRIBUTE_SPEC_AFFECTS_TYPE_IDENTITY , false #endif }; static const struct attribute_spec heap_allocated_attr = { heap_allocated_attribute_name, 0, 0, true, false, false, handle_heap_allocated_attribute #ifdef HAVE_ATTRIBUTE_SPEC_AFFECTS_TYPE_IDENTITY , false #endif }; static const struct attribute_spec registered_attr = { registered_attribute_name, 0, 0, true, false, false, handle_registered_attribute #ifdef HAVE_ATTRIBUTE_SPEC_AFFECTS_TYPE_IDENTITY , false #endif }; static const struct attribute_spec output_attr = { output_attribute_name, 0, 0, true, true, false, handle_output_attribute #ifdef HAVE_ATTRIBUTE_SPEC_AFFECTS_TYPE_IDENTITY , true /* affects type identity */ #endif }; register_attribute (&task_attr); register_attribute (&task_implementation_attr); register_attribute (&heap_allocated_attr); register_attribute (®istered_attr); register_attribute (&output_attr); } /* Return the type of a codelet function, i.e., `void (*) (void **, void *)'. */ static tree build_codelet_wrapper_type (void) { tree void_ptr_ptr; void_ptr_ptr = build_pointer_type (ptr_type_node); return build_function_type_list (void_type_node, void_ptr_ptr, ptr_type_node, NULL_TREE); } /* Return an identifier for the wrapper of TASK_IMPL, a task implementation. */ static tree build_codelet_wrapper_identifier (tree task_impl) { static const char suffix[] = ".task_implementation_wrapper"; tree id; char *cl_name; const char *task_name; id = DECL_NAME (task_impl); task_name = IDENTIFIER_POINTER (id); cl_name = (char *) alloca (IDENTIFIER_LENGTH (id) + strlen (suffix) + 1); memcpy (cl_name, task_name, IDENTIFIER_LENGTH (id)); strcpy (&cl_name[IDENTIFIER_LENGTH (id)], suffix); return get_identifier (cl_name); } /* Return a function of type `void (*) (void **, void *)' that calls function TASK_IMPL, the FUNCTION_DECL of a task implementation whose prototype may be arbitrary. */ static tree build_codelet_wrapper_definition (tree task_impl) { location_t loc; tree task_decl, wrapper_name, decl; loc = DECL_SOURCE_LOCATION (task_impl); task_decl = task_implementation_task (task_impl); wrapper_name = build_codelet_wrapper_identifier (task_impl); decl = build_decl (loc, FUNCTION_DECL, wrapper_name, build_codelet_wrapper_type ()); local_define (tree, build_local_var, (const_tree type)) { tree var, t; const char *seed; t = TREE_VALUE (type); seed = POINTER_TYPE_P (t) ? "pointer_arg" : "scalar_arg"; var = build_decl (loc, VAR_DECL, create_tmp_var_name (seed), t); DECL_CONTEXT (var) = decl; DECL_ARTIFICIAL (var) = true; return var; }; /* Return the body of the wrapper, which unpacks `cl_args' and calls the user-defined task implementation. */ local_define (tree, build_body, (tree wrapper_decl, tree vars)) { bool opencl_p; tree stmts = NULL, call, v; VEC(tree, gc) *args; opencl_p = (task_implementation_where (task_impl) == STARPU_OPENCL); /* Build `var0 = STARPU_VECTOR_GET_PTR (buffers[0]); ...' or `var0 = STARPU_VECTOR_GET_DEV_HANDLE (buffers[0])' for OpenCL. */ size_t index = 0; for (v = vars; v != NULL_TREE; v = TREE_CHAIN (v)) { if (POINTER_TYPE_P (TREE_TYPE (v))) { /* Compute `void *VDESC = buffers[0];'. */ tree vdesc = array_ref (DECL_ARGUMENTS (wrapper_decl), index); /* Use the right field, depending on OPENCL_P. */ size_t offset = opencl_p ? offsetof (struct starpu_vector_interface, dev_handle) : offsetof (struct starpu_vector_interface, ptr); gcc_assert (POINTER_TYPE_P (TREE_TYPE (vdesc))); /* Compute `type *PTR = *(type **) VDESC;'. */ tree ptr = build_indirect_ref (UNKNOWN_LOCATION, fold_convert (build_pointer_type (TREE_TYPE (v)), pointer_plus (vdesc, offset)), RO_ARRAY_INDEXING); append_to_statement_list (build2 (MODIFY_EXPR, TREE_TYPE (v), v, ptr), &stmts); index++; } } /* Build `starpu_codelet_unpack_args (cl_args, &var1, &var2, ...)'. */ args = NULL; VEC_safe_push (tree, gc, args, TREE_CHAIN (DECL_ARGUMENTS (wrapper_decl))); for (v = vars; v != NULL_TREE; v = TREE_CHAIN (v)) { if (!POINTER_TYPE_P (TREE_TYPE (v))) VEC_safe_push (tree, gc, args, build_addr (v, wrapper_decl)); } if (VEC_length (tree, args) > 1) { call = build_call_expr_loc_vec (UNKNOWN_LOCATION, unpack_fn, args); TREE_SIDE_EFFECTS (call) = 1; append_to_statement_list (call, &stmts); } /* Build `my_task_impl (var1, var2, ...)'. */ args = NULL; for (v = vars; v != NULL_TREE; v = TREE_CHAIN (v)) VEC_safe_push (tree, gc, args, v); call = build_call_expr_loc_vec (UNKNOWN_LOCATION, task_impl, args); TREE_SIDE_EFFECTS (call) = 1; append_to_statement_list (call, &stmts); tree bind; bind = build3 (BIND_EXPR, void_type_node, vars, stmts, DECL_INITIAL (wrapper_decl)); TREE_TYPE (bind) = TREE_TYPE (TREE_TYPE (wrapper_decl)); return bind; }; /* Return the parameter list of the wrapper: `(void **BUFFERS, void *CL_ARGS)'. */ local_define (tree, build_parameters, (tree wrapper_decl)) { tree param1, param2; param1 = build_decl (loc, PARM_DECL, create_tmp_var_name ("buffers"), build_pointer_type (ptr_type_node)); DECL_ARG_TYPE (param1) = ptr_type_node; DECL_CONTEXT (param1) = wrapper_decl; TREE_USED (param1) = true; param2 = build_decl (loc, PARM_DECL, create_tmp_var_name ("cl_args"), ptr_type_node); DECL_ARG_TYPE (param2) = ptr_type_node; DECL_CONTEXT (param2) = wrapper_decl; TREE_USED (param2) = true; return chainon (param1, param2); }; tree vars, result; vars = map (build_local_var, list_remove (void_type_p, TYPE_ARG_TYPES (TREE_TYPE (task_decl)))); DECL_CONTEXT (decl) = NULL_TREE; DECL_ARGUMENTS (decl) = build_parameters (decl); result = build_decl (loc, RESULT_DECL, NULL_TREE, void_type_node); DECL_CONTEXT (result) = decl; DECL_ARTIFICIAL (result) = true; DECL_IGNORED_P (result) = true; DECL_RESULT (decl) = result; DECL_INITIAL (decl) = build_block (vars, NULL_TREE, decl, NULL_TREE); DECL_SAVED_TREE (decl) = build_body (decl, vars); TREE_PUBLIC (decl) = TREE_PUBLIC (task_impl); TREE_STATIC (decl) = true; TREE_USED (decl) = true; DECL_ARTIFICIAL (decl) = true; DECL_EXTERNAL (decl) = false; DECL_UNINLINABLE (decl) = true; rest_of_decl_compilation (decl, true, 0); struct function *prev_cfun = cfun; set_cfun (NULL); allocate_struct_function (decl, false); cfun->function_end_locus = DECL_SOURCE_LOCATION (task_impl); cgraph_finalize_function (decl, false); /* Mark DECL as needed so that it doesn't get removed by `cgraph_remove_unreachable_nodes' when it's not public. */ cgraph_mark_needed_node (cgraph_get_node (decl)); set_cfun (prev_cfun); return decl; } /* Define one wrapper function for each implementation of TASK. TASK should be the FUNCTION_DECL of a task. */ static void define_codelet_wrappers (tree task) { local_define (void, define, (tree task_impl)) { tree wrapper_def; wrapper_def = build_codelet_wrapper_definition (task_impl); DECL_ATTRIBUTES (task_impl) = tree_cons (get_identifier (task_implementation_wrapper_attribute_name), wrapper_def, DECL_ATTRIBUTES (task_impl)); }; for_each (define, task_implementation_list (task)); } /* Return the identifier for an automatically-generated CPU codelet of TASK. */ static tree build_cpu_codelet_identifier (const_tree task) { static const char suffix[] = ".cpu_implementation"; tree id; char *cl_name; const char *task_name; id = DECL_NAME (task); task_name = IDENTIFIER_POINTER (id); cl_name = (char *) alloca (IDENTIFIER_LENGTH (id) + strlen (suffix) + 1); memcpy (cl_name, task_name, IDENTIFIER_LENGTH (id)); strcpy (&cl_name[IDENTIFIER_LENGTH (id)], suffix); return get_identifier (cl_name); } static void handle_pre_genericize (void *gcc_data, void *user_data) { tree fn = (tree) gcc_data; gcc_assert (TREE_CODE (fn) == FUNCTION_DECL); if (task_p (fn) && TREE_STATIC (fn)) { /* The user defined a body for task FN, which we interpret as being the body of an implicit CPU task implementation for FN. Thus, rename FN and turn it into the "cpu" implementation of a task that we create under FN's original name (this is easier than moving the body to a different function, which would require traversing the body to rewrite all references to FN to point to the new function.) Later, `lower_starpu' rewrites calls to FN as calls to the newly created task. */ tree task_name = DECL_NAME (fn); tree cpu_impl = fn; DECL_NAME (cpu_impl) = build_cpu_codelet_identifier (fn); if (verbose_output_p) inform (DECL_SOURCE_LOCATION (fn), "implicit CPU implementation renamed from %qE to %qE", task_name, DECL_NAME (cpu_impl)); tree task = build_decl (DECL_SOURCE_LOCATION (fn), FUNCTION_DECL, task_name, TREE_TYPE (fn)); TREE_PUBLIC (task) = TREE_PUBLIC (fn); TREE_PUBLIC (cpu_impl) = false; taskify_function (task); /* Inherit the task implementation list from FN. */ tree impls = lookup_attribute (task_implementation_list_attribute_name, DECL_ATTRIBUTES (fn)); gcc_assert (impls != NULL_TREE); impls = TREE_VALUE (impls); DECL_ATTRIBUTES (task) = tree_cons (get_identifier (task_implementation_list_attribute_name), impls, DECL_ATTRIBUTES (task)); /* Make CPU_IMPL an implementation of FN. */ DECL_ATTRIBUTES (cpu_impl) = tree_cons (get_identifier (task_implementation_attribute_name), tree_cons (NULL_TREE, build_string (3, "cpu"), tree_cons (NULL_TREE, task, NULL_TREE)), NULL_TREE); add_task_implementation (task, cpu_impl, build_string (3, "cpu")); /* And now, process CPU_IMPL. */ } if (task_implementation_p (fn)) { tree task = task_implementation_task (fn); if (!TREE_STATIC (task)) { /* TASK lacks a body. Declare its codelet, intantiate its codelet wrappers, and its body in this compilation unit. */ /* Declare TASK's codelet. It cannot be defined yet because the complete list of tasks isn't available at this point. */ declare_codelet (task); /* Build its body. */ current_function_decl = task; define_task (task); current_function_decl = fn; /* Compile TASK's body. */ rest_of_decl_compilation (task, true, 0); allocate_struct_function (task, false); cgraph_finalize_function (task, false); cgraph_mark_needed_node (cgraph_get_node (task)); } } } /* Raise warnings if TASK doesn't meet the basic criteria. */ static void validate_task (tree task) { gcc_assert (task_p (task)); int where = task_where (task); /* If TASK has no implementations, things will barf elsewhere anyway. */ if (task_implementation_list (task) != NULL_TREE) if ((where & supported_targets) == 0) error_at (DECL_SOURCE_LOCATION (task), "none of the implementations of task %qE can be used", DECL_NAME (task)); } /* Raise an error when IMPL doesn't satisfy the constraints of a task implementations, such as not invoking another task. */ static void validate_task_implementation (tree impl) { gcc_assert (task_implementation_p (impl)); const struct cgraph_node *cgraph; const struct cgraph_edge *callee; cgraph = cgraph_get_node (impl); /* When a definition of IMPL is available, check its callees. */ if (cgraph != NULL) for (callee = cgraph->callees; callee != NULL; callee = callee->next_callee) { if (task_p (callee->callee->decl)) { location_t loc; loc = gimple_location (callee->call_stmt); error_at (loc, "task %qE cannot be invoked from task implementation %qE", DECL_NAME (callee->callee->decl), DECL_NAME (impl)); } } } static unsigned int lower_starpu (void) { tree fndecl; const struct cgraph_node *cgraph; const struct cgraph_edge *callee; fndecl = current_function_decl; gcc_assert (TREE_CODE (fndecl) == FUNCTION_DECL); if (task_p (fndecl)) { /* Make sure the task and its implementations are valid. */ validate_task (fndecl); for_each (validate_task_implementation, task_implementation_list (fndecl)); /* Generate a `struct starpu_codelet' structure and a wrapper function for each implementation of TASK_DECL. This cannot be done earlier because we need to have a complete list of task implementations. */ define_codelet_wrappers (fndecl); tree cl_def = task_codelet_declaration (fndecl); DECL_INITIAL (cl_def) = build_codelet_initializer (fndecl); TREE_STATIC (cl_def) = true; DECL_EXTERNAL (cl_def) = false; varpool_finalize_decl (cl_def); } /* This pass should occur after `build_cgraph_edges'. */ cgraph = cgraph_get_node (fndecl); gcc_assert (cgraph != NULL); if (MAIN_NAME_P (DECL_NAME (fndecl))) { /* Check whether FNDECL initializes StarPU and emit a warning if it doesn't. */ bool initialized; for (initialized = false, callee = cgraph->callees; !initialized && callee != NULL; callee = callee->next_callee) { initialized = DECL_NAME (callee->callee->decl) == get_identifier ("starpu_init"); } if (!initialized) warning_at (DECL_SOURCE_LOCATION (fndecl), 0, "%qE does not initialize StarPU", DECL_NAME (fndecl)); } for (callee = cgraph->callees; callee != NULL; callee = callee->next_callee) { gcc_assert (callee->callee != NULL); tree callee_decl, caller_decl; callee_decl = callee->callee->decl; caller_decl = callee->caller->decl; if (implicit_cpu_task_implementation_p (callee_decl) && !DECL_ARTIFICIAL (caller_decl)) { /* Rewrite the call to point to the actual task beneath CALLEE_DECL. */ callee_decl = task_implementation_task (callee_decl); if (verbose_output_p) inform (gimple_location (callee->call_stmt), "call to %qE rewritten as a call to task %qE", DECL_NAME (callee->callee->decl), DECL_NAME (callee_decl)); gimple_call_set_fn (callee->call_stmt, build_addr (callee_decl, callee->caller->decl)); } if (task_p (callee_decl)) { if (verbose_output_p) inform (gimple_location (callee->call_stmt), "%qE calls task %qE", DECL_NAME (fndecl), DECL_NAME (callee_decl)); } } return 0; } static struct opt_pass pass_lower_starpu = { designated_field_init (type, GIMPLE_PASS), designated_field_init (name, "lower_starpu"), designated_field_init (gate, NULL), designated_field_init (execute, lower_starpu), /* The rest is zeroed. */ }; /* Initialization. */ /* Directory where to look up instead of `STARPU_INCLUDE_DIR'. */ static const char *include_dir; static void define_cpp_macros (void *gcc_data, void *user_data) { cpp_define (parse_in, "STARPU_GCC_PLUGIN=0"); if (include_dir) { /* Get the header from the user-specified directory. This is useful when running the test suite, before StarPU is installed. */ char header[strlen (include_dir) + sizeof ("/starpu.h")]; strcpy (header, include_dir); strcat (header, "/starpu.h"); cpp_push_include (parse_in, header); } else cpp_push_include (parse_in, STARPU_INCLUDE_DIR "/starpu.h"); } int plugin_init (struct plugin_name_args *plugin_info, struct plugin_gcc_version *version) { /* `plugin_default_version_check' happens to be stricter than necessary (for instance, it fails when the `buildstamp' field of the plug-in doesn't match that of GCC), so write our own check and make more relax and more verbose. */ #define VERSION_CHECK(field) \ do \ { \ if (strcmp (gcc_version. field, version-> field) != 0) \ { \ error_at (UNKNOWN_LOCATION, "plug-in version check for `" \ STRINGIFY (field) "' failed: expected `%s', " \ "got `%s'", \ gcc_version. field, version-> field); \ return 1; \ } \ } \ while (0) VERSION_CHECK (basever); /* e.g., "4.6.2" */ VERSION_CHECK (devphase); VERSION_CHECK (revision); VERSION_CHECK (configuration_arguments); #undef VERSION_CHECK register_callback (plugin_name, PLUGIN_START_UNIT, define_cpp_macros, NULL); register_callback (plugin_name, PLUGIN_PRAGMAS, register_pragmas, NULL); register_callback (plugin_name, PLUGIN_ATTRIBUTES, register_task_attributes, NULL); register_callback (plugin_name, PLUGIN_PRE_GENERICIZE, handle_pre_genericize, NULL); /* Register our pass so that it happens after `build_cgraph_edges' has been done. */ struct register_pass_info pass_info = { designated_field_init (pass, &pass_lower_starpu), designated_field_init (reference_pass_name, "*build_cgraph_edges"), designated_field_init (ref_pass_instance_number, 1), designated_field_init (pos_op, PASS_POS_INSERT_AFTER) }; register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info); #if HAVE_DECL_PTR_DEREFS_MAY_ALIAS_P /* This warning pass is only available when `ptr_derefs_may_alias_p' is available, with GCC >= 4.6. */ struct register_pass_info pass_info2 = { designated_field_init (pass, &pass_warn_starpu_unregistered), designated_field_init (reference_pass_name, "ssa"), designated_field_init (ref_pass_instance_number, 1), designated_field_init (pos_op, PASS_POS_INSERT_AFTER) }; if (optimize) /* Using `TODO_rebuild_alias' allows us to have more accurate aliasing info. However, `TODO_rebuild_alias' cannot be used when optimizations are turned off. See for details. */ pass_warn_starpu_unregistered.todo_flags_start = TODO_rebuild_alias; register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info2); #endif include_dir = getenv ("STARPU_GCC_INCLUDE_DIR"); opencl_include_dirs = tree_cons (NULL_TREE, build_string (1, "."), NULL_TREE); int arg; for (arg = 0; arg < plugin_info->argc; arg++) { if (strcmp (plugin_info->argv[arg].key, "include-dir") == 0) { if (plugin_info->argv[arg].value == NULL) error_at (UNKNOWN_LOCATION, "missing directory name for option " "%<-fplugin-arg-starpu-include-dir%>"); else /* XXX: We assume that `value' has an infinite lifetime. */ include_dir = plugin_info->argv[arg].value; } else if (strcmp (plugin_info->argv[arg].key, "opencl-include-dir") == 0) { if (plugin_info->argv[arg].value == NULL) error_at (UNKNOWN_LOCATION, "missing directory name for option " "%<-fplugin-arg-starpu-opencl-include-dir%>"); else { tree dir = build_string (strlen (plugin_info->argv[arg].value), plugin_info->argv[arg].value); opencl_include_dirs = tree_cons (NULL_TREE, dir, opencl_include_dirs); } } else if (strcmp (plugin_info->argv[arg].key, "verbose") == 0) verbose_output_p = true; else error_at (UNKNOWN_LOCATION, "invalid StarPU plug-in argument %qs", plugin_info->argv[arg].key); } /* Keep the directories in the order in which they appear. */ opencl_include_dirs = nreverse (opencl_include_dirs); return 0; } #ifdef __cplusplus } #endif starpu-1.2.3+dfsg/gcc-plugin/src/tasks.c000066400000000000000000000426761320135501600200750ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ #include /* We must include starpu.h here, otherwise gcc will complain about a poisoned malloc in xmmintrin.h. */ #include #include #include #include #include #include #include #include #ifdef HAVE_C_FAMILY_C_COMMON_H # include #elif HAVE_C_COMMON_H # include #endif #include #include #include #include /* Task-related functions. */ /* Name of public attributes. */ const char task_attribute_name[] = "task"; const char task_implementation_attribute_name[] = "task_implementation"; const char output_attribute_name[] = "output"; /* Names of attributes used internally. */ static const char task_codelet_attribute_name[] = ".codelet"; const char task_implementation_list_attribute_name[] = ".task_implementation_list"; const char task_implementation_wrapper_attribute_name[] = ".task_implementation_wrapper"; /* Names of data structures defined in . */ static const char codelet_struct_tag[] = "starpu_codelet"; /* Return true if DECL is a task. */ bool task_p (const_tree decl) { return (TREE_CODE (decl) == FUNCTION_DECL && lookup_attribute (task_attribute_name, DECL_ATTRIBUTES (decl)) != NULL_TREE); } /* Return true if DECL is a task implementation. */ bool task_implementation_p (const_tree decl) { return (TREE_CODE (decl) == FUNCTION_DECL && lookup_attribute (task_implementation_attribute_name, DECL_ATTRIBUTES (decl)) != NULL_TREE); } /* Return a value indicating where TASK_IMPL should execute (`STARPU_CPU', `STARPU_CUDA', etc.). */ int task_implementation_where (const_tree task_impl) { tree impl_attr, args, where; gcc_assert (TREE_CODE (task_impl) == FUNCTION_DECL); impl_attr = lookup_attribute (task_implementation_attribute_name, DECL_ATTRIBUTES (task_impl)); gcc_assert (impl_attr != NULL_TREE); args = TREE_VALUE (impl_attr); where = TREE_VALUE (args); return task_implementation_target_to_int (where); } /* Return the StarPU integer constant corresponding to string TARGET. */ int task_implementation_target_to_int (const_tree target) { gcc_assert (TREE_CODE (target) == STRING_CST); int where_int; if (!strncmp (TREE_STRING_POINTER (target), "cpu", TREE_STRING_LENGTH (target))) where_int = STARPU_CPU; else if (!strncmp (TREE_STRING_POINTER (target), "opencl", TREE_STRING_LENGTH (target))) where_int = STARPU_OPENCL; else if (!strncmp (TREE_STRING_POINTER (target), "cuda", TREE_STRING_LENGTH (target))) where_int = STARPU_CUDA; else where_int = 0; return where_int; } /* Return the task implemented by TASK_IMPL. */ tree task_implementation_task (const_tree task_impl) { tree impl_attr, args, task; gcc_assert (TREE_CODE (task_impl) == FUNCTION_DECL); impl_attr = lookup_attribute (task_implementation_attribute_name, DECL_ATTRIBUTES (task_impl)); gcc_assert (impl_attr != NULL_TREE); args = TREE_VALUE (impl_attr); task = TREE_VALUE (TREE_CHAIN (args)); if (task_implementation_p (task)) /* TASK is an implicit CPU task implementation, so return its real task. */ return task_implementation_task (task); return task; } /* Return the declaration of the `struct starpu_codelet' variable associated with TASK_DECL. */ tree task_codelet_declaration (const_tree task_decl) { tree cl_attr; cl_attr = lookup_attribute (task_codelet_attribute_name, DECL_ATTRIBUTES (task_decl)); gcc_assert (cl_attr != NULL_TREE); return TREE_VALUE (cl_attr); } /* Return the list of implementations of TASK_DECL. */ tree task_implementation_list (const_tree task_decl) { tree attr; attr = lookup_attribute (task_implementation_list_attribute_name, DECL_ATTRIBUTES (task_decl)); return TREE_VALUE (attr); } /* Return the list of pointer parameter types of TASK_DECL. */ tree task_pointer_parameter_types (const_tree task_decl) { return filter (pointer_type_p, TYPE_ARG_TYPES (TREE_TYPE (task_decl))); } /* Return a bitwise-or of the supported targets of TASK_DECL. */ int task_where (const_tree task_decl) { gcc_assert (task_p (task_decl)); int where; const_tree impl; for (impl = task_implementation_list (task_decl), where = 0; impl != NULL_TREE; impl = TREE_CHAIN (impl)) where |= task_implementation_where (TREE_VALUE (impl)); return where; } /* Return the FUNCTION_DECL of the wrapper generated for TASK_IMPL. */ tree task_implementation_wrapper (const_tree task_impl) { tree attr; gcc_assert (TREE_CODE (task_impl) == FUNCTION_DECL); attr = lookup_attribute (task_implementation_wrapper_attribute_name, DECL_ATTRIBUTES (task_impl)); gcc_assert (attr != NULL_TREE); return TREE_VALUE (attr); } tree codelet_type (void) { /* XXX: Hack to allow the type declaration to be accessible at lower time. */ static tree type_decl = NULL_TREE; if (type_decl == NULL_TREE) /* Lookup the `struct starpu_codelet' struct type. This should succeed since we push early on. */ type_decl = type_decl_for_struct_tag (codelet_struct_tag); return TREE_TYPE (type_decl); } /* Return the access mode for POINTER, a PARM_DECL of a task. */ enum starpu_data_access_mode access_mode (const_tree type) { gcc_assert (POINTER_TYPE_P (type)); /* If TYPE points to a const-qualified type, then mark the data as read-only; if is has the `output' attribute, then mark it as write-only; otherwise default to read-write. */ return ((TYPE_QUALS (TREE_TYPE (type)) & TYPE_QUAL_CONST) ? STARPU_R : (output_type_p (type) ? STARPU_W : STARPU_RW)); } /* Return true if TYPE is `output'-qualified. */ bool output_type_p (const_tree type) { return (lookup_attribute (output_attribute_name, TYPE_ATTRIBUTES (type)) != NULL_TREE); } /* Code generation. */ /* Turn FN into a task, and push its associated codelet declaration. */ void taskify_function (tree fn) { gcc_assert (TREE_CODE (fn) == FUNCTION_DECL); /* Add a `task' attribute and an empty `task_implementation_list' attribute. */ DECL_ATTRIBUTES (fn) = tree_cons (get_identifier (task_implementation_list_attribute_name), NULL_TREE, tree_cons (get_identifier (task_attribute_name), NULL_TREE, DECL_ATTRIBUTES (fn))); /* Push a declaration for the corresponding `struct starpu_codelet' object and add it as an attribute of FN. */ tree cl = build_codelet_declaration (fn); DECL_ATTRIBUTES (fn) = tree_cons (get_identifier (task_codelet_attribute_name), cl, DECL_ATTRIBUTES (fn)); pushdecl (cl); } /* Return a NODE_IDENTIFIER for the variable holding the `struct starpu_codelet' structure associated with TASK_DECL. */ tree build_codelet_identifier (tree task_decl) { static const char suffix[] = ".codelet"; tree id; char *cl_name; const char *task_name; id = DECL_NAME (task_decl); task_name = IDENTIFIER_POINTER (id); cl_name = (char *) alloca (IDENTIFIER_LENGTH (id) + strlen (suffix) + 1); memcpy (cl_name, task_name, IDENTIFIER_LENGTH (id)); strcpy (&cl_name[IDENTIFIER_LENGTH (id)], suffix); return get_identifier (cl_name); } /* Return a VAR_DECL that declares a `struct starpu_codelet' structure for TASK_DECL. */ tree build_codelet_declaration (tree task_decl) { tree name, cl_decl; name = build_codelet_identifier (task_decl); cl_decl = build_decl (DECL_SOURCE_LOCATION (task_decl), VAR_DECL, name, /* c_build_qualified_type (type, TYPE_QUAL_CONST) */ codelet_type ()); DECL_ARTIFICIAL (cl_decl) = true; TREE_PUBLIC (cl_decl) = TREE_PUBLIC (task_decl); TREE_STATIC (cl_decl) = false; TREE_USED (cl_decl) = true; DECL_EXTERNAL (cl_decl) = true; DECL_CONTEXT (cl_decl) = NULL_TREE; return cl_decl; } /* Return a `struct starpu_codelet' initializer for TASK_DECL. */ tree build_codelet_initializer (tree task_decl) { tree fields; fields = TYPE_FIELDS (codelet_type ()); gcc_assert (TREE_CODE (fields) == FIELD_DECL); local_define (tree, lookup_field, (const char *name)) { tree fdecl, fname; fname = get_identifier (name); for (fdecl = fields; fdecl != NULL_TREE; fdecl = TREE_CHAIN (fdecl)) { if (DECL_NAME (fdecl) == fname) return fdecl; } /* Field NAME wasn't found. */ gcc_assert (false); }; local_define (tree, field_initializer, (const char *name, tree value)) { tree field, init; field = lookup_field (name); init = make_node (TREE_LIST); TREE_PURPOSE (init) = field; TREE_CHAIN (init) = NULL_TREE; if (TREE_CODE (TREE_TYPE (value)) != ARRAY_TYPE) TREE_VALUE (init) = fold_convert (TREE_TYPE (field), value); else TREE_VALUE (init) = value; return init; }; local_define (tree, codelet_name, ()) { const char *name = IDENTIFIER_POINTER (DECL_NAME (task_decl)); return build_string_literal (strlen (name) + 1, name); }; local_define (tree, where_init, (tree impls)) { tree impl; int where_int = 0; for (impl = impls; impl != NULL_TREE; impl = TREE_CHAIN (impl)) { tree impl_decl; impl_decl = TREE_VALUE (impl); gcc_assert (TREE_CODE (impl_decl) == FUNCTION_DECL); if (verbose_output_p) /* List the implementations of TASK_DECL. */ inform (DECL_SOURCE_LOCATION (impl_decl), " %qE", DECL_NAME (impl_decl)); where_int |= task_implementation_where (impl_decl); } return build_int_cstu (integer_type_node, where_int); }; local_define (tree, implementation_pointers, (tree impls, int where)) { size_t len; tree impl, pointers; for (impl = impls, pointers = NULL_TREE, len = 0; impl != NULL_TREE; impl = TREE_CHAIN (impl)) { tree impl_decl; impl_decl = TREE_VALUE (impl); if (task_implementation_where (impl_decl) == where) { /* Return a pointer to the wrapper of IMPL_DECL. */ tree addr = build_addr (task_implementation_wrapper (impl_decl), NULL_TREE); pointers = tree_cons (size_int (len), addr, pointers); len++; if (len > STARPU_MAXIMPLEMENTATIONS) error_at (DECL_SOURCE_LOCATION (impl_decl), "maximum number of per-target task implementations " "exceeded"); } } /* POINTERS must be null-terminated. */ pointers = tree_cons (size_int (len), build_zero_cst (ptr_type_node), pointers); len++; /* Return an array initializer. */ tree index_type = build_index_type (size_int (list_length (pointers))); return build_constructor_from_list (build_array_type (ptr_type_node, index_type), nreverse (pointers)); }; local_define (tree, pointer_arg_count, (void)) { size_t len; len = list_length (task_pointer_parameter_types (task_decl)); return build_int_cstu (integer_type_node, len); }; local_define (tree, access_mode_array, (void)) { const_tree type; tree modes; size_t index; for (type = task_pointer_parameter_types (task_decl), modes = NULL_TREE, index = 0; type != NULL_TREE && index < STARPU_NMAXBUFS; type = TREE_CHAIN (type), index++) { tree value = build_int_cst (integer_type_node, access_mode (TREE_VALUE (type))); modes = tree_cons (size_int (index), value, modes); } tree index_type = build_index_type (size_int (list_length (modes))); return build_constructor_from_list (build_array_type (integer_type_node, index_type), nreverse (modes)); }; if (verbose_output_p) inform (DECL_SOURCE_LOCATION (task_decl), "implementations for task %qE:", DECL_NAME (task_decl)); tree impls, inits; impls = task_implementation_list (task_decl); inits = chain_trees (field_initializer ("name", codelet_name ()), field_initializer ("where", where_init (impls)), field_initializer ("nbuffers", pointer_arg_count ()), field_initializer ("modes", access_mode_array ()), field_initializer ("cpu_funcs", implementation_pointers (impls, STARPU_CPU)), field_initializer ("opencl_funcs", implementation_pointers (impls, STARPU_OPENCL)), field_initializer ("cuda_funcs", implementation_pointers (impls, STARPU_CUDA)), NULL_TREE); return build_constructor_from_unsorted_list (codelet_type (), inits); } /* Return the VAR_DECL that defines a `struct starpu_codelet' structure for TASK_DECL. The VAR_DECL is assumed to already exists, so it must not be pushed again. */ tree declare_codelet (tree task_decl) { /* Retrieve the declaration of the `struct starpu_codelet' object. */ tree cl_decl; cl_decl = lookup_name (build_codelet_identifier (task_decl)); gcc_assert (cl_decl != NULL_TREE && TREE_CODE (cl_decl) == VAR_DECL); /* Turn the codelet declaration into a definition. */ TREE_TYPE (cl_decl) = codelet_type (); TREE_PUBLIC (cl_decl) = TREE_PUBLIC (task_decl); return cl_decl; } /* Build the body of TASK_DECL, which will call `starpu_task_insert'. */ void define_task (tree task_decl) { /* First of all, give TASK_DECL an argument list. */ DECL_ARGUMENTS (task_decl) = build_function_arguments (task_decl); VEC(tree, gc) *args = NULL; location_t loc = DECL_SOURCE_LOCATION (task_decl); tree p, params = DECL_ARGUMENTS (task_decl); /* The first argument will be a pointer to the codelet. */ VEC_safe_push (tree, gc, args, build_addr (task_codelet_declaration (task_decl), current_function_decl)); for (p = params; p != NULL_TREE; p = TREE_CHAIN (p)) { gcc_assert (TREE_CODE (p) == PARM_DECL); tree type = TREE_TYPE (p); if (POINTER_TYPE_P (type)) { /* A pointer: the arguments will be: `STARPU_RW, ptr' or similar. */ VEC_safe_push (tree, gc, args, build_int_cst (integer_type_node, access_mode (type))); VEC_safe_push (tree, gc, args, build_pointer_lookup (p)); } else { /* A scalar: the arguments will be: `STARPU_VALUE, &scalar, sizeof (scalar)'. */ mark_addressable (p); VEC_safe_push (tree, gc, args, build_int_cst (integer_type_node, STARPU_VALUE)); VEC_safe_push (tree, gc, args, build_addr (p, current_function_decl)); VEC_safe_push (tree, gc, args, size_in_bytes (type)); } } /* Push the terminating zero. */ VEC_safe_push (tree, gc, args, build_int_cst (integer_type_node, 0)); /* Introduce a local variable to hold the error code. */ tree error_var = build_decl (loc, VAR_DECL, create_tmp_var_name (".task_insert_error"), integer_type_node); DECL_CONTEXT (error_var) = task_decl; DECL_ARTIFICIAL (error_var) = true; /* Build this: err = starpu_task_insert (...); if (err != 0) { printf ...; abort (); } */ static tree task_insert_fn; LOOKUP_STARPU_FUNCTION (task_insert_fn, "starpu_task_insert"); tree call = build_call_expr_loc_vec (loc, task_insert_fn, args); tree assignment = build2 (INIT_EXPR, TREE_TYPE (error_var), error_var, call); tree name = DECL_NAME (task_decl); tree cond = build3 (COND_EXPR, void_type_node, build2 (NE_EXPR, boolean_type_node, error_var, integer_zero_node), build_error_statements (loc, error_var, build_starpu_error_string, "failed to insert task `%s'", IDENTIFIER_POINTER (name)), NULL_TREE); tree stmts = NULL; append_to_statement_list (assignment, &stmts); append_to_statement_list (cond, &stmts); tree bind = build3 (BIND_EXPR, void_type_node, error_var, stmts, NULL_TREE); /* Put it all together. */ DECL_SAVED_TREE (task_decl) = bind; TREE_STATIC (task_decl) = true; DECL_EXTERNAL (task_decl) = false; DECL_ARTIFICIAL (task_decl) = true; DECL_INITIAL (task_decl) = build_block (error_var, NULL_TREE, task_decl, NULL_TREE); DECL_RESULT (task_decl) = build_decl (loc, RESULT_DECL, NULL_TREE, void_type_node); DECL_CONTEXT (DECL_RESULT (task_decl)) = task_decl; } /* Add FN to the list of implementations of TASK_DECL. */ void add_task_implementation (tree task_decl, tree fn, const_tree where) { location_t loc; tree attr, impls; attr = lookup_attribute (task_implementation_list_attribute_name, DECL_ATTRIBUTES (task_decl)); gcc_assert (attr != NULL_TREE); gcc_assert (TREE_CODE (where) == STRING_CST); loc = DECL_SOURCE_LOCATION (fn); impls = tree_cons (NULL_TREE, fn, TREE_VALUE (attr)); TREE_VALUE (attr) = impls; TREE_USED (fn) = true; /* Check the `where' argument to raise a warning if needed. */ if (task_implementation_target_to_int (where) == 0) warning_at (loc, 0, "unsupported target %E; task implementation won't be used", where); else if (task_implementation_target_to_int (where) == STARPU_OPENCL) { local_define (void, validate, (tree t)) { validate_opencl_argument_type (loc, t); }; for_each (validate, TYPE_ARG_TYPES (TREE_TYPE (fn))); } } starpu-1.2.3+dfsg/gcc-plugin/src/utils.c000066400000000000000000000242111320135501600200710ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ #include /* We must include starpu.h here, otherwise gcc will complain about a poisoned malloc in xmmintrin.h. */ #include #include #include #include #include #include #include #include #ifdef HAVE_C_FAMILY_C_COMMON_H # include #elif HAVE_C_COMMON_H # include #endif #include /* Whether to enable verbose output. */ bool verbose_output_p = false; /* Various helpers. */ /* Return a TYPE_DECL for the RECORD_TYPE with tag name TAG. */ tree type_decl_for_struct_tag (const char *tag) { tree type_decl = xref_tag (RECORD_TYPE, get_identifier (tag)); gcc_assert (type_decl != NULL_TREE && TREE_CODE (type_decl) == RECORD_TYPE); /* `build_decl' expects a TYPE_DECL, so give it what it wants. */ type_decl = TYPE_STUB_DECL (type_decl); gcc_assert (type_decl != NULL && TREE_CODE (type_decl) == TYPE_DECL); return type_decl; } /* Given ERROR_VAR, an integer variable holding a StarPU error code, return statements that print out the error message returned by BUILD_ERROR_MESSAGE (ERROR_VAR) and abort. */ tree build_error_statements (location_t loc, tree error_var, function_parm (tree, build_error_message, (tree)), const char *fmt, ...) { expanded_location xloc = expand_location (loc); tree print; char *str, *fmt_long; va_list args; va_start (args, fmt); /* Build a longer format. Since FMT itself contains % escapes, this needs to be done in two steps. */ vasprintf (&str, fmt, args); if (error_var != NULL_TREE) { /* ERROR_VAR is an error code. */ gcc_assert (TREE_CODE (error_var) == VAR_DECL && TREE_TYPE (error_var) == integer_type_node); asprintf (&fmt_long, "%s:%d: error: %s: %%s\n", xloc.file, xloc.line, str); print = build_call_expr (builtin_decl_explicit (BUILT_IN_PRINTF), 2, build_string_literal (strlen (fmt_long) + 1, fmt_long), build_error_message (error_var)); } else { /* No error code provided. */ asprintf (&fmt_long, "%s:%d: error: %s\n", xloc.file, xloc.line, str); print = build_call_expr (builtin_decl_explicit (BUILT_IN_PUTS), 1, build_string_literal (strlen (fmt_long) + 1, fmt_long)); } free (fmt_long); free (str); va_end (args); tree stmts = NULL; append_to_statement_list (print, &stmts); append_to_statement_list (build_call_expr (builtin_decl_explicit (BUILT_IN_ABORT), 0), &stmts); return stmts; } /* Return a fresh argument list for FN. */ tree build_function_arguments (tree fn) { gcc_assert (TREE_CODE (fn) == FUNCTION_DECL && DECL_ARGUMENTS (fn) == NULL_TREE); local_define (tree, build_argument, (const_tree lst)) { tree param, type; type = TREE_VALUE (lst); param = build_decl (DECL_SOURCE_LOCATION (fn), PARM_DECL, create_tmp_var_name ("argument"), type); DECL_ARG_TYPE (param) = type; DECL_CONTEXT (param) = fn; return param; }; return map (build_argument, list_remove (void_type_p, TYPE_ARG_TYPES (TREE_TYPE (fn)))); } /* Return true if LST holds the void type. */ bool void_type_p (const_tree lst) { gcc_assert (TREE_CODE (lst) == TREE_LIST); return VOID_TYPE_P (TREE_VALUE (lst)); } /* Return true if LST holds a pointer type. */ bool pointer_type_p (const_tree lst) { gcc_assert (TREE_CODE (lst) == TREE_LIST); return POINTER_TYPE_P (TREE_VALUE (lst)); } /* C expression parser, possibly with C++ linkage. */ extern int yyparse (location_t, const char *, tree *); extern int yydebug; /* Parse expressions from the CPP reader for PRAGMA, which is located at LOC. Return a TREE_LIST of C expressions. */ tree read_pragma_expressions (const char *pragma, location_t loc) { tree expr = NULL_TREE; if (yyparse (loc, pragma, &expr)) /* Parse error or memory exhaustion. */ expr = NULL_TREE; return expr; } /* List and vector utilities, à la SRFI-1. */ tree chain_trees (tree t, ...) { va_list args; va_start (args, t); tree next, prev = t; for (prev = t, next = va_arg (args, tree); next != NULL_TREE; prev = next, next = va_arg (args, tree)) TREE_CHAIN (prev) = next; va_end (args); return t; } tree filter (function_parm (bool, pred, (const_tree)), tree t) { tree result, lst; gcc_assert (TREE_CODE (t) == TREE_LIST); result = NULL_TREE; for (lst = t; lst != NULL_TREE; lst = TREE_CHAIN (lst)) { if (pred (lst)) result = tree_cons (TREE_PURPOSE (lst), TREE_VALUE (lst), result); } return nreverse (result); } tree list_remove (function_parm (bool, pred, (const_tree)), tree t) { local_define (bool, opposite, (const_tree t)) { return !pred (t); }; return filter (opposite, t); } /* Map FUNC over chain T. T does not have to be `TREE_LIST'; it can be a chain of arbitrary tree objects. */ tree map (function_parm (tree, func, (const_tree)), tree t) { tree result, tail, lst; result = tail = NULL_TREE; for (lst = t; lst != NULL_TREE; lst = TREE_CHAIN (lst)) { tree r = func (lst); if (tail != NULL_TREE) TREE_CHAIN (tail) = r; else result = r; tail = r; } return result; } void for_each (function_parm (void, func, (tree)), tree t) { tree lst; gcc_assert (TREE_CODE (t) == TREE_LIST); for (lst = t; lst != NULL_TREE; lst = TREE_CHAIN (lst)) func (TREE_VALUE (lst)); } size_t count (function_parm (bool, pred, (const_tree)), const_tree t) { size_t result; const_tree lst; for (lst = t, result = 0; lst != NULL_TREE; lst = TREE_CHAIN (lst)) if (pred (lst)) result++; return result; } /* Useful code backported from GCC 4.6. */ #if !HAVE_DECL_BUILD_CALL_EXPR_LOC_ARRAY tree build_call_expr_loc_array (location_t loc, tree fndecl, int n, tree *argarray) { tree fntype = TREE_TYPE (fndecl); tree fn = build1 (ADDR_EXPR, build_pointer_type (fntype), fndecl); return fold_builtin_call_array (loc, TREE_TYPE (fntype), fn, n, argarray); } #endif #if !HAVE_DECL_BUILD_CALL_EXPR_LOC_VEC tree build_call_expr_loc_vec (location_t loc, tree fndecl, VEC(tree,gc) *vec) { return build_call_expr_loc_array (loc, fndecl, VEC_length (tree, vec), VEC_address (tree, vec)); } #endif #if !HAVE_DECL_BUILD_ZERO_CST tree build_zero_cst (tree type) { switch (TREE_CODE (type)) { case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE: case POINTER_TYPE: case REFERENCE_TYPE: case OFFSET_TYPE: return build_int_cst (type, 0); default: abort (); } } #endif /* Build a "conversion" from a raw C pointer to its data handle. The assumption is that the programmer should have already registered the pointer by themselves. */ tree build_pointer_lookup (tree pointer) { static tree data_lookup_fn; /* Make sure DATA_LOOKUP_FN is valid. */ LOOKUP_STARPU_FUNCTION (data_lookup_fn, "starpu_data_lookup"); location_t loc; if (DECL_P (pointer)) loc = DECL_SOURCE_LOCATION (pointer); else loc = UNKNOWN_LOCATION; /* Introduce a local variable to hold the handle. */ tree result_var = build_decl (loc, VAR_DECL, create_tmp_var_name (".data_lookup_result"), ptr_type_node); DECL_CONTEXT (result_var) = current_function_decl; DECL_ARTIFICIAL (result_var) = true; DECL_SOURCE_LOCATION (result_var) = loc; tree call = build_call_expr (data_lookup_fn, 1, pointer); tree assignment = build2 (INIT_EXPR, TREE_TYPE (result_var), result_var, call); /* Build `if (RESULT_VAR == NULL) error ();'. */ tree cond = build3 (COND_EXPR, void_type_node, build2 (EQ_EXPR, boolean_type_node, result_var, null_pointer_node), build_error_statements (loc, NULL_TREE, build_starpu_error_string, "attempt to use unregistered " "pointer"), NULL_TREE); tree stmts = NULL; append_to_statement_list (assignment, &stmts); append_to_statement_list (cond, &stmts); append_to_statement_list (result_var, &stmts); return build4 (TARGET_EXPR, ptr_type_node, result_var, stmts, NULL_TREE, NULL_TREE); } /* Build an error string for the StarPU return value in ERROR_VAR. */ tree build_starpu_error_string (tree error_var) { static tree strerror_fn; LOOKUP_STARPU_FUNCTION (strerror_fn, "strerror"); tree error_code = build1 (NEGATE_EXPR, TREE_TYPE (error_var), error_var); return build_call_expr (strerror_fn, 1, error_code); } /* Like `build_constructor_from_list', but sort VALS according to their offset in struct TYPE. Inspired by `gnat_build_constructor'. */ tree build_constructor_from_unsorted_list (tree type, tree vals) { local_define (int, compare_elmt_bitpos, (const void *rt1, const void *rt2)) { const constructor_elt *elmt1 = (constructor_elt *) rt1; const constructor_elt *elmt2 = (constructor_elt *) rt2; const_tree field1 = elmt1->index; const_tree field2 = elmt2->index; int ret = tree_int_cst_compare (bit_position (field1), bit_position (field2)); return ret ? ret : (int) (DECL_UID (field1) - DECL_UID (field2)); }; tree t; VEC(constructor_elt,gc) *v = NULL; if (vals) { v = VEC_alloc (constructor_elt, gc, list_length (vals)); for (t = vals; t; t = TREE_CHAIN (t)) CONSTRUCTOR_APPEND_ELT (v, TREE_PURPOSE (t), TREE_VALUE (t)); } /* Sort field initializers by field offset. */ VEC_qsort (constructor_elt, v, compare_elmt_bitpos); return build_constructor (type, v); } starpu-1.2.3+dfsg/gcc-plugin/src/warn-unregistered.c000066400000000000000000000153741320135501600224100ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* Use extensions of the GNU C Library. */ #define _GNU_SOURCE 1 #include /* We must include starpu.h here, otherwise gcc will complain about a poisoned malloc in xmmintrin.h. */ #include #include #include #include #include #include #include #include #include #include #include #include /* Return true if there exists a `starpu_vector_data_register' call for VAR before GSI in its basic block. */ static bool registration_in_bb_p (gimple_stmt_iterator gsi, tree var) { gcc_assert (SSA_VAR_P (var)); tree register_fn_name; register_fn_name = get_identifier ("starpu_vector_data_register"); local_define (bool, registration_function_p, (const_tree obj)) { /* TODO: Compare against the real fndecl. */ return (obj != NULL_TREE && TREE_CODE (obj) == FUNCTION_DECL && DECL_NAME (obj) == register_fn_name); }; bool found; for (found = false; !gsi_end_p (gsi) && !found; gsi_prev (&gsi)) { gimple stmt; stmt = gsi_stmt (gsi); if (is_gimple_call (stmt)) { tree fn = gimple_call_fndecl (stmt); if (registration_function_p (fn)) { tree arg = gimple_call_arg (stmt, 2); if (is_gimple_address (arg)) arg = TREE_OPERAND (arg, 0); if (((TREE_CODE (arg) == VAR_DECL || TREE_CODE (arg) == VAR_DECL) && refs_may_alias_p (arg, var)) /* Both VAR and ARG should be SSA names, otherwise, if ARG is a VAR_DECL, `ptr_derefs_may_alias_p' will conservatively assume that they may alias. */ || (TREE_CODE (var) == SSA_NAME && TREE_CODE (arg) != VAR_DECL && ptr_derefs_may_alias_p (arg, var))) { if (verbose_output_p) { var = TREE_CODE (var) == SSA_NAME ? SSA_NAME_VAR (var) : var; inform (gimple_location (stmt), "found registration of variable %qE", DECL_NAME (var)); } found = true; } } } } return found; } /* Return true if BB is dominated by a registration of VAR. */ static bool dominated_by_registration (gimple_stmt_iterator gsi, tree var) { /* Is there a registration call for VAR in GSI's basic block? */ if (registration_in_bb_p (gsi, var)) return true; edge e; edge_iterator ei; bool found = false; /* If every incoming edge is dominated by a registration, then we're fine. FIXME: This triggers false positives when registration is done in a loop, because there's always an edge through which no registration happens--the edge corresponding to the case where the loop is not entered. */ FOR_EACH_EDGE (e, ei, gsi_bb (gsi)->preds) { if (!dominated_by_registration (gsi_last_bb (e->src), var)) return false; else found = true; } return found; } /* Return true if NAME aliases a global variable or a PARM_DECL. Note that, for the former, `ptr_deref_may_alias_global_p' is way too conservative, hence this approach. */ static bool ssa_name_aliases_global_or_parm_p (const_tree name) { gcc_assert (TREE_CODE (name) == SSA_NAME); if (TREE_CODE (SSA_NAME_VAR (name)) == PARM_DECL) return true; else { gimple def_stmt; def_stmt = SSA_NAME_DEF_STMT (name); if (is_gimple_assign (def_stmt)) { tree rhs = gimple_assign_rhs1 (def_stmt); if (TREE_CODE (rhs) == VAR_DECL && (DECL_EXTERNAL (rhs) || TREE_STATIC (rhs))) return true; } } return false; } /* Validate the arguments passed to tasks in FN's body. */ static void validate_task_invocations (tree fn) { gcc_assert (TREE_CODE (fn) == FUNCTION_DECL); const struct cgraph_node *cgraph; const struct cgraph_edge *callee; cgraph = cgraph_get_node (fn); /* When a definition of IMPL is available, check its callees. */ if (cgraph != NULL) for (callee = cgraph->callees; callee != NULL; callee = callee->next_callee) { if (task_p (callee->callee->decl)) { unsigned i; gimple call_stmt = callee->call_stmt; for (i = 0; i < gimple_call_num_args (call_stmt); i++) { tree arg = gimple_call_arg (call_stmt, i); if (TREE_CODE (arg) == ADDR_EXPR && TREE_CODE (TREE_OPERAND (arg, 0)) == VAR_DECL && (TREE_CODE (TREE_TYPE (TREE_OPERAND (arg, 0))) == ARRAY_TYPE)) /* This is a "pointer-to-array" of a variable, so what we really care about is the variable itself. */ arg = TREE_OPERAND (arg, 0); if ((POINTER_TYPE_P (TREE_TYPE (arg)) || (TREE_CODE (TREE_TYPE (arg)) == ARRAY_TYPE)) && ((TREE_CODE (arg) == VAR_DECL && !TREE_STATIC (arg) && !DECL_EXTERNAL (arg) && !TREE_NO_WARNING (arg)) || (TREE_CODE (arg) == SSA_NAME && !ssa_name_aliases_global_or_parm_p (arg)))) { if (!dominated_by_registration (gsi_for_stmt (call_stmt), arg)) { if (TREE_CODE (arg) == SSA_NAME) { tree var = SSA_NAME_VAR (arg); if (DECL_NAME (var) != NULL) arg = var; /* TODO: Check whether we can get the original variable name via ARG's DEF_STMT. */ } if (TREE_CODE (arg) == VAR_DECL && DECL_NAME (arg) != NULL_TREE) warning_at (gimple_location (call_stmt), 0, "variable %qE may be used unregistered", DECL_NAME (arg)); else warning_at (gimple_location (call_stmt), 0, "argument %i may be used unregistered", i); } } } } } } /* A pass to warn about possibly unregistered task arguments. */ static unsigned int warn_starpu_unregistered (void) { tree fndecl; fndecl = current_function_decl; gcc_assert (TREE_CODE (fndecl) == FUNCTION_DECL); if (!task_p (fndecl)) validate_task_invocations (fndecl); return 0; } struct opt_pass pass_warn_starpu_unregistered = { designated_field_init (type, GIMPLE_PASS), designated_field_init (name, "warn_starpu_unregistered"), designated_field_init (gate, NULL), designated_field_init (execute, warn_starpu_unregistered), /* The rest is zeroed. */ }; starpu-1.2.3+dfsg/gcc-plugin/tests/000077500000000000000000000000001320135501600171405ustar00rootroot00000000000000starpu-1.2.3+dfsg/gcc-plugin/tests/Makefile.am000066400000000000000000000051011320135501600211710ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011, 2012 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. include $(top_srcdir)/starpu.mk gcc_tests = \ base.c \ pointers.c \ output-pointer.c \ output-pointer-errors.c \ register.c \ register-errors.c \ registered.c \ registered-errors.c \ acquire.c \ acquire-errors.c \ release.c \ release-errors.c \ unregister.c \ unregister-errors.c \ task-errors.c \ scalar-tasks.c \ pointer-tasks.c \ external-task-impl.c \ no-initialize.c \ lib-user.c \ wait-errors.c \ heap-allocated.c \ heap-allocated-errors.c \ verbose.c \ debug-tree.c \ opencl.c \ opencl-errors.c \ shutdown-errors.c EXTRA_DIST = if HAVE_PTR_DEREFS_MAY_ALIAS_P gcc_tests += warn-unregistered.c else !HAVE_PTR_DEREFS_MAY_ALIAS_P EXTRA_DIST += warn-unregistered.c endif !HAVE_PTR_DEREFS_MAY_ALIAS_P if !STARPU_USE_OPENCL # XXX: This test simulates a buggy OpenCL implementation, and thus # cannot be run then a real is included. gcc_tests += opencl-types.c # This test simulates errors when lacking an OpenCL implementation. gcc_tests += opencl-lacking.c else STARPU_USE_OPENCL EXTRA_DIST += \ opencl-types.c \ opencl-lacking.c endif STARPU_USE_OPENCL dist_noinst_HEADERS = mocks.h CLEANFILES = *.gimple *.o \ base \ pointers \ register \ registered \ release \ scalar-tasks \ pointer-tasks \ lib-user \ output-pointer \ unregister \ heap-allocated \ acquire \ opencl \ starpu_idle_microsec.log EXTRA_DIST += ./run-test.in \ my-lib.h my-lib.c \ test.cl \ $(gcc_tests) # The test suite assumes that the CPU back-end is available. if RUN_GCC_PLUGIN_TESTS TESTS = $(gcc_tests) if STARPU_HAVE_AM111 LOG_COMPILER = ./run-test else TESTS_ENVIRONMENT = ./run-test endif else !RUN_GCC_PLUGIN_TESTS check-hook: -@echo "GNU Guile or CPU back-end not available, test suite not run." endif !RUN_GCC_PLUGIN_TESTS starpu-1.2.3+dfsg/gcc-plugin/tests/Makefile.in000066400000000000000000001323571320135501600212200ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011, 2012 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @HAVE_PTR_DEREFS_MAY_ALIAS_P_TRUE@am__append_1 = warn-unregistered.c @HAVE_PTR_DEREFS_MAY_ALIAS_P_FALSE@am__append_2 = warn-unregistered.c # XXX: This test simulates a buggy OpenCL implementation, and thus # cannot be run then a real is included. # This test simulates errors when lacking an OpenCL implementation. @STARPU_USE_OPENCL_FALSE@am__append_3 = opencl-types.c \ @STARPU_USE_OPENCL_FALSE@ opencl-lacking.c @STARPU_USE_OPENCL_TRUE@am__append_4 = \ @STARPU_USE_OPENCL_TRUE@ opencl-types.c \ @STARPU_USE_OPENCL_TRUE@ opencl-lacking.c subdir = gcc-plugin/tests ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(dist_noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = run-test CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(dist_noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/run-test.in \ $(top_srcdir)/build-aux/test-driver $(top_srcdir)/starpu.mk DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POTI_CFLAGS = @POTI_CFLAGS@ POTI_LIBS = @POTI_LIBS@ PROG_DATE = @PROG_DATE@ PROG_STAT = @PROG_STAT@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_COI_CPPFLAGS = @STARPU_COI_CPPFLAGS@ STARPU_COI_LDFLAGS = @STARPU_COI_LDFLAGS@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LEVELDB_LDFLAGS = @STARPU_LEVELDB_LDFLAGS@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RCCE_CFLAGS = @STARPU_RCCE_CFLAGS@ STARPU_RCCE_CPPFLAGS = @STARPU_RCCE_CPPFLAGS@ STARPU_RCCE_LDFLAGS = @STARPU_RCCE_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SCIF_CPPFLAGS = @STARPU_SCIF_CPPFLAGS@ STARPU_SCIF_LDFLAGS = @STARPU_SCIF_LDFLAGS@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SC_HYPERVISOR_DEBUG = @STARPU_SC_HYPERVISOR_DEBUG@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ mpifort_path = @mpifort_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ smpirun_path = @smpirun_path@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ gcc_tests = base.c pointers.c output-pointer.c output-pointer-errors.c \ register.c register-errors.c registered.c registered-errors.c \ acquire.c acquire-errors.c release.c release-errors.c \ unregister.c unregister-errors.c task-errors.c scalar-tasks.c \ pointer-tasks.c external-task-impl.c no-initialize.c \ lib-user.c wait-errors.c heap-allocated.c \ heap-allocated-errors.c verbose.c debug-tree.c opencl.c \ opencl-errors.c shutdown-errors.c $(am__append_1) \ $(am__append_3) EXTRA_DIST = $(am__append_2) $(am__append_4) ./run-test.in my-lib.h \ my-lib.c test.cl $(gcc_tests) dist_noinst_HEADERS = mocks.h CLEANFILES = *.gimple *.o \ base \ pointers \ register \ registered \ release \ scalar-tasks \ pointer-tasks \ lib-user \ output-pointer \ unregister \ heap-allocated \ acquire \ opencl \ starpu_idle_microsec.log # The test suite assumes that the CPU back-end is available. @RUN_GCC_PLUGIN_TESTS_TRUE@TESTS = $(gcc_tests) @RUN_GCC_PLUGIN_TESTS_TRUE@@STARPU_HAVE_AM111_TRUE@LOG_COMPILER = ./run-test @RUN_GCC_PLUGIN_TESTS_TRUE@@STARPU_HAVE_AM111_FALSE@TESTS_ENVIRONMENT = ./run-test all: all-am .SUFFIXES: .SUFFIXES: .log .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/starpu.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gcc-plugin/tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gcc-plugin/tests/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/starpu.mk $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): run-test: $(top_builddir)/config.status $(srcdir)/run-test.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? base.c.log: base.c @p='base.c'; \ b='base.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) pointers.c.log: pointers.c @p='pointers.c'; \ b='pointers.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) output-pointer.c.log: output-pointer.c @p='output-pointer.c'; \ b='output-pointer.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) output-pointer-errors.c.log: output-pointer-errors.c @p='output-pointer-errors.c'; \ b='output-pointer-errors.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) register.c.log: register.c @p='register.c'; \ b='register.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) register-errors.c.log: register-errors.c @p='register-errors.c'; \ b='register-errors.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) registered.c.log: registered.c @p='registered.c'; \ b='registered.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) registered-errors.c.log: registered-errors.c @p='registered-errors.c'; \ b='registered-errors.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) acquire.c.log: acquire.c @p='acquire.c'; \ b='acquire.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) acquire-errors.c.log: acquire-errors.c @p='acquire-errors.c'; \ b='acquire-errors.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) release.c.log: release.c @p='release.c'; \ b='release.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) release-errors.c.log: release-errors.c @p='release-errors.c'; \ b='release-errors.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unregister.c.log: unregister.c @p='unregister.c'; \ b='unregister.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unregister-errors.c.log: unregister-errors.c @p='unregister-errors.c'; \ b='unregister-errors.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) task-errors.c.log: task-errors.c @p='task-errors.c'; \ b='task-errors.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) scalar-tasks.c.log: scalar-tasks.c @p='scalar-tasks.c'; \ b='scalar-tasks.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) pointer-tasks.c.log: pointer-tasks.c @p='pointer-tasks.c'; \ b='pointer-tasks.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) external-task-impl.c.log: external-task-impl.c @p='external-task-impl.c'; \ b='external-task-impl.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) no-initialize.c.log: no-initialize.c @p='no-initialize.c'; \ b='no-initialize.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) lib-user.c.log: lib-user.c @p='lib-user.c'; \ b='lib-user.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) wait-errors.c.log: wait-errors.c @p='wait-errors.c'; \ b='wait-errors.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) heap-allocated.c.log: heap-allocated.c @p='heap-allocated.c'; \ b='heap-allocated.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) heap-allocated-errors.c.log: heap-allocated-errors.c @p='heap-allocated-errors.c'; \ b='heap-allocated-errors.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) verbose.c.log: verbose.c @p='verbose.c'; \ b='verbose.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) debug-tree.c.log: debug-tree.c @p='debug-tree.c'; \ b='debug-tree.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) opencl.c.log: opencl.c @p='opencl.c'; \ b='opencl.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) opencl-errors.c.log: opencl-errors.c @p='opencl-errors.c'; \ b='opencl-errors.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) shutdown-errors.c.log: shutdown-errors.c @p='shutdown-errors.c'; \ b='shutdown-errors.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) warn-unregistered.c.log: warn-unregistered.c @p='warn-unregistered.c'; \ b='warn-unregistered.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) opencl-types.c.log: opencl-types.c @p='opencl-types.c'; \ b='opencl-types.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) opencl-lacking.c.log: opencl-lacking.c @p='opencl-lacking.c'; \ b='opencl-lacking.c'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-generic clean-libtool cscopelist-am ctags ctags-am \ distclean distclean-generic distclean-libtool distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am .PRECIOUS: Makefile showcheck: -cat $(TEST_LOGS) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q " runtime error: " $(TEST_LOGS) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET @RUN_GCC_PLUGIN_TESTS_FALSE@check-hook: @RUN_GCC_PLUGIN_TESTS_FALSE@ -@echo "GNU Guile or CPU back-end not available, test suite not run." # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.2.3+dfsg/gcc-plugin/tests/acquire-errors.c000066400000000000000000000030061320135501600222460ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011, 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ extern float *y; static const double a[123]; int main (int argc, char *argv[]) { #pragma starpu initialize int x[123] __attribute__ ((unused)); static char z[345] __attribute__ ((unused)); #pragma starpu register x #pragma starpu acquire /* (error "parse error") */ #pragma starpu acquire 123 /* (error "neither a pointer nor an array") */ #pragma starpu acquire does_not_exit /* (error "unbound variable") */ #pragma starpu acquire argc /* (error "neither a pointer nor an array") */ #pragma starpu acquire y #pragma starpu acquire x #pragma starpu acquire x z /* (error "junk after") */ /* XXX: Uncomment below when this is supported. */ #if 0 #pragma starpu acquire z /* error "not registered" */ #pragma starpu acquire a /* error "not registered" */ #pragma starpu acquire argv /* error "not registered" */ #endif return 1; } starpu-1.2.3+dfsg/gcc-plugin/tests/acquire.c000066400000000000000000000031101320135501600207300ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* Test whether `#pragma starpu acquire ...' generates the right code. */ #undef NDEBUG #include static void foo (char *x, int foo) { expected_acquire_arguments.pointer = x; #pragma starpu acquire x } int main (int argc, char *argv[]) { #pragma starpu initialize int x[123]; static char z[345]; expected_register_arguments.pointer = x; expected_register_arguments.elements = 123; expected_register_arguments.element_size = sizeof x[0]; #pragma starpu register x expected_acquire_arguments.pointer = x; #pragma starpu acquire x expected_register_arguments.pointer = z; expected_register_arguments.elements = sizeof z; expected_register_arguments.element_size = sizeof z[0]; #pragma starpu register z expected_acquire_arguments.pointer = z; #pragma starpu acquire z foo (z, 345); assert (data_register_calls == 2); assert (data_acquire_calls == 3); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/gcc-plugin/tests/base.c000066400000000000000000000072571320135501600202310ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011, 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ #undef NDEBUG #include /* The task under test. */ static void my_scalar_task (int x, unsigned char y, int z) __attribute__ ((task)); static void my_scalar_task_cpu (int, unsigned char, int) __attribute__ ((task_implementation ("cpu", my_scalar_task))); static void my_scalar_task_opencl (int, unsigned char, int) __attribute__ ((task_implementation ("opencl", my_scalar_task))); static void my_scalar_task_cpu (int x, unsigned char y, int z) { printf ("%s: x = %i, y = %i, z = %i\n", __func__, x, (int) y, z); } static void my_scalar_task_opencl (int x, unsigned char y, int z) { printf ("%s: x = %i, y = %i, z = %i\n", __func__, x, (int) y, z); } /* Another task, where task implementation declarations are interleaved with task definitions. */ static void my_other_task (int x) __attribute__ ((task)); static void my_other_task_cpu (int) __attribute__ ((task_implementation ("cpu", my_other_task))); static void my_other_task_cpu_bis (int) __attribute__ ((task_implementation ("cpu", my_other_task))); static void my_other_task_cpu (int x) { printf ("cpu\n"); } static void my_other_task_cpu_bis (int x) { printf ("second cpu implementation\n"); } static void my_other_task_opencl (int) __attribute__ ((task_implementation ("opencl", my_other_task))); static void my_other_task_opencl (int x) { printf ("opencl\n"); } /* Task with a body. */ static void my_task_with_body (int x) __attribute__ ((task)); static void my_task_with_body (int x) { /* This body is implicitly the "cpu" implementation of the task. */ int y = x + 2; printf ("body: %i\n", y - 2); } static void my_task_with_body_opencl (int x) __attribute__ ((task_implementation ("opencl", my_task_with_body))); static void my_task_with_body_opencl (int x) { } int main (int argc, char *argv[]) { #pragma starpu initialize assert (initialized == 1); #pragma starpu hello int x = 42, z = 99; unsigned char y = 77; long y_as_long_int = 77; struct task_insert_argument expected[] = { { STARPU_VALUE, &x, sizeof x }, { STARPU_VALUE, &y, sizeof y }, { STARPU_VALUE, &z, sizeof z }, { 0, 0, 0 } }; expected_task_insert_arguments = expected; /* Invoke the task, which should make sure it gets called with EXPECTED. */ my_scalar_task (x, y, z); /* Invoke the task using literal constants instead of variables. */ my_scalar_task (42, y, z); my_scalar_task (x, 77, z); my_scalar_task (x, y, 99); my_scalar_task (42, 77, z); my_scalar_task (x, 77, 99); my_scalar_task (42, y, 99); my_scalar_task (42, 77, 99); my_scalar_task (42, y_as_long_int, 99); assert (tasks_submitted == 9); struct task_insert_argument expected2[] = { { STARPU_VALUE, &x, sizeof x }, { 0, 0, 0 } }; tasks_submitted = 0; expected_task_insert_arguments = expected2; my_other_task (42); assert (tasks_submitted == 1); my_task_with_body (42); assert (tasks_submitted == 2); #pragma starpu shutdown assert (initialized == 0); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/gcc-plugin/tests/debug-tree.c000066400000000000000000000020211320135501600213220ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* (instructions compile) */ #pragma starpu debug_tree int /* (note "debug_tree") */ int foo (void) { #pragma starpu debug_tree foo /* (note "debug_tree") */ static int x = 2; #pragma starpu debug_tree x /* (note "debug_tree") */ return x; } #pragma starpu debug_tree void int foo /* (note "debug_tree") *//* (warning "extraneous") */ starpu-1.2.3+dfsg/gcc-plugin/tests/external-task-impl.c000066400000000000000000000021511320135501600230240ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* (instructions compile) */ void the_task (int foo, float bar[foo]) __attribute__ ((task)); static void the_task_cpu (int foo, float bar[foo]) __attribute__ ((task_implementation ("cpu", the_task))); /* Make sure GCC doesn't barf on this one. */ extern void the_task_cuda (int foo, float bar[foo]) __attribute__ ((task_implementation ("cuda", the_task))); static void the_task_cpu (int foo, float bar[foo]) { /* Nothingness. */ } starpu-1.2.3+dfsg/gcc-plugin/tests/heap-allocated-errors.c000066400000000000000000000025351320135501600234660ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* (instructions compile (cflags "-Wno-unused-variable")) */ static int global[123] /* (error "cannot be used") */ __attribute__ ((heap_allocated, used)); extern int external[123] /* (error "cannot be used") */ __attribute__ ((heap_allocated)); void foo (size_t size) { float scalar /* (error "must have an array type") */ __attribute__ ((heap_allocated)); float *ptr /* (error "must have an array type") */ __attribute__ ((heap_allocated)); float incomp[] /* (error "incomplete array type") */ __attribute__ ((heap_allocated)); float incomp2[size][3][] /* (error "incomplete element type") */ __attribute__ ((heap_allocated)); } starpu-1.2.3+dfsg/gcc-plugin/tests/heap-allocated.c000066400000000000000000000050171320135501600221520ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011, 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ #undef NDEBUG #include static void foo (size_t size) { /* See ISO C99, Section 6.7.5.2 ("Array Declarators") and Section 6.7.6 ("Type names"). */ float *test_array_parm (float m[size][23], int x, int y) { assert ((char *) &m[0][0] != (char *) &m); return &m[x][y]; } size_t minus_one = size - 1; float *test_array_static_parm (float m[static minus_one][23], int x, int y) { assert ((char *) &m[0][0] != (char *) &m); return &m[x][y]; } float *test_pointer_parm (float *m, int x, int y) { return &m[23 * x + y]; } expected_malloc_argument = size * 23 * sizeof (float); /* The idea is that this code should be compilable both with and without the attribute. */ float m[size][23] __attribute__ ((heap_allocated)); assert (malloc_calls == 1); /* `&m' points to the on-stack area that stores the underlying pointer, whereas `m' and `m[0][0]' should point to the heap-allocated area. */ assert ((char *) &m != (char *) m); assert ((char *) &m[0][0] != (char *) &m); assert ((char *) &m[0][0] == (char *) m); /* Make sure "array arithmetic" works. */ assert ((char *) &m[0][1] - (char *) &m[0][0] == sizeof m[0][0]); assert ((char *) &m[1][0] - (char *) &m[0][22] == sizeof m[0][0]); unsigned int x, y; for (x = 0; x < size; x++) for (y = 0; y < 23; y++) { assert (&m[x][y] == test_array_parm (m, x, y)); assert (&m[x][y] == test_array_static_parm (m, x, y)); assert (&m[x][y] == test_pointer_parm ((float *) m, x, y)); } /* Freed when going out of scope. */ expected_free_argument = m; } int main (int argc, char *argv[]) { #pragma starpu initialize /* Choose the size such that the process would most likely segfault if `foo' tried to allocate this much data on the stack. */ foo (100000); assert (free_calls == 1); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/gcc-plugin/tests/lib-user.c000066400000000000000000000040721320135501600210310ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011, 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* Test whether tasks defined in another compilation unit can actually be used. */ /* (instructions run (dependencies "my-lib.c")) */ #include #include int main (int argc, char *argv[]) { #pragma starpu initialize /* Align X so that the assumptions behind `dummy_pointer_to_handle' hold. */ static const signed char x[] __attribute__ ((aligned (8))) = { 0, 1, 2, 3, 4, 5 }; float y[sizeof x]; static const char forty_two = 42; static const int sizeof_x = sizeof x; struct task_insert_argument expected_pointer_task[] = { { STARPU_VALUE, &forty_two, sizeof forty_two }, { STARPU_R, x }, { STARPU_RW, y }, { STARPU_VALUE, &sizeof_x, sizeof sizeof_x }, { 0, 0, 0 } }; expected_task_insert_arguments = expected_pointer_task; expected_register_arguments.pointer = (void *) x; expected_register_arguments.elements = sizeof x / sizeof x[0]; expected_register_arguments.element_size = sizeof x[0]; #pragma starpu register x expected_register_arguments.pointer = y; expected_register_arguments.elements = sizeof y / sizeof y[0]; expected_register_arguments.element_size = sizeof y[0]; #pragma starpu register y /* Invoke the task, which should make sure it gets called with EXPECTED. */ my_task (42, x, y, sizeof x); assert (tasks_submitted == 1); #pragma starpu shutdown return EXIT_SUCCESS; } starpu-1.2.3+dfsg/gcc-plugin/tests/mocks.h000066400000000000000000000351761320135501600204410ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011, 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* Testing library, including stubs of StarPU functions. */ #ifndef STARPU_GCC_PLUGIN # error barf! #endif #ifndef STARPU_USE_CPU # error damn it! #endif #undef NDEBUG #include #include #include #include #include #include #include /* Typedefs as found in . */ typedef int8_t cl_char; typedef uint8_t cl_uchar; typedef int16_t cl_short; typedef uint16_t cl_ushort; typedef int32_t cl_int; typedef uint32_t cl_uint; #ifdef BREAK_CL_LONG /* Make `cl_long' different from `long' for test purposes. */ typedef int16_t cl_long; typedef uint16_t cl_ulong; #else typedef int64_t cl_long; typedef uint64_t cl_ulong; #endif typedef uint16_t cl_half; typedef float cl_float; typedef double cl_double; /* Stub used for testing purposes. */ /* Number of tasks submitted. */ static unsigned int tasks_submitted; struct task_insert_argument { /* `STARPU_VALUE', etc. */ int type; /* Pointer to the expected value. */ const void *pointer; /* Size in bytes of the data pointed to. */ size_t size; }; /* Pointer to a zero-terminated array listing the expected `starpu_task_insert' arguments. */ const struct task_insert_argument *expected_task_insert_arguments; /* Expected targets of the codelets submitted. */ static int expected_task_insert_targets = STARPU_CPU | STARPU_OPENCL; int starpu_task_insert (struct starpu_codelet *cl, ...) { assert (cl->name != NULL && strlen (cl->name) > 0); assert (cl->where == expected_task_insert_targets); assert ((cl->where & STARPU_CPU) == 0 ? cl->cpu_funcs[0] == NULL : cl->cpu_funcs[0] != NULL); assert ((cl->where & STARPU_OPENCL) == 0 ? cl->opencl_funcs[0] == NULL : cl->opencl_funcs[0] != NULL); assert ((cl->where & STARPU_CUDA) == 0 ? cl->cuda_funcs[0] == NULL : cl->cuda_funcs[0] != NULL); va_list args; size_t i, scalars, pointers, cl_args_offset; void *pointer_args[123]; struct starpu_vector_interface pointer_args_ifaces[123]; unsigned char cl_args[234]; va_start (args, cl); const struct task_insert_argument *expected; for (expected = expected_task_insert_arguments, cl_args_offset = 1, scalars = 0, pointers = 0; expected->type != 0; expected++) { int type; type = va_arg (args, int); assert (type == expected->type); switch (type) { case STARPU_VALUE: { void *arg; size_t size; arg = va_arg (args, void *); size = va_arg (args, size_t); assert (size == expected->size); assert (arg != NULL); assert (!memcmp (arg, expected->pointer, size)); /* Pack ARG into CL_ARGS. */ assert (cl_args_offset + size + sizeof size < sizeof cl_args); memcpy (&cl_args[cl_args_offset], &size, sizeof size); cl_args_offset += sizeof size; memcpy (&cl_args[cl_args_offset], arg, size); cl_args_offset += size; scalars++; break; } case STARPU_RW: case STARPU_R: case STARPU_W: { starpu_data_handle_t handle; handle = starpu_data_lookup (expected->pointer); assert (type == cl->modes[pointers]); assert (va_arg (args, void *) == handle); assert (pointers + 1 < sizeof pointer_args_ifaces / sizeof pointer_args_ifaces[0]); pointer_args_ifaces[pointers].ptr = (uintptr_t) expected->pointer; pointer_args_ifaces[pointers].dev_handle = (uintptr_t) expected->pointer; /* for OpenCL */ pointer_args_ifaces[pointers].elemsize = 1; pointer_args_ifaces[pointers].nx = 1; pointer_args_ifaces[pointers].offset = 0; pointers++; break; } default: abort (); } } va_end (args); /* Make sure all the arguments were consumed. */ assert (expected->type == 0); tasks_submitted++; /* Finish packing the scalar arguments in CL_ARGS. */ cl_args[0] = (unsigned char) scalars; for (i = 0; i < pointers; i++) pointer_args[i] = &pointer_args_ifaces[i]; /* Call the codelets. */ if (cl->where & STARPU_CPU) cl->cpu_funcs[0] (pointer_args, cl_args); if (cl->where & STARPU_OPENCL) cl->opencl_funcs[0] (pointer_args, cl_args); if (cl->where & STARPU_CUDA) cl->cuda_funcs[0] (pointer_args, cl_args); return 0; } /* Our own implementation of `starpu_codelet_unpack_args', for debugging purposes. */ void starpu_codelet_unpack_args (void *cl_raw_arg, ...) { va_list args; size_t nargs, arg, offset, size; unsigned char *cl_arg; cl_arg = (unsigned char *) cl_raw_arg; nargs = *cl_arg; va_start (args, cl_raw_arg); for (arg = 0, offset = 1; arg < nargs; arg++, offset += sizeof (size_t) + size) { void *argp; argp = va_arg (args, void *); size = *(size_t *) &cl_arg[offset]; memcpy (argp, &cl_arg[offset + sizeof size], size); } va_end (args); } /* Data handles. A hash table mapping pointers to handles is maintained, which allows us to mimic the actual behavior of libstarpu. */ /* Entry in the `registered_handles' hash table. `starpu_data_handle_t' is assumed to be a pointer to this structure. */ struct handle_entry { UT_hash_handle hh; void *pointer; starpu_data_handle_t handle; }; #define handle_to_entry(h) ((struct handle_entry *) (h)) #define handle_to_pointer(h) \ ({ \ assert ((h) != NULL); \ assert (handle_to_entry (h)->handle == (h)); \ handle_to_entry (h)->pointer; \ }) static struct handle_entry *registered_handles; starpu_data_handle_t starpu_data_lookup (const void *ptr) { starpu_data_handle_t result; struct handle_entry *entry; HASH_FIND_PTR (registered_handles, &ptr, entry); if (STARPU_UNLIKELY (entry == NULL)) result = NULL; else result = entry->handle; return result; } void * starpu_data_get_local_ptr (starpu_data_handle_t handle) { return handle_to_pointer (handle); } /* Data registration. */ struct data_register_arguments { /* A pointer to the vector being registered. */ void *pointer; /* Number of elements in the vector. */ size_t elements; /* Size of individual elements. */ size_t element_size; }; /* Number of `starpu_vector_data_register' calls. */ static unsigned int data_register_calls; /* Variable describing the expected `starpu_vector_data_register' arguments. */ struct data_register_arguments expected_register_arguments; void starpu_vector_data_register (starpu_data_handle_t *handle, int home_node, uintptr_t ptr, uint32_t count, size_t elemsize) { /* Sometimes tests cannot tell what the pointer will be (for instance, for the `registered' attribute), and thus pass NULL as the expected pointer. */ if (expected_register_arguments.pointer != NULL) assert ((void *) ptr == expected_register_arguments.pointer); else /* Allow users to check the pointer afterward. */ expected_register_arguments.pointer = (void *) ptr; assert (count == expected_register_arguments.elements); assert (elemsize == expected_register_arguments.element_size); data_register_calls++; /* Add PTR to the REGISTERED_HANDLES hash table. */ struct handle_entry *entry = malloc (sizeof (*entry)); assert (entry != NULL); entry->pointer = (void *) ptr; entry->handle = (starpu_data_handle_t) entry; HASH_ADD_PTR(registered_handles, pointer, entry); *handle = (starpu_data_handle_t) entry; } /* Data acquisition. */ struct data_acquire_arguments { /* Pointer to the data being acquired. */ void *pointer; }; struct data_release_arguments { /* Pointer to the data being released. */ void *pointer; }; /* Number of `starpu_data_{acquire,release}' calls. */ static unsigned int data_acquire_calls, data_release_calls; /* Variable describing the expected `starpu_data_{acquire,release}' arguments. */ struct data_acquire_arguments expected_acquire_arguments; struct data_release_arguments expected_release_arguments; int starpu_data_acquire (starpu_data_handle_t handle, enum starpu_data_access_mode mode) { /* XXX: Currently only `STARPU_RW'. */ assert (mode == STARPU_RW); assert (handle_to_pointer (handle) == expected_acquire_arguments.pointer); data_acquire_calls++; return 0; } void starpu_data_release (starpu_data_handle_t handle) { assert (handle_to_pointer (handle) == expected_release_arguments.pointer); data_release_calls++; } /* Data acquisition. */ struct data_unregister_arguments { /* Pointer to the data being unregistered. */ void *pointer; }; /* Number of `starpu_data_unregister' calls. */ static unsigned int data_unregister_calls; /* Variable describing the expected `starpu_data_unregister' arguments. */ struct data_unregister_arguments expected_unregister_arguments; void starpu_data_unregister (starpu_data_handle_t handle) { assert (handle != NULL); struct handle_entry *entry = handle_to_entry (handle); assert (entry->pointer != NULL); assert (entry->pointer == expected_unregister_arguments.pointer); /* Remove the PTR -> HANDLE mapping. If a mapping from PTR to another handle existed before (e.g., when using filters), it becomes visible again. */ HASH_DEL (registered_handles, entry); entry->pointer = NULL; free (entry); data_unregister_calls++; } /* Heap allocation. */ /* Number of `starpu_malloc' and `starpu_free' calls. */ static unsigned int malloc_calls, free_calls; static size_t expected_malloc_argument; static void *expected_free_argument; int starpu_malloc (void **ptr, size_t size) { assert (size == expected_malloc_argument); *ptr = malloc (size); malloc_calls++; return 0; } int starpu_free (void *ptr) { assert (starpu_data_lookup (ptr) == NULL); assert (ptr == expected_free_argument); free_calls++; return 0; } /* OpenCL support. */ #ifndef STARPU_USE_OPENCL # define STARPU_USE_OPENCL 1 /* The `opencl' pragma needs this structure, so make sure it's defined. */ struct starpu_opencl_program { /* Nothing. */ }; typedef int cl_event; typedef int cl_kernel; typedef int cl_command_queue; extern cl_int clSetKernelArg (cl_kernel, cl_uint, size_t, const void *); extern cl_int clEnqueueNDRangeKernel(cl_command_queue /* command_queue */, cl_kernel /* kernel */, cl_uint /* work_dim */, const size_t * /* global_work_offset */, const size_t * /* global_work_size */, const size_t * /* local_work_size */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */); #endif /* Number of `load_opencl_from_string', `load_kernel', and `clSetKernelArg' calls. */ static unsigned int load_opencl_calls, load_opencl_kernel_calls, opencl_set_kernel_arg_calls, opencl_enqueue_calls, opencl_finish_calls, opencl_collect_stats_calls, opencl_release_event_calls; struct load_opencl_arguments { const char *source_file; struct starpu_opencl_program *program; }; /* Expected arguments. */ static struct load_opencl_arguments expected_load_opencl_arguments; struct cl_enqueue_kernel_arguments { size_t * global_work_size; }; /* Variable describing the expected `clEnqueueNDRangeKernel' arguments. */ static struct cl_enqueue_kernel_arguments expected_cl_enqueue_kernel_arguments; int starpu_opencl_load_opencl_from_string (const char *source, struct starpu_opencl_program *program, const char *build_options) { assert (source != NULL); /* FIXME: mmap file & check */ assert (program != expected_load_opencl_arguments.program); load_opencl_calls++; return 0; } int starpu_opencl_load_kernel (cl_kernel *kernel, cl_command_queue *queue, struct starpu_opencl_program *programs, const char *kernel_name, int devid) { assert (kernel != NULL && queue != NULL && programs != NULL && kernel_name != NULL && devid == -42); load_opencl_kernel_calls++; return 0; } int starpu_worker_get_id (void) { return 42; } int starpu_worker_get_devid (int id) { return -id; } /* Set the INDEXth argument to KERNEL to the SIZE bytes pointed to by VALUE. */ cl_int clSetKernelArg (cl_kernel kernel, cl_uint index, size_t size, const void *value) { size_t n; const struct task_insert_argument *arg; for (n = 0, arg = expected_task_insert_arguments; n < index; n++, arg++) assert (arg->pointer != NULL); switch (arg->type) { case STARPU_VALUE: assert (size == arg->size); assert (memcmp (arg->pointer, value, size) == 0); break; case STARPU_RW: case STARPU_R: case STARPU_W: assert (size == sizeof (void *)); assert (* (void **) value == arg->pointer); break; default: abort (); } opencl_set_kernel_arg_calls++; return 0; } cl_int clEnqueueNDRangeKernel(cl_command_queue command_queue, cl_kernel kernel, cl_uint work_dim, const size_t * global_work_offset, const size_t * global_work_size, const size_t * local_work_size, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event) { assert (*local_work_size == 1); assert (*global_work_size == *expected_cl_enqueue_kernel_arguments.global_work_size); opencl_enqueue_calls++; return 0; } cl_int clFinish (cl_command_queue command_queue) { opencl_finish_calls++; return 0; } cl_int starpu_opencl_collect_stats (cl_event event) { opencl_collect_stats_calls++; return 0; } cl_int clReleaseEvent (cl_event event) { opencl_release_event_calls++; return 0; } const char * starpu_opencl_error_string (cl_int s) { return "mock"; } /* Initialization. */ static int initialized; int starpu_init (struct starpu_conf *config) { initialized++; return 0; } /* Shutdown. */ void starpu_shutdown (void) { initialized--; } starpu-1.2.3+dfsg/gcc-plugin/tests/my-lib.c000066400000000000000000000023231320135501600204750ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011, 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* Example library of tasks. */ /* (instructions compile) */ #include /* Task implementations: one is `static', one is global. The codelet wrapper, codelet, and task body should be instantiated in this file. */ /* The implicit CPU implementation of `my_task'. */ void my_task (signed char a, const signed char *p, float *q, int b) { int i; for (i = 0; i < b; i++) *q = *p + a; } void my_task_opencl (signed char a, const signed char *p, float *q, int b) { int i; for (i = 0; i < b; i++) *q = *p + a; } starpu-1.2.3+dfsg/gcc-plugin/tests/my-lib.h000066400000000000000000000021771320135501600205110ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011, 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* Example library of tasks. */ #ifndef MY_LIB_H #define MY_LIB_H extern void my_task (signed char, const signed char *, float *, int) __attribute__ ((task)); /* One of the implementations of MY_TASK. Since it's `extern', this should not trigger generation of the codelet, wrapper, etc. */ extern void my_task_opencl (signed char, const signed char *, float *, int) __attribute__ ((task_implementation ("opencl", my_task))); #endif /* MY_LIB_H */ starpu-1.2.3+dfsg/gcc-plugin/tests/no-initialize.c000066400000000000000000000014421320135501600220600ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* (instructions compile) */ int main (int argc, char *argv[]) /* (warning "does not initialize") */ { return 0; } starpu-1.2.3+dfsg/gcc-plugin/tests/opencl-errors.c000066400000000000000000000040041320135501600220740ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ #include /* for `starpu_opencl_load_opencl_from_string' */ /* Claim that OpenCL is supported. */ #pragma starpu add_target "opencl" void my_task (int x, float a[x]) __attribute__ ((task)); static void my_task_cpu (int x, float a[x]) __attribute__ ((task_implementation ("cpu", my_task))); static void my_task_opencl (int x, float a[x]) __attribute__ ((task_implementation ("opencl", my_task))); static void my_task_cpu (int x, float a[x]) { } #pragma starpu opencl my_task "test.cl" "kern" 1 /* (error "not a.* task impl") */ #pragma starpu opencl my_task_cpu /* (error "not a.* task impl") */ \ "test.cl" "kern" 1 #pragma starpu opencl my_task_opencl "/dev/null" "kern" 1 /* (error "empty") */ #pragma starpu opencl my_task_opencl "/does-not-exist/" "kern" 1 /* (error "failed to access") */ #pragma starpu opencl my_task_opencl /* (error "wrong number of arg") */ #pragma starpu opencl my_task_opencl 123 "kern" 1 /* (error "string constant") */ #pragma starpu opencl my_task_opencl "test.cl" 123 1 /* (error "string constant") */ #pragma starpu opencl my_task_opencl "test.cl" "kern" "a" /* (error "integral type") */ #pragma starpu opencl my_task_opencl "test.cl" "kern" 1 "foo" /* (error "junk after") */ void foo (void) { #pragma starpu opencl my_task_opencl "test.cl" "kern" 1 /* (error "top-level") */ } starpu-1.2.3+dfsg/gcc-plugin/tests/opencl-lacking.c000066400000000000000000000017321320135501600221750ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* (instructions compile) */ void my_task (int x, float a[x]) __attribute__ ((task)); static void my_task_opencl (int x, float a[x]) __attribute__ ((task_implementation ("opencl", my_task))); #pragma starpu opencl my_task_opencl /* (note "not generated") */ \ "test.cl" "kern" 8 starpu-1.2.3+dfsg/gcc-plugin/tests/opencl-types.c000066400000000000000000000106751320135501600217370ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* Make sure use of `size_t' as a task argument type is flagged. */ /* (instructions compile) */ #undef NDEBUG /* Please gimme a broken `cl_long'! */ #define BREAK_CL_LONG #include #include #include /* for `uint' & co. */ /* Make sure `size_t' is flagged. */ static void my_task (size_t size, int x[size]) __attribute__ ((task)); static void my_task_cpu (size_t size, int x[size]) __attribute__ ((task_implementation ("cpu", my_task))); static void my_task_opencl (size_t size, int x[size]) /* (warning "size_t.*not.*known OpenCL type") */ __attribute__ ((task_implementation ("opencl", my_task))); static void my_task_cpu (size_t size, int x[size]) { } static void my_task_opencl (size_t size, int x[size]) { } /* Make sure types that have the same name in C and OpenCL but are actually different are flagged. We assume `sizeof (long) == 4' here. */ static void my_long_task (unsigned long size, int x[size]) __attribute__ ((task)); static void my_long_task_cpu (unsigned long size, int x[size]) __attribute__ ((task_implementation ("cpu", my_long_task))); static void my_long_task_opencl (unsigned long size, /* (warning "differs from the same-named OpenCL type") */ int x[size]) __attribute__ ((task_implementation ("opencl", my_long_task))); static void my_long_task_cpu (unsigned long size, int x[size]) { } static void my_long_task_opencl (unsigned long size, int x[size]) { } /* Same with a pointer-to-long. */ static void my_long_ptr_task (unsigned long *p) __attribute__ ((task)); static void my_long_ptr_task_cpu (unsigned long *p) __attribute__ ((task_implementation ("cpu", my_long_ptr_task))); static void my_long_ptr_task_opencl (unsigned long *p) /* (warning "differs from the same-named OpenCL type") */ __attribute__ ((task_implementation ("opencl", my_long_ptr_task))); static void my_long_ptr_task_cpu (unsigned long *p) { } static void my_long_ptr_task_opencl (unsigned long *p) { } /* Same with an array of unsigned chars. */ static void my_uchar_task (char c[]) __attribute__ ((task)); static void my_uchar_task_cpu (char c[]) __attribute__ ((task_implementation ("cpu", my_uchar_task))); static void my_uchar_task_opencl (char c[]) /* (warning "differs in signedness from the same-named OpenCL type") */ __attribute__ ((task_implementation ("opencl", my_uchar_task))); static void my_uchar_task_cpu (char c[]) { } static void my_uchar_task_opencl (char c[]) { } /* "unsigned int" is aka. "uint". */ static void my_uint_task (const uint *c) __attribute__ ((task)); static void my_uint_task_cpu (const uint *c) __attribute__ ((task_implementation ("cpu", my_uint_task))); static void my_uint_task_opencl (const uint *c) /* no warning */ __attribute__ ((task_implementation ("opencl", my_uint_task))); static void my_uint_task_cpu (const uint *c) { } static void my_uint_task_opencl (const uint *c) { } /* "unsigned char" is aka. "uchar". */ typedef float uchar; /* not a real `uchar'! */ static void my_fake_uchar_task (const uchar *c) __attribute__ ((task)); static void my_fake_uchar_task_cpu (const uchar *c) __attribute__ ((task_implementation ("cpu", my_fake_uchar_task))); static void my_fake_uchar_task_opencl (const uchar *c) /* (warning "differs from the same-named OpenCL type") */ __attribute__ ((task_implementation ("opencl", my_fake_uchar_task))); static void my_fake_uchar_task_cpu (const uchar *c) { } static void my_fake_uchar_task_opencl (const uchar *c) { } /* No OpenCL, no problems. */ static void my_cool_task (size_t size, long long x[size]) __attribute__ ((task)); static void my_cool_task_cpu (size_t size, long long x[size]) __attribute__ ((task_implementation ("cpu", my_cool_task))); static void my_cool_task_cpu (size_t size, long long x[size]) { } starpu-1.2.3+dfsg/gcc-plugin/tests/opencl.c000066400000000000000000000040301320135501600205610ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ #undef NDEBUG #include #include /* Claim that OpenCL is supported. */ #pragma starpu add_target "opencl" static void my_task (int x, float a[x]) __attribute__ ((task)); static void my_task_opencl (int x, float a[x]) __attribute__ ((task_implementation ("opencl", my_task))); #pragma starpu opencl my_task_opencl "test.cl" "kern" 8 int main () { static float a[123]; #pragma starpu initialize memset (a, 0, sizeof a); expected_register_arguments.pointer = a; expected_register_arguments.elements = sizeof a / sizeof a[0]; expected_register_arguments.element_size = sizeof a[0]; #pragma starpu register a static int x = 123; struct task_insert_argument expected[] = { { STARPU_VALUE, &x, sizeof x }, { STARPU_RW, a }, { 0, 0, 0 } }; expected_task_insert_arguments = expected; expected_task_insert_targets = STARPU_OPENCL; size_t y = 8; expected_cl_enqueue_kernel_arguments.global_work_size = &y; my_task (123, a); my_task (123, a); my_task (123, a); assert (tasks_submitted == 3); assert (load_opencl_calls == 1); assert (load_opencl_kernel_calls == 3); assert (opencl_set_kernel_arg_calls == 3 * 2); assert (opencl_enqueue_calls == 3); assert (opencl_finish_calls == 3); assert (opencl_release_event_calls == 3); assert (opencl_collect_stats_calls == 3); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/gcc-plugin/tests/output-pointer-errors.c000066400000000000000000000017361320135501600236430ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ #define __output __attribute__ ((output)) /* XXX: Currently, since `output' is a type attribute, we have no way to restrict its use to PARM_DECLs of tasks. */ void f (__output int x) /* (error "not allowed") */ __attribute__ ((task)); __output void g (int x); /* (error "not allowed") */ starpu-1.2.3+dfsg/gcc-plugin/tests/output-pointer.c000066400000000000000000000054611320135501600223300ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011, 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ #undef NDEBUG #include #define __output __attribute__ ((output)) /* The tasks under test. */ static void my_pointer_task (int size, __output int *x) __attribute__ ((task)); static void my_pointer_task_cpu (int size, __output int *x) __attribute__ ((task_implementation ("cpu", my_pointer_task))); static void my_pointer_task_opencl (int size, __output int *x) __attribute__ ((task_implementation ("opencl", my_pointer_task))); static void my_pointer_task_cpu (int size, __output int *x) { printf ("%s: x = %p, size = %i\n", __func__, x, size); } static void my_pointer_task_opencl (int size, int *x) { printf ("%s: x = %p, size = %i\n", __func__, x, size); } static void my_array_task (int size, __output int x[size]) __attribute__ ((task)); static void my_array_task_cpu (int size, __output int x[size]) __attribute__ ((task_implementation ("cpu", my_array_task))); static void my_array_task_opencl (int size, __output int x[size]) __attribute__ ((task_implementation ("opencl", my_array_task))); static void my_array_task_cpu (int size, __output int x[size]) { printf ("%s: x = %p, size = %i\n", __func__, x, size); } static void my_array_task_opencl (int size, __output int x[size]) { printf ("%s: x = %p, size = %i\n", __func__, x, size); } int main (int argc, char *argv[]) { #pragma starpu initialize int size = 42; int x[size]; /* Register X (don't use the pragma, to avoid mixing concerns in this test.) */ starpu_data_handle_t handle; expected_register_arguments.pointer = x; expected_register_arguments.elements = 42; expected_register_arguments.element_size = sizeof x[0]; starpu_vector_data_register (&handle, STARPU_MAIN_RAM, (uintptr_t) x, 42, sizeof x[0]); struct task_insert_argument expected[] = { { STARPU_VALUE, &size, sizeof size }, { STARPU_W, x }, { 0, 0, 0 } }; expected_task_insert_arguments = expected; /* Invoke the task, which makes sure it gets called with EXPECTED. */ my_pointer_task (size, x); assert (tasks_submitted == 1); /* Again. */ my_array_task (size, x); assert (tasks_submitted == 2); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/gcc-plugin/tests/pointer-tasks.c000066400000000000000000000042661320135501600221170ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011, 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* (instructions run (ldflags "-lstarpu-1.2")) */ #undef NDEBUG #include #include #include /* The task under test. */ static void my_pointer_task (const int *x, char a, long long *y, int b) __attribute__ ((task)); static int implementations_called; /* The input arguments. */ static const int pointer_arg1[] = { 42, 1, 2, 3, 4, 5 }; static long long *pointer_arg2; /* CPU implementation of `my_pointer_task'. */ static void my_pointer_task (const int *x, char a, long long *y, int b) { implementations_called |= STARPU_CPU; assert (x == pointer_arg1); assert (y == pointer_arg2); assert (a == 'S'); assert (b == 42); } int main (int argc, char *argv[]) { #define COUNT 100 pointer_arg2 = malloc (COUNT * sizeof *pointer_arg2); memset (pointer_arg2, 0x77, COUNT * sizeof *pointer_arg2); #pragma starpu initialize /* Register POINTER_ARG1 and POINTER_ARG2. */ #pragma starpu register pointer_arg1 #pragma starpu register pointer_arg2 COUNT /* Invoke the task, which should make sure it gets called with EXPECTED. */ my_pointer_task (pointer_arg1, 'S', pointer_arg2, 42); #pragma starpu wait assert (implementations_called == STARPU_CPU); implementations_called = 0; /* Same, but with implicit integer type conversion. */ my_pointer_task (pointer_arg1, (long long) 'S', pointer_arg2, (char) 42); #pragma starpu wait assert (implementations_called == STARPU_CPU); starpu_shutdown (); free (pointer_arg2); return EXIT_SUCCESS; #undef COUNT } starpu-1.2.3+dfsg/gcc-plugin/tests/pointers.c000066400000000000000000000067101320135501600211530ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011, 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ #undef NDEBUG #include /* The tasks under test. */ static void my_pointer_task (const int *x, short *y) __attribute__ ((task)); static void my_pointer_task_cpu (const int *, short *) __attribute__ ((task_implementation ("cpu", my_pointer_task))); static void my_pointer_task_opencl (const int *, short *) __attribute__ ((task_implementation ("opencl", my_pointer_task))); static void my_pointer_task_cpu (const int *x, short *y) { printf ("%s: x = %p, y = %p\n", __func__, x, y); assert (*x == 42 && *y == 77); } static void my_pointer_task_opencl (const int *x, short *y) { printf ("%s: x = %p, y = %p\n", __func__, x, y); assert (*x == 42 && *y == 77); } static void my_mixed_task (int *x, unsigned char z, const short *y) __attribute__ ((task)); static void my_mixed_task_cpu (int *, unsigned char, const short *) __attribute__ ((task_implementation ("cpu", my_mixed_task))); static void my_mixed_task_opencl (int *, unsigned char, const short *) __attribute__ ((task_implementation ("opencl", my_mixed_task))); static void my_mixed_task_cpu (int *x, unsigned char z, const short *y) { printf ("%s: x = %p, y = %p, z = %i\n", __func__, x, y, (int) z); } static void my_mixed_task_opencl (int *x, unsigned char z, const short *y) { printf ("%s: x = %p, y = %p, z = %i\n", __func__, x, y, (int) z); } int main (int argc, char *argv[]) { #pragma starpu initialize static const unsigned char z = 0x77; static int x[] = { 42 }; short *y; y = malloc (sizeof *y); *y = 77; /* Register X and Y (don't use the pragma, to avoid mixing concerns in this test.) */ starpu_data_handle_t handle; expected_register_arguments.pointer = x; expected_register_arguments.elements = 1; expected_register_arguments.element_size = sizeof x[0]; starpu_vector_data_register (&handle, STARPU_MAIN_RAM, (uintptr_t) x, 1, sizeof x[0]); expected_register_arguments.pointer = y; expected_register_arguments.elements = 1; expected_register_arguments.element_size = sizeof *y; starpu_vector_data_register (&handle, STARPU_MAIN_RAM, (uintptr_t) y, 1, sizeof *y); struct task_insert_argument expected_pointer_task[] = { { STARPU_R, x }, { STARPU_RW, y }, { 0, 0, 0 } }; expected_task_insert_arguments = expected_pointer_task; /* Invoke the task, which should make sure it gets called with EXPECTED. */ my_pointer_task (x, y); assert (tasks_submitted == 1); /* Likewise with `my_mixed_task'. */ struct task_insert_argument expected_mixed_task[] = { { STARPU_RW, x }, { STARPU_VALUE, &z, sizeof z }, { STARPU_R, y }, { 0, 0, 0 } }; expected_task_insert_arguments = expected_mixed_task; my_mixed_task (x, 0x77, y); assert (tasks_submitted == 2); free (y); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/gcc-plugin/tests/register-errors.c000066400000000000000000000042621320135501600224460ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011, 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* Test error handling for `#pragma starpu register ...'. */ #undef NDEBUG extern void *void_pointer; int main (int argc, char *argv[]) { #pragma starpu initialize #pragma starpu register /* (error "parse error") */ #pragma starpu register argv 234 junk here /* (error "junk after") *//* (error "unbound") *//* (error "unbound") */ static int x[123] __attribute__ ((unused)); #pragma starpu register x 234 /* (note "can be omitted") *//* (error "differs from actual size") */ size_t x_size __attribute__ ((unused)) = sizeof x / sizeof x[0]; #pragma starpu register x x_size /* (note "can be omitted") *//* (error "known at compile-time") */ #pragma starpu register does_not_exit 123 /* (error "unbound variable") */ #pragma starpu register argv does_not_exit /* (error "unbound variable") */ #pragma starpu register argv /* (error "cannot determine size") */ #pragma starpu register &argv[2] /* (error "cannot determine size") */ #pragma starpu register &x[2] /* (error "cannot determine size") */ #pragma starpu register argc /* (error "neither a pointer nor an array") */ #pragma starpu register argv[2][3] 3 /* (error "neither a pointer nor an array") */ #pragma starpu register argv[does_not_exist] 3 /* (error "unbound variable") */ char **p = argv; size_t ps = argc; #pragma starpu register p ps /* No unused variable warning, please! */ #pragma starpu register void_pointer 123 /* (error "not allowed") */ #pragma starpu register "hello" /* (error "invalid .*argument") */ return EXIT_SUCCESS; } starpu-1.2.3+dfsg/gcc-plugin/tests/register.c000066400000000000000000000133461320135501600211370ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011, 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* Test whether `#pragma starpu register ...' generates the right code. */ /* r19465 is modifying the test to avoid calling starpu_data_register twice with the same variable, starpu now checks that the same key is not entered twice in the same hashtable */ #undef NDEBUG #include static void foo (void) { int x[] = { 1, 2, 3 }; expected_register_arguments.pointer = x; expected_register_arguments.elements = sizeof x / sizeof x[0]; expected_register_arguments.element_size = sizeof x[0]; #pragma starpu register x /* (warning "considered unsafe") */ } #if 0 static void bar (float *p, int s) { expected_register_arguments.pointer = p; expected_register_arguments.elements = s; expected_register_arguments.element_size = sizeof *p; #pragma starpu register p s } /* Same as above, but with arguments reversed, to make sure using S doesn't mutate the parameter list. */ static void baz (int s, float *p) { expected_register_arguments.pointer = p; expected_register_arguments.elements = s; expected_register_arguments.element_size = sizeof *p; #pragma starpu register p s } #endif /* Check the interaction between `register' and `heap_allocated'. This test assumes `heap_allocated' works as expected. */ static void heap_alloc (int x, int y) { data_register_calls = data_unregister_calls = 0; expected_malloc_argument = x * y * sizeof (float); float m[x][y] __attribute__ ((heap_allocated)); expected_register_arguments.pointer = m; expected_register_arguments.elements = x; expected_register_arguments.element_size = y * sizeof m[0][0]; #pragma starpu register m expected_unregister_arguments.pointer = m; #pragma starpu unregister m assert (data_register_calls == 1); assert (data_unregister_calls == 1); expected_free_argument = m; } int main (int argc, char *argv[]) { #pragma starpu initialize int x[123]; double *y; double *yy; static char z[345]; static float m[7][42]; static float m3d[14][11][80]; short w[] = { 1, 2, 3 }; size_t y_size = 234; y = malloc (234 * sizeof *y); yy = malloc (234 * sizeof *yy); expected_register_arguments.pointer = x; expected_register_arguments.elements = 123; expected_register_arguments.element_size = sizeof x[0]; #pragma starpu register x 123 /* (note "can be omitted") */ expected_register_arguments.pointer = y; expected_register_arguments.elements = 234; expected_register_arguments.element_size = sizeof *y; #pragma starpu register y 234 expected_register_arguments.pointer = yy; expected_register_arguments.elements = y_size; expected_register_arguments.element_size = sizeof *yy; #pragma starpu register yy y_size expected_register_arguments.pointer = z; expected_register_arguments.elements = 345; expected_register_arguments.element_size = sizeof z[0]; #pragma starpu register z expected_register_arguments.pointer = w; expected_register_arguments.elements = 3; expected_register_arguments.element_size = sizeof w[0]; #pragma starpu register w expected_register_arguments.pointer = argv; expected_register_arguments.elements = 456; expected_register_arguments.element_size = sizeof argv[0]; #pragma starpu register argv 456 #if 0 #define ARGV argv #define N 456 expected_register_arguments.pointer = argv; expected_register_arguments.elements = N; expected_register_arguments.element_size = sizeof argv[0]; #pragma starpu register ARGV /* hello, world! */ N #undef ARGV #undef N #endif foo (); // bar ((float *) argv, argc); // baz (argc, (float *) argv); #if 0 expected_register_arguments.pointer = argv; expected_register_arguments.elements = argc; expected_register_arguments.element_size = sizeof argv[0]; int chbouib = argc; #pragma starpu register argv chbouib #endif expected_register_arguments.pointer = &argv[1]; expected_register_arguments.elements = 3; expected_register_arguments.element_size = sizeof argv[0]; #pragma starpu register &argv[1] 3 expected_register_arguments.pointer = &argv[argc + 3 / 2]; expected_register_arguments.elements = argc * 4; expected_register_arguments.element_size = sizeof argv[0]; #pragma starpu register &argv[argc + 3 / 2] (argc * 4) expected_register_arguments.pointer = &y[y_size / 2]; expected_register_arguments.elements = (y_size / 2 - 7); expected_register_arguments.element_size = sizeof y[0]; #pragma starpu register &y[y_size / 2] (y_size / 2 - 7) expected_register_arguments.pointer = m[6]; expected_register_arguments.elements = 42; expected_register_arguments.element_size = sizeof m[0][0]; #pragma starpu register m[6] expected_register_arguments.pointer = m; expected_register_arguments.elements = 7; expected_register_arguments.element_size = sizeof m[0]; #pragma starpu register m expected_register_arguments.pointer = m3d; expected_register_arguments.elements = 14; expected_register_arguments.element_size = sizeof m3d[0]; #pragma starpu register m3d #if 0 assert (data_register_calls == 17); #else assert (data_register_calls == 13); #endif free (y); free (yy); heap_alloc (42, 77); assert (free_calls == 1); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/gcc-plugin/tests/registered-errors.c000066400000000000000000000025051320135501600227550ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* (instructions compile (cflags "-Wno-unused-variable")) */ static int global[123] /* (error "cannot be used") */ __attribute__ ((registered, used)); extern int external[123] /* (error "cannot be used") */ __attribute__ ((registered)); void foo (size_t size) { float scalar /* (error "must have an array type") */ __attribute__ ((registered)); float *ptr /* (error "must have an array type") */ __attribute__ ((registered)); float incomp[] /* (error "incomplete array type") */ __attribute__ ((registered)); float incomp2[size][3][] /* (error "incomplete element type") */ __attribute__ ((registered)); } starpu-1.2.3+dfsg/gcc-plugin/tests/registered.c000066400000000000000000000070221320135501600214420ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ #undef NDEBUG #include #include static void test_vec (void) { data_register_calls = data_unregister_calls = 0; expected_register_arguments.pointer = NULL; expected_register_arguments.elements = 123; expected_register_arguments.element_size = sizeof (float); float vec[123] /* FIXME: warning: "considered unsafe" */ __attribute__ ((registered)); assert (data_register_calls == 1); assert (expected_register_arguments.pointer == vec); expected_unregister_arguments.pointer = vec; } static void test_matrix (void) { data_register_calls = data_unregister_calls = 0; expected_register_arguments.pointer = NULL; expected_register_arguments.elements = 123; expected_register_arguments.element_size = 234 * sizeof (double); double matrix[123][234] /* FIXME: warning "considered unsafe" */ __attribute__ ((registered)); assert (data_register_calls == 1); assert (expected_register_arguments.pointer == matrix); expected_unregister_arguments.pointer = matrix; } static void test_with_heap_alloc (void) { data_register_calls = data_unregister_calls = 0; malloc_calls = free_calls = 0; expected_register_arguments.pointer = NULL; expected_register_arguments.elements = 123; expected_register_arguments.element_size = 234 * 77 * sizeof (int); expected_malloc_argument = expected_register_arguments.elements * expected_register_arguments.element_size; int matrix[123][234][77] __attribute__ ((registered, heap_allocated)); assert (data_register_calls == 1); assert (expected_register_arguments.pointer == matrix); assert (malloc_calls == 1); expected_unregister_arguments.pointer = matrix; expected_free_argument = matrix; } /* Same as above, but with the attributes in reverse order. */ static void test_with_heap_alloc_reversed (void) { data_register_calls = data_unregister_calls = 0; malloc_calls = free_calls = 0; expected_register_arguments.pointer = NULL; expected_register_arguments.elements = 123; expected_register_arguments.element_size = 234 * 77 * sizeof (int); expected_malloc_argument = expected_register_arguments.elements * expected_register_arguments.element_size; int matrix[123][234][77] __attribute__ ((heap_allocated, registered)); assert (data_register_calls == 1); assert (expected_register_arguments.pointer == matrix); assert (malloc_calls == 1); expected_unregister_arguments.pointer = matrix; expected_free_argument = matrix; } int main (int argc, char *argv[]) { #pragma starpu initialize test_vec (); assert (data_unregister_calls == 1); test_matrix (); assert (data_unregister_calls == 1); test_with_heap_alloc (); assert (data_unregister_calls == 1); assert (free_calls == 1); test_with_heap_alloc_reversed (); assert (data_unregister_calls == 1); assert (free_calls == 1); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/gcc-plugin/tests/release-errors.c000066400000000000000000000024351320135501600222420ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011, 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ extern float *y; static const double a[123]; int main (int argc, char *argv[]) { #pragma starpu initialize int x[123] __attribute__ ((unused)); static char z[345] __attribute__ ((unused)); #pragma starpu register x #pragma starpu release /* (error "parse error") */ #pragma starpu release 123 /* (error "neither a pointer nor an array") */ #pragma starpu release does_not_exit /* (error "unbound variable") */ #pragma starpu release argc /* (error "neither a pointer nor an array") */ #pragma starpu release y #pragma starpu release x #pragma starpu release x z /* (error "junk after") */ return 1; } starpu-1.2.3+dfsg/gcc-plugin/tests/release.c000066400000000000000000000031101320135501600207170ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* Test whether `#pragma starpu release ...' generates the right code. */ #undef NDEBUG #include static void foo (char *x, int foo) { expected_release_arguments.pointer = x; #pragma starpu release x } int main (int argc, char *argv[]) { #pragma starpu initialize int x[123]; static char z[345]; expected_register_arguments.pointer = x; expected_register_arguments.elements = 123; expected_register_arguments.element_size = sizeof x[0]; #pragma starpu register x expected_release_arguments.pointer = x; #pragma starpu release x expected_register_arguments.pointer = z; expected_register_arguments.elements = sizeof z; expected_register_arguments.element_size = sizeof z[0]; #pragma starpu register z expected_release_arguments.pointer = z; #pragma starpu release z foo (z, 345); assert (data_register_calls == 2); assert (data_release_calls == 3); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/gcc-plugin/tests/run-test.in000066400000000000000000000412001320135501600212460ustar00rootroot00000000000000#!/bin/sh # -*- mode: scheme; coding: utf-8; -*- GUILE_AUTO_COMPILE=0 export GUILE_AUTO_COMPILE main='(@ (run-test) build/run)' exec "${GUILE-@GUILE@}" -l "$0" \ -c "(apply $main (cdr (command-line)))" "$@" !# ;;; GCC-StarPU ;;; Copyright (C) 2011, 2012 INRIA ;;; ;;; GCC-StarPU is free software: you can redistribute it and/or modify ;;; it under the terms of the GNU General Public License as published by ;;; the Free Software Foundation, either version 3 of the License, or ;;; (at your option) any later version. ;;; ;;; GCC-StarPU is distributed in the hope that it will be useful, ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with GCC-StarPU. If not, see . ;;; ;;; Written by Ludovic Courtès . ;;; (define-module (run-test) #:use-module (ice-9 regex) #:use-module (ice-9 popen) #:use-module (ice-9 rdelim) #:use-module (ice-9 format) #:use-module (ice-9 match) #:use-module (srfi srfi-1) #:use-module (srfi srfi-9) #:use-module (srfi srfi-11) #:use-module (srfi srfi-13) #:use-module (srfi srfi-14) #:use-module (srfi srfi-26) #:export (build/run)) ;;; Commentary: ;;; ;;; Test machinery similar to the DejaGNU-based test framework used in GCC. ;;; In a nutshell, this program compiles code with GCC and makes sure ;;; warnings and errors are as appear in source code comments. ;;; ;;; This module should work with both Guile 1.8 and Guile 2.0. ;;; ;;; Code: ;; Make sure the reader gets position information. (read-enable 'positions) (define %log-port ;; Output port for debugging messages. (current-output-port)) (define (log fmt . args) "Write an informational message." (apply format %log-port (string-append fmt "\n") args)) ;;; ;;; Compiling code. ;;; (define %srcdir "@srcdir@") (define %builddir "@builddir@") (define %gcc "@CC@") (define %cuda-cppflags (string-tokenize "@STARPU_CUDA_CPPFLAGS@")) (define %opencl-cppflags (string-tokenize "@STARPU_OPENCL_CPPFLAGS@")) (define %default-cflags `("-I" ,%srcdir "-I" ,(string-append %srcdir "/../../src") ; for "-I" ,(string-append %srcdir "/../../include") "-I" ,(string-append %builddir "/../../include") "-I" ,(string-append %builddir "/../..") ,@%cuda-cppflags ,@%opencl-cppflags ;; Unfortunately `libtool --mode=execute' doesn't help here, so hard-code ;; the real file name. ,(string-append "-fplugin=" %builddir "/../src/.libs/starpu.so") ;; Use the non-installed headers. "-fplugin-arg-starpu-include-dir=@top_srcdir@/include" ;; Find OpenCL source files under $srcdir. ,(string-append "-fplugin-arg-starpu-opencl-include-dir=" %srcdir) "-g" "-fdump-tree-gimple" "-Wall")) (define %default-ldflags `(,(string-append "-L" %builddir "/../../src"))) (define %libtool (string-append %builddir "/../../libtool")) (define (compile-starpu-code file cc cflags ldflags) "Compile and link FILE with CC, using CFLAGS and LDFLAGS. Return the compiler status and the list of lines printed on stdout/stderr." (let* ((compile? (member "-c" cflags)) (ldflags (if compile? (remove (cut string-prefix? "-L" <>) ldflags) ldflags)) (mode (if compile? "compile" "link")) (command (format #f "LC_ALL=C ~a --mode=~a ~a ~{~a ~} \"~a\" ~{~a ~} 2>&1" %libtool mode cc cflags file ldflags)) (pipe (begin (log "running `~a'" command) (open-input-pipe command)))) (let loop ((line (read-line pipe)) (result '())) (if (eof-object? line) (values (close-pipe pipe) (reverse result)) (loop (read-line pipe) (cons line result)))))) (define (run-starpu-code executable) "Run EXECUTABLE using Libtool; return its exit status." (let* ((exe (if (string-index executable #\/) executable (string-append (getcwd) "/" executable))) (command (string-append %libtool " --mode=execute " exe))) (log "running `~a'" command) (system command))) ;;; ;;; GCC diagnostics. ;;; (define-record-type (make-location file line column) location? (file location-file) (line location-line) (column location-column)) (define (location=? loc1 loc2) "Return #t if LOC1 and LOC2 refer roughly to the same file and line number." (and (location-file loc1) (location-file loc2) (string=? (basename (location-file loc1)) (basename (location-file loc2))) (= (location-line loc1) (location-line loc2)))) (define-record-type (make-diagnostic location kind message) diagnostic? (location diagnostic-location) (kind diagnostic-kind) (message diagnostic-message)) (define %diagnostic-with-location-rx ;; "FILE:LINE:COL: KIND: MESSAGE..." (make-regexp "^(.+):([[:digit:]]+):([[:digit:]]+): ([^:]+): (.*)$")) (define (string->diagnostic str) "Parse STR and return the corresponding `diagnostic' object." (cond ((regexp-exec %diagnostic-with-location-rx str) => (lambda (m) (let ((loc (make-location (match:substring m 1) (string->number (match:substring m 2)) (string->number (match:substring m 3)))) (kind (string->symbol (match:substring m 4)))) (make-diagnostic loc kind (match:substring m 5))))) (else (make-diagnostic #f #f str)))) ;;; ;;; Reading test directives. ;;; (define (read-test-directives port) "Read test directives from PORT. Return a list of location/directive pairs." (define (consume-whitespace p) (let loop ((chr (peek-char p))) (cond ((char-set-contains? char-set:whitespace chr) (read-char p) ;; consume CHR (loop (peek-char p))) (else chr)))) (define (read-until-*/ p) (let loop ((chr (read-char p))) (cond ((eof-object? chr) (error "unterminated C comment")) ((eq? chr #\*) (let ((next (peek-char p))) (if (eq? next #\/) (read-char p) ;; consume CHR (loop (read-char p))))) (else (loop (read-char p)))))) (let loop ((chr (read-char port)) (directives '())) (cond ((eof-object? chr) (reverse directives)) ((eq? chr #\/) (let ((chr (read-char port))) (if (eq? chr #\*) (let ((chr (consume-whitespace port))) (if (eq? chr #\() (let ((loc (make-location (port-filename port) (1+ (port-line port)) (port-column port))) (sexp (read port))) (read-until-*/ port) (loop (peek-char port) (cons (cons loc sexp) directives))) (begin (read-until-*/ port) (loop (peek-char port) directives)))) (loop chr directives)))) (else (loop (read-char port) directives))))) (define (diagnostic-matches-directive? diagnostic directive location cflags ldflags) "Return #t if DIAGNOSTIC matches DIRECTIVE, which is at LOCATION." (define optimizing? (let ((opt (find (cut string-prefix? "-O" <>) cflags))) (match opt ((or #f "-O0") #f) (_ #t)))) (let loop ((directive directive)) (match directive (('if 'optimizing? directive) (or (not optimizing?) (loop directive))) (('unless 'optimizing? directive) (or optimizing? (loop directive))) ((kind message) (and (eq? kind (diagnostic-kind diagnostic)) (location? (diagnostic-location diagnostic)) (location=? (diagnostic-location diagnostic) location) (string-match message (diagnostic-message diagnostic))))))) ;;; ;;; Compiling and matching diagnostics against directives. ;;; (define (compile/match* file directives cc cflags ldflags) "Compile FILE and check whether GCC's diagnostics match DIRECTIVES. Return 3 values: the compiler's status code, the unmatched diagnostics, and the unsatisfied directives." (let-values (((status diagnostics) (compile-starpu-code file cc cflags ldflags))) (let loop ((diagnostics (map string->diagnostic diagnostics)) (directives directives) (unsatisfied '())) (if (null? directives) (values status diagnostics unsatisfied) (let* ((dir (car directives)) (diag (find (cute diagnostic-matches-directive? <> (cdr dir) (car dir) cflags ldflags) diagnostics))) (if diag (loop (delq diag diagnostics) (cdr directives) unsatisfied) (loop diagnostics (cdr directives) (cons dir unsatisfied)))))))) (define (executable-file source) "Return the name of the executable file corresponding to SOURCE." (let* ((dot (string-rindex source #\.)) (exe (if dot (substring source 0 dot) (string-append source ".exe"))) ) (if (string-prefix? %srcdir exe) (string-append %builddir (substring exe (string-length %srcdir))) exe ))) (define (compile/match file cc cflags ldflags) "Read directives from FILE, and compiler/link/run it. Make sure directives are matched, and report any errors otherwise. Return #t on success and #f otherwise." (define directives (call-with-input-file file read-test-directives)) (define exe (executable-file file)) (define (c->o c-file) (string-append (substring c-file 0 (- (string-length c-file) 2)) ".lo")) (log "~a directives found in `~a'" (length directives) file) (let*-values (((error-expected?) (find (lambda (l+d) (match l+d (((? location?) 'error _) #t) (_ #f))) directives)) ((instructions) (or (any (lambda (l+d) (match l+d (((? location?) 'instructions x ...) x) (_ #f))) directives) '(run))) ((options) (match instructions ((_ options ...) options) (_ '()))) ((dependencies) (or (assq-ref options 'dependencies) '()))) (or (null? dependencies) (format (current-output-port) "~s has ~a dependencies: ~{~s ~}~%" file (length dependencies) dependencies)) (and (every (cut compile/match <> cc cflags ldflags) (map (cut string-append %srcdir "/" <>) dependencies)) (let*-values (((goal) (if error-expected? 'compile (car instructions))) ((cflags) `(,@cflags ,@(or (assq-ref options 'cflags) '()) ,@(if (memq goal '(link run)) `("-o" ,exe) '("-c")))) ((ldflags) `(,@(map c->o dependencies) ,@ldflags ,@(or (assq-ref options 'ldflags) '()))) ((directives) (remove (lambda (l+d) (match l+d (((? location?) 'instructions _ ...) #t) (_ #f))) directives)) ((status diagnostics unsatisfied) (compile/match* file directives cc cflags ldflags)) ((unmatched) ;; Consider unmatched only diagnostics that have a ;; kind, to avoid taking into account messages like ;; "In file included from", "In function 'main'", ;; etc. (filter diagnostic-kind diagnostics))) (or (null? unmatched) (begin (format (current-error-port) "error: ~a unmatched GCC diagnostics:~%" (length unmatched)) (for-each (lambda (d) (format (current-error-port) " ~a:~a:~a: ~a: ~a~%" (and=> (diagnostic-location d) location-file) (and=> (diagnostic-location d) location-line) (and=> (diagnostic-location d) location-column) (diagnostic-kind d) (diagnostic-message d))) unmatched) #f)) (if (null? unsatisfied) (or (null? directives) (log "~a directives satisfied" (length directives))) (begin (format (current-error-port) "error: ~a unsatisfied directives:~%" (length unsatisfied)) (for-each (lambda (l+d) (let ((loc (car l+d)) (dir (cdr l+d))) (format (current-error-port) " ~a:~a:~a: ~a: ~s~%" (location-file loc) (location-line loc) (location-column loc) (car dir) (cadr dir)))) unsatisfied) #f)) (if error-expected? (if (= 0 status) (format (current-error-port) "error: compilation succeeded~%")) (if (= 0 status) (or (eq? goal 'compile) (file-exists? exe) (begin (format (current-error-port) "error: executable file `~a' not found~%" exe) #f)) (format (current-error-port) "error: compilation failed (compiler exit code ~a)~%~{ ~a~%~}" status (map diagnostic-message diagnostics)))) (and (null? unmatched) (null? unsatisfied) (if error-expected? (not (= 0 status)) (and (= 0 status) (or (eq? goal 'compile) (file-exists? exe)) (or (not (eq? goal 'run)) (let ((status (run-starpu-code exe))) (or (= 0 status) (begin (format (current-error-port) "error: program `~a' failed \ (exit code ~a)~%" exe status) #f))))))))))) ;;; ;;; Entry point. ;;; (define (build/run . file) (exit (every (lambda (file) ;; For each file, check that everything works both with and ;; without optimizations. (every (cut compile/match file %gcc <> %default-ldflags) `((,"-O0" ,@%default-cflags) (,"-O2" ,@%default-cflags)))) file))) ;;; run-test.in ends here starpu-1.2.3+dfsg/gcc-plugin/tests/scalar-tasks.c000066400000000000000000000033711320135501600217000ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011, 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* (instructions run (ldflags "-lstarpu-1.2")) */ #undef NDEBUG #include #include /* The task under test. */ static void my_scalar_task (int x, int y) __attribute__ ((task)); static void my_scalar_task_opencl (int, int) __attribute__ ((task_implementation ("opencl", my_scalar_task), noinline)); static int implementations_called; /* CPU implementation of `my_scalar_task'. */ static void my_scalar_task (int x, int y) { implementations_called |= STARPU_CPU; assert (x == 42); assert (y == 77); } static void my_scalar_task_opencl (int x, int y) { implementations_called |= STARPU_OPENCL; assert (x == 42); assert (y == 77); } int main (int argc, char *argv[]) { #pragma starpu initialize /* Invoke the task, which should make sure it gets called with EXPECTED. */ my_scalar_task (42, 77); #pragma starpu wait assert ((implementations_called & STARPU_CPU) || (implementations_called & STARPU_OPENCL)); assert ((implementations_called & ~(STARPU_CPU | STARPU_OPENCL)) == 0); starpu_shutdown (); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/gcc-plugin/tests/shutdown-errors.c000066400000000000000000000014631320135501600224750ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ int main (int argc, char *argv[]) { #pragma starpu initialize #pragma starpu shutdown foo bar /* (error "junk after") */ return 0; } starpu-1.2.3+dfsg/gcc-plugin/tests/task-errors.c000066400000000000000000000103771320135501600215700ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011, 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* Test error handling for the `task' and `task_implementation' attributes. */ extern void my_external_task (int foo, char *bar) __attribute__ ((task)); void my_task (int foo, char *bar) /* (error "none of the implementations") */ __attribute__ ((task)); static void my_task_cpu (int foo, float *bar) /* (error "type differs") */ __attribute__ ((task_implementation ("cpu", my_task))); static void my_task_opencl (long foo, char *bar) /* (error "type differs") */ __attribute__ ((task_implementation ("opencl", my_task))); static void my_task_nowhere (int foo, char *bar) /* (warning "unsupported target") */ __attribute__ ((task_implementation ("does-not-exist", my_task))); static void my_task_not_quite (int foo, char *bar) /* (error "lacks the 'task' attribute") */ __attribute__ ((task_implementation ("cpu", my_task_nowhere))); static int foo /* (error "only applies to function") */ __attribute__ ((task_implementation ("cpu", my_task))); static int bar /* (error "only applies to function") */ __attribute__ ((task, unused)); static int not_a_task __attribute__ ((unused)); static void my_task_almost (int foo, char *bar) /* (error "not a function") */ __attribute__ ((task_implementation ("cpu", not_a_task))); static void my_task_wrong_task_arg (int foo, char *bar) /* (error "not a function") */ __attribute__ ((task_implementation ("cpu", 123))); static void my_task_wrong_target_arg (int foo, char *bar) /* (error "string constant expected") */ __attribute__ ((task_implementation (123, my_task))); extern int my_task_not_void (int foo) /* (error "return type") */ __attribute__ ((task)); void my_task_that_invokes_task (int x, char *y) __attribute__ ((task)); void my_task_that_invokes_task_cpu (int x, char *y) __attribute__ ((task_implementation ("cpu", my_task_that_invokes_task))); //FIXME: gordon no longer being a valid target, it cannot longer be // used to test that a task without any valid implementation leads to // an error ///* XXX: The assumption behind this test is that STARPU_USE_GORDON is not // defined. */ //void my_task_with_no_usable_implementation (int x) /* error "none of the implementations") */ // __attribute__ ((task)); // //static void my_task_with_no_usable_implementation_gordon (int x) // __attribute__ ((task_implementation ("gordon", // my_task_with_no_usable_implementation))); /* XXX: In practice this test fails for large values of `STARPU_NMAXBUFS'. */ void my_task_with_too_many_pointer_params (/* (error "maximum .* exceeded") */ char *x1, char *x2, char *x3, char *x4, char *x5, char *x6, char *x7, char *x8, char *x9, char *xa, char *xb, char *xc, char *xd, char *xe, char *xf, char *xg, char *xh, char *xi) __attribute__ ((task)); static void my_task_without_any_parameters (void) __attribute__ ((task)); static void my_task_without_any_parameters_cuda (void) __attribute__ ((task_implementation ("cuda", my_task_without_any_parameters))); void my_task_without_any_parameters (void) { } void my_task_without_any_parameters_cuda (void) { } static void my_task_cpu (int foo, float *bar) { } static void my_task_opencl (long foo, char *bar) { } static void my_task_nowhere (int foo, char *bar) { } static void my_task_not_quite (int foo, char *bar) { } static void my_task_almost (int foo, char *bar) { } static void my_task_wrong_task_arg (int foo, char *bar) { } static void my_task_wrong_target_arg (int foo, char *bar) { } void my_task_that_invokes_task_cpu (int x, char *y) { my_external_task (x, y); /* (error "cannot be invoked from task implementation") */ } starpu-1.2.3+dfsg/gcc-plugin/tests/test.cl000066400000000000000000000012461320135501600204420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* This is an almost empty OpenCL file. */ starpu-1.2.3+dfsg/gcc-plugin/tests/unregister-errors.c000066400000000000000000000027401320135501600230100ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ extern float *y; static const double a[123]; int main (int argc, char *argv[]) { #pragma starpu initialize int x[123] __attribute__ ((unused)); static char z[345] __attribute__ ((unused)); #pragma starpu register x #pragma starpu unregister /* (error "parse error") */ #pragma starpu unregister 123 /* (error "neither a pointer nor an array") */ #pragma starpu unregister does_not_exit /* (error "unbound variable") */ #pragma starpu unregister argc /* (error "neither a pointer nor an array") */ #pragma starpu unregister y #pragma starpu unregister x /* XXX: Uncomment below when this is supported. */ #if 0 #pragma starpu unregister z /* error "not registered" */ #pragma starpu unregister a /* error "not registered" */ #pragma starpu unregister argv /* error "not registered" */ #endif return 1; } starpu-1.2.3+dfsg/gcc-plugin/tests/unregister.c000066400000000000000000000027351320135501600215020ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* Test whether `#pragma starpu unregister ...' generates the right code. */ #undef NDEBUG #include int main (int argc, char *argv[]) { #pragma starpu initialize int x[123]; static char z[345]; expected_register_arguments.pointer = x; expected_register_arguments.elements = 123; expected_register_arguments.element_size = sizeof x[0]; #pragma starpu register x expected_unregister_arguments.pointer = x; #pragma starpu unregister x expected_register_arguments.pointer = z; expected_register_arguments.elements = sizeof z; expected_register_arguments.element_size = sizeof z[0]; #pragma starpu register z expected_unregister_arguments.pointer = z; #pragma starpu unregister z assert (data_register_calls == 2); assert (data_unregister_calls == 2); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/gcc-plugin/tests/verbose.c000066400000000000000000000030061320135501600207500ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* (instructions compile (cflags "-fplugin-arg-starpu-verbose")) */ #ifndef STARPU_GCC_PLUGIN # error barf! #endif static void my_task (int x) /* (note "implementations for task") */ __attribute__ ((task)); static void my_task_cpu (int x) __attribute__ ((task_implementation ("cpu", my_task))); extern void my_task_cpu_sse (int x) /* (note "my_task_cpu_sse") */ __attribute__ ((task_implementation ("cpu", my_task))); extern void my_task_opencl (int x) /* (note "my_task_opencl") */ __attribute__ ((task_implementation ("opencl", my_task))); extern void my_task_cuda (int x) /* (note "my_task_cuda") */ __attribute__ ((task_implementation ("cuda", my_task))); static void my_task_cpu (int x) /* (note "my_task_cpu") */ { /* Nothing. */ } int bar (int x) { my_task (x); /* (note "calls task") */ return 42; } starpu-1.2.3+dfsg/gcc-plugin/tests/wait-errors.c000066400000000000000000000017061320135501600215660ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2011 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* The task under test. */ void task (int x, char y, int z) __attribute__ ((task)); static void task_cpu (int x, char y, int z) __attribute__ ((task_implementation ("cpu", task))); static void task_cpu (int x, char y, int z) { #pragma starpu wait /* (error "not allowed") */ } starpu-1.2.3+dfsg/gcc-plugin/tests/warn-unregistered.c000066400000000000000000000105251320135501600227540ustar00rootroot00000000000000/* GCC-StarPU Copyright (C) 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* (instructions compile) */ /* Make sure warnings get raised when pointer variables are likely never registered. */ extern void my_task (double *x, double *y) __attribute__ ((task)); extern double *global1; double global2[123]; void parm_decl_no_warn (double *parm1, double *parm2) { my_task (parm1, parm2); /* no warning, because these are parameters so we cannot tell anything */ } void global_decl_no_warn (void) { my_task (global1, global2); } void two_unregistered_pointers (void) { double *p, *q; p = malloc (12 * sizeof *p); q = malloc (23 * sizeof *q); my_task (p, q); /* (warning "p.* used unregistered") *//* (warning "q.* used unregistered") */ } void one_unregistered_pointer (void) { double *p, *q; p = malloc (12 * sizeof *p); q = malloc (23 * sizeof *q); #pragma starpu register p 12 my_task (p, q); /* (if optimizing? (warning "q.* used unregistered")) */ } void another_unregistered_pointer (void) { double X[] = { 1, 2, 3, 4 }; double *Y; Y = malloc (123 * sizeof *Y); if (Y == NULL) return; else { extern void frob (double *); frob (Y); } X[0] = 42; #pragma starpu register Y 123 my_task (X, Y); /* (warning "X.* used unregistered") */ } void zero_unregistered_pointers (void) { double *p, *q; p = malloc (12 * sizeof *p); q = malloc (23 * sizeof *q); #pragma starpu register p 12 #pragma starpu register q 23 my_task (p, q); /* no warning */ } void two_pointers_unregistered_before_call (void) { double *p, *q; p = malloc (12 * sizeof *p); q = malloc (23 * sizeof *q); my_task (p, q); /* (warning "p.* used unregistered") *//* (warning "q.* used unregistered") */ #pragma starpu register p 12 #pragma starpu register q 23 } void one_unregistered_array (void) { double PPP[12], QQQ[23]; #pragma starpu register PPP /* (warning "on-stack .* unsafe") */ my_task (PPP, QQQ); /* (warning "QQQ.* used unregistered") */ } void not_the_ones_registered (void) { double a[12], b[23], p[12], q[23]; #pragma starpu register a /* (warning "on-stack .* unsafe") */ #pragma starpu register b /* (warning "on-stack .* unsafe") */ my_task (p, q); /* (warning "p.* used unregistered") */ /* (warning "q.* used unregistered") */ } void registered_pointers_with_aliases (void) { double *a, *b, *p, *q; a = malloc (123 * sizeof *a); b = malloc (234 * sizeof *b); #pragma starpu register a 123 #pragma starpu register b 234 p = a; q = b; my_task (p, q); /* no warning */ } void one_unregistered_array_attrs (void) { double p[12]; double q[23] __attribute__ ((heap_allocated, registered)); my_task (p, q); /* (warning "p.* used unregistered") */ } void unregistered_on_one_path (int x) { double p[12], q[34]; if (x > 42) { #pragma starpu register p /* (warning "on-stack .* unsafe") */ } #pragma starpu register q /* (warning "on-stack .* unsafe") */ my_task (p, q); /* (warning "p.* used unregistered") */ } void registered_via_two_paths (int x) { double p[12], q[34]; if (x > 42) { #pragma starpu register p /* (warning "on-stack .* unsafe") */ } else { #pragma starpu register p /* (warning "on-stack .* unsafe") */ } #pragma starpu register q /* (warning "on-stack .* unsafe") */ my_task (p, q); /* no warning */ } #if 0 /* FIXME: This case currently triggers a false positives. */ void registered_and_used_in_loop (void) { int i; double *p[123]; static double q[234]; for (i = 0; i < 123; i++) { p[i] = malloc (123 * sizeof *p[i]); #pragma starpu register p[i] 123 } for (i = 0; i < 123; i++) my_task (p[i], q); } #endif starpu-1.2.3+dfsg/include/000077500000000000000000000000001320135501600153715ustar00rootroot00000000000000starpu-1.2.3+dfsg/include/fstarpu_mod.f90000066400000000000000000004407331320135501600202470ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2016 Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ! ! See the GNU Lesser General Public License in COPYING.LGPL for more details. module fstarpu_mod use iso_c_binding implicit none ! Note: Constants truly are intptr_t, but are declared as c_ptr to be ! readily usable in c_ptr arrays to mimic variadic functions. ! Note: Bitwise or operator is provided by the .ior. overloaded operator type(c_ptr), bind(C) :: FSTARPU_R type(c_ptr), bind(C) :: FSTARPU_W type(c_ptr), bind(C) :: FSTARPU_RW type(c_ptr), bind(C) :: FSTARPU_SCRATCH type(c_ptr), bind(C) :: FSTARPU_REDUX type(c_ptr), bind(C) :: FSTARPU_COMMUTE type(c_ptr), bind(C) :: FSTARPU_SSEND type(c_ptr), bind(C) :: FSTARPU_LOCALITY type(c_ptr), bind(C) :: FSTARPU_DATA_ARRAY type(c_ptr), bind(C) :: FSTARPU_DATA_MODE_ARRAY type(c_ptr), bind(C) :: FSTARPU_CL_ARGS type(c_ptr), bind(C) :: FSTARPU_CALLBACK type(c_ptr), bind(C) :: FSTARPU_CALLBACK_WITH_ARG type(c_ptr), bind(C) :: FSTARPU_CALLBACK_ARG type(c_ptr), bind(C) :: FSTARPU_PROLOGUE_CALLBACK type(c_ptr), bind(C) :: FSTARPU_PROLOGUE_CALLBACK_ARG type(c_ptr), bind(C) :: FSTARPU_PROLOGUE_CALLBACK_POP type(c_ptr), bind(C) :: FSTARPU_PROLOGUE_CALLBACK_POP_ARG type(c_ptr), bind(C) :: FSTARPU_PRIORITY type(c_ptr), bind(C) :: FSTARPU_EXECUTE_ON_NODE type(c_ptr), bind(C) :: FSTARPU_EXECUTE_ON_DATA type(c_ptr), bind(C) :: FSTARPU_EXECUTE_ON_WORKER type(c_ptr), bind(C) :: FSTARPU_WORKER_ORDER type(c_ptr), bind(C) :: FSTARPU_HYPERVISOR_TAG type(c_ptr), bind(C) :: FSTARPU_POSSIBLY_PARALLEL type(c_ptr), bind(C) :: FSTARPU_FLOPS type(c_ptr), bind(C) :: FSTARPU_TAG type(c_ptr), bind(C) :: FSTARPU_TAG_ONLY type(c_ptr), bind(C) :: FSTARPU_NAME type(c_ptr), bind(C) :: FSTARPU_NODE_SELECTION_POLICY type(c_ptr), bind(C) :: FSTARPU_VALUE type(c_ptr), bind(C) :: FSTARPU_SCHED_CTX type(c_ptr), bind(C) :: FSTARPU_CPU_WORKER type(c_ptr), bind(C) :: FSTARPU_CUDA_WORKER type(c_ptr), bind(C) :: FSTARPU_OPENCL_WORKER type(c_ptr), bind(C) :: FSTARPU_MIC_WORKER type(c_ptr), bind(C) :: FSTARPU_SCC_WORKER type(c_ptr), bind(C) :: FSTARPU_ANY_WORKER integer(c_int), bind(C) :: FSTARPU_NMAXBUFS type(c_ptr), bind(C) :: FSTARPU_SCHED_CTX_POLICY_NAME type(c_ptr), bind(C) :: FSTARPU_SCHED_CTX_POLICY_STRUCT type(c_ptr), bind(C) :: FSTARPU_SCHED_CTX_POLICY_MIN_PRIO type(c_ptr), bind(C) :: FSTARPU_SCHED_CTX_POLICY_MAX_PRIO type(c_ptr), bind(C) :: FSTARPU_SCHED_CTX_HIERARCHY_LEVEL type(c_ptr), bind(C) :: FSTARPU_SCHED_CTX_NESTED type(c_ptr), bind(C) :: FSTARPU_SCHED_CTX_AWAKE_WORKERS type(c_ptr), bind(C) :: FSTARPU_NOWHERE type(c_ptr), bind(C) :: FSTARPU_CPU type(c_ptr), bind(C) :: FSTARPU_CUDA type(c_ptr), bind(C) :: FSTARPU_OPENCL type(c_ptr), bind(C) :: FSTARPU_MIC type(c_ptr), bind(C) :: FSTARPU_SCC type(c_ptr), bind(C) :: FSTARPU_CODELET_SIMGRID_EXECUTE type(c_ptr), bind(C) :: FSTARPU_CUDA_ASYNC type(c_ptr), bind(C) :: FSTARPU_OPENCL_ASYNC ! (some) portable iso_c_binding types type(c_ptr), bind(C) :: FSTARPU_SZ_C_DOUBLE type(c_ptr), bind(C) :: FSTARPU_SZ_C_FLOAT type(c_ptr), bind(C) :: FSTARPU_SZ_C_CHAR type(c_ptr), bind(C) :: FSTARPU_SZ_C_INT type(c_ptr), bind(C) :: FSTARPU_SZ_C_INTPTR_T type(c_ptr), bind(C) :: FSTARPU_SZ_C_PTR type(c_ptr), bind(C) :: FSTARPU_SZ_C_SIZE_T ! (some) native Fortran types type(c_ptr), bind(C) :: FSTARPU_SZ_CHARACTER type(c_ptr), bind(C) :: FSTARPU_SZ_INTEGER type(c_ptr), bind(C) :: FSTARPU_SZ_INT4 type(c_ptr), bind(C) :: FSTARPU_SZ_INT8 type(c_ptr), bind(C) :: FSTARPU_SZ_REAL type(c_ptr), bind(C) :: FSTARPU_SZ_REAL4 type(c_ptr), bind(C) :: FSTARPU_SZ_REAL8 type(c_ptr), bind(C) :: FSTARPU_SZ_DOUBLE_PRECISION type(c_ptr), bind(C) :: FSTARPU_SZ_COMPLEX type(c_ptr), bind(C) :: FSTARPU_SZ_COMPLEX4 type(c_ptr), bind(C) :: FSTARPU_SZ_COMPLEX8 interface operator (.ior.) procedure or_cptrs end interface operator (.ior.) interface ! == starpu.h == ! void starpu_conf_init(struct starpu_conf *conf); subroutine fstarpu_conf_init (conf) bind(C,name="starpu_conf_init") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: conf end subroutine fstarpu_conf_init function fstarpu_conf_allocate () bind(C) use iso_c_binding, only: c_ptr type(c_ptr) :: fstarpu_conf_allocate end function fstarpu_conf_allocate subroutine fstarpu_conf_free (conf) bind(C) use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: conf end subroutine fstarpu_conf_free subroutine fstarpu_conf_set_sched_policy_name (conf, policy_name) bind(C) use iso_c_binding, only: c_ptr, c_char type(c_ptr), value, intent(in) :: conf character(c_char), intent(in) :: policy_name end subroutine fstarpu_conf_set_sched_policy_name subroutine fstarpu_conf_set_min_prio (conf, min_prio) bind(C) use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: conf integer(c_int), value, intent(in) :: min_prio end subroutine fstarpu_conf_set_min_prio subroutine fstarpu_conf_set_max_prio (conf, max_prio) bind(C) use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: conf integer(c_int), value, intent(in) :: max_prio end subroutine fstarpu_conf_set_max_prio subroutine fstarpu_conf_set_ncpu (conf, ncpu) bind(C) use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: conf integer(c_int), value, intent(in) :: ncpu end subroutine fstarpu_conf_set_ncpu subroutine fstarpu_conf_set_ncuda (conf, ncuda) bind(C) use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: conf integer(c_int), value, intent(in) :: ncuda end subroutine fstarpu_conf_set_ncuda subroutine fstarpu_conf_set_nopencl (conf, nopencl) bind(C) use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: conf integer(c_int), value, intent(in) :: nopencl end subroutine fstarpu_conf_set_nopencl subroutine fstarpu_conf_set_nmic (conf, nmic) bind(C) use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: conf integer(c_int), value, intent(in) :: nmic end subroutine fstarpu_conf_set_nmic subroutine fstarpu_conf_set_nscc (conf, nscc) bind(C) use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: conf integer(c_int), value, intent(in) :: nscc end subroutine fstarpu_conf_set_nscc ! starpu_init: see fstarpu_init ! starpu_initialize: see fstarpu_init ! void starpu_pause(void); subroutine fstarpu_pause() bind(C,name="starpu_pause") end subroutine fstarpu_pause ! void starpu_resume(void); subroutine fstarpu_resume() bind(C,name="starpu_resume") end subroutine fstarpu_resume ! void starpu_shutdown(void); subroutine fstarpu_shutdown () bind(C,name="starpu_shutdown") end subroutine fstarpu_shutdown ! starpu_topology_print subroutine fstarpu_topology_print () bind(C) end subroutine fstarpu_topology_print ! int starpu_asynchronous_copy_disabled(void); function fstarpu_asynchronous_copy_disabled() bind(C,name="starpu_asynchronous_copy_disabled") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_asynchronous_copy_disabled end function fstarpu_asynchronous_copy_disabled ! int starpu_asynchronous_cuda_copy_disabled(void); function fstarpu_asynchronous_cuda_copy_disabled() bind(C,name="starpu_asynchronous_cuda_copy_disabled") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_asynchronous_cuda_copy_disabled end function fstarpu_asynchronous_cuda_copy_disabled ! int starpu_asynchronous_opencl_copy_disabled(void); function fstarpu_asynchronous_opencl_copy_disabled() bind(C,name="starpu_asynchronous_opencl_copy_disabled") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_asynchronous_opencl_copy_disabled end function fstarpu_asynchronous_opencl_copy_disabled ! int starpu_asynchronous_mic_copy_disabled(void); function fstarpu_asynchronous_mic_copy_disabled() bind(C,name="starpu_asynchronous_mic_copy_disabled") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_asynchronous_mic_copy_disabled end function fstarpu_asynchronous_mic_copy_disabled ! void starpu_display_stats(); subroutine fstarpu_display_stats() bind(C,name="starpu_display_stats") end subroutine fstarpu_display_stats ! void starpu_get_version(int *major, int *minor, int *release); subroutine fstarpu_get_version(major,minor,release) bind(C,name="starpu_get_version") use iso_c_binding, only: c_int integer(c_int), intent(out) :: major,minor,release end subroutine fstarpu_get_version ! == starpu_worker.h == ! unsigned starpu_worker_get_count(void); function fstarpu_worker_get_count() bind(C,name="starpu_worker_get_count") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_worker_get_count end function fstarpu_worker_get_count ! unsigned starpu_combined_worker_get_count(void); function fstarpu_combined_worker_get_count() bind(C,name="starpu_combined_worker_get_count") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_combined_worker_get_count end function fstarpu_combined_worker_get_count ! unsigned starpu_worker_is_combined_worker(int id); function fstarpu_worker_is_combined_worker(id) bind(C,name="starpu_worker_is_combined_worker") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_worker_is_combined_worker integer(c_int), value, intent(in) :: id end function fstarpu_worker_is_combined_worker ! unsigned starpu_cpu_worker_get_count(void); function fstarpu_cpu_worker_get_count() bind(C,name="starpu_cpu_worker_get_count") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_cpu_worker_get_count end function fstarpu_cpu_worker_get_count ! unsigned starpu_cuda_worker_get_count(void); function fstarpu_cuda_worker_get_count() bind(C,name="starpu_cuda_worker_get_count") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_cuda_worker_get_count end function fstarpu_cuda_worker_get_count ! unsigned starpu_opencl_worker_get_count(void); function fstarpu_opencl_worker_get_count() bind(C,name="starpu_opencl_worker_get_count") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_opencl_worker_get_count end function fstarpu_opencl_worker_get_count ! unsigned starpu_mic_worker_get_count(void); function fstarpu_mic_worker_get_count() bind(C,name="starpu_mic_worker_get_count") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_mic_worker_get_count end function fstarpu_mic_worker_get_count ! unsigned starpu_scc_worker_get_count(void); function fstarpu_scc_worker_get_count() bind(C,name="starpu_scc_worker_get_count") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_scc_worker_get_count end function fstarpu_scc_worker_get_count ! int starpu_worker_get_id(void); function fstarpu_worker_get_id() bind(C,name="starpu_worker_get_id") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_worker_get_id end function fstarpu_worker_get_id ! _starpu_worker_get_id_check ! starpu_worker_get_id_check ! int starpu_worker_get_bindid(int workerid); function fstarpu_worker_get_bindid(id) bind(C,name="starpu_worker_get_bindid") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_worker_get_bindid integer(c_int), value, intent(in) :: id end function fstarpu_worker_get_bindid ! int starpu_combined_worker_get_id(void); function fstarpu_combined_worker_get_id() bind(C,name="starpu_combined_worker_get_id") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_combined_worker_get_id end function fstarpu_combined_worker_get_id ! int starpu_combined_worker_get_size(void); function fstarpu_combined_worker_get_size() bind(C,name="starpu_combined_worker_get_size") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_combined_worker_get_size end function fstarpu_combined_worker_get_size ! int starpu_combined_worker_get_rank(void); function fstarpu_combined_worker_get_rank() bind(C,name="starpu_combined_worker_get_rank") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_combined_worker_get_rank end function fstarpu_combined_worker_get_rank ! enum starpu_worker_archtype starpu_worker_get_type(int id); function fstarpu_worker_get_type(id) bind(C) use iso_c_binding, only: c_int, c_ptr type(c_ptr) :: fstarpu_worker_get_type ! C function returns c_intptr_t integer(c_int),value,intent(in) :: id end function fstarpu_worker_get_type ! int starpu_worker_get_count_by_type(enum starpu_worker_archtype type); function fstarpu_worker_get_count_by_type(typeid) bind(C) use iso_c_binding, only: c_int, c_ptr integer(c_int) :: fstarpu_worker_get_count_by_type type(c_ptr),value,intent(in) :: typeid ! c_intptr_t expected by C func end function fstarpu_worker_get_count_by_type ! int starpu_worker_get_ids_by_type(enum starpu_worker_archtype type, int *workerids, int maxsize); function fstarpu_worker_get_ids_by_type(typeid, workerids, maxsize) bind(C) use iso_c_binding, only: c_int, c_ptr integer(c_int) :: fstarpu_worker_get_ids_by_type type(c_ptr),value,intent(in) :: typeid ! c_intptr_t expected by C func integer(c_int),intent(out) :: workerids(*) integer(c_int),value,intent(in) :: maxsize end function fstarpu_worker_get_ids_by_type ! int starpu_worker_get_by_type(enum starpu_worker_archtype type, int num); function fstarpu_worker_get_by_type(typeid, num) bind(C) use iso_c_binding, only: c_int, c_ptr integer(c_int) :: fstarpu_worker_get_by_type type(c_ptr),value,intent(in) :: typeid ! c_intptr_t expected by C func integer(c_int),value,intent(in) :: num end function fstarpu_worker_get_by_type ! int starpu_worker_get_by_devid(enum starpu_worker_archtype type, int devid); function fstarpu_worker_get_by_devid(typeid, devid) bind(C) use iso_c_binding, only: c_int, c_ptr integer(c_int) :: fstarpu_worker_get_by_type type(c_ptr),value,intent(in) :: typeid ! c_intptr_t expected by C func integer(c_int),value,intent(in) :: devid end function fstarpu_worker_get_by_devid ! void starpu_worker_get_name(int id, char *dst, size_t maxlen); subroutine fstarpu_worker_get_name(id, dst, maxlen) bind(C,name="starpu_worker_get_name") use iso_c_binding, only: c_int, c_char, c_size_t integer(c_int),value,intent(in) :: id character(c_char),intent(out) :: dst(*) integer(c_size_t),value,intent(in) :: maxlen end subroutine fstarpu_worker_get_name ! int starpu_worker_get_devid(int id); function fstarpu_worker_get_devid(id) bind(C,name="starpu_worker_get_devid") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_worker_get_devid integer(c_int), value, intent(in) :: id end function fstarpu_worker_get_devid ! int starpu_worker_get_mp_nodeid(int id); function fstarpu_worker_get_mp_nodeid(id) bind(C,name="starpu_worker_get_mp_nodeid") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_worker_get_mp_nodeid integer(c_int), value, intent(in) :: id end function fstarpu_worker_get_mp_nodeid ! struct starpu_tree* starpu_workers_get_tree(void); ! unsigned starpu_worker_get_sched_ctx_list(int worker, unsigned **sched_ctx); ! unsigned starpu_worker_is_blocked(int workerid); function fstarpu_worker_is_blocked(id) bind(C,name="starpu_worker_is_blocked") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_worker_is_blocked integer(c_int), value, intent(in) :: id end function fstarpu_worker_is_blocked ! unsigned starpu_worker_is_slave_somewhere(int workerid); function fstarpu_worker_is_slave_somewhere(id) bind(C,name="starpu_worker_is_slave_somewhere") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_worker_is_slave_somewhere integer(c_int), value, intent(in) :: id end function fstarpu_worker_is_slave_somewhere ! char *starpu_worker_get_type_as_string(enum starpu_worker_archtype type); subroutine fstarpu_worker_get_type_as_string(typeid,dst,maxlen) bind(C) use iso_c_binding, only: c_ptr, c_char, c_size_t type(c_ptr),value,intent(in) :: typeid ! c_intptr_t expected by C func character(c_char),intent(out) :: dst(*) integer(c_size_t),value,intent(in) :: maxlen end subroutine fstarpu_worker_get_type_as_string ! int starpu_bindid_get_workerids(int bindid, int **workerids); ! == starpu_task.h == ! void starpu_tag_declare_deps(starpu_tag_t id, unsigned ndeps, ...); ! void starpu_tag_declare_deps_array(starpu_tag_t id, unsigned ndeps, starpu_tag_t *array); subroutine fstarpu_tag_declare_deps_array(id,ndeps,tag_array) bind(C,name="starpu_tag_declare_deps_array") use iso_c_binding, only: c_int, c_long_long integer(c_int), value, intent(in) :: id integer(c_int), value, intent(in) :: ndeps integer(c_long_long), intent(in) :: tag_array(*) end subroutine fstarpu_tag_declare_deps_array ! void starpu_task_declare_deps_array(struct starpu_task *task, unsigned ndeps, struct starpu_task *task_array[]); subroutine fstarpu_task_declare_deps_array(task,ndeps,task_array) bind(C,name="starpu_task_declare_deps_array") use iso_c_binding, only: c_int, c_ptr type(c_ptr), value, intent(in) :: task integer(c_int), value, intent(in) :: ndeps type(c_ptr), intent(in) :: task_array(*) end subroutine fstarpu_task_declare_deps_array ! int starpu_tag_wait(starpu_tag_t id); function fstarpu_tag_wait(id) bind(C,name="starpu_tag_wait") use iso_c_binding, only: c_int, c_long_long integer(c_int) :: fstarpu_tag_wait integer(c_long_long), value, intent(in) :: id end function fstarpu_tag_wait ! int starpu_tag_wait_array(unsigned ntags, starpu_tag_t *id); function fstarpu_tag_wait_array(ntags,tag_array) bind(C,name="starpu_tag_wait_array") use iso_c_binding, only: c_int, c_long_long integer(c_int) :: fstarpu_tag_wait_array integer(c_int), value, intent(in) :: ntags integer(c_long_long), intent(in) :: tag_array(*) end function fstarpu_tag_wait_array ! void starpu_tag_notify_from_apps(starpu_tag_t id); subroutine fstarpu_tag_notify_from_apps(id) bind(C,name="starpu_tag_notify_from_apps") use iso_c_binding, only: c_long_long integer(c_long_long), value, intent(in) :: id end subroutine fstarpu_tag_notify_from_apps ! void starpu_tag_restart(starpu_tag_t id); subroutine fstarpu_tag_restart(id) bind(C,name="starpu_tag_restart") use iso_c_binding, only: c_long_long integer(c_long_long), value, intent(in) :: id end subroutine fstarpu_tag_restart ! void starpu_tag_remove(starpu_tag_t id); subroutine fstarpu_tag_remove(id) bind(C,name="starpu_tag_remove") use iso_c_binding, only: c_long_long integer(c_long_long), value, intent(in) :: id end subroutine fstarpu_tag_remove ! struct starpu_task *starpu_tag_get_task(starpu_tag_t id); function fstarpu_tag_get_task(id) bind(C,name="starpu_tag_get_task") use iso_c_binding, only: c_ptr, c_long_long type(c_ptr) :: fstarpu_tag_get_task integer(c_long_long), value, intent(in) :: id end function fstarpu_tag_get_task ! void starpu_task_init(struct starpu_task *task); subroutine fstarpu_task_init (task) bind(C,name="starpu_task_init") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: task end subroutine fstarpu_task_init ! void starpu_task_clean(struct starpu_task *task); subroutine fstarpu_task_clean (task) bind(C,name="starpu_task_clean") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: task end subroutine fstarpu_task_clean ! struct starpu_task *starpu_task_create(void) STARPU_ATTRIBUTE_MALLOC; function fstarpu_task_create () bind(C,name="starpu_task_create") use iso_c_binding, only: c_ptr type(c_ptr) :: fstarpu_task_create end function fstarpu_task_create ! void starpu_task_destroy(struct starpu_task *task); subroutine fstarpu_task_destroy (task) bind(C,name="starpu_task_destroy") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: task end subroutine fstarpu_task_destroy ! int starpu_task_submit(struct starpu_task *task) STARPU_WARN_UNUSED_RESULT; function fstarpu_task_submit (task) bind(C,name="starpu_task_submit") use iso_c_binding, only: c_int,c_ptr integer(c_int) :: fstarpu_task_submit type(c_ptr), value, intent(in) :: task end function fstarpu_task_submit ! int starpu_task_submit_to_ctx(struct starpu_task *task, unsigned sched_ctx_id); function fstarpu_task_submit_to_ctx (task,sched_ctx_id) bind(C,name="starpu_task_submit_to_ctx") use iso_c_binding, only: c_int,c_ptr integer(c_int) :: fstarpu_task_submit_to_ctx type(c_ptr), value, intent(in) :: task integer(c_int), value, intent(in) :: sched_ctx_id end function fstarpu_task_submit_to_ctx ! int starpu_task_finished(struct starpu_task *task) STARPU_WARN_UNUSED_RESULT; function fstarpu_task_finished (task) bind(C,name="starpu_task_finished") use iso_c_binding, only: c_int,c_ptr integer(c_int) :: fstarpu_task_finished type(c_ptr), value, intent(in) :: task end function fstarpu_task_finished ! int starpu_task_wait(struct starpu_task *task) STARPU_WARN_UNUSED_RESULT; function fstarpu_task_wait (task) bind(C,name="starpu_task_wait") use iso_c_binding, only: c_int,c_ptr integer(c_int) :: fstarpu_task_wait type(c_ptr), value, intent(in) :: task end function fstarpu_task_wait ! int starpu_task_wait_array(struct starpu_task **tasks, unsigned nb_tasks) STARPU_WARN_UNUSED_RESULT; function fstarpu_task_wait_array(task_array,ntasks) bind(C,name="starpu_task_wait_array") use iso_c_binding, only: c_int, c_ptr integer(c_int) :: fstarpu_task_wait_array integer(c_int), value, intent(in) :: ntasks type(c_ptr), intent(in) :: task_array end function fstarpu_task_wait_array ! int starpu_task_wait_for_all(void); subroutine fstarpu_task_wait_for_all () bind(C,name="starpu_task_wait_for_all") end subroutine fstarpu_task_wait_for_all ! int starpu_task_wait_for_n_submitted(unsigned n); subroutine fstarpu_task_wait_for_n_submitted (n) bind(C,name="starpu_task_wait_for_n_submitted") use iso_c_binding, only: c_int integer(c_int), value, intent(in) :: n end subroutine fstarpu_task_wait_for_n_submitted ! int starpu_task_wait_for_all_in_ctx(unsigned sched_ctx_id); subroutine fstarpu_task_wait_for_all_in_ctx (ctx) bind(C,name="starpu_task_wait_for_all_in_ctx") use iso_c_binding, only: c_int integer(c_int), value, intent(in) :: ctx end subroutine fstarpu_task_wait_for_all_in_ctx ! int starpu_task_wait_for_n_submitted_in_ctx(unsigned sched_ctx_id, unsigned n); subroutine fstarpu_task_wait_for_n_submitted_in_ctx (ctx,n) bind(C,name="starpu_task_wait_for_n_submitted_in_ctx") use iso_c_binding, only: c_int integer(c_int), value, intent(in) :: ctx integer(c_int), value, intent(in) :: n end subroutine fstarpu_task_wait_for_n_submitted_in_ctx ! int starpu_task_wait_for_no_ready(void); function fstarpu_task_wait_for_no_ready () bind(C,name="starpu_task_wait_for_no_ready") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_task_wait_for_no_ready end function fstarpu_task_wait_for_no_ready ! int starpu_task_nready(void); function fstarpu_task_nready () bind(C,name="starpu_task_nready") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_task_nready end function fstarpu_task_nready ! int starpu_task_nsubmitted(void); function fstarpu_task_nsubmitted () bind(C,name="starpu_task_nsubmitted") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_task_nsubmitted end function fstarpu_task_nsubmitted ! void starpu_do_schedule(void); subroutine fstarpu_do_schedule () bind(C,name="starpu_do_schedule") end subroutine fstarpu_do_schedule ! starpu_codelet_init subroutine fstarpu_codelet_init (codelet) bind(C,name="starpu_codelet_init") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: codelet end subroutine fstarpu_codelet_init ! starpu_codelet_display_stats subroutine fstarpu_codelet_display_stats (codelet) bind(C,name="starpu_codelet_display_stats") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: codelet end subroutine fstarpu_codelet_display_stats ! struct starpu_task *starpu_task_get_current(void); function fstarpu_task_get_current () bind(C,name="starpu_task_get_current") use iso_c_binding, only: c_ptr type(c_ptr) :: fstarpu_task_get_current end function fstarpu_task_get_current ! void starpu_parallel_task_barrier_init(struct starpu_task *task, int workerid); subroutine fstarpu_parallel_task_barrier_init_init (task,id) & bind(C,name="starpu_parallel_task_barrier_init_init") use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: task integer(c_int), value, intent(in) :: id end subroutine fstarpu_parallel_task_barrier_init_init ! void starpu_parallel_task_barrier_init_n(struct starpu_task *task, int worker_size); subroutine fstarpu_parallel_task_barrier_init_n_init_n (task,sz) & bind(C,name="starpu_parallel_task_barrier_init_n_init_n") use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: task integer(c_int), value, intent(in) :: sz end subroutine fstarpu_parallel_task_barrier_init_n_init_n ! struct starpu_task *starpu_task_dup(struct starpu_task *task); function fstarpu_task_dup (task) bind(C,name="starpu_task_dup") use iso_c_binding, only: c_ptr type(c_ptr) :: fstarpu_task_dup type(c_ptr), value, intent(in) :: task end function fstarpu_task_dup ! void starpu_task_set_implementation(struct starpu_task *task, unsigned impl); subroutine fstarpu_task_set_implementation (task,impl) & bind(C,name="starpu_task_set_implementation") use iso_c_binding, only: c_ptr,c_int type(c_ptr), value, intent(in) :: task integer(c_int), value, intent(in) :: impl end subroutine fstarpu_task_set_implementation ! unsigned starpu_task_get_implementation(struct starpu_task *task); function fstarpu_task_get_implementation (task) & bind(C,name="starpu_task_get_implementation") use iso_c_binding, only: c_ptr,c_int type(c_ptr), value, intent(in) :: task integer(c_int) :: fstarpu_task_get_implementation end function fstarpu_task_get_implementation ! -- function fstarpu_codelet_allocate () bind(C) use iso_c_binding, only: c_ptr type(c_ptr) :: fstarpu_codelet_allocate end function fstarpu_codelet_allocate subroutine fstarpu_codelet_free (cl) bind(C) use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: cl end subroutine fstarpu_codelet_free subroutine fstarpu_codelet_set_name (cl, cl_name) bind(C) use iso_c_binding, only: c_ptr, c_char type(c_ptr), value, intent(in) :: cl character(c_char), intent(in) :: cl_name end subroutine fstarpu_codelet_set_name subroutine fstarpu_codelet_add_cpu_func (cl, f_ptr) bind(C) use iso_c_binding, only: c_ptr, c_funptr type(c_ptr), value, intent(in) :: cl type(c_funptr), value, intent(in) :: f_ptr end subroutine fstarpu_codelet_add_cpu_func subroutine fstarpu_codelet_add_cuda_func (cl, f_ptr) bind(C) use iso_c_binding, only: c_ptr, c_funptr type(c_ptr), value, intent(in) :: cl type(c_funptr), value, intent(in) :: f_ptr end subroutine fstarpu_codelet_add_cuda_func subroutine fstarpu_codelet_add_cuda_flags (cl, flags) bind(C) use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: cl type(c_ptr), value, intent(in) :: flags ! C function expects an intptr_t end subroutine fstarpu_codelet_add_cuda_flags subroutine fstarpu_codelet_add_opencl_func (cl, f_ptr) bind(C) use iso_c_binding, only: c_ptr, c_funptr type(c_ptr), value, intent(in) :: cl type(c_funptr), value, intent(in) :: f_ptr end subroutine fstarpu_codelet_add_opencl_func subroutine fstarpu_codelet_add_opencl_flags (cl, flags) bind(C) use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: cl type(c_ptr), value, intent(in) :: flags ! C function expects an intptr_t end subroutine fstarpu_codelet_add_opencl_flags subroutine fstarpu_codelet_add_mic_func (cl, f_ptr) bind(C) use iso_c_binding, only: c_ptr, c_funptr type(c_ptr), value, intent(in) :: cl type(c_funptr), value, intent(in) :: f_ptr end subroutine fstarpu_codelet_add_mic_func subroutine fstarpu_codelet_add_scc_func (cl, f_ptr) bind(C) use iso_c_binding, only: c_ptr, c_funptr type(c_ptr), value, intent(in) :: cl type(c_funptr), value, intent(in) :: f_ptr end subroutine fstarpu_codelet_add_scc_func subroutine fstarpu_codelet_add_buffer (cl, mode) bind(C) use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: cl type(c_ptr), value, intent(in) :: mode ! C function expects an intptr_t end subroutine fstarpu_codelet_add_buffer subroutine fstarpu_codelet_set_variable_nbuffers (cl) bind(C) use iso_c_binding, only: c_ptr,c_int type(c_ptr), value, intent(in) :: cl end subroutine fstarpu_codelet_set_variable_nbuffers subroutine fstarpu_codelet_set_nbuffers (cl, nbuffers) bind(C) use iso_c_binding, only: c_ptr,c_int type(c_ptr), value, intent(in) :: cl integer(c_int), value, intent(in) :: nbuffers end subroutine fstarpu_codelet_set_nbuffers subroutine fstarpu_codelet_set_flags (cl, flags) bind(C) use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: cl type(c_ptr), value, intent(in) :: flags ! C function expects an intptr_t end subroutine fstarpu_codelet_set_flags subroutine fstarpu_codelet_set_where (cl, where) bind(C) use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: cl type(c_ptr), value, intent(in) :: where ! C function expects an intptr_t end subroutine fstarpu_codelet_set_where ! == starpu_data_interface.h == ! uintptr_t starpu_malloc_on_node_flags(unsigned dst_node, size_t size, int flags); ! uintptr_t starpu_malloc_on_node(unsigned dst_node, size_t size); function fstarpu_malloc_on_node(node,sz) bind(C,name="starpu_malloc_on_node") use iso_c_binding, only: c_int,c_intptr_t,c_size_t integer(c_intptr_t) :: fstarpu_malloc_on_node integer(c_int), value, intent(in) :: node integer(c_size_t), value, intent(in) :: sz end function fstarpu_malloc_on_node ! void starpu_free_on_node_flags(unsigned dst_node, uintptr_t addr, size_t size, int flags); ! void starpu_free_on_node(unsigned dst_node, uintptr_t addr, size_t size); subroutine fstarpu_free_on_node(node,addr,sz) bind(C,name="starpu_free_on_node") use iso_c_binding, only: c_int,c_intptr_t,c_size_t integer(c_int), value, intent(in) :: node integer(c_intptr_t), value, intent(in) :: addr integer(c_size_t), value, intent(in) :: sz end subroutine fstarpu_free_on_node ! void starpu_malloc_on_node_set_default_flags(unsigned node, int flags); ! int starpu_data_interface_get_next_id(void); ! void starpu_data_register(starpu_data_handle_t *handleptr, unsigned home_node, void *data_interface, struct starpu_data_interface_ops *ops); ! void starpu_data_ptr_register(starpu_data_handle_t handle, unsigned node); subroutine fstarpug_data_ptr_register (dh,node) bind(C,name="starpu_data_ptr_register") use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: node end subroutine fstarpug_data_ptr_register ! void starpu_data_register_same(starpu_data_handle_t *handledst, starpu_data_handle_t handlesrc); subroutine fstarpu_data_register_same (dh_dst,dh_src) bind(C,name="starpu_data_register_same") use iso_c_binding, only: c_ptr type(c_ptr), intent(out) :: dh_dst type(c_ptr), value, intent(in) :: dh_src end subroutine fstarpu_data_register_same ! void *starpu_data_handle_to_pointer(starpu_data_handle_t handle, unsigned node); function fstarpu_data_handle_to_pointer (dh,node) bind(C,name="starpu_data_handle_to_pointer") use iso_c_binding, only: c_ptr, c_int type(c_ptr) :: fstarpu_data_handle_to_pointer type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: node end function fstarpu_data_handle_to_pointer ! void *starpu_data_get_local_ptr(starpu_data_handle_t handle); function fstarpu_data_get_local_ptr (dh) bind(C,name="starpu_data_get_local_ptr") use iso_c_binding, only: c_ptr, c_int type(c_ptr) :: fstarpu_data_get_local_ptr type(c_ptr), value, intent(in) :: dh end function fstarpu_data_get_local_ptr ! void *starpu_data_get_interface_on_node(starpu_data_handle_t handle, unsigned memory_node); ! == starpu_data_interface.h: block == ! void starpu_block_data_register(starpu_data_handle_t *handle, unsigned home_node, uintptr_t ptr, uint32_t ldy, uint32_t ldz, uint32_t nx, uint32_t ny, uint32_t nz, size_t elemsize); subroutine fstarpu_block_data_register(dh, home_node, ptr, ldy, ldz, nx, ny, nz, elt_size) & bind(C,name="starpu_block_data_register") use iso_c_binding, only: c_ptr, c_int, c_size_t type(c_ptr), intent(out) :: dh integer(c_int), value, intent(in) :: home_node type(c_ptr), value, intent(in) :: ptr integer(c_int), value, intent(in) :: ldy integer(c_int), value, intent(in) :: ldz integer(c_int), value, intent(in) :: nx integer(c_int), value, intent(in) :: ny integer(c_int), value, intent(in) :: nz integer(c_size_t), value, intent(in) :: elt_size end subroutine fstarpu_block_data_register ! void starpu_block_ptr_register(starpu_data_handle_t handle, unsigned node, uintptr_t ptr, uintptr_t dev_handle, size_t offset, uint32_t ldy, uint32_t ldz); subroutine fstarpu_block_ptr_register(dh, node, ptr, dev_handle, offset, ldy, ldz) & bind(C,name="starpu_block_ptr_register") use iso_c_binding, only: c_ptr, c_int, c_size_t type(c_ptr), intent(out) :: dh integer(c_int), value, intent(in) :: node type(c_ptr), value, intent(in) :: ptr type(c_ptr), value, intent(in) :: dev_handle integer(c_size_t), value, intent(in) :: offset integer(c_int), value, intent(in) :: ldy integer(c_int), value, intent(in) :: ldz end subroutine fstarpu_block_ptr_register function fstarpu_block_get_ptr(buffers, i) bind(C) use iso_c_binding, only: c_ptr, c_int type(c_ptr) :: fstarpu_block_get_ptr type(c_ptr), value, intent(in) :: buffers integer(c_int), value, intent(in) :: i end function fstarpu_block_get_ptr function fstarpu_block_get_ldy(buffers, i) bind(C) use iso_c_binding, only: c_ptr, c_int integer(c_int) :: fstarpu_block_get_ldy type(c_ptr), value, intent(in) :: buffers integer(c_int), value, intent(in) :: i end function fstarpu_block_get_ldy function fstarpu_block_get_ldz(buffers, i) bind(C) use iso_c_binding, only: c_ptr, c_int integer(c_int) :: fstarpu_block_get_ldz type(c_ptr), value, intent(in) :: buffers integer(c_int), value, intent(in) :: i end function fstarpu_block_get_ldz function fstarpu_block_get_nx(buffers, i) bind(C) use iso_c_binding, only: c_ptr, c_int integer(c_int) :: fstarpu_block_get_nx type(c_ptr), value, intent(in) :: buffers integer(c_int), value, intent(in) :: i end function fstarpu_block_get_nx function fstarpu_block_get_ny(buffers, i) bind(C) use iso_c_binding, only: c_ptr, c_int integer(c_int) :: fstarpu_block_get_ny type(c_ptr), value, intent(in) :: buffers integer(c_int), value, intent(in) :: i end function fstarpu_block_get_ny function fstarpu_block_get_nz(buffers, i) bind(C) use iso_c_binding, only: c_ptr, c_int integer(c_int) :: fstarpu_block_get_nz type(c_ptr), value, intent(in) :: buffers integer(c_int), value, intent(in) :: i end function fstarpu_block_get_nz ! == starpu_data_interface.h: matrix == ! void starpu_matrix_data_register(starpu_data_handle_t *handle, unsigned home_node, uintptr_t ptr, uint32_t ld, uint32_t nx, uint32_t ny, size_t elemsize); subroutine fstarpu_matrix_data_register(dh, home_node, ptr, ld, nx, ny, elt_size) & bind(C,name="starpu_matrix_data_register") use iso_c_binding, only: c_ptr, c_int, c_size_t type(c_ptr), intent(out) :: dh integer(c_int), value, intent(in) :: home_node type(c_ptr), value, intent(in) :: ptr integer(c_int), value, intent(in) :: ld integer(c_int), value, intent(in) :: nx integer(c_int), value, intent(in) :: ny integer(c_size_t), value, intent(in) :: elt_size end subroutine fstarpu_matrix_data_register ! void starpu_matrix_ptr_register(starpu_data_handle_t handle, unsigned node, uintptr_t ptr, uintptr_t dev_handle, size_t offset, uint32_t ld); subroutine fstarpu_matrix_ptr_register(dh, node, ptr, dev_handle, offset, ld) & bind(C,name="starpu_matrix_ptr_register") use iso_c_binding, only: c_ptr, c_int, c_size_t type(c_ptr), intent(out) :: dh integer(c_int), value, intent(in) :: node type(c_ptr), value, intent(in) :: ptr type(c_ptr), value, intent(in) :: dev_handle integer(c_size_t), value, intent(in) :: offset integer(c_int), value, intent(in) :: ld end subroutine fstarpu_matrix_ptr_register function fstarpu_matrix_get_ptr(buffers, i) bind(C) use iso_c_binding, only: c_ptr, c_int type(c_ptr) :: fstarpu_matrix_get_ptr type(c_ptr), value, intent(in) :: buffers integer(c_int), value, intent(in) :: i end function fstarpu_matrix_get_ptr function fstarpu_matrix_get_ld(buffers, i) bind(C) use iso_c_binding, only: c_ptr, c_int integer(c_int) :: fstarpu_matrix_get_ld type(c_ptr), value, intent(in) :: buffers integer(c_int), value, intent(in) :: i end function fstarpu_matrix_get_ld function fstarpu_matrix_get_nx(buffers, i) bind(C) use iso_c_binding, only: c_ptr, c_int integer(c_int) :: fstarpu_matrix_get_nx type(c_ptr), value, intent(in) :: buffers integer(c_int), value, intent(in) :: i end function fstarpu_matrix_get_nx function fstarpu_matrix_get_ny(buffers, i) bind(C) use iso_c_binding, only: c_ptr, c_int integer(c_int) :: fstarpu_matrix_get_ny type(c_ptr), value, intent(in) :: buffers integer(c_int), value, intent(in) :: i end function fstarpu_matrix_get_ny ! == starpu_data_interface.h: vector == ! void starpu_vector_data_register(starpu_data_handle_t *handle, unsigned home_node, uintptr_t ptr, uint32_t nx, size_t elemsize); subroutine fstarpu_vector_data_register(dh, home_node, ptr,nx, elt_size) & bind(C,name="starpu_vector_data_register") use iso_c_binding, only: c_ptr, c_int, c_size_t type(c_ptr), intent(out) :: dh integer(c_int), value, intent(in) :: home_node type(c_ptr), value, intent(in) :: ptr integer(c_int), value, intent(in) :: nx integer(c_size_t), value, intent(in) :: elt_size end subroutine fstarpu_vector_data_register ! void starpu_vector_ptr_register(starpu_data_handle_t handle, unsigned node, uintptr_t ptr, uintptr_t dev_handle, size_t offset); subroutine fstarpu_vector_ptr_register(dh, node, ptr, dev_handle, offset, ld) & bind(C,name="starpu_vector_ptr_register") use iso_c_binding, only: c_ptr, c_int, c_size_t type(c_ptr), intent(out) :: dh integer(c_int), value, intent(in) :: node type(c_ptr), value, intent(in) :: ptr type(c_ptr), value, intent(in) :: dev_handle integer(c_size_t), value, intent(in) :: offset end subroutine fstarpu_vector_ptr_register function fstarpu_vector_get_ptr(buffers, i) bind(C) use iso_c_binding, only: c_ptr, c_int type(c_ptr) :: fstarpu_vector_get_ptr type(c_ptr), value, intent(in) :: buffers integer(c_int), value, intent(in) :: i end function fstarpu_vector_get_ptr function fstarpu_vector_get_nx(buffers, i) bind(C) use iso_c_binding, only: c_ptr, c_int integer(c_int) :: fstarpu_vector_get_nx type(c_ptr), value, intent(in) :: buffers integer(c_int), value, intent(in) :: i end function fstarpu_vector_get_nx ! == starpu_data_interface.h: variable == ! void starpu_variable_data_register(starpu_data_handle_t *handle, unsigned home_node, uintptr_t ptr, size_t size); subroutine fstarpu_variable_data_register(dh, home_node, ptr, elt_size) & bind(C,name="starpu_variable_data_register") use iso_c_binding, only: c_ptr, c_int, c_size_t type(c_ptr), intent(out) :: dh integer(c_int), value, intent(in) :: home_node type(c_ptr), value, intent(in) :: ptr integer(c_size_t), value, intent(in) :: elt_size end subroutine fstarpu_variable_data_register ! void starpu_variable_ptr_register(starpu_data_handle_t handle, unsigned node, uintptr_t ptr, uintptr_t dev_handle, size_t offset); subroutine fstarpu_variable_ptr_register(dh, node, ptr, dev_handle, offset, ld) & bind(C,name="starpu_variable_ptr_register") use iso_c_binding, only: c_ptr, c_int, c_size_t type(c_ptr), intent(out) :: dh integer(c_int), value, intent(in) :: node type(c_ptr), value, intent(in) :: ptr type(c_ptr), value, intent(in) :: dev_handle integer(c_size_t), value, intent(in) :: offset end subroutine fstarpu_variable_ptr_register function fstarpu_variable_get_ptr(buffers, i) bind(C) use iso_c_binding, only: c_ptr, c_int type(c_ptr) :: fstarpu_variable_get_ptr type(c_ptr), value, intent(in) :: buffers integer(c_int), value, intent(in) :: i end function fstarpu_variable_get_ptr ! == starpu_data_interface.h: void == ! void starpu_void_data_register(starpu_data_handle_t *handle); subroutine fstarpu_void_data_register(dh) & bind(C,name="starpu_void_data_register") use iso_c_binding, only: c_ptr, c_int, c_size_t type(c_ptr), intent(out) :: dh end subroutine fstarpu_void_data_register ! == starpu_data_filter.h == function fstarpu_data_filter_allocate () bind(C) use iso_c_binding, only: c_ptr type(c_ptr) :: fstarpu_data_filter_allocate end function fstarpu_data_filter_allocate subroutine fstarpu_data_filter_free (filter) bind(C) use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: filter end subroutine fstarpu_data_filter_free ! Note: use fstarpu_df_alloc_ prefix instead of fstarpu_data_filter_allocate_ ! to fit within the Fortran id length limit */ function fstarpu_df_alloc_bcsr_filter_canonical_block () bind(C) use iso_c_binding, only: c_ptr type(c_ptr) :: fstarpu_df_alloc_bcsr_filter_canonical_block end function fstarpu_df_alloc_bcsr_filter_canonical_block function fstarpu_df_alloc_csr_filter_vertical_block () bind(C) use iso_c_binding, only: c_ptr type(c_ptr) :: fstarpu_df_alloc_csr_filter_vertical_block end function fstarpu_df_alloc_csr_filter_vertical_block function fstarpu_df_alloc_matrix_filter_block () bind(C) use iso_c_binding, only: c_ptr type(c_ptr) :: fstarpu_df_alloc_matrix_filter_block end function fstarpu_df_alloc_matrix_filter_block function fstarpu_df_alloc_matrix_filter_block_shadow () bind(C) use iso_c_binding, only: c_ptr type(c_ptr) :: fstarpu_df_alloc_matrix_filter_block_shadow end function fstarpu_df_alloc_matrix_filter_block_shadow function fstarpu_df_alloc_matrix_filter_vertical_block () bind(C) use iso_c_binding, only: c_ptr type(c_ptr) :: fstarpu_df_alloc_matrix_filter_vertical_block end function fstarpu_df_alloc_matrix_filter_vertical_block function fstarpu_df_alloc_matrix_filter_vertical_block_shadow () bind(C) use iso_c_binding, only: c_ptr type(c_ptr) :: fstarpu_df_alloc_matrix_filter_vertical_block_shadow end function fstarpu_df_alloc_matrix_filter_vertical_block_shadow function fstarpu_df_alloc_vector_filter_block () bind(C) use iso_c_binding, only: c_ptr type(c_ptr) :: fstarpu_df_alloc_vector_filter_block end function fstarpu_df_alloc_vector_filter_block function fstarpu_df_alloc_vector_filter_block_shadow () bind(C) use iso_c_binding, only: c_ptr type(c_ptr) :: fstarpu_df_alloc_vector_filter_block_shadow end function fstarpu_df_alloc_vector_filter_block_shadow function fstarpu_df_alloc_vector_filter_list () bind(C) use iso_c_binding, only: c_ptr type(c_ptr) :: fstarpu_df_alloc_vector_filter_list end function fstarpu_df_alloc_vector_filter_list function fstarpu_df_alloc_vector_filter_divide_in_2 () bind(C) use iso_c_binding, only: c_ptr type(c_ptr) :: fstarpu_df_alloc_vector_filter_divide_in_2 end function fstarpu_df_alloc_vector_filter_divide_in_2 function fstarpu_df_alloc_block_filter_block () bind(C) use iso_c_binding, only: c_ptr type(c_ptr) :: fstarpu_df_alloc_block_filter_block end function fstarpu_df_alloc_block_filter_block function fstarpu_df_alloc_block_filter_block_shadow () bind(C) use iso_c_binding, only: c_ptr type(c_ptr) :: fstarpu_df_alloc_block_filter_block_shadow end function fstarpu_df_alloc_block_filter_block_shadow function fstarpu_df_alloc_block_filter_vertical_block () bind(C) use iso_c_binding, only: c_ptr type(c_ptr) :: fstarpu_df_alloc_block_filter_vertical_block end function fstarpu_df_alloc_block_filter_vertical_block function fstarpu_df_alloc_block_filter_vertical_block_shadow () bind(C) use iso_c_binding, only: c_ptr type(c_ptr) :: fstarpu_df_alloc_block_filter_vertical_block_shadow end function fstarpu_df_alloc_block_filter_vertical_block_shadow subroutine fstarpu_data_filter_set_filter_func (filter, f_ptr) bind(C) use iso_c_binding, only: c_ptr, c_funptr type(c_ptr), value, intent(in) :: filter type(c_funptr), value, intent(in) :: f_ptr end subroutine fstarpu_data_filter_set_filter_func subroutine fstarpu_data_filter_set_nchildren (filter, nchildren) bind(C) use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: filter integer(c_int), value, intent(in) :: nchildren end subroutine fstarpu_data_filter_set_nchildren subroutine fstarpu_data_filter_set_get_nchildren_func (filter, f_ptr) bind(C) use iso_c_binding, only: c_ptr, c_funptr type(c_ptr), value, intent(in) :: filter type(c_funptr), value, intent(in) :: f_ptr end subroutine fstarpu_data_filter_set_get_nchildren_func subroutine fstarpu_data_filter_set_get_child_ops_func (filter, f_ptr) bind(C) use iso_c_binding, only: c_ptr, c_funptr type(c_ptr), value, intent(in) :: filter type(c_funptr), value, intent(in) :: f_ptr end subroutine fstarpu_data_filter_set_get_child_ops_func subroutine fstarpu_data_filter_set_filter_arg (filter, filter_arg) bind(C) use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: filter integer(c_int), value, intent(in) :: filter_arg end subroutine fstarpu_data_filter_set_filter_arg subroutine fstarpu_data_filter_set_filter_arg_ptr (filter, filter_arg_ptr) bind(C) use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: filter type(c_ptr), value, intent(in) :: filter_arg_ptr end subroutine fstarpu_data_filter_set_filter_arg_ptr ! void starpu_data_partition(starpu_data_handle_t initial_handle, struct starpu_data_filter *f); subroutine fstarpu_data_partition (dh,filter) bind(C,name="starpu_data_partition") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: dh type(c_ptr), value, intent(in) :: filter end subroutine fstarpu_data_partition ! void starpu_data_unpartition(starpu_data_handle_t root_data, unsigned gathering_node); subroutine fstarpu_data_unpartition (root_dh,gathering_node) bind(C,name="starpu_data_unpartition") use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: root_dh integer(c_int), value, intent(in) :: gathering_node end subroutine fstarpu_data_unpartition ! void starpu_data_partition_plan(starpu_data_handle_t initial_handle, struct starpu_data_filter *f, starpu_data_handle_t *children); subroutine fstarpu_data_partition_plan (dh,filter,children) & bind(C,name="starpu_data_partition_plan") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: dh type(c_ptr), value, intent(in) :: filter type(c_ptr), intent(in) :: children(*) end subroutine fstarpu_data_partition_plan ! void starpu_data_partition_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children); subroutine fstarpu_data_partition_submit (dh,nparts,children) & bind(C,name="starpu_data_partition_submit") use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: nparts type(c_ptr), intent(in) :: children(*) end subroutine fstarpu_data_partition_submit ! void starpu_data_partition_readonly_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children); subroutine fstarpu_data_partition_readonly_submit (dh,nparts,children) & bind(C,name="starpu_data_partition_readonly_submit") use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: nparts type(c_ptr), intent(in) :: children(*) end subroutine fstarpu_data_partition_readonly_submit ! void starpu_data_partition_readwrite_upgrade_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children); subroutine fstarpu_data_partition_readwrite_upgrade_submit (dh,nparts,children) & bind(C,name="starpu_data_partition_readwrite_upgrade_submit") use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: nparts type(c_ptr), intent(in) :: children(*) end subroutine fstarpu_data_partition_readwrite_upgrade_submit ! void starpu_data_unpartition_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int gathering_node); subroutine fstarpu_data_unpartition_submit (dh,nparts,children,gathering_node) & bind(C,name="starpu_data_unpartition_submit") use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: nparts type(c_ptr), intent(in) :: children(*) integer(c_int), value, intent(in) :: gathering_node end subroutine fstarpu_data_unpartition_submit ! void starpu_data_unpartition_readonly_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int gathering_node); subroutine fstarpu_data_unpartition_readonly_submit (dh,nparts,children,gathering_node) & bind(C,name="starpu_data_unpartition_readonly_submit") use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: nparts type(c_ptr), intent(in) :: children(*) integer(c_int), value, intent(in) :: gathering_node end subroutine fstarpu_data_unpartition_readonly_submit ! void starpu_data_partition_clean(starpu_data_handle_t root_data, unsigned nparts, starpu_data_handle_t *children); subroutine fstarpu_data_partition_clean (dh,nparts,children) & bind(C,name="starpu_data_partition_clean") use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: nparts type(c_ptr), intent(in) :: children(*) end subroutine fstarpu_data_partition_clean ! int starpu_data_get_nb_children(starpu_data_handle_t handle); function fstarpu_data_get_nb_children(dh) bind(C,name="starpu_data_get_nb_children") use iso_c_binding, only: c_ptr, c_int integer(c_int) :: fstarpu_data_get_nb_children type(c_ptr), value, intent(in) :: dh end function fstarpu_data_get_nb_children ! starpu_data_handle_t starpu_data_get_child(starpu_data_handle_t handle, unsigned i); function fstarpu_data_get_child(dh,i) bind(C,name="starpu_data_get_child") use iso_c_binding, only: c_ptr, c_int type(c_ptr) :: fstarpu_data_get_child type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: i end function fstarpu_data_get_child ! starpu_data_handle_t starpu_data_get_sub_data(starpu_data_handle_t root_data, unsigned depth, ... ); ! . see: fstarpu_data_get_sub_data ! starpu_data_handle_t starpu_data_vget_sub_data(starpu_data_handle_t root_data, unsigned depth, va_list pa); ! . see: fstarpu_data_get_sub_data ! note: defined in filters.c function fstarpu_data_get_sub_data (root_dh,depth,indices) bind(C) use iso_c_binding, only: c_ptr, c_int type(c_ptr) :: fstarpu_data_get_sub_data type(c_ptr), value, intent(in) :: root_dh integer(c_int), value, intent(in) :: depth integer(c_int), intent(in) :: indices(*) end function fstarpu_data_get_sub_data ! void starpu_data_map_filters(starpu_data_handle_t root_data, unsigned nfilters, ...); ! . see fstarpu_data_map_filters ! void starpu_data_vmap_filters(starpu_data_handle_t root_data, unsigned nfilters, va_list pa); ! . see fstarpu_data_map_filters ! note: defined in filters.c subroutine fstarpu_data_map_filters (root_dh,nfilters,filters) bind(C) use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: root_dh integer(c_int), value, intent(in) :: nfilters type(c_ptr), intent(in) :: filters(*) end subroutine fstarpu_data_map_filters ! void starpu_matrix_filter_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); subroutine fstarpu_matrix_filter_block (father_interface,child_interface,filter,id,nparts) & bind(C,name="starpu_matrix_filter_block") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: father_interface type(c_ptr), value, intent(in) :: child_interface type(c_ptr), value, intent(in) :: filter type(c_ptr), value, intent(in) :: id type(c_ptr), value, intent(in) :: nparts end subroutine fstarpu_matrix_filter_block ! void starpu_matrix_filter_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); subroutine fstarpu_matrix_filter_block_shadow (father_interface,child_interface,filter,id,nparts) & bind(C,name="starpu_matrix_filter_block_shadow") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: father_interface type(c_ptr), value, intent(in) :: child_interface type(c_ptr), value, intent(in) :: filter type(c_ptr), value, intent(in) :: id type(c_ptr), value, intent(in) :: nparts end subroutine fstarpu_matrix_filter_block_shadow ! void starpu_matrix_filter_vertical_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); subroutine fstarpu_matrix_filter_vertical_block (father_interface,child_interface,filter,id,nparts) & bind(C,name="starpu_matrix_filter_vertical_block") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: father_interface type(c_ptr), value, intent(in) :: child_interface type(c_ptr), value, intent(in) :: filter type(c_ptr), value, intent(in) :: id type(c_ptr), value, intent(in) :: nparts end subroutine fstarpu_matrix_filter_vertical_block ! void starpu_matrix_filter_vertical_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); subroutine fstarpu_matrix_filter_vertical_block_shadow (father_interface,child_interface,filter,id,nparts) & bind(C,name="starpu_matrix_filter_vertical_block_shadow") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: father_interface type(c_ptr), value, intent(in) :: child_interface type(c_ptr), value, intent(in) :: filter type(c_ptr), value, intent(in) :: id type(c_ptr), value, intent(in) :: nparts end subroutine fstarpu_matrix_filter_vertical_block_shadow ! void starpu_vector_filter_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); subroutine fstarpu_vector_filter_block (father_interface,child_interface,filter,id,nparts) & bind(C,name="starpu_vector_filter_block") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: father_interface type(c_ptr), value, intent(in) :: child_interface type(c_ptr), value, intent(in) :: filter type(c_ptr), value, intent(in) :: id type(c_ptr), value, intent(in) :: nparts end subroutine fstarpu_vector_filter_block ! void starpu_vector_filter_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); subroutine fstarpu_vector_filter_block_shadow (father_interface,child_interface,filter,id,nparts) & bind(C,name="starpu_vector_filter_block_shadow") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: father_interface type(c_ptr), value, intent(in) :: child_interface type(c_ptr), value, intent(in) :: filter type(c_ptr), value, intent(in) :: id type(c_ptr), value, intent(in) :: nparts end subroutine fstarpu_vector_filter_block_shadow ! void starpu_vector_filter_list_long(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); subroutine fstarpu_vector_filter_list_long (father_interface,child_interface,filter,id,nparts) & bind(C,name="starpu_vector_filter_list_long") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: father_interface type(c_ptr), value, intent(in) :: child_interface type(c_ptr), value, intent(in) :: filter type(c_ptr), value, intent(in) :: id type(c_ptr), value, intent(in) :: nparts end subroutine fstarpu_vector_filter_list_long ! void starpu_vector_filter_list(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); subroutine fstarpu_vector_filter_list (father_interface,child_interface,filter,id,nparts) & bind(C,name="starpu_vector_filter_list") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: father_interface type(c_ptr), value, intent(in) :: child_interface type(c_ptr), value, intent(in) :: filter type(c_ptr), value, intent(in) :: id type(c_ptr), value, intent(in) :: nparts end subroutine fstarpu_vector_filter_list ! void starpu_vector_filter_divide_in_2(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); subroutine fstarpu_vector_divide_in_2 (father_interface,child_interface,filter,id,nparts) & bind(C,name="starpu_vector_divide_in_2") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: father_interface type(c_ptr), value, intent(in) :: child_interface type(c_ptr), value, intent(in) :: filter type(c_ptr), value, intent(in) :: id type(c_ptr), value, intent(in) :: nparts end subroutine fstarpu_vector_divide_in_2 ! void starpu_block_filter_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); subroutine fstarpu_block_filter_block (father_interface,child_interface,filter,id,nparts) & bind(C,name="starpu_block_filter_block") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: father_interface type(c_ptr), value, intent(in) :: child_interface type(c_ptr), value, intent(in) :: filter type(c_ptr), value, intent(in) :: id type(c_ptr), value, intent(in) :: nparts end subroutine fstarpu_block_filter_block ! void starpu_block_filter_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); subroutine fstarpu_block_filter_block_shadow (father_interface,child_interface,filter,id,nparts) & bind(C,name="starpu_block_filter_block_shadow") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: father_interface type(c_ptr), value, intent(in) :: child_interface type(c_ptr), value, intent(in) :: filter type(c_ptr), value, intent(in) :: id type(c_ptr), value, intent(in) :: nparts end subroutine fstarpu_block_filter_block_shadow ! void starpu_block_filter_vertical_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); subroutine fstarpu_block_filter_vertical_block (father_interface,child_interface,filter,id,nparts) & bind(C,name="starpu_block_filter_vertical_block") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: father_interface type(c_ptr), value, intent(in) :: child_interface type(c_ptr), value, intent(in) :: filter type(c_ptr), value, intent(in) :: id type(c_ptr), value, intent(in) :: nparts end subroutine fstarpu_block_filter_vertical_block ! void starpu_block_filter_vertical_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); subroutine fstarpu_block_filter_vertical_block_shadow (father_interface,child_interface,filter,id,nparts) & bind(C,name="starpu_block_filter_vertical_block_shadow") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: father_interface type(c_ptr), value, intent(in) :: child_interface type(c_ptr), value, intent(in) :: filter type(c_ptr), value, intent(in) :: id type(c_ptr), value, intent(in) :: nparts end subroutine fstarpu_block_filter_vertical_block_shadow ! void starpu_block_filter_depth_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); subroutine fstarpu_block_filter_depth_block (father_interface,child_interface,filter,id,nparts) & bind(C,name="starpu_block_filter_depth_block") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: father_interface type(c_ptr), value, intent(in) :: child_interface type(c_ptr), value, intent(in) :: filter type(c_ptr), value, intent(in) :: id type(c_ptr), value, intent(in) :: nparts end subroutine fstarpu_block_filter_depth_block ! void starpu_block_filter_depth_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); subroutine fstarpu_block_filter_depth_block_shadow (father_interface,child_interface,filter,id,nparts) & bind(C,name="starpu_block_filter_depth_block_shadow") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: father_interface type(c_ptr), value, intent(in) :: child_interface type(c_ptr), value, intent(in) :: filter type(c_ptr), value, intent(in) :: id type(c_ptr), value, intent(in) :: nparts end subroutine fstarpu_block_filter_depth_block_shadow ! == starpu_data.h == ! void starpu_data_unregister(starpu_data_handle_t handle); subroutine fstarpu_data_unregister (dh) bind(C,name="starpu_data_unregister") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: dh end subroutine fstarpu_data_unregister ! void starpu_data_unregister_no_coherency(starpu_data_handle_t handle); subroutine fstarpu_data_unregister_no_coherency (dh) bind(C,name="starpu_data_unregister_no_coherency") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: dh end subroutine fstarpu_data_unregister_no_coherency ! void starpu_data_unregister_submit(starpu_data_handle_t handle); subroutine fstarpu_data_unregister_submit (dh) bind(C,name="starpu_data_unregister_submit") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: dh end subroutine fstarpu_data_unregister_submit ! void starpu_data_invalidate(starpu_data_handle_t handle); subroutine fstarpu_data_invalidate (dh) bind(C,name="starpu_data_invalidate") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: dh end subroutine fstarpu_data_invalidate ! void starpu_data_invalidate_submit(starpu_data_handle_t handle); subroutine fstarpu_data_invalidate_submit (dh) bind(C,name="starpu_data_invalidate_submit") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: dh end subroutine fstarpu_data_invalidate_submit ! void starpu_data_advise_as_important(starpu_data_handle_t handle, unsigned is_important); subroutine fstarpu_data_advise_as_important (dh,is_important) bind(C,name="starpu_data_advise_as_important") use iso_c_binding, only: c_ptr,c_int type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: is_important end subroutine fstarpu_data_advise_as_important ! starpu_data_acquire: see fstarpu_data_acquire subroutine fstarpu_data_acquire (dh, mode) bind(C) use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: dh type(c_ptr), value, intent(in) :: mode ! C function expects an intptr_t end subroutine fstarpu_data_acquire ! int starpu_data_acquire_on_node(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode); ! int starpu_data_acquire_cb(starpu_data_handle_t handle, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg); ! int starpu_data_acquire_on_node_cb(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg); ! int starpu_data_acquire_cb_sequential_consistency(starpu_data_handle_t handle, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg, int sequential_consistency); ! int starpu_data_acquire_on_node_cb_sequential_consistency(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg, int sequential_consistency); ! void starpu_data_release(starpu_data_handle_t handle); subroutine fstarpu_data_release (dh) bind(C,name="starpu_data_release") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: dh end subroutine fstarpu_data_release ! void starpu_data_release_on_node(starpu_data_handle_t handle, int node); subroutine fstarpu_data_release_on_node (dh, node) bind(C,name="starpu_data_release_on_node") use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: node end subroutine fstarpu_data_release_on_node ! starpu_arbiter_t starpu_arbiter_create(void) STARPU_ATTRIBUTE_MALLOC; function fstarpu_arbiter_create () bind(C,name="starpu_arbiter_create") use iso_c_binding, only: c_ptr type(c_ptr) :: fstarpu_arbiter_create end function fstarpu_arbiter_create ! void starpu_data_assign_arbiter(starpu_data_handle_t handle, starpu_arbiter_t arbiter); subroutine fstarpu_data_assign_arbiter (dh,arbiter) bind(C,name="starpu_data_assign_arbiter") use iso_c_binding, only: c_ptr type(c_ptr), intent(out) :: dh type(c_ptr), value, intent(in) :: arbiter end subroutine fstarpu_data_assign_arbiter ! void starpu_arbiter_destroy(starpu_arbiter_t arbiter); subroutine fstarpu_data_arbiter_destroy (arbiter) bind(C,name="starpu_data_arbiter_destroy") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: arbiter end subroutine fstarpu_data_arbiter_destroy ! void starpu_data_display_memory_stats(); subroutine fstarpu_display_memory_stats() bind(C,name="starpu_display_memory_stats") end subroutine fstarpu_display_memory_stats ! int starpu_data_request_allocation(starpu_data_handle_t handle, unsigned node); subroutine fstarpu_data_request_allocation (dh, node) & bind(C,name="starpu_data_request_allocation") use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: node end subroutine fstarpu_data_request_allocation ! int starpu_data_fetch_on_node(starpu_data_handle_t handle, unsigned node, unsigned async); subroutine fstarpu_data_fetch_on_node (dh, node, async) & bind(C,name="starpu_data_fetch_on_node") use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: node integer(c_int), value, intent(in) :: async end subroutine fstarpu_data_fetch_on_node ! int starpu_data_prefetch_on_node(starpu_data_handle_t handle, unsigned node, unsigned async); subroutine fstarpu_data_prefetch_on_node (dh, node, async) & bind(C,name="starpu_data_prefetch_on_node") use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: node integer(c_int), value, intent(in) :: async end subroutine fstarpu_data_prefetch_on_node ! int starpu_data_prefetch_on_node_prio(starpu_data_handle_t handle, unsigned node, unsigned async, int prio); subroutine fstarpu_data_prefetch_on_node_prio (dh, node, async, prio) & bind(C,name="starpu_data_prefetch_on_node_prio") use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: node integer(c_int), value, intent(in) :: async integer(c_int), value, intent(in) :: prio end subroutine fstarpu_data_prefetch_on_node_prio ! int starpu_data_idle_prefetch_on_node(starpu_data_handle_t handle, unsigned node, unsigned async); subroutine fstarpu_data_idle_prefetch_on_node (dh, node, async) & bind(C,name="starpu_data_idle_prefetch_on_node") use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: node integer(c_int), value, intent(in) :: async end subroutine fstarpu_data_idle_prefetch_on_node ! int starpu_data_idle_prefetch_on_node_prio(starpu_data_handle_t handle, unsigned node, unsigned async, int prio); subroutine fstarpu_data_idle_prefetch_on_node_prio (dh, node, async, prio) & bind(C,name="starpu_data_idle_prefetch_on_node_prio") use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: node integer(c_int), value, intent(in) :: async integer(c_int), value, intent(in) :: prio end subroutine fstarpu_data_idle_prefetch_on_node_prio ! void starpu_data_wont_use(starpu_data_handle_t handle); subroutine fstarpu_data_wont_use (dh) bind(c,name="starpu_data_wont_use") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: dh end subroutine fstarpu_data_wont_use ! unsigned starpu_worker_get_memory_node(unsigned workerid); function fstarpu_worker_get_memory_node(id) bind(C,name="starpu_worker_get_memory_node") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_worker_get_memory_node integer(c_int), value, intent(in) :: id end function fstarpu_worker_get_memory_node ! unsigned starpu_memory_nodes_get_count(void); function fstarpu_memory_nodes_get_count() bind(C,name="starpu_memory_nodes_get_count") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_memory_nodes_get_count end function fstarpu_memory_nodes_get_count ! enum starpu_node_kind starpu_node_get_kind(unsigned node); ! void starpu_data_set_wt_mask(starpu_data_handle_t handle, uint32_t wt_mask); ! void starpu_data_set_sequential_consistency_flag(starpu_data_handle_t handle, unsigned flag); ! unsigned starpu_data_get_sequential_consistency_flag(starpu_data_handle_t handle); ! unsigned starpu_data_get_default_sequential_consistency_flag(void); ! void starpu_data_set_default_sequential_consistency_flag(unsigned flag); ! void starpu_data_query_status(starpu_data_handle_t handle, int memory_node, int *is_allocated, int *is_valid, int *is_requested); ! void starpu_data_set_reduction_methods(starpu_data_handle_t handle, struct starpu_codelet *redux_cl, struct starpu_codelet *init_cl); subroutine fstarpu_data_set_reduction_methods (dh,redux_cl,init_cl) bind(C,name="starpu_data_set_reduction_methods") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: dh type(c_ptr), value, intent(in) :: redux_cl type(c_ptr), value, intent(in) :: init_cl end subroutine fstarpu_data_set_reduction_methods ! struct starpu_data_interface_ops* starpu_data_get_interface_ops(starpu_data_handle_t handle); ! unsigned starpu_data_test_if_allocated_on_node(starpu_data_handle_t handle, unsigned memory_node); function fstarpu_data_test_if_allocated_on_node(dh,mem_node) bind(C,name="starpu_data_test_if_allocated_on_node") use iso_c_binding, only: c_ptr, c_int integer(c_int) :: fstarpu_data_test_if_allocated_on_node type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: mem_node end function fstarpu_data_test_if_allocated_on_node ! void starpu_memchunk_tidy(unsigned memory_node); subroutine fstarpu_memchunk_tidy (mem_node) bind(c,name="starpu_memchunk_tidy") use iso_c_binding, only: c_int integer(c_int), value, intent(in) :: mem_node end subroutine fstarpu_memchunk_tidy ! == starpu_task_util.h == ! starpu_data_handle_t *fstarpu_data_handle_array_alloc(int nb); function fstarpu_data_handle_array_alloc (nb) bind(C) use iso_c_binding, only: c_ptr, c_int type(c_ptr) :: fstarpu_data_handle_array_alloc integer(c_int), value, intent(in) :: nb end function fstarpu_data_handle_array_alloc ! void fstarpu_data_handle_array_free(starpu_data_handle_t *handles); subroutine fstarpu_data_handle_array_free (handles) bind(C) use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: handles end subroutine fstarpu_data_handle_array_free ! void fstarpu_data_handle_array_set(starpu_data_handle_t *handles, int i, starpu_data_handle_t handle); subroutine fstarpu_data_handle_array_set (handles, i, handle) bind(C) use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: handles integer(c_int), value, intent(in) :: i type(c_ptr), value, intent(in) :: handle end subroutine fstarpu_data_handle_array_set ! struct starpu_data_descr *fstarpu_data_descr_array_alloc(int nb); function fstarpu_data_descr_array_alloc (nb) bind(C) use iso_c_binding, only: c_ptr, c_int type(c_ptr) :: fstarpu_data_descr_array_alloc integer(c_int), value, intent(in) :: nb end function fstarpu_data_descr_array_alloc ! struct starpu_data_descr *fstarpu_data_descr_alloc(void); function fstarpu_data_descr_alloc (nb) bind(C) use iso_c_binding, only: c_ptr type(c_ptr) :: fstarpu_data_descr_alloc end function fstarpu_data_descr_alloc ! void fstarpu_data_descr_array_free(struct starpu_data_descr *descrs); subroutine fstarpu_data_descr_array_free (descrs) bind(C) use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: descrs end subroutine fstarpu_data_descr_array_free ! void fstarpu_data_descr_free(struct starpu_data_descr *descr); subroutine fstarpu_data_descrg_free (descr) bind(C) use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: descr end subroutine fstarpu_data_descrg_free ! void fstarpu_data_descr_array_set(struct starpu_data_descr *descrs, int i, starpu_data_handle_t handle, intptr_t mode); subroutine fstarpu_data_descr_array_set (descrs, i, handle, mode) bind(C) use iso_c_binding, only: c_ptr, c_int, c_intptr_t type(c_ptr), value, intent(in) :: descrs integer(c_int), value, intent(in) :: i type(c_ptr), value, intent(in) :: handle type(c_ptr), value, intent(in) :: mode ! C func expects c_intptr_t end subroutine fstarpu_data_descr_array_set ! void fstarpu_data_descr_set(struct starpu_data_descr *descr, starpu_data_handle_t handle, intptr_t mode); subroutine fstarpu_data_descr_set (descr, handle, mode) bind(C) use iso_c_binding, only: c_ptr, c_intptr_t type(c_ptr), value, intent(in) :: descr type(c_ptr), value, intent(in) :: handle type(c_ptr), value, intent(in) :: mode ! C func expects c_intptr_t end subroutine fstarpu_data_descr_set subroutine fstarpu_task_insert(arglist) bind(C) use iso_c_binding, only: c_ptr type(c_ptr), dimension(*), intent(in) :: arglist end subroutine fstarpu_task_insert subroutine fstarpu_insert_task(arglist) bind(C,name="fstarpu_task_insert") use iso_c_binding, only: c_ptr type(c_ptr), dimension(*), intent(in) :: arglist end subroutine fstarpu_insert_task subroutine fstarpu_unpack_arg(cl_arg,bufferlist) bind(C) use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: cl_arg type(c_ptr), dimension(*), intent(in) :: bufferlist end subroutine fstarpu_unpack_arg ! == starpu_sched_ctx.h == ! starpu_sched_ctx_create: see fstarpu_sched_ctx_create function fstarpu_sched_ctx_create(workers_array,nworkers,ctx_name, arglist) bind(C) use iso_c_binding, only: c_int, c_char, c_ptr integer(c_int) :: fstarpu_sched_ctx_create integer(c_int), intent(in) :: workers_array(*) integer(c_int), value, intent(in) :: nworkers character(c_char), intent(in) :: ctx_name type(c_ptr), dimension(*), intent(in) :: arglist end function fstarpu_sched_ctx_create ! unsigned starpu_sched_ctx_create_inside_interval(const char *policy_name, const char *sched_ctx_name, int min_ncpus, int max_ncpus, int min_ngpus, int max_ngpus, unsigned allow_overlap); function fstarpu_sched_ctx_create_inside_interval(policy_name, sched_ctx_name, & min_ncpus, max_ncpus, min_ngpus, max_ngpus, allow_overlap) & bind(C,name="starpu_sched_ctx_create_inside_interval") use iso_c_binding, only: c_int, c_char integer(c_int) :: fstarpu_sched_ctx_create_inside_interval character(c_char), intent(in) :: policy_name character(c_char), intent(in) :: sched_ctx_name integer(c_int), value, intent(in) :: min_ncpus integer(c_int), value, intent(in) :: max_ncpus integer(c_int), value, intent(in) :: min_ngpus integer(c_int), value, intent(in) :: max_ngpus integer(c_int), value, intent(in) :: allow_overlap end function fstarpu_sched_ctx_create_inside_interval ! void starpu_sched_ctx_register_close_callback(unsigned sched_ctx_id, void (*close_callback)(unsigned sched_ctx_id, void* args), void *args); subroutine fstarpu_sched_ctx_register_close_callback (sched_ctx_id, close_callback, args) & bind(c,name="starpu_sched_ctx_register_close_callback") use iso_c_binding, only: c_ptr, c_funptr, c_int integer(c_int), value, intent(in) :: sched_ctx_id type(c_funptr), value, intent(in) :: close_callback type(c_ptr), value, intent(in) :: args end subroutine fstarpu_sched_ctx_register_close_callback ! void starpu_sched_ctx_add_workers(int *workerids_ctx, int nworkers_ctx, unsigned sched_ctx_id); subroutine fstarpu_sched_ctx_add_workers(workerids,nworkers,ctx) bind(C,name="starpu_sched_ctx_add_workers") use iso_c_binding, only: c_int integer(c_int), intent(in) :: workerids (*) integer(c_int), value, intent(in) :: nworkers integer(c_int), value, intent(in) :: ctx end subroutine fstarpu_sched_ctx_add_workers ! void starpu_sched_ctx_remove_workers(int *workerids_ctx, int nworkers_ctx, unsigned sched_ctx_id); subroutine fstarpu_sched_ctx_remove_workers(workerids,nworkers,ctx) bind(C,name="starpu_sched_ctx_remove_workers") use iso_c_binding, only: c_int integer(c_int), intent(in) :: workerids (*) integer(c_int), value, intent(in) :: nworkers integer(c_int), value, intent(in) :: ctx end subroutine fstarpu_sched_ctx_remove_workers ! starpu_sched_ctx_display_workers: see fstarpu_sched_ctx_display_workers subroutine fstarpu_sched_ctx_display_workers (ctx) bind(C) use iso_c_binding, only: c_int integer(c_int), value, intent(in) :: ctx end subroutine fstarpu_sched_ctx_display_workers ! void starpu_sched_ctx_delete(unsigned sched_ctx_id); subroutine fstarpu_sched_ctx_delete (ctx) bind(C,name="starpu_sched_ctx_delete") use iso_c_binding, only: c_int integer(c_int), value, intent(in) :: ctx end subroutine fstarpu_sched_ctx_delete ! void starpu_sched_ctx_set_inheritor(unsigned sched_ctx_id, unsigned inheritor); subroutine fstarpu_sched_ctx_set_inheritor (ctx,inheritor) bind(C,name="starpu_sched_ctx_set_inheritor") use iso_c_binding, only: c_int integer(c_int), value, intent(in) :: ctx integer(c_int), value, intent(in) :: inheritor end subroutine fstarpu_sched_ctx_set_inheritor ! unsigned starpu_sched_ctx_get_inheritor(unsigned sched_ctx_id); function fstarpu_sched_ctx_get_inheritor (ctx) bind(C,name="starpu_sched_ctx_get_inheritor") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_sched_ctx_get_inheritor integer(c_int), value, intent(in) :: ctx end function fstarpu_sched_ctx_get_inheritor ! unsigned starpu_sched_ctx_get_hierarchy_level(unsigned sched_ctx_id); function fstarpu_sched_ctx_get_hierarchy_level (ctx) bind(C,name="starpu_sched_ctx_get_hierarchy_level") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_sched_ctx_get_hierarchy_level integer(c_int), value, intent(in) :: ctx end function fstarpu_sched_ctx_get_hierarchy_level ! void starpu_sched_ctx_set_context(unsigned *sched_ctx_id); subroutine fstarpu_sched_ctx_set_context (ctx_ptr) bind(C,name="starpu_sched_ctx_set_context") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: ctx_ptr end subroutine fstarpu_sched_ctx_set_context ! unsigned starpu_sched_ctx_get_context(void); function fstarpu_sched_ctx_get_context () bind(C,name="starpu_sched_ctx_get_context") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_sched_ctx_get_context end function fstarpu_sched_ctx_get_context ! void starpu_sched_ctx_stop_task_submission(void); subroutine fstarpu_sched_ctx_stop_task_submission () bind(c,name="starpu_sched_ctx_stop_task_submission") use iso_c_binding end subroutine fstarpu_sched_ctx_stop_task_submission ! void starpu_sched_ctx_finished_submit(unsigned sched_ctx_id); subroutine fstarpu_sched_ctx_finished_submit (sched_ctx_id) bind(c,name="starpu_sched_ctx_finished_submit") use iso_c_binding, only: c_int integer(c_int), value, intent(in) :: sched_ctx_id end subroutine fstarpu_sched_ctx_finished_submit ! unsigned starpu_sched_ctx_get_workers_list(unsigned sched_ctx_id, int **workerids); ! unsigned starpu_sched_ctx_get_workers_list_raw(unsigned sched_ctx_id, int **workerids); ! unsigned starpu_sched_ctx_get_nworkers(unsigned sched_ctx_id); function fstarpu_sched_ctx_get_nworkers (sched_ctx_id) & bind(c,name="starpu_sched_ctx_get_nworkers") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_sched_ctx_get_nworkers integer(c_int), value, intent(in) :: sched_ctx_id end function fstarpu_sched_ctx_get_nworkers ! unsigned starpu_sched_ctx_get_nshared_workers(unsigned sched_ctx_id, unsigned sched_ctx_id2); function fstarpu_sched_ctx_get_nshared_workers (sched_ctx_id, sched_ctx_id2) & bind(c,name="starpu_sched_ctx_get_nshared_workers") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_sched_ctx_get_nshared_workers integer(c_int), value, intent(in) :: sched_ctx_id integer(c_int), value, intent(in) :: sched_ctx_id2 end function fstarpu_sched_ctx_get_nshared_workers ! unsigned starpu_sched_ctx_contains_worker(int workerid, unsigned sched_ctx_id); function fstarpu_sched_ctx_contains_worker (workerid, sched_ctx_id) & bind(c,name="starpu_sched_ctx_contains_worker") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_sched_ctx_contains_worker integer(c_int), value, intent(in) :: workerid integer(c_int), value, intent(in) :: sched_ctx_id end function fstarpu_sched_ctx_contains_worker ! unsigned starpu_sched_ctx_contains_type_of_worker(enum starpu_worker_archtype arch, unsigned sched_ctx_id); function fstarpu_sched_ctx_contains_type_of_worker (arch, sched_ctx_id) & bind(c,name="starpu_sched_ctx_contains_type_of_worker") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_sched_ctx_contains_type_of_worker integer(c_int), value, intent(in) :: arch integer(c_int), value, intent(in) :: sched_ctx_id end function fstarpu_sched_ctx_contains_type_of_worker ! unsigned starpu_sched_ctx_worker_get_id(unsigned sched_ctx_id); function fstarpu_sched_ctx_worker_get_id (sched_ctx_id) & bind(c,name="starpu_sched_ctx_worker_get_id") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_sched_ctx_worker_get_id integer(c_int), value, intent(in) :: sched_ctx_id end function fstarpu_sched_ctx_worker_get_id ! unsigned starpu_sched_ctx_get_ctx_for_task(struct starpu_task *task); function fstarpu_sched_ctx_get_ctx_for_task (task) & bind(c,name="starpu_sched_ctx_get_ctx_for_task") use iso_c_binding, only: c_int, c_ptr integer(c_int) :: fstarpu_sched_ctx_get_ctx_for_task type(c_ptr), value, intent(in) :: task end function fstarpu_sched_ctx_get_ctx_for_task ! unsigned starpu_sched_ctx_overlapping_ctxs_on_worker(int workerid); function fstarpu_sched_ctx_overlapping_ctxs_on_worker (workerid) & bind(c,name="starpu_sched_ctx_overlapping_ctxs_on_worker") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_sched_ctx_overlapping_ctxs_on_worker integer(c_int), value, intent(in) :: workerid end function fstarpu_sched_ctx_overlapping_ctxs_on_worker ! int starpu_sched_get_min_priority(void); function fstarpu_sched_get_min_priority () & bind(c,name="starpu_sched_get_min_priority") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_sched_get_min_priority end function fstarpu_sched_get_min_priority ! int starpu_sched_get_max_priority(void); function fstarpu_sched_get_max_priority () & bind(c,name="starpu_sched_get_max_priority") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_sched_get_max_priority end function fstarpu_sched_get_max_priority ! int starpu_sched_set_min_priority(int min_prio); function fstarpu_sched_set_min_priority (min_prio) & bind(c,name="starpu_sched_set_min_priority") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_sched_set_min_priority integer(c_int), value, intent(in) :: min_prio end function fstarpu_sched_set_min_priority ! int starpu_sched_set_max_priority(int max_prio); function fstarpu_sched_set_max_priority (max_prio) & bind(c,name="starpu_sched_set_max_priority") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_sched_set_max_priority integer(c_int), value, intent(in) :: max_prio end function fstarpu_sched_set_max_priority ! int starpu_sched_ctx_get_min_priority(unsigned sched_ctx_id); function fstarpu_sched_ctx_get_min_priority (sched_ctx_id) & bind(c,name="starpu_sched_ctx_get_min_priority") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_sched_ctx_get_min_priority integer(c_int), value, intent(in) :: sched_ctx_id end function fstarpu_sched_ctx_get_min_priority ! int starpu_sched_ctx_get_max_priority(unsigned sched_ctx_id); function fstarpu_sched_ctx_get_max_priority (sched_ctx_id) & bind(c,name="starpu_sched_ctx_get_max_priority") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_sched_ctx_get_max_priority integer(c_int), value, intent(in) :: sched_ctx_id end function fstarpu_sched_ctx_get_max_priority ! int starpu_sched_ctx_set_min_priority(unsigned sched_ctx_id, int min_prio); function fstarpu_sched_ctx_set_min_priority (sched_ctx_id, min_prio) & bind(c,name="starpu_sched_ctx_set_min_priority") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_sched_ctx_set_min_priority integer(c_int), value, intent(in) :: sched_ctx_id integer(c_int), value, intent(in) :: min_prio end function fstarpu_sched_ctx_set_min_priority ! int starpu_sched_ctx_set_max_priority(unsigned sched_ctx_id, int max_prio); function fstarpu_sched_ctx_set_max_priority (sched_ctx_id, max_prio) & bind(c,name="starpu_sched_ctx_set_max_priority") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_sched_ctx_set_max_priority integer(c_int), value, intent(in) :: sched_ctx_id integer(c_int), value, intent(in) :: max_prio end function fstarpu_sched_ctx_set_max_priority ! int starpu_sched_ctx_min_priority_is_set(unsigned sched_ctx_id); function fstarpu_sched_ctx_min_priority_is_set (sched_ctx_id) & bind(c,name="starpu_sched_ctx_min_priority_is_set") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_sched_ctx_min_priority_is_set integer(c_int), value, intent(in) :: sched_ctx_id end function fstarpu_sched_ctx_min_priority_is_set ! int starpu_sched_ctx_max_priority_is_set(unsigned sched_ctx_id); function fstarpu_sched_ctx_max_priority_is_set (sched_ctx_id) & bind(c,name="starpu_sched_ctx_max_priority_is_set") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_sched_ctx_max_priority_is_set integer(c_int), value, intent(in) :: sched_ctx_id end function fstarpu_sched_ctx_max_priority_is_set ! struct starpu_worker_collection *starpu_sched_ctx_create_worker_collection(unsigned sched_ctx_id, enum starpu_worker_collection_type type) STARPU_ATTRIBUTE_MALLOC; ! void starpu_sched_ctx_delete_worker_collection(unsigned sched_ctx_id); subroutine fstarpu_sched_ctx_delete_worker_collection (sched_ctx_id) & bind(c,name="starpu_sched_ctx_delete_worker_collection") use iso_c_binding, only: c_int integer(c_int), value, intent(in) :: sched_ctx_id end subroutine fstarpu_sched_ctx_delete_worker_collection ! struct starpu_worker_collection *starpu_sched_ctx_get_worker_collection(unsigned sched_ctx_id); ! void starpu_sched_ctx_set_policy_data(unsigned sched_ctx_id, void *policy_data); subroutine fstarpu_sched_ctx_set_policy_data (sched_ctx_id, policy_data) & bind(c,name="starpu_sched_ctx_set_policy_data") use iso_c_binding, only: c_int, c_ptr integer(c_int), value, intent(in) :: sched_ctx_id type(c_ptr), value, intent(in) :: policy_data end subroutine fstarpu_sched_ctx_set_policy_data ! void *starpu_sched_ctx_get_policy_data(unsigned sched_ctx_id); function fstarpu_sched_ctx_get_policy_data (sched_ctx_id) & bind(c,name="starpu_sched_ctx_get_policy_data") use iso_c_binding, only: c_int, c_ptr type(c_ptr) :: fstarpu_sched_ctx_get_policy_data integer(c_int), value, intent(in) :: sched_ctx_id end function fstarpu_sched_ctx_get_policy_data ! void *starpu_sched_ctx_exec_parallel_code(void* (*func)(void*), void *param, unsigned sched_ctx_id); function fstarpu_sched_ctx_exec_parallel_code (func, param, sched_ctx_id) & bind(c,name="starpu_sched_ctx_exec_parallel_code") use iso_c_binding, only: c_int, c_funptr, c_ptr type(c_ptr) :: fstarpu_sched_ctx_exec_parallel_code type(c_funptr), value, intent(in) :: func type(c_ptr), value, intent(in) :: param integer(c_int), value, intent(in) :: sched_ctx_id end function fstarpu_sched_ctx_exec_parallel_code ! int starpu_sched_ctx_get_nready_tasks(unsigned sched_ctx_id); function fstarpu_sched_ctx_get_nready_tasks (sched_ctx_id) & bind(c,name="starpu_sched_ctx_get_nready_tasks") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_sched_ctx_get_nready_tasks integer(c_int), value, intent(in) :: sched_ctx_id end function fstarpu_sched_ctx_get_nready_tasks ! double starpu_sched_ctx_get_nready_flops(unsigned sched_ctx_id); function fstarpu_sched_ctx_get_nready_flops (sched_ctx_id) & bind(c,name="starpu_sched_ctx_get_nready_flops") use iso_c_binding, only: c_int, c_double real(c_double) :: fstarpu_sched_ctx_get_nready_flops integer(c_int), value, intent(in) :: sched_ctx_id end function fstarpu_sched_ctx_get_nready_flops ! void starpu_sched_ctx_list_task_counters_increment(unsigned sched_ctx_id, int workerid); subroutine fstarpu_sched_ctx_list_task_counters_increment (sched_ctx_id, workerid) & bind(c,name="starpu_sched_ctx_list_task_counters_increment") use iso_c_binding, only: c_int integer(c_int), value, intent(in) :: sched_ctx_id integer(c_int), value, intent(in) :: workerid end subroutine fstarpu_sched_ctx_list_task_counters_increment ! void starpu_sched_ctx_list_task_counters_decrement(unsigned sched_ctx_id, int workerid); subroutine fstarpu_sched_ctx_list_task_counters_decrement (sched_ctx_id, workerid) & bind(c,name="starpu_sched_ctx_list_task_counters_decrement") use iso_c_binding, only: c_int integer(c_int), value, intent(in) :: sched_ctx_id integer(c_int), value, intent(in) :: workerid end subroutine fstarpu_sched_ctx_list_task_counters_decrement ! void starpu_sched_ctx_list_task_counters_reset(unsigned sched_ctx_id, int workerid); subroutine fstarpu_sched_ctx_list_task_counters_reset (sched_ctx_id, workerid) & bind(c,name="starpu_sched_ctx_list_task_counters_reset") use iso_c_binding, only: c_int integer(c_int), value, intent(in) :: sched_ctx_id integer(c_int), value, intent(in) :: workerid end subroutine fstarpu_sched_ctx_list_task_counters_reset ! void starpu_sched_ctx_list_task_counters_increment_all(struct starpu_task *task, unsigned sched_ctx_id); subroutine fstarpu_sched_ctx_list_task_counters_increment_all (task, sched_ctx_id) & bind(c,name="starpu_sched_ctx_list_task_counters_increment_all") use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: task integer(c_int), value, intent(in) :: sched_ctx_id end subroutine fstarpu_sched_ctx_list_task_counters_increment_all ! void starpu_sched_ctx_list_task_counters_decrement_all(struct starpu_task *task, unsigned sched_ctx_id); subroutine fstarpu_sched_ctx_list_task_counters_decrement_all (task, sched_ctx_id) & bind(c,name="starpu_sched_ctx_list_task_counters_decrement_all") use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: task integer(c_int), value, intent(in) :: sched_ctx_id end subroutine fstarpu_sched_ctx_list_task_counters_decrement_all ! void starpu_sched_ctx_list_task_counters_reset_all(struct starpu_task *task, unsigned sched_ctx_id); subroutine fstarpu_sched_ctx_list_task_counters_reset_all (task, sched_ctx_id) & bind(c,name="starpu_sched_ctx_list_task_counters_reset_all") use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: task integer(c_int), value, intent(in) :: sched_ctx_id end subroutine fstarpu_sched_ctx_list_task_counters_reset_all ! void starpu_sched_ctx_set_priority(int *workers, int nworkers, unsigned sched_ctx_id, unsigned priority); subroutine fstarpu_sched_ctx_set_priority (workers, nworkers, sched_ctx_id, priority) & bind(c,name="starpu_sched_ctx_set_priority") use iso_c_binding, only: c_int integer(c_int), intent(in) :: workers(*) integer(c_int), value, intent(in) :: nworkers integer(c_int), value, intent(in) :: sched_ctx_id integer(c_int), value, intent(in) :: priority end subroutine fstarpu_sched_ctx_set_priority ! void starpu_sched_ctx_set_priority_on_level(int* workers_to_add, unsigned nworkers_to_add, unsigned sched_ctx, unsigned priority); subroutine fstarpu_sched_ctx_set_priority_on_level ( workers_to_add, nworkers_to_add, sched_ctx, priority) & bind(c,name="starpu_sched_ctx_set_priority_on_level") use iso_c_binding, only: c_int integer(c_int), intent(in) :: workers_to_add(*) integer(c_int), value, intent(in) :: nworkers_to_add integer(c_int), value, intent(in) :: sched_ctx integer(c_int), value, intent(in) :: priority end subroutine fstarpu_sched_ctx_set_priority_on_level ! unsigned starpu_sched_ctx_get_priority(int worker, unsigned sched_ctx_id); function fstarpu_sched_ctx_get_priority (worker, sched_ctx_id) & bind(c,name="starpu_sched_ctx_get_priority") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_sched_ctx_get_priority integer(c_int), value, intent(in) :: worker integer(c_int), value, intent(in) :: sched_ctx_id end function fstarpu_sched_ctx_get_priority ! void starpu_sched_ctx_get_available_cpuids(unsigned sched_ctx_id, int **cpuids, int *ncpuids); ! void starpu_sched_ctx_bind_current_thread_to_cpuid(unsigned cpuid); subroutine fstarpu_sched_ctx_bind_current_thread_to_cpuid (cpuid) & bind(c,name="starpu_sched_ctx_bind_current_thread_to_cpuid") use iso_c_binding, only: c_int integer(c_int), value, intent(in) :: cpuid end subroutine fstarpu_sched_ctx_bind_current_thread_to_cpuid ! int starpu_sched_ctx_book_workers_for_task(unsigned sched_ctx_id, int *workerids, int nworkers); function fstarpu_sched_ctx_book_workers_for_task (sched_ctx_id, workerids, nworkers) & bind(c,name="starpu_sched_ctx_book_workers_for_task") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_sched_ctx_book_workers_for_task integer(c_int), value, intent(in) :: sched_ctx_id integer(c_int), intent(in) :: workerids(*) integer(c_int), value, intent(in) :: nworkers end function fstarpu_sched_ctx_book_workers_for_task ! void starpu_sched_ctx_unbook_workers_for_task(unsigned sched_ctx_id, int master); subroutine fstarpu_sched_ctx_unbook_workers_for_task (sched_ctx_id, master) & bind(c,name="starpu_sched_ctx_unbook_workers_for_task") use iso_c_binding, only: c_int integer(c_int), value, intent(in) :: sched_ctx_id integer(c_int), value, intent(in) :: master end subroutine fstarpu_sched_ctx_unbook_workers_for_task ! unsigned starpu_sched_ctx_worker_is_master_for_child_ctx(int workerid, unsigned sched_ctx_id); function fstarpu_sched_ctx_worker_is_master_for_child_ctx (workerid, sched_ctx_id) & bind(c,name="starpu_sched_ctx_worker_is_master_for_child_ctx") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_sched_ctx_worker_is_master_for_child_ctx integer(c_int), value, intent(in) :: workerid integer(c_int), value, intent(in) :: sched_ctx_id end function fstarpu_sched_ctx_worker_is_master_for_child_ctx ! unsigned starpu_sched_ctx_master_get_context(int masterid); function fstarpu_sched_ctx_master_get_context (masterid) & bind(c,name="starpu_sched_ctx_master_get_context") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_sched_ctx_master_get_context integer(c_int), value, intent(in) :: masterid end function fstarpu_sched_ctx_master_get_context ! void starpu_sched_ctx_revert_task_counters(unsigned sched_ctx_id, double flops); subroutine fstarpu_sched_ctx_revert_task_counters (sched_ctx_id, flops) & bind(c,name="starpu_sched_ctx_revert_task_counters") use iso_c_binding, only: c_int, c_double integer(c_int), value, intent(in) :: sched_ctx_id real(c_double), value, intent(in) :: flops end subroutine fstarpu_sched_ctx_revert_task_counters ! void starpu_sched_ctx_move_task_to_ctx(struct starpu_task *task, unsigned sched_ctx, unsigned manage_mutex); subroutine fstarpu_sched_ctx_move_task_to_ctx (task, sched_ctx, manage_mutex) & bind(c,name="starpu_sched_ctx_move_task_to_ctx") use iso_c_binding, only: c_ptr, c_int type(c_ptr), value, intent(in) :: task integer(c_int), value, intent(in) :: sched_ctx integer(c_int), value, intent(in) :: manage_mutex end subroutine fstarpu_sched_ctx_move_task_to_ctx ! int starpu_sched_ctx_get_worker_rank(unsigned sched_ctx_id); function fstarpu_sched_ctx_get_worker_rank (sched_ctx_id) & bind(c,name="starpu_sched_ctx_get_worker_rank") use iso_c_binding, only: c_int integer(c_int) :: fstarpu_sched_ctx_get_worker_rank integer(c_int), value, intent(in) :: sched_ctx_id end function fstarpu_sched_ctx_get_worker_rank ! unsigned starpu_sched_ctx_has_starpu_scheduler(unsigned sched_ctx_id, unsigned *awake_workers); ! void starpu_sched_ctx_call_pushed_task_cb(int workerid, unsigned sched_ctx_id); subroutine fstarpu_sched_ctx_call_pushed_task_cb (workerid, sched_ctx_id) & bind(c,name="starpu_sched_ctx_call_pushed_task_cb") use iso_c_binding, only: c_int integer(c_int), value, intent(in) :: workerid integer(c_int), value, intent(in) :: sched_ctx_id end subroutine fstarpu_sched_ctx_call_pushed_task_cb ! == starpu_fxt.h == ! void starpu_fxt_options_init(struct starpu_fxt_options *options); subroutine fstarpu_fxt_options_init (fxt_options) bind(C,name="starpu_fxt_options_init") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: fxt_options end subroutine fstarpu_fxt_options_init ! void starpu_fxt_generate_trace(struct starpu_fxt_options *options); subroutine fstarpu_fxt_generate_trace (fxt_options) bind(C,name="starpu_fxt_generate_trace") use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: fxt_options end subroutine fstarpu_fxt_generate_trace ! void starpu_fxt_autostart_profiling(int autostart); subroutine fstarpu_fxt_autostart_profiling (autostart) bind(c,name="starpu_fxt_autostart_profiling") use iso_c_binding, only: c_int integer(c_int), value, intent(in) :: autostart end subroutine fstarpu_fxt_autostart_profiling ! void starpu_fxt_start_profiling(void); subroutine fstarpu_fxt_start_profiling () bind(c,name="starpu_fxt_start_profiling") use iso_c_binding end subroutine fstarpu_fxt_start_profiling ! void starpu_fxt_stop_profiling(void); subroutine fstarpu_fxt_stop_profiling () bind(c,name="starpu_fxt_stop_profiling") use iso_c_binding end subroutine fstarpu_fxt_stop_profiling ! void starpu_fxt_write_data_trace(char *filename_in); subroutine fstarpu_fxt_write_data_trace (filename) bind(c,name="starpu_fxt_write_data_trace") use iso_c_binding, only: c_char character(c_char), intent(in) :: filename end subroutine fstarpu_fxt_write_data_trace ! void starpu_fxt_trace_user_event(unsigned long code); subroutine fstarpu_trace_user_event (code) bind(c,name="starpu_trace_user_event") use iso_c_binding, only: c_long integer(c_long), value, intent(in) :: code end subroutine fstarpu_trace_user_event end interface contains function or_cptrs(op1,op2) type(c_ptr) :: or_cptrs type(c_ptr),intent(in) :: op1,op2 integer(c_intptr_t) :: i_op1,i_op2 i_op1 = transfer(op1,0_c_intptr_t) i_op2 = transfer(op2,0_c_intptr_t) or_cptrs = transfer(ior(i_op1,i_op2), C_NULL_PTR) end function function ip_to_p(i) bind(C) use iso_c_binding, only: c_ptr,c_intptr_t,C_NULL_PTR type(c_ptr) :: ip_to_p integer(c_intptr_t), value, intent(in) :: i ip_to_p = transfer(i,C_NULL_PTR) end function ip_to_p function p_to_ip(p) bind(C) use iso_c_binding, only: c_ptr,c_intptr_t integer(c_intptr_t) :: p_to_ip type(c_ptr), value, intent(in) :: p p_to_ip = transfer(p,0_c_intptr_t) end function p_to_ip function sz_to_p(sz) bind(C) use iso_c_binding, only: c_ptr,c_size_t,c_intptr_t type(c_ptr) :: sz_to_p integer(c_size_t), value, intent(in) :: sz sz_to_p = ip_to_p(int(sz,kind=c_intptr_t)) end function sz_to_p function fstarpu_init (conf) bind(C) use iso_c_binding integer(c_int) :: fstarpu_init type(c_ptr), value, intent(in) :: conf real(c_double) :: FSTARPU_SZ_C_DOUBLE_dummy real(c_float) :: FSTARPU_SZ_C_FLOAT_dummy character(c_char) :: FSTARPU_SZ_C_CHAR_dummy integer(c_int) :: FSTARPU_SZ_C_INT_dummy integer(c_intptr_t) :: FSTARPU_SZ_C_INTPTR_T_dummy type(c_ptr) :: FSTARPU_SZ_C_PTR_dummy integer(c_size_t) :: FSTARPU_SZ_C_SIZE_T_dummy character :: FSTARPU_SZ_CHARACTER_dummy integer :: FSTARPU_SZ_INTEGER_dummy integer(4) :: FSTARPU_SZ_INT4_dummy integer(8) :: FSTARPU_SZ_INT8_dummy real :: FSTARPU_SZ_REAL_dummy real(4) :: FSTARPU_SZ_REAL4_dummy real(8) :: FSTARPU_SZ_REAL8_dummy double precision :: FSTARPU_SZ_DOUBLE_PRECISION_dummy complex :: FSTARPU_SZ_COMPLEX_dummy complex(4) :: FSTARPU_SZ_COMPLEX4_dummy complex(8) :: FSTARPU_SZ_COMPLEX8_dummy ! Note: Referencing global C constants from Fortran has ! been found unreliable on some architectures, notably ! on Darwin. The get_integer/get_pointer_constant ! scheme is a workaround to that issue. interface ! These functions are not exported to the end user function fstarpu_get_constant(s) bind(C) use iso_c_binding, only: c_ptr,c_char type(c_ptr) :: fstarpu_get_constant ! C function returns an intptr_t character(kind=c_char) :: s end function fstarpu_get_constant function fstarpu_init_internal (conf) bind(C,name="starpu_init") use iso_c_binding, only: c_ptr,c_int integer(c_int) :: fstarpu_init_internal type(c_ptr), value :: conf end function fstarpu_init_internal end interface ! Initialize Fortran constants from C peers FSTARPU_R = fstarpu_get_constant(C_CHAR_"FSTARPU_R"//C_NULL_CHAR) FSTARPU_W = fstarpu_get_constant(C_CHAR_"FSTARPU_W"//C_NULL_CHAR) FSTARPU_RW = fstarpu_get_constant(C_CHAR_"FSTARPU_RW"//C_NULL_CHAR) FSTARPU_SCRATCH = fstarpu_get_constant(C_CHAR_"FSTARPU_SCRATCH"//C_NULL_CHAR) FSTARPU_REDUX = fstarpu_get_constant(C_CHAR_"FSTARPU_REDUX"//C_NULL_CHAR) FSTARPU_COMMUTE = fstarpu_get_constant(C_CHAR_"FSTARPU_COMMUTE"//C_NULL_CHAR) FSTARPU_SSEND = fstarpu_get_constant(C_CHAR_"FSTARPU_SSEND"//C_NULL_CHAR) FSTARPU_LOCALITY = fstarpu_get_constant(C_CHAR_"FSTARPU_LOCALITY"//C_NULL_CHAR) FSTARPU_DATA_ARRAY = fstarpu_get_constant(C_CHAR_"FSTARPU_DATA_ARRAY"//C_NULL_CHAR) FSTARPU_DATA_MODE_ARRAY = fstarpu_get_constant(C_CHAR_"FSTARPU_DATA_MODE_ARRAY"//C_NULL_CHAR) FSTARPU_CL_ARGS = fstarpu_get_constant(C_CHAR_"FSTARPU_CL_ARGS"//C_NULL_CHAR) FSTARPU_CALLBACK = fstarpu_get_constant(C_CHAR_"FSTARPU_CALLBACK"//C_NULL_CHAR) FSTARPU_CALLBACK_WITH_ARG = fstarpu_get_constant(C_CHAR_"FSTARPU_CALLBACK_WITH_ARG"//C_NULL_CHAR) FSTARPU_CALLBACK_ARG = fstarpu_get_constant(C_CHAR_"FSTARPU_CALLBACK_ARG"//C_NULL_CHAR) FSTARPU_PROLOGUE_CALLBACK = fstarpu_get_constant(C_CHAR_"FSTARPU_PROLOGUE_CALLBACK"//C_NULL_CHAR) FSTARPU_PROLOGUE_CALLBACK_ARG = fstarpu_get_constant(C_CHAR_"FSTARPU_PROLOGUE_CALLBACK_ARG"//C_NULL_CHAR) FSTARPU_PROLOGUE_CALLBACK_POP = fstarpu_get_constant(C_CHAR_"FSTARPU_PROLOGUE_CALLBACK_POP"//C_NULL_CHAR) FSTARPU_PROLOGUE_CALLBACK_POP_ARG = & fstarpu_get_constant(C_CHAR_"FSTARPU_PROLOGUE_CALLBACK_POP_ARG"//C_NULL_CHAR) FSTARPU_PRIORITY = fstarpu_get_constant(C_CHAR_"FSTARPU_PRIORITY"//C_NULL_CHAR) FSTARPU_EXECUTE_ON_NODE = fstarpu_get_constant(C_CHAR_"FSTARPU_EXECUTE_ON_NODE"//C_NULL_CHAR) FSTARPU_EXECUTE_ON_DATA = fstarpu_get_constant(C_CHAR_"FSTARPU_EXECUTE_ON_DATA"//C_NULL_CHAR) FSTARPU_EXECUTE_ON_WORKER = fstarpu_get_constant(C_CHAR_"FSTARPU_EXECUTE_ON_WORKER"//C_NULL_CHAR) FSTARPU_WORKER_ORDER = fstarpu_get_constant(C_CHAR_"FSTARPU_WORKER_ORDER"//C_NULL_CHAR) FSTARPU_HYPERVISOR_TAG = fstarpu_get_constant(C_CHAR_"FSTARPU_HYPERVISOR_TAG"//C_NULL_CHAR) FSTARPU_POSSIBLY_PARALLEL = fstarpu_get_constant(C_CHAR_"FSTARPU_POSSIBLY_PARALLEL"//C_NULL_CHAR) FSTARPU_FLOPS = fstarpu_get_constant(C_CHAR_"FSTARPU_FLOPS"//C_NULL_CHAR) FSTARPU_TAG = fstarpu_get_constant(C_CHAR_"FSTARPU_TAG"//C_NULL_CHAR) FSTARPU_TAG_ONLY = fstarpu_get_constant(C_CHAR_"FSTARPU_TAG_ONLY"//C_NULL_CHAR) FSTARPU_NAME = fstarpu_get_constant(C_CHAR_"FSTARPU_NAME"//C_NULL_CHAR) FSTARPU_NODE_SELECTION_POLICY = fstarpu_get_constant(C_CHAR_"FSTARPU_NODE_SELECTION_POLICY"//C_NULL_CHAR) FSTARPU_VALUE = fstarpu_get_constant(C_CHAR_"FSTARPU_VALUE"//C_NULL_CHAR) FSTARPU_SCHED_CTX = fstarpu_get_constant(C_CHAR_"FSTARPU_SCHED_CTX"//C_NULL_CHAR) FSTARPU_CPU_WORKER = fstarpu_get_constant(C_CHAR_"FSTARPU_CPU_WORKER"//C_NULL_CHAR) FSTARPU_CUDA_WORKER = fstarpu_get_constant(C_CHAR_"FSTARPU_CUDA_WORKER"//C_NULL_CHAR) FSTARPU_OPENCL_WORKER = fstarpu_get_constant(C_CHAR_"FSTARPU_OPENCL_WORKER"//C_NULL_CHAR) FSTARPU_MIC_WORKER = fstarpu_get_constant(C_CHAR_"FSTARPU_MIC_WORKER"//C_NULL_CHAR) FSTARPU_SCC_WORKER = fstarpu_get_constant(C_CHAR_"FSTARPU_SCC_WORKER"//C_NULL_CHAR) FSTARPU_ANY_WORKER = fstarpu_get_constant(C_CHAR_"FSTARPU_ANY_WORKER"//C_NULL_CHAR) FSTARPU_NMAXBUFS = int(p_to_ip(fstarpu_get_constant(C_CHAR_"FSTARPU_NMAXBUFS"//C_NULL_CHAR)),c_int) FSTARPU_SCHED_CTX_POLICY_NAME = & fstarpu_get_constant(C_CHAR_"FSTARPU_SCHED_CTX_POLICY_NAME"//C_NULL_CHAR) FSTARPU_SCHED_CTX_POLICY_STRUCT = & fstarpu_get_constant(C_CHAR_"FSTARPU_SCHED_CTX_POLICY_STRUCT"//C_NULL_CHAR) FSTARPU_SCHED_CTX_POLICY_MIN_PRIO = & fstarpu_get_constant(C_CHAR_"FSTARPU_SCHED_CTX_POLICY_MIN_PRIO"//C_NULL_CHAR) FSTARPU_SCHED_CTX_POLICY_MAX_PRIO = & fstarpu_get_constant(C_CHAR_"FSTARPU_SCHED_CTX_POLICY_MAX_PRIO"//C_NULL_CHAR) FSTARPU_SCHED_CTX_HIERARCHY_LEVEL = & fstarpu_get_constant(C_CHAR_"FSTARPU_SCHED_CTX_HIERARCHY_LEVEL"//C_NULL_CHAR) FSTARPU_SCHED_CTX_NESTED = & fstarpu_get_constant(C_CHAR_"FSTARPU_SCHED_CTX_NESTED"//C_NULL_CHAR) FSTARPU_SCHED_CTX_AWAKE_WORKERS = & fstarpu_get_constant(C_CHAR_"FSTARPU_SCHED_CTX_AWAKE_WORKERS"//C_NULL_CHAR) FSTARPU_NOWHERE = & fstarpu_get_constant(C_CHAR_"FSTARPU_NOWHERE"//C_NULL_CHAR) FSTARPU_CPU = & fstarpu_get_constant(C_CHAR_"FSTARPU_CPU"//C_NULL_CHAR) FSTARPU_CUDA = & fstarpu_get_constant(C_CHAR_"FSTARPU_CUDA"//C_NULL_CHAR) FSTARPU_OPENCL = & fstarpu_get_constant(C_CHAR_"FSTARPU_OPENCL"//C_NULL_CHAR) FSTARPU_MIC = & fstarpu_get_constant(C_CHAR_"FSTARPU_MIC"//C_NULL_CHAR) FSTARPU_SCC = & fstarpu_get_constant(C_CHAR_"FSTARPU_SCC"//C_NULL_CHAR) FSTARPU_CODELET_SIMGRID_EXECUTE = & fstarpu_get_constant(C_CHAR_"FSTARPU_CODELET_SIMGRID_EXECUTE"//C_NULL_CHAR) FSTARPU_CUDA_ASYNC = & fstarpu_get_constant(C_CHAR_"FSTARPU_CUDA_ASYNC"//C_NULL_CHAR) FSTARPU_OPENCL_ASYNC = & fstarpu_get_constant(C_CHAR_"FSTARPU_OPENCL_ASYNC"//C_NULL_CHAR) ! Initialize size constants as 'c_ptr' FSTARPU_SZ_C_DOUBLE = sz_to_p(c_sizeof(FSTARPU_SZ_C_DOUBLE_dummy)) FSTARPU_SZ_C_FLOAT = sz_to_p(c_sizeof(FSTARPU_SZ_C_FLOAT_dummy)) FSTARPU_SZ_C_CHAR = sz_to_p(c_sizeof(FSTARPU_SZ_C_CHAR_dummy)) FSTARPU_SZ_C_INT = sz_to_p(c_sizeof(FSTARPU_SZ_C_INT_dummy)) FSTARPU_SZ_C_INTPTR_T = sz_to_p(c_sizeof(FSTARPU_SZ_C_INTPTR_T_dummy)) FSTARPU_SZ_C_PTR = sz_to_p(c_sizeof(FSTARPU_SZ_C_PTR_dummy)) FSTARPU_SZ_C_SIZE_T = sz_to_p(c_sizeof(FSTARPU_SZ_C_SIZE_T_dummy)) FSTARPU_SZ_CHARACTER = sz_to_p(c_sizeof(FSTARPU_SZ_CHARACTER_dummy)) FSTARPU_SZ_INTEGER = sz_to_p(c_sizeof(FSTARPU_SZ_INTEGER_dummy)) FSTARPU_SZ_INT4 = sz_to_p(c_sizeof(FSTARPU_SZ_INT4_dummy)) FSTARPU_SZ_INT8 = sz_to_p(c_sizeof(FSTARPU_SZ_INT8_dummy)) FSTARPU_SZ_REAL = sz_to_p(c_sizeof(FSTARPU_SZ_REAL_dummy)) FSTARPU_SZ_REAL4 = sz_to_p(c_sizeof(FSTARPU_SZ_REAL4_dummy)) FSTARPU_SZ_REAL8 = sz_to_p(c_sizeof(FSTARPU_SZ_REAL8_dummy)) FSTARPU_SZ_DOUBLE_PRECISION = sz_to_p(c_sizeof(FSTARPU_SZ_DOUBLE_PRECISION_dummy)) FSTARPU_SZ_COMPLEX = sz_to_p(c_sizeof(FSTARPU_SZ_COMPLEX_dummy)) FSTARPU_SZ_COMPLEX4 = sz_to_p(c_sizeof(FSTARPU_SZ_COMPLEX4_dummy)) FSTARPU_SZ_COMPLEX8 = sz_to_p(c_sizeof(FSTARPU_SZ_COMPLEX8_dummy)) ! Initialize StarPU if (c_associated(conf)) then fstarpu_init = fstarpu_init_internal(conf) else fstarpu_init = fstarpu_init_internal(C_NULL_PTR) end if end function fstarpu_init function fstarpu_csizet_to_cptr(i) bind(C) use iso_c_binding type(c_ptr) :: fstarpu_csizet_to_cptr integer(c_size_t) :: i fstarpu_csizet_to_cptr = transfer(int(i,kind=c_intptr_t),C_NULL_PTR) end function fstarpu_csizet_to_cptr function fstarpu_int_to_cptr(i) bind(C) use iso_c_binding type(c_ptr) :: fstarpu_int_to_cptr integer :: i fstarpu_int_to_cptr = transfer(int(i,kind=c_intptr_t),C_NULL_PTR) end function fstarpu_int_to_cptr end module fstarpu_mod starpu-1.2.3+dfsg/include/pthread_win32/000077500000000000000000000000001320135501600200425ustar00rootroot00000000000000starpu-1.2.3+dfsg/include/pthread_win32/pthread.h000066400000000000000000000273701320135501600216530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2017 Université Bordeaux * Copyright (C) 2010, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* This is a minimal pthread implementation based on windows functions. * It is *not* intended to be complete - just complete enough to get * StarPU running. */ #ifndef __STARPU_PTHREAD_H__ #define __STARPU_PTHREAD_H__ /* TODO: * pthread_rwlock_* * pthread_spinlock_* */ #include #include #include #ifndef STARPU_CONFIGURE # include #endif #ifdef STARPU_HAVE_UNISTD_H #include #endif #include #include #include #ifdef __CYGWIN32__ #include #define unixErrno() cygwin_internal(CW_GET_ERRNO_FROM_WINERROR, (GetLastError()) #else #define unixErrno() EIO #endif #if 0 #define setSystemErrno() do { fprintf(stderr,"%s:%d: win %d\n", __FILE__, __LINE__, GetLastError()); errno = unixErrno(); } while (0) #define winPthreadAssertWindows(expr) do { if (!(expr)) { fprintf(stderr,"%s:%d: %d\n", __FILE__, __LINE__, unixErrno()); return unixErrno(); } } while (0) #define winPthreadAssertPthread(expr) do { int ret = (expr); if (ret) { fprintf(stderr,"%s:%d: %d\n", __FILE__, __LINE__, ret); return ret; } } while (0) #define winPthreadAssert(expr) do { if (!(expr)) { fprintf(stderr,"%s:%d: %d\n", __FILE__, __LINE__, errno); return EIO; } } while (0) #else #define setSystemErrno() errno = unixErrno() #define winPthreadAssertWindows(expr) do { if (!(expr)) { return unixErrno(); } } while (0) #define winPthreadAssertPthread(expr) do { int ret = (expr); if (ret) return ret; } while (0) #define winPthreadAssert(expr) do { if (!(expr)) return EIO; } while (0) #endif #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /*********** * threads * ***********/ typedef DWORD pthread_attr_t; typedef HANDLE pthread_t; static __inline pthread_t pthread_self(void) { return GetCurrentThread(); } static __inline int pthread_equal(pthread_t t1, pthread_t t2) { return t1 == t2; } static __inline int pthread_attr_init (pthread_attr_t *attr) { *attr = 0; return 0; } #define PTHREAD_CREATE_DETACHED 1 static __inline int pthread_attr_setdetachstate (pthread_attr_t *attr, int yes) { (void)attr; (void)yes; /* not supported, ignore */ return 0; } static __inline int pthread_attr_setstacksize (pthread_attr_t *attr, size_t stacksize) { (void)attr; (void)stacksize; /* not supported, ignore */ return 0; } static __inline int pthread_attr_destroy (pthread_attr_t *attr) { (void)attr; return 0; } /* "real" cleanup handling not yet implemented */ typedef struct { void (*routine) (void *); void *arg; } __pthread_cleanup_handler; void pthread_cleanup_push (void (*routine) (void *), void *arg); #define pthread_cleanup_push(routine, arg) do { \ __pthread_cleanup_handler __cleanup_handler = {routine, arg}; void pthread_cleanup_pop (int execute); #define pthread_cleanup_pop(execute) \ if (execute) __cleanup_handler.routine(__cleanup_handler.arg); \ } while (0); static __inline int pthread_create ( pthread_t *thread, const pthread_attr_t *attr, void * (*fun) (void *), void *arg ) { if (attr && *attr) return EINVAL; winPthreadAssertWindows(*thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) fun, arg, 0, NULL)); return 0; } static __inline int pthread_setcancelstate (int state, int *oldstate) { (void)state; (void)oldstate; /* not yet implemented :( */ return 0; } static __inline int pthread_cancel (pthread_t thread) { /* This is quite harsh :( */ winPthreadAssertWindows(TerminateThread(thread, 0)); return 0; } static __inline void pthread_exit (void *res) { ExitThread((DWORD) (DWORD_PTR) res); } static __inline int pthread_join (pthread_t thread, void **res) { again: switch (WaitForSingleObject(thread, INFINITE)) { default: case WAIT_FAILED: return unixErrno(); case WAIT_ABANDONED: case WAIT_OBJECT_0: break; case WAIT_TIMEOUT: goto again; } if (res) { DWORD _res; if (GetExitCodeThread(thread, &_res)) *res = (void *)(DWORD_PTR)_res; } return 0; } /*********** * mutexes * ***********/ #define PTHREAD_MUTEX_INITIALIZER NULL typedef HANDLE pthread_mutex_t; #define PTHREAD_MUTEX_RECURSIVE 1 #define PTHREAD_MUTEX_ERRORCHECK 2 typedef int pthread_mutexattr_t; static __inline int pthread_mutexattr_init(pthread_mutexattr_t *attr) { *attr = PTHREAD_MUTEX_ERRORCHECK; return 0; } static __inline int pthread_mutexattr_destroy(pthread_mutexattr_t *attr) { *attr = -1; return 0; } static __inline int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type) { if (type != PTHREAD_MUTEX_RECURSIVE && type != PTHREAD_MUTEX_ERRORCHECK) return EINVAL; *attr = type; return 0; } static __inline int pthread_mutex_init (pthread_mutex_t *mutex, pthread_mutexattr_t *attr) { if (attr && *attr!=PTHREAD_MUTEX_ERRORCHECK) return EINVAL; winPthreadAssertWindows(*mutex = CreateSemaphore(NULL, 1, 1, NULL)); return 0; } static __inline int pthread_mutex_unlock (pthread_mutex_t *mutex) { winPthreadAssertWindows(ReleaseSemaphore(*mutex, 1, NULL)); return 0; } static __inline int pthread_mutex_lock (pthread_mutex_t *mutex); static __inline int __pthread_mutex_alloc_concurrently (pthread_mutex_t *mutex) { HANDLE mutex_init_mutex; /* Get access to one global named mutex to serialize mutex initialization */ winPthreadAssertWindows((mutex_init_mutex = CreateSemaphore(NULL, 1, 1, "StarPU mutex init"))); winPthreadAssertPthread(pthread_mutex_lock(&mutex_init_mutex)); /* Now we are the one that can initialize it */ if (!*mutex) winPthreadAssertPthread(pthread_mutex_init(mutex,NULL)); winPthreadAssertPthread(pthread_mutex_unlock(&mutex_init_mutex)); winPthreadAssertWindows(CloseHandle(mutex_init_mutex)); return 0; } static __inline int pthread_mutex_lock (pthread_mutex_t *mutex) { if (!*mutex) __pthread_mutex_alloc_concurrently (mutex); again: switch (WaitForSingleObject(*mutex, INFINITE)) { default: case WAIT_FAILED: return unixErrno(); case WAIT_ABANDONED: case WAIT_OBJECT_0: return 0; case WAIT_TIMEOUT: goto again; } } static __inline int pthread_mutex_trylock (pthread_mutex_t *mutex) { if (!*mutex) __pthread_mutex_alloc_concurrently (mutex); switch (WaitForSingleObject(*mutex, 0)) { default: case WAIT_FAILED: return unixErrno(); case WAIT_ABANDONED: case WAIT_OBJECT_0: return 0; case WAIT_TIMEOUT: return EBUSY; } } static __inline int pthread_mutex_destroy (pthread_mutex_t *mutex) { winPthreadAssertWindows(CloseHandle(*mutex)); *mutex = INVALID_HANDLE_VALUE; return 0; } /******************************************** * rwlock * * VERY LAZY, don't even look at it please! * * Should be fine unoptimized for now. * * TODO: FIXME, using conds for instance? * ********************************************/ #define PTHREAD_RWLOCK_INITIALIZER NULL typedef pthread_mutex_t pthread_rwlock_t; typedef int pthread_rwlockattr_t; #define pthread_rwlock_init(lock, attr) pthread_mutex_init(lock, NULL) #define pthread_rwlock_wrlock(lock) pthread_mutex_lock(lock) #define pthread_rwlock_trywrlock(lock) pthread_mutex_trylock(lock) #define pthread_rwlock_rdlock(lock) pthread_mutex_lock(lock) #define pthread_rwlock_tryrdlock(lock) pthread_mutex_trylock(lock) #define pthread_rwlock_unlock(lock) pthread_mutex_unlock(lock) #define pthread_rwlock_destroy(lock) pthread_mutex_destroy(lock) /************** * conditions * **************/ typedef struct { HANDLE sem; volatile unsigned nbwait; } pthread_cond_t; #define PTHREAD_COND_INITIALIZER { NULL, 0} #if !defined(STARPU_HAVE_STRUCT_TIMESPEC) || defined(_MSC_VER) #ifndef STARPU_TIMESPEC_DEFINED #define STARPU_TIMESPEC_DEFINED 1 struct timespec { time_t tv_sec; /* Seconds */ long tv_nsec; /* Nanoseconds */ }; #endif /* STARPU_TIMESPEC_DEFINED */ #endif /* STARPU_HAVE_STRUCT_TIMESPEC */ typedef unsigned pthread_condattr_t; static __inline int pthread_cond_init (pthread_cond_t *cond, const pthread_condattr_t *attr) { if (attr) return EINVAL; winPthreadAssertWindows(cond->sem = CreateSemaphore(NULL, 0, MAXLONG, NULL)); cond->nbwait = 0; return 0; } static __inline int pthread_cond_timedwait (pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *time) { if (!cond->sem) winPthreadAssertPthread(pthread_cond_init(cond,NULL)); cond->nbwait++; winPthreadAssertPthread(pthread_mutex_unlock(mutex)); again: switch (WaitForSingleObject(cond->sem, time->tv_sec*1000+time->tv_nsec/1000)) { default: case WAIT_FAILED: { int error = unixErrno(); winPthreadAssertPthread(pthread_mutex_lock(mutex)); return error; } case WAIT_TIMEOUT: goto again; case WAIT_ABANDONED: case WAIT_OBJECT_0: break; } winPthreadAssertPthread(pthread_mutex_lock(mutex)); cond->nbwait--; return 0; } static __inline int pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex) { if (!cond->sem) winPthreadAssertPthread(pthread_cond_init(cond,NULL)); cond->nbwait++; winPthreadAssertPthread(pthread_mutex_unlock(mutex)); again: switch (WaitForSingleObject(cond->sem, INFINITE)) { case WAIT_FAILED: { int error; error = unixErrno(); winPthreadAssertPthread(pthread_mutex_lock(mutex)); return error; } case WAIT_TIMEOUT: goto again; case WAIT_ABANDONED: case WAIT_OBJECT_0: break; } winPthreadAssertPthread(pthread_mutex_lock(mutex)); cond->nbwait--; return 0; } static __inline int pthread_cond_signal (pthread_cond_t *cond) { if (!cond->sem) winPthreadAssertPthread(pthread_cond_init(cond,NULL)); if (cond->nbwait) ReleaseSemaphore(cond->sem, 1, NULL); return 0; } static __inline int pthread_cond_broadcast (pthread_cond_t *cond) { if (!cond->sem) winPthreadAssertPthread(pthread_cond_init(cond,NULL)); ReleaseSemaphore(cond->sem, cond->nbwait, NULL); return 0; } static __inline int pthread_cond_destroy (pthread_cond_t *cond) { if (cond->sem) { winPthreadAssertWindows(CloseHandle(cond->sem)); cond->sem = NULL; } return 0; } /******* * TLS * *******/ typedef DWORD pthread_key_t; #define PTHREAD_ONCE_INIT {PTHREAD_MUTEX_INITIALIZER, 0} typedef struct { pthread_mutex_t mutex; unsigned done; } pthread_once_t; static __inline int pthread_once (pthread_once_t *once, void (*oncefun)(void)) { winPthreadAssertPthread(pthread_mutex_lock(&once->mutex)); if (!once->done) { oncefun(); once->done = 1; } winPthreadAssertPthread(pthread_mutex_unlock(&once->mutex)); return 0; } static __inline int pthread_key_create (pthread_key_t *key, void (*freefun)(void *)) { (void)freefun; pthread_key_t res; winPthreadAssertWindows((res = TlsAlloc()) != 0xFFFFFFFF); *key = res; return 0; } static __inline int pthread_key_delete (pthread_key_t key) { winPthreadAssertWindows(TlsFree(key)); return 0; } static __inline void *pthread_getspecific (pthread_key_t key) { return TlsGetValue(key); } static __inline int pthread_setspecific (pthread_key_t key, const void *data) { winPthreadAssertWindows(TlsSetValue(key, (LPVOID) data)); return 0; } #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __STARPU_PTHREAD_H__ */ starpu-1.2.3+dfsg/include/pthread_win32/semaphore.h000066400000000000000000000035061320135501600222020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* This is a minimal pthread implementation based on windows functions. * It is *not* intended to be complete - just complete enough to get * StarPU running. */ #ifndef __STARPU_SEMAPHORE_H__ #define __STARPU_SEMAPHORE_H__ #include "pthread.h" /************** * semaphores * **************/ typedef HANDLE sem_t; static __inline int sem_init(sem_t *sem, int pshared, unsigned int value) { (void)pshared; winPthreadAssertWindows(*sem = CreateSemaphore(NULL, value, MAXLONG, NULL)); return 0; } static __inline int do_sem_wait(sem_t *sem, DWORD timeout) { switch (WaitForSingleObject(*sem, timeout)) { default: case WAIT_FAILED: setSystemErrno(); return -1; case WAIT_TIMEOUT: errno = EAGAIN; return -1; case WAIT_ABANDONED: case WAIT_OBJECT_0: return 0; } } #define sem_wait(sem) do_sem_wait(sem, INFINITE) #define sem_trywait(sem) do_sem_wait(sem, 0) static __inline int sem_post(sem_t *sem) { winPthreadAssertWindows(ReleaseSemaphore(*sem, 1, NULL)); return 0; } static __inline int sem_destroy(sem_t *sem) { winPthreadAssertWindows(CloseHandle(*sem)); return 0; } #endif /* __STARPU_SEMAPHORE_H__ */ starpu-1.2.3+dfsg/include/starpu.h000066400000000000000000000074721320135501600170720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2014, 2016 Université de Bordeaux * Copyright (C) 2010-2014 CNRS * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_H__ #define __STARPU_H__ #include #ifndef _MSC_VER #include #else #include typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; typedef unsigned long long uint64_t; typedef UINT_PTR uintptr_t; #endif #include #ifdef STARPU_HAVE_WINDOWS #include #endif #if defined(STARPU_USE_OPENCL) && !defined(__CUDACC__) #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif struct starpu_conf { int magic; const char *sched_policy_name; struct starpu_sched_policy *sched_policy; int ncpus; int ncuda; int nopencl; int nmic; int nscc; unsigned use_explicit_workers_bindid; unsigned workers_bindid[STARPU_NMAXWORKERS]; unsigned use_explicit_workers_cuda_gpuid; unsigned workers_cuda_gpuid[STARPU_NMAXWORKERS]; unsigned use_explicit_workers_opencl_gpuid; unsigned workers_opencl_gpuid[STARPU_NMAXWORKERS]; unsigned use_explicit_workers_mic_deviceid; unsigned workers_mic_deviceid[STARPU_NMAXWORKERS]; unsigned use_explicit_workers_scc_deviceid; unsigned workers_scc_deviceid[STARPU_NMAXWORKERS]; int bus_calibrate; int calibrate; int single_combined_worker; char *mic_sink_program_path; int disable_asynchronous_copy; int disable_asynchronous_cuda_copy; int disable_asynchronous_opencl_copy; int disable_asynchronous_mic_copy; unsigned *cuda_opengl_interoperability; unsigned n_cuda_opengl_interoperability; struct starpu_driver *not_launched_drivers; unsigned n_not_launched_drivers; unsigned trace_buffer_size; int global_sched_ctx_min_priority; int global_sched_ctx_max_priority; }; int starpu_conf_init(struct starpu_conf *conf); int starpu_init(struct starpu_conf *conf) STARPU_WARN_UNUSED_RESULT; int starpu_initialize(struct starpu_conf *user_conf, int *argc, char ***argv); void starpu_pause(void); void starpu_resume(void); void starpu_shutdown(void); void starpu_topology_print(FILE *f); int starpu_asynchronous_copy_disabled(void); int starpu_asynchronous_cuda_copy_disabled(void); int starpu_asynchronous_opencl_copy_disabled(void); int starpu_asynchronous_mic_copy_disabled(void); void starpu_display_stats(); void starpu_get_version(int *major, int *minor, int *release); #ifdef __cplusplus } #endif #include "starpu_deprecated_api.h" #endif /* __STARPU_H__ */ starpu-1.2.3+dfsg/include/starpu_bitmap.h000066400000000000000000000032351320135501600204170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Simon Archipoff * Copyright (C) 2014 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_BITMAP_H__ #define __STARPU_BITMAP_H__ #ifdef __cplusplus extern "C" { #endif struct starpu_bitmap *starpu_bitmap_create(void) STARPU_ATTRIBUTE_MALLOC; void starpu_bitmap_destroy(struct starpu_bitmap *b); void starpu_bitmap_set(struct starpu_bitmap *b, int e); void starpu_bitmap_unset(struct starpu_bitmap *b, int e); void starpu_bitmap_unset_all(struct starpu_bitmap *b); int starpu_bitmap_get(struct starpu_bitmap *b, int e); void starpu_bitmap_unset_and(struct starpu_bitmap *a, struct starpu_bitmap *b, struct starpu_bitmap *c); void starpu_bitmap_or(struct starpu_bitmap *a, struct starpu_bitmap *b); int starpu_bitmap_and_get(struct starpu_bitmap *b1, struct starpu_bitmap *b2, int e); int starpu_bitmap_cardinal(struct starpu_bitmap *b); int starpu_bitmap_first(struct starpu_bitmap *b); int starpu_bitmap_last(struct starpu_bitmap *b); int starpu_bitmap_next(struct starpu_bitmap *b, int e); int starpu_bitmap_has_next(struct starpu_bitmap *b, int e); #ifdef __cplusplus } #endif #endif starpu-1.2.3+dfsg/include/starpu_bound.h000066400000000000000000000022171320135501600202510ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_BOUND_H__ #define __STARPU_BOUND_H__ #include #ifdef __cplusplus extern "C" { #endif void starpu_bound_start(int deps, int prio); void starpu_bound_stop(void); void starpu_bound_print_dot(FILE *output); void starpu_bound_compute(double *res, double *integer_res, int integer); void starpu_bound_print_lp(FILE *output); void starpu_bound_print_mps(FILE *output); void starpu_bound_print(FILE *output, int integer); #ifdef __cplusplus } #endif #endif /* __STARPU_BOUND_H__ */ starpu-1.2.3+dfsg/include/starpu_config.h.in000066400000000000000000000072511320135501600210170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015, 2016, 2017 CNRS * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This is the public config.h file, installed along libstarpu. * * It should only contain the build-time #defines which have an effect on the * API & ABI. */ #ifndef __STARPU_CONFIG_PUBLIC_H__ #define __STARPU_CONFIG_PUBLIC_H__ #undef STARPU_MAJOR_VERSION #undef STARPU_MINOR_VERSION #undef STARPU_RELEASE_VERSION #undef STARPU_USE_CPU #undef STARPU_USE_CUDA #undef STARPU_USE_OPENCL #undef STARPU_USE_MIC #undef STARPU_USE_SCC #undef STARPU_OPENMP #undef STARPU_SIMGRID #undef STARPU_SIMGRID_HAVE_XBT_BARRIER_INIT #undef STARPU_HAVE_SIMGRID_MSG_H #undef STARPU_HAVE_XBT_SYNCHRO_H #undef STARPU_HAVE_VALGRIND_H #undef STARPU_NON_BLOCKING_DRIVERS #undef STARPU_HAVE_ICC #undef STARPU_USE_MPI #undef STARPU_ATLAS #undef STARPU_GOTO #undef STARPU_MKL #undef STARPU_SYSTEM_BLAS #undef STARPU_BUILD_DIR #undef STARPU_OPENCL_DATADIR #undef STARPU_HAVE_MAGMA #undef STARPU_OPENGL_RENDER #undef STARPU_USE_GTK #undef STARPU_HAVE_X11 #undef STARPU_HAVE_POSIX_MEMALIGN #undef STARPU_HAVE_MEMALIGN #undef STARPU_HAVE_MALLOC_H #undef STARPU_HAVE_SYNC_BOOL_COMPARE_AND_SWAP #undef STARPU_HAVE_SYNC_VAL_COMPARE_AND_SWAP #undef STARPU_HAVE_SYNC_FETCH_AND_ADD #undef STARPU_HAVE_SYNC_FETCH_AND_OR #undef STARPU_HAVE_SYNC_LOCK_TEST_AND_SET #undef STARPU_HAVE_SYNC_SYNCHRONIZE #undef STARPU_MODEL_DEBUG #undef STARPU_NO_ASSERT #undef STARPU_DEBUG #undef STARPU_HAVE_FFTW #undef STARPU_HAVE_FFTWF #undef STARPU_HAVE_FFTWL #undef STARPU_HAVE_CURAND #undef STARPU_MAXNODES #undef STARPU_NMAXBUFS #undef STARPU_MAXCPUS #undef STARPU_MAXCUDADEVS #undef STARPU_MAXOPENCLDEVS #undef STARPU_MAXMICDEVS #undef STARPU_MAXSCCDEVS #undef STARPU_NMAXWORKERS #undef STARPU_NMAX_SCHED_CTXS #undef STARPU_MAXIMPLEMENTATIONS #undef STARPU_MAXMPKERNELS #undef STARPU_USE_SC_HYPERVISOR #undef STARPU_SC_HYPERVISOR_DEBUG #undef STARPU_HAVE_GLPK_H #undef STARPU_HAVE_LIBNUMA #undef STARPU_HAVE_WINDOWS #undef STARPU_LINUX_SYS #undef STARPU_HAVE_UNSETENV #undef STARPU_HAVE_UNISTD_H #undef STARPU_FXT_LOCK_TRACES #ifdef _MSC_VER typedef long starpu_ssize_t; #define __starpu_func__ __FUNCTION__ #else # include typedef ssize_t starpu_ssize_t; #define __starpu_func__ __func__ #endif #if defined(c_plusplus) || defined(__cplusplus) /* inline is part of C++ */ # define __starpu_inline inline #elif defined(_MSC_VER) || defined(__HP_cc) # define __starpu_inline __inline #else # define __starpu_inline __inline__ #endif #undef STARPU_QUICK_CHECK #undef STARPU_USE_DRAND48 #undef STARPU_USE_ERAND48_R #undef STARPU_HAVE_NEARBYINTF #undef STARPU_HAVE_RINTF #undef STARPU_USE_TOP #undef STARPU_HAVE_HWLOC #undef STARPU_HAVE_PTHREAD_SPIN_LOCK #undef STARPU_HAVE_PTHREAD_BARRIER #undef STARPU_HAVE_PTHREAD_SETNAME_NP #undef STARPU_HAVE_STRUCT_TIMESPEC /* This is only for building examples */ #undef STARPU_HAVE_HELGRIND_H /* Enable Fortran to C MPI interface */ #undef HAVE_MPI_COMM_F2C #undef STARPU_HAVE_DARWIN #undef STARPU_HAVE_STRERROR_R #undef STARPU_HAVE_STATEMENT_EXPRESSIONS #endif starpu-1.2.3+dfsg/include/starpu_cublas.h000066400000000000000000000016421320135501600204140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_CUBLAS_H__ #define __STARPU_CUBLAS_H__ #ifdef __cplusplus extern "C" { #endif void starpu_cublas_init(void); void starpu_cublas_shutdown(void); #ifdef __cplusplus } #endif #endif /* __STARPU_CUBLAS_H__ */ starpu-1.2.3+dfsg/include/starpu_cublas_v2.h000066400000000000000000000020161320135501600210170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012, 2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_CUBLAS_V2_H__ #define __STARPU_CUBLAS_V2_H__ #if defined STARPU_USE_CUDA && !defined STARPU_DONT_INCLUDE_CUDA_HEADERS #include #ifdef __cplusplus extern "C" { #endif cublasHandle_t starpu_cublas_get_local_handle(void); #ifdef __cplusplus } #endif #endif #endif /* __STARPU_CUBLAS_V2_H__ */ starpu-1.2.3+dfsg/include/starpu_cuda.h000066400000000000000000000035171320135501600200620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012, 2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_CUDA_H__ #define __STARPU_CUDA_H__ #include #if defined STARPU_USE_CUDA && !defined STARPU_DONT_INCLUDE_CUDA_HEADERS #include #include #include #ifdef __cplusplus extern "C" { #endif void starpu_cublas_report_error(const char *func, const char *file, int line, int status); #define STARPU_CUBLAS_REPORT_ERROR(status) \ starpu_cublas_report_error(__starpu_func__, __FILE__, __LINE__, status) void starpu_cuda_report_error(const char *func, const char *file, int line, cudaError_t status); #define STARPU_CUDA_REPORT_ERROR(status) \ starpu_cuda_report_error(__starpu_func__, __FILE__, __LINE__, status) cudaStream_t starpu_cuda_get_local_stream(void); const struct cudaDeviceProp *starpu_cuda_get_device_properties(unsigned workerid); int starpu_cuda_copy_async_sync(void *src_ptr, unsigned src_node, void *dst_ptr, unsigned dst_node, size_t ssize, cudaStream_t stream, enum cudaMemcpyKind kind); void starpu_cuda_set_device(unsigned devid); #ifdef __cplusplus } #endif #endif /* STARPU_USE_CUDA && !STARPU_DONT_INCLUDE_CUDA_HEADERS */ #endif /* __STARPU_CUDA_H__ */ starpu-1.2.3+dfsg/include/starpu_cusparse.h000066400000000000000000000022431320135501600207660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012, 2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_CUSPARSE_H__ #define __STARPU_CUSPARSE_H__ #if defined STARPU_USE_CUDA && !defined STARPU_DONT_INCLUDE_CUDA_HEADERS #include #endif #ifdef __cplusplus extern "C" { #endif void starpu_cusparse_init(void); void starpu_cusparse_shutdown(void); #if defined STARPU_USE_CUDA && !defined STARPU_DONT_INCLUDE_CUDA_HEADERS cusparseHandle_t starpu_cusparse_get_local_handle(void); #endif #ifdef __cplusplus } #endif #endif /* __STARPU_CUSPARSE_H__ */ starpu-1.2.3+dfsg/include/starpu_data.h000066400000000000000000000143411320135501600200540ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015 CNRS * Copyright (C) 2016 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_DATA_H__ #define __STARPU_DATA_H__ #include #ifdef __cplusplus extern "C" { #endif struct _starpu_data_state; typedef struct _starpu_data_state* starpu_data_handle_t; /* Note: when adding a flag here, update _starpu_detect_implicit_data_deps_with_handle */ enum starpu_data_access_mode { STARPU_NONE=0, STARPU_R=(1<<0), STARPU_W=(1<<1), STARPU_RW=(STARPU_R|STARPU_W), STARPU_SCRATCH=(1<<2), STARPU_REDUX=(1<<3), STARPU_COMMUTE=(1<<4), STARPU_SSEND=(1<<5), STARPU_LOCALITY=(1<<6), STARPU_ACCESS_MODE_MAX=(1<<7) /* Note: other STARPU_* values in include/starpu_task_util.h */ }; struct starpu_data_descr { starpu_data_handle_t handle; enum starpu_data_access_mode mode; }; struct starpu_data_interface_ops; void starpu_data_set_name(starpu_data_handle_t handle, const char *name); void starpu_data_set_coordinates_array(starpu_data_handle_t handle, int dimensions, int dims[]); void starpu_data_set_coordinates(starpu_data_handle_t handle, unsigned dimensions, ...); void starpu_data_unregister(starpu_data_handle_t handle); void starpu_data_unregister_no_coherency(starpu_data_handle_t handle); void starpu_data_unregister_submit(starpu_data_handle_t handle); void starpu_data_invalidate(starpu_data_handle_t handle); void starpu_data_invalidate_submit(starpu_data_handle_t handle); void starpu_data_advise_as_important(starpu_data_handle_t handle, unsigned is_important); #define STARPU_ACQUIRE_NO_NODE -1 #define STARPU_ACQUIRE_ALL_NODES -2 int starpu_data_acquire(starpu_data_handle_t handle, enum starpu_data_access_mode mode); int starpu_data_acquire_on_node(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode); int starpu_data_acquire_cb(starpu_data_handle_t handle, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg); int starpu_data_acquire_on_node_cb(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg); int starpu_data_acquire_cb_sequential_consistency(starpu_data_handle_t handle, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg, int sequential_consistency); int starpu_data_acquire_on_node_cb_sequential_consistency(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg, int sequential_consistency); int starpu_data_acquire_on_node_cb_sequential_consistency_sync_jobids(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg, int sequential_consistency, long *pre_sync_jobid, long *post_sync_jobid); int starpu_data_acquire_try(starpu_data_handle_t handle, enum starpu_data_access_mode mode); int starpu_data_acquire_on_node_try(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode); #ifdef __GCC__ # define STARPU_DATA_ACQUIRE_CB(handle, mode, code) do \ { \ \ void callback(void *arg) \ { \ code; \ starpu_data_release(handle); \ } \ starpu_data_acquire_cb(handle, mode, callback, NULL); \ } \ while(0) #endif void starpu_data_release(starpu_data_handle_t handle); void starpu_data_release_on_node(starpu_data_handle_t handle, int node); typedef struct starpu_arbiter *starpu_arbiter_t; starpu_arbiter_t starpu_arbiter_create(void) STARPU_ATTRIBUTE_MALLOC; void starpu_data_assign_arbiter(starpu_data_handle_t handle, starpu_arbiter_t arbiter); void starpu_arbiter_destroy(starpu_arbiter_t arbiter); void starpu_data_display_memory_stats(); #define starpu_data_malloc_pinned_if_possible starpu_malloc #define starpu_data_free_pinned_if_possible starpu_free int starpu_data_request_allocation(starpu_data_handle_t handle, unsigned node); int starpu_data_fetch_on_node(starpu_data_handle_t handle, unsigned node, unsigned async); int starpu_data_prefetch_on_node(starpu_data_handle_t handle, unsigned node, unsigned async); int starpu_data_idle_prefetch_on_node(starpu_data_handle_t handle, unsigned node, unsigned async); void starpu_data_wont_use(starpu_data_handle_t handle); #define STARPU_MAIN_RAM 0 enum starpu_node_kind { STARPU_UNUSED = 0x00, STARPU_CPU_RAM = 0x01, STARPU_CUDA_RAM = 0x02, STARPU_OPENCL_RAM = 0x03, STARPU_DISK_RAM = 0x04, STARPU_MIC_RAM = 0x05, STARPU_SCC_RAM = 0x06, STARPU_SCC_SHM = 0x07 }; unsigned starpu_worker_get_memory_node(unsigned workerid); unsigned starpu_memory_nodes_get_count(void); enum starpu_node_kind starpu_node_get_kind(unsigned node); void starpu_data_set_wt_mask(starpu_data_handle_t handle, uint32_t wt_mask); void starpu_data_set_sequential_consistency_flag(starpu_data_handle_t handle, unsigned flag); unsigned starpu_data_get_sequential_consistency_flag(starpu_data_handle_t handle); unsigned starpu_data_get_default_sequential_consistency_flag(void); void starpu_data_set_default_sequential_consistency_flag(unsigned flag); void starpu_data_query_status(starpu_data_handle_t handle, int memory_node, int *is_allocated, int *is_valid, int *is_requested); struct starpu_codelet; void starpu_data_set_reduction_methods(starpu_data_handle_t handle, struct starpu_codelet *redux_cl, struct starpu_codelet *init_cl); struct starpu_data_interface_ops* starpu_data_get_interface_ops(starpu_data_handle_t handle); unsigned starpu_data_test_if_allocated_on_node(starpu_data_handle_t handle, unsigned memory_node); void starpu_memchunk_tidy(unsigned memory_node); void starpu_data_set_user_data(starpu_data_handle_t handle, void* user_data); void *starpu_data_get_user_data(starpu_data_handle_t handle); #ifdef __cplusplus } #endif #endif /* __STARPU_DATA_H__ */ starpu-1.2.3+dfsg/include/starpu_data_filters.h000066400000000000000000000126621320135501600216100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012, 2015, 2017 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_DATA_FILTERS_H__ #define __STARPU_DATA_FILTERS_H__ #include #include #ifdef __cplusplus extern "C" { #endif struct starpu_data_interface_ops; struct starpu_data_filter { void (*filter_func)(void *father_interface, void *child_interface, struct starpu_data_filter *, unsigned id, unsigned nparts); unsigned nchildren; unsigned (*get_nchildren)(struct starpu_data_filter *, starpu_data_handle_t initial_handle); struct starpu_data_interface_ops *(*get_child_ops)(struct starpu_data_filter *, unsigned id); unsigned filter_arg; void *filter_arg_ptr; }; void starpu_data_partition(starpu_data_handle_t initial_handle, struct starpu_data_filter *f); void starpu_data_unpartition(starpu_data_handle_t root_data, unsigned gathering_node); void starpu_data_partition_plan(starpu_data_handle_t initial_handle, struct starpu_data_filter *f, starpu_data_handle_t *children); void starpu_data_partition_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children); void starpu_data_partition_readonly_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children); void starpu_data_partition_readwrite_upgrade_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children); void starpu_data_unpartition_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int gathering_node); void starpu_data_unpartition_readonly_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int gathering_node); void starpu_data_partition_clean(starpu_data_handle_t root_data, unsigned nparts, starpu_data_handle_t *children); int starpu_data_get_nb_children(starpu_data_handle_t handle); starpu_data_handle_t starpu_data_get_child(starpu_data_handle_t handle, unsigned i); starpu_data_handle_t starpu_data_get_sub_data(starpu_data_handle_t root_data, unsigned depth, ... ); starpu_data_handle_t starpu_data_vget_sub_data(starpu_data_handle_t root_data, unsigned depth, va_list pa); void starpu_data_map_filters(starpu_data_handle_t root_data, unsigned nfilters, ...); void starpu_data_vmap_filters(starpu_data_handle_t root_data, unsigned nfilters, va_list pa); void starpu_bcsr_filter_canonical_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); void starpu_csr_filter_vertical_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); void starpu_matrix_filter_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); void starpu_matrix_filter_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); void starpu_matrix_filter_vertical_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); void starpu_matrix_filter_vertical_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); void starpu_vector_filter_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); void starpu_vector_filter_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); void starpu_vector_filter_list_long(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); void starpu_vector_filter_list(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); void starpu_vector_filter_divide_in_2(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); void starpu_block_filter_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); void starpu_block_filter_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); void starpu_block_filter_vertical_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); void starpu_block_filter_vertical_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); void starpu_block_filter_depth_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); void starpu_block_filter_depth_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); #ifdef __cplusplus } #endif #endif starpu-1.2.3+dfsg/include/starpu_data_interfaces.h000066400000000000000000000603211320135501600222560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2016 Université de Bordeaux * Copyright (C) 2010-2014, 2017 CNRS * Copyright (C) 2011-2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_DATA_INTERFACES_H__ #define __STARPU_DATA_INTERFACES_H__ #include #ifdef STARPU_USE_CUDA /* to use CUDA streams */ # ifdef STARPU_DONT_INCLUDE_CUDA_HEADERS typedef void *starpu_cudaStream_t; # else # include typedef cudaStream_t starpu_cudaStream_t; # endif #endif #ifdef __cplusplus extern "C" { #endif struct starpu_data_copy_methods { int (*can_copy)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, unsigned handling_node); int (*ram_to_ram)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node); int (*ram_to_cuda)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node); int (*ram_to_opencl)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node); int (*ram_to_mic)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node); int (*cuda_to_ram)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node); int (*cuda_to_cuda)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node); int (*cuda_to_opencl)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node); int (*opencl_to_ram)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node); int (*opencl_to_cuda)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node); int (*opencl_to_opencl)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node); int (*mic_to_ram)(void *src_interface, unsigned srd_node, void *dst_interface, unsigned dst_node); int (*scc_src_to_sink)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node); int (*scc_sink_to_src)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node); int (*scc_sink_to_sink)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node); #ifdef STARPU_USE_CUDA int (*ram_to_cuda_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, starpu_cudaStream_t stream); int (*cuda_to_ram_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, starpu_cudaStream_t stream); int (*cuda_to_cuda_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, starpu_cudaStream_t stream); #else int (*ram_to_cuda_async)(); int (*cuda_to_ram_async)(); int (*cuda_to_cuda_async)(); #endif #if defined(STARPU_USE_OPENCL) && !defined(__CUDACC__) int (*ram_to_opencl_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event); int (*opencl_to_ram_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event); int (*opencl_to_opencl_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event); #else int (*ram_to_opencl_async)(); int (*opencl_to_ram_async)(); int (*opencl_to_opencl_async)(); #endif int (*ram_to_mic_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node); int (*mic_to_ram_async)(void *src_interface, unsigned srd_node, void *dst_interface, unsigned dst_node); int (*any_to_any)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data); }; int starpu_interface_copy(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, void *async_data); uintptr_t starpu_malloc_on_node_flags(unsigned dst_node, size_t size, int flags); uintptr_t starpu_malloc_on_node(unsigned dst_node, size_t size); void starpu_free_on_node_flags(unsigned dst_node, uintptr_t addr, size_t size, int flags); void starpu_free_on_node(unsigned dst_node, uintptr_t addr, size_t size); void starpu_malloc_on_node_set_default_flags(unsigned node, int flags); enum starpu_data_interface_id { STARPU_UNKNOWN_INTERFACE_ID = -1, STARPU_MATRIX_INTERFACE_ID=0, STARPU_BLOCK_INTERFACE_ID=1, STARPU_VECTOR_INTERFACE_ID=2, STARPU_CSR_INTERFACE_ID=3, STARPU_BCSR_INTERFACE_ID=4, STARPU_VARIABLE_INTERFACE_ID=5, STARPU_VOID_INTERFACE_ID=6, STARPU_MULTIFORMAT_INTERFACE_ID=7, STARPU_COO_INTERFACE_ID=8, STARPU_MAX_INTERFACE_ID=9 }; struct starpu_data_interface_ops { void (*register_data_handle) (starpu_data_handle_t handle, unsigned home_node, void *data_interface); starpu_ssize_t (*allocate_data_on_node) (void *data_interface, unsigned node); void (*free_data_on_node) (void *data_interface, unsigned node); const struct starpu_data_copy_methods *copy_methods; void * (*handle_to_pointer) (starpu_data_handle_t handle, unsigned node); size_t (*get_size) (starpu_data_handle_t handle); uint32_t (*footprint) (starpu_data_handle_t handle); int (*compare) (void *data_interface_a, void *data_interface_b); void (*display) (starpu_data_handle_t handle, FILE *f); starpu_ssize_t (*describe) (void *data_interface, char *buf, size_t size); enum starpu_data_interface_id interfaceid; size_t interface_size; char is_multiformat; char dontcache; struct starpu_multiformat_data_interface_ops* (*get_mf_ops)(void *data_interface); int (*pack_data) (starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count); int (*unpack_data) (starpu_data_handle_t handle, unsigned node, void *ptr, size_t count); char *name; }; int starpu_data_interface_get_next_id(void); void starpu_data_register(starpu_data_handle_t *handleptr, int home_node, void *data_interface, struct starpu_data_interface_ops *ops); void starpu_data_ptr_register(starpu_data_handle_t handle, unsigned node); void starpu_data_register_same(starpu_data_handle_t *handledst, starpu_data_handle_t handlesrc); void *starpu_data_handle_to_pointer(starpu_data_handle_t handle, unsigned node); void *starpu_data_get_local_ptr(starpu_data_handle_t handle); void *starpu_data_get_interface_on_node(starpu_data_handle_t handle, unsigned memory_node); extern struct starpu_data_interface_ops starpu_interface_matrix_ops; struct starpu_matrix_interface { enum starpu_data_interface_id id; uintptr_t ptr; uintptr_t dev_handle; size_t offset; uint32_t nx; uint32_t ny; uint32_t ld; size_t elemsize; }; void starpu_matrix_data_register(starpu_data_handle_t *handle, int home_node, uintptr_t ptr, uint32_t ld, uint32_t nx, uint32_t ny, size_t elemsize); void starpu_matrix_ptr_register(starpu_data_handle_t handle, unsigned node, uintptr_t ptr, uintptr_t dev_handle, size_t offset, uint32_t ld); uint32_t starpu_matrix_get_nx(starpu_data_handle_t handle); uint32_t starpu_matrix_get_ny(starpu_data_handle_t handle); uint32_t starpu_matrix_get_local_ld(starpu_data_handle_t handle); uintptr_t starpu_matrix_get_local_ptr(starpu_data_handle_t handle); size_t starpu_matrix_get_elemsize(starpu_data_handle_t handle); #if defined(STARPU_HAVE_STATEMENT_EXPRESSIONS) && defined(STARPU_DEBUG) #define STARPU_MATRIX_CHECK(interface) STARPU_ASSERT_MSG((((struct starpu_matrix_interface *)(interface))->id) == STARPU_MATRIX_INTERFACE_ID, "Error. The given data is not a matrix.") #define STARPU_MATRIX_GET_PTR(interface) ({ STARPU_MATRIX_CHECK(interface); (((struct starpu_matrix_interface *)(interface))->ptr) ; }) #define STARPU_MATRIX_GET_DEV_HANDLE(interface) ({ STARPU_MATRIX_CHECK(interface); (((struct starpu_matrix_interface *)(interface))->dev_handle) ; }) #define STARPU_MATRIX_GET_OFFSET(interface) ({ STARPU_MATRIX_CHECK(interface); (((struct starpu_matrix_interface *)(interface))->offset) ; }) #define STARPU_MATRIX_GET_NX(interface) ({ STARPU_MATRIX_CHECK(interface); (((struct starpu_matrix_interface *)(interface))->nx) ; }) #define STARPU_MATRIX_GET_NY(interface) ({ STARPU_MATRIX_CHECK(interface); (((struct starpu_matrix_interface *)(interface))->ny) ; }) #define STARPU_MATRIX_GET_LD(interface) ({ STARPU_MATRIX_CHECK(interface); (((struct starpu_matrix_interface *)(interface))->ld) ; }) #define STARPU_MATRIX_GET_ELEMSIZE(interface) ({ STARPU_MATRIX_CHECK(interface); (((struct starpu_matrix_interface *)(interface))->elemsize) ; }) #else #define STARPU_MATRIX_GET_PTR(interface) (((struct starpu_matrix_interface *)(interface))->ptr) #define STARPU_MATRIX_GET_DEV_HANDLE(interface) (((struct starpu_matrix_interface *)(interface))->dev_handle) #define STARPU_MATRIX_GET_OFFSET(interface) (((struct starpu_matrix_interface *)(interface))->offset) #define STARPU_MATRIX_GET_NX(interface) (((struct starpu_matrix_interface *)(interface))->nx) #define STARPU_MATRIX_GET_NY(interface) (((struct starpu_matrix_interface *)(interface))->ny) #define STARPU_MATRIX_GET_LD(interface) (((struct starpu_matrix_interface *)(interface))->ld) #define STARPU_MATRIX_GET_ELEMSIZE(interface) (((struct starpu_matrix_interface *)(interface))->elemsize) #endif extern struct starpu_data_interface_ops starpu_interface_coo_ops; struct starpu_coo_interface { enum starpu_data_interface_id id; uint32_t *columns; uint32_t *rows; uintptr_t values; uint32_t nx; uint32_t ny; uint32_t n_values; size_t elemsize; }; void starpu_coo_data_register(starpu_data_handle_t *handleptr, int home_node, uint32_t nx, uint32_t ny, uint32_t n_values, uint32_t *columns, uint32_t *rows, uintptr_t values, size_t elemsize); #define STARPU_COO_GET_COLUMNS(interface) \ (((struct starpu_coo_interface *)(interface))->columns) #define STARPU_COO_GET_COLUMNS_DEV_HANDLE(interface) \ (((struct starpu_coo_interface *)(interface))->columns) #define STARPU_COO_GET_ROWS(interface) \ (((struct starpu_coo_interface *)(interface))->rows) #define STARPU_COO_GET_ROWS_DEV_HANDLE(interface) \ (((struct starpu_coo_interface *)(interface))->rows) #define STARPU_COO_GET_VALUES(interface) \ (((struct starpu_coo_interface *)(interface))->values) #define STARPU_COO_GET_VALUES_DEV_HANDLE(interface) \ (((struct starpu_coo_interface *)(interface))->values) #define STARPU_COO_GET_OFFSET 0 #define STARPU_COO_GET_NX(interface) \ (((struct starpu_coo_interface *)(interface))->nx) #define STARPU_COO_GET_NY(interface) \ (((struct starpu_coo_interface *)(interface))->ny) #define STARPU_COO_GET_NVALUES(interface) \ (((struct starpu_coo_interface *)(interface))->n_values) #define STARPU_COO_GET_ELEMSIZE(interface) \ (((struct starpu_coo_interface *)(interface))->elemsize) extern struct starpu_data_interface_ops starpu_interface_block_ops; /* TODO: rename to 3dmatrix? */ struct starpu_block_interface { enum starpu_data_interface_id id; uintptr_t ptr; uintptr_t dev_handle; size_t offset; uint32_t nx; uint32_t ny; uint32_t nz; uint32_t ldy; uint32_t ldz; size_t elemsize; }; void starpu_block_data_register(starpu_data_handle_t *handle, int home_node, uintptr_t ptr, uint32_t ldy, uint32_t ldz, uint32_t nx, uint32_t ny, uint32_t nz, size_t elemsize); void starpu_block_ptr_register(starpu_data_handle_t handle, unsigned node, uintptr_t ptr, uintptr_t dev_handle, size_t offset, uint32_t ldy, uint32_t ldz); uint32_t starpu_block_get_nx(starpu_data_handle_t handle); uint32_t starpu_block_get_ny(starpu_data_handle_t handle); uint32_t starpu_block_get_nz(starpu_data_handle_t handle); uint32_t starpu_block_get_local_ldy(starpu_data_handle_t handle); uint32_t starpu_block_get_local_ldz(starpu_data_handle_t handle); uintptr_t starpu_block_get_local_ptr(starpu_data_handle_t handle); size_t starpu_block_get_elemsize(starpu_data_handle_t handle); #if defined(STARPU_HAVE_STATEMENT_EXPRESSIONS) && defined(STARPU_DEBUG) #define STARPU_BLOCK_CHECK(interface) STARPU_ASSERT_MSG((((struct starpu_block_interface *)(interface))->id) == STARPU_BLOCK_INTERFACE_ID, "Error. The given data is not a block.") #define STARPU_BLOCK_GET_PTR(interface) ({ STARPU_BLOCK_CHECK(interface); (((struct starpu_block_interface *)(interface))->ptr) ; }) #define STARPU_BLOCK_GET_DEV_HANDLE(interface) ({ STARPU_BLOCK_CHECK(interface); (((struct starpu_block_interface *)(interface))->dev_handle) ; }) #define STARPU_BLOCK_GET_OFFSET(interface) ({ STARPU_BLOCK_CHECK(interface); (((struct starpu_block_interface *)(interface))->offset) ; }) #define STARPU_BLOCK_GET_NX(interface) ({ STARPU_BLOCK_CHECK(interface); (((struct starpu_block_interface *)(interface))->nx) ; }) #define STARPU_BLOCK_GET_NY(interface) ({ STARPU_BLOCK_CHECK(interface); (((struct starpu_block_interface *)(interface))->ny) ; }) #define STARPU_BLOCK_GET_NZ(interface) ({ STARPU_BLOCK_CHECK(interface); (((struct starpu_block_interface *)(interface))->nz) ; }) #define STARPU_BLOCK_GET_LDY(interface) ({ STARPU_BLOCK_CHECK(interface); (((struct starpu_block_interface *)(interface))->ldy) ; }) #define STARPU_BLOCK_GET_LDZ(interface) ({ STARPU_BLOCK_CHECK(interface); (((struct starpu_block_interface *)(interface))->ldz) ; }) #define STARPU_BLOCK_GET_ELEMSIZE(interface) ({ STARPU_BLOCK_CHECK(interface); (((struct starpu_block_interface *)(interface))->elemsize) ; }) #else #define STARPU_BLOCK_GET_PTR(interface) (((struct starpu_block_interface *)(interface))->ptr) #define STARPU_BLOCK_GET_DEV_HANDLE(interface) (((struct starpu_block_interface *)(interface))->dev_handle) #define STARPU_BLOCK_GET_OFFSET(interface) (((struct starpu_block_interface *)(interface))->offset) #define STARPU_BLOCK_GET_NX(interface) (((struct starpu_block_interface *)(interface))->nx) #define STARPU_BLOCK_GET_NY(interface) (((struct starpu_block_interface *)(interface))->ny) #define STARPU_BLOCK_GET_NZ(interface) (((struct starpu_block_interface *)(interface))->nz) #define STARPU_BLOCK_GET_LDY(interface) (((struct starpu_block_interface *)(interface))->ldy) #define STARPU_BLOCK_GET_LDZ(interface) (((struct starpu_block_interface *)(interface))->ldz) #define STARPU_BLOCK_GET_ELEMSIZE(interface) (((struct starpu_block_interface *)(interface))->elemsize) #endif extern struct starpu_data_interface_ops starpu_interface_vector_ops; struct starpu_vector_interface { enum starpu_data_interface_id id; uintptr_t ptr; uintptr_t dev_handle; size_t offset; uint32_t nx; size_t elemsize; uint32_t slice_base; }; void starpu_vector_data_register(starpu_data_handle_t *handle, int home_node, uintptr_t ptr, uint32_t nx, size_t elemsize); void starpu_vector_ptr_register(starpu_data_handle_t handle, unsigned node, uintptr_t ptr, uintptr_t dev_handle, size_t offset); uint32_t starpu_vector_get_nx(starpu_data_handle_t handle); size_t starpu_vector_get_elemsize(starpu_data_handle_t handle); uintptr_t starpu_vector_get_local_ptr(starpu_data_handle_t handle); #if defined(STARPU_HAVE_STATEMENT_EXPRESSIONS) && defined(STARPU_DEBUG) #define STARPU_VECTOR_CHECK(interface) STARPU_ASSERT_MSG((((struct starpu_vector_interface *)(interface))->id) == STARPU_VECTOR_INTERFACE_ID, "Error. The given data is not a vector.") #define STARPU_VECTOR_GET_PTR(interface) ({ STARPU_VECTOR_CHECK(interface); (((struct starpu_vector_interface *)(interface))->ptr); }) #define STARPU_VECTOR_GET_DEV_HANDLE(interface) ({ STARPU_VECTOR_CHECK(interface); (((struct starpu_vector_interface *)(interface))->dev_handle); }) #define STARPU_VECTOR_GET_OFFSET(interface) ({ STARPU_VECTOR_CHECK(interface); (((struct starpu_vector_interface *)(interface))->offset); }) #define STARPU_VECTOR_GET_NX(interface) ({ STARPU_VECTOR_CHECK(interface); (((struct starpu_vector_interface *)(interface))->nx); }) #define STARPU_VECTOR_GET_ELEMSIZE(interface) ({ STARPU_VECTOR_CHECK(interface); (((struct starpu_vector_interface *)(interface))->elemsize); }) #define STARPU_VECTOR_GET_SLICE_BASE(interface) ({ STARPU_VECTOR_CHECK(interface); (((struct starpu_vector_interface *)(interface))->slice_base); }) #else #define STARPU_VECTOR_GET_PTR(interface) (((struct starpu_vector_interface *)(interface))->ptr) #define STARPU_VECTOR_GET_DEV_HANDLE(interface) (((struct starpu_vector_interface *)(interface))->dev_handle) #define STARPU_VECTOR_GET_OFFSET(interface) (((struct starpu_vector_interface *)(interface))->offset) #define STARPU_VECTOR_GET_NX(interface) (((struct starpu_vector_interface *)(interface))->nx) #define STARPU_VECTOR_GET_ELEMSIZE(interface) (((struct starpu_vector_interface *)(interface))->elemsize) #define STARPU_VECTOR_GET_SLICE_BASE(interface) (((struct starpu_vector_interface *)(interface))->slice_base) #endif extern struct starpu_data_interface_ops starpu_interface_variable_ops; struct starpu_variable_interface { enum starpu_data_interface_id id; uintptr_t ptr; uintptr_t dev_handle; size_t offset; size_t elemsize; }; void starpu_variable_data_register(starpu_data_handle_t *handle, int home_node, uintptr_t ptr, size_t size); void starpu_variable_ptr_register(starpu_data_handle_t handle, unsigned node, uintptr_t ptr, uintptr_t dev_handle, size_t offset); size_t starpu_variable_get_elemsize(starpu_data_handle_t handle); uintptr_t starpu_variable_get_local_ptr(starpu_data_handle_t handle); #if defined(STARPU_HAVE_STATEMENT_EXPRESSIONS) && defined(STARPU_DEBUG) #define STARPU_VARIABLE_CHECK(interface) STARPU_ASSERT_MSG((((struct starpu_variable_interface *)(interface))->id) == STARPU_VARIABLE_INTERFACE_ID, "Error. The given data is not a variable.") #define STARPU_VARIABLE_GET_PTR(interface) ({ STARPU_VARIABLE_CHECK(interface); (((struct starpu_variable_interface *)(interface))->ptr) ; }) #define STARPU_VARIABLE_GET_OFFSET(interface) ({ STARPU_VARIABLE_CHECK(interface); (((struct starpu_variable_interface *)(interface))->offset) ; }) #define STARPU_VARIABLE_GET_ELEMSIZE(interface) ({ STARPU_VARIABLE_CHECK(interface); (((struct starpu_variable_interface *)(interface))->elemsize) ; }) #define STARPU_VARIABLE_GET_DEV_HANDLE(interface) ({ STARPU_VARIABLE_CHECK(interface); (((struct starpu_variable_interface *)(interface))->ptr) ; }) #else #define STARPU_VARIABLE_GET_PTR(interface) (((struct starpu_variable_interface *)(interface))->ptr) #define STARPU_VARIABLE_GET_OFFSET(interface) (((struct starpu_variable_interface *)(interface))->offset) #define STARPU_VARIABLE_GET_ELEMSIZE(interface) (((struct starpu_variable_interface *)(interface))->elemsize) #define STARPU_VARIABLE_GET_DEV_HANDLE(interface) (((struct starpu_variable_interface *)(interface))->ptr) #endif extern struct starpu_data_interface_ops starpu_interface_void_ops; void starpu_void_data_register(starpu_data_handle_t *handle); extern struct starpu_data_interface_ops starpu_interface_csr_ops; struct starpu_csr_interface { enum starpu_data_interface_id id; uint32_t nnz; uint32_t nrow; uintptr_t nzval; uint32_t *colind; uint32_t *rowptr; uint32_t firstentry; size_t elemsize; }; void starpu_csr_data_register(starpu_data_handle_t *handle, int home_node, uint32_t nnz, uint32_t nrow, uintptr_t nzval, uint32_t *colind, uint32_t *rowptr, uint32_t firstentry, size_t elemsize); uint32_t starpu_csr_get_nnz(starpu_data_handle_t handle); uint32_t starpu_csr_get_nrow(starpu_data_handle_t handle); uint32_t starpu_csr_get_firstentry(starpu_data_handle_t handle); uintptr_t starpu_csr_get_local_nzval(starpu_data_handle_t handle); uint32_t *starpu_csr_get_local_colind(starpu_data_handle_t handle); uint32_t *starpu_csr_get_local_rowptr(starpu_data_handle_t handle); size_t starpu_csr_get_elemsize(starpu_data_handle_t handle); #define STARPU_CSR_GET_NNZ(interface) (((struct starpu_csr_interface *)(interface))->nnz) #define STARPU_CSR_GET_NROW(interface) (((struct starpu_csr_interface *)(interface))->nrow) #define STARPU_CSR_GET_NZVAL(interface) (((struct starpu_csr_interface *)(interface))->nzval) #define STARPU_CSR_GET_NZVAL_DEV_HANDLE(interface) \ (((struct starpu_csr_interface *)(interface))->nnz) #define STARPU_CSR_GET_COLIND(interface) (((struct starpu_csr_interface *)(interface))->colind) #define STARPU_CSR_GET_COLIND_DEV_HANDLE(interface) \ (((struct starpu_csr_interface *)(interface))->colind) #define STARPU_CSR_GET_ROWPTR(interface) (((struct starpu_csr_interface *)(interface))->rowptr) #define STARPU_CSR_GET_ROWPTR_DEV_HANDLE(interface) \ (((struct starpu_csr_interface *)(interface))->rowptr) #define STARPU_CSR_GET_OFFSET 0 #define STARPU_CSR_GET_FIRSTENTRY(interface) (((struct starpu_csr_interface *)(interface))->firstentry) #define STARPU_CSR_GET_ELEMSIZE(interface) (((struct starpu_csr_interface *)(interface))->elemsize) extern struct starpu_data_interface_ops starpu_interface_bcsr_ops; struct starpu_bcsr_interface { enum starpu_data_interface_id id; uint32_t nnz; uint32_t nrow; uintptr_t nzval; uint32_t *colind; uint32_t *rowptr; uint32_t firstentry; uint32_t r; uint32_t c; size_t elemsize; }; void starpu_bcsr_data_register(starpu_data_handle_t *handle, int home_node, uint32_t nnz, uint32_t nrow, uintptr_t nzval, uint32_t *colind, uint32_t *rowptr, uint32_t firstentry, uint32_t r, uint32_t c, size_t elemsize); #define STARPU_BCSR_GET_NNZ(interface) (((struct starpu_bcsr_interface *)(interface))->nnz) #define STARPU_BCSR_GET_NZVAL(interface) (((struct starpu_bcsr_interface *)(interface))->nzval) #define STARPU_BCSR_GET_NZVAL_DEV_HANDLE(interface) \ (((struct starpu_bcsr_interface *)(interface))->nnz) #define STARPU_BCSR_GET_COLIND(interface) (((struct starpu_bcsr_interface *)(interface))->colind) #define STARPU_BCSR_GET_COLIND_DEV_HANDLE(interface) \ (((struct starpu_bcsr_interface *)(interface))->colind) #define STARPU_BCSR_GET_ROWPTR(interface) (((struct starpu_bcsr_interface *)(interface))->rowptr) #define STARPU_BCSR_GET_ROWPTR_DEV_HANDLE(interface) \ (((struct starpu_bcsr_interface *)(interface))->rowptr) #define STARPU_BCSR_GET_OFFSET 0 uint32_t starpu_bcsr_get_nnz(starpu_data_handle_t handle); uint32_t starpu_bcsr_get_nrow(starpu_data_handle_t handle); uint32_t starpu_bcsr_get_firstentry(starpu_data_handle_t handle); uintptr_t starpu_bcsr_get_local_nzval(starpu_data_handle_t handle); uint32_t *starpu_bcsr_get_local_colind(starpu_data_handle_t handle); uint32_t *starpu_bcsr_get_local_rowptr(starpu_data_handle_t handle); uint32_t starpu_bcsr_get_r(starpu_data_handle_t handle); uint32_t starpu_bcsr_get_c(starpu_data_handle_t handle); size_t starpu_bcsr_get_elemsize(starpu_data_handle_t handle); struct starpu_multiformat_data_interface_ops { size_t cpu_elemsize; size_t opencl_elemsize; struct starpu_codelet *cpu_to_opencl_cl; struct starpu_codelet *opencl_to_cpu_cl; size_t cuda_elemsize; struct starpu_codelet *cpu_to_cuda_cl; struct starpu_codelet *cuda_to_cpu_cl; size_t mic_elemsize; struct starpu_codelet *cpu_to_mic_cl; struct starpu_codelet *mic_to_cpu_cl; }; struct starpu_multiformat_interface { enum starpu_data_interface_id id; void *cpu_ptr; void *cuda_ptr; void *opencl_ptr; void *mic_ptr; uint32_t nx; struct starpu_multiformat_data_interface_ops *ops; }; void starpu_multiformat_data_register(starpu_data_handle_t *handle, int home_node, void *ptr, uint32_t nobjects, struct starpu_multiformat_data_interface_ops *format_ops); #define STARPU_MULTIFORMAT_GET_CPU_PTR(interface) (((struct starpu_multiformat_interface *)(interface))->cpu_ptr) #define STARPU_MULTIFORMAT_GET_CUDA_PTR(interface) (((struct starpu_multiformat_interface *)(interface))->cuda_ptr) #define STARPU_MULTIFORMAT_GET_OPENCL_PTR(interface) (((struct starpu_multiformat_interface *)(interface))->opencl_ptr) #define STARPU_MULTIFORMAT_GET_MIC_PTR(interface) (((struct starpu_multiformat_interface *)(interface))->mic_ptr) #define STARPU_MULTIFORMAT_GET_NX(interface) (((struct starpu_multiformat_interface *)(interface))->nx) enum starpu_data_interface_id starpu_data_get_interface_id(starpu_data_handle_t handle); int starpu_data_pack(starpu_data_handle_t handle, void **ptr, starpu_ssize_t *count); int starpu_data_unpack(starpu_data_handle_t handle, void *ptr, size_t count); size_t starpu_data_get_size(starpu_data_handle_t handle); starpu_data_handle_t starpu_data_lookup(const void *ptr); #ifdef __cplusplus } #endif #endif /* __STARPU_DATA_INTERFACES_H__ */ starpu-1.2.3+dfsg/include/starpu_deprecated_api.h000066400000000000000000000136101320135501600220720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_DEPRECATED_API_H__ #define __STARPU_DEPRECATED_API_H__ #ifdef __cplusplus extern "C" { #endif #if defined(STARPU_USE_DEPRECATED_API) || defined(STARPU_USE_DEPRECATED_ONE_ZERO_API) #warning Your application is using deprecated types. You may want to update to use the latest API, by using tools/dev/rename.sh. #endif /* defined(STARPU_USE_DEPRECATED_API) || defined(STARPU_USE_DEPRECATED_ONE_ZERO_API) */ #define starpu_permodel_history_based_expected_perf starpu_perfmodel_history_based_expected_perf #ifdef STARPU_USE_DEPRECATED_ONE_ZERO_API #define starpu_allocate_buffer_on_node starpu_malloc_on_node #define starpu_free_buffer_on_node starpu_free_on_node #define starpu_helper_cublas_init starpu_cublas_init #define starpu_helper_cublas_shutdown starpu_cublas_shutdown #define starpu_canonical_block_filter_bcsr starpu_bcsr_filter_canonical_block #define starpu_vertical_block_filter_func_csr starpu_csr_filter_vertical_block #define starpu_block_filter_func starpu_matrix_filter_block #define starpu_block_shadow_filter_func starpu_matrix_filter_block_shadow #define starpu_vertical_block_filter_func starpu_matrix_filter_vertical_block #define starpu_vertical_block_shadow_filter_func starpu_matrix_filter_vertical_block_shadow #define starpu_block_filter_func_vector starpu_vector_filter_block #define starpu_block_shadow_filter_func_vector starpu_vector_filter_block_shadow #define starpu_vector_list_filter_func starpu_vector_filter_list #define starpu_vector_divide_in_2_filter_func starpu_vector_filter_divide_in_2 #define starpu_block_filter_func_block starpu_block_filter_block #define starpu_block_shadow_filter_func_block starpu_block_filter_block_shadow #define starpu_vertical_block_filter_func_block starpu_block_filter_vertical_block #define starpu_vertical_block_shadow_filter_func_block starpu_block_filter_vertical_block_shadow #define starpu_depth_block_filter_func_block starpu_block_filter_depth_block #define starpu_depth_block_shadow_filter_func_block starpu_block_filter_depth_block_shadow #define starpu_display_codelet_stats starpu_codelet_display_stats #define starpu_access_mode starpu_data_access_mode #define starpu_buffer_descr starpu_data_descr #define starpu_memory_display_stats starpu_data_display_memory_stats #define starpu_handle_to_pointer starpu_data_handle_to_pointer #define starpu_handle_get_local_ptr starpu_data_get_local_ptr #define starpu_crc32_be_n starpu_hash_crc32c_be_n #define starpu_crc32_be starpu_hash_crc32c_be #define starpu_crc32_string starpu_hash_crc32c_string #define starpu_perf_archtype starpu_perfmodel_archtype #define starpu_history_based_expected_perf starpu_perfmodel_history_based_expected_perf #define starpu_task_profiling_info starpu_profiling_task_info #define starpu_worker_profiling_info starpu_profiling_worker_info #define starpu_bus_profiling_info starpu_profiling_bus_info #define starpu_set_profiling_id starpu_profiling_set_id #define starpu_worker_get_profiling_info starpu_profiling_worker_get_info #define starpu_bus_profiling_helper_display_summary starpu_profiling_bus_helper_display_summary #define starpu_worker_profiling_helper_display_summary starpu_profiling_worker_helper_display_summary #define starpu_archtype starpu_worker_archtype #define starpu_handle_get_interface_id starpu_data_get_interface_id #define starpu_handle_get_size starpu_data_get_size #define starpu_handle_pack_data starpu_data_pack #define starpu_handle_unpack_data starpu_data_unpack #endif /* STARPU_USE_DEPRECATED_ONE_ZERO_API */ #ifdef STARPU_USE_DEPRECATED_API typedef starpu_data_handle_t starpu_data_handle; typedef struct starpu_block_interface starpu_block_interface_t; typedef struct starpu_matrix_interface starpu_matrix_interface_t; typedef struct starpu_vector_interface starpu_vector_interface_t; typedef struct starpu_variable_interface starpu_variable_interface_t; typedef struct starpu_csr_interface starpu_csr_interface_t; typedef struct starpu_bcsr_interface starpu_bcsr_interface_t; typedef struct starpu_multiformat_interface starpu_multiformat_interface_t; #define starpu_machine_topology_s starpu_machine_topology #define starpu_htbl32_node_s starpu_htbl32_node #define starpu_history_list_t starpu_history_list #define starpu_buffer_descr_t starpu_buffer_descr #define starpu_regression_model_t starpu_regression_model #define starpu_per_arch_perfmodel_t starpu_per_arch_perfmodel #define starpu_perfmodel_t starpu_perfmodel #define starpu_sched_policy_s starpu_sched_policy #define starpu_data_interface_ops_t starpu_data_interface_ops typedef struct starpu_buffer_descr starpu_buffer_descr; typedef struct starpu_codelet starpu_codelet; typedef struct starpu_codelet starpu_codelet_t; typedef enum starpu_access_mode starpu_access_mode; #define starpu_print_bus_bandwidth starpu_bus_print_bandwidth #define starpu_get_handle_interface_id starpu_handle_get_interface_id #define starpu_get_current_task starpu_task_get_current #define starpu_unpack_cl_args starpu_codelet_unpack_args #define starpu_pack_cl_args starpu_codelet_pack_args #define starpu_task_deinit starpu_task_clean #endif /* STARPU_USE_DEPRECATED_API */ #ifdef __cplusplus } #endif #endif /* __STARPU_DEPRECATED_API_H__ */ starpu-1.2.3+dfsg/include/starpu_disk.h000066400000000000000000000054171320135501600201010ustar00rootroot00000000000000 /* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Corentin Salingue * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_DISK_H__ #define __STARPU_DISK_H__ #include #include /* list of functions to use on disk */ struct starpu_disk_ops { void * (*plug) (void *parameter, starpu_ssize_t size); void (*unplug) (void *base); int (*bandwidth) (unsigned node, void *base); void * (*alloc) (void *base, size_t size); void (*free) (void *base, void *obj, size_t size); void * (*open) (void *base, void *pos, size_t size); /* open an existing file */ void (*close) (void *base, void *obj, size_t size); int (*read) (void *base, void *obj, void *buf, off_t offset, size_t size); int (*write) (void *base, void *obj, const void *buf, off_t offset, size_t size); int (*full_read) (void * base, void * obj, void ** ptr, size_t * size); int (*full_write) (void * base, void * obj, void * ptr, size_t size); void * (*async_write) (void *base, void *obj, void *buf, off_t offset, size_t size); void * (*async_read) (void *base, void *obj, void *buf, off_t offset, size_t size); void * (*async_full_read) (void * base, void * obj, void ** ptr, size_t * size); void * (*async_full_write) (void * base, void * obj, void * ptr, size_t size); void * (*copy) (void *base_src, void* obj_src, off_t offset_src, void *base_dst, void* obj_dst, off_t offset_dst, size_t size); void (*wait_request) (void * async_channel); int (*test_request) (void * async_channel); void (*free_request)(void * async_channel); /* TODO: readv, writev, read2d, write2d, etc. */ }; /* Posix functions to use disk memory */ extern struct starpu_disk_ops starpu_disk_stdio_ops; extern struct starpu_disk_ops starpu_disk_unistd_ops; extern struct starpu_disk_ops starpu_disk_unistd_o_direct_ops; extern struct starpu_disk_ops starpu_disk_leveldb_ops; void starpu_disk_close(unsigned node, void *obj, size_t size); void *starpu_disk_open(unsigned node, void *pos, size_t size); int starpu_disk_register(struct starpu_disk_ops *func, void *parameter, starpu_ssize_t size); #define STARPU_DISK_SIZE_MIN (16*1024*1024) extern int starpu_disk_swap_node; #endif /* __STARPU_DISK_H__ */ starpu-1.2.3+dfsg/include/starpu_driver.h000066400000000000000000000027031320135501600204350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2013 Université de Bordeaux * Copyright (C) 2010-2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_DRIVER_H__ #define __STARPU_DRIVER_H__ #include #if defined(STARPU_USE_OPENCL) && !defined(__CUDACC__) #include #endif #ifdef __cplusplus extern "C" { #endif struct starpu_driver { enum starpu_worker_archtype type; union { unsigned cpu_id; unsigned cuda_id; #if defined(STARPU_USE_OPENCL) && !defined(__CUDACC__) cl_device_id opencl_id; #elif defined(STARPU_SIMGRID) unsigned opencl_id; #endif } id; }; int starpu_driver_run(struct starpu_driver *d); void starpu_drivers_request_termination(void); int starpu_driver_init(struct starpu_driver *d); int starpu_driver_run_once(struct starpu_driver *d); int starpu_driver_deinit(struct starpu_driver *d); #ifdef __cplusplus } #endif #endif /* __STARPU_DRIVER_H__ */ starpu-1.2.3+dfsg/include/starpu_expert.h000066400000000000000000000017371320135501600204570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_EXPERT_H__ #define __STARPU_EXPERT_H__ #include #ifdef __cplusplus extern "C" { #endif void starpu_wake_all_blocked_workers(void); int starpu_progression_hook_register(unsigned (*func)(void *arg), void *arg); void starpu_progression_hook_deregister(int hook_id); #ifdef __cplusplus } #endif #endif /* __STARPU_H__ */ starpu-1.2.3+dfsg/include/starpu_fxt.h000066400000000000000000000041141320135501600177410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013, 2015-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2013, 2014 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_FXT_H__ #define __STARPU_FXT_H__ #include #ifdef __cplusplus extern "C" { #endif #define STARPU_FXT_MAX_FILES 64 struct starpu_fxt_codelet_event { char symbol[256]; int workerid; char perfmodel_archname[256]; uint32_t hash; size_t size; float time; }; struct starpu_fxt_options { unsigned per_task_colour; unsigned no_events; unsigned no_counter; unsigned no_bus; unsigned no_flops; unsigned ninputfiles; char *filenames[STARPU_FXT_MAX_FILES]; char *out_paje_path; char *distrib_time_path; char *activity_path; char *dag_path; char *tasks_path; char *data_path; char *anim_path; char *file_prefix; uint64_t file_offset; int file_rank; char worker_names[STARPU_NMAXWORKERS][256]; struct starpu_perfmodel_arch worker_archtypes[STARPU_NMAXWORKERS]; int nworkers; struct starpu_fxt_codelet_event **dumped_codelets; long dumped_codelets_count; }; void starpu_fxt_options_init(struct starpu_fxt_options *options); void starpu_fxt_generate_trace(struct starpu_fxt_options *options); void starpu_fxt_autostart_profiling(int autostart); void starpu_fxt_start_profiling(void); void starpu_fxt_stop_profiling(void); void starpu_fxt_write_data_trace(char *filename_in); void starpu_fxt_trace_user_event(unsigned long code); void starpu_fxt_trace_user_event_string(const char *s); #ifdef __cplusplus } #endif #endif /* __STARPU_FXT_H__ */ starpu-1.2.3+dfsg/include/starpu_hash.h000066400000000000000000000021261320135501600200640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2014 Université de Bordeaux * Copyright (C) 2010, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_HASH_H__ #define __STARPU_HASH_H__ #include #include #ifdef __cplusplus extern "C" { #endif uint32_t starpu_hash_crc32c_be_n(const void *input, size_t n, uint32_t inputcrc); uint32_t starpu_hash_crc32c_be(uint32_t input, uint32_t inputcrc); uint32_t starpu_hash_crc32c_string(const char *str, uint32_t inputcrc); #ifdef __cplusplus } #endif #endif /* __STARPU_HASH_H__ */ starpu-1.2.3+dfsg/include/starpu_mic.h000066400000000000000000000021141320135501600177060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * Copyright (C) 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_MIC_H__ #define __STARPU_MIC_H__ #include #ifdef STARPU_USE_MIC #ifdef __cplusplus extern "C" { #endif typedef void *starpu_mic_func_symbol_t; int starpu_mic_register_kernel(starpu_mic_func_symbol_t *symbol, const char *func_name); starpu_mic_kernel_t starpu_mic_get_kernel(starpu_mic_func_symbol_t symbol); #ifdef __cplusplus } #endif #endif /* STARPU_USE_MIC */ #endif /* __STARPU_MIC_H__ */ starpu-1.2.3+dfsg/include/starpu_mod.f90000066400000000000000000000101251320135501600200650ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2015 Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ! ! See the GNU Lesser General Public License in COPYING.LGPL for more details. MODULE starpu_mod ! == starpu.h == ! starpu_conf_init INTERFACE SUBROUTINE starpu_conf_init(conf) BIND(C) USE iso_c_binding TYPE(C_PTR), VALUE :: conf END SUBROUTINE starpu_conf_init END INTERFACE ! starpu_init INTERFACE FUNCTION starpu_init(conf) BIND(C) USE iso_c_binding TYPE(C_PTR), VALUE :: conf INTEGER(KIND=C_INT) :: starpu_init END FUNCTION starpu_init END INTERFACE ! starpu_initialize ! starpu_pause INTERFACE SUBROUTINE starpu_pause() BIND(C) USE iso_c_binding END SUBROUTINE starpu_pause END INTERFACE ! starpu_resume INTERFACE SUBROUTINE starpu_resume() BIND(C) USE iso_c_binding END SUBROUTINE starpu_resume END INTERFACE ! starpu_shutdown INTERFACE SUBROUTINE starpu_shutdown() BIND(C) USE iso_c_binding END SUBROUTINE starpu_shutdown END INTERFACE ! starpu_topology_print ! starpu_asynchronous_copy_disabled INTERFACE SUBROUTINE starpu_asynchronous_copy_disabled() BIND(C) USE iso_c_binding END SUBROUTINE starpu_asynchronous_copy_disabled END INTERFACE ! starpu_asynchronous_cuda_copy_disabled INTERFACE SUBROUTINE starpu_asynchronous_cuda_copy_disabled() BIND(C) USE iso_c_binding END SUBROUTINE starpu_asynchronous_cuda_copy_disabled END INTERFACE ! starpu_asynchronous_opencl_copy_disabled INTERFACE SUBROUTINE starpu_asynchronous_opencl_copy_disabled() BIND(C) USE iso_c_binding END SUBROUTINE starpu_asynchronous_opencl_copy_disabled END INTERFACE ! starpu_asynchronous_mic_copy_disabled INTERFACE SUBROUTINE starpu_asynchronous_mic_copy_disabled() BIND(C) USE iso_c_binding END SUBROUTINE starpu_asynchronous_mic_copy_disabled END INTERFACE ! starpu_display_stats INTERFACE SUBROUTINE starpu_display_stats() BIND(C) USE iso_c_binding END SUBROUTINE starpu_display_stats END INTERFACE ! starpu_get_version INTERFACE SUBROUTINE starpu_get_version(major,minor,release) BIND(C) USE iso_c_binding INTEGER(KIND=C_INT), INTENT(OUT) :: major,minor,release END SUBROUTINE starpu_get_version END INTERFACE ! starpu_cpu_worker_get_count INTERFACE FUNCTION starpu_cpu_worker_get_count() BIND(C) USE iso_c_binding INTEGER(KIND=C_INT) :: starpu_cpu_worker_get_count END FUNCTION starpu_cpu_worker_get_count END INTERFACE ! == starpu_task.h == ! starpu_tag_declare_deps ! starpu_tag_declare_deps_array ! starpu_task_declare_deps_array ! starpu_tag_wait ! starpu_tag_wait_array ! starpu_tag_notify_from_apps ! starpu_tag_restart ! starpu_tag_remove ! starpu_task_init ! starpu_task_clean ! starpu_task_create ! starpu_task_destroy ! starpu_task_submit ! starpu_task_submit_to_ctx ! starpu_task_finished ! starpu_task_wait ! starpu_task_wait_for_all INTERFACE SUBROUTINE starpu_task_wait_for_all() BIND(C) USE iso_c_binding END SUBROUTINE starpu_task_wait_for_all END INTERFACE ! starpu_task_wait_for_n_submitted ! starpu_task_wait_for_all_in_ctx ! starpu_task_wait_for_n_submitted_in_ctx ! starpu_task_wait_for_no_ready ! starpu_task_nready ! starpu_task_nsubmitted ! starpu_codelet_init ! starpu_codelet_display_stats ! starpu_task_get_current ! starpu_parallel_task_barrier_init ! starpu_parallel_task_barrier_init_n ! starpu_task_dup ! starpu_task_set_implementation ! starpu_task_get_implementation END MODULE starpu_mod starpu-1.2.3+dfsg/include/starpu_opencl.h000066400000000000000000000104021320135501600204150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_OPENCL_H__ #define __STARPU_OPENCL_H__ #include #ifdef STARPU_USE_OPENCL #ifdef __APPLE__ #include #else #include #endif #include #ifdef __cplusplus extern "C" { #endif const char *starpu_opencl_error_string(cl_int status); void starpu_opencl_display_error(const char *func, const char *file, int line, const char *msg, cl_int status); #define STARPU_OPENCL_DISPLAY_ERROR(status) \ starpu_opencl_display_error(__starpu_func__, __FILE__, __LINE__, NULL, status) static __starpu_inline void starpu_opencl_report_error(const char *func, const char *file, int line, const char *msg, cl_int status) { starpu_opencl_display_error(func, file, line, msg, status); assert(0); } #define STARPU_OPENCL_REPORT_ERROR(status) \ starpu_opencl_report_error(__starpu_func__, __FILE__, __LINE__, NULL, status) #define STARPU_OPENCL_REPORT_ERROR_WITH_MSG(msg, status) \ starpu_opencl_report_error(__starpu_func__, __FILE__, __LINE__, msg, status) struct starpu_opencl_program { cl_program programs[STARPU_MAXOPENCLDEVS]; }; void starpu_opencl_get_context(int devid, cl_context *context); void starpu_opencl_get_device(int devid, cl_device_id *device); void starpu_opencl_get_queue(int devid, cl_command_queue *queue); void starpu_opencl_get_current_context(cl_context *context); void starpu_opencl_get_current_queue(cl_command_queue *queue); void starpu_opencl_load_program_source(const char *source_file_name, char *located_file_name, char *located_dir_name, char *opencl_program_source); void starpu_opencl_load_program_source_malloc(const char *source_file_name, char **located_file_name, char **located_dir_name, char **opencl_program_source); int starpu_opencl_compile_opencl_from_file(const char *source_file_name, const char *build_options); int starpu_opencl_compile_opencl_from_string(const char *opencl_program_source, const char *file_name, const char *build_options); int starpu_opencl_load_binary_opencl(const char *kernel_id, struct starpu_opencl_program *opencl_programs); int starpu_opencl_load_opencl_from_file(const char *source_file_name, struct starpu_opencl_program *opencl_programs, const char *build_options); int starpu_opencl_load_opencl_from_string(const char *opencl_program_source, struct starpu_opencl_program *opencl_programs, const char *build_options); int starpu_opencl_unload_opencl(struct starpu_opencl_program *opencl_programs); int starpu_opencl_load_kernel(cl_kernel *kernel, cl_command_queue *queue, struct starpu_opencl_program *opencl_programs, const char *kernel_name, int devid); int starpu_opencl_release_kernel(cl_kernel kernel); int starpu_opencl_collect_stats(cl_event event); int starpu_opencl_set_kernel_args(cl_int *err, cl_kernel *kernel, ...); cl_int starpu_opencl_allocate_memory(int devid, cl_mem *addr, size_t size, cl_mem_flags flags); cl_int starpu_opencl_copy_ram_to_opencl(void *ptr, unsigned src_node, cl_mem buffer, unsigned dst_node, size_t size, size_t offset, cl_event *event, int *ret); cl_int starpu_opencl_copy_opencl_to_ram(cl_mem buffer, unsigned src_node, void *ptr, unsigned dst_node, size_t size, size_t offset, cl_event *event, int *ret); cl_int starpu_opencl_copy_opencl_to_opencl(cl_mem src, unsigned src_node, size_t src_offset, cl_mem dst, unsigned dst_node, size_t dst_offset, size_t size, cl_event *event, int *ret); cl_int starpu_opencl_copy_async_sync(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, cl_event *event); #ifdef __cplusplus } #endif #endif /* STARPU_USE_OPENCL */ #endif /* __STARPU_OPENCL_H__ */ starpu-1.2.3+dfsg/include/starpu_openmp.h000066400000000000000000000213321320135501600204370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_OPENMP_H__ #define __STARPU_OPENMP_H__ #include #if defined STARPU_OPENMP typedef struct { void *internal; } starpu_omp_lock_t; typedef struct { void *internal; } starpu_omp_nest_lock_t; enum starpu_omp_sched_value { starpu_omp_sched_undefined = 0, starpu_omp_sched_static = 1, starpu_omp_sched_dynamic = 2, starpu_omp_sched_guided = 3, starpu_omp_sched_auto = 4, starpu_omp_sched_runtime = 5 }; enum starpu_omp_proc_bind_value { starpu_omp_proc_bind_undefined = -1, starpu_omp_proc_bind_false = 0, starpu_omp_proc_bind_true = 1, starpu_omp_proc_bind_master = 2, starpu_omp_proc_bind_close = 3, starpu_omp_proc_bind_spread = 4 }; struct starpu_omp_parallel_region_attr { struct starpu_codelet cl; starpu_data_handle_t *handles; void *cl_arg; size_t cl_arg_size; unsigned cl_arg_free; int if_clause; int num_threads; }; struct starpu_omp_task_region_attr { struct starpu_codelet cl; starpu_data_handle_t *handles; void *cl_arg; size_t cl_arg_size; unsigned cl_arg_free; int priority; int if_clause; int final_clause; int untied_clause; int mergeable_clause; }; #ifdef __cplusplus extern "C" { #define __STARPU_OMP_NOTHROW throw () #else #define __STARPU_OMP_NOTHROW __attribute__((__nothrow__)) #endif extern int starpu_omp_init(void) __STARPU_OMP_NOTHROW; extern void starpu_omp_shutdown(void) __STARPU_OMP_NOTHROW; extern void starpu_omp_parallel_region(const struct starpu_omp_parallel_region_attr *attr) __STARPU_OMP_NOTHROW; extern void starpu_omp_barrier(void) __STARPU_OMP_NOTHROW; extern void starpu_omp_master(void (*f)(void *arg), void *arg) __STARPU_OMP_NOTHROW; extern int starpu_omp_master_inline(void) __STARPU_OMP_NOTHROW; extern void starpu_omp_single(void (*f)(void *arg), void *arg, int nowait) __STARPU_OMP_NOTHROW; extern int starpu_omp_single_inline(void) __STARPU_OMP_NOTHROW; extern void starpu_omp_single_copyprivate(void (*f)(void *arg, void *data, unsigned long long data_size), void *arg, void *data, unsigned long long data_size) __STARPU_OMP_NOTHROW; extern void *starpu_omp_single_copyprivate_inline_begin(void *data) __STARPU_OMP_NOTHROW; extern void starpu_omp_single_copyprivate_inline_end(void) __STARPU_OMP_NOTHROW; extern void starpu_omp_critical(void (*f)(void *arg), void *arg, const char *name) __STARPU_OMP_NOTHROW; extern void starpu_omp_critical_inline_begin(const char *name) __STARPU_OMP_NOTHROW; extern void starpu_omp_critical_inline_end(const char *name) __STARPU_OMP_NOTHROW; extern void starpu_omp_task_region(const struct starpu_omp_task_region_attr *attr) __STARPU_OMP_NOTHROW; extern void starpu_omp_taskwait(void) __STARPU_OMP_NOTHROW; extern void starpu_omp_taskgroup(void (*f)(void *arg), void *arg) __STARPU_OMP_NOTHROW; extern void starpu_omp_taskgroup_inline_begin(void) __STARPU_OMP_NOTHROW; extern void starpu_omp_taskgroup_inline_end(void) __STARPU_OMP_NOTHROW; extern void starpu_omp_for(void (*f)(unsigned long long _first_i, unsigned long long _nb_i, void *arg), void *arg, unsigned long long nb_iterations, unsigned long long chunk, int schedule, int ordered, int nowait) __STARPU_OMP_NOTHROW; extern int starpu_omp_for_inline_first(unsigned long long nb_iterations, unsigned long long chunk, int schedule, int ordered, unsigned long long *_first_i, unsigned long long *_nb_i) __STARPU_OMP_NOTHROW; extern int starpu_omp_for_inline_next(unsigned long long nb_iterations, unsigned long long chunk, int schedule, int ordered, unsigned long long *_first_i, unsigned long long *_nb_i) __STARPU_OMP_NOTHROW; extern void starpu_omp_for_alt(void (*f)(unsigned long long _begin_i, unsigned long long _end_i, void *arg), void *arg, unsigned long long nb_iterations, unsigned long long chunk, int schedule, int ordered, int nowait) __STARPU_OMP_NOTHROW; extern int starpu_omp_for_inline_first_alt(unsigned long long nb_iterations, unsigned long long chunk, int schedule, int ordered, unsigned long long *_begin_i, unsigned long long *_end_i) __STARPU_OMP_NOTHROW; extern int starpu_omp_for_inline_next_alt(unsigned long long nb_iterations, unsigned long long chunk, int schedule, int ordered, unsigned long long *_begin_i, unsigned long long *_end_i) __STARPU_OMP_NOTHROW; extern void starpu_omp_ordered_inline_begin(void) __STARPU_OMP_NOTHROW; extern void starpu_omp_ordered_inline_end(void) __STARPU_OMP_NOTHROW; extern void starpu_omp_ordered(void (*f)(void *arg), void *arg) __STARPU_OMP_NOTHROW; extern void starpu_omp_sections(unsigned long long nb_sections, void (**section_f)(void *arg), void **section_arg, int nowait) __STARPU_OMP_NOTHROW; extern void starpu_omp_sections_combined(unsigned long long nb_sections, void (*section_f)(unsigned long long section_num, void *arg), void *section_arg, int nowait) __STARPU_OMP_NOTHROW; extern void starpu_omp_set_num_threads(int threads) __STARPU_OMP_NOTHROW; extern int starpu_omp_get_num_threads() __STARPU_OMP_NOTHROW; extern int starpu_omp_get_thread_num() __STARPU_OMP_NOTHROW; extern int starpu_omp_get_max_threads() __STARPU_OMP_NOTHROW; extern int starpu_omp_get_num_procs(void) __STARPU_OMP_NOTHROW; extern int starpu_omp_in_parallel(void) __STARPU_OMP_NOTHROW; extern void starpu_omp_set_dynamic(int dynamic_threads) __STARPU_OMP_NOTHROW; extern int starpu_omp_get_dynamic(void) __STARPU_OMP_NOTHROW; extern void starpu_omp_set_nested(int nested) __STARPU_OMP_NOTHROW; extern int starpu_omp_get_nested(void) __STARPU_OMP_NOTHROW; extern int starpu_omp_get_cancellation(void) __STARPU_OMP_NOTHROW; extern void starpu_omp_set_schedule(enum starpu_omp_sched_value kind, int modifier) __STARPU_OMP_NOTHROW; extern void starpu_omp_get_schedule(enum starpu_omp_sched_value *kind, int *modifier) __STARPU_OMP_NOTHROW; extern int starpu_omp_get_thread_limit(void) __STARPU_OMP_NOTHROW; extern void starpu_omp_set_max_active_levels(int max_levels) __STARPU_OMP_NOTHROW; extern int starpu_omp_get_max_active_levels(void) __STARPU_OMP_NOTHROW; extern int starpu_omp_get_level(void) __STARPU_OMP_NOTHROW; extern int starpu_omp_get_ancestor_thread_num(int level) __STARPU_OMP_NOTHROW; extern int starpu_omp_get_team_size(int level) __STARPU_OMP_NOTHROW; extern int starpu_omp_get_active_level(void) __STARPU_OMP_NOTHROW; extern int starpu_omp_in_final(void) __STARPU_OMP_NOTHROW; extern enum starpu_omp_proc_bind_value starpu_omp_get_proc_bind(void) __STARPU_OMP_NOTHROW; extern void starpu_omp_set_default_device(int device_num) __STARPU_OMP_NOTHROW; extern int starpu_omp_get_default_device(void) __STARPU_OMP_NOTHROW; extern int starpu_omp_get_num_devices(void) __STARPU_OMP_NOTHROW; extern int starpu_omp_get_num_teams(void) __STARPU_OMP_NOTHROW; extern int starpu_omp_get_team_num(void) __STARPU_OMP_NOTHROW; extern int starpu_omp_is_initial_device(void) __STARPU_OMP_NOTHROW; extern void starpu_omp_init_lock(starpu_omp_lock_t *lock) __STARPU_OMP_NOTHROW; extern void starpu_omp_destroy_lock(starpu_omp_lock_t *lock) __STARPU_OMP_NOTHROW; extern void starpu_omp_set_lock(starpu_omp_lock_t *lock) __STARPU_OMP_NOTHROW; extern void starpu_omp_unset_lock(starpu_omp_lock_t *lock) __STARPU_OMP_NOTHROW; extern int starpu_omp_test_lock(starpu_omp_lock_t *lock) __STARPU_OMP_NOTHROW; extern void starpu_omp_init_nest_lock(starpu_omp_nest_lock_t *lock) __STARPU_OMP_NOTHROW; extern void starpu_omp_destroy_nest_lock(starpu_omp_nest_lock_t *lock) __STARPU_OMP_NOTHROW; extern void starpu_omp_set_nest_lock(starpu_omp_nest_lock_t *lock) __STARPU_OMP_NOTHROW; extern void starpu_omp_unset_nest_lock(starpu_omp_nest_lock_t *lock) __STARPU_OMP_NOTHROW; extern int starpu_omp_test_nest_lock(starpu_omp_nest_lock_t *lock) __STARPU_OMP_NOTHROW; extern void starpu_omp_atomic_fallback_inline_begin(void) __STARPU_OMP_NOTHROW; extern void starpu_omp_atomic_fallback_inline_end(void) __STARPU_OMP_NOTHROW; extern double starpu_omp_get_wtime(void) __STARPU_OMP_NOTHROW; extern double starpu_omp_get_wtick(void) __STARPU_OMP_NOTHROW; extern void starpu_omp_vector_annotate(starpu_data_handle_t handle, uint32_t slice_base) __STARPU_OMP_NOTHROW; extern struct starpu_arbiter *starpu_omp_get_default_arbiter(void) __STARPU_OMP_NOTHROW; #ifdef __cplusplus } #endif #endif /* STARPU_USE_OPENMP && !STARPU_DONT_INCLUDE_OPENMP_HEADERS */ #endif /* __STARPU_OPENMP_H__ */ starpu-1.2.3+dfsg/include/starpu_perfmodel.h000066400000000000000000000143501320135501600211200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016 CNRS * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_PERFMODEL_H__ #define __STARPU_PERFMODEL_H__ #include #include #include #include #ifdef __cplusplus extern "C" { #endif struct starpu_task; struct starpu_data_descr; #define STARPU_NARCH STARPU_ANY_WORKER struct starpu_perfmodel_device { enum starpu_worker_archtype type; int devid; int ncores; }; struct starpu_perfmodel_arch { int ndevices; struct starpu_perfmodel_device *devices; }; struct starpu_perfmodel_history_entry { double mean; double deviation; double sum; double sum2; unsigned nsample; unsigned nerror; uint32_t footprint; size_t size; double flops; }; struct starpu_perfmodel_history_list { struct starpu_perfmodel_history_list *next; struct starpu_perfmodel_history_entry *entry; }; struct starpu_perfmodel_regression_model { double sumlny; double sumlnx; double sumlnx2; unsigned long minx; unsigned long maxx; double sumlnxlny; double alpha; double beta; unsigned valid; double a, b, c; unsigned nl_valid; unsigned nsample; }; struct starpu_perfmodel_history_table; #define starpu_per_arch_perfmodel starpu_perfmodel_per_arch STARPU_DEPRECATED typedef double (*starpu_perfmodel_per_arch_cost_function)(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl); typedef size_t (*starpu_perfmodel_per_arch_size_base)(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl); struct starpu_perfmodel_per_arch { starpu_perfmodel_per_arch_cost_function cost_function; starpu_perfmodel_per_arch_size_base size_base; struct starpu_perfmodel_history_table *history; struct starpu_perfmodel_history_list *list; struct starpu_perfmodel_regression_model regression; char debug_path[256]; }; enum starpu_perfmodel_type { STARPU_PERFMODEL_INVALID=0, STARPU_PER_ARCH, STARPU_COMMON, STARPU_HISTORY_BASED, STARPU_REGRESSION_BASED, STARPU_NL_REGRESSION_BASED }; struct _starpu_perfmodel_state; typedef struct _starpu_perfmodel_state* starpu_perfmodel_state_t; struct starpu_perfmodel { enum starpu_perfmodel_type type; double (*cost_function)(struct starpu_task *, unsigned nimpl); double (*arch_cost_function)(struct starpu_task *, struct starpu_perfmodel_arch * arch, unsigned nimpl); size_t (*size_base)(struct starpu_task *, unsigned nimpl); uint32_t (*footprint)(struct starpu_task *); const char *symbol; unsigned is_loaded; unsigned benchmarking; unsigned is_init; starpu_perfmodel_state_t state; }; void starpu_perfmodel_init(struct starpu_perfmodel *model); int starpu_perfmodel_load_file(const char *filename, struct starpu_perfmodel *model); int starpu_perfmodel_load_symbol(const char *symbol, struct starpu_perfmodel *model); int starpu_perfmodel_unload_model(struct starpu_perfmodel *model); void starpu_perfmodel_get_model_path(const char *symbol, char *path, size_t maxlen); void starpu_perfmodel_free_sampling_directories(void); struct starpu_perfmodel_arch *starpu_worker_get_perf_archtype(int workerid, unsigned sched_ctx_id); int starpu_perfmodel_get_narch_combs(); int starpu_perfmodel_arch_comb_add(int ndevices, struct starpu_perfmodel_device* devices); int starpu_perfmodel_arch_comb_get(int ndevices, struct starpu_perfmodel_device *devices); struct starpu_perfmodel_arch *starpu_perfmodel_arch_comb_fetch(int comb); struct starpu_perfmodel_per_arch *starpu_perfmodel_get_model_per_arch(struct starpu_perfmodel *model, struct starpu_perfmodel_arch *arch, unsigned impl); struct starpu_perfmodel_per_arch *starpu_perfmodel_get_model_per_devices(struct starpu_perfmodel *model, int impl, ...); int starpu_perfmodel_set_per_devices_cost_function(struct starpu_perfmodel *model, int impl, starpu_perfmodel_per_arch_cost_function func, ...); int starpu_perfmodel_set_per_devices_size_base(struct starpu_perfmodel *model, int impl, starpu_perfmodel_per_arch_size_base func, ...); void starpu_perfmodel_debugfilepath(struct starpu_perfmodel *model, struct starpu_perfmodel_arch *arch, char *path, size_t maxlen, unsigned nimpl); char* starpu_perfmodel_get_archtype_name(enum starpu_worker_archtype archtype); void starpu_perfmodel_get_arch_name(struct starpu_perfmodel_arch *arch, char *archname, size_t maxlen, unsigned nimpl); double starpu_perfmodel_history_based_expected_perf(struct starpu_perfmodel *model, struct starpu_perfmodel_arch* arch, uint32_t footprint); void starpu_perfmodel_initialize(void); int starpu_perfmodel_list(FILE *output); void starpu_perfmodel_print(struct starpu_perfmodel *model, struct starpu_perfmodel_arch *arch, unsigned nimpl, char *parameter, uint32_t *footprint, FILE *output); int starpu_perfmodel_print_all(struct starpu_perfmodel *model, char *arch, char *parameter, uint32_t *footprint, FILE *output); int starpu_perfmodel_print_estimations(struct starpu_perfmodel *model, uint32_t footprint, FILE *output); int starpu_perfmodel_list_combs(FILE *output, struct starpu_perfmodel *model); void starpu_perfmodel_update_history(struct starpu_perfmodel *model, struct starpu_task *task, struct starpu_perfmodel_arch *arch, unsigned cpuid, unsigned nimpl, double measured); void starpu_perfmodel_directory(FILE *output); void starpu_bus_print_bandwidth(FILE *f); void starpu_bus_print_affinity(FILE *f); void starpu_bus_print_filenames(FILE *f); double starpu_transfer_bandwidth(unsigned src_node, unsigned dst_node); double starpu_transfer_latency(unsigned src_node, unsigned dst_node); double starpu_transfer_predict(unsigned src_node, unsigned dst_node, size_t size); #ifdef __cplusplus } #endif #endif /* __STARPU_PERFMODEL_H__ */ starpu-1.2.3+dfsg/include/starpu_profiling.h000066400000000000000000000106231320135501600211330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_PROFILING_H__ #define __STARPU_PROFILING_H__ #include #include #include #include #ifdef __cplusplus extern "C" { #endif #define STARPU_PROFILING_DISABLE 0 #define STARPU_PROFILING_ENABLE 1 struct starpu_profiling_task_info { struct timespec submit_time; struct timespec push_start_time; struct timespec push_end_time; struct timespec pop_start_time; struct timespec pop_end_time; struct timespec acquire_data_start_time; struct timespec acquire_data_end_time; struct timespec start_time; struct timespec end_time; struct timespec release_data_start_time; struct timespec release_data_end_time; struct timespec callback_start_time; struct timespec callback_end_time; /* TODO add expected length, expected start/end ? */ int workerid; uint64_t used_cycles; uint64_t stall_cycles; double energy_consumed; }; struct starpu_profiling_worker_info { struct timespec start_time; struct timespec total_time; struct timespec executing_time; struct timespec sleeping_time; int executed_tasks; uint64_t used_cycles; uint64_t stall_cycles; double energy_consumed; }; struct starpu_profiling_bus_info { struct timespec start_time; struct timespec total_time; int long long transferred_bytes; int transfer_count; }; void starpu_profiling_init(void); void starpu_profiling_set_id(int new_id); int starpu_profiling_status_set(int status); int starpu_profiling_status_get(void); #ifdef BUILDING_STARPU #include #ifdef __GNUC__ extern int _starpu_profiling; #define starpu_profiling_status_get() ({ \ int __ret; \ ANNOTATE_HAPPENS_AFTER(&_starpu_profiling); \ __ret = _starpu_profiling; \ ANNOTATE_HAPPENS_BEFORE(&_starpu_profiling); \ __ret; \ }) #endif #endif int starpu_profiling_worker_get_info(int workerid, struct starpu_profiling_worker_info *worker_info); int starpu_bus_get_count(void); int starpu_bus_get_id(int src, int dst); int starpu_bus_get_src(int busid); int starpu_bus_get_dst(int busid); int starpu_bus_get_profiling_info(int busid, struct starpu_profiling_bus_info *bus_info); /* Some helper functions to manipulate profiling API output */ /* Reset timespec */ static __starpu_inline void starpu_timespec_clear(struct timespec *tsp) { tsp->tv_sec = 0; tsp->tv_nsec = 0; } /* Computes result = a + b */ static __starpu_inline void starpu_timespec_add(struct timespec *a, struct timespec *b, struct timespec *result) { result->tv_sec = a->tv_sec + b->tv_sec; result->tv_nsec = a->tv_nsec + b->tv_nsec; if (result->tv_nsec >= 1000000000) { ++(result)->tv_sec; result->tv_nsec -= 1000000000; } } /* Computes res += b */ static __starpu_inline void starpu_timespec_accumulate(struct timespec *result, struct timespec *a) { result->tv_sec += a->tv_sec; result->tv_nsec += a->tv_nsec; if (result->tv_nsec >= 1000000000) { ++(result)->tv_sec; result->tv_nsec -= 1000000000; } } /* Computes result = a - b */ static __starpu_inline void starpu_timespec_sub(const struct timespec *a, const struct timespec *b, struct timespec *result) { result->tv_sec = a->tv_sec - b->tv_sec; result->tv_nsec = a->tv_nsec - b->tv_nsec; if ((result)->tv_nsec < 0) { --(result)->tv_sec; result->tv_nsec += 1000000000; } } #define starpu_timespec_cmp(a, b, CMP) \ (((a)->tv_sec == (b)->tv_sec) ? ((a)->tv_nsec CMP (b)->tv_nsec) : ((a)->tv_sec CMP (b)->tv_sec)) double starpu_timing_timespec_delay_us(struct timespec *start, struct timespec *end); double starpu_timing_timespec_to_us(struct timespec *ts); void starpu_profiling_bus_helper_display_summary(void); void starpu_profiling_worker_helper_display_summary(void); #ifdef __cplusplus } #endif #endif /* __STARPU_PROFILING_H__ */ starpu-1.2.3+dfsg/include/starpu_rand.h000066400000000000000000000050631320135501600200700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012, 2013, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_RAND_H__ #define __STARPU_RAND_H__ #include #include #ifdef __cplusplus extern "C" { #endif #ifdef STARPU_SIMGRID /* In simgrid mode, force using seed 0 by default to get reproducible behavior by default */ #define starpu_seed(seed) starpu_get_env_number_default("STARPU_RAND_SEED", 0) #else #define starpu_seed(seed) starpu_get_env_number_default("STARPU_RAND_SEED", (seed)) #endif #ifdef STARPU_USE_DRAND48 # define starpu_srand48(seed) srand48(starpu_seed(seed)) # define starpu_drand48() drand48() # define starpu_lrand48() lrand48() # define starpu_erand48(xsubi) erand48(xsubi) # ifdef STARPU_USE_ERAND48_R typedef struct drand48_data starpu_drand48_data; # define starpu_srand48_r(seed, buffer) srand48_r(starpu_seed(seed), buffer) # define starpu_drand48_r(buffer, result) drand48_r(buffer, result) # define starpu_lrand48_r(buffer, result) lrand48_r(buffer, result) # define starpu_erand48_r(xsubi, buffer, result) erand48_r(xsubi, buffer, result) #else typedef int starpu_drand48_data; # define starpu_srand48_r(seed, buffer) srand48(starpu_seed(seed)) # define starpu_drand48_r(buffer, result) do {*(result) = drand48(); } while (0) # define starpu_lrand48_r(buffer, result) do {*(result) = lrand48(); } while (0) # define starpu_erand48_r(xsubi, buffer, result) do {(void) buffer; *(result) = erand48(xsubi); } while (0) # endif #else typedef int starpu_drand48_data; # define starpu_srand48(seed) srand(starpu_seed(seed)) # define starpu_drand48() (double)(rand()) / RAND_MAX # define starpu_lrand48() rand() # define starpu_erand48(xsubi) starpu_drand48() # define starpu_srand48_r(seed, buffer) srand(starpu_seed(seed)) # define starpu_erand48_r(xsubi, buffer, result) do {(void) xsubi; (void) buffer; *(result) = ((double)(rand()) / RAND_MAX);} while (0) #endif #ifdef __cplusplus } #endif #endif /* __STARPU_RAND_H__ */ starpu-1.2.3+dfsg/include/starpu_scc.h000066400000000000000000000017571320135501600177220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_SCC_H__ #define __STARPU_SCC_H__ #include #ifdef STARPU_USE_SCC typedef void *starpu_scc_func_symbol_t; int starpu_scc_register_kernel(starpu_scc_func_symbol_t *symbol, const char *func_name); starpu_scc_kernel_t starpu_scc_get_kernel(starpu_scc_func_symbol_t symbol); #endif /* STARPU_USE_SCC */ #endif /* __STARPU_SCC_H__ */ starpu-1.2.3+dfsg/include/starpu_sched_component.h000066400000000000000000000244261320135501600223200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Simon Archipoff * Copyright (C) 2014 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_SCHED_COMPONENT_H__ #define __STARPU_SCHED_COMPONENT_H__ #include #ifdef STARPU_HAVE_HWLOC #include #endif #ifdef __cplusplus extern "C" { #endif enum starpu_sched_component_properties { STARPU_SCHED_COMPONENT_HOMOGENEOUS = (1<<0), STARPU_SCHED_COMPONENT_SINGLE_MEMORY_NODE = (1<<1) }; #define STARPU_SCHED_COMPONENT_IS_HOMOGENEOUS(component) ((component)->properties & STARPU_SCHED_COMPONENT_HOMOGENEOUS) #define STARPU_SCHED_COMPONENT_IS_SINGLE_MEMORY_NODE(component) ((component)->properties & STARPU_SCHED_COMPONENT_SINGLE_MEMORY_NODE) struct starpu_sched_component { struct starpu_sched_tree *tree; struct starpu_bitmap *workers; struct starpu_bitmap *workers_in_ctx; void *data; char *name; int nchildren; struct starpu_sched_component **children; int nparents; struct starpu_sched_component **parents; void (*add_child)(struct starpu_sched_component *component, struct starpu_sched_component *child); void (*remove_child)(struct starpu_sched_component *component, struct starpu_sched_component *child); void (*add_parent)(struct starpu_sched_component *component, struct starpu_sched_component *parent); void (*remove_parent)(struct starpu_sched_component *component, struct starpu_sched_component *parent); int (*push_task)(struct starpu_sched_component *, struct starpu_task *); struct starpu_task *(*pull_task)(struct starpu_sched_component *); int (*can_push)(struct starpu_sched_component *component); void (*can_pull)(struct starpu_sched_component *component); double (*estimated_load)(struct starpu_sched_component *component); double (*estimated_end)(struct starpu_sched_component *component); void (*deinit_data)(struct starpu_sched_component *component); void (*notify_change_workers)(struct starpu_sched_component *component); int properties; #ifdef STARPU_HAVE_HWLOC hwloc_obj_t obj; #else void *obj; #endif }; struct starpu_sched_tree { struct starpu_sched_component *root; struct starpu_bitmap *workers; unsigned sched_ctx_id; struct starpu_sched_component *worker_components[STARPU_NMAXWORKERS]; starpu_pthread_mutex_t lock; }; struct starpu_sched_tree *starpu_sched_tree_create(unsigned sched_ctx_id) STARPU_ATTRIBUTE_MALLOC; void starpu_sched_tree_destroy(struct starpu_sched_tree *tree); struct starpu_sched_tree *starpu_sched_tree_get(unsigned sched_ctx_id); void starpu_sched_tree_update_workers(struct starpu_sched_tree *t); void starpu_sched_tree_update_workers_in_ctx(struct starpu_sched_tree *t); int starpu_sched_tree_push_task(struct starpu_task *task); int starpu_sched_component_push_task(struct starpu_sched_component *from, struct starpu_sched_component *to, struct starpu_task *task); struct starpu_task *starpu_sched_tree_pop_task(unsigned sched_ctx); struct starpu_task *starpu_sched_component_pull_task(struct starpu_sched_component *from, struct starpu_sched_component *to); void starpu_sched_tree_add_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers); void starpu_sched_tree_remove_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers); struct starpu_sched_component *starpu_sched_component_create(struct starpu_sched_tree *tree, const char *name) STARPU_ATTRIBUTE_MALLOC; void starpu_sched_component_add_child(struct starpu_sched_component* component, struct starpu_sched_component * child); void starpu_sched_component_destroy(struct starpu_sched_component *component); void starpu_sched_component_destroy_rec(struct starpu_sched_component *component); int starpu_sched_component_can_execute_task(struct starpu_sched_component *component, struct starpu_task *task); int STARPU_WARN_UNUSED_RESULT starpu_sched_component_execute_preds(struct starpu_sched_component *component, struct starpu_task *task, double *length); double starpu_sched_component_transfer_length(struct starpu_sched_component *component, struct starpu_task *task); void starpu_sched_component_prefetch_on_node(struct starpu_sched_component *component, struct starpu_task *task); void starpu_sched_component_connect(struct starpu_sched_component *parent, struct starpu_sched_component *child); struct starpu_sched_component *starpu_sched_component_worker_get(unsigned sched_ctx, int workerid); int starpu_sched_component_worker_get_workerid(struct starpu_sched_component *worker_component); int starpu_sched_component_is_worker(struct starpu_sched_component *component); int starpu_sched_component_is_simple_worker(struct starpu_sched_component *component); int starpu_sched_component_is_combined_worker(struct starpu_sched_component *component); void starpu_sched_component_worker_pre_exec_hook(struct starpu_task *task); void starpu_sched_component_worker_post_exec_hook(struct starpu_task *task); double starpu_sched_component_estimated_load(struct starpu_sched_component * component); double starpu_sched_component_estimated_end_min(struct starpu_sched_component * component); double starpu_sched_component_estimated_end_average(struct starpu_sched_component * component); struct starpu_sched_component_fifo_data { unsigned ntasks_threshold; double exp_len_threshold; }; struct starpu_sched_component *starpu_sched_component_fifo_create(struct starpu_sched_tree *tree, struct starpu_sched_component_fifo_data *fifo_data) STARPU_ATTRIBUTE_MALLOC; int starpu_sched_component_is_fifo(struct starpu_sched_component *component); struct starpu_sched_component_prio_data { unsigned ntasks_threshold; double exp_len_threshold; }; struct starpu_sched_component *starpu_sched_component_prio_create(struct starpu_sched_tree *tree, struct starpu_sched_component_prio_data *prio_data) STARPU_ATTRIBUTE_MALLOC; int starpu_sched_component_is_prio(struct starpu_sched_component *component); struct starpu_sched_component *starpu_sched_component_work_stealing_create(struct starpu_sched_tree *tree, void *arg STARPU_ATTRIBUTE_UNUSED) STARPU_ATTRIBUTE_MALLOC; int starpu_sched_component_is_work_stealing(struct starpu_sched_component *component); int starpu_sched_tree_work_stealing_push_task(struct starpu_task *task); struct starpu_sched_component *starpu_sched_component_random_create(struct starpu_sched_tree *tree, void *arg STARPU_ATTRIBUTE_UNUSED) STARPU_ATTRIBUTE_MALLOC; int starpu_sched_component_is_random(struct starpu_sched_component *); struct starpu_sched_component *starpu_sched_component_eager_create(struct starpu_sched_tree *tree, void *arg STARPU_ATTRIBUTE_UNUSED) STARPU_ATTRIBUTE_MALLOC; int starpu_sched_component_is_eager(struct starpu_sched_component *); struct starpu_sched_component *starpu_sched_component_eager_calibration_create(struct starpu_sched_tree *tree, void *arg STARPU_ATTRIBUTE_UNUSED) STARPU_ATTRIBUTE_MALLOC; int starpu_sched_component_is_eager_calibration(struct starpu_sched_component *); struct starpu_sched_component_mct_data { double alpha; double beta; double _gamma; double idle_power; }; struct starpu_sched_component *starpu_sched_component_mct_create(struct starpu_sched_tree *tree, struct starpu_sched_component_mct_data *mct_data) STARPU_ATTRIBUTE_MALLOC; int starpu_sched_component_is_mct(struct starpu_sched_component *component); struct starpu_sched_component *starpu_sched_component_heft_create(struct starpu_sched_tree *tree, struct starpu_sched_component_mct_data *mct_data) STARPU_ATTRIBUTE_MALLOC; int starpu_sched_component_is_heft(struct starpu_sched_component *component); struct starpu_sched_component *starpu_sched_component_best_implementation_create(struct starpu_sched_tree *tree, void *arg STARPU_ATTRIBUTE_UNUSED) STARPU_ATTRIBUTE_MALLOC; struct starpu_sched_component_perfmodel_select_data { struct starpu_sched_component *calibrator_component; struct starpu_sched_component *no_perfmodel_component; struct starpu_sched_component *perfmodel_component; }; struct starpu_sched_component *starpu_sched_component_perfmodel_select_create(struct starpu_sched_tree *tree, struct starpu_sched_component_perfmodel_select_data *perfmodel_select_data) STARPU_ATTRIBUTE_MALLOC; int starpu_sched_component_is_perfmodel_select(struct starpu_sched_component *component); void starpu_initialize_prio_center_policy(unsigned sched_ctx_id); struct starpu_sched_component_composed_recipe; struct starpu_sched_component_composed_recipe *starpu_sched_component_composed_recipe_create(void) STARPU_ATTRIBUTE_MALLOC; struct starpu_sched_component_composed_recipe *starpu_sched_component_composed_recipe_create_singleton(struct starpu_sched_component *(*create_component)(struct starpu_sched_tree *tree, void *arg), void *arg) STARPU_ATTRIBUTE_MALLOC; void starpu_sched_component_composed_recipe_add(struct starpu_sched_component_composed_recipe *recipe, struct starpu_sched_component *(*create_component)(struct starpu_sched_tree *tree, void *arg), void *arg); void starpu_sched_component_composed_recipe_destroy(struct starpu_sched_component_composed_recipe *); struct starpu_sched_component *starpu_sched_component_composed_component_create(struct starpu_sched_tree *tree, struct starpu_sched_component_composed_recipe *recipe) STARPU_ATTRIBUTE_MALLOC; #ifdef STARPU_HAVE_HWLOC struct starpu_sched_component_specs { struct starpu_sched_component_composed_recipe *hwloc_machine_composed_sched_component; struct starpu_sched_component_composed_recipe *hwloc_component_composed_sched_component; struct starpu_sched_component_composed_recipe *hwloc_socket_composed_sched_component; struct starpu_sched_component_composed_recipe *hwloc_cache_composed_sched_component; struct starpu_sched_component_composed_recipe *(*worker_composed_sched_component)(enum starpu_worker_archtype archtype); int mix_heterogeneous_workers; }; struct starpu_sched_tree *starpu_sched_component_make_scheduler(unsigned sched_ctx_id, struct starpu_sched_component_specs s); #endif /* STARPU_HAVE_HWLOC */ #ifdef __cplusplus } #endif #endif /* __STARPU_SCHED_COMPONENT_H__ */ starpu-1.2.3+dfsg/include/starpu_sched_ctx.h000066400000000000000000000131431320135501600211060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 - 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_SCHED_CTX_H__ #define __STARPU_SCHED_CTX_H__ #include #ifdef __cplusplus extern "C" { #endif #define STARPU_SCHED_CTX_POLICY_NAME (1<<16) #define STARPU_SCHED_CTX_POLICY_STRUCT (2<<16) #define STARPU_SCHED_CTX_POLICY_MIN_PRIO (3<<16) #define STARPU_SCHED_CTX_POLICY_MAX_PRIO (4<<16) #define STARPU_SCHED_CTX_HIERARCHY_LEVEL (5<<16) #define STARPU_SCHED_CTX_NESTED (6<<16) #define STARPU_SCHED_CTX_AWAKE_WORKERS (7<<16) unsigned starpu_sched_ctx_create(int *workerids_ctx, int nworkers_ctx, const char *sched_ctx_name, ...); unsigned starpu_sched_ctx_create_inside_interval(const char *policy_name, const char *sched_ctx_name, int min_ncpus, int max_ncpus, int min_ngpus, int max_ngpus, unsigned allow_overlap); void starpu_sched_ctx_register_close_callback(unsigned sched_ctx_id, void (*close_callback)(unsigned sched_ctx_id, void* args), void *args); void starpu_sched_ctx_add_workers(int *workerids_ctx, int nworkers_ctx, unsigned sched_ctx_id); void starpu_sched_ctx_remove_workers(int *workerids_ctx, int nworkers_ctx, unsigned sched_ctx_id); void starpu_sched_ctx_display_workers(unsigned sched_ctx_id, FILE *f); void starpu_sched_ctx_delete(unsigned sched_ctx_id); void starpu_sched_ctx_set_inheritor(unsigned sched_ctx_id, unsigned inheritor); unsigned starpu_sched_ctx_get_inheritor(unsigned sched_ctx_id); unsigned starpu_sched_ctx_get_hierarchy_level(unsigned sched_ctx_id); void starpu_sched_ctx_set_context(unsigned *sched_ctx_id); unsigned starpu_sched_ctx_get_context(void); void starpu_sched_ctx_stop_task_submission(void); void starpu_sched_ctx_finished_submit(unsigned sched_ctx_id); unsigned starpu_sched_ctx_get_workers_list(unsigned sched_ctx_id, int **workerids); unsigned starpu_sched_ctx_get_workers_list_raw(unsigned sched_ctx_id, int **workerids); unsigned starpu_sched_ctx_get_nworkers(unsigned sched_ctx_id); unsigned starpu_sched_ctx_get_nshared_workers(unsigned sched_ctx_id, unsigned sched_ctx_id2); unsigned starpu_sched_ctx_contains_worker(int workerid, unsigned sched_ctx_id); unsigned starpu_sched_ctx_contains_type_of_worker(enum starpu_worker_archtype arch, unsigned sched_ctx_id); unsigned starpu_sched_ctx_worker_get_id(unsigned sched_ctx_id); unsigned starpu_sched_ctx_overlapping_ctxs_on_worker(int workerid); int starpu_sched_get_min_priority(void); int starpu_sched_get_max_priority(void); int starpu_sched_set_min_priority(int min_prio); int starpu_sched_set_max_priority(int max_prio); int starpu_sched_ctx_get_min_priority(unsigned sched_ctx_id); int starpu_sched_ctx_get_max_priority(unsigned sched_ctx_id); int starpu_sched_ctx_set_min_priority(unsigned sched_ctx_id, int min_prio); int starpu_sched_ctx_set_max_priority(unsigned sched_ctx_id, int max_prio); int starpu_sched_ctx_min_priority_is_set(unsigned sched_ctx_id); int starpu_sched_ctx_max_priority_is_set(unsigned sched_ctx_id); #define STARPU_MIN_PRIO (starpu_sched_get_min_priority()) #define STARPU_MAX_PRIO (starpu_sched_get_max_priority()) #define STARPU_DEFAULT_PRIO 0 struct starpu_worker_collection *starpu_sched_ctx_create_worker_collection(unsigned sched_ctx_id, enum starpu_worker_collection_type type) STARPU_ATTRIBUTE_MALLOC; void starpu_sched_ctx_delete_worker_collection(unsigned sched_ctx_id); struct starpu_worker_collection *starpu_sched_ctx_get_worker_collection(unsigned sched_ctx_id); void starpu_sched_ctx_set_policy_data(unsigned sched_ctx_id, void *policy_data); void *starpu_sched_ctx_get_policy_data(unsigned sched_ctx_id); void *starpu_sched_ctx_exec_parallel_code(void* (*func)(void*), void *param, unsigned sched_ctx_id); int starpu_sched_ctx_get_nready_tasks(unsigned sched_ctx_id); double starpu_sched_ctx_get_nready_flops(unsigned sched_ctx_id); void starpu_sched_ctx_set_priority(int *workers, int nworkers, unsigned sched_ctx_id, unsigned priority); void starpu_sched_ctx_set_priority_on_level(int* workers_to_add, unsigned nworkers_to_add, unsigned sched_ctx, unsigned priority); unsigned starpu_sched_ctx_get_priority(int worker, unsigned sched_ctx_id); void starpu_sched_ctx_get_available_cpuids(unsigned sched_ctx_id, int **cpuids, int *ncpuids); void starpu_sched_ctx_bind_current_thread_to_cpuid(unsigned cpuid); int starpu_sched_ctx_book_workers_for_task(unsigned sched_ctx_id, int *workerids, int nworkers); void starpu_sched_ctx_unbook_workers_for_task(unsigned sched_ctx_id, int master); /* return the first context (child of sched_ctx_id) where the workerid is master */ unsigned starpu_sched_ctx_worker_is_master_for_child_ctx(int workerid, unsigned sched_ctx_id); void starpu_sched_ctx_revert_task_counters(unsigned sched_ctx_id, double flops); void starpu_sched_ctx_move_task_to_ctx(struct starpu_task *task, unsigned sched_ctx); int starpu_sched_ctx_get_worker_rank(unsigned sched_ctx_id); #ifdef STARPU_USE_SC_HYPERVISOR void starpu_sched_ctx_call_pushed_task_cb(int workerid, unsigned sched_ctx_id); #endif /* STARPU_USE_SC_HYPERVISOR */ #ifdef __cplusplus } #endif #endif /* __STARPU_SCHED_CTX_H__ */ starpu-1.2.3+dfsg/include/starpu_sched_ctx_hypervisor.h000066400000000000000000000034361320135501600234040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 - 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_SCHED_CTX_HYPERVISOR_H__ #define __STARPU_SCHED_CTX_HYPERVISOR_H__ #ifdef __cplusplus extern "C" { #endif struct starpu_sched_ctx_performance_counters { void (*notify_idle_cycle)(unsigned sched_ctx_id, int worker, double idle_time); void (*notify_poped_task)(unsigned sched_ctx_id, int worker); void (*notify_pushed_task)(unsigned sched_ctx_id, int worker); void (*notify_post_exec_task)(struct starpu_task *task, size_t data_size, uint32_t footprint, int hypervisor_tag, double flops); void (*notify_submitted_job)(struct starpu_task *task, uint32_t footprint, size_t data_size); void (*notify_empty_ctx)(unsigned sched_ctx_id, struct starpu_task *task); void (*notify_delete_context)(unsigned sched_ctx); }; #ifdef STARPU_USE_SC_HYPERVISOR void starpu_sched_ctx_set_perf_counters(unsigned sched_ctx_id, void *perf_counters); #endif //STARPU_USE_SC_HYPERVISOR void starpu_sched_ctx_notify_hypervisor_exists(void); unsigned starpu_sched_ctx_check_if_hypervisor_exists(void); void starpu_sched_ctx_update_start_resizing_sample(unsigned sched_ctx_id, double start_sample); #ifdef __cplusplus } #endif #endif /* __STARPU_SCHED_CTX_HYPERVISOR_H__ */ starpu-1.2.3+dfsg/include/starpu_scheduler.h000066400000000000000000000114341320135501600211210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2017 Université de Bordeaux * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_SCHEDULER_H__ #define __STARPU_SCHEDULER_H__ #include #ifdef __cplusplus extern "C" { #endif struct starpu_task; struct starpu_sched_policy { void (*init_sched)(unsigned sched_ctx_id); void (*deinit_sched)(unsigned sched_ctx_id); int (*push_task)(struct starpu_task *); double (*simulate_push_task)(struct starpu_task *); void (*push_task_notify)(struct starpu_task *, int workerid, int perf_workerid, unsigned sched_ctx_id); struct starpu_task *(*pop_task)(unsigned sched_ctx_id); struct starpu_task *(*pop_every_task)(unsigned sched_ctx_id); void (*submit_hook)(struct starpu_task *task); void (*pre_exec_hook)(struct starpu_task *); void (*post_exec_hook)(struct starpu_task *); void (*do_schedule)(unsigned sched_ctx_id); void (*add_workers)(unsigned sched_ctx_id, int *workerids, unsigned nworkers); void (*remove_workers)(unsigned sched_ctx_id, int *workerids, unsigned nworkers); const char *policy_name; const char *policy_description; }; struct starpu_sched_policy **starpu_sched_get_predefined_policies(); void starpu_worker_get_sched_condition(int workerid, starpu_pthread_mutex_t **sched_mutex, starpu_pthread_cond_t **sched_cond); unsigned long starpu_task_get_job_id(struct starpu_task *task); /* This function must be called to wake up a worker that is sleeping on the cond. * It returns 0 whenever the worker is not in a sleeping state */ int starpu_wake_worker(int workerid); int starpu_wakeup_worker(int workerid, starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex); /* This is a version of starpu_wake_worker which assumes that the sched mutex is locked */ int starpu_wake_worker_locked(int workerid); /* This is a version of starpu_wakeup_worker which assumes that the sched mutex is locked */ int starpu_wakeup_worker_locked(int workerid, starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex); int starpu_worker_can_execute_task(unsigned workerid, struct starpu_task *task, unsigned nimpl); int starpu_worker_can_execute_task_impl(unsigned workerid, struct starpu_task *task, unsigned *impl_mask); int starpu_worker_can_execute_task_first_impl(unsigned workerid, struct starpu_task *task, unsigned *nimpl); int starpu_push_local_task(int workerid, struct starpu_task *task, int back); int starpu_push_task_end(struct starpu_task *task); int starpu_combined_worker_assign_workerid(int nworkers, int workerid_array[]); int starpu_combined_worker_get_description(int workerid, int *worker_size, int **combined_workerid); int starpu_combined_worker_can_execute_task(unsigned workerid, struct starpu_task *task, unsigned nimpl); int starpu_get_prefetch_flag(void); int starpu_prefetch_task_input_on_node(struct starpu_task *task, unsigned node); int starpu_idle_prefetch_task_input_on_node(struct starpu_task *task, unsigned node); uint32_t starpu_task_footprint(struct starpu_perfmodel *model, struct starpu_task *task, struct starpu_perfmodel_arch *arch, unsigned nimpl); uint32_t starpu_task_data_footprint(struct starpu_task *task); double starpu_task_expected_length(struct starpu_task *task, struct starpu_perfmodel_arch *arch, unsigned nimpl); double starpu_worker_get_relative_speedup(struct starpu_perfmodel_arch *perf_arch); double starpu_task_expected_data_transfer_time(unsigned memory_node, struct starpu_task *task); double starpu_data_expected_transfer_time(starpu_data_handle_t handle, unsigned memory_node, enum starpu_data_access_mode mode); double starpu_task_expected_energy(struct starpu_task *task, struct starpu_perfmodel_arch *arch, unsigned nimpl); double starpu_task_expected_conversion_time(struct starpu_task *task, struct starpu_perfmodel_arch *arch, unsigned nimpl); double starpu_task_bundle_expected_length(starpu_task_bundle_t bundle, struct starpu_perfmodel_arch *arch, unsigned nimpl); double starpu_task_bundle_expected_data_transfer_time(starpu_task_bundle_t bundle, unsigned memory_node); double starpu_task_bundle_expected_energy(starpu_task_bundle_t bundle, struct starpu_perfmodel_arch *arch, unsigned nimpl); void starpu_sched_ctx_worker_shares_tasks_lists(int workerid, int sched_ctx_id); #ifdef __cplusplus } #endif #endif /* __STARPU_SCHEDULER_H__ */ starpu-1.2.3+dfsg/include/starpu_simgrid_wrap.h000066400000000000000000000015401320135501600216270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_SIMGRID_WRAP_H__ #define __STARPU_SIMGRID_WRAP_H__ #include #ifdef STARPU_SIMGRID #ifndef main #define main starpu_main #endif #endif #endif /* __STARPU_SIMGRID_WRAP_H__ */ starpu-1.2.3+dfsg/include/starpu_sink.h000066400000000000000000000014101320135501600201000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_SINK_H__ #define __STARPU_SINK_H__ void starpu_sink_common_worker(int argc, char **argv); #endif /* __STARPU_SINK_H__ */ starpu-1.2.3+dfsg/include/starpu_stdlib.h000066400000000000000000000044141320135501600204240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_STDLIB_H__ #define __STARPU_STDLIB_H__ #include #ifdef __cplusplus extern "C" { #endif #define STARPU_MALLOC_PINNED ((1ULL)<<1) #define STARPU_MALLOC_COUNT ((1ULL)<<2) #define STARPU_MALLOC_NORECLAIM ((1ULL)<<3) #define STARPU_MEMORY_WAIT ((1ULL)<<4) #define STARPU_MEMORY_OVERFLOW ((1ULL)<<5) #define STARPU_MALLOC_SIMULATION_FOLDED ((1ULL)<<6) void starpu_malloc_set_align(size_t align); int starpu_malloc(void **A, size_t dim) STARPU_ATTRIBUTE_ALLOC_SIZE(2); int starpu_free(void *A); int starpu_malloc_flags(void **A, size_t dim, int flags) STARPU_ATTRIBUTE_ALLOC_SIZE(2); int starpu_free_flags(void *A, size_t dim, int flags); int starpu_memory_pin(void *addr, size_t size); int starpu_memory_unpin(void *addr, size_t size); starpu_ssize_t starpu_memory_get_total(unsigned node); starpu_ssize_t starpu_memory_get_available(unsigned node); void starpu_memory_wait_available(unsigned node, size_t size); /** * Try to allocate memory on the given node * * @param size amount of memory to allocate * @param node node where the memory is to be allocated * @return 1 if the given amount of memory was allocated on the given node */ int starpu_memory_allocate(unsigned node, size_t size, int flags); /** * Indicates the given amount of memory is going to be deallocated from the given node * * @param size amount of memory to be deallocated * @param node node where the memory is going to be deallocated */ void starpu_memory_deallocate(unsigned node, size_t size); void starpu_sleep(float nb_sec); #ifdef __cplusplus } #endif #endif /* __STARPU_STDLIB_H__ */ starpu-1.2.3+dfsg/include/starpu_task.h000066400000000000000000000242441320135501600201100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2017 CNRS * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2011, 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_TASK_H__ #define __STARPU_TASK_H__ #include #include #include #include #include #include #if defined STARPU_USE_CUDA && !defined STARPU_DONT_INCLUDE_CUDA_HEADERS # include #endif #ifdef __cplusplus extern "C" { #endif #define STARPU_NOWHERE ((1ULL)<<0) #define STARPU_CPU ((1ULL)<<1) #define STARPU_CUDA ((1ULL)<<3) #define STARPU_OPENCL ((1ULL)<<6) #define STARPU_MIC ((1ULL)<<7) #define STARPU_SCC ((1ULL)<<8) #define STARPU_CODELET_SIMGRID_EXECUTE (1<<0) #define STARPU_CUDA_ASYNC (1<<0) #define STARPU_OPENCL_ASYNC (1<<0) enum starpu_codelet_type { STARPU_SEQ = 0, STARPU_SPMD, STARPU_FORKJOIN }; enum starpu_task_status { STARPU_TASK_INVALID, #define STARPU_TASK_INVALID 0 STARPU_TASK_BLOCKED, STARPU_TASK_READY, STARPU_TASK_RUNNING, STARPU_TASK_FINISHED, STARPU_TASK_BLOCKED_ON_TAG, STARPU_TASK_BLOCKED_ON_TASK, STARPU_TASK_BLOCKED_ON_DATA, STARPU_TASK_STOPPED }; typedef uint64_t starpu_tag_t; typedef void (*starpu_cpu_func_t)(void **, void*); typedef void (*starpu_cuda_func_t)(void **, void*); typedef void (*starpu_opencl_func_t)(void **, void*); typedef void (*starpu_mic_kernel_t)(void **, void*); typedef void (*starpu_scc_kernel_t)(void **, void*); typedef starpu_mic_kernel_t (*starpu_mic_func_t)(void); typedef starpu_scc_kernel_t (*starpu_scc_func_t)(void); #define STARPU_MULTIPLE_CPU_IMPLEMENTATIONS ((starpu_cpu_func_t) -1) #define STARPU_MULTIPLE_CUDA_IMPLEMENTATIONS ((starpu_cuda_func_t) -1) #define STARPU_MULTIPLE_OPENCL_IMPLEMENTATIONS ((starpu_opencl_func_t) -1) #define STARPU_VARIABLE_NBUFFERS (-1) struct starpu_task; struct starpu_codelet { uint32_t where; int (*can_execute)(unsigned workerid, struct starpu_task *task, unsigned nimpl); enum starpu_codelet_type type; int max_parallelism; starpu_cpu_func_t cpu_func STARPU_DEPRECATED; starpu_cuda_func_t cuda_func STARPU_DEPRECATED; starpu_opencl_func_t opencl_func STARPU_DEPRECATED; starpu_cpu_func_t cpu_funcs[STARPU_MAXIMPLEMENTATIONS]; starpu_cuda_func_t cuda_funcs[STARPU_MAXIMPLEMENTATIONS]; char cuda_flags[STARPU_MAXIMPLEMENTATIONS]; starpu_opencl_func_t opencl_funcs[STARPU_MAXIMPLEMENTATIONS]; char opencl_flags[STARPU_MAXIMPLEMENTATIONS]; starpu_mic_func_t mic_funcs[STARPU_MAXIMPLEMENTATIONS]; starpu_scc_func_t scc_funcs[STARPU_MAXIMPLEMENTATIONS]; const char *cpu_funcs_name[STARPU_MAXIMPLEMENTATIONS]; int nbuffers; enum starpu_data_access_mode modes[STARPU_NMAXBUFS]; enum starpu_data_access_mode *dyn_modes; unsigned specific_nodes; int nodes[STARPU_NMAXBUFS]; int *dyn_nodes; struct starpu_perfmodel *model; struct starpu_perfmodel *energy_model; unsigned long per_worker_stats[STARPU_NMAXWORKERS]; const char *name; int flags; }; struct starpu_task { const char *name; struct starpu_codelet *cl; int nbuffers; starpu_data_handle_t handles[STARPU_NMAXBUFS]; void *interfaces[STARPU_NMAXBUFS]; enum starpu_data_access_mode modes[STARPU_NMAXBUFS]; starpu_data_handle_t *dyn_handles; void **dyn_interfaces; enum starpu_data_access_mode *dyn_modes; void *cl_arg; size_t cl_arg_size; void (*callback_func)(void *); void *callback_arg; /* must StarPU release callback_arg ? - 0 by default */ void (*prologue_callback_func)(void *); void *prologue_callback_arg; void (*prologue_callback_pop_func)(void *); void *prologue_callback_pop_arg; starpu_tag_t tag_id; unsigned cl_arg_free:1; unsigned callback_arg_free:1; /* must StarPU release prologue_callback_arg ? - 0 by default */ unsigned prologue_callback_arg_free:1; /* must StarPU release prologue_callback_pop_arg ? - 0 by default */ unsigned prologue_callback_pop_arg_free:1; unsigned use_tag:1; unsigned sequential_consistency:1; unsigned synchronous:1; unsigned execute_on_a_specific_worker:1; unsigned detach:1; unsigned destroy:1; unsigned regenerate:1; unsigned scheduled:1; unsigned int mf_skip:1; unsigned workerid; unsigned workerorder; int priority; enum starpu_task_status status; int magic; unsigned sched_ctx; int hypervisor_tag; unsigned possibly_parallel; starpu_task_bundle_t bundle; struct starpu_profiling_task_info *profiling_info; double flops; double predicted; double predicted_transfer; struct starpu_task *prev; struct starpu_task *next; void *starpu_private; unsigned prefetched; #ifdef STARPU_OPENMP struct starpu_omp_task *omp_task; #else void *omp_task; #endif }; /* Note: remember to update starpu_task_init as well */ #define STARPU_TASK_INITIALIZER \ { \ .cl = NULL, \ .cl_arg = NULL, \ .cl_arg_size = 0, \ .callback_func = NULL, \ .callback_arg = NULL, \ .priority = STARPU_DEFAULT_PRIO, \ .use_tag = 0, \ .sequential_consistency = 1, \ .synchronous = 0, \ .execute_on_a_specific_worker = 0, \ .workerorder = 0, \ .bundle = NULL, \ .detach = 1, \ .destroy = 0, \ .regenerate = 0, \ .status = STARPU_TASK_INVALID, \ .profiling_info = NULL, \ .predicted = NAN, \ .predicted_transfer = NAN, \ .starpu_private = NULL, \ .magic = 42, \ .sched_ctx = STARPU_NMAX_SCHED_CTXS, \ .hypervisor_tag = 0, \ .flops = 0.0, \ .scheduled = 0, \ .prefetched = 0, \ .dyn_handles = NULL, \ .dyn_interfaces = NULL, \ .dyn_modes = NULL, \ .name = NULL, \ .possibly_parallel = 0 \ } #define STARPU_TASK_GET_NBUFFERS(task) ((unsigned)((task)->cl->nbuffers == STARPU_VARIABLE_NBUFFERS ? ((task)->nbuffers) : ((task)->cl->nbuffers))) #define STARPU_TASK_GET_HANDLE(task, i) (((task)->dyn_handles) ? (task)->dyn_handles[i] : (task)->handles[i]) #define STARPU_TASK_GET_HANDLES(task) (((task)->dyn_handles) ? (task)->dyn_handles : (task)->handles) #define STARPU_TASK_SET_HANDLE(task, handle, i) do { if ((task)->dyn_handles) (task)->dyn_handles[i] = handle; else (task)->handles[i] = handle; } while(0) #define STARPU_CODELET_GET_MODE(codelet, i) (((codelet)->dyn_modes) ? (codelet)->dyn_modes[i] : (assert(i < STARPU_NMAXBUFS), (codelet)->modes[i])) #define STARPU_CODELET_SET_MODE(codelet, mode, i) do { if ((codelet)->dyn_modes) (codelet)->dyn_modes[i] = mode; else (codelet)->modes[i] = mode; } while(0) #define STARPU_TASK_GET_MODE(task, i) ((task)->cl->nbuffers == STARPU_VARIABLE_NBUFFERS || (task)->dyn_modes ? \ (((task)->dyn_modes) ? (task)->dyn_modes[i] : (task)->modes[i]) : \ STARPU_CODELET_GET_MODE((task)->cl, i) ) #define STARPU_TASK_SET_MODE(task, mode, i) do { \ if ((task)->cl->nbuffers == STARPU_VARIABLE_NBUFFERS || (task)->cl->nbuffers > STARPU_NMAXBUFS) \ if ((task)->dyn_modes) (task)->dyn_modes[i] = mode; else (task)->modes[i] = mode; \ else \ STARPU_CODELET_SET_MODE((task)->cl, mode, i); \ } while(0) #define STARPU_CODELET_GET_NODE(codelet, i) (((codelet)->dyn_nodes) ? (codelet)->dyn_nodes[i] : (codelet)->nodes[i]) #define STARPU_CODELET_SET_NODE(codelet, __node, i) do { if ((codelet)->dyn_nodes) (codelet)->dyn_nodes[i] = __node; else (codelet)->nodes[i] = __node; } while(0) void starpu_tag_declare_deps(starpu_tag_t id, unsigned ndeps, ...); void starpu_tag_declare_deps_array(starpu_tag_t id, unsigned ndeps, starpu_tag_t *array); void starpu_task_declare_deps_array(struct starpu_task *task, unsigned ndeps, struct starpu_task *task_array[]); int starpu_task_get_task_succs(struct starpu_task *task, unsigned ndeps, struct starpu_task *task_array[]); int starpu_task_get_task_scheduled_succs(struct starpu_task *task, unsigned ndeps, struct starpu_task *task_array[]); int starpu_tag_wait(starpu_tag_t id); int starpu_tag_wait_array(unsigned ntags, starpu_tag_t *id); void starpu_tag_notify_from_apps(starpu_tag_t id); void starpu_tag_restart(starpu_tag_t id); void starpu_tag_remove(starpu_tag_t id); void starpu_task_init(struct starpu_task *task); void starpu_task_clean(struct starpu_task *task); struct starpu_task *starpu_task_create(void) STARPU_ATTRIBUTE_MALLOC; void starpu_task_destroy(struct starpu_task *task); int starpu_task_submit(struct starpu_task *task) STARPU_WARN_UNUSED_RESULT; int starpu_task_submit_to_ctx(struct starpu_task *task, unsigned sched_ctx_id); int starpu_task_finished(struct starpu_task *task) STARPU_WARN_UNUSED_RESULT; int starpu_task_wait(struct starpu_task *task) STARPU_WARN_UNUSED_RESULT; int starpu_task_wait_for_all(void); int starpu_task_wait_for_n_submitted(unsigned n); int starpu_task_wait_for_all_in_ctx(unsigned sched_ctx_id); int starpu_task_wait_for_n_submitted_in_ctx(unsigned sched_ctx_id, unsigned n); int starpu_task_wait_for_no_ready(void); int starpu_task_nready(void); int starpu_task_nsubmitted(void); void starpu_iteration_push(unsigned long iteration); void starpu_iteration_pop(void); void starpu_do_schedule(void); void starpu_codelet_init(struct starpu_codelet *cl); void starpu_codelet_display_stats(struct starpu_codelet *cl); struct starpu_task *starpu_task_get_current(void); const char *starpu_task_get_model_name(struct starpu_task *task); const char *starpu_task_get_name(struct starpu_task *task); void starpu_parallel_task_barrier_init(struct starpu_task *task, int workerid); void starpu_parallel_task_barrier_init_n(struct starpu_task *task, int worker_size); struct starpu_task *starpu_task_dup(struct starpu_task *task); void starpu_task_set_implementation(struct starpu_task *task, unsigned impl); unsigned starpu_task_get_implementation(struct starpu_task *task); #ifdef __cplusplus } #endif #endif /* __STARPU_TASK_H__ */ starpu-1.2.3+dfsg/include/starpu_task_bundle.h000066400000000000000000000024101320135501600214300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2014 Université de Bordeaux * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_TASK_BUNDLE_H__ #define __STARPU_TASK_BUNDLE_H__ #ifdef __cplusplus extern "C" { #endif struct starpu_task; typedef struct _starpu_task_bundle *starpu_task_bundle_t; void starpu_task_bundle_create(starpu_task_bundle_t *bundle); int starpu_task_bundle_insert(starpu_task_bundle_t bundle, struct starpu_task *task); int starpu_task_bundle_remove(starpu_task_bundle_t bundle, struct starpu_task *task); void starpu_task_bundle_close(starpu_task_bundle_t bundle); #ifdef __cplusplus } #endif #endif /* __STARPU_TASK_BUNDLE_H__ */ starpu-1.2.3+dfsg/include/starpu_task_list.h000066400000000000000000000064501320135501600211420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012, 2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_TASK_LIST_H__ #define __STARPU_TASK_LIST_H__ #include #include #ifdef __cplusplus extern "C" { #endif struct starpu_task_list { struct starpu_task *head; struct starpu_task *tail; }; static STARPU_INLINE void starpu_task_list_init(struct starpu_task_list *list) { list->head = NULL; list->tail = NULL; } static STARPU_INLINE void starpu_task_list_push_front(struct starpu_task_list *list, struct starpu_task *task) { if (list->tail == NULL) { list->tail = task; } else { list->head->prev = task; } task->prev = NULL; task->next = list->head; list->head = task; } static STARPU_INLINE void starpu_task_list_push_back(struct starpu_task_list *list, struct starpu_task *task) { if (list->head == NULL) { list->head = task; } else { list->tail->next = task; } task->next = NULL; task->prev = list->tail; list->tail = task; } static STARPU_INLINE struct starpu_task *starpu_task_list_front(struct starpu_task_list *list) { return list->head; } static STARPU_INLINE struct starpu_task *starpu_task_list_back(struct starpu_task_list *list) { return list->tail; } static STARPU_INLINE int starpu_task_list_empty(struct starpu_task_list *list) { return (list->head == NULL); } static STARPU_INLINE void starpu_task_list_erase(struct starpu_task_list *list, struct starpu_task *task) { struct starpu_task *p = task->prev; if (p) { p->next = task->next; } else { list->head = task->next; } if (task->next) { task->next->prev = p; } else { list->tail = p; } task->prev = NULL; task->next = NULL; } static STARPU_INLINE struct starpu_task *starpu_task_list_pop_front(struct starpu_task_list *list) { struct starpu_task *task = list->head; if (task) starpu_task_list_erase(list, task); return task; } static STARPU_INLINE struct starpu_task *starpu_task_list_pop_back(struct starpu_task_list *list) { struct starpu_task *task = list->tail; if (task) starpu_task_list_erase(list, task); return task; } static STARPU_INLINE struct starpu_task *starpu_task_list_begin(struct starpu_task_list *list) { return list->head; } static STARPU_INLINE struct starpu_task *starpu_task_list_end(struct starpu_task_list *list STARPU_ATTRIBUTE_UNUSED) { return NULL; } static STARPU_INLINE struct starpu_task *starpu_task_list_next(struct starpu_task *task) { return task->next; } static STARPU_INLINE int starpu_task_list_ismember(struct starpu_task_list *list, struct starpu_task *look) { struct starpu_task *task; for (task = list->head; task != NULL; task = task->next) if (task == look) return 1; return 0; } #ifdef __cplusplus } #endif #endif /* __STARPU_TASK_LIST_H__ */ starpu-1.2.3+dfsg/include/starpu_task_util.h000066400000000000000000000062611320135501600211440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2015 Université de Bordeaux * Copyright (C) 2010-2014, 2016 CNRS * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_TASK_UTIL_H__ #define __STARPU_TASK_UTIL_H__ #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif void starpu_create_sync_task(starpu_tag_t sync_tag, unsigned ndeps, starpu_tag_t *deps, void (*callback)(void *), void *callback_arg); /* NOTE: when adding a value here, please make sure to update both * src/util/starpu_task_insert_utils.c (in two places) and * mpi/src/starpu_mpi_task_insert.c */ #define STARPU_MODE_SHIFT 17 #define STARPU_VALUE (1< #include #ifdef STARPU_SIMGRID #ifdef STARPU_HAVE_XBT_SYNCHRO_H #include #else #include #endif #ifdef STARPU_HAVE_SIMGRID_MSG_H #include #else #include #endif #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) #include #endif #include #ifdef __cplusplus extern "C" { #endif /* * Encapsulation of the pthread_create function. */ #ifdef STARPU_SIMGRID typedef msg_process_t starpu_pthread_t; typedef int starpu_pthread_attr_t; int starpu_pthread_create_on(char *name, starpu_pthread_t *thread, const starpu_pthread_attr_t *attr, void *(*start_routine) (void *), void *arg, msg_host_t host); int starpu_pthread_create(starpu_pthread_t *thread, const starpu_pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); int starpu_pthread_join(starpu_pthread_t thread, void **retval); int starpu_pthread_exit(void *retval) STARPU_ATTRIBUTE_NORETURN; int starpu_pthread_attr_init(starpu_pthread_attr_t *attr); int starpu_pthread_attr_destroy(starpu_pthread_attr_t *attr); int starpu_pthread_attr_setdetachstate(starpu_pthread_attr_t *attr, int detachstate); #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* STARPU_SIMGRID */ typedef pthread_t starpu_pthread_t; typedef pthread_attr_t starpu_pthread_attr_t; #define starpu_pthread_create pthread_create #define starpu_pthread_create_on(name, thread, attr, routine, arg, where) starpu_pthread_create(thread, attr, routine, arg) #define starpu_pthread_join pthread_join #define starpu_pthread_exit pthread_exit #define starpu_pthread_attr_init pthread_attr_init #define starpu_pthread_attr_destroy pthread_attr_destroy #define starpu_pthread_attr_setdetachstate pthread_attr_setdetachstate #endif /* STARPU_SIMGRID, _MSC_VER */ #ifdef STARPU_HAVE_PTHREAD_SETNAME_NP #ifdef STARPU_HAVE_DARWIN #define starpu_pthread_setname(name) pthread_setname_np(name) #else #define starpu_pthread_setname(name) pthread_setname_np(pthread_self(), name) #endif #else #define starpu_pthread_setname(name) #endif /* * Encapsulation of the pthread_mutex_* functions. */ #ifdef STARPU_SIMGRID typedef xbt_mutex_t starpu_pthread_mutex_t; typedef int starpu_pthread_mutexattr_t; #define STARPU_PTHREAD_MUTEX_INITIALIZER NULL int starpu_pthread_mutex_init(starpu_pthread_mutex_t *mutex, const starpu_pthread_mutexattr_t *mutexattr); int starpu_pthread_mutex_destroy(starpu_pthread_mutex_t *mutex); int starpu_pthread_mutex_lock(starpu_pthread_mutex_t *mutex); int starpu_pthread_mutex_unlock(starpu_pthread_mutex_t *mutex); int starpu_pthread_mutex_trylock(starpu_pthread_mutex_t *mutex); int starpu_pthread_mutexattr_gettype(const starpu_pthread_mutexattr_t *attr, int *type); int starpu_pthread_mutexattr_settype(starpu_pthread_mutexattr_t *attr, int type); int starpu_pthread_mutexattr_destroy(starpu_pthread_mutexattr_t *attr); int starpu_pthread_mutexattr_init(starpu_pthread_mutexattr_t *attr); #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* !STARPU_SIMGRID */ typedef pthread_mutex_t starpu_pthread_mutex_t; typedef pthread_mutexattr_t starpu_pthread_mutexattr_t; #define starpu_pthread_mutex_init pthread_mutex_init #define starpu_pthread_mutex_destroy pthread_mutex_destroy #define starpu_pthread_mutexattr_gettype pthread_mutexattr_gettype #define starpu_pthread_mutexattr_settype pthread_mutexattr_settype #define starpu_pthread_mutexattr_destroy pthread_mutexattr_destroy #define starpu_pthread_mutexattr_init pthread_mutexattr_init #ifdef STARPU_FXT_LOCK_TRACES int starpu_pthread_mutex_lock(starpu_pthread_mutex_t *mutex); int starpu_pthread_mutex_unlock(starpu_pthread_mutex_t *mutex); int starpu_pthread_mutex_trylock(starpu_pthread_mutex_t *mutex); #else #define starpu_pthread_mutex_lock pthread_mutex_lock #define starpu_pthread_mutex_unlock pthread_mutex_unlock #define starpu_pthread_mutex_trylock pthread_mutex_trylock #endif #define STARPU_PTHREAD_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER #endif /* STARPU_SIMGRID, _MSC_VER */ #if !defined(_MSC_VER) || defined(BUILDING_STARPU) int starpu_pthread_mutex_lock_sched(starpu_pthread_mutex_t *mutex); int starpu_pthread_mutex_unlock_sched(starpu_pthread_mutex_t *mutex); int starpu_pthread_mutex_trylock_sched(starpu_pthread_mutex_t *mutex); void starpu_pthread_mutex_check_sched(starpu_pthread_mutex_t *mutex, char *file, int line); #endif /* * Encapsulation of the pthread_key_* functions. */ #ifdef STARPU_SIMGRID typedef int starpu_pthread_key_t; int starpu_pthread_key_create(starpu_pthread_key_t *key, void (*destr_function) (void *)); int starpu_pthread_key_delete(starpu_pthread_key_t key); int starpu_pthread_setspecific(starpu_pthread_key_t key, const void *pointer); void *starpu_pthread_getspecific(starpu_pthread_key_t key); #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* !STARPU_SIMGRID */ typedef pthread_key_t starpu_pthread_key_t; #define starpu_pthread_key_create pthread_key_create #define starpu_pthread_key_delete pthread_key_delete #define starpu_pthread_setspecific pthread_setspecific #define starpu_pthread_getspecific pthread_getspecific #endif /* STARPU_SIMGRID, _MSC_VER */ /* * Encapsulation of the pthread_cond_* functions. */ #ifdef STARPU_SIMGRID typedef xbt_cond_t starpu_pthread_cond_t; typedef int starpu_pthread_condattr_t; #define STARPU_PTHREAD_COND_INITIALIZER NULL int starpu_pthread_cond_init(starpu_pthread_cond_t *cond, starpu_pthread_condattr_t *cond_attr); int starpu_pthread_cond_signal(starpu_pthread_cond_t *cond); int starpu_pthread_cond_broadcast(starpu_pthread_cond_t *cond); int starpu_pthread_cond_wait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex); int starpu_pthread_cond_timedwait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex, const struct timespec *abstime); int starpu_pthread_cond_destroy(starpu_pthread_cond_t *cond); #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* !STARPU_SIMGRID */ typedef pthread_cond_t starpu_pthread_cond_t; typedef pthread_condattr_t starpu_pthread_condattr_t; #define STARPU_PTHREAD_COND_INITIALIZER PTHREAD_COND_INITIALIZER #define starpu_pthread_cond_init pthread_cond_init #define starpu_pthread_cond_signal pthread_cond_signal #define starpu_pthread_cond_broadcast pthread_cond_broadcast #ifdef STARPU_FXT_LOCK_TRACES int starpu_pthread_cond_wait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex); #else #define starpu_pthread_cond_wait pthread_cond_wait #endif #define starpu_pthread_cond_timedwait pthread_cond_timedwait #define starpu_pthread_cond_destroy pthread_cond_destroy #endif /* STARPU_SIMGRID, _MSC_VER */ /* * Encapsulation of the pthread_rwlock_* functions. */ #ifdef STARPU_SIMGRID typedef xbt_mutex_t starpu_pthread_rwlock_t; typedef int starpu_pthread_rwlockattr_t; int starpu_pthread_rwlock_init(starpu_pthread_rwlock_t *rwlock, const starpu_pthread_rwlockattr_t *attr); int starpu_pthread_rwlock_destroy(starpu_pthread_rwlock_t *rwlock); int starpu_pthread_rwlock_rdlock(starpu_pthread_rwlock_t *rwlock); int starpu_pthread_rwlock_tryrdlock(starpu_pthread_rwlock_t *rwlock); int starpu_pthread_rwlock_wrlock(starpu_pthread_rwlock_t *rwlock); int starpu_pthread_rwlock_trywrlock(starpu_pthread_rwlock_t *rwlock); int starpu_pthread_rwlock_unlock(starpu_pthread_rwlock_t *rwlock); #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* !STARPU_SIMGRID */ typedef pthread_rwlock_t starpu_pthread_rwlock_t; typedef pthread_rwlockattr_t starpu_pthread_rwlockattr_t; #define starpu_pthread_rwlock_init pthread_rwlock_init #define starpu_pthread_rwlock_destroy pthread_rwlock_destroy #ifdef STARPU_FXT_LOCK_TRACES int starpu_pthread_rwlock_rdlock(starpu_pthread_rwlock_t *rwlock); int starpu_pthread_rwlock_tryrdlock(starpu_pthread_rwlock_t *rwlock); int starpu_pthread_rwlock_wrlock(starpu_pthread_rwlock_t *rwlock); int starpu_pthread_rwlock_trywrlock(starpu_pthread_rwlock_t *rwlock); int starpu_pthread_rwlock_unlock(starpu_pthread_rwlock_t *rwlock); #else #define starpu_pthread_rwlock_rdlock pthread_rwlock_rdlock #define starpu_pthread_rwlock_tryrdlock pthread_rwlock_tryrdlock #define starpu_pthread_rwlock_wrlock pthread_rwlock_wrlock #define starpu_pthread_rwlock_trywrlock pthread_rwlock_trywrlock #define starpu_pthread_rwlock_unlock pthread_rwlock_unlock #endif #endif /* STARPU_SIMGRID, _MSC_VER */ /* * Encapsulation of the pthread_barrier_* functions. */ #if defined(STARPU_SIMGRID) || (!defined(STARPU_HAVE_PTHREAD_BARRIER) && (!defined(_MSC_VER) || defined(BUILDING_STARPU))) #if defined(STARPU_SIMGRID) && defined(STARPU_SIMGRID_HAVE_XBT_BARRIER_INIT) typedef xbt_bar_t starpu_pthread_barrier_t; typedef int starpu_pthread_barrierattr_t; #define STARPU_PTHREAD_BARRIER_SERIAL_THREAD XBT_BARRIER_SERIAL_PROCESS #else typedef struct { starpu_pthread_mutex_t mutex; starpu_pthread_cond_t cond; starpu_pthread_cond_t cond_destroy; unsigned count; unsigned done; unsigned busy; } starpu_pthread_barrier_t; typedef int starpu_pthread_barrierattr_t; #define STARPU_PTHREAD_BARRIER_SERIAL_THREAD -1 #endif int starpu_pthread_barrier_init(starpu_pthread_barrier_t *barrier, const starpu_pthread_barrierattr_t *attr, unsigned count); int starpu_pthread_barrier_destroy(starpu_pthread_barrier_t *barrier); int starpu_pthread_barrier_wait(starpu_pthread_barrier_t *barrier); #elif !defined(_MSC_VER) /* STARPU_SIMGRID, !STARPU_HAVE_PTHREAD_BARRIER */ typedef pthread_barrier_t starpu_pthread_barrier_t; typedef pthread_barrierattr_t starpu_pthread_barrierattr_t; #define starpu_pthread_barrier_init pthread_barrier_init #define starpu_pthread_barrier_destroy pthread_barrier_destroy #ifdef STARPU_FXT_LOCK_TRACES int starpu_pthread_barrier_wait(starpu_pthread_barrier_t *barrier); #else #define starpu_pthread_barrier_wait pthread_barrier_wait #endif #define STARPU_PTHREAD_BARRIER_SERIAL_THREAD PTHREAD_BARRIER_SERIAL_THREAD #endif /* STARPU_SIMGRID, !STARPU_HAVE_PTHREAD_BARRIER, _MSC_VER */ /* * Encapsulation of the pthread_spin_* functions. */ #if defined(STARPU_SIMGRID) || (defined(STARPU_LINUX_SYS) && defined(STARPU_HAVE_XCHG)) || !defined(STARPU_HAVE_PTHREAD_SPIN_LOCK) typedef struct { #ifdef STARPU_SIMGRID int taken; #elif defined(STARPU_LINUX_SYS) && defined(STARPU_HAVE_XCHG) unsigned taken STARPU_ATTRIBUTE_ALIGNED(16); #else /* we only have a trivial implementation yet ! */ uint32_t taken STARPU_ATTRIBUTE_ALIGNED(16); #endif } starpu_pthread_spinlock_t; int starpu_pthread_spin_init(starpu_pthread_spinlock_t *lock, int pshared); int starpu_pthread_spin_destroy(starpu_pthread_spinlock_t *lock); int starpu_pthread_spin_lock(starpu_pthread_spinlock_t *lock); int starpu_pthread_spin_trylock(starpu_pthread_spinlock_t *lock); int starpu_pthread_spin_unlock(starpu_pthread_spinlock_t *lock); #elif !defined(_MSC_VER) /* !( defined(STARPU_SIMGRID) || !defined(STARPU_HAVE_PTHREAD_SPIN_LOCK)) */ typedef pthread_spinlock_t starpu_pthread_spinlock_t; #define starpu_pthread_spin_init pthread_spin_init #define starpu_pthread_spin_destroy pthread_spin_destroy #define starpu_pthread_spin_lock pthread_spin_lock #define starpu_pthread_spin_trylock pthread_spin_trylock #define starpu_pthread_spin_unlock pthread_spin_unlock #endif /* !( defined(STARPU_SIMGRID) || !defined(STARPU_HAVE_PTHREAD_SPIN_LOCK)) */ /* * Other needed pthread definitions */ #if defined(_MSC_VER) && !defined(BUILDING_STARPU) typedef void* starpu_pthread_rwlock_t; typedef void* starpu_pthread_mutex_t; typedef void* starpu_pthread_cond_t; typedef void* starpu_pthread_barrier_t; #endif /* _MSC_VER */ #ifdef __cplusplus } #endif #endif /* __STARPU_THREAD_H__ */ starpu-1.2.3+dfsg/include/starpu_thread_util.h000066400000000000000000000405751320135501600214570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2014, 2016-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_THREAD_UTIL_H__ #define __STARPU_THREAD_UTIL_H__ #include #include #if !(defined(_MSC_VER) && !defined(BUILDING_STARPU)) /* * Encapsulation of the starpu_pthread_create_* functions. */ #define STARPU_PTHREAD_CREATE_ON(name, thread, attr, routine, arg, where) do { \ int p_ret = starpu_pthread_create_on((name), (thread), (attr), (routine), (arg), (where)); \ if (STARPU_UNLIKELY(p_ret != 0)) { \ fprintf(stderr, \ "%s:%d starpu_pthread_create_on: %s\n", \ __FILE__, __LINE__, strerror(p_ret)); \ STARPU_ABORT(); \ } \ } while (0) #define STARPU_PTHREAD_CREATE(thread, attr, routine, arg) do { \ int p_ret = starpu_pthread_create((thread), (attr), (routine), (arg)); \ if (STARPU_UNLIKELY(p_ret != 0)) { \ fprintf(stderr, \ "%s:%d starpu_pthread_create: %s\n", \ __FILE__, __LINE__, strerror(p_ret)); \ STARPU_ABORT(); \ } \ } while (0) /* * Encapsulation of the starpu_pthread_mutex_* functions. */ #define STARPU_PTHREAD_MUTEX_INIT(mutex, attr) do { \ int p_ret = starpu_pthread_mutex_init((mutex), (attr)); \ if (STARPU_UNLIKELY(p_ret)) { \ fprintf(stderr, \ "%s:%d starpu_pthread_mutex_init: %s\n", \ __FILE__, __LINE__, strerror(p_ret)); \ STARPU_ABORT(); \ } \ } while (0) #define STARPU_PTHREAD_MUTEX_DESTROY(mutex) do { \ int p_ret = starpu_pthread_mutex_destroy(mutex); \ if (STARPU_UNLIKELY(p_ret)) { \ fprintf(stderr, \ "%s:%d starpu_pthread_mutex_destroy: %s\n", \ __FILE__, __LINE__, strerror(p_ret)); \ STARPU_ABORT(); \ } \ } while(0) #ifdef STARPU_DEBUG #define _STARPU_CHECK_NOT_SCHED_MUTEX(mutex, file, line) \ starpu_pthread_mutex_check_sched((mutex), file, line) #else #define _STARPU_CHECK_NOT_SCHED_MUTEX(mutex, file, line) #endif #define STARPU_PTHREAD_MUTEX_LOCK(mutex) do { \ int p_ret = starpu_pthread_mutex_lock(mutex); \ if (STARPU_UNLIKELY(p_ret)) { \ fprintf(stderr, \ "%s:%d starpu_pthread_mutex_lock: %s\n", \ __FILE__, __LINE__, strerror(p_ret)); \ STARPU_ABORT(); \ } \ _STARPU_CHECK_NOT_SCHED_MUTEX(mutex, __FILE__, __LINE__); \ } while (0) #define STARPU_PTHREAD_MUTEX_LOCK_SCHED(mutex) do { \ int p_ret = starpu_pthread_mutex_lock_sched(mutex); \ if (STARPU_UNLIKELY(p_ret)) { \ fprintf(stderr, \ "%s:%d starpu_pthread_mutex_lock: %s\n", \ __FILE__, __LINE__, strerror(p_ret)); \ STARPU_ABORT(); \ } \ } while (0) #define STARPU_PTHREAD_MUTEX_TRYLOCK(mutex) \ _starpu_pthread_mutex_trylock(mutex, __FILE__, __LINE__) static STARPU_INLINE int _starpu_pthread_mutex_trylock(starpu_pthread_mutex_t *mutex, char *file, int line) { int p_ret = starpu_pthread_mutex_trylock(mutex); if (STARPU_UNLIKELY(p_ret != 0 && p_ret != EBUSY)) { fprintf(stderr, "%s:%d starpu_pthread_mutex_trylock: %s\n", file, line, strerror(p_ret)); STARPU_ABORT(); } _STARPU_CHECK_NOT_SCHED_MUTEX(mutex, file, line); return p_ret; } #define STARPU_PTHREAD_MUTEX_TRYLOCK_SCHED(mutex) \ _starpu_pthread_mutex_trylock_sched(mutex, __FILE__, __LINE__) static STARPU_INLINE int _starpu_pthread_mutex_trylock_sched(starpu_pthread_mutex_t *mutex, char *file, int line) { int p_ret = starpu_pthread_mutex_trylock_sched(mutex); if (STARPU_UNLIKELY(p_ret != 0 && p_ret != EBUSY)) { fprintf(stderr, "%s:%d starpu_pthread_mutex_trylock: %s\n", file, line, strerror(p_ret)); STARPU_ABORT(); } return p_ret; } #define STARPU_PTHREAD_MUTEX_UNLOCK(mutex) do { \ _STARPU_CHECK_NOT_SCHED_MUTEX(mutex, __FILE__, __LINE__); \ int p_ret = starpu_pthread_mutex_unlock(mutex); \ if (STARPU_UNLIKELY(p_ret)) { \ fprintf(stderr, \ "%s:%d starpu_pthread_mutex_unlock: %s\n", \ __FILE__, __LINE__, strerror(p_ret)); \ STARPU_ABORT(); \ } \ } while (0) #define STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(mutex) do { \ int p_ret = starpu_pthread_mutex_unlock_sched(mutex); \ if (STARPU_UNLIKELY(p_ret)) { \ fprintf(stderr, \ "%s:%d starpu_pthread_mutex_unlock: %s\n", \ __FILE__, __LINE__, strerror(p_ret)); \ STARPU_ABORT(); \ } \ } while (0) /* * Encapsulation of the starpu_pthread_key_* functions. */ #define STARPU_PTHREAD_KEY_CREATE(key, destr) do { \ int p_ret = starpu_pthread_key_create((key), (destr)); \ if (STARPU_UNLIKELY(p_ret != 0)) { \ fprintf(stderr, \ "%s:%d starpu_pthread_key_create: %s\n", \ __FILE__, __LINE__, strerror(p_ret)); \ } \ } while (0) #define STARPU_PTHREAD_KEY_DELETE(key) do { \ int p_ret = starpu_pthread_key_delete((key)); \ if (STARPU_UNLIKELY(p_ret != 0)) { \ fprintf(stderr, \ "%s:%d starpu_pthread_key_delete: %s\n", \ __FILE__, __LINE__, strerror(p_ret)); \ } \ } while (0) #define STARPU_PTHREAD_SETSPECIFIC(key, ptr) do { \ int p_ret = starpu_pthread_setspecific((key), (ptr)); \ if (STARPU_UNLIKELY(p_ret != 0)) { \ fprintf(stderr, \ "%s:%d starpu_pthread_setspecific: %s\n", \ __FILE__, __LINE__, strerror(p_ret)); \ }; \ } while (0) #define STARPU_PTHREAD_GETSPECIFIC(key) starpu_pthread_getspecific((key)) /* * Encapsulation of the starpu_pthread_rwlock_* functions. */ #define STARPU_PTHREAD_RWLOCK_INIT(rwlock, attr) do { \ int p_ret = starpu_pthread_rwlock_init((rwlock), (attr)); \ if (STARPU_UNLIKELY(p_ret)) { \ fprintf(stderr, \ "%s:%d starpu_pthread_rwlock_init: %s\n", \ __FILE__, __LINE__, strerror(p_ret)); \ STARPU_ABORT(); \ } \ } while (0) #define STARPU_PTHREAD_RWLOCK_RDLOCK(rwlock) do { \ int p_ret = starpu_pthread_rwlock_rdlock(rwlock); \ if (STARPU_UNLIKELY(p_ret)) { \ fprintf(stderr, \ "%s:%d starpu_pthread_rwlock_rdlock: %s\n", \ __FILE__, __LINE__, strerror(p_ret)); \ STARPU_ABORT(); \ } \ } while (0) #define STARPU_PTHREAD_RWLOCK_TRYRDLOCK(rwlock) \ _starpu_pthread_rwlock_tryrdlock(rwlock, __FILE__, __LINE__) static STARPU_INLINE int _starpu_pthread_rwlock_tryrdlock(starpu_pthread_rwlock_t *rwlock, char *file, int line) { int p_ret = starpu_pthread_rwlock_tryrdlock(rwlock); if (STARPU_UNLIKELY(p_ret != 0 && p_ret != EBUSY)) { fprintf(stderr, "%s:%d starpu_pthread_rwlock_tryrdlock: %s\n", file, line, strerror(p_ret)); STARPU_ABORT(); } return p_ret; } #define STARPU_PTHREAD_RWLOCK_WRLOCK(rwlock) do { \ int p_ret = starpu_pthread_rwlock_wrlock(rwlock); \ if (STARPU_UNLIKELY(p_ret)) { \ fprintf(stderr, \ "%s:%d starpu_pthread_rwlock_wrlock: %s\n", \ __FILE__, __LINE__, strerror(p_ret)); \ STARPU_ABORT(); \ } \ } while (0) #define STARPU_PTHREAD_RWLOCK_TRYWRLOCK(rwlock) \ _starpu_pthread_rwlock_trywrlock(rwlock, __FILE__, __LINE__) static STARPU_INLINE int _starpu_pthread_rwlock_trywrlock(starpu_pthread_rwlock_t *rwlock, char *file, int line) { int p_ret = starpu_pthread_rwlock_trywrlock(rwlock); if (STARPU_UNLIKELY(p_ret != 0 && p_ret != EBUSY)) { fprintf(stderr, "%s:%d starpu_pthread_rwlock_trywrlock: %s\n", file, line, strerror(p_ret)); STARPU_ABORT(); } return p_ret; } #define STARPU_PTHREAD_RWLOCK_UNLOCK(rwlock) do { \ int p_ret = starpu_pthread_rwlock_unlock(rwlock); \ if (STARPU_UNLIKELY(p_ret)) { \ fprintf(stderr, \ "%s:%d starpu_pthread_rwlock_unlock: %s\n", \ __FILE__, __LINE__, strerror(p_ret)); \ STARPU_ABORT(); \ } \ } while (0) #define STARPU_PTHREAD_RWLOCK_DESTROY(rwlock) do { \ int p_ret = starpu_pthread_rwlock_destroy(rwlock); \ if (STARPU_UNLIKELY(p_ret)) { \ fprintf(stderr, \ "%s:%d starpu_pthread_rwlock_destroy: %s\n", \ __FILE__, __LINE__, strerror(p_ret)); \ STARPU_ABORT(); \ } \ } while (0) /* * Encapsulation of the starpu_pthread_cond_* functions. */ #define STARPU_PTHREAD_COND_INIT(cond, attr) do { \ int p_ret = starpu_pthread_cond_init((cond), (attr)); \ if (STARPU_UNLIKELY(p_ret)) { \ fprintf(stderr, \ "%s:%d starpu_pthread_cond_init: %s\n", \ __FILE__, __LINE__, strerror(p_ret)); \ STARPU_ABORT(); \ } \ } while (0) #define STARPU_PTHREAD_COND_DESTROY(cond) do { \ int p_ret = starpu_pthread_cond_destroy(cond); \ if (STARPU_UNLIKELY(p_ret)) { \ fprintf(stderr, \ "%s:%d starpu_pthread_cond_destroy: %s\n", \ __FILE__, __LINE__, strerror(p_ret)); \ STARPU_ABORT(); \ } \ } while (0) #define STARPU_PTHREAD_COND_SIGNAL(cond) do { \ int p_ret = starpu_pthread_cond_signal(cond); \ if (STARPU_UNLIKELY(p_ret)) { \ fprintf(stderr, \ "%s:%d starpu_pthread_cond_signal: %s\n", \ __FILE__, __LINE__, strerror(p_ret)); \ STARPU_ABORT(); \ } \ } while (0) #define STARPU_PTHREAD_COND_BROADCAST(cond) do { \ int p_ret = starpu_pthread_cond_broadcast(cond); \ if (STARPU_UNLIKELY(p_ret)) { \ fprintf(stderr, \ "%s:%d starpu_pthread_cond_broadcast: %s\n", \ __FILE__, __LINE__, strerror(p_ret)); \ STARPU_ABORT(); \ } \ } while (0) #define STARPU_PTHREAD_COND_WAIT(cond, mutex) do { \ int p_ret = starpu_pthread_cond_wait((cond), (mutex)); \ if (STARPU_UNLIKELY(p_ret)) { \ fprintf(stderr, \ "%s:%d starpu_pthread_cond_wait: %s\n", \ __FILE__, __LINE__, strerror(p_ret)); \ STARPU_ABORT(); \ } \ } while (0) /* * Encapsulation of the starpu_pthread_barrier_* functions. */ #define STARPU_PTHREAD_BARRIER_INIT(barrier, attr, count) do { \ int p_ret = starpu_pthread_barrier_init((barrier), (attr), (count)); \ if (STARPU_UNLIKELY(p_ret)) { \ fprintf(stderr, \ "%s:%d starpu_pthread_barrier_init: %s\n", \ __FILE__, __LINE__, strerror(p_ret)); \ STARPU_ABORT(); \ } \ } while (0) #define STARPU_PTHREAD_BARRIER_DESTROY(barrier) do { \ int p_ret = starpu_pthread_barrier_destroy((barrier)); \ if (STARPU_UNLIKELY(p_ret)) { \ fprintf(stderr, \ "%s:%d starpu_pthread_barrier_destroy: %s\n", \ __FILE__, __LINE__, strerror(p_ret)); \ STARPU_ABORT(); \ } \ } while (0) #define STARPU_PTHREAD_BARRIER_WAIT(barrier) do { \ int p_ret = starpu_pthread_barrier_wait((barrier)); \ if (STARPU_UNLIKELY(!((p_ret == 0) || (p_ret == STARPU_PTHREAD_BARRIER_SERIAL_THREAD)))) { \ fprintf(stderr, \ "%s:%d starpu_pthread_barrier_wait: %s\n", \ __FILE__, __LINE__, strerror(p_ret)); \ STARPU_ABORT(); \ } \ } while (0) #endif /* _MSC_VER */ #endif /* __STARPU_THREAD_UTIL_H__ */ starpu-1.2.3+dfsg/include/starpu_top.h000066400000000000000000000067121320135501600177500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 William Braik, Yann Courtois, Jean-Marie Couteyen, Anthony * Roy * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_TOP_H__ #define __STARPU_TOP_H__ #include #include #include #ifdef __cplusplus extern "C" { #endif enum starpu_top_data_type { STARPU_TOP_DATA_BOOLEAN, STARPU_TOP_DATA_INTEGER, STARPU_TOP_DATA_FLOAT }; struct starpu_top_data { unsigned int id; const char *name; int int_min_value; int int_max_value; double double_min_value; double double_max_value; int active; enum starpu_top_data_type type; struct starpu_top_data *next; }; enum starpu_top_param_type { STARPU_TOP_PARAM_BOOLEAN, STARPU_TOP_PARAM_INTEGER, STARPU_TOP_PARAM_FLOAT, STARPU_TOP_PARAM_ENUM }; struct starpu_top_param { unsigned int id; const char *name; enum starpu_top_param_type type; void *value; char **enum_values; int nb_values; void (*callback)(struct starpu_top_param*); int int_min_value; int int_max_value; double double_min_value; double double_max_value; struct starpu_top_param *next; }; enum starpu_top_message_type { TOP_TYPE_GO, TOP_TYPE_SET, TOP_TYPE_CONTINUE, TOP_TYPE_ENABLE, TOP_TYPE_DISABLE, TOP_TYPE_DEBUG, TOP_TYPE_UNKNOW }; struct starpu_top_data *starpu_top_add_data_boolean(const char *data_name, int active); struct starpu_top_data *starpu_top_add_data_integer(const char *data_name, int minimum_value, int maximum_value, int active); struct starpu_top_data *starpu_top_add_data_float(const char *data_name, double minimum_value, double maximum_value, int active); struct starpu_top_param *starpu_top_register_parameter_boolean(const char *param_name, int *parameter_field, void (*callback)(struct starpu_top_param*)); struct starpu_top_param *starpu_top_register_parameter_integer(const char *param_name, int *parameter_field, int minimum_value, int maximum_value, void (*callback)(struct starpu_top_param*)); struct starpu_top_param *starpu_top_register_parameter_float(const char *param_name, double *parameter_field, double minimum_value, double maximum_value, void (*callback)(struct starpu_top_param*)); struct starpu_top_param *starpu_top_register_parameter_enum(const char *param_name, int *parameter_field, char **values, int nb_values, void (*callback)(struct starpu_top_param*)); void starpu_top_init_and_wait(const char *server_name); void starpu_top_update_parameter(const struct starpu_top_param *param); void starpu_top_update_data_boolean(const struct starpu_top_data *data, int value); void starpu_top_update_data_integer(const struct starpu_top_data *data, int value); void starpu_top_update_data_float(const struct starpu_top_data *data, double value); void starpu_top_task_prevision(struct starpu_task *task, int devid, unsigned long long start, unsigned long long end); void starpu_top_debug_log(const char *message); void starpu_top_debug_lock(const char *message); #ifdef __cplusplus } #endif #endif /* __STARPU_TOP_H__ */ starpu-1.2.3+dfsg/include/starpu_tree.h000066400000000000000000000027311320135501600201020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2013 Université de Bordeaux * Copyright (C) 2010-2014 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_TREE_H__ #define __STARPU_TREE_H__ #ifdef __cplusplus extern "C" { #endif struct starpu_tree { struct starpu_tree *nodes; struct starpu_tree *father; int arity; int id; int level; int is_pu; }; void starpu_tree_reset_visited(struct starpu_tree *tree, char *visited); void starpu_tree_prepare_children(unsigned arity, struct starpu_tree *father); void starpu_tree_insert(struct starpu_tree *tree, int id, int level, int is_pu, int arity, struct starpu_tree *father); struct starpu_tree *starpu_tree_get(struct starpu_tree *tree, int id); struct starpu_tree *starpu_tree_get_neighbour(struct starpu_tree *tree, struct starpu_tree *node, char *visited, char *present); void starpu_tree_free(struct starpu_tree *tree); #ifdef __cplusplus } #endif #endif /* __STARPU_TREE_H__ */ starpu-1.2.3+dfsg/include/starpu_util.h000066400000000000000000000377011320135501600201250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_UTIL_H__ #define __STARPU_UTIL_H__ #include #include #include #include #include #ifdef __GLIBC__ #include #endif #ifdef __cplusplus extern "C" { #endif #if defined __GNUC__ && defined __GNUC_MINOR__ # define STARPU_GNUC_PREREQ(maj, min) \ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) #else # define STARPU_GNUC_PREREQ(maj, min) 0 #endif #ifdef __GNUC__ # define STARPU_UNLIKELY(expr) (__builtin_expect(!!(expr),0)) # define STARPU_LIKELY(expr) (__builtin_expect(!!(expr),1)) # define STARPU_ATTRIBUTE_UNUSED __attribute__((unused)) # define STARPU_ATTRIBUTE_NORETURN __attribute__((noreturn)) # define STARPU_ATTRIBUTE_INTERNAL __attribute__ ((visibility ("internal"))) # define STARPU_ATTRIBUTE_MALLOC __attribute__((malloc)) # define STARPU_ATTRIBUTE_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) # define STARPU_ATTRIBUTE_PURE __attribute__((pure)) # define STARPU_ATTRIBUTE_ALIGNED(size) __attribute__((aligned(size))) # define STARPU_ATTRIBUTE_FORMAT(type, string, first) __attribute__((format(type, string, first))) #else # define STARPU_UNLIKELY(expr) (expr) # define STARPU_LIKELY(expr) (expr) # define STARPU_ATTRIBUTE_UNUSED # define STARPU_ATTRIBUTE_NORETURN # define STARPU_ATTRIBUTE_INTERNAL # define STARPU_ATTRIBUTE_MALLOC # define STARPU_ATTRIBUTE_WARN_UNUSED_RESULT # define STARPU_ATTRIBUTE_PURE # define STARPU_ATTRIBUTE_ALIGNED(size) # define STARPU_ATTRIBUTE_FORMAT(type, string, first) #endif /* Note that if we're compiling C++, then just use the "inline" keyword, since it's part of C++ */ #if defined(c_plusplus) || defined(__cplusplus) # define STARPU_INLINE inline #elif defined(_MSC_VER) || defined(__HP_cc) # define STARPU_INLINE __inline #else # define STARPU_INLINE __inline__ #endif #if STARPU_GNUC_PREREQ(4, 3) # define STARPU_ATTRIBUTE_CALLOC_SIZE(num,size) __attribute__((alloc_size(num,size))) # define STARPU_ATTRIBUTE_ALLOC_SIZE(size) __attribute__((alloc_size(size))) #else # define STARPU_ATTRIBUTE_CALLOC_SIZE(num,size) # define STARPU_ATTRIBUTE_ALLOC_SIZE(size) #endif #if STARPU_GNUC_PREREQ(3, 1) && !defined(BUILDING_STARPU) && !defined(STARPU_USE_DEPRECATED_API) && !defined(STARPU_USE_DEPRECATED_ONE_ZERO_API) #define STARPU_DEPRECATED __attribute__((__deprecated__)) #else #define STARPU_DEPRECATED #endif /* __GNUC__ */ #if STARPU_GNUC_PREREQ(3,3) #define STARPU_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) #else #define STARPU_WARN_UNUSED_RESULT #endif /* __GNUC__ */ #define STARPU_POISON_PTR ((void *)0xdeadbeef) #define STARPU_MIN(a,b) ((a)<(b)?(a):(b)) #define STARPU_MAX(a,b) ((a)<(b)?(b):(a)) #define STARPU_BACKTRACE_LENGTH 32 #ifdef __GLIBC__ # define STARPU_DUMP_BACKTRACE() do { \ void *__ptrs[STARPU_BACKTRACE_LENGTH]; \ int __n = backtrace(__ptrs, STARPU_BACKTRACE_LENGTH); \ backtrace_symbols_fd(__ptrs, __n, 2); \ } while (0) #else # define STARPU_DUMP_BACKTRACE() do { } while (0) #endif #ifdef STARPU_NO_ASSERT #define STARPU_ASSERT(x) do { if (0) { (void) (x); } } while(0) #define STARPU_ASSERT_ACCESSIBLE(x) do { if (0) { (void) (x); } } while(0) #define STARPU_ASSERT_MSG(x, msg, ...) do { if (0) { (void) (x); (void) msg; } } while(0) #else # if defined(__CUDACC__) && defined(STARPU_HAVE_WINDOWS) # define STARPU_ASSERT(x) do { if (STARPU_UNLIKELY(!(x))) { STARPU_DUMP_BACKTRACE(); *(int*)NULL = 0; } } while(0) # define STARPU_ASSERT_MSG(x, msg, ...) do { if (STARPU_UNLIKELY(!(x))) { STARPU_DUMP_BACKTRACE(); fprintf(stderr, "\n[starpu][%s][assert failure] " msg "\n\n", __starpu_func__, ## __VA_ARGS__); *(int*)NULL = 0; }} while(0) # else # define STARPU_ASSERT(x) do { if (STARPU_UNLIKELY(!(x))) { STARPU_DUMP_BACKTRACE(); assert(x); } } while (0) # define STARPU_ASSERT_MSG(x, msg, ...) do { if (STARPU_UNLIKELY(!(x))) { STARPU_DUMP_BACKTRACE(); fprintf(stderr, "\n[starpu][%s][assert failure] " msg "\n\n", __starpu_func__, ## __VA_ARGS__); assert(x); } } while(0) # endif # define STARPU_ASSERT_ACCESSIBLE(ptr) do { \ volatile char __c STARPU_ATTRIBUTE_UNUSED = *(char*) (ptr); \ } while(0) #endif #ifdef __APPLE_CC__ # define _starpu_abort() *(volatile int*)NULL = 0 #else # define _starpu_abort() abort() #endif #define STARPU_ABORT() do { \ STARPU_DUMP_BACKTRACE(); \ fprintf(stderr, "[starpu][abort][%s()@%s:%d]\n", __starpu_func__, __FILE__, __LINE__); \ _starpu_abort(); \ } while(0) #define STARPU_ABORT_MSG(msg, ...) do { \ STARPU_DUMP_BACKTRACE(); \ fprintf(stderr, "[starpu][abort][%s()@%s:%d] " msg "\n", __starpu_func__, __FILE__, __LINE__, ## __VA_ARGS__); \ _starpu_abort(); \ } while(0) #if defined(STARPU_HAVE_STRERROR_R) #if !__GLIBC__ || ((_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && ! _GNU_SOURCE) /* XSI-compliant version of strerror_r returns an int */ #define starpu_strerror_r(errnum, buf, buflen) \ do \ { \ int _ret = strerror_r((errnum), (buf), (buflen)); \ STARPU_ASSERT(_ret == 0); \ } \ while (0) #else /* GNU-specific version of strerror_r returns a char * */ #define starpu_strerror_r(errnum, buf, buflen) \ do \ { \ char * const _user_buf = (buf); \ const size_t _user_buflen = (buflen); \ /* the GNU-specific behaviour when 'buf' == NULL cannot be emulated with the XSI-compliant version */ \ STARPU_ASSERT((buf) != NULL); \ char * _tmp_buf = strerror_r((errnum), _user_buf, _user_buflen); \ if (_tmp_buf != _user_buf) \ { \ if (_user_buflen > 0) \ { \ strncpy(_user_buf, _tmp_buf, _user_buflen); \ _user_buf[_user_buflen-1] = '\0'; \ } \ } \ } \ while (0) #endif /* strerror_r ABI version */ # define STARPU_CHECK_RETURN_VALUE(err, message, ...) {if (STARPU_UNLIKELY(err != 0)) { \ char xmessage[256]; starpu_strerror_r(-err, xmessage, 256); \ fprintf(stderr, "[starpu] Unexpected value: <%d:%s> returned for " message "\n", err, xmessage, ## __VA_ARGS__); \ STARPU_ABORT(); }} # define STARPU_CHECK_RETURN_VALUE_IS(err, value, message, ...) {if (STARPU_UNLIKELY(err != value)) { \ char xmessage[256]; starpu_strerror_r(-err, xmessage, 256); \ fprintf(stderr, "[starpu] Unexpected value: <%d!=%d:%s> returned for " message "\n", err, value, xmessage, ## __VA_ARGS__); \ STARPU_ABORT(); }} #else # define STARPU_CHECK_RETURN_VALUE(err, message, ...) {if (STARPU_UNLIKELY(err != 0)) { \ fprintf(stderr, "[starpu] Unexpected value: <%d> returned for " message "\n", err, ## __VA_ARGS__); \ STARPU_ABORT(); }} # define STARPU_CHECK_RETURN_VALUE_IS(err, value, message, ...) {if (STARPU_UNLIKELY(err != value)) { \ fprintf(stderr, "[starpu] Unexpected value: <%d != %d> returned for " message "\n", err, value, ## __VA_ARGS__); \ STARPU_ABORT(); }} #endif /* STARPU_HAVE_STRERROR_R */ #if defined(__i386__) || defined(__x86_64__) static __starpu_inline unsigned starpu_cmpxchg(unsigned *ptr, unsigned old, unsigned next) { __asm__ __volatile__("lock cmpxchgl %2,%1": "+a" (old), "+m" (*ptr) : "q" (next) : "memory"); return old; } static __starpu_inline unsigned starpu_xchg(unsigned *ptr, unsigned next) { /* Note: xchg is always locked already */ __asm__ __volatile__("xchgl %1,%0": "+m" (*ptr), "+q" (next) : : "memory"); return next; } #define STARPU_HAVE_XCHG #if defined(__i386__) static __starpu_inline unsigned long starpu_cmpxchgl(unsigned long *ptr, unsigned long old, unsigned long next) { __asm__ __volatile__("lock cmpxchgl %2,%1": "+a" (old), "+m" (*ptr) : "q" (next) : "memory"); return old; } static __starpu_inline unsigned long starpu_xchgl(unsigned long *ptr, unsigned long next) { /* Note: xchg is always locked already */ __asm__ __volatile__("xchgl %1,%0": "+m" (*ptr), "+q" (next) : : "memory"); return next; } #define STARPU_HAVE_XCHGL #endif #if defined(__x86_64__) static __starpu_inline unsigned long starpu_cmpxchgl(unsigned long *ptr, unsigned long old, unsigned long next) { __asm__ __volatile__("lock cmpxchgq %2,%1": "+a" (old), "+m" (*ptr) : "q" (next) : "memory"); return old; } static __starpu_inline unsigned long starpu_xchgl(unsigned long *ptr, unsigned long next) { /* Note: xchg is always locked already */ __asm__ __volatile__("xchgq %1,%0": "+m" (*ptr), "+q" (next) : : "memory"); return next; } #define STARPU_HAVE_XCHGL #endif #endif #define STARPU_ATOMIC_SOMETHING(name,expr) \ static __starpu_inline unsigned starpu_atomic_##name(unsigned *ptr, unsigned value) \ { \ unsigned old, next; \ while (1) \ { \ old = *ptr; \ next = expr; \ if (starpu_cmpxchg(ptr, old, next) == old) \ break; \ }; \ return expr; \ } #define STARPU_ATOMIC_SOMETHINGL(name,expr) \ static __starpu_inline unsigned long starpu_atomic_##name##l(unsigned long *ptr, unsigned long value) \ { \ unsigned long old, next; \ while (1) \ { \ old = *ptr; \ next = expr; \ if (starpu_cmpxchgl(ptr, old, next) == old) \ break; \ }; \ return expr; \ } #ifdef STARPU_HAVE_SYNC_FETCH_AND_ADD #define STARPU_ATOMIC_ADD(ptr, value) (__sync_fetch_and_add ((ptr), (value)) + (value)) #define STARPU_ATOMIC_ADDL(ptr, value) (__sync_fetch_and_add ((ptr), (value)) + (value)) #else #if defined(STARPU_HAVE_XCHG) STARPU_ATOMIC_SOMETHING(add, old + value) #define STARPU_ATOMIC_ADD(ptr, value) starpu_atomic_add(ptr, value) #endif #if defined(STARPU_HAVE_XCHGL) STARPU_ATOMIC_SOMETHINGL(add, old + value) #define STARPU_ATOMIC_ADDL(ptr, value) starpu_atomic_addl(ptr, value) #endif #endif #ifdef STARPU_HAVE_SYNC_FETCH_AND_OR #define STARPU_ATOMIC_OR(ptr, value) (__sync_fetch_and_or ((ptr), (value))) #define STARPU_ATOMIC_ORL(ptr, value) (__sync_fetch_and_or ((ptr), (value))) #else #if defined(STARPU_HAVE_XCHG) STARPU_ATOMIC_SOMETHING(or, old | value) #define STARPU_ATOMIC_OR(ptr, value) starpu_atomic_or(ptr, value) #endif #if defined(STARPU_HAVE_XCHGL) STARPU_ATOMIC_SOMETHINGL(or, old | value) #define STARPU_ATOMIC_ORL(ptr, value) starpu_atomic_orl(ptr, value) #endif #endif #ifdef STARPU_HAVE_SYNC_BOOL_COMPARE_AND_SWAP #define STARPU_BOOL_COMPARE_AND_SWAP(ptr, old, value) (__sync_bool_compare_and_swap ((ptr), (old), (value))) #elif defined(STARPU_HAVE_XCHG) #define STARPU_BOOL_COMPARE_AND_SWAP(ptr, old, value) (starpu_cmpxchg((ptr), (old), (value)) == (old)) #endif #ifdef STARPU_HAVE_SYNC_VAL_COMPARE_AND_SWAP #define STARPU_VAL_COMPARE_AND_SWAP(ptr, old, value) (__sync_val_compare_and_swap ((ptr), (old), (value))) #elif defined(STARPU_HAVE_XCHG) #define STARPU_VAL_COMPARE_AND_SWAP(ptr, old, value) (starpu_cmpxchg((ptr), (old), (value))) #endif #ifdef STARPU_HAVE_SYNC_LOCK_TEST_AND_SET #define STARPU_TEST_AND_SET(ptr, value) (__sync_lock_test_and_set ((ptr), (value))) #define STARPU_RELEASE(ptr) (__sync_lock_release ((ptr))) #elif defined(STARPU_HAVE_XCHG) #define STARPU_TEST_AND_SET(ptr, value) (starpu_xchg((ptr), (value))) #define STARPU_RELEASE(ptr) (starpu_xchg((ptr), 0)) #endif #ifdef STARPU_HAVE_SYNC_SYNCHRONIZE #define STARPU_SYNCHRONIZE() __sync_synchronize() #elif defined(__i386__) #define STARPU_SYNCHRONIZE() __asm__ __volatile__("lock; addl $0,0(%%esp)" ::: "memory") #elif defined(__KNC__) || defined(__KNF__) #define STARPU_SYNCHRONIZE() __asm__ __volatile__("lock; addl $0,0(%%rsp)" ::: "memory") #elif defined(__x86_64__) #define STARPU_SYNCHRONIZE() __asm__ __volatile__("mfence" ::: "memory") #elif defined(__ppc__) || defined(__ppc64__) #define STARPU_SYNCHRONIZE() __asm__ __volatile__("sync" ::: "memory") #endif #if defined(__i386__) #define STARPU_RMB() __asm__ __volatile__("lock; addl $0,0(%%esp)" ::: "memory") #define STARPU_WMB() __asm__ __volatile__("lock; addl $0,0(%%esp)" ::: "memory") #elif defined(__KNC__) || defined(__KNF__) #define STARPU_RMB() __asm__ __volatile__("lock; addl $0,0(%%rsp)" ::: "memory") #define STARPU_WMB() __asm__ __volatile__("lock; addl $0,0(%%rsp)" ::: "memory") #elif defined(__x86_64__) #define STARPU_RMB() __asm__ __volatile__("lfence" ::: "memory") #define STARPU_WMB() __asm__ __volatile__("sfence" ::: "memory") #elif defined(__ppc__) || defined(__ppc64__) #define STARPU_RMB() __asm__ __volatile__("sync" ::: "memory") #define STARPU_WMB() __asm__ __volatile__("sync" ::: "memory") #else #define STARPU_RMB() STARPU_SYNCHRONIZE() #define STARPU_WMB() STARPU_SYNCHRONIZE() #endif #ifdef __cplusplus } #endif /* Include this only here so that can use the * macros above. */ #include #ifdef __cplusplus extern "C" { #endif extern int _starpu_silent; char *starpu_getenv(const char *str); static __starpu_inline int starpu_get_env_number(const char *str) { char *strval; strval = starpu_getenv(str); if (strval) { /* the env variable was actually set */ long int val; char *check; val = strtol(strval, &check, 10); if (*check) { fprintf(stderr,"The %s environment variable must contain an integer\n", str); STARPU_ABORT(); } /* fprintf(stderr, "ENV %s WAS %d\n", str, val); */ STARPU_ASSERT_MSG(val >= 0, "The value for the environment variable '%s' cannot be negative", str); return (int)val; } else { /* there is no such env variable */ /* fprintf("There was no %s ENV\n", str); */ return -1; } } static __starpu_inline int starpu_get_env_number_default(const char *str, int defval) { int ret = starpu_get_env_number(str); if (ret == -1) ret = defval; return ret; } static __starpu_inline float starpu_get_env_float_default(const char *str, float defval) { char *strval; strval = starpu_getenv(str); if (strval) { /* the env variable was actually set */ float val; char *check; val = strtof(strval, &check); if (*check) { fprintf(stderr,"The %s environment variable must contain a float\n", str); STARPU_ABORT(); } /* fprintf(stderr, "ENV %s WAS %f\n", str, val); */ return val; } else { /* there is no such env variable */ /* fprintf("There was no %s ENV\n", str); */ return defval; } } void starpu_execute_on_each_worker(void (*func)(void *), void *arg, uint32_t where); void starpu_execute_on_each_worker_ex(void (*func)(void *), void *arg, uint32_t where, const char *name); void starpu_execute_on_specific_workers(void (*func)(void*), void *arg, unsigned num_workers, unsigned *workers, const char *name); int starpu_data_cpy(starpu_data_handle_t dst_handle, starpu_data_handle_t src_handle, int asynchronous, void (*callback_func)(void*), void *callback_arg); double starpu_timing_now(void); #ifdef _WIN32 /* Try to fetch the system definition of timespec */ #include #include #ifdef HAVE_UNISTD_H #include #endif #include #if !defined(_MSC_VER) || defined(BUILDING_STARPU) #include #endif #if !defined(STARPU_HAVE_STRUCT_TIMESPEC) || (defined(_MSC_VER) && _MSC_VER < 1900) /* If it didn't get defined in the standard places, then define it ourself */ #ifndef STARPU_TIMESPEC_DEFINED #define STARPU_TIMESPEC_DEFINED 1 struct timespec { time_t tv_sec; /* Seconds */ long tv_nsec; /* Nanoseconds */ }; #endif /* STARPU_TIMESPEC_DEFINED */ #endif /* STARPU_HAVE_STRUCT_TIMESPEC */ /* Fetch gettimeofday on mingw/cygwin */ #if defined(__MINGW32__) || defined(__CYGWIN__) #include #endif #else #include #endif /* _WIN32 */ #ifdef __cplusplus } #endif #endif /* __STARPU_UTIL_H__ */ starpu-1.2.3+dfsg/include/starpu_worker.h000066400000000000000000000076531320135501600204640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2013, 2016 Université de Bordeaux * Copyright (C) 2010-2014 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_WORKER_H__ #define __STARPU_WORKER_H__ #include #include #include #ifdef __cplusplus extern "C" { #endif enum starpu_worker_archtype { STARPU_CPU_WORKER, STARPU_CUDA_WORKER, STARPU_OPENCL_WORKER, STARPU_MIC_WORKER, STARPU_SCC_WORKER, STARPU_ANY_WORKER }; struct starpu_sched_ctx_iterator { int cursor; void *value; void *possible_value; char visited[STARPU_NMAXWORKERS]; }; enum starpu_worker_collection_type { STARPU_WORKER_TREE, STARPU_WORKER_LIST }; struct starpu_worker_collection { int *workerids; void *collection_private; unsigned nworkers; void *masters; unsigned nmasters; char present[STARPU_NMAXWORKERS]; char is_master[STARPU_NMAXWORKERS]; enum starpu_worker_collection_type type; unsigned (*has_next)(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it); int (*get_next)(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it); unsigned (*has_next_master)(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it); int (*get_next_master)(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it); int (*add)(struct starpu_worker_collection *workers, int worker); int (*remove)(struct starpu_worker_collection *workers, int worker); void (*init)(struct starpu_worker_collection *workers); void (*deinit)(struct starpu_worker_collection *workers); void (*init_iterator)(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it); }; extern struct starpu_worker_collection worker_list; extern struct starpu_worker_collection worker_tree; unsigned starpu_worker_get_count(void); unsigned starpu_combined_worker_get_count(void); unsigned starpu_worker_is_combined_worker(int id); unsigned starpu_cpu_worker_get_count(void); unsigned starpu_cuda_worker_get_count(void); unsigned starpu_opencl_worker_get_count(void); unsigned starpu_mic_worker_get_count(void); unsigned starpu_scc_worker_get_count(void); unsigned starpu_mic_device_get_count(void); int starpu_worker_get_id(void); unsigned _starpu_worker_get_id_check(const char *f, int l); unsigned starpu_worker_get_id_check(void); #define starpu_worker_get_id_check() _starpu_worker_get_id_check(__FILE__, __LINE__) int starpu_worker_get_bindid(int workerid); int starpu_combined_worker_get_id(void); int starpu_combined_worker_get_size(void); int starpu_combined_worker_get_rank(void); enum starpu_worker_archtype starpu_worker_get_type(int id); int starpu_worker_get_count_by_type(enum starpu_worker_archtype type); int starpu_worker_get_ids_by_type(enum starpu_worker_archtype type, int *workerids, int maxsize); int starpu_worker_get_by_type(enum starpu_worker_archtype type, int num); int starpu_worker_get_by_devid(enum starpu_worker_archtype type, int devid); void starpu_worker_get_name(int id, char *dst, size_t maxlen); int starpu_worker_get_devid(int id); int starpu_worker_get_mp_nodeid(int id); struct starpu_tree* starpu_workers_get_tree(void); unsigned starpu_worker_get_sched_ctx_list(int worker, unsigned **sched_ctx); unsigned starpu_worker_is_slave(int workerid); char *starpu_worker_get_type_as_string(enum starpu_worker_archtype type); #ifdef __cplusplus } #endif #endif /* __STARPU_WORKER_H__ */ starpu-1.2.3+dfsg/libstarpu.pc.in000066400000000000000000000024321320135501600167050ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009, 2010, 2011, 2013-2015 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: starpu Description: offers support for heterogeneous multicore architecture Version: @PACKAGE_VERSION@ Cflags: -I${includedir}/starpu/@STARPU_EFFECTIVE_VERSION@ @STARPU_CUDA_CPPFLAGS@ @SIMGRID_CFLAGS@ -DSTARPU_USE_DEPRECATED_API -DSTARPU_USE_DEPRECATED_ONE_ZERO_API Libs: @STARPU_EXPORT_DYNAMIC@ -L${libdir} -lstarpu-@STARPU_EFFECTIVE_VERSION@ @STARPU_CUDA_LDFLAGS@ @STARPU_OPENCL_LDFLAGS@ @STARPU_SC_HYPERVISOR@ @STARPU_EXPORTED_LIBS@ Libs.private: @LDFLAGS@ @LIBS@ @LIBSTARPU_LDFLAGS@ Requires: @HWLOC_REQUIRES@ starpu-1.2.3+dfsg/m4/000077500000000000000000000000001320135501600142665ustar00rootroot00000000000000starpu-1.2.3+dfsg/m4/acinclude.m4000066400000000000000000000115751320135501600164700ustar00rootroot00000000000000dnl Copyright (C) Free Software Foundation, Inc. dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA dnl dnl This test is taken from libgfortran dnl Check whether the target supports __sync_val_compare_and_swap. AC_DEFUN([STARPU_CHECK_SYNC_VAL_COMPARE_AND_SWAP], [ AC_CACHE_CHECK([whether the target supports __sync_val_compare_and_swap], ac_cv_have_sync_val_compare_and_swap, [ AC_LINK_IFELSE([AC_LANG_PROGRAM([int foo, bar;], [bar = __sync_val_compare_and_swap(&foo, 0, 1);])], [ac_cv_have_sync_val_compare_and_swap=yes], [ac_cv_have_sync_val_compare_and_swap=no])]) if test $ac_cv_have_sync_val_compare_and_swap = yes; then AC_DEFINE(STARPU_HAVE_SYNC_VAL_COMPARE_AND_SWAP, 1, [Define to 1 if the target supports __sync_val_compare_and_swap]) fi]) dnl Check whether the target supports __sync_bool_compare_and_swap. AC_DEFUN([STARPU_CHECK_SYNC_BOOL_COMPARE_AND_SWAP], [ AC_CACHE_CHECK([whether the target supports __sync_bool_compare_and_swap], ac_cv_have_sync_bool_compare_and_swap, [ AC_LINK_IFELSE([AC_LANG_PROGRAM([int foo, bar;], [bar = __sync_bool_compare_and_swap(&foo, 0, 1);])], [ac_cv_have_sync_bool_compare_and_swap=yes], [ac_cv_have_sync_bool_compare_and_swap=no])]) if test $ac_cv_have_sync_bool_compare_and_swap = yes; then AC_DEFINE(STARPU_HAVE_SYNC_BOOL_COMPARE_AND_SWAP, 1, [Define to 1 if the target supports __sync_bool_compare_and_swap]) fi]) dnl Check whether the target supports __sync_val_compare_and_swap. AC_DEFUN([STARPU_CHECK_SYNC_VAL_COMPARE_AND_SWAP], [ AC_CACHE_CHECK([whether the target supports __sync_val_compare_and_swap], ac_cv_have_sync_val_compare_and_swap, [ AC_LINK_IFELSE([AC_LANG_PROGRAM([int foo, bar;], [bar = __sync_val_compare_and_swap(&foo, 0, 1);])], [ac_cv_have_sync_val_compare_and_swap=yes], [ac_cv_have_sync_val_compare_and_swap=no])]) if test $ac_cv_have_sync_val_compare_and_swap = yes; then AC_DEFINE(STARPU_HAVE_SYNC_VAL_COMPARE_AND_SWAP, 1, [Define to 1 if the target supports __sync_val_compare_and_swap]) fi]) dnl Check whether the target supports __sync_fetch_and_add. AC_DEFUN([STARPU_CHECK_SYNC_FETCH_AND_ADD], [ AC_CACHE_CHECK([whether the target supports __sync_fetch_and_add], ac_cv_have_sync_fetch_and_add, [ AC_LINK_IFELSE([AC_LANG_PROGRAM([int foo, bar;], [bar = __sync_fetch_and_add(&foo, 1);])], [ac_cv_have_sync_fetch_and_add=yes], [ac_cv_have_sync_fetch_and_add=no])]) if test $ac_cv_have_sync_fetch_and_add = yes; then AC_DEFINE(STARPU_HAVE_SYNC_FETCH_AND_ADD, 1, [Define to 1 if the target supports __sync_fetch_and_add]) fi]) dnl Check whether the target supports __sync_fetch_and_or. AC_DEFUN([STARPU_CHECK_SYNC_FETCH_AND_OR], [ AC_CACHE_CHECK([whether the target supports __sync_fetch_and_or], ac_cv_have_sync_fetch_and_or, [ AC_LINK_IFELSE([AC_LANG_PROGRAM([int foo, bar;], [bar = __sync_fetch_and_or(&foo, 1);])], [ac_cv_have_sync_fetch_and_or=yes], [ac_cv_have_sync_fetch_and_or=no])]) if test $ac_cv_have_sync_fetch_and_or = yes; then AC_DEFINE(STARPU_HAVE_SYNC_FETCH_AND_OR, 1, [Define to 1 if the target supports __sync_fetch_and_or]) fi]) dnl Check whether the target supports __sync_lock_test_and_set. AC_DEFUN([STARPU_CHECK_SYNC_LOCK_TEST_AND_SET], [ AC_CACHE_CHECK([whether the target supports __sync_lock_test_and_set], ac_cv_have_sync_lock_test_and_set, [ AC_LINK_IFELSE([AC_LANG_PROGRAM([int foo, bar;], [bar = __sync_lock_test_and_set(&foo, 1);])], [ac_cv_have_sync_lock_test_and_set=yes], [ac_cv_have_sync_lock_test_and_set=no])]) if test $ac_cv_have_sync_lock_test_and_set = yes; then AC_DEFINE(STARPU_HAVE_SYNC_LOCK_TEST_AND_SET, 1, [Define to 1 if the target supports __sync_lock_test_and_set]) fi]) dnl Check whether the target supports __sync_synchronize. AC_DEFUN([STARPU_CHECK_SYNC_SYNCHRONIZE], [ AC_CACHE_CHECK([whether the target supports __sync_synchronize], ac_cv_have_sync_synchronize, [ AC_LINK_IFELSE([AC_LANG_PROGRAM(, [__sync_synchronize();])], [ac_cv_have_sync_synchronize=yes], [ac_cv_have_sync_synchronize=no])]) if test $ac_cv_have_sync_synchronize = yes; then AC_DEFINE(STARPU_HAVE_SYNC_SYNCHRONIZE, 1, [Define to 1 if the target supports __sync_synchronize]) fi]) starpu-1.2.3+dfsg/m4/gcc.m4000066400000000000000000000162551320135501600152750ustar00rootroot00000000000000dnl -*- Autoconf -*- dnl dnl Copyright (C) 2011, 2012, 2013 INRIA dnl dnl StarPU is free software; you can redistribute it and/or modify dnl it under the terms of the GNU Lesser General Public License as published by dnl the Free Software Foundation; either version 2.1 of the License, or (at dnl your option) any later version. dnl dnl StarPU is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. dnl dnl See the GNU Lesser General Public License in COPYING.LGPL for more details. dnl Run its argument with CPPFLAGS pointing to GCC's plug-in API. AC_DEFUN([_STARPU_WITH_GCC_PLUGIN_API], [ GCC_PLUGIN_INCLUDE_DIR="`"$CC" -print-file-name=plugin`/include" save_CPPFLAGS="$CPPFLAGS" save_LDFLAGS="$LDFLAGS" CPPFLAGS="-I$GCC_PLUGIN_INCLUDE_DIR" case "$host_os" in darwin*) # Darwin's linker errors out when encountering undefined # symbols, by default. Tell it to ignore them. LDFLAGS="-Wl,-undefined -Wl,dynamic_lookup";; esac $1 CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" ]) dnl Set $ac_cv_starpu_gcc_for_plugin to the compiler to use to compile dnl GCC plug-ins. It's `gcc' for GCC 4.5/4.6, probably `g++' for 4.7, dnl and definitely `g++' for 4.8, because the last two build dnl themselves with `g++', leading to mangled names. dnl See for details. AC_DEFUN([_STARPU_GCC_PLUGIN_LANGUAGE], [ AC_CACHE_CHECK([which compiler to use to build GCC plug-ins], [ac_cv_starpu_gcc_for_plugin], [ for GCC_FOR_PLUGIN in "$CC" "$CXX" "" do if test "x$GCC_FOR_PLUGIN" = "x"; then break; fi cat > conftest.c < #include #include int plugin_is_GPL_compatible; extern struct cpp_reader *parse_in; /* C-family front-ends */ static void define_something (void *gcc_data, void *user_data) { cpp_define (parse_in, "CONFTEST_GCC_PLUGIN=1"); } int plugin_init (struct plugin_name_args *plugin_info, struct plugin_gcc_version *version) { if (!plugin_default_version_check (version, &gcc_version)) return 1; register_callback ("conftest", PLUGIN_START_UNIT, define_something, NULL); return 0; } END_OF_CONFTEST # Build the plug-in. rm -f conftest.so _STARPU_WITH_GCC_PLUGIN_API([ _AC_DO(["$GCC_FOR_PLUGIN" "$CPPFLAGS" -fPIC -shared conftest.c -o conftest.so]) || { AC_MSG_ERROR([failed to build a GCC plug-in with `$GCC_FOR_PLUGIN']) } ]) # Attempt to use it. save_CFLAGS="$CFLAGS" CFLAGS="-fplugin=$PWD/conftest.so" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #ifndef CONFTEST_GCC_PLUGIN # error plug-in not loaded #endif]], [])], [ac_cv_starpu_gcc_for_plugin="$GCC_FOR_PLUGIN"], [:]) CFLAGS="$save_CFLAGS" rm -f conftest.so conftest.c if test "x$ac_cv_starpu_gcc_for_plugin" != "x"; then # We're done. break fi done if test "x$ac_cv_starpu_gcc_for_plugin" = "x"; then AC_MSG_RESULT([none]) AC_MSG_ERROR([could not find a suitable compiler for GCC plug-ins]) fi ]) $1="$ac_cv_starpu_gcc_for_plugin" ]) dnl Check whether GCC plug-in support is available (GCC 4.5+). AC_DEFUN([STARPU_GCC_PLUGIN_SUPPORT], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_PROG_CXX]) dnl for GCC 4.7+ AC_CACHE_CHECK([whether GCC supports plug-ins], [ac_cv_have_gcc_plugins], [ if test "x$GCC" = xyes; then # ICC 12.1.0 and Clang 3.1 (among others) support `--version', # define `__GNUC__', and provide a `-print-file-name=plugin' # that returns GCC's valid header directory. This makes them # hardly distinguishable from GCC. Actually, ICC 12.1.0 is able # to compile our plug-in, but silently ignores `-fplugin', leading # to obvious build failures; thus, it is explicitly excluded below. _STARPU_WITH_GCC_PLUGIN_API([ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include #include #include #if defined __INTEL_COMPILER || defined __ICC Beware, this compiler is a fake. Don't use it. #endif tree fndecl; gimple call;]], [[/* Clang 3.1 doesn't support nested functions, so try to discriminate it this way. */ tree foo (void) { return lookup_name (get_identifier ("puts")); } fndecl = foo (); call = gimple_build_call (fndecl, 0);]])], [ac_cv_have_gcc_plugins="yes"], [ac_cv_have_gcc_plugins="no"]) ]) else ac_cv_have_gcc_plugins="no" fi ]) if test "x$ac_cv_have_gcc_plugins" = "xyes"; then dnl Check for specific features. dnl dnl Reason: dnl build_call_expr_loc_array -- not in GCC 4.5.x; appears in 4.6 dnl build_call_expr_loc_vec -- likewise dnl build_array_ref -- present but undeclared in 4.6.1 dnl build_zero_cst -- not in GCC 4.5.x; appears in 4.6 dnl builtin_decl_explicit -- new in 4.7, replaces `built_in_decls' dnl ptr_derefs_may_alias_p -- new in 4.6, nothing equivalent in 4.5 dnl .affects_type_identity -- new field in 4.7 _STARPU_WITH_GCC_PLUGIN_API([ AC_CHECK_DECLS([build_call_expr_loc_array, build_call_expr_loc_vec, build_array_ref, build_zero_cst, builtin_decl_explicit, ptr_derefs_may_alias_p], [], [], [#include #include #include ]) dnl Work around header naming issues introduced upstream and in Debian dnl (see ). AC_CHECK_HEADERS([c-common.h c-pragma.h c-family/c-common.h c-family/c-pragma.h], [], [], [#include #include ]) AC_CHECK_MEMBER([struct attribute_spec.affects_type_identity], [AC_DEFINE([HAVE_ATTRIBUTE_SPEC_AFFECTS_TYPE_IDENTITY], [1], [Define to 1 when `struct attribute_spec' has the `affects_type_identity' field.])], [], [#include #include ]) ]) AC_DEFINE_UNQUOTED([STARPU_INCLUDE_DIR], ["`test "x$prefix" = xNONE && prefix=$ac_default_prefix ; eval "echo $includedir"`/starpu/$STARPU_EFFECTIVE_VERSION"], [Define to the directory where StarPU's headers are installed.]) dnl Now, `gcc' or `g++'? _STARPU_GCC_PLUGIN_LANGUAGE([GCC_FOR_PLUGIN]) AC_SUBST([GCC_FOR_PLUGIN]) dnl Determine the corresponding Libtool tag. if test "$GCC_FOR_PLUGIN" = "$CXX"; then GCC_FOR_PLUGIN_LIBTOOL_TAG="CXX" # Require C++11, for lambdas and `auto'. GCC_FOR_PLUGIN="$GCC_FOR_PLUGIN -std=c++11" else GCC_FOR_PLUGIN_LIBTOOL_TAG="CC" fi AC_SUBST([GCC_FOR_PLUGIN_LIBTOOL_TAG]) fi AC_SUBST([GCC_PLUGIN_INCLUDE_DIR]) ]) dnl Substitute `STARPU_GCC_VERSION_MAJOR' and `STARPU_GCC_VERSION_MINOR'. AC_DEFUN([STARPU_GCC_VERSION], [ AC_COMPUTE_INT([STARPU_GCC_VERSION_MAJOR], [__GNUC__]) AC_COMPUTE_INT([STARPU_GCC_VERSION_MINOR], [__GNUC_MINOR__]) AC_SUBST([STARPU_GCC_VERSION_MAJOR]) AC_SUBST([STARPU_GCC_VERSION_MINOR]) ]) starpu-1.2.3+dfsg/m4/libs.m4000066400000000000000000000035111320135501600154610ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # STARPU_SEARCH_LIBS(NAME, FUNCTION, SEARCH-LIBS, # [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND], # [OTHER-LIBRARIES]) # # Like AC_SEARCH_LIBS, but puts -l flags into $1_LDFLAGS instead of LIBS, and # AC_SUBSTs it AC_DEFUN([STARPU_SEARCH_LIBS], [dnl _LIBS_SAV="$LIBS" LIBS="" AC_SEARCH_LIBS([$2], [$3], [$4], [$5], [$6]) STARPU_$1_LDFLAGS="$STARPU_$1_LDFLAGS $LIBS" LIBS=$_LIBS_SAV AC_SUBST(STARPU_$1_LDFLAGS) ])dnl # STARPU_CHECK_LIB(NAME, LIBRARY, FUNCTION, # [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND], # [OTHER-LIBRARIES]) # # Like AC_CHECK_LIB, but puts -l flags into $1_LDFLAGS instead of LIBS, and # AC_SUBSTs it AC_DEFUN([STARPU_CHECK_LIB], [dnl _LIBS_SAV="$LIBS" LIBS="" AC_CHECK_LIB([$2], [$3], [$4], [$5], [$6]) STARPU_$1_LDFLAGS="$STARPU_$1_LDFLAGS $LIBS" LIBS=$_LIBS_SAV AC_SUBST(STARPU_$1_LDFLAGS) ])dnl # STARPU_HAVE_LIBRARY(NAME, LIBRARY, # [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND], # [OTHER-LIBRARIES]) # Like AC_HAVE_LIBRARY, but puts -l flags into $1_LDFLAGS instead of LIBS, and # AC_SUBSTs it AC_DEFUN([STARPU_HAVE_LIBRARY], [dnl STARPU_CHECK_LIB([$1], [$2], main, [$3], [$4], [$5]) ])dnl starpu-1.2.3+dfsg/m4/libtool.m4000066400000000000000000010601111320135501600161740ustar00rootroot00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi _LT_TAGVAR(link_all_deplibs, $1)=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS starpu-1.2.3+dfsg/m4/ltoptions.m4000066400000000000000000000300731320135501600165660ustar00rootroot00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) starpu-1.2.3+dfsg/m4/ltsugar.m4000066400000000000000000000104241320135501600162120ustar00rootroot00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) starpu-1.2.3+dfsg/m4/ltversion.m4000066400000000000000000000012621320135501600165560ustar00rootroot00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) starpu-1.2.3+dfsg/m4/lt~obsolete.m4000066400000000000000000000137561320135501600171160ustar00rootroot00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) starpu-1.2.3+dfsg/m4/pkg.m4000066400000000000000000000121451320135501600153140ustar00rootroot00000000000000# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # # Copyright © 2004 Scott James Remnant . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # # Similar to PKG_CHECK_MODULES, make sure that the first instance of # this or PKG_CHECK_MODULES is called, or make sure to call # PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_ifval([$2], [$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$PKG_CONFIG"; then if test -n "$$1"; then pkg_cv_[]$1="$$1" else PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], [pkg_failed=yes]) fi else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` else $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD ifelse([$4], , [AC_MSG_ERROR(dnl [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT ])], [AC_MSG_RESULT([no]) $4]) elif test $pkg_failed = untried; then ifelse([$4], , [AC_MSG_FAILURE(dnl [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])], [$4]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) ifelse([$3], , :, [$3]) fi[]dnl ])# PKG_CHECK_MODULES starpu-1.2.3+dfsg/mic-configure000077500000000000000000000132611320135501600164260ustar00rootroot00000000000000#!/bin/bash ROOT_DIR=$(dirname $0) cat > ./mic-config.log << EOF This file was created by StarPU mic-configure $ $0 $* EOF prefix="/usr/local" coi_dir="/opt/intel/mic/coi" scif_dir="/opt/intel/mic/scif" mic_host="x86_64-k1om-linux" declare -a host_params declare -a mic_params unset host_params unset mic_params native_mic=0 mpi=0 for arg in "$@" do case $arg in --prefix=*) prefix="${arg#--prefix=}" ;; --with-coi-dir=*) coi_dir="${arg#--with-coi-dir=}" ;; --with-scif-dir=*) scif_dir="${arg#--with-scif-dir=}" ;; --mic-host=*) mic_host="${arg#--mic-host=}" ;; --enable-native-mic) native_mic=1 ;; --with-compiler=*) compiler="${arg#--with-compiler=}" ;; --with-mic-param=*) mic_params+=("${arg#--with-mic-param=}") ;; --with-host-param=*) host_params+=("${arg#--with-host-param=}") ;; --with-mpi*) mpi=1 ;; --help) cat << EOF mic-configure specific options: --with-coi-dir=DIR Specify directory that contains device-linux-release/lib/libcoi_device and host-linux-release/lib/libcoi_host and --with-scif-dir=DIR Specify directory that contains device-linux-release/lib/libscif_device and host-linux-release/lib/libscif_host and --mic-host=HOST Specify the precise Phi host to build for (default: k1om) --with-compiler=[icc|gcc] Specify whether to build with icc or with gcc --enable-native-mic Only build the Phi binaries --with-mic-param=--OPTION Pass --OPTION to the Phi configure script --with-host-param=--OPTION Pass --OPTION to the host configure script EOF ;; esac done if [ -z "$compiler" ] then # Test gcc compiler x=$(type -t ${mic_host}-gcc) if [ -z "$x" ] then # Test icc compiler echo "int main(int argc, char **argv) { return 0; }" > /tmp/icc_$USER_$$.c icc -mmic /tmp/icc_$USER_$$.c > /dev/null 2>/tmp/icc_$USER_$$.err l=$(grep -c "invalid argument" /tmp/icc_$USER_$$.err) if [ "$l" != "0" ] then echo "[error] no compiler found. please add path to either ${mic_host}-gcc or to an enabled mic icc compiler in your PATH" exit 1 else compiler="icc" fi else compiler="gcc" fi fi dev_list="host mic" if [ "$native_mic" -eq "1" ] then dev_list="mic" fi # prepend mic_params with "--with-mpicc=mpicc -mmic", to allow possible override by the user if [ $mpi = 1 ] then mic_params=("--with-mpicc=mpicc -mmic" "${mic_params[@]}") mic_params=("--with-mpifort=mpifort -mmic" "${mic_params[@]}") fi for arch in $dev_list #host mic do # We call the configure script from a build directory further in the # arborescence case $ROOT_DIR in /*) command="${ROOT_DIR}/configure";; *) command="../${ROOT_DIR}/configure";; esac declare -a params params=("--prefix=$prefix/$arch" "--disable-fstack-protector-all") if [ "$arch" = mic ] ; then if [ $compiler = "icc" ] ; then export CC="icc -mmic" export CXX="icc -mmic" export LD="icc -mmic" export CXXLD="icc -mmic" export F77="ifort -mmic" export FC="ifort -mmic" else # let configure auto-detect GNU cross-building tools unset CC unset CXX unset LD unset CXXLD unset F77 unset FC params+=(--disable-fortran) fi fi if [ "$native_mic" -eq "0" ] then params+=(--enable-mic "--with-coi-dir=$coi_dir" "--with-scif-dir=$scif_dir") fi if test x$arch = xmic ; then params+=(--host=$mic_host --disable-build-doc) if [ "$native_mic" -eq "1" ] then params+=(--enable-maxcpus=250) else params+=("--with-coi-lib-dir=$coi_dir/device-linux-release/lib" "--with-scif-lib-dir=$scif_dir/device-linux-release/lib") fi else params+=("--with-coi-lib-dir=$coi_dir/host-linux-release/lib" "--with-scif-lib-dir=$scif_dir/host-linux-release/lib") fi # If the build directory doesn't exist yet, create it if [ ! -d "build_${arch}" ] ; then mkdir "build_${arch}" fi cd "build_${arch}" if test x$arch = xmic ; then LIBRARY_PATH=$SINK_LIBRARY_PATH \ INCLUDE=$SINK_INCLUDE \ C_INCLUDE_PATH=$SINK_C_INCLUDE_PATH \ CPLUS_INCLUDE_PATH=$SINK_CPLUS_INCLUDE_PATH \ PKG_CONFIG_PATH=$SINK_PKG_CONFIG_PATH \ $command "$@" "${params[@]}" "${mic_params[@]}" MIC_BUILD_ENV="\ LIBRARY_PATH=$SINK_LIBRARY_PATH \\ INCLUDE=$SINK_INCLUDE \\ C_INCLUDE_PATH=$SINK_C_INCLUDE_PATH \\ CPLUS_INCLUDE_PATH=$SINK_CPLUS_INCLUDE_PATH \\ PKG_CONFIG_PATH=$SINK_PKG_CONFIG_PATH \\\ " else $command "$@" "${params[@]}""${host_params[@]}" fi if [ "$?" != 0 ] then exit $? fi cd .. done if [ "$native_mic" -eq "1" ] then cat > Makefile << EOF all: $MIC_BUILD_ENV \$(MAKE) \$(MFLAGS) -C build_mic clean: \$(MAKE) \$(MFLAGS) -C build_mic clean distclean: clean rm -f Makefile check: $MIC_BUILD_ENV \$(MAKE) \$(MFLAGS) -C build_mic check showcheck: \$(MAKE) \$(MFLAGS) -C build_mic showcheck install: $MIC_BUILD_ENV \$(MAKE) \$(MFLAGS) -C build_mic install ln -sf "${prefix}/mic/lib/pkgconfig/starpu-1.2.pc" "${prefix}/mic/lib/pkgconfig/starpu-1.2-mic.pc" EOF else cat > Makefile << EOF all: \$(MAKE) \$(MFLAGS) -C build_host $MIC_BUILD_ENV \$(MAKE) \$(MFLAGS) -C build_mic clean: \$(MAKE) \$(MFLAGS) -C build_host clean \$(MAKE) \$(MFLAGS) -C build_mic clean distclean: clean rm -f Makefile check: \$(MAKE) \$(MFLAGS) -C build_host check $MIC_BUILD_ENV \$(MAKE) \$(MFLAGS) -C build_mic check ; \ RET=\$\$? ; \ STARPU_NCPUS=0 \$(MAKE) \$(MFLAGS) -C build_mic check && [ \$\$RET == 0 ] showcheck: \$(MAKE) \$(MFLAGS) -C build_host showcheck \$(MAKE) \$(MFLAGS) -C build_mic showcheck install: \$(MAKE) \$(MFLAGS) -C build_host install $MIC_BUILD_ENV \$(MAKE) \$(MFLAGS) -C build_mic install ln -sf "${prefix}/mic/lib/pkgconfig/starpu-1.2.pc" "${prefix}/mic/lib/pkgconfig/starpu-1.2-mic.pc" EOF fi starpu-1.2.3+dfsg/mpi/000077500000000000000000000000001320135501600145335ustar00rootroot00000000000000starpu-1.2.3+dfsg/mpi/Makefile.am000066400000000000000000000021411320135501600165650ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2013 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013 CNRS # Copyright (C) 2016 Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. SUBDIRS=src tests examples pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libstarpumpi.pc starpumpi-1.0.pc starpumpi-1.1.pc starpumpi-1.2.pc versincludedir = $(includedir)/starpu/$(STARPU_EFFECTIVE_VERSION) versinclude_HEADERS = \ include/fstarpu_mpi_mod.f90 \ include/starpu_mpi.h showcheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET starpu-1.2.3+dfsg/mpi/Makefile.in000066400000000000000000000704501320135501600166060ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2013 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013 CNRS # Copyright (C) 2016 Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = mpi ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(versinclude_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = libstarpumpi.pc starpumpi-1.0.pc starpumpi-1.1.pc \ starpumpi-1.2.pc CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgconfigdir)" \ "$(DESTDIR)$(versincludedir)" DATA = $(pkgconfig_DATA) HEADERS = $(versinclude_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/libstarpumpi.pc.in \ $(srcdir)/starpumpi-1.0.pc.in $(srcdir)/starpumpi-1.1.pc.in \ $(srcdir)/starpumpi-1.2.pc.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POTI_CFLAGS = @POTI_CFLAGS@ POTI_LIBS = @POTI_LIBS@ PROG_DATE = @PROG_DATE@ PROG_STAT = @PROG_STAT@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_COI_CPPFLAGS = @STARPU_COI_CPPFLAGS@ STARPU_COI_LDFLAGS = @STARPU_COI_LDFLAGS@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LEVELDB_LDFLAGS = @STARPU_LEVELDB_LDFLAGS@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RCCE_CFLAGS = @STARPU_RCCE_CFLAGS@ STARPU_RCCE_CPPFLAGS = @STARPU_RCCE_CPPFLAGS@ STARPU_RCCE_LDFLAGS = @STARPU_RCCE_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SCIF_CPPFLAGS = @STARPU_SCIF_CPPFLAGS@ STARPU_SCIF_LDFLAGS = @STARPU_SCIF_LDFLAGS@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SC_HYPERVISOR_DEBUG = @STARPU_SC_HYPERVISOR_DEBUG@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ mpifort_path = @mpifort_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ smpirun_path = @smpirun_path@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = src tests examples pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libstarpumpi.pc starpumpi-1.0.pc starpumpi-1.1.pc starpumpi-1.2.pc versincludedir = $(includedir)/starpu/$(STARPU_EFFECTIVE_VERSION) versinclude_HEADERS = \ include/fstarpu_mpi_mod.f90 \ include/starpu_mpi.h all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign mpi/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign mpi/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): libstarpumpi.pc: $(top_builddir)/config.status $(srcdir)/libstarpumpi.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ starpumpi-1.0.pc: $(top_builddir)/config.status $(srcdir)/starpumpi-1.0.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ starpumpi-1.1.pc: $(top_builddir)/config.status $(srcdir)/starpumpi-1.1.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ starpumpi-1.2.pc: $(top_builddir)/config.status $(srcdir)/starpumpi-1.2.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) install-versincludeHEADERS: $(versinclude_HEADERS) @$(NORMAL_INSTALL) @list='$(versinclude_HEADERS)'; test -n "$(versincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(versincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(versincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(versincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(versincludedir)" || exit $$?; \ done uninstall-versincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(versinclude_HEADERS)'; test -n "$(versincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(versincludedir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(DATA) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(versincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-pkgconfigDATA install-versincludeHEADERS install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-pkgconfigDATA uninstall-versincludeHEADERS .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgconfigDATA install-ps \ install-ps-am install-strip install-versincludeHEADERS \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-pkgconfigDATA \ uninstall-versincludeHEADERS .PRECIOUS: Makefile showcheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.2.3+dfsg/mpi/examples/000077500000000000000000000000001320135501600163515ustar00rootroot00000000000000starpu-1.2.3+dfsg/mpi/examples/Makefile.am000066400000000000000000000235241320135501600204130ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2013, 2015-2017 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015 CNRS # Copyright (C) 2016 Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. include $(top_srcdir)/starpu.mk CC=$(MPICC) CCLD=$(MPICC) FC=$(MPIFORT) FCLD=$(MPIFORT) if STARPU_HAVE_WINDOWS LOADER_BIN = else loader_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -I$(top_builddir)/src/ LOADER = loader LOADER_BIN = $(abs_top_builddir)/mpi/examples/$(LOADER) loader_SOURCES = ../../tests/loader.c endif # we always test on 4 processes, the execution time is not that bigger if STARPU_QUICK_CHECK MPI = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 else MPI = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 endif if STARPU_HAVE_AM111 TESTS_ENVIRONMENT = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=4 top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" LOG_COMPILER = $(MPI) $(LOADER_BIN) else TESTS_ENVIRONMENT = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=4 top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(MPI) $(LOADER_BIN) endif if !STARPU_SIMGRID if STARPU_MPI_CHECK TESTS = $(starpu_mpi_EXAMPLES) endif endif check_PROGRAMS = $(LOADER) $(starpu_mpi_EXAMPLES) starpu_mpi_EXAMPLES = BUILT_SOURCES = CLEANFILES = *.gcno *.gcda *.linkinfo starpu_idle_microsec.log *.mod EXTRA_DIST = \ mpi_lu/mpi_lu-float.h \ mpi_lu/mpi_lu-double.h \ mpi_lu/plu_example.c \ mpi_lu/plu_implicit_example.c \ mpi_lu/plu_outofcore_example.c \ mpi_lu/plu_solve.c \ mpi_lu/pxlu.h \ mpi_lu/pxlu.c \ mpi_lu/pxlu_implicit.c \ mpi_lu/pxlu_kernels.h \ mpi_lu/pxlu_kernels.c \ matrix_decomposition/mpi_cholesky.h \ matrix_decomposition/mpi_cholesky_codelets.h \ matrix_decomposition/mpi_cholesky_kernels.h \ matrix_decomposition/mpi_cholesky_models.h \ matrix_decomposition/mpi_decomposition_params.h \ matrix_decomposition/mpi_decomposition_matrix.h \ user_datatype/my_interface.h \ helper.h examplebindir = $(libdir)/starpu/mpi examplebin_PROGRAMS = if STARPU_USE_CUDA NVCCFLAGS += --compiler-options -fno-strict-aliasing -I$(top_srcdir)/include/ -I$(top_builddir)/include/ $(HWLOC_CFLAGS) .cu.cubin: $(MKDIR_P) `dirname $@` $(NVCC) -cubin $< -o $@ $(NVCCFLAGS) .cu.o: $(NVCC) $< -c -o $@ $(NVCCFLAGS) endif AM_CFLAGS = -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(FXT_CFLAGS) $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) $(GLOBAL_AM_CFLAGS) -Wno-unused LIBS = $(top_builddir)/src/@LIBSTARPU_LINK@ ../src/libstarpumpi-@STARPU_EFFECTIVE_VERSION@.la -lm @LIBS@ $(FXT_LIBS) $(MAGMA_LIBS) AM_CPPFLAGS = -I$(top_srcdir)/include/ -I$(top_srcdir)/examples/ -I$(top_builddir)/include -I$(top_srcdir)/mpi/include AM_LDFLAGS = $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) $(FXT_LDFLAGS) $(STARPU_COI_LDFLAGS) $(STARPU_SCIF_LDFLAGS) ################### # Stencil example # ################### if BUILD_EXAMPLES examplebin_PROGRAMS += \ stencil/stencil5 starpu_mpi_EXAMPLES += \ stencil/stencil5 endif ################## # MPI LU example # ################## if BUILD_EXAMPLES if !NO_BLAS_LIB examplebin_PROGRAMS += \ mpi_lu/plu_example_float \ mpi_lu/plu_example_double \ mpi_lu/plu_implicit_example_float \ mpi_lu/plu_implicit_example_double \ mpi_lu/plu_outofcore_example_float \ mpi_lu/plu_outofcore_example_double mpi_lu_plu_example_float_LDADD = \ $(STARPU_LIBNUMA_LDFLAGS) \ $(STARPU_BLAS_LDFLAGS) -lm mpi_lu_plu_example_float_SOURCES = \ mpi_lu/plu_example_float.c \ mpi_lu/plu_solve_float.c \ mpi_lu/pslu_kernels.c \ mpi_lu/pslu.c \ ../../examples/common/blas.c mpi_lu_plu_example_double_LDADD = \ $(STARPU_LIBNUMA_LDFLAGS) \ $(STARPU_BLAS_LDFLAGS) -lm mpi_lu_plu_example_double_SOURCES = \ mpi_lu/plu_example_double.c \ mpi_lu/plu_solve_double.c \ mpi_lu/pdlu_kernels.c \ mpi_lu/pdlu.c \ ../../examples/common/blas.c mpi_lu_plu_implicit_example_float_LDADD = \ $(STARPU_LIBNUMA_LDFLAGS) \ $(STARPU_BLAS_LDFLAGS) -lm mpi_lu_plu_implicit_example_float_SOURCES = \ mpi_lu/plu_implicit_example_float.c \ mpi_lu/plu_solve_float.c \ mpi_lu/pslu_kernels.c \ mpi_lu/pslu_implicit.c \ ../../examples/common/blas.c mpi_lu_plu_implicit_example_double_LDADD = \ $(STARPU_LIBNUMA_LDFLAGS) \ $(STARPU_BLAS_LDFLAGS) -lm mpi_lu_plu_implicit_example_double_SOURCES = \ mpi_lu/plu_implicit_example_double.c \ mpi_lu/plu_solve_double.c \ mpi_lu/pdlu_kernels.c \ mpi_lu/pdlu_implicit.c \ ../../examples/common/blas.c mpi_lu_plu_outofcore_example_float_LDADD = \ $(STARPU_LIBNUMA_LDFLAGS) \ $(STARPU_BLAS_LDFLAGS) -lm mpi_lu_plu_outofcore_example_float_SOURCES = \ mpi_lu/plu_outofcore_example_float.c \ mpi_lu/plu_solve_float.c \ mpi_lu/pslu_kernels.c \ mpi_lu/pslu_implicit.c \ ../../examples/common/blas.c mpi_lu_plu_outofcore_example_double_LDADD = \ $(STARPU_LIBNUMA_LDFLAGS) \ $(STARPU_BLAS_LDFLAGS) -lm mpi_lu_plu_outofcore_example_double_SOURCES = \ mpi_lu/plu_outofcore_example_double.c \ mpi_lu/plu_solve_double.c \ mpi_lu/pdlu_kernels.c \ mpi_lu/pdlu_implicit.c \ ../../examples/common/blas.c endif endif ######################## # MPI Cholesky example # ######################## if BUILD_EXAMPLES if !NO_BLAS_LIB examplebin_PROGRAMS += \ matrix_decomposition/mpi_cholesky \ matrix_decomposition/mpi_cholesky_distributed matrix_decomposition_mpi_cholesky_SOURCES = \ matrix_decomposition/mpi_cholesky.c \ matrix_decomposition/mpi_cholesky_models.c \ matrix_decomposition/mpi_cholesky_kernels.c \ matrix_decomposition/mpi_cholesky_codelets.c \ matrix_decomposition/mpi_decomposition_params.c \ matrix_decomposition/mpi_decomposition_matrix.c \ ../../examples/common/blas.c matrix_decomposition_mpi_cholesky_LDADD = \ $(STARPU_BLAS_LDFLAGS) -lm matrix_decomposition_mpi_cholesky_distributed_SOURCES = \ matrix_decomposition/mpi_cholesky_distributed.c \ matrix_decomposition/mpi_cholesky_models.c \ matrix_decomposition/mpi_cholesky_kernels.c \ matrix_decomposition/mpi_cholesky_codelets.c \ matrix_decomposition/mpi_decomposition_params.c \ matrix_decomposition/mpi_decomposition_matrix.c \ ../../examples/common/blas.c matrix_decomposition_mpi_cholesky_distributed_LDADD = \ $(STARPU_BLAS_LDFLAGS) -lm starpu_mpi_EXAMPLES += \ matrix_decomposition/mpi_cholesky \ matrix_decomposition/mpi_cholesky_distributed endif endif ########################################## # Native Fortran MPI Matrix mult example # ########################################## if STARPU_HAVE_MPIFORT if BUILD_EXAMPLES if !STARPU_SANITIZE examplebin_PROGRAMS += \ native_fortran/nf_mm \ native_fortran/nf_basic_ring native_fortran_nf_mm_SOURCES = \ native_fortran/nf_mm_cl.f90 \ $(top_srcdir)/mpi/include/fstarpu_mpi_mod.f90 \ $(top_srcdir)/include/fstarpu_mod.f90 \ native_fortran/nf_mm.f90 native_fortran_nf_mm_LDADD = \ -lm native_fortran_nf_basic_ring_SOURCES = \ $(top_srcdir)/mpi/include/fstarpu_mpi_mod.f90 \ $(top_srcdir)/include/fstarpu_mod.f90 \ native_fortran/nf_basic_ring.f90 native_fortran_nf_basic_ring_LDADD = \ -lm starpu_mpi_EXAMPLES += \ native_fortran/nf_mm \ native_fortran/nf_basic_ring endif endif endif ################### # complex example # ################### if BUILD_EXAMPLES examplebin_PROGRAMS += \ complex/mpi_complex complex_mpi_complex_SOURCES = \ complex/mpi_complex.c \ ../../examples/interface/complex_interface.c starpu_mpi_EXAMPLES += \ complex/mpi_complex endif ######################### # user_datatype example # ######################### if BUILD_EXAMPLES examplebin_PROGRAMS += \ user_datatype/user_datatype user_datatype_user_datatype_SOURCES = \ user_datatype/user_datatype.c \ user_datatype/my_interface.c starpu_mpi_EXAMPLES += \ user_datatype/user_datatype endif ################### # comm example # ################### if BUILD_EXAMPLES examplebin_PROGRAMS += \ comm/comm \ comm/mix_comm starpu_mpi_EXAMPLES += \ comm/comm \ comm/mix_comm endif if STARPU_HAVE_MPIFORT if BUILD_EXAMPLES if !STARPU_SANITIZE # Native Fortran example # - list explicit dependences to control proper module files generation # - the overriding rule fully disables the corresponing default rule, thus # the default rule body must be copied entirely fstarpu_mod.mod: fstarpu_mod.o fstarpu_mpi_mod.mod: fstarpu_mpi_mod.o nf_mm_cl.mod: nf_mm_cl.o fstarpu_mod.o: $(top_srcdir)/include/fstarpu_mod.f90 $(AM_V_FC)$(FC) $(native_fortran_nf_mm_FCFLAGS) $(FCFLAGS) -c -o $@ '$(top_srcdir)/'include/fstarpu_mod.f90 fstarpu_mpi_mod.o: $(top_srcdir)/mpi/include/fstarpu_mpi_mod.f90 fstarpu_mod.mod $(AM_V_FC)$(FC) $(native_fortran_nf_mm_FCFLAGS) $(FCFLAGS) -c -o $@ '$(top_srcdir)/'mpi/include/fstarpu_mpi_mod.f90 nf_mm_cl.o: $(top_srcdir)/mpi/examples/native_fortran/nf_mm_cl.f90 fstarpu_mpi_mod.mod fstarpu_mod.mod $(AM_V_FC)$(FC) $(native_fortran_nf_mm_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_mm_cl.f90' || echo '$(srcdir)/'`native_fortran/nf_mm_cl.f90 nf_mm.o: $(top_srcdir)/mpi/examples/native_fortran/nf_mm.f90 nf_mm_cl.mod fstarpu_mpi_mod.mod fstarpu_mod.mod $(AM_V_FC)$(FC) $(native_fortran_nf_mm_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_mm.f90' || echo '$(srcdir)/'`native_fortran/nf_mm.f90 nf_basic_ring.o: $(top_srcdir)/mpi/examples/native_fortran/nf_basic_ring.f90 fstarpu_mpi_mod.mod fstarpu_mod.mod $(AM_V_FC)$(FC) $(native_fortran_nf_basic_ring_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_basic_ring.f90' || echo '$(srcdir)/'`native_fortran/nf_basic_ring.f90 endif endif endif starpu-1.2.3+dfsg/mpi/examples/Makefile.in000066400000000000000000004356701320135501600204350ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2013, 2015-2017 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015 CNRS # Copyright (C) 2016 Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @STARPU_MPI_CHECK_TRUE@@STARPU_SIMGRID_FALSE@TESTS = $(am__EXEEXT_6) check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_6) examplebin_PROGRAMS = $(am__EXEEXT_2) $(am__EXEEXT_7) $(am__EXEEXT_4) \ $(am__EXEEXT_5) @STARPU_USE_CUDA_TRUE@am__append_1 = --compiler-options -fno-strict-aliasing -I$(top_srcdir)/include/ -I$(top_builddir)/include/ $(HWLOC_CFLAGS) ################### # Stencil example # ################### @BUILD_EXAMPLES_TRUE@am__append_2 = \ @BUILD_EXAMPLES_TRUE@ stencil/stencil5 @BUILD_EXAMPLES_TRUE@am__append_3 = \ @BUILD_EXAMPLES_TRUE@ stencil/stencil5 ################## # MPI LU example # ################## ######################## # MPI Cholesky example # ######################## @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@am__append_4 = mpi_lu/plu_example_float \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/plu_example_double \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/plu_implicit_example_float \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/plu_implicit_example_double \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/plu_outofcore_example_float \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/plu_outofcore_example_double \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky_distributed @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@am__append_5 = \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky_distributed ########################################## # Native Fortran MPI Matrix mult example # ########################################## @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@am__append_6 = \ @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ native_fortran/nf_mm \ @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ native_fortran/nf_basic_ring @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@am__append_7 = \ @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ native_fortran/nf_mm \ @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ native_fortran/nf_basic_ring ################### # complex example # ################### ######################### # user_datatype example # ######################### ################### # comm example # ################### @BUILD_EXAMPLES_TRUE@am__append_8 = complex/mpi_complex \ @BUILD_EXAMPLES_TRUE@ user_datatype/user_datatype comm/comm \ @BUILD_EXAMPLES_TRUE@ comm/mix_comm @BUILD_EXAMPLES_TRUE@am__append_9 = complex/mpi_complex \ @BUILD_EXAMPLES_TRUE@ user_datatype/user_datatype comm/comm \ @BUILD_EXAMPLES_TRUE@ comm/mix_comm subdir = mpi/examples ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @STARPU_HAVE_WINDOWS_FALSE@am__EXEEXT_1 = loader$(EXEEXT) @BUILD_EXAMPLES_TRUE@am__EXEEXT_2 = stencil/stencil5$(EXEEXT) @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@am__EXEEXT_3 = matrix_decomposition/mpi_cholesky$(EXEEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky_distributed$(EXEEXT) @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@am__EXEEXT_4 = native_fortran/nf_mm$(EXEEXT) \ @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ native_fortran/nf_basic_ring$(EXEEXT) @BUILD_EXAMPLES_TRUE@am__EXEEXT_5 = complex/mpi_complex$(EXEEXT) \ @BUILD_EXAMPLES_TRUE@ user_datatype/user_datatype$(EXEEXT) \ @BUILD_EXAMPLES_TRUE@ comm/comm$(EXEEXT) comm/mix_comm$(EXEEXT) am__EXEEXT_6 = $(am__EXEEXT_2) $(am__EXEEXT_3) $(am__EXEEXT_4) \ $(am__EXEEXT_5) @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@am__EXEEXT_7 = mpi_lu/plu_example_float$(EXEEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/plu_example_double$(EXEEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/plu_implicit_example_float$(EXEEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/plu_implicit_example_double$(EXEEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/plu_outofcore_example_float$(EXEEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/plu_outofcore_example_double$(EXEEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky$(EXEEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky_distributed$(EXEEXT) am__installdirs = "$(DESTDIR)$(examplebindir)" PROGRAMS = $(examplebin_PROGRAMS) comm_comm_SOURCES = comm/comm.c comm_comm_OBJECTS = comm.$(OBJEXT) comm_comm_LDADD = $(LDADD) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am__dirstamp = $(am__leading_dot)dirstamp comm_mix_comm_SOURCES = comm/mix_comm.c comm_mix_comm_OBJECTS = mix_comm.$(OBJEXT) comm_mix_comm_LDADD = $(LDADD) am__complex_mpi_complex_SOURCES_DIST = complex/mpi_complex.c \ ../../examples/interface/complex_interface.c @BUILD_EXAMPLES_TRUE@am_complex_mpi_complex_OBJECTS = \ @BUILD_EXAMPLES_TRUE@ mpi_complex.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@ complex_interface.$(OBJEXT) complex_mpi_complex_OBJECTS = $(am_complex_mpi_complex_OBJECTS) complex_mpi_complex_LDADD = $(LDADD) am__loader_SOURCES_DIST = ../../tests/loader.c @STARPU_HAVE_WINDOWS_FALSE@am_loader_OBJECTS = \ @STARPU_HAVE_WINDOWS_FALSE@ loader-loader.$(OBJEXT) loader_OBJECTS = $(am_loader_OBJECTS) loader_LDADD = $(LDADD) am__matrix_decomposition_mpi_cholesky_SOURCES_DIST = \ matrix_decomposition/mpi_cholesky.c \ matrix_decomposition/mpi_cholesky_models.c \ matrix_decomposition/mpi_cholesky_kernels.c \ matrix_decomposition/mpi_cholesky_codelets.c \ matrix_decomposition/mpi_decomposition_params.c \ matrix_decomposition/mpi_decomposition_matrix.c \ ../../examples/common/blas.c @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@am_matrix_decomposition_mpi_cholesky_OBJECTS = mpi_cholesky.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_cholesky_models.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_cholesky_kernels.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_cholesky_codelets.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_decomposition_params.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_decomposition_matrix.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) matrix_decomposition_mpi_cholesky_OBJECTS = \ $(am_matrix_decomposition_mpi_cholesky_OBJECTS) am__DEPENDENCIES_1 = @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@matrix_decomposition_mpi_cholesky_DEPENDENCIES = \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) am__matrix_decomposition_mpi_cholesky_distributed_SOURCES_DIST = \ matrix_decomposition/mpi_cholesky_distributed.c \ matrix_decomposition/mpi_cholesky_models.c \ matrix_decomposition/mpi_cholesky_kernels.c \ matrix_decomposition/mpi_cholesky_codelets.c \ matrix_decomposition/mpi_decomposition_params.c \ matrix_decomposition/mpi_decomposition_matrix.c \ ../../examples/common/blas.c @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@am_matrix_decomposition_mpi_cholesky_distributed_OBJECTS = mpi_cholesky_distributed.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_cholesky_models.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_cholesky_kernels.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_cholesky_codelets.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_decomposition_params.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_decomposition_matrix.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) matrix_decomposition_mpi_cholesky_distributed_OBJECTS = \ $(am_matrix_decomposition_mpi_cholesky_distributed_OBJECTS) @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@matrix_decomposition_mpi_cholesky_distributed_DEPENDENCIES = \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) am__mpi_lu_plu_example_double_SOURCES_DIST = \ mpi_lu/plu_example_double.c mpi_lu/plu_solve_double.c \ mpi_lu/pdlu_kernels.c mpi_lu/pdlu.c \ ../../examples/common/blas.c @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@am_mpi_lu_plu_example_double_OBJECTS = plu_example_double.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ plu_solve_double.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ pdlu_kernels.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ pdlu.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) mpi_lu_plu_example_double_OBJECTS = \ $(am_mpi_lu_plu_example_double_OBJECTS) @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@mpi_lu_plu_example_double_DEPENDENCIES = \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) am__mpi_lu_plu_example_float_SOURCES_DIST = \ mpi_lu/plu_example_float.c mpi_lu/plu_solve_float.c \ mpi_lu/pslu_kernels.c mpi_lu/pslu.c \ ../../examples/common/blas.c @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@am_mpi_lu_plu_example_float_OBJECTS = plu_example_float.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ plu_solve_float.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ pslu_kernels.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ pslu.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) mpi_lu_plu_example_float_OBJECTS = \ $(am_mpi_lu_plu_example_float_OBJECTS) @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@mpi_lu_plu_example_float_DEPENDENCIES = \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) am__mpi_lu_plu_implicit_example_double_SOURCES_DIST = \ mpi_lu/plu_implicit_example_double.c mpi_lu/plu_solve_double.c \ mpi_lu/pdlu_kernels.c mpi_lu/pdlu_implicit.c \ ../../examples/common/blas.c @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@am_mpi_lu_plu_implicit_example_double_OBJECTS = plu_implicit_example_double.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ plu_solve_double.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ pdlu_kernels.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ pdlu_implicit.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) mpi_lu_plu_implicit_example_double_OBJECTS = \ $(am_mpi_lu_plu_implicit_example_double_OBJECTS) @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@mpi_lu_plu_implicit_example_double_DEPENDENCIES = \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) am__mpi_lu_plu_implicit_example_float_SOURCES_DIST = \ mpi_lu/plu_implicit_example_float.c mpi_lu/plu_solve_float.c \ mpi_lu/pslu_kernels.c mpi_lu/pslu_implicit.c \ ../../examples/common/blas.c @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@am_mpi_lu_plu_implicit_example_float_OBJECTS = plu_implicit_example_float.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ plu_solve_float.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ pslu_kernels.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ pslu_implicit.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) mpi_lu_plu_implicit_example_float_OBJECTS = \ $(am_mpi_lu_plu_implicit_example_float_OBJECTS) @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@mpi_lu_plu_implicit_example_float_DEPENDENCIES = \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) am__mpi_lu_plu_outofcore_example_double_SOURCES_DIST = \ mpi_lu/plu_outofcore_example_double.c \ mpi_lu/plu_solve_double.c mpi_lu/pdlu_kernels.c \ mpi_lu/pdlu_implicit.c ../../examples/common/blas.c @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@am_mpi_lu_plu_outofcore_example_double_OBJECTS = plu_outofcore_example_double.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ plu_solve_double.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ pdlu_kernels.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ pdlu_implicit.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) mpi_lu_plu_outofcore_example_double_OBJECTS = \ $(am_mpi_lu_plu_outofcore_example_double_OBJECTS) @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@mpi_lu_plu_outofcore_example_double_DEPENDENCIES = \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) am__mpi_lu_plu_outofcore_example_float_SOURCES_DIST = \ mpi_lu/plu_outofcore_example_float.c mpi_lu/plu_solve_float.c \ mpi_lu/pslu_kernels.c mpi_lu/pslu_implicit.c \ ../../examples/common/blas.c @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@am_mpi_lu_plu_outofcore_example_float_OBJECTS = plu_outofcore_example_float.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ plu_solve_float.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ pslu_kernels.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ pslu_implicit.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) mpi_lu_plu_outofcore_example_float_OBJECTS = \ $(am_mpi_lu_plu_outofcore_example_float_OBJECTS) @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@mpi_lu_plu_outofcore_example_float_DEPENDENCIES = \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) am__native_fortran_nf_basic_ring_SOURCES_DIST = \ $(top_srcdir)/mpi/include/fstarpu_mpi_mod.f90 \ $(top_srcdir)/include/fstarpu_mod.f90 \ native_fortran/nf_basic_ring.f90 @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@am_native_fortran_nf_basic_ring_OBJECTS = fstarpu_mpi_mod.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ fstarpu_mod.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ nf_basic_ring.$(OBJEXT) native_fortran_nf_basic_ring_OBJECTS = \ $(am_native_fortran_nf_basic_ring_OBJECTS) native_fortran_nf_basic_ring_DEPENDENCIES = am__native_fortran_nf_mm_SOURCES_DIST = native_fortran/nf_mm_cl.f90 \ $(top_srcdir)/mpi/include/fstarpu_mpi_mod.f90 \ $(top_srcdir)/include/fstarpu_mod.f90 native_fortran/nf_mm.f90 @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@am_native_fortran_nf_mm_OBJECTS = nf_mm_cl.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ fstarpu_mpi_mod.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ fstarpu_mod.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ nf_mm.$(OBJEXT) native_fortran_nf_mm_OBJECTS = $(am_native_fortran_nf_mm_OBJECTS) native_fortran_nf_mm_DEPENDENCIES = stencil_stencil5_SOURCES = stencil/stencil5.c stencil_stencil5_OBJECTS = stencil5.$(OBJEXT) stencil_stencil5_LDADD = $(LDADD) am__user_datatype_user_datatype_SOURCES_DIST = \ user_datatype/user_datatype.c user_datatype/my_interface.c @BUILD_EXAMPLES_TRUE@am_user_datatype_user_datatype_OBJECTS = \ @BUILD_EXAMPLES_TRUE@ user_datatype.$(OBJEXT) \ @BUILD_EXAMPLES_TRUE@ my_interface.$(OBJEXT) user_datatype_user_datatype_OBJECTS = \ $(am_user_datatype_user_datatype_OBJECTS) user_datatype_user_datatype_LDADD = $(LDADD) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/common -I$(top_builddir)/include -I$(top_builddir)/gcc-plugin/include/starpu-gcc -I$(top_builddir)/starpu-top depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = FCCOMPILE = $(FC) $(AM_FCFLAGS) $(FCFLAGS) LTFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS) AM_V_FC = $(am__v_FC_@AM_V@) am__v_FC_ = $(am__v_FC_@AM_DEFAULT_V@) am__v_FC_0 = @echo " FC " $@; am__v_FC_1 = FCLINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_FCLD = $(am__v_FCLD_@AM_V@) am__v_FCLD_ = $(am__v_FCLD_@AM_DEFAULT_V@) am__v_FCLD_0 = @echo " FCLD " $@; am__v_FCLD_1 = SOURCES = comm/comm.c comm/mix_comm.c $(complex_mpi_complex_SOURCES) \ $(loader_SOURCES) $(matrix_decomposition_mpi_cholesky_SOURCES) \ $(matrix_decomposition_mpi_cholesky_distributed_SOURCES) \ $(mpi_lu_plu_example_double_SOURCES) \ $(mpi_lu_plu_example_float_SOURCES) \ $(mpi_lu_plu_implicit_example_double_SOURCES) \ $(mpi_lu_plu_implicit_example_float_SOURCES) \ $(mpi_lu_plu_outofcore_example_double_SOURCES) \ $(mpi_lu_plu_outofcore_example_float_SOURCES) \ $(native_fortran_nf_basic_ring_SOURCES) \ $(native_fortran_nf_mm_SOURCES) stencil/stencil5.c \ $(user_datatype_user_datatype_SOURCES) DIST_SOURCES = comm/comm.c comm/mix_comm.c \ $(am__complex_mpi_complex_SOURCES_DIST) \ $(am__loader_SOURCES_DIST) \ $(am__matrix_decomposition_mpi_cholesky_SOURCES_DIST) \ $(am__matrix_decomposition_mpi_cholesky_distributed_SOURCES_DIST) \ $(am__mpi_lu_plu_example_double_SOURCES_DIST) \ $(am__mpi_lu_plu_example_float_SOURCES_DIST) \ $(am__mpi_lu_plu_implicit_example_double_SOURCES_DIST) \ $(am__mpi_lu_plu_implicit_example_float_SOURCES_DIST) \ $(am__mpi_lu_plu_outofcore_example_double_SOURCES_DIST) \ $(am__mpi_lu_plu_outofcore_example_float_SOURCES_DIST) \ $(am__native_fortran_nf_basic_ring_SOURCES_DIST) \ $(am__native_fortran_nf_mm_SOURCES_DIST) stencil/stencil5.c \ $(am__user_datatype_user_datatype_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/build-aux/depcomp \ $(top_srcdir)/build-aux/test-driver $(top_srcdir)/starpu.mk DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = $(MPICC) CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = $(MPIFORT) FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = $(top_builddir)/src/@LIBSTARPU_LINK@ ../src/libstarpumpi-@STARPU_EFFECTIVE_VERSION@.la -lm @LIBS@ $(FXT_LIBS) $(MAGMA_LIBS) LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ $(am__append_1) NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POTI_CFLAGS = @POTI_CFLAGS@ POTI_LIBS = @POTI_LIBS@ PROG_DATE = @PROG_DATE@ PROG_STAT = @PROG_STAT@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_COI_CPPFLAGS = @STARPU_COI_CPPFLAGS@ STARPU_COI_LDFLAGS = @STARPU_COI_LDFLAGS@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LEVELDB_LDFLAGS = @STARPU_LEVELDB_LDFLAGS@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RCCE_CFLAGS = @STARPU_RCCE_CFLAGS@ STARPU_RCCE_CPPFLAGS = @STARPU_RCCE_CPPFLAGS@ STARPU_RCCE_LDFLAGS = @STARPU_RCCE_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SCIF_CPPFLAGS = @STARPU_SCIF_CPPFLAGS@ STARPU_SCIF_LDFLAGS = @STARPU_SCIF_LDFLAGS@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SC_HYPERVISOR_DEBUG = @STARPU_SC_HYPERVISOR_DEBUG@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ mpifort_path = @mpifort_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ smpirun_path = @smpirun_path@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ CCLD = $(MPICC) FCLD = $(MPIFORT) @STARPU_HAVE_WINDOWS_FALSE@LOADER_BIN = $(abs_top_builddir)/mpi/examples/$(LOADER) @STARPU_HAVE_WINDOWS_TRUE@LOADER_BIN = @STARPU_HAVE_WINDOWS_FALSE@loader_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -I$(top_builddir)/src/ @STARPU_HAVE_WINDOWS_FALSE@LOADER = loader @STARPU_HAVE_WINDOWS_FALSE@loader_SOURCES = ../../tests/loader.c @STARPU_QUICK_CHECK_FALSE@MPI = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 # we always test on 4 processes, the execution time is not that bigger @STARPU_QUICK_CHECK_TRUE@MPI = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 @STARPU_HAVE_AM111_FALSE@TESTS_ENVIRONMENT = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=4 top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(MPI) $(LOADER_BIN) @STARPU_HAVE_AM111_TRUE@TESTS_ENVIRONMENT = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=4 top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" @STARPU_HAVE_AM111_TRUE@LOG_COMPILER = $(MPI) $(LOADER_BIN) starpu_mpi_EXAMPLES = $(am__append_3) $(am__append_5) $(am__append_7) \ $(am__append_9) BUILT_SOURCES = CLEANFILES = *.gcno *.gcda *.linkinfo starpu_idle_microsec.log *.mod EXTRA_DIST = \ mpi_lu/mpi_lu-float.h \ mpi_lu/mpi_lu-double.h \ mpi_lu/plu_example.c \ mpi_lu/plu_implicit_example.c \ mpi_lu/plu_outofcore_example.c \ mpi_lu/plu_solve.c \ mpi_lu/pxlu.h \ mpi_lu/pxlu.c \ mpi_lu/pxlu_implicit.c \ mpi_lu/pxlu_kernels.h \ mpi_lu/pxlu_kernels.c \ matrix_decomposition/mpi_cholesky.h \ matrix_decomposition/mpi_cholesky_codelets.h \ matrix_decomposition/mpi_cholesky_kernels.h \ matrix_decomposition/mpi_cholesky_models.h \ matrix_decomposition/mpi_decomposition_params.h \ matrix_decomposition/mpi_decomposition_matrix.h \ user_datatype/my_interface.h \ helper.h examplebindir = $(libdir)/starpu/mpi AM_CFLAGS = -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(FXT_CFLAGS) $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) $(GLOBAL_AM_CFLAGS) -Wno-unused AM_CPPFLAGS = -I$(top_srcdir)/include/ -I$(top_srcdir)/examples/ -I$(top_builddir)/include -I$(top_srcdir)/mpi/include AM_LDFLAGS = $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) $(FXT_LDFLAGS) $(STARPU_COI_LDFLAGS) $(STARPU_SCIF_LDFLAGS) @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@mpi_lu_plu_example_float_LDADD = \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(STARPU_LIBNUMA_LDFLAGS) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) -lm @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@mpi_lu_plu_example_float_SOURCES = \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/plu_example_float.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/plu_solve_float.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/pslu_kernels.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/pslu.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ ../../examples/common/blas.c @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@mpi_lu_plu_example_double_LDADD = \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(STARPU_LIBNUMA_LDFLAGS) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) -lm @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@mpi_lu_plu_example_double_SOURCES = \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/plu_example_double.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/plu_solve_double.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/pdlu_kernels.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/pdlu.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ ../../examples/common/blas.c @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@mpi_lu_plu_implicit_example_float_LDADD = \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(STARPU_LIBNUMA_LDFLAGS) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) -lm @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@mpi_lu_plu_implicit_example_float_SOURCES = \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/plu_implicit_example_float.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/plu_solve_float.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/pslu_kernels.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/pslu_implicit.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ ../../examples/common/blas.c @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@mpi_lu_plu_implicit_example_double_LDADD = \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(STARPU_LIBNUMA_LDFLAGS) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) -lm @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@mpi_lu_plu_implicit_example_double_SOURCES = \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/plu_implicit_example_double.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/plu_solve_double.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/pdlu_kernels.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/pdlu_implicit.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ ../../examples/common/blas.c @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@mpi_lu_plu_outofcore_example_float_LDADD = \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(STARPU_LIBNUMA_LDFLAGS) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) -lm @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@mpi_lu_plu_outofcore_example_float_SOURCES = \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/plu_outofcore_example_float.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/plu_solve_float.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/pslu_kernels.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/pslu_implicit.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ ../../examples/common/blas.c @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@mpi_lu_plu_outofcore_example_double_LDADD = \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(STARPU_LIBNUMA_LDFLAGS) \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) -lm @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@mpi_lu_plu_outofcore_example_double_SOURCES = \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/plu_outofcore_example_double.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/plu_solve_double.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/pdlu_kernels.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ mpi_lu/pdlu_implicit.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ ../../examples/common/blas.c @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@matrix_decomposition_mpi_cholesky_SOURCES = \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky_models.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky_kernels.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky_codelets.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_decomposition_params.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_decomposition_matrix.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ ../../examples/common/blas.c @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@matrix_decomposition_mpi_cholesky_LDADD = \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) -lm @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@matrix_decomposition_mpi_cholesky_distributed_SOURCES = \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky_distributed.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky_models.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky_kernels.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky_codelets.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_decomposition_params.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_decomposition_matrix.c \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ ../../examples/common/blas.c @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@matrix_decomposition_mpi_cholesky_distributed_LDADD = \ @BUILD_EXAMPLES_TRUE@@NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) -lm @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@native_fortran_nf_mm_SOURCES = \ @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ native_fortran/nf_mm_cl.f90 \ @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ $(top_srcdir)/mpi/include/fstarpu_mpi_mod.f90 \ @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ $(top_srcdir)/include/fstarpu_mod.f90 \ @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ native_fortran/nf_mm.f90 @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@native_fortran_nf_mm_LDADD = \ @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ -lm @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@native_fortran_nf_basic_ring_SOURCES = \ @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ $(top_srcdir)/mpi/include/fstarpu_mpi_mod.f90 \ @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ $(top_srcdir)/include/fstarpu_mod.f90 \ @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ native_fortran/nf_basic_ring.f90 @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@native_fortran_nf_basic_ring_LDADD = \ @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ -lm @BUILD_EXAMPLES_TRUE@complex_mpi_complex_SOURCES = \ @BUILD_EXAMPLES_TRUE@ complex/mpi_complex.c \ @BUILD_EXAMPLES_TRUE@ ../../examples/interface/complex_interface.c @BUILD_EXAMPLES_TRUE@user_datatype_user_datatype_SOURCES = \ @BUILD_EXAMPLES_TRUE@ user_datatype/user_datatype.c \ @BUILD_EXAMPLES_TRUE@ user_datatype/my_interface.c all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .cu .cubin .f90 .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/starpu.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign mpi/examples/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign mpi/examples/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/starpu.mk $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-examplebinPROGRAMS: $(examplebin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(examplebin_PROGRAMS)'; test -n "$(examplebindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(examplebindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(examplebindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(examplebindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(examplebindir)$$dir" || exit $$?; \ } \ ; done uninstall-examplebinPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(examplebin_PROGRAMS)'; test -n "$(examplebindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(examplebindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(examplebindir)" && rm -f $$files clean-examplebinPROGRAMS: @list='$(examplebin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list comm/$(am__dirstamp): @$(MKDIR_P) comm @: > comm/$(am__dirstamp) comm/comm$(EXEEXT): $(comm_comm_OBJECTS) $(comm_comm_DEPENDENCIES) $(EXTRA_comm_comm_DEPENDENCIES) comm/$(am__dirstamp) @rm -f comm/comm$(EXEEXT) $(AM_V_CCLD)$(LINK) $(comm_comm_OBJECTS) $(comm_comm_LDADD) $(LIBS) comm/mix_comm$(EXEEXT): $(comm_mix_comm_OBJECTS) $(comm_mix_comm_DEPENDENCIES) $(EXTRA_comm_mix_comm_DEPENDENCIES) comm/$(am__dirstamp) @rm -f comm/mix_comm$(EXEEXT) $(AM_V_CCLD)$(LINK) $(comm_mix_comm_OBJECTS) $(comm_mix_comm_LDADD) $(LIBS) complex/$(am__dirstamp): @$(MKDIR_P) complex @: > complex/$(am__dirstamp) complex/mpi_complex$(EXEEXT): $(complex_mpi_complex_OBJECTS) $(complex_mpi_complex_DEPENDENCIES) $(EXTRA_complex_mpi_complex_DEPENDENCIES) complex/$(am__dirstamp) @rm -f complex/mpi_complex$(EXEEXT) $(AM_V_CCLD)$(LINK) $(complex_mpi_complex_OBJECTS) $(complex_mpi_complex_LDADD) $(LIBS) loader$(EXEEXT): $(loader_OBJECTS) $(loader_DEPENDENCIES) $(EXTRA_loader_DEPENDENCIES) @rm -f loader$(EXEEXT) $(AM_V_CCLD)$(LINK) $(loader_OBJECTS) $(loader_LDADD) $(LIBS) matrix_decomposition/$(am__dirstamp): @$(MKDIR_P) matrix_decomposition @: > matrix_decomposition/$(am__dirstamp) matrix_decomposition/mpi_cholesky$(EXEEXT): $(matrix_decomposition_mpi_cholesky_OBJECTS) $(matrix_decomposition_mpi_cholesky_DEPENDENCIES) $(EXTRA_matrix_decomposition_mpi_cholesky_DEPENDENCIES) matrix_decomposition/$(am__dirstamp) @rm -f matrix_decomposition/mpi_cholesky$(EXEEXT) $(AM_V_CCLD)$(LINK) $(matrix_decomposition_mpi_cholesky_OBJECTS) $(matrix_decomposition_mpi_cholesky_LDADD) $(LIBS) matrix_decomposition/mpi_cholesky_distributed$(EXEEXT): $(matrix_decomposition_mpi_cholesky_distributed_OBJECTS) $(matrix_decomposition_mpi_cholesky_distributed_DEPENDENCIES) $(EXTRA_matrix_decomposition_mpi_cholesky_distributed_DEPENDENCIES) matrix_decomposition/$(am__dirstamp) @rm -f matrix_decomposition/mpi_cholesky_distributed$(EXEEXT) $(AM_V_CCLD)$(LINK) $(matrix_decomposition_mpi_cholesky_distributed_OBJECTS) $(matrix_decomposition_mpi_cholesky_distributed_LDADD) $(LIBS) mpi_lu/$(am__dirstamp): @$(MKDIR_P) mpi_lu @: > mpi_lu/$(am__dirstamp) mpi_lu/plu_example_double$(EXEEXT): $(mpi_lu_plu_example_double_OBJECTS) $(mpi_lu_plu_example_double_DEPENDENCIES) $(EXTRA_mpi_lu_plu_example_double_DEPENDENCIES) mpi_lu/$(am__dirstamp) @rm -f mpi_lu/plu_example_double$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mpi_lu_plu_example_double_OBJECTS) $(mpi_lu_plu_example_double_LDADD) $(LIBS) mpi_lu/plu_example_float$(EXEEXT): $(mpi_lu_plu_example_float_OBJECTS) $(mpi_lu_plu_example_float_DEPENDENCIES) $(EXTRA_mpi_lu_plu_example_float_DEPENDENCIES) mpi_lu/$(am__dirstamp) @rm -f mpi_lu/plu_example_float$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mpi_lu_plu_example_float_OBJECTS) $(mpi_lu_plu_example_float_LDADD) $(LIBS) mpi_lu/plu_implicit_example_double$(EXEEXT): $(mpi_lu_plu_implicit_example_double_OBJECTS) $(mpi_lu_plu_implicit_example_double_DEPENDENCIES) $(EXTRA_mpi_lu_plu_implicit_example_double_DEPENDENCIES) mpi_lu/$(am__dirstamp) @rm -f mpi_lu/plu_implicit_example_double$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mpi_lu_plu_implicit_example_double_OBJECTS) $(mpi_lu_plu_implicit_example_double_LDADD) $(LIBS) mpi_lu/plu_implicit_example_float$(EXEEXT): $(mpi_lu_plu_implicit_example_float_OBJECTS) $(mpi_lu_plu_implicit_example_float_DEPENDENCIES) $(EXTRA_mpi_lu_plu_implicit_example_float_DEPENDENCIES) mpi_lu/$(am__dirstamp) @rm -f mpi_lu/plu_implicit_example_float$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mpi_lu_plu_implicit_example_float_OBJECTS) $(mpi_lu_plu_implicit_example_float_LDADD) $(LIBS) mpi_lu/plu_outofcore_example_double$(EXEEXT): $(mpi_lu_plu_outofcore_example_double_OBJECTS) $(mpi_lu_plu_outofcore_example_double_DEPENDENCIES) $(EXTRA_mpi_lu_plu_outofcore_example_double_DEPENDENCIES) mpi_lu/$(am__dirstamp) @rm -f mpi_lu/plu_outofcore_example_double$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mpi_lu_plu_outofcore_example_double_OBJECTS) $(mpi_lu_plu_outofcore_example_double_LDADD) $(LIBS) mpi_lu/plu_outofcore_example_float$(EXEEXT): $(mpi_lu_plu_outofcore_example_float_OBJECTS) $(mpi_lu_plu_outofcore_example_float_DEPENDENCIES) $(EXTRA_mpi_lu_plu_outofcore_example_float_DEPENDENCIES) mpi_lu/$(am__dirstamp) @rm -f mpi_lu/plu_outofcore_example_float$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mpi_lu_plu_outofcore_example_float_OBJECTS) $(mpi_lu_plu_outofcore_example_float_LDADD) $(LIBS) native_fortran/$(am__dirstamp): @$(MKDIR_P) native_fortran @: > native_fortran/$(am__dirstamp) native_fortran/nf_basic_ring$(EXEEXT): $(native_fortran_nf_basic_ring_OBJECTS) $(native_fortran_nf_basic_ring_DEPENDENCIES) $(EXTRA_native_fortran_nf_basic_ring_DEPENDENCIES) native_fortran/$(am__dirstamp) @rm -f native_fortran/nf_basic_ring$(EXEEXT) $(AM_V_FCLD)$(FCLINK) $(native_fortran_nf_basic_ring_OBJECTS) $(native_fortran_nf_basic_ring_LDADD) $(LIBS) native_fortran/nf_mm$(EXEEXT): $(native_fortran_nf_mm_OBJECTS) $(native_fortran_nf_mm_DEPENDENCIES) $(EXTRA_native_fortran_nf_mm_DEPENDENCIES) native_fortran/$(am__dirstamp) @rm -f native_fortran/nf_mm$(EXEEXT) $(AM_V_FCLD)$(FCLINK) $(native_fortran_nf_mm_OBJECTS) $(native_fortran_nf_mm_LDADD) $(LIBS) stencil/$(am__dirstamp): @$(MKDIR_P) stencil @: > stencil/$(am__dirstamp) stencil/stencil5$(EXEEXT): $(stencil_stencil5_OBJECTS) $(stencil_stencil5_DEPENDENCIES) $(EXTRA_stencil_stencil5_DEPENDENCIES) stencil/$(am__dirstamp) @rm -f stencil/stencil5$(EXEEXT) $(AM_V_CCLD)$(LINK) $(stencil_stencil5_OBJECTS) $(stencil_stencil5_LDADD) $(LIBS) user_datatype/$(am__dirstamp): @$(MKDIR_P) user_datatype @: > user_datatype/$(am__dirstamp) user_datatype/user_datatype$(EXEEXT): $(user_datatype_user_datatype_OBJECTS) $(user_datatype_user_datatype_DEPENDENCIES) $(EXTRA_user_datatype_user_datatype_DEPENDENCIES) user_datatype/$(am__dirstamp) @rm -f user_datatype/user_datatype$(EXEEXT) $(AM_V_CCLD)$(LINK) $(user_datatype_user_datatype_OBJECTS) $(user_datatype_user_datatype_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blas.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/comm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/complex_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loader-loader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_comm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_cholesky.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_cholesky_codelets.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_cholesky_distributed.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_cholesky_kernels.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_cholesky_models.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_complex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_decomposition_matrix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_decomposition_params.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/my_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdlu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdlu_implicit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdlu_kernels.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plu_example_double.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plu_example_float.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plu_implicit_example_double.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plu_implicit_example_float.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plu_outofcore_example_double.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plu_outofcore_example_float.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plu_solve_double.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plu_solve_float.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pslu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pslu_implicit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pslu_kernels.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stencil5.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/user_datatype.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< comm.o: comm/comm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT comm.o -MD -MP -MF $(DEPDIR)/comm.Tpo -c -o comm.o `test -f 'comm/comm.c' || echo '$(srcdir)/'`comm/comm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/comm.Tpo $(DEPDIR)/comm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='comm/comm.c' object='comm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o comm.o `test -f 'comm/comm.c' || echo '$(srcdir)/'`comm/comm.c comm.obj: comm/comm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT comm.obj -MD -MP -MF $(DEPDIR)/comm.Tpo -c -o comm.obj `if test -f 'comm/comm.c'; then $(CYGPATH_W) 'comm/comm.c'; else $(CYGPATH_W) '$(srcdir)/comm/comm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/comm.Tpo $(DEPDIR)/comm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='comm/comm.c' object='comm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o comm.obj `if test -f 'comm/comm.c'; then $(CYGPATH_W) 'comm/comm.c'; else $(CYGPATH_W) '$(srcdir)/comm/comm.c'; fi` mix_comm.o: comm/mix_comm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mix_comm.o -MD -MP -MF $(DEPDIR)/mix_comm.Tpo -c -o mix_comm.o `test -f 'comm/mix_comm.c' || echo '$(srcdir)/'`comm/mix_comm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mix_comm.Tpo $(DEPDIR)/mix_comm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='comm/mix_comm.c' object='mix_comm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mix_comm.o `test -f 'comm/mix_comm.c' || echo '$(srcdir)/'`comm/mix_comm.c mix_comm.obj: comm/mix_comm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mix_comm.obj -MD -MP -MF $(DEPDIR)/mix_comm.Tpo -c -o mix_comm.obj `if test -f 'comm/mix_comm.c'; then $(CYGPATH_W) 'comm/mix_comm.c'; else $(CYGPATH_W) '$(srcdir)/comm/mix_comm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mix_comm.Tpo $(DEPDIR)/mix_comm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='comm/mix_comm.c' object='mix_comm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mix_comm.obj `if test -f 'comm/mix_comm.c'; then $(CYGPATH_W) 'comm/mix_comm.c'; else $(CYGPATH_W) '$(srcdir)/comm/mix_comm.c'; fi` mpi_complex.o: complex/mpi_complex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mpi_complex.o -MD -MP -MF $(DEPDIR)/mpi_complex.Tpo -c -o mpi_complex.o `test -f 'complex/mpi_complex.c' || echo '$(srcdir)/'`complex/mpi_complex.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_complex.Tpo $(DEPDIR)/mpi_complex.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='complex/mpi_complex.c' object='mpi_complex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mpi_complex.o `test -f 'complex/mpi_complex.c' || echo '$(srcdir)/'`complex/mpi_complex.c mpi_complex.obj: complex/mpi_complex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mpi_complex.obj -MD -MP -MF $(DEPDIR)/mpi_complex.Tpo -c -o mpi_complex.obj `if test -f 'complex/mpi_complex.c'; then $(CYGPATH_W) 'complex/mpi_complex.c'; else $(CYGPATH_W) '$(srcdir)/complex/mpi_complex.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_complex.Tpo $(DEPDIR)/mpi_complex.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='complex/mpi_complex.c' object='mpi_complex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mpi_complex.obj `if test -f 'complex/mpi_complex.c'; then $(CYGPATH_W) 'complex/mpi_complex.c'; else $(CYGPATH_W) '$(srcdir)/complex/mpi_complex.c'; fi` complex_interface.o: ../../examples/interface/complex_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT complex_interface.o -MD -MP -MF $(DEPDIR)/complex_interface.Tpo -c -o complex_interface.o `test -f '../../examples/interface/complex_interface.c' || echo '$(srcdir)/'`../../examples/interface/complex_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/complex_interface.Tpo $(DEPDIR)/complex_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../examples/interface/complex_interface.c' object='complex_interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o complex_interface.o `test -f '../../examples/interface/complex_interface.c' || echo '$(srcdir)/'`../../examples/interface/complex_interface.c complex_interface.obj: ../../examples/interface/complex_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT complex_interface.obj -MD -MP -MF $(DEPDIR)/complex_interface.Tpo -c -o complex_interface.obj `if test -f '../../examples/interface/complex_interface.c'; then $(CYGPATH_W) '../../examples/interface/complex_interface.c'; else $(CYGPATH_W) '$(srcdir)/../../examples/interface/complex_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/complex_interface.Tpo $(DEPDIR)/complex_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../examples/interface/complex_interface.c' object='complex_interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o complex_interface.obj `if test -f '../../examples/interface/complex_interface.c'; then $(CYGPATH_W) '../../examples/interface/complex_interface.c'; else $(CYGPATH_W) '$(srcdir)/../../examples/interface/complex_interface.c'; fi` loader-loader.o: ../../tests/loader.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT loader-loader.o -MD -MP -MF $(DEPDIR)/loader-loader.Tpo -c -o loader-loader.o `test -f '../../tests/loader.c' || echo '$(srcdir)/'`../../tests/loader.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/loader-loader.Tpo $(DEPDIR)/loader-loader.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../tests/loader.c' object='loader-loader.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o loader-loader.o `test -f '../../tests/loader.c' || echo '$(srcdir)/'`../../tests/loader.c loader-loader.obj: ../../tests/loader.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT loader-loader.obj -MD -MP -MF $(DEPDIR)/loader-loader.Tpo -c -o loader-loader.obj `if test -f '../../tests/loader.c'; then $(CYGPATH_W) '../../tests/loader.c'; else $(CYGPATH_W) '$(srcdir)/../../tests/loader.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/loader-loader.Tpo $(DEPDIR)/loader-loader.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../tests/loader.c' object='loader-loader.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o loader-loader.obj `if test -f '../../tests/loader.c'; then $(CYGPATH_W) '../../tests/loader.c'; else $(CYGPATH_W) '$(srcdir)/../../tests/loader.c'; fi` mpi_cholesky.o: matrix_decomposition/mpi_cholesky.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mpi_cholesky.o -MD -MP -MF $(DEPDIR)/mpi_cholesky.Tpo -c -o mpi_cholesky.o `test -f 'matrix_decomposition/mpi_cholesky.c' || echo '$(srcdir)/'`matrix_decomposition/mpi_cholesky.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_cholesky.Tpo $(DEPDIR)/mpi_cholesky.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matrix_decomposition/mpi_cholesky.c' object='mpi_cholesky.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mpi_cholesky.o `test -f 'matrix_decomposition/mpi_cholesky.c' || echo '$(srcdir)/'`matrix_decomposition/mpi_cholesky.c mpi_cholesky.obj: matrix_decomposition/mpi_cholesky.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mpi_cholesky.obj -MD -MP -MF $(DEPDIR)/mpi_cholesky.Tpo -c -o mpi_cholesky.obj `if test -f 'matrix_decomposition/mpi_cholesky.c'; then $(CYGPATH_W) 'matrix_decomposition/mpi_cholesky.c'; else $(CYGPATH_W) '$(srcdir)/matrix_decomposition/mpi_cholesky.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_cholesky.Tpo $(DEPDIR)/mpi_cholesky.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matrix_decomposition/mpi_cholesky.c' object='mpi_cholesky.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mpi_cholesky.obj `if test -f 'matrix_decomposition/mpi_cholesky.c'; then $(CYGPATH_W) 'matrix_decomposition/mpi_cholesky.c'; else $(CYGPATH_W) '$(srcdir)/matrix_decomposition/mpi_cholesky.c'; fi` mpi_cholesky_models.o: matrix_decomposition/mpi_cholesky_models.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mpi_cholesky_models.o -MD -MP -MF $(DEPDIR)/mpi_cholesky_models.Tpo -c -o mpi_cholesky_models.o `test -f 'matrix_decomposition/mpi_cholesky_models.c' || echo '$(srcdir)/'`matrix_decomposition/mpi_cholesky_models.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_cholesky_models.Tpo $(DEPDIR)/mpi_cholesky_models.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matrix_decomposition/mpi_cholesky_models.c' object='mpi_cholesky_models.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mpi_cholesky_models.o `test -f 'matrix_decomposition/mpi_cholesky_models.c' || echo '$(srcdir)/'`matrix_decomposition/mpi_cholesky_models.c mpi_cholesky_models.obj: matrix_decomposition/mpi_cholesky_models.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mpi_cholesky_models.obj -MD -MP -MF $(DEPDIR)/mpi_cholesky_models.Tpo -c -o mpi_cholesky_models.obj `if test -f 'matrix_decomposition/mpi_cholesky_models.c'; then $(CYGPATH_W) 'matrix_decomposition/mpi_cholesky_models.c'; else $(CYGPATH_W) '$(srcdir)/matrix_decomposition/mpi_cholesky_models.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_cholesky_models.Tpo $(DEPDIR)/mpi_cholesky_models.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matrix_decomposition/mpi_cholesky_models.c' object='mpi_cholesky_models.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mpi_cholesky_models.obj `if test -f 'matrix_decomposition/mpi_cholesky_models.c'; then $(CYGPATH_W) 'matrix_decomposition/mpi_cholesky_models.c'; else $(CYGPATH_W) '$(srcdir)/matrix_decomposition/mpi_cholesky_models.c'; fi` mpi_cholesky_kernels.o: matrix_decomposition/mpi_cholesky_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mpi_cholesky_kernels.o -MD -MP -MF $(DEPDIR)/mpi_cholesky_kernels.Tpo -c -o mpi_cholesky_kernels.o `test -f 'matrix_decomposition/mpi_cholesky_kernels.c' || echo '$(srcdir)/'`matrix_decomposition/mpi_cholesky_kernels.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_cholesky_kernels.Tpo $(DEPDIR)/mpi_cholesky_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matrix_decomposition/mpi_cholesky_kernels.c' object='mpi_cholesky_kernels.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mpi_cholesky_kernels.o `test -f 'matrix_decomposition/mpi_cholesky_kernels.c' || echo '$(srcdir)/'`matrix_decomposition/mpi_cholesky_kernels.c mpi_cholesky_kernels.obj: matrix_decomposition/mpi_cholesky_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mpi_cholesky_kernels.obj -MD -MP -MF $(DEPDIR)/mpi_cholesky_kernels.Tpo -c -o mpi_cholesky_kernels.obj `if test -f 'matrix_decomposition/mpi_cholesky_kernels.c'; then $(CYGPATH_W) 'matrix_decomposition/mpi_cholesky_kernels.c'; else $(CYGPATH_W) '$(srcdir)/matrix_decomposition/mpi_cholesky_kernels.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_cholesky_kernels.Tpo $(DEPDIR)/mpi_cholesky_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matrix_decomposition/mpi_cholesky_kernels.c' object='mpi_cholesky_kernels.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mpi_cholesky_kernels.obj `if test -f 'matrix_decomposition/mpi_cholesky_kernels.c'; then $(CYGPATH_W) 'matrix_decomposition/mpi_cholesky_kernels.c'; else $(CYGPATH_W) '$(srcdir)/matrix_decomposition/mpi_cholesky_kernels.c'; fi` mpi_cholesky_codelets.o: matrix_decomposition/mpi_cholesky_codelets.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mpi_cholesky_codelets.o -MD -MP -MF $(DEPDIR)/mpi_cholesky_codelets.Tpo -c -o mpi_cholesky_codelets.o `test -f 'matrix_decomposition/mpi_cholesky_codelets.c' || echo '$(srcdir)/'`matrix_decomposition/mpi_cholesky_codelets.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_cholesky_codelets.Tpo $(DEPDIR)/mpi_cholesky_codelets.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matrix_decomposition/mpi_cholesky_codelets.c' object='mpi_cholesky_codelets.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mpi_cholesky_codelets.o `test -f 'matrix_decomposition/mpi_cholesky_codelets.c' || echo '$(srcdir)/'`matrix_decomposition/mpi_cholesky_codelets.c mpi_cholesky_codelets.obj: matrix_decomposition/mpi_cholesky_codelets.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mpi_cholesky_codelets.obj -MD -MP -MF $(DEPDIR)/mpi_cholesky_codelets.Tpo -c -o mpi_cholesky_codelets.obj `if test -f 'matrix_decomposition/mpi_cholesky_codelets.c'; then $(CYGPATH_W) 'matrix_decomposition/mpi_cholesky_codelets.c'; else $(CYGPATH_W) '$(srcdir)/matrix_decomposition/mpi_cholesky_codelets.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_cholesky_codelets.Tpo $(DEPDIR)/mpi_cholesky_codelets.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matrix_decomposition/mpi_cholesky_codelets.c' object='mpi_cholesky_codelets.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mpi_cholesky_codelets.obj `if test -f 'matrix_decomposition/mpi_cholesky_codelets.c'; then $(CYGPATH_W) 'matrix_decomposition/mpi_cholesky_codelets.c'; else $(CYGPATH_W) '$(srcdir)/matrix_decomposition/mpi_cholesky_codelets.c'; fi` mpi_decomposition_params.o: matrix_decomposition/mpi_decomposition_params.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mpi_decomposition_params.o -MD -MP -MF $(DEPDIR)/mpi_decomposition_params.Tpo -c -o mpi_decomposition_params.o `test -f 'matrix_decomposition/mpi_decomposition_params.c' || echo '$(srcdir)/'`matrix_decomposition/mpi_decomposition_params.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_decomposition_params.Tpo $(DEPDIR)/mpi_decomposition_params.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matrix_decomposition/mpi_decomposition_params.c' object='mpi_decomposition_params.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mpi_decomposition_params.o `test -f 'matrix_decomposition/mpi_decomposition_params.c' || echo '$(srcdir)/'`matrix_decomposition/mpi_decomposition_params.c mpi_decomposition_params.obj: matrix_decomposition/mpi_decomposition_params.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mpi_decomposition_params.obj -MD -MP -MF $(DEPDIR)/mpi_decomposition_params.Tpo -c -o mpi_decomposition_params.obj `if test -f 'matrix_decomposition/mpi_decomposition_params.c'; then $(CYGPATH_W) 'matrix_decomposition/mpi_decomposition_params.c'; else $(CYGPATH_W) '$(srcdir)/matrix_decomposition/mpi_decomposition_params.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_decomposition_params.Tpo $(DEPDIR)/mpi_decomposition_params.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matrix_decomposition/mpi_decomposition_params.c' object='mpi_decomposition_params.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mpi_decomposition_params.obj `if test -f 'matrix_decomposition/mpi_decomposition_params.c'; then $(CYGPATH_W) 'matrix_decomposition/mpi_decomposition_params.c'; else $(CYGPATH_W) '$(srcdir)/matrix_decomposition/mpi_decomposition_params.c'; fi` mpi_decomposition_matrix.o: matrix_decomposition/mpi_decomposition_matrix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mpi_decomposition_matrix.o -MD -MP -MF $(DEPDIR)/mpi_decomposition_matrix.Tpo -c -o mpi_decomposition_matrix.o `test -f 'matrix_decomposition/mpi_decomposition_matrix.c' || echo '$(srcdir)/'`matrix_decomposition/mpi_decomposition_matrix.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_decomposition_matrix.Tpo $(DEPDIR)/mpi_decomposition_matrix.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matrix_decomposition/mpi_decomposition_matrix.c' object='mpi_decomposition_matrix.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mpi_decomposition_matrix.o `test -f 'matrix_decomposition/mpi_decomposition_matrix.c' || echo '$(srcdir)/'`matrix_decomposition/mpi_decomposition_matrix.c mpi_decomposition_matrix.obj: matrix_decomposition/mpi_decomposition_matrix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mpi_decomposition_matrix.obj -MD -MP -MF $(DEPDIR)/mpi_decomposition_matrix.Tpo -c -o mpi_decomposition_matrix.obj `if test -f 'matrix_decomposition/mpi_decomposition_matrix.c'; then $(CYGPATH_W) 'matrix_decomposition/mpi_decomposition_matrix.c'; else $(CYGPATH_W) '$(srcdir)/matrix_decomposition/mpi_decomposition_matrix.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_decomposition_matrix.Tpo $(DEPDIR)/mpi_decomposition_matrix.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matrix_decomposition/mpi_decomposition_matrix.c' object='mpi_decomposition_matrix.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mpi_decomposition_matrix.obj `if test -f 'matrix_decomposition/mpi_decomposition_matrix.c'; then $(CYGPATH_W) 'matrix_decomposition/mpi_decomposition_matrix.c'; else $(CYGPATH_W) '$(srcdir)/matrix_decomposition/mpi_decomposition_matrix.c'; fi` blas.o: ../../examples/common/blas.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT blas.o -MD -MP -MF $(DEPDIR)/blas.Tpo -c -o blas.o `test -f '../../examples/common/blas.c' || echo '$(srcdir)/'`../../examples/common/blas.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/blas.Tpo $(DEPDIR)/blas.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../examples/common/blas.c' object='blas.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o blas.o `test -f '../../examples/common/blas.c' || echo '$(srcdir)/'`../../examples/common/blas.c blas.obj: ../../examples/common/blas.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT blas.obj -MD -MP -MF $(DEPDIR)/blas.Tpo -c -o blas.obj `if test -f '../../examples/common/blas.c'; then $(CYGPATH_W) '../../examples/common/blas.c'; else $(CYGPATH_W) '$(srcdir)/../../examples/common/blas.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/blas.Tpo $(DEPDIR)/blas.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../examples/common/blas.c' object='blas.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o blas.obj `if test -f '../../examples/common/blas.c'; then $(CYGPATH_W) '../../examples/common/blas.c'; else $(CYGPATH_W) '$(srcdir)/../../examples/common/blas.c'; fi` mpi_cholesky_distributed.o: matrix_decomposition/mpi_cholesky_distributed.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mpi_cholesky_distributed.o -MD -MP -MF $(DEPDIR)/mpi_cholesky_distributed.Tpo -c -o mpi_cholesky_distributed.o `test -f 'matrix_decomposition/mpi_cholesky_distributed.c' || echo '$(srcdir)/'`matrix_decomposition/mpi_cholesky_distributed.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_cholesky_distributed.Tpo $(DEPDIR)/mpi_cholesky_distributed.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matrix_decomposition/mpi_cholesky_distributed.c' object='mpi_cholesky_distributed.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mpi_cholesky_distributed.o `test -f 'matrix_decomposition/mpi_cholesky_distributed.c' || echo '$(srcdir)/'`matrix_decomposition/mpi_cholesky_distributed.c mpi_cholesky_distributed.obj: matrix_decomposition/mpi_cholesky_distributed.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mpi_cholesky_distributed.obj -MD -MP -MF $(DEPDIR)/mpi_cholesky_distributed.Tpo -c -o mpi_cholesky_distributed.obj `if test -f 'matrix_decomposition/mpi_cholesky_distributed.c'; then $(CYGPATH_W) 'matrix_decomposition/mpi_cholesky_distributed.c'; else $(CYGPATH_W) '$(srcdir)/matrix_decomposition/mpi_cholesky_distributed.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_cholesky_distributed.Tpo $(DEPDIR)/mpi_cholesky_distributed.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matrix_decomposition/mpi_cholesky_distributed.c' object='mpi_cholesky_distributed.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mpi_cholesky_distributed.obj `if test -f 'matrix_decomposition/mpi_cholesky_distributed.c'; then $(CYGPATH_W) 'matrix_decomposition/mpi_cholesky_distributed.c'; else $(CYGPATH_W) '$(srcdir)/matrix_decomposition/mpi_cholesky_distributed.c'; fi` plu_example_double.o: mpi_lu/plu_example_double.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT plu_example_double.o -MD -MP -MF $(DEPDIR)/plu_example_double.Tpo -c -o plu_example_double.o `test -f 'mpi_lu/plu_example_double.c' || echo '$(srcdir)/'`mpi_lu/plu_example_double.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plu_example_double.Tpo $(DEPDIR)/plu_example_double.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/plu_example_double.c' object='plu_example_double.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o plu_example_double.o `test -f 'mpi_lu/plu_example_double.c' || echo '$(srcdir)/'`mpi_lu/plu_example_double.c plu_example_double.obj: mpi_lu/plu_example_double.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT plu_example_double.obj -MD -MP -MF $(DEPDIR)/plu_example_double.Tpo -c -o plu_example_double.obj `if test -f 'mpi_lu/plu_example_double.c'; then $(CYGPATH_W) 'mpi_lu/plu_example_double.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/plu_example_double.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plu_example_double.Tpo $(DEPDIR)/plu_example_double.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/plu_example_double.c' object='plu_example_double.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o plu_example_double.obj `if test -f 'mpi_lu/plu_example_double.c'; then $(CYGPATH_W) 'mpi_lu/plu_example_double.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/plu_example_double.c'; fi` plu_solve_double.o: mpi_lu/plu_solve_double.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT plu_solve_double.o -MD -MP -MF $(DEPDIR)/plu_solve_double.Tpo -c -o plu_solve_double.o `test -f 'mpi_lu/plu_solve_double.c' || echo '$(srcdir)/'`mpi_lu/plu_solve_double.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plu_solve_double.Tpo $(DEPDIR)/plu_solve_double.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/plu_solve_double.c' object='plu_solve_double.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o plu_solve_double.o `test -f 'mpi_lu/plu_solve_double.c' || echo '$(srcdir)/'`mpi_lu/plu_solve_double.c plu_solve_double.obj: mpi_lu/plu_solve_double.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT plu_solve_double.obj -MD -MP -MF $(DEPDIR)/plu_solve_double.Tpo -c -o plu_solve_double.obj `if test -f 'mpi_lu/plu_solve_double.c'; then $(CYGPATH_W) 'mpi_lu/plu_solve_double.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/plu_solve_double.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plu_solve_double.Tpo $(DEPDIR)/plu_solve_double.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/plu_solve_double.c' object='plu_solve_double.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o plu_solve_double.obj `if test -f 'mpi_lu/plu_solve_double.c'; then $(CYGPATH_W) 'mpi_lu/plu_solve_double.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/plu_solve_double.c'; fi` pdlu_kernels.o: mpi_lu/pdlu_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pdlu_kernels.o -MD -MP -MF $(DEPDIR)/pdlu_kernels.Tpo -c -o pdlu_kernels.o `test -f 'mpi_lu/pdlu_kernels.c' || echo '$(srcdir)/'`mpi_lu/pdlu_kernels.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pdlu_kernels.Tpo $(DEPDIR)/pdlu_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/pdlu_kernels.c' object='pdlu_kernels.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pdlu_kernels.o `test -f 'mpi_lu/pdlu_kernels.c' || echo '$(srcdir)/'`mpi_lu/pdlu_kernels.c pdlu_kernels.obj: mpi_lu/pdlu_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pdlu_kernels.obj -MD -MP -MF $(DEPDIR)/pdlu_kernels.Tpo -c -o pdlu_kernels.obj `if test -f 'mpi_lu/pdlu_kernels.c'; then $(CYGPATH_W) 'mpi_lu/pdlu_kernels.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/pdlu_kernels.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pdlu_kernels.Tpo $(DEPDIR)/pdlu_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/pdlu_kernels.c' object='pdlu_kernels.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pdlu_kernels.obj `if test -f 'mpi_lu/pdlu_kernels.c'; then $(CYGPATH_W) 'mpi_lu/pdlu_kernels.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/pdlu_kernels.c'; fi` pdlu.o: mpi_lu/pdlu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pdlu.o -MD -MP -MF $(DEPDIR)/pdlu.Tpo -c -o pdlu.o `test -f 'mpi_lu/pdlu.c' || echo '$(srcdir)/'`mpi_lu/pdlu.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pdlu.Tpo $(DEPDIR)/pdlu.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/pdlu.c' object='pdlu.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pdlu.o `test -f 'mpi_lu/pdlu.c' || echo '$(srcdir)/'`mpi_lu/pdlu.c pdlu.obj: mpi_lu/pdlu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pdlu.obj -MD -MP -MF $(DEPDIR)/pdlu.Tpo -c -o pdlu.obj `if test -f 'mpi_lu/pdlu.c'; then $(CYGPATH_W) 'mpi_lu/pdlu.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/pdlu.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pdlu.Tpo $(DEPDIR)/pdlu.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/pdlu.c' object='pdlu.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pdlu.obj `if test -f 'mpi_lu/pdlu.c'; then $(CYGPATH_W) 'mpi_lu/pdlu.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/pdlu.c'; fi` plu_example_float.o: mpi_lu/plu_example_float.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT plu_example_float.o -MD -MP -MF $(DEPDIR)/plu_example_float.Tpo -c -o plu_example_float.o `test -f 'mpi_lu/plu_example_float.c' || echo '$(srcdir)/'`mpi_lu/plu_example_float.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plu_example_float.Tpo $(DEPDIR)/plu_example_float.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/plu_example_float.c' object='plu_example_float.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o plu_example_float.o `test -f 'mpi_lu/plu_example_float.c' || echo '$(srcdir)/'`mpi_lu/plu_example_float.c plu_example_float.obj: mpi_lu/plu_example_float.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT plu_example_float.obj -MD -MP -MF $(DEPDIR)/plu_example_float.Tpo -c -o plu_example_float.obj `if test -f 'mpi_lu/plu_example_float.c'; then $(CYGPATH_W) 'mpi_lu/plu_example_float.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/plu_example_float.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plu_example_float.Tpo $(DEPDIR)/plu_example_float.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/plu_example_float.c' object='plu_example_float.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o plu_example_float.obj `if test -f 'mpi_lu/plu_example_float.c'; then $(CYGPATH_W) 'mpi_lu/plu_example_float.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/plu_example_float.c'; fi` plu_solve_float.o: mpi_lu/plu_solve_float.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT plu_solve_float.o -MD -MP -MF $(DEPDIR)/plu_solve_float.Tpo -c -o plu_solve_float.o `test -f 'mpi_lu/plu_solve_float.c' || echo '$(srcdir)/'`mpi_lu/plu_solve_float.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plu_solve_float.Tpo $(DEPDIR)/plu_solve_float.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/plu_solve_float.c' object='plu_solve_float.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o plu_solve_float.o `test -f 'mpi_lu/plu_solve_float.c' || echo '$(srcdir)/'`mpi_lu/plu_solve_float.c plu_solve_float.obj: mpi_lu/plu_solve_float.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT plu_solve_float.obj -MD -MP -MF $(DEPDIR)/plu_solve_float.Tpo -c -o plu_solve_float.obj `if test -f 'mpi_lu/plu_solve_float.c'; then $(CYGPATH_W) 'mpi_lu/plu_solve_float.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/plu_solve_float.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plu_solve_float.Tpo $(DEPDIR)/plu_solve_float.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/plu_solve_float.c' object='plu_solve_float.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o plu_solve_float.obj `if test -f 'mpi_lu/plu_solve_float.c'; then $(CYGPATH_W) 'mpi_lu/plu_solve_float.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/plu_solve_float.c'; fi` pslu_kernels.o: mpi_lu/pslu_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pslu_kernels.o -MD -MP -MF $(DEPDIR)/pslu_kernels.Tpo -c -o pslu_kernels.o `test -f 'mpi_lu/pslu_kernels.c' || echo '$(srcdir)/'`mpi_lu/pslu_kernels.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pslu_kernels.Tpo $(DEPDIR)/pslu_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/pslu_kernels.c' object='pslu_kernels.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pslu_kernels.o `test -f 'mpi_lu/pslu_kernels.c' || echo '$(srcdir)/'`mpi_lu/pslu_kernels.c pslu_kernels.obj: mpi_lu/pslu_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pslu_kernels.obj -MD -MP -MF $(DEPDIR)/pslu_kernels.Tpo -c -o pslu_kernels.obj `if test -f 'mpi_lu/pslu_kernels.c'; then $(CYGPATH_W) 'mpi_lu/pslu_kernels.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/pslu_kernels.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pslu_kernels.Tpo $(DEPDIR)/pslu_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/pslu_kernels.c' object='pslu_kernels.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pslu_kernels.obj `if test -f 'mpi_lu/pslu_kernels.c'; then $(CYGPATH_W) 'mpi_lu/pslu_kernels.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/pslu_kernels.c'; fi` pslu.o: mpi_lu/pslu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pslu.o -MD -MP -MF $(DEPDIR)/pslu.Tpo -c -o pslu.o `test -f 'mpi_lu/pslu.c' || echo '$(srcdir)/'`mpi_lu/pslu.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pslu.Tpo $(DEPDIR)/pslu.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/pslu.c' object='pslu.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pslu.o `test -f 'mpi_lu/pslu.c' || echo '$(srcdir)/'`mpi_lu/pslu.c pslu.obj: mpi_lu/pslu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pslu.obj -MD -MP -MF $(DEPDIR)/pslu.Tpo -c -o pslu.obj `if test -f 'mpi_lu/pslu.c'; then $(CYGPATH_W) 'mpi_lu/pslu.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/pslu.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pslu.Tpo $(DEPDIR)/pslu.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/pslu.c' object='pslu.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pslu.obj `if test -f 'mpi_lu/pslu.c'; then $(CYGPATH_W) 'mpi_lu/pslu.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/pslu.c'; fi` plu_implicit_example_double.o: mpi_lu/plu_implicit_example_double.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT plu_implicit_example_double.o -MD -MP -MF $(DEPDIR)/plu_implicit_example_double.Tpo -c -o plu_implicit_example_double.o `test -f 'mpi_lu/plu_implicit_example_double.c' || echo '$(srcdir)/'`mpi_lu/plu_implicit_example_double.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plu_implicit_example_double.Tpo $(DEPDIR)/plu_implicit_example_double.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/plu_implicit_example_double.c' object='plu_implicit_example_double.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o plu_implicit_example_double.o `test -f 'mpi_lu/plu_implicit_example_double.c' || echo '$(srcdir)/'`mpi_lu/plu_implicit_example_double.c plu_implicit_example_double.obj: mpi_lu/plu_implicit_example_double.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT plu_implicit_example_double.obj -MD -MP -MF $(DEPDIR)/plu_implicit_example_double.Tpo -c -o plu_implicit_example_double.obj `if test -f 'mpi_lu/plu_implicit_example_double.c'; then $(CYGPATH_W) 'mpi_lu/plu_implicit_example_double.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/plu_implicit_example_double.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plu_implicit_example_double.Tpo $(DEPDIR)/plu_implicit_example_double.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/plu_implicit_example_double.c' object='plu_implicit_example_double.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o plu_implicit_example_double.obj `if test -f 'mpi_lu/plu_implicit_example_double.c'; then $(CYGPATH_W) 'mpi_lu/plu_implicit_example_double.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/plu_implicit_example_double.c'; fi` pdlu_implicit.o: mpi_lu/pdlu_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pdlu_implicit.o -MD -MP -MF $(DEPDIR)/pdlu_implicit.Tpo -c -o pdlu_implicit.o `test -f 'mpi_lu/pdlu_implicit.c' || echo '$(srcdir)/'`mpi_lu/pdlu_implicit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pdlu_implicit.Tpo $(DEPDIR)/pdlu_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/pdlu_implicit.c' object='pdlu_implicit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pdlu_implicit.o `test -f 'mpi_lu/pdlu_implicit.c' || echo '$(srcdir)/'`mpi_lu/pdlu_implicit.c pdlu_implicit.obj: mpi_lu/pdlu_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pdlu_implicit.obj -MD -MP -MF $(DEPDIR)/pdlu_implicit.Tpo -c -o pdlu_implicit.obj `if test -f 'mpi_lu/pdlu_implicit.c'; then $(CYGPATH_W) 'mpi_lu/pdlu_implicit.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/pdlu_implicit.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pdlu_implicit.Tpo $(DEPDIR)/pdlu_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/pdlu_implicit.c' object='pdlu_implicit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pdlu_implicit.obj `if test -f 'mpi_lu/pdlu_implicit.c'; then $(CYGPATH_W) 'mpi_lu/pdlu_implicit.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/pdlu_implicit.c'; fi` plu_implicit_example_float.o: mpi_lu/plu_implicit_example_float.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT plu_implicit_example_float.o -MD -MP -MF $(DEPDIR)/plu_implicit_example_float.Tpo -c -o plu_implicit_example_float.o `test -f 'mpi_lu/plu_implicit_example_float.c' || echo '$(srcdir)/'`mpi_lu/plu_implicit_example_float.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plu_implicit_example_float.Tpo $(DEPDIR)/plu_implicit_example_float.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/plu_implicit_example_float.c' object='plu_implicit_example_float.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o plu_implicit_example_float.o `test -f 'mpi_lu/plu_implicit_example_float.c' || echo '$(srcdir)/'`mpi_lu/plu_implicit_example_float.c plu_implicit_example_float.obj: mpi_lu/plu_implicit_example_float.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT plu_implicit_example_float.obj -MD -MP -MF $(DEPDIR)/plu_implicit_example_float.Tpo -c -o plu_implicit_example_float.obj `if test -f 'mpi_lu/plu_implicit_example_float.c'; then $(CYGPATH_W) 'mpi_lu/plu_implicit_example_float.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/plu_implicit_example_float.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plu_implicit_example_float.Tpo $(DEPDIR)/plu_implicit_example_float.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/plu_implicit_example_float.c' object='plu_implicit_example_float.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o plu_implicit_example_float.obj `if test -f 'mpi_lu/plu_implicit_example_float.c'; then $(CYGPATH_W) 'mpi_lu/plu_implicit_example_float.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/plu_implicit_example_float.c'; fi` pslu_implicit.o: mpi_lu/pslu_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pslu_implicit.o -MD -MP -MF $(DEPDIR)/pslu_implicit.Tpo -c -o pslu_implicit.o `test -f 'mpi_lu/pslu_implicit.c' || echo '$(srcdir)/'`mpi_lu/pslu_implicit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pslu_implicit.Tpo $(DEPDIR)/pslu_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/pslu_implicit.c' object='pslu_implicit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pslu_implicit.o `test -f 'mpi_lu/pslu_implicit.c' || echo '$(srcdir)/'`mpi_lu/pslu_implicit.c pslu_implicit.obj: mpi_lu/pslu_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pslu_implicit.obj -MD -MP -MF $(DEPDIR)/pslu_implicit.Tpo -c -o pslu_implicit.obj `if test -f 'mpi_lu/pslu_implicit.c'; then $(CYGPATH_W) 'mpi_lu/pslu_implicit.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/pslu_implicit.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pslu_implicit.Tpo $(DEPDIR)/pslu_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/pslu_implicit.c' object='pslu_implicit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pslu_implicit.obj `if test -f 'mpi_lu/pslu_implicit.c'; then $(CYGPATH_W) 'mpi_lu/pslu_implicit.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/pslu_implicit.c'; fi` plu_outofcore_example_double.o: mpi_lu/plu_outofcore_example_double.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT plu_outofcore_example_double.o -MD -MP -MF $(DEPDIR)/plu_outofcore_example_double.Tpo -c -o plu_outofcore_example_double.o `test -f 'mpi_lu/plu_outofcore_example_double.c' || echo '$(srcdir)/'`mpi_lu/plu_outofcore_example_double.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plu_outofcore_example_double.Tpo $(DEPDIR)/plu_outofcore_example_double.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/plu_outofcore_example_double.c' object='plu_outofcore_example_double.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o plu_outofcore_example_double.o `test -f 'mpi_lu/plu_outofcore_example_double.c' || echo '$(srcdir)/'`mpi_lu/plu_outofcore_example_double.c plu_outofcore_example_double.obj: mpi_lu/plu_outofcore_example_double.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT plu_outofcore_example_double.obj -MD -MP -MF $(DEPDIR)/plu_outofcore_example_double.Tpo -c -o plu_outofcore_example_double.obj `if test -f 'mpi_lu/plu_outofcore_example_double.c'; then $(CYGPATH_W) 'mpi_lu/plu_outofcore_example_double.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/plu_outofcore_example_double.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plu_outofcore_example_double.Tpo $(DEPDIR)/plu_outofcore_example_double.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/plu_outofcore_example_double.c' object='plu_outofcore_example_double.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o plu_outofcore_example_double.obj `if test -f 'mpi_lu/plu_outofcore_example_double.c'; then $(CYGPATH_W) 'mpi_lu/plu_outofcore_example_double.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/plu_outofcore_example_double.c'; fi` plu_outofcore_example_float.o: mpi_lu/plu_outofcore_example_float.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT plu_outofcore_example_float.o -MD -MP -MF $(DEPDIR)/plu_outofcore_example_float.Tpo -c -o plu_outofcore_example_float.o `test -f 'mpi_lu/plu_outofcore_example_float.c' || echo '$(srcdir)/'`mpi_lu/plu_outofcore_example_float.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plu_outofcore_example_float.Tpo $(DEPDIR)/plu_outofcore_example_float.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/plu_outofcore_example_float.c' object='plu_outofcore_example_float.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o plu_outofcore_example_float.o `test -f 'mpi_lu/plu_outofcore_example_float.c' || echo '$(srcdir)/'`mpi_lu/plu_outofcore_example_float.c plu_outofcore_example_float.obj: mpi_lu/plu_outofcore_example_float.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT plu_outofcore_example_float.obj -MD -MP -MF $(DEPDIR)/plu_outofcore_example_float.Tpo -c -o plu_outofcore_example_float.obj `if test -f 'mpi_lu/plu_outofcore_example_float.c'; then $(CYGPATH_W) 'mpi_lu/plu_outofcore_example_float.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/plu_outofcore_example_float.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plu_outofcore_example_float.Tpo $(DEPDIR)/plu_outofcore_example_float.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi_lu/plu_outofcore_example_float.c' object='plu_outofcore_example_float.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o plu_outofcore_example_float.obj `if test -f 'mpi_lu/plu_outofcore_example_float.c'; then $(CYGPATH_W) 'mpi_lu/plu_outofcore_example_float.c'; else $(CYGPATH_W) '$(srcdir)/mpi_lu/plu_outofcore_example_float.c'; fi` stencil5.o: stencil/stencil5.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT stencil5.o -MD -MP -MF $(DEPDIR)/stencil5.Tpo -c -o stencil5.o `test -f 'stencil/stencil5.c' || echo '$(srcdir)/'`stencil/stencil5.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/stencil5.Tpo $(DEPDIR)/stencil5.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stencil/stencil5.c' object='stencil5.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o stencil5.o `test -f 'stencil/stencil5.c' || echo '$(srcdir)/'`stencil/stencil5.c stencil5.obj: stencil/stencil5.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT stencil5.obj -MD -MP -MF $(DEPDIR)/stencil5.Tpo -c -o stencil5.obj `if test -f 'stencil/stencil5.c'; then $(CYGPATH_W) 'stencil/stencil5.c'; else $(CYGPATH_W) '$(srcdir)/stencil/stencil5.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/stencil5.Tpo $(DEPDIR)/stencil5.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stencil/stencil5.c' object='stencil5.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o stencil5.obj `if test -f 'stencil/stencil5.c'; then $(CYGPATH_W) 'stencil/stencil5.c'; else $(CYGPATH_W) '$(srcdir)/stencil/stencil5.c'; fi` user_datatype.o: user_datatype/user_datatype.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT user_datatype.o -MD -MP -MF $(DEPDIR)/user_datatype.Tpo -c -o user_datatype.o `test -f 'user_datatype/user_datatype.c' || echo '$(srcdir)/'`user_datatype/user_datatype.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/user_datatype.Tpo $(DEPDIR)/user_datatype.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='user_datatype/user_datatype.c' object='user_datatype.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o user_datatype.o `test -f 'user_datatype/user_datatype.c' || echo '$(srcdir)/'`user_datatype/user_datatype.c user_datatype.obj: user_datatype/user_datatype.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT user_datatype.obj -MD -MP -MF $(DEPDIR)/user_datatype.Tpo -c -o user_datatype.obj `if test -f 'user_datatype/user_datatype.c'; then $(CYGPATH_W) 'user_datatype/user_datatype.c'; else $(CYGPATH_W) '$(srcdir)/user_datatype/user_datatype.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/user_datatype.Tpo $(DEPDIR)/user_datatype.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='user_datatype/user_datatype.c' object='user_datatype.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o user_datatype.obj `if test -f 'user_datatype/user_datatype.c'; then $(CYGPATH_W) 'user_datatype/user_datatype.c'; else $(CYGPATH_W) '$(srcdir)/user_datatype/user_datatype.c'; fi` my_interface.o: user_datatype/my_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT my_interface.o -MD -MP -MF $(DEPDIR)/my_interface.Tpo -c -o my_interface.o `test -f 'user_datatype/my_interface.c' || echo '$(srcdir)/'`user_datatype/my_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/my_interface.Tpo $(DEPDIR)/my_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='user_datatype/my_interface.c' object='my_interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o my_interface.o `test -f 'user_datatype/my_interface.c' || echo '$(srcdir)/'`user_datatype/my_interface.c my_interface.obj: user_datatype/my_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT my_interface.obj -MD -MP -MF $(DEPDIR)/my_interface.Tpo -c -o my_interface.obj `if test -f 'user_datatype/my_interface.c'; then $(CYGPATH_W) 'user_datatype/my_interface.c'; else $(CYGPATH_W) '$(srcdir)/user_datatype/my_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/my_interface.Tpo $(DEPDIR)/my_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='user_datatype/my_interface.c' object='my_interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o my_interface.obj `if test -f 'user_datatype/my_interface.c'; then $(CYGPATH_W) 'user_datatype/my_interface.c'; else $(CYGPATH_W) '$(srcdir)/user_datatype/my_interface.c'; fi` .f90.o: $(AM_V_FC)$(FCCOMPILE) -c -o $@ $< .f90.obj: $(AM_V_FC)$(FCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .f90.lo: $(AM_V_FC)$(LTFCCOMPILE) -c -o $@ $< @BUILD_EXAMPLES_FALSE@fstarpu_mpi_mod.o: $(top_srcdir)/mpi/include/fstarpu_mpi_mod.f90 @STARPU_HAVE_MPIFORT_FALSE@fstarpu_mpi_mod.o: $(top_srcdir)/mpi/include/fstarpu_mpi_mod.f90 @STARPU_SANITIZE_TRUE@fstarpu_mpi_mod.o: $(top_srcdir)/mpi/include/fstarpu_mpi_mod.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o fstarpu_mpi_mod.o `test -f '$(top_srcdir)/mpi/include/fstarpu_mpi_mod.f90' || echo '$(srcdir)/'`$(top_srcdir)/mpi/include/fstarpu_mpi_mod.f90 fstarpu_mpi_mod.obj: $(top_srcdir)/mpi/include/fstarpu_mpi_mod.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o fstarpu_mpi_mod.obj `if test -f '$(top_srcdir)/mpi/include/fstarpu_mpi_mod.f90'; then $(CYGPATH_W) '$(top_srcdir)/mpi/include/fstarpu_mpi_mod.f90'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/mpi/include/fstarpu_mpi_mod.f90'; fi` @BUILD_EXAMPLES_FALSE@fstarpu_mod.o: $(top_srcdir)/include/fstarpu_mod.f90 @STARPU_HAVE_MPIFORT_FALSE@fstarpu_mod.o: $(top_srcdir)/include/fstarpu_mod.f90 @STARPU_SANITIZE_TRUE@fstarpu_mod.o: $(top_srcdir)/include/fstarpu_mod.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o fstarpu_mod.o `test -f '$(top_srcdir)/include/fstarpu_mod.f90' || echo '$(srcdir)/'`$(top_srcdir)/include/fstarpu_mod.f90 fstarpu_mod.obj: $(top_srcdir)/include/fstarpu_mod.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o fstarpu_mod.obj `if test -f '$(top_srcdir)/include/fstarpu_mod.f90'; then $(CYGPATH_W) '$(top_srcdir)/include/fstarpu_mod.f90'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/include/fstarpu_mod.f90'; fi` @BUILD_EXAMPLES_FALSE@nf_basic_ring.o: native_fortran/nf_basic_ring.f90 @STARPU_HAVE_MPIFORT_FALSE@nf_basic_ring.o: native_fortran/nf_basic_ring.f90 @STARPU_SANITIZE_TRUE@nf_basic_ring.o: native_fortran/nf_basic_ring.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_basic_ring.o `test -f 'native_fortran/nf_basic_ring.f90' || echo '$(srcdir)/'`native_fortran/nf_basic_ring.f90 nf_basic_ring.obj: native_fortran/nf_basic_ring.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_basic_ring.obj `if test -f 'native_fortran/nf_basic_ring.f90'; then $(CYGPATH_W) 'native_fortran/nf_basic_ring.f90'; else $(CYGPATH_W) '$(srcdir)/native_fortran/nf_basic_ring.f90'; fi` @BUILD_EXAMPLES_FALSE@nf_mm_cl.o: native_fortran/nf_mm_cl.f90 @STARPU_HAVE_MPIFORT_FALSE@nf_mm_cl.o: native_fortran/nf_mm_cl.f90 @STARPU_SANITIZE_TRUE@nf_mm_cl.o: native_fortran/nf_mm_cl.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_mm_cl.o `test -f 'native_fortran/nf_mm_cl.f90' || echo '$(srcdir)/'`native_fortran/nf_mm_cl.f90 nf_mm_cl.obj: native_fortran/nf_mm_cl.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_mm_cl.obj `if test -f 'native_fortran/nf_mm_cl.f90'; then $(CYGPATH_W) 'native_fortran/nf_mm_cl.f90'; else $(CYGPATH_W) '$(srcdir)/native_fortran/nf_mm_cl.f90'; fi` @BUILD_EXAMPLES_FALSE@nf_mm.o: native_fortran/nf_mm.f90 @STARPU_HAVE_MPIFORT_FALSE@nf_mm.o: native_fortran/nf_mm.f90 @STARPU_SANITIZE_TRUE@nf_mm.o: native_fortran/nf_mm.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_mm.o `test -f 'native_fortran/nf_mm.f90' || echo '$(srcdir)/'`native_fortran/nf_mm.f90 nf_mm.obj: native_fortran/nf_mm.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_mm.obj `if test -f 'native_fortran/nf_mm.f90'; then $(CYGPATH_W) 'native_fortran/nf_mm.f90'; else $(CYGPATH_W) '$(srcdir)/native_fortran/nf_mm.f90'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf comm/.libs comm/_libs -rm -rf complex/.libs complex/_libs -rm -rf matrix_decomposition/.libs matrix_decomposition/_libs -rm -rf mpi_lu/.libs mpi_lu/_libs -rm -rf native_fortran/.libs native_fortran/_libs -rm -rf stencil/.libs stencil/_libs -rm -rf user_datatype/.libs user_datatype/_libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? stencil/stencil5.log: stencil/stencil5$(EXEEXT) @p='stencil/stencil5$(EXEEXT)'; \ b='stencil/stencil5'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) matrix_decomposition/mpi_cholesky.log: matrix_decomposition/mpi_cholesky$(EXEEXT) @p='matrix_decomposition/mpi_cholesky$(EXEEXT)'; \ b='matrix_decomposition/mpi_cholesky'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) matrix_decomposition/mpi_cholesky_distributed.log: matrix_decomposition/mpi_cholesky_distributed$(EXEEXT) @p='matrix_decomposition/mpi_cholesky_distributed$(EXEEXT)'; \ b='matrix_decomposition/mpi_cholesky_distributed'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) native_fortran/nf_mm.log: native_fortran/nf_mm$(EXEEXT) @p='native_fortran/nf_mm$(EXEEXT)'; \ b='native_fortran/nf_mm'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) native_fortran/nf_basic_ring.log: native_fortran/nf_basic_ring$(EXEEXT) @p='native_fortran/nf_basic_ring$(EXEEXT)'; \ b='native_fortran/nf_basic_ring'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) complex/mpi_complex.log: complex/mpi_complex$(EXEEXT) @p='complex/mpi_complex$(EXEEXT)'; \ b='complex/mpi_complex'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) user_datatype/user_datatype.log: user_datatype/user_datatype$(EXEEXT) @p='user_datatype/user_datatype$(EXEEXT)'; \ b='user_datatype/user_datatype'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) comm/comm.log: comm/comm$(EXEEXT) @p='comm/comm$(EXEEXT)'; \ b='comm/comm'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) comm/mix_comm.log: comm/mix_comm$(EXEEXT) @p='comm/mix_comm$(EXEEXT)'; \ b='comm/mix_comm'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(examplebindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f comm/$(am__dirstamp) -rm -f complex/$(am__dirstamp) -rm -f matrix_decomposition/$(am__dirstamp) -rm -f mpi_lu/$(am__dirstamp) -rm -f native_fortran/$(am__dirstamp) -rm -f stencil/$(am__dirstamp) -rm -f user_datatype/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-checkPROGRAMS clean-examplebinPROGRAMS clean-generic \ clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-examplebinPROGRAMS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-examplebinPROGRAMS .MAKE: all check check-am install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-examplebinPROGRAMS clean-generic \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-examplebinPROGRAMS install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-examplebinPROGRAMS .PRECIOUS: Makefile showcheck: -cat $(TEST_LOGS) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q " runtime error: " $(TEST_LOGS) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET @STARPU_USE_CUDA_TRUE@.cu.cubin: @STARPU_USE_CUDA_TRUE@ $(MKDIR_P) `dirname $@` @STARPU_USE_CUDA_TRUE@ $(NVCC) -cubin $< -o $@ $(NVCCFLAGS) @STARPU_USE_CUDA_TRUE@.cu.o: @STARPU_USE_CUDA_TRUE@ $(NVCC) $< -c -o $@ $(NVCCFLAGS) # Native Fortran example # - list explicit dependences to control proper module files generation # - the overriding rule fully disables the corresponing default rule, thus # the default rule body must be copied entirely @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@fstarpu_mod.mod: fstarpu_mod.o @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@fstarpu_mpi_mod.mod: fstarpu_mpi_mod.o @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@nf_mm_cl.mod: nf_mm_cl.o @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@fstarpu_mod.o: $(top_srcdir)/include/fstarpu_mod.f90 @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ $(AM_V_FC)$(FC) $(native_fortran_nf_mm_FCFLAGS) $(FCFLAGS) -c -o $@ '$(top_srcdir)/'include/fstarpu_mod.f90 @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@fstarpu_mpi_mod.o: $(top_srcdir)/mpi/include/fstarpu_mpi_mod.f90 fstarpu_mod.mod @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ $(AM_V_FC)$(FC) $(native_fortran_nf_mm_FCFLAGS) $(FCFLAGS) -c -o $@ '$(top_srcdir)/'mpi/include/fstarpu_mpi_mod.f90 @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@nf_mm_cl.o: $(top_srcdir)/mpi/examples/native_fortran/nf_mm_cl.f90 fstarpu_mpi_mod.mod fstarpu_mod.mod @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ $(AM_V_FC)$(FC) $(native_fortran_nf_mm_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_mm_cl.f90' || echo '$(srcdir)/'`native_fortran/nf_mm_cl.f90 @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@nf_mm.o: $(top_srcdir)/mpi/examples/native_fortran/nf_mm.f90 nf_mm_cl.mod fstarpu_mpi_mod.mod fstarpu_mod.mod @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ $(AM_V_FC)$(FC) $(native_fortran_nf_mm_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_mm.f90' || echo '$(srcdir)/'`native_fortran/nf_mm.f90 @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@nf_basic_ring.o: $(top_srcdir)/mpi/examples/native_fortran/nf_basic_ring.f90 fstarpu_mpi_mod.mod fstarpu_mod.mod @BUILD_EXAMPLES_TRUE@@STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ $(AM_V_FC)$(FC) $(native_fortran_nf_basic_ring_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_basic_ring.f90' || echo '$(srcdir)/'`native_fortran/nf_basic_ring.f90 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.2.3+dfsg/mpi/examples/comm/000077500000000000000000000000001320135501600173045ustar00rootroot00000000000000starpu-1.2.3+dfsg/mpi/examples/comm/comm.c000066400000000000000000000112401320135501600204010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This example splits the whole set of communicators in subgroups, * all communications take place within each subgroups */ #include #include "../helper.h" void func_cpu(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { int *value = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); int rank; starpu_codelet_unpack_args(_args, &rank); FPRINTF_MPI(stderr, "Executing codelet with value %d and rank %d\n", *value, rank); STARPU_ASSERT_MSG(*value == rank, "Received value %d is not the expected value %d\n", *value, rank); } struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 1, .modes = {STARPU_RW} }; int main(int argc, char **argv) { int size, x=789; int color; MPI_Comm newcomm; int rank, newrank; int ret; starpu_data_handle_t data[2]; int thread_support; if (MPI_Init_thread(&argc, &argv, MPI_THREAD_SERIALIZED, &thread_support) != MPI_SUCCESS) { fprintf(stderr,"MPI_Init_thread failed\n"); exit(1); } if (thread_support == MPI_THREAD_FUNNELED) fprintf(stderr,"Warning: MPI only has funneled thread support, not serialized, hoping this will work\n"); if (thread_support < MPI_THREAD_FUNNELED) fprintf(stderr,"Warning: MPI does not have thread support!\n"); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); if (size < 4) { FPRINTF(stderr, "We need at least 4 processes.\n"); MPI_Finalize(); return STARPU_TEST_SKIPPED; } color = rank%2; MPI_Comm_split(MPI_COMM_WORLD, color, rank, &newcomm); MPI_Comm_rank(newcomm, &newrank); FPRINTF(stderr, "[%d][%d] color %d\n", rank, newrank, color); if (newrank == 0) { FPRINTF(stderr, "[%d][%d] sending %d\n", rank, newrank, rank); MPI_Send(&rank, 1, MPI_INT, 1, 10, newcomm); } else if (newrank == 1) { MPI_Recv(&x, 1, MPI_INT, 0, 10, newcomm, MPI_STATUS_IGNORE); FPRINTF(stderr, "[%d][%d] received %d\n", rank, newrank, x); } ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init_comm(NULL, NULL, 0, newcomm); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if (newrank == 0) { starpu_variable_data_register(&data[0], STARPU_MAIN_RAM, (uintptr_t)&rank, sizeof(int)); starpu_variable_data_register(&data[1], STARPU_MAIN_RAM, (uintptr_t)&rank, sizeof(int)); starpu_mpi_data_register_comm(data[1], 22, 0, newcomm); } else starpu_variable_data_register(&data[0], -1, (uintptr_t)NULL, sizeof(int)); starpu_mpi_data_register_comm(data[0], 12, 0, newcomm); if (newrank == 0) { starpu_mpi_req req[2]; starpu_mpi_issend(data[1], &req[0], 1, 22, newcomm); starpu_mpi_isend(data[0], &req[1], 1, 12, newcomm); starpu_mpi_wait(&req[0], MPI_STATUS_IGNORE); starpu_mpi_wait(&req[1], MPI_STATUS_IGNORE); } else if (newrank == 1) { int *xx; starpu_mpi_recv(data[0], 0, 12, newcomm, MPI_STATUS_IGNORE); starpu_data_acquire(data[0], STARPU_RW); xx = (int *)starpu_variable_get_local_ptr(data[0]); starpu_data_release(data[0]); FPRINTF(stderr, "[%d][%d] received %d\n", rank, newrank, *xx); STARPU_ASSERT_MSG(x==*xx, "Received value %d is incorrect (should be %d)\n", *xx, x); starpu_variable_data_register(&data[1], -1, (uintptr_t)NULL, sizeof(int)); starpu_mpi_data_register_comm(data[1], 22, 0, newcomm); starpu_mpi_recv(data[0], 0, 22, newcomm, MPI_STATUS_IGNORE); starpu_data_acquire(data[0], STARPU_RW); xx = (int *)starpu_variable_get_local_ptr(data[0]); starpu_data_release(data[0]); FPRINTF(stderr, "[%d][%d] received %d\n", rank, newrank, *xx); STARPU_ASSERT_MSG(x==*xx, "Received value %d is incorrect (should be %d)\n", *xx, x); } if (newrank == 0 || newrank == 1) { starpu_mpi_task_insert(newcomm, &mycodelet, STARPU_RW, data[0], STARPU_VALUE, &x, sizeof(x), STARPU_EXECUTE_ON_NODE, 1, 0); starpu_task_wait_for_all(); starpu_data_unregister(data[0]); starpu_data_unregister(data[1]); } starpu_mpi_shutdown(); starpu_shutdown(); MPI_Comm_free(&newcomm); MPI_Finalize(); return 0; } starpu-1.2.3+dfsg/mpi/examples/comm/mix_comm.c000066400000000000000000000140741320135501600212660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This example splits the whole set of communicators in subgroups, * communications take place both within each subgroups and MPI_COMM_WORLD. */ #include #include "../helper.h" void func_cpu(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { int *value = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); int rank; starpu_codelet_unpack_args(_args, &rank); FPRINTF_MPI(stderr, "Executing codelet with value %d and rank %d\n", *value, rank); STARPU_ASSERT_MSG(*value == rank, "Received value %d is not the expected value %d\n", *value, rank); } struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 1, .modes = {STARPU_RW} }; int main(int argc, char **argv) { int size, x; int color; MPI_Comm newcomm; int rank, newrank; int ret; starpu_data_handle_t data[3]; int value = 90; int thread_support; if (MPI_Init_thread(&argc, &argv, MPI_THREAD_SERIALIZED, &thread_support) != MPI_SUCCESS) { fprintf(stderr,"MPI_Init_thread failed\n"); exit(1); } if (thread_support == MPI_THREAD_FUNNELED) fprintf(stderr,"Warning: MPI only has funneled thread support, not serialized, hoping this will work\n"); if (thread_support < MPI_THREAD_FUNNELED) fprintf(stderr,"Warning: MPI does not have thread support!\n"); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); if (size < 4) { FPRINTF(stderr, "We need at least 4 processes.\n"); MPI_Finalize(); return STARPU_TEST_SKIPPED; } color = rank%2; MPI_Comm_split(MPI_COMM_WORLD, color, rank, &newcomm); MPI_Comm_rank(newcomm, &newrank); FPRINTF(stderr, "[%d][%d] color %d\n", rank, newrank, color); if (newrank == 0) { FPRINTF(stderr, "[%d][%d] sending %d\n", rank, newrank, rank); MPI_Send(&rank, 1, MPI_INT, 1, 10, newcomm); } else if (newrank == 1) { MPI_Recv(&x, 1, MPI_INT, 0, 10, newcomm, MPI_STATUS_IGNORE); FPRINTF(stderr, "[%d][%d] received %d\n", rank, newrank, x); } ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if (rank == 0) { starpu_variable_data_register(&data[2], STARPU_MAIN_RAM, (uintptr_t)&value, sizeof(int)); } else starpu_variable_data_register(&data[2], -1, (uintptr_t)NULL, sizeof(int)); starpu_mpi_data_register_comm(data[2], 44, 0, MPI_COMM_WORLD); if (newrank == 0) { starpu_variable_data_register(&data[0], STARPU_MAIN_RAM, (uintptr_t)&rank, sizeof(int)); starpu_variable_data_register(&data[1], STARPU_MAIN_RAM, (uintptr_t)&rank, sizeof(int)); starpu_mpi_data_register_comm(data[1], 22, 0, newcomm); } else starpu_variable_data_register(&data[0], -1, (uintptr_t)NULL, sizeof(int)); starpu_mpi_data_register_comm(data[0], 12, 0, newcomm); if (newrank == 0) { starpu_mpi_req req[2]; starpu_mpi_issend(data[1], &req[0], 1, 22, newcomm); starpu_mpi_isend(data[0], &req[1], 1, 12, newcomm); starpu_mpi_wait(&req[0], MPI_STATUS_IGNORE); starpu_mpi_wait(&req[1], MPI_STATUS_IGNORE); } else if (newrank == 1) { int *xx; starpu_mpi_recv(data[0], 0, 12, newcomm, MPI_STATUS_IGNORE); starpu_data_acquire(data[0], STARPU_RW); xx = (int *)starpu_variable_get_local_ptr(data[0]); starpu_data_release(data[0]); FPRINTF(stderr, "[%d][%d] received %d\n", rank, newrank, *xx); STARPU_ASSERT_MSG(x==*xx, "Received value %d is incorrect (should be %d)\n", *xx, x); starpu_variable_data_register(&data[1], -1, (uintptr_t)NULL, sizeof(int)); starpu_mpi_data_register_comm(data[1], 22, 0, newcomm); starpu_mpi_recv(data[0], 0, 22, newcomm, MPI_STATUS_IGNORE); starpu_data_acquire(data[0], STARPU_RW); xx = (int *)starpu_variable_get_local_ptr(data[0]); starpu_data_release(data[0]); FPRINTF(stderr, "[%d][%d] received %d\n", rank, newrank, *xx); STARPU_ASSERT_MSG(x==*xx, "Received value %d is incorrect (should be %d)\n", *xx, x); } if (rank == 0) { starpu_data_acquire(data[2], STARPU_RW); int rvalue = *((int *)starpu_variable_get_local_ptr(data[2])); starpu_data_release(data[2]); FPRINTF_MPI(stderr, "sending value %d to %d and receiving from %d\n", rvalue, 1, size-1); starpu_mpi_send(data[2], 1, 44, MPI_COMM_WORLD); starpu_mpi_recv(data[2], size-1, 44, MPI_COMM_WORLD, MPI_STATUS_IGNORE); starpu_data_acquire(data[2], STARPU_RW); int *xx = (int *)starpu_variable_get_local_ptr(data[2]); starpu_data_release(data[2]); FPRINTF_MPI(stderr, "Value back is %d\n", *xx); STARPU_ASSERT_MSG(*xx == rvalue + (2*(size-1)), "Received value %d is incorrect (should be %d)\n", *xx, rvalue + (2*(size-1))); } else { int next = (rank == size-1) ? 0 : rank+1; starpu_mpi_recv(data[2], rank-1, 44, MPI_COMM_WORLD, MPI_STATUS_IGNORE); starpu_data_acquire(data[2], STARPU_RW); int *xx = (int *)starpu_variable_get_local_ptr(data[2]); FPRINTF_MPI(stderr, "receiving %d from %d and sending %d to %d\n", *xx, rank-1, *xx+2, next); *xx = *xx + 2; starpu_data_release(data[2]); starpu_mpi_send(data[2], next, 44, MPI_COMM_WORLD); } if (newrank == 0 || newrank == 1) { starpu_mpi_task_insert(newcomm, &mycodelet, STARPU_RW, data[0], STARPU_VALUE, &x, sizeof(x), STARPU_EXECUTE_ON_NODE, 1, 0); starpu_task_wait_for_all(); starpu_data_unregister(data[0]); starpu_data_unregister(data[1]); } starpu_data_unregister(data[2]); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Comm_free(&newcomm); MPI_Finalize(); return 0; } starpu-1.2.3+dfsg/mpi/examples/complex/000077500000000000000000000000001320135501600200205ustar00rootroot00000000000000starpu-1.2.3+dfsg/mpi/examples/complex/mpi_complex.c000066400000000000000000000061521320135501600225040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012, 2013, 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) void display_foo_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { int *foo = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); FPRINTF(stderr, "foo = %d\n", *foo); } struct starpu_codelet foo_display = { .cpu_funcs = {display_foo_codelet}, .nbuffers = 1, .modes = {STARPU_R} }; int main(int argc, char **argv) { int rank, nodes; int ret=0; int compare=0; ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(&argc, &argv, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &nodes); if (nodes < 2) { fprintf(stderr, "This program needs at least 2 nodes (%d available)\n", nodes); ret = 77; } else { starpu_data_handle_t handle; starpu_data_handle_t handle2; double real[2] = {4.0, 2.0}; double imaginary[2] = {7.0, 9.0}; double real2[2] = {14.0, 12.0}; double imaginary2[2] = {17.0, 19.0}; if (rank == 1) { real[0] = 0.0; real[1] = 0.0; imaginary[0] = 0.0; imaginary[1] = 0.0; } starpu_complex_data_register(&handle, STARPU_MAIN_RAM, real, imaginary, 2); starpu_complex_data_register(&handle2, -1, real2, imaginary2, 2); if (rank == 0) { int *compare_ptr = &compare; starpu_task_insert(&cl_display, STARPU_VALUE, "node0 initial value", strlen("node0 initial value")+1, STARPU_R, handle, 0); starpu_mpi_isend_detached(handle, 1, 10, MPI_COMM_WORLD, NULL, NULL); starpu_mpi_irecv_detached(handle2, 1, 20, MPI_COMM_WORLD, NULL, NULL); starpu_task_insert(&cl_display, STARPU_VALUE, "node0 received value", strlen("node0 received value")+1, STARPU_R, handle2, 0); starpu_task_insert(&cl_compare, STARPU_R, handle, STARPU_R, handle2, STARPU_VALUE, &compare_ptr, sizeof(compare_ptr), 0); } else if (rank == 1) { starpu_mpi_irecv_detached(handle, 0, 10, MPI_COMM_WORLD, NULL, NULL); starpu_task_insert(&cl_display, STARPU_VALUE, "node1 received value", strlen("node1 received value")+1, STARPU_R, handle, 0); starpu_mpi_isend_detached(handle, 0, 20, MPI_COMM_WORLD, NULL, NULL); } starpu_task_wait_for_all(); starpu_data_unregister(handle); starpu_data_unregister(handle2); } starpu_mpi_shutdown(); starpu_shutdown(); return (rank == 0) ? !compare : ret; } starpu-1.2.3+dfsg/mpi/examples/helper.h000066400000000000000000000023131320135501600200000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013, 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #define STARPU_TEST_SKIPPED 77 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #define FPRINTF_MPI(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) { \ int _disp_rank; starpu_mpi_comm_rank(MPI_COMM_WORLD, &_disp_rank); \ fprintf(ofile, "[%d][starpu_mpi][%s] " fmt , _disp_rank, __starpu_func__ ,## __VA_ARGS__); \ fflush(ofile); }} while(0); starpu-1.2.3+dfsg/mpi/examples/matrix_decomposition/000077500000000000000000000000001320135501600226115ustar00rootroot00000000000000starpu-1.2.3+dfsg/mpi/examples/matrix_decomposition/mpi_cholesky.c000066400000000000000000000036771320135501600254600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012, 2015 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2013, 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "mpi_cholesky.h" int main(int argc, char **argv) { /* create a simple definite positive symetric matrix example * * Hilbert matrix : h(i,j) = 1/(i+j+1) * */ float ***bmat; int rank, nodes, ret; double timing, flops; #ifndef STARPU_SIMGRID int correctness; #endif ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(&argc, &argv, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &nodes); starpu_cublas_init(); parse_args(argc, argv, nodes); matrix_init(&bmat, rank, nodes, 1); matrix_display(bmat, rank); dw_cholesky(bmat, size/nblocks, rank, nodes, &timing, &flops); starpu_mpi_shutdown(); #ifndef STARPU_SIMGRID matrix_display(bmat, rank); dw_cholesky_check_computation(bmat, rank, nodes, &correctness, &flops); #endif matrix_free(&bmat, rank, nodes, 1); starpu_cublas_shutdown(); starpu_shutdown(); #ifndef STARPU_SIMGRID assert(correctness); #endif if (rank == 0) { FPRINTF(stdout, "Computation time (in ms): %2.2f\n", timing/1000); FPRINTF(stdout, "Synthetic GFlops : %2.2f\n", (flops/timing/1000.0f)); } return 0; } starpu-1.2.3+dfsg/mpi/examples/matrix_decomposition/mpi_cholesky.h000066400000000000000000000021541320135501600254520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2013, 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __MPI_CHOLESKY_H__ #define __MPI_CHOLESKY_H__ #include #include #include "mpi_cholesky_codelets.h" #include "mpi_cholesky_kernels.h" #include "mpi_cholesky_models.h" #include "mpi_decomposition_matrix.h" #include "mpi_decomposition_params.h" #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #endif // __MPI_CHOLESKY_H__ starpu-1.2.3+dfsg/mpi/examples/matrix_decomposition/mpi_cholesky_codelets.c000066400000000000000000000153771320135501600273420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014-2015, 2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "mpi_cholesky.h" #include #include #include /* * Create the codelets */ static struct starpu_codelet cl11 = { .cpu_funcs = {chol_cpu_codelet_update_u11}, #ifdef STARPU_USE_CUDA .cuda_funcs = {chol_cublas_codelet_update_u11}, #elif defined(STARPU_SIMGRID) .cuda_funcs = {(void*)1}, #endif .nbuffers = 1, .modes = {STARPU_RW}, .model = &chol_model_11 }; static struct starpu_codelet cl21 = { .cpu_funcs = {chol_cpu_codelet_update_u21}, #ifdef STARPU_USE_CUDA .cuda_funcs = {chol_cublas_codelet_update_u21}, #elif defined(STARPU_SIMGRID) .cuda_funcs = {(void*)1}, #endif .nbuffers = 2, .modes = {STARPU_R, STARPU_RW}, .model = &chol_model_21 }; static struct starpu_codelet cl22 = { .cpu_funcs = {chol_cpu_codelet_update_u22}, #ifdef STARPU_USE_CUDA .cuda_funcs = {chol_cublas_codelet_update_u22}, #elif defined(STARPU_SIMGRID) .cuda_funcs = {(void*)1}, #endif .nbuffers = 3, .modes = {STARPU_R, STARPU_R, STARPU_RW | STARPU_COMMUTE}, .model = &chol_model_22 }; /* * code to bootstrap the factorization * and construct the DAG */ void dw_cholesky(float ***matA, unsigned ld, int rank, int nodes, double *timing, double *flops) { double start; double end; starpu_data_handle_t **data_handles; unsigned x,y,i,j,k; unsigned unbound_prio = STARPU_MAX_PRIO == INT_MAX && STARPU_MIN_PRIO == INT_MIN; /* create all the DAG nodes */ data_handles = malloc(nblocks*sizeof(starpu_data_handle_t *)); for(x=0 ; x j) { rmat[j+i*size] = 0.0f; // debug } } } float *test_mat = malloc(size*size*sizeof(float)); STARPU_ASSERT(test_mat); STARPU_SSYRK("L", "N", size, size, 1.0f, rmat, size, 0.0f, test_mat, size); FPRINTF(stderr, "[%d] comparing results ...\n", rank); if (display) { for (j = 0; j < size; j++) { for (i = 0; i < size; i++) { if (i <= j) { printf("%2.2f\t", test_mat[j +i*size]); } else { printf(".\t"); } } printf("\n"); } } *correctness = 1; for(x = 0; x < nblocks ; x++) { for (y = 0; y < nblocks; y++) { int mpi_rank = my_distrib(x, y, nodes); if (mpi_rank == rank) { for (i = (size/nblocks)*x ; i < (size/nblocks)*x+(size/nblocks); i++) { for (j = (size/nblocks)*y ; j < (size/nblocks)*y+(size/nblocks); j++) { if (i <= j) { float orig = (1.0f/(1.0f+i+j)) + ((i == j)?1.0f*size:0.0f); float err = abs(test_mat[j +i*size] - orig); if (err > 0.00001) { FPRINTF(stderr, "[%d] Error[%u, %u] --> %2.2f != %2.2f (err %2.2f)\n", rank, i, j, test_mat[j +i*size], orig, err); *correctness = 0; *flops = 0; break; } } } } } } } free(rmat); free(test_mat); } starpu-1.2.3+dfsg/mpi/examples/matrix_decomposition/mpi_cholesky_codelets.h000066400000000000000000000021101320135501600273240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __MPI_CHOLESKY_CODELETS_H__ #define __MPI_CHOLESKY_CODELETS_H__ /* * code to bootstrap the factorization * and construct the DAG */ void dw_cholesky(float ***matA, unsigned ld, int rank, int nodes, double *timing, double *flops); void dw_cholesky_check_computation(float ***matA, int rank, int nodes, int *correctness, double *flops); #endif /* __MPI_CHOLESKY_CODELETS_H__ */ starpu-1.2.3+dfsg/mpi/examples/matrix_decomposition/mpi_cholesky_distributed.c000066400000000000000000000032611320135501600300470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2011 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2013, 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "mpi_cholesky.h" int main(int argc, char **argv) { /* create a simple definite positive symetric matrix example * * Hilbert matrix : h(i,j) = 1/(i+j+1) * */ float ***bmat; int rank, nodes, ret; double timing, flops; ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(&argc, &argv, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &nodes); starpu_cublas_init(); parse_args(argc, argv, nodes); matrix_init(&bmat, rank, nodes, 0); dw_cholesky(bmat, size/nblocks, rank, nodes, &timing, &flops); starpu_mpi_shutdown(); matrix_free(&bmat, rank, nodes, 0); starpu_cublas_shutdown(); starpu_shutdown(); if (rank == 0) { FPRINTF(stdout, "Computation time (in ms): %2.2f\n", timing/1000); FPRINTF(stdout, "Synthetic GFlops : %2.2f\n", (flops/timing/1000.0f)); } return 0; } starpu-1.2.3+dfsg/mpi/examples/matrix_decomposition/mpi_cholesky_kernels.c000066400000000000000000000134721320135501600271750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2012-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "mpi_cholesky.h" #include #include "common/blas.h" #ifdef STARPU_USE_CUDA #include #include #include #ifdef STARPU_HAVE_MAGMA #include "magma.h" #include "magma_lapack.h" #endif #endif /* * U22 */ static inline void chol_common_cpu_codelet_update_u22(void *descr[], int s, STARPU_ATTRIBUTE_UNUSED void *_args) { //printf("22\n"); float *left = (float *)STARPU_MATRIX_GET_PTR(descr[0]); float *right = (float *)STARPU_MATRIX_GET_PTR(descr[1]); float *center = (float *)STARPU_MATRIX_GET_PTR(descr[2]); unsigned dx = STARPU_MATRIX_GET_NY(descr[2]); unsigned dy = STARPU_MATRIX_GET_NX(descr[2]); unsigned dz = STARPU_MATRIX_GET_NY(descr[0]); unsigned ld21 = STARPU_MATRIX_GET_LD(descr[0]); unsigned ld12 = STARPU_MATRIX_GET_LD(descr[1]); unsigned ld22 = STARPU_MATRIX_GET_LD(descr[2]); #ifdef STARPU_USE_CUDA cublasStatus st; #endif switch (s) { case 0: STARPU_SGEMM("N", "T", dy, dx, dz, -1.0f, left, ld21, right, ld12, 1.0f, center, ld22); break; #ifdef STARPU_USE_CUDA case 1: #ifdef STARPU_HAVE_MAGMA cublasSetKernelStream(starpu_cuda_get_local_stream()); #endif cublasSgemm('n', 't', dy, dx, dz, -1.0f, left, ld21, right, ld12, 1.0f, center, ld22); st = cublasGetError(); if (STARPU_UNLIKELY(st != CUBLAS_STATUS_SUCCESS)) STARPU_CUBLAS_REPORT_ERROR(st); cudaStreamSynchronize(starpu_cuda_get_local_stream()); break; #endif default: STARPU_ABORT(); break; } } void chol_cpu_codelet_update_u22(void *descr[], void *_args) { chol_common_cpu_codelet_update_u22(descr, 0, _args); } #ifdef STARPU_USE_CUDA void chol_cublas_codelet_update_u22(void *descr[], void *_args) { chol_common_cpu_codelet_update_u22(descr, 1, _args); } #endif// STARPU_USE_CUDA /* * U21 */ static inline void chol_common_codelet_update_u21(void *descr[], int s, STARPU_ATTRIBUTE_UNUSED void *_args) { // printf("21\n"); float *sub11; float *sub21; sub11 = (float *)STARPU_MATRIX_GET_PTR(descr[0]); sub21 = (float *)STARPU_MATRIX_GET_PTR(descr[1]); unsigned ld11 = STARPU_MATRIX_GET_LD(descr[0]); unsigned ld21 = STARPU_MATRIX_GET_LD(descr[1]); unsigned nx21 = STARPU_MATRIX_GET_NY(descr[1]); unsigned ny21 = STARPU_MATRIX_GET_NX(descr[1]); switch (s) { case 0: STARPU_STRSM("R", "L", "T", "N", nx21, ny21, 1.0f, sub11, ld11, sub21, ld21); break; #ifdef STARPU_USE_CUDA case 1: #ifdef STARPU_HAVE_MAGMA cublasSetKernelStream(starpu_cuda_get_local_stream()); #endif cublasStrsm('R', 'L', 'T', 'N', nx21, ny21, 1.0f, sub11, ld11, sub21, ld21); cudaStreamSynchronize(starpu_cuda_get_local_stream()); break; #endif default: STARPU_ABORT(); break; } } void chol_cpu_codelet_update_u21(void *descr[], void *_args) { chol_common_codelet_update_u21(descr, 0, _args); } #ifdef STARPU_USE_CUDA void chol_cublas_codelet_update_u21(void *descr[], void *_args) { chol_common_codelet_update_u21(descr, 1, _args); } #endif /* * U11 */ static inline void chol_common_codelet_update_u11(void *descr[], int s, STARPU_ATTRIBUTE_UNUSED void *_args) { // printf("11\n"); float *sub11; sub11 = (float *)STARPU_MATRIX_GET_PTR(descr[0]); unsigned nx = STARPU_MATRIX_GET_NY(descr[0]); unsigned ld = STARPU_MATRIX_GET_LD(descr[0]); unsigned z; switch (s) { case 0: #ifdef STARPU_MKL STARPU_SPOTRF("L", nx, sub11, ld); #else /* * - alpha 11 <- lambda 11 = sqrt(alpha11) * - alpha 21 <- l 21 = alpha 21 / lambda 11 * - A22 <- A22 - l21 trans(l21) */ for (z = 0; z < nx; z++) { float lambda11; lambda11 = sqrt(sub11[z+z*ld]); sub11[z+z*ld] = lambda11; STARPU_ASSERT(lambda11 != 0.0f); STARPU_SSCAL(nx - z - 1, 1.0f/lambda11, &sub11[(z+1)+z*ld], 1); STARPU_SSYR("L", nx - z - 1, -1.0f, &sub11[(z+1)+z*ld], 1, &sub11[(z+1)+(z+1)*ld], ld); } #endif break; #ifdef STARPU_USE_CUDA case 1: #ifdef STARPU_HAVE_MAGMA { int ret; int info; ret = magma_spotrf_gpu(MagmaLower, nx, sub11, ld, &info); if (ret != MAGMA_SUCCESS) { fprintf(stderr, "Error in Magma: %d\n", ret); STARPU_ABORT(); } cudaError_t cures = cudaThreadSynchronize(); STARPU_ASSERT(!cures); } #else for (z = 0; z < nx; z++) { float lambda11; cudaMemcpyAsync(&lambda11, &sub11[z+z*ld], sizeof(float), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); STARPU_ASSERT(lambda11 != 0.0f); lambda11 = sqrt(lambda11); cublasSetVector(1, sizeof(float), &lambda11, sizeof(float), &sub11[z+z*ld], sizeof(float)); cublasSscal(nx - z - 1, 1.0f/lambda11, &sub11[(z+1)+z*ld], 1); cublasSsyr('U', nx - z - 1, -1.0f, &sub11[(z+1)+z*ld], 1, &sub11[(z+1)+(z+1)*ld], ld); } cudaStreamSynchronize(starpu_cuda_get_local_stream()); #endif break; #endif default: STARPU_ABORT(); break; } } void chol_cpu_codelet_update_u11(void *descr[], void *_args) { chol_common_codelet_update_u11(descr, 0, _args); } #ifdef STARPU_USE_CUDA void chol_cublas_codelet_update_u11(void *descr[], void *_args) { chol_common_codelet_update_u11(descr, 1, _args); } #endif// STARPU_USE_CUDA starpu-1.2.3+dfsg/mpi/examples/matrix_decomposition/mpi_cholesky_kernels.h000066400000000000000000000022761320135501600272020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __MPI_CHOLESKY_KERNELS_H__ #define __MPI_CHOLESKY_KERNELS_H__ #include void chol_cpu_codelet_update_u11(void **, void *); void chol_cpu_codelet_update_u21(void **, void *); void chol_cpu_codelet_update_u22(void **, void *); #ifdef STARPU_USE_CUDA void chol_cublas_codelet_update_u11(void *descr[], void *_args); void chol_cublas_codelet_update_u21(void *descr[], void *_args); void chol_cublas_codelet_update_u22(void *descr[], void *_args); #endif #endif // __MPI_CHOLESKY_KERNELS_H__ starpu-1.2.3+dfsg/mpi/examples/matrix_decomposition/mpi_cholesky_models.c000066400000000000000000000020601320135501600270040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "mpi_cholesky.h" /* * Number of flops of Gemm */ struct starpu_perfmodel chol_model_11 = { .type = STARPU_HISTORY_BASED, .symbol = "chol_model_11" }; struct starpu_perfmodel chol_model_21 = { .type = STARPU_HISTORY_BASED, .symbol = "chol_model_21" }; struct starpu_perfmodel chol_model_22 = { .type = STARPU_HISTORY_BASED, .symbol = "chol_model_22" }; starpu-1.2.3+dfsg/mpi/examples/matrix_decomposition/mpi_cholesky_models.h000066400000000000000000000016621320135501600270200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2013, 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DW_CHOLESKY_MODELS_H__ #define __DW_CHOLESKY_MODELS_H__ extern struct starpu_perfmodel chol_model_11; extern struct starpu_perfmodel chol_model_21; extern struct starpu_perfmodel chol_model_22; #endif // __DW_CHOLESKY_MODELS_H__ starpu-1.2.3+dfsg/mpi/examples/matrix_decomposition/mpi_decomposition_matrix.c000066400000000000000000000051121320135501600300610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012, 2015 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2013, 2015, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "mpi_cholesky.h" /* Returns the MPI node number where data indexes index is */ int my_distrib(int x, int y, int nb_nodes) { //return (x+y) % nb_nodes; return (x%dblockx)+(y%dblocky)*dblockx; } void matrix_display(float ***bmat, int rank) { if (display) { unsigned y; printf("[%d] Input :\n", rank); for(y=0 ; y * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __MPI_CHOLESKY_MATRIX_H__ #define __MPI_CHOLESKY_MATRIX_H__ /* Returns the MPI node number where data indexes index is */ int my_distrib(int x, int y, int nb_nodes); void matrix_display(float ***bmat, int rank); void matrix_init(float ****bmat, int rank, int nodes, int alloc_everywhere); void matrix_free(float ****bmat, int rank, int nodes, int alloc_everywhere); #endif /* __MPI_CHOLESKY_MATRIX_H__ */ starpu-1.2.3+dfsg/mpi/examples/matrix_decomposition/mpi_decomposition_params.c000066400000000000000000000061401320135501600300420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2015-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "mpi_cholesky.h" #include #include #include #include #ifdef STARPU_QUICK_CHECK unsigned size = 4*64; unsigned nblocks = 2; unsigned nbigblocks = 2; #elif !defined(STARPU_LONG_CHECK) unsigned size = 4*320; unsigned nblocks = 4; unsigned nbigblocks = 2; #else unsigned size = 16*320; unsigned nblocks = 16; unsigned nbigblocks = 2; #endif unsigned noprio = 0; unsigned display = 0; int dblockx = -1; int dblocky = -1; void parse_args(int argc, char **argv, int nodes) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-size") == 0) { char *argptr; size = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-dblockx") == 0) { char *argptr; dblockx = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-dblocky") == 0) { char *argptr; dblocky = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-nblocks") == 0) { char *argptr; nblocks = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-nbigblocks") == 0) { char *argptr; nbigblocks = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-no-prio") == 0) { noprio = 1; } if (strcmp(argv[i], "-display") == 0) { display = 1; } if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) { printf("usage : %s [-size size] [-nblocks nblocks] [-no-prio] [-display]\n", argv[0]); } } if (nblocks > size) nblocks = size; if (dblockx == -1 || dblocky == -1) { int factor; dblockx = nodes; dblocky = 1; for(factor=sqrt(nodes) ; factor>1 ; factor--) { if (nodes % factor == 0) { dblockx = nodes/factor; dblocky = factor; break; } } } FPRINTF(stdout, "size: %u - nblocks: %u - dblocksx: %d - dblocksy: %d\n", size, nblocks, dblockx, dblocky); } starpu-1.2.3+dfsg/mpi/examples/matrix_decomposition/mpi_decomposition_params.h000066400000000000000000000020621320135501600300460ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __MPI_CHOLESKY_PARAMS_H__ #define __MPI_CHOLESKY_PARAMS_H__ #define BLOCKSIZE (size/nblocks) extern unsigned size; extern unsigned nblocks; extern unsigned nbigblocks; extern unsigned noprio; extern unsigned display; extern int dblockx; extern int dblocky; void parse_args(int argc, char **argv, int nodes); #endif // __MPI_CHOLESKY_PARAMS_H__ starpu-1.2.3+dfsg/mpi/examples/mpi_lu/000077500000000000000000000000001320135501600176365ustar00rootroot00000000000000starpu-1.2.3+dfsg/mpi/examples/mpi_lu/mpi_lu-double.h000066400000000000000000000024351320135501600225500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #define TYPE double #define MPI_TYPE MPI_DOUBLE #define STARPU_PLU(name) starpu_pdlu_##name #define CUBLAS_GEMM cublasDgemm #define CUBLAS_TRSM cublasDtrsm #define CUBLAS_SCAL cublasDscal #define CUBLAS_GER cublasDger #define CUBLAS_SWAP cublasDswap #define CUBLAS_IAMAX cublasIdamax #define CPU_GEMM STARPU_DGEMM #define CPU_GEMV STARPU_DGEMV #define CPU_TRSM STARPU_DTRSM #define CPU_SCAL STARPU_DSCAL #define CPU_GER STARPU_DGER #define CPU_SWAP STARPU_DSWAP #define CPU_TRMM STARPU_DTRMM #define CPU_AXPY STARPU_DAXPY #define CPU_ASUM STARPU_DASUM #define CPU_IAMAX STARPU_IDAMAX #define PIVOT_THRESHHOLD 10e-10 starpu-1.2.3+dfsg/mpi/examples/mpi_lu/mpi_lu-float.h000066400000000000000000000024321320135501600224000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #define TYPE float #define MPI_TYPE MPI_FLOAT #define STARPU_PLU(name) starpu_pslu_##name #define CUBLAS_GEMM cublasSgemm #define CUBLAS_TRSM cublasStrsm #define CUBLAS_SCAL cublasSscal #define CUBLAS_GER cublasSger #define CUBLAS_SWAP cublasSswap #define CUBLAS_IAMAX cublasIsamax #define CPU_GEMM STARPU_SGEMM #define CPU_GEMV STARPU_SGEMV #define CPU_TRSM STARPU_STRSM #define CPU_SCAL STARPU_SSCAL #define CPU_GER STARPU_SGER #define CPU_SWAP STARPU_SSWAP #define CPU_TRMM STARPU_STRMM #define CPU_AXPY STARPU_SAXPY #define CPU_ASUM STARPU_SASUM #define CPU_IAMAX STARPU_ISAMAX #define PIVOT_THRESHHOLD 10e-5 starpu-1.2.3+dfsg/mpi/examples/mpi_lu/pdlu.c000066400000000000000000000013261320135501600207500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "mpi_lu-double.h" #include "pxlu.c" starpu-1.2.3+dfsg/mpi/examples/mpi_lu/pdlu_implicit.c000066400000000000000000000013451320135501600226430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2013 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "mpi_lu-double.h" #include "pxlu_implicit.c" starpu-1.2.3+dfsg/mpi/examples/mpi_lu/pdlu_kernels.c000066400000000000000000000013361320135501600224740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "mpi_lu-double.h" #include "pxlu_kernels.c" starpu-1.2.3+dfsg/mpi/examples/mpi_lu/plu_example.c000066400000000000000000000350221320135501600223170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013, 2015, 2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include "pxlu.h" //#include "pxlu_kernels.h" #ifdef STARPU_HAVE_LIBNUMA #include #endif static unsigned long size = 4096; static unsigned nblocks = 16; static unsigned check = 0; static int p = 1; static int q = 1; static unsigned display = 0; #ifdef STARPU_HAVE_LIBNUMA static unsigned numa = 0; #endif static size_t allocated_memory = 0; static size_t allocated_memory_extra = 0; static starpu_data_handle_t *dataA_handles; static TYPE **dataA; /* In order to implement the distributed LU decomposition, we allocate * temporary buffers */ #ifdef SINGLE_TMP11 static starpu_data_handle_t tmp_11_block_handle; static TYPE *tmp_11_block; #else static starpu_data_handle_t *tmp_11_block_handles; static TYPE **tmp_11_block; #endif #ifdef SINGLE_TMP1221 static starpu_data_handle_t *tmp_12_block_handles; static TYPE **tmp_12_block; static starpu_data_handle_t *tmp_21_block_handles; static TYPE **tmp_21_block; #else static starpu_data_handle_t *(tmp_12_block_handles[2]); static TYPE **(tmp_12_block[2]); static starpu_data_handle_t *(tmp_21_block_handles[2]); static TYPE **(tmp_21_block[2]); #endif static void parse_args(int rank, int argc, char **argv) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-size") == 0) { char *argptr; size = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-nblocks") == 0) { char *argptr; nblocks = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-check") == 0) { check = 1; } if (strcmp(argv[i], "-display") == 0) { display = 1; } if (strcmp(argv[i], "-numa") == 0) { #ifdef STARPU_HAVE_LIBNUMA numa = 1; #else if (rank == 0) fprintf(stderr, "Warning: libnuma is not available\n"); #endif } if (strcmp(argv[i], "-p") == 0) { char *argptr; p = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-q") == 0) { char *argptr; q = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "-help") == 0 || strcmp(argv[i], "--help") == 0) { fprintf(stderr,"usage: %s [-size n] [-nblocks b] [-check] [-display] [-numa] [-p p] [-q q]\n", argv[0]); fprintf(stderr,"\np * q must be equal to the number of MPI nodes\n"); exit(0); } } } unsigned STARPU_PLU(display_flag)(void) { return display; } static void fill_block_with_random(TYPE *blockptr, unsigned psize, unsigned pnblocks) { const unsigned block_size = (psize/pnblocks); unsigned i, j; for (i = 0; i < block_size; i++) for (j = 0; j < block_size; j++) { blockptr[j+i*block_size] = (TYPE)starpu_drand48(); } } #ifdef SINGLE_TMP11 starpu_data_handle_t STARPU_PLU(get_tmp_11_block_handle)(void) { return tmp_11_block_handle; } #else starpu_data_handle_t STARPU_PLU(get_tmp_11_block_handle)(unsigned k) { return tmp_11_block_handles[k]; } #endif #ifdef SINGLE_TMP1221 starpu_data_handle_t STARPU_PLU(get_tmp_12_block_handle)(unsigned j) { return tmp_12_block_handles[j]; } starpu_data_handle_t STARPU_PLU(get_tmp_21_block_handle)(unsigned i) { return tmp_21_block_handles[i]; } #else starpu_data_handle_t STARPU_PLU(get_tmp_12_block_handle)(unsigned j, unsigned k) { return tmp_12_block_handles[k%2][j]; } starpu_data_handle_t STARPU_PLU(get_tmp_21_block_handle)(unsigned i, unsigned k) { return tmp_21_block_handles[k%2][i]; } #endif static unsigned tmp_11_block_is_needed(int rank, unsigned pnblocks, unsigned k) { return 1; } static unsigned tmp_12_block_is_needed(int rank, unsigned pnblocks, unsigned j) { unsigned i; for (i = 1; i < pnblocks; i++) { if (get_block_rank(i, j) == rank) return 1; } return 0; } static unsigned tmp_21_block_is_needed(int rank, unsigned pnblocks, unsigned i) { unsigned j; for (j = 1; j < pnblocks; j++) { if (get_block_rank(i, j) == rank) return 1; } return 0; } static void init_matrix(int rank) { #ifdef STARPU_HAVE_LIBNUMA if (numa) { fprintf(stderr, "Using INTERLEAVE policy\n"); unsigned long nodemask = ((1<<0)|(1<<1)); int ret = set_mempolicy(MPOL_INTERLEAVE, &nodemask, 3); if (ret) perror("set_mempolicy failed"); } #endif /* Allocate a grid of data handles, not all of them have to be allocated later on */ dataA_handles = calloc(nblocks*nblocks, sizeof(starpu_data_handle_t)); dataA = calloc(nblocks*nblocks, sizeof(TYPE *)); allocated_memory_extra += nblocks*nblocks*(sizeof(starpu_data_handle_t) + sizeof(TYPE *)); size_t blocksize = (size_t)(size/nblocks)*(size/nblocks)*sizeof(TYPE); /* Allocate all the blocks that belong to this mpi node */ unsigned long i,j; for (j = 0; j < nblocks; j++) { for (i = 0; i < nblocks; i++) { TYPE **blockptr = &dataA[j+i*nblocks]; // starpu_data_handle_t *handleptr = &dataA_handles[j+nblocks*i]; starpu_data_handle_t *handleptr = &dataA_handles[j+nblocks*i]; if (get_block_rank(i, j) == rank) { /* This blocks should be treated by the current MPI process */ /* Allocate and fill it */ starpu_malloc((void **)blockptr, blocksize); allocated_memory += blocksize; //fprintf(stderr, "Rank %d : fill block (i = %d, j = %d)\n", rank, i, j); fill_block_with_random(*blockptr, size, nblocks); //fprintf(stderr, "Rank %d : fill block (i = %d, j = %d)\n", rank, i, j); if (i == j) { unsigned tmp; for (tmp = 0; tmp < size/nblocks; tmp++) { (*blockptr)[tmp*((size/nblocks)+1)] += (TYPE)10*nblocks; } } /* Register it to StarPU */ starpu_matrix_data_register(handleptr, STARPU_MAIN_RAM, (uintptr_t)*blockptr, size/nblocks, size/nblocks, size/nblocks, sizeof(TYPE)); starpu_data_set_coordinates(*handleptr, 2, j, i); } else { *blockptr = STARPU_POISON_PTR; *handleptr = STARPU_POISON_PTR; } } } /* Allocate the temporary buffers required for the distributed algorithm */ unsigned k; /* tmp buffer 11 */ #ifdef SINGLE_TMP11 starpu_malloc((void **)&tmp_11_block, blocksize); allocated_memory_extra += blocksize; starpu_matrix_data_register(&tmp_11_block_handle, STARPU_MAIN_RAM, (uintptr_t)tmp_11_block, size/nblocks, size/nblocks, size/nblocks, sizeof(TYPE)); #else tmp_11_block_handles = calloc(nblocks, sizeof(starpu_data_handle_t)); tmp_11_block = calloc(nblocks, sizeof(TYPE *)); allocated_memory_extra += nblocks*(sizeof(starpu_data_handle_t) + sizeof(TYPE *)); for (k = 0; k < nblocks; k++) { if (tmp_11_block_is_needed(rank, nblocks, k)) { starpu_malloc((void **)&tmp_11_block[k], blocksize); allocated_memory_extra += blocksize; STARPU_ASSERT(tmp_11_block[k]); starpu_matrix_data_register(&tmp_11_block_handles[k], STARPU_MAIN_RAM, (uintptr_t)tmp_11_block[k], size/nblocks, size/nblocks, size/nblocks, sizeof(TYPE)); } } #endif /* tmp buffers 12 and 21 */ #ifdef SINGLE_TMP1221 tmp_12_block_handles = calloc(nblocks, sizeof(starpu_data_handle_t)); tmp_21_block_handles = calloc(nblocks, sizeof(starpu_data_handle_t)); tmp_12_block = calloc(nblocks, sizeof(TYPE *)); tmp_21_block = calloc(nblocks, sizeof(TYPE *)); allocated_memory_extra += 2*nblocks*(sizeof(starpu_data_handle_t) + sizeof(TYPE *)); #else for (i = 0; i < 2; i++) { tmp_12_block_handles[i] = calloc(nblocks, sizeof(starpu_data_handle_t)); tmp_21_block_handles[i] = calloc(nblocks, sizeof(starpu_data_handle_t)); tmp_12_block[i] = calloc(nblocks, sizeof(TYPE *)); tmp_21_block[i] = calloc(nblocks, sizeof(TYPE *)); allocated_memory_extra += 2*nblocks*(sizeof(starpu_data_handle_t) + sizeof(TYPE *)); } #endif for (k = 0; k < nblocks; k++) { #ifdef SINGLE_TMP1221 if (tmp_12_block_is_needed(rank, nblocks, k)) { starpu_malloc((void **)&tmp_12_block[k], blocksize); allocated_memory_extra += blocksize; STARPU_ASSERT(tmp_12_block[k]); starpu_matrix_data_register(&tmp_12_block_handles[k], STARPU_MAIN_RAM, (uintptr_t)tmp_12_block[k], size/nblocks, size/nblocks, size/nblocks, sizeof(TYPE)); } if (tmp_21_block_is_needed(rank, nblocks, k)) { starpu_malloc((void **)&tmp_21_block[k], blocksize); allocated_memory_extra += blocksize; STARPU_ASSERT(tmp_21_block[k]); starpu_matrix_data_register(&tmp_21_block_handles[k], STARPU_MAIN_RAM, (uintptr_t)tmp_21_block[k], size/nblocks, size/nblocks, size/nblocks, sizeof(TYPE)); } #else for (i = 0; i < 2; i++) { if (tmp_12_block_is_needed(rank, nblocks, k)) { starpu_malloc((void **)&tmp_12_block[i][k], blocksize); allocated_memory_extra += blocksize; STARPU_ASSERT(tmp_12_block[i][k]); starpu_matrix_data_register(&tmp_12_block_handles[i][k], STARPU_MAIN_RAM, (uintptr_t)tmp_12_block[i][k], size/nblocks, size/nblocks, size/nblocks, sizeof(TYPE)); } if (tmp_21_block_is_needed(rank, nblocks, k)) { starpu_malloc((void **)&tmp_21_block[i][k], blocksize); allocated_memory_extra += blocksize; STARPU_ASSERT(tmp_21_block[i][k]); starpu_matrix_data_register(&tmp_21_block_handles[i][k], STARPU_MAIN_RAM, (uintptr_t)tmp_21_block[i][k], size/nblocks, size/nblocks, size/nblocks, sizeof(TYPE)); } } #endif } //display_all_blocks(nblocks, size/nblocks); } TYPE *STARPU_PLU(get_block)(unsigned i, unsigned j) { return dataA[j+i*nblocks]; } int get_block_rank(unsigned i, unsigned j) { /* Take a 2D block cyclic distribution */ /* NB: p (resp. q) is for "direction" i (resp. j) */ return (j % q) * p + (i % p); } starpu_data_handle_t STARPU_PLU(get_block_handle)(unsigned i, unsigned j) { return dataA_handles[j+i*nblocks]; } static void display_grid(int rank, unsigned pnblocks) { if (!display) return; //if (rank == 0) { fprintf(stderr, "2D grid layout (Rank %d): \n", rank); unsigned i, j; for (j = 0; j < pnblocks; j++) { for (i = 0; i < pnblocks; i++) { TYPE *blockptr = STARPU_PLU(get_block)(i, j); starpu_data_handle_t handle = STARPU_PLU(get_block_handle)(i, j); fprintf(stderr, "%d (data %p handle %p)", get_block_rank(i, j), blockptr, handle); } fprintf(stderr, "\n"); } } } int main(int argc, char **argv) { int rank; int world_size; /* * Initialization */ int thread_support; if (MPI_Init_thread(&argc, &argv, MPI_THREAD_SERIALIZED, &thread_support) != MPI_SUCCESS) { fprintf(stderr,"MPI_Init_thread failed\n"); exit(1); } if (thread_support == MPI_THREAD_FUNNELED) fprintf(stderr,"Warning: MPI only has funneled thread support, not serialized, hoping this will work\n"); if (thread_support < MPI_THREAD_FUNNELED) fprintf(stderr,"Warning: MPI does not have thread support!\n"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &world_size); starpu_srand48((long int)time(NULL)); parse_args(rank, argc, argv); int ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* We disable sequential consistency in this example */ starpu_data_set_default_sequential_consistency_flag(0); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); STARPU_ASSERT(p*q == world_size); starpu_cublas_init(); int barrier_ret = MPI_Barrier(MPI_COMM_WORLD); STARPU_ASSERT(barrier_ret == MPI_SUCCESS); /* * Problem Init */ init_matrix(rank); fprintf(stderr, "Rank %d: allocated (%d + %d) MB = %d MB\n", rank, (int)(allocated_memory/(1024*1024)), (int)(allocated_memory_extra/(1024*1024)), (int)((allocated_memory+allocated_memory_extra)/(1024*1024))); display_grid(rank, nblocks); TYPE *a_r = NULL; // STARPU_PLU(display_data_content)(a_r, size); if (check) { TYPE *x, *y; x = calloc(size, sizeof(TYPE)); STARPU_ASSERT(x); y = calloc(size, sizeof(TYPE)); STARPU_ASSERT(y); if (rank == 0) { unsigned ind; for (ind = 0; ind < size; ind++) x[ind] = (TYPE)starpu_drand48(); } a_r = STARPU_PLU(reconstruct_matrix)(size, nblocks); if (rank == 0) STARPU_PLU(display_data_content)(a_r, size); // STARPU_PLU(compute_ax)(size, x, y, nblocks, rank); free(x); free(y); } barrier_ret = MPI_Barrier(MPI_COMM_WORLD); STARPU_ASSERT(barrier_ret == MPI_SUCCESS); double timing = STARPU_PLU(plu_main)(nblocks, rank, world_size); /* * Report performance */ int reduce_ret; double min_timing = timing; double max_timing = timing; double sum_timing = timing; reduce_ret = MPI_Reduce(&timing, &min_timing, 1, MPI_DOUBLE, MPI_MIN, 0, MPI_COMM_WORLD); STARPU_ASSERT(reduce_ret == MPI_SUCCESS); reduce_ret = MPI_Reduce(&timing, &max_timing, 1, MPI_DOUBLE, MPI_MAX, 0, MPI_COMM_WORLD); STARPU_ASSERT(reduce_ret == MPI_SUCCESS); reduce_ret = MPI_Reduce(&timing, &sum_timing, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); STARPU_ASSERT(reduce_ret == MPI_SUCCESS); if (rank == 0) { fprintf(stderr, "Computation took: %f ms\n", max_timing/1000); fprintf(stderr, "\tMIN : %f ms\n", min_timing/1000); fprintf(stderr, "\tMAX : %f ms\n", max_timing/1000); fprintf(stderr, "\tAVG : %f ms\n", sum_timing/(world_size*1000)); unsigned n = size; double flop = (2.0f*n*n*n)/3.0f; fprintf(stderr, "Synthetic GFlops : %2.2f\n", (flop/max_timing/1000.0f)); } /* * Test Result Correctness */ if (check) { /* * Compute || A - LU || */ STARPU_PLU(compute_lu_matrix)(size, nblocks, a_r); #if 0 /* * Compute || Ax - LUx || */ unsigned ind; y2 = calloc(size, sizeof(TYPE)); STARPU_ASSERT(y); if (rank == 0) { for (ind = 0; ind < size; ind++) { y2[ind] = (TYPE)0.0; } } STARPU_PLU(compute_lux)(size, x, y2, nblocks, rank); /* Compute y2 = y2 - y */ CPU_AXPY(size, -1.0, y, 1, y2, 1); TYPE err = CPU_ASUM(size, y2, 1); int max = CPU_IAMAX(size, y2, 1); fprintf(stderr, "(A - LU)X Avg error : %e\n", err/(size*size)); fprintf(stderr, "(A - LU)X Max error : %e\n", y2[max]); #endif } /* * Termination */ barrier_ret = MPI_Barrier(MPI_COMM_WORLD); STARPU_ASSERT(barrier_ret == MPI_SUCCESS); starpu_cublas_shutdown(); starpu_mpi_shutdown(); starpu_shutdown(); #if 0 MPI_Finalize(); #endif return 0; } starpu-1.2.3+dfsg/mpi/examples/mpi_lu/plu_example_double.c000066400000000000000000000013351320135501600236510ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "mpi_lu-double.h" #include "plu_example.c" starpu-1.2.3+dfsg/mpi/examples/mpi_lu/plu_example_float.c000066400000000000000000000013341320135501600235030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "mpi_lu-float.h" #include "plu_example.c" starpu-1.2.3+dfsg/mpi/examples/mpi_lu/plu_implicit_example.c000066400000000000000000000201441320135501600242100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013, 2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include "pxlu.h" //#include "pxlu_kernels.h" #ifdef STARPU_HAVE_LIBNUMA #include #endif static unsigned long size = 4096; static unsigned nblocks = 16; static unsigned check = 0; static int p = 1; static int q = 1; static unsigned display = 0; #ifdef STARPU_HAVE_LIBNUMA static unsigned numa = 0; #endif static size_t allocated_memory = 0; static size_t allocated_memory_extra = 0; static starpu_data_handle_t *dataA_handles; static TYPE **dataA; int get_block_rank(unsigned i, unsigned j); static void parse_args(int argc, char **argv) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-size") == 0) { char *argptr; size = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-nblocks") == 0) { char *argptr; nblocks = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-check") == 0) { check = 1; } if (strcmp(argv[i], "-display") == 0) { display = 1; } if (strcmp(argv[i], "-numa") == 0) { #ifdef STARPU_HAVE_LIBNUMA numa = 1; #else fprintf(stderr, "Warning: libnuma is not available\n"); #endif } if (strcmp(argv[i], "-p") == 0) { char *argptr; p = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-q") == 0) { char *argptr; q = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "-help") == 0 || strcmp(argv[i], "--help") == 0) { fprintf(stderr,"usage: %s [-size n] [-nblocks b] [-check] [-display] [-numa] [-p p] [-q q]\n", argv[0]); fprintf(stderr,"\np * q must be equal to the number of MPI nodes\n"); exit(0); } } } unsigned STARPU_PLU(display_flag)(void) { return display; } static void fill_block_with_random(TYPE *blockptr, unsigned psize, unsigned pnblocks) { const unsigned block_size = (psize/pnblocks); unsigned i, j; for (i = 0; i < block_size; i++) for (j = 0; j < block_size; j++) { blockptr[j+i*block_size] = (TYPE)starpu_drand48(); } } static void init_matrix(int rank) { #ifdef STARPU_HAVE_LIBNUMA if (numa) { fprintf(stderr, "Using INTERLEAVE policy\n"); unsigned long nodemask = ((1<<0)|(1<<1)); int ret = set_mempolicy(MPOL_INTERLEAVE, &nodemask, 3); if (ret) perror("set_mempolicy failed"); } #endif /* Allocate a grid of data handles, not all of them have to be allocated later on */ dataA_handles = calloc(nblocks*nblocks, sizeof(starpu_data_handle_t)); dataA = calloc(nblocks*nblocks, sizeof(TYPE *)); allocated_memory_extra += nblocks*nblocks*(sizeof(starpu_data_handle_t) + sizeof(TYPE *)); size_t blocksize = (size_t)(size/nblocks)*(size/nblocks)*sizeof(TYPE); /* Allocate all the blocks that belong to this mpi node */ unsigned long i,j; for (j = 0; j < nblocks; j++) { for (i = 0; i < nblocks; i++) { int block_rank = get_block_rank(i, j); TYPE **blockptr = &dataA[j+i*nblocks]; // starpu_data_handle_t *handleptr = &dataA_handles[j+nblocks*i]; starpu_data_handle_t *handleptr = &dataA_handles[j+nblocks*i]; if (block_rank == rank) { /* This blocks should be treated by the current MPI process */ /* Allocate and fill it */ starpu_malloc((void **)blockptr, blocksize); allocated_memory += blocksize; //fprintf(stderr, "Rank %d : fill block (i = %d, j = %d)\n", rank, i, j); fill_block_with_random(*blockptr, size, nblocks); //fprintf(stderr, "Rank %d : fill block (i = %d, j = %d)\n", rank, i, j); if (i == j) { unsigned tmp; for (tmp = 0; tmp < size/nblocks; tmp++) { (*blockptr)[tmp*((size/nblocks)+1)] += (TYPE)10*nblocks; } } /* Register it to StarPU */ starpu_matrix_data_register(handleptr, STARPU_MAIN_RAM, (uintptr_t)*blockptr, size/nblocks, size/nblocks, size/nblocks, sizeof(TYPE)); } else { starpu_matrix_data_register(handleptr, -1, 0, size/nblocks, size/nblocks, size/nblocks, sizeof(TYPE)); *blockptr = STARPU_POISON_PTR; } starpu_data_set_coordinates(*handleptr, 2, j, i); starpu_mpi_data_register(*handleptr, j+i*nblocks, block_rank); } } //display_all_blocks(nblocks, size/nblocks); } TYPE *STARPU_PLU(get_block)(unsigned i, unsigned j) { return dataA[j+i*nblocks]; } int get_block_rank(unsigned i, unsigned j) { /* Take a 2D block cyclic distribution */ /* NB: p (resp. q) is for "direction" i (resp. j) */ return (j % q) * p + (i % p); } starpu_data_handle_t STARPU_PLU(get_block_handle)(unsigned i, unsigned j) { return dataA_handles[j+i*nblocks]; } static void display_grid(int rank, unsigned pnblocks) { if (!display) return; //if (rank == 0) { fprintf(stderr, "2D grid layout (Rank %d): \n", rank); unsigned i, j; for (j = 0; j < pnblocks; j++) { for (i = 0; i < pnblocks; i++) { TYPE *blockptr = STARPU_PLU(get_block)(i, j); starpu_data_handle_t handle = STARPU_PLU(get_block_handle)(i, j); fprintf(stderr, "%d (data %p handle %p)", get_block_rank(i, j), blockptr, handle); } fprintf(stderr, "\n"); } } } int main(int argc, char **argv) { int rank; int world_size; starpu_srand48((long int)time(NULL)); parse_args(argc, argv); int ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(&argc, &argv, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &world_size); STARPU_ASSERT(p*q == world_size); starpu_cublas_init(); /* * Problem Init */ init_matrix(rank); fprintf(stderr, "Rank %d: allocated (%d + %d) MB = %d MB\n", rank, (int)(allocated_memory/(1024*1024)), (int)(allocated_memory_extra/(1024*1024)), (int)((allocated_memory+allocated_memory_extra)/(1024*1024))); display_grid(rank, nblocks); TYPE *a_r = NULL; // STARPU_PLU(display_data_content)(a_r, size); if (check) { TYPE *x, *y; x = calloc(size, sizeof(TYPE)); STARPU_ASSERT(x); y = calloc(size, sizeof(TYPE)); STARPU_ASSERT(y); if (rank == 0) { unsigned ind; for (ind = 0; ind < size; ind++) x[ind] = (TYPE)starpu_drand48(); } a_r = STARPU_PLU(reconstruct_matrix)(size, nblocks); if (rank == 0) STARPU_PLU(display_data_content)(a_r, size); // STARPU_PLU(compute_ax)(size, x, y, nblocks, rank); free(x); free(y); } double timing = STARPU_PLU(plu_main)(nblocks, rank, world_size); /* * Report performance */ if (rank == 0) { fprintf(stderr, "Computation took: %f ms\n", timing/1000); unsigned n = size; double flop = (2.0f*n*n*n)/3.0f; fprintf(stderr, "Synthetic GFlops : %2.2f\n", (flop/timing/1000.0f)); } /* * Test Result Correctness */ if (check) { /* * Compute || A - LU || */ STARPU_PLU(compute_lu_matrix)(size, nblocks, a_r); #if 0 /* * Compute || Ax - LUx || */ unsigned ind; y2 = calloc(size, sizeof(TYPE)); STARPU_ASSERT(y); if (rank == 0) { for (ind = 0; ind < size; ind++) { y2[ind] = (TYPE)0.0; } } STARPU_PLU(compute_lux)(size, x, y2, nblocks, rank); /* Compute y2 = y2 - y */ CPU_AXPY(size, -1.0, y, 1, y2, 1); TYPE err = CPU_ASUM(size, y2, 1); int max = CPU_IAMAX(size, y2, 1); fprintf(stderr, "(A - LU)X Avg error : %e\n", err/(size*size)); fprintf(stderr, "(A - LU)X Max error : %e\n", y2[max]); #endif } /* * Termination */ starpu_cublas_shutdown(); starpu_mpi_shutdown(); starpu_shutdown(); return 0; } starpu-1.2.3+dfsg/mpi/examples/mpi_lu/plu_implicit_example_double.c000066400000000000000000000013541320135501600255440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2013 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "mpi_lu-double.h" #include "plu_implicit_example.c" starpu-1.2.3+dfsg/mpi/examples/mpi_lu/plu_implicit_example_float.c000066400000000000000000000013531320135501600253760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2013 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "mpi_lu-float.h" #include "plu_implicit_example.c" starpu-1.2.3+dfsg/mpi/examples/mpi_lu/plu_outofcore_example.c000066400000000000000000000206111320135501600244020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013-2014, 2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include "pxlu.h" //#include "pxlu_kernels.h" #ifdef STARPU_HAVE_LIBNUMA #include #endif static unsigned long size = 4096; static unsigned nblocks = 16; static unsigned check = 0; static int p = 1; static int q = 1; static unsigned display = 0; static char *path = "./starpu-ooc-files"; #ifdef STARPU_HAVE_LIBNUMA static unsigned numa = 0; #endif static size_t allocated_memory = 0; static starpu_data_handle_t *dataA_handles; int get_block_rank(unsigned i, unsigned j); static void parse_args(int argc, char **argv) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-size") == 0) { char *argptr; size = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-nblocks") == 0) { char *argptr; nblocks = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-check") == 0) { check = 1; } if (strcmp(argv[i], "-display") == 0) { display = 1; } if (strcmp(argv[i], "-numa") == 0) { #ifdef STARPU_HAVE_LIBNUMA numa = 1; #else fprintf(stderr, "Warning: libnuma is not available\n"); #endif } if (strcmp(argv[i], "-p") == 0) { char *argptr; p = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-q") == 0) { char *argptr; q = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-path") == 0) { path = argv[++i]; } if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "-help") == 0 || strcmp(argv[i], "--help") == 0) { fprintf(stderr,"usage: %s [-size n] [-nblocks b] [-check] [-display] [-numa] [-p p] [-q q] [-path PATH]\n", argv[0]); fprintf(stderr,"\np * q must be equal to the number of MPI nodes\n"); exit(0); } } } unsigned STARPU_PLU(display_flag)(void) { return display; } static void fill_block_with_random(TYPE *blockptr, unsigned psize, unsigned pnblocks) { const unsigned block_size = (psize/pnblocks); unsigned i, j; for (i = 0; i < block_size; i++) for (j = 0; j < block_size; j++) { blockptr[j+i*block_size] = (TYPE)starpu_drand48(); } } static void create_matrix() { size_t blocksize = (size_t)(size/nblocks)*(size/nblocks)*sizeof(TYPE); TYPE *blockptr = malloc(blocksize); int fd; char *filename; unsigned filename_length = strlen(path) + 1 + sizeof(nblocks)*3 + 1 + sizeof(nblocks)*3 + 1; filename = malloc(filename_length); allocated_memory += nblocks*nblocks*blocksize; /* Create the whole matrix on the disk */ unsigned i,j; for (j = 0; j < nblocks; j++) { for (i = 0; i < nblocks; i++) { fill_block_with_random(blockptr, size, nblocks); if (i == j) { unsigned tmp; for (tmp = 0; tmp < size/nblocks; tmp++) { blockptr[tmp*((size/nblocks)+1)] += (TYPE)10*nblocks; } } snprintf(filename, filename_length, "%s/%u,%u", path, i, j); fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0777); if (fd < 0) { perror("open"); exit(1); } if (write(fd, blockptr, blocksize) != (starpu_ssize_t) blocksize) { fprintf(stderr,"short write"); exit(1); } if (close(fd) < 0) { perror("close"); exit(1); } } } free(blockptr); free(filename); } static void init_matrix(int rank) { /* Allocate a grid of data handles, not all of them have to be allocated later on */ dataA_handles = calloc(nblocks*nblocks, sizeof(starpu_data_handle_t)); size_t blocksize = (size_t)(size/nblocks)*(size/nblocks)*sizeof(TYPE); int disk_node = starpu_disk_register(&starpu_disk_unistd_ops, path, STARPU_MAX(1024*1024, size*size*sizeof(TYPE))); char filename[sizeof(nblocks)*3 + 1 + sizeof(nblocks)*3 + 1]; /* Allocate all the blocks that belong to this mpi node */ unsigned i,j; for (j = 0; j < nblocks; j++) { for (i = 0; i < nblocks; i++) { int block_rank = get_block_rank(i, j); // starpu_data_handle_t *handleptr = &dataA_handles[j+nblocks*i]; starpu_data_handle_t *handleptr = &dataA_handles[j+nblocks*i]; if (block_rank == rank) { void *disk_obj; snprintf(filename, sizeof(filename), "%u,%u", i, j); /* Register it to StarPU */ disk_obj = starpu_disk_open(disk_node, filename, blocksize); if (!disk_obj) { fprintf(stderr,"could not open %s\n", filename); exit(1); } starpu_matrix_data_register(handleptr, disk_node, (uintptr_t) disk_obj, size/nblocks, size/nblocks, size/nblocks, sizeof(TYPE)); } else { starpu_matrix_data_register(handleptr, -1, 0, size/nblocks, size/nblocks, size/nblocks, sizeof(TYPE)); } starpu_data_set_coordinates(*handleptr, 2, j, i); starpu_mpi_data_register(*handleptr, j+i*nblocks, block_rank); } } //display_all_blocks(nblocks, size/nblocks); } TYPE *STARPU_PLU(get_block)(unsigned i, unsigned j) { /* This does not really make sense in out of core */ assert(0); } int get_block_rank(unsigned i, unsigned j) { /* Take a 2D block cyclic distribution */ /* NB: p (resp. q) is for "direction" i (resp. j) */ return (j % q) * p + (i % p); } starpu_data_handle_t STARPU_PLU(get_block_handle)(unsigned i, unsigned j) { return dataA_handles[j+i*nblocks]; } int main(int argc, char **argv) { int rank; int world_size; int ret; unsigned i, j; starpu_srand48((long int)time(NULL)); parse_args(argc, argv); ret = mkdir(path, 0777); if (ret != 0 && errno != EEXIST) { fprintf(stderr,"%s does not exist\n", path); exit(1); } ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(&argc, &argv, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &world_size); STARPU_ASSERT(p*q == world_size); starpu_cublas_init(); /* * Problem Init */ if (rank == 0) create_matrix(); starpu_mpi_barrier(MPI_COMM_WORLD); init_matrix(rank); if (rank == 0) fprintf(stderr, "%dMB on disk\n", (int)(allocated_memory/(1024*1024))); TYPE *a_r = NULL; // STARPU_PLU(display_data_content)(a_r, size); if (check) { TYPE *x, *y; x = calloc(size, sizeof(TYPE)); STARPU_ASSERT(x); y = calloc(size, sizeof(TYPE)); STARPU_ASSERT(y); if (rank == 0) { unsigned ind; for (ind = 0; ind < size; ind++) x[ind] = (TYPE)starpu_drand48(); } a_r = STARPU_PLU(reconstruct_matrix)(size, nblocks); if (rank == 0) STARPU_PLU(display_data_content)(a_r, size); // STARPU_PLU(compute_ax)(size, x, y, nblocks, rank); free(x); free(y); } double timing = STARPU_PLU(plu_main)(nblocks, rank, world_size); /* * Report performance */ if (rank == 0) { fprintf(stderr, "Computation took: %f ms\n", timing/1000); unsigned n = size; double flop = (2.0f*n*n*n)/3.0f; fprintf(stderr, "Synthetic GFlops : %2.2f\n", (flop/timing/1000.0f)); } /* * Test Result Correctness */ if (check) { /* * Compute || A - LU || */ STARPU_PLU(compute_lu_matrix)(size, nblocks, a_r); #if 0 /* * Compute || Ax - LUx || */ unsigned ind; y2 = calloc(size, sizeof(TYPE)); STARPU_ASSERT(y); if (rank == 0) { for (ind = 0; ind < size; ind++) { y2[ind] = (TYPE)0.0; } } STARPU_PLU(compute_lux)(size, x, y2, nblocks, rank); /* Compute y2 = y2 - y */ CPU_AXPY(size, -1.0, y, 1, y2, 1); TYPE err = CPU_ASUM(size, y2, 1); int max = CPU_IAMAX(size, y2, 1); fprintf(stderr, "(A - LU)X Avg error : %e\n", err/(size*size)); fprintf(stderr, "(A - LU)X Max error : %e\n", y2[max]); #endif } /* * Termination */ for (j = 0; j < nblocks; j++) { for (i = 0; i < nblocks; i++) { starpu_data_unregister(dataA_handles[j+nblocks*i]); } } starpu_cublas_shutdown(); starpu_mpi_shutdown(); starpu_shutdown(); return 0; } starpu-1.2.3+dfsg/mpi/examples/mpi_lu/plu_outofcore_example_double.c000066400000000000000000000013551320135501600257400ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2013 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "mpi_lu-double.h" #include "plu_outofcore_example.c" starpu-1.2.3+dfsg/mpi/examples/mpi_lu/plu_outofcore_example_float.c000066400000000000000000000013541320135501600255720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2013 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "mpi_lu-float.h" #include "plu_outofcore_example.c" starpu-1.2.3+dfsg/mpi/examples/mpi_lu/plu_solve.c000066400000000000000000000233401320135501600220140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2014 Université de Bordeaux * Copyright (C) 2010, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "pxlu.h" /* * Various useful functions */ static double frobenius_norm(TYPE *v, unsigned n) { double sum2 = 0.0; /* compute sqrt(Sum(|x|^2)) */ unsigned i,j; for (j = 0; j < n; j++) for (i = 0; i < n; i++) { double a = fabsl((double)v[i+n*j]); sum2 += a*a; } return sqrt(sum2); } void STARPU_PLU(display_data_content)(TYPE *data, unsigned blocksize) { if (!STARPU_PLU(display_flag)()) return; fprintf(stderr, "DISPLAY BLOCK\n"); unsigned i, j; for (j = 0; j < blocksize; j++) { for (i = 0; i < blocksize; i++) { fprintf(stderr, "%f ", data[j+i*blocksize]); } fprintf(stderr, "\n"); } fprintf(stderr, "****\n"); } void STARPU_PLU(extract_upper)(unsigned block_size, TYPE *inblock, TYPE *outblock) { unsigned li, lj; for (lj = 0; lj < block_size; lj++) { /* Upper block diag is 1 */ outblock[lj*(block_size + 1)] = (TYPE)1.0; for (li = lj + 1; li < block_size; li++) { outblock[lj + li*block_size] = inblock[lj + li*block_size]; } } } void STARPU_PLU(extract_lower)(unsigned block_size, TYPE *inblock, TYPE *outblock) { unsigned li, lj; for (lj = 0; lj < block_size; lj++) { for (li = 0; li <= lj; li++) { outblock[lj + li*block_size] = inblock[lj + li*block_size]; } } } /* * Compute Ax = y */ static void STARPU_PLU(compute_ax_block)(unsigned block_size, TYPE *block_data, TYPE *sub_x, TYPE *sub_y) { fprintf(stderr, "block data %p sub x %p sub y %p\n", block_data, sub_x, sub_y); CPU_GEMV("N", block_size, block_size, 1.0, block_data, block_size, sub_x, 1, 1.0, sub_y, 1); } static void STARPU_PLU(compute_ax_block_upper)(unsigned size, unsigned nblocks, TYPE *block_data, TYPE *sub_x, TYPE *sub_y) { unsigned block_size = size/nblocks; /* Take a copy of the upper part of the diagonal block */ TYPE *upper_block_copy = calloc((block_size)*(block_size), sizeof(TYPE)); STARPU_PLU(extract_upper)(block_size, block_data, upper_block_copy); STARPU_PLU(compute_ax_block)(block_size, upper_block_copy, sub_x, sub_y); free(upper_block_copy); } static void STARPU_PLU(compute_ax_block_lower)(unsigned size, unsigned nblocks, TYPE *block_data, TYPE *sub_x, TYPE *sub_y) { unsigned block_size = size/nblocks; /* Take a copy of the upper part of the diagonal block */ TYPE *lower_block_copy = calloc((block_size)*(block_size), sizeof(TYPE)); STARPU_PLU(extract_lower)(block_size, block_data, lower_block_copy); STARPU_PLU(compute_ax_block)(size/nblocks, lower_block_copy, sub_x, sub_y); free(lower_block_copy); } void STARPU_PLU(compute_lux)(unsigned size, TYPE *x, TYPE *y, unsigned nblocks, int rank) { /* Create temporary buffers where all MPI processes are going to * compute Ui x = yi where Ai is the matrix containing the blocks of U * affected to process i, and 0 everywhere else. We then have y as the * sum of all yi. */ TYPE *yi = calloc(size, sizeof(TYPE)); fprintf(stderr, "Compute LU\n"); unsigned block_size = size/nblocks; /* Compute UiX = Yi */ unsigned long i,j; for (j = 0; j < nblocks; j++) { if (get_block_rank(j, j) == rank) { TYPE *block_data = STARPU_PLU(get_block)(j, j); TYPE *sub_x = &x[j*(block_size)]; TYPE *sub_yi = &yi[j*(block_size)]; STARPU_PLU(compute_ax_block_upper)(size, nblocks, block_data, sub_x, sub_yi); } for (i = j + 1; i < nblocks; i++) { if (get_block_rank(i, j) == rank) { /* That block belongs to the current MPI process */ TYPE *block_data = STARPU_PLU(get_block)(i, j); TYPE *sub_x = &x[i*(block_size)]; TYPE *sub_yi = &yi[j*(block_size)]; STARPU_PLU(compute_ax_block)(size/nblocks, block_data, sub_x, sub_yi); } } } /* Grab Sum Yi in X */ MPI_Reduce(yi, x, size, MPI_TYPE, MPI_SUM, 0, MPI_COMM_WORLD); memset(yi, 0, size*sizeof(TYPE)); // unsigned ind; // if (rank == 0) // { // fprintf(stderr, "INTERMEDIATE\n"); // for (ind = 0; ind < STARPU_MIN(10, size); ind++) // { // fprintf(stderr, "x[%d] = %f\n", ind, (float)x[ind]); // } // fprintf(stderr, "****\n"); // } /* Everyone needs x */ int bcst_ret; bcst_ret = MPI_Bcast(&x, size, MPI_TYPE, 0, MPI_COMM_WORLD); STARPU_ASSERT(bcst_ret == MPI_SUCCESS); /* Compute LiX = Yi (with X = UX) */ for (j = 0; j < nblocks; j++) { if (j > 0) for (i = 0; i < j; i++) { if (get_block_rank(i, j) == rank) { /* That block belongs to the current MPI process */ TYPE *block_data = STARPU_PLU(get_block)(i, j); TYPE *sub_x = &x[i*(block_size)]; TYPE *sub_yi = &yi[j*(block_size)]; STARPU_PLU(compute_ax_block)(size/nblocks, block_data, sub_x, sub_yi); } } if (get_block_rank(j, j) == rank) { TYPE *block_data = STARPU_PLU(get_block)(j, j); TYPE *sub_x = &x[j*(block_size)]; TYPE *sub_yi = &yi[j*(block_size)]; STARPU_PLU(compute_ax_block_lower)(size, nblocks, block_data, sub_x, sub_yi); } } /* Grab Sum Yi in Y */ MPI_Reduce(yi, y, size, MPI_TYPE, MPI_SUM, 0, MPI_COMM_WORLD); free(yi); } /* * Allocate a contiguous matrix on node 0 and fill it with the whole * content of the matrix distributed accross all nodes. */ TYPE *STARPU_PLU(reconstruct_matrix)(unsigned size, unsigned nblocks) { // fprintf(stderr, "RECONSTRUCT MATRIX size %d nblocks %d\n", size, nblocks); TYPE *bigmatrix = calloc(size*size, sizeof(TYPE)); unsigned block_size = size/nblocks; int rank; starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); unsigned bi, bj; for (bj = 0; bj < nblocks; bj++) for (bi = 0; bi < nblocks; bi++) { TYPE *block = NULL; int block_rank = get_block_rank(bi, bj); if (block_rank == 0) { block = STARPU_PLU(get_block)(bi, bj); } else { MPI_Status status; if (rank == 0) { block = calloc(block_size*block_size, sizeof(TYPE)); int ret = MPI_Recv(block, block_size*block_size, MPI_TYPE, block_rank, 0, MPI_COMM_WORLD, &status); STARPU_ASSERT(ret == MPI_SUCCESS); } else if (rank == block_rank) { block = STARPU_PLU(get_block)(bi, bj); int ret = MPI_Send(block, block_size*block_size, MPI_TYPE, 0, 0, MPI_COMM_WORLD); STARPU_ASSERT(ret == MPI_SUCCESS); } } if (rank == 0) { unsigned j, i; for (j = 0; j < block_size; j++) for (i = 0; i < block_size; i++) { bigmatrix[(j + bj*block_size)+(i+bi*block_size)*size] = block[j+i*block_size]; } if (get_block_rank(bi, bj) != 0) free(block); } } return bigmatrix; } /* x and y must be valid (at least) on 0 */ void STARPU_PLU(compute_ax)(unsigned size, TYPE *x, TYPE *y, unsigned nblocks, int rank) { unsigned block_size = size/nblocks; /* Send x to everyone */ int bcst_ret; bcst_ret = MPI_Bcast(&x, size, MPI_TYPE, 0, MPI_COMM_WORLD); STARPU_ASSERT(bcst_ret == MPI_SUCCESS); /* Create temporary buffers where all MPI processes are going to * compute Ai x = yi where Ai is the matrix containing the blocks of A * affected to process i, and 0 everywhere else. We then have y as the * sum of all yi. */ TYPE *yi = calloc(size, sizeof(TYPE)); /* Compute Aix = yi */ unsigned long i,j; for (j = 0; j < nblocks; j++) { for (i = 0; i < nblocks; i++) { if (get_block_rank(i, j) == rank) { /* That block belongs to the current MPI process */ TYPE *block_data = STARPU_PLU(get_block)(i, j); TYPE *sub_x = &x[i*block_size]; TYPE *sub_yi = &yi[j*block_size]; STARPU_PLU(compute_ax_block)(block_size, block_data, sub_x, sub_yi); } } } /* Compute the Sum of all yi = y */ MPI_Reduce(yi, y, size, MPI_TYPE, MPI_SUM, 0, MPI_COMM_WORLD); fprintf(stderr, "RANK %d - FOO 1 y[0] %f\n", rank, y[0]); free(yi); } void STARPU_PLU(compute_lu_matrix)(unsigned size, unsigned nblocks, TYPE *Asaved) { TYPE *all_r = STARPU_PLU(reconstruct_matrix)(size, nblocks); unsigned display = STARPU_PLU(display_flag)(); int rank; starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); if (rank == 0) { TYPE *L = malloc((size_t)size*size*sizeof(TYPE)); TYPE *U = malloc((size_t)size*size*sizeof(TYPE)); memset(L, 0, size*size*sizeof(TYPE)); memset(U, 0, size*size*sizeof(TYPE)); /* only keep the lower part */ unsigned i, j; for (j = 0; j < size; j++) { for (i = 0; i < j; i++) { L[j+i*size] = all_r[j+i*size]; } /* diag i = j */ L[j+j*size] = all_r[j+j*size]; U[j+j*size] = 1.0; for (i = j+1; i < size; i++) { U[j+i*size] = all_r[j+i*size]; } } STARPU_PLU(display_data_content)(L, size); STARPU_PLU(display_data_content)(U, size); /* now A_err = L, compute L*U */ CPU_TRMM("R", "U", "N", "U", size, size, 1.0f, U, size, L, size); if (display) fprintf(stderr, "\nLU\n"); STARPU_PLU(display_data_content)(L, size); /* compute "LU - A" in L*/ CPU_AXPY(size*size, -1.0, Asaved, 1, L, 1); TYPE err = CPU_ASUM(size*size, L, 1); int max = CPU_IAMAX(size*size, L, 1); if (display) fprintf(stderr, "DISPLAY ERROR\n"); STARPU_PLU(display_data_content)(L, size); fprintf(stderr, "(A - LU) Avg error : %e\n", err/(size*size)); fprintf(stderr, "(A - LU) Max error : %e\n", L[max]); double residual = frobenius_norm(L, size); double matnorm = frobenius_norm(Asaved, size); fprintf(stderr, "||A-LU|| / (||A||*N) : %e\n", residual/(matnorm*size)); } free(all_r); } starpu-1.2.3+dfsg/mpi/examples/mpi_lu/plu_solve_double.c000066400000000000000000000013331320135501600233440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "mpi_lu-double.h" #include "plu_solve.c" starpu-1.2.3+dfsg/mpi/examples/mpi_lu/plu_solve_float.c000066400000000000000000000013321320135501600231760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "mpi_lu-float.h" #include "plu_solve.c" starpu-1.2.3+dfsg/mpi/examples/mpi_lu/pslu.c000066400000000000000000000013251320135501600207660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "mpi_lu-float.h" #include "pxlu.c" starpu-1.2.3+dfsg/mpi/examples/mpi_lu/pslu_implicit.c000066400000000000000000000013441320135501600226610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2013 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "mpi_lu-float.h" #include "pxlu_implicit.c" starpu-1.2.3+dfsg/mpi/examples/mpi_lu/pslu_kernels.c000066400000000000000000000013351320135501600225120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "mpi_lu-float.h" #include "pxlu_kernels.c" starpu-1.2.3+dfsg/mpi/examples/mpi_lu/pxlu.c000066400000000000000000000522151320135501600207770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2014, 2017 Université de Bordeaux * Copyright (C) 2010, 2012, 2013, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "pxlu.h" #include "pxlu_kernels.h" #include #define MPI_TAG11(k) ((1U << 16) | (k)) #define MPI_TAG12(k, j) ((2U << 16) | (k)<<8 | (j)) #define MPI_TAG21(k, i) ((3U << 16) | (i)<<8 | (k)) // 11 21 // 12 22 #define TAG11(k) ((starpu_tag_t)( (1ULL<<50) | (unsigned long long)(k))) #define TAG12(k,j) ((starpu_tag_t)(((2ULL<<50) | (((unsigned long long)(k))<<32) \ | (unsigned long long)(j)))) #define TAG21(k,i) ((starpu_tag_t)(((3ULL<<50) | (((unsigned long long)(k))<<32) \ | (unsigned long long)(i)))) #define TAG22(k,i,j) ((starpu_tag_t)(((4ULL<<50) | ((unsigned long long)(k)<<32) \ | ((unsigned long long)(i)<<16) \ | (unsigned long long)(j)))) #define TAG11_SAVE(k) ((starpu_tag_t)( (5ULL<<50) | (unsigned long long)(k))) #define TAG12_SAVE(k,j) ((starpu_tag_t)(((6ULL<<50) | (((unsigned long long)(k))<<32) \ | (unsigned long long)(j)))) #define TAG21_SAVE(k,i) ((starpu_tag_t)(((7ULL<<50) | (((unsigned long long)(k))<<32) \ | (unsigned long long)(i)))) #define TAG11_SAVE_PARTIAL(k) ((starpu_tag_t)( (8ULL<<50) | (unsigned long long)(k))) #define TAG12_SAVE_PARTIAL(k,j) ((starpu_tag_t)(((9ULL<<50) | (((unsigned long long)(k))<<32) \ | (unsigned long long)(j)))) #define TAG21_SAVE_PARTIAL(k,i) ((starpu_tag_t)(((10ULL<<50) | (((unsigned long long)(k))<<32) \ | (unsigned long long)(i)))) #define STARPU_TAG_INIT ((starpu_tag_t)(11ULL<<50)) //#define VERBOSE_INIT 1 //#define DEBUG 1 static unsigned no_prio = 0; static unsigned nblocks = 0; static int rank = -1; static int world_size = -1; struct callback_arg { unsigned i, j, k; }; /* * Various */ static struct debug_info *create_debug_info(unsigned i, unsigned j, unsigned k) { struct debug_info *info = malloc(sizeof(struct debug_info)); info->i = i; info->j = j; info->k = k; return info; } static struct starpu_task *create_task(starpu_tag_t id) { struct starpu_task *task = starpu_task_create(); task->cl_arg = NULL; task->use_tag = 1; task->tag_id = id; return task; } /* Send handle to every node appearing in the mask, and unlock tag once the * transfers are done. */ static void send_data_to_mask(starpu_data_handle_t handle, int *rank_mask, int mpi_tag, starpu_tag_t tag) { unsigned cnt = 0; STARPU_ASSERT(handle != STARPU_POISON_PTR); int rank_array[world_size]; MPI_Comm comm_array[world_size]; int mpi_tag_array[world_size]; starpu_data_handle_t handle_array[world_size]; int r; for (r = 0; r < world_size; r++) { if (rank_mask[r]) { rank_array[cnt] = r; comm_array[cnt] = MPI_COMM_WORLD; mpi_tag_array[cnt] = mpi_tag; handle_array[cnt] = handle; cnt++; } } if (cnt == 0) { /* In case there is no message to send, we release the tag at * once */ starpu_tag_notify_from_apps(tag); } else { starpu_mpi_isend_array_detached_unlock_tag(cnt, handle_array, rank_array, mpi_tag_array, comm_array, tag); } } /* Initiate a receive request once all dependencies are fulfilled and unlock * tag 'unlocked_tag' once it's done. */ struct recv_when_done_callback_arg { int source; int mpi_tag; starpu_data_handle_t handle; starpu_tag_t unlocked_tag; }; static void callback_receive_when_done(void *_arg) { struct recv_when_done_callback_arg *arg = _arg; starpu_mpi_irecv_detached_unlock_tag(arg->handle, arg->source, arg->mpi_tag, MPI_COMM_WORLD, arg->unlocked_tag); free(arg); } static void receive_when_deps_are_done(unsigned ndeps, starpu_tag_t *deps_tags, int source, int mpi_tag, starpu_data_handle_t handle, starpu_tag_t partial_tag, starpu_tag_t unlocked_tag) { STARPU_ASSERT(handle != STARPU_POISON_PTR); struct recv_when_done_callback_arg *arg = malloc(sizeof(struct recv_when_done_callback_arg)); arg->source = source; arg->mpi_tag = mpi_tag; arg->handle = handle; arg->unlocked_tag = unlocked_tag; if (ndeps == 0) { callback_receive_when_done(arg); return; } starpu_create_sync_task(partial_tag, ndeps, deps_tags, callback_receive_when_done, arg); } /* * Task 11 (diagonal factorization) */ static void create_task_11_recv(unsigned k) { /* The current node is not computing that task, so we receive the block * with MPI */ /* We don't issue a MPI receive request until everyone using the * temporary buffer is done : 11_(k-1) can be used by 12_(k-1)j and * 21(k-1)i with i,j >= k */ unsigned ndeps = 0; starpu_tag_t tag_array[2*nblocks]; #ifdef SINGLE_TMP11 unsigned i, j; if (k > 0) for (i = (k-1)+1; i < nblocks; i++) { if (rank == get_block_rank(i, k-1)) tag_array[ndeps++] = TAG21(k-1, i); } if (k > 0) for (j = (k-1)+1; j < nblocks; j++) { if (rank == get_block_rank(k-1, j)) tag_array[ndeps++] = TAG12(k-1, j); } #endif int source = get_block_rank(k, k); #ifdef SINGLE_TMP11 starpu_data_handle_t block_handle = STARPU_PLU(get_tmp_11_block_handle)(); #else starpu_data_handle_t block_handle = STARPU_PLU(get_tmp_11_block_handle)(k); #endif int mpi_tag = MPI_TAG11(k); starpu_tag_t partial_tag = TAG11_SAVE_PARTIAL(k); starpu_tag_t unlocked_tag = TAG11_SAVE(k); // fprintf(stderr, "NODE %d - 11 (%d) - recv when done ndeps %d - tag array %lx\n", rank, k, ndeps, tag_array[0]); receive_when_deps_are_done(ndeps, tag_array, source, mpi_tag, block_handle, partial_tag, unlocked_tag); } static void find_nodes_using_11(unsigned k, int *rank_mask) { memset(rank_mask, 0, world_size*sizeof(int)); /* Block 11_k is used to compute 12_kj + 12ki with i,j > k */ unsigned i; for (i = k+1; i < nblocks; i++) { int r = get_block_rank(i, k); rank_mask[r] = 1; } unsigned j; for (j = k+1; j < nblocks; j++) { int r = get_block_rank(k, j); rank_mask[r] = 1; } } static void callback_task_11_real(void *_arg) { struct callback_arg *arg = _arg; unsigned k = arg->k; /* Find all the nodes potentially requiring this block */ int rank_mask[world_size]; find_nodes_using_11(k, rank_mask); rank_mask[rank] = 0; /* Send the block to those nodes */ starpu_data_handle_t block_handle = STARPU_PLU(get_block_handle)(k, k); starpu_tag_t tag = TAG11_SAVE(k); int mpi_tag = MPI_TAG11(k); send_data_to_mask(block_handle, rank_mask, mpi_tag, tag); free(arg); } static void create_task_11_real(unsigned k) { struct starpu_task *task = create_task(TAG11(k)); task->cl = &STARPU_PLU(cl11); task->cl_arg = create_debug_info(k, k, k); /* which sub-data is manipulated ? */ task->handles[0] = STARPU_PLU(get_block_handle)(k, k); struct callback_arg *arg = malloc(sizeof(struct callback_arg)); arg->k = k; task->callback_func = callback_task_11_real; task->callback_arg = arg; /* this is an important task */ if (!no_prio) task->priority = STARPU_MAX_PRIO; /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG11(k), 1, TAG22(k-1, k, k)); } else { starpu_tag_declare_deps(TAG11(k), 1, STARPU_TAG_INIT); } int ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } static void create_task_11(unsigned k) { if (get_block_rank(k, k) == rank) { #ifdef VERBOSE_INIT fprintf(stderr, "CREATE real task 11(%u) (TAG11_SAVE(%u) = %llux) on node %d\n", k, k, TAG11_SAVE(k), rank); #endif create_task_11_real(k); } else { /* We don't handle the task, but perhaps we have to generate MPI transfers. */ int rank_mask[world_size]; find_nodes_using_11(k, rank_mask); if (rank_mask[rank]) { #ifdef VERBOSE_INIT fprintf(stderr, "create RECV task 11(%u) on node %d\n", k, rank); #endif create_task_11_recv(k); } else { #ifdef VERBOSE_INIT fprintf(stderr, "Node %d needs not 11(%u)\n", rank, k); #endif } } } /* * Task 12 (Update lower left (TRSM)) */ static void create_task_12_recv(unsigned k, unsigned j) { unsigned i; /* The current node is not computing that task, so we receive the block * with MPI */ /* We don't issue a MPI receive request until everyone using the * temporary buffer is done : 12_(k-1)j can be used by 22_(k-1)ij with * i >= k */ unsigned ndeps = 0; starpu_tag_t tag_array[nblocks]; #ifdef SINGLE_TMP1221 if (k > 0) for (i = (k-1)+1; i < nblocks; i++) #else if (k > 1) for (i = (k-2)+1; i < nblocks; i++) #endif { if (rank == get_block_rank(i, j)) #ifdef SINGLE_TMP1221 tag_array[ndeps++] = TAG22(k-1, i, j); #else tag_array[ndeps++] = TAG22(k-2, i, j); #endif } int source = get_block_rank(k, j); #ifdef SINGLE_TMP1221 starpu_data_handle_t block_handle = STARPU_PLU(get_tmp_12_block_handle)(j); #else starpu_data_handle_t block_handle = STARPU_PLU(get_tmp_12_block_handle)(j,k); #endif int mpi_tag = MPI_TAG12(k, j); starpu_tag_t partial_tag = TAG12_SAVE_PARTIAL(k, j); starpu_tag_t unlocked_tag = TAG12_SAVE(k, j); receive_when_deps_are_done(ndeps, tag_array, source, mpi_tag, block_handle, partial_tag, unlocked_tag); } static void find_nodes_using_12(unsigned k, unsigned j, int *rank_mask) { memset(rank_mask, 0, world_size*sizeof(int)); /* Block 12_kj is used to compute 22_kij with i > k */ unsigned i; for (i = k+1; i < nblocks; i++) { int r = get_block_rank(i, j); rank_mask[r] = 1; } } static void callback_task_12_real(void *_arg) { struct callback_arg *arg = _arg; unsigned k = arg->k; unsigned j = arg->j; /* Find all the nodes potentially requiring this block */ int rank_mask[world_size]; find_nodes_using_12(k, j, rank_mask); rank_mask[rank] = 0; /* Send the block to those nodes */ starpu_data_handle_t block_handle = STARPU_PLU(get_block_handle)(k, j); starpu_tag_t tag = TAG12_SAVE(k, j); int mpi_tag = MPI_TAG12(k, j); send_data_to_mask(block_handle, rank_mask, mpi_tag, tag); free(arg); } static void create_task_12_real(unsigned k, unsigned j) { struct starpu_task *task = create_task(TAG12(k, j)); #ifdef STARPU_DEVEL #warning temporary fix :/ #endif // task->cl = &STARPU_PLU(cl12); task->cl = &STARPU_PLU(cl21); task->cl_arg = create_debug_info(j, j, k); unsigned diag_block_is_local = (get_block_rank(k, k) == rank); starpu_tag_t tag_11_dep; /* which sub-data is manipulated ? */ starpu_data_handle_t diag_block; if (diag_block_is_local) { diag_block = STARPU_PLU(get_block_handle)(k, k); tag_11_dep = TAG11(k); } else { #ifdef SINGLE_TMP11 diag_block = STARPU_PLU(get_tmp_11_block_handle)(); #else diag_block = STARPU_PLU(get_tmp_11_block_handle)(k); #endif tag_11_dep = TAG11_SAVE(k); } task->handles[0] = diag_block; task->handles[1] = STARPU_PLU(get_block_handle)(k, j); STARPU_ASSERT(get_block_rank(k, j) == rank); STARPU_ASSERT(task->handles[0] != STARPU_POISON_PTR); STARPU_ASSERT(task->handles[1] != STARPU_POISON_PTR); struct callback_arg *arg = malloc(sizeof(struct callback_arg)); arg->j = j; arg->k = k; task->callback_func = callback_task_12_real; task->callback_arg = arg; if (!no_prio && (j == k+1)) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG12(k, j), 2, tag_11_dep, TAG22(k-1, k, j)); } else { starpu_tag_declare_deps(TAG12(k, j), 1, tag_11_dep); } int ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } static void create_task_12(unsigned k, unsigned j) { if (get_block_rank(k, j) == rank) { #ifdef VERBOSE_INIT fprintf(stderr, "CREATE real task 12(k = %u, j = %u) on node %d\n", k, j, rank); #endif create_task_12_real(k, j); } else { /* We don't handle the task, but perhaps we have to generate MPI transfers. */ int rank_mask[world_size]; find_nodes_using_12(k, j, rank_mask); if (rank_mask[rank]) { #ifdef VERBOSE_INIT fprintf(stderr, "create RECV task 12(k = %u, j = %u) on node %d\n", k, j, rank); #endif create_task_12_recv(k, j); } else { #ifdef VERBOSE_INIT fprintf(stderr, "Node %d needs not 12(k=%u, i=%u)\n", rank, k, j); #endif } } } /* * Task 21 (Update upper right (TRSM)) */ static void create_task_21_recv(unsigned k, unsigned i) { unsigned j; /* The current node is not computing that task, so we receive the block * with MPI */ /* We don't issue a MPI receive request until everyone using the * temporary buffer is done : 21_(k-1)i can be used by 22_(k-1)ij with * j >= k */ unsigned ndeps = 0; starpu_tag_t tag_array[nblocks]; #ifdef SINGLE_TMP1221 if (k > 0) for (j = (k-1)+1; j < nblocks; j++) #else if (k > 1) for (j = (k-2)+1; j < nblocks; j++) #endif { if (rank == get_block_rank(i, j)) #ifdef SINGLE_TMP1221 tag_array[ndeps++] = TAG22(k-1, i, j); #else tag_array[ndeps++] = TAG22(k-2, i, j); #endif } int source = get_block_rank(i, k); #ifdef SINGLE_TMP1221 starpu_data_handle_t block_handle = STARPU_PLU(get_tmp_21_block_handle)(i); #else starpu_data_handle_t block_handle = STARPU_PLU(get_tmp_21_block_handle)(i, k); #endif int mpi_tag = MPI_TAG21(k, i); starpu_tag_t partial_tag = TAG21_SAVE_PARTIAL(k, i); starpu_tag_t unlocked_tag = TAG21_SAVE(k, i); // fprintf(stderr, "NODE %d - 21 (%d, %d) - recv when done ndeps %d - tag array %lx\n", rank, k, i, ndeps, tag_array[0]); receive_when_deps_are_done(ndeps, tag_array, source, mpi_tag, block_handle, partial_tag, unlocked_tag); } static void find_nodes_using_21(unsigned k, unsigned i, int *rank_mask) { memset(rank_mask, 0, world_size*sizeof(int)); /* Block 21_ki is used to compute 22_kij with j > k */ unsigned j; for (j = k+1; j < nblocks; j++) { int r = get_block_rank(i, j); rank_mask[r] = 1; } } static void callback_task_21_real(void *_arg) { struct callback_arg *arg = _arg; unsigned k = arg->k; unsigned i = arg->i; /* Find all the nodes potentially requiring this block */ int rank_mask[world_size]; find_nodes_using_21(k, i, rank_mask); rank_mask[rank] = 0; /* Send the block to those nodes */ starpu_data_handle_t block_handle = STARPU_PLU(get_block_handle)(i, k); starpu_tag_t tag = TAG21_SAVE(k, i); int mpi_tag = MPI_TAG21(k, i); send_data_to_mask(block_handle, rank_mask, mpi_tag, tag); free(arg); } static void create_task_21_real(unsigned k, unsigned i) { struct starpu_task *task = create_task(TAG21(k, i)); #ifdef STARPU_DEVEL #warning temporary fix #endif // task->cl = &STARPU_PLU(cl21); task->cl = &STARPU_PLU(cl12); task->cl_arg = create_debug_info(i, i, k); unsigned diag_block_is_local = (get_block_rank(k, k) == rank); starpu_tag_t tag_11_dep; /* which sub-data is manipulated ? */ starpu_data_handle_t diag_block; if (diag_block_is_local) { diag_block = STARPU_PLU(get_block_handle)(k, k); tag_11_dep = TAG11(k); } else { #ifdef SINGLE_TMP11 diag_block = STARPU_PLU(get_tmp_11_block_handle)(); #else diag_block = STARPU_PLU(get_tmp_11_block_handle)(k); #endif tag_11_dep = TAG11_SAVE(k); } task->handles[0] = diag_block; task->handles[1] = STARPU_PLU(get_block_handle)(i, k); STARPU_ASSERT(task->handles[0] != STARPU_POISON_PTR); STARPU_ASSERT(task->handles[1] != STARPU_POISON_PTR); struct callback_arg *arg = malloc(sizeof(struct callback_arg)); arg->i = i; arg->k = k; task->callback_func = callback_task_21_real; task->callback_arg = arg; if (!no_prio && (i == k+1)) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG21(k, i), 2, tag_11_dep, TAG22(k-1, i, k)); } else { starpu_tag_declare_deps(TAG21(k, i), 1, tag_11_dep); } int ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } static void create_task_21(unsigned k, unsigned i) { if (get_block_rank(i, k) == rank) { #ifdef VERBOSE_INIT fprintf(stderr, "CREATE real task 21(k = %u, i = %u) on node %d\n", k, i, rank); #endif create_task_21_real(k, i); } else { /* We don't handle the task, but perhaps we have to generate MPI transfers. */ int rank_mask[world_size]; find_nodes_using_21(k, i, rank_mask); if (rank_mask[rank]) { #ifdef VERBOSE_INIT fprintf(stderr, "create RECV task 21(k = %u, i = %u) on node %d\n", k, i, rank); #endif create_task_21_recv(k, i); } else { #ifdef VERBOSE_INIT fprintf(stderr, "Node %d needs not 21(k=%u, i=%u)\n", rank, k,i); #endif } } } /* * Task 22 (GEMM) */ static void create_task_22_real(unsigned k, unsigned i, unsigned j) { // printf("task 22 k,i,j = %d,%d,%d TAG = %llx\n", k,i,j, TAG22(k,i,j)); struct starpu_task *task = create_task(TAG22(k, i, j)); task->cl = &STARPU_PLU(cl22); task->cl_arg = create_debug_info(i, j, k); /* which sub-data is manipulated ? */ /* produced by TAG21_SAVE(k, i) */ unsigned block21_is_local = (get_block_rank(i, k) == rank); starpu_tag_t tag_21_dep; starpu_data_handle_t block21; if (block21_is_local) { block21 = STARPU_PLU(get_block_handle)(i, k); tag_21_dep = TAG21(k, i); } else { #ifdef SINGLE_TMP1221 block21 = STARPU_PLU(get_tmp_21_block_handle)(i); #else block21 = STARPU_PLU(get_tmp_21_block_handle)(i, k); #endif tag_21_dep = TAG21_SAVE(k, i); } /* produced by TAG12_SAVE(k, j) */ unsigned block12_is_local = (get_block_rank(k, j) == rank); starpu_tag_t tag_12_dep; starpu_data_handle_t block12; if (block12_is_local) { // block12 = STARPU_PLU(get_block_handle)(j, k); block12 = STARPU_PLU(get_block_handle)(k, j); tag_12_dep = TAG12(k, j); } else { #ifdef SINGLE_TMP1221 block12 = STARPU_PLU(get_tmp_12_block_handle)(j); #else block12 = STARPU_PLU(get_tmp_12_block_handle)(j, k); #endif tag_12_dep = TAG12_SAVE(k, j); } #ifdef STARPU_DEVEL #warning temporary fix :/ #endif //task->handles[0] = block21; task->handles[0] = block12; //task->handles[1] = block12; task->handles[1] = block21; /* produced by TAG22(k-1, i, j) */ task->handles[2] = STARPU_PLU(get_block_handle)(i, j); STARPU_ASSERT(task->handles[0] != STARPU_POISON_PTR); STARPU_ASSERT(task->handles[1] != STARPU_POISON_PTR); STARPU_ASSERT(task->handles[2] != STARPU_POISON_PTR); if (!no_prio && (i == k + 1) && (j == k +1) ) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG22(k, i, j), 3, TAG22(k-1, i, j), tag_12_dep, tag_21_dep); } else { starpu_tag_declare_deps(TAG22(k, i, j), 2, tag_12_dep, tag_21_dep); } int ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } static void create_task_22(unsigned k, unsigned i, unsigned j) { if (get_block_rank(i, j) == rank) { // fprintf(stderr, "CREATE real task 22(k = %d, i = %d, j = %d) on node %d\n", k, i, j, rank); create_task_22_real(k, i, j); } // else // { // fprintf(stderr, "Node %d needs not 22(k=%d, i=%d, j = %d)\n", rank, k,i,j); // } } static void wait_tag_and_fetch_handle(starpu_tag_t tag, starpu_data_handle_t handle) { STARPU_ASSERT(handle != STARPU_POISON_PTR); starpu_tag_wait(tag); // fprintf(stderr, "Rank %d : tag %lx is done\n", rank, tag); starpu_data_acquire(handle, STARPU_R); // starpu_data_unregister(handle); } static void wait_termination(void) { unsigned k, i, j; for (k = 0; k < nblocks; k++) { /* Wait task 11k if needed */ if (get_block_rank(k, k) == rank) { starpu_data_handle_t diag_block = STARPU_PLU(get_block_handle)(k, k); wait_tag_and_fetch_handle(TAG11_SAVE(k), diag_block); } for (i = k + 1; i < nblocks; i++) { /* Wait task 21ki if needed */ if (get_block_rank(i, k) == rank) { starpu_data_handle_t block21 = STARPU_PLU(get_block_handle)(i, k); //starpu_data_handle_t block21 = STARPU_PLU(get_block_handle)(k, i); //fprintf(stderr, "BLOCK21 i %d k %d -> handle %p\n", i, k, block21); wait_tag_and_fetch_handle(TAG21_SAVE(k, i), block21); } } for (j = k + 1; j < nblocks; j++) { /* Wait task 12kj if needed */ if (get_block_rank(k, j) == rank) { //starpu_data_handle_t block12 = STARPU_PLU(get_block_handle)(j, k); starpu_data_handle_t block12 = STARPU_PLU(get_block_handle)(k, j); //fprintf(stderr, "BLOCK12 j %d k %d -> handle %p\n", j, k, block12); wait_tag_and_fetch_handle(TAG12_SAVE(k, j), block12); } } } } /* * code to bootstrap the factorization */ double STARPU_PLU(plu_main)(unsigned _nblocks, int _rank, int _world_size) { double start; double end; nblocks = _nblocks; rank = _rank; world_size = _world_size; /* create all the DAG nodes */ unsigned i,j,k; for (k = 0; k < nblocks; k++) { starpu_iteration_push(k); create_task_11(k); for (i = k+1; i took %f ms\n", rank, timing/1000); return timing; } starpu-1.2.3+dfsg/mpi/examples/mpi_lu/pxlu.h000066400000000000000000000043711320135501600210040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2014 Université de Bordeaux * Copyright (C) 2010, 2012, 2014, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __PXLU_H__ #define __PXLU_H__ #include #include #include #ifdef STARPU_USE_CUDA #include #endif #define BLAS3_FLOP(n1,n2,n3) \ (2*((uint64_t)n1)*((uint64_t)n2)*((uint64_t)n3)) //#define SINGLE_TMP11 1 //#define SINGLE_TMP1221 1 struct debug_info { unsigned i; unsigned j; unsigned k; }; double STARPU_PLU(plu_main)(unsigned nblocks, int rank, int world_size); TYPE *STARPU_PLU(reconstruct_matrix)(unsigned size, unsigned nblocks); void STARPU_PLU(compute_lu_matrix)(unsigned size, unsigned nblocks, TYPE *Asaved); unsigned STARPU_PLU(display_flag)(void); void STARPU_PLU(compute_ax)(unsigned size, TYPE *x, TYPE *y, unsigned nblocks, int rank); void STARPU_PLU(compute_lux)(unsigned size, TYPE *x, TYPE *y, unsigned nblocks, int rank); starpu_data_handle_t STARPU_PLU(get_block_handle)(unsigned i, unsigned j); TYPE *STARPU_PLU(get_block)(unsigned i, unsigned j); #ifdef SINGLE_TMP11 starpu_data_handle_t STARPU_PLU(get_tmp_11_block_handle)(void); #else starpu_data_handle_t STARPU_PLU(get_tmp_11_block_handle)(unsigned k); #endif #ifdef SINGLE_TMP1221 starpu_data_handle_t STARPU_PLU(get_tmp_12_block_handle)(unsigned j); starpu_data_handle_t STARPU_PLU(get_tmp_21_block_handle)(unsigned i); #else starpu_data_handle_t STARPU_PLU(get_tmp_12_block_handle)(unsigned j, unsigned k); starpu_data_handle_t STARPU_PLU(get_tmp_21_block_handle)(unsigned i, unsigned k); #endif void STARPU_PLU(display_data_content)(TYPE *data, unsigned blocksize); int get_block_rank(unsigned i, unsigned j); #endif // __PXLU_H__ starpu-1.2.3+dfsg/mpi/examples/mpi_lu/pxlu_implicit.c000066400000000000000000000110161320135501600226630ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013-2015, 2017 Université de Bordeaux * Copyright (C) 2010, 2012, 2013, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "pxlu.h" #include "pxlu_kernels.h" #include //#define VERBOSE_INIT 1 //#define DEBUG 1 static unsigned no_prio = 0; static unsigned nblocks = 0; static int rank = -1; static int world_size = -1; struct callback_arg { unsigned i, j, k; }; /* * Task 11 (diagonal factorization) */ static void create_task_11(unsigned k) { starpu_mpi_task_insert(MPI_COMM_WORLD, &STARPU_PLU(cl11), STARPU_VALUE, &k, sizeof(k), STARPU_VALUE, &k, sizeof(k), STARPU_VALUE, &k, sizeof(k), STARPU_RW, STARPU_PLU(get_block_handle)(k, k), STARPU_PRIORITY, !no_prio ? STARPU_MAX_PRIO : STARPU_MIN_PRIO, 0); } /* * Task 12 (Update lower left (TRSM)) */ static void create_task_12(unsigned k, unsigned j) { #ifdef STARPU_DEVEL #warning temporary fix #endif starpu_mpi_task_insert(MPI_COMM_WORLD, //&STARPU_PLU(cl12), &STARPU_PLU(cl21), STARPU_VALUE, &j, sizeof(j), STARPU_VALUE, &j, sizeof(j), STARPU_VALUE, &k, sizeof(k), STARPU_R, STARPU_PLU(get_block_handle)(k, k), STARPU_RW, STARPU_PLU(get_block_handle)(k, j), STARPU_PRIORITY, !no_prio && (j == k+1) ? STARPU_MAX_PRIO : STARPU_MIN_PRIO, 0); } /* * Task 21 (Update upper right (TRSM)) */ static void create_task_21(unsigned k, unsigned i) { #ifdef STARPU_DEVEL #warning temporary fix #endif starpu_mpi_task_insert(MPI_COMM_WORLD, //&STARPU_PLU(cl21), &STARPU_PLU(cl12), STARPU_VALUE, &i, sizeof(i), STARPU_VALUE, &i, sizeof(i), STARPU_VALUE, &k, sizeof(k), STARPU_R, STARPU_PLU(get_block_handle)(k, k), STARPU_RW, STARPU_PLU(get_block_handle)(i, k), STARPU_PRIORITY, !no_prio && (i == k+1) ? STARPU_MAX_PRIO : STARPU_MIN_PRIO, 0); } /* * Task 22 (GEMM) */ static void create_task_22(unsigned k, unsigned i, unsigned j) { starpu_mpi_task_insert(MPI_COMM_WORLD, &STARPU_PLU(cl22), STARPU_VALUE, &i, sizeof(i), STARPU_VALUE, &j, sizeof(j), STARPU_VALUE, &k, sizeof(k), STARPU_R, STARPU_PLU(get_block_handle)(k, j), STARPU_R, STARPU_PLU(get_block_handle)(i, k), STARPU_RW, STARPU_PLU(get_block_handle)(i, j), STARPU_PRIORITY, !no_prio && (i == k + 1) && (j == k +1) ? STARPU_MAX_PRIO : STARPU_MIN_PRIO, 0); } /* * code to bootstrap the factorization */ double STARPU_PLU(plu_main)(unsigned _nblocks, int _rank, int _world_size) { double start; double end; nblocks = _nblocks; rank = _rank; world_size = _world_size; /* create all the DAG nodes */ unsigned i,j,k; starpu_mpi_barrier(MPI_COMM_WORLD); start = starpu_timing_now(); for (k = 0; k < nblocks; k++) { starpu_iteration_push(k); create_task_11(k); for (i = k+1; i took %f ms\n", rank, timing/1000); return timing; } starpu-1.2.3+dfsg/mpi/examples/mpi_lu/pxlu_kernels.c000066400000000000000000000252341320135501600225230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012 Université de Bordeaux * Copyright (C) 2010, 2012, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "pxlu.h" #include "pxlu_kernels.h" #include ///#define VERBOSE_KERNELS 1 /* * U22 */ static inline void STARPU_PLU(common_u22)(void *descr[], int s, STARPU_ATTRIBUTE_UNUSED void *_args) { TYPE *right = (TYPE *)STARPU_MATRIX_GET_PTR(descr[0]); TYPE *left = (TYPE *)STARPU_MATRIX_GET_PTR(descr[1]); TYPE *center = (TYPE *)STARPU_MATRIX_GET_PTR(descr[2]); unsigned dx = STARPU_MATRIX_GET_NX(descr[2]); unsigned dy = STARPU_MATRIX_GET_NY(descr[2]); unsigned dz = STARPU_MATRIX_GET_NY(descr[0]); unsigned ld12 = STARPU_MATRIX_GET_LD(descr[0]); unsigned ld21 = STARPU_MATRIX_GET_LD(descr[1]); unsigned ld22 = STARPU_MATRIX_GET_LD(descr[2]); #ifdef VERBOSE_KERNELS struct debug_info *info = _args; int rank; starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); fprintf(stderr, "KERNEL 22 %d - k = %u i = %u j = %u\n", rank, info->k, info->i, info->j); #endif #ifdef STARPU_USE_CUDA cublasStatus status; cudaError_t cures; #endif switch (s) { case 0: CPU_GEMM("N", "N", dy, dx, dz, (TYPE)-1.0, right, ld21, left, ld12, (TYPE)1.0, center, ld22); break; #ifdef STARPU_USE_CUDA case 1: CUBLAS_GEMM('n', 'n', dx, dy, dz, (TYPE)-1.0, right, ld21, left, ld12, (TYPE)1.0f, center, ld22); status = cublasGetError(); if (STARPU_UNLIKELY(status != CUBLAS_STATUS_SUCCESS)) STARPU_CUBLAS_REPORT_ERROR(status); if (STARPU_UNLIKELY((cures = cudaStreamSynchronize(starpu_cuda_get_local_stream())) != cudaSuccess)) STARPU_CUDA_REPORT_ERROR(cures); break; #endif default: STARPU_ABORT(); break; } #ifdef VERBOSE_KERNELS fprintf(stderr, "KERNEL 22 %d - k = %u i = %u j = %u done\n", rank, info->k, info->i, info->j); #endif } static void STARPU_PLU(cpu_u22)(void *descr[], void *_args) { STARPU_PLU(common_u22)(descr, 0, _args); } #ifdef STARPU_USE_CUDA static void STARPU_PLU(cublas_u22)(void *descr[], void *_args) { STARPU_PLU(common_u22)(descr, 1, _args); } #endif// STARPU_USE_CUDA static struct starpu_perfmodel STARPU_PLU(model_22) = { .type = STARPU_HISTORY_BASED, #ifdef STARPU_ATLAS .symbol = STARPU_PLU_STR(lu_model_22_atlas) #elif defined(STARPU_GOTO) .symbol = STARPU_PLU_STR(lu_model_22_goto) #else .symbol = STARPU_PLU_STR(lu_model_22) #endif }; struct starpu_codelet STARPU_PLU(cl22) = { .where = STARPU_CPU|STARPU_CUDA, .cpu_funcs = {STARPU_PLU(cpu_u22)}, #ifdef STARPU_USE_CUDA .cuda_funcs = {STARPU_PLU(cublas_u22)}, #endif .nbuffers = 3, .modes = {STARPU_R, STARPU_R, STARPU_RW}, .model = &STARPU_PLU(model_22) }; /* * U12 */ static inline void STARPU_PLU(common_u12)(void *descr[], int s, STARPU_ATTRIBUTE_UNUSED void *_args) { TYPE *sub11; TYPE *sub12; sub11 = (TYPE *)STARPU_MATRIX_GET_PTR(descr[0]); sub12 = (TYPE *)STARPU_MATRIX_GET_PTR(descr[1]); unsigned ld11 = STARPU_MATRIX_GET_LD(descr[0]); unsigned ld12 = STARPU_MATRIX_GET_LD(descr[1]); unsigned nx12 = STARPU_MATRIX_GET_NX(descr[1]); unsigned ny12 = STARPU_MATRIX_GET_NY(descr[1]); #ifdef VERBOSE_KERNELS struct debug_info *info = _args; int rank; starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); #warning fixed debugging according to other tweak //fprintf(stderr, "KERNEL 12 %d - k = %u i %u\n", rank, info->k, info->i); fprintf(stderr, "KERNEL 21 %d - k = %u i %u\n", rank, info->k, info->j); //fprintf(stderr, "INPUT 12 U11\n"); fprintf(stderr, "INPUT 21 U11\n"); STARPU_PLU(display_data_content)(sub11, nx12); //fprintf(stderr, "INPUT 12 U12\n"); fprintf(stderr, "INPUT 21 U21\n"); STARPU_PLU(display_data_content)(sub12, nx12); #endif #ifdef STARPU_USE_CUDA cublasStatus status; cudaError_t cures; #endif /* solve L11 U12 = A12 (find U12) */ switch (s) { case 0: CPU_TRSM("L", "L", "N", "N", nx12, ny12, (TYPE)1.0, sub11, ld11, sub12, ld12); break; #ifdef STARPU_USE_CUDA case 1: CUBLAS_TRSM('L', 'L', 'N', 'N', ny12, nx12, (TYPE)1.0, sub11, ld11, sub12, ld12); status = cublasGetError(); if (STARPU_UNLIKELY(status != CUBLAS_STATUS_SUCCESS)) STARPU_CUBLAS_REPORT_ERROR(status); if (STARPU_UNLIKELY((cures = cudaStreamSynchronize(starpu_cuda_get_local_stream())) != cudaSuccess)) STARPU_CUDA_REPORT_ERROR(cures); break; #endif default: STARPU_ABORT(); break; } #ifdef VERBOSE_KERNELS //fprintf(stderr, "OUTPUT 12 U12\n"); fprintf(stderr, "OUTPUT 21 U21\n"); STARPU_PLU(display_data_content)(sub12, nx12); #endif } static void STARPU_PLU(cpu_u12)(void *descr[], void *_args) { STARPU_PLU(common_u12)(descr, 0, _args); } #ifdef STARPU_USE_CUDA static void STARPU_PLU(cublas_u12)(void *descr[], void *_args) { STARPU_PLU(common_u12)(descr, 1, _args); } #endif // STARPU_USE_CUDA static struct starpu_perfmodel STARPU_PLU(model_12) = { .type = STARPU_HISTORY_BASED, #ifdef STARPU_ATLAS .symbol = STARPU_PLU_STR(lu_model_12_atlas) #elif defined(STARPU_GOTO) .symbol = STARPU_PLU_STR(lu_model_12_goto) #else .symbol = STARPU_PLU_STR(lu_model_12) #endif }; struct starpu_codelet STARPU_PLU(cl12) = { .where = STARPU_CPU|STARPU_CUDA, .cpu_funcs = {STARPU_PLU(cpu_u12)}, #ifdef STARPU_USE_CUDA .cuda_funcs = {STARPU_PLU(cublas_u12)}, #endif .nbuffers = 2, .modes = {STARPU_R, STARPU_RW}, .model = &STARPU_PLU(model_12) }; /* * U21 */ static inline void STARPU_PLU(common_u21)(void *descr[], int s, STARPU_ATTRIBUTE_UNUSED void *_args) { TYPE *sub11; TYPE *sub21; sub11 = (TYPE *)STARPU_MATRIX_GET_PTR(descr[0]); sub21 = (TYPE *)STARPU_MATRIX_GET_PTR(descr[1]); unsigned ld11 = STARPU_MATRIX_GET_LD(descr[0]); unsigned ld21 = STARPU_MATRIX_GET_LD(descr[1]); unsigned nx21 = STARPU_MATRIX_GET_NX(descr[1]); unsigned ny21 = STARPU_MATRIX_GET_NY(descr[1]); #ifdef VERBOSE_KERNELS struct debug_info *info = _args; int rank; starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); #warning fixed debugging according to other tweak //fprintf(stderr, "KERNEL 21 %d (k = %u, i = %u)\n", rank, info->k, info->i); fprintf(stderr, "KERNEL 12 %d (k = %u, j = %u)\n", rank, info->k, info->j); //fprintf(stderr, "INPUT 21 U11\n"); fprintf(stderr, "INPUT 12 U11\n"); STARPU_PLU(display_data_content)(sub11, nx21); //fprintf(stderr, "INPUT 21 U21\n"); fprintf(stderr, "INPUT 12 U12\n"); STARPU_PLU(display_data_content)(sub21, nx21); #endif #ifdef STARPU_USE_CUDA cublasStatus status; #endif switch (s) { case 0: CPU_TRSM("R", "U", "N", "U", nx21, ny21, (TYPE)1.0, sub11, ld11, sub21, ld21); break; #ifdef STARPU_USE_CUDA case 1: CUBLAS_TRSM('R', 'U', 'N', 'U', ny21, nx21, (TYPE)1.0, sub11, ld11, sub21, ld21); status = cublasGetError(); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); cudaStreamSynchronize(starpu_cuda_get_local_stream()); break; #endif default: STARPU_ABORT(); break; } #ifdef VERBOSE_KERNELS //fprintf(stderr, "OUTPUT 21 U11\n"); fprintf(stderr, "OUTPUT 12 U11\n"); STARPU_PLU(display_data_content)(sub11, nx21); //fprintf(stderr, "OUTPUT 21 U21\n"); fprintf(stderr, "OUTPUT 12 U12\n"); STARPU_PLU(display_data_content)(sub21, nx21); #endif } static void STARPU_PLU(cpu_u21)(void *descr[], void *_args) { STARPU_PLU(common_u21)(descr, 0, _args); } #ifdef STARPU_USE_CUDA static void STARPU_PLU(cublas_u21)(void *descr[], void *_args) { STARPU_PLU(common_u21)(descr, 1, _args); } #endif static struct starpu_perfmodel STARPU_PLU(model_21) = { .type = STARPU_HISTORY_BASED, #ifdef STARPU_ATLAS .symbol = STARPU_PLU_STR(lu_model_21_atlas) #elif defined(STARPU_GOTO) .symbol = STARPU_PLU_STR(lu_model_21_goto) #else .symbol = STARPU_PLU_STR(lu_model_21) #endif }; struct starpu_codelet STARPU_PLU(cl21) = { .where = STARPU_CPU|STARPU_CUDA, .cpu_funcs = {STARPU_PLU(cpu_u21)}, #ifdef STARPU_USE_CUDA .cuda_funcs = {STARPU_PLU(cublas_u21)}, #endif .nbuffers = 2, .modes = {STARPU_R, STARPU_RW}, .model = &STARPU_PLU(model_21) }; /* * U11 */ static inline void STARPU_PLU(common_u11)(void *descr[], int s, STARPU_ATTRIBUTE_UNUSED void *_args) { TYPE *sub11; sub11 = (TYPE *)STARPU_MATRIX_GET_PTR(descr[0]); unsigned long nx = STARPU_MATRIX_GET_NX(descr[0]); unsigned long ld = STARPU_MATRIX_GET_LD(descr[0]); unsigned long z; #ifdef VERBOSE_KERNELS struct debug_info *info = _args; int rank; starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); fprintf(stderr, "KERNEL 11 %d - k = %u\n", rank, info->k); #endif switch (s) { case 0: for (z = 0; z < nx; z++) { TYPE pivot; pivot = sub11[z+z*ld]; STARPU_ASSERT(pivot != 0.0); CPU_SCAL(nx - z - 1, (1.0/pivot), &sub11[z+(z+1)*ld], ld); CPU_GER(nx - z - 1, nx - z - 1, -1.0, &sub11[(z+1)+z*ld], 1, &sub11[z+(z+1)*ld], ld, &sub11[(z+1) + (z+1)*ld],ld); } break; #ifdef STARPU_USE_CUDA case 1: for (z = 0; z < nx; z++) { TYPE pivot; cudaMemcpyAsync(&pivot, &sub11[z+z*ld], sizeof(TYPE), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); STARPU_ASSERT(pivot != 0.0); CUBLAS_SCAL(nx - z - 1, 1.0/pivot, &sub11[z+(z+1)*ld], ld); CUBLAS_GER(nx - z - 1, nx - z - 1, -1.0, &sub11[(z+1)+z*ld], 1, &sub11[z+(z+1)*ld], ld, &sub11[(z+1) + (z+1)*ld],ld); } cudaStreamSynchronize(starpu_cuda_get_local_stream()); break; #endif default: STARPU_ABORT(); break; } #ifdef VERBOSE_KERNELS fprintf(stderr, "KERNEL 11 %d - k = %u\n", rank, info->k); #endif } static void STARPU_PLU(cpu_u11)(void *descr[], void *_args) { STARPU_PLU(common_u11)(descr, 0, _args); } #ifdef STARPU_USE_CUDA static void STARPU_PLU(cublas_u11)(void *descr[], void *_args) { STARPU_PLU(common_u11)(descr, 1, _args); } #endif// STARPU_USE_CUDA static struct starpu_perfmodel STARPU_PLU(model_11) = { .type = STARPU_HISTORY_BASED, #ifdef STARPU_ATLAS .symbol = STARPU_PLU_STR(lu_model_11_atlas) #elif defined(STARPU_GOTO) .symbol = STARPU_PLU_STR(lu_model_11_goto) #else .symbol = STARPU_PLU_STR(lu_model_11) #endif }; struct starpu_codelet STARPU_PLU(cl11) = { .where = STARPU_CPU|STARPU_CUDA, .cpu_funcs = {STARPU_PLU(cpu_u11)}, #ifdef STARPU_USE_CUDA .cuda_funcs = {STARPU_PLU(cublas_u11)}, #endif .nbuffers = 1, .modes = {STARPU_RW}, .model = &STARPU_PLU(model_11) }; starpu-1.2.3+dfsg/mpi/examples/mpi_lu/pxlu_kernels.h000066400000000000000000000020531320135501600225220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012, 2014 Université de Bordeaux * Copyright (C) 2010, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __PXLU_KERNELS_H__ #define __PXLU_KERNELS_H__ #include #define str(s) #s #define xstr(s) str(s) #define STARPU_PLU_STR(name) xstr(STARPU_PLU(name)) struct starpu_codelet STARPU_PLU(cl11); struct starpu_codelet STARPU_PLU(cl12); struct starpu_codelet STARPU_PLU(cl21); struct starpu_codelet STARPU_PLU(cl22); #endif // __PXLU_KERNELS_H__ starpu-1.2.3+dfsg/mpi/examples/native_fortran/000077500000000000000000000000001320135501600213725ustar00rootroot00000000000000starpu-1.2.3+dfsg/mpi/examples/native_fortran/nf_basic_ring.f90000066400000000000000000000076771320135501600245160ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2016 Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ! ! See the GNU Lesser General Public License in COPYING.LGPL for more details. program nf_basic_ring use iso_c_binding ! C interfacing module use fstarpu_mod ! StarPU interfacing module use fstarpu_mpi_mod ! StarPU-MPI interfacing module implicit none integer(c_int) :: ncpu integer(c_int) :: ret integer(c_int) :: rank,sz integer(c_int),target :: token = 42 integer(c_int) :: nloops = 32 integer(c_int) :: loop integer(c_int) :: tag integer(c_int) :: world integer(c_int) :: src,dst type(c_ptr) :: token_dh, st ret = fstarpu_init(C_NULL_PTR) if (ret == -19) then stop 77 else if (ret /= 0) then stop 1 end if ret = fstarpu_mpi_init(1) print *,"fstarpu_mpi_init status:", ret if (ret /= 0) then stop 1 end if ! stop there if no CPU worker available ncpu = fstarpu_cpu_worker_get_count() if (ncpu == 0) then call fstarpu_shutdown() ret = fstarpu_mpi_shutdown() stop 77 end if world = fstarpu_mpi_world_comm() rank = fstarpu_mpi_world_rank() sz = fstarpu_mpi_world_size() write(*,*) "rank=", rank,"size=",sz,"world=",world if (sz < 2) then call fstarpu_shutdown() ret = fstarpu_mpi_shutdown() stop 77 end if call fstarpu_variable_data_register(token_dh, 0, c_loc(token), c_sizeof(token)) st = fstarpu_mpi_status_alloc() do loop=1,nloops tag = loop*sz+rank token = 0 if (loop == 1.and.rank == 0) then write(*,*) "rank=", rank,"token=",token else src = modulo((rank+sz-1),sz) write(*,*) "rank=", rank,"recv--> src =", src, "tag =", tag ret = fstarpu_mpi_recv(token_dh, src, tag, world, st) if (ret /= 0) then write(*,*) "fstarpu_mpi_recv failed" stop 1 end if write(*,*) "rank=", rank,"recv<--","token=",token token = token+1 end if if (loop == nloops.and.rank == (sz-1)) then call fstarpu_data_acquire(token_dh, FSTARPU_R) write(*,*) "finished: rank=", rank,"token=",token call fstarpu_data_release(token_dh) else dst = modulo((rank+1),sz) write(*,*) "rank=", rank,"send--> dst =", dst, "tag =", tag+1 ret = fstarpu_mpi_send(token_dh, dst, tag+1, world) if (ret /= 0) then write(*,*) "fstarpu_mpi_recv failed" stop 1 end if write(*,*) "rank=", rank,"send<--" end if end do call fstarpu_mpi_status_free(st) call fstarpu_data_unregister(token_dh) call fstarpu_shutdown() ret = fstarpu_mpi_shutdown() print *,"fstarpu_mpi_shutdown status:", ret if (ret /= 0) then stop 1 end if end program nf_basic_ring starpu-1.2.3+dfsg/mpi/examples/native_fortran/nf_mm.f90000066400000000000000000000166711320135501600230210ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2016 Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ! ! See the GNU Lesser General Public License in COPYING.LGPL for more details. program nf_mm use iso_c_binding ! C interfacing module use fstarpu_mod ! StarPU interfacing module use fstarpu_mpi_mod ! StarPU-MPI interfacing module use nf_mm_cl implicit none logical, parameter :: verbose = .false. integer(c_int) :: comm_rank, comm_size, comm_world integer(c_int) :: N = 16, BS = 4, NB real(kind=c_double),allocatable,target :: A(:,:), B(:,:), C(:,:) type(c_ptr),allocatable :: dh_A(:), dh_B(:), dh_C(:,:) type(c_ptr) :: cl_mm integer(c_int) :: ncpu integer(c_int) :: ret integer(c_int) :: row, col integer(c_int) :: b_row, b_col integer(c_int) :: mr, tag, rank ret = fstarpu_init(C_NULL_PTR) if (ret == -19) then stop 77 else if (ret /= 0) then stop 1 end if ret = fstarpu_mpi_init(1) print *,"fstarpu_mpi_init status:", ret if (ret /= 0) then stop 1 end if ! stop there if no CPU worker available ncpu = fstarpu_cpu_worker_get_count() if (ncpu == 0) then call fstarpu_shutdown() stop 77 end if comm_world = fstarpu_mpi_world_comm() comm_size = fstarpu_mpi_world_size() comm_rank = fstarpu_mpi_world_rank() if (comm_size < 2) then call fstarpu_shutdown() ret = fstarpu_mpi_shutdown() stop 77 end if ! TODO: process app's argc/argv NB = N/BS ! allocate and initialize codelet cl_mm = fstarpu_codelet_allocate() call fstarpu_codelet_set_name(cl_mm, c_char_"nf_mm_cl"//c_null_char) call fstarpu_codelet_add_cpu_func(cl_mm, C_FUNLOC(cl_cpu_mult)) call fstarpu_codelet_add_buffer(cl_mm, FSTARPU_R) call fstarpu_codelet_add_buffer(cl_mm, FSTARPU_R) call fstarpu_codelet_add_buffer(cl_mm, FSTARPU_RW) ! allocate matrices if (comm_rank == 0) then allocate(A(N,N)) allocate(B(N,N)) allocate(C(N,N)) end if ! init matrices if (comm_rank == 0) then do col=1,N do row=1,N if (row == col) then A(row,col) = 2 else A(row,col) = 0 end if B(row,col) = row*N+col C(row,col) = 0 end do end do if (verbose) then print *,"A" call mat_disp(A) print *,"B" call mat_disp(B) print *,"C" call mat_disp(C) end if end if ! allocate data handles allocate(dh_A(NB)) allocate(dh_B(NB)) allocate(dh_C(NB,NB)) ! register matrices if (comm_rank == 0) then mr = 0 ! TODO: use STARPU_MAIN_RAM constant else mr = -1 end if tag = 0 do b_row=1,NB if (comm_rank == 0) then call fstarpu_matrix_data_register(dh_A(b_row), mr, & c_loc( A(1+(b_row-1)*BS,1) ), N, BS, N, c_sizeof(A(1,1))) else call fstarpu_matrix_data_register(dh_A(b_row), mr, & c_null_ptr, N, BS, N, c_sizeof(A(1,1))) end if call fstarpu_mpi_data_register(dh_A(b_row), tag, 0) tag = tag+1 end do do b_col=1,NB if (comm_rank == 0) then call fstarpu_matrix_data_register(dh_B(b_col), mr, & c_loc( B(1,1+(b_col-1)*BS) ), N, N, BS, c_sizeof(B(1,1))) else call fstarpu_matrix_data_register(dh_B(b_col), mr, & c_null_ptr, N, N, BS, c_sizeof(B(1,1))) end if call fstarpu_mpi_data_register(dh_B(b_col), tag, 0) tag = tag+1 end do do b_col=1,NB do b_row=1,NB if (comm_rank == 0) then call fstarpu_matrix_data_register(dh_C(b_row,b_col), mr, & c_loc( C(1+(b_row-1)*BS,1+(b_col-1)*BS) ), N, BS, BS, c_sizeof(C(1,1))) else call fstarpu_matrix_data_register(dh_C(b_row,b_col), mr, & c_null_ptr, N, BS, BS, c_sizeof(C(1,1))) end if call fstarpu_mpi_data_register(dh_C(b_row,b_col), tag, 0) tag = tag+1 end do end do ! distribute matrix C do b_col=1,NB do b_row=1,NB rank = modulo(b_row+b_col, comm_size) call fstarpu_mpi_data_migrate(comm_world, dh_c(b_row,b_col), rank) end do end do do b_col=1,NB do b_row=1,NB ret = fstarpu_mpi_task_insert(comm_world, (/ cl_mm, & FSTARPU_R, dh_A(b_row), & FSTARPU_R, dh_B(b_col), & FSTARPU_RW, dh_C(b_row,b_col), & C_NULL_PTR /)) end do end do call fstarpu_task_wait_for_all() ! undistribute matrix C do b_col=1,NB do b_row=1,NB call fstarpu_mpi_data_migrate(comm_world, dh_c(b_row,b_col), 0) end do end do ! unregister matrices do b_row=1,NB call fstarpu_data_unregister(dh_A(b_row)) end do do b_col=1,NB call fstarpu_data_unregister(dh_B(b_col)) end do do b_col=1,NB do b_row=1,NB call fstarpu_data_unregister(dh_C(b_row,b_col)) end do end do ! check result if (comm_rank == 0) then if (verbose) then print *,"final C" call mat_disp(C) end if do col=1,N do row=1,N if (abs(C(row,col) - 2*(row*N+col)) > 1.0) then print *, "check failed" stop 1 end if end do end do end if ! free handles deallocate(dh_A) deallocate(dh_B) deallocate(dh_C) ! free matrices if (comm_rank == 0) then deallocate(A) deallocate(B) deallocate(C) end if call fstarpu_codelet_free(cl_mm) call fstarpu_shutdown() ret = fstarpu_mpi_shutdown() print *,"fstarpu_mpi_shutdown status:", ret if (ret /= 0) then stop 1 end if end program nf_mm starpu-1.2.3+dfsg/mpi/examples/native_fortran/nf_mm_cl.f90000066400000000000000000000055771320135501600235020ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2016 Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ! ! See the GNU Lesser General Public License in COPYING.LGPL for more details. module nf_mm_cl contains subroutine mat_disp (m) ! declared here so it can be used both for the ! program and for debugging codelet routines use iso_c_binding ! C interfacing module implicit none real(kind=c_double) :: m(:,:) integer i,j do i=lbound(m,1),ubound(m,1) write(*, fmt="(A2) ",advance="no") "| " do j=lbound(m,2),ubound(m,2) write(*, fmt="(F6.1,A1) ", advance="no") m(i,j)," " end do write(*,*) "|" end do write(*,*) end subroutine recursive subroutine cl_cpu_mult (buffers, cl_args) bind(C) use iso_c_binding ! C interfacing module use fstarpu_mod ! StarPU interfacing module implicit none type(c_ptr), value, intent(in) :: buffers, cl_args ! cl_args is unused real(kind=c_double),pointer :: A(:,:), B(:,:), C(:,:) integer :: ld_A,nx_A,ny_A integer :: ld_B,nx_B,ny_B integer :: ld_C,nx_C,ny_C integer :: i,j,k ld_A = fstarpu_matrix_get_ld(buffers, 0) ld_B = fstarpu_matrix_get_ld(buffers, 1) ld_C = fstarpu_matrix_get_ld(buffers, 2) nx_A = fstarpu_matrix_get_nx(buffers, 0) nx_B = fstarpu_matrix_get_nx(buffers, 1) nx_C = fstarpu_matrix_get_nx(buffers, 2) ny_A = fstarpu_matrix_get_ny(buffers, 0) ny_B = fstarpu_matrix_get_ny(buffers, 1) ny_C = fstarpu_matrix_get_ny(buffers, 2) if (ny_C /= ny_B) then write(*,*) "C -- B column mismatch" stop 1 end if if (nx_C /= nx_A) then write(*,*) "C -- A row mismatch" stop 1 end if if (ny_A /= nx_B) then write(*,*) "A -- B col/row mismatch" stop 1 end if call c_f_pointer(fstarpu_matrix_get_ptr(buffers, 0), A, shape=[ld_A,ny_A]) call c_f_pointer(fstarpu_matrix_get_ptr(buffers, 1), B, shape=[ld_B,ny_B]) call c_f_pointer(fstarpu_matrix_get_ptr(buffers, 2), C, shape=[ld_C,ny_C]) do k = 1, ny_C do j = 1, nx_C do i = 1, nx_B C(j,k) = C(j,k) + A(j,i) * B(i,k) end do end do end do end subroutine cl_cpu_mult end module nf_mm_cl starpu-1.2.3+dfsg/mpi/examples/stencil/000077500000000000000000000000001320135501600200125ustar00rootroot00000000000000starpu-1.2.3+dfsg/mpi/examples/stencil/stencil5.c000066400000000000000000000170511320135501600217100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2013, 2015-2017 Université Bordeaux * Copyright (C) 2011, 2012, 2013, 2014, 2015, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #define FPRINTF_MPI(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) { \ int _disp_rank; starpu_mpi_comm_rank(MPI_COMM_WORLD, &_disp_rank); \ fprintf(ofile, "[%d][starpu_mpi][%s] " fmt , _disp_rank, __starpu_func__ ,## __VA_ARGS__); \ fflush(ofile); }} while(0); void stencil5_cpu(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { float *xy = (float *)STARPU_VARIABLE_GET_PTR(descr[0]); float *xm1y = (float *)STARPU_VARIABLE_GET_PTR(descr[1]); float *xp1y = (float *)STARPU_VARIABLE_GET_PTR(descr[2]); float *xym1 = (float *)STARPU_VARIABLE_GET_PTR(descr[3]); float *xyp1 = (float *)STARPU_VARIABLE_GET_PTR(descr[4]); // fprintf(stdout, "VALUES: %2.2f %2.2f %2.2f %2.2f %2.2f\n", *xy, *xm1y, *xp1y, *xym1, *xyp1); *xy = (*xy + *xm1y + *xp1y + *xym1 + *xyp1) / 5; // fprintf(stdout, "VALUES: %2.2f %2.2f %2.2f %2.2f %2.2f\n", *xy, *xm1y, *xp1y, *xym1, *xyp1); } struct starpu_codelet stencil5_cl = { .cpu_funcs = {stencil5_cpu}, .nbuffers = 5, .modes = {STARPU_RW, STARPU_R, STARPU_R, STARPU_R, STARPU_R} }; #ifdef STARPU_QUICK_CHECK # define NITER_DEF 10 # define X 2 # define Y 2 #elif !defined(STARPU_LONG_CHECK) # define NITER_DEF 10 # define X 5 # define Y 5 #else # define NITER_DEF 100 # define X 20 # define Y 20 #endif int display = 0; int niter = NITER_DEF; /* Returns the MPI node number where data indexes index is */ int my_distrib(int x, int y, int nb_nodes) { /* Block distrib */ return ((int)(x / sqrt(nb_nodes) + (y / sqrt(nb_nodes)) * sqrt(nb_nodes))) % nb_nodes; } /* Shifted distribution, for migration example */ int my_distrib2(int x, int y, int nb_nodes) { return (my_distrib(x, y, nb_nodes) + 1) % nb_nodes; } static void parse_args(int argc, char **argv) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-iter") == 0) { char *argptr; niter = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-display") == 0) { display = 1; } } } int main(int argc, char **argv) { int my_rank, size, x, y, loop; float mean=0; float matrix[X][Y]; starpu_data_handle_t data_handles[X][Y]; int ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(&argc, &argv, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &my_rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (starpu_cpu_worker_get_count() == 0) { FPRINTF(stderr, "We need at least 1 CPU worker.\n"); starpu_mpi_shutdown(); starpu_shutdown(); return 77; } parse_args(argc, argv); /* Initial data values */ starpu_srand48((long int)time(NULL)); for(x = 0; x < X; x++) { for (y = 0; y < Y; y++) { matrix[x][y] = (float)starpu_drand48(); mean += matrix[x][y]; } } mean /= (X*Y); if (display) { FPRINTF_MPI(stdout, "mean=%2.2f\n", mean); for(x = 0; x < X; x++) { fprintf(stdout, "[%d] ", my_rank); for (y = 0; y < Y; y++) { fprintf(stdout, "%2.2f ", matrix[x][y]); } fprintf(stdout, "\n"); } } /* Initial distribution */ for(x = 0; x < X; x++) { for (y = 0; y < Y; y++) { int mpi_rank = my_distrib(x, y, size); if (mpi_rank == my_rank) { //FPRINTF(stderr, "[%d] Owning data[%d][%d]\n", my_rank, x, y); starpu_variable_data_register(&data_handles[x][y], 0, (uintptr_t)&(matrix[x][y]), sizeof(float)); } else if (my_rank == my_distrib(x+1, y, size) || my_rank == my_distrib(x-1, y, size) || my_rank == my_distrib(x, y+1, size) || my_rank == my_distrib(x, y-1, size)) { /* I don't own that index, but will need it for my computations */ //FPRINTF(stderr, "[%d] Neighbour of data[%d][%d]\n", my_rank, x, y); starpu_variable_data_register(&data_handles[x][y], -1, (uintptr_t)NULL, sizeof(float)); } else { /* I know it's useless to allocate anything for this */ data_handles[x][y] = NULL; } if (data_handles[x][y]) { starpu_data_set_coordinates(data_handles[x][y], 2, x, y); starpu_mpi_data_register(data_handles[x][y], (y*X)+x, mpi_rank); } } } /* First computation with initial distribution */ for(loop=0 ; loop #include "my_interface.h" void starpu_my_interface_display_codelet_cpu(void *descr[], void *_args) { char c = STARPU_MY_INTERFACE_GET_CHAR(descr[0]); int d = STARPU_MY_INTERFACE_GET_INT(descr[0]); char msg[100]; if (_args) starpu_codelet_unpack_args(_args, &msg); fprintf(stderr, "[%s] My value = '%c' %d\n", _args?msg:NULL, c, d); } void starpu_my_interface_compare_codelet_cpu(void *descr[], void *_args) { int *compare; starpu_codelet_unpack_args(_args, &compare); int d0 = STARPU_MY_INTERFACE_GET_INT(descr[0]); char c0 = STARPU_MY_INTERFACE_GET_CHAR(descr[0]); int d1 = STARPU_MY_INTERFACE_GET_INT(descr[1]); char c1 = STARPU_MY_INTERFACE_GET_CHAR(descr[1]); *compare = (d0 == d1 && c0 == c1); } static struct starpu_my_interface *myinterface = NULL; void _starpu_my_interface_datatype_allocate(MPI_Datatype *mpi_datatype) { int ret; int blocklengths[2] = {1, 1}; MPI_Aint displacements[2]; MPI_Datatype types[2] = {MPI_INT, MPI_CHAR}; myinterface = malloc(sizeof(struct starpu_my_interface)); MPI_Address(myinterface, displacements); MPI_Address(&myinterface[0].c, displacements+1); displacements[1] -= displacements[0]; displacements[0] = 0; ret = MPI_Type_create_struct(2, blocklengths, displacements, types, mpi_datatype); STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_contiguous failed"); ret = MPI_Type_commit(mpi_datatype); STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_commit failed"); } void starpu_my_interface_datatype_allocate(starpu_data_handle_t handle, MPI_Datatype *mpi_datatype) { (void)handle; _starpu_my_interface_datatype_allocate(mpi_datatype); } void starpu_my_interface_datatype_free(MPI_Datatype *mpi_datatype) { MPI_Type_free(mpi_datatype); free(myinterface); } int starpu_my_interface_get_int(starpu_data_handle_t handle) { struct starpu_my_interface *my_interface = (struct starpu_my_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); return my_interface->d; } char starpu_my_interface_get_char(starpu_data_handle_t handle) { struct starpu_my_interface *my_interface = (struct starpu_my_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); return my_interface->c; } static void data_register_data_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface) { struct starpu_my_interface *my_interface = (struct starpu_my_interface *) data_interface; unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct starpu_my_interface *local_interface = (struct starpu_my_interface *) starpu_data_get_interface_on_node(handle, node); if (node == home_node) { local_interface->d = my_interface->d; local_interface->c = my_interface->c; } else { local_interface->d = 0; local_interface->c = 0; } } } static starpu_ssize_t data_allocate_data_on_node(void *data_interface, unsigned node) { (void)data_interface; (void)node; return 0; } static void data_free_data_on_node(void *data_interface, unsigned node) { (void)data_interface; (void)node; } static size_t data_get_size(starpu_data_handle_t handle) { (void)handle; return sizeof(int) + sizeof(char); } static uint32_t data_footprint(starpu_data_handle_t handle) { return starpu_hash_crc32c_be(starpu_my_interface_get_int(handle), 0); } static int data_pack_data(starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count) { (void)handle; (void)node; (void)ptr; (void)count; STARPU_ASSERT_MSG(0, "The data interface has been registered with starpu_mpi_datatype_register(). Calling the pack_data function should not happen\n"); return 0; } static int data_unpack_data(starpu_data_handle_t handle, unsigned node, void *ptr, size_t count) { (void)handle; (void)node; (void)ptr; (void)count; STARPU_ASSERT_MSG(0, "The data interface has been registered with starpu_mpi_datatype_register(). Calling the unpack_data function should not happen\n"); return 0; } static starpu_ssize_t data_describe(void *data_interface, char *buf, size_t size) { struct starpu_my_interface *my_interface = (struct starpu_my_interface *) data_interface; return snprintf(buf, size, "Data%d-%c", my_interface->d, my_interface->c); } static void *data_handle_to_pointer(starpu_data_handle_t handle, unsigned node) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_my_interface *my_interface = (struct starpu_my_interface *) starpu_data_get_interface_on_node(handle, node); return (void*) &my_interface->d; } static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data) { struct starpu_my_interface *src_data = src_interface; struct starpu_my_interface *dst_data = dst_interface; int ret = 0; if (starpu_interface_copy((uintptr_t) src_data->d, 0, src_node, (uintptr_t) dst_data->d, 0, dst_node, sizeof(src_data->d), async_data)) ret = -EAGAIN; if (starpu_interface_copy((uintptr_t) src_data->c, 0, src_node, (uintptr_t) dst_data->c, 0, dst_node, sizeof(src_data->c), async_data)) ret = -EAGAIN; return ret; } static const struct starpu_data_copy_methods data_copy_methods = { .any_to_any = copy_any_to_any }; static struct starpu_data_interface_ops interface_data_ops = { .register_data_handle = data_register_data_handle, .allocate_data_on_node = data_allocate_data_on_node, .free_data_on_node = data_free_data_on_node, .copy_methods = &data_copy_methods, .get_size = data_get_size, .footprint = data_footprint, .interfaceid = STARPU_UNKNOWN_INTERFACE_ID, .interface_size = sizeof(struct starpu_my_interface), .handle_to_pointer = data_handle_to_pointer, .pack_data = data_pack_data, .unpack_data = data_unpack_data, .describe = data_describe }; void starpu_my_interface_data_register(starpu_data_handle_t *handleptr, unsigned home_node, struct starpu_my_interface *xc) { if (interface_data_ops.interfaceid == STARPU_UNKNOWN_INTERFACE_ID) { interface_data_ops.interfaceid = starpu_data_interface_get_next_id(); } starpu_data_register(handleptr, home_node, xc, &interface_data_ops); } starpu-1.2.3+dfsg/mpi/examples/user_datatype/my_interface.h000066400000000000000000000042431320135501600240430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #ifndef __DATA_INTERFACE_H #define __DATA_INTERFACE_H struct starpu_my_interface { int d; char c; }; void starpu_my_interface_data_register(starpu_data_handle_t *handle, unsigned home_node, struct starpu_my_interface *xc); char starpu_my_interface_get_char(starpu_data_handle_t handle); int starpu_my_interface_get_int(starpu_data_handle_t handle); #define STARPU_MY_INTERFACE_GET_CHAR(interface) (((struct starpu_my_interface *)(interface))->c) #define STARPU_MY_INTERFACE_GET_INT(interface) (((struct starpu_my_interface *)(interface))->d) void _starpu_my_interface_datatype_allocate(MPI_Datatype *mpi_datatype); void starpu_my_interface_datatype_allocate(starpu_data_handle_t handle, MPI_Datatype *mpi_datatype); void starpu_my_interface_datatype_free(MPI_Datatype *mpi_datatype); void starpu_my_interface_display_codelet_cpu(void *descr[], void *_args); void starpu_my_interface_compare_codelet_cpu(void *descr[], void *_args); static struct starpu_codelet starpu_my_interface_display_codelet = { .cpu_funcs = {starpu_my_interface_display_codelet_cpu}, .cpu_funcs_name = {"starpu_my_interface_display_codelet_cpu"}, .nbuffers = 1, .modes = {STARPU_R}, .name = "starpu_my_interface_display_codelet" }; static struct starpu_codelet starpu_my_interface_compare_codelet = { .cpu_funcs = {starpu_my_interface_compare_codelet_cpu}, .cpu_funcs_name = {"starpu_my_interface_compare_codelet_cpu"}, .nbuffers = 2, .modes = {STARPU_R, STARPU_R}, .name = "starpu_my_interface_compare_codelet" }; #endif /* __MY_INTERFACE_H */ starpu-1.2.3+dfsg/mpi/examples/user_datatype/user_datatype.c000066400000000000000000000072741320135501600242510ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "my_interface.h" #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) int main(int argc, char **argv) { int rank, nodes; int ret=0; int compare=0; struct starpu_my_interface my1 = {.d = 98 , .c = 'z'}; struct starpu_my_interface my0 = {.d = 42 , .c = 'n'}; starpu_data_handle_t handle0; starpu_data_handle_t handle1; ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(&argc, &argv, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &nodes); if (nodes < 2) { fprintf(stderr, "This program needs at least 2 nodes (%d available)\n", nodes); starpu_mpi_shutdown(); starpu_shutdown(); return 77; } if (rank == 1) { my0.d = 0; my0.c = 'z'; } starpu_my_interface_data_register(&handle0, STARPU_MAIN_RAM, &my0); starpu_my_interface_data_register(&handle1, -1, &my1); starpu_mpi_datatype_register(handle1, starpu_my_interface_datatype_allocate, starpu_my_interface_datatype_free); starpu_mpi_barrier(MPI_COMM_WORLD); if (rank == 0) { MPI_Datatype mpi_datatype; _starpu_my_interface_datatype_allocate(&mpi_datatype); MPI_Send(&my0, 1, mpi_datatype, 1, 42, MPI_COMM_WORLD); starpu_my_interface_datatype_free(&mpi_datatype); } else if (rank == 1) { MPI_Datatype mpi_datatype; MPI_Status status; _starpu_my_interface_datatype_allocate(&mpi_datatype); MPI_Recv(&my0, 1, mpi_datatype, 0, 42, MPI_COMM_WORLD, &status); FPRINTF(stderr, "Received value: '%c' %d\n", my0.c, my0.d); starpu_my_interface_datatype_free(&mpi_datatype); } if (rank == 0) { int *compare_ptr = &compare; starpu_task_insert(&starpu_my_interface_display_codelet, STARPU_VALUE, "node0 initial value", strlen("node0 initial value")+1, STARPU_R, handle0, 0); starpu_mpi_isend_detached(handle0, 1, 10, MPI_COMM_WORLD, NULL, NULL); starpu_mpi_irecv_detached(handle1, 1, 20, MPI_COMM_WORLD, NULL, NULL); starpu_task_insert(&starpu_my_interface_display_codelet, STARPU_VALUE, "node0 received value", strlen("node0 received value")+1, STARPU_R, handle1, 0); starpu_task_insert(&starpu_my_interface_compare_codelet, STARPU_R, handle0, STARPU_R, handle1, STARPU_VALUE, &compare_ptr, sizeof(compare_ptr), 0); } else if (rank == 1) { starpu_task_insert(&starpu_my_interface_display_codelet, STARPU_VALUE, "node1 initial value", strlen("node1 initial value")+1, STARPU_R, handle0, 0); starpu_mpi_irecv_detached(handle0, 0, 10, MPI_COMM_WORLD, NULL, NULL); starpu_task_insert(&starpu_my_interface_display_codelet, STARPU_VALUE, "node1 received value", strlen("node1 received value")+1, STARPU_R, handle0, 0); starpu_mpi_isend_detached(handle0, 0, 20, MPI_COMM_WORLD, NULL, NULL); } starpu_mpi_barrier(MPI_COMM_WORLD); starpu_mpi_wait_for_all(MPI_COMM_WORLD); starpu_mpi_datatype_unregister(handle0); starpu_data_unregister(handle0); starpu_data_unregister(handle1); starpu_mpi_shutdown(); starpu_shutdown(); return (rank == 0) ? !compare : 0; } starpu-1.2.3+dfsg/mpi/include/000077500000000000000000000000001320135501600161565ustar00rootroot00000000000000starpu-1.2.3+dfsg/mpi/include/fstarpu_mpi_mod.f90000066400000000000000000001112761320135501600216760ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2016 Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ! ! See the GNU Lesser General Public License in COPYING.LGPL for more details. module fstarpu_mpi_mod use iso_c_binding use fstarpu_mod implicit none interface ! == mpi/include/starpu_mpi.h == ! int starpu_mpi_isend(starpu_data_handle_t data_handle, starpu_mpi_req *req, int dest, int mpi_tag, MPI_Comm comm); function fstarpu_mpi_isend (dh, mpi_req, dst, mpi_tag, mpi_comm) bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_isend type(c_ptr), value, intent(in) :: dh type(c_ptr), value, intent(in) :: mpi_req integer(c_int), value, intent(in) :: dst integer(c_int), value, intent(in) :: mpi_tag integer(c_int), value, intent(in) :: mpi_comm end function fstarpu_mpi_isend ! int starpu_mpi_irecv(starpu_data_handle_t data_handle, starpu_mpi_req *req, int source, int mpi_tag, MPI_Comm comm); function fstarpu_mpi_irecv (dh, mpi_req, src, mpi_tag, mpi_comm) bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_irecv type(c_ptr), value, intent(in) :: dh type(c_ptr), value, intent(in) :: mpi_req integer(c_int), value, intent(in) :: src integer(c_int), value, intent(in) :: mpi_tag integer(c_int), value, intent(in) :: mpi_comm end function fstarpu_mpi_irecv ! int starpu_mpi_send(starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm); function fstarpu_mpi_send (dh, dst, mpi_tag, mpi_comm) bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_send type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: dst integer(c_int), value, intent(in) :: mpi_tag integer(c_int), value, intent(in) :: mpi_comm end function fstarpu_mpi_send ! int starpu_mpi_recv(starpu_data_handle_t data_handle, int source, int mpi_tag, MPI_Comm comm, MPI_Status *status); function fstarpu_mpi_recv (dh, src, mpi_tag, mpi_comm, mpi_status) bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_recv type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: src integer(c_int), value, intent(in) :: mpi_tag integer(c_int), value, intent(in) :: mpi_comm type(c_ptr), value, intent(in) :: mpi_status end function fstarpu_mpi_recv ! int starpu_mpi_isend_detached(starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm, void (*callback)(void *), void *arg); function fstarpu_mpi_isend_detached (dh, dst, mpi_tag, mpi_comm, callback, arg) bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_isend_detached type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: dst integer(c_int), value, intent(in) :: mpi_tag integer(c_int), value, intent(in) :: mpi_comm type(c_funptr), value, intent(in) :: callback type(c_ptr), value, intent(in) :: arg end function fstarpu_mpi_isend_detached ! int starpu_mpi_irecv_detached(starpu_data_handle_t data_handle, int source, int mpi_tag, MPI_Comm comm, void (*callback)(void *), void *arg); function fstarpu_mpi_recv_detached (dh, src, mpi_tag, mpi_comm, callback, arg) bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_recv_detached type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: src integer(c_int), value, intent(in) :: mpi_tag integer(c_int), value, intent(in) :: mpi_comm type(c_funptr), value, intent(in) :: callback type(c_ptr), value, intent(in) :: arg end function fstarpu_mpi_recv_detached ! int starpu_mpi_issend(starpu_data_handle_t data_handle, starpu_mpi_req *req, int dest, int mpi_tag, MPI_Comm comm); function fstarpu_mpi_issend (dh, mpi_req, dst, mpi_tag, mpi_comm) bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_issend type(c_ptr), value, intent(in) :: dh type(c_ptr), value, intent(in) :: mpi_req integer(c_int), value, intent(in) :: dst integer(c_int), value, intent(in) :: mpi_tag integer(c_int), value, intent(in) :: mpi_comm end function fstarpu_mpi_issend ! int starpu_mpi_issend_detached(starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm, void (*callback)(void *), void *arg); function fstarpu_mpi_issend_detached (dh, dst, mpi_tag, mpi_comm, callback, arg) bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_issend_detached type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: dst integer(c_int), value, intent(in) :: mpi_tag integer(c_int), value, intent(in) :: mpi_comm type(c_funptr), value, intent(in) :: callback type(c_ptr), value, intent(in) :: arg end function fstarpu_mpi_issend_detached ! int starpu_mpi_wait(starpu_mpi_req *req, MPI_Status *status); function fstarpu_mpi_wait(req,st) bind(C,name="starpu_mpi_wait") use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_wait type(c_ptr), value, intent(in) :: req type(c_ptr), value, intent(in) :: st end function fstarpu_mpi_wait ! int starpu_mpi_test(starpu_mpi_req *req, int *flag, MPI_Status *status); function fstarpu_mpi_test(req,flag,st) bind(C,name="starpu_mpi_test") use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_test type(c_ptr), value, intent(in) :: req type(c_ptr), value, intent(in) :: flag type(c_ptr), value, intent(in) :: st end function fstarpu_mpi_test ! int starpu_mpi_barrier(MPI_Comm comm); function fstarpu_mpi_barrier (mpi_comm) bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_barrier integer(c_int), value, intent(in) :: mpi_comm end function fstarpu_mpi_barrier ! int starpu_mpi_irecv_detached_sequential_consistency(starpu_data_handle_t data_handle, int source, int mpi_tag, MPI_Comm comm, void (*callback)(void *), void *arg, int sequential_consistency); function fstarpu_mpi_recv_detached_sequential_consistency (dh, src, mpi_tag, mpi_comm, callback, arg, seq_const) & bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_recv_detached_sequential_consistency type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: src integer(c_int), value, intent(in) :: mpi_tag integer(c_int), value, intent(in) :: mpi_comm type(c_funptr), value, intent(in) :: callback type(c_ptr), value, intent(in) :: arg integer(c_int), value, intent(in) :: seq_const end function fstarpu_mpi_recv_detached_sequential_consistency ! int starpu_mpi_init_comm(int *argc, char ***argv, int initialize_mpi, MPI_Comm comm); ! -> cf fstarpu_mpi_init ! int starpu_mpi_init(int *argc, char ***argv, int initialize_mpi); ! -> cf fstarpu_mpi_init ! int starpu_mpi_initialize(void) STARPU_DEPRECATED; ! -> cf fstarpu_mpi_init ! int starpu_mpi_initialize_extended(int *rank, int *world_size) STARPU_DEPRECATED; ! -> cf fstarpu_mpi_init ! int starpu_mpi_shutdown(void); function fstarpu_mpi_shutdown () bind(C,name="starpu_mpi_shutdown") use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_shutdown end function fstarpu_mpi_shutdown ! struct starpu_task *starpu_mpi_task_build(MPI_Comm comm, struct starpu_codelet *codelet, ...); function fstarpu_mpi_task_build(mpi_comm,arglist) bind(C) use iso_c_binding, only: c_ptr,c_int type(c_ptr) :: fstarpu_mpi_task_build integer(c_int), value, intent(in) :: mpi_comm type(c_ptr), dimension(:), intent(in) :: arglist end function fstarpu_mpi_task_build ! int starpu_mpi_task_post_build(MPI_Comm comm, struct starpu_codelet *codelet, ...); function fstarpu_mpi_task_post_build(mpi_comm,arglist) bind(C) use iso_c_binding, only: c_ptr,c_int integer(c_int) :: fstarpu_mpi_task_post_build integer(c_int), value, intent(in) :: mpi_comm type(c_ptr), dimension(:), intent(in) :: arglist end function fstarpu_mpi_task_post_build ! int starpu_mpi_task_insert(MPI_Comm comm, struct starpu_codelet *codelet, ...); function fstarpu_mpi_task_insert(mpi_comm,arglist) bind(C) use iso_c_binding, only: c_ptr,c_int integer(c_int) :: fstarpu_mpi_task_insert integer(c_int), value, intent(in) :: mpi_comm type(c_ptr), dimension(:), intent(in) :: arglist end function fstarpu_mpi_task_insert function fstarpu_mpi_insert_task(mpi_comm,arglist) bind(C,name="fstarpu_mpi_task_insert") use iso_c_binding, only: c_ptr,c_int integer(c_int) :: fstarpu_mpi_insert_task integer(c_int), value, intent(in) :: mpi_comm type(c_ptr), dimension(:), intent(in) :: arglist end function fstarpu_mpi_insert_task ! void starpu_mpi_get_data_on_node(MPI_Comm comm, starpu_data_handle_t data_handle, int node); subroutine fstarpu_mpi_get_data_on_node(mpi_comm,dh,node) bind(C) use iso_c_binding implicit none integer(c_int), value, intent(in) :: mpi_comm type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: node end subroutine fstarpu_mpi_get_data_on_node ! void starpu_mpi_get_data_on_node_detached(MPI_Comm comm, starpu_data_handle_t data_handle, int node, void (*callback)(void*), void *arg); subroutine fstarpu_mpi_get_data_on_node_detached(mpi_comm,dh,node,callback,arg) bind(C) use iso_c_binding implicit none integer(c_int), value, intent(in) :: mpi_comm type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: node type(c_funptr), value, intent(in) :: callback type(c_ptr), value, intent(in) :: arg end subroutine fstarpu_mpi_get_data_on_node_detached ! void starpu_mpi_redux_data(MPI_Comm comm, starpu_data_handle_t data_handle); subroutine fstarpu_mpi_redux_data(mpi_comm,dh) bind(C) use iso_c_binding implicit none integer(c_int), value, intent(in) :: mpi_comm type(c_ptr), value, intent(in) :: dh end subroutine fstarpu_mpi_redux_data ! int starpu_mpi_scatter_detached(starpu_data_handle_t *data_handles, int count, int root, MPI_Comm comm, void (*scallback)(void *), void *sarg, void (*rcallback)(void *), void *rarg); function fstarpu_mpi_scatter_detached (dhs, cnt, root, mpi_comm, scallback, sarg, rcallback, rarg) bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_scatter_detached type(c_ptr), intent(in) :: dhs(*) integer(c_int), value, intent(in) :: cnt integer(c_int), value, intent(in) :: root integer(c_int), value, intent(in) :: mpi_comm type(c_funptr), value, intent(in) :: scallback type(c_ptr), value, intent(in) :: sarg type(c_funptr), value, intent(in) :: rcallback type(c_ptr), value, intent(in) :: rarg end function fstarpu_mpi_scatter_detached ! int starpu_mpi_gather_detached(starpu_data_handle_t *data_handles, int count, int root, MPI_Comm comm, void (*scallback)(void *), void *sarg, void (*rcallback)(void *), void *rarg); function fstarpu_mpi_gather_detached (dhs, cnt, root, mpi_comm, scallback, sarg, rcallback, rarg) bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_gather_detached type(c_ptr), intent(in) :: dhs(*) integer(c_int), value, intent(in) :: cnt integer(c_int), value, intent(in) :: root integer(c_int), value, intent(in) :: mpi_comm type(c_funptr), value, intent(in) :: scallback type(c_ptr), value, intent(in) :: sarg type(c_funptr), value, intent(in) :: rcallback type(c_ptr), value, intent(in) :: rarg end function fstarpu_mpi_gather_detached ! int starpu_mpi_isend_detached_unlock_tag(starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm, starpu_tag_t tag); function fstarpu_mpi_isend_detached_unlock_tag (dh, dst, mpi_tag, mpi_comm, starpu_tag) bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_isend_detached_unlock_tag type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: dst integer(c_int), value, intent(in) :: mpi_tag integer(c_int), value, intent(in) :: mpi_comm type(c_ptr), value, intent(in) :: starpu_tag end function fstarpu_mpi_isend_detached_unlock_tag ! int starpu_mpi_irecv_detached_unlock_tag(starpu_data_handle_t data_handle, int source, int mpi_tag, MPI_Comm comm, starpu_tag_t tag); function fstarpu_mpi_recv_detached_unlock_tag (dh, src, mpi_tag, mpi_comm, starpu_tag) bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_recv_detached_unlock_tag type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: src integer(c_int), value, intent(in) :: mpi_tag integer(c_int), value, intent(in) :: mpi_comm type(c_ptr), value, intent(in) :: starpu_tag end function fstarpu_mpi_recv_detached_unlock_tag ! int starpu_mpi_isend_array_detached_unlock_tag(unsigned array_size, starpu_data_handle_t *data_handle, int *dest, int *mpi_tag, MPI_Comm *comm, starpu_tag_t tag); function fstarpu_mpi_isend_array_detached_unlock_tag (array_size, dhs, dsts, mpi_tags, mpi_comms, starpu_tag) & bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_isend_array_detached_unlock_tag integer(c_int), value, intent(in) :: array_size type(c_ptr), intent(in) :: dhs(*) integer(c_int), intent(in) :: dsts(*) integer(c_int), intent(in) :: mpi_tags(*) integer(c_int), intent(in) :: mpi_comms(*) type(c_ptr), value, intent(in) :: starpu_tag end function fstarpu_mpi_isend_array_detached_unlock_tag ! int starpu_mpi_irecv_array_detached_unlock_tag(unsigned array_size, starpu_data_handle_t *data_handle, int *source, int *mpi_tag, MPI_Comm *comm, starpu_tag_t tag); function fstarpu_mpi_recv_array_detached_unlock_tag (array_size, dhs, srcs, mpi_tags, mpi_comms, starpu_tag) & bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_recv_array_detached_unlock_tag integer(c_int), value, intent(in) :: array_size type(c_ptr), intent(in) :: dhs(*) integer(c_int), intent(in) :: srcs(*) integer(c_int), intent(in) :: mpi_tags(*) integer(c_int), intent(in) :: mpi_comms(*) type(c_ptr), value, intent(in) :: starpu_tag end function fstarpu_mpi_recv_array_detached_unlock_tag ! void starpu_mpi_comm_amounts_retrieve(size_t *comm_amounts); subroutine fstarpu_mpi_comm_amounts_retrieve (comm_amounts) bind(C,name="starpu_mpi_comm_amounts_retrieve") use iso_c_binding implicit none integer(c_size_t), intent(in) :: comm_amounts(*) end subroutine fstarpu_mpi_comm_amounts_retrieve ! void starpu_mpi_cache_flush(MPI_Comm comm, starpu_data_handle_t data_handle); subroutine fstarpu_mpi_cache_flush(mpi_comm,dh) bind(C) use iso_c_binding implicit none integer(c_int), value, intent(in) :: mpi_comm type(c_ptr), value, intent(in) :: dh end subroutine fstarpu_mpi_cache_flush ! void starpu_mpi_cache_flush_all_data(MPI_Comm comm); subroutine fstarpu_mpi_cache_flush_all_data(mpi_comm) bind(C) use iso_c_binding implicit none integer(c_int), value, intent(in) :: mpi_comm end subroutine fstarpu_mpi_cache_flush_all_data ! int starpu_mpi_comm_size(MPI_Comm comm, int *size); function fstarpu_mpi_comm_size(mpi_comm,sz) bind(C) use iso_c_binding implicit none integer(c_int), value, intent(in) :: mpi_comm integer(c_int), intent(out) :: sz integer(c_int) :: fstarpu_mpi_comm_size end function fstarpu_mpi_comm_size ! int starpu_mpi_comm_rank(MPI_Comm comm, int *rank); function fstarpu_mpi_comm_rank(mpi_comm,rank) bind(C) use iso_c_binding implicit none integer(c_int), value, intent(in) :: mpi_comm integer(c_int), intent(out) :: rank integer(c_int) :: fstarpu_mpi_comm_rank end function fstarpu_mpi_comm_rank ! int starpu_mpi_world_rank(void); function fstarpu_mpi_world_rank() bind(C,name="starpu_mpi_world_rank") use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_world_rank end function fstarpu_mpi_world_rank ! int starpu_mpi_world_size(void); function fstarpu_mpi_world_size() bind(C,name="starpu_mpi_world_size") use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_world_size end function fstarpu_mpi_world_size ! int starpu_mpi_world_size(void); function fstarpu_mpi_world_comm() bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_world_comm end function fstarpu_mpi_world_comm ! int starpu_mpi_get_communication_tag(void); function fstarpu_mpi_get_communication_tag() bind(C,name="starpu_mpi_get_communication_tag") use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_get_communication_tag end function fstarpu_mpi_get_communication_tag ! void starpu_mpi_set_communication_tag(int tag); subroutine fstarpu_mpi_set_communication_tag(tag) bind(C,name="starpu_mpi_set_communication_tag") use iso_c_binding implicit none integer(c_int), value, intent(in) :: tag end subroutine fstarpu_mpi_set_communication_tag ! void starpu_mpi_data_register_comm(starpu_data_handle_t data_handle, int tag, int rank, MPI_Comm comm); subroutine fstarpu_mpi_data_register_comm(dh,tag,rank,mpi_comm) bind(C) use iso_c_binding implicit none type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: tag integer(c_int), value, intent(in) :: rank integer(c_int), value, intent(in) :: mpi_comm end subroutine fstarpu_mpi_data_register_comm ! #define starpu_mpi_data_register(data_handle, tag, rank) starpu_mpi_data_register_comm(data_handle, tag, rank, MPI_COMM_WORLD) subroutine fstarpu_mpi_data_register(dh,tag,rank) bind(C) use iso_c_binding implicit none type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: tag integer(c_int), value, intent(in) :: rank end subroutine fstarpu_mpi_data_register ! void starpu_mpi_data_set_rank_comm(starpu_data_handle_t handle, int rank, MPI_Comm comm); subroutine fstarpu_mpi_data_set_rank_comm(dh,rank,mpi_comm) bind(C) use iso_c_binding implicit none type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: rank integer(c_int), value, intent(in) :: mpi_comm end subroutine fstarpu_mpi_data_set_rank_comm ! #define starpu_mpi_data_set_rank(handle, rank) starpu_mpi_data_set_rank_comm(handle, rank, MPI_COMM_WORLD) subroutine fstarpu_mpi_data_set_rank(dh,rank) bind(C) use iso_c_binding implicit none type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: rank end subroutine fstarpu_mpi_data_set_rank ! void starpu_mpi_data_set_tag(starpu_data_handle_t handle, int tag); subroutine fstarpu_mpi_data_set_tag(dh,tag) bind(C,name="starpu_mpi_data_set_tag") use iso_c_binding implicit none type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: tag end subroutine fstarpu_mpi_data_set_tag ! int starpu_mpi_data_get_rank(starpu_data_handle_t handle); function fstarpu_mpi_data_get_rank(dh) bind(C,name="starpu_mpi_data_get_rank") use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_data_get_rank type(c_ptr), value, intent(in) :: dh end function fstarpu_mpi_data_get_rank ! int starpu_mpi_data_get_tag(starpu_data_handle_t handle); function fstarpu_mpi_data_get_tag(dh) bind(C,name="starpu_mpi_data_get_tag") use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_data_get_tag type(c_ptr), value, intent(in) :: dh end function fstarpu_mpi_data_get_tag ! void starpu_mpi_data_migrate(MPI_Comm comm, starpu_data_handle_t handle, int rank); subroutine fstarpu_mpi_data_migrate(mpi_comm,dh,rank) bind(C) use iso_c_binding implicit none integer(c_int), value, intent(in) :: mpi_comm type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: rank end subroutine fstarpu_mpi_data_migrate ! #define STARPU_MPI_NODE_SELECTION_CURRENT_POLICY -1 ! #define STARPU_MPI_NODE_SELECTION_MOST_R_DATA 0 ! int starpu_mpi_node_selection_register_policy(starpu_mpi_select_node_policy_func_t policy_func); function fstarpu_mpi_node_selection_register_policy(policy_func) & bind(C,name="starpu_mpi_node_selection_register_policy") use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_node_selection_register_policy type(c_funptr), value, intent(in) :: policy_func end function fstarpu_mpi_node_selection_register_policy ! int starpu_mpi_node_selection_unregister_policy(int policy); function fstarpu_mpi_node_selection_unregister_policy(policy) & bind(C,name="starpu_mpi_node_selection_unregister_policy") use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_node_selection_unregister_policy type(c_ptr), value, intent(in) :: policy end function fstarpu_mpi_node_selection_unregister_policy ! int starpu_mpi_node_selection_get_current_policy(); function fstarpu_mpi_data_selection_get_current_policy() & bind(C,name="starpu_mpi_data_selection_get_current_policy") use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_data_selection_get_current_policy end function fstarpu_mpi_data_selection_get_current_policy ! int starpu_mpi_node_selection_set_current_policy(int policy); function fstarpu_mpi_data_selection_set_current_policy(policy) & bind(C,name="starpu_mpi_data_selection_set_current_policy") use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_data_selection_set_current_policy type(c_ptr), value, intent(in) :: policy end function fstarpu_mpi_data_selection_set_current_policy ! int starpu_mpi_cache_is_enabled(); function fstarpu_mpi_cache_is_enabled() bind(C,name="starpu_mpi_cache_is_enabled") use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_cache_is_enabled end function fstarpu_mpi_cache_is_enabled ! int starpu_mpi_cache_set(int enabled); function fstarpu_mpi_cache_set(enabled) bind(C,name="starpu_mpi_cache_set") use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_cache_set integer(c_int), value, intent(in) :: enabled end function fstarpu_mpi_cache_set ! int starpu_mpi_wait_for_all(MPI_Comm comm); function fstarpu_mpi_wait_for_all (mpi_comm) bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_wait_for_all integer(c_int), value, intent(in) :: mpi_comm end function fstarpu_mpi_wait_for_all ! int starpu_mpi_datatype_register(starpu_data_handle_t handle, starpu_mpi_datatype_allocate_func_t allocate_datatype_func, starpu_mpi_datatype_free_func_t free_datatype_func); function fstarpu_mpi_datatype_register(dh, alloc_func, free_func) bind(C,name="starpu_mpi_datatype_register") use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_datatype_register type(c_ptr), value, intent(in) :: dh type(c_funptr), value, intent(in) :: alloc_func type(c_funptr), value, intent(in) :: free_func end function fstarpu_mpi_datatype_register ! int starpu_mpi_datatype_unregister(starpu_data_handle_t handle); function fstarpu_mpi_datatype_unregister(dh) bind(C,name="starpu_mpi_datatype_unregister") use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_datatype_unregister type(c_ptr), value, intent(in) :: dh end function fstarpu_mpi_datatype_unregister function fstarpu_mpi_req_alloc() bind(C) use iso_c_binding implicit none type(c_ptr) :: fstarpu_mpi_req_alloc end function fstarpu_mpi_req_alloc subroutine fstarpu_mpi_req_free(req) bind(C) use iso_c_binding implicit none type(c_ptr),value,intent(in) :: req end subroutine fstarpu_mpi_req_free function fstarpu_mpi_status_alloc() bind(C) use iso_c_binding implicit none type(c_ptr) :: fstarpu_mpi_status_alloc end function fstarpu_mpi_status_alloc subroutine fstarpu_mpi_status_free(st) bind(C) use iso_c_binding implicit none type(c_ptr),value,intent(in) :: st end subroutine fstarpu_mpi_status_free end interface contains function fstarpu_mpi_init (initialize_mpi,mpi_comm) bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_init integer(c_int), intent(in) :: initialize_mpi integer(c_int), optional, intent(in) :: mpi_comm type(c_ptr) :: argcv integer(c_int) :: fargc,i,farg_len character(len=1) :: farg_1 character(len=:), allocatable :: farg integer(c_int) :: mpi_comm_present, mpi_comm_or_0 integer(c_int) :: ret interface function fstarpu_mpi_argcv_alloc(argc, initialize_mpi, comm_present, comm) bind(C) use iso_c_binding implicit none type(c_ptr) :: fstarpu_mpi_argcv_alloc integer(c_int),value,intent(in) :: argc integer(c_int),value,intent(in) :: initialize_mpi integer(c_int),value,intent(in) :: comm_present integer(c_int),value,intent(in) :: comm end function fstarpu_mpi_argcv_alloc subroutine fstarpu_mpi_argcv_set_arg(argcv, i, l, s) bind(C) use iso_c_binding implicit none type(c_ptr),value,intent(in) :: argcv integer(c_int),value,intent(in) :: i integer(c_int),value,intent(in) :: l character(c_char),intent(in) :: s end subroutine fstarpu_mpi_argcv_set_arg subroutine fstarpu_mpi_argcv_free(argcv) bind(C) use iso_c_binding implicit none type(c_ptr),value,intent(in) :: argcv end subroutine fstarpu_mpi_argcv_free function fstarpu_mpi_init_c(argcv) bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_init_c type(c_ptr),value,intent(in) :: argcv end function fstarpu_mpi_init_c end interface fargc = command_argument_count() write(*,*) "fargc",fargc if (present(mpi_comm)) then mpi_comm_present = 1 mpi_comm_or_0 = mpi_comm else mpi_comm_present = 0 mpi_comm_or_0 = 0 end if write(*,*) "initialize_mpi",initialize_mpi write(*,*) "mpi_comm_present",mpi_comm_present argcv = fstarpu_mpi_argcv_alloc(fargc, initialize_mpi, mpi_comm_present, mpi_comm_or_0) do i=0,fargc-1 call get_command_argument(i, farg_1, farg_len) allocate (character(len=farg_len) :: farg) call get_command_argument(i, farg) call fstarpu_mpi_argcv_set_arg(argcv, i, farg_len, farg) deallocate (farg) end do ret = fstarpu_mpi_init_c(argcv) call fstarpu_mpi_argcv_free(argcv) fstarpu_mpi_init = ret end function fstarpu_mpi_init end module fstarpu_mpi_mod starpu-1.2.3+dfsg/mpi/include/starpu_mpi.h000066400000000000000000000160601320135501600205150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012, 2014-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016 CNRS * Copyright (C) 2016 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_MPI_H__ #define __STARPU_MPI_H__ #include #if defined(STARPU_USE_MPI) #include #ifdef __cplusplus extern "C" { #endif typedef void *starpu_mpi_req; int starpu_mpi_isend(starpu_data_handle_t data_handle, starpu_mpi_req *req, int dest, int mpi_tag, MPI_Comm comm); int starpu_mpi_irecv(starpu_data_handle_t data_handle, starpu_mpi_req *req, int source, int mpi_tag, MPI_Comm comm); int starpu_mpi_send(starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm); int starpu_mpi_recv(starpu_data_handle_t data_handle, int source, int mpi_tag, MPI_Comm comm, MPI_Status *status); int starpu_mpi_isend_detached(starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm, void (*callback)(void *), void *arg); int starpu_mpi_irecv_detached(starpu_data_handle_t data_handle, int source, int mpi_tag, MPI_Comm comm, void (*callback)(void *), void *arg); int starpu_mpi_issend(starpu_data_handle_t data_handle, starpu_mpi_req *req, int dest, int mpi_tag, MPI_Comm comm); int starpu_mpi_issend_detached(starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm, void (*callback)(void *), void *arg); int starpu_mpi_wait(starpu_mpi_req *req, MPI_Status *status); int starpu_mpi_test(starpu_mpi_req *req, int *flag, MPI_Status *status); int starpu_mpi_barrier(MPI_Comm comm); int starpu_mpi_irecv_detached_sequential_consistency(starpu_data_handle_t data_handle, int source, int mpi_tag, MPI_Comm comm, void (*callback)(void *), void *arg, int sequential_consistency); int starpu_mpi_init_comm(int *argc, char ***argv, int initialize_mpi, MPI_Comm comm); int starpu_mpi_init(int *argc, char ***argv, int initialize_mpi); int starpu_mpi_initialize(void) STARPU_DEPRECATED; int starpu_mpi_initialize_extended(int *rank, int *world_size) STARPU_DEPRECATED; int starpu_mpi_shutdown(void); struct starpu_task *starpu_mpi_task_build(MPI_Comm comm, struct starpu_codelet *codelet, ...); int starpu_mpi_task_post_build(MPI_Comm comm, struct starpu_codelet *codelet, ...); int starpu_mpi_task_insert(MPI_Comm comm, struct starpu_codelet *codelet, ...); /* the function starpu_mpi_insert_task has the same semantics as starpu_mpi_task_insert, it is kept to avoid breaking old codes */ int starpu_mpi_insert_task(MPI_Comm comm, struct starpu_codelet *codelet, ...); void starpu_mpi_get_data_on_node(MPI_Comm comm, starpu_data_handle_t data_handle, int node); void starpu_mpi_get_data_on_node_detached(MPI_Comm comm, starpu_data_handle_t data_handle, int node, void (*callback)(void*), void *arg); void starpu_mpi_get_data_on_all_nodes_detached(MPI_Comm comm, starpu_data_handle_t data_handle); void starpu_mpi_redux_data(MPI_Comm comm, starpu_data_handle_t data_handle); int starpu_mpi_scatter_detached(starpu_data_handle_t *data_handles, int count, int root, MPI_Comm comm, void (*scallback)(void *), void *sarg, void (*rcallback)(void *), void *rarg); int starpu_mpi_gather_detached(starpu_data_handle_t *data_handles, int count, int root, MPI_Comm comm, void (*scallback)(void *), void *sarg, void (*rcallback)(void *), void *rarg); int starpu_mpi_isend_detached_unlock_tag(starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm, starpu_tag_t tag); int starpu_mpi_irecv_detached_unlock_tag(starpu_data_handle_t data_handle, int source, int mpi_tag, MPI_Comm comm, starpu_tag_t tag); int starpu_mpi_isend_array_detached_unlock_tag(unsigned array_size, starpu_data_handle_t *data_handle, int *dest, int *mpi_tag, MPI_Comm *comm, starpu_tag_t tag); int starpu_mpi_irecv_array_detached_unlock_tag(unsigned array_size, starpu_data_handle_t *data_handle, int *source, int *mpi_tag, MPI_Comm *comm, starpu_tag_t tag); void starpu_mpi_comm_amounts_retrieve(size_t *comm_amounts); void starpu_mpi_cache_flush(MPI_Comm comm, starpu_data_handle_t data_handle); void starpu_mpi_cache_flush_all_data(MPI_Comm comm); int starpu_mpi_cached_receive(starpu_data_handle_t data_handle); int starpu_mpi_cached_send(starpu_data_handle_t data_handle, int dest); int starpu_mpi_comm_size(MPI_Comm comm, int *size); int starpu_mpi_comm_rank(MPI_Comm comm, int *rank); int starpu_mpi_world_rank(void); int starpu_mpi_world_size(void); int starpu_mpi_get_communication_tag(void); void starpu_mpi_set_communication_tag(int tag); void starpu_mpi_data_register_comm(starpu_data_handle_t data_handle, int tag, int rank, MPI_Comm comm); #define starpu_mpi_data_register(data_handle, tag, rank) starpu_mpi_data_register_comm(data_handle, tag, rank, MPI_COMM_WORLD) #define STARPU_MPI_PER_NODE -2 void starpu_mpi_data_set_rank_comm(starpu_data_handle_t handle, int rank, MPI_Comm comm); #define starpu_mpi_data_set_rank(handle, rank) starpu_mpi_data_set_rank_comm(handle, rank, MPI_COMM_WORLD) void starpu_mpi_data_set_tag(starpu_data_handle_t handle, int tag); #define starpu_data_set_rank starpu_mpi_data_set_rank #define starpu_data_set_tag starpu_mpi_data_set_tag int starpu_mpi_data_get_rank(starpu_data_handle_t handle); int starpu_mpi_data_get_tag(starpu_data_handle_t handle); #define starpu_data_get_rank starpu_mpi_data_get_rank #define starpu_data_get_tag starpu_mpi_data_get_tag void starpu_mpi_data_migrate(MPI_Comm comm, starpu_data_handle_t handle, int new_rank); #define STARPU_MPI_NODE_SELECTION_CURRENT_POLICY -1 #define STARPU_MPI_NODE_SELECTION_MOST_R_DATA 0 typedef int (*starpu_mpi_select_node_policy_func_t)(int me, int nb_nodes, struct starpu_data_descr *descr, int nb_data); int starpu_mpi_node_selection_register_policy(starpu_mpi_select_node_policy_func_t policy_func); int starpu_mpi_node_selection_unregister_policy(int policy); int starpu_mpi_node_selection_get_current_policy(); int starpu_mpi_node_selection_set_current_policy(int policy); int starpu_mpi_cache_is_enabled(); int starpu_mpi_cache_set(int enabled); int starpu_mpi_wait_for_all(MPI_Comm comm); typedef void (*starpu_mpi_datatype_allocate_func_t)(starpu_data_handle_t, MPI_Datatype *); typedef void (*starpu_mpi_datatype_free_func_t)(MPI_Datatype *); int starpu_mpi_datatype_register(starpu_data_handle_t handle, starpu_mpi_datatype_allocate_func_t allocate_datatype_func, starpu_mpi_datatype_free_func_t free_datatype_func); int starpu_mpi_datatype_unregister(starpu_data_handle_t handle); #define STARPU_MPI_TAG_UB 1 int starpu_mpi_comm_get_attr(MPI_Comm comm, int keyval, void *attribute_val, int *flag); #ifdef __cplusplus } #endif #endif // STARPU_USE_MPI #endif // __STARPU_MPI_H__ starpu-1.2.3+dfsg/mpi/libstarpumpi.pc.in000066400000000000000000000021371320135501600202020ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2011, 2016 Université de Bordeaux # Copyright (C) 2010, 2011, 2012 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: starpumpi Description: offers MPI support for heterogeneous multicore architecture Version: @PACKAGE_VERSION@ Cflags: -I${includedir}/starpu/@STARPU_EFFECTIVE_VERSION@ -DSTARPU_USE_DEPRECATED_API Libs: -L${libdir} -lstarpumpi-@STARPU_EFFECTIVE_VERSION@ Libs.private: @LDFLAGS@ @LIBS@ @STARPU_EXPORTED_LIBS@ Requires: libstarpu Requires.private: starpu-1.2.3+dfsg/mpi/src/000077500000000000000000000000001320135501600153225ustar00rootroot00000000000000starpu-1.2.3+dfsg/mpi/src/Makefile.am000066400000000000000000000066751320135501600173740ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2012 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. CC=$(MPICC) CCLD=$(MPICC) BUILT_SOURCES = CLEANFILES = *.gcno *.gcda *.linkinfo AM_CFLAGS = -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(FXT_CFLAGS) $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) $(GLOBAL_AM_CFLAGS) LIBS = $(top_builddir)/src/@LIBSTARPU_LINK@ @LIBS@ $(FXT_LIBS) $(MAGMA_LIBS) AM_CPPFLAGS = -I$(top_srcdir)/include/ -I$(top_srcdir)/src/ -I$(top_builddir)/src -I$(top_builddir)/include -I$(top_srcdir)/mpi/include -I$(top_srcdir)/mpi/src AM_LDFLAGS = $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) $(STARPU_COI_LDFLAGS) $(STARPU_SCIF_LDFLAGS) ldflags = if STARPU_HAVE_WINDOWS LC_MESSAGES=C export LC_MESSAGES ldflags += -Xlinker --output-def -Xlinker .libs/libstarpumpi-@STARPU_EFFECTIVE_VERSION@.def if STARPU_HAVE_MS_LIB .libs/libstarpumpi-@STARPU_EFFECTIVE_VERSION@.lib: libstarpumpi-@STARPU_EFFECTIVE_VERSION@.la dolib ./dolib "$(STARPU_MS_LIB)" $(STARPU_MS_LIB_ARCH) .libs/libstarpumpi-@STARPU_EFFECTIVE_VERSION@.def @STARPU_EFFECTIVE_VERSION@ $(libstarpumpi_so_version) .libs/libstarpumpi-@STARPU_EFFECTIVE_VERSION@.lib all-local: .libs/libstarpumpi-@STARPU_EFFECTIVE_VERSION@.lib endif STARPU_HAVE_MS_LIB install-exec-hook: $(INSTALL) .libs/libstarpumpi-@STARPU_EFFECTIVE_VERSION@.def $(DESTDIR)$(libdir) if STARPU_HAVE_MS_LIB $(INSTALL) .libs/libstarpumpi-@STARPU_EFFECTIVE_VERSION@.lib $(DESTDIR)$(libdir) $(INSTALL) .libs/libstarpumpi-@STARPU_EFFECTIVE_VERSION@.exp $(DESTDIR)$(libdir) endif STARPU_HAVE_MS_LIB endif STARPU_HAVE_WINDOWS lib_LTLIBRARIES = libstarpumpi-@STARPU_EFFECTIVE_VERSION@.la libstarpumpi_@STARPU_EFFECTIVE_VERSION@_la_LIBADD = $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la libstarpumpi_@STARPU_EFFECTIVE_VERSION@_la_LDFLAGS = $(ldflags) -no-undefined \ -version-info $(LIBSTARPUMPI_INTERFACE_CURRENT):$(LIBSTARPUMPI_INTERFACE_REVISION):$(LIBSTARPUMPI_INTERFACE_AGE) \ $(MPICC_LDFLAGS) $(FXT_LDFLAGS) noinst_HEADERS = \ starpu_mpi_private.h \ starpu_mpi_fxt.h \ starpu_mpi_stats.h \ starpu_mpi_datatype.h \ starpu_mpi_cache.h \ starpu_mpi_select_node.h \ starpu_mpi_cache_stats.h \ starpu_mpi_early_data.h \ starpu_mpi_early_request.h \ starpu_mpi_sync_data.h \ starpu_mpi_comm.h \ starpu_mpi_tag.h \ starpu_mpi_task_insert.h libstarpumpi_@STARPU_EFFECTIVE_VERSION@_la_SOURCES = \ starpu_mpi.c \ starpu_mpi_helper.c \ starpu_mpi_datatype.c \ starpu_mpi_task_insert.c \ starpu_mpi_collective.c \ starpu_mpi_stats.c \ starpu_mpi_private.c \ starpu_mpi_cache.c \ starpu_mpi_select_node.c \ starpu_mpi_cache_stats.c \ starpu_mpi_early_data.c \ starpu_mpi_early_request.c \ starpu_mpi_sync_data.c \ starpu_mpi_comm.c \ starpu_mpi_tag.c \ starpu_mpi_fortran.c \ starpu_mpi_task_insert_fortran.c showcheck: -cat /dev/null starpu-1.2.3+dfsg/mpi/src/Makefile.in000066400000000000000000000765431320135501600174060ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2012 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @STARPU_HAVE_WINDOWS_TRUE@am__append_1 = -Xlinker --output-def -Xlinker .libs/libstarpumpi-@STARPU_EFFECTIVE_VERSION@.def subdir = mpi/src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) libstarpumpi_@STARPU_EFFECTIVE_VERSION@_la_DEPENDENCIES = \ $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la am_libstarpumpi_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS = starpu_mpi.lo \ starpu_mpi_helper.lo starpu_mpi_datatype.lo \ starpu_mpi_task_insert.lo starpu_mpi_collective.lo \ starpu_mpi_stats.lo starpu_mpi_private.lo starpu_mpi_cache.lo \ starpu_mpi_select_node.lo starpu_mpi_cache_stats.lo \ starpu_mpi_early_data.lo starpu_mpi_early_request.lo \ starpu_mpi_sync_data.lo starpu_mpi_comm.lo starpu_mpi_tag.lo \ starpu_mpi_fortran.lo starpu_mpi_task_insert_fortran.lo libstarpumpi_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS = \ $(am_libstarpumpi_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libstarpumpi_@STARPU_EFFECTIVE_VERSION@_la_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libstarpumpi_@STARPU_EFFECTIVE_VERSION@_la_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/common -I$(top_builddir)/include -I$(top_builddir)/gcc-plugin/include/starpu-gcc -I$(top_builddir)/starpu-top depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libstarpumpi_@STARPU_EFFECTIVE_VERSION@_la_SOURCES) DIST_SOURCES = $(libstarpumpi_@STARPU_EFFECTIVE_VERSION@_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/build-aux/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = $(MPICC) CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = $(top_builddir)/src/@LIBSTARPU_LINK@ @LIBS@ $(FXT_LIBS) $(MAGMA_LIBS) LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POTI_CFLAGS = @POTI_CFLAGS@ POTI_LIBS = @POTI_LIBS@ PROG_DATE = @PROG_DATE@ PROG_STAT = @PROG_STAT@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_COI_CPPFLAGS = @STARPU_COI_CPPFLAGS@ STARPU_COI_LDFLAGS = @STARPU_COI_LDFLAGS@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LEVELDB_LDFLAGS = @STARPU_LEVELDB_LDFLAGS@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RCCE_CFLAGS = @STARPU_RCCE_CFLAGS@ STARPU_RCCE_CPPFLAGS = @STARPU_RCCE_CPPFLAGS@ STARPU_RCCE_LDFLAGS = @STARPU_RCCE_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SCIF_CPPFLAGS = @STARPU_SCIF_CPPFLAGS@ STARPU_SCIF_LDFLAGS = @STARPU_SCIF_LDFLAGS@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SC_HYPERVISOR_DEBUG = @STARPU_SC_HYPERVISOR_DEBUG@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ mpifort_path = @mpifort_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ smpirun_path = @smpirun_path@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ CCLD = $(MPICC) BUILT_SOURCES = CLEANFILES = *.gcno *.gcda *.linkinfo AM_CFLAGS = -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(FXT_CFLAGS) $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) $(GLOBAL_AM_CFLAGS) AM_CPPFLAGS = -I$(top_srcdir)/include/ -I$(top_srcdir)/src/ -I$(top_builddir)/src -I$(top_builddir)/include -I$(top_srcdir)/mpi/include -I$(top_srcdir)/mpi/src AM_LDFLAGS = $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) $(STARPU_COI_LDFLAGS) $(STARPU_SCIF_LDFLAGS) ldflags = $(am__append_1) @STARPU_HAVE_WINDOWS_TRUE@LC_MESSAGES = C lib_LTLIBRARIES = libstarpumpi-@STARPU_EFFECTIVE_VERSION@.la libstarpumpi_@STARPU_EFFECTIVE_VERSION@_la_LIBADD = $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la libstarpumpi_@STARPU_EFFECTIVE_VERSION@_la_LDFLAGS = $(ldflags) -no-undefined \ -version-info $(LIBSTARPUMPI_INTERFACE_CURRENT):$(LIBSTARPUMPI_INTERFACE_REVISION):$(LIBSTARPUMPI_INTERFACE_AGE) \ $(MPICC_LDFLAGS) $(FXT_LDFLAGS) noinst_HEADERS = \ starpu_mpi_private.h \ starpu_mpi_fxt.h \ starpu_mpi_stats.h \ starpu_mpi_datatype.h \ starpu_mpi_cache.h \ starpu_mpi_select_node.h \ starpu_mpi_cache_stats.h \ starpu_mpi_early_data.h \ starpu_mpi_early_request.h \ starpu_mpi_sync_data.h \ starpu_mpi_comm.h \ starpu_mpi_tag.h \ starpu_mpi_task_insert.h libstarpumpi_@STARPU_EFFECTIVE_VERSION@_la_SOURCES = \ starpu_mpi.c \ starpu_mpi_helper.c \ starpu_mpi_datatype.c \ starpu_mpi_task_insert.c \ starpu_mpi_collective.c \ starpu_mpi_stats.c \ starpu_mpi_private.c \ starpu_mpi_cache.c \ starpu_mpi_select_node.c \ starpu_mpi_cache_stats.c \ starpu_mpi_early_data.c \ starpu_mpi_early_request.c \ starpu_mpi_sync_data.c \ starpu_mpi_comm.c \ starpu_mpi_tag.c \ starpu_mpi_fortran.c \ starpu_mpi_task_insert_fortran.c all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign mpi/src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign mpi/src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libstarpumpi-@STARPU_EFFECTIVE_VERSION@.la: $(libstarpumpi_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS) $(libstarpumpi_@STARPU_EFFECTIVE_VERSION@_la_DEPENDENCIES) $(EXTRA_libstarpumpi_@STARPU_EFFECTIVE_VERSION@_la_DEPENDENCIES) $(AM_V_CCLD)$(libstarpumpi_@STARPU_EFFECTIVE_VERSION@_la_LINK) -rpath $(libdir) $(libstarpumpi_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS) $(libstarpumpi_@STARPU_EFFECTIVE_VERSION@_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_cache.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_cache_stats.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_collective.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_comm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_datatype.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_early_data.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_early_request.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_fortran.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_helper.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_private.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_select_node.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_stats.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_sync_data.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_tag.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_task_insert.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_task_insert_fortran.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am @STARPU_HAVE_MS_LIB_FALSE@all-local: @STARPU_HAVE_WINDOWS_FALSE@all-local: all-am: Makefile $(LTLIBRARIES) $(HEADERS) all-local installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) @STARPU_HAVE_WINDOWS_FALSE@install-exec-hook: clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-exec-hook install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: all check install install-am install-exec-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am all-local check check-am clean \ clean-generic clean-libLTLIBRARIES clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-exec-hook install-html install-html-am \ install-info install-info-am install-libLTLIBRARIES \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-libLTLIBRARIES .PRECIOUS: Makefile @STARPU_HAVE_WINDOWS_TRUE@export LC_MESSAGES @STARPU_HAVE_MS_LIB_TRUE@@STARPU_HAVE_WINDOWS_TRUE@.libs/libstarpumpi-@STARPU_EFFECTIVE_VERSION@.lib: libstarpumpi-@STARPU_EFFECTIVE_VERSION@.la dolib @STARPU_HAVE_MS_LIB_TRUE@@STARPU_HAVE_WINDOWS_TRUE@ ./dolib "$(STARPU_MS_LIB)" $(STARPU_MS_LIB_ARCH) .libs/libstarpumpi-@STARPU_EFFECTIVE_VERSION@.def @STARPU_EFFECTIVE_VERSION@ $(libstarpumpi_so_version) .libs/libstarpumpi-@STARPU_EFFECTIVE_VERSION@.lib @STARPU_HAVE_MS_LIB_TRUE@@STARPU_HAVE_WINDOWS_TRUE@all-local: .libs/libstarpumpi-@STARPU_EFFECTIVE_VERSION@.lib @STARPU_HAVE_WINDOWS_TRUE@install-exec-hook: @STARPU_HAVE_WINDOWS_TRUE@ $(INSTALL) .libs/libstarpumpi-@STARPU_EFFECTIVE_VERSION@.def $(DESTDIR)$(libdir) @STARPU_HAVE_MS_LIB_TRUE@@STARPU_HAVE_WINDOWS_TRUE@ $(INSTALL) .libs/libstarpumpi-@STARPU_EFFECTIVE_VERSION@.lib $(DESTDIR)$(libdir) @STARPU_HAVE_MS_LIB_TRUE@@STARPU_HAVE_WINDOWS_TRUE@ $(INSTALL) .libs/libstarpumpi-@STARPU_EFFECTIVE_VERSION@.exp $(DESTDIR)$(libdir) showcheck: -cat /dev/null # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.2.3+dfsg/mpi/src/starpu_mpi.c000066400000000000000000002177501320135501600176650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2017 CNRS * Copyright (C) 2016 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* Number of ready requests to process before polling for completed requests */ #define NREADY_PROCESS 10 static void _starpu_mpi_add_sync_point_in_fxt(void); static void _starpu_mpi_submit_ready_request(void *arg); static void _starpu_mpi_handle_ready_request(struct _starpu_mpi_req *req); static void _starpu_mpi_handle_request_termination(struct _starpu_mpi_req *req); #ifdef STARPU_VERBOSE static char *_starpu_mpi_request_type(enum _starpu_mpi_request_type request_type); #endif static struct _starpu_mpi_req *_starpu_mpi_isend_common(starpu_data_handle_t data_handle, int dest, int data_tag, MPI_Comm comm, unsigned detached, unsigned sync, void (*callback)(void *), void *arg, int sequential_consistency); static struct _starpu_mpi_req *_starpu_mpi_irecv_common(starpu_data_handle_t data_handle, int source, int data_tag, MPI_Comm comm, unsigned detached, unsigned sync, void (*callback)(void *), void *arg, int sequential_consistency, int is_internal_req, starpu_ssize_t count); static void _starpu_mpi_handle_detached_request(struct _starpu_mpi_req *req); static void _starpu_mpi_early_data_cb(void* arg); /* The list of ready requests */ static struct _starpu_mpi_req_list ready_requests; /* The list of detached requests that have already been submitted to MPI */ static struct _starpu_mpi_req_list detached_requests; static starpu_pthread_mutex_t detached_requests_mutex; /* Condition to wake up progression thread */ static starpu_pthread_cond_t cond_progression; /* Condition to wake up waiting for all current MPI requests to finish */ static starpu_pthread_cond_t cond_finished; static starpu_pthread_mutex_t mutex; #ifndef STARPU_SIMGRID static starpu_pthread_t progress_thread; #endif static int running = 0; #ifdef STARPU_SIMGRID static int _mpi_world_size; static int _mpi_world_rank; #endif int _starpu_mpi_fake_world_size = -1; int _starpu_mpi_fake_world_rank = -1; /* Count requests posted by the application and not yet submitted to MPI */ static starpu_pthread_mutex_t mutex_posted_requests; static starpu_pthread_mutex_t mutex_ready_requests; static int posted_requests = 0, nready_requests = 0, newer_requests, barrier_running = 0; #define _STARPU_MPI_INC_POSTED_REQUESTS(value) { STARPU_PTHREAD_MUTEX_LOCK(&mutex_posted_requests); posted_requests += value; STARPU_PTHREAD_MUTEX_UNLOCK(&mutex_posted_requests); } #define _STARPU_MPI_INC_READY_REQUESTS(value) { STARPU_PTHREAD_MUTEX_LOCK(&mutex_ready_requests); nready_requests += value; STARPU_PTHREAD_MUTEX_UNLOCK(&mutex_ready_requests); } #pragma weak smpi_simulated_main_ extern int smpi_simulated_main_(int argc, char *argv[]); #pragma weak smpi_process_set_user_data #if !HAVE_DECL_SMPI_PROCESS_SET_USER_DATA extern void smpi_process_set_user_data(void *); #endif static void _starpu_mpi_request_init(struct _starpu_mpi_req **req) { _STARPU_MPI_CALLOC(*req, 1, sizeof(struct _starpu_mpi_req)); /* Initialize the request structure */ (*req)->data_handle = NULL; (*req)->datatype = 0; (*req)->datatype_name = NULL; (*req)->ptr = NULL; (*req)->count = -1; (*req)->registered_datatype = -1; (*req)->node_tag.rank = -1; (*req)->node_tag.data_tag = -1; (*req)->node_tag.comm = 0; (*req)->func = NULL; (*req)->status = NULL; (*req)->data_request = 0; (*req)->flag = NULL; (*req)->ret = -1; STARPU_PTHREAD_MUTEX_INIT(&((*req)->req_mutex), NULL); STARPU_PTHREAD_COND_INIT(&((*req)->req_cond), NULL); STARPU_PTHREAD_MUTEX_INIT(&((*req)->posted_mutex), NULL); STARPU_PTHREAD_COND_INIT(&((*req)->posted_cond), NULL); (*req)->request_type = UNKNOWN_REQ; (*req)->submitted = 0; (*req)->completed = 0; (*req)->posted = 0; (*req)->other_request = NULL; (*req)->sync = 0; (*req)->detached = -1; (*req)->callback = NULL; (*req)->callback_arg = NULL; (*req)->size_req = 0; (*req)->internal_req = NULL; (*req)->is_internal_req = 0; (*req)->to_destroy = 1; (*req)->early_data_handle = NULL; (*req)->envelope = NULL; (*req)->sequential_consistency = 1; (*req)->pre_sync_jobid = -1; (*req)->post_sync_jobid = -1; } static void _starpu_mpi_request_destroy(struct _starpu_mpi_req *req) { STARPU_PTHREAD_MUTEX_DESTROY(&req->req_mutex); STARPU_PTHREAD_COND_DESTROY(&req->req_cond); STARPU_PTHREAD_MUTEX_DESTROY(&req->posted_mutex); STARPU_PTHREAD_COND_DESTROY(&req->posted_cond); free(req->datatype_name); req->datatype_name = NULL; free(req); } /********************************************************/ /* */ /* Send/Receive functionalities */ /* */ /********************************************************/ struct _starpu_mpi_early_data_cb_args { starpu_data_handle_t data_handle; starpu_data_handle_t early_handle; struct _starpu_mpi_req *req; void *buffer; }; static void _starpu_mpi_submit_ready_request(void *arg) { _STARPU_MPI_LOG_IN(); struct _starpu_mpi_req *req = arg; _STARPU_MPI_INC_POSTED_REQUESTS(-1); _STARPU_MPI_DEBUG(0, "new req %p srcdst %d tag %d and type %s %d\n", req, req->node_tag.rank, req->node_tag.data_tag, _starpu_mpi_request_type(req->request_type), req->is_internal_req); STARPU_PTHREAD_MUTEX_LOCK(&mutex); if (req->request_type == RECV_REQ) { /* Case : the request is the internal receive request submitted * by StarPU-MPI to receive incoming data without a matching * early_request from the application. We immediately allocate the * pointer associated to the data_handle, and push it into the * ready_requests list, so as the real MPI request can be submitted * before the next submission of the envelope-catching request. */ if (req->is_internal_req) { _starpu_mpi_handle_allocate_datatype(req->data_handle, req); if (req->registered_datatype == 1) { req->count = 1; req->ptr = starpu_data_get_local_ptr(req->data_handle); } else { STARPU_ASSERT(req->count); _STARPU_MPI_MALLOC(req->ptr, req->count); } _STARPU_MPI_DEBUG(3, "Pushing internal starpu_mpi_irecv request %p type %s tag %d src %d data %p ptr %p datatype '%s' count %d registered_datatype %d \n", req, _starpu_mpi_request_type(req->request_type), req->node_tag.data_tag, req->node_tag.rank, req->data_handle, req->ptr, req->datatype_name, (int)req->count, req->registered_datatype); _starpu_mpi_req_list_push_front(&ready_requests, req); _STARPU_MPI_INC_READY_REQUESTS(+1); /* inform the starpu mpi thread that the request has been pushed in the ready_requests list */ STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); STARPU_PTHREAD_MUTEX_LOCK(&req->posted_mutex); req->posted = 1; STARPU_PTHREAD_COND_BROADCAST(&req->posted_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&req->posted_mutex); STARPU_PTHREAD_MUTEX_LOCK(&mutex); } else { /* test whether some data with the given tag and source have already been received by StarPU-MPI*/ struct _starpu_mpi_early_data_handle *early_data_handle = _starpu_mpi_early_data_find(&req->node_tag); /* Case: a receive request for a data with the given tag and source has already been * posted by StarPU. Asynchronously requests a Read permission over the temporary handle , * so as when the internal receive is completed, the _starpu_mpi_early_data_cb function * will be called to bring the data back to the original data handle associated to the request.*/ if (early_data_handle) { STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); STARPU_PTHREAD_MUTEX_LOCK(&(early_data_handle->req_mutex)); while (!(early_data_handle->req_ready)) STARPU_PTHREAD_COND_WAIT(&(early_data_handle->req_cond), &(early_data_handle->req_mutex)); STARPU_PTHREAD_MUTEX_UNLOCK(&(early_data_handle->req_mutex)); STARPU_PTHREAD_MUTEX_LOCK(&mutex); _STARPU_MPI_DEBUG(3, "The RECV request %p with tag %d has already been received, copying previously received data into handle's pointer..\n", req, req->node_tag.data_tag); STARPU_ASSERT(req->data_handle != early_data_handle->handle); req->internal_req = early_data_handle->req; req->early_data_handle = early_data_handle; struct _starpu_mpi_early_data_cb_args *cb_args; _STARPU_MPI_MALLOC(cb_args, sizeof(struct _starpu_mpi_early_data_cb_args)); cb_args->data_handle = req->data_handle; cb_args->early_handle = early_data_handle->handle; cb_args->buffer = early_data_handle->buffer; cb_args->req = req; _STARPU_MPI_DEBUG(3, "Calling data_acquire_cb on starpu_mpi_copy_cb..\n"); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); starpu_data_acquire_cb(early_data_handle->handle,STARPU_R,_starpu_mpi_early_data_cb,(void*) cb_args); STARPU_PTHREAD_MUTEX_LOCK(&mutex); } /* Case: no matching data has been received. Store the receive request as an early_request. */ else { struct _starpu_mpi_req *sync_req = _starpu_mpi_sync_data_find(req->node_tag.data_tag, req->node_tag.rank, req->node_tag.comm); _STARPU_MPI_DEBUG(3, "----------> Looking for sync data for tag %d and src %d = %p\n", req->node_tag.data_tag, req->node_tag.rank, sync_req); if (sync_req) { req->sync = 1; _starpu_mpi_handle_allocate_datatype(req->data_handle, req); if (req->registered_datatype == 1) { req->count = 1; req->ptr = starpu_data_get_local_ptr(req->data_handle); } else { req->count = sync_req->count; STARPU_ASSERT(req->count); _STARPU_MPI_MALLOC(req->ptr, req->count); } _starpu_mpi_req_list_push_front(&ready_requests, req); _STARPU_MPI_INC_READY_REQUESTS(+1); _starpu_mpi_request_destroy(sync_req); } else { _STARPU_MPI_DEBUG(3, "Adding the pending receive request %p (srcdst %d tag %d) into the request hashmap\n", req, req->node_tag.rank, req->node_tag.data_tag); _starpu_mpi_early_request_enqueue(req); } } } } else { _starpu_mpi_req_list_push_front(&ready_requests, req); _STARPU_MPI_INC_READY_REQUESTS(+1); _STARPU_MPI_DEBUG(3, "Pushing new request %p type %s tag %d src %d data %p ptr %p datatype '%s' count %d registered_datatype %d \n", req, _starpu_mpi_request_type(req->request_type), req->node_tag.data_tag, req->node_tag.rank, req->data_handle, req->ptr, req->datatype_name, (int)req->count, req->registered_datatype); } newer_requests = 1; STARPU_PTHREAD_COND_BROADCAST(&cond_progression); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); _STARPU_MPI_LOG_OUT(); } static void nop_acquire_cb(void *arg) { starpu_data_release(arg); } static struct _starpu_mpi_req *_starpu_mpi_isend_irecv_common(starpu_data_handle_t data_handle, int srcdst, int data_tag, MPI_Comm comm, unsigned detached, unsigned sync, void (*callback)(void *), void *arg, enum _starpu_mpi_request_type request_type, void (*func)(struct _starpu_mpi_req *), enum starpu_data_access_mode mode, int sequential_consistency, int is_internal_req, starpu_ssize_t count) { struct _starpu_mpi_req *req; if (_starpu_mpi_fake_world_size != -1) { /* Don't actually do the communication */ starpu_data_acquire_on_node_cb_sequential_consistency(data_handle, STARPU_MAIN_RAM, mode, nop_acquire_cb, data_handle, sequential_consistency); return NULL; } _STARPU_MPI_LOG_IN(); _STARPU_MPI_INC_POSTED_REQUESTS(1); _starpu_mpi_comm_register(comm); /* Initialize the request structure */ _starpu_mpi_request_init(&req); req->request_type = request_type; req->data_handle = data_handle; req->node_tag.rank = srcdst; req->node_tag.data_tag = data_tag; req->node_tag.comm = comm; req->detached = detached; req->sync = sync; req->callback = callback; req->callback_arg = arg; req->func = func; req->sequential_consistency = sequential_consistency; req->is_internal_req = is_internal_req; /* For internal requests, we wait for both the request completion and the matching application request completion */ req->to_destroy = !is_internal_req; req->count = count; /* Asynchronously request StarPU to fetch the data in main memory: when * it is available in main memory, _starpu_mpi_submit_ready_request(req) is called and * the request is actually submitted */ starpu_data_acquire_on_node_cb_sequential_consistency_sync_jobids(data_handle, STARPU_MAIN_RAM, mode, _starpu_mpi_submit_ready_request, (void *)req, sequential_consistency, &req->pre_sync_jobid, &req->post_sync_jobid); _STARPU_MPI_LOG_OUT(); return req; } /********************************************************/ /* */ /* Send functionalities */ /* */ /********************************************************/ static void _starpu_mpi_isend_data_func(struct _starpu_mpi_req *req) { _STARPU_MPI_LOG_IN(); _STARPU_MPI_DEBUG(0, "post MPI isend request %p type %s tag %d src %d data %p datasize %ld ptr %p datatype '%s' count %d registered_datatype %d sync %d\n", req, _starpu_mpi_request_type(req->request_type), req->node_tag.data_tag, req->node_tag.rank, req->data_handle, starpu_data_get_size(req->data_handle), req->ptr, req->datatype_name, (int)req->count, req->registered_datatype, req->sync); _starpu_mpi_comm_amounts_inc(req->node_tag.comm, req->node_tag.rank, req->datatype, req->count); _STARPU_MPI_TRACE_ISEND_SUBMIT_BEGIN(req->node_tag.rank, req->node_tag.data_tag, 0); if (req->sync == 0) { _STARPU_MPI_COMM_TO_DEBUG(req, req->count, req->datatype, req->node_tag.rank, _STARPU_MPI_TAG_DATA, req->node_tag.data_tag, req->node_tag.comm); req->ret = MPI_Isend(req->ptr, req->count, req->datatype, req->node_tag.rank, _STARPU_MPI_TAG_DATA, req->node_tag.comm, &req->data_request); STARPU_MPI_ASSERT_MSG(req->ret == MPI_SUCCESS, "MPI_Isend returning %s", _starpu_mpi_get_mpi_error_code(req->ret)); } else { _STARPU_MPI_COMM_TO_DEBUG(req, req->count, req->datatype, req->node_tag.rank, _STARPU_MPI_TAG_SYNC_DATA, req->node_tag.data_tag, req->node_tag.comm); req->ret = MPI_Issend(req->ptr, req->count, req->datatype, req->node_tag.rank, _STARPU_MPI_TAG_SYNC_DATA, req->node_tag.comm, &req->data_request); STARPU_MPI_ASSERT_MSG(req->ret == MPI_SUCCESS, "MPI_Issend returning %s", _starpu_mpi_get_mpi_error_code(req->ret)); } _STARPU_MPI_TRACE_ISEND_SUBMIT_END(req->node_tag.rank, req->node_tag.data_tag, starpu_data_get_size(req->data_handle), req->pre_sync_jobid); /* somebody is perhaps waiting for the MPI request to be posted */ STARPU_PTHREAD_MUTEX_LOCK(&req->req_mutex); req->submitted = 1; STARPU_PTHREAD_COND_BROADCAST(&req->req_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&req->req_mutex); _starpu_mpi_handle_detached_request(req); _STARPU_MPI_LOG_OUT(); } static void _starpu_mpi_isend_size_func(struct _starpu_mpi_req *req) { _starpu_mpi_handle_allocate_datatype(req->data_handle, req); _STARPU_MPI_CALLOC(req->envelope, 1, sizeof(struct _starpu_mpi_envelope)); req->envelope->mode = _STARPU_MPI_ENVELOPE_DATA; req->envelope->data_tag = req->node_tag.data_tag; req->envelope->sync = req->sync; if (req->registered_datatype == 1) { int size; req->count = 1; req->ptr = starpu_data_get_local_ptr(req->data_handle); MPI_Type_size(req->datatype, &size); req->envelope->size = (starpu_ssize_t)req->count * size; _STARPU_MPI_DEBUG(20, "Post MPI isend count (%ld) datatype_size %ld request to %d\n",req->count,starpu_data_get_size(req->data_handle), req->node_tag.rank); _STARPU_MPI_COMM_TO_DEBUG(req->envelope, sizeof(struct _starpu_mpi_envelope), MPI_BYTE, req->node_tag.rank, _STARPU_MPI_TAG_ENVELOPE, req->envelope->data_tag, req->node_tag.comm); MPI_Isend(req->envelope, sizeof(struct _starpu_mpi_envelope), MPI_BYTE, req->node_tag.rank, _STARPU_MPI_TAG_ENVELOPE, req->node_tag.comm, &req->size_req); } else { int ret; // Do not pack the data, just try to find out the size starpu_data_pack(req->data_handle, NULL, &(req->envelope->size)); if (req->envelope->size != -1) { // We already know the size of the data, let's send it to overlap with the packing of the data _STARPU_MPI_DEBUG(20, "Sending size %ld (%ld %s) to node %d (first call to pack)\n", req->envelope->size, sizeof(req->count), "MPI_BYTE", req->node_tag.rank); req->count = req->envelope->size; _STARPU_MPI_COMM_TO_DEBUG(req->envelope, sizeof(struct _starpu_mpi_envelope), MPI_BYTE, req->node_tag.rank, _STARPU_MPI_TAG_ENVELOPE, req->envelope->data_tag, req->node_tag.comm); ret = MPI_Isend(req->envelope, sizeof(struct _starpu_mpi_envelope), MPI_BYTE, req->node_tag.rank, _STARPU_MPI_TAG_ENVELOPE, req->node_tag.comm, &req->size_req); STARPU_MPI_ASSERT_MSG(ret == MPI_SUCCESS, "when sending size, MPI_Isend returning %s", _starpu_mpi_get_mpi_error_code(ret)); } // Pack the data starpu_data_pack(req->data_handle, &req->ptr, &req->count); if (req->envelope->size == -1) { // We know the size now, let's send it _STARPU_MPI_DEBUG(20, "Sending size %ld (%ld %s) to node %d (second call to pack)\n", req->envelope->size, sizeof(req->count), "MPI_BYTE", req->node_tag.rank); _STARPU_MPI_COMM_TO_DEBUG(req->envelope, sizeof(struct _starpu_mpi_envelope), MPI_BYTE, req->node_tag.rank, _STARPU_MPI_TAG_ENVELOPE, req->envelope->data_tag, req->node_tag.comm); ret = MPI_Isend(req->envelope, sizeof(struct _starpu_mpi_envelope), MPI_BYTE, req->node_tag.rank, _STARPU_MPI_TAG_ENVELOPE, req->node_tag.comm, &req->size_req); STARPU_MPI_ASSERT_MSG(ret == MPI_SUCCESS, "when sending size, MPI_Isend returning %s", _starpu_mpi_get_mpi_error_code(ret)); } else { // We check the size returned with the 2 calls to pack is the same STARPU_MPI_ASSERT_MSG(req->count == req->envelope->size, "Calls to pack_data returned different sizes %ld != %ld", req->count, req->envelope->size); } // We can send the data now } if (req->sync) { // If the data is to be sent in synchronous mode, we need to wait for the receiver ready message _starpu_mpi_sync_data_add(req); } else { // Otherwise we can send the data _starpu_mpi_isend_data_func(req); } } static struct _starpu_mpi_req *_starpu_mpi_isend_common(starpu_data_handle_t data_handle, int dest, int data_tag, MPI_Comm comm, unsigned detached, unsigned sync, void (*callback)(void *), void *arg, int sequential_consistency) { return _starpu_mpi_isend_irecv_common(data_handle, dest, data_tag, comm, detached, sync, callback, arg, SEND_REQ, _starpu_mpi_isend_size_func, STARPU_R, sequential_consistency, 0, 0); } int starpu_mpi_isend(starpu_data_handle_t data_handle, starpu_mpi_req *public_req, int dest, int data_tag, MPI_Comm comm) { _STARPU_MPI_LOG_IN(); STARPU_MPI_ASSERT_MSG(public_req, "starpu_mpi_isend needs a valid starpu_mpi_req"); struct _starpu_mpi_req *req; _STARPU_MPI_TRACE_ISEND_COMPLETE_BEGIN(dest, data_tag, 0); req = _starpu_mpi_isend_common(data_handle, dest, data_tag, comm, 0, 0, NULL, NULL, 1); _STARPU_MPI_TRACE_ISEND_COMPLETE_END(dest, data_tag, 0); STARPU_MPI_ASSERT_MSG(req, "Invalid return for _starpu_mpi_isend_common"); *public_req = req; _STARPU_MPI_LOG_OUT(); return 0; } int starpu_mpi_isend_detached(starpu_data_handle_t data_handle, int dest, int data_tag, MPI_Comm comm, void (*callback)(void *), void *arg) { _STARPU_MPI_LOG_IN(); _starpu_mpi_isend_common(data_handle, dest, data_tag, comm, 1, 0, callback, arg, 1); _STARPU_MPI_LOG_OUT(); return 0; } int starpu_mpi_send(starpu_data_handle_t data_handle, int dest, int data_tag, MPI_Comm comm) { starpu_mpi_req req; MPI_Status status; _STARPU_MPI_LOG_IN(); memset(&status, 0, sizeof(MPI_Status)); starpu_mpi_isend(data_handle, &req, dest, data_tag, comm); starpu_mpi_wait(&req, &status); _STARPU_MPI_LOG_OUT(); return 0; } int starpu_mpi_issend(starpu_data_handle_t data_handle, starpu_mpi_req *public_req, int dest, int data_tag, MPI_Comm comm) { _STARPU_MPI_LOG_IN(); STARPU_MPI_ASSERT_MSG(public_req, "starpu_mpi_issend needs a valid starpu_mpi_req"); struct _starpu_mpi_req *req; req = _starpu_mpi_isend_common(data_handle, dest, data_tag, comm, 0, 1, NULL, NULL, 1); STARPU_MPI_ASSERT_MSG(req, "Invalid return for _starpu_mpi_isend_common"); *public_req = req; _STARPU_MPI_LOG_OUT(); return 0; } int starpu_mpi_issend_detached(starpu_data_handle_t data_handle, int dest, int data_tag, MPI_Comm comm, void (*callback)(void *), void *arg) { _STARPU_MPI_LOG_IN(); _starpu_mpi_isend_common(data_handle, dest, data_tag, comm, 1, 1, callback, arg, 1); _STARPU_MPI_LOG_OUT(); return 0; } /********************************************************/ /* */ /* receive functionalities */ /* */ /********************************************************/ static void _starpu_mpi_irecv_data_func(struct _starpu_mpi_req *req) { _STARPU_MPI_LOG_IN(); _STARPU_MPI_DEBUG(0, "post MPI irecv request %p type %s tag %d src %d data %p ptr %p datatype '%s' count %d registered_datatype %d \n", req, _starpu_mpi_request_type(req->request_type), req->node_tag.data_tag, req->node_tag.rank, req->data_handle, req->ptr, req->datatype_name, (int)req->count, req->registered_datatype); _STARPU_MPI_TRACE_IRECV_SUBMIT_BEGIN(req->node_tag.rank, req->node_tag.data_tag); if (req->sync) { struct _starpu_mpi_envelope *_envelope; _STARPU_MPI_CALLOC(_envelope, 1, sizeof(struct _starpu_mpi_envelope)); _envelope->mode = _STARPU_MPI_ENVELOPE_SYNC_READY; _envelope->data_tag = req->node_tag.data_tag; _STARPU_MPI_DEBUG(20, "Telling node %d it can send the data and waiting for the data back ...\n", req->node_tag.rank); _STARPU_MPI_COMM_TO_DEBUG(_envelope, sizeof(struct _starpu_mpi_envelope), MPI_BYTE, req->node_tag.rank, _STARPU_MPI_TAG_ENVELOPE, _envelope->data_tag, req->node_tag.comm); req->ret = MPI_Send(_envelope, sizeof(struct _starpu_mpi_envelope), MPI_BYTE, req->node_tag.rank, _STARPU_MPI_TAG_ENVELOPE, req->node_tag.comm); STARPU_MPI_ASSERT_MSG(req->ret == MPI_SUCCESS, "MPI_Send returning %s", _starpu_mpi_get_mpi_error_code(req->ret)); free(_envelope); _envelope = NULL; } if (req->sync) { _STARPU_MPI_COMM_FROM_DEBUG(req, req->count, req->datatype, req->node_tag.rank, _STARPU_MPI_TAG_SYNC_DATA, req->node_tag.data_tag, req->node_tag.comm); req->ret = MPI_Irecv(req->ptr, req->count, req->datatype, req->node_tag.rank, _STARPU_MPI_TAG_SYNC_DATA, req->node_tag.comm, &req->data_request); } else { _STARPU_MPI_COMM_FROM_DEBUG(req, req->count, req->datatype, req->node_tag.rank, _STARPU_MPI_TAG_DATA, req->node_tag.data_tag, req->node_tag.comm); req->ret = MPI_Irecv(req->ptr, req->count, req->datatype, req->node_tag.rank, _STARPU_MPI_TAG_DATA, req->node_tag.comm, &req->data_request); } STARPU_MPI_ASSERT_MSG(req->ret == MPI_SUCCESS, "MPI_IRecv returning %s", _starpu_mpi_get_mpi_error_code(req->ret)); _STARPU_MPI_TRACE_IRECV_SUBMIT_END(req->node_tag.rank, req->node_tag.data_tag); /* somebody is perhaps waiting for the MPI request to be posted */ STARPU_PTHREAD_MUTEX_LOCK(&req->req_mutex); req->submitted = 1; STARPU_PTHREAD_COND_BROADCAST(&req->req_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&req->req_mutex); _starpu_mpi_handle_detached_request(req); _STARPU_MPI_LOG_OUT(); } static struct _starpu_mpi_req *_starpu_mpi_irecv_common(starpu_data_handle_t data_handle, int source, int data_tag, MPI_Comm comm, unsigned detached, unsigned sync, void (*callback)(void *), void *arg, int sequential_consistency, int is_internal_req, starpu_ssize_t count) { return _starpu_mpi_isend_irecv_common(data_handle, source, data_tag, comm, detached, sync, callback, arg, RECV_REQ, _starpu_mpi_irecv_data_func, STARPU_W, sequential_consistency, is_internal_req, count); } int starpu_mpi_irecv(starpu_data_handle_t data_handle, starpu_mpi_req *public_req, int source, int data_tag, MPI_Comm comm) { _STARPU_MPI_LOG_IN(); STARPU_MPI_ASSERT_MSG(public_req, "starpu_mpi_irecv needs a valid starpu_mpi_req"); // // We check if a tag is defined for the data handle, if not, // // we define the one given for the communication. // // A tag is necessary for the internal mpi engine. // int tag = starpu_data_get_tag(data_handle); // if (tag == -1) // starpu_data_set_tag(data_handle, data_tag); struct _starpu_mpi_req *req; _STARPU_MPI_TRACE_IRECV_COMPLETE_BEGIN(source, data_tag); req = _starpu_mpi_irecv_common(data_handle, source, data_tag, comm, 0, 0, NULL, NULL, 1, 0, 0); _STARPU_MPI_TRACE_IRECV_COMPLETE_END(source, data_tag); STARPU_MPI_ASSERT_MSG(req, "Invalid return for _starpu_mpi_irecv_common"); *public_req = req; _STARPU_MPI_LOG_OUT(); return 0; } int starpu_mpi_irecv_detached(starpu_data_handle_t data_handle, int source, int data_tag, MPI_Comm comm, void (*callback)(void *), void *arg) { _STARPU_MPI_LOG_IN(); // // We check if a tag is defined for the data handle, if not, // // we define the one given for the communication. // // A tag is necessary for the internal mpi engine. // int tag = starpu_data_get_tag(data_handle); // if (tag == -1) // starpu_data_set_tag(data_handle, data_tag); _starpu_mpi_irecv_common(data_handle, source, data_tag, comm, 1, 0, callback, arg, 1, 0, 0); _STARPU_MPI_LOG_OUT(); return 0; } int starpu_mpi_irecv_detached_sequential_consistency(starpu_data_handle_t data_handle, int source, int data_tag, MPI_Comm comm, void (*callback)(void *), void *arg, int sequential_consistency) { _STARPU_MPI_LOG_IN(); // // We check if a tag is defined for the data handle, if not, // // we define the one given for the communication. // // A tag is necessary for the internal mpi engine. // int tag = starpu_data_get_tag(data_handle); // if (tag == -1) // starpu_data_set_tag(data_handle, data_tag); _starpu_mpi_irecv_common(data_handle, source, data_tag, comm, 1, 0, callback, arg, sequential_consistency, 0, 0); _STARPU_MPI_LOG_OUT(); return 0; } int starpu_mpi_recv(starpu_data_handle_t data_handle, int source, int data_tag, MPI_Comm comm, MPI_Status *status) { starpu_mpi_req req; _STARPU_MPI_LOG_IN(); // // We check if a tag is defined for the data handle, if not, // // we define the one given for the communication. // // A tag is necessary for the internal mpi engine. // int tag = starpu_data_get_tag(data_handle); // if (tag == -1) // starpu_data_set_tag(data_handle, data_tag); starpu_mpi_irecv(data_handle, &req, source, data_tag, comm); starpu_mpi_wait(&req, status); _STARPU_MPI_LOG_OUT(); return 0; } /********************************************************/ /* */ /* Wait functionalities */ /* */ /********************************************************/ static void _starpu_mpi_wait_func(struct _starpu_mpi_req *waiting_req) { _STARPU_MPI_LOG_IN(); /* Which is the mpi request we are waiting for ? */ struct _starpu_mpi_req *req = waiting_req->other_request; _STARPU_MPI_TRACE_UWAIT_BEGIN(req->node_tag.rank, req->node_tag.data_tag); if (req->data_request != MPI_REQUEST_NULL) { req->ret = MPI_Wait(&req->data_request, waiting_req->status); STARPU_MPI_ASSERT_MSG(req->ret == MPI_SUCCESS, "MPI_Wait returning %s", _starpu_mpi_get_mpi_error_code(req->ret)); } _STARPU_MPI_TRACE_UWAIT_END(req->node_tag.rank, req->node_tag.data_tag); _starpu_mpi_handle_request_termination(req); _STARPU_MPI_LOG_OUT(); } int starpu_mpi_wait(starpu_mpi_req *public_req, MPI_Status *status) { int ret; struct _starpu_mpi_req *req = *public_req; struct _starpu_mpi_req *waiting_req; _STARPU_MPI_LOG_IN(); _STARPU_MPI_INC_POSTED_REQUESTS(1); /* We cannot try to complete a MPI request that was not actually posted * to MPI yet. */ STARPU_PTHREAD_MUTEX_LOCK(&(req->req_mutex)); while (!(req->submitted)) STARPU_PTHREAD_COND_WAIT(&(req->req_cond), &(req->req_mutex)); STARPU_PTHREAD_MUTEX_UNLOCK(&(req->req_mutex)); /* Initialize the request structure */ _starpu_mpi_request_init(&waiting_req); waiting_req->status = status; waiting_req->other_request = req; waiting_req->func = _starpu_mpi_wait_func; waiting_req->request_type = WAIT_REQ; _starpu_mpi_submit_ready_request(waiting_req); /* We wait for the MPI request to finish */ STARPU_PTHREAD_MUTEX_LOCK(&req->req_mutex); while (!req->completed) STARPU_PTHREAD_COND_WAIT(&req->req_cond, &req->req_mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&req->req_mutex); ret = req->ret; /* The internal request structure was automatically allocated */ *public_req = NULL; if (req->internal_req) { _starpu_mpi_request_destroy(req->internal_req); } _starpu_mpi_request_destroy(req); _starpu_mpi_request_destroy(waiting_req); _STARPU_MPI_LOG_OUT(); return ret; } /********************************************************/ /* */ /* Test functionalities */ /* */ /********************************************************/ static void _starpu_mpi_test_func(struct _starpu_mpi_req *testing_req) { _STARPU_MPI_LOG_IN(); /* Which is the mpi request we are testing for ? */ struct _starpu_mpi_req *req = testing_req->other_request; _STARPU_MPI_DEBUG(0, "Test request %p type %s tag %d src %d data %p ptr %p datatype '%s' count %d registered_datatype %d \n", req, _starpu_mpi_request_type(req->request_type), req->node_tag.data_tag, req->node_tag.rank, req->data_handle, req->ptr, req->datatype_name, (int)req->count, req->registered_datatype); _STARPU_MPI_TRACE_UTESTING_BEGIN(req->node_tag.rank, req->node_tag.data_tag); req->ret = MPI_Test(&req->data_request, testing_req->flag, testing_req->status); STARPU_MPI_ASSERT_MSG(req->ret == MPI_SUCCESS, "MPI_Test returning %s", _starpu_mpi_get_mpi_error_code(req->ret)); _STARPU_MPI_TRACE_UTESTING_END(req->node_tag.rank, req->node_tag.data_tag); if (*testing_req->flag) { testing_req->ret = req->ret; _starpu_mpi_handle_request_termination(req); } STARPU_PTHREAD_MUTEX_LOCK(&testing_req->req_mutex); testing_req->completed = 1; STARPU_PTHREAD_COND_SIGNAL(&testing_req->req_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&testing_req->req_mutex); _STARPU_MPI_LOG_OUT(); } int starpu_mpi_test(starpu_mpi_req *public_req, int *flag, MPI_Status *status) { _STARPU_MPI_LOG_IN(); int ret = 0; STARPU_MPI_ASSERT_MSG(public_req, "starpu_mpi_test needs a valid starpu_mpi_req"); struct _starpu_mpi_req *req = *public_req; STARPU_MPI_ASSERT_MSG(!req->detached, "MPI_Test cannot be called on a detached request"); STARPU_PTHREAD_MUTEX_LOCK(&req->req_mutex); unsigned submitted = req->submitted; STARPU_PTHREAD_MUTEX_UNLOCK(&req->req_mutex); if (submitted) { struct _starpu_mpi_req *testing_req; _starpu_mpi_request_init(&testing_req); /* Initialize the request structure */ STARPU_PTHREAD_MUTEX_INIT(&(testing_req->req_mutex), NULL); STARPU_PTHREAD_COND_INIT(&(testing_req->req_cond), NULL); testing_req->flag = flag; testing_req->status = status; testing_req->other_request = req; testing_req->func = _starpu_mpi_test_func; testing_req->completed = 0; testing_req->request_type = TEST_REQ; _STARPU_MPI_INC_POSTED_REQUESTS(1); _starpu_mpi_submit_ready_request(testing_req); /* We wait for the test request to finish */ STARPU_PTHREAD_MUTEX_LOCK(&(testing_req->req_mutex)); while (!(testing_req->completed)) STARPU_PTHREAD_COND_WAIT(&(testing_req->req_cond), &(testing_req->req_mutex)); STARPU_PTHREAD_MUTEX_UNLOCK(&(testing_req->req_mutex)); ret = testing_req->ret; if (*(testing_req->flag)) { /* The request was completed so we free the internal * request structure which was automatically allocated * */ *public_req = NULL; if (req->internal_req) { _starpu_mpi_request_destroy(req->internal_req); } _starpu_mpi_request_destroy(req); } _starpu_mpi_request_destroy(testing_req); } else { *flag = 0; } _STARPU_MPI_LOG_OUT(); return ret; } /********************************************************/ /* */ /* Barrier functionalities */ /* */ /********************************************************/ static void _starpu_mpi_barrier_func(struct _starpu_mpi_req *barrier_req) { _STARPU_MPI_LOG_IN(); barrier_req->ret = MPI_Barrier(barrier_req->node_tag.comm); STARPU_MPI_ASSERT_MSG(barrier_req->ret == MPI_SUCCESS, "MPI_Barrier returning %s", _starpu_mpi_get_mpi_error_code(barrier_req->ret)); _starpu_mpi_handle_request_termination(barrier_req); _STARPU_MPI_LOG_OUT(); } int _starpu_mpi_barrier(MPI_Comm comm) { struct _starpu_mpi_req *barrier_req; int ret = posted_requests+nready_requests; _STARPU_MPI_LOG_IN(); /* First wait for *both* all tasks and MPI requests to finish, in case * some tasks generate MPI requests, MPI requests generate tasks, etc. */ STARPU_PTHREAD_MUTEX_LOCK(&mutex); STARPU_MPI_ASSERT_MSG(!barrier_running, "Concurrent starpu_mpi_barrier is not implemented, even on different communicators"); barrier_running = 1; do { while (posted_requests || nready_requests) /* Wait for all current MPI requests to finish */ STARPU_PTHREAD_COND_WAIT(&cond_finished, &mutex); /* No current request, clear flag */ newer_requests = 0; STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); /* Now wait for all tasks */ starpu_task_wait_for_all(); STARPU_PTHREAD_MUTEX_LOCK(&mutex); /* Check newer_requests again, in case some MPI requests * triggered by tasks completed and triggered tasks between * wait_for_all finished and we take the lock */ } while (posted_requests || nready_requests || newer_requests); barrier_running = 0; STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); /* Initialize the request structure */ _starpu_mpi_request_init(&barrier_req); STARPU_PTHREAD_MUTEX_INIT(&(barrier_req->req_mutex), NULL); STARPU_PTHREAD_COND_INIT(&(barrier_req->req_cond), NULL); barrier_req->func = _starpu_mpi_barrier_func; barrier_req->request_type = BARRIER_REQ; barrier_req->node_tag.comm = comm; _STARPU_MPI_INC_POSTED_REQUESTS(1); _starpu_mpi_submit_ready_request(barrier_req); /* We wait for the MPI request to finish */ STARPU_PTHREAD_MUTEX_LOCK(&barrier_req->req_mutex); while (!barrier_req->completed) STARPU_PTHREAD_COND_WAIT(&barrier_req->req_cond, &barrier_req->req_mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&barrier_req->req_mutex); _starpu_mpi_request_destroy(barrier_req); _STARPU_MPI_LOG_OUT(); return ret; } int starpu_mpi_barrier(MPI_Comm comm) { _starpu_mpi_barrier(comm); return 0; } /********************************************************/ /* */ /* Progression */ /* */ /********************************************************/ #ifdef STARPU_VERBOSE static char *_starpu_mpi_request_type(enum _starpu_mpi_request_type request_type) { switch (request_type) { case SEND_REQ: return "SEND_REQ"; case RECV_REQ: return "RECV_REQ"; case WAIT_REQ: return "WAIT_REQ"; case TEST_REQ: return "TEST_REQ"; case BARRIER_REQ: return "BARRIER_REQ"; case UNKNOWN_REQ: return "UNSET_REQ"; default: return "unknown request type"; } } #endif static void _starpu_mpi_handle_request_termination(struct _starpu_mpi_req *req) { _STARPU_MPI_LOG_IN(); _STARPU_MPI_DEBUG(2, "complete MPI request %p type %s tag %d src %d data %p ptr %p datatype '%s' count %d registered_datatype %d internal_req %p\n", req, _starpu_mpi_request_type(req->request_type), req->node_tag.data_tag, req->node_tag.rank, req->data_handle, req->ptr, req->datatype_name, (int)req->count, req->registered_datatype, req->internal_req); if (req->internal_req) { free(req->early_data_handle); req->early_data_handle = NULL; } else { if (req->request_type == RECV_REQ || req->request_type == SEND_REQ) { if (req->registered_datatype == 0) { if (req->request_type == SEND_REQ) { // We need to make sure the communication for sending the size // has completed, as MPI can re-order messages, let's call // MPI_Wait to make sure data have been sent int ret; ret = MPI_Wait(&req->size_req, MPI_STATUS_IGNORE); STARPU_MPI_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Wait returning %s", _starpu_mpi_get_mpi_error_code(ret)); free(req->ptr); req->ptr = NULL; } else if (req->request_type == RECV_REQ) { // req->ptr is freed by starpu_data_unpack starpu_data_unpack(req->data_handle, req->ptr, req->count); starpu_memory_deallocate(STARPU_MAIN_RAM, req->count); } } else { _starpu_mpi_handle_free_datatype(req->data_handle, &req->datatype); } } _STARPU_MPI_TRACE_TERMINATED(req, req->node_tag.rank, req->node_tag.data_tag); } if (req->data_handle) starpu_data_release(req->data_handle); if (req->envelope) { free(req->envelope); req->envelope = NULL; } /* Execute the specified callback, if any */ if (req->callback) req->callback(req->callback_arg); /* tell anyone potentially waiting on the request that it is * terminated now */ STARPU_PTHREAD_MUTEX_LOCK(&req->req_mutex); req->completed = 1; STARPU_PTHREAD_COND_BROADCAST(&req->req_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&req->req_mutex); _STARPU_MPI_LOG_OUT(); } static void _starpu_mpi_early_data_cb(void* arg) { struct _starpu_mpi_early_data_cb_args *args = arg; if (args->buffer) { /* Data has been received as a raw memory, it has to be unpacked */ struct starpu_data_interface_ops *itf_src = starpu_data_get_interface_ops(args->early_handle); struct starpu_data_interface_ops *itf_dst = starpu_data_get_interface_ops(args->data_handle); STARPU_MPI_ASSERT_MSG(itf_dst->unpack_data, "The data interface does not define an unpack function\n"); itf_dst->unpack_data(args->data_handle, STARPU_MAIN_RAM, args->buffer, itf_src->get_size(args->early_handle)); free(args->buffer); args->buffer = NULL; } else { struct starpu_data_interface_ops *itf = starpu_data_get_interface_ops(args->early_handle); void* itf_src = starpu_data_get_interface_on_node(args->early_handle, STARPU_MAIN_RAM); void* itf_dst = starpu_data_get_interface_on_node(args->data_handle, STARPU_MAIN_RAM); if (!itf->copy_methods->ram_to_ram) { _STARPU_MPI_DEBUG(3, "Initiating any_to_any copy..\n"); itf->copy_methods->any_to_any(itf_src, STARPU_MAIN_RAM, itf_dst, STARPU_MAIN_RAM, NULL); } else { _STARPU_MPI_DEBUG(3, "Initiating ram_to_ram copy..\n"); itf->copy_methods->ram_to_ram(itf_src, STARPU_MAIN_RAM, itf_dst, STARPU_MAIN_RAM); } } _STARPU_MPI_DEBUG(3, "Done, handling release of early_handle..\n"); starpu_data_release(args->early_handle); _STARPU_MPI_DEBUG(3, "Done, handling unregister of early_handle..\n"); starpu_data_unregister_submit(args->early_handle); _STARPU_MPI_DEBUG(3, "Done, handling request %p termination of the already received request\n",args->req); // If the request is detached, we need to call _starpu_mpi_handle_request_termination // as it will not be called automatically as the request is not in the list detached_requests if (args->req) { if (args->req->detached) { /* have the internal request destroyed now or when completed */ STARPU_PTHREAD_MUTEX_LOCK(&args->req->internal_req->req_mutex); if (args->req->internal_req->to_destroy) { /* The request completed first, can now destroy it */ STARPU_PTHREAD_MUTEX_UNLOCK(&args->req->internal_req->req_mutex); _starpu_mpi_request_destroy(args->req->internal_req); } else { /* The request didn't complete yet, tell it to destroy it when it completes */ args->req->internal_req->to_destroy = 1; STARPU_PTHREAD_MUTEX_UNLOCK(&args->req->internal_req->req_mutex); } _starpu_mpi_handle_request_termination(args->req); _starpu_mpi_request_destroy(args->req); } else { // else: If the request is not detached its termination will // be handled when calling starpu_mpi_wait // We store in the application request the internal MPI // request so that it can be used by starpu_mpi_wait args->req->data_request = args->req->internal_req->data_request; STARPU_PTHREAD_MUTEX_LOCK(&args->req->req_mutex); args->req->submitted = 1; STARPU_PTHREAD_COND_BROADCAST(&args->req->req_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&args->req->req_mutex); } } free(args); args = NULL; } #ifdef STARPU_MPI_ACTIVITY static unsigned _starpu_mpi_progression_hook_func(void *arg STARPU_ATTRIBUTE_UNUSED) { unsigned may_block = 1; STARPU_PTHREAD_MUTEX_LOCK(&detached_requests_mutex); if (!_starpu_mpi_req_list_empty(detached_requests)) { STARPU_PTHREAD_MUTEX_UNLOCK(&detached_requests_mutex); STARPU_PTHREAD_MUTEX_LOCK(&mutex); STARPU_PTHREAD_COND_SIGNAL(&cond_progression); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); may_block = 0; } else STARPU_PTHREAD_MUTEX_UNLOCK(&detached_requests_mutex); return may_block; } #endif /* STARPU_MPI_ACTIVITY */ static void _starpu_mpi_test_detached_requests(void) { //_STARPU_MPI_LOG_IN(); int flag; MPI_Status status; struct _starpu_mpi_req *req; STARPU_PTHREAD_MUTEX_LOCK(&detached_requests_mutex); if (_starpu_mpi_req_list_empty(&detached_requests)) { STARPU_PTHREAD_MUTEX_UNLOCK(&detached_requests_mutex); //_STARPU_MPI_LOG_OUT(); return; } _STARPU_MPI_TRACE_TESTING_DETACHED_BEGIN(); req = _starpu_mpi_req_list_begin(&detached_requests); while (req != _starpu_mpi_req_list_end(&detached_requests)) { STARPU_PTHREAD_MUTEX_UNLOCK(&detached_requests_mutex); STARPU_MPI_ASSERT_MSG(req->data_request != MPI_REQUEST_NULL, "Cannot test completion of the request MPI_REQUEST_NULL"); _STARPU_MPI_TRACE_TEST_BEGIN(req->node_tag.rank, req->node_tag.data_tag); //_STARPU_MPI_DEBUG(3, "Test detached request %p - mpitag %d - TYPE %s %d\n", &req->data_request, req->node_tag.data_tag, _starpu_mpi_request_type(req->request_type), req->node_tag.rank); req->ret = MPI_Test(&req->data_request, &flag, &status); STARPU_MPI_ASSERT_MSG(req->ret == MPI_SUCCESS, "MPI_Test returning %s", _starpu_mpi_get_mpi_error_code(req->ret)); _STARPU_MPI_TRACE_TEST_END(req->node_tag.rank, req->node_tag.data_tag); if (!flag) { req = _starpu_mpi_req_list_next(req); } else { struct _starpu_mpi_req *next_req; next_req = _starpu_mpi_req_list_next(req); if (req->request_type == RECV_REQ) { _STARPU_MPI_TRACE_IRECV_COMPLETE_BEGIN(req->node_tag.rank, req->node_tag.data_tag); } else if (req->request_type == SEND_REQ) { _STARPU_MPI_TRACE_ISEND_COMPLETE_BEGIN(req->node_tag.rank, req->node_tag.data_tag, 0); } STARPU_PTHREAD_MUTEX_LOCK(&detached_requests_mutex); _starpu_mpi_req_list_erase(&detached_requests, req); STARPU_PTHREAD_MUTEX_UNLOCK(&detached_requests_mutex); _starpu_mpi_handle_request_termination(req); if (req->request_type == RECV_REQ) { _STARPU_MPI_TRACE_IRECV_COMPLETE_END(req->node_tag.rank, req->node_tag.data_tag); } else if (req->request_type == SEND_REQ) { _STARPU_MPI_TRACE_ISEND_COMPLETE_END(req->node_tag.rank, req->node_tag.data_tag, 0); } STARPU_PTHREAD_MUTEX_LOCK(&req->req_mutex); /* We don't want to free internal non-detached requests, we need to get their MPI request before destroying them */ if (req->is_internal_req && !req->to_destroy) { /* We have completed the request, let the application request destroy it */ req->to_destroy = 1; STARPU_PTHREAD_MUTEX_UNLOCK(&req->req_mutex); } else { STARPU_PTHREAD_MUTEX_UNLOCK(&req->req_mutex); _starpu_mpi_request_destroy(req); } req = next_req; } STARPU_PTHREAD_MUTEX_LOCK(&detached_requests_mutex); } _STARPU_MPI_TRACE_TESTING_DETACHED_END(); STARPU_PTHREAD_MUTEX_UNLOCK(&detached_requests_mutex); //_STARPU_MPI_LOG_OUT(); } static void _starpu_mpi_handle_detached_request(struct _starpu_mpi_req *req) { if (req->detached) { /* put the submitted request into the list of pending requests * so that it can be handled by the progression mechanisms */ STARPU_PTHREAD_MUTEX_LOCK(&detached_requests_mutex); _starpu_mpi_req_list_push_back(&detached_requests, req); STARPU_PTHREAD_MUTEX_UNLOCK(&detached_requests_mutex); starpu_wake_all_blocked_workers(); STARPU_PTHREAD_MUTEX_LOCK(&mutex); STARPU_PTHREAD_COND_SIGNAL(&cond_progression); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } } static void _starpu_mpi_handle_ready_request(struct _starpu_mpi_req *req) { _STARPU_MPI_LOG_IN(); STARPU_MPI_ASSERT_MSG(req, "Invalid request"); /* submit the request to MPI */ _STARPU_MPI_DEBUG(2, "Handling new request %p type %s tag %d src %d data %p ptr %p datatype '%s' count %d registered_datatype %d \n", req, _starpu_mpi_request_type(req->request_type), req->node_tag.data_tag, req->node_tag.rank, req->data_handle, req->ptr, req->datatype_name, (int)req->count, req->registered_datatype); req->func(req); _STARPU_MPI_LOG_OUT(); } static void _starpu_mpi_print_thread_level_support(int thread_level, char *msg) { switch (thread_level) { case MPI_THREAD_SERIALIZED: { _STARPU_DEBUG("MPI%s MPI_THREAD_SERIALIZED; Multiple threads may make MPI calls, but only one at a time.\n", msg); break; } case MPI_THREAD_FUNNELED: { _STARPU_DISP("MPI%s MPI_THREAD_FUNNELED; The application can safely make calls to StarPU-MPI functions, but should not call directly MPI communication functions.\n", msg); break; } case MPI_THREAD_SINGLE: { _STARPU_DISP("MPI%s MPI_THREAD_SINGLE; MPI does not have multi-thread support, this might cause problems. The application can make calls to StarPU-MPI functions, but not call directly MPI Communication functions.\n", msg); break; } } } static void _starpu_mpi_receive_early_data(struct _starpu_mpi_envelope *envelope, MPI_Status status, MPI_Comm comm) { _STARPU_MPI_DEBUG(20, "Request with tag %d and source %d not found, creating a early_data_handle to receive incoming data, request sync %d\n", envelope->data_tag, status.MPI_SOURCE, envelope->sync); struct _starpu_mpi_early_data_handle* early_data_handle = _starpu_mpi_early_data_create(envelope, status.MPI_SOURCE, comm); _starpu_mpi_early_data_add(early_data_handle); starpu_data_handle_t data_handle = NULL; STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); data_handle = _starpu_mpi_data_get_data_handle_from_tag(envelope->data_tag); STARPU_PTHREAD_MUTEX_LOCK(&mutex); if (data_handle && starpu_data_get_interface_id(data_handle) < STARPU_MAX_INTERFACE_ID) { /* We know which data will receive it and we won't have to unpack, use just the same kind of data. */ early_data_handle->buffer = NULL; starpu_data_register_same(&early_data_handle->handle, data_handle); //_starpu_mpi_early_data_add(early_data_handle); } else { /* The application has not registered yet a data with the tag, * we are going to receive the data as a raw memory, and give it * to the application when it post a receive for this tag */ _STARPU_MPI_DEBUG(3, "Posting a receive for a data of size %d which has not yet been registered\n", (int)early_data_handle->env->size); _STARPU_MPI_MALLOC(early_data_handle->buffer, early_data_handle->env->size); starpu_variable_data_register(&early_data_handle->handle, STARPU_MAIN_RAM, (uintptr_t) early_data_handle->buffer, early_data_handle->env->size); //_starpu_mpi_early_data_add(early_data_handle); } _STARPU_MPI_DEBUG(20, "Posting internal detached irecv on early_data_handle with tag %d from comm %ld src %d ..\n", early_data_handle->node_tag.data_tag, (long int)comm, status.MPI_SOURCE); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); early_data_handle->req = _starpu_mpi_irecv_common(early_data_handle->handle, status.MPI_SOURCE, early_data_handle->node_tag.data_tag, comm, 1, 0, NULL, NULL, 1, 1, envelope->size); STARPU_PTHREAD_MUTEX_LOCK(&mutex); // We wait until the request is pushed in the // ready_request list STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); STARPU_PTHREAD_MUTEX_LOCK(&(early_data_handle->req->posted_mutex)); while (!(early_data_handle->req->posted)) STARPU_PTHREAD_COND_WAIT(&(early_data_handle->req->posted_cond), &(early_data_handle->req->posted_mutex)); STARPU_PTHREAD_MUTEX_UNLOCK(&(early_data_handle->req->posted_mutex)); #ifdef STARPU_DEVEL #warning check if req_ready is still necessary #endif STARPU_PTHREAD_MUTEX_LOCK(&early_data_handle->req_mutex); early_data_handle->req_ready = 1; STARPU_PTHREAD_COND_BROADCAST(&early_data_handle->req_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&early_data_handle->req_mutex); STARPU_PTHREAD_MUTEX_LOCK(&mutex); // Handle the request immediatly to make sure the mpi_irecv is // posted before receiving an other envelope _starpu_mpi_req_list_erase(&ready_requests, early_data_handle->req); _STARPU_MPI_INC_READY_REQUESTS(-1); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); _starpu_mpi_handle_ready_request(early_data_handle->req); STARPU_PTHREAD_MUTEX_LOCK(&mutex); } static void _starpu_mpi_do_initialize(struct _starpu_mpi_argc_argv *argc_argv) { if (argc_argv->initialize_mpi) { int thread_support; _STARPU_DEBUG("Calling MPI_Init_thread\n"); if (MPI_Init_thread(argc_argv->argc, argc_argv->argv, MPI_THREAD_SERIALIZED, &thread_support) != MPI_SUCCESS) { _STARPU_ERROR("MPI_Init_thread failed\n"); } _starpu_mpi_print_thread_level_support(thread_support, "_Init_thread level ="); } else { int provided; MPI_Query_thread(&provided); _starpu_mpi_print_thread_level_support(provided, " has been initialized with"); } } static void *_starpu_mpi_progress_thread_func(void *arg) { struct _starpu_mpi_argc_argv *argc_argv = (struct _starpu_mpi_argc_argv *) arg; int rank, worldsize; starpu_pthread_setname("MPI"); #ifndef STARPU_SIMGRID _starpu_mpi_do_initialize(argc_argv); #endif MPI_Comm_rank(argc_argv->comm, &rank); MPI_Comm_size(argc_argv->comm, &worldsize); MPI_Comm_set_errhandler(argc_argv->comm, MPI_ERRORS_RETURN); #ifdef STARPU_SIMGRID _mpi_world_size = worldsize; _mpi_world_rank = rank; #endif _starpu_mpi_fake_world_size = starpu_get_env_number("STARPU_MPI_FAKE_SIZE"); _starpu_mpi_fake_world_rank = starpu_get_env_number("STARPU_MPI_FAKE_RANK"); #ifdef STARPU_SIMGRID /* Now that MPI is set up, let the rest of simgrid get initialized */ char **argv_cpy; _STARPU_MPI_MALLOC(argv_cpy, *(argc_argv->argc) * sizeof(char*)); int i; for (i = 0; i < *(argc_argv->argc); i++) argv_cpy[i] = strdup((*(argc_argv->argv))[i]); MSG_process_create_with_arguments("main", smpi_simulated_main_, NULL, _starpu_simgrid_get_host_by_name("MAIN"), *(argc_argv->argc), argv_cpy); /* And set TSD for us */ void **tsd; _STARPU_CALLOC(tsd, MAX_TSD + 1, sizeof(void*)); if (!smpi_process_set_user_data) { fprintf(stderr,"Your version of simgrid does not provide smpi_process_set_user_data, we can not continue without it\n"); exit(1); } smpi_process_set_user_data(tsd); #endif #ifdef STARPU_USE_FXT /* Wait for FxT initialization before emitting FxT probes */ STARPU_PTHREAD_MUTEX_LOCK(&_starpu_fxt_started_mutex); while (!_starpu_fxt_started) STARPU_PTHREAD_COND_WAIT(&_starpu_fxt_started_cond, &_starpu_fxt_started_mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_fxt_started_mutex); #endif //STARPU_USE_FXT { _STARPU_MPI_TRACE_START(rank, worldsize); #ifdef STARPU_USE_FXT starpu_profiling_set_id(rank); #endif //STARPU_USE_FXT } _starpu_mpi_add_sync_point_in_fxt(); _starpu_mpi_comm_amounts_init(argc_argv->comm); _starpu_mpi_cache_init(argc_argv->comm); _starpu_mpi_select_node_init(); _starpu_mpi_tag_init(); _starpu_mpi_comm_init(argc_argv->comm); _starpu_mpi_early_request_init(); _starpu_mpi_early_data_init(); _starpu_mpi_sync_data_init(); _starpu_mpi_datatype_init(); /* notify the main thread that the progression thread is ready */ STARPU_PTHREAD_MUTEX_LOCK(&mutex); running = 1; STARPU_PTHREAD_COND_SIGNAL(&cond_progression); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); STARPU_PTHREAD_MUTEX_LOCK(&mutex); int envelope_request_submitted = 0; while (running || posted_requests || !(_starpu_mpi_req_list_empty(&ready_requests)) || !(_starpu_mpi_req_list_empty(&detached_requests)))// || !(_starpu_mpi_early_request_count()) || !(_starpu_mpi_sync_data_count())) { /* shall we block ? */ unsigned block = _starpu_mpi_req_list_empty(&ready_requests) && _starpu_mpi_early_request_count() == 0 && _starpu_mpi_sync_data_count() == 0; #ifndef STARPU_MPI_ACTIVITY STARPU_PTHREAD_MUTEX_LOCK(&detached_requests_mutex); block = block && _starpu_mpi_req_list_empty(&detached_requests); STARPU_PTHREAD_MUTEX_UNLOCK(&detached_requests_mutex); #endif /* STARPU_MPI_ACTIVITY */ if (block) { _STARPU_MPI_DEBUG(3, "NO MORE REQUESTS TO HANDLE\n"); _STARPU_MPI_TRACE_SLEEP_BEGIN(); if (barrier_running) /* Tell mpi_barrier */ STARPU_PTHREAD_COND_SIGNAL(&cond_finished); STARPU_PTHREAD_COND_WAIT(&cond_progression, &mutex); _STARPU_MPI_TRACE_SLEEP_END(); } /* get one request */ int n = 0; while (!_starpu_mpi_req_list_empty(&ready_requests)) { struct _starpu_mpi_req *req; if (n++ == NREADY_PROCESS) /* Already spent some time on submitting ready requests, poll before processing more ready requests */ break; req = _starpu_mpi_req_list_pop_back(&ready_requests); _STARPU_MPI_INC_READY_REQUESTS(-1); /* handling a request is likely to block for a while * (on a sync_data_with_mem call), we want to let the * application submit requests in the meantime, so we * release the lock. */ STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); _starpu_mpi_handle_ready_request(req); STARPU_PTHREAD_MUTEX_LOCK(&mutex); } /* If there is no currently submitted envelope_request submitted to * catch envelopes from senders, and there is some pending * receive requests on our side, we resubmit a header request. */ if (((_starpu_mpi_early_request_count() > 0) || (_starpu_mpi_sync_data_count() > 0)) && (envelope_request_submitted == 0))// && (HASH_COUNT(_starpu_mpi_early_data_handle_hashmap) == 0)) { _starpu_mpi_comm_post_recv(); envelope_request_submitted = 1; } /* test whether there are some terminated "detached request" */ STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); _starpu_mpi_test_detached_requests(); STARPU_PTHREAD_MUTEX_LOCK(&mutex); if (envelope_request_submitted == 1) { int flag; struct _starpu_mpi_envelope *envelope; MPI_Status envelope_status; MPI_Comm envelope_comm; /* test whether an envelope has arrived. */ flag = _starpu_mpi_comm_test_recv(&envelope_status, &envelope, &envelope_comm); if (flag) { _STARPU_MPI_COMM_FROM_DEBUG(envelope, sizeof(struct _starpu_mpi_envelope), MPI_BYTE, envelope_status.MPI_SOURCE, _STARPU_MPI_TAG_ENVELOPE, envelope->data_tag, envelope_comm); _STARPU_MPI_DEBUG(4, "Envelope received with mode %d\n", envelope->mode); if (envelope->mode == _STARPU_MPI_ENVELOPE_SYNC_READY) { struct _starpu_mpi_req *_sync_req = _starpu_mpi_sync_data_find(envelope->data_tag, envelope_status.MPI_SOURCE, envelope_comm); _STARPU_MPI_DEBUG(20, "Sending data with tag %d to node %d\n", _sync_req->node_tag.data_tag, envelope_status.MPI_SOURCE); STARPU_MPI_ASSERT_MSG(envelope->data_tag == _sync_req->node_tag.data_tag, "Tag mismatch (envelope %d != req %d)\n", envelope->data_tag, _sync_req->node_tag.data_tag); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); _starpu_mpi_isend_data_func(_sync_req); STARPU_PTHREAD_MUTEX_LOCK(&mutex); } else { _STARPU_MPI_DEBUG(3, "Searching for application request with tag %d and source %d (size %ld)\n", envelope->data_tag, envelope_status.MPI_SOURCE, envelope->size); struct _starpu_mpi_req *early_request = _starpu_mpi_early_request_dequeue(envelope->data_tag, envelope_status.MPI_SOURCE, envelope_comm); /* Case: a data will arrive before a matching receive is * posted by the application. Create a temporary handle to * store the incoming data, submit a starpu_mpi_irecv_detached * on this handle, and store it as an early_data */ if (early_request == NULL) { if (envelope->sync) { _STARPU_MPI_DEBUG(2000, "-------------------------> adding request for tag %d\n", envelope->data_tag); struct _starpu_mpi_req *new_req; #ifdef STARPU_DEVEL #warning creating a request is not really useful. #endif /* Initialize the request structure */ _starpu_mpi_request_init(&new_req); new_req->request_type = RECV_REQ; new_req->data_handle = NULL; new_req->node_tag.rank = envelope_status.MPI_SOURCE; new_req->node_tag.data_tag = envelope->data_tag; new_req->node_tag.comm = envelope_comm; new_req->detached = 1; new_req->sync = 1; new_req->callback = NULL; new_req->callback_arg = NULL; new_req->func = _starpu_mpi_irecv_data_func; new_req->sequential_consistency = 1; new_req->is_internal_req = 0; // ???? new_req->count = envelope->size; _starpu_mpi_sync_data_add(new_req); } else { _starpu_mpi_receive_early_data(envelope, envelope_status, envelope_comm); } } /* Case: a matching application request has been found for * the incoming data, we handle the correct allocation * of the pointer associated to the data handle, then * submit the corresponding receive with * _starpu_mpi_handle_ready_request. */ else { _STARPU_MPI_DEBUG(2000, "A matching application request has been found for the incoming data with tag %d\n", envelope->data_tag); _STARPU_MPI_DEBUG(2000, "Request sync %d\n", envelope->sync); early_request->sync = envelope->sync; _starpu_mpi_handle_allocate_datatype(early_request->data_handle, early_request); if (early_request->registered_datatype == 1) { early_request->count = 1; early_request->ptr = starpu_data_get_local_ptr(early_request->data_handle); } else { early_request->count = envelope->size; _STARPU_MPI_MALLOC(early_request->ptr, early_request->count); starpu_memory_allocate(STARPU_MAIN_RAM, early_request->count, STARPU_MEMORY_OVERFLOW); STARPU_MPI_ASSERT_MSG(early_request->ptr, "cannot allocate message of size %ld\n", early_request->count); } _STARPU_MPI_DEBUG(3, "Handling new request... \n"); /* handling a request is likely to block for a while * (on a sync_data_with_mem call), we want to let the * application submit requests in the meantime, so we * release the lock. */ STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); _starpu_mpi_handle_ready_request(early_request); STARPU_PTHREAD_MUTEX_LOCK(&mutex); } } envelope_request_submitted = 0; } else { //_STARPU_MPI_DEBUG(4, "Nothing received, continue ..\n"); } } #ifdef STARPU_SIMGRID STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); MSG_process_sleep(0.000010); STARPU_PTHREAD_MUTEX_LOCK(&mutex); #endif } if (envelope_request_submitted) { _starpu_mpi_comm_cancel_recv(); envelope_request_submitted = 0; } STARPU_MPI_ASSERT_MSG(_starpu_mpi_req_list_empty(&detached_requests), "List of detached requests not empty"); STARPU_MPI_ASSERT_MSG(_starpu_mpi_req_list_empty(&ready_requests), "List of ready requests not empty"); STARPU_MPI_ASSERT_MSG(posted_requests == 0, "Number of posted request is not zero"); _starpu_mpi_early_request_check_termination(); _starpu_mpi_early_data_check_termination(); _starpu_mpi_sync_data_check_termination(); if (argc_argv->initialize_mpi) { _STARPU_MPI_DEBUG(0, "Calling MPI_Finalize()\n"); MPI_Finalize(); } STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); _starpu_mpi_sync_data_free(); _starpu_mpi_early_data_free(); _starpu_mpi_early_request_free(); _starpu_mpi_datatype_free(); free(argc_argv); return NULL; } /********************************************************/ /* */ /* (De)Initialization methods */ /* */ /********************************************************/ #ifdef STARPU_MPI_ACTIVITY static int hookid = - 1; #endif /* STARPU_MPI_ACTIVITY */ static void _starpu_mpi_add_sync_point_in_fxt(void) { #ifdef STARPU_USE_FXT int rank; int worldsize; int ret; starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &worldsize); ret = MPI_Barrier(MPI_COMM_WORLD); STARPU_MPI_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Barrier returning %s", _starpu_mpi_get_mpi_error_code(ret)); /* We generate a "unique" key so that we can make sure that different * FxT traces come from the same MPI run. */ int random_number; /* XXX perhaps we don't want to generate a new seed if the application * specified some reproductible behaviour ? */ if (rank == 0) { srand(time(NULL)); random_number = rand(); } ret = MPI_Bcast(&random_number, 1, MPI_INT, 0, MPI_COMM_WORLD); STARPU_MPI_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Bcast returning %s", _starpu_mpi_get_mpi_error_code(ret)); _STARPU_MPI_TRACE_BARRIER(rank, worldsize, random_number); _STARPU_MPI_DEBUG(3, "unique key %x\n", random_number); #endif } static int _starpu_mpi_initialize(int *argc, char ***argv, int initialize_mpi, MPI_Comm comm) { struct _starpu_mpi_argc_argv *argc_argv; _STARPU_MALLOC(argc_argv, sizeof(struct _starpu_mpi_argc_argv)); argc_argv->initialize_mpi = initialize_mpi; argc_argv->argc = argc; argc_argv->argv = argv; argc_argv->comm = comm; #ifdef STARPU_SIMGRID /* Call MPI_Init_thread as early as possible, to initialize simgrid * before working with mutexes etc. */ _starpu_mpi_do_initialize(argc_argv); #endif STARPU_PTHREAD_MUTEX_INIT(&mutex, NULL); STARPU_PTHREAD_COND_INIT(&cond_progression, NULL); STARPU_PTHREAD_COND_INIT(&cond_finished, NULL); _starpu_mpi_req_list_init(&ready_requests); STARPU_PTHREAD_MUTEX_INIT(&detached_requests_mutex, NULL); _starpu_mpi_req_list_init(&detached_requests); STARPU_PTHREAD_MUTEX_INIT(&mutex_posted_requests, NULL); STARPU_PTHREAD_MUTEX_INIT(&mutex_ready_requests, NULL); _starpu_mpi_comm_debug = starpu_getenv("STARPU_MPI_COMM") != NULL; #ifdef STARPU_MPI_ACTIVITY hookid = starpu_progression_hook_register(_starpu_mpi_progression_hook_func, NULL); STARPU_MPI_ASSERT_MSG(hookid >= 0, "starpu_progression_hook_register failed"); #endif /* STARPU_MPI_ACTIVITY */ #ifdef STARPU_SIMGRID _starpu_mpi_progress_thread_func(argc_argv); return 0; #else STARPU_PTHREAD_CREATE(&progress_thread, NULL, _starpu_mpi_progress_thread_func, argc_argv); STARPU_PTHREAD_MUTEX_LOCK(&mutex); while (!running) STARPU_PTHREAD_COND_WAIT(&cond_progression, &mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); return 0; #endif } #ifdef STARPU_SIMGRID /* This is called before application's main, to initialize SMPI before we can * create MSG processes to run application's main */ int _starpu_mpi_simgrid_init(int argc, char *argv[]) { return _starpu_mpi_initialize(&argc, &argv, 1, MPI_COMM_WORLD); } #endif int starpu_mpi_init_comm(int *argc STARPU_ATTRIBUTE_UNUSED, char ***argv STARPU_ATTRIBUTE_UNUSED, int initialize_mpi STARPU_ATTRIBUTE_UNUSED, MPI_Comm comm STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_SIMGRID /* Wait for MPI initialization to finish */ STARPU_PTHREAD_MUTEX_LOCK(&mutex); while (!running) STARPU_PTHREAD_COND_WAIT(&cond_progression, &mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); return 0; #else return _starpu_mpi_initialize(argc, argv, initialize_mpi, comm); #endif } int starpu_mpi_init(int *argc, char ***argv, int initialize_mpi) { return starpu_mpi_init_comm(argc, argv, initialize_mpi, MPI_COMM_WORLD); } int starpu_mpi_initialize(void) { #ifdef STARPU_SIMGRID return 0; #else return _starpu_mpi_initialize(NULL, NULL, 0, MPI_COMM_WORLD); #endif } int starpu_mpi_initialize_extended(int *rank, int *world_size) { #ifdef STARPU_SIMGRID *world_size = _mpi_world_size; *rank = _mpi_world_rank; return 0; #else int ret; ret = _starpu_mpi_initialize(NULL, NULL, 1, MPI_COMM_WORLD); if (ret == 0) { _STARPU_DEBUG("Calling MPI_Comm_rank\n"); MPI_Comm_rank(MPI_COMM_WORLD, rank); MPI_Comm_size(MPI_COMM_WORLD, world_size); } return ret; #endif } int starpu_mpi_shutdown(void) { #ifndef STARPU_SIMGRID void *value; #endif int rank, world_size; /* We need to get the rank before calling MPI_Finalize to pass to _starpu_mpi_comm_amounts_display() */ starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &world_size); /* kill the progression thread */ STARPU_PTHREAD_MUTEX_LOCK(&mutex); running = 0; STARPU_PTHREAD_COND_BROADCAST(&cond_progression); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); #ifndef STARPU_SIMGRID starpu_pthread_join(progress_thread, &value); #else /* FIXME: should rather properly wait for _starpu_mpi_progress_thread_func to finish */ MSG_process_sleep(1); #endif #ifdef STARPU_MPI_ACTIVITY starpu_progression_hook_deregister(hookid); #endif /* STARPU_MPI_ACTIVITY */ _STARPU_MPI_TRACE_STOP(rank, world_size); _starpu_mpi_comm_amounts_display(stderr, rank); _starpu_mpi_comm_amounts_free(); _starpu_mpi_cache_free(world_size); _starpu_mpi_tag_free(); _starpu_mpi_comm_free(); return 0; } void _starpu_mpi_clear_cache(starpu_data_handle_t data_handle) { _starpu_mpi_data_release_tag(data_handle); struct _starpu_mpi_node_tag *mpi_data = data_handle->mpi_data; _starpu_mpi_cache_flush(mpi_data->comm, data_handle); free(data_handle->mpi_data); } void starpu_mpi_data_register_comm(starpu_data_handle_t data_handle, int tag, int rank, MPI_Comm comm) { struct _starpu_mpi_node_tag *mpi_data; if (data_handle->mpi_data) { mpi_data = data_handle->mpi_data; } else { _STARPU_MPI_CALLOC(mpi_data, 1, sizeof(struct _starpu_mpi_node_tag)); mpi_data->data_tag = -1; mpi_data->rank = -1; mpi_data->comm = MPI_COMM_WORLD; data_handle->mpi_data = mpi_data; _starpu_mpi_data_register_tag(data_handle, tag); _starpu_data_set_unregister_hook(data_handle, _starpu_mpi_clear_cache); } if (tag != -1) { mpi_data->data_tag = tag; } if (rank != -1) { _STARPU_MPI_TRACE_DATA_SET_RANK(data_handle, rank); mpi_data->rank = rank; mpi_data->comm = comm; _starpu_mpi_comm_register(comm); } } void starpu_mpi_data_set_rank_comm(starpu_data_handle_t handle, int rank, MPI_Comm comm) { starpu_mpi_data_register_comm(handle, -1, rank, comm); } void starpu_mpi_data_set_tag(starpu_data_handle_t handle, int tag) { starpu_mpi_data_register_comm(handle, tag, -1, MPI_COMM_WORLD); } int starpu_mpi_data_get_rank(starpu_data_handle_t data) { STARPU_ASSERT_MSG(data->mpi_data, "starpu_mpi_data_register MUST be called for data %p\n", data); return ((struct _starpu_mpi_node_tag *)(data->mpi_data))->rank; } int starpu_mpi_data_get_tag(starpu_data_handle_t data) { STARPU_ASSERT_MSG(data->mpi_data, "starpu_mpi_data_register MUST be called for data %p\n", data); return ((struct _starpu_mpi_node_tag *)(data->mpi_data))->data_tag; } void starpu_mpi_get_data_on_node_detached(MPI_Comm comm, starpu_data_handle_t data_handle, int node, void (*callback)(void*), void *arg) { int me, rank, tag; rank = starpu_mpi_data_get_rank(data_handle); if (rank == -1) { _STARPU_ERROR("StarPU needs to be told the MPI rank of this data, using starpu_mpi_data_register() or starpu_mpi_data_register()\n"); } starpu_mpi_comm_rank(comm, &me); if (node == rank) return; tag = starpu_mpi_data_get_tag(data_handle); if (tag == -1) { _STARPU_ERROR("StarPU needs to be told the MPI tag of this data, using starpu_mpi_data_register() or starpu_mpi_data_register()\n"); } if (me == node) { _STARPU_MPI_DEBUG(1, "Migrating data %p from %d to %d\n", data_handle, rank, node); void *already_received = _starpu_mpi_cache_received_data_set(data_handle, rank); if (already_received == NULL) { _STARPU_MPI_DEBUG(1, "Receiving data %p from %d\n", data_handle, rank); starpu_mpi_irecv_detached(data_handle, rank, tag, comm, callback, arg); } } else if (me == rank) { _STARPU_MPI_DEBUG(1, "Migrating data %p from %d to %d\n", data_handle, rank, node); void *already_sent = _starpu_mpi_cache_sent_data_set(data_handle, node); if (already_sent == NULL) { _STARPU_MPI_DEBUG(1, "Sending data %p to %d\n", data_handle, node); starpu_mpi_isend_detached(data_handle, node, tag, comm, NULL, NULL); } } } void starpu_mpi_get_data_on_node(MPI_Comm comm, starpu_data_handle_t data_handle, int node) { int me, rank, tag; rank = starpu_mpi_data_get_rank(data_handle); if (rank == -1) { _STARPU_ERROR("StarPU needs to be told the MPI rank of this data, using starpu_mpi_data_register\n"); } starpu_mpi_comm_rank(comm, &me); if (node == rank) return; tag = starpu_mpi_data_get_tag(data_handle); if (tag == -1) { _STARPU_ERROR("StarPU needs to be told the MPI tag of this data, using starpu_mpi_data_register\n"); } if (me == node) { MPI_Status status; _STARPU_MPI_DEBUG(1, "Migrating data %p from %d to %d\n", data_handle, rank, node); void *already_received = _starpu_mpi_cache_received_data_set(data_handle, rank); if (already_received == NULL) { _STARPU_MPI_DEBUG(1, "Receiving data %p from %d\n", data_handle, rank); starpu_mpi_recv(data_handle, rank, tag, comm, &status); } } else if (me == rank) { _STARPU_MPI_DEBUG(1, "Migrating data %p from %d to %d\n", data_handle, rank, node); void *already_sent = _starpu_mpi_cache_sent_data_set(data_handle, node); if (already_sent == NULL) { _STARPU_MPI_DEBUG(1, "Sending data %p to %d\n", data_handle, node); starpu_mpi_send(data_handle, node, tag, comm); } } } void starpu_mpi_get_data_on_all_nodes_detached(MPI_Comm comm, starpu_data_handle_t data_handle) { int size, i; starpu_mpi_comm_size(comm, &size); #ifdef STARPU_DEVEL #warning TODO: use binary communication tree to optimize broadcast #endif for (i = 0; i < size; i++) starpu_mpi_get_data_on_node_detached(comm, data_handle, i, NULL, NULL); } void starpu_mpi_data_migrate(MPI_Comm comm, starpu_data_handle_t data, int new_rank) { int old_rank = starpu_mpi_data_get_rank(data); if (new_rank == old_rank) /* Already there */ return; /* First submit data migration if it's not already on destination */ starpu_mpi_get_data_on_node_detached(comm, data, new_rank, NULL, NULL); /* And note new owner */ starpu_mpi_data_set_rank_comm(data, new_rank, comm); /* Flush cache in all other nodes */ /* TODO: Ideally we'd transmit the knowledge of who owns it */ starpu_mpi_cache_flush(comm, data); return; } int starpu_mpi_comm_size(MPI_Comm comm, int *size) { if (_starpu_mpi_fake_world_size != -1) { *size = _starpu_mpi_fake_world_size; return 0; } #ifdef STARPU_SIMGRID STARPU_MPI_ASSERT_MSG(comm == MPI_COMM_WORLD, "StarPU-SMPI only works with MPI_COMM_WORLD for now"); *size = _mpi_world_size; return 0; #else return MPI_Comm_size(comm, size); #endif } int starpu_mpi_comm_rank(MPI_Comm comm, int *rank) { if (_starpu_mpi_fake_world_rank != -1) { *rank = _starpu_mpi_fake_world_rank; return 0; } #ifdef STARPU_SIMGRID STARPU_MPI_ASSERT_MSG(comm == MPI_COMM_WORLD, "StarPU-SMPI only works with MPI_COMM_WORLD for now"); *rank = _mpi_world_rank; return 0; #else return MPI_Comm_rank(comm, rank); #endif } int starpu_mpi_world_size(void) { int size; starpu_mpi_comm_size(MPI_COMM_WORLD, &size); return size; } int starpu_mpi_world_rank(void) { int rank; starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); return rank; } int starpu_mpi_wait_for_all(MPI_Comm comm) { int mpi = 1; int task = 1; while (task || mpi) { task = _starpu_task_wait_for_all_and_return_nb_waited_tasks(); mpi = _starpu_mpi_barrier(comm); } return 0; } int starpu_mpi_comm_get_attr(MPI_Comm comm, int keyval, void *attribute_val, int *flag) { (void) comm; if (keyval == STARPU_MPI_TAG_UB) { *flag = 1; *(int *)attribute_val = INT_MAX; } else { *flag = 0; } return 0; } starpu-1.2.3+dfsg/mpi/src/starpu_mpi_cache.c000066400000000000000000000262041320135501600210000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013, 2014, 2015, 2017 CNRS * Copyright (C) 2011-2017 Université de Bordeaux * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include /* Whether we are allowed to keep copies of remote data. */ struct _starpu_data_entry { UT_hash_handle hh; starpu_data_handle_t data; }; static starpu_pthread_mutex_t *_cache_sent_mutex; static starpu_pthread_mutex_t *_cache_received_mutex; static struct _starpu_data_entry **_cache_sent_data = NULL; static struct _starpu_data_entry **_cache_received_data = NULL; int _starpu_cache_enabled=1; MPI_Comm _starpu_cache_comm; int _starpu_cache_comm_size; int starpu_mpi_cache_is_enabled() { return _starpu_cache_enabled==1; } int starpu_mpi_cache_set(int enabled) { if (enabled == 1) { _starpu_cache_enabled = 1; } else { if (_starpu_cache_enabled) { // We need to clean the cache starpu_mpi_cache_flush_all_data(_starpu_cache_comm); _starpu_mpi_cache_free(_starpu_cache_comm_size); } _starpu_cache_enabled = 0; } return 0; } void _starpu_mpi_cache_init(MPI_Comm comm) { int i; _starpu_cache_enabled = starpu_get_env_number("STARPU_MPI_CACHE"); if (_starpu_cache_enabled == -1) { _starpu_cache_enabled = 1; } if (_starpu_cache_enabled == 0) { _STARPU_DISP("Warning: StarPU MPI Communication cache is disabled\n"); return; } _starpu_cache_comm = comm; starpu_mpi_comm_size(comm, &_starpu_cache_comm_size); _STARPU_MPI_DEBUG(2, "Initialising htable for cache\n"); _STARPU_MPI_MALLOC(_cache_sent_data, _starpu_cache_comm_size * sizeof(struct _starpu_data_entry *)); _STARPU_MPI_MALLOC(_cache_received_data, _starpu_cache_comm_size * sizeof(struct _starpu_data_entry *)); _STARPU_MPI_MALLOC(_cache_sent_mutex, _starpu_cache_comm_size * sizeof(starpu_pthread_mutex_t)); _STARPU_MPI_MALLOC(_cache_received_mutex, _starpu_cache_comm_size * sizeof(starpu_pthread_mutex_t)); for(i=0 ; i<_starpu_cache_comm_size ; i++) { _cache_sent_data[i] = NULL; _cache_received_data[i] = NULL; STARPU_PTHREAD_MUTEX_INIT(&_cache_sent_mutex[i], NULL); STARPU_PTHREAD_MUTEX_INIT(&_cache_received_mutex[i], NULL); } _starpu_mpi_cache_stats_init(comm); } static void _starpu_mpi_cache_empty_tables(int world_size) { int i; if (_starpu_cache_enabled == 0) return; _STARPU_MPI_DEBUG(2, "Clearing htable for cache\n"); for(i=0 ; idata); free(entry); } STARPU_PTHREAD_MUTEX_UNLOCK(&_cache_received_mutex[i]); } } void _starpu_mpi_cache_free() { int i; if (_starpu_cache_enabled == 0) return; _starpu_mpi_cache_empty_tables(_starpu_cache_comm_size); free(_cache_sent_data); free(_cache_received_data); for(i=0 ; i<_starpu_cache_comm_size ; i++) { STARPU_PTHREAD_MUTEX_DESTROY(&_cache_sent_mutex[i]); STARPU_PTHREAD_MUTEX_DESTROY(&_cache_received_mutex[i]); } free(_cache_sent_mutex); free(_cache_received_mutex); _starpu_mpi_cache_stats_free(); } void _starpu_mpi_cache_sent_data_clear(MPI_Comm comm, starpu_data_handle_t data) { int n, size; starpu_mpi_comm_size(comm, &size); for(n=0 ; ndata); if (mpi_rank != my_rank && mpi_rank != -1) starpu_data_invalidate_submit(entry->data); HASH_DEL(_cache_sent_data[i], entry); free(entry); } STARPU_PTHREAD_MUTEX_UNLOCK(&_cache_sent_mutex[i]); STARPU_PTHREAD_MUTEX_LOCK(&_cache_received_mutex[i]); HASH_ITER(hh, _cache_received_data[i], entry, tmp) { mpi_rank = starpu_mpi_data_get_rank(entry->data); if (mpi_rank != my_rank && mpi_rank != -1) starpu_data_invalidate_submit(entry->data); HASH_DEL(_cache_received_data[i], entry); _starpu_mpi_cache_stats_dec(i, entry->data); free(entry); } STARPU_PTHREAD_MUTEX_UNLOCK(&_cache_received_mutex[i]); } } void _starpu_mpi_cache_flush(MPI_Comm comm, starpu_data_handle_t data_handle) { struct _starpu_data_entry *avail; int i, nb_nodes; if (_starpu_cache_enabled == 0) return; starpu_mpi_comm_size(comm, &nb_nodes); for(i=0 ; idata = data; HASH_ADD_PTR(_cache_received_data[mpi_rank], data, entry); _STARPU_MPI_DEBUG(2, "Noting that data %p has already been received by %d\n", data, mpi_rank); _starpu_mpi_cache_stats_inc(mpi_rank, data); } else { _STARPU_MPI_DEBUG(2, "Do not receive data %p from node %d as it is already available\n", data, mpi_rank); } STARPU_PTHREAD_MUTEX_UNLOCK(&_cache_received_mutex[mpi_rank]); return already_received; } void *_starpu_mpi_cache_received_data_get(starpu_data_handle_t data, int mpi_rank) { struct _starpu_data_entry *already_received; if (_starpu_cache_enabled == 0) return NULL; if (mpi_rank == STARPU_MPI_PER_NODE) return NULL; STARPU_MPI_ASSERT_MSG(mpi_rank < _starpu_cache_comm_size, "Node %d invalid. Max node is %d\n", mpi_rank, _starpu_cache_comm_size); STARPU_PTHREAD_MUTEX_LOCK(&_cache_received_mutex[mpi_rank]); HASH_FIND_PTR(_cache_received_data[mpi_rank], &data, already_received); STARPU_PTHREAD_MUTEX_UNLOCK(&_cache_received_mutex[mpi_rank]); return already_received; } int starpu_mpi_cached_receive(starpu_data_handle_t data_handle) { int owner = starpu_mpi_data_get_rank(data_handle); void *already_received = _starpu_mpi_cache_received_data_get(data_handle, owner); return already_received != NULL; } void *_starpu_mpi_cache_sent_data_set(starpu_data_handle_t data, int dest) { struct _starpu_data_entry *already_sent; if (_starpu_cache_enabled == 0) return NULL; STARPU_MPI_ASSERT_MSG(dest < _starpu_cache_comm_size, "Node %d invalid. Max node is %d\n", dest, _starpu_cache_comm_size); STARPU_PTHREAD_MUTEX_LOCK(&_cache_sent_mutex[dest]); HASH_FIND_PTR(_cache_sent_data[dest], &data, already_sent); if (already_sent == NULL) { struct _starpu_data_entry *entry; _STARPU_MPI_MALLOC(entry, sizeof(*entry)); entry->data = data; HASH_ADD_PTR(_cache_sent_data[dest], data, entry); _STARPU_MPI_DEBUG(2, "Noting that data %p has already been sent to %d\n", data, dest); } else { _STARPU_MPI_DEBUG(2, "Do not send data %p to node %d as it has already been sent\n", data, dest); } STARPU_PTHREAD_MUTEX_UNLOCK(&_cache_sent_mutex[dest]); return already_sent; } void *_starpu_mpi_cache_sent_data_get(starpu_data_handle_t data, int dest) { struct _starpu_data_entry *already_sent; if (_starpu_cache_enabled == 0) return NULL; STARPU_MPI_ASSERT_MSG(dest < _starpu_cache_comm_size, "Node %d invalid. Max node is %d\n", dest, _starpu_cache_comm_size); STARPU_PTHREAD_MUTEX_LOCK(&_cache_sent_mutex[dest]); HASH_FIND_PTR(_cache_sent_data[dest], &data, already_sent); STARPU_PTHREAD_MUTEX_UNLOCK(&_cache_sent_mutex[dest]); return already_sent; } int starpu_mpi_cached_send(starpu_data_handle_t data_handle, int dest) { void *already_sent = _starpu_mpi_cache_sent_data_get(data_handle, dest); return already_sent != NULL; } starpu-1.2.3+dfsg/mpi/src/starpu_mpi_cache.h000066400000000000000000000036601320135501600210060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013, 2014, 2015 CNRS * Copyright (C) 2011-2014, 2017 Université de Bordeaux * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_MPI_CACHE_H__ #define __STARPU_MPI_CACHE_H__ #include #include #include #ifdef __cplusplus extern "C" { #endif extern int _starpu_cache_enabled; void _starpu_mpi_cache_init(MPI_Comm comm); void _starpu_mpi_cache_free(); /* * If the data is already available in the cache, return a pointer to the data * If the data is NOT available in the cache, add it to the cache and return NULL */ void *_starpu_mpi_cache_received_data_set(starpu_data_handle_t data, int mpi_rank); void *_starpu_mpi_cache_received_data_get(starpu_data_handle_t data, int mpi_rank); void _starpu_mpi_cache_received_data_clear(starpu_data_handle_t data); /* * If the data is already available in the cache, return a pointer to the data * If the data is NOT available in the cache, add it to the cache and return NULL */ void *_starpu_mpi_cache_sent_data_set(starpu_data_handle_t data, int dest); void *_starpu_mpi_cache_sent_data_get(starpu_data_handle_t data, int dest); void _starpu_mpi_cache_sent_data_clear(MPI_Comm comm, starpu_data_handle_t data); void _starpu_mpi_cache_flush(MPI_Comm comm, starpu_data_handle_t data_handle); #ifdef __cplusplus } #endif #endif // __STARPU_MPI_CACHE_H__ starpu-1.2.3+dfsg/mpi/src/starpu_mpi_cache_stats.c000066400000000000000000000036431320135501600222200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014, 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include /* measure the amount of data transfers between each pair of MPI nodes */ static size_t *comm_cache_amount; static int world_size; static int stats_enabled=0; void _starpu_mpi_cache_stats_init(MPI_Comm comm) { stats_enabled = starpu_get_env_number("STARPU_MPI_CACHE_STATS"); if (stats_enabled == -1) { stats_enabled = 0; } if (stats_enabled == 0) return; _STARPU_DISP("Warning: StarPU is executed with STARPU_MPI_CACHE_STATS=1, which slows down a bit\n"); starpu_mpi_comm_size(comm, &world_size); _STARPU_MPI_DEBUG(1, "allocating for %d nodes\n", world_size); _STARPU_MPI_CALLOC(comm_cache_amount, world_size, sizeof(size_t)); } void _starpu_mpi_cache_stats_free() { if (stats_enabled == 0) return; free(comm_cache_amount); } void _starpu_mpi_cache_stats_update(unsigned dst, starpu_data_handle_t data_handle, int count) { size_t size; if (stats_enabled == 0) return; size = starpu_data_get_size(data_handle); if (count == 1) { _STARPU_MPI_MSG("[communication cache] + %10ld to %d\n", (long)size, dst); } else // count == -1 { _STARPU_MPI_MSG("[communication cache] - %10ld from %d\n", (long)size, dst); } comm_cache_amount[dst] += count * size; } starpu-1.2.3+dfsg/mpi/src/starpu_mpi_cache_stats.h000066400000000000000000000024011320135501600222140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014, 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_MPI_CACHE_STATS_H__ #define __STARPU_MPI_CACHE_STATS_H__ #include #include #include #ifdef __cplusplus extern "C" { #endif void _starpu_mpi_cache_stats_init(MPI_Comm comm); void _starpu_mpi_cache_stats_free(); void _starpu_mpi_cache_stats_update(unsigned dst, starpu_data_handle_t data_handle, int count); #define _starpu_mpi_cache_stats_inc(dst, data_handle) _starpu_mpi_cache_stats_update(dst, data_handle, +1) #define _starpu_mpi_cache_stats_dec(dst, data_handle) _starpu_mpi_cache_stats_update(dst, data_handle, -1) #ifdef __cplusplus } #endif #endif // __STARPU_MPI_CACHE_STATS_H__ starpu-1.2.3+dfsg/mpi/src/starpu_mpi_collective.c000066400000000000000000000110101320135501600220530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013, 2014, 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include struct _callback_arg { void (*callback)(void *); void *arg; int nb; int count; }; static void _callback_collective(void *arg) { struct _callback_arg *callback_arg = arg; callback_arg->nb ++; if (callback_arg->nb == callback_arg->count) { callback_arg->callback(callback_arg->arg); free(callback_arg); } } static int _callback_set(int rank, starpu_data_handle_t *data_handles, int count, int root, void (*scallback)(void *), void *sarg, void (*rcallback)(void *), void *rarg, void (**callback_func)(void *), struct _callback_arg **callback_arg) { void (*callback)(void *); callback = (rank == root) ? scallback : rcallback; if (*callback) { int x; *callback_func = _callback_collective; _STARPU_MPI_MALLOC(*callback_arg, sizeof(struct _callback_arg)); (*callback_arg)->count = 0; (*callback_arg)->nb = 0; (*callback_arg)->callback = (rank == root) ? scallback : rcallback; (*callback_arg)->arg = (rank == root) ? sarg : rarg; for(x = 0; x < count ; x++) { if (data_handles[x]) { int owner = starpu_mpi_data_get_rank(data_handles[x]); int data_tag = starpu_mpi_data_get_tag(data_handles[x]); STARPU_ASSERT_MSG(data_tag >= 0, "Invalid tag for data handle"); if ((rank == root) && (owner != root)) { (*callback_arg)->count ++; } if ((rank != root) && (owner == rank)) { (*callback_arg)->count ++; } } } if (!(*callback_arg)->count) { free(*callback_arg); return 1; } } return 0; } int starpu_mpi_scatter_detached(starpu_data_handle_t *data_handles, int count, int root, MPI_Comm comm, void (*scallback)(void *), void *sarg, void (*rcallback)(void *), void *rarg) { int rank; int x; struct _callback_arg *callback_arg = NULL; void (*callback_func)(void *) = NULL; starpu_mpi_comm_rank(comm, &rank); x = _callback_set(rank, data_handles, count, root, scallback, sarg, rcallback, rarg, &callback_func, &callback_arg); if (x == 1) return 0; for(x = 0; x < count ; x++) { if (data_handles[x]) { int owner = starpu_mpi_data_get_rank(data_handles[x]); int data_tag = starpu_mpi_data_get_tag(data_handles[x]); STARPU_ASSERT_MSG(data_tag >= 0, "Invalid tag for data handle"); if ((rank == root) && (owner != root)) { //fprintf(stderr, "[%d] Sending data[%d] to %d\n", rank, x, owner); starpu_mpi_isend_detached(data_handles[x], owner, data_tag, comm, callback_func, callback_arg); } if ((rank != root) && (owner == rank)) { //fprintf(stderr, "[%d] Receiving data[%d] from %d\n", rank, x, root); starpu_mpi_irecv_detached(data_handles[x], root, data_tag, comm, callback_func, callback_arg); } } } return 0; } int starpu_mpi_gather_detached(starpu_data_handle_t *data_handles, int count, int root, MPI_Comm comm, void (*scallback)(void *), void *sarg, void (*rcallback)(void *), void *rarg) { int rank; int x; struct _callback_arg *callback_arg = NULL; void (*callback_func)(void *) = NULL; starpu_mpi_comm_rank(comm, &rank); x = _callback_set(rank, data_handles, count, root, scallback, sarg, rcallback, rarg, &callback_func, &callback_arg); if (x == 1) return 0; for(x = 0; x < count ; x++) { if (data_handles[x]) { int owner = starpu_mpi_data_get_rank(data_handles[x]); int data_tag = starpu_mpi_data_get_tag(data_handles[x]); STARPU_ASSERT_MSG(data_tag >= 0, "Invalid tag for data handle"); if ((rank == root) && (owner != root)) { //fprintf(stderr, "[%d] Receiving data[%d] from %d\n", rank, x, owner); starpu_mpi_irecv_detached(data_handles[x], owner, data_tag, comm, callback_func, callback_arg); } if ((rank != root) && (owner == rank)) { //fprintf(stderr, "[%d] Sending data[%d] to %d\n", rank, x, root); starpu_mpi_isend_detached(data_handles[x], root, data_tag, comm, callback_func, callback_arg); } } } return 0; } starpu-1.2.3+dfsg/mpi/src/starpu_mpi_comm.c000066400000000000000000000133301320135501600206640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * Copyright (C) 2011-2016 Université de Bordeaux * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include struct _starpu_mpi_comm { MPI_Comm comm; struct _starpu_mpi_envelope *envelope; MPI_Request request; int posted; }; struct _starpu_mpi_comm_hashtable { UT_hash_handle hh; MPI_Comm comm; }; static starpu_pthread_mutex_t _starpu_mpi_comms_mutex; struct _starpu_mpi_comm_hashtable *_starpu_mpi_comms_cache; struct _starpu_mpi_comm **_starpu_mpi_comms; int _starpu_mpi_comm_nb; int _starpu_mpi_comm_allocated; int _starpu_mpi_comm_tested; void _starpu_mpi_comm_init(MPI_Comm comm) { _STARPU_MPI_DEBUG(10, "allocating for %d communicators\n", _starpu_mpi_comm_allocated); _starpu_mpi_comm_allocated=10; _STARPU_MPI_CALLOC(_starpu_mpi_comms, _starpu_mpi_comm_allocated, sizeof(struct _starpu_mpi_comm *)); _starpu_mpi_comm_nb=0; _starpu_mpi_comm_tested=0; _starpu_mpi_comms_cache = NULL; STARPU_PTHREAD_MUTEX_INIT(&_starpu_mpi_comms_mutex, NULL); _starpu_mpi_comm_register(comm); } void _starpu_mpi_comm_free() { int i; for(i=0 ; i<_starpu_mpi_comm_nb ; i++) { struct _starpu_mpi_comm *_comm = _starpu_mpi_comms[i]; // get the ith _comm; free(_comm->envelope); free(_comm); } free(_starpu_mpi_comms); struct _starpu_mpi_comm_hashtable *entry, *tmp; HASH_ITER(hh, _starpu_mpi_comms_cache, entry, tmp) { HASH_DEL(_starpu_mpi_comms_cache, entry); free(entry); } STARPU_PTHREAD_MUTEX_DESTROY(&_starpu_mpi_comms_mutex); } void _starpu_mpi_comm_register(MPI_Comm comm) { struct _starpu_mpi_comm_hashtable *found; STARPU_PTHREAD_MUTEX_LOCK(&_starpu_mpi_comms_mutex); HASH_FIND(hh, _starpu_mpi_comms_cache, &comm, sizeof(MPI_Comm), found); if (found) { _STARPU_MPI_DEBUG(10, "comm %d (%d) already registered\n", comm, MPI_COMM_WORLD); } else { if (_starpu_mpi_comm_nb == _starpu_mpi_comm_allocated) { _starpu_mpi_comm_allocated *= 2; _STARPU_MPI_DEBUG(10, "reallocating for %d communicators\n", _starpu_mpi_comm_allocated); _STARPU_MPI_REALLOC(_starpu_mpi_comms, _starpu_mpi_comm_allocated * sizeof(struct _starpu_mpi_comm *)); } _STARPU_MPI_DEBUG(10, "registering comm %d (%d) number %d\n", comm, MPI_COMM_WORLD, _starpu_mpi_comm_nb); struct _starpu_mpi_comm *_comm; _STARPU_MPI_CALLOC(_comm, 1, sizeof(struct _starpu_mpi_comm)); _comm->comm = comm; _STARPU_MPI_CALLOC(_comm->envelope, 1, sizeof(struct _starpu_mpi_envelope)); _comm->posted = 0; _starpu_mpi_comms[_starpu_mpi_comm_nb] = _comm; _starpu_mpi_comm_nb++; struct _starpu_mpi_comm_hashtable *entry; _STARPU_MPI_MALLOC(entry, sizeof(*entry)); entry->comm = comm; HASH_ADD(hh, _starpu_mpi_comms_cache, comm, sizeof(entry->comm), entry); } STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_comms_mutex); } void _starpu_mpi_comm_post_recv() { int i; STARPU_PTHREAD_MUTEX_LOCK(&_starpu_mpi_comms_mutex); for(i=0 ; i<_starpu_mpi_comm_nb ; i++) { struct _starpu_mpi_comm *_comm = _starpu_mpi_comms[i]; // get the ith _comm; if (_comm->posted == 0) { _STARPU_MPI_DEBUG(3, "Posting a receive to get a data envelop on comm %d %d\n", i, _comm->comm); _STARPU_MPI_COMM_FROM_DEBUG(_comm->envelope, sizeof(struct _starpu_mpi_envelope), MPI_BYTE, MPI_ANY_SOURCE, _STARPU_MPI_TAG_ENVELOPE, _STARPU_MPI_TAG_ENVELOPE, _comm->comm); MPI_Irecv(_comm->envelope, sizeof(struct _starpu_mpi_envelope), MPI_BYTE, MPI_ANY_SOURCE, _STARPU_MPI_TAG_ENVELOPE, _comm->comm, &_comm->request); _comm->posted = 1; } } STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_comms_mutex); } int _starpu_mpi_comm_test_recv(MPI_Status *status, struct _starpu_mpi_envelope **envelope, MPI_Comm *comm) { int i=_starpu_mpi_comm_tested; STARPU_PTHREAD_MUTEX_LOCK(&_starpu_mpi_comms_mutex); while (1) { struct _starpu_mpi_comm *_comm = _starpu_mpi_comms[i]; // get the ith _comm; if (_comm->posted) { int flag, res; /* test whether an envelope has arrived. */ #ifdef STARPU_SIMGRID MSG_process_sleep(0.000001); #endif res = MPI_Test(&_comm->request, &flag, status); STARPU_ASSERT(res == MPI_SUCCESS); if (flag) { _comm->posted = 0; _starpu_mpi_comm_tested++; if (_starpu_mpi_comm_tested == _starpu_mpi_comm_nb) _starpu_mpi_comm_tested = 0; *envelope = _comm->envelope; *comm = _comm->comm; STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_comms_mutex); return 1; } } i++; if (i == _starpu_mpi_comm_nb) { i=0; } if (i == _starpu_mpi_comm_tested) { // We have tested all the requests, none has completed STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_comms_mutex); return 0; } } STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_comms_mutex); return 0; } void _starpu_mpi_comm_cancel_recv() { int i; STARPU_PTHREAD_MUTEX_LOCK(&_starpu_mpi_comms_mutex); for(i=0 ; i<_starpu_mpi_comm_nb ; i++) { struct _starpu_mpi_comm *_comm = _starpu_mpi_comms[i]; // get the ith _comm; if (_comm->posted == 1) { MPI_Status status; MPI_Cancel(&_comm->request); MPI_Wait(&_comm->request, &status); _comm->posted = 0; } } STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_comms_mutex); } starpu-1.2.3+dfsg/mpi/src/starpu_mpi_comm.h000066400000000000000000000022111320135501600206650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_MPI_COMM_H__ #define __STARPU_MPI_COMM_H__ #include #include #include #ifdef __cplusplus extern "C" { #endif void _starpu_mpi_comm_init(MPI_Comm comm); void _starpu_mpi_comm_free(); void _starpu_mpi_comm_register(MPI_Comm comm); void _starpu_mpi_comm_post_recv(); int _starpu_mpi_comm_test_recv(MPI_Status *status, struct _starpu_mpi_envelope **envelope, MPI_Comm *comm); void _starpu_mpi_comm_cancel_recv(); #ifdef __cplusplus } #endif #endif // __STARPU_MPI_COMM_H__ starpu-1.2.3+dfsg/mpi/src/starpu_mpi_datatype.c000066400000000000000000000246041320135501600215520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2011, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include struct _starpu_mpi_datatype_funcs { enum starpu_data_interface_id id; starpu_mpi_datatype_allocate_func_t allocate_datatype_func; starpu_mpi_datatype_free_func_t free_datatype_func; UT_hash_handle hh; }; static starpu_pthread_mutex_t _starpu_mpi_datatype_funcs_table_mutex; static struct _starpu_mpi_datatype_funcs *_starpu_mpi_datatype_funcs_table = NULL; void _starpu_mpi_datatype_init(void) { STARPU_PTHREAD_MUTEX_INIT(&_starpu_mpi_datatype_funcs_table_mutex, NULL); } void _starpu_mpi_datatype_free(void) { STARPU_PTHREAD_MUTEX_DESTROY(&_starpu_mpi_datatype_funcs_table_mutex); } /* * Matrix */ static void handle_to_datatype_matrix(starpu_data_handle_t data_handle, MPI_Datatype *datatype) { int ret; unsigned nx = starpu_matrix_get_nx(data_handle); unsigned ny = starpu_matrix_get_ny(data_handle); unsigned ld = starpu_matrix_get_local_ld(data_handle); size_t elemsize = starpu_matrix_get_elemsize(data_handle); ret = MPI_Type_vector(ny, nx*elemsize, ld*elemsize, MPI_BYTE, datatype); STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_vector failed"); ret = MPI_Type_commit(datatype); STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_commit failed"); } /* * Block */ static void handle_to_datatype_block(starpu_data_handle_t data_handle, MPI_Datatype *datatype) { int ret; unsigned nx = starpu_block_get_nx(data_handle); unsigned ny = starpu_block_get_ny(data_handle); unsigned nz = starpu_block_get_nz(data_handle); unsigned ldy = starpu_block_get_local_ldy(data_handle); unsigned ldz = starpu_block_get_local_ldz(data_handle); size_t elemsize = starpu_block_get_elemsize(data_handle); MPI_Datatype datatype_2dlayer; ret = MPI_Type_vector(ny, nx*elemsize, ldy*elemsize, MPI_BYTE, &datatype_2dlayer); STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_vector failed"); ret = MPI_Type_commit(&datatype_2dlayer); STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_commit failed"); ret = MPI_Type_hvector(nz, 1, ldz*elemsize, datatype_2dlayer, datatype); STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_hvector failed"); ret = MPI_Type_commit(datatype); STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_commit failed"); } /* * Vector */ static void handle_to_datatype_vector(starpu_data_handle_t data_handle, MPI_Datatype *datatype) { int ret; unsigned nx = starpu_vector_get_nx(data_handle); size_t elemsize = starpu_vector_get_elemsize(data_handle); ret = MPI_Type_contiguous(nx*elemsize, MPI_BYTE, datatype); STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_contiguous failed"); ret = MPI_Type_commit(datatype); STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_commit failed"); } /* * Variable */ static void handle_to_datatype_variable(starpu_data_handle_t data_handle, MPI_Datatype *datatype) { int ret; size_t elemsize = starpu_variable_get_elemsize(data_handle); ret = MPI_Type_contiguous(elemsize, MPI_BYTE, datatype); STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_contiguous failed"); ret = MPI_Type_commit(datatype); STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_commit failed"); } /* * Void */ static void handle_to_datatype_void(starpu_data_handle_t data_handle STARPU_ATTRIBUTE_UNUSED, MPI_Datatype *datatype) { int ret; ret = MPI_Type_contiguous(0, MPI_BYTE, datatype); STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_contiguous failed"); ret = MPI_Type_commit(datatype); STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_commit failed"); } /* * Generic */ static starpu_mpi_datatype_allocate_func_t handle_to_datatype_funcs[STARPU_MAX_INTERFACE_ID] = { [STARPU_MATRIX_INTERFACE_ID] = handle_to_datatype_matrix, [STARPU_BLOCK_INTERFACE_ID] = handle_to_datatype_block, [STARPU_VECTOR_INTERFACE_ID] = handle_to_datatype_vector, [STARPU_CSR_INTERFACE_ID] = NULL, /* Sent through pack/unpack operations */ [STARPU_BCSR_INTERFACE_ID] = NULL, /* Sent through pack/unpack operations */ [STARPU_VARIABLE_INTERFACE_ID] = handle_to_datatype_variable, [STARPU_VOID_INTERFACE_ID] = handle_to_datatype_void, [STARPU_MULTIFORMAT_INTERFACE_ID] = NULL, }; void _starpu_mpi_handle_allocate_datatype(starpu_data_handle_t data_handle, struct _starpu_mpi_req *req) { enum starpu_data_interface_id id = starpu_data_get_interface_id(data_handle); if (id < STARPU_MAX_INTERFACE_ID) { starpu_mpi_datatype_allocate_func_t func = handle_to_datatype_funcs[id]; if (func) { func(data_handle, &req->datatype); req->registered_datatype = 1; } else { /* The datatype is predefined by StarPU but it will be sent as a memory area */ req->datatype = MPI_BYTE; req->registered_datatype = 0; } } else { struct _starpu_mpi_datatype_funcs *table; STARPU_PTHREAD_MUTEX_LOCK(&_starpu_mpi_datatype_funcs_table_mutex); HASH_FIND_INT(_starpu_mpi_datatype_funcs_table, &id, table); STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_datatype_funcs_table_mutex); if (table) { STARPU_ASSERT_MSG(table->allocate_datatype_func, "Handle To Datatype Function not defined for StarPU data interface %d", id); table->allocate_datatype_func(data_handle, &req->datatype); req->registered_datatype = 1; } else { /* The datatype is not predefined by StarPU */ req->datatype = MPI_BYTE; req->registered_datatype = 0; } } #ifdef STARPU_VERBOSE { char datatype_name[MPI_MAX_OBJECT_NAME]; int datatype_name_len; MPI_Type_get_name(req->datatype, datatype_name, &datatype_name_len); if (datatype_name_len == 0) req->datatype_name = strdup("User defined datatype"); else req->datatype_name = strdup(datatype_name); } #endif } static void _starpu_mpi_handle_free_simple_datatype(MPI_Datatype *datatype) { MPI_Type_free(datatype); } static void _starpu_mpi_handle_free_complex_datatype(MPI_Datatype *datatype) { int num_ints, num_adds, num_datatypes, combiner, i; int *array_of_ints; MPI_Aint *array_of_adds; MPI_Datatype *array_of_datatypes; MPI_Type_get_envelope(*datatype, &num_ints, &num_adds, &num_datatypes, &combiner); if (combiner != MPI_COMBINER_NAMED) { _STARPU_MPI_MALLOC(array_of_ints, num_ints * sizeof(int)); _STARPU_MPI_MALLOC(array_of_adds, num_adds * sizeof(MPI_Aint)); _STARPU_MPI_MALLOC(array_of_datatypes, num_datatypes * sizeof(MPI_Datatype)); MPI_Type_get_contents(*datatype, num_ints, num_adds, num_datatypes, array_of_ints, array_of_adds, array_of_datatypes); for(i=0 ; ifree_datatype_func, "Free Datatype Function not defined for StarPU data interface %d", id); table->free_datatype_func(datatype); } } /* else the datatype is not predefined by StarPU */ } int starpu_mpi_datatype_register(starpu_data_handle_t handle, starpu_mpi_datatype_allocate_func_t allocate_datatype_func, starpu_mpi_datatype_free_func_t free_datatype_func) { enum starpu_data_interface_id id = starpu_data_get_interface_id(handle); struct _starpu_mpi_datatype_funcs *table; STARPU_ASSERT_MSG(id >= STARPU_MAX_INTERFACE_ID, "Cannot redefine the MPI datatype for a predefined StarPU datatype"); STARPU_PTHREAD_MUTEX_LOCK(&_starpu_mpi_datatype_funcs_table_mutex); HASH_FIND_INT(_starpu_mpi_datatype_funcs_table, &id, table); if (table) { table->allocate_datatype_func = allocate_datatype_func; table->free_datatype_func = free_datatype_func; } else { _STARPU_MPI_MALLOC(table, sizeof(struct _starpu_mpi_datatype_funcs)); table->id = id; table->allocate_datatype_func = allocate_datatype_func; table->free_datatype_func = free_datatype_func; HASH_ADD_INT(_starpu_mpi_datatype_funcs_table, id, table); } STARPU_ASSERT_MSG(handle->ops->handle_to_pointer, "The data interface must define the operation 'handle_to_pointer'\n"); STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_datatype_funcs_table_mutex); return 0; } int starpu_mpi_datatype_unregister(starpu_data_handle_t handle) { enum starpu_data_interface_id id = starpu_data_get_interface_id(handle); struct _starpu_mpi_datatype_funcs *table; STARPU_ASSERT_MSG(id >= STARPU_MAX_INTERFACE_ID, "Cannot redefine the MPI datatype for a predefined StarPU datatype"); STARPU_PTHREAD_MUTEX_LOCK(&_starpu_mpi_datatype_funcs_table_mutex); HASH_FIND_INT(_starpu_mpi_datatype_funcs_table, &id, table); if (table) { HASH_DEL(_starpu_mpi_datatype_funcs_table, table); free(table); } STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_datatype_funcs_table_mutex); return 0; } starpu-1.2.3+dfsg/mpi/src/starpu_mpi_datatype.h000066400000000000000000000023141320135501600215510ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2011 Université de Bordeaux * Copyright (C) 2010, 2012, 2013, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_MPI_DATATYPE_H__ #define __STARPU_MPI_DATATYPE_H__ #include #include #ifdef __cplusplus extern "C" { #endif void _starpu_mpi_datatype_init(void); void _starpu_mpi_datatype_free(void); void _starpu_mpi_handle_allocate_datatype(starpu_data_handle_t data_handle, struct _starpu_mpi_req *req); void _starpu_mpi_handle_free_datatype(starpu_data_handle_t data_handle, MPI_Datatype *datatype); #ifdef __cplusplus } #endif #endif // __STARPU_MPI_DATATYPE_H__ starpu-1.2.3+dfsg/mpi/src/starpu_mpi_early_data.c000066400000000000000000000125571320135501600220500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2014, 2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include struct _starpu_mpi_early_data_handle_hashlist { struct _starpu_mpi_early_data_handle_list list; UT_hash_handle hh; struct _starpu_mpi_node_tag node_tag; }; /** stores data which have been received by MPI but have not been requested by the application */ static starpu_pthread_mutex_t _starpu_mpi_early_data_handle_mutex; static struct _starpu_mpi_early_data_handle_hashlist *_starpu_mpi_early_data_handle_hashmap = NULL; static int _starpu_mpi_early_data_handle_hashmap_count = 0; void _starpu_mpi_early_data_init(void) { _starpu_mpi_early_data_handle_hashmap = NULL; _starpu_mpi_early_data_handle_hashmap_count = 0; STARPU_PTHREAD_MUTEX_INIT(&_starpu_mpi_early_data_handle_mutex, NULL); } void _starpu_mpi_early_data_check_termination(void) { if (_starpu_mpi_early_data_handle_hashmap_count != 0) { struct _starpu_mpi_early_data_handle_hashlist *current, *tmp; HASH_ITER(hh, _starpu_mpi_early_data_handle_hashmap, current, tmp) { _STARPU_MSG("Unexpected message with comm %ld source %d tag %ld\n", (long int)current->node_tag.comm, current->node_tag.rank, current->node_tag.data_tag); } STARPU_ASSERT_MSG(_starpu_mpi_early_data_handle_hashmap_count == 0, "Number of unexpected received messages left is not 0 (but %d), did you forget to post a receive corresponding to a send?", _starpu_mpi_early_data_handle_hashmap_count); } } void _starpu_mpi_early_data_free(void) { struct _starpu_mpi_early_data_handle_hashlist *current, *tmp; HASH_ITER(hh, _starpu_mpi_early_data_handle_hashmap, current, tmp) { STARPU_ASSERT(_starpu_mpi_early_data_handle_list_empty(¤t->list)); HASH_DEL(_starpu_mpi_early_data_handle_hashmap, current); free(current); } STARPU_PTHREAD_MUTEX_DESTROY(&_starpu_mpi_early_data_handle_mutex); } struct _starpu_mpi_early_data_handle *_starpu_mpi_early_data_create(struct _starpu_mpi_envelope *envelope, int source, MPI_Comm comm) { struct _starpu_mpi_early_data_handle *early_data_handle; _STARPU_MPI_CALLOC(early_data_handle, 1, sizeof(struct _starpu_mpi_early_data_handle)); STARPU_PTHREAD_MUTEX_INIT(&early_data_handle->req_mutex, NULL); STARPU_PTHREAD_COND_INIT(&early_data_handle->req_cond, NULL); early_data_handle->env = envelope; early_data_handle->node_tag.comm = comm; early_data_handle->node_tag.rank = source; early_data_handle->node_tag.data_tag = envelope->data_tag; return early_data_handle; } struct _starpu_mpi_early_data_handle *_starpu_mpi_early_data_find(struct _starpu_mpi_node_tag *node_tag) { struct _starpu_mpi_early_data_handle_hashlist *hashlist; struct _starpu_mpi_early_data_handle *early_data_handle; STARPU_PTHREAD_MUTEX_LOCK(&_starpu_mpi_early_data_handle_mutex); _STARPU_MPI_DEBUG(60, "Looking for early_data_handle with comm %d source %d tag %d\n", node_tag->comm, node_tag->rank, node_tag->data_tag); HASH_FIND(hh, _starpu_mpi_early_data_handle_hashmap, node_tag, sizeof(struct _starpu_mpi_node_tag), hashlist); if (hashlist == NULL) { early_data_handle = NULL; } else { if (_starpu_mpi_early_data_handle_list_empty(&hashlist->list)) { early_data_handle = NULL; } else { _starpu_mpi_early_data_handle_hashmap_count --; early_data_handle = _starpu_mpi_early_data_handle_list_pop_front(&hashlist->list); } } _STARPU_MPI_DEBUG(60, "Found early_data_handle %p with comm %d source %d tag %d\n", early_data_handle, node_tag->comm, node_tag->rank, node_tag->data_tag); STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_early_data_handle_mutex); return early_data_handle; } void _starpu_mpi_early_data_add(struct _starpu_mpi_early_data_handle *early_data_handle) { STARPU_PTHREAD_MUTEX_LOCK(&_starpu_mpi_early_data_handle_mutex); _STARPU_MPI_DEBUG(60, "Trying to add early_data_handle %p with comm %d source %d tag %d\n", early_data_handle, early_data_handle->node_tag.comm, early_data_handle->node_tag.rank, early_data_handle->node_tag.data_tag); struct _starpu_mpi_early_data_handle_hashlist *hashlist; HASH_FIND(hh, _starpu_mpi_early_data_handle_hashmap, &early_data_handle->node_tag, sizeof(struct _starpu_mpi_node_tag), hashlist); if (hashlist == NULL) { _STARPU_MPI_MALLOC(hashlist, sizeof(struct _starpu_mpi_early_data_handle_hashlist)); _starpu_mpi_early_data_handle_list_init(&hashlist->list); hashlist->node_tag = early_data_handle->node_tag; HASH_ADD(hh, _starpu_mpi_early_data_handle_hashmap, node_tag, sizeof(hashlist->node_tag), hashlist); } _starpu_mpi_early_data_handle_list_push_back(&hashlist->list, early_data_handle); _starpu_mpi_early_data_handle_hashmap_count ++; STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_early_data_handle_mutex); } starpu-1.2.3+dfsg/mpi/src/starpu_mpi_early_data.h000066400000000000000000000034711320135501600220500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_MPI_EARLY_DATA_H__ #define __STARPU_MPI_EARLY_DATA_H__ #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif LIST_TYPE(_starpu_mpi_early_data_handle, starpu_data_handle_t handle; struct _starpu_mpi_envelope *env; struct _starpu_mpi_req *req; void *buffer; int req_ready; struct _starpu_mpi_node_tag node_tag; starpu_pthread_mutex_t req_mutex; starpu_pthread_cond_t req_cond; ); void _starpu_mpi_early_data_init(void); void _starpu_mpi_early_data_check_termination(void); void _starpu_mpi_early_data_free(void); struct _starpu_mpi_early_data_handle *_starpu_mpi_early_data_create(struct _starpu_mpi_envelope *envelope, int source, MPI_Comm comm) STARPU_ATTRIBUTE_MALLOC; struct _starpu_mpi_early_data_handle *_starpu_mpi_early_data_find(struct _starpu_mpi_node_tag *node_tag); void _starpu_mpi_early_data_add(struct _starpu_mpi_early_data_handle *early_data_handle); #ifdef __cplusplus } #endif #endif /* __STARPU_MPI_EARLY_DATA_H__ */ starpu-1.2.3+dfsg/mpi/src/starpu_mpi_early_request.c000066400000000000000000000101041320135501600226110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2014, 2016-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include /** stores application requests for which data have not been received yet */ struct _starpu_mpi_early_request_hashlist { struct _starpu_mpi_req_list list; UT_hash_handle hh; struct _starpu_mpi_node_tag node_tag; }; static starpu_pthread_mutex_t _starpu_mpi_early_request_mutex; struct _starpu_mpi_early_request_hashlist *_starpu_mpi_early_request_hash; int _starpu_mpi_early_request_hash_count; void _starpu_mpi_early_request_init() { _starpu_mpi_early_request_hash = NULL; _starpu_mpi_early_request_hash_count = 0; STARPU_PTHREAD_MUTEX_INIT(&_starpu_mpi_early_request_mutex, NULL); } void _starpu_mpi_early_request_free() { struct _starpu_mpi_early_request_hashlist *entry, *tmp; HASH_ITER(hh, _starpu_mpi_early_request_hash, entry, tmp) { STARPU_ASSERT(_starpu_mpi_req_list_empty(&entry->list)); HASH_DEL(_starpu_mpi_early_request_hash, entry); free(entry); } STARPU_PTHREAD_MUTEX_DESTROY(&_starpu_mpi_early_request_mutex); } int _starpu_mpi_early_request_count() { return _starpu_mpi_early_request_hash_count; } void _starpu_mpi_early_request_check_termination() { STARPU_ASSERT_MSG(_starpu_mpi_early_request_count() == 0, "Number of early requests left is not zero"); } struct _starpu_mpi_req* _starpu_mpi_early_request_dequeue(int data_tag, int source, MPI_Comm comm) { struct _starpu_mpi_node_tag node_tag; struct _starpu_mpi_req *found; struct _starpu_mpi_early_request_hashlist *hashlist; STARPU_PTHREAD_MUTEX_LOCK(&_starpu_mpi_early_request_mutex); memset(&node_tag, 0, sizeof(struct _starpu_mpi_node_tag)); node_tag.comm = comm; node_tag.rank = source; node_tag.data_tag = data_tag; _STARPU_MPI_DEBUG(100, "Looking for early_request with comm %d source %d tag %d\n", node_tag.comm, node_tag.rank, node_tag.data_tag); HASH_FIND(hh, _starpu_mpi_early_request_hash, &node_tag, sizeof(struct _starpu_mpi_node_tag), hashlist); if (hashlist == NULL) { found = NULL; } else { if (_starpu_mpi_req_list_empty(&hashlist->list)) { found = NULL; } else { found = _starpu_mpi_req_list_pop_front(&hashlist->list); _starpu_mpi_early_request_hash_count --; } } _STARPU_MPI_DEBUG(100, "Found early_request %p with comm %d source %d tag %d\n", found, node_tag.comm, node_tag.rank, node_tag.data_tag); STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_early_request_mutex); return found; } void _starpu_mpi_early_request_enqueue(struct _starpu_mpi_req *req) { STARPU_PTHREAD_MUTEX_LOCK(&_starpu_mpi_early_request_mutex); _STARPU_MPI_DEBUG(100, "Adding request %p with comm %d source %d tag %d in the application request hashmap\n", req, req->node_tag.comm, req->node_tag.rank, req->node_tag.data_tag); struct _starpu_mpi_early_request_hashlist *hashlist; HASH_FIND(hh, _starpu_mpi_early_request_hash, &req->node_tag, sizeof(struct _starpu_mpi_node_tag), hashlist); if (hashlist == NULL) { _STARPU_MPI_MALLOC(hashlist, sizeof(struct _starpu_mpi_early_request_hashlist)); _starpu_mpi_req_list_init(&hashlist->list); hashlist->node_tag = req->node_tag; HASH_ADD(hh, _starpu_mpi_early_request_hash, node_tag, sizeof(hashlist->node_tag), hashlist); } _starpu_mpi_req_list_push_back(&hashlist->list, req); _starpu_mpi_early_request_hash_count ++; STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_early_request_mutex); } starpu-1.2.3+dfsg/mpi/src/starpu_mpi_early_request.h000066400000000000000000000025521320135501600226260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_MPI_EARLY_REQUEST_H__ #define __STARPU_MPI_EARLY_REQUEST_H__ #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif void _starpu_mpi_early_request_init(void); void _starpu_mpi_early_request_free(void); int _starpu_mpi_early_request_count(void); void _starpu_mpi_early_request_check_termination(void); void _starpu_mpi_early_request_enqueue(struct _starpu_mpi_req *req); struct _starpu_mpi_req* _starpu_mpi_early_request_dequeue(int data_tag, int source, MPI_Comm comm); #ifdef __cplusplus } #endif #endif /* __STARPU_MPI_EARLY_REQUEST_H__ */ starpu-1.2.3+dfsg/mpi/src/starpu_mpi_fortran.c000066400000000000000000000207201320135501600214050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016, 2017 CNRS * Copyright (C) 2016 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "starpu_mpi_private.h" #ifdef HAVE_MPI_COMM_F2C /* Fortran related functions */ struct _starpu_mpi_argc_argv *fstarpu_mpi_argcv_alloc(int argc, int initialize_mpi, int comm_present, MPI_Fint comm) { struct _starpu_mpi_argc_argv *argcv; _STARPU_MPI_CALLOC(argcv, 1,sizeof(*argcv)); argcv->initialize_mpi = initialize_mpi; if (comm_present) { argcv->comm = MPI_Comm_f2c(comm); } else { argcv->comm = MPI_COMM_WORLD; } argcv->fargc = argc; argcv->argc = &argcv->fargc; _STARPU_MPI_CALLOC(argcv->fargv, argc, sizeof(char *)); argcv->argv = &argcv->fargv; return argcv; } void fstarpu_mpi_argcv_set_arg(struct _starpu_mpi_argc_argv *argcv, int i, int len, char *_s) { STARPU_ASSERT(len >= 0); STARPU_ASSERT(i >= 0 && i < argcv->fargc); char *s; _STARPU_MPI_MALLOC(s, len+1); memcpy(s, _s, len); s[len] = '\0'; argcv->fargv[i] = s; } void fstarpu_mpi_argcv_free(struct _starpu_mpi_argc_argv *argcv) { if (argcv->fargv != NULL) { int i; for (i=0; ifargc; i++) { free(argcv->fargv[i]); } free(argcv->fargv); } free(argcv); } starpu_mpi_req *fstarpu_mpi_req_alloc(void) { starpu_mpi_req *req; _STARPU_MPI_CALLOC(req, 1, sizeof(starpu_mpi_req)); return req; } void fstarpu_mpi_req_free(starpu_mpi_req *req) { free(req); } MPI_Status *fstarpu_mpi_status_alloc(void) { MPI_Status *s; _STARPU_MPI_CALLOC(s, 1, sizeof(MPI_Status)); return s; } void fstarpu_mpi_status_free(MPI_Status *status) { free(status); } int fstarpu_mpi_barrier(MPI_Fint comm) { return starpu_mpi_barrier(MPI_Comm_f2c(comm)); } int fstarpu_mpi_irecv_detached_sequential_consistency(starpu_data_handle_t data_handle, int src, int mpi_tag, MPI_Fint comm, void (*callback)(void *), void *arg, int seq_const) { return starpu_mpi_irecv_detached_sequential_consistency(data_handle, src, mpi_tag, MPI_Comm_f2c(comm), callback, arg, seq_const); } int fstarpu_mpi_init_c(struct _starpu_mpi_argc_argv *argcv) { return starpu_mpi_init_comm(argcv->argc, argcv->argv, argcv->initialize_mpi, argcv->comm); } void fstarpu_mpi_get_data_on_node(MPI_Fint comm, starpu_data_handle_t data_handle, int node) { starpu_mpi_get_data_on_node(MPI_Comm_f2c(comm), data_handle, node); } void fstarpu_mpi_get_data_on_node_detached(MPI_Fint comm, starpu_data_handle_t data_handle, int node, void (*callback)(void *), void *arg) { starpu_mpi_get_data_on_node_detached(MPI_Comm_f2c(comm), data_handle, node, callback, arg); } void fstarpu_mpi_redux_data(MPI_Fint comm, starpu_data_handle_t data_handle) { starpu_mpi_redux_data(MPI_Comm_f2c(comm), data_handle); } /* scatter/gather */ int fstarpu_mpi_scatter_detached(starpu_data_handle_t *data_handles, int cnt, int root, MPI_Fint comm, void (*scallback)(void *), void *sarg, void (*rcallback)(void *), void *rarg) { return starpu_mpi_scatter_detached(data_handles, cnt, root, MPI_Comm_f2c(comm), scallback, sarg, rcallback, rarg); } int fstarpu_mpi_gather_detached(starpu_data_handle_t *data_handles, int cnt, int root, MPI_Fint comm, void (*scallback)(void *), void *sarg, void (*rcallback)(void *), void *rarg) { return starpu_mpi_gather_detached(data_handles, cnt, root, MPI_Comm_f2c(comm), scallback, sarg, rcallback, rarg); } /* isend/irecv detached unlock tag */ int fstarpu_mpi_isend_detached_unlock_tag(starpu_data_handle_t data_handle, int dst, int mpi_tag, MPI_Fint comm, starpu_tag_t *starpu_tag) { return starpu_mpi_isend_detached_unlock_tag(data_handle, dst, mpi_tag, MPI_Comm_f2c(comm), *starpu_tag); } int fstarpu_mpi_irecv_detached_unlock_tag(starpu_data_handle_t data_handle, int src, int mpi_tag, MPI_Fint comm, starpu_tag_t *starpu_tag) { return starpu_mpi_irecv_detached_unlock_tag(data_handle, src, mpi_tag, MPI_Comm_f2c(comm), *starpu_tag); } /* isend/irecv array detached unlock tag */ int fstarpu_mpi_isend_array_detached_unlock_tag(int array_size, starpu_data_handle_t *data_handles, int *dsts, int *mpi_tags, MPI_Fint *_comms, starpu_tag_t *starpu_tag) { MPI_Comm comms[array_size]; int i; for (i = 0; i < array_size; i++) { comms[i] = MPI_Comm_f2c(_comms[i]); } int ret = starpu_mpi_isend_array_detached_unlock_tag((unsigned)array_size, data_handles, dsts, mpi_tags, comms, *starpu_tag); return ret; } int fstarpu_mpi_irecv_array_detached_unlock_tag(int array_size, starpu_data_handle_t *data_handles, int *srcs, int *mpi_tags, MPI_Fint *_comms, starpu_tag_t *starpu_tag) { MPI_Comm comms[array_size]; int i; for (i = 0; i < array_size; i++) { comms[i] = MPI_Comm_f2c(_comms[i]); } int ret = starpu_mpi_irecv_array_detached_unlock_tag((unsigned)array_size, data_handles, srcs, mpi_tags, comms, *starpu_tag); return ret; } /* isend/irecv */ int fstarpu_mpi_isend(starpu_data_handle_t data_handle, starpu_mpi_req *req, int dst, int mpi_tag, MPI_Fint comm) { return starpu_mpi_isend(data_handle, req, dst, mpi_tag, MPI_Comm_f2c(comm)); } int fstarpu_mpi_irecv(starpu_data_handle_t data_handle, starpu_mpi_req *req, int src, int mpi_tag, MPI_Fint comm) { return starpu_mpi_irecv(data_handle, req, src, mpi_tag, MPI_Comm_f2c(comm)); } /* send/recv */ int fstarpu_mpi_send(starpu_data_handle_t data_handle, int dst, int mpi_tag, MPI_Fint comm) { return starpu_mpi_send(data_handle, dst, mpi_tag, MPI_Comm_f2c(comm)); } int fstarpu_mpi_recv(starpu_data_handle_t data_handle, int src, int mpi_tag, MPI_Fint comm, MPI_Status *status) { return starpu_mpi_recv(data_handle, src, mpi_tag, MPI_Comm_f2c(comm), status); } /* isend/irecv detached */ int fstarpu_mpi_isend_detached(starpu_data_handle_t data_handle, int dst, int mpi_tag, MPI_Fint comm, void (*callback)(void *), void *arg) { return starpu_mpi_isend_detached(data_handle, dst, mpi_tag, MPI_Comm_f2c(comm), callback, arg); } int fstarpu_mpi_irecv_detached(starpu_data_handle_t data_handle, int src, int mpi_tag, MPI_Fint comm, void (*callback)(void *), void *arg) { return starpu_mpi_irecv_detached(data_handle, src, mpi_tag, MPI_Comm_f2c(comm), callback, arg); } /* issend / issend detached */ int fstarpu_mpi_issend(starpu_data_handle_t data_handle, starpu_mpi_req *req, int dst, int mpi_tag, MPI_Fint comm) { return starpu_mpi_issend(data_handle, req, dst, mpi_tag, MPI_Comm_f2c(comm)); } int fstarpu_mpi_issend_detached(starpu_data_handle_t data_handle, int dst, int mpi_tag, MPI_Fint comm, void (*callback)(void *), void *arg) { return starpu_mpi_issend_detached(data_handle, dst, mpi_tag, MPI_Comm_f2c(comm), callback, arg); } /* cache */ void fstarpu_mpi_cache_flush(MPI_Fint comm, starpu_data_handle_t data_handle) { return starpu_mpi_cache_flush(MPI_Comm_f2c(comm), data_handle); } void fstarpu_mpi_cache_flush_all_data(MPI_Fint comm) { return starpu_mpi_cache_flush_all_data(MPI_Comm_f2c(comm)); } int fstarpu_mpi_comm_size(MPI_Fint comm, int *size) { return starpu_mpi_comm_size(MPI_Comm_f2c(comm), size); } int fstarpu_mpi_comm_rank(MPI_Fint comm, int *rank) { return starpu_mpi_comm_rank(MPI_Comm_f2c(comm), rank); } MPI_Fint fstarpu_mpi_world_comm() { return MPI_Comm_c2f(MPI_COMM_WORLD); } void fstarpu_mpi_data_register_comm(starpu_data_handle_t handle, int tag, int rank, MPI_Fint comm) { return starpu_mpi_data_register_comm(handle, tag, rank, MPI_Comm_f2c(comm)); } void fstarpu_mpi_data_register(starpu_data_handle_t handle, int tag, int rank) { return starpu_mpi_data_register_comm(handle, tag, rank, MPI_COMM_WORLD); } void fstarpu_mpi_data_set_rank_comm(starpu_data_handle_t handle, int rank, MPI_Fint comm) { return starpu_mpi_data_set_rank_comm(handle, rank, MPI_Comm_f2c(comm)); } void fstarpu_mpi_data_set_rank(starpu_data_handle_t handle, int rank) { return starpu_mpi_data_set_rank_comm(handle, rank, MPI_COMM_WORLD); } void fstarpu_mpi_data_migrate(MPI_Fint comm, starpu_data_handle_t handle, int rank) { return starpu_mpi_data_migrate(MPI_Comm_f2c(comm), handle, rank); } int fstarpu_mpi_wait_for_all(MPI_Fint comm) { return starpu_mpi_wait_for_all(MPI_Comm_f2c(comm)); } #endif starpu-1.2.3+dfsg/mpi/src/starpu_mpi_fxt.h000066400000000000000000000172131320135501600205430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2017 Université de Bordeaux * Copyright (C) 2010, 2012, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_MPI_FXT_H__ #define __STARPU_MPI_FXT_H__ #include #include #include #ifdef __cplusplus extern "C" { #endif #define _STARPU_MPI_FUT_START 0x5201 #define _STARPU_MPI_FUT_STOP 0x5202 #define _STARPU_MPI_FUT_BARRIER 0x5203 #define _STARPU_MPI_FUT_ISEND_SUBMIT_BEGIN 0x5204 #define _STARPU_MPI_FUT_ISEND_SUBMIT_END 0x5205 #define _STARPU_MPI_FUT_IRECV_SUBMIT_BEGIN 0x5206 #define _STARPU_MPI_FUT_IRECV_SUBMIT_END 0x5207 #define _STARPU_MPI_FUT_ISEND_COMPLETE_BEGIN 0x5208 #define _STARPU_MPI_FUT_ISEND_COMPLETE_END 0x5209 #define _STARPU_MPI_FUT_IRECV_COMPLETE_BEGIN 0x5210 #define _STARPU_MPI_FUT_IRECV_COMPLETE_END 0x5211 #define _STARPU_MPI_FUT_SLEEP_BEGIN 0x5212 #define _STARPU_MPI_FUT_SLEEP_END 0x5213 #define _STARPU_MPI_FUT_DTESTING_BEGIN 0x5214 #define _STARPU_MPI_FUT_DTESTING_END 0x5215 #define _STARPU_MPI_FUT_UTESTING_BEGIN 0x5216 #define _STARPU_MPI_FUT_UTESTING_END 0x5217 #define _STARPU_MPI_FUT_UWAIT_BEGIN 0x5218 #define _STARPU_MPI_FUT_UWAIT_END 0x5219 #define _STARPU_MPI_FUT_DATA_SET_RANK 0x521a #define _STARPU_MPI_FUT_IRECV_TERMINATED 0x521b #define _STARPU_MPI_FUT_ISEND_TERMINATED 0x521c #define _STARPU_MPI_FUT_TESTING_DETACHED_BEGIN 0x521d #define _STARPU_MPI_FUT_TESTING_DETACHED_END 0x521e #define _STARPU_MPI_FUT_TEST_BEGIN 0x521f #define _STARPU_MPI_FUT_TEST_END 0x5220 #ifdef STARPU_USE_FXT #define _STARPU_MPI_TRACE_START(rank, worldsize) \ FUT_DO_PROBE3(_STARPU_MPI_FUT_START, (rank), (worldsize), _starpu_gettid()); #define _STARPU_MPI_TRACE_STOP(rank, worldsize) \ FUT_DO_PROBE3(_STARPU_MPI_FUT_STOP, (rank), (worldsize), _starpu_gettid()); #define _STARPU_MPI_TRACE_BARRIER(rank, worldsize, key) \ FUT_DO_PROBE4(_STARPU_MPI_FUT_BARRIER, (rank), (worldsize), (key), _starpu_gettid()); #define _STARPU_MPI_TRACE_ISEND_SUBMIT_BEGIN(dest, mpi_tag, size) \ FUT_DO_PROBE4(_STARPU_MPI_FUT_ISEND_SUBMIT_BEGIN, (dest), (mpi_tag), (size), _starpu_gettid()); #define _STARPU_MPI_TRACE_ISEND_SUBMIT_END(dest, mpi_tag, size, jobid) \ FUT_DO_PROBE5(_STARPU_MPI_FUT_ISEND_SUBMIT_END, (dest), (mpi_tag), (size), (jobid), _starpu_gettid()); #define _STARPU_MPI_TRACE_IRECV_SUBMIT_BEGIN(src, mpi_tag) \ FUT_DO_PROBE3(_STARPU_MPI_FUT_IRECV_SUBMIT_BEGIN, (src), (mpi_tag), _starpu_gettid()); #define _STARPU_MPI_TRACE_IRECV_SUBMIT_END(src, mpi_tag) \ FUT_DO_PROBE3(_STARPU_MPI_FUT_IRECV_SUBMIT_END, (src), (mpi_tag), _starpu_gettid()); #define _STARPU_MPI_TRACE_ISEND_COMPLETE_BEGIN(dest, mpi_tag, size) \ FUT_DO_PROBE4(_STARPU_MPI_FUT_ISEND_COMPLETE_BEGIN, (dest), (mpi_tag), (size), _starpu_gettid()); #define _STARPU_MPI_TRACE_ISEND_COMPLETE_END(dest, mpi_tag, size) \ FUT_DO_PROBE4(_STARPU_MPI_FUT_ISEND_COMPLETE_END, (dest), (mpi_tag), (size), _starpu_gettid()); #define _STARPU_MPI_TRACE_IRECV_COMPLETE_BEGIN(src, mpi_tag) \ FUT_DO_PROBE3(_STARPU_MPI_FUT_IRECV_COMPLETE_BEGIN, (src), (mpi_tag), _starpu_gettid()); #define _STARPU_MPI_TRACE_IRECV_COMPLETE_END(src, mpi_tag) \ FUT_DO_PROBE3(_STARPU_MPI_FUT_IRECV_COMPLETE_END, (src), (mpi_tag), _starpu_gettid()); #define _STARPU_MPI_TRACE_TERMINATED(req, rank, mpi_tag) \ if ((req)->request_type == RECV_REQ) FUT_DO_PROBE4(_STARPU_MPI_FUT_IRECV_TERMINATED, (rank), (mpi_tag), (req)->post_sync_jobid, _starpu_gettid()); else \ if ((req)->request_type == SEND_REQ) FUT_DO_PROBE3(_STARPU_MPI_FUT_ISEND_TERMINATED, (rank), (mpi_tag), _starpu_gettid()); #define _STARPU_MPI_TRACE_SLEEP_BEGIN() \ FUT_DO_PROBE1(_STARPU_MPI_FUT_SLEEP_BEGIN, _starpu_gettid()); #define _STARPU_MPI_TRACE_SLEEP_END() \ FUT_DO_PROBE1(_STARPU_MPI_FUT_SLEEP_END, _starpu_gettid()); #define _STARPU_MPI_TRACE_DTESTING_BEGIN() \ FUT_DO_PROBE1(_STARPU_MPI_FUT_DTESTING_BEGIN, _starpu_gettid()); #define _STARPU_MPI_TRACE_DTESTING_END() \ FUT_DO_PROBE1(_STARPU_MPI_FUT_DTESTING_END, _starpu_gettid()); #define _STARPU_MPI_TRACE_UTESTING_BEGIN(src, mpi_tag) \ FUT_DO_PROBE3(_STARPU_MPI_FUT_UTESTING_BEGIN, (src), (mpi_tag), _starpu_gettid()); #define _STARPU_MPI_TRACE_UTESTING_END(src, mpi_tag) \ FUT_DO_PROBE3(_STARPU_MPI_FUT_UTESTING_END, (src), (mpi_tag), _starpu_gettid()); #define _STARPU_MPI_TRACE_UWAIT_BEGIN(src, mpi_tag) \ FUT_DO_PROBE3(_STARPU_MPI_FUT_UWAIT_BEGIN, (src), (mpi_tag), _starpu_gettid()); #define _STARPU_MPI_TRACE_UWAIT_END(src, mpi_tag) \ FUT_DO_PROBE3(_STARPU_MPI_FUT_UWAIT_END, (src), (mpi_tag), _starpu_gettid()); #define _STARPU_MPI_TRACE_DATA_SET_RANK(handle, rank) \ FUT_DO_PROBE3(_STARPU_MPI_FUT_DATA_SET_RANK, (handle), (rank), _starpu_gettid()); #if 0 /* This is very expensive in the trace, only enable for debugging */ #define _STARPU_MPI_TRACE_TESTING_DETACHED_BEGIN() \ FUT_DO_PROBE1(_STARPU_MPI_FUT_TESTING_DETACHED_BEGIN, _starpu_gettid()); #define _STARPU_MPI_TRACE_TESTING_DETACHED_END() \ FUT_DO_PROBE1(_STARPU_MPI_FUT_TESTING_DETACHED_END, _starpu_gettid()); #define _STARPU_MPI_TRACE_TEST_BEGIN(peer, mpi_tag) \ FUT_DO_PROBE3(_STARPU_MPI_FUT_TEST_BEGIN, (peer), (mpi_tag), _starpu_gettid()); #define _STARPU_MPI_TRACE_TEST_END(peer, mpi_tag) \ FUT_DO_PROBE3(_STARPU_MPI_FUT_TEST_END, (peer), (mpi_tag), _starpu_gettid()); #else #define _STARPU_MPI_TRACE_TESTING_DETACHED_BEGIN() do {} while(0) #define _STARPU_MPI_TRACE_TESTING_DETACHED_END() do {} while(0) #define _STARPU_MPI_TRACE_TEST_BEGIN(peer, mpi_tag) do {} while(0) #define _STARPU_MPI_TRACE_TEST_END(peer, mpi_tag) do {} while(0) #endif #define TRACE #else #define _STARPU_MPI_TRACE_START(a, b) do {} while(0); #define _STARPU_MPI_TRACE_STOP(a, b) do {} while(0); #define _STARPU_MPI_TRACE_BARRIER(a, b, c) do {} while(0); #define _STARPU_MPI_TRACE_ISEND_SUBMIT_BEGIN(a, b, c) do {} while(0); #define _STARPU_MPI_TRACE_ISEND_SUBMIT_END(a, b, c, d) do {} while(0); #define _STARPU_MPI_TRACE_IRECV_SUBMIT_BEGIN(a, b) do {} while(0); #define _STARPU_MPI_TRACE_IRECV_SUBMIT_END(a, b) do {} while(0); #define _STARPU_MPI_TRACE_ISEND_COMPLETE_BEGIN(a, b, c) do {} while(0); #define _STARPU_MPI_TRACE_TERMINATED(a, b, c) do {} while(0); #define _STARPU_MPI_TRACE_ISEND_COMPLETE_END(a, b, c) do {} while(0); #define _STARPU_MPI_TRACE_IRECV_COMPLETE_BEGIN(a, b) do {} while(0); #define _STARPU_MPI_TRACE_IRECV_COMPLETE_END(a, b) do {} while(0); #define _STARPU_MPI_TRACE_SLEEP_BEGIN() do {} while(0); #define _STARPU_MPI_TRACE_SLEEP_END() do {} while(0); #define _STARPU_MPI_TRACE_DTESTING_BEGIN() do {} while(0); #define _STARPU_MPI_TRACE_DTESTING_END() do {} while(0); #define _STARPU_MPI_TRACE_UTESTING_BEGIN(a, b) do {} while(0); #define _STARPU_MPI_TRACE_UTESTING_END(a, b) do {} while(0); #define _STARPU_MPI_TRACE_UWAIT_BEGIN(a, b) do {} while(0); #define _STARPU_MPI_TRACE_UWAIT_END(a, b) do {} while(0); #define _STARPU_MPI_TRACE_DATA_SET_RANK(a, b) do {} while(0); #define _STARPU_MPI_TRACE_TESTING_DETACHED_BEGIN() do {} while(0) #define _STARPU_MPI_TRACE_TESTING_DETACHED_END() do {} while(0) #define _STARPU_MPI_TRACE_TEST_BEGIN(peer, mpi_tag) do {} while(0) #define _STARPU_MPI_TRACE_TEST_END(peer, mpi_tag) do {} while(0) #endif #ifdef __cplusplus } #endif #endif // __STARPU_MPI_FXT_H__ starpu-1.2.3+dfsg/mpi/src/starpu_mpi_helper.c000066400000000000000000000056021320135501600212130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2015 Université de Bordeaux * Copyright (C) 2010, 2012, 2014, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include static void starpu_mpi_unlock_tag_callback(void *arg) { starpu_tag_t *tagptr = arg; starpu_tag_notify_from_apps(*tagptr); free(tagptr); } int starpu_mpi_isend_detached_unlock_tag(starpu_data_handle_t data_handle, int dest, int data_tag, MPI_Comm comm, starpu_tag_t tag) { starpu_tag_t *tagptr; _STARPU_MPI_MALLOC(tagptr, sizeof(starpu_tag_t)); *tagptr = tag; return starpu_mpi_isend_detached(data_handle, dest, data_tag, comm, starpu_mpi_unlock_tag_callback, tagptr); } int starpu_mpi_irecv_detached_unlock_tag(starpu_data_handle_t data_handle, int source, int data_tag, MPI_Comm comm, starpu_tag_t tag) { starpu_tag_t *tagptr; _STARPU_MPI_MALLOC(tagptr, sizeof(starpu_tag_t)); *tagptr = tag; return starpu_mpi_irecv_detached(data_handle, source, data_tag, comm, starpu_mpi_unlock_tag_callback, tagptr); } struct arg_array { int array_size; starpu_tag_t tag; }; static void starpu_mpi_array_unlock_callback(void *_arg) { struct arg_array *arg = _arg; int remaining = STARPU_ATOMIC_ADD(&arg->array_size, -1); if (remaining == 0) { starpu_tag_notify_from_apps(arg->tag); free(arg); } } int starpu_mpi_isend_array_detached_unlock_tag(unsigned array_size, starpu_data_handle_t *data_handle, int *dest, int *data_tag, MPI_Comm *comm, starpu_tag_t tag) { if (!array_size) return 0; struct arg_array *arg; _STARPU_MPI_MALLOC(arg, sizeof(struct arg_array)); arg->array_size = array_size; arg->tag = tag; unsigned elem; for (elem = 0; elem < array_size; elem++) { starpu_mpi_isend_detached(data_handle[elem], dest[elem], data_tag[elem], comm[elem], starpu_mpi_array_unlock_callback, arg); } return 0; } int starpu_mpi_irecv_array_detached_unlock_tag(unsigned array_size, starpu_data_handle_t *data_handle, int *source, int *data_tag, MPI_Comm *comm, starpu_tag_t tag) { if (!array_size) return 0; struct arg_array *arg; _STARPU_MPI_MALLOC(arg, sizeof(struct arg_array)); arg->array_size = array_size; arg->tag = tag; unsigned elem; for (elem = 0; elem < array_size; elem++) { starpu_mpi_irecv_detached(data_handle[elem], source[elem], data_tag[elem], comm[elem], starpu_mpi_array_unlock_callback, arg); } return 0; } starpu-1.2.3+dfsg/mpi/src/starpu_mpi_private.c000066400000000000000000000025471320135501600214130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012, 2014-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include int _starpu_debug_rank=-1; int _starpu_debug_level_min=0; int _starpu_debug_level_max=0; int _starpu_mpi_tag = 42; int _starpu_mpi_comm_debug; void _starpu_mpi_set_debug_level_min(int level) { _starpu_debug_level_min = level; } void _starpu_mpi_set_debug_level_max(int level) { _starpu_debug_level_max = level; } int starpu_mpi_get_communication_tag(void) { return _starpu_mpi_tag; } void starpu_mpi_set_communication_tag(int tag) { _starpu_mpi_tag = tag; } char *_starpu_mpi_get_mpi_error_code(int code) { static char str[MPI_MAX_OBJECT_NAME]; int len; MPI_Error_string(code, str, &len); return str; } starpu-1.2.3+dfsg/mpi/src/starpu_mpi_private.h000066400000000000000000000212301320135501600214060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_MPI_PRIVATE_H__ #define __STARPU_MPI_PRIVATE_H__ #include #include #include #include "starpu_mpi.h" #include "starpu_mpi_fxt.h" #include #ifdef __cplusplus extern "C" { #endif extern int _starpu_debug_rank; char *_starpu_mpi_get_mpi_error_code(int code); extern int _starpu_mpi_comm_debug; #ifdef STARPU_MPI_VERBOSE extern int _starpu_debug_level_min; extern int _starpu_debug_level_max; void _starpu_mpi_set_debug_level_min(int level); void _starpu_mpi_set_debug_level_max(int level); #endif extern int _starpu_mpi_fake_world_size; extern int _starpu_mpi_fake_world_rank; #ifdef STARPU_NO_ASSERT # define STARPU_MPI_ASSERT_MSG(x, msg, ...) do { if (0) { (void) (x); }} while(0) #else # if defined(__CUDACC__) && defined(STARPU_HAVE_WINDOWS) int _starpu_debug_rank; # define STARPU_MPI_ASSERT_MSG(x, msg, ...) \ do \ { \ if (STARPU_UNLIKELY(!(x))) \ { \ if (_starpu_debug_rank == -1) starpu_mpi_comm_rank(MPI_COMM_WORLD, &_starpu_debug_rank); \ fprintf(stderr, "\n[%d][starpu_mpi][%s][assert failure] " msg "\n\n", _starpu_debug_rank, __starpu_func__, ## __VA_ARGS__); *(int*)NULL = 0; \ } \ } while(0) # else # define STARPU_MPI_ASSERT_MSG(x, msg, ...) \ do \ { \ if (STARPU_UNLIKELY(!(x))) \ { \ if (_starpu_debug_rank == -1) starpu_mpi_comm_rank(MPI_COMM_WORLD, &_starpu_debug_rank); \ fprintf(stderr, "\n[%d][starpu_mpi][%s][assert failure] " msg "\n\n", _starpu_debug_rank, __starpu_func__, ## __VA_ARGS__); \ } \ assert(x); \ } while(0) # endif #endif #define _STARPU_MPI_MALLOC(ptr, size) do { ptr = malloc(size); STARPU_MPI_ASSERT_MSG(ptr != NULL, "Cannot allocate %ld bytes\n", (long) size); } while (0) #define _STARPU_MPI_CALLOC(ptr, nmemb, size) do { ptr = calloc(nmemb, size); STARPU_MPI_ASSERT_MSG(ptr != NULL, "Cannot allocate %ld bytes\n", (long) (nmemb*size)); } while (0) #define _STARPU_MPI_REALLOC(ptr, size) do { void *_new_ptr = realloc(ptr, size); STARPU_MPI_ASSERT_MSG(_new_ptr != NULL, "Cannot reallocate %ld bytes\n", (long) size); ptr = _new_ptr; } while (0) #ifdef STARPU_MPI_VERBOSE # define _STARPU_MPI_COMM_DEBUG(ptr, count, datatype, node, tag, utag, comm, way) \ do \ { \ if (_starpu_mpi_comm_debug) \ { \ int __size; \ char _comm_name[128]; \ int _comm_name_len; \ int _rank; \ starpu_mpi_comm_rank(comm, &_rank); \ MPI_Type_size(datatype, &__size); \ MPI_Comm_get_name(comm, _comm_name, &_comm_name_len); \ fprintf(stderr, "[%d][starpu_mpi] :%d:%s:%d:%d:%d:%s:%p:%ld:%d:%s:%d\n", _rank, _rank, way, node, tag, utag, _comm_name, ptr, count, __size, __starpu_func__ , __LINE__); \ fflush(stderr); \ } \ } while(0); # define _STARPU_MPI_COMM_TO_DEBUG(ptr, count, datatype, dest, tag, utag, comm) _STARPU_MPI_COMM_DEBUG(ptr, count, datatype, dest, tag, utag, comm, "-->") # define _STARPU_MPI_COMM_FROM_DEBUG(ptr, count, datatype, source, tag, utag, comm) _STARPU_MPI_COMM_DEBUG(ptr, count, datatype, source, tag, utag, comm, "<--") # define _STARPU_MPI_DEBUG(level, fmt, ...) \ do \ { \ if (!_starpu_silent && _starpu_debug_level_min <= level && level <= _starpu_debug_level_max) \ { \ if (_starpu_debug_rank == -1) starpu_mpi_comm_rank(MPI_COMM_WORLD, &_starpu_debug_rank); \ fprintf(stderr, "%*s[%d][starpu_mpi][%s:%d] " fmt , (_starpu_debug_rank+1)*4, "", _starpu_debug_rank, __starpu_func__ , __LINE__,## __VA_ARGS__); \ fflush(stderr); \ } \ } while(0); #else # define _STARPU_MPI_COMM_DEBUG(ptr, count, datatype, node, tag, utag, comm, way) do { } while(0) # define _STARPU_MPI_COMM_TO_DEBUG(ptr, count, datatype, dest, tag, utag, comm) do { } while(0) # define _STARPU_MPI_COMM_FROM_DEBUG(ptr, count, datatype, source, tag, utag, comm) do { } while(0) # define _STARPU_MPI_DEBUG(level, fmt, ...) do { } while(0) #endif #define _STARPU_MPI_DISP(fmt, ...) do { if (!_starpu_silent) { \ if (_starpu_debug_rank == -1) starpu_mpi_comm_rank(MPI_COMM_WORLD, &_starpu_debug_rank); \ fprintf(stderr, "%*s[%d][starpu_mpi][%s:%d] " fmt , (_starpu_debug_rank+1)*4, "", _starpu_debug_rank, __starpu_func__ , __LINE__ ,## __VA_ARGS__); \ fflush(stderr); }} while(0); #define _STARPU_MPI_MSG(fmt, ...) do { if (_starpu_debug_rank == -1) starpu_mpi_comm_rank(MPI_COMM_WORLD, &_starpu_debug_rank); \ fprintf(stderr, "[%d][starpu_mpi][%s:%d] " fmt , _starpu_debug_rank, __starpu_func__ , __LINE__ ,## __VA_ARGS__); \ fflush(stderr); } while(0); #ifdef STARPU_MPI_EXTRA_VERBOSE # define _STARPU_MPI_LOG_IN() do { if (!_starpu_silent) { \ if (_starpu_debug_rank == -1) starpu_mpi_comm_rank(MPI_COMM_WORLD, &_starpu_debug_rank); \ fprintf(stderr, "%*s[%d][starpu_mpi][%s:%d] -->\n", (_starpu_debug_rank+1)*4, "", _starpu_debug_rank, __starpu_func__ , __LINE__); \ fflush(stderr); }} while(0) # define _STARPU_MPI_LOG_OUT() do { if (!_starpu_silent) { \ if (_starpu_debug_rank == -1) starpu_mpi_comm_rank(MPI_COMM_WORLD, &_starpu_debug_rank); \ fprintf(stderr, "%*s[%d][starpu_mpi][%s:%d] <--\n", (_starpu_debug_rank+1)*4, "", _starpu_debug_rank, __starpu_func__, __LINE__ ); \ fflush(stderr); }} while(0) #else # define _STARPU_MPI_LOG_IN() # define _STARPU_MPI_LOG_OUT() #endif extern int _starpu_mpi_tag; #define _STARPU_MPI_TAG_ENVELOPE _starpu_mpi_tag #define _STARPU_MPI_TAG_DATA _starpu_mpi_tag+1 #define _STARPU_MPI_TAG_SYNC_DATA _starpu_mpi_tag+2 enum _starpu_mpi_request_type { SEND_REQ=0, RECV_REQ=1, WAIT_REQ=2, TEST_REQ=3, BARRIER_REQ=4, PROBE_REQ=5, UNKNOWN_REQ=6, }; #define _STARPU_MPI_ENVELOPE_DATA 0 #define _STARPU_MPI_ENVELOPE_SYNC_READY 1 struct _starpu_mpi_envelope { int mode; starpu_ssize_t size; int data_tag; unsigned sync; }; struct _starpu_mpi_req; struct _starpu_mpi_node_tag { MPI_Comm comm; int rank; int data_tag; }; LIST_TYPE(_starpu_mpi_req, /* description of the data at StarPU level */ starpu_data_handle_t data_handle; /* description of the data to be sent/received */ MPI_Datatype datatype; char *datatype_name; void *ptr; starpu_ssize_t count; int registered_datatype; /* who are we talking to ? */ struct _starpu_mpi_node_tag node_tag; void (*func)(struct _starpu_mpi_req *); MPI_Status *status; MPI_Request data_request; int *flag; unsigned sync; int ret; starpu_pthread_mutex_t req_mutex; starpu_pthread_cond_t req_cond; starpu_pthread_mutex_t posted_mutex; starpu_pthread_cond_t posted_cond; enum _starpu_mpi_request_type request_type; /* 0 send, 1 recv */ unsigned submitted; unsigned completed; unsigned posted; /* In the case of a Wait/Test request, we are going to post a request * to test the completion of another request */ struct _starpu_mpi_req *other_request; /* in the case of detached requests */ int detached; void *callback_arg; void (*callback)(void *); /* in the case of user-defined datatypes, we need to send the size of the data */ MPI_Request size_req; struct _starpu_mpi_envelope* envelope; unsigned is_internal_req:1; unsigned to_destroy:1; struct _starpu_mpi_req *internal_req; struct _starpu_mpi_early_data_handle *early_data_handle; int sequential_consistency; long pre_sync_jobid; long post_sync_jobid; UT_hash_handle hh; ); struct _starpu_mpi_argc_argv { int initialize_mpi; int *argc; char ***argv; MPI_Comm comm; int fargc; // Fortran argc char **fargv; // Fortran argv }; #ifdef __cplusplus } #endif #endif // __STARPU_MPI_PRIVATE_H__ starpu-1.2.3+dfsg/mpi/src/starpu_mpi_select_node.c000066400000000000000000000070411320135501600222170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014, 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include static int _current_policy = STARPU_MPI_NODE_SELECTION_MOST_R_DATA; static int _last_predefined_policy = STARPU_MPI_NODE_SELECTION_MOST_R_DATA; static starpu_mpi_select_node_policy_func_t _policies[_STARPU_MPI_NODE_SELECTION_MAX_POLICY]; int _starpu_mpi_select_node_with_most_R_data(int me, int nb_nodes, struct starpu_data_descr *descr, int nb_data); void _starpu_mpi_select_node_init() { int i; _policies[STARPU_MPI_NODE_SELECTION_MOST_R_DATA] = _starpu_mpi_select_node_with_most_R_data; for(i=_last_predefined_policy+1 ; i<_STARPU_MPI_NODE_SELECTION_MAX_POLICY ; i++) _policies[i] = NULL; } int starpu_mpi_node_selection_get_current_policy() { return _current_policy; } int starpu_mpi_node_selection_set_current_policy(int policy) { STARPU_ASSERT_MSG(_policies[policy] != NULL, "Policy %d invalid.\n", policy); _current_policy = policy; return 0; } int starpu_mpi_node_selection_register_policy(starpu_mpi_select_node_policy_func_t policy_func) { int i=_last_predefined_policy+1; // Look for a unregistered policy while(i<_STARPU_MPI_NODE_SELECTION_MAX_POLICY) { if (_policies[i] == NULL) break; i++; } STARPU_ASSERT_MSG(i<_STARPU_MPI_NODE_SELECTION_MAX_POLICY, "No unused policy available. Unregister existing policies before registering a new one."); _policies[i] = policy_func; return i; } int starpu_mpi_node_selection_unregister_policy(int policy) { STARPU_ASSERT_MSG(policy > _last_predefined_policy, "Policy %d invalid. Only user-registered policies can be unregistered\n", policy); _policies[policy] = NULL; return 0; } int _starpu_mpi_select_node_with_most_R_data(int me, int nb_nodes, struct starpu_data_descr *descr, int nb_data) { size_t *size_on_nodes; size_t max_size; int i; int xrank = 0; (void)me; _STARPU_MPI_CALLOC(size_on_nodes, 1, nb_nodes * sizeof(size_t)); for(i= 0 ; iops->get_size(data); } } max_size = 0; for(i=0 ; i max_size) { max_size = size_on_nodes[i]; xrank = i; } } free(size_on_nodes); return xrank; } int _starpu_mpi_select_node(int me, int nb_nodes, struct starpu_data_descr *descr, int nb_data, int policy) { int ppolicy = policy == STARPU_MPI_NODE_SELECTION_CURRENT_POLICY ? _current_policy : policy; STARPU_ASSERT_MSG(ppolicy < _STARPU_MPI_NODE_SELECTION_MAX_POLICY, "Invalid policy %d\n", ppolicy); STARPU_ASSERT_MSG(_policies[ppolicy], "Unregistered policy %d\n", ppolicy); starpu_mpi_select_node_policy_func_t func = _policies[ppolicy]; return func(me, nb_nodes, descr, nb_data); } starpu-1.2.3+dfsg/mpi/src/starpu_mpi_select_node.h000066400000000000000000000020241320135501600222200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014, 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_MPI_SELECT_NODE_H__ #define __STARPU_MPI_SELECT_NODE_H__ #include #ifdef __cplusplus extern "C" { #endif #define _STARPU_MPI_NODE_SELECTION_MAX_POLICY 24 void _starpu_mpi_select_node_init(); int _starpu_mpi_select_node(int me, int nb_nodes, struct starpu_data_descr *descr, int nb_data, int policy); #ifdef __cplusplus } #endif #endif // __STARPU_MPI_SELECT_NODE_H__ starpu-1.2.3+dfsg/mpi/src/starpu_mpi_stats.c000066400000000000000000000047171320135501600211000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012, 2013, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include /* measure the amount of data transfers between each pair of MPI nodes */ static size_t *comm_amount; static int world_size; static int stats_enabled=0; void _starpu_mpi_comm_amounts_init(MPI_Comm comm) { stats_enabled = starpu_get_env_number("STARPU_COMM_STATS"); if (stats_enabled == -1) { stats_enabled = 0; } if (stats_enabled == 0) return; _STARPU_DISP("Warning: StarPU is executed with STARPU_COMM_STATS=1, which slows down a bit\n"); starpu_mpi_comm_size(comm, &world_size); _STARPU_MPI_DEBUG(1, "allocating for %d nodes\n", world_size); _STARPU_MPI_CALLOC(comm_amount, world_size, sizeof(size_t)); } void _starpu_mpi_comm_amounts_free() { if (stats_enabled == 0) return; free(comm_amount); } void _starpu_mpi_comm_amounts_inc(MPI_Comm comm, unsigned dst, MPI_Datatype datatype, int count) { int src, size; if (stats_enabled == 0) return; starpu_mpi_comm_rank(comm, &src); MPI_Type_size(datatype, &size); _STARPU_MPI_DEBUG(1, "[%d] adding %d to %d\n", src, count*size, dst); comm_amount[dst] += count*size; } void starpu_mpi_comm_amounts_retrieve(size_t *comm_amounts) { if (stats_enabled == 0) return; memcpy(comm_amounts, comm_amount, world_size * sizeof(size_t)); } void _starpu_mpi_comm_amounts_display(FILE *stream, int node) { int dst; size_t sum = 0; if (stats_enabled == 0) return; for (dst = 0; dst < world_size; dst++) { sum += comm_amount[dst]; } fprintf(stream, "\n[starpu_comm_stats][%d] TOTAL:\t%f B\t%f MB\n", node, (float)sum, (float)sum/1024/1024); for (dst = 0; dst < world_size; dst++) { if (comm_amount[dst]) { fprintf(stream, "[starpu_comm_stats][%d->%d]\t%f B\t%f MB\n", node, dst, (float)comm_amount[dst], ((float)comm_amount[dst])/(1024*1024)); } } } starpu-1.2.3+dfsg/mpi/src/starpu_mpi_stats.h000066400000000000000000000021311320135501600210710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_MPI_STATS_H__ #define __STARPU_MPI_STATS_H__ #include #include #include #ifdef __cplusplus extern "C" { #endif void _starpu_mpi_comm_amounts_init(MPI_Comm comm); void _starpu_mpi_comm_amounts_free(); void _starpu_mpi_comm_amounts_inc(MPI_Comm comm, unsigned dst, MPI_Datatype datatype, int count); void _starpu_mpi_comm_amounts_display(FILE *stream, int node); #ifdef __cplusplus } #endif #endif // __STARPU_MPI_STATS_H__ starpu-1.2.3+dfsg/mpi/src/starpu_mpi_sync_data.c000066400000000000000000000123701320135501600217010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include struct _starpu_mpi_sync_data_handle_hashlist { struct _starpu_mpi_req_list list; UT_hash_handle hh; struct _starpu_mpi_node_tag node_tag; }; /** stores data which have been received by MPI but have not been requested by the application */ static starpu_pthread_mutex_t _starpu_mpi_sync_data_handle_mutex; static struct _starpu_mpi_sync_data_handle_hashlist *_starpu_mpi_sync_data_handle_hashmap = NULL; static int _starpu_mpi_sync_data_handle_hashmap_count = 0; void _starpu_mpi_sync_data_init(void) { _starpu_mpi_sync_data_handle_hashmap = NULL; STARPU_PTHREAD_MUTEX_INIT(&_starpu_mpi_sync_data_handle_mutex, NULL); _starpu_mpi_sync_data_handle_hashmap_count = 0; } void _starpu_mpi_sync_data_free(void) { struct _starpu_mpi_sync_data_handle_hashlist *current, *tmp; HASH_ITER(hh, _starpu_mpi_sync_data_handle_hashmap, current, tmp) { STARPU_ASSERT(_starpu_mpi_req_list_empty(¤t->list)); HASH_DEL(_starpu_mpi_sync_data_handle_hashmap, current); free(current); } STARPU_PTHREAD_MUTEX_DESTROY(&_starpu_mpi_sync_data_handle_mutex); } #ifdef STARPU_VERBOSE static void _starpu_mpi_sync_data_handle_display_hash(struct _starpu_mpi_node_tag *node_tag) { struct _starpu_mpi_sync_data_handle_hashlist *hashlist; HASH_FIND(hh, _starpu_mpi_sync_data_handle_hashmap, node_tag, sizeof(struct _starpu_mpi_node_tag), hashlist); if (hashlist == NULL) { _STARPU_MPI_DEBUG(60, "Hashlist for comm %d source %d and tag %d does not exist\n", node_tag->comm, node_tag->rank, node_tag->data_tag); } else if (_starpu_mpi_req_list_empty(&hashlist->list)) { _STARPU_MPI_DEBUG(60, "Hashlist for comm %d source %d and tag %d is empty\n", node_tag->comm, node_tag->rank, node_tag->data_tag); } else { struct _starpu_mpi_req *cur; for (cur = _starpu_mpi_req_list_begin(&hashlist->list) ; cur != _starpu_mpi_req_list_end(&hashlist->list); cur = _starpu_mpi_req_list_next(cur)) { _STARPU_MPI_DEBUG(60, "Element for comm %d source %d and tag %d: %p\n", node_tag->comm, node_tag->rank, node_tag->data_tag, cur); } } } #endif void _starpu_mpi_sync_data_check_termination(void) { STARPU_ASSERT_MSG(_starpu_mpi_sync_data_handle_hashmap_count == 0, "Number of sync received messages left is not zero, did you forget to post a receive corresponding to a send?"); } int _starpu_mpi_sync_data_count(void) { return _starpu_mpi_sync_data_handle_hashmap_count; } struct _starpu_mpi_req *_starpu_mpi_sync_data_find(int data_tag, int source, MPI_Comm comm) { struct _starpu_mpi_req *req; struct _starpu_mpi_node_tag node_tag; struct _starpu_mpi_sync_data_handle_hashlist *found; memset(&node_tag, 0, sizeof(struct _starpu_mpi_node_tag)); node_tag.comm = comm; node_tag.rank = source; node_tag.data_tag = data_tag; _STARPU_MPI_DEBUG(60, "Looking for sync_data_handle with comm %d source %d tag %d in the hashmap\n", comm, source, data_tag); STARPU_PTHREAD_MUTEX_LOCK(&_starpu_mpi_sync_data_handle_mutex); HASH_FIND(hh, _starpu_mpi_sync_data_handle_hashmap, &node_tag, sizeof(struct _starpu_mpi_node_tag), found); if (found == NULL) { req = NULL; } else { if (_starpu_mpi_req_list_empty(&found->list)) { req = NULL; } else { req = _starpu_mpi_req_list_pop_front(&found->list); _starpu_mpi_sync_data_handle_hashmap_count --; } } STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_sync_data_handle_mutex); _STARPU_MPI_DEBUG(60, "Found sync_data_handle %p with comm %d source %d tag %d in the hashmap\n", req, comm, source, data_tag); return req; } void _starpu_mpi_sync_data_add(struct _starpu_mpi_req *sync_req) { struct _starpu_mpi_sync_data_handle_hashlist *hashlist; _STARPU_MPI_DEBUG(2000, "Adding sync_req %p with comm %d source %d tag %d in the hashmap\n", sync_req, sync_req->node_tag.comm, sync_req->node_tag.rank, sync_req->node_tag.data_tag); STARPU_PTHREAD_MUTEX_LOCK(&_starpu_mpi_sync_data_handle_mutex); HASH_FIND(hh, _starpu_mpi_sync_data_handle_hashmap, &sync_req->node_tag, sizeof(struct _starpu_mpi_node_tag), hashlist); if (hashlist == NULL) { _STARPU_MPI_MALLOC(hashlist, sizeof(struct _starpu_mpi_sync_data_handle_hashlist)); _starpu_mpi_req_list_init(&hashlist->list); hashlist->node_tag = sync_req->node_tag; HASH_ADD(hh, _starpu_mpi_sync_data_handle_hashmap, node_tag, sizeof(hashlist->node_tag), hashlist); } _starpu_mpi_req_list_push_back(&hashlist->list, sync_req); _starpu_mpi_sync_data_handle_hashmap_count ++; STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_sync_data_handle_mutex); #ifdef STARPU_VERBOSE _starpu_mpi_sync_data_handle_display_hash(&sync_req->node_tag); #endif } starpu-1.2.3+dfsg/mpi/src/starpu_mpi_sync_data.h000066400000000000000000000023431320135501600217050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_MPI_SYNC_DATA_H__ #define __STARPU_MPI_SYNC_DATA_H__ #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif void _starpu_mpi_sync_data_init(void); void _starpu_mpi_sync_data_check_termination(void); void _starpu_mpi_sync_data_free(void); struct _starpu_mpi_req *_starpu_mpi_sync_data_find(int data_tag, int source, MPI_Comm comm); void _starpu_mpi_sync_data_add(struct _starpu_mpi_req *req); int _starpu_mpi_sync_data_count(); #ifdef __cplusplus } #endif #endif /* __STARPU_MPI_SYNC_DATA_H__ */ starpu-1.2.3+dfsg/mpi/src/starpu_mpi_tag.c000066400000000000000000000065321320135501600205120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013, 2014, 2015 CNRS * Copyright (C) 2011-2015, 2017 Université de Bordeaux * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include /* Entry in the `registered_tag_handles' hash table. */ struct handle_tag_entry { UT_hash_handle hh; int tag; starpu_data_handle_t handle; }; /* Hash table mapping host tags to data handles. */ static struct handle_tag_entry *registered_tag_handles; static struct _starpu_spinlock registered_tag_handles_lock; void _starpu_mpi_tag_init(void) { _starpu_spin_init(®istered_tag_handles_lock); } void _starpu_mpi_tag_free(void) { struct handle_tag_entry *tag_entry, *tag_tmp; _starpu_spin_destroy(®istered_tag_handles_lock); HASH_ITER(hh, registered_tag_handles, tag_entry, tag_tmp) { HASH_DEL(registered_tag_handles, tag_entry); free(tag_entry); } registered_tag_handles = NULL; } starpu_data_handle_t _starpu_mpi_data_get_data_handle_from_tag(int tag) { struct handle_tag_entry *ret; _starpu_spin_lock(®istered_tag_handles_lock); HASH_FIND_INT(registered_tag_handles, &tag, ret); _starpu_spin_unlock(®istered_tag_handles_lock); if (ret) { return ret->handle; } else { return NULL; } } void _starpu_mpi_data_register_tag(starpu_data_handle_t handle, int tag) { struct handle_tag_entry *entry; if (tag == -1) /* No tag for this data, probably a temporary data not to be communicated */ return; entry = (struct handle_tag_entry *) malloc(sizeof(*entry)); STARPU_ASSERT(entry != NULL); STARPU_ASSERT_MSG(!(_starpu_mpi_data_get_data_handle_from_tag(tag)), "There is already a data handle %p registered with the tag %d\n", _starpu_mpi_data_get_data_handle_from_tag(tag), tag); _STARPU_MPI_DEBUG(42, "Adding handle %p with tag %d in hashtable\n", handle, tag); entry->handle = handle; entry->tag = tag; _starpu_spin_lock(®istered_tag_handles_lock); HASH_ADD_INT(registered_tag_handles, tag, entry); _starpu_spin_unlock(®istered_tag_handles_lock); } int _starpu_mpi_data_release_tag(starpu_data_handle_t handle) { int tag = starpu_mpi_data_get_tag(handle); _STARPU_MPI_DEBUG(42, "Removing handle %p with tag %d from hashtable\n", handle, tag); if (tag != -1) { struct handle_tag_entry *tag_entry; _starpu_spin_lock(®istered_tag_handles_lock); HASH_FIND_INT(registered_tag_handles, &(((struct _starpu_mpi_node_tag *)(handle->mpi_data))->data_tag), tag_entry); STARPU_ASSERT_MSG((tag_entry != NULL),"Data handle %p with tag %d isn't in the hashmap !",handle,tag); HASH_DEL(registered_tag_handles, tag_entry); _starpu_spin_unlock(®istered_tag_handles_lock); free(tag_entry); } return 0; } starpu-1.2.3+dfsg/mpi/src/starpu_mpi_tag.h000066400000000000000000000021561320135501600205150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_MPI_TAG_H__ #define __STARPU_MPI_TAG_H__ #include #include #include #ifdef __cplusplus extern "C" { #endif void _starpu_mpi_tag_init(void); void _starpu_mpi_tag_free(void); void _starpu_mpi_data_register_tag(starpu_data_handle_t handle, int tag); int _starpu_mpi_data_release_tag(starpu_data_handle_t handle); starpu_data_handle_t _starpu_mpi_data_get_data_handle_from_tag(int tag); #ifdef __cplusplus } #endif #endif // __STARPU_MPI_TAG_H__ starpu-1.2.3+dfsg/mpi/src/starpu_mpi_task_insert.c000066400000000000000000000565701320135501600222740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013, 2014, 2015, 2017 CNRS * Copyright (C) 2011-2017 Université de Bordeaux * Copyright (C) 2014, 2016 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include #define _SEND_DATA(data, mode, dest, data_tag, comm, callback, arg) \ do { \ if (mode & STARPU_SSEND) \ starpu_mpi_issend_detached(data, dest, data_tag, comm, callback, arg); \ else \ starpu_mpi_isend_detached(data, dest, data_tag, comm, callback, arg); \ } while (0) int _starpu_mpi_find_executee_node(starpu_data_handle_t data, enum starpu_data_access_mode mode, int me, int *do_execute, int *inconsistent_execute, int *xrank) { if (mode & STARPU_W || mode & STARPU_REDUX) { if (!data) { /* We don't have anything allocated for this. * The application knows we won't do anything * about this task */ /* Yes, the app could actually not call * task_insert at all itself, this is just a * safeguard. */ _STARPU_MPI_DEBUG(3, "oh oh\n"); _STARPU_MPI_LOG_OUT(); return -EINVAL; } int mpi_rank = starpu_mpi_data_get_rank(data); if (mpi_rank == -1) { _STARPU_ERROR("Data %p with mode STARPU_W needs to have a valid rank", data); } if (*xrank == -1) { // No node has been selected yet *xrank = mpi_rank; _STARPU_MPI_DEBUG(100, "Codelet is going to be executed by node %d\n", *xrank); *do_execute = mpi_rank == STARPU_MPI_PER_NODE || (mpi_rank == me); } else if (mpi_rank != *xrank) { _STARPU_MPI_DEBUG(100, "Another node %d had already been selected to execute the codelet, can't now set %d\n", *xrank, mpi_rank); *inconsistent_execute = 1; } } _STARPU_MPI_DEBUG(100, "Executing: inconsistent=%d, do_execute=%d, xrank=%d\n", *inconsistent_execute, *do_execute, *xrank); return 0; } void _starpu_mpi_exchange_data_before_execution(starpu_data_handle_t data, enum starpu_data_access_mode mode, int me, int xrank, int do_execute, MPI_Comm comm) { if (data && mode & STARPU_R) { int mpi_rank = starpu_mpi_data_get_rank(data); int data_tag = starpu_mpi_data_get_tag(data); if (mpi_rank == -1) { _STARPU_ERROR("StarPU needs to be told the MPI rank of this data, using starpu_mpi_data_register\n"); } if (do_execute && mpi_rank != STARPU_MPI_PER_NODE && mpi_rank != me) { /* The node is going to execute the codelet, but it does not own the data, it needs to receive the data from the owner node */ void *already_received = _starpu_mpi_cache_received_data_set(data, mpi_rank); if (already_received == NULL) { if (data_tag == -1) _STARPU_ERROR("StarPU needs to be told the MPI tag of this data, using starpu_mpi_data_register\n"); _STARPU_MPI_DEBUG(1, "Receiving data %p from %d\n", data, mpi_rank); starpu_mpi_irecv_detached(data, mpi_rank, data_tag, comm, NULL, NULL); } // else the node has already received the data } if (!do_execute && mpi_rank == me) { /* The node owns the data, but another node is going to execute the codelet, the node needs to send the data to the executee node. */ void *already_sent = _starpu_mpi_cache_sent_data_set(data, xrank); if (already_sent == NULL) { if (data_tag == -1) _STARPU_ERROR("StarPU needs to be told the MPI tag of this data, using starpu_mpi_data_register\n"); _STARPU_MPI_DEBUG(1, "Sending data %p to %d\n", data, xrank); _SEND_DATA(data, mode, xrank, data_tag, comm, NULL, NULL); } // Else the data has already been sent } } } static void _starpu_mpi_exchange_data_after_execution(starpu_data_handle_t data, enum starpu_data_access_mode mode, int me, int xrank, int do_execute, MPI_Comm comm) { if (mode & STARPU_W) { int mpi_rank = starpu_mpi_data_get_rank(data); int data_tag = starpu_mpi_data_get_tag(data); if(mpi_rank == -1) { _STARPU_ERROR("StarPU needs to be told the MPI rank of this data, using starpu_mpi_data_register\n"); } if (mpi_rank == STARPU_MPI_PER_NODE) { mpi_rank = me; } if (mpi_rank == me) { if (xrank != -1 && (xrank != STARPU_MPI_PER_NODE && me != xrank)) { _STARPU_MPI_DEBUG(1, "Receive data %p back from the task %d which executed the codelet ...\n", data, xrank); if(data_tag == -1) _STARPU_ERROR("StarPU needs to be told the MPI tag of this data, using starpu_mpi_data_register\n"); starpu_mpi_irecv_detached(data, xrank, data_tag, comm, NULL, NULL); } } else if (do_execute) { if(data_tag == -1) _STARPU_ERROR("StarPU needs to be told the MPI tag of this data, using starpu_mpi_data_register\n"); _STARPU_MPI_DEBUG(1, "Send data %p back to its owner %d...\n", data, mpi_rank); _SEND_DATA(data, mode, mpi_rank, data_tag, comm, NULL, NULL); } } } static void _starpu_mpi_clear_data_after_execution(starpu_data_handle_t data, enum starpu_data_access_mode mode, int me, int do_execute, MPI_Comm comm) { if (_starpu_cache_enabled) { if (mode & STARPU_W || mode & STARPU_REDUX) { /* The data has been modified, it MUST be removed from the cache */ _starpu_mpi_cache_sent_data_clear(comm, data); _starpu_mpi_cache_received_data_clear(data); } } else { /* We allocated a temporary buffer for the received data, now drop it */ if ((mode & STARPU_R) && do_execute) { int mpi_rank = starpu_mpi_data_get_rank(data); if (mpi_rank == STARPU_MPI_PER_NODE) { mpi_rank = me; } if (mpi_rank != me && mpi_rank != -1) { starpu_data_invalidate_submit(data); } } } } static int _starpu_mpi_task_decode_v(struct starpu_codelet *codelet, int me, int nb_nodes, int *xrank, int *do_execute, struct starpu_data_descr **descrs_p, int *nb_data_p, va_list varg_list) { /* XXX: _fstarpu_mpi_task_decode_v needs to be updated at the same time */ va_list varg_list_copy; int inconsistent_execute = 0; int arg_type; int node_selected = 0; int nb_allocated_data = 16; struct starpu_data_descr *descrs; int nb_data; int select_node_policy = STARPU_MPI_NODE_SELECTION_CURRENT_POLICY; _STARPU_TRACE_TASK_MPI_DECODE_START(); _STARPU_MPI_MALLOC(descrs, nb_allocated_data * sizeof(struct starpu_data_descr)); nb_data = 0; *do_execute = -1; *xrank = -1; va_copy(varg_list_copy, varg_list); while ((arg_type = va_arg(varg_list_copy, int)) != 0) { int arg_type_nocommute = arg_type & ~STARPU_COMMUTE; if (arg_type==STARPU_EXECUTE_ON_NODE) { *xrank = va_arg(varg_list_copy, int); if (node_selected == 0) { _STARPU_MPI_DEBUG(100, "Executing on node %d\n", *xrank); *do_execute = 1; node_selected = 1; inconsistent_execute = 0; } } else if (arg_type==STARPU_EXECUTE_ON_DATA) { starpu_data_handle_t data = va_arg(varg_list_copy, starpu_data_handle_t); if (node_selected == 0) { *xrank = starpu_mpi_data_get_rank(data); STARPU_ASSERT_MSG(*xrank != -1, "Rank of the data must be set using starpu_mpi_data_register() or starpu_data_set_rank()"); _STARPU_MPI_DEBUG(100, "Executing on data node %d\n", *xrank); STARPU_ASSERT_MSG(*xrank <= nb_nodes, "Node %d to execute codelet is not a valid node (%d)", *xrank, nb_nodes); *do_execute = 1; node_selected = 1; inconsistent_execute = 0; } } else if (arg_type_nocommute & STARPU_R || arg_type_nocommute & STARPU_W || arg_type_nocommute & STARPU_RW || arg_type & STARPU_SCRATCH || arg_type & STARPU_REDUX) { starpu_data_handle_t data = va_arg(varg_list_copy, starpu_data_handle_t); enum starpu_data_access_mode mode = (enum starpu_data_access_mode) arg_type; if (node_selected == 0) { int ret = _starpu_mpi_find_executee_node(data, mode, me, do_execute, &inconsistent_execute, xrank); if (ret == -EINVAL) { free(descrs); va_end(varg_list_copy); _STARPU_TRACE_TASK_MPI_DECODE_END(); return ret; } } if (nb_data >= nb_allocated_data) { nb_allocated_data *= 2; _STARPU_MPI_REALLOC(descrs, nb_allocated_data * sizeof(struct starpu_data_descr)); } descrs[nb_data].handle = data; descrs[nb_data].mode = mode; nb_data ++; } else if (arg_type == STARPU_DATA_ARRAY) { starpu_data_handle_t *datas = va_arg(varg_list_copy, starpu_data_handle_t *); int nb_handles = va_arg(varg_list_copy, int); int i; for(i=0 ; inbuffers == STARPU_VARIABLE_NBUFFERS || nb_data < codelet->nbuffers, "Too many data passed to starpu_mpi_task_insert"); enum starpu_data_access_mode mode = STARPU_CODELET_GET_MODE(codelet, nb_data); if (node_selected == 0) { int ret = _starpu_mpi_find_executee_node(datas[i], mode, me, do_execute, &inconsistent_execute, xrank); if (ret == -EINVAL) { free(descrs); va_end(varg_list_copy); _STARPU_TRACE_TASK_MPI_DECODE_END(); return ret; } } if (nb_data >= nb_allocated_data) { nb_allocated_data *= 2; _STARPU_MPI_REALLOC(descrs, nb_allocated_data * sizeof(struct starpu_data_descr)); } descrs[nb_data].handle = datas[i]; descrs[nb_data].mode = mode; nb_data ++; } } else if (arg_type == STARPU_DATA_MODE_ARRAY) { struct starpu_data_descr *_descrs = va_arg(varg_list_copy, struct starpu_data_descr*); int nb_handles = va_arg(varg_list_copy, int); int i; for(i=0 ; i= nb_allocated_data) { nb_allocated_data *= 2; _STARPU_MPI_REALLOC(descrs, nb_allocated_data * sizeof(struct starpu_data_descr)); } descrs[nb_data].handle = _descrs[i].handle; descrs[nb_data].mode = mode; nb_data ++; } } else if (arg_type==STARPU_VALUE) { (void)va_arg(varg_list_copy, void *); (void)va_arg(varg_list_copy, size_t); } else if (arg_type==STARPU_CL_ARGS) { (void)va_arg(varg_list, void *); (void)va_arg(varg_list, size_t); } else if (arg_type==STARPU_CALLBACK) { (void)va_arg(varg_list_copy, _starpu_callback_func_t); } else if (arg_type==STARPU_CALLBACK_WITH_ARG) { (void)va_arg(varg_list_copy, _starpu_callback_func_t); (void)va_arg(varg_list_copy, void *); } else if (arg_type==STARPU_CALLBACK_ARG) { (void)va_arg(varg_list_copy, void *); } else if (arg_type==STARPU_PRIORITY) { (void)va_arg(varg_list_copy, int); } /* STARPU_EXECUTE_ON_NODE handled above */ /* STARPU_EXECUTE_ON_DATA handled above */ /* STARPU_DATA_ARRAY handled above */ /* STARPU_DATA_MODE_ARRAY handled above */ else if (arg_type==STARPU_TAG) { (void)va_arg(varg_list_copy, starpu_tag_t); } else if (arg_type==STARPU_HYPERVISOR_TAG) { (void)va_arg(varg_list_copy, int); } else if (arg_type==STARPU_FLOPS) { (void)va_arg(varg_list_copy, double); } else if (arg_type==STARPU_SCHED_CTX) { (void)va_arg(varg_list_copy, unsigned); } else if (arg_type==STARPU_PROLOGUE_CALLBACK) { (void)va_arg(varg_list_copy, _starpu_callback_func_t); } else if (arg_type==STARPU_PROLOGUE_CALLBACK_ARG) { (void)va_arg(varg_list_copy, void *); } else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP) { (void)va_arg(varg_list_copy, _starpu_callback_func_t); } else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP_ARG) { (void)va_arg(varg_list_copy, void *); } else if (arg_type==STARPU_EXECUTE_ON_WORKER) { // the flag is decoded and set later when // calling function _starpu_task_insert_create() (void)va_arg(varg_list_copy, int); } else if (arg_type==STARPU_TAG_ONLY) { (void)va_arg(varg_list_copy, starpu_tag_t); } else if (arg_type==STARPU_NAME) { (void)va_arg(varg_list_copy, const char *); } else if (arg_type==STARPU_POSSIBLY_PARALLEL) { (void)va_arg(varg_list_copy, unsigned); } else if (arg_type==STARPU_WORKER_ORDER) { // the flag is decoded and set later when // calling function _starpu_task_insert_create() (void)va_arg(varg_list_copy, unsigned); } else if (arg_type==STARPU_NODE_SELECTION_POLICY) { select_node_policy = va_arg(varg_list_copy, int); } else { STARPU_ABORT_MSG("Unrecognized argument %d, did you perhaps forget to end arguments with 0?\n", arg_type); } } va_end(varg_list_copy); if (inconsistent_execute == 1 || *xrank == -1) { // We need to find out which node is going to execute the codelet. _STARPU_MPI_DEBUG(100, "Different nodes are owning W data. The node to execute the codelet is going to be selected with the current selection node policy. See starpu_mpi_node_selection_set_current_policy() to change the policy, or use STARPU_EXECUTE_ON_NODE or STARPU_EXECUTE_ON_DATA to specify the node\n"); *xrank = _starpu_mpi_select_node(me, nb_nodes, descrs, nb_data, select_node_policy); *do_execute = *xrank == STARPU_MPI_PER_NODE || (me == *xrank); } else { _STARPU_MPI_DEBUG(100, "Inconsistent=%d - xrank=%d\n", inconsistent_execute, *xrank); *do_execute = *xrank == STARPU_MPI_PER_NODE || (me == *xrank); } _STARPU_MPI_DEBUG(100, "do_execute=%d\n", *do_execute); *descrs_p = descrs; *nb_data_p = nb_data; _STARPU_TRACE_TASK_MPI_DECODE_END(); return 0; } static int _starpu_mpi_task_build_v(MPI_Comm comm, struct starpu_codelet *codelet, struct starpu_task **task, int *xrank_p, struct starpu_data_descr **descrs_p, int *nb_data_p, va_list varg_list) { int me, do_execute, xrank, nb_nodes; int ret; int i; struct starpu_data_descr *descrs; int nb_data; _STARPU_MPI_LOG_IN(); starpu_mpi_comm_rank(comm, &me); starpu_mpi_comm_size(comm, &nb_nodes); /* Find out whether we are to execute the data because we own the data to be written to. */ ret = _starpu_mpi_task_decode_v(codelet, me, nb_nodes, &xrank, &do_execute, &descrs, &nb_data, varg_list); if (ret < 0) return ret; _STARPU_TRACE_TASK_MPI_PRE_START(); /* Send and receive data as requested */ for(i=0 ; iname:NULL); *task = starpu_task_create(); (*task)->cl_arg_free = 1; va_copy(varg_list_copy, varg_list); _starpu_task_insert_create(codelet, task, varg_list_copy); va_end(varg_list_copy); return 0; } } int _starpu_mpi_task_postbuild_v(MPI_Comm comm, int xrank, int do_execute, struct starpu_data_descr *descrs, int nb_data) { int me, i; _STARPU_TRACE_TASK_MPI_POST_START(); starpu_mpi_comm_rank(comm, &me); for(i=0 ; icl, (codelet == NULL) ? "none" : task->cl->name ? task->cl->name : (task->cl->model && task->cl->model->symbol)?task->cl->model->symbol:"none"); task->destroy = 0; starpu_task_destroy(task); } } return _starpu_mpi_task_postbuild_v(comm, xrank, do_execute, descrs, nb_data); } int starpu_mpi_task_insert(MPI_Comm comm, struct starpu_codelet *codelet, ...) { va_list varg_list; int ret; va_start(varg_list, codelet); ret = _starpu_mpi_task_insert_v(comm, codelet, varg_list); va_end(varg_list); return ret; } int starpu_mpi_insert_task(MPI_Comm comm, struct starpu_codelet *codelet, ...) { va_list varg_list; int ret; va_start(varg_list, codelet); ret = _starpu_mpi_task_insert_v(comm, codelet, varg_list); va_end(varg_list); return ret; } struct starpu_task *starpu_mpi_task_build(MPI_Comm comm, struct starpu_codelet *codelet, ...) { va_list varg_list; struct starpu_task *task; int ret; va_start(varg_list, codelet); ret = _starpu_mpi_task_build_v(comm, codelet, &task, NULL, NULL, NULL, varg_list); va_end(varg_list); STARPU_ASSERT(ret >= 0); return (ret > 0) ? NULL : task; } int starpu_mpi_task_post_build(MPI_Comm comm, struct starpu_codelet *codelet, ...) { int xrank, do_execute; int ret, me, nb_nodes; va_list varg_list; struct starpu_data_descr *descrs; int nb_data; starpu_mpi_comm_rank(comm, &me); starpu_mpi_comm_size(comm, &nb_nodes); va_start(varg_list, codelet); /* Find out whether we are to execute the data because we own the data to be written to. */ ret = _starpu_mpi_task_decode_v(codelet, me, nb_nodes, &xrank, &do_execute, &descrs, &nb_data, varg_list); va_end(varg_list); if (ret < 0) return ret; return _starpu_mpi_task_postbuild_v(comm, xrank, do_execute, descrs, nb_data); } struct _starpu_mpi_redux_data_args { starpu_data_handle_t data_handle; starpu_data_handle_t new_handle; int tag; int node; MPI_Comm comm; struct starpu_task *taskB; }; void _starpu_mpi_redux_data_dummy_func(STARPU_ATTRIBUTE_UNUSED void *buffers[], STARPU_ATTRIBUTE_UNUSED void *cl_arg) { } /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; static struct starpu_codelet _starpu_mpi_redux_data_read_cl = { .cpu_funcs = {_starpu_mpi_redux_data_dummy_func}, .cuda_funcs = {_starpu_mpi_redux_data_dummy_func}, .opencl_funcs = {_starpu_mpi_redux_data_dummy_func}, .nbuffers = 1, .modes = {STARPU_R}, .model = &dumb_model, .name = "_starpu_mpi_redux_data_read_cl" }; struct starpu_codelet _starpu_mpi_redux_data_readwrite_cl = { .cpu_funcs = {_starpu_mpi_redux_data_dummy_func}, .cuda_funcs = {_starpu_mpi_redux_data_dummy_func}, .opencl_funcs = {_starpu_mpi_redux_data_dummy_func}, .nbuffers = 1, .modes = {STARPU_RW}, .model = &dumb_model, .name = "_starpu_mpi_redux_data_write_cl" }; static void _starpu_mpi_redux_data_detached_callback(void *arg) { struct _starpu_mpi_redux_data_args *args = (struct _starpu_mpi_redux_data_args *) arg; STARPU_TASK_SET_HANDLE(args->taskB, args->new_handle, 1); int ret = starpu_task_submit(args->taskB); STARPU_ASSERT(ret == 0); starpu_data_unregister_submit(args->new_handle); free(args); } static void _starpu_mpi_redux_data_recv_callback(void *callback_arg) { struct _starpu_mpi_redux_data_args *args = (struct _starpu_mpi_redux_data_args *) callback_arg; starpu_data_register_same(&args->new_handle, args->data_handle); starpu_mpi_irecv_detached_sequential_consistency(args->new_handle, args->node, args->tag, args->comm, _starpu_mpi_redux_data_detached_callback, args, 0); } /* TODO: this should rather be implicitly called by starpu_mpi_task_insert when * a data previously accessed in REDUX mode gets accessed in R mode. */ void starpu_mpi_redux_data(MPI_Comm comm, starpu_data_handle_t data_handle) { int me, rank, tag, nb_nodes; rank = starpu_mpi_data_get_rank(data_handle); tag = starpu_mpi_data_get_tag(data_handle); if (rank == -1) { _STARPU_ERROR("StarPU needs to be told the MPI rank of this data, using starpu_mpi_data_register\n"); } if (tag == -1) { _STARPU_ERROR("StarPU needs to be told the MPI tag of this data, using starpu_mpi_data_register\n"); } starpu_mpi_comm_rank(comm, &me); starpu_mpi_comm_size(comm, &nb_nodes); _STARPU_MPI_DEBUG(1, "Doing reduction for data %p on node %d with %d nodes ...\n", data_handle, rank, nb_nodes); // need to count how many nodes have the data in redux mode if (me == rank) { int i, j=0; struct starpu_task *taskBs[nb_nodes]; for(i=0 ; idata_handle = data_handle; args->tag = tag; args->node = i; args->comm = comm; // We need to create taskB early as // taskC declares a dependancy on it args->taskB = starpu_task_create(); args->taskB->cl = args->data_handle->redux_cl; args->taskB->sequential_consistency = 0; STARPU_TASK_SET_HANDLE(args->taskB, args->data_handle, 0); taskBs[j] = args->taskB; j++; // Submit taskA starpu_task_insert(&_starpu_mpi_redux_data_read_cl, STARPU_R, data_handle, STARPU_CALLBACK_WITH_ARG, _starpu_mpi_redux_data_recv_callback, args, 0); } } // Submit taskC which depends on all taskBs created struct starpu_task *taskC = starpu_task_create(); taskC->cl = &_starpu_mpi_redux_data_readwrite_cl; STARPU_TASK_SET_HANDLE(taskC, data_handle, 0); starpu_task_declare_deps_array(taskC, j, taskBs); int ret = starpu_task_submit(taskC); STARPU_ASSERT(ret == 0); } else { _STARPU_MPI_DEBUG(1, "Sending redux handle to %d ...\n", rank); starpu_mpi_isend_detached(data_handle, rank, tag, comm, NULL, NULL); starpu_task_insert(data_handle->init_cl, STARPU_W, data_handle, 0); } /* FIXME: In order to prevent simultaneous receive submissions * on the same handle, we need to wait that all the starpu_mpi * tasks are done before submitting next tasks. The current * version of the implementation does not support multiple * simultaneous receive requests on the same handle.*/ starpu_task_wait_for_all(); } starpu-1.2.3+dfsg/mpi/src/starpu_mpi_task_insert.h000066400000000000000000000023701320135501600222660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_MPI_TASK_INSERT_H__ #define __STARPU_MPI_TASK_INSERT_H__ #ifdef __cplusplus extern "C" { #endif int _starpu_mpi_find_executee_node(starpu_data_handle_t data, enum starpu_data_access_mode mode, int me, int *do_execute, int *inconsistent_execute, int *xrank); void _starpu_mpi_exchange_data_before_execution(starpu_data_handle_t data, enum starpu_data_access_mode mode, int me, int xrank, int do_execute, MPI_Comm comm); int _starpu_mpi_task_postbuild_v(MPI_Comm comm, int xrank, int do_execute, struct starpu_data_descr *descrs, int nb_data); #ifdef __cplusplus } #endif #endif /* __STARPU_MPI_TASK_INSERT_H__ */ starpu-1.2.3+dfsg/mpi/src/starpu_mpi_task_insert_fortran.c000066400000000000000000000272731320135501600240250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016, 2017 CNRS * Copyright (C) 2016 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #ifdef HAVE_MPI_COMM_F2C static int _fstarpu_mpi_task_decode_v(struct starpu_codelet *codelet, int me, int nb_nodes, int *xrank, int *do_execute, struct starpu_data_descr **descrs_p, int *nb_data_p, void **arglist) { int arg_i = 0; int inconsistent_execute = 0; int node_selected = 0; int nb_allocated_data = 16; struct starpu_data_descr *descrs; int nb_data; int select_node_policy = STARPU_MPI_NODE_SELECTION_CURRENT_POLICY; _STARPU_TRACE_TASK_MPI_DECODE_START(); _STARPU_MPI_MALLOC(descrs, nb_allocated_data * sizeof(struct starpu_data_descr)); nb_data = 0; *do_execute = -1; *xrank = -1; while (arglist[arg_i] != NULL) { int arg_type = (int)(intptr_t)arglist[arg_i]; int arg_type_nocommute = arg_type & ~STARPU_COMMUTE; if (arg_type==STARPU_EXECUTE_ON_NODE) { arg_i++; *xrank = *(int *)arglist[arg_i]; if (node_selected == 0) { _STARPU_MPI_DEBUG(100, "Executing on node %d\n", *xrank); *do_execute = 1; node_selected = 1; inconsistent_execute = 0; } } else if (arg_type==STARPU_EXECUTE_ON_DATA) { arg_i++; starpu_data_handle_t data = arglist[arg_i]; if (node_selected == 0) { *xrank = starpu_mpi_data_get_rank(data); STARPU_ASSERT_MSG(*xrank != -1, "Rank of the data must be set using starpu_mpi_data_register() or starpu_data_set_rank()"); _STARPU_MPI_DEBUG(100, "Executing on data node %d\n", *xrank); STARPU_ASSERT_MSG(*xrank <= nb_nodes, "Node %d to execute codelet is not a valid node (%d)", *xrank, nb_nodes); *do_execute = 1; node_selected = 1; inconsistent_execute = 0; } } else if (arg_type_nocommute & STARPU_R || arg_type_nocommute & STARPU_W || arg_type_nocommute & STARPU_RW || arg_type & STARPU_SCRATCH || arg_type & STARPU_REDUX) { arg_i++; starpu_data_handle_t data = arglist[arg_i]; enum starpu_data_access_mode mode = (enum starpu_data_access_mode) arg_type; if (node_selected == 0) { int ret = _starpu_mpi_find_executee_node(data, mode, me, do_execute, &inconsistent_execute, xrank); if (ret == -EINVAL) { free(descrs); _STARPU_TRACE_TASK_MPI_DECODE_END(); return ret; } } if (nb_data >= nb_allocated_data) { nb_allocated_data *= 2; _STARPU_MPI_REALLOC(descrs, nb_allocated_data * sizeof(struct starpu_data_descr)); } descrs[nb_data].handle = data; descrs[nb_data].mode = mode; nb_data ++; } else if (arg_type == STARPU_DATA_ARRAY) { arg_i++; starpu_data_handle_t *datas = arglist[arg_i]; arg_i++; int nb_handles = *(int *)arglist[arg_i]; int i; for(i=0 ; inbuffers == STARPU_VARIABLE_NBUFFERS || nb_data < codelet->nbuffers, "Too many data passed to starpu_mpi_task_insert"); enum starpu_data_access_mode mode = STARPU_CODELET_GET_MODE(codelet, nb_data); if (node_selected == 0) { int ret = _starpu_mpi_find_executee_node(datas[i], mode, me, do_execute, &inconsistent_execute, xrank); if (ret == -EINVAL) { free(descrs); _STARPU_TRACE_TASK_MPI_DECODE_END(); return ret; } } if (nb_data >= nb_allocated_data) { nb_allocated_data *= 2; _STARPU_MPI_REALLOC(descrs, nb_allocated_data * sizeof(struct starpu_data_descr)); } descrs[nb_data].handle = datas[i]; descrs[nb_data].mode = mode; nb_data ++; } } else if (arg_type == STARPU_DATA_MODE_ARRAY) { arg_i++; struct starpu_data_descr *_descrs = arglist[arg_i]; arg_i++; int nb_handles = *(int *)arglist[arg_i]; int i; for(i=0 ; i= nb_allocated_data) { nb_allocated_data *= 2; _STARPU_MPI_REALLOC(descrs, nb_allocated_data * sizeof(struct starpu_data_descr)); } descrs[nb_data].handle = _descrs[i].handle; descrs[nb_data].mode = mode; nb_data ++; } } else if (arg_type==STARPU_VALUE) { arg_i++; /* void* */ arg_i++; /* size_t */ } else if (arg_type==STARPU_CL_ARGS) { arg_i++; /* void* */ arg_i++; /* size_t */ } else if (arg_type==STARPU_CALLBACK) { arg_i++; /* _starpu_callback_func_t */ } else if (arg_type==STARPU_CALLBACK_WITH_ARG) { arg_i++; /* _starpu_callback_func_t */ arg_i++; /* void* */ } else if (arg_type==STARPU_CALLBACK_ARG) { arg_i++; /* void* */ } else if (arg_type==STARPU_PRIORITY) { arg_i++; /* int* */ } /* STARPU_EXECUTE_ON_NODE handled above */ /* STARPU_EXECUTE_ON_DATA handled above */ /* STARPU_DATA_ARRAY handled above */ /* STARPU_DATA_MODE_ARRAY handled above */ else if (arg_type==STARPU_TAG) { arg_i++; /* starpu_tag_t* */ } else if (arg_type==STARPU_HYPERVISOR_TAG) { arg_i++; /* int* */ } else if (arg_type==STARPU_FLOPS) { arg_i++; /* double* */ } else if (arg_type==STARPU_SCHED_CTX) { arg_i++; /* unsigned* */ } else if (arg_type==STARPU_PROLOGUE_CALLBACK) { arg_i++; /* _starpu_callback_func_t */ } else if (arg_type==STARPU_PROLOGUE_CALLBACK_ARG) { arg_i++; /* void* */ } else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP) { arg_i++; /* _starpu_callback_func_t */ } else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP_ARG) { arg_i++; /* void* */ } else if (arg_type==STARPU_EXECUTE_ON_WORKER) { arg_i++; /* int* */ } else if (arg_type==STARPU_TAG_ONLY) { arg_i++; /* starpu_tag_t* */ } else if (arg_type==STARPU_NAME) { arg_i++; /* char* */ } else if (arg_type==STARPU_POSSIBLY_PARALLEL) { arg_i++; /* unsigned* */ } else if (arg_type==STARPU_WORKER_ORDER) { arg_i++; /* unsigned* */ } else if (arg_type==STARPU_NODE_SELECTION_POLICY) { arg_i++; /* int* */ } else { STARPU_ABORT_MSG("Unrecognized argument %d, did you perhaps forget to end arguments with 0?\n", arg_type); } arg_i++; } if (inconsistent_execute == 1 || *xrank == -1) { // We need to find out which node is going to execute the codelet. _STARPU_MPI_DISP("Different nodes are owning W data. The node to execute the codelet is going to be selected with the current selection node policy. See starpu_mpi_node_selection_set_current_policy() to change the policy, or use STARPU_EXECUTE_ON_NODE or STARPU_EXECUTE_ON_DATA to specify the node\n"); *xrank = _starpu_mpi_select_node(me, nb_nodes, descrs, nb_data, select_node_policy); *do_execute = *xrank == STARPU_MPI_PER_NODE || (me == *xrank); } else { _STARPU_MPI_DEBUG(100, "Inconsistent=%d - xrank=%d\n", inconsistent_execute, *xrank); *do_execute = *xrank == STARPU_MPI_PER_NODE || (me == *xrank); } _STARPU_MPI_DEBUG(100, "do_execute=%d\n", *do_execute); *descrs_p = descrs; *nb_data_p = nb_data; _STARPU_TRACE_TASK_MPI_DECODE_END(); return 0; } static int _fstarpu_mpi_task_build_v(MPI_Comm comm, struct starpu_codelet *codelet, struct starpu_task **task, int *xrank_p, struct starpu_data_descr **descrs_p, int *nb_data_p, void **arglist) { int me, do_execute, xrank, nb_nodes; int ret; int i; struct starpu_data_descr *descrs; int nb_data; _STARPU_MPI_LOG_IN(); starpu_mpi_comm_rank(comm, &me); starpu_mpi_comm_size(comm, &nb_nodes); /* Find out whether we are to execute the data because we own the data to be written to. */ ret = _fstarpu_mpi_task_decode_v(codelet, me, nb_nodes, &xrank, &do_execute, &descrs, &nb_data, arglist); if (ret < 0) return ret; _STARPU_TRACE_TASK_MPI_PRE_START(); /* Send and receive data as requested */ for(i=0 ; iname:NULL); *task = starpu_task_create(); (*task)->cl_arg_free = 1; _fstarpu_task_insert_create(codelet, task, arglist); return 0; } } static int _fstarpu_mpi_task_insert_v(MPI_Comm comm, struct starpu_codelet *codelet, void **arglist) { struct starpu_task *task; int ret; int xrank; int do_execute = 0; struct starpu_data_descr *descrs; int nb_data; ret = _fstarpu_mpi_task_build_v(comm, codelet, &task, &xrank, &descrs, &nb_data, arglist); if (ret < 0) return ret; if (ret == 0) { do_execute = 1; ret = starpu_task_submit(task); if (STARPU_UNLIKELY(ret == -ENODEV)) { _STARPU_MSG("submission of task %p wih codelet %p failed (symbol `%s') (err: ENODEV)\n", task, task->cl, (codelet == NULL) ? "none" : task->cl->name ? task->cl->name : (task->cl->model && task->cl->model->symbol)?task->cl->model->symbol:"none"); task->destroy = 0; starpu_task_destroy(task); } } return _starpu_mpi_task_postbuild_v(comm, xrank, do_execute, descrs, nb_data); } int fstarpu_mpi_task_insert(MPI_Fint comm, void ***_arglist) { void **arglist = *_arglist; struct starpu_codelet *codelet = arglist[0]; if (codelet == NULL) { STARPU_ABORT_MSG("task without codelet"); } int ret; ret = _fstarpu_mpi_task_insert_v(MPI_Comm_f2c(comm), codelet, arglist+1); return ret; } /* fstarpu_mpi_insert_task: aliased to fstarpu_mpi_task_insert in fstarpu_mpi_mod.f90 */ struct starpu_task *fstarpu_mpi_task_build(MPI_Fint comm, void ***_arglist) { void **arglist = *_arglist; struct starpu_codelet *codelet = arglist[0]; if (codelet == NULL) { STARPU_ABORT_MSG("task without codelet"); } struct starpu_task *task; int ret; ret = _fstarpu_mpi_task_build_v(MPI_Comm_f2c(comm), codelet, &task, NULL, NULL, NULL, arglist+1); STARPU_ASSERT(ret >= 0); return (ret > 0) ? NULL : task; } int fstarpu_mpi_task_post_build(MPI_Fint _comm, void ***_arglist) { void **arglist = *_arglist; struct starpu_codelet *codelet = arglist[0]; if (codelet == NULL) { STARPU_ABORT_MSG("task without codelet"); } MPI_Comm comm = MPI_Comm_f2c(_comm); int xrank, do_execute; int ret, me, nb_nodes; struct starpu_data_descr *descrs; int nb_data; starpu_mpi_comm_rank(comm, &me); starpu_mpi_comm_size(comm, &nb_nodes); /* Find out whether we are to execute the data because we own the data to be written to. */ ret = _fstarpu_mpi_task_decode_v(codelet, me, nb_nodes, &xrank, &do_execute, &descrs, &nb_data, arglist); if (ret < 0) return ret; return _starpu_mpi_task_postbuild_v(comm, xrank, do_execute, descrs, nb_data); } #endif /* HAVE_MPI_COMM_F2C */ starpu-1.2.3+dfsg/mpi/starpumpi-1.0.pc.in000066400000000000000000000021041320135501600200010ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2011, 2016 Université de Bordeaux # Copyright (C) 2010, 2011, 2012 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: starpumpi Description: offers MPI support for heterogeneous multicore architecture Version: @PACKAGE_VERSION@ Cflags: -I${includedir}/starpu/@STARPU_EFFECTIVE_VERSION@ Libs: -L${libdir} -lstarpumpi-@STARPU_EFFECTIVE_VERSION@ Libs.private: @LDFLAGS@ @LIBS@ @STARPU_EXPORTED_LIBS@ Requires: starpu-1.0 Requires.private: starpu-1.2.3+dfsg/mpi/starpumpi-1.1.pc.in000066400000000000000000000021121320135501600200010ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2011, 2013, 2016 Université de Bordeaux # Copyright (C) 2010, 2011, 2012 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: starpumpi Description: offers MPI support for heterogeneous multicore architecture Version: @PACKAGE_VERSION@ Cflags: -I${includedir}/starpu/@STARPU_EFFECTIVE_VERSION@ Libs: -L${libdir} -lstarpumpi-@STARPU_EFFECTIVE_VERSION@ Libs.private: @LDFLAGS@ @LIBS@ @STARPU_EXPORTED_LIBS@ Requires: starpu-1.1 Requires.private: starpu-1.2.3+dfsg/mpi/starpumpi-1.2.pc.in000066400000000000000000000021121320135501600200020ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2011, 2013, 2016 Université de Bordeaux # Copyright (C) 2010, 2011, 2012 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: starpumpi Description: offers MPI support for heterogeneous multicore architecture Version: @PACKAGE_VERSION@ Cflags: -I${includedir}/starpu/@STARPU_EFFECTIVE_VERSION@ Libs: -L${libdir} -lstarpumpi-@STARPU_EFFECTIVE_VERSION@ Libs.private: @LDFLAGS@ @LIBS@ @STARPU_EXPORTED_LIBS@ Requires: starpu-1.2 Requires.private: starpu-1.2.3+dfsg/mpi/tests/000077500000000000000000000000001320135501600156755ustar00rootroot00000000000000starpu-1.2.3+dfsg/mpi/tests/Makefile.am000066400000000000000000000137351320135501600177420ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2012, 2015-2017 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. include $(top_srcdir)/starpu.mk CC=$(MPICC) CCLD=$(MPICC) if STARPU_HAVE_WINDOWS LOADER_BIN = else loader_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -I$(top_builddir)/src/ LOADER = loader LOADER_BIN = $(abs_top_builddir)/mpi/tests/$(LOADER) loader_SOURCES = ../../tests/loader.c endif # we always test on 4 processes, the execution time is not that bigger if STARPU_QUICK_CHECK MPI = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 else MPI = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 endif if STARPU_HAVE_AM111 TESTS_ENVIRONMENT = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=4 top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" LOG_COMPILER = $(MPI) $(LOADER_BIN) else TESTS_ENVIRONMENT = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=4 top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(MPI) $(LOADER_BIN) endif if !STARPU_SIMGRID if STARPU_MPI_CHECK TESTS = $(starpu_mpi_TESTS) endif endif check_PROGRAMS = $(LOADER) $(starpu_mpi_TESTS) BUILT_SOURCES = CLEANFILES = *.gcno *.gcda *.linkinfo starpu_idle_microsec.log EXTRA_DIST = \ user_defined_datatype_value.h \ helper.h examplebindir = $(libdir)/starpu/examples/mpi examplebin_PROGRAMS = if STARPU_USE_CUDA NVCCFLAGS += --compiler-options -fno-strict-aliasing -I$(top_srcdir)/include/ -I$(top_builddir)/include/ $(HWLOC_CFLAGS) .cu.cubin: $(MKDIR_P) `dirname $@` $(NVCC) -cubin $< -o $@ $(NVCCFLAGS) .cu.o: $(NVCC) $< -c -o $@ $(NVCCFLAGS) endif AM_CFLAGS = -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(FXT_CFLAGS) $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) $(GLOBAL_AM_CFLAGS) -Wno-unused LIBS = $(top_builddir)/src/@LIBSTARPU_LINK@ ../src/libstarpumpi-@STARPU_EFFECTIVE_VERSION@.la @LIBS@ $(FXT_LIBS) $(MAGMA_LIBS) AM_CPPFLAGS = -I$(top_srcdir)/include/ -I$(top_builddir)/include -I$(top_srcdir)/mpi/include -I$(top_srcdir)/mpi/src -I$(top_srcdir)/src -I$(top_builddir)/src -I$(top_srcdir)/examples/ AM_LDFLAGS = $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) $(FXT_LDFLAGS) $(STARPU_COI_LDFLAGS) $(STARPU_SCIF_LDFLAGS) ######################## # Unit testcases # ######################## if BUILD_TESTS starpu_mpi_TESTS = \ datatypes \ pingpong \ mpi_test \ mpi_isend \ mpi_earlyrecv \ mpi_earlyrecv2 \ mpi_earlyrecv2_sync \ mpi_irecv \ mpi_isend_detached \ mpi_irecv_detached \ mpi_detached_tag \ mpi_redux \ ring \ ring_sync \ ring_sync_detached \ ring_async \ ring_async_implicit \ temporary \ block_interface \ block_interface_pinned \ attr \ cache \ cache_disable \ callback \ matrix \ matrix2 \ insert_task \ insert_task_compute \ insert_task_sent_cache \ insert_task_recv_cache \ insert_task_block \ insert_task_owner \ insert_task_owner2 \ insert_task_owner_data \ insert_task_node_choice \ insert_task_count \ insert_task_dyn_handles \ multiple_send \ mpi_scatter_gather \ mpi_reduction \ user_defined_datatype \ tags_checking \ sync \ gather \ gather2 \ policy_register \ policy_register_many \ policy_register_toomany \ policy_unregister \ policy_selection \ policy_selection2 \ early_request \ starpu_redefine noinst_PROGRAMS = \ datatypes \ pingpong \ mpi_test \ mpi_isend \ mpi_earlyrecv \ mpi_earlyrecv2 \ mpi_earlyrecv2_sync \ mpi_irecv \ mpi_isend_detached \ mpi_irecv_detached \ mpi_detached_tag \ mpi_redux \ ring \ ring_sync \ ring_sync_detached \ ring_async \ ring_async_implicit \ temporary \ block_interface \ block_interface_pinned \ attr \ cache \ cache_disable \ callback \ matrix \ matrix2 \ insert_task \ insert_task_compute \ insert_task_sent_cache \ insert_task_recv_cache \ insert_task_block \ insert_task_owner \ insert_task_owner2 \ insert_task_owner_data \ insert_task_node_choice \ insert_task_count \ insert_task_dyn_handles \ multiple_send \ mpi_scatter_gather \ mpi_reduction \ user_defined_datatype \ tags_checking \ sync \ gather \ gather2 \ policy_register \ policy_register_many \ policy_register_toomany \ policy_unregister \ policy_selection \ policy_selection2 \ early_request \ starpu_redefine XFAIL_TESTS= \ policy_register_toomany \ policy_unregister \ starpu_redefine ring_SOURCES = ring.c ring_sync_SOURCES = ring_sync.c ring_sync_detached_SOURCES = ring_sync_detached.c ring_async_SOURCES = ring_async.c ring_async_implicit_SOURCES = ring_async_implicit.c insert_task_count_SOURCES = insert_task_count.c if STARPU_USE_CUDA ring_SOURCES += ring_kernel.cu ring_sync_SOURCES += ring_kernel.cu ring_sync_detached_SOURCES += ring_kernel.cu ring_async_SOURCES += ring_kernel.cu ring_async_implicit_SOURCES += ring_kernel.cu insert_task_count_SOURCES += ring_kernel.cu endif mpi_reduction_SOURCES = mpi_reduction.c mpi_reduction_SOURCES += mpi_reduction_kernels.c user_defined_datatype_SOURCES = user_defined_datatype.c user_defined_datatype_SOURCES += ../../examples/interface/complex_interface.c mpi_earlyrecv2_SOURCES = mpi_earlyrecv2.c mpi_earlyrecv2_SOURCES += ../../examples/interface/complex_interface.c mpi_earlyrecv2_sync_SOURCES = mpi_earlyrecv2_sync.c mpi_earlyrecv2_sync_SOURCES += ../../examples/interface/complex_interface.c endif starpu-1.2.3+dfsg/mpi/tests/Makefile.in000066400000000000000000003031541320135501600177500ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2012, 2015-2017 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @STARPU_MPI_CHECK_TRUE@@STARPU_SIMGRID_FALSE@TESTS = $(am__EXEEXT_2) check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) examplebin_PROGRAMS = @STARPU_USE_CUDA_TRUE@am__append_1 = --compiler-options -fno-strict-aliasing -I$(top_srcdir)/include/ -I$(top_builddir)/include/ $(HWLOC_CFLAGS) @BUILD_TESTS_TRUE@noinst_PROGRAMS = datatypes$(EXEEXT) \ @BUILD_TESTS_TRUE@ pingpong$(EXEEXT) mpi_test$(EXEEXT) \ @BUILD_TESTS_TRUE@ mpi_isend$(EXEEXT) mpi_earlyrecv$(EXEEXT) \ @BUILD_TESTS_TRUE@ mpi_earlyrecv2$(EXEEXT) \ @BUILD_TESTS_TRUE@ mpi_earlyrecv2_sync$(EXEEXT) \ @BUILD_TESTS_TRUE@ mpi_irecv$(EXEEXT) \ @BUILD_TESTS_TRUE@ mpi_isend_detached$(EXEEXT) \ @BUILD_TESTS_TRUE@ mpi_irecv_detached$(EXEEXT) \ @BUILD_TESTS_TRUE@ mpi_detached_tag$(EXEEXT) mpi_redux$(EXEEXT) \ @BUILD_TESTS_TRUE@ ring$(EXEEXT) ring_sync$(EXEEXT) \ @BUILD_TESTS_TRUE@ ring_sync_detached$(EXEEXT) \ @BUILD_TESTS_TRUE@ ring_async$(EXEEXT) \ @BUILD_TESTS_TRUE@ ring_async_implicit$(EXEEXT) \ @BUILD_TESTS_TRUE@ temporary$(EXEEXT) block_interface$(EXEEXT) \ @BUILD_TESTS_TRUE@ block_interface_pinned$(EXEEXT) \ @BUILD_TESTS_TRUE@ attr$(EXEEXT) cache$(EXEEXT) \ @BUILD_TESTS_TRUE@ cache_disable$(EXEEXT) callback$(EXEEXT) \ @BUILD_TESTS_TRUE@ matrix$(EXEEXT) matrix2$(EXEEXT) \ @BUILD_TESTS_TRUE@ insert_task$(EXEEXT) \ @BUILD_TESTS_TRUE@ insert_task_compute$(EXEEXT) \ @BUILD_TESTS_TRUE@ insert_task_sent_cache$(EXEEXT) \ @BUILD_TESTS_TRUE@ insert_task_recv_cache$(EXEEXT) \ @BUILD_TESTS_TRUE@ insert_task_block$(EXEEXT) \ @BUILD_TESTS_TRUE@ insert_task_owner$(EXEEXT) \ @BUILD_TESTS_TRUE@ insert_task_owner2$(EXEEXT) \ @BUILD_TESTS_TRUE@ insert_task_owner_data$(EXEEXT) \ @BUILD_TESTS_TRUE@ insert_task_node_choice$(EXEEXT) \ @BUILD_TESTS_TRUE@ insert_task_count$(EXEEXT) \ @BUILD_TESTS_TRUE@ insert_task_dyn_handles$(EXEEXT) \ @BUILD_TESTS_TRUE@ multiple_send$(EXEEXT) \ @BUILD_TESTS_TRUE@ mpi_scatter_gather$(EXEEXT) \ @BUILD_TESTS_TRUE@ mpi_reduction$(EXEEXT) \ @BUILD_TESTS_TRUE@ user_defined_datatype$(EXEEXT) \ @BUILD_TESTS_TRUE@ tags_checking$(EXEEXT) sync$(EXEEXT) \ @BUILD_TESTS_TRUE@ gather$(EXEEXT) gather2$(EXEEXT) \ @BUILD_TESTS_TRUE@ policy_register$(EXEEXT) \ @BUILD_TESTS_TRUE@ policy_register_many$(EXEEXT) \ @BUILD_TESTS_TRUE@ policy_register_toomany$(EXEEXT) \ @BUILD_TESTS_TRUE@ policy_unregister$(EXEEXT) \ @BUILD_TESTS_TRUE@ policy_selection$(EXEEXT) \ @BUILD_TESTS_TRUE@ policy_selection2$(EXEEXT) \ @BUILD_TESTS_TRUE@ early_request$(EXEEXT) \ @BUILD_TESTS_TRUE@ starpu_redefine$(EXEEXT) @BUILD_TESTS_TRUE@XFAIL_TESTS = policy_register_toomany$(EXEEXT) \ @BUILD_TESTS_TRUE@ policy_unregister$(EXEEXT) \ @BUILD_TESTS_TRUE@ starpu_redefine$(EXEEXT) @BUILD_TESTS_TRUE@@STARPU_USE_CUDA_TRUE@am__append_2 = ring_kernel.cu @BUILD_TESTS_TRUE@@STARPU_USE_CUDA_TRUE@am__append_3 = ring_kernel.cu @BUILD_TESTS_TRUE@@STARPU_USE_CUDA_TRUE@am__append_4 = ring_kernel.cu @BUILD_TESTS_TRUE@@STARPU_USE_CUDA_TRUE@am__append_5 = ring_kernel.cu @BUILD_TESTS_TRUE@@STARPU_USE_CUDA_TRUE@am__append_6 = ring_kernel.cu @BUILD_TESTS_TRUE@@STARPU_USE_CUDA_TRUE@am__append_7 = ring_kernel.cu subdir = mpi/tests ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @STARPU_HAVE_WINDOWS_FALSE@am__EXEEXT_1 = loader$(EXEEXT) @BUILD_TESTS_TRUE@am__EXEEXT_2 = datatypes$(EXEEXT) pingpong$(EXEEXT) \ @BUILD_TESTS_TRUE@ mpi_test$(EXEEXT) mpi_isend$(EXEEXT) \ @BUILD_TESTS_TRUE@ mpi_earlyrecv$(EXEEXT) \ @BUILD_TESTS_TRUE@ mpi_earlyrecv2$(EXEEXT) \ @BUILD_TESTS_TRUE@ mpi_earlyrecv2_sync$(EXEEXT) \ @BUILD_TESTS_TRUE@ mpi_irecv$(EXEEXT) \ @BUILD_TESTS_TRUE@ mpi_isend_detached$(EXEEXT) \ @BUILD_TESTS_TRUE@ mpi_irecv_detached$(EXEEXT) \ @BUILD_TESTS_TRUE@ mpi_detached_tag$(EXEEXT) mpi_redux$(EXEEXT) \ @BUILD_TESTS_TRUE@ ring$(EXEEXT) ring_sync$(EXEEXT) \ @BUILD_TESTS_TRUE@ ring_sync_detached$(EXEEXT) \ @BUILD_TESTS_TRUE@ ring_async$(EXEEXT) \ @BUILD_TESTS_TRUE@ ring_async_implicit$(EXEEXT) \ @BUILD_TESTS_TRUE@ temporary$(EXEEXT) block_interface$(EXEEXT) \ @BUILD_TESTS_TRUE@ block_interface_pinned$(EXEEXT) \ @BUILD_TESTS_TRUE@ attr$(EXEEXT) cache$(EXEEXT) \ @BUILD_TESTS_TRUE@ cache_disable$(EXEEXT) callback$(EXEEXT) \ @BUILD_TESTS_TRUE@ matrix$(EXEEXT) matrix2$(EXEEXT) \ @BUILD_TESTS_TRUE@ insert_task$(EXEEXT) \ @BUILD_TESTS_TRUE@ insert_task_compute$(EXEEXT) \ @BUILD_TESTS_TRUE@ insert_task_sent_cache$(EXEEXT) \ @BUILD_TESTS_TRUE@ insert_task_recv_cache$(EXEEXT) \ @BUILD_TESTS_TRUE@ insert_task_block$(EXEEXT) \ @BUILD_TESTS_TRUE@ insert_task_owner$(EXEEXT) \ @BUILD_TESTS_TRUE@ insert_task_owner2$(EXEEXT) \ @BUILD_TESTS_TRUE@ insert_task_owner_data$(EXEEXT) \ @BUILD_TESTS_TRUE@ insert_task_node_choice$(EXEEXT) \ @BUILD_TESTS_TRUE@ insert_task_count$(EXEEXT) \ @BUILD_TESTS_TRUE@ insert_task_dyn_handles$(EXEEXT) \ @BUILD_TESTS_TRUE@ multiple_send$(EXEEXT) \ @BUILD_TESTS_TRUE@ mpi_scatter_gather$(EXEEXT) \ @BUILD_TESTS_TRUE@ mpi_reduction$(EXEEXT) \ @BUILD_TESTS_TRUE@ user_defined_datatype$(EXEEXT) \ @BUILD_TESTS_TRUE@ tags_checking$(EXEEXT) sync$(EXEEXT) \ @BUILD_TESTS_TRUE@ gather$(EXEEXT) gather2$(EXEEXT) \ @BUILD_TESTS_TRUE@ policy_register$(EXEEXT) \ @BUILD_TESTS_TRUE@ policy_register_many$(EXEEXT) \ @BUILD_TESTS_TRUE@ policy_register_toomany$(EXEEXT) \ @BUILD_TESTS_TRUE@ policy_unregister$(EXEEXT) \ @BUILD_TESTS_TRUE@ policy_selection$(EXEEXT) \ @BUILD_TESTS_TRUE@ policy_selection2$(EXEEXT) \ @BUILD_TESTS_TRUE@ early_request$(EXEEXT) \ @BUILD_TESTS_TRUE@ starpu_redefine$(EXEEXT) am__installdirs = "$(DESTDIR)$(examplebindir)" PROGRAMS = $(examplebin_PROGRAMS) $(noinst_PROGRAMS) attr_SOURCES = attr.c attr_OBJECTS = attr.$(OBJEXT) attr_LDADD = $(LDADD) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = block_interface_SOURCES = block_interface.c block_interface_OBJECTS = block_interface.$(OBJEXT) block_interface_LDADD = $(LDADD) block_interface_pinned_SOURCES = block_interface_pinned.c block_interface_pinned_OBJECTS = block_interface_pinned.$(OBJEXT) block_interface_pinned_LDADD = $(LDADD) cache_SOURCES = cache.c cache_OBJECTS = cache.$(OBJEXT) cache_LDADD = $(LDADD) cache_disable_SOURCES = cache_disable.c cache_disable_OBJECTS = cache_disable.$(OBJEXT) cache_disable_LDADD = $(LDADD) callback_SOURCES = callback.c callback_OBJECTS = callback.$(OBJEXT) callback_LDADD = $(LDADD) datatypes_SOURCES = datatypes.c datatypes_OBJECTS = datatypes.$(OBJEXT) datatypes_LDADD = $(LDADD) early_request_SOURCES = early_request.c early_request_OBJECTS = early_request.$(OBJEXT) early_request_LDADD = $(LDADD) gather_SOURCES = gather.c gather_OBJECTS = gather.$(OBJEXT) gather_LDADD = $(LDADD) gather2_SOURCES = gather2.c gather2_OBJECTS = gather2.$(OBJEXT) gather2_LDADD = $(LDADD) insert_task_SOURCES = insert_task.c insert_task_OBJECTS = insert_task.$(OBJEXT) insert_task_LDADD = $(LDADD) insert_task_block_SOURCES = insert_task_block.c insert_task_block_OBJECTS = insert_task_block.$(OBJEXT) insert_task_block_LDADD = $(LDADD) insert_task_compute_SOURCES = insert_task_compute.c insert_task_compute_OBJECTS = insert_task_compute.$(OBJEXT) insert_task_compute_LDADD = $(LDADD) am__insert_task_count_SOURCES_DIST = insert_task_count.c \ ring_kernel.cu @BUILD_TESTS_TRUE@@STARPU_USE_CUDA_TRUE@am__objects_1 = \ @BUILD_TESTS_TRUE@@STARPU_USE_CUDA_TRUE@ ring_kernel.$(OBJEXT) @BUILD_TESTS_TRUE@am_insert_task_count_OBJECTS = \ @BUILD_TESTS_TRUE@ insert_task_count.$(OBJEXT) $(am__objects_1) insert_task_count_OBJECTS = $(am_insert_task_count_OBJECTS) insert_task_count_LDADD = $(LDADD) insert_task_dyn_handles_SOURCES = insert_task_dyn_handles.c insert_task_dyn_handles_OBJECTS = insert_task_dyn_handles.$(OBJEXT) insert_task_dyn_handles_LDADD = $(LDADD) insert_task_node_choice_SOURCES = insert_task_node_choice.c insert_task_node_choice_OBJECTS = insert_task_node_choice.$(OBJEXT) insert_task_node_choice_LDADD = $(LDADD) insert_task_owner_SOURCES = insert_task_owner.c insert_task_owner_OBJECTS = insert_task_owner.$(OBJEXT) insert_task_owner_LDADD = $(LDADD) insert_task_owner2_SOURCES = insert_task_owner2.c insert_task_owner2_OBJECTS = insert_task_owner2.$(OBJEXT) insert_task_owner2_LDADD = $(LDADD) insert_task_owner_data_SOURCES = insert_task_owner_data.c insert_task_owner_data_OBJECTS = insert_task_owner_data.$(OBJEXT) insert_task_owner_data_LDADD = $(LDADD) insert_task_recv_cache_SOURCES = insert_task_recv_cache.c insert_task_recv_cache_OBJECTS = insert_task_recv_cache.$(OBJEXT) insert_task_recv_cache_LDADD = $(LDADD) insert_task_sent_cache_SOURCES = insert_task_sent_cache.c insert_task_sent_cache_OBJECTS = insert_task_sent_cache.$(OBJEXT) insert_task_sent_cache_LDADD = $(LDADD) am__loader_SOURCES_DIST = ../../tests/loader.c @STARPU_HAVE_WINDOWS_FALSE@am_loader_OBJECTS = \ @STARPU_HAVE_WINDOWS_FALSE@ loader-loader.$(OBJEXT) loader_OBJECTS = $(am_loader_OBJECTS) loader_LDADD = $(LDADD) matrix_SOURCES = matrix.c matrix_OBJECTS = matrix.$(OBJEXT) matrix_LDADD = $(LDADD) matrix2_SOURCES = matrix2.c matrix2_OBJECTS = matrix2.$(OBJEXT) matrix2_LDADD = $(LDADD) mpi_detached_tag_SOURCES = mpi_detached_tag.c mpi_detached_tag_OBJECTS = mpi_detached_tag.$(OBJEXT) mpi_detached_tag_LDADD = $(LDADD) mpi_earlyrecv_SOURCES = mpi_earlyrecv.c mpi_earlyrecv_OBJECTS = mpi_earlyrecv.$(OBJEXT) mpi_earlyrecv_LDADD = $(LDADD) am__mpi_earlyrecv2_SOURCES_DIST = mpi_earlyrecv2.c \ ../../examples/interface/complex_interface.c @BUILD_TESTS_TRUE@am_mpi_earlyrecv2_OBJECTS = \ @BUILD_TESTS_TRUE@ mpi_earlyrecv2.$(OBJEXT) \ @BUILD_TESTS_TRUE@ complex_interface.$(OBJEXT) mpi_earlyrecv2_OBJECTS = $(am_mpi_earlyrecv2_OBJECTS) mpi_earlyrecv2_LDADD = $(LDADD) am__mpi_earlyrecv2_sync_SOURCES_DIST = mpi_earlyrecv2_sync.c \ ../../examples/interface/complex_interface.c @BUILD_TESTS_TRUE@am_mpi_earlyrecv2_sync_OBJECTS = \ @BUILD_TESTS_TRUE@ mpi_earlyrecv2_sync.$(OBJEXT) \ @BUILD_TESTS_TRUE@ complex_interface.$(OBJEXT) mpi_earlyrecv2_sync_OBJECTS = $(am_mpi_earlyrecv2_sync_OBJECTS) mpi_earlyrecv2_sync_LDADD = $(LDADD) mpi_irecv_SOURCES = mpi_irecv.c mpi_irecv_OBJECTS = mpi_irecv.$(OBJEXT) mpi_irecv_LDADD = $(LDADD) mpi_irecv_detached_SOURCES = mpi_irecv_detached.c mpi_irecv_detached_OBJECTS = mpi_irecv_detached.$(OBJEXT) mpi_irecv_detached_LDADD = $(LDADD) mpi_isend_SOURCES = mpi_isend.c mpi_isend_OBJECTS = mpi_isend.$(OBJEXT) mpi_isend_LDADD = $(LDADD) mpi_isend_detached_SOURCES = mpi_isend_detached.c mpi_isend_detached_OBJECTS = mpi_isend_detached.$(OBJEXT) mpi_isend_detached_LDADD = $(LDADD) am__mpi_reduction_SOURCES_DIST = mpi_reduction.c \ mpi_reduction_kernels.c @BUILD_TESTS_TRUE@am_mpi_reduction_OBJECTS = mpi_reduction.$(OBJEXT) \ @BUILD_TESTS_TRUE@ mpi_reduction_kernels.$(OBJEXT) mpi_reduction_OBJECTS = $(am_mpi_reduction_OBJECTS) mpi_reduction_LDADD = $(LDADD) mpi_redux_SOURCES = mpi_redux.c mpi_redux_OBJECTS = mpi_redux.$(OBJEXT) mpi_redux_LDADD = $(LDADD) mpi_scatter_gather_SOURCES = mpi_scatter_gather.c mpi_scatter_gather_OBJECTS = mpi_scatter_gather.$(OBJEXT) mpi_scatter_gather_LDADD = $(LDADD) mpi_test_SOURCES = mpi_test.c mpi_test_OBJECTS = mpi_test.$(OBJEXT) mpi_test_LDADD = $(LDADD) multiple_send_SOURCES = multiple_send.c multiple_send_OBJECTS = multiple_send.$(OBJEXT) multiple_send_LDADD = $(LDADD) pingpong_SOURCES = pingpong.c pingpong_OBJECTS = pingpong.$(OBJEXT) pingpong_LDADD = $(LDADD) policy_register_SOURCES = policy_register.c policy_register_OBJECTS = policy_register.$(OBJEXT) policy_register_LDADD = $(LDADD) policy_register_many_SOURCES = policy_register_many.c policy_register_many_OBJECTS = policy_register_many.$(OBJEXT) policy_register_many_LDADD = $(LDADD) policy_register_toomany_SOURCES = policy_register_toomany.c policy_register_toomany_OBJECTS = policy_register_toomany.$(OBJEXT) policy_register_toomany_LDADD = $(LDADD) policy_selection_SOURCES = policy_selection.c policy_selection_OBJECTS = policy_selection.$(OBJEXT) policy_selection_LDADD = $(LDADD) policy_selection2_SOURCES = policy_selection2.c policy_selection2_OBJECTS = policy_selection2.$(OBJEXT) policy_selection2_LDADD = $(LDADD) policy_unregister_SOURCES = policy_unregister.c policy_unregister_OBJECTS = policy_unregister.$(OBJEXT) policy_unregister_LDADD = $(LDADD) am__ring_SOURCES_DIST = ring.c ring_kernel.cu @BUILD_TESTS_TRUE@am_ring_OBJECTS = ring.$(OBJEXT) $(am__objects_1) ring_OBJECTS = $(am_ring_OBJECTS) ring_LDADD = $(LDADD) am__ring_async_SOURCES_DIST = ring_async.c ring_kernel.cu @BUILD_TESTS_TRUE@am_ring_async_OBJECTS = ring_async.$(OBJEXT) \ @BUILD_TESTS_TRUE@ $(am__objects_1) ring_async_OBJECTS = $(am_ring_async_OBJECTS) ring_async_LDADD = $(LDADD) am__ring_async_implicit_SOURCES_DIST = ring_async_implicit.c \ ring_kernel.cu @BUILD_TESTS_TRUE@am_ring_async_implicit_OBJECTS = \ @BUILD_TESTS_TRUE@ ring_async_implicit.$(OBJEXT) \ @BUILD_TESTS_TRUE@ $(am__objects_1) ring_async_implicit_OBJECTS = $(am_ring_async_implicit_OBJECTS) ring_async_implicit_LDADD = $(LDADD) am__ring_sync_SOURCES_DIST = ring_sync.c ring_kernel.cu @BUILD_TESTS_TRUE@am_ring_sync_OBJECTS = ring_sync.$(OBJEXT) \ @BUILD_TESTS_TRUE@ $(am__objects_1) ring_sync_OBJECTS = $(am_ring_sync_OBJECTS) ring_sync_LDADD = $(LDADD) am__ring_sync_detached_SOURCES_DIST = ring_sync_detached.c \ ring_kernel.cu @BUILD_TESTS_TRUE@am_ring_sync_detached_OBJECTS = \ @BUILD_TESTS_TRUE@ ring_sync_detached.$(OBJEXT) \ @BUILD_TESTS_TRUE@ $(am__objects_1) ring_sync_detached_OBJECTS = $(am_ring_sync_detached_OBJECTS) ring_sync_detached_LDADD = $(LDADD) starpu_redefine_SOURCES = starpu_redefine.c starpu_redefine_OBJECTS = starpu_redefine.$(OBJEXT) starpu_redefine_LDADD = $(LDADD) sync_SOURCES = sync.c sync_OBJECTS = sync.$(OBJEXT) sync_LDADD = $(LDADD) tags_checking_SOURCES = tags_checking.c tags_checking_OBJECTS = tags_checking.$(OBJEXT) tags_checking_LDADD = $(LDADD) temporary_SOURCES = temporary.c temporary_OBJECTS = temporary.$(OBJEXT) temporary_LDADD = $(LDADD) am__user_defined_datatype_SOURCES_DIST = user_defined_datatype.c \ ../../examples/interface/complex_interface.c @BUILD_TESTS_TRUE@am_user_defined_datatype_OBJECTS = \ @BUILD_TESTS_TRUE@ user_defined_datatype.$(OBJEXT) \ @BUILD_TESTS_TRUE@ complex_interface.$(OBJEXT) user_defined_datatype_OBJECTS = $(am_user_defined_datatype_OBJECTS) user_defined_datatype_LDADD = $(LDADD) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/common -I$(top_builddir)/include -I$(top_builddir)/gcc-plugin/include/starpu-gcc -I$(top_builddir)/starpu-top depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = attr.c block_interface.c block_interface_pinned.c cache.c \ cache_disable.c callback.c datatypes.c early_request.c \ gather.c gather2.c insert_task.c insert_task_block.c \ insert_task_compute.c $(insert_task_count_SOURCES) \ insert_task_dyn_handles.c insert_task_node_choice.c \ insert_task_owner.c insert_task_owner2.c \ insert_task_owner_data.c insert_task_recv_cache.c \ insert_task_sent_cache.c $(loader_SOURCES) matrix.c matrix2.c \ mpi_detached_tag.c mpi_earlyrecv.c $(mpi_earlyrecv2_SOURCES) \ $(mpi_earlyrecv2_sync_SOURCES) mpi_irecv.c \ mpi_irecv_detached.c mpi_isend.c mpi_isend_detached.c \ $(mpi_reduction_SOURCES) mpi_redux.c mpi_scatter_gather.c \ mpi_test.c multiple_send.c pingpong.c policy_register.c \ policy_register_many.c policy_register_toomany.c \ policy_selection.c policy_selection2.c policy_unregister.c \ $(ring_SOURCES) $(ring_async_SOURCES) \ $(ring_async_implicit_SOURCES) $(ring_sync_SOURCES) \ $(ring_sync_detached_SOURCES) starpu_redefine.c sync.c \ tags_checking.c temporary.c $(user_defined_datatype_SOURCES) DIST_SOURCES = attr.c block_interface.c block_interface_pinned.c \ cache.c cache_disable.c callback.c datatypes.c early_request.c \ gather.c gather2.c insert_task.c insert_task_block.c \ insert_task_compute.c $(am__insert_task_count_SOURCES_DIST) \ insert_task_dyn_handles.c insert_task_node_choice.c \ insert_task_owner.c insert_task_owner2.c \ insert_task_owner_data.c insert_task_recv_cache.c \ insert_task_sent_cache.c $(am__loader_SOURCES_DIST) matrix.c \ matrix2.c mpi_detached_tag.c mpi_earlyrecv.c \ $(am__mpi_earlyrecv2_SOURCES_DIST) \ $(am__mpi_earlyrecv2_sync_SOURCES_DIST) mpi_irecv.c \ mpi_irecv_detached.c mpi_isend.c mpi_isend_detached.c \ $(am__mpi_reduction_SOURCES_DIST) mpi_redux.c \ mpi_scatter_gather.c mpi_test.c multiple_send.c pingpong.c \ policy_register.c policy_register_many.c \ policy_register_toomany.c policy_selection.c \ policy_selection2.c policy_unregister.c \ $(am__ring_SOURCES_DIST) $(am__ring_async_SOURCES_DIST) \ $(am__ring_async_implicit_SOURCES_DIST) \ $(am__ring_sync_SOURCES_DIST) \ $(am__ring_sync_detached_SOURCES_DIST) starpu_redefine.c \ sync.c tags_checking.c temporary.c \ $(am__user_defined_datatype_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/build-aux/depcomp \ $(top_srcdir)/build-aux/test-driver $(top_srcdir)/starpu.mk DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = $(MPICC) CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = $(top_builddir)/src/@LIBSTARPU_LINK@ ../src/libstarpumpi-@STARPU_EFFECTIVE_VERSION@.la @LIBS@ $(FXT_LIBS) $(MAGMA_LIBS) LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ $(am__append_1) NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POTI_CFLAGS = @POTI_CFLAGS@ POTI_LIBS = @POTI_LIBS@ PROG_DATE = @PROG_DATE@ PROG_STAT = @PROG_STAT@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_COI_CPPFLAGS = @STARPU_COI_CPPFLAGS@ STARPU_COI_LDFLAGS = @STARPU_COI_LDFLAGS@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LEVELDB_LDFLAGS = @STARPU_LEVELDB_LDFLAGS@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RCCE_CFLAGS = @STARPU_RCCE_CFLAGS@ STARPU_RCCE_CPPFLAGS = @STARPU_RCCE_CPPFLAGS@ STARPU_RCCE_LDFLAGS = @STARPU_RCCE_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SCIF_CPPFLAGS = @STARPU_SCIF_CPPFLAGS@ STARPU_SCIF_LDFLAGS = @STARPU_SCIF_LDFLAGS@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SC_HYPERVISOR_DEBUG = @STARPU_SC_HYPERVISOR_DEBUG@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ mpifort_path = @mpifort_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ smpirun_path = @smpirun_path@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ CCLD = $(MPICC) @STARPU_HAVE_WINDOWS_FALSE@LOADER_BIN = $(abs_top_builddir)/mpi/tests/$(LOADER) @STARPU_HAVE_WINDOWS_TRUE@LOADER_BIN = @STARPU_HAVE_WINDOWS_FALSE@loader_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -I$(top_builddir)/src/ @STARPU_HAVE_WINDOWS_FALSE@LOADER = loader @STARPU_HAVE_WINDOWS_FALSE@loader_SOURCES = ../../tests/loader.c @STARPU_QUICK_CHECK_FALSE@MPI = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 # we always test on 4 processes, the execution time is not that bigger @STARPU_QUICK_CHECK_TRUE@MPI = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 @STARPU_HAVE_AM111_FALSE@TESTS_ENVIRONMENT = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=4 top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(MPI) $(LOADER_BIN) @STARPU_HAVE_AM111_TRUE@TESTS_ENVIRONMENT = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=4 top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" @STARPU_HAVE_AM111_TRUE@LOG_COMPILER = $(MPI) $(LOADER_BIN) BUILT_SOURCES = CLEANFILES = *.gcno *.gcda *.linkinfo starpu_idle_microsec.log EXTRA_DIST = \ user_defined_datatype_value.h \ helper.h examplebindir = $(libdir)/starpu/examples/mpi AM_CFLAGS = -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(FXT_CFLAGS) $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) $(GLOBAL_AM_CFLAGS) -Wno-unused AM_CPPFLAGS = -I$(top_srcdir)/include/ -I$(top_builddir)/include -I$(top_srcdir)/mpi/include -I$(top_srcdir)/mpi/src -I$(top_srcdir)/src -I$(top_builddir)/src -I$(top_srcdir)/examples/ AM_LDFLAGS = $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) $(FXT_LDFLAGS) $(STARPU_COI_LDFLAGS) $(STARPU_SCIF_LDFLAGS) ######################## # Unit testcases # ######################## @BUILD_TESTS_TRUE@starpu_mpi_TESTS = \ @BUILD_TESTS_TRUE@ datatypes \ @BUILD_TESTS_TRUE@ pingpong \ @BUILD_TESTS_TRUE@ mpi_test \ @BUILD_TESTS_TRUE@ mpi_isend \ @BUILD_TESTS_TRUE@ mpi_earlyrecv \ @BUILD_TESTS_TRUE@ mpi_earlyrecv2 \ @BUILD_TESTS_TRUE@ mpi_earlyrecv2_sync \ @BUILD_TESTS_TRUE@ mpi_irecv \ @BUILD_TESTS_TRUE@ mpi_isend_detached \ @BUILD_TESTS_TRUE@ mpi_irecv_detached \ @BUILD_TESTS_TRUE@ mpi_detached_tag \ @BUILD_TESTS_TRUE@ mpi_redux \ @BUILD_TESTS_TRUE@ ring \ @BUILD_TESTS_TRUE@ ring_sync \ @BUILD_TESTS_TRUE@ ring_sync_detached \ @BUILD_TESTS_TRUE@ ring_async \ @BUILD_TESTS_TRUE@ ring_async_implicit \ @BUILD_TESTS_TRUE@ temporary \ @BUILD_TESTS_TRUE@ block_interface \ @BUILD_TESTS_TRUE@ block_interface_pinned \ @BUILD_TESTS_TRUE@ attr \ @BUILD_TESTS_TRUE@ cache \ @BUILD_TESTS_TRUE@ cache_disable \ @BUILD_TESTS_TRUE@ callback \ @BUILD_TESTS_TRUE@ matrix \ @BUILD_TESTS_TRUE@ matrix2 \ @BUILD_TESTS_TRUE@ insert_task \ @BUILD_TESTS_TRUE@ insert_task_compute \ @BUILD_TESTS_TRUE@ insert_task_sent_cache \ @BUILD_TESTS_TRUE@ insert_task_recv_cache \ @BUILD_TESTS_TRUE@ insert_task_block \ @BUILD_TESTS_TRUE@ insert_task_owner \ @BUILD_TESTS_TRUE@ insert_task_owner2 \ @BUILD_TESTS_TRUE@ insert_task_owner_data \ @BUILD_TESTS_TRUE@ insert_task_node_choice \ @BUILD_TESTS_TRUE@ insert_task_count \ @BUILD_TESTS_TRUE@ insert_task_dyn_handles \ @BUILD_TESTS_TRUE@ multiple_send \ @BUILD_TESTS_TRUE@ mpi_scatter_gather \ @BUILD_TESTS_TRUE@ mpi_reduction \ @BUILD_TESTS_TRUE@ user_defined_datatype \ @BUILD_TESTS_TRUE@ tags_checking \ @BUILD_TESTS_TRUE@ sync \ @BUILD_TESTS_TRUE@ gather \ @BUILD_TESTS_TRUE@ gather2 \ @BUILD_TESTS_TRUE@ policy_register \ @BUILD_TESTS_TRUE@ policy_register_many \ @BUILD_TESTS_TRUE@ policy_register_toomany \ @BUILD_TESTS_TRUE@ policy_unregister \ @BUILD_TESTS_TRUE@ policy_selection \ @BUILD_TESTS_TRUE@ policy_selection2 \ @BUILD_TESTS_TRUE@ early_request \ @BUILD_TESTS_TRUE@ starpu_redefine @BUILD_TESTS_TRUE@ring_SOURCES = ring.c $(am__append_2) @BUILD_TESTS_TRUE@ring_sync_SOURCES = ring_sync.c $(am__append_3) @BUILD_TESTS_TRUE@ring_sync_detached_SOURCES = ring_sync_detached.c \ @BUILD_TESTS_TRUE@ $(am__append_4) @BUILD_TESTS_TRUE@ring_async_SOURCES = ring_async.c $(am__append_5) @BUILD_TESTS_TRUE@ring_async_implicit_SOURCES = ring_async_implicit.c \ @BUILD_TESTS_TRUE@ $(am__append_6) @BUILD_TESTS_TRUE@insert_task_count_SOURCES = insert_task_count.c \ @BUILD_TESTS_TRUE@ $(am__append_7) @BUILD_TESTS_TRUE@mpi_reduction_SOURCES = mpi_reduction.c \ @BUILD_TESTS_TRUE@ mpi_reduction_kernels.c @BUILD_TESTS_TRUE@user_defined_datatype_SOURCES = \ @BUILD_TESTS_TRUE@ user_defined_datatype.c \ @BUILD_TESTS_TRUE@ ../../examples/interface/complex_interface.c @BUILD_TESTS_TRUE@mpi_earlyrecv2_SOURCES = mpi_earlyrecv2.c \ @BUILD_TESTS_TRUE@ ../../examples/interface/complex_interface.c @BUILD_TESTS_TRUE@mpi_earlyrecv2_sync_SOURCES = mpi_earlyrecv2_sync.c \ @BUILD_TESTS_TRUE@ ../../examples/interface/complex_interface.c all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .cu .cubin .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/starpu.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign mpi/tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign mpi/tests/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/starpu.mk $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-examplebinPROGRAMS: $(examplebin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(examplebin_PROGRAMS)'; test -n "$(examplebindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(examplebindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(examplebindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(examplebindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(examplebindir)$$dir" || exit $$?; \ } \ ; done uninstall-examplebinPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(examplebin_PROGRAMS)'; test -n "$(examplebindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(examplebindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(examplebindir)" && rm -f $$files clean-examplebinPROGRAMS: @list='$(examplebin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list attr$(EXEEXT): $(attr_OBJECTS) $(attr_DEPENDENCIES) $(EXTRA_attr_DEPENDENCIES) @rm -f attr$(EXEEXT) $(AM_V_CCLD)$(LINK) $(attr_OBJECTS) $(attr_LDADD) $(LIBS) block_interface$(EXEEXT): $(block_interface_OBJECTS) $(block_interface_DEPENDENCIES) $(EXTRA_block_interface_DEPENDENCIES) @rm -f block_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(block_interface_OBJECTS) $(block_interface_LDADD) $(LIBS) block_interface_pinned$(EXEEXT): $(block_interface_pinned_OBJECTS) $(block_interface_pinned_DEPENDENCIES) $(EXTRA_block_interface_pinned_DEPENDENCIES) @rm -f block_interface_pinned$(EXEEXT) $(AM_V_CCLD)$(LINK) $(block_interface_pinned_OBJECTS) $(block_interface_pinned_LDADD) $(LIBS) cache$(EXEEXT): $(cache_OBJECTS) $(cache_DEPENDENCIES) $(EXTRA_cache_DEPENDENCIES) @rm -f cache$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cache_OBJECTS) $(cache_LDADD) $(LIBS) cache_disable$(EXEEXT): $(cache_disable_OBJECTS) $(cache_disable_DEPENDENCIES) $(EXTRA_cache_disable_DEPENDENCIES) @rm -f cache_disable$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cache_disable_OBJECTS) $(cache_disable_LDADD) $(LIBS) callback$(EXEEXT): $(callback_OBJECTS) $(callback_DEPENDENCIES) $(EXTRA_callback_DEPENDENCIES) @rm -f callback$(EXEEXT) $(AM_V_CCLD)$(LINK) $(callback_OBJECTS) $(callback_LDADD) $(LIBS) datatypes$(EXEEXT): $(datatypes_OBJECTS) $(datatypes_DEPENDENCIES) $(EXTRA_datatypes_DEPENDENCIES) @rm -f datatypes$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datatypes_OBJECTS) $(datatypes_LDADD) $(LIBS) early_request$(EXEEXT): $(early_request_OBJECTS) $(early_request_DEPENDENCIES) $(EXTRA_early_request_DEPENDENCIES) @rm -f early_request$(EXEEXT) $(AM_V_CCLD)$(LINK) $(early_request_OBJECTS) $(early_request_LDADD) $(LIBS) gather$(EXEEXT): $(gather_OBJECTS) $(gather_DEPENDENCIES) $(EXTRA_gather_DEPENDENCIES) @rm -f gather$(EXEEXT) $(AM_V_CCLD)$(LINK) $(gather_OBJECTS) $(gather_LDADD) $(LIBS) gather2$(EXEEXT): $(gather2_OBJECTS) $(gather2_DEPENDENCIES) $(EXTRA_gather2_DEPENDENCIES) @rm -f gather2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(gather2_OBJECTS) $(gather2_LDADD) $(LIBS) insert_task$(EXEEXT): $(insert_task_OBJECTS) $(insert_task_DEPENDENCIES) $(EXTRA_insert_task_DEPENDENCIES) @rm -f insert_task$(EXEEXT) $(AM_V_CCLD)$(LINK) $(insert_task_OBJECTS) $(insert_task_LDADD) $(LIBS) insert_task_block$(EXEEXT): $(insert_task_block_OBJECTS) $(insert_task_block_DEPENDENCIES) $(EXTRA_insert_task_block_DEPENDENCIES) @rm -f insert_task_block$(EXEEXT) $(AM_V_CCLD)$(LINK) $(insert_task_block_OBJECTS) $(insert_task_block_LDADD) $(LIBS) insert_task_compute$(EXEEXT): $(insert_task_compute_OBJECTS) $(insert_task_compute_DEPENDENCIES) $(EXTRA_insert_task_compute_DEPENDENCIES) @rm -f insert_task_compute$(EXEEXT) $(AM_V_CCLD)$(LINK) $(insert_task_compute_OBJECTS) $(insert_task_compute_LDADD) $(LIBS) insert_task_count$(EXEEXT): $(insert_task_count_OBJECTS) $(insert_task_count_DEPENDENCIES) $(EXTRA_insert_task_count_DEPENDENCIES) @rm -f insert_task_count$(EXEEXT) $(AM_V_CCLD)$(LINK) $(insert_task_count_OBJECTS) $(insert_task_count_LDADD) $(LIBS) insert_task_dyn_handles$(EXEEXT): $(insert_task_dyn_handles_OBJECTS) $(insert_task_dyn_handles_DEPENDENCIES) $(EXTRA_insert_task_dyn_handles_DEPENDENCIES) @rm -f insert_task_dyn_handles$(EXEEXT) $(AM_V_CCLD)$(LINK) $(insert_task_dyn_handles_OBJECTS) $(insert_task_dyn_handles_LDADD) $(LIBS) insert_task_node_choice$(EXEEXT): $(insert_task_node_choice_OBJECTS) $(insert_task_node_choice_DEPENDENCIES) $(EXTRA_insert_task_node_choice_DEPENDENCIES) @rm -f insert_task_node_choice$(EXEEXT) $(AM_V_CCLD)$(LINK) $(insert_task_node_choice_OBJECTS) $(insert_task_node_choice_LDADD) $(LIBS) insert_task_owner$(EXEEXT): $(insert_task_owner_OBJECTS) $(insert_task_owner_DEPENDENCIES) $(EXTRA_insert_task_owner_DEPENDENCIES) @rm -f insert_task_owner$(EXEEXT) $(AM_V_CCLD)$(LINK) $(insert_task_owner_OBJECTS) $(insert_task_owner_LDADD) $(LIBS) insert_task_owner2$(EXEEXT): $(insert_task_owner2_OBJECTS) $(insert_task_owner2_DEPENDENCIES) $(EXTRA_insert_task_owner2_DEPENDENCIES) @rm -f insert_task_owner2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(insert_task_owner2_OBJECTS) $(insert_task_owner2_LDADD) $(LIBS) insert_task_owner_data$(EXEEXT): $(insert_task_owner_data_OBJECTS) $(insert_task_owner_data_DEPENDENCIES) $(EXTRA_insert_task_owner_data_DEPENDENCIES) @rm -f insert_task_owner_data$(EXEEXT) $(AM_V_CCLD)$(LINK) $(insert_task_owner_data_OBJECTS) $(insert_task_owner_data_LDADD) $(LIBS) insert_task_recv_cache$(EXEEXT): $(insert_task_recv_cache_OBJECTS) $(insert_task_recv_cache_DEPENDENCIES) $(EXTRA_insert_task_recv_cache_DEPENDENCIES) @rm -f insert_task_recv_cache$(EXEEXT) $(AM_V_CCLD)$(LINK) $(insert_task_recv_cache_OBJECTS) $(insert_task_recv_cache_LDADD) $(LIBS) insert_task_sent_cache$(EXEEXT): $(insert_task_sent_cache_OBJECTS) $(insert_task_sent_cache_DEPENDENCIES) $(EXTRA_insert_task_sent_cache_DEPENDENCIES) @rm -f insert_task_sent_cache$(EXEEXT) $(AM_V_CCLD)$(LINK) $(insert_task_sent_cache_OBJECTS) $(insert_task_sent_cache_LDADD) $(LIBS) loader$(EXEEXT): $(loader_OBJECTS) $(loader_DEPENDENCIES) $(EXTRA_loader_DEPENDENCIES) @rm -f loader$(EXEEXT) $(AM_V_CCLD)$(LINK) $(loader_OBJECTS) $(loader_LDADD) $(LIBS) matrix$(EXEEXT): $(matrix_OBJECTS) $(matrix_DEPENDENCIES) $(EXTRA_matrix_DEPENDENCIES) @rm -f matrix$(EXEEXT) $(AM_V_CCLD)$(LINK) $(matrix_OBJECTS) $(matrix_LDADD) $(LIBS) matrix2$(EXEEXT): $(matrix2_OBJECTS) $(matrix2_DEPENDENCIES) $(EXTRA_matrix2_DEPENDENCIES) @rm -f matrix2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(matrix2_OBJECTS) $(matrix2_LDADD) $(LIBS) mpi_detached_tag$(EXEEXT): $(mpi_detached_tag_OBJECTS) $(mpi_detached_tag_DEPENDENCIES) $(EXTRA_mpi_detached_tag_DEPENDENCIES) @rm -f mpi_detached_tag$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mpi_detached_tag_OBJECTS) $(mpi_detached_tag_LDADD) $(LIBS) mpi_earlyrecv$(EXEEXT): $(mpi_earlyrecv_OBJECTS) $(mpi_earlyrecv_DEPENDENCIES) $(EXTRA_mpi_earlyrecv_DEPENDENCIES) @rm -f mpi_earlyrecv$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mpi_earlyrecv_OBJECTS) $(mpi_earlyrecv_LDADD) $(LIBS) mpi_earlyrecv2$(EXEEXT): $(mpi_earlyrecv2_OBJECTS) $(mpi_earlyrecv2_DEPENDENCIES) $(EXTRA_mpi_earlyrecv2_DEPENDENCIES) @rm -f mpi_earlyrecv2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mpi_earlyrecv2_OBJECTS) $(mpi_earlyrecv2_LDADD) $(LIBS) mpi_earlyrecv2_sync$(EXEEXT): $(mpi_earlyrecv2_sync_OBJECTS) $(mpi_earlyrecv2_sync_DEPENDENCIES) $(EXTRA_mpi_earlyrecv2_sync_DEPENDENCIES) @rm -f mpi_earlyrecv2_sync$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mpi_earlyrecv2_sync_OBJECTS) $(mpi_earlyrecv2_sync_LDADD) $(LIBS) mpi_irecv$(EXEEXT): $(mpi_irecv_OBJECTS) $(mpi_irecv_DEPENDENCIES) $(EXTRA_mpi_irecv_DEPENDENCIES) @rm -f mpi_irecv$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mpi_irecv_OBJECTS) $(mpi_irecv_LDADD) $(LIBS) mpi_irecv_detached$(EXEEXT): $(mpi_irecv_detached_OBJECTS) $(mpi_irecv_detached_DEPENDENCIES) $(EXTRA_mpi_irecv_detached_DEPENDENCIES) @rm -f mpi_irecv_detached$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mpi_irecv_detached_OBJECTS) $(mpi_irecv_detached_LDADD) $(LIBS) mpi_isend$(EXEEXT): $(mpi_isend_OBJECTS) $(mpi_isend_DEPENDENCIES) $(EXTRA_mpi_isend_DEPENDENCIES) @rm -f mpi_isend$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mpi_isend_OBJECTS) $(mpi_isend_LDADD) $(LIBS) mpi_isend_detached$(EXEEXT): $(mpi_isend_detached_OBJECTS) $(mpi_isend_detached_DEPENDENCIES) $(EXTRA_mpi_isend_detached_DEPENDENCIES) @rm -f mpi_isend_detached$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mpi_isend_detached_OBJECTS) $(mpi_isend_detached_LDADD) $(LIBS) mpi_reduction$(EXEEXT): $(mpi_reduction_OBJECTS) $(mpi_reduction_DEPENDENCIES) $(EXTRA_mpi_reduction_DEPENDENCIES) @rm -f mpi_reduction$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mpi_reduction_OBJECTS) $(mpi_reduction_LDADD) $(LIBS) mpi_redux$(EXEEXT): $(mpi_redux_OBJECTS) $(mpi_redux_DEPENDENCIES) $(EXTRA_mpi_redux_DEPENDENCIES) @rm -f mpi_redux$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mpi_redux_OBJECTS) $(mpi_redux_LDADD) $(LIBS) mpi_scatter_gather$(EXEEXT): $(mpi_scatter_gather_OBJECTS) $(mpi_scatter_gather_DEPENDENCIES) $(EXTRA_mpi_scatter_gather_DEPENDENCIES) @rm -f mpi_scatter_gather$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mpi_scatter_gather_OBJECTS) $(mpi_scatter_gather_LDADD) $(LIBS) mpi_test$(EXEEXT): $(mpi_test_OBJECTS) $(mpi_test_DEPENDENCIES) $(EXTRA_mpi_test_DEPENDENCIES) @rm -f mpi_test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mpi_test_OBJECTS) $(mpi_test_LDADD) $(LIBS) multiple_send$(EXEEXT): $(multiple_send_OBJECTS) $(multiple_send_DEPENDENCIES) $(EXTRA_multiple_send_DEPENDENCIES) @rm -f multiple_send$(EXEEXT) $(AM_V_CCLD)$(LINK) $(multiple_send_OBJECTS) $(multiple_send_LDADD) $(LIBS) pingpong$(EXEEXT): $(pingpong_OBJECTS) $(pingpong_DEPENDENCIES) $(EXTRA_pingpong_DEPENDENCIES) @rm -f pingpong$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pingpong_OBJECTS) $(pingpong_LDADD) $(LIBS) policy_register$(EXEEXT): $(policy_register_OBJECTS) $(policy_register_DEPENDENCIES) $(EXTRA_policy_register_DEPENDENCIES) @rm -f policy_register$(EXEEXT) $(AM_V_CCLD)$(LINK) $(policy_register_OBJECTS) $(policy_register_LDADD) $(LIBS) policy_register_many$(EXEEXT): $(policy_register_many_OBJECTS) $(policy_register_many_DEPENDENCIES) $(EXTRA_policy_register_many_DEPENDENCIES) @rm -f policy_register_many$(EXEEXT) $(AM_V_CCLD)$(LINK) $(policy_register_many_OBJECTS) $(policy_register_many_LDADD) $(LIBS) policy_register_toomany$(EXEEXT): $(policy_register_toomany_OBJECTS) $(policy_register_toomany_DEPENDENCIES) $(EXTRA_policy_register_toomany_DEPENDENCIES) @rm -f policy_register_toomany$(EXEEXT) $(AM_V_CCLD)$(LINK) $(policy_register_toomany_OBJECTS) $(policy_register_toomany_LDADD) $(LIBS) policy_selection$(EXEEXT): $(policy_selection_OBJECTS) $(policy_selection_DEPENDENCIES) $(EXTRA_policy_selection_DEPENDENCIES) @rm -f policy_selection$(EXEEXT) $(AM_V_CCLD)$(LINK) $(policy_selection_OBJECTS) $(policy_selection_LDADD) $(LIBS) policy_selection2$(EXEEXT): $(policy_selection2_OBJECTS) $(policy_selection2_DEPENDENCIES) $(EXTRA_policy_selection2_DEPENDENCIES) @rm -f policy_selection2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(policy_selection2_OBJECTS) $(policy_selection2_LDADD) $(LIBS) policy_unregister$(EXEEXT): $(policy_unregister_OBJECTS) $(policy_unregister_DEPENDENCIES) $(EXTRA_policy_unregister_DEPENDENCIES) @rm -f policy_unregister$(EXEEXT) $(AM_V_CCLD)$(LINK) $(policy_unregister_OBJECTS) $(policy_unregister_LDADD) $(LIBS) ring$(EXEEXT): $(ring_OBJECTS) $(ring_DEPENDENCIES) $(EXTRA_ring_DEPENDENCIES) @rm -f ring$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ring_OBJECTS) $(ring_LDADD) $(LIBS) ring_async$(EXEEXT): $(ring_async_OBJECTS) $(ring_async_DEPENDENCIES) $(EXTRA_ring_async_DEPENDENCIES) @rm -f ring_async$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ring_async_OBJECTS) $(ring_async_LDADD) $(LIBS) ring_async_implicit$(EXEEXT): $(ring_async_implicit_OBJECTS) $(ring_async_implicit_DEPENDENCIES) $(EXTRA_ring_async_implicit_DEPENDENCIES) @rm -f ring_async_implicit$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ring_async_implicit_OBJECTS) $(ring_async_implicit_LDADD) $(LIBS) ring_sync$(EXEEXT): $(ring_sync_OBJECTS) $(ring_sync_DEPENDENCIES) $(EXTRA_ring_sync_DEPENDENCIES) @rm -f ring_sync$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ring_sync_OBJECTS) $(ring_sync_LDADD) $(LIBS) ring_sync_detached$(EXEEXT): $(ring_sync_detached_OBJECTS) $(ring_sync_detached_DEPENDENCIES) $(EXTRA_ring_sync_detached_DEPENDENCIES) @rm -f ring_sync_detached$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ring_sync_detached_OBJECTS) $(ring_sync_detached_LDADD) $(LIBS) starpu_redefine$(EXEEXT): $(starpu_redefine_OBJECTS) $(starpu_redefine_DEPENDENCIES) $(EXTRA_starpu_redefine_DEPENDENCIES) @rm -f starpu_redefine$(EXEEXT) $(AM_V_CCLD)$(LINK) $(starpu_redefine_OBJECTS) $(starpu_redefine_LDADD) $(LIBS) sync$(EXEEXT): $(sync_OBJECTS) $(sync_DEPENDENCIES) $(EXTRA_sync_DEPENDENCIES) @rm -f sync$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sync_OBJECTS) $(sync_LDADD) $(LIBS) tags_checking$(EXEEXT): $(tags_checking_OBJECTS) $(tags_checking_DEPENDENCIES) $(EXTRA_tags_checking_DEPENDENCIES) @rm -f tags_checking$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tags_checking_OBJECTS) $(tags_checking_LDADD) $(LIBS) temporary$(EXEEXT): $(temporary_OBJECTS) $(temporary_DEPENDENCIES) $(EXTRA_temporary_DEPENDENCIES) @rm -f temporary$(EXEEXT) $(AM_V_CCLD)$(LINK) $(temporary_OBJECTS) $(temporary_LDADD) $(LIBS) user_defined_datatype$(EXEEXT): $(user_defined_datatype_OBJECTS) $(user_defined_datatype_DEPENDENCIES) $(EXTRA_user_defined_datatype_DEPENDENCIES) @rm -f user_defined_datatype$(EXEEXT) $(AM_V_CCLD)$(LINK) $(user_defined_datatype_OBJECTS) $(user_defined_datatype_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/attr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/block_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/block_interface_pinned.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache_disable.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callback.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/complex_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/datatypes.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/early_request.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gather.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gather2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_block.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_compute.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_count.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_dyn_handles.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_node_choice.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_owner.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_owner2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_owner_data.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_recv_cache.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_sent_cache.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loader-loader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrix2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_detached_tag.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_earlyrecv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_earlyrecv2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_earlyrecv2_sync.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_irecv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_irecv_detached.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_isend.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_isend_detached.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_reduction.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_reduction_kernels.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_redux.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_scatter_gather.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiple_send.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pingpong.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/policy_register.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/policy_register_many.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/policy_register_toomany.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/policy_selection.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/policy_selection2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/policy_unregister.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ring.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ring_async.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ring_async_implicit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ring_sync.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ring_sync_detached.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_redefine.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tags_checking.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/temporary.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/user_defined_datatype.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< loader-loader.o: ../../tests/loader.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT loader-loader.o -MD -MP -MF $(DEPDIR)/loader-loader.Tpo -c -o loader-loader.o `test -f '../../tests/loader.c' || echo '$(srcdir)/'`../../tests/loader.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/loader-loader.Tpo $(DEPDIR)/loader-loader.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../tests/loader.c' object='loader-loader.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o loader-loader.o `test -f '../../tests/loader.c' || echo '$(srcdir)/'`../../tests/loader.c loader-loader.obj: ../../tests/loader.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT loader-loader.obj -MD -MP -MF $(DEPDIR)/loader-loader.Tpo -c -o loader-loader.obj `if test -f '../../tests/loader.c'; then $(CYGPATH_W) '../../tests/loader.c'; else $(CYGPATH_W) '$(srcdir)/../../tests/loader.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/loader-loader.Tpo $(DEPDIR)/loader-loader.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../tests/loader.c' object='loader-loader.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o loader-loader.obj `if test -f '../../tests/loader.c'; then $(CYGPATH_W) '../../tests/loader.c'; else $(CYGPATH_W) '$(srcdir)/../../tests/loader.c'; fi` complex_interface.o: ../../examples/interface/complex_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT complex_interface.o -MD -MP -MF $(DEPDIR)/complex_interface.Tpo -c -o complex_interface.o `test -f '../../examples/interface/complex_interface.c' || echo '$(srcdir)/'`../../examples/interface/complex_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/complex_interface.Tpo $(DEPDIR)/complex_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../examples/interface/complex_interface.c' object='complex_interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o complex_interface.o `test -f '../../examples/interface/complex_interface.c' || echo '$(srcdir)/'`../../examples/interface/complex_interface.c complex_interface.obj: ../../examples/interface/complex_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT complex_interface.obj -MD -MP -MF $(DEPDIR)/complex_interface.Tpo -c -o complex_interface.obj `if test -f '../../examples/interface/complex_interface.c'; then $(CYGPATH_W) '../../examples/interface/complex_interface.c'; else $(CYGPATH_W) '$(srcdir)/../../examples/interface/complex_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/complex_interface.Tpo $(DEPDIR)/complex_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../examples/interface/complex_interface.c' object='complex_interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o complex_interface.obj `if test -f '../../examples/interface/complex_interface.c'; then $(CYGPATH_W) '../../examples/interface/complex_interface.c'; else $(CYGPATH_W) '$(srcdir)/../../examples/interface/complex_interface.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? datatypes.log: datatypes$(EXEEXT) @p='datatypes$(EXEEXT)'; \ b='datatypes'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) pingpong.log: pingpong$(EXEEXT) @p='pingpong$(EXEEXT)'; \ b='pingpong'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) mpi_test.log: mpi_test$(EXEEXT) @p='mpi_test$(EXEEXT)'; \ b='mpi_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) mpi_isend.log: mpi_isend$(EXEEXT) @p='mpi_isend$(EXEEXT)'; \ b='mpi_isend'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) mpi_earlyrecv.log: mpi_earlyrecv$(EXEEXT) @p='mpi_earlyrecv$(EXEEXT)'; \ b='mpi_earlyrecv'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) mpi_earlyrecv2.log: mpi_earlyrecv2$(EXEEXT) @p='mpi_earlyrecv2$(EXEEXT)'; \ b='mpi_earlyrecv2'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) mpi_earlyrecv2_sync.log: mpi_earlyrecv2_sync$(EXEEXT) @p='mpi_earlyrecv2_sync$(EXEEXT)'; \ b='mpi_earlyrecv2_sync'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) mpi_irecv.log: mpi_irecv$(EXEEXT) @p='mpi_irecv$(EXEEXT)'; \ b='mpi_irecv'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) mpi_isend_detached.log: mpi_isend_detached$(EXEEXT) @p='mpi_isend_detached$(EXEEXT)'; \ b='mpi_isend_detached'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) mpi_irecv_detached.log: mpi_irecv_detached$(EXEEXT) @p='mpi_irecv_detached$(EXEEXT)'; \ b='mpi_irecv_detached'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) mpi_detached_tag.log: mpi_detached_tag$(EXEEXT) @p='mpi_detached_tag$(EXEEXT)'; \ b='mpi_detached_tag'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) mpi_redux.log: mpi_redux$(EXEEXT) @p='mpi_redux$(EXEEXT)'; \ b='mpi_redux'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ring.log: ring$(EXEEXT) @p='ring$(EXEEXT)'; \ b='ring'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ring_sync.log: ring_sync$(EXEEXT) @p='ring_sync$(EXEEXT)'; \ b='ring_sync'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ring_sync_detached.log: ring_sync_detached$(EXEEXT) @p='ring_sync_detached$(EXEEXT)'; \ b='ring_sync_detached'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ring_async.log: ring_async$(EXEEXT) @p='ring_async$(EXEEXT)'; \ b='ring_async'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ring_async_implicit.log: ring_async_implicit$(EXEEXT) @p='ring_async_implicit$(EXEEXT)'; \ b='ring_async_implicit'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) temporary.log: temporary$(EXEEXT) @p='temporary$(EXEEXT)'; \ b='temporary'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) block_interface.log: block_interface$(EXEEXT) @p='block_interface$(EXEEXT)'; \ b='block_interface'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) block_interface_pinned.log: block_interface_pinned$(EXEEXT) @p='block_interface_pinned$(EXEEXT)'; \ b='block_interface_pinned'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) attr.log: attr$(EXEEXT) @p='attr$(EXEEXT)'; \ b='attr'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) cache.log: cache$(EXEEXT) @p='cache$(EXEEXT)'; \ b='cache'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) cache_disable.log: cache_disable$(EXEEXT) @p='cache_disable$(EXEEXT)'; \ b='cache_disable'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) callback.log: callback$(EXEEXT) @p='callback$(EXEEXT)'; \ b='callback'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) matrix.log: matrix$(EXEEXT) @p='matrix$(EXEEXT)'; \ b='matrix'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) matrix2.log: matrix2$(EXEEXT) @p='matrix2$(EXEEXT)'; \ b='matrix2'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) insert_task.log: insert_task$(EXEEXT) @p='insert_task$(EXEEXT)'; \ b='insert_task'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) insert_task_compute.log: insert_task_compute$(EXEEXT) @p='insert_task_compute$(EXEEXT)'; \ b='insert_task_compute'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) insert_task_sent_cache.log: insert_task_sent_cache$(EXEEXT) @p='insert_task_sent_cache$(EXEEXT)'; \ b='insert_task_sent_cache'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) insert_task_recv_cache.log: insert_task_recv_cache$(EXEEXT) @p='insert_task_recv_cache$(EXEEXT)'; \ b='insert_task_recv_cache'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) insert_task_block.log: insert_task_block$(EXEEXT) @p='insert_task_block$(EXEEXT)'; \ b='insert_task_block'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) insert_task_owner.log: insert_task_owner$(EXEEXT) @p='insert_task_owner$(EXEEXT)'; \ b='insert_task_owner'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) insert_task_owner2.log: insert_task_owner2$(EXEEXT) @p='insert_task_owner2$(EXEEXT)'; \ b='insert_task_owner2'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) insert_task_owner_data.log: insert_task_owner_data$(EXEEXT) @p='insert_task_owner_data$(EXEEXT)'; \ b='insert_task_owner_data'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) insert_task_node_choice.log: insert_task_node_choice$(EXEEXT) @p='insert_task_node_choice$(EXEEXT)'; \ b='insert_task_node_choice'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) insert_task_count.log: insert_task_count$(EXEEXT) @p='insert_task_count$(EXEEXT)'; \ b='insert_task_count'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) insert_task_dyn_handles.log: insert_task_dyn_handles$(EXEEXT) @p='insert_task_dyn_handles$(EXEEXT)'; \ b='insert_task_dyn_handles'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) multiple_send.log: multiple_send$(EXEEXT) @p='multiple_send$(EXEEXT)'; \ b='multiple_send'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) mpi_scatter_gather.log: mpi_scatter_gather$(EXEEXT) @p='mpi_scatter_gather$(EXEEXT)'; \ b='mpi_scatter_gather'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) mpi_reduction.log: mpi_reduction$(EXEEXT) @p='mpi_reduction$(EXEEXT)'; \ b='mpi_reduction'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) user_defined_datatype.log: user_defined_datatype$(EXEEXT) @p='user_defined_datatype$(EXEEXT)'; \ b='user_defined_datatype'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tags_checking.log: tags_checking$(EXEEXT) @p='tags_checking$(EXEEXT)'; \ b='tags_checking'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) sync.log: sync$(EXEEXT) @p='sync$(EXEEXT)'; \ b='sync'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) gather.log: gather$(EXEEXT) @p='gather$(EXEEXT)'; \ b='gather'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) gather2.log: gather2$(EXEEXT) @p='gather2$(EXEEXT)'; \ b='gather2'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) policy_register.log: policy_register$(EXEEXT) @p='policy_register$(EXEEXT)'; \ b='policy_register'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) policy_register_many.log: policy_register_many$(EXEEXT) @p='policy_register_many$(EXEEXT)'; \ b='policy_register_many'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) policy_register_toomany.log: policy_register_toomany$(EXEEXT) @p='policy_register_toomany$(EXEEXT)'; \ b='policy_register_toomany'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) policy_unregister.log: policy_unregister$(EXEEXT) @p='policy_unregister$(EXEEXT)'; \ b='policy_unregister'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) policy_selection.log: policy_selection$(EXEEXT) @p='policy_selection$(EXEEXT)'; \ b='policy_selection'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) policy_selection2.log: policy_selection2$(EXEEXT) @p='policy_selection2$(EXEEXT)'; \ b='policy_selection2'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) early_request.log: early_request$(EXEEXT) @p='early_request$(EXEEXT)'; \ b='early_request'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) starpu_redefine.log: starpu_redefine$(EXEEXT) @p='starpu_redefine$(EXEEXT)'; \ b='starpu_redefine'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(examplebindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-checkPROGRAMS clean-examplebinPROGRAMS clean-generic \ clean-libtool clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-examplebinPROGRAMS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-examplebinPROGRAMS .MAKE: all check check-am install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-examplebinPROGRAMS clean-generic \ clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am \ install-examplebinPROGRAMS install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \ uninstall uninstall-am uninstall-examplebinPROGRAMS .PRECIOUS: Makefile showcheck: -cat $(TEST_LOGS) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q " runtime error: " $(TEST_LOGS) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET @STARPU_USE_CUDA_TRUE@.cu.cubin: @STARPU_USE_CUDA_TRUE@ $(MKDIR_P) `dirname $@` @STARPU_USE_CUDA_TRUE@ $(NVCC) -cubin $< -o $@ $(NVCCFLAGS) @STARPU_USE_CUDA_TRUE@.cu.o: @STARPU_USE_CUDA_TRUE@ $(NVCC) $< -c -o $@ $(NVCCFLAGS) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.2.3+dfsg/mpi/tests/attr.c000066400000000000000000000021711320135501600170140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "helper.h" int main(int argc, char **argv) { int flag; int value; (void) argc; (void) argv; starpu_mpi_comm_get_attr(MPI_COMM_WORLD, 42, NULL, &flag); STARPU_ASSERT_MSG(flag == 0, "starpu_mpi_comm_get_attr was called with invalid argument\n"); starpu_mpi_comm_get_attr(MPI_COMM_WORLD, STARPU_MPI_TAG_UB, &value, &flag); STARPU_ASSERT_MSG(flag == 1, "starpu_mpi_comm_get_attr was called with valid argument\n"); FPRINTF(stderr, "Value: %d\n", value); return 0; } starpu-1.2.3+dfsg/mpi/tests/block_interface.c000066400000000000000000000076061320135501600211640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2014, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "helper.h" #define NITER 2048 #define BIGSIZE 128 #define SIZE 64 int main(int argc, char **argv) { int ret, rank, size; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if (size < 2) { if (rank == 0) FPRINTF(stderr, "We need at least 2 processes.\n"); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return STARPU_TEST_SKIPPED; } /* Node 0 will allocate a big block and only register an inner part of * it as the block data, Node 1 will allocate a block of small size and * register it directly. Node 0 and 1 will then exchange the content of * their blocks. */ float *block = NULL; starpu_data_handle_t block_handle = NULL; if (rank == 0) { block = calloc(BIGSIZE*BIGSIZE*BIGSIZE, sizeof(float)); assert(block); /* fill the inner block */ unsigned i, j, k; for (k = 0; k < SIZE; k++) for (j = 0; j < SIZE; j++) for (i = 0; i < SIZE; i++) { block[i + j*BIGSIZE + k*BIGSIZE*BIGSIZE] = 1.0f; } starpu_block_data_register(&block_handle, STARPU_MAIN_RAM, (uintptr_t)block, BIGSIZE, BIGSIZE*BIGSIZE, SIZE, SIZE, SIZE, sizeof(float)); } else if (rank == 1) { block = calloc(SIZE*SIZE*SIZE, sizeof(float)); assert(block); starpu_block_data_register(&block_handle, STARPU_MAIN_RAM, (uintptr_t)block, SIZE, SIZE*SIZE, SIZE, SIZE, SIZE, sizeof(float)); } if (rank == 0) { ret = starpu_mpi_send(block_handle, 1, 0x42, MPI_COMM_WORLD); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_send"); MPI_Status status; ret = starpu_mpi_recv(block_handle, 1, 0x1337, MPI_COMM_WORLD, &status); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_recv"); /* check the content of the block */ ret = starpu_data_acquire(block_handle, STARPU_R); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire"); unsigned i, j, k; for (k = 0; k < SIZE; k++) for (j = 0; j < SIZE; j++) for (i = 0; i < SIZE; i++) { assert(block[i + j*BIGSIZE + k*BIGSIZE*BIGSIZE] == 33.0f); } starpu_data_release(block_handle); } else if (rank == 1) { MPI_Status status; ret = starpu_mpi_recv(block_handle, 0, 0x42, MPI_COMM_WORLD, &status); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_recv"); /* check the content of the block and modify it */ ret = starpu_data_acquire(block_handle, STARPU_RW); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire"); unsigned i, j, k; for (k = 0; k < SIZE; k++) for (j = 0; j < SIZE; j++) for (i = 0; i < SIZE; i++) { assert(block[i + j*SIZE + k*SIZE*SIZE] == 1.0f); block[i + j*SIZE + k*SIZE*SIZE] = 33.0f; } starpu_data_release(block_handle); ret = starpu_mpi_send(block_handle, 0, 0x1337, MPI_COMM_WORLD); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_send"); } FPRINTF(stdout, "Rank %d is done\n", rank); fflush(stdout); if (rank == 0 || rank == 1) { starpu_data_unregister(block_handle); free(block); } starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return 0; } starpu-1.2.3+dfsg/mpi/tests/block_interface_pinned.c000066400000000000000000000076721320135501600225240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "helper.h" #define NITER 2048 #define BIGSIZE 64 #define SIZE 64 int main(int argc, char **argv) { int ret, rank, size; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if (size < 2) { if (rank == 0) FPRINTF(stderr, "We need at least 2 processes.\n"); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return STARPU_TEST_SKIPPED; } /* Node 0 will allocate a big block and only register an inner part of * it as the block data, Node 1 will allocate a block of small size and * register it directly. Node 0 and 1 will then exchange the content of * their blocks. */ float *block = NULL; starpu_data_handle_t block_handle = NULL; if (rank == 0) { starpu_malloc((void **)&block, BIGSIZE*BIGSIZE*BIGSIZE*sizeof(float)); memset(block, 0, BIGSIZE*BIGSIZE*BIGSIZE*sizeof(float)); /* fill the inner block */ unsigned i, j, k; for (k = 0; k < SIZE; k++) for (j = 0; j < SIZE; j++) for (i = 0; i < SIZE; i++) { block[i + j*BIGSIZE + k*BIGSIZE*BIGSIZE] = 1.0f; } starpu_block_data_register(&block_handle, STARPU_MAIN_RAM, (uintptr_t)block, BIGSIZE, BIGSIZE*BIGSIZE, SIZE, SIZE, SIZE, sizeof(float)); } else if (rank == 1) { starpu_malloc((void **)&block, SIZE*SIZE*SIZE*sizeof(float)); memset(block, 0, SIZE*SIZE*SIZE*sizeof(float)); starpu_block_data_register(&block_handle, STARPU_MAIN_RAM, (uintptr_t)block, SIZE, SIZE*SIZE, SIZE, SIZE, SIZE, sizeof(float)); } if (rank == 0) { MPI_Status status; ret = starpu_mpi_send(block_handle, 1, 0x42, MPI_COMM_WORLD); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_send"); ret = starpu_mpi_recv(block_handle, 1, 0x1337, MPI_COMM_WORLD, &status); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_recv"); /* check the content of the block */ starpu_data_acquire(block_handle, STARPU_R); unsigned i, j, k; for (k = 0; k < SIZE; k++) for (j = 0; j < SIZE; j++) for (i = 0; i < SIZE; i++) { assert(block[i + j*BIGSIZE + k*BIGSIZE*BIGSIZE] == 33.0f); } starpu_data_release(block_handle); } else if (rank == 1) { MPI_Status status; ret = starpu_mpi_recv(block_handle, 0, 0x42, MPI_COMM_WORLD, &status); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_recv"); /* check the content of the block and modify it */ ret = starpu_data_acquire(block_handle, STARPU_RW); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire"); unsigned i, j, k; for (k = 0; k < SIZE; k++) for (j = 0; j < SIZE; j++) for (i = 0; i < SIZE; i++) { assert(block[i + j*SIZE + k*SIZE*SIZE] == 1.0f); block[i + j*SIZE + k*SIZE*SIZE] = 33.0f; } starpu_data_release(block_handle); ret = starpu_mpi_send(block_handle, 0, 0x1337, MPI_COMM_WORLD); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_send"); } if (rank == 0 || rank == 1) { starpu_data_unregister(block_handle); starpu_free(block); } FPRINTF(stdout, "Rank %d is done\n", rank); fflush(stdout); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return 0; } starpu-1.2.3+dfsg/mpi/tests/cache.c000066400000000000000000000064341320135501600171130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "helper.h" #include void func_cpu(STARPU_ATTRIBUTE_UNUSED void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; struct starpu_codelet mycodelet_r = { .cpu_funcs = {func_cpu}, .nbuffers = 1, .modes = {STARPU_R}, .model = &dumb_model }; struct starpu_codelet mycodelet_w = { .cpu_funcs = {func_cpu}, .nbuffers = 1, .modes = {STARPU_W}, .model = &dumb_model }; struct starpu_codelet mycodelet_rw = { .cpu_funcs = {func_cpu}, .nbuffers = 1, .modes = {STARPU_RW}, .model = &dumb_model }; void test(struct starpu_codelet *codelet, enum starpu_data_access_mode mode, starpu_data_handle_t data, int rank, int in_cache) { void *ptr; int ret; ret = starpu_mpi_task_insert(MPI_COMM_WORLD, codelet, mode, data, STARPU_EXECUTE_ON_NODE, 1, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_task_insert"); ptr = _starpu_mpi_cache_received_data_get(data, 0); if (rank == 1) { if (in_cache) { STARPU_ASSERT_MSG(ptr != NULL, "Data should be in cache\n"); } else { STARPU_ASSERT_MSG(ptr == NULL, "Data should NOT be in cache\n"); } } } int main(int argc, char **argv) { int rank, n; int ret; unsigned val = 42; starpu_data_handle_t data; ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(&argc, &argv, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); if (starpu_mpi_cache_is_enabled() == 0) goto skip; if (rank == 0) starpu_variable_data_register(&data, STARPU_MAIN_RAM, (uintptr_t)&val, sizeof(unsigned)); else starpu_variable_data_register(&data, -1, (uintptr_t)NULL, sizeof(unsigned)); starpu_mpi_data_register(data, 42, 0); FPRINTF_MPI(stderr, "Registering data %p with tag %d and node %d\n", data, 42, 0); // We use the same data with different access modes and we check if it is // available or not in the cache test(&mycodelet_r, STARPU_R, data, rank, 1); test(&mycodelet_rw, STARPU_RW, data, rank, 0); test(&mycodelet_r, STARPU_R, data, rank, 1); test(&mycodelet_r, STARPU_R, data, rank, 1); test(&mycodelet_w, STARPU_W, data, rank, 0); FPRINTF(stderr, "Waiting ...\n"); starpu_task_wait_for_all(); starpu_data_unregister(data); skip: starpu_mpi_shutdown(); starpu_shutdown(); return starpu_mpi_cache_is_enabled() == 0 ? STARPU_TEST_SKIPPED : 0; } starpu-1.2.3+dfsg/mpi/tests/cache_disable.c000066400000000000000000000060231320135501600205700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "helper.h" #include void func_cpu(STARPU_ATTRIBUTE_UNUSED void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; struct starpu_codelet mycodelet_r = { .cpu_funcs = {func_cpu}, .nbuffers = 1, .modes = {STARPU_R}, .model = &dumb_model }; int main(int argc, char **argv) { int rank, n; int ret; unsigned *val; starpu_data_handle_t data; void *ptr = NULL; int cache; ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(&argc, &argv, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); cache = starpu_mpi_cache_is_enabled(); if (cache == 0) goto skip; val = malloc(sizeof(*val)); *val = 12; if (rank == 0) starpu_variable_data_register(&data, STARPU_MAIN_RAM, (uintptr_t)val, sizeof(unsigned)); else starpu_variable_data_register(&data, -1, (uintptr_t)NULL, sizeof(unsigned)); starpu_mpi_data_register(data, 42, 0); FPRINTF_MPI(stderr, "Registering data %p with tag %d and node %d\n", data, 42, 0); ret = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet_r, STARPU_R, data, STARPU_EXECUTE_ON_NODE, 1, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_task_insert"); ptr = _starpu_mpi_cache_received_data_get(data, 0); if (rank == 1) { STARPU_ASSERT_MSG(ptr != NULL, "Data should be in cache\n"); } // We clean the cache starpu_mpi_cache_set(0); // We check the data is no longer in the cache ptr = _starpu_mpi_cache_received_data_get(data, 0); if (rank == 1) { STARPU_ASSERT_MSG(ptr == NULL, "Data should NOT be in cache\n"); } ret = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet_r, STARPU_R, data, STARPU_EXECUTE_ON_NODE, 1, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_task_insert"); ptr = _starpu_mpi_cache_received_data_get(data, 0); if (rank == 1) { STARPU_ASSERT_MSG(ptr == NULL, "Data should NOT be in cache\n"); } FPRINTF(stderr, "Waiting ...\n"); starpu_task_wait_for_all(); starpu_data_unregister(data); free(val); skip: starpu_mpi_shutdown(); starpu_shutdown(); return cache == 0 ? STARPU_TEST_SKIPPED : 0; } starpu-1.2.3+dfsg/mpi/tests/callback.c000066400000000000000000000066421320135501600176050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013, 2014, 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "helper.h" static int expected_x=40; static int expected_y=12; void my_func(STARPU_ATTRIBUTE_UNUSED void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { FPRINTF_MPI(stderr, "i am here\n"); } /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; struct starpu_codelet my_codelet = { .cpu_funcs = {my_func}, .cuda_funcs = {my_func}, .opencl_funcs = {my_func}, .model = &dumb_model }; static void callback(void *ptr) { int *x = (int *)ptr; FPRINTF_MPI(stderr, "x=%d\n", *x); STARPU_ASSERT_MSG(*x == expected_x, "%d != %d\n", *x, expected_x); (*x)++; } static void prologue_callback(void *ptr) { int *y = (int *)ptr; FPRINTF_MPI(stderr, "y=%d\n", *y); STARPU_ASSERT_MSG(*y == expected_y, "%d != %d\n", *y, expected_y); (*y)++; } int main(int argc, char **argv) { int ret; int x=40; int y=12; int rank, size; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(&argc, &argv, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); ret = starpu_mpi_task_insert(MPI_COMM_WORLD, NULL, STARPU_EXECUTE_ON_NODE, 0, STARPU_CALLBACK_WITH_ARG, callback, &x, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_task_insert"); if (rank == 0) expected_x ++; ret = starpu_mpi_task_insert(MPI_COMM_WORLD, NULL, STARPU_EXECUTE_ON_NODE, 0, STARPU_CALLBACK, callback, STARPU_CALLBACK_ARG, &x, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); if (rank == 0) expected_x ++; STARPU_ASSERT_MSG(x == expected_x, "x should be equal to %d and not %d\n", expected_x, x); ret = starpu_mpi_task_insert(MPI_COMM_WORLD, NULL, STARPU_EXECUTE_ON_NODE, 0, STARPU_PROLOGUE_CALLBACK, prologue_callback, STARPU_PROLOGUE_CALLBACK_ARG, &y, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); if (rank == 0) expected_y ++; ret = starpu_mpi_task_insert(MPI_COMM_WORLD, &my_codelet, STARPU_EXECUTE_ON_NODE, 0, STARPU_PROLOGUE_CALLBACK_POP, prologue_callback, STARPU_PROLOGUE_CALLBACK_POP_ARG, &y, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); starpu_task_wait_for_all(); if (rank == 0) expected_y ++; STARPU_ASSERT_MSG(y == expected_y, "y should be equal to %d and not %d\n", expected_y, y); starpu_mpi_shutdown(); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/mpi/tests/datatypes.c000066400000000000000000000433131320135501600200430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013, 2014, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "helper.h" typedef void (*check_func)(starpu_data_handle_t handle_s, starpu_data_handle_t handle_r, int *error); void send_recv_and_check(int rank, int node, starpu_data_handle_t handle_s, int tag_s, starpu_data_handle_t handle_r, int tag_r, int *error, check_func func) { int ret; MPI_Status status; if (rank == 0) { ret = starpu_mpi_send(handle_s, node, tag_s, MPI_COMM_WORLD); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_send"); ret = starpu_mpi_recv(handle_r, node, tag_r, MPI_COMM_WORLD, &status); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_recv"); assert(func); func(handle_s, handle_r, error); } else if (rank == 1) { ret = starpu_mpi_recv(handle_s, node, tag_s, MPI_COMM_WORLD, &status); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_recv"); ret = starpu_mpi_send(handle_s, node, tag_r, MPI_COMM_WORLD); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_send"); } } /* * Void */ void check_void(starpu_data_handle_t handle_s, starpu_data_handle_t handle_r, int *error) { FPRINTF_MPI(stderr, "Success with void value\n"); } void exchange_void(int rank, int *error) { STARPU_SKIP_IF_VALGRIND; if (rank == 0) { starpu_data_handle_t void_handle[2]; starpu_void_data_register(&void_handle[0]); starpu_void_data_register(&void_handle[1]); send_recv_and_check(rank, 1, void_handle[0], 0x42, void_handle[1], 0x1337, error, check_void); starpu_data_unregister(void_handle[0]); starpu_data_unregister(void_handle[1]); } else if (rank == 1) { starpu_data_handle_t void_handle; starpu_void_data_register(&void_handle); send_recv_and_check(rank, 0, void_handle, 0x42, NULL, 0x1337, NULL, NULL); starpu_data_unregister(void_handle); } } /* * Variable */ void check_variable(starpu_data_handle_t handle_s, starpu_data_handle_t handle_r, int *error) { float *v_s, *v_r; STARPU_ASSERT(starpu_variable_get_elemsize(handle_s) == starpu_variable_get_elemsize(handle_r)); v_s = (float *)starpu_variable_get_local_ptr(handle_s); v_r = (float *)starpu_variable_get_local_ptr(handle_r); if (*v_s == *v_r) { FPRINTF_MPI(stderr, "Success with variable value: %f == %f\n", *v_s, *v_r); } else { *error = 1; FPRINTF_MPI(stderr, "Error with variable value: %f != %f\n", *v_s, *v_r); } } void exchange_variable(int rank, int *error) { if (rank == 0) { float v = 42.12; starpu_data_handle_t variable_handle[2]; starpu_variable_data_register(&variable_handle[0], STARPU_MAIN_RAM, (uintptr_t)&v, sizeof(v)); starpu_variable_data_register(&variable_handle[1], -1, (uintptr_t)NULL, sizeof(v)); send_recv_and_check(rank, 1, variable_handle[0], 0x42, variable_handle[1], 0x1337, error, check_variable); starpu_data_unregister(variable_handle[0]); starpu_data_unregister(variable_handle[1]); } else if (rank == 1) { starpu_data_handle_t variable_handle; starpu_variable_data_register(&variable_handle, -1, (uintptr_t)NULL, sizeof(float)); send_recv_and_check(rank, 0, variable_handle, 0x42, NULL, 0x1337, NULL, NULL); starpu_data_unregister(variable_handle); } } /* * Vector */ void check_vector(starpu_data_handle_t handle_s, starpu_data_handle_t handle_r, int *error) { int i; int nx; int *v_r, *v_s; STARPU_ASSERT(starpu_vector_get_elemsize(handle_s) == starpu_vector_get_elemsize(handle_r)); STARPU_ASSERT(starpu_vector_get_nx(handle_s) == starpu_vector_get_nx(handle_r)); nx = starpu_vector_get_nx(handle_r); v_r = (int *)starpu_vector_get_local_ptr(handle_r); v_s = (int *)starpu_vector_get_local_ptr(handle_s); for(i=0 ; i %d] value: %c == %c\n", x, y, index, matrix_s[index], matrix_r[index]); } else { *error = 1; FPRINTF_MPI(stderr, "Error with matrix[%d,%d --> %d] value: %c != %c\n", x, y, index, matrix_s[index], matrix_r[index]); } } } } void exchange_matrix(int rank, int *error) { int nx=3; int ny=2; if (rank == 0) { char *matrix, n='a'; int x, y; starpu_data_handle_t matrix_handle[2]; matrix = (char*)malloc(nx*ny*sizeof(char)); assert(matrix); for(y=0 ; y %d] value: %f == %f\n", x, y, z, index, block_s[index], block_r[index]); } else { *error = 1; FPRINTF_MPI(stderr, "Error with block[%d,%d,%d --> %d] value: %f != %f\n", x, y, z, index, block_s[index], block_r[index]); } } } starpu_data_release(handle_s); starpu_data_release(handle_r); } void exchange_block(int rank, int *error) { int nx=3; int ny=2; int nz=4; if (rank == 0) { float *block, n=1.0; int x, y, z; starpu_data_handle_t block_handle[2]; block = (float*)malloc(nx*ny*nz*sizeof(float)); assert(block); for(z=0 ; z #include #include "helper.h" #define NUM_EL 5 #define NUM_LOOPS 10 /* * This testcase written by J-M Couteyen allows to test that several * early requests for a given source and tag can be posted to StarPU * by the application before data arrive. * * In this test case, multiples processes (called "domains") exchanges * informations between multiple "elements" multiple times, with * different sizes (in order to catch error more easily). * The communications are independent between the elements (each one * as its proper tag), but must occur in the submitted order for an * element taken independtly. */ struct element { int tag; int foreign_domain; int array_send[100]; int array_recv[100]; starpu_data_handle_t ensure_submitted_order_send; starpu_data_handle_t ensure_submitted_order_recv; starpu_data_handle_t send; starpu_data_handle_t recv; }; /* functions/codelet to fill the bufferss*/ void fill_tmp_buffer(void *buffers[], void *cl_arg) { int *tmp = (int *) STARPU_VECTOR_GET_PTR(buffers[0]); int nx = STARPU_VECTOR_GET_NX(buffers[0]); int i; for (i=0; itag=size; el->foreign_domain=foreign_domain; int mpi_rank; starpu_mpi_comm_rank(MPI_COMM_WORLD, &mpi_rank); starpu_vector_data_register(&el->recv, 0, (uintptr_t)el->array_recv, size, sizeof(int)); starpu_vector_data_register(&el->send, 0, (uintptr_t)el->array_send, size, sizeof(int)); starpu_void_data_register(&el->ensure_submitted_order_send); starpu_void_data_register(&el->ensure_submitted_order_recv); } void free_element(struct element *el) { starpu_data_unregister(el->recv); starpu_data_unregister(el->send); starpu_data_unregister(el->ensure_submitted_order_send); starpu_data_unregister(el->ensure_submitted_order_recv); } 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); } /*main program*/ int main(int argc, char * argv[]) { /* Init */ int ret; int mpi_rank, mpi_size; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &mpi_rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &mpi_size); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); /*element initialization : domains are connected as a ring for this test*/ int num_elements=NUM_EL; struct element * el_left=malloc(num_elements*sizeof(el_left[0])); struct element * el_right=malloc(num_elements*sizeof(el_right[0])); int i; for(i=0;i #include "helper.h" int main(int argc, char **argv) { int ret, rank, size; starpu_data_handle_t handle; int var; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if (size<3) { FPRINTF(stderr, "We need more than 2 processes.\n"); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return STARPU_TEST_SKIPPED; } if (rank == 0) { int n; for(n=1 ; n from node <%d>\n", var, n); FPRINTF_MPI(stderr, "received <%d> from node %d\n", var, n); starpu_data_release(handle); starpu_data_unregister(handle); } } else { FPRINTF_MPI(stderr, "sending to node %d\n", 0); var = rank; starpu_variable_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)&var, sizeof(var)); starpu_mpi_send(handle, 0, 42, MPI_COMM_WORLD); starpu_data_unregister(handle); } starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return 0; } starpu-1.2.3+dfsg/mpi/tests/gather2.c000066400000000000000000000057711320135501600174070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013, 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "helper.h" int main(int argc, char **argv) { int ret, rank, size; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if (size<3) { FPRINTF(stderr, "We need more than 2 processes.\n"); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return STARPU_TEST_SKIPPED; } if (rank == 0) { int n; for(n=1 ; n from node <%d>\n", var[0], n); FPRINTF_MPI(stderr, "received <%d> from node %d\n", var[0], n); starpu_data_release(handle[0]); starpu_mpi_recv(handle[0], n, 42, MPI_COMM_WORLD, &status[1]); starpu_mpi_recv(handle[1], n, 44, MPI_COMM_WORLD, &status[2]); for(i=0 ; i<2 ; i++) starpu_data_acquire(handle[i], STARPU_R); STARPU_ASSERT_MSG(var[0] == n*2, "Received incorrect value <%d> from node <%d>\n", var[0], n); STARPU_ASSERT_MSG(var[1] == n*4, "Received incorrect value <%d> from node <%d>\n", var[0], n); FPRINTF_MPI(stderr, "received <%d> and <%d> from node %d\n", var[0], var[1], n); for(i=0 ; i<2 ; i++) starpu_data_release(handle[i]); for(i=0 ; i<2 ; i++) starpu_data_unregister(handle[i]); } } else { int i, var[3]; starpu_data_handle_t handle[3]; FPRINTF_MPI(stderr, "sending to node %d\n", 0); var[0] = rank; var[1] = var[0] * 2; var[2] = var[0] * 4; for(i=0 ; i<3 ; i++) starpu_variable_data_register(&handle[i], STARPU_MAIN_RAM, (uintptr_t)&var[i], sizeof(var[i])); starpu_mpi_send(handle[0], 0, 42, MPI_COMM_WORLD); starpu_mpi_send(handle[1], 0, 42, MPI_COMM_WORLD); starpu_mpi_send(handle[2], 0, 44, MPI_COMM_WORLD); for(i=0 ; i<3 ; i++) starpu_data_unregister(handle[i]); } starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return 0; } starpu-1.2.3+dfsg/mpi/tests/helper.h000066400000000000000000000032141320135501600173250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../../tests/helper.h" #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #define FPRINTF_MPI(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) { \ int _disp_rank; starpu_mpi_comm_rank(MPI_COMM_WORLD, &_disp_rank); \ fprintf(ofile, "[%d][starpu_mpi][%s] " fmt , _disp_rank, __starpu_func__ ,## __VA_ARGS__); \ fflush(ofile); }} while(0); #define MPI_INIT_THREAD(argc, argv, required) do { \ int thread_support; \ if (MPI_Init_thread(argc, argv, required, &thread_support) != MPI_SUCCESS) \ { \ fprintf(stderr,"MPI_Init_thread failed\n"); \ exit(1); \ } \ if (thread_support == MPI_THREAD_FUNNELED) \ fprintf(stderr,"Warning: MPI only has funneled thread support, not serialized, hoping this will work\n"); \ if (thread_support < MPI_THREAD_FUNNELED) \ fprintf(stderr,"Warning: MPI does not have thread support!\n"); } while(0); starpu-1.2.3+dfsg/mpi/tests/insert_task.c000066400000000000000000000100351320135501600203660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013, 2014 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "helper.h" void func_cpu(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { unsigned *x = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned *y = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[1]); FPRINTF(stdout, "VALUES: %u %u\n", *x, *y); *x = (*x + *y) / 2; } /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_RW, STARPU_R}, .model = &dumb_model }; #define X 4 #define Y 5 /* Returns the MPI node number where data indexes index is */ int my_distrib(int x, int y, int nb_nodes) { return (x + y) % nb_nodes; } int main(int argc, char **argv) { int rank, size, x, y; int value=0, ret; unsigned matrix[X][Y]; starpu_data_handle_t data_handles[X][Y]; ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(&argc, &argv, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); for(x = 0; x < X; x++) { for (y = 0; y < Y; y++) { matrix[x][y] = (rank+1)*10 + value; value++; } } #if 0 for(x = 0; x < X; x++) { FPRINTF(stdout, "[%d] ", rank); for (y = 0; y < Y; y++) { FPRINTF(stdout, "%3d ", matrix[x][y]); } FPRINTF(stdout, "\n"); } #endif for(x = 0; x < X; x++) { for (y = 0; y < Y; y++) { int mpi_rank = my_distrib(x, y, size); if (mpi_rank == rank) { //FPRINTF(stderr, "[%d] Owning data[%d][%d]\n", rank, x, y); starpu_variable_data_register(&data_handles[x][y], STARPU_MAIN_RAM, (uintptr_t)&(matrix[x][y]), sizeof(unsigned)); } else { /* I don't own that index, but will need it for my computations */ //FPRINTF(stderr, "[%d] Neighbour of data[%d][%d]\n", rank, x, y); starpu_variable_data_register(&data_handles[x][y], -1, (uintptr_t)NULL, sizeof(unsigned)); } if (data_handles[x][y]) { starpu_mpi_data_register(data_handles[x][y], (y*X)+x, mpi_rank); } } } ret = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet, STARPU_RW, data_handles[1][1], STARPU_R, data_handles[0][1], 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_task_insert"); ret = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet, STARPU_RW, data_handles[3][1], STARPU_R, data_handles[0][1], 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_task_insert"); ret = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet, STARPU_RW, data_handles[0][1], STARPU_R, data_handles[0][0], 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_task_insert"); ret = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet, STARPU_RW, data_handles[3][1], STARPU_R, data_handles[0][1], 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_task_insert"); FPRINTF(stderr, "Waiting ...\n"); starpu_task_wait_for_all(); for(x = 0; x < X; x++) { for (y = 0; y < Y; y++) { if (data_handles[x][y]) starpu_data_unregister(data_handles[x][y]); } } starpu_mpi_shutdown(); starpu_shutdown(); #if 0 for(x = 0; x < X; x++) { FPRINTF(stdout, "[%d] ", rank); for (y = 0; y < Y; y++) { FPRINTF(stdout, "%3d ", matrix[x][y]); } FPRINTF(stdout, "\n"); } #endif return 0; } starpu-1.2.3+dfsg/mpi/tests/insert_task_block.c000066400000000000000000000101371320135501600215430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013, 2014 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "helper.h" void func_cpu(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { unsigned *matrix = (unsigned *)STARPU_MATRIX_GET_PTR(descr[0]); int nx = (int)STARPU_MATRIX_GET_NX(descr[0]); int ny = (int)STARPU_MATRIX_GET_NY(descr[0]); int ld = (int)STARPU_MATRIX_GET_LD(descr[0]); int i, j; unsigned sum=0; for (i = 0; i < nx; i++) { for (j = 0; j < ny; j++) { sum += matrix[i+j*ld]; } } for (i = 0; i < nx; i++) { for (j = 0; j < ny; j++) { matrix[i+j*ld] = sum;///(nx*ny); } } } #ifdef STARPU_SIMGRID /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; #endif struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 1, #ifdef STARPU_SIMGRID .model = &dumb_model, #endif .modes = {STARPU_RW} }; #define SIZE 6 #define BLOCKS 3 /* Returns the MPI node number where data indexes index is */ int my_distrib(int x, int y, int nb_nodes) { return (x + y) % nb_nodes; } int main(int argc, char **argv) { int rank, size, x, y; int ret, value=0; unsigned matrix[SIZE*SIZE]; starpu_data_handle_t data_handles[SIZE][SIZE]; ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(&argc, &argv, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_initialize_extended"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); for(x = 0; x < SIZE; x++) { for (y = 0; y < SIZE; y++) { matrix[x+y*SIZE] = rank*100 + value; value++; } } #if 1 for(x = 0; x < SIZE; x++) { FPRINTF(stdout, "[%d] ", rank); for (y = 0; y < SIZE; y++) { FPRINTF(stdout, "%3u ", matrix[x+y*SIZE]); } FPRINTF(stdout, "\n"); } #endif for(x = 0; x < BLOCKS ; x++) { for (y = 0; y < BLOCKS; y++) { int mpi_rank = my_distrib(x, y, size); if (mpi_rank == rank) { //FPRINTF(stderr, "[%d] Owning data[%d][%d]\n", rank, x, y); starpu_matrix_data_register(&data_handles[x][y], STARPU_MAIN_RAM, (uintptr_t)&(matrix[((SIZE/BLOCKS)*x) + ((SIZE/BLOCKS)*y) * SIZE]), SIZE, SIZE/BLOCKS, SIZE/BLOCKS, sizeof(unsigned)); } else { /* I don't own that index, but will need it for my computations */ //FPRINTF(stderr, "[%d] Neighbour of data[%d][%d]\n", rank, x, y); starpu_matrix_data_register(&data_handles[x][y], -1, (uintptr_t)&(matrix[((SIZE/BLOCKS)*x) + ((SIZE/BLOCKS)*y) * SIZE]), SIZE, SIZE/BLOCKS, SIZE/BLOCKS, sizeof(unsigned)); } if (data_handles[x][y]) { starpu_mpi_data_register(data_handles[x][y], (y*BLOCKS)+x, mpi_rank); } } } for(x = 0; x < BLOCKS; x++) { for (y = 0; y < BLOCKS; y++) { ret = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet, STARPU_RW, data_handles[x][y], 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_task_insert"); } } FPRINTF(stderr, "Waiting ...\n"); starpu_task_wait_for_all(); for(x = 0; x < BLOCKS; x++) { for (y = 0; y < BLOCKS; y++) { if (data_handles[x][y]) starpu_data_unregister(data_handles[x][y]); } } starpu_mpi_shutdown(); starpu_shutdown(); #if 1 for(x = 0; x < SIZE; x++) { FPRINTF(stdout, "[%d] ", rank); for (y = 0; y < SIZE; y++) { FPRINTF(stdout, "%3u ", matrix[x+y*SIZE]); } FPRINTF(stdout, "\n"); } #endif return 0; } starpu-1.2.3+dfsg/mpi/tests/insert_task_compute.c000066400000000000000000000143351320135501600221310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013, 2014, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "helper.h" void func_cpu(void *descr[], void *_args) { int rank; int *x = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); int *y = (int *)STARPU_VARIABLE_GET_PTR(descr[1]); starpu_codelet_unpack_args(_args, &rank); FPRINTF(stdout, "[%d] VALUES: %d %d\n", rank, *x, *y); *x = *x * *y; } /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_RW, STARPU_R}, .model = &dumb_model }; int test(int rank, int node, int *before, int *after, int task_insert, int data_array) { int ok, ret, i, x[2]; starpu_data_handle_t data_handles[2]; struct starpu_data_descr descrs[2]; ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if (starpu_cpu_worker_get_count() <= 0) { // If there is no cpu to execute the codelet, mpi will block trying to do the post-execution communication ret = -ENODEV; FPRINTF_MPI(stderr, "No CPU is available\n"); goto nodata; } FPRINTF_MPI(stderr, "Testing with node=%d - task_insert=%d - data_array=%d - \n", node, task_insert, data_array); for(i=0 ; i<2 ; i++) { if (rank <= 1) { x[i] = before[rank*2+i]; FPRINTF_MPI(stderr, "before computation x[%d] = %d\n", i, x[i]); } else x[i] = rank*2+i; if (rank == i) starpu_variable_data_register(&data_handles[i], 0, (uintptr_t)&x[i], sizeof(int)); else starpu_variable_data_register(&data_handles[i], -1, (uintptr_t)NULL, sizeof(int)); starpu_mpi_data_register(data_handles[i], i, i); descrs[i].handle = data_handles[i]; } descrs[0].mode = STARPU_RW; descrs[1].mode = STARPU_R; switch(task_insert) { case 0: { struct starpu_task *task = NULL; switch(data_array) { case 0: { task = starpu_mpi_task_build(MPI_COMM_WORLD, &mycodelet, STARPU_RW, data_handles[0], STARPU_R, data_handles[1], STARPU_VALUE, &rank, sizeof(rank), STARPU_EXECUTE_ON_NODE, node, 0); break; } case 1: { task = starpu_mpi_task_build(MPI_COMM_WORLD, &mycodelet, STARPU_DATA_ARRAY, data_handles, 2, STARPU_VALUE, &rank, sizeof(rank), STARPU_EXECUTE_ON_NODE, node, 0); break; } case 2: { task = starpu_mpi_task_build(MPI_COMM_WORLD, &mycodelet, STARPU_DATA_MODE_ARRAY, descrs, 2, STARPU_VALUE, &rank, sizeof(rank), STARPU_EXECUTE_ON_NODE, node, 0); break; } } if (task) { ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } switch(data_array) { case 0: { starpu_mpi_task_post_build(MPI_COMM_WORLD, &mycodelet, STARPU_RW, data_handles[0], STARPU_R, data_handles[1], STARPU_EXECUTE_ON_NODE, node, 0); break; } case 1: { starpu_mpi_task_post_build(MPI_COMM_WORLD, &mycodelet, STARPU_DATA_ARRAY, data_handles, 2, STARPU_EXECUTE_ON_NODE, node, 0); break; } case 2: { starpu_mpi_task_post_build(MPI_COMM_WORLD, &mycodelet, STARPU_DATA_MODE_ARRAY, descrs, 2, STARPU_EXECUTE_ON_NODE, node, 0); break; } } break; } case 1: { switch(data_array) { case 0: { ret = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet, STARPU_RW, data_handles[0], STARPU_R, data_handles[1], STARPU_VALUE, &rank, sizeof(rank), STARPU_EXECUTE_ON_NODE, node, 0); break; } case 1: { ret = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet, STARPU_DATA_ARRAY, data_handles, 2, STARPU_VALUE, &rank, sizeof(rank), STARPU_EXECUTE_ON_NODE, node, 0); break; } case 2: { ret = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet, STARPU_DATA_MODE_ARRAY, descrs, 2, STARPU_VALUE, &rank, sizeof(rank), STARPU_EXECUTE_ON_NODE, node, 0); break; } } STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_task_insert"); break; } } starpu_task_wait_for_all(); enodev: for(i=0; i<2; i++) { starpu_data_unregister(data_handles[i]); } ok = 1; #ifndef STARPU_SIMGRID if (rank <= 1) { for(i=0; i<2; i++) { ok = ok && (x[i] == after[rank*2+i]); FPRINTF_MPI(stderr, "after computation x[%d] = %d, should be %d\n", i, x[i], after[rank*2+i]); } FPRINTF_MPI(stderr, "result is %s\n", ok?"CORRECT":"NOT CORRECT"); } #endif nodata: MPI_Barrier(MPI_COMM_WORLD); starpu_mpi_shutdown(); starpu_shutdown(); return ret == -ENODEV ? ret : !ok; } int main(int argc, char **argv) { int rank; int global_ret, ret; int before[4] = {10, 20, 11, 22}; int after_node[2][4] = {{220, 20, 11, 22}, {220, 20, 11, 22}}; int node, insert_task, data_array; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); global_ret = 0; for(node=0 ; node<=1 ; node++) { for(insert_task=0 ; insert_task<=1 ; insert_task++) { for(data_array=0 ; data_array<=2 ; data_array++) { ret = test(rank, node, before, after_node[node], insert_task, data_array); if (ret == -ENODEV || ret) global_ret = ret; } } } MPI_Finalize(); return global_ret==-ENODEV?STARPU_TEST_SKIPPED:global_ret; } starpu-1.2.3+dfsg/mpi/tests/insert_task_count.c000066400000000000000000000065351320135501600216100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "helper.h" #ifdef STARPU_QUICK_CHECK # define NITER 32 #elif !defined(STARPU_LONG_CHECK) # define NITER 256 #else # define NITER 2048 #endif #ifdef STARPU_USE_CUDA extern void increment_cuda(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); #endif void increment_cpu(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { int *tokenptr = (int *)STARPU_VECTOR_GET_PTR(descr[0]); (*tokenptr)++; } /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; static struct starpu_codelet increment_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {increment_cuda}, #endif .cpu_funcs = {increment_cpu}, .nbuffers = 1, .modes = {STARPU_RW}, .model = &dumb_model }; int main(int argc, char **argv) { int ret, rank, size; int token = 0; starpu_data_handle_t token_handle; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if (size < 2) { if (rank == 0) FPRINTF(stderr, "We need at least 2 processes.\n"); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return STARPU_TEST_SKIPPED; } if (rank == 1) starpu_vector_data_register(&token_handle, 0, (uintptr_t)&token, 1, sizeof(token)); else starpu_vector_data_register(&token_handle, -1, (uintptr_t)NULL, 1, sizeof(token)); starpu_mpi_data_register(token_handle, 12, 1); int nloops = NITER; int loop; FPRINTF_MPI(stderr, "Start with token value %d\n", token); for (loop = 0; loop < nloops; loop++) { if (loop % 2) starpu_mpi_task_insert(MPI_COMM_WORLD, &increment_cl, STARPU_RW|STARPU_SSEND, token_handle, STARPU_EXECUTE_ON_NODE, 0, 0); else starpu_mpi_task_insert(MPI_COMM_WORLD, &increment_cl, STARPU_RW, token_handle, STARPU_EXECUTE_ON_NODE, 0, 0); } starpu_task_wait_for_all(); starpu_data_unregister(token_handle); starpu_mpi_shutdown(); starpu_shutdown(); FPRINTF_MPI(stderr, "Final value for token %d\n", token); MPI_Finalize(); #ifndef STARPU_SIMGRID if (rank == 1) { STARPU_ASSERT_MSG(token == nloops, "token==%d != expected_value==%d\n", token, nloops); } else { STARPU_ASSERT_MSG(token == 0, "token==%d != expected_value==0\n", token); } #endif return 0; } starpu-1.2.3+dfsg/mpi/tests/insert_task_dyn_handles.c000066400000000000000000000107271320135501600227460ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "helper.h" #define FFACTOR 42 void func_cpu(void *descr[], void *_args) { int num = starpu_task_get_current()->nbuffers; int *factor = (int *)STARPU_VARIABLE_GET_PTR(descr[num-1]); int i; for (i = 0; i < num-1; i++) { int *x = (int *)STARPU_VARIABLE_GET_PTR(descr[i]); *x = *x + 1**factor; } } #ifdef STARPU_SIMGRID /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; #endif struct starpu_codelet codelet = { .cpu_funcs = {func_cpu}, .cpu_funcs_name = {"func_cpu"}, .nbuffers = STARPU_VARIABLE_NBUFFERS, #ifdef STARPU_SIMGRID .model = &dumb_model, #endif }; int main(int argc, char **argv) { int *x; int i, ret, loop; int rank; int factor=0; #ifdef STARPU_QUICK_CHECK int nloops = 4; #else int nloops = 16; #endif starpu_data_handle_t *data_handles; starpu_data_handle_t factor_handle; struct starpu_data_descr *descrs; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); x = calloc(1, (STARPU_NMAXBUFS+15) * sizeof(int)); data_handles = malloc((STARPU_NMAXBUFS+15) * sizeof(starpu_data_handle_t)); descrs = malloc((STARPU_NMAXBUFS+15) * sizeof(struct starpu_data_descr)); for(i=0 ; i #include #include "helper.h" void func_cpu(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { int node; int rank; starpu_codelet_unpack_args(_args, &node); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); FPRINTF_MPI(stderr, "Expected node: %d - Actual node: %d\n", node, rank); assert(node == rank); } /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_RW, STARPU_RW}, .model = &dumb_model, .name = "insert_task_node_choice" }; int main(int argc, char **argv) { int ret, rank, size, err, node; int x0=32; long long x1=23; starpu_data_handle_t data_handlesx0; starpu_data_handle_t data_handlesx1; ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(&argc, &argv, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (rank != 0 && rank != 1) goto end; if (rank == 0) { starpu_variable_data_register(&data_handlesx0, STARPU_MAIN_RAM, (uintptr_t)&x0, sizeof(x0)); starpu_variable_data_register(&data_handlesx1, -1, (uintptr_t)NULL, sizeof(x1)); } else { starpu_variable_data_register(&data_handlesx0, -1, (uintptr_t)NULL, sizeof(x0)); starpu_variable_data_register(&data_handlesx1, STARPU_MAIN_RAM, (uintptr_t)&x1, sizeof(x1)); } starpu_mpi_data_register(data_handlesx0, 100, 0); starpu_mpi_data_register(data_handlesx1, 200, 1); node = 0; err = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet, STARPU_VALUE, &node, sizeof(node), STARPU_EXECUTE_ON_NODE, 0, STARPU_RW, data_handlesx0, STARPU_RW, data_handlesx1, 0); assert(err == 0); node = starpu_data_get_rank(data_handlesx1); err = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet, STARPU_VALUE, &node, sizeof(node), STARPU_EXECUTE_ON_DATA, data_handlesx1, STARPU_RW, data_handlesx0, STARPU_RW, data_handlesx1, 0); assert(err == 0); // Node 1 has a long long data which has a bigger size than a // int, so it is going to be selected by the node selection // policy to execute the codelet err = starpu_mpi_node_selection_set_current_policy(STARPU_MPI_NODE_SELECTION_MOST_R_DATA); assert(err == 0); node = 1; err = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet, STARPU_VALUE, &node, sizeof(node), STARPU_RW, data_handlesx0, STARPU_RW, data_handlesx1, 0); assert(err == 0); FPRINTF_MPI(stderr, "Waiting ...\n"); starpu_task_wait_for_all(); starpu_data_unregister(data_handlesx0); starpu_data_unregister(data_handlesx1); end: starpu_mpi_shutdown(); starpu_shutdown(); return 0; } starpu-1.2.3+dfsg/mpi/tests/insert_task_owner.c000066400000000000000000000130011320135501600215740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "helper.h" void func_cpu(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { int node; int rank; starpu_codelet_unpack_args(_args, &node); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); FPRINTF_MPI(stderr, "Expected node: %d - Actual node: %d\n", node, rank); assert(node == rank); } /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; struct starpu_codelet mycodelet_r_w = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_R, STARPU_W}, .model = &dumb_model }; struct starpu_codelet mycodelet_rw_r = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_RW, STARPU_R}, .model = &dumb_model }; struct starpu_codelet mycodelet_rw_rw = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_RW, STARPU_RW}, .model = &dumb_model }; struct starpu_codelet mycodelet_w_r = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_W, STARPU_R}, .model = &dumb_model }; struct starpu_codelet mycodelet_r_r = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_R, STARPU_R}, .model = &dumb_model }; int main(int argc, char **argv) { int ret, rank, size, err, node; long x0=32; int x1=23; starpu_data_handle_t data_handlesx0 = NULL; starpu_data_handle_t data_handlesx1 = NULL; ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(&argc, &argv, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (rank != 0 && rank != 1) goto end; if (rank == 0) { starpu_variable_data_register(&data_handlesx0, STARPU_MAIN_RAM, (uintptr_t)&x0, sizeof(x0)); starpu_mpi_data_register(data_handlesx0, 0, rank); starpu_variable_data_register(&data_handlesx1, -1, (uintptr_t)NULL, sizeof(x1)); starpu_mpi_data_register(data_handlesx1, 1, 1); } else if (rank == 1) { starpu_variable_data_register(&data_handlesx1, STARPU_MAIN_RAM, (uintptr_t)&x1, sizeof(x1)); starpu_mpi_data_register(data_handlesx1, 1, rank); starpu_variable_data_register(&data_handlesx0, -1, (uintptr_t)NULL, sizeof(x0)); starpu_mpi_data_register(data_handlesx0, 0, 0); } node = starpu_mpi_data_get_rank(data_handlesx1); err = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet_r_w, STARPU_VALUE, &node, sizeof(node), STARPU_R, data_handlesx0, STARPU_W, data_handlesx1, 0); assert(err == 0); node = starpu_mpi_data_get_rank(data_handlesx0); err = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet_rw_r, STARPU_VALUE, &node, sizeof(node), STARPU_RW, data_handlesx0, STARPU_R, data_handlesx1, 0); assert(err == 0); err = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet_rw_rw, STARPU_VALUE, &node, sizeof(node), STARPU_RW, data_handlesx0, STARPU_RW, data_handlesx1, 0); assert(err == 0); node = 1; err = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet_rw_rw, STARPU_VALUE, &node, sizeof(node), STARPU_RW, data_handlesx0, STARPU_RW, data_handlesx1, STARPU_EXECUTE_ON_NODE, node, 0); assert(err == 0); node = 0; err = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet_rw_rw, STARPU_VALUE, &node, sizeof(node), STARPU_RW, data_handlesx0, STARPU_RW, data_handlesx1, STARPU_EXECUTE_ON_NODE, node, 0); assert(err == 0); node = 0; err = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet_r_r, STARPU_VALUE, &node, sizeof(node), STARPU_R, data_handlesx0, STARPU_R, data_handlesx1, STARPU_EXECUTE_ON_NODE, node, 0); assert(err == 0); /* Here the value specified by the property STARPU_EXECUTE_ON_NODE is going to overwrite the node even though the data model clearly specifies which node is going to execute the codelet */ node = 0; err = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet_r_w, STARPU_VALUE, &node, sizeof(node), STARPU_R, data_handlesx0, STARPU_W, data_handlesx1, STARPU_EXECUTE_ON_NODE, node, 0); assert(err == 0); /* Here the value specified by the property STARPU_EXECUTE_ON_NODE is going to overwrite the node even though the data model clearly specifies which node is going to execute the codelet */ node = 0; err = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet_w_r, STARPU_VALUE, &node, sizeof(node), STARPU_W, data_handlesx0, STARPU_R, data_handlesx1, STARPU_EXECUTE_ON_NODE, node, 0); assert(err == 0); FPRINTF_MPI(stderr, "Waiting ...\n"); starpu_task_wait_for_all(); starpu_data_unregister(data_handlesx0); starpu_data_unregister(data_handlesx1); end: starpu_mpi_shutdown(); starpu_shutdown(); return 0; } starpu-1.2.3+dfsg/mpi/tests/insert_task_owner2.c000066400000000000000000000103461320135501600216670ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012, 2015 Université Bordeaux * Copyright (C) 2011, 2012, 2013, 2014, 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "helper.h" void func_cpu(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { int *x0 = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); int *x1 = (int *)STARPU_VARIABLE_GET_PTR(descr[1]); int *x2 = (int *)STARPU_VARIABLE_GET_PTR(descr[2]); int *y = (int *)STARPU_VARIABLE_GET_PTR(descr[3]); FPRINTF(stderr, "-------> CODELET VALUES: %d %d nan %d\n", *x0, *x1, *y); *x2 = *y; *y = (*x0 + *x1) * 100; *x1 = 12; FPRINTF(stderr, "-------> CODELET VALUES: %d %d %d %d\n", *x0, *x1, *x2, *y); } /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 4, .modes = {STARPU_R, STARPU_RW, STARPU_W, STARPU_W}, .model = &dumb_model }; int main(int argc, char **argv) { int rank, size, err; int x[3], y=0; int oldx[3]; int i, ret=0; starpu_data_handle_t data_handles[4]; ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(&argc, &argv, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (rank == 0) { for(i=0 ; i<3 ; i++) { x[i] = 10*(i+1); oldx[i] = 10*(i+1); starpu_variable_data_register(&data_handles[i], STARPU_MAIN_RAM, (uintptr_t)&x[i], sizeof(x[i])); } y = -1; starpu_variable_data_register(&data_handles[3], -1, (uintptr_t)NULL, sizeof(int)); } else { for(i=0 ; i<3 ; i++) { x[i] = -1; starpu_variable_data_register(&data_handles[i], -1, (uintptr_t)NULL, sizeof(int)); } y=200; starpu_variable_data_register(&data_handles[3], STARPU_MAIN_RAM, (uintptr_t)&y, sizeof(int)); } for(i=0 ; i<3 ; i++) { starpu_mpi_data_register(data_handles[i], i, 0); } starpu_mpi_data_register(data_handles[3], 3, 1); FPRINTF(stderr, "[%d][init] VALUES: %d %d %d %d\n", rank, x[0], x[1], x[2], y); err = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet, STARPU_R, data_handles[0], STARPU_RW, data_handles[1], STARPU_W, data_handles[2], STARPU_W, data_handles[3], STARPU_EXECUTE_ON_NODE, 1, 0); STARPU_CHECK_RETURN_VALUE(err, "starpu_mpi_task_insert"); starpu_task_wait_for_all(); int *values = malloc(4 * sizeof(int)); for(i=0 ; i<4 ; i++) { starpu_mpi_get_data_on_node_detached(MPI_COMM_WORLD, data_handles[i], 0, NULL, NULL); if (rank == 0) { starpu_data_acquire(data_handles[i], STARPU_R); values[i] = *((int *)starpu_data_get_local_ptr(data_handles[i])); starpu_data_release(data_handles[i]); } starpu_data_unregister(data_handles[i]); } if (rank == 0) { FPRINTF(stderr, "[%d][local ptr] VALUES: %d %d %d %d\n", rank, values[0], values[1], values[2], values[3]); if (values[0] != oldx[0] || values[1] != 12 || values[2] != 200 || values[3] != ((oldx[0] + oldx[1]) * 100)) { FPRINTF(stderr, "[%d][error] values[0] %d != x[0] %d && values[1] %d != 12 && values[2] %d != 200 && values[3] %d != ((x[0] %d + x[1] %d) * 100)\n", rank, values[0], oldx[0], values[1], values[2], values[3], oldx[0], oldx[1]); ret = 1; } else { FPRINTF(stderr, "[%d] correct computation\n", rank); } } FPRINTF(stderr, "[%d][end] VALUES: %d %d %d %d\n", rank, x[0], x[1], x[2], y); free(values); starpu_mpi_shutdown(); starpu_shutdown(); return (rank == 0) ? ret : 0; } starpu-1.2.3+dfsg/mpi/tests/insert_task_owner_data.c000066400000000000000000000064231320135501600225770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013, 2014, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "helper.h" void func_cpu(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { int *x0 = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); int *x1 = (int *)STARPU_VARIABLE_GET_PTR(descr[1]); *x0 += 1; *x1 *= *x1; } /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_RW, STARPU_RW}, .model = &dumb_model }; int main(int argc, char **argv) { int rank, size, err; int x[2]; int ret, i; starpu_data_handle_t data_handles[2]; int values[2]; ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(&argc, &argv, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (rank == 0) { x[0] = 11; starpu_variable_data_register(&data_handles[0], STARPU_MAIN_RAM, (uintptr_t)&x[0], sizeof(x[0])); starpu_variable_data_register(&data_handles[1], -1, (uintptr_t)NULL, sizeof(x[1])); } else if (rank == 1) { x[1] = 12; starpu_variable_data_register(&data_handles[0], -1, (uintptr_t)NULL, sizeof(x[0])); starpu_variable_data_register(&data_handles[1], STARPU_MAIN_RAM, (uintptr_t)&x[1], sizeof(x[1])); } else { starpu_variable_data_register(&data_handles[0], -1, (uintptr_t)NULL, sizeof(x[0])); starpu_variable_data_register(&data_handles[1], -1, (uintptr_t)NULL, sizeof(x[1])); } starpu_mpi_data_register(data_handles[0], 0, 0); starpu_mpi_data_register(data_handles[1], 1, 1); err = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet, STARPU_RW, data_handles[0], STARPU_RW, data_handles[1], STARPU_EXECUTE_ON_DATA, data_handles[1], 0); assert(err == 0); starpu_task_wait_for_all(); for(i=0 ; i<2 ; i++) { starpu_mpi_get_data_on_node_detached(MPI_COMM_WORLD, data_handles[i], 0, NULL, NULL); if (rank == 0) { starpu_data_acquire(data_handles[i], STARPU_R); values[i] = *((int *)starpu_data_get_local_ptr(data_handles[i])); starpu_data_release(data_handles[i]); } } ret = 0; if (rank == 0) { FPRINTF(stderr, "[%d][local ptr] VALUES: %d %d\n", rank, values[0], values[1]); if (values[0] != 12 || values[1] != 144) { ret = EXIT_FAILURE; } } starpu_data_unregister(data_handles[0]); starpu_data_unregister(data_handles[1]); starpu_mpi_shutdown(); starpu_shutdown(); return ret; } starpu-1.2.3+dfsg/mpi/tests/insert_task_recv_cache.c000066400000000000000000000106441320135501600225360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include "helper.h" #if !defined(STARPU_HAVE_SETENV) #warning setenv is not defined. Skipping test int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else void func_cpu(STARPU_ATTRIBUTE_UNUSED void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_RW, STARPU_R}, .model = &dumb_model }; #define N 1000 /* Returns the MPI node number where data indexes index is */ int my_distrib(int x) { return x; } void test_cache(int rank, char *enabled, size_t *comm_amount) { int i; int ret; unsigned *v[2]; starpu_data_handle_t data_handles[2]; FPRINTF_MPI(stderr, "Testing with STARPU_MPI_CACHE=%s\n", enabled); setenv("STARPU_MPI_CACHE", enabled, 1); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); for(i = 0; i < 2; i++) { int j; v[i] = calloc(N, sizeof(unsigned)); for(j=0 ; j #include #include #include #include "helper.h" #if !defined(STARPU_HAVE_SETENV) #warning setenv is not defined. Skipping test int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else void func_cpu(STARPU_ATTRIBUTE_UNUSED void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_RW, STARPU_R}, .model = &dumb_model }; #define N 1000 /* Returns the MPI node number where data indexes index is */ int my_distrib(int x) { return x; } void test_cache(int rank, char *enabled, size_t *comm_amount) { int i; int ret; unsigned *v[2]; starpu_data_handle_t data_handles[2]; setenv("STARPU_MPI_CACHE", enabled, 1); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); for(i = 0; i < 2; i++) { int j; v[i] = malloc(N * sizeof(unsigned)); for(j=0 ; j #include #include "helper.h" void func_cpu(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { unsigned *A = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned *X = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[1]); unsigned *Y = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[2]); FPRINTF_MPI(stderr, "VALUES: Y=%3u A=%3u X=%3u\n", *Y, *A, *X); *Y = *Y + *A * *X; } /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 3, .modes = {STARPU_R, STARPU_R, STARPU_RW}, .model = &dumb_model }; #define N 4 int main(int argc, char **argv) { int rank, n; int ret; unsigned A[N]; unsigned X[N]; unsigned Y; starpu_data_handle_t data_A[N]; starpu_data_handle_t data_X[N]; starpu_data_handle_t data_Y; ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(&argc, &argv, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); for(n = 0; n < N; n++) { A[n] = (n+1)*10; X[n] = n+1; } Y = 0; FPRINTF_MPI(stderr, "A = "); for(n = 0; n < N; n++) { FPRINTF(stderr, "%u ", A[n]); } FPRINTF(stderr, "\n"); FPRINTF_MPI(stderr, "X = "); for(n = 0; n < N; n++) { FPRINTF(stderr, "%u ", X[n]); } FPRINTF(stderr, "\n"); for(n = 0; n < N; n++) { if (rank == n%2) starpu_variable_data_register(&data_A[n], STARPU_MAIN_RAM, (uintptr_t)&A[n], sizeof(unsigned)); else starpu_variable_data_register(&data_A[n], -1, (uintptr_t)NULL, sizeof(unsigned)); starpu_mpi_data_register(data_A[n], n+100, n%2); FPRINTF_MPI(stderr, "Registering A[%d] to %p with tag %d and node %d\n", n, data_A[n], n+100, n%2); if (rank == n%2) starpu_variable_data_register(&data_X[n], STARPU_MAIN_RAM, (uintptr_t)&X[n], sizeof(unsigned)); else starpu_variable_data_register(&data_X[n], -1, (uintptr_t)NULL, sizeof(unsigned)); starpu_mpi_data_register(data_X[n], n+200, n%2); FPRINTF_MPI(stderr, "Registering X[%d] to %p with tag %d and node %d\n", n, data_X[n], n+200, n%2); } if (rank == 0) starpu_variable_data_register(&data_Y, STARPU_MAIN_RAM, (uintptr_t)&Y, sizeof(unsigned)); else starpu_variable_data_register(&data_Y, -1, (uintptr_t)NULL, sizeof(unsigned)); starpu_mpi_data_register(data_Y, 10, 0); FPRINTF_MPI(stderr, "Registering Y to %p with tag %d and node %d\n", data_Y, 10, 0); for(n = 0; n < N; n++) { ret = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet, STARPU_R, data_A[n], STARPU_R, data_X[n], STARPU_RW, data_Y, STARPU_EXECUTE_ON_DATA, data_A[n], 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_task_insert"); } FPRINTF(stderr, "Waiting ...\n"); starpu_task_wait_for_all(); for(n = 0; n < N; n++) { starpu_data_unregister(data_A[n]); starpu_data_unregister(data_X[n]); } starpu_data_unregister(data_Y); starpu_mpi_shutdown(); starpu_shutdown(); FPRINTF(stdout, "[%d] Y=%u\n", rank, Y); #ifndef STARPU_SIMGRID if (rank == 0) { STARPU_ASSERT_MSG(Y==300, "Error when calculating Y=%u\n", Y); } #endif return 0; } starpu-1.2.3+dfsg/mpi/tests/matrix2.c000066400000000000000000000100301320135501600174210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "helper.h" void func_cpu(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { unsigned *A = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned *X = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[1]); unsigned *Y = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[2]); FPRINTF_MPI(stderr, "VALUES: Y=%3u A=%3u X=%3u\n", *Y, *A, *X); *Y = *Y + *A * *X; } /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 3, .modes = {STARPU_R, STARPU_R, STARPU_RW}, .model = &dumb_model }; #define N 4 int main(int argc, char **argv) { int rank, size; int n; int ret; unsigned A[N]; unsigned X[N]; starpu_data_handle_t data_A[N]; starpu_data_handle_t data_X[N]; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if ((size < 3) || (starpu_cpu_worker_get_count() == 0)) { if (rank == 0) { if (size < 3) FPRINTF(stderr, "We need at least 3 processes.\n"); else FPRINTF(stderr, "We need at least 1 CPU worker.\n"); } starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return STARPU_TEST_SKIPPED; } for(n = 0; n < N; n++) { A[n] = (n+1)*10; X[n] = n+1; } FPRINTF_MPI(stderr, "A = "); for(n = 0; n < N; n++) { FPRINTF(stderr, "%u ", A[n]); } FPRINTF(stderr, "\n"); FPRINTF_MPI(stderr, "X = "); for(n = 0; n < N; n++) { FPRINTF(stderr, "%u ", X[n]); } FPRINTF(stderr, "\n"); for(n = 0; n < N; n++) { if (rank == n%2) starpu_variable_data_register(&data_A[n], STARPU_MAIN_RAM, (uintptr_t)&A[n], sizeof(unsigned)); else starpu_variable_data_register(&data_A[n], -1, (uintptr_t)NULL, sizeof(unsigned)); starpu_mpi_data_register(data_A[n], n+100, n%2); FPRINTF_MPI(stderr, "Registering A[%d] to %p with tag %d and node %d\n", n,data_A[n], n+100, n%2); } for(n = 0; n < N; n++) { if (rank == 2) starpu_variable_data_register(&data_X[n], STARPU_MAIN_RAM, (uintptr_t)&X[n], sizeof(unsigned)); else starpu_variable_data_register(&data_X[n], -1, (uintptr_t)NULL, sizeof(unsigned)); starpu_mpi_data_register(data_X[n], n+200, 2); FPRINTF_MPI(stderr, "Registering X[%d] to %p with tag %d and node %d\n", n, data_X[n], n+200, 2); } for(n = 0; n < N-1; n++) { ret = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet, STARPU_R, data_A[n], STARPU_R, data_X[n], STARPU_RW, data_X[N-1], STARPU_EXECUTE_ON_DATA, data_A[n], 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_task_insert"); } FPRINTF(stderr, "Waiting ...\n"); starpu_task_wait_for_all(); for(n = 0; n < N; n++) { starpu_data_unregister(data_A[n]); starpu_data_unregister(data_X[n]); } starpu_mpi_shutdown(); starpu_shutdown(); FPRINTF(stdout, "[%d] X[%d]=%u\n", rank, N-1, X[N-1]); #ifndef STARPU_SIMGRID if (rank == 2) { STARPU_ASSERT_MSG(X[N-1]==144, "Error when calculating X[N-1]=%u\n", X[N-1]); } #endif MPI_Finalize(); return 0; } starpu-1.2.3+dfsg/mpi/tests/mpi_detached_tag.c000066400000000000000000000042611320135501600213050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2014-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "helper.h" #ifdef STARPU_QUICK_CHECK # define NITER 16 #elif !defined(STARPU_LONG_CHECK) # define NITER 256 #else # define NITER 2048 #endif #define SIZE 16 float *tab; starpu_data_handle_t tab_handle; int main(int argc, char **argv) { int ret, rank, size; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if (size%2 != 0) { if (rank == 0) FPRINTF(stderr, "We need a even number of processes.\n"); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return STARPU_TEST_SKIPPED; } tab = calloc(SIZE, sizeof(float)); starpu_vector_data_register(&tab_handle, STARPU_MAIN_RAM, (uintptr_t)tab, SIZE, sizeof(float)); int nloops = NITER; int loop; int other_rank = rank%2 == 0 ? rank+1 : rank-1; for (loop = 0; loop < nloops; loop++) { starpu_tag_t tag = (starpu_tag_t)loop; if ((loop % 2) == (rank%2)) { starpu_mpi_isend_detached_unlock_tag(tab_handle, other_rank, loop, MPI_COMM_WORLD, tag); } else { starpu_mpi_irecv_detached_unlock_tag(tab_handle, other_rank, loop, MPI_COMM_WORLD, tag); } starpu_tag_wait(tag); } starpu_data_unregister(tab_handle); free(tab); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return 0; } starpu-1.2.3+dfsg/mpi/tests/mpi_earlyrecv.c000066400000000000000000000076571320135501600207210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "helper.h" #include int main(int argc, char **argv) { int ret, rank, size, i; starpu_data_handle_t tab_handle[4]; int values[4]; starpu_mpi_req request[2] = {NULL, NULL}; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if (size%2 != 0) { FPRINTF_MPI(stderr, "We need a even number of processes.\n"); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return STARPU_TEST_SKIPPED; } for(i=0 ; i<4 ; i++) { if (i<3 || rank%2) { // all data are registered on all nodes, but the 4th data which is not registered on the receiving node values[i] = (rank+1) * (i+1); starpu_variable_data_register(&tab_handle[i], STARPU_MAIN_RAM, (uintptr_t)&values[i], sizeof(values[i])); starpu_mpi_data_register(tab_handle[i], i, rank); } } int other_rank = rank%2 == 0 ? rank+1 : rank-1; FPRINTF_MPI(stderr, "rank %d exchanging with rank %d\n", rank, other_rank); if (rank%2) { FPRINTF_MPI(stderr, "Sending values %d and %d to node %d\n", values[0], values[3], other_rank); // this data will be received as an early registered data starpu_mpi_isend(tab_handle[0], &request[0], other_rank, 0, MPI_COMM_WORLD); // this data will be received as an early UNregistered data starpu_mpi_isend(tab_handle[3], &request[1], other_rank, 3, MPI_COMM_WORLD); starpu_mpi_send(tab_handle[1], other_rank, 1, MPI_COMM_WORLD); starpu_mpi_recv(tab_handle[2], other_rank, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE); } else { starpu_mpi_recv(tab_handle[1], other_rank, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE); starpu_mpi_send(tab_handle[2], other_rank, 2, MPI_COMM_WORLD); // we register the data starpu_variable_data_register(&tab_handle[3], -1, (uintptr_t)NULL, sizeof(int)); starpu_mpi_data_register(tab_handle[3], 3, rank); starpu_mpi_irecv(tab_handle[3], &request[1], other_rank, 3, MPI_COMM_WORLD); starpu_mpi_irecv(tab_handle[0], &request[0], other_rank, 0, MPI_COMM_WORLD); } int finished=0; while (!finished) { for(i=0 ; i<2 ; i++) { if (request[i]) { int flag; MPI_Status status; starpu_mpi_test(&request[i], &flag, &status); if (flag) FPRINTF_MPI(stderr, "request[%d] = %d %p\n", i, flag, request[i]); } } finished = request[0] == NULL && request[1] == NULL; } if (rank%2 == 0) { void *ptr0; void *ptr3; starpu_data_acquire(tab_handle[0], STARPU_RW); ptr0 = starpu_data_get_local_ptr(tab_handle[0]); starpu_data_release(tab_handle[0]); starpu_data_acquire(tab_handle[3], STARPU_RW); ptr3 = starpu_data_get_local_ptr(tab_handle[3]); starpu_data_release(tab_handle[3]); ret = (*((int *)ptr0) == (other_rank+1)*1) && (*((int *)ptr3) == (other_rank+1)*4); ret = !ret; FPRINTF_MPI(stderr, "[%s] Received values %d and %d from node %d\n", ret?"FAILURE":"SUCCESS", *((int *)ptr0), *((int *)ptr3), other_rank); } for(i=0 ; i<4 ; i++) starpu_data_unregister(tab_handle[i]); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return ret; } starpu-1.2.3+dfsg/mpi/tests/mpi_earlyrecv2.c000066400000000000000000000146251320135501600207740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "helper.h" #include #include #define NB 10 static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static starpu_pthread_cond_t cond = STARPU_PTHREAD_COND_INITIALIZER; void callback(void *arg) { unsigned *received = arg; STARPU_PTHREAD_MUTEX_LOCK(&mutex); *received = *received + 1; FPRINTF_MPI(stderr, "Requests %u received\n", *received); STARPU_PTHREAD_COND_SIGNAL(&cond); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } typedef void (*check_func)(starpu_data_handle_t handle, int i, int rank, int *error); int exchange(int rank, starpu_data_handle_t *handles, check_func func, int detached) { int other_rank = rank%2 == 0 ? rank+1 : rank-1; int i; if (rank%2) { starpu_mpi_send(handles[0], other_rank, 0, MPI_COMM_WORLD); starpu_mpi_send(handles[NB-1], other_rank, NB-1, MPI_COMM_WORLD); for(i=1 ; i #include "helper.h" #include #include #define NB 6 typedef void (*check_func)(starpu_data_handle_t handle, int i, int rank, int *error); int exchange(int rank, starpu_data_handle_t *handles, check_func func) { int other_rank = rank%2 == 0 ? rank+1 : rank-1; int i; int ret=0; starpu_mpi_req req[NB]; memset(req, 0, NB*sizeof(starpu_mpi_req)); if (rank%2) { starpu_mpi_issend(handles[0], &req[0], other_rank, 0, MPI_COMM_WORLD); starpu_mpi_isend(handles[NB-1], &req[NB-1], other_rank, NB-1, MPI_COMM_WORLD); starpu_mpi_issend(handles[NB-2], &req[NB-2], other_rank, NB-2, MPI_COMM_WORLD); for(i=1 ; i #include "helper.h" #ifdef STARPU_QUICK_CHECK # define NITER 16 #else # define NITER 2048 #endif #define SIZE 16 float *tab; starpu_data_handle_t tab_handle; int main(int argc, char **argv) { int ret, rank, size; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if (size%2 != 0) { if (rank == 0) FPRINTF(stderr, "We need a even number of processes.\n"); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return STARPU_TEST_SKIPPED; } tab = calloc(SIZE, sizeof(float)); starpu_vector_data_register(&tab_handle, STARPU_MAIN_RAM, (uintptr_t)tab, SIZE, sizeof(float)); int nloops = NITER; int loop; int other_rank = rank%2 == 0 ? rank+1 : rank-1; for (loop = 0; loop < nloops; loop++) { if ((loop % 2) == (rank%2)) { starpu_mpi_send(tab_handle, other_rank, loop, MPI_COMM_WORLD); } else { MPI_Status status; starpu_mpi_req req; starpu_mpi_irecv(tab_handle, &req, other_rank, loop, MPI_COMM_WORLD); starpu_mpi_wait(&req, &status); } } starpu_data_unregister(tab_handle); free(tab); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return 0; } starpu-1.2.3+dfsg/mpi/tests/mpi_irecv_detached.c000066400000000000000000000051771320135501600216510ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012, 2014-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "helper.h" #ifdef STARPU_QUICK_CHECK # define NITER 16 #elif !defined(STARPU_LONG_CHECK) # define NITER 256 #else # define NITER 2048 #endif #define SIZE 16 float *tab; starpu_data_handle_t tab_handle; static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static starpu_pthread_cond_t cond = STARPU_PTHREAD_COND_INITIALIZER; void callback(void *arg STARPU_ATTRIBUTE_UNUSED) { unsigned *received = arg; STARPU_PTHREAD_MUTEX_LOCK(&mutex); *received = 1; STARPU_PTHREAD_COND_SIGNAL(&cond); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } int main(int argc, char **argv) { int ret, rank, size; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if (size%2 != 0) { if (rank == 0) FPRINTF(stderr, "We need a even number of processes.\n"); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return STARPU_TEST_SKIPPED; } tab = calloc(SIZE, sizeof(float)); starpu_vector_data_register(&tab_handle, STARPU_MAIN_RAM, (uintptr_t)tab, SIZE, sizeof(float)); int nloops = NITER; int loop; int other_rank = rank%2 == 0 ? rank+1 : rank-1; for (loop = 0; loop < nloops; loop++) { if ((loop % 2) == (rank%2)) { starpu_mpi_send(tab_handle, other_rank, loop, MPI_COMM_WORLD); } else { int received = 0; starpu_mpi_irecv_detached(tab_handle, other_rank, loop, MPI_COMM_WORLD, callback, &received); STARPU_PTHREAD_MUTEX_LOCK(&mutex); while (!received) STARPU_PTHREAD_COND_WAIT(&cond, &mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } } starpu_data_unregister(tab_handle); free(tab); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return 0; } starpu-1.2.3+dfsg/mpi/tests/mpi_isend.c000066400000000000000000000042001320135501600200040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "helper.h" #ifdef STARPU_QUICK_CHECK # define NITER 16 #else # define NITER 2048 #endif #define SIZE 16 float *tab; starpu_data_handle_t tab_handle; int main(int argc, char **argv) { int ret, rank, size; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if (size%2 != 0) { if (rank == 0) FPRINTF(stderr, "We need a even number of processes.\n"); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return STARPU_TEST_SKIPPED; } tab = calloc(SIZE, sizeof(float)); starpu_vector_data_register(&tab_handle, STARPU_MAIN_RAM, (uintptr_t)tab, SIZE, sizeof(float)); int nloops = NITER; int loop; int other_rank = rank%2 == 0 ? rank+1 : rank-1; for (loop = 0; loop < nloops; loop++) { if ((loop % 2) == (rank%2)) { MPI_Status status; starpu_mpi_req req; starpu_mpi_isend(tab_handle, &req, other_rank, loop, MPI_COMM_WORLD); starpu_mpi_wait(&req, &status); } else { MPI_Status status; starpu_mpi_recv(tab_handle, other_rank, loop, MPI_COMM_WORLD, &status); } } starpu_data_unregister(tab_handle); free(tab); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return 0; } starpu-1.2.3+dfsg/mpi/tests/mpi_isend_detached.c000066400000000000000000000054431320135501600216370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012, 2014-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "helper.h" #ifdef STARPU_QUICK_CHECK # define NITER 16 #elif !defined(STARPU_LONG_CHECK) # define NITER 256 #else # define NITER 2048 #endif #define SIZE 16 static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static starpu_pthread_cond_t cond = STARPU_PTHREAD_COND_INITIALIZER; void callback(void *arg) { unsigned *completed = arg; STARPU_PTHREAD_MUTEX_LOCK(&mutex); *completed = 1; STARPU_PTHREAD_COND_SIGNAL(&cond); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } int main(int argc, char **argv) { int ret, rank, size; float *tab; starpu_data_handle_t tab_handle; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if (size%2 != 0) { if (rank == 0) FPRINTF(stderr, "We need a even number of processes.\n"); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return STARPU_TEST_SKIPPED; } tab = calloc(SIZE, sizeof(float)); starpu_vector_data_register(&tab_handle, STARPU_MAIN_RAM, (uintptr_t)tab, SIZE, sizeof(float)); int nloops = NITER; int loop; int other_rank = rank%2 == 0 ? rank+1 : rank-1; for (loop = 0; loop < nloops; loop++) { if ((loop % 2) == (rank%2)) { int sent = 0; starpu_mpi_isend_detached(tab_handle, other_rank, loop, MPI_COMM_WORLD, callback, &sent); STARPU_PTHREAD_MUTEX_LOCK(&mutex); while (!sent) STARPU_PTHREAD_COND_WAIT(&cond, &mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } else { int received = 0; starpu_mpi_irecv_detached(tab_handle, other_rank, loop, MPI_COMM_WORLD, callback, &received); STARPU_PTHREAD_MUTEX_LOCK(&mutex); while (!received) STARPU_PTHREAD_COND_WAIT(&cond, &mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } } starpu_data_unregister(tab_handle); free(tab); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return 0; } starpu-1.2.3+dfsg/mpi/tests/mpi_reduction.c000066400000000000000000000120321320135501600207000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013, 2015 Université de Bordeaux * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "helper.h" extern void init_cpu_func(void *descr[], void *cl_arg); extern void redux_cpu_func(void *descr[], void *cl_arg); extern void dot_cpu_func(void *descr[], void *cl_arg); extern void display_cpu_func(void *descr[], void *cl_arg); #ifdef STARPU_SIMGRID /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; #endif static struct starpu_codelet init_codelet = { .cpu_funcs = {init_cpu_func}, .nbuffers = 1, .modes = {STARPU_W}, #ifdef STARPU_SIMGRID .model = &dumb_model, #endif .name = "init_codelet" }; static struct starpu_codelet redux_codelet = { .cpu_funcs = {redux_cpu_func}, .modes = {STARPU_RW, STARPU_R}, .nbuffers = 2, #ifdef STARPU_SIMGRID .model = &dumb_model, #endif .name = "redux_codelet" }; static struct starpu_codelet dot_codelet = { .cpu_funcs = {dot_cpu_func}, .nbuffers = 2, .modes = {STARPU_R, STARPU_REDUX}, #ifdef STARPU_SIMGRID .model = &dumb_model, #endif .name = "dot_codelet" }; static struct starpu_codelet display_codelet = { .cpu_funcs = {display_cpu_func}, .nbuffers = 1, .modes = {STARPU_R}, #ifdef STARPU_SIMGRID .model = &dumb_model, #endif .name = "display_codelet" }; /* Returns the MPI node number where data indexes index is */ int my_distrib(int x, int nb_nodes) { return x % nb_nodes; } int main(int argc, char **argv) { int my_rank, size, x, y, i; long int *vector; long int dot, sum=0; starpu_data_handle_t *handles; starpu_data_handle_t dot_handle; int nb_elements, step, loops; STARPU_SKIP_IF_VALGRIND_RETURN_SKIP; /* Not supported yet */ if (starpu_get_env_number_default("STARPU_GLOBAL_ARBITER", 0) > 0) return STARPU_TEST_SKIPPED; int ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(&argc, &argv, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &my_rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); nb_elements = size*8000; step = 4; loops = 5; vector = (long int *) malloc(nb_elements*sizeof(vector[0])); for(x = 0; x < nb_elements; x+=step) { int mpi_rank = my_distrib(x/step, size); if (mpi_rank == my_rank) { for(y=0 ; y #include #include "helper.h" /* * Codelet to create a neutral element */ void init_cpu_func(void *descr[], void *cl_arg) { long int *dot = (long int *)STARPU_VARIABLE_GET_PTR(descr[0]); *dot = 0; FPRINTF_MPI(stderr, "Init dot\n"); } /* * Codelet to perform the reduction of two elements */ void redux_cpu_func(void *descr[], void *cl_arg) { long int *dota = (long int *)STARPU_VARIABLE_GET_PTR(descr[0]); long int *dotb = (long int *)STARPU_VARIABLE_GET_PTR(descr[1]); *dota = *dota + *dotb; FPRINTF_MPI(stderr, "Calling redux %ld=%ld+%ld\n", *dota, *dota-*dotb, *dotb); } /* * Dot product codelet */ void dot_cpu_func(void *descr[], void *cl_arg) { long int *local_x = (long int *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned n = STARPU_VECTOR_GET_NX(descr[0]); long int *dot = (long int *)STARPU_VARIABLE_GET_PTR(descr[1]); //FPRINTF_MPI(stderr, "Before dot=%ld (adding %d elements...)\n", *dot, n); unsigned i; for (i = 0; i < n; i++) { //FPRINTF_MPI(stderr, "Adding %ld\n", local_x[i]); *dot += local_x[i]; } //FPRINTF_MPI(stderr, "After dot=%ld\n", *dot); } /* * Display codelet */ void display_cpu_func(void *descr[], void *cl_arg) { long int *local_x = (long int *)STARPU_VARIABLE_GET_PTR(descr[0]); FPRINTF_MPI(stderr, "Local=%ld\n", *local_x); } starpu-1.2.3+dfsg/mpi/tests/mpi_redux.c000066400000000000000000000061001320135501600200320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "helper.h" static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static starpu_pthread_cond_t cond = STARPU_PTHREAD_COND_INITIALIZER; void callback(void *arg) { unsigned *received = arg; STARPU_PTHREAD_MUTEX_LOCK(&mutex); *received = *received + 1; FPRINTF_MPI(stderr, "received = %u\n", *received); STARPU_PTHREAD_COND_SIGNAL(&cond); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } int main(int argc, char **argv) { int ret, rank, size, sum; int value=0; starpu_data_handle_t *handles; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); sum = ((size-1) * (size) / 2); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if (rank == 0) { int src; int received = 1; handles = malloc(size * sizeof(starpu_data_handle_t)); for(src=1 ; src #include "helper.h" /* Returns the MPI node number where data indexes index is */ int my_distrib(int x, int nb_nodes) { return x % nb_nodes; } void cpu_codelet(void *descr[], void *_args) { int *vector = (int *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned nx = STARPU_VECTOR_GET_NX(descr[0]); unsigned i; int rank; starpu_codelet_unpack_args(_args, &rank); for (i = 0; i < nx; i++) { //fprintf(stderr,"rank %d v[%d] = %d\n", rank, i, vector[i]); vector[i] *= rank+2; } } #ifdef STARPU_SIMGRID /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; #endif static struct starpu_codelet cl = { .cpu_funcs = {cpu_codelet}, .nbuffers = 1, .modes = {STARPU_RW}, #ifdef STARPU_SIMGRID .model = &dumb_model, #endif }; void scallback(void *arg STARPU_ATTRIBUTE_UNUSED) { char *msg = arg; FPRINTF_MPI(stderr, "Sending completed for <%s>\n", msg); } void rcallback(void *arg STARPU_ATTRIBUTE_UNUSED) { char *msg = arg; FPRINTF_MPI(stderr, "Reception completed for <%s>\n", msg); } int main(int argc, char **argv) { int rank, nodes, ret, x; int *vector = NULL; starpu_data_handle_t *data_handles; int size=10; ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(&argc, &argv, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &nodes); if (rank == 0) { /* Allocate the vector */ vector = malloc(size * sizeof(int)); for(x=0 ; x #include "helper.h" #ifdef STARPU_QUICK_CHECK # define NITER 16 #else # define NITER 2048 #endif #define SIZE 16 int main(int argc, char **argv) { int ret, rank, size; float *tab; starpu_data_handle_t tab_handle; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if (size%2 != 0) { if (rank == 0) FPRINTF(stderr, "We need a even number of processes.\n"); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return STARPU_TEST_SKIPPED; } tab = calloc(SIZE, sizeof(float)); starpu_vector_data_register(&tab_handle, STARPU_MAIN_RAM, (uintptr_t)tab, SIZE, sizeof(float)); int nloops = NITER; int loop; int other_rank = rank%2 == 0 ? rank+1 : rank-1; for (loop = 0; loop < nloops; loop++) { starpu_mpi_req req; if ((loop % 2) == (rank%2)) { starpu_mpi_isend(tab_handle, &req, other_rank, loop, MPI_COMM_WORLD); } else { starpu_mpi_irecv(tab_handle, &req, other_rank, loop, MPI_COMM_WORLD); } int finished = 0; do { MPI_Status status; starpu_mpi_test(&req, &finished, &status); } while (!finished); } starpu_data_unregister(tab_handle); free(tab); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return 0; } starpu-1.2.3+dfsg/mpi/tests/multiple_send.c000066400000000000000000000053421320135501600207110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "helper.h" int main(int argc, char **argv) { int ret, rank, size; unsigned send[2] = {42, 11}; unsigned recv[2] = {33, 33}; starpu_mpi_req req[2]; starpu_data_handle_t send_handle[2]; starpu_data_handle_t recv_handle[2]; ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(&argc, &argv, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (size < 2) { if (rank == 0) FPRINTF(stderr, "We need at least 2 processes.\n"); starpu_mpi_shutdown(); starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu_variable_data_register(&send_handle[0], STARPU_MAIN_RAM, (uintptr_t)&send[0], sizeof(unsigned)); starpu_variable_data_register(&send_handle[1], STARPU_MAIN_RAM, (uintptr_t)&send[1], sizeof(unsigned)); starpu_variable_data_register(&recv_handle[0], STARPU_MAIN_RAM, (uintptr_t)&recv[0], sizeof(unsigned)); starpu_variable_data_register(&recv_handle[1], STARPU_MAIN_RAM, (uintptr_t)&recv[1], sizeof(unsigned)); if (rank == 0) { starpu_mpi_isend(send_handle[0], &(req[0]), 1, 12, MPI_COMM_WORLD); starpu_mpi_isend(send_handle[1], &(req[1]), 1, 13, MPI_COMM_WORLD); } else if (rank == 1) { starpu_mpi_irecv(recv_handle[0], &(req[0]), 0, 12, MPI_COMM_WORLD); starpu_mpi_irecv(recv_handle[1], &(req[1]), 0, 13, MPI_COMM_WORLD); } if (rank == 0 || rank == 1) { int nb_req=2; while (nb_req) { int r=0; for(r=0 ; r<2 ; r++) { if (req[r]) { int finished = 0; MPI_Status status; starpu_mpi_test(&req[r], &finished, &status); STARPU_ASSERT(finished != -1); if (finished) { FPRINTF(stderr, "[%d] Request %d finished\n", rank, r); req[r] = NULL; nb_req--; } } } } } FPRINTF(stderr, "[%d] All requests finished\n", rank); starpu_data_unregister(send_handle[0]); starpu_data_unregister(send_handle[1]); starpu_data_unregister(recv_handle[0]); starpu_data_unregister(recv_handle[1]); starpu_mpi_shutdown(); starpu_shutdown(); return 0; } starpu-1.2.3+dfsg/mpi/tests/pingpong.c000066400000000000000000000042451320135501600176670ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "helper.h" #ifdef STARPU_QUICK_CHECK # define NITER 16 #else # define NITER 2048 #endif #define SIZE 16 float *tab; starpu_data_handle_t tab_handle; int main(int argc, char **argv) { int ret, rank, size; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if (size%2 != 0) { if (rank == 0) FPRINTF(stderr, "We need a even number of processes.\n"); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return STARPU_TEST_SKIPPED; } tab = calloc(SIZE, sizeof(float)); starpu_vector_data_register(&tab_handle, STARPU_MAIN_RAM, (uintptr_t)tab, SIZE, sizeof(float)); int nloops = NITER; int loop; int other_rank = rank%2 == 0 ? rank+1 : rank-1; for (loop = 0; loop < nloops; loop++) { if ((loop % 2) == (rank%2)) { //FPRINTF_MPI(stderr, "Sending to %d\n", other_rank); starpu_mpi_send(tab_handle, other_rank, loop, MPI_COMM_WORLD); } else { MPI_Status status; //FPRINTF_MPI(stderr, "Receiving from %d\n", other_rank); starpu_mpi_recv(tab_handle, other_rank, loop, MPI_COMM_WORLD, &status); } } starpu_data_unregister(tab_handle); free(tab); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return 0; } starpu-1.2.3+dfsg/mpi/tests/policy_register.c000066400000000000000000000076431320135501600212560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "helper.h" void func_cpu(void *descr[], void *_args) { (void)descr; (void)_args; } /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_W, STARPU_W}, .model = &dumb_model }; int starpu_mpi_select_node_my_policy_0(int me, int nb_nodes, struct starpu_data_descr *descr, int nb_data) { (void) me; (void) nb_nodes; (void) nb_data; starpu_data_handle_t data = descr[0].handle; return starpu_data_get_rank(data); } int starpu_mpi_select_node_my_policy_1(int me, int nb_nodes, struct starpu_data_descr *descr, int nb_data) { (void) me; (void) nb_nodes; (void) nb_data; starpu_data_handle_t data = descr[1].handle; return starpu_data_get_rank(data); } int main(int argc, char **argv) { int ret; int rank, size; int policy; struct starpu_task *task; starpu_data_handle_t handles[2]; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if (size < 2) { if (rank == 0) FPRINTF(stderr, "We need at least 2 processes.\n"); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return STARPU_TEST_SKIPPED; } if (rank == 0) starpu_variable_data_register(&handles[0], STARPU_MAIN_RAM, (uintptr_t)&policy, sizeof(int)); else starpu_variable_data_register(&handles[0], -1, (uintptr_t)NULL, sizeof(int)); starpu_mpi_data_register(handles[0], 10, 0); if (rank == 1) starpu_variable_data_register(&handles[1], STARPU_MAIN_RAM, (uintptr_t)&policy, sizeof(int)); else starpu_variable_data_register(&handles[1], -1, (uintptr_t)NULL, sizeof(int)); starpu_mpi_data_register(handles[1], 20, 1); policy = starpu_mpi_node_selection_register_policy(starpu_mpi_select_node_my_policy_1); starpu_mpi_node_selection_set_current_policy(policy); task = starpu_mpi_task_build(MPI_COMM_WORLD, &mycodelet, STARPU_W, handles[0], STARPU_W, handles[1], 0); FPRINTF_MPI(stderr, "Task %p\n", task); if (rank == 1) { STARPU_ASSERT_MSG(task, "Task should be executed by rank 1\n"); task->destroy = 0; starpu_task_destroy(task); } else { STARPU_ASSERT_MSG(task == NULL, "Task should be executed by rank 1\n"); } policy = starpu_mpi_node_selection_register_policy(starpu_mpi_select_node_my_policy_0); task = starpu_mpi_task_build(MPI_COMM_WORLD, &mycodelet, STARPU_W, handles[0], STARPU_W, handles[1], STARPU_NODE_SELECTION_POLICY, policy, 0); FPRINTF_MPI(stderr, "Task %p\n", task); if (rank == 0) { STARPU_ASSERT_MSG(task, "Task should be executed by rank 0\n"); task->destroy = 0; starpu_task_destroy(task); } else { STARPU_ASSERT_MSG(task == NULL, "Task should be executed by rank 0\n"); } starpu_data_unregister(handles[0]); starpu_data_unregister(handles[1]); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return 0; } starpu-1.2.3+dfsg/mpi/tests/policy_register_many.c000066400000000000000000000032161320135501600222720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "helper.h" int starpu_mpi_select_node_my_policy(int me, int nb_nodes, struct starpu_data_descr *descr, int nb_data) { (void) me; (void) nb_nodes; (void) descr; (void) nb_data; return 0; } int main(int argc, char **argv) { int ret; int i, policy; ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(&argc, &argv, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); for(i=0 ; i<_STARPU_MPI_NODE_SELECTION_MAX_POLICY-1 ; i++) { policy = starpu_mpi_node_selection_register_policy(starpu_mpi_select_node_my_policy); FPRINTF_MPI(stderr, "New policy %d\n", policy); } starpu_mpi_node_selection_unregister_policy(_STARPU_MPI_NODE_SELECTION_MAX_POLICY-2); policy = starpu_mpi_node_selection_register_policy(starpu_mpi_select_node_my_policy); FPRINTF_MPI(stderr, "New policy %d\n", policy); STARPU_ASSERT(policy==_STARPU_MPI_NODE_SELECTION_MAX_POLICY-2); starpu_mpi_shutdown(); starpu_shutdown(); return 0; } starpu-1.2.3+dfsg/mpi/tests/policy_register_toomany.c000066400000000000000000000026771320135501600230260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "helper.h" int starpu_mpi_select_node_my_policy(int me, int nb_nodes, struct starpu_data_descr *descr, int nb_data) { (void) me; (void) nb_nodes; (void) descr; (void) nb_data; return 0; } int main(int argc, char **argv) { int ret; int i; if (RUNNING_ON_VALGRIND) return STARPU_TEST_SKIPPED; disable_coredump(); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(&argc, &argv, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); for(i=0 ; i<_STARPU_MPI_NODE_SELECTION_MAX_POLICY+1 ; i++) { int policy = starpu_mpi_node_selection_register_policy(starpu_mpi_select_node_my_policy); FPRINTF_MPI(stderr, "New policy %d\n", policy); } starpu_mpi_shutdown(); starpu_shutdown(); return 0; } starpu-1.2.3+dfsg/mpi/tests/policy_selection.c000066400000000000000000000112441320135501600214070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "helper.h" void func_cpu(void *descr[], void *_args) { (void)descr; (void)_args; } /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; struct starpu_codelet mycodelet_2 = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_W, STARPU_W}, .model = &dumb_model }; struct starpu_codelet mycodelet_3 = { .cpu_funcs = {func_cpu}, .nbuffers = 3, .modes = {STARPU_R, STARPU_W, STARPU_W}, .model = &dumb_model }; int main(int argc, char **argv) { int ret; int rank, size; int policy = 12; struct starpu_task *task; starpu_data_handle_t handles[3]; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if (size < 3) { if (rank == 0) FPRINTF(stderr, "We need at least 3 processes.\n"); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return STARPU_TEST_SKIPPED; } if (rank == 0) { starpu_variable_data_register(&handles[0], STARPU_MAIN_RAM, (uintptr_t)&policy, sizeof(int)); } else { starpu_variable_data_register(&handles[0], -1, (uintptr_t)NULL, sizeof(int)); } starpu_mpi_data_register(handles[0], 10, 0); if (rank == 1) { starpu_variable_data_register(&handles[1], STARPU_MAIN_RAM, (uintptr_t)&policy, sizeof(int)); } else { starpu_variable_data_register(&handles[1], -1, (uintptr_t)NULL, sizeof(int)); } starpu_mpi_data_register(handles[1], 20, 1); if (rank == 2) { starpu_variable_data_register(&handles[2], STARPU_MAIN_RAM, (uintptr_t)&policy, sizeof(int)); } else { starpu_variable_data_register(&handles[2], -1, (uintptr_t)NULL, sizeof(int)); } starpu_mpi_data_register(handles[2], 30, 2); // Force the execution on node 1 task = starpu_mpi_task_build(MPI_COMM_WORLD, &mycodelet_3, STARPU_R, handles[2], STARPU_W, handles[0], STARPU_W, handles[1], STARPU_EXECUTE_ON_NODE, 1, 0); FPRINTF_MPI(stderr, "Task %p\n", task); if (rank == 1) { STARPU_ASSERT_MSG(task, "Task should be executed by rank 1\n"); task->destroy = 0; starpu_task_destroy(task); } else { STARPU_ASSERT_MSG(task == NULL, "Task should be executed by rank 1\n"); } // Force the execution on node 1 task = starpu_mpi_task_build(MPI_COMM_WORLD, &mycodelet_2, STARPU_W, handles[0], STARPU_W, handles[1], STARPU_EXECUTE_ON_NODE, 1, 0); FPRINTF_MPI(stderr, "Task %p\n", task); if (rank == 1) { STARPU_ASSERT_MSG(task, "Task should be executed by rank 1\n"); task->destroy = 0; starpu_task_destroy(task); } else { STARPU_ASSERT_MSG(task == NULL, "Task should be executed by rank 1\n"); } // Let StarPU choose the node task = starpu_mpi_task_build(MPI_COMM_WORLD, &mycodelet_3, STARPU_R, handles[2], STARPU_W, handles[0], STARPU_W, handles[1], 0); FPRINTF_MPI(stderr, "Task %p\n", task); if (rank == 2) { STARPU_ASSERT_MSG(task, "Task should be executed by rank 2\n"); task->destroy = 0; starpu_task_destroy(task); } else { STARPU_ASSERT_MSG(task == NULL, "Task should be executed by rank 2\n"); } // Let StarPU choose the node task = starpu_mpi_task_build(MPI_COMM_WORLD, &mycodelet_2, STARPU_W, handles[0], STARPU_W, handles[1], 0); FPRINTF_MPI(stderr, "Task %p\n", task); if (rank == 0) { STARPU_ASSERT_MSG(task, "Task should be executed by rank 0\n"); task->destroy = 0; starpu_task_destroy(task); } else { STARPU_ASSERT_MSG(task == NULL, "Task should be executed by rank 0\n"); } starpu_data_unregister(handles[0]); starpu_data_unregister(handles[1]); starpu_data_unregister(handles[2]); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return 0; } starpu-1.2.3+dfsg/mpi/tests/policy_selection2.c000066400000000000000000000101001320135501600214570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "helper.h" void func_cpu(void *descr[], void *_args) { (void)_args; int *data0 = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); int *data1 = (int *)STARPU_VARIABLE_GET_PTR(descr[1]); int *data2 = (int *)STARPU_VARIABLE_GET_PTR(descr[2]); *data1 += *data0; *data2 += *data0; } /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 3, .modes = {STARPU_R, STARPU_W, STARPU_W}, .model = &dumb_model }; int main(int argc, char **argv) { int ret; int i; int rank, size; int data[3]; starpu_data_handle_t handles[3]; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if ((size < 3) || (starpu_cpu_worker_get_count() == 0)) { if (rank == 0) { if (size < 3) FPRINTF(stderr, "We need at least 3 processes.\n"); else FPRINTF(stderr, "We need at least 1 CPU worker.\n"); } starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return STARPU_TEST_SKIPPED; } data[0] = 12; starpu_variable_data_register(&handles[0], STARPU_MAIN_RAM, (uintptr_t)&data[0], sizeof(int)); starpu_mpi_data_register(handles[0], 10, 0); data[1] = 12; starpu_variable_data_register(&handles[1], STARPU_MAIN_RAM, (uintptr_t)&data[1], sizeof(int)); starpu_mpi_data_register(handles[1], 20, 1); data[2] = 12; starpu_variable_data_register(&handles[2], STARPU_MAIN_RAM, (uintptr_t)&data[2], sizeof(int)); starpu_mpi_data_register(handles[2], 30, 2); starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet, STARPU_R, handles[2], STARPU_W, handles[0], STARPU_W, handles[1], 0); for(i=0 ; i<2 ; i++) starpu_data_acquire(handles[i], STARPU_R); FPRINTF_MPI(stderr, "data[%d,%d,%d] = %d,%d,%d\n", 0, 1, 2, data[0], data[1], data[2]); for(i=0 ; i<2 ; i++) starpu_data_release(handles[i]); if (rank == 2) { STARPU_ASSERT_MSG(data[0] == 2*data[2] && data[1] == 2*data[2], "Computation incorrect. data[%d] (%d) != 2*data[%d] (%d) && data[%d] (%d) != 2*data[%d] (%d)\n", 0, data[0], 2, data[2], 1, data[1], 2, data[2]); } for(i=0 ; i<2 ; i++) starpu_data_acquire(handles[i], STARPU_W); for(i=0 ; i<2 ; i++) data[i] = 12; for(i=0 ; i<2 ; i++) starpu_data_release(handles[i]); // Let StarPU choose the node starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet, STARPU_R, handles[2], STARPU_W, handles[0], STARPU_W, handles[1], STARPU_EXECUTE_ON_NODE, 1, 0); for(i=0 ; i<2 ; i++) starpu_data_acquire(handles[i], STARPU_R); FPRINTF_MPI(stderr, "data[%d,%d,%d] = %d,%d,%d\n", 0, 1, 2, data[0], data[1], data[2]); for(i=0 ; i<2 ; i++) starpu_data_release(handles[i]); if (rank == 1) { STARPU_ASSERT_MSG(data[0] == 2*data[2] && data[1] == 2*data[2], "Computation incorrect. data[%d] (%d) != 2*data[%d] (%d) && data[%d] (%d) != 2*data[%d] (%d)\n", 0, data[0], 2, data[2], 1, data[1], 2, data[2]); } for(i=0 ; i<3 ; i++) starpu_data_unregister(handles[i]); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return 0; } starpu-1.2.3+dfsg/mpi/tests/policy_unregister.c000066400000000000000000000021331320135501600216060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "helper.h" int main(int argc, char **argv) { int ret; if (RUNNING_ON_VALGRIND) return STARPU_TEST_SKIPPED; disable_coredump(); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(&argc, &argv, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); starpu_mpi_node_selection_unregister_policy(STARPU_MPI_NODE_SELECTION_MOST_R_DATA); starpu_mpi_shutdown(); starpu_shutdown(); return 0; } starpu-1.2.3+dfsg/mpi/tests/ring.c000066400000000000000000000067371320135501600170150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "helper.h" #ifdef STARPU_QUICK_CHECK # define NITER 32 #elif !defined(STARPU_LONG_CHECK) # define NITER 256 #else # define NITER 2048 #endif int token = 42; starpu_data_handle_t token_handle; #ifdef STARPU_USE_CUDA extern void increment_cuda(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); #endif void increment_cpu(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { int *tokenptr = (int *)STARPU_VECTOR_GET_PTR(descr[0]); (*tokenptr)++; } /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; static struct starpu_codelet increment_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {increment_cuda}, #endif .cpu_funcs = {increment_cpu}, .nbuffers = 1, .modes = {STARPU_RW}, .model = &dumb_model }; void increment_token(void) { struct starpu_task *task = starpu_task_create(); task->cl = &increment_cl; task->handles[0] = token_handle; task->synchronous = 1; int ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } int main(int argc, char **argv) { int ret, rank, size; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if (size < 2) { if (rank == 0) FPRINTF(stderr, "We need at least 2 processes.\n"); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return STARPU_TEST_SKIPPED; } starpu_vector_data_register(&token_handle, STARPU_MAIN_RAM, (uintptr_t)&token, 1, sizeof(token)); int nloops = NITER; int loop; int last_loop = nloops - 1; int last_rank = size - 1; for (loop = 0; loop < nloops; loop++) { int tag = loop*size + rank; if (loop == 0 && rank == 0) { token = 0; FPRINTF(stdout, "Start with token value %d\n", token); } else { MPI_Status status; starpu_mpi_recv(token_handle, (rank+size-1)%size, tag, MPI_COMM_WORLD, &status); } increment_token(); if (loop == last_loop && rank == last_rank) { starpu_data_acquire(token_handle, STARPU_R); FPRINTF(stdout, "Finished : token value %d\n", token); starpu_data_release(token_handle); } else { starpu_mpi_send(token_handle, (rank+1)%size, tag+1, MPI_COMM_WORLD); } } starpu_data_unregister(token_handle); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); #ifndef STARPU_SIMGRID if (rank == last_rank) { STARPU_ASSERT(token == nloops*size); } #endif return 0; } starpu-1.2.3+dfsg/mpi/tests/ring_async.c000066400000000000000000000071501320135501600202000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "helper.h" #ifdef STARPU_QUICK_CHECK # define NITER 32 #elif !defined(STARPU_LONG_CHECK) # define NITER 256 #else # define NITER 2048 #endif int token = 42; starpu_data_handle_t token_handle; #ifdef STARPU_USE_CUDA extern void increment_cuda(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); #endif void increment_cpu(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { int *tokenptr = (int *)STARPU_VECTOR_GET_PTR(descr[0]); (*tokenptr)++; } /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; static struct starpu_codelet increment_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {increment_cuda}, #endif .cpu_funcs = {increment_cpu}, .nbuffers = 1, .modes = {STARPU_RW}, .model = &dumb_model }; void increment_token(void) { struct starpu_task *task = starpu_task_create(); task->cl = &increment_cl; task->handles[0] = token_handle; task->synchronous = 1; int ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } int main(int argc, char **argv) { int ret, rank, size; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if (size < 2) { if (rank == 0) FPRINTF(stderr, "We need at least 2 processes.\n"); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return STARPU_TEST_SKIPPED; } starpu_vector_data_register(&token_handle, STARPU_MAIN_RAM, (uintptr_t)&token, 1, sizeof(token)); int nloops = NITER; int loop; int last_loop = nloops - 1; int last_rank = size - 1; for (loop = 0; loop < nloops; loop++) { int tag = loop*size + rank; if (loop == 0 && rank == 0) { token = 0; FPRINTF(stdout, "Start with token value %d\n", token); } else { MPI_Status status; starpu_mpi_req req; starpu_mpi_irecv(token_handle, &req, (rank+size-1)%size, tag, MPI_COMM_WORLD); starpu_mpi_wait(&req, &status); } increment_token(); if (loop == last_loop && rank == last_rank) { starpu_data_acquire(token_handle, STARPU_R); FPRINTF(stdout, "Finished : token value %d\n", token); starpu_data_release(token_handle); } else { starpu_mpi_req req; MPI_Status status; starpu_mpi_isend(token_handle, &req, (rank+1)%size, tag+1, MPI_COMM_WORLD); starpu_mpi_wait(&req, &status); } } starpu_data_unregister(token_handle); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); #ifndef STARPU_SIMGRID if (rank == last_rank) { STARPU_ASSERT(token == nloops*size); } #endif return 0; } starpu-1.2.3+dfsg/mpi/tests/ring_async_implicit.c000066400000000000000000000066711320135501600221010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2015-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "helper.h" #ifdef STARPU_QUICK_CHECK # define NITER 32 #elif !defined(STARPU_LONG_CHECK) # define NITER 256 #else # define NITER 2048 #endif int token = 42; starpu_data_handle_t token_handle; #ifdef STARPU_USE_CUDA extern void increment_cuda(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); #endif void increment_cpu(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { int *tokenptr = (int *)STARPU_VECTOR_GET_PTR(descr[0]); (*tokenptr)++; } /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; static struct starpu_codelet increment_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {increment_cuda}, #endif .cpu_funcs = {increment_cpu}, .nbuffers = 1, .modes = {STARPU_RW}, .model = &dumb_model }; void increment_token(void) { struct starpu_task *task = starpu_task_create(); task->cl = &increment_cl; task->handles[0] = token_handle; int ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } int main(int argc, char **argv) { int ret, rank, size; ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (size < 2) { if (rank == 0) FPRINTF(stderr, "We need at least 2 processes.\n"); MPI_Finalize(); return STARPU_TEST_SKIPPED; } starpu_vector_data_register(&token_handle, STARPU_MAIN_RAM, (uintptr_t)&token, 1, sizeof(token)); int nloops = NITER; int loop; int last_loop = nloops - 1; int last_rank = size - 1; for (loop = 0; loop < nloops; loop++) { int tag = loop*size + rank; if (loop == 0 && rank == 0) { token = 0; FPRINTF(stdout, "Start with token value %d\n", token); } else { starpu_mpi_irecv_detached(token_handle, (rank+size-1)%size, tag, MPI_COMM_WORLD, NULL, NULL); } increment_token(); if (loop == last_loop && rank == last_rank) { starpu_data_acquire(token_handle, STARPU_R); FPRINTF(stdout, "Finished : token value %d\n", token); starpu_data_release(token_handle); } else { starpu_mpi_isend_detached(token_handle, (rank+1)%size, tag+1, MPI_COMM_WORLD, NULL, NULL); } } starpu_task_wait_for_all(); starpu_data_unregister(token_handle); starpu_mpi_shutdown(); starpu_shutdown(); #ifndef STARPU_SIMGRID if (rank == last_rank) { FPRINTF(stderr, "[%d] token = %d == %d * %d ?\n", rank, token, nloops, size); STARPU_ASSERT(token == nloops*size); } #endif return 0; } starpu-1.2.3+dfsg/mpi/tests/ring_kernel.cu000066400000000000000000000020501320135501600205220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include static __global__ void cuda_incrementer(unsigned *token) { (*token)++; } extern "C" void increment_cuda(void *descr[], void *_args) { (void) _args; unsigned *tokenptr = (unsigned *)STARPU_VECTOR_GET_PTR(descr[0]); cuda_incrementer<<<1,1, 0, starpu_cuda_get_local_stream()>>>(tokenptr); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.2.3+dfsg/mpi/tests/ring_sync.c000066400000000000000000000070571320135501600200450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "helper.h" #ifdef STARPU_QUICK_CHECK # define NITER 32 #elif !defined(STARPU_LONG_CHECK) # define NITER 256 #else # define NITER 2048 #endif int token = 42; starpu_data_handle_t token_handle; #ifdef STARPU_USE_CUDA extern void increment_cuda(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); #endif void increment_cpu(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { int *tokenptr = (int *)STARPU_VECTOR_GET_PTR(descr[0]); (*tokenptr)++; } /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; static struct starpu_codelet increment_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {increment_cuda}, #endif .cpu_funcs = {increment_cpu}, .nbuffers = 1, .modes = {STARPU_RW}, .model = &dumb_model }; void increment_token(void) { struct starpu_task *task = starpu_task_create(); task->cl = &increment_cl; task->handles[0] = token_handle; task->synchronous = 1; int ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } int main(int argc, char **argv) { int ret, rank, size; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if (size < 2) { if (rank == 0) FPRINTF(stderr, "We need at least 2 processes.\n"); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return STARPU_TEST_SKIPPED; } starpu_vector_data_register(&token_handle, 0, (uintptr_t)&token, 1, sizeof(token)); int nloops = NITER; int loop; int last_loop = nloops - 1; int last_rank = size - 1; for (loop = 0; loop < nloops; loop++) { int tag = loop*size + rank; if (loop == 0 && rank == 0) { token = 0; FPRINTF(stdout, "Start with token value %d\n", token); } else { MPI_Status status; starpu_mpi_recv(token_handle, (rank+size-1)%size, tag, MPI_COMM_WORLD, &status); } increment_token(); if (loop == last_loop && rank == last_rank) { starpu_data_acquire(token_handle, STARPU_R); FPRINTF(stdout, "Finished : token value %d\n", token); starpu_data_release(token_handle); } else { starpu_mpi_req req; MPI_Status status; starpu_mpi_issend(token_handle, &req, (rank+1)%size, tag+1, MPI_COMM_WORLD); starpu_mpi_wait(&req, &status); } } starpu_data_unregister(token_handle); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); #ifndef STARPU_SIMGRID if (rank == last_rank) { STARPU_ASSERT(token == nloops*size); } #endif return 0; } starpu-1.2.3+dfsg/mpi/tests/ring_sync_detached.c000066400000000000000000000101011320135501600216460ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "helper.h" #ifdef STARPU_QUICK_CHECK # define NITER 32 #elif !defined(STARPU_LONG_CHECK) # define NITER 256 #else # define NITER 2048 #endif #ifdef STARPU_USE_CUDA extern void increment_cuda(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); #endif void increment_cpu(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { int *tokenptr = (int *)STARPU_VECTOR_GET_PTR(descr[0]); (*tokenptr)++; } /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; static struct starpu_codelet increment_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {increment_cuda}, #endif .cpu_funcs = {increment_cpu}, .nbuffers = 1, .modes = {STARPU_RW}, .model = &dumb_model }; void increment_token(starpu_data_handle_t handle) { struct starpu_task *task = starpu_task_create(); task->cl = &increment_cl; task->handles[0] = handle; task->synchronous = 1; int ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static starpu_pthread_cond_t cond = STARPU_PTHREAD_COND_INITIALIZER; void callback(void *arg) { unsigned *completed = arg; STARPU_PTHREAD_MUTEX_LOCK(&mutex); *completed = 1; STARPU_PTHREAD_COND_SIGNAL(&cond); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } int main(int argc, char **argv) { int ret, rank, size; int token = 42; starpu_data_handle_t token_handle; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if (size < 2) { if (rank == 0) FPRINTF(stderr, "We need at least 2 processes.\n"); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return STARPU_TEST_SKIPPED; } starpu_vector_data_register(&token_handle, 0, (uintptr_t)&token, 1, sizeof(token)); int nloops = NITER; int loop; int last_loop = nloops - 1; int last_rank = size - 1; for (loop = 0; loop < nloops; loop++) { int tag = loop*size + rank; if (loop == 0 && rank == 0) { token = 0; FPRINTF_MPI(stderr, "Start with token value %d\n", token); } else { MPI_Status status; starpu_mpi_recv(token_handle, (rank+size-1)%size, tag, MPI_COMM_WORLD, &status); } increment_token(token_handle); if (loop == last_loop && rank == last_rank) { starpu_data_acquire(token_handle, STARPU_R); FPRINTF_MPI(stderr, "Finished : token value %d\n", token); starpu_data_release(token_handle); } else { int sent = 0; starpu_mpi_issend_detached(token_handle, (rank+1)%size, tag+1, MPI_COMM_WORLD, callback, &sent); STARPU_PTHREAD_MUTEX_LOCK(&mutex); while (!sent) STARPU_PTHREAD_COND_WAIT(&cond, &mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } } starpu_data_unregister(token_handle); starpu_mpi_shutdown(); starpu_shutdown(); FPRINTF_MPI(stderr, "Final value for token %d\n", token); MPI_Finalize(); #ifndef STARPU_SIMGRID if (rank == last_rank) { STARPU_ASSERT(token == nloops*size); } #endif return 0; } starpu-1.2.3+dfsg/mpi/tests/starpu_redefine.c000066400000000000000000000024361320135501600212250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "helper.h" int main(int argc, char **argv) { int ret; starpu_data_handle_t handle; if (RUNNING_ON_VALGRIND) return STARPU_TEST_SKIPPED; disable_coredump(); MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); starpu_vector_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)&ret, 1, sizeof(int)); starpu_mpi_datatype_register(handle, NULL, NULL); starpu_data_unregister(handle); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return 0; } starpu-1.2.3+dfsg/mpi/tests/sync.c000066400000000000000000000061021320135501600170140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "helper.h" int main(int argc, char **argv) { int size, x=789; int rank, other_rank; int ret; starpu_data_handle_t data[2]; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (size % 2) { FPRINTF(stderr, "We need a even number of processes.\n"); MPI_Finalize(); return STARPU_TEST_SKIPPED; } other_rank = rank%2 == 0 ? rank+1 : rank-1; FPRINTF_MPI(stderr, "rank %d exchanging with rank %d\n", rank, other_rank); if (rank % 2) { MPI_Send(&rank, 1, MPI_INT, other_rank, 10, MPI_COMM_WORLD); FPRINTF(stderr, "[%d] sending %d\n", rank, rank); } else { MPI_Recv(&x, 1, MPI_INT, other_rank, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); FPRINTF(stderr, "[%d] received %d\n", rank, x); } ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if (rank % 2) { starpu_variable_data_register(&data[0], STARPU_MAIN_RAM, (uintptr_t)&rank, sizeof(unsigned)); starpu_variable_data_register(&data[1], STARPU_MAIN_RAM, (uintptr_t)&rank, sizeof(unsigned)); starpu_mpi_data_register(data[1], 22, 0); } else starpu_variable_data_register(&data[0], -1, (uintptr_t)NULL, sizeof(unsigned)); starpu_mpi_data_register(data[0], 12, 0); if (rank % 2) { starpu_mpi_req req; starpu_mpi_issend(data[1], &req, other_rank, 22, MPI_COMM_WORLD); starpu_mpi_send(data[0], other_rank, 12, MPI_COMM_WORLD); starpu_mpi_wait(&req, MPI_STATUS_IGNORE); } else { int *xx; starpu_mpi_recv(data[0], other_rank, 12, MPI_COMM_WORLD, MPI_STATUS_IGNORE); xx = (int *)starpu_variable_get_local_ptr(data[0]); FPRINTF_MPI(stderr, "received %d\n", *xx); STARPU_ASSERT_MSG(x==*xx, "Received value %d is incorrect (should be %d)\n", *xx, x); starpu_variable_data_register(&data[1], -1, (uintptr_t)NULL, sizeof(unsigned)); starpu_mpi_data_register(data[1], 22, 0); starpu_mpi_recv(data[0], other_rank, 22, MPI_COMM_WORLD, MPI_STATUS_IGNORE); xx = (int *)starpu_variable_get_local_ptr(data[0]); STARPU_ASSERT_MSG(x==*xx, "Received value %d is incorrect (should be %d)\n", *xx, x); } starpu_data_unregister(data[0]); starpu_data_unregister(data[1]); starpu_mpi_shutdown(); starpu_shutdown(); MPI_Finalize(); return 0; } starpu-1.2.3+dfsg/mpi/tests/tags_checking.c000066400000000000000000000073221320135501600206360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "helper.h" #define VAL0 12 #define VAL1 24 static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static starpu_pthread_cond_t cond = STARPU_PTHREAD_COND_INITIALIZER; void callback(void *arg) { unsigned *received = arg; STARPU_PTHREAD_MUTEX_LOCK(&mutex); *received = *received + 1; FPRINTF_MPI(stderr, "Request %u received\n", *received); STARPU_PTHREAD_COND_SIGNAL(&cond); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } int do_test(int rank, int sdetached, int rdetached) { int ret, i; int val[2]; starpu_data_handle_t data[2]; ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(NULL, NULL, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); if (rank == 1) { val[0] = VAL0; val[1] = VAL1; } else { val[0] = -1; val[1] = -1; } starpu_variable_data_register(&data[0], STARPU_MAIN_RAM, (uintptr_t)&val[0], sizeof(val[0])); starpu_variable_data_register(&data[1], STARPU_MAIN_RAM, (uintptr_t)&val[1], sizeof(val[1])); starpu_mpi_data_register(data[0], 77, 1); starpu_mpi_data_register(data[1], 88, 1); if (rank == 1) { for(i=1 ; i>=0 ; i--) { if (sdetached) starpu_mpi_isend_detached(data[i], 0, starpu_data_get_tag(data[i]), MPI_COMM_WORLD, NULL, NULL); else starpu_mpi_send(data[i], 0, starpu_data_get_tag(data[i]), MPI_COMM_WORLD); } } else if (rank == 0) { int received = 0; for(i=0 ; i<2 ; i++) FPRINTF_MPI(stderr, "Value[%d] = %d\n", i, val[i]); for(i=0 ; i<2 ; i++) { if (rdetached) starpu_mpi_irecv_detached(data[i], 1, starpu_data_get_tag(data[i]), MPI_COMM_WORLD, callback, &received); else starpu_mpi_recv(data[i], 1, starpu_data_get_tag(data[i]), MPI_COMM_WORLD, MPI_STATUS_IGNORE); } if (rdetached) { STARPU_PTHREAD_MUTEX_LOCK(&mutex); while (received != 2) { FPRINTF_MPI(stderr, "Received %d messages\n", received); STARPU_PTHREAD_COND_WAIT(&cond, &mutex); } STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } for(i=0 ; i<2 ; i++) starpu_data_acquire(data[i], STARPU_R); for(i=0 ; i<2 ; i++) FPRINTF_MPI(stderr, "Value[%d] = %d\n", i, val[i]); for(i=0 ; i<2 ; i++) starpu_data_release(data[i]); } FPRINTF_MPI(stderr, "Waiting ...\n"); starpu_task_wait_for_all(); starpu_data_unregister(data[0]); starpu_data_unregister(data[1]); if (rank == 0) { ret = (val[0] == VAL0 && val[1] == VAL1) ? 0 : 1; } starpu_mpi_shutdown(); starpu_shutdown(); return ret; } int main(int argc, char **argv) { int size; int rank; int ret=0; int sdetached, rdetached; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (size < 2) { FPRINTF_MPI(stderr, "We need at least 2 processes.\n"); MPI_Finalize(); return STARPU_TEST_SKIPPED; } for(sdetached=0 ; sdetached<=1 ; sdetached++) { for(rdetached=0 ; rdetached<=1 ; rdetached++) { ret += do_test(rank, sdetached, rdetached); } } MPI_Finalize(); return ret; } starpu-1.2.3+dfsg/mpi/tests/temporary.c000066400000000000000000000114711320135501600200670ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* This tests that one can register temporary data0 on each MPI node which can mix with common data0 */ #include #include "helper.h" static void func_add(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { int *a = (void*) STARPU_VARIABLE_GET_PTR(descr[0]); const int *b = (void*) STARPU_VARIABLE_GET_PTR(descr[1]); const int *c = (void*) STARPU_VARIABLE_GET_PTR(descr[2]); *a = *b + *c; FPRINTF_MPI(stderr, "%d + %d = %d\n", *b, *c, *a); } /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } static struct starpu_perfmodel dumb_model = { .type = STARPU_COMMON, .cost_function = cost_function }; static struct starpu_codelet codelet_add = { .cpu_funcs = {func_add}, .nbuffers = 3, .modes = {STARPU_W, STARPU_R, STARPU_R}, .model = &dumb_model, .flags = STARPU_CODELET_SIMGRID_EXECUTE, }; int main(int argc, char **argv) { int rank, size, n; int ret; int a; int val0 = 0, val1 = 0; starpu_data_handle_t data0, data1, tmp0, tmp, tmp2; ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_mpi_init(&argc, &argv, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (starpu_mpi_cache_is_enabled() == 0) goto skip; if (rank == 0) { val0 = 1; starpu_variable_data_register(&data0, STARPU_MAIN_RAM, (uintptr_t)&val0, sizeof(val0)); starpu_variable_data_register(&data1, -1, (uintptr_t)NULL, sizeof(val0)); starpu_variable_data_register(&tmp0, -1, (uintptr_t)NULL, sizeof(val0)); starpu_mpi_data_register(tmp0, -1, 0); } else if (rank == 1) { starpu_variable_data_register(&data0, -1, (uintptr_t)NULL, sizeof(val0)); starpu_variable_data_register(&data1, STARPU_MAIN_RAM, (uintptr_t)&val1, sizeof(val1)); tmp0 = NULL; } else { starpu_variable_data_register(&data0, -1, (uintptr_t)NULL, sizeof(val0)); starpu_variable_data_register(&data1, -1, (uintptr_t)NULL, sizeof(val0)); tmp0 = NULL; } starpu_variable_data_register(&tmp, -1, (uintptr_t)NULL, sizeof(val0)); starpu_variable_data_register(&tmp2, -1, (uintptr_t)NULL, sizeof(val0)); starpu_mpi_data_register(data0, 42, 0); starpu_mpi_data_register(data1, 43, 1); starpu_mpi_data_register(tmp, 44, 0); starpu_mpi_data_register(tmp2, -1, STARPU_MPI_PER_NODE); /* Test temporary data0 on node 0 only */ starpu_mpi_task_insert(MPI_COMM_WORLD, &codelet_add, STARPU_W, tmp0, STARPU_R, data0, STARPU_R, data0, 0); starpu_mpi_task_insert(MPI_COMM_WORLD, &codelet_add, STARPU_W, data0, STARPU_R, tmp0, STARPU_R, tmp0, 0); starpu_mpi_task_insert(MPI_COMM_WORLD, &codelet_add, STARPU_W, tmp, STARPU_R, data0, STARPU_R, data0, 0); /* Now make some tmp per-node, so that each node replicates the computation */ for (n = 0; n < size; n++) if (n != 0) /* Get the value on all nodes */ starpu_mpi_get_data_on_node_detached(MPI_COMM_WORLD, tmp, n, NULL, NULL); starpu_mpi_data_set_rank(tmp, STARPU_MPI_PER_NODE); /* This task writes to a per-node data, so will be executed by all nodes */ starpu_mpi_task_insert(MPI_COMM_WORLD, &codelet_add, STARPU_W, tmp2, STARPU_R, tmp, STARPU_R, tmp, 0); /* All MPI nodes have computed the value (no MPI communication here!) */ starpu_data_acquire_on_node(tmp2, STARPU_MAIN_RAM, STARPU_R); STARPU_ASSERT(*(int*)starpu_data_handle_to_pointer(tmp2, STARPU_MAIN_RAM) == 16); starpu_data_release_on_node(tmp2, STARPU_MAIN_RAM); /* And nodes 0 and 1 do something with it */ starpu_mpi_task_insert(MPI_COMM_WORLD, &codelet_add, STARPU_W, data0, STARPU_R, tmp, STARPU_R, tmp2, 0); starpu_mpi_task_insert(MPI_COMM_WORLD, &codelet_add, STARPU_W, data1, STARPU_R, tmp, STARPU_R, tmp2, 0); starpu_task_wait_for_all(); if (rank == 0) { starpu_data_unregister(tmp0); } starpu_data_unregister(data0); starpu_data_unregister(data1); starpu_data_unregister(tmp); starpu_data_unregister(tmp2); skip: starpu_mpi_shutdown(); starpu_shutdown(); if (rank == 0) STARPU_ASSERT_MSG(val0 == 24, "%d should be %d\n", val0, 16 * size); if (rank == 1) STARPU_ASSERT_MSG(val1 == 24, "%d should be %d\n", val0, 16 * size); return 0; } starpu-1.2.3+dfsg/mpi/tests/user_defined_datatype.c000066400000000000000000000115771320135501600224030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012, 2013, 2014, 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include "helper.h" #ifdef STARPU_QUICK_CHECK # define ELEMENTS 10 #else # define ELEMENTS 1000 #endif typedef void (*test_func)(starpu_data_handle_t *, int, int, int); void test_handle_irecv_isend_detached(starpu_data_handle_t *handles, int nb_handles, int rank, int tag) { int i; for(i=0 ; ivalue) int *starpu_value_get(starpu_data_handle_t handle) { struct starpu_value_interface *value_interface = (struct starpu_value_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); return value_interface->value; } static void value_register_data_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface) { struct starpu_value_interface *value_interface = (struct starpu_value_interface *) data_interface; unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct starpu_value_interface *local_interface = (struct starpu_value_interface *) starpu_data_get_interface_on_node(handle, node); if (node == home_node) local_interface->value = value_interface->value; else local_interface->value = 0; } } static starpu_ssize_t value_allocate_data_on_node(void *data_interface, unsigned node) { struct starpu_value_interface *value_interface = (struct starpu_value_interface *) data_interface; int *addr = 0; addr = (int *) starpu_malloc_on_node(node, sizeof(int)); if (!addr) return -ENOMEM; /* update the data properly in consequence */ value_interface->value = addr; return sizeof(int); } static void value_free_data_on_node(void *data_interface, unsigned node) { struct starpu_value_interface *value_interface = (struct starpu_value_interface *) data_interface; starpu_free_on_node(node, (uintptr_t) value_interface->value, sizeof(int)); } static size_t value_get_size(starpu_data_handle_t handle) { return sizeof(int); } static uint32_t value_footprint(starpu_data_handle_t handle) { return starpu_hash_crc32c_be(value_get_size(handle), 0); } static void *value_handle_to_pointer(starpu_data_handle_t handle, unsigned node) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_value_interface *value_interface = (struct starpu_value_interface *) starpu_data_get_interface_on_node(handle, node); return (void*) value_interface->value; } static int value_pack_data(starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_value_interface *value_interface = (struct starpu_value_interface *) starpu_data_get_interface_on_node(handle, node); *count = sizeof(int); if (ptr != NULL) { *ptr = malloc(*count); memcpy(*ptr, value_interface->value, sizeof(int)); } return 0; } static int value_unpack_data(starpu_data_handle_t handle, unsigned node, void *ptr, size_t count) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_value_interface *value_interface = (struct starpu_value_interface *) starpu_data_get_interface_on_node(handle, node); value_interface->value[0] = ((int *)ptr)[0]; assert(value_interface->value[0] == 36); return 0; } static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data) { struct starpu_value_interface *src_value = src_interface; struct starpu_value_interface *dst_value = dst_interface; int ret = 0; return starpu_interface_copy((uintptr_t) src_value->value, 0, src_node, (uintptr_t) dst_value->value, 0, dst_node, sizeof(int), async_data); } static const struct starpu_data_copy_methods value_copy_methods = { .any_to_any = copy_any_to_any }; static struct starpu_data_interface_ops interface_value_ops = { .register_data_handle = value_register_data_handle, .allocate_data_on_node = value_allocate_data_on_node, .free_data_on_node = value_free_data_on_node, .copy_methods = &value_copy_methods, .get_size = value_get_size, .footprint = value_footprint, .interfaceid = STARPU_UNKNOWN_INTERFACE_ID, .interface_size = sizeof(struct starpu_value_interface), .handle_to_pointer = value_handle_to_pointer, .pack_data = value_pack_data, .unpack_data = value_unpack_data }; void starpu_value_data_register(starpu_data_handle_t *handleptr, unsigned home_node, int *value) { struct starpu_value_interface value_int = { .value = value }; if (interface_value_ops.interfaceid == STARPU_UNKNOWN_INTERFACE_ID) { interface_value_ops.interfaceid = starpu_data_interface_get_next_id(); } starpu_data_register(handleptr, home_node, &value_int, &interface_value_ops); } #endif /* _USER_DEFINED_DATATYPE_VALUE_H */ starpu-1.2.3+dfsg/sc_hypervisor/000077500000000000000000000000001320135501600166455ustar00rootroot00000000000000starpu-1.2.3+dfsg/sc_hypervisor/Makefile.am000066400000000000000000000017731320135501600207110ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011,2012 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. SUBDIRS = src examples versincludedir = $(includedir)/starpu/$(STARPU_EFFECTIVE_VERSION) versinclude_HEADERS = include/sc_hypervisor.h \ include/sc_hypervisor_config.h \ include/sc_hypervisor_monitoring.h \ include/sc_hypervisor_policy.h \ include/sc_hypervisor_lp.h showcheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET starpu-1.2.3+dfsg/sc_hypervisor/Makefile.in000066400000000000000000000650141320135501600207200ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011,2012 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = sc_hypervisor ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(versinclude_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(versincludedir)" HEADERS = $(versinclude_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POTI_CFLAGS = @POTI_CFLAGS@ POTI_LIBS = @POTI_LIBS@ PROG_DATE = @PROG_DATE@ PROG_STAT = @PROG_STAT@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_COI_CPPFLAGS = @STARPU_COI_CPPFLAGS@ STARPU_COI_LDFLAGS = @STARPU_COI_LDFLAGS@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LEVELDB_LDFLAGS = @STARPU_LEVELDB_LDFLAGS@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RCCE_CFLAGS = @STARPU_RCCE_CFLAGS@ STARPU_RCCE_CPPFLAGS = @STARPU_RCCE_CPPFLAGS@ STARPU_RCCE_LDFLAGS = @STARPU_RCCE_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SCIF_CPPFLAGS = @STARPU_SCIF_CPPFLAGS@ STARPU_SCIF_LDFLAGS = @STARPU_SCIF_LDFLAGS@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SC_HYPERVISOR_DEBUG = @STARPU_SC_HYPERVISOR_DEBUG@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ mpifort_path = @mpifort_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ smpirun_path = @smpirun_path@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = src examples versincludedir = $(includedir)/starpu/$(STARPU_EFFECTIVE_VERSION) versinclude_HEADERS = include/sc_hypervisor.h \ include/sc_hypervisor_config.h \ include/sc_hypervisor_monitoring.h \ include/sc_hypervisor_policy.h \ include/sc_hypervisor_lp.h all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign sc_hypervisor/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign sc_hypervisor/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-versincludeHEADERS: $(versinclude_HEADERS) @$(NORMAL_INSTALL) @list='$(versinclude_HEADERS)'; test -n "$(versincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(versincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(versincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(versincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(versincludedir)" || exit $$?; \ done uninstall-versincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(versinclude_HEADERS)'; test -n "$(versincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(versincludedir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(versincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-versincludeHEADERS install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-versincludeHEADERS .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip install-versincludeHEADERS installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-versincludeHEADERS .PRECIOUS: Makefile showcheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.2.3+dfsg/sc_hypervisor/examples/000077500000000000000000000000001320135501600204635ustar00rootroot00000000000000starpu-1.2.3+dfsg/sc_hypervisor/examples/Makefile.am000066400000000000000000000037551320135501600225310ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011,2012 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. include $(top_srcdir)/starpu.mk AM_CFLAGS = -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(FXT_CFLAGS) $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) $(GLOBAL_AM_CFLAGS) LIBS = $(top_builddir)/src/@LIBSTARPU_LINK@ @LIBS@ $(top_builddir)/sc_hypervisor/src/libsc_hypervisor.la AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/examples -I$(top_builddir)/include -I$(top_srcdir)/sc_hypervisor/include -I$(top_srcdir)/sc_hypervisor/examples AM_LDFLAGS = $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) $(STARPU_GLPK_LDFLAGS) $(STARPU_COI_LDFLAGS) $(STARPU_SCIF_LDFLAGS) noinst_PROGRAMS = \ app_driven_test/app_driven_test \ lp_test/lp_test \ lp_test/lp_resize_test \ hierarchical_ctxs/resize_hierarchical_ctxs if !NO_BLAS_LIB noinst_PROGRAMS += \ cholesky/cholesky_implicit noinst_HEADERS = \ cholesky/cholesky.h \ sched_ctx_utils/sched_ctx_utils.h endif if !NO_BLAS_LIB cholesky_cholesky_implicit_SOURCES = \ cholesky/cholesky_implicit.c \ cholesky/cholesky_models.c \ cholesky/cholesky_kernels.c \ sched_ctx_utils/sched_ctx_utils.c \ ../../examples/common/blas.c cholesky_cholesky_implicit_LDADD = \ $(top_builddir)/sc_hypervisor/src/libsc_hypervisor.la \ $(STARPU_BLAS_LDFLAGS) endif app_driven_test_app_driven_test_SOURCES = \ app_driven_test/app_driven_test.c app_driven_test_app_driven_test_LDADD = \ $(top_builddir)/sc_hypervisor/src/libsc_hypervisor.la starpu-1.2.3+dfsg/sc_hypervisor/examples/Makefile.in000066400000000000000000001404741320135501600225420ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011,2012 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ noinst_PROGRAMS = app_driven_test/app_driven_test$(EXEEXT) \ lp_test/lp_test$(EXEEXT) lp_test/lp_resize_test$(EXEEXT) \ hierarchical_ctxs/resize_hierarchical_ctxs$(EXEEXT) \ $(am__EXEEXT_1) @NO_BLAS_LIB_FALSE@am__append_1 = \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_implicit subdir = sc_hypervisor/examples ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__noinst_HEADERS_DIST) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @NO_BLAS_LIB_FALSE@am__EXEEXT_1 = cholesky/cholesky_implicit$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) am_app_driven_test_app_driven_test_OBJECTS = \ app_driven_test.$(OBJEXT) app_driven_test_app_driven_test_OBJECTS = \ $(am_app_driven_test_app_driven_test_OBJECTS) app_driven_test_app_driven_test_DEPENDENCIES = \ $(top_builddir)/sc_hypervisor/src/libsc_hypervisor.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am__dirstamp = $(am__leading_dot)dirstamp am__cholesky_cholesky_implicit_SOURCES_DIST = \ cholesky/cholesky_implicit.c cholesky/cholesky_models.c \ cholesky/cholesky_kernels.c sched_ctx_utils/sched_ctx_utils.c \ ../../examples/common/blas.c @NO_BLAS_LIB_FALSE@am_cholesky_cholesky_implicit_OBJECTS = \ @NO_BLAS_LIB_FALSE@ cholesky_implicit.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ cholesky_models.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ cholesky_kernels.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ sched_ctx_utils.$(OBJEXT) blas.$(OBJEXT) cholesky_cholesky_implicit_OBJECTS = \ $(am_cholesky_cholesky_implicit_OBJECTS) am__DEPENDENCIES_1 = @NO_BLAS_LIB_FALSE@cholesky_cholesky_implicit_DEPENDENCIES = $(top_builddir)/sc_hypervisor/src/libsc_hypervisor.la \ @NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) hierarchical_ctxs_resize_hierarchical_ctxs_SOURCES = \ hierarchical_ctxs/resize_hierarchical_ctxs.c hierarchical_ctxs_resize_hierarchical_ctxs_OBJECTS = \ resize_hierarchical_ctxs.$(OBJEXT) hierarchical_ctxs_resize_hierarchical_ctxs_LDADD = $(LDADD) lp_test_lp_resize_test_SOURCES = lp_test/lp_resize_test.c lp_test_lp_resize_test_OBJECTS = lp_resize_test.$(OBJEXT) lp_test_lp_resize_test_LDADD = $(LDADD) lp_test_lp_test_SOURCES = lp_test/lp_test.c lp_test_lp_test_OBJECTS = lp_test.$(OBJEXT) lp_test_lp_test_LDADD = $(LDADD) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/common -I$(top_builddir)/include -I$(top_builddir)/gcc-plugin/include/starpu-gcc -I$(top_builddir)/starpu-top depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(app_driven_test_app_driven_test_SOURCES) \ $(cholesky_cholesky_implicit_SOURCES) \ hierarchical_ctxs/resize_hierarchical_ctxs.c \ lp_test/lp_resize_test.c lp_test/lp_test.c DIST_SOURCES = $(app_driven_test_app_driven_test_SOURCES) \ $(am__cholesky_cholesky_implicit_SOURCES_DIST) \ hierarchical_ctxs/resize_hierarchical_ctxs.c \ lp_test/lp_resize_test.c lp_test/lp_test.c am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__noinst_HEADERS_DIST = cholesky/cholesky.h \ sched_ctx_utils/sched_ctx_utils.h HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/build-aux/depcomp $(top_srcdir)/starpu.mk DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = $(top_builddir)/src/@LIBSTARPU_LINK@ @LIBS@ $(top_builddir)/sc_hypervisor/src/libsc_hypervisor.la LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POTI_CFLAGS = @POTI_CFLAGS@ POTI_LIBS = @POTI_LIBS@ PROG_DATE = @PROG_DATE@ PROG_STAT = @PROG_STAT@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_COI_CPPFLAGS = @STARPU_COI_CPPFLAGS@ STARPU_COI_LDFLAGS = @STARPU_COI_LDFLAGS@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LEVELDB_LDFLAGS = @STARPU_LEVELDB_LDFLAGS@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RCCE_CFLAGS = @STARPU_RCCE_CFLAGS@ STARPU_RCCE_CPPFLAGS = @STARPU_RCCE_CPPFLAGS@ STARPU_RCCE_LDFLAGS = @STARPU_RCCE_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SCIF_CPPFLAGS = @STARPU_SCIF_CPPFLAGS@ STARPU_SCIF_LDFLAGS = @STARPU_SCIF_LDFLAGS@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SC_HYPERVISOR_DEBUG = @STARPU_SC_HYPERVISOR_DEBUG@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ mpifort_path = @mpifort_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ smpirun_path = @smpirun_path@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CFLAGS = -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(FXT_CFLAGS) $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) $(GLOBAL_AM_CFLAGS) AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/examples -I$(top_builddir)/include -I$(top_srcdir)/sc_hypervisor/include -I$(top_srcdir)/sc_hypervisor/examples AM_LDFLAGS = $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) $(STARPU_GLPK_LDFLAGS) $(STARPU_COI_LDFLAGS) $(STARPU_SCIF_LDFLAGS) @NO_BLAS_LIB_FALSE@noinst_HEADERS = \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky.h \ @NO_BLAS_LIB_FALSE@ sched_ctx_utils/sched_ctx_utils.h @NO_BLAS_LIB_FALSE@cholesky_cholesky_implicit_SOURCES = \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_implicit.c \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_models.c \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_kernels.c \ @NO_BLAS_LIB_FALSE@ sched_ctx_utils/sched_ctx_utils.c \ @NO_BLAS_LIB_FALSE@ ../../examples/common/blas.c @NO_BLAS_LIB_FALSE@cholesky_cholesky_implicit_LDADD = \ @NO_BLAS_LIB_FALSE@ $(top_builddir)/sc_hypervisor/src/libsc_hypervisor.la \ @NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) app_driven_test_app_driven_test_SOURCES = \ app_driven_test/app_driven_test.c app_driven_test_app_driven_test_LDADD = \ $(top_builddir)/sc_hypervisor/src/libsc_hypervisor.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/starpu.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign sc_hypervisor/examples/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign sc_hypervisor/examples/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/starpu.mk $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list app_driven_test/$(am__dirstamp): @$(MKDIR_P) app_driven_test @: > app_driven_test/$(am__dirstamp) app_driven_test/app_driven_test$(EXEEXT): $(app_driven_test_app_driven_test_OBJECTS) $(app_driven_test_app_driven_test_DEPENDENCIES) $(EXTRA_app_driven_test_app_driven_test_DEPENDENCIES) app_driven_test/$(am__dirstamp) @rm -f app_driven_test/app_driven_test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(app_driven_test_app_driven_test_OBJECTS) $(app_driven_test_app_driven_test_LDADD) $(LIBS) cholesky/$(am__dirstamp): @$(MKDIR_P) cholesky @: > cholesky/$(am__dirstamp) cholesky/cholesky_implicit$(EXEEXT): $(cholesky_cholesky_implicit_OBJECTS) $(cholesky_cholesky_implicit_DEPENDENCIES) $(EXTRA_cholesky_cholesky_implicit_DEPENDENCIES) cholesky/$(am__dirstamp) @rm -f cholesky/cholesky_implicit$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cholesky_cholesky_implicit_OBJECTS) $(cholesky_cholesky_implicit_LDADD) $(LIBS) hierarchical_ctxs/$(am__dirstamp): @$(MKDIR_P) hierarchical_ctxs @: > hierarchical_ctxs/$(am__dirstamp) hierarchical_ctxs/resize_hierarchical_ctxs$(EXEEXT): $(hierarchical_ctxs_resize_hierarchical_ctxs_OBJECTS) $(hierarchical_ctxs_resize_hierarchical_ctxs_DEPENDENCIES) $(EXTRA_hierarchical_ctxs_resize_hierarchical_ctxs_DEPENDENCIES) hierarchical_ctxs/$(am__dirstamp) @rm -f hierarchical_ctxs/resize_hierarchical_ctxs$(EXEEXT) $(AM_V_CCLD)$(LINK) $(hierarchical_ctxs_resize_hierarchical_ctxs_OBJECTS) $(hierarchical_ctxs_resize_hierarchical_ctxs_LDADD) $(LIBS) lp_test/$(am__dirstamp): @$(MKDIR_P) lp_test @: > lp_test/$(am__dirstamp) lp_test/lp_resize_test$(EXEEXT): $(lp_test_lp_resize_test_OBJECTS) $(lp_test_lp_resize_test_DEPENDENCIES) $(EXTRA_lp_test_lp_resize_test_DEPENDENCIES) lp_test/$(am__dirstamp) @rm -f lp_test/lp_resize_test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(lp_test_lp_resize_test_OBJECTS) $(lp_test_lp_resize_test_LDADD) $(LIBS) lp_test/lp_test$(EXEEXT): $(lp_test_lp_test_OBJECTS) $(lp_test_lp_test_DEPENDENCIES) $(EXTRA_lp_test_lp_test_DEPENDENCIES) lp_test/$(am__dirstamp) @rm -f lp_test/lp_test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(lp_test_lp_test_OBJECTS) $(lp_test_lp_test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/app_driven_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blas.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky_implicit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky_kernels.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky_models.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lp_resize_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lp_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resize_hierarchical_ctxs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sched_ctx_utils.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< app_driven_test.o: app_driven_test/app_driven_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT app_driven_test.o -MD -MP -MF $(DEPDIR)/app_driven_test.Tpo -c -o app_driven_test.o `test -f 'app_driven_test/app_driven_test.c' || echo '$(srcdir)/'`app_driven_test/app_driven_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/app_driven_test.Tpo $(DEPDIR)/app_driven_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='app_driven_test/app_driven_test.c' object='app_driven_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o app_driven_test.o `test -f 'app_driven_test/app_driven_test.c' || echo '$(srcdir)/'`app_driven_test/app_driven_test.c app_driven_test.obj: app_driven_test/app_driven_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT app_driven_test.obj -MD -MP -MF $(DEPDIR)/app_driven_test.Tpo -c -o app_driven_test.obj `if test -f 'app_driven_test/app_driven_test.c'; then $(CYGPATH_W) 'app_driven_test/app_driven_test.c'; else $(CYGPATH_W) '$(srcdir)/app_driven_test/app_driven_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/app_driven_test.Tpo $(DEPDIR)/app_driven_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='app_driven_test/app_driven_test.c' object='app_driven_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o app_driven_test.obj `if test -f 'app_driven_test/app_driven_test.c'; then $(CYGPATH_W) 'app_driven_test/app_driven_test.c'; else $(CYGPATH_W) '$(srcdir)/app_driven_test/app_driven_test.c'; fi` cholesky_implicit.o: cholesky/cholesky_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_implicit.o -MD -MP -MF $(DEPDIR)/cholesky_implicit.Tpo -c -o cholesky_implicit.o `test -f 'cholesky/cholesky_implicit.c' || echo '$(srcdir)/'`cholesky/cholesky_implicit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_implicit.Tpo $(DEPDIR)/cholesky_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_implicit.c' object='cholesky_implicit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cholesky_implicit.o `test -f 'cholesky/cholesky_implicit.c' || echo '$(srcdir)/'`cholesky/cholesky_implicit.c cholesky_implicit.obj: cholesky/cholesky_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_implicit.obj -MD -MP -MF $(DEPDIR)/cholesky_implicit.Tpo -c -o cholesky_implicit.obj `if test -f 'cholesky/cholesky_implicit.c'; then $(CYGPATH_W) 'cholesky/cholesky_implicit.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_implicit.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_implicit.Tpo $(DEPDIR)/cholesky_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_implicit.c' object='cholesky_implicit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cholesky_implicit.obj `if test -f 'cholesky/cholesky_implicit.c'; then $(CYGPATH_W) 'cholesky/cholesky_implicit.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_implicit.c'; fi` cholesky_models.o: cholesky/cholesky_models.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_models.o -MD -MP -MF $(DEPDIR)/cholesky_models.Tpo -c -o cholesky_models.o `test -f 'cholesky/cholesky_models.c' || echo '$(srcdir)/'`cholesky/cholesky_models.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_models.Tpo $(DEPDIR)/cholesky_models.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_models.c' object='cholesky_models.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cholesky_models.o `test -f 'cholesky/cholesky_models.c' || echo '$(srcdir)/'`cholesky/cholesky_models.c cholesky_models.obj: cholesky/cholesky_models.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_models.obj -MD -MP -MF $(DEPDIR)/cholesky_models.Tpo -c -o cholesky_models.obj `if test -f 'cholesky/cholesky_models.c'; then $(CYGPATH_W) 'cholesky/cholesky_models.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_models.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_models.Tpo $(DEPDIR)/cholesky_models.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_models.c' object='cholesky_models.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cholesky_models.obj `if test -f 'cholesky/cholesky_models.c'; then $(CYGPATH_W) 'cholesky/cholesky_models.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_models.c'; fi` cholesky_kernels.o: cholesky/cholesky_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_kernels.o -MD -MP -MF $(DEPDIR)/cholesky_kernels.Tpo -c -o cholesky_kernels.o `test -f 'cholesky/cholesky_kernels.c' || echo '$(srcdir)/'`cholesky/cholesky_kernels.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_kernels.Tpo $(DEPDIR)/cholesky_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_kernels.c' object='cholesky_kernels.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cholesky_kernels.o `test -f 'cholesky/cholesky_kernels.c' || echo '$(srcdir)/'`cholesky/cholesky_kernels.c cholesky_kernels.obj: cholesky/cholesky_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_kernels.obj -MD -MP -MF $(DEPDIR)/cholesky_kernels.Tpo -c -o cholesky_kernels.obj `if test -f 'cholesky/cholesky_kernels.c'; then $(CYGPATH_W) 'cholesky/cholesky_kernels.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_kernels.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_kernels.Tpo $(DEPDIR)/cholesky_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_kernels.c' object='cholesky_kernels.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cholesky_kernels.obj `if test -f 'cholesky/cholesky_kernels.c'; then $(CYGPATH_W) 'cholesky/cholesky_kernels.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_kernels.c'; fi` sched_ctx_utils.o: sched_ctx_utils/sched_ctx_utils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sched_ctx_utils.o -MD -MP -MF $(DEPDIR)/sched_ctx_utils.Tpo -c -o sched_ctx_utils.o `test -f 'sched_ctx_utils/sched_ctx_utils.c' || echo '$(srcdir)/'`sched_ctx_utils/sched_ctx_utils.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_utils.Tpo $(DEPDIR)/sched_ctx_utils.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx_utils/sched_ctx_utils.c' object='sched_ctx_utils.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sched_ctx_utils.o `test -f 'sched_ctx_utils/sched_ctx_utils.c' || echo '$(srcdir)/'`sched_ctx_utils/sched_ctx_utils.c sched_ctx_utils.obj: sched_ctx_utils/sched_ctx_utils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sched_ctx_utils.obj -MD -MP -MF $(DEPDIR)/sched_ctx_utils.Tpo -c -o sched_ctx_utils.obj `if test -f 'sched_ctx_utils/sched_ctx_utils.c'; then $(CYGPATH_W) 'sched_ctx_utils/sched_ctx_utils.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx_utils/sched_ctx_utils.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_utils.Tpo $(DEPDIR)/sched_ctx_utils.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx_utils/sched_ctx_utils.c' object='sched_ctx_utils.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sched_ctx_utils.obj `if test -f 'sched_ctx_utils/sched_ctx_utils.c'; then $(CYGPATH_W) 'sched_ctx_utils/sched_ctx_utils.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx_utils/sched_ctx_utils.c'; fi` blas.o: ../../examples/common/blas.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT blas.o -MD -MP -MF $(DEPDIR)/blas.Tpo -c -o blas.o `test -f '../../examples/common/blas.c' || echo '$(srcdir)/'`../../examples/common/blas.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/blas.Tpo $(DEPDIR)/blas.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../examples/common/blas.c' object='blas.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o blas.o `test -f '../../examples/common/blas.c' || echo '$(srcdir)/'`../../examples/common/blas.c blas.obj: ../../examples/common/blas.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT blas.obj -MD -MP -MF $(DEPDIR)/blas.Tpo -c -o blas.obj `if test -f '../../examples/common/blas.c'; then $(CYGPATH_W) '../../examples/common/blas.c'; else $(CYGPATH_W) '$(srcdir)/../../examples/common/blas.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/blas.Tpo $(DEPDIR)/blas.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../examples/common/blas.c' object='blas.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o blas.obj `if test -f '../../examples/common/blas.c'; then $(CYGPATH_W) '../../examples/common/blas.c'; else $(CYGPATH_W) '$(srcdir)/../../examples/common/blas.c'; fi` resize_hierarchical_ctxs.o: hierarchical_ctxs/resize_hierarchical_ctxs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT resize_hierarchical_ctxs.o -MD -MP -MF $(DEPDIR)/resize_hierarchical_ctxs.Tpo -c -o resize_hierarchical_ctxs.o `test -f 'hierarchical_ctxs/resize_hierarchical_ctxs.c' || echo '$(srcdir)/'`hierarchical_ctxs/resize_hierarchical_ctxs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/resize_hierarchical_ctxs.Tpo $(DEPDIR)/resize_hierarchical_ctxs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hierarchical_ctxs/resize_hierarchical_ctxs.c' object='resize_hierarchical_ctxs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o resize_hierarchical_ctxs.o `test -f 'hierarchical_ctxs/resize_hierarchical_ctxs.c' || echo '$(srcdir)/'`hierarchical_ctxs/resize_hierarchical_ctxs.c resize_hierarchical_ctxs.obj: hierarchical_ctxs/resize_hierarchical_ctxs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT resize_hierarchical_ctxs.obj -MD -MP -MF $(DEPDIR)/resize_hierarchical_ctxs.Tpo -c -o resize_hierarchical_ctxs.obj `if test -f 'hierarchical_ctxs/resize_hierarchical_ctxs.c'; then $(CYGPATH_W) 'hierarchical_ctxs/resize_hierarchical_ctxs.c'; else $(CYGPATH_W) '$(srcdir)/hierarchical_ctxs/resize_hierarchical_ctxs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/resize_hierarchical_ctxs.Tpo $(DEPDIR)/resize_hierarchical_ctxs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hierarchical_ctxs/resize_hierarchical_ctxs.c' object='resize_hierarchical_ctxs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o resize_hierarchical_ctxs.obj `if test -f 'hierarchical_ctxs/resize_hierarchical_ctxs.c'; then $(CYGPATH_W) 'hierarchical_ctxs/resize_hierarchical_ctxs.c'; else $(CYGPATH_W) '$(srcdir)/hierarchical_ctxs/resize_hierarchical_ctxs.c'; fi` lp_resize_test.o: lp_test/lp_resize_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lp_resize_test.o -MD -MP -MF $(DEPDIR)/lp_resize_test.Tpo -c -o lp_resize_test.o `test -f 'lp_test/lp_resize_test.c' || echo '$(srcdir)/'`lp_test/lp_resize_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lp_resize_test.Tpo $(DEPDIR)/lp_resize_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lp_test/lp_resize_test.c' object='lp_resize_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lp_resize_test.o `test -f 'lp_test/lp_resize_test.c' || echo '$(srcdir)/'`lp_test/lp_resize_test.c lp_resize_test.obj: lp_test/lp_resize_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lp_resize_test.obj -MD -MP -MF $(DEPDIR)/lp_resize_test.Tpo -c -o lp_resize_test.obj `if test -f 'lp_test/lp_resize_test.c'; then $(CYGPATH_W) 'lp_test/lp_resize_test.c'; else $(CYGPATH_W) '$(srcdir)/lp_test/lp_resize_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lp_resize_test.Tpo $(DEPDIR)/lp_resize_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lp_test/lp_resize_test.c' object='lp_resize_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lp_resize_test.obj `if test -f 'lp_test/lp_resize_test.c'; then $(CYGPATH_W) 'lp_test/lp_resize_test.c'; else $(CYGPATH_W) '$(srcdir)/lp_test/lp_resize_test.c'; fi` lp_test.o: lp_test/lp_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lp_test.o -MD -MP -MF $(DEPDIR)/lp_test.Tpo -c -o lp_test.o `test -f 'lp_test/lp_test.c' || echo '$(srcdir)/'`lp_test/lp_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lp_test.Tpo $(DEPDIR)/lp_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lp_test/lp_test.c' object='lp_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lp_test.o `test -f 'lp_test/lp_test.c' || echo '$(srcdir)/'`lp_test/lp_test.c lp_test.obj: lp_test/lp_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lp_test.obj -MD -MP -MF $(DEPDIR)/lp_test.Tpo -c -o lp_test.obj `if test -f 'lp_test/lp_test.c'; then $(CYGPATH_W) 'lp_test/lp_test.c'; else $(CYGPATH_W) '$(srcdir)/lp_test/lp_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lp_test.Tpo $(DEPDIR)/lp_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lp_test/lp_test.c' object='lp_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lp_test.obj `if test -f 'lp_test/lp_test.c'; then $(CYGPATH_W) 'lp_test/lp_test.c'; else $(CYGPATH_W) '$(srcdir)/lp_test/lp_test.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf app_driven_test/.libs app_driven_test/_libs -rm -rf cholesky/.libs cholesky/_libs -rm -rf hierarchical_ctxs/.libs hierarchical_ctxs/_libs -rm -rf lp_test/.libs lp_test/_libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f app_driven_test/$(am__dirstamp) -rm -f cholesky/$(am__dirstamp) -rm -f hierarchical_ctxs/$(am__dirstamp) -rm -f lp_test/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile showcheck: -cat $(TEST_LOGS) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q " runtime error: " $(TEST_LOGS) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.2.3+dfsg/sc_hypervisor/examples/app_driven_test/000077500000000000000000000000001320135501600236515ustar00rootroot00000000000000starpu-1.2.3+dfsg/sc_hypervisor/examples/app_driven_test/app_driven_test.c000066400000000000000000000130421320135501600272030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #define NTASKS 1000 #define NINCR 10 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) struct params { unsigned sched_ctx; int task_tag; }; unsigned val[2]; pthread_mutex_t mut[2]; /* Every implementation of a codelet must have this prototype, the first * argument (buffers) describes the buffers/streams that are managed by the * DSM; the second arguments references read-only data that is passed as an * argument of the codelet (task->cl_arg). Here, "buffers" is unused as there * are no data input/output managed by the DSM (cl.nbuffers = 0) */ void cpu_func(__attribute__((unused))void *buffers[], void *cl_arg) { struct params *params = (struct params *) cl_arg; int i; for(i = 0; i < NINCR; i++) { pthread_mutex_lock(&mut[params->sched_ctx - 1]); val[params->sched_ctx - 1]++; pthread_mutex_unlock(&mut[params->sched_ctx - 1]); } if(params->task_tag != 0) FPRINTF(stdout, "Task with tag %d executed in ctx = %u %u counter_tests\n", params->task_tag, params->sched_ctx, val[params->sched_ctx - 1]); } struct starpu_codelet cl = {0}; /* the management of the tags is done by the user */ /* who will take care that the tags will be unique */ int tag = 1; void* submit_tasks_thread(void *arg) { unsigned sched_ctx = *((unsigned*)arg); starpu_sched_ctx_set_context(&sched_ctx); struct starpu_task *task[NTASKS]; struct params params[NTASKS]; int i; for(i = 0; i < NTASKS; i++) { task[i] = starpu_task_create(); // usleep(5000); cl.cpu_funcs[0] = cpu_func; cl.nbuffers = 0; task[i]->cl = &cl; if(sched_ctx == 1 && i == 5) { /* tag the tasks whose execution will start the resizing process */ task[i]->hypervisor_tag = tag; /* indicate particular settings the context should have when the resizing will be done */ sc_hypervisor_ctl(sched_ctx, SC_HYPERVISOR_TIME_TO_APPLY, tag, SC_HYPERVISOR_MIN_WORKERS, 2, SC_HYPERVISOR_MAX_WORKERS, 12, SC_HYPERVISOR_NULL); printf("require resize for sched_ctx %u at tag %d\n", sched_ctx, tag); /* specify that the contexts should be resized when the task having this particular tag will finish executing */ sc_hypervisor_post_resize_request(sched_ctx, tag); } params[i].sched_ctx = sched_ctx; params[i].task_tag = task[i]->hypervisor_tag; task[i]->cl_arg = ¶ms[i]; task[i]->cl_arg_size = sizeof(params); int ret = starpu_task_submit(task[i]); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_task_wait_for_all(); return NULL; } int main() { int ret = starpu_init(NULL); if (ret == -ENODEV) return 77; int nres1 = 6; int nres2 = 6; int ressources1[nres1]; int ressources2[nres2]; int i; for(i = 0; i < nres1; i++) ressources1[i] = i; for(i = 0; i < nres2; i++) ressources2[i] = nres1+i; /* create contexts */ unsigned sched_ctx1 = starpu_sched_ctx_create(ressources1, nres1, "sched_ctx1", STARPU_SCHED_CTX_POLICY_NAME, "dmda", 0); unsigned sched_ctx2 = starpu_sched_ctx_create(ressources2, nres2, "sched_ctx2", STARPU_SCHED_CTX_POLICY_NAME, "dmda", 0); /* initialize the hypervisor */ struct sc_hypervisor_policy policy; policy.custom = 0; /* indicate which strategy to use in this particular case we use app_driven which allows the user to resize the ctxs dynamically at particular moments of the execution of the application */ policy.name = "app_driven"; void *perf_counters = sc_hypervisor_init(&policy); /* let starpu know which performance counters should use to inform the hypervisor how the application and the resources are executing */ starpu_sched_ctx_set_perf_counters(sched_ctx1, perf_counters); starpu_sched_ctx_set_perf_counters(sched_ctx2, perf_counters); /* register the contexts that should be managed by the hypervisor and indicate an approximate amount of workload if known; in this case we don't know it and we put 0 */ sc_hypervisor_register_ctx(sched_ctx1, 0.0); sc_hypervisor_register_ctx(sched_ctx2, 0.0); starpu_pthread_t tid[2]; val[0] = 0; val[1] = 0; pthread_mutex_init(&mut[0], NULL); pthread_mutex_init(&mut[1], NULL); /* we create two threads to simulate simultaneous submission of tasks */ starpu_pthread_create(&tid[0], NULL, submit_tasks_thread, (void*)&sched_ctx1); starpu_pthread_create(&tid[1], NULL, submit_tasks_thread, (void*)&sched_ctx2); starpu_pthread_join(tid[0], NULL); starpu_pthread_join(tid[1], NULL); /* free starpu and hypervisor data */ starpu_shutdown(); sc_hypervisor_shutdown(); FPRINTF(stdout, "ctx = %u executed %u counter_tests out of %d \n", sched_ctx1, val[0], NTASKS*NINCR); FPRINTF(stdout, "ctx = %u executed %u counter_tests out of %d \n", sched_ctx2, val[1], NTASKS*NINCR); return 0; } starpu-1.2.3+dfsg/sc_hypervisor/examples/cholesky/000077500000000000000000000000001320135501600223045ustar00rootroot00000000000000starpu-1.2.3+dfsg/sc_hypervisor/examples/cholesky/cholesky.h000066400000000000000000000116071320135501600243030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2011, 2013 Université de Bordeaux * Copyright (C) 2010, 2011 CNRS * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DW_CHOLESKY_H__ #define __DW_CHOLESKY_H__ #include #include #include #include #ifdef STARPU_USE_CUDA #include #include #include #endif #include #include #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #define NMAXBLOCKS 32 #define TAG11(k) ((starpu_tag_t)( (1ULL<<60) | (unsigned long long)(k))) #define TAG21(k,j) ((starpu_tag_t)(((3ULL<<60) | (((unsigned long long)(k))<<32) \ | (unsigned long long)(j)))) #define TAG22(k,i,j) ((starpu_tag_t)(((4ULL<<60) | ((unsigned long long)(k)<<32) \ | ((unsigned long long)(i)<<16) \ | (unsigned long long)(j)))) #define TAG11_AUX(k, prefix) ((starpu_tag_t)( (((unsigned long long)(prefix))<<60) | (1ULL<<56) | (unsigned long long)(k))) #define TAG21_AUX(k,j, prefix) ((starpu_tag_t)( (((unsigned long long)(prefix))<<60) \ | ((3ULL<<56) | (((unsigned long long)(k))<<32) \ | (unsigned long long)(j)))) #define TAG22_AUX(k,i,j, prefix) ((starpu_tag_t)( (((unsigned long long)(prefix))<<60) \ | ((4ULL<<56) | ((unsigned long long)(k)<<32) \ | ((unsigned long long)(i)<<16) \ | (unsigned long long)(j)))) #define BLOCKSIZE (size/nblocks) #define BLAS3_FLOP(n1,n2,n3) \ (2*((uint64_t)n1)*((uint64_t)n2)*((uint64_t)n3)) static unsigned size = 4*1024; static unsigned nblocks = 16; static unsigned nbigblocks = 8; static unsigned pinned = 0; static unsigned noprio = 0; static unsigned check = 0; static unsigned bound = 0; static unsigned with_ctxs = 0; static unsigned with_noctxs = 0; static unsigned chole1 = 0; static unsigned chole2 = 0; void chol_cpu_codelet_update_u11(void **, void *); void chol_cpu_codelet_update_u21(void **, void *); void chol_cpu_codelet_update_u22(void **, void *); double cpu_chol_task_11_cost(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl); double cpu_chol_task_21_cost(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl); double cpu_chol_task_22_cost(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl); #ifdef STARPU_USE_CUDA void chol_cublas_codelet_update_u11(void *descr[], void *_args); void chol_cublas_codelet_update_u21(void *descr[], void *_args); void chol_cublas_codelet_update_u22(void *descr[], void *_args); double cuda_chol_task_11_cost(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl); double cuda_chol_task_21_cost(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl); double cuda_chol_task_22_cost(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl); #endif void initialize_chol_model(struct starpu_perfmodel* model, char* symbol, double (*cpu_cost_function)(struct starpu_task *, struct starpu_perfmodel_arch*, unsigned), double (*cuda_cost_function)(struct starpu_task *, struct starpu_perfmodel_arch*, unsigned)); static void STARPU_ATTRIBUTE_UNUSED parse_args(int argc, char **argv) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-with_ctxs") == 0) { with_ctxs = 1; break; } if (strcmp(argv[i], "-with_noctxs") == 0) { with_noctxs = 1; break; } if (strcmp(argv[i], "-chole1") == 0) { chole1 = 1; break; } if (strcmp(argv[i], "-chole2") == 0) { chole2 = 1; break; } if (strcmp(argv[i], "-size") == 0) { char *argptr; size = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-nblocks") == 0) { char *argptr; nblocks = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-nbigblocks") == 0) { char *argptr; nbigblocks = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-pin") == 0) { pinned = 1; } if (strcmp(argv[i], "-no-prio") == 0) { noprio = 1; } if (strcmp(argv[i], "-bound") == 0) { bound = 1; } if (strcmp(argv[i], "-check") == 0) { check = 1; } if (strcmp(argv[i], "-h") == 0) { printf("usage : %s [-pin] [-size size] [-nblocks nblocks] [-check]\n", argv[0]); } } } #endif /* __DW_CHOLESKY_H__ */ starpu-1.2.3+dfsg/sc_hypervisor/examples/cholesky/cholesky_implicit.c000066400000000000000000000224751320135501600261750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2013 CNRS * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "cholesky.h" #include "../sched_ctx_utils/sched_ctx_utils.h" struct starpu_perfmodel chol_model_11; struct starpu_perfmodel chol_model_21; struct starpu_perfmodel chol_model_22; /* * Create the codelets */ static struct starpu_codelet cl11 = { .type = STARPU_SEQ, .cpu_funcs = {chol_cpu_codelet_update_u11}, #ifdef STARPU_USE_CUDA .cuda_funcs = {chol_cublas_codelet_update_u11}, #endif .nbuffers = 1, .modes = {STARPU_RW}, .model = &chol_model_11 }; static struct starpu_codelet cl21 = { .type = STARPU_SEQ, .cpu_funcs = {chol_cpu_codelet_update_u21}, #ifdef STARPU_USE_CUDA .cuda_funcs = {chol_cublas_codelet_update_u21}, #endif .nbuffers = 2, .modes = {STARPU_R, STARPU_RW}, .model = &chol_model_21 }; static struct starpu_codelet cl22 = { .type = STARPU_SEQ, .max_parallelism = INT_MAX, .cpu_funcs = {chol_cpu_codelet_update_u22}, #ifdef STARPU_USE_CUDA .cuda_funcs = {chol_cublas_codelet_update_u22}, #endif .nbuffers = 3, .modes = {STARPU_R, STARPU_R, STARPU_RW}, .model = &chol_model_22 }; /* * code to bootstrap the factorization * and construct the DAG */ static void callback_turn_spmd_on(void *arg STARPU_ATTRIBUTE_UNUSED) { cl22.type = STARPU_SPMD; } int hypervisor_tag = 1; static void _cholesky(starpu_data_handle_t dataA, unsigned nblocks) { int ret; struct timeval start; struct timeval end; unsigned i,j,k; int prio_level = noprio?STARPU_DEFAULT_PRIO:STARPU_MAX_PRIO; gettimeofday(&start, NULL); if (bound) starpu_bound_start(0, 0); /* create all the DAG nodes */ for (k = 0; k < nblocks; k++) { starpu_data_handle_t sdatakk = starpu_data_get_sub_data(dataA, 2, k, k); if(k == 0 && with_ctxs) { ret = starpu_task_insert(&cl11, STARPU_PRIORITY, prio_level, STARPU_RW, sdatakk, STARPU_CALLBACK, (k == 3*nblocks/4)?callback_turn_spmd_on:NULL, STARPU_HYPERVISOR_TAG, hypervisor_tag, 0); set_hypervisor_conf(START_BENCH, hypervisor_tag++); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); } else starpu_task_insert(&cl11, STARPU_PRIORITY, prio_level, STARPU_RW, sdatakk, STARPU_CALLBACK, (k == 3*nblocks/4)?callback_turn_spmd_on:NULL, 0); for (j = k+1; j j) { mat[j+i*size] = 0.0f; /* debug */ } } } float *test_mat = malloc(size*size*sizeof(float)); STARPU_ASSERT(test_mat); STARPU_SSYRK("L", "N", size, size, 1.0f, mat, size, 0.0f, test_mat, size); FPRINTF(stderr, "comparing results ...\n"); #ifdef PRINT_OUTPUT for (j = 0; j < size; j++) { for (i = 0; i < size; i++) { if (i <= j) { FPRINTF(stdout, "%2.2f\t", test_mat[j +i*size]); } else { FPRINTF(stdout, ".\t"); } } FPRINTF(stdout, "\n"); } #endif for (j = 0; j < size; j++) { for (i = 0; i < size; i++) { if (i <= j) { float orig = (1.0f/(1.0f+i+j)) + ((i == j)?1.0f*size:0.0f); float err = abs(test_mat[j +i*size] - orig); if (err > 0.00001) { FPRINTF(stderr, "Error[%u, %u] --> %2.2f != %2.2f (err %2.2f)\n", i, j, test_mat[j +i*size], orig, err); assert(0); } } } } free(test_mat); } starpu_free(mat); } int main(int argc, char **argv) { /* create a simple definite positive symetric matrix example * * Hilbert matrix : h(i,j) = 1/(i+j+1) * */ parse_args(argc, argv); if(with_ctxs || with_noctxs || chole1 || chole2) parse_args_ctx(argc, argv); starpu_init(NULL); #ifdef STARPU_USE_CUDA initialize_chol_model(&chol_model_11,"chol_model_11",cpu_chol_task_11_cost,cuda_chol_task_11_cost); initialize_chol_model(&chol_model_21,"chol_model_21",cpu_chol_task_21_cost,cuda_chol_task_21_cost); initialize_chol_model(&chol_model_22,"chol_model_22",cpu_chol_task_22_cost,cuda_chol_task_22_cost); #else initialize_chol_model(&chol_model_11,"chol_model_11",cpu_chol_task_11_cost,NULL); initialize_chol_model(&chol_model_21,"chol_model_21",cpu_chol_task_21_cost,NULL); initialize_chol_model(&chol_model_22,"chol_model_22",cpu_chol_task_22_cost,NULL); #endif starpu_cublas_init(); if(with_ctxs) { construct_contexts(execute_cholesky); start_2benchs(execute_cholesky); } else if(with_noctxs) start_2benchs(execute_cholesky); else if(chole1) start_1stbench(execute_cholesky); else if(chole2) start_2ndbench(execute_cholesky); else execute_cholesky(size, nblocks); starpu_cublas_shutdown(); starpu_shutdown(); if(with_ctxs) end_contexts(); return 0; } starpu-1.2.3+dfsg/sc_hypervisor/examples/cholesky/cholesky_kernels.c000066400000000000000000000141161320135501600260170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2011 Université de Bordeaux * Copyright (C) 2010, 2011 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "cholesky.h" //#include "../common/blas.h" #ifdef STARPU_USE_CUDA #include #ifdef STARPU_HAVE_MAGMA #include "magma.h" #include "magma_lapack.h" #endif #endif /* * U22 */ static inline void chol_common_cpu_codelet_update_u22(void *descr[], int s, STARPU_ATTRIBUTE_UNUSED void *_args) { /* printf("22\n"); */ float *left = (float *)STARPU_MATRIX_GET_PTR(descr[0]); float *right = (float *)STARPU_MATRIX_GET_PTR(descr[1]); float *center = (float *)STARPU_MATRIX_GET_PTR(descr[2]); unsigned dx = STARPU_MATRIX_GET_NY(descr[2]); unsigned dy = STARPU_MATRIX_GET_NX(descr[2]); unsigned dz = STARPU_MATRIX_GET_NY(descr[0]); unsigned ld21 = STARPU_MATRIX_GET_LD(descr[0]); unsigned ld12 = STARPU_MATRIX_GET_LD(descr[1]); unsigned ld22 = STARPU_MATRIX_GET_LD(descr[2]); if (s == 0) { int worker_size = starpu_combined_worker_get_size(); if (worker_size == 1) { /* Sequential CPU kernel */ STARPU_SGEMM("N", "T", dy, dx, dz, -1.0f, left, ld21, right, ld12, 1.0f, center, ld22); } else { /* Parallel CPU kernel */ int rank = starpu_combined_worker_get_rank(); int block_size = (dx + worker_size - 1)/worker_size; int new_dx = STARPU_MIN(dx, block_size*(rank+1)) - block_size*rank; float *new_left = &left[block_size*rank]; float *new_center = ¢er[block_size*rank]; STARPU_SGEMM("N", "T", dy, new_dx, dz, -1.0f, new_left, ld21, right, ld12, 1.0f, new_center, ld22); } } else { /* CUDA kernel */ #ifdef STARPU_USE_CUDA cublasSgemm('n', 't', dy, dx, dz, -1.0f, left, ld21, right, ld12, 1.0f, center, ld22); cudaStreamSynchronize(starpu_cuda_get_local_stream()); #endif } } void chol_cpu_codelet_update_u22(void *descr[], void *_args) { chol_common_cpu_codelet_update_u22(descr, 0, _args); } #ifdef STARPU_USE_CUDA void chol_cublas_codelet_update_u22(void *descr[], void *_args) { chol_common_cpu_codelet_update_u22(descr, 1, _args); } #endif /* STARPU_USE_CUDA */ /* * U21 */ static inline void chol_common_codelet_update_u21(void *descr[], int s, STARPU_ATTRIBUTE_UNUSED void *_args) { /* printf("21\n"); */ float *sub11; float *sub21; sub11 = (float *)STARPU_MATRIX_GET_PTR(descr[0]); sub21 = (float *)STARPU_MATRIX_GET_PTR(descr[1]); unsigned ld11 = STARPU_MATRIX_GET_LD(descr[0]); unsigned ld21 = STARPU_MATRIX_GET_LD(descr[1]); unsigned nx21 = STARPU_MATRIX_GET_NY(descr[1]); unsigned ny21 = STARPU_MATRIX_GET_NX(descr[1]); switch (s) { case 0: STARPU_STRSM("R", "L", "T", "N", nx21, ny21, 1.0f, sub11, ld11, sub21, ld21); break; #ifdef STARPU_USE_CUDA case 1: cublasStrsm('R', 'L', 'T', 'N', nx21, ny21, 1.0f, sub11, ld11, sub21, ld21); cudaStreamSynchronize(starpu_cuda_get_local_stream()); break; #endif default: STARPU_ABORT(); break; } } void chol_cpu_codelet_update_u21(void *descr[], void *_args) { chol_common_codelet_update_u21(descr, 0, _args); } #ifdef STARPU_USE_CUDA void chol_cublas_codelet_update_u21(void *descr[], void *_args) { chol_common_codelet_update_u21(descr, 1, _args); } #endif /* * U11 */ static inline void chol_common_codelet_update_u11(void *descr[], int s, STARPU_ATTRIBUTE_UNUSED void *_args) { /* printf("11\n"); */ float *sub11; sub11 = (float *)STARPU_MATRIX_GET_PTR(descr[0]); unsigned nx = STARPU_MATRIX_GET_NY(descr[0]); unsigned ld = STARPU_MATRIX_GET_LD(descr[0]); unsigned z; switch (s) { case 0: /* * - alpha 11 <- lambda 11 = sqrt(alpha11) * - alpha 21 <- l 21 = alpha 21 / lambda 11 * - A22 <- A22 - l21 trans(l21) */ for (z = 0; z < nx; z++) { float lambda11; lambda11 = sqrt(sub11[z+z*ld]); sub11[z+z*ld] = lambda11; STARPU_ASSERT(lambda11 != 0.0f); STARPU_SSCAL(nx - z - 1, 1.0f/lambda11, &sub11[(z+1)+z*ld], 1); STARPU_SSYR("L", nx - z - 1, -1.0f, &sub11[(z+1)+z*ld], 1, &sub11[(z+1)+(z+1)*ld], ld); } break; #ifdef STARPU_USE_CUDA case 1: #ifdef STARPU_HAVE_MAGMA { int ret; int info; ret = magma_spotrf_gpu('L', nx, sub11, ld, &info); if (ret != MAGMA_SUCCESS) { fprintf(stderr, "Error in Magma: %d\n", ret); STARPU_ABORT(); } cudaError_t cures = cudaThreadSynchronize(); STARPU_ASSERT(!cures); } #else { float *lambda11; cudaHostAlloc((void **)&lambda11, sizeof(float), 0); for (z = 0; z < nx; z++) { cudaMemcpyAsync(lambda11, &sub11[z+z*ld], sizeof(float), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); STARPU_ASSERT(*lambda11 != 0.0f); *lambda11 = sqrt(*lambda11); /* cublasSetVector(1, sizeof(float), lambda11, sizeof(float), &sub11[z+z*ld], sizeof(float)); */ cudaMemcpyAsync(&sub11[z+z*ld], lambda11, sizeof(float), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); cublasSscal(nx - z - 1, 1.0f/(*lambda11), &sub11[(z+1)+z*ld], 1); cublasSsyr('U', nx - z - 1, -1.0f, &sub11[(z+1)+z*ld], 1, &sub11[(z+1)+(z+1)*ld], ld); } cudaStreamSynchronize(starpu_cuda_get_local_stream()); cudaFreeHost(lambda11); } #endif break; #endif default: STARPU_ABORT(); break; } } void chol_cpu_codelet_update_u11(void *descr[], void *_args) { chol_common_codelet_update_u11(descr, 0, _args); } #ifdef STARPU_USE_CUDA void chol_cublas_codelet_update_u11(void *descr[], void *_args) { chol_common_codelet_update_u11(descr, 1, _args); } #endif/* STARPU_USE_CUDA */ starpu-1.2.3+dfsg/sc_hypervisor/examples/cholesky/cholesky_models.c000066400000000000000000000101761320135501600256410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015 CNRS * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * As a convention, in that file, buffers[0] is represented by A, * buffers[1] is B ... */ /* * Number of flops of Gemm */ #include #include #include "cholesky.h" /* #define USE_PERTURBATION 1 */ #ifdef USE_PERTURBATION #define PERTURBATE(a) ((starpu_drand48()*2.0f*(AMPL) + 1.0f - (AMPL))*(a)) #else #define PERTURBATE(a) (a) #endif double cpu_chol_task_11_cost(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { uint32_t n; n = starpu_matrix_get_nx(task->handles[0]); double cost = (((double)(n)*n*n)/1000.0f*0.894/0.79176); #ifdef STARPU_MODEL_DEBUG FPRINTF(stdout, "cpu_chol_task_11_cost n %d cost %e\n", n, cost); #endif return PERTURBATE(cost); } double cuda_chol_task_11_cost(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { uint32_t n; n = starpu_matrix_get_nx(task->handles[0]); double cost = (((double)(n)*n*n)/50.0f/10.75/5.088633/0.9883); #ifdef STARPU_MODEL_DEBUG FPRINTF(stdout, "cuda_chol_task_11_cost n %d cost %e\n", n, cost); #endif return PERTURBATE(cost); } double cpu_chol_task_21_cost(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { uint32_t n; n = starpu_matrix_get_nx(task->handles[0]); double cost = (((double)(n)*n*n)/7706.674/0.95/0.9965); #ifdef STARPU_MODEL_DEBUG FPRINTF(stdout, "cpu_chol_task_21_cost n %d cost %e\n", n, cost); #endif return PERTURBATE(cost); } double cuda_chol_task_21_cost(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { uint32_t n; n = starpu_matrix_get_nx(task->handles[0]); double cost = (((double)(n)*n*n)/50.0f/10.75/87.29520); #ifdef STARPU_MODEL_DEBUG FPRINTF(stdout, "cuda_chol_task_21_cost n %d cost %e\n", n, cost); #endif return PERTURBATE(cost); } double cpu_chol_task_22_cost(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { uint32_t n; n = starpu_matrix_get_nx(task->handles[0]); double cost = (((double)(n)*n*n)/50.0f/10.75/8.0760); #ifdef STARPU_MODEL_DEBUG FPRINTF(stdout, "cpu_chol_task_22_cost n %d cost %e\n", n, cost); #endif return PERTURBATE(cost); } double cuda_chol_task_22_cost(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { uint32_t n; n = starpu_matrix_get_nx(task->handles[0]); double cost = (((double)(n)*n*n)/50.0f/10.75/76.30666); #ifdef STARPU_MODEL_DEBUG FPRINTF(stdout, "cuda_chol_task_22_cost n %d cost %e\n", n, cost); #endif return PERTURBATE(cost); } void initialize_chol_model(struct starpu_perfmodel* model, char * symbol, double (*cpu_cost_function)(struct starpu_task *, struct starpu_perfmodel_arch*, unsigned), double (*cuda_cost_function)(struct starpu_task *, struct starpu_perfmodel_arch*, unsigned)) { struct starpu_perfmodel_per_arch *per_arch; model->symbol = symbol; model->type = STARPU_HISTORY_BASED; starpu_perfmodel_init(model); per_arch = starpu_perfmodel_get_model_per_devices(model, 0, STARPU_CPU_WORKER, 0, 1, -1); per_arch->cost_function = cpu_cost_function; // We could also call directly: // starpu_perfmodel_set_per_devices_cost_function(model, 0, cpu_cost_function, STARPU_CPU_WORKER, 0, 1, -1); if(starpu_worker_get_count_by_type(STARPU_CUDA_WORKER) != 0) { per_arch = starpu_perfmodel_get_model_per_devices(model, 0, STARPU_CUDA_WORKER, 0, 1, -1); per_arch->cost_function = cuda_cost_function; } } starpu-1.2.3+dfsg/sc_hypervisor/examples/hierarchical_ctxs/000077500000000000000000000000001320135501600241425ustar00rootroot00000000000000starpu-1.2.3+dfsg/sc_hypervisor/examples/hierarchical_ctxs/resize_hierarchical_ctxs.c000066400000000000000000000131371320135501600313530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #define NTASKS 1000 #define NINCR 10 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) unsigned val[3]; pthread_mutex_t mut[3]; /* Every implementation of a codelet must have this prototype, the first * argument (buffers) describes the buffers/streams that are managed by the * DSM; the second arguments references read-only data that is passed as an * argument of the codelet (task->cl_arg). Here, "buffers" is unused as there * are no data input/output managed by the DSM (cl.nbuffers = 0) */ void cpu_func(__attribute__((unused))void *buffers[], void *cl_arg) { unsigned sched_ctx = *((unsigned *) cl_arg); int i; for(i = 0; i < NINCR; i++) { pthread_mutex_lock(&mut[sched_ctx - 1]); val[sched_ctx - 1]++; pthread_mutex_unlock(&mut[sched_ctx - 1]); } } struct starpu_codelet cl = {0}; void* submit_tasks_thread(void *arg) { unsigned sched_ctx = *((unsigned*)arg); starpu_sched_ctx_set_context(&sched_ctx); struct starpu_task *task[NTASKS]; int i; for(i = 0; i < NTASKS; i++) { task[i] = starpu_task_create(); cl.cpu_funcs[0] = cpu_func; cl.nbuffers = 0; task[i]->cl = &cl; task[i]->cl_arg = &sched_ctx; task[i]->cl_arg_size = sizeof(unsigned); task[i]->flops = NINCR*1000000000.0; int ret = starpu_task_submit(task[i]); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); if(i == NTASKS/2) sc_hypervisor_resize_ctxs(NULL, -1, NULL, -1); } starpu_task_wait_for_all(); return NULL; } int main() { int ret = starpu_init(NULL); if (ret == -ENODEV) return 77; /* create contexts */ unsigned sched_ctx1 = starpu_sched_ctx_create(NULL, 0, "sched_ctx1", STARPU_SCHED_CTX_POLICY_NAME, "dmda", STARPU_SCHED_CTX_HIERARCHY_LEVEL, 0, 0); unsigned sched_ctx2 = starpu_sched_ctx_create(NULL, 0, "sched_ctx2", STARPU_SCHED_CTX_POLICY_NAME, "dmda", STARPU_SCHED_CTX_HIERARCHY_LEVEL, 1, 0); unsigned sched_ctx3 = starpu_sched_ctx_create(NULL, 0, "sched_ctx3", STARPU_SCHED_CTX_POLICY_NAME, "dmda", STARPU_SCHED_CTX_HIERARCHY_LEVEL, 1, 0); starpu_sched_ctx_set_inheritor(sched_ctx2, sched_ctx1); starpu_sched_ctx_set_inheritor(sched_ctx3, sched_ctx1); /* initialize the hypervisor */ struct sc_hypervisor_policy policy; policy.custom = 0; /* indicate which strategy to use in this particular case we use app_driven which allows the user to resize the ctxs dynamically at particular moments of the execution of the application */ policy.name = "feft_lp"; void *perf_counters = sc_hypervisor_init(&policy); /* let starpu know which performance counters should use to inform the hypervisor how the application and the resources are executing */ starpu_sched_ctx_set_perf_counters(sched_ctx1, perf_counters); starpu_sched_ctx_set_perf_counters(sched_ctx2, perf_counters); starpu_sched_ctx_set_perf_counters(sched_ctx3, perf_counters); double flops1 = NTASKS*NINCR*1000000000.0; double flops2 = NTASKS*NINCR*1000000000.0; double flops3 = NTASKS*NINCR*1000000000.0; /* register the contexts that should be managed by the hypervisor and indicate an approximate amount of workload if known; in this case we don't know it and we put 0 */ sc_hypervisor_register_ctx(sched_ctx1, flops1); sc_hypervisor_register_ctx(sched_ctx2, flops2); sc_hypervisor_register_ctx(sched_ctx3, flops3); unsigned ncpus = starpu_cpu_worker_get_count(); sc_hypervisor_ctl(sched_ctx1, SC_HYPERVISOR_MAX_WORKERS, ncpus, SC_HYPERVISOR_NULL); sc_hypervisor_ctl(sched_ctx2, SC_HYPERVISOR_MAX_WORKERS, ncpus, SC_HYPERVISOR_NULL); sc_hypervisor_ctl(sched_ctx3, SC_HYPERVISOR_MAX_WORKERS, ncpus, SC_HYPERVISOR_NULL); /* lp strategy allows sizing the contexts because we know the total number of flops to be executed */ sc_hypervisor_size_ctxs(NULL, -1, NULL, -1); starpu_pthread_t tid[3]; val[0] = 0; val[1] = 0; val[2] = 0; pthread_mutex_init(&mut[0], NULL); pthread_mutex_init(&mut[1], NULL); pthread_mutex_init(&mut[2], NULL); /* we create two threads to simulate simultaneous submission of tasks */ starpu_pthread_create(&tid[0], NULL, submit_tasks_thread, (void*)&sched_ctx1); starpu_pthread_create(&tid[1], NULL, submit_tasks_thread, (void*)&sched_ctx2); starpu_pthread_create(&tid[2], NULL, submit_tasks_thread, (void*)&sched_ctx3); starpu_pthread_join(tid[0], NULL); starpu_pthread_join(tid[1], NULL); starpu_pthread_join(tid[2], NULL); /* free starpu and hypervisor data */ starpu_shutdown(); sc_hypervisor_shutdown(); FPRINTF(stdout, "ctx = %u executed %u counter_tests out of %d \n", sched_ctx1, val[0], NTASKS*NINCR); FPRINTF(stdout, "ctx = %u executed %u counter_tests out of %d \n", sched_ctx2, val[1], NTASKS*NINCR); FPRINTF(stdout, "ctx = %u executed %u counter_tests out of %d \n", sched_ctx3, val[2], NTASKS*NINCR); return 0; } starpu-1.2.3+dfsg/sc_hypervisor/examples/lp_test/000077500000000000000000000000001320135501600221355ustar00rootroot00000000000000starpu-1.2.3+dfsg/sc_hypervisor/examples/lp_test/lp_resize_test.c000066400000000000000000000110161320135501600253330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #define NTASKS 1000 #define NINCR 10 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) unsigned val[2]; pthread_mutex_t mut[2]; /* Every implementation of a codelet must have this prototype, the first * argument (buffers) describes the buffers/streams that are managed by the * DSM; the second arguments references read-only data that is passed as an * argument of the codelet (task->cl_arg). Here, "buffers" is unused as there * are no data input/output managed by the DSM (cl.nbuffers = 0) */ void cpu_func(__attribute__((unused))void *buffers[], void *cl_arg) { unsigned sched_ctx = *((unsigned *) cl_arg); int i; for(i = 0; i < NINCR; i++) { pthread_mutex_lock(&mut[sched_ctx - 1]); val[sched_ctx - 1]++; pthread_mutex_unlock(&mut[sched_ctx - 1]); } } struct starpu_codelet cl = {0}; void* submit_tasks_thread(void *arg) { unsigned sched_ctx = *((unsigned*)arg); starpu_sched_ctx_set_context(&sched_ctx); struct starpu_task *task[NTASKS]; int i; for(i = 0; i < NTASKS; i++) { task[i] = starpu_task_create(); cl.cpu_funcs[0] = cpu_func; cl.nbuffers = 0; task[i]->cl = &cl; task[i]->cl_arg = &sched_ctx; task[i]->cl_arg_size = sizeof(unsigned); task[i]->flops = NINCR*1000000000.0; int ret = starpu_task_submit(task[i]); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); if(i == NTASKS/2) sc_hypervisor_resize_ctxs(NULL, -1, NULL, -1); } starpu_task_wait_for_all(); return NULL; } int main() { int ret = starpu_init(NULL); if (ret == -ENODEV) return 77; /* create contexts */ unsigned sched_ctx1 = starpu_sched_ctx_create(NULL, 0, "sched_ctx1", STARPU_SCHED_CTX_POLICY_NAME, "dmda", 0); unsigned sched_ctx2 = starpu_sched_ctx_create(NULL, 0, "sched_ctx2", STARPU_SCHED_CTX_POLICY_NAME, "dmda", 0); /* initialize the hypervisor */ struct sc_hypervisor_policy policy; policy.custom = 0; /* indicate which strategy to use in this particular case we use app_driven which allows the user to resize the ctxs dynamically at particular moments of the execution of the application */ policy.name = "feft_lp"; void *perf_counters = sc_hypervisor_init(&policy); /* let starpu know which performance counters should use to inform the hypervisor how the application and the resources are executing */ starpu_sched_ctx_set_perf_counters(sched_ctx1, perf_counters); starpu_sched_ctx_set_perf_counters(sched_ctx2, perf_counters); double flops1 = NTASKS*NINCR*1000000000.0; double flops2 = NTASKS*NINCR*1000000000.0; /* register the contexts that should be managed by the hypervisor and indicate an approximate amount of workload if known; in this case we don't know it and we put 0 */ sc_hypervisor_register_ctx(sched_ctx1, flops1); sc_hypervisor_register_ctx(sched_ctx2, flops2); /* lp strategy allows sizing the contexts because we know the total number of flops to be executed */ sc_hypervisor_size_ctxs(NULL, -1, NULL, -1); starpu_pthread_t tid[2]; val[0] = 0; val[1] = 0; pthread_mutex_init(&mut[0], NULL); pthread_mutex_init(&mut[1], NULL); /* we create two threads to simulate simultaneous submission of tasks */ starpu_pthread_create(&tid[0], NULL, submit_tasks_thread, (void*)&sched_ctx1); starpu_pthread_create(&tid[1], NULL, submit_tasks_thread, (void*)&sched_ctx2); starpu_pthread_join(tid[0], NULL); starpu_pthread_join(tid[1], NULL); /* free starpu and hypervisor data */ starpu_shutdown(); sc_hypervisor_shutdown(); FPRINTF(stdout, "ctx = %u executed %u counter_tests out of %d \n", sched_ctx1, val[0], NTASKS*NINCR); FPRINTF(stdout, "ctx = %u executed %u counter_tests out of %d \n", sched_ctx2, val[1], NTASKS*NINCR); return 0; } starpu-1.2.3+dfsg/sc_hypervisor/examples/lp_test/lp_test.c000066400000000000000000000107111320135501600237530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #define NTASKS 1000 #define NINCR 10 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) unsigned val[2]; pthread_mutex_t mut[2]; /* Every implementation of a codelet must have this prototype, the first * argument (buffers) describes the buffers/streams that are managed by the * DSM; the second arguments references read-only data that is passed as an * argument of the codelet (task->cl_arg). Here, "buffers" is unused as there * are no data input/output managed by the DSM (cl.nbuffers = 0) */ void cpu_func(__attribute__((unused))void *buffers[], void *cl_arg) { unsigned sched_ctx = *((unsigned *) cl_arg); int i; for(i = 0; i < NINCR; i++) { pthread_mutex_lock(&mut[sched_ctx - 1]); val[sched_ctx - 1]++; pthread_mutex_unlock(&mut[sched_ctx - 1]); } } struct starpu_codelet cl = {0}; void* submit_tasks_thread(void *arg) { unsigned sched_ctx = *((unsigned*)arg); starpu_sched_ctx_set_context(&sched_ctx); struct starpu_task *task[NTASKS]; int i; for(i = 0; i < NTASKS; i++) { task[i] = starpu_task_create(); cl.cpu_funcs[0] = cpu_func; cl.nbuffers = 0; task[i]->cl = &cl; task[i]->cl_arg = &sched_ctx; task[i]->cl_arg_size = sizeof(unsigned); task[i]->flops = NINCR*1000000000.0; int ret = starpu_task_submit(task[i]); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_task_wait_for_all(); return NULL; } int main() { int ret = starpu_init(NULL); if (ret == -ENODEV) return 77; /* create contexts */ unsigned sched_ctx1 = starpu_sched_ctx_create(NULL, 0, "sched_ctx1", STARPU_SCHED_CTX_POLICY_NAME, "dmda", 0); unsigned sched_ctx2 = starpu_sched_ctx_create(NULL, 0, "sched_ctx2", STARPU_SCHED_CTX_POLICY_NAME, "dmda", 0); /* initialize the hypervisor */ struct sc_hypervisor_policy policy; policy.custom = 0; /* indicate which strategy to use in this particular case we use app_driven which allows the user to resize the ctxs dynamically at particular moments of the execution of the application */ policy.name = "feft_lp"; void *perf_counters = sc_hypervisor_init(&policy); /* let starpu know which performance counters should use to inform the hypervisor how the application and the resources are executing */ starpu_sched_ctx_set_perf_counters(sched_ctx1, perf_counters); starpu_sched_ctx_set_perf_counters(sched_ctx2, perf_counters); double flops1 = NTASKS*NINCR*1000000000.0; double flops2 = NTASKS*NINCR*1000000000.0; /* register the contexts that should be managed by the hypervisor and indicate an approximate amount of workload if known; in this case we don't know it and we put 0 */ sc_hypervisor_register_ctx(sched_ctx1, flops1); sc_hypervisor_register_ctx(sched_ctx2, flops2); /* lp strategy allows sizing the contexts because we know the total number of flops to be executed */ sc_hypervisor_size_ctxs(NULL, -1, NULL, -1); starpu_pthread_t tid[2]; val[0] = 0; val[1] = 0; pthread_mutex_init(&mut[0], NULL); pthread_mutex_init(&mut[1], NULL); /* we create two threads to simulate simultaneous submission of tasks */ starpu_pthread_create(&tid[0], NULL, submit_tasks_thread, (void*)&sched_ctx1); starpu_pthread_create(&tid[1], NULL, submit_tasks_thread, (void*)&sched_ctx2); starpu_pthread_join(tid[0], NULL); starpu_pthread_join(tid[1], NULL); /* free starpu and hypervisor data */ starpu_shutdown(); sc_hypervisor_shutdown(); FPRINTF(stdout, "ctx = %u executed %u counter_tests out of %d \n", sched_ctx1, val[0], NTASKS*NINCR); FPRINTF(stdout, "ctx = %u executed %u counter_tests out of %d \n", sched_ctx2, val[1], NTASKS*NINCR); return 0; } starpu-1.2.3+dfsg/sc_hypervisor/examples/sched_ctx_utils/000077500000000000000000000000001320135501600236475ustar00rootroot00000000000000starpu-1.2.3+dfsg/sc_hypervisor/examples/sched_ctx_utils/sched_ctx_utils.c000066400000000000000000000322421320135501600272020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "sched_ctx_utils.h" #include #include "sc_hypervisor.h" #define NSAMPLES 3 unsigned size1; unsigned size2; unsigned nblocks1; unsigned nblocks2; unsigned cpu1; unsigned cpu2; unsigned gpu; unsigned gpu1; unsigned gpu2; typedef struct { unsigned id; unsigned ctx; int the_other_ctx; int *workers; int nworkers; void (*bench)(float*, unsigned, unsigned); unsigned size; unsigned nblocks; float *mat[NSAMPLES]; } params; typedef struct { double flops; double avg_timing; } retvals; int first = 1; starpu_pthread_mutex_t mut; retvals rv[2]; params p1, p2; int it = 0; int it2 = 0; starpu_pthread_key_t key; void init() { size1 = 4*1024; size2 = 4*1024; nblocks1 = 16; nblocks2 = 16; cpu1 = 0; cpu2 = 0; gpu = 0; gpu1 = 0; gpu2 = 0; rv[0].flops = 0.0; rv[1].flops = 0.0; rv[1].avg_timing = 0.0; rv[1].avg_timing = 0.0; p1.ctx = 0; p2.ctx = 0; p1.id = 0; p2.id = 1; starpu_pthread_key_create(&key, NULL); } void update_sched_ctx_timing_results(double flops, double avg_timing) { unsigned *id = starpu_pthread_getspecific(key); rv[*id].flops += flops; rv[*id].avg_timing += avg_timing; } void* start_bench(void *val) { params *p = (params*)val; int i; starpu_pthread_setspecific(key, &p->id); if(p->ctx != 0) starpu_sched_ctx_set_context(&p->ctx); for(i = 0; i < NSAMPLES; i++) p->bench(p->mat[i], p->size, p->nblocks); /* if(p->ctx != 0) */ /* { */ /* starpu_pthread_mutex_lock(&mut); */ /* if(first){ */ /* sc_hypervisor_unregiser_ctx(p->ctx); */ /* starpu_sched_ctx_delete(p->ctx, p->the_other_ctx); */ /* } */ /* first = 0; */ /* starpu_pthread_mutex_unlock(&mut); */ /* } */ sc_hypervisor_stop_resize(p->the_other_ctx); rv[p->id].flops /= NSAMPLES; rv[p->id].avg_timing /= NSAMPLES; return NULL; } float* construct_matrix(unsigned size) { float *mat; starpu_malloc((void **)&mat, (size_t)size*size*sizeof(float)); unsigned i,j; for (i = 0; i < size; i++) { for (j = 0; j < size; j++) { mat[j +i*size] = (1.0f/(1.0f+i+j)) + ((i == j)?1.0f*size:0.0f); /* mat[j +i*size] = ((i == j)?1.0f*size:0.0f); */ } } return mat; } void start_2benchs(void (*bench)(float*, unsigned, unsigned)) { p1.bench = bench; p1.size = size1; p1.nblocks = nblocks1; p2.bench = bench; p2.size = size2; p2.nblocks = nblocks2; int i; for(i = 0; i < NSAMPLES; i++) { p1.mat[i] = construct_matrix(p1.size); p2.mat[i] = construct_matrix(p2.size); } starpu_pthread_t tid[2]; starpu_pthread_mutex_init(&mut, NULL); struct timeval start; struct timeval end; gettimeofday(&start, NULL); starpu_pthread_create(&tid[0], NULL, (void*)start_bench, (void*)&p1); starpu_pthread_create(&tid[1], NULL, (void*)start_bench, (void*)&p2); starpu_pthread_join(tid[0], NULL); starpu_pthread_join(tid[1], NULL); gettimeofday(&end, NULL); starpu_pthread_mutex_destroy(&mut); double timing = (double)((end.tv_sec - start.tv_sec)*1000000 + (end.tv_usec - start.tv_usec)); timing /= 1000000; printf("%2.2f %2.2f ", rv[0].flops, rv[1].flops); printf("%2.2f %2.2f %2.2f\n", rv[0].avg_timing, rv[1].avg_timing, timing); } void start_1stbench(void (*bench)(float*, unsigned, unsigned)) { p1.bench = bench; p1.size = size1; p1.nblocks = nblocks1; int i; for(i = 0; i < NSAMPLES; i++) { p1.mat[i] = construct_matrix(p1.size); } struct timeval start; struct timeval end; gettimeofday(&start, NULL); start_bench((void*)&p1); gettimeofday(&end, NULL); starpu_pthread_mutex_destroy(&mut); double timing = (double)((end.tv_sec - start.tv_sec)*1000000 + (end.tv_usec - start.tv_usec)); timing /= 1000000; printf("%2.2f ", rv[0].flops); printf("%2.2f %2.2f\n", rv[0].avg_timing, timing); } void start_2ndbench(void (*bench)(float*, unsigned, unsigned)) { p2.bench = bench; p2.size = size2; p2.nblocks = nblocks2; int i; for(i = 0; i < NSAMPLES; i++) { p2.mat[i] = construct_matrix(p2.size); } struct timeval start; struct timeval end; gettimeofday(&start, NULL); start_bench((void*)&p2); gettimeofday(&end, NULL); starpu_pthread_mutex_destroy(&mut); double timing = (double)((end.tv_sec - start.tv_sec)*1000000 + (end.tv_usec - start.tv_usec)); timing /= 1000000; printf("%2.2f ", rv[1].flops); printf("%2.2f %2.2f\n", rv[1].avg_timing, timing); } void construct_contexts(void (*bench)(float*, unsigned, unsigned)) { struct sc_hypervisor_policy policy; policy.custom = 0; policy.name = "idle"; void *perf_counters = sc_hypervisor_init(&policy); int nworkers1 = cpu1 + gpu + gpu1; int nworkers2 = cpu2 + gpu + gpu2; unsigned n_all_gpus = gpu + gpu1 + gpu2; int i; int k = 0; nworkers1 = 12; p1.workers = (int*)malloc(nworkers1*sizeof(int)); /* for(i = 0; i < gpu; i++) */ /* p1.workers[k++] = i; */ /* for(i = gpu; i < gpu + gpu1; i++) */ /* p1.workers[k++] = i; */ /* for(i = n_all_gpus; i < n_all_gpus + cpu1; i++) */ /* p1.workers[k++] = i; */ for(i = 0; i < 12; i++) p1.workers[i] = i; p1.ctx = starpu_sched_ctx_create(p1.workers, nworkers1, "sched_ctx1", STARPU_SCHED_CTX_POLICY_NAME, "heft", 0); starpu_sched_ctx_set_perf_counters(p1.ctx, perf_counters); p2.the_other_ctx = (int)p1.ctx; p1.nworkers = nworkers1; sc_hypervisor_register_ctx(p1.ctx, 0.0); /* sc_hypervisor_ctl(p1.ctx, */ /* SC_HYPERVISOR_MAX_IDLE, p1.workers, p1.nworkers, 5000.0, */ /* SC_HYPERVISOR_MAX_IDLE, p1.workers, gpu+gpu1, 100000.0, */ /* SC_HYPERVISOR_EMPTY_CTX_MAX_IDLE, p1.workers, p1.nworkers, 500000.0, */ /* SC_HYPERVISOR_GRANULARITY, 2, */ /* SC_HYPERVISOR_MIN_TASKS, 1000, */ /* SC_HYPERVISOR_NEW_WORKERS_MAX_IDLE, 100000.0, */ /* SC_HYPERVISOR_MIN_WORKERS, 6, */ /* SC_HYPERVISOR_MAX_WORKERS, 12, */ /* NULL); */ sc_hypervisor_ctl(p1.ctx, SC_HYPERVISOR_GRANULARITY, 2, SC_HYPERVISOR_MIN_TASKS, 1000, SC_HYPERVISOR_MIN_WORKERS, 6, SC_HYPERVISOR_MAX_WORKERS, 12, NULL); k = 0; p2.workers = (int*)malloc(nworkers2*sizeof(int)); /* for(i = 0; i < gpu; i++) */ /* p2.workers[k++] = i; */ /* for(i = gpu + gpu1; i < gpu + gpu1 + gpu2; i++) */ /* p2.workers[k++] = i; */ /* for(i = n_all_gpus + cpu1; i < n_all_gpus + cpu1 + cpu2; i++) */ /* p2.workers[k++] = i; */ p2.ctx = starpu_sched_ctx_create(p2.workers, 0, "sched_ctx2", STARPU_SCHED_CTX_POLICY_NAME, "heft", 0); starpu_sched_ctx_set_perf_counters(p2.ctx, perf_counters); p1.the_other_ctx = (int)p2.ctx; p2.nworkers = 0; sc_hypervisor_register_ctx(p2.ctx, 0.0); /* sc_hypervisor_ctl(p2.ctx, */ /* SC_HYPERVISOR_MAX_IDLE, p2.workers, p2.nworkers, 2000.0, */ /* SC_HYPERVISOR_MAX_IDLE, p2.workers, gpu+gpu2, 5000.0, */ /* SC_HYPERVISOR_EMPTY_CTX_MAX_IDLE, p1.workers, p1.nworkers, 500000.0, */ /* SC_HYPERVISOR_GRANULARITY, 2, */ /* SC_HYPERVISOR_MIN_TASKS, 500, */ /* SC_HYPERVISOR_NEW_WORKERS_MAX_IDLE, 1000.0, */ /* SC_HYPERVISOR_MIN_WORKERS, 4, */ /* SC_HYPERVISOR_MAX_WORKERS, 8, */ /* NULL); */ sc_hypervisor_ctl(p2.ctx, SC_HYPERVISOR_GRANULARITY, 2, SC_HYPERVISOR_MIN_TASKS, 500, SC_HYPERVISOR_MIN_WORKERS, 0, SC_HYPERVISOR_MAX_WORKERS, 6, NULL); } void set_hypervisor_conf(int event, int task_tag) { /* unsigned *id = starpu_pthread_getspecific(key); */ /* if(*id == 0) */ /* { */ /* if(event == END_BENCH) */ /* { */ /* if(it < 2) */ /* { */ /* sc_hypervisor_ctl(p2.ctx, */ /* SC_HYPERVISOR_MIN_WORKERS, 2, */ /* SC_HYPERVISOR_MAX_WORKERS, 4, */ /* SC_HYPERVISOR_TIME_TO_APPLY, task_tag, */ /* NULL); */ /* printf("%d: set max %d for tag %d\n", p2.ctx, 4, task_tag); */ /* sc_hypervisor_ctl(p1.ctx, */ /* SC_HYPERVISOR_MIN_WORKERS, 6, */ /* SC_HYPERVISOR_MAX_WORKERS, 8, */ /* SC_HYPERVISOR_TIME_TO_APPLY, task_tag, */ /* NULL); */ /* printf("%d: set max %d for tag %d\n", p1.ctx, 8, task_tag); */ /* sc_hypervisor_resize(p1.ctx, task_tag); */ /* } */ /* if(it == 2) */ /* { */ /* sc_hypervisor_ctl(p2.ctx, */ /* SC_HYPERVISOR_MIN_WORKERS, 12, */ /* SC_HYPERVISOR_MAX_WORKERS, 12, */ /* SC_HYPERVISOR_TIME_TO_APPLY, task_tag, */ /* NULL); */ /* printf("%d: set max %d for tag %d\n", p2.ctx, 12, task_tag); */ /* sc_hypervisor_ctl(p1.ctx, */ /* SC_HYPERVISOR_MIN_WORKERS, 0, */ /* SC_HYPERVISOR_MAX_WORKERS, 0, */ /* SC_HYPERVISOR_TIME_TO_APPLY, task_tag, */ /* NULL); */ /* printf("%d: set max %d for tag %d\n", p1.ctx, 0, task_tag); */ /* sc_hypervisor_resize(p1.ctx, task_tag); */ /* } */ /* it++; */ /* } */ /* } */ /* else */ /* { */ /* if(event == END_BENCH) */ /* { */ /* if(it2 < 3) */ /* { */ /* sc_hypervisor_ctl(p1.ctx, */ /* SC_HYPERVISOR_MIN_WORKERS, 6, */ /* SC_HYPERVISOR_MAX_WORKERS, 12, */ /* SC_HYPERVISOR_TIME_TO_APPLY, task_tag, */ /* NULL); */ /* printf("%d: set max %d for tag %d\n", p1.ctx, 12, task_tag); */ /* sc_hypervisor_ctl(p2.ctx, */ /* SC_HYPERVISOR_MIN_WORKERS, 0, */ /* SC_HYPERVISOR_MAX_WORKERS, 0, */ /* SC_HYPERVISOR_TIME_TO_APPLY, task_tag, */ /* NULL); */ /* printf("%d: set max %d for tag %d\n", p2.ctx, 0, task_tag); */ /* sc_hypervisor_resize(p2.ctx, task_tag); */ /* } */ /* it2++; */ /* } */ /* } */ /* if(*id == 1) */ /* { */ /* if(event == START_BENCH) */ /* { */ /* int workers[12] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; */ /* sc_hypervisor_ctl(p1.ctx, */ /* SC_HYPERVISOR_MAX_IDLE, workers, 12, 800000.0, */ /* SC_HYPERVISOR_TIME_TO_APPLY, task_tag, */ /* NULL); */ /* } */ /* else */ /* { */ /* if(it2 < 2) */ /* { */ /* int workers[12] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; */ /* sc_hypervisor_ctl(p2.ctx, */ /* SC_HYPERVISOR_MAX_IDLE, workers, 12, 500.0, */ /* SC_HYPERVISOR_MAX_IDLE, workers, 3, 200.0, */ /* SC_HYPERVISOR_TIME_TO_APPLY, task_tag, */ /* NULL); */ /* } */ /* if(it2 == 2) */ /* { */ /* int workers[12] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; */ /* sc_hypervisor_ctl(p2.ctx, */ /* SC_HYPERVISOR_MAX_IDLE, workers, 12, 1000.0, */ /* SC_HYPERVISOR_MAX_IDLE, workers, 3, 500.0, */ /* SC_HYPERVISOR_TIME_TO_APPLY, task_tag, */ /* SC_HYPERVISOR_MAX_WORKERS, 12, */ /* NULL); */ /* } */ /* it2++; */ /* } */ /* } else { */ /* if(event == START_BENCH) */ /* { */ /* int workers[12] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; */ /* sc_hypervisor_ctl(p1.ctx, */ /* SC_HYPERVISOR_MAX_IDLE, workers, 12, 1500.0, */ /* SC_HYPERVISOR_MAX_IDLE, workers, 3, 4000.0, */ /* SC_HYPERVISOR_TIME_TO_APPLY, task_tag, */ /* NULL); */ /* } */ /* if(event == END_BENCH) */ /* { */ /* if(it < 2) */ /* { */ /* int workers[12] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; */ /* sc_hypervisor_ctl(p1.ctx, */ /* SC_HYPERVISOR_MAX_IDLE, workers, 12, 100.0, */ /* SC_HYPERVISOR_MAX_IDLE, workers, 3, 5000.0, */ /* SC_HYPERVISOR_TIME_TO_APPLY, task_tag, */ /* NULL); */ /* } */ /* if(it == 2) */ /* { */ /* int workers[12] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; */ /* sc_hypervisor_ctl(p1.ctx, */ /* SC_HYPERVISOR_MAX_IDLE, workers, 12, 5000.0, */ /* SC_HYPERVISOR_MAX_IDLE, workers, 3, 10000.0, */ /* SC_HYPERVISOR_TIME_TO_APPLY, task_tag, */ /* NULL); */ /* } */ /* it++; */ /* } */ /* } */ } void end_contexts() { free(p1.workers); free(p2.workers); sc_hypervisor_shutdown(); } void parse_args_ctx(int argc, char **argv) { init(); int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-size1") == 0) { char *argptr; size1 = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-nblocks1") == 0) { char *argptr; nblocks1 = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-size2") == 0) { char *argptr; size2 = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-nblocks2") == 0) { char *argptr; nblocks2 = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-cpu1") == 0) { char *argptr; cpu1 = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-cpu2") == 0) { char *argptr; cpu2 = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-gpu") == 0) { char *argptr; gpu = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-gpu1") == 0) { char *argptr; gpu1 = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-gpu2") == 0) { char *argptr; gpu2 = strtol(argv[++i], &argptr, 10); } } } starpu-1.2.3+dfsg/sc_hypervisor/examples/sched_ctx_utils/sched_ctx_utils.h000066400000000000000000000024241320135501600272060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #define START_BENCH 0 #define END_BENCH 1 void parse_args_ctx(int argc, char **argv); void update_sched_ctx_timing_results(double gflops, double timing); void construct_contexts(void (*bench)(float *mat, unsigned size, unsigned nblocks)); void end_contexts(void); void start_2benchs(void (*bench)(float *mat, unsigned size, unsigned nblocks)); void start_1stbench(void (*bench)(float *mat, unsigned size, unsigned nblocks)); void start_2ndbench(void (*bench)(float *mat, unsigned size, unsigned nblocks)); void set_hypervisor_conf(int event, int task_tag); starpu-1.2.3+dfsg/sc_hypervisor/include/000077500000000000000000000000001320135501600202705ustar00rootroot00000000000000starpu-1.2.3+dfsg/sc_hypervisor/include/sc_hypervisor.h000066400000000000000000000145371320135501600233520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 - 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef SC_HYPERVISOR_H #define SC_HYPERVISOR_H #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif /* synchronise the hypervisor when several workers try to update its information */ starpu_pthread_mutex_t act_hypervisor_mutex; /* platform of resizing contexts */ struct sc_hypervisor_policy { /* name of the strategy */ const char* name; /* indicate if it is a policiy create by the user or not */ unsigned custom; /* Distribute workers to contexts even at the begining of the program */ void (*size_ctxs)(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers); /* Require explicit resizing */ void (*resize_ctxs)(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers); /* the hypervisor takes a decision when the worker was idle for another cyle in this ctx */ void (*handle_idle_cycle)(unsigned sched_ctx, int worker); /* the hypervisor takes a decision when another task was pushed on this worker in this ctx */ void (*handle_pushed_task)(unsigned sched_ctx, int worker); /* the hypervisor takes a decision when another task was poped from this worker in this ctx */ void (*handle_poped_task)(unsigned sched_ctx, int worker,struct starpu_task *task, uint32_t footprint); /* the hypervisor takes a decision when the worker stoped being idle in this ctx */ void (*handle_idle_end)(unsigned sched_ctx, int worker); /* the hypervisor takes a decision when a certain task finished executing in this ctx */ void (*handle_post_exec_hook)(unsigned sched_ctx, int task_tag); /* the hypervisor takes a decision when a job was submitted in this ctx */ void (*handle_submitted_job)(struct starpu_codelet *cl, unsigned sched_ctx, uint32_t footprint, size_t data_size); /* the hypervisor takes a decision when a certain ctx was deleted */ void (*end_ctx)(unsigned sched_ctx); }; /* start the hypervisor indicating the resizing policy to user */ void* sc_hypervisor_init(struct sc_hypervisor_policy *policy); /* shutdown the hypervisor */ void sc_hypervisor_shutdown(void); /* only registered contexts are resized by the hypervisor */ void sc_hypervisor_register_ctx(unsigned sched_ctx, double total_flops); /* remove a worker from the hypervisor's list */ void sc_hypervisor_unregister_ctx(unsigned sched_ctx); /* submit a requirement of resizing when a task taged with task_tag is executed */ void sc_hypervisor_post_resize_request(unsigned sched_ctx, int task_tag); /* reevaluate the distribution of the resources and eventually resize if needed */ void sc_hypervisor_resize_ctxs(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers); /* don't allow the hypervisor to resize a context */ void sc_hypervisor_stop_resize(unsigned sched_ctx); /* allow the hypervisor to resize a context */ void sc_hypervisor_start_resize(unsigned sched_ctx); /* check out the current policy of the hypervisor */ const char *sc_hypervisor_get_policy(); /* ask the hypervisor to add workers to a sched_ctx */ void sc_hypervisor_add_workers_to_sched_ctx(int* workers_to_add, unsigned nworkers_to_add, unsigned sched_ctx); /* ask the hypervisor to remove workers from a sched_ctx */ void sc_hypervisor_remove_workers_from_sched_ctx(int* workers_to_remove, unsigned nworkers_to_remove, unsigned sched_ctx, unsigned now); /* ask the hypervisor to move workers from one context to another */ void sc_hypervisor_move_workers(unsigned sender_sched_ctx, unsigned receiver_sched_ctx, int *workers_to_move, unsigned nworkers_to_move, unsigned now); /* ask the hypervisor to chose a distribution of workers in the required contexts */ void sc_hypervisor_size_ctxs(unsigned *sched_ctxs, int nsched_ctxs, int *workers, int nworkers); /* check if there are pending demands of resizing */ unsigned sc_hypervisor_get_size_req(unsigned **sched_ctxs, int* nsched_ctxs, int **workers, int *nworkers); /* save a demand of resizing */ void sc_hypervisor_save_size_req(unsigned *sched_ctxs, int nsched_ctxs, int *workers, int nworkers); /* clear the list of pending demands of resizing */ void sc_hypervisor_free_size_req(void); /* check out if a context can be resized */ unsigned sc_hypervisor_can_resize(unsigned sched_ctx); /* indicate the types of tasks a context will execute in order to better decide the sizing of ctxs */ void sc_hypervisor_set_type_of_task(struct starpu_codelet *cl, unsigned sched_ctx, uint32_t footprint, size_t data_size); /* change dynamically the total number of flops of a context, move the deadline of the finishing time of the context */ void sc_hypervisor_update_diff_total_flops(unsigned sched_ctx, double diff_total_flops); /* change dynamically the number of the elapsed flops in a context, modify the past in order to better compute the speed */ void sc_hypervisor_update_diff_elapsed_flops(unsigned sched_ctx, double diff_task_flops); /* updates the min and max workers needed by each context */ void sc_hypervisor_update_resize_interval(unsigned *sched_ctxs, int nsched_ctxs, int max_nworkers); /* returns a list of contexts that are on the same level in the hierarchy of contexts */ void sc_hypervisor_get_ctxs_on_level(unsigned **sched_ctxs, int *nsched_ctxs, unsigned hierarchy_level, unsigned father_sched_ctx_id); /* returns the number of levels of ctxs registered to the hyp */ unsigned sc_hypervisor_get_nhierarchy_levels(void); /* return the leaves ctxs from the list of ctxs */ void sc_hypervisor_get_leaves(unsigned *sched_ctxs, int nsched_ctxs, unsigned *leaves, int *nleaves); /* returns the nready flops of all ctxs below in hierachy of sched_ctx */ double sc_hypervisor_get_nready_flops_of_all_sons_of_sched_ctx(unsigned sched_ctx); void sc_hypervisor_print_overhead(); #ifdef __cplusplus } #endif #endif starpu-1.2.3+dfsg/sc_hypervisor/include/sc_hypervisor_config.h000066400000000000000000000054411320135501600246710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 - 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef SC_HYPERVISOR_CONFIG_H #define SC_HYPERVISOR_CONFIG_H #include #ifdef __cplusplus extern "C" { #endif /* ctl properties*/ #define SC_HYPERVISOR_MAX_IDLE -1 #define SC_HYPERVISOR_MIN_WORKING -2 #define SC_HYPERVISOR_PRIORITY -3 #define SC_HYPERVISOR_MIN_WORKERS -4 #define SC_HYPERVISOR_MAX_WORKERS -5 #define SC_HYPERVISOR_GRANULARITY -6 #define SC_HYPERVISOR_FIXED_WORKERS -7 #define SC_HYPERVISOR_MIN_TASKS -8 #define SC_HYPERVISOR_NEW_WORKERS_MAX_IDLE -9 #define SC_HYPERVISOR_TIME_TO_APPLY -10 #define SC_HYPERVISOR_NULL -11 #define SC_HYPERVISOR_ISPEED_W_SAMPLE -12 #define SC_HYPERVISOR_ISPEED_CTX_SAMPLE -13 #define SC_HYPERVISOR_TIME_SAMPLE -14 #define MAX_IDLE_TIME 5000000000 #define MIN_WORKING_TIME 500 struct sc_hypervisor_policy_config { /* underneath this limit we cannot resize */ int min_nworkers; /* above this limit we cannot resize */ int max_nworkers; /*resize granularity */ int granularity; /* priority for a worker to stay in this context */ /* the smaller the priority the faster it will be moved */ /* to another context */ int priority[STARPU_NMAXWORKERS]; /* above this limit the priority of the worker is reduced */ double max_idle[STARPU_NMAXWORKERS]; /* underneath this limit the priority of the worker is reduced */ double min_working[STARPU_NMAXWORKERS]; /* workers that will not move */ int fixed_workers[STARPU_NMAXWORKERS]; /* max idle for the workers that will be added during the resizing process*/ double new_workers_max_idle; /* sample used to compute the instant speed per worker*/ double ispeed_w_sample[STARPU_NMAXWORKERS]; /* sample used to compute the instant speed per ctx*/ double ispeed_ctx_sample; /* sample used to compute the instant speed per ctx (in seconds)*/ double time_sample; }; /* set a certain configuration to a context */ void sc_hypervisor_set_config(unsigned sched_ctx, void *config); /* check out the configuration of a context */ struct sc_hypervisor_policy_config *sc_hypervisor_get_config(unsigned sched_ctx); /* impose different parameters to a configuration of a context */ void sc_hypervisor_ctl(unsigned sched_ctx, ...); #ifdef __cplusplus } #endif #endif starpu-1.2.3+dfsg/sc_hypervisor/include/sc_hypervisor_lp.h000066400000000000000000000113411320135501600240330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef SC_HYPERVISOR_LP_H #define SC_HYPERVISOR_LP_H #include #include #ifdef __cplusplus extern "C" { #endif /* * GNU Linear Programming Kit backend */ #ifdef STARPU_HAVE_GLPK_H #include #endif //STARPU_HAVE_GLPK_H struct sc_hypervisor_policy_task_pool; struct types_of_workers; /* returns tmax, and computes in table res the nr of workers needed by each context st the system ends up in the smallest tmax*/ double sc_hypervisor_lp_get_nworkers_per_ctx(int nsched_ctxs, int ntypes_of_workers, double res[nsched_ctxs][ntypes_of_workers], int total_nw[ntypes_of_workers], struct types_of_workers *tw, unsigned *in_sched_ctxs); /* returns tmax of the system */ double sc_hypervisor_lp_get_tmax(int nw, int *workers); /* the linear programme determins a rational number of ressources for each ctx, we round them depending on the type of ressource */ void sc_hypervisor_lp_round_double_to_int(int ns, int nw, double res[ns][nw], int res_rounded[ns][nw]); /* redistribute the ressource in contexts by assigning the first x available ressources to each one */ void sc_hypervisor_lp_redistribute_resources_in_ctxs(int ns, int nw, int res_rounded[ns][nw], double res[ns][nw], unsigned *sched_ctxs, struct types_of_workers *tw); /* make the first distribution of ressource in contexts by assigning the first x available ressources to each one */ void sc_hypervisor_lp_distribute_resources_in_ctxs(unsigned* sched_ctxs, int ns, int nw, int res_rounded[ns][nw], double res[ns][nw], int *workers, int nworkers, struct types_of_workers *tw); /* make the first distribution of ressource in contexts by assigning the first x available ressources to each one, share not integer no of workers */ void sc_hypervisor_lp_distribute_floating_no_resources_in_ctxs(unsigned* sched_ctxs, int ns, int nw, double res[ns][nw], int *workers, int nworkers, struct types_of_workers *tw); /* place resources in contexts dependig on whether they already have workers or not */ void sc_hypervisor_lp_place_resources_in_ctx(int ns, int nw, double w_in_s[ns][nw], unsigned *sched_ctxs, int *workers, unsigned do_size, struct types_of_workers *tw); /* not used resources are shared between all contexts */ void sc_hypervisor_lp_share_remaining_resources(int ns, unsigned *sched_ctxs, int nworkers, int *workers); /* dichotomy btw t1 & t2 */ double sc_hypervisor_lp_find_tmax(double t1, double t2); /* execute the lp trough dichotomy */ unsigned sc_hypervisor_lp_execute_dichotomy(int ns, int nw, double w_in_s[ns][nw], unsigned solve_lp_integer, void *specific_data, double tmin, double tmax, double smallest_tmax, double (*lp_estimated_distrib_func)(int ns, int nw, double draft_w_in_s[ns][nw], unsigned is_integer, double tmax, void *specifc_data)); #ifdef STARPU_HAVE_GLPK_H /* linear program that returns 1/tmax, and computes in table res the nr of workers needed by each context st the system ends up in the smallest tmax*/ double sc_hypervisor_lp_simulate_distrib_flops(int nsched_ctxs, int ntypes_of_workers, double speed[nsched_ctxs][ntypes_of_workers], double flops[nsched_ctxs], double res[nsched_ctxs][ntypes_of_workers], int total_nw[ntypes_of_workers], unsigned sched_ctxs[nsched_ctxs], double vmax); /* linear program that simulates a distribution of tasks that minimises the execution time of the tasks in the pool */ double sc_hypervisor_lp_simulate_distrib_tasks(int ns, int nw, int nt, double w_in_s[ns][nw], double tasks[nw][nt], double times[nw][nt], unsigned is_integer, double tmax, unsigned *in_sched_ctxs, struct sc_hypervisor_policy_task_pool *tmp_task_pools); /* linear program that simulates a distribution of flops over the workers on particular sample of the execution of the application such that the entire sample would finish in a minimum amount of time */ double sc_hypervisor_lp_simulate_distrib_flops_on_sample(int ns, int nw, double final_w_in_s[ns][nw], unsigned is_integer, double tmax, double **speed, double flops[ns], double **final_flops_on_w); #endif // STARPU_HAVE_GLPK_H #ifdef __cplusplus } #endif #endif starpu-1.2.3+dfsg/sc_hypervisor/include/sc_hypervisor_monitoring.h000066400000000000000000000125201320135501600256050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 - 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef SC_HYPERVISOR_MONITORING_H #define SC_HYPERVISOR_MONITORING_H #include #ifdef __cplusplus extern "C" { #endif /* structure to indicate when the moving of workers was actually done (moved workers can be seen in the new ctx ) */ struct sc_hypervisor_resize_ack { /* receiver context */ int receiver_sched_ctx; /* list of workers required to be moved */ int *moved_workers; /* number of workers required to be moved */ int nmoved_workers; /* list of workers that actually got in the receiver ctx */ int *acked_workers; }; /* wrapper attached to a sched_ctx storing monitoring information */ struct sc_hypervisor_wrapper { /* the sched_ctx it monitors */ unsigned sched_ctx; /* user configuration meant to limit resizing */ struct sc_hypervisor_policy_config *config; /* the start time of the resizing sample of the workers of this context*/ double start_time_w[STARPU_NMAXWORKERS]; /* idle time of workers in this context */ double current_idle_time[STARPU_NMAXWORKERS]; /* idle time from the last resize */ double idle_time[STARPU_NMAXWORKERS]; /* time when the idle started */ double idle_start_time[STARPU_NMAXWORKERS]; /* time during which the worker executed tasks */ double exec_time[STARPU_NMAXWORKERS]; /* time when the worker started executing a task */ double exec_start_time[STARPU_NMAXWORKERS]; /* list of workers that will leave this contexts (lazy resizing process) */ int worker_to_be_removed[STARPU_NMAXWORKERS]; /* number of tasks pushed on each worker in this ctx */ int pushed_tasks[STARPU_NMAXWORKERS]; /* number of tasks poped from each worker in this ctx */ int poped_tasks[STARPU_NMAXWORKERS]; /* number of flops the context has to execute */ double total_flops; /* number of flops executed since the beginning until now */ double total_elapsed_flops[STARPU_NMAXWORKERS]; /* number of flops executed since last resizing */ double elapsed_flops[STARPU_NMAXWORKERS]; /* data quantity executed on each worker in this ctx */ size_t elapsed_data[STARPU_NMAXWORKERS]; /* nr of tasks executed on each worker in this ctx */ int elapsed_tasks[STARPU_NMAXWORKERS]; /* the average speed of the type of workers when they belonged to this context */ /* 0 - cuda 1 - cpu */ double ref_speed[2]; /* number of flops submitted to this ctx */ double submitted_flops; /* number of flops that still have to be executed in this ctx */ double remaining_flops; /* the start time of the resizing sample of this context*/ double start_time; /* the first time a task was pushed to this context*/ double real_start_time; /* the start time for sample in which the hyp is not allowed to react bc too expensive */ double hyp_react_start_time; /* the workers don't leave the current ctx until the receiver ctx doesn't ack the receive of these workers */ struct sc_hypervisor_resize_ack resize_ack; /* mutex to protect the ack of workers */ starpu_pthread_mutex_t mutex; /* boolean indicating if the resizing strategy can see the flops of all the execution or not */ unsigned total_flops_available; /* boolean indicating that a context is being sized */ unsigned to_be_sized; /* boolean indicating if we add the idle of this worker to the idle of the context */ unsigned compute_idle[STARPU_NMAXWORKERS]; /* boolean indicating if we add the entiere idle of this worker to the idle of the context or just half*/ unsigned compute_partial_idle[STARPU_NMAXWORKERS]; /* consider the max in the lp */ unsigned consider_max; }; /* return the wrapper of context that saves its monitoring information */ struct sc_hypervisor_wrapper *sc_hypervisor_get_wrapper(unsigned sched_ctx); /* get the list of registered contexts */ unsigned *sc_hypervisor_get_sched_ctxs(); /* get the number of registered contexts */ int sc_hypervisor_get_nsched_ctxs(); /* get the number of workers of a certain architecture in a context */ int sc_hypervisor_get_nworkers_ctx(unsigned sched_ctx, enum starpu_worker_archtype arch); /* get the number of flops executed by a context since last resizing (reset to 0 when a resizing is done)*/ double sc_hypervisor_get_elapsed_flops_per_sched_ctx(struct sc_hypervisor_wrapper *sc_w); /* get the number of flops executed by a context since the begining */ double sc_hypervisor_get_total_elapsed_flops_per_sched_ctx(struct sc_hypervisor_wrapper* sc_w); /* compute an average value of the cpu/cuda speed */ double sc_hypervisorsc_hypervisor_get_speed_per_worker_type(struct sc_hypervisor_wrapper* sc_w, enum starpu_worker_archtype arch); /* compte the actual speed of all workers of a specific type of worker */ double sc_hypervisor_get_speed(struct sc_hypervisor_wrapper *sc_w, enum starpu_worker_archtype arch); #ifdef __cplusplus } #endif #endif starpu-1.2.3+dfsg/sc_hypervisor/include/sc_hypervisor_policy.h000066400000000000000000000134531320135501600247250ustar00rootroot00000000000000/* StarPUf --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef SC_HYPERVISOR_POLICY_H #define SC_HYPERVISOR_POLICY_H #include #ifdef __cplusplus extern "C" { #endif #define HYPERVISOR_REDIM_SAMPLE 0.02 #define HYPERVISOR_START_REDIM_SAMPLE 0.1 #define SC_NOTHING 0 #define SC_IDLE 1 #define SC_SPEED 2 struct types_of_workers { unsigned ncpus; unsigned ncuda; unsigned nw; }; struct sc_hypervisor_policy_task_pool { struct starpu_codelet *cl; uint32_t footprint; unsigned sched_ctx_id; unsigned long n; size_t data_size; struct sc_hypervisor_policy_task_pool *next; }; /* add task information to a task wrapper linked list */ void sc_hypervisor_policy_add_task_to_pool(struct starpu_codelet *cl, unsigned sched_ctx, uint32_t footprint, struct sc_hypervisor_policy_task_pool **task_pools, size_t data_size); /* remove task information from a task wrapper linked list */ void sc_hypervisor_policy_remove_task_from_pool(struct starpu_task *task, uint32_t footprint, struct sc_hypervisor_policy_task_pool **task_pools); /* clone a task wrapper linked list */ struct sc_hypervisor_policy_task_pool* sc_hypervisor_policy_clone_task_pool(struct sc_hypervisor_policy_task_pool *tp); /* get the execution time of the submitted tasks out of starpu's calibration files */ void sc_hypervisor_get_tasks_times(int nw, int nt, double times[nw][nt], int *workers, unsigned size_ctxs, struct sc_hypervisor_policy_task_pool *task_pools); /* find the context with the lowest priority in order to move some workers */ unsigned sc_hypervisor_find_lowest_prio_sched_ctx(unsigned req_sched_ctx, int nworkers_to_move); /* find the first most idle workers of a context*/ int* sc_hypervisor_get_idlest_workers(unsigned sched_ctx, int *nworkers, enum starpu_worker_archtype arch); /* find the first most idle workers in a list */ int* sc_hypervisor_get_idlest_workers_in_list(int *start, int *workers, int nall_workers, int *nworkers, enum starpu_worker_archtype arch); /* find workers that can be moved from a context (if the constraints of min, max, etc allow this) */ int sc_hypervisor_get_movable_nworkers(struct sc_hypervisor_policy_config *config, unsigned sched_ctx, enum starpu_worker_archtype arch); /* compute how many workers should be moved from this context */ int sc_hypervisor_compute_nworkers_to_move(unsigned req_sched_ctx); /* check the policy's constraints in order to resize */ unsigned sc_hypervisor_policy_resize(unsigned sender_sched_ctx, unsigned receiver_sched_ctx, unsigned force_resize, unsigned now); /* check the policy's constraints in order to resize and find a context willing the resources */ unsigned sc_hypervisor_policy_resize_to_unknown_receiver(unsigned sender_sched_ctx, unsigned now); /* compute the speed of a context */ double sc_hypervisor_get_ctx_speed(struct sc_hypervisor_wrapper* sc_w); /* get the time of execution of the slowest context */ double sc_hypervisor_get_slowest_ctx_exec_time(void); /* get the time of execution of the fastest context */ double sc_hypervisor_get_fastest_ctx_exec_time(void); /* compute the speed of a workers in a context */ double sc_hypervisor_get_speed_per_worker(struct sc_hypervisor_wrapper *sc_w, unsigned worker); /* compute the speed of a type of worker in a context */ double sc_hypervisor_get_speed_per_worker_type(struct sc_hypervisor_wrapper* sc_w, enum starpu_worker_archtype arch); /* compute the speed of a type of worker in a context depending on its history */ double sc_hypervisor_get_ref_speed_per_worker_type(struct sc_hypervisor_wrapper* sc_w, enum starpu_worker_archtype arch); /* compute the average speed of a type of worker in all ctxs from the begining of appl */ double sc_hypervisor_get_avg_speed(enum starpu_worker_archtype arch); /* verify if we need to consider the max in the lp */ void sc_hypervisor_check_if_consider_max(struct types_of_workers *tw); /* get the list of workers grouped by type */ void sc_hypervisor_group_workers_by_type(struct types_of_workers *tw, int *total_nw); /* get what type of worker corresponds to a certain index of types of workers */ enum starpu_worker_archtype sc_hypervisor_get_arch_for_index(unsigned w, struct types_of_workers *tw); /* get the index of types of workers corresponding to the type of workers indicated */ unsigned sc_hypervisor_get_index_for_arch(enum starpu_worker_archtype arch, struct types_of_workers *tw); /* check if we trigger resizing or not */ unsigned sc_hypervisor_criteria_fulfilled(unsigned sched_ctx, int worker); /* check if worker was idle long enough */ unsigned sc_hypervisor_check_idle(unsigned sched_ctx, int worker); /* check if there is a speed gap btw ctxs */ unsigned sc_hypervisor_check_speed_gap_btw_ctxs(unsigned *sched_ctxs, int nsched_ctxs, int *workers, int nworkers); /* check if there is a speed gap btw ctxs on one level */ unsigned sc_hypervisor_check_speed_gap_btw_ctxs_on_level(int level, int *workers_in, int nworkers_in, unsigned father_sched_ctx_id, unsigned **sched_ctxs, int *nsched_ctxs); /* check what triggers resizing (idle, speed, etc.)*/ unsigned sc_hypervisor_get_resize_criteria(); /* load information concerning the type of workers into a types_of_workers struct */ struct types_of_workers* sc_hypervisor_get_types_of_workers(int *workers, unsigned nworkers); #ifdef __cplusplus } #endif #endif starpu-1.2.3+dfsg/sc_hypervisor/src/000077500000000000000000000000001320135501600174345ustar00rootroot00000000000000starpu-1.2.3+dfsg/sc_hypervisor/src/Makefile.am000066400000000000000000000035731320135501600215000ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011, 2012 INRIA # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. AM_CFLAGS = -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(FXT_CFLAGS) $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) $(GLOBAL_AM_CFLAGS) LIBS = $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/sc_hypervisor/include/ -I$(top_srcdir)/sc_hypervisor/src AM_LDFLAGS = $(STARPU_CUDA_LDFLAGS) $(STARPU_OPENCL_LDFLAGS) $(STARPU_COI_LDFLAGS) $(STARPU_SCIF_LDFLAGS) lib_LTLIBRARIES = libsc_hypervisor.la libsc_hypervisor_la_LIBADD = $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la libsc_hypervisor_la_SOURCES = \ sc_hypervisor.c \ sc_config.c \ policies_utils/policy_tools.c \ policies_utils/speed.c \ policies_utils/task_pool.c \ policies_utils/lp_tools.c \ policies_utils/lp_programs.c \ policies_utils/dichotomy.c \ hypervisor_policies/idle_policy.c \ hypervisor_policies/app_driven_policy.c \ hypervisor_policies/gflops_rate_policy.c \ hypervisor_policies/feft_lp_policy.c \ hypervisor_policies/teft_lp_policy.c \ hypervisor_policies/ispeed_policy.c \ hypervisor_policies/ispeed_lp_policy.c \ hypervisor_policies/throughput_lp_policy.c \ hypervisor_policies/hard_coded_policy.c noinst_HEADERS = sc_hypervisor_intern.h showcheck: -cat /dev/null starpu-1.2.3+dfsg/sc_hypervisor/src/Makefile.in000066400000000000000000001313241320135501600215050ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011, 2012 INRIA # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = sc_hypervisor/src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) libsc_hypervisor_la_DEPENDENCIES = \ $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la am_libsc_hypervisor_la_OBJECTS = sc_hypervisor.lo sc_config.lo \ policy_tools.lo speed.lo task_pool.lo lp_tools.lo \ lp_programs.lo dichotomy.lo idle_policy.lo \ app_driven_policy.lo gflops_rate_policy.lo feft_lp_policy.lo \ teft_lp_policy.lo ispeed_policy.lo ispeed_lp_policy.lo \ throughput_lp_policy.lo hard_coded_policy.lo libsc_hypervisor_la_OBJECTS = $(am_libsc_hypervisor_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/common -I$(top_builddir)/include -I$(top_builddir)/gcc-plugin/include/starpu-gcc -I$(top_builddir)/starpu-top depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libsc_hypervisor_la_SOURCES) DIST_SOURCES = $(libsc_hypervisor_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/build-aux/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POTI_CFLAGS = @POTI_CFLAGS@ POTI_LIBS = @POTI_LIBS@ PROG_DATE = @PROG_DATE@ PROG_STAT = @PROG_STAT@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_COI_CPPFLAGS = @STARPU_COI_CPPFLAGS@ STARPU_COI_LDFLAGS = @STARPU_COI_LDFLAGS@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LEVELDB_LDFLAGS = @STARPU_LEVELDB_LDFLAGS@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RCCE_CFLAGS = @STARPU_RCCE_CFLAGS@ STARPU_RCCE_CPPFLAGS = @STARPU_RCCE_CPPFLAGS@ STARPU_RCCE_LDFLAGS = @STARPU_RCCE_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SCIF_CPPFLAGS = @STARPU_SCIF_CPPFLAGS@ STARPU_SCIF_LDFLAGS = @STARPU_SCIF_LDFLAGS@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SC_HYPERVISOR_DEBUG = @STARPU_SC_HYPERVISOR_DEBUG@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ mpifort_path = @mpifort_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ smpirun_path = @smpirun_path@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CFLAGS = -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(FXT_CFLAGS) $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) $(GLOBAL_AM_CFLAGS) AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/sc_hypervisor/include/ -I$(top_srcdir)/sc_hypervisor/src AM_LDFLAGS = $(STARPU_CUDA_LDFLAGS) $(STARPU_OPENCL_LDFLAGS) $(STARPU_COI_LDFLAGS) $(STARPU_SCIF_LDFLAGS) lib_LTLIBRARIES = libsc_hypervisor.la libsc_hypervisor_la_LIBADD = $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la libsc_hypervisor_la_SOURCES = \ sc_hypervisor.c \ sc_config.c \ policies_utils/policy_tools.c \ policies_utils/speed.c \ policies_utils/task_pool.c \ policies_utils/lp_tools.c \ policies_utils/lp_programs.c \ policies_utils/dichotomy.c \ hypervisor_policies/idle_policy.c \ hypervisor_policies/app_driven_policy.c \ hypervisor_policies/gflops_rate_policy.c \ hypervisor_policies/feft_lp_policy.c \ hypervisor_policies/teft_lp_policy.c \ hypervisor_policies/ispeed_policy.c \ hypervisor_policies/ispeed_lp_policy.c \ hypervisor_policies/throughput_lp_policy.c \ hypervisor_policies/hard_coded_policy.c noinst_HEADERS = sc_hypervisor_intern.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign sc_hypervisor/src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign sc_hypervisor/src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libsc_hypervisor.la: $(libsc_hypervisor_la_OBJECTS) $(libsc_hypervisor_la_DEPENDENCIES) $(EXTRA_libsc_hypervisor_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) -rpath $(libdir) $(libsc_hypervisor_la_OBJECTS) $(libsc_hypervisor_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/app_driven_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dichotomy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/feft_lp_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gflops_rate_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hard_coded_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/idle_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ispeed_lp_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ispeed_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lp_programs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lp_tools.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/policy_tools.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sc_config.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sc_hypervisor.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/speed.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/task_pool.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/teft_lp_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/throughput_lp_policy.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< policy_tools.lo: policies_utils/policy_tools.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT policy_tools.lo -MD -MP -MF $(DEPDIR)/policy_tools.Tpo -c -o policy_tools.lo `test -f 'policies_utils/policy_tools.c' || echo '$(srcdir)/'`policies_utils/policy_tools.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/policy_tools.Tpo $(DEPDIR)/policy_tools.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='policies_utils/policy_tools.c' object='policy_tools.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o policy_tools.lo `test -f 'policies_utils/policy_tools.c' || echo '$(srcdir)/'`policies_utils/policy_tools.c speed.lo: policies_utils/speed.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT speed.lo -MD -MP -MF $(DEPDIR)/speed.Tpo -c -o speed.lo `test -f 'policies_utils/speed.c' || echo '$(srcdir)/'`policies_utils/speed.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/speed.Tpo $(DEPDIR)/speed.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='policies_utils/speed.c' object='speed.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o speed.lo `test -f 'policies_utils/speed.c' || echo '$(srcdir)/'`policies_utils/speed.c task_pool.lo: policies_utils/task_pool.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT task_pool.lo -MD -MP -MF $(DEPDIR)/task_pool.Tpo -c -o task_pool.lo `test -f 'policies_utils/task_pool.c' || echo '$(srcdir)/'`policies_utils/task_pool.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/task_pool.Tpo $(DEPDIR)/task_pool.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='policies_utils/task_pool.c' object='task_pool.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o task_pool.lo `test -f 'policies_utils/task_pool.c' || echo '$(srcdir)/'`policies_utils/task_pool.c lp_tools.lo: policies_utils/lp_tools.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lp_tools.lo -MD -MP -MF $(DEPDIR)/lp_tools.Tpo -c -o lp_tools.lo `test -f 'policies_utils/lp_tools.c' || echo '$(srcdir)/'`policies_utils/lp_tools.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lp_tools.Tpo $(DEPDIR)/lp_tools.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='policies_utils/lp_tools.c' object='lp_tools.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lp_tools.lo `test -f 'policies_utils/lp_tools.c' || echo '$(srcdir)/'`policies_utils/lp_tools.c lp_programs.lo: policies_utils/lp_programs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lp_programs.lo -MD -MP -MF $(DEPDIR)/lp_programs.Tpo -c -o lp_programs.lo `test -f 'policies_utils/lp_programs.c' || echo '$(srcdir)/'`policies_utils/lp_programs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lp_programs.Tpo $(DEPDIR)/lp_programs.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='policies_utils/lp_programs.c' object='lp_programs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lp_programs.lo `test -f 'policies_utils/lp_programs.c' || echo '$(srcdir)/'`policies_utils/lp_programs.c dichotomy.lo: policies_utils/dichotomy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dichotomy.lo -MD -MP -MF $(DEPDIR)/dichotomy.Tpo -c -o dichotomy.lo `test -f 'policies_utils/dichotomy.c' || echo '$(srcdir)/'`policies_utils/dichotomy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dichotomy.Tpo $(DEPDIR)/dichotomy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='policies_utils/dichotomy.c' object='dichotomy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dichotomy.lo `test -f 'policies_utils/dichotomy.c' || echo '$(srcdir)/'`policies_utils/dichotomy.c idle_policy.lo: hypervisor_policies/idle_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT idle_policy.lo -MD -MP -MF $(DEPDIR)/idle_policy.Tpo -c -o idle_policy.lo `test -f 'hypervisor_policies/idle_policy.c' || echo '$(srcdir)/'`hypervisor_policies/idle_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/idle_policy.Tpo $(DEPDIR)/idle_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hypervisor_policies/idle_policy.c' object='idle_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o idle_policy.lo `test -f 'hypervisor_policies/idle_policy.c' || echo '$(srcdir)/'`hypervisor_policies/idle_policy.c app_driven_policy.lo: hypervisor_policies/app_driven_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT app_driven_policy.lo -MD -MP -MF $(DEPDIR)/app_driven_policy.Tpo -c -o app_driven_policy.lo `test -f 'hypervisor_policies/app_driven_policy.c' || echo '$(srcdir)/'`hypervisor_policies/app_driven_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/app_driven_policy.Tpo $(DEPDIR)/app_driven_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hypervisor_policies/app_driven_policy.c' object='app_driven_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o app_driven_policy.lo `test -f 'hypervisor_policies/app_driven_policy.c' || echo '$(srcdir)/'`hypervisor_policies/app_driven_policy.c gflops_rate_policy.lo: hypervisor_policies/gflops_rate_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gflops_rate_policy.lo -MD -MP -MF $(DEPDIR)/gflops_rate_policy.Tpo -c -o gflops_rate_policy.lo `test -f 'hypervisor_policies/gflops_rate_policy.c' || echo '$(srcdir)/'`hypervisor_policies/gflops_rate_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gflops_rate_policy.Tpo $(DEPDIR)/gflops_rate_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hypervisor_policies/gflops_rate_policy.c' object='gflops_rate_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gflops_rate_policy.lo `test -f 'hypervisor_policies/gflops_rate_policy.c' || echo '$(srcdir)/'`hypervisor_policies/gflops_rate_policy.c feft_lp_policy.lo: hypervisor_policies/feft_lp_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT feft_lp_policy.lo -MD -MP -MF $(DEPDIR)/feft_lp_policy.Tpo -c -o feft_lp_policy.lo `test -f 'hypervisor_policies/feft_lp_policy.c' || echo '$(srcdir)/'`hypervisor_policies/feft_lp_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/feft_lp_policy.Tpo $(DEPDIR)/feft_lp_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hypervisor_policies/feft_lp_policy.c' object='feft_lp_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o feft_lp_policy.lo `test -f 'hypervisor_policies/feft_lp_policy.c' || echo '$(srcdir)/'`hypervisor_policies/feft_lp_policy.c teft_lp_policy.lo: hypervisor_policies/teft_lp_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT teft_lp_policy.lo -MD -MP -MF $(DEPDIR)/teft_lp_policy.Tpo -c -o teft_lp_policy.lo `test -f 'hypervisor_policies/teft_lp_policy.c' || echo '$(srcdir)/'`hypervisor_policies/teft_lp_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/teft_lp_policy.Tpo $(DEPDIR)/teft_lp_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hypervisor_policies/teft_lp_policy.c' object='teft_lp_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o teft_lp_policy.lo `test -f 'hypervisor_policies/teft_lp_policy.c' || echo '$(srcdir)/'`hypervisor_policies/teft_lp_policy.c ispeed_policy.lo: hypervisor_policies/ispeed_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ispeed_policy.lo -MD -MP -MF $(DEPDIR)/ispeed_policy.Tpo -c -o ispeed_policy.lo `test -f 'hypervisor_policies/ispeed_policy.c' || echo '$(srcdir)/'`hypervisor_policies/ispeed_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ispeed_policy.Tpo $(DEPDIR)/ispeed_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hypervisor_policies/ispeed_policy.c' object='ispeed_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ispeed_policy.lo `test -f 'hypervisor_policies/ispeed_policy.c' || echo '$(srcdir)/'`hypervisor_policies/ispeed_policy.c ispeed_lp_policy.lo: hypervisor_policies/ispeed_lp_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ispeed_lp_policy.lo -MD -MP -MF $(DEPDIR)/ispeed_lp_policy.Tpo -c -o ispeed_lp_policy.lo `test -f 'hypervisor_policies/ispeed_lp_policy.c' || echo '$(srcdir)/'`hypervisor_policies/ispeed_lp_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ispeed_lp_policy.Tpo $(DEPDIR)/ispeed_lp_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hypervisor_policies/ispeed_lp_policy.c' object='ispeed_lp_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ispeed_lp_policy.lo `test -f 'hypervisor_policies/ispeed_lp_policy.c' || echo '$(srcdir)/'`hypervisor_policies/ispeed_lp_policy.c throughput_lp_policy.lo: hypervisor_policies/throughput_lp_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT throughput_lp_policy.lo -MD -MP -MF $(DEPDIR)/throughput_lp_policy.Tpo -c -o throughput_lp_policy.lo `test -f 'hypervisor_policies/throughput_lp_policy.c' || echo '$(srcdir)/'`hypervisor_policies/throughput_lp_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/throughput_lp_policy.Tpo $(DEPDIR)/throughput_lp_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hypervisor_policies/throughput_lp_policy.c' object='throughput_lp_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o throughput_lp_policy.lo `test -f 'hypervisor_policies/throughput_lp_policy.c' || echo '$(srcdir)/'`hypervisor_policies/throughput_lp_policy.c hard_coded_policy.lo: hypervisor_policies/hard_coded_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT hard_coded_policy.lo -MD -MP -MF $(DEPDIR)/hard_coded_policy.Tpo -c -o hard_coded_policy.lo `test -f 'hypervisor_policies/hard_coded_policy.c' || echo '$(srcdir)/'`hypervisor_policies/hard_coded_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/hard_coded_policy.Tpo $(DEPDIR)/hard_coded_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hypervisor_policies/hard_coded_policy.c' object='hard_coded_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hard_coded_policy.lo `test -f 'hypervisor_policies/hard_coded_policy.c' || echo '$(srcdir)/'`hypervisor_policies/hard_coded_policy.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-libLTLIBRARIES install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES .PRECIOUS: Makefile showcheck: -cat /dev/null # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.2.3+dfsg/sc_hypervisor/src/hypervisor_policies/000077500000000000000000000000001320135501600235355ustar00rootroot00000000000000starpu-1.2.3+dfsg/sc_hypervisor/src/hypervisor_policies/app_driven_policy.c000066400000000000000000000022301320135501600274040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include static void app_driven_handle_post_exec_hook(unsigned sched_ctx, __attribute__((unused)) int task_tag) { sc_hypervisor_policy_resize_to_unknown_receiver(sched_ctx, 1); } struct sc_hypervisor_policy app_driven_policy = { .size_ctxs = NULL, .handle_poped_task = NULL, .handle_pushed_task = NULL, .handle_idle_cycle = NULL, .handle_idle_end = NULL, .handle_post_exec_hook = app_driven_handle_post_exec_hook, .handle_submitted_job = NULL, .end_ctx = NULL, .custom = 0, .name = "app_driven" }; starpu-1.2.3+dfsg/sc_hypervisor/src/hypervisor_policies/feft_lp_policy.c000066400000000000000000000246671320135501600267160ustar00rootroot00000000000000 /* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 - 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "sc_hypervisor_lp.h" #include "sc_hypervisor_policy.h" #include #include unsigned long resize_no = 0; #ifdef STARPU_HAVE_GLPK_H static void _try_resizing(unsigned *sched_ctxs, int nsched_ctxs, int *workers, int nworkers) { /* for vite */ int ns = sched_ctxs == NULL ? sc_hypervisor_get_nsched_ctxs() : nsched_ctxs; #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("resize_no = %lu %d ctxs\n", resize_no, ns); #endif if(ns <= 0) return; unsigned *curr_sched_ctxs = sched_ctxs == NULL ? sc_hypervisor_get_sched_ctxs() : sched_ctxs; unsigned curr_nworkers = nworkers == -1 ? starpu_worker_get_count() : (unsigned)nworkers; struct types_of_workers *tw = sc_hypervisor_get_types_of_workers(workers, curr_nworkers); int nw = tw->nw; double nworkers_per_ctx[ns][nw]; int total_nw[nw]; sc_hypervisor_group_workers_by_type(tw, total_nw); unsigned can_redistrib = 0; struct timeval start_time; struct timeval end_time; gettimeofday(&start_time, NULL); double vmax = sc_hypervisor_lp_get_nworkers_per_ctx(ns, nw, nworkers_per_ctx, total_nw, tw, sched_ctxs); gettimeofday(&end_time, NULL); long diff_s = end_time.tv_sec - start_time.tv_sec; long diff_us = end_time.tv_usec - start_time.tv_usec; __attribute__((unused)) float timing = (float)(diff_s*1000000 + diff_us)/1000.0; if(vmax != -1.0) { /* int nworkers_per_ctx_rounded[ns][nw]; */ /* sc_hypervisor_lp_round_double_to_int(ns, nw, nworkers_per_ctx, nworkers_per_ctx_rounded); */ /* // sc_hypervisor_lp_redistribute_resources_in_ctxs(ns, nw, nworkers_per_ctx_rounded, nworkers_per_ctx, curr_sched_ctxs, tw); */ /* sc_hypervisor_lp_distribute_resources_in_ctxs(curr_sched_ctxs, ns, nw, nworkers_per_ctx_rounded, nworkers_per_ctx, workers, curr_nworkers, tw); */ sc_hypervisor_lp_distribute_floating_no_resources_in_ctxs(curr_sched_ctxs, ns, nw, nworkers_per_ctx, workers, curr_nworkers, tw); sc_hypervisor_lp_share_remaining_resources(ns, curr_sched_ctxs, curr_nworkers, workers); } #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("*****finished resize \n"); #endif return; } static void _try_resizing_hierarchically(unsigned levels, unsigned current_level, unsigned *sched_ctxs, unsigned nsched_ctxs, int *pus, int npus) { if(levels == 0) return; _try_resizing(sched_ctxs, nsched_ctxs, pus, npus); int s; for(s = 0; s < nsched_ctxs; s++) { unsigned *sched_ctxs_child; int nsched_ctxs_child = 0; sc_hypervisor_get_ctxs_on_level(&sched_ctxs_child, &nsched_ctxs_child, current_level+1, sched_ctxs[s]); if(nsched_ctxs_child > 0) { int *pus_father; unsigned npus_father = 0; npus_father = starpu_sched_ctx_get_workers_list(sched_ctxs[s], &pus_father); _try_resizing_hierarchically(levels-1, current_level+1, sched_ctxs_child, nsched_ctxs_child, pus_father, npus_father); free(pus_father); free(sched_ctxs_child); } } return; } static int _get_min_level(unsigned *sched_ctxs, int nsched_ctxs) { int min = sc_hypervisor_get_nhierarchy_levels(); int s; for(s = 0; s < nsched_ctxs; s++) { int level = starpu_sched_ctx_get_hierarchy_level(sched_ctxs[s]); if(level < min) min = level; } return min; } static int _get_first_level(unsigned *sched_ctxs, int nsched_ctxs, unsigned *first_level, int *nsched_ctxs_first_level) { int min = _get_min_level(sched_ctxs, nsched_ctxs); int s; for(s = 0; s < nsched_ctxs; s++) if(starpu_sched_ctx_get_hierarchy_level(sched_ctxs[s]) == min) first_level[(*nsched_ctxs_first_level)++] = sched_ctxs[s]; return min; } static void _resize(unsigned *sched_ctxs, int nsched_ctxs, int *workers, int nworkers) { starpu_fxt_trace_user_event(resize_no); unsigned nhierarchy_levels = sc_hypervisor_get_nhierarchy_levels(); if(nhierarchy_levels > 1) { if(nsched_ctxs == -1) { unsigned *sched_ctxs2; int nsched_ctxs2; sc_hypervisor_get_ctxs_on_level(&sched_ctxs2, &nsched_ctxs2, 0, STARPU_NMAX_SCHED_CTXS); if(nsched_ctxs2 > 0) { _try_resizing_hierarchically(nhierarchy_levels, 0, sched_ctxs2, nsched_ctxs2, workers, nworkers); free(sched_ctxs2); } } else { unsigned first_level[nsched_ctxs]; int nsched_ctxs_first_level = 0; int min = _get_first_level(sched_ctxs, nsched_ctxs, first_level, &nsched_ctxs_first_level); _try_resizing_hierarchically(nhierarchy_levels, min, first_level, nsched_ctxs_first_level, workers, nworkers); } } else _try_resizing(sched_ctxs, nsched_ctxs, workers, nworkers); resize_no++; } static void _resize_if_speed_diff(unsigned sched_ctx, int worker) { unsigned nhierarchy_levels = sc_hypervisor_get_nhierarchy_levels(); if(nhierarchy_levels > 1) { unsigned current_level = starpu_sched_ctx_get_hierarchy_level(sched_ctx); if(current_level == 0) { _resize(NULL, -1, NULL, -1); return; } unsigned father = starpu_sched_ctx_get_inheritor(sched_ctx); int level; int *pus_father_old = NULL; unsigned npus_father_old = 0; unsigned *sched_ctxs_old = NULL; int nsched_ctxs_old = 0; unsigned is_speed_diff = 0; unsigned last_level_diff = 0; for(level = current_level ; level >= 0; level--) { int *pus_father = NULL; int npus_father = -1; if(level > 0) npus_father = starpu_sched_ctx_get_workers_list(father, &pus_father); unsigned *sched_ctxs = NULL; int nsched_ctxs = 0; is_speed_diff = sc_hypervisor_check_speed_gap_btw_ctxs_on_level(level, pus_father, npus_father, father, &sched_ctxs, &nsched_ctxs); if(!is_speed_diff) { if(level == current_level) { if(pus_father) free(pus_father); if(sched_ctxs) free(sched_ctxs); pus_father = NULL; sched_ctxs = NULL; break; } else { _resize(sched_ctxs_old, nsched_ctxs_old, pus_father_old, npus_father_old); if(pus_father_old) free(pus_father_old); if(sched_ctxs_old) free(sched_ctxs_old); pus_father_old = NULL; sched_ctxs_old = NULL; if(pus_father) free(pus_father); if(nsched_ctxs > 0) free(sched_ctxs); pus_father = NULL; sched_ctxs = NULL; break; } } if(pus_father_old) free(pus_father_old); if(sched_ctxs_old) free(sched_ctxs_old); pus_father_old = pus_father; sched_ctxs_old = sched_ctxs; npus_father_old = npus_father; nsched_ctxs_old = nsched_ctxs; father = level > 1 ? starpu_sched_ctx_get_inheritor(father) : STARPU_NMAX_SCHED_CTXS; } if(is_speed_diff) { if(pus_father_old) free(pus_father_old); if(sched_ctxs_old) free(sched_ctxs_old); _resize(NULL, -1, NULL, -1); } } else { unsigned criteria = sc_hypervisor_get_resize_criteria(); if(criteria != SC_NOTHING && criteria == SC_IDLE) { _resize(NULL, -1, NULL, -1); } else { if(sc_hypervisor_check_speed_gap_btw_ctxs(NULL, -1, NULL, -1)) _resize(NULL, -1, NULL, -1); } } return; } static void feft_lp_handle_poped_task(unsigned sched_ctx, int worker, __attribute__((unused))struct starpu_task *task, __attribute__((unused))uint32_t footprint) { if(worker == -2) return; unsigned criteria = sc_hypervisor_get_resize_criteria(); if(criteria != SC_NOTHING && criteria == SC_SPEED) { int ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { _resize_if_speed_diff(sched_ctx, worker); STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); } } } static void feft_lp_size_ctxs(unsigned *sched_ctxs, int nsched_ctxs, int *workers, int nworkers) { STARPU_PTHREAD_MUTEX_LOCK(&act_hypervisor_mutex); struct sc_hypervisor_wrapper* sc_w = NULL; int s = 0; for(s = 0; s < nsched_ctxs; s++) { sc_w = sc_hypervisor_get_wrapper(sched_ctxs[s]); sc_w->to_be_sized = 1; } _resize(sched_ctxs, nsched_ctxs, workers, nworkers); #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("finished size ctxs\n"); #endif STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); } static void _resize_leaves(int worker) { unsigned s, s2; unsigned *sched_ctxs = NULL; unsigned nsched_ctxs = starpu_worker_get_sched_ctx_list(worker, &sched_ctxs); unsigned workers_sched_ctxs[nsched_ctxs]; unsigned nworkers_sched_ctxs = 0; struct sc_hypervisor_wrapper *sc_w = NULL; for(s = 0; s < nsched_ctxs; s++) { sc_w = sc_hypervisor_get_wrapper(sched_ctxs[s]); if(sc_w->sched_ctx != STARPU_NMAX_SCHED_CTXS) { workers_sched_ctxs[nworkers_sched_ctxs++] = sched_ctxs[s]; } } free(sched_ctxs); unsigned leaves[nsched_ctxs]; unsigned nleaves = 0; sc_hypervisor_get_leaves(workers_sched_ctxs, nworkers_sched_ctxs, leaves, &nleaves); for(s = 0; s < nleaves; s++) _resize_if_speed_diff(leaves[s], worker); } static void feft_lp_handle_idle_cycle(unsigned sched_ctx, int worker) { unsigned criteria = sc_hypervisor_get_resize_criteria(); if(criteria != SC_NOTHING)// && criteria == SC_IDLE) { int ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { _resize_leaves(worker); STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); } } } static void feft_lp_resize_ctxs(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers) { int ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { struct sc_hypervisor_wrapper* sc_w = NULL; int s = 0; for(s = 0; s < nsched_ctxs; s++) { sc_w = sc_hypervisor_get_wrapper(sched_ctxs[s]); if((sc_w->submitted_flops + (0.1*sc_w->total_flops)) < sc_w->total_flops) { STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); return; } } _resize(sched_ctxs, nsched_ctxs, workers, nworkers); STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); } } struct sc_hypervisor_policy feft_lp_policy = { .size_ctxs = feft_lp_size_ctxs, .resize_ctxs = feft_lp_resize_ctxs, .handle_poped_task = feft_lp_handle_poped_task, .handle_pushed_task = NULL, .handle_idle_cycle = feft_lp_handle_idle_cycle, .handle_idle_end = NULL, .handle_post_exec_hook = NULL, .handle_submitted_job = NULL, .end_ctx = NULL, .custom = 0, .name = "feft_lp" }; #endif /* STARPU_HAVE_GLPK_H */ starpu-1.2.3+dfsg/sc_hypervisor/src/hypervisor_policies/gflops_rate_policy.c000066400000000000000000000300061320135501600275640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "sc_hypervisor_policy.h" static double _get_total_elapsed_flops_per_sched_ctx(unsigned sched_ctx) { struct sc_hypervisor_wrapper* sc_w = sc_hypervisor_get_wrapper(sched_ctx); double ret_val = 0.0; int i; for(i = 0; i < STARPU_NMAXWORKERS; i++) ret_val += sc_w->total_elapsed_flops[i]; return ret_val; } double _get_exp_end(unsigned sched_ctx) { struct sc_hypervisor_wrapper *sc_w = sc_hypervisor_get_wrapper(sched_ctx); double elapsed_flops = sc_hypervisor_get_elapsed_flops_per_sched_ctx(sc_w); if( elapsed_flops >= 1.0) { double curr_time = starpu_timing_now(); double elapsed_time = curr_time - sc_w->start_time; double exp_end = (elapsed_time * sc_w->remaining_flops / elapsed_flops) + curr_time; return exp_end; } return -1.0; } /* computes the instructions left to be executed out of the total instructions to execute */ double _get_flops_left_pct(unsigned sched_ctx) { struct sc_hypervisor_wrapper *wrapper = sc_hypervisor_get_wrapper(sched_ctx); double total_elapsed_flops = _get_total_elapsed_flops_per_sched_ctx(sched_ctx); if(wrapper->total_flops == total_elapsed_flops || total_elapsed_flops > wrapper->total_flops) return 0.0; return (wrapper->total_flops - total_elapsed_flops)/wrapper->total_flops; } /* select the workers needed to be moved in order to force the sender and the receiver context to finish simultaneously */ static int* _get_workers_to_move(unsigned sender_sched_ctx, unsigned receiver_sched_ctx, int *nworkers) { struct sc_hypervisor_wrapper* sender_sc_w = sc_hypervisor_get_wrapper(sender_sched_ctx); struct sc_hypervisor_wrapper* receiver_sc_w = sc_hypervisor_get_wrapper(receiver_sched_ctx); int *workers = NULL; double v_receiver = sc_hypervisor_get_ctx_speed(receiver_sc_w); double receiver_remainig_flops = receiver_sc_w->remaining_flops; double sender_exp_end = _get_exp_end(sender_sched_ctx); double sender_v_cpu = sc_hypervisor_get_speed_per_worker_type(sender_sc_w, STARPU_CPU_WORKER); double v_for_rctx = (receiver_remainig_flops/(sender_exp_end - starpu_timing_now())) - v_receiver; int nworkers_needed = v_for_rctx/sender_v_cpu; /* printf("%d->%d: v_rec %lf v %lf v_cpu %lf w_needed %d \n", sender_sched_ctx, receiver_sched_ctx, */ /* v_receiver, v_for_rctx, sender_v_cpu, nworkers_needed); */ if(nworkers_needed > 0) { struct sc_hypervisor_policy_config *sender_config = sc_hypervisor_get_config(sender_sched_ctx); int potential_moving_cpus = sc_hypervisor_get_movable_nworkers(sender_config, sender_sched_ctx, STARPU_CPU_WORKER); int potential_moving_gpus = sc_hypervisor_get_movable_nworkers(sender_config, sender_sched_ctx, STARPU_CUDA_WORKER); int sender_nworkers = (int)starpu_sched_ctx_get_nworkers(sender_sched_ctx); struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(receiver_sched_ctx); int nworkers_ctx = (int)starpu_sched_ctx_get_nworkers(receiver_sched_ctx); if(nworkers_needed < (potential_moving_cpus + 5 * potential_moving_gpus)) { if((sender_nworkers - nworkers_needed) >= sender_config->min_nworkers) { if((nworkers_ctx + nworkers_needed) > config->max_nworkers) nworkers_needed = nworkers_ctx > config->max_nworkers ? 0 : (config->max_nworkers - nworkers_ctx); if(nworkers_needed > 0) { int ngpus = nworkers_needed / 5; int *gpus; gpus = sc_hypervisor_get_idlest_workers(sender_sched_ctx, &ngpus, STARPU_CUDA_WORKER); int ncpus = nworkers_needed - ngpus; int *cpus; cpus = sc_hypervisor_get_idlest_workers(sender_sched_ctx, &ncpus, STARPU_CPU_WORKER); workers = (int*)malloc(nworkers_needed*sizeof(int)); int i; printf("%d: gpus: ", nworkers_needed); for(i = 0; i < ngpus; i++) { workers[(*nworkers)++] = gpus[i]; printf("%d ", gpus[i]); } printf(" cpus:"); for(i = 0; i < ncpus; i++) { workers[(*nworkers)++] = cpus[i]; printf("%d ", cpus[i]); } printf("\n"); free(gpus); free(cpus); } } } else { /*if the needed number of workers is to big we only move the number of workers corresponding to the granularity set by the user */ int nworkers_to_move = sc_hypervisor_compute_nworkers_to_move(sender_sched_ctx); if(sender_nworkers - nworkers_to_move >= sender_config->min_nworkers) { int nshared_workers = (int)starpu_sched_ctx_get_nshared_workers(sender_sched_ctx, receiver_sched_ctx); if((nworkers_ctx + nworkers_to_move - nshared_workers) > config->max_nworkers) nworkers_to_move = nworkers_ctx > config->max_nworkers ? 0 : (config->max_nworkers - nworkers_ctx + nshared_workers); if(nworkers_to_move > 0) { workers = sc_hypervisor_get_idlest_workers(sender_sched_ctx, &nworkers_to_move, STARPU_ANY_WORKER); *nworkers = nworkers_to_move; } } } } return workers; } static unsigned _gflops_rate_resize(unsigned sender_sched_ctx, unsigned receiver_sched_ctx, unsigned force_resize) { int ret = 1; if(force_resize) STARPU_PTHREAD_MUTEX_LOCK(&act_hypervisor_mutex); else ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { int nworkers_to_move = 0; int *workers_to_move = _get_workers_to_move(sender_sched_ctx, receiver_sched_ctx, &nworkers_to_move); if(nworkers_to_move > 0) { sc_hypervisor_move_workers(sender_sched_ctx, receiver_sched_ctx, workers_to_move, nworkers_to_move, 0); struct sc_hypervisor_policy_config *new_config = sc_hypervisor_get_config(receiver_sched_ctx); int i; for(i = 0; i < nworkers_to_move; i++) new_config->max_idle[workers_to_move[i]] = new_config->max_idle[workers_to_move[i]] !=MAX_IDLE_TIME ? new_config->max_idle[workers_to_move[i]] : new_config->new_workers_max_idle; free(workers_to_move); } STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); return 1; } return 0; } static int _find_fastest_sched_ctx() { unsigned *sched_ctxs = sc_hypervisor_get_sched_ctxs(); int nsched_ctxs = sc_hypervisor_get_nsched_ctxs(); double first_exp_end = _get_exp_end(sched_ctxs[0]); int fastest_sched_ctx = first_exp_end == -1.0 ? -1 : (int)sched_ctxs[0]; double curr_exp_end = 0.0; int i; for(i = 1; i < nsched_ctxs; i++) { curr_exp_end = _get_exp_end(sched_ctxs[i]); if((curr_exp_end < first_exp_end || first_exp_end == -1.0) && curr_exp_end != -1.0) { first_exp_end = curr_exp_end; fastest_sched_ctx = sched_ctxs[i]; } } return fastest_sched_ctx; } static int _find_slowest_sched_ctx() { unsigned *sched_ctxs = sc_hypervisor_get_sched_ctxs(); int nsched_ctxs = sc_hypervisor_get_nsched_ctxs(); int slowest_sched_ctx = -1; double curr_exp_end = 0.0; double last_exp_end = -1.0; int i; for(i = 0; i < nsched_ctxs; i++) { curr_exp_end = _get_exp_end(sched_ctxs[i]); /*if it hasn't started bc of no ressources give it priority */ if(curr_exp_end == -1.0) return sched_ctxs[i]; if( curr_exp_end > last_exp_end) { slowest_sched_ctx = sched_ctxs[i]; last_exp_end = curr_exp_end; } } return slowest_sched_ctx; } static int _find_slowest_available_sched_ctx(unsigned sched_ctx) { unsigned *sched_ctxs = sc_hypervisor_get_sched_ctxs(); int nsched_ctxs = sc_hypervisor_get_nsched_ctxs(); int slowest_sched_ctx = -1; double curr_exp_end = 0.0; double last_exp_end = -1.0; int i; for(i = 0; i < nsched_ctxs; i++) { if(sched_ctxs[i] != sched_ctx) { curr_exp_end = _get_exp_end(sched_ctxs[i]); /*if it hasn't started bc of no ressources give it priority */ if(curr_exp_end == -1.0) return sched_ctxs[i]; if(last_exp_end < curr_exp_end) { slowest_sched_ctx = sched_ctxs[i]; last_exp_end = curr_exp_end; } } } return slowest_sched_ctx; } static void gflops_rate_resize(unsigned sched_ctx) { _get_exp_end(sched_ctx); double flops_left_pct = _get_flops_left_pct(sched_ctx); /* if the context finished all the instructions it had to execute we move all the resources to the slowest context */ if(flops_left_pct == 0.0f) { int slowest_sched_ctx = _find_slowest_available_sched_ctx(sched_ctx); if(slowest_sched_ctx != -1) { double slowest_flops_left_pct = _get_flops_left_pct(slowest_sched_ctx); if(slowest_flops_left_pct != 0.0f) { struct sc_hypervisor_policy_config* config = sc_hypervisor_get_config(sched_ctx); config->min_nworkers = 0; config->max_nworkers = 0; printf("ctx %u finished & gives away the res to %d; slow_left %lf\n", sched_ctx, slowest_sched_ctx, slowest_flops_left_pct); sc_hypervisor_policy_resize(sched_ctx, slowest_sched_ctx, 1, 1); sc_hypervisor_stop_resize(slowest_sched_ctx); } } } int fastest_sched_ctx = _find_fastest_sched_ctx(); int slowest_sched_ctx = _find_slowest_sched_ctx(); if(fastest_sched_ctx != -1 && slowest_sched_ctx != -1 && fastest_sched_ctx != slowest_sched_ctx) { double fastest_exp_end = _get_exp_end(fastest_sched_ctx); double slowest_exp_end = _get_exp_end(slowest_sched_ctx); if((slowest_exp_end == -1.0 && fastest_exp_end != -1.0) || ((fastest_exp_end + (fastest_exp_end*0.5)) < slowest_exp_end )) { double fast_flops_left_pct = _get_flops_left_pct(fastest_sched_ctx); if(fast_flops_left_pct < 0.8) { struct sc_hypervisor_wrapper *sc_w = sc_hypervisor_get_wrapper(slowest_sched_ctx); double elapsed_flops = sc_hypervisor_get_elapsed_flops_per_sched_ctx(sc_w); if((elapsed_flops/sc_w->total_flops) > 0.1) _gflops_rate_resize(fastest_sched_ctx, slowest_sched_ctx, 0); } } } } static void gflops_rate_handle_poped_task(unsigned sched_ctx, __attribute__((unused)) int worker, __attribute__((unused))struct starpu_task *task, __attribute__((unused))uint32_t footprint) { gflops_rate_resize(sched_ctx); } struct sc_hypervisor_policy gflops_rate_policy = { .size_ctxs = NULL, .resize_ctxs = NULL, .handle_poped_task = gflops_rate_handle_poped_task, .handle_pushed_task = NULL, .handle_idle_cycle = NULL, .handle_idle_end = NULL, .handle_post_exec_hook = NULL, .handle_submitted_job = NULL, .end_ctx = NULL, .custom = 0, .name = "gflops_rate" }; starpu-1.2.3+dfsg/sc_hypervisor/src/hypervisor_policies/hard_coded_policy.c000066400000000000000000000076511320135501600273450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "sc_hypervisor_policy.h" #include "sc_hypervisor_lp.h" #include "sc_hypervisor_policy.h" unsigned hard_coded_worker_belong_to_other_sched_ctx(unsigned sched_ctx, int worker) { unsigned *sched_ctxs = sc_hypervisor_get_sched_ctxs(); int nsched_ctxs = sc_hypervisor_get_nsched_ctxs(); int i; for(i = 0; i < nsched_ctxs; i++) if(sched_ctxs[i] != sched_ctx && starpu_sched_ctx_contains_worker(worker, sched_ctxs[i])) return 1; return 0; } void hard_coded_handle_idle_cycle(unsigned sched_ctx, int worker) { unsigned criteria = sc_hypervisor_get_resize_criteria(); if(criteria != SC_NOTHING)// && criteria == SC_SPEED) { int ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { // if(sc_hypervisor_criteria_fulfilled(sched_ctx, worker)) // if(sc_hypervisor_check_speed_gap_btw_ctxs(NULL, -1, NULL, -1)) if(sc_hypervisor_check_idle(sched_ctx, worker)) { if(hard_coded_worker_belong_to_other_sched_ctx(sched_ctx, worker)) sc_hypervisor_remove_workers_from_sched_ctx(&worker, 1, sched_ctx, 1); else { // sc_hypervisor_policy_resize_to_unknown_receiver(sched_ctx, 0); unsigned *sched_ctxs = sc_hypervisor_get_sched_ctxs(); int ns = sc_hypervisor_get_nsched_ctxs(); int nworkers = (int)starpu_worker_get_count(); struct types_of_workers *tw = sc_hypervisor_get_types_of_workers(NULL, nworkers); int nw = tw->nw; double w_in_s[ns][nw]; w_in_s[0][0] = 1; w_in_s[0][1] = 3; w_in_s[1][0] = 8; w_in_s[1][1] = 0; // sc_hypervisor_lp_place_resources_in_ctx(ns, nw, w_in_s, sched_ctxs, NULL, 1, tw); sc_hypervisor_lp_distribute_floating_no_resources_in_ctxs(sc_hypervisor_get_sched_ctxs(), ns, tw->nw, w_in_s, NULL, nworkers, tw); } } STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); } } } static void hard_coded_handle_poped_task(unsigned sched_ctx, __attribute__((unused))int worker, struct starpu_task *task, uint32_t footprint) { unsigned criteria = sc_hypervisor_get_resize_criteria(); if(criteria != SC_NOTHING && criteria == SC_SPEED) { int ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { if(sc_hypervisor_criteria_fulfilled(sched_ctx, worker)) { // sc_hypervisor_policy_resize_to_unknown_receiver(sched_ctx, 0); unsigned *sched_ctxs = sc_hypervisor_get_sched_ctxs(); int ns = sc_hypervisor_get_nsched_ctxs(); int nworkers = (int)starpu_worker_get_count(); struct types_of_workers *tw = sc_hypervisor_get_types_of_workers(NULL, nworkers); int nw = tw->nw; double w_in_s[ns][nw]; w_in_s[0][0] = 1; w_in_s[0][1] = 3; w_in_s[1][0] = 8; w_in_s[1][1] = 0; // sc_hypervisor_lp_place_resources_in_ctx(ns, nw, w_in_s, sched_ctxs, NULL, 1, tw); sc_hypervisor_lp_distribute_floating_no_resources_in_ctxs(sc_hypervisor_get_sched_ctxs(), ns, tw->nw, w_in_s, NULL, nworkers, tw); } STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); } } } struct sc_hypervisor_policy hard_coded_policy = { .size_ctxs = NULL, .handle_poped_task = hard_coded_handle_poped_task, .handle_pushed_task = NULL, .handle_idle_cycle = hard_coded_handle_idle_cycle, .handle_idle_end = NULL, .handle_post_exec_hook = NULL, .handle_submitted_job = NULL, .end_ctx = NULL, .custom = 0, .name = "hard_coded" }; starpu-1.2.3+dfsg/sc_hypervisor/src/hypervisor_policies/idle_policy.c000066400000000000000000000031761320135501600262040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "sc_hypervisor_policy.h" unsigned worker_belong_to_other_sched_ctx(unsigned sched_ctx, int worker) { unsigned *sched_ctxs = sc_hypervisor_get_sched_ctxs(); int nsched_ctxs = sc_hypervisor_get_nsched_ctxs(); int i; for(i = 0; i < nsched_ctxs; i++) if(sched_ctxs[i] != sched_ctx && starpu_sched_ctx_contains_worker(worker, sched_ctxs[i])) return 1; return 0; } void idle_handle_idle_cycle(unsigned sched_ctx, int worker) { if(sc_hypervisor_criteria_fulfilled(sched_ctx, worker)) { if(worker_belong_to_other_sched_ctx(sched_ctx, worker)) sc_hypervisor_remove_workers_from_sched_ctx(&worker, 1, sched_ctx, 1); else sc_hypervisor_policy_resize_to_unknown_receiver(sched_ctx, 0); } } struct sc_hypervisor_policy idle_policy = { .size_ctxs = NULL, .handle_poped_task = NULL, .handle_pushed_task = NULL, .handle_idle_cycle = idle_handle_idle_cycle, .handle_idle_end = NULL, .handle_post_exec_hook = NULL, .handle_submitted_job = NULL, .end_ctx = NULL, .custom = 0, .name = "idle" }; starpu-1.2.3+dfsg/sc_hypervisor/src/hypervisor_policies/ispeed_lp_policy.c000066400000000000000000000203671320135501600272340ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "sc_hypervisor_lp.h" #include "sc_hypervisor_policy.h" #include #include struct ispeed_lp_data { double **speed; double *flops; double **flops_on_w; int *workers; }; #ifdef STARPU_HAVE_GLPK_H static double _compute_workers_distrib(int ns, int nw, double final_w_in_s[ns][nw], unsigned is_integer, double tmax, void *specific_data) { struct ispeed_lp_data *sd = (struct ispeed_lp_data *)specific_data; double **speed = sd->speed; double *flops = sd->flops; double **final_flops_on_w = sd->flops_on_w; return sc_hypervisor_lp_simulate_distrib_flops_on_sample(ns, nw, final_w_in_s, is_integer, tmax, speed, flops, final_flops_on_w); } static unsigned _compute_flops_distribution_over_ctxs(int ns, int nw, double w_in_s[ns][nw], double **flops_on_w, unsigned *sched_ctxs, int *workers) { double *flops = (double*)malloc(ns*sizeof(double)); double **speed = (double **)malloc(ns*sizeof(double*)); int i; for(i = 0; i < ns; i++) speed[i] = (double*)malloc(nw*sizeof(double)); int w,s; struct sc_hypervisor_wrapper* sc_w = NULL; for(s = 0; s < ns; s++) { sc_w = sc_hypervisor_get_wrapper(sched_ctxs[s]); for(w = 0; w < nw; w++) { w_in_s[s][w] = 0.0; int worker = workers == NULL ? w : workers[w]; speed[s][w] = sc_hypervisor_get_speed_per_worker(sc_w, worker); if(speed[s][w] == -1.0) { enum starpu_worker_archtype arch = starpu_worker_get_type(worker); speed[s][w] = sc_hypervisor_get_speed(sc_w, arch); if(arch == STARPU_CUDA_WORKER) { unsigned worker_in_ctx = starpu_sched_ctx_contains_worker(worker, sc_w->sched_ctx); if(!worker_in_ctx) { double transfer_speed = starpu_transfer_bandwidth(STARPU_MAIN_RAM, starpu_worker_get_memory_node(worker)) / 1000; speed[s][w] = (speed[s][w] * transfer_speed) / (speed[s][w] + transfer_speed); } } } // printf("v[w%d][s%d] = %lf\n",w, s, speed[s][w]); } struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(sched_ctxs[s]); flops[s] = config->ispeed_ctx_sample/1000000000; /* in gflops */ } /* take the exec time of the slowest ctx as starting point and then try to minimize it as increasing it a little for the faster ctxs */ double tmax = sc_hypervisor_get_slowest_ctx_exec_time(); double smallest_tmax = sc_hypervisor_get_fastest_ctx_exec_time(); //tmax - 0.5*tmax; // printf("tmax %lf smallest %lf\n", tmax, smallest_tmax); double tmin = 0.0; struct ispeed_lp_data specific_data; specific_data.speed = speed; specific_data.flops = flops; specific_data.flops_on_w = flops_on_w; specific_data.workers = workers; unsigned found_sol = sc_hypervisor_lp_execute_dichotomy(ns, nw, w_in_s, 1, (void*)&specific_data, tmin, tmax, smallest_tmax, _compute_workers_distrib); for(i = 0; i < ns; i++) free(speed[i]); free(speed); return found_sol; } static void _try_resizing(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers) { int ns = sched_ctxs == NULL ? sc_hypervisor_get_nsched_ctxs() : nsched_ctxs; int nw = nworkers == -1 ? (int)starpu_worker_get_count() : nworkers; /* Number of different workers */ unsigned *curr_sched_ctxs = sched_ctxs == NULL ? sc_hypervisor_get_sched_ctxs() : sched_ctxs; struct types_of_workers *tw = sc_hypervisor_get_types_of_workers(workers, nw); int ntypes_of_workers = tw->nw; double w_in_s[ns][nw]; double **flops_on_w = (double**)malloc(ns*sizeof(double*)); int i; for(i = 0; i < ns; i++) flops_on_w[i] = (double*)malloc(nw*sizeof(double)); struct timeval start_time; struct timeval end_time; gettimeofday(&start_time, NULL); unsigned found_sol = _compute_flops_distribution_over_ctxs(ns, nw, w_in_s, flops_on_w, curr_sched_ctxs, workers); gettimeofday(&end_time, NULL); long diff_s = end_time.tv_sec - start_time.tv_sec; long diff_us = end_time.tv_usec - start_time.tv_usec; __attribute__((unused)) float timing = (float)(diff_s*1000000 + diff_us)/1000.0; /* if we did find at least one solution redistribute the resources */ if(found_sol) { int w, s; double nworkers_per_ctx[ns][ntypes_of_workers]; int nworkers_per_ctx_rounded[ns][ntypes_of_workers]; for(s = 0; s < ns; s++) { for(w = 0; w < ntypes_of_workers; w++) { nworkers_per_ctx[s][w] = 0.0; nworkers_per_ctx_rounded[s][w] = 0; } } for(s = 0; s < ns; s++) { for(w = 0; w < nw; w++) { enum starpu_worker_archtype arch = starpu_worker_get_type(w); int idx = sc_hypervisor_get_index_for_arch(arch, tw); nworkers_per_ctx[s][idx] += w_in_s[s][w]; if(arch == STARPU_CUDA_WORKER) { if(w_in_s[s][w] >= 0.3) nworkers_per_ctx_rounded[s][idx]++; } else { if(w_in_s[s][w] > 0.5) nworkers_per_ctx_rounded[s][idx]++; } } } /* for(s = 0; s < ns; s++) */ /* printf("%d: cpus = %lf gpus = %lf cpus_round = %d gpus_round = %d\n", s, nworkers[s][1], nworkers[s][0], */ /* nworkers_rounded[s][1], nworkers_rounded[s][0]); */ sc_hypervisor_lp_redistribute_resources_in_ctxs(ns, ntypes_of_workers, nworkers_per_ctx_rounded, nworkers_per_ctx, curr_sched_ctxs, tw); } free(tw); for(i = 0; i < ns; i++) free(flops_on_w[i]); free(flops_on_w); } static void ispeed_lp_handle_poped_task(__attribute__((unused))unsigned sched_ctx, __attribute__((unused))int worker, __attribute__((unused))struct starpu_task *task, __attribute__((unused))uint32_t footprint) { int ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { unsigned criteria = sc_hypervisor_get_resize_criteria(); if(criteria != SC_NOTHING && criteria == SC_SPEED) { if(sc_hypervisor_check_speed_gap_btw_ctxs(NULL, -1, NULL, -1)) { _try_resizing(NULL, -1, NULL, -1); } } STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); } } static void ispeed_lp_handle_idle_cycle(unsigned sched_ctx, int worker) { int ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { unsigned criteria = sc_hypervisor_get_resize_criteria(); if(criteria != SC_NOTHING && criteria == SC_IDLE) { if(sc_hypervisor_check_idle(sched_ctx, worker)) { _try_resizing(NULL, -1, NULL, -1); } } STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); } } static void ispeed_lp_resize_ctxs(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers) { int ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { _try_resizing(sched_ctxs, nsched_ctxs, workers, nworkers); STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); } } static void ispeed_lp_end_ctx(__attribute__((unused))unsigned sched_ctx) { /* struct sc_hypervisor_wrapper* sc_w = sc_hypervisor_get_wrapper(sched_ctx); */ /* int worker; */ /* for(worker = 0; worker < 12; worker++) */ /* printf("%d/%d: speed %lf\n", worker, sched_ctx, sc_w->ref_speed[worker]); */ return; } struct sc_hypervisor_policy ispeed_lp_policy = { .size_ctxs = NULL, .resize_ctxs = ispeed_lp_resize_ctxs, .handle_poped_task = ispeed_lp_handle_poped_task, .handle_pushed_task = NULL, .handle_idle_cycle = ispeed_lp_handle_idle_cycle, .handle_idle_end = NULL, .handle_post_exec_hook = NULL, .handle_submitted_job = NULL, .end_ctx = ispeed_lp_end_ctx, .custom = 0, .name = "ispeed_lp" }; #endif /* STARPU_HAVE_GLPK_H */ starpu-1.2.3+dfsg/sc_hypervisor/src/hypervisor_policies/ispeed_policy.c000066400000000000000000000142441320135501600265360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "sc_hypervisor_policy.h" static unsigned _get_fastest_sched_ctx(void) { unsigned *sched_ctxs = sc_hypervisor_get_sched_ctxs(); int nsched_ctxs = sc_hypervisor_get_nsched_ctxs(); int fastest_sched_ctx = STARPU_NMAX_SCHED_CTXS; double curr_speed = 0.0; double biggest_speed = 0.0; int i; for(i = 0; i < nsched_ctxs; i++) { curr_speed = sc_hypervisor_get_ctx_speed(sc_hypervisor_get_wrapper(sched_ctxs[i])); if( curr_speed > biggest_speed) { fastest_sched_ctx = sched_ctxs[i]; biggest_speed = curr_speed; } } return fastest_sched_ctx; } static unsigned _get_slowest_sched_ctx(void) { unsigned *sched_ctxs = sc_hypervisor_get_sched_ctxs(); int nsched_ctxs = sc_hypervisor_get_nsched_ctxs(); double smallest_speed = sc_hypervisor_get_ctx_speed(sc_hypervisor_get_wrapper(sched_ctxs[0])); unsigned slowest_sched_ctx = smallest_speed == -1.0 ? STARPU_NMAX_SCHED_CTXS : sched_ctxs[0]; double curr_speed = 0.0; int i; for(i = 1; i < nsched_ctxs; i++) { curr_speed = sc_hypervisor_get_ctx_speed(sc_hypervisor_get_wrapper(sched_ctxs[i])); if((curr_speed < smallest_speed || smallest_speed == 0.0) && curr_speed != -1.0) { smallest_speed = curr_speed; slowest_sched_ctx = sched_ctxs[i]; } } return slowest_sched_ctx; } /* get first nworkers with the highest idle time in the context */ static int* _get_slowest_workers(unsigned sched_ctx, int *nworkers, enum starpu_worker_archtype arch) { struct sc_hypervisor_wrapper* sc_w = sc_hypervisor_get_wrapper(sched_ctx); struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(sched_ctx); int *curr_workers = (int*)malloc((*nworkers) * sizeof(int)); int i; for(i = 0; i < *nworkers; i++) curr_workers[i] = -1; struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx); int index; int worker; int considered = 0; struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); for(index = 0; index < *nworkers; index++) { while(workers->has_next(workers, &it)) { considered = 0; worker = workers->get_next(workers, &it); enum starpu_worker_archtype curr_arch = starpu_worker_get_type(worker); if(arch == STARPU_ANY_WORKER || curr_arch == arch) { if(!config->fixed_workers[worker]) { for(i = 0; i < index; i++) { if(curr_workers[i] == worker) { considered = 1; break; } } if(!considered) { double worker_speed = sc_hypervisor_get_speed_per_worker(sc_w, worker); if(worker_speed != -1.0) { /* the first iteration*/ if(curr_workers[index] < 0) curr_workers[index] = worker; /* small priority worker is the first to leave the ctx*/ else if(config->priority[worker] < config->priority[curr_workers[index]]) curr_workers[index] = worker; /* if we don't consider priorities check for the workers with the biggest idle time */ else if(config->priority[worker] == config->priority[curr_workers[index]]) { double curr_worker_speed = sc_hypervisor_get_speed_per_worker(sc_w, curr_workers[index]); // printf("speed[%d] = %lf speed[%d] = %lf\n", worker, worker_speed, curr_workers[index], curr_worker_speed); if(worker_speed < curr_worker_speed && curr_worker_speed != -1.0) { curr_workers[index] = worker; } } } } } } } if(curr_workers[index] < 0) { *nworkers = index; break; } } return curr_workers; } static void ispeed_handle_poped_task(unsigned sched_ctx, int worker, __attribute__((unused))struct starpu_task *task, __attribute__((unused))uint32_t footprint) { int ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { if(sc_hypervisor_criteria_fulfilled(sched_ctx, worker)) { unsigned fastest_sched_ctx = _get_fastest_sched_ctx(); unsigned slowest_sched_ctx = _get_slowest_sched_ctx(); if(fastest_sched_ctx != STARPU_NMAX_SCHED_CTXS && slowest_sched_ctx != STARPU_NMAX_SCHED_CTXS && fastest_sched_ctx != slowest_sched_ctx) { int nworkers_to_move = sc_hypervisor_compute_nworkers_to_move(fastest_sched_ctx); if(nworkers_to_move > 0) { int *workers_to_move = _get_slowest_workers(fastest_sched_ctx, &nworkers_to_move, STARPU_ANY_WORKER); if(nworkers_to_move > 0) { double new_speed = 0.0; int i; for(i = 0; i < nworkers_to_move; i++) new_speed += sc_hypervisor_get_speed_per_worker(sc_hypervisor_get_wrapper(fastest_sched_ctx), workers_to_move[i]); double fastest_speed = sc_hypervisor_get_ctx_speed(sc_hypervisor_get_wrapper(fastest_sched_ctx)); double slowest_speed = sc_hypervisor_get_ctx_speed(sc_hypervisor_get_wrapper(slowest_sched_ctx)); // printf("fast_speed(%d) %lf slow_speed(%d) %lf new speed(%d) %lf \n", fastest_sched_ctx, fastest_speed, slowest_sched_ctx, // slowest_speed, workers_to_move[0], new_speed); if(fastest_speed != -1.0 && slowest_speed != -1.0 && (slowest_speed + new_speed) <= (fastest_speed - new_speed)) { sc_hypervisor_move_workers(fastest_sched_ctx, slowest_sched_ctx, workers_to_move, nworkers_to_move, 0); } } free(workers_to_move); } } } STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); } } struct sc_hypervisor_policy ispeed_policy = { .size_ctxs = NULL, .handle_poped_task = ispeed_handle_poped_task, .handle_pushed_task = NULL, .handle_idle_cycle = NULL, .handle_idle_end = NULL, .handle_post_exec_hook = NULL, .handle_submitted_job = NULL, .end_ctx = NULL, .custom = 0, .name = "ispeed" }; starpu-1.2.3+dfsg/sc_hypervisor/src/hypervisor_policies/teft_lp_policy.c000066400000000000000000000243101320135501600267150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "sc_hypervisor_lp.h" #include "sc_hypervisor_policy.h" #include #include static struct sc_hypervisor_policy_task_pool *task_pools = NULL; static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; struct teft_lp_data { int nt; double **tasks; unsigned *in_sched_ctxs; int *workers; struct sc_hypervisor_policy_task_pool *tmp_task_pools; unsigned size_ctxs; }; static double _compute_workers_distrib(int ns, int nw, double final_w_in_s[ns][nw], unsigned is_integer, double tmax, void *specific_data) { struct teft_lp_data *sd = (struct teft_lp_data *)specific_data; int nt = sd->nt; double **final_tasks = sd->tasks; unsigned *in_sched_ctxs = sd->in_sched_ctxs; int *workers = sd->workers; struct sc_hypervisor_policy_task_pool *tmp_task_pools = sd->tmp_task_pools; unsigned size_ctxs = sd->size_ctxs; if(tmp_task_pools == NULL) return 0.0; double w_in_s[ns][nw]; double tasks[nw][nt]; double times[nw][nt]; /* times in ms */ sc_hypervisor_get_tasks_times(nw, nt, times, workers, size_ctxs, task_pools); double res = 0.0; #ifdef STARPU_HAVE_GLPK_H res = sc_hypervisor_lp_simulate_distrib_tasks(ns, nw, nt, w_in_s, tasks, times, is_integer, tmax, in_sched_ctxs, tmp_task_pools); #endif //STARPU_HAVE_GLPK_H if(res != 0.0) { int s, w, t; for(s = 0; s < ns; s++) for(w = 0; w < nw; w++) final_w_in_s[s][w] = w_in_s[s][w]; for(w = 0; w < nw; w++) for(t = 0; t < nt; t++) final_tasks[w][t] = tasks[w][t]; } return res; } static void _size_ctxs(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers) { int ns = sched_ctxs == NULL ? sc_hypervisor_get_nsched_ctxs() : nsched_ctxs; int nw = workers == NULL ? (int)starpu_worker_get_count() : nworkers; /* Number of different workers */ int nt = 0; /* Number of different kinds of tasks */ struct sc_hypervisor_policy_task_pool * tp; for (tp = task_pools; tp; tp = tp->next) nt++; double w_in_s[ns][nw]; double **tasks=(double**)malloc(nw*sizeof(double*)); int i; for(i = 0; i < nw; i++) tasks[i] = (double*)malloc(nt*sizeof(double)); struct teft_lp_data specific_data; specific_data.nt = nt; specific_data.tasks = tasks; specific_data.in_sched_ctxs = sched_ctxs; specific_data.workers = workers; specific_data.tmp_task_pools = task_pools; specific_data.size_ctxs = 1; /* smallest possible tmax, difficult to obtain as we compute the nr of flops and not the tasks */ /*lp computes it in s but it's converted to ms just before return */ double possible_tmax = sc_hypervisor_lp_get_tmax(nw, workers); double smallest_tmax = possible_tmax / 3; double tmax = possible_tmax * ns; double tmin = 0.0; unsigned found_sol = 0; if(nt > 0 && tmax > 0.0) { found_sol = sc_hypervisor_lp_execute_dichotomy(ns, nw, w_in_s, 1, (void*)&specific_data, tmin, tmax, smallest_tmax, _compute_workers_distrib); } /* if we did find at least one solution redistribute the resources */ if(found_sol) { struct types_of_workers *tw = sc_hypervisor_get_types_of_workers(workers, nw); sc_hypervisor_lp_place_resources_in_ctx(ns, nw, w_in_s, sched_ctxs, workers, 1, tw); } for(i = 0; i < nw; i++) free(tasks[i]); free(tasks); } static void size_if_required() { int nsched_ctxs, nworkers; unsigned *sched_ctxs; int *workers; unsigned has_req = sc_hypervisor_get_size_req(&sched_ctxs, &nsched_ctxs, &workers, &nworkers); if(has_req) { struct sc_hypervisor_wrapper* sc_w = NULL; unsigned ready_to_size = 1; int s; STARPU_PTHREAD_MUTEX_LOCK(&act_hypervisor_mutex); for(s = 0; s < nsched_ctxs; s++) { sc_w = sc_hypervisor_get_wrapper(sched_ctxs[s]); // if(sc_w->submitted_flops < sc_w->total_flops) if((sc_w->submitted_flops + (0.1*sc_w->total_flops)) < sc_w->total_flops) ready_to_size = 0; } if(ready_to_size) { _size_ctxs(sched_ctxs, nsched_ctxs, workers, nworkers); sc_hypervisor_free_size_req(); } STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); } } static void teft_lp_handle_submitted_job(struct starpu_codelet *cl, unsigned sched_ctx, uint32_t footprint, size_t data_size) { /* count the tasks of the same type */ STARPU_PTHREAD_MUTEX_LOCK(&mutex); sc_hypervisor_policy_add_task_to_pool(cl, sched_ctx, footprint, &task_pools, data_size); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); size_if_required(); } static void _try_resizing(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers) { int ns = sched_ctxs == NULL ? sc_hypervisor_get_nsched_ctxs() : nsched_ctxs; if(ns < 2) return; int nw = workers == NULL ? (int)starpu_worker_get_count() : nworkers; /* Number of different workers */ sched_ctxs = sched_ctxs == NULL ? sc_hypervisor_get_sched_ctxs() : sched_ctxs; int nt = 0; /* Number of different kinds of tasks */ // STARPU_PTHREAD_MUTEX_LOCK(&mutex); /* we don't take the mutex bc a correct value of the number of tasks is not required but we do a copy in order to be sure that the linear progr won't segfault if the list of submitted task will change during the exec */ struct sc_hypervisor_policy_task_pool *tp = NULL; struct sc_hypervisor_policy_task_pool *tmp_task_pools = sc_hypervisor_policy_clone_task_pool(task_pools); for (tp = task_pools; tp; tp = tp->next) nt++; double w_in_s[ns][nw]; double **tasks_per_worker=(double**)malloc(nw*sizeof(double*)); int i; for(i = 0; i < nw; i++) tasks_per_worker[i] = (double*)malloc(nt*sizeof(double)); struct teft_lp_data specific_data; specific_data.nt = nt; specific_data.tasks = tasks_per_worker; specific_data.in_sched_ctxs = NULL; specific_data.workers = NULL; specific_data.tmp_task_pools = tmp_task_pools; specific_data.size_ctxs = 0; /* smallest possible tmax, difficult to obtain as we compute the nr of flops and not the tasks */ /*lp computes it in s but it's converted to ms just before return */ double possible_tmax = sc_hypervisor_lp_get_tmax(nw, NULL); double smallest_tmax = possible_tmax/2.0; double tmax = possible_tmax + smallest_tmax; double tmin = smallest_tmax; unsigned found_sol = 0; if(nt > 0 && tmax > 0.0) { struct timeval start_time; struct timeval end_time; gettimeofday(&start_time, NULL); found_sol = sc_hypervisor_lp_execute_dichotomy(ns, nw, w_in_s, 1, (void*)&specific_data, tmin, tmax, smallest_tmax, _compute_workers_distrib); gettimeofday(&end_time, NULL); long diff_s = end_time.tv_sec - start_time.tv_sec; long diff_us = end_time.tv_usec - start_time.tv_usec; __attribute__((unused)) float timing = (float)(diff_s*1000000 + diff_us)/1000.0; } // STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); /* if we did find at least one solution redistribute the resources */ if(found_sol) { struct types_of_workers *tw = sc_hypervisor_get_types_of_workers(workers, nw); sc_hypervisor_lp_place_resources_in_ctx(ns, nw, w_in_s, sched_ctxs, workers, 0, tw); } struct sc_hypervisor_policy_task_pool *next = NULL; struct sc_hypervisor_policy_task_pool *tmp_tp = tmp_task_pools; while(tmp_task_pools) { next = tmp_tp->next; free(tmp_tp); tmp_tp = next; tmp_task_pools = next; } for(i = 0; i < nw; i++) free(tasks_per_worker[i]); free(tasks_per_worker); } static void teft_lp_handle_poped_task(unsigned sched_ctx, int worker, struct starpu_task *task, uint32_t footprint) { if(worker > -2) { struct sc_hypervisor_wrapper* sc_w = sc_hypervisor_get_wrapper(sched_ctx); int ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { unsigned criteria = sc_hypervisor_get_resize_criteria(); if(criteria != SC_NOTHING && criteria == SC_SPEED) { if(sc_hypervisor_check_speed_gap_btw_ctxs(NULL, -1, NULL, -1)) { _try_resizing(NULL, -1, NULL, -1); } } STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); } } /* too expensive to take this mutex and correct value of the number of tasks is not compulsory */ STARPU_PTHREAD_MUTEX_LOCK(&mutex); sc_hypervisor_policy_remove_task_from_pool(task, footprint, &task_pools); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } static void teft_lp_handle_idle_cycle(unsigned sched_ctx, int worker) { unsigned criteria = sc_hypervisor_get_resize_criteria(); if(criteria != SC_NOTHING)// && criteria == SC_IDLE) { struct sc_hypervisor_wrapper* sc_w = sc_hypervisor_get_wrapper(sched_ctx); int ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { _try_resizing(NULL, -1, NULL, -1); STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); } } return; } static void teft_lp_size_ctxs(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers) { sc_hypervisor_save_size_req(sched_ctxs, nsched_ctxs, workers, nworkers); } static void teft_lp_resize_ctxs(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers) { int ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { struct sc_hypervisor_wrapper* sc_w = NULL; int s = 0; for(s = 0; s < nsched_ctxs; s++) { sc_w = sc_hypervisor_get_wrapper(sched_ctxs[s]); if((sc_w->submitted_flops + (0.1*sc_w->total_flops)) < sc_w->total_flops) { STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); return; } } _try_resizing(sched_ctxs, nsched_ctxs, workers, nworkers); STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); } } struct sc_hypervisor_policy teft_lp_policy = { .size_ctxs = teft_lp_size_ctxs, .resize_ctxs = teft_lp_resize_ctxs, .handle_poped_task = teft_lp_handle_poped_task, .handle_pushed_task = NULL, .handle_idle_cycle = teft_lp_handle_idle_cycle, .handle_idle_end = NULL, .handle_post_exec_hook = NULL, .handle_submitted_job = teft_lp_handle_submitted_job, .end_ctx = NULL, .custom = 0, .name = "teft_lp" }; starpu-1.2.3+dfsg/sc_hypervisor/src/hypervisor_policies/throughput_lp_policy.c000066400000000000000000000227031320135501600301700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "sc_hypervisor_lp.h" #include "sc_hypervisor_policy.h" #include #include static double _glp_resolve(int ns, int nw, double speed[ns][nw], double w_in_s[ns][nw], unsigned integer); static unsigned _compute_max_speed(int ns, int nw, double w_in_s[ns][nw], unsigned *in_sched_ctxs, int *workers) { double speed[ns][nw]; unsigned *sched_ctxs = in_sched_ctxs == NULL ? sc_hypervisor_get_sched_ctxs() : in_sched_ctxs; int w,s; struct sc_hypervisor_wrapper* sc_w = NULL; for(s = 0; s < ns; s++) { sc_w = sc_hypervisor_get_wrapper(sched_ctxs[s]); for(w = 0; w < nw; w++) { w_in_s[s][w] = 0.0; int worker = workers == NULL ? w : workers[w]; enum starpu_worker_archtype arch = starpu_worker_get_type(worker); speed[s][w] = sc_hypervisor_get_speed(sc_w, arch); } } struct timeval start_time; struct timeval end_time; gettimeofday(&start_time, NULL); double res = _glp_resolve(ns, nw, speed, w_in_s, 1); gettimeofday(&end_time, NULL); long diff_s = end_time.tv_sec - start_time.tv_sec; long diff_us = end_time.tv_usec - start_time.tv_usec; __attribute__((unused)) float timing = (float)(diff_s*1000000 + diff_us)/1000; if(res > 0.0) return 1; return 0; } /* * GNU Linear Programming Kit backend */ #ifdef STARPU_HAVE_GLPK_H #include static double _glp_resolve(int ns, int nw, double speed[ns][nw], double w_in_s[ns][nw], unsigned integer) { int w = 0, s = 0; glp_prob *lp; lp = glp_create_prob(); glp_set_prob_name(lp, "StarPU theoretical bound"); glp_set_obj_dir(lp, GLP_MAX); glp_set_obj_name(lp, "total speed"); { int ne = 2 * ns * nw /* worker execution time */ + 1 + 1 ; /* glp dumbness */ int n = 1; int ia[ne], ja[ne]; double ar[ne]; /* Variables: x[s][w] the acknwoledgment that the worker w belongs to the context s */ glp_add_cols(lp, nw*ns + 1); for(s = 0; s < ns; s++) for(w = 0; w < nw; w++) { char name[32]; snprintf(name, sizeof(name), "w%ds%dn", w, s); glp_set_col_name(lp, s*nw+w+1, name); if (integer) { glp_set_col_kind(lp, s*nw+w+1, GLP_IV); glp_set_col_bnds(lp, s*nw+w+1, GLP_DB, 0, 1); } else glp_set_col_bnds(lp, s*nw+w+1, GLP_DB, 0.0, 1.0); } /* vmax should be positif */ /* Z = vmax structural variable, x[s][w] are auxiliar variables */ glp_set_col_name(lp, nw*ns+1, "vmax"); glp_set_col_bnds(lp, nw*ns+1, GLP_LO, 0.0, 0.0); glp_set_obj_coef(lp, nw*ns+1, 1.); int curr_row_idx = 0; /* Total worker speed */ glp_add_rows(lp, 1); /*sum(x[s][w]*speed[s][w]) >= vmax */ char name[32], title[64]; starpu_worker_get_name(w, name, sizeof(name)); snprintf(title, sizeof(title), "worker %s", name); glp_set_row_name(lp, curr_row_idx + 1, title); for(s = 0; s < ns; s++) { for (w = 0; w < nw; w++) { /* x[s][w] */ ia[n] = curr_row_idx + 1; ja[n] = s*nw+w+1; ar[n] = speed[s][w]; n++; } } /* vmax */ ia[n] = curr_row_idx + 1; ja[n] = nw*ns+1; ar[n] = (-1); n++; glp_set_row_bnds(lp, curr_row_idx + 1, GLP_LO, 0.0, 0.0); curr_row_idx += 1 ; /* sum(x[s][w]) = 1 */ glp_add_rows(lp, nw); for (w = 0; w < nw; w++) { char name[32], title[64]; starpu_worker_get_name(w, name, sizeof(name)); snprintf(title, sizeof(title), "w%x", w); glp_set_row_name(lp, curr_row_idx+w+1, title); for(s = 0; s < ns; s++) { ia[n] = curr_row_idx+w+1; ja[n] = s*nw+w+1; ar[n] = 1; n++; } if(integer) glp_set_row_bnds(lp, curr_row_idx+w+1, GLP_FX, 1, 1); else glp_set_row_bnds(lp, curr_row_idx+w+1, GLP_FX, 1.0, 1.0); } if(n != ne) printf("ns= %d nw = %d n = %d ne = %d\n", ns, nw, n, ne); STARPU_ASSERT(n == ne); glp_load_matrix(lp, ne-1, ia, ja, ar); } glp_smcp parm; glp_init_smcp(&parm); parm.msg_lev = GLP_MSG_OFF; int ret = glp_simplex(lp, &parm); if (ret) { glp_delete_prob(lp); lp = NULL; return 0.0; } if (integer) { glp_iocp iocp; glp_init_iocp(&iocp); iocp.msg_lev = GLP_MSG_OFF; glp_intopt(lp, &iocp); int stat = glp_mip_status(lp); /* if we don't have a solution return */ if(stat == GLP_NOFEAS) { glp_delete_prob(lp); lp = NULL; return 0.0; } } int stat = glp_get_prim_stat(lp); /* if we don't have a solution return */ if(stat == GLP_NOFEAS) { glp_delete_prob(lp); lp = NULL; printf("No sol!!!\n"); return 0.0; } double res = glp_get_obj_val(lp); for(s = 0; s < ns; s++) for(w = 0; w < nw; w++) { if (integer) w_in_s[s][w] = (double)glp_mip_col_val(lp, s*nw+w+1); else w_in_s[s][w] = glp_get_col_prim(lp, s*nw+w+1); } glp_delete_prob(lp); return res; } static void _try_resizing(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers) { int ns = sched_ctxs == NULL ? sc_hypervisor_get_nsched_ctxs() : nsched_ctxs; int nw = workers == NULL ? (int)starpu_worker_get_count() : nworkers; /* Number of different workers */ sched_ctxs = sched_ctxs == NULL ? sc_hypervisor_get_sched_ctxs() : sched_ctxs; double w_in_s[ns][nw]; unsigned found_sol = _compute_max_speed(ns, nw, w_in_s, sched_ctxs, workers); /* if we did find at least one solution redistribute the resources */ if(found_sol) { struct types_of_workers *tw = sc_hypervisor_get_types_of_workers(workers, nw); int w, s; double nworkers_per_ctx[ns][tw->nw]; int nworkers_per_ctx_rounded[ns][tw->nw]; for(s = 0; s < ns; s++) { for(w = 0; w < nw; w++) { nworkers_per_ctx[s][w] = 0.0; nworkers_per_ctx_rounded[s][w] = 0; } } for(s = 0; s < ns; s++) { for(w = 0; w < nw; w++) { enum starpu_worker_archtype arch = starpu_worker_get_type(w); int idx = sc_hypervisor_get_index_for_arch(STARPU_CUDA_WORKER, tw); nworkers_per_ctx[s][idx] += w_in_s[s][w]; if(arch == STARPU_CUDA_WORKER) { if(w_in_s[s][w] >= 0.3) nworkers_per_ctx_rounded[s][idx]++; } else { int idx = sc_hypervisor_get_index_for_arch(STARPU_CPU_WORKER, tw); nworkers_per_ctx[s][idx] += w_in_s[s][w]; if(w_in_s[s][w] > 0.5) nworkers_per_ctx_rounded[s][idx]++; } } } /* for(s = 0; s < ns; s++) */ /* printf("%d: cpus = %lf gpus = %lf cpus_round = %d gpus_round = %d\n", s, nworkers[s][1], nworkers[s][0], */ /* nworkers_rounded[s][1], nworkers_rounded[s][0]); */ sc_hypervisor_lp_redistribute_resources_in_ctxs(ns, tw->nw, nworkers_per_ctx_rounded, nworkers_per_ctx, sched_ctxs, tw); free(tw); } } static void throughput_lp_handle_poped_task(__attribute__((unused))unsigned sched_ctx, __attribute__((unused))int worker, __attribute__((unused))struct starpu_task *task, __attribute__((unused))uint32_t footprint) { int ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { unsigned criteria = sc_hypervisor_get_resize_criteria(); if(criteria != SC_NOTHING && criteria == SC_SPEED) { if(sc_hypervisor_check_speed_gap_btw_ctxs(NULL, -1, NULL, -1)) { _try_resizing(NULL, -1, NULL, -1); } } STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); } } static void throughput_lp_handle_idle_cycle(unsigned sched_ctx, int worker) { int ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { unsigned criteria = sc_hypervisor_get_resize_criteria(); if(criteria != SC_NOTHING && criteria == SC_IDLE) { if(sc_hypervisor_check_idle(sched_ctx, worker)) { _try_resizing(NULL, -1, NULL, -1); // sc_hypervisor_move_workers(sched_ctx, 3 - sched_ctx, &worker, 1, 1); } } STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); } } static void throughput_lp_resize_ctxs(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers) { int ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { _try_resizing(sched_ctxs, nsched_ctxs, workers, nworkers); STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); } } static void throughput_lp_end_ctx(__attribute__((unused))unsigned sched_ctx) { /* struct sc_hypervisor_wrapper* sc_w = sc_hypervisor_get_wrapper(sched_ctx); */ /* int worker; */ /* for(worker = 0; worker < 12; worker++) */ /* printf("%d/%d: speed %lf\n", worker, sched_ctx, sc_w->ref_speed[worker]); */ return; } struct sc_hypervisor_policy throughput_lp_policy = { .size_ctxs = NULL, .resize_ctxs = throughput_lp_resize_ctxs, .handle_poped_task = throughput_lp_handle_poped_task, .handle_pushed_task = NULL, .handle_idle_cycle = throughput_lp_handle_idle_cycle, .handle_idle_end = NULL, .handle_post_exec_hook = NULL, .handle_submitted_job = NULL, .end_ctx = throughput_lp_end_ctx, .custom = 0, .name = "throughput_lp" }; #endif /* STARPU_HAVE_GLPK_H */ starpu-1.2.3+dfsg/sc_hypervisor/src/policies_utils/000077500000000000000000000000001320135501600224635ustar00rootroot00000000000000starpu-1.2.3+dfsg/sc_hypervisor/src/policies_utils/dichotomy.c000066400000000000000000000074711320135501600246370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 - 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "sc_hypervisor_lp.h" #include "sc_hypervisor_policy.h" #include #include /* executes the function lp_estimated_distrib_func over the interval [tmin, tmax] until it finds the lowest value that still has solutions */ unsigned sc_hypervisor_lp_execute_dichotomy(int ns, int nw, double w_in_s[ns][nw], unsigned solve_lp_integer, void *specific_data, double tmin, double tmax, double smallest_tmax, double (*lp_estimated_distrib_func)(int ns, int nw, double draft_w_in_s[ns][nw], unsigned is_integer, double tmax, void *specifc_data)) { double res = 1.0; unsigned has_sol = 0; double tmid = tmax; unsigned found_sol = 0; struct timeval start_time; struct timeval end_time; int nd = 0; double found_tmid = tmax; double potential_tmid = tmid; double threashold = tmax*0.1; gettimeofday(&start_time, NULL); /* we fix tmax and we do not treat it as an unknown we just vary by dichotomy its values*/ while(1) { /* find solution and save the values in draft tables only if there is a solution for the system we save them in the proper table */ printf("solving for tmid %lf \n", tmid); res = lp_estimated_distrib_func(ns, nw, w_in_s, solve_lp_integer, tmid, specific_data); if(res < 0.0) { printf("timeouted no point in continuing\n"); found_sol = 0; break; } else if(res != 0.0) { has_sol = 1; found_sol = 1; found_tmid = tmid; printf("found sol for tmid %lf \n", tmid); } else { printf("failed for tmid %lf \n", tmid); if(tmid == tmax) { printf("failed for tmid %lf from the first time\n", tmid); break; } has_sol = 0; } /* if we have a solution with this tmid try a smaller value bigger than the old one */ if(has_sol) { /* if the difference between tmax and tmid is smaller than a given threashold there is no point in searching more precision */ tmax = tmid; potential_tmid = tmin + ((tmax-tmin)/2.0); if((tmax - potential_tmid) < threashold) { printf("had_sol but stop doing it for tmin %lf tmax %lf and potential tmid %lf \n", tmin, tmax, potential_tmid); break; } printf("try for smaller potential tmid %lf \n", potential_tmid); } else /*else try a bigger one */ { /* if we previously found a good sol and we keep failing we stop searching for a better sol */ tmin = tmid; potential_tmid = tmin + ((tmax-tmin)/2.0); if((tmax - potential_tmid) < threashold) { printf("didn't have sol but stop doing it for tmin %lf tmax %lf and potential tmid %lf \n", tmin, tmax, potential_tmid); break; } printf("try for bigger potential tmid %lf \n", potential_tmid); } tmid = potential_tmid; nd++; } printf("solve againd for tmid %lf \n", found_tmid); if(found_sol) { res = lp_estimated_distrib_func(ns, nw, w_in_s, solve_lp_integer, found_tmid, specific_data); found_sol = (res != 0.0); } printf("found sol %u for tmid %lf\n", found_sol, found_tmid); gettimeofday(&end_time, NULL); long diff_s = end_time.tv_sec - start_time.tv_sec; long diff_us = end_time.tv_usec - start_time.tv_usec; __attribute__((unused)) float timing = (float)(diff_s*1000000 + diff_us)/1000; return found_sol; } starpu-1.2.3+dfsg/sc_hypervisor/src/policies_utils/lp_programs.c000066400000000000000000000451721320135501600251650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 - 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * GNU Linear Programming Kit backend */ #include "sc_hypervisor_policy.h" #include "sc_hypervisor_lp.h" #ifdef STARPU_HAVE_GLPK_H double sc_hypervisor_lp_simulate_distrib_tasks(int ns, int nw, int nt, double w_in_s[ns][nw], double tasks[nw][nt], double times[nw][nt], unsigned is_integer, double tmax, unsigned *in_sched_ctxs, struct sc_hypervisor_policy_task_pool *tmp_task_pools) { struct sc_hypervisor_policy_task_pool * tp; int t, w, s; glp_prob *lp; lp = glp_create_prob(); glp_set_prob_name(lp, "StarPU theoretical bound"); glp_set_obj_dir(lp, GLP_MAX); glp_set_obj_name(lp, "total execution time"); { int ne = nt * nw /* worker execution time */ + nw * ns + nw * (nt + ns) + 1; /* glp dumbness */ int n = 1; int ia[ne], ja[ne]; double ar[ne]; /* Variables: number of tasks i assigned to worker j, and tmax */ glp_add_cols(lp, nw*nt+ns*nw); #define colnum(w, t) ((t)*nw+(w)+1) for(s = 0; s < ns; s++) for(w = 0; w < nw; w++) glp_set_obj_coef(lp, nw*nt+s*nw+w+1, 1.); for (w = 0; w < nw; w++) for (t = 0; t < nt; t++) { char name[32]; snprintf(name, sizeof(name), "w%dt%dn", w, t); glp_set_col_name(lp, colnum(w, t), name); if (is_integer) { glp_set_col_kind(lp, colnum(w, t), GLP_IV); glp_set_col_bnds(lp, colnum(w, t), GLP_LO, 0, 0); } else glp_set_col_bnds(lp, colnum(w, t), GLP_LO, 0.0, 0.0); } for(s = 0; s < ns; s++) for(w = 0; w < nw; w++) { char name[32]; snprintf(name, sizeof(name), "w%ds%dn", w, s); glp_set_col_name(lp, nw*nt+s*nw+w+1, name); if (is_integer) { glp_set_col_kind(lp, nw*nt+s*nw+w+1, GLP_IV); glp_set_col_bnds(lp, nw*nt+s*nw+w+1, GLP_DB, 0, 1); } else glp_set_col_bnds(lp, nw*nt+s*nw+w+1, GLP_DB, 0.0, 1.0); } unsigned *sched_ctxs = in_sched_ctxs == NULL ? sc_hypervisor_get_sched_ctxs() : in_sched_ctxs; int curr_row_idx = 0; /* Total worker execution time */ glp_add_rows(lp, nw*ns); for (t = 0; t < nt; t++) { int someone = 0; for (w = 0; w < nw; w++) if (!isnan(times[w][t])) someone = 1; if (!someone) { /* This task does not have any performance model at all, abort */ printf("NO PERF MODELS\n"); glp_delete_prob(lp); return 0.0; } } /*sum(t[t][w]*n[t][w]) < x[s][w]*tmax */ for(s = 0; s < ns; s++) { for (w = 0; w < nw; w++) { char name[32], title[64]; starpu_worker_get_name(w, name, sizeof(name)); snprintf(title, sizeof(title), "worker %s", name); glp_set_row_name(lp, curr_row_idx+s*nw+w+1, title); for (t = 0, tp = tmp_task_pools; tp; t++, tp = tp->next) { if(tp->sched_ctx_id == sched_ctxs[s]) { ia[n] = curr_row_idx+s*nw+w+1; ja[n] = colnum(w, t); if (isnan(times[w][t])) { printf("had to insert huge val \n"); ar[n] = 1000000000.; } else ar[n] = times[w][t]; n++; } } /* x[s][w] = 1 | 0 */ ia[n] = curr_row_idx+s*nw+w+1; ja[n] = nw*nt+s*nw+w+1; ar[n] = (-1) * tmax; n++; if (is_integer) { glp_set_row_bnds(lp, curr_row_idx+s*nw+w+1, GLP_UP, 0, 0); } else glp_set_row_bnds(lp, curr_row_idx+s*nw+w+1, GLP_UP, 0.0, 0.0); } } curr_row_idx += nw*ns; /* Total task completion */ glp_add_rows(lp, nt); for (t = 0, tp = tmp_task_pools; tp; t++, tp = tp->next) { char name[32], title[64]; starpu_worker_get_name(w, name, sizeof(name)); snprintf(title, sizeof(title), "task %s key %x", tp->cl->name, (unsigned) tp->footprint); glp_set_row_name(lp, curr_row_idx+t+1, title); for (w = 0; w < nw; w++) { ia[n] = curr_row_idx+t+1; ja[n] = colnum(w, t); ar[n] = 1; n++; } glp_set_row_bnds(lp, curr_row_idx+t+1, GLP_FX, tp->n, tp->n); } curr_row_idx += nt; /* sum(x[s][i]) = 1 */ glp_add_rows(lp, nw); for (w = 0; w < nw; w++) { char name[32], title[64]; starpu_worker_get_name(w, name, sizeof(name)); snprintf(title, sizeof(title), "w%x", w); glp_set_row_name(lp, curr_row_idx+w+1, title); for(s = 0; s < ns; s++) { ia[n] = curr_row_idx+w+1; ja[n] = nw*nt+s*nw+w+1; ar[n] = 1; n++; } if(is_integer) glp_set_row_bnds(lp, curr_row_idx+w+1, GLP_FX, 1, 1); else glp_set_row_bnds(lp, curr_row_idx+w+1, GLP_FX, 1.0, 1.0); } if(n != ne) printf("ns= %d nw = %d nt = %d n = %d ne = %d\n", ns, nw, nt, n, ne); STARPU_ASSERT(n == ne); glp_load_matrix(lp, ne-1, ia, ja, ar); } glp_smcp parm; glp_init_smcp(&parm); parm.msg_lev = GLP_MSG_OFF; int ret = glp_simplex(lp, &parm); /* char str[50]; */ /* sprintf(str, "outpu_lp_%g", tmax); */ /* glp_print_sol(lp, str); */ if (ret) { printf("error in simplex\n"); glp_delete_prob(lp); lp = NULL; return 0.0; } int stat = glp_get_prim_stat(lp); /* if we don't have a solution return */ if(stat == GLP_NOFEAS) { glp_delete_prob(lp); // printf("no_sol in tmax = %lf\n", tmax); lp = NULL; return 0.0; } if (is_integer) { glp_iocp iocp; glp_init_iocp(&iocp); iocp.msg_lev = GLP_MSG_OFF; // iocp.tm_lim = 1000; glp_intopt(lp, &iocp); int stat = glp_mip_status(lp); /* if we don't have a solution return */ if(stat == GLP_NOFEAS || stat == GLP_ETMLIM || stat == GLP_UNDEF) { // printf("no int sol in tmax = %lf\n", tmax); if(stat == GLP_ETMLIM || stat == GLP_UNDEF) printf("timeout \n"); glp_delete_prob(lp); lp = NULL; return 0.0; } } double res = glp_get_obj_val(lp); for (w = 0; w < nw; w++) for (t = 0; t < nt; t++) if (is_integer) tasks[w][t] = (double)glp_mip_col_val(lp, colnum(w, t)); else tasks[w][t] = glp_get_col_prim(lp, colnum(w, t)); /* printf("**********************************************\n"); */ /* printf("for tmax %lf\n", tmax); */ for(s = 0; s < ns; s++) for(w = 0; w < nw; w++) { if (is_integer) w_in_s[s][w] = (double)glp_mip_col_val(lp, nw*nt+s*nw+w+1); else w_in_s[s][w] = glp_get_col_prim(lp, nw*nt+s*nw+w+1); // printf("w %d in ctx %d = %lf\n", w, s, w_in_s[s][w]); } /* printf("\n"); */ /* printf("**********************************************\n"); */ glp_delete_prob(lp); return res; } double sc_hypervisor_lp_simulate_distrib_flops(int ns, int nw, double v[ns][nw], double flops[ns], double res[ns][nw], int total_nw[nw], unsigned sched_ctxs[ns], double last_vmax) { int integer = 1; int s, w; glp_prob *lp; int ne = (ns*nw+1)*(ns+nw) + 1; /* glp dumbness */ int n = 1; int ia[ne], ja[ne]; double ar[ne]; lp = glp_create_prob(); glp_set_prob_name(lp, "sample"); glp_set_obj_dir(lp, GLP_MAX); glp_set_obj_name(lp, "max speed"); /* we add nw*ns columns one for each type of worker in each context and another column corresponding to the 1/tmax bound (bc 1/tmax is a variable too)*/ glp_add_cols(lp, nw*ns+1); struct sc_hypervisor_wrapper *sc_w = NULL; for(s = 0; s < ns; s++) { sc_w = sc_hypervisor_get_wrapper(sched_ctxs[s]); struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(sched_ctxs[s]); for(w = 0; w < nw; w++) { char name[32]; snprintf(name, sizeof(name), "worker%dctx%d", w, s); glp_set_col_name(lp, n, name); if (integer) { glp_set_col_kind(lp, n, GLP_IV); /* if(sc_w->consider_max) */ /* { */ /* if(config->max_nworkers == 0) */ /* glp_set_col_bnds(lp, n, GLP_FX, config->min_nworkers, config->max_nworkers); */ /* else */ /* glp_set_col_bnds(lp, n, GLP_DB, config->min_nworkers, config->max_nworkers); */ /* } */ /* else */ { if(total_nw[w] == 0) glp_set_col_bnds(lp, n, GLP_FX, config->min_nworkers, total_nw[w]); else glp_set_col_bnds(lp, n, GLP_DB, config->min_nworkers, total_nw[w]); } } else { /* if(sc_w->consider_max) */ /* { */ /* if(config->max_nworkers == 0) */ /* glp_set_col_bnds(lp, n, GLP_FX, config->min_nworkers*1.0, config->max_nworkers*1.0); */ /* else */ /* glp_set_col_bnds(lp, n, GLP_DB, config->min_nworkers*1.0, config->max_nworkers*1.0); */ /* #ifdef STARPU_SC_HYPERVISOR_DEBUG */ /* printf("%d****************consider max %lf in lp\n", sched_ctxs[s], config->max_nworkers*1.0); */ /* #endif */ /* } */ /* else */ { if(total_nw[w] == 0) glp_set_col_bnds(lp, n, GLP_FX, config->min_nworkers*1.0, total_nw[w]*1.0); else glp_set_col_bnds(lp, n, GLP_DB, config->min_nworkers*1.0, total_nw[w]*1.0); #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("%u****************don't consider max %d but total %d in lp\n", sched_ctxs[s], config->max_nworkers, total_nw[w]); #endif } } n++; } } #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("ns = %d nw = %d\n", ns, nw); #endif /*1/tmax should belong to the interval [0.0;1.0]*/ glp_set_col_name(lp, n, "vmax"); // glp_set_col_bnds(lp, n, GLP_DB, 0.0, 1.0); if(last_vmax != -1.0) glp_set_col_bnds(lp, n, GLP_LO, last_vmax, last_vmax); else glp_set_col_bnds(lp, n, GLP_LO, 0.0, 0.0); /* Z = 1/tmax -> 1/tmax structural variable, nCPUs & nGPUs in ctx are auxiliar variables */ glp_set_obj_coef(lp, n, 1.0); n = 1; /* one row corresponds to one ctx*/ glp_add_rows(lp, ns); for(s = 0; s < ns; s++) { char name[32]; snprintf(name, sizeof(name), "ctx%d", s); glp_set_row_name(lp, s+1, name); glp_set_row_bnds(lp, s+1, GLP_LO, 0., 0.); for(w = 0; w < nw; w++) { int s2; for(s2 = 0; s2 < ns; s2++) { if(s2 == s) { ia[n] = s+1; ja[n] = w + nw*s2 + 1; ar[n] = v[s][w]; // printf("ia[%d]=%d ja[%d]=%d ar[%d]=%lf\n", n, ia[n], n, ja[n], n, ar[n]); } else { ia[n] = s+1; ja[n] = w + nw*s2 + 1; ar[n] = 0.0; // printf("ia[%d]=%d ja[%d]=%d ar[%d]=%lf\n", n, ia[n], n, ja[n], n, ar[n]); } n++; } } /* 1/tmax */ ia[n] = s+1; ja[n] = ns*nw+1; ar[n] = (-1) * flops[s]; // printf("ia[%d]=%d ja[%d]=%d ar[%d]=%lf\n", n, ia[n], n, ja[n], n, ar[n]); n++; } /*we add another linear constraint : sum(all cpus) = 9 and sum(all gpus) = 3 */ glp_add_rows(lp, nw); for(w = 0; w < nw; w++) { char name[32]; snprintf(name, sizeof(name), "w%d", w); glp_set_row_name(lp, ns+w+1, name); for(s = 0; s < ns; s++) { int w2; for(w2 = 0; w2 < nw; w2++) { if(w2 == w) { ia[n] = ns+w+1; ja[n] = w2+s*nw + 1; ar[n] = 1.0; // printf("ia[%d]=%d ja[%d]=%d ar[%d]=%lf\n", n, ia[n], n, ja[n], n, ar[n]); } else { ia[n] = ns+w+1; ja[n] = w2+s*nw + 1; ar[n] = 0.0; // printf("ia[%d]=%d ja[%d]=%d ar[%d]=%lf\n", n, ia[n], n, ja[n], n, ar[n]); } n++; } } /* 1/tmax */ ia[n] = ns+w+1; ja[n] = ns*nw+1; ar[n] = 0.0; // printf("ia[%d]=%d ja[%d]=%d ar[%d]=%lf\n", n, ia[n], n, ja[n], n, ar[n]); n++; /*sum(all gpus) = 3*/ if(w == 0) glp_set_row_bnds(lp, ns+w+1, GLP_FX, total_nw[0], total_nw[0]); /*sum(all cpus) = 9*/ if(w == 1) glp_set_row_bnds(lp, ns+w+1, GLP_FX, total_nw[1], total_nw[1]); } STARPU_ASSERT(n == ne); glp_load_matrix(lp, ne-1, ia, ja, ar); glp_smcp parm; glp_init_smcp(&parm); parm.msg_lev = GLP_MSG_OFF; int ret = glp_simplex(lp, &parm); if (ret) { printf("error in simplex\n"); glp_delete_prob(lp); lp = NULL; return 0.0; } int stat = glp_get_prim_stat(lp); /* if we don't have a solution return */ if(stat == GLP_NOFEAS) { glp_delete_prob(lp); printf("no_sol\n"); lp = NULL; return 0.0; } if (integer) { glp_iocp iocp; glp_init_iocp(&iocp); iocp.msg_lev = GLP_MSG_OFF; glp_intopt(lp, &iocp); int stat = glp_mip_status(lp); /* if we don't have a solution return */ if(stat == GLP_NOFEAS) { printf("no int sol\n"); glp_delete_prob(lp); lp = NULL; return 0.0; } } double vmax = glp_get_obj_val(lp); #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("vmax = %lf \n", vmax); #endif n = 1; for(s = 0; s < ns; s++) { for(w = 0; w < nw; w++) { if (integer) res[s][w] = (double)glp_mip_col_val(lp, n); else res[s][w] = glp_get_col_prim(lp, n); #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("%d/%d: res %lf flops = %lf v = %lf\n", w,s, res[s][w], flops[s], v[s][w]); #endif n++; } } glp_delete_prob(lp); return vmax; } double sc_hypervisor_lp_simulate_distrib_flops_on_sample(int ns, int nw, double final_w_in_s[ns][nw], unsigned is_integer, double tmax, double **speed, double flops[ns], double **final_flops_on_w) { double w_in_s[ns][nw]; double flops_on_w[ns][nw]; int w, s; glp_prob *lp; // printf("try with tmax %lf\n", tmax); lp = glp_create_prob(); glp_set_prob_name(lp, "StarPU theoretical bound"); glp_set_obj_dir(lp, GLP_MAX); glp_set_obj_name(lp, "total execution time"); { int ne = 5 * ns * nw /* worker execution time */ + 1; /* glp dumbness */ int n = 1; int ia[ne], ja[ne]; double ar[ne]; /* Variables: number of flops assigned to worker w in context s, and the acknwoledgment that the worker w belongs to the context s */ glp_add_cols(lp, 2*nw*ns); #define colnum_sample(w, s) ((s)*nw+(w)+1) for(s = 0; s < ns; s++) for(w = 0; w < nw; w++) glp_set_obj_coef(lp, nw*ns+colnum_sample(w,s), 1.); for(s = 0; s < ns; s++) for(w = 0; w < nw; w++) { char name[32]; snprintf(name, sizeof(name), "flopsw%ds%dn", w, s); glp_set_col_name(lp, colnum_sample(w,s), name); glp_set_col_bnds(lp, colnum_sample(w,s), GLP_LO, 0., 0.); snprintf(name, sizeof(name), "w%ds%dn", w, s); glp_set_col_name(lp, nw*ns+colnum_sample(w,s), name); if (is_integer) { glp_set_col_kind(lp, nw*ns+colnum_sample(w, s), GLP_IV); glp_set_col_bnds(lp, nw*ns+colnum_sample(w,s), GLP_DB, 0, 1); } else glp_set_col_bnds(lp, nw*ns+colnum_sample(w,s), GLP_DB, 0.0, 1.0); } int curr_row_idx = 0; /* Total worker execution time */ glp_add_rows(lp, nw*ns); /*nflops[s][w]/v[s][w] < x[s][w]*tmax */ for(s = 0; s < ns; s++) { for (w = 0; w < nw; w++) { char name[32], title[64]; starpu_worker_get_name(w, name, sizeof(name)); snprintf(title, sizeof(title), "worker %s", name); glp_set_row_name(lp, curr_row_idx+s*nw+w+1, title); /* nflosp[s][w] */ ia[n] = curr_row_idx+s*nw+w+1; ja[n] = colnum_sample(w, s); ar[n] = 1 / speed[s][w]; n++; /* x[s][w] = 1 | 0 */ ia[n] = curr_row_idx+s*nw+w+1; ja[n] = nw*ns+colnum_sample(w,s); ar[n] = (-1) * tmax; n++; glp_set_row_bnds(lp, curr_row_idx+s*nw+w+1, GLP_UP, 0.0, 0.0); } } curr_row_idx += nw*ns; /* sum(flops[s][w]) = flops[s] */ glp_add_rows(lp, ns); for (s = 0; s < ns; s++) { char name[32], title[64]; starpu_worker_get_name(w, name, sizeof(name)); snprintf(title, sizeof(title), "flops %lf ctx%d", flops[s], s); glp_set_row_name(lp, curr_row_idx+s+1, title); for (w = 0; w < nw; w++) { ia[n] = curr_row_idx+s+1; ja[n] = colnum_sample(w, s); ar[n] = 1; n++; } glp_set_row_bnds(lp, curr_row_idx+s+1, GLP_FX, flops[s], flops[s]); } curr_row_idx += ns; /* sum(x[s][w]) = 1 */ glp_add_rows(lp, nw); for (w = 0; w < nw; w++) { char name[32], title[64]; starpu_worker_get_name(w, name, sizeof(name)); snprintf(title, sizeof(title), "w%x", w); glp_set_row_name(lp, curr_row_idx+w+1, title); for(s = 0; s < ns; s++) { ia[n] = curr_row_idx+w+1; ja[n] = nw*ns+colnum_sample(w,s); ar[n] = 1; n++; } if(is_integer) glp_set_row_bnds(lp, curr_row_idx+w+1, GLP_FX, 1, 1); else glp_set_row_bnds(lp, curr_row_idx+w+1, GLP_FX, 1.0, 1.0); } curr_row_idx += nw; /* sum(nflops[s][w]) > 0*/ glp_add_rows(lp, nw); for (w = 0; w < nw; w++) { char name[32], title[64]; starpu_worker_get_name(w, name, sizeof(name)); snprintf(title, sizeof(title), "flopsw%x", w); glp_set_row_name(lp, curr_row_idx+w+1, title); for(s = 0; s < ns; s++) { ia[n] = curr_row_idx+w+1; ja[n] = colnum_sample(w,s); ar[n] = 1; n++; } glp_set_row_bnds(lp, curr_row_idx+w+1, GLP_LO, 0.1, 0.); } if(n != ne) printf("ns= %d nw = %d n = %d ne = %d\n", ns, nw, n, ne); STARPU_ASSERT(n == ne); glp_load_matrix(lp, ne-1, ia, ja, ar); } glp_smcp parm; glp_init_smcp(&parm); parm.msg_lev = GLP_MSG_OFF; int ret = glp_simplex(lp, &parm); if (ret) { glp_delete_prob(lp); lp = NULL; return 0.0; } if (is_integer) { glp_iocp iocp; glp_init_iocp(&iocp); iocp.msg_lev = GLP_MSG_OFF; glp_intopt(lp, &iocp); int stat = glp_mip_status(lp); /* if we don't have a solution return */ if(stat == GLP_NOFEAS) { glp_delete_prob(lp); lp = NULL; return 0.0; } } int stat = glp_get_prim_stat(lp); /* if we don't have a solution return */ if(stat == GLP_NOFEAS) { glp_delete_prob(lp); lp = NULL; return 0.0; } double res = glp_get_obj_val(lp); for(s = 0; s < ns; s++) for(w = 0; w < nw; w++) { flops_on_w[s][w] = glp_get_col_prim(lp, colnum_sample(w, s)); if (is_integer) w_in_s[s][w] = (double)glp_mip_col_val(lp, nw*ns+colnum_sample(w, s)); else w_in_s[s][w] = glp_get_col_prim(lp, nw*ns+colnum_sample(w,s)); // printf("w_in_s[s%d][w%d] = %lf flops[s%d][w%d] = %lf \n", s, w, w_in_s[s][w], s, w, flops_on_w[s][w]); } glp_delete_prob(lp); for(s = 0; s < ns; s++) for(w = 0; w < nw; w++) { final_w_in_s[s][w] = w_in_s[s][w]; final_flops_on_w[s][w] = flops_on_w[s][w]; } return res; } #endif // STARPU_HAVE_GLPK_H starpu-1.2.3+dfsg/sc_hypervisor/src/policies_utils/lp_tools.c000066400000000000000000000617201320135501600244700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "sc_hypervisor_lp.h" #include "sc_hypervisor_policy.h" #include "sc_hypervisor_intern.h" #include double sc_hypervisor_lp_get_nworkers_per_ctx(int nsched_ctxs, int ntypes_of_workers, double res[nsched_ctxs][ntypes_of_workers], int total_nw[ntypes_of_workers], struct types_of_workers *tw, unsigned *in_sched_ctxs) { unsigned *sched_ctxs = in_sched_ctxs == NULL ? sc_hypervisor_get_sched_ctxs() : in_sched_ctxs; #ifdef STARPU_HAVE_GLPK_H double v[nsched_ctxs][ntypes_of_workers]; double flops[nsched_ctxs]; /* unsigned nhierarchy_levels = sc_hypervisor_get_nhierarchy_levels(); */ /* if(nhierarchy_levels <= 1) */ sc_hypervisor_update_resize_interval(sched_ctxs, nsched_ctxs, total_nw[0]); int nw = tw->nw; int i = 0; struct sc_hypervisor_wrapper* sc_w; for(i = 0; i < nsched_ctxs; i++) { sc_w = sc_hypervisor_get_wrapper(sched_ctxs[i]); int w; for(w = 0; w < nw; w++) v[i][w] = sc_hypervisor_get_speed(sc_w, sc_hypervisor_get_arch_for_index(w, tw)); double ready_flops = starpu_sched_ctx_get_nready_flops(sc_w->sched_ctx); unsigned nhierarchy_levels = sc_hypervisor_get_nhierarchy_levels(); if(nhierarchy_levels > 1) ready_flops = sc_hypervisor_get_nready_flops_of_all_sons_of_sched_ctx(sc_w->sched_ctx); int nready_tasks = starpu_sched_ctx_get_nready_tasks(sc_w->sched_ctx); if(sc_w->to_be_sized) { flops[i] = sc_w->remaining_flops/1000000000.0; /* in gflops*/ sc_w->to_be_sized = 0; } else { if(nhierarchy_levels > 1) flops[i] = sc_w->remaining_flops/1000000000.0; /* in gflops*/ else if(sc_w->remaining_flops < 0.0) flops[i] = ready_flops/1000000000.0; /* in gflops*/ else { if((ready_flops/1000000000.0) <= 0.000002) flops[i] = 0.0; else flops[i] = sc_w->remaining_flops/1000000000.0; /* in gflops*/ } } if(flops[i] < 0.0) flops[i] = 0.0; #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("%d: flops %lf remaining flops %lf ready flops %lf nready_tasks %d\n", sched_ctxs[i], flops[i], sc_w->remaining_flops/1000000000, ready_flops/1000000000, nready_tasks); #endif } sc_hypervisor_check_if_consider_max(tw); int w; for(w = 0; w < nw; w++) { double avg_speed = sc_hypervisor_get_avg_speed(sc_hypervisor_get_arch_for_index(w, tw)); if(avg_speed != -1.0) { #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("avg_speed for cpus is %lf \n", avg_speed); #endif unsigned consider_max_for_all = 0; for(i = 0; i < nsched_ctxs; i++) { sc_w = sc_hypervisor_get_wrapper(sched_ctxs[i]); if(!sc_w->consider_max) { #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("ctx%: current speed is %lf and compare speed is min %lf max %lf\n", sched_ctxs[i], v[i][w], (0.1*avg_speed), (2*avg_speed)); #endif if(v[i][w] < 0.1*avg_speed || v[i][w] > 2*avg_speed) { sc_w->consider_max = 1; consider_max_for_all = 1; } #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("ctx %d consider max %d \n", sched_ctxs[i], sc_w->consider_max); #endif } } if(consider_max_for_all) { for(i = 0; i < nsched_ctxs; i++) { sc_w = sc_hypervisor_get_wrapper(sched_ctxs[i]); sc_w->consider_max = 1; #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("ctx %d consider max %d anyway \n", sched_ctxs[i], sc_w->consider_max); #endif } } } } if(nsched_ctxs == 1) { int w; for(w = 0; w < nw; w++) res[0][w] = total_nw[w]; double optimal_v = 0.0; #ifdef STARPU_USE_CUDA optimal_v = res[0][0] * v[0][0] + res[0][1]* v[0][1]; #else optimal_v = res[0][0] * v[0][0]; #endif //STARPU_USE_CUDA _set_optimal_v(sched_ctxs[0], optimal_v); return 1.0; } unsigned tmp_sched_ctxs[STARPU_NMAX_SCHED_CTXS]; double tmp_flops[STARPU_NMAX_SCHED_CTXS]; double tmp_v[STARPU_NMAX_SCHED_CTXS][ntypes_of_workers]; double tmp_res[STARPU_NMAX_SCHED_CTXS][ntypes_of_workers]; int tmp_nsched_ctxs = 0; for(i = 0; i < nsched_ctxs; i++) { struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(sched_ctxs[i]); sc_w = sc_hypervisor_get_wrapper(sched_ctxs[i]); if(config->max_nworkers != 0 || !sc_w->consider_max) { tmp_sched_ctxs[tmp_nsched_ctxs] = sched_ctxs[i]; tmp_flops[tmp_nsched_ctxs] = flops[i]; int w; for(w = 0; w < ntypes_of_workers; w++) tmp_v[tmp_nsched_ctxs][w] = v[i][w]; tmp_nsched_ctxs++; } } if(tmp_nsched_ctxs == 0) return -1.0; double ret = sc_hypervisor_lp_simulate_distrib_flops(tmp_nsched_ctxs, ntypes_of_workers, tmp_v, tmp_flops, tmp_res, total_nw, tmp_sched_ctxs, -1.0); int j; for(i = 0; i < nsched_ctxs; i++) { unsigned found = 0; for(j = 0; j < tmp_nsched_ctxs; j++) { if(sched_ctxs[i] == tmp_sched_ctxs[j]) { int w; for(w = 0; w < ntypes_of_workers; w++) res[i][w] = tmp_res[j][w]; found = 1; break; } } if(!found) { int w; for(w = 0; w < ntypes_of_workers; w++) res[i][w] = 0.0; } } double vmax = 0.0; if(ret != 0.0) { /* redo the lp after cleaning out the contexts that got all the max workers required */ unsigned selected_sched_ctxs[STARPU_NMAX_SCHED_CTXS]; double selected_flops[STARPU_NMAX_SCHED_CTXS]; double selected_v[STARPU_NMAX_SCHED_CTXS][ntypes_of_workers]; int nselected = 0; int available_cpus = total_nw[0]; int used_cpus = 0; for(i = 0; i < nsched_ctxs; i++) { struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(sched_ctxs[i]); if(res[i][0] < config->max_nworkers && config->max_nworkers != 0 && flops[i] > 0.0001) { selected_flops[nselected] = flops[i]; selected_v[nselected][0] = v[i][0]; selected_sched_ctxs[nselected++] = sched_ctxs[i]; } else available_cpus -= res[i][0]; used_cpus += res[i][0]; } if(used_cpus < 0.8 * total_nw[0] && nselected > 1) { double old_ret = ret; if(nselected <= 0 || nselected == nsched_ctxs) { nselected = nsched_ctxs; for(i = 0; i < nsched_ctxs; i++) { selected_flops[i] = flops[i]; selected_v[i][0] = v[i][0]; selected_sched_ctxs[i] = sched_ctxs[i]; } } else total_nw[0] = available_cpus; double selected_res[nselected][ntypes_of_workers]; ret = sc_hypervisor_lp_simulate_distrib_flops(nselected, ntypes_of_workers, selected_v, selected_flops, selected_res, total_nw, selected_sched_ctxs, ret); if(ret != 0) { int j; for(i = 0; i < nsched_ctxs; i++) { for(j = 0; j < nselected; j++) { if(sched_ctxs[i] == selected_sched_ctxs[j]) { res[i][0] = selected_res[j][0]; } } } } else ret = old_ret; } } /* if the lp could not give any workers to any context just split the workers btw the contexts */ if(ret == 0.0) { double rand_res[nw]; int w; for(w = 0; w < nw; w++) rand_res[w] = total_nw[w]/nsched_ctxs; int s; for(s = 0; s < nsched_ctxs; s++) for(w = 0; w < nw; w++) res[s][w] = rand_res[w]; } else /* keep the first speed */ // if(ret != 0.0) { vmax = 1 / ret; } double optimal_v = 0.0; for(i = 0; i < nsched_ctxs; i++) { #ifdef STARPU_USE_CUDA optimal_v = res[i][0] * v[i][0] + res[i][1]* v[i][1]; #else optimal_v = res[i][0] * v[i][0]; #endif //STARPU_USE_CUDA int w; unsigned no_workers = 1; for(w = 0; w < nw; w++) { if(res[i][w] != 0.0) { no_workers = 0; break; } } sc_w = sc_hypervisor_get_wrapper(sched_ctxs[i]); /* if the hypervisor gave 0 workers to a context but the context still has some last flops or a ready task that does not even have any flops we give a worker (in shared mode) to the context in order to leave him finish its work = we give -1.0 value instead of 0.0 and further on in the distribution function we take this into account and revert the variable to its 0.0 value */ // if(no_workers && (flops[i] != 0.0 || sc_w->nready_tasks > 0)) if(no_workers) { for(w = 0; w < nw; w++) res[i][w] = -1.0; } // if(optimal_v != 0.0) _set_optimal_v(sched_ctxs[i], optimal_v); } return vmax; #else//STARPU_HAVE_GLPK_H return 0.0; #endif//STARPU_HAVE_GLPK_H } double sc_hypervisor_lp_get_tmax(int nworkers, int *workers) { struct types_of_workers *tw = sc_hypervisor_get_types_of_workers(workers, nworkers); int nw = tw->nw; int total_nw[nw]; sc_hypervisor_group_workers_by_type(tw, total_nw); int nsched_ctxs = sc_hypervisor_get_nsched_ctxs(); double res[nsched_ctxs][nw]; double ret = sc_hypervisor_lp_get_nworkers_per_ctx(nsched_ctxs, nw, res, total_nw, tw, NULL) * 1000.0; free(tw); return ret; } void sc_hypervisor_lp_round_double_to_int(int ns, int nw, double res[ns][nw], int res_rounded[ns][nw]) { int s, w; double left_res[nw]; for(w = 0; w < nw; w++) left_res[w] = 0.0; for(s = 0; s < ns; s++) { for(w = 0; w < nw; w++) { int x = floor(res[s][w]); double x_double = (double)x; double diff = res[s][w] - x_double; if(diff != 0.0) { if(diff > 0.5) { if(left_res[w] != 0.0) { if((diff + left_res[w]) > 0.5) { res_rounded[s][w] = x + 1; left_res[w] = (-1.0) * (x_double + 1.0 - (res[s][w] + left_res[w])); } else { res_rounded[s][w] = x; left_res[w] = (-1.0) * (diff + left_res[w]); } } else { res_rounded[s][w] = x + 1; left_res[w] = (-1.0) * (x_double + 1.0 - res[s][w]); } } else { if((diff + left_res[w]) > 0.5) { res_rounded[s][w] = x + 1; left_res[w] = (-1.0) * (x_double + 1.0 - (res[s][w] + left_res[w])); } else { res_rounded[s][w] = x; left_res[w] = diff; } } } else res_rounded[s][w] = x; } } } void _lp_find_workers_to_give_away(int nw, int ns, unsigned sched_ctx, int sched_ctx_idx, int tmp_nw_move[nw], int tmp_workers_move[nw][STARPU_NMAXWORKERS], int tmp_nw_add[nw], int tmp_workers_add[nw][STARPU_NMAXWORKERS], int res_rounded[ns][nw], double res[ns][nw], struct types_of_workers *tw) { int w; double target_res = 0.0; for(w = 0; w < nw; w++) { target_res += res[sched_ctx_idx][w]; if(res[sched_ctx_idx][w] == -1.0) res[sched_ctx_idx][w] = 0.0; } for(w = 0; w < nw; w++) { enum starpu_worker_archtype arch = sc_hypervisor_get_arch_for_index(w, tw); if(arch == STARPU_CPU_WORKER) { int nworkers_ctx = sc_hypervisor_get_nworkers_ctx(sched_ctx, arch); if(nworkers_ctx > res_rounded[sched_ctx_idx][w]) { int nworkers_to_move = nworkers_ctx - res_rounded[sched_ctx_idx][w]; int *workers_to_move = sc_hypervisor_get_idlest_workers(sched_ctx, &nworkers_to_move, arch); int i; if(target_res < 0.0 && nworkers_to_move > 0) { tmp_workers_add[w][tmp_nw_add[w]++] = workers_to_move[0]; for(i = 1; i < nworkers_to_move; i++) tmp_workers_move[w][tmp_nw_move[w]++] = workers_to_move[i]; } else { for(i = 0; i < nworkers_to_move; i++) tmp_workers_move[w][tmp_nw_move[w]++] = workers_to_move[i]; } free(workers_to_move); } } else { double nworkers_ctx = sc_hypervisor_get_nworkers_ctx(sched_ctx, arch) * 1.0; if(nworkers_ctx > res[sched_ctx_idx][w]) { double nworkers_to_move = nworkers_ctx - res[sched_ctx_idx][w]; int x = floor(nworkers_to_move); double x_double = (double)x; double diff = nworkers_to_move - x_double; if(diff == 0.0) { int *workers_to_move = sc_hypervisor_get_idlest_workers(sched_ctx, &x, arch); if(x > 0) { int i; for(i = 0; i < x; i++) tmp_workers_move[w][tmp_nw_move[w]++] = workers_to_move[i]; } free(workers_to_move); } else { x+=1; int *workers_to_move = sc_hypervisor_get_idlest_workers(sched_ctx, &x, arch); if(x > 0) { int i; for(i = 0; i < x-1; i++) tmp_workers_move[w][tmp_nw_move[w]++] = workers_to_move[i]; if(diff > 0.8) tmp_workers_move[w][tmp_nw_move[w]++] = workers_to_move[x-1]; else if(diff > 0.3) tmp_workers_add[w][tmp_nw_add[w]++] = workers_to_move[x-1]; } free(workers_to_move); } } } } } void _lp_find_workers_to_accept(int nw, int ns, unsigned sched_ctx, int sched_ctx_idx, int tmp_nw_move[nw], int tmp_workers_move[nw][STARPU_NMAXWORKERS], int tmp_nw_add[nw], int tmp_workers_add[nw][STARPU_NMAXWORKERS], int *nw_move, int workers_move[STARPU_NMAXWORKERS], int *nw_add, int workers_add[STARPU_NMAXWORKERS], int res_rounded[ns][nw], double res[ns][nw], struct types_of_workers *tw) { int w; int j = 0, k = 0; for(w = 0; w < nw; w++) { enum starpu_worker_archtype arch = sc_hypervisor_get_arch_for_index(w, tw); int nw_ctx2 = sc_hypervisor_get_nworkers_ctx(sched_ctx, arch); int nw_needed = res_rounded[sched_ctx_idx][w] - nw_ctx2; if( nw_needed > 0 && tmp_nw_move[w] > 0) { *nw_move += nw_needed >= tmp_nw_move[w] ? tmp_nw_move[w] : nw_needed; int i = 0; for(i = 0; i < STARPU_NMAXWORKERS; i++) { if(tmp_workers_move[w][i] != -1) { workers_move[j++] = tmp_workers_move[w][i]; tmp_workers_move[w][i] = -1; if(j == *nw_move) break; } } tmp_nw_move[w] -= *nw_move; } double needed = res[sched_ctx_idx][w] - (nw_ctx2 * 1.0); int x = floor(needed); double x_double = (double)x; double diff = needed - x_double; if((diff > 0.3 || needed > 0.3) && tmp_nw_add[w] > 0) { *nw_add = tmp_nw_add[w]; int i = 0; for(i = 0; i < STARPU_NMAXWORKERS; i++) { if(tmp_workers_add[w][i] != -1) { workers_add[k++] = tmp_workers_add[w][i]; tmp_workers_add[w][i] = -1; if(k == *nw_add) break; } } tmp_nw_add[w] -= *nw_add; } } } void _lp_find_workers_to_remove(int nw, int tmp_nw_move[nw], int tmp_workers_move[nw][STARPU_NMAXWORKERS], int *nw_move, int workers_move[STARPU_NMAXWORKERS]) { int w; for(w = 0; w < nw; w++) { if(tmp_nw_move[w] > 0) { *nw_move += tmp_nw_move[w]; int i = 0, j = 0; for(i = 0; i < STARPU_NMAXWORKERS; i++) { if(tmp_workers_move[w][i] != -1) { workers_move[j++] = tmp_workers_move[w][i]; tmp_workers_move[w][i] = -1; if(j == *nw_move) break; } } } } } void sc_hypervisor_lp_redistribute_resources_in_ctxs(int ns, int nw, int res_rounded[ns][nw], double res[ns][nw], unsigned *sched_ctxs, struct types_of_workers *tw) { int s, s2, w; for(s = 0; s < ns; s++) { int tmp_workers_move[nw][STARPU_NMAXWORKERS]; int tmp_nw_move[nw]; int tmp_workers_add[nw][STARPU_NMAXWORKERS]; int tmp_nw_add[nw]; for(w = 0; w < nw; w++) { tmp_nw_move[w] = 0; tmp_nw_add[w] = 0; int i; for(i = 0; i < STARPU_NMAXWORKERS; i++) { tmp_workers_move[w][i] = -1; tmp_workers_add[w][i] = -1; } } /* find workers that ctx s has to give away */ _lp_find_workers_to_give_away(nw, ns, sched_ctxs[s], s, tmp_nw_move, tmp_workers_move, tmp_nw_add, tmp_workers_add, res_rounded, res, tw); for(s2 = 0; s2 < ns; s2++) { if(sched_ctxs[s2] != sched_ctxs[s]) { /* find workers that ctx s2 wants to accept from ctx s the rest of it will probably accepted by another ctx */ int workers_move[STARPU_NMAXWORKERS]; int nw_move = 0; int workers_add[STARPU_NMAXWORKERS]; int nw_add = 0; _lp_find_workers_to_accept(nw, ns, sched_ctxs[s2], s2, tmp_nw_move, tmp_workers_move, tmp_nw_add, tmp_workers_add, &nw_move, workers_move, &nw_add, workers_add, res_rounded, res, tw); if(nw_move > 0) { sc_hypervisor_move_workers(sched_ctxs[s], sched_ctxs[s2], workers_move, nw_move, !(_sc_hypervisor_use_lazy_resize())); nw_move = 0; } if(nw_add > 0) { sc_hypervisor_add_workers_to_sched_ctx(workers_add, nw_add, sched_ctxs[s2]); nw_add = 0; } } } /* if there are workers that weren't accepted by anyone but ctx s wants to get rid of them just remove them from ctx s */ int workers_move[STARPU_NMAXWORKERS]; int nw_move = 0; _lp_find_workers_to_remove(nw, tmp_nw_move, tmp_workers_move, &nw_move, workers_move); if(nw_move > 0) sc_hypervisor_remove_workers_from_sched_ctx(workers_move, nw_move, sched_ctxs[s], !(_sc_hypervisor_use_lazy_resize())); } } int _lp_get_unwanted_workers(int *workers_add, int nw_add, unsigned sched_ctx, int *workers_remove) { int nw_remove = 0; struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx); int worker; struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); int i; unsigned found = 0; for(i = 0; i < nw_add; i++) { if(worker == workers_add[i]) { found = 1; break; } } if(!found) workers_remove[nw_remove++] = worker; } return nw_remove; } void sc_hypervisor_lp_distribute_resources_in_ctxs(unsigned* sched_ctxs, int ns, int nw, int res_rounded[ns][nw], double res[ns][nw], int *workers, int nworkers, struct types_of_workers *tw) { int s, w; int start[nw]; for(w = 0; w < nw; w++) start[w] = 0; for(s = 0; s < ns; s++) { int workers_add[STARPU_NMAXWORKERS]; int nw_add = 0; double target_res = 0.0; for(w = 0; w < nw; w++) { target_res += res[s][w]; if(res[s][w] == -1.0) res[s][w] = 0.0; } for(w = 0; w < nw; w++) { enum starpu_worker_archtype arch = sc_hypervisor_get_arch_for_index(w, tw); if(arch == STARPU_CPU_WORKER) { int nworkers_to_add = res_rounded[s][w]; if(target_res < 0.0) { nworkers_to_add=1; int old_start = start[w]; if(start[w] != 0) start[w]--; int *workers_to_add = sc_hypervisor_get_idlest_workers_in_list(&start[w], workers, nworkers, &nworkers_to_add, arch); start[w] = old_start; int i; for(i = 0; i < nworkers_to_add; i++) { workers_add[nw_add++] = workers_to_add[i]; } free(workers_to_add); } else { int *workers_to_add = sc_hypervisor_get_idlest_workers_in_list(&start[w], workers, nworkers, &nworkers_to_add, arch); int i; for(i = 0; i < nworkers_to_add; i++) workers_add[nw_add++] = workers_to_add[i]; free(workers_to_add); } } else { double nworkers_to_add = res[s][w]; int x = floor(nworkers_to_add); double x_double = (double)x; double diff = nworkers_to_add - x_double; if(diff == 0.0) { int *workers_to_add = sc_hypervisor_get_idlest_workers_in_list(&start[w], workers, nworkers, &x, arch); int i; for(i = 0; i < x; i++) workers_add[nw_add++] = workers_to_add[i]; free(workers_to_add); } else { x+=1; int *workers_to_add = sc_hypervisor_get_idlest_workers_in_list(&start[w], workers, nworkers, &x, arch); int i; if(diff >= 0.3) for(i = 0; i < x; i++) workers_add[nw_add++] = workers_to_add[i]; else for(i = 0; i < x-1; i++) workers_add[nw_add++] = workers_to_add[i]; free(workers_to_add); } } } // sc_hypervisor_start_resize(sched_ctxs[s]); sc_hypervisor_add_workers_to_sched_ctx(workers_add, nw_add, sched_ctxs[s]); int workers_remove[STARPU_NMAXWORKERS]; int nw_remove = _lp_get_unwanted_workers(workers_add, nw_add, sched_ctxs[s], workers_remove); sc_hypervisor_remove_workers_from_sched_ctx(workers_remove, nw_remove, sched_ctxs[s], !(_sc_hypervisor_use_lazy_resize())); } } void sc_hypervisor_lp_distribute_floating_no_resources_in_ctxs(unsigned* sched_ctxs, int ns, int nw, double res[ns][nw], int *workers, int nworkers, struct types_of_workers *tw) { int s, w; int start[nw]; for(w = 0; w < nw; w++) start[w] = 0; for(s = 0; s < ns; s++) { int workers_add[STARPU_NMAXWORKERS]; int nw_add = 0; double target_res = 0.0; for(w = 0; w < nw; w++) { target_res += res[s][w]; if(res[s][w] == -1.0) res[s][w] = 0.0; } for(w = 0; w < nw; w++) { enum starpu_worker_archtype arch = sc_hypervisor_get_arch_for_index(w, tw); if(arch == STARPU_CPU_WORKER) { int nworkers_to_add = ceil(res[s][w]); double ceil_double = (double)nworkers_to_add; double diff = ceil_double - res[s][w]; if(target_res < 0.0) { nworkers_to_add=1; int old_start = start[w]; if(start[w] != 0) start[w]--; int *workers_to_add = sc_hypervisor_get_idlest_workers_in_list(&start[w], workers, nworkers, &nworkers_to_add, arch); start[w] = old_start; int i; for(i = 0; i < nworkers_to_add; i++) { workers_add[nw_add++] = workers_to_add[i]; } free(workers_to_add); } else { int *workers_to_add = sc_hypervisor_get_idlest_workers_in_list(&start[w], workers, nworkers, &nworkers_to_add, arch); int i; for(i = 0; i < nworkers_to_add; i++) workers_add[nw_add++] = workers_to_add[i]; free(workers_to_add); } if(diff != 0.0) start[w]--; } else { double nworkers_to_add = res[s][w]; int x = floor(nworkers_to_add); double x_double = (double)x; double diff = nworkers_to_add - x_double; if(diff == 0.0) { int *workers_to_add = sc_hypervisor_get_idlest_workers_in_list(&start[w], workers, nworkers, &x, arch); int i; for(i = 0; i < x; i++) workers_add[nw_add++] = workers_to_add[i]; free(workers_to_add); } else { x+=1; int *workers_to_add = sc_hypervisor_get_idlest_workers_in_list(&start[w], workers, nworkers, &x, arch); int i; if(diff >= 0.3) for(i = 0; i < x; i++) workers_add[nw_add++] = workers_to_add[i]; else for(i = 0; i < x-1; i++) workers_add[nw_add++] = workers_to_add[i]; free(workers_to_add); } } } // sc_hypervisor_start_resize(sched_ctxs[s]); sc_hypervisor_add_workers_to_sched_ctx(workers_add, nw_add, sched_ctxs[s]); int workers_remove[STARPU_NMAXWORKERS]; int nw_remove = _lp_get_unwanted_workers(workers_add, nw_add, sched_ctxs[s], workers_remove); sc_hypervisor_remove_workers_from_sched_ctx(workers_remove, nw_remove, sched_ctxs[s], !(_sc_hypervisor_use_lazy_resize())); } } /* nw = all the workers (either in a list or on all machine) */ void sc_hypervisor_lp_place_resources_in_ctx(int ns, int nw, double w_in_s[ns][nw], unsigned *sched_ctxs_input, int *workers_input, unsigned do_size, struct types_of_workers *tw) { int w, s; int ntypes_of_workers = tw->nw; double nworkers[ns][ntypes_of_workers]; int nworkers_rounded[ns][ntypes_of_workers]; for(s = 0; s < ns; s++) { for(w = 0; w < ntypes_of_workers; w++) { nworkers[s][w] = 0.0; nworkers_rounded[s][w] = 0; } } for(s = 0; s < ns; s++) { for(w = 0; w < nw; w++) { enum starpu_worker_archtype arch = starpu_worker_get_type(w); int idx = sc_hypervisor_get_index_for_arch(arch, tw); nworkers[s][idx] += w_in_s[s][w]; if(arch == STARPU_CUDA_WORKER) { if(w_in_s[s][w] >= 0.3) nworkers_rounded[s][idx]++; } else { if(w_in_s[s][w] > 0.5) nworkers_rounded[s][idx]++; } } } if(!do_size) sc_hypervisor_lp_redistribute_resources_in_ctxs(ns, ntypes_of_workers, nworkers_rounded, nworkers, sched_ctxs_input, tw); else { unsigned *current_sched_ctxs = sched_ctxs_input == NULL ? sc_hypervisor_get_sched_ctxs() : sched_ctxs_input; unsigned has_workers = 0; for(s = 0; s < ns; s++) { int nworkers_ctx = sc_hypervisor_get_nworkers_ctx(current_sched_ctxs[s], STARPU_ANY_WORKER); if(nworkers_ctx != 0) { has_workers = 1; break; } } if(has_workers) sc_hypervisor_lp_redistribute_resources_in_ctxs(ns, ntypes_of_workers, nworkers_rounded, nworkers, current_sched_ctxs, tw); else sc_hypervisor_lp_distribute_resources_in_ctxs(current_sched_ctxs, ns, ntypes_of_workers, nworkers_rounded, nworkers, workers_input, nw, tw); } return; } void sc_hypervisor_lp_share_remaining_resources(int ns, unsigned *sched_ctxs, int nworkers, int *workers) { int s, w, worker, nw = 0; int remaining_workers[nworkers]; for(w = 0; w < nworkers; w++) { worker = workers == NULL ? w : workers[w]; unsigned found = 0; for(s = 0; s < ns; s++) { if(starpu_sched_ctx_contains_worker(worker, sched_ctxs[s])) { found = 1; break; } } if(!found) { remaining_workers[nw++] = worker; } } if(nw > 0) { for(s = 0; s < ns; s++) { for(w = 0; w < nw; w++) _sc_hypervisor_allow_compute_idle(sched_ctxs[s], remaining_workers[w], 0); sc_hypervisor_add_workers_to_sched_ctx(remaining_workers, nw, sched_ctxs[s]); } } } double sc_hypervisor_lp_find_tmax(double t1, double t2) { return t1 + ((t2 - t1)/2); } starpu-1.2.3+dfsg/sc_hypervisor/src/policies_utils/policy_tools.c000066400000000000000000000447321320135501600253600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "sc_hypervisor_policy.h" #include "sc_hypervisor_intern.h" #include "sc_hypervisor_lp.h" static int _compute_priority(unsigned sched_ctx) { struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(sched_ctx); int total_priority = 0; struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx); int worker; struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); total_priority += config->priority[worker]; } return total_priority; } /* find the context with the lowest priority */ unsigned sc_hypervisor_find_lowest_prio_sched_ctx(unsigned req_sched_ctx, int nworkers_to_move) { int i; int highest_priority = -1; int current_priority = 0; unsigned sched_ctx = STARPU_NMAX_SCHED_CTXS; unsigned *sched_ctxs = sc_hypervisor_get_sched_ctxs(); int nsched_ctxs = sc_hypervisor_get_nsched_ctxs(); struct sc_hypervisor_policy_config *config = NULL; for(i = 0; i < nsched_ctxs; i++) { if(sched_ctxs[i] != STARPU_NMAX_SCHED_CTXS && sched_ctxs[i] != req_sched_ctx) { int nworkers = (int)starpu_sched_ctx_get_nworkers(sched_ctxs[i]); config = sc_hypervisor_get_config(sched_ctxs[i]); if((nworkers + nworkers_to_move) <= config->max_nworkers) { current_priority = _compute_priority(sched_ctxs[i]); if (highest_priority < current_priority) { highest_priority = current_priority; sched_ctx = sched_ctxs[i]; } } } } return sched_ctx; } int* sc_hypervisor_get_idlest_workers_in_list(int *start, int *workers, int nall_workers, int *nworkers, enum starpu_worker_archtype arch) { int *curr_workers = (int*)malloc((*nworkers)*sizeof(int)); int w, worker; int nfound_workers = 0; for(w = 0; w < nall_workers; w++) { if(nfound_workers >= *nworkers) break; worker = workers == NULL ? w : workers[w]; enum starpu_worker_archtype curr_arch = starpu_worker_get_type(worker); if(arch == STARPU_ANY_WORKER || curr_arch == arch) { if(w >= *start) { curr_workers[nfound_workers++] = worker; *start = w+1; } } } if(nfound_workers < *nworkers) *nworkers = nfound_workers; return curr_workers; } /* get first nworkers with the highest idle time in the context */ int* sc_hypervisor_get_idlest_workers(unsigned sched_ctx, int *nworkers, enum starpu_worker_archtype arch) { struct sc_hypervisor_wrapper* sc_w = sc_hypervisor_get_wrapper(sched_ctx); struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(sched_ctx); int *curr_workers = (int*)malloc((*nworkers) * sizeof(int)); int i; for(i = 0; i < *nworkers; i++) curr_workers[i] = -1; struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx); int index; int worker; int considered = 0; struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); for(index = 0; index < *nworkers; index++) { while(workers->has_next(workers, &it)) { considered = 0; worker = workers->get_next(workers, &it); enum starpu_worker_archtype curr_arch = starpu_worker_get_type(worker); if(arch == STARPU_ANY_WORKER || curr_arch == arch) { if(!config->fixed_workers[worker]) { for(i = 0; i < index; i++) { if(curr_workers[i] == worker) { considered = 1; break; } } if(!considered) { /* the first iteration*/ if(curr_workers[index] < 0) curr_workers[index] = worker; /* small priority worker is the first to leave the ctx*/ else if(config->priority[worker] < config->priority[curr_workers[index]]) curr_workers[index] = worker; /* if we don't consider priorities check for the workers with the biggest idle time */ else if(config->priority[worker] == config->priority[curr_workers[index]]) { double worker_idle_time = sc_w->current_idle_time[worker]; double curr_worker_idle_time = sc_w->current_idle_time[curr_workers[index]]; if(worker_idle_time > curr_worker_idle_time) curr_workers[index] = worker; } } } } } if(curr_workers[index] < 0) { *nworkers = index; break; } } return curr_workers; } /* get the number of workers in the context that are allowed to be moved (that are not fixed) */ int sc_hypervisor_get_movable_nworkers(struct sc_hypervisor_policy_config *config, unsigned sched_ctx, enum starpu_worker_archtype arch) { struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx); int potential_workers = 0; int worker; struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); enum starpu_worker_archtype curr_arch = starpu_worker_get_type(worker); if(arch == STARPU_ANY_WORKER || curr_arch == arch) { if(!config->fixed_workers[worker]) potential_workers++; } } return potential_workers; } /* compute the number of workers that should be moved depending: - on the min/max number of workers in a context imposed by the user, - on the resource granularity imposed by the user for the resizing process*/ int sc_hypervisor_compute_nworkers_to_move(unsigned req_sched_ctx) { struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(req_sched_ctx); int nworkers = (int)starpu_sched_ctx_get_nworkers(req_sched_ctx); int nworkers_to_move = 0; int potential_moving_workers = (int)sc_hypervisor_get_movable_nworkers(config, req_sched_ctx, STARPU_ANY_WORKER); if(potential_moving_workers > 0) { if(potential_moving_workers <= config->min_nworkers) /* if we have to give more than min better give it all */ /* => empty ctx will block until having the required workers */ nworkers_to_move = potential_moving_workers; else if(potential_moving_workers > config->max_nworkers) { if((potential_moving_workers - config->granularity) > config->max_nworkers) // nworkers_to_move = config->granularity; nworkers_to_move = potential_moving_workers; else nworkers_to_move = potential_moving_workers - config->max_nworkers; } else if(potential_moving_workers > config->granularity) { if((nworkers - config->granularity) > config->min_nworkers) nworkers_to_move = config->granularity; else nworkers_to_move = potential_moving_workers - config->min_nworkers; } else { int nfixed_workers = nworkers - potential_moving_workers; if(nfixed_workers >= config->min_nworkers) nworkers_to_move = potential_moving_workers; else nworkers_to_move = potential_moving_workers - (config->min_nworkers - nfixed_workers); } if((nworkers - nworkers_to_move) > config->max_nworkers) nworkers_to_move = nworkers - config->max_nworkers; } return nworkers_to_move; } unsigned sc_hypervisor_policy_resize(unsigned sender_sched_ctx, unsigned receiver_sched_ctx, unsigned force_resize, unsigned now) { int ret = 1; if(force_resize) STARPU_PTHREAD_MUTEX_LOCK(&act_hypervisor_mutex); else ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { int nworkers_to_move = sc_hypervisor_compute_nworkers_to_move(sender_sched_ctx); if(nworkers_to_move > 0) { unsigned poor_sched_ctx = STARPU_NMAX_SCHED_CTXS; if(receiver_sched_ctx == STARPU_NMAX_SCHED_CTXS) { poor_sched_ctx = sc_hypervisor_find_lowest_prio_sched_ctx(sender_sched_ctx, (unsigned)nworkers_to_move); } else { poor_sched_ctx = receiver_sched_ctx; struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(poor_sched_ctx); int nworkers = (int)starpu_sched_ctx_get_nworkers(poor_sched_ctx); int nshared_workers = (int)starpu_sched_ctx_get_nshared_workers(sender_sched_ctx, poor_sched_ctx); if((nworkers+nworkers_to_move-nshared_workers) > config->max_nworkers) nworkers_to_move = nworkers > config->max_nworkers ? 0 : (config->max_nworkers - nworkers+nshared_workers); if(nworkers_to_move == 0) poor_sched_ctx = STARPU_NMAX_SCHED_CTXS; } if(poor_sched_ctx != STARPU_NMAX_SCHED_CTXS) { int *workers_to_move = sc_hypervisor_get_idlest_workers(sender_sched_ctx, &nworkers_to_move, STARPU_ANY_WORKER); sc_hypervisor_move_workers(sender_sched_ctx, poor_sched_ctx, workers_to_move, nworkers_to_move, now); struct sc_hypervisor_policy_config *new_config = sc_hypervisor_get_config(poor_sched_ctx); int i; for(i = 0; i < nworkers_to_move; i++) new_config->max_idle[workers_to_move[i]] = new_config->max_idle[workers_to_move[i]] !=MAX_IDLE_TIME ? new_config->max_idle[workers_to_move[i]] : new_config->new_workers_max_idle; free(workers_to_move); } } STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); return 1; } return 0; } unsigned sc_hypervisor_policy_resize_to_unknown_receiver(unsigned sender_sched_ctx, unsigned now) { return sc_hypervisor_policy_resize(sender_sched_ctx, STARPU_NMAX_SCHED_CTXS, 0, now); } double sc_hypervisor_get_slowest_ctx_exec_time(void) { unsigned *sched_ctxs = sc_hypervisor_get_sched_ctxs(); int nsched_ctxs = sc_hypervisor_get_nsched_ctxs(); /* double curr_time = starpu_timing_now(); */ double slowest_time = 0.0; int s; struct sc_hypervisor_wrapper* sc_w; for(s = 0; s < nsched_ctxs; s++) { sc_w = sc_hypervisor_get_wrapper(sched_ctxs[s]); // double elapsed_time = (curr_time - sc_w->start_time)/1000000; struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(sc_w->sched_ctx); double elapsed_time = (config->ispeed_ctx_sample/1000000000.0)/sc_hypervisor_get_ctx_speed(sc_w); if(elapsed_time > slowest_time) slowest_time = elapsed_time; } return slowest_time; } double sc_hypervisor_get_fastest_ctx_exec_time(void) { unsigned *sched_ctxs = sc_hypervisor_get_sched_ctxs(); int nsched_ctxs = sc_hypervisor_get_nsched_ctxs(); double curr_time = starpu_timing_now(); double fastest_time = curr_time; int s; struct sc_hypervisor_wrapper* sc_w; for(s = 0; s < nsched_ctxs; s++) { sc_w = sc_hypervisor_get_wrapper(sched_ctxs[s]); struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(sc_w->sched_ctx); double elapsed_time = (config->ispeed_ctx_sample/1000000000.0)/sc_hypervisor_get_ctx_speed(sc_w); if(elapsed_time < fastest_time) fastest_time = elapsed_time; } return fastest_time; } void sc_hypervisor_group_workers_by_type(struct types_of_workers *tw, int *total_nw) { unsigned w; for(w = 0; w < tw->nw; w++) total_nw[w] = 0; if(tw->ncpus != 0) { total_nw[0] = tw->ncpus; if(tw->ncuda != 0) total_nw[1] = tw->ncuda; } else { if(tw->ncuda != 0) total_nw[0] =tw->ncuda; } } enum starpu_worker_archtype sc_hypervisor_get_arch_for_index(unsigned w, struct types_of_workers *tw) { if(w == 0) { if(tw->ncpus != 0) return STARPU_CPU_WORKER; else return STARPU_CUDA_WORKER; } else if(tw->ncuda != 0) return STARPU_CUDA_WORKER; return STARPU_CPU_WORKER; } unsigned sc_hypervisor_get_index_for_arch(enum starpu_worker_archtype arch, struct types_of_workers *tw) { if(arch == STARPU_CPU_WORKER) { if(tw->ncpus != 0) return 0; } else { if(arch == STARPU_CUDA_WORKER) { if(tw->ncpus != 0) return 1; else return 0; } } return 0; } void sc_hypervisor_get_tasks_times(int nw, int nt, double times[nw][nt], int *workers, unsigned size_ctxs, struct sc_hypervisor_policy_task_pool *task_pools) { struct sc_hypervisor_policy_task_pool *tp; int w, t; for(w = 0; w < nw; w++) for(t = 0; t < nt; t++) times[w][t] = NAN; for (w = 0; w < nw; w++) { for (t = 0, tp = task_pools; tp; t++, tp = tp->next) { int worker = workers == NULL ? w : workers[w]; struct starpu_perfmodel_arch* arch = starpu_worker_get_perf_archtype(worker, STARPU_NMAX_SCHED_CTXS); double length = starpu_perfmodel_history_based_expected_perf(tp->cl->model, arch, tp->footprint); if (isnan(length)) times[w][t] = NAN; else { times[w][t] = (length / 1000.); double transfer_time = 0.0; unsigned worker_in_ctx = starpu_sched_ctx_contains_worker(worker, tp->sched_ctx_id); enum starpu_worker_archtype arch = starpu_worker_get_type(worker); if(!worker_in_ctx && !size_ctxs) { if(arch == STARPU_CUDA_WORKER) { double transfer_speed = starpu_transfer_bandwidth(STARPU_MAIN_RAM, starpu_worker_get_memory_node(worker)); if(transfer_speed > 0.0) transfer_time += (tp->data_size / transfer_speed) / 1000. ; double latency = starpu_transfer_latency(STARPU_MAIN_RAM, starpu_worker_get_memory_node(worker)); transfer_time += latency/1000.; // transfer_time *=4; } else if(arch == STARPU_CPU_WORKER) { if(!starpu_sched_ctx_contains_type_of_worker(arch, tp->sched_ctx_id)) { double transfer_speed = starpu_transfer_bandwidth(starpu_worker_get_memory_node(worker), STARPU_MAIN_RAM); if(transfer_speed > 0.0) transfer_time += (tp->data_size / transfer_speed) / 1000. ; double latency = starpu_transfer_latency(starpu_worker_get_memory_node(worker), STARPU_MAIN_RAM); transfer_time += latency / 1000.; } } } // printf("%d/%d %s x %d time = %lf transfer_time = %lf\n", w, tp->sched_ctx_id, tp->cl->model->symbol, tp->n, times[w][t], transfer_time); times[w][t] += transfer_time; } // printf("sc%d w%d task %s nt %d times %lf s\n", tp->sched_ctx_id, w, tp->cl->model->symbol, tp->n, times[w][t]); } } } unsigned sc_hypervisor_check_idle(unsigned sched_ctx, int worker) { struct sc_hypervisor_wrapper* sc_w = sc_hypervisor_get_wrapper(sched_ctx); struct sc_hypervisor_policy_config *config = sc_w->config; if(config != NULL) { if(sc_w->idle_time[worker] > config->max_idle[worker]) { // printf("w%d/ctx%d: current idle %lf max_idle %lf\n", worker, sched_ctx, sc_w->idle_time[worker], config->max_idle[worker]); return 1; } } return 0; } /* check if there is a big speed gap between the contexts */ unsigned sc_hypervisor_check_speed_gap_btw_ctxs(unsigned *sched_ctxs_in, int ns_in, int *workers_in, int nworkers_in) { unsigned *sched_ctxs = sched_ctxs_in == NULL ? sc_hypervisor_get_sched_ctxs() : sched_ctxs_in; int ns = ns_in == -1 ? sc_hypervisor_get_nsched_ctxs() : ns_in; int *workers = workers_in; int nworkers = nworkers_in == -1 ? starpu_worker_get_count() : nworkers_in; int i = 0, j = 0; struct sc_hypervisor_wrapper* sc_w; struct sc_hypervisor_wrapper* other_sc_w; double optimal_v[ns]; unsigned has_opt_v = 1; for(i = 0; i < ns; i++) { optimal_v[i] = _get_optimal_v(sched_ctxs[i]); if(optimal_v[i] == 0.0) { has_opt_v = 0; break; } } /*if an optimal speed has not been computed yet do it now */ if(!has_opt_v) { struct types_of_workers *tw = sc_hypervisor_get_types_of_workers(workers, nworkers); int nw = tw->nw; double nworkers_per_ctx[ns][nw]; int total_nw[nw]; sc_hypervisor_group_workers_by_type(tw, total_nw); double vmax = sc_hypervisor_lp_get_nworkers_per_ctx(ns, nw, nworkers_per_ctx, total_nw, tw, sched_ctxs); // if(vmax != 0.0) { for(i = 0; i < ns; i++) { sc_w = sc_hypervisor_get_wrapper(sched_ctxs[i]); double v[nw]; optimal_v[i] = 0.0; int w; for(w = 0; w < nw; w++) { v[w] = sc_hypervisor_get_speed(sc_w, sc_hypervisor_get_arch_for_index(w, tw)); optimal_v[i] += nworkers_per_ctx[i][w] == -1.0 ? 0.0 : nworkers_per_ctx[i][w]*v[w]; } _set_optimal_v(sched_ctxs[i], optimal_v[i]); } has_opt_v = 1; } free(tw); } /* if we have an optimal speed for each type of worker compare the monitored one with the theoretical one */ if(has_opt_v) { for(i = 0; i < ns; i++) { sc_w = sc_hypervisor_get_wrapper(sched_ctxs[i]); double ctx_v = sc_hypervisor_get_ctx_speed(sc_w); if(ctx_v == -1.0) return 0; } for(i = 0; i < ns; i++) { sc_w = sc_hypervisor_get_wrapper(sched_ctxs[i]); double ctx_v = sc_hypervisor_get_ctx_speed(sc_w); ctx_v = ctx_v < 0.01 ? 0.0 : ctx_v; double max_vel = _get_max_speed_gap(); if(ctx_v != -1.0 && ((ctx_v < (1-max_vel)*optimal_v[i]) || ctx_v > (1+max_vel)*optimal_v[i])) { return 1; } } } else /* if we have not been able to compute a theoretical speed consider the env variable SC_MAX_SPEED_GAP and compare the speed of the contexts, whenever the difference btw them is greater than the max value the function returns true */ { for(i = 0; i < ns; i++) { sc_w = sc_hypervisor_get_wrapper(sched_ctxs[i]); double ctx_v = sc_hypervisor_get_ctx_speed(sc_w); if(ctx_v != -1.0) { for(j = 0; j < ns; j++) { if(sched_ctxs[i] != sched_ctxs[j]) { unsigned nworkers = starpu_sched_ctx_get_nworkers(sched_ctxs[j]); if(nworkers == 0) return 1; other_sc_w = sc_hypervisor_get_wrapper(sched_ctxs[j]); double other_ctx_v = sc_hypervisor_get_ctx_speed(other_sc_w); if(other_ctx_v != -1.0) { double gap = ctx_v < other_ctx_v ? other_ctx_v / ctx_v : ctx_v / other_ctx_v; double max_vel = _get_max_speed_gap(); if(gap > max_vel) return 1; } } } } } } return 0; } unsigned sc_hypervisor_check_speed_gap_btw_ctxs_on_level(int level, int *workers_in, int nworkers_in, unsigned father_sched_ctx_id, unsigned **sched_ctxs, int *nsched_ctxs) { sc_hypervisor_get_ctxs_on_level(sched_ctxs, nsched_ctxs, level, father_sched_ctx_id); if(*nsched_ctxs > 0) return sc_hypervisor_check_speed_gap_btw_ctxs(*sched_ctxs, *nsched_ctxs, workers_in, nworkers_in); return 0; } unsigned sc_hypervisor_criteria_fulfilled(unsigned sched_ctx, int worker) { unsigned criteria = sc_hypervisor_get_resize_criteria(); if(criteria != SC_NOTHING) { if(criteria == SC_IDLE) return sc_hypervisor_check_idle(sched_ctx, worker); else return sc_hypervisor_check_speed_gap_btw_ctxs(NULL, -1, NULL, -1); } else return 0; } starpu-1.2.3+dfsg/sc_hypervisor/src/policies_utils/speed.c000066400000000000000000000263701320135501600237370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "sc_hypervisor_policy.h" #include "sc_hypervisor_intern.h" #include double sc_hypervisor_get_ctx_speed(struct sc_hypervisor_wrapper* sc_w) { struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(sc_w->sched_ctx); double elapsed_flops = sc_hypervisor_get_elapsed_flops_per_sched_ctx(sc_w); double sample = config->ispeed_ctx_sample; double total_elapsed_flops = sc_hypervisor_get_total_elapsed_flops_per_sched_ctx(sc_w); double total_flops = sc_w->total_flops; char *start_sample_prc_char = getenv("SC_HYPERVISOR_START_RESIZE"); double start_sample_prc = start_sample_prc_char ? atof(start_sample_prc_char) : 0.0; double start_sample = start_sample_prc > 0.0 ? (start_sample_prc / 100) * total_flops : sample; double redim_sample = elapsed_flops == total_elapsed_flops ? (start_sample > 0.0 ? start_sample : sample) : sample; double curr_time = starpu_timing_now(); double elapsed_time = (curr_time - sc_w->start_time) / 1000000.0; /* in seconds */ unsigned can_compute_speed = 0; char *speed_sample_criteria = getenv("SC_HYPERVISOR_SAMPLE_CRITERIA"); if(speed_sample_criteria && (strcmp(speed_sample_criteria, "time") == 0)) can_compute_speed = elapsed_time > config->time_sample; else can_compute_speed = elapsed_flops >= redim_sample; if(can_compute_speed) { return (elapsed_flops/1000000000.0)/elapsed_time;/* in Gflops/s */ } return -1.0; } double sc_hypervisor_get_speed_per_worker(struct sc_hypervisor_wrapper *sc_w, unsigned worker) { if(!starpu_sched_ctx_contains_worker(worker, sc_w->sched_ctx)) return -1.0; double elapsed_flops = sc_w->elapsed_flops[worker] / 1000000000.0; /*in gflops */ struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(sc_w->sched_ctx); double sample = config->ispeed_w_sample[worker] / 1000000000.0; /*in gflops */ double ctx_elapsed_flops = sc_hypervisor_get_elapsed_flops_per_sched_ctx(sc_w); double ctx_sample = config->ispeed_ctx_sample; if(ctx_elapsed_flops > ctx_sample && elapsed_flops == 0.0) return 0.00000000000001; if( elapsed_flops > sample) { double curr_time = starpu_timing_now(); double elapsed_time = (curr_time - sc_w->start_time) / 1000000.0; /* in seconds */ elapsed_time -= sc_w->idle_time[worker]; /* size_t elapsed_data_used = sc_w->elapsed_data[worker]; */ /* enum starpu_worker_archtype arch = starpu_worker_get_type(worker); */ /* if(arch == STARPU_CUDA_WORKER) */ /* { */ /* /\* unsigned worker_in_ctx = starpu_sched_ctx_contains_worker(worker, sc_w->sched_ctx); *\/ */ /* /\* if(!worker_in_ctx) *\/ */ /* /\* { *\/ */ /* /\* double transfer_speed = starpu_transfer_bandwidth(STARPU_MAIN_RAM, starpu_worker_get_memory_node(worker)); *\/ */ /* /\* elapsed_time += (elapsed_data_used / transfer_speed) / 1000000 ; *\/ */ /* /\* } *\/ */ /* double latency = starpu_transfer_latency(STARPU_MAIN_RAM, starpu_worker_get_memory_node(worker)); */ /* // printf("%d/%d: latency %lf elapsed_time before %lf ntasks %d\n", worker, sc_w->sched_ctx, latency, elapsed_time, elapsed_tasks); */ /* elapsed_time += (elapsed_tasks * latency)/1000000; */ /* // printf("elapsed time after %lf \n", elapsed_time); */ /* } */ double vel = (elapsed_flops/elapsed_time);/* in Gflops/s */ return vel; } return -1.0; } /* compute an average value of the cpu/cuda speed */ double sc_hypervisor_get_speed_per_worker_type(struct sc_hypervisor_wrapper* sc_w, enum starpu_worker_archtype arch) { struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(sc_w->sched_ctx); double ctx_elapsed_flops = sc_hypervisor_get_elapsed_flops_per_sched_ctx(sc_w); double ctx_sample = config->ispeed_ctx_sample; double curr_time = starpu_timing_now(); double elapsed_time = (curr_time - sc_w->start_time) / 1000000.0; /* in seconds */ unsigned can_compute_speed = 0; char *speed_sample_criteria = getenv("SC_HYPERVISOR_SAMPLE_CRITERIA"); if(speed_sample_criteria && (strcmp(speed_sample_criteria, "time") == 0)) can_compute_speed = elapsed_time > config->time_sample; else can_compute_speed = ctx_elapsed_flops > ctx_sample; if(can_compute_speed) { if(ctx_elapsed_flops == 0.0) return -1.0; struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sc_w->sched_ctx); int worker; struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); double speed = 0.0; unsigned nworkers = 0; double all_workers_flops = 0.0; double max_workers_idle_time = 0.0; while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); enum starpu_worker_archtype req_arch = starpu_worker_get_type(worker); if(arch == req_arch && sc_w->compute_idle[worker]) { if(sc_w->exec_start_time[worker] != 0.0) { double current_exec_time = 0.0; if(sc_w->exec_start_time[worker] < sc_w->start_time) current_exec_time = (curr_time - sc_w->start_time) / 1000000.0; /* in seconds */ else current_exec_time = (curr_time - sc_w->exec_start_time[worker]) / 1000000.0; /* in seconds */ double suppl_flops = current_exec_time * sc_hypervisor_get_ref_speed_per_worker_type(sc_w, req_arch); all_workers_flops += suppl_flops; } all_workers_flops += sc_w->elapsed_flops[worker] / 1000000000.0; /*in gflops */ if(max_workers_idle_time < sc_w->idle_time[worker]) max_workers_idle_time = sc_w->idle_time[worker]; /* in seconds */ nworkers++; } } if(nworkers != 0 && all_workers_flops > 0.0001) { // elapsed_time -= max_workers_idle_time; speed = (all_workers_flops / elapsed_time) / nworkers; } else speed = -1.0; if(speed != -1.0) { /* if ref_speed started being corrupted bc of the old bad distribution register only the last frame otherwise make the average with the speed behavior of the application until now */ if(arch == STARPU_CUDA_WORKER) sc_w->ref_speed[0] = (sc_w->ref_speed[0] > 0.1) ? ((sc_w->ref_speed[0] + speed ) / 2.0) : speed; else sc_w->ref_speed[1] = (sc_w->ref_speed[1] > 0.1) ? ((sc_w->ref_speed[1] + speed ) / 2.0) : speed; } return speed; } return -1.0; } /* compute an average value of the cpu/cuda old speed */ double sc_hypervisor_get_ref_speed_per_worker_type(struct sc_hypervisor_wrapper* sc_w, enum starpu_worker_archtype arch) { if(arch == STARPU_CUDA_WORKER && sc_w->ref_speed[0] > 0.0) return sc_w->ref_speed[0]; else if(arch == STARPU_CPU_WORKER && sc_w->ref_speed[1] > 0.0) return sc_w->ref_speed[1]; return -1.0; } /* returns the speed necessary for the linear programs (either the monitored one either a default value) */ double sc_hypervisor_get_speed(struct sc_hypervisor_wrapper *sc_w, enum starpu_worker_archtype arch) { /* monitored speed in the last frame */ double speed = sc_hypervisor_get_speed_per_worker_type(sc_w, arch); if(speed == -1.0) { /* avg value of the monitored speed over the entier current execution */ speed = sc_hypervisor_get_ref_speed_per_worker_type(sc_w, arch); } if(speed == -1.0) { /* a default value */ speed = arch == STARPU_CPU_WORKER ? SC_HYPERVISOR_DEFAULT_CPU_SPEED : SC_HYPERVISOR_DEFAULT_CUDA_SPEED; } return speed; } double sc_hypervisor_get_avg_speed(enum starpu_worker_archtype arch) { double total_executed_flops = 0.0; double total_estimated_flops = 0.0; struct sc_hypervisor_wrapper *sc_w; double max_real_start_time = 0.0; int s; unsigned nworkers = starpu_worker_get_count_by_type(arch); unsigned *sched_ctxs; int nsched_ctxs; sc_hypervisor_get_ctxs_on_level(&sched_ctxs, &nsched_ctxs, 0, STARPU_NMAX_SCHED_CTXS); for(s = 0; s < nsched_ctxs; s++) { sc_w = sc_hypervisor_get_wrapper(sched_ctxs[s]); struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctxs[s]); int worker; struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); enum starpu_worker_archtype req_arch = starpu_worker_get_type(worker); if(arch == req_arch) { total_executed_flops += sc_w->total_elapsed_flops[worker] / 1000000000.0; /*in gflops */; } } total_estimated_flops += sc_w->total_flops / 1000000000.0; /*in gflops */ if(max_real_start_time < sc_w->real_start_time) max_real_start_time = sc_w->real_start_time; } double speed = -1.0; #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("total_exec_flops %lf total_estimated_flops %lf max_real_start_time %lf nworkers %u \n", total_executed_flops, total_estimated_flops, max_real_start_time, nworkers); #endif if(total_executed_flops > 0.5*total_estimated_flops) { double curr_time = starpu_timing_now(); double time = (curr_time - max_real_start_time) / 1000000.0; /* in seconds */ #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("time = %lf\n", time); #endif speed = (total_executed_flops / time) / nworkers; } return speed; } void _consider_max_for_children(unsigned sched_ctx, unsigned consider_max) { struct sc_hypervisor_wrapper *sc_w = sc_hypervisor_get_wrapper(sched_ctx); sc_w->consider_max = consider_max; #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("ctx %u consider max %d \n", sched_ctx, sc_w->consider_max); #endif int level = starpu_sched_ctx_get_hierarchy_level(sched_ctx); unsigned *sched_ctxs_child; int nsched_ctxs_child = 0; sc_hypervisor_get_ctxs_on_level(&sched_ctxs_child, &nsched_ctxs_child, level+1, sched_ctx); int s; for(s = 0; s < nsched_ctxs_child; s++) _consider_max_for_children(sched_ctxs_child[s], consider_max); if(nsched_ctxs_child > 0) free(sched_ctxs_child); return; } void sc_hypervisor_check_if_consider_max(struct types_of_workers *tw) { unsigned *sched_ctxs; int nsched_ctxs; sc_hypervisor_get_ctxs_on_level(&sched_ctxs, &nsched_ctxs, 0, STARPU_NMAX_SCHED_CTXS); int nw = tw->nw; double avg_speed_per_tw[nw]; int w; for(w = 0; w < nw; w++) { avg_speed_per_tw[w] = sc_hypervisor_get_avg_speed(sc_hypervisor_get_arch_for_index(w, tw)); if(avg_speed_per_tw[w] == -1.0) { free(sched_ctxs); return; } } int s; for(s = 0; s < nsched_ctxs; s++) { for(w = 0; w < nw; w++) { struct sc_hypervisor_wrapper *sc_w = sc_hypervisor_get_wrapper(sched_ctxs[s]); double speed = sc_hypervisor_get_speed(sc_w, sc_hypervisor_get_arch_for_index(w, tw)); #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("%u: speed %lf avg_speed %lf min %lf max %lf\n", sched_ctxs[s], speed, avg_speed_per_tw[w], (avg_speed_per_tw[w]*0.5), (avg_speed_per_tw[w]*1.5)); #endif if(speed < avg_speed_per_tw[w]*0.5 || speed > avg_speed_per_tw[w]*1.5) _consider_max_for_children(sched_ctxs[s], 1); else _consider_max_for_children(sched_ctxs[s], 0); } } } starpu-1.2.3+dfsg/sc_hypervisor/src/policies_utils/task_pool.c000066400000000000000000000053261320135501600246300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "sc_hypervisor_policy.h" void sc_hypervisor_policy_add_task_to_pool(struct starpu_codelet *cl, unsigned sched_ctx, uint32_t footprint, struct sc_hypervisor_policy_task_pool **task_pools, size_t data_size) { struct sc_hypervisor_policy_task_pool *tp = NULL; for (tp = *task_pools; tp; tp = tp->next) { if (tp && tp->cl == cl && tp->footprint == footprint && tp->sched_ctx_id == sched_ctx) break; } if (!tp) { tp = (struct sc_hypervisor_policy_task_pool *) malloc(sizeof(struct sc_hypervisor_policy_task_pool)); tp->cl = cl; tp->footprint = footprint; tp->sched_ctx_id = sched_ctx; tp->n = 0; tp->next = *task_pools; tp->data_size = data_size; *task_pools = tp; } /* One more task of this kind */ tp->n++; } void sc_hypervisor_policy_remove_task_from_pool(struct starpu_task *task, uint32_t footprint, struct sc_hypervisor_policy_task_pool **task_pools) { /* count the tasks of the same type */ struct sc_hypervisor_policy_task_pool *tp = NULL; for (tp = *task_pools; tp; tp = tp->next) { if (tp && tp->cl == task->cl && tp->footprint == footprint && tp->sched_ctx_id == task->sched_ctx) break; } if (tp) { if(tp->n > 1) tp->n--; else { if(tp == *task_pools) { struct sc_hypervisor_policy_task_pool *next_tp = NULL; if((*task_pools)->next) next_tp = (*task_pools)->next; free(tp); tp = NULL; *task_pools = next_tp; } else { struct sc_hypervisor_policy_task_pool *prev_tp = NULL; for (prev_tp = *task_pools; prev_tp; prev_tp = prev_tp->next) { if (prev_tp->next == tp) prev_tp->next = tp->next; } free(tp); tp = NULL; } } } } struct sc_hypervisor_policy_task_pool* sc_hypervisor_policy_clone_task_pool(struct sc_hypervisor_policy_task_pool *tp) { if(tp == NULL) return NULL; struct sc_hypervisor_policy_task_pool *tmp_tp = (struct sc_hypervisor_policy_task_pool*)malloc(sizeof(struct sc_hypervisor_policy_task_pool)); memcpy(tmp_tp, tp, sizeof(struct sc_hypervisor_policy_task_pool)); tmp_tp->next = sc_hypervisor_policy_clone_task_pool(tp->next); return tmp_tp; } starpu-1.2.3+dfsg/sc_hypervisor/src/sc_config.c000066400000000000000000000154351320135501600215420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include static struct sc_hypervisor_policy_config* _create_config(void) { struct sc_hypervisor_policy_config *config = (struct sc_hypervisor_policy_config *)malloc(sizeof(struct sc_hypervisor_policy_config)); config->min_nworkers = -1; config->max_nworkers = -1; config->new_workers_max_idle = -1.0; config->ispeed_ctx_sample = 0.0; config->time_sample = 0.5; int i; for(i = 0; i < STARPU_NMAXWORKERS; i++) { config->granularity = -1; config->priority[i] = -1; config->fixed_workers[i] = -1; config->max_idle[i] = -1.0; config->min_working[i] = -1.0; config->ispeed_w_sample[i] = 0.0; } return config; } static void _update_config(struct sc_hypervisor_policy_config *old, struct sc_hypervisor_policy_config* new) { old->min_nworkers = new->min_nworkers != -1 ? new->min_nworkers : old->min_nworkers ; old->max_nworkers = new->max_nworkers != -1 ? new->max_nworkers : old->max_nworkers ; old->new_workers_max_idle = new->new_workers_max_idle != -1.0 ? new->new_workers_max_idle : old->new_workers_max_idle; old->granularity = new->granularity != -1 ? new->granularity : old->granularity; int i; for(i = 0; i < STARPU_NMAXWORKERS; i++) { old->priority[i] = new->priority[i] != -1 ? new->priority[i] : old->priority[i]; old->fixed_workers[i] = new->fixed_workers[i] != -1 ? new->fixed_workers[i] : old->fixed_workers[i]; old->max_idle[i] = new->max_idle[i] != -1.0 ? new->max_idle[i] : old->max_idle[i]; old->min_working[i] = new->min_working[i] != -1.0 ? new->min_working[i] : old->min_working[i]; } } void sc_hypervisor_set_config(unsigned sched_ctx, void *config) { if(hypervisor.sched_ctx_w[sched_ctx].config != NULL && config != NULL) { _update_config(hypervisor.sched_ctx_w[sched_ctx].config, config); } else { hypervisor.sched_ctx_w[sched_ctx].config = config; } return; } void _add_config(unsigned sched_ctx) { struct sc_hypervisor_policy_config *config = _create_config(); config->min_nworkers = 0; config->max_nworkers = starpu_worker_get_count(); config->new_workers_max_idle = MAX_IDLE_TIME; int i; for(i = 0; i < STARPU_NMAXWORKERS; i++) { config->granularity = 1; config->priority[i] = 0; config->fixed_workers[i] = 0; config->max_idle[i] = MAX_IDLE_TIME; config->min_working[i] = MIN_WORKING_TIME; } sc_hypervisor_set_config(sched_ctx, config); } void _remove_config(unsigned sched_ctx) { sc_hypervisor_set_config(sched_ctx, NULL); } struct sc_hypervisor_policy_config* sc_hypervisor_get_config(unsigned sched_ctx) { return hypervisor.sched_ctx_w[sched_ctx].config; } static struct sc_hypervisor_policy_config* _ctl(unsigned sched_ctx, va_list varg_list, unsigned later) { struct sc_hypervisor_policy_config *config = NULL; if(later) config = _create_config(); else config = sc_hypervisor_get_config(sched_ctx); assert(config != NULL); int arg_type; int i; int *workerids; int nworkers; while ((arg_type = va_arg(varg_list, int)) != SC_HYPERVISOR_NULL) { switch(arg_type) { case SC_HYPERVISOR_MAX_IDLE: workerids = va_arg(varg_list, int*); nworkers = va_arg(varg_list, int); double max_idle = va_arg(varg_list, double); for(i = 0; i < nworkers; i++) config->max_idle[workerids[i]] = max_idle; break; case SC_HYPERVISOR_MIN_WORKING: workerids = va_arg(varg_list, int*); nworkers = va_arg(varg_list, int); double min_working = va_arg(varg_list, double); for(i = 0; i < nworkers; i++) config->min_working[workerids[i]] = min_working; break; case SC_HYPERVISOR_PRIORITY: workerids = va_arg(varg_list, int*); nworkers = va_arg(varg_list, int); int priority = va_arg(varg_list, int); for(i = 0; i < nworkers; i++) config->priority[workerids[i]] = priority; break; case SC_HYPERVISOR_MIN_WORKERS: config->min_nworkers = va_arg(varg_list, unsigned); break; case SC_HYPERVISOR_MAX_WORKERS: config->max_nworkers = va_arg(varg_list, unsigned); break; case SC_HYPERVISOR_GRANULARITY: config->granularity = va_arg(varg_list, unsigned); break; case SC_HYPERVISOR_FIXED_WORKERS: workerids = va_arg(varg_list, int*); nworkers = va_arg(varg_list, int); for(i = 0; i < nworkers; i++) config->fixed_workers[workerids[i]] = 1; break; case SC_HYPERVISOR_NEW_WORKERS_MAX_IDLE: config->new_workers_max_idle = va_arg(varg_list, double); break; case SC_HYPERVISOR_ISPEED_W_SAMPLE: workerids = va_arg(varg_list, int*); nworkers = va_arg(varg_list, int); double sample = va_arg(varg_list, double); for(i = 0; i < nworkers; i++) config->ispeed_w_sample[workerids[i]] = sample; break; case SC_HYPERVISOR_ISPEED_CTX_SAMPLE: config->ispeed_ctx_sample = va_arg(varg_list, double); break; case SC_HYPERVISOR_TIME_SAMPLE: config->time_sample = va_arg(varg_list, double); break; /* not important for the strateg, needed just to jump these args in the iteration of the args */ case SC_HYPERVISOR_TIME_TO_APPLY: va_arg(varg_list, int); break; case SC_HYPERVISOR_MIN_TASKS: va_arg(varg_list, int); break; } } va_end(varg_list); return later ? config : NULL; } void sc_hypervisor_ctl(unsigned sched_ctx, ...) { va_list varg_list; va_start(varg_list, sched_ctx); int arg_type; int stop = 0; int task_tag = -1; while ((arg_type = va_arg(varg_list, int)) != SC_HYPERVISOR_NULL) { switch(arg_type) { case SC_HYPERVISOR_TIME_TO_APPLY: task_tag = va_arg(varg_list, int); stop = 1; break; case SC_HYPERVISOR_MIN_TASKS: hypervisor.min_tasks = va_arg(varg_list, int); hypervisor.check_min_tasks[sched_ctx] = 1; break; } if(stop) break; } va_end(varg_list); va_start(varg_list, sched_ctx); /* if config not null => save hypervisor configuration and consider it later */ struct sc_hypervisor_policy_config *config = _ctl(sched_ctx, varg_list, (task_tag > 0)); if(config != NULL) { struct configuration_entry *entry; entry = malloc(sizeof *entry); STARPU_ASSERT(entry != NULL); entry->task_tag = task_tag; entry->configuration = config; STARPU_PTHREAD_MUTEX_LOCK(&hypervisor.conf_mut[sched_ctx]); HASH_ADD_INT(hypervisor.configurations[sched_ctx], task_tag, entry); STARPU_PTHREAD_MUTEX_UNLOCK(&hypervisor.conf_mut[sched_ctx]); } return; } starpu-1.2.3+dfsg/sc_hypervisor/src/sc_hypervisor.c000066400000000000000000001601141320135501600225020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include double hyp_overhead = 0.0; unsigned imposed_resize = 0; unsigned type_of_tasks_known = 0; struct starpu_sched_ctx_performance_counters* perf_counters = NULL; static void notify_idle_cycle(unsigned sched_ctx, int worker, double idle_time); static void notify_pushed_task(unsigned sched_ctx, int worker); static void notify_post_exec_task(struct starpu_task *task, size_t data_size, uint32_t footprint, int hypervisor_tag, double flops); static void notify_poped_task(unsigned sched_ctx, int worker); static void notify_submitted_job(struct starpu_task *task, unsigned footprint, size_t data_size); static void notify_empty_ctx(unsigned sched_ctx, struct starpu_task *task); static void notify_delete_context(unsigned sched_ctx); extern struct sc_hypervisor_policy idle_policy; extern struct sc_hypervisor_policy app_driven_policy; extern struct sc_hypervisor_policy gflops_rate_policy; #ifdef STARPU_HAVE_GLPK_H extern struct sc_hypervisor_policy feft_lp_policy; extern struct sc_hypervisor_policy teft_lp_policy; extern struct sc_hypervisor_policy ispeed_lp_policy; extern struct sc_hypervisor_policy throughput_lp_policy; #endif // STARPU_HAVE_GLPK_ extern struct sc_hypervisor_policy ispeed_policy; extern struct sc_hypervisor_policy hard_coded_policy; static struct sc_hypervisor_policy *predefined_policies[] = { &idle_policy, &app_driven_policy, #ifdef STARPU_HAVE_GLPK_H &feft_lp_policy, &teft_lp_policy, &ispeed_lp_policy, &throughput_lp_policy, #endif // STARPU_HAVE_GLPK_H &gflops_rate_policy, &ispeed_policy, &hard_coded_policy }; static void _load_hypervisor_policy(struct sc_hypervisor_policy *policy) { STARPU_ASSERT(policy); hypervisor.policy.name = policy->name; hypervisor.policy.size_ctxs = policy->size_ctxs; hypervisor.policy.resize_ctxs = policy->resize_ctxs; hypervisor.policy.handle_poped_task = policy->handle_poped_task; hypervisor.policy.handle_pushed_task = policy->handle_pushed_task; hypervisor.policy.handle_idle_cycle = policy->handle_idle_cycle; hypervisor.policy.handle_idle_end = policy->handle_idle_end; hypervisor.policy.handle_post_exec_hook = policy->handle_post_exec_hook; hypervisor.policy.handle_submitted_job = policy->handle_submitted_job; hypervisor.policy.end_ctx = policy->end_ctx; } static struct sc_hypervisor_policy *_find_hypervisor_policy_from_name(const char *policy_name) { if (!policy_name) return NULL; unsigned i; for (i = 0; i < sizeof(predefined_policies)/sizeof(predefined_policies[0]); i++) { struct sc_hypervisor_policy *p; p = predefined_policies[i]; if (p->name) { if (strcmp(policy_name, p->name) == 0) { /* we found a policy with the requested name */ return p; } } } fprintf(stderr, "Warning: hypervisor policy \"%s\" was not found, try \"help\" to get a list\n", policy_name); /* nothing was found */ return NULL; } static void display_sched_help_message(void) { const char* policy_name = getenv("SC_HYPERVISOR_POLICY"); if (policy_name && (strcmp(policy_name, "help") == 0)) { fprintf(stderr, "SC_HYPERVISOR_POLICY can be either of\n"); /* display the description of all predefined policies */ unsigned i; for (i = 0; i < sizeof(predefined_policies)/sizeof(predefined_policies[0]); i++) { struct sc_hypervisor_policy *p = predefined_policies[i]; if (p->name) { fprintf(stderr, "%s\n", p->name); } } } } static struct sc_hypervisor_policy *_select_hypervisor_policy(struct sc_hypervisor_policy* hypervisor_policy) { struct sc_hypervisor_policy *selected_policy = NULL; if(hypervisor_policy && hypervisor_policy->custom) return hypervisor_policy; /* we look if the application specified the name of a policy to load */ const char *policy_name; if (hypervisor_policy && hypervisor_policy->name) { policy_name = hypervisor_policy->name; } else { policy_name = getenv("SC_HYPERVISOR_POLICY"); } if (policy_name) selected_policy = _find_hypervisor_policy_from_name(policy_name); /* Perhaps there was no policy that matched the name */ if (selected_policy) return selected_policy; /* If no policy was specified, we use the idle policy as a default */ return &idle_policy; } /* initializez the performance counters that starpu will use to retrive hints for resizing */ void* sc_hypervisor_init(struct sc_hypervisor_policy *hypervisor_policy) { /* Perhaps we have to display some help */ display_sched_help_message(); hypervisor.min_tasks = 0; hypervisor.nsched_ctxs = 0; char* vel_gap = getenv("SC_HYPERVISOR_MAX_SPEED_GAP"); hypervisor.max_speed_gap = vel_gap ? atof(vel_gap) : SC_SPEED_MAX_GAP_DEFAULT; char* crit = getenv("SC_HYPERVISOR_TRIGGER_RESIZE"); hypervisor.resize_criteria = !crit ? SC_IDLE : strcmp(crit,"idle") == 0 ? SC_IDLE : (strcmp(crit,"speed") == 0 ? SC_SPEED : SC_NOTHING); STARPU_PTHREAD_MUTEX_INIT(&act_hypervisor_mutex, NULL); // hypervisor.start_executing_time = starpu_timing_now(); int i; for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++) { hypervisor.resize[i] = 0; hypervisor.allow_remove[i] = 1; hypervisor.configurations[i] = NULL; hypervisor.sr = NULL; hypervisor.check_min_tasks[i] = 1; hypervisor.sched_ctxs[i] = STARPU_NMAX_SCHED_CTXS; hypervisor.sched_ctx_w[i].sched_ctx = STARPU_NMAX_SCHED_CTXS; hypervisor.sched_ctx_w[i].config = NULL; hypervisor.sched_ctx_w[i].total_flops = 0.0; hypervisor.sched_ctx_w[i].submitted_flops = 0.0; hypervisor.sched_ctx_w[i].remaining_flops = 0.0; hypervisor.sched_ctx_w[i].start_time = 0.0; hypervisor.sched_ctx_w[i].real_start_time = 0.0; hypervisor.sched_ctx_w[i].hyp_react_start_time = 0.0; hypervisor.sched_ctx_w[i].resize_ack.receiver_sched_ctx = -1; hypervisor.sched_ctx_w[i].resize_ack.moved_workers = NULL; hypervisor.sched_ctx_w[i].resize_ack.nmoved_workers = 0; hypervisor.sched_ctx_w[i].resize_ack.acked_workers = NULL; STARPU_PTHREAD_MUTEX_INIT(&hypervisor.sched_ctx_w[i].mutex, NULL); hypervisor.optimal_v[i] = 0.0; hypervisor.sched_ctx_w[i].ref_speed[0] = -1.0; hypervisor.sched_ctx_w[i].ref_speed[1] = -1.0; hypervisor.sched_ctx_w[i].total_flops_available = 0; hypervisor.sched_ctx_w[i].to_be_sized = 0; hypervisor.sched_ctx_w[i].consider_max = 0; int j; for(j = 0; j < STARPU_NMAXWORKERS; j++) { hypervisor.sched_ctx_w[i].start_time_w[i] = 0.0; hypervisor.sched_ctx_w[i].current_idle_time[j] = 0.0; hypervisor.sched_ctx_w[i].idle_time[j] = 0.0; hypervisor.sched_ctx_w[i].idle_start_time[j] = 0.0; hypervisor.sched_ctx_w[i].exec_time[j] = 0.0; hypervisor.sched_ctx_w[i].exec_start_time[j] = 0.0; hypervisor.sched_ctx_w[i].pushed_tasks[j] = 0; hypervisor.sched_ctx_w[i].poped_tasks[j] = 0; hypervisor.sched_ctx_w[i].elapsed_flops[j] = 0.0; hypervisor.sched_ctx_w[i].elapsed_data[j] = 0; hypervisor.sched_ctx_w[i].elapsed_tasks[j] = 0; hypervisor.sched_ctx_w[i].total_elapsed_flops[j] = 0.0; hypervisor.sched_ctx_w[i].worker_to_be_removed[j] = 0; hypervisor.sched_ctx_w[i].compute_idle[j] = 1; hypervisor.sched_ctx_w[i].compute_partial_idle[j] = 0; } } struct sc_hypervisor_policy *selected_hypervisor_policy = _select_hypervisor_policy(hypervisor_policy); _load_hypervisor_policy(selected_hypervisor_policy); perf_counters = (struct starpu_sched_ctx_performance_counters*)malloc(sizeof(struct starpu_sched_ctx_performance_counters)); perf_counters->notify_idle_cycle = notify_idle_cycle; perf_counters->notify_pushed_task = notify_pushed_task; perf_counters->notify_poped_task = notify_poped_task; perf_counters->notify_post_exec_task = notify_post_exec_task; perf_counters->notify_submitted_job = notify_submitted_job; perf_counters->notify_empty_ctx = notify_empty_ctx; perf_counters->notify_delete_context = notify_delete_context; starpu_sched_ctx_notify_hypervisor_exists(); return (void*)perf_counters; } const char* sc_hypervisor_get_policy() { return hypervisor.policy.name; } /* the user can forbid the resizing process*/ void sc_hypervisor_stop_resize(unsigned sched_ctx) { imposed_resize = 1; hypervisor.resize[sched_ctx] = 0; } /* the user can restart the resizing process*/ void sc_hypervisor_start_resize(unsigned sched_ctx) { imposed_resize = 1; hypervisor.resize[sched_ctx] = 1; } static void _print_current_time() { char* stop_print = getenv("SC_HYPERVISOR_STOP_PRINT"); int sp = stop_print ? atoi(stop_print) : 1; if(!sp) { if(hypervisor.start_executing_time == 0.0) { fprintf(stdout, "Time: %lf\n", -1.0); return; } double curr_time = starpu_timing_now(); double elapsed_time = (curr_time - hypervisor.start_executing_time) / 1000000.0; /* in seconds */ fprintf(stdout, "Time: %lf\n", elapsed_time); int i; for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++) { if(hypervisor.sched_ctxs[i] != STARPU_NMAX_SCHED_CTXS) { struct sc_hypervisor_wrapper *sc_w = &hypervisor.sched_ctx_w[hypervisor.sched_ctxs[i]]; double cpu_speed = sc_hypervisor_get_speed(sc_w, STARPU_CPU_WORKER); double cuda_speed = sc_hypervisor_get_speed(sc_w, STARPU_CUDA_WORKER); int ncpus = sc_hypervisor_get_nworkers_ctx(sc_w->sched_ctx, STARPU_CPU_WORKER); int ncuda = sc_hypervisor_get_nworkers_ctx(sc_w->sched_ctx, STARPU_CUDA_WORKER); fprintf(stdout, "%d: cpu_v = %lf cuda_v = %lf ncpus = %d ncuda = %d\n", hypervisor.sched_ctxs[i], cpu_speed, cuda_speed, ncpus, ncuda); } } } return; } void sc_hypervisor_shutdown(void) { int i; for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++) { if(hypervisor.sched_ctxs[i] != STARPU_NMAX_SCHED_CTXS && hypervisor.nsched_ctxs > 0) { sc_hypervisor_stop_resize(hypervisor.sched_ctxs[i]); sc_hypervisor_unregister_ctx(hypervisor.sched_ctxs[i]); STARPU_PTHREAD_MUTEX_DESTROY(&hypervisor.sched_ctx_w[i].mutex); } } perf_counters->notify_idle_cycle = NULL; perf_counters->notify_pushed_task = NULL; perf_counters->notify_poped_task = NULL; perf_counters->notify_post_exec_task = NULL; perf_counters->notify_delete_context = NULL; free(perf_counters); perf_counters = NULL; STARPU_PTHREAD_MUTEX_DESTROY(&act_hypervisor_mutex); } void sc_hypervisor_print_overhead() { // hyp_overhead /= 1000000.0;* FILE *f; const char *sched_env = getenv("OVERHEAD_FILE"); if(!sched_env) f = fopen("overhead_microsec", "a"); else f = fopen(sched_env, "a"); fprintf(f, "%lf \n", hyp_overhead); fclose(f); } /* the hypervisor is in charge only of the contexts registered to it*/ void sc_hypervisor_register_ctx(unsigned sched_ctx, double total_flops) { STARPU_PTHREAD_MUTEX_LOCK(&act_hypervisor_mutex); hypervisor.configurations[sched_ctx] = NULL; hypervisor.resize_requests[sched_ctx] = NULL; STARPU_PTHREAD_MUTEX_INIT(&hypervisor.conf_mut[sched_ctx], NULL); STARPU_PTHREAD_MUTEX_INIT(&hypervisor.resize_mut[sched_ctx], NULL); _add_config(sched_ctx); hypervisor.sched_ctx_w[sched_ctx].sched_ctx = sched_ctx; hypervisor.sched_ctxs[hypervisor.nsched_ctxs++] = sched_ctx; hypervisor.sched_ctx_w[sched_ctx].total_flops = total_flops; hypervisor.sched_ctx_w[sched_ctx].remaining_flops = total_flops; hypervisor.resize[sched_ctx] = 0;//1; STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); } static int _get_first_free_sched_ctx(unsigned *sched_ctxs, int nsched_ctxs) { int i; for(i = 0; i < nsched_ctxs; i++) if(sched_ctxs[i] == STARPU_NMAX_SCHED_CTXS) return i; return STARPU_NMAX_SCHED_CTXS; } /* rearange array of sched_ctxs in order not to have {MAXVAL, MAXVAL, 5, MAXVAL, 7} and have instead {5, 7, MAXVAL, MAXVAL, MAXVAL} it is easier afterwards to iterate the array */ static void _rearange_sched_ctxs(unsigned *sched_ctxs, int old_nsched_ctxs) { int first_free_id = STARPU_NMAX_SCHED_CTXS; int i; for(i = 0; i < old_nsched_ctxs; i++) { if(sched_ctxs[i] != STARPU_NMAX_SCHED_CTXS) { first_free_id = _get_first_free_sched_ctx(sched_ctxs, old_nsched_ctxs); if(first_free_id != STARPU_NMAX_SCHED_CTXS) { sched_ctxs[first_free_id] = sched_ctxs[i]; sched_ctxs[i] = STARPU_NMAX_SCHED_CTXS; } } } } /* unregistered contexts will no longer be resized */ void sc_hypervisor_unregister_ctx(unsigned sched_ctx) { #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("unregister ctx %d with remaining flops %lf \n", hypervisor.sched_ctx_w[sched_ctx].sched_ctx, hypervisor.sched_ctx_w[sched_ctx].remaining_flops); #endif if(hypervisor.policy.end_ctx) hypervisor.policy.end_ctx(sched_ctx); STARPU_PTHREAD_MUTEX_LOCK(&act_hypervisor_mutex); unsigned father = starpu_sched_ctx_get_inheritor(sched_ctx); int *pus; unsigned npus = starpu_sched_ctx_get_workers_list(sched_ctx, &pus); if(npus) { starpu_sched_ctx_set_priority(pus, npus, father, 1); starpu_sched_ctx_set_priority_on_level(pus, npus, father, 1); free(pus); } unsigned i; for(i = 0; i < hypervisor.nsched_ctxs; i++) { if(hypervisor.sched_ctxs[i] == sched_ctx) { hypervisor.sched_ctxs[i] = STARPU_NMAX_SCHED_CTXS; break; } } _rearange_sched_ctxs(hypervisor.sched_ctxs, hypervisor.nsched_ctxs); hypervisor.nsched_ctxs--; hypervisor.sched_ctx_w[sched_ctx].sched_ctx = STARPU_NMAX_SCHED_CTXS; _remove_config(sched_ctx); STARPU_PTHREAD_MUTEX_DESTROY(&hypervisor.conf_mut[sched_ctx]); STARPU_PTHREAD_MUTEX_DESTROY(&hypervisor.resize_mut[sched_ctx]); if(hypervisor.nsched_ctxs == 1) sc_hypervisor_stop_resize(hypervisor.sched_ctxs[0]); STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); } void sc_hypervisor_reset_react_start_time(unsigned sched_ctx, unsigned now) { if(now) hypervisor.sched_ctx_w[sched_ctx].hyp_react_start_time = starpu_timing_now(); starpu_sched_ctx_update_start_resizing_sample(sched_ctx, starpu_timing_now()); } double _get_max_speed_gap() { return hypervisor.max_speed_gap; } unsigned sc_hypervisor_get_resize_criteria() { return hypervisor.resize_criteria; } static int get_ntasks( int *tasks) { int ntasks = 0; int j; for(j = 0; j < STARPU_NMAXWORKERS; j++) { ntasks += tasks[j]; } return ntasks; } int sc_hypervisor_get_nworkers_ctx(unsigned sched_ctx, enum starpu_worker_archtype arch) { int nworkers_ctx = 0; struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx); int worker; struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); enum starpu_worker_archtype curr_arch = starpu_worker_get_type(worker); if(curr_arch == arch || arch == STARPU_ANY_WORKER) nworkers_ctx++; } return nworkers_ctx; } static void _set_elapsed_flops_per_sched_ctx(unsigned sched_ctx, double val) { int i; for(i = 0; i < STARPU_NMAXWORKERS; i++) { hypervisor.sched_ctx_w[sched_ctx].elapsed_flops[i] = val; if(val == 0) { hypervisor.sched_ctx_w[sched_ctx].elapsed_data[i] = 0; hypervisor.sched_ctx_w[sched_ctx].elapsed_tasks[i] = 0; } } } double sc_hypervisor_get_elapsed_flops_per_sched_ctx(struct sc_hypervisor_wrapper* sc_w) { double ret_val = 0.0; struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sc_w->sched_ctx); int worker; struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); ret_val += sc_w->elapsed_flops[worker]; } return ret_val; } double sc_hypervisor_get_total_elapsed_flops_per_sched_ctx(struct sc_hypervisor_wrapper* sc_w) { double ret_val = 0.0; struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sc_w->sched_ctx); int worker; struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); ret_val += sc_w->total_elapsed_flops[worker]; } return ret_val; } double sc_hypervisor_get_nready_flops_of_all_sons_of_sched_ctx(unsigned sched_ctx) { double ready_flops = starpu_sched_ctx_get_nready_flops(sched_ctx); unsigned *sched_ctxs; int nsched_ctxs = 0; sc_hypervisor_get_ctxs_on_level(&sched_ctxs, &nsched_ctxs, starpu_sched_ctx_get_hierarchy_level(sched_ctx), sched_ctx); int s; for(s = 0; s < nsched_ctxs; s++) ready_flops += sc_hypervisor_get_nready_flops_of_all_sons_of_sched_ctx(sched_ctxs[s]); //ready_flops += starpu_get_nready_flops_of_sched_ctx(sched_ctxs[s]); free(sched_ctxs); return ready_flops; } static void _decrement_elapsed_flops_per_worker(unsigned sched_ctx, int worker, double flops) { if(starpu_sched_ctx_get_hierarchy_level(sched_ctx) > 0) { unsigned father = starpu_sched_ctx_get_inheritor(sched_ctx); hypervisor.sched_ctx_w[father].elapsed_flops[worker] -= flops; _decrement_elapsed_flops_per_worker(father, worker, flops); } return; } void _reset_resize_sample_info(unsigned sender_sched_ctx, unsigned receiver_sched_ctx) { double start_time = starpu_timing_now(); if(sender_sched_ctx != STARPU_NMAX_SCHED_CTXS) { /* info concerning only the gflops_rate strateg */ struct sc_hypervisor_wrapper *sender_sc_w = &hypervisor.sched_ctx_w[sender_sched_ctx]; sender_sc_w->start_time = start_time; unsigned nworkers = starpu_worker_get_count(); int i; for(i = 0; i < nworkers; i++) { sender_sc_w->start_time_w[i] = start_time; sender_sc_w->idle_time[i] = 0.0; sender_sc_w->idle_start_time[i] = 0.0; hypervisor.sched_ctx_w[sender_sched_ctx].exec_time[i] = 0.0; // hypervisor.sched_ctx_w[sender_sched_ctx].exec_start_time[i] = (hypervisor.sched_ctx_w[sender_sched_ctx].exec_start_time[i] != 0.0) ? starpu_timing_now() : 0.0; _decrement_elapsed_flops_per_worker(sender_sched_ctx, i, hypervisor.sched_ctx_w[sender_sched_ctx].elapsed_flops[i]); } _set_elapsed_flops_per_sched_ctx(sender_sched_ctx, 0.0); } if(receiver_sched_ctx != STARPU_NMAX_SCHED_CTXS) { struct sc_hypervisor_wrapper *receiver_sc_w = &hypervisor.sched_ctx_w[receiver_sched_ctx]; receiver_sc_w->start_time = start_time; unsigned nworkers = starpu_worker_get_count(); int i; for(i = 0; i < nworkers; i++) { receiver_sc_w->start_time_w[i] = (receiver_sc_w->start_time_w[i] != 0.0) ? starpu_timing_now() : 0.0; receiver_sc_w->idle_time[i] = 0.0; receiver_sc_w->idle_start_time[i] = (receiver_sc_w->exec_start_time[i] != 0.0) ? 0.0 : starpu_timing_now(); // hypervisor.sched_ctx_w[receiver_sched_ctx].exec_start_time[i] = (receiver_sc_w->exec_start_time[i] != 0.0) ? starpu_timing_now() : 0.0; hypervisor.sched_ctx_w[receiver_sched_ctx].exec_time[i] = 0.0; _decrement_elapsed_flops_per_worker(receiver_sched_ctx, i, hypervisor.sched_ctx_w[receiver_sched_ctx].elapsed_flops[i]); } _set_elapsed_flops_per_sched_ctx(receiver_sched_ctx, 0.0); } return; } /* actually move the workers: the cpus are moved, gpus are only shared */ /* forbids another resize request before this one is take into account */ void sc_hypervisor_move_workers(unsigned sender_sched_ctx, unsigned receiver_sched_ctx, int* workers_to_move, unsigned nworkers_to_move, unsigned now) { if(nworkers_to_move > 0 && hypervisor.resize[sender_sched_ctx]) { _print_current_time(); unsigned j; #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("resize ctx %u with %u workers", sender_sched_ctx, nworkers_to_move); for(j = 0; j < nworkers_to_move; j++) printf(" %d", workers_to_move[j]); printf("\n"); #endif hypervisor.allow_remove[receiver_sched_ctx] = 0; starpu_sched_ctx_add_workers(workers_to_move, nworkers_to_move, receiver_sched_ctx); if(now) { unsigned j; #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("remove now from ctx %u:", sender_sched_ctx); for(j = 0; j < nworkers_to_move; j++) printf(" %d", workers_to_move[j]); printf("\n"); #endif starpu_sched_ctx_remove_workers(workers_to_move, nworkers_to_move, sender_sched_ctx); hypervisor.allow_remove[receiver_sched_ctx] = 1; _reset_resize_sample_info(sender_sched_ctx, receiver_sched_ctx); } else { int ret = starpu_pthread_mutex_trylock(&hypervisor.sched_ctx_w[sender_sched_ctx].mutex); if(ret != EBUSY) { hypervisor.sched_ctx_w[sender_sched_ctx].resize_ack.receiver_sched_ctx = receiver_sched_ctx; hypervisor.sched_ctx_w[sender_sched_ctx].resize_ack.moved_workers = (int*)malloc(nworkers_to_move * sizeof(int)); hypervisor.sched_ctx_w[sender_sched_ctx].resize_ack.nmoved_workers = nworkers_to_move; hypervisor.sched_ctx_w[sender_sched_ctx].resize_ack.acked_workers = (int*)malloc(nworkers_to_move * sizeof(int)); unsigned i; for(i = 0; i < nworkers_to_move; i++) { hypervisor.sched_ctx_w[sender_sched_ctx].current_idle_time[workers_to_move[i]] = 0.0; hypervisor.sched_ctx_w[sender_sched_ctx].resize_ack.moved_workers[i] = workers_to_move[i]; hypervisor.sched_ctx_w[sender_sched_ctx].resize_ack.acked_workers[i] = 0; } hypervisor.resize[sender_sched_ctx] = 0; if(imposed_resize) imposed_resize = 0; STARPU_PTHREAD_MUTEX_UNLOCK(&hypervisor.sched_ctx_w[sender_sched_ctx].mutex); } } struct sc_hypervisor_policy_config *new_config = sc_hypervisor_get_config(receiver_sched_ctx); unsigned i; for(i = 0; i < nworkers_to_move; i++) new_config->max_idle[workers_to_move[i]] = new_config->max_idle[workers_to_move[i]] !=MAX_IDLE_TIME ? new_config->max_idle[workers_to_move[i]] : new_config->new_workers_max_idle; } return; } void sc_hypervisor_add_workers_to_sched_ctx(int* workers_to_add, unsigned nworkers_to_add, unsigned sched_ctx) { if(nworkers_to_add > 0 && hypervisor.resize[sched_ctx]) { _print_current_time(); unsigned j; #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("add to ctx %u:", sched_ctx); for(j = 0; j < nworkers_to_add; j++) printf(" %d", workers_to_add[j]); printf("\n"); #endif starpu_sched_ctx_add_workers(workers_to_add, nworkers_to_add, sched_ctx); struct sc_hypervisor_policy_config *new_config = sc_hypervisor_get_config(sched_ctx); unsigned i; for(i = 0; i < nworkers_to_add; i++) new_config->max_idle[workers_to_add[i]] = new_config->max_idle[workers_to_add[i]] != MAX_IDLE_TIME ? new_config->max_idle[workers_to_add[i]] : new_config->new_workers_max_idle; _reset_resize_sample_info(STARPU_NMAX_SCHED_CTXS, sched_ctx); } return; } unsigned sc_hypervisor_can_resize(unsigned sched_ctx) { return hypervisor.resize[sched_ctx]; } void sc_hypervisor_remove_workers_from_sched_ctx(int* workers_to_remove, unsigned nworkers_to_remove, unsigned sched_ctx, unsigned now) { if(nworkers_to_remove > 0 && hypervisor.resize[sched_ctx] && hypervisor.allow_remove[sched_ctx]) { _print_current_time(); unsigned nworkers = 0; int workers[nworkers_to_remove]; if(now) { unsigned j; #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("remove explicitley now from ctx %u:", sched_ctx); for(j = 0; j < nworkers_to_remove; j++) printf(" %d", workers_to_remove[j]); printf("\n"); #endif starpu_sched_ctx_remove_workers(workers_to_remove, nworkers_to_remove, sched_ctx); _reset_resize_sample_info(sched_ctx, STARPU_NMAX_SCHED_CTXS); } else { #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("try to remove from ctx %u: ", sched_ctx); unsigned j; for(j = 0; j < nworkers_to_remove; j++) printf(" %d", workers_to_remove[j]); printf("\n"); #endif int ret = starpu_pthread_mutex_trylock(&hypervisor.sched_ctx_w[sched_ctx].mutex); if(ret != EBUSY) { unsigned i; for(i = 0; i < nworkers_to_remove; i++) if(starpu_sched_ctx_contains_worker(workers_to_remove[i], sched_ctx)) workers[nworkers++] = workers_to_remove[i]; hypervisor.sched_ctx_w[sched_ctx].resize_ack.receiver_sched_ctx = -1; hypervisor.sched_ctx_w[sched_ctx].resize_ack.moved_workers = (int*)malloc(nworkers_to_remove * sizeof(int)); hypervisor.sched_ctx_w[sched_ctx].resize_ack.nmoved_workers = (int)nworkers; hypervisor.sched_ctx_w[sched_ctx].resize_ack.acked_workers = (int*)malloc(nworkers_to_remove * sizeof(int)); for(i = 0; i < nworkers; i++) { hypervisor.sched_ctx_w[sched_ctx].current_idle_time[workers[i]] = 0.0; hypervisor.sched_ctx_w[sched_ctx].resize_ack.moved_workers[i] = workers[i]; hypervisor.sched_ctx_w[sched_ctx].resize_ack.acked_workers[i] = 0; } hypervisor.resize[sched_ctx] = 0; if(imposed_resize) imposed_resize = 0; STARPU_PTHREAD_MUTEX_UNLOCK(&hypervisor.sched_ctx_w[sched_ctx].mutex); } } } return; } static unsigned _ack_resize_completed(unsigned sched_ctx, int worker) { if(worker != -1 && !starpu_sched_ctx_contains_worker(worker, sched_ctx)) return 0; struct sc_hypervisor_resize_ack *resize_ack = NULL; unsigned sender_sched_ctx = STARPU_NMAX_SCHED_CTXS; int i; for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++) { if(hypervisor.sched_ctxs[i] != STARPU_NMAX_SCHED_CTXS) { struct sc_hypervisor_wrapper *sc_w = &hypervisor.sched_ctx_w[hypervisor.sched_ctxs[i]]; STARPU_PTHREAD_MUTEX_LOCK(&sc_w->mutex); unsigned only_remove = 0; if(sc_w->resize_ack.receiver_sched_ctx == -1 && hypervisor.sched_ctxs[i] != sched_ctx && sc_w->resize_ack.nmoved_workers > 0 && starpu_sched_ctx_contains_worker(worker, hypervisor.sched_ctxs[i])) { int j; for(j = 0; j < sc_w->resize_ack.nmoved_workers; j++) if(sc_w->resize_ack.moved_workers[j] == worker) { only_remove = 1; _reset_resize_sample_info(sched_ctx, STARPU_NMAX_SCHED_CTXS); break; } } if(only_remove || (sc_w->resize_ack.receiver_sched_ctx != -1 && sc_w->resize_ack.receiver_sched_ctx == (int)sched_ctx)) { resize_ack = &sc_w->resize_ack; sender_sched_ctx = hypervisor.sched_ctxs[i]; STARPU_PTHREAD_MUTEX_UNLOCK(&sc_w->mutex); break; } STARPU_PTHREAD_MUTEX_UNLOCK(&sc_w->mutex); } } /* if there is no ctx waiting for its ack return 1*/ if(resize_ack == NULL) { return 1; } int ret = starpu_pthread_mutex_trylock(&hypervisor.sched_ctx_w[sender_sched_ctx].mutex); if(ret != EBUSY) { int *moved_workers = resize_ack->moved_workers; int nmoved_workers = resize_ack->nmoved_workers; int *acked_workers = resize_ack->acked_workers; if(worker != -1) { for(i = 0; i < nmoved_workers; i++) { int moved_worker = moved_workers[i]; if(moved_worker == worker && acked_workers[i] == 0) { acked_workers[i] = 1; } } } int nacked_workers = 0; for(i = 0; i < nmoved_workers; i++) { nacked_workers += (acked_workers[i] == 1); } unsigned resize_completed = (nacked_workers == nmoved_workers); int receiver_sched_ctx = sched_ctx; if(resize_completed) { /* if the permission to resize is not allowed by the user don't do it whatever the application says */ if(!((hypervisor.resize[sender_sched_ctx] == 0 || hypervisor.resize[receiver_sched_ctx] == 0) && imposed_resize)) { /* int j; */ /* printf("remove after ack from ctx %d:", sender_sched_ctx); */ /* for(j = 0; j < nmoved_workers; j++) */ /* printf(" %d", moved_workers[j]); */ /* printf("\n"); */ starpu_sched_ctx_remove_workers(moved_workers, nmoved_workers, sender_sched_ctx); _reset_resize_sample_info(sender_sched_ctx, receiver_sched_ctx); hypervisor.resize[sender_sched_ctx] = 1; hypervisor.allow_remove[receiver_sched_ctx] = 1; /* if the user allowed resizing leave the decisions to the application */ if(imposed_resize) imposed_resize = 0; resize_ack->receiver_sched_ctx = -1; resize_ack->nmoved_workers = 0; free(resize_ack->moved_workers); free(resize_ack->acked_workers); } STARPU_PTHREAD_MUTEX_UNLOCK(&hypervisor.sched_ctx_w[sender_sched_ctx].mutex); return resize_completed; } STARPU_PTHREAD_MUTEX_UNLOCK(&hypervisor.sched_ctx_w[sender_sched_ctx].mutex); } return 0; } /* Enqueue a resize request for 'sched_ctx', to be executed when the * 'task_tag' tasks of 'sched_ctx' complete. */ void sc_hypervisor_post_resize_request(unsigned sched_ctx, int task_tag) { struct resize_request_entry *entry; entry = malloc(sizeof *entry); STARPU_ASSERT(entry != NULL); entry->sched_ctx = sched_ctx; entry->task_tag = task_tag; STARPU_PTHREAD_MUTEX_LOCK(&hypervisor.resize_mut[sched_ctx]); HASH_ADD_INT(hypervisor.resize_requests[sched_ctx], task_tag, entry); STARPU_PTHREAD_MUTEX_UNLOCK(&hypervisor.resize_mut[sched_ctx]); } void sc_hypervisor_resize_ctxs(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers) { if(hypervisor.policy.resize_ctxs) hypervisor.policy.resize_ctxs(sched_ctxs, nsched_ctxs, workers, nworkers); } void _sc_hypervisor_allow_compute_idle(unsigned sched_ctx, int worker, unsigned allow) { hypervisor.sched_ctx_w[sched_ctx].compute_idle[worker] = allow; } int _update_max_hierarchically(unsigned *sched_ctxs, int nsched_ctxs) { int s, i; unsigned leaves[hypervisor.nsched_ctxs]; int nleaves = 0; sc_hypervisor_get_leaves(hypervisor.sched_ctxs, hypervisor.nsched_ctxs, leaves, &nleaves); int max = 0; for(s = 0; s < nsched_ctxs; s++) { struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(sched_ctxs[s]); unsigned found = 0; int l = 0; for(l = 0; l < nleaves; l++) { if(leaves[l] == sched_ctxs[s]) { found = 1; break; } } if(!found) { config->max_nworkers = 0; int level = starpu_sched_ctx_get_hierarchy_level(sched_ctxs[s]); unsigned *sched_ctxs_child; int nsched_ctxs_child = 0; sc_hypervisor_get_ctxs_on_level(&sched_ctxs_child, &nsched_ctxs_child, level+1, sched_ctxs[s]); if(nsched_ctxs_child > 0) { config->max_nworkers += _update_max_hierarchically(sched_ctxs_child, nsched_ctxs_child); free(sched_ctxs_child); int max_possible_workers = starpu_worker_get_count(); if(config->max_nworkers < 0) config->max_nworkers = 0; if(config->max_nworkers > max_possible_workers) config->max_nworkers = max_possible_workers; } #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("ctx %u has max %d \n", sched_ctxs[s], config->max_nworkers); #endif } max += config->max_nworkers; } return max; } void _update_max_diff_hierarchically(unsigned father, double diff) { int level = starpu_sched_ctx_get_hierarchy_level(father); unsigned *sched_ctxs_child; int nsched_ctxs_child = 0; sc_hypervisor_get_ctxs_on_level(&sched_ctxs_child, &nsched_ctxs_child, level+1, father); if(nsched_ctxs_child > 0) { int s; double total_nflops = 0.0; for(s = 0; s < nsched_ctxs_child; s++) { total_nflops += hypervisor.sched_ctx_w[sched_ctxs_child[s]].remaining_flops < 0.0 ? 0.0 : hypervisor.sched_ctx_w[sched_ctxs_child[s]].remaining_flops; } int accumulated_diff = 0; for(s = 0; s < nsched_ctxs_child; s++) { struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(sched_ctxs_child[s]); double remaining_flops = hypervisor.sched_ctx_w[sched_ctxs_child[s]].remaining_flops < 0.0 ? 0.0 : hypervisor.sched_ctx_w[sched_ctxs_child[s]].remaining_flops; int current_diff = total_nflops == 0.0 ? 0.0 : floor((remaining_flops / total_nflops) * diff); accumulated_diff += current_diff; if(s == (nsched_ctxs_child - 1) && accumulated_diff < diff) current_diff += (diff - accumulated_diff); config->max_nworkers += current_diff; #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("%u: redib max_nworkers incr %d diff = %d \n", sched_ctxs_child[s], config->max_nworkers, current_diff); #endif _update_max_diff_hierarchically(sched_ctxs_child[s], current_diff); } free(sched_ctxs_child); } return; } void sc_hypervisor_update_resize_interval(unsigned *sched_ctxs, int nsched_ctxs, int max_workers) { unsigned leaves[hypervisor.nsched_ctxs]; unsigned nleaves = 0; sc_hypervisor_get_leaves(hypervisor.sched_ctxs, hypervisor.nsched_ctxs, leaves, &nleaves); int l; unsigned sched_ctx; int total_max_nworkers = 0; // int max_cpus = starpu_cpu_worker_get_count(); unsigned configured = 0; int i; for(i = 0; i < nsched_ctxs; i++) { unsigned found = 0; for(l = 0; l < nleaves; l++) { if(leaves[l] == sched_ctxs[i]) { found = 1; break; } } if(!found) continue; sched_ctx = sched_ctxs[i]; if(hypervisor.sched_ctx_w[sched_ctx].to_be_sized) continue; struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(sched_ctx); struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx); int worker; struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); double elapsed_time_worker[STARPU_NMAXWORKERS]; double norm_idle_time = 0.0; double end_time = starpu_timing_now(); while(workers->has_next(workers, &it)) { double idle_time = 0.0; worker = workers->get_next(workers, &it); if(hypervisor.sched_ctx_w[sched_ctx].compute_idle[worker]) { if(hypervisor.sched_ctx_w[sched_ctx].start_time_w[worker] == 0.0) elapsed_time_worker[worker] = 0.0; else elapsed_time_worker[worker] = (end_time - hypervisor.sched_ctx_w[sched_ctx].start_time_w[worker]) / 1000000.0; if(hypervisor.sched_ctx_w[sched_ctx].idle_start_time[worker] == 0.0) { idle_time = hypervisor.sched_ctx_w[sched_ctx].idle_time[worker]; /* in seconds */ } else { double idle = (end_time - hypervisor.sched_ctx_w[sched_ctx].idle_start_time[worker]) / 1000000.0; /* in seconds */ idle_time = hypervisor.sched_ctx_w[sched_ctx].idle_time[worker] + idle; } norm_idle_time += (elapsed_time_worker[worker] == 0.0 ? 0.0 : (idle_time / elapsed_time_worker[worker])); /* printf("%d/%d: start time %lf elapsed time %lf idle time %lf norm_idle_time %lf \n", */ /* worker, sched_ctx, hypervisor.sched_ctx_w[sched_ctx].start_time_w[worker], elapsed_time_worker[worker], idle_time, norm_idle_time); */ } } double norm_exec_time = 0.0; for(worker = 0; worker < STARPU_NMAXWORKERS; worker++) { double exec_time = 0.0; if(hypervisor.sched_ctx_w[sched_ctx].start_time_w[worker] == 0.0) elapsed_time_worker[worker] = 0.0; else elapsed_time_worker[worker] = (end_time - hypervisor.sched_ctx_w[sched_ctx].start_time_w[worker]) / 1000000.0; if(hypervisor.sched_ctx_w[sched_ctx].exec_start_time[worker] == 0.0) { exec_time = hypervisor.sched_ctx_w[sched_ctx].exec_time[worker]; } else { double current_exec_time = 0.0; if(hypervisor.sched_ctx_w[sched_ctx].exec_start_time[worker] < hypervisor.sched_ctx_w[sched_ctx].start_time) current_exec_time = (end_time - hypervisor.sched_ctx_w[sched_ctx].start_time) / 1000000.0; /* in seconds */ else current_exec_time = (end_time - hypervisor.sched_ctx_w[sched_ctx].exec_start_time[worker]) / 1000000.0; /* in seconds */ exec_time = hypervisor.sched_ctx_w[sched_ctx].exec_time[worker] + current_exec_time; } norm_exec_time += elapsed_time_worker[worker] == 0.0 ? 0.0 : exec_time / elapsed_time_worker[worker]; } double curr_time = starpu_timing_now(); double elapsed_time = (curr_time - hypervisor.sched_ctx_w[sched_ctx].start_time) / 1000000.0; /* in seconds */ int nready_tasks = starpu_sched_ctx_get_nready_tasks(sched_ctx); /* if(norm_idle_time >= 0.9) */ /* { */ /* config->max_nworkers = lrint(norm_exec_time); */ /* } */ /* else */ /* { */ /* if(norm_idle_time < 0.1) */ /* config->max_nworkers = lrint(norm_exec_time) + nready_tasks - 1; //workers->nworkers + hypervisor.sched_ctx_w[sched_ctx].nready_tasks - 1; */ /* else */ /* config->max_nworkers = lrint(norm_exec_time); */ /* } */ config->max_nworkers = lrint(norm_exec_time); // config->max_nworkers = hypervisor.sched_ctx_w[sched_ctx].nready_tasks - 1; /* if(config->max_nworkers < 0) */ /* config->max_nworkers = 0; */ /* if(config->max_nworkers > max_workers) */ /* config->max_nworkers = max_workers; */ #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("%u: ready tasks %d norm_idle_time %lf elapsed_time %lf norm_exec_time %lf nworker %d max %d \n", sched_ctx, nready_tasks, norm_idle_time, elapsed_time, norm_exec_time, workers->nworkers, config->max_nworkers); #endif total_max_nworkers += config->max_nworkers; configured = 1; } unsigned nhierarchy_levels = sc_hypervisor_get_nhierarchy_levels(); if(nhierarchy_levels > 1 && configured) { unsigned *sched_ctxs2; int nsched_ctxs2; sc_hypervisor_get_ctxs_on_level(&sched_ctxs2, &nsched_ctxs2, 0, STARPU_NMAX_SCHED_CTXS); if(nsched_ctxs2 > 0) { _update_max_hierarchically(sched_ctxs2, nsched_ctxs2); int s; int current_total_max_nworkers = 0; double max_nflops = 0.0; unsigned max_nflops_sched_ctx = sched_ctxs2[0]; for(s = 0; s < nsched_ctxs2; s++) { struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(sched_ctxs2[s]); current_total_max_nworkers += config->max_nworkers; if(max_nflops < hypervisor.sched_ctx_w[sched_ctxs2[s]].remaining_flops) { max_nflops = hypervisor.sched_ctx_w[sched_ctxs2[s]].remaining_flops; max_nflops_sched_ctx = sched_ctxs2[s]; } } int max_possible_workers = starpu_worker_get_count(); /*if the sum of the max cpus is smaller than the total cpus available increase the max for the ones having more ready tasks to exec */ if(current_total_max_nworkers < max_possible_workers) { int diff = max_possible_workers - current_total_max_nworkers; struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(max_nflops_sched_ctx); config->max_nworkers += diff; #ifdef STARPU_SC_HYPERVISOR_DEBUG printf("%u: redib max_nworkers incr %d \n", max_nflops_sched_ctx, config->max_nworkers); #endif _update_max_diff_hierarchically(max_nflops_sched_ctx, diff); } free(sched_ctxs2); } } /*if the sum of the max cpus is smaller than the total cpus available increase the max for the ones having more ready tasks to exec */ /* if(configured && total_max_nworkers < max_workers) */ /* { */ /* int diff = max_workers - total_max_nworkers; */ /* int max_nready = -1; */ /* unsigned max_nready_sched_ctx = sched_ctxs[0]; */ /* for(i = 0; i < nsched_ctxs; i++) */ /* { */ /* int nready_tasks = starpu_sched_ctx_get_nready_tasks(sched_ctxs[i]); */ /* if(max_nready < nready_tasks) */ /* { */ /* max_nready = nready_tasks; */ /* max_nready_sched_ctx = sched_ctxs[i]; */ /* } */ /* } */ /* struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(max_nready_sched_ctx); */ /* config->max_nworkers += diff; */ /* printf("%d: redib max_nworkers incr %d \n", max_nready_sched_ctx, config->max_nworkers); */ /* } */ } /* notifies the hypervisor that a new task was pushed on the queue of the worker */ static void notify_pushed_task(unsigned sched_ctx, int worker) { hypervisor.sched_ctx_w[sched_ctx].pushed_tasks[worker]++; if(hypervisor.sched_ctx_w[sched_ctx].total_flops != 0.0 && hypervisor.sched_ctx_w[sched_ctx].start_time == 0.0) hypervisor.sched_ctx_w[sched_ctx].start_time = starpu_timing_now(); if(hypervisor.sched_ctx_w[sched_ctx].total_flops != 0.0 && hypervisor.sched_ctx_w[sched_ctx].start_time_w[worker] == 0.0) { hypervisor.sched_ctx_w[sched_ctx].start_time_w[worker] = starpu_timing_now(); } int ntasks = get_ntasks(hypervisor.sched_ctx_w[sched_ctx].pushed_tasks); if((hypervisor.min_tasks == 0 || (!(hypervisor.resize[sched_ctx] == 0 && imposed_resize) && ntasks == hypervisor.min_tasks)) && hypervisor.check_min_tasks[sched_ctx]) { hypervisor.resize[sched_ctx] = 1; if(imposed_resize) imposed_resize = 0; hypervisor.check_min_tasks[sched_ctx] = 0; } if(hypervisor.policy.handle_pushed_task) hypervisor.policy.handle_pushed_task(sched_ctx, worker); } unsigned choose_ctx_to_steal(int worker) { int j; int ns = hypervisor.nsched_ctxs; int max_ready_tasks = 0; unsigned chosen_ctx = STARPU_NMAX_SCHED_CTXS; for(j = 0; j < ns; j++) { unsigned other_ctx = hypervisor.sched_ctxs[j]; int nready = starpu_sched_ctx_get_nready_tasks(other_ctx); if(!starpu_sched_ctx_contains_worker(worker, other_ctx) && max_ready_tasks < nready) { max_ready_tasks = nready; chosen_ctx = other_ctx; } } return chosen_ctx; } /* notifies the hypervisor that the worker spent another cycle in idle time */ static void notify_idle_cycle(unsigned sched_ctx, int worker, double idle_time) { if(hypervisor.start_executing_time == 0.0) return; struct sc_hypervisor_wrapper *sc_w = &hypervisor.sched_ctx_w[sched_ctx]; sc_w->current_idle_time[worker] += idle_time; if(sc_w->idle_start_time[worker] == 0.0 && sc_w->hyp_react_start_time != 0.0) sc_w->idle_start_time[worker] = starpu_timing_now(); if(sc_w->idle_start_time[worker] > 0.0) { double end_time = starpu_timing_now(); sc_w->idle_time[worker] += (end_time - sc_w->idle_start_time[worker]) / 1000000.0; /* in seconds */ } hypervisor.sched_ctx_w[sched_ctx].idle_start_time[worker] = starpu_timing_now(); if(hypervisor.resize[sched_ctx] && hypervisor.policy.handle_idle_cycle) { if(sc_w->hyp_react_start_time == 0.0) sc_hypervisor_reset_react_start_time(sched_ctx, 1); double curr_time = starpu_timing_now(); double elapsed_time = (curr_time - sc_w->hyp_react_start_time) / 1000000.0; /* in seconds */ if(sc_w->sched_ctx != STARPU_NMAX_SCHED_CTXS && elapsed_time > sc_w->config->time_sample) { unsigned idle_everywhere = 0; unsigned *sched_ctxs = NULL; unsigned nsched_ctxs = 0; int ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { if(sc_hypervisor_check_idle(sched_ctx, worker)) { idle_everywhere = 1; nsched_ctxs = starpu_worker_get_sched_ctx_list(worker, &sched_ctxs); int s; for(s = 0; s < nsched_ctxs; s++) { if(hypervisor.sched_ctx_w[sched_ctxs[s]].sched_ctx != STARPU_NMAX_SCHED_CTXS) { if(!sc_hypervisor_check_idle(sched_ctxs[s], worker)) idle_everywhere = 0; } } free(sched_ctxs); } STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); } if(idle_everywhere) { double hyp_overhead_start = starpu_timing_now(); if(elapsed_time > (sc_w->config->time_sample*2)) hypervisor.policy.handle_idle_cycle(sched_ctx, worker); double hyp_overhead_end = starpu_timing_now(); hyp_overhead += (hyp_overhead_end - hyp_overhead_start); if(elapsed_time > (sc_w->config->time_sample*2)) sc_hypervisor_reset_react_start_time(sched_ctx, 1); else sc_hypervisor_reset_react_start_time(sched_ctx, 0); } } } return; } void _update_real_start_time_hierarchically(unsigned sched_ctx) { hypervisor.sched_ctx_w[sched_ctx].real_start_time = starpu_timing_now(); if(starpu_sched_ctx_get_hierarchy_level(sched_ctx) > 0) { _update_real_start_time_hierarchically(starpu_sched_ctx_get_inheritor(sched_ctx)); } return; } /* notifies the hypervisor that the worker is no longer idle and a new task was pushed on its queue */ static void notify_poped_task(unsigned sched_ctx, int worker) { if(hypervisor.start_executing_time == 0.0) hypervisor.start_executing_time = starpu_timing_now(); if(!hypervisor.resize[sched_ctx]) hypervisor.resize[sched_ctx] = 1; if(hypervisor.sched_ctx_w[sched_ctx].total_flops != 0.0 && hypervisor.sched_ctx_w[sched_ctx].real_start_time == 0.0) _update_real_start_time_hierarchically(sched_ctx); if(hypervisor.sched_ctx_w[sched_ctx].start_time_w[worker] == 0.0) { hypervisor.sched_ctx_w[sched_ctx].start_time_w[worker] = starpu_timing_now(); } hypervisor.sched_ctx_w[sched_ctx].exec_start_time[worker] = starpu_timing_now(); if(hypervisor.sched_ctx_w[sched_ctx].idle_start_time[worker] > 0.0) { int ns = hypervisor.nsched_ctxs; int j; for(j = 0; j < ns; j++) { if(hypervisor.sched_ctxs[j] != sched_ctx) { if(hypervisor.sched_ctx_w[hypervisor.sched_ctxs[j]].idle_start_time[worker] > 0.0) hypervisor.sched_ctx_w[hypervisor.sched_ctxs[j]].compute_partial_idle[worker] = 1; } } double end_time = starpu_timing_now(); double idle = (end_time - hypervisor.sched_ctx_w[sched_ctx].idle_start_time[worker]) / 1000000.0; /* in seconds */ if(hypervisor.sched_ctx_w[sched_ctx].compute_partial_idle[worker]) hypervisor.sched_ctx_w[sched_ctx].idle_time[worker] += idle / 2.0; else hypervisor.sched_ctx_w[sched_ctx].idle_time[worker] += idle; hypervisor.sched_ctx_w[sched_ctx].compute_partial_idle[worker] = 0; hypervisor.sched_ctx_w[sched_ctx].idle_start_time[worker] = 0.0; } if(hypervisor.resize[sched_ctx]) hypervisor.sched_ctx_w[sched_ctx].current_idle_time[worker] = 0.0; if(hypervisor.policy.handle_idle_end) hypervisor.policy.handle_idle_end(sched_ctx, worker); } static void _update_counters_hierarchically(int worker, unsigned sched_ctx, double flops, size_t data_size) { hypervisor.sched_ctx_w[sched_ctx].poped_tasks[worker]++; hypervisor.sched_ctx_w[sched_ctx].elapsed_flops[worker] += flops; hypervisor.sched_ctx_w[sched_ctx].elapsed_data[worker] += data_size ; hypervisor.sched_ctx_w[sched_ctx].elapsed_tasks[worker]++ ; hypervisor.sched_ctx_w[sched_ctx].total_elapsed_flops[worker] += flops; STARPU_PTHREAD_MUTEX_LOCK(&hypervisor.sched_ctx_w[sched_ctx].mutex); hypervisor.sched_ctx_w[sched_ctx].remaining_flops -= flops; STARPU_PTHREAD_MUTEX_UNLOCK(&hypervisor.sched_ctx_w[sched_ctx].mutex); if(starpu_sched_ctx_get_hierarchy_level(sched_ctx) > 0) _update_counters_hierarchically(worker, starpu_sched_ctx_get_inheritor(sched_ctx), flops, data_size); return; } /* notifies the hypervisor that a tagged task has just been executed */ static void notify_post_exec_task(struct starpu_task *task, size_t data_size, uint32_t footprint, int task_tag, double flops) { unsigned sched_ctx = task->sched_ctx; int worker = starpu_worker_get_id_check(); if(hypervisor.sched_ctx_w[sched_ctx].exec_start_time[worker] != 0.0) { double current_time = starpu_timing_now(); double exec_time = (current_time - hypervisor.sched_ctx_w[sched_ctx].exec_start_time[worker]) / 1000000.0; /* in seconds */ hypervisor.sched_ctx_w[sched_ctx].exec_time[worker] += exec_time; hypervisor.sched_ctx_w[sched_ctx].exec_start_time[worker] = 0.0; } hypervisor.sched_ctx_w[sched_ctx].poped_tasks[worker]++; hypervisor.sched_ctx_w[sched_ctx].elapsed_flops[worker] += flops; hypervisor.sched_ctx_w[sched_ctx].elapsed_data[worker] += data_size ; hypervisor.sched_ctx_w[sched_ctx].elapsed_tasks[worker]++ ; hypervisor.sched_ctx_w[sched_ctx].total_elapsed_flops[worker] += flops; STARPU_PTHREAD_MUTEX_LOCK(&hypervisor.sched_ctx_w[sched_ctx].mutex); hypervisor.sched_ctx_w[sched_ctx].remaining_flops -= flops; if(_sc_hypervisor_use_lazy_resize()) _ack_resize_completed(sched_ctx, worker); starpu_pthread_mutex_unlock(&hypervisor.sched_ctx_w[sched_ctx].mutex); if(starpu_sched_ctx_get_hierarchy_level(sched_ctx) > 0) { _update_counters_hierarchically(worker, starpu_sched_ctx_get_inheritor(sched_ctx), flops, data_size); } if(hypervisor.resize[sched_ctx]) { if(hypervisor.policy.handle_poped_task) { if(hypervisor.sched_ctx_w[sched_ctx].hyp_react_start_time == 0.0) sc_hypervisor_reset_react_start_time(sched_ctx, 1); double curr_time = starpu_timing_now(); double elapsed_time = (curr_time - hypervisor.sched_ctx_w[sched_ctx].hyp_react_start_time) / 1000000.0; /* in seconds */ if(hypervisor.sched_ctx_w[sched_ctx].sched_ctx != STARPU_NMAX_SCHED_CTXS && elapsed_time > hypervisor.sched_ctx_w[sched_ctx].config->time_sample) { double hyp_overhead_start = starpu_timing_now(); if(elapsed_time > (hypervisor.sched_ctx_w[sched_ctx].config->time_sample*2)) hypervisor.policy.handle_poped_task(sched_ctx, worker, task, footprint); double hyp_overhead_end = starpu_timing_now(); hyp_overhead += (hyp_overhead_end - hyp_overhead_start); if(elapsed_time > (hypervisor.sched_ctx_w[sched_ctx].config->time_sample*2)) sc_hypervisor_reset_react_start_time(sched_ctx, 1); else sc_hypervisor_reset_react_start_time(sched_ctx, 0); } else /* no need to consider resizing, just remove the task from the pool if the strategy requires it*/ hypervisor.policy.handle_poped_task(sched_ctx, -2, task, footprint); } } /* STARPU_PTHREAD_MUTEX_LOCK(&act_hypervisor_mutex); */ /* _ack_resize_completed(sched_ctx, worker); */ /* STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); */ if(hypervisor.sched_ctx_w[sched_ctx].poped_tasks[worker] % 200 == 0) _print_current_time(); if(task_tag <= 0) return; unsigned conf_sched_ctx; unsigned i; unsigned ns = hypervisor.nsched_ctxs; for(i = 0; i < ns; i++) { struct configuration_entry *entry; conf_sched_ctx = hypervisor.sched_ctxs[i]; STARPU_PTHREAD_MUTEX_LOCK(&hypervisor.conf_mut[conf_sched_ctx]); HASH_FIND_INT(hypervisor.configurations[conf_sched_ctx], &task_tag, entry); if (entry != NULL) { struct sc_hypervisor_policy_config *config = entry->configuration; sc_hypervisor_set_config(conf_sched_ctx, config); HASH_DEL(hypervisor.configurations[conf_sched_ctx], entry); free(config); } STARPU_PTHREAD_MUTEX_UNLOCK(&hypervisor.conf_mut[conf_sched_ctx]); } if(hypervisor.resize[sched_ctx]) { STARPU_PTHREAD_MUTEX_LOCK(&hypervisor.resize_mut[sched_ctx]); if(hypervisor.policy.handle_post_exec_hook) { /* Check whether 'task_tag' is in the 'resize_requests' set. */ struct resize_request_entry *entry; HASH_FIND_INT(hypervisor.resize_requests[sched_ctx], &task_tag, entry); if (entry != NULL) { hypervisor.policy.handle_post_exec_hook(sched_ctx, task_tag); HASH_DEL(hypervisor.resize_requests[sched_ctx], entry); free(entry); } } STARPU_PTHREAD_MUTEX_UNLOCK(&hypervisor.resize_mut[sched_ctx]); } return; } static void notify_submitted_job(struct starpu_task *task, uint32_t footprint, size_t data_size) { unsigned sched_ctx = task->sched_ctx; STARPU_PTHREAD_MUTEX_LOCK(&hypervisor.sched_ctx_w[sched_ctx].mutex); hypervisor.sched_ctx_w[sched_ctx].submitted_flops += task->flops; STARPU_PTHREAD_MUTEX_UNLOCK(&hypervisor.sched_ctx_w[sched_ctx].mutex); /* signaled by the user - no need to wait for them */ /* if(hypervisor.policy.handle_submitted_job && !type_of_tasks_known) */ /* hypervisor.policy.handle_submitted_job(task->cl, task->sched_ctx, footprint, data_size); */ } static void notify_empty_ctx(unsigned sched_ctx_id, struct starpu_task *task) { sc_hypervisor_resize_ctxs(NULL, -1 , NULL, -1); } void sc_hypervisor_set_type_of_task(struct starpu_codelet *cl, unsigned sched_ctx, uint32_t footprint, size_t data_size) { type_of_tasks_known = 1; if(hypervisor.policy.handle_submitted_job) hypervisor.policy.handle_submitted_job(cl, sched_ctx, footprint, data_size); } static void notify_delete_context(unsigned sched_ctx) { _print_current_time(); sc_hypervisor_unregister_ctx(sched_ctx); } void sc_hypervisor_size_ctxs(unsigned *sched_ctxs, int nsched_ctxs, int *workers, int nworkers) { // STARPU_PTHREAD_MUTEX_LOCK(&act_hypervisor_mutex); unsigned curr_nsched_ctxs = sched_ctxs == NULL ? hypervisor.nsched_ctxs : (unsigned)nsched_ctxs; unsigned *curr_sched_ctxs = sched_ctxs == NULL ? hypervisor.sched_ctxs : sched_ctxs; // STARPU_PTHREAD_MUTEX_UNLOCK(&act_hypervisor_mutex); unsigned s; for(s = 0; s < curr_nsched_ctxs; s++) hypervisor.resize[curr_sched_ctxs[s]] = 1; if(hypervisor.policy.size_ctxs) hypervisor.policy.size_ctxs(curr_sched_ctxs, curr_nsched_ctxs, workers, nworkers); } struct sc_hypervisor_wrapper* sc_hypervisor_get_wrapper(unsigned sched_ctx) { return &hypervisor.sched_ctx_w[sched_ctx]; } unsigned* sc_hypervisor_get_sched_ctxs() { return hypervisor.sched_ctxs; } int sc_hypervisor_get_nsched_ctxs() { int ns; ns = hypervisor.nsched_ctxs; return ns; } int _sc_hypervisor_use_lazy_resize(void) { char* lazy = getenv("SC_HYPERVISOR_LAZY_RESIZE"); return lazy ? atoi(lazy) : 1; } void sc_hypervisor_save_size_req(unsigned *sched_ctxs, int nsched_ctxs, int *workers, int nworkers) { hypervisor.sr = (struct size_request*)malloc(sizeof(struct size_request)); hypervisor.sr->sched_ctxs = sched_ctxs; hypervisor.sr->nsched_ctxs = nsched_ctxs; hypervisor.sr->workers = workers; hypervisor.sr->nworkers = nworkers; } unsigned sc_hypervisor_get_size_req(unsigned **sched_ctxs, int* nsched_ctxs, int **workers, int *nworkers) { if(hypervisor.sr != NULL) { *sched_ctxs = hypervisor.sr->sched_ctxs; *nsched_ctxs = hypervisor.sr->nsched_ctxs; *workers = hypervisor.sr->workers; *nworkers = hypervisor.sr->nworkers; return 1; } return 0; } void sc_hypervisor_free_size_req(void) { if(hypervisor.sr != NULL) { free(hypervisor.sr); hypervisor.sr = NULL; } } double _get_optimal_v(unsigned sched_ctx) { return hypervisor.optimal_v[sched_ctx]; } void _set_optimal_v(unsigned sched_ctx, double optimal_v) { hypervisor.optimal_v[sched_ctx] = optimal_v; } static struct types_of_workers* _init_structure_types_of_workers(void) { struct types_of_workers *tw = (struct types_of_workers*)malloc(sizeof(struct types_of_workers)); tw->ncpus = 0; tw->ncuda = 0; tw->nw = 0; return tw; } struct types_of_workers* sc_hypervisor_get_types_of_workers(int *workers, unsigned nworkers) { struct types_of_workers *tw = _init_structure_types_of_workers(); unsigned w; for(w = 0; w < nworkers; w++) { enum starpu_worker_archtype arch = workers == NULL ? starpu_worker_get_type((int)w) : starpu_worker_get_type(workers[w]); if(arch == STARPU_CPU_WORKER) tw->ncpus++; if(arch == STARPU_CUDA_WORKER) tw->ncuda++; } if(tw->ncpus > 0) tw->nw++; if(tw->ncuda > 0) tw->nw++; return tw; } void sc_hypervisor_update_diff_total_flops(unsigned sched_ctx, double diff_total_flops) { // double hyp_overhead_start = starpu_timing_now(); STARPU_PTHREAD_MUTEX_LOCK(&hypervisor.sched_ctx_w[sched_ctx].mutex); hypervisor.sched_ctx_w[sched_ctx].total_flops += diff_total_flops; hypervisor.sched_ctx_w[sched_ctx].remaining_flops += diff_total_flops; STARPU_PTHREAD_MUTEX_UNLOCK(&hypervisor.sched_ctx_w[sched_ctx].mutex); /* double hyp_overhead_end = starpu_timing_now(); */ /* hyp_overhead += (hyp_overhead_end - hyp_overhead_start); */ if(starpu_sched_ctx_get_hierarchy_level(sched_ctx) > 0) sc_hypervisor_update_diff_total_flops(starpu_sched_ctx_get_inheritor(sched_ctx), diff_total_flops); return; } void sc_hypervisor_update_diff_elapsed_flops(unsigned sched_ctx, double diff_elapsed_flops) { // double hyp_overhead_start = starpu_timing_now(); int workerid = starpu_worker_get_id(); if(workerid != -1) { // STARPU_PTHREAD_MUTEX_LOCK(&hypervisor.sched_ctx_w[sched_ctx].mutex); hypervisor.sched_ctx_w[sched_ctx].elapsed_flops[workerid] += diff_elapsed_flops; hypervisor.sched_ctx_w[sched_ctx].total_elapsed_flops[workerid] += diff_elapsed_flops; // STARPU_PTHREAD_MUTEX_UNLOCK(&hypervisor.sched_ctx_w[sched_ctx].mutex); } /* double hyp_overhead_end = starpu_timing_now(); */ /* hyp_overhead += (hyp_overhead_end - hyp_overhead_start); */ if(starpu_sched_ctx_get_hierarchy_level(sched_ctx) > 0) sc_hypervisor_update_diff_elapsed_flops(starpu_sched_ctx_get_inheritor(sched_ctx), diff_elapsed_flops); return; } void sc_hypervisor_get_ctxs_on_level(unsigned **sched_ctxs, int *nsched_ctxs, unsigned hierarchy_level, unsigned father_sched_ctx_id) { unsigned s; *nsched_ctxs = 0; *sched_ctxs = (unsigned*)malloc(hypervisor.nsched_ctxs * sizeof(unsigned)); for(s = 0; s < hypervisor.nsched_ctxs; s++) { /* if father == STARPU_NMAX_SCHED_CTXS we take all the ctxs in this level */ if(starpu_sched_ctx_get_hierarchy_level(hypervisor.sched_ctxs[s]) == hierarchy_level && (starpu_sched_ctx_get_inheritor(hypervisor.sched_ctxs[s]) == father_sched_ctx_id || father_sched_ctx_id == STARPU_NMAX_SCHED_CTXS)) (*sched_ctxs)[(*nsched_ctxs)++] = hypervisor.sched_ctxs[s]; } if(*nsched_ctxs == 0) free(*sched_ctxs); return; } unsigned sc_hypervisor_get_nhierarchy_levels(void) { unsigned nlevels = 0; unsigned level = 0; unsigned levels[STARPU_NMAX_SCHED_CTXS]; unsigned s, l; for(s = 0; s < hypervisor.nsched_ctxs; s++) { level = starpu_sched_ctx_get_hierarchy_level(hypervisor.sched_ctxs[s]); unsigned found = 0; for(l = 0; l < nlevels; l++) if(levels[l] == level) found = 1; if(!found) levels[nlevels++] = level; } return nlevels; } void sc_hypervisor_get_leaves(unsigned *sched_ctxs, int nsched_ctxs, unsigned *leaves, int *nleaves) { int s, s2; for(s = 0; s < nsched_ctxs; s++) { unsigned is_someones_father = 0; for(s2 = 0; s2 < nsched_ctxs; s2++) { unsigned father = starpu_sched_ctx_get_inheritor(sched_ctxs[s2]); if(sched_ctxs[s] == father) { is_someones_father = 1; break; } } if(!is_someones_father) leaves[(*nleaves)++] = sched_ctxs[s]; } return; } starpu-1.2.3+dfsg/sc_hypervisor/src/sc_hypervisor_intern.h000066400000000000000000000066451320135501600240760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "uthash.h" #define SC_SPEED_MAX_GAP_DEFAULT 50 #define SC_HYPERVISOR_DEFAULT_CPU_SPEED 5.0 #define SC_HYPERVISOR_DEFAULT_CUDA_SPEED 100.0 struct size_request { int *workers; int nworkers; unsigned *sched_ctxs; int nsched_ctxs; }; /* Entry in the resize request hash table. */ struct resize_request_entry { /* Key: the tag of tasks concerned by this resize request. */ uint32_t task_tag; /* Value: identifier of the scheduling context needing to be resized. * The value doesn't matter since the hash table is used only to test * membership of a task tag. */ unsigned sched_ctx; /* Bookkeeping. */ UT_hash_handle hh; }; /* structure to indicate when the moving of workers was actually done (moved workers can be seen in the new ctx ) */ struct resize_ack { /* receiver context */ int receiver_sched_ctx; /* list of workers required to be moved */ int *moved_workers; /* number of workers required to be moved */ int nmoved_workers; /* list of workers that actually got in the receiver ctx */ int *acked_workers; }; struct configuration_entry { /* Key: the tag of tasks concerned by this configuration. */ uint32_t task_tag; /* Value: configuration of the scheduling context. */ struct sc_hypervisor_policy_config *configuration; /* Bookkeeping. */ UT_hash_handle hh; }; struct sc_hypervisor { struct sc_hypervisor_wrapper sched_ctx_w[STARPU_NMAX_SCHED_CTXS]; unsigned sched_ctxs[STARPU_NMAX_SCHED_CTXS]; unsigned nsched_ctxs; unsigned resize[STARPU_NMAX_SCHED_CTXS]; unsigned allow_remove[STARPU_NMAX_SCHED_CTXS]; int min_tasks; struct sc_hypervisor_policy policy; struct configuration_entry *configurations[STARPU_NMAX_SCHED_CTXS]; /* Set of pending resize requests for any context/tag pair. */ struct resize_request_entry *resize_requests[STARPU_NMAX_SCHED_CTXS]; starpu_pthread_mutex_t conf_mut[STARPU_NMAX_SCHED_CTXS]; starpu_pthread_mutex_t resize_mut[STARPU_NMAX_SCHED_CTXS]; struct size_request *sr; int check_min_tasks[STARPU_NMAX_SCHED_CTXS]; /* time when the hypervisor started */ double start_executing_time; /* max speed diff btw ctx before triggering resizing */ double max_speed_gap; /* criteria to trigger resizing */ unsigned resize_criteria; /* value of the speed to compare the speed of the context to */ double optimal_v[STARPU_NMAX_SCHED_CTXS]; }; struct sc_hypervisor_adjustment { int workerids[STARPU_NMAXWORKERS]; int nworkers; }; struct sc_hypervisor hypervisor; void _add_config(unsigned sched_ctx); void _remove_config(unsigned sched_ctx); double _get_max_speed_gap(); double _get_optimal_v(unsigned sched_ctx); void _set_optimal_v(unsigned sched_ctx, double optimal_v); int _sc_hypervisor_use_lazy_resize(void); void _sc_hypervisor_allow_compute_idle(unsigned sched_ctx, int worker, unsigned allow); starpu-1.2.3+dfsg/socl/000077500000000000000000000000001320135501600147065ustar00rootroot00000000000000starpu-1.2.3+dfsg/socl/Makefile.am000066400000000000000000000015411320135501600167430ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. SUBDIRS = src examples EXTRA_DIST = README SOCL_vendorsdir = @datarootdir@/starpu/opencl/vendors dist_SOCL_vendors_DATA = @SOCL_VENDORS@ showcheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET starpu-1.2.3+dfsg/socl/Makefile.in000066400000000000000000000646011320135501600167620ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = socl ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(dist_SOCL_vendors_DATA) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(SOCL_vendorsdir)" DATA = $(dist_SOCL_vendors_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in README DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POTI_CFLAGS = @POTI_CFLAGS@ POTI_LIBS = @POTI_LIBS@ PROG_DATE = @PROG_DATE@ PROG_STAT = @PROG_STAT@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_COI_CPPFLAGS = @STARPU_COI_CPPFLAGS@ STARPU_COI_LDFLAGS = @STARPU_COI_LDFLAGS@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LEVELDB_LDFLAGS = @STARPU_LEVELDB_LDFLAGS@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RCCE_CFLAGS = @STARPU_RCCE_CFLAGS@ STARPU_RCCE_CPPFLAGS = @STARPU_RCCE_CPPFLAGS@ STARPU_RCCE_LDFLAGS = @STARPU_RCCE_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SCIF_CPPFLAGS = @STARPU_SCIF_CPPFLAGS@ STARPU_SCIF_LDFLAGS = @STARPU_SCIF_LDFLAGS@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SC_HYPERVISOR_DEBUG = @STARPU_SC_HYPERVISOR_DEBUG@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ mpifort_path = @mpifort_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ smpirun_path = @smpirun_path@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = src examples EXTRA_DIST = README SOCL_vendorsdir = @datarootdir@/starpu/opencl/vendors dist_SOCL_vendors_DATA = @SOCL_VENDORS@ all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign socl/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign socl/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dist_SOCL_vendorsDATA: $(dist_SOCL_vendors_DATA) @$(NORMAL_INSTALL) @list='$(dist_SOCL_vendors_DATA)'; test -n "$(SOCL_vendorsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(SOCL_vendorsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(SOCL_vendorsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(SOCL_vendorsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(SOCL_vendorsdir)" || exit $$?; \ done uninstall-dist_SOCL_vendorsDATA: @$(NORMAL_UNINSTALL) @list='$(dist_SOCL_vendors_DATA)'; test -n "$(SOCL_vendorsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(SOCL_vendorsdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(SOCL_vendorsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dist_SOCL_vendorsDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-dist_SOCL_vendorsDATA .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-dist_SOCL_vendorsDATA install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am \ uninstall-dist_SOCL_vendorsDATA .PRECIOUS: Makefile showcheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.2.3+dfsg/socl/README000066400000000000000000000002451320135501600155670ustar00rootroot00000000000000StarPU's OpenCL interface ========================= This directory contains an OpenCL implementation that can be used as a replacement of the classic StarPU's API. starpu-1.2.3+dfsg/socl/examples/000077500000000000000000000000001320135501600165245ustar00rootroot00000000000000starpu-1.2.3+dfsg/socl/examples/Makefile.am000066400000000000000000000053071320135501600205650ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009, 2010-2012, 2015-2016 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. include $(top_srcdir)/starpu.mk AM_CFLAGS = $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(GLOBAL_AM_CFLAGS) LIBS = $(top_builddir)/socl/src/libsocl-@STARPU_EFFECTIVE_VERSION@.la $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la AM_LDFLAGS = $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) SOCL_EXAMPLES = if !STARPU_SIMGRID TESTS = $(SOCL_EXAMPLES) endif if STARPU_HAVE_WINDOWS check_PROGRAMS = $(SOCL_EXAMPLES) else check_PROGRAMS = $(LOADER) $(SOCL_EXAMPLES) endif if !STARPU_HAVE_WINDOWS ## test loader program LOADER = loader loader_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -I$(top_builddir)/src/ LOADER_BIN = $(abs_top_builddir)/socl/examples/$(LOADER) loader_SOURCES = ../../tests/loader.c if STARPU_HAVE_AM111 TESTS_ENVIRONMENT = LD_LIBRARY_PATH="@SOCL_OCL_LIB_OPENCL_DIR@:$(LD_LIBRARY_PATH)" OCL_ICD_VENDORS="$(abs_top_builddir)/socl/vendors/" top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" LOG_COMPILER = $(LOADER_BIN) else TESTS_ENVIRONMENT = LD_LIBRARY_PATH="@SOCL_OCL_LIB_OPENCL_DIR@:$(LD_LIBRARY_PATH)" OCL_ICD_VENDORS="$(abs_top_builddir)/socl/vendors/" top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(LOADER_BIN) endif endif CLEANFILES = *.gcno *.gcda starpu_idle_microsec.log examplebindir = $(libdir)/starpu/examples/socl/ examplebin_PROGRAMS = examplebin_PROGRAMS += \ basic/basic \ testmap/testmap \ clinfo/clinfo \ matmul/matmul \ mansched/mansched SOCL_EXAMPLES += \ basic/basic \ testmap/testmap \ clinfo/clinfo \ matmul/matmul \ mansched/mansched basic_basic_SOURCES = basic/basic.c testmap_testmap_SOURCES = testmap/testmap.c clinfo_clinfo_SOURCES = clinfo/clinfo.c matmul_matmul_SOURCES = matmul/matmul.c matmul_matmul_LDADD = -lm mansched_mansched_SOURCES = mansched/mansched.c #mandelbrot_mandelbrot_CPPFLAGS = $(AM_CPPFLAGS) $(AM_CFLAGS) #if HAVE_X11 #mandelbrot_mandelbrot_CPPFLAGS += $(X_CFLAGS) #mandelbrot_mandelbrot_LDADD = $(X_PRE_LIBS) $(X_LIBS) -lX11 $(X_EXTRA_LIBS) #endif starpu-1.2.3+dfsg/socl/examples/Makefile.in000066400000000000000000001624051320135501600206010ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009, 2010-2012, 2015-2016 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @STARPU_SIMGRID_FALSE@TESTS = $(am__EXEEXT_2) @STARPU_HAVE_WINDOWS_FALSE@check_PROGRAMS = $(am__EXEEXT_1) \ @STARPU_HAVE_WINDOWS_FALSE@ $(am__EXEEXT_2) @STARPU_HAVE_WINDOWS_TRUE@check_PROGRAMS = $(am__EXEEXT_2) examplebin_PROGRAMS = basic/basic$(EXEEXT) testmap/testmap$(EXEEXT) \ clinfo/clinfo$(EXEEXT) matmul/matmul$(EXEEXT) \ mansched/mansched$(EXEEXT) subdir = socl/examples ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @STARPU_HAVE_WINDOWS_FALSE@am__EXEEXT_1 = loader$(EXEEXT) am__EXEEXT_2 = basic/basic$(EXEEXT) testmap/testmap$(EXEEXT) \ clinfo/clinfo$(EXEEXT) matmul/matmul$(EXEEXT) \ mansched/mansched$(EXEEXT) am__installdirs = "$(DESTDIR)$(examplebindir)" PROGRAMS = $(examplebin_PROGRAMS) am_basic_basic_OBJECTS = basic.$(OBJEXT) basic_basic_OBJECTS = $(am_basic_basic_OBJECTS) basic_basic_LDADD = $(LDADD) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am__dirstamp = $(am__leading_dot)dirstamp am_clinfo_clinfo_OBJECTS = clinfo.$(OBJEXT) clinfo_clinfo_OBJECTS = $(am_clinfo_clinfo_OBJECTS) clinfo_clinfo_LDADD = $(LDADD) am__loader_SOURCES_DIST = ../../tests/loader.c @STARPU_HAVE_WINDOWS_FALSE@am_loader_OBJECTS = \ @STARPU_HAVE_WINDOWS_FALSE@ loader-loader.$(OBJEXT) loader_OBJECTS = $(am_loader_OBJECTS) loader_LDADD = $(LDADD) am_mansched_mansched_OBJECTS = mansched.$(OBJEXT) mansched_mansched_OBJECTS = $(am_mansched_mansched_OBJECTS) mansched_mansched_LDADD = $(LDADD) am_matmul_matmul_OBJECTS = matmul.$(OBJEXT) matmul_matmul_OBJECTS = $(am_matmul_matmul_OBJECTS) matmul_matmul_DEPENDENCIES = am_testmap_testmap_OBJECTS = testmap.$(OBJEXT) testmap_testmap_OBJECTS = $(am_testmap_testmap_OBJECTS) testmap_testmap_LDADD = $(LDADD) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/common -I$(top_builddir)/include -I$(top_builddir)/gcc-plugin/include/starpu-gcc -I$(top_builddir)/starpu-top depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(basic_basic_SOURCES) $(clinfo_clinfo_SOURCES) \ $(loader_SOURCES) $(mansched_mansched_SOURCES) \ $(matmul_matmul_SOURCES) $(testmap_testmap_SOURCES) DIST_SOURCES = $(basic_basic_SOURCES) $(clinfo_clinfo_SOURCES) \ $(am__loader_SOURCES_DIST) $(mansched_mansched_SOURCES) \ $(matmul_matmul_SOURCES) $(testmap_testmap_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/build-aux/depcomp \ $(top_srcdir)/build-aux/test-driver $(top_srcdir)/starpu.mk DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = $(top_builddir)/socl/src/libsocl-@STARPU_EFFECTIVE_VERSION@.la $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POTI_CFLAGS = @POTI_CFLAGS@ POTI_LIBS = @POTI_LIBS@ PROG_DATE = @PROG_DATE@ PROG_STAT = @PROG_STAT@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_COI_CPPFLAGS = @STARPU_COI_CPPFLAGS@ STARPU_COI_LDFLAGS = @STARPU_COI_LDFLAGS@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LEVELDB_LDFLAGS = @STARPU_LEVELDB_LDFLAGS@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RCCE_CFLAGS = @STARPU_RCCE_CFLAGS@ STARPU_RCCE_CPPFLAGS = @STARPU_RCCE_CPPFLAGS@ STARPU_RCCE_LDFLAGS = @STARPU_RCCE_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SCIF_CPPFLAGS = @STARPU_SCIF_CPPFLAGS@ STARPU_SCIF_LDFLAGS = @STARPU_SCIF_LDFLAGS@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SC_HYPERVISOR_DEBUG = @STARPU_SC_HYPERVISOR_DEBUG@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ mpifort_path = @mpifort_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ smpirun_path = @smpirun_path@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CFLAGS = $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(GLOBAL_AM_CFLAGS) AM_LDFLAGS = $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) SOCL_EXAMPLES = basic/basic testmap/testmap clinfo/clinfo \ matmul/matmul mansched/mansched @STARPU_HAVE_WINDOWS_FALSE@LOADER = loader @STARPU_HAVE_WINDOWS_FALSE@loader_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -I$(top_builddir)/src/ @STARPU_HAVE_WINDOWS_FALSE@LOADER_BIN = $(abs_top_builddir)/socl/examples/$(LOADER) @STARPU_HAVE_WINDOWS_FALSE@loader_SOURCES = ../../tests/loader.c @STARPU_HAVE_AM111_FALSE@@STARPU_HAVE_WINDOWS_FALSE@TESTS_ENVIRONMENT = LD_LIBRARY_PATH="@SOCL_OCL_LIB_OPENCL_DIR@:$(LD_LIBRARY_PATH)" OCL_ICD_VENDORS="$(abs_top_builddir)/socl/vendors/" top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(LOADER_BIN) @STARPU_HAVE_AM111_TRUE@@STARPU_HAVE_WINDOWS_FALSE@TESTS_ENVIRONMENT = LD_LIBRARY_PATH="@SOCL_OCL_LIB_OPENCL_DIR@:$(LD_LIBRARY_PATH)" OCL_ICD_VENDORS="$(abs_top_builddir)/socl/vendors/" top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" @STARPU_HAVE_AM111_TRUE@@STARPU_HAVE_WINDOWS_FALSE@LOG_COMPILER = $(LOADER_BIN) CLEANFILES = *.gcno *.gcda starpu_idle_microsec.log examplebindir = $(libdir)/starpu/examples/socl/ basic_basic_SOURCES = basic/basic.c testmap_testmap_SOURCES = testmap/testmap.c clinfo_clinfo_SOURCES = clinfo/clinfo.c matmul_matmul_SOURCES = matmul/matmul.c matmul_matmul_LDADD = -lm mansched_mansched_SOURCES = mansched/mansched.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/starpu.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign socl/examples/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign socl/examples/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/starpu.mk $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-examplebinPROGRAMS: $(examplebin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(examplebin_PROGRAMS)'; test -n "$(examplebindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(examplebindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(examplebindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(examplebindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(examplebindir)$$dir" || exit $$?; \ } \ ; done uninstall-examplebinPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(examplebin_PROGRAMS)'; test -n "$(examplebindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(examplebindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(examplebindir)" && rm -f $$files clean-examplebinPROGRAMS: @list='$(examplebin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list basic/$(am__dirstamp): @$(MKDIR_P) basic @: > basic/$(am__dirstamp) basic/basic$(EXEEXT): $(basic_basic_OBJECTS) $(basic_basic_DEPENDENCIES) $(EXTRA_basic_basic_DEPENDENCIES) basic/$(am__dirstamp) @rm -f basic/basic$(EXEEXT) $(AM_V_CCLD)$(LINK) $(basic_basic_OBJECTS) $(basic_basic_LDADD) $(LIBS) clinfo/$(am__dirstamp): @$(MKDIR_P) clinfo @: > clinfo/$(am__dirstamp) clinfo/clinfo$(EXEEXT): $(clinfo_clinfo_OBJECTS) $(clinfo_clinfo_DEPENDENCIES) $(EXTRA_clinfo_clinfo_DEPENDENCIES) clinfo/$(am__dirstamp) @rm -f clinfo/clinfo$(EXEEXT) $(AM_V_CCLD)$(LINK) $(clinfo_clinfo_OBJECTS) $(clinfo_clinfo_LDADD) $(LIBS) loader$(EXEEXT): $(loader_OBJECTS) $(loader_DEPENDENCIES) $(EXTRA_loader_DEPENDENCIES) @rm -f loader$(EXEEXT) $(AM_V_CCLD)$(LINK) $(loader_OBJECTS) $(loader_LDADD) $(LIBS) mansched/$(am__dirstamp): @$(MKDIR_P) mansched @: > mansched/$(am__dirstamp) mansched/mansched$(EXEEXT): $(mansched_mansched_OBJECTS) $(mansched_mansched_DEPENDENCIES) $(EXTRA_mansched_mansched_DEPENDENCIES) mansched/$(am__dirstamp) @rm -f mansched/mansched$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mansched_mansched_OBJECTS) $(mansched_mansched_LDADD) $(LIBS) matmul/$(am__dirstamp): @$(MKDIR_P) matmul @: > matmul/$(am__dirstamp) matmul/matmul$(EXEEXT): $(matmul_matmul_OBJECTS) $(matmul_matmul_DEPENDENCIES) $(EXTRA_matmul_matmul_DEPENDENCIES) matmul/$(am__dirstamp) @rm -f matmul/matmul$(EXEEXT) $(AM_V_CCLD)$(LINK) $(matmul_matmul_OBJECTS) $(matmul_matmul_LDADD) $(LIBS) testmap/$(am__dirstamp): @$(MKDIR_P) testmap @: > testmap/$(am__dirstamp) testmap/testmap$(EXEEXT): $(testmap_testmap_OBJECTS) $(testmap_testmap_DEPENDENCIES) $(EXTRA_testmap_testmap_DEPENDENCIES) testmap/$(am__dirstamp) @rm -f testmap/testmap$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testmap_testmap_OBJECTS) $(testmap_testmap_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/basic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clinfo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loader-loader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mansched.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matmul.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testmap.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< basic.o: basic/basic.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT basic.o -MD -MP -MF $(DEPDIR)/basic.Tpo -c -o basic.o `test -f 'basic/basic.c' || echo '$(srcdir)/'`basic/basic.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/basic.Tpo $(DEPDIR)/basic.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic/basic.c' object='basic.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o basic.o `test -f 'basic/basic.c' || echo '$(srcdir)/'`basic/basic.c basic.obj: basic/basic.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT basic.obj -MD -MP -MF $(DEPDIR)/basic.Tpo -c -o basic.obj `if test -f 'basic/basic.c'; then $(CYGPATH_W) 'basic/basic.c'; else $(CYGPATH_W) '$(srcdir)/basic/basic.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/basic.Tpo $(DEPDIR)/basic.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic/basic.c' object='basic.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o basic.obj `if test -f 'basic/basic.c'; then $(CYGPATH_W) 'basic/basic.c'; else $(CYGPATH_W) '$(srcdir)/basic/basic.c'; fi` clinfo.o: clinfo/clinfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT clinfo.o -MD -MP -MF $(DEPDIR)/clinfo.Tpo -c -o clinfo.o `test -f 'clinfo/clinfo.c' || echo '$(srcdir)/'`clinfo/clinfo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/clinfo.Tpo $(DEPDIR)/clinfo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clinfo/clinfo.c' object='clinfo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o clinfo.o `test -f 'clinfo/clinfo.c' || echo '$(srcdir)/'`clinfo/clinfo.c clinfo.obj: clinfo/clinfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT clinfo.obj -MD -MP -MF $(DEPDIR)/clinfo.Tpo -c -o clinfo.obj `if test -f 'clinfo/clinfo.c'; then $(CYGPATH_W) 'clinfo/clinfo.c'; else $(CYGPATH_W) '$(srcdir)/clinfo/clinfo.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/clinfo.Tpo $(DEPDIR)/clinfo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clinfo/clinfo.c' object='clinfo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o clinfo.obj `if test -f 'clinfo/clinfo.c'; then $(CYGPATH_W) 'clinfo/clinfo.c'; else $(CYGPATH_W) '$(srcdir)/clinfo/clinfo.c'; fi` loader-loader.o: ../../tests/loader.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT loader-loader.o -MD -MP -MF $(DEPDIR)/loader-loader.Tpo -c -o loader-loader.o `test -f '../../tests/loader.c' || echo '$(srcdir)/'`../../tests/loader.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/loader-loader.Tpo $(DEPDIR)/loader-loader.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../tests/loader.c' object='loader-loader.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o loader-loader.o `test -f '../../tests/loader.c' || echo '$(srcdir)/'`../../tests/loader.c loader-loader.obj: ../../tests/loader.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT loader-loader.obj -MD -MP -MF $(DEPDIR)/loader-loader.Tpo -c -o loader-loader.obj `if test -f '../../tests/loader.c'; then $(CYGPATH_W) '../../tests/loader.c'; else $(CYGPATH_W) '$(srcdir)/../../tests/loader.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/loader-loader.Tpo $(DEPDIR)/loader-loader.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../tests/loader.c' object='loader-loader.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o loader-loader.obj `if test -f '../../tests/loader.c'; then $(CYGPATH_W) '../../tests/loader.c'; else $(CYGPATH_W) '$(srcdir)/../../tests/loader.c'; fi` mansched.o: mansched/mansched.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mansched.o -MD -MP -MF $(DEPDIR)/mansched.Tpo -c -o mansched.o `test -f 'mansched/mansched.c' || echo '$(srcdir)/'`mansched/mansched.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mansched.Tpo $(DEPDIR)/mansched.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mansched/mansched.c' object='mansched.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mansched.o `test -f 'mansched/mansched.c' || echo '$(srcdir)/'`mansched/mansched.c mansched.obj: mansched/mansched.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mansched.obj -MD -MP -MF $(DEPDIR)/mansched.Tpo -c -o mansched.obj `if test -f 'mansched/mansched.c'; then $(CYGPATH_W) 'mansched/mansched.c'; else $(CYGPATH_W) '$(srcdir)/mansched/mansched.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mansched.Tpo $(DEPDIR)/mansched.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mansched/mansched.c' object='mansched.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mansched.obj `if test -f 'mansched/mansched.c'; then $(CYGPATH_W) 'mansched/mansched.c'; else $(CYGPATH_W) '$(srcdir)/mansched/mansched.c'; fi` matmul.o: matmul/matmul.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matmul.o -MD -MP -MF $(DEPDIR)/matmul.Tpo -c -o matmul.o `test -f 'matmul/matmul.c' || echo '$(srcdir)/'`matmul/matmul.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matmul.Tpo $(DEPDIR)/matmul.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matmul/matmul.c' object='matmul.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o matmul.o `test -f 'matmul/matmul.c' || echo '$(srcdir)/'`matmul/matmul.c matmul.obj: matmul/matmul.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matmul.obj -MD -MP -MF $(DEPDIR)/matmul.Tpo -c -o matmul.obj `if test -f 'matmul/matmul.c'; then $(CYGPATH_W) 'matmul/matmul.c'; else $(CYGPATH_W) '$(srcdir)/matmul/matmul.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matmul.Tpo $(DEPDIR)/matmul.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matmul/matmul.c' object='matmul.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o matmul.obj `if test -f 'matmul/matmul.c'; then $(CYGPATH_W) 'matmul/matmul.c'; else $(CYGPATH_W) '$(srcdir)/matmul/matmul.c'; fi` testmap.o: testmap/testmap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testmap.o -MD -MP -MF $(DEPDIR)/testmap.Tpo -c -o testmap.o `test -f 'testmap/testmap.c' || echo '$(srcdir)/'`testmap/testmap.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/testmap.Tpo $(DEPDIR)/testmap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testmap/testmap.c' object='testmap.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o testmap.o `test -f 'testmap/testmap.c' || echo '$(srcdir)/'`testmap/testmap.c testmap.obj: testmap/testmap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testmap.obj -MD -MP -MF $(DEPDIR)/testmap.Tpo -c -o testmap.obj `if test -f 'testmap/testmap.c'; then $(CYGPATH_W) 'testmap/testmap.c'; else $(CYGPATH_W) '$(srcdir)/testmap/testmap.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/testmap.Tpo $(DEPDIR)/testmap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testmap/testmap.c' object='testmap.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o testmap.obj `if test -f 'testmap/testmap.c'; then $(CYGPATH_W) 'testmap/testmap.c'; else $(CYGPATH_W) '$(srcdir)/testmap/testmap.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf basic/.libs basic/_libs -rm -rf clinfo/.libs clinfo/_libs -rm -rf mansched/.libs mansched/_libs -rm -rf matmul/.libs matmul/_libs -rm -rf testmap/.libs testmap/_libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? basic/basic.log: basic/basic$(EXEEXT) @p='basic/basic$(EXEEXT)'; \ b='basic/basic'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) testmap/testmap.log: testmap/testmap$(EXEEXT) @p='testmap/testmap$(EXEEXT)'; \ b='testmap/testmap'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) clinfo/clinfo.log: clinfo/clinfo$(EXEEXT) @p='clinfo/clinfo$(EXEEXT)'; \ b='clinfo/clinfo'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) matmul/matmul.log: matmul/matmul$(EXEEXT) @p='matmul/matmul$(EXEEXT)'; \ b='matmul/matmul'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) mansched/mansched.log: mansched/mansched$(EXEEXT) @p='mansched/mansched$(EXEEXT)'; \ b='mansched/mansched'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(examplebindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f basic/$(am__dirstamp) -rm -f clinfo/$(am__dirstamp) -rm -f mansched/$(am__dirstamp) -rm -f matmul/$(am__dirstamp) -rm -f testmap/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-examplebinPROGRAMS clean-generic \ clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-examplebinPROGRAMS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-examplebinPROGRAMS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-examplebinPROGRAMS clean-generic \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-examplebinPROGRAMS install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-examplebinPROGRAMS .PRECIOUS: Makefile showcheck: -cat $(TEST_LOGS) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q " runtime error: " $(TEST_LOGS) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET #mandelbrot_mandelbrot_CPPFLAGS = $(AM_CPPFLAGS) $(AM_CFLAGS) #if HAVE_X11 #mandelbrot_mandelbrot_CPPFLAGS += $(X_CFLAGS) #mandelbrot_mandelbrot_LDADD = $(X_PRE_LIBS) $(X_LIBS) -lX11 $(X_EXTRA_LIBS) #endif # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.2.3+dfsg/socl/examples/basic/000077500000000000000000000000001320135501600176055ustar00rootroot00000000000000starpu-1.2.3+dfsg/socl/examples/basic/basic.c000066400000000000000000000166511320135501600210430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #ifdef __APPLE_CC__ #include #else #include #endif #define error(...) do { fprintf(stderr, "Error: " __VA_ARGS__); exit(EXIT_FAILURE); } while(0) #define check(err, str) do { if(err != CL_SUCCESS) { fprintf(stderr, "OpenCL Error (%d): %s\n",err, str); exit(EXIT_FAILURE); }} while(0) #ifdef UNUSED #elif defined(__GNUC__) # define UNUSED(x) UNUSED_ ## x __attribute__((unused)) #else # define UNUSED(x) x #endif #define SIZE 1024 #define TYPE float #define REALSIZE (SIZE * sizeof(TYPE)) const char * kernel_src = "__kernel void add(__global float*s1, __global float*s2, __global float*d) { \ size_t x = get_global_id(0);\n\ size_t y = get_global_id(1);\n\ size_t w = get_global_size(0); \n\ int idx = y*w+x; \n\ #ifdef SOCL_DEVICE_TYPE_GPU \n\ d[idx] = s1[idx] + s2[idx];\n\ #endif \n\ #ifdef SOCL_DEVICE_TYPE_CPU \n\ d[idx] = s1[idx] + 2* s2[idx];\n\ #endif \n\ #ifdef SOCL_DEVICE_TYPE_ACCELERATOR \n\ d[idx] = s1[idx] + 3 * s2[idx];\n\ #endif \n\ #ifdef SOCL_DEVICE_TYPE_UNKNOWN \n\ d[idx] = s1[idx] + 4 * s2[idx];\n\ #endif \n\ }"; int main(int UNUSED(argc), char** UNUSED(argv)) { cl_platform_id platforms[15]; cl_uint num_platforms; cl_device_id devices[15]; cl_uint num_devices; cl_context context; cl_program program; cl_kernel kernel; cl_mem s1m, s2m, dm; cl_command_queue cq; cl_int err; unsigned int i; TYPE s1[SIZE],s2[SIZE],d[SIZE]; { for (i=0; i #include #ifdef __APPLE_CC__ #include #else #include #endif static inline void checkErr(cl_int err, const char * name) { if (err != CL_SUCCESS) { fprintf(stderr, "ERROR: %s (%d)\n", name, err); exit(1); } } int main(void) { cl_int err; cl_uint num_platforms; // Plaform info err = clGetPlatformIDs(0, NULL, &num_platforms); if (num_platforms == 0) { printf("No OpenCL platform found.\n"); exit(77); } checkErr(err, "Unable to get platform count"); cl_platform_id platforms[num_platforms]; err = clGetPlatformIDs(num_platforms, platforms, NULL); checkErr(err, "Unable to get platform list"); // Iteratate over platforms printf("Number of platforms:\t\t\t\t %d\n", num_platforms); { unsigned int i; for (i=0; i #include #include #include #ifdef __APPLE_CC__ #include #else #include #endif #define error(...) do { fprintf(stderr, "Error: " __VA_ARGS__); exit(EXIT_FAILURE); } while(0) #define check(err, str) do { if(err != CL_SUCCESS) { fprintf(stderr, "OpenCL Error (%d): %s\n",err, str); exit(EXIT_FAILURE); }} while(0) #ifdef UNUSED #elif defined(__GNUC__) # define UNUSED(x) UNUSED_ ## x __attribute__((unused)) #else # define UNUSED(x) x #endif #define SIZE 1024 #define TYPE float #define REALSIZE (SIZE * sizeof(TYPE)) const char * kernel_src = "__kernel void add(__global float*s1, __global float*s2, __global float*d) { \ size_t x = get_global_id(0);\ size_t y = get_global_id(1);\ size_t w = get_global_size(0); \ int idx = y*w+x; \ d[idx] = s1[idx] + s2[idx];\ }"; int main(int UNUSED(argc), char** UNUSED(argv)) { cl_platform_id platforms[15]; cl_uint num_platforms; cl_device_id devices[15]; cl_uint num_devices; cl_context context; cl_program program; cl_kernel kernel; cl_mem s1m, s2m, dm; cl_command_queue cq; unsigned int d; cl_int err; TYPE s1[SIZE],s2[SIZE],dst[SIZE]; { int i; for (i=0; i #else #include #endif #include #include #include #include #include #include #include #include #define error(...) do { fprintf(stderr, "Error: " __VA_ARGS__); exit(EXIT_FAILURE); } while(0) #define check(exp) do { err = exp; if(err != CL_SUCCESS) { fprintf(stderr, "OpenCL Error (%d): " #exp "\n", err); exit(EXIT_FAILURE); }} while(0) #define check2(exp) exp; if(err != CL_SUCCESS) { fprintf(stderr, "OpenCL Error (%d): " #exp "\n", err); exit(EXIT_FAILURE); } #define check3(exp, err) do { if(err != CL_SUCCESS) { fprintf(stderr, "OpenCL Error (%d): " #exp "\n", err); exit(EXIT_FAILURE); } } while(0) // Thread block size #define BLOCK_SIZE 16 // Kernel thread-block size #define WORK_SIZE 64 // Kernel global size in lines of A (or C) #define TYPE float // Basic Matrix dimensions #define WA (128L * BLOCK_SIZE) // Matrix A width #ifdef STARPU_QUICK_CHECK #define HA (128L * BLOCK_SIZE) // Matrix A height #else #define HA (512L * BLOCK_SIZE) // Matrix A height #endif #define WB (128L * BLOCK_SIZE) // Matrix B width #define HB WA // Matrix B height #define WC WB // Matrix C width #define HC HA // Matrix C height #define BLOCKS (HA / WORK_SIZE) //////////////////////////////////////////////////////////////////////////////// // declaration, forward void printDiff(TYPE*, TYPE*, int, int, int, TYPE); void computeReference(TYPE*, const TYPE*, const TYPE*, unsigned int, unsigned int, unsigned int); #define str(x) #x #define CODE "\ #define TYPE float\n\ __kernel void sgemmNN(int wa, int ha, int wb, __global TYPE* A, __global TYPE* B, __global TYPE* C) {\n\ #define BS 16\n\ #define BLOCK_SIZE 16\n\ int bx = get_group_id(0);\n\ int by = get_group_id(1);\n\ \n\ int tx = get_local_id(0);\n\ int ty = get_local_id(1);\n\ \n\ int gx = get_global_id(0);\n\ int gy = get_global_id(1);\n\ __local float As[BS][BS+1];\ __local float Bs[BS][BS+1];\ \n\ unsigned int block_w = min(wb - bx * BLOCK_SIZE, BLOCK_SIZE);\n\ unsigned int block_h = min(ha - by * BLOCK_SIZE, BLOCK_SIZE);\n\ \n\ int valid = (gx < wb && gy < ha);\n\ \n\ TYPE Csub = (TYPE)0.0;\n\ \n\ int pos = 0;\n\ while (pos < wa) {\n\ unsigned int size = min(wa-pos, BLOCK_SIZE);\n\ if (tx < size && gy < ha)\n\ As[tx][ty] = A[pos + tx + wa * gy];\n\ if (ty < size && gx < wb)\n\ Bs[tx][ty] = B[gx + wb * (pos+ty)];\n\ \n\ barrier(CLK_LOCAL_MEM_FENCE);\n\ \n\ if (valid) {\n\ for (int k = 0; k < size; ++k)\n\ Csub += As[k][ty] * Bs[tx][k];\n\ }\n\ pos += size;\n\ barrier(CLK_LOCAL_MEM_FENCE);\n\ }\n\ \n\ if (valid)\n\ C[wb * gy + gx] = Csub;\n\ }" static char * code = CODE; int check = 0; static void __attribute__((unused)) parse_args(int argc, const char **argv) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-check") == 0) { check = 1; } if (strcmp(argv[i], "-h") == 0) { printf("usage : %s [-check]\n", argv[0]); } } } // Round Up Division function size_t roundUp(int group_size, int global_size) { int r = global_size % group_size; if(r == 0) { return global_size; } else { return global_size + group_size - r; } } void fillArray(TYPE* data, int size) { int i; const TYPE fScale = (TYPE)(1.0f / (float)RAND_MAX); for (i = 0; i < size; ++i) { data[i] = fScale * rand(); } } void printArray(float* data, int size) { int i; for (i = 0; i < size; ++i) { printf("%d: %.3f\n", i, data[i]); } } /** * Compare two float arrays using L2-norm with an epsilon tolerance for equality * @return shrTRUE if \a reference and \a data are identical, otherwise shrFALSE * @param reference handle to the reference data / gold image * @param data handle to the computed data * @param len number of elements in reference and data * @param epsilon epsilon to use for the comparison */ int shrCompareL2fe( const float* reference, const float* data, const unsigned int len, const float epsilon ) { assert(epsilon >= 0); float error = 0; float ref = 0; unsigned int i; for(i = 0; i < len; ++i) { float diff = reference[i] - data[i]; error += diff * diff; ref += reference[i] * reference[i]; } float normRef = sqrtf(ref); if (fabs(ref) < 1e-7) { #ifdef _DEBUG fprintf(stderr, "ERROR, reference l2-norm is 0\n"); #endif return 0; } float normError = sqrtf(error); error = normError / normRef; int result = error < epsilon; #ifdef _DEBUG if( !result) { fprintf(stderr, "ERROR, l2-norm error %d is greater than epsilon %lf \n", error, epsilon); } #endif return result; } int main(int argc, const char** argv) { if (getenv("STARPU_GLOBAL_ARBITER")) /* matmul needs fine-grain R concurrency, not implemented yet in starpu 1.2 */ exit(77); cl_uint platform_count; cl_platform_id platforms[5]; cl_int err = CL_SUCCESS; unsigned int i, p; cl_device_type dev_type = CL_DEVICE_TYPE_ALL; void * ptrs[BLOCKS]; cl_command_queue cqs[BLOCKS]; cl_mem d_A[BLOCKS]; cl_mem d_C[BLOCKS]; cl_mem d_B[BLOCKS]; cl_event GPUDone[BLOCKS]; cl_event GPUExecution[BLOCKS]; struct timeval start, end; int workOffset[BLOCKS]; int workSize[BLOCKS]; unsigned int sizePerGPU = HC / BLOCKS; unsigned int sizeMod = HC % BLOCKS; size_t A_size = WA * HA; size_t A_mem_size = sizeof(TYPE) * A_size; TYPE* A_data; size_t B_size = WB * HB; size_t B_mem_size = sizeof(TYPE) * B_size; TYPE* B_data; size_t C_size = WC * HC; size_t C_mem_size = sizeof(TYPE) * C_size; TYPE* C_data; parse_args(argc, argv); check(clGetPlatformIDs(5, platforms, &platform_count)); if (platform_count == 0) { printf("No platform found\n"); exit(77); } cl_uint device_count; cl_uint devs[platform_count]; cl_device_id * devices[platform_count]; cl_context ctx[platform_count]; cl_command_queue * commandQueue[platform_count]; device_count = 0; for (p=0; p %.6f...\n", listLength, listTol); int i,j,k; int error_count=0; for (j = 0; j < height; j++) { if (error_count < listLength) { printf("\n Row %d:\n", j); } for (i = 0; i < width; i++) { k = j * width + i; float diff = fabs(data1[k] - data2[k]); if (diff > listTol) { if (error_count < listLength) { printf(" Loc(%d,%d)\tCPU=%.5f\tGPU=%.5f\tDiff=%.6f\n", i, j, data1[k], data2[k], diff); } error_count++; } } } printf(" \n Total Errors = %d\n\n", error_count); } /** * Compute reference data set * C = A * B * @param C reference data, computed but preallocated * @param A matrix A as provided to device * @param B matrix B as provided to device * @param hA height of matrix A * @param wB width of matrix B */ void computeReference(TYPE* C, const TYPE* A, const TYPE* B, unsigned int hA, unsigned int wA, unsigned int wB) { unsigned int i,j,k; for (i = 0; i < hA; ++i) for (j = 0; j < wB; ++j) { double sum = 0; for (k = 0; k < wA; ++k) { double a = A[i * wA + k]; double b = B[k * wB + j]; sum += a * b; } C[i * wB + j] = (TYPE)sum; } } starpu-1.2.3+dfsg/socl/examples/testmap/000077500000000000000000000000001320135501600202015ustar00rootroot00000000000000starpu-1.2.3+dfsg/socl/examples/testmap/testmap.c000066400000000000000000000170531320135501600220300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #ifdef __APPLE_CC__ #include #else #include #endif #define error(...) do { fprintf(stderr, "Error: " __VA_ARGS__); exit(EXIT_FAILURE); } while(0) #define check(err, str) do { if(err != CL_SUCCESS) { fprintf(stderr, "OpenCL Error (%d): %s\n",err, str); exit(EXIT_FAILURE); }} while(0) #ifdef UNUSED #elif defined(__GNUC__) # define UNUSED(x) UNUSED_ ## x __attribute__((unused)) #else # define UNUSED(x) x #endif #define SIZE 1024 #define TYPE float #define REALSIZE (SIZE * sizeof(TYPE)) const char * kernel_src = "__kernel void add(__global float*s1, __global float*s2, __global float*d) { \ size_t x = get_global_id(0);\n\ size_t y = get_global_id(1);\n\ size_t w = get_global_size(0); \n\ int idx = y*w+x; \n\ #ifdef SOCL_DEVICE_TYPE_GPU \n\ d[idx] = s1[idx] + s2[idx];\n\ #endif \n\ #ifdef SOCL_DEVICE_TYPE_CPU \n\ d[idx] = s1[idx] + 2* s2[idx];\n\ #endif \n\ #ifdef SOCL_DEVICE_TYPE_ACCELERATOR \n\ d[idx] = s1[idx] + 3 * s2[idx];\n\ #endif \n\ #ifdef SOCL_DEVICE_TYPE_UNKNOWN \n\ d[idx] = s1[idx] + 4 * s2[idx];\n\ #endif \n\ }"; int main(int UNUSED(argc), char** UNUSED(argv)) { cl_platform_id platforms[15]; cl_uint num_platforms; cl_device_id devices[15]; cl_uint num_devices; cl_context context; cl_program program; cl_kernel kernel; cl_mem s1m, s2m, dm; cl_command_queue cq; cl_int err; unsigned int i; TYPE * s1, *s2, d[SIZE]; printf("Querying platform...\n"); err = clGetPlatformIDs(0, NULL, &num_platforms); if (num_platforms == 0) { printf("No OpenCL platform found.\n"); exit(77); } err = clGetPlatformIDs(sizeof(platforms)/sizeof(cl_platform_id), platforms, &num_platforms); check(err, "clGetPlatformIDs"); int platform_idx = -1; for (i=0; i #else #include "cl_platform.h" #endif #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ typedef struct _cl_platform_id * cl_platform_id; typedef struct _cl_device_id * cl_device_id; typedef struct _cl_context * cl_context; typedef struct _cl_command_queue * cl_command_queue; typedef struct _cl_mem * cl_mem; typedef struct _cl_program * cl_program; typedef struct _cl_kernel * cl_kernel; typedef struct _cl_event * cl_event; typedef struct _cl_sampler * cl_sampler; typedef cl_uint cl_bool; /* WARNING! Unlike cl_ types in cl_platform.h, cl_bool is not guaranteed to be the same size as the bool in kernels. */ typedef cl_ulong cl_bitfield; typedef cl_bitfield cl_device_type; typedef cl_uint cl_platform_info; typedef cl_uint cl_device_info; typedef cl_bitfield cl_device_fp_config; typedef cl_uint cl_device_mem_cache_type; typedef cl_uint cl_device_local_mem_type; typedef cl_bitfield cl_device_exec_capabilities; typedef cl_bitfield cl_command_queue_properties; typedef intptr_t cl_device_partition_property; typedef cl_bitfield cl_device_affinity_domain; typedef intptr_t cl_context_properties; typedef cl_uint cl_context_info; typedef cl_uint cl_command_queue_info; typedef cl_uint cl_channel_order; typedef cl_uint cl_channel_type; typedef cl_bitfield cl_mem_flags; typedef cl_uint cl_mem_object_type; typedef cl_uint cl_mem_info; typedef cl_bitfield cl_mem_migration_flags; typedef cl_uint cl_image_info; typedef cl_uint cl_buffer_create_type; typedef cl_uint cl_addressing_mode; typedef cl_uint cl_filter_mode; typedef cl_uint cl_sampler_info; typedef cl_bitfield cl_map_flags; typedef cl_uint cl_program_info; typedef cl_uint cl_program_build_info; typedef cl_uint cl_program_binary_type; typedef cl_int cl_build_status; typedef cl_uint cl_kernel_info; typedef cl_uint cl_kernel_arg_info; typedef cl_uint cl_kernel_arg_address_qualifier; typedef cl_uint cl_kernel_arg_access_qualifier; typedef cl_bitfield cl_kernel_arg_type_qualifier; typedef cl_uint cl_kernel_work_group_info; typedef cl_uint cl_event_info; typedef cl_uint cl_command_type; typedef cl_uint cl_profiling_info; typedef struct _cl_image_format { cl_channel_order image_channel_order; cl_channel_type image_channel_data_type; } cl_image_format; typedef struct _cl_image_desc { cl_mem_object_type image_type; size_t image_width; size_t image_height; size_t image_depth; size_t image_array_size; size_t image_row_pitch; size_t image_slice_pitch; cl_uint num_mip_levels; cl_uint num_samples; cl_mem buffer; } cl_image_desc; typedef struct _cl_buffer_region { size_t origin; size_t size; } cl_buffer_region; /******************************************************************************/ /* Error Codes */ #define CL_SUCCESS 0 #define CL_DEVICE_NOT_FOUND -1 #define CL_DEVICE_NOT_AVAILABLE -2 #define CL_COMPILER_NOT_AVAILABLE -3 #define CL_MEM_OBJECT_ALLOCATION_FAILURE -4 #define CL_OUT_OF_RESOURCES -5 #define CL_OUT_OF_HOST_MEMORY -6 #define CL_PROFILING_INFO_NOT_AVAILABLE -7 #define CL_MEM_COPY_OVERLAP -8 #define CL_IMAGE_FORMAT_MISMATCH -9 #define CL_IMAGE_FORMAT_NOT_SUPPORTED -10 #define CL_BUILD_PROGRAM_FAILURE -11 #define CL_MAP_FAILURE -12 #define CL_MISALIGNED_SUB_BUFFER_OFFSET -13 #define CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST -14 #define CL_COMPILE_PROGRAM_FAILURE -15 #define CL_LINKER_NOT_AVAILABLE -16 #define CL_LINK_PROGRAM_FAILURE -17 #define CL_DEVICE_PARTITION_FAILED -18 #define CL_KERNEL_ARG_INFO_NOT_AVAILABLE -19 #define CL_INVALID_VALUE -30 #define CL_INVALID_DEVICE_TYPE -31 #define CL_INVALID_PLATFORM -32 #define CL_INVALID_DEVICE -33 #define CL_INVALID_CONTEXT -34 #define CL_INVALID_QUEUE_PROPERTIES -35 #define CL_INVALID_COMMAND_QUEUE -36 #define CL_INVALID_HOST_PTR -37 #define CL_INVALID_MEM_OBJECT -38 #define CL_INVALID_IMAGE_FORMAT_DESCRIPTOR -39 #define CL_INVALID_IMAGE_SIZE -40 #define CL_INVALID_SAMPLER -41 #define CL_INVALID_BINARY -42 #define CL_INVALID_BUILD_OPTIONS -43 #define CL_INVALID_PROGRAM -44 #define CL_INVALID_PROGRAM_EXECUTABLE -45 #define CL_INVALID_KERNEL_NAME -46 #define CL_INVALID_KERNEL_DEFINITION -47 #define CL_INVALID_KERNEL -48 #define CL_INVALID_ARG_INDEX -49 #define CL_INVALID_ARG_VALUE -50 #define CL_INVALID_ARG_SIZE -51 #define CL_INVALID_KERNEL_ARGS -52 #define CL_INVALID_WORK_DIMENSION -53 #define CL_INVALID_WORK_GROUP_SIZE -54 #define CL_INVALID_WORK_ITEM_SIZE -55 #define CL_INVALID_GLOBAL_OFFSET -56 #define CL_INVALID_EVENT_WAIT_LIST -57 #define CL_INVALID_EVENT -58 #define CL_INVALID_OPERATION -59 #define CL_INVALID_GL_OBJECT -60 #define CL_INVALID_BUFFER_SIZE -61 #define CL_INVALID_MIP_LEVEL -62 #define CL_INVALID_GLOBAL_WORK_SIZE -63 #define CL_INVALID_PROPERTY -64 #define CL_INVALID_IMAGE_DESCRIPTOR -65 #define CL_INVALID_COMPILER_OPTIONS -66 #define CL_INVALID_LINKER_OPTIONS -67 #define CL_INVALID_DEVICE_PARTITION_COUNT -68 /* OpenCL Version */ #define CL_VERSION_1_0 1 #define CL_VERSION_1_1 1 #define CL_VERSION_1_2 1 /* cl_bool */ #define CL_FALSE 0 #define CL_TRUE 1 #define CL_BLOCKING CL_TRUE #define CL_NON_BLOCKING CL_FALSE /* cl_platform_info */ #define CL_PLATFORM_PROFILE 0x0900 #define CL_PLATFORM_VERSION 0x0901 #define CL_PLATFORM_NAME 0x0902 #define CL_PLATFORM_VENDOR 0x0903 #define CL_PLATFORM_EXTENSIONS 0x0904 /* cl_device_type - bitfield */ #define CL_DEVICE_TYPE_DEFAULT (1 << 0) #define CL_DEVICE_TYPE_CPU (1 << 1) #define CL_DEVICE_TYPE_GPU (1 << 2) #define CL_DEVICE_TYPE_ACCELERATOR (1 << 3) #define CL_DEVICE_TYPE_CUSTOM (1 << 4) #define CL_DEVICE_TYPE_ALL 0xFFFFFFFF /* cl_device_info */ #define CL_DEVICE_TYPE 0x1000 #define CL_DEVICE_VENDOR_ID 0x1001 #define CL_DEVICE_MAX_COMPUTE_UNITS 0x1002 #define CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS 0x1003 #define CL_DEVICE_MAX_WORK_GROUP_SIZE 0x1004 #define CL_DEVICE_MAX_WORK_ITEM_SIZES 0x1005 #define CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR 0x1006 #define CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT 0x1007 #define CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT 0x1008 #define CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG 0x1009 #define CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT 0x100A #define CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE 0x100B #define CL_DEVICE_MAX_CLOCK_FREQUENCY 0x100C #define CL_DEVICE_ADDRESS_BITS 0x100D #define CL_DEVICE_MAX_READ_IMAGE_ARGS 0x100E #define CL_DEVICE_MAX_WRITE_IMAGE_ARGS 0x100F #define CL_DEVICE_MAX_MEM_ALLOC_SIZE 0x1010 #define CL_DEVICE_IMAGE2D_MAX_WIDTH 0x1011 #define CL_DEVICE_IMAGE2D_MAX_HEIGHT 0x1012 #define CL_DEVICE_IMAGE3D_MAX_WIDTH 0x1013 #define CL_DEVICE_IMAGE3D_MAX_HEIGHT 0x1014 #define CL_DEVICE_IMAGE3D_MAX_DEPTH 0x1015 #define CL_DEVICE_IMAGE_SUPPORT 0x1016 #define CL_DEVICE_MAX_PARAMETER_SIZE 0x1017 #define CL_DEVICE_MAX_SAMPLERS 0x1018 #define CL_DEVICE_MEM_BASE_ADDR_ALIGN 0x1019 #define CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE 0x101A #define CL_DEVICE_SINGLE_FP_CONFIG 0x101B #define CL_DEVICE_GLOBAL_MEM_CACHE_TYPE 0x101C #define CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE 0x101D #define CL_DEVICE_GLOBAL_MEM_CACHE_SIZE 0x101E #define CL_DEVICE_GLOBAL_MEM_SIZE 0x101F #define CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE 0x1020 #define CL_DEVICE_MAX_CONSTANT_ARGS 0x1021 #define CL_DEVICE_LOCAL_MEM_TYPE 0x1022 #define CL_DEVICE_LOCAL_MEM_SIZE 0x1023 #define CL_DEVICE_ERROR_CORRECTION_SUPPORT 0x1024 #define CL_DEVICE_PROFILING_TIMER_RESOLUTION 0x1025 #define CL_DEVICE_ENDIAN_LITTLE 0x1026 #define CL_DEVICE_AVAILABLE 0x1027 #define CL_DEVICE_COMPILER_AVAILABLE 0x1028 #define CL_DEVICE_EXECUTION_CAPABILITIES 0x1029 #define CL_DEVICE_QUEUE_PROPERTIES 0x102A #define CL_DEVICE_NAME 0x102B #define CL_DEVICE_VENDOR 0x102C #define CL_DRIVER_VERSION 0x102D #define CL_DEVICE_PROFILE 0x102E #define CL_DEVICE_VERSION 0x102F #define CL_DEVICE_EXTENSIONS 0x1030 #define CL_DEVICE_PLATFORM 0x1031 #define CL_DEVICE_DOUBLE_FP_CONFIG 0x1032 /* 0x1033 reserved for CL_DEVICE_HALF_FP_CONFIG */ #define CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF 0x1034 #define CL_DEVICE_HOST_UNIFIED_MEMORY 0x1035 #define CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR 0x1036 #define CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT 0x1037 #define CL_DEVICE_NATIVE_VECTOR_WIDTH_INT 0x1038 #define CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG 0x1039 #define CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT 0x103A #define CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE 0x103B #define CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF 0x103C #define CL_DEVICE_OPENCL_C_VERSION 0x103D #define CL_DEVICE_LINKER_AVAILABLE 0x103E #define CL_DEVICE_BUILT_IN_KERNELS 0x103F #define CL_DEVICE_IMAGE_MAX_BUFFER_SIZE 0x1040 #define CL_DEVICE_IMAGE_MAX_ARRAY_SIZE 0x1041 #define CL_DEVICE_PARENT_DEVICE 0x1042 #define CL_DEVICE_PARTITION_MAX_SUB_DEVICES 0x1043 #define CL_DEVICE_PARTITION_PROPERTIES 0x1044 #define CL_DEVICE_PARTITION_AFFINITY_DOMAIN 0x1045 #define CL_DEVICE_PARTITION_TYPE 0x1046 #define CL_DEVICE_REFERENCE_COUNT 0x1047 #define CL_DEVICE_PREFERRED_INTEROP_USER_SYNC 0x1048 #define CL_DEVICE_PRINTF_BUFFER_SIZE 0x1049 /* cl_device_fp_config - bitfield */ #define CL_FP_DENORM (1 << 0) #define CL_FP_INF_NAN (1 << 1) #define CL_FP_ROUND_TO_NEAREST (1 << 2) #define CL_FP_ROUND_TO_ZERO (1 << 3) #define CL_FP_ROUND_TO_INF (1 << 4) #define CL_FP_FMA (1 << 5) #define CL_FP_SOFT_FLOAT (1 << 6) #define CL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT (1 << 7) /* cl_device_mem_cache_type */ #define CL_NONE 0x0 #define CL_READ_ONLY_CACHE 0x1 #define CL_READ_WRITE_CACHE 0x2 /* cl_device_local_mem_type */ #define CL_LOCAL 0x1 #define CL_GLOBAL 0x2 /* cl_device_exec_capabilities - bitfield */ #define CL_EXEC_KERNEL (1 << 0) #define CL_EXEC_NATIVE_KERNEL (1 << 1) /* cl_command_queue_properties - bitfield */ #define CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE (1 << 0) #define CL_QUEUE_PROFILING_ENABLE (1 << 1) /* cl_context_info */ #define CL_CONTEXT_REFERENCE_COUNT 0x1080 #define CL_CONTEXT_DEVICES 0x1081 #define CL_CONTEXT_PROPERTIES 0x1082 #define CL_CONTEXT_NUM_DEVICES 0x1083 /* cl_context_properties */ #define CL_CONTEXT_PLATFORM 0x1084 #define CL_CONTEXT_INTEROP_USER_SYNC 0x1085 /* cl_device_partition_property */ #define CL_DEVICE_PARTITION_EQUALLY 0x1086 #define CL_DEVICE_PARTITION_BY_COUNTS 0x1087 #define CL_DEVICE_PARTITION_BY_COUNTS_LIST_END 0x0 #define CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN 0x1088 /* cl_device_affinity_domain */ #define CL_DEVICE_AFFINITY_DOMAIN_NUMA (1 << 0) #define CL_DEVICE_AFFINITY_DOMAIN_L4_CACHE (1 << 1) #define CL_DEVICE_AFFINITY_DOMAIN_L3_CACHE (1 << 2) #define CL_DEVICE_AFFINITY_DOMAIN_L2_CACHE (1 << 3) #define CL_DEVICE_AFFINITY_DOMAIN_L1_CACHE (1 << 4) #define CL_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE (1 << 5) /* cl_command_queue_info */ #define CL_QUEUE_CONTEXT 0x1090 #define CL_QUEUE_DEVICE 0x1091 #define CL_QUEUE_REFERENCE_COUNT 0x1092 #define CL_QUEUE_PROPERTIES 0x1093 /* cl_mem_flags - bitfield */ #define CL_MEM_READ_WRITE (1 << 0) #define CL_MEM_WRITE_ONLY (1 << 1) #define CL_MEM_READ_ONLY (1 << 2) #define CL_MEM_USE_HOST_PTR (1 << 3) #define CL_MEM_ALLOC_HOST_PTR (1 << 4) #define CL_MEM_COPY_HOST_PTR (1 << 5) // reserved (1 << 6) #define CL_MEM_HOST_WRITE_ONLY (1 << 7) #define CL_MEM_HOST_READ_ONLY (1 << 8) #define CL_MEM_HOST_NO_ACCESS (1 << 9) /* cl_mem_migration_flags - bitfield */ #define CL_MIGRATE_MEM_OBJECT_HOST (1 << 0) #define CL_MIGRATE_MEM_OBJECT_CONTENT_UNDEFINED (1 << 1) /* cl_channel_order */ #define CL_R 0x10B0 #define CL_A 0x10B1 #define CL_RG 0x10B2 #define CL_RA 0x10B3 #define CL_RGB 0x10B4 #define CL_RGBA 0x10B5 #define CL_BGRA 0x10B6 #define CL_ARGB 0x10B7 #define CL_INTENSITY 0x10B8 #define CL_LUMINANCE 0x10B9 #define CL_Rx 0x10BA #define CL_RGx 0x10BB #define CL_RGBx 0x10BC /* cl_channel_type */ #define CL_SNORM_INT8 0x10D0 #define CL_SNORM_INT16 0x10D1 #define CL_UNORM_INT8 0x10D2 #define CL_UNORM_INT16 0x10D3 #define CL_UNORM_SHORT_565 0x10D4 #define CL_UNORM_SHORT_555 0x10D5 #define CL_UNORM_INT_101010 0x10D6 #define CL_SIGNED_INT8 0x10D7 #define CL_SIGNED_INT16 0x10D8 #define CL_SIGNED_INT32 0x10D9 #define CL_UNSIGNED_INT8 0x10DA #define CL_UNSIGNED_INT16 0x10DB #define CL_UNSIGNED_INT32 0x10DC #define CL_HALF_FLOAT 0x10DD #define CL_FLOAT 0x10DE /* cl_mem_object_type */ #define CL_MEM_OBJECT_BUFFER 0x10F0 #define CL_MEM_OBJECT_IMAGE2D 0x10F1 #define CL_MEM_OBJECT_IMAGE3D 0x10F2 #define CL_MEM_OBJECT_IMAGE2D_ARRAY 0x10F3 #define CL_MEM_OBJECT_IMAGE1D 0x10F4 #define CL_MEM_OBJECT_IMAGE1D_ARRAY 0x10F5 #define CL_MEM_OBJECT_IMAGE1D_BUFFER 0x10F6 /* cl_mem_info */ #define CL_MEM_TYPE 0x1100 #define CL_MEM_FLAGS 0x1101 #define CL_MEM_SIZE 0x1102 #define CL_MEM_HOST_PTR 0x1103 #define CL_MEM_MAP_COUNT 0x1104 #define CL_MEM_REFERENCE_COUNT 0x1105 #define CL_MEM_CONTEXT 0x1106 #define CL_MEM_ASSOCIATED_MEMOBJECT 0x1107 #define CL_MEM_OFFSET 0x1108 /* cl_image_info */ #define CL_IMAGE_FORMAT 0x1110 #define CL_IMAGE_ELEMENT_SIZE 0x1111 #define CL_IMAGE_ROW_PITCH 0x1112 #define CL_IMAGE_SLICE_PITCH 0x1113 #define CL_IMAGE_WIDTH 0x1114 #define CL_IMAGE_HEIGHT 0x1115 #define CL_IMAGE_DEPTH 0x1116 #define CL_IMAGE_ARRAY_SIZE 0x1117 #define CL_IMAGE_BUFFER 0x1118 #define CL_IMAGE_NUM_MIP_LEVELS 0x1119 #define CL_IMAGE_NUM_SAMPLES 0x111A /* cl_addressing_mode */ #define CL_ADDRESS_NONE 0x1130 #define CL_ADDRESS_CLAMP_TO_EDGE 0x1131 #define CL_ADDRESS_CLAMP 0x1132 #define CL_ADDRESS_REPEAT 0x1133 #define CL_ADDRESS_MIRRORED_REPEAT 0x1134 /* cl_filter_mode */ #define CL_FILTER_NEAREST 0x1140 #define CL_FILTER_LINEAR 0x1141 /* cl_sampler_info */ #define CL_SAMPLER_REFERENCE_COUNT 0x1150 #define CL_SAMPLER_CONTEXT 0x1151 #define CL_SAMPLER_NORMALIZED_COORDS 0x1152 #define CL_SAMPLER_ADDRESSING_MODE 0x1153 #define CL_SAMPLER_FILTER_MODE 0x1154 /* cl_map_flags - bitfield */ #define CL_MAP_READ (1 << 0) #define CL_MAP_WRITE (1 << 1) #define CL_MAP_WRITE_INVALIDATE_REGION (1 << 2) /* cl_program_info */ #define CL_PROGRAM_REFERENCE_COUNT 0x1160 #define CL_PROGRAM_CONTEXT 0x1161 #define CL_PROGRAM_NUM_DEVICES 0x1162 #define CL_PROGRAM_DEVICES 0x1163 #define CL_PROGRAM_SOURCE 0x1164 #define CL_PROGRAM_BINARY_SIZES 0x1165 #define CL_PROGRAM_BINARIES 0x1166 #define CL_PROGRAM_NUM_KERNELS 0x1167 #define CL_PROGRAM_KERNEL_NAMES 0x1168 /* cl_program_build_info */ #define CL_PROGRAM_BUILD_STATUS 0x1181 #define CL_PROGRAM_BUILD_OPTIONS 0x1182 #define CL_PROGRAM_BUILD_LOG 0x1183 #define CL_PROGRAM_BINARY_TYPE 0x1184 /* cl_program_binary_type */ #define CL_PROGRAM_BINARY_TYPE_NONE 0x0 #define CL_PROGRAM_BINARY_TYPE_COMPILED_OBJECT 0x1 #define CL_PROGRAM_BINARY_TYPE_LIBRARY 0x2 #define CL_PROGRAM_BINARY_TYPE_EXECUTABLE 0x4 /* cl_build_status */ #define CL_BUILD_SUCCESS 0 #define CL_BUILD_NONE -1 #define CL_BUILD_ERROR -2 #define CL_BUILD_IN_PROGRESS -3 /* cl_kernel_info */ #define CL_KERNEL_FUNCTION_NAME 0x1190 #define CL_KERNEL_NUM_ARGS 0x1191 #define CL_KERNEL_REFERENCE_COUNT 0x1192 #define CL_KERNEL_CONTEXT 0x1193 #define CL_KERNEL_PROGRAM 0x1194 #define CL_KERNEL_ATTRIBUTES 0x1195 /* cl_kernel_arg_info */ #define CL_KERNEL_ARG_ADDRESS_QUALIFIER 0x1196 #define CL_KERNEL_ARG_ACCESS_QUALIFIER 0x1197 #define CL_KERNEL_ARG_TYPE_NAME 0x1198 #define CL_KERNEL_ARG_TYPE_QUALIFIER 0x1199 #define CL_KERNEL_ARG_NAME 0x119A /* cl_kernel_arg_address_qualifier */ #define CL_KERNEL_ARG_ADDRESS_GLOBAL 0x119B #define CL_KERNEL_ARG_ADDRESS_LOCAL 0x119C #define CL_KERNEL_ARG_ADDRESS_CONSTANT 0x119D #define CL_KERNEL_ARG_ADDRESS_PRIVATE 0x119E /* cl_kernel_arg_access_qualifier */ #define CL_KERNEL_ARG_ACCESS_READ_ONLY 0x11A0 #define CL_KERNEL_ARG_ACCESS_WRITE_ONLY 0x11A1 #define CL_KERNEL_ARG_ACCESS_READ_WRITE 0x11A2 #define CL_KERNEL_ARG_ACCESS_NONE 0x11A3 /* cl_kernel_arg_type_qualifer */ #define CL_KERNEL_ARG_TYPE_NONE 0 #define CL_KERNEL_ARG_TYPE_CONST (1 << 0) #define CL_KERNEL_ARG_TYPE_RESTRICT (1 << 1) #define CL_KERNEL_ARG_TYPE_VOLATILE (1 << 2) /* cl_kernel_work_group_info */ #define CL_KERNEL_WORK_GROUP_SIZE 0x11B0 #define CL_KERNEL_COMPILE_WORK_GROUP_SIZE 0x11B1 #define CL_KERNEL_LOCAL_MEM_SIZE 0x11B2 #define CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE 0x11B3 #define CL_KERNEL_PRIVATE_MEM_SIZE 0x11B4 #define CL_KERNEL_GLOBAL_WORK_SIZE 0x11B5 /* cl_event_info */ #define CL_EVENT_COMMAND_QUEUE 0x11D0 #define CL_EVENT_COMMAND_TYPE 0x11D1 #define CL_EVENT_REFERENCE_COUNT 0x11D2 #define CL_EVENT_COMMAND_EXECUTION_STATUS 0x11D3 #define CL_EVENT_CONTEXT 0x11D4 /* cl_command_type */ #define CL_COMMAND_NDRANGE_KERNEL 0x11F0 #define CL_COMMAND_TASK 0x11F1 #define CL_COMMAND_NATIVE_KERNEL 0x11F2 #define CL_COMMAND_READ_BUFFER 0x11F3 #define CL_COMMAND_WRITE_BUFFER 0x11F4 #define CL_COMMAND_COPY_BUFFER 0x11F5 #define CL_COMMAND_READ_IMAGE 0x11F6 #define CL_COMMAND_WRITE_IMAGE 0x11F7 #define CL_COMMAND_COPY_IMAGE 0x11F8 #define CL_COMMAND_COPY_IMAGE_TO_BUFFER 0x11F9 #define CL_COMMAND_COPY_BUFFER_TO_IMAGE 0x11FA #define CL_COMMAND_MAP_BUFFER 0x11FB #define CL_COMMAND_MAP_IMAGE 0x11FC #define CL_COMMAND_UNMAP_MEM_OBJECT 0x11FD #define CL_COMMAND_MARKER 0x11FE #define CL_COMMAND_ACQUIRE_GL_OBJECTS 0x11FF #define CL_COMMAND_RELEASE_GL_OBJECTS 0x1200 #define CL_COMMAND_READ_BUFFER_RECT 0x1201 #define CL_COMMAND_WRITE_BUFFER_RECT 0x1202 #define CL_COMMAND_COPY_BUFFER_RECT 0x1203 #define CL_COMMAND_USER 0x1204 #define CL_COMMAND_BARRIER 0x1205 #define CL_COMMAND_MIGRATE_MEM_OBJECTS 0x1206 #define CL_COMMAND_FILL_BUFFER 0x1207 #define CL_COMMAND_FILL_IMAGE 0x1208 /* command execution status */ #define CL_COMPLETE 0x0 #define CL_RUNNING 0x1 #define CL_SUBMITTED 0x2 #define CL_QUEUED 0x3 /* cl_buffer_create_type */ #define CL_BUFFER_CREATE_TYPE_REGION 0x1220 /* cl_profiling_info */ #define CL_PROFILING_COMMAND_QUEUED 0x1280 #define CL_PROFILING_COMMAND_SUBMIT 0x1281 #define CL_PROFILING_COMMAND_START 0x1282 #define CL_PROFILING_COMMAND_END 0x1283 /********************************************************************************************************/ /* Platform API */ extern CL_API_ENTRY cl_int CL_API_CALL clGetPlatformIDs(cl_uint /* num_entries */, cl_platform_id * /* platforms */, cl_uint * /* num_platforms */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clGetPlatformInfo(cl_platform_id /* platform */, cl_platform_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; /* Device APIs */ extern CL_API_ENTRY cl_int CL_API_CALL clGetDeviceIDs(cl_platform_id /* platform */, cl_device_type /* device_type */, cl_uint /* num_entries */, cl_device_id * /* devices */, cl_uint * /* num_devices */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clGetDeviceInfo(cl_device_id /* device */, cl_device_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clCreateSubDevices(cl_device_id /* in_device */, const cl_device_partition_property * /* properties */, cl_uint /* num_devices */, cl_device_id * /* out_devices */, cl_uint * /* num_devices_ret */) CL_API_SUFFIX__VERSION_1_2; extern CL_API_ENTRY cl_int CL_API_CALL clRetainDevice(cl_device_id /* device */) CL_API_SUFFIX__VERSION_1_2; extern CL_API_ENTRY cl_int CL_API_CALL clReleaseDevice(cl_device_id /* device */) CL_API_SUFFIX__VERSION_1_2; /* Context APIs */ extern CL_API_ENTRY cl_context CL_API_CALL clCreateContext(const cl_context_properties * /* properties */, cl_uint /* num_devices */, const cl_device_id * /* devices */, void (CL_CALLBACK * /* pfn_notify */)(const char *, const void *, size_t, void *), void * /* user_data */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_context CL_API_CALL clCreateContextFromType(const cl_context_properties * /* properties */, cl_device_type /* device_type */, void (CL_CALLBACK * /* pfn_notify*/ )(const char *, const void *, size_t, void *), void * /* user_data */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clRetainContext(cl_context /* context */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clReleaseContext(cl_context /* context */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clGetContextInfo(cl_context /* context */, cl_context_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; /* Command Queue APIs */ extern CL_API_ENTRY cl_command_queue CL_API_CALL clCreateCommandQueue(cl_context /* context */, cl_device_id /* device */, cl_command_queue_properties /* properties */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clRetainCommandQueue(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clReleaseCommandQueue(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clGetCommandQueueInfo(cl_command_queue /* command_queue */, cl_command_queue_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; /* Memory Object APIs */ extern CL_API_ENTRY cl_mem CL_API_CALL clCreateBuffer(cl_context /* context */, cl_mem_flags /* flags */, size_t /* size */, void * /* host_ptr */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_mem CL_API_CALL clCreateSubBuffer(cl_mem /* buffer */, cl_mem_flags /* flags */, cl_buffer_create_type /* buffer_create_type */, const void * /* buffer_create_info */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_1; extern CL_API_ENTRY cl_mem CL_API_CALL clCreateImage(cl_context /* context */, cl_mem_flags /* flags */, const cl_image_format * /* image_format */, const cl_image_desc * /* image_desc */, void * /* host_ptr */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_2; extern CL_API_ENTRY cl_int CL_API_CALL clRetainMemObject(cl_mem /* memobj */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clReleaseMemObject(cl_mem /* memobj */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clGetSupportedImageFormats(cl_context /* context */, cl_mem_flags /* flags */, cl_mem_object_type /* image_type */, cl_uint /* num_entries */, cl_image_format * /* image_formats */, cl_uint * /* num_image_formats */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clGetMemObjectInfo(cl_mem /* memobj */, cl_mem_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clGetImageInfo(cl_mem /* image */, cl_image_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clSetMemObjectDestructorCallback( cl_mem /* memobj */, void (CL_CALLBACK * /*pfn_notify*/)( cl_mem /* memobj */, void* /*user_data*/), void * /*user_data */ ) CL_API_SUFFIX__VERSION_1_1; /* Sampler APIs */ extern CL_API_ENTRY cl_sampler CL_API_CALL clCreateSampler(cl_context /* context */, cl_bool /* normalized_coords */, cl_addressing_mode /* addressing_mode */, cl_filter_mode /* filter_mode */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clRetainSampler(cl_sampler /* sampler */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clReleaseSampler(cl_sampler /* sampler */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clGetSamplerInfo(cl_sampler /* sampler */, cl_sampler_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; /* Program Object APIs */ extern CL_API_ENTRY cl_program CL_API_CALL clCreateProgramWithSource(cl_context /* context */, cl_uint /* count */, const char ** /* strings */, const size_t * /* lengths */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_program CL_API_CALL clCreateProgramWithBinary(cl_context /* context */, cl_uint /* num_devices */, const cl_device_id * /* device_list */, const size_t * /* lengths */, const unsigned char ** /* binaries */, cl_int * /* binary_status */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_program CL_API_CALL clCreateProgramWithBuiltInKernels(cl_context /* context */, cl_uint /* num_devices */, const cl_device_id * /* device_list */, const char * /* kernel_names */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_2; extern CL_API_ENTRY cl_int CL_API_CALL clRetainProgram(cl_program /* program */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clReleaseProgram(cl_program /* program */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clBuildProgram(cl_program /* program */, cl_uint /* num_devices */, const cl_device_id * /* device_list */, const char * /* options */, void (CL_CALLBACK * /* pfn_notify */)(cl_program /* program */, void * /* user_data */), void * /* user_data */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clCompileProgram(cl_program /* program */, cl_uint /* num_devices */, const cl_device_id * /* device_list */, const char * /* options */, cl_uint /* num_input_headers */, const cl_program * /* input_headers */, const char ** /* header_include_names */, void (CL_CALLBACK * /* pfn_notify */)(cl_program /* program */, void * /* user_data */), void * /* user_data */) CL_API_SUFFIX__VERSION_1_2; extern CL_API_ENTRY cl_program CL_API_CALL clLinkProgram(cl_context /* context */, cl_uint /* num_devices */, const cl_device_id * /* device_list */, const char * /* options */, cl_uint /* num_input_programs */, const cl_program * /* input_programs */, void (CL_CALLBACK * /* pfn_notify */)(cl_program /* program */, void * /* user_data */), void * /* user_data */, cl_int * /* errcode_ret */ ) CL_API_SUFFIX__VERSION_1_2; extern CL_API_ENTRY cl_int CL_API_CALL clUnloadPlatformCompiler(cl_platform_id /* platform */) CL_API_SUFFIX__VERSION_1_2; extern CL_API_ENTRY cl_int CL_API_CALL clGetProgramInfo(cl_program /* program */, cl_program_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clGetProgramBuildInfo(cl_program /* program */, cl_device_id /* device */, cl_program_build_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; /* Kernel Object APIs */ extern CL_API_ENTRY cl_kernel CL_API_CALL clCreateKernel(cl_program /* program */, const char * /* kernel_name */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clCreateKernelsInProgram(cl_program /* program */, cl_uint /* num_kernels */, cl_kernel * /* kernels */, cl_uint * /* num_kernels_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clRetainKernel(cl_kernel /* kernel */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clReleaseKernel(cl_kernel /* kernel */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clSetKernelArg(cl_kernel /* kernel */, cl_uint /* arg_index */, size_t /* arg_size */, const void * /* arg_value */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clGetKernelInfo(cl_kernel /* kernel */, cl_kernel_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clGetKernelArgInfo(cl_kernel /* kernel */, cl_uint /* arg_indx */, cl_kernel_arg_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_2; extern CL_API_ENTRY cl_int CL_API_CALL clGetKernelWorkGroupInfo(cl_kernel /* kernel */, cl_device_id /* device */, cl_kernel_work_group_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; /* Event Object APIs */ extern CL_API_ENTRY cl_int CL_API_CALL clWaitForEvents(cl_uint /* num_events */, const cl_event * /* event_list */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clGetEventInfo(cl_event /* event */, cl_event_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_event CL_API_CALL clCreateUserEvent(cl_context /* context */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_1; extern CL_API_ENTRY cl_int CL_API_CALL clRetainEvent(cl_event /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clReleaseEvent(cl_event /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clSetUserEventStatus(cl_event /* event */, cl_int /* execution_status */) CL_API_SUFFIX__VERSION_1_1; extern CL_API_ENTRY cl_int CL_API_CALL clSetEventCallback( cl_event /* event */, cl_int /* command_exec_callback_type */, void (CL_CALLBACK * /* pfn_notify */)(cl_event, cl_int, void *), void * /* user_data */) CL_API_SUFFIX__VERSION_1_1; /* Profiling APIs */ extern CL_API_ENTRY cl_int CL_API_CALL clGetEventProfilingInfo(cl_event /* event */, cl_profiling_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; /* Flush and Finish APIs */ extern CL_API_ENTRY cl_int CL_API_CALL clFlush(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clFinish(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; /* Enqueued Commands APIs */ extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueReadBuffer(cl_command_queue /* command_queue */, cl_mem /* buffer */, cl_bool /* blocking_read */, size_t /* offset */, size_t /* size */, void * /* ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueReadBufferRect(cl_command_queue /* command_queue */, cl_mem /* buffer */, cl_bool /* blocking_read */, const size_t * /* buffer_offset */, const size_t * /* host_offset */, const size_t * /* region */, size_t /* buffer_row_pitch */, size_t /* buffer_slice_pitch */, size_t /* host_row_pitch */, size_t /* host_slice_pitch */, void * /* ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_1; extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueWriteBuffer(cl_command_queue /* command_queue */, cl_mem /* buffer */, cl_bool /* blocking_write */, size_t /* offset */, size_t /* size */, const void * /* ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueWriteBufferRect(cl_command_queue /* command_queue */, cl_mem /* buffer */, cl_bool /* blocking_write */, const size_t * /* buffer_offset */, const size_t * /* host_offset */, const size_t * /* region */, size_t /* buffer_row_pitch */, size_t /* buffer_slice_pitch */, size_t /* host_row_pitch */, size_t /* host_slice_pitch */, const void * /* ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_1; extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueFillBuffer(cl_command_queue /* command_queue */, cl_mem /* buffer */, const void * /* pattern */, size_t /* pattern_size */, size_t /* offset */, size_t /* size */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_2; extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueCopyBuffer(cl_command_queue /* command_queue */, cl_mem /* src_buffer */, cl_mem /* dst_buffer */, size_t /* src_offset */, size_t /* dst_offset */, size_t /* size */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueCopyBufferRect(cl_command_queue /* command_queue */, cl_mem /* src_buffer */, cl_mem /* dst_buffer */, const size_t * /* src_origin */, const size_t * /* dst_origin */, const size_t * /* region */, size_t /* src_row_pitch */, size_t /* src_slice_pitch */, size_t /* dst_row_pitch */, size_t /* dst_slice_pitch */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_1; extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueReadImage(cl_command_queue /* command_queue */, cl_mem /* image */, cl_bool /* blocking_read */, const size_t * /* origin[3] */, const size_t * /* region[3] */, size_t /* row_pitch */, size_t /* slice_pitch */, void * /* ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueWriteImage(cl_command_queue /* command_queue */, cl_mem /* image */, cl_bool /* blocking_write */, const size_t * /* origin[3] */, const size_t * /* region[3] */, size_t /* input_row_pitch */, size_t /* input_slice_pitch */, const void * /* ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueFillImage(cl_command_queue /* command_queue */, cl_mem /* image */, const void * /* fill_color */, const size_t * /* origin[3] */, const size_t * /* region[3] */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_2; extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueCopyImage(cl_command_queue /* command_queue */, cl_mem /* src_image */, cl_mem /* dst_image */, const size_t * /* src_origin[3] */, const size_t * /* dst_origin[3] */, const size_t * /* region[3] */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueCopyImageToBuffer(cl_command_queue /* command_queue */, cl_mem /* src_image */, cl_mem /* dst_buffer */, const size_t * /* src_origin[3] */, const size_t * /* region[3] */, size_t /* dst_offset */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueCopyBufferToImage(cl_command_queue /* command_queue */, cl_mem /* src_buffer */, cl_mem /* dst_image */, size_t /* src_offset */, const size_t * /* dst_origin[3] */, const size_t * /* region[3] */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY void * CL_API_CALL clEnqueueMapBuffer(cl_command_queue /* command_queue */, cl_mem /* buffer */, cl_bool /* blocking_map */, cl_map_flags /* map_flags */, size_t /* offset */, size_t /* size */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY void * CL_API_CALL clEnqueueMapImage(cl_command_queue /* command_queue */, cl_mem /* image */, cl_bool /* blocking_map */, cl_map_flags /* map_flags */, const size_t * /* origin[3] */, const size_t * /* region[3] */, size_t * /* image_row_pitch */, size_t * /* image_slice_pitch */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueUnmapMemObject(cl_command_queue /* command_queue */, cl_mem /* memobj */, void * /* mapped_ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueMigrateMemObjects(cl_command_queue /* command_queue */, cl_uint /* num_mem_objects */, const cl_mem * /* mem_objects */, cl_mem_migration_flags /* flags */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_2; extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueNDRangeKernel(cl_command_queue /* command_queue */, cl_kernel /* kernel */, cl_uint /* work_dim */, const size_t * /* global_work_offset */, const size_t * /* global_work_size */, const size_t * /* local_work_size */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueTask(cl_command_queue /* command_queue */, cl_kernel /* kernel */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueNativeKernel(cl_command_queue /* command_queue */, void (CL_CALLBACK * /*user_func*/)(void *), void * /* args */, size_t /* cb_args */, cl_uint /* num_mem_objects */, const cl_mem * /* mem_list */, const void ** /* args_mem_loc */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueMarkerWithWaitList(cl_command_queue /* command_queue */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_2; extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueBarrierWithWaitList(cl_command_queue /* command_queue */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_2; extern CL_API_ENTRY cl_int CL_API_CALL clSetPrintfCallback(cl_context /* context */, void (CL_CALLBACK * /* pfn_notify */)(cl_context /* program */, cl_uint /*printf_data_len */, char * /* printf_data_ptr */, void * /* user_data */), void * /* user_data */) CL_API_SUFFIX__VERSION_1_2; /* Extension function access * * Returns the extension function address for the given function name, * or NULL if a valid function can not be found. The client must * check to make sure the address is not NULL, before using or * calling the returned function address. */ extern CL_API_ENTRY void * CL_API_CALL clGetExtensionFunctionAddressForPlatform(cl_platform_id /* platform */, const char * /* func_name */) CL_API_SUFFIX__VERSION_1_2; #ifdef CL_USE_DEPRECATED_OPENCL_1_0_APIS #warning CL_USE_DEPRECATED_OPENCL_1_0_APIS is defined. These APIs are unsupported and untested in OpenCL 1.1! /* * WARNING: * This API introduces mutable state into the OpenCL implementation. It has been REMOVED * to better facilitate thread safety. The 1.0 API is not thread safe. It is not tested by the * OpenCL 1.1 conformance test, and consequently may not work or may not work dependably. * It is likely to be non-performant. Use of this API is not advised. Use at your own risk. * * Software developers previously relying on this API are instructed to set the command queue * properties when creating the queue, instead. */ extern CL_API_ENTRY cl_int CL_API_CALL clSetCommandQueueProperty(cl_command_queue /* command_queue */, cl_command_queue_properties /* properties */, cl_bool /* enable */, cl_command_queue_properties * /* old_properties */) CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED; #endif /* CL_USE_DEPRECATED_OPENCL_1_0_APIS */ #ifdef CL_USE_DEPRECATED_OPENCL_1_1_APIS extern CL_API_ENTRY cl_mem CL_API_CALL clCreateImage2D(cl_context /* context */, cl_mem_flags /* flags */, const cl_image_format * /* image_format */, size_t /* image_width */, size_t /* image_height */, size_t /* image_row_pitch */, void * /* host_ptr */, cl_int * /* errcode_ret */) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED; extern CL_API_ENTRY cl_mem CL_API_CALL clCreateImage3D(cl_context /* context */, cl_mem_flags /* flags */, const cl_image_format * /* image_format */, size_t /* image_width */, size_t /* image_height */, size_t /* image_depth */, size_t /* image_row_pitch */, size_t /* image_slice_pitch */, void * /* host_ptr */, cl_int * /* errcode_ret */) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED; extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueMarker(cl_command_queue /* command_queue */, cl_event * /* event */) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED; extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueWaitForEvents(cl_command_queue /* command_queue */, cl_uint /* num_events */, const cl_event * /* event_list */) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED; extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueBarrier(cl_command_queue /* command_queue */) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED; extern CL_API_ENTRY cl_int CL_API_CALL clUnloadCompiler(void) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED; extern CL_API_ENTRY void * CL_API_CALL clGetExtensionFunctionAddress(const char * /* func_name */) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED; #endif /* CL_USE_DEPRECATED_OPENCL_1_2_APIS */ #ifdef __cplusplus } #endif #endif /* __OPENCL_CL_H */ starpu-1.2.3+dfsg/socl/src/CL/cl_d3d10.h000066400000000000000000000113651320135501600174430ustar00rootroot00000000000000/********************************************************************************** * Copyright (c) 2008-2010 The Khronos Group Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and/or associated documentation files (the * "Materials"), to deal in the Materials without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Materials, and to * permit persons to whom the Materials are furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Materials. * * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. **********************************************************************************/ /* $Revision: 11708 $ on $Date: 2010-06-13 23:36:24 -0700 (Sun, 13 Jun 2010) $ */ #ifndef __OPENCL_CL_D3D10_H #define __OPENCL_CL_D3D10_H #include #include "cl.h" #include "cl_platform.h" #ifdef __cplusplus extern "C" { #endif /****************************************************************************** * cl_khr_d3d10_sharing */ #define cl_khr_d3d10_sharing 1 typedef cl_uint cl_d3d10_device_source_khr; typedef cl_uint cl_d3d10_device_set_khr; /******************************************************************************/ // Error Codes #define CL_INVALID_D3D10_DEVICE_KHR -1002 #define CL_INVALID_D3D10_RESOURCE_KHR -1003 #define CL_D3D10_RESOURCE_ALREADY_ACQUIRED_KHR -1004 #define CL_D3D10_RESOURCE_NOT_ACQUIRED_KHR -1005 // cl_d3d10_device_source_nv #define CL_D3D10_DEVICE_KHR 0x4010 #define CL_D3D10_DXGI_ADAPTER_KHR 0x4011 // cl_d3d10_device_set_nv #define CL_PREFERRED_DEVICES_FOR_D3D10_KHR 0x4012 #define CL_ALL_DEVICES_FOR_D3D10_KHR 0x4013 // cl_context_info #define CL_CONTEXT_D3D10_DEVICE_KHR 0x4014 #define CL_CONTEXT_D3D10_PREFER_SHARED_RESOURCES_KHR 0x402C // cl_mem_info #define CL_MEM_D3D10_RESOURCE_KHR 0x4015 // cl_image_info #define CL_IMAGE_D3D10_SUBRESOURCE_KHR 0x4016 // cl_command_type #define CL_COMMAND_ACQUIRE_D3D10_OBJECTS_KHR 0x4017 #define CL_COMMAND_RELEASE_D3D10_OBJECTS_KHR 0x4018 /******************************************************************************/ typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetDeviceIDsFromD3D10KHR_fn)( cl_platform_id platform, cl_d3d10_device_source_khr d3d_device_source, void * d3d_object, cl_d3d10_device_set_khr d3d_device_set, cl_uint num_entries, cl_device_id * devices, cl_uint * num_devices) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromD3D10BufferKHR_fn)( cl_context context, cl_mem_flags flags, ID3D10Buffer * resource, cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromD3D10Texture2DKHR_fn)( cl_context context, cl_mem_flags flags, ID3D10Texture2D * resource, UINT subresource, cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromD3D10Texture3DKHR_fn)( cl_context context, cl_mem_flags flags, ID3D10Texture3D * resource, UINT subresource, cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueAcquireD3D10ObjectsKHR_fn)( cl_command_queue command_queue, cl_uint num_objects, const cl_mem * mem_objects, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueReleaseD3D10ObjectsKHR_fn)( cl_command_queue command_queue, cl_uint num_objects, const cl_mem * mem_objects, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event) CL_API_SUFFIX__VERSION_1_0; #ifdef __cplusplus } #endif #endif // __OPENCL_CL_D3D10_H starpu-1.2.3+dfsg/socl/src/CL/cl_d3d11.h000066400000000000000000000113571320135501600174450ustar00rootroot00000000000000/********************************************************************************** * Copyright (c) 2008-2010 The Khronos Group Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and/or associated documentation files (the * "Materials"), to deal in the Materials without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Materials, and to * permit persons to whom the Materials are furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Materials. * * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. **********************************************************************************/ /* $Revision: 11708 $ on $Date: 2010-06-13 23:36:24 -0700 (Sun, 13 Jun 2010) $ */ #ifndef __OPENCL_CL_D3D11_H #define __OPENCL_CL_D3D11_H #include #include "cl.h" #include "cl_platform.h" #ifdef __cplusplus extern "C" { #endif /****************************************************************************** * cl_khr_d3d11_sharing */ #define cl_khr_d3d11_sharing 1 typedef cl_uint cl_d3d11_device_source_khr; typedef cl_uint cl_d3d11_device_set_khr; /******************************************************************************/ // Error Codes #define CL_INVALID_D3D11_DEVICE_KHR -1006 #define CL_INVALID_D3D11_RESOURCE_KHR -1007 #define CL_D3D11_RESOURCE_ALREADY_ACQUIRED_KHR -1008 #define CL_D3D11_RESOURCE_NOT_ACQUIRED_KHR -1009 // cl_d3d11_device_source #define CL_D3D11_DEVICE_KHR 0x4019 #define CL_D3D11_DXGI_ADAPTER_KHR 0x401A // cl_d3d11_device_set #define CL_PREFERRED_DEVICES_FOR_D3D11_KHR 0x401B #define CL_ALL_DEVICES_FOR_D3D11_KHR 0x401C // cl_context_info #define CL_CONTEXT_D3D11_DEVICE_KHR 0x401D #define CL_CONTEXT_D3D11_PREFER_SHARED_RESOURCES_KHR 0x402D // cl_mem_info #define CL_MEM_D3D11_RESOURCE_KHR 0x401E // cl_image_info #define CL_IMAGE_D3D11_SUBRESOURCE_KHR 0x401F // cl_command_type #define CL_COMMAND_ACQUIRE_D3D11_OBJECTS_KHR 0x4020 #define CL_COMMAND_RELEASE_D3D11_OBJECTS_KHR 0x4021 /******************************************************************************/ typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetDeviceIDsFromD3D11KHR_fn)( cl_platform_id platform, cl_d3d11_device_source_khr d3d_device_source, void * d3d_object, cl_d3d11_device_set_khr d3d_device_set, cl_uint num_entries, cl_device_id * devices, cl_uint * num_devices) CL_API_SUFFIX__VERSION_1_2; typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromD3D11BufferKHR_fn)( cl_context context, cl_mem_flags flags, ID3D11Buffer * resource, cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_2; typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromD3D11Texture2DKHR_fn)( cl_context context, cl_mem_flags flags, ID3D11Texture2D * resource, UINT subresource, cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_2; typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromD3D11Texture3DKHR_fn)( cl_context context, cl_mem_flags flags, ID3D11Texture3D * resource, UINT subresource, cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_2; typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueAcquireD3D11ObjectsKHR_fn)( cl_command_queue command_queue, cl_uint num_objects, const cl_mem * mem_objects, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event) CL_API_SUFFIX__VERSION_1_2; typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueReleaseD3D11ObjectsKHR_fn)( cl_command_queue command_queue, cl_uint num_objects, const cl_mem * mem_objects, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event) CL_API_SUFFIX__VERSION_1_2; #ifdef __cplusplus } #endif #endif // __OPENCL_CL_D3D11_H starpu-1.2.3+dfsg/socl/src/CL/cl_dx9_media_sharing.h000066400000000000000000000120371320135501600222030ustar00rootroot00000000000000/********************************************************************************** * Copyright (c) 2008-2012 The Khronos Group Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and/or associated documentation files (the * "Materials"), to deal in the Materials without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Materials, and to * permit persons to whom the Materials are furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Materials. * * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. **********************************************************************************/ /* $Revision: 11708 $ on $Date: 2010-06-13 23:36:24 -0700 (Sun, 13 Jun 2010) $ */ #ifndef __OPENCL_CL_DX9_MEDIA_SHARING_H #define __OPENCL_CL_DX9_MEDIA_SHARING_H #include "cl.h" #include "cl_platform.h" #ifdef __cplusplus extern "C" { #endif /****************************************************************************** /* cl_khr_dx9_media_sharing */ #define cl_khr_dx9_media_sharing 1 typedef cl_uint cl_dx9_media_adapter_type_khr; typedef cl_uint cl_dx9_media_adapter_set_khr; #if defined(_WIN32) #include typedef struct _cl_dx9_surface_info_khr { IDirect3DSurface9 *resource; HANDLE shared_handle; } cl_dx9_surface_info_khr; #endif /******************************************************************************/ // Error Codes #define CL_INVALID_DX9_MEDIA_ADAPTER_KHR -1010 #define CL_INVALID_DX9_MEDIA_SURFACE_KHR -1011 #define CL_DX9_MEDIA_SURFACE_ALREADY_ACQUIRED_KHR -1012 #define CL_DX9_MEDIA_SURFACE_NOT_ACQUIRED_KHR -1013 // cl_media_adapter_type_khr #define CL_ADAPTER_D3D9_KHR 0x2020 #define CL_ADAPTER_D3D9EX_KHR 0x2021 #define CL_ADAPTER_DXVA_KHR 0x2022 // cl_media_adapter_set_khr #define CL_PREFERRED_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR 0x2023 #define CL_ALL_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR 0x2024 // cl_context_info #define CL_CONTEXT_ADAPTER_D3D9_KHR 0x2025 #define CL_CONTEXT_ADAPTER_D3D9EX_KHR 0x2026 #define CL_CONTEXT_ADAPTER_DXVA_KHR 0x2027 // cl_mem_info #define CL_MEM_DX9_MEDIA_ADAPTER_TYPE_KHR 0x2028 #define CL_MEM_DX9_MEDIA_SURFACE_INFO_KHR 0x2029 // cl_image_info #define CL_IMAGE_DX9_MEDIA_PLANE_KHR 0x202A // cl_command_type #define CL_COMMAND_ACQUIRE_DX9_MEDIA_SURFACES_KHR 0x202B #define CL_COMMAND_RELEASE_DX9_MEDIA_SURFACES_KHR 0x202C /******************************************************************************/ typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetDeviceIDsFromDX9MediaAdapterKHR_fn)( cl_platform_id platform, cl_uint num_media_adapters, cl_dx9_media_adapter_type_khr * media_adapter_type, void * media_adapters, cl_dx9_media_adapter_set_khr media_adapter_set, cl_uint num_entries, cl_device_id * devices, cl_uint * num_devices) CL_API_SUFFIX__VERSION_1_2; typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromDX9MediaSurfaceKHR_fn)( cl_context context, cl_mem_flags flags, cl_dx9_media_adapter_type_khr adapter_type, void * surface_info, cl_uint plane, cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_2; typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueAcquireDX9MediaSurfacesKHR_fn)( cl_command_queue command_queue, cl_uint num_objects, const cl_mem * mem_objects, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event) CL_API_SUFFIX__VERSION_1_2; typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueReleaseDX9MediaSurfacesKHR_fn)( cl_command_queue command_queue, cl_uint num_objects, cl_mem * mem_objects, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event) CL_API_SUFFIX__VERSION_1_2; #ifdef __cplusplus } #endif #endif // __OPENCL_CL_DX9_MEDIA_SHARING_H starpu-1.2.3+dfsg/socl/src/CL/cl_ext.h000066400000000000000000000233341320135501600174270ustar00rootroot00000000000000/******************************************************************************* * Copyright (c) 2008-2010 The Khronos Group Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and/or associated documentation files (the * "Materials"), to deal in the Materials without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Materials, and to * permit persons to whom the Materials are furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Materials. * * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. ******************************************************************************/ /* $Revision: 11928 $ on $Date: 2010-07-13 09:04:56 -0700 (Tue, 13 Jul 2010) $ */ /* cl_ext.h contains OpenCL extensions which don't have external */ /* (OpenGL, D3D) dependencies. */ #ifndef __CL_EXT_H #define __CL_EXT_H #ifdef __cplusplus extern "C" { #endif #ifdef __APPLE__ #include #include #else #include "cl.h" #endif /* cl_khr_fp64 extension - no extension #define since it has no functions */ #define CL_DEVICE_DOUBLE_FP_CONFIG 0x1032 /* cl_khr_fp16 extension - no extension #define since it has no functions */ #define CL_DEVICE_HALF_FP_CONFIG 0x1033 /* Memory object destruction * * Apple extension for use to manage externally allocated buffers used with cl_mem objects with CL_MEM_USE_HOST_PTR * * Registers a user callback function that will be called when the memory object is deleted and its resources * freed. Each call to clSetMemObjectCallbackFn registers the specified user callback function on a callback * stack associated with memobj. The registered user callback functions are called in the reverse order in * which they were registered. The user callback functions are called and then the memory object is deleted * and its resources freed. This provides a mechanism for the application (and libraries) using memobj to be * notified when the memory referenced by host_ptr, specified when the memory object is created and used as * the storage bits for the memory object, can be reused or freed. * * The application may not call CL api's with the cl_mem object passed to the pfn_notify. * * Please check for the "cl_APPLE_SetMemObjectDestructor" extension using clGetDeviceInfo(CL_DEVICE_EXTENSIONS) * before using. */ #define cl_APPLE_SetMemObjectDestructor 1 cl_int CL_API_ENTRY clSetMemObjectDestructorAPPLE( cl_mem /* memobj */, void (* /*pfn_notify*/)( cl_mem /* memobj */, void* /*user_data*/), void * /*user_data */ ) CL_EXT_SUFFIX__VERSION_1_0; /* Context Logging Functions * * The next three convenience functions are intended to be used as the pfn_notify parameter to clCreateContext(). * Please check for the "cl_APPLE_ContextLoggingFunctions" extension using clGetDeviceInfo(CL_DEVICE_EXTENSIONS) * before using. * * clLogMessagesToSystemLog fowards on all log messages to the Apple System Logger */ #define cl_APPLE_ContextLoggingFunctions 1 extern void CL_API_ENTRY clLogMessagesToSystemLogAPPLE( const char * /* errstr */, const void * /* private_info */, size_t /* cb */, void * /* user_data */ ) CL_EXT_SUFFIX__VERSION_1_0; /* clLogMessagesToStdout sends all log messages to the file descriptor stdout */ extern void CL_API_ENTRY clLogMessagesToStdoutAPPLE( const char * /* errstr */, const void * /* private_info */, size_t /* cb */, void * /* user_data */ ) CL_EXT_SUFFIX__VERSION_1_0; /* clLogMessagesToStderr sends all log messages to the file descriptor stderr */ extern void CL_API_ENTRY clLogMessagesToStderrAPPLE( const char * /* errstr */, const void * /* private_info */, size_t /* cb */, void * /* user_data */ ) CL_EXT_SUFFIX__VERSION_1_0; /************************ * cl_khr_icd extension * ************************/ #define cl_khr_icd 1 /* cl_platform_info */ #define CL_PLATFORM_ICD_SUFFIX_KHR 0x0920 /* Additional Error Codes */ #define CL_PLATFORM_NOT_FOUND_KHR -1001 extern CL_API_ENTRY cl_int CL_API_CALL clIcdGetPlatformIDsKHR(cl_uint /* num_entries */, cl_platform_id * /* platforms */, cl_uint * /* num_platforms */); typedef CL_API_ENTRY cl_int (CL_API_CALL *clIcdGetPlatformIDsKHR_fn)( cl_uint /* num_entries */, cl_platform_id * /* platforms */, cl_uint * /* num_platforms */); /****************************************** * cl_nv_device_attribute_query extension * ******************************************/ /* cl_nv_device_attribute_query extension - no extension #define since it has no functions */ #define CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV 0x4000 #define CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV 0x4001 #define CL_DEVICE_REGISTERS_PER_BLOCK_NV 0x4002 #define CL_DEVICE_WARP_SIZE_NV 0x4003 #define CL_DEVICE_GPU_OVERLAP_NV 0x4004 #define CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV 0x4005 #define CL_DEVICE_INTEGRATED_MEMORY_NV 0x4006 /********************************* * cl_amd_device_attribute_query * *********************************/ #define CL_DEVICE_PROFILING_TIMER_OFFSET_AMD 0x4036 #ifdef CL_VERSION_1_1 /*********************************** * cl_ext_device_fission extension * ***********************************/ #define cl_ext_device_fission 1 extern CL_API_ENTRY cl_int CL_API_CALL clReleaseDeviceEXT( cl_device_id /*device*/ ) CL_EXT_SUFFIX__VERSION_1_1; typedef CL_API_ENTRY cl_int (CL_API_CALL *clReleaseDeviceEXT_fn)( cl_device_id /*device*/ ) CL_EXT_SUFFIX__VERSION_1_1; extern CL_API_ENTRY cl_int CL_API_CALL clRetainDeviceEXT( cl_device_id /*device*/ ) CL_EXT_SUFFIX__VERSION_1_1; typedef CL_API_ENTRY cl_int (CL_API_CALL *clRetainDeviceEXT_fn)( cl_device_id /*device*/ ) CL_EXT_SUFFIX__VERSION_1_1; typedef cl_ulong cl_device_partition_property_ext; extern CL_API_ENTRY cl_int CL_API_CALL clCreateSubDevicesEXT( cl_device_id /*in_device*/, const cl_device_partition_property_ext * /* properties */, cl_uint /*num_entries*/, cl_device_id * /*out_devices*/, cl_uint * /*num_devices*/ ) CL_EXT_SUFFIX__VERSION_1_1; typedef CL_API_ENTRY cl_int ( CL_API_CALL * clCreateSubDevicesEXT_fn)( cl_device_id /*in_device*/, const cl_device_partition_property_ext * /* properties */, cl_uint /*num_entries*/, cl_device_id * /*out_devices*/, cl_uint * /*num_devices*/ ) CL_EXT_SUFFIX__VERSION_1_1; /* cl_device_partition_property_ext */ #define CL_DEVICE_PARTITION_EQUALLY_EXT 0x4050 #define CL_DEVICE_PARTITION_BY_COUNTS_EXT 0x4051 #define CL_DEVICE_PARTITION_BY_NAMES_EXT 0x4052 #define CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN_EXT 0x4053 /* clDeviceGetInfo selectors */ #define CL_DEVICE_PARENT_DEVICE_EXT 0x4054 #define CL_DEVICE_PARTITION_TYPES_EXT 0x4055 #define CL_DEVICE_AFFINITY_DOMAINS_EXT 0x4056 #define CL_DEVICE_REFERENCE_COUNT_EXT 0x4057 #define CL_DEVICE_PARTITION_STYLE_EXT 0x4058 /* error codes */ #define CL_DEVICE_PARTITION_FAILED_EXT -1057 #define CL_INVALID_PARTITION_COUNT_EXT -1058 #define CL_INVALID_PARTITION_NAME_EXT -1059 /* CL_AFFINITY_DOMAINs */ #define CL_AFFINITY_DOMAIN_L1_CACHE_EXT 0x1 #define CL_AFFINITY_DOMAIN_L2_CACHE_EXT 0x2 #define CL_AFFINITY_DOMAIN_L3_CACHE_EXT 0x3 #define CL_AFFINITY_DOMAIN_L4_CACHE_EXT 0x4 #define CL_AFFINITY_DOMAIN_NUMA_EXT 0x10 #define CL_AFFINITY_DOMAIN_NEXT_FISSIONABLE_EXT 0x100 /* cl_device_partition_property_ext list terminators */ #define CL_PROPERTIES_LIST_END_EXT ((cl_device_partition_property_ext) 0) #define CL_PARTITION_BY_COUNTS_LIST_END_EXT ((cl_device_partition_property_ext) 0) #define CL_PARTITION_BY_NAMES_LIST_END_EXT ((cl_device_partition_property_ext) 0 - 1) #endif /* CL_VERSION_1_1 */ #ifdef __cplusplus } #endif #endif /* __CL_EXT_H */ starpu-1.2.3+dfsg/socl/src/CL/cl_gl.h000066400000000000000000000164371320135501600172370ustar00rootroot00000000000000/********************************************************************************** * Copyright (c) 2011 The Khronos Group Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and/or associated documentation files (the * "Materials"), to deal in the Materials without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Materials, and to * permit persons to whom the Materials are furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Materials. * * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. **********************************************************************************/ #ifndef __OPENCL_CL_GL_H #define __OPENCL_CL_GL_H #ifdef __APPLE__ #include #else #include "cl.h" #endif #ifdef __cplusplus extern "C" { #endif typedef cl_uint cl_gl_object_type; typedef cl_uint cl_gl_texture_info; typedef cl_uint cl_gl_platform_info; typedef struct __GLsync *cl_GLsync; /* cl_gl_object_type = 0x2000 - 0x200F enum values are currently taken */ #define CL_GL_OBJECT_BUFFER 0x2000 #define CL_GL_OBJECT_TEXTURE2D 0x2001 #define CL_GL_OBJECT_TEXTURE3D 0x2002 #define CL_GL_OBJECT_RENDERBUFFER 0x2003 #define CL_GL_OBJECT_TEXTURE2D_ARRAY 0x200E #define CL_GL_OBJECT_TEXTURE1D 0x200F #define CL_GL_OBJECT_TEXTURE1D_ARRAY 0x2010 #define CL_GL_OBJECT_TEXTURE_BUFFER 0x2011 /* cl_gl_texture_info */ #define CL_GL_TEXTURE_TARGET 0x2004 #define CL_GL_MIPMAP_LEVEL 0x2005 extern CL_API_ENTRY cl_mem CL_API_CALL clCreateFromGLBuffer(cl_context /* context */, cl_mem_flags /* flags */, cl_GLuint /* bufobj */, int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_mem CL_API_CALL clCreateFromGLTexture(cl_context /* context */, cl_mem_flags /* flags */, cl_GLenum /* target */, cl_GLint /* miplevel */, cl_GLuint /* texture */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_2; extern CL_API_ENTRY cl_mem CL_API_CALL clCreateFromGLRenderbuffer(cl_context /* context */, cl_mem_flags /* flags */, cl_GLuint /* renderbuffer */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clGetGLObjectInfo(cl_mem /* memobj */, cl_gl_object_type * /* gl_object_type */, cl_GLuint * /* gl_object_name */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clGetGLTextureInfo(cl_mem /* memobj */, cl_gl_texture_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueAcquireGLObjects(cl_command_queue /* command_queue */, cl_uint /* num_objects */, const cl_mem * /* mem_objects */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueReleaseGLObjects(cl_command_queue /* command_queue */, cl_uint /* num_objects */, const cl_mem * /* mem_objects */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; #ifdef CL_USE_DEPRECATED_OPENCL_1_1_APIS #ifndef BUILDING_SOCL #warning CL_USE_DEPRECATED_OPENCL_1_1_APIS is defined. These APIs are unsupported and untested in OpenCL 1.2! #endif extern CL_API_ENTRY cl_mem CL_API_CALL clCreateFromGLTexture2D(cl_context /* context */, cl_mem_flags /* flags */, cl_GLenum /* target */, cl_GLint /* miplevel */, cl_GLuint /* texture */, cl_int * /* errcode_ret */) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED; extern CL_API_ENTRY cl_mem CL_API_CALL clCreateFromGLTexture3D(cl_context /* context */, cl_mem_flags /* flags */, cl_GLenum /* target */, cl_GLint /* miplevel */, cl_GLuint /* texture */, cl_int * /* errcode_ret */) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED; #endif /* CL_USE_DEPRECATED_OPENCL_1_2_APIS */ /* cl_khr_gl_sharing extension */ #define cl_khr_gl_sharing 1 typedef cl_uint cl_gl_context_info; /* Additional Error Codes */ #define CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR -1000 /* cl_gl_context_info */ #define CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR 0x2006 #define CL_DEVICES_FOR_GL_CONTEXT_KHR 0x2007 /* Additional cl_context_properties */ #define CL_GL_CONTEXT_KHR 0x2008 #define CL_EGL_DISPLAY_KHR 0x2009 #define CL_GLX_DISPLAY_KHR 0x200A #define CL_WGL_HDC_KHR 0x200B #define CL_CGL_SHAREGROUP_KHR 0x200C extern CL_API_ENTRY cl_int CL_API_CALL clGetGLContextInfoKHR(const cl_context_properties * /* properties */, cl_gl_context_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetGLContextInfoKHR_fn)( const cl_context_properties * properties, cl_gl_context_info param_name, size_t param_value_size, void * param_value, size_t * param_value_size_ret); #ifdef __cplusplus } #endif #endif /* __OPENCL_CL_GL_H */ starpu-1.2.3+dfsg/socl/src/CL/cl_gl_ext.h000066400000000000000000000051031320135501600201030ustar00rootroot00000000000000/********************************************************************************** * Copyright (c) 2008-2010 The Khronos Group Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and/or associated documentation files (the * "Materials"), to deal in the Materials without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Materials, and to * permit persons to whom the Materials are furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Materials. * * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. **********************************************************************************/ /* $Revision: 11708 $ on $Date: 2010-06-13 23:36:24 -0700 (Sun, 13 Jun 2010) $ */ /* cl_gl_ext.h contains vendor (non-KHR) OpenCL extensions which have */ /* OpenGL dependencies. */ #ifndef __OPENCL_CL_GL_EXT_H #define __OPENCL_CL_GL_EXT_H #ifdef __cplusplus extern "C" { #endif #ifdef __APPLE__ #include #else #include "cl_gl.h" #endif /* * For each extension, follow this template * cl_VEN_extname extension */ /* #define cl_VEN_extname 1 * ... define new types, if any * ... define new tokens, if any * ... define new APIs, if any * * If you need GLtypes here, mirror them with a cl_GLtype, rather than including a GL header * This allows us to avoid having to decide whether to include GL headers or GLES here. */ /* * cl_khr_gl_event extension * See section 9.9 in the OpenCL 1.1 spec for more information */ #define CL_COMMAND_GL_FENCE_SYNC_OBJECT_KHR 0x200D extern CL_API_ENTRY cl_event CL_API_CALL clCreateEventFromGLsyncKHR(cl_context /* context */, cl_GLsync /* cl_GLsync */, cl_int * /* errcode_ret */) CL_EXT_SUFFIX__VERSION_1_1; #ifdef __cplusplus } #endif #endif /* __OPENCL_CL_GL_EXT_H */ starpu-1.2.3+dfsg/socl/src/CL/cl_platform.h000066400000000000000000001124241320135501600204520ustar00rootroot00000000000000/********************************************************************************** * Copyright (c) 2008-2010 The Khronos Group Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and/or associated documentation files (the * "Materials"), to deal in the Materials without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Materials, and to * permit persons to whom the Materials are furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Materials. * * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. **********************************************************************************/ /* $Revision: 11803 $ on $Date: 2010-06-25 10:02:12 -0700 (Fri, 25 Jun 2010) $ */ #ifndef __CL_PLATFORM_H #define __CL_PLATFORM_H #ifdef __APPLE__ /* Contains #defines for AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER below */ #include #endif #ifdef __cplusplus extern "C" { #endif #if defined(_WIN32) #define CL_API_ENTRY #define CL_API_CALL __stdcall #define CL_CALLBACK __stdcall #else #define CL_API_ENTRY #define CL_API_CALL #define CL_CALLBACK #endif #ifdef __APPLE__ #define CL_EXTENSION_WEAK_LINK __attribute__((weak_import)) #define CL_API_SUFFIX__VERSION_1_0 AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER #define CL_EXT_SUFFIX__VERSION_1_0 CL_EXTENSION_WEAK_LINK AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER #define CL_API_SUFFIX__VERSION_1_1 CL_EXTENSION_WEAK_LINK #define CL_EXT_SUFFIX__VERSION_1_1 CL_EXTENSION_WEAK_LINK #define CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED CL_EXTENSION_WEAK_LINK AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER #else #define CL_EXTENSION_WEAK_LINK #define CL_API_SUFFIX__VERSION_1_0 #define CL_EXT_SUFFIX__VERSION_1_0 #define CL_API_SUFFIX__VERSION_1_1 #define CL_EXT_SUFFIX__VERSION_1_1 #define CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED #define CL_API_SUFFIX__VERSION_1_2 #define CL_EXT_SUFFIX__VERSION_1_2 #define CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED #endif #if (defined (_WIN32) && defined(_MSC_VER)) /* scalar types */ typedef signed __int8 cl_char; typedef unsigned __int8 cl_uchar; typedef signed __int16 cl_short; typedef unsigned __int16 cl_ushort; typedef signed __int32 cl_int; typedef unsigned __int32 cl_uint; typedef signed __int64 cl_long; typedef unsigned __int64 cl_ulong; typedef unsigned __int16 cl_half; typedef float cl_float; typedef double cl_double; /* Macro names and corresponding values defined by OpenCL */ #define CL_CHAR_BIT 8 #define CL_SCHAR_MAX 127 #define CL_SCHAR_MIN (-127-1) #define CL_CHAR_MAX CL_SCHAR_MAX #define CL_CHAR_MIN CL_SCHAR_MIN #define CL_UCHAR_MAX 255 #define CL_SHRT_MAX 32767 #define CL_SHRT_MIN (-32767-1) #define CL_USHRT_MAX 65535 #define CL_INT_MAX 2147483647 #define CL_INT_MIN (-2147483647-1) #define CL_UINT_MAX 0xffffffffU #define CL_LONG_MAX ((cl_long) 0x7FFFFFFFFFFFFFFFLL) #define CL_LONG_MIN ((cl_long) -0x7FFFFFFFFFFFFFFFLL - 1LL) #define CL_ULONG_MAX ((cl_ulong) 0xFFFFFFFFFFFFFFFFULL) #define CL_FLT_DIG 6 #define CL_FLT_MANT_DIG 24 #define CL_FLT_MAX_10_EXP +38 #define CL_FLT_MAX_EXP +128 #define CL_FLT_MIN_10_EXP -37 #define CL_FLT_MIN_EXP -125 #define CL_FLT_RADIX 2 #define CL_FLT_MAX 340282346638528859811704183484516925440.0f #define CL_FLT_MIN 1.175494350822287507969e-38f #define CL_FLT_EPSILON 0x1.0p-23f #define CL_DBL_DIG 15 #define CL_DBL_MANT_DIG 53 #define CL_DBL_MAX_10_EXP +308 #define CL_DBL_MAX_EXP +1024 #define CL_DBL_MIN_10_EXP -307 #define CL_DBL_MIN_EXP -1021 #define CL_DBL_RADIX 2 #define CL_DBL_MAX 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0 #define CL_DBL_MIN 2.225073858507201383090e-308 #define CL_DBL_EPSILON 2.220446049250313080847e-16 #define CL_M_E 2.718281828459045090796 #define CL_M_LOG2E 1.442695040888963387005 #define CL_M_LOG10E 0.434294481903251816668 #define CL_M_LN2 0.693147180559945286227 #define CL_M_LN10 2.302585092994045901094 #define CL_M_PI 3.141592653589793115998 #define CL_M_PI_2 1.570796326794896557999 #define CL_M_PI_4 0.785398163397448278999 #define CL_M_1_PI 0.318309886183790691216 #define CL_M_2_PI 0.636619772367581382433 #define CL_M_2_SQRTPI 1.128379167095512558561 #define CL_M_SQRT2 1.414213562373095145475 #define CL_M_SQRT1_2 0.707106781186547572737 #define CL_M_E_F 2.71828174591064f #define CL_M_LOG2E_F 1.44269502162933f #define CL_M_LOG10E_F 0.43429449200630f #define CL_M_LN2_F 0.69314718246460f #define CL_M_LN10_F 2.30258512496948f #define CL_M_PI_F 3.14159274101257f #define CL_M_PI_2_F 1.57079637050629f #define CL_M_PI_4_F 0.78539818525314f #define CL_M_1_PI_F 0.31830987334251f #define CL_M_2_PI_F 0.63661974668503f #define CL_M_2_SQRTPI_F 1.12837922573090f #define CL_M_SQRT2_F 1.41421353816986f #define CL_M_SQRT1_2_F 0.70710676908493f #define CL_NAN (CL_INFINITY - CL_INFINITY) #define CL_HUGE_VALF ((cl_float) 1e50) #define CL_HUGE_VAL ((cl_double) 1e500) #define CL_MAXFLOAT CL_FLT_MAX #define CL_INFINITY CL_HUGE_VALF #else #include /* scalar types */ typedef int8_t cl_char; typedef uint8_t cl_uchar; typedef int16_t cl_short __attribute__((aligned(2))); typedef uint16_t cl_ushort __attribute__((aligned(2))); typedef int32_t cl_int __attribute__((aligned(4))); typedef uint32_t cl_uint __attribute__((aligned(4))); typedef int64_t cl_long __attribute__((aligned(8))); typedef uint64_t cl_ulong __attribute__((aligned(8))); typedef uint16_t cl_half __attribute__((aligned(2))); typedef float cl_float __attribute__((aligned(4))); typedef double cl_double __attribute__((aligned(8))); /* Macro names and corresponding values defined by OpenCL */ #define CL_CHAR_BIT 8 #define CL_SCHAR_MAX 127 #define CL_SCHAR_MIN (-127-1) #define CL_CHAR_MAX CL_SCHAR_MAX #define CL_CHAR_MIN CL_SCHAR_MIN #define CL_UCHAR_MAX 255 #define CL_SHRT_MAX 32767 #define CL_SHRT_MIN (-32767-1) #define CL_USHRT_MAX 65535 #define CL_INT_MAX 2147483647 #define CL_INT_MIN (-2147483647-1) #define CL_UINT_MAX 0xffffffffU #define CL_LONG_MAX ((cl_long) 0x7FFFFFFFFFFFFFFFLL) #define CL_LONG_MIN ((cl_long) -0x7FFFFFFFFFFFFFFFLL - 1LL) #define CL_ULONG_MAX ((cl_ulong) 0xFFFFFFFFFFFFFFFFULL) #define CL_FLT_DIG 6 #define CL_FLT_MANT_DIG 24 #define CL_FLT_MAX_10_EXP +38 #define CL_FLT_MAX_EXP +128 #define CL_FLT_MIN_10_EXP -37 #define CL_FLT_MIN_EXP -125 #define CL_FLT_RADIX 2 #define CL_FLT_MAX 0x1.fffffep127f #define CL_FLT_MIN 0x1.0p-126f #define CL_FLT_EPSILON 0x1.0p-23f #define CL_DBL_DIG 15 #define CL_DBL_MANT_DIG 53 #define CL_DBL_MAX_10_EXP +308 #define CL_DBL_MAX_EXP +1024 #define CL_DBL_MIN_10_EXP -307 #define CL_DBL_MIN_EXP -1021 #define CL_DBL_RADIX 2 #define CL_DBL_MAX 0x1.fffffffffffffp1023 #define CL_DBL_MIN 0x1.0p-1022 #define CL_DBL_EPSILON 0x1.0p-52 #define CL_M_E 2.718281828459045090796 #define CL_M_LOG2E 1.442695040888963387005 #define CL_M_LOG10E 0.434294481903251816668 #define CL_M_LN2 0.693147180559945286227 #define CL_M_LN10 2.302585092994045901094 #define CL_M_PI 3.141592653589793115998 #define CL_M_PI_2 1.570796326794896557999 #define CL_M_PI_4 0.785398163397448278999 #define CL_M_1_PI 0.318309886183790691216 #define CL_M_2_PI 0.636619772367581382433 #define CL_M_2_SQRTPI 1.128379167095512558561 #define CL_M_SQRT2 1.414213562373095145475 #define CL_M_SQRT1_2 0.707106781186547572737 #define CL_M_E_F 2.71828174591064f #define CL_M_LOG2E_F 1.44269502162933f #define CL_M_LOG10E_F 0.43429449200630f #define CL_M_LN2_F 0.69314718246460f #define CL_M_LN10_F 2.30258512496948f #define CL_M_PI_F 3.14159274101257f #define CL_M_PI_2_F 1.57079637050629f #define CL_M_PI_4_F 0.78539818525314f #define CL_M_1_PI_F 0.31830987334251f #define CL_M_2_PI_F 0.63661974668503f #define CL_M_2_SQRTPI_F 1.12837922573090f #define CL_M_SQRT2_F 1.41421353816986f #define CL_M_SQRT1_2_F 0.70710676908493f #if defined( __GNUC__ ) #define CL_HUGE_VALF __builtin_huge_valf() #define CL_HUGE_VAL __builtin_huge_val() #define CL_NAN __builtin_nanf( "" ) #else #define CL_HUGE_VALF ((cl_float) 1e50) #define CL_HUGE_VAL ((cl_double) 1e500) float nanf( const char * ); #define CL_NAN nanf( "" ) #endif #define CL_MAXFLOAT CL_FLT_MAX #define CL_INFINITY CL_HUGE_VALF #endif #include /* Mirror types to GL types. Mirror types allow us to avoid deciding which headers to load based on whether we are using GL or GLES here. */ typedef unsigned int cl_GLuint; typedef int cl_GLint; typedef unsigned int cl_GLenum; /* * Vector types * * Note: OpenCL requires that all types be naturally aligned. * This means that vector types must be naturally aligned. * For example, a vector of four floats must be aligned to * a 16 byte boundary (calculated as 4 * the natural 4-byte * alignment of the float). The alignment qualifiers here * will only function properly if your compiler supports them * and if you don't actively work to defeat them. For example, * in order for a cl_float4 to be 16 byte aligned in a struct, * the start of the struct must itself be 16-byte aligned. * * Maintaining proper alignment is the user's responsibility. */ /* Define basic vector types */ #if defined( __VEC__ ) #include /* may be omitted depending on compiler. AltiVec spec provides no way to detect whether the header is required. */ typedef vector unsigned char __cl_uchar16; typedef vector signed char __cl_char16; typedef vector unsigned short __cl_ushort8; typedef vector signed short __cl_short8; typedef vector unsigned int __cl_uint4; typedef vector signed int __cl_int4; typedef vector float __cl_float4; #define __CL_UCHAR16__ 1 #define __CL_CHAR16__ 1 #define __CL_USHORT8__ 1 #define __CL_SHORT8__ 1 #define __CL_UINT4__ 1 #define __CL_INT4__ 1 #define __CL_FLOAT4__ 1 #endif #if defined( __SSE__ ) #if defined( __MINGW64__ ) #include #else #include #endif #if defined( __GNUC__ ) typedef float __cl_float4 __attribute__((vector_size(16))); #else typedef __m128 __cl_float4; #endif #define __CL_FLOAT4__ 1 #endif #if defined( __SSE2__ ) #if defined( __MINGW64__ ) #include #else #include #endif #if defined( __GNUC__ ) typedef cl_uchar __cl_uchar16 __attribute__((vector_size(16))); typedef cl_char __cl_char16 __attribute__((vector_size(16))); typedef cl_ushort __cl_ushort8 __attribute__((vector_size(16))); typedef cl_short __cl_short8 __attribute__((vector_size(16))); typedef cl_uint __cl_uint4 __attribute__((vector_size(16))); typedef cl_int __cl_int4 __attribute__((vector_size(16))); typedef cl_ulong __cl_ulong2 __attribute__((vector_size(16))); typedef cl_long __cl_long2 __attribute__((vector_size(16))); typedef cl_double __cl_double2 __attribute__((vector_size(16))); #else typedef __m128i __cl_uchar16; typedef __m128i __cl_char16; typedef __m128i __cl_ushort8; typedef __m128i __cl_short8; typedef __m128i __cl_uint4; typedef __m128i __cl_int4; typedef __m128i __cl_ulong2; typedef __m128i __cl_long2; typedef __m128d __cl_double2; #endif #define __CL_UCHAR16__ 1 #define __CL_CHAR16__ 1 #define __CL_USHORT8__ 1 #define __CL_SHORT8__ 1 #define __CL_INT4__ 1 #define __CL_UINT4__ 1 #define __CL_ULONG2__ 1 #define __CL_LONG2__ 1 #define __CL_DOUBLE2__ 1 #endif #if defined( __MMX__ ) #include #if defined( __GNUC__ ) typedef cl_uchar __cl_uchar8 __attribute__((vector_size(8))); typedef cl_char __cl_char8 __attribute__((vector_size(8))); typedef cl_ushort __cl_ushort4 __attribute__((vector_size(8))); typedef cl_short __cl_short4 __attribute__((vector_size(8))); typedef cl_uint __cl_uint2 __attribute__((vector_size(8))); typedef cl_int __cl_int2 __attribute__((vector_size(8))); typedef cl_ulong __cl_ulong1 __attribute__((vector_size(8))); typedef cl_long __cl_long1 __attribute__((vector_size(8))); typedef cl_float __cl_float2 __attribute__((vector_size(8))); #else typedef __m64 __cl_uchar8; typedef __m64 __cl_char8; typedef __m64 __cl_ushort4; typedef __m64 __cl_short4; typedef __m64 __cl_uint2; typedef __m64 __cl_int2; typedef __m64 __cl_ulong1; typedef __m64 __cl_long1; typedef __m64 __cl_float2; #endif #define __CL_UCHAR8__ 1 #define __CL_CHAR8__ 1 #define __CL_USHORT4__ 1 #define __CL_SHORT4__ 1 #define __CL_INT2__ 1 #define __CL_UINT2__ 1 #define __CL_ULONG1__ 1 #define __CL_LONG1__ 1 #define __CL_FLOAT2__ 1 #endif #if defined( __AVX__ ) #if defined( __MINGW64__ ) #include #else #include #endif #if defined( __GNUC__ ) typedef cl_float __cl_float8 __attribute__((vector_size(32))); typedef cl_double __cl_double4 __attribute__((vector_size(32))); #else typedef __m256 __cl_float8; typedef __m256d __cl_double4; #endif #define __CL_FLOAT8__ 1 #define __CL_DOUBLE4__ 1 #endif /* Define alignment keys */ #if defined( __GNUC__ ) #define CL_ALIGNED(_x) __attribute__ ((aligned(_x))) #elif defined( _WIN32) && (_MSC_VER) /* Alignment keys neutered on windows because MSVC can't swallow function arguments with alignment requirements */ /* http://msdn.microsoft.com/en-us/library/373ak2y1%28VS.71%29.aspx */ /* #include */ /* #define CL_ALIGNED(_x) _CRT_ALIGN(_x) */ #define CL_ALIGNED(_x) #else #warning Need to implement some method to align data here #define CL_ALIGNED(_x) #endif /* Indicate whether .xyzw, .s0123 and .hi.lo are supported */ #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) /* .xyzw and .s0123...{f|F} are supported */ #define CL_HAS_NAMED_VECTOR_FIELDS 1 /* .hi and .lo are supported */ #define CL_HAS_HI_LO_VECTOR_FIELDS 1 #endif /* Define cl_vector types */ /* ---- cl_charn ---- */ typedef union { cl_char CL_ALIGNED(2) s[2]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_char x, y; }; __extension__ struct{ cl_char s0, s1; }; __extension__ struct{ cl_char lo, hi; }; #endif #if defined( __CL_CHAR2__) __cl_char2 v2; #endif }cl_char2; typedef union { cl_char CL_ALIGNED(4) s[4]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_char x, y, z, w; }; __extension__ struct{ cl_char s0, s1, s2, s3; }; __extension__ struct{ cl_char2 lo, hi; }; #endif #if defined( __CL_CHAR2__) __cl_char2 v2[2]; #endif #if defined( __CL_CHAR4__) __cl_char4 v4; #endif }cl_char4; /* cl_char3 is identical in size, alignment and behavior to cl_char4. See section 6.1.5. */ typedef cl_char4 cl_char3; typedef union { cl_char CL_ALIGNED(8) s[8]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_char x, y, z, w; }; __extension__ struct{ cl_char s0, s1, s2, s3, s4, s5, s6, s7; }; __extension__ struct{ cl_char4 lo, hi; }; #endif #if defined( __CL_CHAR2__) __cl_char2 v2[4]; #endif #if defined( __CL_CHAR4__) __cl_char4 v4[2]; #endif #if defined( __CL_CHAR8__ ) __cl_char8 v8; #endif }cl_char8; typedef union { cl_char CL_ALIGNED(16) s[16]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_char x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; __extension__ struct{ cl_char s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; __extension__ struct{ cl_char8 lo, hi; }; #endif #if defined( __CL_CHAR2__) __cl_char2 v2[8]; #endif #if defined( __CL_CHAR4__) __cl_char4 v4[4]; #endif #if defined( __CL_CHAR8__ ) __cl_char8 v8[2]; #endif #if defined( __CL_CHAR16__ ) __cl_char16 v16; #endif }cl_char16; /* ---- cl_ucharn ---- */ typedef union { cl_uchar CL_ALIGNED(2) s[2]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_uchar x, y; }; __extension__ struct{ cl_uchar s0, s1; }; __extension__ struct{ cl_uchar lo, hi; }; #endif #if defined( __cl_uchar2__) __cl_uchar2 v2; #endif }cl_uchar2; typedef union { cl_uchar CL_ALIGNED(4) s[4]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_uchar x, y, z, w; }; __extension__ struct{ cl_uchar s0, s1, s2, s3; }; __extension__ struct{ cl_uchar2 lo, hi; }; #endif #if defined( __CL_UCHAR2__) __cl_uchar2 v2[2]; #endif #if defined( __CL_UCHAR4__) __cl_uchar4 v4; #endif }cl_uchar4; /* cl_uchar3 is identical in size, alignment and behavior to cl_uchar4. See section 6.1.5. */ typedef cl_uchar4 cl_uchar3; typedef union { cl_uchar CL_ALIGNED(8) s[8]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_uchar x, y, z, w; }; __extension__ struct{ cl_uchar s0, s1, s2, s3, s4, s5, s6, s7; }; __extension__ struct{ cl_uchar4 lo, hi; }; #endif #if defined( __CL_UCHAR2__) __cl_uchar2 v2[4]; #endif #if defined( __CL_UCHAR4__) __cl_uchar4 v4[2]; #endif #if defined( __CL_UCHAR8__ ) __cl_uchar8 v8; #endif }cl_uchar8; typedef union { cl_uchar CL_ALIGNED(16) s[16]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_uchar x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; __extension__ struct{ cl_uchar s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; __extension__ struct{ cl_uchar8 lo, hi; }; #endif #if defined( __CL_UCHAR2__) __cl_uchar2 v2[8]; #endif #if defined( __CL_UCHAR4__) __cl_uchar4 v4[4]; #endif #if defined( __CL_UCHAR8__ ) __cl_uchar8 v8[2]; #endif #if defined( __CL_UCHAR16__ ) __cl_uchar16 v16; #endif }cl_uchar16; /* ---- cl_shortn ---- */ typedef union { cl_short CL_ALIGNED(4) s[2]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_short x, y; }; __extension__ struct{ cl_short s0, s1; }; __extension__ struct{ cl_short lo, hi; }; #endif #if defined( __CL_SHORT2__) __cl_short2 v2; #endif }cl_short2; typedef union { cl_short CL_ALIGNED(8) s[4]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_short x, y, z, w; }; __extension__ struct{ cl_short s0, s1, s2, s3; }; __extension__ struct{ cl_short2 lo, hi; }; #endif #if defined( __CL_SHORT2__) __cl_short2 v2[2]; #endif #if defined( __CL_SHORT4__) __cl_short4 v4; #endif }cl_short4; /* cl_short3 is identical in size, alignment and behavior to cl_short4. See section 6.1.5. */ typedef cl_short4 cl_short3; typedef union { cl_short CL_ALIGNED(16) s[8]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_short x, y, z, w; }; __extension__ struct{ cl_short s0, s1, s2, s3, s4, s5, s6, s7; }; __extension__ struct{ cl_short4 lo, hi; }; #endif #if defined( __CL_SHORT2__) __cl_short2 v2[4]; #endif #if defined( __CL_SHORT4__) __cl_short4 v4[2]; #endif #if defined( __CL_SHORT8__ ) __cl_short8 v8; #endif }cl_short8; typedef union { cl_short CL_ALIGNED(32) s[16]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_short x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; __extension__ struct{ cl_short s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; __extension__ struct{ cl_short8 lo, hi; }; #endif #if defined( __CL_SHORT2__) __cl_short2 v2[8]; #endif #if defined( __CL_SHORT4__) __cl_short4 v4[4]; #endif #if defined( __CL_SHORT8__ ) __cl_short8 v8[2]; #endif #if defined( __CL_SHORT16__ ) __cl_short16 v16; #endif }cl_short16; /* ---- cl_ushortn ---- */ typedef union { cl_ushort CL_ALIGNED(4) s[2]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_ushort x, y; }; __extension__ struct{ cl_ushort s0, s1; }; __extension__ struct{ cl_ushort lo, hi; }; #endif #if defined( __CL_USHORT2__) __cl_ushort2 v2; #endif }cl_ushort2; typedef union { cl_ushort CL_ALIGNED(8) s[4]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_ushort x, y, z, w; }; __extension__ struct{ cl_ushort s0, s1, s2, s3; }; __extension__ struct{ cl_ushort2 lo, hi; }; #endif #if defined( __CL_USHORT2__) __cl_ushort2 v2[2]; #endif #if defined( __CL_USHORT4__) __cl_ushort4 v4; #endif }cl_ushort4; /* cl_ushort3 is identical in size, alignment and behavior to cl_ushort4. See section 6.1.5. */ typedef cl_ushort4 cl_ushort3; typedef union { cl_ushort CL_ALIGNED(16) s[8]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_ushort x, y, z, w; }; __extension__ struct{ cl_ushort s0, s1, s2, s3, s4, s5, s6, s7; }; __extension__ struct{ cl_ushort4 lo, hi; }; #endif #if defined( __CL_USHORT2__) __cl_ushort2 v2[4]; #endif #if defined( __CL_USHORT4__) __cl_ushort4 v4[2]; #endif #if defined( __CL_USHORT8__ ) __cl_ushort8 v8; #endif }cl_ushort8; typedef union { cl_ushort CL_ALIGNED(32) s[16]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_ushort x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; __extension__ struct{ cl_ushort s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; __extension__ struct{ cl_ushort8 lo, hi; }; #endif #if defined( __CL_USHORT2__) __cl_ushort2 v2[8]; #endif #if defined( __CL_USHORT4__) __cl_ushort4 v4[4]; #endif #if defined( __CL_USHORT8__ ) __cl_ushort8 v8[2]; #endif #if defined( __CL_USHORT16__ ) __cl_ushort16 v16; #endif }cl_ushort16; /* ---- cl_intn ---- */ typedef union { cl_int CL_ALIGNED(8) s[2]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_int x, y; }; __extension__ struct{ cl_int s0, s1; }; __extension__ struct{ cl_int lo, hi; }; #endif #if defined( __CL_INT2__) __cl_int2 v2; #endif }cl_int2; typedef union { cl_int CL_ALIGNED(16) s[4]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_int x, y, z, w; }; __extension__ struct{ cl_int s0, s1, s2, s3; }; __extension__ struct{ cl_int2 lo, hi; }; #endif #if defined( __CL_INT2__) __cl_int2 v2[2]; #endif #if defined( __CL_INT4__) __cl_int4 v4; #endif }cl_int4; /* cl_int3 is identical in size, alignment and behavior to cl_int4. See section 6.1.5. */ typedef cl_int4 cl_int3; typedef union { cl_int CL_ALIGNED(32) s[8]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_int x, y, z, w; }; __extension__ struct{ cl_int s0, s1, s2, s3, s4, s5, s6, s7; }; __extension__ struct{ cl_int4 lo, hi; }; #endif #if defined( __CL_INT2__) __cl_int2 v2[4]; #endif #if defined( __CL_INT4__) __cl_int4 v4[2]; #endif #if defined( __CL_INT8__ ) __cl_int8 v8; #endif }cl_int8; typedef union { cl_int CL_ALIGNED(64) s[16]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_int x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; __extension__ struct{ cl_int s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; __extension__ struct{ cl_int8 lo, hi; }; #endif #if defined( __CL_INT2__) __cl_int2 v2[8]; #endif #if defined( __CL_INT4__) __cl_int4 v4[4]; #endif #if defined( __CL_INT8__ ) __cl_int8 v8[2]; #endif #if defined( __CL_INT16__ ) __cl_int16 v16; #endif }cl_int16; /* ---- cl_uintn ---- */ typedef union { cl_uint CL_ALIGNED(8) s[2]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_uint x, y; }; __extension__ struct{ cl_uint s0, s1; }; __extension__ struct{ cl_uint lo, hi; }; #endif #if defined( __CL_UINT2__) __cl_uint2 v2; #endif }cl_uint2; typedef union { cl_uint CL_ALIGNED(16) s[4]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_uint x, y, z, w; }; __extension__ struct{ cl_uint s0, s1, s2, s3; }; __extension__ struct{ cl_uint2 lo, hi; }; #endif #if defined( __CL_UINT2__) __cl_uint2 v2[2]; #endif #if defined( __CL_UINT4__) __cl_uint4 v4; #endif }cl_uint4; /* cl_uint3 is identical in size, alignment and behavior to cl_uint4. See section 6.1.5. */ typedef cl_uint4 cl_uint3; typedef union { cl_uint CL_ALIGNED(32) s[8]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_uint x, y, z, w; }; __extension__ struct{ cl_uint s0, s1, s2, s3, s4, s5, s6, s7; }; __extension__ struct{ cl_uint4 lo, hi; }; #endif #if defined( __CL_UINT2__) __cl_uint2 v2[4]; #endif #if defined( __CL_UINT4__) __cl_uint4 v4[2]; #endif #if defined( __CL_UINT8__ ) __cl_uint8 v8; #endif }cl_uint8; typedef union { cl_uint CL_ALIGNED(64) s[16]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_uint x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; __extension__ struct{ cl_uint s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; __extension__ struct{ cl_uint8 lo, hi; }; #endif #if defined( __CL_UINT2__) __cl_uint2 v2[8]; #endif #if defined( __CL_UINT4__) __cl_uint4 v4[4]; #endif #if defined( __CL_UINT8__ ) __cl_uint8 v8[2]; #endif #if defined( __CL_UINT16__ ) __cl_uint16 v16; #endif }cl_uint16; /* ---- cl_longn ---- */ typedef union { cl_long CL_ALIGNED(16) s[2]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_long x, y; }; __extension__ struct{ cl_long s0, s1; }; __extension__ struct{ cl_long lo, hi; }; #endif #if defined( __CL_LONG2__) __cl_long2 v2; #endif }cl_long2; typedef union { cl_long CL_ALIGNED(32) s[4]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_long x, y, z, w; }; __extension__ struct{ cl_long s0, s1, s2, s3; }; __extension__ struct{ cl_long2 lo, hi; }; #endif #if defined( __CL_LONG2__) __cl_long2 v2[2]; #endif #if defined( __CL_LONG4__) __cl_long4 v4; #endif }cl_long4; /* cl_long3 is identical in size, alignment and behavior to cl_long4. See section 6.1.5. */ typedef cl_long4 cl_long3; typedef union { cl_long CL_ALIGNED(64) s[8]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_long x, y, z, w; }; __extension__ struct{ cl_long s0, s1, s2, s3, s4, s5, s6, s7; }; __extension__ struct{ cl_long4 lo, hi; }; #endif #if defined( __CL_LONG2__) __cl_long2 v2[4]; #endif #if defined( __CL_LONG4__) __cl_long4 v4[2]; #endif #if defined( __CL_LONG8__ ) __cl_long8 v8; #endif }cl_long8; typedef union { cl_long CL_ALIGNED(128) s[16]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_long x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; __extension__ struct{ cl_long s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; __extension__ struct{ cl_long8 lo, hi; }; #endif #if defined( __CL_LONG2__) __cl_long2 v2[8]; #endif #if defined( __CL_LONG4__) __cl_long4 v4[4]; #endif #if defined( __CL_LONG8__ ) __cl_long8 v8[2]; #endif #if defined( __CL_LONG16__ ) __cl_long16 v16; #endif }cl_long16; /* ---- cl_ulongn ---- */ typedef union { cl_ulong CL_ALIGNED(16) s[2]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_ulong x, y; }; __extension__ struct{ cl_ulong s0, s1; }; __extension__ struct{ cl_ulong lo, hi; }; #endif #if defined( __CL_ULONG2__) __cl_ulong2 v2; #endif }cl_ulong2; typedef union { cl_ulong CL_ALIGNED(32) s[4]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_ulong x, y, z, w; }; __extension__ struct{ cl_ulong s0, s1, s2, s3; }; __extension__ struct{ cl_ulong2 lo, hi; }; #endif #if defined( __CL_ULONG2__) __cl_ulong2 v2[2]; #endif #if defined( __CL_ULONG4__) __cl_ulong4 v4; #endif }cl_ulong4; /* cl_ulong3 is identical in size, alignment and behavior to cl_ulong4. See section 6.1.5. */ typedef cl_ulong4 cl_ulong3; typedef union { cl_ulong CL_ALIGNED(64) s[8]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_ulong x, y, z, w; }; __extension__ struct{ cl_ulong s0, s1, s2, s3, s4, s5, s6, s7; }; __extension__ struct{ cl_ulong4 lo, hi; }; #endif #if defined( __CL_ULONG2__) __cl_ulong2 v2[4]; #endif #if defined( __CL_ULONG4__) __cl_ulong4 v4[2]; #endif #if defined( __CL_ULONG8__ ) __cl_ulong8 v8; #endif }cl_ulong8; typedef union { cl_ulong CL_ALIGNED(128) s[16]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_ulong x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; __extension__ struct{ cl_ulong s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; __extension__ struct{ cl_ulong8 lo, hi; }; #endif #if defined( __CL_ULONG2__) __cl_ulong2 v2[8]; #endif #if defined( __CL_ULONG4__) __cl_ulong4 v4[4]; #endif #if defined( __CL_ULONG8__ ) __cl_ulong8 v8[2]; #endif #if defined( __CL_ULONG16__ ) __cl_ulong16 v16; #endif }cl_ulong16; /* --- cl_floatn ---- */ typedef union { cl_float CL_ALIGNED(8) s[2]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_float x, y; }; __extension__ struct{ cl_float s0, s1; }; __extension__ struct{ cl_float lo, hi; }; #endif #if defined( __CL_FLOAT2__) __cl_float2 v2; #endif }cl_float2; typedef union { cl_float CL_ALIGNED(16) s[4]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_float x, y, z, w; }; __extension__ struct{ cl_float s0, s1, s2, s3; }; __extension__ struct{ cl_float2 lo, hi; }; #endif #if defined( __CL_FLOAT2__) __cl_float2 v2[2]; #endif #if defined( __CL_FLOAT4__) __cl_float4 v4; #endif }cl_float4; /* cl_float3 is identical in size, alignment and behavior to cl_float4. See section 6.1.5. */ typedef cl_float4 cl_float3; typedef union { cl_float CL_ALIGNED(32) s[8]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_float x, y, z, w; }; __extension__ struct{ cl_float s0, s1, s2, s3, s4, s5, s6, s7; }; __extension__ struct{ cl_float4 lo, hi; }; #endif #if defined( __CL_FLOAT2__) __cl_float2 v2[4]; #endif #if defined( __CL_FLOAT4__) __cl_float4 v4[2]; #endif #if defined( __CL_FLOAT8__ ) __cl_float8 v8; #endif }cl_float8; typedef union { cl_float CL_ALIGNED(64) s[16]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_float x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; __extension__ struct{ cl_float s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; __extension__ struct{ cl_float8 lo, hi; }; #endif #if defined( __CL_FLOAT2__) __cl_float2 v2[8]; #endif #if defined( __CL_FLOAT4__) __cl_float4 v4[4]; #endif #if defined( __CL_FLOAT8__ ) __cl_float8 v8[2]; #endif #if defined( __CL_FLOAT16__ ) __cl_float16 v16; #endif }cl_float16; /* --- cl_doublen ---- */ typedef union { cl_double CL_ALIGNED(16) s[2]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_double x, y; }; __extension__ struct{ cl_double s0, s1; }; __extension__ struct{ cl_double lo, hi; }; #endif #if defined( __CL_DOUBLE2__) __cl_double2 v2; #endif }cl_double2; typedef union { cl_double CL_ALIGNED(32) s[4]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_double x, y, z, w; }; __extension__ struct{ cl_double s0, s1, s2, s3; }; __extension__ struct{ cl_double2 lo, hi; }; #endif #if defined( __CL_DOUBLE2__) __cl_double2 v2[2]; #endif #if defined( __CL_DOUBLE4__) __cl_double4 v4; #endif }cl_double4; /* cl_double3 is identical in size, alignment and behavior to cl_double4. See section 6.1.5. */ typedef cl_double4 cl_double3; typedef union { cl_double CL_ALIGNED(64) s[8]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_double x, y, z, w; }; __extension__ struct{ cl_double s0, s1, s2, s3, s4, s5, s6, s7; }; __extension__ struct{ cl_double4 lo, hi; }; #endif #if defined( __CL_DOUBLE2__) __cl_double2 v2[4]; #endif #if defined( __CL_DOUBLE4__) __cl_double4 v4[2]; #endif #if defined( __CL_DOUBLE8__ ) __cl_double8 v8; #endif }cl_double8; typedef union { cl_double CL_ALIGNED(128) s[16]; #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) __extension__ struct{ cl_double x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; __extension__ struct{ cl_double s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; __extension__ struct{ cl_double8 lo, hi; }; #endif #if defined( __CL_DOUBLE2__) __cl_double2 v2[8]; #endif #if defined( __CL_DOUBLE4__) __cl_double4 v4[4]; #endif #if defined( __CL_DOUBLE8__ ) __cl_double8 v8[2]; #endif #if defined( __CL_DOUBLE16__ ) __cl_double16 v16; #endif }cl_double16; /* Macro to facilitate debugging * Usage: * Place CL_PROGRAM_STRING_DEBUG_INFO on the line before the first line of your source. * The first line ends with: CL_PROGRAM_STRING_BEGIN \" * Each line thereafter of OpenCL C source must end with: \n\ * The last line ends in "; * * Example: * * const char *my_program = CL_PROGRAM_STRING_BEGIN "\ * kernel void foo( int a, float * b ) \n\ * { \n\ * // my comment \n\ * *b[ get_global_id(0)] = a; \n\ * } \n\ * "; * * This should correctly set up the line, (column) and file information for your source * string so you can do source level debugging. */ #define __CL_STRINGIFY( _x ) # _x #define _CL_STRINGIFY( _x ) __CL_STRINGIFY( _x ) #define CL_PROGRAM_STRING_DEBUG_INFO "#line " _CL_STRINGIFY(__LINE__) " \"" __FILE__ "\" \n\n" #ifdef __cplusplus } #endif #endif /* __CL_PLATFORM_H */ starpu-1.2.3+dfsg/socl/src/CL/opencl.h000066400000000000000000000033161320135501600174270ustar00rootroot00000000000000/******************************************************************************* * Copyright (c) 2008-2010 The Khronos Group Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and/or associated documentation files (the * "Materials"), to deal in the Materials without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Materials, and to * permit persons to whom the Materials are furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Materials. * * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. ******************************************************************************/ /* $Revision: 11708 $ on $Date: 2010-06-13 23:36:24 -0700 (Sun, 13 Jun 2010) $ */ #ifndef __OPENCL_H #define __OPENCL_H #ifdef __cplusplus extern "C" { #endif #ifdef __APPLE__ #include #include #include #include #else #include "cl.h" #include "cl_gl.h" #include "cl_gl_ext.h" #include "cl_ext.h" #endif #ifdef __cplusplus } #endif #endif /* __OPENCL_H */ starpu-1.2.3+dfsg/socl/src/Makefile.am000066400000000000000000000074561320135501600175450ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2012, 2014-2016 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2015 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. include $(top_srcdir)/starpu.mk CLEANFILES = *.gcno *.gcda AM_CFLAGS = $(GLOBAL_AM_CFLAGS) $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(HWLOC_CFLAGS) libsocl_@STARPU_EFFECTIVE_VERSION@_la_LIBADD = $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la AM_CPPFLAGS = -DBUILDING_SOCL -I$(top_srcdir)/include/ -I$(top_builddir)/include -I$(top_builddir)/src -I$(top_srcdir)/src -I$(top_srcdir)/socl/src AM_LDFLAGS = $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) -no-undefined SUBDIRS = lib_LTLIBRARIES = libsocl-@STARPU_EFFECTIVE_VERSION@.la noinst_HEADERS = \ command.h \ command_list.h \ command_queue.h \ debug.h \ event.h \ gc.h \ getinfo.h \ mem_objects.h \ ocl_icd.h \ socl.h \ task.h \ util.h \ init.h \ CL/cl_d3d10.h \ CL/cl_ext.h \ CL/cl.h \ CL/cl_d3d11.h \ CL/cl_gl_ext.h \ CL/cl_platform.h \ CL/cl_dx9_media_sharing.h \ CL/cl_gl.h \ CL/opencl.h libsocl_@STARPU_EFFECTIVE_VERSION@_la_LDFLAGS = $(ldflags) -no-undefined \ -version-info $(LIBSOCL_INTERFACE_CURRENT):$(LIBSOCL_INTERFACE_REVISION):$(LIBSOCL_INTERFACE_AGE) libsocl_@STARPU_EFFECTIVE_VERSION@_la_SOURCES = \ command.c \ command_list.c \ command_queue.c \ debug.c \ event.c \ gc.c \ init.c \ mem_objects.c \ socl.c \ task.c \ util.c \ cl_getplatformids.c \ cl_getplatforminfo.c \ cl_getdeviceids.c \ cl_getdeviceinfo.c \ cl_releasecontext.c \ cl_createcontext.c \ cl_createcontextfromtype.c \ cl_retaincontext.c \ cl_getcontextinfo.c \ cl_releasecommandqueue.c \ cl_createcommandqueue.c \ cl_retaincommandqueue.c \ cl_getcommandqueueinfo.c \ cl_setcommandqueueproperty.c \ cl_releaseevent.c \ cl_waitforevents.c \ cl_geteventinfo.c \ cl_retainevent.c \ cl_enqueuemarker.c \ cl_enqueuewaitforevents.c \ cl_enqueuebarrier.c \ cl_flush.c \ cl_finish.c \ cl_releasememobject.c \ cl_createbuffer.c \ cl_createimage2d.c \ cl_createimage3d.c \ cl_retainmemobject.c \ cl_getsupportedimageformats.c \ cl_getmemobjectinfo.c \ cl_getimageinfo.c \ cl_createsampler.c \ cl_retainsampler.c \ cl_releasesampler.c \ cl_getsamplerinfo.c \ cl_releaseprogram.c \ cl_createprogramwithsource.c \ cl_createprogramwithbinary.c \ cl_retainprogram.c \ cl_buildprogram.c \ cl_unloadcompiler.c \ cl_getprograminfo.c \ cl_getprogrambuildinfo.c \ cl_releasekernel.c \ cl_createkernel.c \ cl_createkernelsinprogram.c \ cl_retainkernel.c \ cl_setkernelarg.c \ cl_getkernelinfo.c \ cl_getkernelworkgroupinfo.c \ cl_enqueuereadbuffer.c \ cl_enqueuewritebuffer.c \ cl_enqueuecopybuffer.c \ cl_enqueuereadimage.c \ cl_enqueuewriteimage.c \ cl_enqueuecopyimage.c \ cl_enqueuecopyimagetobuffer.c \ cl_enqueuecopybuffertoimage.c \ cl_enqueuemapbuffer.c \ cl_enqueuemapimage.c \ cl_enqueueunmapmemobject.c \ cl_enqueuetask.c \ cl_enqueuendrangekernel.c \ cl_enqueuenativekernel.c \ cl_enqueuemarkerwithwaitlist.c \ cl_enqueuebarrierwithwaitlist.c \ cl_geteventprofilinginfo.c \ cl_getextensionfunctionaddress.c \ cl_icdgetplatformidskhr.c starpu-1.2.3+dfsg/socl/src/Makefile.in000066400000000000000000001255371320135501600175570ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2012, 2014-2016 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2015 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = socl/src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) libsocl_@STARPU_EFFECTIVE_VERSION@_la_DEPENDENCIES = \ $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la am_libsocl_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS = command.lo \ command_list.lo command_queue.lo debug.lo event.lo gc.lo \ init.lo mem_objects.lo socl.lo task.lo util.lo \ cl_getplatformids.lo cl_getplatforminfo.lo cl_getdeviceids.lo \ cl_getdeviceinfo.lo cl_releasecontext.lo cl_createcontext.lo \ cl_createcontextfromtype.lo cl_retaincontext.lo \ cl_getcontextinfo.lo cl_releasecommandqueue.lo \ cl_createcommandqueue.lo cl_retaincommandqueue.lo \ cl_getcommandqueueinfo.lo cl_setcommandqueueproperty.lo \ cl_releaseevent.lo cl_waitforevents.lo cl_geteventinfo.lo \ cl_retainevent.lo cl_enqueuemarker.lo \ cl_enqueuewaitforevents.lo cl_enqueuebarrier.lo cl_flush.lo \ cl_finish.lo cl_releasememobject.lo cl_createbuffer.lo \ cl_createimage2d.lo cl_createimage3d.lo cl_retainmemobject.lo \ cl_getsupportedimageformats.lo cl_getmemobjectinfo.lo \ cl_getimageinfo.lo cl_createsampler.lo cl_retainsampler.lo \ cl_releasesampler.lo cl_getsamplerinfo.lo cl_releaseprogram.lo \ cl_createprogramwithsource.lo cl_createprogramwithbinary.lo \ cl_retainprogram.lo cl_buildprogram.lo cl_unloadcompiler.lo \ cl_getprograminfo.lo cl_getprogrambuildinfo.lo \ cl_releasekernel.lo cl_createkernel.lo \ cl_createkernelsinprogram.lo cl_retainkernel.lo \ cl_setkernelarg.lo cl_getkernelinfo.lo \ cl_getkernelworkgroupinfo.lo cl_enqueuereadbuffer.lo \ cl_enqueuewritebuffer.lo cl_enqueuecopybuffer.lo \ cl_enqueuereadimage.lo cl_enqueuewriteimage.lo \ cl_enqueuecopyimage.lo cl_enqueuecopyimagetobuffer.lo \ cl_enqueuecopybuffertoimage.lo cl_enqueuemapbuffer.lo \ cl_enqueuemapimage.lo cl_enqueueunmapmemobject.lo \ cl_enqueuetask.lo cl_enqueuendrangekernel.lo \ cl_enqueuenativekernel.lo cl_enqueuemarkerwithwaitlist.lo \ cl_enqueuebarrierwithwaitlist.lo cl_geteventprofilinginfo.lo \ cl_getextensionfunctionaddress.lo cl_icdgetplatformidskhr.lo libsocl_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS = \ $(am_libsocl_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libsocl_@STARPU_EFFECTIVE_VERSION@_la_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libsocl_@STARPU_EFFECTIVE_VERSION@_la_LDFLAGS) $(LDFLAGS) -o \ $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/common -I$(top_builddir)/include -I$(top_builddir)/gcc-plugin/include/starpu-gcc -I$(top_builddir)/starpu-top depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libsocl_@STARPU_EFFECTIVE_VERSION@_la_SOURCES) DIST_SOURCES = $(libsocl_@STARPU_EFFECTIVE_VERSION@_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/build-aux/depcomp $(top_srcdir)/starpu.mk DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POTI_CFLAGS = @POTI_CFLAGS@ POTI_LIBS = @POTI_LIBS@ PROG_DATE = @PROG_DATE@ PROG_STAT = @PROG_STAT@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_COI_CPPFLAGS = @STARPU_COI_CPPFLAGS@ STARPU_COI_LDFLAGS = @STARPU_COI_LDFLAGS@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LEVELDB_LDFLAGS = @STARPU_LEVELDB_LDFLAGS@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RCCE_CFLAGS = @STARPU_RCCE_CFLAGS@ STARPU_RCCE_CPPFLAGS = @STARPU_RCCE_CPPFLAGS@ STARPU_RCCE_LDFLAGS = @STARPU_RCCE_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SCIF_CPPFLAGS = @STARPU_SCIF_CPPFLAGS@ STARPU_SCIF_LDFLAGS = @STARPU_SCIF_LDFLAGS@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SC_HYPERVISOR_DEBUG = @STARPU_SC_HYPERVISOR_DEBUG@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ mpifort_path = @mpifort_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ smpirun_path = @smpirun_path@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ CLEANFILES = *.gcno *.gcda AM_CFLAGS = $(GLOBAL_AM_CFLAGS) $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(HWLOC_CFLAGS) libsocl_@STARPU_EFFECTIVE_VERSION@_la_LIBADD = $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la AM_CPPFLAGS = -DBUILDING_SOCL -I$(top_srcdir)/include/ -I$(top_builddir)/include -I$(top_builddir)/src -I$(top_srcdir)/src -I$(top_srcdir)/socl/src AM_LDFLAGS = $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) -no-undefined SUBDIRS = lib_LTLIBRARIES = libsocl-@STARPU_EFFECTIVE_VERSION@.la noinst_HEADERS = \ command.h \ command_list.h \ command_queue.h \ debug.h \ event.h \ gc.h \ getinfo.h \ mem_objects.h \ ocl_icd.h \ socl.h \ task.h \ util.h \ init.h \ CL/cl_d3d10.h \ CL/cl_ext.h \ CL/cl.h \ CL/cl_d3d11.h \ CL/cl_gl_ext.h \ CL/cl_platform.h \ CL/cl_dx9_media_sharing.h \ CL/cl_gl.h \ CL/opencl.h libsocl_@STARPU_EFFECTIVE_VERSION@_la_LDFLAGS = $(ldflags) -no-undefined \ -version-info $(LIBSOCL_INTERFACE_CURRENT):$(LIBSOCL_INTERFACE_REVISION):$(LIBSOCL_INTERFACE_AGE) libsocl_@STARPU_EFFECTIVE_VERSION@_la_SOURCES = \ command.c \ command_list.c \ command_queue.c \ debug.c \ event.c \ gc.c \ init.c \ mem_objects.c \ socl.c \ task.c \ util.c \ cl_getplatformids.c \ cl_getplatforminfo.c \ cl_getdeviceids.c \ cl_getdeviceinfo.c \ cl_releasecontext.c \ cl_createcontext.c \ cl_createcontextfromtype.c \ cl_retaincontext.c \ cl_getcontextinfo.c \ cl_releasecommandqueue.c \ cl_createcommandqueue.c \ cl_retaincommandqueue.c \ cl_getcommandqueueinfo.c \ cl_setcommandqueueproperty.c \ cl_releaseevent.c \ cl_waitforevents.c \ cl_geteventinfo.c \ cl_retainevent.c \ cl_enqueuemarker.c \ cl_enqueuewaitforevents.c \ cl_enqueuebarrier.c \ cl_flush.c \ cl_finish.c \ cl_releasememobject.c \ cl_createbuffer.c \ cl_createimage2d.c \ cl_createimage3d.c \ cl_retainmemobject.c \ cl_getsupportedimageformats.c \ cl_getmemobjectinfo.c \ cl_getimageinfo.c \ cl_createsampler.c \ cl_retainsampler.c \ cl_releasesampler.c \ cl_getsamplerinfo.c \ cl_releaseprogram.c \ cl_createprogramwithsource.c \ cl_createprogramwithbinary.c \ cl_retainprogram.c \ cl_buildprogram.c \ cl_unloadcompiler.c \ cl_getprograminfo.c \ cl_getprogrambuildinfo.c \ cl_releasekernel.c \ cl_createkernel.c \ cl_createkernelsinprogram.c \ cl_retainkernel.c \ cl_setkernelarg.c \ cl_getkernelinfo.c \ cl_getkernelworkgroupinfo.c \ cl_enqueuereadbuffer.c \ cl_enqueuewritebuffer.c \ cl_enqueuecopybuffer.c \ cl_enqueuereadimage.c \ cl_enqueuewriteimage.c \ cl_enqueuecopyimage.c \ cl_enqueuecopyimagetobuffer.c \ cl_enqueuecopybuffertoimage.c \ cl_enqueuemapbuffer.c \ cl_enqueuemapimage.c \ cl_enqueueunmapmemobject.c \ cl_enqueuetask.c \ cl_enqueuendrangekernel.c \ cl_enqueuenativekernel.c \ cl_enqueuemarkerwithwaitlist.c \ cl_enqueuebarrierwithwaitlist.c \ cl_geteventprofilinginfo.c \ cl_getextensionfunctionaddress.c \ cl_icdgetplatformidskhr.c all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/starpu.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign socl/src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign socl/src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/starpu.mk $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libsocl-@STARPU_EFFECTIVE_VERSION@.la: $(libsocl_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS) $(libsocl_@STARPU_EFFECTIVE_VERSION@_la_DEPENDENCIES) $(EXTRA_libsocl_@STARPU_EFFECTIVE_VERSION@_la_DEPENDENCIES) $(AM_V_CCLD)$(libsocl_@STARPU_EFFECTIVE_VERSION@_la_LINK) -rpath $(libdir) $(libsocl_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS) $(libsocl_@STARPU_EFFECTIVE_VERSION@_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_buildprogram.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_createbuffer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_createcommandqueue.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_createcontext.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_createcontextfromtype.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_createimage2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_createimage3d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_createkernel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_createkernelsinprogram.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_createprogramwithbinary.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_createprogramwithsource.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_createsampler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuebarrier.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuebarrierwithwaitlist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuecopybuffer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuecopybuffertoimage.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuecopyimage.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuecopyimagetobuffer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuemapbuffer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuemapimage.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuemarker.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuemarkerwithwaitlist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuenativekernel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuendrangekernel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuereadbuffer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuereadimage.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuetask.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueueunmapmemobject.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuewaitforevents.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuewritebuffer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuewriteimage.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_finish.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_flush.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getcommandqueueinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getcontextinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getdeviceids.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getdeviceinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_geteventinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_geteventprofilinginfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getextensionfunctionaddress.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getimageinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getkernelinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getkernelworkgroupinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getmemobjectinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getplatformids.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getplatforminfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getprogrambuildinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getprograminfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getsamplerinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getsupportedimageformats.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_icdgetplatformidskhr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_releasecommandqueue.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_releasecontext.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_releaseevent.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_releasekernel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_releasememobject.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_releaseprogram.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_releasesampler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_retaincommandqueue.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_retaincontext.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_retainevent.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_retainkernel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_retainmemobject.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_retainprogram.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_retainsampler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_setcommandqueueproperty.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_setkernelarg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_unloadcompiler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_waitforevents.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/command.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/command_list.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/command_queue.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/event.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mem_objects.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/socl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/task.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libLTLIBRARIES \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES .PRECIOUS: Makefile showcheck: -cat $(TEST_LOGS) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q " runtime error: " $(TEST_LOGS) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.2.3+dfsg/socl/src/cl_buildprogram.c000066400000000000000000000075561320135501600210230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" struct bp_data { cl_program program; char * options; const cl_device_id * device_list; cl_uint num_devices; }; static void soclBuildProgram_task(void *data) { struct bp_data *d = (struct bp_data*)data; cl_device_id device; cl_int err; unsigned int i; int wid = starpu_worker_get_id_check(); /* Check if the kernel has to be built for this device */ for (i=0; i <= d->num_devices; i++) { if (i == d->num_devices) return; if (d->device_list[i]->worker_id == wid) break; } int range = starpu_worker_get_range(); starpu_opencl_get_device(wid, &device); DEBUG_MSG("[Worker %d] Building program...\n", wid); cl_device_type dev_type; clGetDeviceInfo(device, CL_DEVICE_TYPE, sizeof(cl_device_type), &dev_type, NULL); char * dev_type_str = (dev_type == CL_DEVICE_TYPE_CPU ? "CPU" : dev_type == CL_DEVICE_TYPE_GPU ? "GPU" : dev_type == CL_DEVICE_TYPE_ACCELERATOR ? "ACCELERATOR" : "UNKNOWN"); char opts[4096]; sprintf(opts, "-DSOCL_DEVICE_TYPE_%s %s", dev_type_str, (d->options != NULL ? d->options : "")); err = clBuildProgram(d->program->cl_programs[range], 1, &device, opts, NULL, NULL); if (err != CL_SUCCESS) { size_t len; clGetProgramBuildInfo(d->program->cl_programs[range], device, CL_PROGRAM_BUILD_LOG, 0, NULL, &len); char * buffer = malloc(len+1); buffer[len] = '\0'; clGetProgramBuildInfo(d->program->cl_programs[range], device, CL_PROGRAM_BUILD_LOG, len, buffer, NULL); DEBUG_CL("clBuildProgram", err); ERROR_MSG("clBuildProgram: %s\n Aborting.\n", buffer); free(buffer); } DEBUG_MSG("[Worker %d] Done building.\n", wid); } CL_API_ENTRY cl_int CL_API_CALL soclBuildProgram(cl_program program, cl_uint num_devices, const cl_device_id * device_list, const char * options, void (*pfn_notify)(cl_program program, void * user_data), void * user_data) CL_API_SUFFIX__VERSION_1_0 { struct bp_data *data; program->options = options != NULL ? strdup(options) : NULL; program->options_size = options != NULL ? strlen(options)+1 : 0; data = (struct bp_data*)malloc(sizeof(struct bp_data)); gc_entity_store(&data->program, program); data->options = (char*)options; /* If the device list is empty, we compile for every device in the context associated to the program */ if (device_list == NULL) { num_devices = program->context->num_devices; device_list = program->context->devices; } data->num_devices = num_devices; data->device_list = device_list; /*FIXME: starpu_execute_on_specific_workers is synchronous. * However pfn_notify is useful only because build is supposed to be asynchronous */ unsigned workers[num_devices]; unsigned i; for (i=0; iworker_id; } starpu_execute_on_specific_workers(soclBuildProgram_task, data, num_devices, workers, "SOCL_BUILD_PROGRAM"); if (pfn_notify != NULL) pfn_notify(program, user_data); gc_entity_unstore(&data->program); free(data); return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_createbuffer.c000066400000000000000000000104531320135501600207570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" static void release_callback_memobject(void * e) { cl_mem mem = (cl_mem)e; /* Release references */ gc_entity_unstore(&mem->context); //Delete this mem_object from the mem_object list mem_object_release(mem); /* Destruct object */ starpu_data_unregister_submit(mem->handle); if (!(mem->flags & CL_MEM_USE_HOST_PTR)) free(mem->ptr); } /** * \brief Create a buffer * * A buffer has always an allocated region in host memory. If CL_MEM_USE_HOST_PTR * is set, we use memory pointed by host_ptr, otherwise some host memory is * allocated. * * If CL_MEM_USE_HOST_PTR or CL_MEM_ALLOC_HOST_PTR are set, memory pointed by host_ptr * is not coherent. To enforce coherency, you have to map the buffer (clEnqueueMapBuffer). * * If CL_MEM_COPY_HOST_PTR is set, the buffer will be duplicated in host memory. You * should avoid it. * */ CL_API_ENTRY cl_mem CL_API_CALL soclCreateBuffer(cl_context context, cl_mem_flags flags, size_t size, void * host_ptr, cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0 { cl_mem mem; if (errcode_ret != NULL) *errcode_ret = CL_SUCCESS; //Check flags if (((flags & CL_MEM_READ_ONLY) && (flags & CL_MEM_WRITE_ONLY)) || ((flags & CL_MEM_READ_WRITE) && (flags & CL_MEM_READ_ONLY)) || ((flags & CL_MEM_READ_WRITE) && (flags & CL_MEM_WRITE_ONLY)) || ((flags & CL_MEM_USE_HOST_PTR) && (flags & CL_MEM_ALLOC_HOST_PTR)) || ((flags & CL_MEM_USE_HOST_PTR) && (flags & CL_MEM_COPY_HOST_PTR))) { if (errcode_ret != NULL) *errcode_ret = CL_INVALID_VALUE; return NULL; } if (size == 0) { if (errcode_ret != NULL) *errcode_ret = CL_INVALID_BUFFER_SIZE; return NULL; } if ((host_ptr == NULL && (flags & (CL_MEM_USE_HOST_PTR | CL_MEM_COPY_HOST_PTR))) || (host_ptr != NULL && !(flags & (CL_MEM_USE_HOST_PTR | CL_MEM_COPY_HOST_PTR)))) { if (errcode_ret != NULL) *errcode_ret = CL_INVALID_HOST_PTR; return NULL; } //Alloc cl_mem structure mem = (cl_mem)gc_entity_alloc(sizeof(struct _cl_mem), release_callback_memobject, "buffer"); if (mem == NULL) { if (errcode_ret != NULL) *errcode_ret = CL_OUT_OF_HOST_MEMORY; return NULL; } mem->ptr = NULL; mem->map_count = 0; gc_entity_store(&mem->context, context); mem->flags = flags; mem->size = size; mem->host_ptr = host_ptr; #ifdef DEBUG static int id = 0; mem->id = id++; #endif mem_object_store(mem); //TODO: we shouldn't allocate the buffer ourselves. StarPU allocates it if a NULL pointer is given // If not MEM_USE_HOST_PTR, we need to alloc the buffer ourselves if (!(flags & CL_MEM_USE_HOST_PTR)) { mem->ptr = valloc(size); if (mem->ptr == NULL) { if (errcode_ret != NULL) *errcode_ret = CL_MEM_OBJECT_ALLOCATION_FAILURE; free(mem); return NULL; } //The buffer doesn't contain meaningful data mem->scratch = 1; } else { //The buffer may contain meaningful data mem->scratch = 0; mem->ptr = host_ptr; } // Access mode mem->mode = (flags & CL_MEM_READ_ONLY) ? CL_MEM_READ_ONLY : (flags & CL_MEM_WRITE_ONLY) ? CL_MEM_WRITE_ONLY : CL_MEM_READ_WRITE; // Perform data copy if necessary if (flags & CL_MEM_COPY_HOST_PTR) memcpy(mem->ptr, host_ptr, size); // Create StarPU buffer (on home node? what's this?) starpu_variable_data_register(&mem->handle, STARPU_MAIN_RAM, (uintptr_t)mem->ptr, size); DEBUG_MSG("[Buffer %d] Initialized (cl_mem %p handle %p)\n", mem->id, mem, mem->handle); return mem; } starpu-1.2.3+dfsg/socl/src/cl_createcommandqueue.c000066400000000000000000000046511320135501600221740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" static void release_callback_command_queue(void * e) { cl_command_queue cq = (cl_command_queue)e; //Disable StarPU profiling if necessary if (cq->properties & CL_QUEUE_PROFILING_ENABLE) { profiling_queue_count -= 1; if (profiling_queue_count == 0) starpu_profiling_status_set(STARPU_PROFILING_DISABLE); } /* Release references */ gc_entity_unstore(&cq->context); /* Destruct object */ starpu_pthread_mutex_destroy(&cq->mutex); } CL_API_ENTRY cl_command_queue CL_API_CALL soclCreateCommandQueue(cl_context context, cl_device_id device, cl_command_queue_properties properties, cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0 { cl_command_queue cq; cq = (cl_command_queue)gc_entity_alloc(sizeof(struct _cl_command_queue), release_callback_command_queue, "command_queue"); if (cq == NULL) { if (errcode_ret != NULL) *errcode_ret = CL_OUT_OF_HOST_MEMORY; return NULL; } cq->properties = properties; gc_entity_store(&cq->context, context); char * fd = getenv("SOCL_FORCE_DYNAMIC"); int force_dynamic = fd == NULL ? 0 : atoi(fd); cq->device = force_dynamic ? NULL : device; #ifdef DEBUG static int id = 0; cq->id = id++; #endif //Enable StarPU profiling if necessary if (properties & CL_QUEUE_PROFILING_ENABLE) { if (profiling_queue_count == 0) starpu_profiling_status_set(STARPU_PROFILING_ENABLE); profiling_queue_count += 1; } cq->commands = NULL; cq->barrier = NULL; starpu_pthread_mutex_init(&cq->mutex, NULL); if (errcode_ret != NULL) *errcode_ret = CL_SUCCESS; return cq; } starpu-1.2.3+dfsg/socl/src/cl_createcontext.c000066400000000000000000000103121320135501600211640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" static void release_callback_context(void * e) { cl_context context = (cl_context)e; /* Destruct object */ if (context->properties != NULL) free(context->properties); //FIXME: should we free StarPU contexts? //starpu_sched_ctx_finished_submit(context->sched_ctx); free(context->devices); } static char * defaultScheduler = "dmda"; static char * defaultName = "default"; CL_API_ENTRY cl_context CL_API_CALL soclCreateContext(const cl_context_properties * properties, cl_uint num_devices, const cl_device_id * devices, void (*pfn_notify)(const char *, const void *, size_t, void *), void * user_data, cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0 { if (pfn_notify == NULL && user_data != NULL) { if (errcode_ret != NULL) *errcode_ret = CL_INVALID_VALUE; return NULL; } //Check properties if (properties != NULL) { const cl_context_properties *p = properties; int i = 0; while (p[i] != 0) { switch (p[i]) { case CL_CONTEXT_PLATFORM: i++; if (p[i] != (cl_context_properties)&socl_platform) { if (errcode_ret != NULL) *errcode_ret = CL_INVALID_PLATFORM; return NULL; } break; case CL_CONTEXT_SCHEDULER_SOCL: case CL_CONTEXT_NAME_SOCL: i++; if (p[i] == 0) { if (errcode_ret != NULL) *errcode_ret = CL_INVALID_PROPERTY; return NULL; } break; } i++; } } cl_context ctx; ctx = (cl_context)gc_entity_alloc(sizeof(struct _cl_context), release_callback_context, "context"); if (ctx == NULL) { if (errcode_ret != NULL) *errcode_ret = CL_OUT_OF_HOST_MEMORY; return NULL; } ctx->num_properties = 0; ctx->properties = NULL; char * sched = getenv("STARPU_SCHED"); char * scheduler = sched == NULL ? defaultScheduler : sched; char * name = defaultName; // Properties if (properties != NULL) { //Count properties const cl_context_properties * p = properties; do { ctx->num_properties++; p++; } while (*p != 0); //Copy properties ctx->properties = malloc(sizeof(cl_context_properties) * ctx->num_properties); memcpy(ctx->properties, properties, sizeof(cl_context_properties) * ctx->num_properties); //Selected scheduler cl_uint i = 0; for (i=0; inum_properties; i++) { if (p[i] == CL_CONTEXT_SCHEDULER_SOCL) { i++; scheduler = (char*)p[i]; } if (p[i] == CL_CONTEXT_NAME_SOCL) { i++; name = (char*)p[i]; } } } ctx->pfn_notify = pfn_notify; ctx->user_data = user_data; ctx->num_devices = num_devices; #ifdef DEBUG static int id = 0; ctx->id = id++; #endif ctx->devices = malloc(sizeof(cl_device_id) * num_devices); memcpy(ctx->devices, devices, sizeof(cl_device_id)*num_devices); // Create context int workers[num_devices]; unsigned int i; for (i=0; idevices[i]->worker_id; } ctx->sched_ctx = starpu_sched_ctx_create(workers, num_devices, name, STARPU_SCHED_CTX_POLICY_NAME, scheduler, 0); if (errcode_ret != NULL) *errcode_ret = CL_SUCCESS; return ctx; } starpu-1.2.3+dfsg/socl/src/cl_createcontextfromtype.c000066400000000000000000000031251320135501600227560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 University of Bordeaux * Copyright (C) 2012 CNRS * Copyright (C) 2012 Vincent Danjean * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" #include "init.h" CL_API_ENTRY cl_context CL_API_CALL soclCreateContextFromType(const cl_context_properties * properties, cl_device_type device_type, void (*pfn_notify)(const char *, const void *, size_t, void *), void * user_data, cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0 { if( ! _starpu_init ) socl_init_starpu(); //TODO: appropriate error messages cl_uint num_devices; soclGetDeviceIDs(&socl_platform, device_type, 0, NULL, &num_devices); cl_device_id devices[num_devices]; soclGetDeviceIDs(&socl_platform, device_type, num_devices, devices, NULL); return soclCreateContext(properties, num_devices, devices, pfn_notify, user_data, errcode_ret); } starpu-1.2.3+dfsg/socl/src/cl_createimage2d.c000066400000000000000000000024251320135501600210160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_mem CL_API_CALL soclCreateImage2D(cl_context UNUSED(context), cl_mem_flags UNUSED(flags), const cl_image_format * UNUSED(image_format), size_t UNUSED(image_width), size_t UNUSED(image_height), size_t UNUSED(image_row_pitch), void * UNUSED(host_ptr), cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0 { if (errcode_ret != NULL) *errcode_ret = CL_INVALID_OPERATION; return NULL; } starpu-1.2.3+dfsg/socl/src/cl_createimage3d.c000066400000000000000000000026301320135501600210150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_mem CL_API_CALL soclCreateImage3D(cl_context UNUSED(context), cl_mem_flags UNUSED(flags), const cl_image_format * UNUSED(image_format), size_t UNUSED(image_width), size_t UNUSED(image_height), size_t UNUSED(image_depth), size_t UNUSED(image_row_pitch), size_t UNUSED(image_slice_pitch), void * UNUSED(host_ptr), cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0 { if (errcode_ret != NULL) *errcode_ret = CL_INVALID_OPERATION; return NULL; } starpu-1.2.3+dfsg/socl/src/cl_createkernel.c000066400000000000000000000134461320135501600207730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * Copyright (C) 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" static void soclCreateKernel_task(void *data) { struct _cl_kernel *k = (struct _cl_kernel *)data; int range = starpu_worker_get_range(); cl_int err; if (k->program->cl_programs[range] == NULL) { k->errcodes[range] = CL_SUCCESS; DEBUG_MSG("[Device %u] Kernel creation skipped: program has not been built for this device.\n", starpu_worker_get_id_check()); return; } DEBUG_MSG("[Device %u] Creating kernel...\n", starpu_worker_get_id_check()); k->cl_kernels[range] = clCreateKernel(k->program->cl_programs[range], k->kernel_name, &err); if (err != CL_SUCCESS) { k->errcodes[range] = err; ERROR_STOP("[Device %u] Unable to create kernel. Error %d. Aborting.\n", starpu_worker_get_id_check(), err); return; } /* One worker creates argument structures */ if (__sync_bool_compare_and_swap(&k->num_args, 0, 666)) { unsigned int i; cl_uint num_args; err = clGetKernelInfo(k->cl_kernels[range], CL_KERNEL_NUM_ARGS, sizeof(num_args), &num_args, NULL); if (err != CL_SUCCESS) { DEBUG_CL("clGetKernelInfo", err); ERROR_STOP("Unable to get kernel argument count. Aborting.\n"); } k->num_args = num_args; DEBUG_MSG("Kernel has %d arguments\n", num_args); k->arg_size = (size_t*)malloc(sizeof(size_t) * num_args); k->arg_value = (void**)malloc(sizeof(void*) * num_args); k->arg_type = (enum kernel_arg_type*)malloc(sizeof(enum kernel_arg_type) * num_args); /* Settings default type to NULL */ for (i=0; iarg_value[i] = NULL; k->arg_type[i] = Null; } } } static void release_callback_kernel(void * e) { cl_kernel kernel = (cl_kernel)e; //Free args unsigned int i; for (i=0; inum_args; i++) { switch (kernel->arg_type[i]) { case Null: case Buffer: break; case Immediate: free(kernel->arg_value[i]); break; } } if (kernel->arg_size != NULL) free(kernel->arg_size); if (kernel->arg_value != NULL) free(kernel->arg_value); if (kernel->arg_type != NULL) free(kernel->arg_type); //Release real kernels... for (i=0; icl_kernels[i] != NULL) { cl_int err = clReleaseKernel(kernel->cl_kernels[i]); if (err != CL_SUCCESS) DEBUG_CL("clReleaseKernel", err); } } //Release perfmodel //FIXME: we cannot release performance models before StarPU shutdown as it //will use them to store kernel execution times //free(kernel->perfmodel); //free(kernel->kernel_name); gc_entity_unstore(&kernel->program); free(kernel->cl_kernels); free(kernel->errcodes); } CL_API_ENTRY cl_kernel CL_API_CALL soclCreateKernel(cl_program program, const char * kernel_name, cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0 { cl_kernel k; if (program == NULL) { if (errcode_ret != NULL) *errcode_ret = CL_INVALID_PROGRAM; return NULL; } //TODO: check programs (see opencl specs) /* Create Kernel structure */ k = (cl_kernel)gc_entity_alloc(sizeof(struct _cl_kernel), release_callback_kernel, "kernel"); if (k == NULL) { if (errcode_ret != NULL) *errcode_ret = CL_OUT_OF_HOST_MEMORY; return NULL; } gc_entity_store(&k->program, program); k->kernel_name = strdup(kernel_name); k->perfmodel = malloc(sizeof(struct starpu_perfmodel)); memset(k->perfmodel, 0, sizeof(struct starpu_perfmodel)); k->perfmodel->type = STARPU_HISTORY_BASED; k->perfmodel->symbol = k->kernel_name; k->num_args = 0; k->arg_value = NULL; k->arg_size = NULL; k->split_func = NULL; k->split_space = 0; k->split_data = NULL; k->split_perfs = NULL; starpu_pthread_mutex_init(&k->split_lock, NULL); #ifdef DEBUG static int id = 0; k->id = id++; #endif k->cl_kernels = (cl_kernel*)malloc(socl_device_count * sizeof(cl_kernel)); k->errcodes = (cl_int*)malloc(socl_device_count * sizeof(cl_int)); { unsigned int i; for (i=0; icl_kernels[i] = NULL; k->errcodes[i] = -9999; } } /* Create kernel on each device */ DEBUG_MSG("[Kernel %d] Create %u kernels (name \"%s\")\n", k->id, socl_device_count, kernel_name); starpu_execute_on_each_worker_ex(soclCreateKernel_task, k, STARPU_OPENCL, "SOCL_CREATE_KERNEL"); if (errcode_ret != NULL) { unsigned int i; *errcode_ret = CL_SUCCESS; for (i=0; ierrcodes[i]) { #define CASE_RET(e) case e: *errcode_ret = e; return k; CASE_RET(CL_INVALID_PROGRAM) CASE_RET(CL_INVALID_PROGRAM_EXECUTABLE) CASE_RET(CL_INVALID_KERNEL_NAME) CASE_RET(CL_INVALID_KERNEL_DEFINITION) CASE_RET(CL_INVALID_VALUE) CASE_RET(CL_OUT_OF_RESOURCES) CASE_RET(CL_OUT_OF_HOST_MEMORY) #undef CASE_RET } } if (k->num_args == 666) { *errcode_ret = CL_INVALID_PROGRAM_EXECUTABLE; return k; } } return k; } starpu-1.2.3+dfsg/socl/src/cl_createkernelsinprogram.c000066400000000000000000000017741320135501600230760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclCreateKernelsInProgram(cl_program UNUSED(program), cl_uint UNUSED(num_kernels), cl_kernel * UNUSED(kernels), cl_uint * UNUSED(num_kernels_ret)) CL_API_SUFFIX__VERSION_1_0 { //TODO return CL_INVALID_OPERATION; } starpu-1.2.3+dfsg/socl/src/cl_createprogramwithbinary.c000066400000000000000000000025331320135501600232560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_program CL_API_CALL soclCreateProgramWithBinary(cl_context UNUSED(context), cl_uint UNUSED(num_devices), const cl_device_id * UNUSED(device_list), const size_t * UNUSED(lengths), const unsigned char ** UNUSED(binaries), cl_int * UNUSED(binary_status), cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0 { //TODO if (errcode_ret != NULL) *errcode_ret = CL_INVALID_OPERATION; return NULL; } starpu-1.2.3+dfsg/socl/src/cl_createprogramwithsource.c000066400000000000000000000104521320135501600232710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * Copyright (C) 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" struct cpws_data { struct _cl_program *program; cl_int *errcodes; cl_uint count; char **strings; size_t *lengths; }; static void soclCreateProgramWithSource_task(void *data) { struct cpws_data *d = (struct cpws_data*)data; cl_context context; int wid = starpu_worker_get_id_check(); DEBUG_MSG("Worker id: %d\n", wid); int range = starpu_worker_get_range(); starpu_opencl_get_context(wid, &context); d->program->cl_programs[range] = clCreateProgramWithSource(context, d->count, (const char**)d->strings, d->lengths, &d->errcodes[range]); } static void release_callback_program(void * e) { cl_program program = (cl_program)e; unsigned int i; for (i=0; icl_programs[i] != NULL) { cl_int err = clReleaseProgram(program->cl_programs[i]); if (err != CL_SUCCESS) DEBUG_CL("clReleaseProgram", err); } } /* Release references */ gc_entity_unstore(&program->context); free(program->cl_programs); if (program->options != NULL) free(program->options); } CL_API_ENTRY cl_program CL_API_CALL soclCreateProgramWithSource(cl_context context, cl_uint count, const char ** strings, const size_t * lengths, cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0 { cl_program p; struct cpws_data *data; unsigned int i; if (errcode_ret != NULL) *errcode_ret = CL_SUCCESS; /* Check arguments */ if (count == 0 || strings == NULL) { if (errcode_ret != NULL) *errcode_ret = CL_INVALID_VALUE; return NULL; } /* Alloc cl_program structure */ p = (cl_program)gc_entity_alloc(sizeof(struct _cl_program), release_callback_program, "program"); if (p == NULL) { if (errcode_ret != NULL) *errcode_ret = CL_OUT_OF_HOST_MEMORY; return NULL; } gc_entity_store(&p->context, context); p->options = NULL; #ifdef DEBUG static int id = 0; p->id = id++; #endif p->cl_programs = (cl_program*)malloc(sizeof(cl_program) * socl_device_count); if (p->cl_programs == NULL) { if (errcode_ret != NULL) *errcode_ret = CL_OUT_OF_HOST_MEMORY; return NULL; } { for (i=0; icl_programs[i] = NULL; } /* Construct structure to pass arguments to workers */ data = (struct cpws_data*)malloc(sizeof(struct cpws_data)); if (data == NULL) { if (errcode_ret != NULL) *errcode_ret = CL_OUT_OF_HOST_MEMORY; return NULL; } data->count = count; data->program = p; data->strings = (char**)strings; data->lengths = (size_t*)lengths; data->errcodes = (cl_int*)malloc(sizeof(cl_int) * socl_device_count); for (i=0; ierrcodes[i] = CL_SUCCESS; } /* Init real cl_program for each OpenCL device */ unsigned workers[context->num_devices]; for (i=0; inum_devices; i++) { workers[i] = context->devices[i]->worker_id; } starpu_execute_on_specific_workers(soclCreateProgramWithSource_task, data, context->num_devices, workers, "SOCL_CREATE_PROGRAM"); if (errcode_ret != NULL) { *errcode_ret = CL_SUCCESS; for (i=0; ierrcodes[i] != CL_SUCCESS) { DEBUG_MSG("Worker [%u] failed\n", i); DEBUG_CL("clCreateProgramWithSource", data->errcodes[i]); *errcode_ret = data->errcodes[i]; break; } } } free(data->errcodes); free(data); return p; } starpu-1.2.3+dfsg/socl/src/cl_createsampler.c000066400000000000000000000021341320135501600211460ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_sampler CL_API_CALL soclCreateSampler(cl_context UNUSED(context), cl_bool UNUSED(normalized_coords), cl_addressing_mode UNUSED(addressing_mode), cl_filter_mode UNUSED(filter_mode), cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0 { if (errcode_ret != NULL) *errcode_ret = CL_INVALID_OPERATION; return NULL; } starpu-1.2.3+dfsg/socl/src/cl_enqueuebarrier.c000066400000000000000000000020301320135501600213300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclEnqueueBarrier(cl_command_queue cq) CL_API_SUFFIX__VERSION_1_0 { command_barrier cmd = command_barrier_create(); command_queue_enqueue(cq, cmd, 0, NULL); return CL_SUCCESS; } cl_int command_barrier_submit(command_barrier cmd) { struct starpu_task *task; task = task_create(CL_COMMAND_BARRIER); return task_submit(task, cmd); } starpu-1.2.3+dfsg/socl/src/cl_enqueuebarrierwithwaitlist.c000066400000000000000000000021201320135501600240050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2013 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclEnqueueBarrierWithWaitList(cl_command_queue cq, cl_uint num_events, const cl_event * events, cl_event * event) CL_API_SUFFIX__VERSION_1_2 { command_barrier cmd = command_barrier_create(); cl_event ev = command_event_get(cmd); command_queue_enqueue(cq, cmd, num_events, events); RETURN_EVENT(ev, event); return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_enqueuecopybuffer.c000066400000000000000000000070601320135501600220560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011, 2014, 2017 University of Bordeaux * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" static void soclEnqueueCopyBuffer_opencl_task(void *descr[], void *args) { int wid; cl_command_queue cq; cl_event ev; command_copy_buffer cmd = (command_copy_buffer)args; cl_event event = command_event_get(cmd); event->prof_start = _socl_nanotime(); gc_entity_release(event); wid = starpu_worker_get_id_check(); starpu_opencl_get_queue(wid, &cq); cl_mem src = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); cl_mem dst = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[1]); clEnqueueCopyBuffer(cq, src,dst, cmd->src_offset, cmd->dst_offset, cmd->cb, 0, NULL, &ev); clWaitForEvents(1, &ev); clReleaseEvent(ev); gc_entity_release_cmd(cmd); } static void soclEnqueueCopyBuffer_cpu_task(void *descr[], void *args) { command_copy_buffer cmd = (command_copy_buffer)args; cl_event ev = command_event_get(cmd); ev->prof_start = _socl_nanotime(); gc_entity_release(ev); char * src = (void*)STARPU_VARIABLE_GET_PTR(descr[0]); char * dst = (void*)STARPU_VARIABLE_GET_PTR(descr[1]); memcpy(dst+cmd->dst_offset, src+cmd->src_offset, cmd->cb); gc_entity_release_cmd(cmd); } static struct starpu_perfmodel copy_buffer_perfmodel = { .type = STARPU_HISTORY_BASED, .symbol = "SOCL_COPY_BUFFER" }; static struct starpu_codelet codelet_copybuffer = { .where = STARPU_CPU | STARPU_OPENCL, .model = ©_buffer_perfmodel, .cpu_funcs = { &soclEnqueueCopyBuffer_cpu_task }, .opencl_funcs = { &soclEnqueueCopyBuffer_opencl_task }, .modes = {STARPU_R, STARPU_RW}, .nbuffers = 2 }; cl_int command_copy_buffer_submit(command_copy_buffer cmd) { struct starpu_task * task = task_create(CL_COMMAND_COPY_BUFFER); task->handles[0] = cmd->src_buffer->handle; task->handles[1] = cmd->dst_buffer->handle; task->cl = &codelet_copybuffer; /* Execute the task on a specific worker? */ if (cmd->_command.event->cq->device != NULL) { task->execute_on_a_specific_worker = 1; task->workerid = cmd->_command.event->cq->device->worker_id; } gc_entity_store_cmd(&task->cl_arg, cmd); task->cl_arg_size = sizeof(*cmd); cmd->dst_buffer->scratch = 0; task_submit(task, cmd); return CL_SUCCESS; } CL_API_ENTRY cl_int CL_API_CALL soclEnqueueCopyBuffer(cl_command_queue cq, cl_mem src_buffer, cl_mem dst_buffer, size_t src_offset, size_t dst_offset, size_t cb, cl_uint num_events, const cl_event * events, cl_event * event) CL_API_SUFFIX__VERSION_1_0 { command_copy_buffer cmd = command_copy_buffer_create(src_buffer, dst_buffer, src_offset, dst_offset, cb); cl_event ev = command_event_get(cmd); command_queue_enqueue(cq, cmd, num_events, events); RETURN_EVENT(ev, event); return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_enqueuecopybuffertoimage.c000066400000000000000000000025211320135501600234210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclEnqueueCopyBufferToImage(cl_command_queue UNUSED(command_queue), cl_mem UNUSED(src_buffer), cl_mem UNUSED(dst_image), size_t UNUSED(src_offset), const size_t * UNUSED(dst_origin), const size_t * UNUSED(region), cl_uint UNUSED(num_events_in_wait_list), const cl_event * UNUSED(event_wait_list), cl_event * UNUSED(event)) CL_API_SUFFIX__VERSION_1_0 { return CL_INVALID_OPERATION; } starpu-1.2.3+dfsg/socl/src/cl_enqueuecopyimage.c000066400000000000000000000024521320135501600216670ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclEnqueueCopyImage(cl_command_queue UNUSED(command_queue), cl_mem UNUSED(src_image), cl_mem UNUSED(dst_image), const size_t * UNUSED(src_origin), const size_t * UNUSED(dst_origin), const size_t * UNUSED(region), cl_uint UNUSED(num_events_in_wait_list), const cl_event * UNUSED(event_wait_list), cl_event * UNUSED(event)) CL_API_SUFFIX__VERSION_1_0 { return CL_INVALID_OPERATION; } starpu-1.2.3+dfsg/socl/src/cl_enqueuecopyimagetobuffer.c000066400000000000000000000025211320135501600234210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclEnqueueCopyImageToBuffer(cl_command_queue UNUSED(command_queue), cl_mem UNUSED(src_image), cl_mem UNUSED(dst_buffer), const size_t * UNUSED(src_origin), const size_t * UNUSED(region), size_t UNUSED(dst_offset), cl_uint UNUSED(num_events_in_wait_list), const cl_event * UNUSED(event_wait_list), cl_event * UNUSED(event)) CL_API_SUFFIX__VERSION_1_0 { return CL_INVALID_OPERATION; } starpu-1.2.3+dfsg/socl/src/cl_enqueuemapbuffer.c000066400000000000000000000042361320135501600216630ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" static void mapbuffer_task(void *args) { command_map_buffer cmd = (command_map_buffer)args; cl_event ev = command_event_get(cmd); ev->prof_start = _socl_nanotime(); gc_entity_release(ev); enum starpu_data_access_mode mode = (cmd->map_flags == CL_MAP_READ ? STARPU_R : STARPU_RW); starpu_data_acquire_cb(cmd->buffer->handle, mode, command_completed_task_callback, cmd); } static struct starpu_codelet codelet_mapbuffer = { .name = "SOCL_MAP_BUFFER" }; cl_int command_map_buffer_submit(command_map_buffer cmd) { gc_entity_retain(cmd); cpu_task_submit(cmd, mapbuffer_task, cmd, 0, 0, &codelet_mapbuffer, 0, NULL); return CL_SUCCESS; } CL_API_ENTRY void * CL_API_CALL soclEnqueueMapBuffer(cl_command_queue cq, cl_mem buffer, cl_bool blocking, cl_map_flags map_flags, size_t offset, size_t cb, cl_uint num_events, const cl_event * events, cl_event * event, cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0 { command_map_buffer cmd = command_map_buffer_create(buffer, map_flags, offset, cb); cl_event ev = command_event_get(cmd); command_queue_enqueue(cq, cmd, num_events, events); if (errcode_ret != NULL) *errcode_ret = CL_SUCCESS; MAY_BLOCK_THEN_RETURN_EVENT(ev,blocking,event); return (void*)(starpu_variable_get_local_ptr(buffer->handle) + offset); } starpu-1.2.3+dfsg/socl/src/cl_enqueuemapimage.c000066400000000000000000000027501320135501600214730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY void * CL_API_CALL soclEnqueueMapImage(cl_command_queue UNUSED(command_queue), cl_mem UNUSED(image), cl_bool UNUSED(blocking_map), cl_map_flags UNUSED(map_flags), const size_t * UNUSED(origin), const size_t * UNUSED(region), size_t * UNUSED(image_row_pitch), size_t * UNUSED(image_slice_pitch), cl_uint UNUSED(num_events_in_wait_list), const cl_event * UNUSED(event_wait_list), cl_event * UNUSED(event), cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0 { if (errcode_ret != NULL) *errcode_ret = CL_INVALID_OPERATION; return NULL; } starpu-1.2.3+dfsg/socl/src/cl_enqueuemarker.c000066400000000000000000000022641320135501600211740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclEnqueueMarker(cl_command_queue cq, cl_event * event) CL_API_SUFFIX__VERSION_1_0 { if (event == NULL) return CL_INVALID_VALUE; command_marker cmd = command_marker_create(); cl_event ev = command_event_get(cmd); command_queue_enqueue(cq, cmd, 0, NULL); RETURN_EVENT(ev, event); return CL_SUCCESS; } cl_int command_marker_submit(command_marker cmd) { struct starpu_task *task; task = task_create(CL_COMMAND_MARKER); return task_submit(task, cmd); } starpu-1.2.3+dfsg/socl/src/cl_enqueuemarkerwithwaitlist.c000066400000000000000000000022541320135501600236500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2013 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclEnqueueMarkerWithWaitList(cl_command_queue cq, cl_uint num_events, const cl_event * events, cl_event * event) CL_API_SUFFIX__VERSION_1_2 { if (events == NULL) return soclEnqueueBarrierWithWaitList(cq, num_events, events, event); command_marker cmd = command_marker_create(); cl_event ev = command_event_get(cmd); command_queue_enqueue(cq, cmd, num_events, events); RETURN_EVENT(ev, event); return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_enqueuenativekernel.c000066400000000000000000000025551320135501600224050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclEnqueueNativeKernel(cl_command_queue UNUSED(command_queue), __attribute__((unused)) void (*user_func)(void *), void * UNUSED(args), size_t UNUSED(cb_args), cl_uint UNUSED(num_mem_objects), const cl_mem * UNUSED(mem_list), const void ** UNUSED(args_mem_loc), cl_uint UNUSED(num_events_in_wait_list), const cl_event * UNUSED(event_wait_list), cl_event * UNUSED(event)) CL_API_SUFFIX__VERSION_1_0 { return CL_INVALID_OPERATION; } starpu-1.2.3+dfsg/socl/src/cl_enqueuendrangekernel.c000066400000000000000000000157221320135501600225350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011, 2016-2017 University of Bordeaux * Copyright (C) 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" #include "event.h" void soclEnqueueNDRangeKernel_task(void *descr[], void *args) { command_ndrange_kernel cmd = (command_ndrange_kernel)args; cl_command_queue cq; int wid; cl_int err; cl_event ev = command_event_get(cmd); ev->prof_start = _socl_nanotime(); gc_entity_release(ev); wid = starpu_worker_get_id_check(); starpu_opencl_get_queue(wid, &cq); DEBUG_MSG("[worker %d] [kernel %d] Executing kernel...\n", wid, cmd->kernel->id); int range = starpu_worker_get_range(); /* Set arguments */ { unsigned int i; int buf = 0; for (i=0; inum_args; i++) { switch (cmd->arg_types[i]) { case Null: err = clSetKernelArg(cmd->kernel->cl_kernels[range], i, cmd->arg_sizes[i], NULL); break; case Buffer: { cl_mem mem; mem = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[buf]); err = clSetKernelArg(cmd->kernel->cl_kernels[range], i, cmd->arg_sizes[i], &mem); buf++; } break; case Immediate: err = clSetKernelArg(cmd->kernel->cl_kernels[range], i, cmd->arg_sizes[i], cmd->args[i]); break; } if (err != CL_SUCCESS) { DEBUG_CL("clSetKernelArg", err); DEBUG_ERROR("Aborting\n"); } } } /* Calling Kernel */ cl_event event; err = clEnqueueNDRangeKernel(cq, cmd->kernel->cl_kernels[range], cmd->work_dim, cmd->global_work_offset, cmd->global_work_size, cmd->local_work_size, 0, NULL, &event); if (err != CL_SUCCESS) { ERROR_MSG("Worker[%d] Unable to Enqueue kernel (error %d)\n", wid, err); DEBUG_CL("clEnqueueNDRangeKernel", err); DEBUG_MSG("Workdim %u, global_work_offset %p, global_work_size %p, local_work_size %p\n", cmd->work_dim, cmd->global_work_offset, cmd->global_work_size, cmd->local_work_size); DEBUG_MSG("Global work size: %ld %ld %ld\n", (long)cmd->global_work_size[0], (long)(cmd->work_dim > 1 ? cmd->global_work_size[1] : 1), (long)(cmd->work_dim > 2 ? cmd->global_work_size[2] : 1)); if (cmd->local_work_size != NULL) DEBUG_MSG("Local work size: %ld %ld %ld\n", (long)cmd->local_work_size[0], (long)(cmd->work_dim > 1 ? cmd->local_work_size[1] : 1), (long)(cmd->work_dim > 2 ? cmd->local_work_size[2] : 1)); } else { /* Waiting for kernel to terminate */ clWaitForEvents(1, &event); clReleaseEvent(event); } } /** * Real kernel enqueuing command */ cl_int command_ndrange_kernel_submit(command_ndrange_kernel cmd) { starpu_task task = task_create(); task->cl = &cmd->codelet; task->cl->model = cmd->kernel->perfmodel; task->cl_arg = cmd; task->cl_arg_size = sizeof(cmd); /* Execute the task on a specific worker? */ if (cmd->_command.event->cq->device != NULL) { task->execute_on_a_specific_worker = 1; task->workerid = cmd->_command.event->cq->device->worker_id; } struct starpu_codelet * codelet = task->cl; /* We need to detect which parameters are OpenCL's memory objects and * we retrieve their corresponding StarPU buffers */ cmd->num_buffers = 0; cmd->buffers = malloc(sizeof(cl_mem) * cmd->num_args); unsigned int i; for (i=0; inum_args; i++) { if (cmd->arg_types[i] == Buffer) { cl_mem buf = *(cl_mem*)cmd->args[i]; gc_entity_store(&cmd->buffers[cmd->num_buffers], buf); task->handles[cmd->num_buffers] = buf->handle; /* Determine best StarPU buffer access mode */ int mode; if (buf->mode == CL_MEM_READ_ONLY) mode = STARPU_R; else if (buf->mode == CL_MEM_WRITE_ONLY) { mode = STARPU_W; buf->scratch = 0; } else if (buf->scratch) { //RW but never accessed in RW or W mode mode = STARPU_W; buf->scratch = 0; } else { mode = STARPU_RW; buf->scratch = 0; } codelet->modes[cmd->num_buffers] = mode; cmd->num_buffers += 1; } } codelet->nbuffers = cmd->num_buffers; task_submit(task, cmd); return CL_SUCCESS; } CL_API_ENTRY cl_int CL_API_CALL soclEnqueueNDRangeKernel(cl_command_queue cq, cl_kernel kernel, cl_uint work_dim, const size_t * global_work_offset, const size_t * global_work_size, const size_t * local_work_size, cl_uint num_events, const cl_event * events, cl_event * event) CL_API_SUFFIX__VERSION_1_1 { if (kernel->split_func != NULL && !starpu_pthread_mutex_trylock(&kernel->split_lock)) { cl_event beforeEvent, afterEvent, totalEvent; totalEvent = event_create(); gc_entity_store(&totalEvent->cq, cq); command_marker cmd = command_marker_create(); beforeEvent = command_event_get(cmd); command_queue_enqueue(cq, cmd, num_events, events); cl_uint iter = 1; cl_uint split_min = CL_UINT_MAX; cl_uint split_min_iter = 1; while (iter < kernel->split_space && kernel->split_perfs[iter] != 0) { if (kernel->split_perfs[iter] < split_min) { split_min = kernel->split_perfs[iter]; split_min_iter = iter; } iter++; } if (iter == kernel->split_space) { iter = split_min_iter; } cl_int ret = kernel->split_func(cq, iter, kernel->split_data, beforeEvent, &afterEvent); if (ret == CL_SUCCESS) { //FIXME: blocking call soclWaitForEvents(1, &afterEvent); /* Store perf */ cl_ulong start,end; soclGetEventProfilingInfo(beforeEvent, CL_PROFILING_COMMAND_END, sizeof(cl_ulong), &start, NULL); soclGetEventProfilingInfo(afterEvent, CL_PROFILING_COMMAND_END, sizeof(cl_ulong), &end, NULL); soclReleaseEvent(afterEvent); kernel->split_perfs[iter] = end-start; starpu_pthread_mutex_unlock(&kernel->split_lock); event_complete(totalEvent); totalEvent->prof_start = start; totalEvent->prof_submit = start; totalEvent->prof_queued = start; totalEvent->prof_end = end; RETURN_EVENT(totalEvent,event); } else { starpu_pthread_mutex_unlock(&kernel->split_lock); soclReleaseEvent(totalEvent); } return ret; } else { command_ndrange_kernel cmd = command_ndrange_kernel_create(kernel, work_dim, global_work_offset, global_work_size, local_work_size); cl_event ev = command_event_get(cmd); command_queue_enqueue(cq, cmd, num_events, events); RETURN_EVENT(ev, event); } return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_enqueuereadbuffer.c000066400000000000000000000075141320135501600220230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011, 2014 University of Bordeaux * Copyright (C) 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" static void soclEnqueueReadBuffer_cpu_task(void *descr[], void *args) { command_read_buffer cmd = (command_read_buffer)args; cl_event ev = command_event_get(cmd); ev->prof_start = _socl_nanotime(); gc_entity_release(ev); char * ptr = (void*)STARPU_VARIABLE_GET_PTR(descr[0]); DEBUG_MSG("[Buffer %d] Reading %ld bytes from %p to %p\n", cmd->buffer->id, (long)cmd->cb, ptr+cmd->offset, cmd->ptr); //This fix is for people who use USE_HOST_PTR and still use ReadBuffer to sync the buffer in host mem at host_ptr. //They should use buffer mapping facilities instead. if (ptr+cmd->offset != cmd->ptr) memcpy(cmd->ptr, ptr+cmd->offset, cmd->cb); gc_entity_release_cmd(cmd); } static void soclEnqueueReadBuffer_opencl_task(void *descr[], void *args) { command_read_buffer cmd = (command_read_buffer)args; cl_event event = command_event_get(cmd); event->prof_start = _socl_nanotime(); gc_entity_release(event); cl_mem mem = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); DEBUG_MSG("[Buffer %d] Reading %ld bytes from offset %ld into %p\n", cmd->buffer->id, (long)cmd->cb, (long)cmd->offset, cmd->ptr); int wid = starpu_worker_get_id_check(); cl_command_queue cq; starpu_opencl_get_queue(wid, &cq); cl_event ev; cl_int ret = clEnqueueReadBuffer(cq, mem, CL_TRUE, cmd->offset, cmd->cb, cmd->ptr, 0, NULL, &ev); if (ret != CL_SUCCESS) ERROR_CL("clEnqueueReadBuffer", ret); clWaitForEvents(1, &ev); clReleaseEvent(ev); gc_entity_release_cmd(cmd); } static struct starpu_perfmodel read_buffer_perfmodel = { .type = STARPU_HISTORY_BASED, .symbol = "SOCL_READ_BUFFER" }; static struct starpu_codelet codelet_readbuffer = { .where = STARPU_OPENCL, .model = &read_buffer_perfmodel, .cpu_funcs = { &soclEnqueueReadBuffer_cpu_task }, .opencl_funcs = { &soclEnqueueReadBuffer_opencl_task }, .modes = {STARPU_R}, .nbuffers = 1 }; cl_int command_read_buffer_submit(command_read_buffer cmd) { struct starpu_task * task = task_create(CL_COMMAND_READ_BUFFER); task->handles[0] = cmd->buffer->handle; task->cl = &codelet_readbuffer; /* Execute the task on a specific worker? */ if (cmd->_command.event->cq->device != NULL) { task->execute_on_a_specific_worker = 1; task->workerid = cmd->_command.event->cq->device->worker_id; } gc_entity_store_cmd(&task->cl_arg, cmd); task->cl_arg_size = sizeof(*cmd); task_submit(task, cmd); return CL_SUCCESS; } CL_API_ENTRY cl_int CL_API_CALL soclEnqueueReadBuffer(cl_command_queue cq, cl_mem buffer, cl_bool blocking, size_t offset, size_t cb, void * ptr, cl_uint num_events, const cl_event * events, cl_event * event) CL_API_SUFFIX__VERSION_1_0 { command_read_buffer cmd = command_read_buffer_create(buffer, offset, cb, ptr); cl_event ev = command_event_get(cmd); command_queue_enqueue(cq, cmd, num_events, events); MAY_BLOCK_THEN_RETURN_EVENT(ev, blocking, event); return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_enqueuereadimage.c000066400000000000000000000026271320135501600216340ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclEnqueueReadImage(cl_command_queue UNUSED(command_queue), cl_mem UNUSED(image), cl_bool UNUSED(blocking_read), const size_t * UNUSED(origin), const size_t * UNUSED(region), size_t UNUSED(row_pitch), size_t UNUSED(slice_pitch), void * UNUSED(ptr), cl_uint UNUSED(num_events_in_wait_list), const cl_event * UNUSED(event_wait_list), cl_event * UNUSED(event)) CL_API_SUFFIX__VERSION_1_0 { return CL_INVALID_OPERATION; } starpu-1.2.3+dfsg/socl/src/cl_enqueuetask.c000066400000000000000000000021661320135501600206560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclEnqueueTask(cl_command_queue cq, cl_kernel kernel, cl_uint num_events, const cl_event * events, cl_event * event) CL_API_SUFFIX__VERSION_1_0 { command_ndrange_kernel cmd = command_task_create(kernel); cl_event ev = command_event_get(cmd); command_queue_enqueue(cq, cmd, num_events, events); RETURN_EVENT(ev, event); return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_enqueueunmapmemobject.c000066400000000000000000000030531320135501600227160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" cl_int command_unmap_mem_object_submit(command_unmap_mem_object cmd) { /* Aliases */ cl_mem buffer = cmd->buffer; static struct starpu_codelet codelet = { .name = "SOCL_UNMAP_MEM_OBJECT" }; cpu_task_submit(cmd, (void(*)(void*))starpu_data_release, buffer->handle, 0, 1, &codelet, 0, NULL); return CL_SUCCESS; } CL_API_ENTRY cl_int CL_API_CALL soclEnqueueUnmapMemObject(cl_command_queue cq, cl_mem buffer, void * ptr, cl_uint num_events, const cl_event * events, cl_event * event) CL_API_SUFFIX__VERSION_1_0 { command_unmap_mem_object cmd = command_unmap_mem_object_create(buffer, ptr); cl_event ev = command_event_get(cmd); command_queue_enqueue(cq, cmd, num_events, events); RETURN_EVENT(ev, event); return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_enqueuewaitforevents.c000066400000000000000000000017571320135501600226210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclEnqueueWaitForEvents(cl_command_queue cq, cl_uint num_events, const cl_event * events) CL_API_SUFFIX__VERSION_1_0 { command_marker cmd = command_marker_create(); command_queue_enqueue(cq, cmd, num_events, events); return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_enqueuewritebuffer.c000066400000000000000000000111761320135501600222410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011, 2014 University of Bordeaux * Copyright (C) 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" static void soclEnqueueWriteBuffer_cpu_task(void *descr[], void *args) { command_write_buffer cmd = (command_write_buffer)args; cl_event ev = command_event_get(cmd); ev->prof_start = _socl_nanotime(); gc_entity_release(ev); char * ptr = (void*)STARPU_VARIABLE_GET_PTR(descr[0]); DEBUG_MSG("[Buffer %d] Writing %ld bytes from %p to %p\n", cmd->buffer->id, (long)cmd->cb, cmd->ptr, ptr+cmd->offset); //FIXME: Fix for people who use USE_HOST_PTR, modify data at host_ptr and use WriteBuffer to commit the change. // StarPU may have erased host mem at host_ptr (for instance by retrieving current buffer data at host_ptr) // Buffer mapping facilities should be used instead // Maybe we should report the bug here... for now, we just avoid memcpy crash due to overlapping regions... if (ptr+cmd->offset != cmd->ptr) memcpy(ptr+cmd->offset, cmd->ptr, cmd->cb); gc_entity_release_cmd(cmd); } static void soclEnqueueWriteBuffer_opencl_task(void *descr[], void *args) { command_write_buffer cmd = (command_write_buffer)args; cl_event event = command_event_get(cmd); event->prof_start = _socl_nanotime(); gc_entity_release(event); cl_mem mem = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); DEBUG_MSG("[Buffer %d] Writing %ld bytes to offset %ld from %p\n", cmd->buffer->id, (long)cmd->cb, (long)cmd->offset, cmd->ptr); int wid = starpu_worker_get_id_check(); cl_command_queue cq; starpu_opencl_get_queue(wid, &cq); cl_event ev; cl_int err = clEnqueueWriteBuffer(cq, mem, CL_TRUE, cmd->offset, cmd->cb, cmd->ptr, 0, NULL, &ev); if (err != CL_SUCCESS) ERROR_CL("clEnqueueWriteBuffer", err); clWaitForEvents(1, &ev); clReleaseEvent(ev); gc_entity_release_cmd(cmd); } static struct starpu_perfmodel write_buffer_perfmodel = { .type = STARPU_HISTORY_BASED, .symbol = "SOCL_WRITE_BUFFER" }; static struct starpu_codelet codelet_writebuffer = { .where = STARPU_OPENCL, .model = &write_buffer_perfmodel, .cpu_funcs = { &soclEnqueueWriteBuffer_cpu_task }, .opencl_funcs = { &soclEnqueueWriteBuffer_opencl_task }, .modes = {STARPU_W}, .nbuffers = 1 }; static struct starpu_codelet codelet_writebuffer_partial = { .where = STARPU_OPENCL, .model = &write_buffer_perfmodel, .cpu_funcs = { &soclEnqueueWriteBuffer_cpu_task }, .opencl_funcs = { &soclEnqueueWriteBuffer_opencl_task }, .modes = {STARPU_RW}, .nbuffers = 1 }; cl_int command_write_buffer_submit(command_write_buffer cmd) { /* Aliases */ cl_mem buffer = cmd->buffer; size_t cb = cmd->cb; struct starpu_task *task; task = task_create(CL_COMMAND_WRITE_BUFFER); task->handles[0] = buffer->handle; //If only a subpart of the buffer is written, RW access mode is required if (cb != buffer->size) task->cl = &codelet_writebuffer_partial; else task->cl = &codelet_writebuffer; gc_entity_store_cmd(&task->cl_arg, cmd); task->cl_arg_size = sizeof(*cmd); /* Execute the task on a specific worker? */ if (cmd->_command.event->cq->device != NULL) { task->execute_on_a_specific_worker = 1; task->workerid = cmd->_command.event->cq->device->worker_id; } //The buffer now contains meaningful data cmd->buffer->scratch = 0; task_submit(task, cmd); return CL_SUCCESS; } CL_API_ENTRY cl_int CL_API_CALL soclEnqueueWriteBuffer(cl_command_queue cq, cl_mem buffer, cl_bool blocking, size_t offset, size_t cb, const void * ptr, cl_uint num_events, const cl_event * events, cl_event * event) CL_API_SUFFIX__VERSION_1_0 { command_write_buffer cmd = command_write_buffer_create(buffer, offset, cb, ptr); cl_event ev = command_event_get(cmd); command_queue_enqueue(cq, cmd, num_events, events); MAY_BLOCK_THEN_RETURN_EVENT(ev, blocking, event); return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_enqueuewriteimage.c000066400000000000000000000026441320135501600220520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclEnqueueWriteImage(cl_command_queue UNUSED(command_queue), cl_mem UNUSED(image), cl_bool UNUSED(blocking_write), const size_t * UNUSED(origin), const size_t * UNUSED(region), size_t UNUSED(input_row_pitch), size_t UNUSED(input_slice_pitch), const void * UNUSED(ptr), cl_uint UNUSED(num_events_in_wait_list), const cl_event * UNUSED(event_wait_list), cl_event * UNUSED(event)) CL_API_SUFFIX__VERSION_1_0 { return CL_INVALID_OPERATION; } starpu-1.2.3+dfsg/socl/src/cl_finish.c000066400000000000000000000017331320135501600176030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclFinish(cl_command_queue cq) CL_API_SUFFIX__VERSION_1_0 { command_barrier cmd = command_barrier_create(); cl_event ev = command_event_get(cmd); command_queue_enqueue(cq, cmd, 0, NULL); MAY_BLOCK_THEN_RETURN_EVENT(ev, CL_TRUE, (cl_event*)NULL); return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_flush.c000066400000000000000000000014521320135501600174420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclFlush(cl_command_queue UNUSED(command_queue)) CL_API_SUFFIX__VERSION_1_0 { return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_getcommandqueueinfo.c000066400000000000000000000026131320135501600223600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" #include "getinfo.h" CL_API_ENTRY cl_int CL_API_CALL soclGetCommandQueueInfo(cl_command_queue cq, cl_command_queue_info param_name, size_t param_value_size, void * param_value, size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0 { if (cq == NULL) return CL_INVALID_COMMAND_QUEUE; switch (param_name) { INFO_CASE(CL_QUEUE_CONTEXT, cq->context); INFO_CASE(CL_QUEUE_DEVICE, cq->device); INFO_CASE(CL_QUEUE_REFERENCE_COUNT, cq->_entity.refs); INFO_CASE(CL_QUEUE_PROPERTIES, cq->properties); default: return CL_INVALID_VALUE; } return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_getcontextinfo.c000066400000000000000000000026671320135501600213720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" #include "getinfo.h" CL_API_ENTRY cl_int CL_API_CALL soclGetContextInfo(cl_context context, cl_context_info param_name, size_t param_value_size, void * param_value, size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0 { if (context == NULL) return CL_INVALID_CONTEXT; switch (param_name) { INFO_CASE(CL_CONTEXT_REFERENCE_COUNT, context->_entity.refs); INFO_CASE_EX(CL_CONTEXT_DEVICES, context->devices, context->num_devices * sizeof(cl_device_id)); INFO_CASE_EX(CL_CONTEXT_PROPERTIES, context->properties, context->num_properties * sizeof(cl_device_id)); default: return CL_INVALID_VALUE; } return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_getdeviceids.c000066400000000000000000000053711320135501600207640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 University of Bordeaux * Copyright (C) 2012 CNRS * Copyright (C) 2012 Vincent Danjean * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" #include "init.h" /** * \brief Return one device of each kind * * \param[in] platform Must be StarPU platform ID or NULL */ CL_API_ENTRY cl_int CL_API_CALL soclGetDeviceIDs(cl_platform_id platform, cl_device_type device_type, cl_uint num_entries, cl_device_id * devices, cl_uint * num_devices) CL_API_SUFFIX__VERSION_1_0 { if( ! _starpu_init ) socl_init_starpu(); if (_starpu_init_failed) { *num_devices = 0; return CL_SUCCESS; } if (platform != NULL && platform != &socl_platform) return CL_INVALID_PLATFORM; if ((devices != NULL && num_entries == 0) || (devices == NULL && num_devices == NULL)) return CL_INVALID_VALUE; if (!(device_type & (CL_DEVICE_TYPE_CPU | CL_DEVICE_TYPE_GPU | CL_DEVICE_TYPE_ACCELERATOR | CL_DEVICE_TYPE_DEFAULT)) && (device_type != CL_DEVICE_TYPE_ALL)) return CL_INVALID_DEVICE_TYPE; int ndevs = starpu_worker_get_count_by_type(STARPU_OPENCL_WORKER); int workers[ndevs]; starpu_worker_get_ids_by_type(STARPU_OPENCL_WORKER, workers, ndevs); if (socl_devices == NULL) { socl_device_count = ndevs; socl_devices = malloc(sizeof(struct _cl_device_id) * ndevs); int i; for (i=0; i < ndevs; i++) { int devid = starpu_worker_get_devid(workers[i]); socl_devices[i].dispatch = &socl_master_dispatch; socl_devices[i].worker_id = workers[i]; socl_devices[i].device_id = devid; } } int i; unsigned int num = 0; for (i=0; i < ndevs; i++) { int devid = socl_devices[i].device_id; cl_device_id dev; starpu_opencl_get_device(devid, &dev); cl_device_type typ; clGetDeviceInfo(dev, CL_DEVICE_TYPE, sizeof(typ), &typ, NULL); if (typ & device_type) { if (devices != NULL && num < num_entries) devices[num] = &socl_devices[i]; num++; } } if (num_devices != NULL) *num_devices = num; return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_getdeviceinfo.c000066400000000000000000000031661320135501600211400ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" #include "getinfo.h" CL_API_ENTRY cl_int CL_API_CALL soclGetDeviceInfo(cl_device_id device, cl_device_info param_name, size_t param_value_size, void * param_value, size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0 { //FIXME: we do not check if the device is valid /* if (device != &socl_virtual_device && device is not a valid StarPU worker identifier) return CL_INVALID_DEVICE;*/ int devid = device->device_id; cl_device_id dev; starpu_opencl_get_device(devid, &dev); int ret = CL_SUCCESS; switch (param_name) { case CL_DEVICE_PLATFORM: { cl_platform_id p = &socl_platform; INFO_CASE_EX2(p); } case CL_DEVICE_IMAGE_SUPPORT: { cl_bool res = CL_FALSE; INFO_CASE_EX2(res); } default: ret = clGetDeviceInfo(dev, param_name, param_value_size, param_value, param_value_size_ret); } return ret; } starpu-1.2.3+dfsg/socl/src/cl_geteventinfo.c000066400000000000000000000027131320135501600210170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" #include "getinfo.h" CL_API_ENTRY cl_int CL_API_CALL soclGetEventInfo(cl_event event, cl_event_info param_name, size_t param_value_size, void * param_value, size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0 { if (event == NULL) return CL_INVALID_EVENT; #define STAT_CASE(starpu,opencl) case starpu: \ status = opencl; \ break; switch (param_name) { INFO_CASE(CL_EVENT_COMMAND_QUEUE, event->cq); INFO_CASE(CL_EVENT_COMMAND_TYPE, event->command->typ); INFO_CASE(CL_EVENT_COMMAND_EXECUTION_STATUS, event->status); INFO_CASE(CL_EVENT_REFERENCE_COUNT, event->_entity.refs); default: return CL_INVALID_VALUE; } return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_geteventprofilinginfo.c000066400000000000000000000027011320135501600227260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" #include "getinfo.h" CL_API_ENTRY cl_int CL_API_CALL soclGetEventProfilingInfo(cl_event event, cl_profiling_info param_name, size_t param_value_size, void * param_value, size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0 { switch (param_name) { INFO_CASE_VALUE(CL_PROFILING_COMMAND_QUEUED, cl_ulong, event->prof_queued); INFO_CASE_VALUE(CL_PROFILING_COMMAND_SUBMIT, cl_ulong, event->prof_submit); INFO_CASE_VALUE(CL_PROFILING_COMMAND_START, cl_ulong, event->prof_start); INFO_CASE_VALUE(CL_PROFILING_COMMAND_END, cl_ulong, event->prof_end); default: return CL_INVALID_VALUE; } return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_getextensionfunctionaddress.c000066400000000000000000000030521320135501600241470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 University of Bordeaux * Copyright (C) 2012 CNRS * Copyright (C) 2012 Vincent Danjean * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "socl.h" #include "init.h" CL_API_ENTRY void * CL_API_CALL soclGetExtensionFunctionAddress(const char * func_name) CL_API_SUFFIX__VERSION_1_0 { if (func_name != NULL && strcmp(func_name, "clShutdown") == 0) { return (void*)soclShutdown; } return NULL; } CL_API_ENTRY void * CL_API_CALL soclGetExtensionFunctionAddressForPlatform(cl_platform_id p, const char * func_name) CL_API_SUFFIX__VERSION_1_2 { if (p != &socl_platform) return NULL; return soclGetExtensionFunctionAddress(func_name); } CL_API_ENTRY void * CL_API_CALL clGetExtensionFunctionAddress( const char * func_name) CL_API_SUFFIX__VERSION_1_0 { if( func_name != NULL && strcmp("clIcdGetPlatformIDsKHR", func_name) == 0 ) return (void *)soclIcdGetPlatformIDsKHR; return NULL; } starpu-1.2.3+dfsg/socl/src/cl_getimageinfo.c000066400000000000000000000020521320135501600207540ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" #include "getinfo.h" CL_API_ENTRY cl_int CL_API_CALL soclGetImageInfo(cl_mem UNUSED(image), cl_image_info UNUSED(param_name), size_t UNUSED(param_value_size), void * UNUSED(param_value), size_t * UNUSED(param_value_size_ret)) CL_API_SUFFIX__VERSION_1_0 { return CL_INVALID_OPERATION; } starpu-1.2.3+dfsg/socl/src/cl_getkernelinfo.c000066400000000000000000000027101320135501600211530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" #include "getinfo.h" CL_API_ENTRY cl_int CL_API_CALL soclGetKernelInfo(cl_kernel kernel, cl_kernel_info param_name, size_t param_value_size, void * param_value, size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0 { if (kernel == NULL) return CL_INVALID_KERNEL; switch (param_name) { INFO_CASE_EX(CL_KERNEL_FUNCTION_NAME, kernel->kernel_name, strlen(kernel->kernel_name)+1) INFO_CASE(CL_KERNEL_NUM_ARGS, kernel->num_args) INFO_CASE(CL_KERNEL_REFERENCE_COUNT, kernel->_entity.refs) INFO_CASE(CL_KERNEL_PROGRAM, kernel->program) INFO_CASE(CL_KERNEL_CONTEXT, kernel->program->context) default: return CL_INVALID_VALUE; } return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_getkernelworkgroupinfo.c000066400000000000000000000026061320135501600231370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclGetKernelWorkGroupInfo(cl_kernel kernel, cl_device_id device, cl_kernel_work_group_info param_name, size_t param_value_size, void * param_value, size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0 { int range = starpu_worker_get_range_by_id(device->worker_id); cl_device_id dev; starpu_opencl_get_device(device->device_id, &dev); return clGetKernelWorkGroupInfo(kernel->cl_kernels[range], dev, param_name, param_value_size, param_value, param_value_size_ret); } starpu-1.2.3+dfsg/socl/src/cl_getmemobjectinfo.c000066400000000000000000000027231320135501600216440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" #include "getinfo.h" CL_API_ENTRY cl_int CL_API_CALL soclGetMemObjectInfo(cl_mem mem, cl_mem_info param_name, size_t param_value_size, void * param_value, size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0 { static cl_mem_object_type mot = CL_MEM_OBJECT_BUFFER; switch (param_name) { INFO_CASE(CL_MEM_TYPE, mot) INFO_CASE(CL_MEM_FLAGS, mem->flags) INFO_CASE(CL_MEM_SIZE, mem->size) INFO_CASE(CL_MEM_HOST_PTR, mem->host_ptr) INFO_CASE(CL_MEM_MAP_COUNT, mem->map_count) INFO_CASE(CL_MEM_REFERENCE_COUNT, mem->_entity.refs) INFO_CASE(CL_MEM_CONTEXT, mem->context) default: return CL_INVALID_VALUE; } return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_getplatformids.c000066400000000000000000000025371320135501600213520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" extern int _starpu_init_failed; /** * \brief Get StarPU platform ID */ CL_API_ENTRY cl_int CL_API_CALL soclGetPlatformIDs(cl_uint num_entries, cl_platform_id * platforms, cl_uint * num_platforms) CL_API_SUFFIX__VERSION_1_0 { if (_starpu_init_failed) { if (num_platforms != NULL) *num_platforms = 0; return CL_SUCCESS; } if ((num_entries == 0 && platforms != NULL) || (num_platforms == NULL && platforms == NULL)) return CL_INVALID_VALUE; else { if (platforms != NULL) platforms[0] = &socl_platform; if (num_platforms != NULL) *num_platforms = 1; } return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_getplatforminfo.c000066400000000000000000000033551320135501600215250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 University of Bordeaux * Copyright (C) 2012 CNRS * Copyright (C) 2012 Vincent Danjean * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" #include "getinfo.h" /** * \brief Get information about StarPU platform * * \param[in] platform StarPU platform ID or NULL */ CL_API_ENTRY cl_int CL_API_CALL soclGetPlatformInfo(cl_platform_id platform, cl_platform_info param_name, size_t param_value_size, void * param_value, size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0 { if (platform != NULL && platform != &socl_platform) return CL_INVALID_PLATFORM; switch (param_name) { INFO_CASE_STRING(CL_PLATFORM_PROFILE, SOCL_PROFILE); INFO_CASE_STRING(CL_PLATFORM_VERSION, SOCL_VERSION); INFO_CASE_STRING(CL_PLATFORM_NAME, SOCL_PLATFORM_NAME); INFO_CASE_STRING(CL_PLATFORM_VENDOR, SOCL_VENDOR); INFO_CASE_STRING(CL_PLATFORM_EXTENSIONS, SOCL_PLATFORM_EXTENSIONS); INFO_CASE_STRING(CL_PLATFORM_ICD_SUFFIX_KHR, SOCL_PLATFORM_ICD_SUFFIX_KHR); default: return CL_INVALID_VALUE; } return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_getprogrambuildinfo.c000066400000000000000000000027531320135501600223710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" #include "getinfo.h" CL_API_ENTRY cl_int CL_API_CALL soclGetProgramBuildInfo(cl_program program, cl_device_id UNUSED(device), cl_program_build_info param_name, size_t param_value_size, void * param_value, size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0 { if (program == NULL) return CL_INVALID_PROGRAM; switch (param_name) { //TODO //INFO_CASE(CL_PROGRAM_BUILD_STATUS, program->build_status); INFO_CASE_EX(CL_PROGRAM_BUILD_OPTIONS, program->options, program->options_size); //TODO //INFO_CASE(CL_PROGRAM_BUILD_LOG, program->build_log); default: return CL_INVALID_VALUE; } return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_getprograminfo.c000066400000000000000000000032161320135501600213440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" #include "getinfo.h" CL_API_ENTRY cl_int CL_API_CALL soclGetProgramInfo(cl_program program, cl_program_info param_name, size_t param_value_size, void * param_value, size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0 { if (program == NULL) return CL_INVALID_PROGRAM; switch (param_name) { INFO_CASE(CL_PROGRAM_REFERENCE_COUNT, program->_entity.refs); INFO_CASE(CL_PROGRAM_CONTEXT, program->context); INFO_CASE(CL_PROGRAM_NUM_DEVICES, program->context->num_devices); INFO_CASE_EX(CL_PROGRAM_DEVICES, program->context->devices, sizeof(cl_device_id)*program->context->num_devices); //TODO /*INFO_CASE(CL_PROGRAM_SOURCE, program->source); INFO_CASE(CL_PROGRAM_BINARY_SIZE, program->binary_sizes); INFO_CASE(CL_PROGRAM_BINARIES, program->binaries);*/ default: return CL_INVALID_VALUE; } return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_getsamplerinfo.c000066400000000000000000000020751320135501600213420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" #include "getinfo.h" CL_API_ENTRY cl_int CL_API_CALL soclGetSamplerInfo(cl_sampler UNUSED(sampler), cl_sampler_info UNUSED(param_name), size_t UNUSED(param_value_size), void * UNUSED(param_value), size_t * UNUSED(param_value_size_ret)) CL_API_SUFFIX__VERSION_1_0 { return CL_INVALID_OPERATION; } starpu-1.2.3+dfsg/socl/src/cl_getsupportedimageformats.c000066400000000000000000000022371320135501600234470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclGetSupportedImageFormats(cl_context UNUSED(context), cl_mem_flags UNUSED(flags), cl_mem_object_type UNUSED(image_type), cl_uint UNUSED(num_entries), cl_image_format * UNUSED(image_formats), cl_uint * UNUSED(num_image_formats)) CL_API_SUFFIX__VERSION_1_0 { return CL_INVALID_OPERATION; } starpu-1.2.3+dfsg/socl/src/cl_icdgetplatformidskhr.c000066400000000000000000000024221320135501600225300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 University of Bordeaux * Copyright (C) 2012 CNRS * Copyright (C) 2012 Vincent Danjean * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" extern int _starpu_init_failed; CL_API_ENTRY cl_int CL_API_CALL soclIcdGetPlatformIDsKHR( cl_uint num_entries, cl_platform_id *platforms, cl_uint *num_platforms) CL_EXT_SUFFIX__VERSION_1_0{ if ((num_entries == 0 && platforms != NULL) || (num_platforms == NULL && platforms == NULL)) return CL_INVALID_VALUE; else { if (platforms != NULL) platforms[0] = &socl_platform; if (num_platforms != NULL) *num_platforms = 1; } return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_releasecommandqueue.c000066400000000000000000000014771320135501600223540ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclReleaseCommandQueue(cl_command_queue cq) CL_API_SUFFIX__VERSION_1_0 { gc_entity_release(cq); return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_releasecontext.c000066400000000000000000000015651320135501600213530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclReleaseContext(cl_context context) CL_API_SUFFIX__VERSION_1_0 { if (context == NULL) return CL_INVALID_CONTEXT; gc_entity_release(context); return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_releaseevent.c000066400000000000000000000015501320135501600210020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclReleaseEvent(cl_event event) CL_API_SUFFIX__VERSION_1_0 { if (event == NULL) return CL_INVALID_EVENT; gc_entity_release(event); return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_releasekernel.c000066400000000000000000000015561320135501600211470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclReleaseKernel(cl_kernel kernel) CL_API_SUFFIX__VERSION_1_0 { if (kernel == NULL) return CL_INVALID_KERNEL; gc_entity_release(kernel); return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_releasememobject.c000066400000000000000000000014631320135501600216310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclReleaseMemObject(cl_mem mem) CL_API_SUFFIX__VERSION_1_0 { gc_entity_release(mem); return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_releaseprogram.c000066400000000000000000000015641320135501600213350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclReleaseProgram(cl_program program) CL_API_SUFFIX__VERSION_1_0 { if (program == NULL) return CL_INVALID_PROGRAM; gc_entity_release(program); return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_releasesampler.c000066400000000000000000000014611320135501600213250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclReleaseSampler(cl_sampler UNUSED(sampler)) CL_API_SUFFIX__VERSION_1_0 { return CL_INVALID_OPERATION; } starpu-1.2.3+dfsg/socl/src/cl_retaincommandqueue.c000066400000000000000000000015711320135501600222110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclRetainCommandQueue(cl_command_queue cq) CL_API_SUFFIX__VERSION_1_0 { if (cq == NULL) return CL_INVALID_COMMAND_QUEUE; gc_entity_retain(cq); return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_retaincontext.c000066400000000000000000000015671320135501600212170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclRetainContext(cl_context context) CL_API_SUFFIX__VERSION_1_0 { if (context == NULL) return CL_INVALID_CONTEXT; gc_entity_retain(context); return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_retainevent.c000066400000000000000000000015531320135501600206470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclRetainEvent(cl_event event) CL_API_SUFFIX__VERSION_1_0 { if (event == NULL) return CL_INVALID_EVENT; gc_entity_retain(event); return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_retainkernel.c000066400000000000000000000015641320135501600210100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclRetainKernel(cl_kernel kernel) CL_API_SUFFIX__VERSION_1_0 { if (kernel == NULL) return CL_INVALID_KERNEL; gc_entity_retain(kernel); return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_retainmemobject.c000066400000000000000000000015571320135501600214770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclRetainMemObject(cl_mem mem) CL_API_SUFFIX__VERSION_1_0 { if (mem == NULL) return CL_INVALID_MEM_OBJECT; gc_entity_retain(mem); return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_retainprogram.c000066400000000000000000000015671320135501600212020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclRetainProgram(cl_program program) CL_API_SUFFIX__VERSION_1_0 { if (program == NULL) return CL_INVALID_PROGRAM; gc_entity_retain(program); return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_retainsampler.c000066400000000000000000000014601320135501600211660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclRetainSampler(cl_sampler UNUSED(sampler)) CL_API_SUFFIX__VERSION_1_0 { return CL_INVALID_OPERATION; } starpu-1.2.3+dfsg/socl/src/cl_setcommandqueueproperty.c000066400000000000000000000036231320135501600233270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclSetCommandQueueProperty(cl_command_queue command_queue, cl_command_queue_properties properties, cl_bool enable, cl_command_queue_properties * old_properties) CL_API_SUFFIX__VERSION_1_0 { if (command_queue == NULL) return CL_INVALID_COMMAND_QUEUE; if (old_properties != NULL) *old_properties = command_queue->properties; if (enable) { //Enable StarPU profiling if necessary if (properties & (~command_queue->properties) & CL_QUEUE_PROFILING_ENABLE) { if (profiling_queue_count == 0) starpu_profiling_status_set(STARPU_PROFILING_ENABLE); profiling_queue_count += 1; } //Set new properties command_queue->properties |= properties; } else { //Disable StarPU profiling if necessary if ((~properties) & command_queue->properties & CL_QUEUE_PROFILING_ENABLE) { profiling_queue_count -= 1; if (profiling_queue_count == 0) starpu_profiling_status_set(STARPU_PROFILING_DISABLE); } //Set new properties command_queue->properties &= ~properties; } return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_setkernelarg.c000066400000000000000000000063601320135501600210120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclSetKernelArg(cl_kernel kernel, cl_uint arg_index, size_t arg_size, const void * arg_value) CL_API_SUFFIX__VERSION_1_0 { if (kernel == NULL) return CL_INVALID_KERNEL; if (arg_index == (cl_uint)-1) { kernel->split_func = arg_value; return CL_SUCCESS; } else if (arg_index == (cl_uint)-2) { kernel->split_space = *(cl_uint*)arg_value; if (kernel->split_perfs != NULL) { free(kernel->split_perfs); } kernel->split_perfs = calloc(kernel->split_space, sizeof(cl_ulong)); return CL_SUCCESS; } else if (arg_index == (cl_uint)-3) { kernel->split_data = (void *)arg_value; return CL_SUCCESS; } if (arg_index >= kernel->num_args) return CL_INVALID_ARG_INDEX; //FIXME: we don't return CL_INVALID_ARG_VALUE if "arg_value is NULL for an argument that is not declared with __local qualifier or vice-versa" //FIXME: we don't return CL_INVALID_MEM_OBJECT //FIXME: we don't return CL_INVALID_ARG_SIZE /* Free previous argument (set to NULL) */ switch (kernel->arg_type[arg_index]) { case Null: break; case Buffer: kernel->arg_type[arg_index] = Null; free(kernel->arg_value[arg_index]); kernel->arg_value[arg_index] = NULL; break; case Immediate: free(kernel->arg_value[arg_index]); kernel->arg_type[arg_index] = Null; kernel->arg_value[arg_index] = NULL; break; } kernel->arg_type[arg_index] = Null; kernel->arg_size[arg_index] = arg_size; DEBUG_MSG("[Kernel %d] Set argument %d: argsize %ld argvalue %p\n", kernel->id, arg_index, (long)arg_size, arg_value); /* Argument is not Null */ if (arg_value != NULL) { cl_mem buf = NULL; /* Check if argument is a memory object */ if ((arg_size == sizeof(cl_mem)) && ((buf = mem_object_fetch(arg_value)) != NULL)) { DEBUG_MSG("Found buffer %d \n", buf->id); kernel->arg_type[arg_index] = Buffer; kernel->arg_value[arg_index] = malloc(sizeof(void*)); *(cl_mem*)kernel->arg_value[arg_index] = buf; //We do not use gc_entity_store here because kernels do not hold reference on buffers (see OpenCL spec) } else { /* Argument must be an immediate buffer */ DEBUG_MSG("Immediate data\n"); kernel->arg_type[arg_index] = Immediate; kernel->arg_value[arg_index] = malloc(arg_size); memcpy(kernel->arg_value[arg_index], arg_value, arg_size); } } return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_unloadcompiler.c000066400000000000000000000014211320135501600213320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclUnloadCompiler(void) CL_API_SUFFIX__VERSION_1_0 { return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/cl_waitforevents.c000066400000000000000000000023111320135501600212140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" CL_API_ENTRY cl_int CL_API_CALL soclWaitForEvents(cl_uint num_events, const cl_event * event_list) CL_API_SUFFIX__VERSION_1_0 { unsigned int i; #ifdef DEBUG DEBUG_MSG("Waiting for events: "); for (i=0; iid, sep); } DEBUG_MSG_NOHEAD("\n"); #endif for (i=0; iid); DEBUG_MSG("Stop waiting :)\n"); return CL_SUCCESS; } starpu-1.2.3+dfsg/socl/src/command.c000066400000000000000000000232041320135501600172600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011, 2014, 2016 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" #include /* Forward extern declaration */ extern void soclEnqueueNDRangeKernel_task(void *descr[], void *args); cl_event command_event_get_ex(cl_command cmd) { cl_event ev = cmd->event; gc_entity_retain(ev); return ev; } static void command_release_callback(void *a) { cl_command cmd = (cl_command)a; // Call command specific release callback if (cmd->release_callback != NULL) cmd->release_callback(cmd); // Generic command destructor cl_uint i; for (i=0; inum_events; i++) { gc_entity_unstore(&cmd->events[i]); } cmd->num_events = 0; free(cmd->events); /* Remove from command queue */ cl_command_queue cq = cmd->event->cq; if (cq != NULL) { /* Lock command queue */ starpu_pthread_mutex_lock(&cq->mutex); /* Remove barrier if applicable */ if (cq->barrier == cmd) cq->barrier = NULL; /* Remove from the list of out-of-order commands */ cq->commands = command_list_remove(cq->commands, cmd); /* Unlock command queue */ starpu_pthread_mutex_unlock(&cq->mutex); } // Events may survive to commands that created them cmd->event->command = NULL; gc_entity_unstore(&cmd->event); } void command_init_ex(cl_command cmd, cl_command_type typ, void (*cb)(void*)) { gc_entity_init(&cmd->_entity, command_release_callback, "command"); cmd->release_callback = cb; cmd->typ = typ; cmd->num_events = 0; cmd->events = NULL; cmd->event = event_create(); // we do not use gc_entity_store here because if nobody requires the event, it should be destroyed with the command cmd->event->command = cmd; cmd->task = NULL; cmd->submitted = 0; } void command_submit_ex(cl_command cmd) { #define SUBMIT(typ,name) case typ:\ name##_submit((name)cmd);\ break; assert(cmd->submitted == 0); switch(cmd->typ) { SUBMIT(CL_COMMAND_NDRANGE_KERNEL, command_ndrange_kernel) SUBMIT(CL_COMMAND_TASK, command_ndrange_kernel) SUBMIT(CL_COMMAND_READ_BUFFER, command_read_buffer) SUBMIT(CL_COMMAND_WRITE_BUFFER, command_write_buffer) SUBMIT(CL_COMMAND_COPY_BUFFER, command_copy_buffer) SUBMIT(CL_COMMAND_MAP_BUFFER, command_map_buffer) SUBMIT(CL_COMMAND_UNMAP_MEM_OBJECT, command_unmap_mem_object) SUBMIT(CL_COMMAND_MARKER, command_marker) SUBMIT(CL_COMMAND_BARRIER, command_barrier) default: ERROR_STOP("Trying to submit unknown command (type %x)", cmd->typ); } cmd->submitted = 1; #undef SUBMIT } cl_int command_submit_deep_ex(cl_command cmd) { if (cmd->submitted == 1) return CL_SUCCESS; /* We set this in order to avoid cyclic dependencies */ cmd->submitted = 1; unsigned int i; for (i=0; inum_events; i++) command_submit_deep(cmd->events[i]->command); cmd->submitted = 0; command_submit_ex(cmd); return CL_SUCCESS; } void command_graph_dump_ex(cl_command cmd) { unsigned int i; for (i=0; inum_events; i++) command_graph_dump_ex(cmd->events[i]->command); const char * typ_str = (cmd->typ == CL_COMMAND_NDRANGE_KERNEL ? "ndrange_kernel" : cmd->typ == CL_COMMAND_TASK ? "task" : cmd->typ == CL_COMMAND_READ_BUFFER ? "read_buffer" : cmd->typ == CL_COMMAND_WRITE_BUFFER ? "write_buffer" : cmd->typ == CL_COMMAND_COPY_BUFFER ? "copy_buffer" : cmd->typ == CL_COMMAND_MAP_BUFFER ? "map_buffer" : cmd->typ == CL_COMMAND_UNMAP_MEM_OBJECT ? "unmap_mem_object" : cmd->typ == CL_COMMAND_MARKER ? "marker" : cmd->typ == CL_COMMAND_BARRIER ? "barrier" : "unknown"); printf("CMD %p TYPE %s DEPS", cmd, typ_str); for (i=0; inum_events; i++) printf(" %p", cmd->events[i]->command); printf("\n"); } #define nullOrDup(name,size) cmd->name = memdup_safe(name,size) #define nullOrFree(name) if (cmd->name != NULL) free((void*)cmd->name) #define dup(name) cmd->name = name void command_ndrange_kernel_release(void * arg) { command_ndrange_kernel cmd = (command_ndrange_kernel)arg; gc_entity_unstore(&cmd->kernel); nullOrFree(global_work_offset); nullOrFree(global_work_size); nullOrFree(local_work_size); free(cmd->arg_sizes); free(cmd->arg_types); unsigned int i; for (i=0; inum_args; i++) { free(cmd->args[i]); cmd->args[i] = NULL; } free(cmd->args); for (i=0; inum_buffers; i++) gc_entity_unstore(&cmd->buffers[i]); free(cmd->buffers); } command_ndrange_kernel command_ndrange_kernel_create ( cl_kernel kernel, cl_uint work_dim, const size_t * global_work_offset, const size_t * global_work_size, const size_t * local_work_size) { command_ndrange_kernel cmd = calloc(1, sizeof(struct command_ndrange_kernel_t)); command_init(cmd, CL_COMMAND_NDRANGE_KERNEL, command_ndrange_kernel_release); gc_entity_store(&cmd->kernel, kernel); dup(work_dim); nullOrDup(global_work_offset, work_dim*sizeof(size_t)); nullOrDup(global_work_size, work_dim*sizeof(size_t)); nullOrDup(local_work_size, work_dim*sizeof(size_t)); starpu_codelet_init(&cmd->codelet); cmd->codelet.where = STARPU_OPENCL; cmd->codelet.energy_model = NULL; cmd->codelet.opencl_funcs[0] = &soclEnqueueNDRangeKernel_task; /* Kernel is mutable, so we duplicate its parameters... */ cmd->num_args = kernel->num_args; cmd->arg_sizes = memdup(kernel->arg_size, sizeof(size_t) * kernel->num_args); cmd->arg_types = memdup(kernel->arg_type, sizeof(enum kernel_arg_type) * kernel->num_args); cmd->args = memdup_deep_varsize_safe(kernel->arg_value, kernel->num_args, kernel->arg_size); return cmd; } command_ndrange_kernel command_task_create (cl_kernel kernel) { static cl_uint task_work_dim = 3; static const size_t task_global_work_offset[3] = {0,0,0}; static const size_t task_global_work_size[3] = {1,1,1}; static const size_t * task_local_work_size = NULL; command_ndrange_kernel cmd = command_ndrange_kernel_create( kernel, task_work_dim, task_global_work_offset, task_global_work_size, task_local_work_size); /* This is the only difference with command_ndrange_kernel_create */ cmd->_command.typ = CL_COMMAND_TASK; return cmd; } command_barrier command_barrier_create () { command_barrier cmd = malloc(sizeof(struct command_barrier_t)); command_init(cmd, CL_COMMAND_BARRIER, NULL); return cmd; } command_marker command_marker_create () { command_marker cmd = malloc(sizeof(struct command_marker_t)); command_init(cmd, CL_COMMAND_MARKER, NULL); return cmd; } void command_map_buffer_release(void * UNUSED(arg)) { /* We DO NOT unstore (release) the buffer as unmap will do it gc_entity_unstore(&cmd->buffer); */ } command_map_buffer command_map_buffer_create( cl_mem buffer, cl_map_flags map_flags, size_t offset, size_t cb ) { command_map_buffer cmd = malloc(sizeof(struct command_map_buffer_t)); command_init(cmd, CL_COMMAND_MAP_BUFFER, command_map_buffer_release); gc_entity_store(&cmd->buffer, buffer); dup(map_flags); dup(offset); dup(cb); return cmd; } void command_unmap_mem_object_release(void * arg) { command_unmap_mem_object cmd = (command_unmap_mem_object)arg; /* We release the buffer twice because map buffer command did not */ gc_entity_release(cmd->buffer); gc_entity_unstore(&cmd->buffer); } command_unmap_mem_object command_unmap_mem_object_create(cl_mem buffer, void * ptr) { command_unmap_mem_object cmd = malloc(sizeof(struct command_unmap_mem_object_t)); command_init(cmd, CL_COMMAND_UNMAP_MEM_OBJECT, command_unmap_mem_object_release); gc_entity_store(&cmd->buffer, buffer); dup(ptr); return cmd; } void command_read_buffer_release(void *arg) { command_read_buffer cmd = (command_read_buffer)arg; gc_entity_unstore(&cmd->buffer); } command_read_buffer command_read_buffer_create(cl_mem buffer, size_t offset, size_t cb, void * ptr) { command_read_buffer cmd = malloc(sizeof(struct command_read_buffer_t)); command_init(cmd, CL_COMMAND_READ_BUFFER, command_read_buffer_release); gc_entity_store(&cmd->buffer, buffer); dup(offset); dup(cb); dup(ptr); return cmd; } void command_write_buffer_release(void *arg) { command_write_buffer cmd = (command_write_buffer)arg; gc_entity_unstore(&cmd->buffer); } command_write_buffer command_write_buffer_create(cl_mem buffer, size_t offset, size_t cb, const void * ptr) { command_write_buffer cmd = malloc(sizeof(struct command_write_buffer_t)); command_init(cmd, CL_COMMAND_WRITE_BUFFER, command_write_buffer_release); gc_entity_store(&cmd->buffer, buffer); dup(offset); dup(cb); dup(ptr); return cmd; } void command_copy_buffer_release(void *arg) { command_copy_buffer cmd = (command_copy_buffer)arg; gc_entity_unstore(&cmd->src_buffer); gc_entity_unstore(&cmd->dst_buffer); } command_copy_buffer command_copy_buffer_create( cl_mem src_buffer, cl_mem dst_buffer, size_t src_offset, size_t dst_offset, size_t cb) { command_copy_buffer cmd = malloc(sizeof(struct command_copy_buffer_t)); command_init(cmd, CL_COMMAND_COPY_BUFFER, command_copy_buffer_release); gc_entity_store(&cmd->src_buffer, src_buffer); gc_entity_store(&cmd->dst_buffer, dst_buffer); dup(src_offset); dup(dst_offset); dup(cb); return cmd; } #undef nullOrDup #undef nodeNullOrDup #undef dup #undef nodeDup #undef memdup starpu-1.2.3+dfsg/socl/src/command.h000066400000000000000000000130471320135501600172710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" #ifndef SOCL_COMMANDS_H #define SOCL_COMMANDS_H typedef struct cl_command_t * cl_command; #define gc_entity_store_cmd(dest,cmd) gc_entity_store(dest, &cmd->_command) #define gc_entity_release_cmd(cmd) gc_entity_release(&cmd->_command) /** * Initialize a command structure * * Command constructors for each kind of command use this method * Implicit and explicit dependencies must be passed as parameters */ void command_init_ex(cl_command cmd, cl_command_type typ, void (*cb)(void*)); #define command_init(cmd,typ,cb) \ command_init_ex((cl_command)cmd,typ,cb) void command_release(cl_command cmd); /** Submit a command for execution */ void command_submit_ex(cl_command cmd); #define command_submit(cmd) \ command_submit_ex(&(cmd)->_command) /** Submit a command and its dependencies */ cl_int command_submit_deep_ex(cl_command cmd); #define command_submit_deep(cmd) (command_submit_deep_ex((cl_command)cmd)) void command_graph_dump_ex(cl_command cmd); #define command_graph_dump(cmd) (command_graph_dump_ex((cl_command)cmd)) /************************** * OpenCL Commands **************************/ struct cl_command_t { CL_ENTITY; cl_command_type typ; /* Command type */ cl_uint num_events; /* Number of dependencies */ cl_event * events; /* Dependencies */ cl_event event; /* Event for this command */ starpu_task task; /* Associated StarPU task, if any */ char submitted; /* True if the command has been submitted to StarPU */ void (*release_callback)(void*); /* Command specific destructor */ }; #define command_type_get(cmd) (((cl_command)cmd)->typ) cl_event command_event_get_ex(cl_command cmd); #define command_event_get(cmd) command_event_get_ex(&cmd->_command) #define command_num_events_get_ex(cmd) (cmd->num_events) #define command_num_events_get(cmd) ((cmd)->_command.num_events) #define command_events_get_ex(cmd) ((cmd)->events) #define command_events_get(cmd) ((cmd)->_command.events) #define command_task_get(cmd) ((cmd)->_command.task) #define command_cq_get(cmd) ((cmd)->_command.cq) #define CL_COMMAND struct cl_command_t _command; typedef struct command_ndrange_kernel_t { CL_COMMAND cl_kernel kernel; struct starpu_codelet codelet; cl_uint work_dim; const size_t * global_work_offset; const size_t * global_work_size; const size_t * local_work_size; cl_uint num_args; size_t * arg_sizes; enum kernel_arg_type * arg_types; void ** args; cl_uint num_buffers; cl_mem * buffers; } * command_ndrange_kernel; typedef struct command_read_buffer_t { CL_COMMAND cl_mem buffer; size_t offset; size_t cb; void * ptr; } * command_read_buffer; typedef struct command_write_buffer_t { CL_COMMAND cl_mem buffer; size_t offset; size_t cb; const void * ptr; } * command_write_buffer; typedef struct command_copy_buffer_t { CL_COMMAND cl_mem src_buffer; cl_mem dst_buffer; size_t src_offset; size_t dst_offset; size_t cb; } * command_copy_buffer; typedef struct command_map_buffer_t { CL_COMMAND cl_mem buffer; cl_map_flags map_flags; size_t offset; size_t cb; } * command_map_buffer; typedef struct command_unmap_mem_object_t { CL_COMMAND cl_mem buffer; void * ptr; } * command_unmap_mem_object; typedef struct command_marker_t { CL_COMMAND } * command_marker; typedef struct command_barrier_t { CL_COMMAND } * command_barrier; /************************* * Constructor functions *************************/ command_ndrange_kernel command_ndrange_kernel_create ( cl_kernel kernel, cl_uint work_dim, const size_t * global_work_offset, const size_t * global_work_size, const size_t * local_work_size); command_ndrange_kernel command_task_create (cl_kernel kernel); command_barrier command_barrier_create (); command_marker command_marker_create (); command_map_buffer command_map_buffer_create( cl_mem buffer, cl_map_flags map_flags, size_t offset, size_t cb); command_unmap_mem_object command_unmap_mem_object_create( cl_mem buffer, void * ptr); command_read_buffer command_read_buffer_create( cl_mem buffer, size_t offset, size_t cb, void * ptr); command_write_buffer command_write_buffer_create( cl_mem buffer, size_t offset, size_t cb, const void * ptr); command_copy_buffer command_copy_buffer_create( cl_mem src_buffer, cl_mem dst_buffer, size_t src_offset, size_t dst_offset, size_t cb); /************************* * Submit functions *************************/ cl_int command_ndrange_kernel_submit(command_ndrange_kernel cmd); cl_int command_read_buffer_submit(command_read_buffer cmd); cl_int command_write_buffer_submit(command_write_buffer cmd); cl_int command_copy_buffer_submit(command_copy_buffer cmd); cl_int command_map_buffer_submit(command_map_buffer cmd); cl_int command_unmap_mem_object_submit(command_unmap_mem_object cmd); cl_int command_marker_submit(command_marker cmd); cl_int command_barrier_submit(command_barrier cmd); #endif /* SOCL_COMMANDS_H */ starpu-1.2.3+dfsg/socl/src/command_list.c000066400000000000000000000026541320135501600203210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" command_list command_list_cons(cl_command cmd, command_list ls) { command_list e = malloc(sizeof(struct command_list_t)); e->cmd = cmd; e->next = ls; e->prev = NULL; if (ls != NULL) ls->prev = e; return e; } /** * Remove every occurence of cmd in the list l */ command_list command_list_remove(command_list l, cl_command cmd) { command_list e = l; while (e != NULL) { if (e->cmd == cmd) { if (e->prev != NULL) e->prev->next = e->next; if (e->next != NULL) e->next->prev = e->prev; command_list old = e; if (l == old) { // list head has been removed l = old->next; } e = old->next; free(old); } else { e = e->next; } } return l; } starpu-1.2.3+dfsg/socl/src/command_list.h000066400000000000000000000016521320135501600203230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" typedef struct command_list_t * command_list; struct command_list_t { cl_command cmd; command_list next; command_list prev; }; command_list command_list_cons(cl_command cmd, command_list ls); command_list command_list_remove(command_list l, cl_command cmd); starpu-1.2.3+dfsg/socl/src/command_queue.c000066400000000000000000000060401320135501600204630ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 University of Bordeaux * Copyright (C) 2012 CNRS * Copyright (C) 2012 Vincent Danjean * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" #include "task.h" #include "gc.h" /** * WARNING: command queues do NOT hold references on events. Only events hold references * on command queues. This way, event release will automatically remove the event from * its command queue. */ void command_queue_enqueue_ex(cl_command_queue cq, cl_command cmd, cl_uint num_events, const cl_event * events) { cl_event ev = command_event_get_ex(cmd); ev->prof_queued = _socl_nanotime(); gc_entity_release(ev); /* Check if the command is a barrier */ int is_barrier = (cmd->typ == CL_COMMAND_BARRIER || !(cq->properties & CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE)); /* Add references to the command queue */ gc_entity_store(&cmd->event->cq, cq); /* Lock command queue */ starpu_pthread_mutex_lock(&cq->mutex); /*** Number of dependencies ***/ int ndeps = num_events; /* Add dependency to last barrier if applicable */ if (cq->barrier != NULL) ndeps++; /* Add dependencies to out-of-order events (if any) */ if (is_barrier) { command_list cl = cq->commands; while (cl != NULL) { ndeps++; cl = cl->next; } } /*** Dependencies ***/ cl_event * deps = malloc(ndeps * sizeof(cl_event)); int n = 0; /* Add dependency to last barrier if applicable */ if (cq->barrier != NULL) gc_entity_store(&deps[n++], cq->barrier->event); /* Add dependencies to out-of-order events (if any) */ if (is_barrier) { command_list cl = cq->commands; while (cl != NULL) { gc_entity_store(&deps[n++], cl->cmd->event); cl = cl->next; } } /* Add explicit dependencies */ unsigned i; for (i=0; inum_events = ndeps; cmd->events = deps; /* Insert command in the queue */ if (is_barrier) { /* Remove out-of-order commands */ cq->commands = NULL; /* Register the command as the last barrier */ cq->barrier = cmd; } else { /* Add command to the list of out-of-order commands */ cq->commands = command_list_cons(cmd, cq->commands); } /* Submit command * We need to do it before unlocking because we don't want events to get * released while we use them to set dependencies */ command_submit_ex(cmd); /* Unlock command queue */ starpu_pthread_mutex_unlock(&cq->mutex); gc_entity_release(cmd); } starpu-1.2.3+dfsg/socl/src/command_queue.h000066400000000000000000000021421320135501600204670ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011, 2015 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef SOCL_COMMAND_QUEUE_H #define SOCL_COMMAND_QUEUE_H void command_queue_enqueue_ex( cl_command_queue cq, /* Command queue */ cl_command cmd, /* Command to enqueue */ cl_uint num_events, /* Number of explicit dependencies */ const cl_event * events /* Explicit dependencies */ ); #define command_queue_enqueue(cq, cmd, num_events, events)\ command_queue_enqueue_ex(cq, (cl_command)cmd, num_events, events) #endif /* SOCL_COMMAND_QUEUE_H */ starpu-1.2.3+dfsg/socl/src/debug.c000066400000000000000000000054171320135501600167360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" void ERROR_CL(char *s, cl_int err) { #define ERR_CASE(a) case a: ERROR_MSG("[OpenCL] %s CL error: %s\n", s, #a); break; switch(err) { case CL_SUCCESS: DEBUG_MSG("[OpenCL] %s SUCCESS.\n", s); break; ERR_CASE(CL_DEVICE_NOT_FOUND) ERR_CASE(CL_DEVICE_NOT_AVAILABLE) ERR_CASE(CL_COMPILER_NOT_AVAILABLE) ERR_CASE(CL_MEM_OBJECT_ALLOCATION_FAILURE) ERR_CASE(CL_OUT_OF_RESOURCES) ERR_CASE(CL_OUT_OF_HOST_MEMORY) ERR_CASE(CL_PROFILING_INFO_NOT_AVAILABLE) ERR_CASE(CL_MEM_COPY_OVERLAP) ERR_CASE(CL_IMAGE_FORMAT_MISMATCH) ERR_CASE(CL_IMAGE_FORMAT_NOT_SUPPORTED) ERR_CASE(CL_BUILD_PROGRAM_FAILURE) ERR_CASE(CL_MAP_FAILURE) ERR_CASE(CL_INVALID_VALUE) ERR_CASE(CL_INVALID_DEVICE_TYPE) ERR_CASE(CL_INVALID_PLATFORM) ERR_CASE(CL_INVALID_DEVICE) ERR_CASE(CL_INVALID_CONTEXT) ERR_CASE(CL_INVALID_QUEUE_PROPERTIES) ERR_CASE(CL_INVALID_COMMAND_QUEUE) ERR_CASE(CL_INVALID_HOST_PTR) ERR_CASE(CL_INVALID_MEM_OBJECT) ERR_CASE(CL_INVALID_IMAGE_FORMAT_DESCRIPTOR) ERR_CASE(CL_INVALID_IMAGE_SIZE) ERR_CASE(CL_INVALID_SAMPLER) ERR_CASE(CL_INVALID_BINARY) ERR_CASE(CL_INVALID_BUILD_OPTIONS) ERR_CASE(CL_INVALID_PROGRAM) ERR_CASE(CL_INVALID_PROGRAM_EXECUTABLE) ERR_CASE(CL_INVALID_KERNEL_NAME) ERR_CASE(CL_INVALID_KERNEL_DEFINITION) ERR_CASE(CL_INVALID_KERNEL) ERR_CASE(CL_INVALID_ARG_INDEX) ERR_CASE(CL_INVALID_ARG_VALUE) ERR_CASE(CL_INVALID_ARG_SIZE) ERR_CASE(CL_INVALID_KERNEL_ARGS) ERR_CASE(CL_INVALID_WORK_DIMENSION) ERR_CASE(CL_INVALID_WORK_GROUP_SIZE) ERR_CASE(CL_INVALID_WORK_ITEM_SIZE) ERR_CASE(CL_INVALID_GLOBAL_OFFSET) ERR_CASE(CL_INVALID_EVENT_WAIT_LIST) ERR_CASE(CL_INVALID_EVENT) ERR_CASE(CL_INVALID_OPERATION) ERR_CASE(CL_INVALID_GL_OBJECT) ERR_CASE(CL_INVALID_BUFFER_SIZE) ERR_CASE(CL_INVALID_MIP_LEVEL) ERR_CASE(CL_INVALID_GLOBAL_WORK_SIZE) default: ERROR_MSG("%s CL error: Error message not supported by ERROR_CL function (%d).\n", s, err); } } starpu-1.2.3+dfsg/socl/src/debug.h000066400000000000000000000034661320135501600167450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011, 2015 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef SOCL_DEBUG_H #define SOCL_DEBUG_H #include <../src/common/config.h> #ifdef STARPU_VERBOSE #define DEBUG #include #define DEBUG_MSG(...) do { if (!getenv("STARPU_SILENT")) { fprintf(stderr, "[SOCL] [%s] ", __starpu_func__); fprintf(stderr, __VA_ARGS__);}} while (0) #define DEBUG_MSG_NOHEAD(...) do { if (!getenv("STARPU_SILENT")) { fprintf(stderr, __VA_ARGS__);}} while (0); #define DEBUG_ERROR(...) do { if (!getenv("STARPU_SILENT")) { fprintf(stderr, "[SOCL] ERROR: "__VA_ARGS__); } exit(1); } while (0) #else #define DEBUG_MSG(...) while(0) #define DEBUG_MSG_NOHEAD(...) while(0) #define DEBUG_ERROR(...) while(0) #endif #define ERROR_MSG(...) do { fprintf(stderr, "[SOCL] [%s] ERROR: ", __starpu_func__); fprintf(stderr, __VA_ARGS__); } while (0) #define ERROR_MSG_NOHEAD(...) fprintf(stderr, __VA_ARGS__) #define ERROR_STOP(...) do { ERROR_MSG(__VA_ARGS__); exit(1); } while(0) void ERROR_CL(char *s, cl_int err); #ifdef STARPU_VERBOSE #define DEBUG_CL(args...) ERROR_CL(args) #else #define DEBUG_CL(...) while(0) #endif #ifdef DEBUG #define DEBUG_PARAM(p) p #else #define DEBUG_PARAM(p) UNUSED(p) #endif #endif /* SOCL_DEBUG_H */ starpu-1.2.3+dfsg/socl/src/event.c000066400000000000000000000032721320135501600167660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" #include "event.h" #include "gc.h" static void release_callback_event(void * e); int event_unique_id() { static int id = 1; return __sync_fetch_and_add(&id,1); } /** * Create a new event * * Events have one-to-one relation with tag. Tag number is event ID */ cl_event event_create(void) { cl_event ev; ev = gc_entity_alloc(sizeof(struct _cl_event), release_callback_event, "event"); ev->id = event_unique_id(); ev->status = CL_SUBMITTED; ev->command = NULL; ev->prof_queued = 0L; ev->prof_submit = 0L; ev->prof_start = 0L; ev->prof_end = 0L; ev->cq = NULL; return ev; } void event_complete(cl_event ev) { ev->status = CL_COMPLETE; ev->prof_end = _socl_nanotime(); /* Trigger the tag associated to the command event */ DEBUG_MSG("Trigger event %d\n", ev->id); starpu_tag_notify_from_apps(ev->id); } static void release_callback_event(void * e) { cl_event event = (cl_event)e; gc_entity_unstore(&event->cq); /* Destruct object */ //FIXME //starpu_tag_remove(event->id); } starpu-1.2.3+dfsg/socl/src/event.h000066400000000000000000000017121320135501600167700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef SOCL_EVENT_H #define SOCL_EVENT_H #include "socl.h" /** * Create a new event * * Events have one-to-one relation with tag. Tag number is event ID */ cl_event event_create(void); /** * Generate a unique tag id */ int event_unique_id(); void event_complete(cl_event ev); #endif /* SOCL_EVENT_H */ starpu-1.2.3+dfsg/socl/src/gc.c000066400000000000000000000112451320135501600162350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 University of Bordeaux * Copyright (C) 2012, 2014, 2017 CNRS * Copyright (C) 2012 Vincent Danjean * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "gc.h" #include "event.h" #include "socl.h" #include /** * Garbage collection thread */ /* List of entities to be released */ static volatile entity gc_list = NULL; static volatile entity entities = NULL; /* Mutex and cond for release */ static starpu_pthread_mutex_t gc_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static starpu_pthread_cond_t gc_cond = STARPU_PTHREAD_COND_INITIALIZER; /* Set to 1 to stop release thread execution */ static volatile int gc_stop_required = 0; #define GC_LOCK starpu_pthread_mutex_lock(&gc_mutex) #define GC_UNLOCK { starpu_pthread_cond_signal(&gc_cond); \ starpu_pthread_mutex_unlock(&gc_mutex);} #define GC_UNLOCK_NO_SIGNAL starpu_pthread_mutex_unlock(&gc_mutex) /* Thread routine */ static void * gc_thread_routine(void *UNUSED(arg)) { GC_LOCK; do { /* Make a copy of the gc_list to allow callbacks to add things into it */ entity rs = gc_list; gc_list = NULL; GC_UNLOCK_NO_SIGNAL; entity r = rs; while (r != NULL) { /* Call entity release callback */ if (r->release_callback != NULL) { r->release_callback(r); } /* Release entity */ entity next = r->next; free(r); r = next; } GC_LOCK; /* Check if new entities have been added */ if (gc_list != NULL) continue; /* Stop if required */ if (gc_stop_required) { GC_UNLOCK_NO_SIGNAL; break; } /* Otherwise we sleep */ starpu_pthread_cond_wait(&gc_cond, &gc_mutex); } while (1); starpu_pthread_exit(NULL); } static starpu_pthread_t gc_thread; /* Start garbage collection */ void gc_start(void) { starpu_pthread_create(&gc_thread, NULL, gc_thread_routine, NULL); } /* Stop garbage collection */ void gc_stop(void) { GC_LOCK; gc_stop_required = 1; GC_UNLOCK; starpu_pthread_join(gc_thread, NULL); } int gc_entity_release_ex(entity e, const char * DEBUG_PARAM(caller)) { DEBUG_MSG("[%s] Decrementing refcount of %s %p to ", caller, e->name, (void *)e); /* Decrement reference count */ int refs = __sync_sub_and_fetch(&e->refs, 1); DEBUG_MSG_NOHEAD("%d\n", refs); assert(refs >= 0); if (refs != 0) return 0; DEBUG_MSG("[%s] Releasing %s %p\n", caller, e->name, (void *)e); GC_LOCK; /* Remove entity from the entities list */ if (e->prev != NULL) e->prev->next = e->next; if (e->next != NULL) e->next->prev = e->prev; if (entities == e) entities = e->next; /* Put entity in the release queue */ e->next = gc_list; gc_list = e; GC_UNLOCK; return 1; } /** * Initialize entity */ void gc_entity_init(void *arg, void (*release_callback)(void*), char * name) { DEBUG_MSG("Initializing entity %p (%s)\n", arg, name); struct entity * e = (entity)arg; e->dispatch = &socl_master_dispatch; e->refs = 1; e->release_callback = release_callback; e->prev = NULL; e->name = name; GC_LOCK; e->next = entities; if (entities != NULL) entities->prev = e; entities = e; GC_UNLOCK_NO_SIGNAL; } /** * Allocate and initialize entity */ void * gc_entity_alloc(unsigned int size, void (*release_callback)(void*), char * name) { void * e = malloc(size); gc_entity_init(e, release_callback, name); return e; } /** Retain entity */ void gc_entity_retain_ex(void *arg, const char * DEBUG_PARAM(caller)) { struct entity * e = (entity)arg; #ifdef DEBUG int refs = #endif __sync_add_and_fetch(&e->refs, 1); DEBUG_MSG("[%s] Incrementing refcount of %s %p to %d\n", caller, e->name, e, refs); } int gc_active_entity_count(void) { int i = 0; entity e = entities; while (e != NULL) { i++; e = e->next; } return i; } void gc_print_remaining_entities(void) { DEBUG_MSG("Remaining entities:\n"); GC_LOCK; entity e = entities; while (e != NULL) { DEBUG_MSG(" - %s %p\n", e->name, (void *)e); e = e->next; } GC_UNLOCK; } #undef GC_LOCK #undef GC_UNLOCK #undef GC_UNLOCK_NO_SIGNAL starpu-1.2.3+dfsg/socl/src/gc.h000066400000000000000000000030301320135501600162330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef SOCL_GC_H #define SOCL_GC_H #include "socl.h" void gc_start(void); void gc_stop(void); void gc_entity_init(void *arg, void (*release_callback)(void*), char*name); void * gc_entity_alloc(unsigned int size, void (*release_callback)(void*), char * name); void gc_entity_retain_ex(void *arg, const char *); #define gc_entity_retain(arg) gc_entity_retain_ex(arg, __starpu_func__) /** Decrement reference counter and release entity if applicable */ int gc_entity_release_ex(entity e, const char*); int gc_active_entity_count(void); void gc_print_remaining_entities(void); #define gc_entity_release(a) gc_entity_release_ex(&(a)->_entity, __starpu_func__) #define gc_entity_store(dest,e) \ do {\ void * _e = e;\ gc_entity_retain(_e); \ *dest = _e;\ } while(0); #define gc_entity_unstore(dest) \ do {\ gc_entity_release(*dest); \ *dest = NULL;\ } while(0); #endif starpu-1.2.3+dfsg/socl/src/getinfo.h000066400000000000000000000035421320135501600173050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef SOCL_GETINFO_H #define SOCL_GETINFO_H #define INFO_CASE_EX2(var) if (param_value != NULL) { \ if (param_value_size < sizeof(var)) \ return CL_INVALID_VALUE; \ memcpy(param_value, &var, sizeof(var)); \ } \ if (param_value_size_ret != NULL) \ *param_value_size_ret = sizeof(var); \ break; #define INFO_CASE(param, var) case param: \ INFO_CASE_EX2(var) #define INFO_CASE_STRING_EX2(var) if (param_value != NULL) { \ if (param_value_size < strlen(var)+1) \ return CL_INVALID_VALUE; \ strcpy(param_value, var); \ } \ if (param_value_size_ret != NULL) \ *param_value_size_ret = strlen(var)+1; \ break; #define INFO_CASE_STRING(param, var) case param: \ INFO_CASE_STRING_EX2(var) #define INFO_CASE_VALUE(param, type, value) case param: {\ type tmp = (value);\ INFO_CASE_EX2(tmp);\ } //warning: var is a reference #define INFO_CASE_EX(param, var, size) case param: \ if (param_value != NULL) { \ if (param_value_size < size) \ return CL_INVALID_VALUE; \ memcpy(param_value, var, size); \ } \ if (param_value_size_ret != NULL) \ *param_value_size_ret = size; \ break; #endif /* SOCL_GETINFO_H */ starpu-1.2.3+dfsg/socl/src/init.c000066400000000000000000000054451320135501600166140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 University of Bordeaux * Copyright (C) 2012,2014,2016 CNRS * Copyright (C) 2012 Vincent Danjean * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "socl.h" #include "gc.h" #include "mem_objects.h" int _starpu_init_failed; volatile int _starpu_init = 0; static starpu_pthread_mutex_t _socl_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static struct starpu_conf conf; void socl_init_starpu(void) { STARPU_PTHREAD_MUTEX_LOCK(&_socl_mutex); if( ! _starpu_init ){ starpu_conf_init(&conf); conf.ncuda = 0; conf.ncpus = 0; _starpu_init_failed = starpu_init(&conf); if (_starpu_init_failed != 0) { DEBUG_MSG("Error when calling starpu_init: %d\n", _starpu_init_failed); } else { if (starpu_opencl_worker_get_count() == 0) { DEBUG_MSG("StarPU didn't find any OpenCL device. Try disabling CUDA support in StarPU (export STARPU_NCUDA=0).\n"); _starpu_init_failed = -ENODEV; } } /* Disable dataflow implicit dependencies */ starpu_data_set_default_sequential_consistency_flag(0); _starpu_init = 1; } STARPU_PTHREAD_MUTEX_UNLOCK(&_socl_mutex); } /** * Initialize SOCL */ __attribute__((constructor)) static void socl_init() { mem_object_init(); gc_start(); } void soclShutdown() { static int shutdown = 0; if (!shutdown) { shutdown = 1; STARPU_PTHREAD_MUTEX_LOCK(&_socl_mutex); if( _starpu_init ) starpu_task_wait_for_all(); gc_stop(); if( _starpu_init ) starpu_task_wait_for_all(); int active_entities = gc_active_entity_count(); if (active_entities != 0) { DEBUG_MSG("Unreleased entities: %d\n", active_entities); gc_print_remaining_entities(); } if( _starpu_init && _starpu_init_failed != -ENODEV) starpu_shutdown(); STARPU_PTHREAD_MUTEX_UNLOCK(&_socl_mutex); if (socl_devices != NULL) { free(socl_devices); socl_devices = NULL; } } } /** * Shutdown SOCL */ __attribute__((destructor)) static void socl_shutdown() { char * skip_str = getenv("SOCL_SKIP_DESTRUCTOR"); int skip = (skip_str != NULL ? atoi(skip_str) : 0); if (!skip) soclShutdown(); } starpu-1.2.3+dfsg/socl/src/init.h000066400000000000000000000017061320135501600166150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 University of Bordeaux * Copyright (C) 2012, 2014 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" #include "gc.h" #include "mem_objects.h" #ifndef SOCL_INIT_H #define SOCL_INIT_H extern int _starpu_init_failed; extern volatile int _starpu_init; /** * Initialize StarPU */ void socl_init_starpu(void); void soclShutdown(void); #endif /* SOCL_INIT_H */ starpu-1.2.3+dfsg/socl/src/mem_objects.c000066400000000000000000000042751320135501600201400ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" #define mem_object_hash_key 257 static cl_mem p_mem_objects[mem_object_hash_key] = {NULL}; static starpu_pthread_spinlock_t p_mem_objects_spinlock[mem_object_hash_key]; #define LOCK(i) starpu_pthread_spin_lock(&p_mem_objects_spinlock[i]); #define UNLOCK(i) starpu_pthread_spin_unlock(&p_mem_objects_spinlock[i]); void mem_object_init(void) { int i; for (i=0; i> 4; uintptr_t t3 = t2 % mem_object_hash_key; return (int)t3; } void mem_object_store(cl_mem m) { int hash = mem_object_hash(m); LOCK(hash); m->prev = NULL; m->next = p_mem_objects[hash]; if (p_mem_objects[hash] != NULL) p_mem_objects[hash]->prev = m; p_mem_objects[hash] = m; UNLOCK(hash); } void mem_object_release(cl_mem m) { int hash = mem_object_hash(m); LOCK(hash); if (m->prev != NULL) m->prev->next = m->next; if (m->next != NULL) m->next->prev = m->prev; if (p_mem_objects[hash] == m) { p_mem_objects[hash] = m->next; } UNLOCK(hash) } cl_mem mem_object_fetch(const void * addr) { int hash = mem_object_hash(*(cl_mem*)addr); LOCK(hash); cl_mem buf; for (buf = p_mem_objects[hash]; buf != NULL; buf = buf->next) { if (*(cl_mem*)addr == buf) { UNLOCK(hash); return buf; } } UNLOCK(hash); return NULL; } #undef LOCK #undef UNLOCK #undef mem_object_hash_key starpu-1.2.3+dfsg/socl/src/mem_objects.h000066400000000000000000000015641320135501600201430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef SOCL_MEM_OBJECTS_H #define SOCL_MEM_OBJECTS_H void mem_object_init(void); void mem_object_store(cl_mem m); void mem_object_release(cl_mem m); cl_mem mem_object_fetch(const void * addr); #endif /* SOCL_MEM_OBJECTS_H */ starpu-1.2.3+dfsg/socl/src/ocl_icd.h000066400000000000000000001016541320135501600172510ustar00rootroot00000000000000/** Copyright (c) 2012, Brice Videau Copyright (c) 2012, Vincent Danjean All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Do not edit this file. It is automatically generated. */ #include "CL/cl.h" #include "CL/cl_gl.h" #include "CL/cl_ext.h" #define OCL_ICD_API_VERSION 1 #define OCL_ICD_IDENTIFIED_FUNCTIONS 102 struct _cl_icd_dispatch { CL_API_ENTRY cl_int (CL_API_CALL*clGetPlatformIDs)( cl_uint /* num_entries */, cl_platform_id * /* platforms */, cl_uint * /* num_platforms */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL* clGetPlatformInfo)( cl_platform_id /* platform */, cl_platform_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clGetDeviceIDs)( cl_platform_id /* platform */, cl_device_type /* device_type */, cl_uint /* num_entries */, cl_device_id * /* devices */, cl_uint * /* num_devices */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clGetDeviceInfo)( cl_device_id /* device */, cl_device_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_context (CL_API_CALL*clCreateContext)( const cl_context_properties * /* properties */, cl_uint /* num_devices */, const cl_device_id * /* devices */, void (CL_CALLBACK * /* pfn_notify */)(const char *, const void *, size_t, void *), void * /* user_data */, cl_int * /* errcode_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_context (CL_API_CALL*clCreateContextFromType)( const cl_context_properties * /* properties */, cl_device_type /* device_type */, void (CL_CALLBACK * /* pfn_notify*/ )(const char *, const void *, size_t, void *), void * /* user_data */, cl_int * /* errcode_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clRetainContext)( cl_context /* context */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clReleaseContext)( cl_context /* context */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clGetContextInfo)( cl_context /* context */, cl_context_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_command_queue (CL_API_CALL*clCreateCommandQueue)( cl_context /* context */, cl_device_id /* device */, cl_command_queue_properties /* properties */, cl_int * /* errcode_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clRetainCommandQueue)( cl_command_queue /* command_queue */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clReleaseCommandQueue)( cl_command_queue /* command_queue */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clGetCommandQueueInfo)( cl_command_queue /* command_queue */, cl_command_queue_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clSetCommandQueueProperty)( cl_command_queue /* command_queue */, cl_command_queue_properties /* properties */, cl_bool /* enable */, cl_command_queue_properties * /* old_properties */) CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED; CL_API_ENTRY cl_mem (CL_API_CALL*clCreateBuffer)( cl_context /* context */, cl_mem_flags /* flags */, size_t /* size */, void * /* host_ptr */, cl_int * /* errcode_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_mem (CL_API_CALL*clCreateImage2D)( cl_context /* context */, cl_mem_flags /* flags */, const cl_image_format * /* image_format */, size_t /* image_width */, size_t /* image_height */, size_t /* image_row_pitch */, void * /* host_ptr */, cl_int * /* errcode_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_mem (CL_API_CALL*clCreateImage3D)( cl_context /* context */, cl_mem_flags /* flags */, const cl_image_format * /* image_format */, size_t /* image_width */, size_t /* image_height */, size_t /* image_depth */, size_t /* image_row_pitch */, size_t /* image_slice_pitch */, void * /* host_ptr */, cl_int * /* errcode_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clRetainMemObject)( cl_mem /* memobj */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clReleaseMemObject)( cl_mem /* memobj */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clGetSupportedImageFormats)( cl_context /* context */, cl_mem_flags /* flags */, cl_mem_object_type /* image_type */, cl_uint /* num_entries */, cl_image_format * /* image_formats */, cl_uint * /* num_image_formats */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clGetMemObjectInfo)( cl_mem /* memobj */, cl_mem_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clGetImageInfo)( cl_mem /* image */, cl_image_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_sampler (CL_API_CALL*clCreateSampler)( cl_context /* context */, cl_bool /* normalized_coords */, cl_addressing_mode /* addressing_mode */, cl_filter_mode /* filter_mode */, cl_int * /* errcode_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clRetainSampler)( cl_sampler /* sampler */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clReleaseSampler)( cl_sampler /* sampler */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clGetSamplerInfo)( cl_sampler /* sampler */, cl_sampler_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_program (CL_API_CALL*clCreateProgramWithSource)( cl_context /* context */, cl_uint /* count */, const char ** /* strings */, const size_t * /* lengths */, cl_int * /* errcode_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_program (CL_API_CALL*clCreateProgramWithBinary)( cl_context /* context */, cl_uint /* num_devices */, const cl_device_id * /* device_list */, const size_t * /* lengths */, const unsigned char ** /* binaries */, cl_int * /* binary_status */, cl_int * /* errcode_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clRetainProgram)( cl_program /* program */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clReleaseProgram)( cl_program /* program */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clBuildProgram)( cl_program /* program */, cl_uint /* num_devices */, const cl_device_id * /* device_list */, const char * /* options */, void (CL_CALLBACK * /* pfn_notify */)(cl_program /* program */, void * /* user_data */), void * /* user_data */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clUnloadCompiler)( void ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clGetProgramInfo)( cl_program /* program */, cl_program_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clGetProgramBuildInfo)( cl_program /* program */, cl_device_id /* device */, cl_program_build_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_kernel (CL_API_CALL*clCreateKernel)( cl_program /* program */, const char * /* kernel_name */, cl_int * /* errcode_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clCreateKernelsInProgram)( cl_program /* program */, cl_uint /* num_kernels */, cl_kernel * /* kernels */, cl_uint * /* num_kernels_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clRetainKernel)( cl_kernel /* kernel */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clReleaseKernel)( cl_kernel /* kernel */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clSetKernelArg)( cl_kernel /* kernel */, cl_uint /* arg_index */, size_t /* arg_size */, const void * /* arg_value */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clGetKernelInfo)( cl_kernel /* kernel */, cl_kernel_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clGetKernelWorkGroupInfo)( cl_kernel /* kernel */, cl_device_id /* device */, cl_kernel_work_group_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clWaitForEvents)( cl_uint /* num_events */, const cl_event * /* event_list */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clGetEventInfo)( cl_event /* event */, cl_event_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clRetainEvent)( cl_event /* event */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clReleaseEvent)( cl_event /* event */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clGetEventProfilingInfo)( cl_event /* event */, cl_profiling_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clFlush)( cl_command_queue /* command_queue */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clFinish)( cl_command_queue /* command_queue */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clEnqueueReadBuffer)( cl_command_queue /* command_queue */, cl_mem /* buffer */, cl_bool /* blocking_read */, size_t /* offset */, size_t /* cb */, void * /* ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clEnqueueWriteBuffer)( cl_command_queue /* command_queue */, cl_mem /* buffer */, cl_bool /* blocking_write */, size_t /* offset */, size_t /* cb */, const void * /* ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clEnqueueCopyBuffer)( cl_command_queue /* command_queue */, cl_mem /* src_buffer */, cl_mem /* dst_buffer */, size_t /* src_offset */, size_t /* dst_offset */, size_t /* cb */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clEnqueueReadImage)( cl_command_queue /* command_queue */, cl_mem /* image */, cl_bool /* blocking_read */, const size_t * /* origin[3] */, const size_t * /* region[3] */, size_t /* row_pitch */, size_t /* slice_pitch */, void * /* ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clEnqueueWriteImage)( cl_command_queue /* command_queue */, cl_mem /* image */, cl_bool /* blocking_write */, const size_t * /* origin[3] */, const size_t * /* region[3] */, size_t /* input_row_pitch */, size_t /* input_slice_pitch */, const void * /* ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clEnqueueCopyImage)( cl_command_queue /* command_queue */, cl_mem /* src_image */, cl_mem /* dst_image */, const size_t * /* src_origin[3] */, const size_t * /* dst_origin[3] */, const size_t * /* region[3] */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clEnqueueCopyImageToBuffer)( cl_command_queue /* command_queue */, cl_mem /* src_image */, cl_mem /* dst_buffer */, const size_t * /* src_origin[3] */, const size_t * /* region[3] */, size_t /* dst_offset */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clEnqueueCopyBufferToImage)( cl_command_queue /* command_queue */, cl_mem /* src_buffer */, cl_mem /* dst_image */, size_t /* src_offset */, const size_t * /* dst_origin[3] */, const size_t * /* region[3] */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY void * (CL_API_CALL*clEnqueueMapBuffer)( cl_command_queue /* command_queue */, cl_mem /* buffer */, cl_bool /* blocking_map */, cl_map_flags /* map_flags */, size_t /* offset */, size_t /* cb */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */, cl_int * /* errcode_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY void * (CL_API_CALL*clEnqueueMapImage)( cl_command_queue /* command_queue */, cl_mem /* image */, cl_bool /* blocking_map */, cl_map_flags /* map_flags */, const size_t * /* origin[3] */, const size_t * /* region[3] */, size_t * /* image_row_pitch */, size_t * /* image_slice_pitch */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */, cl_int * /* errcode_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clEnqueueUnmapMemObject)( cl_command_queue /* command_queue */, cl_mem /* memobj */, void * /* mapped_ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clEnqueueNDRangeKernel)( cl_command_queue /* command_queue */, cl_kernel /* kernel */, cl_uint /* work_dim */, const size_t * /* global_work_offset */, const size_t * /* global_work_size */, const size_t * /* local_work_size */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clEnqueueTask)( cl_command_queue /* command_queue */, cl_kernel /* kernel */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clEnqueueNativeKernel)( cl_command_queue /* command_queue */, void (*user_func)(void *), void * /* args */, size_t /* cb_args */, cl_uint /* num_mem_objects */, const cl_mem * /* mem_list */, const void ** /* args_mem_loc */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clEnqueueMarker)( cl_command_queue /* command_queue */, cl_event * /* event */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clEnqueueWaitForEvents)( cl_command_queue /* command_queue */, cl_uint /* num_events */, const cl_event * /* event_list */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clEnqueueBarrier)( cl_command_queue /* command_queue */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY void * (CL_API_CALL*clGetExtensionFunctionAddress)( const char * /* func_name */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_mem (CL_API_CALL*clCreateFromGLBuffer)( cl_context /* context */, cl_mem_flags /* flags */, cl_GLuint /* bufobj */, int * /* errcode_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_mem (CL_API_CALL*clCreateFromGLTexture2D)( cl_context /* context */, cl_mem_flags /* flags */, cl_GLenum /* target */, cl_GLint /* miplevel */, cl_GLuint /* texture */, cl_int * /* errcode_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_mem (CL_API_CALL*clCreateFromGLTexture3D)( cl_context /* context */, cl_mem_flags /* flags */, cl_GLenum /* target */, cl_GLint /* miplevel */, cl_GLuint /* texture */, cl_int * /* errcode_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_mem (CL_API_CALL*clCreateFromGLRenderbuffer)( cl_context /* context */, cl_mem_flags /* flags */, cl_GLuint /* renderbuffer */, cl_int * /* errcode_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clGetGLObjectInfo)( cl_mem /* memobj */, cl_gl_object_type * /* gl_object_type */, cl_GLuint * /* gl_object_name */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clGetGLTextureInfo)( cl_mem /* memobj */, cl_gl_texture_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clEnqueueAcquireGLObjects)( cl_command_queue /* command_queue */, cl_uint /* num_objects */, const cl_mem * /* mem_objects */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clEnqueueReleaseGLObjects)( cl_command_queue /* command_queue */, cl_uint /* num_objects */, const cl_mem * /* mem_objects */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL*clGetGLContextInfoKHR)( const cl_context_properties * /* properties */, cl_gl_context_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */ ) CL_API_SUFFIX__VERSION_1_0; CL_API_ENTRY cl_int (CL_API_CALL* clUnknown75)( void); CL_API_ENTRY cl_int (CL_API_CALL* clUnknown76)( void); CL_API_ENTRY cl_int (CL_API_CALL* clUnknown77)( void); CL_API_ENTRY cl_int (CL_API_CALL* clUnknown78)( void); CL_API_ENTRY cl_int (CL_API_CALL* clUnknown79)( void); CL_API_ENTRY cl_int (CL_API_CALL* clUnknown80)( void); CL_API_ENTRY cl_int (CL_API_CALL*clSetEventCallback)( cl_event /* event */, cl_int /* command_exec_callback_type */, void (CL_CALLBACK * /* pfn_notify */)(cl_event, cl_int, void *), void * /* user_data */ ) CL_API_SUFFIX__VERSION_1_1; CL_API_ENTRY cl_mem (CL_API_CALL*clCreateSubBuffer)( cl_mem /* buffer */, cl_mem_flags /* flags */, cl_buffer_create_type /* buffer_create_type */, const void * /* buffer_create_info */, cl_int * /* errcode_ret */ ) CL_API_SUFFIX__VERSION_1_1; CL_API_ENTRY cl_int (CL_API_CALL*clSetMemObjectDestructorCallback)( cl_mem /* memobj */, void (CL_CALLBACK * /*pfn_notify*/)( cl_mem /* memobj */, void* /*user_data*/), void * /*user_data */ ) CL_API_SUFFIX__VERSION_1_1; CL_API_ENTRY cl_event (CL_API_CALL*clCreateUserEvent)( cl_context /* context */, cl_int * /* errcode_ret */ ) CL_API_SUFFIX__VERSION_1_1; CL_API_ENTRY cl_int (CL_API_CALL*clSetUserEventStatus)( cl_event /* event */, cl_int /* execution_status */ ) CL_API_SUFFIX__VERSION_1_1; CL_API_ENTRY cl_int (CL_API_CALL*clEnqueueReadBufferRect)( cl_command_queue /* command_queue */, cl_mem /* buffer */, cl_bool /* blocking_read */, const size_t * /* buffer_origin */, const size_t * /* host_origin */, const size_t * /* region */, size_t /* buffer_row_pitch */, size_t /* buffer_slice_pitch */, size_t /* host_row_pitch */, size_t /* host_slice_pitch */, void * /* ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ) CL_API_SUFFIX__VERSION_1_1; CL_API_ENTRY cl_int (CL_API_CALL*clEnqueueWriteBufferRect)( cl_command_queue /* command_queue */, cl_mem /* buffer */, cl_bool /* blocking_write */, const size_t * /* buffer_origin */, const size_t * /* host_origin */, const size_t * /* region */, size_t /* buffer_row_pitch */, size_t /* buffer_slice_pitch */, size_t /* host_row_pitch */, size_t /* host_slice_pitch */, const void * /* ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ) CL_API_SUFFIX__VERSION_1_1; CL_API_ENTRY cl_int (CL_API_CALL*clEnqueueCopyBufferRect)( cl_command_queue /* command_queue */, cl_mem /* src_buffer */, cl_mem /* dst_buffer */, const size_t * /* src_origin */, const size_t * /* dst_origin */, const size_t * /* region */, size_t /* src_row_pitch */, size_t /* src_slice_pitch */, size_t /* dst_row_pitch */, size_t /* dst_slice_pitch */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ) CL_API_SUFFIX__VERSION_1_1; CL_API_ENTRY cl_int (CL_API_CALL* clCreateSubDevicesEXT)( cl_device_id /*in_device*/, const cl_device_partition_property_ext * /* properties */, cl_uint /*num_entries*/, cl_device_id * /*out_devices*/, cl_uint * /*num_devices*/ ) CL_EXT_SUFFIX__VERSION_1_1; CL_API_ENTRY cl_int (CL_API_CALL* clRetainDeviceEXT)( cl_device_id /*device*/ ) CL_EXT_SUFFIX__VERSION_1_1; CL_API_ENTRY cl_int (CL_API_CALL* clReleaseDeviceEXT)( cl_device_id /*device*/ ) CL_EXT_SUFFIX__VERSION_1_1; CL_API_ENTRY cl_int (CL_API_CALL* clUnknown92)( void); CL_API_ENTRY cl_int (CL_API_CALL*clCreateSubDevices)( cl_device_id /* in_device */, const cl_device_partition_property * /* properties */, cl_uint /* num_devices */, cl_device_id * /* out_devices */, cl_uint * /* num_devices_ret */ ) CL_API_SUFFIX__VERSION_1_2; CL_API_ENTRY cl_int (CL_API_CALL*clRetainDevice)( cl_device_id /* device */ ) CL_API_SUFFIX__VERSION_1_2; CL_API_ENTRY cl_int (CL_API_CALL*clReleaseDevice)( cl_device_id /* device */ ) CL_API_SUFFIX__VERSION_1_2; CL_API_ENTRY cl_mem (CL_API_CALL*clCreateImage)( cl_context /* context */, cl_mem_flags /* flags */, const cl_image_format * /* image_format */, const cl_image_desc * /* image_desc */, void * /* host_ptr */, cl_int * /* errcode_ret */ ) CL_API_SUFFIX__VERSION_1_2; CL_API_ENTRY cl_program (CL_API_CALL*clCreateProgramWithBuiltInKernels)( cl_context /* context */, cl_uint /* num_devices */, const cl_device_id * /* device_list */, const char * /* kernel_names */, cl_int * /* errcode_ret */ ) CL_API_SUFFIX__VERSION_1_2; CL_API_ENTRY cl_int (CL_API_CALL*clCompileProgram)( cl_program /* program */, cl_uint /* num_devices */, const cl_device_id * /* device_list */, const char * /* options */, cl_uint /* num_input_headers */, const cl_program * /* input_headers */, const char ** /* header_include_names */, void (CL_CALLBACK * /* pfn_notify */)(cl_program /* program */, void * /* user_data */), void * /* user_data */ ) CL_API_SUFFIX__VERSION_1_2; CL_API_ENTRY cl_program (CL_API_CALL*clLinkProgram)( cl_context /* context */, cl_uint /* num_devices */, const cl_device_id * /* device_list */, const char * /* options */, cl_uint /* num_input_programs */, const cl_program * /* input_programs */, void (CL_CALLBACK * /* pfn_notify */)(cl_program /* program */, void * /* user_data */), void * /* user_data */, cl_int * /* errcode_ret */ ) CL_API_SUFFIX__VERSION_1_2; CL_API_ENTRY cl_int (CL_API_CALL*clUnloadPlatformCompiler)( cl_platform_id /* platform */ ) CL_API_SUFFIX__VERSION_1_2; CL_API_ENTRY cl_int (CL_API_CALL*clGetKernelArgInfo)( cl_kernel /* kernel */, cl_uint /* arg_indx */, cl_kernel_arg_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */ ) CL_API_SUFFIX__VERSION_1_2; CL_API_ENTRY cl_int (CL_API_CALL*clEnqueueFillBuffer)( cl_command_queue /* command_queue */, cl_mem /* buffer */, const void * /* pattern */, size_t /* pattern_size */, size_t /* offset */, size_t /* size */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ) CL_API_SUFFIX__VERSION_1_2; CL_API_ENTRY cl_int (CL_API_CALL*clEnqueueFillImage)( cl_command_queue /* command_queue */, cl_mem /* image */, const void * /* fill_color */, const size_t * /* origin[3] */, const size_t * /* region[3] */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ) CL_API_SUFFIX__VERSION_1_2; CL_API_ENTRY cl_int (CL_API_CALL*clEnqueueMigrateMemObjects)( cl_command_queue /* command_queue */, cl_uint /* num_mem_objects */, const cl_mem * /* mem_objects */, cl_mem_migration_flags /* flags */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ) CL_API_SUFFIX__VERSION_1_2; CL_API_ENTRY cl_int (CL_API_CALL*clEnqueueMarkerWithWaitList)( cl_command_queue /* command_queue */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ) CL_API_SUFFIX__VERSION_1_2; CL_API_ENTRY cl_int (CL_API_CALL*clEnqueueBarrierWithWaitList)( cl_command_queue /* command_queue */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ) CL_API_SUFFIX__VERSION_1_2; CL_API_ENTRY void * (CL_API_CALL* clGetExtensionFunctionAddressForPlatform)( cl_platform_id /* platform */, const char * /* func_name */ ) CL_API_SUFFIX__VERSION_1_2; CL_API_ENTRY cl_mem (CL_API_CALL*clCreateFromGLTexture)( cl_context /* context */, cl_mem_flags /* flags */, cl_GLenum /* target */, cl_GLint /* miplevel */, cl_GLuint /* texture */, cl_int * /* errcode_ret */ ) CL_API_SUFFIX__VERSION_1_2; CL_API_ENTRY cl_int (CL_API_CALL* clUnknown109)( void); CL_API_ENTRY cl_int (CL_API_CALL* clUnknown110)( void); CL_API_ENTRY cl_int (CL_API_CALL* clUnknown111)( void); CL_API_ENTRY cl_int (CL_API_CALL* clUnknown112)( void); CL_API_ENTRY cl_int (CL_API_CALL* clUnknown113)( void); CL_API_ENTRY cl_int (CL_API_CALL* clUnknown114)( void); CL_API_ENTRY cl_int (CL_API_CALL* clUnknown115)( void); CL_API_ENTRY cl_int (CL_API_CALL* clUnknown116)( void); CL_API_ENTRY cl_int (CL_API_CALL* clUnknown117)( void); CL_API_ENTRY cl_int (CL_API_CALL* clUnknown118)( void); CL_API_ENTRY cl_int (CL_API_CALL* clUnknown119)( void); CL_API_ENTRY cl_int (CL_API_CALL* clUnknown120)( void); CL_API_ENTRY cl_int (CL_API_CALL* clUnknown121)( void); }; starpu-1.2.3+dfsg/socl/src/socl.c000066400000000000000000000121321320135501600166000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 University of Bordeaux * Copyright (C) 2012 CNRS * Copyright (C) 2012 Vincent Danjean * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" struct _cl_icd_dispatch socl_master_dispatch = { soclGetPlatformIDs, soclGetPlatformInfo, soclGetDeviceIDs, soclGetDeviceInfo, soclCreateContext, soclCreateContextFromType, soclRetainContext, soclReleaseContext, soclGetContextInfo, soclCreateCommandQueue, soclRetainCommandQueue, soclReleaseCommandQueue, soclGetCommandQueueInfo, soclSetCommandQueueProperty, soclCreateBuffer, soclCreateImage2D, soclCreateImage3D, soclRetainMemObject, soclReleaseMemObject, soclGetSupportedImageFormats, soclGetMemObjectInfo, soclGetImageInfo, soclCreateSampler, soclRetainSampler, soclReleaseSampler, soclGetSamplerInfo, soclCreateProgramWithSource, soclCreateProgramWithBinary, soclRetainProgram, soclReleaseProgram, soclBuildProgram, soclUnloadCompiler, soclGetProgramInfo, soclGetProgramBuildInfo, soclCreateKernel, soclCreateKernelsInProgram, soclRetainKernel, soclReleaseKernel, soclSetKernelArg, soclGetKernelInfo, soclGetKernelWorkGroupInfo, soclWaitForEvents, soclGetEventInfo, soclRetainEvent, soclReleaseEvent, soclGetEventProfilingInfo, soclFlush, soclFinish, soclEnqueueReadBuffer, soclEnqueueWriteBuffer, soclEnqueueCopyBuffer, soclEnqueueReadImage, soclEnqueueWriteImage, soclEnqueueCopyImage, soclEnqueueCopyImageToBuffer, soclEnqueueCopyBufferToImage, soclEnqueueMapBuffer, soclEnqueueMapImage, soclEnqueueUnmapMemObject, soclEnqueueNDRangeKernel, soclEnqueueTask, soclEnqueueNativeKernel, soclEnqueueMarker, soclEnqueueWaitForEvents, soclEnqueueBarrier, soclGetExtensionFunctionAddress, (void *) NULL, // clCreateFromGLBuffer, (void *) NULL, // clCreateFromGLTexture2D, (void *) NULL, // clCreateFromGLTexture3D, (void *) NULL, // clCreateFromGLRenderbuffer, (void *) NULL, // clGetGLObjectInfo, (void *) NULL, // clGetGLTextureInfo, (void *) NULL, // clEnqueueAcquireGLObjects, (void *) NULL, // clEnqueueReleaseGLObjects, (void *) NULL, // clGetGLContextInfoKHR, (void *) NULL, // (void *) NULL, (void *) NULL, (void *) NULL, (void *) NULL, (void *) NULL, (void *) NULL, // clSetEventCallback, (void *) NULL, // clCreateSubBuffer, (void *) NULL, // clSetMemObjectDestructorCallback, (void *) NULL, // clCreateUserEvent, (void *) NULL, // clSetUserEventStatus, (void *) NULL, // clEnqueueReadBufferRect, (void *) NULL, // clEnqueueWriteBufferRect, (void *) NULL, // clEnqueueCopyBufferRect, (void *) NULL, // clCreateSubDevicesEXT, (void *) NULL, // clRetainDeviceEXT, (void *) NULL, // clReleaseDeviceEXT, (void *) NULL, (void *) NULL, // clCreateSubDevices, (void *) NULL, // clRetainDevice, (void *) NULL, // clReleaseDevice, (void *) NULL, // clCreateImage, (void *) NULL, // clCreateProgramWithBuiltInKernels, (void *) NULL, // clCompileProgram, (void *) NULL, // clLinkProgram, (void *) NULL, // clUnloadPlatformCompiler, (void *) NULL, // clGetKernelArgInfo, (void *) NULL, // clEnqueueFillBuffer, (void *) NULL, // clEnqueueFillImage, (void *) NULL, // clEnqueueMigrateMemObjects, soclEnqueueMarkerWithWaitList, // clEnqueueMarkerWithWaitList, soclEnqueueBarrierWithWaitList, // clEnqueueBarrierWithWaitList, soclGetExtensionFunctionAddressForPlatform, // clGetExtensionFunctionAddressForPlatform, (void *) NULL, // clCreateFromGLTexture, (void *) NULL, (void *) NULL, (void *) NULL, (void *) NULL, (void *) NULL, (void *) NULL, (void *) NULL, (void *) NULL, (void *) NULL, (void *) NULL, (void *) NULL, (void *) NULL, (void *) NULL }; struct _cl_platform_id socl_platform = {&socl_master_dispatch}; const char * __attribute__ ((aligned (16))) SOCL_PROFILE = "FULL_PROFILE"; const char * __attribute__ ((aligned (16))) SOCL_VERSION = "OpenCL 1.0 SOCL Edition (0.1.0)"; const char * __attribute__ ((aligned (16))) SOCL_PLATFORM_NAME = "SOCL Platform"; const char * __attribute__ ((aligned (16))) SOCL_VENDOR = "INRIA"; const char * __attribute__ ((aligned (16))) SOCL_PLATFORM_EXTENSIONS = "cl_khr_icd"; const char * __attribute__ ((aligned (16))) SOCL_PLATFORM_ICD_SUFFIX_KHR ="SOCL"; /* Command queues with profiling enabled * This allows us to disable StarPU profiling it * is equal to 0 */ int __attribute__ ((aligned (16))) profiling_queue_count = 0; struct _cl_device_id * socl_devices = NULL; unsigned int socl_device_count = 0; starpu-1.2.3+dfsg/socl/src/socl.h000066400000000000000000000736531320135501600166240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 University of Bordeaux * Copyright (C) 2012,2014,2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef SOCL_H #define SOCL_H #define CL_CONTEXT_SCHEDULER_SOCL 0xFF01 #define CL_CONTEXT_NAME_SOCL 0xFF02 #include #include #include #include #include "CL/cl.h" #include "ocl_icd.h" #include typedef struct starpu_task * starpu_task; #ifdef UNUSED #elif defined(__GNUC__) #define UNUSED(x) UNUSED_ ## x __attribute__((unused)) #else #define UNUSED(x) x #endif /** * Entity that can be managed by the garbage collector */ typedef struct entity * entity; struct entity { struct _cl_icd_dispatch * dispatch; /* Reference count */ size_t refs; /* Callback called on release */ void (*release_callback)(void*entity); /* Entity identifier (used for debugging purpose) */ char * name; /* Next entity in garbage collector queue */ entity prev; entity next; }; /* OpenCL entities (context, command queues, buffers...) must use * this macro as their first field */ #define CL_ENTITY struct entity _entity; #include "command.h" #include "command_list.h" #include "command_queue.h" #include "debug.h" #include "event.h" #include "gc.h" #include "mem_objects.h" #include "task.h" #include "util.h" struct _cl_platform_id { struct _cl_icd_dispatch *dispatch; }; struct _cl_device_id { struct _cl_icd_dispatch *dispatch; int device_id; int worker_id; }; #define RETURN_EVENT(ev, event) \ if ((event) != NULL) { \ *event = ev; \ } \ else {\ gc_entity_release(ev);\ } #define MAY_BLOCK_THEN_RETURN_EVENT(ev,blocking,event) \ if ((blocking) == CL_TRUE) {\ soclWaitForEvents(1, &ev);\ }\ RETURN_EVENT(ev,event);\ /* Constants */ extern const char * SOCL_PROFILE; extern const char * SOCL_VERSION; extern const char * SOCL_PLATFORM_NAME; extern const char * SOCL_VENDOR; extern const char * SOCL_PLATFORM_EXTENSIONS; extern const char * SOCL_PLATFORM_ICD_SUFFIX_KHR; struct _cl_context { CL_ENTITY; void (*pfn_notify)(const char *, const void *, size_t, void *); void *user_data; /* Associated devices */ cl_device_id * devices; cl_uint num_devices; /* Scheduling context */ unsigned sched_ctx; /* Properties */ cl_context_properties * properties; cl_uint num_properties; /* ID */ #ifdef DEBUG int id; #endif }; struct _cl_command_queue { CL_ENTITY; cl_command_queue_properties properties; cl_device_id device; cl_context context; /* Stored commands */ command_list commands; /* Last enqueued barrier-like event */ cl_command barrier; /* Mutex */ starpu_pthread_mutex_t mutex; /* ID */ #ifdef DEBUG int id; #endif }; struct _cl_event { CL_ENTITY; /* Command queue */ cl_command_queue cq; /* Command */ cl_command command; /* Event status */ cl_int status; /* ID * This ID is used as a tag for StarPU dependencies */ int id; /* Profiling info */ cl_ulong prof_queued, prof_submit, prof_start, prof_end; }; struct _cl_mem { CL_ENTITY; /* StarPU handle */ starpu_data_handle_t handle; /* Pointer to data in host memory */ void *ptr; /* Buffer size */ size_t size; /* Indicates how many references (mapping, MEM_USE_HOST_PTR...) require * coherence in host memory. If set to zero, no coherency is maintained * (this is the most efficient) */ int map_count; /* Creation flags */ cl_mem_flags flags; /* Creation context */ cl_context context; /* Access mode */ int mode; /* Host ptr */ void * host_ptr; /* Fields used to store cl_mems in mem_objects list */ cl_mem prev; cl_mem next; /* Indicates if a buffer may contain meaningful data. Otherwise we don't have to transfer it */ int scratch; /* ID */ #ifdef DEBUG int id; #endif }; struct _cl_program { CL_ENTITY; /* Real OpenCL Programs * There is one entry for each device (even non OpenCL ones) * in order to index this array with dev_id */ cl_program *cl_programs; /* Context used to create this program */ cl_context context; /* Options */ char * options; unsigned int options_size; /* ID */ #ifdef DEBUG int id; #endif }; enum kernel_arg_type { Null, Buffer, Immediate }; typedef cl_int (*split_func_t)(cl_command_queue, cl_uint, void *, const cl_event, cl_event *); struct _cl_kernel { CL_ENTITY; /* Associated program */ cl_program program; /* StarPU codelet */ struct starpu_perfmodel * perfmodel; /* Kernel name */ char * kernel_name; /* Real OpenCL kernels */ cl_kernel *cl_kernels; /* clCreateKernel return codes */ cl_int *errcodes; /* Arguments */ unsigned int num_args; size_t *arg_size; enum kernel_arg_type *arg_type; void **arg_value; /* Partition function */ cl_uint split_space; split_func_t split_func; cl_ulong * split_perfs; void * split_data; starpu_pthread_mutex_t split_lock; /* ID */ #ifdef DEBUG int id; #endif }; /* Global vars */ /* Command queues with profiling enabled * This allows us to disable StarPU profiling it * is equal to 0 */ extern int profiling_queue_count; /***************************************************************************/ /* Platform API */ extern CL_API_ENTRY cl_int CL_API_CALL soclGetPlatformIDs(cl_uint /* num_entries */, cl_platform_id * /* platforms */, cl_uint * /* num_platforms */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclGetPlatformInfo(cl_platform_id /* platform */, cl_platform_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; /* Device APIs */ extern CL_API_ENTRY cl_int CL_API_CALL soclGetDeviceIDs(cl_platform_id /* platform */, cl_device_type /* device_type */, cl_uint /* num_entries */, cl_device_id * /* devices */, cl_uint * /* num_devices */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclGetDeviceInfo(cl_device_id /* device */, cl_device_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; /* Context APIs */ extern CL_API_ENTRY cl_context CL_API_CALL soclCreateContext(const cl_context_properties * /* properties */, cl_uint /* num_devices */, const cl_device_id * /* devices */, void (*pfn_notify)(const char *, const void *, size_t, void *) /* pfn_notify */, void * /* user_data */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_context CL_API_CALL soclCreateContextFromType(const cl_context_properties * /* properties */, cl_device_type /* device_type */, void (*pfn_notify)(const char *, const void *, size_t, void *) /* pfn_notify */, void * /* user_data */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclRetainContext(cl_context /* context */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclReleaseContext(cl_context /* context */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclGetContextInfo(cl_context /* context */, cl_context_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; /* Command Queue APIs */ extern CL_API_ENTRY cl_command_queue CL_API_CALL soclCreateCommandQueue(cl_context /* context */, cl_device_id /* device */, cl_command_queue_properties /* properties */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclRetainCommandQueue(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclReleaseCommandQueue(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclGetCommandQueueInfo(cl_command_queue /* command_queue */, cl_command_queue_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclSetCommandQueueProperty(cl_command_queue /* command_queue */, cl_command_queue_properties /* properties */, cl_bool /* enable */, cl_command_queue_properties * /* old_properties */) CL_API_SUFFIX__VERSION_1_0; /* Memory Object APIs */ extern CL_API_ENTRY cl_mem CL_API_CALL soclCreateBuffer(cl_context /* context */, cl_mem_flags /* flags */, size_t /* size */, void * /* host_ptr */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_mem CL_API_CALL soclCreateImage2D(cl_context /* context */, cl_mem_flags /* flags */, const cl_image_format * /* image_format */, size_t /* image_width */, size_t /* image_height */, size_t /* image_row_pitch */, void * /* host_ptr */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_mem CL_API_CALL soclCreateImage3D(cl_context /* context */, cl_mem_flags /* flags */, const cl_image_format * /* image_format */, size_t /* image_width */, size_t /* image_height */, size_t /* image_depth */, size_t /* image_row_pitch */, size_t /* image_slice_pitch */, void * /* host_ptr */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclRetainMemObject(cl_mem /* memobj */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclReleaseMemObject(cl_mem /* memobj */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclGetSupportedImageFormats(cl_context /* context */, cl_mem_flags /* flags */, cl_mem_object_type /* image_type */, cl_uint /* num_entries */, cl_image_format * /* image_formats */, cl_uint * /* num_image_formats */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclGetMemObjectInfo(cl_mem /* memobj */, cl_mem_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclGetImageInfo(cl_mem /* image */, cl_image_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; /* Sampler APIs */ extern CL_API_ENTRY cl_sampler CL_API_CALL soclCreateSampler(cl_context /* context */, cl_bool /* normalized_coords */, cl_addressing_mode /* addressing_mode */, cl_filter_mode /* filter_mode */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclRetainSampler(cl_sampler /* sampler */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclReleaseSampler(cl_sampler /* sampler */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclGetSamplerInfo(cl_sampler /* sampler */, cl_sampler_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; /* Program Object APIs */ extern CL_API_ENTRY cl_program CL_API_CALL soclCreateProgramWithSource(cl_context /* context */, cl_uint /* count */, const char ** /* strings */, const size_t * /* lengths */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_program CL_API_CALL soclCreateProgramWithBinary(cl_context /* context */, cl_uint /* num_devices */, const cl_device_id * /* device_list */, const size_t * /* lengths */, const unsigned char ** /* binaries */, cl_int * /* binary_status */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclRetainProgram(cl_program /* program */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclReleaseProgram(cl_program /* program */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclBuildProgram(cl_program /* program */, cl_uint /* num_devices */, const cl_device_id * /* device_list */, const char * /* options */, void (*pfn_notify)(cl_program /* program */, void * /* user_data */), void * /* user_data */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclUnloadCompiler(void) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclGetProgramInfo(cl_program /* program */, cl_program_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclGetProgramBuildInfo(cl_program /* program */, cl_device_id /* device */, cl_program_build_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; /* Kernel Object APIs */ extern CL_API_ENTRY cl_kernel CL_API_CALL soclCreateKernel(cl_program /* program */, const char * /* kernel_name */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclCreateKernelsInProgram(cl_program /* program */, cl_uint /* num_kernels */, cl_kernel * /* kernels */, cl_uint * /* num_kernels_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclRetainKernel(cl_kernel /* kernel */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclReleaseKernel(cl_kernel /* kernel */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclSetKernelArg(cl_kernel /* kernel */, cl_uint /* arg_index */, size_t /* arg_size */, const void * /* arg_value */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclGetKernelInfo(cl_kernel /* kernel */, cl_kernel_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclGetKernelWorkGroupInfo(cl_kernel /* kernel */, cl_device_id /* device */, cl_kernel_work_group_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; /* Event Object APIs */ extern CL_API_ENTRY cl_int CL_API_CALL soclWaitForEvents(cl_uint /* num_events */, const cl_event * /* event_list */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclGetEventInfo(cl_event /* event */, cl_event_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclRetainEvent(cl_event /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclReleaseEvent(cl_event /* event */) CL_API_SUFFIX__VERSION_1_0; /* Profiling APIs */ extern CL_API_ENTRY cl_int CL_API_CALL soclGetEventProfilingInfo(cl_event /* event */, cl_profiling_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; /* Flush and Finish APIs */ extern CL_API_ENTRY cl_int CL_API_CALL soclFlush(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclFinish(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; /* Enqueued Commands APIs */ extern CL_API_ENTRY cl_int CL_API_CALL soclEnqueueReadBuffer(cl_command_queue /* command_queue */, cl_mem /* buffer */, cl_bool /* blocking_read */, size_t /* offset */, size_t /* cb */, void * /* ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclEnqueueWriteBuffer(cl_command_queue /* command_queue */, cl_mem /* buffer */, cl_bool /* blocking_write */, size_t /* offset */, size_t /* cb */, const void * /* ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclEnqueueCopyBuffer(cl_command_queue /* command_queue */, cl_mem /* src_buffer */, cl_mem /* dst_buffer */, size_t /* src_offset */, size_t /* dst_offset */, size_t /* cb */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclEnqueueReadImage(cl_command_queue /* command_queue */, cl_mem /* image */, cl_bool /* blocking_read */, const size_t * /* origin[3] */, const size_t * /* region[3] */, size_t /* row_pitch */, size_t /* slice_pitch */, void * /* ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclEnqueueWriteImage(cl_command_queue /* command_queue */, cl_mem /* image */, cl_bool /* blocking_write */, const size_t * /* origin[3] */, const size_t * /* region[3] */, size_t /* input_row_pitch */, size_t /* input_slice_pitch */, const void * /* ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclEnqueueCopyImage(cl_command_queue /* command_queue */, cl_mem /* src_image */, cl_mem /* dst_image */, const size_t * /* src_origin[3] */, const size_t * /* dst_origin[3] */, const size_t * /* region[3] */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclEnqueueCopyImageToBuffer(cl_command_queue /* command_queue */, cl_mem /* src_image */, cl_mem /* dst_buffer */, const size_t * /* src_origin[3] */, const size_t * /* region[3] */, size_t /* dst_offset */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclEnqueueCopyBufferToImage(cl_command_queue /* command_queue */, cl_mem /* src_buffer */, cl_mem /* dst_image */, size_t /* src_offset */, const size_t * /* dst_origin[3] */, const size_t * /* region[3] */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY void * CL_API_CALL soclEnqueueMapBuffer(cl_command_queue /* command_queue */, cl_mem /* buffer */, cl_bool /* blocking_map */, cl_map_flags /* map_flags */, size_t /* offset */, size_t /* cb */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY void * CL_API_CALL soclEnqueueMapImage(cl_command_queue /* command_queue */, cl_mem /* image */, cl_bool /* blocking_map */, cl_map_flags /* map_flags */, const size_t * /* origin[3] */, const size_t * /* region[3] */, size_t * /* image_row_pitch */, size_t * /* image_slice_pitch */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclEnqueueUnmapMemObject(cl_command_queue /* command_queue */, cl_mem /* memobj */, void * /* mapped_ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclEnqueueNDRangeKernel(cl_command_queue /* command_queue */, cl_kernel /* kernel */, cl_uint /* work_dim */, const size_t * /* global_work_offset */, const size_t * /* global_work_size */, const size_t * /* local_work_size */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclEnqueueTask(cl_command_queue /* command_queue */, cl_kernel /* kernel */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclEnqueueNativeKernel(cl_command_queue /* command_queue */, void (*user_func)(void *), void * /* args */, size_t /* cb_args */, cl_uint /* num_mem_objects */, const cl_mem * /* mem_list */, const void ** /* args_mem_loc */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclEnqueueMarker(cl_command_queue /* command_queue */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclEnqueueWaitForEvents(cl_command_queue /* command_queue */, cl_uint /* num_events */, const cl_event * /* event_list */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int CL_API_CALL soclEnqueueBarrier(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; extern CL_API_ENTRY cl_int soclEnqueueMarkerWithWaitList( cl_command_queue /* command_queue */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ) CL_API_SUFFIX__VERSION_1_2; extern CL_API_ENTRY cl_int soclEnqueueBarrierWithWaitList( cl_command_queue /* command_queue */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ) CL_API_SUFFIX__VERSION_1_2; /* Extension function access * * Returns the extension function address for the given function name, * or NULL if a valid function can not be found. The client must * check to make sure the address is not NULL, before using or * calling the returned function address. */ extern CL_API_ENTRY void * CL_API_CALL soclGetExtensionFunctionAddress(const char * /* func_name */) CL_API_SUFFIX__VERSION_1_0; extern void * CL_API_CALL soclGetExtensionFunctionAddressForPlatform(cl_platform_id p, const char * func_name) CL_API_SUFFIX__VERSION_1_2; extern CL_API_ENTRY cl_int CL_API_CALL soclIcdGetPlatformIDsKHR(cl_uint /* num_entries */, cl_platform_id * /* platforms */, cl_uint * /* num_platforms */) CL_EXT_SUFFIX__VERSION_1_0; extern struct _cl_icd_dispatch socl_master_dispatch; extern struct _cl_platform_id socl_platform; extern struct _cl_device_id * socl_devices; extern unsigned int socl_device_count; #endif /* SOCL_H */ starpu-1.2.3+dfsg/socl/src/task.c000066400000000000000000000102751320135501600166100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" #include "gc.h" #include "event.h" void command_completed(cl_command cmd) { starpu_task task = cmd->task; cl_event ev = command_event_get_ex(cmd); ev->status = CL_COMPLETE; ev->prof_end = _socl_nanotime(); /* Commands without codelets (marker, barrier, unmap...) take no time */ if (task->cl == NULL) ev->prof_start = ev->prof_end; /* Trigger the tag associated to the command event */ DEBUG_MSG("Trigger event %d\n", ev->id); starpu_tag_notify_from_apps(ev->id); gc_entity_release(ev); } void command_completed_task_callback(void *arg) { cl_command cmd = (cl_command)arg; command_completed(cmd); /* Release the command stored task callback parameter */ gc_entity_release(cmd); } /* * Create a StarPU task */ starpu_task task_create() { struct starpu_task * task; /* Create StarPU task */ task = starpu_task_create(); /* Set task common settings */ task->destroy = 0; task->detach = 0; task->use_tag = 1; task->tag_id = event_unique_id(); return task; } void task_depends_on(starpu_task task, cl_uint num_events, cl_event *events) { if (num_events != 0) { cl_uint i; starpu_tag_t * tags = malloc(num_events * sizeof(starpu_tag_t)); DEBUG_MSG("Task %p depends on events:", task); for (i=0; iid; DEBUG_MSG_NOHEAD(" %d", events[i]->id); } DEBUG_MSG_NOHEAD("\n"); starpu_tag_declare_deps_array(task->tag_id, num_events, tags); free(tags); } } cl_int task_submit_ex(starpu_task task, cl_command cmd) { /* Associated the task to the command */ cmd->task = task; cl_uint num_events = command_num_events_get_ex(cmd); cl_event * events = command_events_get_ex(cmd); task_depends_on(task, num_events, events); task->callback_func = command_completed_task_callback; gc_entity_store(&task->callback_arg, cmd); cl_event ev = command_event_get_ex(cmd); ev->prof_submit = _socl_nanotime(); gc_entity_release(ev); /* Submit task */ int ret = (task->cl != NULL && task->cl->where == STARPU_OPENCL ? starpu_task_submit_to_ctx(task, cmd->event->cq->context->sched_ctx) : starpu_task_submit(task)); if (ret != 0) DEBUG_ERROR("Unable to submit a task. Error %d\n", ret); return CL_SUCCESS; } /********************************* * CPU task helper *********************************/ struct cputask_arg { void (*callback)(void*); void * arg; int free_arg; cl_command cmd; int complete_cmd; }; static void cputask_task(void *args) { struct cputask_arg * arg = (struct cputask_arg*)args; arg->callback(arg->arg); if (arg->complete_cmd) command_completed(arg->cmd); if (arg->free_arg) { assert(arg->arg != NULL); free(arg->arg); arg->arg = NULL; } gc_entity_unstore(&arg->cmd); free(arg); } void cpu_task_submit_ex(cl_command cmd, void (*callback)(void*), void *arg, int free_arg, int complete_cmd, struct starpu_codelet * codelet, unsigned num_events, cl_event * events) { struct cputask_arg * a = malloc(sizeof(struct cputask_arg)); a->callback = callback; a->arg = arg; a->free_arg = free_arg; gc_entity_store(&a->cmd, cmd); a->complete_cmd = complete_cmd; codelet->where = STARPU_OPENCL | STARPU_CPU | STARPU_CUDA; starpu_task task = task_create(); if (num_events != 0) { task_depends_on(task, num_events, events); } task->callback_func = cputask_task; task->callback_arg = a; cmd->task = task; int ret = starpu_task_submit(task); if (ret != 0) DEBUG_ERROR("Unable to submit a task. Error %d\n", ret); } starpu-1.2.3+dfsg/socl/src/task.h000066400000000000000000000037061320135501600166160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011, 2016 University of Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef SOCL_TASK_H #define SOCL_TASK_H #include "socl.h" starpu_task task_create() STARPU_ATTRIBUTE_MALLOC; void task_dependency_add(starpu_task task, cl_uint num_events, cl_event *events); void command_completed(cl_command cmd); void command_completed_task_callback(void *); /* Execute callback(arg) in a CPU task (with no buffer) * Associate this task to the command cmd (i.e. when this task completes, the command is completed) * Additional dependencies can be specified (num_events, events). * The codelet is used to give a fixed name to the task without allocating a * new codelet structure each time. This function will fill the other fields * as appropriate */ void cpu_task_submit_ex(cl_command cmd, void (*callback)(void*), void *arg, int free_arg, int release_cmd, struct starpu_codelet *, unsigned num_events, cl_event * events); #define cpu_task_submit(cmd, args...) cpu_task_submit_ex((cl_command)cmd, args) /** * Associate a StarPU task to a command and submit it * * When the task terminates, the command is set as terminated too */ cl_int task_submit_ex(starpu_task task, cl_command cmd); #define task_submit(task,cmd) task_submit_ex(task, (cl_command)cmd) /** * Add task dependencies */ void task_depends_on(starpu_task task, cl_uint num_events, cl_event *events); #endif /* SOCL_TASK_H */ starpu-1.2.3+dfsg/socl/src/util.c000066400000000000000000000032341320135501600166200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011 University of Bordeaux * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "socl.h" #include "common/timing.h" int starpu_worker_get_range_by_id(int id) { int i, oid = 0; for (i=0; i&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @STARPU_HAVE_WINDOWS_TRUE@am__append_1 = -Xlinker --output-def -Xlinker .libs/libstarpu-@STARPU_EFFECTIVE_VERSION@.def @STARPU_HAVE_DARWIN_TRUE@am__append_2 = \ @STARPU_HAVE_DARWIN_TRUE@ -Wl,-U,_starpu_main \ @STARPU_HAVE_DARWIN_TRUE@ -Wl,-U,_smpi_main \ @STARPU_HAVE_DARWIN_TRUE@ -Wl,-U,__starpu_mpi_simgrid_init \ @STARPU_HAVE_DARWIN_TRUE@ -Wl,-U,_smpi_simulated_main_ \ @STARPU_HAVE_DARWIN_TRUE@ -Wl,-U,_starpu_mpi_world_rank @STARPU_HAVE_LEVELDB_TRUE@am__append_3 = core/disk_ops/disk_leveldb.cpp @STARPU_USE_CPU_TRUE@am__append_4 = drivers/cpu/driver_cpu.c @STARPU_USE_CUDA_TRUE@am__append_5 = drivers/cuda/driver_cuda.c @STARPU_SIMGRID_TRUE@@STARPU_USE_CUDA_FALSE@am__append_6 = drivers/cuda/driver_cuda.c @STARPU_USE_OPENCL_TRUE@am__append_7 = drivers/opencl/driver_opencl.c \ @STARPU_USE_OPENCL_TRUE@ drivers/opencl/driver_opencl_utils.c @STARPU_SIMGRID_TRUE@@STARPU_USE_OPENCL_FALSE@am__append_8 = drivers/opencl/driver_opencl.c @STARPU_USE_SCC_TRUE@am__append_9 = drivers/scc/driver_scc_common.c \ @STARPU_USE_SCC_TRUE@ drivers/scc/driver_scc_source.c \ @STARPU_USE_SCC_TRUE@ drivers/scc/driver_scc_sink.c \ @STARPU_USE_SCC_TRUE@ drivers/scc/driver_scc_utils.c @STARPU_LINUX_SYS_TRUE@am__append_10 = core/disk_ops/disk_unistd_o_direct.c ######################################### # # # Generic MP compilation # # # ######################################### @STARPU_USE_MP_TRUE@am__append_11 = drivers/mp_common/mp_common.c \ @STARPU_USE_MP_TRUE@ drivers/mp_common/source_common.c \ @STARPU_USE_MP_TRUE@ drivers/mp_common/sink_common.c ######################################### # # # MIC compilation # # # ######################################### @STARPU_USE_MIC_TRUE@am__append_12 = drivers/mic/driver_mic_common.c \ @STARPU_USE_MIC_TRUE@ drivers/mic/driver_mic_source.c \ @STARPU_USE_MIC_TRUE@ drivers/mic/driver_mic_sink.c \ @STARPU_USE_MIC_TRUE@ drivers/mic/driver_mic_utils.c subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = libstarpu_@STARPU_EFFECTIVE_VERSION@_la_DEPENDENCIES = \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am__libstarpu_@STARPU_EFFECTIVE_VERSION@_la_SOURCES_DIST = \ common/barrier.c common/barrier_counter.c common/bitmap.c \ common/hash.c common/rwlock.c common/starpu_spinlock.c \ common/timing.c common/fxt.c common/utils.c common/thread.c \ common/graph.c core/jobs.c core/task.c core/task_bundle.c \ core/tree.c core/workers.c core/combined_workers.c \ core/topology.c core/disk.c core/debug.c core/errorcheck.c \ core/progress_hook.c core/dependencies/cg.c \ core/dependencies/dependencies.c \ core/dependencies/implicit_data_deps.c \ core/dependencies/tags.c core/dependencies/task_deps.c \ core/dependencies/data_concurrency.c \ core/dependencies/data_arbiter_concurrency.c \ core/disk_ops/disk_stdio.c core/disk_ops/disk_unistd.c \ core/disk_ops/unistd/disk_unistd_global.c \ core/perfmodel/perfmodel_history.c \ core/perfmodel/perfmodel_bus.c core/perfmodel/perfmodel.c \ core/perfmodel/perfmodel_print.c \ core/perfmodel/perfmodel_nan.c core/perfmodel/regression.c \ core/sched_policy.c core/simgrid.c core/sched_ctx.c \ core/sched_ctx_list.c core/parallel_task.c \ core/detect_combined_workers.c \ sched_policies/eager_central_policy.c \ sched_policies/eager_central_priority_policy.c \ sched_policies/work_stealing_policy.c \ sched_policies/locality_work_stealing_policy.c \ sched_policies/deque_modeling_policy_data_aware.c \ sched_policies/random_policy.c sched_policies/fifo_queues.c \ sched_policies/parallel_heft.c sched_policies/parallel_eager.c \ sched_policies/graph_test_policy.c \ drivers/driver_common/driver_common.c \ drivers/disk/driver_disk.c datawizard/memory_nodes.c \ datawizard/write_back.c datawizard/coherency.c \ datawizard/data_request.c datawizard/datawizard.c \ datawizard/copy_driver.c datawizard/filters.c \ datawizard/sort_data_handles.c datawizard/malloc.c \ datawizard/memory_manager.c datawizard/memalloc.c \ datawizard/memstats.c datawizard/footprint.c \ datawizard/datastats.c datawizard/user_interactions.c \ datawizard/reduction.c datawizard/interfaces/data_interface.c \ datawizard/interfaces/bcsr_interface.c \ datawizard/interfaces/coo_interface.c \ datawizard/interfaces/csr_interface.c \ datawizard/interfaces/matrix_filters.c \ datawizard/interfaces/matrix_interface.c \ datawizard/interfaces/block_filters.c \ datawizard/interfaces/block_interface.c \ datawizard/interfaces/vector_interface.c \ datawizard/interfaces/bcsr_filters.c \ datawizard/interfaces/csr_filters.c \ datawizard/interfaces/vector_filters.c \ datawizard/interfaces/variable_interface.c \ datawizard/interfaces/void_interface.c \ datawizard/interfaces/multiformat_interface.c \ util/execute_on_all.c util/starpu_create_sync_task.c \ util/file.c util/fstarpu.c util/misc.c \ util/openmp_runtime_support.c \ util/openmp_runtime_support_environment.c \ util/openmp_runtime_support_omp_api.c util/starpu_data_cpy.c \ util/starpu_task_insert.c util/starpu_task_insert_utils.c \ debug/traces/starpu_fxt.c debug/traces/starpu_fxt_mpi.c \ debug/traces/starpu_fxt_dag.c debug/traces/starpu_paje.c \ debug/traces/anim.c debug/latency.c debug/structures_size.c \ profiling/profiling.c profiling/bound.c \ profiling/profiling_helpers.c top/starpu_top.c \ top/starpu_top_task.c top/starpu_top_message_queue.c \ top/starpu_top_connection.c worker_collection/worker_list.c \ worker_collection/worker_tree.c \ sched_policies/component_worker.c \ sched_policies/component_sched.c \ sched_policies/component_fifo.c sched_policies/prio_deque.c \ sched_policies/helper_mct.c sched_policies/component_prio.c \ sched_policies/component_random.c \ sched_policies/component_eager.c \ sched_policies/component_eager_calibration.c \ sched_policies/component_mct.c sched_policies/component_heft.c \ sched_policies/component_best_implementation.c \ sched_policies/component_perfmodel_select.c \ sched_policies/component_composed.c \ sched_policies/modular_eager.c \ sched_policies/modular_eager_prefetching.c \ sched_policies/modular_prio.c \ sched_policies/modular_prio_prefetching.c \ sched_policies/modular_random.c \ sched_policies/modular_random_prefetching.c \ sched_policies/modular_heft.c \ sched_policies/modular_heft_prio.c \ sched_policies/modular_heft2.c core/disk_ops/disk_leveldb.cpp \ drivers/cpu/driver_cpu.c drivers/cuda/driver_cuda.c \ drivers/cuda/starpu_cublas.c drivers/cuda/starpu_cusparse.c \ drivers/opencl/driver_opencl.c \ drivers/opencl/driver_opencl_utils.c \ drivers/scc/driver_scc_common.c \ drivers/scc/driver_scc_source.c drivers/scc/driver_scc_sink.c \ drivers/scc/driver_scc_utils.c \ core/disk_ops/disk_unistd_o_direct.c \ drivers/mp_common/mp_common.c \ drivers/mp_common/source_common.c \ drivers/mp_common/sink_common.c \ drivers/mic/driver_mic_common.c \ drivers/mic/driver_mic_source.c drivers/mic/driver_mic_sink.c \ drivers/mic/driver_mic_utils.c @STARPU_HAVE_LEVELDB_TRUE@am__objects_1 = libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_leveldb.lo @STARPU_USE_CPU_TRUE@am__objects_2 = libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cpu.lo @STARPU_USE_CUDA_TRUE@am__objects_3 = libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cuda.lo @STARPU_SIMGRID_TRUE@@STARPU_USE_CUDA_FALSE@am__objects_4 = libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cuda.lo @STARPU_USE_OPENCL_TRUE@am__objects_5 = libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl.lo \ @STARPU_USE_OPENCL_TRUE@ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl_utils.lo @STARPU_SIMGRID_TRUE@@STARPU_USE_OPENCL_FALSE@am__objects_6 = libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl.lo @STARPU_USE_SCC_TRUE@am__objects_7 = libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_common.lo \ @STARPU_USE_SCC_TRUE@ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_source.lo \ @STARPU_USE_SCC_TRUE@ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_sink.lo \ @STARPU_USE_SCC_TRUE@ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_utils.lo @STARPU_LINUX_SYS_TRUE@am__objects_8 = libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_o_direct.lo @STARPU_USE_MP_TRUE@am__objects_9 = libstarpu_@STARPU_EFFECTIVE_VERSION@_la-mp_common.lo \ @STARPU_USE_MP_TRUE@ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-source_common.lo \ @STARPU_USE_MP_TRUE@ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sink_common.lo @STARPU_USE_MIC_TRUE@am__objects_10 = libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_common.lo \ @STARPU_USE_MIC_TRUE@ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_source.lo \ @STARPU_USE_MIC_TRUE@ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_sink.lo \ @STARPU_USE_MIC_TRUE@ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_utils.lo am_libstarpu_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS = \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier_counter.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bitmap.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hash.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-rwlock.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_spinlock.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-timing.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fxt.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-utils.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-thread.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-jobs.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_bundle.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tree.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-workers.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-combined_workers.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-topology.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-debug.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-errorcheck.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-progress_hook.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-cg.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-dependencies.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-implicit_data_deps.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tags.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_deps.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_concurrency.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_arbiter_concurrency.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_stdio.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_global.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_history.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_bus.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_print.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_nan.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-regression.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_policy.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx_list.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_task.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-detect_combined_workers.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_policy.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_priority_policy.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-work_stealing_policy.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-locality_work_stealing_policy.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-deque_modeling_policy_data_aware.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-random_policy.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fifo_queues.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_heft.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_eager.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph_test_policy.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_common.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_disk.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_nodes.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-write_back.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coherency.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_request.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datawizard.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-copy_driver.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-filters.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sort_data_handles.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-malloc.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_manager.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memalloc.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memstats.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-footprint.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datastats.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-user_interactions.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-reduction.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_interface.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_interface.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coo_interface.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_interface.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_filters.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_interface.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_filters.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_interface.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_interface.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_filters.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_filters.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_filters.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-variable_interface.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-void_interface.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-multiformat_interface.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-execute_on_all.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_create_sync_task.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-file.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fstarpu.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-misc.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_environment.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_omp_api.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_data_cpy.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert_utils.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_mpi.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_dag.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_paje.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-anim.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-latency.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-structures_size.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bound.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling_helpers.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_task.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_message_queue.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_connection.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_list.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_tree.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_worker.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_sched.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_fifo.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-prio_deque.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-helper_mct.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_prio.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_random.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager_calibration.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_mct.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_heft.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_best_implementation.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_perfmodel_select.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_composed.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager_prefetching.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio_prefetching.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random_prefetching.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft_prio.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft2.lo \ $(am__objects_1) $(am__objects_2) $(am__objects_3) \ $(am__objects_4) \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cublas.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cusparse.lo \ $(am__objects_5) $(am__objects_6) $(am__objects_7) \ $(am__objects_8) $(am__objects_9) $(am__objects_10) libstarpu_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS = \ $(am_libstarpu_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libstarpu_@STARPU_EFFECTIVE_VERSION@_la_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/common -I$(top_builddir)/include -I$(top_builddir)/gcc-plugin/include/starpu-gcc -I$(top_builddir)/starpu-top depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_SOURCES) DIST_SOURCES = \ $(am__libstarpu_@STARPU_EFFECTIVE_VERSION@_la_SOURCES_DIST) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/build-aux/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POTI_CFLAGS = @POTI_CFLAGS@ POTI_LIBS = @POTI_LIBS@ PROG_DATE = @PROG_DATE@ PROG_STAT = @PROG_STAT@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_COI_CPPFLAGS = @STARPU_COI_CPPFLAGS@ STARPU_COI_LDFLAGS = @STARPU_COI_LDFLAGS@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LEVELDB_LDFLAGS = @STARPU_LEVELDB_LDFLAGS@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RCCE_CFLAGS = @STARPU_RCCE_CFLAGS@ STARPU_RCCE_CPPFLAGS = @STARPU_RCCE_CPPFLAGS@ STARPU_RCCE_LDFLAGS = @STARPU_RCCE_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SCIF_CPPFLAGS = @STARPU_SCIF_CPPFLAGS@ STARPU_SCIF_LDFLAGS = @STARPU_SCIF_LDFLAGS@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SC_HYPERVISOR_DEBUG = @STARPU_SC_HYPERVISOR_DEBUG@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ mpifort_path = @mpifort_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ smpirun_path = @smpirun_path@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = CLEANFILES = *.gcno *.gcda *.linkinfo EXTRA_DIST = dolib.c ldflags = $(am__append_1) libstarpu_so_version = $(LIBSTARPU_INTERFACE_CURRENT):$(LIBSTARPU_INTERFACE_REVISION):$(LIBSTARPU_INTERFACE_AGE) @STARPU_HAVE_WINDOWS_TRUE@LC_MESSAGES = C lib_LTLIBRARIES = libstarpu-@STARPU_EFFECTIVE_VERSION@.la libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS = -I$(top_srcdir)/include/ -DBUILDING_STARPU $(GLOBAL_AM_CFLAGS) $(HWLOC_CFLAGS) $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(FXT_CFLAGS) $(STARPU_COI_CPPFLAGS) $(STARPU_SCIF_CPPFLAGS) $(STARPU_RCCE_CFLAGS) $(STARPU_RCCE_CPPFLAGS) -DSTARPU_DATADIR='"$(datadir)"' libstarpu_@STARPU_EFFECTIVE_VERSION@_la_LIBADD = -lm $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) $(LIBSTARPU_LDFLAGS) libstarpu_@STARPU_EFFECTIVE_VERSION@_la_LDFLAGS = $(ldflags) \ $(FXT_LDFLAGS) -no-undefined -version-info \ $(libstarpu_so_version) $(am__append_2) noinst_HEADERS = \ core/dependencies/data_concurrency.h \ core/dependencies/cg.h \ core/dependencies/tags.h \ core/dependencies/implicit_data_deps.h \ core/disk.h \ core/disk_ops/unistd/disk_unistd_global.h \ core/progress_hook.h \ core/sched_policy.h \ core/sched_ctx.h \ core/sched_ctx_list.h \ core/perfmodel/perfmodel.h \ core/perfmodel/regression.h \ core/jobs.h \ core/task.h \ core/workers.h \ core/topology.h \ core/debug.h \ core/errorcheck.h \ core/combined_workers.h \ core/simgrid.h \ core/task_bundle.h \ core/detect_combined_workers.h \ sched_policies/helper_mct.h \ sched_policies/fifo_queues.h \ datawizard/footprint.h \ datawizard/datawizard.h \ datawizard/data_request.h \ datawizard/filters.h \ datawizard/write_back.h \ datawizard/datastats.h \ datawizard/malloc.h \ datawizard/memstats.h \ datawizard/memory_manager.h \ datawizard/memalloc.h \ datawizard/copy_driver.h \ datawizard/coherency.h \ datawizard/sort_data_handles.h \ datawizard/memory_nodes.h \ datawizard/interfaces/data_interface.h \ common/barrier.h \ common/timing.h \ common/list.h \ common/rwlock.h \ common/starpu_spinlock.h \ common/fxt.h \ common/utils.h \ common/thread.h \ common/barrier.h \ common/uthash.h \ common/barrier_counter.h \ common/graph.h \ drivers/driver_common/driver_common.h \ drivers/mp_common/mp_common.h \ drivers/mp_common/source_common.h \ drivers/mp_common/sink_common.h \ drivers/cpu/driver_cpu.h \ drivers/cuda/driver_cuda.h \ drivers/opencl/driver_opencl.h \ drivers/opencl/driver_opencl_utils.h \ debug/starpu_debug_helpers.h \ drivers/mic/driver_mic_common.h \ drivers/mic/driver_mic_source.h \ drivers/mic/driver_mic_sink.h \ drivers/scc/driver_scc_common.h \ drivers/scc/driver_scc_source.h \ drivers/scc/driver_scc_sink.h \ drivers/disk/driver_disk.h \ debug/traces/starpu_fxt.h \ profiling/bound.h \ profiling/profiling.h \ util/openmp_runtime_support.h \ util/starpu_task_insert_utils.h \ util/starpu_data_cpy.h \ starpu_parameters.h \ top/starpu_top_message_queue.h \ top/starpu_top_connection.h \ top/starpu_top_core.h \ sched_policies/prio_deque.h \ sched_policies/sched_component.h libstarpu_@STARPU_EFFECTIVE_VERSION@_la_SOURCES = common/barrier.c \ common/barrier_counter.c common/bitmap.c common/hash.c \ common/rwlock.c common/starpu_spinlock.c common/timing.c \ common/fxt.c common/utils.c common/thread.c common/graph.c \ core/jobs.c core/task.c core/task_bundle.c core/tree.c \ core/workers.c core/combined_workers.c core/topology.c \ core/disk.c core/debug.c core/errorcheck.c \ core/progress_hook.c core/dependencies/cg.c \ core/dependencies/dependencies.c \ core/dependencies/implicit_data_deps.c \ core/dependencies/tags.c core/dependencies/task_deps.c \ core/dependencies/data_concurrency.c \ core/dependencies/data_arbiter_concurrency.c \ core/disk_ops/disk_stdio.c core/disk_ops/disk_unistd.c \ core/disk_ops/unistd/disk_unistd_global.c \ core/perfmodel/perfmodel_history.c \ core/perfmodel/perfmodel_bus.c core/perfmodel/perfmodel.c \ core/perfmodel/perfmodel_print.c \ core/perfmodel/perfmodel_nan.c core/perfmodel/regression.c \ core/sched_policy.c core/simgrid.c core/sched_ctx.c \ core/sched_ctx_list.c core/parallel_task.c \ core/detect_combined_workers.c \ sched_policies/eager_central_policy.c \ sched_policies/eager_central_priority_policy.c \ sched_policies/work_stealing_policy.c \ sched_policies/locality_work_stealing_policy.c \ sched_policies/deque_modeling_policy_data_aware.c \ sched_policies/random_policy.c sched_policies/fifo_queues.c \ sched_policies/parallel_heft.c sched_policies/parallel_eager.c \ sched_policies/graph_test_policy.c \ drivers/driver_common/driver_common.c \ drivers/disk/driver_disk.c datawizard/memory_nodes.c \ datawizard/write_back.c datawizard/coherency.c \ datawizard/data_request.c datawizard/datawizard.c \ datawizard/copy_driver.c datawizard/filters.c \ datawizard/sort_data_handles.c datawizard/malloc.c \ datawizard/memory_manager.c datawizard/memalloc.c \ datawizard/memstats.c datawizard/footprint.c \ datawizard/datastats.c datawizard/user_interactions.c \ datawizard/reduction.c datawizard/interfaces/data_interface.c \ datawizard/interfaces/bcsr_interface.c \ datawizard/interfaces/coo_interface.c \ datawizard/interfaces/csr_interface.c \ datawizard/interfaces/matrix_filters.c \ datawizard/interfaces/matrix_interface.c \ datawizard/interfaces/block_filters.c \ datawizard/interfaces/block_interface.c \ datawizard/interfaces/vector_interface.c \ datawizard/interfaces/bcsr_filters.c \ datawizard/interfaces/csr_filters.c \ datawizard/interfaces/vector_filters.c \ datawizard/interfaces/variable_interface.c \ datawizard/interfaces/void_interface.c \ datawizard/interfaces/multiformat_interface.c \ util/execute_on_all.c util/starpu_create_sync_task.c \ util/file.c util/fstarpu.c util/misc.c \ util/openmp_runtime_support.c \ util/openmp_runtime_support_environment.c \ util/openmp_runtime_support_omp_api.c util/starpu_data_cpy.c \ util/starpu_task_insert.c util/starpu_task_insert_utils.c \ debug/traces/starpu_fxt.c debug/traces/starpu_fxt_mpi.c \ debug/traces/starpu_fxt_dag.c debug/traces/starpu_paje.c \ debug/traces/anim.c debug/latency.c debug/structures_size.c \ profiling/profiling.c profiling/bound.c \ profiling/profiling_helpers.c top/starpu_top.c \ top/starpu_top_task.c top/starpu_top_message_queue.c \ top/starpu_top_connection.c worker_collection/worker_list.c \ worker_collection/worker_tree.c \ sched_policies/component_worker.c \ sched_policies/component_sched.c \ sched_policies/component_fifo.c sched_policies/prio_deque.c \ sched_policies/helper_mct.c sched_policies/component_prio.c \ sched_policies/component_random.c \ sched_policies/component_eager.c \ sched_policies/component_eager_calibration.c \ sched_policies/component_mct.c sched_policies/component_heft.c \ sched_policies/component_best_implementation.c \ sched_policies/component_perfmodel_select.c \ sched_policies/component_composed.c \ sched_policies/modular_eager.c \ sched_policies/modular_eager_prefetching.c \ sched_policies/modular_prio.c \ sched_policies/modular_prio_prefetching.c \ sched_policies/modular_random.c \ sched_policies/modular_random_prefetching.c \ sched_policies/modular_heft.c \ sched_policies/modular_heft_prio.c \ sched_policies/modular_heft2.c $(am__append_3) $(am__append_4) \ $(am__append_5) $(am__append_6) drivers/cuda/starpu_cublas.c \ drivers/cuda/starpu_cusparse.c $(am__append_7) $(am__append_8) \ $(am__append_9) $(am__append_10) $(am__append_11) \ $(am__append_12) all: all-recursive .SUFFIXES: .SUFFIXES: .c .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libstarpu-@STARPU_EFFECTIVE_VERSION@.la: $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_DEPENDENCIES) $(EXTRA_libstarpu_@STARPU_EFFECTIVE_VERSION@_la_DEPENDENCIES) $(AM_V_CXXLD)$(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_LINK) -rpath $(libdir) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-anim.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier_counter.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_filters.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_interface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bitmap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_filters.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_interface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-cg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coherency.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-combined_workers.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_best_implementation.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_composed.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager_calibration.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_fifo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_heft.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_mct.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_perfmodel_select.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_prio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_random.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_sched.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_worker.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coo_interface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-copy_driver.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_filters.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_interface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_arbiter_concurrency.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_concurrency.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_interface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_request.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datastats.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datawizard.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-debug.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-dependencies.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-deque_modeling_policy_data_aware.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-detect_combined_workers.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_leveldb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_stdio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_global.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_o_direct.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_common.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cpu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cuda.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_disk.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_common.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_sink.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_source.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_utils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl_utils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_common.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_sink.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_source.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_utils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_priority_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-errorcheck.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-execute_on_all.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fifo_queues.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-filters.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-footprint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fstarpu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fxt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph_test_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hash.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-helper_mct.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-implicit_data_deps.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-jobs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-latency.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-locality_work_stealing_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-malloc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_filters.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_interface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memalloc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_manager.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_nodes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memstats.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-misc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager_prefetching.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft_prio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio_prefetching.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random_prefetching.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-mp_common.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-multiformat_interface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_environment.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_omp_api.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_eager.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_heft.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_task.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_bus.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_history.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_nan.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_print.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-prio_deque.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling_helpers.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-progress_hook.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-random_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-reduction.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-regression.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-rwlock.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx_list.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sink_common.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sort_data_handles.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-source_common.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_create_sync_task.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cublas.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cusparse.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_data_cpy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_dag.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_mpi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_paje.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_spinlock.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert_utils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_connection.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_message_queue.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_task.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-structures_size.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tags.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_bundle.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_deps.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-thread.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-timing.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-topology.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tree.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-user_interactions.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-utils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-variable_interface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_filters.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_interface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-void_interface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-work_stealing_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_list.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_tree.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-workers.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-write_back.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier.lo: common/barrier.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier.lo `test -f 'common/barrier.c' || echo '$(srcdir)/'`common/barrier.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/barrier.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier.lo `test -f 'common/barrier.c' || echo '$(srcdir)/'`common/barrier.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier_counter.lo: common/barrier_counter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier_counter.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier_counter.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier_counter.lo `test -f 'common/barrier_counter.c' || echo '$(srcdir)/'`common/barrier_counter.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier_counter.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier_counter.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/barrier_counter.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier_counter.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier_counter.lo `test -f 'common/barrier_counter.c' || echo '$(srcdir)/'`common/barrier_counter.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bitmap.lo: common/bitmap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bitmap.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bitmap.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bitmap.lo `test -f 'common/bitmap.c' || echo '$(srcdir)/'`common/bitmap.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bitmap.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bitmap.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/bitmap.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bitmap.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bitmap.lo `test -f 'common/bitmap.c' || echo '$(srcdir)/'`common/bitmap.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hash.lo: common/hash.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hash.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hash.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hash.lo `test -f 'common/hash.c' || echo '$(srcdir)/'`common/hash.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hash.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hash.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/hash.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hash.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hash.lo `test -f 'common/hash.c' || echo '$(srcdir)/'`common/hash.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-rwlock.lo: common/rwlock.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-rwlock.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-rwlock.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-rwlock.lo `test -f 'common/rwlock.c' || echo '$(srcdir)/'`common/rwlock.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-rwlock.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-rwlock.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/rwlock.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-rwlock.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-rwlock.lo `test -f 'common/rwlock.c' || echo '$(srcdir)/'`common/rwlock.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_spinlock.lo: common/starpu_spinlock.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_spinlock.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_spinlock.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_spinlock.lo `test -f 'common/starpu_spinlock.c' || echo '$(srcdir)/'`common/starpu_spinlock.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_spinlock.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_spinlock.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/starpu_spinlock.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_spinlock.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_spinlock.lo `test -f 'common/starpu_spinlock.c' || echo '$(srcdir)/'`common/starpu_spinlock.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-timing.lo: common/timing.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-timing.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-timing.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-timing.lo `test -f 'common/timing.c' || echo '$(srcdir)/'`common/timing.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-timing.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-timing.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/timing.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-timing.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-timing.lo `test -f 'common/timing.c' || echo '$(srcdir)/'`common/timing.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fxt.lo: common/fxt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fxt.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fxt.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fxt.lo `test -f 'common/fxt.c' || echo '$(srcdir)/'`common/fxt.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fxt.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fxt.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/fxt.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fxt.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fxt.lo `test -f 'common/fxt.c' || echo '$(srcdir)/'`common/fxt.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-utils.lo: common/utils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-utils.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-utils.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-utils.lo `test -f 'common/utils.c' || echo '$(srcdir)/'`common/utils.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-utils.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-utils.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/utils.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-utils.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-utils.lo `test -f 'common/utils.c' || echo '$(srcdir)/'`common/utils.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-thread.lo: common/thread.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-thread.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-thread.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-thread.lo `test -f 'common/thread.c' || echo '$(srcdir)/'`common/thread.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-thread.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-thread.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/thread.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-thread.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-thread.lo `test -f 'common/thread.c' || echo '$(srcdir)/'`common/thread.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph.lo: common/graph.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph.lo `test -f 'common/graph.c' || echo '$(srcdir)/'`common/graph.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/graph.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph.lo `test -f 'common/graph.c' || echo '$(srcdir)/'`common/graph.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-jobs.lo: core/jobs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-jobs.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-jobs.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-jobs.lo `test -f 'core/jobs.c' || echo '$(srcdir)/'`core/jobs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-jobs.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-jobs.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/jobs.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-jobs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-jobs.lo `test -f 'core/jobs.c' || echo '$(srcdir)/'`core/jobs.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task.lo: core/task.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task.lo `test -f 'core/task.c' || echo '$(srcdir)/'`core/task.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/task.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task.lo `test -f 'core/task.c' || echo '$(srcdir)/'`core/task.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_bundle.lo: core/task_bundle.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_bundle.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_bundle.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_bundle.lo `test -f 'core/task_bundle.c' || echo '$(srcdir)/'`core/task_bundle.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_bundle.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_bundle.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/task_bundle.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_bundle.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_bundle.lo `test -f 'core/task_bundle.c' || echo '$(srcdir)/'`core/task_bundle.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tree.lo: core/tree.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tree.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tree.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tree.lo `test -f 'core/tree.c' || echo '$(srcdir)/'`core/tree.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tree.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tree.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/tree.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tree.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tree.lo `test -f 'core/tree.c' || echo '$(srcdir)/'`core/tree.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-workers.lo: core/workers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-workers.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-workers.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-workers.lo `test -f 'core/workers.c' || echo '$(srcdir)/'`core/workers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-workers.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-workers.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/workers.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-workers.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-workers.lo `test -f 'core/workers.c' || echo '$(srcdir)/'`core/workers.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-combined_workers.lo: core/combined_workers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-combined_workers.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-combined_workers.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-combined_workers.lo `test -f 'core/combined_workers.c' || echo '$(srcdir)/'`core/combined_workers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-combined_workers.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-combined_workers.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/combined_workers.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-combined_workers.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-combined_workers.lo `test -f 'core/combined_workers.c' || echo '$(srcdir)/'`core/combined_workers.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-topology.lo: core/topology.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-topology.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-topology.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-topology.lo `test -f 'core/topology.c' || echo '$(srcdir)/'`core/topology.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-topology.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-topology.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/topology.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-topology.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-topology.lo `test -f 'core/topology.c' || echo '$(srcdir)/'`core/topology.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk.lo: core/disk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk.lo `test -f 'core/disk.c' || echo '$(srcdir)/'`core/disk.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/disk.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk.lo `test -f 'core/disk.c' || echo '$(srcdir)/'`core/disk.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-debug.lo: core/debug.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-debug.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-debug.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-debug.lo `test -f 'core/debug.c' || echo '$(srcdir)/'`core/debug.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-debug.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-debug.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/debug.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-debug.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-debug.lo `test -f 'core/debug.c' || echo '$(srcdir)/'`core/debug.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-errorcheck.lo: core/errorcheck.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-errorcheck.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-errorcheck.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-errorcheck.lo `test -f 'core/errorcheck.c' || echo '$(srcdir)/'`core/errorcheck.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-errorcheck.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-errorcheck.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/errorcheck.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-errorcheck.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-errorcheck.lo `test -f 'core/errorcheck.c' || echo '$(srcdir)/'`core/errorcheck.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-progress_hook.lo: core/progress_hook.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-progress_hook.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-progress_hook.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-progress_hook.lo `test -f 'core/progress_hook.c' || echo '$(srcdir)/'`core/progress_hook.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-progress_hook.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-progress_hook.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/progress_hook.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-progress_hook.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-progress_hook.lo `test -f 'core/progress_hook.c' || echo '$(srcdir)/'`core/progress_hook.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-cg.lo: core/dependencies/cg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-cg.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-cg.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-cg.lo `test -f 'core/dependencies/cg.c' || echo '$(srcdir)/'`core/dependencies/cg.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-cg.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-cg.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/dependencies/cg.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-cg.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-cg.lo `test -f 'core/dependencies/cg.c' || echo '$(srcdir)/'`core/dependencies/cg.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-dependencies.lo: core/dependencies/dependencies.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-dependencies.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-dependencies.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-dependencies.lo `test -f 'core/dependencies/dependencies.c' || echo '$(srcdir)/'`core/dependencies/dependencies.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-dependencies.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-dependencies.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/dependencies/dependencies.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-dependencies.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-dependencies.lo `test -f 'core/dependencies/dependencies.c' || echo '$(srcdir)/'`core/dependencies/dependencies.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-implicit_data_deps.lo: core/dependencies/implicit_data_deps.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-implicit_data_deps.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-implicit_data_deps.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-implicit_data_deps.lo `test -f 'core/dependencies/implicit_data_deps.c' || echo '$(srcdir)/'`core/dependencies/implicit_data_deps.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-implicit_data_deps.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-implicit_data_deps.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/dependencies/implicit_data_deps.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-implicit_data_deps.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-implicit_data_deps.lo `test -f 'core/dependencies/implicit_data_deps.c' || echo '$(srcdir)/'`core/dependencies/implicit_data_deps.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tags.lo: core/dependencies/tags.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tags.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tags.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tags.lo `test -f 'core/dependencies/tags.c' || echo '$(srcdir)/'`core/dependencies/tags.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tags.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tags.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/dependencies/tags.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tags.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tags.lo `test -f 'core/dependencies/tags.c' || echo '$(srcdir)/'`core/dependencies/tags.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_deps.lo: core/dependencies/task_deps.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_deps.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_deps.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_deps.lo `test -f 'core/dependencies/task_deps.c' || echo '$(srcdir)/'`core/dependencies/task_deps.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_deps.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_deps.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/dependencies/task_deps.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_deps.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_deps.lo `test -f 'core/dependencies/task_deps.c' || echo '$(srcdir)/'`core/dependencies/task_deps.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_concurrency.lo: core/dependencies/data_concurrency.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_concurrency.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_concurrency.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_concurrency.lo `test -f 'core/dependencies/data_concurrency.c' || echo '$(srcdir)/'`core/dependencies/data_concurrency.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_concurrency.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_concurrency.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/dependencies/data_concurrency.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_concurrency.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_concurrency.lo `test -f 'core/dependencies/data_concurrency.c' || echo '$(srcdir)/'`core/dependencies/data_concurrency.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_arbiter_concurrency.lo: core/dependencies/data_arbiter_concurrency.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_arbiter_concurrency.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_arbiter_concurrency.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_arbiter_concurrency.lo `test -f 'core/dependencies/data_arbiter_concurrency.c' || echo '$(srcdir)/'`core/dependencies/data_arbiter_concurrency.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_arbiter_concurrency.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_arbiter_concurrency.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/dependencies/data_arbiter_concurrency.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_arbiter_concurrency.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_arbiter_concurrency.lo `test -f 'core/dependencies/data_arbiter_concurrency.c' || echo '$(srcdir)/'`core/dependencies/data_arbiter_concurrency.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_stdio.lo: core/disk_ops/disk_stdio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_stdio.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_stdio.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_stdio.lo `test -f 'core/disk_ops/disk_stdio.c' || echo '$(srcdir)/'`core/disk_ops/disk_stdio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_stdio.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_stdio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/disk_ops/disk_stdio.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_stdio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_stdio.lo `test -f 'core/disk_ops/disk_stdio.c' || echo '$(srcdir)/'`core/disk_ops/disk_stdio.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd.lo: core/disk_ops/disk_unistd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd.lo `test -f 'core/disk_ops/disk_unistd.c' || echo '$(srcdir)/'`core/disk_ops/disk_unistd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/disk_ops/disk_unistd.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd.lo `test -f 'core/disk_ops/disk_unistd.c' || echo '$(srcdir)/'`core/disk_ops/disk_unistd.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_global.lo: core/disk_ops/unistd/disk_unistd_global.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_global.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_global.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_global.lo `test -f 'core/disk_ops/unistd/disk_unistd_global.c' || echo '$(srcdir)/'`core/disk_ops/unistd/disk_unistd_global.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_global.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_global.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/disk_ops/unistd/disk_unistd_global.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_global.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_global.lo `test -f 'core/disk_ops/unistd/disk_unistd_global.c' || echo '$(srcdir)/'`core/disk_ops/unistd/disk_unistd_global.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_history.lo: core/perfmodel/perfmodel_history.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_history.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_history.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_history.lo `test -f 'core/perfmodel/perfmodel_history.c' || echo '$(srcdir)/'`core/perfmodel/perfmodel_history.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_history.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_history.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/perfmodel/perfmodel_history.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_history.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_history.lo `test -f 'core/perfmodel/perfmodel_history.c' || echo '$(srcdir)/'`core/perfmodel/perfmodel_history.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_bus.lo: core/perfmodel/perfmodel_bus.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_bus.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_bus.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_bus.lo `test -f 'core/perfmodel/perfmodel_bus.c' || echo '$(srcdir)/'`core/perfmodel/perfmodel_bus.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_bus.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_bus.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/perfmodel/perfmodel_bus.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_bus.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_bus.lo `test -f 'core/perfmodel/perfmodel_bus.c' || echo '$(srcdir)/'`core/perfmodel/perfmodel_bus.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel.lo: core/perfmodel/perfmodel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel.lo `test -f 'core/perfmodel/perfmodel.c' || echo '$(srcdir)/'`core/perfmodel/perfmodel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/perfmodel/perfmodel.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel.lo `test -f 'core/perfmodel/perfmodel.c' || echo '$(srcdir)/'`core/perfmodel/perfmodel.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_print.lo: core/perfmodel/perfmodel_print.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_print.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_print.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_print.lo `test -f 'core/perfmodel/perfmodel_print.c' || echo '$(srcdir)/'`core/perfmodel/perfmodel_print.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_print.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_print.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/perfmodel/perfmodel_print.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_print.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_print.lo `test -f 'core/perfmodel/perfmodel_print.c' || echo '$(srcdir)/'`core/perfmodel/perfmodel_print.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_nan.lo: core/perfmodel/perfmodel_nan.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_nan.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_nan.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_nan.lo `test -f 'core/perfmodel/perfmodel_nan.c' || echo '$(srcdir)/'`core/perfmodel/perfmodel_nan.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_nan.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_nan.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/perfmodel/perfmodel_nan.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_nan.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_nan.lo `test -f 'core/perfmodel/perfmodel_nan.c' || echo '$(srcdir)/'`core/perfmodel/perfmodel_nan.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-regression.lo: core/perfmodel/regression.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-regression.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-regression.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-regression.lo `test -f 'core/perfmodel/regression.c' || echo '$(srcdir)/'`core/perfmodel/regression.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-regression.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-regression.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/perfmodel/regression.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-regression.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-regression.lo `test -f 'core/perfmodel/regression.c' || echo '$(srcdir)/'`core/perfmodel/regression.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_policy.lo: core/sched_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_policy.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_policy.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_policy.lo `test -f 'core/sched_policy.c' || echo '$(srcdir)/'`core/sched_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_policy.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/sched_policy.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_policy.lo `test -f 'core/sched_policy.c' || echo '$(srcdir)/'`core/sched_policy.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid.lo: core/simgrid.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid.lo `test -f 'core/simgrid.c' || echo '$(srcdir)/'`core/simgrid.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/simgrid.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid.lo `test -f 'core/simgrid.c' || echo '$(srcdir)/'`core/simgrid.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx.lo: core/sched_ctx.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx.lo `test -f 'core/sched_ctx.c' || echo '$(srcdir)/'`core/sched_ctx.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/sched_ctx.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx.lo `test -f 'core/sched_ctx.c' || echo '$(srcdir)/'`core/sched_ctx.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx_list.lo: core/sched_ctx_list.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx_list.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx_list.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx_list.lo `test -f 'core/sched_ctx_list.c' || echo '$(srcdir)/'`core/sched_ctx_list.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx_list.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx_list.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/sched_ctx_list.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx_list.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx_list.lo `test -f 'core/sched_ctx_list.c' || echo '$(srcdir)/'`core/sched_ctx_list.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_task.lo: core/parallel_task.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_task.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_task.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_task.lo `test -f 'core/parallel_task.c' || echo '$(srcdir)/'`core/parallel_task.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_task.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_task.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/parallel_task.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_task.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_task.lo `test -f 'core/parallel_task.c' || echo '$(srcdir)/'`core/parallel_task.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-detect_combined_workers.lo: core/detect_combined_workers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-detect_combined_workers.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-detect_combined_workers.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-detect_combined_workers.lo `test -f 'core/detect_combined_workers.c' || echo '$(srcdir)/'`core/detect_combined_workers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-detect_combined_workers.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-detect_combined_workers.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/detect_combined_workers.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-detect_combined_workers.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-detect_combined_workers.lo `test -f 'core/detect_combined_workers.c' || echo '$(srcdir)/'`core/detect_combined_workers.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_policy.lo: sched_policies/eager_central_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_policy.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_policy.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_policy.lo `test -f 'sched_policies/eager_central_policy.c' || echo '$(srcdir)/'`sched_policies/eager_central_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_policy.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/eager_central_policy.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_policy.lo `test -f 'sched_policies/eager_central_policy.c' || echo '$(srcdir)/'`sched_policies/eager_central_policy.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_priority_policy.lo: sched_policies/eager_central_priority_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_priority_policy.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_priority_policy.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_priority_policy.lo `test -f 'sched_policies/eager_central_priority_policy.c' || echo '$(srcdir)/'`sched_policies/eager_central_priority_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_priority_policy.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_priority_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/eager_central_priority_policy.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_priority_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_priority_policy.lo `test -f 'sched_policies/eager_central_priority_policy.c' || echo '$(srcdir)/'`sched_policies/eager_central_priority_policy.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-work_stealing_policy.lo: sched_policies/work_stealing_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-work_stealing_policy.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-work_stealing_policy.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-work_stealing_policy.lo `test -f 'sched_policies/work_stealing_policy.c' || echo '$(srcdir)/'`sched_policies/work_stealing_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-work_stealing_policy.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-work_stealing_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/work_stealing_policy.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-work_stealing_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-work_stealing_policy.lo `test -f 'sched_policies/work_stealing_policy.c' || echo '$(srcdir)/'`sched_policies/work_stealing_policy.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-locality_work_stealing_policy.lo: sched_policies/locality_work_stealing_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-locality_work_stealing_policy.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-locality_work_stealing_policy.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-locality_work_stealing_policy.lo `test -f 'sched_policies/locality_work_stealing_policy.c' || echo '$(srcdir)/'`sched_policies/locality_work_stealing_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-locality_work_stealing_policy.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-locality_work_stealing_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/locality_work_stealing_policy.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-locality_work_stealing_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-locality_work_stealing_policy.lo `test -f 'sched_policies/locality_work_stealing_policy.c' || echo '$(srcdir)/'`sched_policies/locality_work_stealing_policy.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-deque_modeling_policy_data_aware.lo: sched_policies/deque_modeling_policy_data_aware.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-deque_modeling_policy_data_aware.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-deque_modeling_policy_data_aware.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-deque_modeling_policy_data_aware.lo `test -f 'sched_policies/deque_modeling_policy_data_aware.c' || echo '$(srcdir)/'`sched_policies/deque_modeling_policy_data_aware.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-deque_modeling_policy_data_aware.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-deque_modeling_policy_data_aware.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/deque_modeling_policy_data_aware.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-deque_modeling_policy_data_aware.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-deque_modeling_policy_data_aware.lo `test -f 'sched_policies/deque_modeling_policy_data_aware.c' || echo '$(srcdir)/'`sched_policies/deque_modeling_policy_data_aware.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-random_policy.lo: sched_policies/random_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-random_policy.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-random_policy.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-random_policy.lo `test -f 'sched_policies/random_policy.c' || echo '$(srcdir)/'`sched_policies/random_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-random_policy.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-random_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/random_policy.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-random_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-random_policy.lo `test -f 'sched_policies/random_policy.c' || echo '$(srcdir)/'`sched_policies/random_policy.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fifo_queues.lo: sched_policies/fifo_queues.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fifo_queues.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fifo_queues.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fifo_queues.lo `test -f 'sched_policies/fifo_queues.c' || echo '$(srcdir)/'`sched_policies/fifo_queues.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fifo_queues.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fifo_queues.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/fifo_queues.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fifo_queues.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fifo_queues.lo `test -f 'sched_policies/fifo_queues.c' || echo '$(srcdir)/'`sched_policies/fifo_queues.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_heft.lo: sched_policies/parallel_heft.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_heft.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_heft.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_heft.lo `test -f 'sched_policies/parallel_heft.c' || echo '$(srcdir)/'`sched_policies/parallel_heft.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_heft.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_heft.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/parallel_heft.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_heft.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_heft.lo `test -f 'sched_policies/parallel_heft.c' || echo '$(srcdir)/'`sched_policies/parallel_heft.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_eager.lo: sched_policies/parallel_eager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_eager.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_eager.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_eager.lo `test -f 'sched_policies/parallel_eager.c' || echo '$(srcdir)/'`sched_policies/parallel_eager.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_eager.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_eager.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/parallel_eager.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_eager.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_eager.lo `test -f 'sched_policies/parallel_eager.c' || echo '$(srcdir)/'`sched_policies/parallel_eager.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph_test_policy.lo: sched_policies/graph_test_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph_test_policy.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph_test_policy.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph_test_policy.lo `test -f 'sched_policies/graph_test_policy.c' || echo '$(srcdir)/'`sched_policies/graph_test_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph_test_policy.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph_test_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/graph_test_policy.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph_test_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph_test_policy.lo `test -f 'sched_policies/graph_test_policy.c' || echo '$(srcdir)/'`sched_policies/graph_test_policy.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_common.lo: drivers/driver_common/driver_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_common.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_common.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_common.lo `test -f 'drivers/driver_common/driver_common.c' || echo '$(srcdir)/'`drivers/driver_common/driver_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_common.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_common.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drivers/driver_common/driver_common.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_common.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_common.lo `test -f 'drivers/driver_common/driver_common.c' || echo '$(srcdir)/'`drivers/driver_common/driver_common.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_disk.lo: drivers/disk/driver_disk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_disk.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_disk.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_disk.lo `test -f 'drivers/disk/driver_disk.c' || echo '$(srcdir)/'`drivers/disk/driver_disk.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_disk.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_disk.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drivers/disk/driver_disk.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_disk.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_disk.lo `test -f 'drivers/disk/driver_disk.c' || echo '$(srcdir)/'`drivers/disk/driver_disk.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_nodes.lo: datawizard/memory_nodes.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_nodes.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_nodes.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_nodes.lo `test -f 'datawizard/memory_nodes.c' || echo '$(srcdir)/'`datawizard/memory_nodes.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_nodes.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_nodes.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/memory_nodes.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_nodes.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_nodes.lo `test -f 'datawizard/memory_nodes.c' || echo '$(srcdir)/'`datawizard/memory_nodes.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-write_back.lo: datawizard/write_back.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-write_back.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-write_back.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-write_back.lo `test -f 'datawizard/write_back.c' || echo '$(srcdir)/'`datawizard/write_back.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-write_back.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-write_back.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/write_back.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-write_back.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-write_back.lo `test -f 'datawizard/write_back.c' || echo '$(srcdir)/'`datawizard/write_back.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coherency.lo: datawizard/coherency.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coherency.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coherency.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coherency.lo `test -f 'datawizard/coherency.c' || echo '$(srcdir)/'`datawizard/coherency.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coherency.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coherency.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/coherency.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coherency.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coherency.lo `test -f 'datawizard/coherency.c' || echo '$(srcdir)/'`datawizard/coherency.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_request.lo: datawizard/data_request.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_request.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_request.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_request.lo `test -f 'datawizard/data_request.c' || echo '$(srcdir)/'`datawizard/data_request.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_request.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_request.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/data_request.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_request.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_request.lo `test -f 'datawizard/data_request.c' || echo '$(srcdir)/'`datawizard/data_request.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datawizard.lo: datawizard/datawizard.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datawizard.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datawizard.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datawizard.lo `test -f 'datawizard/datawizard.c' || echo '$(srcdir)/'`datawizard/datawizard.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datawizard.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datawizard.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/datawizard.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datawizard.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datawizard.lo `test -f 'datawizard/datawizard.c' || echo '$(srcdir)/'`datawizard/datawizard.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-copy_driver.lo: datawizard/copy_driver.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-copy_driver.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-copy_driver.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-copy_driver.lo `test -f 'datawizard/copy_driver.c' || echo '$(srcdir)/'`datawizard/copy_driver.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-copy_driver.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-copy_driver.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/copy_driver.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-copy_driver.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-copy_driver.lo `test -f 'datawizard/copy_driver.c' || echo '$(srcdir)/'`datawizard/copy_driver.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-filters.lo: datawizard/filters.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-filters.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-filters.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-filters.lo `test -f 'datawizard/filters.c' || echo '$(srcdir)/'`datawizard/filters.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-filters.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-filters.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/filters.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-filters.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-filters.lo `test -f 'datawizard/filters.c' || echo '$(srcdir)/'`datawizard/filters.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sort_data_handles.lo: datawizard/sort_data_handles.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sort_data_handles.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sort_data_handles.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sort_data_handles.lo `test -f 'datawizard/sort_data_handles.c' || echo '$(srcdir)/'`datawizard/sort_data_handles.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sort_data_handles.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sort_data_handles.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/sort_data_handles.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sort_data_handles.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sort_data_handles.lo `test -f 'datawizard/sort_data_handles.c' || echo '$(srcdir)/'`datawizard/sort_data_handles.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-malloc.lo: datawizard/malloc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-malloc.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-malloc.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-malloc.lo `test -f 'datawizard/malloc.c' || echo '$(srcdir)/'`datawizard/malloc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-malloc.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-malloc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/malloc.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-malloc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-malloc.lo `test -f 'datawizard/malloc.c' || echo '$(srcdir)/'`datawizard/malloc.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_manager.lo: datawizard/memory_manager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_manager.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_manager.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_manager.lo `test -f 'datawizard/memory_manager.c' || echo '$(srcdir)/'`datawizard/memory_manager.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_manager.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_manager.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/memory_manager.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_manager.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_manager.lo `test -f 'datawizard/memory_manager.c' || echo '$(srcdir)/'`datawizard/memory_manager.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memalloc.lo: datawizard/memalloc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memalloc.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memalloc.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memalloc.lo `test -f 'datawizard/memalloc.c' || echo '$(srcdir)/'`datawizard/memalloc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memalloc.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memalloc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/memalloc.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memalloc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memalloc.lo `test -f 'datawizard/memalloc.c' || echo '$(srcdir)/'`datawizard/memalloc.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memstats.lo: datawizard/memstats.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memstats.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memstats.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memstats.lo `test -f 'datawizard/memstats.c' || echo '$(srcdir)/'`datawizard/memstats.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memstats.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memstats.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/memstats.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memstats.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memstats.lo `test -f 'datawizard/memstats.c' || echo '$(srcdir)/'`datawizard/memstats.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-footprint.lo: datawizard/footprint.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-footprint.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-footprint.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-footprint.lo `test -f 'datawizard/footprint.c' || echo '$(srcdir)/'`datawizard/footprint.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-footprint.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-footprint.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/footprint.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-footprint.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-footprint.lo `test -f 'datawizard/footprint.c' || echo '$(srcdir)/'`datawizard/footprint.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datastats.lo: datawizard/datastats.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datastats.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datastats.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datastats.lo `test -f 'datawizard/datastats.c' || echo '$(srcdir)/'`datawizard/datastats.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datastats.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datastats.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/datastats.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datastats.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datastats.lo `test -f 'datawizard/datastats.c' || echo '$(srcdir)/'`datawizard/datastats.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-user_interactions.lo: datawizard/user_interactions.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-user_interactions.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-user_interactions.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-user_interactions.lo `test -f 'datawizard/user_interactions.c' || echo '$(srcdir)/'`datawizard/user_interactions.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-user_interactions.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-user_interactions.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/user_interactions.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-user_interactions.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-user_interactions.lo `test -f 'datawizard/user_interactions.c' || echo '$(srcdir)/'`datawizard/user_interactions.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-reduction.lo: datawizard/reduction.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-reduction.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-reduction.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-reduction.lo `test -f 'datawizard/reduction.c' || echo '$(srcdir)/'`datawizard/reduction.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-reduction.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-reduction.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/reduction.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-reduction.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-reduction.lo `test -f 'datawizard/reduction.c' || echo '$(srcdir)/'`datawizard/reduction.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_interface.lo: datawizard/interfaces/data_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_interface.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_interface.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_interface.lo `test -f 'datawizard/interfaces/data_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/data_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_interface.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_interface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/data_interface.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_interface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_interface.lo `test -f 'datawizard/interfaces/data_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/data_interface.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_interface.lo: datawizard/interfaces/bcsr_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_interface.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_interface.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_interface.lo `test -f 'datawizard/interfaces/bcsr_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/bcsr_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_interface.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_interface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/bcsr_interface.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_interface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_interface.lo `test -f 'datawizard/interfaces/bcsr_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/bcsr_interface.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coo_interface.lo: datawizard/interfaces/coo_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coo_interface.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coo_interface.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coo_interface.lo `test -f 'datawizard/interfaces/coo_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/coo_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coo_interface.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coo_interface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/coo_interface.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coo_interface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coo_interface.lo `test -f 'datawizard/interfaces/coo_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/coo_interface.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_interface.lo: datawizard/interfaces/csr_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_interface.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_interface.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_interface.lo `test -f 'datawizard/interfaces/csr_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/csr_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_interface.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_interface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/csr_interface.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_interface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_interface.lo `test -f 'datawizard/interfaces/csr_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/csr_interface.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_filters.lo: datawizard/interfaces/matrix_filters.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_filters.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_filters.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_filters.lo `test -f 'datawizard/interfaces/matrix_filters.c' || echo '$(srcdir)/'`datawizard/interfaces/matrix_filters.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_filters.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_filters.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/matrix_filters.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_filters.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_filters.lo `test -f 'datawizard/interfaces/matrix_filters.c' || echo '$(srcdir)/'`datawizard/interfaces/matrix_filters.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_interface.lo: datawizard/interfaces/matrix_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_interface.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_interface.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_interface.lo `test -f 'datawizard/interfaces/matrix_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/matrix_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_interface.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_interface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/matrix_interface.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_interface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_interface.lo `test -f 'datawizard/interfaces/matrix_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/matrix_interface.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_filters.lo: datawizard/interfaces/block_filters.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_filters.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_filters.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_filters.lo `test -f 'datawizard/interfaces/block_filters.c' || echo '$(srcdir)/'`datawizard/interfaces/block_filters.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_filters.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_filters.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/block_filters.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_filters.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_filters.lo `test -f 'datawizard/interfaces/block_filters.c' || echo '$(srcdir)/'`datawizard/interfaces/block_filters.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_interface.lo: datawizard/interfaces/block_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_interface.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_interface.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_interface.lo `test -f 'datawizard/interfaces/block_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/block_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_interface.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_interface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/block_interface.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_interface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_interface.lo `test -f 'datawizard/interfaces/block_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/block_interface.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_interface.lo: datawizard/interfaces/vector_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_interface.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_interface.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_interface.lo `test -f 'datawizard/interfaces/vector_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/vector_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_interface.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_interface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/vector_interface.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_interface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_interface.lo `test -f 'datawizard/interfaces/vector_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/vector_interface.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_filters.lo: datawizard/interfaces/bcsr_filters.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_filters.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_filters.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_filters.lo `test -f 'datawizard/interfaces/bcsr_filters.c' || echo '$(srcdir)/'`datawizard/interfaces/bcsr_filters.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_filters.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_filters.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/bcsr_filters.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_filters.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_filters.lo `test -f 'datawizard/interfaces/bcsr_filters.c' || echo '$(srcdir)/'`datawizard/interfaces/bcsr_filters.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_filters.lo: datawizard/interfaces/csr_filters.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_filters.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_filters.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_filters.lo `test -f 'datawizard/interfaces/csr_filters.c' || echo '$(srcdir)/'`datawizard/interfaces/csr_filters.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_filters.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_filters.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/csr_filters.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_filters.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_filters.lo `test -f 'datawizard/interfaces/csr_filters.c' || echo '$(srcdir)/'`datawizard/interfaces/csr_filters.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_filters.lo: datawizard/interfaces/vector_filters.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_filters.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_filters.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_filters.lo `test -f 'datawizard/interfaces/vector_filters.c' || echo '$(srcdir)/'`datawizard/interfaces/vector_filters.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_filters.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_filters.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/vector_filters.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_filters.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_filters.lo `test -f 'datawizard/interfaces/vector_filters.c' || echo '$(srcdir)/'`datawizard/interfaces/vector_filters.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-variable_interface.lo: datawizard/interfaces/variable_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-variable_interface.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-variable_interface.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-variable_interface.lo `test -f 'datawizard/interfaces/variable_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/variable_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-variable_interface.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-variable_interface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/variable_interface.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-variable_interface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-variable_interface.lo `test -f 'datawizard/interfaces/variable_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/variable_interface.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-void_interface.lo: datawizard/interfaces/void_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-void_interface.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-void_interface.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-void_interface.lo `test -f 'datawizard/interfaces/void_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/void_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-void_interface.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-void_interface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/void_interface.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-void_interface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-void_interface.lo `test -f 'datawizard/interfaces/void_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/void_interface.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-multiformat_interface.lo: datawizard/interfaces/multiformat_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-multiformat_interface.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-multiformat_interface.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-multiformat_interface.lo `test -f 'datawizard/interfaces/multiformat_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-multiformat_interface.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-multiformat_interface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat_interface.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-multiformat_interface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-multiformat_interface.lo `test -f 'datawizard/interfaces/multiformat_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat_interface.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-execute_on_all.lo: util/execute_on_all.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-execute_on_all.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-execute_on_all.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-execute_on_all.lo `test -f 'util/execute_on_all.c' || echo '$(srcdir)/'`util/execute_on_all.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-execute_on_all.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-execute_on_all.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/execute_on_all.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-execute_on_all.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-execute_on_all.lo `test -f 'util/execute_on_all.c' || echo '$(srcdir)/'`util/execute_on_all.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_create_sync_task.lo: util/starpu_create_sync_task.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_create_sync_task.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_create_sync_task.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_create_sync_task.lo `test -f 'util/starpu_create_sync_task.c' || echo '$(srcdir)/'`util/starpu_create_sync_task.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_create_sync_task.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_create_sync_task.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/starpu_create_sync_task.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_create_sync_task.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_create_sync_task.lo `test -f 'util/starpu_create_sync_task.c' || echo '$(srcdir)/'`util/starpu_create_sync_task.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-file.lo: util/file.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-file.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-file.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-file.lo `test -f 'util/file.c' || echo '$(srcdir)/'`util/file.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-file.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-file.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/file.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-file.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-file.lo `test -f 'util/file.c' || echo '$(srcdir)/'`util/file.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fstarpu.lo: util/fstarpu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fstarpu.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fstarpu.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fstarpu.lo `test -f 'util/fstarpu.c' || echo '$(srcdir)/'`util/fstarpu.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fstarpu.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fstarpu.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/fstarpu.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fstarpu.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fstarpu.lo `test -f 'util/fstarpu.c' || echo '$(srcdir)/'`util/fstarpu.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-misc.lo: util/misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-misc.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-misc.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-misc.lo `test -f 'util/misc.c' || echo '$(srcdir)/'`util/misc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-misc.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-misc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/misc.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-misc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-misc.lo `test -f 'util/misc.c' || echo '$(srcdir)/'`util/misc.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support.lo: util/openmp_runtime_support.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support.lo `test -f 'util/openmp_runtime_support.c' || echo '$(srcdir)/'`util/openmp_runtime_support.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/openmp_runtime_support.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support.lo `test -f 'util/openmp_runtime_support.c' || echo '$(srcdir)/'`util/openmp_runtime_support.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_environment.lo: util/openmp_runtime_support_environment.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_environment.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_environment.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_environment.lo `test -f 'util/openmp_runtime_support_environment.c' || echo '$(srcdir)/'`util/openmp_runtime_support_environment.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_environment.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_environment.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/openmp_runtime_support_environment.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_environment.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_environment.lo `test -f 'util/openmp_runtime_support_environment.c' || echo '$(srcdir)/'`util/openmp_runtime_support_environment.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_omp_api.lo: util/openmp_runtime_support_omp_api.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_omp_api.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_omp_api.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_omp_api.lo `test -f 'util/openmp_runtime_support_omp_api.c' || echo '$(srcdir)/'`util/openmp_runtime_support_omp_api.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_omp_api.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_omp_api.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/openmp_runtime_support_omp_api.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_omp_api.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_omp_api.lo `test -f 'util/openmp_runtime_support_omp_api.c' || echo '$(srcdir)/'`util/openmp_runtime_support_omp_api.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_data_cpy.lo: util/starpu_data_cpy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_data_cpy.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_data_cpy.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_data_cpy.lo `test -f 'util/starpu_data_cpy.c' || echo '$(srcdir)/'`util/starpu_data_cpy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_data_cpy.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_data_cpy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/starpu_data_cpy.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_data_cpy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_data_cpy.lo `test -f 'util/starpu_data_cpy.c' || echo '$(srcdir)/'`util/starpu_data_cpy.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert.lo: util/starpu_task_insert.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert.lo `test -f 'util/starpu_task_insert.c' || echo '$(srcdir)/'`util/starpu_task_insert.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/starpu_task_insert.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert.lo `test -f 'util/starpu_task_insert.c' || echo '$(srcdir)/'`util/starpu_task_insert.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert_utils.lo: util/starpu_task_insert_utils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert_utils.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert_utils.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert_utils.lo `test -f 'util/starpu_task_insert_utils.c' || echo '$(srcdir)/'`util/starpu_task_insert_utils.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert_utils.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert_utils.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/starpu_task_insert_utils.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert_utils.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert_utils.lo `test -f 'util/starpu_task_insert_utils.c' || echo '$(srcdir)/'`util/starpu_task_insert_utils.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt.lo: debug/traces/starpu_fxt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt.lo `test -f 'debug/traces/starpu_fxt.c' || echo '$(srcdir)/'`debug/traces/starpu_fxt.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='debug/traces/starpu_fxt.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt.lo `test -f 'debug/traces/starpu_fxt.c' || echo '$(srcdir)/'`debug/traces/starpu_fxt.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_mpi.lo: debug/traces/starpu_fxt_mpi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_mpi.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_mpi.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_mpi.lo `test -f 'debug/traces/starpu_fxt_mpi.c' || echo '$(srcdir)/'`debug/traces/starpu_fxt_mpi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_mpi.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_mpi.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='debug/traces/starpu_fxt_mpi.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_mpi.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_mpi.lo `test -f 'debug/traces/starpu_fxt_mpi.c' || echo '$(srcdir)/'`debug/traces/starpu_fxt_mpi.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_dag.lo: debug/traces/starpu_fxt_dag.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_dag.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_dag.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_dag.lo `test -f 'debug/traces/starpu_fxt_dag.c' || echo '$(srcdir)/'`debug/traces/starpu_fxt_dag.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_dag.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_dag.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='debug/traces/starpu_fxt_dag.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_dag.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_dag.lo `test -f 'debug/traces/starpu_fxt_dag.c' || echo '$(srcdir)/'`debug/traces/starpu_fxt_dag.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_paje.lo: debug/traces/starpu_paje.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_paje.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_paje.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_paje.lo `test -f 'debug/traces/starpu_paje.c' || echo '$(srcdir)/'`debug/traces/starpu_paje.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_paje.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_paje.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='debug/traces/starpu_paje.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_paje.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_paje.lo `test -f 'debug/traces/starpu_paje.c' || echo '$(srcdir)/'`debug/traces/starpu_paje.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-anim.lo: debug/traces/anim.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-anim.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-anim.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-anim.lo `test -f 'debug/traces/anim.c' || echo '$(srcdir)/'`debug/traces/anim.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-anim.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-anim.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='debug/traces/anim.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-anim.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-anim.lo `test -f 'debug/traces/anim.c' || echo '$(srcdir)/'`debug/traces/anim.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-latency.lo: debug/latency.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-latency.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-latency.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-latency.lo `test -f 'debug/latency.c' || echo '$(srcdir)/'`debug/latency.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-latency.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-latency.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='debug/latency.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-latency.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-latency.lo `test -f 'debug/latency.c' || echo '$(srcdir)/'`debug/latency.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-structures_size.lo: debug/structures_size.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-structures_size.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-structures_size.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-structures_size.lo `test -f 'debug/structures_size.c' || echo '$(srcdir)/'`debug/structures_size.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-structures_size.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-structures_size.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='debug/structures_size.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-structures_size.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-structures_size.lo `test -f 'debug/structures_size.c' || echo '$(srcdir)/'`debug/structures_size.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling.lo: profiling/profiling.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling.lo `test -f 'profiling/profiling.c' || echo '$(srcdir)/'`profiling/profiling.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='profiling/profiling.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling.lo `test -f 'profiling/profiling.c' || echo '$(srcdir)/'`profiling/profiling.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bound.lo: profiling/bound.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bound.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bound.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bound.lo `test -f 'profiling/bound.c' || echo '$(srcdir)/'`profiling/bound.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bound.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bound.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='profiling/bound.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bound.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bound.lo `test -f 'profiling/bound.c' || echo '$(srcdir)/'`profiling/bound.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling_helpers.lo: profiling/profiling_helpers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling_helpers.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling_helpers.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling_helpers.lo `test -f 'profiling/profiling_helpers.c' || echo '$(srcdir)/'`profiling/profiling_helpers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling_helpers.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling_helpers.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='profiling/profiling_helpers.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling_helpers.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling_helpers.lo `test -f 'profiling/profiling_helpers.c' || echo '$(srcdir)/'`profiling/profiling_helpers.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top.lo: top/starpu_top.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top.lo `test -f 'top/starpu_top.c' || echo '$(srcdir)/'`top/starpu_top.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='top/starpu_top.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top.lo `test -f 'top/starpu_top.c' || echo '$(srcdir)/'`top/starpu_top.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_task.lo: top/starpu_top_task.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_task.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_task.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_task.lo `test -f 'top/starpu_top_task.c' || echo '$(srcdir)/'`top/starpu_top_task.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_task.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_task.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='top/starpu_top_task.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_task.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_task.lo `test -f 'top/starpu_top_task.c' || echo '$(srcdir)/'`top/starpu_top_task.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_message_queue.lo: top/starpu_top_message_queue.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_message_queue.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_message_queue.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_message_queue.lo `test -f 'top/starpu_top_message_queue.c' || echo '$(srcdir)/'`top/starpu_top_message_queue.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_message_queue.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_message_queue.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='top/starpu_top_message_queue.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_message_queue.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_message_queue.lo `test -f 'top/starpu_top_message_queue.c' || echo '$(srcdir)/'`top/starpu_top_message_queue.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_connection.lo: top/starpu_top_connection.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_connection.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_connection.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_connection.lo `test -f 'top/starpu_top_connection.c' || echo '$(srcdir)/'`top/starpu_top_connection.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_connection.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_connection.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='top/starpu_top_connection.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_connection.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_connection.lo `test -f 'top/starpu_top_connection.c' || echo '$(srcdir)/'`top/starpu_top_connection.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_list.lo: worker_collection/worker_list.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_list.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_list.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_list.lo `test -f 'worker_collection/worker_list.c' || echo '$(srcdir)/'`worker_collection/worker_list.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_list.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_list.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='worker_collection/worker_list.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_list.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_list.lo `test -f 'worker_collection/worker_list.c' || echo '$(srcdir)/'`worker_collection/worker_list.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_tree.lo: worker_collection/worker_tree.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_tree.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_tree.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_tree.lo `test -f 'worker_collection/worker_tree.c' || echo '$(srcdir)/'`worker_collection/worker_tree.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_tree.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_tree.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='worker_collection/worker_tree.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_tree.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_tree.lo `test -f 'worker_collection/worker_tree.c' || echo '$(srcdir)/'`worker_collection/worker_tree.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_worker.lo: sched_policies/component_worker.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_worker.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_worker.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_worker.lo `test -f 'sched_policies/component_worker.c' || echo '$(srcdir)/'`sched_policies/component_worker.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_worker.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_worker.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/component_worker.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_worker.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_worker.lo `test -f 'sched_policies/component_worker.c' || echo '$(srcdir)/'`sched_policies/component_worker.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_sched.lo: sched_policies/component_sched.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_sched.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_sched.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_sched.lo `test -f 'sched_policies/component_sched.c' || echo '$(srcdir)/'`sched_policies/component_sched.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_sched.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_sched.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/component_sched.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_sched.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_sched.lo `test -f 'sched_policies/component_sched.c' || echo '$(srcdir)/'`sched_policies/component_sched.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_fifo.lo: sched_policies/component_fifo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_fifo.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_fifo.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_fifo.lo `test -f 'sched_policies/component_fifo.c' || echo '$(srcdir)/'`sched_policies/component_fifo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_fifo.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_fifo.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/component_fifo.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_fifo.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_fifo.lo `test -f 'sched_policies/component_fifo.c' || echo '$(srcdir)/'`sched_policies/component_fifo.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-prio_deque.lo: sched_policies/prio_deque.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-prio_deque.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-prio_deque.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-prio_deque.lo `test -f 'sched_policies/prio_deque.c' || echo '$(srcdir)/'`sched_policies/prio_deque.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-prio_deque.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-prio_deque.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/prio_deque.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-prio_deque.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-prio_deque.lo `test -f 'sched_policies/prio_deque.c' || echo '$(srcdir)/'`sched_policies/prio_deque.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-helper_mct.lo: sched_policies/helper_mct.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-helper_mct.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-helper_mct.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-helper_mct.lo `test -f 'sched_policies/helper_mct.c' || echo '$(srcdir)/'`sched_policies/helper_mct.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-helper_mct.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-helper_mct.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/helper_mct.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-helper_mct.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-helper_mct.lo `test -f 'sched_policies/helper_mct.c' || echo '$(srcdir)/'`sched_policies/helper_mct.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_prio.lo: sched_policies/component_prio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_prio.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_prio.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_prio.lo `test -f 'sched_policies/component_prio.c' || echo '$(srcdir)/'`sched_policies/component_prio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_prio.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_prio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/component_prio.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_prio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_prio.lo `test -f 'sched_policies/component_prio.c' || echo '$(srcdir)/'`sched_policies/component_prio.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_random.lo: sched_policies/component_random.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_random.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_random.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_random.lo `test -f 'sched_policies/component_random.c' || echo '$(srcdir)/'`sched_policies/component_random.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_random.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_random.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/component_random.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_random.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_random.lo `test -f 'sched_policies/component_random.c' || echo '$(srcdir)/'`sched_policies/component_random.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager.lo: sched_policies/component_eager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager.lo `test -f 'sched_policies/component_eager.c' || echo '$(srcdir)/'`sched_policies/component_eager.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/component_eager.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager.lo `test -f 'sched_policies/component_eager.c' || echo '$(srcdir)/'`sched_policies/component_eager.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager_calibration.lo: sched_policies/component_eager_calibration.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager_calibration.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager_calibration.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager_calibration.lo `test -f 'sched_policies/component_eager_calibration.c' || echo '$(srcdir)/'`sched_policies/component_eager_calibration.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager_calibration.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager_calibration.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/component_eager_calibration.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager_calibration.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager_calibration.lo `test -f 'sched_policies/component_eager_calibration.c' || echo '$(srcdir)/'`sched_policies/component_eager_calibration.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_mct.lo: sched_policies/component_mct.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_mct.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_mct.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_mct.lo `test -f 'sched_policies/component_mct.c' || echo '$(srcdir)/'`sched_policies/component_mct.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_mct.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_mct.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/component_mct.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_mct.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_mct.lo `test -f 'sched_policies/component_mct.c' || echo '$(srcdir)/'`sched_policies/component_mct.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_heft.lo: sched_policies/component_heft.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_heft.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_heft.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_heft.lo `test -f 'sched_policies/component_heft.c' || echo '$(srcdir)/'`sched_policies/component_heft.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_heft.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_heft.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/component_heft.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_heft.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_heft.lo `test -f 'sched_policies/component_heft.c' || echo '$(srcdir)/'`sched_policies/component_heft.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_best_implementation.lo: sched_policies/component_best_implementation.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_best_implementation.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_best_implementation.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_best_implementation.lo `test -f 'sched_policies/component_best_implementation.c' || echo '$(srcdir)/'`sched_policies/component_best_implementation.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_best_implementation.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_best_implementation.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/component_best_implementation.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_best_implementation.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_best_implementation.lo `test -f 'sched_policies/component_best_implementation.c' || echo '$(srcdir)/'`sched_policies/component_best_implementation.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_perfmodel_select.lo: sched_policies/component_perfmodel_select.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_perfmodel_select.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_perfmodel_select.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_perfmodel_select.lo `test -f 'sched_policies/component_perfmodel_select.c' || echo '$(srcdir)/'`sched_policies/component_perfmodel_select.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_perfmodel_select.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_perfmodel_select.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/component_perfmodel_select.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_perfmodel_select.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_perfmodel_select.lo `test -f 'sched_policies/component_perfmodel_select.c' || echo '$(srcdir)/'`sched_policies/component_perfmodel_select.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_composed.lo: sched_policies/component_composed.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_composed.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_composed.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_composed.lo `test -f 'sched_policies/component_composed.c' || echo '$(srcdir)/'`sched_policies/component_composed.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_composed.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_composed.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/component_composed.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_composed.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_composed.lo `test -f 'sched_policies/component_composed.c' || echo '$(srcdir)/'`sched_policies/component_composed.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager.lo: sched_policies/modular_eager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager.lo `test -f 'sched_policies/modular_eager.c' || echo '$(srcdir)/'`sched_policies/modular_eager.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/modular_eager.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager.lo `test -f 'sched_policies/modular_eager.c' || echo '$(srcdir)/'`sched_policies/modular_eager.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager_prefetching.lo: sched_policies/modular_eager_prefetching.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager_prefetching.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager_prefetching.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager_prefetching.lo `test -f 'sched_policies/modular_eager_prefetching.c' || echo '$(srcdir)/'`sched_policies/modular_eager_prefetching.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager_prefetching.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager_prefetching.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/modular_eager_prefetching.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager_prefetching.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager_prefetching.lo `test -f 'sched_policies/modular_eager_prefetching.c' || echo '$(srcdir)/'`sched_policies/modular_eager_prefetching.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio.lo: sched_policies/modular_prio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio.lo `test -f 'sched_policies/modular_prio.c' || echo '$(srcdir)/'`sched_policies/modular_prio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/modular_prio.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio.lo `test -f 'sched_policies/modular_prio.c' || echo '$(srcdir)/'`sched_policies/modular_prio.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio_prefetching.lo: sched_policies/modular_prio_prefetching.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio_prefetching.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio_prefetching.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio_prefetching.lo `test -f 'sched_policies/modular_prio_prefetching.c' || echo '$(srcdir)/'`sched_policies/modular_prio_prefetching.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio_prefetching.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio_prefetching.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/modular_prio_prefetching.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio_prefetching.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio_prefetching.lo `test -f 'sched_policies/modular_prio_prefetching.c' || echo '$(srcdir)/'`sched_policies/modular_prio_prefetching.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random.lo: sched_policies/modular_random.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random.lo `test -f 'sched_policies/modular_random.c' || echo '$(srcdir)/'`sched_policies/modular_random.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/modular_random.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random.lo `test -f 'sched_policies/modular_random.c' || echo '$(srcdir)/'`sched_policies/modular_random.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random_prefetching.lo: sched_policies/modular_random_prefetching.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random_prefetching.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random_prefetching.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random_prefetching.lo `test -f 'sched_policies/modular_random_prefetching.c' || echo '$(srcdir)/'`sched_policies/modular_random_prefetching.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random_prefetching.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random_prefetching.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/modular_random_prefetching.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random_prefetching.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random_prefetching.lo `test -f 'sched_policies/modular_random_prefetching.c' || echo '$(srcdir)/'`sched_policies/modular_random_prefetching.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft.lo: sched_policies/modular_heft.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft.lo `test -f 'sched_policies/modular_heft.c' || echo '$(srcdir)/'`sched_policies/modular_heft.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/modular_heft.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft.lo `test -f 'sched_policies/modular_heft.c' || echo '$(srcdir)/'`sched_policies/modular_heft.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft_prio.lo: sched_policies/modular_heft_prio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft_prio.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft_prio.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft_prio.lo `test -f 'sched_policies/modular_heft_prio.c' || echo '$(srcdir)/'`sched_policies/modular_heft_prio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft_prio.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft_prio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/modular_heft_prio.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft_prio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft_prio.lo `test -f 'sched_policies/modular_heft_prio.c' || echo '$(srcdir)/'`sched_policies/modular_heft_prio.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft2.lo: sched_policies/modular_heft2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft2.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft2.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft2.lo `test -f 'sched_policies/modular_heft2.c' || echo '$(srcdir)/'`sched_policies/modular_heft2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft2.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/modular_heft2.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft2.lo `test -f 'sched_policies/modular_heft2.c' || echo '$(srcdir)/'`sched_policies/modular_heft2.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cpu.lo: drivers/cpu/driver_cpu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cpu.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cpu.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cpu.lo `test -f 'drivers/cpu/driver_cpu.c' || echo '$(srcdir)/'`drivers/cpu/driver_cpu.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cpu.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cpu.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drivers/cpu/driver_cpu.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cpu.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cpu.lo `test -f 'drivers/cpu/driver_cpu.c' || echo '$(srcdir)/'`drivers/cpu/driver_cpu.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cuda.lo: drivers/cuda/driver_cuda.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cuda.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cuda.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cuda.lo `test -f 'drivers/cuda/driver_cuda.c' || echo '$(srcdir)/'`drivers/cuda/driver_cuda.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cuda.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cuda.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drivers/cuda/driver_cuda.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cuda.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cuda.lo `test -f 'drivers/cuda/driver_cuda.c' || echo '$(srcdir)/'`drivers/cuda/driver_cuda.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cublas.lo: drivers/cuda/starpu_cublas.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cublas.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cublas.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cublas.lo `test -f 'drivers/cuda/starpu_cublas.c' || echo '$(srcdir)/'`drivers/cuda/starpu_cublas.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cublas.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cublas.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drivers/cuda/starpu_cublas.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cublas.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cublas.lo `test -f 'drivers/cuda/starpu_cublas.c' || echo '$(srcdir)/'`drivers/cuda/starpu_cublas.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cusparse.lo: drivers/cuda/starpu_cusparse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cusparse.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cusparse.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cusparse.lo `test -f 'drivers/cuda/starpu_cusparse.c' || echo '$(srcdir)/'`drivers/cuda/starpu_cusparse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cusparse.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cusparse.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drivers/cuda/starpu_cusparse.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cusparse.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cusparse.lo `test -f 'drivers/cuda/starpu_cusparse.c' || echo '$(srcdir)/'`drivers/cuda/starpu_cusparse.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl.lo: drivers/opencl/driver_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl.lo `test -f 'drivers/opencl/driver_opencl.c' || echo '$(srcdir)/'`drivers/opencl/driver_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drivers/opencl/driver_opencl.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl.lo `test -f 'drivers/opencl/driver_opencl.c' || echo '$(srcdir)/'`drivers/opencl/driver_opencl.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl_utils.lo: drivers/opencl/driver_opencl_utils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl_utils.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl_utils.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl_utils.lo `test -f 'drivers/opencl/driver_opencl_utils.c' || echo '$(srcdir)/'`drivers/opencl/driver_opencl_utils.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl_utils.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl_utils.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drivers/opencl/driver_opencl_utils.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl_utils.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl_utils.lo `test -f 'drivers/opencl/driver_opencl_utils.c' || echo '$(srcdir)/'`drivers/opencl/driver_opencl_utils.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_common.lo: drivers/scc/driver_scc_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_common.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_common.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_common.lo `test -f 'drivers/scc/driver_scc_common.c' || echo '$(srcdir)/'`drivers/scc/driver_scc_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_common.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_common.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drivers/scc/driver_scc_common.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_common.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_common.lo `test -f 'drivers/scc/driver_scc_common.c' || echo '$(srcdir)/'`drivers/scc/driver_scc_common.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_source.lo: drivers/scc/driver_scc_source.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_source.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_source.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_source.lo `test -f 'drivers/scc/driver_scc_source.c' || echo '$(srcdir)/'`drivers/scc/driver_scc_source.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_source.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_source.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drivers/scc/driver_scc_source.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_source.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_source.lo `test -f 'drivers/scc/driver_scc_source.c' || echo '$(srcdir)/'`drivers/scc/driver_scc_source.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_sink.lo: drivers/scc/driver_scc_sink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_sink.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_sink.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_sink.lo `test -f 'drivers/scc/driver_scc_sink.c' || echo '$(srcdir)/'`drivers/scc/driver_scc_sink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_sink.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_sink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drivers/scc/driver_scc_sink.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_sink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_sink.lo `test -f 'drivers/scc/driver_scc_sink.c' || echo '$(srcdir)/'`drivers/scc/driver_scc_sink.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_utils.lo: drivers/scc/driver_scc_utils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_utils.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_utils.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_utils.lo `test -f 'drivers/scc/driver_scc_utils.c' || echo '$(srcdir)/'`drivers/scc/driver_scc_utils.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_utils.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_utils.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drivers/scc/driver_scc_utils.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_utils.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_scc_utils.lo `test -f 'drivers/scc/driver_scc_utils.c' || echo '$(srcdir)/'`drivers/scc/driver_scc_utils.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_o_direct.lo: core/disk_ops/disk_unistd_o_direct.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_o_direct.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_o_direct.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_o_direct.lo `test -f 'core/disk_ops/disk_unistd_o_direct.c' || echo '$(srcdir)/'`core/disk_ops/disk_unistd_o_direct.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_o_direct.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_o_direct.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/disk_ops/disk_unistd_o_direct.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_o_direct.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_o_direct.lo `test -f 'core/disk_ops/disk_unistd_o_direct.c' || echo '$(srcdir)/'`core/disk_ops/disk_unistd_o_direct.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-mp_common.lo: drivers/mp_common/mp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-mp_common.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-mp_common.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-mp_common.lo `test -f 'drivers/mp_common/mp_common.c' || echo '$(srcdir)/'`drivers/mp_common/mp_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-mp_common.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-mp_common.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drivers/mp_common/mp_common.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-mp_common.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-mp_common.lo `test -f 'drivers/mp_common/mp_common.c' || echo '$(srcdir)/'`drivers/mp_common/mp_common.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-source_common.lo: drivers/mp_common/source_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-source_common.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-source_common.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-source_common.lo `test -f 'drivers/mp_common/source_common.c' || echo '$(srcdir)/'`drivers/mp_common/source_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-source_common.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-source_common.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drivers/mp_common/source_common.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-source_common.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-source_common.lo `test -f 'drivers/mp_common/source_common.c' || echo '$(srcdir)/'`drivers/mp_common/source_common.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sink_common.lo: drivers/mp_common/sink_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sink_common.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sink_common.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sink_common.lo `test -f 'drivers/mp_common/sink_common.c' || echo '$(srcdir)/'`drivers/mp_common/sink_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sink_common.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sink_common.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drivers/mp_common/sink_common.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sink_common.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sink_common.lo `test -f 'drivers/mp_common/sink_common.c' || echo '$(srcdir)/'`drivers/mp_common/sink_common.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_common.lo: drivers/mic/driver_mic_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_common.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_common.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_common.lo `test -f 'drivers/mic/driver_mic_common.c' || echo '$(srcdir)/'`drivers/mic/driver_mic_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_common.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_common.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drivers/mic/driver_mic_common.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_common.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_common.lo `test -f 'drivers/mic/driver_mic_common.c' || echo '$(srcdir)/'`drivers/mic/driver_mic_common.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_source.lo: drivers/mic/driver_mic_source.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_source.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_source.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_source.lo `test -f 'drivers/mic/driver_mic_source.c' || echo '$(srcdir)/'`drivers/mic/driver_mic_source.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_source.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_source.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drivers/mic/driver_mic_source.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_source.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_source.lo `test -f 'drivers/mic/driver_mic_source.c' || echo '$(srcdir)/'`drivers/mic/driver_mic_source.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_sink.lo: drivers/mic/driver_mic_sink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_sink.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_sink.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_sink.lo `test -f 'drivers/mic/driver_mic_sink.c' || echo '$(srcdir)/'`drivers/mic/driver_mic_sink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_sink.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_sink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drivers/mic/driver_mic_sink.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_sink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_sink.lo `test -f 'drivers/mic/driver_mic_sink.c' || echo '$(srcdir)/'`drivers/mic/driver_mic_sink.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_utils.lo: drivers/mic/driver_mic_utils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_utils.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_utils.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_utils.lo `test -f 'drivers/mic/driver_mic_utils.c' || echo '$(srcdir)/'`drivers/mic/driver_mic_utils.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_utils.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_utils.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drivers/mic/driver_mic_utils.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_utils.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_utils.lo `test -f 'drivers/mic/driver_mic_utils.c' || echo '$(srcdir)/'`drivers/mic/driver_mic_utils.c .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_leveldb.lo: core/disk_ops/disk_leveldb.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_leveldb.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_leveldb.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_leveldb.lo `test -f 'core/disk_ops/disk_leveldb.cpp' || echo '$(srcdir)/'`core/disk_ops/disk_leveldb.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_leveldb.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_leveldb.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='core/disk_ops/disk_leveldb.cpp' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_leveldb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_leveldb.lo `test -f 'core/disk_ops/disk_leveldb.cpp' || echo '$(srcdir)/'`core/disk_ops/disk_leveldb.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive @STARPU_HAVE_MS_LIB_FALSE@all-local: @STARPU_HAVE_WINDOWS_FALSE@all-local: all-am: Makefile $(LTLIBRARIES) $(HEADERS) all-local installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." @STARPU_HAVE_WINDOWS_FALSE@install-exec-hook: clean: clean-recursive clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-libLTLIBRARIES @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-exec-hook install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: $(am__recursive_targets) install-am install-exec-am \ install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \ check check-am clean clean-generic clean-libLTLIBRARIES \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-exec-hook \ install-html install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES .PRECIOUS: Makefile @STARPU_HAVE_WINDOWS_TRUE@export LC_MESSAGES @STARPU_HAVE_MS_LIB_TRUE@@STARPU_HAVE_WINDOWS_TRUE@.libs/libstarpu-@STARPU_EFFECTIVE_VERSION@.lib: libstarpu-@STARPU_EFFECTIVE_VERSION@.la dolib @STARPU_HAVE_MS_LIB_TRUE@@STARPU_HAVE_WINDOWS_TRUE@ ./dolib "$(STARPU_MS_LIB)" $(STARPU_MS_LIB_ARCH) .libs/libstarpu-@STARPU_EFFECTIVE_VERSION@.def @STARPU_EFFECTIVE_VERSION@ $(libstarpu_so_version) .libs/libstarpu-@STARPU_EFFECTIVE_VERSION@.lib @STARPU_HAVE_MS_LIB_TRUE@@STARPU_HAVE_WINDOWS_TRUE@all-local: .libs/libstarpu-@STARPU_EFFECTIVE_VERSION@.lib @STARPU_HAVE_WINDOWS_TRUE@install-exec-hook: @STARPU_HAVE_WINDOWS_TRUE@ $(INSTALL) .libs/libstarpu-@STARPU_EFFECTIVE_VERSION@.def $(DESTDIR)$(libdir) @STARPU_HAVE_MS_LIB_TRUE@@STARPU_HAVE_WINDOWS_TRUE@ $(INSTALL) .libs/libstarpu-@STARPU_EFFECTIVE_VERSION@.lib $(DESTDIR)$(libdir) @STARPU_HAVE_MS_LIB_TRUE@@STARPU_HAVE_WINDOWS_TRUE@ $(INSTALL) .libs/libstarpu-@STARPU_EFFECTIVE_VERSION@.exp $(DESTDIR)$(libdir) ######################################### showcheck: -cat /dev/null # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.2.3+dfsg/src/common/000077500000000000000000000000001320135501600160255ustar00rootroot00000000000000starpu-1.2.3+dfsg/src/common/barrier.c000066400000000000000000000047771320135501600176360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011,2013,2014,2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include int _starpu_barrier_init(struct _starpu_barrier *barrier, int count) { barrier->count = count; barrier->reached_start = 0; barrier->reached_exit = 0; barrier->reached_flops = 0.0; STARPU_PTHREAD_MUTEX_INIT(&barrier->mutex, NULL); STARPU_PTHREAD_MUTEX_INIT(&barrier->mutex_exit, NULL); STARPU_PTHREAD_COND_INIT(&barrier->cond, NULL); return 0; } static int _starpu_barrier_test(struct _starpu_barrier *barrier) { /* * Check whether any threads are known to be waiting; report * "BUSY" if so. */ STARPU_PTHREAD_MUTEX_LOCK(&barrier->mutex_exit); if (barrier->reached_exit != barrier->count) { STARPU_PTHREAD_MUTEX_UNLOCK(&barrier->mutex_exit); return EBUSY; } STARPU_PTHREAD_MUTEX_UNLOCK(&barrier->mutex_exit); return 0; } int _starpu_barrier_destroy(struct _starpu_barrier *barrier) { int ret = _starpu_barrier_test(barrier); while (ret == EBUSY) { ret = _starpu_barrier_test(barrier); } _STARPU_DEBUG("reached_exit %u\n", barrier->reached_exit); STARPU_PTHREAD_MUTEX_DESTROY(&barrier->mutex); STARPU_PTHREAD_MUTEX_DESTROY(&barrier->mutex_exit); STARPU_PTHREAD_COND_DESTROY(&barrier->cond); return 0; } int _starpu_barrier_wait(struct _starpu_barrier *barrier) { int ret=0; // Wait until all threads enter the barrier STARPU_PTHREAD_MUTEX_LOCK(&barrier->mutex); barrier->reached_exit=0; barrier->reached_start++; if (barrier->reached_start == barrier->count) { barrier->reached_start = 0; STARPU_PTHREAD_COND_BROADCAST(&barrier->cond); ret = STARPU_PTHREAD_BARRIER_SERIAL_THREAD; } else { STARPU_PTHREAD_COND_WAIT(&barrier->cond,&barrier->mutex); } STARPU_PTHREAD_MUTEX_UNLOCK(&barrier->mutex); // Count number of threads that exit the barrier STARPU_PTHREAD_MUTEX_LOCK(&barrier->mutex_exit); barrier->reached_exit ++; STARPU_PTHREAD_MUTEX_UNLOCK(&barrier->mutex_exit); return ret; } starpu-1.2.3+dfsg/src/common/barrier.h000066400000000000000000000022231320135501600176230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2013, 2014 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __COMMON_BARRIER_H__ #define __COMMON_BARRIER_H__ #include struct _starpu_barrier { unsigned count; unsigned reached_start; unsigned reached_exit; double reached_flops; starpu_pthread_mutex_t mutex; starpu_pthread_mutex_t mutex_exit; starpu_pthread_cond_t cond; }; int _starpu_barrier_init(struct _starpu_barrier *barrier, int count); int _starpu_barrier_destroy(struct _starpu_barrier *barrier); int _starpu_barrier_wait(struct _starpu_barrier *barrier); #endif // __COMMON_BARRIER_H__ starpu-1.2.3+dfsg/src/common/barrier_counter.c000066400000000000000000000125311320135501600213600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include int _starpu_barrier_counter_init(struct _starpu_barrier_counter *barrier_c, unsigned count) { _starpu_barrier_init(&barrier_c->barrier, count); barrier_c->min_threshold = 0; barrier_c->max_threshold = 0; STARPU_PTHREAD_COND_INIT(&barrier_c->cond2, NULL); return 0; } int _starpu_barrier_counter_destroy(struct _starpu_barrier_counter *barrier_c) { _starpu_barrier_destroy(&barrier_c->barrier); STARPU_PTHREAD_COND_DESTROY(&barrier_c->cond2); return 0; } int _starpu_barrier_counter_wait_for_empty_counter(struct _starpu_barrier_counter *barrier_c) { struct _starpu_barrier *barrier = &barrier_c->barrier; int ret; STARPU_PTHREAD_MUTEX_LOCK(&barrier->mutex); ret = barrier->reached_start; while (barrier->reached_start > 0) STARPU_PTHREAD_COND_WAIT(&barrier->cond, &barrier->mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&barrier->mutex); return ret; } int _starpu_barrier_counter_wait_until_counter_reaches_down_to_n(struct _starpu_barrier_counter *barrier_c, unsigned n) { struct _starpu_barrier *barrier = &barrier_c->barrier; STARPU_PTHREAD_MUTEX_LOCK(&barrier->mutex); while (barrier->reached_start > n) { if (barrier_c->max_threshold < n) barrier_c->max_threshold = n; STARPU_PTHREAD_COND_WAIT(&barrier->cond, &barrier->mutex); } STARPU_PTHREAD_MUTEX_UNLOCK(&barrier->mutex); return 0; } int _starpu_barrier_counter_wait_until_counter_reaches_up_to_n(struct _starpu_barrier_counter *barrier_c, unsigned n) { struct _starpu_barrier *barrier = &barrier_c->barrier; STARPU_PTHREAD_MUTEX_LOCK(&barrier->mutex); while (barrier->reached_start < n) { if (barrier_c->min_threshold > n) barrier_c->min_threshold = n; STARPU_PTHREAD_COND_WAIT(&barrier_c->cond2, &barrier->mutex); } STARPU_PTHREAD_MUTEX_UNLOCK(&barrier->mutex); return 0; } int _starpu_barrier_counter_wait_for_full_counter(struct _starpu_barrier_counter *barrier_c) { struct _starpu_barrier *barrier = &barrier_c->barrier; STARPU_PTHREAD_MUTEX_LOCK(&barrier->mutex); while (barrier->reached_start < barrier->count) STARPU_PTHREAD_COND_WAIT(&barrier_c->cond2, &barrier->mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&barrier->mutex); return 0; } int _starpu_barrier_counter_decrement_until_empty_counter(struct _starpu_barrier_counter *barrier_c, double flops) { struct _starpu_barrier *barrier = &barrier_c->barrier; int ret = 0; STARPU_PTHREAD_MUTEX_LOCK(&barrier->mutex); barrier->reached_flops -= flops; if (--barrier->reached_start == 0) { ret = 1; STARPU_PTHREAD_COND_BROADCAST(&barrier->cond); } if (barrier_c->max_threshold && barrier->reached_start == barrier_c->max_threshold) { /* have those not happy enough tell us how much again */ barrier_c->max_threshold = 0; STARPU_PTHREAD_COND_BROADCAST(&barrier->cond); } STARPU_PTHREAD_MUTEX_UNLOCK(&barrier->mutex); return ret; } int _starpu_barrier_counter_increment_until_full_counter(struct _starpu_barrier_counter *barrier_c, double flops) { struct _starpu_barrier *barrier = &barrier_c->barrier; int ret = 0; STARPU_PTHREAD_MUTEX_LOCK(&barrier->mutex); barrier->reached_flops += flops; if(++barrier->reached_start == barrier->count) { ret = 1; STARPU_PTHREAD_COND_BROADCAST(&barrier_c->cond2); } if (barrier_c->min_threshold && barrier->reached_start == barrier_c->min_threshold) { /* have those not happy enough tell us how much again */ barrier_c->min_threshold = 0; STARPU_PTHREAD_COND_BROADCAST(&barrier_c->cond2); } STARPU_PTHREAD_MUTEX_UNLOCK(&barrier->mutex); return ret; } int _starpu_barrier_counter_increment(struct _starpu_barrier_counter *barrier_c, double flops) { struct _starpu_barrier *barrier = &barrier_c->barrier; STARPU_PTHREAD_MUTEX_LOCK(&barrier->mutex); barrier->reached_start++; barrier->reached_flops += flops; STARPU_PTHREAD_COND_BROADCAST(&barrier_c->cond2); STARPU_PTHREAD_MUTEX_UNLOCK(&barrier->mutex); return 0; } int _starpu_barrier_counter_check(struct _starpu_barrier_counter *barrier_c) { struct _starpu_barrier *barrier = &barrier_c->barrier; STARPU_PTHREAD_MUTEX_LOCK(&barrier->mutex); if(barrier->reached_start == 0) STARPU_PTHREAD_COND_BROADCAST(&barrier->cond); STARPU_PTHREAD_MUTEX_UNLOCK(&barrier->mutex); return 0; } int _starpu_barrier_counter_get_reached_start(struct _starpu_barrier_counter *barrier_c) { struct _starpu_barrier *barrier = &barrier_c->barrier; int ret; STARPU_PTHREAD_MUTEX_LOCK(&barrier->mutex); ret = barrier->reached_start; STARPU_PTHREAD_MUTEX_UNLOCK(&barrier->mutex); return ret; } double _starpu_barrier_counter_get_reached_flops(struct _starpu_barrier_counter *barrier_c) { struct _starpu_barrier *barrier = &barrier_c->barrier; double ret; STARPU_PTHREAD_MUTEX_LOCK(&barrier->mutex); ret = barrier->reached_flops; STARPU_PTHREAD_MUTEX_UNLOCK(&barrier->mutex); return ret; } starpu-1.2.3+dfsg/src/common/barrier_counter.h000066400000000000000000000040741320135501600213700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __BARRIER_COUNTER_H__ #define __BARRIER_COUNTER_H__ #include #include struct _starpu_barrier_counter { struct _starpu_barrier barrier; unsigned min_threshold; unsigned max_threshold; starpu_pthread_cond_t cond2; }; int _starpu_barrier_counter_init(struct _starpu_barrier_counter *barrier_c, unsigned count); int _starpu_barrier_counter_destroy(struct _starpu_barrier_counter *barrier_c); int _starpu_barrier_counter_wait_for_empty_counter(struct _starpu_barrier_counter *barrier_c); int _starpu_barrier_counter_wait_until_counter_reaches_down_to_n(struct _starpu_barrier_counter *barrier_c, unsigned n); int _starpu_barrier_counter_wait_until_counter_reaches_up_to_n(struct _starpu_barrier_counter *barrier_c, unsigned n); int _starpu_barrier_counter_wait_for_full_counter(struct _starpu_barrier_counter *barrier_c); int _starpu_barrier_counter_decrement_until_empty_counter(struct _starpu_barrier_counter *barrier_c, double flops); int _starpu_barrier_counter_increment_until_full_counter(struct _starpu_barrier_counter *barrier_c, double flops); int _starpu_barrier_counter_increment(struct _starpu_barrier_counter *barrier_c, double flops); int _starpu_barrier_counter_check(struct _starpu_barrier_counter *barrier_c); int _starpu_barrier_counter_get_reached_start(struct _starpu_barrier_counter *barrier_c); double _starpu_barrier_counter_get_reached_flops(struct _starpu_barrier_counter *barrier_c); #endif starpu-1.2.3+dfsg/src/common/bitmap.c000066400000000000000000000130621320135501600174470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Simon Archipoff * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #ifndef LONG_BIT #define LONG_BIT (sizeof(unsigned long) * 8) #endif struct starpu_bitmap { unsigned long * bits; int size; /* the size of bits array in number of unsigned long */ int cardinal; }; //#define DEBUG_BITMAP #ifdef DEBUG_BITMAP static int check_bitmap(struct starpu_bitmap *b) { int card = b->cardinal; int i = starpu_bitmap_first(b); int j; for(j = 0; j < card; j++) { if(i == -1) return 0; int tmp = starpu_bitmap_next(b,i); if(tmp == i) return 0; i = tmp; } if(i != -1) return 0; return 1; } #else #define check_bitmap(b) 1 #endif static int _count_bit(unsigned long e) { #if (__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__) >= 4) return __builtin_popcountl(e); #else int c = 0; while(e) { c += e&1; e >>= 1; } return c; #endif } struct starpu_bitmap * starpu_bitmap_create(void) { struct starpu_bitmap *b; _STARPU_CALLOC(b, 1, sizeof(*b)); return b; } void starpu_bitmap_destroy(struct starpu_bitmap * b) { if(b) { free(b->bits); free(b); } } void starpu_bitmap_set(struct starpu_bitmap * b, int e) { if(!starpu_bitmap_get(b, e)) b->cardinal++; else return; if((e/LONG_BIT) + 1 > b->size) { _STARPU_REALLOC(b->bits, sizeof(unsigned long) * ((e/LONG_BIT) + 1)); memset(b->bits + b->size, 0, sizeof(unsigned long) * ((e/LONG_BIT + 1) - b->size)); b->size = (e/LONG_BIT) + 1; } b->bits[e/LONG_BIT] |= (1ul << (e%LONG_BIT)); STARPU_ASSERT(check_bitmap(b)); } void starpu_bitmap_unset(struct starpu_bitmap *b, int e) { if(starpu_bitmap_get(b, e)) b->cardinal--; else return; if(e / LONG_BIT > b->size) return; b->bits[e/LONG_BIT] &= ~(1ul << (e%LONG_BIT)); STARPU_ASSERT(check_bitmap(b)); } void starpu_bitmap_unset_all(struct starpu_bitmap * b) { free(b->bits); b->bits = NULL; b->size = 0; } void starpu_bitmap_unset_and(struct starpu_bitmap * a, struct starpu_bitmap * b, struct starpu_bitmap * c) { int n = STARPU_MIN(b->size, c->size); _STARPU_REALLOC(a->bits, sizeof(unsigned long) * n); a->size = n; a->cardinal = 0; int i; for(i = 0; i < n; i++) { a->bits[i] = b->bits[i] & c->bits[i]; a->cardinal += _count_bit(a->bits[i]); } } int starpu_bitmap_get(struct starpu_bitmap * b, int e) { if(e / LONG_BIT >= b->size) return 0; return (b->bits[e/LONG_BIT] & (1ul << (e%LONG_BIT))) ? 1: 0; } void starpu_bitmap_or(struct starpu_bitmap * a, struct starpu_bitmap * b) { if(a->size < b->size) { _STARPU_REALLOC(a->bits, b->size * sizeof(unsigned long)); memset(a->bits + a->size, 0, (b->size - a->size) * sizeof(unsigned long)); a->size = b->size; } int i; for(i = 0; i < b->size; i++) { a->bits[i] |= b->bits[i]; } a->cardinal = 0; for(i = 0; i < a->size; i++) a->cardinal += _count_bit(a->bits[i]); } int starpu_bitmap_and_get(struct starpu_bitmap * b1, struct starpu_bitmap * b2, int e) { return starpu_bitmap_get(b1,e) && starpu_bitmap_get(b2,e); } int starpu_bitmap_cardinal(struct starpu_bitmap * b) { return b->cardinal; } static inline int get_first_bit_rank(unsigned long ms) { STARPU_ASSERT(ms != 0); #if (__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4)) return __builtin_ffsl(ms) - 1; #else unsigned long m = 1ul; int i = 0; while(!(m&ms)) i++,m<<=1; return i; #endif } static inline int get_last_bit_rank(unsigned long l) { STARPU_ASSERT(l != 0); #if (__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4)) return 8*sizeof(l) - __builtin_clzl(l); #else int ibit = LONG_BIT - 1; while((!(1ul << ibit)) & l) ibit--; STARPU_ASSERT(ibit >= 0); return ibit; #endif } int starpu_bitmap_first(struct starpu_bitmap * b) { int i = 0; while(i < b->size && !b->bits[i]) i++; if( i == b->size) return -1; int nb_long = i; unsigned long ms = b->bits[i]; return (nb_long * LONG_BIT) + get_first_bit_rank(ms); } int starpu_bitmap_has_next(struct starpu_bitmap * b, int e) { int nb_long = (e+1) / LONG_BIT; int nb_bit = (e+1) % LONG_BIT; unsigned long mask = (~0ul) << nb_bit; if(b->bits[nb_long] & mask) return 1; for(nb_long++; nb_long < b->size; nb_long++) if(b->bits[nb_long]) return 1; return 0; } int starpu_bitmap_last(struct starpu_bitmap * b) { if(b->cardinal == 0) return -1; int ilong; for(ilong = b->size - 1; ilong >= 0; ilong--) { if(b->bits[ilong]) break; } STARPU_ASSERT(ilong >= 0); unsigned long l = b->bits[ilong]; return ilong * LONG_BIT + get_last_bit_rank(l); } int starpu_bitmap_next(struct starpu_bitmap *b, int e) { int nb_long = e / LONG_BIT; int nb_bit = e % LONG_BIT; unsigned long rest = nb_bit == LONG_BIT - 1 ? 0 : (~0ul << (nb_bit + 1)) & b->bits[nb_long]; if(nb_bit != (LONG_BIT - 1) && rest) { int i = get_first_bit_rank(rest); STARPU_ASSERT(i >= 0 && i < LONG_BIT); return (nb_long * LONG_BIT) + i; } for(nb_long++;nb_long < b->size; nb_long++) if(b->bits[nb_long]) return nb_long * LONG_BIT + get_first_bit_rank(b->bits[nb_long]); return -1; } starpu-1.2.3+dfsg/src/common/config.h.in000066400000000000000000000454451320135501600200640ustar00rootroot00000000000000/* src/common/config.h.in. Generated from configure.ac by autoheader. */ /* enable FUT traces */ #undef CONFIG_FUT /* Define to 1 if you have the header file. */ #undef HAVE_AIO_H /* Define to 1 when `struct attribute_spec' has the `affects_type_identity' field. */ #undef HAVE_ATTRIBUTE_SPEC_AFFECTS_TYPE_IDENTITY /* Define to 1 if you have the header file. */ #undef HAVE_AYUDAME_H /* Define to 1 if you have the `clEnqueueMarkerWithWaitList' function. */ #undef HAVE_CLENQUEUEMARKERWITHWAITLIST /* Define to 1 if you have the `clGetExtensionFunctionAddressForPlatform' function. */ #undef HAVE_CLGETEXTENSIONFUNCTIONADDRESSFORPLATFORM /* Define to 1 if you have the `clock_gettime' function. */ #undef HAVE_CLOCK_GETTIME /* Define to 1 if you have the header file. */ #undef HAVE_CL_CL_EXT_H /* Define to 1 if you have the header file. */ #undef HAVE_CUDA_GL_INTEROP_H /* Peer transfers are supported in CUDA */ #undef HAVE_CUDA_MEMCPY_PEER /* Define to 1 if you have the header file. */ #undef HAVE_C_COMMON_H /* Define to 1 if you have the header file. */ #undef HAVE_C_FAMILY_C_COMMON_H /* Define to 1 if you have the header file. */ #undef HAVE_C_FAMILY_C_PRAGMA_H /* Define to 1 if you have the header file. */ #undef HAVE_C_PRAGMA_H /* Define to 1 if you have the declaration of `build_array_ref', and to 0 if you don't. */ #undef HAVE_DECL_BUILD_ARRAY_REF /* Define to 1 if you have the declaration of `build_call_expr_loc_array', and to 0 if you don't. */ #undef HAVE_DECL_BUILD_CALL_EXPR_LOC_ARRAY /* Define to 1 if you have the declaration of `build_call_expr_loc_vec', and to 0 if you don't. */ #undef HAVE_DECL_BUILD_CALL_EXPR_LOC_VEC /* Define to 1 if you have the declaration of `build_zero_cst', and to 0 if you don't. */ #undef HAVE_DECL_BUILD_ZERO_CST /* Define to 1 if you have the declaration of `builtin_decl_explicit', and to 0 if you don't. */ #undef HAVE_DECL_BUILTIN_DECL_EXPLICIT /* Define to 1 if you have the declaration of `cusparseSetStream', and to 0 if you don't. */ #undef HAVE_DECL_CUSPARSESETSTREAM /* Define to 1 if you have the declaration of `enable_fut_flush', and to 0 if you don't. */ #undef HAVE_DECL_ENABLE_FUT_FLUSH /* Define to 1 if you have the declaration of `fut_set_filename', and to 0 if you don't. */ #undef HAVE_DECL_FUT_SET_FILENAME /* Define to 1 if you have the declaration of `hwloc_cuda_get_device_osdev_by_index', and to 0 if you don't. */ #undef HAVE_DECL_HWLOC_CUDA_GET_DEVICE_OSDEV_BY_INDEX /* Define to 1 if you have the declaration of `ptr_derefs_may_alias_p', and to 0 if you don't. */ #undef HAVE_DECL_PTR_DEREFS_MAY_ALIAS_P /* Define to 1 if you have the declaration of `smpi_process_set_user_data', and to 0 if you don't. */ #undef HAVE_DECL_SMPI_PROCESS_SET_USER_DATA /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the `enable_fut_flush' function. */ #undef HAVE_ENABLE_FUT_FLUSH /* Define to 1 if you have the `fut_set_filename' function. */ #undef HAVE_FUT_SET_FILENAME /* Define to 1 if you have the `getrlimit' function. */ #undef HAVE_GETRLIMIT /* Define to 1 if you have the header file. */ #undef HAVE_GLPK_H /* Define to 1 if you have the `hwloc_topology_dup' function. */ #undef HAVE_HWLOC_TOPOLOGY_DUP /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_LEVELDB_DB_H /* Define to 1 if you have the `atlas' library (-latlas). */ #undef HAVE_LIBATLAS /* Define to 1 if you have the `cblas' library (-lcblas). */ #undef HAVE_LIBCBLAS /* Define to 1 if you have the `cusparse' library (-lcusparse). */ #undef HAVE_LIBCUSPARSE /* Define to 1 if you have the `gfortran' library (-lgfortran). */ #undef HAVE_LIBGFORTRAN /* Define to 1 if you have the `GL' library (-lGL). */ #undef HAVE_LIBGL /* Define to 1 if you have the `glpk' library (-lglpk). */ #undef HAVE_LIBGLPK /* Define to 1 if you have the `GLU' library (-lGLU). */ #undef HAVE_LIBGLU /* Define to 1 if you have the `glut' library (-lglut). */ #undef HAVE_LIBGLUT /* Define to 1 if you have the `goto' library (-lgoto). */ #undef HAVE_LIBGOTO /* Define to 1 if you have the `goto2' library (-lgoto2). */ #undef HAVE_LIBGOTO2 /* Define to 1 if you have the `ifcore' library (-lifcore). */ #undef HAVE_LIBIFCORE /* Define to 1 if you have the `leveldb' library (-lleveldb). */ #undef HAVE_LIBLEVELDB /* Define to 1 if you have the `pthread' library (-lpthread). */ #undef HAVE_LIBPTHREAD /* Define to 1 if you have the `RCCE_bigflags_nongory_nopwrmgmt' library (-lRCCE_bigflags_nongory_nopwrmgmt). */ #undef HAVE_LIBRCCE_BIGFLAGS_NONGORY_NOPWRMGMT /* Define to 1 if you have the `rt' library (-lrt). */ #undef HAVE_LIBRT /* Define to 1 if you have the `simgrid' library (-lsimgrid). */ #undef HAVE_LIBSIMGRID /* Define to 1 if you have the `ws2_32' library (-lws2_32). */ #undef HAVE_LIBWS2_32 /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_H /* Define to 1 if you have the `memalign' function. */ #undef HAVE_MEMALIGN /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `mkdtemp' function. */ #undef HAVE_MKDTEMP /* Define to 1 if you have the `mkostemp' function. */ #undef HAVE_MKOSTEMP /* Function MPI_Comm_f2c is available */ #undef HAVE_MPI_COMM_F2C /* Define to 1 if you have the `MSG_environment_get_routing_root' function. */ #undef HAVE_MSG_ENVIRONMENT_GET_ROUTING_ROOT /* Define to 1 if you have the `MSG_get_as_by_name' function. */ #undef HAVE_MSG_GET_AS_BY_NAME /* Define to 1 if you have the `MSG_host_get_speed' function. */ #undef HAVE_MSG_HOST_GET_SPEED /* Define to 1 if you have the `MSG_process_attach' function. */ #undef HAVE_MSG_PROCESS_ATTACH /* Define to 1 if you have the `MSG_process_join' function. */ #undef HAVE_MSG_PROCESS_JOIN /* Define to 1 if you have the `MSG_process_self_name' function. */ #undef HAVE_MSG_PROCESS_SELF_NAME /* Define to 1 if you have the `MSG_zone_get_by_name' function. */ #undef HAVE_MSG_ZONE_GET_BY_NAME /* Define to 1 if you have the `MSG_zone_get_hosts' function. */ #undef HAVE_MSG_ZONE_GET_HOSTS /* Define to 1 if you have the `posix_memalign' function. */ #undef HAVE_POSIX_MEMALIGN /* Define to 1 if you have the `poti_init_custom' function. */ #undef HAVE_POTI_INIT_CUSTOM /* Define to 1 if you have the `pread' function. */ #undef HAVE_PREAD /* Define to 1 if you have the `pthread_setaffinity_np' function. */ #undef HAVE_PTHREAD_SETAFFINITY_NP /* pthread_spin_lock is available */ #undef HAVE_PTHREAD_SPIN_LOCK /* Define to 1 if you have the `pwrite' function. */ #undef HAVE_PWRITE /* Define to 1 if you have the header file. */ #undef HAVE_SIMGRID_MSG_H /* Define to 1 if you have the `SIMIX_process_get_code' function. */ #undef HAVE_SIMIX_PROCESS_GET_CODE /* Define to 1 if you have the `smpi_process_set_user_data' function. */ #undef HAVE_SMPI_PROCESS_SET_USER_DATA /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `sysconf' function. */ #undef HAVE_SYSCONF /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the header file. */ #undef HAVE_VALGRIND_HELGRIND_H /* Define to 1 if you have the header file. */ #undef HAVE_VALGRIND_MEMCHECK_H /* Define to 1 if you have the header file. */ #undef HAVE_VALGRIND_VALGRIND_H /* Define to 1 if you have the `xbt_barrier_init' function. */ #undef HAVE_XBT_BARRIER_INIT /* Define to 1 if you have the `xbt_mutex_try_acquire' function. */ #undef HAVE_XBT_MUTEX_TRY_ACQUIRE /* Define to 1 if you have the header file. */ #undef HAVE_XBT_SYNCHRO_H /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* The size of `void *', as computed by sizeof. */ #undef SIZEOF_VOID_P /* use STARPU_ATLAS library */ #undef STARPU_ATLAS /* location of StarPU build directory */ #undef STARPU_BUILD_DIR /* enable debugging statements */ #undef STARPU_DEBUG /* enable developer warnings */ #undef STARPU_DEVEL /* Define to 1 to disable asynchronous copy between CPU and GPU devices */ #undef STARPU_DISABLE_ASYNCHRONOUS_COPY /* Define to 1 to disable asynchronous copy between CPU and CUDA devices */ #undef STARPU_DISABLE_ASYNCHRONOUS_CUDA_COPY /* Define to 1 to disable asynchronous copy between CPU and MIC devices */ #undef STARPU_DISABLE_ASYNCHRONOUS_MIC_COPY /* Define to 1 to disable asynchronous copy between CPU and OpenCL devices */ #undef STARPU_DISABLE_ASYNCHRONOUS_OPENCL_COPY /* enable statistics */ #undef STARPU_ENABLE_STATS /* display verbose debug messages */ #undef STARPU_EXTRA_VERBOSE /* enable additional locking systems FxT traces */ #undef STARPU_FXT_LOCK_TRACES /* Path to the GNU debugger. */ #undef STARPU_GDB_PATH /* use STARPU_GOTO library */ #undef STARPU_GOTO /* Define to 1 if CUDA device properties include BusID */ #undef STARPU_HAVE_BUSID /* cufftDoubleComplex is available */ #undef STARPU_HAVE_CUFFTDOUBLECOMPLEX /* CURAND is available */ #undef STARPU_HAVE_CURAND /* Define this on darwin. */ #undef STARPU_HAVE_DARWIN /* Define to 1 if CUDA device properties include DomainID */ #undef STARPU_HAVE_DOMAINID /* Define to 1 if you have the header file. */ #undef STARPU_HAVE_F77_H /* Define this if a Fortran compiler is available */ #undef STARPU_HAVE_FC /* Define to 1 if you have the libfftw3 library. */ #undef STARPU_HAVE_FFTW /* Define to 1 if you have the libfftw3f library. */ #undef STARPU_HAVE_FFTWF /* Define to 1 if you have the libfftw3l library. */ #undef STARPU_HAVE_FFTWL /* Define to 1 if you have the header file. */ #undef STARPU_HAVE_GLPK_H /* Define to 1 if you have the header file. */ #undef STARPU_HAVE_HELGRIND_H /* Define to 1 if you have the hwloc library. */ #undef STARPU_HAVE_HWLOC /* Define this if icc is available */ #undef STARPU_HAVE_ICC /* Define to 1 if you have the header file. */ #undef STARPU_HAVE_LEVELDB /* libnuma is available */ #undef STARPU_HAVE_LIBNUMA /* Define to 1 if you have the MAGMA library. */ #undef STARPU_HAVE_MAGMA /* Define to 1 if you have the header file. */ #undef STARPU_HAVE_MALLOC_H /* Define to 1 if you have the `memalign' function. */ #undef STARPU_HAVE_MEMALIGN /* Define to 1 if you have the header file. */ #undef STARPU_HAVE_MEMCHECK_H /* Define to 1 if the function nearbyintf is available. */ #undef STARPU_HAVE_NEARBYINTF /* Define to 1 if you have the `posix_memalign' function. */ #undef STARPU_HAVE_POSIX_MEMALIGN /* Define to 1 if you have libpoti */ #undef STARPU_HAVE_POTI /* pthread_barrier is available */ #undef STARPU_HAVE_PTHREAD_BARRIER /* pthread_setname_np is available */ #undef STARPU_HAVE_PTHREAD_SETNAME_NP /* pthread_spin_lock is available */ #undef STARPU_HAVE_PTHREAD_SPIN_LOCK /* Define to 1 if the function rintf is available. */ #undef STARPU_HAVE_RINTF /* Define to 1 if the function sched_yield is available. */ #undef STARPU_HAVE_SCHED_YIELD /* Define to 1 if the function setenv is available. */ #undef STARPU_HAVE_SETENV /* Define to 1 if you have msg.h in simgrid/. */ #undef STARPU_HAVE_SIMGRID_MSG_H /* statement expressions are available */ #undef STARPU_HAVE_STATEMENT_EXPRESSIONS /* Define to 1 if the function strerro_r is available. */ #undef STARPU_HAVE_STRERROR_R /* struct timespec is defined */ #undef STARPU_HAVE_STRUCT_TIMESPEC /* Define to 1 if the target supports __sync_bool_compare_and_swap */ #undef STARPU_HAVE_SYNC_BOOL_COMPARE_AND_SWAP /* Define to 1 if the target supports __sync_fetch_and_add */ #undef STARPU_HAVE_SYNC_FETCH_AND_ADD /* Define to 1 if the target supports __sync_fetch_and_or */ #undef STARPU_HAVE_SYNC_FETCH_AND_OR /* Define to 1 if the target supports __sync_lock_test_and_set */ #undef STARPU_HAVE_SYNC_LOCK_TEST_AND_SET /* Define to 1 if the target supports __sync_synchronize */ #undef STARPU_HAVE_SYNC_SYNCHRONIZE /* Define to 1 if the target supports __sync_val_compare_and_swap */ #undef STARPU_HAVE_SYNC_VAL_COMPARE_AND_SWAP /* Define to 1 if you have the header file. */ #undef STARPU_HAVE_UNISTD_H /* Define to 1 if the function unsetenv is available. */ #undef STARPU_HAVE_UNSETENV /* Define to 1 if you have the header file. */ #undef STARPU_HAVE_VALGRIND_H /* Define this on windows. */ #undef STARPU_HAVE_WINDOWS /* enable X11 */ #undef STARPU_HAVE_X11 /* Define to 1 if you have synchro.h in xbt/. */ #undef STARPU_HAVE_XBT_SYNCHRO_H /* calibration heuristic value */ #undef STARPU_HISTORYMAXERROR /* Define to the directory where StarPU's headers are installed. */ #undef STARPU_INCLUDE_DIR /* Define to 1 on Linux */ #undef STARPU_LINUX_SYS /* enable long check */ #undef STARPU_LONG_CHECK /* Major version number of StarPU. */ #undef STARPU_MAJOR_VERSION /* Maximum number of CPUs supported */ #undef STARPU_MAXCPUS /* maximum number of CUDA devices */ #undef STARPU_MAXCUDADEVS /* maximum number of implementations */ #undef STARPU_MAXIMPLEMENTATIONS /* maximum number of MIC cores */ #undef STARPU_MAXMICCORES /* maximum number of MIC devices */ #undef STARPU_MAXMICDEVS /* maximum number of message-passing kernels */ #undef STARPU_MAXMPKERNELS /* maximum number of memory nodes */ #undef STARPU_MAXNODES /* maximum number of OPENCL devices */ #undef STARPU_MAXOPENCLDEVS /* maximum number of SCC devices */ #undef STARPU_MAXSCCDEVS /* enable memory stats */ #undef STARPU_MEMORY_STATS /* MIC RMA transfer is enable */ #undef STARPU_MIC_USE_RMA /* Minor version number of StarPU. */ #undef STARPU_MINOR_VERSION /* use MKL library */ #undef STARPU_MKL /* enable performance model debug */ #undef STARPU_MODEL_DEBUG /* enable StarPU MPI activity polling method */ #undef STARPU_MPI_ACTIVITY /* display MPI verbose debug messages */ #undef STARPU_MPI_EXTRA_VERBOSE /* display MPI verbose debug messages */ #undef STARPU_MPI_VERBOSE /* Using native windows threads */ #undef STARPU_NATIVE_WINTHREADS /* enable new check */ #undef STARPU_NEW_CHECK /* how many buffers can be manipulated per task */ #undef STARPU_NMAXBUFS /* Maximum number of workers */ #undef STARPU_NMAXWORKERS /* Maximum number of worker combinations */ #undef STARPU_NMAX_COMBINEDWORKERS /* Maximum number of sched_ctxs supported */ #undef STARPU_NMAX_SCHED_CTXS /* drivers must progress */ #undef STARPU_NON_BLOCKING_DRIVERS /* disable assertions */ #undef STARPU_NO_ASSERT /* Define to 1 on OpenBSD systems */ #undef STARPU_OPENBSD_SYS /* Define this to enable using an OpenCL simulator */ #undef STARPU_OPENCL_SIMULATOR /* enable OpenGL rendering of some examples */ #undef STARPU_OPENGL_RENDER /* Define this to enable OpenMP runtime support */ #undef STARPU_OPENMP /* enable performance debug */ #undef STARPU_PERF_DEBUG /* performance models location */ #undef STARPU_PERF_MODEL_DIR /* enable quick check */ #undef STARPU_QUICK_CHECK /* Release version number of StarPU. */ #undef STARPU_RELEASE_VERSION /* enable debug sc_hypervisor */ #undef STARPU_SC_HYPERVISOR_DEBUG /* Define this to enable simgrid execution */ #undef STARPU_SIMGRID /* Define to 1 if you have the `SIMIX_process_get_code' function. */ #undef STARPU_SIMGRID_HAVE_SIMIX_PROCESS_GET_CODE /* Define to 1 if you have the `xbt_barrier_init' function. */ #undef STARPU_SIMGRID_HAVE_XBT_BARRIER_INIT /* check spinlock use */ #undef STARPU_SPINLOCK_CHECK /* location of StarPU sources */ #undef STARPU_SRC_DIR /* use user defined library */ #undef STARPU_SYSTEM_BLAS /* enable data allocation cache */ #undef STARPU_USE_ALLOCATION_CACHE /* Define to 1 if Ayudame 1 is available and should be used */ #undef STARPU_USE_AYUDAME1 /* Define to 1 if Ayudame 2 is available and should be used */ #undef STARPU_USE_AYUDAME2 /* CPU driver is activated */ #undef STARPU_USE_CPU /* CUDA support is activated */ #undef STARPU_USE_CUDA /* Define to 1 if drandr48 is available and should be used */ #undef STARPU_USE_DRAND48 /* Define to 1 if erandr48_r is available */ #undef STARPU_USE_ERAND48_R /* enable FxT traces */ #undef STARPU_USE_FXT /* MIC workers support is enabled */ #undef STARPU_USE_MIC /* Message-passing SINKs support is enabled */ #undef STARPU_USE_MP /* whether the StarPU MPI library is available */ #undef STARPU_USE_MPI /* OpenCL support is activated */ #undef STARPU_USE_OPENCL /* SCC support is enabled */ #undef STARPU_USE_SCC /* enable sc_hypervisor lib */ #undef STARPU_USE_SC_HYPERVISOR /* StarPU-Top is activated */ #undef STARPU_USE_TOP /* Define to 1 to disable STARPU_SKIP_IF_VALGRIND when running tests. */ #undef STARPU_VALGRIND_FULL /* display verbose debug messages */ #undef STARPU_VERBOSE /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Define to 1 if the X Window System is missing or not being used. */ #undef X_DISPLAY_MISSING /* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is supported directly. */ #undef restrict /* Work around a bug in Sun C++: it does not support _Restrict or __restrict__, even though the corresponding Sun C compiler ends up with "#define restrict _Restrict" or "#define restrict __restrict__" in the previous line. Perhaps some future version of Sun C++ will work with restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ #if defined __SUNPRO_CC && !defined __RESTRICT # define _Restrict # define __restrict__ #endif #if defined(STARPU_DEVEL) && defined(BUILDING_STARPU) # ifndef STARPU_CHECKED_UNISTD_H # define STARPU_CHECKED_UNISTD_H # ifdef _UNISTD_H # define _UNISTD_H PLEASE_DONT_INCLUDE_IT # error Please do not unconditionally include unistd.h, it is not available on Windows, include config.h and test for HAVE_UNISTD_H # endif # endif #endif starpu-1.2.3+dfsg/src/common/fxt.c000066400000000000000000000141511320135501600167740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #ifdef STARPU_USE_FXT #include #include #ifdef STARPU_HAVE_WINDOWS #include #endif #ifdef __linux__ #include /* for SYS_gettid */ #elif defined(__FreeBSD__) #include /* for thr_self() */ #endif static char _STARPU_PROF_FILE_USER[128]; int _starpu_fxt_started = 0; starpu_pthread_mutex_t _starpu_fxt_started_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; starpu_pthread_cond_t _starpu_fxt_started_cond = STARPU_PTHREAD_COND_INITIALIZER; static int _starpu_written = 0; static int _starpu_id; static unsigned int initial_key_mask = FUT_KEYMASKALL; #ifdef STARPU_SIMGRID /* Give virtual time to FxT */ uint64_t fut_getstamp(void) { return starpu_timing_now()*1000.; } #endif long _starpu_gettid(void) { /* TODO: test at configure whether __thread is available, and use that * to cache the value. * Don't use the TSD, this is getting called before we would have the * time to allocate it. */ #ifdef STARPU_SIMGRID return (uintptr_t) MSG_process_self(); #else #if defined(__linux__) return syscall(SYS_gettid); #elif defined(__FreeBSD__) long tid; thr_self(&tid); return tid; #elif defined(_WIN32) && !defined(__CYGWIN__) return (long) GetCurrentThreadId(); #else return (long) pthread_self(); #endif #endif } static void _starpu_profile_set_tracefile(void) { char *user; char *fxt_prefix = starpu_getenv("STARPU_FXT_PREFIX"); if (!fxt_prefix) fxt_prefix = "/tmp/"; user = starpu_getenv("USER"); if (!user) user = ""; char suffix[128]; snprintf(suffix, 128, "prof_file_%s_%d", user, _starpu_id); snprintf(_STARPU_PROF_FILE_USER, sizeof(_STARPU_PROF_FILE_USER), "%s%s", fxt_prefix, suffix); } void starpu_profiling_set_id(int new_id) { _STARPU_DEBUG("Set id to <%d>\n", new_id); _starpu_id = new_id; _starpu_profile_set_tracefile(); #ifdef HAVE_FUT_SET_FILENAME fut_set_filename(_STARPU_PROF_FILE_USER); #endif } void starpu_fxt_autostart_profiling(int autostart) { if (autostart) initial_key_mask = FUT_KEYMASKALL; else initial_key_mask = FUT_KEYMASK0; } void starpu_fxt_start_profiling() { unsigned threadid = _starpu_gettid(); fut_keychange(FUT_ENABLE, FUT_KEYMASKALL, threadid); _STARPU_TRACE_EVENT("start_profiling"); } void starpu_fxt_stop_profiling() { unsigned threadid = _starpu_gettid(); _STARPU_TRACE_EVENT("stop_profiling"); fut_keychange(FUT_DISABLE, FUT_KEYMASKALL, threadid); } void _starpu_fxt_init_profiling(unsigned trace_buffer_size) { unsigned threadid; if (!starpu_get_env_number_default("STARPU_FXT_TRACE", 1)) return; STARPU_PTHREAD_MUTEX_LOCK(&_starpu_fxt_started_mutex); STARPU_ASSERT(!_starpu_fxt_started); _starpu_fxt_started = 1; _starpu_written = 0; _starpu_profile_set_tracefile(); #ifdef HAVE_FUT_SET_FILENAME fut_set_filename(_STARPU_PROF_FILE_USER); #endif #ifdef HAVE_ENABLE_FUT_FLUSH // when the event buffer is full, fxt stops recording events. // The trace may thus be incomplete. // Enable the fut_flush function which is called when the // fxt event buffer is full to flush the buffer to disk, // therefore allowing to record the remaining events. enable_fut_flush(); #endif threadid = _starpu_gettid(); atexit(_starpu_stop_fxt_profiling); if (fut_setup(trace_buffer_size / sizeof(unsigned long), initial_key_mask, threadid) < 0) { perror("fut_setup"); STARPU_ABORT(); } STARPU_PTHREAD_COND_BROADCAST(&_starpu_fxt_started_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_fxt_started_mutex); return; } static void _starpu_generate_paje_trace(char *input_fxt_filename, char *output_paje_filename) { /* We take default options */ struct starpu_fxt_options options; starpu_fxt_options_init(&options); /* TODO parse some STARPU_GENERATE_TRACE_OPTIONS env variable */ options.ninputfiles = 1; options.filenames[0] = input_fxt_filename; options.out_paje_path = output_paje_filename; options.file_prefix = ""; options.file_rank = -1; starpu_fxt_generate_trace(&options); } void _starpu_stop_fxt_profiling(void) { if (!_starpu_fxt_started) return; if (!_starpu_written) { #ifdef STARPU_VERBOSE char hostname[128]; gethostname(hostname, 128); _STARPU_MSG("Writing FxT traces into file %s:%s\n", hostname, _STARPU_PROF_FILE_USER); #endif fut_endup(_STARPU_PROF_FILE_USER); /* Should we generate a Paje trace directly ? */ int generate_trace = starpu_get_env_number("STARPU_GENERATE_TRACE"); if (generate_trace == 1) _starpu_generate_paje_trace(_STARPU_PROF_FILE_USER, "paje.trace"); int ret = fut_done(); if (ret < 0) { /* Something went wrong with the FxT trace (eg. there * was too many events) */ _STARPU_MSG("Warning: the FxT trace could not be generated properly\n"); } _starpu_written = 1; _starpu_fxt_started = 0; } } void _starpu_fxt_register_thread(unsigned cpuid) { FUT_DO_PROBE2(FUT_NEW_LWP_CODE, cpuid, _starpu_gettid()); } #else // STARPU_USE_FXT void starpu_fxt_autostart_profiling(int autostart STARPU_ATTRIBUTE_UNUSED) { } void starpu_fxt_start_profiling() { } void starpu_fxt_stop_profiling() { } #endif // STARPU_USE_FXT void starpu_fxt_trace_user_event(unsigned long code STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_USE_FXT _STARPU_TRACE_USER_EVENT(code); #endif } void starpu_fxt_trace_user_event_string(const char *s STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_USE_FXT _STARPU_TRACE_EVENT(s); #endif } starpu-1.2.3+dfsg/src/common/fxt.h000066400000000000000000001350041320135501600170020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __FXT_H__ #define __FXT_H__ #ifndef _GNU_SOURCE #define _GNU_SOURCE /* ou _BSD_SOURCE ou _SVID_SOURCE */ #endif #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include /* some key to identify the worker kind */ #define _STARPU_FUT_APPS_KEY 0x100 #define _STARPU_FUT_CPU_KEY 0x101 #define _STARPU_FUT_CUDA_KEY 0x102 #define _STARPU_FUT_OPENCL_KEY 0x103 #define _STARPU_FUT_MIC_KEY 0x104 #define _STARPU_FUT_SCC_KEY 0x105 #define _STARPU_FUT_WORKER_INIT_START 0x5100 #define _STARPU_FUT_WORKER_INIT_END 0x5101 #define _STARPU_FUT_START_CODELET_BODY 0x5102 #define _STARPU_FUT_END_CODELET_BODY 0x5103 #define _STARPU_FUT_JOB_PUSH 0x5104 #define _STARPU_FUT_JOB_POP 0x5105 #define _STARPU_FUT_UPDATE_TASK_CNT 0x5106 #define _STARPU_FUT_START_FETCH_INPUT 0x5107 #define _STARPU_FUT_END_FETCH_INPUT 0x5108 #define _STARPU_FUT_START_PUSH_OUTPUT 0x5109 #define _STARPU_FUT_END_PUSH_OUTPUT 0x5110 #define _STARPU_FUT_TAG 0x5111 #define _STARPU_FUT_TAG_DEPS 0x5112 #define _STARPU_FUT_TASK_DEPS 0x5113 #define _STARPU_FUT_DATA_COPY 0x5114 #define _STARPU_FUT_WORK_STEALING 0x5115 #define _STARPU_FUT_WORKER_DEINIT_START 0x5116 #define _STARPU_FUT_WORKER_DEINIT_END 0x5117 #define _STARPU_FUT_WORKER_SLEEP_START 0x5118 #define _STARPU_FUT_WORKER_SLEEP_END 0x5119 #define _STARPU_FUT_TASK_SUBMIT 0x511a #define _STARPU_FUT_CODELET_DATA_HANDLE 0x511b #define _STARPU_FUT_MODEL_NAME 0x511c #define _STARPU_FUT_DATA_NAME 0x511d #define _STARPU_FUT_DATA_COORDINATES 0x511e #define _STARPU_FUT_HANDLE_DATA_UNREGISTER 0x511f #define _STARPU_FUT_USER_DEFINED_START 0x5120 #define _STARPU_FUT_USER_DEFINED_END 0x5121 #define _STARPU_FUT_NEW_MEM_NODE 0x5122 #define _STARPU_FUT_START_CALLBACK 0x5123 #define _STARPU_FUT_END_CALLBACK 0x5124 #define _STARPU_FUT_TASK_DONE 0x5125 #define _STARPU_FUT_TAG_DONE 0x5126 #define _STARPU_FUT_START_ALLOC 0x5127 #define _STARPU_FUT_END_ALLOC 0x5128 #define _STARPU_FUT_START_ALLOC_REUSE 0x5129 #define _STARPU_FUT_END_ALLOC_REUSE 0x5130 #define _STARPU_FUT_USED_MEM 0x512a #define _STARPU_FUT_TASK_NAME 0x512b #define _STARPU_FUT_START_MEMRECLAIM 0x5131 #define _STARPU_FUT_END_MEMRECLAIM 0x5132 #define _STARPU_FUT_START_DRIVER_COPY 0x5133 #define _STARPU_FUT_END_DRIVER_COPY 0x5134 #define _STARPU_FUT_START_DRIVER_COPY_ASYNC 0x5135 #define _STARPU_FUT_END_DRIVER_COPY_ASYNC 0x5136 #define _STARPU_FUT_START_PROGRESS_ON_TID 0x5137 #define _STARPU_FUT_END_PROGRESS_ON_TID 0x5138 #define _STARPU_FUT_USER_EVENT 0x5139 #define _STARPU_FUT_SET_PROFILING 0x513a #define _STARPU_FUT_TASK_WAIT_FOR_ALL 0x513b #define _STARPU_FUT_EVENT 0x513c #define _STARPU_FUT_THREAD_EVENT 0x513d #define _STARPU_FUT_CODELET_DETAILS 0x513e #define _STARPU_FUT_CODELET_DATA 0x513f #define _STARPU_FUT_LOCKING_MUTEX 0x5140 #define _STARPU_FUT_MUTEX_LOCKED 0x5141 #define _STARPU_FUT_UNLOCKING_MUTEX 0x5142 #define _STARPU_FUT_MUTEX_UNLOCKED 0x5143 #define _STARPU_FUT_TRYLOCK_MUTEX 0x5144 #define _STARPU_FUT_RDLOCKING_RWLOCK 0x5145 #define _STARPU_FUT_RWLOCK_RDLOCKED 0x5146 #define _STARPU_FUT_WRLOCKING_RWLOCK 0x5147 #define _STARPU_FUT_RWLOCK_WRLOCKED 0x5148 #define _STARPU_FUT_UNLOCKING_RWLOCK 0x5149 #define _STARPU_FUT_RWLOCK_UNLOCKED 0x514a #define _STARPU_FUT_LOCKING_SPINLOCK 0x514b #define _STARPU_FUT_SPINLOCK_LOCKED 0x514c #define _STARPU_FUT_UNLOCKING_SPINLOCK 0x514d #define _STARPU_FUT_SPINLOCK_UNLOCKED 0x514e #define _STARPU_FUT_TRYLOCK_SPINLOCK 0x514f #define _STARPU_FUT_COND_WAIT_BEGIN 0x5150 #define _STARPU_FUT_COND_WAIT_END 0x5151 #define _STARPU_FUT_MEMORY_FULL 0x5152 #define _STARPU_FUT_DATA_LOAD 0x5153 #define _STARPU_FUT_START_UNPARTITION 0x5154 #define _STARPU_FUT_END_UNPARTITION 0x5155 #define _STARPU_FUT_START_FREE 0x5156 #define _STARPU_FUT_END_FREE 0x5157 #define _STARPU_FUT_START_WRITEBACK 0x5158 #define _STARPU_FUT_END_WRITEBACK 0x5159 #define _STARPU_FUT_SCHED_COMPONENT_PUSH_PRIO 0x515a #define _STARPU_FUT_SCHED_COMPONENT_POP_PRIO 0x515b #define _STARPU_FUT_START_WRITEBACK_ASYNC 0x515c #define _STARPU_FUT_END_WRITEBACK_ASYNC 0x515d #define _STARPU_FUT_HYPERVISOR_BEGIN 0x5160 #define _STARPU_FUT_HYPERVISOR_END 0x5161 #define _STARPU_FUT_BARRIER_WAIT_BEGIN 0x5162 #define _STARPU_FUT_BARRIER_WAIT_END 0x5163 #define _STARPU_FUT_WORKER_SCHEDULING_START 0x5164 #define _STARPU_FUT_WORKER_SCHEDULING_END 0x5165 #define _STARPU_FUT_WORKER_SCHEDULING_PUSH 0x5166 #define _STARPU_FUT_WORKER_SCHEDULING_POP 0x5167 #define _STARPU_FUT_START_EXECUTING 0x5168 #define _STARPU_FUT_END_EXECUTING 0x5169 #define _STARPU_FUT_SCHED_COMPONENT_NEW 0x516a #define _STARPU_FUT_SCHED_COMPONENT_CONNECT 0x516b #define _STARPU_FUT_SCHED_COMPONENT_PUSH 0x516c #define _STARPU_FUT_SCHED_COMPONENT_PULL 0x516d #define _STARPU_FUT_TASK_SUBMIT_START 0x516e #define _STARPU_FUT_TASK_SUBMIT_END 0x516f #define _STARPU_FUT_TASK_BUILD_START 0x5170 #define _STARPU_FUT_TASK_BUILD_END 0x5171 #define _STARPU_FUT_TASK_MPI_DECODE_START 0x5172 #define _STARPU_FUT_TASK_MPI_DECODE_END 0x5173 #define _STARPU_FUT_TASK_MPI_PRE_START 0x5174 #define _STARPU_FUT_TASK_MPI_PRE_END 0x5175 #define _STARPU_FUT_TASK_MPI_POST_START 0x5176 #define _STARPU_FUT_TASK_MPI_POST_END 0x5177 #define _STARPU_FUT_TASK_WAIT_START 0x5178 #define _STARPU_FUT_TASK_WAIT_END 0x5179 #define _STARPU_FUT_TASK_WAIT_FOR_ALL_START 0x517a #define _STARPU_FUT_TASK_WAIT_FOR_ALL_END 0x517b #define _STARPU_FUT_HANDLE_DATA_REGISTER 0x517c #define _STARPU_FUT_DATA_INVALIDATE 0x517d #define _STARPU_FUT_TASK_THROTTLE_START 0x5180 #define _STARPU_FUT_TASK_THROTTLE_END 0x5181 #ifdef STARPU_USE_FXT #include #include /* Some versions of FxT do not include the declaration of the function */ #ifdef HAVE_ENABLE_FUT_FLUSH #if !HAVE_DECL_ENABLE_FUT_FLUSH void enable_fut_flush(); #endif #endif #ifdef HAVE_FUT_SET_FILENAME #if !HAVE_DECL_FUT_SET_FILENAME void fut_set_filename(char *filename); #endif #endif extern int _starpu_fxt_started; extern starpu_pthread_mutex_t _starpu_fxt_started_mutex; extern starpu_pthread_cond_t _starpu_fxt_started_cond; long _starpu_gettid(void); /* Initialize the FxT library. */ void _starpu_fxt_init_profiling(unsigned trace_buffer_size); /* Stop the FxT library, and generate the trace file. */ void _starpu_stop_fxt_profiling(void); /* Associate the current processing unit to the identifier of the LWP that runs * the worker. */ void _starpu_fxt_register_thread(unsigned); #ifdef FUT_NEEDS_COMMIT #define _STARPU_FUT_COMMIT(size) fut_commitstampedbuffer(size) #else #define _STARPU_FUT_COMMIT(size) do { } while (0) #endif #ifdef FUT_DO_PROBE1STR #define _STARPU_FUT_DO_PROBE1STR(CODE, P1, str) FUT_DO_PROBE1STR(CODE, P1, str) #else /* Sometimes we need something a little more specific than the wrappers from * FxT: these macro permit to put add an event with 3 (or 4) numbers followed * by a string. */ #define _STARPU_FUT_DO_PROBE1STR(CODE, P1, str) \ do { \ if(fut_active) { \ /* No more than FXT_MAX_PARAMS args are allowed */ \ /* we add a \0 just in case ... */ \ size_t len = STARPU_MIN(strlen(str)+1, (FXT_MAX_PARAMS - 1)*sizeof(unsigned long));\ unsigned nbargs_str = (len + sizeof(unsigned long) - 1)/(sizeof(unsigned long));\ unsigned nbargs = 1 + nbargs_str; \ size_t total_len = FUT_SIZE(nbargs); \ unsigned long *futargs = \ fut_getstampedbuffer(FUT_CODE(CODE, nbargs), total_len);\ *(futargs++) = (unsigned long)(P1); \ snprintf((char *)futargs, len, "%s", str); \ ((char *)futargs)[len - 1] = '\0'; \ _STARPU_FUT_COMMIT(total_len); \ } \ } while (0); #endif #ifdef FUT_DO_PROBE2STR #define _STARPU_FUT_DO_PROBE2STR(CODE, P1, P2, str) FUT_DO_PROBE2STR(CODE, P1, P2, str) #else /* Sometimes we need something a little more specific than the wrappers from * FxT: these macro permit to put add an event with 3 (or 4) numbers followed * by a string. */ #define _STARPU_FUT_DO_PROBE2STR(CODE, P1, P2, str) \ do { \ if(fut_active) { \ /* No more than FXT_MAX_PARAMS args are allowed */ \ /* we add a \0 just in case ... */ \ size_t len = STARPU_MIN(strlen(str)+1, (FXT_MAX_PARAMS - 2)*sizeof(unsigned long));\ unsigned nbargs_str = (len + sizeof(unsigned long) - 1)/(sizeof(unsigned long));\ unsigned nbargs = 2 + nbargs_str; \ size_t total_len = FUT_SIZE(nbargs); \ unsigned long *futargs = \ fut_getstampedbuffer(FUT_CODE(CODE, nbargs), total_len);\ *(futargs++) = (unsigned long)(P1); \ *(futargs++) = (unsigned long)(P2); \ snprintf((char *)futargs, len, "%s", str); \ ((char *)futargs)[len - 1] = '\0'; \ _STARPU_FUT_COMMIT(total_len); \ } \ } while (0); #endif #ifdef FUT_DO_PROBE3STR #define _STARPU_FUT_DO_PROBE3STR(CODE, P1, P2, P3, str) FUT_DO_PROBE3STR(CODE, P1, P2, P3, str) #else #define _STARPU_FUT_DO_PROBE3STR(CODE, P1, P2, P3, str) \ do { \ if(fut_active) { \ /* No more than FXT_MAX_PARAMS args are allowed */ \ /* we add a \0 just in case ... */ \ size_t len = STARPU_MIN(strlen(str)+1, (FXT_MAX_PARAMS - 3)*sizeof(unsigned long));\ unsigned nbargs_str = (len + sizeof(unsigned long) - 1)/(sizeof(unsigned long));\ unsigned nbargs = 3 + nbargs_str; \ size_t total_len = FUT_SIZE(nbargs); \ unsigned long *futargs = \ fut_getstampedbuffer(FUT_CODE(CODE, nbargs), total_len);\ *(futargs++) = (unsigned long)(P1); \ *(futargs++) = (unsigned long)(P2); \ *(futargs++) = (unsigned long)(P3); \ snprintf((char *)futargs, len, "%s", str); \ ((char *)futargs)[len - 1] = '\0'; \ _STARPU_FUT_COMMIT(total_len); \ } \ } while (0); #endif #ifdef FUT_DO_PROBE4STR #define _STARPU_FUT_DO_PROBE4STR(CODE, P1, P2, P3, P4, str) FUT_DO_PROBE4STR(CODE, P1, P2, P3, P4, str) #else #define _STARPU_FUT_DO_PROBE4STR(CODE, P1, P2, P3, P4, str) \ do { \ if(fut_active) { \ /* No more than FXT_MAX_PARAMS args are allowed */ \ /* we add a \0 just in case ... */ \ size_t len = STARPU_MIN(strlen(str)+1, (FXT_MAX_PARAMS - 4)*sizeof(unsigned long));\ unsigned nbargs_str = (len + sizeof(unsigned long) - 1)/(sizeof(unsigned long));\ unsigned nbargs = 4 + nbargs_str; \ size_t total_len = FUT_SIZE(nbargs); \ unsigned long *futargs = \ fut_getstampedbuffer(FUT_CODE(CODE, nbargs), total_len);\ *(futargs++) = (unsigned long)(P1); \ *(futargs++) = (unsigned long)(P2); \ *(futargs++) = (unsigned long)(P3); \ *(futargs++) = (unsigned long)(P4); \ snprintf((char *)futargs, len, "%s", str); \ ((char *)futargs)[len - 1] = '\0'; \ _STARPU_FUT_COMMIT(total_len); \ } \ } while (0); #endif #ifdef FUT_DO_PROBE5STR #define _STARPU_FUT_DO_PROBE5STR(CODE, P1, P2, P3, P4, P5, str) FUT_DO_PROBE5STR(CODE, P1, P2, P3, P4, P5, str) #else #define _STARPU_FUT_DO_PROBE5STR(CODE, P1, P2, P3, P4, P5, str) \ do { \ if(fut_active) { \ /* No more than FXT_MAX_PARAMS args are allowed */ \ /* we add a \0 just in case ... */ \ size_t len = STARPU_MIN(strlen(str)+1, (FXT_MAX_PARAMS - 5)*sizeof(unsigned long));\ unsigned nbargs_str = (len + sizeof(unsigned long) - 1)/(sizeof(unsigned long));\ unsigned nbargs = 5 + nbargs_str; \ size_t total_len = FUT_SIZE(nbargs); \ unsigned long *futargs = \ fut_getstampedbuffer(FUT_CODE(CODE, nbargs), total_len);\ *(futargs++) = (unsigned long)(P1); \ *(futargs++) = (unsigned long)(P2); \ *(futargs++) = (unsigned long)(P3); \ *(futargs++) = (unsigned long)(P4); \ *(futargs++) = (unsigned long)(P5); \ snprintf((char *)futargs, len, "%s", str); \ ((char *)futargs)[len - 1] = '\0'; \ _STARPU_FUT_COMMIT(total_len); \ } \ } while (0); #endif #ifdef FUT_DO_PROBE6STR #define _STARPU_FUT_DO_PROBE6STR(CODE, P1, P2, P3, P4, P5, P6, str) FUT_DO_PROBE6STR(CODE, P1, P2, P3, P4, P5, P6, str) #else #define _STARPU_FUT_DO_PROBE6STR(CODE, P1, P2, P3, P4, P5, P6, str) \ do { \ if(fut_active) { \ /* No more than FXT_MAX_PARAMS args are allowed */ \ /* we add a \0 just in case ... */ \ size_t len = STARPU_MIN(strlen(str)+1, (FXT_MAX_PARAMS - 6)*sizeof(unsigned long));\ unsigned nbargs_str = (len + sizeof(unsigned long) - 1)/(sizeof(unsigned long));\ unsigned nbargs = 6 + nbargs_str; \ size_t total_len = FUT_SIZE(nbargs); \ unsigned long *futargs = \ fut_getstampedbuffer(FUT_CODE(CODE, nbargs), total_len);\ *(futargs++) = (unsigned long)(P1); \ *(futargs++) = (unsigned long)(P2); \ *(futargs++) = (unsigned long)(P3); \ *(futargs++) = (unsigned long)(P4); \ *(futargs++) = (unsigned long)(P5); \ *(futargs++) = (unsigned long)(P6); \ snprintf((char *)futargs, len, "%s", str); \ ((char *)futargs)[len - 1] = '\0'; \ _STARPU_FUT_COMMIT(total_len); \ } \ } while (0); #endif #ifdef FUT_DO_PROBE7STR #define _STARPU_FUT_DO_PROBE7STR(CODE, P1, P2, P3, P4, P5, P6, P7, str) FUT_DO_PROBE7STR(CODE, P1, P2, P3, P4, P5, P6, P7, str) #else #define _STARPU_FUT_DO_PROBE7STR(CODE, P1, P2, P3, P4, P5, P6, P7, str) \ do { \ if(fut_active) { \ /* No more than FXT_MAX_PARAMS args are allowed */ \ /* we add a \0 just in case ... */ \ size_t len = STARPU_MIN(strlen(str)+1, (FXT_MAX_PARAMS - 7)*sizeof(unsigned long));\ unsigned nbargs_str = (len + sizeof(unsigned long) - 1)/(sizeof(unsigned long));\ unsigned nbargs = 7 + nbargs_str; \ size_t total_len = FUT_SIZE(nbargs); \ unsigned long *futargs = \ fut_getstampedbuffer(FUT_CODE(CODE, nbargs), total_len);\ *(futargs++) = (unsigned long)(P1); \ *(futargs++) = (unsigned long)(P2); \ *(futargs++) = (unsigned long)(P3); \ *(futargs++) = (unsigned long)(P4); \ *(futargs++) = (unsigned long)(P5); \ *(futargs++) = (unsigned long)(P6); \ *(futargs++) = (unsigned long)(P7); \ snprintf((char *)futargs, len, "%s", str); \ ((char *)futargs)[len - 1] = '\0'; \ _STARPU_FUT_COMMIT(total_len); \ } \ } while (0); #endif #ifndef FUT_RAW_PROBE7 #define FUT_RAW_PROBE7(CODE,P1,P2,P3,P4,P5,P6,P7) do { \ if(fut_active) { \ unsigned long *__args __attribute__((unused))= \ fut_getstampedbuffer(CODE, \ FUT_SIZE(7)); \ *(__args++)=(unsigned long)(P1);*(__args++)=(unsigned long)(P2);*(__args++)=(unsigned long)(P3);*(__args++)=(unsigned long)(P4);*(__args++)=(unsigned long)(P5);*(__args++)=(unsigned long)(P6);*(__args++)=(unsigned long)(P7); \ _STARPU_FUT_COMMIT(FUT_SIZE(7)); \ } \ } while (0) #endif #ifndef FUT_DO_PROBE7 #define FUT_DO_PROBE7(CODE,P1,P2,P3,P4,P5,P6,P7) do { \ FUT_RAW_PROBE7(FUT_CODE(CODE, 7),P1,P2,P3,P4,P5,P6,P7); \ } while (0) #endif #ifndef FUT_RAW_ALWAYS_PROBE2 #define FUT_RAW_ALWAYS_PROBE2(CODE,P1,P2) do { \ unsigned long *__args __attribute__((unused))= \ fut_getstampedbuffer(CODE, \ FUT_SIZE(2)); \ *(__args++)=(unsigned long)(P1);*(__args++)=(unsigned long)(P2); \ fut_commitstampedbuffer(FUT_SIZE(2)); \ } while (0) #endif #define FUT_DO_ALWAYS_PROBE2(CODE,P1,P2) do { \ FUT_RAW_ALWAYS_PROBE2(FUT_CODE(CODE, 2),P1,P2); \ } while (0) #ifndef FUT_RAW_ALWAYS_PROBE3 #define FUT_RAW_ALWAYS_PROBE3(CODE,P1,P2,P3) do { \ unsigned long *__args __attribute__((unused))= \ fut_getstampedbuffer(CODE, \ FUT_SIZE(3)); \ *(__args++)=(unsigned long)(P1);*(__args++)=(unsigned long)(P2);*(__args++)=(unsigned long)(P3); \ fut_commitstampedbuffer(FUT_SIZE(3)); \ } while (0) #endif #define FUT_DO_ALWAYS_PROBE3(CODE,P1,P2,P3) do { \ FUT_RAW_ALWAYS_PROBE3(FUT_CODE(CODE, 3),P1,P2,P3); \ } while (0) #ifndef FUT_RAW_ALWAYS_PROBE4 #define FUT_RAW_ALWAYS_PROBE4(CODE,P1,P2,P3,P4) do { \ unsigned long *__args __attribute__((unused))= \ fut_getstampedbuffer(CODE, \ FUT_SIZE(4)); \ *(__args++)=(unsigned long)(P1);*(__args++)=(unsigned long)(P2);*(__args++)=(unsigned long)(P3);*(__args++)=(unsigned long)(P4); \ fut_commitstampedbuffer(FUT_SIZE(4)); \ } while (0) #endif #define FUT_DO_ALWAYS_PROBE4(CODE,P1,P2,P3,P4) do { \ FUT_RAW_ALWAYS_PROBE4(FUT_CODE(CODE, 4),P1,P2,P3,P4); \ } while (0) #ifndef FUT_RAW_ALWAYS_PROBE5 #define FUT_RAW_ALWAYS_PROBE5(CODE,P1,P2,P3,P4,P5) do { \ unsigned long *__args __attribute__((unused))= \ fut_getstampedbuffer(CODE, \ FUT_SIZE(5)); \ *(__args++)=(unsigned long)(P1);*(__args++)=(unsigned long)(P2);*(__args++)=(unsigned long)(P3);*(__args++)=(unsigned long)(P4);*(__args++)=(unsigned long)(P5); \ fut_commitstampedbuffer(FUT_SIZE(5)); \ } while (0) #endif #define FUT_DO_ALWAYS_PROBE5(CODE,P1,P2,P3,P4,P5) do { \ FUT_RAW_ALWAYS_PROBE5(FUT_CODE(CODE, 5),P1,P2,P3,P4,P5); \ } while (0) #ifndef FUT_RAW_ALWAYS_PROBE6 #define FUT_RAW_ALWAYS_PROBE6(CODE,P1,P2,P3,P4,P5,P6) do { \ unsigned long *__args __attribute__((unused))= \ fut_getstampedbuffer(CODE, \ FUT_SIZE(6)); \ *(__args++)=(unsigned long)(P1);*(__args++)=(unsigned long)(P2);*(__args++)=(unsigned long)(P3);*(__args++)=(unsigned long)(P4);*(__args++)=(unsigned long)(P5);*(__args++)=(unsigned long)(P6); \ fut_commitstampedbuffer(FUT_SIZE(6)); \ } while (0) #endif #define FUT_DO_ALWAYS_PROBE6(CODE,P1,P2,P3,P4,P5,P6) do { \ FUT_RAW_ALWAYS_PROBE6(FUT_CODE(CODE, 6),P1,P2,P3,P4,P5,P6); \ } while (0) #ifndef FUT_RAW_ALWAYS_PROBE7 #define FUT_RAW_ALWAYS_PROBE7(CODE,P1,P2,P3,P4,P5,P6,P7) do { \ unsigned long *__args __attribute__((unused))= \ fut_getstampedbuffer(CODE, \ FUT_SIZE(7)); \ *(__args++)=(unsigned long)(P1);*(__args++)=(unsigned long)(P2);*(__args++)=(unsigned long)(P3);*(__args++)=(unsigned long)(P4);*(__args++)=(unsigned long)(P5);*(__args++)=(unsigned long)(P6);*(__args++)=(unsigned long)(P7); \ fut_commitstampedbuffer(FUT_SIZE(7)); \ } while (0) #endif #define FUT_DO_ALWAYS_PROBE7(CODE,P1,P2,P3,P4,P5,P6,P7) do { \ FUT_RAW_ALWAYS_PROBE7(FUT_CODE(CODE, 7),P1,P2,P3,P4,P5,P6,P7); \ } while (0) /* workerkind = _STARPU_FUT_CPU_KEY for instance */ #define _STARPU_TRACE_NEW_MEM_NODE(nodeid) do {\ if (_starpu_fxt_started) \ FUT_DO_ALWAYS_PROBE2(_STARPU_FUT_NEW_MEM_NODE, nodeid, _starpu_gettid()); \ } while (0) #define _STARPU_TRACE_WORKER_INIT_START(workerkind, workerid, devid, memnode, bindid, sync) \ FUT_DO_PROBE7(_STARPU_FUT_WORKER_INIT_START, workerkind, workerid, devid, memnode, bindid, sync, _starpu_gettid()); #define _STARPU_TRACE_WORKER_INIT_END(__workerid) \ FUT_DO_PROBE2(_STARPU_FUT_WORKER_INIT_END, _starpu_gettid(), (__workerid)); #define _STARPU_TRACE_START_CODELET_BODY(job, nimpl, perf_arch, workerid) \ do { \ const char *model_name = _starpu_job_get_model_name((job)), *name = _starpu_job_get_task_name((job)); \ if (name) \ { \ /* we include the task name */ \ _STARPU_FUT_DO_PROBE5STR(_STARPU_FUT_START_CODELET_BODY, (job)->job_id, ((job)->task)->sched_ctx, workerid, starpu_worker_get_memory_node(workerid), 1, name); \ if (model_name && strcmp(model_name, name)) \ _STARPU_FUT_DO_PROBE1STR(_STARPU_FUT_MODEL_NAME, (job)->job_id, model_name); \ } \ else { \ FUT_DO_PROBE5(_STARPU_FUT_START_CODELET_BODY, (job)->job_id, ((job)->task)->sched_ctx, workerid, starpu_worker_get_memory_node(workerid), 0); \ } \ { \ if ((job)->task->cl) \ { \ const int __nbuffers = STARPU_TASK_GET_NBUFFERS((job)->task); \ char __buf[FXT_MAX_PARAMS*sizeof(long)]; \ int __i; \ for (__i = 0; __i < __nbuffers; __i++) \ { \ starpu_data_handle_t __handle = STARPU_TASK_GET_HANDLE((job)->task, __i); \ void *__interface = _STARPU_TASK_GET_INTERFACES((job)->task)[__i]; \ if (__handle->ops->describe) \ { \ __handle->ops->describe(__interface, __buf, sizeof(__buf)); \ _STARPU_FUT_DO_PROBE1STR(_STARPU_FUT_CODELET_DATA, workerid, __buf); \ } \ FUT_DO_PROBE4(_STARPU_FUT_CODELET_DATA_HANDLE, (job)->job_id, (__handle), _starpu_data_get_size(__handle), STARPU_TASK_GET_MODE((job)->task, __i)); \ } \ } \ const size_t __job_size = _starpu_job_get_data_size((job)->task->cl?(job)->task->cl->model:NULL, perf_arch, nimpl, (job)); \ const uint32_t __job_hash = _starpu_compute_buffers_footprint((job)->task->cl?(job)->task->cl->model:NULL, perf_arch, nimpl, (job));\ FUT_DO_PROBE7(_STARPU_FUT_CODELET_DETAILS, ((job)->task)->sched_ctx, __job_size, __job_hash, (job)->task->flops / 1000, (job)->task->tag_id, workerid, ((job)->job_id)); \ } \ } while(0); #define _STARPU_TRACE_END_CODELET_BODY(job, nimpl, perf_arch, workerid) \ do { \ const size_t job_size = _starpu_job_get_data_size((job)->task->cl?(job)->task->cl->model:NULL, perf_arch, nimpl, (job)); \ const uint32_t job_hash = _starpu_compute_buffers_footprint((job)->task->cl?(job)->task->cl->model:NULL, perf_arch, nimpl, (job));\ char _archname[32]=""; \ starpu_perfmodel_get_arch_name(perf_arch, _archname, 32, 0); \ _STARPU_FUT_DO_PROBE5STR(_STARPU_FUT_END_CODELET_BODY, (job)->job_id, (job_size), (job_hash), workerid, _starpu_gettid(), _archname); \ } while(0); #define _STARPU_TRACE_START_EXECUTING() \ FUT_DO_PROBE1(_STARPU_FUT_START_EXECUTING, _starpu_gettid()); #define _STARPU_TRACE_END_EXECUTING() \ FUT_DO_PROBE1(_STARPU_FUT_END_EXECUTING, _starpu_gettid()); #define _STARPU_TRACE_START_CALLBACK(job) \ FUT_DO_PROBE2(_STARPU_FUT_START_CALLBACK, job, _starpu_gettid()); #define _STARPU_TRACE_END_CALLBACK(job) \ FUT_DO_PROBE2(_STARPU_FUT_END_CALLBACK, job, _starpu_gettid()); #define _STARPU_TRACE_JOB_PUSH(task, prio) \ FUT_DO_PROBE3(_STARPU_FUT_JOB_PUSH, task, prio, _starpu_gettid()); #define _STARPU_TRACE_JOB_POP(task, prio) \ FUT_DO_PROBE3(_STARPU_FUT_JOB_POP, task, prio, _starpu_gettid()); #define _STARPU_TRACE_UPDATE_TASK_CNT(counter) \ FUT_DO_PROBE2(_STARPU_FUT_UPDATE_TASK_CNT, counter, _starpu_gettid()) #define _STARPU_TRACE_START_FETCH_INPUT(job) \ FUT_DO_PROBE2(_STARPU_FUT_START_FETCH_INPUT, job, _starpu_gettid()); #define _STARPU_TRACE_END_FETCH_INPUT(job) \ FUT_DO_PROBE2(_STARPU_FUT_END_FETCH_INPUT, job, _starpu_gettid()); #define _STARPU_TRACE_START_PUSH_OUTPUT(job) \ FUT_DO_PROBE2(_STARPU_FUT_START_PUSH_OUTPUT, job, _starpu_gettid()); #define _STARPU_TRACE_END_PUSH_OUTPUT(job) \ FUT_DO_PROBE2(_STARPU_FUT_END_PUSH_OUTPUT, job, _starpu_gettid()); #define _STARPU_TRACE_TAG(tag, job) \ FUT_DO_PROBE2(_STARPU_FUT_TAG, tag, (job)->job_id) #define _STARPU_TRACE_TAG_DEPS(tag_child, tag_father) \ FUT_DO_PROBE2(_STARPU_FUT_TAG_DEPS, tag_child, tag_father) #define _STARPU_TRACE_TASK_DEPS(job_prev, job_succ) \ FUT_DO_PROBE2(_STARPU_FUT_TASK_DEPS, (job_prev)->job_id, (job_succ)->job_id) #define _STARPU_TRACE_GHOST_TASK_DEPS(ghost_prev_id, job_succ_id) \ FUT_DO_PROBE2(_STARPU_FUT_TASK_DEPS, (ghost_prev_id), (job_succ_id)) #define _STARPU_TRACE_TASK_NAME(job) \ do { \ unsigned exclude_from_dag = (job)->exclude_from_dag; \ const char *model_name = _starpu_job_get_task_name((job)); \ if (model_name) \ { \ _STARPU_FUT_DO_PROBE4STR(_STARPU_FUT_TASK_NAME, (job)->job_id, _starpu_gettid(), (long unsigned)exclude_from_dag, 1, model_name);\ } \ else { \ FUT_DO_PROBE4(_STARPU_FUT_TASK_NAME, (job)->job_id, _starpu_gettid(), (long unsigned)exclude_from_dag, 0);\ } \ } while(0); #define _STARPU_TRACE_TASK_DONE(job) \ FUT_DO_PROBE2(_STARPU_FUT_TASK_DONE, (job)->job_id, _starpu_gettid()) #define _STARPU_TRACE_TAG_DONE(tag) \ do { \ struct _starpu_job *job = (tag)->job; \ const char *model_name = _starpu_job_get_task_name((job)); \ if (model_name) \ { \ _STARPU_FUT_DO_PROBE3STR(_STARPU_FUT_TAG_DONE, (tag)->id, _starpu_gettid(), 1, model_name); \ } \ else { \ FUT_DO_PROBE3(_STARPU_FUT_TAG_DONE, (tag)->id, _starpu_gettid(), 0);\ } \ } while(0); #define _STARPU_TRACE_DATA_NAME(handle, name) \ _STARPU_FUT_DO_PROBE1STR(_STARPU_FUT_DATA_NAME, handle, name) #define _STARPU_TRACE_DATA_COORDINATES(handle, dim, v) do {\ if (_starpu_fxt_started) \ switch (dim) { \ case 1: FUT_DO_ALWAYS_PROBE3(_STARPU_FUT_DATA_COORDINATES, handle, dim, v[0]); break; \ case 2: FUT_DO_ALWAYS_PROBE4(_STARPU_FUT_DATA_COORDINATES, handle, dim, v[0], v[1]); break; \ case 3: FUT_DO_ALWAYS_PROBE5(_STARPU_FUT_DATA_COORDINATES, handle, dim, v[0], v[1], v[2]); break; \ case 4: FUT_DO_ALWAYS_PROBE6(_STARPU_FUT_DATA_COORDINATES, handle, dim, v[0], v[1], v[2], v[3]); break; \ default: FUT_DO_ALWAYS_PROBE7(_STARPU_FUT_DATA_COORDINATES, handle, dim, v[0], v[1], v[2], v[3], v[4]); break; \ } \ } while (0) #define _STARPU_TRACE_DATA_COPY(src_node, dst_node, size) \ FUT_DO_PROBE3(_STARPU_FUT_DATA_COPY, src_node, dst_node, size) #define _STARPU_TRACE_START_DRIVER_COPY(src_node, dst_node, size, com_id, prefetch, handle) \ FUT_DO_PROBE6(_STARPU_FUT_START_DRIVER_COPY, src_node, dst_node, size, com_id, prefetch, handle) #define _STARPU_TRACE_END_DRIVER_COPY(src_node, dst_node, size, com_id, prefetch) \ FUT_DO_PROBE5(_STARPU_FUT_END_DRIVER_COPY, src_node, dst_node, size, com_id, prefetch) #define _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node) \ FUT_DO_PROBE2(_STARPU_FUT_START_DRIVER_COPY_ASYNC, src_node, dst_node) #define _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node) \ FUT_DO_PROBE2(_STARPU_FUT_END_DRIVER_COPY_ASYNC, src_node, dst_node) #define _STARPU_TRACE_WORK_STEALING(empty_q, victim_q) \ FUT_DO_PROBE2(_STARPU_FUT_WORK_STEALING, empty_q, victim_q) #define _STARPU_TRACE_WORKER_DEINIT_START \ FUT_DO_PROBE1(_STARPU_FUT_WORKER_DEINIT_START, _starpu_gettid()); #define _STARPU_TRACE_WORKER_DEINIT_END(workerkind) \ FUT_DO_PROBE2(_STARPU_FUT_WORKER_DEINIT_END, workerkind, _starpu_gettid()); #define _STARPU_TRACE_WORKER_SCHEDULING_START \ FUT_DO_PROBE1(_STARPU_FUT_WORKER_SCHEDULING_START, _starpu_gettid()); #define _STARPU_TRACE_WORKER_SCHEDULING_END \ FUT_DO_PROBE1(_STARPU_FUT_WORKER_SCHEDULING_END, _starpu_gettid()); #define _STARPU_TRACE_WORKER_SCHEDULING_PUSH \ FUT_DO_PROBE1(_STARPU_FUT_WORKER_SCHEDULING_PUSH, _starpu_gettid()); #define _STARPU_TRACE_WORKER_SCHEDULING_POP \ FUT_DO_PROBE1(_STARPU_FUT_WORKER_SCHEDULING_POP, _starpu_gettid()); #define _STARPU_TRACE_WORKER_SLEEP_START \ FUT_DO_PROBE1(_STARPU_FUT_WORKER_SLEEP_START, _starpu_gettid()); #define _STARPU_TRACE_WORKER_SLEEP_END \ FUT_DO_PROBE1(_STARPU_FUT_WORKER_SLEEP_END, _starpu_gettid()); #define _STARPU_TRACE_TASK_SUBMIT(job, iter, subiter) \ FUT_DO_PROBE4(_STARPU_FUT_TASK_SUBMIT, (job)->job_id, iter, subiter, _starpu_gettid()); #define _STARPU_TRACE_TASK_SUBMIT_START() \ FUT_DO_PROBE1(_STARPU_FUT_TASK_SUBMIT_START, _starpu_gettid()); #define _STARPU_TRACE_TASK_SUBMIT_END() \ FUT_DO_PROBE1(_STARPU_FUT_TASK_SUBMIT_END, _starpu_gettid()); #define _STARPU_TRACE_TASK_THROTTLE_START() \ FUT_DO_PROBE1(_STARPU_FUT_TASK_THROTTLE_START, _starpu_gettid()); #define _STARPU_TRACE_TASK_THROTTLE_END() \ FUT_DO_PROBE1(_STARPU_FUT_TASK_THROTTLE_END, _starpu_gettid()); #define _STARPU_TRACE_TASK_BUILD_START() \ FUT_DO_PROBE1(_STARPU_FUT_TASK_BUILD_START, _starpu_gettid()); #define _STARPU_TRACE_TASK_BUILD_END() \ FUT_DO_PROBE1(_STARPU_FUT_TASK_BUILD_END, _starpu_gettid()); #define _STARPU_TRACE_TASK_MPI_DECODE_START() \ FUT_DO_PROBE1(_STARPU_FUT_TASK_MPI_DECODE_START, _starpu_gettid()); #define _STARPU_TRACE_TASK_MPI_DECODE_END() \ FUT_DO_PROBE1(_STARPU_FUT_TASK_MPI_DECODE_END, _starpu_gettid()); #define _STARPU_TRACE_TASK_MPI_PRE_START() \ FUT_DO_PROBE1(_STARPU_FUT_TASK_MPI_PRE_START, _starpu_gettid()); #define _STARPU_TRACE_TASK_MPI_PRE_END() \ FUT_DO_PROBE1(_STARPU_FUT_TASK_MPI_PRE_END, _starpu_gettid()); #define _STARPU_TRACE_TASK_MPI_POST_START() \ FUT_DO_PROBE1(_STARPU_FUT_TASK_MPI_POST_START, _starpu_gettid()); #define _STARPU_TRACE_TASK_MPI_POST_END() \ FUT_DO_PROBE1(_STARPU_FUT_TASK_MPI_POST_END, _starpu_gettid()); #define _STARPU_TRACE_TASK_WAIT_START(job) \ FUT_DO_PROBE2(_STARPU_FUT_TASK_WAIT_START, (job)->job_id, _starpu_gettid()); #define _STARPU_TRACE_TASK_WAIT_END() \ FUT_DO_PROBE1(_STARPU_FUT_TASK_WAIT_END, _starpu_gettid()); #define _STARPU_TRACE_TASK_WAIT_FOR_ALL_START() \ FUT_DO_PROBE1(_STARPU_FUT_TASK_WAIT_FOR_ALL_START, _starpu_gettid()); #define _STARPU_TRACE_TASK_WAIT_FOR_ALL_END() \ FUT_DO_PROBE1(_STARPU_FUT_TASK_WAIT_FOR_ALL_END, _starpu_gettid()); #define _STARPU_TRACE_USER_DEFINED_START \ FUT_DO_PROBE1(_STARPU_FUT_USER_DEFINED_START, _starpu_gettid()); #define _STARPU_TRACE_USER_DEFINED_END \ FUT_DO_PROBE1(_STARPU_FUT_USER_DEFINED_END, _starpu_gettid()); #define _STARPU_TRACE_START_ALLOC(memnode, size) \ FUT_DO_PROBE3(_STARPU_FUT_START_ALLOC, memnode, _starpu_gettid(), size); #define _STARPU_TRACE_END_ALLOC(memnode) \ FUT_DO_PROBE2(_STARPU_FUT_END_ALLOC, memnode, _starpu_gettid()); #define _STARPU_TRACE_START_ALLOC_REUSE(memnode, size) \ FUT_DO_PROBE3(_STARPU_FUT_START_ALLOC_REUSE, memnode, _starpu_gettid(), size); #define _STARPU_TRACE_END_ALLOC_REUSE(memnode) \ FUT_DO_PROBE2(_STARPU_FUT_END_ALLOC_REUSE, memnode, _starpu_gettid()); #define _STARPU_TRACE_START_FREE(memnode, size) \ FUT_DO_PROBE3(_STARPU_FUT_START_FREE, memnode, _starpu_gettid(), size); #define _STARPU_TRACE_END_FREE(memnode) \ FUT_DO_PROBE2(_STARPU_FUT_END_FREE, memnode, _starpu_gettid()); #define _STARPU_TRACE_START_WRITEBACK(memnode) \ FUT_DO_PROBE2(_STARPU_FUT_START_WRITEBACK, memnode, _starpu_gettid()); #define _STARPU_TRACE_END_WRITEBACK(memnode) \ FUT_DO_PROBE2(_STARPU_FUT_END_WRITEBACK, memnode, _starpu_gettid()); #define _STARPU_TRACE_USED_MEM(memnode,used) \ FUT_DO_PROBE3(_STARPU_FUT_USED_MEM, memnode, used, _starpu_gettid()); #define _STARPU_TRACE_START_MEMRECLAIM(memnode,is_prefetch) \ FUT_DO_PROBE3(_STARPU_FUT_START_MEMRECLAIM, memnode, is_prefetch, _starpu_gettid()); #define _STARPU_TRACE_END_MEMRECLAIM(memnode, is_prefetch) \ FUT_DO_PROBE3(_STARPU_FUT_END_MEMRECLAIM, memnode, is_prefetch, _starpu_gettid()); #define _STARPU_TRACE_START_WRITEBACK_ASYNC(memnode) \ FUT_DO_PROBE2(_STARPU_FUT_START_WRITEBACK_ASYNC, memnode, _starpu_gettid()); #define _STARPU_TRACE_END_WRITEBACK_ASYNC(memnode) \ FUT_DO_PROBE2(_STARPU_FUT_END_WRITEBACK_ASYNC, memnode, _starpu_gettid()); /* We skip these events becasue they are called so often that they cause FxT to * fail and make the overall trace unreadable anyway. */ #define _STARPU_TRACE_START_PROGRESS(memnode) \ FUT_DO_PROBE2(_STARPU_FUT_START_PROGRESS_ON_TID, memnode, _starpu_gettid()); #define _STARPU_TRACE_END_PROGRESS(memnode) \ FUT_DO_PROBE2(_STARPU_FUT_END_PROGRESS_ON_TID, memnode, _starpu_gettid()); #define _STARPU_TRACE_USER_EVENT(code) \ FUT_DO_PROBE2(_STARPU_FUT_USER_EVENT, code, _starpu_gettid()); #define _STARPU_TRACE_SET_PROFILING(status) \ FUT_DO_PROBE2(_STARPU_FUT_SET_PROFILING, status, _starpu_gettid()); #define _STARPU_TRACE_TASK_WAIT_FOR_ALL \ FUT_DO_PROBE0(_STARPU_FUT_TASK_WAIT_FOR_ALL) #define _STARPU_TRACE_EVENT(S) \ FUT_DO_PROBESTR(_STARPU_FUT_EVENT,S) #define _STARPU_TRACE_THREAD_EVENT(S) \ _STARPU_FUT_DO_PROBE1STR(_STARPU_FUT_THREAD_EVENT, _starpu_gettid(), S) #define _STARPU_TRACE_HYPERVISOR_BEGIN() \ FUT_DO_PROBE1(_STARPU_FUT_HYPERVISOR_BEGIN, _starpu_gettid()); #define _STARPU_TRACE_HYPERVISOR_END() \ FUT_DO_PROBE1(_STARPU_FUT_HYPERVISOR_END, _starpu_gettid()); #ifdef STARPU_FXT_LOCK_TRACES #define _STARPU_TRACE_LOCKING_MUTEX() do { \ const char *file; \ file = strrchr(__FILE__,'/') + 1; \ _STARPU_FUT_DO_PROBE2STR(_STARPU_FUT_LOCKING_MUTEX,__LINE__,_starpu_gettid(),file); \ } while (0) #define _STARPU_TRACE_MUTEX_LOCKED() do { \ const char *file; \ file = strrchr(__FILE__,'/') + 1; \ _STARPU_FUT_DO_PROBE2STR(_STARPU_FUT_MUTEX_LOCKED,__LINE__,_starpu_gettid(),file); \ } while(0) #define _STARPU_TRACE_UNLOCKING_MUTEX() do { \ const char *file; \ file = strrchr(__FILE__,'/') + 1; \ _STARPU_FUT_DO_PROBE2STR(_STARPU_FUT_UNLOCKING_MUTEX,__LINE__,_starpu_gettid(),file); \ } while(0) #define _STARPU_TRACE_MUTEX_UNLOCKED() do {\ const char *file; \ file = strrchr(__FILE__,'/') + 1; \ _STARPU_FUT_DO_PROBE2STR(_STARPU_FUT_MUTEX_UNLOCKED,__LINE__,_starpu_gettid(),file); \ } while(0) #define _STARPU_TRACE_TRYLOCK_MUTEX() do { \ const char *file; \ file = strrchr(__FILE__,'/') + 1; \ _STARPU_FUT_DO_PROBE2STR(_STARPU_FUT_TRYLOCK_MUTEX,__LINE__,_starpu_gettid(),file); \ } while(0) #define _STARPU_TRACE_RDLOCKING_RWLOCK() do { \ const char *file; \ file = strrchr(__FILE__,'/') + 1; \ _STARPU_FUT_DO_PROBE2STR(_STARPU_FUT_RDLOCKING_RWLOCK,__LINE__,_starpu_gettid(),file); \ } while(0) #define _STARPU_TRACE_RWLOCK_RDLOCKED() do { \ const char *file; \ file = strrchr(__FILE__,'/') + 1; \ _STARPU_FUT_DO_PROBE2STR(_STARPU_FUT_RWLOCK_RDLOCKED,__LINE__,_starpu_gettid(),file); \ } while(0) #define _STARPU_TRACE_WRLOCKING_RWLOCK() do { \ const char *file; \ file = strrchr(__FILE__,'/') + 1; \ _STARPU_FUT_DO_PROBE2STR(_STARPU_FUT_WRLOCKING_RWLOCK,__LINE__,_starpu_gettid(),file); \ } while(0) #define _STARPU_TRACE_RWLOCK_WRLOCKED() do { \ const char *file; \ file = strrchr(__FILE__,'/') + 1; \ _STARPU_FUT_DO_PROBE2STR(_STARPU_FUT_RWLOCK_WRLOCKED,__LINE__,_starpu_gettid(),file); \ } while(0) #define _STARPU_TRACE_UNLOCKING_RWLOCK() do { \ const char *file; \ file = strrchr(__FILE__,'/') + 1; \ _STARPU_FUT_DO_PROBE2STR(_STARPU_FUT_UNLOCKING_RWLOCK,__LINE__,_starpu_gettid(),file); \ } while(0) #define _STARPU_TRACE_RWLOCK_UNLOCKED() do { \ const char *file; \ file = strrchr(__FILE__,'/') + 1; \ _STARPU_FUT_DO_PROBE2STR(_STARPU_FUT_RWLOCK_UNLOCKED,__LINE__,_starpu_gettid(),file); \ } while(0) #define STARPU_TRACE_SPINLOCK_CONDITITION (starpu_worker_get_type(starpu_worker_get_id()) == STARPU_CUDA_WORKER) #define _STARPU_TRACE_LOCKING_SPINLOCK(file, line) do {\ if (STARPU_TRACE_SPINLOCK_CONDITITION) { \ const char *xfile; \ xfile = strrchr(file,'/') + 1; \ _STARPU_FUT_DO_PROBE2STR(_STARPU_FUT_LOCKING_SPINLOCK,line,_starpu_gettid(),xfile); \ } \ } while(0) #define _STARPU_TRACE_SPINLOCK_LOCKED(file, line) do { \ if (STARPU_TRACE_SPINLOCK_CONDITITION) { \ const char *xfile; \ xfile = strrchr(file,'/') + 1; \ _STARPU_FUT_DO_PROBE2STR(_STARPU_FUT_SPINLOCK_LOCKED,line,_starpu_gettid(),xfile); \ } \ } while(0) #define _STARPU_TRACE_UNLOCKING_SPINLOCK(file, line) do { \ if (STARPU_TRACE_SPINLOCK_CONDITITION) { \ const char *xfile; \ xfile = strrchr(file,'/') + 1; \ _STARPU_FUT_DO_PROBE2STR(_STARPU_FUT_UNLOCKING_SPINLOCK,line,_starpu_gettid(),xfile); \ } \ } while(0) #define _STARPU_TRACE_SPINLOCK_UNLOCKED(file, line) do { \ if (STARPU_TRACE_SPINLOCK_CONDITITION) { \ const char *xfile; \ xfile = strrchr(file,'/') + 1; \ _STARPU_FUT_DO_PROBE2STR(_STARPU_FUT_SPINLOCK_UNLOCKED,line,_starpu_gettid(),xfile); \ } \ } while(0) #define _STARPU_TRACE_TRYLOCK_SPINLOCK(file, line) do { \ if (STARPU_TRACE_SPINLOCK_CONDITITION) { \ const char *xfile; \ xfile = strrchr(file,'/') + 1; \ _STARPU_FUT_DO_PROBE2STR(_STARPU_FUT_TRYLOCK_SPINLOCK,line,_starpu_gettid(),xfile); \ } \ } while(0) #define _STARPU_TRACE_COND_WAIT_BEGIN() do { \ const char *file; \ file = strrchr(__FILE__,'/') + 1; \ _STARPU_FUT_DO_PROBE2STR(_STARPU_FUT_COND_WAIT_BEGIN,__LINE__,_starpu_gettid(),file); \ } while(0) #define _STARPU_TRACE_COND_WAIT_END() do { \ const char *file; \ file = strrchr(__FILE__,'/') + 1; \ _STARPU_FUT_DO_PROBE2STR(_STARPU_FUT_COND_WAIT_END,__LINE__,_starpu_gettid(),file); \ } while(0) #define _STARPU_TRACE_BARRIER_WAIT_BEGIN() do { \ const char *file; \ file = strrchr(__FILE__,'/') + 1; \ _STARPU_FUT_DO_PROBE2STR(_STARPU_FUT_BARRIER_WAIT_BEGIN,__LINE__,_starpu_gettid(),file); \ } while(0) #define _STARPU_TRACE_BARRIER_WAIT_END() do { \ const char *file; \ file = strrchr(__FILE__,'/') + 1; \ _STARPU_FUT_DO_PROBE2STR(_STARPU_FUT_BARRIER_WAIT_END,__LINE__,_starpu_gettid(),file); \ } while(0) #else // !STARPU_FXT_LOCK_TRACES #define _STARPU_TRACE_LOCKING_MUTEX() do {} while(0) #define _STARPU_TRACE_MUTEX_LOCKED() do {} while(0) #define _STARPU_TRACE_UNLOCKING_MUTEX() do {} while(0) #define _STARPU_TRACE_MUTEX_UNLOCKED() do {} while(0) #define _STARPU_TRACE_TRYLOCK_MUTEX() do {} while(0) #define _STARPU_TRACE_RDLOCKING_RWLOCK() do {} while(0) #define _STARPU_TRACE_RWLOCK_RDLOCKED() do {} while(0) #define _STARPU_TRACE_WRLOCKING_RWLOCK() do {} while(0) #define _STARPU_TRACE_RWLOCK_WRLOCKED() do {} while(0) #define _STARPU_TRACE_UNLOCKING_RWLOCK() do {} while(0) #define _STARPU_TRACE_RWLOCK_UNLOCKED() do {} while(0) #define _STARPU_TRACE_LOCKING_SPINLOCK(file, line) do {} while(0) #define _STARPU_TRACE_SPINLOCK_LOCKED(file, line) do {} while(0) #define _STARPU_TRACE_UNLOCKING_SPINLOCK(file, line) do {} while(0) #define _STARPU_TRACE_SPINLOCK_UNLOCKED(file, line) do {} while(0) #define _STARPU_TRACE_TRYLOCK_SPINLOCK(file, line) do {} while(0) #define _STARPU_TRACE_COND_WAIT_BEGIN() do {} while(0) #define _STARPU_TRACE_COND_WAIT_END() do {} while(0) #define _STARPU_TRACE_BARRIER_WAIT_BEGIN() do {} while(0) #define _STARPU_TRACE_BARRIER_WAIT_END() do {} while(0) #endif // STARPU_FXT_LOCK_TRACES #define _STARPU_TRACE_MEMORY_FULL(size) \ FUT_DO_PROBE2(_STARPU_FUT_MEMORY_FULL,size,_starpu_gettid()); #define _STARPU_TRACE_DATA_LOAD(workerid,size) \ FUT_DO_PROBE2(_STARPU_FUT_DATA_LOAD, workerid, size); #define _STARPU_TRACE_START_UNPARTITION(handle, memnode) \ FUT_DO_PROBE3(_STARPU_FUT_START_UNPARTITION, memnode, _starpu_gettid(), handle); #define _STARPU_TRACE_END_UNPARTITION(handle, memnode) \ FUT_DO_PROBE3(_STARPU_FUT_END_UNPARTITION, memnode, _starpu_gettid(), handle); #define _STARPU_TRACE_SCHED_COMPONENT_PUSH_PRIO(workerid, ntasks, exp_len) \ FUT_DO_PROBE4(_STARPU_FUT_SCHED_COMPONENT_PUSH_PRIO, _starpu_gettid(), workerid, ntasks, exp_len); #define _STARPU_TRACE_SCHED_COMPONENT_POP_PRIO(workerid, ntasks, exp_len) \ FUT_DO_PROBE4(_STARPU_FUT_SCHED_COMPONENT_POP_PRIO, _starpu_gettid(), workerid, ntasks, exp_len); #define _STARPU_TRACE_SCHED_COMPONENT_NEW(component) \ _STARPU_FUT_DO_PROBE1STR(_STARPU_FUT_SCHED_COMPONENT_NEW, component, (component)->name); #define _STARPU_TRACE_SCHED_COMPONENT_CONNECT(parent, child) \ FUT_DO_PROBE2(_STARPU_FUT_SCHED_COMPONENT_CONNECT, parent, child); #define _STARPU_TRACE_SCHED_COMPONENT_PUSH(from, to, task) \ FUT_DO_PROBE5(_STARPU_FUT_SCHED_COMPONENT_PUSH, _starpu_gettid(), from, to, task, (task)->priority); #define _STARPU_TRACE_SCHED_COMPONENT_PULL(from, to, task) \ FUT_DO_PROBE5(_STARPU_FUT_SCHED_COMPONENT_PULL, _starpu_gettid(), from, to, task, (task)->priority); #define _STARPU_TRACE_HANDLE_DATA_REGISTER(handle) do { \ const size_t __data_size = handle->ops->get_size(handle); \ char __buf[(FXT_MAX_PARAMS-2)*sizeof(long)]; \ void *__interface = handle->per_node[0].data_interface; \ if (handle->ops->describe) \ handle->ops->describe(__interface, __buf, sizeof(__buf)); \ else \ __buf[0] = 0; \ FUT_DO_PROBE3STR(_STARPU_FUT_HANDLE_DATA_REGISTER, handle, __data_size, handle->home_node, __buf); \ } while (0) #define _STARPU_TRACE_HANDLE_DATA_UNREGISTER(handle) \ FUT_DO_PROBE1(_STARPU_FUT_HANDLE_DATA_UNREGISTER, handle) #if 0 #define _STARPU_TRACE_DATA_INVALIDATE(handle, node) \ FUT_DO_PROBE2(_STARPU_FUT_DATA_INVALIDATE, handle, node) #else #define _STARPU_TRACE_DATA_INVALIDATE(handle, node) do {} while (0) #endif #else // !STARPU_USE_FXT /* Dummy macros in case FxT is disabled */ #define _STARPU_TRACE_NEW_MEM_NODE(nodeid) do {} while(0) #define _STARPU_TRACE_WORKER_INIT_START(a,b,c,d,e,f) do {} while(0) #define _STARPU_TRACE_WORKER_INIT_END(workerid) do {} while(0) #define _STARPU_TRACE_START_CODELET_BODY(job, nimpl, perf_arch, workerid) do {} while(0) #define _STARPU_TRACE_END_CODELET_BODY(job, nimpl, perf_arch, workerid) do {} while(0) #define _STARPU_TRACE_START_EXECUTING() do {} while(0) #define _STARPU_TRACE_END_EXECUTING() do {} while(0) #define _STARPU_TRACE_START_CALLBACK(job) do {} while(0) #define _STARPU_TRACE_END_CALLBACK(job) do {} while(0) #define _STARPU_TRACE_JOB_PUSH(task, prio) do {} while(0) #define _STARPU_TRACE_JOB_POP(task, prio) do {} while(0) #define _STARPU_TRACE_UPDATE_TASK_CNT(counter) do {} while(0) #define _STARPU_TRACE_START_FETCH_INPUT(job) do {} while(0) #define _STARPU_TRACE_END_FETCH_INPUT(job) do {} while(0) #define _STARPU_TRACE_START_PUSH_OUTPUT(job) do {} while(0) #define _STARPU_TRACE_END_PUSH_OUTPUT(job) do {} while(0) #define _STARPU_TRACE_TAG(tag, job) do {} while(0) #define _STARPU_TRACE_TAG_DEPS(a, b) do {} while(0) #define _STARPU_TRACE_TASK_DEPS(a, b) do {} while(0) #define _STARPU_TRACE_GHOST_TASK_DEPS(a, b) do {} while(0) #define _STARPU_TRACE_TASK_NAME(a) do {} while(0) #define _STARPU_TRACE_TASK_DONE(a) do {} while(0) #define _STARPU_TRACE_TAG_DONE(a) do {} while(0) #define _STARPU_TRACE_DATA_NAME(a, b) do {} while(0) #define _STARPU_TRACE_DATA_COORDINATES(a, b, c) do {} while(0) #define _STARPU_TRACE_DATA_COPY(a, b, c) do {} while(0) #define _STARPU_TRACE_START_DRIVER_COPY(a,b,c,d,e,f) do {} while(0) #define _STARPU_TRACE_END_DRIVER_COPY(a,b,c,d,e) do {} while(0) #define _STARPU_TRACE_START_DRIVER_COPY_ASYNC(a,b) do {} while(0) #define _STARPU_TRACE_END_DRIVER_COPY_ASYNC(a,b) do {} while(0) #define _STARPU_TRACE_WORK_STEALING(a, b) do {} while(0) #define _STARPU_TRACE_WORKER_DEINIT_START do {} while(0) #define _STARPU_TRACE_WORKER_DEINIT_END(a) do {} while(0) #define _STARPU_TRACE_WORKER_SCHEDULING_START do {} while(0) #define _STARPU_TRACE_WORKER_SCHEDULING_END do {} while(0) #define _STARPU_TRACE_WORKER_SCHEDULING_PUSH do {} while(0) #define _STARPU_TRACE_WORKER_SCHEDULING_POP do {} while(0) #define _STARPU_TRACE_WORKER_SLEEP_START do {} while(0) #define _STARPU_TRACE_WORKER_SLEEP_END do {} while(0) #define _STARPU_TRACE_TASK_SUBMIT(job, a, b) do {} while(0) #define _STARPU_TRACE_TASK_SUBMIT_START() do {} while(0) #define _STARPU_TRACE_TASK_SUBMIT_END() do {} while(0) #define _STARPU_TRACE_TASK_THROTTLE_START() do {} while(0) #define _STARPU_TRACE_TASK_THROTTLE_END() do {} while(0) #define _STARPU_TRACE_TASK_BUILD_START() do {} while(0) #define _STARPU_TRACE_TASK_BUILD_END() do {} while(0) #define _STARPU_TRACE_TASK_MPI_DECODE_START() do {} while(0) #define _STARPU_TRACE_TASK_MPI_DECODE_END() do {} while(0) #define _STARPU_TRACE_TASK_MPI_PRE_START() do {} while(0) #define _STARPU_TRACE_TASK_MPI_PRE_END() do {} while(0) #define _STARPU_TRACE_TASK_MPI_POST_START() do {} while(0) #define _STARPU_TRACE_TASK_MPI_POST_END() do {} while(0) #define _STARPU_TRACE_TASK_WAIT_START(job) do {} while(0) #define _STARPU_TRACE_TASK_WAIT_END() do {} while(0) #define _STARPU_TRACE_TASK_WAIT_FOR_ALL_START() do {} while(0) #define _STARPU_TRACE_TASK_WAIT_FOR_ALL_END() do {} while(0) #define _STARPU_TRACE_USER_DEFINED_START do {} while(0) #define _STARPU_TRACE_USER_DEFINED_END do {} while(0) #define _STARPU_TRACE_START_ALLOC(memnode, size) do {} while(0) #define _STARPU_TRACE_END_ALLOC(memnode) do {} while(0) #define _STARPU_TRACE_START_ALLOC_REUSE(a, size) do {} while(0) #define _STARPU_TRACE_END_ALLOC_REUSE(a) do {} while(0) #define _STARPU_TRACE_START_FREE(memnode, size) do {} while(0) #define _STARPU_TRACE_END_FREE(memnode) do {} while(0) #define _STARPU_TRACE_START_WRITEBACK(memnode) do {} while(0) #define _STARPU_TRACE_END_WRITEBACK(memnode) do {} while(0) #define _STARPU_TRACE_USED_MEM(memnode,used) do {} while (0) #define _STARPU_TRACE_START_MEMRECLAIM(memnode,is_prefetch) do {} while(0) #define _STARPU_TRACE_END_MEMRECLAIM(memnode,is_prefetch) do {} while(0) #define _STARPU_TRACE_START_WRITEBACK_ASYNC(memnode) do {} while(0) #define _STARPU_TRACE_END_WRITEBACK_ASYNC(memnode) do {} while(0) #define _STARPU_TRACE_START_PROGRESS(memnode) do {} while(0) #define _STARPU_TRACE_END_PROGRESS(memnode) do {} while(0) #define _STARPU_TRACE_USER_EVENT(code) do {} while(0) #define _STARPU_TRACE_SET_PROFILING(status) do {} while(0) #define _STARPU_TRACE_TASK_WAIT_FOR_ALL do {} while(0) #define _STARPU_TRACE_EVENT(S) do {} while(0) #define _STARPU_TRACE_THREAD_EVENT(S) do {} while(0) #define _STARPU_TRACE_LOCKING_MUTEX() do {} while(0) #define _STARPU_TRACE_MUTEX_LOCKED() do {} while(0) #define _STARPU_TRACE_UNLOCKING_MUTEX() do {} while(0) #define _STARPU_TRACE_MUTEX_UNLOCKED() do {} while(0) #define _STARPU_TRACE_TRYLOCK_MUTEX() do {} while(0) #define _STARPU_TRACE_RDLOCKING_RWLOCK() do {} while(0) #define _STARPU_TRACE_RWLOCK_RDLOCKED() do {} while(0) #define _STARPU_TRACE_WRLOCKING_RWLOCK() do {} while(0) #define _STARPU_TRACE_RWLOCK_WRLOCKED() do {} while(0) #define _STARPU_TRACE_UNLOCKING_RWLOCK() do {} while(0) #define _STARPU_TRACE_RWLOCK_UNLOCKED() do {} while(0) #define _STARPU_TRACE_LOCKING_SPINLOCK(file, line) do {} while(0) #define _STARPU_TRACE_SPINLOCK_LOCKED(file, line) do {} while(0) #define _STARPU_TRACE_UNLOCKING_SPINLOCK(file, line) do {} while(0) #define _STARPU_TRACE_SPINLOCK_UNLOCKED(file, line) do {} while(0) #define _STARPU_TRACE_TRYLOCK_SPINLOCK(file, line) do {} while(0) #define _STARPU_TRACE_COND_WAIT_BEGIN() do {} while(0) #define _STARPU_TRACE_COND_WAIT_END() do {} while(0) #define _STARPU_TRACE_BARRIER_WAIT_BEGIN() do {} while(0) #define _STARPU_TRACE_BARRIER_WAIT_END() do {} while(0) #define _STARPU_TRACE_MEMORY_FULL(size) do {} while(0) #define _STARPU_TRACE_DATA_LOAD(workerid,size) do {} while(0) #define _STARPU_TRACE_START_UNPARTITION(handle, memnode) do {} while(0) #define _STARPU_TRACE_END_UNPARTITION(handle, memnode) do {} while(0) #define _STARPU_TRACE_SCHED_COMPONENT_PUSH_PRIO(workerid, ntasks, exp_len) do {} while(0) #define _STARPU_TRACE_SCHED_COMPONENT_POP_PRIO(workerid, ntasks, exp_len) do {} while(0) #define _STARPU_TRACE_HYPERVISOR_BEGIN() do {} while(0) #define _STARPU_TRACE_HYPERVISOR_END() do {} while(0) #define _STARPU_TRACE_SCHED_COMPONENT_NEW(component) do {} while (0) #define _STARPU_TRACE_SCHED_COMPONENT_CONNECT(parent, child) do {} while (0) #define _STARPU_TRACE_SCHED_COMPONENT_PUSH(from, to, task) do {} while (0) #define _STARPU_TRACE_SCHED_COMPONENT_PULL(from, to, task) do {} while (0) #define _STARPU_TRACE_HANDLE_DATA_REGISTER(handle) do {} while (0) #define _STARPU_TRACE_HANDLE_DATA_UNREGISTER(handle) do {} while (0) #define _STARPU_TRACE_DATA_INVALIDATE(handle, node) do {} while (0) #endif // STARPU_USE_FXT #endif // __FXT_H__ starpu-1.2.3+dfsg/src/common/graph.c000066400000000000000000000315151320135501600172770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2017 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This stores the task graph structure, to used by the schedulers which need * it. We do not always enable it since it is costly. To avoid interfering * too much with execution, it may be a bit outdated, i.e. still contain jobs * which have completed very recently. * * This is because we drop nodes lazily: when a job terminates, we just add the * node to the dropped list (to avoid having to take the mutex on the whole * graph). The graph gets updated whenever the graph mutex becomes available. */ #include #include #include /* Protects the whole task graph except the dropped list */ static starpu_pthread_rwlock_t graph_lock; /* Whether we should enable recording the task graph */ int _starpu_graph_record; /* This list contains all nodes without incoming dependency */ struct _starpu_graph_node_multilist_top top; /* This list contains all nodes without outgoing dependency */ struct _starpu_graph_node_multilist_bottom bottom; /* This list contains all nodes */ struct _starpu_graph_node_multilist_all all; /* Protects the dropped list, always taken before graph lock */ static starpu_pthread_mutex_t dropped_lock; /* This list contains all dropped nodes, i.e. the job terminated by the corresponding node is still int he graph */ struct _starpu_graph_node_multilist_dropped dropped; void _starpu_graph_init(void) { STARPU_PTHREAD_RWLOCK_INIT(&graph_lock, NULL); _starpu_graph_node_multilist_init_top(&top); _starpu_graph_node_multilist_init_bottom(&bottom); _starpu_graph_node_multilist_init_all(&all); STARPU_PTHREAD_MUTEX_INIT(&dropped_lock, NULL); _starpu_graph_node_multilist_init_dropped(&dropped); } void _starpu_graph_wrlock(void) { STARPU_PTHREAD_RWLOCK_WRLOCK(&graph_lock); } void _starpu_graph_drop_node(struct _starpu_graph_node *node); void _starpu_graph_drop_dropped_nodes(void) { struct _starpu_graph_node_multilist_dropped dropping; STARPU_PTHREAD_MUTEX_LOCK(&dropped_lock); /* Pick up the list of dropped nodes */ _starpu_graph_node_multilist_move_dropped(&dropped, &dropping); STARPU_PTHREAD_MUTEX_UNLOCK(&dropped_lock); /* And now process it if it's not empty. */ if (!_starpu_graph_node_multilist_empty_dropped(&dropping)) { struct _starpu_graph_node *node, *next; STARPU_PTHREAD_RWLOCK_WRLOCK(&graph_lock); for (node = _starpu_graph_node_multilist_begin_dropped(&dropping); node != _starpu_graph_node_multilist_end_dropped(&dropping); node = next) { next = _starpu_graph_node_multilist_next_dropped(node); _starpu_graph_drop_node(node); } STARPU_PTHREAD_RWLOCK_UNLOCK(&graph_lock); } } void _starpu_graph_wrunlock(void) { STARPU_PTHREAD_RWLOCK_UNLOCK(&graph_lock); _starpu_graph_drop_dropped_nodes(); } void _starpu_graph_rdlock(void) { STARPU_PTHREAD_RWLOCK_RDLOCK(&graph_lock); } void _starpu_graph_rdunlock(void) { STARPU_PTHREAD_RWLOCK_UNLOCK(&graph_lock); } static void __starpu_graph_foreach(void (*func)(void *data, struct _starpu_graph_node *node), void *data) { struct _starpu_graph_node *node; for (node = _starpu_graph_node_multilist_begin_all(&all); node != _starpu_graph_node_multilist_end_all(&all); node = _starpu_graph_node_multilist_next_all(node)) func(data, node); } /* Add a node to the graph */ void _starpu_graph_add_job(struct _starpu_job *job) { struct _starpu_graph_node *node; _STARPU_CALLOC(node, 1, sizeof(*node)); node->job = job; job->graph_node = node; STARPU_PTHREAD_MUTEX_INIT(&node->mutex, NULL); _starpu_graph_wrlock(); /* It does not have any dependency yet, add to all lists */ _starpu_graph_node_multilist_push_back_top(&top, node); _starpu_graph_node_multilist_push_back_bottom(&bottom, node); _starpu_graph_node_multilist_push_back_all(&all, node); _starpu_graph_wrunlock(); } /* Add a node to an array of nodes */ static unsigned add_node(struct _starpu_graph_node *node, struct _starpu_graph_node ***nodes, unsigned *n_nodes, unsigned *alloc_nodes, unsigned **slot) { unsigned ret; if (*n_nodes == *alloc_nodes) { if (*alloc_nodes) *alloc_nodes *= 2; else *alloc_nodes = 4; _STARPU_REALLOC(*nodes, *alloc_nodes * sizeof(**nodes)); if (slot) _STARPU_REALLOC(*slot, *alloc_nodes * sizeof(**slot)); } ret = (*n_nodes)++; (*nodes)[ret] = node; return ret; } /* Add a dependency between nodes */ void _starpu_graph_add_job_dep(struct _starpu_job *job, struct _starpu_job *prev_job) { unsigned rank_incoming, rank_outgoing; _starpu_graph_wrlock(); struct _starpu_graph_node *node = job->graph_node; struct _starpu_graph_node *prev_node = prev_job->graph_node; if (!node || !prev_node) { /* Already gone */ _starpu_graph_wrunlock(); return; } if (_starpu_graph_node_multilist_queued_bottom(prev_node)) /* Previous node is not at bottom any more */ _starpu_graph_node_multilist_erase_bottom(&bottom, prev_node); if (_starpu_graph_node_multilist_queued_top(node)) /* Next node is not at top any more */ _starpu_graph_node_multilist_erase_top(&top, node); rank_incoming = add_node(prev_node, &node->incoming, &node->n_incoming, &node->alloc_incoming, &node->incoming_slot); rank_outgoing = add_node(node, &prev_node->outgoing, &prev_node->n_outgoing, &prev_node->alloc_outgoing, &prev_node->outgoing_slot); prev_node->outgoing_slot[rank_outgoing] = rank_incoming; node->incoming_slot[rank_incoming] = rank_outgoing; _starpu_graph_wrunlock(); } /* Drop a node, and thus its dependencies */ void _starpu_graph_drop_node(struct _starpu_graph_node *node) { unsigned i; STARPU_ASSERT(!node->job); if (_starpu_graph_node_multilist_queued_bottom(node)) _starpu_graph_node_multilist_erase_bottom(&bottom, node); if (_starpu_graph_node_multilist_queued_top(node)) _starpu_graph_node_multilist_erase_top(&top, node); if (_starpu_graph_node_multilist_queued_all(node)) _starpu_graph_node_multilist_erase_all(&all, node); /* Drop ourself from the incoming part of the outgoing nodes. */ for (i = 0; i < node->n_outgoing; i++) { struct _starpu_graph_node *next = node->outgoing[i]; if (next) next->incoming[node->outgoing_slot[i]] = NULL; } /* Drop ourself from the outgoing part of the incoming nodes, * in case we happen to get dropped before it. */ for (i = 0; i < node->n_incoming; i++) { struct _starpu_graph_node *prev = node->incoming[i]; if (prev) prev->outgoing[node->incoming_slot[i]] = NULL; } node->n_outgoing = 0; free(node->outgoing); node->outgoing = NULL; free(node->outgoing_slot); node->outgoing_slot = NULL; node->alloc_outgoing = 0; node->n_incoming = 0; free(node->incoming); node->incoming = NULL; free(node->incoming_slot); node->incoming_slot = NULL; node->alloc_incoming = 0; free(node); } /* Drop a job */ void _starpu_graph_drop_job(struct _starpu_job *job) { struct _starpu_graph_node *node = job->graph_node; job->graph_node = NULL; if (!node) return; STARPU_PTHREAD_MUTEX_LOCK(&node->mutex); /* Will not be able to use the job any more */ node->job = NULL; STARPU_PTHREAD_MUTEX_UNLOCK(&node->mutex); STARPU_PTHREAD_MUTEX_LOCK(&dropped_lock); if (STARPU_PTHREAD_RWLOCK_TRYWRLOCK(&graph_lock) == 0) { /* Graph wrlock is available, drop node immediately */ _starpu_graph_drop_node(node); STARPU_PTHREAD_RWLOCK_UNLOCK(&graph_lock); } else /* Queue for removal when lock becomes available */ _starpu_graph_node_multilist_push_back_dropped(&dropped, node); STARPU_PTHREAD_MUTEX_UNLOCK(&dropped_lock); } static void _starpu_graph_set_n(void *data, struct _starpu_graph_node *node) { int value = (intptr_t) data; node->graph_n = value; } /* Call func for each vertex of the task graph, from bottom to top, in topological order */ static void _starpu_graph_compute_bottom_up(void (*func)(struct _starpu_graph_node *next_node, struct _starpu_graph_node *prev_node, void *data), void *data) { struct _starpu_graph_node *node, *node2; struct _starpu_graph_node **current_set = NULL, **next_set = NULL, **swap_set; unsigned current_n, next_n, i, j; unsigned current_alloc = 0, next_alloc = 0, swap_alloc; /* Classical flow algorithm: start from bottom, and propagate depths to top */ /* Set number of processed outgoing edges to 0 for each node */ __starpu_graph_foreach(_starpu_graph_set_n, (void*) 0); /* Start with the bottom of the graph */ current_n = 0; for (node = _starpu_graph_node_multilist_begin_bottom(&bottom); node != _starpu_graph_node_multilist_end_bottom(&bottom); node = _starpu_graph_node_multilist_next_bottom(node)) add_node(node, ¤t_set, ¤t_n, ¤t_alloc, NULL); /* Now propagate to top as long as we have current nodes */ while (current_n) { /* Next set is initially empty */ next_n = 0; /* For each node in the current set */ for (i = 0; i < current_n; i++) { node = current_set[i]; /* For each parent of this node */ for (j = 0; j < node->n_incoming; j++) { node2 = node->incoming[j]; if (!node2) continue; node2->graph_n++; func(node, node2, data); if ((unsigned) node2->graph_n == node2->n_outgoing) /* All outgoing edges were processed, can now add to next set */ add_node(node2, &next_set, &next_n, &next_alloc, NULL); } } /* Swap next set with current set */ swap_set = next_set; swap_alloc = next_alloc; next_set = current_set; next_alloc = current_alloc; current_set = swap_set; current_alloc = swap_alloc; current_n = next_n; } free(current_set); free(next_set); } static void compute_depth(struct _starpu_graph_node *next_node, struct _starpu_graph_node *prev_node, void *data STARPU_ATTRIBUTE_UNUSED) { if (prev_node->depth < next_node->depth + 1) prev_node->depth = next_node->depth + 1; } void _starpu_graph_compute_depths(void) { struct _starpu_graph_node *node; _starpu_graph_wrlock(); /* The bottom of the graph has depth 0 */ for (node = _starpu_graph_node_multilist_begin_bottom(&bottom); node != _starpu_graph_node_multilist_end_bottom(&bottom); node = _starpu_graph_node_multilist_next_bottom(node)) node->depth = 0; _starpu_graph_compute_bottom_up(compute_depth, NULL); _starpu_graph_wrunlock(); } void _starpu_graph_compute_descendants(void) { struct _starpu_graph_node *node, *node2, *node3; struct _starpu_graph_node **current_set = NULL, **next_set = NULL, **swap_set; unsigned current_n, next_n, i, j; unsigned current_alloc = 0, next_alloc = 0, swap_alloc; _starpu_graph_wrlock(); /* Yes, this is O(|V|.(|V|+|E|)) :( */ /* We could get O(|V|.|E|) by doing a topological sort first. * * |E| is usually O(|V|), though (bounded number of data dependencies, * and we use synchronization tasks) */ for (node = _starpu_graph_node_multilist_begin_all(&all); node != _starpu_graph_node_multilist_end_all(&all); node = _starpu_graph_node_multilist_next_all(node)) { unsigned descendants; /* Mark all nodes as unseen */ for (node2 = _starpu_graph_node_multilist_begin_all(&all); node2 != _starpu_graph_node_multilist_end_all(&all); node2 = _starpu_graph_node_multilist_next_all(node2)) node2->graph_n = 0; /* Start with the node we want to compute the number of descendants of */ current_n = 0; add_node(node, ¤t_set, ¤t_n, ¤t_alloc, NULL); node->graph_n = 1; descendants = 0; /* While we have descendants, count their descendants */ while (current_n) { /* Next set is initially empty */ next_n = 0; /* For each node in the current set */ for (i = 0; i < current_n; i++) { node2 = current_set[i]; /* For each child of this node2 */ for (j = 0; j < node2->n_outgoing; j++) { node3 = node2->outgoing[j]; if (!node3) continue; if (node3->graph_n) /* Already seen */ continue; /* Add this node */ node3->graph_n = 1; descendants++; add_node(node3, &next_set, &next_n, &next_alloc, NULL); } } /* Swap next set with current set */ swap_set = next_set; swap_alloc = next_alloc; next_set = current_set; next_alloc = current_alloc; current_set = swap_set; current_alloc = swap_alloc; current_n = next_n; } node->descendants = descendants; } _starpu_graph_wrunlock(); free(current_set); free(next_set); } void _starpu_graph_foreach(void (*func)(void *data, struct _starpu_graph_node *node), void *data) { _starpu_graph_wrlock(); __starpu_graph_foreach(func, data); _starpu_graph_wrunlock(); } starpu-1.2.3+dfsg/src/common/graph.h000066400000000000000000000076241320135501600173100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2017 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __GRAPH_H__ #define __GRAPH_H__ #include MULTILIST_CREATE_TYPE(_starpu_graph_node, all) MULTILIST_CREATE_TYPE(_starpu_graph_node, top) MULTILIST_CREATE_TYPE(_starpu_graph_node, bottom) MULTILIST_CREATE_TYPE(_starpu_graph_node, dropped) struct _starpu_graph_node { starpu_pthread_mutex_t mutex; /* protects access to the job */ struct _starpu_job *job; /* pointer to the job, if it is still alive, NULL otherwise */ /* * Fields for graph analysis for scheduling heuristics */ /* Member of list of all jobs without incoming dependency */ struct _starpu_graph_node_multilist_top top; /* Member of list of all jobs without outgoing dependency */ struct _starpu_graph_node_multilist_bottom bottom; /* Member of list of all jobs */ struct _starpu_graph_node_multilist_all all; /* Member of list of dropped jobs */ struct _starpu_graph_node_multilist_dropped dropped; /* set of incoming dependencies */ struct _starpu_graph_node **incoming; /* May contain NULLs for terminated jobs */ unsigned *incoming_slot; /* Index within corresponding outgoing array */ unsigned n_incoming; /* Number of slots used */ unsigned alloc_incoming; /* Size of incoming */ /* set of outgoing dependencies */ struct _starpu_graph_node **outgoing; unsigned *outgoing_slot; /* Index within corresponding incoming array */ unsigned n_outgoing; /* Number of slots used */ unsigned alloc_outgoing; /* Size of outgoing */ unsigned depth; /* Rank from bottom, in number of jobs */ /* Only available if _starpu_graph_compute_depths was called */ unsigned descendants; /* Number of children, grand-children, etc. */ /* Only available if _starpu_graph_compute_descendants was called */ int graph_n; /* Variable available for graph flow */ }; MULTILIST_CREATE_INLINES(struct _starpu_graph_node, _starpu_graph_node, all) MULTILIST_CREATE_INLINES(struct _starpu_graph_node, _starpu_graph_node, top) MULTILIST_CREATE_INLINES(struct _starpu_graph_node, _starpu_graph_node, bottom) MULTILIST_CREATE_INLINES(struct _starpu_graph_node, _starpu_graph_node, dropped) extern int _starpu_graph_record; void _starpu_graph_init(void); void _starpu_graph_wrlock(void); void _starpu_graph_rdlock(void); void _starpu_graph_wrunlock(void); void _starpu_graph_rdunlock(void); /* Add a job to the graph, called before any _starpu_graph_add_job_dep call */ void _starpu_graph_add_job(struct _starpu_job *job); /* Add a dependency between jobs */ void _starpu_graph_add_job_dep(struct _starpu_job *job, struct _starpu_job *prev_job); /* Remove a job from the graph */ void _starpu_graph_drop_job(struct _starpu_job *job); /* Really drop the nodes from the graph now */ void _starpu_graph_drop_dropped_nodes(void); /* This make StarPU compute for each task the depth, i.e. the length of the longest path to a task without outgoing dependencies. */ /* This does not take job duration into account, just the number */ void _starpu_graph_compute_depths(void); /* Compute the descendants of jobs in the graph */ void _starpu_graph_compute_descendants(void); /* This calls \e func for each node of the task graph, passing also \e data as it */ /* Apply func on each job of the graph */ void _starpu_graph_foreach(void (*func)(void *data, struct _starpu_graph_node *node), void *data); #endif /* __GRAPH_H__ */ starpu-1.2.3+dfsg/src/common/hash.c000066400000000000000000000035711320135501600171220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2011, 2013, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #define _STARPU_CRC32C_POLY_BE 0x1EDC6F41 static inline uint32_t STARPU_ATTRIBUTE_PURE starpu_crc32c_be_8(uint8_t inputbyte, uint32_t inputcrc) { unsigned i; uint32_t crc; crc = inputcrc ^ (((uint32_t) inputbyte) << 24); for (i = 0; i < 8; i++) crc = (crc << 1) ^ ((crc & 0x80000000) ? _STARPU_CRC32C_POLY_BE : 0); return crc; } uint32_t starpu_hash_crc32c_be_n(const void *input, size_t n, uint32_t inputcrc) { uint8_t *p = (uint8_t *)input; size_t i; uint32_t crc = inputcrc; for (i = 0; i < n; i++) crc = starpu_crc32c_be_8(p[i], crc); return crc; } uint32_t starpu_hash_crc32c_be(uint32_t input, uint32_t inputcrc) { uint8_t *p = (uint8_t *)&input; uint32_t crc = inputcrc; crc = starpu_crc32c_be_8(p[0], crc); crc = starpu_crc32c_be_8(p[1], crc); crc = starpu_crc32c_be_8(p[2], crc); crc = starpu_crc32c_be_8(p[3], crc); return crc; } uint32_t starpu_hash_crc32c_string(const char *str, uint32_t inputcrc) { uint32_t hash = inputcrc; size_t len = strlen(str); unsigned i; for (i = 0; i < len; i++) { hash = starpu_crc32c_be_8((uint8_t)str[i], hash); } return hash; } starpu-1.2.3+dfsg/src/common/list.h000066400000000000000000000336111320135501600171550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012, 2015, 2017 Université de Bordeaux * Copyright (C) 2010, 2011 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __LIST_H__ #define __LIST_H__ /** @file * @brief Doubly-linked lists */ /** @remarks list how-to * ********************************************************* * LIST_TYPE(FOO, content); * * - declares the following types: * * + for cells : struct FOO * + for lists : struct FOO_list * + for iterators : struct FOO * * - declares the following inlines (all O(1) except stated otherwise, n is the number of elements) : * * * Create a cell * struct FOO* FOO_new(void); * * * Suppress a cell * void FOO_delete(struct FOO*); * * * Create a list (initially empty) * struct FOO_list* FOO_list_new(void); * * * Initializes a list (initially empty) * void FOO_list_init(struct FOO_list*); * * * Suppresses a liste * void FOO_list_delete(struct FOO_list*); * * * Check whether a list is empty * int FOO_list_empty(struct FOO_list*); * * * Remove a given cell from the list * void FOO_list_erase(struct FOO_list*, struct FOO*); * * * Add a cell at the back of the list * void FOO_list_push_back(struct FOO_list*, struct FOO*); * * * Add a cell at the front of the list * void FOO_list_push_front(struct FOO_list*, struct FOO*); * * * Add a cell before a given cell of a list * void FOO_list_insert_before(struct FOO_list*, struct FOO*new, struct FOO*); * * * Add a cell after a given cell of a list * void FOO_list_insert_after(struct FOO_list*, struct FOO*new, struct FOO*); * * * Append the second list at the end of the first list * struct FOO* FOO_list_push_list_back(struct FOO_list*, struct FOO_list*); * * * Prepend the first list at the beginning of the second list * struct FOO* FOO_list_push_list_front(struct FOO_list*, struct FOO_list*); * * * Return and remove the node at the back of the list * struct FOO* FOO_list_pop_back(struct FOO_list*); * * * Return and remove the node at the front of the list * struct FOO* FOO_list_pop_front(struct FOO_list*); * * * Return the node at the back of the list * struct FOO* FOO_list_back(struct FOO_list*); * * * Return the node at the front of the list * struct FOO* FOO_list_front(struct FOO_list*); * * * Check that the list chaining is coherent (O(n)) * int FOO_list_check(struct FOO_list*); * * * Return the first cell of the list (from the front) * struct FOO* FOO_list_begin(struct FOO_list*); * * * Return the value to be tested at the end of the list (at the back) * struct FOO* FOO_list_end(struct FOO_list*); * * * Return the next element of the list (from the front) * struct FOO* FOO_list_next(struct FOO*) * * * Return the last element of the list (from the back) * struct FOO* FOO_list_last(struct FOO_list*); * * * Return the value to be tested at the beginning of the list (at the fromt) * struct FOO* FOO_list_alpha(struct FOO_list*); * * * Return the previous element of the list (from the back) * struct FOO* FOO_list_prev(struct FOO*) * * * Return the size of the list in O(n) * int FOO_list_size(struct FOO_list*) * * ********************************************************* * Usage example: * - initially you'd have: * struct my_struct * { * int a; * int b; * }; * - to make a list of it, we replace the declaration above with: * LIST_TYPE(my_struct, * int a; * int b; * ); * which creates the struct my_struct and struct my_struct_list types. * * - setting up an empty list: * struct my_struct_list l; * my_struct_list_init(&l); * * - allocating an empty list: * struct my_struct_list * l = my_struct_list_new(); * - add a cell 'e' at the front of list 'l': * struct my_struct * e = my_struct_new(); * e->a = 0; * e->b = 0; * my_struct_list_push_front(l, e); * * - iterating over a list from the front: * struct my_struct * i; * for(i = my_struct_list_begin(l); * i != my_struct_list_end(l); * i = my_struct_list_next(i)) * { * printf("a=%d; b=%d\n", i->a, i->b); * } * * - iterating over a list from the back: * struct my_struct * i; * for(i = my_struct_list_last(l); * i != my_struct_list_alpha(l); * i = my_struct_list_prev(i)) * { * printf("a=%d; b=%d\n", i->a, i->b); * } * ********************************************************* */ /**@hideinitializer * Generates a new type for list of elements */ #define LIST_TYPE(ENAME, DECL) \ LIST_CREATE_TYPE(ENAME, DECL) /**@hideinitializer * The effective type declaration for lists */ #define LIST_CREATE_TYPE(ENAME, DECL) \ /** from automatic type: struct ENAME */ \ struct ENAME \ { \ struct ENAME *_prev; /**< @internal previous cell */ \ struct ENAME *_next; /**< @internal next cell */ \ DECL \ }; \ /** @internal */ \ struct ENAME##_list \ { \ struct ENAME *_head; /**< @internal head of the list */ \ struct ENAME *_tail; /**< @internal tail of the list */ \ }; \ /** @internal */static inline struct ENAME *ENAME##_new(void) \ { struct ENAME *e = (struct ENAME *)malloc(sizeof(struct ENAME)); \ e->_next = NULL; e->_prev = NULL; return e; } \ /** @internal */static inline void ENAME##_delete(struct ENAME *e) \ { free(e); } \ /** @internal */static inline void ENAME##_list_push_front(struct ENAME##_list *l, struct ENAME *e) \ { if(l->_tail == NULL) l->_tail = e; else l->_head->_prev = e; \ e->_prev = NULL; e->_next = l->_head; l->_head = e; } \ /** @internal */static inline void ENAME##_list_push_back(struct ENAME##_list *l, struct ENAME *e) \ { if(l->_head == NULL) l->_head = e; else l->_tail->_next = e; \ e->_next = NULL; e->_prev = l->_tail; l->_tail = e; } \ /** @internal */static inline void ENAME##_list_insert_before(struct ENAME##_list *l, struct ENAME *e, struct ENAME *o) \ { struct ENAME *p = o->_prev; if (p) { p->_next = e; e->_prev = p; } else { l->_head = e; e->_prev = NULL; } \ e->_next = o; o->_prev = e; } \ /** @internal */static inline void ENAME##_list_insert_after(struct ENAME##_list *l, struct ENAME *e, struct ENAME *o) \ { struct ENAME *n = o->_next; if (n) { n->_prev = e; e->_next = n; } else { l->_tail = e; e->_next = NULL; } \ e->_prev = o; o->_next = e; } \ /** @internal */static inline void ENAME##_list_push_list_front(struct ENAME##_list *l1, struct ENAME##_list *l2) \ { if (l2->_head == NULL) { l2->_head = l1->_head; l2->_tail = l1->_tail; } \ else if (l1->_head != NULL) { l1->_tail->_next = l2->_head; l2->_head->_prev = l1->_tail; l2->_head = l1->_head; } } \ /** @internal */static inline void ENAME##_list_push_list_back(struct ENAME##_list *l1, struct ENAME##_list *l2) \ { if(l1->_head == NULL) { l1->_head = l2->_head; l1->_tail = l2->_tail; } \ else if (l2->_head != NULL) { l1->_tail->_next = l2->_head; l2->_head->_prev = l1->_tail; l1->_tail = l2->_tail; } } \ /** @internal */static inline struct ENAME *ENAME##_list_front(const struct ENAME##_list *l) \ { return l->_head; } \ /** @internal */static inline struct ENAME *ENAME##_list_back(const struct ENAME##_list *l) \ { return l->_tail; } \ /** @internal */static inline void ENAME##_list_init(struct ENAME##_list *l) \ { l->_head=NULL; l->_tail=l->_head; } \ /** @internal */static inline struct ENAME##_list *ENAME##_list_new(void) \ { struct ENAME##_list *l; l=(struct ENAME##_list *)malloc(sizeof(struct ENAME##_list)); \ ENAME##_list_init(l); return l; } \ /** @internal */static inline int ENAME##_list_empty(const struct ENAME##_list *l) \ { return (l->_head == NULL); } \ /** @internal */static inline void ENAME##_list_delete(struct ENAME##_list *l) \ { free(l); } \ /** @internal */static inline void ENAME##_list_erase(struct ENAME##_list *l, struct ENAME *c) \ { struct ENAME *p = c->_prev; if(p) p->_next = c->_next; else l->_head = c->_next; \ if(c->_next) c->_next->_prev = p; else l->_tail = p; } \ /** @internal */static inline struct ENAME *ENAME##_list_pop_front(struct ENAME##_list *l) \ { struct ENAME *e = ENAME##_list_front(l); \ ENAME##_list_erase(l, e); return e; } \ /** @internal */static inline struct ENAME *ENAME##_list_pop_back(struct ENAME##_list *l) \ { struct ENAME *e = ENAME##_list_back(l); \ ENAME##_list_erase(l, e); return e; } \ /** @internal */static inline struct ENAME *ENAME##_list_begin(const struct ENAME##_list *l) \ { return l->_head; } \ /** @internal */static inline struct ENAME *ENAME##_list_end(const struct ENAME##_list *l STARPU_ATTRIBUTE_UNUSED) \ { return NULL; } \ /** @internal */static inline struct ENAME *ENAME##_list_next(const struct ENAME *i) \ { return i->_next; } \ /** @internal */static inline struct ENAME *ENAME##_list_last(const struct ENAME##_list *l) \ { return l->_tail; } \ /** @internal */static inline struct ENAME *ENAME##_list_alpha(const struct ENAME##_list *l STARPU_ATTRIBUTE_UNUSED) \ { return NULL; } \ /** @internal */static inline struct ENAME *ENAME##_list_prev(const struct ENAME *i) \ { return i->_prev; } \ /** @internal */static inline int ENAME##_list_size(const struct ENAME##_list *l) \ { struct ENAME *i=l->_head; int k=0; while(i!=NULL){k++;i=i->_next;} return k; } \ /** @internal */static inline int ENAME##_list_check(const struct ENAME##_list *l) \ { struct ENAME *i=l->_head; while(i) \ { if ((i->_next == NULL) && i != l->_tail) return 0; \ if (i->_next == i) return 0; \ i=i->_next;} return 1; } #ifdef STARPU_DEBUG #define STARPU_ASSERT_MULTILIST(expr) STARPU_ASSERT(expr) #else #define STARPU_ASSERT_MULTILIST(expr) ((void) 0) #endif /* * This is an implementation of list allowing to be member of several lists. * - One should first call MULTILIST_CREATE_TYPE for the ENAME and for each * MEMBER type * - Then the main element type should include fields of type * ENAME_multilist_MEMBER * - Then one should call MULTILIST_CREATE_INLINES to create the inlines which * manipulate lists for this MEMBER type. */ /* Create the ENAME_multilist_MEMBER, to be used both as head and as member of main element type */ #define MULTILIST_CREATE_TYPE(ENAME, MEMBER) \ struct ENAME##_multilist_##MEMBER { \ struct ENAME##_multilist_##MEMBER *next; \ struct ENAME##_multilist_##MEMBER *prev; \ }; /* Create the inlines */ #define MULTILIST_CREATE_INLINES(TYPE, ENAME, MEMBER) \ /* Cast from list element to real type. */ \ static inline TYPE *ENAME##_of_multilist_##MEMBER(struct ENAME##_multilist_##MEMBER *elt) { \ return ((TYPE *) ((uintptr_t) (elt) - ((uintptr_t) (&((TYPE *) 0)->MEMBER)))); \ } \ \ /* Initialize a list head. */ \ static inline void ENAME##_multilist_init_##MEMBER(struct ENAME##_multilist_##MEMBER *head) { \ head->next = head; \ head->prev = head; \ } \ \ /* Push element to head of a list. */ \ static inline void ENAME##_multilist_push_front_##MEMBER(struct ENAME##_multilist_##MEMBER *head, TYPE *e) { \ STARPU_ASSERT_MULTILIST(e->MEMBER.prev == NULL); \ STARPU_ASSERT_MULTILIST(e->MEMBER.next == NULL); \ e->MEMBER.next = head->next; \ e->MEMBER.prev = head; \ head->next->prev = &e->MEMBER; \ head->next = &e->MEMBER; \ } \ \ /* Push element to tail of a list. */ \ static inline void ENAME##_multilist_push_back_##MEMBER(struct ENAME##_multilist_##MEMBER *head, TYPE *e) { \ STARPU_ASSERT_MULTILIST(e->MEMBER.prev == NULL); \ STARPU_ASSERT_MULTILIST(e->MEMBER.next == NULL); \ e->MEMBER.prev = head->prev; \ e->MEMBER.next = head; \ head->prev->next = &e->MEMBER; \ head->prev = &e->MEMBER; \ } \ \ /* Erase element from a list. */ \ static inline void ENAME##_multilist_erase_##MEMBER(struct ENAME##_multilist_##MEMBER *head STARPU_ATTRIBUTE_UNUSED, TYPE *e) { \ STARPU_ASSERT_MULTILIST(e->MEMBER.next->prev == &e->MEMBER); \ e->MEMBER.next->prev = e->MEMBER.prev; \ STARPU_ASSERT_MULTILIST(e->MEMBER.prev->next == &e->MEMBER); \ e->MEMBER.prev->next = e->MEMBER.next; \ e->MEMBER.next = NULL; \ e->MEMBER.prev = NULL; \ } \ \ /* Test whether the element was queued on the list. */ \ static inline int ENAME##_multilist_queued_##MEMBER(TYPE *e) { \ return ((e)->MEMBER.next != NULL); \ } \ \ /* Test whether the list is empty. */ \ static inline int ENAME##_multilist_empty_##MEMBER(struct ENAME##_multilist_##MEMBER *head) { \ return head->next == head; \ } \ \ /* Return the first element of the list. */ \ static inline TYPE *ENAME##_multilist_begin_##MEMBER(struct ENAME##_multilist_##MEMBER *head) { \ return ENAME##_of_multilist_##MEMBER(head->next); \ } \ /* Return the value to be tested at the end of the list. */ \ static inline TYPE *ENAME##_multilist_end_##MEMBER(struct ENAME##_multilist_##MEMBER *head) { \ return ENAME##_of_multilist_##MEMBER(head); \ } \ /* Return the next element of the list. */ \ static inline TYPE *ENAME##_multilist_next_##MEMBER(TYPE *e) { \ return ENAME##_of_multilist_##MEMBER(e->MEMBER.next); \ } \ \ /* Move a list from its head to another head. */ \ static inline void ENAME##_multilist_move_##MEMBER(struct ENAME##_multilist_##MEMBER *head, struct ENAME##_multilist_##MEMBER *newhead) { \ if (ENAME##_multilist_empty_##MEMBER(head)) \ ENAME##_multilist_init_##MEMBER(newhead); \ else { \ newhead->next = head->next; \ newhead->next->prev = newhead; \ newhead->prev = head->prev; \ newhead->prev->next = newhead; \ head->next = head; \ head->prev = head; \ } \ } #endif /* __LIST_H__ */ starpu-1.2.3+dfsg/src/common/rwlock.c000066400000000000000000000061761320135501600175040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2011 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /** * A dummy implementation of a rw_lock using spinlocks ... */ #include "rwlock.h" static void _starpu_take_busy_lock(struct _starpu_rw_lock *lock) { uint32_t prev; do { prev = STARPU_TEST_AND_SET(&lock->busy, 1); } while (prev); } static void _starpu_release_busy_lock(struct _starpu_rw_lock *lock) { STARPU_RELEASE(&lock->busy); } void _starpu_init_rw_lock(struct _starpu_rw_lock *lock) { STARPU_ASSERT(lock); lock->writer = 0; lock->readercnt = 0; lock->busy = 0; } int _starpu_take_rw_lock_write_try(struct _starpu_rw_lock *lock) { _starpu_take_busy_lock(lock); if (lock->readercnt > 0 || lock->writer) { /* fail to take the lock */ _starpu_release_busy_lock(lock); return -1; } else { STARPU_ASSERT(lock->readercnt == 0); STARPU_ASSERT(lock->writer == 0); /* no one was either writing nor reading */ lock->writer = 1; _starpu_release_busy_lock(lock); return 0; } } int _starpu_take_rw_lock_read_try(struct _starpu_rw_lock *lock) { _starpu_take_busy_lock(lock); if (lock->writer) { /* there is a writer ... */ _starpu_release_busy_lock(lock); return -1; } else { STARPU_ASSERT(lock->writer == 0); /* no one is writing */ /* XXX check wrap arounds ... */ lock->readercnt++; _starpu_release_busy_lock(lock); return 0; } } void _starpu_take_rw_lock_write(struct _starpu_rw_lock *lock) { do { _starpu_take_busy_lock(lock); if (lock->readercnt > 0 || lock->writer) { /* fail to take the lock */ _starpu_release_busy_lock(lock); } else { STARPU_ASSERT(lock->readercnt == 0); STARPU_ASSERT(lock->writer == 0); /* no one was either writing nor reading */ lock->writer = 1; _starpu_release_busy_lock(lock); return; } } while (1); } void _starpu_take_rw_lock_read(struct _starpu_rw_lock *lock) { do { _starpu_take_busy_lock(lock); if (lock->writer) { /* there is a writer ... */ _starpu_release_busy_lock(lock); } else { STARPU_ASSERT(lock->writer == 0); /* no one is writing */ /* XXX check wrap arounds ... */ lock->readercnt++; _starpu_release_busy_lock(lock); return; } } while (1); } void _starpu_release_rw_lock(struct _starpu_rw_lock *lock) { _starpu_take_busy_lock(lock); /* either writer or reader (exactly one !) */ if (lock->writer) { STARPU_ASSERT(lock->readercnt == 0); lock->writer = 0; } else { /* reading mode */ STARPU_ASSERT(lock->writer == 0); lock->readercnt--; } _starpu_release_busy_lock(lock); } starpu-1.2.3+dfsg/src/common/rwlock.h000066400000000000000000000031371320135501600175030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __RWLOCKS_H__ #define __RWLOCKS_H__ #include #include /* Dummy implementation of a RW-lock using a spinlock. */ struct _starpu_rw_lock { uint32_t busy; uint8_t writer; uint16_t readercnt; }; /* Initialize the RW-lock */ void _starpu_init_rw_lock(struct _starpu_rw_lock *lock); /* Grab the RW-lock in a write mode */ void _starpu_take_rw_lock_write(struct _starpu_rw_lock *lock); /* Grab the RW-lock in a read mode */ void _starpu_take_rw_lock_read(struct _starpu_rw_lock *lock); /* Try to grab the RW-lock in a write mode. Returns 0 in case of success, -1 * otherwise. */ int _starpu_take_rw_lock_write_try(struct _starpu_rw_lock *lock); /* Try to grab the RW-lock in a read mode. Returns 0 in case of success, -1 * otherwise. */ int _starpu_take_rw_lock_read_try(struct _starpu_rw_lock *lock); /* Unlock the RW-lock. */ void _starpu_release_rw_lock(struct _starpu_rw_lock *lock); #endif starpu-1.2.3+dfsg/src/common/starpu_spinlock.c000066400000000000000000000031111320135501600214050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2013, 2014 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #if defined(STARPU_SPINLOCK_CHECK) int _starpu_spin_init(struct _starpu_spinlock *lock) { starpu_pthread_mutexattr_t errcheck_attr; // memcpy(&lock->errcheck_lock, PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP, sizeof(PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP)); int ret; ret = starpu_pthread_mutexattr_init(&errcheck_attr); STARPU_CHECK_RETURN_VALUE(ret, "pthread_mutexattr_init"); ret = starpu_pthread_mutexattr_settype(&errcheck_attr, PTHREAD_MUTEX_ERRORCHECK); STARPU_ASSERT(!ret); ret = starpu_pthread_mutex_init(&lock->errcheck_lock, &errcheck_attr); starpu_pthread_mutexattr_destroy(&errcheck_attr); return ret; } int _starpu_spin_destroy(struct _starpu_spinlock *lock) { return starpu_pthread_mutex_destroy(&lock->errcheck_lock); } #endif starpu-1.2.3+dfsg/src/common/starpu_spinlock.h000066400000000000000000000107701320135501600214230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2013, 2014, 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_SPINLOCK_H__ #define __STARPU_SPINLOCK_H__ #include #include #include #include #include #include #ifdef STARPU_SPINLOCK_CHECK /* We don't care about performance */ struct _starpu_spinlock { starpu_pthread_mutex_t errcheck_lock; const char *last_taker; }; int _starpu_spin_init(struct _starpu_spinlock *lock); int _starpu_spin_destroy(struct _starpu_spinlock *lock); static inline int __starpu_spin_lock(struct _starpu_spinlock *lock, const char *file STARPU_ATTRIBUTE_UNUSED, int line STARPU_ATTRIBUTE_UNUSED, const char *func STARPU_ATTRIBUTE_UNUSED) { _STARPU_TRACE_LOCKING_SPINLOCK(file, line); int ret = starpu_pthread_mutex_lock(&lock->errcheck_lock); STARPU_ASSERT(!ret); lock->last_taker = func; _STARPU_TRACE_SPINLOCK_LOCKED(file, line); return ret; } static inline void _starpu_spin_checklocked(struct _starpu_spinlock *lock STARPU_ATTRIBUTE_UNUSED) { STARPU_ASSERT(starpu_pthread_mutex_trylock(&lock->errcheck_lock) != 0); } static inline int __starpu_spin_trylock(struct _starpu_spinlock *lock, const char *file STARPU_ATTRIBUTE_UNUSED, int line STARPU_ATTRIBUTE_UNUSED, const char *func STARPU_ATTRIBUTE_UNUSED) { _STARPU_TRACE_TRYLOCK_SPINLOCK(file, line); int ret = starpu_pthread_mutex_trylock(&lock->errcheck_lock); STARPU_ASSERT(!ret || (ret == EBUSY)); if (STARPU_LIKELY(!ret)) { lock->last_taker = func; _STARPU_TRACE_SPINLOCK_LOCKED(file, line); } return ret; } static inline int __starpu_spin_unlock(struct _starpu_spinlock *lock, const char *file STARPU_ATTRIBUTE_UNUSED, int line STARPU_ATTRIBUTE_UNUSED, const char *func STARPU_ATTRIBUTE_UNUSED) { _STARPU_TRACE_UNLOCKING_SPINLOCK(file, line); int ret = starpu_pthread_mutex_unlock(&lock->errcheck_lock); STARPU_ASSERT(!ret); _STARPU_TRACE_SPINLOCK_UNLOCKED(file, line); return ret; } #else /* We do care about performance, inline as much as possible */ struct _starpu_spinlock { starpu_pthread_spinlock_t lock; }; static inline int _starpu_spin_init(struct _starpu_spinlock *lock) { int ret = starpu_pthread_spin_init(&lock->lock, 0); STARPU_ASSERT(!ret); return ret; } #define _starpu_spin_destroy(_lock) starpu_pthread_spin_destroy(&(_lock)->lock) static inline int __starpu_spin_lock(struct _starpu_spinlock *lock, const char *file STARPU_ATTRIBUTE_UNUSED, int line STARPU_ATTRIBUTE_UNUSED, const char *func STARPU_ATTRIBUTE_UNUSED) { _STARPU_TRACE_LOCKING_SPINLOCK(file, line); int ret = starpu_pthread_spin_lock(&lock->lock); STARPU_ASSERT(!ret); _STARPU_TRACE_SPINLOCK_LOCKED(file, line); return ret; } #define _starpu_spin_checklocked(_lock) _starpu_pthread_spin_checklocked(&(_lock)->lock) static inline int __starpu_spin_trylock(struct _starpu_spinlock *lock, const char *file STARPU_ATTRIBUTE_UNUSED, int line STARPU_ATTRIBUTE_UNUSED, const char *func STARPU_ATTRIBUTE_UNUSED) { _STARPU_TRACE_TRYLOCK_SPINLOCK(file, line); int ret = starpu_pthread_spin_trylock(&lock->lock); STARPU_ASSERT(!ret || (ret == EBUSY)); if (STARPU_LIKELY(!ret)) _STARPU_TRACE_SPINLOCK_LOCKED(file, line); return ret; } static inline int __starpu_spin_unlock(struct _starpu_spinlock *lock, const char *file STARPU_ATTRIBUTE_UNUSED, int line STARPU_ATTRIBUTE_UNUSED, const char *func STARPU_ATTRIBUTE_UNUSED) { _STARPU_TRACE_UNLOCKING_SPINLOCK(file, line); int ret = starpu_pthread_spin_unlock(&lock->lock); STARPU_ASSERT(!ret); _STARPU_TRACE_SPINLOCK_UNLOCKED(file, line); return ret; } #endif #define _starpu_spin_lock(lock) \ __starpu_spin_lock(lock, __FILE__, __LINE__, __starpu_func__) #define _starpu_spin_trylock(lock) \ __starpu_spin_trylock(lock, __FILE__, __LINE__, __starpu_func__) #define _starpu_spin_unlock(lock) \ __starpu_spin_unlock(lock, __FILE__, __LINE__, __starpu_func__) #define STARPU_SPIN_MAXTRY 10 #endif // __STARPU_SPINLOCK_H__ starpu-1.2.3+dfsg/src/common/thread.c000066400000000000000000000456721320135501600174560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #ifdef STARPU_SIMGRID #ifdef STARPU_HAVE_XBT_SYNCHRO_H #include #else #include #endif #include #include #else #if defined(STARPU_LINUX_SYS) && defined(STARPU_HAVE_XCHG) #include #include /* Private futexes are not so old, cope with old kernels. */ #ifdef FUTEX_WAIT_PRIVATE static int _starpu_futex_wait = FUTEX_WAIT_PRIVATE; static int _starpu_futex_wake = FUTEX_WAKE_PRIVATE; #else static int _starpu_futex_wait = FUTEX_WAIT; static int _starpu_futex_wake = FUTEX_WAKE; #endif #endif #endif /* !STARPU_SIMGRID */ #ifdef STARPU_SIMGRID extern int _starpu_simgrid_thread_start(int argc, char *argv[]); int starpu_pthread_create_on(char *name, starpu_pthread_t *thread, const starpu_pthread_attr_t *attr STARPU_ATTRIBUTE_UNUSED, void *(*start_routine) (void *), void *arg, msg_host_t host) { char **_args; _STARPU_MALLOC(_args, 3*sizeof(char*)); asprintf(&_args[0], "%p", start_routine); asprintf(&_args[1], "%p", arg); _args[2] = NULL; if (!host) host = MSG_get_host_by_name("MAIN"); void *tsd; _STARPU_CALLOC(tsd, MAX_TSD+1, sizeof(void*)); *thread = MSG_process_create_with_arguments(name, _starpu_simgrid_thread_start, tsd, host, 2, _args); #if SIMGRID_VERSION_MAJOR > 3 || (SIMGRID_VERSION_MAJOR == 3 && SIMGRID_VERSION_MINOR >= 15) MSG_process_ref(*thread); #endif return 0; } int starpu_pthread_create(starpu_pthread_t *thread, const starpu_pthread_attr_t *attr, void *(*start_routine) (void *), void *arg) { return starpu_pthread_create_on("", thread, attr, start_routine, arg, NULL); } int starpu_pthread_join(starpu_pthread_t thread STARPU_ATTRIBUTE_UNUSED, void **retval STARPU_ATTRIBUTE_UNUSED) { #if 0 //def HAVE_MSG_PROCESS_JOIN MSG_process_join(thread, 100); #if SIMGRID_VERSION_MAJOR > 3 || (SIMGRID_VERSION_MAJOR == 3 && SIMGRID_VERSION_MINOR >= 15) MSG_process_unref(thread); #endif #else MSG_process_sleep(1); #endif return 0; } int starpu_pthread_exit(void *retval STARPU_ATTRIBUTE_UNUSED) { MSG_process_kill(MSG_process_self()); STARPU_ABORT_MSG("MSG_process_kill(MSG_process_self()) returned?!"); } int starpu_pthread_attr_init(starpu_pthread_attr_t *attr STARPU_ATTRIBUTE_UNUSED) { return 0; } int starpu_pthread_attr_destroy(starpu_pthread_attr_t *attr STARPU_ATTRIBUTE_UNUSED) { return 0; } int starpu_pthread_attr_setdetachstate(starpu_pthread_attr_t *attr STARPU_ATTRIBUTE_UNUSED, int detachstate STARPU_ATTRIBUTE_UNUSED) { return 0; } int starpu_pthread_mutex_init(starpu_pthread_mutex_t *mutex, const starpu_pthread_mutexattr_t *mutexattr STARPU_ATTRIBUTE_UNUSED) { *mutex = xbt_mutex_init(); return 0; } int starpu_pthread_mutex_destroy(starpu_pthread_mutex_t *mutex) { if (*mutex) xbt_mutex_destroy(*mutex); return 0; } int starpu_pthread_mutex_lock(starpu_pthread_mutex_t *mutex) { _STARPU_TRACE_LOCKING_MUTEX(); /* Note: this is actually safe, because simgrid only preempts within * simgrid functions */ if (!*mutex) { /* Here we may get preempted */ xbt_mutex_t new_mutex = xbt_mutex_init(); if (!*mutex) *mutex = new_mutex; else /* Somebody already initialized it while we were * calling xbt_mutex_init, this one is now useless */ xbt_mutex_destroy(new_mutex); } xbt_mutex_acquire(*mutex); _STARPU_TRACE_MUTEX_LOCKED(); return 0; } int starpu_pthread_mutex_unlock(starpu_pthread_mutex_t *mutex) { _STARPU_TRACE_UNLOCKING_MUTEX(); xbt_mutex_release(*mutex); _STARPU_TRACE_MUTEX_UNLOCKED(); return 0; } int starpu_pthread_mutex_trylock(starpu_pthread_mutex_t *mutex) { int ret; _STARPU_TRACE_TRYLOCK_MUTEX(); #ifdef HAVE_XBT_MUTEX_TRY_ACQUIRE ret = xbt_mutex_try_acquire(*mutex); #else ret = simcall_mutex_trylock((smx_mutex_t)*mutex); #endif ret = ret ? 0 : EBUSY; _STARPU_TRACE_MUTEX_LOCKED(); return ret; } int starpu_pthread_mutexattr_gettype(const starpu_pthread_mutexattr_t *attr STARPU_ATTRIBUTE_UNUSED, int *type STARPU_ATTRIBUTE_UNUSED) { return 0; } int starpu_pthread_mutexattr_settype(starpu_pthread_mutexattr_t *attr STARPU_ATTRIBUTE_UNUSED, int type STARPU_ATTRIBUTE_UNUSED) { return 0; } int starpu_pthread_mutexattr_destroy(starpu_pthread_mutexattr_t *attr STARPU_ATTRIBUTE_UNUSED) { return 0; } int starpu_pthread_mutexattr_init(starpu_pthread_mutexattr_t *attr STARPU_ATTRIBUTE_UNUSED) { return 0; } /* Indexed by key-1 */ static int used_key[MAX_TSD]; int starpu_pthread_key_create(starpu_pthread_key_t *key, void (*destr_function) (void *) STARPU_ATTRIBUTE_UNUSED) { unsigned i; /* Note: no synchronization here, we are actually monothreaded anyway. */ for (i = 0; i < MAX_TSD; i++) { if (!used_key[i]) { used_key[i] = 1; break; } } STARPU_ASSERT(i < MAX_TSD); /* key 0 is for process pointer argument */ *key = i+1; return 0; } int starpu_pthread_key_delete(starpu_pthread_key_t key) { used_key[key-1] = 0; return 0; } /* We need it only when using smpi */ #pragma weak smpi_process_get_user_data #if !HAVE_DECL_SMPI_PROCESS_SET_USER_DATA extern void *smpi_process_get_user_data(); #endif int starpu_pthread_setspecific(starpu_pthread_key_t key, const void *pointer) { void **array; #ifdef HAVE_SMPI_PROCESS_SET_USER_DATA #ifdef HAVE_MSG_PROCESS_SELF_NAME const char *process_name = MSG_process_self_name(); #else const char *process_name = SIMIX_process_self_get_name(); #endif char *end; /* Test whether it is an MPI rank */ strtol(process_name, &end, 10); if (!*end) /* Special-case the SMPI process */ array = smpi_process_get_user_data(); else #endif array = MSG_process_get_data(MSG_process_self()); array[key] = (void*) pointer; return 0; } void* starpu_pthread_getspecific(starpu_pthread_key_t key) { void **array; #ifdef HAVE_SMPI_PROCESS_SET_USER_DATA #ifdef HAVE_MSG_PROCESS_SELF_NAME const char *process_name = MSG_process_self_name(); #else const char *process_name = SIMIX_process_self_get_name(); #endif char *end; /* Test whether it is an MPI rank */ strtol(process_name, &end, 10); if (!*end) /* Special-case the SMPI processes */ array = smpi_process_get_user_data(); else #endif array = MSG_process_get_data(MSG_process_self()); if (!array) return NULL; return array[key]; } int starpu_pthread_cond_init(starpu_pthread_cond_t *cond, starpu_pthread_condattr_t *cond_attr STARPU_ATTRIBUTE_UNUSED) { *cond = xbt_cond_init(); return 0; } static void _starpu_pthread_cond_auto_init(starpu_pthread_cond_t *cond) { /* Note: this is actually safe, because simgrid only preempts within * simgrid functions */ if (!*cond) { /* Here we may get preempted */ xbt_cond_t new_cond = xbt_cond_init(); if (!*cond) *cond = new_cond; else /* Somebody already initialized it while we were * calling xbt_cond_init, this one is now useless */ xbt_cond_destroy(new_cond); } } int starpu_pthread_cond_signal(starpu_pthread_cond_t *cond) { _starpu_pthread_cond_auto_init(cond); xbt_cond_signal(*cond); return 0; } int starpu_pthread_cond_broadcast(starpu_pthread_cond_t *cond) { _starpu_pthread_cond_auto_init(cond); xbt_cond_broadcast(*cond); return 0; } int starpu_pthread_cond_wait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex) { _STARPU_TRACE_COND_WAIT_BEGIN(); _starpu_pthread_cond_auto_init(cond); xbt_cond_wait(*cond, *mutex); _STARPU_TRACE_COND_WAIT_END(); return 0; } int starpu_pthread_cond_destroy(starpu_pthread_cond_t *cond) { if (*cond) xbt_cond_destroy(*cond); return 0; } int starpu_pthread_rwlock_init(starpu_pthread_rwlock_t *restrict rwlock, const starpu_pthread_rwlockattr_t *restrict attr STARPU_ATTRIBUTE_UNUSED) { return starpu_pthread_mutex_init(rwlock, NULL); } int starpu_pthread_rwlock_destroy(starpu_pthread_rwlock_t *rwlock) { return starpu_pthread_mutex_destroy(rwlock); } int starpu_pthread_rwlock_rdlock(starpu_pthread_rwlock_t *rwlock) { _STARPU_TRACE_RDLOCKING_RWLOCK(); int p_ret = starpu_pthread_mutex_lock(rwlock); _STARPU_TRACE_RWLOCK_RDLOCKED(); return p_ret; } int starpu_pthread_rwlock_tryrdlock(starpu_pthread_rwlock_t *rwlock) { int p_ret = starpu_pthread_mutex_trylock(rwlock); if (!p_ret) _STARPU_TRACE_RWLOCK_RDLOCKED(); return p_ret; } int starpu_pthread_rwlock_wrlock(starpu_pthread_rwlock_t *rwlock) { _STARPU_TRACE_WRLOCKING_RWLOCK(); int p_ret = starpu_pthread_mutex_lock(rwlock); _STARPU_TRACE_RWLOCK_WRLOCKED(); return p_ret; } int starpu_pthread_rwlock_trywrlock(starpu_pthread_rwlock_t *rwlock) { int p_ret = starpu_pthread_mutex_trylock(rwlock); if (!p_ret) _STARPU_TRACE_RWLOCK_RDLOCKED(); return p_ret; } int starpu_pthread_rwlock_unlock(starpu_pthread_rwlock_t *rwlock) { _STARPU_TRACE_UNLOCKING_RWLOCK(); int p_ret = starpu_pthread_mutex_unlock(rwlock); _STARPU_TRACE_RWLOCK_UNLOCKED(); return p_ret; } #if defined(STARPU_SIMGRID_HAVE_XBT_BARRIER_INIT) int starpu_pthread_barrier_init(starpu_pthread_barrier_t *restrict barrier, const starpu_pthread_barrierattr_t *restrict attr STARPU_ATTRIBUTE_UNUSED, unsigned count) { *barrier = xbt_barrier_init(count); return 0; } int starpu_pthread_barrier_destroy(starpu_pthread_barrier_t *barrier) { if (*barrier) xbt_barrier_destroy(*barrier); return 0; } int starpu_pthread_barrier_wait(starpu_pthread_barrier_t *barrier) { _STARPU_TRACE_BARRIER_WAIT_BEGIN(); xbt_barrier_wait(*barrier); _STARPU_TRACE_BARRIER_WAIT_END(); return 0; } #endif /* defined(STARPU_SIMGRID) */ #endif /* STARPU_SIMGRID */ #if (defined(STARPU_SIMGRID) && !defined(STARPU_SIMGRID_HAVE_XBT_BARRIER_INIT)) || (!defined(STARPU_SIMGRID) && !defined(STARPU_HAVE_PTHREAD_BARRIER)) int starpu_pthread_barrier_init(starpu_pthread_barrier_t *restrict barrier, const starpu_pthread_barrierattr_t *restrict attr, unsigned count) { int ret = starpu_pthread_mutex_init(&barrier->mutex, NULL); if (!ret) ret = starpu_pthread_cond_init(&barrier->cond, NULL); if (!ret) ret = starpu_pthread_cond_init(&barrier->cond_destroy, NULL); barrier->count = count; barrier->done = 0; barrier->busy = 0; return ret; } int starpu_pthread_barrier_destroy(starpu_pthread_barrier_t *barrier) { starpu_pthread_mutex_lock(&barrier->mutex); while (barrier->busy) { starpu_pthread_cond_wait(&barrier->cond_destroy, &barrier->mutex); } starpu_pthread_mutex_unlock(&barrier->mutex); int ret = starpu_pthread_mutex_destroy(&barrier->mutex); if (!ret) ret = starpu_pthread_cond_destroy(&barrier->cond); if (!ret) ret = starpu_pthread_cond_destroy(&barrier->cond_destroy); return ret; } int starpu_pthread_barrier_wait(starpu_pthread_barrier_t *barrier) { int ret = 0; _STARPU_TRACE_BARRIER_WAIT_BEGIN(); starpu_pthread_mutex_lock(&barrier->mutex); barrier->done++; if (barrier->done == barrier->count) { barrier->done = 0; starpu_pthread_cond_broadcast(&barrier->cond); ret = STARPU_PTHREAD_BARRIER_SERIAL_THREAD; } else { barrier->busy++; starpu_pthread_cond_wait(&barrier->cond, &barrier->mutex); barrier->busy--; starpu_pthread_cond_broadcast(&barrier->cond_destroy); } starpu_pthread_mutex_unlock(&barrier->mutex); _STARPU_TRACE_BARRIER_WAIT_END(); return ret; } #endif /* defined(STARPU_SIMGRID) || !defined(STARPU_HAVE_PTHREAD_BARRIER) */ #ifdef STARPU_FXT_LOCK_TRACES #if !defined(STARPU_SIMGRID) && !defined(_MSC_VER) /* !STARPU_SIMGRID */ int starpu_pthread_mutex_lock(starpu_pthread_mutex_t *mutex) { _STARPU_TRACE_LOCKING_MUTEX(); int p_ret = pthread_mutex_lock(mutex); _STARPU_TRACE_MUTEX_LOCKED(); return p_ret; } int starpu_pthread_mutex_unlock(starpu_pthread_mutex_t *mutex) { _STARPU_TRACE_UNLOCKING_MUTEX(); int p_ret = pthread_mutex_unlock(mutex); _STARPU_TRACE_MUTEX_UNLOCKED(); return p_ret; } int starpu_pthread_mutex_trylock(starpu_pthread_mutex_t *mutex) { int ret; _STARPU_TRACE_TRYLOCK_MUTEX(); ret = pthread_mutex_trylock(mutex); if (!ret) _STARPU_TRACE_MUTEX_LOCKED(); return ret; } int starpu_pthread_cond_wait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex) { _STARPU_TRACE_COND_WAIT_BEGIN(); int p_ret = pthread_cond_wait(cond, mutex); _STARPU_TRACE_COND_WAIT_END(); return p_ret; } int starpu_pthread_rwlock_rdlock(starpu_pthread_rwlock_t *rwlock) { _STARPU_TRACE_RDLOCKING_RWLOCK(); int p_ret = pthread_rwlock_rdlock(rwlock); _STARPU_TRACE_RWLOCK_RDLOCKED(); return p_ret; } int starpu_pthread_rwlock_tryrdlock(starpu_pthread_rwlock_t *rwlock) { _STARPU_TRACE_RDLOCKING_RWLOCK(); int p_ret = pthread_rwlock_tryrdlock(rwlock); if (!p_ret) _STARPU_TRACE_RWLOCK_RDLOCKED(); return p_ret; } int starpu_pthread_rwlock_wrlock(starpu_pthread_rwlock_t *rwlock) { _STARPU_TRACE_WRLOCKING_RWLOCK(); int p_ret = pthread_rwlock_wrlock(rwlock); _STARPU_TRACE_RWLOCK_WRLOCKED(); return p_ret; } int starpu_pthread_rwlock_trywrlock(starpu_pthread_rwlock_t *rwlock) { _STARPU_TRACE_WRLOCKING_RWLOCK(); int p_ret = pthread_rwlock_trywrlock(rwlock); if (!p_ret) _STARPU_TRACE_RWLOCK_WRLOCKED(); return p_ret; } int starpu_pthread_rwlock_unlock(starpu_pthread_rwlock_t *rwlock) { _STARPU_TRACE_UNLOCKING_RWLOCK(); int p_ret = pthread_rwlock_unlock(rwlock); _STARPU_TRACE_RWLOCK_UNLOCKED(); return p_ret; } #endif /* !defined(STARPU_SIMGRID) && !defined(_MSC_VER) */ #if !defined(STARPU_SIMGRID) && !defined(_MSC_VER) && defined(STARPU_HAVE_PTHREAD_BARRIER) int starpu_pthread_barrier_wait(starpu_pthread_barrier_t *barrier) { int ret; _STARPU_TRACE_BARRIER_WAIT_BEGIN(); ret = pthread_barrier_wait(barrier); _STARPU_TRACE_BARRIER_WAIT_END(); return ret; } #endif /* STARPU_SIMGRID, _MSC_VER, STARPU_HAVE_PTHREAD_BARRIER */ #endif /* STARPU_FXT_LOCK_TRACES */ /* "sched" variants, to be used (through the STARPU_PTHREAD_MUTEX_*LOCK_SCHED * macros of course) which record when the mutex is held or not */ int starpu_pthread_mutex_lock_sched(starpu_pthread_mutex_t *mutex) { int p_ret = starpu_pthread_mutex_lock(mutex); int workerid = starpu_worker_get_id(); if(workerid != -1 && _starpu_worker_mutex_is_sched_mutex(workerid, mutex)) _starpu_worker_set_flag_sched_mutex_locked(workerid, 1); return p_ret; } int starpu_pthread_mutex_unlock_sched(starpu_pthread_mutex_t *mutex) { int workerid = starpu_worker_get_id(); if(workerid != -1 && _starpu_worker_mutex_is_sched_mutex(workerid, mutex)) _starpu_worker_set_flag_sched_mutex_locked(workerid, 0); return starpu_pthread_mutex_unlock(mutex); } int starpu_pthread_mutex_trylock_sched(starpu_pthread_mutex_t *mutex) { int ret = starpu_pthread_mutex_trylock(mutex); if (!ret) { int workerid = starpu_worker_get_id(); if(workerid != -1 && _starpu_worker_mutex_is_sched_mutex(workerid, mutex)) _starpu_worker_set_flag_sched_mutex_locked(workerid, 1); } return ret; } #ifdef STARPU_DEBUG void starpu_pthread_mutex_check_sched(starpu_pthread_mutex_t *mutex, char *file, int line) { int workerid = starpu_worker_get_id(); STARPU_ASSERT_MSG(workerid == -1 || !_starpu_worker_mutex_is_sched_mutex(workerid, mutex), "%s:%d is locking/unlocking a sched mutex but not using STARPU_PTHREAD_MUTEX_LOCK_SCHED", file, line); } #endif #if defined(STARPU_SIMGRID) || (defined(STARPU_LINUX_SYS) && defined(STARPU_HAVE_XCHG)) || !defined(HAVE_PTHREAD_SPIN_LOCK) #undef starpu_pthread_spin_init int starpu_pthread_spin_init(starpu_pthread_spinlock_t *lock, int pshared) { return _starpu_pthread_spin_init(lock, pshared); } #undef starpu_pthread_spin_destroy int starpu_pthread_spin_destroy(starpu_pthread_spinlock_t *lock STARPU_ATTRIBUTE_UNUSED) { return _starpu_pthread_spin_destroy(lock); } #undef starpu_pthread_spin_lock int starpu_pthread_spin_lock(starpu_pthread_spinlock_t *lock) { return _starpu_pthread_spin_lock(lock); } #endif #if defined(STARPU_SIMGRID) || (defined(STARPU_LINUX_SYS) && defined(STARPU_HAVE_XCHG)) || !defined(STARPU_HAVE_PTHREAD_SPIN_LOCK) #if !defined(STARPU_SIMGRID) && defined(STARPU_LINUX_SYS) && defined(STARPU_HAVE_XCHG) int _starpu_pthread_spin_do_lock(starpu_pthread_spinlock_t *lock) { if (STARPU_VAL_COMPARE_AND_SWAP(&lock->taken, 0, 1) == 0) /* Got it on first try! */ return 0; /* Busy, spin a bit. */ unsigned i; for (i = 0; i < 128; i++) { /* Pause a bit before retrying */ STARPU_UYIELD(); /* And synchronize with other threads */ STARPU_SYNCHRONIZE(); if (!lock->taken) /* Holder released it, try again */ if (STARPU_VAL_COMPARE_AND_SWAP(&lock->taken, 0, 1) == 0) /* Got it! */ return 0; } /* We have spent enough time with spinning, let's block */ while (1) { /* Tell releaser to wake us */ unsigned prev = starpu_xchg(&lock->taken, 2); if (prev == 0) /* Ah, it just got released and we actually acquired * it! * Note: the sad thing is that we have just written 2, * so will spuriously try to wake a thread on unlock, * but we can not avoid it since we do not know whether * there are other threads sleeping or not. */ return 0; /* Now start sleeping (unless it was released in between) * We are sure to get woken because either * - some thread has not released the lock yet, and lock->taken * is 2, so it will wake us. * - some other thread started blocking, and will set * lock->taken back to 2 */ if (syscall(SYS_futex, &lock->taken, _starpu_futex_wait, 2, NULL, NULL, 0)) if (errno == ENOSYS) _starpu_futex_wait = FUTEX_WAIT; } } #endif #undef starpu_pthread_spin_trylock int starpu_pthread_spin_trylock(starpu_pthread_spinlock_t *lock) { return _starpu_pthread_spin_trylock(lock); } #undef starpu_pthread_spin_unlock int starpu_pthread_spin_unlock(starpu_pthread_spinlock_t *lock) { return _starpu_pthread_spin_unlock(lock); } #if !defined(STARPU_SIMGRID) && defined(STARPU_LINUX_SYS) && defined(STARPU_HAVE_XCHG) void _starpu_pthread_spin_do_unlock(starpu_pthread_spinlock_t *lock) { /* * Somebody to wake. Clear 'taken' and wake him. * Note that he may not be sleeping yet, but if he is not, we won't * since the value of 'taken' will have changed. */ lock->taken = 0; STARPU_SYNCHRONIZE(); if (syscall(SYS_futex, &lock->taken, _starpu_futex_wake, 1, NULL, NULL, 0) == -1) switch (errno) { case ENOSYS: _starpu_futex_wake = FUTEX_WAKE; if (syscall(SYS_futex, &lock->taken, _starpu_futex_wake, 1, NULL, NULL, 0) == -1) STARPU_ASSERT_MSG(0, "futex(wake) returned %d!", errno); break; case 0: break; default: STARPU_ASSERT_MSG(0, "futex returned %d!", errno); break; } } #endif #endif /* defined(STARPU_SIMGRID) || (defined(STARPU_LINUX_SYS) && defined(STARPU_HAVE_XCHG)) || !defined(STARPU_HAVE_PTHREAD_SPIN_LOCK) */ starpu-1.2.3+dfsg/src/common/thread.h000066400000000000000000000105361320135501600174520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2014, 2016-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPr is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __COMMON_THREAD_H__ #define __COMMON_THREAD_H__ #include #include #if defined(STARPU_LINUX_SYS) && defined(STARPU_HAVE_XCHG) int _starpu_pthread_spin_do_lock(starpu_pthread_spinlock_t *lock); #endif #if defined(STARPU_SIMGRID) || (defined(STARPU_LINUX_SYS) && defined(STARPU_HAVE_XCHG)) || !defined(STARPU_HAVE_PTHREAD_SPIN_LOCK) static inline int _starpu_pthread_spin_init(starpu_pthread_spinlock_t *lock, int pshared STARPU_ATTRIBUTE_UNUSED) { lock->taken = 0; return 0; } #define starpu_pthread_spin_init _starpu_pthread_spin_init static inline int _starpu_pthread_spin_destroy(starpu_pthread_spinlock_t *lock STARPU_ATTRIBUTE_UNUSED) { /* we don't do anything */ return 0; } #define starpu_pthread_spin_destroy _starpu_pthread_spin_destroy static inline int _starpu_pthread_spin_lock(starpu_pthread_spinlock_t *lock) { #ifdef STARPU_SIMGRID while (1) { if (STARPU_LIKELY(!lock->taken)) { lock->taken = 1; return 0; } /* Give hand to another thread, hopefully the one which has the * spinlock and probably just has also a short-lived mutex. */ MSG_process_sleep(0.000001); STARPU_UYIELD(); } #elif defined(STARPU_LINUX_SYS) && defined(STARPU_HAVE_XCHG) if (STARPU_LIKELY(STARPU_VAL_COMPARE_AND_SWAP(&lock->taken, 0, 1) == 0)) /* Got it on first try! */ return 0; return _starpu_pthread_spin_do_lock(lock); #else /* !SIMGRID && !LINUX */ uint32_t prev; do { prev = STARPU_TEST_AND_SET(&lock->taken, 1); if (STARPU_UNLIKELY(prev)) STARPU_UYIELD(); } while (STARPU_UNLIKELY(prev)); return 0; #endif } #define starpu_pthread_spin_lock _starpu_pthread_spin_lock static inline void _starpu_pthread_spin_checklocked(starpu_pthread_spinlock_t *lock STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_SIMGRID STARPU_ASSERT(lock->taken); #elif defined(STARPU_LINUX_SYS) && defined(STARPU_HAVE_XCHG) STARPU_ASSERT(lock->taken == 1 || lock->taken == 2); #else STARPU_ASSERT(lock->taken); #endif } static inline int _starpu_pthread_spin_trylock(starpu_pthread_spinlock_t *lock) { #ifdef STARPU_SIMGRID if (STARPU_UNLIKELY(lock->taken)) return EBUSY; lock->taken = 1; return 0; #elif defined(STARPU_LINUX_SYS) && defined(STARPU_HAVE_XCHG) unsigned prev; prev = STARPU_VAL_COMPARE_AND_SWAP(&lock->taken, 0, 1); return (prev == 0)?0:EBUSY; #else /* !SIMGRID && !LINUX */ uint32_t prev; prev = STARPU_TEST_AND_SET(&lock->taken, 1); return (prev == 0)?0:EBUSY; #endif } #define starpu_pthread_spin_trylock _starpu_pthread_spin_trylock #if defined(STARPU_LINUX_SYS) && defined(STARPU_HAVE_XCHG) void _starpu_pthread_spin_do_unlock(starpu_pthread_spinlock_t *lock); #endif static inline int _starpu_pthread_spin_unlock(starpu_pthread_spinlock_t *lock) { #ifdef STARPU_SIMGRID lock->taken = 0; #elif defined(STARPU_LINUX_SYS) && defined(STARPU_HAVE_XCHG) STARPU_ASSERT(lock->taken != 0); STARPU_SYNCHRONIZE(); unsigned next = STARPU_ATOMIC_ADD(&lock->taken, -1); if (STARPU_LIKELY(next == 0)) /* Nobody to wake, we are done */ return 0; _starpu_pthread_spin_do_unlock(lock); #else /* !SIMGRID && !LINUX */ STARPU_RELEASE(&lock->taken); #endif return 0; } #define starpu_pthread_spin_unlock _starpu_pthread_spin_unlock #else /* defined(STARPU_SIMGRID) || (defined(STARPU_LINUX_SYS) && defined(STARPU_HAVE_XCHG)) || !defined(STARPU_HAVE_PTHREAD_SPIN_LOCK) */ static inline void _starpu_pthread_spin_checklocked(starpu_pthread_spinlock_t *lock STARPU_ATTRIBUTE_UNUSED) { STARPU_ASSERT(pthread_spin_trylock((pthread_spinlock_t *)lock) != 0); } #endif /* defined(STARPU_SIMGRID) || (defined(STARPU_LINUX_SYS) && defined(STARPU_HAVE_XCHG)) || !defined(STARPU_HAVE_PTHREAD_SPIN_LOCK) */ #endif /* __COMMON_THREAD_H__ */ starpu-1.2.3+dfsg/src/common/timing.c000066400000000000000000000140001320135501600174530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012, 2014-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #ifdef STARPU_SIMGRID #include #endif #if defined(_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__) #include #endif #ifdef STARPU_SIMGRID void _starpu_timing_init(void) { } void _starpu_clock_gettime(struct timespec *ts) { double now = MSG_get_clock(); ts->tv_sec = floor(now); ts->tv_nsec = floor((now - ts->tv_sec) * 1000000000); } #elif defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC) #include #ifndef _POSIX_C_SOURCE /* for clock_gettime */ #define _POSIX_C_SOURCE 199309L #endif #ifdef __linux__ #ifndef CLOCK_MONOTONIC_RAW #define CLOCK_MONOTONIC_RAW 4 #endif #endif static struct timespec _starpu_reference_start_time_ts; /* Modern CPUs' clocks are usually not synchronized so we use a monotonic clock * to have consistent timing measurements. */ static void _starpu_clock_readtime(struct timespec *ts) { #if 0 /* def CLOCK_MONOTONIC_RAW */ /* The CLOCK_MONOTONIC_RAW clock is not * subject to NTP adjustments, but is not available on all systems (in that * case we use the CLOCK_MONOTONIC clock instead). */ /* In the distributed case, we *do* want NTP adjustments, to get * somehow-coherent traces, so this is disabled */ static int raw_supported = 0; switch (raw_supported) { case -1: break; case 1: clock_gettime(CLOCK_MONOTONIC_RAW, ts); return; case 0: if (clock_gettime(CLOCK_MONOTONIC_RAW, ts)) { raw_supported = -1; break; } else { raw_supported = 1; return; } } #endif clock_gettime(CLOCK_MONOTONIC, ts); } void _starpu_timing_init(void) { _starpu_clock_gettime(&_starpu_reference_start_time_ts); } void _starpu_clock_gettime(struct timespec *ts) { struct timespec absolute_ts; /* Read the current time */ _starpu_clock_readtime(&absolute_ts); /* Compute the relative time since initialization */ starpu_timespec_sub(&absolute_ts, &_starpu_reference_start_time_ts, ts); } #else // !HAVE_CLOCK_GETTIME #if defined(__i386__) || defined(__pentium__) || defined(__pentiumpro__) || defined(__i586__) || defined(__i686__) || defined(__k6__) || defined(__k7__) || defined(__x86_64__) union starpu_u_tick { uint64_t tick; struct { uint32_t low; uint32_t high; } sub; }; #define STARPU_GET_TICK(t) __asm__ volatile("rdtsc" : "=a" ((t).sub.low), "=d" ((t).sub.high)) #define STARPU_TICK_RAW_DIFF(t1, t2) ((t2).tick - (t1).tick) #define STARPU_TICK_DIFF(t1, t2) (STARPU_TICK_RAW_DIFF(t1, t2) - _starpu_residual) static union starpu_u_tick _starpu_reference_start_tick; static double _starpu_scale = 0.0; static unsigned long long _starpu_residual = 0; static int _starpu_inited = 0; #if defined(_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__) static int mygettimeofday(struct timeval *tv, void *tz) { if (tv) { FILETIME ft; unsigned long long res; GetSystemTimeAsFileTime(&ft); /* 100-nanosecond intervals since January 1, 1601 */ res = ft.dwHighDateTime; res <<= 32; res |= ft.dwLowDateTime; res /= 10; /* Now we have microseconds */ res -= (((1970-1601)*365) + 89) * 24ULL * 3600ULL * 1000000ULL; /* Now we are based on epoch */ tv->tv_sec = res / 1000000ULL; tv->tv_usec = res % 1000000ULL; } } #else #define mygettimeofday(tv,tz) gettimeofday(tv,tz) #endif void _starpu_timing_init(void) { static union starpu_u_tick t1, t2; int i; if (_starpu_inited) return; _starpu_residual = (unsigned long long)1 << 63; for(i = 0; i < 20; i++) { STARPU_GET_TICK(t1); STARPU_GET_TICK(t2); _starpu_residual = STARPU_MIN(_starpu_residual, STARPU_TICK_RAW_DIFF(t1, t2)); } { struct timeval tv1,tv2; STARPU_GET_TICK(t1); mygettimeofday(&tv1,0); starpu_sleep(0.5); STARPU_GET_TICK(t2); mygettimeofday(&tv2,0); _starpu_scale = ((tv2.tv_sec*1e6 + tv2.tv_usec) - (tv1.tv_sec*1e6 + tv1.tv_usec)) / (double)(STARPU_TICK_DIFF(t1, t2)); } STARPU_GET_TICK(_starpu_reference_start_tick); _starpu_inited = 1; } void _starpu_clock_gettime(struct timespec *ts) { union starpu_u_tick tick_now; STARPU_GET_TICK(tick_now); uint64_t elapsed_ticks = STARPU_TICK_DIFF(_starpu_reference_start_tick, tick_now); /* We convert this number into nano-seconds so that we can fill the * timespec structure. */ uint64_t elapsed_ns = (uint64_t)(((double)elapsed_ticks)*(_starpu_scale*1000.0)); long tv_nsec = (elapsed_ns % 1000000000); time_t tv_sec = (elapsed_ns / 1000000000); ts->tv_sec = tv_sec; ts->tv_nsec = tv_nsec; } #else // !HAVE_CLOCK_GETTIME & no rdtsc #warning StarPU could not find a timer, clock will always return 0 void _starpu_timing_init(void) { } void _starpu_clock_gettime(struct timespec *ts) { timerclear(ts); } #endif #endif // HAVE_CLOCK_GETTIME /* Returns the time elapsed between start and end in microseconds */ double starpu_timing_timespec_delay_us(struct timespec *start, struct timespec *end) { struct timespec diff; starpu_timespec_sub(end, start, &diff); double us = (diff.tv_sec*1e6) + (diff.tv_nsec*1e-3); return us; } double starpu_timing_timespec_to_us(struct timespec *ts) { return (1000000.0*ts->tv_sec) + (0.001*ts->tv_nsec); } double starpu_timing_now(void) { #ifdef STARPU_SIMGRID return MSG_get_clock()*1000000; #else struct timespec now; _starpu_clock_gettime(&now); return starpu_timing_timespec_to_us(&now); #endif } starpu-1.2.3+dfsg/src/common/timing.h000066400000000000000000000020641320135501600174670ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014 Université de Bordeaux * Copyright (C) 2010, 2011 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef TIMING_H #define TIMING_H /* * _starpu_timing_init must be called prior to using any of these timing * functions. */ #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include void _starpu_timing_init(void); void _starpu_clock_gettime(struct timespec *ts); #endif /* TIMING_H */ starpu-1.2.3+dfsg/src/common/uthash.h000066400000000000000000002023521320135501600174760ustar00rootroot00000000000000/* Copyright (c) 2003-2010, Troy D. Hanson http://uthash.sourceforge.net All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef UTHASH_H #define UTHASH_H #include /* memcmp,strlen */ #include /* ptrdiff_t */ /* These macros use decltype or the earlier __typeof GNU extension. As decltype is only available in newer compilers (VS2010 or gcc 4.3+ when compiling c++ source) this code uses whatever method is needed or, for VS2008 where neither is available, uses casting workarounds. */ #ifdef _MSC_VER /* MS compiler */ #if _MSC_VER >= 1600 && defined(__cplusplus) /* VS2010 or newer in C++ mode */ #define DECLTYPE(x) (decltype(x)) #else /* VS2008 or older (or VS2010 in C mode) */ #define NO_DECLTYPE #define DECLTYPE(x) #endif #else /* GNU, Sun and other compilers */ #define DECLTYPE(x) (__typeof(x)) #endif #ifdef NO_DECLTYPE #define DECLTYPE_ASSIGN(dst,src) \ do { \ char **_da_dst = (char**)(&(dst)); \ *_da_dst = (char*)(src); \ } while(0) #else #define DECLTYPE_ASSIGN(dst,src) \ do { \ (dst) = DECLTYPE(dst)(src); \ } while(0) #endif /* a number of the hash function use uint32_t which isn't defined on win32 */ #ifdef _MSC_VER typedef unsigned int uint32_t; #else #include /* uint32_t */ #endif #define UTHASH_VERSION 1.9.3 #define uthash_fatal(msg) exit(-1) /* fatal error (out of memory,etc) */ #define uthash_malloc(sz) malloc(sz) /* malloc fcn */ #define uthash_free(ptr,sz) free(ptr) /* free fcn */ #define uthash_noexpand_fyi(tbl) /* can be defined to log noexpand */ #define uthash_expand_fyi(tbl) /* can be defined to log expands */ /* initial number of buckets */ #define HASH_INITIAL_NUM_BUCKETS 32 /* initial number of buckets */ #define HASH_INITIAL_NUM_BUCKETS_LOG2 5 /* lg2 of initial number of buckets */ #define HASH_BKT_CAPACITY_THRESH 10 /* expand when bucket count reaches */ /* calculate the element whose hash handle address is hhe */ #define ELMT_FROM_HH(tbl,hhp) ((void*)(((char*)(hhp)) - ((tbl)->hho))) #define HASH_FIND(hh,head,keyptr,keylen,out) \ do { \ unsigned _hf_bkt,_hf_hashv; \ out=NULL; \ if (head) { \ HASH_FCN(keyptr,keylen, (head)->hh.tbl->num_buckets, _hf_hashv, _hf_bkt); \ if (HASH_BLOOM_TEST((head)->hh.tbl, _hf_hashv)) { \ HASH_FIND_IN_BKT((head)->hh.tbl, hh, (head)->hh.tbl->buckets[ _hf_bkt ], \ keyptr,keylen,out); \ } \ } \ } while (0) #ifdef HASH_BLOOM #define HASH_BLOOM_BITLEN (1ULL << HASH_BLOOM) #define HASH_BLOOM_BYTELEN (HASH_BLOOM_BITLEN/8) + ((HASH_BLOOM_BITLEN%8) ? 1:0) #define HASH_BLOOM_MAKE(tbl) \ do { \ (tbl)->bloom_nbits = HASH_BLOOM; \ (tbl)->bloom_bv = (uint8_t*)uthash_malloc(HASH_BLOOM_BYTELEN); \ if (!((tbl)->bloom_bv)) { uthash_fatal( "out of memory"); } \ memset((tbl)->bloom_bv, 0, HASH_BLOOM_BYTELEN); \ (tbl)->bloom_sig = HASH_BLOOM_SIGNATURE; \ } while (0); #define HASH_BLOOM_FREE(tbl) \ do { \ uthash_free((tbl)->bloom_bv, HASH_BLOOM_BYTELEN); \ } while (0); #define HASH_BLOOM_BITSET(bv,idx) (bv[(idx)/8] |= (1U << ((idx)%8))) #define HASH_BLOOM_BITTEST(bv,idx) (bv[(idx)/8] & (1U << ((idx)%8))) #define HASH_BLOOM_ADD(tbl,hashv) \ HASH_BLOOM_BITSET((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1))) #define HASH_BLOOM_TEST(tbl,hashv) \ HASH_BLOOM_BITTEST((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1))) #else #define HASH_BLOOM_MAKE(tbl) #define HASH_BLOOM_FREE(tbl) #define HASH_BLOOM_ADD(tbl,hashv) #define HASH_BLOOM_TEST(tbl,hashv) (1) #endif #define HASH_MAKE_TABLE(hh,head) \ do { \ (head)->hh.tbl = (UT_hash_table*)uthash_malloc( \ sizeof(UT_hash_table)); \ if (!((head)->hh.tbl)) { uthash_fatal( "out of memory"); } \ memset((head)->hh.tbl, 0, sizeof(UT_hash_table)); \ (head)->hh.tbl->tail = &((head)->hh); \ (head)->hh.tbl->num_buckets = HASH_INITIAL_NUM_BUCKETS; \ (head)->hh.tbl->log2_num_buckets = HASH_INITIAL_NUM_BUCKETS_LOG2; \ (head)->hh.tbl->hho = (char*)(&(head)->hh) - (char*)(head); \ (head)->hh.tbl->buckets = (UT_hash_bucket*)uthash_malloc( \ HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket)); \ if (! (head)->hh.tbl->buckets) { uthash_fatal( "out of memory"); } \ memset((head)->hh.tbl->buckets, 0, \ HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket)); \ HASH_BLOOM_MAKE((head)->hh.tbl); \ (head)->hh.tbl->signature = HASH_SIGNATURE; \ } while(0) #define HASH_ADD(hh,head,fieldname,keylen_in,add) \ HASH_ADD_KEYPTR(hh,head,&add->fieldname,keylen_in,add) #ifdef STARPU_DEBUG /* Check that we don't insert the same key several times */ #define HASH_CHECK_KEY(hh,head,keyptr,keylen,out) \ do { \ __typeof__(out) _out; \ HASH_FIND(hh,head,keyptr,keylen,_out); \ STARPU_ASSERT(!_out); \ } while(0) #else #define HASH_CHECK_KEY(hh,head,keyptr,keylen,out) #endif #define HASH_ADD_KEYPTR(hh,head,keyptr,keylen_in,add) \ do { \ unsigned _ha_bkt; \ HASH_CHECK_KEY(hh,head,keyptr,keylen_in,add); \ (add)->hh.next = NULL; \ (add)->hh.key = (char*)keyptr; \ (add)->hh.keylen = keylen_in; \ if (!(head)) { \ head = (add); \ (head)->hh.prev = NULL; \ HASH_MAKE_TABLE(hh,head); \ } else { \ (head)->hh.tbl->tail->next = (add); \ (add)->hh.prev = ELMT_FROM_HH((head)->hh.tbl, (head)->hh.tbl->tail); \ (head)->hh.tbl->tail = &((add)->hh); \ } \ (head)->hh.tbl->num_items++; \ (add)->hh.tbl = (head)->hh.tbl; \ HASH_FCN(keyptr,keylen_in, (head)->hh.tbl->num_buckets, \ (add)->hh.hashv, _ha_bkt); \ HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt],&(add)->hh); \ HASH_BLOOM_ADD((head)->hh.tbl,(add)->hh.hashv); \ HASH_EMIT_KEY(hh,head,keyptr,keylen_in); \ HASH_FSCK(hh,head); \ } while(0) #define HASH_TO_BKT( hashv, num_bkts, bkt ) \ do { \ bkt = ((hashv) & ((num_bkts) - 1)); \ } while(0) /* delete "delptr" from the hash table. * "the usual" patch-up process for the app-order doubly-linked-list. * The use of _hd_hh_del below deserves special explanation. * These used to be expressed using (delptr) but that led to a bug * if someone used the same symbol for the head and deletee, like * HASH_DELETE(hh,users,users); * We want that to work, but by changing the head (users) below * we were forfeiting our ability to further refer to the deletee (users) * in the patch-up process. Solution: use scratch space to * copy the deletee pointer, then the latter references are via that * scratch pointer rather than through the repointed (users) symbol. */ #define HASH_DELETE(hh,head,delptr) \ do { \ unsigned _hd_bkt; \ struct UT_hash_handle *_hd_hh_del; \ if ( ((delptr)->hh.prev == NULL) && ((delptr)->hh.next == NULL) ) { \ uthash_free((head)->hh.tbl->buckets, \ (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \ HASH_BLOOM_FREE((head)->hh.tbl); \ uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \ head = NULL; \ } else { \ _hd_hh_del = &((delptr)->hh); \ if ((delptr) == ELMT_FROM_HH((head)->hh.tbl,(head)->hh.tbl->tail)) { \ (head)->hh.tbl->tail = \ (UT_hash_handle*)((char*)((delptr)->hh.prev) + \ (head)->hh.tbl->hho); \ } \ if ((delptr)->hh.prev) { \ ((UT_hash_handle*)((char*)((delptr)->hh.prev) + \ (head)->hh.tbl->hho))->next = (delptr)->hh.next; \ } else { \ DECLTYPE_ASSIGN(head,(delptr)->hh.next); \ } \ if (_hd_hh_del->next) { \ ((UT_hash_handle*)((char*)_hd_hh_del->next + \ (head)->hh.tbl->hho))->prev = \ _hd_hh_del->prev; \ } \ HASH_TO_BKT( _hd_hh_del->hashv, (head)->hh.tbl->num_buckets, _hd_bkt); \ HASH_DEL_IN_BKT(hh,(head)->hh.tbl->buckets[_hd_bkt], _hd_hh_del); \ (head)->hh.tbl->num_items--; \ } \ HASH_FSCK(hh,head); \ } while (0) /* convenience forms of HASH_FIND/HASH_ADD/HASH_DEL */ #define HASH_FIND_STR(head,findstr,out) \ HASH_FIND(hh,head,findstr,strlen(findstr),out) #define HASH_ADD_STR(head,strfield,add) \ HASH_ADD(hh,head,strfield[0],strlen(add->strfield),add) #define HASH_FIND_INT(head,findint,out) \ HASH_FIND(hh,head,findint,sizeof(int),out) #define HASH_ADD_INT(head,intfield,add) \ HASH_ADD(hh,head,intfield,sizeof(int),add) #define HASH_FIND_PTR(head,findptr,out) \ HASH_FIND(hh,head,findptr,sizeof(void *),out) #define HASH_ADD_PTR(head,ptrfield,add) \ HASH_ADD(hh,head,ptrfield,sizeof(void *),add) #define HASH_DEL(head,delptr) \ HASH_DELETE(hh,head,delptr) /* HASH_FSCK checks hash integrity on every add/delete when HASH_DEBUG is defined. * This is for uthash developer only; it compiles away if HASH_DEBUG isn't defined. */ #ifdef HASH_DEBUG #define HASH_OOPS(...) do { fprintf(stderr,__VA_ARGS__); exit(-1); } while (0) #define HASH_FSCK(hh,head) \ do { \ unsigned _bkt_i; \ unsigned _count, _bkt_count; \ char *_prev; \ struct UT_hash_handle *_thh; \ if (head) { \ _count = 0; \ for( _bkt_i = 0; _bkt_i < (head)->hh.tbl->num_buckets; _bkt_i++) { \ _bkt_count = 0; \ _thh = (head)->hh.tbl->buckets[_bkt_i].hh_head; \ _prev = NULL; \ while (_thh) { \ if (_prev != (char*)(_thh->hh_prev)) { \ HASH_OOPS("invalid hh_prev %p, actual %p\n", \ _thh->hh_prev, _prev ); \ } \ _bkt_count++; \ _prev = (char*)(_thh); \ _thh = _thh->hh_next; \ } \ _count += _bkt_count; \ if ((head)->hh.tbl->buckets[_bkt_i].count != _bkt_count) { \ HASH_OOPS("invalid bucket count %u, actual %u\n", \ (head)->hh.tbl->buckets[_bkt_i].count, _bkt_count); \ } \ } \ if (_count != (head)->hh.tbl->num_items) { \ HASH_OOPS("invalid hh item count %u, actual %u\n", \ (head)->hh.tbl->num_items, _count ); \ } \ /* traverse hh in app order; check next/prev integrity, count */ \ _count = 0; \ _prev = NULL; \ _thh = &(head)->hh; \ while (_thh) { \ _count++; \ if (_prev !=(char*)(_thh->prev)) { \ HASH_OOPS("invalid prev %p, actual %p\n", \ _thh->prev, _prev ); \ } \ _prev = (char*)ELMT_FROM_HH((head)->hh.tbl, _thh); \ _thh = ( _thh->next ? (UT_hash_handle*)((char*)(_thh->next) + \ (head)->hh.tbl->hho) : NULL ); \ } \ if (_count != (head)->hh.tbl->num_items) { \ HASH_OOPS("invalid app item count %u, actual %u\n", \ (head)->hh.tbl->num_items, _count ); \ } \ } \ } while (0) #else #define HASH_FSCK(hh,head) #endif /* When compiled with -DHASH_EMIT_KEYS, length-prefixed keys are emitted to * the descriptor to which this macro is defined for tuning the hash function. * The app can #include to get the prototype for write(2). */ #ifdef HASH_EMIT_KEYS #define HASH_EMIT_KEY(hh,head,keyptr,fieldlen) \ do { \ unsigned _klen = fieldlen; \ write(HASH_EMIT_KEYS, &_klen, sizeof(_klen)); \ write(HASH_EMIT_KEYS, keyptr, fieldlen); \ } while (0) #else #define HASH_EMIT_KEY(hh,head,keyptr,fieldlen) #endif /* default to Jenkin's hash unless overridden e.g. DHASH_FUNCTION=HASH_SAX */ #ifdef HASH_FUNCTION #define HASH_FCN HASH_FUNCTION #else #define HASH_FCN HASH_JEN #endif /* The Bernstein hash function, used in Perl prior to v5.6 */ #define HASH_BER(key,keylen,num_bkts,hashv,bkt) \ do { \ unsigned _hb_keylen=keylen; \ char *_hb_key=(char*)(key); \ (hashv) = 0; \ while (_hb_keylen--) { (hashv) = ((hashv) * 33) + *_hb_key++; } \ bkt = (hashv) & (num_bkts-1); \ } while (0) /* SAX/FNV/OAT/JEN hash functions are macro variants of those listed at * http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx */ #define HASH_SAX(key,keylen,num_bkts,hashv,bkt) \ do { \ unsigned _sx_i; \ char *_hs_key=(char*)(key); \ hashv = 0; \ for(_sx_i=0; _sx_i < keylen; _sx_i++) \ hashv ^= (hashv << 5) + (hashv >> 2) + _hs_key[_sx_i]; \ bkt = hashv & (num_bkts-1); \ } while (0) #define HASH_FNV(key,keylen,num_bkts,hashv,bkt) \ do { \ unsigned _fn_i; \ char *_hf_key=(char*)(key); \ hashv = 2166136261UL; \ for(_fn_i=0; _fn_i < keylen; _fn_i++) \ hashv = (hashv * 16777619) ^ _hf_key[_fn_i]; \ bkt = hashv & (num_bkts-1); \ } while(0); #define HASH_OAT(key,keylen,num_bkts,hashv,bkt) \ do { \ unsigned _ho_i; \ char *_ho_key=(char*)(key); \ hashv = 0; \ for(_ho_i=0; _ho_i < keylen; _ho_i++) { \ hashv += _ho_key[_ho_i]; \ hashv += (hashv << 10); \ hashv ^= (hashv >> 6); \ } \ hashv += (hashv << 3); \ hashv ^= (hashv >> 11); \ hashv += (hashv << 15); \ bkt = hashv & (num_bkts-1); \ } while(0) #define HASH_JEN_MIX(a,b,c) \ do { \ a -= b; a -= c; a ^= ( c >> 13 ); \ b -= c; b -= a; b ^= ( a << 8 ); \ c -= a; c -= b; c ^= ( b >> 13 ); \ a -= b; a -= c; a ^= ( c >> 12 ); \ b -= c; b -= a; b ^= ( a << 16 ); \ c -= a; c -= b; c ^= ( b >> 5 ); \ a -= b; a -= c; a ^= ( c >> 3 ); \ b -= c; b -= a; b ^= ( a << 10 ); \ c -= a; c -= b; c ^= ( b >> 15 ); \ } while (0) #define HASH_JEN(key,keylen,num_bkts,hashv,bkt) \ do { \ unsigned _hj_i,_hj_j,_hj_k; \ char *_hj_key=(char*)(key); \ hashv = 0xfeedbeef; \ _hj_i = _hj_j = 0x9e3779b9; \ _hj_k = keylen; \ while (_hj_k >= 12) { \ _hj_i += (_hj_key[0] + ( (unsigned)_hj_key[1] << 8 ) \ + ( (unsigned)_hj_key[2] << 16 ) \ + ( (unsigned)_hj_key[3] << 24 ) ); \ _hj_j += (_hj_key[4] + ( (unsigned)_hj_key[5] << 8 ) \ + ( (unsigned)_hj_key[6] << 16 ) \ + ( (unsigned)_hj_key[7] << 24 ) ); \ hashv += (_hj_key[8] + ( (unsigned)_hj_key[9] << 8 ) \ + ( (unsigned)_hj_key[10] << 16 ) \ + ( (unsigned)_hj_key[11] << 24 ) ); \ \ HASH_JEN_MIX(_hj_i, _hj_j, hashv); \ \ _hj_key += 12; \ _hj_k -= 12; \ } \ hashv += keylen; \ switch ( _hj_k ) { \ case 11: hashv += ( (unsigned)_hj_key[10] << 24 ); \ /* FALLTHRU */ \ case 10: hashv += ( (unsigned)_hj_key[9] << 16 ); \ /* FALLTHRU */ \ case 9: hashv += ( (unsigned)_hj_key[8] << 8 ); \ /* FALLTHRU */ \ case 8: _hj_j += ( (unsigned)_hj_key[7] << 24 ); \ /* FALLTHRU */ \ case 7: _hj_j += ( (unsigned)_hj_key[6] << 16 ); \ /* FALLTHRU */ \ case 6: _hj_j += ( (unsigned)_hj_key[5] << 8 ); \ /* FALLTHRU */ \ case 5: _hj_j += _hj_key[4]; \ /* FALLTHRU */ \ case 4: _hj_i += ( (unsigned)_hj_key[3] << 24 ); \ /* FALLTHRU */ \ case 3: _hj_i += ( (unsigned)_hj_key[2] << 16 ); \ /* FALLTHRU */ \ case 2: _hj_i += ( (unsigned)_hj_key[1] << 8 ); \ /* FALLTHRU */ \ case 1: _hj_i += _hj_key[0]; \ /* FALLTHRU */ \ } \ HASH_JEN_MIX(_hj_i, _hj_j, hashv); \ bkt = hashv & (num_bkts-1); \ } while(0) /* The Paul Hsieh hash function */ #undef get16bits #if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \ || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__) #define get16bits(d) (*((const uint16_t *) (d))) #endif #if !defined (get16bits) #define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8) \ +(uint32_t)(((const uint8_t *)(d))[0]) ) #endif #define HASH_SFH(key,keylen,num_bkts,hashv,bkt) \ do { \ char *_sfh_key=(char*)(key); \ uint32_t _sfh_tmp, _sfh_len = keylen; \ \ int _sfh_rem = _sfh_len & 3; \ _sfh_len >>= 2; \ hashv = 0xcafebabe; \ \ /* Main loop */ \ for (;_sfh_len > 0; _sfh_len--) { \ hashv += get16bits (_sfh_key); \ _sfh_tmp = (get16bits (_sfh_key+2) << 11) ^ hashv; \ hashv = (hashv << 16) ^ _sfh_tmp; \ _sfh_key += 2*sizeof (uint16_t); \ hashv += hashv >> 11; \ } \ \ /* Handle end cases */ \ switch (_sfh_rem) { \ case 3: hashv += get16bits (_sfh_key); \ hashv ^= hashv << 16; \ hashv ^= _sfh_key[sizeof (uint16_t)] << 18; \ hashv += hashv >> 11; \ break; \ case 2: hashv += get16bits (_sfh_key); \ hashv ^= hashv << 11; \ hashv += hashv >> 17; \ break; \ case 1: hashv += *_sfh_key; \ hashv ^= hashv << 10; \ hashv += hashv >> 1; \ } \ \ /* Force "avalanching" of final 127 bits */ \ hashv ^= hashv << 3; \ hashv += hashv >> 5; \ hashv ^= hashv << 4; \ hashv += hashv >> 17; \ hashv ^= hashv << 25; \ hashv += hashv >> 6; \ bkt = hashv & (num_bkts-1); \ } while(0); #ifdef HASH_USING_NO_STRICT_ALIASING /* The MurmurHash exploits some CPU's (e.g. x86) tolerance for unaligned reads. * For other types of CPU's (e.g. Sparc) an unaligned read causes a bus error. * So MurmurHash comes in two versions, the faster unaligned one and the slower * aligned one. We only use the faster one on CPU's where we know it's safe. * * Note the preprocessor built-in defines can be emitted using: * * gcc -m64 -dM -E - < /dev/null (on gcc) * cc -## a.c (where a.c is a simple test file) (Sun Studio) */ #if (defined(__i386__) || defined(__x86_64__)) #define HASH_MUR HASH_MUR_UNALIGNED #else #define HASH_MUR HASH_MUR_ALIGNED #endif /* Appleby's MurmurHash fast version for unaligned-tolerant archs like i386 */ #define HASH_MUR_UNALIGNED(key,keylen,num_bkts,hashv,bkt) \ do { \ const unsigned int _mur_m = 0x5bd1e995; \ const int _mur_r = 24; \ hashv = 0xcafebabe ^ keylen; \ char *_mur_key = (char *)(key); \ uint32_t _mur_tmp, _mur_len = keylen; \ \ for (;_mur_len >= 4; _mur_len-=4) { \ _mur_tmp = *(uint32_t *)_mur_key; \ _mur_tmp *= _mur_m; \ _mur_tmp ^= _mur_tmp >> _mur_r; \ _mur_tmp *= _mur_m; \ hashv *= _mur_m; \ hashv ^= _mur_tmp; \ _mur_key += 4; \ } \ \ switch(_mur_len) \ { \ case 3: hashv ^= _mur_key[2] << 16; \ case 2: hashv ^= _mur_key[1] << 8; \ case 1: hashv ^= _mur_key[0]; \ hashv *= _mur_m; \ }; \ \ hashv ^= hashv >> 13; \ hashv *= _mur_m; \ hashv ^= hashv >> 15; \ \ bkt = hashv & (num_bkts-1); \ } while(0) /* Appleby's MurmurHash version for alignment-sensitive archs like Sparc */ #define HASH_MUR_ALIGNED(key,keylen,num_bkts,hashv,bkt) \ do { \ const unsigned int _mur_m = 0x5bd1e995; \ const int _mur_r = 24; \ hashv = 0xcafebabe ^ (keylen); \ char *_mur_key = (char *)(key); \ uint32_t _mur_len = keylen; \ int _mur_align = (int)_mur_key & 3; \ \ if (_mur_align && (_mur_len >= 4)) { \ unsigned _mur_t = 0, _mur_d = 0; \ switch(_mur_align) { \ case 1: _mur_t |= _mur_key[2] << 16; \ case 2: _mur_t |= _mur_key[1] << 8; \ case 3: _mur_t |= _mur_key[0]; \ } \ _mur_t <<= (8 * _mur_align); \ _mur_key += 4-_mur_align; \ _mur_len -= 4-_mur_align; \ int _mur_sl = 8 * (4-_mur_align); \ int _mur_sr = 8 * _mur_align; \ \ for (;_mur_len >= 4; _mur_len-=4) { \ _mur_d = *(unsigned *)_mur_key; \ _mur_t = (_mur_t >> _mur_sr) | (_mur_d << _mur_sl); \ unsigned _mur_k = _mur_t; \ _mur_k *= _mur_m; \ _mur_k ^= _mur_k >> _mur_r; \ _mur_k *= _mur_m; \ hashv *= _mur_m; \ hashv ^= _mur_k; \ _mur_t = _mur_d; \ _mur_key += 4; \ } \ _mur_d = 0; \ if(_mur_len >= _mur_align) { \ switch(_mur_align) { \ case 3: _mur_d |= _mur_key[2] << 16; \ case 2: _mur_d |= _mur_key[1] << 8; \ case 1: _mur_d |= _mur_key[0]; \ } \ unsigned _mur_k = (_mur_t >> _mur_sr) | (_mur_d << _mur_sl); \ _mur_k *= _mur_m; \ _mur_k ^= _mur_k >> _mur_r; \ _mur_k *= _mur_m; \ hashv *= _mur_m; \ hashv ^= _mur_k; \ _mur_k += _mur_align; \ _mur_len -= _mur_align; \ \ switch(_mur_len) \ { \ case 3: hashv ^= _mur_key[2] << 16; \ case 2: hashv ^= _mur_key[1] << 8; \ case 1: hashv ^= _mur_key[0]; \ hashv *= _mur_m; \ } \ } else { \ switch(_mur_len) \ { \ case 3: _mur_d ^= _mur_key[2] << 16; \ case 2: _mur_d ^= _mur_key[1] << 8; \ case 1: _mur_d ^= _mur_key[0]; \ case 0: hashv ^= (_mur_t >> _mur_sr) | (_mur_d << _mur_sl); \ hashv *= _mur_m; \ } \ } \ \ hashv ^= hashv >> 13; \ hashv *= _mur_m; \ hashv ^= hashv >> 15; \ } else { \ for (;_mur_len >= 4; _mur_len-=4) { \ unsigned _mur_k = *(unsigned*)_mur_key; \ _mur_k *= _mur_m; \ _mur_k ^= _mur_k >> _mur_r; \ _mur_k *= _mur_m; \ hashv *= _mur_m; \ hashv ^= _mur_k; \ _mur_key += 4; \ } \ switch(_mur_len) \ { \ case 3: hashv ^= _mur_key[2] << 16; \ case 2: hashv ^= _mur_key[1] << 8; \ case 1: hashv ^= _mur_key[0]; \ hashv *= _mur_m; \ } \ \ hashv ^= hashv >> 13; \ hashv *= _mur_m; \ hashv ^= hashv >> 15; \ } \ bkt = hashv & (num_bkts-1); \ } while(0) #endif /* HASH_USING_NO_STRICT_ALIASING */ /* key comparison function; return 0 if keys equal */ #define HASH_KEYCMP(a,b,len) memcmp(a,b,len) /* iterate over items in a known bucket to find desired item */ #define HASH_FIND_IN_BKT(tbl,hh,head,keyptr,keylen_in,out) \ do { \ if (head.hh_head) DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,head.hh_head)); \ else out=NULL; \ while (out) { \ if (out->hh.keylen == keylen_in) { \ if ((HASH_KEYCMP(out->hh.key,keyptr,keylen_in)) == 0) break; \ } \ if (out->hh.hh_next) DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,out->hh.hh_next)); \ else out = NULL; \ } \ } while(0) /* add an item to a bucket */ #define HASH_ADD_TO_BKT(head,addhh) \ do { \ head.count++; \ (addhh)->hh_next = head.hh_head; \ (addhh)->hh_prev = NULL; \ if (head.hh_head) { (head).hh_head->hh_prev = (addhh); } \ (head).hh_head=addhh; \ if (head.count >= ((head.expand_mult+1) * HASH_BKT_CAPACITY_THRESH) \ && (addhh)->tbl->noexpand != 1) { \ HASH_EXPAND_BUCKETS((addhh)->tbl); \ } \ } while(0) /* remove an item from a given bucket */ #define HASH_DEL_IN_BKT(hh,head,hh_del) \ (head).count--; \ if ((head).hh_head == hh_del) { \ (head).hh_head = hh_del->hh_next; \ } \ if (hh_del->hh_prev) { \ hh_del->hh_prev->hh_next = hh_del->hh_next; \ } \ if (hh_del->hh_next) { \ hh_del->hh_next->hh_prev = hh_del->hh_prev; \ } /* Bucket expansion has the effect of doubling the number of buckets * and redistributing the items into the new buckets. Ideally the * items will distribute more or less evenly into the new buckets * (the extent to which this is true is a measure of the quality of * the hash function as it applies to the key domain). * * With the items distributed into more buckets, the chain length * (item count) in each bucket is reduced. Thus by expanding buckets * the hash keeps a bound on the chain length. This bounded chain * length is the essence of how a hash provides constant time lookup. * * The calculation of tbl->ideal_chain_maxlen below deserves some * explanation. First, keep in mind that we're calculating the ideal * maximum chain length based on the *new* (doubled) bucket count. * In fractions this is just n/b (n=number of items,b=new num buckets). * Since the ideal chain length is an integer, we want to calculate * ceil(n/b). We don't depend on floating point arithmetic in this * hash, so to calculate ceil(n/b) with integers we could write * * ceil(n/b) = (n/b) + ((n%b)?1:0) * * and in fact a previous version of this hash did just that. * But now we have improved things a bit by recognizing that b is * always a power of two. We keep its base 2 log handy (call it lb), * so now we can write this with a bit shift and logical AND: * * ceil(n/b) = (n>>lb) + ( (n & (b-1)) ? 1:0) * */ #define HASH_EXPAND_BUCKETS(tbl) \ do { \ unsigned _he_bkt; \ unsigned _he_bkt_i; \ struct UT_hash_handle *_he_thh, *_he_hh_nxt; \ UT_hash_bucket *_he_new_buckets, *_he_newbkt; \ _he_new_buckets = (UT_hash_bucket*)uthash_malloc( \ 2 * tbl->num_buckets * sizeof(struct UT_hash_bucket)); \ if (!_he_new_buckets) { uthash_fatal( "out of memory"); } \ memset(_he_new_buckets, 0, \ 2 * tbl->num_buckets * sizeof(struct UT_hash_bucket)); \ tbl->ideal_chain_maxlen = \ (tbl->num_items >> (tbl->log2_num_buckets+1)) + \ ((tbl->num_items & ((tbl->num_buckets*2)-1)) ? 1 : 0); \ tbl->nonideal_items = 0; \ for(_he_bkt_i = 0; _he_bkt_i < tbl->num_buckets; _he_bkt_i++) \ { \ _he_thh = tbl->buckets[ _he_bkt_i ].hh_head; \ while (_he_thh) { \ _he_hh_nxt = _he_thh->hh_next; \ HASH_TO_BKT( _he_thh->hashv, tbl->num_buckets*2, _he_bkt); \ _he_newbkt = &(_he_new_buckets[ _he_bkt ]); \ if (++(_he_newbkt->count) > tbl->ideal_chain_maxlen) { \ tbl->nonideal_items++; \ _he_newbkt->expand_mult = _he_newbkt->count / \ tbl->ideal_chain_maxlen; \ } \ _he_thh->hh_prev = NULL; \ _he_thh->hh_next = _he_newbkt->hh_head; \ if (_he_newbkt->hh_head) _he_newbkt->hh_head->hh_prev = \ _he_thh; \ _he_newbkt->hh_head = _he_thh; \ _he_thh = _he_hh_nxt; \ } \ } \ uthash_free( tbl->buckets, tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \ tbl->num_buckets *= 2; \ tbl->log2_num_buckets++; \ tbl->buckets = _he_new_buckets; \ tbl->ineff_expands = (tbl->nonideal_items > (tbl->num_items >> 1)) ? \ (tbl->ineff_expands+1) : 0; \ if (tbl->ineff_expands > 1) { \ tbl->noexpand=1; \ uthash_noexpand_fyi(tbl); \ } \ uthash_expand_fyi(tbl); \ } while(0) /* This is an adaptation of Simon Tatham's O(n log(n)) mergesort */ /* Note that HASH_SORT assumes the hash handle name to be hh. * HASH_SRT was added to allow the hash handle name to be passed in. */ #define HASH_SORT(head,cmpfcn) HASH_SRT(hh,head,cmpfcn) #define HASH_SRT(hh,head,cmpfcn) \ do { \ unsigned _hs_i; \ unsigned _hs_looping,_hs_nmerges,_hs_insize,_hs_psize,_hs_qsize; \ struct UT_hash_handle *_hs_p, *_hs_q, *_hs_e, *_hs_list, *_hs_tail; \ if (head) { \ _hs_insize = 1; \ _hs_looping = 1; \ _hs_list = &((head)->hh); \ while (_hs_looping) { \ _hs_p = _hs_list; \ _hs_list = NULL; \ _hs_tail = NULL; \ _hs_nmerges = 0; \ while (_hs_p) { \ _hs_nmerges++; \ _hs_q = _hs_p; \ _hs_psize = 0; \ for ( _hs_i = 0; _hs_i < _hs_insize; _hs_i++ ) { \ _hs_psize++; \ _hs_q = (UT_hash_handle*)((_hs_q->next) ? \ ((void*)((char*)(_hs_q->next) + \ (head)->hh.tbl->hho)) : NULL); \ if (! (_hs_q) ) break; \ } \ _hs_qsize = _hs_insize; \ while ((_hs_psize > 0) || ((_hs_qsize > 0) && _hs_q )) { \ if (_hs_psize == 0) { \ _hs_e = _hs_q; \ _hs_q = (UT_hash_handle*)((_hs_q->next) ? \ ((void*)((char*)(_hs_q->next) + \ (head)->hh.tbl->hho)) : NULL); \ _hs_qsize--; \ } else if ( (_hs_qsize == 0) || !(_hs_q) ) { \ _hs_e = _hs_p; \ _hs_p = (UT_hash_handle*)((_hs_p->next) ? \ ((void*)((char*)(_hs_p->next) + \ (head)->hh.tbl->hho)) : NULL); \ _hs_psize--; \ } else if (( \ cmpfcn(DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_p)), \ DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_q))) \ ) <= 0) { \ _hs_e = _hs_p; \ _hs_p = (UT_hash_handle*)((_hs_p->next) ? \ ((void*)((char*)(_hs_p->next) + \ (head)->hh.tbl->hho)) : NULL); \ _hs_psize--; \ } else { \ _hs_e = _hs_q; \ _hs_q = (UT_hash_handle*)((_hs_q->next) ? \ ((void*)((char*)(_hs_q->next) + \ (head)->hh.tbl->hho)) : NULL); \ _hs_qsize--; \ } \ if ( _hs_tail ) { \ _hs_tail->next = ((_hs_e) ? \ ELMT_FROM_HH((head)->hh.tbl,_hs_e) : NULL); \ } else { \ _hs_list = _hs_e; \ } \ _hs_e->prev = ((_hs_tail) ? \ ELMT_FROM_HH((head)->hh.tbl,_hs_tail) : NULL); \ _hs_tail = _hs_e; \ } \ _hs_p = _hs_q; \ } \ _hs_tail->next = NULL; \ if ( _hs_nmerges <= 1 ) { \ _hs_looping=0; \ (head)->hh.tbl->tail = _hs_tail; \ DECLTYPE_ASSIGN(head,ELMT_FROM_HH((head)->hh.tbl, _hs_list)); \ } \ _hs_insize *= 2; \ } \ HASH_FSCK(hh,head); \ } \ } while (0) /* This function selects items from one hash into another hash. * The end result is that the selected items have dual presence * in both hashes. There is no copy of the items made; rather * they are added into the new hash through a secondary hash * hash handle that must be present in the structure. */ #define HASH_SELECT(hh_dst, dst, hh_src, src, cond) \ do { \ unsigned _src_bkt, _dst_bkt; \ void *_last_elt=NULL, *_elt; \ UT_hash_handle *_src_hh, *_dst_hh, *_last_elt_hh=NULL; \ ptrdiff_t _dst_hho = ((char*)(&(dst)->hh_dst) - (char*)(dst)); \ if (src) { \ for(_src_bkt=0; _src_bkt < (src)->hh_src.tbl->num_buckets; _src_bkt++) { \ for(_src_hh = (src)->hh_src.tbl->buckets[_src_bkt].hh_head; \ _src_hh; \ _src_hh = _src_hh->hh_next) { \ _elt = ELMT_FROM_HH((src)->hh_src.tbl, _src_hh); \ if (cond(_elt)) { \ _dst_hh = (UT_hash_handle*)(((char*)_elt) + _dst_hho); \ _dst_hh->key = _src_hh->key; \ _dst_hh->keylen = _src_hh->keylen; \ _dst_hh->hashv = _src_hh->hashv; \ _dst_hh->prev = _last_elt; \ _dst_hh->next = NULL; \ if (_last_elt_hh) { _last_elt_hh->next = _elt; } \ if (!dst) { \ DECLTYPE_ASSIGN(dst,_elt); \ HASH_MAKE_TABLE(hh_dst,dst); \ } else { \ _dst_hh->tbl = (dst)->hh_dst.tbl; \ } \ HASH_TO_BKT(_dst_hh->hashv, _dst_hh->tbl->num_buckets, _dst_bkt); \ HASH_ADD_TO_BKT(_dst_hh->tbl->buckets[_dst_bkt],_dst_hh); \ (dst)->hh_dst.tbl->num_items++; \ _last_elt = _elt; \ _last_elt_hh = _dst_hh; \ } \ } \ } \ } \ HASH_FSCK(hh_dst,dst); \ } while (0) #define HASH_CLEAR(hh,head) \ do { \ if (head) { \ uthash_free((head)->hh.tbl->buckets, \ (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket)); \ uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \ (head)=NULL; \ } \ } while(0) #ifdef NO_DECLTYPE #define HASH_ITER(hh,head,el,tmp) \ for((el)=(head), (*(char**)(&(tmp)))=(char*)((head)?(head)->hh.next:NULL); \ el; (el)=(tmp),(*(char**)(&(tmp)))=(char*)((tmp)?(tmp)->hh.next:NULL)) #else #define HASH_ITER(hh,head,el,tmp) \ for((el)=(head),(tmp)=DECLTYPE(el)((head)?(head)->hh.next:NULL); \ el; (el)=(tmp),(tmp)=DECLTYPE(el)((tmp)?(tmp)->hh.next:NULL)) #endif /* obtain a count of items in the hash */ #define HASH_COUNT(head) HASH_CNT(hh,head) #define HASH_CNT(hh,head) ((head)?((head)->hh.tbl->num_items):0) typedef struct UT_hash_bucket { struct UT_hash_handle *hh_head; unsigned count; /* expand_mult is normally set to 0. In this situation, the max chain length * threshold is enforced at its default value, HASH_BKT_CAPACITY_THRESH. (If * the bucket's chain exceeds this length, bucket expansion is triggered). * However, setting expand_mult to a non-zero value delays bucket expansion * (that would be triggered by additions to this particular bucket) * until its chain length reaches a *multiple* of HASH_BKT_CAPACITY_THRESH. * (The multiplier is simply expand_mult+1). The whole idea of this * multiplier is to reduce bucket expansions, since they are expensive, in * situations where we know that a particular bucket tends to be overused. * It is better to let its chain length grow to a longer yet-still-bounded * value, than to do an O(n) bucket expansion too often. */ unsigned expand_mult; } UT_hash_bucket; /* random signature used only to find hash tables in external analysis */ #define HASH_SIGNATURE 0xa0111fe1 #define HASH_BLOOM_SIGNATURE 0xb12220f2 typedef struct UT_hash_table { UT_hash_bucket *buckets; unsigned num_buckets, log2_num_buckets; unsigned num_items; struct UT_hash_handle *tail; /* tail hh in app order, for fast append */ ptrdiff_t hho; /* hash handle offset (byte pos of hash handle in element */ /* in an ideal situation (all buckets used equally), no bucket would have * more than ceil(#items/#buckets) items. that's the ideal chain length. */ unsigned ideal_chain_maxlen; /* nonideal_items is the number of items in the hash whose chain position * exceeds the ideal chain maxlen. these items pay the penalty for an uneven * hash distribution; reaching them in a chain traversal takes >ideal steps */ unsigned nonideal_items; /* ineffective expands occur when a bucket doubling was performed, but * afterward, more than half the items in the hash had nonideal chain * positions. If this happens on two consecutive expansions we inhibit any * further expansion, as it's not helping; this happens when the hash * function isn't a good fit for the key domain. When expansion is inhibited * the hash will still work, albeit no longer in constant time. */ unsigned ineff_expands, noexpand; uint32_t signature; /* used only to find hash tables in external analysis */ #ifdef HASH_BLOOM uint32_t bloom_sig; /* used only to test bloom exists in external analysis */ uint8_t *bloom_bv; char bloom_nbits; #endif } UT_hash_table; typedef struct UT_hash_handle { struct UT_hash_table *tbl; void *prev; /* prev element in app order */ void *next; /* next element in app order */ struct UT_hash_handle *hh_prev; /* previous hh in bucket order */ struct UT_hash_handle *hh_next; /* next hh in bucket order */ void *key; /* ptr to enclosing struct's key */ unsigned keylen; /* enclosing struct's key len */ unsigned hashv; /* result of hash-fcn(key) */ } UT_hash_handle; #endif /* UTHASH_H */ starpu-1.2.3+dfsg/src/common/utils.c000066400000000000000000000271401320135501600173350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif #include #if defined(_WIN32) && !defined(__CYGWIN__) #include #include #define mkdir(path, mode) mkdir(path) #if !defined(__MINGW32__) #define ftruncate(fd, length) _chsize(fd, length) #endif #endif #ifndef O_BINARY #define O_BINARY 0 #endif #if !defined(O_DIRECT) && defined(F_NOCACHE) #define O_DIRECT F_NOCACHE #endif #ifndef O_DIRECT #define O_DIRECT 0 #endif int _starpu_silent; void _starpu_util_init(void) { _starpu_silent = starpu_get_env_number_default("STARPU_SILENT", 0); STARPU_HG_DISABLE_CHECKING(_starpu_silent); } #if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__MINGW32__) #include static char * dirname(char * path) { char drive[_MAX_DRIVE]; char dir[_MAX_DIR]; /* Remove trailing slash */ while (strlen(path) > 0 && (*(path+strlen(path)-1) == '/' || *(path+strlen(path)-1) == '\\')) *(path+strlen(path)-1) = '\0'; _splitpath(path, drive, dir, NULL, NULL); _makepath(path, drive, dir, NULL, NULL); return path; } #else #include #endif /* Function with behaviour like `mkdir -p'. This function was adapted from * http://niallohiggins.com/2009/01/08/mkpath-mkdir-p-alike-in-c-for-unix/ */ int _starpu_mkpath(const char *s, mode_t mode) { int olderrno; char *q, *r = NULL, *path = NULL, *up = NULL; int rv; rv = -1; if (strcmp(s, ".") == 0 || strcmp(s, "/") == 0 #if defined(_WIN32) /* C:/ or C:\ */ || (s[0] && s[1] == ':' && (s[2] == '/' || s[2] == '\\') && !s[3]) #endif ) return 0; if ((path = strdup(s)) == NULL) STARPU_ABORT(); if ((q = strdup(s)) == NULL) STARPU_ABORT(); if ((r = dirname(q)) == NULL) goto out; if ((up = strdup(r)) == NULL) STARPU_ABORT(); if ((_starpu_mkpath(up, mode) == -1) && (errno != EEXIST)) goto out; struct stat sb; if (stat(path, &sb) == 0) { if (!S_ISDIR(sb.st_mode)) { _STARPU_MSG("Error: %s is not a directory:\n", path); STARPU_ABORT(); } /* It already exists and is a directory. */ rv = 0; } else { if ((mkdir(path, mode) == -1) && (errno != EEXIST)) rv = -1; else rv = 0; } out: olderrno = errno; if (up) free(up); free(q); free(path); errno = olderrno; return rv; } void _starpu_mkpath_and_check(const char *path, mode_t mode) { int ret; ret = _starpu_mkpath(path, mode); if (ret == -1 && errno != EEXIST) { _STARPU_MSG("Error making StarPU directory %s:\n", path); perror("mkdir"); STARPU_ABORT(); } } char *_starpu_mkdtemp_internal(char *tmpl) { int len = (int)strlen(tmpl); int i; int count = 1; int ret; int first_letter = (int)'a'; int nb_letters = 25; int len_template = 6; // Initialize template for(i=len-len_template ; iworker_is_initialized) _STARPU_DISP( "getenv should not be called from running workers, only for main() or worker initialization, since it is not reentrant\n"); #endif #endif return getenv(str); } starpu-1.2.3+dfsg/src/common/utils.h000066400000000000000000000161441320135501600173440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __COMMON_UTILS_H__ #define __COMMON_UTILS_H__ #include #include #include #include #include #include #include #ifdef STARPU_HAVE_SCHED_YIELD #include #endif #ifdef STARPU_HAVE_HELGRIND_H #include #endif #ifndef DO_CREQ_v_WW #define DO_CREQ_v_WW(_creqF, _ty1F, _arg1F, _ty2F, _arg2F) ((void)0) #endif #ifndef DO_CREQ_v_W #define DO_CREQ_v_W(_creqF, _ty1F, _arg1F) ((void)0) #endif #ifndef ANNOTATE_HAPPENS_BEFORE #define ANNOTATE_HAPPENS_BEFORE(obj) ((void)0) #endif #ifndef ANNOTATE_HAPPENS_BEFORE_FORGET_ALL #define ANNOTATE_HAPPENS_BEFORE_FORGET_ALL(obj) ((void)0) #endif #ifndef ANNOTATE_HAPPENS_AFTER #define ANNOTATE_HAPPENS_AFTER(obj) ((void)0) #endif #ifndef VALGRIND_HG_DISABLE_CHECKING #define VALGRIND_HG_DISABLE_CHECKING(start, len) ((void)0) #endif #ifndef VALGRIND_HG_ENABLE_CHECKING #define VALGRIND_HG_ENABLE_CHECKING(start, len) ((void)0) #endif #ifndef VALGRIND_STACK_REGISTER #define VALGRIND_STACK_REGISTER(stackbottom, stacktop) 0 #endif #ifndef VALGRIND_STACK_DEREGISTER #define VALGRIND_STACK_DEREGISTER(id) ((void)0) #endif #ifndef RUNNING_ON_VALGRIND #define RUNNING_ON_VALGRIND 0 #endif #ifdef STARPU_SANITIZE_THREAD #define STARPU_RUNNING_ON_VALGRIND 1 #else #define STARPU_RUNNING_ON_VALGRIND RUNNING_ON_VALGRIND #endif #define STARPU_HG_DISABLE_CHECKING(variable) VALGRIND_HG_DISABLE_CHECKING(&(variable), sizeof(variable)) #define STARPU_HG_ENABLE_CHECKING(variable) VALGRIND_HG_ENABLE_CHECKING(&(variable), sizeof(variable)) #if defined(__KNC__) || defined(__KNF__) #define STARPU_DEBUG_PREFIX "[starpu-mic]" #else #define STARPU_DEBUG_PREFIX "[starpu]" #endif /* This is needed in some places to make valgrind yield to another thread to be * able to progress. */ #if defined(__i386__) || defined(__x86_64__) #define _STARPU_UYIELD() __asm__ __volatile("rep; nop") #else #define _STARPU_UYIELD() ((void)0) #endif #if defined(STARPU_HAVE_SCHED_YIELD) && defined(STARPU_HAVE_HELGRIND_H) #define STARPU_UYIELD() do { if (STARPU_RUNNING_ON_VALGRIND) sched_yield(); else _STARPU_UYIELD(); } while (0) #else #define STARPU_UYIELD() _STARPU_UYIELD() #endif #ifdef STARPU_VERBOSE # define _STARPU_DEBUG(fmt, ...) do { if (!_starpu_silent) {fprintf(stderr, STARPU_DEBUG_PREFIX"[%s] " fmt ,__starpu_func__ ,## __VA_ARGS__); fflush(stderr); }} while(0) #else # define _STARPU_DEBUG(fmt, ...) do { } while (0) #endif #ifdef STARPU_EXTRA_VERBOSE # define _STARPU_EXTRA_DEBUG(fmt, ...) do { if (!_starpu_silent) {fprintf(stderr, STARPU_DEBUG_PREFIX"[%s] " fmt ,__starpu_func__ ,## __VA_ARGS__); fflush(stderr); }} while(0) #else # define _STARPU_EXTRA_DEBUG(fmt, ...) do { } while (0) #endif #ifdef STARPU_EXTRA_VERBOSE # define _STARPU_LOG_IN() do { if (!_starpu_silent) {fprintf(stderr, STARPU_DEBUG_PREFIX"[%ld][%s:%s@%d] -->\n", pthread_self(), __starpu_func__,__FILE__, __LINE__); }} while(0) # define _STARPU_LOG_OUT() do { if (!_starpu_silent) {fprintf(stderr, STARPU_DEBUG_PREFIX"[%ld][%s:%s@%d] <--\n", pthread_self(), __starpu_func__, __FILE__, __LINE__); }} while(0) # define _STARPU_LOG_OUT_TAG(outtag) do { if (!_starpu_silent) {fprintf(stderr, STARPU_DEBUG_PREFIX"[%ld][%s:%s@%d] <-- (%s)\n", pthread_self(), __starpu_func__, __FILE__, __LINE__, outtag); }} while(0) #else # define _STARPU_LOG_IN() # define _STARPU_LOG_OUT() # define _STARPU_LOG_OUT_TAG(outtag) #endif /* TODO: cache */ #define _STARPU_MSG(fmt, ...) do { fprintf(stderr, STARPU_DEBUG_PREFIX"[%s] " fmt ,__starpu_func__ ,## __VA_ARGS__); } while(0) #define _STARPU_DISP(fmt, ...) do { if (!_starpu_silent) {fprintf(stderr, STARPU_DEBUG_PREFIX"[%s] " fmt ,__starpu_func__ ,## __VA_ARGS__); }} while(0) #define _STARPU_ERROR(fmt, ...) \ do { \ fprintf(stderr, "\n\n[starpu][%s] Error: " fmt ,__starpu_func__ ,## __VA_ARGS__); \ fprintf(stderr, "\n\n"); \ STARPU_ABORT(); \ } while (0) #define _STARPU_MALLOC(ptr, size) do { ptr = malloc(size); STARPU_ASSERT_MSG(ptr != NULL, "Cannot allocate %ld bytes\n", (long) (size)); } while (0) #define _STARPU_CALLOC(ptr, nmemb, size) do { ptr = calloc(nmemb, size); STARPU_ASSERT_MSG(ptr != NULL, "Cannot allocate %ld bytes\n", (long) (nmemb*size)); } while (0) #define _STARPU_REALLOC(ptr, size) do { void *_new_ptr = realloc(ptr, size); STARPU_ASSERT_MSG(_new_ptr != NULL, "Cannot reallocate %ld bytes\n", (long) (size)); ptr = _new_ptr;} while (0) #define _STARPU_MALLOC_CAST(ptr, size, type) do { ptr = (type) malloc(size); STARPU_ASSERT_MSG(ptr != NULL, "Cannot allocate %ld bytes\n", (long) (size)); } while (0) #define _STARPU_FREE(ptr) do { free(ptr); ptr = NULL; } while(0) #ifdef _MSC_VER #define _STARPU_IS_ZERO(a) (a == 0.0) #else #define _STARPU_IS_ZERO(a) (fpclassify(a) == FP_ZERO) #endif char *_starpu_mkdtemp_internal(char *tmpl); char *_starpu_mkdtemp(char *tmpl); int _starpu_mkpath(const char *s, mode_t mode); void _starpu_mkpath_and_check(const char *s, mode_t mode); char *_starpu_mktemp(const char *directory, int flags, int *fd); /* This version creates a hierarchy of n temporary directories, useful when * creating a lot of temporary files to be stored in the same place */ char *_starpu_mktemp_many(const char *directory, int depth, int flags, int *fd); void _starpu_rmtemp_many(char *path, int depth); void _starpu_rmdir_many(char *path, int depth); int _starpu_fftruncate(FILE *file, size_t length); int _starpu_ftruncate(int fd, size_t length); int _starpu_frdlock(FILE *file); int _starpu_frdunlock(FILE *file); int _starpu_fwrlock(FILE *file); int _starpu_fwrunlock(FILE *file); char *_starpu_get_home_path(void); void _starpu_gethostname(char *hostname, size_t size); /* If FILE is currently on a comment line, eat it. */ void _starpu_drop_comments(FILE *f); struct _starpu_job; /* Returns the symbol associated to that job if any. */ const char *_starpu_job_get_model_name(struct _starpu_job *j); /* Returns the name associated to that job if any. */ const char *_starpu_job_get_task_name(struct _starpu_job *j); struct starpu_codelet; /* Returns the symbol associated to that job if any. */ const char *_starpu_codelet_get_model_name(struct starpu_codelet *cl); int _starpu_check_mutex_deadlock(starpu_pthread_mutex_t *mutex); void _starpu_util_init(void); #endif // __COMMON_UTILS_H__ starpu-1.2.3+dfsg/src/core/000077500000000000000000000000001320135501600154655ustar00rootroot00000000000000starpu-1.2.3+dfsg/src/core/combined_workers.c000066400000000000000000000132761320135501600211760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2014, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include // for qsort #include #include #include #ifdef __GLIBC__ #include #endif #if defined(_WIN32) && !defined(__CYGWIN__) #include #endif static int compar_int(const void *pa, const void *pb) { int a = *((int *)pa); int b = *((int *)pb); return a - b; } static void sort_workerid_array(int nworkers, int workerid_array[]) { qsort(workerid_array, nworkers, sizeof(int), compar_int); } /* Create a new worker id for a combination of workers. This method should * typically be called at the initialization of the scheduling policy. This * worker should be the combination of the list of id's contained in the * workerid_array array which has nworkers entries. This function returns * the identifier of the combined worker in case of success, a negative value * is returned otherwise. */ int starpu_combined_worker_assign_workerid(int nworkers, int workerid_array[]) { int new_workerid; /* Return the number of actual workers. */ struct _starpu_machine_config *config = _starpu_get_machine_config(); int basic_worker_count = (int)config->topology.nworkers; int combined_worker_id = (int)config->topology.ncombinedworkers; /* We sort the ids */ sort_workerid_array(nworkers, workerid_array); /* Test that all workers are not combined workers already. */ int i; for (i = 0; i < nworkers; i++) { int id = workerid_array[i]; /* We only combine valid "basic" workers */ if ((id < 0) || (id >= basic_worker_count)) return -EINVAL; #ifdef STARPU_USE_MIC STARPU_ASSERT(config->workers[id].arch == STARPU_CPU_WORKER || config->workers[id].arch == STARPU_MIC_WORKER); STARPU_ASSERT(config->workers[id].worker_mask == STARPU_CPU || config->workers[id].worker_mask == STARPU_MIC); #else/* STARPU_USE_MIC */ /* We only combine CPUs */ STARPU_ASSERT(config->workers[id].arch == STARPU_CPU_WORKER); STARPU_ASSERT(config->workers[id].worker_mask == STARPU_CPU); #endif /* STARPU_USE_MIC */ } /* Get an id for that combined worker. Note that this is not thread * safe because this method should only be called when the scheduler * is being initialized. */ new_workerid = basic_worker_count + combined_worker_id; config->topology.ncombinedworkers++; #if 0 fprintf(stderr, "COMBINED WORKERS "); for (i = 0; i < nworkers; i++) { fprintf(stderr, "%d ", workerid_array[i]); } fprintf(stderr, "into worker %d\n", new_workerid); #endif for(i = 0; i < nworkers; i++) _starpu_get_worker_struct(workerid_array[i])->combined_workerid = new_workerid; struct _starpu_combined_worker *combined_worker = &config->combined_workers[combined_worker_id]; combined_worker->worker_size = nworkers; _STARPU_MALLOC(combined_worker->perf_arch.devices, sizeof(struct starpu_perfmodel_device)); combined_worker->perf_arch.ndevices = 1; combined_worker->perf_arch.devices[0].type = config->workers[workerid_array[0]].perf_arch.devices[0].type; combined_worker->perf_arch.devices[0].devid = config->workers[workerid_array[0]].perf_arch.devices[0].devid; combined_worker->perf_arch.devices[0].ncores = nworkers; combined_worker->worker_mask = config->workers[workerid_array[0]].worker_mask; #ifdef STARPU_USE_MP combined_worker->count = nworkers -1; STARPU_PTHREAD_MUTEX_INIT(&combined_worker->count_mutex,NULL); #endif /* We assume that the memory node should either be that of the first * entry, and it is very likely that every worker in the combination * should be on the same memory node.*/ int first_id = workerid_array[0]; combined_worker->memory_node = config->workers[first_id].memory_node; /* Save the list of combined workers */ memcpy(&combined_worker->combined_workerid, workerid_array, nworkers*sizeof(int)); /* Note that we maintain both the cpu_set and the hwloc_cpu_set so that * the application is not forced to use hwloc when it is available. */ #ifdef __GLIBC__ CPU_ZERO(&combined_worker->cpu_set); #endif /* __GLIBC__ */ #ifdef STARPU_HAVE_HWLOC combined_worker->hwloc_cpu_set = hwloc_bitmap_alloc(); #endif for (i = 0; i < nworkers; i++) { #if defined(__GLIBC__) || defined(STARPU_HAVE_HWLOC) int id = workerid_array[i]; #ifdef __GLIBC__ #ifdef CPU_OR CPU_OR(&combined_worker->cpu_set, &combined_worker->cpu_set, &config->workers[id].cpu_set); #else int j; for (j = 0; j < CPU_SETSIZE; j++) { if (CPU_ISSET(j, &config->workers[id].cpu_set)) CPU_SET(j, &combined_worker->cpu_set); } #endif #endif /* __GLIBC__ */ #ifdef STARPU_HAVE_HWLOC hwloc_bitmap_or(combined_worker->hwloc_cpu_set, combined_worker->hwloc_cpu_set, config->workers[id].hwloc_cpu_set); #endif #endif } return new_workerid; } int starpu_combined_worker_get_description(int workerid, int *worker_size, int **combined_workerid) { /* Check that this is the id of a combined worker */ struct _starpu_combined_worker *worker; worker = _starpu_get_combined_worker_struct(workerid); STARPU_ASSERT(worker); if (worker_size) *worker_size = worker->worker_size; if (combined_workerid) *combined_workerid = worker->combined_workerid; return 0; } starpu-1.2.3+dfsg/src/core/combined_workers.h000066400000000000000000000014351320135501600211750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __COMBINED_WORKERS_H__ #define __COMBINED_WORKERS_H__ #include #include #endif // __COMBINED_WORKERS_H__ starpu-1.2.3+dfsg/src/core/debug.c000066400000000000000000000064341320135501600167260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2013, 2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2013, 2015, 2017 CNRS * Copyright (C) 2016 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #ifdef STARPU_VERBOSE /* we want a single writer at the same time to have a log that is readable */ static starpu_pthread_mutex_t logfile_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static FILE *logfile = NULL; #endif /* Tell gdb whether FXT is compiled in or not */ int _starpu_use_fxt #ifdef STARPU_USE_FXT = 1 #endif ; void _starpu_open_debug_logfile(void) { #ifdef STARPU_VERBOSE /* what is the name of the file ? default = "starpu.log" */ char *logfile_name; logfile_name = starpu_getenv("STARPU_LOGFILENAME"); if (!logfile_name) { logfile_name = "starpu.log"; } logfile = fopen(logfile_name, "w+"); STARPU_ASSERT_MSG(logfile, "Could not open file %s for verbose logs (%s). You can specify another file destination with the STARPU_LOGFILENAME environment variable", logfile_name, strerror(errno)); #endif } void _starpu_close_debug_logfile(void) { #ifdef STARPU_VERBOSE if (logfile) { fclose(logfile); logfile = NULL; } #endif } void _starpu_print_to_logfile(const char *format STARPU_ATTRIBUTE_UNUSED, ...) { #ifdef STARPU_VERBOSE va_list args; va_start(args, format); STARPU_PTHREAD_MUTEX_LOCK(&logfile_mutex); vfprintf(logfile, format, args); STARPU_PTHREAD_MUTEX_UNLOCK(&logfile_mutex); va_end( args ); #endif } /* Record codelet to give ayudame nice function ids starting from 0. */ #if defined(STARPU_USE_AYUDAME1) struct ayudame_codelet { char *name; struct starpu_codelet *cl; } *codelets; static unsigned ncodelets, ncodelets_alloc; static starpu_pthread_mutex_t ayudame_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; int64_t _starpu_ayudame_get_func_id(struct starpu_codelet *cl) { unsigned i; const char *name; if (!cl) return 0; name = _starpu_codelet_get_model_name(cl); STARPU_PTHREAD_MUTEX_LOCK(&ayudame_mutex); for (i=0; i < ncodelets; i++) { if (codelets[i].cl == cl && ((!name && !codelets[i].name) || ((name && codelets[i].name) && !strcmp(codelets[i].name, name)))) { STARPU_PTHREAD_MUTEX_UNLOCK(&ayudame_mutex); return i + 1; } } if (ncodelets == ncodelets_alloc) { if (!ncodelets_alloc) ncodelets_alloc = 16; else ncodelets_alloc *= 2; _STARPU_REALLOC(codelets, ncodelets_alloc * sizeof(*codelets)); } codelets[ncodelets].cl = cl; if (name) /* codelet might be freed by user */ codelets[ncodelets].name = strdup(name); else codelets[ncodelets].name = NULL; i = ncodelets++; if (name) AYU_event(AYU_REGISTERFUNCTION, i+1, (void*) name); STARPU_PTHREAD_MUTEX_UNLOCK(&ayudame_mutex); return i + 1; } #endif /* AYUDAME1 */ starpu-1.2.3+dfsg/src/core/debug.h000066400000000000000000000221161320135501600167260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2013, 2016 Université de Bordeaux * Copyright (C) 2010, 2011 CNRS * Copyright (C) 2016 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DEBUG_H__ #define __DEBUG_H__ #include #include #include #include #include #if defined(STARPU_USE_AYUDAME1) /* Ayudame 1 API */ # include # ifndef AYU_RT_STARPU # define AYU_RT_STARPU 4 # endif # define STARPU_AYU_EVENT AYU_event # define STARPU_AYU_PREINIT() \ if (AYU_event) \ { \ enum ayu_runtime_t ayu_rt = AYU_RT_STARPU; \ AYU_event(AYU_PREINIT, 0, (void*) &ayu_rt); \ } # define STARPU_AYU_INIT() \ if (AYU_event) \ { \ AYU_event(AYU_INIT, 0, NULL); \ } # define STARPU_AYU_FINISH() \ if (AYU_event) \ { \ AYU_event(AYU_FINISH, 0, NULL); \ } # define STARPU_AYU_ADDDEPENDENCY(previous, handle, job_id) \ if (AYU_event) \ { \ uintptr_t __AYU_data[3] = { (previous), (uintptr_t) (handle), (uintptr_t) (handle) }; \ AYU_event(AYU_ADDDEPENDENCY, (job_id), __AYU_data); \ } # define STARPU_AYU_REMOVETASK(job_id) \ if (AYU_event) \ { \ AYU_event(AYU_REMOVETASK, (job_id), NULL); \ } # define STARPU_AYU_ADDTASK(job_id, task) \ if (AYU_event) \ { \ int64_t __AYU_data[2] = { \ ((struct starpu_task *)(task))!=NULL?_starpu_ayudame_get_func_id(((struct starpu_task *)(task))->cl):0, \ ((struct starpu_task *)(task))!=NULL?((struct starpu_task *)(task))->priority-STARPU_MIN_PRIO:0 \ }; \ AYU_event(AYU_ADDTASK, (job_id), __AYU_data); \ } # define STARPU_AYU_PRERUNTASK(job_id, workerid) \ if (AYU_event) \ { \ intptr_t __id = (workerid); \ AYU_event(AYU_PRERUNTASK, (job_id), &__id); \ } # define STARPU_AYU_RUNTASK(job_id) \ if (AYU_event) \ { \ AYU_event(AYU_RUNTASK, (job_id), NULL); \ } # define STARPU_AYU_POSTRUNTASK(job_id) \ if (AYU_event) \ { \ AYU_event(AYU_POSTRUNTASK, (job_id), NULL); \ } # define STARPU_AYU_ADDTOTASKQUEUE(job_id, worker_id) \ if (AYU_event) \ { \ intptr_t __id = (worker_id); \ AYU_event(AYU_ADDTASKTOQUEUE, (job_id), &__id); \ } # define STARPU_AYU_BARRIER() \ if (AYU_event) \ { \ AYU_event(AYU_BARRIER, 0, NULL); \ } #elif defined(STARPU_USE_AYUDAME2) /* Ayudame 2 API */ # include # define STARPU_AYU_EVENT ayu_event # define STARPU_AYU_PREINIT() # define STARPU_AYU_INIT() # define STARPU_AYU_FINISH() \ if (ayu_event){ \ ayu_client_id_t __cli_id = get_client_id(AYU_CLIENT_STARPU); \ ayu_event_data_t __data; \ __data.common.client_id = __cli_id; \ ayu_event(AYU_FINISH, __data); \ } # define STARPU_AYU_ADDDEPENDENCY(previous, handle, job_id) \ if (ayu_event) \ { \ ayu_client_id_t __cli_id = get_client_id(AYU_CLIENT_STARPU); \ ayu_event_data_t __data; \ uint64_t __dep_id=0; \ __dep_id |= (previous) << 0; \ __dep_id |= (job_id) << 24; \ __dep_id |= (uintptr_t) (handle) << 48; \ __data.common.client_id = __cli_id; \ __data.add_dependency.dependency_id = __dep_id; \ __data.add_dependency.from_id=(previous); \ __data.add_dependency.to_id=(job_id); \ __data.add_dependency.dependency_label = "dep"; \ ayu_event(AYU_ADDDEPENDENCY, __data); \ ayu_wipe_data(&__data); \ \ char __buf[32]; \ snprintf(__buf, 32, "%llu", (unsigned long long)(uintptr_t) (handle)); \ __data.common.client_id = __cli_id; \ __data.set_property.property_owner_id = __dep_id; \ __data.set_property.key = "dep_address_value"; \ __data.set_property.value = __buf; \ ayu_event(AYU_SETPROPERTY, __data); \ ayu_wipe_data(&__data); \ } # define STARPU_AYU_REMOVETASK(job_id) \ if (ayu_event) \ { \ ayu_client_id_t __cli_id = get_client_id(AYU_CLIENT_STARPU); \ ayu_event_data_t __data; \ __data.common.client_id = __cli_id; \ __data.set_property.property_owner_id = (job_id); \ __data.set_property.key = "state"; \ __data.set_property.value = "finished"; \ ayu_event(AYU_SETPROPERTY, __data); \ ayu_wipe_data(&__data); \ } # define STARPU_AYU_ADDTASK(job_id, task) \ if (ayu_event) \ { \ ayu_client_id_t __cli_id = get_client_id(AYU_CLIENT_STARPU); \ ayu_event_data_t __data; \ __data.common.client_id = __cli_id; \ __data.add_task.task_id = (job_id); \ __data.add_task.scope_id = 0; \ __data.add_task.task_label = "task"; \ ayu_event(AYU_ADDTASK, __data); \ ayu_wipe_data(&__data); \ \ if ((task) != NULL) \ { \ char __buf[32]; \ snprintf(__buf, 32, "%d", ((struct starpu_task *)(task))->priority); \ __data.common.client_id = __cli_id; \ __data.set_property.property_owner_id = (job_id); \ __data.set_property.key = "priority"; \ __data.set_property.value = __buf; \ ayu_event(AYU_SETPROPERTY, __data); \ ayu_wipe_data(&__data); \ \ const char *__name = ((struct starpu_task *)(task))->name != NULL?((struct starpu_task *)(task))->name: \ ((struct starpu_task *)(task))->cl->name != NULL?((struct starpu_task *)(task))->cl->name:""; \ __data.common.client_id = __cli_id; \ __data.set_property.property_owner_id = (job_id); \ __data.set_property.key = "function_name"; \ __data.set_property.value = __name; \ ayu_event(AYU_SETPROPERTY, __data); \ ayu_wipe_data(&__data); \ } \ } # define STARPU_AYU_PRERUNTASK(job_id, workerid) \ if (ayu_event) \ { \ ayu_client_id_t __cli_id = get_client_id(AYU_CLIENT_STARPU); \ ayu_event_data_t __data; \ __data.common.client_id = __cli_id; \ __data.set_property.property_owner_id = (job_id); \ __data.set_property.key = "state"; \ __data.set_property.value = "running"; \ ayu_event(AYU_SETPROPERTY, __data); \ ayu_wipe_data(&__data); \ \ char __buf[32]; \ snprintf(__buf, 32, "%d", (workerid)); \ __data.common.client_id = __cli_id; \ __data.set_property.property_owner_id = (job_id); \ __data.set_property.key = "worker"; \ __data.set_property.value = __buf; \ ayu_event(AYU_SETPROPERTY, __data); \ ayu_wipe_data(&__data); \ } # define STARPU_AYU_RUNTASK(job_id) \ if (ayu_event) { \ ayu_client_id_t __cli_id = get_client_id(AYU_CLIENT_STARPU); \ ayu_event_data_t __data; \ __data.common.client_id = __cli_id; \ __data.set_property.property_owner_id = (job_id); \ __data.set_property.key = "state"; \ __data.set_property.value = "running"; \ ayu_event(AYU_SETPROPERTY, __data); \ ayu_wipe_data(&__data); \ } # define STARPU_AYU_POSTRUNTASK(job_id) \ if (ayu_event) \ { \ /* TODO ADD thread id core id etc */ \ ayu_client_id_t __cli_id = get_client_id(AYU_CLIENT_STARPU); \ ayu_event_data_t __data; \ __data.common.client_id = __cli_id; \ __data.set_property.property_owner_id = (job_id); \ __data.set_property.key = "state"; \ __data.set_property.value = "finished"; \ ayu_event(AYU_SETPROPERTY, __data); \ ayu_wipe_data(&__data); \ } # define STARPU_AYU_ADDTOTASKQUEUE(job_id, worker_id) \ if (ayu_event) \ { \ ayu_client_id_t __cli_id = get_client_id(AYU_CLIENT_STARPU); \ ayu_event_data_t __data; \ __data.common.client_id = __cli_id; \ __data.set_property.property_owner_id = (job_id); \ __data.set_property.key = "state"; \ __data.set_property.value = "queued"; \ ayu_event(AYU_SETPROPERTY, __data); \ ayu_wipe_data(&__data); \ \ char __buf[32]; \ snprintf(__buf, 32, "%d", (int)(worker_id)); \ __data.common.client_id = __cli_id; \ __data.set_property.property_owner_id = (job_id); \ __data.set_property.key = "worker"; \ __data.set_property.value = __buf; \ ayu_event(AYU_SETPROPERTY, __data); \ ayu_wipe_data(&__data); \ } # define STARPU_AYU_BARRIER() \ if (ayu_event) \ { \ /* How to generate a barrier event with Ayudame 2? */ \ } #else # define STARPU_AYU_EVENT (0) # define STARPU_AYU_PREINIT() # define STARPU_AYU_INIT() # define STARPU_AYU_FINISH() # define STARPU_AYU_ADDDEPENDENCY(previous, handle, next_job) # define STARPU_AYU_REMOVETASK(job_id) # define STARPU_AYU_ADDTASK(job_id, task) # define STARPU_AYU_PRERUNTASK(job_id, workerid) # define STARPU_AYU_RUNTASK(job_id) # define STARPU_AYU_POSTRUNTASK(job_id) # define STARPU_AYU_ADDTOTASKQUEUE(job_id, worker_id) # define STARPU_AYU_BARRIER() #endif /* Create a file that will contain StarPU's log */ void _starpu_open_debug_logfile(void); /* Close StarPU's log file */ void _starpu_close_debug_logfile(void); /* Write into StarPU's log file */ void _starpu_print_to_logfile(const char *format, ...) STARPU_ATTRIBUTE_FORMAT(printf, 1, 2); /* Tell gdb whether FXT is compiled in or not */ extern int _starpu_use_fxt; #if defined(STARPU_USE_AYUDAME1) /* Get an Ayudame id for CL */ int64_t _starpu_ayudame_get_func_id(struct starpu_codelet *cl); #endif void _starpu_watchdog_init(void); void _starpu_watchdog_shutdown(void); #endif // __DEBUG_H__ starpu-1.2.3+dfsg/src/core/dependencies/000077500000000000000000000000001320135501600201135ustar00rootroot00000000000000starpu-1.2.3+dfsg/src/core/dependencies/cg.c000066400000000000000000000170061320135501600206540ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012, 2014-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015, 2017 CNRS * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include void _starpu_cg_list_init(struct _starpu_cg_list *list) { _starpu_spin_init(&list->lock); list->ndeps = 0; list->ndeps_completed = 0; list->terminated = 0; list->nsuccs = 0; #ifdef STARPU_DYNAMIC_DEPS_SIZE /* this is a small initial default value ... may be changed */ list->succ_list_size = 0; list->succ = NULL; #endif } void _starpu_cg_list_deinit(struct _starpu_cg_list *list) { unsigned id; for (id = 0; id < list->nsuccs; id++) { struct _starpu_cg *cg = list->succ[id]; /* We remove the reference on the completion group, and free it * if there is no more reference. */ unsigned ntags = STARPU_ATOMIC_ADD(&cg->ntags, -1); if (ntags == 0) free(list->succ[id]); } #ifdef STARPU_DYNAMIC_DEPS_SIZE free(list->succ); #endif _starpu_spin_destroy(&list->lock); } /* Returns whether the completion was already terminated, and caller should * thus immediately proceed. */ int _starpu_add_successor_to_cg_list(struct _starpu_cg_list *successors, struct _starpu_cg *cg) { int ret; STARPU_ASSERT(cg); _starpu_spin_lock(&successors->lock); ret = successors->terminated; /* where should that cg should be put in the array ? */ unsigned index = successors->nsuccs++; #ifdef STARPU_DYNAMIC_DEPS_SIZE if (index >= successors->succ_list_size) { /* the successor list is too small */ if (successors->succ_list_size > 0) successors->succ_list_size *= 2; else successors->succ_list_size = 4; _STARPU_REALLOC(successors->succ, successors->succ_list_size*sizeof(struct _starpu_cg *)); } #else STARPU_ASSERT(index < STARPU_NMAXDEPS); #endif successors->succ[index] = cg; _starpu_spin_unlock(&successors->lock); return ret; } int _starpu_list_task_successors_in_cg_list(struct _starpu_cg_list *successors, unsigned ndeps, struct starpu_task *task_array[]) { unsigned i; unsigned n = 0; _starpu_spin_lock(&successors->lock); for (i = 0; i < successors->nsuccs; i++) { struct _starpu_cg *cg = successors->succ[i]; if (cg->cg_type != STARPU_CG_TASK) continue; if (n < ndeps) { task_array[n] = cg->succ.job->task; n++; } } _starpu_spin_unlock(&successors->lock); return n; } int _starpu_list_task_scheduled_successors_in_cg_list(struct _starpu_cg_list *successors, unsigned ndeps, struct starpu_task *task_array[]) { unsigned i; unsigned n = 0; _starpu_spin_lock(&successors->lock); for (i = 0; i < successors->nsuccs; i++) { struct _starpu_cg *cg = successors->succ[i]; if (cg->cg_type != STARPU_CG_TASK) continue; if (n < ndeps) { struct starpu_task *task = cg->succ.job->task; if (task->cl == NULL || task->cl->where == STARPU_NOWHERE || task->execute_on_a_specific_worker) /* will not be scheduled */ continue; task_array[n] = task; n++; } } _starpu_spin_unlock(&successors->lock); return n; } int _starpu_list_tag_successors_in_cg_list(struct _starpu_cg_list *successors, unsigned ndeps, starpu_tag_t tag_array[]) { unsigned i; unsigned n = 0; _starpu_spin_lock(&successors->lock); for (i = 0; i < successors->nsuccs; i++) { struct _starpu_cg *cg = successors->succ[i]; if (cg->cg_type != STARPU_CG_TAG) continue; if (n < ndeps) { tag_array[n] = cg->succ.tag->id; n++; } } _starpu_spin_unlock(&successors->lock); return n; } /* Note: in case of a tag, it must be already locked */ void _starpu_notify_cg(struct _starpu_cg *cg) { STARPU_ASSERT(cg); unsigned remaining = STARPU_ATOMIC_ADD(&cg->remaining, -1); ANNOTATE_HAPPENS_BEFORE(&cg->remaining); if (remaining == 0) { ANNOTATE_HAPPENS_AFTER(&cg->remaining); cg->remaining = cg->ntags; /* the group is now completed */ switch (cg->cg_type) { case STARPU_CG_APPS: { /* this is a cg for an application waiting on a set of * tags, wake the thread */ STARPU_PTHREAD_MUTEX_LOCK(&cg->succ.succ_apps.cg_mutex); cg->succ.succ_apps.completed = 1; STARPU_PTHREAD_COND_SIGNAL(&cg->succ.succ_apps.cg_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&cg->succ.succ_apps.cg_mutex); break; } case STARPU_CG_TAG: { struct _starpu_cg_list *tag_successors; struct _starpu_tag *tag; tag = cg->succ.tag; tag_successors = &tag->tag_successors; tag_successors->ndeps_completed++; /* Note: the tag is already locked by the * caller. */ if ((tag->state == STARPU_BLOCKED) && (tag_successors->ndeps == tag_successors->ndeps_completed)) { /* reset the counter so that we can reuse the completion group */ tag_successors->ndeps_completed = 0; _starpu_tag_set_ready(tag); } break; } case STARPU_CG_TASK: { struct _starpu_cg_list *job_successors; struct _starpu_job *j; j = cg->succ.job; STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex); job_successors = &j->job_successors; unsigned ndeps_completed = STARPU_ATOMIC_ADD(&job_successors->ndeps_completed, 1); STARPU_ASSERT(job_successors->ndeps >= ndeps_completed); /* Need to atomically test submitted and check * dependencies, since this is concurrent with * _starpu_submit_job */ if (j->submitted && job_successors->ndeps == ndeps_completed && j->task->status == STARPU_TASK_BLOCKED_ON_TASK) { /* That task has already passed tag checks, * do not do them again since the tag has been cleared! */ _starpu_enforce_deps_starting_from_task(j); } else STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); break; } default: STARPU_ABORT(); } } } /* Caller just has to promise that the list will not disappear. * _starpu_notify_cg_list protects the list itself. * No job lock should be held, since we might want to immediately call the callback of an empty task. */ void _starpu_notify_cg_list(struct _starpu_cg_list *successors) { unsigned succ; _starpu_spin_lock(&successors->lock); /* Note: some thread might be concurrently adding other items */ for (succ = 0; succ < successors->nsuccs; succ++) { struct _starpu_cg *cg = successors->succ[succ]; STARPU_ASSERT(cg); unsigned cg_type = cg->cg_type; if (cg_type == STARPU_CG_APPS) { /* Remove the temporary ref to the cg */ memmove(&successors->succ[succ], &successors->succ[succ+1], (successors->nsuccs-(succ+1)) * sizeof(successors->succ[succ])); succ--; successors->nsuccs--; } _starpu_spin_unlock(&successors->lock); struct _starpu_tag *cgtag = NULL; if (cg_type == STARPU_CG_TAG) { cgtag = cg->succ.tag; STARPU_ASSERT(cgtag); _starpu_spin_lock(&cgtag->lock); } _starpu_notify_cg(cg); if (cg_type == STARPU_CG_TAG) _starpu_spin_unlock(&cgtag->lock); _starpu_spin_lock(&successors->lock); } successors->terminated = 1; _starpu_spin_unlock(&successors->lock); } starpu-1.2.3+dfsg/src/core/dependencies/cg.h000066400000000000000000000066341320135501600206660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2013, 2015-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __CG_H__ #define __CG_H__ #include #include /* we do not necessarily want to allocate room for 256 dependencies, but we want to handle the few situation where there are a lot of dependencies as well */ #define STARPU_DYNAMIC_DEPS_SIZE 1 /* randomly choosen ! */ #ifndef STARPU_DYNAMIC_DEPS_SIZE #define STARPU_NMAXDEPS 256 #endif struct _starpu_job; /* Completion Group list, records both the number of expected notifications * before the completion can start, and the list of successors when the * completion is finished. */ struct _starpu_cg_list { /* Protects atomicity of the list and the terminated flag */ struct _starpu_spinlock lock; /* Number of notifications to be waited for */ unsigned ndeps; /* how many deps ? */ unsigned ndeps_completed; /* how many deps are done ? */ /* Whether the completion is finished. * For restartable/restarted tasks, only the first iteration is taken into account here. */ unsigned terminated; /* List of successors */ unsigned nsuccs; /* how many successors ? */ #ifdef STARPU_DYNAMIC_DEPS_SIZE unsigned succ_list_size; /* How many allocated items in succ */ struct _starpu_cg **succ; #else struct _starpu_cg *succ[STARPU_NMAXDEPS]; #endif }; enum _starpu_cg_type { STARPU_CG_APPS=(1<<0), STARPU_CG_TAG=(1<<1), STARPU_CG_TASK=(1<<2) }; /* Completion Group */ struct _starpu_cg { unsigned ntags; /* number of tags depended on */ unsigned remaining; /* number of remaining tags */ enum _starpu_cg_type cg_type; union { /* STARPU_CG_TAG */ struct _starpu_tag *tag; /* STARPU_CG_TASK */ struct _starpu_job *job; /* STARPU_CG_APPS */ /* in case this completion group is related to an application, * we have to explicitely wake the waiting thread instead of * reschedule the corresponding task */ struct { unsigned completed; starpu_pthread_mutex_t cg_mutex; starpu_pthread_cond_t cg_cond; } succ_apps; } succ; }; void _starpu_cg_list_init(struct _starpu_cg_list *list); void _starpu_cg_list_deinit(struct _starpu_cg_list *list); int _starpu_add_successor_to_cg_list(struct _starpu_cg_list *successors, struct _starpu_cg *cg); int _starpu_list_task_successors_in_cg_list(struct _starpu_cg_list *successors, unsigned ndeps, struct starpu_task *task_array[]); int _starpu_list_task_scheduled_successors_in_cg_list(struct _starpu_cg_list *successors, unsigned ndeps, struct starpu_task *task_array[]); int _starpu_list_tag_successors_in_cg_list(struct _starpu_cg_list *successors, unsigned ndeps, starpu_tag_t tag_array[]); void _starpu_notify_cg(struct _starpu_cg *cg); void _starpu_notify_cg_list(struct _starpu_cg_list *successors); void _starpu_notify_task_dependencies(struct _starpu_job *j); #endif // __CG_H__ starpu-1.2.3+dfsg/src/core/dependencies/data_arbiter_concurrency.c000066400000000000000000000535071320135501600253240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2016 Université de Bordeaux * Copyright (C) 2015 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include /* TODO factorize with data_concurrency.c and btw support redux */ /* TODO: fine-grain R/W access */ //#define LOCK_OR_DELEGATE /* * This implements a solution for the dining philosophers problem (see * data_concurrency.c for the rationale) based on a centralized arbiter. This * allows to get a more parallel solution than the Dijkstra solution, by * avoiding strictly serialized executions, and instead opportunistically find * which tasks can take data. * * These are the algorithms implemented below: * * * at termination of task T: * * - for each handle h of T: * - mutex_lock(&arbiter) * - release reference on h * - for each task Tc waiting for h: * - for each data Tc_h it is waiting for: * - if Tc_h is busy, goto fail * // Ok, now really take them * - For each data Tc_h it is waiting: * - lock(Tc_h) * - take reference on h (it should be still available since we hold the arbiter) * - unlock(Tc_h) * // Ok, we managed to find somebody, we're finished! * _starpu_push_task(Tc); * break; * fail: * - unrecord T as waiting on h * - record T as waiting on Tc_h * // No luck, let's try another task * continue; * // Release the arbiter mutex a bit from time to time * - mutex_unlock(&arbiter) * * * at submission of task T: * * - mutex_lock(&arbiter) * - for each handle h of T: * - lock(h) * - try to take a reference on h, goto fail on failure * - unlock(h) * // Success! * - mutex_unlock(&arbiter); * - return 0; * * fail: * // couldn't take everything, record task T and abort * - record T as waiting on h * // drop spurious references * - for each handle h of T already taken: * - lock(h) * - release reference on h * - unlock(h) * - mutex_unlock(&arbiter) * - return 1; */ struct starpu_arbiter { #ifdef LOCK_OR_DELEGATE /* The list of task to perform */ struct LockOrDelegateListNode* dlTaskListHead; /* To protect the list of tasks */ struct _starpu_spinlock dlListLock; /* Whether somebody is working on the list */ int working; #else /* LOCK_OR_DELEGATE */ starpu_pthread_mutex_t mutex; #endif /* LOCK_OR_DELEGATE */ }; #ifdef LOCK_OR_DELEGATE /* In case of congestion, we don't want to needlessly wait for the arbiter lock * while we can just delegate the work to the worker already managing some * dependencies. * * So we push work on the dlTastListHead queue and only one worker will process * the list. */ /* A LockOrDelegate task list */ struct LockOrDelegateListNode { void (*func)(void*); void* data; struct LockOrDelegateListNode* next; }; /* Post a task to perfom if possible, otherwise put it in the list * If we can perfom this task, we may also perfom all the tasks in the list * This function return 1 if the task (and maybe some others) has been done * by the calling thread and 0 otherwise (if the task has just been put in the list) */ static int _starpu_LockOrDelegatePostOrPerform(starpu_arbiter_t arbiter, void (*func)(void*), void* data) { struct LockOrDelegateListNode *newNode; struct LockOrDelegateListNode *iter, *next; int did = 0; _STARPU_MALLOC(newNode, sizeof(*newNode)); newNode->data = data; newNode->func = func; _starpu_spin_lock(&arbiter->dlListLock); if (arbiter->working) { /* Somebody working on it, insert the node */ newNode->next = arbiter->dlTaskListHead; arbiter->dlTaskListHead = newNode; } else { /* Nobody working on the list, we'll work */ arbiter->working = 1; /* work on what was pushed so far first */ iter = arbiter->dlTaskListHead; arbiter->dlTaskListHead = NULL; _starpu_spin_unlock(&arbiter->dlListLock); while (iter != NULL) { (*iter->func)(iter->data); next = iter->next; free(iter); iter = next; } /* And then do our job */ (*func)(data); free(newNode); did = 1; _starpu_spin_lock(&arbiter->dlListLock); /* And finish working on anything that could have been pushed * in the meanwhile */ while (arbiter->dlTaskListHead != 0) { iter = arbiter->dlTaskListHead; arbiter->dlTaskListHead = arbiter->dlTaskListHead->next; _starpu_spin_unlock(&arbiter->dlListLock); (*iter->func)(iter->data); free(iter); _starpu_spin_lock(&arbiter->dlListLock); } arbiter->working = 0; } _starpu_spin_unlock(&arbiter->dlListLock); return did; } #endif /* Try to submit a data request, in case the request can be processed * immediatly, return 0, if there is still a dependency that is not compatible * with the current mode, the request is put in the per-handle list of * "requesters", and this function returns 1. */ #ifdef LOCK_OR_DELEGATE struct starpu_submit_arbitered_args { unsigned request_from_codelet; starpu_data_handle_t handle; enum starpu_data_access_mode mode; void (*callback)(void *); void *argcb; struct _starpu_job *j; unsigned buffer_index; }; static unsigned ___starpu_attempt_to_submit_arbitered_data_request(unsigned request_from_codelet, starpu_data_handle_t handle, enum starpu_data_access_mode mode, void (*callback)(void *), void *argcb, struct _starpu_job *j, unsigned buffer_index); static void __starpu_attempt_to_submit_arbitered_data_request(void *inData) { struct starpu_submit_arbitered_args* args = inData; unsigned request_from_codelet = args->request_from_codelet; starpu_data_handle_t handle = args->handle; enum starpu_data_access_mode mode = args->mode; void (*callback)(void*) = args->callback; void *argcb = args->argcb; struct _starpu_job *j = args->j; unsigned buffer_index = args->buffer_index; free(args); if (!___starpu_attempt_to_submit_arbitered_data_request(request_from_codelet, handle, mode, callback, argcb, j, buffer_index)) /* Success, but we have no way to report it to original caller, * so call callback ourself */ callback(argcb); } unsigned _starpu_attempt_to_submit_arbitered_data_request(unsigned request_from_codelet, starpu_data_handle_t handle, enum starpu_data_access_mode mode, void (*callback)(void *), void *argcb, struct _starpu_job *j, unsigned buffer_index) { struct starpu_submit_arbitered_args *args; _STARPU_MALLOC(args, sizeof(*args)); args->request_from_codelet = request_from_codelet; args->handle = handle; args->mode = mode; args->callback = callback; args->argcb = argcb; args->j = j; args->buffer_index = buffer_index; /* The function will delete args */ _starpu_LockOrDelegatePostOrPerform(handle->arbiter, &__starpu_attempt_to_submit_arbitered_data_request, args); return 1; } unsigned ___starpu_attempt_to_submit_arbitered_data_request(unsigned request_from_codelet, starpu_data_handle_t handle, enum starpu_data_access_mode mode, void (*callback)(void *), void *argcb, struct _starpu_job *j, unsigned buffer_index) { STARPU_ASSERT(handle->arbiter); #else // LOCK_OR_DELEGATE unsigned _starpu_attempt_to_submit_arbitered_data_request(unsigned request_from_codelet, starpu_data_handle_t handle, enum starpu_data_access_mode mode, void (*callback)(void *), void *argcb, struct _starpu_job *j, unsigned buffer_index) { starpu_arbiter_t arbiter = handle->arbiter; STARPU_PTHREAD_MUTEX_LOCK(&arbiter->mutex); #endif // LOCK_OR_DELEGATE if (mode == STARPU_RW) mode = STARPU_W; STARPU_ASSERT_MSG(!(mode & STARPU_REDUX), "REDUX with arbiter is not implemented\n"); /* Take the lock protecting the header. We try to do some progression * in case this is called from a worker, otherwise we just wait for the * lock to be available. */ if (request_from_codelet) { int cpt = 0; while (cpt < STARPU_SPIN_MAXTRY && _starpu_spin_trylock(&handle->header_lock)) { cpt++; _starpu_datawizard_progress(_starpu_memory_node_get_local_key(), 0); } if (cpt == STARPU_SPIN_MAXTRY) _starpu_spin_lock(&handle->header_lock); } else { _starpu_spin_lock(&handle->header_lock); } /* If there is currently nobody accessing the piece of data, or it's * not another writter and if this is the same type of access as the * current one, we can proceed. */ unsigned put_in_list; if (handle->refcnt) { /* there cannot be multiple writers or a new writer * while the data is in read mode */ handle->busy_count++; /* enqueue the request */ struct _starpu_data_requester *r = _starpu_data_requester_new(); r->mode = mode; r->is_requested_by_codelet = request_from_codelet; r->j = j; r->buffer_index = buffer_index; r->ready_data_callback = callback; r->argcb = argcb; _starpu_data_requester_list_push_back(&handle->arbitered_req_list, r); /* failed */ put_in_list = 1; } else { handle->refcnt++; handle->busy_count++; /* Do not write to handle->current_mode if it is already * R. This avoids a spurious warning from helgrind when * the following happens: * acquire(R) in thread A * acquire(R) in thread B * release_data_on_node() in thread A * helgrind would shout that the latter reads current_mode * unsafely. * * This actually basically explains helgrind that it is a * shared R acquisition. */ if (mode != STARPU_R || handle->current_mode != mode) handle->current_mode = mode; /* success */ put_in_list = 0; } _starpu_spin_unlock(&handle->header_lock); #ifndef LOCK_OR_DELEGATE STARPU_PTHREAD_MUTEX_UNLOCK(&arbiter->mutex); #endif // LOCK_OR_DELEGATE return put_in_list; } #ifdef LOCK_OR_DELEGATE /* These are the arguments passed to _submit_job_enforce_arbitered_deps */ struct starpu_enforce_arbitered_args { struct _starpu_job *j; unsigned buf; unsigned nbuffers; }; static void ___starpu_submit_job_enforce_arbitered_deps(struct _starpu_job *j, unsigned buf, unsigned nbuffers); static void __starpu_submit_job_enforce_arbitered_deps(void* inData) { struct starpu_enforce_arbitered_args* args = inData; struct _starpu_job *j = args->j; unsigned buf = args->buf; unsigned nbuffers = args->nbuffers; /* we are in charge of freeing the args */ free(args); ___starpu_submit_job_enforce_arbitered_deps(j, buf, nbuffers); } void _starpu_submit_job_enforce_arbitered_deps(struct _starpu_job *j, unsigned buf, unsigned nbuffers) { struct starpu_enforce_arbitered_args *args; _STARPU_MALLOC(args, sizeof(*args)); starpu_data_handle_t handle = _STARPU_JOB_GET_ORDERED_BUFFER_HANDLE(j, buf); args->j = j; args->buf = buf; args->nbuffers = nbuffers; /* The function will delete args */ _starpu_LockOrDelegatePostOrPerform(handle->arbiter, &__starpu_submit_job_enforce_arbitered_deps, args); } static void ___starpu_submit_job_enforce_arbitered_deps(struct _starpu_job *j, unsigned buf, unsigned nbuffers) { starpu_arbiter_t arbiter = _STARPU_JOB_GET_ORDERED_BUFFER_HANDLE(j, buf)->arbiter; #else // LOCK_OR_DELEGATE void _starpu_submit_job_enforce_arbitered_deps(struct _starpu_job *j, unsigned buf, unsigned nbuffers) { starpu_arbiter_t arbiter = _STARPU_JOB_GET_ORDERED_BUFFER_HANDLE(j, buf)->arbiter; STARPU_PTHREAD_MUTEX_LOCK(&arbiter->mutex); #endif STARPU_ASSERT(arbiter); const unsigned start_buf_arbiter = buf; unsigned idx_buf_arbiter; unsigned all_arbiter_available = 1; starpu_data_handle_t handle; enum starpu_data_access_mode mode; for (idx_buf_arbiter = start_buf_arbiter; idx_buf_arbiter < nbuffers; idx_buf_arbiter++) { handle = _STARPU_JOB_GET_ORDERED_BUFFER_HANDLE(j, idx_buf_arbiter); mode = _STARPU_JOB_GET_ORDERED_BUFFER_MODE(j, idx_buf_arbiter); if (idx_buf_arbiter && (_STARPU_JOB_GET_ORDERED_BUFFER_HANDLE(j, idx_buf_arbiter-1)==handle)) /* We have already requested this data, skip it. This * depends on ordering putting writes before reads, see * _starpu_compar_handles. */ continue; if (handle->arbiter != arbiter) { /* another arbiter */ break; } /* Try to take handle */ _starpu_spin_lock(&handle->header_lock); if (handle->refcnt == 0) { /* Got it */ handle->refcnt++; handle->busy_count++; handle->current_mode = mode; _starpu_spin_unlock(&handle->header_lock); } else { /* a handle does not have a refcnt == 0, stop */ _starpu_spin_unlock(&handle->header_lock); all_arbiter_available = 0; break; } } if (all_arbiter_available == 0) { /* Oups, record ourself as waiting for this data */ struct _starpu_data_requester *r = _starpu_data_requester_new(); r->mode = mode; r->is_requested_by_codelet = 1; r->j = j; r->buffer_index = start_buf_arbiter; r->ready_data_callback = NULL; r->argcb = NULL; /* store node in list */ _starpu_data_requester_list_push_front(&handle->arbitered_req_list, r); _starpu_spin_lock(&handle->header_lock); handle->busy_count++; _starpu_spin_unlock(&handle->header_lock); /* and cancel all taken */ unsigned idx_buf_cancel; for (idx_buf_cancel = start_buf_arbiter; idx_buf_cancel < idx_buf_arbiter ; idx_buf_cancel++) { starpu_data_handle_t cancel_handle = _STARPU_JOB_GET_ORDERED_BUFFER_HANDLE(j, idx_buf_cancel); if (idx_buf_cancel && (_STARPU_JOB_GET_ORDERED_BUFFER_HANDLE(j, idx_buf_cancel-1)==cancel_handle)) continue; if (cancel_handle->arbiter != arbiter) /* Will have to process another arbiter, will do that later */ break; _starpu_spin_lock(&cancel_handle->header_lock); /* reset the counter because finally we do not take the data */ STARPU_ASSERT(cancel_handle->refcnt == 1); cancel_handle->refcnt--; STARPU_ASSERT(cancel_handle->busy_count > 0); cancel_handle->busy_count--; if (!_starpu_data_check_not_busy(cancel_handle)) _starpu_spin_unlock(&cancel_handle->header_lock); } #ifndef LOCK_OR_DELEGATE STARPU_PTHREAD_MUTEX_UNLOCK(&arbiter->mutex); #endif return; } #ifndef LOCK_OR_DELEGATE STARPU_PTHREAD_MUTEX_UNLOCK(&arbiter->mutex); #endif // all_arbiter_available is true if (idx_buf_arbiter < nbuffers) /* Other arbitered data, process them */ _starpu_submit_job_enforce_arbitered_deps(j, idx_buf_arbiter, nbuffers); else /* Finished with all data, can eventually push! */ _starpu_push_task(j); } #ifdef LOCK_OR_DELEGATE void ___starpu_notify_arbitered_dependencies(starpu_data_handle_t handle); void __starpu_notify_arbitered_dependencies(void* inData) { starpu_data_handle_t handle = inData; ___starpu_notify_arbitered_dependencies(handle); } void _starpu_notify_arbitered_dependencies(starpu_data_handle_t handle) { _starpu_LockOrDelegatePostOrPerform(handle->arbiter, &__starpu_notify_arbitered_dependencies, handle); } void ___starpu_notify_arbitered_dependencies(starpu_data_handle_t handle) #else // LOCK_OR_DELEGATE void _starpu_notify_arbitered_dependencies(starpu_data_handle_t handle) #endif { starpu_arbiter_t arbiter = handle->arbiter; #ifndef LOCK_OR_DELEGATE STARPU_PTHREAD_MUTEX_LOCK(&arbiter->mutex); #endif /* Since the request has been posted the handle may have been proceed and released */ if (_starpu_data_requester_list_empty(&handle->arbitered_req_list)) { #ifndef LOCK_OR_DELEGATE STARPU_PTHREAD_MUTEX_UNLOCK(&arbiter->mutex); #endif return; } /* Note: we may be putting back our own requests, so avoid looping by * extracting the list */ struct _starpu_data_requester_list l = handle->arbitered_req_list; _starpu_data_requester_list_init(&handle->arbitered_req_list); while (!_starpu_data_requester_list_empty(&l)) { struct _starpu_data_requester *r = _starpu_data_requester_list_pop_front(&l); if (!r->is_requested_by_codelet) { /* data_acquire_cb, process it */ enum starpu_data_access_mode r_mode = r->mode; if (r_mode == STARPU_RW) r_mode = STARPU_W; _starpu_spin_lock(&handle->header_lock); handle->refcnt++; handle->busy_count++; handle->current_mode = r_mode; _starpu_spin_unlock(&handle->header_lock); /* Put back remaining requests */ _starpu_data_requester_list_push_list_back(&handle->arbitered_req_list, &l); #ifndef LOCK_OR_DELEGATE STARPU_PTHREAD_MUTEX_UNLOCK(&arbiter->mutex); #endif r->ready_data_callback(r->argcb); _starpu_data_requester_delete(r); _starpu_spin_lock(&handle->header_lock); STARPU_ASSERT(handle->busy_count > 0); handle->busy_count--; if (!_starpu_data_check_not_busy(handle)) _starpu_spin_unlock(&handle->header_lock); return; } /* A task waiting for a set of data, try to acquire them */ struct _starpu_job* j = r->j; unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(j->task); unsigned idx_buf_arbiter; unsigned all_arbiter_available = 1; starpu_data_handle_t handle_arbiter; enum starpu_data_access_mode mode; unsigned start_buf_arbiter = r->buffer_index; for (idx_buf_arbiter = start_buf_arbiter; idx_buf_arbiter < nbuffers; idx_buf_arbiter++) { handle_arbiter = _STARPU_JOB_GET_ORDERED_BUFFER_HANDLE(j, idx_buf_arbiter); if (idx_buf_arbiter && (_STARPU_JOB_GET_ORDERED_BUFFER_HANDLE(j, idx_buf_arbiter-1)==handle_arbiter)) /* We have already requested this data, skip it. This * depends on ordering putting writes before reads, see * _starpu_compar_handles. */ continue; if (handle_arbiter->arbiter != arbiter) /* Will have to process another arbiter, will do that later */ break; mode = _STARPU_JOB_GET_ORDERED_BUFFER_MODE(j, idx_buf_arbiter); /* we post all arbiter */ _starpu_spin_lock(&handle_arbiter->header_lock); if (handle_arbiter->refcnt != 0) { /* handle is not available, record ourself */ _starpu_spin_unlock(&handle_arbiter->header_lock); all_arbiter_available = 0; break; } /* mark the handle as taken */ handle_arbiter->refcnt++; handle_arbiter->busy_count++; handle_arbiter->current_mode = mode; _starpu_spin_unlock(&handle_arbiter->header_lock); } if (all_arbiter_available) { /* Success! Drop request */ _starpu_data_requester_delete(r); _starpu_spin_lock(&handle->header_lock); STARPU_ASSERT(handle->busy_count > 0); handle->busy_count--; if (!_starpu_data_check_not_busy(handle)) _starpu_spin_unlock(&handle->header_lock); /* Put back remaining requests */ _starpu_data_requester_list_push_list_back(&handle->arbitered_req_list, &l); #ifndef LOCK_OR_DELEGATE STARPU_PTHREAD_MUTEX_UNLOCK(&arbiter->mutex); #endif if (idx_buf_arbiter < nbuffers) /* Other arbitered data, process them */ _starpu_submit_job_enforce_arbitered_deps(j, idx_buf_arbiter, nbuffers); else /* Finished with all data, can eventually push! */ _starpu_push_task(j); return; } else { /* all handles are not available - record that task on the first unavailable handle */ /* store node in list */ r->mode = mode; _starpu_data_requester_list_push_front(&handle_arbiter->arbitered_req_list, r); /* Move check_busy reference too */ _starpu_spin_lock(&handle->header_lock); STARPU_ASSERT(handle->busy_count > 0); handle->busy_count--; if (!_starpu_data_check_not_busy(handle)) _starpu_spin_unlock(&handle->header_lock); _starpu_spin_lock(&handle_arbiter->header_lock); handle_arbiter->busy_count++; _starpu_spin_unlock(&handle_arbiter->header_lock); /* and revert the mark */ unsigned idx_buf_cancel; for (idx_buf_cancel = start_buf_arbiter; idx_buf_cancel < idx_buf_arbiter ; idx_buf_cancel++) { starpu_data_handle_t cancel_handle = _STARPU_JOB_GET_ORDERED_BUFFER_HANDLE(j, idx_buf_cancel); if (idx_buf_cancel && (_STARPU_JOB_GET_ORDERED_BUFFER_HANDLE(j, idx_buf_cancel-1)==cancel_handle)) continue; if (cancel_handle->arbiter != arbiter) break; _starpu_spin_lock(&cancel_handle->header_lock); STARPU_ASSERT(cancel_handle->refcnt == 1); cancel_handle->refcnt--; STARPU_ASSERT(cancel_handle->busy_count > 0); cancel_handle->busy_count--; if (!_starpu_data_check_not_busy(cancel_handle)) _starpu_spin_unlock(&cancel_handle->header_lock); } } } /* no task has been pushed */ #ifndef LOCK_OR_DELEGATE STARPU_PTHREAD_MUTEX_UNLOCK(&arbiter->mutex); #endif return; } starpu_arbiter_t starpu_arbiter_create(void) { starpu_arbiter_t res; _STARPU_MALLOC(res, sizeof(*res)); #ifdef LOCK_OR_DELEGATE res->dlTaskListHead = NULL; _starpu_spin_init(&res->dlListLock); res->working = 0; #else /* LOCK_OR_DELEGATE */ STARPU_PTHREAD_MUTEX_INIT(&res->mutex, NULL); #endif /* LOCK_OR_DELEGATE */ return res; } void starpu_data_assign_arbiter(starpu_data_handle_t handle, starpu_arbiter_t arbiter) { if (handle->arbiter && handle->arbiter == _starpu_global_arbiter) /* Just for testing purpose */ return; STARPU_ASSERT_MSG(!handle->arbiter, "handle can only be assigned one arbiter"); STARPU_ASSERT_MSG(!handle->refcnt, "arbiter can be assigned to handle only right after initialization"); STARPU_ASSERT_MSG(!handle->busy_count, "arbiter can be assigned to handle only right after initialization"); handle->arbiter = arbiter; } void starpu_arbiter_destroy(starpu_arbiter_t arbiter) { #ifdef LOCK_OR_DELEGATE _starpu_spin_lock(&arbiter->dlListLock); STARPU_ASSERT(!arbiter->dlTaskListHead); STARPU_ASSERT(!arbiter->working); _starpu_spin_unlock(&arbiter->dlListLock); _starpu_spin_destroy(&arbiter->dlListLock); #else /* LOCK_OR_DELEGATE */ STARPU_PTHREAD_MUTEX_LOCK(&arbiter->mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&arbiter->mutex); STARPU_PTHREAD_MUTEX_DESTROY(&arbiter->mutex); #endif /* LOCK_OR_DELEGATE */ free(arbiter); } starpu-1.2.3+dfsg/src/core/dependencies/data_concurrency.c000066400000000000000000000365071320135501600236150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2017 CNRS * Copyright (C) 2015 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include /* * We have a kind of dining philosophers problem: various tasks are accessing * various data concurrently in different modes: STARPU_R, STARPU_RW, STARPU_W, * STARPU_SCRATCH and STARPU_REDUX. STARPU_RW is managed as a STARPU_W access. * We have the following constraints: * * - A single STARPU_W access is allowed at a time. * - Concurrent STARPU_R accesses are allowed. * - Concurrent STARPU_SCRATCH accesses are allowed. * - Concurrent STARPU_REDUX accesses are allowed. * * What we do here is implementing the Dijkstra solutions: handles are sorted * by pointer value order, and tasks call * _starpu_attempt_to_submit_data_request for each requested data in that order * (see _starpu_sort_task_handles call in _starpu_submit_job_enforce_data_deps). * * _starpu_attempt_to_submit_data_request will either: * - obtain access to the data, and thus the task can proceed with acquiring * other data (see _submit_job_enforce_data_deps) * - queue a request on the data handle * * When a task finishes, it calls _starpu_notify_data_dependencies for each * data, to free its acquisitions. This will look whether the first queued * request can be fulfilled, and in such case make the task try to acquire its * next data. * * The same mechanism is used for application data aquisition * (starpu_data_acquire). * * For data with an arbiter, we have a second step, performed after this first * step, implemented in data_arbiter_concurrency.c */ /* * Check to see whether the first queued request can proceed, and return it in * such case. */ /* the handle header lock must be taken by the caller */ static struct _starpu_data_requester *may_unlock_data_req_list_head(starpu_data_handle_t handle) { struct _starpu_data_requester_list *req_list; if (handle->reduction_refcnt > 0) { req_list = &handle->reduction_req_list; } else { if (_starpu_data_requester_list_empty(&handle->reduction_req_list)) req_list = &handle->req_list; else req_list = &handle->reduction_req_list; } /* if there is no one to unlock ... */ if (_starpu_data_requester_list_empty(req_list)) return NULL; /* if there is no reference to the data anymore, we can use it */ if (handle->refcnt == 0) return _starpu_data_requester_list_pop_front(req_list); /* Already writing to it, do not let another write access through */ if (handle->current_mode == STARPU_W) return NULL; /* data->current_mode == STARPU_R, so we can process more readers */ struct _starpu_data_requester *r = _starpu_data_requester_list_front(req_list); enum starpu_data_access_mode r_mode = r->mode; if (r_mode == STARPU_RW) r_mode = STARPU_W; /* If this is a STARPU_R, STARPU_SCRATCH or STARPU_REDUX type of * access, we only proceed if the current mode is the same as the * requested mode. */ if (r_mode == handle->current_mode) return _starpu_data_requester_list_pop_front(req_list); else return NULL; } /* Try to submit a data request, in case the request can be processed * immediatly, return 0, if there is still a dependency that is not compatible * with the current mode, the request is put in the per-handle list of * "requesters", and this function returns 1. */ /* No lock is held, this acquires and releases the handle header lock */ static unsigned _starpu_attempt_to_submit_data_request(unsigned request_from_codelet, starpu_data_handle_t handle, enum starpu_data_access_mode mode, void (*callback)(void *), void *argcb, struct _starpu_job *j, unsigned buffer_index) { if (handle->arbiter) return _starpu_attempt_to_submit_arbitered_data_request(request_from_codelet, handle, mode, callback, argcb, j, buffer_index); if (mode == STARPU_RW) mode = STARPU_W; /* Take the lock protecting the header. We try to do some progression * in case this is called from a worker, otherwise we just wait for the * lock to be available. */ if (request_from_codelet) { int cpt = 0; while (cpt < STARPU_SPIN_MAXTRY && _starpu_spin_trylock(&handle->header_lock)) { cpt++; _starpu_datawizard_progress(_starpu_memory_node_get_local_key(), 0); } if (cpt == STARPU_SPIN_MAXTRY) _starpu_spin_lock(&handle->header_lock); } else { _starpu_spin_lock(&handle->header_lock); } /* If we have a request that is not used for the reduction, and that a * reduction is pending, we put it at the end of normal list, and we * use the reduction_req_list instead */ unsigned pending_reduction = (handle->reduction_refcnt > 0); unsigned frozen = 0; /* If we are currently performing a reduction, we freeze any request * that is not explicitely a reduction task. */ unsigned is_a_reduction_task = (request_from_codelet && j->reduction_task); if (pending_reduction && !is_a_reduction_task) frozen = 1; /* If there is currently nobody accessing the piece of data, or it's * not another writter and if this is the same type of access as the * current one, we can proceed. */ unsigned put_in_list = 1; enum starpu_data_access_mode previous_mode = handle->current_mode; if (!frozen && ((handle->refcnt == 0) || (!(mode == STARPU_W) && (handle->current_mode == mode)))) { /* Detect whether this is the end of a reduction phase */ /* We don't want to start multiple reductions of the * same handle at the same time ! */ if ((handle->reduction_refcnt == 0) && (previous_mode == STARPU_REDUX) && (mode != STARPU_REDUX)) { _starpu_data_end_reduction_mode(handle); /* Since we need to perform a mode change, we freeze * the request if needed. */ put_in_list = (handle->reduction_refcnt > 0); } else { put_in_list = 0; } } if (put_in_list) { /* there cannot be multiple writers or a new writer * while the data is in read mode */ handle->busy_count++; /* enqueue the request */ struct _starpu_data_requester *r = _starpu_data_requester_new(); r->mode = mode; r->is_requested_by_codelet = request_from_codelet; r->j = j; r->buffer_index = buffer_index; r->ready_data_callback = callback; r->argcb = argcb; /* We put the requester in a specific list if this is a reduction task */ struct _starpu_data_requester_list *req_list = is_a_reduction_task?&handle->reduction_req_list:&handle->req_list; _starpu_data_requester_list_push_back(req_list, r); /* failed */ put_in_list = 1; } else { handle->refcnt++; handle->busy_count++; /* Do not write to handle->current_mode if it is already * R. This avoids a spurious warning from helgrind when * the following happens: * acquire(R) in thread A * acquire(R) in thread B * release_data_on_node() in thread A * helgrind would shout that the latter reads current_mode * unsafely. * * This actually basically explains helgrind that it is a * shared R acquisition. */ if (mode != STARPU_R || handle->current_mode != mode) handle->current_mode = mode; if ((mode == STARPU_REDUX) && (previous_mode != STARPU_REDUX)) _starpu_data_start_reduction_mode(handle); /* success */ put_in_list = 0; } _starpu_spin_unlock(&handle->header_lock); return put_in_list; } /* No lock is held */ unsigned _starpu_attempt_to_submit_data_request_from_apps(starpu_data_handle_t handle, enum starpu_data_access_mode mode, void (*callback)(void *), void *argcb) { return _starpu_attempt_to_submit_data_request(0, handle, mode, callback, argcb, NULL, 0); } /* No lock is held */ static unsigned attempt_to_submit_data_request_from_job(struct _starpu_job *j, unsigned buffer_index) { /* Note that we do not access j->task->handles, but j->ordered_buffers * which is a sorted copy of it. */ starpu_data_handle_t handle = _STARPU_JOB_GET_ORDERED_BUFFER_HANDLE(j, buffer_index); enum starpu_data_access_mode mode = _STARPU_JOB_GET_ORDERED_BUFFER_MODE(j, buffer_index) & ~STARPU_COMMUTE; return _starpu_attempt_to_submit_data_request(1, handle, mode, NULL, NULL, j, buffer_index); } /* Acquire all data of the given job, one by one in handle pointer value order */ /* No lock is held */ static unsigned _submit_job_enforce_data_deps(struct _starpu_job *j, unsigned start_buffer_index) { unsigned buf; unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(j->task); for (buf = start_buffer_index; buf < nbuffers; buf++) { starpu_data_handle_t handle = _STARPU_JOB_GET_ORDERED_BUFFER_HANDLE(j, buf); if (buf) { starpu_data_handle_t handle_m1 = _STARPU_JOB_GET_ORDERED_BUFFER_HANDLE(j, buf-1); if (handle_m1 == handle) /* We have already requested this data, skip it. This * depends on ordering putting writes before reads, see * _starpu_compar_handles. */ continue; } j->task->status = STARPU_TASK_BLOCKED_ON_DATA; if(handle->arbiter) { /* We arrived on an arbitered data, we stop and proceed * with the arbiter second step. */ _starpu_submit_job_enforce_arbitered_deps(j, buf, nbuffers); return 1; } if (attempt_to_submit_data_request_from_job(j, buf)) { return 1; } } return 0; } void _starpu_job_set_ordered_buffers(struct _starpu_job *j) { /* Compute an ordered list of the different pieces of data so that we * grab then according to a total order, thus avoiding a deadlock * condition */ unsigned i; unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(j->task); struct starpu_task *task = j->task; for (i=0 ; icl->specific_nodes) node = STARPU_CODELET_GET_NODE(task->cl, i); _STARPU_JOB_SET_ORDERED_BUFFER_NODE(j, node, i); } _starpu_sort_task_handles(_STARPU_JOB_GET_ORDERED_BUFFERS(j), nbuffers); } /* Sort the data used by the given job by handle pointer value order, and * acquire them in that order */ /* No lock is held */ unsigned _starpu_submit_job_enforce_data_deps(struct _starpu_job *j) { struct starpu_codelet *cl = j->task->cl; if ((cl == NULL) || (STARPU_TASK_GET_NBUFFERS(j->task) == 0)) return 0; _starpu_job_set_ordered_buffers(j); return _submit_job_enforce_data_deps(j, 0); } /* This request got fulfilled, continue with the other requests of the * corresponding job */ /* No lock is held */ static unsigned unlock_one_requester(struct _starpu_data_requester *r) { struct _starpu_job *j = r->j; unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(j->task); unsigned buffer_index = r->buffer_index; if (buffer_index + 1 < nbuffers) /* not all buffers are protected yet */ return _submit_job_enforce_data_deps(j, buffer_index + 1); else return 0; } /* This is called when a task is finished with a piece of data * (or on starpu_data_release) * * The header lock must already be taken by the caller. * This may free the handle if it was lazily unregistered (1 is returned in * that case). The handle pointer thus becomes invalid for the caller. */ int _starpu_notify_data_dependencies(starpu_data_handle_t handle) { _starpu_spin_checklocked(&handle->header_lock); /* A data access has finished so we remove a reference. */ STARPU_ASSERT(handle->refcnt > 0); handle->refcnt--; STARPU_ASSERT(handle->busy_count > 0); handle->busy_count--; if (_starpu_data_check_not_busy(handle)) /* Handle was destroyed, nothing left to do. */ return 1; if (handle->arbiter) { unsigned refcnt = handle->refcnt; STARPU_ASSERT(_starpu_data_requester_list_empty(&handle->req_list)); STARPU_ASSERT(_starpu_data_requester_list_empty(&handle->reduction_req_list)); _starpu_spin_unlock(&handle->header_lock); /* _starpu_notify_arbitered_dependencies will handle its own locking */ if (!refcnt) _starpu_notify_arbitered_dependencies(handle); /* We have already unlocked */ return 1; } STARPU_ASSERT(_starpu_data_requester_list_empty(&handle->arbitered_req_list)); /* In case there is a pending reduction, and that this is the last * requester, we may go back to a "normal" coherency model. */ if (handle->reduction_refcnt > 0) { //fprintf(stderr, "NOTIFY REDUCTION TASK RED REFCNT %d\n", handle->reduction_refcnt); handle->reduction_refcnt--; if (handle->reduction_refcnt == 0) _starpu_data_end_reduction_mode_terminate(handle); } if (handle->unlocking_reqs) /* * Our caller is already running the unlock loop below (we were * most probably called from the ready_data_callback call * below). Avoid looping again (which would potentially mean * unbounded recursion), our caller will continue doing the * unlock work for us. */ return 0; handle->unlocking_reqs = 1; struct _starpu_data_requester *r; while ((r = may_unlock_data_req_list_head(handle))) { /* STARPU_RW accesses are treated as STARPU_W */ enum starpu_data_access_mode r_mode = r->mode; if (r_mode == STARPU_RW) r_mode = STARPU_W; int put_in_list = 1; if ((handle->reduction_refcnt == 0) && (handle->current_mode == STARPU_REDUX) && (r_mode != STARPU_REDUX)) { _starpu_data_end_reduction_mode(handle); /* Since we need to perform a mode change, we freeze * the request if needed. */ put_in_list = (handle->reduction_refcnt > 0); } else { put_in_list = 0; } if (put_in_list) { /* We need to put the request back because we must * perform a reduction before. */ _starpu_data_requester_list_push_front(&handle->req_list, r); } else { /* The data is now attributed to that request so we put a * reference on it. */ handle->refcnt++; handle->busy_count++; enum starpu_data_access_mode previous_mode = handle->current_mode; handle->current_mode = r_mode; /* In case we enter in a reduction mode, we invalidate all per * worker replicates. Note that the "per_node" replicates are * kept intact because we'll reduce a valid copy of the * "per-node replicate" with the per-worker replicates .*/ if ((r_mode == STARPU_REDUX) && (previous_mode != STARPU_REDUX)) _starpu_data_start_reduction_mode(handle); _starpu_spin_unlock(&handle->header_lock); if (r->is_requested_by_codelet) { if (!unlock_one_requester(r)) _starpu_push_task(r->j); } else { STARPU_ASSERT(r->ready_data_callback); /* execute the callback associated with the data requester */ r->ready_data_callback(r->argcb); } _starpu_data_requester_delete(r); _starpu_spin_lock(&handle->header_lock); STARPU_ASSERT(handle->busy_count > 0); handle->busy_count--; if (_starpu_data_check_not_busy(handle)) return 1; } } handle->unlocking_reqs = 0; return 0; } starpu-1.2.3+dfsg/src/core/dependencies/data_concurrency.h000066400000000000000000000032271320135501600236130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012, 2015 Université de Bordeaux * Copyright (C) 2010, 2011 CNRS * Copyright (C) 2015 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DATA_CONCURRENCY_H__ #define __DATA_CONCURRENCY_H__ #include void _starpu_job_set_ordered_buffers(struct _starpu_job *j); unsigned _starpu_submit_job_enforce_data_deps(struct _starpu_job *j); void _starpu_submit_job_enforce_arbitered_deps(struct _starpu_job *j, unsigned buf, unsigned nbuffers); int _starpu_notify_data_dependencies(starpu_data_handle_t handle); void _starpu_notify_arbitered_dependencies(starpu_data_handle_t handle); unsigned _starpu_attempt_to_submit_data_request_from_apps(starpu_data_handle_t handle, enum starpu_data_access_mode mode, void (*callback)(void *), void *argcb); unsigned _starpu_attempt_to_submit_arbitered_data_request(unsigned request_from_codelet, starpu_data_handle_t handle, enum starpu_data_access_mode mode, void (*callback)(void *), void *argcb, struct _starpu_job *j, unsigned buffer_index); #endif // __DATA_CONCURRENCY_H__ starpu-1.2.3+dfsg/src/core/dependencies/dependencies.c000066400000000000000000000023671320135501600227150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include /* We assume that the job will not disappear under our hands */ void _starpu_notify_dependencies(struct _starpu_job *j) { STARPU_ASSERT(j); STARPU_ASSERT(j->task); /* unlock tasks depending on that task */ _starpu_notify_task_dependencies(j); /* unlock tags depending on that task */ if (j->task->use_tag) _starpu_notify_tag_dependencies(j->tag); } starpu-1.2.3+dfsg/src/core/dependencies/implicit_data_deps.c000066400000000000000000000535711320135501600241100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2013, 2015, 2017 CNRS * Copyright (C) 2016 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #if 0 # define _STARPU_DEP_DEBUG(fmt, ...) fprintf(stderr, fmt, ## __VA_ARGS__); #else # define _STARPU_DEP_DEBUG(fmt, ...) #endif static void _starpu_add_ghost_dependency(starpu_data_handle_t handle STARPU_ATTRIBUTE_UNUSED, unsigned long previous STARPU_ATTRIBUTE_UNUSED, struct starpu_task *next STARPU_ATTRIBUTE_UNUSED) { struct _starpu_job *next_job = _starpu_get_job_associated_to_task(next); _starpu_bound_job_id_dep(handle, next_job, previous); STARPU_AYU_ADDDEPENDENCY(previous, handle, next_job->job_id); } static void _starpu_add_dependency(starpu_data_handle_t handle STARPU_ATTRIBUTE_UNUSED, struct starpu_task *previous STARPU_ATTRIBUTE_UNUSED, struct starpu_task *next STARPU_ATTRIBUTE_UNUSED) { _starpu_add_ghost_dependency(handle, _starpu_get_job_associated_to_task(previous)->job_id, next); } /* Add pre_sync_task as new accessor among the existing ones, making it depend on the last synchronization task if any. */ static void _starpu_add_accessor(starpu_data_handle_t handle, struct starpu_task *pre_sync_task, struct starpu_task *post_sync_task, struct _starpu_task_wrapper_dlist *post_sync_task_dependency_slot) { /* Add this task to the list of readers */ STARPU_ASSERT(!post_sync_task_dependency_slot->prev); STARPU_ASSERT(!post_sync_task_dependency_slot->next); post_sync_task_dependency_slot->task = post_sync_task; post_sync_task_dependency_slot->next = handle->last_submitted_accessors.next; post_sync_task_dependency_slot->prev = &handle->last_submitted_accessors; post_sync_task_dependency_slot->next->prev = post_sync_task_dependency_slot; handle->last_submitted_accessors.next = post_sync_task_dependency_slot; /* This task depends on the previous synchronization task if any */ if (handle->last_sync_task && handle->last_sync_task != post_sync_task) { struct starpu_task *task_array[1] = {handle->last_sync_task}; _starpu_task_declare_deps_array(pre_sync_task, 1, task_array, 0); _starpu_add_dependency(handle, handle->last_sync_task, pre_sync_task); _STARPU_DEP_DEBUG("dep %p -> %p\n", handle->last_sync_task, pre_sync_task); } else { _STARPU_DEP_DEBUG("No dep\n"); } /* There was perhaps no last submitted writer but a * ghost one, we should report that here, and keep the * ghost writer valid */ if ( ( #ifdef STARPU_USE_FXT 1 #else _starpu_bound_recording #endif || STARPU_AYU_EVENT ) && handle->last_submitted_ghost_sync_id_is_valid) { _STARPU_TRACE_GHOST_TASK_DEPS(handle->last_submitted_ghost_sync_id, _starpu_get_job_associated_to_task(pre_sync_task)->job_id); _starpu_add_ghost_dependency(handle, handle->last_submitted_ghost_sync_id, pre_sync_task); _STARPU_DEP_DEBUG("dep ID%lu -> %p\n", handle->last_submitted_ghost_sync_id, pre_sync_task); } if (!pre_sync_task->cl) { /* Add a reference to be released in _starpu_handle_job_termination */ _starpu_spin_lock(&handle->header_lock); handle->busy_count++; _starpu_spin_unlock(&handle->header_lock); _starpu_get_job_associated_to_task(pre_sync_task)->implicit_dep_handle = handle; } } /* This adds a new synchronization task which depends on all the previous accessors */ static void _starpu_add_sync_task(starpu_data_handle_t handle, struct starpu_task *pre_sync_task, struct starpu_task *post_sync_task, struct starpu_task *ignored_task) { /* Count the existing accessors */ unsigned naccessors = 0; struct _starpu_task_wrapper_dlist *l; l = handle->last_submitted_accessors.next; while (l != &handle->last_submitted_accessors) { if (l->task == ignored_task) { /* Don't make pre_sync_task depend on post_sync_task! * but still drop from the list. * This happens notably when a task accesses several * times to the same data. */ struct _starpu_task_wrapper_dlist *next; l->prev->next = l->next; l->next->prev = l->prev; l->task = NULL; l->prev = NULL; next = l->next; l->next = NULL; l = next; } else { naccessors++; l = l->next; } } _STARPU_DEP_DEBUG("%d accessors\n", naccessors); if (naccessors > 0) { /* Put all tasks in the list into task_array */ struct starpu_task *task_array[naccessors]; unsigned i = 0; l = handle->last_submitted_accessors.next; while (l != &handle->last_submitted_accessors) { STARPU_ASSERT(l->task); STARPU_ASSERT(l->task != ignored_task); task_array[i++] = l->task; _starpu_add_dependency(handle, l->task, pre_sync_task); _STARPU_DEP_DEBUG("dep %p -> %p\n", l->task, pre_sync_task); struct _starpu_task_wrapper_dlist *prev = l; l = l->next; prev->task = NULL; prev->next = NULL; prev->prev = NULL; } _starpu_task_declare_deps_array(pre_sync_task, naccessors, task_array, 0); } #ifndef STARPU_USE_FXT if (_starpu_bound_recording) #endif { /* Declare all dependencies with ghost accessors */ struct _starpu_jobid_list *ghost_accessors_id = handle->last_submitted_ghost_accessors_id; while (ghost_accessors_id) { unsigned long id = ghost_accessors_id->id; _STARPU_TRACE_GHOST_TASK_DEPS(id, _starpu_get_job_associated_to_task(pre_sync_task)->job_id); _starpu_add_ghost_dependency(handle, id, pre_sync_task); _STARPU_DEP_DEBUG("dep ID%lu -> %p\n", id, pre_sync_task); struct _starpu_jobid_list *prev = ghost_accessors_id; ghost_accessors_id = ghost_accessors_id->next; free(prev); } handle->last_submitted_ghost_accessors_id = NULL; } handle->last_submitted_accessors.next = &handle->last_submitted_accessors; handle->last_submitted_accessors.prev = &handle->last_submitted_accessors; handle->last_sync_task = post_sync_task; if (!post_sync_task->cl) { /* Add a reference to be released in _starpu_handle_job_termination */ _starpu_spin_lock(&handle->header_lock); handle->busy_count++; _starpu_spin_unlock(&handle->header_lock); _starpu_get_job_associated_to_task(post_sync_task)->implicit_dep_handle = handle; } } /* This function adds the implicit task dependencies introduced by data * sequential consistency. Two tasks are provided: pre_sync and post_sync which * respectively indicates which task is going to depend on the previous deps * and on which task future deps should wait. In the case of a dependency * introduced by a task submission, both tasks are just the submitted task, but * in the case of user interactions with the DSM, these may be different tasks. * */ /* NB : handle->sequential_consistency_mutex must be hold by the caller; * returns a task, to be submitted after releasing that mutex. */ struct starpu_task *_starpu_detect_implicit_data_deps_with_handle(struct starpu_task *pre_sync_task, struct starpu_task *post_sync_task, struct _starpu_task_wrapper_dlist *post_sync_task_dependency_slot, starpu_data_handle_t handle, enum starpu_data_access_mode mode) { struct starpu_task *task = NULL; /* Do not care about some flags */ mode &= ~ STARPU_SSEND; mode &= ~ STARPU_LOCALITY; STARPU_ASSERT(!(mode & STARPU_SCRATCH)); _STARPU_LOG_IN(); if (handle->sequential_consistency) { struct _starpu_job *pre_sync_job = _starpu_get_job_associated_to_task(pre_sync_task); struct _starpu_job *post_sync_job = _starpu_get_job_associated_to_task(post_sync_task); if (mode & STARPU_W || mode == STARPU_REDUX) handle->initialized = 1; /* Skip tasks that are associated to a reduction phase so that * they do not interfere with the application. */ if (pre_sync_job->reduction_task || post_sync_job->reduction_task) return NULL; /* In case we are generating the DAG, we add an implicit * dependency between the pre and the post sync tasks in case * they are not the same. */ if (pre_sync_task != post_sync_task #ifndef STARPU_USE_FXT && _starpu_bound_recording #endif ) { _STARPU_TRACE_GHOST_TASK_DEPS(pre_sync_job->job_id, post_sync_job->job_id); _starpu_bound_task_dep(post_sync_job, pre_sync_job); } enum starpu_data_access_mode previous_mode = handle->last_submitted_mode; _STARPU_DEP_DEBUG("Handle %p Tasks %p %p %x->%x\n", handle, pre_sync_task, post_sync_task, previous_mode, mode); /* * Tasks can access the data concurrently only if they have the * same access mode, which can only be either: * - write with STARPU_COMMUTE * - read * - redux * * In other cases, the tasks have to depend on each other. */ if ((mode & STARPU_W && mode & STARPU_COMMUTE && previous_mode & STARPU_W && previous_mode & STARPU_COMMUTE) || (mode == STARPU_R && previous_mode == STARPU_R) || (mode == STARPU_REDUX && previous_mode == STARPU_REDUX)) { _STARPU_DEP_DEBUG("concurrently\n"); /* Can access concurrently with current tasks */ _starpu_add_accessor(handle, pre_sync_task, post_sync_task, post_sync_task_dependency_slot); } else { /* Can not access concurrently, have to wait for existing accessors */ struct _starpu_task_wrapper_dlist *l = handle->last_submitted_accessors.next; _STARPU_DEP_DEBUG("dependency\n"); if ((l != &handle->last_submitted_accessors && l->next != &handle->last_submitted_accessors) || (handle->last_submitted_ghost_accessors_id && handle->last_submitted_ghost_accessors_id->next)) { /* Several previous accessors */ if (mode == STARPU_W) { _STARPU_DEP_DEBUG("several predecessors, and this is a W-only task, thus can serve directly as a synchronization task.\n"); /* Optimization: this task can not * combine with others anyway, use it * as synchronization task by making it * wait for the previous ones. */ _starpu_add_sync_task(handle, pre_sync_task, post_sync_task, post_sync_task); } else { _STARPU_DEP_DEBUG("several predecessors, adding sync task\n"); /* insert an empty synchronization task * which waits for the whole set, * instead of creating a quadratic * number of dependencies. */ struct starpu_task *sync_task = starpu_task_create(); STARPU_ASSERT(sync_task); if (previous_mode == STARPU_REDUX) sync_task->name = "sync_task_redux"; else if (mode == STARPU_COMMUTE || previous_mode == STARPU_COMMUTE) sync_task->name = "sync_task_commute"; else sync_task->name = "sync_task"; sync_task->cl = NULL; /* Make this task wait for the previous ones */ _starpu_add_sync_task(handle, sync_task, sync_task, post_sync_task); /* And the requested task wait for this one */ _starpu_add_accessor(handle, pre_sync_task, post_sync_task, post_sync_task_dependency_slot); task = sync_task; } } else { /* One previous accessor, make it the sync * task, and start depending on it. */ if (l != &handle->last_submitted_accessors) { _STARPU_DEP_DEBUG("One previous accessor, depending on it\n"); handle->last_sync_task = l->task; l->next = NULL; l->prev = NULL; handle->last_submitted_accessors.next = &handle->last_submitted_accessors; handle->last_submitted_accessors.prev = &handle->last_submitted_accessors; } else if (handle->last_submitted_ghost_accessors_id) { _STARPU_DEP_DEBUG("No more currently running accessor, but a ghost id, taking it.\n"); handle->last_submitted_ghost_sync_id = handle->last_submitted_ghost_accessors_id->id; handle->last_submitted_ghost_sync_id_is_valid = 1; free(handle->last_submitted_ghost_accessors_id); handle->last_submitted_ghost_accessors_id = NULL; } else { _STARPU_DEP_DEBUG("No previous accessor, no dependency\n"); } _starpu_add_accessor(handle, pre_sync_task, post_sync_task, post_sync_task_dependency_slot); } } handle->last_submitted_mode = mode; } _STARPU_LOG_OUT(); return task; } int _starpu_test_implicit_data_deps_with_handle(starpu_data_handle_t handle, enum starpu_data_access_mode mode) { /* Do not care about some flags */ mode &= ~ STARPU_SSEND; mode &= ~ STARPU_LOCALITY; STARPU_ASSERT(!(mode & STARPU_SCRATCH)); if (handle->sequential_consistency) { if (handle->last_sync_task) return -EAGAIN; if (handle->last_submitted_accessors.next != &handle->last_submitted_accessors) return -EAGAIN; if (mode & STARPU_W || mode == STARPU_REDUX) handle->initialized = 1; handle->last_submitted_mode = mode; } return 0; } /* Create the implicit dependencies for a newly submitted task */ void _starpu_detect_implicit_data_deps(struct starpu_task *task) { STARPU_ASSERT(task->cl); _STARPU_LOG_IN(); if (!task->sequential_consistency) return; /* We don't want to enforce a sequential consistency for tasks that are * not visible to the application. */ struct _starpu_job *j = _starpu_get_job_associated_to_task(task); if (j->reduction_task) return; unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); struct _starpu_task_wrapper_dlist *dep_slots = _STARPU_JOB_GET_DEP_SLOTS(j); unsigned buffer; for (buffer = 0; buffer < nbuffers; buffer++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, buffer); enum starpu_data_access_mode mode = STARPU_TASK_GET_MODE(task, buffer); struct starpu_task *new_task; /* Scratch memory does not introduce any deps */ if (mode & STARPU_SCRATCH) continue; STARPU_PTHREAD_MUTEX_LOCK(&handle->sequential_consistency_mutex); new_task = _starpu_detect_implicit_data_deps_with_handle(task, task, &dep_slots[buffer], handle, mode); STARPU_PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex); if (new_task) { int ret = _starpu_task_submit_internally(new_task); STARPU_ASSERT(!ret); } } _STARPU_LOG_OUT(); } /* This function is called when a task has been executed so that we don't * create dependencies to task that do not exist anymore. */ /* NB: We maintain a list of "ghost deps" in case FXT is enabled. Ghost * dependencies are the dependencies that are implicitely enforced by StarPU * even if they do not imply a real dependency. For instance in the following * sequence, f(Ar) g(Ar) h(Aw), we expect to have h depend on both f and g, but * if h is submitted after the termination of f or g, StarPU will not create a * dependency as this is not needed anymore. */ /* the sequential_consistency_mutex of the handle has to be already held */ void _starpu_release_data_enforce_sequential_consistency(struct starpu_task *task, struct _starpu_task_wrapper_dlist *task_dependency_slot, starpu_data_handle_t handle) { STARPU_PTHREAD_MUTEX_LOCK(&handle->sequential_consistency_mutex); if (handle->sequential_consistency) { /* If this is the last writer, there is no point in adding * extra deps to that tasks that does not exists anymore */ if (task == handle->last_sync_task) { handle->last_sync_task = NULL; #ifndef STARPU_USE_FXT if (_starpu_bound_recording) #endif { /* Save the previous writer as the ghost last writer */ handle->last_submitted_ghost_sync_id_is_valid = 1; struct _starpu_job *ghost_job = _starpu_get_job_associated_to_task(task); handle->last_submitted_ghost_sync_id = ghost_job->job_id; } } /* Same if this is one of the readers: we go through the list * of readers and remove the task if it is found. */ if (task_dependency_slot && task_dependency_slot->next) { #ifdef STARPU_DEBUG /* Make sure we are removing ourself from the proper handle */ struct _starpu_task_wrapper_dlist *l; for (l = task_dependency_slot->prev; l->task; l = l->prev) ; STARPU_ASSERT(l == &handle->last_submitted_accessors); for (l = task_dependency_slot->next; l->task; l = l->next) ; STARPU_ASSERT(l == &handle->last_submitted_accessors); #endif STARPU_ASSERT(task_dependency_slot->task == task); task_dependency_slot->next->prev = task_dependency_slot->prev; task_dependency_slot->prev->next = task_dependency_slot->next; task_dependency_slot->task = NULL; task_dependency_slot->next = NULL; task_dependency_slot->prev = NULL; #ifndef STARPU_USE_FXT if (_starpu_bound_recording) #endif { /* Save the job id of the reader task in the ghost reader linked list list */ struct _starpu_job *ghost_reader_job = _starpu_get_job_associated_to_task(task); struct _starpu_jobid_list *link; _STARPU_MALLOC(link, sizeof(struct _starpu_jobid_list)); link->next = handle->last_submitted_ghost_accessors_id; link->id = ghost_reader_job->job_id; handle->last_submitted_ghost_accessors_id = link; } } } STARPU_PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex); } /* This is the same as _starpu_release_data_enforce_sequential_consistency, but * for all data of a task */ void _starpu_release_task_enforce_sequential_consistency(struct _starpu_job *j) { struct starpu_task *task = j->task; struct _starpu_data_descr *descrs = _STARPU_JOB_GET_ORDERED_BUFFERS(j); struct _starpu_task_wrapper_dlist *slots = _STARPU_JOB_GET_DEP_SLOTS(j); if (!task->cl) return; unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); unsigned index; /* Release all implicit dependencies */ for (index = 0; index < nbuffers; index++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, index); _starpu_release_data_enforce_sequential_consistency(task, &slots[index], handle); } for (index = 0; index < nbuffers; index++) { starpu_data_handle_t handle = descrs[index].handle; if (index && descrs[index-1].handle == descrs[index].handle) /* We have already released this data, skip it. This * depends on ordering putting writes before reads, see * _starpu_compar_handles */ continue; /* Release the reference acquired in _starpu_push_task_output */ _starpu_spin_lock(&handle->header_lock); STARPU_ASSERT(handle->busy_count > 0); handle->busy_count--; if (!_starpu_data_check_not_busy(handle)) _starpu_spin_unlock(&handle->header_lock); } } void _starpu_add_post_sync_tasks(struct starpu_task *post_sync_task, starpu_data_handle_t handle) { _STARPU_LOG_IN(); STARPU_PTHREAD_MUTEX_LOCK(&handle->sequential_consistency_mutex); if (handle->sequential_consistency) { handle->post_sync_tasks_cnt++; struct _starpu_task_wrapper_list *link; _STARPU_MALLOC(link, sizeof(struct _starpu_task_wrapper_list)); link->task = post_sync_task; link->next = handle->post_sync_tasks; handle->post_sync_tasks = link; } STARPU_PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex); _STARPU_LOG_OUT(); } void _starpu_unlock_post_sync_tasks(starpu_data_handle_t handle) { struct _starpu_task_wrapper_list *post_sync_tasks = NULL; unsigned do_submit_tasks = 0; /* Here helgrind would shout that this is an unprotected access, but * count can only be zero if we don't have to care about * post_sync_tasks_cnt at all. */ if (STARPU_RUNNING_ON_VALGRIND || handle->post_sync_tasks_cnt) { STARPU_PTHREAD_MUTEX_LOCK(&handle->sequential_consistency_mutex); if (--handle->post_sync_tasks_cnt == 0) { /* unlock all tasks : we need not hold the lock while unlocking all these tasks */ do_submit_tasks = 1; post_sync_tasks = handle->post_sync_tasks; handle->post_sync_tasks = NULL; } STARPU_PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex); } if (do_submit_tasks) { struct _starpu_task_wrapper_list *link = post_sync_tasks; while (link) { /* There is no need to depend on that task now, since it was already unlocked */ _starpu_release_data_enforce_sequential_consistency(link->task, &_starpu_get_job_associated_to_task(link->task)->implicit_dep_slot, handle); int ret = _starpu_task_submit_internally(link->task); STARPU_ASSERT(!ret); struct _starpu_task_wrapper_list *tmp = link; link = link->next; free(tmp); } } } /* If sequential consistency mode is enabled, this function blocks until the * handle is available in the requested access mode. */ int _starpu_data_wait_until_available(starpu_data_handle_t handle, enum starpu_data_access_mode mode, const char *sync_name) { /* If sequential consistency is enabled, wait until data is available */ STARPU_PTHREAD_MUTEX_LOCK(&handle->sequential_consistency_mutex); int sequential_consistency = handle->sequential_consistency; if (sequential_consistency) { struct starpu_task *sync_task, *new_task; sync_task = starpu_task_create(); sync_task->name = sync_name; sync_task->detach = 0; sync_task->destroy = 1; /* It is not really a RW access, but we want to make sure that * all previous accesses are done */ new_task = _starpu_detect_implicit_data_deps_with_handle(sync_task, sync_task, &_starpu_get_job_associated_to_task(sync_task)->implicit_dep_slot, handle, mode); STARPU_PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex); if (new_task) { int ret = _starpu_task_submit_internally(new_task); STARPU_ASSERT(!ret); } /* TODO detect if this is superflous */ int ret = _starpu_task_submit_internally(sync_task); STARPU_ASSERT(!ret); ret = starpu_task_wait(sync_task); STARPU_ASSERT(ret == 0); } else { STARPU_PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex); } return 0; } /* This data is about to be freed, clean our stuff */ void _starpu_data_clear_implicit(starpu_data_handle_t handle) { struct _starpu_jobid_list *list; STARPU_PTHREAD_MUTEX_LOCK(&handle->sequential_consistency_mutex); list = handle->last_submitted_ghost_accessors_id; while (list) { struct _starpu_jobid_list *next = list->next; free(list); list = next; } STARPU_PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex); } starpu-1.2.3+dfsg/src/core/dependencies/implicit_data_deps.h000066400000000000000000000037251320135501600241110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012, 2014-2015, 2017 Université de Bordeaux * Copyright (C) 2010, 2011 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __IMPLICIT_DATA_DEPS_H__ #define __IMPLICIT_DATA_DEPS_H__ #include #include struct starpu_task *_starpu_detect_implicit_data_deps_with_handle(struct starpu_task *pre_sync_task, struct starpu_task *post_sync_task, struct _starpu_task_wrapper_dlist *post_sync_task_dependency_slot, starpu_data_handle_t handle, enum starpu_data_access_mode mode); int _starpu_test_implicit_data_deps_with_handle(starpu_data_handle_t handle, enum starpu_data_access_mode mode); void _starpu_detect_implicit_data_deps(struct starpu_task *task); void _starpu_release_data_enforce_sequential_consistency(struct starpu_task *task, struct _starpu_task_wrapper_dlist *task_dependency_slot, starpu_data_handle_t handle); void _starpu_release_task_enforce_sequential_consistency(struct _starpu_job *j); void _starpu_add_post_sync_tasks(struct starpu_task *post_sync_task, starpu_data_handle_t handle); void _starpu_unlock_post_sync_tasks(starpu_data_handle_t handle); /* This function blocks until the handle is available in the requested mode */ int _starpu_data_wait_until_available(starpu_data_handle_t handle, enum starpu_data_access_mode mode, const char *sync_name); void _starpu_data_clear_implicit(starpu_data_handle_t handle); #endif // __IMPLICIT_DATA_DEPS_H__ starpu-1.2.3+dfsg/src/core/dependencies/tags.c000066400000000000000000000304121320135501600212150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2013, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2017 CNRS * Copyright (C) 2016 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #define STARPU_AYUDAME_OFFSET 4000000000000000000ULL struct _starpu_tag_table { UT_hash_handle hh; starpu_tag_t id; struct _starpu_tag *tag; }; #define HASH_ADD_UINT64_T(head,field,add) HASH_ADD(hh,head,field,sizeof(uint64_t),add) #define HASH_FIND_UINT64_T(head,find,out) HASH_FIND(hh,head,find,sizeof(uint64_t),out) static struct _starpu_tag_table *tag_htbl = NULL; static starpu_pthread_rwlock_t tag_global_rwlock; static struct _starpu_cg *create_cg_apps(unsigned ntags) { struct _starpu_cg *cg; _STARPU_MALLOC(cg, sizeof(struct _starpu_cg)); cg->ntags = ntags; cg->remaining = ntags; cg->cg_type = STARPU_CG_APPS; cg->succ.succ_apps.completed = 0; STARPU_PTHREAD_MUTEX_INIT(&cg->succ.succ_apps.cg_mutex, NULL); STARPU_PTHREAD_COND_INIT(&cg->succ.succ_apps.cg_cond, NULL); return cg; } static struct _starpu_cg *create_cg_tag(unsigned ntags, struct _starpu_tag *tag) { struct _starpu_cg *cg; _STARPU_MALLOC(cg, sizeof(struct _starpu_cg)); cg->ntags = ntags; cg->remaining = ntags; cg->cg_type = STARPU_CG_TAG; cg->succ.tag = tag; tag->tag_successors.ndeps++; return cg; } static struct _starpu_tag *_starpu_tag_init(starpu_tag_t id) { struct _starpu_tag *tag; _STARPU_MALLOC(tag, sizeof(struct _starpu_tag)); tag->job = NULL; tag->is_assigned = 0; tag->is_submitted = 0; tag->id = id; tag->state = STARPU_INVALID_STATE; _starpu_cg_list_init(&tag->tag_successors); _starpu_spin_init(&tag->lock); return tag; } static void _starpu_tag_free(void *_tag) { struct _starpu_tag *tag = (struct _starpu_tag *) _tag; if (tag) { _starpu_spin_lock(&tag->lock); unsigned nsuccs = tag->tag_successors.nsuccs; unsigned succ; for (succ = 0; succ < nsuccs; succ++) { struct _starpu_cg *cg = tag->tag_successors.succ[succ]; unsigned ntags = STARPU_ATOMIC_ADD(&cg->ntags, -1); unsigned STARPU_ATTRIBUTE_UNUSED remaining = STARPU_ATOMIC_ADD(&cg->remaining, -1); if (!ntags && (cg->cg_type == STARPU_CG_TAG)) /* Last tag this cg depends on, cg becomes unreferenced */ free(cg); } #ifdef STARPU_DYNAMIC_DEPS_SIZE free(tag->tag_successors.succ); #endif _starpu_spin_unlock(&tag->lock); _starpu_spin_destroy(&tag->lock); free(tag); } } /* * Staticly initializing tag_global_rwlock seems to lead to weird errors * on Darwin, so we do it dynamically. */ void _starpu_init_tags(void) { STARPU_PTHREAD_RWLOCK_INIT(&tag_global_rwlock, NULL); } void starpu_tag_remove(starpu_tag_t id) { struct _starpu_tag_table *entry; STARPU_ASSERT(!STARPU_AYU_EVENT || id < STARPU_AYUDAME_OFFSET); STARPU_AYU_REMOVETASK(id + STARPU_AYUDAME_OFFSET); STARPU_PTHREAD_RWLOCK_WRLOCK(&tag_global_rwlock); HASH_FIND_UINT64_T(tag_htbl, &id, entry); if (entry) HASH_DEL(tag_htbl, entry); STARPU_PTHREAD_RWLOCK_UNLOCK(&tag_global_rwlock); if (entry) { _starpu_tag_free(entry->tag); free(entry); } } void _starpu_tag_clear(void) { STARPU_PTHREAD_RWLOCK_WRLOCK(&tag_global_rwlock); /* XXX: _starpu_tag_free takes the tag spinlocks while we are keeping * the global rwlock. This contradicts the lock order of * starpu_tag_wait_array. Should not be a problem in practice since * _starpu_tag_clear is called at shutdown only. */ struct _starpu_tag_table *entry, *tmp; HASH_ITER(hh, tag_htbl, entry, tmp) { HASH_DEL(tag_htbl, entry); _starpu_tag_free(entry->tag); free(entry); } STARPU_PTHREAD_RWLOCK_UNLOCK(&tag_global_rwlock); } static struct _starpu_tag *_gettag_struct(starpu_tag_t id) { /* search if the tag is already declared or not */ struct _starpu_tag_table *entry; struct _starpu_tag *tag; HASH_FIND_UINT64_T(tag_htbl, &id, entry); if (entry != NULL) tag = entry->tag; else { /* the tag does not exist yet : create an entry */ tag = _starpu_tag_init(id); struct _starpu_tag_table *entry2; _STARPU_MALLOC(entry2, sizeof(*entry2)); entry2->id = id; entry2->tag = tag; HASH_ADD_UINT64_T(tag_htbl, id, entry2); STARPU_ASSERT(!STARPU_AYU_EVENT || id < STARPU_AYUDAME_OFFSET); STARPU_AYU_ADDTASK(id + STARPU_AYUDAME_OFFSET, NULL); } return tag; } static struct _starpu_tag *gettag_struct(starpu_tag_t id) { struct _starpu_tag *tag; STARPU_PTHREAD_RWLOCK_WRLOCK(&tag_global_rwlock); tag = _gettag_struct(id); STARPU_PTHREAD_RWLOCK_UNLOCK(&tag_global_rwlock); return tag; } /* lock should be taken */ void _starpu_tag_set_ready(struct _starpu_tag *tag) { /* mark this tag as ready to run */ tag->state = STARPU_READY; /* declare it to the scheduler ! */ struct _starpu_job *j = tag->job; /* In case the task job is going to be scheduled immediately, and if * the task is "empty", calling _starpu_push_task would directly try to enforce * the dependencies of the task, and therefore it would try to grab the * lock again, resulting in a deadlock. */ _starpu_spin_unlock(&tag->lock); /* enforce data dependencies */ STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex); _starpu_enforce_deps_starting_from_task(j); _starpu_spin_lock(&tag->lock); STARPU_ASSERT(!STARPU_AYU_EVENT || tag->id < STARPU_AYUDAME_OFFSET); STARPU_AYU_PRERUNTASK(tag->id + STARPU_AYUDAME_OFFSET, -1); STARPU_AYU_POSTRUNTASK(tag->id + STARPU_AYUDAME_OFFSET); } /* the lock must be taken ! */ static void _starpu_tag_add_succ(struct _starpu_tag *tag, struct _starpu_cg *cg) { STARPU_ASSERT(tag); _starpu_add_successor_to_cg_list(&tag->tag_successors, cg); if (tag->state == STARPU_DONE) { /* the tag was already completed sooner */ _starpu_notify_cg(cg); } } void _starpu_notify_tag_dependencies(struct _starpu_tag *tag) { _starpu_spin_lock(&tag->lock); if (tag->state == STARPU_DONE) { _starpu_spin_unlock(&tag->lock); return; } tag->state = STARPU_DONE; _STARPU_TRACE_TAG_DONE(tag); _starpu_notify_cg_list(&tag->tag_successors); _starpu_spin_unlock(&tag->lock); } void starpu_tag_restart(starpu_tag_t id) { struct _starpu_tag *tag = gettag_struct(id); _starpu_spin_lock(&tag->lock); STARPU_ASSERT_MSG(tag->state == STARPU_DONE || tag->state == STARPU_INVALID_STATE || tag->state == STARPU_ASSOCIATED || tag->state == STARPU_BLOCKED, "Only completed tags can be restarted (%llu was %d)", (unsigned long long) id, tag->state); tag->state = STARPU_BLOCKED; _starpu_spin_unlock(&tag->lock); } void starpu_tag_notify_from_apps(starpu_tag_t id) { struct _starpu_tag *tag = gettag_struct(id); _starpu_notify_tag_dependencies(tag); } void _starpu_tag_declare(starpu_tag_t id, struct _starpu_job *job) { _STARPU_TRACE_TAG(id, job); job->task->use_tag = 1; struct _starpu_tag *tag= gettag_struct(id); _starpu_spin_lock(&tag->lock); /* Note: a tag can be shared by several tasks, when it is used to * detect when either of them are finished. We however don't allow * several tasks to share a tag when it is used to wake them by * dependency */ if (tag->job != job) tag->is_assigned++; tag->job = job; job->tag = tag; /* the tag is now associated to a job */ /* When the same tag may be signaled several times by different tasks, * and it's already done, we should not reset the "done" state. * When the tag is simply used by the same task several times, we have * to do so. */ if (job->task->regenerate || job->submitted == 2 || tag->state != STARPU_DONE) tag->state = STARPU_ASSOCIATED; STARPU_ASSERT(!STARPU_AYU_EVENT || id < STARPU_AYUDAME_OFFSET); STARPU_AYU_ADDDEPENDENCY(id+STARPU_AYUDAME_OFFSET, 0, job->job_id); STARPU_AYU_ADDDEPENDENCY(job->job_id, 0, id+STARPU_AYUDAME_OFFSET); _starpu_spin_unlock(&tag->lock); } void starpu_tag_declare_deps_array(starpu_tag_t id, unsigned ndeps, starpu_tag_t *array) { if (!ndeps) return; unsigned i; /* create the associated completion group */ struct _starpu_tag *tag_child = gettag_struct(id); _starpu_spin_lock(&tag_child->lock); struct _starpu_cg *cg = create_cg_tag(ndeps, tag_child); _starpu_spin_unlock(&tag_child->lock); for (i = 0; i < ndeps; i++) { starpu_tag_t dep_id = array[i]; /* id depends on dep_id * so cg should be among dep_id's successors*/ _STARPU_TRACE_TAG_DEPS(id, dep_id); _starpu_bound_tag_dep(id, dep_id); struct _starpu_tag *tag_dep = gettag_struct(dep_id); STARPU_ASSERT(tag_dep != tag_child); _starpu_spin_lock(&tag_dep->lock); _starpu_spin_lock(&tag_child->lock); _starpu_tag_add_succ(tag_dep, cg); STARPU_ASSERT(!STARPU_AYU_EVENT || dep_id < STARPU_AYUDAME_OFFSET); STARPU_ASSERT(!STARPU_AYU_EVENT || id < STARPU_AYUDAME_OFFSET); STARPU_AYU_ADDDEPENDENCY(dep_id+STARPU_AYUDAME_OFFSET, 0, id+STARPU_AYUDAME_OFFSET); _starpu_spin_unlock(&tag_child->lock); _starpu_spin_unlock(&tag_dep->lock); } } void starpu_tag_declare_deps(starpu_tag_t id, unsigned ndeps, ...) { if (!ndeps) return; unsigned i; /* create the associated completion group */ struct _starpu_tag *tag_child = gettag_struct(id); _starpu_spin_lock(&tag_child->lock); struct _starpu_cg *cg = create_cg_tag(ndeps, tag_child); _starpu_spin_unlock(&tag_child->lock); va_list pa; va_start(pa, ndeps); for (i = 0; i < ndeps; i++) { starpu_tag_t dep_id; dep_id = va_arg(pa, starpu_tag_t); /* id depends on dep_id * so cg should be among dep_id's successors*/ _STARPU_TRACE_TAG_DEPS(id, dep_id); _starpu_bound_tag_dep(id, dep_id); struct _starpu_tag *tag_dep = gettag_struct(dep_id); STARPU_ASSERT(tag_dep != tag_child); _starpu_spin_lock(&tag_dep->lock); _starpu_spin_lock(&tag_child->lock); _starpu_tag_add_succ(tag_dep, cg); STARPU_ASSERT(!STARPU_AYU_EVENT || dep_id < STARPU_AYUDAME_OFFSET); STARPU_ASSERT(!STARPU_AYU_EVENT || id < STARPU_AYUDAME_OFFSET); STARPU_AYU_ADDDEPENDENCY(dep_id+STARPU_AYUDAME_OFFSET, 0, id+STARPU_AYUDAME_OFFSET); _starpu_spin_unlock(&tag_child->lock); _starpu_spin_unlock(&tag_dep->lock); } va_end(pa); } /* this function may be called by the application (outside callbacks !) */ int starpu_tag_wait_array(unsigned ntags, starpu_tag_t *id) { unsigned i; unsigned current; struct _starpu_tag *tag_array[ntags]; _STARPU_LOG_IN(); /* It is forbidden to block within callbacks or codelets */ STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "starpu_tag_wait must not be called from a task or callback"); starpu_do_schedule(); STARPU_PTHREAD_RWLOCK_WRLOCK(&tag_global_rwlock); /* only wait the tags that are not done yet */ for (i = 0, current = 0; i < ntags; i++) { struct _starpu_tag *tag = _gettag_struct(id[i]); _starpu_spin_lock(&tag->lock); if (tag->state == STARPU_DONE) { /* that tag is done already */ _starpu_spin_unlock(&tag->lock); } else { tag_array[current] = tag; current++; } } STARPU_PTHREAD_RWLOCK_UNLOCK(&tag_global_rwlock); if (current == 0) { /* all deps are already fulfilled */ _STARPU_LOG_OUT_TAG("all deps are already fulfilled"); return 0; } /* there is at least one task that is not finished */ struct _starpu_cg *cg = create_cg_apps(current); for (i = 0; i < current; i++) { _starpu_tag_add_succ(tag_array[i], cg); _starpu_spin_unlock(&tag_array[i]->lock); } STARPU_PTHREAD_MUTEX_LOCK(&cg->succ.succ_apps.cg_mutex); while (!cg->succ.succ_apps.completed) STARPU_PTHREAD_COND_WAIT(&cg->succ.succ_apps.cg_cond, &cg->succ.succ_apps.cg_mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&cg->succ.succ_apps.cg_mutex); STARPU_PTHREAD_MUTEX_DESTROY(&cg->succ.succ_apps.cg_mutex); STARPU_PTHREAD_COND_DESTROY(&cg->succ.succ_apps.cg_cond); free(cg); _STARPU_LOG_OUT(); return 0; } int starpu_tag_wait(starpu_tag_t id) { return starpu_tag_wait_array(1, &id); } starpu-1.2.3+dfsg/src/core/dependencies/tags.h000066400000000000000000000043241320135501600212250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2011 Université de Bordeaux * Copyright (C) 2010, 2011 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __TAGS_H__ #define __TAGS_H__ #include #include #include #include #define _STARPU_TAG_SIZE (sizeof(starpu_tag_t)*8) enum _starpu_tag_state { /* this tag is not declared by any task */ STARPU_INVALID_STATE, /* _starpu_tag_declare was called to associate the tag to a task */ STARPU_ASSOCIATED, /* some task dependencies are not fulfilled yet */ STARPU_BLOCKED, /* the task can be (or has been) submitted to the scheduler (all deps * fulfilled) */ STARPU_READY, // useless ... // /* the task has been submitted to the scheduler */ // STARPU_SCHEDULED, /* the task has been performed */ STARPU_DONE }; struct _starpu_job; struct _starpu_tag { /* Lock for this structure. Locking order is in dependency order: a tag * must not be locked before locking a tag it depends on */ struct _starpu_spinlock lock; starpu_tag_t id; /* an identifier for the task */ enum _starpu_tag_state state; struct _starpu_cg_list tag_successors; struct _starpu_job *job; /* which job is associated to the tag if any ? */ unsigned is_assigned; unsigned is_submitted; }; void _starpu_init_tags(void); void _starpu_notify_dependencies(struct _starpu_job *j); void _starpu_notify_tag_dependencies(struct _starpu_tag *tag); void _starpu_tag_declare(starpu_tag_t id, struct _starpu_job *job); void _starpu_tag_set_ready(struct _starpu_tag *tag); unsigned _starpu_submit_job_enforce_task_deps(struct _starpu_job *j); void _starpu_tag_clear(void); #endif // __TAGS_H__ starpu-1.2.3+dfsg/src/core/dependencies/task_deps.c000066400000000000000000000115611320135501600222400ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015, 2017 CNRS * Copyright (C) 2014, 2016 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include static struct _starpu_cg *create_cg_task(unsigned ntags, struct _starpu_job *j) { struct _starpu_cg *cg; _STARPU_MALLOC(cg, sizeof(struct _starpu_cg)); cg->ntags = ntags; cg->remaining = ntags; cg->cg_type = STARPU_CG_TASK; cg->succ.job = j; j->job_successors.ndeps++; return cg; } static void _starpu_task_add_succ(struct _starpu_job *j, struct _starpu_cg *cg) { STARPU_ASSERT(j); if (_starpu_add_successor_to_cg_list(&j->job_successors, cg)) /* the task was already completed sooner */ _starpu_notify_cg(cg); } void _starpu_notify_task_dependencies(struct _starpu_job *j) { _starpu_notify_cg_list(&j->job_successors); } /* task depends on the tasks in task array */ void _starpu_task_declare_deps_array(struct starpu_task *task, unsigned ndeps, struct starpu_task *task_array[], int check) { if (ndeps == 0) return; struct _starpu_job *job; job = _starpu_get_job_associated_to_task(task); STARPU_PTHREAD_MUTEX_LOCK(&job->sync_mutex); if (check) STARPU_ASSERT_MSG( !job->submitted || !task->destroy || task->detach #ifdef STARPU_OPENMP || job->continuation #endif , "Task dependencies have to be set before submission (submitted %u destroy %u detach %u)", job->submitted, task->destroy, task->detach); else STARPU_ASSERT_MSG(job->terminated <= 1, "Task dependencies have to be set before termination (terminated %u)", job->terminated); struct _starpu_cg *cg = create_cg_task(ndeps, job); STARPU_PTHREAD_MUTEX_UNLOCK(&job->sync_mutex); unsigned i; for (i = 0; i < ndeps; i++) { struct starpu_task *dep_task = task_array[i]; struct _starpu_job *dep_job; struct _starpu_cg *back_cg = NULL; dep_job = _starpu_get_job_associated_to_task(dep_task); STARPU_ASSERT_MSG(dep_job != job, "A task must not depend on itself."); STARPU_PTHREAD_MUTEX_LOCK(&dep_job->sync_mutex); if (check) { STARPU_ASSERT_MSG(!dep_job->submitted || !dep_job->task->destroy || dep_job->task->detach, "Unless it is not to be destroyed automatically, a task dependencies have to be set before submission"); STARPU_ASSERT_MSG(dep_job->submitted != 2, "For resubmited tasks, dependencies have to be set before first re-submission"); STARPU_ASSERT_MSG(!dep_job->submitted || !dep_job->task->regenerate, "For regenerated tasks, dependencies have to be set before first submission"); } else STARPU_ASSERT_MSG(dep_job->terminated <= 1, "Task dependencies have to be set before termination (terminated %u)", dep_job->terminated); if (dep_job->task->regenerate) { /* Make sure we don't regenerate the dependency before this task is finished */ back_cg = create_cg_task(1, dep_job); /* Just do not take that dependency into account for the first submission */ dep_job->job_successors.ndeps_completed++; } STARPU_PTHREAD_MUTEX_UNLOCK(&dep_job->sync_mutex); _STARPU_TRACE_TASK_DEPS(dep_job, job); _starpu_bound_task_dep(job, dep_job); if (check) { STARPU_AYU_ADDDEPENDENCY(dep_job->job_id, 0, job->job_id); } if (_starpu_graph_record) _starpu_graph_add_job_dep(job, dep_job); _starpu_task_add_succ(dep_job, cg); if (dep_job->task->regenerate) _starpu_task_add_succ(job, back_cg); } } void starpu_task_declare_deps_array(struct starpu_task *task, unsigned ndeps, struct starpu_task *task_array[]) { _starpu_task_declare_deps_array(task, ndeps, task_array, 1); } int starpu_task_get_task_succs(struct starpu_task *task, unsigned ndeps, struct starpu_task *task_array[]) { struct _starpu_job *j = _starpu_get_job_associated_to_task(task); return _starpu_list_task_successors_in_cg_list(&j->job_successors, ndeps, task_array); } int starpu_task_get_task_scheduled_succs(struct starpu_task *task, unsigned ndeps, struct starpu_task *task_array[]) { struct _starpu_job *j = _starpu_get_job_associated_to_task(task); return _starpu_list_task_scheduled_successors_in_cg_list(&j->job_successors, ndeps, task_array); } starpu-1.2.3+dfsg/src/core/detect_combined_workers.c000066400000000000000000000254471320135501600225310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2015 Université de Bordeaux * Copyright (C) 2011, 2012, 2013, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #ifdef STARPU_HAVE_HWLOC #include static void find_workers(hwloc_obj_t obj, int cpu_workers[STARPU_NMAXWORKERS], unsigned *n) { struct _starpu_hwloc_userdata *data = obj->userdata; if (!data->worker_list) /* Not something we run something on, don't care */ return; if (data->worker_list == (void*) -1) { /* Intra node, recurse */ unsigned i; for (i = 0; i < obj->arity; i++) find_workers(obj->children[i], cpu_workers, n); return; } /* Got to a PU leaf */ struct _starpu_worker_list *workers = data->worker_list; struct _starpu_worker *worker; for(worker = _starpu_worker_list_begin(workers); worker != _starpu_worker_list_end(workers); worker = _starpu_worker_list_next(worker)) { /* is it a CPU worker? */ if (worker->perf_arch.devices[0].type == STARPU_CPU_WORKER && worker->perf_arch.devices[0].ncores == 1) { _STARPU_DEBUG("worker %d is part of it\n", worker->workerid); /* Add it to the combined worker */ cpu_workers[(*n)++] = worker->workerid; } } } static void synthesize_intermediate_workers(hwloc_obj_t *children, unsigned min, unsigned max, unsigned arity, unsigned n, unsigned synthesize_arity) { unsigned nworkers, i, j; unsigned chunk_size = (n + synthesize_arity-1) / synthesize_arity; unsigned chunk_start; int cpu_workers[STARPU_NMAXWORKERS]; int ret; if (n <= synthesize_arity) /* Not too many children, do not synthesize */ return; _STARPU_DEBUG("%u children > %u, synthesizing intermediate combined workers of size %u\n", n, synthesize_arity, chunk_size); n = 0; j = 0; nworkers = 0; chunk_start = 0; for (i = 0 ; i < arity; i++) { if (((struct _starpu_hwloc_userdata*)children[i]->userdata)->worker_list) { n++; _STARPU_DEBUG("child %u\n", i); find_workers(children[i], cpu_workers, &nworkers); j++; } /* Completed a chunk, or last bit (but not if it's just 1 subobject) */ if (j == chunk_size || (i == arity-1 && j > 1)) { if (nworkers >= min && nworkers <= max) { unsigned sched_ctx_id = starpu_sched_ctx_get_context(); if(sched_ctx_id == STARPU_NMAX_SCHED_CTXS) sched_ctx_id = 0; struct starpu_worker_collection* workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); _STARPU_DEBUG("Adding it\n"); ret = starpu_combined_worker_assign_workerid(nworkers, cpu_workers); STARPU_ASSERT(ret >= 0); workers->add(workers,ret); } /* Recurse there */ synthesize_intermediate_workers(children+chunk_start, min, max, i - chunk_start, n, synthesize_arity); /* And restart another one */ n = 0; j = 0; nworkers = 0; chunk_start = i+1; } } } static void find_and_assign_combinations(hwloc_obj_t obj, unsigned min, unsigned max, unsigned synthesize_arity) { char name[64]; unsigned i, n, nworkers; int cpu_workers[STARPU_NMAXWORKERS]; #if HWLOC_API_VERSION >= 0x10000 hwloc_obj_attr_snprintf(name, sizeof(name), obj, "#", 0); #else hwloc_obj_snprintf(name, sizeof(name), _starpu_get_machine_config()->topology.hwtopology, obj, "#", 0); #endif _STARPU_DEBUG("Looking at %s\n", name); for (n = 0, i = 0; i < obj->arity; i++) if (((struct _starpu_hwloc_userdata *)obj->children[i]->userdata)->worker_list) /* it has a CPU worker */ n++; if (n == 1) { /* If there is only one child, we go to the next level right away */ find_and_assign_combinations(obj->children[0], min, max, synthesize_arity); return; } /* Add this object */ nworkers = 0; find_workers(obj, cpu_workers, &nworkers); if (nworkers >= min && nworkers <= max) { _STARPU_DEBUG("Adding it\n"); unsigned sched_ctx_id = starpu_sched_ctx_get_context(); if(sched_ctx_id == STARPU_NMAX_SCHED_CTXS) sched_ctx_id = 0; struct starpu_worker_collection* workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); int newworkerid = starpu_combined_worker_assign_workerid(nworkers, cpu_workers); STARPU_ASSERT(newworkerid >= 0); workers->add(workers,newworkerid); } /* Add artificial intermediate objects recursively */ synthesize_intermediate_workers(obj->children, min, max, obj->arity, n, synthesize_arity); /* And recurse */ for (i = 0; i < obj->arity; i++) if (((struct _starpu_hwloc_userdata*) obj->children[i]->userdata)->worker_list == (void*) -1) find_and_assign_combinations(obj->children[i], min, max, synthesize_arity); } static void find_and_assign_combinations_with_hwloc(int *workerids, int nworkers) { struct _starpu_machine_config *config = _starpu_get_machine_config(); struct _starpu_machine_topology *topology = &config->topology; int synthesize_arity = starpu_get_env_number("STARPU_SYNTHESIZE_ARITY_COMBINED_WORKER"); int min = starpu_get_env_number("STARPU_MIN_WORKERSIZE"); if (min < 2) min = 2; int max = starpu_get_env_number("STARPU_MAX_WORKERSIZE"); if (max == -1) max = INT_MAX; if (synthesize_arity == -1) synthesize_arity = 2; /* First, mark nodes which contain CPU workers, simply by setting their userdata field */ int i; for (i = 0; i < nworkers; i++) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerids[i]); if (worker->perf_arch.devices[0].type == STARPU_CPU_WORKER && worker->perf_arch.devices[0].ncores == 1) { hwloc_obj_t obj = hwloc_get_obj_by_depth(topology->hwtopology, config->pu_depth, worker->bindid); obj = obj->parent; while (obj) { ((struct _starpu_hwloc_userdata*) obj->userdata)->worker_list = (void*) -1; obj = obj->parent; } } } find_and_assign_combinations(hwloc_get_root_obj(topology->hwtopology), min, max, synthesize_arity); } #else /* STARPU_HAVE_HWLOC */ static void assign_combinations_without_hwloc(struct starpu_worker_collection* worker_collection, int* workers, unsigned n, int min, int max) { int size,i,count =0; //if the maximun number of worker is already reached if(worker_collection->nworkers >= STARPU_NMAXWORKERS - 1) return; for (size = min; size <= max; size *= 2) { unsigned first; for (first = 0; first < n; first += size) { if (first + size <= n) { int found_workerids[size]; for (i = 0; i < size; i++) found_workerids[i] = workers[first + i]; /* We register this combination */ int newworkerid; newworkerid = starpu_combined_worker_assign_workerid(size, found_workerids); STARPU_ASSERT(newworkerid >= 0); count++; worker_collection->add(worker_collection, newworkerid); //if the maximun number of worker is reached, then return if(worker_collection->nworkers >= STARPU_NMAXWORKERS - 1) return; } } } } static void find_and_assign_combinations_without_hwloc(int *workerids, int nworkers) { int i; unsigned sched_ctx_id = starpu_sched_ctx_get_context(); if(sched_ctx_id == STARPU_NMAX_SCHED_CTXS) sched_ctx_id = 0; int min, max; #ifdef STARPU_USE_MIC unsigned j; int mic_min, mic_max; #endif struct starpu_worker_collection* workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); /* We put the id of all CPU workers in this array */ int cpu_workers[STARPU_NMAXWORKERS]; unsigned ncpus = 0; #ifdef STARPU_USE_MIC unsigned nb_mics = _starpu_get_machine_config()->topology.nmicdevices; unsigned * nmics_table; int * mic_id; int ** mic_workers; _STARPU_MALLOC(mic_id, sizeof(int)*nb_mics); _STARPU_MALLOC(nmics_table, sizeof(unsigned)*nb_mics); _STARPU_MALLOC(mic_workers, sizeof(int*)*nb_mics); for(j=0; jarch == STARPU_CPU_WORKER) cpu_workers[ncpus++] = i; #ifdef STARPU_USE_MIC else if(worker->arch == STARPU_MIC_WORKER) { for(j=0; jdevid && mic_id[j] != -1; j++); if(jdevid; } mic_workers[j][nmics_table[j]++] = i; } } #endif /* STARPU_USE_MIC */ } min = starpu_get_env_number("STARPU_MIN_WORKERSIZE"); if (min < 2) min = 2; max = starpu_get_env_number("STARPU_MAX_WORKERSIZE"); if (max == -1 || max > (int) ncpus) max = ncpus; assign_combinations_without_hwloc(workers,cpu_workers,ncpus,min,max); #ifdef STARPU_USE_MIC mic_min = starpu_get_env_number("STARPU_MIN_WORKERSIZE"); mic_max = starpu_get_env_number("STARPU_MAX_WORKERSIZE"); if (mic_min < 2) mic_min = 2; for(j=0; j (int) nmics_table[j]) _mic_max = nmics_table[j]; assign_combinations_without_hwloc(workers,mic_workers[j],nmics_table[j],mic_min,_mic_max); free(mic_workers[j]); } free(mic_id); free(nmics_table); free(mic_workers); #endif /* STARPU_USE_MIC */ } #endif /* STARPU_HAVE_HWLOC */ static void combine_all_cpu_workers(int *workerids, int nworkers) { unsigned sched_ctx_id = starpu_sched_ctx_get_context(); if(sched_ctx_id == STARPU_NMAX_SCHED_CTXS) sched_ctx_id = 0; struct starpu_worker_collection* workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); int cpu_workers[STARPU_NMAXWORKERS]; int ncpus = 0; int i; int min; int max; for (i = 0; i < nworkers; i++) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerids[i]); if (worker->arch == STARPU_CPU_WORKER) cpu_workers[ncpus++] = workerids[i]; } min = starpu_get_env_number("STARPU_MIN_WORKERSIZE"); if (min < 1) min = 1; max = starpu_get_env_number("STARPU_MAX_WORKERSIZE"); if (max == -1 || max > ncpus) max = ncpus; for (i = min; i <= max; i++) { int newworkerid = starpu_combined_worker_assign_workerid(i, cpu_workers); STARPU_ASSERT(newworkerid >= 0); workers->add(workers, newworkerid); } } void _starpu_sched_find_worker_combinations(int *workerids, int nworkers) { struct _starpu_machine_config *config = _starpu_get_machine_config(); if (config->conf.single_combined_worker > 0) combine_all_cpu_workers(workerids, nworkers); else { #ifdef STARPU_HAVE_HWLOC find_and_assign_combinations_with_hwloc(workerids, nworkers); #else find_and_assign_combinations_without_hwloc(workerids, nworkers); #endif } } starpu-1.2.3+dfsg/src/core/detect_combined_workers.h000066400000000000000000000013741320135501600225270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include /* Initialize combined workers */ void _starpu_sched_find_worker_combinations(int *workerids, int nworkers); starpu-1.2.3+dfsg/src/core/disk.c000066400000000000000000000306741320135501600165750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Corentin Salingue * Copyright (C) 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include struct disk_register { unsigned node; void *base; struct starpu_disk_ops *functions; /* disk condition (1 = all authorizations, */ int flag; }; static void add_disk_in_list(unsigned node, struct starpu_disk_ops *func, void *base); static int get_location_with_node(unsigned node); static struct disk_register **disk_register_list = NULL; static int disk_number = -1; static int size_register_list = 2; int starpu_disk_swap_node = -1; int starpu_disk_register(struct starpu_disk_ops *func, void *parameter, starpu_ssize_t size) { STARPU_ASSERT_MSG(size < 0 || size >= STARPU_DISK_SIZE_MIN, "Minimum disk size is %d Bytes ! (Here %d) \n", (int) STARPU_DISK_SIZE_MIN, (int) size); /* register disk */ unsigned memory_node = _starpu_memory_node_register(STARPU_DISK_RAM, 0); _starpu_register_bus(STARPU_MAIN_RAM, memory_node); _starpu_register_bus(memory_node, STARPU_MAIN_RAM); /* connect disk */ void *base = func->plug(parameter, size); /* remember it */ add_disk_in_list(memory_node,func,base); int ret = func->bandwidth(memory_node, base); /* have a problem with the disk */ if (ret == 0) return -ENOENT; if (size >= 0) _starpu_memory_manager_set_global_memory_size(memory_node, size); return memory_node; } void _starpu_disk_unregister(void) { int i; /* search disk and delete it */ for (i = 0; i <= disk_number; ++i) { _starpu_set_disk_flag(disk_register_list[i]->node, STARPU_DISK_NO_RECLAIM); _starpu_free_all_automatically_allocated_buffers(disk_register_list[i]->node); /* don't forget to unplug */ disk_register_list[i]->functions->unplug(disk_register_list[i]->base); free(disk_register_list[i]); } /* no disk in the list -> delete the list */ disk_number--; if (disk_register_list != NULL && disk_number == -1) { free(disk_register_list); disk_register_list = NULL; } } /* interface between user and disk memory */ void *_starpu_disk_alloc(unsigned node, size_t size) { int pos = get_location_with_node(node); return disk_register_list[pos]->functions->alloc(disk_register_list[pos]->base, size); } void _starpu_disk_free(unsigned node, void *obj, size_t size) { int pos = get_location_with_node(node); disk_register_list[pos]->functions->free(disk_register_list[pos]->base, obj, size); } /* src_node == disk node and dst_node == STARPU_MAIN_RAM */ int _starpu_disk_read(unsigned src_node, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, void *obj, void *buf, off_t offset, size_t size, struct _starpu_async_channel *channel) { int pos = get_location_with_node(src_node); if (channel != NULL) { if (disk_register_list[pos]->functions->async_read == NULL) channel = NULL; else { channel->type = STARPU_DISK_RAM; channel->event.disk_event.memory_node = src_node; _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); channel->event.disk_event.backend_event = disk_register_list[pos]->functions->async_read(disk_register_list[pos]->base, obj, buf, offset, size); _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); } } /* asynchronous request failed or synchronous request is asked */ if (channel == NULL || !channel->event.disk_event.backend_event) { disk_register_list[pos]->functions->read(disk_register_list[pos]->base, obj, buf, offset, size); return 0; } return -EAGAIN; } /* src_node == STARPU_MAIN_RAM and dst_node == disk node */ int _starpu_disk_write(unsigned src_node STARPU_ATTRIBUTE_UNUSED, unsigned dst_node, void *obj, void *buf, off_t offset, size_t size, struct _starpu_async_channel *channel) { int pos = get_location_with_node(dst_node); if (channel != NULL) { if (disk_register_list[pos]->functions->async_write == NULL) channel = NULL; else { channel->type = STARPU_DISK_RAM; channel->event.disk_event.memory_node = dst_node; _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); channel->event.disk_event.backend_event = disk_register_list[pos]->functions->async_write(disk_register_list[pos]->base, obj, buf, offset, size); _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); } } /* asynchronous request failed or synchronous request is asked */ if (channel == NULL || !channel->event.disk_event.backend_event) { disk_register_list[pos]->functions->write(disk_register_list[pos]->base, obj, buf, offset, size); return 0; } return -EAGAIN; } int _starpu_disk_copy(unsigned node_src, void *obj_src, off_t offset_src, unsigned node_dst, void *obj_dst, off_t offset_dst, size_t size, struct _starpu_async_channel *channel) { int pos_src = get_location_with_node(node_src); int pos_dst = get_location_with_node(node_dst); /* both nodes have same copy function */ channel->event.disk_event.memory_node = node_src; channel->event.disk_event.backend_event = disk_register_list[pos_src]->functions->copy(disk_register_list[pos_src]->base, obj_src, offset_src, disk_register_list[pos_dst]->base, obj_dst, offset_dst, size); STARPU_ASSERT(channel->event.disk_event.backend_event); return -EAGAIN; } int _starpu_disk_full_read(unsigned src_node, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, void *obj, void **ptr, size_t *size, struct _starpu_async_channel *channel) { int pos = get_location_with_node(src_node); if (channel != NULL) { if (disk_register_list[pos]->functions->async_full_read == NULL) channel = NULL; else { channel->type = STARPU_DISK_RAM; channel->event.disk_event.memory_node = src_node; _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); channel->event.disk_event.backend_event = disk_register_list[pos]->functions->async_full_read(disk_register_list[pos]->base, obj, ptr, size); _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); } } /* asynchronous request failed or synchronous request is asked */ if (channel == NULL || !channel->event.disk_event.backend_event) { disk_register_list[pos]->functions->full_read(disk_register_list[pos]->base, obj, ptr, size); return 0; } return -EAGAIN; } int _starpu_disk_full_write(unsigned src_node STARPU_ATTRIBUTE_UNUSED, unsigned dst_node, void *obj, void *ptr, size_t size, struct _starpu_async_channel *channel) { int pos = get_location_with_node(dst_node); if (channel != NULL) { if (disk_register_list[pos]->functions->async_full_write == NULL) channel = NULL; else { channel->type = STARPU_DISK_RAM; channel->event.disk_event.memory_node = dst_node; _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); channel->event.disk_event.backend_event = disk_register_list[pos]->functions->async_full_write(disk_register_list[pos]->base, obj, ptr, size); _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); } } /* asynchronous request failed or synchronous request is asked */ if (channel == NULL || !channel->event.disk_event.backend_event) { disk_register_list[pos]->functions->full_write(disk_register_list[pos]->base, obj, ptr, size); return 0; } return -EAGAIN; } void *starpu_disk_open(unsigned node, void *pos, size_t size) { int position = get_location_with_node(node); return disk_register_list[position]->functions->open(disk_register_list[position]->base, pos, size); } void starpu_disk_close(unsigned node, void *obj, size_t size) { int position = get_location_with_node(node); disk_register_list[position]->functions->close(disk_register_list[position]->base, obj, size); } void starpu_disk_wait_request(struct _starpu_async_channel *async_channel) { int position = get_location_with_node(async_channel->event.disk_event.memory_node); disk_register_list[position]->functions->wait_request(async_channel->event.disk_event.backend_event); } int starpu_disk_test_request(struct _starpu_async_channel *async_channel) { int position = get_location_with_node(async_channel->event.disk_event.memory_node); return disk_register_list[position]->functions->test_request(async_channel->event.disk_event.backend_event); } void starpu_disk_free_request(struct _starpu_async_channel *async_channel) { int position = get_location_with_node(async_channel->event.disk_event.memory_node); if (async_channel->event.disk_event.backend_event) disk_register_list[position]->functions->free_request(async_channel->event.disk_event.backend_event); } static void add_disk_in_list(unsigned node, struct starpu_disk_ops *func, void *base) { /* initialization */ if (disk_register_list == NULL) { _STARPU_MALLOC(disk_register_list, size_register_list*sizeof(struct disk_register *)); } /* small size -> new size */ if ((disk_number+1) > size_register_list) { _STARPU_REALLOC(disk_register_list, 2*size_register_list*sizeof(struct disk_register *)); size_register_list *= 2; } struct disk_register *dr; _STARPU_MALLOC(dr, sizeof(struct disk_register)); dr->node = node; dr->base = base; dr->flag = STARPU_DISK_ALL; dr->functions = func; disk_register_list[++disk_number] = dr; } static int get_location_with_node(unsigned node) { #ifdef STARPU_DEVEL #warning optimize with a MAXNODE array #endif int i; for (i = 0; i <= disk_number; ++i) if (disk_register_list[i]->node == node) return i; STARPU_ASSERT_MSG(false, "Disk node not found !(%u) ", node); return -1; } int _starpu_is_same_kind_disk(unsigned node1, unsigned node2) { if (starpu_node_get_kind(node1) == STARPU_DISK_RAM && starpu_node_get_kind(node2) == STARPU_DISK_RAM) { int pos1 = get_location_with_node(node1); int pos2 = get_location_with_node(node2); if (disk_register_list[pos1]->functions == disk_register_list[pos2]->functions) /* they must have a copy function */ if (disk_register_list[pos1]->functions->copy != NULL) return 1; } return 0; } void _starpu_set_disk_flag(unsigned node, int flag) { int pos = get_location_with_node(node); disk_register_list[pos]->flag = flag; } int _starpu_get_disk_flag(unsigned node) { int pos = get_location_with_node(node); return disk_register_list[pos]->flag; } void _starpu_swap_init(void) { char *backend; char *path; starpu_ssize_t size; struct starpu_disk_ops *ops; path = starpu_getenv("STARPU_DISK_SWAP"); if (!path) return; backend = starpu_getenv("STARPU_DISK_SWAP_BACKEND"); if (!backend) { _starpu_mkpath(path, S_IRWXU); ops = &starpu_disk_unistd_ops; } else if (!strcmp(backend, "stdio")) { _starpu_mkpath(path, S_IRWXU); ops = &starpu_disk_stdio_ops; } else if (!strcmp(backend, "unistd")) { _starpu_mkpath(path, S_IRWXU); ops = &starpu_disk_unistd_ops; } else if (!strcmp(backend, "unistd_o_direct")) { #ifdef STARPU_LINUX_SYS _starpu_mkpath(path, S_IRWXU); ops = &starpu_disk_unistd_o_direct_ops; #else _STARPU_DISP("Warning: o_direct support is not compiled in, could not enable disk swap"); return; #endif } else if (!strcmp(backend, "leveldb")) { #ifdef STARPU_HAVE_LEVELDB ops = &starpu_disk_leveldb_ops; #else _STARPU_DISP("Warning: leveldb support is not compiled in, could not enable disk swap"); return; #endif } else { _STARPU_DISP("Warning: unknown disk swap backend %s, could not enable disk swap", backend); return; } size = starpu_get_env_number_default("STARPU_DISK_SWAP_SIZE", -1); starpu_disk_swap_node = starpu_disk_register(ops, path, ((size_t) size) << 20); if (starpu_disk_swap_node < 0) { _STARPU_DISP("Warning: could not enable disk swap %s on %s with size %ld, could not enable disk swap", backend, path, (long) size); return; } } starpu-1.2.3+dfsg/src/core/disk.h000066400000000000000000000051451320135501600165750ustar00rootroot00000000000000 /* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Corentin Salingue * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DISK_H__ #define __DISK_H__ #define STARPU_DISK_ALL 1 #define STARPU_DISK_NO_RECLAIM 2 #ifdef __cplusplus extern "C" { #endif #include /* interface to manipulate memory disk */ void * _starpu_disk_alloc (unsigned node, size_t size) STARPU_ATTRIBUTE_MALLOC; void _starpu_disk_free (unsigned node, void *obj, size_t size); /* src_node is a disk node, dst_node is for the moment the STARPU_MAIN_RAM */ int _starpu_disk_read(unsigned src_node, unsigned dst_node, void *obj, void *buf, off_t offset, size_t size, struct _starpu_async_channel * async_channel); /* src_node is for the moment the STARU_MAIN_RAM, dst_node is a disk node */ int _starpu_disk_write(unsigned src_node, unsigned dst_node, void *obj, void *buf, off_t offset, size_t size, struct _starpu_async_channel * async_channel); int _starpu_disk_full_read(unsigned src_node, unsigned dst_node, void * obj, void ** ptr, size_t * size, struct _starpu_async_channel * async_channel); int _starpu_disk_full_write(unsigned src_node, unsigned dst_node, void * obj, void * ptr, size_t size, struct _starpu_async_channel * async_channel); int _starpu_disk_copy(unsigned node_src, void* obj_src, off_t offset_src, unsigned node_dst, void* obj_dst, off_t offset_dst, size_t size, struct _starpu_async_channel * async_channel); /* force the request to compute */ void starpu_disk_wait_request(struct _starpu_async_channel *async_channel); /* return 1 if the request is finished, 0 if not finished */ int starpu_disk_test_request(struct _starpu_async_channel *async_channel); void starpu_disk_free_request(struct _starpu_async_channel *async_channel); /* interface to compare memory disk */ int _starpu_is_same_kind_disk(unsigned node1, unsigned node2); /* change disk flag */ void _starpu_set_disk_flag(unsigned node, int flag); int _starpu_get_disk_flag(unsigned node); /* unregister disk */ void _starpu_disk_unregister(void); void _starpu_swap_init(void); #ifdef __cplusplus } #endif #endif /* __DISK_H__ */ starpu-1.2.3+dfsg/src/core/disk_ops/000077500000000000000000000000001320135501600173005ustar00rootroot00000000000000starpu-1.2.3+dfsg/src/core/disk_ops/disk_leveldb.cpp000066400000000000000000000236101320135501600224350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Corentin Salingue * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include #define NITER _starpu_calibration_minimum /* ------------------- use leveldb to write on disk ------------------- */ struct starpu_leveldb_obj { char * key; size_t size; starpu_pthread_mutex_t mutex; }; struct starpu_leveldb_base { char *path; leveldb::DB* db; /* if StarPU creates the leveldb */ bool created; }; /* allocation memory on disk */ static void *starpu_leveldb_alloc(void *base, size_t size STARPU_ATTRIBUTE_UNUSED) { struct starpu_leveldb_base *base_tmp = (struct starpu_leveldb_base *) base; struct starpu_leveldb_obj *obj = (struct starpu_leveldb_obj *) malloc(sizeof(struct starpu_leveldb_obj)); STARPU_ASSERT(obj != NULL); STARPU_PTHREAD_MUTEX_INIT(&obj->mutex, NULL); size_t len = 6 + 1 + 2+sizeof(void*)*2 + 1; char *key = (char *) malloc(len*sizeof(char)); snprintf(key, len, "STARPU-%p", obj); /* create and add a key with a small memory */ leveldb::Status s = base_tmp->db->Put(leveldb::WriteOptions(), key, "a"); STARPU_ASSERT(s.ok()); /* obj->size is the real size in the disk */ obj->key = key; obj->size = sizeof(char); return (void *) obj; } /* free memory on disk */ static void starpu_leveldb_free(void *base , void *obj, size_t size STARPU_ATTRIBUTE_UNUSED) { struct starpu_leveldb_obj *tmp = (struct starpu_leveldb_obj *) obj; struct starpu_leveldb_base *base_tmp = (struct starpu_leveldb_base *) base; base_tmp->db->Delete(leveldb::WriteOptions(), tmp->key); STARPU_PTHREAD_MUTEX_DESTROY(&tmp->mutex); free(tmp->key); free(tmp); } /* open an existing memory on disk */ static void *starpu_leveldb_open(void *base STARPU_ATTRIBUTE_UNUSED, void *pos, size_t size) { struct starpu_leveldb_obj *obj = (struct starpu_leveldb_obj *) malloc(sizeof(struct starpu_leveldb_obj)); STARPU_ASSERT(obj != NULL); STARPU_PTHREAD_MUTEX_INIT(&obj->mutex, NULL); obj->key = strdup((char*) pos); obj->size = size; return (void *) obj; } /* free memory without delete it */ static void starpu_leveldb_close(void *base STARPU_ATTRIBUTE_UNUSED, void *obj, size_t size STARPU_ATTRIBUTE_UNUSED) { struct starpu_leveldb_obj *tmp = (struct starpu_leveldb_obj *) obj; STARPU_PTHREAD_MUTEX_DESTROY(&tmp->mutex); free(tmp->key); free(tmp); } /* in the leveldb, we are obliged to read and to write the entire data * so, we have to use buffers to have offset and size options */ static int starpu_leveldb_read(void *base, void *obj, void *buf, off_t offset, size_t size) { struct starpu_leveldb_obj *tmp = (struct starpu_leveldb_obj *) obj; struct starpu_leveldb_base *base_tmp = (struct starpu_leveldb_base *) base; STARPU_PTHREAD_MUTEX_LOCK(&tmp->mutex); /* leveldb need a string to store datas */ std::string value; leveldb::Status s = base_tmp->db->Get(leveldb::ReadOptions(), tmp->key, &value); uintptr_t value_read = (uintptr_t)(value.c_str()); /* use buffer */ if(s.ok()) memcpy(buf, (void *) (value_read+offset), size); else STARPU_ASSERT(s.ok()); STARPU_PTHREAD_MUTEX_UNLOCK(&tmp->mutex); return 0; } static int starpu_leveldb_full_read(void *base, void *obj, void **ptr, size_t *size) { struct starpu_leveldb_obj *tmp = (struct starpu_leveldb_obj *) obj; struct starpu_leveldb_base *base_tmp = (struct starpu_leveldb_base *) base; STARPU_PTHREAD_MUTEX_LOCK(&tmp->mutex); /* leveldb need a string to store datas */ std::string value; leveldb::Status s = base_tmp->db->Get(leveldb::ReadOptions(), tmp->key, &value); STARPU_ASSERT(s.ok()); *size = value.length(); *ptr = malloc(*size); /* use buffer */ memcpy(*ptr, value.c_str(), *size); STARPU_PTHREAD_MUTEX_UNLOCK(&tmp->mutex); return 0; } /* write on the memory disk */ static int starpu_leveldb_write(void *base, void *obj, const void *buf, off_t offset, size_t size) { struct starpu_leveldb_obj *tmp = (struct starpu_leveldb_obj *) obj; struct starpu_leveldb_base *base_tmp = (struct starpu_leveldb_base *) base; void *buffer; leveldb::Status s; STARPU_PTHREAD_MUTEX_LOCK(&tmp->mutex); if (offset == 0 && size >= tmp->size) { /* We overwrite everything, no need to get the old value */ buffer = (void*) buf; } else { uintptr_t buf_tmp = (uintptr_t) buf; buffer = (void *) malloc((tmp->size > (offset + size)) ? tmp->size : (offset + size)); /* we read the data */ std::string value; s = base_tmp->db->Get(leveldb::ReadOptions(), tmp->key, &value); uintptr_t value_read = (uintptr_t)(value.c_str()); STARPU_ASSERT(s.ok()); memcpy(buffer, (void *) value_read, tmp->size); /* put the new data on their new place */ memcpy((void *) ((uintptr_t) buffer + offset), (void *) buf_tmp, size); } /* and write them */ s = base_tmp->db->Put(leveldb::WriteOptions(), tmp->key, (char *)buffer); STARPU_ASSERT(s.ok()); /* if the new size is higher than the old, we update it - first write after the alloc */ tmp->size = (tmp->size > size) ? tmp->size : size; if (buffer != buf) free(buffer); STARPU_PTHREAD_MUTEX_UNLOCK(&tmp->mutex); return 0; } static int starpu_leveldb_full_write(void *base, void *obj, void *ptr, size_t size) { struct starpu_leveldb_obj *tmp = (struct starpu_leveldb_obj *) obj; struct starpu_leveldb_base *base_tmp = (struct starpu_leveldb_base *) base; /* update file size to achieve correct writes */ tmp->size = size; leveldb::WriteOptions write_options; write_options.sync = true; leveldb::Status s = base_tmp->db->Put(write_options, tmp->key, (char *)ptr); STARPU_ASSERT(s.ok()); return 0; } /* create a new copy of parameter == base */ static void *starpu_leveldb_plug(void *parameter, starpu_ssize_t size STARPU_ATTRIBUTE_UNUSED) { struct starpu_leveldb_base *tmp = (struct starpu_leveldb_base *) malloc(sizeof(struct starpu_leveldb_base)); STARPU_ASSERT(tmp != NULL); leveldb::Status status; leveldb::DB *db; leveldb::Options options; options.create_if_missing = true; /* try to create the database */ options.error_if_exists = true; status = leveldb::DB::Open(options, (char *) parameter, &db); tmp->created = true; /* if it has already been created before */ if (!status.ok()) { options.error_if_exists = false; status = leveldb::DB::Open(options, (char *) parameter, &db); STARPU_ASSERT_MSG(status.ok(), "StarPU leveldb plug failed !"); tmp->created = false; } tmp->db = db; tmp->path = strdup((const char*) parameter); STARPU_ASSERT(status.ok()); return (void *) tmp; } /* free memory allocated for the base */ static void starpu_leveldb_unplug(void *base) { struct starpu_leveldb_base *base_tmp = (struct starpu_leveldb_base *) base; if(base_tmp->created) delete base_tmp->db; free(base_tmp->path); free(base); } static int get_leveldb_bandwidth_between_disk_and_main_ram(unsigned node, void *base) { unsigned iter; double timing_slowness, timing_latency; double start; double end; struct starpu_leveldb_base *base_tmp = (struct starpu_leveldb_base *) base; srand(time (NULL)); char *buf = (char *)malloc(STARPU_DISK_SIZE_MIN*sizeof(char)); STARPU_ASSERT(buf); /* allocate memory */ void *mem = _starpu_disk_alloc(node, STARPU_DISK_SIZE_MIN); /* fail to alloc */ if (mem == NULL) { free(buf); return 0; } /* Measure upload slowness */ start = starpu_timing_now(); for (iter = 0; iter < NITER; ++iter) { _starpu_disk_write(STARPU_MAIN_RAM, node, mem, buf, 0, STARPU_DISK_SIZE_MIN, NULL); } end = starpu_timing_now(); timing_slowness = end - start; /* free memory */ free(buf); buf = (char *) malloc(sizeof(char)); STARPU_ASSERT(buf != NULL); /* Measure latency */ start = starpu_timing_now(); for (iter = 0; iter < NITER; ++iter) { _starpu_disk_write(STARPU_MAIN_RAM, node, mem, buf, rand() % (STARPU_DISK_SIZE_MIN -1) , 1, NULL); } end = starpu_timing_now(); timing_latency = end - start; _starpu_disk_free(node, mem, STARPU_DISK_SIZE_MIN); free(buf); _starpu_save_bandwidth_and_latency_disk((NITER/timing_slowness)*STARPU_DISK_SIZE_MIN, (NITER/timing_slowness)*STARPU_DISK_SIZE_MIN, timing_latency/NITER, timing_latency/NITER, node, base_tmp->path); return 1; } #if __cplusplus >= 201103L struct starpu_disk_ops starpu_disk_leveldb_ops = { .plug = starpu_leveldb_plug, .unplug = starpu_leveldb_unplug, .bandwidth = get_leveldb_bandwidth_between_disk_and_main_ram, .alloc = starpu_leveldb_alloc, .free = starpu_leveldb_free, .open = starpu_leveldb_open, .close = starpu_leveldb_close, .read = starpu_leveldb_read, .write = starpu_leveldb_write, .full_read = starpu_leveldb_full_read, .full_write = starpu_leveldb_full_write, .async_write = NULL, .async_read = NULL, .async_full_read = NULL, .async_full_write = NULL, .copy = NULL, .wait_request = NULL, .test_request = NULL, .free_request = NULL }; #else struct starpu_disk_ops starpu_disk_leveldb_ops = { starpu_leveldb_plug, starpu_leveldb_unplug, get_leveldb_bandwidth_between_disk_and_main_ram, starpu_leveldb_alloc, starpu_leveldb_free, starpu_leveldb_open, starpu_leveldb_close, starpu_leveldb_read, starpu_leveldb_write, starpu_leveldb_full_read, starpu_leveldb_full_write, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; #endif starpu-1.2.3+dfsg/src/core/disk_ops/disk_stdio.c000066400000000000000000000243601320135501600216050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Corentin Salingue * Copyright (C) 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef STARPU_HAVE_WINDOWS # include #endif #define NITER _starpu_calibration_minimum #ifndef O_BINARY #define O_BINARY 0 #endif #define MAX_OPEN_FILES 64 #define TEMP_HIERARCHY_DEPTH 2 /* ------------------- use STDIO to write on disk ------------------- */ static unsigned starpu_stdio_opened_files; struct starpu_stdio_obj { int descriptor; FILE * file; char * path; size_t size; starpu_pthread_mutex_t mutex; }; static struct starpu_stdio_obj *_starpu_stdio_init(int descriptor, char *path, size_t size) { struct starpu_stdio_obj *obj = malloc(sizeof(struct starpu_stdio_obj)); STARPU_ASSERT(obj != NULL); FILE *f = fdopen(descriptor,"rb+"); if (f == NULL) { free(obj); return NULL; } STARPU_HG_DISABLE_CHECKING(starpu_stdio_opened_files); if (starpu_stdio_opened_files >= MAX_OPEN_FILES) { /* Too many opened files, avoid keeping this one opened */ fclose(f); f = NULL; descriptor = -1; } else (void) STARPU_ATOMIC_ADD(&starpu_stdio_opened_files, 1); STARPU_PTHREAD_MUTEX_INIT(&obj->mutex, NULL); obj->descriptor = descriptor; obj->file = f; obj->path = path; obj->size = size; return (void *) obj; } static FILE *_starpu_stdio_reopen(struct starpu_stdio_obj *obj) { int id = open(obj->path, O_RDWR); STARPU_ASSERT(id >= 0); FILE *f = fdopen(id,"rb+"); STARPU_ASSERT(f); return f; } static void _starpu_stdio_reclose(FILE *f) { fclose(f); } static void _starpu_stdio_close(struct starpu_stdio_obj *obj) { if (obj->descriptor < 0) return; if (starpu_stdio_opened_files < MAX_OPEN_FILES) (void) STARPU_ATOMIC_ADD(&starpu_stdio_opened_files, -1); fclose(obj->file); } static void _starpu_stdio_fini(struct starpu_stdio_obj *obj) { STARPU_PTHREAD_MUTEX_DESTROY(&obj->mutex); free(obj->path); free(obj); } /* allocation memory on disk */ static void *starpu_stdio_alloc(void *base, size_t size) { struct starpu_stdio_obj *obj; int id; char *baseCpy = _starpu_mktemp_many(base, TEMP_HIERARCHY_DEPTH, O_RDWR | O_BINARY, &id); /* fail */ if (!baseCpy) return NULL; int val = _starpu_ftruncate(id,size); /* fail */ if (val < 0) { _STARPU_DISP("Could not truncate file, ftruncate failed with error '%s'\n", strerror(errno)); close(id); unlink(baseCpy); free(baseCpy); return NULL; } obj = _starpu_stdio_init(id, baseCpy, size); if (!obj) { close(id); unlink(baseCpy); free(baseCpy); } return obj; } /* free memory on disk */ static void starpu_stdio_free(void *base STARPU_ATTRIBUTE_UNUSED, void *obj, size_t size STARPU_ATTRIBUTE_UNUSED) { struct starpu_stdio_obj *tmp = (struct starpu_stdio_obj *) obj; _starpu_stdio_close(tmp); unlink(tmp->path); _starpu_rmtemp_many(tmp->path, TEMP_HIERARCHY_DEPTH); _starpu_stdio_fini(tmp); } /* open an existing memory on disk */ static void *starpu_stdio_open(void *base, void *pos, size_t size) { struct starpu_stdio_obj *obj; /* create template */ char *baseCpy = malloc(strlen(base)+1+strlen(pos)+1); STARPU_ASSERT(baseCpy != NULL); snprintf(baseCpy, strlen(base)+1+strlen(pos)+1, "%s/%s", (char *)base, (char *)pos); int id = open(baseCpy, O_RDWR); if (id < 0) { free(baseCpy); return NULL; } obj = _starpu_stdio_init(id, baseCpy, size); if (!obj) free(baseCpy); return obj; } /* free memory without delete it */ static void starpu_stdio_close(void *base STARPU_ATTRIBUTE_UNUSED, void *obj, size_t size STARPU_ATTRIBUTE_UNUSED) { struct starpu_stdio_obj *tmp = (struct starpu_stdio_obj *) obj; _starpu_stdio_close(tmp); _starpu_stdio_fini(tmp); } /* read the memory disk */ static int starpu_stdio_read(void *base STARPU_ATTRIBUTE_UNUSED, void *obj, void *buf, off_t offset, size_t size) { struct starpu_stdio_obj *tmp = (struct starpu_stdio_obj *) obj; FILE *f = tmp->file; if (f) STARPU_PTHREAD_MUTEX_LOCK(&tmp->mutex); else f = _starpu_stdio_reopen(obj); int res = fseek(f, offset, SEEK_SET); STARPU_ASSERT_MSG(res == 0, "Stdio read failed"); starpu_ssize_t nb = fread(buf, 1, size, f); STARPU_ASSERT_MSG(nb >= 0, "Stdio read failed"); if (tmp->file) STARPU_PTHREAD_MUTEX_UNLOCK(&tmp->mutex); else _starpu_stdio_reclose(f); return 0; } static int starpu_stdio_full_read(void *base STARPU_ATTRIBUTE_UNUSED, void *obj, void **ptr, size_t *size) { struct starpu_stdio_obj *tmp = (struct starpu_stdio_obj *) obj; FILE *f = tmp->file; starpu_ssize_t ssize; if (f) STARPU_PTHREAD_MUTEX_LOCK(&tmp->mutex); else f = _starpu_stdio_reopen(obj); int res = fseek(f, 0, SEEK_END); STARPU_ASSERT_MSG(res == 0, "Stdio write failed"); ssize = ftell(f); STARPU_ASSERT_MSG(ssize >= 0, "Stdio write failed"); *size = ssize; if (tmp->file) STARPU_PTHREAD_MUTEX_UNLOCK(&tmp->mutex); /* Alloc aligned buffer */ starpu_malloc_flags(ptr, *size, 0); if (tmp->file) STARPU_PTHREAD_MUTEX_LOCK(&tmp->mutex); res = fseek(f, 0, SEEK_SET); STARPU_ASSERT_MSG(res == 0, "Stdio read failed"); starpu_ssize_t nb = fread(*ptr, 1, *size, f); STARPU_ASSERT_MSG(nb >= 0, "Stdio read failed"); if (tmp->file) STARPU_PTHREAD_MUTEX_UNLOCK(&tmp->mutex); else _starpu_stdio_reclose(f); return 0; } /* write on the memory disk */ static int starpu_stdio_write(void *base STARPU_ATTRIBUTE_UNUSED, void *obj, const void *buf, off_t offset, size_t size) { struct starpu_stdio_obj *tmp = (struct starpu_stdio_obj *) obj; FILE *f = tmp->file; if (f) STARPU_PTHREAD_MUTEX_LOCK(&tmp->mutex); else f = _starpu_stdio_reopen(obj); int res = fseek(f, offset, SEEK_SET); STARPU_ASSERT_MSG(res == 0, "Stdio write failed"); fwrite(buf, 1, size, f); if (tmp->file) STARPU_PTHREAD_MUTEX_UNLOCK(&tmp->mutex); else _starpu_stdio_reclose(f); return 0; } static int starpu_stdio_full_write(void *base STARPU_ATTRIBUTE_UNUSED, void *obj, void *ptr, size_t size) { struct starpu_stdio_obj *tmp = (struct starpu_stdio_obj *) obj; FILE *f = tmp->file; if (!f) f = _starpu_stdio_reopen(obj); /* update file size to realise the next good full_read */ if(size != tmp->size) { int val = _starpu_fftruncate(f,size); STARPU_ASSERT(val == 0); tmp->size = size; } int res = fseek(f, 0, SEEK_SET); STARPU_ASSERT_MSG(res == 0, "Stdio write failed"); fwrite(ptr, 1, size, f); if (!tmp->file) _starpu_stdio_reclose(f); return 0; } /* create a new copy of parameter == base */ static void *starpu_stdio_plug(void *parameter, starpu_ssize_t size STARPU_ATTRIBUTE_UNUSED) { char *tmp = strdup((char *) parameter); STARPU_ASSERT(tmp); { struct stat buf; if (!(stat(tmp, &buf) == 0 && S_ISDIR(buf.st_mode))) { _STARPU_ERROR("Directory '%s' does not exist\n", tmp); } } return (void *) tmp; } /* free memory allocated for the base */ static void starpu_stdio_unplug(void *base) { free(base); } static int get_stdio_bandwidth_between_disk_and_main_ram(unsigned node, void *base) { unsigned iter; double timing_slowness, timing_latency; double start; double end; char *buf; srand(time(NULL)); starpu_malloc_flags((void **) &buf, STARPU_DISK_SIZE_MIN, 0); STARPU_ASSERT(buf != NULL); /* allocate memory */ void *mem = _starpu_disk_alloc(node, STARPU_DISK_SIZE_MIN); /* fail to alloc */ if (mem == NULL) return 0; struct starpu_stdio_obj *tmp = (struct starpu_stdio_obj *) mem; memset(buf, 0, STARPU_DISK_SIZE_MIN); /* Measure upload slowness */ start = starpu_timing_now(); for (iter = 0; iter < NITER; ++iter) { FILE *f = tmp->file; _starpu_disk_write(STARPU_MAIN_RAM, node, mem, buf, 0, STARPU_DISK_SIZE_MIN, NULL); if (!f) f = _starpu_stdio_reopen(tmp); /* clean cache memory */ int res = fflush(f); STARPU_ASSERT_MSG(res == 0, "Slowness computation failed \n"); #ifdef STARPU_HAVE_WINDOWS res = _commit(fileno(f)); #else res = fsync(fileno(f)); #endif STARPU_ASSERT_MSG(res == 0, "Slowness computation failed \n"); if (!tmp->file) _starpu_stdio_reclose(f); } end = starpu_timing_now(); timing_slowness = end - start; /* free memory */ starpu_free_flags(buf, STARPU_DISK_SIZE_MIN, 0); starpu_malloc_flags((void**) &buf, sizeof(char), 0); STARPU_ASSERT(buf != NULL); *buf = 0; /* Measure latency */ start = starpu_timing_now(); for (iter = 0; iter < NITER; ++iter) { FILE *f = tmp->file; _starpu_disk_write(STARPU_MAIN_RAM, node, mem, buf, rand() % (STARPU_DISK_SIZE_MIN -1) , 1, NULL); if (!f) f = _starpu_stdio_reopen(tmp); int res = fflush(f); STARPU_ASSERT_MSG(res == 0, "Latency computation failed"); #ifdef STARPU_HAVE_WINDOWS res = _commit(fileno(f)); #else res = fsync(fileno(f)); #endif STARPU_ASSERT_MSG(res == 0, "Latency computation failed"); if (!tmp->file) _starpu_stdio_reclose(f); } end = starpu_timing_now(); timing_latency = end - start; _starpu_disk_free(node, mem, STARPU_DISK_SIZE_MIN); starpu_free_flags(buf, sizeof(char), 0); _starpu_save_bandwidth_and_latency_disk((NITER/timing_slowness)*STARPU_DISK_SIZE_MIN, (NITER/timing_slowness)*STARPU_DISK_SIZE_MIN, timing_latency/NITER, timing_latency/NITER, node, base); return 1; } struct starpu_disk_ops starpu_disk_stdio_ops = { .alloc = starpu_stdio_alloc, .free = starpu_stdio_free, .open = starpu_stdio_open, .close = starpu_stdio_close, .read = starpu_stdio_read, .write = starpu_stdio_write, .plug = starpu_stdio_plug, .unplug = starpu_stdio_unplug, .copy = NULL, .bandwidth = get_stdio_bandwidth_between_disk_and_main_ram, .full_read = starpu_stdio_full_read, .full_write = starpu_stdio_full_write }; starpu-1.2.3+dfsg/src/core/disk_ops/disk_unistd.c000066400000000000000000000050151320135501600217650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Corentin Salingue * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include /* ------------------- use UNISTD to write on disk ------------------- */ /* allocation memory on disk */ static void *starpu_unistd_alloc(void *base, size_t size) { struct starpu_unistd_global_obj *obj = malloc(sizeof(struct starpu_unistd_global_obj)); STARPU_ASSERT(obj != NULL); /* only flags change between unistd and unistd_o_direct */ obj->flags = O_RDWR | O_BINARY; return starpu_unistd_global_alloc(obj, base, size); } /* open an existing memory on disk */ static void *starpu_unistd_open(void *base, void *pos, size_t size) { struct starpu_unistd_global_obj *obj = malloc(sizeof(struct starpu_unistd_global_obj)); STARPU_ASSERT(obj != NULL); /* only flags change between unistd and unistd_o_direct */ obj->flags = O_RDWR | O_BINARY; return starpu_unistd_global_open(obj, base, pos, size); } struct starpu_disk_ops starpu_disk_unistd_ops = { .alloc = starpu_unistd_alloc, .free = starpu_unistd_global_free, .open = starpu_unistd_open, .close = starpu_unistd_global_close, .read = starpu_unistd_global_read, .write = starpu_unistd_global_write, .plug = starpu_unistd_global_plug, .unplug = starpu_unistd_global_unplug, .copy = NULL, .bandwidth = get_unistd_global_bandwidth_between_disk_and_main_ram, #ifdef HAVE_AIO_H .async_read = starpu_unistd_global_async_read, .async_write = starpu_unistd_global_async_write, .wait_request = starpu_unistd_global_wait_request, .test_request = starpu_unistd_global_test_request, .free_request = starpu_unistd_global_free_request, #endif .full_read = starpu_unistd_global_full_read, .full_write = starpu_unistd_global_full_write }; starpu-1.2.3+dfsg/src/core/disk_ops/disk_unistd_o_direct.c000066400000000000000000000120201320135501600236270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Corentin Salingue * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include /* ------------------- use UNISTD to write on disk ------------------- */ /* allocation memory on disk */ static void *starpu_unistd_o_direct_alloc(void *base, size_t size) { struct starpu_unistd_global_obj *obj = malloc(sizeof(struct starpu_unistd_global_obj)); STARPU_ASSERT(obj != NULL); /* only flags change between unistd and unistd_o_direct */ obj->flags = O_RDWR | O_DIRECT | O_BINARY; return starpu_unistd_global_alloc (obj, base, size); } /* open an existing memory on disk */ static void *starpu_unistd_o_direct_open(void *base, void *pos, size_t size) { struct starpu_unistd_global_obj * obj = malloc(sizeof(struct starpu_unistd_global_obj)); STARPU_ASSERT(obj != NULL); /* only flags change between unistd and unistd_o_direct */ obj->flags = O_RDWR | O_DIRECT | O_BINARY; return starpu_unistd_global_open (obj, base, pos, size); } /* read the memory disk */ static int starpu_unistd_o_direct_read(void *base, void *obj, void *buf, off_t offset, size_t size) { STARPU_ASSERT_MSG((size % getpagesize()) == 0, "You can only read a multiple of page size %u Bytes (Here %d)", getpagesize(), (int) size); STARPU_ASSERT_MSG((((uintptr_t) buf) % getpagesize()) == 0, "You have to use starpu_malloc function"); return starpu_unistd_global_read (base, obj, buf, offset, size); } /* write on the memory disk */ static int starpu_unistd_o_direct_write(void *base, void *obj, const void *buf, off_t offset, size_t size) { STARPU_ASSERT_MSG((size % getpagesize()) == 0, "You can only write a multiple of page size %u Bytes (Here %d)", getpagesize(), (int) size); STARPU_ASSERT_MSG((((uintptr_t)buf) % getpagesize()) == 0, "You have to use starpu_malloc function"); return starpu_unistd_global_write (base, obj, buf, offset, size); } /* create a new copy of parameter == base */ static void *starpu_unistd_o_direct_plug(void *parameter, starpu_ssize_t size) { starpu_malloc_set_align(getpagesize()); return starpu_unistd_global_plug (parameter, size); } #if defined(HAVE_AIO_H) || defined(HAVE_LIBAIO_H) void *starpu_unistd_o_direct_global_async_read(void *base, void *obj, void *buf, off_t offset, size_t size) { STARPU_ASSERT_MSG((size % getpagesize()) == 0, "The unistd_o_direct variant can only read a multiple of page size %lu Bytes (Here %lu). Use the non-o_direct unistd variant if your data is not a multiple of %lu", (unsigned long) getpagesize(), (unsigned long) size, (unsigned long) getpagesize()); STARPU_ASSERT_MSG((((uintptr_t) buf) % getpagesize()) == 0, "You have to use starpu_malloc function"); return starpu_unistd_global_async_read (base, obj, buf, offset, size); } void *starpu_unistd_o_direct_global_async_write(void *base, void *obj, void *buf, off_t offset, size_t size) { STARPU_ASSERT_MSG((size % getpagesize()) == 0, "The unistd_o_direct variant can only write a multiple of page size %lu Bytes (Here %lu). Use the non-o_direct unistd variant if your data is not a multiple of %lu", (unsigned long) getpagesize(), (unsigned long) size, (unsigned long) getpagesize()); STARPU_ASSERT_MSG((((uintptr_t)buf) % getpagesize()) == 0, "You have to use starpu_malloc function"); return starpu_unistd_global_async_write (base, obj, buf, offset, size); } #endif struct starpu_disk_ops starpu_disk_unistd_o_direct_ops = { .alloc = starpu_unistd_o_direct_alloc, .free = starpu_unistd_global_free, .open = starpu_unistd_o_direct_open, .close = starpu_unistd_global_close, .read = starpu_unistd_o_direct_read, .write = starpu_unistd_o_direct_write, .plug = starpu_unistd_o_direct_plug, .unplug = starpu_unistd_global_unplug, .copy = NULL, .bandwidth = get_unistd_global_bandwidth_between_disk_and_main_ram, #if defined(HAVE_AIO_H) || defined(HAVE_LIBAIO_H) .async_read = starpu_unistd_o_direct_global_async_read, .async_write = starpu_unistd_o_direct_global_async_write, .wait_request = starpu_unistd_global_wait_request, .test_request = starpu_unistd_global_test_request, .free_request = starpu_unistd_global_free_request, #endif .full_read = starpu_unistd_global_full_read, .full_write = starpu_unistd_global_full_write }; starpu-1.2.3+dfsg/src/core/disk_ops/unistd/000077500000000000000000000000001320135501600206065ustar00rootroot00000000000000starpu-1.2.3+dfsg/src/core/disk_ops/unistd/disk_unistd_global.c000066400000000000000000000424031320135501600246150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Corentin Salingue * Copyright (C) 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #if defined(HAVE_LIBAIO_H) #include #elif defined(HAVE_AIO_H) #include #endif #ifdef HAVE_UNISTD_H # include #endif #include #include #include #include #include #include #include #ifdef STARPU_HAVE_WINDOWS # include #endif #define NITER _starpu_calibration_minimum #ifdef O_DIRECT # define MEM_SIZE getpagesize() #else # define MEM_SIZE 1 #endif #define MAX_OPEN_FILES 64 #define TEMP_HIERARCHY_DEPTH 2 static unsigned starpu_unistd_opened_files; #if defined(HAVE_LIBAIO_H) struct starpu_unistd_aiocb { struct iocb iocb; io_context_t ctx; struct starpu_unistd_global_obj *obj; size_t len; }; #elif defined(HAVE_AIO_H) struct starpu_unistd_aiocb { struct aiocb aiocb; struct starpu_unistd_global_obj *obj; }; #endif /* ------------------- use UNISTD to write on disk ------------------- */ static void _starpu_unistd_init(struct starpu_unistd_global_obj *obj, int descriptor, char *path, size_t size) { STARPU_HG_DISABLE_CHECKING(starpu_unistd_opened_files); if (starpu_unistd_opened_files >= MAX_OPEN_FILES) { /* Too many opened files, avoid keeping this one opened */ close(descriptor); descriptor = -1; } else (void) STARPU_ATOMIC_ADD(&starpu_unistd_opened_files, 1); STARPU_PTHREAD_MUTEX_INIT(&obj->mutex, NULL); obj->descriptor = descriptor; obj->path = path; obj->size = size; } static int _starpu_unistd_reopen(struct starpu_unistd_global_obj *obj) { int id = open(obj->path, obj->flags); STARPU_ASSERT_MSG(id >= 0, "Reopening file %s failed: errno %d", obj->path, errno); return id; } static void _starpu_unistd_reclose(int id) { close(id); } static void _starpu_unistd_close(struct starpu_unistd_global_obj *obj) { if (obj->descriptor < 0) return; if (starpu_unistd_opened_files < MAX_OPEN_FILES) (void) STARPU_ATOMIC_ADD(&starpu_unistd_opened_files, -1); close(obj->descriptor); } static void _starpu_unistd_fini(struct starpu_unistd_global_obj *obj) { STARPU_PTHREAD_MUTEX_DESTROY(&obj->mutex); free(obj->path); obj->path = NULL; free(obj); } /* allocation memory on disk */ void *starpu_unistd_global_alloc(struct starpu_unistd_global_obj *obj, void *base, size_t size) { int id; char *baseCpy = _starpu_mktemp_many(base, TEMP_HIERARCHY_DEPTH, obj->flags, &id); /* fail */ if (!baseCpy) { free(obj); return NULL; } int val = _starpu_ftruncate(id,size); /* fail */ if (val < 0) { _STARPU_DISP("Could not truncate file, ftruncate failed with error '%s'\n", strerror(errno)); close(id); unlink(baseCpy); free(baseCpy); free(obj); return NULL; } _starpu_unistd_init(obj, id, baseCpy, size); return obj; } /* free memory on disk */ void starpu_unistd_global_free(void *base STARPU_ATTRIBUTE_UNUSED, void *obj, size_t size STARPU_ATTRIBUTE_UNUSED) { struct starpu_unistd_global_obj *tmp = (struct starpu_unistd_global_obj *) obj; _starpu_unistd_close(tmp); unlink(tmp->path); _starpu_rmtemp_many(tmp->path, TEMP_HIERARCHY_DEPTH); _starpu_unistd_fini(tmp); } /* open an existing memory on disk */ void *starpu_unistd_global_open(struct starpu_unistd_global_obj *obj, void *base, void *pos, size_t size) { /* create template */ char *baseCpy; _STARPU_MALLOC(baseCpy, strlen(base)+1+strlen(pos)+1); snprintf(baseCpy, strlen(base)+1+strlen(pos)+1, "%s/%s", (char *)base, (char *)pos); int id = open(baseCpy, obj->flags); if (id < 0) { free(obj); free(baseCpy); return NULL; } _starpu_unistd_init(obj, id, baseCpy, size); return obj; } /* free memory without delete it */ void starpu_unistd_global_close(void *base STARPU_ATTRIBUTE_UNUSED, void *obj, size_t size STARPU_ATTRIBUTE_UNUSED) { struct starpu_unistd_global_obj *tmp = (struct starpu_unistd_global_obj *) obj; _starpu_unistd_close(tmp); _starpu_unistd_fini(tmp); } /* read the memory disk */ int starpu_unistd_global_read(void *base STARPU_ATTRIBUTE_UNUSED, void *obj, void *buf, off_t offset, size_t size) { struct starpu_unistd_global_obj *tmp = (struct starpu_unistd_global_obj *) obj; starpu_ssize_t nb; int fd = tmp->descriptor; #ifdef HAVE_PREAD if (fd >= 0) nb = pread(fd, buf, size, offset); else #endif { if (tmp->descriptor >= 0) STARPU_PTHREAD_MUTEX_LOCK(&tmp->mutex); else fd = _starpu_unistd_reopen(obj); int res = lseek(fd, offset, SEEK_SET); STARPU_ASSERT_MSG(res >= 0, "Starpu Disk unistd lseek for read failed: offset %lu got errno %d", (unsigned long) offset, errno); nb = read(fd, buf, size); if (tmp->descriptor >= 0) STARPU_PTHREAD_MUTEX_UNLOCK(&tmp->mutex); else _starpu_unistd_reclose(fd); } STARPU_ASSERT_MSG(nb >= 0, "Starpu Disk unistd read failed: size %lu got errno %d", (unsigned long) size, errno); return nb; } #if defined(HAVE_LIBAIO_H) void *starpu_unistd_global_async_read(void *base STARPU_ATTRIBUTE_UNUSED, void *obj, void *buf, off_t offset, size_t size) { struct starpu_unistd_global_obj *tmp = obj; struct starpu_unistd_aiocb *starpu_aiocb; _STARPU_CALLOC(starpu_aiocb, 1, sizeof(*starpu_aiocb)); struct iocb *iocb = &starpu_aiocb->iocb; starpu_aiocb->obj = obj; int fd = tmp->descriptor; int ret; if (fd < 0) fd = _starpu_unistd_reopen(obj); ret = io_setup(1, &starpu_aiocb->ctx); STARPU_ASSERT(ret == 0); starpu_aiocb->len = size; io_prep_pread(iocb, fd, buf, size, offset); if (io_submit(starpu_aiocb->ctx, 1, &iocb) < 0) { free(iocb); if (tmp->descriptor < 0) _starpu_unistd_reclose(fd); iocb = NULL; } return starpu_aiocb; } #elif defined(HAVE_AIO_H) void *starpu_unistd_global_async_read(void *base STARPU_ATTRIBUTE_UNUSED, void *obj, void *buf, off_t offset, size_t size) { struct starpu_unistd_global_obj *tmp = obj; struct starpu_unistd_aiocb *starpu_aiocb; _STARPU_CALLOC(starpu_aiocb, 1,sizeof(*starpu_aiocb)); struct aiocb *aiocb = &starpu_aiocb->aiocb; starpu_aiocb->obj = obj; int fd = tmp->descriptor; if (fd < 0) fd = _starpu_unistd_reopen(obj); aiocb->aio_fildes = fd; aiocb->aio_offset = offset; aiocb->aio_nbytes = size; aiocb->aio_buf = buf; aiocb->aio_reqprio = 0; aiocb->aio_lio_opcode = LIO_NOP; if (aio_read(aiocb) < 0) { free(aiocb); if (tmp->descriptor < 0) _starpu_unistd_reclose(fd); aiocb = NULL; } return aiocb; } #endif int starpu_unistd_global_full_read(void *base STARPU_ATTRIBUTE_UNUSED, void *obj, void **ptr, size_t *size) { struct starpu_unistd_global_obj *tmp = (struct starpu_unistd_global_obj *) obj; int fd = tmp->descriptor; if (fd < 0) fd = _starpu_unistd_reopen(obj); #ifdef STARPU_HAVE_WINDOWS *size = _filelength(fd); #else struct stat st; int ret = fstat(fd, &st); STARPU_ASSERT(ret==0); *size = st.st_size; #endif if (tmp->descriptor < 0) _starpu_unistd_reclose(fd); /* Allocated aligned buffer */ starpu_malloc_flags(ptr, *size, 0); return starpu_unistd_global_read(base, obj, *ptr, 0, *size); } /* write on the memory disk */ int starpu_unistd_global_write(void *base STARPU_ATTRIBUTE_UNUSED, void *obj, const void *buf, off_t offset, size_t size) { struct starpu_unistd_global_obj *tmp = (struct starpu_unistd_global_obj *) obj; int res; int fd = tmp->descriptor; #ifdef HAVE_PWRITE if (fd >= 0) res = pwrite(fd, buf, size, offset); else #endif { if (tmp->descriptor >= 0) STARPU_PTHREAD_MUTEX_LOCK(&tmp->mutex); else fd = _starpu_unistd_reopen(obj); res = lseek(fd, offset, SEEK_SET); STARPU_ASSERT_MSG(res >= 0, "Starpu Disk unistd lseek for write failed: offset %lu got errno %d", (unsigned long) offset, errno); res = write(fd, buf, size); if (tmp->descriptor >= 0) STARPU_PTHREAD_MUTEX_UNLOCK(&tmp->mutex); else _starpu_unistd_reclose(fd); } STARPU_ASSERT_MSG(res >= 0, "Starpu Disk unistd write failed: size %lu got errno %d", (unsigned long) size, errno); return 0; } #if defined(HAVE_LIBAIO_H) void *starpu_unistd_global_async_write(void *base STARPU_ATTRIBUTE_UNUSED, void *obj, void *buf, off_t offset, size_t size) { struct starpu_unistd_global_obj *tmp = obj; struct starpu_unistd_aiocb *starpu_aiocb; _STARPU_CALLOC(starpu_aiocb, 1,sizeof(*starpu_aiocb)); struct iocb *iocb = &starpu_aiocb->iocb; starpu_aiocb->obj = obj; int fd = tmp->descriptor; int ret; if (fd < 0) fd = _starpu_unistd_reopen(obj); ret = io_setup(1, &starpu_aiocb->ctx); STARPU_ASSERT(ret == 0); starpu_aiocb->len = size; io_prep_pwrite(iocb, fd, buf, size, offset); if (io_submit(starpu_aiocb->ctx, 1, &iocb) < 0) { free(iocb); if (tmp->descriptor < 0) _starpu_unistd_reclose(fd); iocb = NULL; } return starpu_aiocb; } #elif defined(HAVE_AIO_H) void *starpu_unistd_global_async_write(void *base STARPU_ATTRIBUTE_UNUSED, void *obj, void *buf, off_t offset, size_t size) { struct starpu_unistd_global_obj *tmp = obj; struct starpu_unistd_aiocb *starpu_aiocb; _STARPU_CALLOC(starpu_aiocb, 1,sizeof(*starpu_aiocb)); struct aiocb *aiocb = &starpu_aiocb->aiocb; starpu_aiocb->obj = obj; int fd = tmp->descriptor; if (fd < 0) fd = _starpu_unistd_reopen(obj); aiocb->aio_fildes = fd; aiocb->aio_offset = offset; aiocb->aio_nbytes = size; aiocb->aio_buf = buf; aiocb->aio_reqprio = 0; aiocb->aio_lio_opcode = LIO_NOP; if (aio_write(aiocb) < 0) { free(aiocb); if (tmp->descriptor < 0) _starpu_unistd_reclose(fd); aiocb = NULL; } return aiocb; } #endif int starpu_unistd_global_full_write(void *base STARPU_ATTRIBUTE_UNUSED, void *obj, void *ptr, size_t size) { struct starpu_unistd_global_obj *tmp = (struct starpu_unistd_global_obj *) obj; /* update file size to realise the next good full_read */ if(size != tmp->size) { int fd = tmp->descriptor; if (fd < 0) fd = _starpu_unistd_reopen(obj); int val = _starpu_ftruncate(fd,size); if (tmp->descriptor < 0) _starpu_unistd_reclose(fd); STARPU_ASSERT(val == 0); tmp->size = size; } return starpu_unistd_global_write(base, obj, ptr, 0, size); } /* create a new copy of parameter == base */ void *starpu_unistd_global_plug(void *parameter, starpu_ssize_t size STARPU_ATTRIBUTE_UNUSED) { char *tmp = strdup((char*)parameter); STARPU_ASSERT(tmp); { struct stat buf; if (!(stat(tmp, &buf) == 0 && S_ISDIR(buf.st_mode))) { _STARPU_ERROR("Directory '%s' does not exist\n", tmp); } } return (void *) tmp; } /* free memory allocated for the base */ void starpu_unistd_global_unplug(void *base) { free(base); } int get_unistd_global_bandwidth_between_disk_and_main_ram(unsigned node, void *base) { int res; unsigned iter; double timing_slowness, timing_latency; double start; double end; srand(time(NULL)); char *buf; starpu_malloc_flags((void *) &buf, STARPU_DISK_SIZE_MIN, 0); STARPU_ASSERT(buf != NULL); memset(buf, 0, STARPU_DISK_SIZE_MIN); /* allocate memory */ void *mem = _starpu_disk_alloc(node, STARPU_DISK_SIZE_MIN); /* fail to alloc */ if (mem == NULL) return 0; struct starpu_unistd_global_obj *tmp = (struct starpu_unistd_global_obj *) mem; /* Measure upload slowness */ start = starpu_timing_now(); for (iter = 0; iter < NITER; ++iter) { int fd = tmp->descriptor; _starpu_disk_write(STARPU_MAIN_RAM, node, mem, buf, 0, STARPU_DISK_SIZE_MIN, NULL); if (fd < 0) fd = _starpu_unistd_reopen(tmp); #ifdef STARPU_HAVE_WINDOWS res = _commit(fd); #else res = fsync(fd); #endif if (tmp->descriptor < 0) _starpu_unistd_reclose(fd); STARPU_ASSERT_MSG(res == 0, "bandwidth computation failed"); } end = starpu_timing_now(); timing_slowness = end - start; /* free memory */ starpu_free_flags(buf, STARPU_DISK_SIZE_MIN, 0); starpu_malloc_flags((void *) &buf, MEM_SIZE, 0); STARPU_ASSERT(buf != NULL); memset(buf, 0, MEM_SIZE); /* Measure latency */ start = starpu_timing_now(); for (iter = 0; iter < NITER; ++iter) { int fd = tmp->descriptor; _starpu_disk_write(STARPU_MAIN_RAM, node, mem, buf, (rand() % (STARPU_DISK_SIZE_MIN/MEM_SIZE)) * MEM_SIZE, MEM_SIZE, NULL); if (fd < 0) fd = _starpu_unistd_reopen(tmp); #ifdef STARPU_HAVE_WINDOWS res = _commit(fd); #else res = fsync(fd); #endif if (tmp->descriptor < 0) _starpu_unistd_reclose(fd); STARPU_ASSERT_MSG(res == 0, "Latency computation failed"); } end = starpu_timing_now(); timing_latency = end - start; _starpu_disk_free(node, mem, STARPU_DISK_SIZE_MIN); starpu_free_flags(buf, MEM_SIZE, 0); _starpu_save_bandwidth_and_latency_disk((NITER/timing_slowness)*STARPU_DISK_SIZE_MIN, (NITER/timing_slowness)*STARPU_DISK_SIZE_MIN, timing_latency/NITER, timing_latency/NITER, node, base); return 1; } #if defined(HAVE_LIBAIO_H) void starpu_unistd_global_wait_request(void *async_channel) { struct starpu_unistd_aiocb *starpu_aiocb = async_channel; struct io_event event; int values = -1; int myerrno = EAGAIN; while(values <= 0 && (myerrno == EAGAIN || myerrno == EINTR)) { /* Wait the answer of the request timeout IS NULL */ values = io_getevents(starpu_aiocb->ctx, 1, 1, &event, NULL); if (values < 0) myerrno = -values; } STARPU_ASSERT(&starpu_aiocb->iocb == event.obj); STARPU_ASSERT_MSG(!myerrno, "aio_error returned %d", myerrno); STARPU_ASSERT(event.res == starpu_aiocb->len); } int starpu_unistd_global_test_request(void *async_channel) { struct starpu_unistd_aiocb *starpu_aiocb = async_channel; struct io_event event; struct timespec ts; int ret; memset(&ts, 0, sizeof(ts)); /* Test the answer of the request */ ret = io_getevents(starpu_aiocb->ctx, 0, 1, &event, &ts); if (ret == 1) { STARPU_ASSERT(&starpu_aiocb->iocb == event.obj); STARPU_ASSERT(event.res == starpu_aiocb->len); /* request is finished */ return 1; } if (ret == 0 || ret == -EINTR || ret == -EINPROGRESS || ret == -EAGAIN) return 0; /* an error occured */ STARPU_ABORT_MSG("aio_error returned %d", ret); } void starpu_unistd_global_free_request(void *async_channel) { struct starpu_unistd_aiocb *starpu_aiocb = async_channel; struct iocb *iocb = &starpu_aiocb->iocb; if (starpu_aiocb->obj->descriptor < 0) _starpu_unistd_reclose(iocb->aio_fildes); io_destroy(starpu_aiocb->ctx); free(starpu_aiocb); } #elif defined(HAVE_AIO_H) void starpu_unistd_global_wait_request(void *async_channel) { const struct aiocb *aiocb = async_channel; int values = -1; int ret, myerrno = EAGAIN; while(values < 0 && (myerrno == EAGAIN || myerrno == EINTR)) { /* Wait the answer of the request TIMESTAMP IS NULL */ values = aio_suspend(&aiocb, 1, NULL); myerrno = errno; } ret = aio_error(aiocb); STARPU_ASSERT_MSG(!ret, "aio_error returned %d", ret); } int starpu_unistd_global_test_request(void *async_channel) { const struct aiocb *aiocb = async_channel; int ret; #if defined(__GLIBC__) && (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 22)) /* glibc's aio_error was not threadsafe before glibc 2.22 */ struct timespec ts = { .tv_sec = 0, .tv_nsec = 0 }; ret = aio_suspend(&aiocb, 1, &ts); if (ret < 0 && (errno == EAGAIN || errno == EINTR)) return 0; STARPU_ASSERT_MSG(!ret, "aio_suspend returned %d %d\n", ret, errno); #endif /* Test the answer of the request */ ret = aio_error(aiocb); if (ret == 0) /* request is finished */ return 1; if (ret == EINTR || ret == EINPROGRESS || ret == EAGAIN) return 0; /* an error occured */ STARPU_ABORT_MSG("aio_error returned %d", ret); } void starpu_unistd_global_free_request(void *async_channel) { struct starpu_unistd_aiocb *starpu_aiocb = async_channel; struct aiocb *aiocb = &starpu_aiocb->aiocb; if (starpu_aiocb->obj->descriptor < 0) _starpu_unistd_reclose(aiocb->aio_fildes); aio_return(aiocb); free(starpu_aiocb); } #endif starpu-1.2.3+dfsg/src/core/disk_ops/unistd/disk_unistd_global.h000066400000000000000000000043031320135501600246170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Corentin Salingue * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DISK_UNISTD_GLOBAL_H__ #define __DISK_UNISTD_GLOBAL_H__ #include #ifndef O_BINARY #define O_BINARY 0 #endif struct starpu_unistd_global_obj { int descriptor; char * path; size_t size; int flags; starpu_pthread_mutex_t mutex; }; void * starpu_unistd_global_alloc (struct starpu_unistd_global_obj * obj, void *base, size_t size); void starpu_unistd_global_free (void *base, void *obj, size_t size); void * starpu_unistd_global_open (struct starpu_unistd_global_obj * obj, void *base, void *pos, size_t size); void starpu_unistd_global_close (void *base, void *obj, size_t size); int starpu_unistd_global_read (void *base, void *obj, void *buf, off_t offset, size_t size); int starpu_unistd_global_write (void *base, void *obj, const void *buf, off_t offset, size_t size); void * starpu_unistd_global_plug (void *parameter, starpu_ssize_t size); void starpu_unistd_global_unplug (void *base); int get_unistd_global_bandwidth_between_disk_and_main_ram(unsigned node, void *base); void* starpu_unistd_global_async_read (void *base, void *obj, void *buf, off_t offset, size_t size); void* starpu_unistd_global_async_write (void *base, void *obj, void *buf, off_t offset, size_t size); void starpu_unistd_global_wait_request(void * async_channel); int starpu_unistd_global_test_request(void * async_channel); void starpu_unistd_global_free_request(void * async_channel); int starpu_unistd_global_full_read(void *base, void * obj, void ** ptr, size_t * size); int starpu_unistd_global_full_write (void * base, void * obj, void * ptr, size_t size); #endif starpu-1.2.3+dfsg/src/core/errorcheck.c000066400000000000000000000047461320135501600177730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include void _starpu_set_worker_status(struct _starpu_worker *worker, enum _starpu_worker_status st) { starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(worker->workerid, &sched_mutex, &sched_cond); STARPU_PTHREAD_MUTEX_LOCK_SCHED(sched_mutex); worker->status = st; STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(sched_mutex); } void _starpu_set_local_worker_status(enum _starpu_worker_status st) { struct _starpu_worker *worker = _starpu_get_local_worker_key(); /* It is possible that we call this function from the application (and * thereforce outside a worker), for instance if we are executing the * callback function of a task with a "NULL" codelet. */ if (worker) _starpu_set_worker_status(worker, st); } enum _starpu_worker_status _starpu_get_local_worker_status(void) { struct _starpu_worker *worker = _starpu_get_local_worker_key(); if (STARPU_UNLIKELY(!worker)) return STATUS_INVALID; return worker->status; } /* It is forbidden to call blocking operations with Callback and during the * execution of a task. */ unsigned _starpu_worker_may_perform_blocking_calls(void) { enum _starpu_worker_status st = _starpu_get_local_worker_status(); #ifdef STARPU_OPENMP /* When the current task is an OpenMP task, we may need to block, * especially when unregistering data used by child tasks. However, * we don't want to blindly disable the check for non OpenMP tasks. */ const struct starpu_task * const task = starpu_task_get_current(); const int blocking_call_check_override = task && task->omp_task; #else /* STARPU_OPENMP */ const int blocking_call_check_override = 0; #endif /* STARPU_OPENMP */ return blocking_call_check_override || ( !(st == STATUS_CALLBACK) && !(st == STATUS_EXECUTING)); } starpu-1.2.3+dfsg/src/core/errorcheck.h000066400000000000000000000044501320135501600177700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014, 2017 Université de Bordeaux * Copyright (C) 2010, 2011 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __ERRORCHECK_H__ #define __ERRORCHECK_H__ #include /* This type describes in which state a worker may be. */ enum _starpu_worker_status { /* invalid status (for instance if we request the status of some thread * that is not controlled by StarPU */ STATUS_INVALID, /* everything that does not fit the other status */ STATUS_UNKNOWN, /* during the initialization */ STATUS_INITIALIZING, /* during the execution of a codelet */ STATUS_EXECUTING, /* during the execution of the callback */ STATUS_CALLBACK, /* while executing the scheduler code */ STATUS_SCHEDULING, /* while waiting for a data transfer */ STATUS_WAITING, /* while sleeping because there is nothing to do */ STATUS_SLEEPING, /* while a sleeping worker is about to wake up (to avoid waking twice for the same worker) */ STATUS_WAKING_UP }; struct _starpu_worker; /* Specify what the local worker is currently doing (eg. executing a callback). * This permits to detect if this is legal to do a blocking call for instance. * */ void _starpu_set_worker_status(struct _starpu_worker *worker, enum _starpu_worker_status st); void _starpu_set_local_worker_status(enum _starpu_worker_status st); /* Indicate what type of operation the worker is currently doing. */ enum _starpu_worker_status _starpu_get_local_worker_status(void); /* It is forbidden to do blocking calls during some operations such as callback * or during the execution of a task. This function indicates whether it is * legal to call a blocking operation in the current context. */ unsigned _starpu_worker_may_perform_blocking_calls(void); #endif // __ERRORCHECK_H__ starpu-1.2.3+dfsg/src/core/jobs.c000066400000000000000000000554661320135501600166060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2017 CNRS * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2011, 2014, 2016 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* we need to identify each task to generate the DAG. */ static unsigned long job_cnt = 0; static int max_memory_use; static unsigned long njobs, maxnjobs; #ifdef STARPU_DEBUG /* List of all jobs, for debugging */ static struct _starpu_job_multilist_all_submitted all_jobs_list; static starpu_pthread_mutex_t all_jobs_list_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; #endif void _starpu_job_init(void) { max_memory_use = starpu_get_env_number_default("STARPU_MAX_MEMORY_USE", 0); #ifdef STARPU_DEBUG _starpu_job_multilist_init_all_submitted(&all_jobs_list); #endif } void _starpu_job_fini(void) { if (max_memory_use) { _STARPU_DISP("Memory used for %lu tasks: %lu MiB\n", maxnjobs, (unsigned long) (maxnjobs * (sizeof(struct starpu_task) + sizeof(struct _starpu_job))) >> 20); STARPU_ASSERT_MSG(njobs == 0, "Some tasks have not been cleaned, did you forget to call starpu_task_destroy or starpu_task_clean?"); } } void _starpu_exclude_task_from_dag(struct starpu_task *task) { struct _starpu_job *j = _starpu_get_job_associated_to_task(task); j->exclude_from_dag = 1; } /* create an internal struct _starpu_job structure to encapsulate the task */ struct _starpu_job* STARPU_ATTRIBUTE_MALLOC _starpu_job_create(struct starpu_task *task) { struct _starpu_job *job; _STARPU_LOG_IN(); _STARPU_MALLOC(job, sizeof(*job)); /* As most of the fields must be initialized at NULL, let's put 0 * everywhere */ memset(job, 0, sizeof(*job)); if (task->dyn_handles) { _STARPU_MALLOC(job->dyn_ordered_buffers, STARPU_TASK_GET_NBUFFERS(task) * sizeof(job->dyn_ordered_buffers[0])); _STARPU_CALLOC(job->dyn_dep_slots, STARPU_TASK_GET_NBUFFERS(task), sizeof(job->dyn_dep_slots[0])); } job->task = task; #ifndef STARPU_USE_FXT if (_starpu_bound_recording || _starpu_top_status_get() || _starpu_task_break_on_push != -1 || _starpu_task_break_on_sched != -1 || _starpu_task_break_on_pop != -1 || _starpu_task_break_on_exec != -1 || STARPU_AYU_EVENT) #endif { job->job_id = STARPU_ATOMIC_ADDL(&job_cnt, 1); STARPU_AYU_ADDTASK(job->job_id, task); STARPU_ASSERT(job->job_id != ULONG_MAX); } if (max_memory_use) { unsigned long jobs = STARPU_ATOMIC_ADDL(&njobs, 1); if (jobs > maxnjobs) maxnjobs = jobs; } _starpu_cg_list_init(&job->job_successors); STARPU_PTHREAD_MUTEX_INIT(&job->sync_mutex, NULL); STARPU_PTHREAD_COND_INIT(&job->sync_cond, NULL); /* By default we have sequential tasks */ job->task_size = 1; if (task->use_tag) _starpu_tag_declare(task->tag_id, job); if (_starpu_graph_record) _starpu_graph_add_job(job); _STARPU_LOG_OUT(); return job; } void _starpu_job_destroy(struct _starpu_job *j) { /* Wait for any code that was still working on the job (and was * probably our waker) */ STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); STARPU_PTHREAD_COND_DESTROY(&j->sync_cond); STARPU_PTHREAD_MUTEX_DESTROY(&j->sync_mutex); if (j->task_size > 1) { STARPU_PTHREAD_BARRIER_DESTROY(&j->before_work_barrier); STARPU_PTHREAD_BARRIER_DESTROY(&j->after_work_barrier); STARPU_ASSERT(j->after_work_busy_barrier == 0); } _starpu_cg_list_deinit(&j->job_successors); if (j->dyn_ordered_buffers) { free(j->dyn_ordered_buffers); j->dyn_ordered_buffers = NULL; } if (j->dyn_dep_slots) { free(j->dyn_dep_slots); j->dyn_dep_slots = NULL; } if (_starpu_graph_record && j->graph_node) _starpu_graph_drop_job(j); if (max_memory_use) (void) STARPU_ATOMIC_ADDL(&njobs, -1); free(j); } int _starpu_job_finished(struct _starpu_job *j) { int ret; STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex); ret = j->terminated == 2; STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); return ret; } void _starpu_wait_job(struct _starpu_job *j) { STARPU_ASSERT(j->task); STARPU_ASSERT(!j->task->detach); _STARPU_LOG_IN(); STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex); /* We wait for the flag to have a value of 2 which means that both the * codelet's implementation and its callback have been executed. That * way, _starpu_wait_job won't return until the entire task was really * executed (so that we cannot destroy the task while it is still being * manipulated by the driver). */ while (j->terminated != 2) { STARPU_PTHREAD_COND_WAIT(&j->sync_cond, &j->sync_mutex); } STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); _STARPU_LOG_OUT(); } #ifdef STARPU_OPENMP int _starpu_test_job_termination(struct _starpu_job *j) { STARPU_ASSERT(j->task); STARPU_ASSERT(!j->task->detach); /* Disable Helgrind race complaint, since we really just want to poll j->terminated */ if (STARPU_RUNNING_ON_VALGRIND) { int v = STARPU_PTHREAD_MUTEX_TRYLOCK(&j->sync_mutex); if (v != EBUSY) { STARPU_ASSERT(v == 0); int ret = (j->terminated == 2); STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); return ret; } else { return 0; } } else { STARPU_SYNCHRONIZE(); return j->terminated == 2; } } void _starpu_job_prepare_for_continuation_ext(struct _starpu_job *j, unsigned continuation_resubmit, void (*continuation_callback_on_sleep)(void *arg), void *continuation_callback_on_sleep_arg) { STARPU_ASSERT(!j->continuation); /* continuation are not supported for parallel tasks for now */ STARPU_ASSERT(j->task_size == 1); j->continuation = 1; j->continuation_resubmit = continuation_resubmit; j->continuation_callback_on_sleep = continuation_callback_on_sleep; j->continuation_callback_on_sleep_arg = continuation_callback_on_sleep_arg; j->job_successors.ndeps = 0; } /* Prepare a currently running job for accepting a new set of * dependencies in anticipation of becoming a continuation. */ void _starpu_job_prepare_for_continuation(struct _starpu_job *j) { _starpu_job_prepare_for_continuation_ext(j, 1, NULL, NULL); } void _starpu_job_set_omp_cleanup_callback(struct _starpu_job *j, void (*omp_cleanup_callback)(void *arg), void *omp_cleanup_callback_arg) { j->omp_cleanup_callback = omp_cleanup_callback; j->omp_cleanup_callback_arg = omp_cleanup_callback_arg; } #endif void _starpu_handle_job_submission(struct _starpu_job *j) { /* Need to atomically set submitted to 1 and check dependencies, since * this is concucrent with _starpu_notify_cg */ j->terminated = 0; if (!j->submitted) j->submitted = 1; else j->submitted = 2; #ifdef STARPU_DEBUG STARPU_PTHREAD_MUTEX_LOCK(&all_jobs_list_mutex); _starpu_job_multilist_push_back_all_submitted(&all_jobs_list, j); STARPU_PTHREAD_MUTEX_UNLOCK(&all_jobs_list_mutex); #endif } void _starpu_handle_job_termination(struct _starpu_job *j) { struct starpu_task *task = j->task; unsigned sched_ctx = task->sched_ctx; double flops = task->flops; const unsigned continuation = #ifdef STARPU_OPENMP j->continuation #else 0 #endif ; /* Read cl fields before releasing dependencies, for the case of a * switch_cl which is freed by data_unregister happening as soon as * the dependencies are released. */ unsigned nowhere = !task->cl || task->cl->where == STARPU_NOWHERE; #ifdef STARPU_DEBUG STARPU_PTHREAD_MUTEX_LOCK(&all_jobs_list_mutex); _starpu_job_multilist_erase_all_submitted(&all_jobs_list, j); STARPU_PTHREAD_MUTEX_UNLOCK(&all_jobs_list_mutex); #endif STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex); #ifdef STARPU_OPENMP if (continuation) { task->status = STARPU_TASK_STOPPED; } else #endif { task->status = STARPU_TASK_FINISHED; /* We must have set the j->terminated flag early, so that it is * possible to express task dependencies within the callback * function. A value of 1 means that the codelet was executed but that * the callback is not done yet. */ j->terminated = 1; } STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); #ifdef STARPU_USE_SC_HYPERVISOR size_t data_size = 0; #endif //STARPU_USE_SC_HYPERVISOR /* We release handle reference count */ if (task->cl && !continuation) { unsigned i; unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); #ifdef STARPU_USE_SC_HYPERVISOR for(i = 0; i < nbuffers; i++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, i); if (handle != NULL) data_size += _starpu_data_get_size(handle); } #endif //STARPU_USE_SC_HYPERVISOR for (i = 0; i < nbuffers; i++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, i); _starpu_spin_lock(&handle->header_lock); handle->busy_count--; if (!_starpu_data_check_not_busy(handle)) _starpu_spin_unlock(&handle->header_lock); } } /* If this is a continuation, we do not release task dependencies now. * Task dependencies will be released only when the continued task * fully completes */ if (!continuation) { /* Tell other tasks that we don't exist any more, thus no need for * implicit dependencies any more. */ _starpu_release_task_enforce_sequential_consistency(j); } /* Remove ourself from the graph before notifying dependencies */ if (_starpu_graph_record) _starpu_graph_drop_job(j); /* Task does not have a cl, but has explicit data dependencies, we need * to tell them that we will not exist any more before notifying the * tasks waiting for us * * For continuations, implicit dependency handles are only released * when the task fully completes */ if (j->implicit_dep_handle && !continuation) { starpu_data_handle_t handle = j->implicit_dep_handle; _starpu_release_data_enforce_sequential_consistency(j->task, &j->implicit_dep_slot, handle); /* Release reference taken while setting implicit_dep_handle */ _starpu_spin_lock(&handle->header_lock); handle->busy_count--; if (!_starpu_data_check_not_busy(handle)) _starpu_spin_unlock(&handle->header_lock); } _STARPU_TRACE_TASK_NAME(j); /* If this is a continuation, we do not notify task/tag dependencies * now. Task/tag dependencies will be notified only when the continued * task fully completes */ if (!continuation) { /* in case there are dependencies, wake up the proper tasks */ _starpu_notify_dependencies(j); } /* If this is a continuation, we do not execute the callback * now. The callback will be executed only when the continued * task fully completes */ if (!continuation) { /* the callback is executed after the dependencies so that we may remove the tag * of the task itself */ if (task->callback_func) { int profiling = starpu_profiling_status_get(); if (profiling && task->profiling_info) _starpu_clock_gettime(&task->profiling_info->callback_start_time); /* so that we can check whether we are doing blocking calls * within the callback */ _starpu_set_local_worker_status(STATUS_CALLBACK); /* Perhaps we have nested callbacks (eg. with chains of empty * tasks). So we store the current task and we will restore it * later. */ struct starpu_task *current_task = starpu_task_get_current(); _starpu_set_current_task(task); _STARPU_TRACE_START_CALLBACK(j); task->callback_func(task->callback_arg); _STARPU_TRACE_END_CALLBACK(j); _starpu_set_current_task(current_task); _starpu_set_local_worker_status(STATUS_UNKNOWN); if (profiling && task->profiling_info) _starpu_clock_gettime(&task->profiling_info->callback_end_time); } } /* If the job was executed on a combined worker there is no need for the * scheduler to process it : the task structure doesn't contain any valuable * data as it's not linked to an actual worker */ /* control task should not execute post_exec_hook */ if(j->task_size == 1 && !nowhere && !j->internal #ifdef STARPU_OPENMP /* If this is a continuation, we do not execute the post_exec_hook. The * post_exec_hook will be run only when the continued task fully * completes. * * Note: If needed, a specific hook could be added to handle stopped * tasks */ && !continuation #endif ) { _starpu_sched_post_exec_hook(task); #ifdef STARPU_USE_SC_HYPERVISOR int workerid = starpu_worker_get_id(); _starpu_sched_ctx_post_exec_task_cb(workerid, task, data_size, j->footprint); #endif //STARPU_USE_SC_HYPERVISOR } /* Note: For now, we keep the TASK_DONE trace event for continuation, * however we could add a specific event for stopped tasks if needed. */ _STARPU_TRACE_TASK_DONE(j); /* NB: we do not save those values before the callback, in case the * application changes some parameters eventually (eg. a task may not * be generated if the application is terminated). */ unsigned destroy = task->destroy; unsigned detach = task->detach; unsigned regenerate = task->regenerate; /* we do not desallocate the job structure if some is going to * wait after the task */ STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex); if (!continuation) { #ifdef STARPU_OPENMP if (j->omp_cleanup_callback) { j->omp_cleanup_callback(j->omp_cleanup_callback_arg); j->omp_cleanup_callback = NULL; j->omp_cleanup_callback_arg = NULL; } #endif /* A value of 2 is put to specify that not only the codelet but * also the callback were executed. */ j->terminated = 2; } STARPU_PTHREAD_COND_BROADCAST(&j->sync_cond); STARPU_AYU_REMOVETASK(j->job_id); STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); if (detach && !continuation) { /* no one is going to synchronize with that task so we release * the data structures now. In case the job was already locked * by the caller, it is its responsability to destroy the task. * */ if (destroy) _starpu_task_destroy(task); } /* A continuation is not much different from a regenerated task. */ if (regenerate || continuation) { STARPU_ASSERT_MSG((detach && !destroy && !task->synchronous) || continuation , "Regenerated task must be detached (was %u), and not have detroy=1 (was %u) or synchronous=1 (was %u)", detach, destroy, task->synchronous); STARPU_AYU_ADDTASK(j->job_id, j->exclude_from_dag?NULL:task); { #ifdef STARPU_OPENMP unsigned continuation_resubmit = j->continuation_resubmit; void (*continuation_callback_on_sleep)(void *arg) = j->continuation_callback_on_sleep; void *continuation_callback_on_sleep_arg = j->continuation_callback_on_sleep_arg; j->continuation_resubmit = 1; j->continuation_callback_on_sleep = NULL; j->continuation_callback_on_sleep_arg = NULL; if (!continuation || continuation_resubmit) #endif { /* We reuse the same job structure */ int ret = _starpu_submit_job(j); STARPU_ASSERT(!ret); } #ifdef STARPU_OPENMP if (continuation && continuation_callback_on_sleep != NULL) { continuation_callback_on_sleep(continuation_callback_on_sleep_arg); } #endif } } _starpu_decrement_nready_tasks_of_sched_ctx(sched_ctx, flops); _starpu_decrement_nsubmitted_tasks_of_sched_ctx(sched_ctx); struct _starpu_worker *worker; worker = _starpu_get_local_worker_key(); if (worker) { STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); if(worker->removed_from_ctx[sched_ctx] == 1 && worker->shares_tasks_lists[sched_ctx] == 1) { _starpu_worker_gets_out_of_ctx(sched_ctx, worker); worker->removed_from_ctx[sched_ctx] = 0; } STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); } } /* This function is called when a new task is submitted to StarPU * it returns 1 if the tag deps are not fulfilled, 0 otherwise */ static unsigned _starpu_not_all_tag_deps_are_fulfilled(struct _starpu_job *j) { unsigned ret; if (!j->task->use_tag) { /* this task does not use tags, so we can go on */ return 0; } struct _starpu_tag *tag = j->tag; struct _starpu_cg_list *tag_successors = &tag->tag_successors; _starpu_spin_lock(&tag->lock); STARPU_ASSERT_MSG(tag->is_assigned == 1 || !tag_successors->ndeps, "a tag can be assigned only one task to wake (%llu had %u assigned tasks, and %u successors)", (unsigned long long) tag->id, tag->is_assigned, tag_successors->ndeps); if (tag_successors->ndeps != tag_successors->ndeps_completed) { tag->state = STARPU_BLOCKED; j->task->status = STARPU_TASK_BLOCKED_ON_TAG; ret = 1; } else { /* existing deps (if any) are fulfilled */ /* If the same tag is being signaled by several tasks, do not * clear a DONE state. If it's the same job submitted several * times with the same tag, we have to do it */ if (j->submitted == 2 || tag->state != STARPU_DONE) tag->state = STARPU_READY; /* already prepare for next run */ tag_successors->ndeps_completed = 0; ret = 0; } _starpu_spin_unlock(&tag->lock); return ret; } static unsigned _starpu_not_all_task_deps_are_fulfilled(struct _starpu_job *j) { unsigned ret; struct _starpu_cg_list *job_successors = &j->job_successors; if (!j->submitted || (job_successors->ndeps != job_successors->ndeps_completed)) { j->task->status = STARPU_TASK_BLOCKED_ON_TASK; ret = 1; } else { /* existing deps (if any) are fulfilled */ /* already prepare for next run */ job_successors->ndeps_completed = 0; ret = 0; } return ret; } /* * In order, we enforce tag, task and data dependencies. The task is * passed to the scheduler only once all these constraints are fulfilled. * * The job mutex has to be taken for atomicity with task submission, and * is released here. */ unsigned _starpu_enforce_deps_and_schedule(struct _starpu_job *j) { unsigned ret; _STARPU_LOG_IN(); /* enfore tag dependencies */ if (_starpu_not_all_tag_deps_are_fulfilled(j)) { STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); _STARPU_LOG_OUT_TAG("not_all_tag_deps_are_fulfilled"); return 0; } /* enfore task dependencies */ if (_starpu_not_all_task_deps_are_fulfilled(j)) { STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); _STARPU_LOG_OUT_TAG("not_all_task_deps_are_fulfilled"); return 0; } STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); /* enforce data dependencies */ if (_starpu_submit_job_enforce_data_deps(j)) { _STARPU_LOG_OUT_TAG("enforce_data_deps"); return 0; } ret = _starpu_push_task(j); _STARPU_LOG_OUT(); return ret; } /* Tag deps are already fulfilled */ unsigned _starpu_enforce_deps_starting_from_task(struct _starpu_job *j) { unsigned ret; /* enfore task dependencies */ if (_starpu_not_all_task_deps_are_fulfilled(j)) { STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); return 0; } STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); /* enforce data dependencies */ if (_starpu_submit_job_enforce_data_deps(j)) return 0; ret = _starpu_push_task(j); return ret; } #ifdef STARPU_OPENMP /* When waking up a continuation, we only enforce new task dependencies */ unsigned _starpu_reenforce_task_deps_and_schedule(struct _starpu_job *j) { unsigned ret; _STARPU_LOG_IN(); STARPU_ASSERT(j->discontinuous); /* enfore task dependencies */ if (_starpu_not_all_task_deps_are_fulfilled(j)) { STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); _STARPU_LOG_OUT_TAG("not_all_task_deps_are_fulfilled"); return 0; } STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); ret = _starpu_push_task(j); _STARPU_LOG_OUT(); return ret; } #endif /* Ordered tasks are simply recorded as they arrive in the local_ordered_tasks * ring buffer, indexed by order, and pulled from its head. */ /* TODO: replace with perhaps a heap */ /* This function must be called with worker->sched_mutex taken */ struct starpu_task *_starpu_pop_local_task(struct _starpu_worker *worker) { struct starpu_task *task = NULL; if (worker->local_ordered_tasks_size) { task = worker->local_ordered_tasks[worker->current_ordered_task]; if (task) { worker->local_ordered_tasks[worker->current_ordered_task] = NULL; STARPU_ASSERT(task->workerorder == worker->current_ordered_task_order); /* Next ordered task is there, return it */ worker->current_ordered_task = (worker->current_ordered_task + 1) % worker->local_ordered_tasks_size; worker->current_ordered_task_order++; _starpu_pop_task_end(task); return task; } } if (!starpu_task_list_empty(&worker->local_tasks)) task = starpu_task_list_pop_front(&worker->local_tasks); _starpu_pop_task_end(task); return task; } int _starpu_push_local_task(struct _starpu_worker *worker, struct starpu_task *task, int prio) { /* Check that the worker is able to execute the task ! */ STARPU_ASSERT(task && task->cl); if (STARPU_UNLIKELY(!(worker->worker_mask & task->cl->where))) return -ENODEV; STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); if (task->execute_on_a_specific_worker && task->workerorder) { STARPU_ASSERT_MSG(task->workerorder >= worker->current_ordered_task_order, "worker order values must not have duplicates (%u pushed to worker %d, but %u already passed)", task->workerorder, worker->workerid, worker->current_ordered_task_order); /* Put it in the ordered task ring */ unsigned needed = task->workerorder - worker->current_ordered_task_order + 1; if (worker->local_ordered_tasks_size < needed) { /* Increase the size */ unsigned alloc = worker->local_ordered_tasks_size; struct starpu_task **new; if (!alloc) alloc = 1; while (alloc < needed) alloc *= 2; _STARPU_MALLOC(new, alloc * sizeof(*new)); if (worker->local_ordered_tasks_size) { /* Put existing tasks at the beginning of the new ring */ unsigned copied = worker->local_ordered_tasks_size - worker->current_ordered_task; memcpy(new, &worker->local_ordered_tasks[worker->current_ordered_task], copied * sizeof(*new)); memcpy(new + copied, worker->local_ordered_tasks, (worker->local_ordered_tasks_size - copied) * sizeof(*new)); } memset(new + worker->local_ordered_tasks_size, 0, (alloc - worker->local_ordered_tasks_size) * sizeof(*new)); free(worker->local_ordered_tasks); worker->local_ordered_tasks = new; worker->local_ordered_tasks_size = alloc; worker->current_ordered_task = 0; } worker->local_ordered_tasks[(worker->current_ordered_task + task->workerorder - worker->current_ordered_task_order) % worker->local_ordered_tasks_size] = task; } else { if (prio) starpu_task_list_push_front(&worker->local_tasks, task); else starpu_task_list_push_back(&worker->local_tasks, task); } starpu_wake_worker_locked(worker->workerid); starpu_push_task_end(task); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); return 0; } starpu-1.2.3+dfsg/src/core/jobs.h000066400000000000000000000245001320135501600165740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2013, 2014, 2015 CNRS * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __JOBS_H__ #define __JOBS_H__ #include #include #include #include #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include #include #include #include #include #include #include #ifdef STARPU_USE_CUDA #include #endif struct _starpu_worker; /* codelet function */ typedef void (*_starpu_cl_func_t)(void **, void *); #define _STARPU_CPU_MAY_PERFORM(j) ((j)->task->cl->where & STARPU_CPU) #define _STARPU_CUDA_MAY_PERFORM(j) ((j)->task->cl->where & STARPU_CUDA) #define _STARPU_OPENCL_MAY_PERFORM(j) ((j)->task->cl->where & STARPU_OPENCL) #define _STARPU_MIC_MAY_PERFORM(j) ((j)->task->cl->where & STARPU_MIC) #define _STARPU_SCC_MAY_PERFORM(j) ((j)->task->cl->where & STARPU_SCC) struct _starpu_data_descr { starpu_data_handle_t handle; enum starpu_data_access_mode mode; int node; }; #ifdef STARPU_DEBUG MULTILIST_CREATE_TYPE(_starpu_job, all_submitted) #endif /* A job is the internal representation of a task. */ struct _starpu_job { /* Each job is attributed a unique id. */ unsigned long job_id; /* The task associated to that job */ struct starpu_task *task; /* These synchronization structures are used to wait for the job to be * available or terminated for instance. */ starpu_pthread_mutex_t sync_mutex; starpu_pthread_cond_t sync_cond; /* To avoid deadlocks, we reorder the different buffers accessed to by * the task so that we always grab the rw-lock associated to the * handles in the same order. */ struct _starpu_data_descr ordered_buffers[STARPU_NMAXBUFS]; struct _starpu_task_wrapper_dlist dep_slots[STARPU_NMAXBUFS]; struct _starpu_data_descr *dyn_ordered_buffers; struct _starpu_task_wrapper_dlist *dyn_dep_slots; /* If a tag is associated to the job, this points to the internal data * structure that describes the tag status. */ struct _starpu_tag *tag; /* Maintain a list of all the completion groups that depend on the job. * */ struct _starpu_cg_list job_successors; /* For tasks with cl==NULL but submitted with explicit data dependency, * the handle for this dependency, so as to remove the task from the * last_writer/readers */ starpu_data_handle_t implicit_dep_handle; struct _starpu_task_wrapper_dlist implicit_dep_slot; /* Indicates whether the task associated to that job has already been * submitted to StarPU (1) or not (0) (using starpu_task_submit). * Becomes and stays 2 when the task is submitted several times. * * Protected by j->sync_mutex. */ unsigned submitted:2; /* Indicates whether the task associated to this job is terminated or * not. * * Protected by j->sync_mutex. */ unsigned terminated:2; #ifdef STARPU_OPENMP /* Job is a continuation or a regular task. */ unsigned continuation; /* If 0, the prepared continuation is not resubmitted automatically * when going to sleep, if 1, the prepared continuation is immediately * resubmitted when going to sleep. */ unsigned continuation_resubmit; /* Callback function called when: * - The continuation starpu task is ready to be submitted again if * continuation_resubmit = 0; * - The continuation starpu task has just been re-submitted if * continuation_resubmit = 1. */ void (*continuation_callback_on_sleep)(void *arg); void *continuation_callback_on_sleep_arg; void (*omp_cleanup_callback)(void *arg); void *omp_cleanup_callback_arg; /* Job has been stopped at least once. */ unsigned discontinuous; /* Cumulated execution time for discontinuous jobs */ struct timespec cumulated_ts; /* Cumulated energy consumption for discontinuous jobs */ double cumulated_energy_consumed; #endif /* The value of the footprint that identifies the job may be stored in * this structure. */ uint32_t footprint; unsigned footprint_is_computed:1; /* Should that task appear in the debug tools ? (eg. the DAG generated * with dot) */ unsigned exclude_from_dag:1; /* Is that task internal to StarPU? */ unsigned internal:1; /* During the reduction of a handle, StarPU may have to submit tasks to * perform the reduction itself: those task should not be stalled while * other tasks are blocked until the handle has been properly reduced, * so we need a flag to differentiate them from "normal" tasks. */ unsigned reduction_task:1; /* The implementation associated to the job */ unsigned nimpl; /* Number of workers executing that task (>1 if the task is parallel) * */ int task_size; /* In case we have assigned this job to a combined workerid */ int combined_workerid; /* How many workers are currently running an alias of that job (for * parallel tasks only). */ int active_task_alias_count; struct bound_task *bound_task; /* Parallel workers may have to synchronize before/after the execution of a parallel task. */ starpu_pthread_barrier_t before_work_barrier; starpu_pthread_barrier_t after_work_barrier; unsigned after_work_busy_barrier; struct _starpu_graph_node *graph_node; #ifdef STARPU_DEBUG /* Linked-list of all jobs, for debugging */ struct _starpu_job_multilist_all_submitted all_submitted; #endif }; #ifdef STARPU_DEBUG MULTILIST_CREATE_INLINES(struct _starpu_job, _starpu_job, all_submitted) #endif void _starpu_job_init(void); void _starpu_job_fini(void); /* Create an internal struct _starpu_job *structure to encapsulate the task. */ struct _starpu_job* _starpu_job_create(struct starpu_task *task) STARPU_ATTRIBUTE_MALLOC; /* Destroy the data structure associated to the job structure */ void _starpu_job_destroy(struct _starpu_job *j); /* Test for the termination of the job */ int _starpu_job_finished(struct _starpu_job *j); /* Wait for the termination of the job */ void _starpu_wait_job(struct _starpu_job *j); #ifdef STARPU_OPENMP /* Test for the termination of the job */ int _starpu_test_job_termination(struct _starpu_job *j); /* Prepare the job for accepting new dependencies before becoming a continuation. */ void _starpu_job_prepare_for_continuation_ext(struct _starpu_job *j, unsigned continuation_resubmit, void (*continuation_callback_on_sleep)(void *arg), void *continuation_callback_on_sleep_arg); void _starpu_job_prepare_for_continuation(struct _starpu_job *j); void _starpu_job_set_omp_cleanup_callback(struct _starpu_job *j, void (*omp_cleanup_callback)(void *arg), void *omp_cleanup_callback_arg); #endif /* Specify that the task should not appear in the DAG generated by debug tools. */ void _starpu_exclude_task_from_dag(struct starpu_task *task); /* try to submit job j, enqueue it if it's not schedulable yet. The job's sync mutex is supposed to be held already */ unsigned _starpu_enforce_deps_and_schedule(struct _starpu_job *j); unsigned _starpu_enforce_deps_starting_from_task(struct _starpu_job *j); #ifdef STARPU_OPENMP /* When waking up a continuation, we only enforce new task dependencies */ unsigned _starpu_reenforce_task_deps_and_schedule(struct _starpu_job *j); #endif /* Called at the submission of the job */ void _starpu_handle_job_submission(struct _starpu_job *j); /* This function must be called after the execution of a job, this triggers all * job's dependencies and perform the callback function if any. */ void _starpu_handle_job_termination(struct _starpu_job *j); /* Get the sum of the size of the data accessed by the job. */ size_t _starpu_job_get_data_size(struct starpu_perfmodel *model, struct starpu_perfmodel_arch* arch, unsigned nimpl, struct _starpu_job *j); /* Get a task from the local pool of tasks that were explicitly attributed to * that worker. */ struct starpu_task *_starpu_pop_local_task(struct _starpu_worker *worker); /* Put a task into the pool of tasks that are explicitly attributed to the * specified worker. If "back" is set, the task is put at the back of the list. * Considering the tasks are popped from the back, this value should be 0 to * enforce a FIFO ordering. */ int _starpu_push_local_task(struct _starpu_worker *worker, struct starpu_task *task, int prio); #define _STARPU_JOB_GET_ORDERED_BUFFER_HANDLE(job, i) ((job->dyn_ordered_buffers) ? job->dyn_ordered_buffers[i].handle : job->ordered_buffers[i].handle) #define _STARPU_JOB_GET_ORDERED_BUFFER_MODE(job, i) ((job->dyn_ordered_buffers) ? job->dyn_ordered_buffers[i].mode : job->ordered_buffers[i].mode) #define _STARPU_JOB_GET_ORDERED_BUFFER_NODE(job, i) ((job->dyn_ordered_buffers) ? job->dyn_ordered_buffers[i].node : job->ordered_buffers[i].node) #define _STARPU_JOB_SET_ORDERED_BUFFER_HANDLE(job, handle, i) do { if (job->dyn_ordered_buffers) job->dyn_ordered_buffers[i].handle = (handle); else job->ordered_buffers[i].handle = (handle);} while(0) #define _STARPU_JOB_SET_ORDERED_BUFFER_MODE(job, __mode, i) do { if (job->dyn_ordered_buffers) job->dyn_ordered_buffers[i].mode = __mode; else job->ordered_buffers[i].mode = __mode;} while(0) #define _STARPU_JOB_SET_ORDERED_BUFFER_NODE(job, __node, i) do { if (job->dyn_ordered_buffers) job->dyn_ordered_buffers[i].node = __node; else job->ordered_buffers[i].node = __node;} while(0) #define _STARPU_JOB_SET_ORDERED_BUFFER(job, buffer, i) do { if (job->dyn_ordered_buffers) job->dyn_ordered_buffers[i] = buffer; else job->ordered_buffers[i] = buffer;} while(0) #define _STARPU_JOB_GET_ORDERED_BUFFERS(job) (job->dyn_ordered_buffers) ? job->dyn_ordered_buffers : job->ordered_buffers #define _STARPU_JOB_GET_DEP_SLOTS(job) (((job)->dyn_dep_slots) ? (job)->dyn_dep_slots : (job)->dep_slots) #endif // __JOBS_H__ starpu-1.2.3+dfsg/src/core/parallel_task.c000066400000000000000000000041741320135501600204550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2014-2015 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include struct starpu_task *starpu_task_dup(struct starpu_task *task) { struct starpu_task *task_dup; _STARPU_MALLOC(task_dup, sizeof(struct starpu_task)); /* TODO perhaps this is a bit too much overhead and we should only copy * part of the structure ? */ memcpy(task_dup, task, sizeof(struct starpu_task)); return task_dup; } void starpu_parallel_task_barrier_init_n(struct starpu_task* task, int worker_size) { struct _starpu_job *j = _starpu_get_job_associated_to_task(task); j->task_size = worker_size; j->combined_workerid = -1; j->active_task_alias_count = 0; //fprintf(stderr, "POP -> size %d best_size %d\n", worker_size, best_size); STARPU_PTHREAD_BARRIER_INIT(&j->before_work_barrier, NULL, worker_size); STARPU_PTHREAD_BARRIER_INIT(&j->after_work_barrier, NULL, worker_size); j->after_work_busy_barrier = worker_size; return; } void starpu_parallel_task_barrier_init(struct starpu_task* task, int workerid) { /* The master needs to dispatch the task between the * different combined workers */ struct _starpu_combined_worker *combined_worker = _starpu_get_combined_worker_struct(workerid); int worker_size = combined_worker->worker_size; struct _starpu_job *j = _starpu_get_job_associated_to_task(task); starpu_parallel_task_barrier_init_n(task, worker_size); j->combined_workerid = workerid; } starpu-1.2.3+dfsg/src/core/perfmodel/000077500000000000000000000000001320135501600174425ustar00rootroot00000000000000starpu-1.2.3+dfsg/src/core/perfmodel/perfmodel.c000066400000000000000000000361661320135501600215770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include #include #ifdef STARPU_HAVE_WINDOWS #include #endif /* This flag indicates whether performance models should be calibrated or not. * 0: models need not be calibrated * 1: models must be calibrated * 2: models must be calibrated, existing models are overwritten. */ static unsigned calibrate_flag = 0; void _starpu_set_calibrate_flag(unsigned val) { calibrate_flag = val; } unsigned _starpu_get_calibrate_flag(void) { return calibrate_flag; } struct starpu_perfmodel_arch* starpu_worker_get_perf_archtype(int workerid, unsigned sched_ctx_id) { STARPU_ASSERT(workerid>=0); if(sched_ctx_id != STARPU_NMAX_SCHED_CTXS) { unsigned child_sched_ctx = starpu_sched_ctx_worker_is_master_for_child_ctx(workerid, sched_ctx_id); if(child_sched_ctx != STARPU_NMAX_SCHED_CTXS) return _starpu_sched_ctx_get_perf_archtype(child_sched_ctx); } struct _starpu_machine_config *config = _starpu_get_machine_config(); /* This workerid may either be a basic worker or a combined worker */ unsigned nworkers = config->topology.nworkers; if (workerid < (int)config->topology.nworkers) return &config->workers[workerid].perf_arch; /* We have a combined worker */ unsigned ncombinedworkers = config->topology.ncombinedworkers; STARPU_ASSERT(workerid < (int)(ncombinedworkers + nworkers)); return &config->combined_workers[workerid - nworkers].perf_arch; } /* * PER ARCH model */ static double per_arch_task_expected_perf(struct starpu_perfmodel *model, struct starpu_perfmodel_arch * arch, struct starpu_task *task, unsigned nimpl) { int comb; double (*per_arch_cost_function)(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl); if (model->arch_cost_function) return model->arch_cost_function(task, arch, nimpl); comb = starpu_perfmodel_arch_comb_get(arch->ndevices, arch->devices); STARPU_ASSERT_MSG(comb != -1, "Didn't find the proper arch combination\n"); STARPU_ASSERT_MSG(model->state->per_arch[comb] != NULL, "STARPU_PER_ARCH needs per-arch cost_function to be defined"); per_arch_cost_function = model->state->per_arch[comb][nimpl].cost_function; STARPU_ASSERT_MSG(per_arch_cost_function, "STARPU_PER_ARCH needs per-arch cost_function to be defined"); return per_arch_cost_function(task, arch, nimpl); } /* * Common model */ double starpu_worker_get_relative_speedup(struct starpu_perfmodel_arch* perf_arch) { double speedup = 0; int dev; for(dev = 0; dev < perf_arch->ndevices; dev++) { double coef = 0.0; if (perf_arch->devices[dev].type == STARPU_CPU_WORKER) coef = _STARPU_CPU_ALPHA; else if (perf_arch->devices[dev].type == STARPU_CUDA_WORKER) coef = _STARPU_CUDA_ALPHA; else if (perf_arch->devices[dev].type == STARPU_OPENCL_WORKER) coef = _STARPU_OPENCL_ALPHA; else if (perf_arch->devices[dev].type == STARPU_MIC_WORKER) coef = _STARPU_MIC_ALPHA; else if (perf_arch->devices[dev].type == STARPU_SCC_WORKER) coef = _STARPU_SCC_ALPHA; speedup += coef * (perf_arch->devices[dev].ncores); } return speedup; } static double common_task_expected_perf(struct starpu_perfmodel *model, struct starpu_perfmodel_arch* arch, struct starpu_task *task, unsigned nimpl) { double exp; double alpha; STARPU_ASSERT_MSG(model->cost_function, "STARPU_COMMON requires common cost_function to be defined"); exp = model->cost_function(task, nimpl); alpha = starpu_worker_get_relative_speedup(arch); STARPU_ASSERT(!_STARPU_IS_ZERO(alpha)); return exp/alpha; } void _starpu_init_and_load_perfmodel(struct starpu_perfmodel *model) { if (!model || model->is_loaded) return; starpu_perfmodel_init(model); if (model->is_loaded) return; switch (model->type) { case STARPU_PER_ARCH: case STARPU_COMMON: /* Nothing more to do than init */ break; case STARPU_HISTORY_BASED: case STARPU_NL_REGRESSION_BASED: _starpu_load_history_based_model(model, 1); break; case STARPU_REGRESSION_BASED: _starpu_load_history_based_model(model, 0); break; default: STARPU_ABORT(); } model->is_loaded = 1; } static double starpu_model_expected_perf(struct starpu_task *task, struct starpu_perfmodel *model, struct starpu_perfmodel_arch* arch, unsigned nimpl) { if (model) { _starpu_init_and_load_perfmodel(model); struct _starpu_job *j = _starpu_get_job_associated_to_task(task); switch (model->type) { case STARPU_PER_ARCH: return per_arch_task_expected_perf(model, arch, task, nimpl); case STARPU_COMMON: return common_task_expected_perf(model, arch, task, nimpl); case STARPU_HISTORY_BASED: return _starpu_history_based_job_expected_perf(model, arch, j, nimpl); case STARPU_REGRESSION_BASED: return _starpu_regression_based_job_expected_perf(model, arch, j, nimpl); case STARPU_NL_REGRESSION_BASED: return _starpu_non_linear_regression_based_job_expected_perf(model, arch, j,nimpl); default: STARPU_ABORT(); } } /* no model was found */ return 0.0; } double starpu_task_expected_length(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { if (!task->cl) /* Tasks without codelet don't actually take time */ return 0.0; return starpu_model_expected_perf(task, task->cl->model, arch, nimpl); } double starpu_task_expected_energy(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { if (!task->cl) /* Tasks without codelet don't actually take time */ return 0.0; return starpu_model_expected_perf(task, task->cl->energy_model, arch, nimpl); } double starpu_task_expected_conversion_time(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { unsigned i; double sum = 0.0; enum starpu_node_kind node_kind; unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); #ifdef STARPU_DEVEL #warning TODO: conversion time with combined arch perfmodel #endif STARPU_ASSERT_MSG(arch->ndevices == 1, "TODO"); for (i = 0; i < nbuffers; i++) { starpu_data_handle_t handle; struct starpu_task *conversion_task; handle = STARPU_TASK_GET_HANDLE(task, i); if (!_starpu_data_is_multiformat_handle(handle)) continue; switch(arch->devices[0].type) { case STARPU_CPU_WORKER: node_kind = STARPU_CPU_RAM; break; case STARPU_CUDA_WORKER: node_kind = STARPU_CUDA_RAM; break; case STARPU_OPENCL_WORKER: node_kind = STARPU_OPENCL_RAM; break; case STARPU_MIC_WORKER: node_kind = STARPU_MIC_RAM; break; case STARPU_SCC_WORKER: node_kind = STARPU_SCC_RAM; break; default: STARPU_ABORT(); break; } if (!_starpu_handle_needs_conversion_task_for_arch(handle, node_kind)) continue; conversion_task = _starpu_create_conversion_task_for_arch(handle, node_kind); sum += starpu_task_expected_length(conversion_task, arch, nimpl); _starpu_spin_lock(&handle->header_lock); handle->refcnt--; handle->busy_count--; if (!_starpu_data_check_not_busy(handle)) _starpu_spin_unlock(&handle->header_lock); starpu_task_clean(conversion_task); free(conversion_task); } return sum; } /* Predict the transfer time (in µs) to move a handle to a memory node */ double starpu_data_expected_transfer_time(starpu_data_handle_t handle, unsigned memory_node, enum starpu_data_access_mode mode) { /* If we don't need to read the content of the handle */ if (!(mode & STARPU_R)) return 0.0; if (_starpu_is_data_present_or_requested(handle, memory_node)) return 0.0; size_t size = _starpu_data_get_size(handle); /* XXX in case we have an abstract piece of data (eg. with the * void interface, this does not introduce any overhead, and we * don't even want to consider the latency that is not * relevant). */ if (size == 0) return 0.0; int src_node = _starpu_select_src_node(handle, memory_node); if (src_node < 0) /* Will just create it in place. Ideally we should take the * time to create it into account */ return 0.0; return starpu_transfer_predict(src_node, memory_node, size); } /* Data transfer performance modeling */ double starpu_task_expected_data_transfer_time(unsigned memory_node, struct starpu_task *task) { unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); unsigned buffer; double penalty = 0.0; for (buffer = 0; buffer < nbuffers; buffer++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, buffer); enum starpu_data_access_mode mode = STARPU_TASK_GET_MODE(task, buffer); penalty += starpu_data_expected_transfer_time(handle, memory_node, mode); } return penalty; } /* Return the expected duration of the entire task bundle in µs */ double starpu_task_bundle_expected_length(starpu_task_bundle_t bundle, struct starpu_perfmodel_arch* arch, unsigned nimpl) { double expected_length = 0.0; /* We expect the length of the bundle the be the sum of the different tasks length. */ STARPU_PTHREAD_MUTEX_LOCK(&bundle->mutex); struct _starpu_task_bundle_entry *entry; entry = bundle->list; while (entry) { if(!entry->task->scheduled) { double task_length = starpu_task_expected_length(entry->task, arch, nimpl); /* In case the task is not calibrated, we consider the task * ends immediately. */ if (task_length > 0.0) expected_length += task_length; } entry = entry->next; } STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); return expected_length; } /* Return the expected energy consumption of the entire task bundle in J */ double starpu_task_bundle_expected_energy(starpu_task_bundle_t bundle, struct starpu_perfmodel_arch* arch, unsigned nimpl) { double expected_energy = 0.0; /* We expect total consumption of the bundle the be the sum of the different tasks consumption. */ STARPU_PTHREAD_MUTEX_LOCK(&bundle->mutex); struct _starpu_task_bundle_entry *entry; entry = bundle->list; while (entry) { double task_energy = starpu_task_expected_energy(entry->task, arch, nimpl); /* In case the task is not calibrated, we consider the task * ends immediately. */ if (task_energy > 0.0) expected_energy += task_energy; entry = entry->next; } STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); return expected_energy; } /* Return the time (in µs) expected to transfer all data used within the bundle */ double starpu_task_bundle_expected_data_transfer_time(starpu_task_bundle_t bundle, unsigned memory_node) { STARPU_PTHREAD_MUTEX_LOCK(&bundle->mutex); struct _starpu_handle_list *handles = NULL; /* We list all the handle that are accessed within the bundle. */ /* For each task in the bundle */ struct _starpu_task_bundle_entry *entry = bundle->list; while (entry) { struct starpu_task *task = entry->task; if (task->cl) { unsigned b; unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); for (b = 0; b < nbuffers; b++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, b); enum starpu_data_access_mode mode = STARPU_TASK_GET_MODE(task, b); if (!(mode & STARPU_R)) continue; /* Insert the handle in the sorted list in case * it's not already in that list. */ _insertion_handle_sorted(&handles, handle, mode); } } entry = entry->next; } STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); /* Compute the sum of data transfer time, and destroy the list */ double total_exp = 0.0; while (handles) { struct _starpu_handle_list *current = handles; handles = handles->next; double exp; exp = starpu_data_expected_transfer_time(current->handle, memory_node, current->mode); total_exp += exp; free(current); } return total_exp; } static int directory_existence_was_tested = 0; static char *_perf_model_dir = NULL; static char *_perf_model_dir_codelet = NULL; static char *_perf_model_dir_bus = NULL; static char *_perf_model_dir_debug = NULL; #define _PERF_MODEL_DIR_MAXLEN 256 void _starpu_set_perf_model_dirs() { _STARPU_MALLOC(_perf_model_dir, _PERF_MODEL_DIR_MAXLEN); _STARPU_MALLOC(_perf_model_dir_codelet, _PERF_MODEL_DIR_MAXLEN); _STARPU_MALLOC(_perf_model_dir_bus, _PERF_MODEL_DIR_MAXLEN); _STARPU_MALLOC(_perf_model_dir_debug, _PERF_MODEL_DIR_MAXLEN); #ifdef STARPU_PERF_MODEL_DIR /* use the directory specified at configure time */ snprintf(_perf_model_dir, _PERF_MODEL_DIR_MAXLEN, "%s", (char *)STARPU_PERF_MODEL_DIR); #else snprintf(_perf_model_dir, _PERF_MODEL_DIR_MAXLEN, "%s/.starpu/sampling/", _starpu_get_home_path()); #endif char *path = starpu_getenv("STARPU_PERF_MODEL_DIR"); if (path) { snprintf(_perf_model_dir, _PERF_MODEL_DIR_MAXLEN, "%s/", path); } snprintf(_perf_model_dir_codelet, _PERF_MODEL_DIR_MAXLEN, "%s/codelets/%d/", _perf_model_dir, _STARPU_PERFMODEL_VERSION); snprintf(_perf_model_dir_bus, _PERF_MODEL_DIR_MAXLEN, "%s/bus/", _perf_model_dir); snprintf(_perf_model_dir_debug, _PERF_MODEL_DIR_MAXLEN, "%s/debug/", _perf_model_dir); } char *_starpu_get_perf_model_dir_codelet() { _starpu_create_sampling_directory_if_needed(); return _perf_model_dir_codelet; } char *_starpu_get_perf_model_dir_bus() { _starpu_create_sampling_directory_if_needed(); return _perf_model_dir_bus; } char *_starpu_get_perf_model_dir_debug() { _starpu_create_sampling_directory_if_needed(); return _perf_model_dir_debug; } void _starpu_create_sampling_directory_if_needed(void) { if (!directory_existence_was_tested) { _starpu_set_perf_model_dirs(); /* The performance of the codelets are stored in * $STARPU_PERF_MODEL_DIR/codelets/ while those of the bus are stored in * $STARPU_PERF_MODEL_DIR/bus/ so that we don't have name collisions */ /* Testing if a directory exists and creating it otherwise may not be safe: it is possible that the permission are changed in between. Instead, we create it and check if it already existed before */ _starpu_mkpath_and_check(_perf_model_dir, S_IRWXU); /* Per-task performance models */ _starpu_mkpath_and_check(_perf_model_dir_codelet, S_IRWXU); /* Performance of the memory subsystem */ _starpu_mkpath_and_check(_perf_model_dir_bus, S_IRWXU); /* Performance debug measurements */ _starpu_mkpath(_perf_model_dir_debug, S_IRWXU); directory_existence_was_tested = 1; } } void starpu_perfmodel_free_sampling_directories(void) { free(_perf_model_dir); _perf_model_dir = NULL; free(_perf_model_dir_codelet); _perf_model_dir_codelet = NULL; free(_perf_model_dir_bus); _perf_model_dir_bus = NULL; free(_perf_model_dir_debug); _perf_model_dir_debug = NULL; directory_existence_was_tested = 0; } starpu-1.2.3+dfsg/src/core/perfmodel/perfmodel.h000066400000000000000000000077631320135501600216050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2017 CNRS * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __PERFMODEL_H__ #define __PERFMODEL_H__ #include #include #include #include #ifdef __cplusplus extern "C" { #endif /** * Performance models files are stored in a directory whose name * include the version of the performance model format. The version * number is also written in the file itself. * When updating the format, the variable _STARPU_PERFMODEL_VERSION * should be updated. It is then possible to switch easily between * differents versions of StarPU having different performance model * formats. */ #define _STARPU_PERFMODEL_VERSION 44 struct _starpu_perfmodel_state { struct starpu_perfmodel_per_arch** per_arch; /*STARPU_MAXIMPLEMENTATIONS*/ int** per_arch_is_set; /*STARPU_MAXIMPLEMENTATIONS*/ starpu_pthread_rwlock_t model_rwlock; int *nimpls; int *nimpls_set; int ncombs; /* The number of combinations currently used by the model */ int ncombs_set; /* The number of combinations allocated in the array nimpls and ncombs */ int *combs; }; struct starpu_data_descr; struct _starpu_job; struct starpu_perfmodel_arch; extern unsigned _starpu_calibration_minimum; char *_starpu_get_perf_model_dir_codelet(); char *_starpu_get_perf_model_dir_bus(); char *_starpu_get_perf_model_dir_debug(); double _starpu_history_based_job_expected_perf(struct starpu_perfmodel *model, struct starpu_perfmodel_arch* arch, struct _starpu_job *j, unsigned nimpl); void _starpu_load_history_based_model(struct starpu_perfmodel *model, unsigned scan_history); void _starpu_init_and_load_perfmodel(struct starpu_perfmodel *model); void _starpu_initialize_registered_performance_models(void); void _starpu_deinitialize_registered_performance_models(void); void _starpu_deinitialize_performance_model(struct starpu_perfmodel *model); double _starpu_regression_based_job_expected_perf(struct starpu_perfmodel *model, struct starpu_perfmodel_arch* arch, struct _starpu_job *j, unsigned nimpl); double _starpu_non_linear_regression_based_job_expected_perf(struct starpu_perfmodel *model, struct starpu_perfmodel_arch* arch, struct _starpu_job *j, unsigned nimpl); void _starpu_update_perfmodel_history(struct _starpu_job *j, struct starpu_perfmodel *model, struct starpu_perfmodel_arch * arch, unsigned cpuid, double measured, unsigned nimpl); int _starpu_perfmodel_create_comb_if_needed(struct starpu_perfmodel_arch* arch); void _starpu_create_sampling_directory_if_needed(void); void _starpu_load_bus_performance_files(void); void _starpu_set_calibrate_flag(unsigned val); unsigned _starpu_get_calibrate_flag(void); #if defined(STARPU_USE_CUDA) int *_starpu_get_cuda_affinity_vector(unsigned gpuid); #endif #if defined(STARPU_USE_OPENCL) int *_starpu_get_opencl_affinity_vector(unsigned gpuid); #endif void _starpu_save_bandwidth_and_latency_disk(double bandwidth_write, double bandwidth_read, double latency_write, double latency_read, unsigned node, const char *name); void _starpu_write_double(FILE *f, const char *format, double val); int _starpu_read_double(FILE *f, char *format, double *val); void _starpu_simgrid_get_platform_path(int version, char *path, size_t maxlen); void _starpu_perfmodel_realloc(struct starpu_perfmodel *model, int nb); #ifdef __cplusplus } #endif #endif // __PERFMODEL_H__ starpu-1.2.3+dfsg/src/core/perfmodel/perfmodel_bus.c000066400000000000000000002143301320135501600224370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2017 CNRS * Copyright (C) 2013 Corentin Salingue * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifdef STARPU_USE_CUDA #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #endif #include #include #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include #ifdef STARPU_USE_OPENCL #include #endif #ifdef STARPU_HAVE_WINDOWS #include #endif #if defined(HAVE_DECL_HWLOC_CUDA_GET_DEVICE_OSDEV_BY_INDEX) && HAVE_DECL_HWLOC_CUDA_GET_DEVICE_OSDEV_BY_INDEX #include #endif #define SIZE (32*1024*1024*sizeof(char)) #define NITER 32 #define PATH_LENGTH 256 #ifndef STARPU_SIMGRID static void _starpu_bus_force_sampling(void); #endif /* timing is in µs per byte (i.e. slowness, inverse of bandwidth) */ struct dev_timing { int cpu_id; double timing_htod; double latency_htod; double timing_dtoh; double latency_dtoh; }; /* TODO: measure latency */ static double bandwidth_matrix[STARPU_MAXNODES][STARPU_MAXNODES]; static double latency_matrix[STARPU_MAXNODES][STARPU_MAXNODES]; static unsigned was_benchmarked = 0; #ifndef STARPU_SIMGRID static unsigned ncpus = 0; #endif static unsigned ncuda = 0; static unsigned nopencl = 0; static unsigned nmic = 0; /* Benchmarking the performance of the bus */ #ifndef STARPU_SIMGRID static uint64_t cuda_size[STARPU_MAXCUDADEVS]; #endif #ifdef STARPU_USE_CUDA /* preference order of cores (logical indexes) */ static int cuda_affinity_matrix[STARPU_MAXCUDADEVS][STARPU_MAXCPUS]; #ifndef STARPU_SIMGRID static double cudadev_timing_htod[STARPU_MAXNODES] = {0.0}; static double cudadev_latency_htod[STARPU_MAXNODES] = {0.0}; static double cudadev_timing_dtoh[STARPU_MAXNODES] = {0.0}; static double cudadev_latency_dtoh[STARPU_MAXNODES] = {0.0}; #ifdef HAVE_CUDA_MEMCPY_PEER static double cudadev_timing_dtod[STARPU_MAXNODES][STARPU_MAXNODES] = {{0.0}}; static double cudadev_latency_dtod[STARPU_MAXNODES][STARPU_MAXNODES] = {{0.0}}; #endif #endif static struct dev_timing cudadev_timing_per_cpu[STARPU_MAXNODES*STARPU_MAXCPUS]; #endif #ifndef STARPU_SIMGRID static uint64_t opencl_size[STARPU_MAXCUDADEVS]; #endif #ifdef STARPU_USE_OPENCL /* preference order of cores (logical indexes) */ static int opencl_affinity_matrix[STARPU_MAXOPENCLDEVS][STARPU_MAXCPUS]; #ifndef STARPU_SIMGRID static double opencldev_timing_htod[STARPU_MAXNODES] = {0.0}; static double opencldev_latency_htod[STARPU_MAXNODES] = {0.0}; static double opencldev_timing_dtoh[STARPU_MAXNODES] = {0.0}; static double opencldev_latency_dtoh[STARPU_MAXNODES] = {0.0}; #endif static struct dev_timing opencldev_timing_per_cpu[STARPU_MAXNODES*STARPU_MAXCPUS]; #endif #ifdef STARPU_USE_MIC static double mic_time_host_to_device[STARPU_MAXNODES] = {0.0}; static double mic_time_device_to_host[STARPU_MAXNODES] = {0.0}; #endif /* STARPU_USE_MIC */ #ifdef STARPU_HAVE_HWLOC static hwloc_topology_t hwtopology; #endif #if (defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL)) && !defined(STARPU_SIMGRID) #ifdef STARPU_USE_CUDA static void measure_bandwidth_between_host_and_dev_on_cpu_with_cuda(int dev, int cpu, struct dev_timing *dev_timing_per_cpu) { struct _starpu_machine_config *config = _starpu_get_machine_config(); _starpu_bind_thread_on_cpu(config, cpu, STARPU_NOWORKERID); size_t size = SIZE; /* Initialize CUDA context on the device */ /* We do not need to enable OpenGL interoperability at this point, * since we cleanly shutdown CUDA before returning. */ cudaSetDevice(dev); /* hack to avoid third party libs to rebind threads */ _starpu_bind_thread_on_cpu(config, cpu, STARPU_NOWORKERID); /* hack to force the initialization */ cudaFree(0); /* hack to avoid third party libs to rebind threads */ _starpu_bind_thread_on_cpu(config, cpu, STARPU_NOWORKERID); /* Get the maximum size which can be allocated on the device */ struct cudaDeviceProp prop; cudaError_t cures; cures = cudaGetDeviceProperties(&prop, dev); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); cuda_size[dev] = prop.totalGlobalMem; if (size > prop.totalGlobalMem/4) size = prop.totalGlobalMem/4; /* Allocate a buffer on the device */ unsigned char *d_buffer; cures = cudaMalloc((void **)&d_buffer, size); STARPU_ASSERT(cures == cudaSuccess); /* hack to avoid third party libs to rebind threads */ _starpu_bind_thread_on_cpu(config, cpu, STARPU_NOWORKERID); /* Allocate a buffer on the host */ unsigned char *h_buffer; cures = cudaHostAlloc((void **)&h_buffer, size, 0); STARPU_ASSERT(cures == cudaSuccess); /* hack to avoid third party libs to rebind threads */ _starpu_bind_thread_on_cpu(config, cpu, STARPU_NOWORKERID); /* Fill them */ memset(h_buffer, 0, size); cudaMemset(d_buffer, 0, size); /* hack to avoid third party libs to rebind threads */ _starpu_bind_thread_on_cpu(config, cpu, STARPU_NOWORKERID); unsigned iter; double timing; double start; double end; /* Measure upload bandwidth */ start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { cudaMemcpy(d_buffer, h_buffer, size, cudaMemcpyHostToDevice); cudaThreadSynchronize(); } end = starpu_timing_now(); timing = end - start; dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].timing_htod = timing/NITER/size; /* Measure download bandwidth */ start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { cudaMemcpy(h_buffer, d_buffer, size, cudaMemcpyDeviceToHost); cudaThreadSynchronize(); } end = starpu_timing_now(); timing = end - start; dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].timing_dtoh = timing/NITER/size; /* Measure upload latency */ start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { cudaMemcpy(d_buffer, h_buffer, 1, cudaMemcpyHostToDevice); cudaThreadSynchronize(); } end = starpu_timing_now(); timing = end - start; dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].latency_htod = timing/NITER; /* Measure download latency */ start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { cudaMemcpy(h_buffer, d_buffer, 1, cudaMemcpyDeviceToHost); cudaThreadSynchronize(); } end = starpu_timing_now(); timing = end - start; dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].latency_dtoh = timing/NITER; /* Free buffers */ cudaFreeHost(h_buffer); cudaFree(d_buffer); cudaThreadExit(); } #ifdef HAVE_CUDA_MEMCPY_PEER static void measure_bandwidth_between_dev_and_dev_cuda(int src, int dst) { size_t size = SIZE; int can; /* Get the maximum size which can be allocated on the device */ struct cudaDeviceProp prop; cudaError_t cures; cures = cudaGetDeviceProperties(&prop, src); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); if (size > prop.totalGlobalMem/4) size = prop.totalGlobalMem/4; cures = cudaGetDeviceProperties(&prop, dst); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); if (size > prop.totalGlobalMem/4) size = prop.totalGlobalMem/4; /* Initialize CUDA context on the source */ /* We do not need to enable OpenGL interoperability at this point, * since we cleanly shutdown CUDA before returning. */ cudaSetDevice(src); if (starpu_get_env_number("STARPU_ENABLE_CUDA_GPU_GPU_DIRECT") != 0) { cures = cudaDeviceCanAccessPeer(&can, src, dst); if (!cures && can) { cures = cudaDeviceEnablePeerAccess(dst, 0); if (!cures) _STARPU_DISP("GPU-Direct %d -> %d\n", dst, src); } } /* Allocate a buffer on the device */ unsigned char *s_buffer; cures = cudaMalloc((void **)&s_buffer, size); STARPU_ASSERT(cures == cudaSuccess); cudaMemset(s_buffer, 0, size); /* Initialize CUDA context on the destination */ /* We do not need to enable OpenGL interoperability at this point, * since we cleanly shutdown CUDA before returning. */ cudaSetDevice(dst); if (starpu_get_env_number("STARPU_ENABLE_CUDA_GPU_GPU_DIRECT") != 0) { cures = cudaDeviceCanAccessPeer(&can, dst, src); if (!cures && can) { cures = cudaDeviceEnablePeerAccess(src, 0); if (!cures) _STARPU_DISP("GPU-Direct %d -> %d\n", src, dst); } } /* Allocate a buffer on the device */ unsigned char *d_buffer; cures = cudaMalloc((void **)&d_buffer, size); STARPU_ASSERT(cures == cudaSuccess); cudaMemset(d_buffer, 0, size); unsigned iter; double timing; double start; double end; /* Measure upload bandwidth */ start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { cudaMemcpyPeer(d_buffer, dst, s_buffer, src, size); cudaThreadSynchronize(); } end = starpu_timing_now(); timing = end - start; cudadev_timing_dtod[src+1][dst+1] = timing/NITER/size; /* Measure upload latency */ start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { cudaMemcpyPeer(d_buffer, dst, s_buffer, src, 1); cudaThreadSynchronize(); } end = starpu_timing_now(); timing = end - start; cudadev_latency_dtod[src+1][dst+1] = timing/NITER; /* Free buffers */ cudaFree(d_buffer); cudaSetDevice(src); cudaFree(s_buffer); cudaThreadExit(); } #endif #endif #ifdef STARPU_USE_OPENCL static void measure_bandwidth_between_host_and_dev_on_cpu_with_opencl(int dev, int cpu, struct dev_timing *dev_timing_per_cpu) { cl_context context; cl_command_queue queue; cl_int err=0; size_t size = SIZE; int not_initialized; struct _starpu_machine_config *config = _starpu_get_machine_config(); _starpu_bind_thread_on_cpu(config, cpu, STARPU_NOWORKERID); /* Is the context already initialised ? */ starpu_opencl_get_context(dev, &context); not_initialized = (context == NULL); if (not_initialized == 1) _starpu_opencl_init_context(dev); /* Get context and queue */ starpu_opencl_get_context(dev, &context); starpu_opencl_get_queue(dev, &queue); /* Get the maximum size which can be allocated on the device */ cl_device_id device; cl_ulong maxMemAllocSize, totalGlobalMem; starpu_opencl_get_device(dev, &device); err = clGetDeviceInfo(device, CL_DEVICE_MAX_MEM_ALLOC_SIZE, sizeof(maxMemAllocSize), &maxMemAllocSize, NULL); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); if (size > (size_t)maxMemAllocSize/4) size = maxMemAllocSize/4; err = clGetDeviceInfo(device, CL_DEVICE_GLOBAL_MEM_SIZE , sizeof(totalGlobalMem), &totalGlobalMem, NULL); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); opencl_size[dev] = totalGlobalMem; if (_starpu_opencl_get_device_type(dev) == CL_DEVICE_TYPE_CPU) { /* Let's not use too much RAM when running OpenCL on a CPU: it * would make the OS swap like crazy. */ size /= 2; } /* hack to avoid third party libs to rebind threads */ _starpu_bind_thread_on_cpu(config, cpu, STARPU_NOWORKERID); /* Allocate a buffer on the device */ cl_mem d_buffer; d_buffer = clCreateBuffer(context, CL_MEM_READ_WRITE, size, NULL, &err); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); /* hack to avoid third party libs to rebind threads */ _starpu_bind_thread_on_cpu(config, cpu, STARPU_NOWORKERID); /* Allocate a buffer on the host */ unsigned char *h_buffer; _STARPU_MALLOC(h_buffer, size); /* hack to avoid third party libs to rebind threads */ _starpu_bind_thread_on_cpu(config, cpu, STARPU_NOWORKERID); /* Fill them */ memset(h_buffer, 0, size); err = clEnqueueWriteBuffer(queue, d_buffer, CL_TRUE, 0, size, h_buffer, 0, NULL, NULL); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); /* hack to avoid third party libs to rebind threads */ _starpu_bind_thread_on_cpu(config, cpu, STARPU_NOWORKERID); unsigned iter; double timing; double start; double end; /* Measure upload bandwidth */ start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { err = clEnqueueWriteBuffer(queue, d_buffer, CL_TRUE, 0, size, h_buffer, 0, NULL, NULL); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); } end = starpu_timing_now(); timing = end - start; dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].timing_htod = timing/NITER/size; /* Measure download bandwidth */ start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { err = clEnqueueReadBuffer(queue, d_buffer, CL_TRUE, 0, size, h_buffer, 0, NULL, NULL); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); } end = starpu_timing_now(); timing = end - start; dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].timing_dtoh = timing/NITER/size; /* Measure upload latency */ start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { err = clEnqueueWriteBuffer(queue, d_buffer, CL_TRUE, 0, 1, h_buffer, 0, NULL, NULL); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); } end = starpu_timing_now(); timing = end - start; dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].latency_htod = timing/NITER; /* Measure download latency */ start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { err = clEnqueueReadBuffer(queue, d_buffer, CL_TRUE, 0, 1, h_buffer, 0, NULL, NULL); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); } end = starpu_timing_now(); timing = end - start; dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].latency_dtoh = timing/NITER; /* Free buffers */ err = clReleaseMemObject(d_buffer); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); free(h_buffer); /* Uninitiliaze OpenCL context on the device */ if (not_initialized == 1) _starpu_opencl_deinit_context(dev); } #endif /* NB: we want to sort the bandwidth by DECREASING order */ static int compar_dev_timing(const void *left_dev_timing, const void *right_dev_timing) { const struct dev_timing *left = (const struct dev_timing *)left_dev_timing; const struct dev_timing *right = (const struct dev_timing *)right_dev_timing; double left_dtoh = left->timing_dtoh; double left_htod = left->timing_htod; double right_dtoh = right->timing_dtoh; double right_htod = right->timing_htod; double timing_sum2_left = left_dtoh*left_dtoh + left_htod*left_htod; double timing_sum2_right = right_dtoh*right_dtoh + right_htod*right_htod; /* it's for a decreasing sorting */ return (timing_sum2_left > timing_sum2_right); } #ifdef STARPU_HAVE_HWLOC static int find_numa_node(hwloc_obj_t obj) { STARPU_ASSERT(obj); hwloc_obj_t current = obj; while (current->depth != HWLOC_OBJ_NODE) { current = current->parent; /* If we don't find a "node" obj before the root, this means * hwloc does not know whether there are numa nodes or not, so * we should not use a per-node sampling in that case. */ STARPU_ASSERT(current); } STARPU_ASSERT(current->depth == HWLOC_OBJ_NODE); return current->logical_index; } #endif static void measure_bandwidth_between_cpus_and_dev(int dev, struct dev_timing *dev_timing_per_cpu, char *type) { /* Either we have hwloc and we measure the bandwith between each GPU * and each NUMA node, or we don't have such NUMA information and we * measure the bandwith for each pair of (CPU, GPU), which is slower. * */ #ifdef STARPU_HAVE_HWLOC int cpu_depth = hwloc_get_type_depth(hwtopology, HWLOC_OBJ_PU); int nnuma_nodes = hwloc_get_nbobjs_by_depth(hwtopology, HWLOC_OBJ_NODE); /* If no NUMA node was found, we assume that we have a single memory * bank. */ const unsigned no_node_obj_was_found = (nnuma_nodes == 0); unsigned *is_available_per_numa_node = NULL; double *dev_timing_htod_per_numa_node = NULL; double *dev_latency_htod_per_numa_node = NULL; double *dev_timing_dtoh_per_numa_node = NULL; double *dev_latency_dtoh_per_numa_node = NULL; if (!no_node_obj_was_found) { _STARPU_CALLOC(is_available_per_numa_node, nnuma_nodes, sizeof(unsigned)); _STARPU_MALLOC(dev_timing_htod_per_numa_node, nnuma_nodes * sizeof(double)); _STARPU_MALLOC(dev_latency_htod_per_numa_node, nnuma_nodes * sizeof(double)); _STARPU_MALLOC(dev_timing_dtoh_per_numa_node, nnuma_nodes * sizeof(double)); _STARPU_MALLOC(dev_latency_dtoh_per_numa_node, nnuma_nodes * sizeof(double)); } #endif unsigned cpu; for (cpu = 0; cpu < ncpus; cpu++) { dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].cpu_id = cpu; #ifdef STARPU_HAVE_HWLOC int numa_id = 0; if (!no_node_obj_was_found) { hwloc_obj_t obj = hwloc_get_obj_by_depth(hwtopology, cpu_depth, cpu); numa_id = find_numa_node(obj); if (is_available_per_numa_node[numa_id]) { /* We reuse the previous numbers for that NUMA node */ dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].timing_htod = dev_timing_htod_per_numa_node[numa_id]; dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].latency_htod = dev_latency_htod_per_numa_node[numa_id]; dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].timing_dtoh = dev_timing_dtoh_per_numa_node[numa_id]; dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].latency_dtoh = dev_latency_dtoh_per_numa_node[numa_id]; continue; } } #endif #ifdef STARPU_USE_CUDA if (strncmp(type, "CUDA", 4) == 0) measure_bandwidth_between_host_and_dev_on_cpu_with_cuda(dev, cpu, dev_timing_per_cpu); #endif #ifdef STARPU_USE_OPENCL if (strncmp(type, "OpenCL", 6) == 0) measure_bandwidth_between_host_and_dev_on_cpu_with_opencl(dev, cpu, dev_timing_per_cpu); #endif #ifdef STARPU_HAVE_HWLOC if (!no_node_obj_was_found && !is_available_per_numa_node[numa_id]) { /* Save the results for that NUMA node */ dev_timing_htod_per_numa_node[numa_id] = dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].timing_htod; dev_latency_htod_per_numa_node[numa_id] = dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].latency_htod; dev_timing_dtoh_per_numa_node[numa_id] = dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].timing_dtoh; dev_latency_dtoh_per_numa_node[numa_id] = dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].latency_dtoh; is_available_per_numa_node[numa_id] = 1; } #endif } #ifdef STARPU_HAVE_HWLOC if (!no_node_obj_was_found) { free(is_available_per_numa_node); free(dev_timing_htod_per_numa_node); free(dev_latency_htod_per_numa_node); free(dev_timing_dtoh_per_numa_node); free(dev_latency_dtoh_per_numa_node); } #endif /* STARPU_HAVE_HWLOC */ } static void measure_bandwidth_between_host_and_dev(int dev, double *dev_timing_htod, double *dev_latency_htod, double *dev_timing_dtoh, double *dev_latency_dtoh, struct dev_timing *dev_timing_per_cpu, char *type) { measure_bandwidth_between_cpus_and_dev(dev, dev_timing_per_cpu, type); /* sort the results */ qsort(&(dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS]), ncpus, sizeof(struct dev_timing), compar_dev_timing); #ifdef STARPU_VERBOSE unsigned cpu; for (cpu = 0; cpu < ncpus; cpu++) { unsigned current_cpu = dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].cpu_id; double bandwidth_dtoh = dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].timing_dtoh; double bandwidth_htod = dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].timing_htod; double bandwidth_sum2 = bandwidth_dtoh*bandwidth_dtoh + bandwidth_htod*bandwidth_htod; _STARPU_DISP("(%10s) BANDWIDTH GPU %d CPU %u - htod %f - dtoh %f - %f\n", type, dev, current_cpu, bandwidth_htod, bandwidth_dtoh, sqrt(bandwidth_sum2)); } unsigned best_cpu = dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+0].cpu_id; _STARPU_DISP("(%10s) BANDWIDTH GPU %d BEST CPU %u\n", type, dev, best_cpu); #endif /* The results are sorted in a decreasing order, so that the best * measurement is currently the first entry. */ dev_timing_dtoh[dev+1] = dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+0].timing_dtoh; dev_latency_dtoh[dev+1] = dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+0].latency_dtoh; dev_timing_htod[dev+1] = dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+0].timing_htod; dev_latency_htod[dev+1] = dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+0].latency_htod; } #endif /* defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) */ static void benchmark_all_gpu_devices(void) { #ifdef STARPU_SIMGRID _STARPU_DISP("can not measure bus in simgrid mode, please run starpu_calibrate_bus in non-simgrid mode to make sure the bus performance model was calibrated\n"); STARPU_ABORT(); #else /* !SIMGRID */ #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) || defined(STARPU_USE_MIC) unsigned i; #endif _STARPU_DEBUG("Benchmarking the speed of the bus\n"); #ifdef STARPU_HAVE_HWLOC hwloc_topology_init(&hwtopology); hwloc_topology_load(hwtopology); #endif #ifdef STARPU_HAVE_HWLOC hwloc_bitmap_t former_cpuset = hwloc_bitmap_alloc(); hwloc_get_cpubind(hwtopology, former_cpuset, HWLOC_CPUBIND_THREAD); #elif __linux__ /* Save the current cpu binding */ cpu_set_t former_process_affinity; int ret; ret = sched_getaffinity(0, sizeof(former_process_affinity), &former_process_affinity); if (ret) { perror("sched_getaffinity"); STARPU_ABORT(); } #else #warning Missing binding support, StarPU will not be able to properly benchmark NUMA topology #endif struct _starpu_machine_config *config = _starpu_get_machine_config(); ncpus = _starpu_topology_get_nhwcpu(config); #ifdef STARPU_USE_CUDA ncuda = _starpu_get_cuda_device_count(); for (i = 0; i < ncuda; i++) { _STARPU_DISP("CUDA %u...\n", i); /* measure bandwidth between Host and Device i */ measure_bandwidth_between_host_and_dev(i, cudadev_timing_htod, cudadev_latency_htod, cudadev_timing_dtoh, cudadev_latency_dtoh, cudadev_timing_per_cpu, "CUDA"); } #ifdef HAVE_CUDA_MEMCPY_PEER for (i = 0; i < ncuda; i++) { unsigned j; for (j = 0; j < ncuda; j++) if (i != j) { _STARPU_DISP("CUDA %u -> %u...\n", i, j); /* measure bandwidth between Host and Device i */ measure_bandwidth_between_dev_and_dev_cuda(i, j); } } #endif #endif #ifdef STARPU_USE_OPENCL nopencl = _starpu_opencl_get_device_count(); for (i = 0; i < nopencl; i++) { _STARPU_DISP("OpenCL %u...\n", i); /* measure bandwith between Host and Device i */ measure_bandwidth_between_host_and_dev(i, opencldev_timing_htod, opencldev_latency_htod, opencldev_timing_dtoh, opencldev_latency_dtoh, opencldev_timing_per_cpu, "OpenCL"); } #endif #ifdef STARPU_USE_MIC /* TODO: implement real calibration ! For now we only put an arbitrary * value for each device during at the declaration as a bug fix, else * we get problems on heft scheduler */ nmic = _starpu_mic_src_get_device_count(); for (i = 0; i < STARPU_MAXNODES; i++) { mic_time_host_to_device[i] = 0.1; mic_time_device_to_host[i] = 0.1; } #endif /* STARPU_USE_MIC */ #ifdef STARPU_HAVE_HWLOC hwloc_set_cpubind(hwtopology, former_cpuset, HWLOC_CPUBIND_THREAD); hwloc_bitmap_free(former_cpuset); #elif __linux__ /* Restore the former affinity */ ret = sched_setaffinity(0, sizeof(former_process_affinity), &former_process_affinity); if (ret) { perror("sched_setaffinity"); STARPU_ABORT(); } #endif #ifdef STARPU_HAVE_HWLOC hwloc_topology_destroy(hwtopology); #endif _STARPU_DEBUG("Benchmarking the speed of the bus is done.\n"); was_benchmarked = 1; #endif /* !SIMGRID */ } static void get_bus_path(const char *type, char *path, size_t maxlen) { char hostname[65]; _starpu_gethostname(hostname, sizeof(hostname)); snprintf(path, maxlen, "%s%s.%s", _starpu_get_perf_model_dir_bus(), hostname, type); } /* * Affinity */ static void get_affinity_path(char *path, size_t maxlen) { get_bus_path("affinity", path, maxlen); } #ifndef STARPU_SIMGRID static void load_bus_affinity_file_content(void) { #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) FILE *f; int locked; char path[PATH_LENGTH]; get_affinity_path(path, sizeof(path)); _STARPU_DEBUG("loading affinities from %s\n", path); f = fopen(path, "r"); STARPU_ASSERT(f); locked = _starpu_frdlock(f) == 0; struct _starpu_machine_config *config = _starpu_get_machine_config(); ncpus = _starpu_topology_get_nhwcpu(config); unsigned gpu; #ifdef STARPU_USE_CUDA ncuda = _starpu_get_cuda_device_count(); for (gpu = 0; gpu < ncuda; gpu++) { int ret; unsigned dummy; _starpu_drop_comments(f); ret = fscanf(f, "%u\t", &dummy); STARPU_ASSERT(ret == 1); STARPU_ASSERT(dummy == gpu); unsigned cpu; for (cpu = 0; cpu < ncpus; cpu++) { ret = fscanf(f, "%d\t", &cuda_affinity_matrix[gpu][cpu]); STARPU_ASSERT(ret == 1); } ret = fscanf(f, "\n"); STARPU_ASSERT(ret == 0); } #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL nopencl = _starpu_opencl_get_device_count(); for (gpu = 0; gpu < nopencl; gpu++) { int ret; unsigned dummy; _starpu_drop_comments(f); ret = fscanf(f, "%u\t", &dummy); STARPU_ASSERT(ret == 1); STARPU_ASSERT(dummy == gpu); unsigned cpu; for (cpu = 0; cpu < ncpus; cpu++) { ret = fscanf(f, "%d\t", &opencl_affinity_matrix[gpu][cpu]); STARPU_ASSERT(ret == 1); } ret = fscanf(f, "\n"); STARPU_ASSERT(ret == 0); } #endif /* !STARPU_USE_OPENCL */ if (locked) _starpu_frdunlock(f); fclose(f); #endif /* !(STARPU_USE_CUDA_ || STARPU_USE_OPENCL */ } #ifndef STARPU_SIMGRID static void write_bus_affinity_file_content(void) { STARPU_ASSERT(was_benchmarked); #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) FILE *f; char path[PATH_LENGTH]; int locked; get_affinity_path(path, sizeof(path)); _STARPU_DEBUG("writing affinities to %s\n", path); f = fopen(path, "w+"); if (!f) { perror("fopen write_buf_affinity_file_content"); _STARPU_DISP("path '%s'\n", path); fflush(stderr); STARPU_ABORT(); } locked = _starpu_frdlock(f) == 0; unsigned cpu; unsigned gpu; fprintf(f, "# GPU\t"); for (cpu = 0; cpu < ncpus; cpu++) fprintf(f, "CPU%u\t", cpu); fprintf(f, "\n"); #ifdef STARPU_USE_CUDA for (gpu = 0; gpu < ncuda; gpu++) { fprintf(f, "%u\t", gpu); for (cpu = 0; cpu < ncpus; cpu++) { fprintf(f, "%d\t", cudadev_timing_per_cpu[(gpu+1)*STARPU_MAXCPUS+cpu].cpu_id); } fprintf(f, "\n"); } #endif #ifdef STARPU_USE_OPENCL for (gpu = 0; gpu < nopencl; gpu++) { fprintf(f, "%u\t", gpu); for (cpu = 0; cpu < ncpus; cpu++) { fprintf(f, "%d\t", opencldev_timing_per_cpu[(gpu+1)*STARPU_MAXCPUS+cpu].cpu_id); } fprintf(f, "\n"); } #endif if (locked) _starpu_frdunlock(f); fclose(f); #endif } #endif /* STARPU_SIMGRID */ static void generate_bus_affinity_file(void) { if (!was_benchmarked) benchmark_all_gpu_devices(); write_bus_affinity_file_content(); } static void load_bus_affinity_file(void) { int res; char path[PATH_LENGTH]; get_affinity_path(path, sizeof(path)); res = access(path, F_OK); if (res) { /* File does not exist yet */ generate_bus_affinity_file(); } load_bus_affinity_file_content(); } #ifdef STARPU_USE_CUDA int *_starpu_get_cuda_affinity_vector(unsigned gpuid) { return cuda_affinity_matrix[gpuid]; } #endif /* STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL int *_starpu_get_opencl_affinity_vector(unsigned gpuid) { return opencl_affinity_matrix[gpuid]; } #endif /* STARPU_USE_OPENCL */ void starpu_bus_print_affinity(FILE *f) { #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) unsigned cpu; unsigned gpu; #endif fprintf(f, "# GPU\tCPU in preference order (logical index)\n"); #ifdef STARPU_USE_CUDA fprintf(f, "# CUDA\n"); for(gpu = 0 ; gpu. Expected a number. Did you change the maximum number of GPUs at ./configure time?\n", path); fclose(f); return 0; } n = getc(f); if (n == '\n') break; if (n != '\t') { _STARPU_DISP("bogus character %c in latency file %s\n", n, path); fclose(f); return 0; } latency_matrix[src][dst] = latency; /* Look out for \t\n */ n = getc(f); if (n == '\n') break; ungetc(n, f); n = '\t'; } /* No more values, take NAN */ for ( ; dst < STARPU_MAXNODES; dst++) latency_matrix[src][dst] = NAN; while (n == '\t') { /* Look out for \t\n */ n = getc(f); if (n == '\n') break; ungetc(n, f); n = _starpu_read_double(f, "%le", &latency); if (n && !isnan(latency)) { _STARPU_DISP("Too many nodes in latency file %s for this configuration (%d). Did you change the maximum number of GPUs at ./configure time?\n", path, STARPU_MAXNODES); fclose(f); return 0; } n = getc(f); } if (n != '\n') { _STARPU_DISP("Bogus character %c in latency file %s\n", n, path); fclose(f); return 0; } /* Look out for EOF */ n = getc(f); if (n == EOF) break; ungetc(n, f); } if (locked) _starpu_frdunlock(f); fclose(f); /* No more values, take NAN */ for ( ; src < STARPU_MAXNODES; src++) for (dst = 0; dst < STARPU_MAXNODES; dst++) latency_matrix[src][dst] = NAN; return 1; } #ifndef STARPU_SIMGRID static void write_bus_latency_file_content(void) { unsigned src, dst, maxnode; FILE *f; int locked; STARPU_ASSERT(was_benchmarked); char path[PATH_LENGTH]; get_latency_path(path, sizeof(path)); _STARPU_DEBUG("writing latencies to %s\n", path); f = fopen(path, "w+"); if (!f) { perror("fopen write_bus_latency_file_content"); _STARPU_DISP("path '%s'\n", path); fflush(stderr); STARPU_ABORT(); } locked = _starpu_fwrlock(f) == 0; _starpu_fftruncate(f, 0); fprintf(f, "# "); for (dst = 0; dst < STARPU_MAXNODES; dst++) fprintf(f, "to %u\t\t", dst); fprintf(f, "\n"); maxnode = ncuda; #ifdef STARPU_USE_OPENCL maxnode += nopencl; #endif #ifdef STARPU_USE_MIC maxnode += nmic; #endif for (src = 0; src < STARPU_MAXNODES; src++) { for (dst = 0; dst < STARPU_MAXNODES; dst++) { double latency = 0.0; if ((src > maxnode) || (dst > maxnode)) { /* convention */ latency = NAN; } else if (src == dst) { latency = 0.0; } else { /* µs */ #ifdef STARPU_USE_CUDA #ifdef HAVE_CUDA_MEMCPY_PEER if (src && src < ncuda && dst && dst <= ncuda) latency = cudadev_latency_dtod[src][dst]; else #endif { if (src && src <= ncuda) latency += cudadev_latency_dtoh[src]; if (dst && dst <= ncuda) latency += cudadev_latency_htod[dst]; } #endif #ifdef STARPU_USE_OPENCL if (src > ncuda) latency += opencldev_latency_dtoh[src-ncuda]; if (dst > ncuda) latency += opencldev_latency_htod[dst-ncuda]; #endif } if (dst) fputc('\t', f); _starpu_write_double(f, "%e", latency); } fprintf(f, "\n"); } if (locked) _starpu_fwrunlock(f); fclose(f); } #endif static void generate_bus_latency_file(void) { if (!was_benchmarked) benchmark_all_gpu_devices(); #ifndef STARPU_SIMGRID write_bus_latency_file_content(); #endif } static void load_bus_latency_file(void) { int res; char path[PATH_LENGTH]; get_latency_path(path, sizeof(path)); res = access(path, F_OK); if (res || !load_bus_latency_file_content()) { /* File does not exist yet or is bogus */ generate_bus_latency_file(); } } /* * Bandwidth */ static void get_bandwidth_path(char *path, size_t maxlen) { get_bus_path("bandwidth", path, maxlen); } static int load_bus_bandwidth_file_content(void) { int n; unsigned src, dst; FILE *f; double bandwidth; int locked; char path[PATH_LENGTH]; get_bandwidth_path(path, sizeof(path)); _STARPU_DEBUG("loading bandwidth from %s\n", path); f = fopen(path, "r"); if (!f) { perror("fopen load_bus_bandwidth_file_content"); _STARPU_DISP("path '%s'\n", path); fflush(stderr); STARPU_ABORT(); } locked = _starpu_frdlock(f) == 0; for (src = 0; src < STARPU_MAXNODES; src++) { _starpu_drop_comments(f); for (dst = 0; dst < STARPU_MAXNODES; dst++) { n = _starpu_read_double(f, "%le", &bandwidth); if (n != 1) { _STARPU_DISP("Error while reading bandwidth file <%s>. Expected a number\n", path); fclose(f); return 0; } n = getc(f); if (n == '\n') break; if (n != '\t') { _STARPU_DISP("bogus character %c in bandwidth file %s\n", n, path); fclose(f); return 0; } bandwidth_matrix[src][dst] = bandwidth; /* Look out for \t\n */ n = getc(f); if (n == '\n') break; ungetc(n, f); n = '\t'; } /* No more values, take NAN */ for ( ; dst < STARPU_MAXNODES; dst++) bandwidth_matrix[src][dst] = NAN; while (n == '\t') { /* Look out for \t\n */ n = getc(f); if (n == '\n') break; ungetc(n, f); n = _starpu_read_double(f, "%le", &bandwidth); if (n && !isnan(bandwidth)) { _STARPU_DISP("Too many nodes in bandwidth file %s for this configuration (%d)\n", path, STARPU_MAXNODES); fclose(f); return 0; } n = getc(f); } if (n != '\n') { _STARPU_DISP("Bogus character %c in bandwidth file %s\n", n, path); fclose(f); return 0; } /* Look out for EOF */ n = getc(f); if (n == EOF) break; ungetc(n, f); } if (locked) _starpu_frdunlock(f); fclose(f); /* No more values, take NAN */ for ( ; src < STARPU_MAXNODES; src++) for (dst = 0; dst < STARPU_MAXNODES; dst++) latency_matrix[src][dst] = NAN; return 1; } #ifndef STARPU_SIMGRID static void write_bus_bandwidth_file_content(void) { unsigned src, dst, maxnode; FILE *f; int locked; STARPU_ASSERT(was_benchmarked); char path[PATH_LENGTH]; get_bandwidth_path(path, sizeof(path)); _STARPU_DEBUG("writing bandwidth to %s\n", path); f = fopen(path, "w+"); STARPU_ASSERT(f); locked = _starpu_fwrlock(f) == 0; _starpu_fftruncate(f, 0); fprintf(f, "# "); for (dst = 0; dst < STARPU_MAXNODES; dst++) fprintf(f, "to %u\t\t", dst); fprintf(f, "\n"); maxnode = ncuda; #ifdef STARPU_USE_OPENCL maxnode += nopencl; #endif #ifdef STARPU_USE_MIC maxnode += nmic; #endif for (src = 0; src < STARPU_MAXNODES; src++) { for (dst = 0; dst < STARPU_MAXNODES; dst++) { double bandwidth; if ((src > maxnode) || (dst > maxnode)) { bandwidth = NAN; } #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) || defined(STARPU_USE_MIC) else if (src != dst) { double slowness = 0.0; /* Total bandwidth is the harmonic mean of bandwidths */ #ifdef STARPU_USE_CUDA #ifdef HAVE_CUDA_MEMCPY_PEER if (src && src <= ncuda && dst && dst <= ncuda) /* Direct GPU-GPU transfert */ slowness = cudadev_timing_dtod[src][dst]; else #endif { if (src && src <= ncuda) slowness += cudadev_timing_dtoh[src]; if (dst && dst <= ncuda) slowness += cudadev_timing_htod[dst]; } #endif /* TODO: generalize computation */ #ifdef STARPU_USE_OPENCL if (src > ncuda && src <= ncuda + nopencl) slowness += opencldev_timing_dtoh[src-ncuda]; if (dst > ncuda && dst <= ncuda + nopencl) slowness += opencldev_timing_htod[dst-ncuda]; #endif #ifdef STARPU_USE_MIC if (src > ncuda + nopencl) slowness += mic_time_device_to_host[src - (ncuda + nopencl)]; if (dst > ncuda + nopencl) slowness += mic_time_host_to_device[dst - (ncuda + nopencl)]; #endif bandwidth = 1.0/slowness; } #endif else { /* convention */ bandwidth = 0.0; } if (dst) fputc('\t', f); _starpu_write_double(f, "%e", bandwidth); } fprintf(f, "\n"); } if (locked) _starpu_fwrunlock(f); fclose(f); } #endif /* STARPU_SIMGRID */ void starpu_bus_print_filenames(FILE *output) { char bandwidth_path[PATH_LENGTH]; char affinity_path[PATH_LENGTH]; char latency_path[PATH_LENGTH]; get_bandwidth_path(bandwidth_path, sizeof(bandwidth_path)); get_affinity_path(affinity_path, sizeof(affinity_path)); get_latency_path(latency_path, sizeof(latency_path)); fprintf(output, "bandwidth: <%s>\n", bandwidth_path); fprintf(output, " affinity: <%s>\n", affinity_path); fprintf(output, " latency: <%s>\n", latency_path); } void starpu_bus_print_bandwidth(FILE *f) { unsigned src, dst, maxnode; maxnode = ncuda; #ifdef STARPU_USE_OPENCL maxnode += nopencl; #endif #ifdef STARPU_USE_MIC maxnode += nmic; #endif fprintf(f, "from/to\t"); fprintf(f, "RAM\t"); for (dst = 0; dst < ncuda; dst++) fprintf(f, "CUDA %u\t", dst); for (dst = 0; dst < nopencl; dst++) fprintf(f, "OpenCL%u\t", dst); for (dst = 0; dst < nmic; dst++) fprintf(f, "MIC%u\t", dst); fprintf(f, "\n"); for (src = 0; src <= maxnode; src++) { if (!src) fprintf(f, "RAM\t"); else if (src <= ncuda) fprintf(f, "CUDA %u\t", src-1); else if (src <= ncuda + nopencl) fprintf(f, "OpenCL%u\t", src-ncuda-1); else fprintf(f, "MIC%u\t", src-ncuda-nopencl-1); for (dst = 0; dst <= maxnode; dst++) fprintf(f, "%.0f\t", bandwidth_matrix[src][dst]); fprintf(f, "\n"); } fprintf(f, "\n"); for (src = 0; src <= maxnode; src++) { if (!src) fprintf(f, "RAM\t"); else if (src <= ncuda) fprintf(f, "CUDA %u\t", src-1); else if (src <= ncuda + nopencl) fprintf(f, "OpenCL%u\t", src-ncuda-1); else fprintf(f, "MIC%u\t", src-ncuda-nopencl-1); for (dst = 0; dst <= maxnode; dst++) fprintf(f, "%.0f\t", latency_matrix[src][dst]); fprintf(f, "\n"); } #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) if (ncuda != 0 || nopencl != 0) fprintf(f, "\nGPU\tCPU in preference order (logical index), host-to-device, device-to-host\n"); for (src = 1; src <= ncuda + nopencl; src++) { struct dev_timing *timing; struct _starpu_machine_config *config = _starpu_get_machine_config(); unsigned config_ncpus = _starpu_topology_get_nhwcpu(config); unsigned cpu; #ifdef STARPU_USE_CUDA if (src <= ncuda) { fprintf(f, "CUDA %u\t", src-1); for (cpu = 0; cpu < config_ncpus; cpu++) { timing = &cudadev_timing_per_cpu[src*STARPU_MAXCPUS+cpu]; if (timing->timing_htod) fprintf(f, "%2d %.0f %.0f\t", timing->cpu_id, 1/timing->timing_htod, 1/timing->timing_dtoh); else fprintf(f, "%2d\t", cuda_affinity_matrix[src-1][cpu]); } } #ifdef STARPU_USE_OPENCL else #endif #endif #ifdef STARPU_USE_OPENCL { fprintf(f, "OpenCL%u\t", src-ncuda-1); for (cpu = 0; cpu < config_ncpus; cpu++) { timing = &opencldev_timing_per_cpu[(src-ncuda)*STARPU_MAXCPUS+cpu]; if (timing->timing_htod) fprintf(f, "%2d %.0f %.0f\t", timing->cpu_id, 1/timing->timing_htod, 1/timing->timing_dtoh); else fprintf(f, "%2d\t", opencl_affinity_matrix[src-1][cpu]); } } #endif fprintf(f, "\n"); } #endif } static void generate_bus_bandwidth_file(void) { if (!was_benchmarked) benchmark_all_gpu_devices(); #ifndef STARPU_SIMGRID write_bus_bandwidth_file_content(); #endif } static void load_bus_bandwidth_file(void) { int res; char path[PATH_LENGTH]; get_bandwidth_path(path, sizeof(path)); res = access(path, F_OK); if (res || !load_bus_bandwidth_file_content()) { /* File does not exist yet or is bogus */ generate_bus_bandwidth_file(); } } #ifndef STARPU_SIMGRID /* * Config */ static void get_config_path(char *path, size_t maxlen) { get_bus_path("config", path, maxlen); } static void check_bus_config_file(void) { int res; char path[PATH_LENGTH]; struct _starpu_machine_config *config = _starpu_get_machine_config(); get_config_path(path, sizeof(path)); res = access(path, F_OK); if (res || config->conf.bus_calibrate > 0) { if (res) _STARPU_DISP("No performance model for the bus, calibrating...\n"); _starpu_bus_force_sampling(); if (res) _STARPU_DISP("... done\n"); } else { FILE *f; int ret; unsigned read_cuda = -1, read_opencl = -1, read_mic = -1; unsigned read_cpus = -1; int locked; // Loading configuration from file f = fopen(path, "r"); STARPU_ASSERT(f); locked = _starpu_frdlock(f) == 0; _starpu_drop_comments(f); ret = fscanf(f, "%u\t", &read_cpus); STARPU_ASSERT(ret == 1); _starpu_drop_comments(f); ret = fscanf(f, "%u\t", &read_cuda); STARPU_ASSERT(ret == 1); _starpu_drop_comments(f); ret = fscanf(f, "%u\t", &read_opencl); STARPU_ASSERT(ret == 1); _starpu_drop_comments(f); ret = fscanf(f, "%u\t", &read_mic); if (ret == 0) read_mic = 0; _starpu_drop_comments(f); if (locked) _starpu_frdunlock(f); fclose(f); // Loading current configuration ncpus = _starpu_topology_get_nhwcpu(config); #ifdef STARPU_USE_CUDA ncuda = _starpu_get_cuda_device_count(); #endif #ifdef STARPU_USE_OPENCL nopencl = _starpu_opencl_get_device_count(); #endif #ifdef STARPU_USE_MIC nmic = _starpu_mic_src_get_device_count(); #endif /* STARPU_USE_MIC */ // Checking if both configurations match if (read_cpus != ncpus) { _STARPU_DISP("Current configuration does not match the bus performance model (CPUS: (stored) %u != (current) %u), recalibrating...\n", read_cpus, ncpus); _starpu_bus_force_sampling(); _STARPU_DISP("... done\n"); } else if (read_cuda != ncuda) { _STARPU_DISP("Current configuration does not match the bus performance model (CUDA: (stored) %d != (current) %d), recalibrating...\n", read_cuda, ncuda); _starpu_bus_force_sampling(); _STARPU_DISP("... done\n"); } else if (read_opencl != nopencl) { _STARPU_DISP("Current configuration does not match the bus performance model (OpenCL: (stored) %d != (current) %d), recalibrating...\n", read_opencl, nopencl); _starpu_bus_force_sampling(); _STARPU_DISP("... done\n"); } else if (read_mic != nmic) { _STARPU_DISP("Current configuration does not match the bus performance model (MIC: (stored) %d != (current) %d), recalibrating...\n", read_mic, nmic); _starpu_bus_force_sampling(); _STARPU_DISP("... done\n"); } } } static void write_bus_config_file_content(void) { FILE *f; char path[PATH_LENGTH]; int locked; STARPU_ASSERT(was_benchmarked); get_config_path(path, sizeof(path)); _STARPU_DEBUG("writing config to %s\n", path); f = fopen(path, "w+"); STARPU_ASSERT(f); locked = _starpu_fwrlock(f) == 0; _starpu_fftruncate(f, 0); fprintf(f, "# Current configuration\n"); fprintf(f, "%u # Number of CPUs\n", ncpus); fprintf(f, "%u # Number of CUDA devices\n", ncuda); fprintf(f, "%u # Number of OpenCL devices\n", nopencl); fprintf(f, "%u # Number of MIC devices\n", nmic); if (locked) _starpu_fwrunlock(f); fclose(f); } static void generate_bus_config_file(void) { if (!was_benchmarked) benchmark_all_gpu_devices(); write_bus_config_file_content(); } #endif /* !SIMGRID */ void _starpu_simgrid_get_platform_path(int version, char *path, size_t maxlen) { if (version == 3) get_bus_path("platform.xml", path, maxlen); else get_bus_path("platform.v4.xml", path, maxlen); } #ifndef STARPU_SIMGRID /* * Compute the precise PCI tree bandwidth and link shares * * We only have measurements from one leaf to another. We assume that the * available bandwidth is greater at lower levels, and thus measurements from * increasingly far GPUs provide the PCI bridges bandwidths at each level. * * The bandwidth of a PCI bridge is thus computed as the maximum of the speed * of the various transfers that we have achieved through it. We thus browse * the PCI tree three times: * * - first through all CUDA-CUDA possible transfers to compute the maximum * measured bandwidth on each PCI link and hub used for that. * - then through the whole tree to emit links for each PCI link and hub. * - then through all CUDA-CUDA possible transfers again to emit routes. */ #if defined(STARPU_USE_CUDA) && defined(HAVE_DECL_HWLOC_CUDA_GET_DEVICE_OSDEV_BY_INDEX) && HAVE_DECL_HWLOC_CUDA_GET_DEVICE_OSDEV_BY_INDEX && defined(HAVE_CUDA_MEMCPY_PEER) /* Records, for each PCI link and hub, the maximum bandwidth seen through it */ struct pci_userdata { /* Uplink max measurement */ double bw_up; double bw_down; /* Hub max measurement */ double bw; }; /* Allocate a pci_userdata structure for the given object */ static void allocate_userdata(hwloc_obj_t obj) { struct pci_userdata *data; if (obj->userdata) return; _STARPU_MALLOC(obj->userdata, sizeof(*data)); data = obj->userdata; data->bw_up = 0.0; data->bw_down = 0.0; data->bw = 0.0; } /* Update the maximum bandwidth seen going to upstream */ static void update_bandwidth_up(hwloc_obj_t obj, double bandwidth) { struct pci_userdata *data; if (obj->type != HWLOC_OBJ_BRIDGE && obj->type != HWLOC_OBJ_PCI_DEVICE) return; allocate_userdata(obj); data = obj->userdata; if (data->bw_up < bandwidth) data->bw_up = bandwidth; } /* Update the maximum bandwidth seen going from upstream */ static void update_bandwidth_down(hwloc_obj_t obj, double bandwidth) { struct pci_userdata *data; if (obj->type != HWLOC_OBJ_BRIDGE && obj->type != HWLOC_OBJ_PCI_DEVICE) return; allocate_userdata(obj); data = obj->userdata; if (data->bw_down < bandwidth) data->bw_down = bandwidth; } /* Update the maximum bandwidth seen going through this Hub */ static void update_bandwidth_through(hwloc_obj_t obj, double bandwidth) { struct pci_userdata *data; allocate_userdata(obj); data = obj->userdata; if (data->bw < bandwidth) data->bw = bandwidth; } /* find_* functions perform the first step: computing maximum bandwidths */ /* Our trafic had to go through the host, go back from target up to the host, * updating uplink downstream bandwidth along the way */ static void find_platform_backward_path(hwloc_obj_t obj, double bandwidth) { if (!obj) /* Oops, we should have seen a host bridge. Well, too bad. */ return; /* Update uplink bandwidth of PCI Hub */ update_bandwidth_down(obj, bandwidth); /* Update internal bandwidth of PCI Hub */ update_bandwidth_through(obj, bandwidth); if (obj->type == HWLOC_OBJ_BRIDGE && obj->attr->bridge.upstream_type == HWLOC_OBJ_BRIDGE_HOST) /* Finished */ return; /* Continue up */ find_platform_backward_path(obj->parent, bandwidth); } /* Same, but update uplink upstream bandwidth */ static void find_platform_forward_path(hwloc_obj_t obj, double bandwidth) { if (!obj) /* Oops, we should have seen a host bridge. Well, too bad. */ return; /* Update uplink bandwidth of PCI Hub */ update_bandwidth_up(obj, bandwidth); /* Update internal bandwidth of PCI Hub */ update_bandwidth_through(obj, bandwidth); if (obj->type == HWLOC_OBJ_BRIDGE && obj->attr->bridge.upstream_type == HWLOC_OBJ_BRIDGE_HOST) /* Finished */ return; /* Continue up */ find_platform_forward_path(obj->parent, bandwidth); } /* Find the path from obj1 through parent down to obj2 (without ever going up), * and update the maximum bandwidth along the path */ static int find_platform_path_down(hwloc_obj_t parent, hwloc_obj_t obj1, hwloc_obj_t obj2, double bandwidth) { unsigned i; /* Base case, path is empty */ if (parent == obj2) return 1; /* Try to go down from parent */ for (i = 0; i < parent->arity; i++) if (parent->children[i] != obj1 && find_platform_path_down(parent->children[i], NULL, obj2, bandwidth)) { /* Found it down there, update bandwidth of parent */ update_bandwidth_down(parent->children[i], bandwidth); update_bandwidth_through(parent, bandwidth); return 1; } return 0; } /* Find the path from obj1 to obj2, and update the maximum bandwidth along the * path */ static int find_platform_path_up(hwloc_obj_t obj1, hwloc_obj_t obj2, double bandwidth) { int ret; hwloc_obj_t parent = obj1->parent; if (!parent) { /* Oops, we should have seen a host bridge. Act as if we had seen it. */ find_platform_backward_path(obj2, bandwidth); return 1; } if (find_platform_path_down(parent, obj1, obj2, bandwidth)) /* obj2 was a mere (sub)child of our parent */ return 1; /* obj2 is not a (sub)child of our parent, we have to go up through the parent */ if (parent->type == HWLOC_OBJ_BRIDGE && parent->attr->bridge.upstream_type == HWLOC_OBJ_BRIDGE_HOST) { /* We have to go up to the Host, so obj2 is not in the same PCI * tree, so we're for for obj1 to Host, and just find the path * from obj2 to Host too. */ find_platform_backward_path(obj2, bandwidth); update_bandwidth_up(parent, bandwidth); update_bandwidth_through(parent, bandwidth); return 1; } /* Not at host yet, just go up */ ret = find_platform_path_up(parent, obj2, bandwidth); update_bandwidth_up(parent, bandwidth); update_bandwidth_through(parent, bandwidth); return ret; } /* find the path between cuda i and cuda j, and update the maximum bandwidth along the path */ static int find_platform_cuda_path(hwloc_topology_t topology, unsigned i, unsigned j, double bandwidth) { hwloc_obj_t cudai, cudaj; cudai = hwloc_cuda_get_device_osdev_by_index(topology, i); cudaj = hwloc_cuda_get_device_osdev_by_index(topology, j); if (!cudai || !cudaj) return 0; return find_platform_path_up(cudai, cudaj, bandwidth); } /* emit_topology_bandwidths performs the second step: emitting link names */ /* Emit the link name of the object */ static void emit_pci_hub(FILE *f, hwloc_obj_t obj) { STARPU_ASSERT(obj->type == HWLOC_OBJ_BRIDGE); fprintf(f, "PCI:%04x:[%02x-%02x]", obj->attr->bridge.downstream.pci.domain, obj->attr->bridge.downstream.pci.secondary_bus, obj->attr->bridge.downstream.pci.subordinate_bus); } static void emit_pci_dev(FILE *f, struct hwloc_pcidev_attr_s *pcidev) { fprintf(f, "PCI:%04x:%02x:%02x.%1x", pcidev->domain, pcidev->bus, pcidev->dev, pcidev->func); } /* Emit the links of the object */ static void emit_topology_bandwidths(FILE *f, hwloc_obj_t obj, const char *Bps, const char *s) { unsigned i; if (obj->userdata) { struct pci_userdata *data = obj->userdata; if (obj->type == HWLOC_OBJ_BRIDGE) { /* Uplink */ fprintf(f, " \n", data->bw_up, Bps, s); fprintf(f, " \n", data->bw_down, Bps, s); /* PCI Switches are assumed to have infinite internal bandwidth */ if (!obj->name || !strstr(obj->name, "Switch")) { /* We assume that PCI Hubs have double bandwidth in * order to support full duplex but not more */ fprintf(f, " \n", data->bw * 2, Bps, s); } } else if (obj->type == HWLOC_OBJ_PCI_DEVICE) { fprintf(f, " attr->pcidev); fprintf(f, " up\" bandwidth=\"%f%s\" latency=\"0.000000%s\"/>\n", data->bw_up, Bps, s); fprintf(f, " attr->pcidev); fprintf(f, " down\" bandwidth=\"%f%s\" latency=\"0.000000%s\"/>\n", data->bw_down, Bps, s); } } for (i = 0; i < obj->arity; i++) emit_topology_bandwidths(f, obj->children[i], Bps, s); } /* emit_pci_link_* functions perform the third step: emitting the routes */ static void emit_pci_link(FILE *f, hwloc_obj_t obj, const char *suffix) { if (obj->type == HWLOC_OBJ_BRIDGE) { fprintf(f, " \n", suffix); } else if (obj->type == HWLOC_OBJ_PCI_DEVICE) { fprintf(f, " attr->pcidev); fprintf(f, " %s\"/>\n", suffix); } } /* Go to upstream */ static void emit_pci_link_up(FILE *f, hwloc_obj_t obj) { emit_pci_link(f, obj, "up"); } /* Go from upstream */ static void emit_pci_link_down(FILE *f, hwloc_obj_t obj) { emit_pci_link(f, obj, "down"); } /* Go through PCI hub */ static void emit_pci_link_through(FILE *f, hwloc_obj_t obj) { /* We don't care about trafic going through PCI switches */ if (obj->type == HWLOC_OBJ_BRIDGE) { if (!obj->name || !strstr(obj->name, "Switch")) emit_pci_link(f, obj, "through"); else { fprintf(f, " \n"); } } } /* Our trafic has to go through the host, go back from target up to the host, * using uplink downstream along the way */ static void emit_platform_backward_path(FILE *f, hwloc_obj_t obj) { if (!obj) /* Oops, we should have seen a host bridge. Well, too bad. */ return; /* Go through PCI Hub */ emit_pci_link_through(f, obj); /* Go through uplink */ emit_pci_link_down(f, obj); if (obj->type == HWLOC_OBJ_BRIDGE && obj->attr->bridge.upstream_type == HWLOC_OBJ_BRIDGE_HOST) { /* Finished, go through host */ fprintf(f, " \n"); return; } /* Continue up */ emit_platform_backward_path(f, obj->parent); } /* Same, but use upstream link */ static void emit_platform_forward_path(FILE *f, hwloc_obj_t obj) { if (!obj) /* Oops, we should have seen a host bridge. Well, too bad. */ return; /* Go through PCI Hub */ emit_pci_link_through(f, obj); /* Go through uplink */ emit_pci_link_up(f, obj); if (obj->type == HWLOC_OBJ_BRIDGE && obj->attr->bridge.upstream_type == HWLOC_OBJ_BRIDGE_HOST) { /* Finished, go through host */ fprintf(f, " \n"); return; } /* Continue up */ emit_platform_forward_path(f, obj->parent); } /* Find the path from obj1 through parent down to obj2 (without ever going up), * and use the links along the path */ static int emit_platform_path_down(FILE *f, hwloc_obj_t parent, hwloc_obj_t obj1, hwloc_obj_t obj2) { unsigned i; /* Base case, path is empty */ if (parent == obj2) return 1; /* Try to go down from parent */ for (i = 0; i < parent->arity; i++) if (parent->children[i] != obj1 && emit_platform_path_down(f, parent->children[i], NULL, obj2)) { /* Found it down there, path goes through this hub */ emit_pci_link_down(f, parent->children[i]); emit_pci_link_through(f, parent); return 1; } return 0; } /* Find the path from obj1 to obj2, and use the links along the path */ static int emit_platform_path_up(FILE *f, hwloc_obj_t obj1, hwloc_obj_t obj2) { int ret; hwloc_obj_t parent = obj1->parent; if (!parent) { /* Oops, we should have seen a host bridge. Act as if we had seen it. */ emit_platform_backward_path(f, obj2); return 1; } if (emit_platform_path_down(f, parent, obj1, obj2)) /* obj2 was a mere (sub)child of our parent */ return 1; /* obj2 is not a (sub)child of our parent, we have to go up through the parent */ if (parent->type == HWLOC_OBJ_BRIDGE && parent->attr->bridge.upstream_type == HWLOC_OBJ_BRIDGE_HOST) { /* We have to go up to the Host, so obj2 is not in the same PCI * tree, so we're for for obj1 to Host, and just find the path * from obj2 to Host too. */ emit_platform_backward_path(f, obj2); fprintf(f, " \n"); emit_pci_link_up(f, parent); emit_pci_link_through(f, parent); return 1; } /* Not at host yet, just go up */ ret = emit_platform_path_up(f, parent, obj2); emit_pci_link_up(f, parent); emit_pci_link_through(f, parent); return ret; } /* Clean our mess in the topology before destroying it */ static void clean_topology(hwloc_obj_t obj) { unsigned i; if (obj->userdata) free(obj->userdata); for (i = 0; i < obj->arity; i++) clean_topology(obj->children[i]); } #endif static void write_bus_platform_file_content(int version) { FILE *f; char path[PATH_LENGTH]; unsigned i; const char *speed, *flops, *Bps, *s; char dash; int locked; if (version == 3) { speed = "power"; flops = ""; Bps = ""; s = ""; dash = '_'; } else { speed = "speed"; flops = "f"; Bps = "Bps"; s = "s"; dash = '-'; } STARPU_ASSERT(was_benchmarked); _starpu_simgrid_get_platform_path(version, path, sizeof(path)); _STARPU_DEBUG("writing platform to %s\n", path); f = fopen(path, "w+"); if (!f) { perror("fopen write_bus_platform_file_content"); _STARPU_DISP("path '%s'\n", path); fflush(stderr); STARPU_ABORT(); } locked = _starpu_fwrlock(f) == 0; _starpu_fftruncate(f, 0); fprintf(f, "\n" "\n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n", version == 3 ? "http://simgrid.gforge.inria.fr/simgrid.dtd" : "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd", version, dash, dash, dash, speed, flops); for (i = 0; i < ncpus; i++) /* TODO: host memory for out-of-core simulation */ fprintf(f, " \n", i, speed, flops); for (i = 0; i < ncuda; i++) { fprintf(f, " \n", i, speed, flops); fprintf(f, " \n", (unsigned long long) cuda_size[i]); #ifdef HAVE_CUDA_MEMCPY_PEER fprintf(f, " \n"); #endif fprintf(f, " \n"); } for (i = 0; i < nopencl; i++) { fprintf(f, " \n", i, speed, flops); fprintf(f, " \n", (unsigned long long) opencl_size[i]); fprintf(f, " \n"); } fprintf(f, "\n \n", speed, flops); /* * Compute maximum bandwidth, taken as host bandwidth */ double max_bandwidth = 0; #ifdef STARPU_USE_CUDA for (i = 0; i < ncuda; i++) { double down_bw = 1.0 / cudadev_timing_dtoh[1+i]; double up_bw = 1.0 / cudadev_timing_htod[1+i]; if (max_bandwidth < down_bw) max_bandwidth = down_bw; if (max_bandwidth < up_bw) max_bandwidth = up_bw; } #endif #ifdef STARPU_USE_OPENCL for (i = 0; i < nopencl; i++) { double down_bw = 1.0 / opencldev_timing_dtoh[1+i]; double up_bw = 1.0 / opencldev_timing_htod[1+i]; if (max_bandwidth < down_bw) max_bandwidth = down_bw; if (max_bandwidth < up_bw) max_bandwidth = up_bw; } #endif fprintf(f, "\n \n\n", max_bandwidth*1000000, Bps, s); /* * OpenCL links */ #ifdef STARPU_USE_OPENCL for (i = 0; i < nopencl; i++) { char i_name[16]; snprintf(i_name, sizeof(i_name), "OpenCL%u", i); fprintf(f, " \n", i_name, 1000000 / opencldev_timing_htod[1+i], Bps, opencldev_latency_htod[1+i]/1000000., s); fprintf(f, " \n", i_name, 1000000 / opencldev_timing_dtoh[1+i], Bps, opencldev_latency_dtoh[1+i]/1000000., s); } fprintf(f, "\n"); #endif /* * CUDA links and routes */ #ifdef STARPU_USE_CUDA /* Write RAM/CUDA bandwidths and latencies */ for (i = 0; i < ncuda; i++) { char i_name[16]; snprintf(i_name, sizeof(i_name), "CUDA%u", i); fprintf(f, " \n", i_name, 1000000. / cudadev_timing_htod[1+i], Bps, cudadev_latency_htod[1+i]/1000000., s); fprintf(f, " \n", i_name, 1000000. / cudadev_timing_dtoh[1+i], Bps, cudadev_latency_dtoh[1+i]/1000000., s); } fprintf(f, "\n"); #ifdef HAVE_CUDA_MEMCPY_PEER /* Write CUDA/CUDA bandwidths and latencies */ for (i = 0; i < ncuda; i++) { unsigned j; char i_name[16]; snprintf(i_name, sizeof(i_name), "CUDA%u", i); for (j = 0; j < ncuda; j++) { char j_name[16]; if (j == i) continue; snprintf(j_name, sizeof(j_name), "CUDA%u", j); fprintf(f, " \n", i_name, j_name, 1000000. / cudadev_timing_dtod[1+i][1+j], Bps, cudadev_latency_dtod[1+i][1+j]/1000000., s); } } #endif #if defined(HAVE_DECL_HWLOC_CUDA_GET_DEVICE_OSDEV_BY_INDEX) && HAVE_DECL_HWLOC_CUDA_GET_DEVICE_OSDEV_BY_INDEX && defined(HAVE_CUDA_MEMCPY_PEER) /* If we have enough hwloc information, write PCI bandwidths and routes */ if (!starpu_get_env_number_default("STARPU_PCI_FLAT", 0)) { hwloc_topology_t topology; hwloc_topology_init(&topology); hwloc_topology_set_flags(topology, HWLOC_TOPOLOGY_FLAG_IO_DEVICES | HWLOC_TOPOLOGY_FLAG_IO_BRIDGES); hwloc_topology_load(topology); /* First find paths and record measured bandwidth along the path */ for (i = 0; i < ncuda; i++) { unsigned j; for (j = 0; j < ncuda; j++) if (i != j) if (!find_platform_cuda_path(topology, i, j, 1000000. / cudadev_timing_dtod[1+i][1+j])) { clean_topology(hwloc_get_root_obj(topology)); hwloc_topology_destroy(topology); goto flat_cuda; } /* Record RAM/CUDA bandwidths */ find_platform_forward_path(hwloc_cuda_get_device_osdev_by_index(topology, i), 1000000. / cudadev_timing_dtoh[1+i]); find_platform_backward_path(hwloc_cuda_get_device_osdev_by_index(topology, i), 1000000. / cudadev_timing_htod[1+i]); } /* Ok, found path in all cases, can emit advanced platform routes */ fprintf(f, "\n"); emit_topology_bandwidths(f, hwloc_get_root_obj(topology), Bps, s); fprintf(f, "\n"); for (i = 0; i < ncuda; i++) { unsigned j; for (j = 0; j < ncuda; j++) if (i != j) { fprintf(f, " \n", i, j); fprintf(f, " \n", i, j); emit_platform_path_up(f, hwloc_cuda_get_device_osdev_by_index(topology, i), hwloc_cuda_get_device_osdev_by_index(topology, j)); fprintf(f, " \n"); } fprintf(f, " \n", i); fprintf(f, " \n", i); emit_platform_forward_path(f, hwloc_cuda_get_device_osdev_by_index(topology, i)); fprintf(f, " \n"); fprintf(f, " \n", i); fprintf(f, " \n", i); emit_platform_backward_path(f, hwloc_cuda_get_device_osdev_by_index(topology, i)); fprintf(f, " \n"); } clean_topology(hwloc_get_root_obj(topology)); hwloc_topology_destroy(topology); } else { flat_cuda: #else { #endif /* If we don't have enough hwloc information, write trivial routes always through host */ for (i = 0; i < ncuda; i++) { char i_name[16]; snprintf(i_name, sizeof(i_name), "CUDA%u", i); fprintf(f, " \n", i_name, i_name); fprintf(f, " \n", i_name, i_name); } #ifdef HAVE_CUDA_MEMCPY_PEER for (i = 0; i < ncuda; i++) { unsigned j; char i_name[16]; snprintf(i_name, sizeof(i_name), "CUDA%u", i); for (j = 0; j < ncuda; j++) { char j_name[16]; if (j == i) continue; snprintf(j_name, sizeof(j_name), "CUDA%u", j); fprintf(f, " \n", i_name, j_name, i_name, j_name); } } #endif } /* defined(STARPU_HAVE_HWLOC) && defined(HAVE_CUDA_MEMCPY_PEER) */ fprintf(f, "\n"); #endif /* STARPU_USE_CUDA */ /* * OpenCL routes */ #ifdef STARPU_USE_OPENCL for (i = 0; i < nopencl; i++) { char i_name[16]; snprintf(i_name, sizeof(i_name), "OpenCL%u", i); fprintf(f, " \n", i_name, i_name); fprintf(f, " \n", i_name, i_name); } #endif fprintf(f, " \n" " \n" ); if (locked) _starpu_fwrunlock(f); fclose(f); } static void generate_bus_platform_file(void) { if (!was_benchmarked) benchmark_all_gpu_devices(); write_bus_platform_file_content(3); write_bus_platform_file_content(4); } static void check_bus_platform_file(void) { int res; char path[PATH_LENGTH]; _starpu_simgrid_get_platform_path(4, path, sizeof(path)); res = access(path, F_OK); if (!res) { _starpu_simgrid_get_platform_path(3, path, sizeof(path)); res = access(path, F_OK); } if (res) { /* File does not exist yet */ generate_bus_platform_file(); } } /* * Generic */ static void _starpu_bus_force_sampling(void) { _STARPU_DEBUG("Force bus sampling ...\n"); _starpu_create_sampling_directory_if_needed(); generate_bus_affinity_file(); generate_bus_latency_file(); generate_bus_bandwidth_file(); generate_bus_config_file(); generate_bus_platform_file(); } #endif /* !SIMGRID */ void _starpu_load_bus_performance_files(void) { _starpu_create_sampling_directory_if_needed(); #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_SIMGRID) ncuda = _starpu_get_cuda_device_count(); #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_USE_SIMGRID) nopencl = _starpu_opencl_get_device_count(); #endif #if defined(STARPU_USE_MIC) || defined(STARPU_USE_SIMGRID) nmic = _starpu_mic_src_get_device_count(); #endif #ifndef STARPU_SIMGRID check_bus_config_file(); load_bus_affinity_file(); #endif load_bus_latency_file(); load_bus_bandwidth_file(); #ifndef STARPU_SIMGRID check_bus_platform_file(); #endif } /* (in MB/s) */ double starpu_transfer_bandwidth(unsigned src_node, unsigned dst_node) { return bandwidth_matrix[src_node][dst_node]; } /* (in µs) */ double starpu_transfer_latency(unsigned src_node, unsigned dst_node) { return latency_matrix[src_node][dst_node]; } /* (in µs) */ double starpu_transfer_predict(unsigned src_node, unsigned dst_node, size_t size) { double bandwidth = bandwidth_matrix[src_node][dst_node]; double latency = latency_matrix[src_node][dst_node]; struct _starpu_machine_topology *topology = &_starpu_get_machine_config()->topology; return latency + (size/bandwidth)*2*(topology->ncudagpus+topology->nopenclgpus); } /* calculate save bandwidth and latency */ /* bandwidth in MB/s - latency in µs */ void _starpu_save_bandwidth_and_latency_disk(double bandwidth_write, double bandwidth_read, double latency_write, double latency_read, unsigned node, const char *name) { unsigned int i, j; double slowness_disk_between_main_ram, slowness_main_ram_between_node; int print_stats = starpu_get_env_number_default("STARPU_BUS_STATS", 0); if (print_stats) { fprintf(stderr, "\n#---------------------\n"); fprintf(stderr, "Data transfer speed for %s (node %u):\n", name, node); } /* save bandwith */ for(i = 0; i < STARPU_MAXNODES; ++i) { for(j = 0; j < STARPU_MAXNODES; ++j) { if (i == j && j == node) /* source == destination == node */ { bandwidth_matrix[i][j] = 0; } else if (i == node) /* source == disk */ { /* convert in slowness */ if(bandwidth_read != 0) slowness_disk_between_main_ram = 1/bandwidth_read; else slowness_disk_between_main_ram = 0; if(bandwidth_matrix[STARPU_MAIN_RAM][j] != 0) slowness_main_ram_between_node = 1/bandwidth_matrix[STARPU_MAIN_RAM][j]; else slowness_main_ram_between_node = 0; bandwidth_matrix[i][j] = 1/(slowness_disk_between_main_ram+slowness_main_ram_between_node); if (!isnan(bandwidth_matrix[i][j]) && print_stats) fprintf(stderr,"%u -> %u: %.0f MB/s\n", i, j, bandwidth_matrix[i][j]); } else if (j == node) /* destination == disk */ { /* convert in slowness */ if(bandwidth_write != 0) slowness_disk_between_main_ram = 1/bandwidth_write; else slowness_disk_between_main_ram = 0; if(bandwidth_matrix[i][STARPU_MAIN_RAM] != 0) slowness_main_ram_between_node = 1/bandwidth_matrix[i][STARPU_MAIN_RAM]; else slowness_main_ram_between_node = 0; bandwidth_matrix[i][j] = 1/(slowness_disk_between_main_ram+slowness_main_ram_between_node); if (!isnan(bandwidth_matrix[i][j]) && print_stats) fprintf(stderr,"%u -> %u: %.0f MB/s\n", i, j, bandwidth_matrix[i][j]); } else if (j > node || i > node) /* not affected by the node */ { bandwidth_matrix[i][j] = NAN; } } } /* save latency */ for(i = 0; i < STARPU_MAXNODES; ++i) { for(j = 0; j < STARPU_MAXNODES; ++j) { if (i == j && j == node) /* source == destination == node */ { latency_matrix[i][j] = 0; } else if (i == node) /* source == disk */ { latency_matrix[i][j] = (latency_write+latency_matrix[STARPU_MAIN_RAM][j]); if (!isnan(latency_matrix[i][j]) && print_stats) fprintf(stderr,"%u -> %u: %.0f µs\n", i, j, latency_matrix[i][j]); } else if (j == node) /* destination == disk */ { latency_matrix[i][j] = (latency_read+latency_matrix[i][STARPU_MAIN_RAM]); if (!isnan(latency_matrix[i][j]) && print_stats) fprintf(stderr,"%u -> %u: %.0f µs\n", i, j, latency_matrix[i][j]); } else if (j > node || i > node) /* not affected by the node */ { latency_matrix[i][j] = NAN; } } } if (print_stats) fprintf(stderr, "\n#---------------------\n"); } starpu-1.2.3+dfsg/src/core/perfmodel/perfmodel_history.c000066400000000000000000001504121320135501600233470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #if !defined(_WIN32) || defined(__MINGW32__) || defined(__CYGWIN__) #include #include #endif #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include #include #include #include #include #include #include #ifdef STARPU_HAVE_WINDOWS #include #endif #define HASH_ADD_UINT32_T(head,field,add) HASH_ADD(hh,head,field,sizeof(uint32_t),add) #define HASH_FIND_UINT32_T(head,find,out) HASH_FIND(hh,head,find,sizeof(uint32_t),out) #define STR_SHORT_LENGTH 32 #define STR_LONG_LENGTH 256 #define STR_VERY_LONG_LENGTH 1024 static struct starpu_perfmodel_arch **arch_combs; static int current_arch_comb; static int nb_arch_combs; static starpu_pthread_rwlock_t arch_combs_mutex; static int historymaxerror; static char ignore_devid[STARPU_ANY_WORKER]; /* How many executions a codelet will have to be measured before we * consider that calibration will provide a value good enough for scheduling */ unsigned _starpu_calibration_minimum; struct starpu_perfmodel_history_table { UT_hash_handle hh; uint32_t footprint; struct starpu_perfmodel_history_entry *history_entry; }; /* We want more than 10% variance on X to trust regression */ #define VALID_REGRESSION(reg_model) \ ((reg_model)->minx < (9*(reg_model)->maxx)/10 && (reg_model)->nsample >= _starpu_calibration_minimum) static starpu_pthread_rwlock_t registered_models_rwlock; LIST_TYPE(_starpu_perfmodel, struct starpu_perfmodel *model; ) static struct _starpu_perfmodel_list registered_models; void _starpu_perfmodel_malloc_per_arch(struct starpu_perfmodel *model, int comb, int nb_impl) { int i; _STARPU_MALLOC(model->state->per_arch[comb], nb_impl*sizeof(struct starpu_perfmodel_per_arch)); for(i = 0; i < nb_impl; i++) { memset(&model->state->per_arch[comb][i], 0, sizeof(struct starpu_perfmodel_per_arch)); } model->state->nimpls_set[comb] = nb_impl; } void _starpu_perfmodel_malloc_per_arch_is_set(struct starpu_perfmodel *model, int comb, int nb_impl) { _STARPU_CALLOC(model->state->per_arch_is_set[comb], nb_impl, sizeof(int)); } int _starpu_perfmodel_arch_comb_get(int ndevices, struct starpu_perfmodel_device *devices) { int comb, ncomb; ncomb = current_arch_comb; for(comb = 0; comb < ncomb; comb++) { int found = 0; if(arch_combs[comb]->ndevices == ndevices) { int dev1, dev2; int nfounded = 0; for(dev1 = 0; dev1 < arch_combs[comb]->ndevices; dev1++) { for(dev2 = 0; dev2 < ndevices; dev2++) { if(arch_combs[comb]->devices[dev1].type == devices[dev2].type && (ignore_devid[devices[dev2].type] || arch_combs[comb]->devices[dev1].devid == devices[dev2].devid) && arch_combs[comb]->devices[dev1].ncores == devices[dev2].ncores) nfounded++; } } if(nfounded == ndevices) found = 1; } if (found) return comb; } return -1; } int starpu_perfmodel_arch_comb_get(int ndevices, struct starpu_perfmodel_device *devices) { int ret; STARPU_PTHREAD_RWLOCK_RDLOCK(&arch_combs_mutex); ret = _starpu_perfmodel_arch_comb_get(ndevices, devices); STARPU_PTHREAD_RWLOCK_UNLOCK(&arch_combs_mutex); return ret; } int starpu_perfmodel_arch_comb_add(int ndevices, struct starpu_perfmodel_device* devices) { STARPU_PTHREAD_RWLOCK_WRLOCK(&arch_combs_mutex); int comb = _starpu_perfmodel_arch_comb_get(ndevices, devices); if (comb != -1) { /* Somebody else added it in between */ STARPU_PTHREAD_RWLOCK_UNLOCK(&arch_combs_mutex); return comb; } if (current_arch_comb >= nb_arch_combs) { // We need to allocate more arch_combs nb_arch_combs = current_arch_comb+10; _STARPU_REALLOC(arch_combs, nb_arch_combs*sizeof(struct starpu_perfmodel_arch*)); } _STARPU_MALLOC(arch_combs[current_arch_comb], sizeof(struct starpu_perfmodel_arch)); _STARPU_MALLOC(arch_combs[current_arch_comb]->devices, ndevices*sizeof(struct starpu_perfmodel_device)); arch_combs[current_arch_comb]->ndevices = ndevices; int dev; for(dev = 0; dev < ndevices; dev++) { arch_combs[current_arch_comb]->devices[dev].type = devices[dev].type; arch_combs[current_arch_comb]->devices[dev].devid = devices[dev].devid; arch_combs[current_arch_comb]->devices[dev].ncores = devices[dev].ncores; } comb = current_arch_comb++; STARPU_PTHREAD_RWLOCK_UNLOCK(&arch_combs_mutex); return comb; } static void _free_arch_combs(void) { int i; STARPU_PTHREAD_RWLOCK_WRLOCK(&arch_combs_mutex); for(i = 0; i < current_arch_comb; i++) { free(arch_combs[i]->devices); free(arch_combs[i]); } current_arch_comb = 0; free(arch_combs); STARPU_PTHREAD_RWLOCK_UNLOCK(&arch_combs_mutex); STARPU_PTHREAD_RWLOCK_DESTROY(&arch_combs_mutex); } int starpu_perfmodel_get_narch_combs() { return current_arch_comb; } struct starpu_perfmodel_arch *starpu_perfmodel_arch_comb_fetch(int comb) { return arch_combs[comb]; } size_t _starpu_job_get_data_size(struct starpu_perfmodel *model, struct starpu_perfmodel_arch* arch, unsigned impl, struct _starpu_job *j) { struct starpu_task *task = j->task; int comb = starpu_perfmodel_arch_comb_get(arch->ndevices, arch->devices); if (model && model->state->per_arch && comb != -1 && model->state->per_arch[comb] && model->state->per_arch[comb][impl].size_base) { return model->state->per_arch[comb][impl].size_base(task, arch, impl); } else if (model && model->size_base) { return model->size_base(task, impl); } else { unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); size_t size = 0; unsigned buffer; for (buffer = 0; buffer < nbuffers; buffer++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, buffer); size += _starpu_data_get_size(handle); } return size; } } /* * History based model */ static void insert_history_entry(struct starpu_perfmodel_history_entry *entry, struct starpu_perfmodel_history_list **list, struct starpu_perfmodel_history_table **history_ptr) { struct starpu_perfmodel_history_list *link; struct starpu_perfmodel_history_table *table; _STARPU_MALLOC(link, sizeof(struct starpu_perfmodel_history_list)); link->next = *list; link->entry = entry; *list = link; /* detect concurrency issue */ //HASH_FIND_UINT32_T(*history_ptr, &entry->footprint, table); //STARPU_ASSERT(table == NULL); _STARPU_MALLOC(table, sizeof(*table)); table->footprint = entry->footprint; table->history_entry = entry; HASH_ADD_UINT32_T(*history_ptr, footprint, table); } #ifndef STARPU_SIMGRID static void dump_reg_model(FILE *f, struct starpu_perfmodel *model, int comb, int impl) { struct starpu_perfmodel_per_arch *per_arch_model; per_arch_model = &model->state->per_arch[comb][impl]; struct starpu_perfmodel_regression_model *reg_model; reg_model = &per_arch_model->regression; /* * Linear Regression model */ /* Unless we have enough measurements, we put NaN in the file to indicate the model is invalid */ double alpha = nan(""), beta = nan(""); if (model->type == STARPU_REGRESSION_BASED || model->type == STARPU_NL_REGRESSION_BASED) { if (reg_model->nsample > 1) { alpha = reg_model->alpha; beta = reg_model->beta; } } fprintf(f, "# sumlnx\tsumlnx2\t\tsumlny\t\tsumlnxlny\talpha\t\tbeta\t\tn\tminx\t\tmaxx\n"); fprintf(f, "%-15e\t%-15e\t%-15e\t%-15e\t", reg_model->sumlnx, reg_model->sumlnx2, reg_model->sumlny, reg_model->sumlnxlny); _starpu_write_double(f, "%-15e", alpha); fprintf(f, "\t"); _starpu_write_double(f, "%-15e", beta); fprintf(f, "\t%u\t%-15lu\t%-15lu\n", reg_model->nsample, reg_model->minx, reg_model->maxx); /* * Non-Linear Regression model */ double a = nan(""), b = nan(""), c = nan(""); if (model->type == STARPU_NL_REGRESSION_BASED) _starpu_regression_non_linear_power(per_arch_model->list, &a, &b, &c); fprintf(f, "# a\t\tb\t\tc\n"); _starpu_write_double(f, "%-15e", a); fprintf(f, "\t"); _starpu_write_double(f, "%-15e", b); fprintf(f, "\t"); _starpu_write_double(f, "%-15e", c); fprintf(f, "\n"); } #endif static void scan_reg_model(FILE *f, const char *path, struct starpu_perfmodel_regression_model *reg_model) { int res; /* * Linear Regression model */ _starpu_drop_comments(f); res = fscanf(f, "%le\t%le\t%le\t%le\t", ®_model->sumlnx, ®_model->sumlnx2, ®_model->sumlny, ®_model->sumlnxlny); STARPU_ASSERT_MSG(res == 4, "Incorrect performance model file %s", path); res = _starpu_read_double(f, "%le", ®_model->alpha); STARPU_ASSERT_MSG(res == 1, "Incorrect performance model file %s", path); res = _starpu_read_double(f, "\t%le", ®_model->beta); STARPU_ASSERT_MSG(res == 1, "Incorrect performance model file %s", path); res = fscanf(f, "\t%u\t%lu\t%lu\n", ®_model->nsample, ®_model->minx, ®_model->maxx); STARPU_ASSERT_MSG(res == 3, "Incorrect performance model file %s", path); /* If any of the parameters describing the linear regression model is NaN, the model is invalid */ unsigned invalid = (isnan(reg_model->alpha)||isnan(reg_model->beta)); reg_model->valid = !invalid && VALID_REGRESSION(reg_model); /* * Non-Linear Regression model */ _starpu_drop_comments(f); res = _starpu_read_double(f, "%le", ®_model->a); STARPU_ASSERT_MSG(res == 1, "Incorrect performance model file %s", path); res = _starpu_read_double(f, "\t%le", ®_model->b); STARPU_ASSERT_MSG(res == 1, "Incorrect performance model file %s", path); res = _starpu_read_double(f, "%le", ®_model->c); STARPU_ASSERT_MSG(res == 1, "Incorrect performance model file %s", path); res = fscanf(f, "\n"); STARPU_ASSERT_MSG(res == 0, "Incorrect performance model file %s", path); /* If any of the parameters describing the non-linear regression model is NaN, the model is invalid */ unsigned nl_invalid = (isnan(reg_model->a)||isnan(reg_model->b)||isnan(reg_model->c)); reg_model->nl_valid = !nl_invalid && VALID_REGRESSION(reg_model); } #ifndef STARPU_SIMGRID static void dump_history_entry(FILE *f, struct starpu_perfmodel_history_entry *entry) { fprintf(f, "%08x\t%-15lu\t%-15e\t%-15e\t%-15e\t%-15e\t%-15e\t%u\n", entry->footprint, (unsigned long) entry->size, entry->flops, entry->mean, entry->deviation, entry->sum, entry->sum2, entry->nsample); } #endif static void scan_history_entry(FILE *f, const char *path, struct starpu_perfmodel_history_entry *entry) { int res; _starpu_drop_comments(f); /* In case entry is NULL, we just drop these values */ unsigned nsample; uint32_t footprint; unsigned long size; /* in bytes */ double flops; double mean; double deviation; double sum; double sum2; char line[STR_LONG_LENGTH]; char *ret; ret = fgets(line, sizeof(line), f); STARPU_ASSERT(ret); STARPU_ASSERT(strchr(line, '\n')); /* Read the values from the file */ res = sscanf(line, "%x\t%lu\t%le\t%le\t%le\t%le\t%le\t%u", &footprint, &size, &flops, &mean, &deviation, &sum, &sum2, &nsample); if (res != 8) { flops = 0.; /* Read the values from the file */ res = sscanf(line, "%x\t%lu\t%le\t%le\t%le\t%le\t%u", &footprint, &size, &mean, &deviation, &sum, &sum2, &nsample); STARPU_ASSERT_MSG(res == 7, "Incorrect performance model file %s", path); } if (entry) { entry->footprint = footprint; entry->size = size; entry->flops = flops; entry->mean = mean; entry->deviation = deviation; entry->sum = sum; entry->sum2 = sum2; entry->nsample = nsample; } } static void parse_per_arch_model_file(FILE *f, const char *path, struct starpu_perfmodel_per_arch *per_arch_model, unsigned scan_history) { unsigned nentries; _starpu_drop_comments(f); int res = fscanf(f, "%u\n", &nentries); STARPU_ASSERT_MSG(res == 1, "Incorrect performance model file %s", path); scan_reg_model(f, path, &per_arch_model->regression); /* parse entries */ unsigned i; for (i = 0; i < nentries; i++) { struct starpu_perfmodel_history_entry *entry = NULL; if (scan_history) { _STARPU_MALLOC(entry, sizeof(struct starpu_perfmodel_history_entry)); /* Tell helgrind that we do not care about * racing access to the sampling, we only want a * good-enough estimation */ STARPU_HG_DISABLE_CHECKING(entry->nsample); STARPU_HG_DISABLE_CHECKING(entry->mean); entry->nerror = 0; } scan_history_entry(f, path, entry); /* insert the entry in the hashtable and the list structures */ /* TODO: Insert it at the end of the list, to avoid reversing * the order... But efficiently! We may have a lot of entries */ if (scan_history) insert_history_entry(entry, &per_arch_model->list, &per_arch_model->history); } } static void parse_arch(FILE *f, const char *path, struct starpu_perfmodel *model, unsigned scan_history, int comb) { struct starpu_perfmodel_per_arch dummy; unsigned nimpls, implmax, impl, i, ret; /* Parsing number of implementation */ _starpu_drop_comments(f); ret = fscanf(f, "%u\n", &nimpls); STARPU_ASSERT_MSG(ret == 1, "Incorrect performance model file %s", path); if( model != NULL) { /* Parsing each implementation */ implmax = STARPU_MIN(nimpls, STARPU_MAXIMPLEMENTATIONS); model->state->nimpls[comb] = implmax; if (!model->state->per_arch[comb]) { _starpu_perfmodel_malloc_per_arch(model, comb, STARPU_MAXIMPLEMENTATIONS); } if (!model->state->per_arch_is_set[comb]) { _starpu_perfmodel_malloc_per_arch_is_set(model, comb, STARPU_MAXIMPLEMENTATIONS); } for (impl = 0; impl < implmax; impl++) { struct starpu_perfmodel_per_arch *per_arch_model = &model->state->per_arch[comb][impl]; model->state->per_arch_is_set[comb][impl] = 1; parse_per_arch_model_file(f, path, per_arch_model, scan_history); } } else { impl = 0; } /* if the number of implementation is greater than STARPU_MAXIMPLEMENTATIONS * we skip the last implementation */ for (i = impl; i < nimpls; i++) parse_per_arch_model_file(f, path, &dummy, 0); } static enum starpu_worker_archtype _get_enum_type(int type) { switch(type) { case 0: return STARPU_CPU_WORKER; case 1: return STARPU_CUDA_WORKER; case 2: return STARPU_OPENCL_WORKER; case 3: return STARPU_MIC_WORKER; case 4: return STARPU_SCC_WORKER; default: STARPU_ABORT(); } } static void parse_comb(FILE *f, const char *path, struct starpu_perfmodel *model, unsigned scan_history, int comb) { int ndevices = 0; _starpu_drop_comments(f); int ret = fscanf(f, "%d\n", &ndevices ); STARPU_ASSERT_MSG(ret == 1, "Incorrect performance model file %s", path); struct starpu_perfmodel_device devices[ndevices]; int dev; for(dev = 0; dev < ndevices; dev++) { enum starpu_worker_archtype dev_type; _starpu_drop_comments(f); int type; ret = fscanf(f, "%d\n", &type); STARPU_ASSERT_MSG(ret == 1, "Incorrect performance model file %s", path); dev_type = _get_enum_type(type); int dev_id; _starpu_drop_comments(f); ret = fscanf(f, "%d\n", &dev_id); STARPU_ASSERT_MSG(ret == 1, "Incorrect performance model file %s", path); int ncores; _starpu_drop_comments(f); ret = fscanf(f, "%d\n", &ncores); STARPU_ASSERT_MSG(ret == 1, "Incorrect performance model file %s", path); devices[dev].type = dev_type; devices[dev].devid = dev_id; devices[dev].ncores = ncores; } int id_comb = starpu_perfmodel_arch_comb_get(ndevices, devices); if(id_comb == -1) id_comb = starpu_perfmodel_arch_comb_add(ndevices, devices); model->state->combs[comb] = id_comb; parse_arch(f, path, model, scan_history, id_comb); } static int parse_model_file(FILE *f, const char *path, struct starpu_perfmodel *model, unsigned scan_history) { int ret, version=0; /* First check that it's not empty (very common corruption result, for * which there is no solution) */ fseek(f, 0, SEEK_END); long pos = ftell(f); if (pos == 0) { _STARPU_DISP("Performance model file %s is empty, ignoring it\n", path); return 1; } rewind(f); /* Parsing performance model version */ _starpu_drop_comments(f); ret = fscanf(f, "%d\n", &version); STARPU_ASSERT_MSG(version == _STARPU_PERFMODEL_VERSION, "Incorrect performance model file %s with a model version %d not being the current model version (%d)\n", path, version, _STARPU_PERFMODEL_VERSION); STARPU_ASSERT_MSG(ret == 1, "Incorrect performance model file %s", path); int ncombs = 0; _starpu_drop_comments(f); ret = fscanf(f, "%d\n", &ncombs); STARPU_ASSERT_MSG(ret == 1, "Incorrect performance model file %s", path); if(ncombs > 0) { model->state->ncombs = ncombs; } if (ncombs > model->state->ncombs_set) { // The model has more combs than the original number of arch_combs, we need to reallocate _starpu_perfmodel_realloc(model, ncombs); } int comb; for(comb = 0; comb < ncombs; comb++) parse_comb(f, path, model, scan_history, comb); return 0; } #ifndef STARPU_SIMGRID static void dump_per_arch_model_file(FILE *f, struct starpu_perfmodel *model, int comb, unsigned impl) { struct starpu_perfmodel_per_arch *per_arch_model; per_arch_model = &model->state->per_arch[comb][impl]; /* count the number of elements in the lists */ struct starpu_perfmodel_history_list *ptr = NULL; unsigned nentries = 0; if (model->type == STARPU_HISTORY_BASED || model->type == STARPU_NL_REGRESSION_BASED) { /* Dump the list of all entries in the history */ ptr = per_arch_model->list; while(ptr) { nentries++; ptr = ptr->next; } } /* header */ char archname[STR_SHORT_LENGTH]; starpu_perfmodel_get_arch_name(arch_combs[comb], archname, sizeof(archname), impl); fprintf(f, "#####\n"); fprintf(f, "# Model for %s\n", archname); fprintf(f, "# number of entries\n%u\n", nentries); dump_reg_model(f, model, comb, impl); /* Dump the history into the model file in case it is necessary */ if (model->type == STARPU_HISTORY_BASED || model->type == STARPU_NL_REGRESSION_BASED) { fprintf(f, "# hash\t\tsize\t\tflops\t\tmean (us)\tdev (us)\tsum\t\tsum2\t\tn\n"); ptr = per_arch_model->list; while (ptr) { dump_history_entry(f, ptr->entry); ptr = ptr->next; } } fprintf(f, "\n"); } static void dump_model_file(FILE *f, struct starpu_perfmodel *model) { fprintf(f, "##################\n"); fprintf(f, "# Performance Model Version\n"); fprintf(f, "%d\n\n", _STARPU_PERFMODEL_VERSION); int ncombs = model->state->ncombs; fprintf(f, "####################\n"); fprintf(f, "# COMBs\n"); fprintf(f, "# number of combinations\n"); fprintf(f, "%d\n", ncombs); int i, impl, dev; for(i = 0; i < ncombs; i++) { int comb = model->state->combs[i]; int ndevices = arch_combs[comb]->ndevices; fprintf(f, "####################\n"); fprintf(f, "# COMB_%d\n", comb); fprintf(f, "# number of types devices\n"); fprintf(f, "%d\n", ndevices); for(dev = 0; dev < ndevices; dev++) { fprintf(f, "####################\n"); fprintf(f, "# DEV_%d\n", dev); fprintf(f, "# device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4)\n"); fprintf(f, "%u\n", arch_combs[comb]->devices[dev].type); fprintf(f, "####################\n"); fprintf(f, "# DEV_%d\n", dev); fprintf(f, "# device id \n"); fprintf(f, "%u\n", arch_combs[comb]->devices[dev].devid); fprintf(f, "####################\n"); fprintf(f, "# DEV_%d\n", dev); fprintf(f, "# number of cores \n"); fprintf(f, "%u\n", arch_combs[comb]->devices[dev].ncores); } int nimpls = model->state->nimpls[comb]; fprintf(f, "##########\n"); fprintf(f, "# number of implementations\n"); fprintf(f, "%d\n", nimpls); for (impl = 0; impl < nimpls; impl++) { dump_per_arch_model_file(f, model, comb, impl); } } } #endif void _starpu_perfmodel_realloc(struct starpu_perfmodel *model, int nb) { int i; STARPU_ASSERT(nb > model->state->ncombs_set); #ifdef SSIZE_MAX STARPU_ASSERT((size_t) nb < SSIZE_MAX / sizeof(struct starpu_perfmodel_per_arch*)); #endif _STARPU_REALLOC(model->state->per_arch, nb*sizeof(struct starpu_perfmodel_per_arch*)); _STARPU_REALLOC(model->state->per_arch_is_set, nb*sizeof(int*)); _STARPU_REALLOC(model->state->nimpls, nb*sizeof(int)); _STARPU_REALLOC(model->state->nimpls_set, nb*sizeof(int)); _STARPU_REALLOC(model->state->combs, nb*sizeof(int)); for(i = model->state->ncombs_set; i < nb; i++) { model->state->per_arch[i] = NULL; model->state->per_arch_is_set[i] = NULL; model->state->nimpls[i] = 0; model->state->nimpls_set[i] = 0; } model->state->ncombs_set = nb; } void starpu_perfmodel_init(struct starpu_perfmodel *model) { int already_init; int i, ncombs; STARPU_ASSERT(model); STARPU_PTHREAD_RWLOCK_RDLOCK(®istered_models_rwlock); already_init = model->is_init; STARPU_PTHREAD_RWLOCK_UNLOCK(®istered_models_rwlock); if (already_init) return; /* The model is still not loaded so we grab the lock in write mode, and * if it's not loaded once we have the lock, we do load it. */ STARPU_PTHREAD_RWLOCK_WRLOCK(®istered_models_rwlock); /* Was the model initialized since the previous test ? */ if (model->is_init) { STARPU_PTHREAD_RWLOCK_UNLOCK(®istered_models_rwlock); return; } _STARPU_MALLOC(model->state, sizeof(struct _starpu_perfmodel_state)); STARPU_PTHREAD_RWLOCK_INIT(&model->state->model_rwlock, NULL); STARPU_PTHREAD_RWLOCK_RDLOCK(&arch_combs_mutex); model->state->ncombs_set = ncombs = nb_arch_combs; STARPU_PTHREAD_RWLOCK_UNLOCK(&arch_combs_mutex); _STARPU_MALLOC(model->state->per_arch, ncombs*sizeof(struct starpu_perfmodel_per_arch*)); _STARPU_MALLOC(model->state->per_arch_is_set, ncombs*sizeof(int*)); _STARPU_MALLOC(model->state->nimpls, ncombs*sizeof(int)); _STARPU_MALLOC(model->state->nimpls_set, ncombs*sizeof(int)); _STARPU_MALLOC(model->state->combs, ncombs*sizeof(int)); model->state->ncombs = 0; for(i = 0; i < ncombs; i++) { model->state->per_arch[i] = NULL; model->state->per_arch_is_set[i] = NULL; model->state->nimpls[i] = 0; model->state->nimpls_set[i] = 0; } /* add the model to a linked list */ struct _starpu_perfmodel *node = _starpu_perfmodel_new(); node->model = model; //model->debug_modelid = debug_modelid++; /* put this model at the beginning of the list */ _starpu_perfmodel_list_push_front(®istered_models, node); model->is_init = 1; STARPU_PTHREAD_RWLOCK_UNLOCK(®istered_models_rwlock); } static void get_model_debug_path(struct starpu_perfmodel *model, const char *arch, char *path, size_t maxlen) { STARPU_ASSERT(path); char hostname[STR_LONG_LENGTH]; _starpu_gethostname(hostname, sizeof(hostname)); snprintf(path, maxlen, "%s/%s.%s.%s.debug", _starpu_get_perf_model_dir_debug(), model->symbol, hostname, arch); } void starpu_perfmodel_get_model_path(const char *symbol, char *path, size_t maxlen) { char hostname[STR_LONG_LENGTH]; _starpu_gethostname(hostname, sizeof(hostname)); const char *dot = strrchr(symbol, '.'); snprintf(path, maxlen, "%s/%s%s%s", _starpu_get_perf_model_dir_codelet(), symbol, dot?"":".", dot?"":hostname); } #ifndef STARPU_SIMGRID static void save_history_based_model(struct starpu_perfmodel *model) { STARPU_ASSERT(model); STARPU_ASSERT(model->symbol); int locked; /* TODO checks */ /* filename = $STARPU_PERF_MODEL_DIR/codelets/symbol.hostname */ char path[STR_LONG_LENGTH]; starpu_perfmodel_get_model_path(model->symbol, path, sizeof(path)); _STARPU_DEBUG("Opening performance model file %s for model %s\n", path, model->symbol); /* overwrite existing file, or create it */ FILE *f; f = fopen(path, "w+"); STARPU_ASSERT_MSG(f, "Could not save performance model %s\n", path); locked = _starpu_fwrlock(f) == 0; _starpu_fftruncate(f, 0); dump_model_file(f, model); if (locked) _starpu_fwrunlock(f); fclose(f); } #endif static void _starpu_dump_registered_models(void) { #ifndef STARPU_SIMGRID STARPU_PTHREAD_RWLOCK_WRLOCK(®istered_models_rwlock); struct _starpu_perfmodel *node; _STARPU_DEBUG("DUMP MODELS !\n"); for (node = _starpu_perfmodel_list_begin(®istered_models); node != _starpu_perfmodel_list_end(®istered_models); node = _starpu_perfmodel_list_next(node)) { if (node->model->is_init) save_history_based_model(node->model); } STARPU_PTHREAD_RWLOCK_UNLOCK(®istered_models_rwlock); #endif } void starpu_perfmodel_initialize(void) { /* make sure the performance model directory exists (or create it) */ _starpu_create_sampling_directory_if_needed(); _starpu_perfmodel_list_init(®istered_models); STARPU_PTHREAD_RWLOCK_INIT(®istered_models_rwlock, NULL); STARPU_PTHREAD_RWLOCK_INIT(&arch_combs_mutex, NULL); } void _starpu_initialize_registered_performance_models(void) { starpu_perfmodel_initialize(); struct _starpu_machine_config *conf = _starpu_get_machine_config(); unsigned ncores = conf->topology.nhwcpus; unsigned ncuda = conf->topology.nhwcudagpus; unsigned nopencl = conf->topology.nhwopenclgpus; unsigned nmic = 0; unsigned i; for(i = 0; i < conf->topology.nhwmicdevices; i++) nmic += conf->topology.nhwmiccores[i]; unsigned nscc = conf->topology.nhwscc; // We used to allocate 2**(ncores + ncuda + nopencl + nmic + nscc), this is too big // We now allocate only 2*(ncores + ncuda + nopencl + nmic + nscc), and reallocate when necessary in starpu_perfmodel_arch_comb_add nb_arch_combs = 2 * (ncores + ncuda + nopencl + nmic + nscc); _STARPU_MALLOC(arch_combs, nb_arch_combs*sizeof(struct starpu_perfmodel_arch*)); current_arch_comb = 0; historymaxerror = starpu_get_env_number_default("STARPU_HISTORY_MAX_ERROR", STARPU_HISTORYMAXERROR); _starpu_calibration_minimum = starpu_get_env_number_default("STARPU_CALIBRATE_MINIMUM", 10); ignore_devid[STARPU_CPU_WORKER] = starpu_get_env_number_default("STARPU_PERF_MODEL_HOMOGENEOUS_CPU", 1); ignore_devid[STARPU_CUDA_WORKER] = starpu_get_env_number_default("STARPU_PERF_MODEL_HOMOGENEOUS_CUDA", 0); ignore_devid[STARPU_OPENCL_WORKER] = starpu_get_env_number_default("STARPU_PERF_MODEL_HOMOGENEOUS_OPENCL", 0); ignore_devid[STARPU_MIC_WORKER] = starpu_get_env_number_default("STARPU_PERF_MODEL_HOMOGENEOUS_MIC", 0); ignore_devid[STARPU_SCC_WORKER] = starpu_get_env_number_default("STARPU_PERF_MODEL_HOMOGENEOUS_SCC", 0); } void _starpu_deinitialize_performance_model(struct starpu_perfmodel *model) { if(model->is_init && model->state && model->state->per_arch != NULL) { int i; for(i=0 ; istate->ncombs_set ; i++) { if (model->state->per_arch[i]) { int impl; for(impl=0 ; implstate->nimpls_set[i] ; impl++) { struct starpu_perfmodel_per_arch *archmodel = &model->state->per_arch[i][impl]; if (archmodel->history) { struct starpu_perfmodel_history_list *list, *plist; struct starpu_perfmodel_history_table *entry, *tmp; HASH_ITER(hh, archmodel->history, entry, tmp) { HASH_DEL(archmodel->history, entry); free(entry); } archmodel->history = NULL; list = archmodel->list; while (list) { free(list->entry); plist = list; list = list->next; free(plist); } archmodel->list = NULL; } } free(model->state->per_arch[i]); model->state->per_arch[i] = NULL; free(model->state->per_arch_is_set[i]); model->state->per_arch_is_set[i] = NULL; } } free(model->state->per_arch); model->state->per_arch = NULL; free(model->state->per_arch_is_set); model->state->per_arch_is_set = NULL; free(model->state->nimpls); model->state->nimpls = NULL; free(model->state->nimpls_set); model->state->nimpls_set = NULL; free(model->state->combs); model->state->combs = NULL; model->state->ncombs = 0; } model->is_init = 0; model->is_loaded = 0; } void _starpu_deinitialize_registered_performance_models(void) { if (_starpu_get_calibrate_flag()) _starpu_dump_registered_models(); STARPU_PTHREAD_RWLOCK_WRLOCK(®istered_models_rwlock); struct _starpu_perfmodel *node, *nnode; _STARPU_DEBUG("FREE MODELS !\n"); for (node = _starpu_perfmodel_list_begin(®istered_models); node != _starpu_perfmodel_list_end(®istered_models); node = nnode) { struct starpu_perfmodel *model = node->model; nnode = _starpu_perfmodel_list_next(node); STARPU_PTHREAD_RWLOCK_WRLOCK(&model->state->model_rwlock); _starpu_deinitialize_performance_model(model); STARPU_PTHREAD_RWLOCK_UNLOCK(&model->state->model_rwlock); free(node->model->state); node->model->state = NULL; _starpu_perfmodel_list_erase(®istered_models, node); _starpu_perfmodel_delete(node); } STARPU_PTHREAD_RWLOCK_UNLOCK(®istered_models_rwlock); STARPU_PTHREAD_RWLOCK_DESTROY(®istered_models_rwlock); _free_arch_combs(); starpu_perfmodel_free_sampling_directories(); } /* We first try to grab the global lock in read mode to check whether the model * was loaded or not (this is very likely to have been already loaded). If the * model was not loaded yet, we take the lock in write mode, and if the model * is still not loaded once we have the lock, we do load it. */ void _starpu_load_history_based_model(struct starpu_perfmodel *model, unsigned scan_history) { STARPU_PTHREAD_RWLOCK_WRLOCK(&model->state->model_rwlock); if(!model->is_loaded) { char path[STR_LONG_LENGTH]; starpu_perfmodel_get_model_path(model->symbol, path, sizeof(path)); // Check if a symbol is defined before trying to load the model from a file STARPU_ASSERT_MSG(model->symbol, "history-based performance models must have a symbol"); _STARPU_DEBUG("Opening performance model file %s for model %s ...\n", path, model->symbol); unsigned calibrate_flag = _starpu_get_calibrate_flag(); model->benchmarking = calibrate_flag; model->is_loaded = 1; if (calibrate_flag == 2) { /* The user specified that the performance model should * be overwritten, so we don't load the existing file ! * */ _STARPU_DEBUG("Overwrite existing file\n"); } else { /* We try to load the file */ FILE *f; f = fopen(path, "r"); if (f) { int locked; locked = _starpu_frdlock(f) == 0; parse_model_file(f, path, model, scan_history); if (locked) _starpu_frdunlock(f); fclose(f); _STARPU_DEBUG("Performance model file %s for model %s is loaded\n", path, model->symbol); } else { _STARPU_DEBUG("Performance model file %s does not exist or is not readable\n", path); } } } STARPU_PTHREAD_RWLOCK_UNLOCK(&model->state->model_rwlock); } void starpu_perfmodel_directory(FILE *output) { fprintf(output, "directory: <%s>\n", _starpu_get_perf_model_dir_codelet()); } /* This function is intended to be used by external tools that should read * the performance model files */ int starpu_perfmodel_list(FILE *output) { #if !defined(_WIN32) || defined(__MINGW32__) || defined(__CYGWIN__) char *path; DIR *dp; struct dirent *ep; path = _starpu_get_perf_model_dir_codelet(); dp = opendir(path); if (dp != NULL) { while ((ep = readdir(dp))) { if (strcmp(ep->d_name, ".") && strcmp(ep->d_name, "..")) fprintf(output, "file: <%s>\n", ep->d_name); } closedir (dp); } else { _STARPU_DISP("Could not open the perfmodel directory <%s>: %s\n", path, strerror(errno)); } return 0; #else _STARPU_MSG("Listing perfmodels is not implemented on pure Windows yet\n"); return 1; #endif } /* This function is intended to be used by external tools that should read the * performance model files */ /* TODO: write an clear function, to free symbol and history */ int starpu_perfmodel_load_symbol(const char *symbol, struct starpu_perfmodel *model) { model->symbol = strdup(symbol); /* where is the file if it exists ? */ char path[STR_LONG_LENGTH]; starpu_perfmodel_get_model_path(model->symbol, path, sizeof(path)); // _STARPU_DEBUG("get_model_path -> %s\n", path); /* does it exist ? */ int res; res = access(path, F_OK); if (res) { const char *dot = strrchr(symbol, '.'); if (dot) { char *symbol2 = strdup(symbol); symbol2[dot-symbol] = '\0'; int ret; _STARPU_DISP("note: loading history from %s instead of %s\n", symbol2, symbol); ret = starpu_perfmodel_load_symbol(symbol2,model); free(symbol2); return ret; } _STARPU_DISP("There is no performance model for symbol %s\n", symbol); return 1; } return starpu_perfmodel_load_file(path, model); } int starpu_perfmodel_load_file(const char *filename, struct starpu_perfmodel *model) { int res, ret = 0; FILE *f = fopen(filename, "r"); int locked; STARPU_ASSERT(f); starpu_perfmodel_init(model); locked = _starpu_frdlock(f) == 0; ret = parse_model_file(f, filename, model, 1); if (locked) _starpu_frdunlock(f); res = fclose(f); STARPU_ASSERT(res == 0); return ret; } int starpu_perfmodel_unload_model(struct starpu_perfmodel *model) { if (model->symbol) { free((char *)model->symbol); model->symbol = NULL; } _starpu_deinitialize_performance_model(model); free(model->state); model->state = NULL; STARPU_PTHREAD_RWLOCK_WRLOCK(®istered_models_rwlock); struct _starpu_perfmodel *node; for (node = _starpu_perfmodel_list_begin(®istered_models); node != _starpu_perfmodel_list_end(®istered_models); node = _starpu_perfmodel_list_next(node)) { if (node->model == model) { _starpu_perfmodel_list_erase(®istered_models, node); _starpu_perfmodel_delete(node); break; } } STARPU_PTHREAD_RWLOCK_UNLOCK(®istered_models_rwlock); return 0; } char* starpu_perfmodel_get_archtype_name(enum starpu_worker_archtype archtype) { switch(archtype) { case(STARPU_CPU_WORKER): return "cpu"; break; case(STARPU_CUDA_WORKER): return "cuda"; break; case(STARPU_OPENCL_WORKER): return "opencl"; break; case(STARPU_MIC_WORKER): return "mic"; break; case(STARPU_SCC_WORKER): return "scc"; break; default: STARPU_ABORT(); break; } } void starpu_perfmodel_get_arch_name(struct starpu_perfmodel_arch* arch, char *archname, size_t maxlen,unsigned impl) { int i; int comb = _starpu_perfmodel_create_comb_if_needed(arch); STARPU_ASSERT(comb != -1); char devices[STR_VERY_LONG_LENGTH]; int written = 0; strcpy(devices, ""); for(i=0 ; indevices ; i++) { written += snprintf(devices + written, sizeof(devices)-written, "%s%d%s", starpu_perfmodel_get_archtype_name(arch->devices[i].type), arch->devices[i].devid, i != arch->ndevices-1 ? "_":""); } snprintf(archname, maxlen, "%s_impl%u (Comb%d)", devices, impl, comb); } void starpu_perfmodel_debugfilepath(struct starpu_perfmodel *model, struct starpu_perfmodel_arch* arch, char *path, size_t maxlen, unsigned nimpl) { int comb = starpu_perfmodel_arch_comb_get(arch->ndevices, arch->devices); STARPU_ASSERT(comb != -1); char archname[STR_SHORT_LENGTH]; starpu_perfmodel_get_arch_name(arch, archname, sizeof(archname), nimpl); STARPU_ASSERT(path); get_model_debug_path(model, archname, path, maxlen); } double _starpu_regression_based_job_expected_perf(struct starpu_perfmodel *model, struct starpu_perfmodel_arch* arch, struct _starpu_job *j, unsigned nimpl) { int comb; double exp = NAN; size_t size; struct starpu_perfmodel_regression_model *regmodel = NULL; comb = starpu_perfmodel_arch_comb_get(arch->ndevices, arch->devices); size = _starpu_job_get_data_size(model, arch, nimpl, j); if(comb == -1) goto docal; if (model->state->per_arch[comb] == NULL) // The model has not been executed on this combination goto docal; regmodel = &model->state->per_arch[comb][nimpl].regression; if (regmodel->valid && size >= regmodel->minx * 0.9 && size <= regmodel->maxx * 1.1) exp = regmodel->alpha*pow((double)size, regmodel->beta); docal: STARPU_HG_DISABLE_CHECKING(model->benchmarking); if (isnan(exp) && !model->benchmarking) { char archname[STR_SHORT_LENGTH]; starpu_perfmodel_get_arch_name(arch, archname, sizeof(archname), nimpl); _STARPU_DISP("Warning: model %s is not calibrated enough for %s size %lu (only %u measurements from size %lu to %lu), forcing calibration for this run. Use the STARPU_CALIBRATE environment variable to control this.\n", model->symbol, archname, (unsigned long) size, regmodel?regmodel->nsample:0, regmodel?regmodel->minx:0, regmodel?regmodel->maxx:0); _starpu_set_calibrate_flag(1); model->benchmarking = 1; } return exp; } double _starpu_non_linear_regression_based_job_expected_perf(struct starpu_perfmodel *model, struct starpu_perfmodel_arch* arch, struct _starpu_job *j,unsigned nimpl) { int comb; double exp = NAN; size_t size; struct starpu_perfmodel_regression_model *regmodel; struct starpu_perfmodel_history_table *entry = NULL; size = _starpu_job_get_data_size(model, arch, nimpl, j); comb = starpu_perfmodel_arch_comb_get(arch->ndevices, arch->devices); if(comb == -1) goto docal; if (model->state->per_arch[comb] == NULL) // The model has not been executed on this combination goto docal; regmodel = &model->state->per_arch[comb][nimpl].regression; if (regmodel->nl_valid && size >= regmodel->minx * 0.9 && size <= regmodel->maxx * 1.1) exp = regmodel->a*pow((double)size, regmodel->b) + regmodel->c; else { uint32_t key = _starpu_compute_buffers_footprint(model, arch, nimpl, j); struct starpu_perfmodel_per_arch *per_arch_model = &model->state->per_arch[comb][nimpl]; struct starpu_perfmodel_history_table *history; STARPU_PTHREAD_RWLOCK_RDLOCK(&model->state->model_rwlock); history = per_arch_model->history; HASH_FIND_UINT32_T(history, &key, entry); STARPU_PTHREAD_RWLOCK_UNLOCK(&model->state->model_rwlock); /* Here helgrind would shout that this is unprotected access. * We do not care about racing access to the mean, we only want * a good-enough estimation */ if (entry && entry->history_entry && entry->history_entry->nsample >= _starpu_calibration_minimum) exp = entry->history_entry->mean; docal: STARPU_HG_DISABLE_CHECKING(model->benchmarking); if (isnan(exp) && !model->benchmarking) { char archname[STR_SHORT_LENGTH]; starpu_perfmodel_get_arch_name(arch, archname, sizeof(archname), nimpl); _STARPU_DISP("Warning: model %s is not calibrated enough for %s size %lu (only %u measurements), forcing calibration for this run. Use the STARPU_CALIBRATE environment variable to control this.\n", model->symbol, archname, (unsigned long) size, entry && entry->history_entry ? entry->history_entry->nsample : 0); _starpu_set_calibrate_flag(1); model->benchmarking = 1; } } return exp; } double _starpu_history_based_job_expected_perf(struct starpu_perfmodel *model, struct starpu_perfmodel_arch* arch, struct _starpu_job *j,unsigned nimpl) { int comb; double exp = NAN; struct starpu_perfmodel_per_arch *per_arch_model; struct starpu_perfmodel_history_entry *entry = NULL; struct starpu_perfmodel_history_table *history, *elt; uint32_t key; comb = starpu_perfmodel_arch_comb_get(arch->ndevices, arch->devices); if(comb == -1) goto docal; if (model->state->per_arch[comb] == NULL) // The model has not been executed on this combination goto docal; per_arch_model = &model->state->per_arch[comb][nimpl]; key = _starpu_compute_buffers_footprint(model, arch, nimpl, j); STARPU_PTHREAD_RWLOCK_RDLOCK(&model->state->model_rwlock); history = per_arch_model->history; HASH_FIND_UINT32_T(history, &key, elt); entry = (elt == NULL) ? NULL : elt->history_entry; STARPU_PTHREAD_RWLOCK_UNLOCK(&model->state->model_rwlock); /* Here helgrind would shout that this is unprotected access. * We do not care about racing access to the mean, we only want * a good-enough estimation */ if (entry && entry->nsample >= _starpu_calibration_minimum) /* TODO: report differently if we've scheduled really enough * of that task and the scheduler should perhaps put it aside */ /* Calibrated enough */ exp = entry->mean; docal: STARPU_HG_DISABLE_CHECKING(model->benchmarking); if (isnan(exp) && !model->benchmarking) { char archname[STR_SHORT_LENGTH]; starpu_perfmodel_get_arch_name(arch, archname, sizeof(archname), nimpl); _STARPU_DISP("Warning: model %s is not calibrated enough for %s size %ld (only %u measurements), forcing calibration for this run. Use the STARPU_CALIBRATE environment variable to control this.\n", model->symbol, archname, j->task?(long int)_starpu_job_get_data_size(model, arch, nimpl, j):-1, entry ? entry->nsample : 0); _starpu_set_calibrate_flag(1); model->benchmarking = 1; } return exp; } double starpu_perfmodel_history_based_expected_perf(struct starpu_perfmodel *model, struct starpu_perfmodel_arch * arch, uint32_t footprint) { struct _starpu_job j = { .footprint = footprint, .footprint_is_computed = 1, }; return _starpu_history_based_job_expected_perf(model, arch, &j, j.nimpl); } int _starpu_perfmodel_create_comb_if_needed(struct starpu_perfmodel_arch* arch) { int comb = starpu_perfmodel_arch_comb_get(arch->ndevices, arch->devices); if(comb == -1) comb = starpu_perfmodel_arch_comb_add(arch->ndevices, arch->devices); return comb; } void _starpu_update_perfmodel_history(struct _starpu_job *j, struct starpu_perfmodel *model, struct starpu_perfmodel_arch* arch, unsigned cpuid STARPU_ATTRIBUTE_UNUSED, double measured, unsigned impl) { if (model) { int c; unsigned found = 0; int comb = _starpu_perfmodel_create_comb_if_needed(arch); STARPU_PTHREAD_RWLOCK_WRLOCK(&model->state->model_rwlock); for(c = 0; c < model->state->ncombs; c++) { if(model->state->combs[c] == comb) { found = 1; break; } } if(!found) { if (model->state->ncombs + 1 >= model->state->ncombs_set) { // The number of combinations is bigger than the one which was initially allocated, we need to reallocate, // do not only reallocate 1 extra comb, rather reallocate 5 to avoid too frequent calls to _starpu_perfmodel_realloc _starpu_perfmodel_realloc(model, model->state->ncombs_set+5); } model->state->combs[model->state->ncombs++] = comb; } if(!model->state->per_arch[comb]) { _starpu_perfmodel_malloc_per_arch(model, comb, STARPU_MAXIMPLEMENTATIONS); _starpu_perfmodel_malloc_per_arch_is_set(model, comb, STARPU_MAXIMPLEMENTATIONS); } struct starpu_perfmodel_per_arch *per_arch_model = &model->state->per_arch[comb][impl]; if (model->state->per_arch_is_set[comb][impl] == 0) { // We are adding a new implementation for the given comb and the given impl model->state->nimpls[comb]++; model->state->per_arch_is_set[comb][impl] = 1; } if (model->type == STARPU_HISTORY_BASED || model->type == STARPU_NL_REGRESSION_BASED) { struct starpu_perfmodel_history_entry *entry; struct starpu_perfmodel_history_table *elt; struct starpu_perfmodel_history_list **list; uint32_t key = _starpu_compute_buffers_footprint(model, arch, impl, j); list = &per_arch_model->list; HASH_FIND_UINT32_T(per_arch_model->history, &key, elt); entry = (elt == NULL) ? NULL : elt->history_entry; if (!entry) { /* this is the first entry with such a footprint */ _STARPU_MALLOC(entry, sizeof(struct starpu_perfmodel_history_entry)); /* Tell helgrind that we do not care about * racing access to the sampling, we only want a * good-enough estimation */ STARPU_HG_DISABLE_CHECKING(entry->nsample); STARPU_HG_DISABLE_CHECKING(entry->mean); /* Do not take the first measurement into account, it is very often quite bogus */ /* TODO: it'd be good to use a better estimation heuristic, like the median, or latest n values, etc. */ entry->mean = 0; entry->sum = 0; entry->deviation = 0.0; entry->sum2 = 0; entry->size = _starpu_job_get_data_size(model, arch, impl, j); entry->flops = j->task->flops; entry->footprint = key; entry->nsample = 0; entry->nerror = 0; insert_history_entry(entry, list, &per_arch_model->history); } else { /* There is already an entry with the same footprint */ double local_deviation = measured/entry->mean; if (entry->nsample && (100 * local_deviation > (100 + historymaxerror) || (100 / local_deviation > (100 + historymaxerror)))) { entry->nerror++; /* More errors than measurements, we're most probably completely wrong, we flush out all the entries */ if (entry->nerror >= entry->nsample) { char archname[STR_SHORT_LENGTH]; starpu_perfmodel_get_arch_name(arch, archname, sizeof(archname), impl); _STARPU_DISP("Too big deviation for model %s on %s: %f vs average %f, %u such errors against %u samples (%+f%%), flushing the performance model. Use the STARPU_HISTORY_MAX_ERROR environement variable to control the threshold (currently %d%%)\n", model->symbol, archname, measured, entry->mean, entry->nerror, entry->nsample, measured * 100. / entry->mean - 100, historymaxerror); entry->sum = 0.0; entry->sum2 = 0.0; entry->nsample = 0; entry->nerror = 0; entry->mean = 0.0; entry->deviation = 0.0; } } else { entry->sum += measured; entry->sum2 += measured*measured; entry->nsample++; unsigned n = entry->nsample; entry->mean = entry->sum / n; entry->deviation = sqrt((entry->sum2 - (entry->sum*entry->sum)/n)/n); } if (j->task->flops != 0.) { if (entry->flops == 0.) entry->flops = j->task->flops; else if (((entry->flops - j->task->flops) / entry->flops) > 0.00001) /* Incoherent flops! forget about trying to record flops */ entry->flops = NAN; } } STARPU_ASSERT(entry); } if (model->type == STARPU_REGRESSION_BASED || model->type == STARPU_NL_REGRESSION_BASED) { struct starpu_perfmodel_regression_model *reg_model; reg_model = &per_arch_model->regression; /* update the regression model */ size_t job_size = _starpu_job_get_data_size(model, arch, impl, j); double logy, logx; logx = log((double)job_size); logy = log(measured); reg_model->sumlnx += logx; reg_model->sumlnx2 += logx*logx; reg_model->sumlny += logy; reg_model->sumlnxlny += logx*logy; if (reg_model->minx == 0 || job_size < reg_model->minx) reg_model->minx = job_size; if (reg_model->maxx == 0 || job_size > reg_model->maxx) reg_model->maxx = job_size; reg_model->nsample++; if (VALID_REGRESSION(reg_model)) { unsigned n = reg_model->nsample; double num = (n*reg_model->sumlnxlny - reg_model->sumlnx*reg_model->sumlny); double denom = (n*reg_model->sumlnx2 - reg_model->sumlnx*reg_model->sumlnx); reg_model->beta = num/denom; reg_model->alpha = exp((reg_model->sumlny - reg_model->beta*reg_model->sumlnx)/n); reg_model->valid = 1; } } #ifdef STARPU_MODEL_DEBUG struct starpu_task *task = j->task; starpu_perfmodel_debugfilepath(model, arch_combs[comb], per_arch_model->debug_path, STR_LONG_LENGTH, impl); FILE *f = fopen(per_arch_model->debug_path, "a+"); int locked; if (f == NULL) { _STARPU_DISP("Error <%s> when opening file <%s>\n", strerror(errno), per_arch_model->debug_path); return; } locked = _starpu_fwrlock(f) == 0; if (!j->footprint_is_computed) (void) _starpu_compute_buffers_footprint(model, arch, impl, j); STARPU_ASSERT(j->footprint_is_computed); fprintf(f, "0x%x\t%lu\t%f\t%f\t%f\t%u\t\t", j->footprint, (unsigned long) _starpu_job_get_data_size(model, arch, impl, j), measured, task->predicted, task->predicted_transfer, cpuid); unsigned i; unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); for (i = 0; i < nbuffers; i++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, i); STARPU_ASSERT(handle->ops); STARPU_ASSERT(handle->ops->display); handle->ops->display(handle, f); } fprintf(f, "\n"); if (locked) _starpu_fwrunlock(f); fclose(f); #endif STARPU_PTHREAD_RWLOCK_UNLOCK(&model->state->model_rwlock); } } void starpu_perfmodel_update_history(struct starpu_perfmodel *model, struct starpu_task *task, struct starpu_perfmodel_arch * arch, unsigned cpuid, unsigned nimpl, double measured) { struct _starpu_job *job = _starpu_get_job_associated_to_task(task); #ifdef STARPU_SIMGRID STARPU_ASSERT_MSG(0, "We are not supposed to update history when simulating execution"); #endif _starpu_init_and_load_perfmodel(model); /* Record measurement */ _starpu_update_perfmodel_history(job, model, arch, cpuid, measured, nimpl); /* and save perfmodel on termination */ _starpu_set_calibrate_flag(1); } int starpu_perfmodel_list_combs(FILE *output, struct starpu_perfmodel *model) { int comb; fprintf(output, "Model <%s>\n", model->symbol); for(comb = 0; comb < model->state->ncombs; comb++) { struct starpu_perfmodel_arch *arch; int device; arch = starpu_perfmodel_arch_comb_fetch(model->state->combs[comb]); fprintf(output, "\tComb %d: %d device%s\n", model->state->combs[comb], arch->ndevices, arch->ndevices>1?"s":""); for(device=0 ; devicendevices ; device++) { char *name = starpu_perfmodel_get_archtype_name(arch->devices[device].type); fprintf(output, "\t\tDevice %d: type: %s - devid: %d - ncores: %d\n", device, name, arch->devices[device].devid, arch->devices[device].ncores); } } return 0; } struct starpu_perfmodel_per_arch *starpu_perfmodel_get_model_per_arch(struct starpu_perfmodel *model, struct starpu_perfmodel_arch *arch, unsigned impl) { int comb = starpu_perfmodel_arch_comb_get(arch->ndevices, arch->devices); if (comb == -1) return NULL; if (!model->state->per_arch[comb]) return NULL; return &model->state->per_arch[comb][impl]; } struct starpu_perfmodel_per_arch *_starpu_perfmodel_get_model_per_devices(struct starpu_perfmodel *model, int impl, va_list varg_list) { struct starpu_perfmodel_arch arch; va_list varg_list_copy; int i, arg_type; int is_cpu_set = 0; // We first count the number of devices arch.ndevices = 0; va_copy(varg_list_copy, varg_list); while ((arg_type = va_arg(varg_list_copy, int)) != -1) { int devid = va_arg(varg_list_copy, int); int ncores = va_arg(varg_list_copy, int); arch.ndevices ++; if (arg_type == STARPU_CPU_WORKER) { STARPU_ASSERT_MSG(is_cpu_set == 0, "STARPU_CPU_WORKER can only be specified once\n"); STARPU_ASSERT_MSG(devid==0, "STARPU_CPU_WORKER must be followed by a value 0 for the device id"); is_cpu_set = 1; } else { STARPU_ASSERT_MSG(ncores==1, "%s must be followed by a value 1 for ncores", starpu_worker_get_type_as_string(arg_type)); } } va_end(varg_list_copy); // We set the devices _STARPU_MALLOC(arch.devices, arch.ndevices * sizeof(struct starpu_perfmodel_device)); va_copy(varg_list_copy, varg_list); for(i=0 ; i= model->state->ncombs_set) _starpu_perfmodel_realloc(model, comb+1); // Get the per_arch object if (model->state->per_arch[comb] == NULL) { _starpu_perfmodel_malloc_per_arch(model, comb, STARPU_MAXIMPLEMENTATIONS); _starpu_perfmodel_malloc_per_arch_is_set(model, comb, STARPU_MAXIMPLEMENTATIONS); model->state->nimpls[comb] = 0; } model->state->per_arch_is_set[comb][impl] = 1; model->state->nimpls[comb] ++; return &model->state->per_arch[comb][impl]; } struct starpu_perfmodel_per_arch *starpu_perfmodel_get_model_per_devices(struct starpu_perfmodel *model, int impl, ...) { va_list varg_list; struct starpu_perfmodel_per_arch *per_arch; va_start(varg_list, impl); per_arch = _starpu_perfmodel_get_model_per_devices(model, impl, varg_list); va_end(varg_list); return per_arch; } int starpu_perfmodel_set_per_devices_cost_function(struct starpu_perfmodel *model, int impl, starpu_perfmodel_per_arch_cost_function func, ...) { va_list varg_list; struct starpu_perfmodel_per_arch *per_arch; va_start(varg_list, func); per_arch = _starpu_perfmodel_get_model_per_devices(model, impl, varg_list); per_arch->cost_function = func; va_end(varg_list); return 0; } int starpu_perfmodel_set_per_devices_size_base(struct starpu_perfmodel *model, int impl, starpu_perfmodel_per_arch_size_base func, ...) { va_list varg_list; struct starpu_perfmodel_per_arch *per_arch; va_start(varg_list, func); per_arch = _starpu_perfmodel_get_model_per_devices(model, impl, varg_list); per_arch->size_base = func; va_end(varg_list); return 0; } starpu-1.2.3+dfsg/src/core/perfmodel/perfmodel_nan.c000066400000000000000000000041161320135501600224210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include /** Some systems cannot read NAN values, yes, it is really bad ... */ #if defined(STARPU_HAVE_WINDOWS) || defined(STARPU_OPENBSD_SYS) # define _STARPU_OWN_NAN 1 #else # define _STARPU_OWN_NAN 0 #endif #if _STARPU_OWN_NAN == 1 static void _starpu_read_spaces(FILE *f) { int c = getc(f); if (isspace(c)) { while (isspace(c)) c = getc(f); ungetc(c, f); } else { ungetc(c, f); } } #endif /* _STARPU_OWN_NAN */ void _starpu_write_double(FILE *f, const char *format, double val) { #if _STARPU_OWN_NAN == 1 if (isnan(val)) { fprintf(f, "NaN"); } else { fprintf(f, format, val); } #else fprintf(f, format, val); #endif } int _starpu_read_double(FILE *f, char *format, double *val) { #if _STARPU_OWN_NAN == 1 _starpu_read_spaces(f); int x1 = getc(f); if (x1 == 'N') { int x2 = getc(f); int x3 = getc(f); if (x2 == 'a' && x3 == 'N') { #ifdef _MSC_VER unsigned long long _mynan = 0x7fffffffffffffffull; double mynan = *(double*)&_mynan; #else double mynan = NAN; #endif *val = mynan; return 1; } else { return 0; } } else { ungetc(x1, f); return fscanf(f, format, val); } #else return fscanf(f, format, val); #endif } starpu-1.2.3+dfsg/src/core/perfmodel/perfmodel_print.c000066400000000000000000000226201320135501600230010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2013-2017 Université de Bordeaux * Copyright (C) 2011, 2012, 2013, 2014, 2015, 2017 CNRS * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "perfmodel.h" static void _starpu_perfmodel_print_history_based(struct starpu_perfmodel_per_arch *per_arch_model, char *parameter, uint32_t *footprint, FILE *output) { struct starpu_perfmodel_history_list *ptr; ptr = per_arch_model->list; if (!parameter && ptr) fprintf(output, "# hash\t\tsize\t\tflops\t\tmean (us)\tstddev (us)\t\tn\n"); while (ptr) { struct starpu_perfmodel_history_entry *entry = ptr->entry; if (!footprint || entry->footprint == *footprint) { if (!parameter) { /* There isn't a parameter that is explicitely requested, so we display all parameters */ printf("%08x\t%-15lu\t%-15e\t%-15e\t%-15e\t%u\n", entry->footprint, (unsigned long) entry->size, entry->flops, entry->mean, entry->deviation, entry->nsample); } else { /* only display the parameter that was specifically requested */ if (strcmp(parameter, "mean") == 0) { printf("%-15e\n", entry->mean); } if (strcmp(parameter, "stddev") == 0) { printf("%-15e\n", entry->deviation); return; } } } ptr = ptr->next; } } void starpu_perfmodel_print(struct starpu_perfmodel *model, struct starpu_perfmodel_arch* arch, unsigned nimpl, char *parameter, uint32_t *footprint, FILE *output) { int comb = starpu_perfmodel_arch_comb_get(arch->ndevices, arch->devices); STARPU_ASSERT(comb != -1); struct starpu_perfmodel_per_arch *arch_model = &model->state->per_arch[comb][nimpl]; if (arch_model->regression.nsample || arch_model->regression.valid || arch_model->regression.nl_valid || arch_model->list) { char archname[32]; starpu_perfmodel_get_arch_name(arch, archname, 32, nimpl); fprintf(output, "# performance model for %s\n", archname); } if (parameter == NULL) { /* no specific parameter was requested, so we display everything */ if (arch_model->regression.nsample) { fprintf(output, "\tRegression : #sample = %u\n", arch_model->regression.nsample); } /* Only display the regression model if we could actually build a model */ if (arch_model->regression.valid) { fprintf(output, "\tLinear: y = alpha size ^ beta\n"); fprintf(output, "\t\talpha = %e\n", arch_model->regression.alpha); fprintf(output, "\t\tbeta = %e\n", arch_model->regression.beta); } else { //fprintf(output, "\tLinear model is INVALID\n"); } if (arch_model->regression.nl_valid) { fprintf(output, "\tNon-Linear: y = a size ^b + c\n"); fprintf(output, "\t\ta = %e\n", arch_model->regression.a); fprintf(output, "\t\tb = %e\n", arch_model->regression.b); fprintf(output, "\t\tc = %e\n", arch_model->regression.c); } else { //fprintf(output, "\tNon-Linear model is INVALID\n"); } _starpu_perfmodel_print_history_based(arch_model, parameter, footprint, output); #if 0 char debugname[1024]; starpu_perfmodel_debugfilepath(model, arch, debugname, 1024, nimpl); printf("\t debug file path : %s\n", debugname); #endif } else { /* only display the parameter that was specifically requested */ if (strcmp(parameter, "a") == 0) { printf("%e\n", arch_model->regression.a); return; } if (strcmp(parameter, "b") == 0) { printf("%e\n", arch_model->regression.b); return; } if (strcmp(parameter, "c") == 0) { printf("%e\n", arch_model->regression.c); return; } if (strcmp(parameter, "alpha") == 0) { printf("%e\n", arch_model->regression.alpha); return; } if (strcmp(parameter, "beta") == 0) { printf("%e\n", arch_model->regression.beta); return; } if (strcmp(parameter, "path-file-debug") == 0) { char debugname[256]; starpu_perfmodel_debugfilepath(model, arch, debugname, 256, nimpl); printf("%s\n", debugname); return; } if ((strcmp(parameter, "mean") == 0) || (strcmp(parameter, "stddev") == 0)) { _starpu_perfmodel_print_history_based(arch_model, parameter, footprint, output); return; } /* TODO display if it's valid ? */ fprintf(output, "Unknown parameter requested, aborting.\n"); exit(-1); } } int starpu_perfmodel_print_all(struct starpu_perfmodel *model, char *arch, char *parameter, uint32_t *footprint, FILE *output) { if (arch == NULL) { int comb, impl; for(comb = 0; comb < starpu_perfmodel_get_narch_combs(); comb++) { struct starpu_perfmodel_arch *arch_comb = starpu_perfmodel_arch_comb_fetch(comb); int nimpls = model->state ? model->state->nimpls[comb] : 0; for(impl = 0; impl < nimpls; impl++) starpu_perfmodel_print(model, arch_comb, impl, parameter, footprint, output); } } else { if (strcmp(arch, "cpu") == 0) { int implid; struct starpu_perfmodel_arch perf_arch; perf_arch.ndevices = 1; _STARPU_MALLOC(perf_arch.devices, sizeof(struct starpu_perfmodel_device)); perf_arch.devices[0].type = STARPU_CPU_WORKER; perf_arch.devices[0].devid = 0; perf_arch.devices[0].ncores = 1; int comb = starpu_perfmodel_arch_comb_get(perf_arch.ndevices, perf_arch.devices); STARPU_ASSERT(comb != -1); int nimpls = model->state->nimpls[comb]; for (implid = 0; implid < nimpls; implid++) starpu_perfmodel_print(model, &perf_arch,implid, parameter, footprint, output); /* Display all codelets on cpu */ free(perf_arch.devices); return 0; } int k; if (sscanf(arch, "cpu:%d", &k) == 1) { /* For combined CPU workers */ if ((k < 1) || (k > STARPU_MAXCPUS)) { fprintf(output, "Invalid CPU size\n"); exit(-1); } int implid; struct starpu_perfmodel_arch perf_arch; perf_arch.ndevices = 1; _STARPU_MALLOC(perf_arch.devices, sizeof(struct starpu_perfmodel_device)); perf_arch.devices[0].type = STARPU_CPU_WORKER; perf_arch.devices[0].devid = 0; perf_arch.devices[0].ncores = k; int comb = starpu_perfmodel_arch_comb_get(perf_arch.ndevices, perf_arch.devices); STARPU_ASSERT(comb != -1); int nimpls = model->state->nimpls[comb]; for (implid = 0; implid < nimpls; implid++) starpu_perfmodel_print(model, &perf_arch, implid, parameter, footprint, output); free(perf_arch.devices); return 0; } if (strcmp(arch, "cuda") == 0) { int implid; struct starpu_perfmodel_arch perf_arch; perf_arch.ndevices = 1; _STARPU_MALLOC(perf_arch.devices, sizeof(struct starpu_perfmodel_device)); perf_arch.devices[0].type = STARPU_CUDA_WORKER; perf_arch.devices[0].ncores = 1; int comb; for(comb = 0; comb < starpu_perfmodel_get_narch_combs(); comb++) { struct starpu_perfmodel_arch *arch_comb = starpu_perfmodel_arch_comb_fetch(comb); if(arch_comb->ndevices == 1 && arch_comb->devices[0].type == STARPU_CUDA_WORKER) { perf_arch.devices[0].devid = arch_comb->devices[0].devid; int nimpls = model->state->nimpls[comb]; for (implid = 0; implid < nimpls; implid++) starpu_perfmodel_print(model, &perf_arch, implid, parameter, footprint, output); } } free(perf_arch.devices); return 0; } /* TODO: There must be a cleaner way ! */ int gpuid; int nmatched; nmatched = sscanf(arch, "cuda_%d", &gpuid); if (nmatched == 0) nmatched = sscanf(arch, "cuda%d", &gpuid); if (nmatched == 1) { struct starpu_perfmodel_arch perf_arch; perf_arch.ndevices = 1; _STARPU_MALLOC(perf_arch.devices, sizeof(struct starpu_perfmodel_device)); perf_arch.devices[0].type = STARPU_CUDA_WORKER; perf_arch.devices[0].devid = gpuid; perf_arch.devices[0].ncores = 1; int comb = starpu_perfmodel_arch_comb_get(perf_arch.ndevices, perf_arch.devices); STARPU_ASSERT(comb != -1); int nimpls = model->state->nimpls[comb]; int implid; for (implid = 0; implid < nimpls; implid++) starpu_perfmodel_print(model, &perf_arch, implid, parameter, footprint, output); return 0; } fprintf(output, "Unknown architecture requested\n"); return -1; } return 0; } int starpu_perfmodel_print_estimations(struct starpu_perfmodel *model, uint32_t footprint, FILE *output) { unsigned workerid; for (workerid = 0; workerid < starpu_worker_get_count(); workerid++) { struct starpu_perfmodel_arch* arch = starpu_worker_get_perf_archtype(workerid, STARPU_NMAX_SCHED_CTXS); int comb = starpu_perfmodel_arch_comb_get(arch->ndevices, arch->devices); struct starpu_perfmodel_per_arch *arch_model; struct starpu_perfmodel_history_list *ptr = NULL; if (comb >= 0 && model->state->per_arch[comb]) { arch_model = &model->state->per_arch[comb][0]; for (ptr = arch_model->list; ptr; ptr = ptr->next) { struct starpu_perfmodel_history_entry *entry = ptr->entry; if (entry->footprint == footprint) { fprintf(output, "%s%e", workerid?" ":"", entry->mean); break; } } } if (!ptr) { /* Didn't find any entry :/ */ fprintf(output, "%sinf", workerid?" ":""); } } return 0; } starpu-1.2.3+dfsg/src/core/perfmodel/regression.c000066400000000000000000000100571320135501600217710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2011 Université de Bordeaux * Copyright (C) 2010, 2011, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #define MAXREGITER 1000 #define EPS 1.0e-10 static double compute_b(double c, unsigned n, unsigned *x, double *y) { double b; /* X = log (x) , Y = log (y - c) */ double sumxy = 0.0; double sumx = 0.0; double sumx2 = 0.0; double sumy = 0.0; unsigned i; for (i = 0; i < n; i++) { double xi = log(x[i]); double yi = log(y[i]-c); sumxy += xi*yi; sumx += xi; sumx2 += xi*xi; sumy += yi; } b = (n * sumxy - sumx * sumy) / (n*sumx2 - sumx*sumx); return b; } static double compute_a(double c, double b, unsigned n, unsigned *x, double *y) { double a; /* X = log (x) , Y = log (y - c) */ double sumx = 0.0; double sumy = 0.0; unsigned i; for (i = 0; i < n; i++) { double xi = log(x[i]); double yi = log(y[i]-c); sumx += xi; sumy += yi; } a = (sumy - b*sumx) / n; return a; } /* returns r */ static double test_r(double c, unsigned n, unsigned *x, double *y) { double r; // printf("test c = %e\n", c); /* X = log (x) , Y = log (y - c) */ double sumxy = 0.0; double sumx = 0.0; double sumx2 = 0.0; double sumy = 0.0; double sumy2 = 0.0; unsigned i; for (i = 0; i < n; i++) { double xi = log(x[i]); double yi = log(y[i]-c); // printf("Xi = %e, Yi = %e\n", xi, yi); sumxy += xi*yi; sumx += xi; sumx2 += xi*xi; sumy += yi; sumy2 += yi*yi; } //printf("sumxy %e\n", sumxy); //printf("sumx %e\n", sumx); //printf("sumx2 %e\n", sumx2); //printf("sumy %e\n", sumy); //printf("sumy2 %e\n", sumy2); r = (n * sumxy - sumx * sumy) / sqrt( (n* sumx2 - sumx*sumx) * (n*sumy2 - sumy*sumy) ); return r; } static unsigned find_list_size(struct starpu_perfmodel_history_list *list_history) { unsigned cnt = 0; struct starpu_perfmodel_history_list *ptr = list_history; while (ptr) { cnt++; ptr = ptr->next; } return cnt; } static double find_list_min(double *y, unsigned n) { double min = 1.0e30; unsigned i; for (i = 0; i < n; i++) { min = STARPU_MIN(min, y[i]); } return min; } static void dump_list(unsigned *x, double *y, struct starpu_perfmodel_history_list *list_history) { struct starpu_perfmodel_history_list *ptr = list_history; unsigned i = 0; while (ptr) { x[i] = ptr->entry->size; y[i] = ptr->entry->mean; ptr = ptr->next; i++; } } /* y = ax^b + c * return 0 if success, -1 otherwise * if success, a, b and c are modified * */ int _starpu_regression_non_linear_power(struct starpu_perfmodel_history_list *ptr, double *a, double *b, double *c) { unsigned n = find_list_size(ptr); unsigned *x; _STARPU_MALLOC(x, n*sizeof(unsigned)); double *y; _STARPU_MALLOC(y, n*sizeof(double)); dump_list(x, y, ptr); double cmin = 0.0; double cmax = find_list_min(y, n); unsigned iter; double err = 100000.0; for (iter = 0; iter < MAXREGITER; iter++) { double c1, c2; double r1, r2; double radius = 0.01; c1 = cmin + (0.5-radius)*(cmax - cmin); c2 = cmin + (0.5+radius)*(cmax - cmin); r1 = test_r(c1, n, x, y); r2 = test_r(c2, n, x, y); double err1, err2; err1 = fabs(1.0 - r1); err2 = fabs(1.0 - r2); if (err1 < err2) { cmax = (cmin + cmax)/2; } else { /* 2 is better */ cmin = (cmin + cmax)/2; } if (fabs(err - STARPU_MIN(err1, err2)) < EPS) break; err = STARPU_MIN(err1, err2); } *c = (cmin + cmax)/2; *b = compute_b(*c, n, x, y); *a = exp(compute_a(*c, *b, n, x, y)); free(x); free(y); return 0; } starpu-1.2.3+dfsg/src/core/perfmodel/regression.h000066400000000000000000000017501320135501600217760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __REGRESSION_H__ #define __REGRESSION_H__ #include #include #include #include #include int _starpu_regression_non_linear_power(struct starpu_perfmodel_history_list *ptr, double *a, double *b, double *c); #endif // __REGRESSION_H__ starpu-1.2.3+dfsg/src/core/progress_hook.c000066400000000000000000000056071320135501600205250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2013 Université de Bordeaux * Copyright (C) 2010-2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #define NMAXHOOKS 16 struct progression_hook { unsigned (*func)(void *arg); void *arg; unsigned active; }; /* protect the hook table */ static starpu_pthread_rwlock_t progression_hook_rwlock; static struct progression_hook hooks[NMAXHOOKS] = {{NULL, NULL, 0}}; static int active_hook_cnt = 0; /* * Staticly initializing progression_hook_rwlock seems to lead to weird errors * on Darwin, so we do it dynamically. */ void _starpu_init_progression_hooks(void) { STARPU_PTHREAD_RWLOCK_INIT(&progression_hook_rwlock, NULL); STARPU_HG_DISABLE_CHECKING(active_hook_cnt); } int starpu_progression_hook_register(unsigned (*func)(void *arg), void *arg) { int hook; STARPU_PTHREAD_RWLOCK_WRLOCK(&progression_hook_rwlock); for (hook = 0; hook < NMAXHOOKS; hook++) { if (!hooks[hook].active) { /* We found an empty slot */ hooks[hook].func = func; hooks[hook].arg = arg; hooks[hook].active = 1; active_hook_cnt++; STARPU_PTHREAD_RWLOCK_UNLOCK(&progression_hook_rwlock); return hook; } } STARPU_PTHREAD_RWLOCK_UNLOCK(&progression_hook_rwlock); starpu_wake_all_blocked_workers(); /* We could not find an empty slot */ return -1; } void starpu_progression_hook_deregister(int hook_id) { STARPU_PTHREAD_RWLOCK_WRLOCK(&progression_hook_rwlock); if (hooks[hook_id].active) active_hook_cnt--; hooks[hook_id].active = 0; STARPU_PTHREAD_RWLOCK_UNLOCK(&progression_hook_rwlock); } unsigned _starpu_execute_registered_progression_hooks(void) { if (active_hook_cnt == 0) return 1; /* By default, it is possible to block, but if some progression hooks * requires that it's not blocking, we disable blocking. */ unsigned may_block = 1; unsigned hook; for (hook = 0; hook < NMAXHOOKS; hook++) { unsigned active; STARPU_PTHREAD_RWLOCK_RDLOCK(&progression_hook_rwlock); active = hooks[hook].active; STARPU_PTHREAD_RWLOCK_UNLOCK(&progression_hook_rwlock); unsigned may_block_hook = 1; if (active) may_block_hook = hooks[hook].func(hooks[hook].arg); /* As soon as one hook tells that the driver cannot be * blocking, we don't allow it. */ if (!may_block_hook) may_block = 0; } return may_block; } starpu-1.2.3+dfsg/src/core/progress_hook.h000066400000000000000000000014771320135501600205330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __PROGRESS_HOOK_H__ #define __PROGRESS_HOOK_H__ void _starpu_init_progression_hooks(void); unsigned _starpu_execute_registered_progression_hooks(void); #endif /* !__PROGRESS_HOOK_H__ */ starpu-1.2.3+dfsg/src/core/sched_ctx.c000066400000000000000000002256601320135501600176100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include starpu_pthread_rwlock_t changing_ctx_mutex[STARPU_NMAX_SCHED_CTXS]; static starpu_pthread_mutex_t sched_ctx_manag = STARPU_PTHREAD_MUTEX_INITIALIZER; static starpu_pthread_mutex_t finished_submit_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static struct starpu_task stop_submission_task = STARPU_TASK_INITIALIZER; starpu_pthread_key_t sched_ctx_key; static unsigned with_hypervisor = 0; static double hyp_start_sample[STARPU_NMAX_SCHED_CTXS]; static double hyp_start_allow_sample[STARPU_NMAX_SCHED_CTXS]; static double flops[STARPU_NMAX_SCHED_CTXS][STARPU_NMAXWORKERS]; static size_t data_size[STARPU_NMAX_SCHED_CTXS][STARPU_NMAXWORKERS]; static double hyp_actual_start_sample[STARPU_NMAX_SCHED_CTXS]; static double window_size; static int nobind; static unsigned _starpu_get_first_free_sched_ctx(struct _starpu_machine_config *config); static void _starpu_sched_ctx_add_workers_to_master(unsigned sched_ctx_id, int *workerids, int nworkers, int new_master); static void _starpu_sched_ctx_wake_these_workers_up(unsigned sched_ctx_id, int *workerids, int nworkers); static int _starpu_sched_ctx_find_master(unsigned sched_ctx_id, int *workerids, int nworkers); static void _starpu_sched_ctx_set_master(struct _starpu_sched_ctx *sched_ctx, int *workerids, int nworkers, int master); static void _starpu_worker_gets_into_ctx(unsigned sched_ctx_id, struct _starpu_worker *worker) { unsigned ret_sched_ctx = _starpu_sched_ctx_list_get_sched_ctx(worker->sched_ctx_list, sched_ctx_id); /* the worker was planning to go away in another ctx but finally he changed his mind & he's staying */ if (ret_sched_ctx == STARPU_NMAX_SCHED_CTXS) { /* add context to worker */ _starpu_sched_ctx_list_add(&worker->sched_ctx_list, sched_ctx_id); worker->nsched_ctxs++; } worker->removed_from_ctx[sched_ctx_id] = 0; if(worker->tmp_sched_ctx == (int) sched_ctx_id) worker->tmp_sched_ctx = -1; return; } void _starpu_worker_gets_out_of_ctx(unsigned sched_ctx_id, struct _starpu_worker *worker) { unsigned ret_sched_ctx = _starpu_sched_ctx_list_get_sched_ctx(worker->sched_ctx_list, sched_ctx_id); /* remove context from worker */ if(ret_sched_ctx != STARPU_NMAX_SCHED_CTXS) { /* don't remove scheduling data here, there might be tasks running and when post_exec executes scheduling data is not there any more, do it when deleting context, then we really won't need it anymore */ /* struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); */ /* if(sched_ctx && sched_ctx->sched_policy && sched_ctx->sched_policy->remove_workers) */ /* { */ /* _STARPU_TRACE_WORKER_SCHEDULING_PUSH; */ /* sched_ctx->sched_policy->remove_workers(sched_ctx_id, &worker->workerid, 1); */ /* _STARPU_TRACE_WORKER_SCHEDULING_POP; */ /* } */ _starpu_sched_ctx_list_remove(&worker->sched_ctx_list, sched_ctx_id); worker->nsched_ctxs--; } return; } static void _starpu_update_workers_with_ctx(int *workerids, int nworkers, int sched_ctx_id) { int i; struct _starpu_worker *worker = NULL; for(i = 0; i < nworkers; i++) { worker = _starpu_get_worker_struct(workerids[i]); STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); _starpu_worker_gets_into_ctx(sched_ctx_id, worker); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); } return; } static void _starpu_update_workers_without_ctx(int *workerids, int nworkers, int sched_ctx_id, unsigned now) { int i; struct _starpu_worker *worker = NULL; for(i = 0; i < nworkers; i++) { worker = _starpu_get_worker_struct(workerids[i]); if(now) { STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); _starpu_worker_gets_out_of_ctx(sched_ctx_id, worker); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); } else { STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); worker->removed_from_ctx[sched_ctx_id] = 1; STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); } } return; } void starpu_sched_ctx_stop_task_submission() { _starpu_exclude_task_from_dag(&stop_submission_task); int ret = _starpu_task_submit_internally(&stop_submission_task); STARPU_ASSERT(!ret); } void starpu_sched_ctx_worker_shares_tasks_lists(int workerid, int sched_ctx_id) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); int curr_workerid = starpu_worker_get_id(); /* if is the initial sched_ctx no point in taking the mutex, the workers are not launched yet, or if the current worker is calling this */ if(!sched_ctx->is_initial_sched && workerid != curr_workerid) STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); worker->shares_tasks_lists[sched_ctx_id] = 1; if(!sched_ctx->is_initial_sched && workerid != curr_workerid) STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); } static void _starpu_add_workers_to_sched_ctx(struct _starpu_sched_ctx *sched_ctx, int *workerids, int nworkers, int *added_workers, int *n_added_workers) { struct starpu_worker_collection *workers = sched_ctx->workers; struct _starpu_machine_config *config = _starpu_get_machine_config(); int nworkers_to_add = nworkers == -1 ? (int)config->topology.nworkers : nworkers; if (!nworkers_to_add) return; int workers_to_add[nworkers_to_add]; STARPU_ASSERT_MSG((added_workers == NULL && n_added_workers == NULL) || (added_workers != NULL && n_added_workers != NULL), "Parameters added_workers and n_added_workers must be both NULL or non-NULL"); struct starpu_perfmodel_device devices[nworkers_to_add]; int ndevices = 0; struct _starpu_worker *str_worker = NULL; int worker; int i = 0; for(i = 0; i < nworkers_to_add; i++) { /* added_workers is NULL for the call of this func at the creation of the context*/ /* if the function is called at the creation of the context it's no need to do this verif */ if(added_workers) { worker = workers->add(workers, (workerids == NULL ? i : workerids[i])); if(worker >= 0) added_workers[(*n_added_workers)++] = worker; else { int curr_workerid = starpu_worker_get_id(); struct _starpu_worker *worker_str = _starpu_get_worker_struct(workerids[i]); if(curr_workerid != workerids[i]) STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker_str->sched_mutex); worker_str->removed_from_ctx[sched_ctx->id] = 0; if(curr_workerid != workerids[i]) STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker_str->sched_mutex); } } else { worker = (workerids == NULL ? i : workerids[i]); workers->add(workers, worker); workers_to_add[i] = worker; str_worker = _starpu_get_worker_struct(worker); str_worker->tmp_sched_ctx = (int)sched_ctx->id; } } int *wa; int na; if(added_workers) { na = *n_added_workers; wa = added_workers; } else { na = nworkers_to_add; wa = workers_to_add; } for(i = 0; i < na; i++) { worker = wa[i]; str_worker = _starpu_get_worker_struct(worker); int dev1, dev2; unsigned found = 0; for(dev1 = 0; dev1 < str_worker->perf_arch.ndevices; dev1++) { for(dev2 = 0; dev2 < ndevices; dev2++) { if(devices[dev2].type == str_worker->perf_arch.devices[dev1].type && devices[dev2].devid == str_worker->perf_arch.devices[dev1].devid) { devices[dev2].ncores += str_worker->perf_arch.devices[dev1].ncores; found = 1; break; } } if(!found) { devices[ndevices].type = str_worker->perf_arch.devices[dev1].type; devices[ndevices].devid = str_worker->perf_arch.devices[dev1].devid; devices[ndevices].ncores = str_worker->perf_arch.devices[dev1].ncores; ndevices++; } else found = 0; } } if(ndevices > 0) { if(sched_ctx->perf_arch.devices == NULL) _STARPU_MALLOC(sched_ctx->perf_arch.devices, ndevices*sizeof(struct starpu_perfmodel_device)); else { int nfinal_devices = 0; int dev1, dev2; unsigned found = 0; for(dev1 = 0; dev1 < ndevices; dev1++) { for(dev2 = 0; dev2 < sched_ctx->perf_arch.ndevices; dev2++) { if(sched_ctx->perf_arch.devices[dev2].type == devices[dev1].type && sched_ctx->perf_arch.devices[dev2].devid == devices[dev1].devid) found = 1; } if(!found) { nfinal_devices++; } else found = 0; } int nsize = (sched_ctx->perf_arch.ndevices+nfinal_devices); _STARPU_REALLOC(sched_ctx->perf_arch.devices, nsize*sizeof(struct starpu_perfmodel_device)); } int dev1, dev2; unsigned found = 0; for(dev1 = 0; dev1 < ndevices; dev1++) { for(dev2 = 0; dev2 < sched_ctx->perf_arch.ndevices; dev2++) { if(sched_ctx->perf_arch.devices[dev2].type == devices[dev1].type && sched_ctx->perf_arch.devices[dev2].devid == devices[dev1].devid) { if(sched_ctx->perf_arch.devices[dev2].type == STARPU_CPU_WORKER) sched_ctx->perf_arch.devices[dev2].ncores += devices[dev1].ncores; found = 1; } } if(!found) { sched_ctx->perf_arch.devices[sched_ctx->perf_arch.ndevices].type = devices[dev1].type; sched_ctx->perf_arch.devices[sched_ctx->perf_arch.ndevices].devid = devices[dev1].devid; sched_ctx->perf_arch.devices[sched_ctx->perf_arch.ndevices].ncores = devices[dev1].ncores; sched_ctx->perf_arch.ndevices++; } else found = 0; } } if(!sched_ctx->sched_policy) { if(!sched_ctx->awake_workers) { if(sched_ctx->main_master == -1) sched_ctx->main_master = starpu_sched_ctx_book_workers_for_task(sched_ctx->id, wa, na); else { _starpu_sched_ctx_add_workers_to_master(sched_ctx->id, wa, na, sched_ctx->main_master); } } else { sched_ctx->main_master = _starpu_sched_ctx_find_master(sched_ctx->id, wa, na); _starpu_sched_ctx_set_master(sched_ctx, wa, na, sched_ctx->main_master); } } else if(sched_ctx->sched_policy->add_workers) { _STARPU_TRACE_WORKER_SCHEDULING_PUSH; if(added_workers) { if(*n_added_workers > 0) sched_ctx->sched_policy->add_workers(sched_ctx->id, added_workers, *n_added_workers); } else { sched_ctx->sched_policy->add_workers(sched_ctx->id, workers_to_add, nworkers_to_add); } _STARPU_TRACE_WORKER_SCHEDULING_POP; } return; } static void _starpu_remove_workers_from_sched_ctx(struct _starpu_sched_ctx *sched_ctx, int *workerids, int nworkers, int *removed_workers, int *n_removed_workers) { struct starpu_worker_collection *workers = sched_ctx->workers; struct starpu_perfmodel_device devices[workers->nworkers]; int ndevices = 0; int i = 0; for(i = 0; i < nworkers; i++) { if(workers->nworkers > 0) { if(_starpu_worker_belongs_to_a_sched_ctx(workerids[i], sched_ctx->id)) { int worker = workers->remove(workers, workerids[i]); if(worker >= 0) removed_workers[(*n_removed_workers)++] = worker; } } } int worker; unsigned found = 0; int dev; struct starpu_sched_ctx_iterator it; if(workers->init_iterator) workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); struct _starpu_worker *str_worker = _starpu_get_worker_struct(worker); for(dev = 0; dev < str_worker->perf_arch.ndevices; dev++) { int dev2; for(dev2 = 0; dev2 < ndevices; dev2++) { if(devices[dev2].type == str_worker->perf_arch.devices[dev].type && devices[dev2].devid == str_worker->perf_arch.devices[dev].devid) { if(devices[dev2].type == STARPU_CPU_WORKER) devices[dev2].ncores += str_worker->perf_arch.devices[dev].ncores; } found = 1; } if(!found) { devices[ndevices].type = str_worker->perf_arch.devices[dev].type; devices[ndevices].devid = str_worker->perf_arch.devices[dev].devid; devices[ndevices].ncores = str_worker->perf_arch.devices[dev].ncores; ndevices++; } else found = 0; } found = 0; } sched_ctx->perf_arch.ndevices = ndevices; for(dev = 0; dev < ndevices; dev++) { sched_ctx->perf_arch.devices[dev].type = devices[dev].type; sched_ctx->perf_arch.devices[dev].devid = devices[dev].devid; sched_ctx->perf_arch.devices[dev].ncores = devices[dev].ncores; } if(!sched_ctx->sched_policy) { if(!sched_ctx->awake_workers) { _starpu_sched_ctx_wake_these_workers_up(sched_ctx->id, removed_workers, *n_removed_workers); } } return; } static void _starpu_sched_ctx_free_scheduling_data(struct _starpu_sched_ctx *sched_ctx) { if(sched_ctx->sched_policy && sched_ctx->sched_policy->remove_workers) { int *workerids = NULL; unsigned nworkers_ctx = starpu_sched_ctx_get_workers_list(sched_ctx->id, &workerids); if(nworkers_ctx > 0) { _STARPU_TRACE_WORKER_SCHEDULING_PUSH; sched_ctx->sched_policy->remove_workers(sched_ctx->id, workerids, nworkers_ctx); _STARPU_TRACE_WORKER_SCHEDULING_POP; } free(workerids); } return; } #ifdef STARPU_HAVE_HWLOC static void _starpu_sched_ctx_create_hwloc_tree(struct _starpu_sched_ctx *sched_ctx) { sched_ctx->hwloc_workers_set = hwloc_bitmap_alloc(); struct starpu_worker_collection *workers = sched_ctx->workers; struct _starpu_worker *worker; struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { unsigned workerid = workers->get_next(workers, &it); if(!starpu_worker_is_combined_worker(workerid)) { worker = _starpu_get_worker_struct(workerid); hwloc_bitmap_or(sched_ctx->hwloc_workers_set, sched_ctx->hwloc_workers_set, worker->hwloc_cpu_set); } } return; } #endif struct _starpu_sched_ctx* _starpu_create_sched_ctx(struct starpu_sched_policy *policy, int *workerids, int nworkers_ctx, unsigned is_initial_sched, const char *sched_ctx_name, int min_prio_set, int min_prio, int max_prio_set, int max_prio, unsigned awake_workers) { struct _starpu_machine_config *config = _starpu_get_machine_config(); STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx_manag); STARPU_ASSERT(config->topology.nsched_ctxs < STARPU_NMAX_SCHED_CTXS); unsigned id = _starpu_get_first_free_sched_ctx(config); struct _starpu_sched_ctx *sched_ctx = &config->sched_ctxs[id]; sched_ctx->id = id; config->topology.nsched_ctxs++; STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx_manag); int nworkers = config->topology.nworkers; int i; STARPU_ASSERT(nworkers_ctx <= nworkers); STARPU_PTHREAD_MUTEX_INIT(&sched_ctx->empty_ctx_mutex, NULL); starpu_task_list_init(&sched_ctx->empty_ctx_tasks); STARPU_PTHREAD_MUTEX_INIT(&sched_ctx->waiting_tasks_mutex, NULL); starpu_task_list_init(&sched_ctx->waiting_tasks); if (policy) _STARPU_MALLOC(sched_ctx->sched_policy, sizeof(struct starpu_sched_policy)); else sched_ctx->sched_policy = NULL; sched_ctx->is_initial_sched = is_initial_sched; sched_ctx->name = sched_ctx_name; sched_ctx->inheritor = STARPU_NMAX_SCHED_CTXS; sched_ctx->finished_submit = 0; sched_ctx->min_priority_is_set = min_prio_set; if (sched_ctx->min_priority_is_set) sched_ctx->min_priority = min_prio; sched_ctx->max_priority_is_set = max_prio_set; if (sched_ctx->max_priority_is_set) sched_ctx->max_priority = max_prio; _starpu_barrier_counter_init(&sched_ctx->tasks_barrier, 0); _starpu_barrier_counter_init(&sched_ctx->ready_tasks_barrier, 0); sched_ctx->ready_flops = 0.0; for (i = 0; i < (int) (sizeof(sched_ctx->iterations)/sizeof(sched_ctx->iterations[0])); i++) sched_ctx->iterations[i] = -1; sched_ctx->iteration_level = 0; sched_ctx->main_master = -1; sched_ctx->perf_arch.devices = NULL; sched_ctx->perf_arch.ndevices = 0; int w; for(w = 0; w < nworkers; w++) { sem_init(&sched_ctx->fall_asleep_sem[w], 0, 0); sem_init(&sched_ctx->wake_up_sem[w], 0, 0); STARPU_PTHREAD_COND_INIT(&sched_ctx->parallel_sect_cond[w], NULL); STARPU_PTHREAD_MUTEX_INIT(&sched_ctx->parallel_sect_mutex[w], NULL); STARPU_PTHREAD_COND_INIT(&sched_ctx->parallel_sect_cond_busy[w], NULL); sched_ctx->busy[w] = 0; sched_ctx->master[w] = -1; sched_ctx->parallel_sect[w] = 0; sched_ctx->sleeping[w] = 0; } /*init the strategy structs and the worker_collection of the ressources of the context */ if(policy) { _starpu_init_sched_policy(config, sched_ctx, policy); sched_ctx->awake_workers = 1; } else { sched_ctx->awake_workers = awake_workers; starpu_sched_ctx_create_worker_collection(sched_ctx->id, STARPU_WORKER_LIST); } if(is_initial_sched) { /*initialize the mutexes for all contexts */ for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++) { STARPU_PTHREAD_RWLOCK_INIT(&changing_ctx_mutex[i], NULL); } } /* after having an worker_collection on the ressources add them */ _starpu_add_workers_to_sched_ctx(sched_ctx, workerids, nworkers_ctx, NULL, NULL); #ifdef STARPU_HAVE_HWLOC /* build hwloc tree of the context */ _starpu_sched_ctx_create_hwloc_tree(sched_ctx); #endif //STARPU_HAVE_HWLOC /* if we create the initial big sched ctx we can update workers' status here because they haven't been launched yet */ if(is_initial_sched) { for(i = 0; i < nworkers; i++) { struct _starpu_worker *worker = _starpu_get_worker_struct(i); _STARPU_MALLOC(worker->sched_ctx_list, sizeof(struct _starpu_sched_ctx_list)); _starpu_sched_ctx_list_init(worker->sched_ctx_list); _starpu_sched_ctx_list_add(&worker->sched_ctx_list, sched_ctx->id); worker->nsched_ctxs++; } } return sched_ctx; } static void _get_workers(int min, int max, int *workers, int *nw, enum starpu_worker_archtype arch, unsigned allow_overlap) { int pus[max]; int npus = 0; int i; int n = 0; struct _starpu_machine_config *config = _starpu_get_machine_config(); if(config->topology.nsched_ctxs == 1) { /*we have all available resources */ npus = starpu_worker_get_nids_by_type(arch, pus, max); /*TODO: hierarchical ctxs: get max good workers: close one to another */ for(i = 0; i < npus; i++) workers[(*nw)++] = pus[i]; } else { unsigned enough_ressources = 0; npus = starpu_worker_get_nids_ctx_free_by_type(arch, pus, max); for(i = 0; i < npus; i++) workers[(*nw)++] = pus[i]; if(npus == max) /*we have enough available resources */ enough_ressources = 1; if(!enough_ressources && npus >= min) /*we have enough available resources */ enough_ressources = 1; if(!enough_ressources) { /* try to get ressources from ctx who have more than the min of workers they need */ int s; for(s = 1; s < STARPU_NMAX_SCHED_CTXS; s++) { if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS) { int _npus = 0; int _pus[STARPU_NMAXWORKERS]; _npus = _starpu_get_workers_of_sched_ctx(config->sched_ctxs[s].id, _pus, arch); int ctx_min = arch == STARPU_CPU_WORKER ? config->sched_ctxs[s].min_ncpus : config->sched_ctxs[s].min_ngpus; if(_npus > ctx_min) { if(npus < min) { n = (_npus - ctx_min) > (min - npus) ? min - npus : (_npus - ctx_min); npus += n; } /*TODO: hierarchical ctxs: get n good workers: close to the other ones I already assigned to the ctx */ for(i = 0; i < n; i++) workers[(*nw)++] = _pus[i]; starpu_sched_ctx_remove_workers(_pus, n, config->sched_ctxs[s].id); } } } if(npus >= min) enough_ressources = 1; } if(!enough_ressources) { /* if there is no available workers to satisfy the minimum required give them workers proportional to their requirements*/ int global_npus = starpu_worker_get_count_by_type(arch); int req_npus = 0; int s; for(s = 1; s < STARPU_NMAX_SCHED_CTXS; s++) if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS) req_npus += arch == STARPU_CPU_WORKER ? config->sched_ctxs[s].min_ncpus : config->sched_ctxs[s].min_ngpus; req_npus += min; for(s = 1; s < STARPU_NMAX_SCHED_CTXS; s++) { if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS) { int ctx_min = arch == STARPU_CPU_WORKER ? config->sched_ctxs[s].min_ncpus : config->sched_ctxs[s].min_ngpus; double needed_npus = ((double)ctx_min * (double)global_npus) / (double)req_npus; int _npus = 0; int _pus[STARPU_NMAXWORKERS]; _npus = _starpu_get_workers_of_sched_ctx(config->sched_ctxs[s].id, _pus, arch); if(needed_npus < (double)_npus) { double npus_to_rem = (double)_npus - needed_npus; int x = floor(npus_to_rem); double x_double = (double)x; double diff = npus_to_rem - x_double; int npus_to_remove = diff >= 0.5 ? x+1 : x; int pus_to_remove[npus_to_remove]; int c = 0; /*TODO: hierarchical ctxs: get npus_to_remove good workers: close to the other ones I already assigned to the ctx */ for(i = _npus-1; i >= (_npus - npus_to_remove); i--) { workers[(*nw)++] = _pus[i]; pus_to_remove[c++] = _pus[i]; } if(!allow_overlap) starpu_sched_ctx_remove_workers(pus_to_remove, npus_to_remove, config->sched_ctxs[s].id); } } } } } } unsigned starpu_sched_ctx_create_inside_interval(const char *policy_name, const char *sched_ctx_name, int min_ncpus, int max_ncpus, int min_ngpus, int max_ngpus, unsigned allow_overlap) { struct _starpu_machine_config *config = _starpu_get_machine_config(); struct starpu_sched_policy *selected_policy = _starpu_select_sched_policy(config, policy_name); struct _starpu_sched_ctx *sched_ctx = NULL; int workers[max_ncpus + max_ngpus]; int nw = 0; STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx_manag); _get_workers(min_ncpus, max_ncpus, workers, &nw, STARPU_CPU_WORKER, allow_overlap); _get_workers(min_ngpus, max_ngpus, workers, &nw, STARPU_CUDA_WORKER, allow_overlap); STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx_manag); int i; printf("%d: ", nw); for(i = 0; i < nw; i++) printf("%d ", workers[i]); printf("\n"); sched_ctx = _starpu_create_sched_ctx(selected_policy, workers, nw, 0, sched_ctx_name, 0, 0, 0, 0, 1); sched_ctx->min_ncpus = min_ncpus; sched_ctx->max_ncpus = max_ncpus; sched_ctx->min_ngpus = min_ngpus; sched_ctx->max_ngpus = max_ngpus; _starpu_unlock_mutex_if_prev_locked(); int *added_workerids; unsigned nw_ctx = starpu_sched_ctx_get_workers_list(sched_ctx->id, &added_workerids); _starpu_update_workers_without_ctx(added_workerids, nw_ctx, sched_ctx->id, 0); free(added_workerids); _starpu_relock_mutex_if_prev_locked(); #ifdef STARPU_USE_SC_HYPERVISOR sched_ctx->perf_counters = NULL; #endif return sched_ctx->id; } unsigned starpu_sched_ctx_create(int *workerids, int nworkers, const char *sched_ctx_name, ...) { va_list varg_list; int arg_type; int min_prio_set = 0; int max_prio_set = 0; int min_prio = 0; int max_prio = 0; struct starpu_sched_policy *sched_policy = NULL; unsigned hierarchy_level = 0; unsigned nesting_sched_ctx = STARPU_NMAX_SCHED_CTXS; unsigned awake_workers = 0; va_start(varg_list, sched_ctx_name); while ((arg_type = va_arg(varg_list, int)) != 0) { if (arg_type == STARPU_SCHED_CTX_POLICY_NAME) { char *policy_name = va_arg(varg_list, char *); struct _starpu_machine_config *config = _starpu_get_machine_config(); sched_policy = _starpu_select_sched_policy(config, policy_name); } else if (arg_type == STARPU_SCHED_CTX_POLICY_STRUCT) { sched_policy = va_arg(varg_list, struct starpu_sched_policy *); } else if (arg_type == STARPU_SCHED_CTX_POLICY_MIN_PRIO) { min_prio = va_arg(varg_list, int); min_prio_set = 1; } else if (arg_type == STARPU_SCHED_CTX_POLICY_MAX_PRIO) { max_prio = va_arg(varg_list, int); max_prio_set = 1; } else if (arg_type == STARPU_SCHED_CTX_HIERARCHY_LEVEL) { hierarchy_level = va_arg(varg_list, unsigned); } else if (arg_type == STARPU_SCHED_CTX_NESTED) { nesting_sched_ctx = va_arg(varg_list, unsigned); } else if (arg_type == STARPU_SCHED_CTX_AWAKE_WORKERS) { awake_workers = 1; } else { STARPU_ABORT_MSG("Unrecognized argument %d\n", arg_type); } } va_end(varg_list); struct _starpu_sched_ctx *sched_ctx = NULL; sched_ctx = _starpu_create_sched_ctx(sched_policy, workerids, nworkers, 0, sched_ctx_name, min_prio_set, min_prio, max_prio_set, max_prio, awake_workers); sched_ctx->hierarchy_level = hierarchy_level; sched_ctx->nesting_sched_ctx = nesting_sched_ctx; _starpu_unlock_mutex_if_prev_locked(); int *added_workerids; unsigned nw_ctx = starpu_sched_ctx_get_workers_list(sched_ctx->id, &added_workerids); _starpu_update_workers_with_ctx(added_workerids, nw_ctx, sched_ctx->id); free(added_workerids); _starpu_relock_mutex_if_prev_locked(); #ifdef STARPU_USE_SC_HYPERVISOR sched_ctx->perf_counters = NULL; #endif return sched_ctx->id; } int fstarpu_sched_ctx_create(int *workerids, int nworkers, const char *sched_ctx_name, void **arglist) { int arg_i = 0; int min_prio_set = 0; int max_prio_set = 0; int min_prio = 0; int max_prio = 0; struct starpu_sched_policy *sched_policy = NULL; unsigned hierarchy_level = 0; unsigned nesting_sched_ctx = STARPU_NMAX_SCHED_CTXS; unsigned awake_workers = 0; while (arglist[arg_i] != NULL) { const int arg_type = (int)(intptr_t)arglist[arg_i]; if (arg_type == STARPU_SCHED_CTX_POLICY_NAME) { arg_i++; char *policy_name = arglist[arg_i]; struct _starpu_machine_config *config = _starpu_get_machine_config(); sched_policy = _starpu_select_sched_policy(config, policy_name); } else if (arg_type == STARPU_SCHED_CTX_POLICY_STRUCT) { arg_i++; sched_policy = arglist[arg_i]; } else if (arg_type == STARPU_SCHED_CTX_POLICY_MIN_PRIO) { arg_i++; min_prio = *(int *)arglist[arg_i]; min_prio_set = 1; } else if (arg_type == STARPU_SCHED_CTX_POLICY_MAX_PRIO) { arg_i++; max_prio = *(int *)arglist[arg_i]; max_prio_set = 1; } else if (arg_type == STARPU_SCHED_CTX_HIERARCHY_LEVEL) { arg_i++; int val = *(int *)arglist[arg_i]; STARPU_ASSERT(val >= 0); hierarchy_level = (unsigned)val; } else if (arg_type == STARPU_SCHED_CTX_NESTED) { arg_i++; int val = *(int *)arglist[arg_i]; STARPU_ASSERT(val >= 0); nesting_sched_ctx = (unsigned)val; } else if (arg_type == STARPU_SCHED_CTX_AWAKE_WORKERS) { awake_workers = 1; } else { STARPU_ABORT_MSG("Unrecognized argument %d\n", arg_type); } arg_i++; } if (workerids && nworkers != -1) { /* Make sure the user doesn't use invalid worker IDs. */ int num_workers = starpu_worker_get_count(); int i; for (i = 0; i < nworkers; i++) { if (workerids[i] < 0 || workerids[i] >= num_workers) { _STARPU_ERROR("Invalid worker ID (%d) specified!\n", workerids[i]); return STARPU_NMAX_SCHED_CTXS; } } } struct _starpu_sched_ctx *sched_ctx = NULL; sched_ctx = _starpu_create_sched_ctx(sched_policy, workerids, nworkers, 0, sched_ctx_name, min_prio_set, min_prio, max_prio_set, max_prio, awake_workers); sched_ctx->hierarchy_level = hierarchy_level; sched_ctx->nesting_sched_ctx = nesting_sched_ctx; _starpu_unlock_mutex_if_prev_locked(); int *added_workerids; unsigned nw_ctx = starpu_sched_ctx_get_workers_list(sched_ctx->id, &added_workerids); _starpu_update_workers_with_ctx(added_workerids, nw_ctx, sched_ctx->id); free(added_workerids); _starpu_relock_mutex_if_prev_locked(); #ifdef STARPU_USE_SC_HYPERVISOR sched_ctx->perf_counters = NULL; #endif return (int)sched_ctx->id; } void starpu_sched_ctx_register_close_callback(unsigned sched_ctx_id, void (*close_callback)(unsigned sched_ctx_id, void* args), void *args) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); sched_ctx->close_callback = close_callback; sched_ctx->close_args = args; return; } #ifdef STARPU_USE_SC_HYPERVISOR void starpu_sched_ctx_set_perf_counters(unsigned sched_ctx_id, void* perf_counters) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); sched_ctx->perf_counters = (struct starpu_sched_ctx_performance_counters *)perf_counters; return; } #endif /* free all structures for the context */ static void _starpu_delete_sched_ctx(struct _starpu_sched_ctx *sched_ctx) { STARPU_ASSERT(sched_ctx->id != STARPU_NMAX_SCHED_CTXS); struct _starpu_machine_config *config = _starpu_get_machine_config(); int nworkers = config->topology.nworkers; int w; for(w = 0; w < nworkers; w++) { STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx->parallel_sect_mutex[w]); while (sched_ctx->busy[w]) { STARPU_PTHREAD_COND_WAIT(&sched_ctx->parallel_sect_cond_busy[w], &sched_ctx->parallel_sect_mutex[w]); } STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx->parallel_sect_mutex[w]); } if(sched_ctx->sched_policy) { _starpu_deinit_sched_policy(sched_ctx); free(sched_ctx->sched_policy); sched_ctx->sched_policy = NULL; } else { starpu_sched_ctx_delete_worker_collection(sched_ctx->id); } if (sched_ctx->perf_arch.devices) { free(sched_ctx->perf_arch.devices); sched_ctx->perf_arch.devices = NULL; } STARPU_PTHREAD_MUTEX_DESTROY(&sched_ctx->empty_ctx_mutex); STARPU_PTHREAD_MUTEX_DESTROY(&sched_ctx->waiting_tasks_mutex); sched_ctx->id = STARPU_NMAX_SCHED_CTXS; #ifdef STARPU_HAVE_HWLOC hwloc_bitmap_free(sched_ctx->hwloc_workers_set); #endif //STARPU_HAVE_HWLOC STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx_manag); config->topology.nsched_ctxs--; STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx_manag); } void starpu_sched_ctx_delete(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); #ifdef STARPU_USE_SC_HYPERVISOR if (sched_ctx_id != 0 && sched_ctx_id != STARPU_NMAX_SCHED_CTXS && sched_ctx->perf_counters != NULL) { _STARPU_TRACE_HYPERVISOR_BEGIN(); sched_ctx->perf_counters->notify_delete_context(sched_ctx_id); _STARPU_TRACE_HYPERVISOR_END(); } #endif //STARPU_USE_SC_HYPERVISOR unsigned inheritor_sched_ctx_id = sched_ctx->inheritor; struct _starpu_sched_ctx *inheritor_sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx->inheritor); _starpu_unlock_mutex_if_prev_locked(); STARPU_PTHREAD_RWLOCK_WRLOCK(&changing_ctx_mutex[sched_ctx_id]); STARPU_ASSERT(sched_ctx->id != STARPU_NMAX_SCHED_CTXS); int *workerids; unsigned nworkers_ctx = starpu_sched_ctx_get_workers_list(sched_ctx->id, &workerids); /*if both of them have all the ressources is pointless*/ /*trying to transfer ressources from one ctx to the other*/ struct _starpu_machine_config *config = _starpu_get_machine_config(); unsigned nworkers = config->topology.nworkers; if(nworkers_ctx > 0 && inheritor_sched_ctx && inheritor_sched_ctx->id != STARPU_NMAX_SCHED_CTXS && !(nworkers_ctx == nworkers && nworkers_ctx == inheritor_sched_ctx->workers->nworkers)) { starpu_sched_ctx_add_workers(workerids, nworkers_ctx, inheritor_sched_ctx_id); starpu_sched_ctx_set_priority(workerids, nworkers_ctx, inheritor_sched_ctx_id, 1); starpu_sched_ctx_set_priority_on_level(workerids, nworkers_ctx, inheritor_sched_ctx_id, 1); } if(!_starpu_wait_for_all_tasks_of_sched_ctx(sched_ctx_id)) { if(!sched_ctx->sched_policy) starpu_sched_ctx_unbook_workers_for_task(sched_ctx->id, sched_ctx->main_master); /*if btw the mutex release & the mutex lock the context has changed take care to free all scheduling data before deleting the context */ _starpu_update_workers_without_ctx(workerids, nworkers_ctx, sched_ctx_id, 1); _starpu_sched_ctx_free_scheduling_data(sched_ctx); _starpu_delete_sched_ctx(sched_ctx); } STARPU_PTHREAD_RWLOCK_UNLOCK(&changing_ctx_mutex[sched_ctx_id]); /* workerids is malloc-ed in starpu_sched_ctx_get_workers_list, don't forget to free it when you don't use it anymore */ free(workerids); _starpu_relock_mutex_if_prev_locked(); return; } /* called after the workers are terminated so we don't have anything else to do but free the memory*/ void _starpu_delete_all_sched_ctxs() { unsigned i; for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(i); STARPU_PTHREAD_RWLOCK_WRLOCK(&changing_ctx_mutex[i]); if(sched_ctx->id != STARPU_NMAX_SCHED_CTXS) { _starpu_sched_ctx_free_scheduling_data(sched_ctx); _starpu_barrier_counter_destroy(&sched_ctx->tasks_barrier); _starpu_barrier_counter_destroy(&sched_ctx->ready_tasks_barrier); _starpu_delete_sched_ctx(sched_ctx); } STARPU_PTHREAD_RWLOCK_UNLOCK(&changing_ctx_mutex[i]); STARPU_PTHREAD_RWLOCK_DESTROY(&changing_ctx_mutex[i]); } STARPU_PTHREAD_KEY_DELETE(sched_ctx_key); return; } static void _starpu_check_workers(int *workerids, int nworkers) { struct _starpu_machine_config *config = _starpu_get_machine_config(); int nworkers_conf = config->topology.nworkers; int i; for(i = 0; i < nworkers; i++) { /* take care the user does not ask for a resource that does not exist */ STARPU_ASSERT_MSG(workerids[i] >= 0 && workerids[i] <= nworkers_conf, "requested to add workerid = %d, but that is beyond the range 0 to %d", workerids[i], nworkers_conf); } } void _starpu_fetch_tasks_from_empty_ctx_list(struct _starpu_sched_ctx *sched_ctx) { unsigned unlocked = 0; STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx->empty_ctx_mutex); if(starpu_task_list_empty(&sched_ctx->empty_ctx_tasks)) { STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx->empty_ctx_mutex); return; } else /* you're not suppose to get here if you deleted the context so no point in having the mutex locked */ STARPU_PTHREAD_RWLOCK_UNLOCK(&changing_ctx_mutex[sched_ctx->id]); while(!starpu_task_list_empty(&sched_ctx->empty_ctx_tasks)) { if(unlocked) STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx->empty_ctx_mutex); struct starpu_task *old_task = starpu_task_list_pop_back(&sched_ctx->empty_ctx_tasks); unlocked = 1; STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx->empty_ctx_mutex); if(old_task == &stop_submission_task) break; int ret = _starpu_push_task_to_workers(old_task); /* if we should stop poping from empty ctx tasks */ if (ret == -EAGAIN) break; } if(!unlocked) STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx->empty_ctx_mutex); /* leave the mutex as it was to avoid pbs in the caller function */ STARPU_PTHREAD_RWLOCK_RDLOCK(&changing_ctx_mutex[sched_ctx->id]); return; } unsigned _starpu_can_push_task(struct _starpu_sched_ctx *sched_ctx, struct starpu_task *task) { if(sched_ctx->sched_policy && sched_ctx->sched_policy->simulate_push_task) { if (window_size == 0.0) return 1; STARPU_PTHREAD_RWLOCK_RDLOCK(&changing_ctx_mutex[sched_ctx->id]); double expected_end = sched_ctx->sched_policy->simulate_push_task(task); STARPU_PTHREAD_RWLOCK_UNLOCK(&changing_ctx_mutex[sched_ctx->id]); double expected_len = 0.0; if(hyp_actual_start_sample[sched_ctx->id] != 0.0) { expected_len = expected_end - hyp_actual_start_sample[sched_ctx->id] ; } else { _STARPU_MSG("%u: sc start is 0.0\n", sched_ctx->id); expected_len = expected_end - starpu_timing_now(); } if(expected_len < 0.0) printf("exp len negative %lf \n", expected_len); expected_len /= 1000000.0; // printf("exp_end %lf start %lf expected_len %lf \n", expected_end, hyp_actual_start_sample[sched_ctx->id], expected_len); if(expected_len > (window_size + 0.2*window_size)) return 0; } return 1; } void _starpu_fetch_task_from_waiting_list(struct _starpu_sched_ctx *sched_ctx) { if(starpu_task_list_empty(&sched_ctx->waiting_tasks)) return; struct starpu_task *old_task = starpu_task_list_back(&sched_ctx->waiting_tasks); if(_starpu_can_push_task(sched_ctx, old_task)) { old_task = starpu_task_list_pop_back(&sched_ctx->waiting_tasks); _starpu_push_task_to_workers(old_task); } return; } void _starpu_push_task_to_waiting_list(struct _starpu_sched_ctx *sched_ctx, struct starpu_task *task) { starpu_task_list_push_front(&sched_ctx->waiting_tasks, task); return; } void starpu_sched_ctx_set_priority_on_level(int* workers_to_add, unsigned nworkers_to_add, unsigned sched_ctx, unsigned priority) { (void) workers_to_add; (void) nworkers_to_add; (void) sched_ctx; (void) priority; /* int w; */ /* struct _starpu_worker *worker = NULL; */ /* for(w = 0; w < nworkers_to_add; w++) */ /* { */ /* worker = _starpu_get_worker_struct(workers_to_add[w]); */ /* STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); */ /* struct _starpu_sched_ctx_list *l = NULL; */ /* for (l = worker->sched_ctx_list; l; l = l->next) */ /* { */ /* if(l->sched_ctx != STARPU_NMAX_SCHED_CTXS && l->sched_ctx != sched_ctx && */ /* starpu_sched_ctx_get_hierarchy_level(l->sched_ctx) == starpu_sched_ctx_get_hierarchy_level(sched_ctx)) */ /* { */ /* /\* the lock is taken inside the func *\/ */ /* STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); */ /* starpu_sched_ctx_set_priority(&workers_to_add[w], 1, l->sched_ctx, priority); */ /* STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); */ /* } */ /* } */ /* STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); */ /* } */ /* return; */ } static void _set_priority_hierarchically(int* workers_to_add, unsigned nworkers_to_add, unsigned sched_ctx, unsigned priority) { if(starpu_sched_ctx_get_hierarchy_level(sched_ctx) > 0) { unsigned father = starpu_sched_ctx_get_inheritor(sched_ctx); starpu_sched_ctx_set_priority(workers_to_add, nworkers_to_add, father, priority); starpu_sched_ctx_set_priority_on_level(workers_to_add, nworkers_to_add, father, priority); _set_priority_hierarchically(workers_to_add, nworkers_to_add, father, priority); } return; } void starpu_sched_ctx_add_workers(int *workers_to_add, int nworkers_to_add, unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); int added_workers[nworkers_to_add]; int n_added_workers = 0; STARPU_PTHREAD_RWLOCK_WRLOCK(&changing_ctx_mutex[sched_ctx_id]); STARPU_ASSERT(workers_to_add != NULL && nworkers_to_add > 0); _starpu_check_workers(workers_to_add, nworkers_to_add); /* if the context has not already been deleted */ if(sched_ctx->id != STARPU_NMAX_SCHED_CTXS) { _starpu_add_workers_to_sched_ctx(sched_ctx, workers_to_add, nworkers_to_add, added_workers, &n_added_workers); if(n_added_workers > 0) { _starpu_update_workers_with_ctx(added_workers, n_added_workers, sched_ctx->id); } starpu_sched_ctx_set_priority(workers_to_add, nworkers_to_add, sched_ctx_id, 1); _set_priority_hierarchically(workers_to_add, nworkers_to_add, sched_ctx_id, 0); } STARPU_PTHREAD_RWLOCK_UNLOCK(&changing_ctx_mutex[sched_ctx_id]); _starpu_relock_mutex_if_prev_locked(); if(sched_ctx->id != STARPU_NMAX_SCHED_CTXS) { STARPU_PTHREAD_RWLOCK_RDLOCK(&changing_ctx_mutex[sched_ctx_id]); _starpu_fetch_tasks_from_empty_ctx_list(sched_ctx); STARPU_PTHREAD_RWLOCK_UNLOCK(&changing_ctx_mutex[sched_ctx_id]); } return; } void starpu_sched_ctx_remove_workers(int *workers_to_remove, int nworkers_to_remove, unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); int removed_workers[sched_ctx->workers->nworkers]; int n_removed_workers = 0; _starpu_check_workers(workers_to_remove, nworkers_to_remove); _starpu_unlock_mutex_if_prev_locked(); STARPU_PTHREAD_RWLOCK_WRLOCK(&changing_ctx_mutex[sched_ctx_id]); /* if the context has not already been deleted */ if(sched_ctx->id != STARPU_NMAX_SCHED_CTXS) { _starpu_remove_workers_from_sched_ctx(sched_ctx, workers_to_remove, nworkers_to_remove, removed_workers, &n_removed_workers); if(n_removed_workers > 0) { _starpu_update_workers_without_ctx(removed_workers, n_removed_workers, sched_ctx_id, 0); starpu_sched_ctx_set_priority(removed_workers, n_removed_workers, sched_ctx_id, 1); } } STARPU_PTHREAD_RWLOCK_UNLOCK(&changing_ctx_mutex[sched_ctx_id]); _starpu_relock_mutex_if_prev_locked(); return; } int _starpu_nworkers_able_to_execute_task(struct starpu_task *task, struct _starpu_sched_ctx *sched_ctx) { unsigned worker = 0, nworkers = 0; STARPU_PTHREAD_RWLOCK_WRLOCK(&changing_ctx_mutex[sched_ctx->id]); struct starpu_worker_collection *workers = sched_ctx->workers; struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next_master(workers, &it)) { worker = workers->get_next_master(workers, &it); STARPU_ASSERT_MSG(worker < STARPU_NMAXWORKERS, "worker id %u", worker); if (starpu_worker_can_execute_task_first_impl(worker, task, NULL)) nworkers++; } STARPU_PTHREAD_RWLOCK_UNLOCK(&changing_ctx_mutex[sched_ctx->id]); return nworkers; } /* unused sched_ctx have the id STARPU_NMAX_SCHED_CTXS */ void _starpu_init_all_sched_ctxs(struct _starpu_machine_config *config) { STARPU_PTHREAD_KEY_CREATE(&sched_ctx_key, NULL); window_size = starpu_get_env_float_default("STARPU_WINDOW_TIME_SIZE", 0.0); nobind = starpu_get_env_number("STARPU_WORKERS_NOBIND"); unsigned i; for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++) config->sched_ctxs[i].id = STARPU_NMAX_SCHED_CTXS; return; } /* sched_ctx aren't necessarly one next to another */ /* for eg when we remove one its place is free */ /* when we add new one we reuse its place */ static unsigned _starpu_get_first_free_sched_ctx(struct _starpu_machine_config *config) { unsigned i; for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++) if(config->sched_ctxs[i].id == STARPU_NMAX_SCHED_CTXS) return i; STARPU_ASSERT(0); return STARPU_NMAX_SCHED_CTXS; } int _starpu_wait_for_all_tasks_of_sched_ctx(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "starpu_task_wait_for_all must not be called from a task or callback"); return _starpu_barrier_counter_wait_for_empty_counter(&sched_ctx->tasks_barrier); } int _starpu_wait_for_n_submitted_tasks_of_sched_ctx(unsigned sched_ctx_id, unsigned n) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "starpu_task_wait_for_n_submitted_tasks must not be called from a task or callback"); return _starpu_barrier_counter_wait_until_counter_reaches_down_to_n(&sched_ctx->tasks_barrier, n); } void _starpu_decrement_nsubmitted_tasks_of_sched_ctx(unsigned sched_ctx_id) { struct _starpu_machine_config *config = _starpu_get_machine_config(); #ifndef STARPU_SANITIZE_THREAD if (!config->watchdog_ok) config->watchdog_ok = 1; #endif struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); int reached = _starpu_barrier_counter_get_reached_start(&sched_ctx->tasks_barrier); int finished = reached == 1; /* when finished decrementing the tasks if the user signaled he will not submit tasks anymore we can move all its workers to the inheritor context */ if(finished && sched_ctx->inheritor != STARPU_NMAX_SCHED_CTXS) { STARPU_PTHREAD_MUTEX_LOCK(&finished_submit_mutex); if(sched_ctx->finished_submit) { STARPU_PTHREAD_MUTEX_UNLOCK(&finished_submit_mutex); if(sched_ctx->id != STARPU_NMAX_SCHED_CTXS) { if(sched_ctx->close_callback) sched_ctx->close_callback(sched_ctx->id, sched_ctx->close_args); int *workerids = NULL; unsigned nworkers = starpu_sched_ctx_get_workers_list(sched_ctx->id, &workerids); if(nworkers > 0) { starpu_sched_ctx_add_workers(workerids, nworkers, sched_ctx->inheritor); free(workerids); } } _starpu_barrier_counter_decrement_until_empty_counter(&sched_ctx->tasks_barrier, 0.0); return; } STARPU_PTHREAD_MUTEX_UNLOCK(&finished_submit_mutex); } /* We also need to check for config->submitting = 0 (i.e. the * user calle starpu_drivers_request_termination()), in which * case we need to set config->running to 0 and wake workers, * so they can terminate, just like * starpu_drivers_request_termination() does. */ STARPU_PTHREAD_MUTEX_LOCK(&config->submitted_mutex); if(config->submitting == 0) { if(sched_ctx->id != STARPU_NMAX_SCHED_CTXS) { if(sched_ctx->close_callback) sched_ctx->close_callback(sched_ctx->id, sched_ctx->close_args); } ANNOTATE_HAPPENS_AFTER(&config->running); config->running = 0; ANNOTATE_HAPPENS_BEFORE(&config->running); int s; for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++) { if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS) { _starpu_check_nsubmitted_tasks_of_sched_ctx(config->sched_ctxs[s].id); } } } STARPU_PTHREAD_MUTEX_UNLOCK(&config->submitted_mutex); _starpu_barrier_counter_decrement_until_empty_counter(&sched_ctx->tasks_barrier, 0.0); return; } void _starpu_increment_nsubmitted_tasks_of_sched_ctx(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); _starpu_barrier_counter_increment(&sched_ctx->tasks_barrier, 0.0); } int _starpu_get_nsubmitted_tasks_of_sched_ctx(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); return _starpu_barrier_counter_get_reached_start(&sched_ctx->tasks_barrier); } int _starpu_check_nsubmitted_tasks_of_sched_ctx(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); return _starpu_barrier_counter_check(&sched_ctx->tasks_barrier); } unsigned _starpu_increment_nready_tasks_of_sched_ctx(unsigned sched_ctx_id, double ready_flops, struct starpu_task *task) { unsigned ret = 1; struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); if(!sched_ctx->is_initial_sched) STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx->waiting_tasks_mutex); _starpu_barrier_counter_increment(&sched_ctx->ready_tasks_barrier, ready_flops); if(!sched_ctx->is_initial_sched) { if(!_starpu_can_push_task(sched_ctx, task)) { _starpu_push_task_to_waiting_list(sched_ctx, task); ret = 0; } STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx->waiting_tasks_mutex); } return ret; } void _starpu_decrement_nready_tasks_of_sched_ctx(unsigned sched_ctx_id, double ready_flops) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); if(!sched_ctx->is_initial_sched) STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx->waiting_tasks_mutex); _starpu_barrier_counter_decrement_until_empty_counter(&sched_ctx->ready_tasks_barrier, ready_flops); if(!sched_ctx->is_initial_sched) { _starpu_fetch_task_from_waiting_list(sched_ctx); STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx->waiting_tasks_mutex); } } int starpu_sched_ctx_get_nready_tasks(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); return _starpu_barrier_counter_get_reached_start(&sched_ctx->ready_tasks_barrier); } double starpu_sched_ctx_get_nready_flops(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); return _starpu_barrier_counter_get_reached_flops(&sched_ctx->ready_tasks_barrier); } int _starpu_wait_for_no_ready_of_sched_ctx(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); return _starpu_barrier_counter_wait_for_empty_counter(&sched_ctx->ready_tasks_barrier); } void starpu_sched_ctx_set_context(unsigned *sched_ctx) { starpu_pthread_setspecific(sched_ctx_key, (void*)sched_ctx); } unsigned starpu_sched_ctx_get_context() { unsigned *sched_ctx = (unsigned*)starpu_pthread_getspecific(sched_ctx_key); if(sched_ctx == NULL) return STARPU_NMAX_SCHED_CTXS; STARPU_ASSERT(*sched_ctx < STARPU_NMAX_SCHED_CTXS); return *sched_ctx; } unsigned _starpu_sched_ctx_get_current_context() { unsigned sched_ctx = starpu_sched_ctx_get_context(); if (sched_ctx == STARPU_NMAX_SCHED_CTXS) return _starpu_get_initial_sched_ctx()->id; else return sched_ctx; } void starpu_sched_ctx_notify_hypervisor_exists() { with_hypervisor = 1; int i, j; for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++) { hyp_start_sample[i] = starpu_timing_now(); hyp_start_allow_sample[i] = 0.0; for(j = 0; j < STARPU_NMAXWORKERS; j++) { flops[i][j] = 0.0; data_size[i][j] = 0; } hyp_actual_start_sample[i] = 0.0; } } unsigned starpu_sched_ctx_check_if_hypervisor_exists() { return with_hypervisor; } void starpu_sched_ctx_update_start_resizing_sample(unsigned sched_ctx_id, double start_sample) { hyp_actual_start_sample[sched_ctx_id] = start_sample; } unsigned _starpu_sched_ctx_allow_hypervisor(unsigned sched_ctx_id) { (void) sched_ctx_id; return 1; #if 0 double now = starpu_timing_now(); if(hyp_start_allow_sample[sched_ctx_id] > 0.0) { double allow_sample = (now - hyp_start_allow_sample[sched_ctx_id]) / 1000000.0; if(allow_sample < 0.001) return 1; else { hyp_start_allow_sample[sched_ctx_id] = 0.0; hyp_start_sample[sched_ctx_id] = starpu_timing_now(); return 0; } } double forbid_sample = (now - hyp_start_sample[sched_ctx_id]) / 1000000.0; if(forbid_sample > 0.01) { // hyp_start_sample[sched_ctx_id] = starpu_timing_now(); hyp_start_allow_sample[sched_ctx_id] = starpu_timing_now(); return 1; } return 0; #endif } void starpu_sched_ctx_set_policy_data(unsigned sched_ctx_id, void* policy_data) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); sched_ctx->policy_data = policy_data; } void* starpu_sched_ctx_get_policy_data(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); return sched_ctx->policy_data; } struct starpu_worker_collection* starpu_sched_ctx_create_worker_collection(unsigned sched_ctx_id, enum starpu_worker_collection_type worker_collection_type) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); _STARPU_MALLOC(sched_ctx->workers, sizeof(struct starpu_worker_collection)); switch(worker_collection_type) { #ifdef STARPU_HAVE_HWLOC case STARPU_WORKER_TREE: sched_ctx->workers->has_next = worker_tree.has_next; sched_ctx->workers->get_next = worker_tree.get_next; sched_ctx->workers->has_next_master = worker_tree.has_next_master; sched_ctx->workers->get_next_master = worker_tree.get_next_master; sched_ctx->workers->add = worker_tree.add; sched_ctx->workers->remove = worker_tree.remove; sched_ctx->workers->init = worker_tree.init; sched_ctx->workers->deinit = worker_tree.deinit; sched_ctx->workers->init_iterator = worker_tree.init_iterator; sched_ctx->workers->type = STARPU_WORKER_LIST; break; #endif // case STARPU_WORKER_LIST: default: sched_ctx->workers->has_next = worker_list.has_next; sched_ctx->workers->get_next = worker_list.get_next; sched_ctx->workers->has_next_master = worker_list.has_next_master; sched_ctx->workers->get_next_master = worker_list.get_next_master; sched_ctx->workers->add = worker_list.add; sched_ctx->workers->remove = worker_list.remove; sched_ctx->workers->init = worker_list.init; sched_ctx->workers->deinit = worker_list.deinit; sched_ctx->workers->init_iterator = worker_list.init_iterator; sched_ctx->workers->type = STARPU_WORKER_LIST; break; } /* construct the collection of workers(list/tree/etc.) */ sched_ctx->workers->init(sched_ctx->workers); return sched_ctx->workers; } void starpu_sched_ctx_display_workers(unsigned sched_ctx_id, FILE *f) { int *workerids = NULL; unsigned nworkers; unsigned i; nworkers = starpu_sched_ctx_get_workers_list(sched_ctx_id, &workerids); fprintf(f, "[sched_ctx %u]: %u worker%s\n", sched_ctx_id, nworkers, nworkers>1?"s":""); for (i = 0; i < nworkers; i++) { char name[256]; starpu_worker_get_name(workerids[i], name, 256); fprintf(f, "\t\t%s\n", name); } free(workerids); } unsigned starpu_sched_ctx_get_workers_list_raw(unsigned sched_ctx_id, int **workerids) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); *workerids = sched_ctx->workers->workerids; return sched_ctx->workers->nworkers; } unsigned starpu_sched_ctx_get_workers_list(unsigned sched_ctx_id, int **workerids) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); struct starpu_worker_collection *workers = sched_ctx->workers; int worker; unsigned nworkers = 0; struct starpu_sched_ctx_iterator it; if(!workers) return 0; _STARPU_MALLOC(*workerids, workers->nworkers*sizeof(int)); workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); (*workerids)[nworkers++] = worker; } return nworkers; } void starpu_sched_ctx_delete_worker_collection(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); sched_ctx->workers->deinit(sched_ctx->workers); free(sched_ctx->workers); sched_ctx->workers = NULL; } struct starpu_worker_collection* starpu_sched_ctx_get_worker_collection(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); return sched_ctx->workers; } int _starpu_get_workers_of_sched_ctx(unsigned sched_ctx_id, int *pus, enum starpu_worker_archtype arch) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); struct starpu_worker_collection *workers = sched_ctx->workers; int worker; int npus = 0; struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); enum starpu_worker_archtype curr_arch = starpu_worker_get_type(worker); if(curr_arch == arch || arch == STARPU_ANY_WORKER) pus[npus++] = worker; } return npus; } starpu_pthread_rwlock_t* _starpu_sched_ctx_get_changing_ctx_mutex(unsigned sched_ctx_id) { return &changing_ctx_mutex[sched_ctx_id]; } unsigned starpu_sched_ctx_get_nworkers(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); if(sched_ctx != NULL) return sched_ctx->workers->nworkers; else return 0; } unsigned starpu_sched_ctx_get_nshared_workers(unsigned sched_ctx_id, unsigned sched_ctx_id2) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); struct _starpu_sched_ctx *sched_ctx2 = _starpu_get_sched_ctx_struct(sched_ctx_id2); struct starpu_worker_collection *workers = sched_ctx->workers; struct starpu_worker_collection *workers2 = sched_ctx2->workers; int worker, worker2; int shared_workers = 0; struct starpu_sched_ctx_iterator it1, it2; workers->init_iterator(workers, &it1); workers2->init_iterator(workers2, &it2); while(workers->has_next(workers, &it1)) { worker = workers->get_next(workers, &it1); while(workers2->has_next(workers2, &it2)) { worker2 = workers2->get_next(workers2, &it2); if(worker == worker2) shared_workers++; } } return shared_workers; } unsigned starpu_sched_ctx_contains_worker(int workerid, unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); struct starpu_worker_collection *workers = sched_ctx->workers; if(workers) { unsigned i; for (i = 0; i < workers->nworkers; i++) if (workerid == workers->workerids[i]) return 1; } return 0; } unsigned starpu_sched_ctx_contains_type_of_worker(enum starpu_worker_archtype arch, unsigned sched_ctx_id) { struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); int worker; unsigned i; for (i = 0; i < workers->nworkers; i++) { worker = workers->workerids[i]; enum starpu_worker_archtype curr_arch = starpu_worker_get_type(worker); if(curr_arch == arch) return 1; } return 0; } unsigned _starpu_worker_belongs_to_a_sched_ctx(int workerid, unsigned sched_ctx_id) { struct _starpu_machine_config *config = _starpu_get_machine_config(); int i; struct _starpu_sched_ctx *sched_ctx = NULL; for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++) { sched_ctx = &config->sched_ctxs[i]; if(sched_ctx && sched_ctx->id != STARPU_NMAX_SCHED_CTXS && sched_ctx->id != sched_ctx_id) if(starpu_sched_ctx_contains_worker(workerid, sched_ctx->id)) return 1; } return 0; } unsigned starpu_sched_ctx_worker_get_id(unsigned sched_ctx_id) { int workerid = starpu_worker_get_id(); if(workerid != -1) if(starpu_sched_ctx_contains_worker(workerid, sched_ctx_id)) return workerid; return -1; } unsigned starpu_sched_ctx_overlapping_ctxs_on_worker(int workerid) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); return worker->nsched_ctxs > 1; } void starpu_sched_ctx_set_inheritor(unsigned sched_ctx_id, unsigned inheritor) { STARPU_ASSERT(sched_ctx_id < STARPU_NMAX_SCHED_CTXS); STARPU_ASSERT(inheritor < STARPU_NMAX_SCHED_CTXS); struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); sched_ctx->inheritor = inheritor; return; } unsigned starpu_sched_ctx_get_inheritor(unsigned sched_ctx_id) { STARPU_ASSERT(sched_ctx_id < STARPU_NMAX_SCHED_CTXS); struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); return sched_ctx->inheritor; } unsigned starpu_sched_ctx_get_hierarchy_level(unsigned sched_ctx_id) { STARPU_ASSERT(sched_ctx_id < STARPU_NMAX_SCHED_CTXS); struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); return sched_ctx->hierarchy_level; } void starpu_sched_ctx_finished_submit(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); STARPU_PTHREAD_MUTEX_LOCK(&finished_submit_mutex); sched_ctx->finished_submit = 1; STARPU_PTHREAD_MUTEX_UNLOCK(&finished_submit_mutex); return; } #ifdef STARPU_USE_SC_HYPERVISOR void _starpu_sched_ctx_post_exec_task_cb(int workerid, struct starpu_task *task, size_t data_size2, uint32_t footprint) { if (workerid < 0) return; struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(task->sched_ctx); if(sched_ctx != NULL && task->sched_ctx != _starpu_get_initial_sched_ctx()->id && task->sched_ctx != STARPU_NMAX_SCHED_CTXS && sched_ctx->perf_counters != NULL) { flops[task->sched_ctx][workerid] += task->flops; data_size[task->sched_ctx][workerid] += data_size2; if(_starpu_sched_ctx_allow_hypervisor(sched_ctx->id) || task->hypervisor_tag > 0) { _STARPU_TRACE_HYPERVISOR_BEGIN(); sched_ctx->perf_counters->notify_post_exec_task(task, data_size[task->sched_ctx][workerid], footprint, task->hypervisor_tag, flops[task->sched_ctx][workerid]); _STARPU_TRACE_HYPERVISOR_END(); flops[task->sched_ctx][workerid] = 0.0; data_size[task->sched_ctx][workerid] = 0; } } } void starpu_sched_ctx_call_pushed_task_cb(int workerid, unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); if(sched_ctx != NULL && sched_ctx_id != _starpu_get_initial_sched_ctx()->id && sched_ctx_id != STARPU_NMAX_SCHED_CTXS && sched_ctx->perf_counters != NULL && _starpu_sched_ctx_allow_hypervisor(sched_ctx_id)) { _STARPU_TRACE_HYPERVISOR_BEGIN(); sched_ctx->perf_counters->notify_pushed_task(sched_ctx_id, workerid); _STARPU_TRACE_HYPERVISOR_END(); } } #endif //STARPU_USE_SC_HYPERVISOR int starpu_sched_get_min_priority(void) { return starpu_sched_ctx_get_min_priority(_starpu_sched_ctx_get_current_context()); } int starpu_sched_get_max_priority(void) { return starpu_sched_ctx_get_max_priority(_starpu_sched_ctx_get_current_context()); } int starpu_sched_set_min_priority(int min_prio) { return starpu_sched_ctx_set_min_priority(_starpu_sched_ctx_get_current_context(), min_prio); } int starpu_sched_set_max_priority(int max_prio) { return starpu_sched_ctx_set_max_priority(_starpu_sched_ctx_get_current_context(), max_prio); } int starpu_sched_ctx_get_min_priority(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); return sched_ctx->min_priority; } int starpu_sched_ctx_get_max_priority(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); return sched_ctx->max_priority; } int starpu_sched_ctx_set_min_priority(unsigned sched_ctx_id, int min_prio) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); sched_ctx->min_priority = min_prio; return 0; } int starpu_sched_ctx_set_max_priority(unsigned sched_ctx_id, int max_prio) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); sched_ctx->max_priority = max_prio; return 0; } int starpu_sched_ctx_min_priority_is_set(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); return sched_ctx->min_priority_is_set; } int starpu_sched_ctx_max_priority_is_set(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); return sched_ctx->max_priority_is_set; } void starpu_sched_ctx_set_priority(int *workers, int nworkers, unsigned sched_ctx_id, unsigned priority) { if(nworkers != -1) { int w; struct _starpu_worker *worker = NULL; for(w = 0; w < nworkers; w++) { worker = _starpu_get_worker_struct(workers[w]); STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); struct _starpu_sched_ctx_list *l = NULL; for (l = worker->sched_ctx_list; l; l = l->next) { if(l->sched_ctx == sched_ctx_id) { l->priority = priority; break; } } STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); } } return; } unsigned starpu_sched_ctx_get_priority(int workerid, unsigned sched_ctx_id) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); struct _starpu_sched_ctx_list *l = NULL; for (l = worker->sched_ctx_list; l; l = l->next) { if(l->sched_ctx == sched_ctx_id) { return l->priority; } } return 1; } unsigned _starpu_sched_ctx_last_worker_awake(struct _starpu_worker *worker) { struct _starpu_sched_ctx_list *l = NULL; for (l = worker->sched_ctx_list; l; l = l->next) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(l->sched_ctx); unsigned last_worker_awake = 1; struct starpu_worker_collection *workers = sched_ctx->workers; struct starpu_sched_ctx_iterator it; int workerid; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { workerid = workers->get_next(workers, &it); if(workerid != worker->workerid && _starpu_worker_get_status(workerid) != STATUS_SLEEPING) { last_worker_awake = 0; break; } } if(last_worker_awake) return 1; } return 0; } void starpu_sched_ctx_bind_current_thread_to_cpuid(unsigned cpuid STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_SIMGRID return; #else /* FIXME: why not factorize with _starpu_bind_thread_on_cpu? */ if (nobind > 0) return; #ifdef STARPU_HAVE_HWLOC struct _starpu_machine_config *config = _starpu_get_machine_config(); const struct hwloc_topology_support *support = hwloc_topology_get_support (config->topology.hwtopology); if (support->cpubind->set_thisthread_cpubind) { hwloc_obj_t obj = hwloc_get_obj_by_depth (config->topology.hwtopology, config->pu_depth, cpuid); hwloc_bitmap_t set = obj->cpuset; int ret; hwloc_bitmap_singlify(set); ret = hwloc_set_cpubind (config->topology.hwtopology, set, HWLOC_CPUBIND_THREAD); if (ret) { perror("hwloc_set_cpubind"); STARPU_ABORT(); } } #elif defined(HAVE_PTHREAD_SETAFFINITY_NP) && defined(__linux__) int ret; /* fix the thread on the correct cpu */ cpu_set_t aff_mask; CPU_ZERO(&aff_mask); CPU_SET(cpuid, &aff_mask); starpu_pthread_t self = pthread_self(); ret = pthread_setaffinity_np(self, sizeof(aff_mask), &aff_mask); if (ret) { perror("binding thread"); STARPU_ABORT(); } #elif defined(_WIN32) DWORD mask = 1 << cpuid; if (!SetThreadAffinityMask(GetCurrentThread(), mask)) { _STARPU_ERROR("SetThreadMaskAffinity(%lx) failed\n", mask); } #else #warning no CPU binding support #endif #endif } unsigned starpu_sched_ctx_worker_is_master_for_child_ctx(int workerid, unsigned sched_ctx_id) { if (_starpu_get_nsched_ctxs() <= 1) return STARPU_NMAX_SCHED_CTXS; struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); struct _starpu_sched_ctx_list *l = NULL; struct _starpu_sched_ctx *sched_ctx = NULL; for (l = worker->sched_ctx_list; l; l = l->next) { sched_ctx = _starpu_get_sched_ctx_struct(l->sched_ctx); if(sched_ctx-> main_master == workerid && sched_ctx->nesting_sched_ctx == sched_ctx_id) return sched_ctx->id; } return STARPU_NMAX_SCHED_CTXS; } struct _starpu_sched_ctx *__starpu_sched_ctx_get_sched_ctx_for_worker_and_job(struct _starpu_worker *worker, struct _starpu_job *j) { struct _starpu_sched_ctx_list *l = NULL; for (l = worker->sched_ctx_list; l; l = l->next) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(l->sched_ctx); if (j->task->sched_ctx == sched_ctx->id) return sched_ctx; } return NULL; } void starpu_sched_ctx_revert_task_counters(unsigned sched_ctx_id, double ready_flops) { _starpu_decrement_nsubmitted_tasks_of_sched_ctx(sched_ctx_id); _starpu_decrement_nready_tasks_of_sched_ctx(sched_ctx_id, ready_flops); } void starpu_sched_ctx_move_task_to_ctx(struct starpu_task *task, unsigned sched_ctx) { int workerid = starpu_worker_get_id(); struct _starpu_worker *worker = NULL; if(workerid != -1) { worker = _starpu_get_worker_struct(workerid); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); } task->sched_ctx = sched_ctx; struct _starpu_job *j = _starpu_get_job_associated_to_task(task); _starpu_increment_nsubmitted_tasks_of_sched_ctx(j->task->sched_ctx); _starpu_repush_task(j); if(workerid != -1) STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); } static unsigned _worker_sleeping_in_other_ctx(unsigned sched_ctx_id, int workerid) { int s; for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(s); if(sched_ctx && sched_ctx->id > 0 && sched_ctx->id < STARPU_NMAX_SCHED_CTXS && sched_ctx->id != sched_ctx_id) { if(sched_ctx->parallel_sect[workerid]) return 1; } } return 0; } static void _starpu_sched_ctx_get_workers_to_sleep(unsigned sched_ctx_id, int *workerids, int nworkers, int master) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); int current_worker_id = starpu_worker_get_id(); unsigned sleeping[nworkers]; int w; for(w = 0; w < nworkers; w++) { if(current_worker_id == -1 || workerids[w] != current_worker_id) STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx->parallel_sect_mutex[workerids[w]]); sleeping[w] = _worker_sleeping_in_other_ctx(sched_ctx_id, workerids[w]); sched_ctx->master[workerids[w]] = master; sched_ctx->parallel_sect[workerids[w]] = 1; if(current_worker_id == -1 || workerids[w] != current_worker_id) STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx->parallel_sect_mutex[workerids[w]]); #ifndef STARPU_NON_BLOCKING_DRIVERS starpu_wake_worker(workerids[w]); #endif } int workerid; for(w = 0; w < nworkers; w++) { workerid = workerids[w]; if((current_worker_id == -1 || workerid != current_worker_id) && !sleeping[w]) { sem_wait(&sched_ctx->fall_asleep_sem[master]); } } return; } void _starpu_sched_ctx_signal_worker_blocked(unsigned sched_ctx_id, int workerid) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); worker->slave = 1; struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); sched_ctx->sleeping[workerid] = 1; int master = sched_ctx->master[workerid]; sem_post(&sched_ctx->fall_asleep_sem[master]); return; } void _starpu_sched_ctx_signal_worker_woke_up(unsigned sched_ctx_id, int workerid) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); int master = sched_ctx->master[workerid]; sem_post(&sched_ctx->wake_up_sem[master]); sched_ctx->sleeping[workerid] = 0; sched_ctx->master[workerid] = -1; struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); worker->slave = 0; return; } static void _starpu_sched_ctx_wake_up_workers(unsigned sched_ctx_id, int master) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); int current_worker_id = starpu_worker_get_id(); struct starpu_worker_collection *workers = sched_ctx->workers; struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { int workerid = workers->get_next(workers, &it); int curr_master = sched_ctx->master[workerid]; if(curr_master == master && sched_ctx->parallel_sect[workerid]) { if((current_worker_id == -1 || workerid != current_worker_id) && sched_ctx->sleeping[workerid]) { STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx->parallel_sect_mutex[workerid]); STARPU_PTHREAD_COND_SIGNAL(&sched_ctx->parallel_sect_cond[workerid]); STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx->parallel_sect_mutex[workerid]); sem_wait(&sched_ctx->wake_up_sem[master]); } else sched_ctx->parallel_sect[workerid] = 0; } } return; } void* starpu_sched_ctx_exec_parallel_code(void* (*func)(void*), void* param, unsigned sched_ctx_id) { int *workerids = NULL; int nworkers = starpu_sched_ctx_get_workers_list(sched_ctx_id, &workerids); _starpu_sched_ctx_get_workers_to_sleep(sched_ctx_id, workerids, nworkers, workerids[nworkers-1]); /* execute parallel code */ void* ret = func(param); /* wake up starpu workers */ _starpu_sched_ctx_wake_up_workers(sched_ctx_id, workerids[nworkers-1]); free(workerids); return ret; } void starpu_sched_ctx_get_available_cpuids(unsigned sched_ctx_id, int **cpuids, int *ncpuids) { int current_worker_id = starpu_worker_get_id(); struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); struct starpu_worker_collection *workers = sched_ctx->workers; int w = 0; struct starpu_sched_ctx_iterator it; int workerid; _STARPU_MALLOC((*cpuids), workers->nworkers*sizeof(int)); workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { workerid = workers->get_next(workers, &it); int master = sched_ctx->master[workerid]; if(master == current_worker_id || workerid == current_worker_id || current_worker_id == -1) { (*cpuids)[w++] = starpu_worker_get_bindid(workerid); } } *ncpuids = w; return; } static void _starpu_sched_ctx_wake_these_workers_up(unsigned sched_ctx_id, int *workerids, int nworkers) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); int current_worker_id = starpu_worker_get_id(); int masters[nworkers]; int w; for(w = 0; w < nworkers; w++) { int workerid = workerids[w]; masters[w] = sched_ctx->master[workerid]; if(current_worker_id == -1 || workerid != current_worker_id) { STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx->parallel_sect_mutex[workerid]); STARPU_PTHREAD_COND_SIGNAL(&sched_ctx->parallel_sect_cond[workerid]); STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx->parallel_sect_mutex[workerid]); } else sched_ctx->parallel_sect[workerid] = 0; sched_ctx->master[workerid] = -1; } int workerid; for(w = 0; w < nworkers; w++) { workerid = workerids[w]; if(masters[w] != -1) { int master = sched_ctx->master[workerid]; if(current_worker_id == -1 || workerid != current_worker_id) sem_wait(&sched_ctx->wake_up_sem[master]); } } return; } static int _starpu_sched_ctx_find_master(unsigned sched_ctx_id, int *workerids, int nworkers) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); int new_master = workerids[nworkers-1]; int current_worker_id = starpu_worker_get_id(); int current_is_in_section = 0; int npotential_masters = 0; int nawake_workers = 0; int ntrue_masters = 0; int potential_masters[nworkers]; int awake_workers[nworkers]; int true_masters[nworkers]; int i,w; for(w = 0 ; w < nworkers ; w++) { if (current_worker_id == workerids[w]) current_is_in_section = 1; int master = sched_ctx->master[workerids[w]]; if (master > -1) { int already_seen = 0; //Could create a function for this. Basically searching an element in an array. for (i = 0 ; i < npotential_masters; i++) { if (potential_masters[i] == master) { already_seen = 1; break; } } if (!already_seen) potential_masters[npotential_masters++] = master; } else if (master == -1) awake_workers[nawake_workers++] = workerids[w]; } for (i = 0 ; i < npotential_masters ; i++) { int master_is_in_section = 0; //Could create a function for this. Basically searching an element in an array. for (w = 0 ; w < nworkers ; w++) { if (workerids[w] == potential_masters[i]) { master_is_in_section = 1; break; } } if (master_is_in_section) true_masters[ntrue_masters++] = potential_masters[i]; } if (current_is_in_section) new_master = current_worker_id; else { if (ntrue_masters > 1) { if (nawake_workers > 0) new_master = awake_workers[nawake_workers - 1]; else new_master = true_masters[ntrue_masters - 1]; } } return new_master; } static void _starpu_sched_ctx_add_workers_to_master(unsigned sched_ctx_id, int *workerids, int nworkers, int new_master) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); int w; int nput_to_sleep = 0; int nwake_up = 0; int put_to_sleep[nworkers]; int wake_up[nworkers]; for(w = 0 ; w < nworkers ; w++) { int master = sched_ctx->master[workerids[w]]; if (master == -1 && workerids[w] != new_master) put_to_sleep[nput_to_sleep++] = workerids[w]; else if(master != -1 && workerids[w] == new_master) wake_up[nwake_up++] = workerids[w]; } if(nwake_up > 0) _starpu_sched_ctx_wake_these_workers_up(sched_ctx_id, wake_up, nwake_up); if(nput_to_sleep > 0) _starpu_sched_ctx_get_workers_to_sleep(sched_ctx_id, put_to_sleep, nput_to_sleep, new_master); } static void _starpu_sched_ctx_set_master(struct _starpu_sched_ctx *sched_ctx, int *workerids, int nworkers, int master) { int i; for(i = 0; i < nworkers; i++) { if(workerids[i] != master) sched_ctx->master[workerids[i]] = master; } } int starpu_sched_ctx_book_workers_for_task(unsigned sched_ctx_id, int *workerids, int nworkers) { int new_master = _starpu_sched_ctx_find_master(sched_ctx_id, workerids, nworkers); _starpu_sched_ctx_add_workers_to_master(sched_ctx_id, workerids, nworkers, new_master); return new_master; } void starpu_sched_ctx_unbook_workers_for_task(unsigned sched_ctx_id, int master) { /* wake up starpu workers */ _starpu_sched_ctx_wake_up_workers(sched_ctx_id, master); } struct starpu_perfmodel_arch * _starpu_sched_ctx_get_perf_archtype(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); return &sched_ctx->perf_arch; } int starpu_sched_ctx_get_worker_rank(unsigned sched_ctx_id) { int idx = 0; int curr_workerid = starpu_worker_get_id(); int worker; struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); if(sched_ctx->sched_policy || !sched_ctx->awake_workers) return -1; struct starpu_worker_collection *workers = sched_ctx->workers; struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); if(worker == curr_workerid) return idx; idx++; } return -1; } starpu-1.2.3+dfsg/src/core/sched_ctx.h000066400000000000000000000230541320135501600176060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __SCHED_CONTEXT_H__ #define __SCHED_CONTEXT_H__ #include #include #include #include #include #include #include #include #include "sched_ctx_list.h" #ifdef STARPU_HAVE_HWLOC #include #endif #define NO_RESIZE -1 #define REQ_RESIZE 0 #define DO_RESIZE 1 #define STARPU_GLOBAL_SCHED_CTX 0 struct _starpu_sched_ctx { /* id of the context used in user mode*/ unsigned id; /* name of context */ const char *name; /* policy of the context */ struct starpu_sched_policy *sched_policy; /* data necessary for the policy */ void *policy_data; struct starpu_worker_collection *workers; /* we keep an initial sched which we never delete */ unsigned is_initial_sched; /* wait for the tasks submitted to the context to be executed */ struct _starpu_barrier_counter tasks_barrier; /* wait for the tasks ready of the context to be executed */ struct _starpu_barrier_counter ready_tasks_barrier; /* amount of ready flops in a context */ double ready_flops; /* Iteration number, as advertised by application */ long iterations[2]; int iteration_level; /* cond to block push when there are no workers in the ctx */ starpu_pthread_cond_t no_workers_cond; /* mutex to block push when there are no workers in the ctx */ starpu_pthread_mutex_t no_workers_mutex; /*ready tasks that couldn't be pushed because the ctx has no workers*/ struct starpu_task_list empty_ctx_tasks; /* mutext protecting empty_ctx_tasks list */ starpu_pthread_mutex_t empty_ctx_mutex; /*ready tasks that couldn't be pushed because the the window of tasks was already full*/ struct starpu_task_list waiting_tasks; /* mutext protecting waiting_tasks list */ starpu_pthread_mutex_t waiting_tasks_mutex; /* min CPUs to execute*/ int min_ncpus; /* max CPUs to execute*/ int max_ncpus; /* min GPUs to execute*/ int min_ngpus; /* max GPUs to execute*/ int max_ngpus; /* in case we delete the context leave resources to the inheritor*/ unsigned inheritor; /* indicates whether the application finished submitting tasks to this context*/ unsigned finished_submit; /* By default we have a binary type of priority: either a task is a priority * task (level 1) or it is not (level 0). */ int min_priority; int max_priority; int min_priority_is_set; int max_priority_is_set; /* hwloc tree structure of workers */ #ifdef STARPU_HAVE_HWLOC hwloc_bitmap_t hwloc_workers_set; #endif #ifdef STARPU_USE_SC_HYPERVISOR /* a structure containing a series of performance counters determining the resize procedure */ struct starpu_sched_ctx_performance_counters *perf_counters; #endif //STARPU_USE_SC_HYPERVISOR /* callback called when the context finished executed its submitted tasks */ void (*close_callback)(unsigned sched_ctx_id, void* args); void *close_args; /* value placing the contexts in their hierarchy */ unsigned hierarchy_level; /* if we execute non-StarPU code inside the context we have a single master worker that stays awake, if not master is -1 */ int main_master; /* conditions variables used when parallel sections are executed in contexts */ starpu_pthread_cond_t parallel_sect_cond[STARPU_NMAXWORKERS]; starpu_pthread_mutex_t parallel_sect_mutex[STARPU_NMAXWORKERS]; starpu_pthread_cond_t parallel_sect_cond_busy[STARPU_NMAXWORKERS]; int busy[STARPU_NMAXWORKERS]; /* boolean indicating that workers should block in order to allow parallel sections to be executed on their allocated resources */ unsigned parallel_sect[STARPU_NMAXWORKERS]; /* id of the master worker */ int master[STARPU_NMAXWORKERS]; /* semaphore that block appl thread until starpu threads are all blocked and ready to exec the parallel code */ sem_t fall_asleep_sem[STARPU_NMAXWORKERS]; /* semaphore that block appl thread until starpu threads are all woke up and ready continue appl */ sem_t wake_up_sem[STARPU_NMAXWORKERS]; /* bool indicating if the workers is sleeping in this ctx */ unsigned sleeping[STARPU_NMAXWORKERS]; /* ctx nesting the current ctx */ unsigned nesting_sched_ctx; /* perf model for the device comb of the ctx */ struct starpu_perfmodel_arch perf_arch; /* for ctxs without policy: flag to indicate that we want to get the threads to sleep in order to replace them with other threads or leave them awake & use them in the parallel code*/ unsigned awake_workers; }; struct _starpu_machine_config; /* init sched_ctx_id of all contextes*/ void _starpu_init_all_sched_ctxs(struct _starpu_machine_config *config); /* allocate all structures belonging to a context */ struct _starpu_sched_ctx* _starpu_create_sched_ctx(struct starpu_sched_policy *policy, int *workerid, int nworkerids, unsigned is_init_sched, const char *sched_name, int min_prio_set, int min_prio, int max_prio_set, int max_prio, unsigned awake_workers); /* delete all sched_ctx */ void _starpu_delete_all_sched_ctxs(); /* This function waits until all the tasks that were already submitted to a specific * context have been executed. */ int _starpu_wait_for_all_tasks_of_sched_ctx(unsigned sched_ctx_id); /* This function waits until at most n tasks are still submitted. */ int _starpu_wait_for_n_submitted_tasks_of_sched_ctx(unsigned sched_ctx_id, unsigned n); /* In order to implement starpu_wait_for_all_tasks_of_ctx, we keep track of the number of * task currently submitted to the context */ void _starpu_decrement_nsubmitted_tasks_of_sched_ctx(unsigned sched_ctx_id); void _starpu_increment_nsubmitted_tasks_of_sched_ctx(unsigned sched_ctx_id); int _starpu_get_nsubmitted_tasks_of_sched_ctx(unsigned sched_ctx_id); int _starpu_check_nsubmitted_tasks_of_sched_ctx(unsigned sched_ctx_id); void _starpu_decrement_nready_tasks_of_sched_ctx(unsigned sched_ctx_id, double ready_flops); unsigned _starpu_increment_nready_tasks_of_sched_ctx(unsigned sched_ctx_id, double ready_flops, struct starpu_task *task); int _starpu_wait_for_no_ready_of_sched_ctx(unsigned sched_ctx_id); /* Return the corresponding index of the workerid in the ctx table */ int _starpu_get_index_in_ctx_of_workerid(unsigned sched_ctx, unsigned workerid); /* Get the mutex corresponding to the global workerid */ starpu_pthread_mutex_t *_starpu_get_sched_mutex(struct _starpu_sched_ctx *sched_ctx, int worker); /* Get workers belonging to a certain context, it returns the number of workers take care: no mutex taken, the list of workers might not be updated */ int _starpu_get_workers_of_sched_ctx(unsigned sched_ctx_id, int *pus, enum starpu_worker_archtype arch); /* Let the worker know it does not belong to the context and that it should stop poping from it */ void _starpu_worker_gets_out_of_ctx(unsigned sched_ctx_id, struct _starpu_worker *worker); /* Check if the worker belongs to another sched_ctx */ unsigned _starpu_worker_belongs_to_a_sched_ctx(int workerid, unsigned sched_ctx_id); /* mutex synchronising several simultaneous modifications of a context */ starpu_pthread_rwlock_t* _starpu_sched_ctx_get_changing_ctx_mutex(unsigned sched_ctx_id); /* indicates wheather this worker should go to sleep or not (if it is the last one awake in a context he should better keep awake) */ unsigned _starpu_sched_ctx_last_worker_awake(struct _starpu_worker *worker); /* let the appl know that the worker blocked to execute parallel code */ void _starpu_sched_ctx_signal_worker_blocked(unsigned sched_ctx_id, int workerid); /* let the appl know that the worker woke up */ void _starpu_sched_ctx_signal_worker_woke_up(unsigned sched_ctx_id, int workerid); /* If starpu_sched_ctx_set_context() has been called, returns the context * id set by its last call, or the id of the initial context */ unsigned _starpu_sched_ctx_get_current_context(); /* verify how many workers can execute a certain task */ int _starpu_nworkers_able_to_execute_task(struct starpu_task *task, struct _starpu_sched_ctx *sched_ctx); void _starpu_fetch_tasks_from_empty_ctx_list(struct _starpu_sched_ctx *sched_ctx); unsigned _starpu_sched_ctx_allow_hypervisor(unsigned sched_ctx_id); struct starpu_perfmodel_arch * _starpu_sched_ctx_get_perf_archtype(unsigned sched_ctx); #ifdef STARPU_USE_SC_HYPERVISOR /* Notifies the hypervisor that a tasks was poped from the workers' list */ void _starpu_sched_ctx_post_exec_task_cb(int workerid, struct starpu_task *task, size_t data_size, uint32_t footprint); #endif //STARPU_USE_SC_HYPERVISOR /* if the worker is the master of a parallel context, and the job is meant to be executed on this parallel context, return a pointer to the context */ struct _starpu_sched_ctx *__starpu_sched_ctx_get_sched_ctx_for_worker_and_job(struct _starpu_worker *worker, struct _starpu_job *j); #define _starpu_sched_ctx_get_sched_ctx_for_worker_and_job(w,j) \ (_starpu_get_nsched_ctxs() <= 1 ? _starpu_get_sched_ctx_struct(0) : __starpu_sched_ctx_get_sched_ctx_for_worker_and_job((w),(j))) #endif // __SCHED_CONTEXT_H__ starpu-1.2.3+dfsg/src/core/sched_ctx_list.c000066400000000000000000000041471320135501600206360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "sched_ctx_list.h" void _starpu_sched_ctx_list_init(struct _starpu_sched_ctx_list *list) { list->next = NULL; list->sched_ctx = STARPU_NMAX_SCHED_CTXS; list->priority = 1; } void _starpu_sched_ctx_list_add(struct _starpu_sched_ctx_list **list, unsigned sched_ctx) { if((*list)->sched_ctx == STARPU_NMAX_SCHED_CTXS) (*list)->sched_ctx = sched_ctx; else { struct _starpu_sched_ctx_list *l; _STARPU_MALLOC(l, sizeof(struct _starpu_sched_ctx_list)); l->sched_ctx = sched_ctx; l->priority = 1; l->next = *list; *list = l; } } void _starpu_sched_ctx_list_remove(struct _starpu_sched_ctx_list **list, unsigned sched_ctx) { struct _starpu_sched_ctx_list *l = NULL; struct _starpu_sched_ctx_list *prev = NULL; for (l = (*list); l; l = l->next) { if(l->sched_ctx == sched_ctx) break; prev = l; } struct _starpu_sched_ctx_list *next = NULL; if(l->next) next = l->next; free(l); l = NULL; if(next) { if(prev) prev->next = next; else *list = next; } } unsigned _starpu_sched_ctx_list_get_sched_ctx(struct _starpu_sched_ctx_list *list, unsigned sched_ctx) { struct _starpu_sched_ctx_list *l = NULL; for (l = list; l; l = l->next) { if(l->sched_ctx == sched_ctx) return sched_ctx; } return STARPU_NMAX_SCHED_CTXS; } void _starpu_sched_ctx_list_delete(struct _starpu_sched_ctx_list **list) { while(*list) { struct _starpu_sched_ctx_list *next = (*list)->next; free(*list); *list = NULL; if(next) *list = next; } } starpu-1.2.3+dfsg/src/core/sched_ctx_list.h000066400000000000000000000024021320135501600206330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __SCHED_CONTEXT_LIST_H__ #define __SCHED_CONTEXT_LIST_H__ struct _starpu_sched_ctx_list { struct _starpu_sched_ctx_list *next; unsigned sched_ctx; unsigned priority; }; void _starpu_sched_ctx_list_init(struct _starpu_sched_ctx_list *list); void _starpu_sched_ctx_list_add(struct _starpu_sched_ctx_list **list, unsigned sched_ctx); void _starpu_sched_ctx_list_remove(struct _starpu_sched_ctx_list **list, unsigned sched_ctx); unsigned _starpu_sched_ctx_list_get_sched_ctx(struct _starpu_sched_ctx_list *list, unsigned sched_ctx); void _starpu_sched_ctx_list_delete(struct _starpu_sched_ctx_list **list); #endif // __SCHED_CONTEXT_H__ starpu-1.2.3+dfsg/src/core/sched_policy.c000066400000000000000000001025411320135501600203010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2017 Université de Bordeaux * Copyright (C) 2010-2015, 2017 CNRS * Copyright (C) 2011, 2016 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include static int use_prefetch = 0; static double idle[STARPU_NMAXWORKERS]; static double idle_start[STARPU_NMAXWORKERS]; long _starpu_task_break_on_push = -1; long _starpu_task_break_on_sched = -1; long _starpu_task_break_on_pop = -1; long _starpu_task_break_on_exec = -1; static const char *starpu_idle_file; void _starpu_sched_init(void) { _starpu_task_break_on_push = starpu_get_env_number_default("STARPU_TASK_BREAK_ON_PUSH", -1); _starpu_task_break_on_sched = starpu_get_env_number_default("STARPU_TASK_BREAK_ON_SCHED", -1); _starpu_task_break_on_pop = starpu_get_env_number_default("STARPU_TASK_BREAK_ON_POP", -1); _starpu_task_break_on_exec = starpu_get_env_number_default("STARPU_TASK_BREAK_ON_EXEC", -1); starpu_idle_file = starpu_getenv("STARPU_IDLE_FILE"); } int starpu_get_prefetch_flag(void) { return use_prefetch; } static struct starpu_sched_policy *predefined_policies[] = { &_starpu_sched_modular_eager_policy, &_starpu_sched_modular_eager_prefetching_policy, &_starpu_sched_modular_prio_policy, &_starpu_sched_modular_prio_prefetching_policy, &_starpu_sched_modular_random_policy, &_starpu_sched_modular_random_prio_policy, &_starpu_sched_modular_random_prefetching_policy, &_starpu_sched_modular_random_prio_prefetching_policy, //&_starpu_sched_modular_ws_policy, &_starpu_sched_modular_heft_policy, &_starpu_sched_modular_heft_prio_policy, &_starpu_sched_modular_heft2_policy, &_starpu_sched_eager_policy, &_starpu_sched_prio_policy, &_starpu_sched_random_policy, &_starpu_sched_lws_policy, &_starpu_sched_ws_policy, &_starpu_sched_dm_policy, &_starpu_sched_dmda_policy, &_starpu_sched_dmda_ready_policy, &_starpu_sched_dmda_sorted_policy, &_starpu_sched_dmda_sorted_decision_policy, &_starpu_sched_parallel_heft_policy, &_starpu_sched_peager_policy, &_starpu_sched_graph_test_policy, NULL }; struct starpu_sched_policy **starpu_sched_get_predefined_policies() { return predefined_policies; } struct starpu_sched_policy *_starpu_get_sched_policy(struct _starpu_sched_ctx *sched_ctx) { return sched_ctx->sched_policy; } /* * Methods to initialize the scheduling policy */ static void load_sched_policy(struct starpu_sched_policy *sched_policy, struct _starpu_sched_ctx *sched_ctx) { STARPU_ASSERT(sched_policy); #ifdef STARPU_VERBOSE if (sched_policy->policy_name) { if (sched_policy->policy_description) _STARPU_DEBUG("Use %s scheduler (%s)\n", sched_policy->policy_name, sched_policy->policy_description); else _STARPU_DEBUG("Use %s scheduler \n", sched_policy->policy_name); } #endif struct starpu_sched_policy *policy = sched_ctx->sched_policy; memcpy(policy, sched_policy, sizeof(*policy)); } static struct starpu_sched_policy *find_sched_policy_from_name(const char *policy_name) { if (!policy_name) return NULL; if (strcmp(policy_name, "") == 0) return NULL; if (strncmp(policy_name, "heft", 4) == 0) { _STARPU_MSG("Warning: heft is now called \"dmda\".\n"); return &_starpu_sched_dmda_policy; } struct starpu_sched_policy **policy; for(policy=predefined_policies ; *policy!=NULL ; policy++) { struct starpu_sched_policy *p = *policy; if (p->policy_name) { if (strcmp(policy_name, p->policy_name) == 0) { /* we found a policy with the requested name */ return p; } } } if (strcmp(policy_name, "help") != 0) _STARPU_MSG("Warning: scheduling policy '%s' was not found, try 'help' to get a list\n", policy_name); /* nothing was found */ return NULL; } static void display_sched_help_message(FILE *stream) { const char *sched_env = starpu_getenv("STARPU_SCHED"); if (sched_env && (strcmp(sched_env, "help") == 0)) { /* display the description of all predefined policies */ struct starpu_sched_policy **policy; fprintf(stream, "\nThe variable STARPU_SCHED can be set to one of the following strings:\n"); for(policy=predefined_policies ; *policy!=NULL ; policy++) { struct starpu_sched_policy *p = *policy; fprintf(stream, "%-30s\t-> %s\n", p->policy_name, p->policy_description); } fprintf(stream, "\n"); } } struct starpu_sched_policy *_starpu_select_sched_policy(struct _starpu_machine_config *config, const char *required_policy) { struct starpu_sched_policy *selected_policy = NULL; struct starpu_conf *user_conf = &config->conf; if(required_policy) selected_policy = find_sched_policy_from_name(required_policy); /* If there is a policy that matches the required name, return it */ if (selected_policy) return selected_policy; /* First, we check whether the application explicitely gave a scheduling policy or not */ if (user_conf && (user_conf->sched_policy)) return user_conf->sched_policy; /* Otherwise, we look if the application specified the name of a policy to load */ const char *sched_pol_name; sched_pol_name = starpu_getenv("STARPU_SCHED"); if (sched_pol_name == NULL && user_conf && user_conf->sched_policy_name) sched_pol_name = user_conf->sched_policy_name; if (sched_pol_name) selected_policy = find_sched_policy_from_name(sched_pol_name); /* If there is a policy that matches the name, return it */ if (selected_policy) return selected_policy; /* If no policy was specified, we use the eager policy by default */ return &_starpu_sched_eager_policy; } void _starpu_init_sched_policy(struct _starpu_machine_config *config, struct _starpu_sched_ctx *sched_ctx, struct starpu_sched_policy *selected_policy) { /* Perhaps we have to display some help */ display_sched_help_message(stderr); /* Prefetch is activated by default */ use_prefetch = starpu_get_env_number("STARPU_PREFETCH"); if (use_prefetch == -1) use_prefetch = 1; /* Set calibrate flag */ _starpu_set_calibrate_flag(config->conf.calibrate); load_sched_policy(selected_policy, sched_ctx); _STARPU_TRACE_WORKER_SCHEDULING_PUSH; sched_ctx->sched_policy->init_sched(sched_ctx->id); _STARPU_TRACE_WORKER_SCHEDULING_POP; } void _starpu_deinit_sched_policy(struct _starpu_sched_ctx *sched_ctx) { struct starpu_sched_policy *policy = sched_ctx->sched_policy; if (policy->deinit_sched) { _STARPU_TRACE_WORKER_SCHEDULING_PUSH; policy->deinit_sched(sched_ctx->id); _STARPU_TRACE_WORKER_SCHEDULING_POP; } } void _starpu_sched_task_submit(struct starpu_task *task) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(task->sched_ctx); if (!sched_ctx->sched_policy) return; if (!sched_ctx->sched_policy->submit_hook) return; _STARPU_TRACE_WORKER_SCHEDULING_PUSH; sched_ctx->sched_policy->submit_hook(task); _STARPU_TRACE_WORKER_SCHEDULING_POP; } void _starpu_sched_do_schedule(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); if (!sched_ctx->sched_policy) return; if (!sched_ctx->sched_policy->do_schedule) return; _STARPU_TRACE_WORKER_SCHEDULING_PUSH; sched_ctx->sched_policy->do_schedule(sched_ctx_id); _STARPU_TRACE_WORKER_SCHEDULING_POP; } static void _starpu_push_task_on_specific_worker_notify_sched(struct starpu_task *task, struct _starpu_worker *worker, int workerid, int perf_workerid) { /* if we push a task on a specific worker, notify all the sched_ctxs the worker belongs to */ struct _starpu_sched_ctx *sched_ctx; struct _starpu_sched_ctx_list *l = NULL; for (l = worker->sched_ctx_list; l; l = l->next) { sched_ctx = _starpu_get_sched_ctx_struct(l->sched_ctx); if (sched_ctx->sched_policy != NULL && sched_ctx->sched_policy->push_task_notify) { _STARPU_TRACE_WORKER_SCHEDULING_PUSH; sched_ctx->sched_policy->push_task_notify(task, workerid, perf_workerid, sched_ctx->id); _STARPU_TRACE_WORKER_SCHEDULING_POP; } } } /* Enqueue a task into the list of tasks explicitely attached to a worker. In * case workerid identifies a combined worker, a task will be enqueued into * each worker of the combination. */ static int _starpu_push_task_on_specific_worker(struct starpu_task *task, int workerid) { int nbasic_workers = (int)starpu_worker_get_count(); /* Is this a basic worker or a combined worker ? */ int is_basic_worker = (workerid < nbasic_workers); unsigned memory_node; struct _starpu_worker *worker = NULL; struct _starpu_combined_worker *combined_worker = NULL; if (is_basic_worker) { worker = _starpu_get_worker_struct(workerid); memory_node = worker->memory_node; } else { combined_worker = _starpu_get_combined_worker_struct(workerid); memory_node = combined_worker->memory_node; } if (use_prefetch) starpu_prefetch_task_input_on_node(task, memory_node); if (is_basic_worker) _starpu_push_task_on_specific_worker_notify_sched(task, worker, workerid, workerid); else { /* Notify all workers of the combined worker */ int worker_size = combined_worker->worker_size; int *combined_workerid = combined_worker->combined_workerid; int j; for (j = 0; j < worker_size; j++) { int subworkerid = combined_workerid[j]; _starpu_push_task_on_specific_worker_notify_sched(task, _starpu_get_worker_struct(subworkerid), subworkerid, workerid); } } #ifdef STARPU_USE_SC_HYPERVISOR starpu_sched_ctx_call_pushed_task_cb(workerid, task->sched_ctx); #endif //STARPU_USE_SC_HYPERVISOR unsigned i; if (is_basic_worker) { unsigned node = starpu_worker_get_memory_node(workerid); if (_starpu_task_uses_multiformat_handles(task)) { unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); for (i = 0; i < nbuffers; i++) { struct starpu_task *conversion_task; starpu_data_handle_t handle; handle = STARPU_TASK_GET_HANDLE(task, i); if (!_starpu_handle_needs_conversion_task(handle, node)) continue; conversion_task = _starpu_create_conversion_task(handle, node); conversion_task->mf_skip = 1; conversion_task->execute_on_a_specific_worker = 1; conversion_task->workerid = workerid; _starpu_task_submit_conversion_task(conversion_task, workerid); //_STARPU_DEBUG("Pushing a conversion task\n"); } for (i = 0; i < nbuffers; i++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, i); handle->mf_node = node; } } // if(task->sched_ctx != _starpu_get_initial_sched_ctx()->id) if(task->priority > 0) return _starpu_push_local_task(worker, task, 1); else return _starpu_push_local_task(worker, task, 0); } else { /* This is a combined worker so we create task aliases */ int worker_size = combined_worker->worker_size; int *combined_workerid = combined_worker->combined_workerid; int ret = 0; struct _starpu_job *job = _starpu_get_job_associated_to_task(task); job->task_size = worker_size; job->combined_workerid = workerid; job->active_task_alias_count = 0; STARPU_PTHREAD_BARRIER_INIT(&job->before_work_barrier, NULL, worker_size); STARPU_PTHREAD_BARRIER_INIT(&job->after_work_barrier, NULL, worker_size); job->after_work_busy_barrier = worker_size; /* Note: we have to call that early, or else the task may have * disappeared already */ starpu_push_task_end(task); int j; for (j = 0; j < worker_size; j++) { struct starpu_task *alias = starpu_task_dup(task); alias->destroy = 1; worker = _starpu_get_worker_struct(combined_workerid[j]); ret |= _starpu_push_local_task(worker, alias, 0); } return ret; } } /* the generic interface that call the proper underlying implementation */ int _starpu_push_task(struct _starpu_job *j) { if(j->task->prologue_callback_func) j->task->prologue_callback_func(j->task->prologue_callback_arg); return _starpu_repush_task(j); } int _starpu_repush_task(struct _starpu_job *j) { struct starpu_task *task = j->task; struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(task->sched_ctx); unsigned nworkers = 0; int ret; _STARPU_LOG_IN(); unsigned can_push = _starpu_increment_nready_tasks_of_sched_ctx(task->sched_ctx, task->flops, task); task->status = STARPU_TASK_READY; STARPU_AYU_ADDTOTASKQUEUE(j->job_id, -1); /* if the context does not have any workers save the tasks in a temp list */ if ((task->cl != NULL && task->cl->where != STARPU_NOWHERE) && (!sched_ctx->is_initial_sched)) { /*if there are workers in the ctx that are not able to execute tasks we consider the ctx empty */ nworkers = _starpu_nworkers_able_to_execute_task(task, sched_ctx); if(nworkers == 0) { STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx->empty_ctx_mutex); starpu_task_list_push_front(&sched_ctx->empty_ctx_tasks, task); STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx->empty_ctx_mutex); #ifdef STARPU_USE_SC_HYPERVISOR if(sched_ctx->id != 0 && sched_ctx->perf_counters != NULL && sched_ctx->perf_counters->notify_empty_ctx) { _STARPU_TRACE_HYPERVISOR_BEGIN(); sched_ctx->perf_counters->notify_empty_ctx(sched_ctx->id, task); _STARPU_TRACE_HYPERVISOR_END(); } #endif return 0; } } if(!can_push) return 0; /* in case there is no codelet associated to the task (that's a control * task), we directly execute its callback and enforce the * corresponding dependencies */ if (task->cl == NULL || task->cl->where == STARPU_NOWHERE) { if (task->prologue_callback_pop_func) task->prologue_callback_pop_func(task->prologue_callback_pop_arg); if (task->cl && task->cl->specific_nodes) { /* Nothing to do, but we are asked to fetch data on some memory nodes */ _starpu_fetch_nowhere_task_input(j); } else { if (task->cl) __starpu_push_task_output(j); _starpu_handle_job_termination(j); _STARPU_LOG_OUT_TAG("handle_job_termination"); } return 0; } ret = _starpu_push_task_to_workers(task); if (ret == -EAGAIN) /* pushed to empty context, that's fine */ ret = 0; return ret; } int _starpu_push_task_to_workers(struct starpu_task *task) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(task->sched_ctx); unsigned nworkers = 0; _STARPU_TRACE_JOB_PUSH(task, task->priority > 0); /* if the contexts still does not have workers put the task back to its place in the empty ctx list */ if(!sched_ctx->is_initial_sched) { /*if there are workers in the ctx that are not able to execute tasks we consider the ctx empty */ nworkers = _starpu_nworkers_able_to_execute_task(task, sched_ctx); if (nworkers == 0) { STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx->empty_ctx_mutex); starpu_task_list_push_back(&sched_ctx->empty_ctx_tasks, task); STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx->empty_ctx_mutex); #ifdef STARPU_USE_SC_HYPERVISOR if(sched_ctx->id != 0 && sched_ctx->perf_counters != NULL && sched_ctx->perf_counters->notify_empty_ctx) { _STARPU_TRACE_HYPERVISOR_BEGIN(); sched_ctx->perf_counters->notify_empty_ctx(sched_ctx->id, task); _STARPU_TRACE_HYPERVISOR_END(); } #endif return -EAGAIN; } } _starpu_profiling_set_task_push_start_time(task); int ret = 0; if (STARPU_UNLIKELY(task->execute_on_a_specific_worker)) { unsigned node = starpu_worker_get_memory_node(task->workerid); if (starpu_get_prefetch_flag()) starpu_prefetch_task_input_on_node(task, node); ret = _starpu_push_task_on_specific_worker(task, task->workerid); } else { struct _starpu_machine_config *config = _starpu_get_machine_config(); /* When a task can only be executed on a given arch and we have * only one memory node for that arch, we can systematically * prefetch before the scheduling decision. */ if (starpu_get_prefetch_flag()) { if (task->cl->where == STARPU_CPU && config->cpus_nodeid >= 0) starpu_prefetch_task_input_on_node(task, config->cpus_nodeid); else if (task->cl->where == STARPU_CUDA && config->cuda_nodeid >= 0) starpu_prefetch_task_input_on_node(task, config->cuda_nodeid); else if (task->cl->where == STARPU_OPENCL && config->opencl_nodeid >= 0) starpu_prefetch_task_input_on_node(task, config->opencl_nodeid); else if (task->cl->where == STARPU_MIC && config->mic_nodeid >= 0) starpu_prefetch_task_input_on_node(task, config->mic_nodeid); else if (task->cl->where == STARPU_SCC && config->scc_nodeid >= 0) starpu_prefetch_task_input_on_node(task, config->scc_nodeid); } if(!sched_ctx->sched_policy) { /* Note: we have to call that early, or else the task may have * disappeared already */ starpu_push_task_end(task); if(!sched_ctx->awake_workers) ret = _starpu_push_task_on_specific_worker(task, sched_ctx->main_master); else { struct starpu_worker_collection *workers = sched_ctx->workers; struct _starpu_job *job = _starpu_get_job_associated_to_task(task); job->task_size = workers->nworkers; job->combined_workerid = -1; // workerid; its a ctx not combined worker job->active_task_alias_count = 0; STARPU_PTHREAD_BARRIER_INIT(&job->before_work_barrier, NULL, workers->nworkers); STARPU_PTHREAD_BARRIER_INIT(&job->after_work_barrier, NULL, workers->nworkers); job->after_work_busy_barrier = workers->nworkers; unsigned workerid; struct starpu_sched_ctx_iterator it; if(workers->init_iterator) workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { workerid = workers->get_next(workers, &it); struct starpu_task *alias = starpu_task_dup(task); alias->destroy = 1; ret |= _starpu_push_task_on_specific_worker(alias, workerid); } } } else { STARPU_ASSERT(sched_ctx->sched_policy->push_task); /* check out if there are any workers in the context */ starpu_pthread_rwlock_t *changing_ctx_mutex = _starpu_sched_ctx_get_changing_ctx_mutex(sched_ctx->id); STARPU_PTHREAD_RWLOCK_RDLOCK(changing_ctx_mutex); nworkers = starpu_sched_ctx_get_nworkers(sched_ctx->id); if (nworkers == 0) ret = -1; else { _STARPU_TASK_BREAK_ON(task, push); _STARPU_TRACE_WORKER_SCHEDULING_PUSH; ret = sched_ctx->sched_policy->push_task(task); _STARPU_TRACE_WORKER_SCHEDULING_POP; } STARPU_PTHREAD_RWLOCK_UNLOCK(changing_ctx_mutex); } if(ret == -1) { _STARPU_MSG("repush task \n"); _STARPU_TRACE_JOB_POP(task, task->priority > 0); ret = _starpu_push_task_to_workers(task); } } /* Note: from here, the task might have been destroyed already! */ _STARPU_LOG_OUT(); return ret; } /* This is called right after the scheduler has pushed a task to a queue * but just before releasing mutexes: we need the task to still be alive! */ int starpu_push_task_end(struct starpu_task *task) { _starpu_profiling_set_task_push_end_time(task); task->scheduled = 1; return 0; } /* This is called right after the scheduler has pushed a task to a queue * but just before releasing mutexes: we need the task to still be alive! */ int _starpu_pop_task_end(struct starpu_task *task) { if (!task) return 0; _STARPU_TRACE_JOB_POP(task, task->priority > 0); return 0; } /* * Given a handle that needs to be converted in order to be used on the given * node, returns a task that takes care of the conversion. */ struct starpu_task *_starpu_create_conversion_task(starpu_data_handle_t handle, unsigned int node) { return _starpu_create_conversion_task_for_arch(handle, starpu_node_get_kind(node)); } struct starpu_task *_starpu_create_conversion_task_for_arch(starpu_data_handle_t handle, enum starpu_node_kind node_kind) { struct starpu_task *conversion_task; #if defined(STARPU_USE_OPENCL) || defined(STARPU_USE_CUDA) || defined(STARPU_USE_MIC) || defined(STARPU_USE_SCC) || defined(STARPU_SIMGRID) struct starpu_multiformat_interface *format_interface; #endif conversion_task = starpu_task_create(); conversion_task->name = "conversion_task"; conversion_task->synchronous = 0; STARPU_TASK_SET_HANDLE(conversion_task, handle, 0); #if defined(STARPU_USE_OPENCL) || defined(STARPU_USE_CUDA) || defined(STARPU_USE_MIC) || defined(STARPU_USE_SCC) || defined(STARPU_SIMGRID) /* The node does not really matter here */ format_interface = (struct starpu_multiformat_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #endif _starpu_spin_lock(&handle->header_lock); handle->refcnt++; handle->busy_count++; _starpu_spin_unlock(&handle->header_lock); switch(node_kind) { case STARPU_CPU_RAM: case STARPU_SCC_RAM: case STARPU_SCC_SHM: switch (starpu_node_get_kind(handle->mf_node)) { case STARPU_CPU_RAM: case STARPU_SCC_RAM: case STARPU_SCC_SHM: STARPU_ABORT(); #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) case STARPU_CUDA_RAM: { struct starpu_multiformat_data_interface_ops *mf_ops; mf_ops = (struct starpu_multiformat_data_interface_ops *) handle->ops->get_mf_ops(format_interface); conversion_task->cl = mf_ops->cuda_to_cpu_cl; break; } #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) case STARPU_OPENCL_RAM: { struct starpu_multiformat_data_interface_ops *mf_ops; mf_ops = (struct starpu_multiformat_data_interface_ops *) handle->ops->get_mf_ops(format_interface); conversion_task->cl = mf_ops->opencl_to_cpu_cl; break; } #endif #ifdef STARPU_USE_MIC case STARPU_MIC_RAM: { struct starpu_multiformat_data_interface_ops *mf_ops; mf_ops = (struct starpu_multiformat_data_interface_ops *) handle->ops->get_mf_ops(format_interface); conversion_task->cl = mf_ops->mic_to_cpu_cl; break; } #endif default: _STARPU_ERROR("Oops : %u\n", handle->mf_node); } break; #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) case STARPU_CUDA_RAM: { struct starpu_multiformat_data_interface_ops *mf_ops; mf_ops = (struct starpu_multiformat_data_interface_ops *) handle->ops->get_mf_ops(format_interface); conversion_task->cl = mf_ops->cpu_to_cuda_cl; break; } #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) case STARPU_OPENCL_RAM: { struct starpu_multiformat_data_interface_ops *mf_ops; mf_ops = (struct starpu_multiformat_data_interface_ops *) handle->ops->get_mf_ops(format_interface); conversion_task->cl = mf_ops->cpu_to_opencl_cl; break; } #endif #ifdef STARPU_USE_MIC case STARPU_MIC_RAM: { struct starpu_multiformat_data_interface_ops *mf_ops; mf_ops = (struct starpu_multiformat_data_interface_ops *) handle->ops->get_mf_ops(format_interface); conversion_task->cl = mf_ops->cpu_to_mic_cl; break; } #endif default: STARPU_ABORT(); } STARPU_TASK_SET_MODE(conversion_task, STARPU_RW, 0); return conversion_task; } static struct _starpu_sched_ctx* _get_next_sched_ctx_to_pop_into(struct _starpu_worker *worker) { struct _starpu_sched_ctx_list *l = NULL; for (l = worker->sched_ctx_list; l; l = l->next) { if(worker->removed_from_ctx[l->sched_ctx] == 1) { return _starpu_get_sched_ctx_struct(l->sched_ctx); } } unsigned are_2_priorities = 0; for (l = worker->sched_ctx_list; l; l = l->next) { if(l->priority != worker->pop_ctx_priority) { are_2_priorities = 1; break; } } if(!worker->reverse_phase[worker->pop_ctx_priority]) { /* find a context in which the worker hasn't poped yet */ for (l = worker->sched_ctx_list; l; l = l->next) { if(l->priority == worker->pop_ctx_priority) { if(!worker->poped_in_ctx[l->sched_ctx]) { worker->poped_in_ctx[l->sched_ctx] = !worker->poped_in_ctx[l->sched_ctx]; return _starpu_get_sched_ctx_struct(l->sched_ctx); } } } worker->reverse_phase[worker->pop_ctx_priority] = !worker->reverse_phase[worker->pop_ctx_priority]; if(are_2_priorities) worker->pop_ctx_priority = !worker->pop_ctx_priority; } are_2_priorities = 0; if(worker->reverse_phase[worker->pop_ctx_priority]) { /* if the context has already poped in every one start from the begining */ for (l = worker->sched_ctx_list; l; l = l->next) { if(l->priority == worker->pop_ctx_priority) { if(worker->poped_in_ctx[l->sched_ctx]) { worker->poped_in_ctx[l->sched_ctx] = !worker->poped_in_ctx[l->sched_ctx]; return _starpu_get_sched_ctx_struct(l->sched_ctx); } } } worker->reverse_phase[worker->pop_ctx_priority] = !worker->reverse_phase[worker->pop_ctx_priority]; if(are_2_priorities) worker->pop_ctx_priority = !worker->pop_ctx_priority; } unsigned first_sched_ctx = STARPU_NMAX_SCHED_CTXS; for (l = worker->sched_ctx_list; l; l = l->next) { if(l->priority == worker->pop_ctx_priority) { first_sched_ctx = l->sched_ctx; break; } } // if(worker->pop_ctx_priority == 0 && first_sched_ctx == STARPU_NMAX_SCHED_CTXS) if(first_sched_ctx == STARPU_NMAX_SCHED_CTXS) first_sched_ctx = worker->sched_ctx_list->sched_ctx; worker->poped_in_ctx[first_sched_ctx] = !worker->poped_in_ctx[first_sched_ctx]; return _starpu_get_sched_ctx_struct(first_sched_ctx); } struct starpu_task *_starpu_pop_task(struct _starpu_worker *worker) { struct starpu_task *task; int worker_id; unsigned node; /* We can't tell in advance which task will be picked up, so we measure * a timestamp, and will attribute it afterwards to the task. */ int profiling = starpu_profiling_status_get(); struct timespec pop_start_time; if (profiling) _starpu_clock_gettime(&pop_start_time); pick: /* perhaps there is some local task to be executed first */ task = _starpu_pop_local_task(worker); if (task) _STARPU_TASK_BREAK_ON(task, pop); /* get tasks from the stacks of the strategy */ if(!task) { struct _starpu_sched_ctx *sched_ctx ; #ifndef STARPU_NON_BLOCKING_DRIVERS int been_here[STARPU_NMAX_SCHED_CTXS]; int i; for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++) been_here[i] = 0; while(!task) #endif { if(worker->nsched_ctxs == 1) sched_ctx = _starpu_get_initial_sched_ctx(); else { while(1) { sched_ctx = _get_next_sched_ctx_to_pop_into(worker); if(worker->removed_from_ctx[sched_ctx->id] == 1 && worker->shares_tasks_lists[sched_ctx->id] == 1) { _starpu_worker_gets_out_of_ctx(sched_ctx->id, worker); worker->removed_from_ctx[sched_ctx->id] = 0; sched_ctx = NULL; } else break; } } if(sched_ctx && sched_ctx->id != STARPU_NMAX_SCHED_CTXS) { if (sched_ctx->sched_policy && sched_ctx->sched_policy->pop_task) { task = sched_ctx->sched_policy->pop_task(sched_ctx->id); if (task) _STARPU_TASK_BREAK_ON(task, pop); _starpu_pop_task_end(task); } } if(!task) { /* it doesn't matter if it shares tasks list or not in the scheduler, if it does not have any task to pop just get it out of here */ /* however if it shares a task list it will be removed as soon as he finishes this job (in handle_job_termination) */ if(worker->removed_from_ctx[sched_ctx->id]) { _starpu_worker_gets_out_of_ctx(sched_ctx->id, worker); worker->removed_from_ctx[sched_ctx->id] = 0; } #ifdef STARPU_USE_SC_HYPERVISOR if(worker->pop_ctx_priority) { struct starpu_sched_ctx_performance_counters *perf_counters = sched_ctx->perf_counters; if(sched_ctx->id != 0 && perf_counters != NULL && perf_counters->notify_idle_cycle && _starpu_sched_ctx_allow_hypervisor(sched_ctx->id)) { // _STARPU_TRACE_HYPERVISOR_BEGIN(); perf_counters->notify_idle_cycle(sched_ctx->id, worker->workerid, 1.0); // _STARPU_TRACE_HYPERVISOR_END(); } } #endif //STARPU_USE_SC_HYPERVISOR #ifndef STARPU_NON_BLOCKING_DRIVERS if(been_here[sched_ctx->id] || worker->nsched_ctxs == 1) break; been_here[sched_ctx->id] = 1; #endif } } } if (!task) { if (starpu_idle_file) idle_start[worker->workerid] = starpu_timing_now(); return NULL; } if(starpu_idle_file && idle_start[worker->workerid] != 0.0) { double idle_end = starpu_timing_now(); idle[worker->workerid] += (idle_end - idle_start[worker->workerid]); idle_start[worker->workerid] = 0.0; } #ifdef STARPU_USE_SC_HYPERVISOR struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(task->sched_ctx); struct starpu_sched_ctx_performance_counters *perf_counters = sched_ctx->perf_counters; if(sched_ctx->id != 0 && perf_counters != NULL && perf_counters->notify_poped_task && _starpu_sched_ctx_allow_hypervisor(sched_ctx->id)) { // _STARPU_TRACE_HYPERVISOR_BEGIN(); perf_counters->notify_poped_task(task->sched_ctx, worker->workerid); // _STARPU_TRACE_HYPERVISOR_END(); } #endif //STARPU_USE_SC_HYPERVISOR /* Make sure we do not bother with all the multiformat-specific code if * it is not necessary. */ if (!_starpu_task_uses_multiformat_handles(task)) goto profiling; /* This is either a conversion task, or a regular task for which the * conversion tasks have already been created and submitted */ if (task->mf_skip) goto profiling; /* * This worker may not be able to execute this task. In this case, we * should return the task anyway. It will be pushed back almost immediatly. * This way, we avoid computing and executing the conversions tasks. * Here, we do not care about what implementation is used. */ worker_id = starpu_worker_get_id(); if (!starpu_worker_can_execute_task_first_impl(worker_id, task, NULL)) return task; node = starpu_worker_get_memory_node(worker_id); /* * We do have a task that uses multiformat handles. Let's create the * required conversion tasks. */ STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); unsigned i; unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); for (i = 0; i < nbuffers; i++) { struct starpu_task *conversion_task; starpu_data_handle_t handle; handle = STARPU_TASK_GET_HANDLE(task, i); if (!_starpu_handle_needs_conversion_task(handle, node)) continue; conversion_task = _starpu_create_conversion_task(handle, node); conversion_task->mf_skip = 1; conversion_task->execute_on_a_specific_worker = 1; conversion_task->workerid = worker_id; /* * Next tasks will need to know where these handles have gone. */ handle->mf_node = node; _starpu_task_submit_conversion_task(conversion_task, worker_id); } task->mf_skip = 1; starpu_task_list_push_back(&worker->local_tasks, task); STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); goto pick; profiling: if (profiling) { struct starpu_profiling_task_info *profiling_info; profiling_info = task->profiling_info; /* The task may have been created before profiling was enabled, * so we check if the profiling_info structure is available * even though we already tested if profiling is enabled. */ if (profiling_info) { memcpy(&profiling_info->pop_start_time, &pop_start_time, sizeof(struct timespec)); _starpu_clock_gettime(&profiling_info->pop_end_time); } } if(task->prologue_callback_pop_func) task->prologue_callback_pop_func(task->prologue_callback_pop_arg); return task; } struct starpu_task *_starpu_pop_every_task(struct _starpu_sched_ctx *sched_ctx) { struct starpu_task *task = NULL; if(sched_ctx->sched_policy) { STARPU_ASSERT(sched_ctx->sched_policy->pop_every_task); /* TODO set profiling info */ if(sched_ctx->sched_policy->pop_every_task) { _STARPU_TRACE_WORKER_SCHEDULING_PUSH; task = sched_ctx->sched_policy->pop_every_task(sched_ctx->id); _STARPU_TRACE_WORKER_SCHEDULING_POP; } } return task; } void _starpu_sched_pre_exec_hook(struct starpu_task *task) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(task->sched_ctx); if (sched_ctx->sched_policy && sched_ctx->sched_policy->pre_exec_hook) { _STARPU_TRACE_WORKER_SCHEDULING_PUSH; sched_ctx->sched_policy->pre_exec_hook(task); _STARPU_TRACE_WORKER_SCHEDULING_POP; } } void _starpu_sched_post_exec_hook(struct starpu_task *task) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(task->sched_ctx); if (sched_ctx->sched_policy && sched_ctx->sched_policy->post_exec_hook) { _STARPU_TRACE_WORKER_SCHEDULING_PUSH; sched_ctx->sched_policy->post_exec_hook(task); _STARPU_TRACE_WORKER_SCHEDULING_POP; } } void _starpu_wait_on_sched_event(void) { struct _starpu_worker *worker = _starpu_get_local_worker_key(); STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); _starpu_handle_all_pending_node_data_requests(worker->memory_node); if (_starpu_machine_is_running()) { #ifndef STARPU_NON_BLOCKING_DRIVERS STARPU_PTHREAD_COND_WAIT(&worker->sched_cond, &worker->sched_mutex); #endif } STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); } /* The scheduling policy may put tasks directly into a worker's local queue so * that it is not always necessary to create its own queue when the local queue * is sufficient. If "back" not null, the task is put at the back of the queue * where the worker will pop tasks first. Setting "back" to 0 therefore ensures * a FIFO ordering. */ int starpu_push_local_task(int workerid, struct starpu_task *task, int prio) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); return _starpu_push_local_task(worker, task, prio); } void _starpu_print_idle_time() { if(!starpu_idle_file) return; double all_idle = 0.0; int i = 0; for(i = 0; i < STARPU_NMAXWORKERS; i++) all_idle += idle[i]; FILE *f; f = fopen(starpu_idle_file, "a"); if (!f) { _STARPU_MSG("couldn't open %s: %s\n", starpu_idle_file, strerror(errno)); } else { fprintf(f, "%lf \n", all_idle); fclose(f); } } starpu-1.2.3+dfsg/src/core/sched_policy.h000066400000000000000000000112371320135501600203070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2013, 2015-2017 Université de Bordeaux * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __SCHED_POLICY_H__ #define __SCHED_POLICY_H__ #include #include #include #include #include void _starpu_sched_init(void); struct starpu_machine_config; struct starpu_sched_policy *_starpu_get_sched_policy( struct _starpu_sched_ctx *sched_ctx); void _starpu_init_sched_policy(struct _starpu_machine_config *config, struct _starpu_sched_ctx *sched_ctx, struct starpu_sched_policy *policy); void _starpu_deinit_sched_policy(struct _starpu_sched_ctx *sched_ctx); struct starpu_sched_policy *_starpu_select_sched_policy(struct _starpu_machine_config *config, const char *required_policy); void _starpu_sched_task_submit(struct starpu_task *task); void _starpu_sched_do_schedule(unsigned sched_ctx_id); int _starpu_push_task(struct _starpu_job *task); int _starpu_repush_task(struct _starpu_job *task); /* actually pushes the tasks to the specific worker or to the scheduler */ int _starpu_push_task_to_workers(struct starpu_task *task); /* pop a task that can be executed on the worker */ struct starpu_task *_starpu_pop_task(struct _starpu_worker *worker); /* pop every task that can be executed on the worker */ struct starpu_task *_starpu_pop_every_task(struct _starpu_sched_ctx *sched_ctx); void _starpu_sched_post_exec_hook(struct starpu_task *task); int _starpu_pop_task_end(struct starpu_task *task); void _starpu_wait_on_sched_event(void); struct starpu_task *_starpu_create_conversion_task(starpu_data_handle_t handle, unsigned int node) STARPU_ATTRIBUTE_MALLOC; struct starpu_task *_starpu_create_conversion_task_for_arch(starpu_data_handle_t handle, enum starpu_node_kind node_kind) STARPU_ATTRIBUTE_MALLOC; void _starpu_sched_pre_exec_hook(struct starpu_task *task); void _starpu_print_idle_time(); /* * Predefined policies */ extern struct starpu_sched_policy _starpu_sched_lws_policy; extern struct starpu_sched_policy _starpu_sched_ws_policy; extern struct starpu_sched_policy _starpu_sched_prio_policy; extern struct starpu_sched_policy _starpu_sched_random_policy; extern struct starpu_sched_policy _starpu_sched_dm_policy; extern struct starpu_sched_policy _starpu_sched_dmda_policy; extern struct starpu_sched_policy _starpu_sched_dmda_ready_policy; extern struct starpu_sched_policy _starpu_sched_dmda_sorted_policy; extern struct starpu_sched_policy _starpu_sched_dmda_sorted_decision_policy; extern struct starpu_sched_policy _starpu_sched_eager_policy; extern struct starpu_sched_policy _starpu_sched_parallel_heft_policy; extern struct starpu_sched_policy _starpu_sched_peager_policy; extern struct starpu_sched_policy _starpu_sched_modular_eager_policy; extern struct starpu_sched_policy _starpu_sched_modular_eager_prefetching_policy; extern struct starpu_sched_policy _starpu_sched_modular_prio_policy; extern struct starpu_sched_policy _starpu_sched_modular_prio_prefetching_policy; extern struct starpu_sched_policy _starpu_sched_modular_random_policy; extern struct starpu_sched_policy _starpu_sched_modular_random_prio_policy; extern struct starpu_sched_policy _starpu_sched_modular_random_prefetching_policy; extern struct starpu_sched_policy _starpu_sched_modular_random_prio_prefetching_policy; //extern struct starpu_sched_policy _starpu_sched_modular_ws_policy; extern struct starpu_sched_policy _starpu_sched_modular_heft_policy; extern struct starpu_sched_policy _starpu_sched_modular_heft_prio_policy; extern struct starpu_sched_policy _starpu_sched_modular_heft2_policy; extern struct starpu_sched_policy _starpu_sched_graph_test_policy; extern long _starpu_task_break_on_push; extern long _starpu_task_break_on_sched; extern long _starpu_task_break_on_pop; extern long _starpu_task_break_on_exec; #ifdef SIGTRAP #define _STARPU_TASK_BREAK_ON(task, what) do { \ if (_starpu_get_job_associated_to_task(task)->job_id == (unsigned long) _starpu_task_break_on_##what) \ raise(SIGTRAP); \ } while(0) #else #define _STARPU_TASK_BREAK_ON(task, what) ((void) 0) #endif #endif // __SCHED_POLICY_H__ starpu-1.2.3+dfsg/src/core/simgrid.c000066400000000000000000000535371320135501600173040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2017 Université de Bordeaux * Copyright (C) 2016 Inria * Copyright (C) 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include #include #ifdef STARPU_SIMGRID #include #include #pragma weak starpu_main extern int starpu_main(int argc, char *argv[]); #pragma weak smpi_main extern int smpi_main(int (*realmain) (int argc, char *argv[]), int argc, char *argv[]); #pragma weak _starpu_mpi_simgrid_init extern int _starpu_mpi_simgrid_init(int argc, char *argv[]); static int simgrid_started; /* In case the MPI application didn't use smpicc to build the file containing * main(), try to cope by calling starpu_main */ int _starpu_smpi_simulated_main_(int argc, char *argv[]) { if (!starpu_main) { _STARPU_ERROR("In simgrid mode, the file containing the main() function of this application needs to be compiled with starpu.h or starpu_simgrid_wrap.h included, to properly rename it into starpu_main\n"); exit(EXIT_FAILURE); } return starpu_main(argc, argv); } int smpi_simulated_main_(int argc, char *argv[]) __attribute__((weak, alias("_starpu_smpi_simulated_main_"))); #ifdef HAVE_MSG_ZONE_GET_BY_NAME #define HAVE_STARPU_SIMGRID_GET_AS_BY_NAME msg_as_t _starpu_simgrid_get_as_by_name(const char *name) { return MSG_zone_get_by_name(name); } #elif defined(HAVE_MSG_GET_AS_BY_NAME) #define HAVE_STARPU_SIMGRID_GET_AS_BY_NAME msg_as_t _starpu_simgrid_get_as_by_name(const char *name) { return MSG_get_as_by_name(name); } #elif defined(HAVE_MSG_ENVIRONMENT_GET_ROUTING_ROOT) #define HAVE_STARPU_SIMGRID_GET_AS_BY_NAME static msg_as_t __starpu_simgrid_get_as_by_name(msg_as_t root, const char *name) { xbt_dict_t dict; xbt_dict_cursor_t cursor; const char *key; msg_as_t as, ret; dict = MSG_environment_as_get_routing_sons(root); xbt_dict_foreach(dict, cursor, key, as) { if (!strcmp(MSG_environment_as_get_name(as), name)) return as; ret = __starpu_simgrid_get_as_by_name(as, name); if (ret) return ret; } return NULL; } msg_as_t _starpu_simgrid_get_as_by_name(const char *name) { return __starpu_simgrid_get_as_by_name(MSG_environment_get_routing_root(), name); } #endif /* HAVE_MSG_ENVIRONMENT_GET_ROUTING_ROOT */ int _starpu_simgrid_get_nbhosts(const char *prefix) { int ret; xbt_dynar_t hosts; unsigned i, nb; unsigned len = strlen(prefix); if (_starpu_simgrid_running_smpi()) { #ifdef HAVE_STARPU_SIMGRID_GET_AS_BY_NAME char new_prefix[32]; char name[32]; STARPU_ASSERT(starpu_mpi_world_rank); snprintf(name, sizeof(name), STARPU_MPI_AS_PREFIX"%d", starpu_mpi_world_rank()); #ifdef HAVE_MSG_ZONE_GET_HOSTS hosts = xbt_dynar_new(sizeof(sg_host_t), NULL); MSG_zone_get_hosts(_starpu_simgrid_get_as_by_name(name), hosts); #else hosts = MSG_environment_as_get_hosts(_starpu_simgrid_get_as_by_name(name)); #endif snprintf(new_prefix, sizeof(new_prefix), "%s-%s", name, prefix); prefix = new_prefix; len = strlen(prefix); #else STARPU_ABORT_MSG("can not continue without an implementation for _starpu_simgrid_get_as_by_name"); #endif /* HAVE_STARPU_SIMGRID_GET_AS_BY_NAME */ } else hosts = MSG_hosts_as_dynar(); nb = xbt_dynar_length(hosts); ret = 0; for (i = 0; i < nb; i++) { const char *name; name = MSG_host_get_name(xbt_dynar_get_as(hosts, i, msg_host_t)); if (!strncmp(name, prefix, len)) ret++; } xbt_dynar_free(&hosts); return ret; } unsigned long long _starpu_simgrid_get_memsize(const char *prefix, unsigned devid) { char name[32]; msg_host_t host; const char *memsize; snprintf(name, sizeof(name), "%s%u", prefix, devid); host = _starpu_simgrid_get_host_by_name(name); if (!host) return 0; if (!MSG_host_get_properties(host)) return 0; memsize = MSG_host_get_property_value(host, "memsize"); if (!memsize) return 0; return atoll(memsize); } msg_host_t _starpu_simgrid_get_host_by_name(const char *name) { if (_starpu_simgrid_running_smpi()) { char mpiname[32]; STARPU_ASSERT(starpu_mpi_world_rank); snprintf(mpiname, sizeof(mpiname), STARPU_MPI_AS_PREFIX"%d-%s", starpu_mpi_world_rank(), name); return MSG_get_host_by_name(mpiname); } else return MSG_get_host_by_name(name); } msg_host_t _starpu_simgrid_get_host_by_worker(struct _starpu_worker *worker) { char *prefix; char name[16]; msg_host_t host; switch (worker->arch) { case STARPU_CPU_WORKER: prefix = "CPU"; break; case STARPU_CUDA_WORKER: prefix = "CUDA"; break; case STARPU_OPENCL_WORKER: prefix = "OpenCL"; break; default: STARPU_ASSERT(0); } snprintf(name, sizeof(name), "%s%u", prefix, worker->devid); host = _starpu_simgrid_get_host_by_name(name); STARPU_ASSERT_MSG(host, "Could not find host %s!", name); return host; } static void start_simgrid(int *argc, char **argv) { char path[256]; simgrid_started = 1; if (!starpu_main && !(smpi_main && smpi_simulated_main_ != _starpu_smpi_simulated_main_)) { _STARPU_ERROR("In simgrid mode, the file containing the main() function of this application needs to be compiled with starpu.h or starpu_simgrid_wrap.h included, to properly rename it into starpu_main\n"); exit(EXIT_FAILURE); } MSG_init(argc, argv); #if SIMGRID_VERSION_MAJOR < 3 || (SIMGRID_VERSION_MAJOR == 3 && SIMGRID_VERSION_MINOR < 9) /* Versions earlier than 3.9 didn't support our communication tasks */ MSG_config("workstation/model", "ptask_L07"); #endif /* Simgrid uses tiny stacks by default. This comes unexpected to our users. */ unsigned stack_size = 8192; struct rlimit rlim; if (getrlimit(RLIMIT_STACK, &rlim) == 0 && rlim.rlim_cur != 0 && rlim.rlim_cur != RLIM_INFINITY) stack_size = rlim.rlim_cur / 1024; #if SIMGRID_VERSION_MAJOR < 3 || (SIMGRID_VERSION_MAJOR == 3 && SIMGRID_VERSION_MINOR < 13) extern xbt_cfg_t _sg_cfg_set; xbt_cfg_set_int(_sg_cfg_set, "contexts/stack_size", stack_size); #else xbt_cfg_set_int("contexts/stack-size", stack_size); #endif /* Load XML platform */ #if SIMGRID_VERSION_MAJOR < 3 || (SIMGRID_VERSION_MAJOR == 3 && SIMGRID_VERSION_MINOR < 13) _starpu_simgrid_get_platform_path(3, path, sizeof(path)); #else _starpu_simgrid_get_platform_path(4, path, sizeof(path)); #endif MSG_create_environment(path); } static int main_ret; int do_starpu_main(int argc, char *argv[]) { /* FIXME: Ugly work-around for bug in simgrid: the MPI context is not properly set at MSG process startup */ MSG_process_sleep(0.000001); main_ret = starpu_main(argc, argv); return main_ret; } /* We need it only when using smpi */ #pragma weak smpi_process_get_user_data extern void *smpi_process_get_user_data(); #undef main #pragma weak main int main(int argc, char **argv) { if (_starpu_simgrid_running_smpi()) { if (!smpi_process_get_user_data) { fprintf(stderr,"Your version of simgrid does not provide smpi_process_get_user_data, we can not continue without it\n"); exit(1); } /* Oops, we are running SMPI, let it start Simgrid, and we'll * take back hand in _starpu_simgrid_init from starpu_init() */ return smpi_main(_starpu_mpi_simgrid_init, argc, argv); } /* Managed to catch application's main, initialize simgrid first */ start_simgrid(&argc, argv); /* Create a simgrid process for main */ char **argv_cpy; _STARPU_MALLOC(argv_cpy, argc * sizeof(char*)); int i; for (i = 0; i < argc; i++) argv_cpy[i] = strdup(argv[i]); void **tsd; _STARPU_CALLOC(tsd, MAX_TSD+1, sizeof(void*)); MSG_process_create_with_arguments("main", &do_starpu_main, tsd, MSG_get_host_by_name("MAIN"), argc, argv_cpy); /* And run maestro in main thread */ MSG_main(); return main_ret; } static void maestro(void *data STARPU_ATTRIBUTE_UNUSED) { MSG_main(); } void _starpu_simgrid_init(int *argc STARPU_ATTRIBUTE_UNUSED, char ***argv STARPU_ATTRIBUTE_UNUSED) { #ifdef HAVE_MSG_PROCESS_ATTACH if (!simgrid_started && !(smpi_main && smpi_simulated_main_ != _starpu_smpi_simulated_main_)) { _STARPU_DISP("Warning: In simgrid mode, the file containing the main() function of this application should to be compiled with starpu.h or starpu_simgrid_wrap.h included, to properly rename it into starpu_main to avoid having to use --cfg=contexts/factory:thread which reduces performance\n"); #if SIMGRID_VERSION_MAJOR > 3 || (SIMGRID_VERSION_MAJOR == 3 && SIMGRID_VERSION_MINOR >= 14) xbt_cfg_set_string("contexts/factory", "thread"); #endif /* We didn't catch application's main. */ /* Start maestro as a separate thread */ SIMIX_set_maestro(maestro, NULL); /* Initialize simgrid */ start_simgrid(argc, *argv); /* And attach the main thread to the main simgrid process */ void **tsd; _STARPU_CALLOC(tsd, MAX_TSD+1, sizeof(void*)); MSG_process_attach("main", tsd, MSG_get_host_by_name("MAIN"), NULL); simgrid_started = 2; } #endif if (!simgrid_started && !starpu_main && !(smpi_main && smpi_simulated_main_ != _starpu_smpi_simulated_main_)) { _STARPU_ERROR("In simgrid mode, the file containing the main() function of this application needs to be compiled with starpu.h or starpu_simgrid_wrap.h included, to properly rename it into starpu_main\n"); exit(EXIT_FAILURE); } if (_starpu_simgrid_running_smpi()) { #ifdef __PIC__ _STARPU_ERROR("Simgrid currently does not support privatization for dynamically-linked libraries in SMPI. Please reconfigure and build StarPU with --disable-shared"); #endif void **tsd; _STARPU_CALLOC(tsd, MAX_TSD+1, sizeof(void*)); MSG_process_set_data(MSG_process_self(), tsd); } } void _starpu_simgrid_deinit(void) { #ifdef HAVE_MSG_PROCESS_ATTACH if (simgrid_started == 2) { /* Started with MSG_process_attach, now detach */ MSG_process_detach(); simgrid_started = 0; } #endif } /* * Tasks */ struct task { msg_task_t task; int workerid; /* communication termination signalization */ unsigned *finished; starpu_pthread_mutex_t *mutex; starpu_pthread_cond_t *cond; /* Task which waits for this task */ struct task *next; }; static struct task *last_task[STARPU_NMAXWORKERS]; /* Actually execute the task. */ static int task_execute(int argc STARPU_ATTRIBUTE_UNUSED, char *argv[] STARPU_ATTRIBUTE_UNUSED) { /* FIXME: Ugly work-around for bug in simgrid: the MPI context is not properly set at MSG process startup */ MSG_process_sleep(0.000001); struct task *task = starpu_pthread_getspecific(0); _STARPU_DEBUG("task %p started\n", task); MSG_task_execute(task->task); MSG_task_destroy(task->task); _STARPU_DEBUG("task %p finished\n", task); STARPU_PTHREAD_MUTEX_LOCK(task->mutex); *task->finished = 1; STARPU_PTHREAD_COND_BROADCAST(task->cond); STARPU_PTHREAD_MUTEX_UNLOCK(task->mutex); /* The worker which started this task may be sleeping out of tasks, wake it */ starpu_wake_worker(task->workerid); if (last_task[task->workerid] == task) last_task[task->workerid] = NULL; if (task->next) { void **tsd; _STARPU_CALLOC(tsd, MAX_TSD+1, sizeof(void*)); tsd[0] = task->next; MSG_process_create_with_arguments("task", task_execute, tsd, MSG_host_self(), 0, NULL); } /* Task is freed with process context */ return 0; } /* Wait for completion of all asynchronous tasks for this worker */ void _starpu_simgrid_wait_tasks(int workerid) { struct task *task = last_task[workerid]; if (!task) return; unsigned *finished = task->finished; starpu_pthread_mutex_t *mutex = task->mutex; starpu_pthread_cond_t *cond = task->cond; STARPU_PTHREAD_MUTEX_LOCK(mutex); while (!*finished) STARPU_PTHREAD_COND_WAIT(cond, mutex); STARPU_PTHREAD_MUTEX_UNLOCK(mutex); } /* Task execution submitted by StarPU */ void _starpu_simgrid_submit_job(int workerid, struct _starpu_job *j, struct starpu_perfmodel_arch* perf_arch, double length, unsigned *finished, starpu_pthread_mutex_t *mutex, starpu_pthread_cond_t *cond) { struct starpu_task *starpu_task = j->task; msg_task_t simgrid_task; if (j->internal) /* This is not useful to include in simulation (and probably * doesn't have a perfmodel anyway) */ return; if (isnan(length)) { length = starpu_task_expected_length(starpu_task, perf_arch, j->nimpl); STARPU_ASSERT_MSG(!_STARPU_IS_ZERO(length) && !isnan(length), "Codelet %s does not have a perfmodel, or is not calibrated enough, please re-run in non-simgrid mode until it is calibrated", _starpu_job_get_model_name(j)); } simgrid_task = MSG_task_create(_starpu_job_get_task_name(j), #ifdef HAVE_MSG_HOST_GET_SPEED length/1000000.0*MSG_host_get_speed(MSG_host_self()), #else length/1000000.0*MSG_get_host_speed(MSG_host_self()), #endif 0, NULL); if (finished == NULL) { /* Synchronous execution */ /* First wait for previous tasks */ _starpu_simgrid_wait_tasks(workerid); MSG_task_execute(simgrid_task); MSG_task_destroy(simgrid_task); } else { /* Asynchronous execution */ struct task *task; _STARPU_MALLOC(task, sizeof(*task)); task->task = simgrid_task; task->workerid = workerid; task->finished = finished; *finished = 0; task->mutex = mutex; task->cond = cond; task->next = NULL; /* Sleep 10µs for the GPU task queueing */ if (_starpu_simgrid_queue_malloc_cost()) MSG_process_sleep(0.000010); if (last_task[workerid]) { /* Make this task depend on the previous */ last_task[workerid]->next = task; last_task[workerid] = task; } else { void **tsd; last_task[workerid] = task; _STARPU_CALLOC(tsd, MAX_TSD+1, sizeof(void*)); tsd[0] = task; MSG_process_create_with_arguments("task", task_execute, tsd, MSG_host_self(), 0, NULL); } } } /* * Transfers */ /* Note: simgrid is not parallel, so there is no need to hold locks for management of transfers. */ LIST_TYPE(transfer, msg_task_t task; int src_node; int dst_node; int run_node; /* communication termination signalization */ unsigned *finished; starpu_pthread_mutex_t *mutex; starpu_pthread_cond_t *cond; /* transfers which wait for this transfer */ struct transfer **wake; unsigned nwake; /* Number of transfers that this transfer waits for */ unsigned nwait; ) struct transfer_list pending; /* Tell for two transfers whether they should be handled in sequence */ static int transfers_are_sequential(struct transfer *new_transfer, struct transfer *old_transfer) { int new_is_cuda STARPU_ATTRIBUTE_UNUSED, old_is_cuda STARPU_ATTRIBUTE_UNUSED; int new_is_opencl STARPU_ATTRIBUTE_UNUSED, old_is_opencl STARPU_ATTRIBUTE_UNUSED; int new_is_gpu_gpu, old_is_gpu_gpu; new_is_cuda = starpu_node_get_kind(new_transfer->src_node) == STARPU_CUDA_RAM; new_is_cuda |= starpu_node_get_kind(new_transfer->dst_node) == STARPU_CUDA_RAM; old_is_cuda = starpu_node_get_kind(old_transfer->src_node) == STARPU_CUDA_RAM; old_is_cuda |= starpu_node_get_kind(old_transfer->dst_node) == STARPU_CUDA_RAM; new_is_opencl = starpu_node_get_kind(new_transfer->src_node) == STARPU_OPENCL_RAM; new_is_opencl |= starpu_node_get_kind(new_transfer->dst_node) == STARPU_OPENCL_RAM; old_is_opencl = starpu_node_get_kind(old_transfer->src_node) == STARPU_OPENCL_RAM; old_is_opencl |= starpu_node_get_kind(old_transfer->dst_node) == STARPU_OPENCL_RAM; new_is_gpu_gpu = new_transfer->src_node && new_transfer->dst_node; old_is_gpu_gpu = old_transfer->src_node && old_transfer->dst_node; /* We ignore cuda-opencl transfers, they can not happen */ STARPU_ASSERT(!((new_is_cuda && old_is_opencl) || (old_is_cuda && new_is_opencl))); /* The following constraints have been observed with CUDA alone */ /* Same source/destination, sequential */ if (new_transfer->src_node == old_transfer->src_node && new_transfer->dst_node == old_transfer->dst_node) return 1; /* Crossed GPU-GPU, sequential */ if (new_is_gpu_gpu && new_transfer->src_node == old_transfer->dst_node && old_transfer->src_node == new_transfer->dst_node) return 1; /* GPU-GPU transfers are sequential with any RAM->GPU transfer */ if (new_is_gpu_gpu && old_transfer->dst_node == new_transfer->src_node && old_transfer->dst_node == new_transfer->dst_node) return 1; if (old_is_gpu_gpu && new_transfer->dst_node == old_transfer->src_node && new_transfer->dst_node == old_transfer->dst_node) return 1; /* StarPU's constraint on CUDA transfers is using one stream per * source/destination pair, which is already handled above */ return 0; } /* Actually execute the transfer, and then start transfers waiting for this one. */ static int transfer_execute(int argc STARPU_ATTRIBUTE_UNUSED, char *argv[] STARPU_ATTRIBUTE_UNUSED) { /* FIXME: Ugly work-around for bug in simgrid: the MPI context is not properly set at MSG process startup */ MSG_process_sleep(0.000001); struct transfer *transfer = starpu_pthread_getspecific(0); unsigned i; _STARPU_DEBUG("transfer %p started\n", transfer); MSG_task_execute(transfer->task); MSG_task_destroy(transfer->task); _STARPU_DEBUG("transfer %p finished\n", transfer); STARPU_PTHREAD_MUTEX_LOCK(transfer->mutex); *transfer->finished = 1; STARPU_PTHREAD_COND_BROADCAST(transfer->cond); STARPU_PTHREAD_MUTEX_UNLOCK(transfer->mutex); /* The workers which started this request may be sleeping out of tasks, wake it */ _starpu_wake_all_blocked_workers_on_node(transfer->run_node); /* Wake transfers waiting for my termination */ /* Note: due to possible preemption inside process_create, the array * may grow while doing this */ for (i = 0; i < transfer->nwake; i++) { struct transfer *wake = transfer->wake[i]; STARPU_ASSERT(wake->nwait > 0); wake->nwait--; if (!wake->nwait) { void **tsd; _STARPU_DEBUG("triggering transfer %p\n", wake); _STARPU_CALLOC(tsd, MAX_TSD+1, sizeof(void*)); tsd[0] = wake; MSG_process_create_with_arguments("transfer task", transfer_execute, tsd, _starpu_simgrid_get_host_by_name("MAIN"), 0, NULL); } } free(transfer->wake); transfer_list_erase(&pending, transfer); /* transfer is freed with process context */ return 0; } /* Look for sequentialization between this transfer and pending transfers, and submit this one */ static void transfer_submit(struct transfer *transfer) { struct transfer *old; for (old = transfer_list_begin(&pending); old != transfer_list_end(&pending); old = transfer_list_next(old)) { if (transfers_are_sequential(transfer, old)) { _STARPU_DEBUG("transfer %p(%d->%d) waits for %p(%d->%d)\n", transfer, transfer->src_node, transfer->dst_node, old, old->src_node, old->dst_node); /* Make new wait for the old */ transfer->nwait++; /* Make old wake the new */ _STARPU_REALLOC(old->wake, (old->nwake + 1) * sizeof(old->wake)); old->wake[old->nwake] = transfer; old->nwake++; } } transfer_list_push_front(&pending, transfer); if (!transfer->nwait) { void **tsd; _STARPU_DEBUG("transfer %p waits for nobody, starting\n", transfer); _STARPU_CALLOC(tsd, MAX_TSD+1, sizeof(void*)); tsd[0] = transfer; MSG_process_create_with_arguments("transfer task", transfer_execute, tsd, _starpu_simgrid_get_host_by_name("MAIN"), 0, NULL); } } /* Data transfer issued by StarPU */ int _starpu_simgrid_transfer(size_t size, unsigned src_node, unsigned dst_node, struct _starpu_data_request *req) { /* Simgrid does not like 0-bytes transfers */ if (!size) return 0; msg_task_t task; msg_host_t *hosts; double *computation; double *communication; starpu_pthread_mutex_t mutex; starpu_pthread_cond_t cond; unsigned finished; _STARPU_CALLOC(hosts, 2, sizeof(*hosts)); _STARPU_CALLOC(computation, 2, sizeof(*computation)); _STARPU_CALLOC(communication, 4, sizeof(*communication)); hosts[0] = _starpu_simgrid_memory_node_get_host(src_node); hosts[1] = _starpu_simgrid_memory_node_get_host(dst_node); STARPU_ASSERT(hosts[0] != hosts[1]); communication[1] = size; task = MSG_parallel_task_create("copy", 2, hosts, computation, communication, NULL); struct transfer *transfer = transfer_new(); _STARPU_DEBUG("creating transfer %p for %lu bytes\n", transfer, (unsigned long) size); transfer->task = task; transfer->src_node = src_node; transfer->dst_node = dst_node; transfer->run_node = _starpu_memory_node_get_local_key(); if (req) { transfer->finished = &req->async_channel.event.finished; transfer->mutex = &req->async_channel.event.mutex; transfer->cond = &req->async_channel.event.cond; } else { transfer->finished = &finished; transfer->mutex = &mutex; transfer->cond = &cond; } *transfer->finished = 0; STARPU_PTHREAD_MUTEX_INIT(transfer->mutex, NULL); STARPU_PTHREAD_COND_INIT(transfer->cond, NULL); transfer->wake = NULL; transfer->nwake = 0; transfer->nwait = 0; if (req) _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); /* Sleep 10µs for the GPU transfer queueing */ if (_starpu_simgrid_queue_malloc_cost()) MSG_process_sleep(0.000010); transfer_submit(transfer); /* Note: from here, transfer might be already freed */ if (req) { _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); _STARPU_TRACE_DATA_COPY(src_node, dst_node, size); return -EAGAIN; } else { /* this is not associated to a request so it's synchronous */ STARPU_PTHREAD_MUTEX_LOCK(&mutex); while (!finished) STARPU_PTHREAD_COND_WAIT(&cond, &mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); return 0; } } int _starpu_simgrid_thread_start(int argc STARPU_ATTRIBUTE_UNUSED, char *argv[]) { void *(*f)(void*) = (void*) (uintptr_t) strtol(argv[0], NULL, 16); void *arg = (void*) (uintptr_t) strtol(argv[1], NULL, 16); /* FIXME: Ugly work-around for bug in simgrid: the MPI context is not properly set at MSG process startup */ MSG_process_sleep(0.000001); /* _args is freed with process context */ f(arg); return 0; } #endif starpu-1.2.3+dfsg/src/core/simgrid.h000066400000000000000000000046031320135501600172770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __SIMGRID_H__ #define __SIMGRID_H__ #ifdef STARPU_SIMGRID #ifdef STARPU_HAVE_SIMGRID_MSG_H #include #else #include #endif #include struct _starpu_pthread_args { void *(*f)(void*); void *arg; }; #define MAX_TSD 16 #define STARPU_MPI_AS_PREFIX "StarPU-MPI" #define _starpu_simgrid_running_smpi() (getenv("SMPI_GLOBAL_SIZE") != NULL) void _starpu_simgrid_init(int *argc, char ***argv); void _starpu_simgrid_deinit(void); void _starpu_simgrid_wait_tasks(int workerid); void _starpu_simgrid_submit_job(int workerid, struct _starpu_job *job, struct starpu_perfmodel_arch* perf_arch, double length, unsigned *finished, starpu_pthread_mutex_t *mutex, starpu_pthread_cond_t *cond); int _starpu_simgrid_transfer(size_t size, unsigned src_node, unsigned dst_node, struct _starpu_data_request *req); /* Return the number of hosts prefixed by PREFIX */ int _starpu_simgrid_get_nbhosts(const char *prefix); unsigned long long _starpu_simgrid_get_memsize(const char *prefix, unsigned devid); msg_host_t _starpu_simgrid_get_host_by_name(const char *name); struct _starpu_worker; msg_host_t _starpu_simgrid_get_host_by_worker(struct _starpu_worker *worker); void _starpu_simgrid_get_platform_path(int version, char *path, size_t maxlen); msg_as_t _starpu_simgrid_get_as_by_name(const char *name); #pragma weak starpu_mpi_world_rank extern int starpu_mpi_world_rank(void); #pragma weak _starpu_mpi_simgrid_init int _starpu_mpi_simgrid_init(int argc, char *argv[]); #define _starpu_simgrid_cuda_malloc_cost() starpu_get_env_number_default("STARPU_SIMGRID_CUDA_MALLOC_COST", 1) #define _starpu_simgrid_queue_malloc_cost() starpu_get_env_number_default("STARPU_SIMGRID_QUEUE_MALLOC_COST", 1) #endif #endif // __SIMGRID_H__ starpu-1.2.3+dfsg/src/core/task.c000066400000000000000000001101251320135501600165730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2015, 2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2011, 2014, 2016 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef STARPU_HAVE_WINDOWS #include #endif /* XXX this should be reinitialized when StarPU is shutdown (or we should make * sure that no task remains !) */ /* TODO we could make this hierarchical to avoid contention ? */ //static starpu_pthread_cond_t submitted_cond = STARPU_PTHREAD_COND_INITIALIZER; /* This key stores the task currently handled by the thread, note that we * cannot use the worker structure to store that information because it is * possible that we have a task with a NULL codelet, which means its callback * could be executed by a user thread as well. */ static starpu_pthread_key_t current_task_key; static int limit_min_submitted_tasks; static int limit_max_submitted_tasks; static int watchdog_crash; static int watchdog_delay; #define _STARPU_TASK_MAGIC 42 /* Called once at starpu_init */ void _starpu_task_init(void) { STARPU_PTHREAD_KEY_CREATE(¤t_task_key, NULL); limit_min_submitted_tasks = starpu_get_env_number("STARPU_LIMIT_MIN_SUBMITTED_TASKS"); limit_max_submitted_tasks = starpu_get_env_number("STARPU_LIMIT_MAX_SUBMITTED_TASKS"); watchdog_crash = starpu_get_env_number("STARPU_WATCHDOG_CRASH"); watchdog_delay = starpu_get_env_number_default("STARPU_WATCHDOG_DELAY", 0); } void _starpu_task_deinit(void) { STARPU_PTHREAD_KEY_DELETE(current_task_key); } void starpu_task_init(struct starpu_task *task) { /* TODO: memcpy from a template instead? benchmark it */ STARPU_ASSERT(task); /* As most of the fields must be initialised at NULL, let's put 0 * everywhere */ memset(task, 0, sizeof(struct starpu_task)); task->sequential_consistency = 1; /* Now we can initialise fields which recquire custom value */ /* Note: remember to update STARPU_TASK_INITIALIZER as well */ #if STARPU_DEFAULT_PRIO != 0 task->priority = STARPU_DEFAULT_PRIO; #endif task->detach = 1; #if STARPU_TASK_INVALID != 0 task->status = STARPU_TASK_INVALID; #endif task->predicted = NAN; task->predicted_transfer = NAN; task->magic = _STARPU_TASK_MAGIC; task->sched_ctx = STARPU_NMAX_SCHED_CTXS; task->flops = 0.0; task->scheduled = 0; task->prefetched = 0; task->dyn_handles = NULL; task->dyn_interfaces = NULL; task->name = NULL; } /* Free all the ressources allocated for a task, without deallocating the task * structure itself (this is required for statically allocated tasks). * All values previously set by the user, like codelet and handles, remain * unchanged */ void starpu_task_clean(struct starpu_task *task) { STARPU_ASSERT(task); task->magic = 0; /* If a buffer was allocated to store the profiling info, we free it. */ if (task->profiling_info) { free(task->profiling_info); task->profiling_info = NULL; } /* If case the task is (still) part of a bundle */ starpu_task_bundle_t bundle = task->bundle; if (bundle) starpu_task_bundle_remove(bundle, task); if (task->dyn_handles) { free(task->dyn_handles); task->dyn_handles = NULL; free(task->dyn_interfaces); task->dyn_interfaces = NULL; } if (task->dyn_modes) { free(task->dyn_modes); task->dyn_modes = NULL; } struct _starpu_job *j = (struct _starpu_job *)task->starpu_private; if (j) { _starpu_job_destroy(j); task->starpu_private = NULL; } } struct starpu_task * STARPU_ATTRIBUTE_MALLOC starpu_task_create(void) { struct starpu_task *task; _STARPU_MALLOC(task, sizeof(struct starpu_task)); starpu_task_init(task); /* Dynamically allocated tasks are destroyed by default */ task->destroy = 1; return task; } /* Free the ressource allocated during starpu_task_create. This function can be * called automatically after the execution of a task by setting the "destroy" * flag of the starpu_task structure (default behaviour). Calling this function * on a statically allocated task results in an undefined behaviour. */ void _starpu_task_destroy(struct starpu_task *task) { /* If starpu_task_destroy is called in a callback, we just set the destroy flag. The task will be destroyed after the callback returns */ if (task == starpu_task_get_current() && _starpu_get_local_worker_status() == STATUS_CALLBACK) { task->destroy = 1; } else { starpu_task_clean(task); /* TODO handle the case of task with detach = 1 and destroy = 1 */ /* TODO handle the case of non terminated tasks -> return -EINVAL */ /* Does user want StarPU release cl_arg ? */ if (task->cl_arg_free) free(task->cl_arg); /* Does user want StarPU release callback_arg ? */ if (task->callback_arg_free) free(task->callback_arg); /* Does user want StarPU release prologue_callback_arg ? */ if (task->prologue_callback_arg_free) free(task->prologue_callback_arg); /* Does user want StarPU release prologue_pop_arg ? */ if (task->prologue_callback_pop_arg_free) free(task->prologue_callback_pop_arg); free(task); } } void starpu_task_destroy(struct starpu_task *task) { STARPU_ASSERT(task); STARPU_ASSERT_MSG(!task->destroy || !task->detach, "starpu_task_destroy must not be called for task with destroy = 1 and detach = 1"); _starpu_task_destroy(task); } int starpu_task_finished(struct starpu_task *task) { STARPU_ASSERT(task); STARPU_ASSERT_MSG(!task->detach, "starpu_task_finished can only be called on tasks with detach = 0"); return _starpu_job_finished(_starpu_get_job_associated_to_task(task)); } int starpu_task_wait(struct starpu_task *task) { _STARPU_LOG_IN(); STARPU_ASSERT(task); STARPU_ASSERT_MSG(!task->detach, "starpu_task_wait can only be called on tasks with detach = 0"); if (task->detach || task->synchronous) { _STARPU_DEBUG("Task is detached or synchronous. Waiting returns immediately\n"); _STARPU_LOG_OUT_TAG("einval"); return -EINVAL; } STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "starpu_task_wait must not be called from a task or callback"); struct _starpu_job *j = (struct _starpu_job *)task->starpu_private; _STARPU_TRACE_TASK_WAIT_START(j); starpu_do_schedule(); _starpu_wait_job(j); /* as this is a synchronous task, the liberation of the job structure was deferred */ if (task->destroy) _starpu_task_destroy(task); _STARPU_TRACE_TASK_WAIT_END(); _STARPU_LOG_OUT(); return 0; } #ifdef STARPU_OPENMP int _starpu_task_test_termination(struct starpu_task *task) { STARPU_ASSERT(task); STARPU_ASSERT_MSG(!task->detach, "starpu_task_wait can only be called on tasks with detach = 0"); if (task->detach || task->synchronous) { _STARPU_DEBUG("Task is detached or synchronous\n"); _STARPU_LOG_OUT_TAG("einval"); return -EINVAL; } struct _starpu_job *j = (struct _starpu_job *)task->starpu_private; int ret = _starpu_test_job_termination(j); if (ret) { if (task->destroy) _starpu_task_destroy(task); } return ret; } #endif /* NB in case we have a regenerable task, it is possible that the job was * already counted. */ int _starpu_submit_job(struct _starpu_job *j) { struct starpu_task *task = j->task; int ret; #ifdef STARPU_OPENMP const unsigned continuation = j->continuation; #else const unsigned continuation = 0; #endif _STARPU_LOG_IN(); /* notify bound computation of a new task */ _starpu_bound_record(j); _starpu_increment_nsubmitted_tasks_of_sched_ctx(j->task->sched_ctx); _starpu_sched_task_submit(task); #ifdef STARPU_USE_SC_HYPERVISOR struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(j->task->sched_ctx); if(sched_ctx != NULL && j->task->sched_ctx != _starpu_get_initial_sched_ctx()->id && j->task->sched_ctx != STARPU_NMAX_SCHED_CTXS && sched_ctx->perf_counters != NULL) { struct starpu_perfmodel_arch arch; _STARPU_MALLOC(arch.devices, sizeof(struct starpu_perfmodel_device)); arch.ndevices = 1; arch.devices[0].type = STARPU_CPU_WORKER; arch.devices[0].devid = 0; arch.devices[0].ncores = 1; _starpu_compute_buffers_footprint(j->task->cl->model, &arch, 0, j); free(arch.devices); size_t data_size = 0; if (j->task->cl) { unsigned i, nbuffers = STARPU_TASK_GET_NBUFFERS(j->task); for(i = 0; i < nbuffers; i++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, i); if (handle != NULL) data_size += _starpu_data_get_size(handle); } } _STARPU_TRACE_HYPERVISOR_BEGIN(); sched_ctx->perf_counters->notify_submitted_job(j->task, j->footprint, data_size); _STARPU_TRACE_HYPERVISOR_END(); } #endif//STARPU_USE_SC_HYPERVISOR /* We retain handle reference count */ if (task->cl && !continuation) { unsigned i; unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); for (i=0; iheader_lock); handle->busy_count++; _starpu_spin_unlock(&handle->header_lock); } } STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex); _starpu_handle_job_submission(j); #ifdef STARPU_OPENMP if (continuation) { j->discontinuous = 1; j->continuation = 0; } #endif #ifdef STARPU_OPENMP if (continuation) { ret = _starpu_reenforce_task_deps_and_schedule(j); } else #endif { ret = _starpu_enforce_deps_and_schedule(j); } _STARPU_LOG_OUT(); return ret; } /* Note: this is racy, so valgrind would complain. But since we'll always put * the same values, this is not a problem. */ void _starpu_codelet_check_deprecated_fields(struct starpu_codelet *cl) { if (!cl) return; uint32_t where = cl->where; int is_where_unset = where == 0; unsigned i, some_impl; /* Check deprecated and unset fields (where, _func, * _funcs) */ /* CPU */ if (cl->cpu_func && cl->cpu_func != STARPU_MULTIPLE_CPU_IMPLEMENTATIONS && cl->cpu_funcs[0]) { _STARPU_DISP("[warning] [struct starpu_codelet] both cpu_func and cpu_funcs are set. Ignoring cpu_func.\n"); cl->cpu_func = STARPU_MULTIPLE_CPU_IMPLEMENTATIONS; } if (cl->cpu_func && cl->cpu_func != STARPU_MULTIPLE_CPU_IMPLEMENTATIONS) { cl->cpu_funcs[0] = cl->cpu_func; cl->cpu_func = STARPU_MULTIPLE_CPU_IMPLEMENTATIONS; } some_impl = 0; for (i = 0; i < STARPU_MAXIMPLEMENTATIONS; i++) if (cl->cpu_funcs[i]) { some_impl = 1; break; } if (some_impl && cl->cpu_func == 0) { cl->cpu_func = STARPU_MULTIPLE_CPU_IMPLEMENTATIONS; } if (some_impl && is_where_unset) { where |= STARPU_CPU; } /* CUDA */ if (cl->cuda_func && cl->cuda_func != STARPU_MULTIPLE_CUDA_IMPLEMENTATIONS && cl->cuda_funcs[0]) { _STARPU_DISP("[warning] [struct starpu_codelet] both cuda_func and cuda_funcs are set. Ignoring cuda_func.\n"); cl->cuda_func = STARPU_MULTIPLE_CUDA_IMPLEMENTATIONS; } if (cl->cuda_func && cl->cuda_func != STARPU_MULTIPLE_CUDA_IMPLEMENTATIONS) { cl->cuda_funcs[0] = cl->cuda_func; cl->cuda_func = STARPU_MULTIPLE_CUDA_IMPLEMENTATIONS; } some_impl = 0; for (i = 0; i < STARPU_MAXIMPLEMENTATIONS; i++) if (cl->cuda_funcs[i]) { some_impl = 1; break; } if (some_impl && cl->cuda_func == 0) { cl->cuda_func = STARPU_MULTIPLE_CUDA_IMPLEMENTATIONS; } if (some_impl && is_where_unset) { where |= STARPU_CUDA; } /* OpenCL */ if (cl->opencl_func && cl->opencl_func != STARPU_MULTIPLE_OPENCL_IMPLEMENTATIONS && cl->opencl_funcs[0]) { _STARPU_DISP("[warning] [struct starpu_codelet] both opencl_func and opencl_funcs are set. Ignoring opencl_func.\n"); cl->opencl_func = STARPU_MULTIPLE_OPENCL_IMPLEMENTATIONS; } if (cl->opencl_func && cl->opencl_func != STARPU_MULTIPLE_OPENCL_IMPLEMENTATIONS) { cl->opencl_funcs[0] = cl->opencl_func; cl->opencl_func = STARPU_MULTIPLE_OPENCL_IMPLEMENTATIONS; } some_impl = 0; for (i = 0; i < STARPU_MAXIMPLEMENTATIONS; i++) if (cl->opencl_funcs[i]) { some_impl = 1; break; } if (some_impl && cl->opencl_func == 0) { cl->opencl_func = STARPU_MULTIPLE_OPENCL_IMPLEMENTATIONS; } if (some_impl && is_where_unset) { where |= STARPU_OPENCL; } some_impl = 0; for (i = 0; i < STARPU_MAXIMPLEMENTATIONS; i++) if (cl->mic_funcs[i]) { some_impl = 1; break; } if (some_impl && is_where_unset) { where |= STARPU_MIC; } some_impl = 0; for (i = 0; i < STARPU_MAXIMPLEMENTATIONS; i++) if (cl->scc_funcs[i]) { some_impl = 1; break; } if (some_impl && is_where_unset) { where |= STARPU_SCC; } some_impl = 0; for (i = 0; i < STARPU_MAXIMPLEMENTATIONS; i++) if (cl->cpu_funcs_name[i]) { some_impl = 1; break; } if (some_impl && is_where_unset) { where |= STARPU_MIC|STARPU_SCC; } cl->where = where; } void _starpu_task_check_deprecated_fields(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED) { /* None any more */ } static int _starpu_task_submit_head(struct starpu_task *task) { unsigned is_sync = task->synchronous; struct _starpu_job *j = _starpu_get_job_associated_to_task(task); if (j->internal) { // Internal tasks are submitted to initial context task->sched_ctx = _starpu_get_initial_sched_ctx()->id; } else if (task->sched_ctx == STARPU_NMAX_SCHED_CTXS) { // If the task has not specified a context, we set the current context task->sched_ctx = _starpu_sched_ctx_get_current_context(); } if (is_sync) { /* Perhaps it is not possible to submit a synchronous * (blocking) task */ STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "submitting a synchronous task must not be done from a task or a callback"); task->detach = 0; } _starpu_task_check_deprecated_fields(task); _starpu_codelet_check_deprecated_fields(task->cl); if (task->cl) { unsigned i; unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); _STARPU_TRACE_UPDATE_TASK_CNT(0); /* Check buffers */ if (task->dyn_handles == NULL) STARPU_ASSERT_MSG(STARPU_TASK_GET_NBUFFERS(task) <= STARPU_NMAXBUFS, "Codelet %p has too many buffers (%d vs max %d). Either use --enable-maxbuffers configure option to increase the max, or use dyn_handles instead of handles.", task->cl, STARPU_TASK_GET_NBUFFERS(task), STARPU_NMAXBUFS); if (task->dyn_handles) { _STARPU_MALLOC(task->dyn_interfaces, nbuffers * sizeof(void *)); } for (i = 0; i < nbuffers; i++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, i); /* Make sure handles are valid */ STARPU_ASSERT_MSG(handle->magic == _STARPU_TASK_MAGIC, "data %p is invalid (was it already unregistered?)", handle); /* Make sure handles are not partitioned */ STARPU_ASSERT_MSG(handle->nchildren == 0, "only unpartitioned data (or the pieces of a partitioned data) can be used in a task"); /* Provide the home interface for now if any, * for can_execute hooks */ if (handle->home_node != -1) _STARPU_TASK_SET_INTERFACE(task, starpu_data_get_interface_on_node(handle, handle->home_node), i); } /* Check the type of worker(s) required by the task exist */ if (!_starpu_worker_exists(task)) { _STARPU_LOG_OUT_TAG("ENODEV"); return -ENODEV; } /* In case we require that a task should be explicitely * executed on a specific worker, we make sure that the worker * is able to execute this task. */ if (task->execute_on_a_specific_worker && !starpu_combined_worker_can_execute_task(task->workerid, task, 0)) { _STARPU_LOG_OUT_TAG("ENODEV"); return -ENODEV; } if (task->cl->model) _starpu_init_and_load_perfmodel(task->cl->model); if (task->cl->energy_model) _starpu_init_and_load_perfmodel(task->cl->energy_model); } return 0; } /* application should submit new tasks to StarPU through this function */ int starpu_task_submit(struct starpu_task *task) { _STARPU_LOG_IN(); STARPU_ASSERT(task); STARPU_ASSERT_MSG(task->magic == _STARPU_TASK_MAGIC, "Tasks must be created with starpu_task_create, or initialized with starpu_task_init."); int ret; unsigned is_sync = task->synchronous; starpu_task_bundle_t bundle = task->bundle; /* internally, StarPU manipulates a struct _starpu_job * which is a wrapper around a * task structure, it is possible that this job structure was already * allocated. */ struct _starpu_job *j = _starpu_get_job_associated_to_task(task); const unsigned continuation = #ifdef STARPU_OPENMP j->continuation #else 0 #endif ; if (!j->internal) { int nsubmitted_tasks = starpu_task_nsubmitted(); if (limit_max_submitted_tasks >= 0 && limit_max_submitted_tasks < nsubmitted_tasks && limit_min_submitted_tasks >= 0 && limit_min_submitted_tasks < nsubmitted_tasks) { starpu_do_schedule(); _STARPU_TRACE_TASK_THROTTLE_START(); starpu_task_wait_for_n_submitted(limit_min_submitted_tasks); _STARPU_TRACE_TASK_THROTTLE_END(); } } _STARPU_TRACE_TASK_SUBMIT_START(); ret = _starpu_task_submit_head(task); if (ret) { _STARPU_TRACE_TASK_SUBMIT_END(); return ret; } if (!j->internal && !continuation) _STARPU_TRACE_TASK_SUBMIT(j, _starpu_get_sched_ctx_struct(task->sched_ctx)->iterations[0], _starpu_get_sched_ctx_struct(task->sched_ctx)->iterations[1]); /* If this is a continuation, we don't modify the implicit data dependencies detected earlier. */ if (task->cl && !continuation) _starpu_detect_implicit_data_deps(task); if (bundle) { /* We need to make sure that models for other tasks of the * bundle are also loaded, so the scheduler can estimate the * duration of the whole bundle */ STARPU_PTHREAD_MUTEX_LOCK(&bundle->mutex); struct _starpu_task_bundle_entry *entry; entry = bundle->list; while (entry) { if (entry->task->cl->model) _starpu_init_and_load_perfmodel(entry->task->cl->model); if (entry->task->cl->energy_model) _starpu_init_and_load_perfmodel(entry->task->cl->energy_model); entry = entry->next; } STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); } /* If profiling is activated, we allocate a structure to store the * appropriate info. */ struct starpu_profiling_task_info *info; int profiling = starpu_profiling_status_get(); info = _starpu_allocate_profiling_info_if_needed(task); task->profiling_info = info; /* The task is considered as block until we are sure there remains not * dependency. */ task->status = STARPU_TASK_BLOCKED; if (profiling) _starpu_clock_gettime(&info->submit_time); ret = _starpu_submit_job(j); #ifdef STARPU_SIMGRID MSG_process_sleep(0.000001); #endif if (is_sync) { _starpu_sched_do_schedule(task->sched_ctx); _starpu_wait_job(j); if (task->destroy) _starpu_task_destroy(task); } _STARPU_TRACE_TASK_SUBMIT_END(); _STARPU_LOG_OUT(); return ret; } int _starpu_task_submit_internally(struct starpu_task *task) { struct _starpu_job *j = _starpu_get_job_associated_to_task(task); j->internal = 1; return starpu_task_submit(task); } /* application should submit new tasks to StarPU through this function */ int starpu_task_submit_to_ctx(struct starpu_task *task, unsigned sched_ctx_id) { task->sched_ctx = sched_ctx_id; return starpu_task_submit(task); } /* The StarPU core can submit tasks directly to the scheduler or a worker, * skipping dependencies completely (when it knows what it is doing). */ int _starpu_task_submit_nodeps(struct starpu_task *task) { int ret = _starpu_task_submit_head(task); STARPU_ASSERT(ret == 0); struct _starpu_job *j = _starpu_get_job_associated_to_task(task); _starpu_increment_nsubmitted_tasks_of_sched_ctx(j->task->sched_ctx); _starpu_sched_task_submit(task); STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex); _starpu_handle_job_submission(j); _starpu_increment_nready_tasks_of_sched_ctx(j->task->sched_ctx, j->task->flops, j->task); if (task->cl) /* This would be done by data dependencies checking */ _starpu_job_set_ordered_buffers(j); task->status = STARPU_TASK_READY; STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); return _starpu_push_task(j); } /* * worker->sched_mutex must be locked when calling this function. */ int _starpu_task_submit_conversion_task(struct starpu_task *task, unsigned int workerid) { int ret; STARPU_ASSERT(task->cl); STARPU_ASSERT(task->execute_on_a_specific_worker); ret = _starpu_task_submit_head(task); STARPU_ASSERT(ret == 0); /* We retain handle reference count that would have been acquired by data dependencies. */ unsigned i; unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); for (i=0; iheader_lock); handle->busy_count++; _starpu_spin_unlock(&handle->header_lock); } struct _starpu_job *j = _starpu_get_job_associated_to_task(task); _starpu_increment_nsubmitted_tasks_of_sched_ctx(j->task->sched_ctx); _starpu_sched_task_submit(task); STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex); _starpu_handle_job_submission(j); _starpu_increment_nready_tasks_of_sched_ctx(j->task->sched_ctx, j->task->flops, j->task); _starpu_job_set_ordered_buffers(j); task->status = STARPU_TASK_READY; _starpu_profiling_set_task_push_start_time(task); unsigned node = starpu_worker_get_memory_node(workerid); if (starpu_get_prefetch_flag()) starpu_prefetch_task_input_on_node(task, node); struct _starpu_worker *worker; worker = _starpu_get_worker_struct(workerid); starpu_task_list_push_back(&worker->local_tasks, task); _starpu_profiling_set_task_push_end_time(task); STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); return 0; } void starpu_codelet_init(struct starpu_codelet *cl) { memset(cl, 0, sizeof(struct starpu_codelet)); } #define _STARPU_CODELET_WORKER_NAME_LEN 32 void starpu_codelet_display_stats(struct starpu_codelet *cl) { unsigned worker; unsigned nworkers = starpu_worker_get_count(); if (cl->name) fprintf(stderr, "Statistics for codelet %s\n", cl->name); else if (cl->model && cl->model->symbol) fprintf(stderr, "Statistics for codelet %s\n", cl->model->symbol); unsigned long total = 0; for (worker = 0; worker < nworkers; worker++) total += cl->per_worker_stats[worker]; for (worker = 0; worker < nworkers; worker++) { char name[_STARPU_CODELET_WORKER_NAME_LEN]; starpu_worker_get_name(worker, name, _STARPU_CODELET_WORKER_NAME_LEN); fprintf(stderr, "\t%s -> %lu / %lu (%2.2f %%)\n", name, cl->per_worker_stats[worker], total, (100.0f*cl->per_worker_stats[worker])/total); } } /* * We wait for all the tasks that have already been submitted. Note that a * regenerable is not considered finished until it was explicitely set as * non-regenerale anymore (eg. from a callback). */ int _starpu_task_wait_for_all_and_return_nb_waited_tasks(void) { unsigned nsched_ctxs = _starpu_get_nsched_ctxs(); unsigned sched_ctx_id = nsched_ctxs == 1 ? 0 : starpu_sched_ctx_get_context(); /* if there is no indication about which context to wait, we wait for all tasks submitted to starpu */ if (sched_ctx_id == STARPU_NMAX_SCHED_CTXS) { _STARPU_DEBUG("Waiting for all tasks\n"); STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "starpu_task_wait_for_all must not be called from a task or callback"); STARPU_AYU_BARRIER(); struct _starpu_machine_config *config = _starpu_get_machine_config(); if(config->topology.nsched_ctxs == 1) { _starpu_sched_do_schedule(0); return _starpu_task_wait_for_all_in_ctx_and_return_nb_waited_tasks(0); } else { int s; for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++) { if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS) { _starpu_sched_do_schedule(config->sched_ctxs[s].id); } } for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++) { if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS) { starpu_task_wait_for_all_in_ctx(config->sched_ctxs[s].id); } } return 0; } } else { _starpu_sched_do_schedule(sched_ctx_id); _STARPU_DEBUG("Waiting for tasks submitted to context %u\n", sched_ctx_id); return _starpu_task_wait_for_all_in_ctx_and_return_nb_waited_tasks(sched_ctx_id); } } int starpu_task_wait_for_all(void) { _starpu_task_wait_for_all_and_return_nb_waited_tasks(); return 0; } int _starpu_task_wait_for_all_in_ctx_and_return_nb_waited_tasks(unsigned sched_ctx) { _STARPU_TRACE_TASK_WAIT_FOR_ALL_START(); int ret = _starpu_wait_for_all_tasks_of_sched_ctx(sched_ctx); _STARPU_TRACE_TASK_WAIT_FOR_ALL_END(); /* TODO: improve Temanejo into knowing about contexts ... */ STARPU_AYU_BARRIER(); return ret; } int starpu_task_wait_for_all_in_ctx(unsigned sched_ctx) { _starpu_task_wait_for_all_in_ctx_and_return_nb_waited_tasks(sched_ctx); return 0; } /* * We wait until there's a certain number of the tasks that have already been * submitted left. Note that a regenerable is not considered finished until it * was explicitely set as non-regenerale anymore (eg. from a callback). */ int starpu_task_wait_for_n_submitted(unsigned n) { unsigned nsched_ctxs = _starpu_get_nsched_ctxs(); unsigned sched_ctx_id = nsched_ctxs == 1 ? 0 : starpu_sched_ctx_get_context(); /* if there is no indication about which context to wait, we wait for all tasks submitted to starpu */ if (sched_ctx_id == STARPU_NMAX_SCHED_CTXS) { _STARPU_DEBUG("Waiting for all tasks\n"); STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "starpu_task_wait_for_n_submitted must not be called from a task or callback"); struct _starpu_machine_config *config = _starpu_get_machine_config(); if(config->topology.nsched_ctxs == 1) _starpu_wait_for_n_submitted_tasks_of_sched_ctx(0, n); else { int s; for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++) { if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS) { _starpu_wait_for_n_submitted_tasks_of_sched_ctx(config->sched_ctxs[s].id, n); } } } return 0; } else { _STARPU_DEBUG("Waiting for tasks submitted to context %u\n", sched_ctx_id); _starpu_wait_for_n_submitted_tasks_of_sched_ctx(sched_ctx_id, n); } return 0; } int starpu_task_wait_for_n_submitted_in_ctx(unsigned sched_ctx, unsigned n) { _starpu_wait_for_n_submitted_tasks_of_sched_ctx(sched_ctx, n); return 0; } /* * We wait until there is no ready task any more (i.e. StarPU will not be able * to progress any more). */ int starpu_task_wait_for_no_ready(void) { STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "starpu_task_wait_for_no_ready must not be called from a task or callback"); struct _starpu_machine_config *config = _starpu_get_machine_config(); if(config->topology.nsched_ctxs == 1) { _starpu_sched_do_schedule(0); _starpu_wait_for_no_ready_of_sched_ctx(0); } else { int s; for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++) { if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS) { _starpu_sched_do_schedule(config->sched_ctxs[s].id); } } for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++) { if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS) { _starpu_wait_for_no_ready_of_sched_ctx(config->sched_ctxs[s].id); } } } return 0; } void starpu_iteration_push(unsigned long iteration) { struct _starpu_sched_ctx *ctx = _starpu_get_sched_ctx_struct(_starpu_sched_ctx_get_current_context()); unsigned level = ctx->iteration_level++; if (level < sizeof(ctx->iterations)/sizeof(ctx->iterations[0])) ctx->iterations[level] = iteration; } void starpu_iteration_pop(void) { struct _starpu_sched_ctx *ctx = _starpu_get_sched_ctx_struct(_starpu_sched_ctx_get_current_context()); STARPU_ASSERT_MSG(ctx->iteration_level > 0, "calls to starpu_iteration_pop must match starpu_iteration_push calls"); unsigned level = ctx->iteration_level--; if (level < sizeof(ctx->iterations)/sizeof(ctx->iterations[0])) ctx->iterations[level] = -1; } void starpu_do_schedule(void) { struct _starpu_machine_config *config = _starpu_get_machine_config(); if(config->topology.nsched_ctxs == 1) _starpu_sched_do_schedule(0); else { int s; for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++) { if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS) { _starpu_sched_do_schedule(config->sched_ctxs[s].id); } } } } void starpu_drivers_request_termination(void) { struct _starpu_machine_config *config = _starpu_get_machine_config(); STARPU_PTHREAD_MUTEX_LOCK(&config->submitted_mutex); int nsubmitted = starpu_task_nsubmitted(); config->submitting = 0; if (nsubmitted == 0) { ANNOTATE_HAPPENS_AFTER(&config->running); config->running = 0; ANNOTATE_HAPPENS_BEFORE(&config->running); STARPU_WMB(); int s; for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++) { if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS) { _starpu_check_nsubmitted_tasks_of_sched_ctx(config->sched_ctxs[s].id); } } } STARPU_PTHREAD_MUTEX_UNLOCK(&config->submitted_mutex); } int starpu_task_nsubmitted(void) { int nsubmitted = 0; struct _starpu_machine_config *config = _starpu_get_machine_config(); if(config->topology.nsched_ctxs == 1) nsubmitted = _starpu_get_nsubmitted_tasks_of_sched_ctx(0); else { int s; for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++) { if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS) { nsubmitted += _starpu_get_nsubmitted_tasks_of_sched_ctx(config->sched_ctxs[s].id); } } } return nsubmitted; } int starpu_task_nready(void) { int nready = 0; struct _starpu_machine_config *config = _starpu_get_machine_config(); if(config->topology.nsched_ctxs == 1) nready = starpu_sched_ctx_get_nready_tasks(0); else { int s; for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++) { if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS) { nready += starpu_sched_ctx_get_nready_tasks(config->sched_ctxs[s].id); } } } return nready; } /* Return the task currently executed by the worker, or NULL if this is called * either from a thread that is not a task or simply because there is no task * being executed at the moment. */ struct starpu_task *starpu_task_get_current(void) { return (struct starpu_task *) STARPU_PTHREAD_GETSPECIFIC(current_task_key); } void _starpu_set_current_task(struct starpu_task *task) { STARPU_PTHREAD_SETSPECIFIC(current_task_key, task); } #ifdef STARPU_OPENMP /* Prepare the fields of the currentl task for accepting a new set of * dependencies in anticipation of becoming a continuation. * * When the task becomes 'continued', it will only be queued again when the new * set of dependencies is fulfilled. */ void _starpu_task_prepare_for_continuation(void) { _starpu_job_prepare_for_continuation(_starpu_get_job_associated_to_task(starpu_task_get_current())); } void _starpu_task_prepare_for_continuation_ext(unsigned continuation_resubmit, void (*continuation_callback_on_sleep)(void *arg), void *continuation_callback_on_sleep_arg) { _starpu_job_prepare_for_continuation_ext(_starpu_get_job_associated_to_task(starpu_task_get_current()), continuation_resubmit, continuation_callback_on_sleep, continuation_callback_on_sleep_arg); } void _starpu_task_set_omp_cleanup_callback(struct starpu_task *task, void (*omp_cleanup_callback)(void *arg), void *omp_cleanup_callback_arg) { _starpu_job_set_omp_cleanup_callback(_starpu_get_job_associated_to_task(task), omp_cleanup_callback, omp_cleanup_callback_arg); } #endif /* * Returns 0 if tasks does not use any multiformat handle, 1 otherwise. */ int _starpu_task_uses_multiformat_handles(struct starpu_task *task) { unsigned i; unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); for (i = 0; i < nbuffers; i++) { if (_starpu_data_is_multiformat_handle(STARPU_TASK_GET_HANDLE(task, i))) return 1; } return 0; } /* * Checks whether the given handle needs to be converted in order to be used on * the node given as the second argument. */ int _starpu_handle_needs_conversion_task(starpu_data_handle_t handle, unsigned int node) { return _starpu_handle_needs_conversion_task_for_arch(handle, starpu_node_get_kind(node)); } int _starpu_handle_needs_conversion_task_for_arch(starpu_data_handle_t handle, enum starpu_node_kind node_kind) { /* * Here, we assume that CUDA devices and OpenCL devices use the * same data structure. A conversion is only needed when moving * data from a CPU to a GPU, or the other way around. */ switch (node_kind) { case STARPU_CPU_RAM: switch(starpu_node_get_kind(handle->mf_node)) { case STARPU_CPU_RAM: return 0; case STARPU_CUDA_RAM: /* Fall through */ case STARPU_OPENCL_RAM: case STARPU_MIC_RAM: case STARPU_SCC_RAM: return 1; default: STARPU_ABORT(); } break; case STARPU_CUDA_RAM: /* Fall through */ case STARPU_OPENCL_RAM: case STARPU_MIC_RAM: case STARPU_SCC_RAM: switch(starpu_node_get_kind(handle->mf_node)) { case STARPU_CPU_RAM: return 1; case STARPU_CUDA_RAM: case STARPU_OPENCL_RAM: case STARPU_MIC_RAM: case STARPU_SCC_RAM: return 0; default: STARPU_ABORT(); } break; default: STARPU_ABORT(); } /* that instruction should never be reached */ return -EINVAL; } void starpu_task_set_implementation(struct starpu_task *task, unsigned impl) { _starpu_get_job_associated_to_task(task)->nimpl = impl; } unsigned starpu_task_get_implementation(struct starpu_task *task) { return _starpu_get_job_associated_to_task(task)->nimpl; } unsigned long starpu_task_get_job_id(struct starpu_task *task) { return _starpu_get_job_associated_to_task(task)->job_id; } static starpu_pthread_t watchdog_thread; static int sleep_some(float timeout) { /* If we do a sleep(timeout), we might have to wait too long at the end of the computation. */ /* To avoid that, we do several sleep() of 1s (and check after each if starpu is still running) */ float t; for (t = timeout ; t > 1.; t--) { starpu_sleep(1.); if (!_starpu_machine_is_running()) /* Application finished, don't bother finishing the sleep */ return 0; } /* and one final sleep (of less than 1 s) with the rest (if needed) */ if (t > 0.) starpu_sleep(t); return 1; } /* Check from times to times that StarPU does finish some tasks */ static void *watchdog_func(void *arg) { char *timeout_env = arg; float timeout, delay; #ifdef _MSC_VER timeout = ((float) _atoi64(timeout_env)) / 1000000; #else timeout = ((float) atoll(timeout_env)) / 1000000; #endif delay = ((float) watchdog_delay) / 1000000; struct _starpu_machine_config *config = _starpu_get_machine_config(); starpu_pthread_setname("watchdog"); if (!sleep_some(delay)) return NULL; STARPU_PTHREAD_MUTEX_LOCK(&config->submitted_mutex); while (_starpu_machine_is_running()) { int last_nsubmitted = starpu_task_nsubmitted(); config->watchdog_ok = 0; STARPU_PTHREAD_MUTEX_UNLOCK(&config->submitted_mutex); if (!sleep_some(timeout)) return NULL; STARPU_PTHREAD_MUTEX_LOCK(&config->submitted_mutex); if (!config->watchdog_ok && last_nsubmitted && last_nsubmitted == starpu_task_nsubmitted()) { _STARPU_MSG("The StarPU watchdog detected that no task finished for %fs (can be configured through STARPU_WATCHDOG_TIMEOUT)\n", timeout); if (watchdog_crash) { _STARPU_MSG("Crashing the process\n"); raise(SIGABRT); } else _STARPU_MSG("Set the STARPU_WATCHDOG_CRASH environment variable if you want to abort the process in such a case\n"); } /* Only shout again after another period */ config->watchdog_ok = 1; } STARPU_PTHREAD_MUTEX_UNLOCK(&config->submitted_mutex); return NULL; } void _starpu_watchdog_init(void) { struct _starpu_machine_config *config = _starpu_get_machine_config(); char *timeout_env = starpu_getenv("STARPU_WATCHDOG_TIMEOUT"); STARPU_PTHREAD_MUTEX_INIT(&config->submitted_mutex, NULL); if (!timeout_env) return; STARPU_PTHREAD_CREATE(&watchdog_thread, NULL, watchdog_func, timeout_env); } void _starpu_watchdog_shutdown(void) { char *timeout_env = starpu_getenv("STARPU_WATCHDOG_TIMEOUT"); if (!timeout_env) return; starpu_pthread_join(watchdog_thread, NULL); } starpu-1.2.3+dfsg/src/core/task.h000066400000000000000000000112711320135501600166020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2013, 2015, 2016 CNRS * Copyright (C) 2011, 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __CORE_TASK_H__ #define __CORE_TASK_H__ #include #include #include /* Internal version of starpu_task_destroy: don't check task->destroy flag */ void _starpu_task_destroy(struct starpu_task *task); #ifdef STARPU_OPENMP /* Test for the termination of the task. * Call starpu_task_destroy if required and the task is terminated. */ int _starpu_task_test_termination(struct starpu_task *task); #endif /* A pthread key is used to store the task currently executed on the thread. * _starpu_task_init initializes this pthread key and * _starpu_set_current_task updates its current value. */ void _starpu_task_init(void); void _starpu_task_deinit(void); void _starpu_set_current_task(struct starpu_task *task); /* NB the second argument makes it possible to count regenerable tasks only * once. */ int _starpu_submit_job(struct _starpu_job *j); int _starpu_task_submit_nodeps(struct starpu_task *task); void _starpu_task_declare_deps_array(struct starpu_task *task, unsigned ndeps, struct starpu_task *task_array[], int check); /* Returns the job structure (which is the internal data structure associated * to a task). */ static inline struct _starpu_job *_starpu_get_job_associated_to_task(struct starpu_task *task) { STARPU_ASSERT(task); struct _starpu_job *job = task->starpu_private; if (STARPU_UNLIKELY(!job)) { job = _starpu_job_create(task); task->starpu_private = job; } return job; } /* Submits starpu internal tasks to the initial context */ int _starpu_task_submit_internally(struct starpu_task *task); int _starpu_handle_needs_conversion_task(starpu_data_handle_t handle, unsigned int node); int _starpu_handle_needs_conversion_task_for_arch(starpu_data_handle_t handle, enum starpu_node_kind node_kind); #ifdef STARPU_OPENMP /* Prepare the current task for accepting new dependencies before becoming a continuation. */ void _starpu_task_prepare_for_continuation_ext(unsigned continuation_resubmit, void (*continuation_callback_on_sleep)(void *arg), void *continuation_callback_on_sleep_arg); void _starpu_task_prepare_for_continuation(void); void _starpu_task_set_omp_cleanup_callback(struct starpu_task *task, void (*omp_cleanup_callback)(void *arg), void *omp_cleanup_callback_arg); #endif int _starpu_task_uses_multiformat_handles(struct starpu_task *task); int _starpu_task_submit_conversion_task(struct starpu_task *task, unsigned int workerid); void _starpu_task_check_deprecated_fields(struct starpu_task *task); void _starpu_codelet_check_deprecated_fields(struct starpu_codelet *cl); static inline starpu_cpu_func_t _starpu_task_get_cpu_nth_implementation(struct starpu_codelet *cl, unsigned nimpl) { return cl->cpu_funcs[nimpl]; } static inline starpu_cuda_func_t _starpu_task_get_cuda_nth_implementation(struct starpu_codelet *cl, unsigned nimpl) { return cl->cuda_funcs[nimpl]; } static inline starpu_opencl_func_t _starpu_task_get_opencl_nth_implementation(struct starpu_codelet *cl, unsigned nimpl) { return cl->opencl_funcs[nimpl]; } static inline starpu_mic_func_t _starpu_task_get_mic_nth_implementation(struct starpu_codelet *cl, unsigned nimpl) { return cl->mic_funcs[nimpl]; } static inline starpu_scc_func_t _starpu_task_get_scc_nth_implementation(struct starpu_codelet *cl, unsigned nimpl) { return cl->scc_funcs[nimpl]; } static inline const char *_starpu_task_get_cpu_name_nth_implementation(struct starpu_codelet *cl, unsigned nimpl) { return cl->cpu_funcs_name[nimpl]; } #define _STARPU_TASK_SET_INTERFACE(task, interface, i) do { if (task->dyn_handles) task->dyn_interfaces[i] = interface; else task->interfaces[i] = interface;} while(0) #define _STARPU_TASK_GET_INTERFACES(task) ((task->dyn_handles) ? task->dyn_interfaces : task->interfaces) void _starpu_watchdog_init(void); void _starpu_watchdog_shutdown(void); int _starpu_task_wait_for_all_and_return_nb_waited_tasks(void); int _starpu_task_wait_for_all_in_ctx_and_return_nb_waited_tasks(unsigned sched_ctx); #endif // __CORE_TASK_H__ starpu-1.2.3+dfsg/src/core/task_bundle.c000066400000000000000000000136701320135501600201330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2013 Université de Bordeaux * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include /* Initialize a task bundle */ void starpu_task_bundle_create(starpu_task_bundle_t *bundle) { _STARPU_MALLOC(*bundle, sizeof(struct _starpu_task_bundle)); STARPU_PTHREAD_MUTEX_INIT(&(*bundle)->mutex, NULL); /* Of course at the beginning a bundle is open, * user can insert and remove tasks from it */ (*bundle)->closed = 0; /* Start with an empty list */ (*bundle)->list = NULL; } int starpu_task_bundle_insert(starpu_task_bundle_t bundle, struct starpu_task *task) { STARPU_PTHREAD_MUTEX_LOCK(&bundle->mutex); if (bundle->closed) { /* The bundle is closed, we cannot add task anymore */ STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); return -EPERM; } if (task->status != STARPU_TASK_INVALID) { /* The task has already been submitted, it's too late to put it * into a bundle now. */ STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); return -EINVAL; } /* Insert a task at the end of the bundle */ struct _starpu_task_bundle_entry *entry; _STARPU_MALLOC(entry, sizeof(struct _starpu_task_bundle_entry)); entry->task = task; entry->next = NULL; if (!bundle->list) { bundle->list = entry; } else { struct _starpu_task_bundle_entry *item; item = bundle->list; while (item->next) item = item->next; item->next = entry; } /* Mark the task as belonging the bundle */ task->bundle = bundle; STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); return 0; } int starpu_task_bundle_remove(starpu_task_bundle_t bundle, struct starpu_task *task) { struct _starpu_task_bundle_entry *item; STARPU_PTHREAD_MUTEX_LOCK(&bundle->mutex); item = bundle->list; /* List is empty, there is no way the task * belong to it */ if (!item) { STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); return -ENOENT; } STARPU_ASSERT_MSG(task->bundle == bundle, "Task %p was not in bundle %p, but in bundle %p", task, bundle, task->bundle); task->bundle = NULL; if (item->task == task) { /* Remove the first element */ bundle->list = item->next; free(item); /* If the list is now empty, deinitialize the bundle */ if (bundle->closed && bundle->list == NULL) { STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); _starpu_task_bundle_destroy(bundle); return 0; } STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); return 0; } /* Go through the list until we find the right task, * then we delete it */ while (item->next) { struct _starpu_task_bundle_entry *next; next = item->next; if (next->task == task) { /* Remove the next element */ item->next = next->next; STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); free(next); return 0; } item = next; } STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); /* We could not find the task in the bundle */ return -ENOENT; } /* Close a bundle. No task can be added to a closed bundle. Tasks can still be * removed from a closed bundle. A closed bundle automatically gets * deinitialized when it becomes empty. A closed bundle cannot be reopened. */ void starpu_task_bundle_close(starpu_task_bundle_t bundle) { STARPU_PTHREAD_MUTEX_LOCK(&bundle->mutex); /* If the bundle is already empty, we deinitialize it now as the * user closed it and thus don't intend to insert new tasks in it. */ if (bundle->list == NULL) { STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); _starpu_task_bundle_destroy(bundle); return; } /* Mark the bundle as closed */ bundle->closed = 1; STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); } void _starpu_task_bundle_destroy(starpu_task_bundle_t bundle) { /* Remove all entries from the bundle (which is likely to be empty) */ while (bundle->list) { struct _starpu_task_bundle_entry *entry = bundle->list; bundle->list = bundle->list->next; free(entry); } STARPU_PTHREAD_MUTEX_DESTROY(&bundle->mutex); free(bundle); } void _insertion_handle_sorted(struct _starpu_handle_list **listp, starpu_data_handle_t handle, enum starpu_data_access_mode mode) { STARPU_ASSERT(listp); struct _starpu_handle_list *list = *listp; /* If the list is empty or the handle's address the smallest among the * list, we insert it as first element */ if (!list || list->handle > handle) { struct _starpu_handle_list *link; _STARPU_MALLOC(link, sizeof(struct _starpu_handle_list)); link->handle = handle; link->mode = mode; link->next = list; *listp = link; return; } struct _starpu_handle_list *prev = list; /* Look for the same handle if already present in the list. * Else place it right before the smallest following handle */ while (list && (handle >= list->handle)) { prev = list; list = list->next; } if (prev->handle == handle) { /* The handle is already in the list, the merge both the access modes */ prev->mode = (enum starpu_data_access_mode) ((int) prev->mode | (int) mode); } else { /* The handle was not in the list, we insert it after 'prev', thus right before * 'list' which is the smallest following handle */ struct _starpu_handle_list *link; _STARPU_MALLOC(link, sizeof(struct _starpu_handle_list)); link->handle = handle; link->mode = mode; link->next = prev->next; prev->next = link; } } starpu-1.2.3+dfsg/src/core/task_bundle.h000066400000000000000000000073421320135501600201370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2012 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 CNRS * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __CORE_TASK_BUNDLE_H__ #define __CORE_TASK_BUNDLE_H__ #include /* struct _starpu_task_bundle_entry * ================================ * Purpose * ======= * Structure used to describe a linked list containing tasks in _starpu_task_bundle. * * Fields * ====== * task Pointer to the task structure. * * next Pointer to the next element in the linked list. */ struct _starpu_task_bundle_entry { struct starpu_task *task; struct _starpu_task_bundle_entry *next; }; /* struct _starpu_task_bundle * ========================== * Purpose * ======= * Structure describing a list of tasks that should be scheduled on the same * worker whenever it's possible. * It must be considered as a hint given to the scheduler as there is no guarantee that * they will be executed on the same worker. * * Fields * ====== * mutex Mutex protecting the structure. * * list Array of tasks included in the bundle. * * closed Used to know if the user is still willing to * add/remove some tasks in the bundle. Especially useful for * the runtime to know whether it is safe to destroy a bundle. */ struct _starpu_task_bundle { /* Mutex protecting the bundle */ starpu_pthread_mutex_t mutex; struct _starpu_task_bundle_entry *list; int closed; }; /* struct _starpu_handle_list * ========================== * Purpose * ======= * Structure describing a list of handles sorted by address to speed-up * when looking for an element. * The list cannot containes duplicate handles. * * Fields * ====== * handle Pointer to the handle structure. * * access_mode Total access mode over the whole bundle. * * next Pointer to the next element in the linked list. */ struct _starpu_handle_list { starpu_data_handle_t handle; enum starpu_data_access_mode mode; struct _starpu_handle_list *next; }; /* _starpu_task_bundle_destroy * ========================== * Purpose * ======= * Destroy and deinitialize a bundle, * memory previoulsy allocated is freed. * * Arguments * ========= * bundle (input) * Bundle to destroy. */ void _starpu_task_bundle_destroy(starpu_task_bundle_t bundle); /* _insertion_handle_sorted * ======================== * Purpose * ======= * Insert an handle in a _starpu_handle_list, elements are sorted * in increasing order, considering their physical address. * As the list doesn't accept duplicate elements, a handle with the * same address as an handle contained in the list is not inserted, but * its mode access is merged with the one of the latter. * * Arguments * ========= * listp (input, output) * Pointer to the first element of the list. * In the case of an empty list or an inserted handle with small address, * it should have changed when the call returns. * * handle (input) * Handle to insert in the list. * * mode (input) * Access mode of the handle. */ void _insertion_handle_sorted(struct _starpu_handle_list **listp, starpu_data_handle_t handle, enum starpu_data_access_mode mode); #endif // __CORE_TASK_BUNDLE_H__ starpu-1.2.3+dfsg/src/core/topology.c000066400000000000000000001541661320135501600175220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef STARPU_HAVE_HWLOC #include #ifndef HWLOC_API_VERSION #define HWLOC_OBJ_PU HWLOC_OBJ_PROC #endif #endif #ifdef STARPU_HAVE_WINDOWS #include #endif #ifdef STARPU_SIMGRID #include #endif static unsigned topology_is_initialized = 0; static int nobind; /* For checking whether two workers share the same PU, indexed by PU number */ static int cpu_worker[STARPU_MAXCPUS]; #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) || defined(STARPU_USE_SCC) || defined(STARPU_SIMGRID) struct handle_entry { UT_hash_handle hh; unsigned gpuid; }; # if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) /* Entry in the `devices_using_cuda' hash table. */ static struct handle_entry *devices_using_cuda; # endif static unsigned may_bind_automatically[STARPU_NARCH] = { 0 }; #endif // defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) /* * Discover the topology of the machine */ #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) || defined(STARPU_USE_SCC) || defined(STARPU_SIMGRID) static void _starpu_initialize_workers_deviceid (int *explicit_workers_gpuid, int *current, int *workers_gpuid, const char *varname, unsigned nhwgpus, enum starpu_worker_archtype type) { char *strval; unsigned i; *current = 0; /* conf->workers_gpuid indicates the successive GPU identifier that * should be used to bind the workers. It should be either filled * according to the user's explicit parameters (from starpu_conf) or * according to the STARPU_WORKERS_CUDAID env. variable. Otherwise, a * round-robin policy is used to distributed the workers over the * cores. */ /* what do we use, explicit value, env. variable, or round-robin ? */ strval = starpu_getenv(varname); if (strval) { /* STARPU_WORKERS_CUDAID certainly contains less entries than * STARPU_NMAXWORKERS, so we reuse its entries in a round * robin fashion: "1 2" is equivalent to "1 2 1 2 1 2 .... 1 * 2". */ unsigned wrap = 0; unsigned number_of_entries = 0; char *endptr; /* we use the content of the STARPU_WORKERS_CUDAID * env. variable */ for (i = 0; i < STARPU_NMAXWORKERS; i++) { if (!wrap) { long int val; val = strtol(strval, &endptr, 10); if (endptr != strval) { workers_gpuid[i] = (unsigned)val; strval = endptr; } else { /* there must be at least one entry */ STARPU_ASSERT(i != 0); number_of_entries = i; /* there is no more values in the * string */ wrap = 1; workers_gpuid[i] = workers_gpuid[0]; } } else { workers_gpuid[i] = workers_gpuid[i % number_of_entries]; } } } else if (explicit_workers_gpuid) { /* we use the explicit value from the user */ memcpy(workers_gpuid, explicit_workers_gpuid, STARPU_NMAXWORKERS*sizeof(unsigned)); } else { /* by default, we take a round robin policy */ if (nhwgpus > 0) for (i = 0; i < STARPU_NMAXWORKERS; i++) workers_gpuid[i] = (unsigned)(i % nhwgpus); /* StarPU can use sampling techniques to bind threads * correctly */ may_bind_automatically[type] = 1; } } #endif #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) static void _starpu_initialize_workers_cuda_gpuid (struct _starpu_machine_config *config) { struct _starpu_machine_topology *topology = &config->topology; struct starpu_conf *uconf = &config->conf; _starpu_initialize_workers_deviceid ( uconf->use_explicit_workers_cuda_gpuid == 0 ? NULL : (int *)uconf->workers_cuda_gpuid, &(config->current_cuda_gpuid), (int *)topology->workers_cuda_gpuid, "STARPU_WORKERS_CUDAID", topology->nhwcudagpus, STARPU_CUDA_WORKER); } static inline int _starpu_get_next_cuda_gpuid (struct _starpu_machine_config *config) { unsigned i = ((config->current_cuda_gpuid++) % config->topology.ncudagpus); return (int)config->topology.workers_cuda_gpuid[i]; } #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) static void _starpu_initialize_workers_opencl_gpuid (struct _starpu_machine_config*config) { struct _starpu_machine_topology *topology = &config->topology; struct starpu_conf *uconf = &config->conf; _starpu_initialize_workers_deviceid( uconf->use_explicit_workers_opencl_gpuid == 0 ? NULL : (int *)uconf->workers_opencl_gpuid, &(config->current_opencl_gpuid), (int *)topology->workers_opencl_gpuid, "STARPU_WORKERS_OPENCLID", topology->nhwopenclgpus, STARPU_OPENCL_WORKER); #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) // Detect devices which are already used with CUDA { unsigned tmp[STARPU_NMAXWORKERS]; unsigned nb=0; int i; for(i=0 ; itopology.workers_opencl_gpuid[i]; HASH_FIND_INT(devices_using_cuda, &devid, entry); if (entry == NULL) { tmp[nb] = topology->workers_opencl_gpuid[i]; nb++; } } for (i=nb ; iworkers_opencl_gpuid, tmp, sizeof(unsigned)*STARPU_NMAXWORKERS); } #endif /* STARPU_USE_CUDA */ { // Detect identical devices struct handle_entry *devices_already_used = NULL; unsigned tmp[STARPU_NMAXWORKERS]; unsigned nb=0; int i; for(i=0 ; iworkers_opencl_gpuid[i]; struct handle_entry *entry; HASH_FIND_INT(devices_already_used, &devid, entry); if (entry == NULL) { struct handle_entry *entry2; _STARPU_MALLOC(entry2, sizeof(*entry2)); entry2->gpuid = devid; HASH_ADD_INT(devices_already_used, gpuid, entry2); tmp[nb] = devid; nb ++; } } struct handle_entry *entry, *tempo; HASH_ITER(hh, devices_already_used, entry, tempo) { HASH_DEL(devices_already_used, entry); free(entry); } for (i=nb ; iworkers_opencl_gpuid, tmp, sizeof(unsigned)*STARPU_NMAXWORKERS); } } static inline int _starpu_get_next_opencl_gpuid (struct _starpu_machine_config *config) { unsigned i = ((config->current_opencl_gpuid++) % config->topology.nopenclgpus); return (int)config->topology.workers_opencl_gpuid[i]; } #endif #if 0 #if defined(STARPU_USE_MIC) || defined(STARPU_SIMGRID) static void _starpu_initialize_workers_mic_deviceid(struct _starpu_machine_config *config) { struct _starpu_machine_topology *topology = &config->topology; struct starpu_conf *uconf = &config->conf; _starpu_initialize_workers_deviceid( uconf->use_explicit_workers_mic_deviceid == 0 ? NULL : (int *)config->user_conf->workers_mic_deviceid, &(config->current_mic_deviceid), (int *)topology->workers_mic_deviceid, "STARPU_WORKERS_MICID", topology->nhwmiccores, STARPU_MIC_WORKER); } #endif #endif #ifdef STARPU_USE_SCC static void _starpu_initialize_workers_scc_deviceid(struct _starpu_machine_config *config) { struct _starpu_machine_topology *topology = &config->topology; struct starpu_conf *uconf = &config->conf; _starpu_initialize_workers_deviceid( uconf->use_explicit_workers_scc_deviceid == 0 ? NULL : (int *) uconf->workers_scc_deviceid, &(config->current_scc_deviceid), (int *)topology->workers_scc_deviceid, "STARPU_WORKERS_SCCID", topology->nhwscc, STARPU_SCC_WORKER); } #endif /* STARPU_USE_SCC */ #if 0 #ifdef STARPU_USE_MIC static inline int _starpu_get_next_mic_deviceid(struct _starpu_machine_config *config) { unsigned i = ((config->current_mic_deviceid++) % config->topology.nmicdevices); return (int)config->topology.workers_mic_deviceid[i]; } #endif #endif #ifdef STARPU_USE_SCC static inline int _starpu_get_next_scc_deviceid(struct _starpu_machine_config *config) { unsigned i = ((config->current_scc_deviceid++) % config->topology.nsccdevices); return (int)config->topology.workers_scc_deviceid[i]; } #endif #ifdef STARPU_USE_MIC static void _starpu_init_mic_topology (struct _starpu_machine_config *config, long mic_idx) { /* Discover the topology of the mic node identifier by MIC_IDX. That * means, make this StarPU instance aware of the number of cores available * on this MIC device. Update the `nhwmiccores' topology field * accordingly. */ struct _starpu_machine_topology *topology = &config->topology; int nbcores; _starpu_src_common_sink_nbcores (mic_nodes[mic_idx], &nbcores); topology->nhwmiccores[mic_idx] = nbcores; } static int _starpu_init_mic_node (struct _starpu_machine_config *config, int mic_idx, COIENGINE *coi_handle, COIPROCESS *coi_process) { /* Initialize the MIC node of index MIC_IDX. */ struct starpu_conf *user_conf = &config->conf; char ***argv = _starpu_get_argv(); const char *suffixes[] = {"-mic", "_mic", NULL}; /* Environment variables to send to the Sink, it informs it what kind * of node it is (architecture and type) as there is no way to discover * it itself */ char mic_idx_env[32]; sprintf(mic_idx_env, "_STARPU_MIC_DEVID=%d", mic_idx); /* XXX: this is currently necessary so that the remote process does not * segfault. */ char nb_mic_env[32]; sprintf(nb_mic_env, "_STARPU_MIC_NB=%d", 2); const char *mic_sink_env[] = {"STARPU_SINK=STARPU_MIC", mic_idx_env, nb_mic_env, NULL}; char mic_sink_program_path[1024]; /* Let's get the helper program to run on the MIC device */ int mic_file_found = _starpu_src_common_locate_file (mic_sink_program_path, sizeof(mic_sink_program_path), starpu_getenv("STARPU_MIC_SINK_PROGRAM_NAME"), starpu_getenv("STARPU_MIC_SINK_PROGRAM_PATH"), user_conf->mic_sink_program_path, (argv ? (*argv)[0] : NULL), suffixes); if (0 != mic_file_found) { _STARPU_MSG("No MIC program specified, use the environment\n" "variable STARPU_MIC_SINK_PROGRAM_NAME or the environment\n" "or the field 'starpu_conf.mic_sink_program_path'\n" "to define it.\n"); return -1; } COIRESULT res; /* Let's get the handle which let us manage the remote MIC device */ res = COIEngineGetHandle(COI_ISA_MIC, mic_idx, coi_handle); if (STARPU_UNLIKELY(res != COI_SUCCESS)) STARPU_MIC_SRC_REPORT_COI_ERROR(res); /* We launch the helper on the MIC device, which will wait for us * to give it work to do. * As we will communicate further with the device throught scif we * don't need to keep the process pointer */ res = COIProcessCreateFromFile(*coi_handle, mic_sink_program_path, 0, NULL, 0, mic_sink_env, 1, NULL, 0, NULL, coi_process); if (STARPU_UNLIKELY(res != COI_SUCCESS)) STARPU_MIC_SRC_REPORT_COI_ERROR(res); /* Let's create the node structure, we'll communicate with the peer * through scif thanks to it */ mic_nodes[mic_idx] = _starpu_mp_common_node_create(STARPU_MIC_SOURCE, mic_idx); return 0; } #endif #ifndef STARPU_SIMGRID #ifdef STARPU_HAVE_HWLOC static void _starpu_allocate_topology_userdata(hwloc_obj_t obj) { unsigned i; _STARPU_CALLOC(obj->userdata, 1, sizeof(struct _starpu_hwloc_userdata)); for (i = 0; i < obj->arity; i++) _starpu_allocate_topology_userdata(obj->children[i]); } static void _starpu_deallocate_topology_userdata(hwloc_obj_t obj) { unsigned i; struct _starpu_hwloc_userdata *data = obj->userdata; STARPU_ASSERT(!data->worker_list || data->worker_list == (void*)-1); free(data); for (i = 0; i < obj->arity; i++) _starpu_deallocate_topology_userdata(obj->children[i]); } #endif #endif static void _starpu_init_topology (struct _starpu_machine_config *config) { /* Discover the topology, meaning finding all the available PUs for the compiled drivers. These drivers MUST have been initialized before calling this function. The discovered topology is filled in CONFIG. */ struct _starpu_machine_topology *topology = &config->topology; if (topology_is_initialized) return; nobind = starpu_get_env_number("STARPU_WORKERS_NOBIND"); topology->nhwcpus = 0; topology->nhwpus = 0; #ifndef STARPU_SIMGRID #ifdef STARPU_HAVE_HWLOC hwloc_topology_init(&topology->hwtopology); hwloc_topology_load(topology->hwtopology); _starpu_allocate_topology_userdata(hwloc_get_root_obj(topology->hwtopology)); #endif #endif #ifdef STARPU_SIMGRID config->topology.nhwcpus = config->topology.nhwpus = _starpu_simgrid_get_nbhosts("CPU"); #elif defined(STARPU_HAVE_HWLOC) /* Discover the CPUs relying on the hwloc interface and fills CONFIG * accordingly. */ config->cpu_depth = hwloc_get_type_depth (topology->hwtopology, HWLOC_OBJ_CORE); config->pu_depth = hwloc_get_type_depth (topology->hwtopology, HWLOC_OBJ_PU); /* Would be very odd */ STARPU_ASSERT(config->cpu_depth != HWLOC_TYPE_DEPTH_MULTIPLE); if (config->cpu_depth == HWLOC_TYPE_DEPTH_UNKNOWN) { /* unknown, using logical procesors as fallback */ _STARPU_DISP("Warning: The OS did not report CPU cores. Assuming there is only one hardware thread per core.\n"); config->cpu_depth = hwloc_get_type_depth(topology->hwtopology, HWLOC_OBJ_PU); } topology->nhwcpus = hwloc_get_nbobjs_by_depth (topology->hwtopology, config->cpu_depth); topology->nhwpus = hwloc_get_nbobjs_by_depth (topology->hwtopology, config->pu_depth); #elif defined(HAVE_SYSCONF) /* Discover the CPUs relying on the sysconf(3) function and fills * CONFIG accordingly. */ config->topology.nhwcpus = config->topology.nhwpus = sysconf(_SC_NPROCESSORS_ONLN); #elif defined(_WIN32) /* Discover the CPUs on Cygwin and MinGW systems. */ SYSTEM_INFO sysinfo; GetSystemInfo(&sysinfo); config->topology.nhwcpus = config->topology.nhwpus = sysinfo.dwNumberOfProcessors; #else #warning no way to know number of cores, assuming 1 config->topology.nhwcpus = config->topology.nhwpus = 1; #endif _starpu_cuda_discover_devices(config); _starpu_opencl_discover_devices(config); #ifdef STARPU_USE_SCC config->topology.nhwscc = _starpu_scc_src_get_device_count(); #endif topology_is_initialized = 1; } /* * Bind workers on the different processors */ static void _starpu_initialize_workers_bindid (struct _starpu_machine_config *config) { char *strval; unsigned i; struct _starpu_machine_topology *topology = &config->topology; config->current_bindid = 0; /* conf->workers_bindid indicates the successive logical PU identifier that * should be used to bind the workers. It should be either filled * according to the user's explicit parameters (from starpu_conf) or * according to the STARPU_WORKERS_CPUID env. variable. Otherwise, a * round-robin policy is used to distributed the workers over the * cores. */ /* what do we use, explicit value, env. variable, or round-robin ? */ strval = starpu_getenv("STARPU_WORKERS_CPUID"); if (strval) { /* STARPU_WORKERS_CPUID certainly contains less entries than * STARPU_NMAXWORKERS, so we reuse its entries in a round * robin fashion: "1 2" is equivalent to "1 2 1 2 1 2 .... 1 * 2". */ unsigned wrap = 0; unsigned number_of_entries = 0; char *endptr; /* we use the content of the STARPU_WORKERS_CPUID * env. variable */ for (i = 0; i < STARPU_NMAXWORKERS; i++) { if (!wrap) { long int val; val = strtol(strval, &endptr, 10); if (endptr != strval) { topology->workers_bindid[i] = (unsigned)(val % topology->nhwpus); strval = endptr; if (*strval == '-') { /* range of values */ long int endval; strval++; if (*strval && *strval != ' ' && *strval != ',') { endval = strtol(strval, &endptr, 10); strval = endptr; } else { endval = topology->nhwpus-1; if (*strval) strval++; } for (val++; val <= endval && i < STARPU_NMAXWORKERS-1; val++) { i++; topology->workers_bindid[i] = (unsigned)(val % topology->nhwpus); } } if (*strval == ',') strval++; } else { /* there must be at least one entry */ STARPU_ASSERT(i != 0); number_of_entries = i; /* there is no more values in the * string */ wrap = 1; topology->workers_bindid[i] = topology->workers_bindid[0]; } } else { topology->workers_bindid[i] = topology->workers_bindid[i % number_of_entries]; } } } else if (config->conf.use_explicit_workers_bindid) { /* we use the explicit value from the user */ memcpy(topology->workers_bindid, config->conf.workers_bindid, STARPU_NMAXWORKERS*sizeof(unsigned)); } else { int nth_per_core = starpu_get_env_number_default("STARPU_NTHREADS_PER_CORE", 1); int k; int nbindids=0; int nhyperthreads = topology->nhwpus / topology->nhwcpus; STARPU_ASSERT_MSG(nth_per_core > 0 && nth_per_core <= nhyperthreads , "Incorrect number of hyperthreads"); i = 0; /* PU number currently assigned */ k = 0; /* Number of threads already put on the current core */ while(nbindids < STARPU_NMAXWORKERS) { if (k >= nth_per_core) { /* We have already put enough workers on this * core, skip remaining PUs from this core, and * proceed with next core */ i += nhyperthreads-nth_per_core; k = 0; continue; } /* Add a worker to this core, by using this logical PU */ topology->workers_bindid[nbindids++] = (unsigned)(i % topology->nhwpus); k++; i++; } } for (i = 0; i < STARPU_MAXCPUS;i++) cpu_worker[i] = STARPU_NOWORKERID; /* no binding yet */ memset(&config->currently_bound, 0, sizeof(config->currently_bound)); } /* This function gets the identifier of the next core on which to bind a * worker. In case a list of preferred cores was specified (logical indexes), * we look for a an available core among the list if possible, otherwise a * round-robin policy is used. */ static inline int _starpu_get_next_bindid (struct _starpu_machine_config *config, int *preferred_binding, int npreferred) { struct _starpu_machine_topology *topology = &config->topology; int current_preferred; int nhyperthreads = topology->nhwpus / topology->nhwcpus; unsigned i; if (npreferred) { STARPU_ASSERT_MSG(preferred_binding, "Passing NULL pointer for parameter preferred_binding with a non-0 value of parameter npreferred"); } /* loop over the preference list */ for (current_preferred = 0; current_preferred < npreferred; current_preferred++) { /* Try to get this core */ unsigned requested_core = preferred_binding[current_preferred]; unsigned requested_bindid = requested_core * nhyperthreads; /* can we bind the worker on the preferred core ? */ unsigned ind; /* Look at the remaining cores to be bound to */ for (ind = 0; ind < topology->nhwpus / nhyperthreads; ind++) { if (topology->workers_bindid[ind] == requested_bindid && !config->currently_bound[ind]) { /* the cpu is available, we use it ! */ config->currently_bound[ind] = 1; return requested_bindid; } } } for (i = config->current_bindid; i < topology->nhwpus / nhyperthreads; i++) if (!config->currently_bound[i]) /* Found a cpu ready for use, use it! */ break; STARPU_ASSERT(i < topology->nhwpus / nhyperthreads); int bindid = topology->workers_bindid[i]; config->currently_bound[i] = 1; i++; if (i == topology->nhwpus / nhyperthreads) { /* Finished binding on all cpus, restart from start in * case the user really wants overloading */ memset(&config->currently_bound, 0, sizeof(config->currently_bound)); i = 0; } config->current_bindid = i; return bindid; } unsigned _starpu_topology_get_nhwcpu (struct _starpu_machine_config *config) { #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) _starpu_opencl_init(); #endif #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) _starpu_init_cuda(); #endif _starpu_init_topology(config); return config->topology.nhwcpus; } unsigned _starpu_topology_get_nhwpu (struct _starpu_machine_config *config) { #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) _starpu_opencl_init(); #endif #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) _starpu_init_cuda(); #endif _starpu_init_topology(config); return config->topology.nhwpus; } #ifdef STARPU_USE_MIC static void _starpu_init_mic_config (struct _starpu_machine_config *config, struct starpu_conf *user_conf, unsigned mic_idx) { // Configure the MIC device of index MIC_IDX. struct _starpu_machine_topology *topology = &config->topology; topology->nhwmiccores[mic_idx] = 0; _starpu_init_mic_topology (config, mic_idx); int nmiccores; nmiccores = starpu_get_env_number("STARPU_NMICTHREADS"); if (nmiccores == -1) { /* Nothing was specified, so let's use the number of * detected mic cores. ! */ nmiccores = topology->nhwmiccores[mic_idx]; } else { if ((unsigned) nmiccores > topology->nhwmiccores[mic_idx]) { /* The user requires more MIC cores than there is available */ _STARPU_MSG("# Warning: %d MIC cores requested. Only %u available.\n", nmiccores, topology->nhwmiccores[mic_idx]); nmiccores = topology->nhwmiccores[mic_idx]; } } topology->nmiccores[mic_idx] = nmiccores; STARPU_ASSERT_MSG(topology->nmiccores[mic_idx] + topology->nworkers <= STARPU_NMAXWORKERS, "topology->nmiccores[mic_idx(%u)] (%u) + topology->nworkers (%u) <= STARPU_NMAXWORKERS (%d)", mic_idx, topology->nmiccores[mic_idx], topology->nworkers, STARPU_NMAXWORKERS); /* _starpu_initialize_workers_mic_deviceid (config); */ unsigned miccore_id; for (miccore_id = 0; miccore_id < topology->nmiccores[mic_idx]; miccore_id++) { int worker_idx = topology->nworkers + miccore_id; config->workers[worker_idx].arch = STARPU_MIC_WORKER; _STARPU_MALLOC(config->workers[worker_idx].perf_arch.devices, sizeof(struct starpu_perfmodel_device)); config->workers[worker_idx].perf_arch.ndevices = 1; config->workers[worker_idx].perf_arch.devices[0].type = STARPU_MIC_WORKER; config->workers[worker_idx].perf_arch.devices[0].devid = mic_idx; config->workers[worker_idx].perf_arch.devices[0].ncores = 1; config->workers[worker_idx].devid = mic_idx; config->workers[worker_idx].subworkerid = miccore_id; config->workers[worker_idx].worker_mask = STARPU_MIC; config->worker_mask |= STARPU_MIC; } topology->nworkers += topology->nmiccores[mic_idx]; } #ifdef STARPU_USE_MIC static COIENGINE mic_handles[STARPU_MAXMICDEVS]; COIPROCESS _starpu_mic_process[STARPU_MAXMICDEVS]; #endif static void _starpu_init_mp_config (struct _starpu_machine_config *config, struct starpu_conf *user_conf) { /* Discover and configure the mp topology. That means: * - discover the number of mp nodes; * - initialize each discovered node; * - discover the local topology (number of PUs/devices) of each node; * - configure the workers accordingly. */ struct _starpu_machine_topology *topology = &config->topology; // We currently only support MIC at this level. #ifdef STARPU_USE_MIC /* Discover and initialize the number of MIC nodes through the mp * infrastructure. */ unsigned nhwmicdevices = _starpu_mic_src_get_device_count(); int reqmicdevices = starpu_get_env_number("STARPU_NMIC"); if (reqmicdevices == -1 && user_conf) reqmicdevices = user_conf->nmic; if (reqmicdevices == -1) reqmicdevices = nhwmicdevices; if (reqmicdevices == -1) { /* Nothing was specified, so let's use the number of * detected mic devices. ! */ reqmicdevices = nhwmicdevices; } else { if ((unsigned) reqmicdevices > nhwmicdevices) { /* The user requires more MIC devices than there is available */ _STARPU_MSG("# Warning: %d MIC devices requested. Only %u available.\n", reqmicdevices, nhwmicdevices); reqmicdevices = nhwmicdevices; } } topology->nmicdevices = 0; unsigned i; for (i = 0; i < (unsigned) reqmicdevices; i++) if (0 == _starpu_init_mic_node (config, i, &mic_handles[i], &_starpu_mic_process[i])) topology->nmicdevices++; for (i = 0; i < topology->nmicdevices; i++) _starpu_init_mic_config (config, user_conf, i); #endif } static void _starpu_deinit_mic_node (unsigned mic_idx) { _starpu_mp_common_send_command(mic_nodes[mic_idx], STARPU_EXIT, NULL, 0); COIProcessDestroy(_starpu_mic_process[mic_idx], -1, 0, NULL, NULL); _starpu_mp_common_node_destroy(mic_nodes[mic_idx]); } static void _starpu_deinit_mp_config (struct _starpu_machine_config *config) { struct _starpu_machine_topology *topology = &config->topology; unsigned i; for (i = 0; i < topology->nmicdevices; i++) _starpu_deinit_mic_node (i); _starpu_mic_clear_kernels(); } #endif static int _starpu_init_machine_config(struct _starpu_machine_config *config, int no_mp_config STARPU_ATTRIBUTE_UNUSED) { int i; for (i = 0; i < STARPU_NMAXWORKERS; i++) config->workers[i].workerid = i; struct _starpu_machine_topology *topology = &config->topology; topology->nworkers = 0; topology->ncombinedworkers = 0; topology->nsched_ctxs = 0; #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) _starpu_opencl_init(); #endif #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) _starpu_init_cuda(); #endif _starpu_init_topology(config); _starpu_initialize_workers_bindid(config); #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) int ncuda = config->conf.ncuda; int nworker_per_cuda = starpu_get_env_number_default("STARPU_NWORKER_PER_CUDA", 1); STARPU_ASSERT_MSG(nworker_per_cuda > 0, "STARPU_NWORKER_PER_CUDA has to be > 0"); STARPU_ASSERT_MSG(nworker_per_cuda < STARPU_NMAXWORKERS, "STARPU_NWORKER_PER_CUDA (%d) cannot be higher than STARPU_NMAXWORKERS (%d)\n", nworker_per_cuda, STARPU_NMAXWORKERS); #ifndef STARPU_NON_BLOCKING_DRIVERS if (nworker_per_cuda > 1) { _STARPU_DISP("Warning: reducing STARPU_NWORKER_PER_CUDA to 1 because blocking drivers are enabled\n"); nworker_per_cuda = 1; } #endif if (ncuda != 0) { /* The user did not disable CUDA. We need to initialize CUDA * early to count the number of devices */ _starpu_init_cuda(); int nb_devices = _starpu_get_cuda_device_count(); if (ncuda == -1) { /* Nothing was specified, so let's choose ! */ ncuda = nb_devices; } else { if (ncuda > nb_devices) { /* The user requires more CUDA devices than * there is available */ _STARPU_DISP("Warning: %d CUDA devices requested. Only %d available.\n", ncuda, nb_devices); ncuda = nb_devices; } } } /* Now we know how many CUDA devices will be used */ topology->ncudagpus = ncuda; topology->nworkerpercuda = nworker_per_cuda; STARPU_ASSERT(topology->ncudagpus <= STARPU_MAXCUDADEVS); _starpu_initialize_workers_cuda_gpuid(config); unsigned cudagpu; for (cudagpu = 0; cudagpu < topology->ncudagpus; cudagpu++) { int devid = _starpu_get_next_cuda_gpuid(config); for (i = 0; i < nworker_per_cuda; i++) { int worker_idx = topology->nworkers + cudagpu * nworker_per_cuda + i; config->workers[worker_idx].arch = STARPU_CUDA_WORKER; _STARPU_MALLOC(config->workers[worker_idx].perf_arch.devices, sizeof(struct starpu_perfmodel_device)); config->workers[worker_idx].perf_arch.ndevices = 1; config->workers[worker_idx].perf_arch.devices[0].type = STARPU_CUDA_WORKER; config->workers[worker_idx].perf_arch.devices[0].devid = devid; // TODO: fix perfmodels etc. //config->workers[worker_idx].perf_arch.ncore = nworker_per_cuda - 1; config->workers[worker_idx].perf_arch.devices[0].ncores = 1; config->workers[worker_idx].devid = devid; config->workers[worker_idx].subworkerid = i; config->workers[worker_idx].worker_mask = STARPU_CUDA; config->worker_mask |= STARPU_CUDA; struct handle_entry *entry; HASH_FIND_INT(devices_using_cuda, &devid, entry); if (!entry) { _STARPU_MALLOC(entry, sizeof(*entry)); entry->gpuid = devid; HASH_ADD_INT(devices_using_cuda, gpuid, entry); } } } topology->nworkers += topology->ncudagpus * nworker_per_cuda; #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) int nopencl = config->conf.nopencl; if (nopencl != 0) { /* The user did not disable OPENCL. We need to initialize * OpenCL early to count the number of devices */ _starpu_opencl_init(); int nb_devices; nb_devices = _starpu_opencl_get_device_count(); if (nopencl == -1) { /* Nothing was specified, so let's choose ! */ nopencl = nb_devices; if (nopencl > STARPU_MAXOPENCLDEVS) { _STARPU_DISP("Warning: %d OpenCL devices available. Only %d enabled. Use configure option --enable-maxopencldadev=xxx to update the maximum value of supported OpenCL devices.\n", nb_devices, STARPU_MAXOPENCLDEVS); nopencl = STARPU_MAXOPENCLDEVS; } } else { /* Let's make sure this value is OK. */ if (nopencl > nb_devices) { /* The user requires more OpenCL devices than * there is available */ _STARPU_DISP("Warning: %d OpenCL devices requested. Only %d available.\n", nopencl, nb_devices); nopencl = nb_devices; } /* Let's make sure this value is OK. */ if (nopencl > STARPU_MAXOPENCLDEVS) { _STARPU_DISP("Warning: %d OpenCL devices requested. Only %d enabled. Use configure option --enable-maxopencldev=xxx to update the maximum value of supported OpenCL devices.\n", nopencl, STARPU_MAXOPENCLDEVS); nopencl = STARPU_MAXOPENCLDEVS; } } } topology->nopenclgpus = nopencl; STARPU_ASSERT(topology->nopenclgpus + topology->nworkers <= STARPU_NMAXWORKERS); _starpu_initialize_workers_opencl_gpuid(config); unsigned openclgpu; for (openclgpu = 0; openclgpu < topology->nopenclgpus; openclgpu++) { int worker_idx = topology->nworkers + openclgpu; int devid = _starpu_get_next_opencl_gpuid(config); if (devid == -1) { // There is no more devices left topology->nopenclgpus = openclgpu; break; } config->workers[worker_idx].arch = STARPU_OPENCL_WORKER; _STARPU_MALLOC(config->workers[worker_idx].perf_arch.devices, sizeof(struct starpu_perfmodel_device)); config->workers[worker_idx].perf_arch.ndevices = 1; config->workers[worker_idx].perf_arch.devices[0].type = STARPU_OPENCL_WORKER; config->workers[worker_idx].perf_arch.devices[0].devid = devid; config->workers[worker_idx].perf_arch.devices[0].ncores = 1; config->workers[worker_idx].subworkerid = 0; config->workers[worker_idx].devid = devid; config->workers[worker_idx].worker_mask = STARPU_OPENCL; config->worker_mask |= STARPU_OPENCL; } topology->nworkers += topology->nopenclgpus; #endif #ifdef STARPU_USE_SCC int nscc = config->conf.nscc; unsigned nb_scc_nodes = _starpu_scc_src_get_device_count(); if (nscc != 0) { /* The user did not disable SCC. We need to count * the number of devices */ int nb_devices = nb_scc_nodes; if (nscc == -1) { /* Nothing was specified, so let's choose ! */ nscc = nb_devices; if (nscc > STARPU_MAXSCCDEVS) { _STARPU_DISP("Warning: %d SCC devices available. Only %d enabled. Use configuration option --enable-maxsccdev=xxx to update the maximum value of supported SCC devices.\n", nb_devices, STARPU_MAXSCCDEVS); nscc = STARPU_MAXSCCDEVS; } } else { /* Let's make sure this value is OK. */ if (nscc > nb_devices) { /* The user requires more SCC devices than there is available */ _STARPU_DISP("Warning: %d SCC devices requested. Only %d available.\n", nscc, nb_devices); nscc = nb_devices; } /* Let's make sure this value is OK. */ if (nscc > STARPU_MAXSCCDEVS) { _STARPU_DISP("Warning: %d SCC devices requested. Only %d enabled. Use configure option --enable-maxsccdev=xxx to update the maximum value of supported SCC devices.\n", nscc, STARPU_MAXSCCDEVS); nscc = STARPU_MAXSCCDEVS; } } } /* Now we know how many SCC devices will be used */ topology->nsccdevices = nscc; STARPU_ASSERT(topology->nsccdevices + topology->nworkers <= STARPU_NMAXWORKERS); _starpu_initialize_workers_scc_deviceid(config); unsigned sccdev; for (sccdev = 0; sccdev < topology->nsccdevices; sccdev++) { config->workers[topology->nworkers + sccdev].arch = STARPU_SCC_WORKER; int devid = _starpu_get_next_scc_deviceid(config); _STARPU_MALLOC(config->workers[topology->nworkers + sccdev].perf_arch.devices, sizeof(struct starpu_perfmodel_device)); config->workers[topology->nworkers + sccdev].perf_arch.ndevices = 1; config->workers[topology->nworkers + sccdev].perf_arch.devices[0].type = STARPU_SCC_WORKER; config->workers[topology->nworkers + sccdev].perf_arch.devices[0].devid = sccdev; config->workers[topology->nworkers + sccdev].perf_arch.devices[0].ncore = 1; config->workers[topology->nworkers + sccdev].subworkerid = 0; config->workers[topology->nworkers + sccdev].devid = devid; config->workers[topology->nworkers + sccdev].worker_mask = STARPU_SCC; config->worker_mask |= STARPU_SCC; } for (; sccdev < nb_scc_nodes; ++sccdev) _starpu_scc_exit_useless_node(sccdev); topology->nworkers += topology->nsccdevices; #endif /* STARPU_USE_SCC */ /* Unless not requested, we need to complete configuration with the * ones of the mp nodes. */ #ifdef STARPU_USE_MIC if (! no_mp_config) _starpu_init_mp_config (config, &config->conf); #endif /* we put the CPU section after the accelerator : in case there was an * accelerator found, we devote one cpu */ #if defined(STARPU_USE_CPU) || defined(STARPU_SIMGRID) int ncpu = config->conf.ncpus; if (ncpu != 0) { if (ncpu == -1) { unsigned mic_busy_cpus = 0; unsigned j = 0; for (j = 0; j < STARPU_MAXMICDEVS; j++) mic_busy_cpus += (topology->nmiccores[j] ? 1 : 0); unsigned already_busy_cpus = mic_busy_cpus + topology->ncudagpus + topology->nopenclgpus + topology->nsccdevices; long avail_cpus = (long) topology->nhwcpus - (long) already_busy_cpus; if (avail_cpus < 0) avail_cpus = 0; int nth_per_core = starpu_get_env_number_default("STARPU_NTHREADS_PER_CORE", 1); avail_cpus *= nth_per_core; ncpu = STARPU_MIN(avail_cpus, STARPU_MAXCPUS); } else { if (ncpu > STARPU_MAXCPUS) { _STARPU_DISP("Warning: %d CPU devices requested. Only %d enabled. Use configure option --enable-maxcpus=xxx to update the maximum value of supported CPU devices.\n", ncpu, STARPU_MAXCPUS); ncpu = STARPU_MAXCPUS; } } } topology->ncpus = ncpu; STARPU_ASSERT(topology->ncpus + topology->nworkers <= STARPU_NMAXWORKERS); unsigned cpu; unsigned homogeneous = starpu_get_env_number_default("STARPU_PERF_MODEL_HOMOGENEOUS_CPU", 1); for (cpu = 0; cpu < topology->ncpus; cpu++) { int worker_idx = topology->nworkers + cpu; config->workers[worker_idx].arch = STARPU_CPU_WORKER; _STARPU_MALLOC(config->workers[worker_idx].perf_arch.devices, sizeof(struct starpu_perfmodel_device)); config->workers[worker_idx].perf_arch.ndevices = 1; config->workers[worker_idx].perf_arch.devices[0].type = STARPU_CPU_WORKER; config->workers[worker_idx].perf_arch.devices[0].devid = homogeneous ? 0 : cpu; config->workers[worker_idx].perf_arch.devices[0].ncores = 1; config->workers[worker_idx].subworkerid = 0; config->workers[worker_idx].devid = cpu; config->workers[worker_idx].worker_mask = STARPU_CPU; config->worker_mask |= STARPU_CPU; } topology->nworkers += topology->ncpus; #endif if (topology->nworkers == 0) { _STARPU_DEBUG("No worker found, aborting ...\n"); return -ENODEV; } return 0; } void _starpu_destroy_machine_config(struct _starpu_machine_config *config) { _starpu_close_debug_logfile(); unsigned worker; for (worker = 0; worker < config->topology.nworkers; worker++) { struct _starpu_worker *workerarg = &config->workers[worker]; int bindid = workerarg->bindid; free(workerarg->perf_arch.devices); #ifdef STARPU_HAVE_HWLOC hwloc_bitmap_free(workerarg->hwloc_cpu_set); if (bindid != -1) { hwloc_obj_t worker_obj = hwloc_get_obj_by_depth(config->topology.hwtopology, config->pu_depth, bindid); struct _starpu_hwloc_userdata *data = worker_obj->userdata; if (data->worker_list) { _starpu_worker_list_delete(data->worker_list); data->worker_list = NULL; } } #endif if (bindid != -1) { free(config->bindid_workers[bindid].workerids); config->bindid_workers[bindid].workerids = NULL; } } free(config->bindid_workers); config->bindid_workers = NULL; config->nbindid = 0; unsigned combined_worker_id; for(combined_worker_id=0 ; combined_worker_id < config->topology.ncombinedworkers ; combined_worker_id++) { struct _starpu_combined_worker *combined_worker = &config->combined_workers[combined_worker_id]; #ifdef STARPU_HAVE_HWLOC hwloc_bitmap_free(combined_worker->hwloc_cpu_set); #endif free(combined_worker->perf_arch.devices); } #ifdef STARPU_HAVE_HWLOC _starpu_deallocate_topology_userdata(hwloc_get_root_obj(config->topology.hwtopology)); hwloc_topology_destroy(config->topology.hwtopology); #endif topology_is_initialized = 0; #ifdef STARPU_USE_CUDA struct handle_entry *entry, *tmp; HASH_ITER(hh, devices_using_cuda, entry, tmp) { HASH_DEL(devices_using_cuda, entry); free(entry); } devices_using_cuda = NULL; #endif #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) int i; for (i=0; i 0) return; if (cpuid < 0) return; if (workerid != STARPU_NOWORKERID && cpuid < STARPU_MAXCPUS) { int previous = cpu_worker[cpuid]; if (previous != STARPU_NOWORKERID && previous != workerid) _STARPU_DISP("Warning: both workers %d and %d are bound to the same PU %d, this will strongly degrade performance\n", previous, workerid, cpuid); else cpu_worker[cpuid] = workerid; } #ifdef STARPU_HAVE_HWLOC const struct hwloc_topology_support *support; #ifdef STARPU_USE_OPENCL _starpu_opencl_init(); #endif #ifdef STARPU_USE_CUDA _starpu_init_cuda(); #endif _starpu_init_topology(config); support = hwloc_topology_get_support (config->topology.hwtopology); if (support->cpubind->set_thisthread_cpubind) { hwloc_obj_t obj = hwloc_get_obj_by_depth (config->topology.hwtopology, config->pu_depth, cpuid); hwloc_bitmap_t set = obj->cpuset; int ret; hwloc_bitmap_singlify(set); ret = hwloc_set_cpubind (config->topology.hwtopology, set, HWLOC_CPUBIND_THREAD); if (ret) { perror("hwloc_set_cpubind"); STARPU_ABORT(); } } #elif defined(HAVE_PTHREAD_SETAFFINITY_NP) && defined(__linux__) int ret; /* fix the thread on the correct cpu */ cpu_set_t aff_mask; CPU_ZERO(&aff_mask); CPU_SET(cpuid, &aff_mask); starpu_pthread_t self = pthread_self(); ret = pthread_setaffinity_np(self, sizeof(aff_mask), &aff_mask); if (ret) { const char *msg = strerror(ret); _STARPU_MSG("pthread_setaffinity_np: %s\n", msg); STARPU_ABORT(); } #elif defined(_WIN32) DWORD mask = 1 << cpuid; if (!SetThreadAffinityMask(GetCurrentThread(), mask)) { _STARPU_ERROR("SetThreadMaskAffinity(%lx) failed\n", mask); } #else #warning no CPU binding support #endif #endif } void _starpu_bind_thread_on_cpus ( struct _starpu_machine_config *config STARPU_ATTRIBUTE_UNUSED, struct _starpu_combined_worker *combined_worker STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_SIMGRID return; #endif #ifdef STARPU_HAVE_HWLOC const struct hwloc_topology_support *support; #ifdef STARPU_USE_OPENC _starpu_opencl_init(); #endif #ifdef STARPU_USE_CUDA _starpu_init_cuda(); #endif _starpu_init_topology(config); support = hwloc_topology_get_support(config->topology.hwtopology); if (support->cpubind->set_thisthread_cpubind) { hwloc_bitmap_t set = combined_worker->hwloc_cpu_set; int ret; ret = hwloc_set_cpubind (config->topology.hwtopology, set, HWLOC_CPUBIND_THREAD); if (ret) { perror("binding thread"); STARPU_ABORT(); } } #else #ifdef __GLIBC__ sched_setaffinity(0,sizeof(combined_worker->cpu_set),&combined_worker->cpu_set); #else # warning no parallel worker CPU binding support #endif #endif } static void _starpu_init_workers_binding (struct _starpu_machine_config *config, int no_mp_config STARPU_ATTRIBUTE_UNUSED) { /* launch one thread per CPU */ unsigned ram_memory_node; /* note that even if the CPU cpu are not used, we always have a RAM * node */ /* TODO : support NUMA ;) */ ram_memory_node = _starpu_memory_node_register(STARPU_CPU_RAM, 0); STARPU_ASSERT(ram_memory_node == STARPU_MAIN_RAM); #ifdef STARPU_SIMGRID char name[16]; msg_host_t host = _starpu_simgrid_get_host_by_name("RAM"); STARPU_ASSERT(host); _starpu_simgrid_memory_node_set_host(STARPU_MAIN_RAM, host); #endif /* We will store all the busid of the different (src, dst) * combinations in a matrix which we initialize here. */ _starpu_initialize_busid_matrix(); /* Each device is initialized, * giving it a memory node and a core bind id. */ /* TODO: STARPU_MAXNUMANODES */ unsigned numa_init[1] = { 1 }; unsigned numa_memory_nodes[1] = { ram_memory_node }; #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) unsigned cuda_init[STARPU_MAXCUDADEVS] = { }; unsigned cuda_memory_nodes[STARPU_MAXCUDADEVS]; unsigned cuda_bindid[STARPU_MAXCUDADEVS]; #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) unsigned opencl_init[STARPU_MAXOPENCLDEVS] = { }; unsigned opencl_memory_nodes[STARPU_MAXOPENCLDEVS]; unsigned opencl_bindid[STARPU_MAXOPENCLDEVS]; #endif #ifdef STARPU_USE_MIC unsigned mic_init[STARPU_MAXMICDEVS] = { }; unsigned mic_memory_nodes[STARPU_MAXMICDEVS]; unsigned mic_bindid[STARPU_MAXMICDEVS]; #endif unsigned bindid; for (bindid = 0; bindid < config->nbindid; bindid++) { free(config->bindid_workers[bindid].workerids); config->bindid_workers[bindid].workerids = NULL; config->bindid_workers[bindid].nworkers = 0; } unsigned worker; for (worker = 0; worker < config->topology.nworkers; worker++) { unsigned memory_node = -1; struct _starpu_worker *workerarg = &config->workers[worker]; unsigned devid = workerarg->devid; #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) || defined(STARPU_USE_MIC) || defined(STARPU_SIMGRID) /* Perhaps the worker has some "favourite" bindings */ int *preferred_binding = NULL; int npreferred = 0; #endif /* select the memory node that contains worker's memory */ switch (workerarg->arch) { case STARPU_CPU_WORKER: { /* TODO: NUMA */ int numaid = 0; /* "dedicate" a cpu core to that worker */ if (numa_init[numaid]) { memory_node = numa_memory_nodes[numaid]; } else { numa_init[numaid] = 1; memory_node = numa_memory_nodes[numaid] = _starpu_memory_node_register(STARPU_CPU_RAM, numaid); #ifdef STARPU_SIMGRID snprintf(name, sizeof(name), "RAM%d", numaid); host = _starpu_simgrid_get_host_by_name(name); STARPU_ASSERT(host); _starpu_simgrid_memory_node_set_host(memory_node, host); #endif } workerarg->bindid = _starpu_get_next_bindid(config, NULL, 0); _starpu_memory_node_add_nworkers(memory_node); break; } #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) case STARPU_CUDA_WORKER: #ifndef STARPU_SIMGRID if (may_bind_automatically[STARPU_CUDA_WORKER]) { /* StarPU is allowed to bind threads automatically */ preferred_binding = _starpu_get_cuda_affinity_vector(devid); npreferred = config->topology.nhwpus; } #endif /* SIMGRID */ if (cuda_init[devid]) { memory_node = cuda_memory_nodes[devid]; #ifndef STARPU_SIMGRID workerarg->bindid = cuda_bindid[devid]; #endif /* SIMGRID */ } else { cuda_init[devid] = 1; workerarg->bindid = cuda_bindid[devid] = _starpu_get_next_bindid(config, preferred_binding, npreferred); memory_node = cuda_memory_nodes[devid] = _starpu_memory_node_register(STARPU_CUDA_RAM, devid); _starpu_register_bus(STARPU_MAIN_RAM, memory_node); _starpu_register_bus(memory_node, STARPU_MAIN_RAM); #ifdef STARPU_SIMGRID const char* cuda_memcpy_peer; snprintf(name, sizeof(name), "CUDA%u", devid); host = _starpu_simgrid_get_host_by_name(name); STARPU_ASSERT(host); _starpu_simgrid_memory_node_set_host(memory_node, host); cuda_memcpy_peer = MSG_host_get_property_value(host, "memcpy_peer"); #endif /* SIMGRID */ if ( #ifdef STARPU_SIMGRID cuda_memcpy_peer && atoll(cuda_memcpy_peer) #elif defined(HAVE_CUDA_MEMCPY_PEER) 1 #else /* MEMCPY_PEER */ 0 #endif /* MEMCPY_PEER */ ) { unsigned worker2; for (worker2 = 0; worker2 < worker; worker2++) { struct _starpu_worker *workerarg2 = &config->workers[worker2]; if (workerarg2->arch == STARPU_CUDA_WORKER) { unsigned memory_node2 = starpu_worker_get_memory_node(worker2); _starpu_register_bus(memory_node2, memory_node); _starpu_register_bus(memory_node, memory_node2); } } } } _starpu_memory_node_add_nworkers(memory_node); break; #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) case STARPU_OPENCL_WORKER: #ifndef STARPU_SIMGRID if (may_bind_automatically[STARPU_OPENCL_WORKER]) { /* StarPU is allowed to bind threads automatically */ preferred_binding = _starpu_get_opencl_affinity_vector(devid); npreferred = config->topology.nhwpus; } #endif /* SIMGRID */ if (opencl_init[devid]) { memory_node = opencl_memory_nodes[devid]; #ifndef STARPU_SIMGRID workerarg->bindid = opencl_bindid[devid]; #endif /* SIMGRID */ } else { opencl_init[devid] = 1; workerarg->bindid = opencl_bindid[devid] = _starpu_get_next_bindid(config, preferred_binding, npreferred); memory_node = opencl_memory_nodes[devid] = _starpu_memory_node_register(STARPU_OPENCL_RAM, devid); _starpu_register_bus(STARPU_MAIN_RAM, memory_node); _starpu_register_bus(memory_node, STARPU_MAIN_RAM); #ifdef STARPU_SIMGRID snprintf(name, sizeof(name), "OpenCL%u", devid); host = _starpu_simgrid_get_host_by_name(name); STARPU_ASSERT(host); _starpu_simgrid_memory_node_set_host(memory_node, host); #endif /* SIMGRID */ } _starpu_memory_node_add_nworkers(memory_node); break; #endif #ifdef STARPU_USE_MIC case STARPU_MIC_WORKER: if (mic_init[devid]) { memory_node = mic_memory_nodes[devid]; } else { mic_init[devid] = 1; /* TODO */ //if (may_bind_automatically) //{ // /* StarPU is allowed to bind threads automatically */ // preferred_binding = _starpu_get_mic_affinity_vector(devid); // npreferred = config->topology.nhwpus; //} mic_bindid[devid] = _starpu_get_next_bindid(config, preferred_binding, npreferred); memory_node = mic_memory_nodes[devid] = _starpu_memory_node_register(STARPU_MIC_RAM, devid); _starpu_register_bus(STARPU_MAIN_RAM, memory_node); _starpu_register_bus(memory_node, STARPU_MAIN_RAM); } workerarg->bindid = mic_bindid[devid]; _starpu_memory_node_add_nworkers(memory_node); break; #endif /* STARPU_USE_MIC */ #ifdef STARPU_USE_SCC case STARPU_SCC_WORKER: { /* Node 0 represents the SCC shared memory when we're on SCC. */ struct _starpu_memory_node_descr *descr = _starpu_memory_node_get_description(); descr->nodes[ram_memory_node] = STARPU_SCC_SHM; memory_node = ram_memory_node; _starpu_memory_node_add_nworkers(memory_node); } break; #endif default: STARPU_ABORT(); } workerarg->memory_node = memory_node; _STARPU_DEBUG("worker %u type %d devid %u bound to cpu %d, STARPU memory node %u\n", worker, workerarg->arch, devid, workerarg->bindid, memory_node); #ifdef __GLIBC__ if (workerarg->bindid != -1) { /* Save the initial cpuset */ CPU_ZERO(&workerarg->cpu_set); CPU_SET(workerarg->bindid, &workerarg->cpu_set); } #endif /* __GLIBC__ */ #ifdef STARPU_HAVE_HWLOC if (workerarg->bindid == -1) { workerarg->hwloc_cpu_set = hwloc_bitmap_alloc(); } else { /* Put the worker descriptor in the userdata field of the * hwloc object describing the CPU */ hwloc_obj_t worker_obj = hwloc_get_obj_by_depth(config->topology.hwtopology, config->pu_depth, workerarg->bindid); struct _starpu_hwloc_userdata *data = worker_obj->userdata; if (data->worker_list == NULL) data->worker_list = _starpu_worker_list_new(); _starpu_worker_list_push_front(data->worker_list, workerarg); /* Clear the cpu set and set the cpu */ workerarg->hwloc_cpu_set = hwloc_bitmap_dup (worker_obj->cpuset); } #endif if (workerarg->bindid != -1) { bindid = workerarg->bindid; unsigned old_nbindid = config->nbindid; if (bindid >= old_nbindid) { /* More room needed */ if (!old_nbindid) config->nbindid = STARPU_NMAXWORKERS; else config->nbindid = 2 * old_nbindid; _STARPU_REALLOC(config->bindid_workers, config->nbindid * sizeof(config->bindid_workers[0])); memset(&config->bindid_workers[old_nbindid], 0, (config->nbindid - old_nbindid) * sizeof(config->bindid_workers[0])); } /* Add slot for this worker */ /* Don't care about amortizing the cost, there are usually very few workers sharing the same bindid */ config->bindid_workers[bindid].nworkers++; _STARPU_REALLOC(config->bindid_workers[bindid].workerids, config->bindid_workers[bindid].nworkers * sizeof(config->bindid_workers[bindid].workerids[0])); config->bindid_workers[bindid].workerids[config->bindid_workers[bindid].nworkers-1] = worker; } } } int _starpu_build_topology (struct _starpu_machine_config *config, int no_mp_config) { int ret; unsigned i; ret = _starpu_init_machine_config(config, no_mp_config); if (ret) return ret; /* for the data management library */ _starpu_memory_nodes_init(); _starpu_init_workers_binding(config, no_mp_config); config->cpus_nodeid = -1; config->cuda_nodeid = -1; config->opencl_nodeid = -1; config->mic_nodeid = -1; config->scc_nodeid = -1; for (i = 0; i < starpu_worker_get_count(); i++) { switch (starpu_worker_get_type(i)) { case STARPU_CPU_WORKER: if (config->cpus_nodeid == -1) config->cpus_nodeid = starpu_worker_get_memory_node(i); else if (config->cpus_nodeid != (int) starpu_worker_get_memory_node(i)) config->cpus_nodeid = -2; break; case STARPU_CUDA_WORKER: if (config->cuda_nodeid == -1) config->cuda_nodeid = starpu_worker_get_memory_node(i); else if (config->cuda_nodeid != (int) starpu_worker_get_memory_node(i)) config->cuda_nodeid = -2; break; case STARPU_OPENCL_WORKER: if (config->opencl_nodeid == -1) config->opencl_nodeid = starpu_worker_get_memory_node(i); else if (config->opencl_nodeid != (int) starpu_worker_get_memory_node(i)) config->opencl_nodeid = -2; break; case STARPU_MIC_WORKER: if (config->mic_nodeid == -1) config->mic_nodeid = starpu_worker_get_memory_node(i); else if (config->mic_nodeid != (int) starpu_worker_get_memory_node(i)) config->mic_nodeid = -2; break; case STARPU_SCC_WORKER: if (config->scc_nodeid == -1) config->scc_nodeid = starpu_worker_get_memory_node(i); else if (config->scc_nodeid != (int) starpu_worker_get_memory_node(i)) config->scc_nodeid = -2; break; case STARPU_ANY_WORKER: STARPU_ASSERT(0); } } return 0; } void _starpu_destroy_topology(struct _starpu_machine_config *config STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_USE_MIC _starpu_deinit_mp_config(config); #endif /* cleanup StarPU internal data structures */ _starpu_memory_nodes_deinit(); _starpu_destroy_machine_config(config); } void starpu_topology_print (FILE *output) { struct _starpu_machine_config *config = _starpu_get_machine_config(); struct _starpu_machine_topology *topology = &config->topology; unsigned pu; unsigned worker; unsigned nworkers = starpu_worker_get_count(); unsigned ncombinedworkers = topology->ncombinedworkers; unsigned nthreads_per_core = topology->nhwpus / topology->nhwcpus; #ifdef STARPU_HAVE_HWLOC hwloc_topology_t topo = topology->hwtopology; hwloc_obj_t pu_obj; hwloc_obj_t last_numa_obj = NULL, numa_obj; hwloc_obj_t last_package_obj = NULL, package_obj; #endif for (pu = 0; pu < topology->nhwpus; pu++) { #ifdef STARPU_HAVE_HWLOC pu_obj = hwloc_get_obj_by_type(topo, HWLOC_OBJ_PU, pu); numa_obj = hwloc_get_ancestor_obj_by_type(topo, HWLOC_OBJ_NODE, pu_obj); if (numa_obj != last_numa_obj) { fprintf(output, "numa %u", numa_obj->logical_index); last_numa_obj = numa_obj; } fprintf(output, "\t"); package_obj = hwloc_get_ancestor_obj_by_type(topo, HWLOC_OBJ_SOCKET, pu_obj); if (package_obj != last_package_obj) { fprintf(output, "pack %u", package_obj->logical_index); last_package_obj = package_obj; } fprintf(output, "\t"); #endif if ((pu % nthreads_per_core) == 0) fprintf(output, "core %u", pu / nthreads_per_core); fprintf(output, "\tPU %u\t", pu); for (worker = 0; worker < nworkers + ncombinedworkers; worker++) { if (worker < nworkers) { struct _starpu_worker *workerarg = &config->workers[worker]; if (workerarg->bindid == (int) pu) { char name[256]; starpu_worker_get_name (worker, name, sizeof(name)); fprintf(output, "%s\t", name); } } else { int worker_size, i; int *combined_workerid; starpu_combined_worker_get_description(worker, &worker_size, &combined_workerid); for (i = 0; i < worker_size; i++) { if (topology->workers_bindid[combined_workerid[i]] == pu) fprintf(output, "comb %u\t", worker-nworkers); } } } fprintf(output, "\n"); } } starpu-1.2.3+dfsg/src/core/topology.h000066400000000000000000000047151320135501600175210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2010, 2012, 2014-2016 Université de Bordeaux * Copyright (C) 2010, 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __TOPOLOGY_H__ #define __TOPOLOGY_H__ #include #include #include #include /* TODO actually move this struct into this header */ struct _starpu_machine_config; #ifndef STARPU_SIMGRID #ifdef STARPU_HAVE_HWLOC /* This is allocated for each hwloc object */ struct _starpu_hwloc_userdata { struct _starpu_worker_list *worker_list; /* List of workers running on this obj */ }; #endif #endif /* Detect the number of memory nodes and where to bind the different workers. */ int _starpu_build_topology(struct _starpu_machine_config *config, int no_mp_config); /* Should be called instead of _starpu_destroy_topology when _starpu_build_topology returns a non zero value. */ void _starpu_destroy_machine_config(struct _starpu_machine_config *config); /* Destroy all resources used to store the topology of the machine. */ void _starpu_destroy_topology(struct _starpu_machine_config *config); /* returns the number of physical cpus */ unsigned _starpu_topology_get_nhwcpu(struct _starpu_machine_config *config); /* returns the number of logical cpus */ unsigned _starpu_topology_get_nhwpu(struct _starpu_machine_config *config); #define STARPU_NOWORKERID -1 /* Bind the current thread on the CPU logically identified by "cpuid". The * logical ordering of the processors is either that of hwloc (if available), * or the ordering exposed by the OS. */ void _starpu_bind_thread_on_cpu(struct _starpu_machine_config *config, int cpuid, int workerid); struct _starpu_combined_worker; /* Bind the current thread on the set of CPUs for the given combined worker. */ void _starpu_bind_thread_on_cpus(struct _starpu_machine_config *config STARPU_ATTRIBUTE_UNUSED, struct _starpu_combined_worker *combined_worker); #endif // __TOPOLOGY_H__ starpu-1.2.3+dfsg/src/core/tree.c000066400000000000000000000072021320135501600165710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "starpu_tree.h" #include "workers.h" void starpu_tree_reset_visited(struct starpu_tree *tree, char *visited) { if(tree->arity == 0) { int *workerids; int nworkers = _starpu_bindid_get_workerids(tree->id, &workerids); int w; for(w = 0; w < nworkers; w++) { visited[workerids[w]] = 0; } } int i; for(i = 0; i < tree->arity; i++) starpu_tree_reset_visited(&tree->nodes[i], visited); } void starpu_tree_prepare_children(unsigned arity, struct starpu_tree *father) { _STARPU_MALLOC(father->nodes, arity*sizeof(struct starpu_tree)); father->arity = arity; } void starpu_tree_insert(struct starpu_tree *tree, int id, int level, int is_pu, int arity, struct starpu_tree *father) { tree->level = level; tree->arity = arity; tree->nodes = NULL; tree->id = is_pu ? id : level; tree->is_pu = is_pu; tree->father = father; } struct starpu_tree* starpu_tree_get(struct starpu_tree *tree, int id) { if(tree->arity == 0) { if(tree->is_pu && tree->id == id) return tree; else return NULL; } int i; for(i = 0; i < tree->arity; i++) { struct starpu_tree *found_tree = starpu_tree_get(&tree->nodes[i], id); if(found_tree) return found_tree; } return NULL; } static struct starpu_tree* _get_down_to_leaves(struct starpu_tree *node, char *visited, char *present) { struct starpu_tree *found_tree = NULL; int i; for(i = 0; i < node->arity; i++) { if(node->nodes[i].arity == 0) { if(node->nodes[i].is_pu) { int *workerids; int nworkers = _starpu_bindid_get_workerids(node->nodes[i].id, &workerids); int w; for(w = 0; w < nworkers; w++) { if(!visited[workerids[w]] && present[workerids[w]]) return &node->nodes[i]; } } } else { found_tree =_get_down_to_leaves(&node->nodes[i], visited, present); if(found_tree) return found_tree; } } return NULL; } struct starpu_tree* starpu_tree_get_neighbour(struct starpu_tree *tree, struct starpu_tree *node, char *visited, char *present) { struct starpu_tree *father = node == NULL ? tree : node->father; int st, n; for(st = 0; st < father->arity; st++) { if(&father->nodes[st] == node) break; } for(n = 0; n < father->arity; n++) { int i = (st+n)%father->arity; if(&father->nodes[i] != node) { if(father->nodes[i].arity == 0) { if(father->nodes[i].is_pu) { int *workerids; int nworkers = _starpu_bindid_get_workerids(father->nodes[i].id, &workerids); int w; for(w = 0; w < nworkers; w++) { if(!visited[workerids[w]] && present[workerids[w]]) return &father->nodes[i]; } } } else { struct starpu_tree *leaf = _get_down_to_leaves(&father->nodes[i], visited, present); if(leaf) return leaf; } } } if(tree == father) return NULL; return starpu_tree_get_neighbour(tree, father, visited, present); } void starpu_tree_free(struct starpu_tree *tree) { int i; for(i = 0; i < tree->arity; i++) starpu_tree_free(&tree->nodes[i]); free(tree->nodes); tree->nodes = NULL; tree->arity = 0; } starpu-1.2.3+dfsg/src/core/workers.c000066400000000000000000001736061320135501600173420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * Copyright (C) 2010, 2011 INRIA * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2011-2012, 2016 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #ifdef __linux__ #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef STARPU_SIMGRID #include #endif #if defined(_WIN32) && !defined(__CYGWIN__) #include #endif /* acquire/release semantic for concurrent initialization/de-initialization */ static starpu_pthread_mutex_t init_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static starpu_pthread_cond_t init_cond = STARPU_PTHREAD_COND_INITIALIZER; static int init_count = 0; static enum { UNINITIALIZED, CHANGING, INITIALIZED } initialized = UNINITIALIZED; int _starpu_keys_initialized STARPU_ATTRIBUTE_INTERNAL; starpu_pthread_key_t _starpu_worker_key STARPU_ATTRIBUTE_INTERNAL; starpu_pthread_key_t _starpu_worker_set_key STARPU_ATTRIBUTE_INTERNAL; struct _starpu_machine_config _starpu_config STARPU_ATTRIBUTE_INTERNAL; static int check_entire_platform; /* Pointers to argc and argv */ static int *my_argc = 0; static char ***my_argv = NULL; /* Initialize value of static argc and argv, called when the process begins */ void _starpu_set_argc_argv(int *argc_param, char ***argv_param) { my_argc = argc_param; my_argv = argv_param; } int *_starpu_get_argc() { return my_argc; } char ***_starpu_get_argv() { return my_argv; } int _starpu_is_initialized(void) { return initialized == INITIALIZED; } /* Makes sure that at least one of the workers of type can execute * , for at least one of its implementations. */ static uint32_t _starpu_worker_exists_and_can_execute(struct starpu_task *task, enum starpu_worker_archtype arch) { _starpu_codelet_check_deprecated_fields(task->cl); /* make sure there is a worker on the machine able to execute the task, independent of the sched_ctx, this latter may receive latter on the necessary worker - the user or the hypervisor should take care this happens */ struct _starpu_sched_ctx *sched_ctx = check_entire_platform == 1 ? _starpu_get_initial_sched_ctx() : _starpu_get_sched_ctx_struct(task->sched_ctx); struct starpu_worker_collection *workers = sched_ctx->workers; struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { int i = workers->get_next(workers, &it); if (starpu_worker_get_type(i) != arch) continue; unsigned impl; for (impl = 0; impl < STARPU_MAXIMPLEMENTATIONS; impl++) { /* We could call task->cl->can_execute(i, task, impl) here, it would definitely work. It is probably cheaper to check whether it is necessary in order to avoid a useless function call, though. */ unsigned test_implementation = 0; switch (arch) { case STARPU_CPU_WORKER: if (task->cl->cpu_funcs[impl] != NULL) test_implementation = 1; break; case STARPU_CUDA_WORKER: if (task->cl->cuda_funcs[impl] != NULL) test_implementation = 1; break; case STARPU_OPENCL_WORKER: if (task->cl->opencl_funcs[impl] != NULL) test_implementation = 1; break; case STARPU_MIC_WORKER: if (task->cl->cpu_funcs_name[impl] != NULL || task->cl->mic_funcs[impl] != NULL) test_implementation = 1; break; case STARPU_SCC_WORKER: if (task->cl->cpu_funcs_name[impl] != NULL || task->cl->scc_funcs[impl] != NULL) test_implementation = 1; break; default: STARPU_ABORT(); } if (!test_implementation) continue; if (task->cl->can_execute) return task->cl->can_execute(i, task, impl); if(test_implementation) return 1; } } return 0; } /* in case a task is submitted, we may check whether there exists a worker that may execute the task or not */ uint32_t _starpu_worker_exists(struct starpu_task *task) { _starpu_codelet_check_deprecated_fields(task->cl); if (task->cl->where == STARPU_NOWHERE) return 1; /* if the task belongs to the init context we can check out all the worker mask of the machine if not we should iterate on the workers of the ctx and verify if it exists a worker able to exec the task */ if(task->sched_ctx == 0) { if (!(task->cl->where & _starpu_config.worker_mask)) return 0; if (!task->cl->can_execute) return 1; } #if defined(STARPU_USE_CPU) || defined(STARPU_SIMGRID) if ((task->cl->where & STARPU_CPU) && _starpu_worker_exists_and_can_execute(task, STARPU_CPU_WORKER)) return 1; #endif #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) if ((task->cl->where & STARPU_CUDA) && _starpu_worker_exists_and_can_execute(task, STARPU_CUDA_WORKER)) return 1; #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) if ((task->cl->where & STARPU_OPENCL) && _starpu_worker_exists_and_can_execute(task, STARPU_OPENCL_WORKER)) return 1; #endif #ifdef STARPU_USE_MIC if ((task->cl->where & STARPU_MIC) && _starpu_worker_exists_and_can_execute(task, STARPU_MIC_WORKER)) return 1; #endif #ifdef STARPU_USE_SCC if ((task->cl->where & STARPU_SCC) && _starpu_worker_exists_and_can_execute(task, STARPU_SCC_WORKER)) return 1; #endif return 0; } uint32_t _starpu_can_submit_cuda_task(void) { return STARPU_CUDA & _starpu_config.worker_mask; } uint32_t _starpu_can_submit_cpu_task(void) { return STARPU_CPU & _starpu_config.worker_mask; } uint32_t _starpu_can_submit_opencl_task(void) { return STARPU_OPENCL & _starpu_config.worker_mask; } uint32_t _starpu_can_submit_scc_task(void) { return STARPU_SCC & _starpu_config.worker_mask; } static inline int _starpu_can_use_nth_implementation(enum starpu_worker_archtype arch, struct starpu_codelet *cl, unsigned nimpl) { switch(arch) { case STARPU_ANY_WORKER: { int cpu_func_enabled=1, cuda_func_enabled=1, opencl_func_enabled=1; /* TODO: MIC/SCC */ #if defined(STARPU_USE_CPU) || defined(STARPU_SIMGRID) starpu_cpu_func_t cpu_func = _starpu_task_get_cpu_nth_implementation(cl, nimpl); cpu_func_enabled = cpu_func != NULL && starpu_cpu_worker_get_count(); #endif #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) starpu_cuda_func_t cuda_func = _starpu_task_get_cuda_nth_implementation(cl, nimpl); cuda_func_enabled = cuda_func != NULL && starpu_cuda_worker_get_count(); #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) starpu_opencl_func_t opencl_func = _starpu_task_get_opencl_nth_implementation(cl, nimpl); opencl_func_enabled = opencl_func != NULL && starpu_opencl_worker_get_count(); #endif return cpu_func_enabled && cuda_func_enabled && opencl_func_enabled; } case STARPU_CPU_WORKER: { starpu_cpu_func_t func = _starpu_task_get_cpu_nth_implementation(cl, nimpl); return func != NULL; } case STARPU_CUDA_WORKER: { starpu_cuda_func_t func = _starpu_task_get_cuda_nth_implementation(cl, nimpl); return func != NULL; } case STARPU_OPENCL_WORKER: { starpu_opencl_func_t func = _starpu_task_get_opencl_nth_implementation(cl, nimpl); return func != NULL; } case STARPU_MIC_WORKER: { starpu_mic_func_t func = _starpu_task_get_mic_nth_implementation(cl, nimpl); const char *func_name = _starpu_task_get_cpu_name_nth_implementation(cl, nimpl); return func != NULL || func_name != NULL; } case STARPU_SCC_WORKER: { starpu_scc_func_t func = _starpu_task_get_scc_nth_implementation(cl, nimpl); const char *func_name = _starpu_task_get_cpu_name_nth_implementation(cl, nimpl); return func != NULL || func_name != NULL; } default: STARPU_ASSERT_MSG(0, "Unknown arch type %d", arch); } return 0; } int starpu_worker_can_execute_task(unsigned workerid, struct starpu_task *task, unsigned nimpl) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(task->sched_ctx); /* if the task can't be parallel don't submit it to a ctx */ unsigned child_sched_ctx = starpu_sched_ctx_worker_is_master_for_child_ctx(workerid, sched_ctx->id); if(child_sched_ctx != STARPU_NMAX_SCHED_CTXS) if(!task->possibly_parallel) return 0; /* if the worker is blocked in a parallel ctx don't submit tasks on it */ if(sched_ctx->parallel_sect[workerid] ) return 0; /* TODO: check that the task operand sizes will fit on that device */ return (task->cl->where & _starpu_config.workers[workerid].worker_mask) && _starpu_can_use_nth_implementation(_starpu_config.workers[workerid].arch, task->cl, nimpl) && (!task->cl->can_execute || task->cl->can_execute(workerid, task, nimpl)); } int starpu_worker_can_execute_task_impl(unsigned workerid, struct starpu_task *task, unsigned *impl_mask) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(task->sched_ctx); unsigned mask; int i; enum starpu_worker_archtype arch; struct starpu_codelet *cl; if(sched_ctx->parallel_sect[workerid]) return 0; /* TODO: check that the task operand sizes will fit on that device */ cl = task->cl; if (!(cl->where & _starpu_config.workers[workerid].worker_mask)) return 0; mask = 0; arch = _starpu_config.workers[workerid].arch; if (!task->cl->can_execute) { for (i = 0; i < STARPU_MAXIMPLEMENTATIONS; i++) if (_starpu_can_use_nth_implementation(arch, cl, i)) { mask |= 1U << i; if (!impl_mask) break; } } else { for (i = 0; i < STARPU_MAXIMPLEMENTATIONS; i++) if (_starpu_can_use_nth_implementation(arch, cl, i) && (!task->cl->can_execute || task->cl->can_execute(workerid, task, i))) { mask |= 1U << i; if (!impl_mask) break; } } if (impl_mask) *impl_mask = mask; return mask != 0; } int starpu_worker_can_execute_task_first_impl(unsigned workerid, struct starpu_task *task, unsigned *nimpl) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(task->sched_ctx); int i; enum starpu_worker_archtype arch; struct starpu_codelet *cl; if(sched_ctx->parallel_sect[workerid]) return 0; /* TODO: check that the task operand sizes will fit on that device */ cl = task->cl; if (!(cl->where & _starpu_config.workers[workerid].worker_mask)) return 0; arch = _starpu_config.workers[workerid].arch; if (!task->cl->can_execute) { for (i = 0; i < STARPU_MAXIMPLEMENTATIONS; i++) if (_starpu_can_use_nth_implementation(arch, cl, i)) { if (nimpl) *nimpl = i; return 1; } } else { for (i = 0; i < STARPU_MAXIMPLEMENTATIONS; i++) if (_starpu_can_use_nth_implementation(arch, cl, i) && task->cl->can_execute(workerid, task, i)) { if (nimpl) *nimpl = i; return 1; } } return 0; } int starpu_combined_worker_can_execute_task(unsigned workerid, struct starpu_task *task, unsigned nimpl) { /* TODO: check that the task operand sizes will fit on that device */ struct starpu_codelet *cl = task->cl; unsigned nworkers = _starpu_config.topology.nworkers; /* Is this a parallel worker ? */ if (workerid < nworkers) { return !!((task->cl->where & _starpu_config.workers[workerid].worker_mask) && _starpu_can_use_nth_implementation(_starpu_config.workers[workerid].arch, task->cl, nimpl) && (!task->cl->can_execute || task->cl->can_execute(workerid, task, nimpl))); } else { if ((cl->type == STARPU_SPMD) #ifdef STARPU_HAVE_HWLOC || (cl->type == STARPU_FORKJOIN) #else #ifdef __GLIBC__ || (cl->type == STARPU_FORKJOIN) #endif #endif ) { /* TODO we should add other types of constraints */ /* Is the worker larger than requested ? */ int worker_size = (int)_starpu_config.combined_workers[workerid - nworkers].worker_size; int worker0 = _starpu_config.combined_workers[workerid - nworkers].combined_workerid[0]; return !!((worker_size <= task->cl->max_parallelism) && _starpu_can_use_nth_implementation(_starpu_config.workers[worker0].arch, task->cl, nimpl) && (!task->cl->can_execute || task->cl->can_execute(workerid, task, nimpl))); } else { /* We have a sequential task but a parallel worker */ return 0; } } } /* * Runtime initialization methods */ #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) static struct _starpu_worker_set cuda_worker_set[STARPU_MAXCUDADEVS]; #endif #ifdef STARPU_USE_MIC static struct _starpu_worker_set mic_worker_set[STARPU_MAXMICDEVS]; #endif static void _starpu_init_worker_queue(struct _starpu_worker *workerarg) { starpu_pthread_cond_t *cond = &workerarg->sched_cond; starpu_pthread_mutex_t *mutex = &workerarg->sched_mutex; unsigned memory_node = workerarg->memory_node; _starpu_memory_node_register_condition(cond, mutex, memory_node); } /* * Returns 0 if the given driver is one of the drivers that must be launched by * the application itself, and not by StarPU, 1 otherwise. */ static unsigned _starpu_may_launch_driver(struct starpu_conf *conf, struct starpu_driver *d) { if (conf->n_not_launched_drivers == 0 || conf->not_launched_drivers == NULL) return 1; /* Is in conf->not_launched_drivers ? */ unsigned i; for (i = 0; i < conf->n_not_launched_drivers; i++) { if (d->type != conf->not_launched_drivers[i].type) continue; switch (d->type) { case STARPU_CPU_WORKER: if (d->id.cpu_id == conf->not_launched_drivers[i].id.cpu_id) return 0; break; case STARPU_CUDA_WORKER: if (d->id.cuda_id == conf->not_launched_drivers[i].id.cuda_id) return 0; break; #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_WORKER: if (d->id.opencl_id == conf->not_launched_drivers[i].id.opencl_id) return 0; break; #endif default: STARPU_ABORT(); } } return 1; } #ifdef STARPU_PERF_DEBUG struct itimerval prof_itimer; #endif static void _starpu_worker_init(struct _starpu_worker *workerarg, struct _starpu_machine_config *pconfig) { workerarg->config = pconfig; STARPU_PTHREAD_MUTEX_INIT(&workerarg->mutex, NULL); /* arch initialized by topology.c */ /* worker_mask initialized by topology.c */ /* perf_arch initialized by topology.c */ /* worker_thread initialized by _starpu_launch_drivers */ /* devid initialized by topology.c */ /* subworkerid initialized by topology.c */ /* bindid initialized by topology.c */ /* workerid initialized by topology.c */ workerarg->combined_workerid = workerarg->workerid; workerarg->current_rank = 0; workerarg->worker_size = 1; STARPU_PTHREAD_COND_INIT(&workerarg->started_cond, NULL); STARPU_PTHREAD_COND_INIT(&workerarg->ready_cond, NULL); /* memory_node initialized by topology.c */ STARPU_PTHREAD_COND_INIT(&workerarg->sched_cond, NULL); STARPU_PTHREAD_MUTEX_INIT(&workerarg->sched_mutex, NULL); starpu_task_list_init(&workerarg->local_tasks); workerarg->local_ordered_tasks = NULL; workerarg->local_ordered_tasks_size = 0; workerarg->current_ordered_task = 0; workerarg->current_ordered_task_order = 1; workerarg->current_task = NULL; workerarg->first_task = 0; workerarg->ntasks = 0; workerarg->pipeline_length = 0; workerarg->pipeline_stuck = 0; workerarg->set = NULL; workerarg->worker_is_running = 0; workerarg->worker_is_initialized = 0; workerarg->status = STATUS_INITIALIZING; /* name initialized by driver */ /* short_name initialized by driver */ workerarg->run_by_starpu = 1; workerarg->sched_ctx_list = NULL; workerarg->tmp_sched_ctx = -1; workerarg->nsched_ctxs = 0; _starpu_barrier_counter_init(&workerarg->tasks_barrier, 0); workerarg->has_prev_init = 0; int ctx; for(ctx = 0; ctx < STARPU_NMAX_SCHED_CTXS; ctx++) workerarg->removed_from_ctx[ctx] = 0; workerarg->spinning_backoff = 1; for(ctx = 0; ctx < STARPU_NMAX_SCHED_CTXS; ctx++) { workerarg->shares_tasks_lists[ctx] = 0; workerarg->poped_in_ctx[ctx] = 0; } workerarg->reverse_phase[0] = 0; workerarg->reverse_phase[1] = 0; workerarg->pop_ctx_priority = 1; workerarg->sched_mutex_locked = 0; workerarg->slave = 0; /* cpu_set/hwloc_cpu_set initialized in topology.c */ } #ifdef STARPU_USE_FXT void _starpu_worker_start(struct _starpu_worker *worker, unsigned fut_key, unsigned sync) { unsigned devid = worker->devid; unsigned memnode = worker->memory_node; _STARPU_TRACE_WORKER_INIT_START(fut_key, worker->workerid, devid, memnode, worker->bindid, sync); } #endif void _starpu_driver_start(struct _starpu_worker *worker, unsigned fut_key, unsigned sync STARPU_ATTRIBUTE_UNUSED) { (void) fut_key; int devid = worker->devid; (void) devid; #ifdef STARPU_USE_FXT _starpu_fxt_register_thread(worker->bindid); _starpu_worker_start(worker, fut_key, sync); #endif _starpu_memory_node_set_local_key(&worker->memory_node); _starpu_set_local_worker_key(worker); STARPU_PTHREAD_MUTEX_LOCK(&worker->mutex); worker->worker_is_running = 1; STARPU_PTHREAD_COND_SIGNAL(&worker->started_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&worker->mutex); _starpu_bind_thread_on_cpu(worker->config, worker->bindid, worker->workerid); #if defined(STARPU_PERF_DEBUG) && !defined(STARPU_SIMGRID) setitimer(ITIMER_PROF, &prof_itimer, NULL); #endif _STARPU_DEBUG("worker %p %d for dev %d is ready on logical cpu %d\n", worker, worker->workerid, devid, worker->bindid); #ifdef STARPU_HAVE_HWLOC _STARPU_DEBUG("worker %p %d cpuset start at %d\n", worker, worker->workerid, hwloc_bitmap_first(worker->hwloc_cpu_set)); #endif } static void _starpu_launch_drivers(struct _starpu_machine_config *pconfig) { pconfig->running = 1; pconfig->pause_depth = 0; pconfig->submitting = 1; STARPU_HG_DISABLE_CHECKING(pconfig->watchdog_ok); unsigned nworkers = pconfig->topology.nworkers; /* Launch workers asynchronously */ unsigned worker; #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) || defined(STARPU_USE_MIC) unsigned i; #endif #if defined(STARPU_PERF_DEBUG) && !defined(STARPU_SIMGRID) /* Get itimer of the main thread, to set it for the worker threads */ getitimer(ITIMER_PROF, &prof_itimer); #endif STARPU_AYU_INIT(); #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) for (i = 0; i < sizeof(cuda_worker_set)/sizeof(cuda_worker_set[0]); i++) cuda_worker_set[i].workers = NULL; #endif #ifdef STARPU_USE_MIC for (i = 0; i < sizeof(mic_worker_set)/sizeof(mic_worker_set[0]); i++) mic_worker_set[i].workers = NULL; #endif for (worker = 0; worker < nworkers; worker++) { struct _starpu_worker *workerarg = &pconfig->workers[worker]; #if defined(STARPU_USE_MIC) || defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) unsigned devid = workerarg->devid; #endif #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) struct _starpu_worker_set *worker_set; #endif _STARPU_DEBUG("initialising worker %u/%u\n", worker, nworkers); _starpu_init_worker_queue(workerarg); struct starpu_driver driver; driver.type = workerarg->arch; switch (workerarg->arch) { #if defined(STARPU_USE_CPU) || defined(STARPU_SIMGRID) case STARPU_CPU_WORKER: driver.id.cpu_id = workerarg->devid; if (_starpu_may_launch_driver(&pconfig->conf, &driver)) { STARPU_PTHREAD_CREATE_ON( "CPU", &workerarg->worker_thread, NULL, _starpu_cpu_worker, workerarg, _starpu_simgrid_get_host_by_worker(workerarg)); #ifdef STARPU_USE_FXT /* In tracing mode, make sure the * thread is really started before * starting another one, to make sure * they appear in order in the trace. */ STARPU_PTHREAD_MUTEX_LOCK(&workerarg->mutex); while (!workerarg->worker_is_running) STARPU_PTHREAD_COND_WAIT(&workerarg->started_cond, &workerarg->mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&workerarg->mutex); #endif } else { workerarg->run_by_starpu = 0; } break; #endif #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) case STARPU_CUDA_WORKER: driver.id.cuda_id = workerarg->devid; worker_set = &cuda_worker_set[devid]; workerarg->set = worker_set; /* We spawn only one thread per CUDA driver, * which will control all CUDA workers of this * driver. (by using a worker set). */ if (worker_set->workers) break; worker_set->nworkers = starpu_get_env_number_default("STARPU_NWORKER_PER_CUDA", 1); #ifndef STARPU_NON_BLOCKING_DRIVERS if (worker_set->nworkers > 1) { _STARPU_DISP("Warning: reducing STARPU_NWORKER_PER_CUDA to 1 because blocking drivers are enabled\n"); worker_set->nworkers = 1; } #endif worker_set->workers = workerarg; worker_set->set_is_initialized = 0; if (!_starpu_may_launch_driver(&pconfig->conf, &driver)) { workerarg->run_by_starpu = 0; break; } STARPU_PTHREAD_CREATE_ON( "CUDA", &worker_set->worker_thread, NULL, _starpu_cuda_worker, worker_set, _starpu_simgrid_get_host_by_worker(workerarg)); #ifdef STARPU_USE_FXT STARPU_PTHREAD_MUTEX_LOCK(&workerarg->mutex); while (!workerarg->worker_is_running) STARPU_PTHREAD_COND_WAIT(&workerarg->started_cond, &workerarg->mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&workerarg->mutex); #endif break; #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) case STARPU_OPENCL_WORKER: #ifndef STARPU_SIMGRID starpu_opencl_get_device(workerarg->devid, &driver.id.opencl_id); if (!_starpu_may_launch_driver(&pconfig->conf, &driver)) { workerarg->run_by_starpu = 0; break; } #endif STARPU_PTHREAD_CREATE_ON( "OpenCL", &workerarg->worker_thread, NULL, _starpu_opencl_worker, workerarg, _starpu_simgrid_get_host_by_worker(workerarg)); #ifdef STARPU_USE_FXT STARPU_PTHREAD_MUTEX_LOCK(&workerarg->mutex); while (!workerarg->worker_is_running) STARPU_PTHREAD_COND_WAIT(&workerarg->started_cond, &workerarg->mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&workerarg->mutex); #endif break; #endif #ifdef STARPU_USE_MIC case STARPU_MIC_WORKER: workerarg->set = &mic_worker_set[devid]; /* We spawn only one thread * per MIC device, which will control all MIC * workers of this device. (by using a worker set). */ if (mic_worker_set[devid].workers) break; mic_worker_set[devid].nworkers = pconfig->topology.nmiccores[devid]; /* We assume all MIC workers of a given MIC * device are contiguous so that we can * address them with the first one only. */ mic_worker_set[devid].workers = workerarg; mic_worker_set[devid].set_is_initialized = 0; STARPU_PTHREAD_CREATE_ON( "MIC", &mic_worker_set[devid].worker_thread, NULL, _starpu_mic_src_worker, &mic_worker_set[devid], _starpu_simgrid_get_host_by_worker(workerarg)); #ifdef STARPU_USE_FXT STARPU_PTHREAD_MUTEX_LOCK(&workerarg->mutex); while (!workerarg->worker_is_running) STARPU_PTHREAD_COND_WAIT(&workerarg->started_cond, &workerarg->mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&workerarg->mutex); #endif STARPU_PTHREAD_MUTEX_LOCK(&mic_worker_set[devid].mutex); while (!mic_worker_set[devid].set_is_initialized) STARPU_PTHREAD_COND_WAIT(&mic_worker_set[devid].ready_cond, &mic_worker_set[devid].mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&mic_worker_set[devid].mutex); mic_worker_set[devid].started = 1; break; #endif /* STARPU_USE_MIC */ #ifdef STARPU_USE_SCC case STARPU_SCC_WORKER: workerarg->worker_is_initialized = 0; STARPU_PTHREAD_CREATE_ON( "SCC", &workerarg->worker_thread, NULL, _starpu_scc_src_worker, workerarg, _starpu_simgrid_get_host_by_worker(workerarg)); #ifdef STARPU_USE_FXT STARPU_PTHREAD_MUTEX_LOCK(&workerarg->mutex); while (!workerarg->worker_is_running) STARPU_PTHREAD_COND_WAIT(&workerarg->started_cond, &workerarg->mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&workerarg->mutex); #endif break; #endif default: STARPU_ABORT(); } } for (worker = 0; worker < nworkers; worker++) { struct _starpu_worker *workerarg = &pconfig->workers[worker]; struct starpu_driver driver; driver.type = workerarg->arch; #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) struct _starpu_worker_set *worker_set = workerarg->set; #endif switch (workerarg->arch) { case STARPU_CPU_WORKER: driver.id.cpu_id = workerarg->devid; if (!_starpu_may_launch_driver(&pconfig->conf, &driver)) break; _STARPU_DEBUG("waiting for worker %u initialization\n", worker); STARPU_PTHREAD_MUTEX_LOCK(&workerarg->mutex); while (!workerarg->worker_is_initialized) STARPU_PTHREAD_COND_WAIT(&workerarg->ready_cond, &workerarg->mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&workerarg->mutex); break; #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) case STARPU_CUDA_WORKER: #ifndef STARPU_SIMGRID driver.id.cuda_id = workerarg->devid; if (!_starpu_may_launch_driver(&pconfig->conf, &driver)) break; #endif _STARPU_DEBUG("waiting for worker %u initialization\n", worker); STARPU_PTHREAD_MUTEX_LOCK(&worker_set->mutex); while (!worker_set->set_is_initialized) STARPU_PTHREAD_COND_WAIT(&worker_set->ready_cond, &worker_set->mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&worker_set->mutex); worker_set->started = 1; break; #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) case STARPU_OPENCL_WORKER: #ifndef STARPU_SIMGRID starpu_opencl_get_device(workerarg->devid, &driver.id.opencl_id); if (!_starpu_may_launch_driver(&pconfig->conf, &driver)) break; #endif _STARPU_DEBUG("waiting for worker %u initialization\n", worker); STARPU_PTHREAD_MUTEX_LOCK(&workerarg->mutex); while (!workerarg->worker_is_initialized) STARPU_PTHREAD_COND_WAIT(&workerarg->ready_cond, &workerarg->mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&workerarg->mutex); break; #endif case STARPU_MIC_WORKER: /* Already waited above */ break; case STARPU_SCC_WORKER: /* TODO: implement may_launch? */ _STARPU_DEBUG("waiting for worker %u initialization\n", worker); STARPU_PTHREAD_MUTEX_LOCK(&workerarg->mutex); while (!workerarg->worker_is_initialized) STARPU_PTHREAD_COND_WAIT(&workerarg->ready_cond, &workerarg->mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&workerarg->mutex); break; default: STARPU_ABORT(); } } _STARPU_DEBUG("finished launching drivers\n"); } /* Initialize the starpu_conf with default values */ int starpu_conf_init(struct starpu_conf *conf) { if (!conf) return -EINVAL; memset(conf, 0, sizeof(*conf)); conf->magic = 42; conf->sched_policy_name = starpu_getenv("STARPU_SCHED"); conf->sched_policy = NULL; conf->global_sched_ctx_min_priority = starpu_get_env_number("STARPU_MIN_PRIO"); conf->global_sched_ctx_max_priority = starpu_get_env_number("STARPU_MAX_PRIO"); /* Note that starpu_get_env_number returns -1 in case the variable is * not defined */ /* Backward compatibility: check the value of STARPU_NCPUS if * STARPU_NCPU is not set. */ conf->ncpus = starpu_get_env_number("STARPU_NCPU"); if (conf->ncpus == -1) conf->ncpus = starpu_get_env_number("STARPU_NCPUS"); conf->ncuda = starpu_get_env_number("STARPU_NCUDA"); conf->nopencl = starpu_get_env_number("STARPU_NOPENCL"); conf->nmic = starpu_get_env_number("STARPU_NMIC"); conf->nscc = starpu_get_env_number("STARPU_NSCC"); conf->calibrate = starpu_get_env_number("STARPU_CALIBRATE"); conf->bus_calibrate = starpu_get_env_number("STARPU_BUS_CALIBRATE"); conf->mic_sink_program_path = starpu_getenv("STARPU_MIC_PROGRAM_PATH"); if (conf->calibrate == -1) conf->calibrate = 0; if (conf->bus_calibrate == -1) conf->bus_calibrate = 0; conf->use_explicit_workers_bindid = 0; /* TODO */ conf->use_explicit_workers_cuda_gpuid = 0; /* TODO */ conf->use_explicit_workers_opencl_gpuid = 0; /* TODO */ conf->use_explicit_workers_mic_deviceid = 0; /* TODO */ conf->use_explicit_workers_scc_deviceid = 0; /* TODO */ conf->single_combined_worker = starpu_get_env_number("STARPU_SINGLE_COMBINED_WORKER"); if (conf->single_combined_worker == -1) conf->single_combined_worker = 0; #if defined(STARPU_DISABLE_ASYNCHRONOUS_COPY) conf->disable_asynchronous_copy = 1; #else conf->disable_asynchronous_copy = starpu_get_env_number("STARPU_DISABLE_ASYNCHRONOUS_COPY"); if (conf->disable_asynchronous_copy == -1) conf->disable_asynchronous_copy = 0; #endif #if defined(STARPU_DISABLE_ASYNCHRONOUS_CUDA_COPY) conf->disable_asynchronous_cuda_copy = 1; #else conf->disable_asynchronous_cuda_copy = starpu_get_env_number("STARPU_DISABLE_ASYNCHRONOUS_CUDA_COPY"); if (conf->disable_asynchronous_cuda_copy == -1) conf->disable_asynchronous_cuda_copy = 0; #endif #if defined(STARPU_DISABLE_ASYNCHRONOUS_OPENCL_COPY) conf->disable_asynchronous_opencl_copy = 1; #else conf->disable_asynchronous_opencl_copy = starpu_get_env_number("STARPU_DISABLE_ASYNCHRONOUS_OPENCL_COPY"); if (conf->disable_asynchronous_opencl_copy == -1) conf->disable_asynchronous_opencl_copy = 0; #endif #if defined(STARPU_DISABLE_ASYNCHRONOUS_MIC_COPY) conf->disable_asynchronous_mic_copy = 1; #else conf->disable_asynchronous_mic_copy = starpu_get_env_number("STARPU_DISABLE_ASYNCHRONOUS_MIC_COPY"); if (conf->disable_asynchronous_mic_copy == -1) conf->disable_asynchronous_mic_copy = 0; #endif /* 64MiB by default */ conf->trace_buffer_size = starpu_get_env_number_default("STARPU_TRACE_BUFFER_SIZE", 64) << 20; return 0; } static void _starpu_conf_set_value_against_environment(char *name, int *value) { int number; number = starpu_get_env_number(name); if (number != -1) { *value = number; } } void _starpu_conf_check_environment(struct starpu_conf *conf) { char *sched = starpu_getenv("STARPU_SCHED"); if (sched) { conf->sched_policy_name = sched; } _starpu_conf_set_value_against_environment("STARPU_NCPUS", &conf->ncpus); _starpu_conf_set_value_against_environment("STARPU_NCPU", &conf->ncpus); _starpu_conf_set_value_against_environment("STARPU_NCUDA", &conf->ncuda); _starpu_conf_set_value_against_environment("STARPU_NOPENCL", &conf->nopencl); _starpu_conf_set_value_against_environment("STARPU_CALIBRATE", &conf->calibrate); _starpu_conf_set_value_against_environment("STARPU_BUS_CALIBRATE", &conf->bus_calibrate); #ifdef STARPU_SIMGRID if (conf->calibrate == 2) { _STARPU_DISP("Warning: History will be cleared due to calibrate or STARPU_CALIBRATE being set to 2. This will prevent simgrid from having task simulation times!"); } if (conf->bus_calibrate) { _STARPU_DISP("Warning: Bus calibration will be cleared due to bus_calibrate or STARPU_BUS_CALIBRATE being set. This will prevent simgrid from having data transfer simulation times!"); } #endif _starpu_conf_set_value_against_environment("STARPU_SINGLE_COMBINED_WORKER", &conf->single_combined_worker); _starpu_conf_set_value_against_environment("STARPU_DISABLE_ASYNCHRONOUS_COPY", &conf->disable_asynchronous_copy); _starpu_conf_set_value_against_environment("STARPU_DISABLE_ASYNCHRONOUS_CUDA_COPY", &conf->disable_asynchronous_cuda_copy); _starpu_conf_set_value_against_environment("STARPU_DISABLE_ASYNCHRONOUS_OPENCL_COPY", &conf->disable_asynchronous_opencl_copy); _starpu_conf_set_value_against_environment("STARPU_DISABLE_ASYNCHRONOUS_MIC_COPY", &conf->disable_asynchronous_mic_copy); } struct starpu_tree* starpu_workers_get_tree(void) { return _starpu_config.topology.tree; } #ifdef STARPU_HAVE_HWLOC static void _fill_tree(struct starpu_tree *tree, hwloc_obj_t curr_obj, unsigned depth, hwloc_topology_t topology, struct starpu_tree *father) { unsigned i, j; unsigned arity; if (curr_obj->arity == 1) { /* Nothing interestin here, skip level */ _fill_tree(tree, curr_obj->children[0], depth+1, topology, father); return; } starpu_tree_insert(tree, curr_obj->logical_index, depth, curr_obj->type == HWLOC_OBJ_PU, curr_obj->arity, father); arity = 0; for(i = 0; i < curr_obj->arity; i++) { hwloc_obj_t child = curr_obj->children[i]; if (child->type == HWLOC_OBJ_BRIDGE && (!child->cpuset || hwloc_bitmap_iszero(child->cpuset))) /* I/O stuff, stop caring */ continue; arity++; } starpu_tree_prepare_children(arity, tree); j = 0; for(i = 0; i < arity; i++) { hwloc_obj_t child = curr_obj->children[i]; if (child->type == HWLOC_OBJ_BRIDGE && (!child->cpuset || hwloc_bitmap_iszero(child->cpuset))) /* I/O stuff, stop caring */ continue; #if 0 char string[128]; hwloc_obj_snprintf(string, sizeof(string), topology, child, "#", 0); printf("%*s%s %d is_pu %d \n", 0, "", string, child->logical_index, child->type == HWLOC_OBJ_PU); #endif _fill_tree(&tree->nodes[j], child, depth+1, topology, tree); j++; } } #endif static void _starpu_build_tree(void) { #ifdef STARPU_HAVE_HWLOC struct starpu_tree *tree; _STARPU_MALLOC(tree, sizeof(struct starpu_tree)); _starpu_config.topology.tree = tree; hwloc_obj_t root = hwloc_get_root_obj(_starpu_config.topology.hwtopology); #if 0 char string[128]; hwloc_obj_snprintf(string, sizeof(string), topology, root, "#", 0); printf("%*s%s %d is_pu = %d \n", 0, "", string, root->logical_index, root->type == HWLOC_OBJ_PU); #endif /* level, is_pu, is in the tree (it will be true only after add) */ _fill_tree(tree, root, 0, _starpu_config.topology.hwtopology, NULL); #endif } int starpu_init(struct starpu_conf *user_conf) { return starpu_initialize(user_conf, NULL, NULL); } int starpu_initialize(struct starpu_conf *user_conf, int *argc, char ***argv) { int is_a_sink = 0; /* Always defined. If the MP infrastructure is not * used, we cannot be a sink. */ unsigned worker; (void)argc; (void)argv; /* This initializes _starpu_silent, thus needs to be early */ _starpu_util_init(); #ifdef STARPU_SIMGRID /* This initializes the simgrid thread library, thus needs to be early */ _starpu_simgrid_init(argc, argv); #endif STARPU_PTHREAD_MUTEX_LOCK(&init_mutex); while (initialized == CHANGING) /* Wait for the other one changing it */ STARPU_PTHREAD_COND_WAIT(&init_cond, &init_mutex); init_count++; if (initialized == INITIALIZED) { /* He initialized it, don't do it again, and let the others get the mutex */ STARPU_PTHREAD_MUTEX_UNLOCK(&init_mutex); return 0; } /* initialized == UNINITIALIZED */ initialized = CHANGING; STARPU_PTHREAD_MUTEX_UNLOCK(&init_mutex); #ifdef STARPU_USE_MP _starpu_set_argc_argv(argc, argv); #ifdef STARPU_USE_SCC /* In SCC case we look at the rank to know if we are a sink */ if (_starpu_scc_common_mp_init() && !_starpu_scc_common_is_src_node()) setenv("STARPU_SINK", "STARPU_SCC", 1); #endif /* If StarPU was configured to use MP sinks, we have to control the * kind on node we are running on : host or sink ? */ if (starpu_getenv("STARPU_SINK")) is_a_sink = 1; #endif /* STARPU_USE_MP */ int ret; #ifdef STARPU_OPENMP _starpu_omp_dummy_init(); #endif #ifdef STARPU_SIMGRID /* Warn when the lots of stacks malloc()-ated by simgrid for transfer * processes will take a long time to get initialized */ char *perturb = starpu_getenv("MALLOC_PERTURB_"); if (perturb && perturb[0] && atoi(perturb) != 0) _STARPU_DISP("Warning: MALLOC_PERTURB_ is set to non-zero, this makes simgrid run very slow\n"); #else #ifdef __GNUC__ #ifndef __OPTIMIZE__ _STARPU_DISP("Warning: StarPU was configured with --enable-debug (-O0), and is thus not optimized\n"); #endif #endif #ifdef STARPU_SPINLOCK_CHECK _STARPU_DISP("Warning: StarPU was configured with --enable-spinlock-check, which slows down a bit\n"); #endif #if 0 #ifndef STARPU_NO_ASSERT _STARPU_DISP("Warning: StarPU was configured without --enable-fast\n"); #endif #endif #ifdef STARPU_MEMORY_STATS _STARPU_DISP("Warning: StarPU was configured with --enable-memory-stats, which slows down a bit\n"); #endif #ifdef STARPU_VERBOSE _STARPU_DISP("Warning: StarPU was configured with --enable-verbose, which slows down a bit\n"); #endif #ifdef STARPU_USE_FXT _STARPU_DISP("Warning: StarPU was configured with --with-fxt, which slows down a bit, limits scalability and makes worker initialization sequential\n"); #endif #ifdef STARPU_PERF_DEBUG _STARPU_DISP("Warning: StarPU was configured with --enable-perf-debug, which slows down a bit\n"); #endif #ifdef STARPU_MODEL_DEBUG _STARPU_DISP("Warning: StarPU was configured with --enable-model-debug, which slows down a bit\n"); #endif #ifdef STARPU_ENABLE_STATS _STARPU_DISP("Warning: StarPU was configured with --enable-stats, which slows down a bit\n"); #endif #ifdef __linux__ { struct utsname buf; if (uname(&buf) == 0 && (!strncmp(buf.release, "4.7.", 4) || !strncmp(buf.release, "4.8.", 4))) _STARPU_DISP("Warning: This system is running a 4.7 or 4.8 kernel. These have a severe scheduling performance regression issue, please upgrade to at least 4.9.\n"); } #endif #endif #if defined(_WIN32) && !defined(__CYGWIN__) WSADATA wsadata; WSAStartup(MAKEWORD(1,0), &wsadata); #endif STARPU_AYU_PREINIT(); /* store the pointer to the user explicit configuration during the * initialization */ if (user_conf == NULL) starpu_conf_init(&_starpu_config.conf); else { if (user_conf->magic != 42) { _STARPU_DISP("starpu_conf structure needs to be initialized with starpu_conf_init\n"); return -EINVAL; } _starpu_config.conf = *user_conf; } _starpu_conf_check_environment(&_starpu_config.conf); /* Make a copy of arrays */ if (_starpu_config.conf.sched_policy_name) _starpu_config.conf.sched_policy_name = strdup(_starpu_config.conf.sched_policy_name); if (_starpu_config.conf.mic_sink_program_path) _starpu_config.conf.mic_sink_program_path = strdup(_starpu_config.conf.mic_sink_program_path); if (_starpu_config.conf.n_cuda_opengl_interoperability) { size_t size = _starpu_config.conf.n_cuda_opengl_interoperability * sizeof(*_starpu_config.conf.cuda_opengl_interoperability); unsigned *copy; _STARPU_MALLOC(copy, size); memcpy(copy, _starpu_config.conf.cuda_opengl_interoperability, size); _starpu_config.conf.cuda_opengl_interoperability = copy; } if (_starpu_config.conf.n_not_launched_drivers) { size_t size = _starpu_config.conf.n_not_launched_drivers * sizeof(*_starpu_config.conf.not_launched_drivers); struct starpu_driver *copy; _STARPU_MALLOC(copy, size); memcpy(copy, _starpu_config.conf.not_launched_drivers, size); _starpu_config.conf.not_launched_drivers = copy; } _starpu_sched_init(); _starpu_job_init(); _starpu_graph_init(); _starpu_init_all_sched_ctxs(&_starpu_config); _starpu_init_progression_hooks(); _starpu_init_tags(); #ifdef STARPU_USE_FXT _starpu_fxt_init_profiling(_starpu_config.conf.trace_buffer_size); #endif _starpu_open_debug_logfile(); _starpu_data_interface_init(); _starpu_timing_init(); _starpu_profiling_init(); _starpu_load_bus_performance_files(); /* Depending on whether we are a MP sink or not, we must build the * topology with MP nodes or not. */ ret = _starpu_build_topology(&_starpu_config, is_a_sink); if (ret) { starpu_perfmodel_free_sampling_directories(); STARPU_PTHREAD_MUTEX_LOCK(&init_mutex); init_count--; _starpu_destroy_machine_config(&_starpu_config); #ifdef STARPU_USE_SCC if (_starpu_scc_common_is_mp_initialized()) _starpu_scc_src_mp_deinit(); #endif initialized = UNINITIALIZED; /* Let somebody else try to do it */ STARPU_PTHREAD_COND_SIGNAL(&init_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&init_mutex); #ifdef STARPU_USE_FXT _starpu_stop_fxt_profiling(); #endif return ret; } _starpu_task_init(); for (worker = 0; worker < _starpu_config.topology.nworkers; worker++) _starpu_worker_init(&_starpu_config.workers[worker], &_starpu_config); check_entire_platform = starpu_get_env_number("STARPU_CHECK_ENTIRE_PLATFORM"); _starpu_config.disable_kernels = starpu_get_env_number("STARPU_DISABLE_KERNELS"); STARPU_PTHREAD_KEY_CREATE(&_starpu_worker_key, NULL); STARPU_PTHREAD_KEY_CREATE(&_starpu_worker_set_key, NULL); _starpu_keys_initialized = 1; _starpu_build_tree(); if (!is_a_sink) { struct starpu_sched_policy *selected_policy = _starpu_select_sched_policy(&_starpu_config, _starpu_config.conf.sched_policy_name); _starpu_create_sched_ctx(selected_policy, NULL, -1, 1, "init", (_starpu_config.conf.global_sched_ctx_min_priority != -1), _starpu_config.conf.global_sched_ctx_min_priority, (_starpu_config.conf.global_sched_ctx_min_priority != -1), _starpu_config.conf.global_sched_ctx_max_priority, 1); } _starpu_initialize_registered_performance_models(); /* Launch "basic" workers (ie. non-combined workers) */ if (!is_a_sink) _starpu_launch_drivers(&_starpu_config); /* Allocate swap, if any */ _starpu_swap_init(); _starpu_watchdog_init(); _starpu_profiling_start(); STARPU_PTHREAD_MUTEX_LOCK(&init_mutex); initialized = INITIALIZED; /* Tell everybody that we initialized */ STARPU_PTHREAD_COND_BROADCAST(&init_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&init_mutex); _STARPU_DEBUG("Initialisation finished\n"); #ifdef STARPU_USE_MP /* Finally, if we are a MP sink, we never leave this function. Else, * we enter an infinite event loop which listen for MP commands from * the source. */ if (is_a_sink) { _starpu_sink_common_worker(); /* We should normally never leave the loop as we don't want to * really initialize STARPU */ STARPU_ASSERT(0); } #endif return 0; } /* * Handle runtime termination */ static void _starpu_terminate_workers(struct _starpu_machine_config *pconfig) { int status = 0; unsigned workerid; unsigned n; starpu_wake_all_blocked_workers(); for (workerid = 0; workerid < pconfig->topology.nworkers; workerid++) { _STARPU_DEBUG("wait for worker %u\n", workerid); struct _starpu_worker_set *set = pconfig->workers[workerid].set; struct _starpu_worker *worker = &pconfig->workers[workerid]; /* in case StarPU termination code is called from a callback, * we have to check if pthread_self() is the worker itself */ if (set) { if (set->started) { #ifdef STARPU_SIMGRID status = starpu_pthread_join(set->worker_thread, NULL); #else if (!pthread_equal(pthread_self(), set->worker_thread)) status = starpu_pthread_join(set->worker_thread, NULL); #endif if (status) { #ifdef STARPU_VERBOSE _STARPU_DEBUG("starpu_pthread_join -> %d\n", status); #endif } set->started = 0; } } else { if (!worker->run_by_starpu) goto out; #ifdef STARPU_SIMGRID status = starpu_pthread_join(worker->worker_thread, NULL); #else if (!pthread_equal(pthread_self(), worker->worker_thread)) status = starpu_pthread_join(worker->worker_thread, NULL); #endif if (status) { #ifdef STARPU_VERBOSE _STARPU_DEBUG("starpu_pthread_join -> %d\n", status); #endif } } out: STARPU_ASSERT(starpu_task_list_empty(&worker->local_tasks)); for (n = 0; n < worker->local_ordered_tasks_size; n++) STARPU_ASSERT(worker->local_ordered_tasks[n] == NULL); _starpu_sched_ctx_list_delete(&worker->sched_ctx_list); free(worker->local_ordered_tasks); } } /* Condition variable and mutex used to pause/resume. */ static starpu_pthread_cond_t pause_cond = STARPU_PTHREAD_COND_INITIALIZER; static starpu_pthread_mutex_t pause_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; void _starpu_may_pause(void) { /* pause_depth is just protected by a memory barrier */ STARPU_RMB(); if (STARPU_UNLIKELY(_starpu_config.pause_depth > 0)) { STARPU_PTHREAD_MUTEX_LOCK(&pause_mutex); if (_starpu_config.pause_depth > 0) { STARPU_PTHREAD_COND_WAIT(&pause_cond, &pause_mutex); } STARPU_PTHREAD_MUTEX_UNLOCK(&pause_mutex); } } void starpu_pause() { STARPU_HG_DISABLE_CHECKING(_starpu_config.pause_depth); _starpu_config.pause_depth += 1; } void starpu_resume() { STARPU_PTHREAD_MUTEX_LOCK(&pause_mutex); _starpu_config.pause_depth -= 1; if (!_starpu_config.pause_depth) { STARPU_PTHREAD_COND_BROADCAST(&pause_cond); } STARPU_PTHREAD_MUTEX_UNLOCK(&pause_mutex); } unsigned _starpu_worker_can_block(unsigned memnode STARPU_ATTRIBUTE_UNUSED, struct _starpu_worker *worker STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_NON_BLOCKING_DRIVERS return 0; #else unsigned can_block = 1; struct starpu_driver driver; driver.type = worker->arch; switch (driver.type) { case STARPU_CPU_WORKER: driver.id.cpu_id = worker->devid; break; case STARPU_CUDA_WORKER: driver.id.cuda_id = worker->devid; break; #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_WORKER: starpu_opencl_get_device(worker->devid, &driver.id.opencl_id); break; #endif default: goto always_launch; } if (!_starpu_may_launch_driver(&_starpu_config.conf, &driver)) return 0; always_launch: #ifndef STARPU_SIMGRID if (!_starpu_check_that_no_data_request_exists(memnode)) can_block = 0; #endif if (!_starpu_machine_is_running()) can_block = 0; if (!_starpu_execute_registered_progression_hooks()) can_block = 0; return can_block; #endif } static void _starpu_kill_all_workers(struct _starpu_machine_config *pconfig) { /* set the flag which will tell workers to stop */ ANNOTATE_HAPPENS_AFTER(&_starpu_config.running); pconfig->running = 0; /* running is just protected by a memory barrier */ ANNOTATE_HAPPENS_BEFORE(&_starpu_config.running); STARPU_WMB(); starpu_wake_all_blocked_workers(); } void starpu_display_stats() { starpu_profiling_bus_helper_display_summary(); starpu_profiling_worker_helper_display_summary(); } void starpu_shutdown(void) { STARPU_PTHREAD_MUTEX_LOCK(&init_mutex); init_count--; STARPU_ASSERT_MSG(init_count >= 0, "Number of calls to starpu_shutdown() can not be higher than the number of calls to starpu_init()\n"); if (init_count) { _STARPU_DEBUG("Still somebody needing StarPU, don't deinitialize\n"); STARPU_PTHREAD_MUTEX_UNLOCK(&init_mutex); return; } /* We're last */ initialized = CHANGING; STARPU_PTHREAD_MUTEX_UNLOCK(&init_mutex); /* If the workers are frozen, no progress can be made. */ STARPU_ASSERT(_starpu_config.pause_depth <= 0); starpu_task_wait_for_no_ready(); /* tell all workers to shutdown */ _starpu_kill_all_workers(&_starpu_config); _starpu_free_all_automatically_allocated_buffers(STARPU_MAIN_RAM); { int stats = starpu_get_env_number("STARPU_STATS"); if (stats != 0) { _starpu_display_msi_stats(stderr); _starpu_display_alloc_cache_stats(stderr); _starpu_display_comm_amounts(stderr); } } starpu_profiling_bus_helper_display_summary(); starpu_profiling_worker_helper_display_summary(); _starpu_deinitialize_registered_performance_models(); _starpu_watchdog_shutdown(); /* wait for their termination */ _starpu_terminate_workers(&_starpu_config); { int stats = starpu_get_env_number("STARPU_MEMORY_STATS"); if (stats != 0) { // Display statistics on data which have not been unregistered starpu_data_display_memory_stats(); } } _starpu_delete_all_sched_ctxs(); _starpu_sched_component_workers_destroy(); _starpu_top_shutdown(); _starpu_disk_unregister(); #ifdef STARPU_HAVE_HWLOC starpu_tree_free(_starpu_config.topology.tree); free(_starpu_config.topology.tree); #endif _starpu_destroy_topology(&_starpu_config); #ifdef STARPU_USE_FXT _starpu_stop_fxt_profiling(); #endif _starpu_data_interface_shutdown(); _starpu_job_fini(); /* Drop all remaining tags */ _starpu_tag_clear(); #ifdef STARPU_OPENMP _starpu_omp_dummy_shutdown(); #endif _starpu_close_debug_logfile(); _starpu_keys_initialized = 0; STARPU_PTHREAD_KEY_DELETE(_starpu_worker_key); STARPU_PTHREAD_KEY_DELETE(_starpu_worker_set_key); _starpu_task_deinit(); STARPU_PTHREAD_MUTEX_LOCK(&init_mutex); initialized = UNINITIALIZED; /* Let someone else that wants to initialize it again do it */ STARPU_PTHREAD_COND_SIGNAL(&init_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&init_mutex); /* Clear memory */ free((char*) _starpu_config.conf.sched_policy_name); free(_starpu_config.conf.mic_sink_program_path); if (_starpu_config.conf.n_cuda_opengl_interoperability) free(_starpu_config.conf.cuda_opengl_interoperability); if (_starpu_config.conf.n_not_launched_drivers) free(_starpu_config.conf.not_launched_drivers); STARPU_AYU_FINISH(); #ifdef STARPU_USE_SCC if (_starpu_scc_common_is_mp_initialized()) _starpu_scc_src_mp_deinit(); #endif _starpu_print_idle_time(); _STARPU_DEBUG("Shutdown finished\n"); #ifdef STARPU_SIMGRID /* This finalizes the simgrid thread library, thus needs to be late */ _starpu_simgrid_deinit(); #endif } #undef starpu_worker_get_count unsigned starpu_worker_get_count(void) { return _starpu_config.topology.nworkers; } unsigned starpu_worker_is_slave(int workerid) { return _starpu_config.workers[workerid].slave; } int starpu_worker_get_count_by_type(enum starpu_worker_archtype type) { switch (type) { case STARPU_CPU_WORKER: return _starpu_config.topology.ncpus; case STARPU_CUDA_WORKER: return _starpu_config.topology.ncudagpus * _starpu_config.topology.nworkerpercuda; case STARPU_OPENCL_WORKER: return _starpu_config.topology.nopenclgpus; case STARPU_MIC_WORKER: return _starpu_config.topology.nmicdevices; case STARPU_SCC_WORKER: return _starpu_config.topology.nsccdevices; case STARPU_ANY_WORKER: return _starpu_config.topology.ncpus+ _starpu_config.topology.ncudagpus * _starpu_config.topology.nworkerpercuda+ _starpu_config.topology.nopenclgpus+ _starpu_config.topology.nmicdevices+ _starpu_config.topology.nsccdevices; default: return -EINVAL; } } unsigned starpu_combined_worker_get_count(void) { return _starpu_config.topology.ncombinedworkers; } unsigned starpu_cpu_worker_get_count(void) { return _starpu_config.topology.ncpus; } unsigned starpu_cuda_worker_get_count(void) { return _starpu_config.topology.ncudagpus * _starpu_config.topology.nworkerpercuda; } unsigned starpu_opencl_worker_get_count(void) { return _starpu_config.topology.nopenclgpus; } int starpu_asynchronous_copy_disabled(void) { return _starpu_config.conf.disable_asynchronous_copy; } int starpu_asynchronous_cuda_copy_disabled(void) { return _starpu_config.conf.disable_asynchronous_cuda_copy; } int starpu_asynchronous_opencl_copy_disabled(void) { return _starpu_config.conf.disable_asynchronous_opencl_copy; } int starpu_asynchronous_mic_copy_disabled(void) { return _starpu_config.conf.disable_asynchronous_mic_copy; } unsigned starpu_mic_worker_get_count(void) { int i = 0, count = 0; for (i = 0; i < STARPU_MAXMICDEVS; i++) count += _starpu_config.topology.nmiccores[i]; return count; } unsigned starpu_scc_worker_get_count(void) { return _starpu_config.topology.nsccdevices; } /* When analyzing performance, it is useful to see what is the processing unit * that actually performed the task. This function returns the id of the * processing unit actually executing it, therefore it makes no sense to use it * within the callbacks of SPU functions for instance. If called by some thread * that is not controlled by StarPU, starpu_worker_get_id returns -1. */ #undef starpu_worker_get_id int starpu_worker_get_id(void) { struct _starpu_worker * worker; worker = _starpu_get_local_worker_key(); if (worker) { return worker->workerid; } else { /* there is no worker associated to that thread, perhaps it is * a thread from the application or this is some SPU worker */ return -1; } } #define starpu_worker_get_id _starpu_worker_get_id #undef _starpu_worker_get_id_check unsigned _starpu_worker_get_id_check(const char *f, int l) { int id = _starpu_worker_get_id(); STARPU_ASSERT_MSG(id>=0, "%s:%d Cannot be called from outside a worker\n", f, l); return id; } int starpu_combined_worker_get_id(void) { struct _starpu_worker *worker; worker = _starpu_get_local_worker_key(); if (worker) { return worker->combined_workerid; } else { /* there is no worker associated to that thread, perhaps it is * a thread from the application or this is some SPU worker */ return -1; } } int starpu_combined_worker_get_size(void) { struct _starpu_worker *worker; worker = _starpu_get_local_worker_key(); if (worker) { return worker->worker_size; } else { /* there is no worker associated to that thread, perhaps it is * a thread from the application or this is some SPU worker */ return -1; } } int starpu_combined_worker_get_rank(void) { struct _starpu_worker *worker; worker = _starpu_get_local_worker_key(); if (worker) { return worker->current_rank; } else { /* there is no worker associated to that thread, perhaps it is * a thread from the application or this is some SPU worker */ return -1; } } int starpu_worker_get_subworkerid(int id) { return _starpu_config.workers[id].subworkerid; } int starpu_worker_get_devid(int id) { return _starpu_config.workers[id].devid; } unsigned starpu_worker_is_combined_worker(int id) { return id >= (int)_starpu_config.topology.nworkers; } struct _starpu_combined_worker *_starpu_get_combined_worker_struct(unsigned id) { unsigned basic_worker_count = starpu_worker_get_count(); //_STARPU_DEBUG("basic_worker_count:%d\n",basic_worker_count); STARPU_ASSERT(id >= basic_worker_count); return &_starpu_config.combined_workers[id - basic_worker_count]; } enum starpu_worker_archtype starpu_worker_get_type(int id) { return _starpu_config.workers[id].arch; } int starpu_worker_get_ids_by_type(enum starpu_worker_archtype type, int *workerids, int maxsize) { unsigned nworkers = starpu_worker_get_count(); int cnt = 0; unsigned id; for (id = 0; id < nworkers; id++) { if (type == STARPU_ANY_WORKER || starpu_worker_get_type(id) == type) { /* Perhaps the array is too small ? */ if (cnt >= maxsize) return -ERANGE; workerids[cnt++] = id; } } return cnt; } int starpu_worker_get_by_type(enum starpu_worker_archtype type, int num) { unsigned nworkers = starpu_worker_get_count(); int cnt = 0; unsigned id; for (id = 0; id < nworkers; id++) { if (type == STARPU_ANY_WORKER || starpu_worker_get_type(id) == type) { if (num == cnt) return id; cnt++; } } /* Not found */ return -1; } int starpu_worker_get_by_devid(enum starpu_worker_archtype type, int devid) { unsigned nworkers = starpu_worker_get_count(); unsigned id; for (id = 0; id < nworkers; id++) if (starpu_worker_get_type(id) == type && starpu_worker_get_devid(id) == devid) return id; /* Not found */ return -1; } void starpu_worker_get_name(int id, char *dst, size_t maxlen) { char *name = _starpu_config.workers[id].name; snprintf(dst, maxlen, "%s", name); } int starpu_worker_get_bindid(int workerid) { return _starpu_config.workers[workerid].bindid; } int _starpu_bindid_get_workerids(int bindid, int **workerids) { if (bindid >= (int) _starpu_config.nbindid) return 0; *workerids = _starpu_config.bindid_workers[bindid].workerids; return _starpu_config.bindid_workers[bindid].nworkers; } void starpu_worker_get_sched_condition(int workerid, starpu_pthread_mutex_t **sched_mutex, starpu_pthread_cond_t **sched_cond) { *sched_cond = &_starpu_config.workers[workerid].sched_cond; *sched_mutex = &_starpu_config.workers[workerid].sched_mutex; } int starpu_wakeup_worker_locked(int workerid, starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex STARPU_ATTRIBUTE_UNUSED) { if (_starpu_config.workers[workerid].status == STATUS_SLEEPING) { _starpu_config.workers[workerid].status = STATUS_WAKING_UP; STARPU_PTHREAD_COND_SIGNAL(cond); return 1; } return 0; } int starpu_wakeup_worker(int workerid, starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex) { int success; STARPU_PTHREAD_MUTEX_LOCK_SCHED(mutex); success = starpu_wakeup_worker_locked(workerid, cond, mutex); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(mutex); return success; } int starpu_wake_worker_locked(int workerid) { starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond); return starpu_wakeup_worker_locked(workerid, sched_cond, sched_mutex); } int starpu_wake_worker(int workerid) { starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond); return starpu_wakeup_worker(workerid, sched_cond, sched_mutex); } int starpu_worker_get_nids_by_type(enum starpu_worker_archtype type, int *workerids, int maxsize) { unsigned nworkers = starpu_worker_get_count(); int cnt = 0; unsigned id; for (id = 0; id < nworkers; id++) { if (type == STARPU_ANY_WORKER || starpu_worker_get_type(id) == type) { /* Perhaps the array is too small ? */ if (cnt >= maxsize) return cnt; workerids[cnt++] = id; } } return cnt; } int starpu_worker_get_nids_ctx_free_by_type(enum starpu_worker_archtype type, int *workerids, int maxsize) { unsigned nworkers = starpu_worker_get_count(); int cnt = 0; unsigned id; for (id = 0; id < nworkers; id++) { if (type == STARPU_ANY_WORKER || starpu_worker_get_type(id) == type) { /* Perhaps the array is too small ? */ if (cnt >= maxsize) return cnt; unsigned found = 0; int s; for(s = 1; s < STARPU_NMAX_SCHED_CTXS; s++) { if(_starpu_config.sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS) { struct starpu_worker_collection *workers = _starpu_config.sched_ctxs[s].workers; struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { unsigned worker = workers->get_next(workers, &it); if(worker == id) { found = 1; break; } } if(found) break; } } if(!found) workerids[cnt++] = id; } } return cnt; } static void * _starpu_get_worker_from_driver(struct starpu_driver *d) { unsigned nworkers = starpu_worker_get_count(); unsigned workerid; #ifdef STARPU_USE_CUDA if (d->type == STARPU_CUDA_WORKER) return &cuda_worker_set[d->id.cuda_id]; #endif for (workerid = 0; workerid < nworkers; workerid++) { if (starpu_worker_get_type(workerid) == d->type) { struct _starpu_worker *worker; worker = _starpu_get_worker_struct(workerid); switch (d->type) { #ifdef STARPU_USE_CPU case STARPU_CPU_WORKER: if (worker->devid == d->id.cpu_id) return worker; break; #endif #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_WORKER: { cl_device_id device; starpu_opencl_get_device(worker->devid, &device); if (device == d->id.opencl_id) return worker; break; } #endif default: _STARPU_DEBUG("Invalid device type\n"); return NULL; } } } return NULL; } int starpu_driver_run(struct starpu_driver *d) { if (!d) { _STARPU_DEBUG("Invalid argument\n"); return -EINVAL; } void *worker = _starpu_get_worker_from_driver(d); switch (d->type) { #ifdef STARPU_USE_CPU case STARPU_CPU_WORKER: return _starpu_run_cpu(worker); #endif #ifdef STARPU_USE_CUDA case STARPU_CUDA_WORKER: return _starpu_run_cuda(worker); #endif #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_WORKER: return _starpu_run_opencl(worker); #endif default: (void) worker; _STARPU_DEBUG("Invalid device type\n"); return -EINVAL; } } int starpu_driver_init(struct starpu_driver *d) { STARPU_ASSERT(d); void *worker = _starpu_get_worker_from_driver(d); switch (d->type) { #ifdef STARPU_USE_CPU case STARPU_CPU_WORKER: return _starpu_cpu_driver_init(worker); #endif #ifdef STARPU_USE_CUDA case STARPU_CUDA_WORKER: return _starpu_cuda_driver_init(worker); #endif #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_WORKER: return _starpu_opencl_driver_init(worker); #endif default: (void) worker; return -EINVAL; } } int starpu_driver_run_once(struct starpu_driver *d) { STARPU_ASSERT(d); void *worker = _starpu_get_worker_from_driver(d); switch (d->type) { #ifdef STARPU_USE_CPU case STARPU_CPU_WORKER: return _starpu_cpu_driver_run_once(worker); #endif #ifdef STARPU_USE_CUDA case STARPU_CUDA_WORKER: return _starpu_cuda_driver_run_once(worker); #endif #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_WORKER: return _starpu_opencl_driver_run_once(worker); #endif default: (void) worker; return -EINVAL; } } int starpu_driver_deinit(struct starpu_driver *d) { STARPU_ASSERT(d); void *worker = _starpu_get_worker_from_driver(d); switch (d->type) { #ifdef STARPU_USE_CPU case STARPU_CPU_WORKER: return _starpu_cpu_driver_deinit(worker); #endif #ifdef STARPU_USE_CUDA case STARPU_CUDA_WORKER: return _starpu_cuda_driver_deinit(worker); #endif #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_WORKER: return _starpu_opencl_driver_deinit(worker); #endif default: (void) worker; return -EINVAL; } } void starpu_get_version(int *major, int *minor, int *release) { *major = STARPU_MAJOR_VERSION; *minor = STARPU_MINOR_VERSION; *release = STARPU_RELEASE_VERSION; } void _starpu_unlock_mutex_if_prev_locked() { int workerid = starpu_worker_get_id(); if(workerid != -1) { struct _starpu_worker *w = _starpu_get_worker_struct(workerid); if(w->sched_mutex_locked) { STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&w->sched_mutex); _starpu_worker_set_flag_sched_mutex_locked(workerid, 1); } } return; } void _starpu_relock_mutex_if_prev_locked() { int workerid = starpu_worker_get_id(); if(workerid != -1) { struct _starpu_worker *w = _starpu_get_worker_struct(workerid); if(w->sched_mutex_locked) STARPU_PTHREAD_MUTEX_LOCK_SCHED(&w->sched_mutex); } return; } unsigned starpu_worker_get_sched_ctx_list(int workerid, unsigned **sched_ctxs) { unsigned s = 0; unsigned nsched_ctxs = _starpu_worker_get_nsched_ctxs(workerid); _STARPU_MALLOC(*sched_ctxs, nsched_ctxs*sizeof(unsigned)); struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); struct _starpu_sched_ctx_list *l = NULL; for (l = worker->sched_ctx_list; l; l = l->next) { (*sched_ctxs)[s++] = l->sched_ctx; } return nsched_ctxs; } char *starpu_worker_get_type_as_string(enum starpu_worker_archtype type) { if (type == STARPU_CPU_WORKER) return "STARPU_CPU_WORKER"; if (type == STARPU_CUDA_WORKER) return "STARPU_CUDA_WORKER"; if (type == STARPU_OPENCL_WORKER) return "STARPU_OPENCL_WORKER"; if (type == STARPU_MIC_WORKER) return "STARPU_MIC_WORKER"; if (type == STARPU_SCC_WORKER) return "STARPU_SCC_WORKER"; if (type == STARPU_ANY_WORKER) return "STARPU_ANY_WORKER"; return "STARPU_unknown_WORKER"; } starpu-1.2.3+dfsg/src/core/workers.h000066400000000000000000000465011320135501600173400ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2017 CNRS * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __WORKERS_H__ #define __WORKERS_H__ #include #include #include #include #include #include #include #include #include #include #include #ifdef STARPU_HAVE_HWLOC #include #endif #include #include #ifdef STARPU_USE_MIC #include #endif /* STARPU_USE_MIC */ #ifdef STARPU_USE_SCC #include #endif #include #include #include #define STARPU_MAX_PIPELINE 4 /* This is initialized from in _starpu_worker_init */ LIST_TYPE(_starpu_worker, struct _starpu_machine_config *config; starpu_pthread_mutex_t mutex; enum starpu_worker_archtype arch; /* what is the type of worker ? */ uint32_t worker_mask; /* what is the type of worker ? */ struct starpu_perfmodel_arch perf_arch; /* in case there are different models of the same arch */ starpu_pthread_t worker_thread; /* the thread which runs the worker */ unsigned devid; /* which cpu/gpu/etc is controlled by the worker ? */ unsigned subworkerid; /* which sub-worker this one is for the cpu/gpu */ int bindid; /* which cpu is the driver bound to ? (logical index) */ int workerid; /* uniquely identify the worker among all processing units types */ int combined_workerid; /* combined worker currently using this worker */ int current_rank; /* current rank in case the worker is used in a parallel fashion */ int worker_size; /* size of the worker in case we use a combined worker */ starpu_pthread_cond_t started_cond; /* indicate when the worker is ready */ starpu_pthread_cond_t ready_cond; /* indicate when the worker is ready */ unsigned memory_node; /* which memory node is the worker associated with ? */ starpu_pthread_cond_t sched_cond; /* condition variable used when the worker waits for tasks. */ starpu_pthread_mutex_t sched_mutex; /* mutex protecting sched_cond */ struct starpu_task_list local_tasks; /* this queue contains tasks that have been explicitely submitted to that queue */ struct starpu_task **local_ordered_tasks; /* this queue contains tasks that have been explicitely submitted to that queue with an explicit order */ unsigned local_ordered_tasks_size; /* this records the size of local_ordered_tasks */ unsigned current_ordered_task; /* this records the index (within local_ordered_tasks) of the next ordered task to be executed */ unsigned current_ordered_task_order; /* this records the order of the next ordered task to be executed */ struct starpu_task *current_task; /* task currently executed by this worker (non-pipelined version) */ struct starpu_task *current_tasks[STARPU_MAX_PIPELINE]; /* tasks currently executed by this worker (pipelined version) */ struct timespec cl_start; /* Codelet start time of the task currently running */ struct timespec cl_end; /* Codelet end time of the last task running */ unsigned char first_task; /* Index of first task in the pipeline */ unsigned char ntasks; /* number of tasks in the pipeline */ unsigned char pipeline_length; /* number of tasks to be put in the pipeline */ unsigned char pipeline_stuck; /* whether a task prevents us from pipelining */ struct _starpu_worker_set *set; /* in case this worker belongs to a set */ unsigned worker_is_running; unsigned worker_is_initialized; enum _starpu_worker_status status; /* what is the worker doing now ? (eg. CALLBACK) */ char name[64]; char short_name[10]; unsigned run_by_starpu; /* Is this run by StarPU or directly by the application ? */ struct _starpu_sched_ctx_list *sched_ctx_list; int tmp_sched_ctx; unsigned nsched_ctxs; /* the no of contexts a worker belongs to*/ struct _starpu_barrier_counter tasks_barrier; /* wait for the tasks submitted */ unsigned has_prev_init; /* had already been inited in another ctx */ unsigned removed_from_ctx[STARPU_NMAX_SCHED_CTXS+1]; unsigned spinning_backoff ; /* number of cycles to pause when spinning */ /* indicate whether the workers shares tasks lists with other workers*/ /* in this case when removing him from a context it disapears instantly */ unsigned shares_tasks_lists[STARPU_NMAX_SCHED_CTXS+1]; /* boolean to chose the next ctx a worker will pop into */ unsigned poped_in_ctx[STARPU_NMAX_SCHED_CTXS+1]; /* boolean indicating at which moment we checked all ctxs and change phase for the booleab poped_in_ctx*/ /* one for each of the 2 priorities*/ unsigned reverse_phase[2]; /* indicate which priority of ctx is currently active: the values are 0 or 1*/ unsigned pop_ctx_priority; /* flag to know if sched_mutex is locked or not */ unsigned sched_mutex_locked; /* bool to indicate if the worker is slave in a ctx */ unsigned slave; #ifdef __GLIBC__ cpu_set_t cpu_set; #endif /* __GLIBC__ */ #ifdef STARPU_HAVE_HWLOC hwloc_bitmap_t hwloc_cpu_set; #endif ); struct _starpu_combined_worker { struct starpu_perfmodel_arch perf_arch; /* in case there are different models of the same arch */ uint32_t worker_mask; /* what is the type of workers ? */ int worker_size; unsigned memory_node; /* which memory node is associated that worker to ? */ int combined_workerid[STARPU_NMAXWORKERS]; #ifdef STARPU_USE_MP int count; starpu_pthread_mutex_t count_mutex; #endif #ifdef __GLIBC__ cpu_set_t cpu_set; #endif /* __GLIBC__ */ #ifdef STARPU_HAVE_HWLOC hwloc_bitmap_t hwloc_cpu_set; #endif }; /* in case a single CPU worker may control multiple * accelerators (eg. Gordon for n SPUs) */ struct _starpu_worker_set { starpu_pthread_mutex_t mutex; starpu_pthread_t worker_thread; /* the thread which runs the worker */ unsigned nworkers; unsigned started; /* Only one thread for the whole set */ void *retval; struct _starpu_worker *workers; starpu_pthread_cond_t ready_cond; /* indicate when the set is ready */ unsigned set_is_initialized; }; struct _starpu_machine_topology { /* Total number of workers. */ unsigned nworkers; /* Total number of combined workers. */ unsigned ncombinedworkers; unsigned nsched_ctxs; #ifdef STARPU_HAVE_HWLOC /* Topology as detected by hwloc. */ hwloc_topology_t hwtopology; #endif /* custom hwloc tree*/ struct starpu_tree *tree; /* Total number of CPUs, as detected by the topology code. May * be different from the actual number of CPU workers. */ unsigned nhwcpus; /* Total number of PUs, as detected by the topology code. May * be different from the actual number of PU workers. */ unsigned nhwpus; /* Total number of CUDA devices, as detected. May be different * from the actual number of CUDA workers. */ unsigned nhwcudagpus; /* Total number of OpenCL devices, as detected. May be * different from the actual number of OpenCL workers. */ unsigned nhwopenclgpus; /* Total number of SCC cores, as detected. May be different * from the actual number of core workers. */ unsigned nhwscc; /* Actual number of CPU workers used by StarPU. */ unsigned ncpus; /* Actual number of CUDA GPUs used by StarPU. */ unsigned ncudagpus; unsigned nworkerpercuda; /* Actual number of OpenCL workers used by StarPU. */ unsigned nopenclgpus; /* Actual number of SCC workers used by StarPU. */ unsigned nsccdevices; /* Topology of MP nodes (mainly MIC and SCC) as well as necessary * objects to communicate with them. */ unsigned nhwmicdevices; unsigned nmicdevices; unsigned nhwmiccores[STARPU_MAXMICDEVS]; // Each MIC node has its set of cores. unsigned nmiccores[STARPU_MAXMICDEVS]; /* Indicates the successive logical PU identifier that should be used * to bind the workers. It is either filled according to the * user's explicit parameters (from starpu_conf) or according * to the STARPU_WORKERS_CPUID env. variable. Otherwise, a * round-robin policy is used to distributed the workers over * the cores. */ unsigned workers_bindid[STARPU_NMAXWORKERS]; /* Indicates the successive CUDA identifier that should be * used by the CUDA driver. It is either filled according to * the user's explicit parameters (from starpu_conf) or * according to the STARPU_WORKERS_CUDAID env. variable. * Otherwise, they are taken in ID order. */ unsigned workers_cuda_gpuid[STARPU_NMAXWORKERS]; /* Indicates the successive OpenCL identifier that should be * used by the OpenCL driver. It is either filled according * to the user's explicit parameters (from starpu_conf) or * according to the STARPU_WORKERS_OPENCLID env. variable. * Otherwise, they are taken in ID order. */ unsigned workers_opencl_gpuid[STARPU_NMAXWORKERS]; /** Indicates the successive MIC devices that should be used * by the MIC driver. It is either filled according to the * user's explicit parameters (from starpu_conf) or according * to the STARPU_WORKERS_MICID env. variable. Otherwise, they * are taken in ID order. */ /* TODO */ /* unsigned workers_mic_deviceid[STARPU_NMAXWORKERS]; */ /* Which SCC(s) do we use ? */ /* Indicates the successive SCC devices that should be used by * the SCC driver. It is either filled according to the * user's explicit parameters (from starpu_conf) or according * to the STARPU_WORKERS_SCCID env. variable. Otherwise, they * are taken in ID order. */ unsigned workers_scc_deviceid[STARPU_NMAXWORKERS]; }; struct _starpu_machine_config { struct _starpu_machine_topology topology; #ifdef STARPU_HAVE_HWLOC int cpu_depth; int pu_depth; #endif /* Where to bind next worker ? */ int current_bindid; char currently_bound[STARPU_NMAXWORKERS]; /* Which GPU(s) do we use for CUDA ? */ int current_cuda_gpuid; /* Which GPU(s) do we use for OpenCL ? */ int current_opencl_gpuid; /* Which MIC do we use? */ int current_mic_deviceid; /* Which SCC do we use? */ int current_scc_deviceid; /* Memory node for cpus, if only one */ int cpus_nodeid; /* Memory node for CUDA, if only one */ int cuda_nodeid; /* Memory node for OpenCL, if only one */ int opencl_nodeid; /* Memory node for MIC, if only one */ int mic_nodeid; /* Memory node for SCC, if only one */ int scc_nodeid; /* Basic workers : each of this worker is running its own driver and * can be combined with other basic workers. */ struct _starpu_worker workers[STARPU_NMAXWORKERS]; /* Combined workers: these worker are a combination of basic workers * that can run parallel tasks together. */ struct _starpu_combined_worker combined_workers[STARPU_NMAX_COMBINEDWORKERS]; /* Translation table from bindid to worker IDs */ struct { int *workerids; unsigned nworkers; /* size of workerids */ } *bindid_workers; unsigned nbindid; /* size of bindid_workers */ /* This bitmask indicates which kinds of worker are available. For * instance it is possible to test if there is a CUDA worker with * the result of (worker_mask & STARPU_CUDA). */ uint32_t worker_mask; /* either the user given configuration passed to starpu_init or a default configuration */ struct starpu_conf conf; /* this flag is set until the runtime is stopped */ unsigned running; int disable_kernels; /* Number of calls to starpu_pause() - calls to starpu_resume(). When >0, * StarPU should pause. */ int pause_depth; /* all the sched ctx of the current instance of starpu */ struct _starpu_sched_ctx sched_ctxs[STARPU_NMAX_SCHED_CTXS+1]; /* this flag is set until the application is finished submitting tasks */ unsigned submitting; int watchdog_ok; starpu_pthread_mutex_t submitted_mutex; }; extern struct _starpu_machine_config _starpu_config STARPU_ATTRIBUTE_INTERNAL; extern int _starpu_keys_initialized STARPU_ATTRIBUTE_INTERNAL; extern starpu_pthread_key_t _starpu_worker_key STARPU_ATTRIBUTE_INTERNAL; extern starpu_pthread_key_t _starpu_worker_set_key STARPU_ATTRIBUTE_INTERNAL; /* Three functions to manage argv, argc */ void _starpu_set_argc_argv(int *argc, char ***argv); int *_starpu_get_argc(); char ***_starpu_get_argv(); /* Fill conf with environment variables */ void _starpu_conf_check_environment(struct starpu_conf *conf); /* Called by the driver when it is ready to pause */ void _starpu_may_pause(void); /* Has starpu_shutdown already been called ? */ static inline unsigned _starpu_machine_is_running(void) { unsigned ret; /* running is just protected by a memory barrier */ STARPU_RMB(); ANNOTATE_HAPPENS_AFTER(&_starpu_config.running); ret = _starpu_config.running; ANNOTATE_HAPPENS_BEFORE(&_starpu_config.running); return ret; } /* Check if there is a worker that may execute the task. */ uint32_t _starpu_worker_exists(struct starpu_task *); /* Is there a worker that can execute CUDA code ? */ uint32_t _starpu_can_submit_cuda_task(void); /* Is there a worker that can execute CPU code ? */ uint32_t _starpu_can_submit_cpu_task(void); /* Is there a worker that can execute OpenCL code ? */ uint32_t _starpu_can_submit_opencl_task(void); /* Is there a worker that can execute OpenCL code ? */ uint32_t _starpu_can_submit_scc_task(void); /* Check whether there is anything that the worker should do instead of * sleeping (waiting on something to happen). */ unsigned _starpu_worker_can_block(unsigned memnode, struct _starpu_worker *worker); /* This function must be called to block a worker. It puts the worker in a * sleeping state until there is some event that forces the worker to wake up. * */ void _starpu_block_worker(int workerid, starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex); /* This function initializes the current driver for the given worker */ void _starpu_driver_start(struct _starpu_worker *worker, unsigned fut_key, unsigned sync); /* This function initializes the current thread for the given worker */ void _starpu_worker_start(struct _starpu_worker *worker, unsigned fut_key, unsigned sync); static inline unsigned _starpu_worker_get_count(void) { return _starpu_config.topology.nworkers; } #define starpu_worker_get_count _starpu_worker_get_count /* The _starpu_worker structure describes all the state of a StarPU worker. * This function sets the pthread key which stores a pointer to this structure. * */ static inline void _starpu_set_local_worker_key(struct _starpu_worker *worker) { STARPU_ASSERT(_starpu_keys_initialized); STARPU_PTHREAD_SETSPECIFIC(_starpu_worker_key, worker); } /* Returns the _starpu_worker structure that describes the state of the * current worker. */ static inline struct _starpu_worker *_starpu_get_local_worker_key(void) { if (!_starpu_keys_initialized) return NULL; return (struct _starpu_worker *) STARPU_PTHREAD_GETSPECIFIC(_starpu_worker_key); } /* The _starpu_worker_set structure describes all the state of a StarPU worker_set. * This function sets the pthread key which stores a pointer to this structure. * */ static inline void _starpu_set_local_worker_set_key(struct _starpu_worker_set *worker) { STARPU_ASSERT(_starpu_keys_initialized); STARPU_PTHREAD_SETSPECIFIC(_starpu_worker_set_key, worker); } /* Returns the _starpu_worker_set structure that describes the state of the * current worker_set. */ static inline struct _starpu_worker_set *_starpu_get_local_worker_set_key(void) { if (!_starpu_keys_initialized) return NULL; return (struct _starpu_worker_set *) STARPU_PTHREAD_GETSPECIFIC(_starpu_worker_set_key); } /* Returns the _starpu_worker structure that describes the state of the * specified worker. */ static inline struct _starpu_worker *_starpu_get_worker_struct(unsigned id) { STARPU_ASSERT(id < starpu_worker_get_count()); return &_starpu_config.workers[id]; } /* Returns the starpu_sched_ctx structure that descriebes the state of the * specified ctx */ static inline struct _starpu_sched_ctx *_starpu_get_sched_ctx_struct(unsigned id) { return (id == STARPU_NMAX_SCHED_CTXS) ? NULL : &_starpu_config.sched_ctxs[id]; } struct _starpu_combined_worker *_starpu_get_combined_worker_struct(unsigned id); int _starpu_is_initialized(void); /* Returns the structure that describes the overall machine configuration (eg. * all workers and topology). */ static inline struct _starpu_machine_config *_starpu_get_machine_config(void) { return &_starpu_config; } /* Return whether kernels should be run (<=0) or not (>0) */ static inline int _starpu_get_disable_kernels(void) { return _starpu_config.disable_kernels; } /* Retrieve the status which indicates what the worker is currently doing. */ static inline enum _starpu_worker_status _starpu_worker_get_status(int workerid) { return _starpu_config.workers[workerid].status; } /* Change the status of the worker which indicates what the worker is currently * doing (eg. executing a callback). */ static inline void _starpu_worker_set_status(int workerid, enum _starpu_worker_status status) { _starpu_config.workers[workerid].status = status; } /* We keep an initial sched ctx which might be used in case no other ctx is available */ static inline struct _starpu_sched_ctx* _starpu_get_initial_sched_ctx(void) { return &_starpu_config.sched_ctxs[STARPU_GLOBAL_SCHED_CTX]; } int starpu_worker_get_nids_by_type(enum starpu_worker_archtype type, int *workerids, int maxsize); /* returns workers not belonging to any context, be careful no mutex is used, the list might not be updated */ int starpu_worker_get_nids_ctx_free_by_type(enum starpu_worker_archtype type, int *workerids, int maxsize); /* geet starpu workerids corresponding to the os physical id bindid */ int _starpu_bindid_get_workerids(int bindid, int **workerids); /* if the current worker has the lock release it */ void _starpu_unlock_mutex_if_prev_locked(); /* if we prev released the lock relock it */ void _starpu_relock_mutex_if_prev_locked(); static inline void _starpu_worker_set_flag_sched_mutex_locked(int workerid, unsigned flag) { struct _starpu_worker *w = _starpu_get_worker_struct(workerid); w->sched_mutex_locked = flag; } static inline unsigned _starpu_worker_mutex_is_sched_mutex(int workerid, starpu_pthread_mutex_t *mutex) { struct _starpu_worker *w = _starpu_get_worker_struct(workerid); return &w->sched_mutex == mutex; } static inline int _starpu_worker_get_nsched_ctxs(int workerid) { return _starpu_config.workers[workerid].nsched_ctxs; } /* Get the total number of sched_ctxs created till now */ static inline unsigned _starpu_get_nsched_ctxs(void) { return _starpu_config.topology.nsched_ctxs; } /* Inlined version when building the core. */ static inline int _starpu_worker_get_id(void) { struct _starpu_worker * worker; worker = _starpu_get_local_worker_key(); if (worker) { return worker->workerid; } else { /* there is no worker associated to that thread, perhaps it is * a thread from the application or this is some SPU worker */ return -1; } } #define starpu_worker_get_id _starpu_worker_get_id #endif // __WORKERS_H__ starpu-1.2.3+dfsg/src/datawizard/000077500000000000000000000000001320135501600166675ustar00rootroot00000000000000starpu-1.2.3+dfsg/src/datawizard/coherency.c000066400000000000000000001133561320135501600210230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include #ifdef STARPU_SIMGRID #include #endif static int link_supports_direct_transfers(starpu_data_handle_t handle, unsigned src_node, unsigned dst_node, unsigned *handling_node); int _starpu_select_src_node(starpu_data_handle_t handle, unsigned destination) { int src_node = -1; unsigned i; unsigned nnodes = starpu_memory_nodes_get_count(); /* first find a valid copy, either a STARPU_OWNER or a STARPU_SHARED */ unsigned node; size_t size = _starpu_data_get_size(handle); double cost = INFINITY; unsigned src_node_mask = 0; for (node = 0; node < nnodes; node++) { if (handle->per_node[node].state != STARPU_INVALID) { /* we found a copy ! */ src_node_mask |= (1<init_cl) { /* No copy yet, but applicationg told us how to build it. */ return -1; } /* we should have found at least one copy ! */ STARPU_ASSERT_MSG(src_node_mask != 0, "The data for the handle %p is requested, but the handle does not have a valid value. Perhaps some initialization task is missing?", handle); /* Without knowing the size, we won't know the cost */ if (!size) cost = 0; /* Check whether we have transfer cost for all nodes, if so, take the minimum */ if (cost) for (i = 0; i < nnodes; i++) { if (src_node_mask & (1<per_node[src_node].allocated); STARPU_ASSERT(handle->per_node[src_node].initialized); return src_node; } int i_ram = -1; int i_gpu = -1; int i_disk = -1; /* Revert to dumb strategy: take RAM unless only a GPU has it */ for (i = 0; i < nnodes; i++) { if (src_node_mask & (1<ops->copy_methods->can_copy; /* Avoid transfers which the interface does not want */ if (can_copy) { void *src_interface = handle->per_node[i].data_interface; void *dst_interface = handle->per_node[destination].data_interface; unsigned handling_node; if (!link_supports_direct_transfers(handle, i, destination, &handling_node)) { /* Avoid through RAM if the interface does not want it */ void *ram_interface = handle->per_node[STARPU_MAIN_RAM].data_interface; if ((!can_copy(src_interface, i, ram_interface, STARPU_MAIN_RAM, i) && !can_copy(src_interface, i, ram_interface, STARPU_MAIN_RAM, STARPU_MAIN_RAM)) || (!can_copy(ram_interface, STARPU_MAIN_RAM, dst_interface, destination, STARPU_MAIN_RAM) && !can_copy(ram_interface, STARPU_MAIN_RAM, dst_interface, destination, destination))) continue; } } /* however GPU are expensive sources, really ! * Unless peer transfer is supported (and it would then have been selected above). * Other should be ok */ if (starpu_node_get_kind(i) == STARPU_CUDA_RAM || starpu_node_get_kind(i) == STARPU_OPENCL_RAM || starpu_node_get_kind(i) == STARPU_MIC_RAM) i_gpu = i; if (starpu_node_get_kind(i) == STARPU_CPU_RAM || starpu_node_get_kind(i) == STARPU_SCC_RAM || starpu_node_get_kind(i) == STARPU_SCC_SHM) i_ram = i; if (starpu_node_get_kind(i) == STARPU_DISK_RAM) i_disk = i; } } /* we have to use cpu_ram in first */ if (i_ram != -1) src_node = i_ram; /* no luck we have to use the disk memory */ else if (i_gpu != -1) src_node = i_gpu; else src_node = i_disk; STARPU_ASSERT(src_node != -1); STARPU_ASSERT(handle->per_node[src_node].allocated); STARPU_ASSERT(handle->per_node[src_node].initialized); return src_node; } /* this may be called once the data is fetched with header and STARPU_RW-lock hold */ void _starpu_update_data_state(starpu_data_handle_t handle, struct _starpu_data_replicate *requesting_replicate, enum starpu_data_access_mode mode) { /* There is nothing to do for relaxed coherency modes (scratch or * reductions) */ if (!(mode & STARPU_RW)) return; unsigned nnodes = starpu_memory_nodes_get_count(); /* the data is present now */ unsigned requesting_node = requesting_replicate->memory_node; requesting_replicate->requested &= ~(1UL << requesting_node); if (mode & STARPU_W) { /* the requesting node now has the only valid copy */ unsigned node; for (node = 0; node < nnodes; node++) { _STARPU_TRACE_DATA_INVALIDATE(handle, node); handle->per_node[node].state = STARPU_INVALID; } requesting_replicate->state = STARPU_OWNER; if (handle->home_node != -1 && handle->per_node[handle->home_node].state == STARPU_INVALID) /* Notify that this MC is now dirty */ _starpu_memchunk_dirty(requesting_replicate->mc, requesting_replicate->memory_node); } else { /* read only */ if (requesting_replicate->state != STARPU_OWNER) { /* there was at least another copy of the data */ unsigned node; for (node = 0; node < nnodes; node++) { struct _starpu_data_replicate *replicate = &handle->per_node[node]; if (replicate->state != STARPU_INVALID) replicate->state = STARPU_SHARED; } requesting_replicate->state = STARPU_SHARED; } } } static int worker_supports_direct_access(unsigned node, unsigned handling_node) { /* only support disk <-> ram and disk <-> disk */ if (starpu_node_get_kind(node) == STARPU_DISK_RAM || starpu_node_get_kind(handling_node) == STARPU_DISK_RAM) return 0; if (node == handling_node) return 1; if (!_starpu_memory_node_get_nworkers(handling_node)) /* No worker to process the request from that node */ return 0; int type = starpu_node_get_kind(node); switch (type) { case STARPU_CUDA_RAM: { /* GPUs not always allow direct remote access: if CUDA4 * is enabled, we allow two CUDA devices to communicate. */ #ifdef STARPU_SIMGRID if (starpu_node_get_kind(handling_node) == STARPU_CUDA_RAM) { char name[16]; msg_host_t host; const char* cuda_memcpy_peer; snprintf(name, sizeof(name), "CUDA%d", _starpu_memory_node_get_devid(handling_node)); host = _starpu_simgrid_get_host_by_name(name); cuda_memcpy_peer = MSG_host_get_property_value(host, "memcpy_peer"); return cuda_memcpy_peer && atoll(cuda_memcpy_peer); } else return 0; #elif defined(HAVE_CUDA_MEMCPY_PEER) /* simgrid */ enum starpu_node_kind kind = starpu_node_get_kind(handling_node); return kind == STARPU_CUDA_RAM; #else /* HAVE_CUDA_MEMCPY_PEER */ /* Direct GPU-GPU transfers are not allowed in general */ return 0; #endif /* HAVE_CUDA_MEMCPY_PEER */ } case STARPU_OPENCL_RAM: return 0; case STARPU_MIC_RAM: /* We don't handle direct MIC-MIC transfers yet */ return 0; case STARPU_SCC_RAM: return 1; default: return 1; } } static int link_supports_direct_transfers(starpu_data_handle_t handle, unsigned src_node, unsigned dst_node, unsigned *handling_node) { int (*can_copy)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, unsigned handling_node) = handle->ops->copy_methods->can_copy; void *src_interface = handle->per_node[src_node].data_interface; void *dst_interface = handle->per_node[dst_node].data_interface; /* XXX That's a hack until we fix cudaMemcpy3DPeerAsync in the block interface * Perhaps not all data interface provide a direct GPU-GPU transfer * method ! */ #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) if (src_node != dst_node && starpu_node_get_kind(src_node) == STARPU_CUDA_RAM && starpu_node_get_kind(dst_node) == STARPU_CUDA_RAM) { const struct starpu_data_copy_methods *copy_methods = handle->ops->copy_methods; if (!copy_methods->cuda_to_cuda_async && !copy_methods->any_to_any) return 0; } #endif /* Note: with CUDA, performance seems a bit better when issuing the transfer from the destination (tested without GPUDirect, but GPUDirect probably behave the same) */ if (worker_supports_direct_access(src_node, dst_node) && (!can_copy || can_copy(src_interface, src_node, dst_interface, dst_node, dst_node))) { *handling_node = dst_node; return 1; } if (worker_supports_direct_access(dst_node, src_node) && (!can_copy || can_copy(src_interface, src_node, dst_interface, dst_node, src_node))) { *handling_node = src_node; return 1; } /* Link between disk and ram */ if ((starpu_node_get_kind(src_node) == STARPU_DISK_RAM && starpu_node_get_kind(dst_node) == STARPU_CPU_RAM) || (starpu_node_get_kind(src_node) == STARPU_CPU_RAM && starpu_node_get_kind(dst_node) == STARPU_DISK_RAM)) { /* FIXME: not necessarily a worker :/ */ *handling_node = STARPU_MAIN_RAM; return 1; } /* link between disk and disk, and they have the same kind */ if (_starpu_is_same_kind_disk(src_node, dst_node)) return 1; return 0; } /* Determines the path of a request : each hop is defined by (src,dst) and the * node that handles the hop. The returned value indicates the number of hops, * and the max_len is the maximum number of hops (ie. the size of the * src_nodes, dst_nodes and handling_nodes arrays. */ static int determine_request_path(starpu_data_handle_t handle, int src_node, int dst_node, enum starpu_data_access_mode mode, int max_len, unsigned *src_nodes, unsigned *dst_nodes, unsigned *handling_nodes, unsigned write_invalidation) { if (src_node == dst_node || !(mode & STARPU_R)) { if (dst_node == -1 || starpu_node_get_kind(dst_node) == STARPU_DISK_RAM) handling_nodes[0] = src_node; else handling_nodes[0] = dst_node; if (write_invalidation) /* The invalidation request will be enough */ return 0; /* The destination node should only allocate the data, no transfer is required */ STARPU_ASSERT(max_len >= 1); src_nodes[0] = STARPU_MAIN_RAM; // ignored dst_nodes[0] = dst_node; return 1; } unsigned handling_node; int link_is_valid = link_supports_direct_transfers(handle, src_node, dst_node, &handling_node); if (!link_is_valid) { int (*can_copy)(void *, unsigned, void *, unsigned, unsigned) = handle->ops->copy_methods->can_copy; void *src_interface = handle->per_node[src_node].data_interface; void *dst_interface = handle->per_node[dst_node].data_interface; /* We need an intermediate hop to implement data staging * through main memory. */ STARPU_ASSERT(max_len >= 2); /* GPU -> RAM */ src_nodes[0] = src_node; dst_nodes[0] = STARPU_MAIN_RAM; if (starpu_node_get_kind(src_node) == STARPU_DISK_RAM) /* Disks don't have their own driver thread */ handling_nodes[0] = dst_node; else if (!can_copy || can_copy(src_interface, src_node, dst_interface, dst_node, src_node)) { handling_nodes[0] = src_node; } else { STARPU_ASSERT_MSG(can_copy(src_interface, src_node, dst_interface, dst_node, dst_node), "interface %d refuses all kinds of transfers from node %d to node %d\n", handle->ops->interfaceid, src_node, dst_node); handling_nodes[0] = dst_node; } /* RAM -> GPU */ src_nodes[1] = STARPU_MAIN_RAM; dst_nodes[1] = dst_node; if (starpu_node_get_kind(dst_node) == STARPU_DISK_RAM) /* Disks don't have their own driver thread */ handling_nodes[1] = src_node; else if (!can_copy || can_copy(src_interface, src_node, dst_interface, dst_node, dst_node)) { handling_nodes[1] = dst_node; } else { STARPU_ASSERT_MSG(can_copy(src_interface, src_node, dst_interface, dst_node, src_node), "interface %d refuses all kinds of transfers from node %d to node %d\n", handle->ops->interfaceid, src_node, dst_node); handling_nodes[1] = src_node; } return 2; } else { STARPU_ASSERT(max_len >= 1); src_nodes[0] = src_node; dst_nodes[0] = dst_node; handling_nodes[0] = handling_node; #if !defined(HAVE_CUDA_MEMCPY_PEER) && !defined(STARPU_SIMGRID) STARPU_ASSERT(!(mode & STARPU_R) || starpu_node_get_kind(src_node) != STARPU_CUDA_RAM || starpu_node_get_kind(dst_node) != STARPU_CUDA_RAM); #endif return 1; } } /* handle->lock should be taken. r is returned locked. The node parameter * indicate either the source of the request, or the destination for a * write-only request. */ static struct _starpu_data_request *_starpu_search_existing_data_request(struct _starpu_data_replicate *replicate, unsigned node, enum starpu_data_access_mode mode, unsigned is_prefetch) { struct _starpu_data_request *r; r = replicate->request[node]; if (r) { _starpu_spin_checklocked(&r->handle->header_lock); _starpu_spin_lock(&r->lock); /* perhaps we need to "upgrade" the request */ if (is_prefetch < r->prefetch) _starpu_update_prefetch_status(r, is_prefetch); if (mode & STARPU_R) { /* in case the exisiting request did not imply a memory * transfer yet, we have to take a second refcnt now * for the source, in addition to the refcnt for the * destination * (so that the source remains valid) */ if (!(r->mode & STARPU_R)) { replicate->refcnt++; replicate->handle->busy_count++; } r->mode = (enum starpu_data_access_mode) ((int) r->mode | (int) STARPU_R); } if (mode & STARPU_W) r->mode = (enum starpu_data_access_mode) ((int) r->mode | (int) STARPU_W); } return r; } /* * This function is called when the data is needed on the local node, this * returns a pointer to the local copy * * R STARPU_W STARPU_RW * Owner OK OK OK * Shared OK 1 1 * Invalid 2 3 4 * * case 1 : shared + (read)write : * no data copy but shared->Invalid/Owner * case 2 : invalid + read : * data copy + invalid->shared + owner->shared (STARPU_ASSERT(there is a valid)) * case 3 : invalid + write : * no data copy + invalid->owner + (owner,shared)->invalid * case 4 : invalid + R/STARPU_W : * data copy + if (STARPU_W) (invalid->owner + owner->invalid) * else (invalid,owner->shared) */ struct _starpu_data_request *_starpu_create_request_to_fetch_data(starpu_data_handle_t handle, struct _starpu_data_replicate *dst_replicate, enum starpu_data_access_mode mode, unsigned is_prefetch, unsigned async, void (*callback_func)(void *), void *callback_arg) { /* We don't care about commuting for data requests, that was handled before. */ mode &= ~STARPU_COMMUTE; /* This function is called with handle's header lock taken */ _starpu_spin_checklocked(&handle->header_lock); int requesting_node = dst_replicate ? dst_replicate->memory_node : -1; unsigned nwait = 0; if (mode & STARPU_W) { /* We will write to the buffer. We will have to wait for all * existing requests before the last request which will * invalidate all their results (which were possibly spurious, * e.g. too aggressive eviction). */ unsigned i, j; unsigned nnodes = starpu_memory_nodes_get_count(); for (i = 0; i < nnodes; i++) for (j = 0; j < nnodes; j++) if (handle->per_node[i].request[j]) nwait++; /* If the request is not detached (i.e. the caller really wants * proper ownership), no new requests will appear because a * reference will be kept on the dst replicate, which will * notably prevent data reclaiming. */ } if ((!dst_replicate || dst_replicate->state != STARPU_INVALID) && (!nwait || is_prefetch)) { if (dst_replicate) { #ifdef STARPU_MEMORY_STATS enum _starpu_cache_state old_state = dst_replicate->state; #endif /* the data is already available and we don't have to wait for * any request, so we can stop */ _starpu_update_data_state(handle, dst_replicate, mode); _starpu_msi_cache_hit(requesting_node); #ifdef STARPU_MEMORY_STATS _starpu_memory_handle_stats_cache_hit(handle, requesting_node); /* XXX Broken ? */ if (old_state == STARPU_SHARED && dst_replicate->state == STARPU_OWNER) _starpu_memory_handle_stats_shared_to_owner(handle, requesting_node); #endif if (dst_replicate->mc) _starpu_memchunk_recently_used(dst_replicate->mc, requesting_node); } _starpu_spin_unlock(&handle->header_lock); if (callback_func) callback_func(callback_arg); _STARPU_LOG_OUT_TAG("data available"); return NULL; } if (dst_replicate) _starpu_msi_cache_miss(requesting_node); /* the only remaining situation is that the local copy was invalid */ STARPU_ASSERT((dst_replicate && dst_replicate->state == STARPU_INVALID) || nwait); /* find someone who already has the data */ int src_node = -1; if (dst_replicate && mode & STARPU_R) { if (dst_replicate->state == STARPU_INVALID) src_node = _starpu_select_src_node(handle, requesting_node); else src_node = requesting_node; if (src_node < 0) { /* We will create it, no need to read an existing value */ mode &= ~STARPU_R; } } else if (dst_replicate) { /* if the data is in write only mode (and not SCRATCH or REDUX), there is no need for a source, data will be initialized by the task itself */ if (mode & STARPU_W) dst_replicate->initialized = 1; if (requesting_node == STARPU_MAIN_RAM && !nwait) { /* And this is the main RAM, really no need for a * request, just allocate */ if (_starpu_allocate_memory_on_node(handle, dst_replicate, is_prefetch) == 0) { _starpu_update_data_state(handle, dst_replicate, mode); _starpu_spin_unlock(&handle->header_lock); if (callback_func) callback_func(callback_arg); _STARPU_LOG_OUT_TAG("data immediately allocated"); return NULL; } } } #define MAX_REQUESTS 4 /* We can safely assume that there won't be more than 2 hops in the * current implementation */ unsigned src_nodes[MAX_REQUESTS], dst_nodes[MAX_REQUESTS], handling_nodes[MAX_REQUESTS]; /* keep one slot for the last W request, if any */ int write_invalidation = (mode & STARPU_W) && nwait && !is_prefetch; int nhops = determine_request_path(handle, src_node, requesting_node, mode, MAX_REQUESTS, src_nodes, dst_nodes, handling_nodes, write_invalidation); STARPU_ASSERT(nhops >= 0 && nhops <= MAX_REQUESTS-1); struct _starpu_data_request *requests[nhops + write_invalidation]; /* Did we reuse a request for that hop ? */ int reused_requests[nhops + write_invalidation]; /* Construct an array with a list of requests, possibly reusing existing requests */ int hop; for (hop = 0; hop < nhops; hop++) { struct _starpu_data_request *r; unsigned hop_src_node = src_nodes[hop]; unsigned hop_dst_node = dst_nodes[hop]; unsigned hop_handling_node = handling_nodes[hop]; struct _starpu_data_replicate *hop_src_replicate; struct _starpu_data_replicate *hop_dst_replicate; /* Only the first request is independant */ unsigned ndeps = (hop == 0)?0:1; hop_src_replicate = &handle->per_node[hop_src_node]; hop_dst_replicate = (hop != nhops - 1)?&handle->per_node[hop_dst_node]:dst_replicate; /* Try to reuse a request if possible */ r = _starpu_search_existing_data_request(hop_dst_replicate, (mode & STARPU_R)?hop_src_node:hop_dst_node, mode, is_prefetch); reused_requests[hop] = !!r; if (!r) { /* Create a new request if there was no request to reuse */ r = _starpu_create_data_request(handle, hop_src_replicate, hop_dst_replicate, hop_handling_node, mode, ndeps, is_prefetch, 0); nwait++; } requests[hop] = r; } /* Chain these requests */ for (hop = 0; hop < nhops; hop++) { struct _starpu_data_request *r; r = requests[hop]; if (hop != nhops - 1) { if (!reused_requests[hop + 1]) { r->next_req[r->next_req_count++] = requests[hop + 1]; STARPU_ASSERT(r->next_req_count <= STARPU_MAXNODES); } } else if (!write_invalidation) /* The last request will perform the callback after termination */ _starpu_data_request_append_callback(r, callback_func, callback_arg); if (reused_requests[hop]) _starpu_spin_unlock(&r->lock); } if (write_invalidation) { /* Some requests were still pending, we have to add yet another * request, depending on them, which will invalidate their * result. */ struct _starpu_data_request *r = _starpu_create_data_request(handle, dst_replicate, dst_replicate, requesting_node, STARPU_W, nwait, is_prefetch, 1); /* and perform the callback after termination */ _starpu_data_request_append_callback(r, callback_func, callback_arg); /* We will write to the buffer. We will have to wait for all * existing requests before the last request which will * invalidate all their results (which were possibly spurious, * e.g. too aggressive eviction). */ unsigned i, j; unsigned nnodes = starpu_memory_nodes_get_count(); for (i = 0; i < nnodes; i++) for (j = 0; j < nnodes; j++) { struct _starpu_data_request *r2 = handle->per_node[i].request[j]; if (r2) { _starpu_spin_lock(&r2->lock); if (is_prefetch < r2->prefetch) /* Hasten the request we will have to wait for */ _starpu_update_prefetch_status(r2, is_prefetch); r2->next_req[r2->next_req_count++] = r; STARPU_ASSERT(r2->next_req_count <= STARPU_MAXNODES + 1); _starpu_spin_unlock(&r2->lock); nwait--; } } STARPU_ASSERT(nwait == 0); nhops++; requests[nhops - 1] = r; /* existing requests will post this one */ reused_requests[nhops - 1] = 1; } STARPU_ASSERT(nhops); if (!async) requests[nhops - 1]->refcnt++; /* we only submit the first request, the remaining will be * automatically submitted afterward */ if (!reused_requests[0]) _starpu_post_data_request(requests[0]); return requests[nhops - 1]; } int _starpu_fetch_data_on_node(starpu_data_handle_t handle, int node, struct _starpu_data_replicate *dst_replicate, enum starpu_data_access_mode mode, unsigned detached, unsigned is_prefetch, unsigned async, void (*callback_func)(void *), void *callback_arg) { unsigned local_node = _starpu_memory_node_get_local_key(); _STARPU_LOG_IN(); int cpt = 0; while (cpt < STARPU_SPIN_MAXTRY && _starpu_spin_trylock(&handle->header_lock)) { cpt++; _starpu_datawizard_progress(local_node, 1); } if (cpt == STARPU_SPIN_MAXTRY) _starpu_spin_lock(&handle->header_lock); if (!detached) { /* Take references which will be released by _starpu_release_data_on_node */ if (dst_replicate) dst_replicate->refcnt++; else if (node == STARPU_ACQUIRE_ALL_NODES) { int i; for (i = 0; i < STARPU_MAXNODES; i++) handle->per_node[i].refcnt++; } handle->busy_count++; } struct _starpu_data_request *r; r = _starpu_create_request_to_fetch_data(handle, dst_replicate, mode, is_prefetch, async, callback_func, callback_arg); /* If no request was created, the handle was already up-to-date on the * node. In this case, _starpu_create_request_to_fetch_data has already * unlocked the header. */ if (!r) return 0; _starpu_spin_unlock(&handle->header_lock); int ret = async?0:_starpu_wait_data_request_completion(r, 1); _STARPU_LOG_OUT(); return ret; } static int idle_prefetch_data_on_node(starpu_data_handle_t handle, int node, struct _starpu_data_replicate *replicate, enum starpu_data_access_mode mode) { return _starpu_fetch_data_on_node(handle, node, replicate, mode, 1, 2, 1, NULL, NULL); } static int prefetch_data_on_node(starpu_data_handle_t handle, int node, struct _starpu_data_replicate *replicate, enum starpu_data_access_mode mode) { return _starpu_fetch_data_on_node(handle, node, replicate, mode, 1, 1, 1, NULL, NULL); } static int fetch_data(starpu_data_handle_t handle, int node, struct _starpu_data_replicate *replicate, enum starpu_data_access_mode mode) { return _starpu_fetch_data_on_node(handle, node, replicate, mode, 0, 0, 0, NULL, NULL); } uint32_t _starpu_get_data_refcnt(starpu_data_handle_t handle, unsigned node) { return handle->per_node[node].refcnt; } size_t _starpu_data_get_size(starpu_data_handle_t handle) { return handle->ops->get_size(handle); } uint32_t _starpu_data_get_footprint(starpu_data_handle_t handle) { return handle->footprint; } /* in case the data was accessed on a write mode, do not forget to * make it accessible again once it is possible ! */ void _starpu_release_data_on_node(starpu_data_handle_t handle, uint32_t default_wt_mask, struct _starpu_data_replicate *replicate) { uint32_t wt_mask; wt_mask = default_wt_mask | handle->wt_mask; wt_mask &= (1<memory_node; if (replicate->state != STARPU_INVALID && handle->current_mode & STARPU_W) if (wt_mask & ~(1<header_lock)) { cpt++; _starpu_datawizard_progress(local_node, 1); } if (cpt == STARPU_SPIN_MAXTRY) _starpu_spin_lock(&handle->header_lock); /* Release refcnt taken by fetch_data_on_node */ replicate->refcnt--; STARPU_ASSERT_MSG(replicate->refcnt >= 0, "handle %p released too many times", handle); STARPU_ASSERT_MSG(handle->busy_count > 0, "handle %p released too many times", handle); handle->busy_count--; if (!_starpu_notify_data_dependencies(handle)) _starpu_spin_unlock(&handle->header_lock); } static void _starpu_set_data_requested_flag_if_needed(starpu_data_handle_t handle, struct _starpu_data_replicate *replicate) { unsigned local_node = _starpu_memory_node_get_local_key(); int cpt = 0; while (cpt < STARPU_SPIN_MAXTRY && _starpu_spin_trylock(&handle->header_lock)) { cpt++; _starpu_datawizard_progress(local_node, 1); } if (cpt == STARPU_SPIN_MAXTRY) _starpu_spin_lock(&handle->header_lock); if (replicate->state == STARPU_INVALID) { unsigned dst_node = replicate->memory_node; replicate->requested |= 1UL << dst_node; } _starpu_spin_unlock(&handle->header_lock); } int starpu_prefetch_task_input_on_node(struct starpu_task *task, unsigned node) { STARPU_ASSERT(!task->prefetched); unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); unsigned index; for (index = 0; index < nbuffers; index++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, index); enum starpu_data_access_mode mode = STARPU_TASK_GET_MODE(task, index); if (mode & (STARPU_SCRATCH|STARPU_REDUX)) continue; if (!(mode & STARPU_R)) /* Don't bother prefetching some data which will be overwritten */ continue; struct _starpu_data_replicate *replicate = &handle->per_node[node]; prefetch_data_on_node(handle, node, replicate, mode); _starpu_set_data_requested_flag_if_needed(handle, replicate); } return 0; } int starpu_idle_prefetch_task_input_on_node(struct starpu_task *task, unsigned node) { unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); unsigned index; for (index = 0; index < nbuffers; index++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, index); enum starpu_data_access_mode mode = STARPU_TASK_GET_MODE(task, index); if (mode & (STARPU_SCRATCH|STARPU_REDUX)) continue; struct _starpu_data_replicate *replicate = &handle->per_node[node]; idle_prefetch_data_on_node(handle, node, replicate, mode); } return 0; } static struct _starpu_data_replicate *get_replicate(starpu_data_handle_t handle, enum starpu_data_access_mode mode, int workerid, unsigned node) { if (mode & (STARPU_SCRATCH|STARPU_REDUX)) { STARPU_ASSERT(workerid >= 0); if (!handle->per_worker) { _starpu_spin_lock(&handle->header_lock); if (!handle->per_worker) _starpu_data_initialize_per_worker(handle); _starpu_spin_unlock(&handle->header_lock); } return &handle->per_worker[workerid]; } else /* That's a "normal" buffer (R/W) */ return &handle->per_node[node]; } /* Synchronously fetch data for a given task (if it's not there already) */ int _starpu_fetch_task_input(struct _starpu_job *j) { _STARPU_TRACE_START_FETCH_INPUT(NULL); int profiling = starpu_profiling_status_get(); struct starpu_task *task = j->task; if (profiling && task->profiling_info) _starpu_clock_gettime(&task->profiling_info->acquire_data_start_time); struct _starpu_data_descr *descrs = _STARPU_JOB_GET_ORDERED_BUFFERS(j); unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); unsigned local_memory_node = _starpu_memory_node_get_local_key(); int workerid = starpu_worker_get_id(); #ifdef STARPU_USE_FXT unsigned long total_size = 0; #endif unsigned index; for (index = 0; index < nbuffers; index++) { int ret; starpu_data_handle_t handle = descrs[index].handle; enum starpu_data_access_mode mode = descrs[index].mode; int node = descrs[index].node; if (node == -1) node = local_memory_node; if (mode == STARPU_NONE || (mode & ((1<= STARPU_ACCESS_MODE_MAX || (mode >> STARPU_MODE_SHIFT) >= (STARPU_SHIFTED_MODE_MAX >> STARPU_MODE_SHIFT)) STARPU_ASSERT_MSG(0, "mode %d (0x%x) is bogus\n", mode, mode); struct _starpu_data_replicate *local_replicate; if (index && descrs[index-1].handle == descrs[index].handle) /* We have already took this data, skip it. This * depends on ordering putting writes before reads, see * _starpu_compar_handles */ continue; local_replicate = get_replicate(handle, mode, workerid, node); ret = fetch_data(handle, node, local_replicate, mode); if (STARPU_UNLIKELY(ret)) goto enomem; #ifdef STARPU_USE_FXT total_size += _starpu_data_get_size(handle); #endif } _STARPU_TRACE_DATA_LOAD(workerid,total_size); /* Now that we have taken the data locks in locking order, fill the codelet interfaces in function order. */ for (index = 0; index < nbuffers; index++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, index); enum starpu_data_access_mode mode = STARPU_TASK_GET_MODE(task, index); int node = descrs[index].node; if (node == -1) node = local_memory_node; struct _starpu_data_replicate *local_replicate; local_replicate = get_replicate(handle, mode, workerid, node); _STARPU_TASK_SET_INTERFACE(task , local_replicate->data_interface, index); /* If the replicate was not initialized yet, we have to do it now */ if (!(mode & STARPU_SCRATCH) && !local_replicate->initialized) _starpu_redux_init_data_replicate(handle, local_replicate, workerid); } if (profiling && task->profiling_info) _starpu_clock_gettime(&task->profiling_info->acquire_data_end_time); _STARPU_TRACE_END_FETCH_INPUT(NULL); return 0; enomem: _STARPU_TRACE_END_FETCH_INPUT(NULL); _STARPU_DISP("something went wrong with buffer %u\n", index); /* try to unreference all the input that were successfully taken */ unsigned index2; for (index2 = 0; index2 < index; index2++) { starpu_data_handle_t handle = descrs[index2].handle; enum starpu_data_access_mode mode = descrs[index2].mode; int node = descrs[index].node; if (node == -1) node = local_memory_node; struct _starpu_data_replicate *local_replicate; if (index2 && descrs[index2-1].handle == descrs[index2].handle) /* We have already released this data, skip it. This * depends on ordering putting writes before reads, see * _starpu_compar_handles */ continue; local_replicate = get_replicate(handle, mode, workerid, node); _starpu_release_data_on_node(handle, 0, local_replicate); } return -1; } /* Release task data dependencies */ void __starpu_push_task_output(struct _starpu_job *j) { #ifdef STARPU_OPENMP STARPU_ASSERT(!j->continuation); #endif int profiling = starpu_profiling_status_get(); struct starpu_task *task = j->task; if (profiling && task->profiling_info) _starpu_clock_gettime(&task->profiling_info->release_data_start_time); struct _starpu_data_descr *descrs = _STARPU_JOB_GET_ORDERED_BUFFERS(j); unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); int workerid = starpu_worker_get_id(); unsigned local_memory_node = _starpu_memory_node_get_local_key(); unsigned index; for (index = 0; index < nbuffers; index++) { starpu_data_handle_t handle = descrs[index].handle; enum starpu_data_access_mode mode = descrs[index].mode; int node = descrs[index].node; if (node == -1 && task->cl->where != STARPU_NOWHERE) node = local_memory_node; struct _starpu_data_replicate *local_replicate = NULL; if (index && descrs[index-1].handle == descrs[index].handle) /* We have already released this data, skip it. This * depends on ordering putting writes before reads, see * _starpu_compar_handles */ continue; if (node != -1) local_replicate = get_replicate(handle, mode, workerid, node); /* Keep a reference for future * _starpu_release_task_enforce_sequential_consistency call */ _starpu_spin_lock(&handle->header_lock); handle->busy_count++; if (node == -1) { /* NOWHERE case, just notify dependencies */ if (!_starpu_notify_data_dependencies(handle)) _starpu_spin_unlock(&handle->header_lock); } else { _starpu_spin_unlock(&handle->header_lock); _starpu_release_data_on_node(handle, 0, local_replicate); } } if (profiling && task->profiling_info) _starpu_clock_gettime(&task->profiling_info->release_data_end_time); } /* Version for a driver running on a worker: we show the driver state in the trace */ void _starpu_push_task_output(struct _starpu_job *j) { _STARPU_TRACE_START_PUSH_OUTPUT(NULL); __starpu_push_task_output(j); _STARPU_TRACE_END_PUSH_OUTPUT(NULL); } struct fetch_nowhere_wrapper { struct _starpu_job *j; unsigned pending; }; static void _starpu_fetch_nowhere_task_input_cb(void *arg); /* Asynchronously fetch data for a task which will have no content */ void _starpu_fetch_nowhere_task_input(struct _starpu_job *j) { int profiling = starpu_profiling_status_get(); struct starpu_task *task = j->task; if (profiling && task->profiling_info) _starpu_clock_gettime(&task->profiling_info->acquire_data_start_time); struct _starpu_data_descr *descrs = _STARPU_JOB_GET_ORDERED_BUFFERS(j); unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); unsigned nfetchbuffers = 0; struct fetch_nowhere_wrapper *wrapper; unsigned index; for (index = 0; index < nbuffers; index++) { int node = descrs[index].node; if (node != -1) nfetchbuffers++; } if (!nfetchbuffers) { /* Nothing to fetch actually, already finished! */ __starpu_push_task_output(j); _starpu_handle_job_termination(j); _STARPU_LOG_OUT_TAG("handle_job_termination"); return; } _STARPU_MALLOC(wrapper, sizeof(*wrapper)); wrapper->j = j; /* +1 for the call below */ wrapper->pending = nfetchbuffers + 1; for (index = 0; index < nbuffers; index++) { starpu_data_handle_t handle = descrs[index].handle; enum starpu_data_access_mode mode = descrs[index].mode; int node = descrs[index].node; if (node == -1) continue; if (mode == STARPU_NONE || (mode & ((1<= STARPU_ACCESS_MODE_MAX || (mode >> STARPU_MODE_SHIFT) >= (STARPU_SHIFTED_MODE_MAX >> STARPU_MODE_SHIFT)) STARPU_ASSERT_MSG(0, "mode %d (0x%x) is bogus\n", mode, mode); STARPU_ASSERT(mode != STARPU_SCRATCH && mode != STARPU_REDUX); struct _starpu_data_replicate *local_replicate; local_replicate = get_replicate(handle, mode, -1, node); _starpu_fetch_data_on_node(handle, node, local_replicate, mode, 0, 0, 1, _starpu_fetch_nowhere_task_input_cb, wrapper); } if (profiling && task->profiling_info) _starpu_clock_gettime(&task->profiling_info->acquire_data_end_time); /* Finished working with the task, release our reference */ _starpu_fetch_nowhere_task_input_cb(wrapper); } static void _starpu_fetch_nowhere_task_input_cb(void *arg) { /* One more transfer finished */ struct fetch_nowhere_wrapper *wrapper = arg; unsigned pending = STARPU_ATOMIC_ADD(&wrapper->pending, -1); ANNOTATE_HAPPENS_BEFORE(&wrapper->pending); if (pending == 0) { ANNOTATE_HAPPENS_AFTER(&wrapper->pending); /* Finished transferring, task is over */ struct _starpu_job *j = wrapper->j; free(wrapper); __starpu_push_task_output(j); _starpu_handle_job_termination(j); _STARPU_LOG_OUT_TAG("handle_job_termination"); } } /* NB : this value can only be an indication of the status of a data at some point, but there is no strong garantee ! */ unsigned _starpu_is_data_present_or_requested(starpu_data_handle_t handle, unsigned node) { unsigned ret = 0; // XXX : this is just a hint, so we don't take the lock ... // STARPU_PTHREAD_SPIN_LOCK(&handle->header_lock); if (handle->per_node[node].state != STARPU_INVALID) { ret = 1; } else { unsigned i; unsigned nnodes = starpu_memory_nodes_get_count(); for (i = 0; i < nnodes; i++) { if ((handle->per_node[node].requested & (1UL << i)) || handle->per_node[node].request[i]) ret = 1; } } // STARPU_PTHREAD_SPIN_UNLOCK(&handle->header_lock); return ret; } void _starpu_data_set_unregister_hook(starpu_data_handle_t handle, _starpu_data_handle_unregister_hook func) { handle->unregister_hook = func; } starpu-1.2.3+dfsg/src/datawizard/coherency.h000066400000000000000000000276731320135501600210360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2017 CNRS * Copyright (C) 2014-2016 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __COHERENCY__H__ #define __COHERENCY__H__ #include #include #include #include #include #include #include #include #include #include #include enum _starpu_cache_state { STARPU_OWNER, STARPU_SHARED, STARPU_INVALID }; /* this should contain the information relative to a given data replicate */ struct _starpu_data_replicate { starpu_data_handle_t handle; /* describe the actual data layout, as manipulated by data interfaces in *_interface.c */ void *data_interface; /* How many requests or tasks are currently working with this replicate */ int refcnt; char memory_node; /* describes the state of the local data in term of coherency */ enum _starpu_cache_state state: 2; /* A buffer that is used for SCRATCH or reduction cannnot be used with * filters. */ unsigned relaxed_coherency:2; /* We may need to initialize the replicate with some value before using it. */ unsigned initialized:1; /* is the data locally allocated ? */ unsigned allocated:1; /* was it automatically allocated ? (else it's the application-provided * buffer, don't ever try to free it!) */ /* perhaps the allocation was perform higher in the hiearchy * for now this is just translated into !automatically_allocated * */ unsigned automatically_allocated:1; /* To help the scheduling policies to make some decision, we may keep a track of the tasks that are likely to request this data on the current node. It is the responsability of the scheduling _policy_ to set that flag when it assigns a task to a queue, policies which do not use this hint can simply ignore it. */ uint32_t requested; struct _starpu_data_request *request[STARPU_MAXNODES]; /* Pointer to memchunk for LRU strategy */ struct _starpu_mem_chunk * mc; }; struct _starpu_data_requester_list; struct _starpu_jobid_list { unsigned long id; struct _starpu_jobid_list *next; }; /* This structure describes a simply-linked list of task */ struct _starpu_task_wrapper_list { struct starpu_task *task; struct _starpu_task_wrapper_list *next; }; /* This structure describes a doubly-linked list of task */ struct _starpu_task_wrapper_dlist { struct starpu_task *task; struct _starpu_task_wrapper_dlist *next; struct _starpu_task_wrapper_dlist *prev; }; extern int _starpu_has_not_important_data; typedef void (*_starpu_data_handle_unregister_hook)(starpu_data_handle_t); /* This is initialized in both _starpu_register_new_data and _starpu_data_partition */ struct _starpu_data_state { int magic; struct _starpu_data_requester_list req_list; /* the number of requests currently in the scheduling engine (not in * the req_list anymore), i.e. the number of holders of the * current_mode rwlock */ unsigned refcnt; /* whether we are already unlocking data requests */ unsigned unlocking_reqs; /* Current access mode. Is always either STARPU_R, STARPU_W, * STARPU_SCRATCH or STARPU_REDUX, but never a combination such as * STARPU_RW. */ enum starpu_data_access_mode current_mode; /* protect meta data */ struct _starpu_spinlock header_lock; /* Condition to make application wait for all transfers before freeing handle */ /* busy_count is the number of handle->refcnt, handle->per_node[*]->refcnt, number of starpu_data_requesters, and number of tasks that have released it but are still registered on the implicit data dependency lists. */ /* Core code which releases busy_count has to call * _starpu_data_check_not_busy to let starpu_data_unregister proceed */ unsigned busy_count; /* Is starpu_data_unregister waiting for busy_count? */ unsigned busy_waiting; starpu_pthread_mutex_t busy_mutex; starpu_pthread_cond_t busy_cond; /* In case we user filters, the handle may describe a sub-data */ struct _starpu_data_state *root_handle; /* root of the tree */ struct _starpu_data_state *father_handle; /* father of the node, NULL if the current node is the root */ unsigned sibling_index; /* indicate which child this node is from the father's perpsective (if any) */ unsigned depth; /* what's the depth of the tree ? */ starpu_data_handle_t children; unsigned nchildren; /* How many partition plans this handle has */ unsigned nplans; /* Switch codelet for asynchronous partitioning */ struct starpu_codelet *switch_cl; /* size of dyn_nodes recorded in switch_cl */ unsigned switch_cl_nparts; /* Whether a partition plan is currently submitted and the * corresponding unpartition has not been yet * * Or the number of partition plans currently submitted in readonly * mode. */ unsigned partitioned; /* Whether a partition plan is currently submitted in readonly mode */ unsigned readonly; /* describe the state of the data in term of coherency */ struct _starpu_data_replicate per_node[STARPU_MAXNODES]; struct _starpu_data_replicate *per_worker; struct starpu_data_interface_ops *ops; /* Footprint which identifies data layout */ uint32_t footprint; /* where is the data home, i.e. which node it was registered from ? -1 if none yet */ int home_node; /* what is the default write-through mask for that data ? */ uint32_t wt_mask; /* in some case, the application may explicitly tell StarPU that a * piece of data is not likely to be used soon again */ unsigned is_not_important; /* Does StarPU have to enforce some implicit data-dependencies ? */ unsigned sequential_consistency; /* Is the data initialized, or a task is already submitted to initialize it */ unsigned initialized; /* This lock should protect any operation to enforce * sequential_consistency */ starpu_pthread_mutex_t sequential_consistency_mutex; /* The last submitted task (or application data request) that declared * it would modify the piece of data ? Any task accessing the data in a * read-only mode should depend on that task implicitely if the * sequential_consistency flag is enabled. */ enum starpu_data_access_mode last_submitted_mode; struct starpu_task *last_sync_task; struct _starpu_task_wrapper_dlist last_submitted_accessors; /* If FxT is enabled, we keep track of "ghost dependencies": that is to * say the dependencies that are not needed anymore, but that should * appear in the post-mortem DAG. For instance if we have the sequence * f(Aw) g(Aw), and that g is submitted after the termination of f, we * want to have f->g appear in the DAG even if StarPU does not need to * enforce this dependency anymore.*/ unsigned last_submitted_ghost_sync_id_is_valid; unsigned long last_submitted_ghost_sync_id; struct _starpu_jobid_list *last_submitted_ghost_accessors_id; /* protected by sequential_consistency_mutex */ struct _starpu_task_wrapper_list *post_sync_tasks; unsigned post_sync_tasks_cnt; /* * Reductions */ /* During reduction we need some specific methods: redux_func performs * the reduction of an interface into another one (eg. "+="), and init_func * initializes the data interface to a default value that is stable by * reduction (eg. 0 for +=). */ struct starpu_codelet *redux_cl; struct starpu_codelet *init_cl; /* Are we currently performing a reduction on that handle ? If so the * reduction_refcnt should be non null until there are pending tasks * that are performing the reduction. */ unsigned reduction_refcnt; /* List of requesters that are specific to the pending reduction. This * list is used when the requests in the req_list list are frozen until * the end of the reduction. */ struct _starpu_data_requester_list reduction_req_list; starpu_data_handle_t *reduction_tmp_handles; /* Final request for write invalidation */ struct _starpu_data_request *write_invalidation_req; unsigned lazy_unregister; #ifdef STARPU_OPENMP unsigned removed_from_context_hash; #endif /* Used for MPI */ void *mpi_data; _starpu_memory_stats_t memory_stats; unsigned int mf_node; //XXX /* hook to be called when unregistering the data */ _starpu_data_handle_unregister_hook unregister_hook; struct starpu_arbiter *arbiter; /* This is protected by the arbiter mutex */ struct _starpu_data_requester_list arbitered_req_list; /* Data maintained by schedulers themselves */ /* Last worker that took this data in locality mode, or -1 if nobody * took it yet */ int last_locality; /* A generic pointer to data in the user land (could be anything and this * is not manage by StarPU) */ void *user_data; }; /* This does not take a reference on the handle, the caller has to do it, * e.g. through _starpu_attempt_to_submit_data_request_from_apps() * detached means that the core is allowed to drop the request. The caller * should thus *not* take a reference since it can not know whether the request will complete * async means that _starpu_fetch_data_on_node will wait for completion of the request */ int _starpu_fetch_data_on_node(starpu_data_handle_t handle, int node, struct _starpu_data_replicate *replicate, enum starpu_data_access_mode mode, unsigned detached, unsigned is_prefetch, unsigned async, void (*callback_func)(void *), void *callback_arg); /* This releases a reference on the handle */ void _starpu_release_data_on_node(struct _starpu_data_state *state, uint32_t default_wt_mask, struct _starpu_data_replicate *replicate); void _starpu_update_data_state(starpu_data_handle_t handle, struct _starpu_data_replicate *requesting_replicate, enum starpu_data_access_mode mode); uint32_t _starpu_get_data_refcnt(struct _starpu_data_state *state, unsigned node); size_t _starpu_data_get_size(starpu_data_handle_t handle); uint32_t _starpu_data_get_footprint(starpu_data_handle_t handle); void __starpu_push_task_output(struct _starpu_job *j); /* Version with driver trace */ void _starpu_push_task_output(struct _starpu_job *j); void _starpu_release_nowhere_task_output(struct _starpu_job *j); STARPU_ATTRIBUTE_WARN_UNUSED_RESULT int _starpu_fetch_task_input(struct _starpu_job *j); void _starpu_fetch_nowhere_task_input(struct _starpu_job *j); unsigned _starpu_is_data_present_or_requested(struct _starpu_data_state *state, unsigned node); int _starpu_select_src_node(struct _starpu_data_state *state, unsigned destination); /* is_prefetch is whether the DSM may drop the request (when there is not enough memory for instance * async is whether the caller wants a reference on the last request, to be * able to wait for it (which will release that reference). */ struct _starpu_data_request *_starpu_create_request_to_fetch_data(starpu_data_handle_t handle, struct _starpu_data_replicate *dst_replicate, enum starpu_data_access_mode mode, unsigned is_prefetch, unsigned async, void (*callback_func)(void *), void *callback_arg); void _starpu_redux_init_data_replicate(starpu_data_handle_t handle, struct _starpu_data_replicate *replicate, int workerid); void _starpu_data_start_reduction_mode(starpu_data_handle_t handle); void _starpu_data_end_reduction_mode(starpu_data_handle_t handle); void _starpu_data_end_reduction_mode_terminate(starpu_data_handle_t handle); void _starpu_data_set_unregister_hook(starpu_data_handle_t handle, _starpu_data_handle_unregister_hook func); #endif // __COHERENCY__H__ starpu-1.2.3+dfsg/src/datawizard/copy_driver.c000066400000000000000000000674271320135501600214000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2013, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include "copy_driver.h" #include "memalloc.h" #include #include #include #include #ifdef STARPU_SIMGRID #include #endif void _starpu_wake_all_blocked_workers_on_node(unsigned nodeid) { /* wake up all workers on that memory node */ unsigned cond_id; struct _starpu_memory_node_descr * const descr = _starpu_memory_node_get_description(); starpu_pthread_mutex_t *mymutex = NULL; starpu_pthread_cond_t *mycond = NULL; const int myworkerid = starpu_worker_get_id(); if (myworkerid >= 0) starpu_worker_get_sched_condition(myworkerid, &mymutex, &mycond); STARPU_PTHREAD_RWLOCK_RDLOCK(&descr->conditions_rwlock); unsigned nconds = descr->condition_count[nodeid]; for (cond_id = 0; cond_id < nconds; cond_id++) { struct _starpu_cond_and_mutex *condition; condition = &descr->conditions_attached_to_node[nodeid][cond_id]; if (condition->mutex == mymutex) /* No need to wake myself, and I might be called from * the scheduler with mutex locked, through * starpu_prefetch_task_input_on_node */ continue; /* wake anybody waiting on that condition */ STARPU_PTHREAD_MUTEX_LOCK_SCHED(condition->mutex); STARPU_PTHREAD_COND_BROADCAST(condition->cond); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(condition->mutex); } STARPU_PTHREAD_RWLOCK_UNLOCK(&descr->conditions_rwlock); } void starpu_wake_all_blocked_workers(void) { /* workers may be blocked on the various queues' conditions */ unsigned cond_id; struct _starpu_memory_node_descr * const descr = _starpu_memory_node_get_description(); starpu_pthread_mutex_t *mymutex = NULL; starpu_pthread_cond_t *mycond = NULL; const int myworkerid = starpu_worker_get_id(); if (myworkerid >= 0) starpu_worker_get_sched_condition(myworkerid, &mymutex, &mycond); STARPU_PTHREAD_RWLOCK_RDLOCK(&descr->conditions_rwlock); unsigned nconds = descr->total_condition_count; for (cond_id = 0; cond_id < nconds; cond_id++) { struct _starpu_cond_and_mutex *condition; condition = &descr->conditions_all[cond_id]; if (condition->mutex == mymutex) /* No need to wake myself, and I might be called from * the scheduler with mutex locked, through * starpu_prefetch_task_input_on_node */ continue; /* wake anybody waiting on that condition */ STARPU_PTHREAD_MUTEX_LOCK_SCHED(condition->mutex); STARPU_PTHREAD_COND_BROADCAST(condition->cond); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(condition->mutex); } STARPU_PTHREAD_RWLOCK_UNLOCK(&descr->conditions_rwlock); } #ifdef STARPU_USE_FXT /* we need to identify each communication so that we can match the beginning * and the end of a communication in the trace, so we use a unique identifier * per communication */ static unsigned long communication_cnt = 0; #endif static int copy_data_1_to_1_generic(starpu_data_handle_t handle, struct _starpu_data_replicate *src_replicate, struct _starpu_data_replicate *dst_replicate, struct _starpu_data_request *req) { unsigned src_node = src_replicate->memory_node; unsigned dst_node = dst_replicate->memory_node; STARPU_ASSERT(src_replicate->refcnt); STARPU_ASSERT(dst_replicate->refcnt); STARPU_ASSERT(src_replicate->allocated); STARPU_ASSERT(dst_replicate->allocated); _starpu_comm_amounts_inc(src_node, dst_node, handle->ops->get_size(handle)); #ifdef STARPU_SIMGRID return _starpu_simgrid_transfer(handle->ops->get_size(handle), src_node, dst_node, req); #else /* !SIMGRID */ int ret = 0; const struct starpu_data_copy_methods *copy_methods = handle->ops->copy_methods; enum starpu_node_kind src_kind = starpu_node_get_kind(src_node); enum starpu_node_kind dst_kind = starpu_node_get_kind(dst_node); #ifdef STARPU_USE_CUDA cudaError_t cures; cudaStream_t stream; #endif void *src_interface = src_replicate->data_interface; void *dst_interface = dst_replicate->data_interface; #if defined(STARPU_USE_CUDA) && defined(HAVE_CUDA_MEMCPY_PEER) && !defined(STARPU_SIMGRID) if ((src_kind == STARPU_CUDA_RAM) || (dst_kind == STARPU_CUDA_RAM)) { unsigned devid; if ((src_kind == STARPU_CUDA_RAM) && (dst_kind == STARPU_CUDA_RAM)) { /* GPU-GPU transfer, issue it from the device we are supposed to drive */ int worker = starpu_worker_get_id(); devid = starpu_worker_get_devid(worker); } else { unsigned node = (dst_kind == STARPU_CUDA_RAM)?dst_node:src_node; devid = _starpu_memory_node_get_devid(node); } starpu_cuda_set_device(devid); } #endif switch (_STARPU_MEMORY_NODE_TUPLE(src_kind,dst_kind)) { case _STARPU_MEMORY_NODE_TUPLE(STARPU_CPU_RAM,STARPU_CPU_RAM): /* STARPU_CPU_RAM -> STARPU_CPU_RAM */ if (copy_methods->ram_to_ram) copy_methods->ram_to_ram(src_interface, src_node, dst_interface, dst_node); else copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, req ? &req->async_channel : NULL); break; #ifdef STARPU_USE_CUDA case _STARPU_MEMORY_NODE_TUPLE(STARPU_CUDA_RAM,STARPU_CPU_RAM): /* only the proper CUBLAS thread can initiate this directly ! */ #if !defined(HAVE_CUDA_MEMCPY_PEER) STARPU_ASSERT(_starpu_memory_node_get_local_key() == src_node); #endif if (!req || starpu_asynchronous_copy_disabled() || starpu_asynchronous_cuda_copy_disabled() || !(copy_methods->cuda_to_ram_async || copy_methods->any_to_any)) { /* this is not associated to a request so it's synchronous */ STARPU_ASSERT(copy_methods->cuda_to_ram || copy_methods->any_to_any); if (copy_methods->cuda_to_ram) copy_methods->cuda_to_ram(src_interface, src_node, dst_interface, dst_node); else copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, NULL); } else { req->async_channel.type = STARPU_CUDA_RAM; cures = cudaEventCreateWithFlags(&req->async_channel.event.cuda_event, cudaEventDisableTiming); if (STARPU_UNLIKELY(cures != cudaSuccess)) STARPU_CUDA_REPORT_ERROR(cures); stream = starpu_cuda_get_local_out_transfer_stream(); if (copy_methods->cuda_to_ram_async) ret = copy_methods->cuda_to_ram_async(src_interface, src_node, dst_interface, dst_node, stream); else { STARPU_ASSERT(copy_methods->any_to_any); ret = copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, &req->async_channel); } cures = cudaEventRecord(req->async_channel.event.cuda_event, stream); if (STARPU_UNLIKELY(cures != cudaSuccess)) STARPU_CUDA_REPORT_ERROR(cures); } break; case _STARPU_MEMORY_NODE_TUPLE(STARPU_CPU_RAM,STARPU_CUDA_RAM): /* STARPU_CPU_RAM -> CUBLAS_RAM */ /* only the proper CUBLAS thread can initiate this ! */ #if !defined(HAVE_CUDA_MEMCPY_PEER) STARPU_ASSERT(_starpu_memory_node_get_local_key() == dst_node); #endif if (!req || starpu_asynchronous_copy_disabled() || starpu_asynchronous_cuda_copy_disabled() || !(copy_methods->ram_to_cuda_async || copy_methods->any_to_any)) { /* this is not associated to a request so it's synchronous */ STARPU_ASSERT(copy_methods->ram_to_cuda || copy_methods->any_to_any); if (copy_methods->ram_to_cuda) copy_methods->ram_to_cuda(src_interface, src_node, dst_interface, dst_node); else copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, NULL); } else { req->async_channel.type = STARPU_CUDA_RAM; cures = cudaEventCreateWithFlags(&req->async_channel.event.cuda_event, cudaEventDisableTiming); if (STARPU_UNLIKELY(cures != cudaSuccess)) STARPU_CUDA_REPORT_ERROR(cures); stream = starpu_cuda_get_local_in_transfer_stream(); if (copy_methods->ram_to_cuda_async) ret = copy_methods->ram_to_cuda_async(src_interface, src_node, dst_interface, dst_node, stream); else { STARPU_ASSERT(copy_methods->any_to_any); ret = copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, &req->async_channel); } cures = cudaEventRecord(req->async_channel.event.cuda_event, stream); if (STARPU_UNLIKELY(cures != cudaSuccess)) STARPU_CUDA_REPORT_ERROR(cures); } break; case _STARPU_MEMORY_NODE_TUPLE(STARPU_CUDA_RAM,STARPU_CUDA_RAM): /* CUDA - CUDA transfer */ if (!req || starpu_asynchronous_copy_disabled() || starpu_asynchronous_cuda_copy_disabled() || !(copy_methods->cuda_to_cuda_async || copy_methods->any_to_any)) { STARPU_ASSERT(copy_methods->cuda_to_cuda || copy_methods->any_to_any); /* this is not associated to a request so it's synchronous */ if (copy_methods->cuda_to_cuda) copy_methods->cuda_to_cuda(src_interface, src_node, dst_interface, dst_node); else copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, NULL); } else { req->async_channel.type = STARPU_CUDA_RAM; cures = cudaEventCreateWithFlags(&req->async_channel.event.cuda_event, cudaEventDisableTiming); if (STARPU_UNLIKELY(cures != cudaSuccess)) STARPU_CUDA_REPORT_ERROR(cures); stream = starpu_cuda_get_peer_transfer_stream(src_node, dst_node); if (copy_methods->cuda_to_cuda_async) ret = copy_methods->cuda_to_cuda_async(src_interface, src_node, dst_interface, dst_node, stream); else { STARPU_ASSERT(copy_methods->any_to_any); ret = copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, &req->async_channel); } cures = cudaEventRecord(req->async_channel.event.cuda_event, stream); if (STARPU_UNLIKELY(cures != cudaSuccess)) STARPU_CUDA_REPORT_ERROR(cures); } break; #endif #ifdef STARPU_USE_OPENCL case _STARPU_MEMORY_NODE_TUPLE(STARPU_OPENCL_RAM,STARPU_CPU_RAM): /* OpenCL -> RAM */ STARPU_ASSERT(_starpu_memory_node_get_local_key() == src_node); if (!req || starpu_asynchronous_copy_disabled() || starpu_asynchronous_opencl_copy_disabled() || !(copy_methods->opencl_to_ram_async || copy_methods->any_to_any)) { STARPU_ASSERT(copy_methods->opencl_to_ram || copy_methods->any_to_any); /* this is not associated to a request so it's synchronous */ if (copy_methods->opencl_to_ram) copy_methods->opencl_to_ram(src_interface, src_node, dst_interface, dst_node); else copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, NULL); } else { req->async_channel.type = STARPU_OPENCL_RAM; if (copy_methods->opencl_to_ram_async) ret = copy_methods->opencl_to_ram_async(src_interface, src_node, dst_interface, dst_node, &(req->async_channel.event.opencl_event)); else { STARPU_ASSERT(copy_methods->any_to_any); ret = copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, &req->async_channel); } } break; case _STARPU_MEMORY_NODE_TUPLE(STARPU_CPU_RAM,STARPU_OPENCL_RAM): /* STARPU_CPU_RAM -> STARPU_OPENCL_RAM */ STARPU_ASSERT(_starpu_memory_node_get_local_key() == dst_node); if (!req || starpu_asynchronous_copy_disabled() || starpu_asynchronous_opencl_copy_disabled() || !(copy_methods->ram_to_opencl_async || copy_methods->any_to_any)) { STARPU_ASSERT(copy_methods->ram_to_opencl || copy_methods->any_to_any); /* this is not associated to a request so it's synchronous */ if (copy_methods->ram_to_opencl) copy_methods->ram_to_opencl(src_interface, src_node, dst_interface, dst_node); else copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, NULL); } else { req->async_channel.type = STARPU_OPENCL_RAM; if (copy_methods->ram_to_opencl_async) ret = copy_methods->ram_to_opencl_async(src_interface, src_node, dst_interface, dst_node, &(req->async_channel.event.opencl_event)); else { STARPU_ASSERT(copy_methods->any_to_any); ret = copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, &req->async_channel); } } break; case _STARPU_MEMORY_NODE_TUPLE(STARPU_OPENCL_RAM,STARPU_OPENCL_RAM): /* STARPU_OPENCL_RAM -> STARPU_OPENCL_RAM */ STARPU_ASSERT(_starpu_memory_node_get_local_key() == dst_node || _starpu_memory_node_get_local_key() == src_node); if (!req || starpu_asynchronous_copy_disabled() || starpu_asynchronous_opencl_copy_disabled() || !(copy_methods->opencl_to_opencl_async || copy_methods->any_to_any)) { STARPU_ASSERT(copy_methods->opencl_to_opencl || copy_methods->any_to_any); /* this is not associated to a request so it's synchronous */ if (copy_methods->opencl_to_opencl) copy_methods->opencl_to_opencl(src_interface, src_node, dst_interface, dst_node); else copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, NULL); } else { req->async_channel.type = STARPU_OPENCL_RAM; if (copy_methods->opencl_to_opencl_async) ret = copy_methods->opencl_to_opencl_async(src_interface, src_node, dst_interface, dst_node, &(req->async_channel.event.opencl_event)); else { STARPU_ASSERT(copy_methods->any_to_any); ret = copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, &req->async_channel); } } break; #endif #ifdef STARPU_USE_MIC case _STARPU_MEMORY_NODE_TUPLE(STARPU_CPU_RAM,STARPU_MIC_RAM): /* RAM -> MIC */ if (!req || starpu_asynchronous_copy_disabled() || starpu_asynchronous_mic_copy_disabled() || !(copy_methods->ram_to_mic_async || copy_methods->any_to_any)) { /* this is not associated to a request so it's synchronous */ STARPU_ASSERT(copy_methods->ram_to_mic || copy_methods->any_to_any); if (copy_methods->ram_to_mic) copy_methods->ram_to_mic(src_interface, src_node, dst_interface, dst_node); else copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, NULL); } else { req->async_channel.type = STARPU_MIC_RAM; if (copy_methods->ram_to_mic_async) ret = copy_methods->ram_to_mic_async(src_interface, src_node, dst_interface, dst_node); else { STARPU_ASSERT(copy_methods->any_to_any); ret = copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, &req->async_channel); } _starpu_mic_init_event(&(req->async_channel.event.mic_event), dst_node); } break; case _STARPU_MEMORY_NODE_TUPLE(STARPU_MIC_RAM,STARPU_CPU_RAM): /* MIC -> RAM */ if (!req || starpu_asynchronous_copy_disabled() || starpu_asynchronous_mic_copy_disabled() || !(copy_methods->mic_to_ram_async || copy_methods->any_to_any)) { /* this is not associated to a request so it's synchronous */ STARPU_ASSERT(copy_methods->mic_to_ram || copy_methods->any_to_any); if (copy_methods->mic_to_ram) copy_methods->mic_to_ram(src_interface, src_node, dst_interface, dst_node); else copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, NULL); } else { req->async_channel.type = STARPU_MIC_RAM; if (copy_methods->mic_to_ram_async) ret = copy_methods->mic_to_ram_async(src_interface, src_node, dst_interface, dst_node); else { STARPU_ASSERT(copy_methods->any_to_any); ret = copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, &req->async_channel); } _starpu_mic_init_event(&(req->async_channel.event.mic_event), src_node); } break; #endif #ifdef STARPU_USE_SCC /* SCC RAM associated to the master process is considered as * the main memory node. */ case _STARPU_MEMORY_NODE_TUPLE(STARPU_CPU_RAM,STARPU_SCC_RAM): /* master private SCC RAM -> slave private SCC RAM */ if (copy_methods->scc_src_to_sink) copy_methods->scc_src_to_sink(src_interface, src_node, dst_interface, dst_node); else copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, NULL); break; case _STARPU_MEMORY_NODE_TUPLE(STARPU_SCC_RAM,STARPU_CPU_RAM): /* slave private SCC RAM -> master private SCC RAM */ if (copy_methods->scc_sink_to_src) copy_methods->scc_sink_to_src(src_interface, src_node, dst_interface, dst_node); else copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, NULL); break; case _STARPU_MEMORY_NODE_TUPLE(STARPU_SCC_RAM,STARPU_SCC_RAM): /* slave private SCC RAM -> slave private SCC RAM */ if (copy_methods->scc_sink_to_sink) copy_methods->scc_sink_to_sink(src_interface, src_node, dst_interface, dst_node); else copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, NULL); break; #endif case _STARPU_MEMORY_NODE_TUPLE(STARPU_CPU_RAM,STARPU_DISK_RAM): if(copy_methods->any_to_any) ret = copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, req && !starpu_asynchronous_copy_disabled() ? &req->async_channel : NULL); else { void *obj = starpu_data_handle_to_pointer(handle, dst_node); void * ptr = NULL; starpu_ssize_t size = 0; handle->ops->pack_data(handle, src_node, &ptr, &size); ret = _starpu_disk_full_write(src_node, dst_node, obj, ptr, size, req && !starpu_asynchronous_copy_disabled() ? &req->async_channel : NULL); if (ret == 0) /* write is already finished, ptr was allocated in pack_data */ free(ptr); /* For now, asynchronous is not supported */ STARPU_ASSERT(ret == 0); } break; case _STARPU_MEMORY_NODE_TUPLE(STARPU_DISK_RAM,STARPU_CPU_RAM): if(copy_methods->any_to_any) ret = copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, req && !starpu_asynchronous_copy_disabled() ? &req->async_channel : NULL); else { void *obj = starpu_data_handle_to_pointer(handle, src_node); void * ptr = NULL; size_t size = 0; ret = _starpu_disk_full_read(src_node, dst_node, obj, &ptr, &size, req && !starpu_asynchronous_copy_disabled() ? &req->async_channel : NULL); if (ret == 0) { /* read is already finished, we can already unpack */ handle->ops->unpack_data(handle, dst_node, ptr, size); /* ptr is allocated in full_read */ free(ptr); } /* For now, asynchronous is not supported */ STARPU_ASSERT(ret == 0); } break; case _STARPU_MEMORY_NODE_TUPLE(STARPU_DISK_RAM,STARPU_DISK_RAM): ret = copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, req ? &req->async_channel : NULL); break; default: STARPU_ABORT(); break; } return ret; #endif /* !SIMGRID */ } int STARPU_ATTRIBUTE_WARN_UNUSED_RESULT _starpu_driver_copy_data_1_to_1(starpu_data_handle_t handle, struct _starpu_data_replicate *src_replicate, struct _starpu_data_replicate *dst_replicate, unsigned donotread, struct _starpu_data_request *req, unsigned may_alloc, unsigned prefetch STARPU_ATTRIBUTE_UNUSED) { if (!donotread) { STARPU_ASSERT(src_replicate->allocated); STARPU_ASSERT(src_replicate->refcnt); } unsigned src_node = src_replicate->memory_node; unsigned dst_node = dst_replicate->memory_node; /* first make sure the destination has an allocated buffer */ if (!dst_replicate->allocated) { if (!may_alloc || _starpu_is_reclaiming(dst_node)) /* We're not supposed to allocate there at the moment */ return -ENOMEM; int ret_alloc = _starpu_allocate_memory_on_node(handle, dst_replicate, req ? req->prefetch : 0); if (ret_alloc) return -ENOMEM; } STARPU_ASSERT(dst_replicate->allocated); STARPU_ASSERT(dst_replicate->refcnt); /* if there is no need to actually read the data, * we do not perform any transfer */ if (!donotread) { unsigned long STARPU_ATTRIBUTE_UNUSED com_id = 0; size_t size = _starpu_data_get_size(handle); _starpu_bus_update_profiling_info((int)src_node, (int)dst_node, size); #ifdef STARPU_USE_FXT com_id = STARPU_ATOMIC_ADDL(&communication_cnt, 1); if (req) req->com_id = com_id; #endif dst_replicate->initialized = 1; _STARPU_TRACE_START_DRIVER_COPY(src_node, dst_node, size, com_id, prefetch, handle); int ret_copy = copy_data_1_to_1_generic(handle, src_replicate, dst_replicate, req); if (!req) /* Synchronous, this is already finished */ _STARPU_TRACE_END_DRIVER_COPY(src_node, dst_node, size, com_id, prefetch); return ret_copy; } return 0; } /* This can be used by interfaces to easily transfer a piece of data without * caring about the particular transfer methods. */ /* This should either return 0 if the transfer is complete, or -EAGAIN if the * transfer is still pending, and will have to be waited for by * _starpu_driver_test_request_completion/_starpu_driver_wait_request_completion */ int starpu_interface_copy(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, void *async_data) { struct _starpu_async_channel *async_channel = async_data; enum starpu_node_kind src_kind = starpu_node_get_kind(src_node); enum starpu_node_kind dst_kind = starpu_node_get_kind(dst_node); switch (_STARPU_MEMORY_NODE_TUPLE(src_kind,dst_kind)) { case _STARPU_MEMORY_NODE_TUPLE(STARPU_CPU_RAM,STARPU_CPU_RAM): memcpy((void *) (dst + dst_offset), (void *) (src + src_offset), size); return 0; #ifdef STARPU_USE_CUDA case _STARPU_MEMORY_NODE_TUPLE(STARPU_CUDA_RAM,STARPU_CPU_RAM): return starpu_cuda_copy_async_sync( (void*) (src + src_offset), src_node, (void*) (dst + dst_offset), dst_node, size, async_channel?starpu_cuda_get_local_out_transfer_stream():NULL, cudaMemcpyDeviceToHost); case _STARPU_MEMORY_NODE_TUPLE(STARPU_CPU_RAM,STARPU_CUDA_RAM): return starpu_cuda_copy_async_sync( (void*) (src + src_offset), src_node, (void*) (dst + dst_offset), dst_node, size, async_channel?starpu_cuda_get_local_in_transfer_stream():NULL, cudaMemcpyHostToDevice); case _STARPU_MEMORY_NODE_TUPLE(STARPU_CUDA_RAM,STARPU_CUDA_RAM): return starpu_cuda_copy_async_sync( (void*) (src + src_offset), src_node, (void*) (dst + dst_offset), dst_node, size, async_channel?starpu_cuda_get_peer_transfer_stream(src_node, dst_node):NULL, cudaMemcpyDeviceToDevice); #endif #ifdef STARPU_USE_OPENCL case _STARPU_MEMORY_NODE_TUPLE(STARPU_OPENCL_RAM,STARPU_CPU_RAM): case _STARPU_MEMORY_NODE_TUPLE(STARPU_CPU_RAM,STARPU_OPENCL_RAM): case _STARPU_MEMORY_NODE_TUPLE(STARPU_OPENCL_RAM,STARPU_OPENCL_RAM): return starpu_opencl_copy_async_sync( src, src_offset, src_node, dst, dst_offset, dst_node, size, &async_channel->event.opencl_event); #endif #ifdef STARPU_USE_MIC case _STARPU_MEMORY_NODE_TUPLE(STARPU_MIC_RAM,STARPU_CPU_RAM): if (async_data) return _starpu_mic_copy_mic_to_ram_async( (void*) (src + src_offset), src_node, (void*) (dst + dst_offset), dst_node, size); else return _starpu_mic_copy_mic_to_ram( (void*) (src + src_offset), src_node, (void*) (dst + dst_offset), dst_node, size); case _STARPU_MEMORY_NODE_TUPLE(STARPU_CPU_RAM,STARPU_MIC_RAM): if (async_data) return _starpu_mic_copy_ram_to_mic_async( (void*) (src + src_offset), src_node, (void*) (dst + dst_offset), dst_node, size); else return _starpu_mic_copy_ram_to_mic( (void*) (src + src_offset), src_node, (void*) (dst + dst_offset), dst_node, size); #endif #ifdef STARPU_USE_SCC case _STARPU_MEMORY_NODE_TUPLE(STARPU_SCC_RAM,STARPU_CPU_RAM): return _starpu_scc_copy_sink_to_src( (void*) (src + src_offset), src_node, (void*) (dst + dst_offset), dst_node, size); case _STARPU_MEMORY_NODE_TUPLE(STARPU_CPU_RAM,STARPU_SCC_RAM): return _starpu_scc_copy_src_to_sink( (void*) (src + src_offset), src_node, (void*) (dst + dst_offset), dst_node, size); case _STARPU_MEMORY_NODE_TUPLE(STARPU_SCC_RAM,STARPU_SCC_RAM): return _starpu_scc_copy_sink_to_sink( (void*) (src + src_offset), src_node, (void*) (dst + dst_offset), dst_node, size); #endif case _STARPU_MEMORY_NODE_TUPLE(STARPU_CPU_RAM, STARPU_DISK_RAM): { return _starpu_disk_copy_src_to_disk( (void*) (src + src_offset), src_node, (void*) dst, dst_offset, dst_node, size, async_channel); } case _STARPU_MEMORY_NODE_TUPLE(STARPU_DISK_RAM, STARPU_CPU_RAM): return _starpu_disk_copy_disk_to_src( (void*) src, src_offset, src_node, (void*) (dst + dst_offset), dst_node, size, async_channel); case _STARPU_MEMORY_NODE_TUPLE(STARPU_DISK_RAM, STARPU_DISK_RAM): return _starpu_disk_copy_disk_to_disk( (void*) src, src_offset, src_node, (void*) dst, dst_offset, dst_node, size, async_channel); default: STARPU_ABORT(); return -1; } return 0; } void _starpu_driver_wait_request_completion(struct _starpu_async_channel *async_channel) { #ifdef STARPU_SIMGRID STARPU_PTHREAD_MUTEX_LOCK(&async_channel->event.mutex); while (!async_channel->event.finished) STARPU_PTHREAD_COND_WAIT(&async_channel->event.cond, &async_channel->event.mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&async_channel->event.mutex); #else /* !SIMGRID */ enum starpu_node_kind kind = async_channel->type; #ifdef STARPU_USE_CUDA cudaEvent_t event; cudaError_t cures; #endif switch (kind) { #ifdef STARPU_USE_CUDA case STARPU_CUDA_RAM: event = (*async_channel).event.cuda_event; cures = cudaEventSynchronize(event); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); cures = cudaEventDestroy(event); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); break; #endif #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_RAM: { cl_int err; if ((*async_channel).event.opencl_event == NULL) STARPU_ABORT(); err = clWaitForEvents(1, &((*async_channel).event.opencl_event)); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); err = clReleaseEvent((*async_channel).event.opencl_event); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); break; } #endif #ifdef STARPU_USE_MIC case STARPU_MIC_RAM: _starpu_mic_wait_request_completion(&(async_channel->event.mic_event)); break; #endif case STARPU_MAIN_RAM: starpu_disk_wait_request(async_channel); break; case STARPU_CPU_RAM: default: STARPU_ABORT(); } #endif /* !SIMGRID */ } unsigned _starpu_driver_test_request_completion(struct _starpu_async_channel *async_channel) { #ifdef STARPU_SIMGRID unsigned ret; STARPU_PTHREAD_MUTEX_LOCK(&async_channel->event.mutex); ret = async_channel->event.finished; STARPU_PTHREAD_MUTEX_UNLOCK(&async_channel->event.mutex); return ret; #else /* !SIMGRID */ enum starpu_node_kind kind = async_channel->type; unsigned success = 0; #ifdef STARPU_USE_CUDA cudaEvent_t event; #endif switch (kind) { #ifdef STARPU_USE_CUDA case STARPU_CUDA_RAM: event = (*async_channel).event.cuda_event; cudaError_t cures = cudaEventQuery(event); success = (cures == cudaSuccess); if (success) cudaEventDestroy(event); else if (cures != cudaErrorNotReady) STARPU_CUDA_REPORT_ERROR(cures); break; #endif #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_RAM: { cl_int event_status; cl_event opencl_event = (*async_channel).event.opencl_event; if (opencl_event == NULL) STARPU_ABORT(); cl_int err = clGetEventInfo(opencl_event, CL_EVENT_COMMAND_EXECUTION_STATUS, sizeof(event_status), &event_status, NULL); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); if (event_status < 0) STARPU_OPENCL_REPORT_ERROR(event_status); if (event_status == CL_COMPLETE) { err = clReleaseEvent(opencl_event); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); } success = (event_status == CL_COMPLETE); break; } #endif #ifdef STARPU_USE_MIC case STARPU_MIC_RAM: success = _starpu_mic_request_is_complete(&(async_channel->event.mic_event)); break; #endif case STARPU_DISK_RAM: success = starpu_disk_test_request(async_channel); break; case STARPU_CPU_RAM: default: STARPU_ABORT(); } return success; #endif /* !SIMGRID */ } starpu-1.2.3+dfsg/src/datawizard/copy_driver.h000066400000000000000000000051341320135501600213700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2013, 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __COPY_DRIVER_H__ #define __COPY_DRIVER_H__ #ifdef HAVE_AIO_H #include #endif #include #ifdef STARPU_USE_CUDA #include #include #endif #ifdef STARPU_USE_OPENCL #include #endif #ifdef __cplusplus extern "C" { #endif struct _starpu_data_request; struct _starpu_data_replicate; #ifdef STARPU_USE_MIC /* MIC needs memory_node to know which MIC is concerned. * mark is used to wait asynchronous request. * signal is used to test asynchronous request. */ struct _starpu_mic_async_event { unsigned memory_node; int mark; uint64_t *signal; }; #endif struct _starpu_disk_async_event { unsigned memory_node; void *backend_event; }; /* this is a structure that can be queried to see whether an asynchronous * transfer has terminated or not */ union _starpu_async_channel_event { #ifdef STARPU_SIMGRID struct { unsigned finished; starpu_pthread_mutex_t mutex; starpu_pthread_cond_t cond; }; #endif #ifdef STARPU_USE_CUDA cudaEvent_t cuda_event; #endif #ifdef STARPU_USE_OPENCL cl_event opencl_event; #endif #ifdef STARPU_USE_MIC struct _starpu_mic_async_event mic_event; #endif struct _starpu_disk_async_event disk_event; }; struct _starpu_async_channel { union _starpu_async_channel_event event; enum starpu_node_kind type; }; void _starpu_wake_all_blocked_workers_on_node(unsigned nodeid); int _starpu_driver_copy_data_1_to_1(starpu_data_handle_t handle, struct _starpu_data_replicate *src_replicate, struct _starpu_data_replicate *dst_replicate, unsigned donotread, struct _starpu_data_request *req, unsigned may_alloc, unsigned prefetch); unsigned _starpu_driver_test_request_completion(struct _starpu_async_channel *async_channel); void _starpu_driver_wait_request_completion(struct _starpu_async_channel *async_channel); #ifdef __cplusplus } #endif #endif // __COPY_DRIVER_H__ starpu-1.2.3+dfsg/src/datawizard/data_request.c000066400000000000000000000630421320135501600215210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2015, 2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include /* TODO: This should be tuned according to driver capabilities * Data interfaces should also have to declare how many asynchronous requests * they have actually started (think of e.g. csr). */ #define MAX_PENDING_REQUESTS_PER_NODE 20 #define MAX_PENDING_PREFETCH_REQUESTS_PER_NODE 10 #define MAX_PENDING_IDLE_REQUESTS_PER_NODE 1 #define MAX_PUSH_TIME 1000 /* Maximum time in us that we can afford pushing requests before going back to the driver loop, e.g. for checking GPU task termination */ /* requests that have not been treated at all */ static struct _starpu_data_request_list data_requests[STARPU_MAXNODES]; static struct _starpu_data_request_list prefetch_requests[STARPU_MAXNODES]; static struct _starpu_data_request_list idle_requests[STARPU_MAXNODES]; static starpu_pthread_mutex_t data_requests_list_mutex[STARPU_MAXNODES]; /* requests that are not terminated (eg. async transfers) */ static struct _starpu_data_request_list data_requests_pending[STARPU_MAXNODES]; static unsigned data_requests_npending[STARPU_MAXNODES]; static starpu_pthread_mutex_t data_requests_pending_list_mutex[STARPU_MAXNODES]; void _starpu_init_data_request_lists(void) { unsigned i; for (i = 0; i < STARPU_MAXNODES; i++) { _starpu_data_request_list_init(&data_requests[i]); _starpu_data_request_list_init(&prefetch_requests[i]); _starpu_data_request_list_init(&idle_requests[i]); /* Tell helgrind that we are fine with checking for list_empty * in _starpu_handle_node_data_requests, we will call it * periodically anyway */ STARPU_HG_DISABLE_CHECKING(data_requests[i]._head); STARPU_HG_DISABLE_CHECKING(prefetch_requests[i]._head); STARPU_HG_DISABLE_CHECKING(idle_requests[i]._head); STARPU_PTHREAD_MUTEX_INIT(&data_requests_list_mutex[i], NULL); _starpu_data_request_list_init(&data_requests_pending[i]); data_requests_npending[i] = 0; STARPU_PTHREAD_MUTEX_INIT(&data_requests_pending_list_mutex[i], NULL); } STARPU_HG_DISABLE_CHECKING(data_requests_npending); } void _starpu_deinit_data_request_lists(void) { unsigned i; for (i = 0; i < STARPU_MAXNODES; i++) { STARPU_PTHREAD_MUTEX_DESTROY(&data_requests_pending_list_mutex[i]); STARPU_PTHREAD_MUTEX_DESTROY(&data_requests_list_mutex[i]); } } /* Unlink the request from the handle. New requests can then be made. */ /* this should be called with the lock r->handle->header_lock taken */ static void _starpu_data_request_unlink(struct _starpu_data_request *r) { _starpu_spin_checklocked(&r->handle->header_lock); /* If this is a write invalidation request, we store it in the handle */ if (r->handle->write_invalidation_req == r) { STARPU_ASSERT(r->mode == STARPU_W); r->handle->write_invalidation_req = NULL; } else if (r->mode & STARPU_R) { /* If this is a read request, we store the pending requests * between src and dst. */ unsigned node = r->src_replicate->memory_node; STARPU_ASSERT(r->dst_replicate->request[node] == r); r->dst_replicate->request[node] = NULL; } else { /* If this is a write only request, then there is no source and * we use the destination node to cache the request. */ unsigned node = r->dst_replicate->memory_node; STARPU_ASSERT(r->dst_replicate->request[node] == r); r->dst_replicate->request[node] = NULL; } } static void _starpu_data_request_destroy(struct _starpu_data_request *r) { switch (r->async_channel.type) { case STARPU_DISK_RAM: starpu_disk_free_request(&r->async_channel); break; default: break; } //fprintf(stderr, "DESTROY REQ %p (%d) refcnt %d\n", r, node, r->refcnt); _starpu_data_request_delete(r); } /* handle->lock should already be taken ! */ struct _starpu_data_request *_starpu_create_data_request(starpu_data_handle_t handle, struct _starpu_data_replicate *src_replicate, struct _starpu_data_replicate *dst_replicate, int handling_node, enum starpu_data_access_mode mode, unsigned ndeps, unsigned is_prefetch, unsigned is_write_invalidation) { struct _starpu_data_request *r = _starpu_data_request_new(); _starpu_spin_checklocked(&handle->header_lock); _starpu_spin_init(&r->lock); r->handle = handle; r->src_replicate = src_replicate; r->dst_replicate = dst_replicate; r->mode = mode; r->async_channel.type = STARPU_UNUSED; if (handling_node == -1) handling_node = STARPU_MAIN_RAM; r->handling_node = handling_node; STARPU_ASSERT(handling_node == STARPU_MAIN_RAM || _starpu_memory_node_get_nworkers(handling_node)); r->completed = 0; r->prefetch = is_prefetch; r->retval = -1; r->ndeps = ndeps; r->next_req_count = 0; r->callbacks = NULL; r->com_id = 0; _starpu_spin_lock(&r->lock); /* Take a reference on the target for the request to be able to write it */ if (dst_replicate) dst_replicate->refcnt++; handle->busy_count++; if (is_write_invalidation) { STARPU_ASSERT(!handle->write_invalidation_req); handle->write_invalidation_req = r; } else if (mode & STARPU_R) { unsigned src_node = src_replicate->memory_node; STARPU_ASSERT(!dst_replicate->request[src_node]); dst_replicate->request[src_node] = r; /* Take a reference on the source for the request to be able to read it */ src_replicate->refcnt++; handle->busy_count++; } else { unsigned dst_node = dst_replicate->memory_node; STARPU_ASSERT(!dst_replicate->request[dst_node]); dst_replicate->request[dst_node] = r; } r->refcnt = 1; _starpu_spin_unlock(&r->lock); return r; } int _starpu_wait_data_request_completion(struct _starpu_data_request *r, unsigned may_alloc) { int retval; int do_delete = 0; int completed; unsigned local_node = _starpu_memory_node_get_local_key(); struct _starpu_worker *worker = _starpu_get_local_worker_key(); enum _starpu_worker_status old_status = STATUS_UNKNOWN; if (worker) { old_status = worker->status ; _starpu_set_worker_status(worker, STATUS_WAITING); } do { STARPU_SYNCHRONIZE(); if (STARPU_RUNNING_ON_VALGRIND) completed = 1; else completed = r->completed; if (completed) { _starpu_spin_lock(&r->lock); if (r->completed) break; _starpu_spin_unlock(&r->lock); } #ifndef STARPU_NON_BLOCKING_DRIVERS /* XXX: shouldn't be needed, and doesn't work with chained requests anyway */ _starpu_wake_all_blocked_workers_on_node(r->handling_node); #endif _starpu_datawizard_progress(local_node, may_alloc); } while (1); if (worker) { _starpu_set_worker_status(worker, old_status); } retval = r->retval; if (retval) _STARPU_DISP("REQUEST %p completed with retval %d!\n", r, r->retval); r->refcnt--; /* if nobody is waiting on that request, we can get rid of it */ if (r->refcnt == 0) do_delete = 1; _starpu_spin_unlock(&r->lock); if (do_delete) _starpu_data_request_destroy(r); return retval; } /* this is non blocking */ void _starpu_post_data_request(struct _starpu_data_request *r) { unsigned handling_node = r->handling_node; /* We don't have a worker for disk nodes, these should have been posted to a main RAM node */ STARPU_ASSERT(starpu_node_get_kind(handling_node) != STARPU_DISK_RAM); STARPU_ASSERT(handling_node == STARPU_MAIN_RAM || _starpu_memory_node_get_nworkers(handling_node)); // _STARPU_DEBUG("POST REQUEST\n"); /* If some dependencies are not fulfilled yet, we don't actually post the request */ if (r->ndeps > 0) return; if (r->mode & STARPU_R) { STARPU_ASSERT(r->src_replicate->allocated); STARPU_ASSERT(r->src_replicate->refcnt); } /* insert the request in the proper list */ STARPU_PTHREAD_MUTEX_LOCK(&data_requests_list_mutex[handling_node]); if (r->prefetch == 2) _starpu_data_request_list_push_back(&idle_requests[handling_node], r); else if (r->prefetch) _starpu_data_request_list_push_back(&prefetch_requests[handling_node], r); else _starpu_data_request_list_push_back(&data_requests[handling_node], r); STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_list_mutex[handling_node]); #ifndef STARPU_NON_BLOCKING_DRIVERS _starpu_wake_all_blocked_workers_on_node(handling_node); #endif } /* We assume that r->lock is taken by the caller */ void _starpu_data_request_append_callback(struct _starpu_data_request *r, void (*callback_func)(void *), void *callback_arg) { STARPU_ASSERT(r); if (callback_func) { struct _starpu_callback_list *link; _STARPU_MALLOC(link, sizeof(struct _starpu_callback_list)); link->callback_func = callback_func; link->callback_arg = callback_arg; link->next = r->callbacks; r->callbacks = link; } } /* This method is called with handle's header_lock taken, and unlocks it */ static void starpu_handle_data_request_completion(struct _starpu_data_request *r) { unsigned do_delete = 0; starpu_data_handle_t handle = r->handle; enum starpu_data_access_mode mode = r->mode; struct _starpu_data_replicate *src_replicate = r->src_replicate; struct _starpu_data_replicate *dst_replicate = r->dst_replicate; if (dst_replicate) { #ifdef STARPU_MEMORY_STATS enum _starpu_cache_state old_src_replicate_state = src_replicate->state; #endif _starpu_spin_checklocked(&handle->header_lock); _starpu_update_data_state(handle, r->dst_replicate, mode); #ifdef STARPU_MEMORY_STATS if (src_replicate->state == STARPU_INVALID) { if (old_src_replicate_state == STARPU_OWNER) _starpu_memory_handle_stats_invalidated(handle, src_replicate->memory_node); else { /* XXX Currently only ex-OWNER are tagged as invalidated */ /* XXX Have to check all old state of every node in case a SHARED data become OWNED by the dst_replicate */ } } if (dst_replicate->state == STARPU_SHARED) _starpu_memory_handle_stats_loaded_shared(handle, dst_replicate->memory_node); else if (dst_replicate->state == STARPU_OWNER) { _starpu_memory_handle_stats_loaded_owner(handle, dst_replicate->memory_node); } #endif } if (r->com_id > 0) { #ifdef STARPU_USE_FXT unsigned src_node = src_replicate->memory_node; unsigned dst_node = dst_replicate->memory_node; size_t size = _starpu_data_get_size(handle); _STARPU_TRACE_END_DRIVER_COPY(src_node, dst_node, size, r->com_id, r->prefetch); #endif } /* Once the request has been fulfilled, we may submit the requests that * were chained to that request. */ unsigned chained_req; for (chained_req = 0; chained_req < r->next_req_count; chained_req++) { struct _starpu_data_request *next_req = r->next_req[chained_req]; STARPU_ASSERT(next_req->ndeps > 0); next_req->ndeps--; _starpu_post_data_request(next_req); } r->completed = 1; /* Remove a reference on the destination replicate for the request */ if (dst_replicate) { STARPU_ASSERT(dst_replicate->refcnt > 0); dst_replicate->refcnt--; } STARPU_ASSERT(handle->busy_count > 0); handle->busy_count--; /* In case the source was "locked" by the request too */ if (mode & STARPU_R) { STARPU_ASSERT(src_replicate->refcnt > 0); src_replicate->refcnt--; STARPU_ASSERT(handle->busy_count > 0); handle->busy_count--; } _starpu_data_request_unlink(r); unsigned destroyed = _starpu_data_check_not_busy(handle); r->refcnt--; /* if nobody is waiting on that request, we can get rid of it */ if (r->refcnt == 0) do_delete = 1; r->retval = 0; /* In case there are one or multiple callbacks, we execute them now. */ struct _starpu_callback_list *callbacks = r->callbacks; _starpu_spin_unlock(&r->lock); if (do_delete) _starpu_data_request_destroy(r); if (!destroyed) _starpu_spin_unlock(&handle->header_lock); /* We do the callback once the lock is released so that they can do * blocking operations with the handle (eg. release it) */ while (callbacks) { callbacks->callback_func(callbacks->callback_arg); struct _starpu_callback_list *next = callbacks->next; free(callbacks); callbacks = next; } } /* TODO : accounting to see how much time was spent working for other people ... */ static int starpu_handle_data_request(struct _starpu_data_request *r, unsigned may_alloc, int prefetch) { starpu_data_handle_t handle = r->handle; #ifndef STARPU_SIMGRID if (_starpu_spin_trylock(&handle->header_lock)) return -EBUSY; if (_starpu_spin_trylock(&r->lock)) { _starpu_spin_unlock(&handle->header_lock); return -EBUSY; } #else /* Have to wait for the handle, whatever it takes, in simgrid, * since we can not afford going to sleep, since nobody would wake us * up. */ _starpu_spin_lock(&handle->header_lock); _starpu_spin_lock(&r->lock); #endif struct _starpu_data_replicate *src_replicate = r->src_replicate; struct _starpu_data_replicate *dst_replicate = r->dst_replicate; enum starpu_data_access_mode r_mode = r->mode; STARPU_ASSERT(!(r_mode & STARPU_R) || src_replicate); STARPU_ASSERT(!(r_mode & STARPU_R) || src_replicate->allocated); STARPU_ASSERT(!(r_mode & STARPU_R) || src_replicate->refcnt); _starpu_spin_unlock(&r->lock); /* FIXME: the request may get upgraded from here to freeing it... */ /* perform the transfer */ /* the header of the data must be locked by the worker that submitted the request */ if (dst_replicate && dst_replicate->state == STARPU_INVALID) r->retval = _starpu_driver_copy_data_1_to_1(handle, src_replicate, dst_replicate, !(r_mode & STARPU_R), r, may_alloc, prefetch); else /* Already valid actually, no need to transfer anything */ r->retval = 0; if (r->retval == -ENOMEM) { /* If there was not enough memory, we will try to redo the * request later. */ _starpu_spin_unlock(&handle->header_lock); return -ENOMEM; } if (r->retval == -EAGAIN) { /* The request was successful, but could not be terminated * immediately. We will handle the completion of the request * asynchronously. The request is put in the list of "pending" * requests in the meantime. */ _starpu_spin_unlock(&handle->header_lock); STARPU_PTHREAD_MUTEX_LOCK(&data_requests_pending_list_mutex[r->handling_node]); _starpu_data_request_list_push_back(&data_requests_pending[r->handling_node], r); data_requests_npending[r->handling_node]++; STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_pending_list_mutex[r->handling_node]); return -EAGAIN; } /* the request has been handled */ _starpu_spin_lock(&r->lock); starpu_handle_data_request_completion(r); return 0; } static int __starpu_handle_node_data_requests(struct _starpu_data_request_list *reqlist, unsigned src_node, unsigned may_alloc, unsigned n, unsigned *pushed, unsigned prefetch) { struct _starpu_data_request *r; struct _starpu_data_request_list new_data_requests[prefetch + 1]; /* Indexed by prefetch level */ unsigned i; int ret = 0; *pushed = 0; #ifdef STARPU_NON_BLOCKING_DRIVERS /* This is racy, but not posing problems actually, since we know we * will come back here to probe again regularly anyway. * Thus, do not expose this optimization to helgrind */ if (!STARPU_RUNNING_ON_VALGRIND && _starpu_data_request_list_empty(&reqlist[src_node])) return 0; #endif /* TODO optimize */ #ifdef STARPU_NON_BLOCKING_DRIVERS /* take all the entries from the request list */ if (STARPU_PTHREAD_MUTEX_TRYLOCK(&data_requests_list_mutex[src_node])) { /* List is busy, do not bother with it */ return -EBUSY; } #else STARPU_PTHREAD_MUTEX_LOCK(&data_requests_list_mutex[src_node]); #endif if (_starpu_data_request_list_empty(&reqlist[src_node])) { /* there is no request */ STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_list_mutex[src_node]); return 0; } /* There is an entry: we create a new empty list to replace the list of * requests, and we handle the request(s) one by one in the former * list, without concurrency issues.*/ struct _starpu_data_request_list local_list = reqlist[src_node]; _starpu_data_request_list_init(&reqlist[src_node]); STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_list_mutex[src_node]); for (i = 0; i <= prefetch; i++) _starpu_data_request_list_init(&new_data_requests[i]); double start = starpu_timing_now(); /* for all entries of the list */ while (!_starpu_data_request_list_empty(&local_list)) { int res; if (data_requests_npending[src_node] >= n) { /* Too many requests at the same time, skip pushing * more for now */ ret = -EBUSY; break; } r = _starpu_data_request_list_pop_front(&local_list); res = starpu_handle_data_request(r, may_alloc, prefetch); if (res != 0 && res != -EAGAIN) { /* handle is busy, or not enough memory, postpone for now */ ret = res; /* Prefetch requests might have gotten promoted while in tmp list */ _starpu_data_request_list_push_back(&new_data_requests[r->prefetch], r); if (prefetch) /* Prefetching more there would make the situation even worse */ break; } (*pushed)++; if (starpu_timing_now() - start >= MAX_PUSH_TIME) { /* We have spent a lot of time doing requests, skip pushing more for now */ ret = -EBUSY; break; } } /* Push back requests we didn't handle on the proper list */ while (!_starpu_data_request_list_empty(&local_list)) { r = _starpu_data_request_list_pop_front(&local_list); /* Prefetch requests might have gotten promoted while in tmp list */ _starpu_data_request_list_push_back(&new_data_requests[r->prefetch], r); } for (i = 0; i <= prefetch; i++) if (!_starpu_data_request_list_empty(&new_data_requests[i])) break; if (i <= prefetch) { STARPU_PTHREAD_MUTEX_LOCK(&data_requests_list_mutex[src_node]); if (!(_starpu_data_request_list_empty(&new_data_requests[0]))) _starpu_data_request_list_push_list_front(&new_data_requests[0], &data_requests[src_node]); if (prefetch >= 1 && !(_starpu_data_request_list_empty(&new_data_requests[1]))) _starpu_data_request_list_push_list_front(&new_data_requests[1], &prefetch_requests[src_node]); if (prefetch >= 2 && !(_starpu_data_request_list_empty(&new_data_requests[2]))) _starpu_data_request_list_push_list_front(&new_data_requests[2], &idle_requests[src_node]); STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_list_mutex[src_node]); #ifndef STARPU_NON_BLOCKING_DRIVERS _starpu_wake_all_blocked_workers_on_node(src_node); #endif } return ret; } int _starpu_handle_node_data_requests(unsigned src_node, unsigned may_alloc, unsigned *pushed) { return __starpu_handle_node_data_requests(data_requests, src_node, may_alloc, MAX_PENDING_REQUESTS_PER_NODE, pushed, 0); } int _starpu_handle_node_prefetch_requests(unsigned src_node, unsigned may_alloc, unsigned *pushed) { return __starpu_handle_node_data_requests(prefetch_requests, src_node, may_alloc, MAX_PENDING_PREFETCH_REQUESTS_PER_NODE, pushed, 1); } int _starpu_handle_node_idle_requests(unsigned src_node, unsigned may_alloc, unsigned *pushed) { return __starpu_handle_node_data_requests(idle_requests, src_node, may_alloc, MAX_PENDING_IDLE_REQUESTS_PER_NODE, pushed, 2); } static int _handle_pending_node_data_requests(unsigned src_node, unsigned force) { // _STARPU_DEBUG("_starpu_handle_pending_node_data_requests ...\n"); // struct _starpu_data_request_list new_data_requests_pending; unsigned taken, kept; #ifdef STARPU_NON_BLOCKING_DRIVERS /* Here helgrind would should that this is an un protected access. * We however don't care about missing an entry, we will get called * again sooner or later. */ if (!STARPU_RUNNING_ON_VALGRIND && _starpu_data_request_list_empty(&data_requests_pending[src_node])) return 0; #endif #ifdef STARPU_NON_BLOCKING_DRIVERS if (!force) { if (STARPU_PTHREAD_MUTEX_TRYLOCK(&data_requests_pending_list_mutex[src_node])) { /* List is busy, do not bother with it */ return 0; } } else #endif /* We really want to handle requests */ STARPU_PTHREAD_MUTEX_LOCK(&data_requests_pending_list_mutex[src_node]); if (_starpu_data_request_list_empty(&data_requests_pending[src_node])) { /* there is no request */ STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_pending_list_mutex[src_node]); return 0; } /* for all entries of the list */ struct _starpu_data_request_list local_list = data_requests_pending[src_node]; _starpu_data_request_list_init(&data_requests_pending[src_node]); STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_pending_list_mutex[src_node]); _starpu_data_request_list_init(&new_data_requests_pending); taken = 0; kept = 0; while (!_starpu_data_request_list_empty(&local_list)) { struct _starpu_data_request *r; r = _starpu_data_request_list_pop_front(&local_list); taken++; starpu_data_handle_t handle = r->handle; #ifndef STARPU_SIMGRID if (force) /* Have to wait for the handle, whatever it takes */ #endif /* Or when running in simgrid, in which case we can not * afford going to sleep, since nobody would wake us * up. */ _starpu_spin_lock(&handle->header_lock); #ifndef STARPU_SIMGRID else if (_starpu_spin_trylock(&handle->header_lock)) { /* Handle is busy, retry this later */ _starpu_data_request_list_push_back(&new_data_requests_pending, r); kept++; continue; } #endif /* This shouldn't be too hard to acquire */ _starpu_spin_lock(&r->lock); /* wait until the transfer is terminated */ if (force) { _starpu_driver_wait_request_completion(&r->async_channel); starpu_handle_data_request_completion(r); } else { if (_starpu_driver_test_request_completion(&r->async_channel)) { /* The request was completed */ starpu_handle_data_request_completion(r); } else { /* The request was not completed, so we put it * back again on the list of pending requests * so that it can be handled later on. */ _starpu_spin_unlock(&r->lock); _starpu_spin_unlock(&handle->header_lock); _starpu_data_request_list_push_back(&new_data_requests_pending, r); kept++; } } } STARPU_PTHREAD_MUTEX_LOCK(&data_requests_pending_list_mutex[src_node]); data_requests_npending[src_node] -= taken - kept; if (kept) _starpu_data_request_list_push_list_back(&data_requests_pending[src_node], &new_data_requests_pending); STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_pending_list_mutex[src_node]); return taken - kept; } int _starpu_handle_pending_node_data_requests(unsigned src_node) { return _handle_pending_node_data_requests(src_node, 0); } int _starpu_handle_all_pending_node_data_requests(unsigned src_node) { return _handle_pending_node_data_requests(src_node, 1); } /* Note: the returned value will be outdated since the locks are not taken at * entry/exit */ int _starpu_check_that_no_data_request_exists(unsigned node) { int no_request; int no_pending; STARPU_PTHREAD_MUTEX_LOCK(&data_requests_list_mutex[node]); no_request = _starpu_data_request_list_empty(&data_requests[node]) && _starpu_data_request_list_empty(&prefetch_requests[node]) && _starpu_data_request_list_empty(&idle_requests[node]); STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_list_mutex[node]); STARPU_PTHREAD_MUTEX_LOCK(&data_requests_pending_list_mutex[node]); no_pending = !data_requests_npending[node]; STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_pending_list_mutex[node]); return no_request && no_pending; } /* Note: the returned value will be outdated since the locks are not taken at * entry/exit */ int _starpu_check_that_no_data_request_is_pending(unsigned node) { return !data_requests_npending[node]; } void _starpu_update_prefetch_status(struct _starpu_data_request *r, unsigned prefetch) { STARPU_ASSERT(r->prefetch > prefetch); r->prefetch=prefetch; /* We have to promote chained_request too! */ unsigned chained_req; for (chained_req = 0; chained_req < r->next_req_count; chained_req++) { struct _starpu_data_request *next_req = r->next_req[chained_req]; if (next_req->prefetch > prefetch) _starpu_update_prefetch_status(next_req, prefetch); } STARPU_PTHREAD_MUTEX_LOCK(&data_requests_list_mutex[r->handling_node]); /* The request can be in a different list (handling request or the temp list) * we have to check that it is really in the prefetch list. */ struct _starpu_data_request *r_iter; for (r_iter = _starpu_data_request_list_begin(&prefetch_requests[r->handling_node]); r_iter != _starpu_data_request_list_end(&prefetch_requests[r->handling_node]); r_iter = _starpu_data_request_list_next(r_iter)) { if (r==r_iter) { _starpu_data_request_list_erase(&prefetch_requests[r->handling_node],r); _starpu_data_request_list_push_back(&data_requests[r->handling_node],r); goto found; } } /* The request can be in a different list (handling request or the temp list) * we have to check that it is really in the idle list. */ for (r_iter = _starpu_data_request_list_begin(&idle_requests[r->handling_node]); r_iter != _starpu_data_request_list_end(&idle_requests[r->handling_node]); r_iter = _starpu_data_request_list_next(r_iter)) { if (r==r_iter) { _starpu_data_request_list_erase(&idle_requests[r->handling_node],r); if (prefetch == 1) _starpu_data_request_list_push_back(&prefetch_requests[r->handling_node],r); else _starpu_data_request_list_push_back(&data_requests[r->handling_node],r); goto found; } } found: STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_list_mutex[r->handling_node]); #ifndef STARPU_NON_BLOCKING_DRIVERS _starpu_wake_all_blocked_workers_on_node(r->handling_node); #endif } starpu-1.2.3+dfsg/src/datawizard/data_request.h000066400000000000000000000117241320135501600215260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2010, 2013-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* This one includes us, so make sure to include it first */ #include #ifndef __DATA_REQUEST_H__ #define __DATA_REQUEST_H__ #include #include #include #include struct _starpu_data_replicate; struct _starpu_callback_list { void (*callback_func)(void *); void *callback_arg; struct _starpu_callback_list *next; }; /* This represents a data request, i.e. we want some data to get transferred * from a source to a destination. */ LIST_TYPE(_starpu_data_request, struct _starpu_spinlock lock; unsigned refcnt; starpu_data_handle_t handle; struct _starpu_data_replicate *src_replicate; struct _starpu_data_replicate *dst_replicate; /* Which memory node will actually perform the transfer. * This is important in the CUDA/OpenCL case, where only the worker for * the node can make the CUDA/OpenCL calls. */ unsigned handling_node; /* * What the destination node wants to do with the data: write to it, * read it, or read and write to it. Only in the two latter cases we * need an actual transfer, the first only needs an allocation. * * With mapped buffers, an additional case is mode = 0, which means * unmapping the buffer. */ enum starpu_data_access_mode mode; /* Elements needed to make the transfer asynchronous */ struct _starpu_async_channel async_channel; /* Whether the transfer is completed. */ unsigned completed; /* Whether this is just a prefetch request: * 0 for fetch, * 1 for prefetch (dependencies have just been released) * 2 for idle (a good idea to do it some time, but no hurry at all) */ unsigned prefetch; /* The value returned by the transfer function */ int retval; /* The request will not actually be submitted until there remains * dependencies. */ unsigned ndeps; /* in case we have a chain of request (eg. for nvidia multi-GPU), this * is the list of requests which are waiting for this one. */ struct _starpu_data_request *next_req[STARPU_MAXNODES+1]; /* The number of requests in next_req */ unsigned next_req_count; struct _starpu_callback_list *callbacks; unsigned long com_id; ) /* Everyone that wants to access some piece of data will post a request. * Not only StarPU internals, but also the application may put such requests */ LIST_TYPE(_starpu_data_requester, /* what kind of access is requested ? */ enum starpu_data_access_mode mode; /* applications may also directly manipulate data */ unsigned is_requested_by_codelet; /* in case this is a codelet that will do the access */ struct _starpu_job *j; unsigned buffer_index; /* if this is more complicated ... (eg. application request) * NB: this callback is not called with the lock taken ! */ void (*ready_data_callback)(void *argcb); void *argcb; ) void _starpu_init_data_request_lists(void); void _starpu_deinit_data_request_lists(void); void _starpu_post_data_request(struct _starpu_data_request *r); /* returns 0 if we have pushed all requests, -EBUSY or -ENOMEM otherwise */ int _starpu_handle_node_data_requests(unsigned src_node, unsigned may_alloc, unsigned *pushed); int _starpu_handle_node_prefetch_requests(unsigned src_node, unsigned may_alloc, unsigned *pushed); int _starpu_handle_node_idle_requests(unsigned src_node, unsigned may_alloc, unsigned *pushed); int _starpu_handle_pending_node_data_requests(unsigned src_node); int _starpu_handle_all_pending_node_data_requests(unsigned src_node); int _starpu_check_that_no_data_request_exists(unsigned node); int _starpu_check_that_no_data_request_is_pending(unsigned node); struct _starpu_data_request *_starpu_create_data_request(starpu_data_handle_t handle, struct _starpu_data_replicate *src_replicate, struct _starpu_data_replicate *dst_replicate, int handling_node, enum starpu_data_access_mode mode, unsigned ndeps, unsigned is_prefetch, unsigned is_write_invalidation) STARPU_ATTRIBUTE_MALLOC; int _starpu_wait_data_request_completion(struct _starpu_data_request *r, unsigned may_alloc); void _starpu_data_request_append_callback(struct _starpu_data_request *r, void (*callback_func)(void *), void *callback_arg); void _starpu_update_prefetch_status(struct _starpu_data_request *r, unsigned prefetch); #endif // __DATA_REQUEST_H__ starpu-1.2.3+dfsg/src/datawizard/datastats.c000066400000000000000000000120411320135501600210210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #ifdef STARPU_ENABLE_STATS /* measure the cache hit ratio for each node */ static unsigned hit_cnt[STARPU_MAXNODES]; static unsigned miss_cnt[STARPU_MAXNODES]; #endif void _starpu_msi_cache_hit(unsigned node STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_ENABLE_STATS STARPU_HG_DISABLE_CHECKING(hit_cnt[node]); hit_cnt[node]++; #endif } void _starpu_msi_cache_miss(unsigned node STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_ENABLE_STATS STARPU_HG_DISABLE_CHECKING(miss_cnt[node]); miss_cnt[node]++; #endif } void _starpu_display_msi_stats(FILE *stream) { #ifdef STARPU_ENABLE_STATS unsigned node; unsigned total_hit_cnt = 0; unsigned total_miss_cnt = 0; fprintf(stream, "\n#---------------------\n"); fprintf(stream, "MSI cache stats :\n"); for (node = 0; node < STARPU_MAXNODES; node++) { total_hit_cnt += hit_cnt[node]; total_miss_cnt += miss_cnt[node]; } fprintf(stream, "TOTAL MSI stats\thit %u (%2.2f \%%)\tmiss %u (%2.2f \%%)\n", total_hit_cnt, (100.0f*total_hit_cnt)/(total_hit_cnt+total_miss_cnt), total_miss_cnt, (100.0f*total_miss_cnt)/(total_hit_cnt+total_miss_cnt)); for (node = 0; node < STARPU_MAXNODES; node++) { if (hit_cnt[node]+miss_cnt[node]) { fprintf(stream, "memory node %u\n", node); fprintf(stream, "\thit : %u (%2.2f \%%)\n", hit_cnt[node], (100.0f*hit_cnt[node])/(hit_cnt[node]+miss_cnt[node])); fprintf(stream, "\tmiss : %u (%2.2f \%%)\n", miss_cnt[node], (100.0f*miss_cnt[node])/(hit_cnt[node]+miss_cnt[node])); } } fprintf(stream, "#---------------------\n"); #endif } /* measure the efficiency of our allocation cache */ #ifdef STARPU_ENABLE_STATS static unsigned alloc_cnt[STARPU_MAXNODES]; static unsigned alloc_cache_hit_cnt[STARPU_MAXNODES]; #endif void _starpu_allocation_cache_hit(unsigned node STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_ENABLE_STATS STARPU_HG_DISABLE_CHECKING(alloc_cache_hit_cnt[node]); alloc_cache_hit_cnt[node]++; #endif } void _starpu_data_allocation_inc_stats(unsigned node STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_ENABLE_STATS STARPU_HG_DISABLE_CHECKING(alloc_cnt[node]); alloc_cnt[node]++; #endif } void _starpu_display_alloc_cache_stats(FILE *stream) { #ifdef STARPU_ENABLE_STATS fprintf(stream, "\n#---------------------\n"); fprintf(stream, "Allocation cache stats:\n"); unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { if (alloc_cnt[node]) { fprintf(stream, "memory node %u\n", node); fprintf(stream, "\ttotal alloc : %u\n", alloc_cnt[node]); fprintf(stream, "\tcached alloc: %u (%2.2f \%%)\n", alloc_cache_hit_cnt[node], (100.0f*alloc_cache_hit_cnt[node])/(alloc_cnt[node])); } else fprintf(stream, "No allocation on node %u\n", node); } fprintf(stream, "#---------------------\n"); #endif } /* measure the amount of data transfers between each pair of nodes */ #ifdef STARPU_ENABLE_STATS static size_t comm_amount[STARPU_MAXNODES][STARPU_MAXNODES]; #endif /* STARPU_ENABLE_STATS */ void _starpu_comm_amounts_inc(unsigned src STARPU_ATTRIBUTE_UNUSED, unsigned dst STARPU_ATTRIBUTE_UNUSED, size_t size STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_ENABLE_STATS STARPU_HG_DISABLE_CHECKING(comm_amount[src][dst]); comm_amount[src][dst] += size; #endif /* STARPU_ENABLE_STATS */ } void _starpu_display_comm_amounts(FILE *stream) { #ifdef STARPU_DEVEL # warning TODO. The information displayed here seems to be similar to the one displayed by starpu_profiling_bus_helper_display_summary() #endif #ifdef STARPU_ENABLE_STATS unsigned src, dst; size_t sum = 0; fprintf(stream, "\n#---------------------\n"); fprintf(stream, "Data transfer stats:\n"); for (dst = 0; dst < STARPU_MAXNODES; dst++) for (src = 0; src < STARPU_MAXNODES; src++) { sum += comm_amount[src][dst]; sum += comm_amount[dst][src]; } fprintf(stream, "TOTAL transfers %f MB\n", (float)sum/1024/1024); for (dst = 0; dst < STARPU_MAXNODES; dst++) for (src = dst + 1; src < STARPU_MAXNODES; src++) { if (comm_amount[src][dst]) fprintf(stream, "\t%u <-> %u\t%f MB\n\t\t%u -> %u\t%f MB\n\t\t%u -> %u\t%f MB\n", src, dst, ((float)comm_amount[src][dst] + (float)comm_amount[dst][src])/(1024*1024), src, dst, ((float)comm_amount[src][dst])/(1024*1024), dst, src, ((float)comm_amount[dst][src])/(1024*1024)); } fprintf(stream, "#---------------------\n"); #endif } starpu-1.2.3+dfsg/src/datawizard/datastats.h000066400000000000000000000024651320135501600210370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DATASTATS_H__ #define __DATASTATS_H__ #include #include #include #include void _starpu_msi_cache_hit(unsigned node); void _starpu_msi_cache_miss(unsigned node); void _starpu_display_msi_stats(FILE *stream); void _starpu_allocation_cache_hit(unsigned node STARPU_ATTRIBUTE_UNUSED); void _starpu_data_allocation_inc_stats(unsigned node STARPU_ATTRIBUTE_UNUSED); void _starpu_comm_amounts_inc(unsigned src, unsigned dst, size_t size); void _starpu_display_comm_amounts(FILE *stream); void _starpu_display_alloc_cache_stats(FILE *stream); #endif // __DATASTATS_H__ starpu-1.2.3+dfsg/src/datawizard/datawizard.c000066400000000000000000000041261320135501600211700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2010, 2012-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #ifdef STARPU_SIMGRID #include #endif int __starpu_datawizard_progress(unsigned memory_node, unsigned may_alloc, unsigned push_requests) { int ret = 0; #ifdef STARPU_SIMGRID /* XXX */ MSG_process_sleep(0.000001); #endif STARPU_UYIELD(); /* in case some other driver requested data */ if (_starpu_handle_pending_node_data_requests(memory_node)) ret = 1; starpu_memchunk_tidy(memory_node); if (ret || push_requests) { /* Some transfers have finished, or the driver requests to really push more */ unsigned pushed; if (_starpu_handle_node_data_requests(memory_node, may_alloc, &pushed) == 0) { if (pushed) ret = 1; /* We pushed all pending requests, we can afford pushing * prefetch requests */ _starpu_handle_node_prefetch_requests(memory_node, may_alloc, &pushed); if (_starpu_check_that_no_data_request_is_pending(memory_node)) /* No pending transfer, push some idle transfer */ _starpu_handle_node_idle_requests(memory_node, may_alloc, &pushed); } if (pushed) ret = 1; } _starpu_execute_registered_progression_hooks(); return ret; } void _starpu_datawizard_progress(unsigned memory_node, unsigned may_alloc) { __starpu_datawizard_progress(memory_node, may_alloc, 1); } starpu-1.2.3+dfsg/src/datawizard/datawizard.h000066400000000000000000000024311320135501600211720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014 Université de Bordeaux * Copyright (C) 2010, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DATAWIZARD_H__ #define __DATAWIZARD_H__ #include #include #include #include #include #include #include #include #include #include int __starpu_datawizard_progress(unsigned memory_node, unsigned may_alloc, unsigned push_requests); void _starpu_datawizard_progress(unsigned memory_node, unsigned may_alloc); #endif // __DATAWIZARD_H__ starpu-1.2.3+dfsg/src/datawizard/filters.c000066400000000000000000000673101320135501600205120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2017 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2013, 2015, 2016, 2017 CNRS * Copyright (C) 2012, 2016 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include /* * This function applies a data filter on all the elements of a partition */ static void map_filter(starpu_data_handle_t root_handle, struct starpu_data_filter *f) { /* we need to apply the data filter on all leaf of the tree */ if (root_handle->nchildren == 0) { /* this is a leaf */ starpu_data_partition(root_handle, f); } else { /* try to apply the data filter recursively */ unsigned child; for (child = 0; child < root_handle->nchildren; child++) { starpu_data_handle_t handle_child = starpu_data_get_child(root_handle, child); map_filter(handle_child, f); } } } void starpu_data_vmap_filters(starpu_data_handle_t root_handle, unsigned nfilters, va_list pa) { unsigned i; for (i = 0; i < nfilters; i++) { struct starpu_data_filter *next_filter; next_filter = va_arg(pa, struct starpu_data_filter *); STARPU_ASSERT(next_filter); map_filter(root_handle, next_filter); } } void starpu_data_map_filters(starpu_data_handle_t root_handle, unsigned nfilters, ...) { va_list pa; va_start(pa, nfilters); starpu_data_vmap_filters(root_handle, nfilters, pa); va_end(pa); } void fstarpu_data_map_filters(starpu_data_handle_t root_handle, int nfilters, struct starpu_data_filter **filters) { int i; assert(nfilters >= 0); for (i = 0; i < nfilters; i++) { struct starpu_data_filter *next_filter = filters[i]; STARPU_ASSERT(next_filter); map_filter(root_handle, next_filter); } } int starpu_data_get_nb_children(starpu_data_handle_t handle) { return handle->nchildren; } starpu_data_handle_t starpu_data_get_child(starpu_data_handle_t handle, unsigned i) { STARPU_ASSERT_MSG(handle->nchildren != 0, "Data %p has to be partitioned before accessing children", handle); STARPU_ASSERT_MSG(i < handle->nchildren, "Invalid child index %u in handle %p, maximum %u", i, handle, handle->nchildren); return &handle->children[i]; } /* * example starpu_data_get_sub_data(starpu_data_handle_t root_handle, 3, 42, 0, 1); */ starpu_data_handle_t starpu_data_get_sub_data(starpu_data_handle_t root_handle, unsigned depth, ... ) { va_list pa; va_start(pa, depth); starpu_data_handle_t handle = starpu_data_vget_sub_data(root_handle, depth, pa); va_end(pa); return handle; } starpu_data_handle_t starpu_data_vget_sub_data(starpu_data_handle_t root_handle, unsigned depth, va_list pa ) { STARPU_ASSERT(root_handle); starpu_data_handle_t current_handle = root_handle; /* the variable number of argument must correlate the depth in the tree */ unsigned i; for (i = 0; i < depth; i++) { unsigned next_child; next_child = va_arg(pa, unsigned); STARPU_ASSERT_MSG(current_handle->nchildren != 0, "Data %p has to be partitioned before accessing children", current_handle); STARPU_ASSERT_MSG(next_child < current_handle->nchildren, "Bogus child number %u, data %p only has %u children", next_child, current_handle, current_handle->nchildren); current_handle = ¤t_handle->children[next_child]; } return current_handle; } starpu_data_handle_t fstarpu_data_get_sub_data(starpu_data_handle_t root_handle, int depth, int *indices) { STARPU_ASSERT(root_handle); starpu_data_handle_t current_handle = root_handle; STARPU_ASSERT(depth >= 0); /* the variable number of argument must correlate the depth in the tree */ int i; for (i = 0; i < depth; i++) { int next_child; next_child = indices[i]; STARPU_ASSERT(next_child >= 0); STARPU_ASSERT_MSG(current_handle->nchildren != 0, "Data %p has to be partitioned before accessing children", current_handle); STARPU_ASSERT_MSG((unsigned) next_child < current_handle->nchildren, "Bogus child number %d, data %p only has %u children", next_child, current_handle, current_handle->nchildren); current_handle = ¤t_handle->children[next_child]; } return current_handle; } static unsigned _starpu_data_partition_nparts(starpu_data_handle_t initial_handle, struct starpu_data_filter *f) { /* how many parts ? */ if (f->get_nchildren) return f->get_nchildren(f, initial_handle); else return f->nchildren; } static void _starpu_data_partition(starpu_data_handle_t initial_handle, starpu_data_handle_t *childrenp, unsigned nparts, struct starpu_data_filter *f, int inherit_state) { unsigned i; unsigned node; /* first take care to properly lock the data header */ _starpu_spin_lock(&initial_handle->header_lock); initial_handle->nplans++; STARPU_ASSERT_MSG(nparts > 0, "Partitioning data %p in 0 piece does not make sense", initial_handle); /* allocate the children */ if (inherit_state) { _STARPU_CALLOC(initial_handle->children, nparts, sizeof(struct _starpu_data_state)); /* this handle now has children */ initial_handle->nchildren = nparts; } for (node = 0; node < STARPU_MAXNODES; node++) { if (initial_handle->per_node[node].state != STARPU_INVALID) break; } if (node == STARPU_MAXNODES) { /* This is lazy allocation, allocate it now in main RAM, so as * to have somewhere to gather pieces later */ /* FIXME: mark as unevictable! */ int ret = _starpu_allocate_memory_on_node(initial_handle, &initial_handle->per_node[STARPU_MAIN_RAM], 0); #ifdef STARPU_DEVEL #warning we should reclaim memory if allocation failed #endif STARPU_ASSERT(!ret); } _starpu_data_unregister_ram_pointer(initial_handle); if (nparts && !inherit_state) { STARPU_ASSERT_MSG(childrenp, "Passing NULL pointer for parameter childrenp while parameter inherit_state is 0"); } for (i = 0; i < nparts; i++) { starpu_data_handle_t child; if (inherit_state) child = &initial_handle->children[i]; else child = childrenp[i]; STARPU_ASSERT(child); struct starpu_data_interface_ops *ops; /* each child may have his own interface type */ /* what's this child's interface ? */ if (f->get_child_ops) ops = f->get_child_ops(f, i); else ops = initial_handle->ops; _starpu_data_handle_init(child, ops, initial_handle->mf_node); child->nchildren = 0; child->nplans = 0; child->switch_cl = NULL; child->partitioned = 0; child->readonly = 0; child->mpi_data = initial_handle->mpi_data; child->root_handle = initial_handle->root_handle; child->father_handle = initial_handle; child->sibling_index = i; child->depth = initial_handle->depth + 1; child->is_not_important = initial_handle->is_not_important; child->wt_mask = initial_handle->wt_mask; child->home_node = initial_handle->home_node; /* initialize the chunk lock */ _starpu_data_requester_list_init(&child->req_list); _starpu_data_requester_list_init(&child->reduction_req_list); child->reduction_tmp_handles = NULL; child->write_invalidation_req = NULL; child->refcnt = 0; child->unlocking_reqs = 0; child->busy_count = 0; child->busy_waiting = 0; STARPU_PTHREAD_MUTEX_INIT(&child->busy_mutex, NULL); STARPU_PTHREAD_COND_INIT(&child->busy_cond, NULL); child->reduction_refcnt = 0; _starpu_spin_init(&child->header_lock); child->sequential_consistency = initial_handle->sequential_consistency; child->initialized = initial_handle->initialized; STARPU_PTHREAD_MUTEX_INIT(&child->sequential_consistency_mutex, NULL); child->last_submitted_mode = STARPU_R; child->last_sync_task = NULL; child->last_submitted_accessors.task = NULL; child->last_submitted_accessors.next = &child->last_submitted_accessors; child->last_submitted_accessors.prev = &child->last_submitted_accessors; child->post_sync_tasks = NULL; /* Tell helgrind that the race in _starpu_unlock_post_sync_tasks is fine */ STARPU_HG_DISABLE_CHECKING(child->post_sync_tasks_cnt); child->post_sync_tasks_cnt = 0; /* The methods used for reduction are propagated to the * children. */ child->redux_cl = initial_handle->redux_cl; child->init_cl = initial_handle->init_cl; #ifdef STARPU_USE_FXT child->last_submitted_ghost_sync_id_is_valid = 0; child->last_submitted_ghost_sync_id = 0; child->last_submitted_ghost_accessors_id = NULL; #endif if (_starpu_global_arbiter) /* Just for testing purpose */ starpu_data_assign_arbiter(child, _starpu_global_arbiter); else child->arbiter = NULL; _starpu_data_requester_list_init(&child->arbitered_req_list); for (node = 0; node < STARPU_MAXNODES; node++) { struct _starpu_data_replicate *initial_replicate; struct _starpu_data_replicate *child_replicate; initial_replicate = &initial_handle->per_node[node]; child_replicate = &child->per_node[node]; if (inherit_state) child_replicate->state = initial_replicate->state; else child_replicate->state = STARPU_INVALID; if (inherit_state || !initial_replicate->automatically_allocated) child_replicate->allocated = initial_replicate->allocated; else child_replicate->allocated = 0; /* Do not allow memory reclaiming within the child for parent bits */ child_replicate->automatically_allocated = 0; child_replicate->refcnt = 0; child_replicate->memory_node = node; child_replicate->relaxed_coherency = 0; if (inherit_state) child_replicate->initialized = initial_replicate->initialized; else child_replicate->initialized = 0; /* update the interface */ void *initial_interface = starpu_data_get_interface_on_node(initial_handle, node); void *child_interface = starpu_data_get_interface_on_node(child, node); STARPU_ASSERT_MSG(!(!inherit_state && child_replicate->automatically_allocated && child_replicate->allocated), "partition planning is currently not supported when handle has some automatically allocated buffers"); f->filter_func(initial_interface, child_interface, f, i, nparts); } child->per_worker = NULL; child->user_data = NULL; /* We compute the size and the footprint of the child once and * store it in the handle */ child->footprint = _starpu_compute_data_footprint(child); void *ptr; ptr = starpu_data_handle_to_pointer(child, STARPU_MAIN_RAM); if (ptr != NULL) _starpu_data_register_ram_pointer(child, ptr); _STARPU_TRACE_HANDLE_DATA_REGISTER(child); } /* now let the header */ _starpu_spin_unlock(&initial_handle->header_lock); } static void _starpu_empty_codelet_function(void *buffers[], void *args) { (void) buffers; // unused; (void) args; // unused; } void starpu_data_unpartition(starpu_data_handle_t root_handle, unsigned gathering_node) { unsigned child; unsigned worker; unsigned nworkers = starpu_worker_get_count(); unsigned node; unsigned sizes[root_handle->nchildren]; void *ptr; _STARPU_TRACE_START_UNPARTITION(root_handle, gathering_node); _starpu_spin_lock(&root_handle->header_lock); STARPU_ASSERT_MSG(root_handle->nchildren != 0, "data %p is not partitioned, can not unpartition it", root_handle); /* first take all the children lock (in order !) */ for (child = 0; child < root_handle->nchildren; child++) { starpu_data_handle_t child_handle = starpu_data_get_child(root_handle, child); /* make sure the intermediate children is unpartitionned as well */ if (child_handle->nchildren > 0) starpu_data_unpartition(child_handle, gathering_node); /* If this is a multiformat handle, we must convert the data now */ #ifdef STARPU_DEVEL #warning TODO: _starpu_fetch_data_on_node should be doing it #endif if (_starpu_data_is_multiformat_handle(child_handle) && starpu_node_get_kind(child_handle->mf_node) != STARPU_CPU_RAM) { struct starpu_codelet cl = { .where = STARPU_CPU, .cpu_funcs = { _starpu_empty_codelet_function }, .modes = { STARPU_RW }, .nbuffers = 1 }; struct starpu_task *task = starpu_task_create(); task->name = "convert_data"; STARPU_TASK_SET_HANDLE(task, child_handle, 0); task->cl = &cl; task->synchronous = 1; if (_starpu_task_submit_internally(task) != 0) _STARPU_ERROR("Could not submit the conversion task while unpartitionning\n"); } int ret; /* for now we pretend that the RAM is almost unlimited and that gathering * data should be possible from the node that does the unpartionning ... we * don't want to have the programming deal with memory shortage at that time, * really */ /* Acquire the child data on the gathering node. This will trigger collapsing any reduction */ ret = starpu_data_acquire_on_node(child_handle, gathering_node, STARPU_RW); STARPU_ASSERT(ret == 0); starpu_data_release_on_node(child_handle, gathering_node); _starpu_spin_lock(&child_handle->header_lock); child_handle->busy_waiting = 1; _starpu_spin_unlock(&child_handle->header_lock); /* Wait for all requests to finish (notably WT requests) */ STARPU_PTHREAD_MUTEX_LOCK(&child_handle->busy_mutex); while (1) { /* Here helgrind would shout that this an unprotected access, * but this is actually fine: all threads who do busy_count-- * are supposed to call _starpu_data_check_not_busy, which will * wake us up through the busy_mutex/busy_cond. */ if (!child_handle->busy_count) break; /* This is woken by _starpu_data_check_not_busy, always called * after decrementing busy_count */ STARPU_PTHREAD_COND_WAIT(&child_handle->busy_cond, &child_handle->busy_mutex); } STARPU_PTHREAD_MUTEX_UNLOCK(&child_handle->busy_mutex); _starpu_spin_lock(&child_handle->header_lock); sizes[child] = _starpu_data_get_size(child_handle); _starpu_data_unregister_ram_pointer(child_handle); if (child_handle->per_worker) for (worker = 0; worker < nworkers; worker++) { struct _starpu_data_replicate *local = &child_handle->per_worker[worker]; STARPU_ASSERT(local->state == STARPU_INVALID); if (local->allocated && local->automatically_allocated) _starpu_request_mem_chunk_removal(child_handle, local, starpu_worker_get_memory_node(worker), sizes[child]); } _starpu_memory_stats_free(child_handle); } ptr = starpu_data_handle_to_pointer(root_handle, STARPU_MAIN_RAM); if (ptr != NULL) _starpu_data_register_ram_pointer(root_handle, ptr); /* the gathering_node should now have a valid copy of all the children. * For all nodes, if the node had all copies and none was locally * allocated then the data is still valid there, else, it's invalidated * for the gathering node, if we have some locally allocated data, we * copy all the children (XXX this should not happen so we just do not * do anything since this is transparent ?) */ unsigned still_valid[STARPU_MAXNODES]; /* we do 2 passes : the first pass determines wether the data is still * valid or not, the second pass is needed to choose between STARPU_SHARED and * STARPU_OWNER */ unsigned nvalids = 0; /* still valid ? */ for (node = 0; node < STARPU_MAXNODES; node++) { struct _starpu_data_replicate *local; /* until an issue is found the data is assumed to be valid */ unsigned isvalid = 1; for (child = 0; child < root_handle->nchildren; child++) { starpu_data_handle_t child_handle = starpu_data_get_child(root_handle, child); local = &child_handle->per_node[node]; if (local->state == STARPU_INVALID || local->automatically_allocated == 1) { /* One of the bits is missing or is not inside the parent */ isvalid = 0; } if (local->mc && local->allocated && local->automatically_allocated) /* free the child data copy in a lazy fashion */ _starpu_request_mem_chunk_removal(child_handle, local, node, sizes[child]); } local = &root_handle->per_node[node]; if (!local->allocated) /* Even if we have all the bits, if we don't have the * whole data, it's not valid */ isvalid = 0; if (!isvalid && local->mc && local->allocated && local->automatically_allocated) /* free the data copy in a lazy fashion */ _starpu_request_mem_chunk_removal(root_handle, local, node, _starpu_data_get_size(root_handle)); /* if there was no invalid copy, the node still has a valid copy */ still_valid[node] = isvalid; if (isvalid) nvalids++; } /* either shared or owned */ STARPU_ASSERT(nvalids > 0); enum _starpu_cache_state newstate = (nvalids == 1)?STARPU_OWNER:STARPU_SHARED; for (node = 0; node < STARPU_MAXNODES; node++) { root_handle->per_node[node].state = still_valid[node]?newstate:STARPU_INVALID; } for (child = 0; child < root_handle->nchildren; child++) { starpu_data_handle_t child_handle = starpu_data_get_child(root_handle, child); _starpu_data_free_interfaces(child_handle); _starpu_spin_unlock(&child_handle->header_lock); _starpu_spin_destroy(&child_handle->header_lock); } for (child = 0; child < root_handle->nchildren; child++) { starpu_data_handle_t child_handle = starpu_data_get_child(root_handle, child); _starpu_data_clear_implicit(child_handle); STARPU_PTHREAD_MUTEX_DESTROY(&child_handle->busy_mutex); STARPU_PTHREAD_COND_DESTROY(&child_handle->busy_cond); STARPU_PTHREAD_MUTEX_DESTROY(&child_handle->sequential_consistency_mutex); _STARPU_TRACE_HANDLE_DATA_UNREGISTER(child_handle); } /* there is no child anymore */ starpu_data_handle_t children = root_handle->children; root_handle->children = NULL; root_handle->nchildren = 0; root_handle->nplans--; /* now the parent may be used again so we release the lock */ _starpu_spin_unlock(&root_handle->header_lock); free(children); _STARPU_TRACE_END_UNPARTITION(root_handle, gathering_node); } void starpu_data_partition(starpu_data_handle_t initial_handle, struct starpu_data_filter *f) { unsigned nparts = _starpu_data_partition_nparts(initial_handle, f); STARPU_ASSERT_MSG(initial_handle->nchildren == 0, "there should not be mutiple filters applied on the same data %p, futher filtering has to be done on children", initial_handle); STARPU_ASSERT_MSG(initial_handle->nplans == 0, "partition planning and synchronous partitioning is not supported"); initial_handle->children = NULL; /* Make sure to wait for previous tasks working on the whole data */ starpu_data_acquire_on_node(initial_handle, STARPU_ACQUIRE_NO_NODE, initial_handle->initialized?STARPU_RW:STARPU_W); starpu_data_release_on_node(initial_handle, STARPU_ACQUIRE_NO_NODE); _starpu_data_partition(initial_handle, NULL, nparts, f, 1); } void starpu_data_partition_plan(starpu_data_handle_t initial_handle, struct starpu_data_filter *f, starpu_data_handle_t *childrenp) { unsigned i; unsigned nparts = _starpu_data_partition_nparts(initial_handle, f); STARPU_ASSERT_MSG(initial_handle->nchildren == 0, "partition planning and synchronous partitioning is not supported"); STARPU_ASSERT_MSG(initial_handle->sequential_consistency, "partition planning is currently only supported for data with sequential consistency"); struct starpu_codelet *cl = initial_handle->switch_cl; int home_node = initial_handle->home_node; if (home_node == -1) /* Nothing better for now */ /* TODO: pass -1, and make _starpu_fetch_nowhere_task_input * really call _starpu_fetch_data_on_node, and make that update * the coherency. */ home_node = STARPU_MAIN_RAM; for (i = 0; i < nparts; i++) _STARPU_CALLOC(childrenp[i], 1, sizeof(struct _starpu_data_state)); _starpu_data_partition(initial_handle, childrenp, nparts, f, 0); if (!cl) { /* Create a codelet that will make the coherency on the home node */ _STARPU_CALLOC(initial_handle->switch_cl, 1, sizeof(*initial_handle->switch_cl)); cl = initial_handle->switch_cl; cl->where = STARPU_NOWHERE; cl->nbuffers = STARPU_VARIABLE_NBUFFERS; cl->name = "data_partition_switch"; cl->specific_nodes = 1; } if (initial_handle->switch_cl_nparts < nparts) { /* First initialization, or previous initialization was with fewer parts, enlarge it */ _STARPU_REALLOC(cl->dyn_nodes, (nparts+1) * sizeof(*cl->dyn_nodes)); for (i = initial_handle->switch_cl_nparts; i < nparts+1; i++) cl->dyn_nodes[i] = home_node; initial_handle->switch_cl_nparts = nparts; } } void starpu_data_partition_clean(starpu_data_handle_t root_handle, unsigned nparts, starpu_data_handle_t *children) { unsigned i; for (i = 0; i < nparts; i++) starpu_data_unregister_submit(children[i]); _starpu_spin_lock(&root_handle->header_lock); root_handle->nplans--; _starpu_spin_unlock(&root_handle->header_lock); } void starpu_data_partition_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children) { STARPU_ASSERT_MSG(initial_handle->sequential_consistency, "partition planning is currently only supported for data with sequential consistency"); _starpu_spin_lock(&initial_handle->header_lock); STARPU_ASSERT_MSG(initial_handle->partitioned == 0, "One can't submit several partition plannings at the same time"); STARPU_ASSERT_MSG(initial_handle->readonly == 0, "One can't submit a partition planning while a readonly partitioning is active"); initial_handle->partitioned++; _starpu_spin_unlock(&initial_handle->header_lock); if (!initial_handle->initialized) /* No need for coherency, it is not initialized */ return; unsigned i; struct starpu_data_descr descr[nparts]; for (i = 0; i < nparts; i++) { STARPU_ASSERT_MSG(children[i]->father_handle == initial_handle, "children parameter of starpu_data_partition_submit must be the children of the parent parameter"); descr[i].handle = children[i]; descr[i].mode = STARPU_W; } /* TODO: assert nparts too */ starpu_task_insert(initial_handle->switch_cl, STARPU_RW, initial_handle, STARPU_DATA_MODE_ARRAY, descr, nparts, 0); starpu_data_invalidate_submit(initial_handle); } void starpu_data_partition_readonly_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children) { STARPU_ASSERT_MSG(initial_handle->sequential_consistency, "partition planning is currently only supported for data with sequential consistency"); _starpu_spin_lock(&initial_handle->header_lock); STARPU_ASSERT_MSG(initial_handle->partitioned == 0 || initial_handle->readonly, "One can't submit a readonly partition planning at the same time as a readwrite partition planning"); initial_handle->partitioned++; initial_handle->readonly = 1; _starpu_spin_unlock(&initial_handle->header_lock); STARPU_ASSERT_MSG(initial_handle->initialized, "It is odd to read-only-partition a data which does not have a value yet"); unsigned i; struct starpu_data_descr descr[nparts]; for (i = 0; i < nparts; i++) { STARPU_ASSERT_MSG(children[i]->father_handle == initial_handle, "children parameter of starpu_data_partition_submit must be the children of the parent parameter"); descr[i].handle = children[i]; descr[i].mode = STARPU_W; } /* TODO: assert nparts too */ starpu_task_insert(initial_handle->switch_cl, STARPU_R, initial_handle, STARPU_DATA_MODE_ARRAY, descr, nparts, 0); } void starpu_data_partition_readwrite_upgrade_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children) { STARPU_ASSERT_MSG(initial_handle->sequential_consistency, "partition planning is currently only supported for data with sequential consistency"); _starpu_spin_lock(&initial_handle->header_lock); STARPU_ASSERT_MSG(initial_handle->partitioned == 1, "One can't upgrade a readonly partition planning to readwrite while other readonly partition plannings are active"); STARPU_ASSERT_MSG(initial_handle->readonly == 1, "One can only upgrade a readonly partition planning"); initial_handle->readonly = 0; _starpu_spin_unlock(&initial_handle->header_lock); unsigned i; struct starpu_data_descr descr[nparts]; for (i = 0; i < nparts; i++) { STARPU_ASSERT_MSG(children[i]->father_handle == initial_handle, "children parameter of starpu_data_partition_submit must be the children of the parent parameter"); descr[i].handle = children[i]; descr[i].mode = STARPU_W; } /* TODO: assert nparts too */ starpu_task_insert(initial_handle->switch_cl, STARPU_RW, initial_handle, STARPU_DATA_MODE_ARRAY, descr, nparts, 0); starpu_data_invalidate_submit(initial_handle); } void starpu_data_unpartition_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int gather_node) { STARPU_ASSERT_MSG(initial_handle->sequential_consistency, "partition planning is currently only supported for data with sequential consistency"); STARPU_ASSERT_MSG(gather_node == initial_handle->home_node || gather_node == -1, "gathering node different from home node is currently not supported"); _starpu_spin_lock(&initial_handle->header_lock); STARPU_ASSERT_MSG(initial_handle->partitioned >= 1, "No partition planning is active for this handle"); initial_handle->partitioned--; if (!initial_handle->partitioned) initial_handle->readonly = 0; _starpu_spin_unlock(&initial_handle->header_lock); unsigned i, n; struct starpu_data_descr descr[nparts]; for (i = 0, n = 0; i < nparts; i++) { STARPU_ASSERT_MSG(children[i]->father_handle == initial_handle, "children parameter of starpu_data_partition_submit must be the children of the parent parameter"); if (!children[i]->initialized) /* Dropped value, do not care about coherency for this one */ continue; descr[n].handle = children[i]; descr[n].mode = STARPU_RW; n++; } /* TODO: assert nparts too */ starpu_task_insert(initial_handle->switch_cl, STARPU_W, initial_handle, STARPU_DATA_MODE_ARRAY, descr, n, 0); for (i = 0; i < nparts; i++) starpu_data_invalidate_submit(children[i]); } void starpu_data_unpartition_readonly_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int gather_node) { STARPU_ASSERT_MSG(initial_handle->sequential_consistency, "partition planning is currently only supported for data with sequential consistency"); STARPU_ASSERT_MSG(gather_node == initial_handle->home_node || gather_node == -1, "gathering node different from home node is currently not supported"); _starpu_spin_lock(&initial_handle->header_lock); STARPU_ASSERT_MSG(initial_handle->partitioned >= 1, "No partition planning is active for this handle"); initial_handle->readonly = 1; _starpu_spin_unlock(&initial_handle->header_lock); unsigned i, n; struct starpu_data_descr descr[nparts]; for (i = 0, n = 0; i < nparts; i++) { STARPU_ASSERT_MSG(children[i]->father_handle == initial_handle, "children parameter of starpu_data_partition_submit must be the children of the parent parameter"); if (!children[i]->initialized) /* Dropped value, do not care about coherency for this one */ continue; descr[n].handle = children[i]; descr[n].mode = STARPU_R; n++; } /* TODO: assert nparts too */ starpu_task_insert(initial_handle->switch_cl, STARPU_W, initial_handle, STARPU_DATA_MODE_ARRAY, descr, n, 0); } /* * Given an integer N, NPARTS the number of parts it must be divided in, ID the * part currently considered, determines the CHUNK_SIZE and the OFFSET, taking * into account the size of the elements stored in the data structure ELEMSIZE * and LD, the leading dimension. */ void _starpu_filter_nparts_compute_chunk_size_and_offset(unsigned n, unsigned nparts, size_t elemsize, unsigned id, unsigned ld, unsigned *chunk_size, size_t *offset) { *chunk_size = n/nparts; unsigned remainder = n % nparts; if (id < remainder) (*chunk_size)++; /* * Computing the total offset. The formula may not be really clear, but * it really just is: * * total = 0; * for (i = 0; i < id; i++) * { * total += n/nparts; * if (i < n%nparts) * total++; * } * offset = total * elemsize * ld; */ if (offset != NULL) *offset = (id *(n/nparts) + STARPU_MIN(remainder, id)) * ld * elemsize; } starpu-1.2.3+dfsg/src/datawizard/filters.h000066400000000000000000000020531320135501600205100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __FILTERS_H__ #define __FILTERS_H__ #include #include #include #include #include void _starpu_filter_nparts_compute_chunk_size_and_offset(unsigned n, unsigned nparts, size_t elemsize, unsigned id, unsigned ld, unsigned *chunk_size, size_t *offset); #endif starpu-1.2.3+dfsg/src/datawizard/footprint.c000066400000000000000000000056031320135501600210630ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011, 2013-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include uint32_t starpu_task_data_footprint(struct starpu_task *task) { uint32_t footprint = 0; unsigned buffer; unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); for (buffer = 0; buffer < nbuffers; buffer++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, buffer); uint32_t handle_footprint = _starpu_data_get_footprint(handle); footprint = starpu_hash_crc32c_be(handle_footprint, footprint); } return footprint; } uint32_t _starpu_compute_buffers_footprint(struct starpu_perfmodel *model, struct starpu_perfmodel_arch* arch, unsigned nimpl, struct _starpu_job *j) { if (j->footprint_is_computed) return j->footprint; uint32_t footprint = 0; struct starpu_task *task = j->task; if (model) { if (model->footprint) { footprint = model->footprint(task); } else { struct starpu_perfmodel_per_arch *per_arch; if (arch) per_arch = starpu_perfmodel_get_model_per_arch(model, arch, nimpl); if (arch && per_arch != NULL && per_arch->size_base) { size_t size = per_arch->size_base(task, arch, nimpl); footprint = starpu_hash_crc32c_be_n(&size, sizeof(size), footprint); } else if (model->size_base) { size_t size = model->size_base(task, nimpl); footprint = starpu_hash_crc32c_be_n(&size, sizeof(size), footprint); } else { footprint = starpu_task_data_footprint(task); } } } else { footprint = starpu_task_data_footprint(task); } j->footprint = footprint; j->footprint_is_computed = 1; return footprint; } uint32_t _starpu_compute_data_footprint(starpu_data_handle_t handle) { uint32_t interfaceid = (uint32_t)starpu_data_get_interface_id(handle); STARPU_ASSERT(handle->ops->footprint); uint32_t handle_footprint = handle->ops->footprint(handle); return starpu_hash_crc32c_be(handle_footprint, interfaceid); } uint32_t starpu_task_footprint(struct starpu_perfmodel *model, struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { struct _starpu_job *j = _starpu_get_job_associated_to_task(task); return _starpu_compute_buffers_footprint(model, arch, nimpl, j); } starpu-1.2.3+dfsg/src/datawizard/footprint.h000066400000000000000000000023231320135501600210640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2011 Université de Bordeaux * Copyright (C) 2010, 2011 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __FOOTPRINT_H__ #define __FOOTPRINT_H__ #include #include #include /* Compute the footprint that characterizes the job and cache it into the job * structure. */ uint32_t _starpu_compute_buffers_footprint(struct starpu_perfmodel *model, struct starpu_perfmodel_arch * arch, unsigned nimpl, struct _starpu_job *j); /* Compute the footprint that characterizes the layout of the data handle. */ uint32_t _starpu_compute_data_footprint(starpu_data_handle_t handle); #endif // __FOOTPRINT_H__ starpu-1.2.3+dfsg/src/datawizard/interfaces/000077500000000000000000000000001320135501600210125ustar00rootroot00000000000000starpu-1.2.3+dfsg/src/datawizard/interfaces/bcsr_filters.c000066400000000000000000000035741320135501600236500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2016 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include void starpu_bcsr_filter_canonical_block(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, STARPU_ATTRIBUTE_UNUSED unsigned nparts) { struct starpu_bcsr_interface *bcsr_father = (struct starpu_bcsr_interface *) father_interface; /* each chunk becomes a small dense matrix */ struct starpu_matrix_interface *matrix_child = (struct starpu_matrix_interface *) child_interface; size_t elemsize = bcsr_father->elemsize; uint32_t firstentry = bcsr_father->firstentry; /* size of the tiles */ uint32_t r = bcsr_father->r; uint32_t c = bcsr_father->c; uint32_t ptr_offset = c*r*id*elemsize; STARPU_ASSERT_MSG(bcsr_father->id == STARPU_BCSR_INTERFACE_ID, "%s can only be applied on a bcsr data", __func__); matrix_child->id = STARPU_MATRIX_INTERFACE_ID; matrix_child->nx = c; matrix_child->ny = r; matrix_child->ld = c; matrix_child->elemsize = elemsize; if (bcsr_father->nzval) { uint8_t *nzval = (uint8_t *)(bcsr_father->nzval); matrix_child->ptr = (uintptr_t)&nzval[firstentry + ptr_offset]; } } starpu-1.2.3+dfsg/src/datawizard/interfaces/bcsr_interface.c000066400000000000000000000356201320135501600241350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include /* * BCSR : blocked CSR, we use blocks of size (r x c) */ static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data); static const struct starpu_data_copy_methods bcsr_copy_data_methods_s = { .any_to_any = copy_any_to_any, }; static void register_bcsr_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface); static void *bcsr_handle_to_pointer(starpu_data_handle_t data_handle, unsigned node); static starpu_ssize_t allocate_bcsr_buffer_on_node(void *data_interface, unsigned dst_node); static void free_bcsr_buffer_on_node(void *data_interface, unsigned node); static size_t bcsr_interface_get_size(starpu_data_handle_t handle); static int bcsr_compare(void *data_interface_a, void *data_interface_b); static uint32_t footprint_bcsr_interface_crc32(starpu_data_handle_t handle); static starpu_ssize_t describe(void *data_interface, char *buf, size_t size); static int pack_data(starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count); static int unpack_data(starpu_data_handle_t handle, unsigned node, void *ptr, size_t count); struct starpu_data_interface_ops starpu_interface_bcsr_ops = { .register_data_handle = register_bcsr_handle, .allocate_data_on_node = allocate_bcsr_buffer_on_node, .free_data_on_node = free_bcsr_buffer_on_node, .copy_methods = &bcsr_copy_data_methods_s, .get_size = bcsr_interface_get_size, .interfaceid = STARPU_BCSR_INTERFACE_ID, .interface_size = sizeof(struct starpu_bcsr_interface), .footprint = footprint_bcsr_interface_crc32, .compare = bcsr_compare, .describe = describe, .handle_to_pointer = bcsr_handle_to_pointer, .name = "STARPU_BCSR_INTERFACE", .pack_data = pack_data, .unpack_data = unpack_data }; static void *bcsr_handle_to_pointer(starpu_data_handle_t data_handle, unsigned node) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(data_handle, node)); struct starpu_bcsr_interface *bcsr_interface = (struct starpu_bcsr_interface *) starpu_data_get_interface_on_node(data_handle, node); return (void*) bcsr_interface->nzval; } static void register_bcsr_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface) { struct starpu_bcsr_interface *bcsr_interface = (struct starpu_bcsr_interface *) data_interface; unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct starpu_bcsr_interface *local_interface = (struct starpu_bcsr_interface *) starpu_data_get_interface_on_node(handle, node); if (node == home_node) { local_interface->nzval = bcsr_interface->nzval; local_interface->colind = bcsr_interface->colind; local_interface->rowptr = bcsr_interface->rowptr; } else { local_interface->nzval = 0; local_interface->colind = NULL; local_interface->rowptr = NULL; } local_interface->id = bcsr_interface->id; local_interface->nnz = bcsr_interface->nnz; local_interface->nrow = bcsr_interface->nrow; local_interface->firstentry = bcsr_interface->firstentry; local_interface->r = bcsr_interface->r; local_interface->c = bcsr_interface->c; local_interface->elemsize = bcsr_interface->elemsize; } } void starpu_bcsr_data_register(starpu_data_handle_t *handleptr, int home_node, uint32_t nnz, uint32_t nrow, uintptr_t nzval, uint32_t *colind, uint32_t *rowptr, uint32_t firstentry, uint32_t r, uint32_t c, size_t elemsize) { struct starpu_bcsr_interface bcsr_interface = { .id = STARPU_BCSR_INTERFACE_ID, .nzval = nzval, .colind = colind, .rowptr = rowptr, .nnz = nnz, .nrow = nrow, .firstentry = firstentry, .r = r, .c = c, .elemsize = elemsize }; #ifndef STARPU_SIMGRID if (home_node == STARPU_MAIN_RAM) { STARPU_ASSERT_ACCESSIBLE(nzval); STARPU_ASSERT_ACCESSIBLE(nzval + nnz*elemsize*r*c - 1); STARPU_ASSERT_ACCESSIBLE(colind); STARPU_ASSERT_ACCESSIBLE((uintptr_t) colind + nnz*sizeof(uint32_t) - 1); STARPU_ASSERT_ACCESSIBLE(rowptr); STARPU_ASSERT_ACCESSIBLE((uintptr_t) rowptr + (nrow+1)*sizeof(uint32_t) - 1); } #endif starpu_data_register(handleptr, home_node, &bcsr_interface, &starpu_interface_bcsr_ops); } static uint32_t footprint_bcsr_interface_crc32(starpu_data_handle_t handle) { uint32_t hash; hash = starpu_hash_crc32c_be(starpu_bcsr_get_nnz(handle), 0); hash = starpu_hash_crc32c_be(starpu_bcsr_get_c(handle), hash); hash = starpu_hash_crc32c_be(starpu_bcsr_get_r(handle), hash); return hash; } static int bcsr_compare(void *data_interface_a, void *data_interface_b) { struct starpu_bcsr_interface *bcsr_a = (struct starpu_bcsr_interface *) data_interface_a; struct starpu_bcsr_interface *bcsr_b = (struct starpu_bcsr_interface *) data_interface_b; /* Two matricess are considered compatible if they have the same size */ return (bcsr_a->nnz == bcsr_b->nnz) && (bcsr_a->nrow == bcsr_b->nrow) && (bcsr_a->r == bcsr_b->r) && (bcsr_a->c == bcsr_b->c) && (bcsr_a->elemsize == bcsr_b->elemsize); } /* offer an access to the data parameters */ uint32_t starpu_bcsr_get_nnz(starpu_data_handle_t handle) { struct starpu_bcsr_interface *data_interface = (struct starpu_bcsr_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(data_interface->id == STARPU_BCSR_INTERFACE_ID, "Error. The given data is not a bcsr."); #endif return data_interface->nnz; } uint32_t starpu_bcsr_get_nrow(starpu_data_handle_t handle) { struct starpu_bcsr_interface *data_interface = (struct starpu_bcsr_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(data_interface->id == STARPU_BCSR_INTERFACE_ID, "Error. The given data is not a bcsr."); #endif return data_interface->nrow; } uint32_t starpu_bcsr_get_firstentry(starpu_data_handle_t handle) { struct starpu_bcsr_interface *data_interface = (struct starpu_bcsr_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(data_interface->id == STARPU_BCSR_INTERFACE_ID, "Error. The given data is not a bcsr."); #endif return data_interface->firstentry; } uint32_t starpu_bcsr_get_r(starpu_data_handle_t handle) { struct starpu_bcsr_interface *data_interface = (struct starpu_bcsr_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(data_interface->id == STARPU_BCSR_INTERFACE_ID, "Error. The given data is not a bcsr."); #endif return data_interface->r; } uint32_t starpu_bcsr_get_c(starpu_data_handle_t handle) { struct starpu_bcsr_interface *data_interface = (struct starpu_bcsr_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(data_interface->id == STARPU_BCSR_INTERFACE_ID, "Error. The given data is not a bcsr."); #endif return data_interface->c; } size_t starpu_bcsr_get_elemsize(starpu_data_handle_t handle) { struct starpu_bcsr_interface *data_interface = (struct starpu_bcsr_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(data_interface->id == STARPU_BCSR_INTERFACE_ID, "Error. The given data is not a bcsr."); #endif return data_interface->elemsize; } uintptr_t starpu_bcsr_get_local_nzval(starpu_data_handle_t handle) { unsigned node; node = _starpu_memory_node_get_local_key(); STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_bcsr_interface *data_interface = (struct starpu_bcsr_interface *) starpu_data_get_interface_on_node(handle, node); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(data_interface->id == STARPU_BCSR_INTERFACE_ID, "Error. The given data is not a bcsr."); #endif return data_interface->nzval; } uint32_t *starpu_bcsr_get_local_colind(starpu_data_handle_t handle) { /* XXX 0 */ struct starpu_bcsr_interface *data_interface = (struct starpu_bcsr_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(data_interface->id == STARPU_BCSR_INTERFACE_ID, "Error. The given data is not a bcsr."); #endif return data_interface->colind; } uint32_t *starpu_bcsr_get_local_rowptr(starpu_data_handle_t handle) { /* XXX 0 */ struct starpu_bcsr_interface *data_interface = (struct starpu_bcsr_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(data_interface->id == STARPU_BCSR_INTERFACE_ID, "Error. The given data is not a bcsr."); #endif return data_interface->rowptr; } static size_t bcsr_interface_get_size(starpu_data_handle_t handle) { size_t size; uint32_t nnz = starpu_bcsr_get_nnz(handle); uint32_t nrow = starpu_bcsr_get_nrow(handle); uint32_t r = starpu_bcsr_get_r(handle); uint32_t c = starpu_bcsr_get_c(handle); size_t elemsize = starpu_bcsr_get_elemsize(handle); size = nnz*r*c*elemsize + nnz*sizeof(uint32_t) + (nrow+1)*sizeof(uint32_t); return size; } /* memory allocation/deallocation primitives for the BLAS interface */ /* returns the size of the allocated area */ static starpu_ssize_t allocate_bcsr_buffer_on_node(void *data_interface_, unsigned dst_node) { uintptr_t addr_nzval, addr_colind, addr_rowptr; starpu_ssize_t allocated_memory; /* we need the 3 arrays to be allocated */ struct starpu_bcsr_interface *bcsr_interface = (struct starpu_bcsr_interface *) data_interface_; uint32_t nnz = bcsr_interface->nnz; uint32_t nrow = bcsr_interface->nrow; size_t elemsize = bcsr_interface->elemsize; uint32_t r = bcsr_interface->r; uint32_t c = bcsr_interface->c; addr_nzval = starpu_malloc_on_node(dst_node, nnz*r*c*elemsize); if (!addr_nzval) goto fail_nzval; addr_colind = starpu_malloc_on_node(dst_node, nnz*sizeof(uint32_t)); if (!addr_colind) goto fail_colind; addr_rowptr = starpu_malloc_on_node(dst_node, (nrow+1)*sizeof(uint32_t)); if (!addr_rowptr) goto fail_rowptr; /* allocation succeeded */ allocated_memory = nnz*r*c*elemsize + nnz*sizeof(uint32_t) + (nrow+1)*sizeof(uint32_t); /* update the data properly in consequence */ bcsr_interface->nzval = addr_nzval; bcsr_interface->colind = (uint32_t*) addr_colind; bcsr_interface->rowptr = (uint32_t*) addr_rowptr; return allocated_memory; fail_rowptr: starpu_free_on_node(dst_node, addr_colind, nnz*sizeof(uint32_t)); fail_colind: starpu_free_on_node(dst_node, addr_nzval, nnz*r*c*elemsize); fail_nzval: /* allocation failed */ return -ENOMEM; } static void free_bcsr_buffer_on_node(void *data_interface, unsigned node) { struct starpu_bcsr_interface *bcsr_interface = (struct starpu_bcsr_interface *) data_interface; uint32_t nnz = bcsr_interface->nnz; uint32_t nrow = bcsr_interface->nrow; size_t elemsize = bcsr_interface->elemsize; uint32_t r = bcsr_interface->r; uint32_t c = bcsr_interface->c; starpu_free_on_node(node, bcsr_interface->nzval, nnz*r*c*elemsize); starpu_free_on_node(node, (uintptr_t) bcsr_interface->colind, nnz*sizeof(uint32_t)); starpu_free_on_node(node, (uintptr_t) bcsr_interface->rowptr, (nrow+1)*sizeof(uint32_t)); } static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data) { struct starpu_bcsr_interface *src_bcsr = (struct starpu_bcsr_interface *) src_interface; struct starpu_bcsr_interface *dst_bcsr = (struct starpu_bcsr_interface *) dst_interface; uint32_t nnz = src_bcsr->nnz; uint32_t nrow = src_bcsr->nrow; size_t elemsize = src_bcsr->elemsize; uint32_t r = src_bcsr->r; uint32_t c = src_bcsr->c; int ret = 0; if (starpu_interface_copy(src_bcsr->nzval, 0, src_node, dst_bcsr->nzval, 0, dst_node, nnz*elemsize*r*c, async_data)) ret = -EAGAIN; if (starpu_interface_copy((uintptr_t)src_bcsr->colind, 0, src_node, (uintptr_t)dst_bcsr->colind, 0, dst_node, nnz*sizeof(uint32_t), async_data)) ret = -EAGAIN; if (starpu_interface_copy((uintptr_t)src_bcsr->rowptr, 0, src_node, (uintptr_t)dst_bcsr->rowptr, 0, dst_node, (nrow+1)*sizeof(uint32_t), async_data)) ret = -EAGAIN; _STARPU_TRACE_DATA_COPY(src_node, dst_node, nnz*elemsize*r*c + (nnz+nrow+1)*sizeof(uint32_t)); return ret; } static starpu_ssize_t describe(void *data_interface, char *buf, size_t size) { struct starpu_bcsr_interface *bcsr = (struct starpu_bcsr_interface *) data_interface; return snprintf(buf, size, "b%ux%ux%ux%ux%u", (unsigned) bcsr->nnz, (unsigned) bcsr->nrow, (unsigned) bcsr->r, (unsigned) bcsr->c, (unsigned) bcsr->elemsize); } static int pack_data(starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_bcsr_interface *bcsr = (struct starpu_bcsr_interface *) starpu_data_get_interface_on_node(handle, node); // We first pack colind *count = bcsr->nnz * sizeof(bcsr->colind[0]); // Then rowptr *count += (bcsr->nrow + 1) * sizeof(bcsr->rowptr[0]); // Then nnzval *count += bcsr->r * bcsr->c * bcsr->nnz * bcsr->elemsize; if (ptr != NULL) { starpu_malloc_flags(ptr, *count, 0); char *tmp = *ptr; memcpy(tmp, (void*)bcsr->colind, bcsr->nnz * sizeof(bcsr->colind[0])); tmp += bcsr->nnz * sizeof(bcsr->colind[0]); memcpy(tmp, (void*)bcsr->rowptr, (bcsr->nrow + 1) * sizeof(bcsr->rowptr[0])); tmp += (bcsr->nrow + 1) * sizeof(bcsr->rowptr[0]); memcpy(tmp, (void*)bcsr->nzval, bcsr->r * bcsr->c * bcsr->nnz * bcsr->elemsize); } return 0; } static int unpack_data(starpu_data_handle_t handle, unsigned node, void *ptr, size_t count) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_bcsr_interface *bcsr = (struct starpu_bcsr_interface *) starpu_data_get_interface_on_node(handle, node); STARPU_ASSERT(count == (bcsr->nnz * sizeof(bcsr->colind[0]))+((bcsr->nrow + 1) * sizeof(bcsr->rowptr[0]))+(bcsr->r * bcsr->c * bcsr->nnz * bcsr->elemsize)); char *tmp = ptr; memcpy((void*)bcsr->colind, tmp, bcsr->nnz * sizeof(bcsr->colind[0])); tmp += bcsr->nnz * sizeof(bcsr->colind[0]); memcpy((void*)bcsr->rowptr, tmp, (bcsr->nrow + 1) * sizeof(bcsr->rowptr[0])); tmp += (bcsr->nrow + 1) * sizeof(bcsr->rowptr[0]); memcpy((void*)bcsr->nzval, tmp, bcsr->r * bcsr->c * bcsr->nnz * bcsr->elemsize); return 0; } starpu-1.2.3+dfsg/src/datawizard/interfaces/block_filters.c000066400000000000000000000233111320135501600240000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011 CNRS * Copyright (C) 2013, 2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include void starpu_block_filter_block(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nparts) { struct starpu_block_interface *block_father = (struct starpu_block_interface *) father_interface; struct starpu_block_interface *block_child = (struct starpu_block_interface *) child_interface; uint32_t nx = block_father->nx; uint32_t ny = block_father->ny; uint32_t nz = block_father->nz; size_t elemsize = block_father->elemsize; STARPU_ASSERT_MSG(nparts <= nx, "%u parts for %u elements", nparts, nx); uint32_t chunk_size; size_t offset; _starpu_filter_nparts_compute_chunk_size_and_offset(nx, nparts, elemsize, id, 1, &chunk_size, &offset); STARPU_ASSERT_MSG(block_father->id == STARPU_BLOCK_INTERFACE_ID, "%s can only be applied on a block data", __func__); block_child->id = block_father->id; block_child->nx = chunk_size; block_child->ny = ny; block_child->nz = nz; block_child->elemsize = elemsize; if (block_father->dev_handle) { if (block_father->ptr) block_child->ptr = block_father->ptr + offset; block_child->ldy = block_father->ldy; block_child->ldz = block_father->ldz; block_child->dev_handle = block_father->dev_handle; block_child->offset = block_father->offset + offset; } } void starpu_block_filter_block_shadow(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nparts) { struct starpu_block_interface *block_father = (struct starpu_block_interface *) father_interface; struct starpu_block_interface *block_child = (struct starpu_block_interface *) child_interface; uintptr_t shadow_size = (uintptr_t) f->filter_arg_ptr; /* actual number of elements */ uint32_t nx = block_father->nx - 2 * shadow_size; uint32_t ny = block_father->ny; uint32_t nz = block_father->nz; size_t elemsize = block_father->elemsize; STARPU_ASSERT_MSG(nparts <= nx, "%u parts for %u elements", nparts, nx); uint32_t child_nx; size_t offset; _starpu_filter_nparts_compute_chunk_size_and_offset(nx, nparts, elemsize, id, 1, &child_nx, &offset); STARPU_ASSERT_MSG(block_father->id == STARPU_BLOCK_INTERFACE_ID, "%s can only be applied on a block data", __func__); block_child->id = block_father->id; block_child->nx = child_nx + 2 * shadow_size; block_child->ny = ny; block_child->nz = nz; block_child->elemsize = elemsize; if (block_father->dev_handle) { if (block_father->ptr) block_child->ptr = block_father->ptr + offset; block_child->ldy = block_father->ldy; block_child->ldz = block_father->ldz; block_child->dev_handle = block_father->dev_handle; block_child->offset = block_father->offset + offset; } } void starpu_block_filter_vertical_block(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nparts) { struct starpu_block_interface *block_father = (struct starpu_block_interface *) father_interface; struct starpu_block_interface *block_child = (struct starpu_block_interface *) child_interface; uint32_t nx = block_father->nx; uint32_t ny = block_father->ny; uint32_t nz = block_father->nz; size_t elemsize = block_father->elemsize; STARPU_ASSERT_MSG(nparts <= ny, "%u parts for %u elements", nparts, ny); uint32_t child_ny; size_t offset; _starpu_filter_nparts_compute_chunk_size_and_offset(ny, nparts, elemsize, id, block_father->ldy, &child_ny, &offset); STARPU_ASSERT_MSG(block_father->id == STARPU_BLOCK_INTERFACE_ID, "%s can only be applied on a block data", __func__); block_child->id = block_father->id; block_child->nx = nx; block_child->ny = child_ny; block_child->nz = nz; block_child->elemsize = elemsize; if (block_father->dev_handle) { if (block_father->ptr) block_child->ptr = block_father->ptr + offset; block_child->ldy = block_father->ldy; block_child->ldz = block_father->ldz; block_child->dev_handle = block_father->dev_handle; block_child->offset = block_father->offset + offset; } } void starpu_block_filter_vertical_block_shadow(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nparts) { struct starpu_block_interface *block_father = (struct starpu_block_interface *) father_interface; struct starpu_block_interface *block_child = (struct starpu_block_interface *) child_interface; uintptr_t shadow_size = (uintptr_t) f->filter_arg_ptr; uint32_t nx = block_father->nx; /* actual number of elements */ uint32_t ny = block_father->ny - 2 * shadow_size; uint32_t nz = block_father->nz; size_t elemsize = block_father->elemsize; STARPU_ASSERT_MSG(nparts <= ny, "%u parts for %u elements", nparts, ny); uint32_t child_ny; size_t offset; _starpu_filter_nparts_compute_chunk_size_and_offset(ny, nparts, elemsize, id, block_father->ldy, &child_ny, &offset); STARPU_ASSERT_MSG(block_father->id == STARPU_BLOCK_INTERFACE_ID, "%s can only be applied on a block data", __func__); block_child->id = block_father->id; block_child->nx = nx; block_child->ny = child_ny + 2 * shadow_size; block_child->nz = nz; block_child->elemsize = elemsize; if (block_father->dev_handle) { if (block_father->ptr) block_child->ptr = block_father->ptr + offset; block_child->ldy = block_father->ldy; block_child->ldz = block_father->ldz; block_child->dev_handle = block_father->dev_handle; block_child->offset = block_father->offset + offset; } } void starpu_block_filter_depth_block(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nparts) { struct starpu_block_interface *block_father = (struct starpu_block_interface *) father_interface; struct starpu_block_interface *block_child = (struct starpu_block_interface *) child_interface; uint32_t nx = block_father->nx; uint32_t ny = block_father->ny; uint32_t nz = block_father->nz; size_t elemsize = block_father->elemsize; STARPU_ASSERT_MSG(nparts <= nz, "%u parts for %u elements", nparts, nz); uint32_t child_nz; size_t offset; _starpu_filter_nparts_compute_chunk_size_and_offset(nz, nparts, elemsize, id, block_father->ldz, &child_nz, &offset); STARPU_ASSERT_MSG(block_father->id == STARPU_BLOCK_INTERFACE_ID, "%s can only be applied on a block data", __func__); block_child->id = block_father->id; block_child->nx = nx; block_child->ny = ny; block_child->nz = child_nz; block_child->elemsize = elemsize; if (block_father->dev_handle) { if (block_father->ptr) block_child->ptr = block_father->ptr + offset; block_child->ldy = block_father->ldy; block_child->ldz = block_father->ldz; block_child->dev_handle = block_father->dev_handle; block_child->offset = block_father->offset + offset; } } void starpu_block_filter_depth_block_shadow(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nparts) { struct starpu_block_interface *block_father = (struct starpu_block_interface *) father_interface; struct starpu_block_interface *block_child = (struct starpu_block_interface *) child_interface; uintptr_t shadow_size = (uintptr_t) f->filter_arg_ptr; uint32_t nx = block_father->nx; uint32_t ny = block_father->ny; /* actual number of elements */ uint32_t nz = block_father->nz - 2 * shadow_size; size_t elemsize = block_father->elemsize; STARPU_ASSERT_MSG(nparts <= nz, "%u parts for %u elements", nparts, nz); uint32_t child_nz; size_t offset; _starpu_filter_nparts_compute_chunk_size_and_offset(nz, nparts, elemsize, id, block_father->ldz, &child_nz, &offset); STARPU_ASSERT_MSG(block_father->id == STARPU_BLOCK_INTERFACE_ID, "%s can only be applied on a block data", __func__); block_child->id = block_father->id; block_child->nx = nx; block_child->ny = ny; block_child->nz = child_nz + 2 * shadow_size; block_child->elemsize = elemsize; if (block_father->dev_handle) { if (block_father->ptr) block_child->ptr = block_father->ptr + offset; block_child->ldy = block_father->ldy; block_child->ldz = block_father->ldz; block_child->dev_handle = block_father->dev_handle; block_child->offset = block_father->offset + offset; } } starpu-1.2.3+dfsg/src/datawizard/interfaces/block_interface.c000066400000000000000000000705341320135501600243010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include #ifdef STARPU_USE_CUDA static int copy_ram_to_cuda(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); static int copy_cuda_to_ram(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); static int copy_ram_to_cuda_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cudaStream_t stream); static int copy_cuda_to_ram_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cudaStream_t stream); static int copy_cuda_to_cuda(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); #endif #ifdef STARPU_USE_OPENCL static int copy_ram_to_opencl(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); static int copy_opencl_to_ram(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); static int copy_opencl_to_opencl(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); static int copy_ram_to_opencl_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cl_event *event); static int copy_opencl_to_ram_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cl_event *event); static int copy_opencl_to_opencl_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cl_event *event); #endif static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data); static const struct starpu_data_copy_methods block_copy_data_methods_s = { #ifdef STARPU_USE_CUDA .ram_to_cuda = copy_ram_to_cuda, .cuda_to_ram = copy_cuda_to_ram, .ram_to_cuda_async = copy_ram_to_cuda_async, .cuda_to_ram_async = copy_cuda_to_ram_async, .cuda_to_cuda = copy_cuda_to_cuda, #endif #ifdef STARPU_USE_OPENCL .ram_to_opencl = copy_ram_to_opencl, .opencl_to_ram = copy_opencl_to_ram, .opencl_to_opencl = copy_opencl_to_opencl, .ram_to_opencl_async = copy_ram_to_opencl_async, .opencl_to_ram_async = copy_opencl_to_ram_async, .opencl_to_opencl_async = copy_opencl_to_opencl_async, #endif .any_to_any = copy_any_to_any, }; static void register_block_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface); static void *block_handle_to_pointer(starpu_data_handle_t data_handle, unsigned node); static starpu_ssize_t allocate_block_buffer_on_node(void *data_interface_, unsigned dst_node); static void free_block_buffer_on_node(void *data_interface, unsigned node); static size_t block_interface_get_size(starpu_data_handle_t handle); static uint32_t footprint_block_interface_crc32(starpu_data_handle_t handle); static int block_compare(void *data_interface_a, void *data_interface_b); static void display_block_interface(starpu_data_handle_t handle, FILE *f); static int pack_block_handle(starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count); static int unpack_block_handle(starpu_data_handle_t handle, unsigned node, void *ptr, size_t count); static starpu_ssize_t describe(void *data_interface, char *buf, size_t size); struct starpu_data_interface_ops starpu_interface_block_ops = { .register_data_handle = register_block_handle, .allocate_data_on_node = allocate_block_buffer_on_node, .handle_to_pointer = block_handle_to_pointer, .free_data_on_node = free_block_buffer_on_node, .copy_methods = &block_copy_data_methods_s, .get_size = block_interface_get_size, .footprint = footprint_block_interface_crc32, .compare = block_compare, .interfaceid = STARPU_BLOCK_INTERFACE_ID, .interface_size = sizeof(struct starpu_block_interface), .display = display_block_interface, .pack_data = pack_block_handle, .unpack_data = unpack_block_handle, .describe = describe, .name = "STARPU_BLOCK_INTERFACE" }; static void *block_handle_to_pointer(starpu_data_handle_t handle, unsigned node) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_block_interface *block_interface = (struct starpu_block_interface *) starpu_data_get_interface_on_node(handle, node); return (void*) block_interface->ptr; } static void register_block_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface) { struct starpu_block_interface *block_interface = (struct starpu_block_interface *) data_interface; unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct starpu_block_interface *local_interface = (struct starpu_block_interface *) starpu_data_get_interface_on_node(handle, node); if (node == home_node) { local_interface->ptr = block_interface->ptr; local_interface->dev_handle = block_interface->dev_handle; local_interface->offset = block_interface->offset; local_interface->ldy = block_interface->ldy; local_interface->ldz = block_interface->ldz; } else { local_interface->ptr = 0; local_interface->dev_handle = 0; local_interface->offset = 0; local_interface->ldy = 0; local_interface->ldz = 0; } local_interface->id = block_interface->id; local_interface->nx = block_interface->nx; local_interface->ny = block_interface->ny; local_interface->nz = block_interface->nz; local_interface->elemsize = block_interface->elemsize; } } /* declare a new data with the BLAS interface */ void starpu_block_data_register(starpu_data_handle_t *handleptr, int home_node, uintptr_t ptr, uint32_t ldy, uint32_t ldz, uint32_t nx, uint32_t ny, uint32_t nz, size_t elemsize) { struct starpu_block_interface block_interface = { .id = STARPU_BLOCK_INTERFACE_ID, .ptr = ptr, .dev_handle = ptr, .offset = 0, .ldy = ldy, .ldz = ldz, .nx = nx, .ny = ny, .nz = nz, .elemsize = elemsize }; #ifndef STARPU_SIMGRID if (home_node == STARPU_MAIN_RAM) { STARPU_ASSERT_ACCESSIBLE(ptr); STARPU_ASSERT_ACCESSIBLE(ptr + (nz-1)*ldz*elemsize + (ny-1)*ldy*elemsize + nx*elemsize - 1); } #endif #ifdef STARPU_USE_SCC _starpu_scc_set_offset_in_shared_memory((void*)block_interface.ptr, (void**)&(block_interface.dev_handle), &(block_interface.offset)); #endif starpu_data_register(handleptr, home_node, &block_interface, &starpu_interface_block_ops); } void starpu_block_ptr_register(starpu_data_handle_t handle, unsigned node, uintptr_t ptr, uintptr_t dev_handle, size_t offset, uint32_t ldy, uint32_t ldz) { struct starpu_block_interface *block_interface = starpu_data_get_interface_on_node(handle, node); starpu_data_ptr_register(handle, node); block_interface->ptr = ptr; block_interface->dev_handle = dev_handle; block_interface->offset = offset; block_interface->ldy = ldy; block_interface->ldz = ldz; } static uint32_t footprint_block_interface_crc32(starpu_data_handle_t handle) { uint32_t hash; hash = starpu_hash_crc32c_be(starpu_block_get_nx(handle), 0); hash = starpu_hash_crc32c_be(starpu_block_get_ny(handle), hash); hash = starpu_hash_crc32c_be(starpu_block_get_nz(handle), hash); return hash; } static int block_compare(void *data_interface_a, void *data_interface_b) { struct starpu_block_interface *block_a = (struct starpu_block_interface *) data_interface_a; struct starpu_block_interface *block_b = (struct starpu_block_interface *) data_interface_b; /* Two matricess are considered compatible if they have the same size */ return (block_a->nx == block_b->nx) && (block_a->ny == block_b->ny) && (block_a->nz == block_b->nz) && (block_a->elemsize == block_b->elemsize); } static void display_block_interface(starpu_data_handle_t handle, FILE *f) { struct starpu_block_interface *block_interface; block_interface = (struct starpu_block_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); fprintf(f, "%u\t%u\t%u\t", block_interface->nx, block_interface->ny, block_interface->nz); } static int pack_block_handle(starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_block_interface *block_interface = (struct starpu_block_interface *) starpu_data_get_interface_on_node(handle, node); *count = block_interface->nx*block_interface->ny*block_interface->nz*block_interface->elemsize; if (ptr != NULL) { uint32_t z, y; char *block = (void *)block_interface->ptr; starpu_malloc_flags(ptr, *count, 0); char *cur = *ptr; for(z=0 ; znz ; z++) { char *block_z = block; for(y=0 ; yny ; y++) { memcpy(cur, block, block_interface->nx*block_interface->elemsize); cur += block_interface->nx*block_interface->elemsize; block += block_interface->ldy * block_interface->elemsize; } block = block_z + block_interface->ldz * block_interface->elemsize; } } return 0; } static int unpack_block_handle(starpu_data_handle_t handle, unsigned node, void *ptr, size_t count) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_block_interface *block_interface = (struct starpu_block_interface *) starpu_data_get_interface_on_node(handle, node); STARPU_ASSERT(count == block_interface->elemsize * block_interface->nx * block_interface->ny * block_interface->nz); uint32_t z, y; char *cur = ptr; char *block = (void *)block_interface->ptr; for(z=0 ; znz ; z++) { char *block_z = block; for(y=0 ; yny ; y++) { memcpy(block, cur, block_interface->nx*block_interface->elemsize); cur += block_interface->nx*block_interface->elemsize; block += block_interface->ldy * block_interface->elemsize; } block = block_z + block_interface->ldz * block_interface->elemsize; } return 0; } static size_t block_interface_get_size(starpu_data_handle_t handle) { size_t size; struct starpu_block_interface *block_interface; block_interface = (struct starpu_block_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(block_interface->id == STARPU_BLOCK_INTERFACE_ID, "Error. The given data is not a block."); #endif size = block_interface->nx*block_interface->ny*block_interface->nz*block_interface->elemsize; return size; } /* offer an access to the data parameters */ uint32_t starpu_block_get_nx(starpu_data_handle_t handle) { struct starpu_block_interface *block_interface = (struct starpu_block_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(block_interface->id == STARPU_BLOCK_INTERFACE_ID, "Error. The given data is not a block."); #endif return block_interface->nx; } uint32_t starpu_block_get_ny(starpu_data_handle_t handle) { struct starpu_block_interface *block_interface = (struct starpu_block_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(block_interface->id == STARPU_BLOCK_INTERFACE_ID, "Error. The given data is not a block."); #endif return block_interface->ny; } uint32_t starpu_block_get_nz(starpu_data_handle_t handle) { struct starpu_block_interface *block_interface = (struct starpu_block_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(block_interface->id == STARPU_BLOCK_INTERFACE_ID, "Error. The given data is not a block."); #endif return block_interface->nz; } uint32_t starpu_block_get_local_ldy(starpu_data_handle_t handle) { unsigned node; node = _starpu_memory_node_get_local_key(); STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_block_interface *block_interface = (struct starpu_block_interface *) starpu_data_get_interface_on_node(handle, node); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(block_interface->id == STARPU_BLOCK_INTERFACE_ID, "Error. The given data is not a block."); #endif return block_interface->ldy; } uint32_t starpu_block_get_local_ldz(starpu_data_handle_t handle) { unsigned node; node = _starpu_memory_node_get_local_key(); STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_block_interface *block_interface = (struct starpu_block_interface *) starpu_data_get_interface_on_node(handle, node); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(block_interface->id == STARPU_BLOCK_INTERFACE_ID, "Error. The given data is not a block."); #endif return block_interface->ldz; } uintptr_t starpu_block_get_local_ptr(starpu_data_handle_t handle) { unsigned node; node = _starpu_memory_node_get_local_key(); STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_block_interface *block_interface = (struct starpu_block_interface *) starpu_data_get_interface_on_node(handle, node); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(block_interface->id == STARPU_BLOCK_INTERFACE_ID, "Error. The given data is not a block."); #endif return block_interface->ptr; } size_t starpu_block_get_elemsize(starpu_data_handle_t handle) { struct starpu_block_interface *block_interface = (struct starpu_block_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(block_interface->id == STARPU_BLOCK_INTERFACE_ID, "Error. The given data is not a block."); #endif return block_interface->elemsize; } /* memory allocation/deallocation primitives for the BLOCK interface */ /* returns the size of the allocated area */ static starpu_ssize_t allocate_block_buffer_on_node(void *data_interface_, unsigned dst_node) { uintptr_t addr = 0, handle; struct starpu_block_interface *dst_block = (struct starpu_block_interface *) data_interface_; uint32_t nx = dst_block->nx; uint32_t ny = dst_block->ny; uint32_t nz = dst_block->nz; size_t elemsize = dst_block->elemsize; starpu_ssize_t allocated_memory; handle = starpu_malloc_on_node(dst_node, nx*ny*nz*elemsize); if (!handle) return -ENOMEM; if (starpu_node_get_kind(dst_node) != STARPU_OPENCL_RAM) addr = handle; allocated_memory = nx*ny*nz*elemsize; /* update the data properly in consequence */ dst_block->ptr = addr; dst_block->dev_handle = handle; dst_block->offset = 0; dst_block->ldy = nx; dst_block->ldz = nx*ny; return allocated_memory; } static void free_block_buffer_on_node(void *data_interface, unsigned node) { struct starpu_block_interface *block_interface = (struct starpu_block_interface *) data_interface; uint32_t nx = block_interface->nx; uint32_t ny = block_interface->ny; uint32_t nz = block_interface->nz; size_t elemsize = block_interface->elemsize; starpu_free_on_node(node, block_interface->dev_handle, nx*ny*nz*elemsize); } #ifdef STARPU_USE_CUDA static int copy_cuda_common(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, enum cudaMemcpyKind kind) { struct starpu_block_interface *src_block = src_interface; struct starpu_block_interface *dst_block = dst_interface; uint32_t nx = src_block->nx; uint32_t ny = src_block->ny; uint32_t nz = src_block->nz; size_t elemsize = src_block->elemsize; cudaError_t cures; if ((nx == src_block->ldy) && (src_block->ldy == dst_block->ldy)) { /* Is that a single contiguous buffer ? */ if (((nx*ny) == src_block->ldz) && (src_block->ldz == dst_block->ldz)) { starpu_cuda_copy_async_sync((void *)src_block->ptr, src_node, (void *)dst_block->ptr, dst_node, nx*ny*nz*elemsize, NULL, kind); } else { /* Are all plans contiguous */ cures = cudaMemcpy2D((char *)dst_block->ptr, dst_block->ldz*elemsize, (char *)src_block->ptr, src_block->ldz*elemsize, nx*ny*elemsize, nz, kind); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); } } else { /* Default case: we transfer all blocks one by one: nz transfers */ /* TODO: use cudaMemcpy3D now that it works (except on cuda 4.2) */ unsigned layer; for (layer = 0; layer < src_block->nz; layer++) { uint8_t *src_ptr = ((uint8_t *)src_block->ptr) + layer*src_block->ldz*src_block->elemsize; uint8_t *dst_ptr = ((uint8_t *)dst_block->ptr) + layer*dst_block->ldz*dst_block->elemsize; cures = cudaMemcpy2D((char *)dst_ptr, dst_block->ldy*elemsize, (char *)src_ptr, src_block->ldy*elemsize, nx*elemsize, ny, kind); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); } } _STARPU_TRACE_DATA_COPY(src_node, dst_node, src_block->nx*src_block->ny*src_block->elemsize*src_block->elemsize); return 0; } static int copy_cuda_async_common(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cudaStream_t stream, enum cudaMemcpyKind kind) { struct starpu_block_interface *src_block = src_interface; struct starpu_block_interface *dst_block = dst_interface; uint32_t nx = src_block->nx; uint32_t ny = src_block->ny; uint32_t nz = src_block->nz; size_t elemsize = src_block->elemsize; cudaError_t cures; int ret; /* We may have a contiguous buffer for the entire block, or contiguous * plans within the block, we can avoid many small transfers that way */ if ((nx == src_block->ldy) && (src_block->ldy == dst_block->ldy)) { /* Is that a single contiguous buffer ? */ if (((nx*ny) == src_block->ldz) && (src_block->ldz == dst_block->ldz)) { ret = starpu_cuda_copy_async_sync((void *)src_block->ptr, src_node, (void *)dst_block->ptr, dst_node, nx*ny*nz*elemsize, stream, kind); } else { /* Are all plans contiguous */ _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); cures = cudaMemcpy2DAsync((char *)dst_block->ptr, dst_block->ldz*elemsize, (char *)src_block->ptr, src_block->ldz*elemsize, nx*ny*elemsize, nz, kind, stream); _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); if (STARPU_UNLIKELY(cures)) { cures = cudaMemcpy2D((char *)dst_block->ptr, dst_block->ldz*elemsize, (char *)src_block->ptr, src_block->ldz*elemsize, nx*ny*elemsize, nz, kind); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); ret = 0; } else { ret = -EAGAIN; } } } else { /* Default case: we transfer all blocks one by one: nz 2D transfers */ /* TODO: use cudaMemcpy3D now that it works (except on cuda 4.2) */ unsigned layer; for (layer = 0; layer < src_block->nz; layer++) { uint8_t *src_ptr = ((uint8_t *)src_block->ptr) + layer*src_block->ldz*src_block->elemsize; uint8_t *dst_ptr = ((uint8_t *)dst_block->ptr) + layer*dst_block->ldz*dst_block->elemsize; _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); cures = cudaMemcpy2DAsync((char *)dst_ptr, dst_block->ldy*elemsize, (char *)src_ptr, src_block->ldy*elemsize, nx*elemsize, ny, kind, stream); _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); if (STARPU_UNLIKELY(cures)) { /* I don't know how to do that "better" */ goto no_async_default; } } ret = -EAGAIN; } _STARPU_TRACE_DATA_COPY(src_node, dst_node, src_block->nx*src_block->ny*src_block->nz*src_block->elemsize); return ret; no_async_default: { unsigned layer; for (layer = 0; layer < src_block->nz; layer++) { uint8_t *src_ptr = ((uint8_t *)src_block->ptr) + layer*src_block->ldz*src_block->elemsize; uint8_t *dst_ptr = ((uint8_t *)dst_block->ptr) + layer*dst_block->ldz*dst_block->elemsize; cures = cudaMemcpy2D((char *)dst_ptr, dst_block->ldy*elemsize, (char *)src_ptr, src_block->ldy*elemsize, nx*elemsize, ny, kind); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); } _STARPU_TRACE_DATA_COPY(src_node, dst_node, src_block->nx*src_block->ny*src_block->nz*src_block->elemsize); return 0; } } static int copy_cuda_to_ram(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) { return copy_cuda_common(src_interface, src_node, dst_interface, dst_node, cudaMemcpyDeviceToHost); } static int copy_ram_to_cuda(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { return copy_cuda_common(src_interface, src_node, dst_interface, dst_node, cudaMemcpyHostToDevice); } static int copy_cuda_to_cuda(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { return copy_cuda_common(src_interface, src_node, dst_interface, dst_node, cudaMemcpyDeviceToDevice); } static int copy_cuda_to_ram_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cudaStream_t stream) { return copy_cuda_async_common(src_interface, src_node, dst_interface, dst_node, stream, cudaMemcpyDeviceToHost); } static int copy_ram_to_cuda_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cudaStream_t stream) { return copy_cuda_async_common(src_interface, src_node, dst_interface, dst_node, stream, cudaMemcpyHostToDevice); } #endif // STARPU_USE_CUDA #ifdef STARPU_USE_OPENCL static int copy_opencl_common(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event) { struct starpu_block_interface *src_block = src_interface; struct starpu_block_interface *dst_block = dst_interface; int ret = 0; uint32_t nx = src_block->nx; uint32_t ny = src_block->ny; /* We may have a contiguous buffer for the entire block, or contiguous * plans within the block, we can avoid many small transfers that way */ if ((nx == src_block->ldy) && (src_block->ldy == dst_block->ldy)) { /* Is that a single contiguous buffer ? */ if (((nx*ny) == src_block->ldz) && (src_block->ldz == dst_block->ldz)) { ret = starpu_opencl_copy_async_sync(src_block->dev_handle, src_block->offset, src_node, dst_block->dev_handle, dst_block->offset, dst_node, src_block->nx*src_block->ny*src_block->nz*src_block->elemsize, event); } else { /* Are all plans contiguous */ STARPU_ASSERT_MSG(0, "XXX non contiguous buffers are not properly supported in OpenCL yet. (TODO)"); } } else { /* Default case: we transfer all lines one by one: ny*nz transfers */ /* TODO: rect support */ unsigned layer; for (layer = 0; layer < src_block->nz; layer++) { unsigned j; for(j=0 ; jny ; j++) { ret = starpu_opencl_copy_async_sync(src_block->dev_handle, src_block->offset + layer*src_block->ldz*src_block->elemsize + j*src_block->ldy*src_block->elemsize, src_node, dst_block->dev_handle, dst_block->offset + layer*dst_block->ldz*dst_block->elemsize + j*dst_block->ldy*dst_block->elemsize, dst_node, src_block->nx*src_block->elemsize, event); } } } _STARPU_TRACE_DATA_COPY(src_node, dst_node, src_block->nx*src_block->ny*src_block->nz*src_block->elemsize); return ret; } static int copy_ram_to_opencl_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event) { return copy_opencl_common(src_interface, src_node, dst_interface, dst_node, event); } static int copy_opencl_to_ram_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event) { return copy_opencl_common(src_interface, src_node, dst_interface, dst_node, event); } static int copy_opencl_to_opencl_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event) { return copy_opencl_common(src_interface, src_node, dst_interface, dst_node, event); } static int copy_ram_to_opencl(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { return copy_ram_to_opencl_async(src_interface, src_node, dst_interface, dst_node, NULL); } static int copy_opencl_to_ram(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { return copy_opencl_to_ram_async(src_interface, src_node, dst_interface, dst_node, NULL); } static int copy_opencl_to_opencl(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { return copy_opencl_to_opencl_async(src_interface, src_node, dst_interface, dst_node, NULL); } #endif static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data) { struct starpu_block_interface *src_block = (struct starpu_block_interface *) src_interface; struct starpu_block_interface *dst_block = (struct starpu_block_interface *) dst_interface; int ret = 0; uint32_t nx = dst_block->nx; uint32_t ny = dst_block->ny; uint32_t nz = dst_block->nz; size_t elemsize = dst_block->elemsize; uint32_t ldy_src = src_block->ldy; uint32_t ldz_src = src_block->ldz; uint32_t ldy_dst = dst_block->ldy; uint32_t ldz_dst = dst_block->ldz; if (ldy_src == nx && ldy_dst == nx && ldz_src == ny && ldz_dst == ny) { /* Optimise non-partitioned and z-partitioned case */ if (starpu_interface_copy(src_block->dev_handle, src_block->offset, src_node, dst_block->dev_handle, dst_block->offset, dst_node, nx*ny*nz*elemsize, async_data)) ret = -EAGAIN; } else { unsigned z; for (z = 0; z < nz; z++) { if (ldy_src == nx && ldy_dst == nx) { /* Optimise y-partitioned case */ uint32_t src_offset = z*ldz_src*elemsize; uint32_t dst_offset = z*ldz_dst*elemsize; if (starpu_interface_copy(src_block->dev_handle, src_block->offset + src_offset, src_node, dst_block->dev_handle, dst_block->offset + dst_offset, dst_node, nx*ny*elemsize, async_data)) ret = -EAGAIN; } else { unsigned y; for (y = 0; y < ny; y++) { /* Eerf, x-partitioned case */ uint32_t src_offset = (y*ldy_src + z*ldz_src)*elemsize; uint32_t dst_offset = (y*ldy_dst + z*ldz_dst)*elemsize; if (starpu_interface_copy(src_block->dev_handle, src_block->offset + src_offset, src_node, dst_block->dev_handle, dst_block->offset + dst_offset, dst_node, nx*elemsize, async_data)) ret = -EAGAIN; } } } } _STARPU_TRACE_DATA_COPY(src_node, dst_node, nx*ny*nz*elemsize); return ret; } static starpu_ssize_t describe(void *data_interface, char *buf, size_t size) { struct starpu_block_interface *block = (struct starpu_block_interface *) data_interface; return snprintf(buf, size, "B%ux%ux%ux%u", (unsigned) block->nx, (unsigned) block->ny, (unsigned) block->nz, (unsigned) block->elemsize); } starpu-1.2.3+dfsg/src/datawizard/interfaces/coo_interface.c000066400000000000000000000173751320135501600237730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2014, 2016 Université Bordeaux * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data) { size_t size = 0; struct starpu_coo_interface *src_coo, *dst_coo; int ret = 0; src_coo = (struct starpu_coo_interface *) src_interface; dst_coo = (struct starpu_coo_interface *) dst_interface; size = src_coo->n_values * sizeof(src_coo->columns[0]); if (starpu_interface_copy( (uintptr_t) src_coo->columns, 0, src_node, (uintptr_t) dst_coo->columns, 0, dst_node, size, async_data)) ret = -EAGAIN; /* sizeof(src_coo->columns[0]) == sizeof(src_coo->rows[0]) */ if (starpu_interface_copy( (uintptr_t) src_coo->rows, 0, src_node, (uintptr_t) dst_coo->rows, 0, dst_node, size, async_data)) ret = -EAGAIN; size = src_coo->n_values * src_coo->elemsize; if (starpu_interface_copy( src_coo->values, 0, src_node, dst_coo->values, 0, dst_node, size, async_data)) ret = -EAGAIN; _STARPU_TRACE_DATA_COPY(src_node, dst_node, src_coo->n_values * (2 * sizeof(src_coo->rows[0]) + src_coo->elemsize)); return ret; } static const struct starpu_data_copy_methods coo_copy_data_methods = { .any_to_any = copy_any_to_any, }; static void register_coo_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface) { struct starpu_coo_interface *coo_interface = (struct starpu_coo_interface *) data_interface; unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct starpu_coo_interface *local_interface; local_interface = (struct starpu_coo_interface *) starpu_data_get_interface_on_node(handle, node); if (node == home_node) { local_interface->values = coo_interface->values; local_interface->columns = coo_interface->columns; local_interface->rows = coo_interface->rows; } else { local_interface->values = 0; local_interface->columns = 0; local_interface->rows = 0; } local_interface->id = coo_interface->id; local_interface->nx = coo_interface->nx; local_interface->ny = coo_interface->ny; local_interface->n_values = coo_interface->n_values; local_interface->elemsize = coo_interface->elemsize; } } static starpu_ssize_t allocate_coo_buffer_on_node(void *data_interface, unsigned dst_node) { uint32_t *addr_columns = NULL; uint32_t *addr_rows = NULL; uintptr_t addr_values = 0; struct starpu_coo_interface *coo_interface = (struct starpu_coo_interface *) data_interface; uint32_t n_values = coo_interface->n_values; size_t elemsize = coo_interface->elemsize; addr_columns = (void*) starpu_malloc_on_node(dst_node, n_values * sizeof(coo_interface->columns[0])); if (STARPU_UNLIKELY(addr_columns == NULL)) goto fail_columns; addr_rows = (void*) starpu_malloc_on_node(dst_node, n_values * sizeof(coo_interface->rows[0])); if (STARPU_UNLIKELY(addr_rows == NULL)) goto fail_rows; addr_values = starpu_malloc_on_node(dst_node, n_values * elemsize); if (STARPU_UNLIKELY(addr_values == (uintptr_t) NULL)) goto fail_values; coo_interface->columns = addr_columns; coo_interface->rows = addr_rows; coo_interface->values = addr_values; return n_values * (sizeof(coo_interface->columns[0]) + sizeof(coo_interface->rows[0]) + elemsize); fail_values: starpu_free_on_node(dst_node, (uintptr_t) addr_rows, n_values * sizeof(coo_interface->rows[0])); fail_rows: starpu_free_on_node(dst_node, (uintptr_t) addr_columns, n_values * sizeof(coo_interface->columns[0])); fail_columns: return -ENOMEM; } static void free_coo_buffer_on_node(void *data_interface, unsigned node) { struct starpu_coo_interface *coo_interface = (struct starpu_coo_interface *) data_interface; uint32_t n_values = coo_interface->n_values; size_t elemsize = coo_interface->elemsize; starpu_free_on_node(node, (uintptr_t) coo_interface->columns, n_values * sizeof(coo_interface->columns[0])); starpu_free_on_node(node, (uintptr_t) coo_interface->rows, n_values * sizeof(coo_interface->rows[0])); starpu_free_on_node(node, coo_interface->values, n_values * elemsize); } static size_t coo_interface_get_size(starpu_data_handle_t handle) { struct starpu_coo_interface *coo_interface; coo_interface = (struct starpu_coo_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); return coo_interface->nx * coo_interface->ny * coo_interface->elemsize; } static uint32_t coo_interface_footprint(starpu_data_handle_t handle) { struct starpu_coo_interface *coo_interface; coo_interface = (struct starpu_coo_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); return starpu_hash_crc32c_be(coo_interface->nx * coo_interface->ny, 0); } static int coo_compare(void *a, void *b) { struct starpu_coo_interface *coo_a, *coo_b; coo_a = (struct starpu_coo_interface *) a; coo_b = (struct starpu_coo_interface *) b; return coo_a->nx == coo_b->nx && coo_a->ny == coo_b->ny && coo_a->n_values == coo_b->n_values && coo_a->elemsize == coo_b->elemsize; } static void display_coo_interface(starpu_data_handle_t handle, FILE *f) { struct starpu_coo_interface *coo_interface; coo_interface = (struct starpu_coo_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); fprintf(f, "%u\t%u", coo_interface->nx, coo_interface->ny); } static starpu_ssize_t describe(void *data_interface, char *buf, size_t size) { struct starpu_coo_interface *coo = (struct starpu_coo_interface *) data_interface; return snprintf(buf, size, "M%ux%ux%ux%u", (unsigned) coo->nx, (unsigned) coo->ny, (unsigned) coo->n_values, (unsigned) coo->elemsize); } struct starpu_data_interface_ops starpu_interface_coo_ops = { .register_data_handle = register_coo_handle, .allocate_data_on_node = allocate_coo_buffer_on_node, .handle_to_pointer = NULL, .free_data_on_node = free_coo_buffer_on_node, .copy_methods = &coo_copy_data_methods, .get_size = coo_interface_get_size, .footprint = coo_interface_footprint, .compare = coo_compare, .interfaceid = STARPU_COO_INTERFACE_ID, .interface_size = sizeof(struct starpu_coo_interface), .display = display_coo_interface, .describe = describe, .name = "STARPU_COO_INTERFACE" }; void starpu_coo_data_register(starpu_data_handle_t *handleptr, int home_node, uint32_t nx, uint32_t ny, uint32_t n_values, uint32_t *columns, uint32_t *rows, uintptr_t values, size_t elemsize) { struct starpu_coo_interface coo_interface = { .id = STARPU_COO_INTERFACE_ID, .values = values, .columns = columns, .rows = rows, .nx = nx, .ny = ny, .n_values = n_values, .elemsize = elemsize, }; #ifndef STARPU_SIMGRID if (home_node == STARPU_MAIN_RAM) { STARPU_ASSERT_ACCESSIBLE(columns); STARPU_ASSERT_ACCESSIBLE((uintptr_t) columns + n_values*sizeof(uint32_t) - 1); STARPU_ASSERT_ACCESSIBLE(rows); STARPU_ASSERT_ACCESSIBLE((uintptr_t) rows + n_values*sizeof(uint32_t) - 1); STARPU_ASSERT_ACCESSIBLE(values); STARPU_ASSERT_ACCESSIBLE(values + n_values*elemsize - 1); } #endif starpu_data_register(handleptr, home_node, &coo_interface, &starpu_interface_coo_ops); } starpu-1.2.3+dfsg/src/datawizard/interfaces/csr_filters.c000066400000000000000000000045461320135501600235060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2016 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include void starpu_csr_filter_vertical_block(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nchunks) { struct starpu_csr_interface *csr_father = (struct starpu_csr_interface *) father_interface; struct starpu_csr_interface *csr_child = (struct starpu_csr_interface *) child_interface; uint32_t nrow = csr_father->nrow; size_t elemsize = csr_father->elemsize; uint32_t firstentry = csr_father->firstentry; uint32_t chunk_size = (nrow + nchunks - 1)/nchunks; uint32_t *rowptr = csr_father->rowptr; uint32_t first_index = id*chunk_size - firstentry; uint32_t local_firstentry = rowptr[first_index]; uint32_t child_nrow = STARPU_MIN(chunk_size, nrow - id*chunk_size); /* TODO: the formula for the chunk size is probably wrong: we should * probably do this instead, and write a test. _starpu_filter_nparts_compute_chunk_size_and_offset(nrow, nparts, elemsize, id, 1, &chunk_size, NULL); */ uint32_t local_nnz = rowptr[first_index + child_nrow] - rowptr[first_index]; STARPU_ASSERT_MSG(csr_father->id == STARPU_CSR_INTERFACE_ID, "%s can only be applied on a csr data", __func__); csr_child->id = csr_father->id; csr_child->nnz = local_nnz; csr_child->nrow = child_nrow; csr_child->firstentry = local_firstentry; csr_child->elemsize = elemsize; if (csr_father->nzval) { csr_child->rowptr = &csr_father->rowptr[first_index]; csr_child->colind = &csr_father->colind[local_firstentry]; csr_child->nzval = csr_father->nzval + local_firstentry * elemsize; } } starpu-1.2.3+dfsg/src/datawizard/interfaces/csr_interface.c000066400000000000000000000322341320135501600237710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2016 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data); static const struct starpu_data_copy_methods csr_copy_data_methods_s = { .any_to_any = copy_any_to_any, }; static void register_csr_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface); static starpu_ssize_t allocate_csr_buffer_on_node(void *data_interface_, unsigned dst_node); static void free_csr_buffer_on_node(void *data_interface, unsigned node); static size_t csr_interface_get_size(starpu_data_handle_t handle); static int csr_compare(void *data_interface_a, void *data_interface_b); static uint32_t footprint_csr_interface_crc32(starpu_data_handle_t handle); static starpu_ssize_t describe(void *data_interface, char *buf, size_t size); static int pack_data(starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count); static int unpack_data(starpu_data_handle_t handle, unsigned node, void *ptr, size_t count); struct starpu_data_interface_ops starpu_interface_csr_ops = { .register_data_handle = register_csr_handle, .allocate_data_on_node = allocate_csr_buffer_on_node, .free_data_on_node = free_csr_buffer_on_node, .copy_methods = &csr_copy_data_methods_s, .get_size = csr_interface_get_size, .interfaceid = STARPU_CSR_INTERFACE_ID, .interface_size = sizeof(struct starpu_csr_interface), .footprint = footprint_csr_interface_crc32, .compare = csr_compare, .describe = describe, .name = "STARPU_CSR_INTERFACE", .pack_data = pack_data, .unpack_data = unpack_data }; static void register_csr_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface) { struct starpu_csr_interface *csr_interface = (struct starpu_csr_interface *) data_interface; unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct starpu_csr_interface *local_interface = (struct starpu_csr_interface *) starpu_data_get_interface_on_node(handle, node); if (node == home_node) { local_interface->nzval = csr_interface->nzval; local_interface->colind = csr_interface->colind; } else { local_interface->nzval = 0; local_interface->colind = NULL; } local_interface->id = csr_interface->id; local_interface->rowptr = csr_interface->rowptr; local_interface->nnz = csr_interface->nnz; local_interface->nrow = csr_interface->nrow; local_interface->firstentry = csr_interface->firstentry; local_interface->elemsize = csr_interface->elemsize; } } /* declare a new data with the BLAS interface */ void starpu_csr_data_register(starpu_data_handle_t *handleptr, int home_node, uint32_t nnz, uint32_t nrow, uintptr_t nzval, uint32_t *colind, uint32_t *rowptr, uint32_t firstentry, size_t elemsize) { struct starpu_csr_interface csr_interface = { .id = STARPU_CSR_INTERFACE_ID, .nnz = nnz, .nrow = nrow, .nzval = nzval, .colind = colind, .rowptr = rowptr, .firstentry = firstentry, .elemsize = elemsize }; #ifndef STARPU_SIMGRID if (home_node == STARPU_MAIN_RAM) { STARPU_ASSERT_ACCESSIBLE(nzval); STARPU_ASSERT_ACCESSIBLE(nzval + nnz*elemsize - 1); STARPU_ASSERT_ACCESSIBLE(colind); STARPU_ASSERT_ACCESSIBLE((uintptr_t) colind + nnz*sizeof(uint32_t) - 1); STARPU_ASSERT_ACCESSIBLE(rowptr); STARPU_ASSERT_ACCESSIBLE((uintptr_t) rowptr + (nrow+1)*sizeof(uint32_t) - 1); } #endif starpu_data_register(handleptr, home_node, &csr_interface, &starpu_interface_csr_ops); } static uint32_t footprint_csr_interface_crc32(starpu_data_handle_t handle) { return starpu_hash_crc32c_be(starpu_csr_get_nnz(handle), 0); } static int csr_compare(void *data_interface_a, void *data_interface_b) { struct starpu_csr_interface *csr_a = (struct starpu_csr_interface *) data_interface_a; struct starpu_csr_interface *csr_b = (struct starpu_csr_interface *) data_interface_b; /* Two matricess are considered compatible if they have the same size */ return (csr_a->nnz == csr_b->nnz) && (csr_a->nrow == csr_b->nrow) && (csr_a->elemsize == csr_b->elemsize); } /* offer an access to the data parameters */ uint32_t starpu_csr_get_nnz(starpu_data_handle_t handle) { struct starpu_csr_interface *csr_interface = (struct starpu_csr_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(csr_interface->id == STARPU_CSR_INTERFACE_ID, "Error. The given data is not a csr."); #endif return csr_interface->nnz; } uint32_t starpu_csr_get_nrow(starpu_data_handle_t handle) { struct starpu_csr_interface *csr_interface = (struct starpu_csr_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(csr_interface->id == STARPU_CSR_INTERFACE_ID, "Error. The given data is not a csr."); #endif return csr_interface->nrow; } uint32_t starpu_csr_get_firstentry(starpu_data_handle_t handle) { struct starpu_csr_interface *csr_interface = (struct starpu_csr_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(csr_interface->id == STARPU_CSR_INTERFACE_ID, "Error. The given data is not a csr."); #endif return csr_interface->firstentry; } size_t starpu_csr_get_elemsize(starpu_data_handle_t handle) { struct starpu_csr_interface *csr_interface = (struct starpu_csr_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(csr_interface->id == STARPU_CSR_INTERFACE_ID, "Error. The given data is not a csr."); #endif return csr_interface->elemsize; } uintptr_t starpu_csr_get_local_nzval(starpu_data_handle_t handle) { unsigned node; node = _starpu_memory_node_get_local_key(); STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_csr_interface *csr_interface = (struct starpu_csr_interface *) starpu_data_get_interface_on_node(handle, node); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(csr_interface->id == STARPU_CSR_INTERFACE_ID, "Error. The given data is not a csr."); #endif return csr_interface->nzval; } uint32_t *starpu_csr_get_local_colind(starpu_data_handle_t handle) { unsigned node; node = _starpu_memory_node_get_local_key(); STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_csr_interface *csr_interface = (struct starpu_csr_interface *) starpu_data_get_interface_on_node(handle, node); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(csr_interface->id == STARPU_CSR_INTERFACE_ID, "Error. The given data is not a csr."); #endif return csr_interface->colind; } uint32_t *starpu_csr_get_local_rowptr(starpu_data_handle_t handle) { unsigned node; node = _starpu_memory_node_get_local_key(); STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_csr_interface *csr_interface = (struct starpu_csr_interface *) starpu_data_get_interface_on_node(handle, node); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(csr_interface->id == STARPU_CSR_INTERFACE_ID, "Error. The given data is not a csr."); #endif return csr_interface->rowptr; } static size_t csr_interface_get_size(starpu_data_handle_t handle) { size_t size; uint32_t nnz = starpu_csr_get_nnz(handle); uint32_t nrow = starpu_csr_get_nrow(handle); size_t elemsize = starpu_csr_get_elemsize(handle); size = nnz*elemsize + nnz*sizeof(uint32_t) + (nrow+1)*sizeof(uint32_t); return size; } /* memory allocation/deallocation primitives for the BLAS interface */ /* returns the size of the allocated area */ static starpu_ssize_t allocate_csr_buffer_on_node(void *data_interface_, unsigned dst_node) { uintptr_t addr_nzval = 0; uint32_t *addr_colind = NULL, *addr_rowptr = NULL; starpu_ssize_t allocated_memory; /* we need the 3 arrays to be allocated */ struct starpu_csr_interface *csr_interface = (struct starpu_csr_interface *) data_interface_; uint32_t nnz = csr_interface->nnz; uint32_t nrow = csr_interface->nrow; size_t elemsize = csr_interface->elemsize; addr_nzval = starpu_malloc_on_node(dst_node, nnz*elemsize); if (!addr_nzval) goto fail_nzval; addr_colind = (uint32_t*) starpu_malloc_on_node(dst_node, nnz*sizeof(uint32_t)); if (!addr_colind) goto fail_colind; addr_rowptr = (uint32_t*) starpu_malloc_on_node(dst_node, (nrow+1)*sizeof(uint32_t)); if (!addr_rowptr) goto fail_rowptr; /* allocation succeeded */ allocated_memory = nnz*elemsize + nnz*sizeof(uint32_t) + (nrow+1)*sizeof(uint32_t); /* update the data properly in consequence */ csr_interface->nzval = addr_nzval; csr_interface->colind = addr_colind; csr_interface->rowptr = addr_rowptr; return allocated_memory; fail_rowptr: starpu_free_on_node(dst_node, (uintptr_t) addr_colind, nnz*sizeof(uint32_t)); fail_colind: starpu_free_on_node(dst_node, addr_nzval, nnz*elemsize); fail_nzval: /* allocation failed */ return -ENOMEM; } static void free_csr_buffer_on_node(void *data_interface, unsigned node) { struct starpu_csr_interface *csr_interface = (struct starpu_csr_interface *) data_interface; uint32_t nnz = csr_interface->nnz; uint32_t nrow = csr_interface->nrow; size_t elemsize = csr_interface->elemsize; starpu_free_on_node(node, csr_interface->nzval, nnz*elemsize); starpu_free_on_node(node, (uintptr_t) csr_interface->colind, nnz*sizeof(uint32_t)); starpu_free_on_node(node, (uintptr_t) csr_interface->rowptr, (nrow+1)*sizeof(uint32_t)); } /* as not all platform easily have a BLAS lib installed ... */ static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data) { struct starpu_csr_interface *src_csr = (struct starpu_csr_interface *) src_interface; struct starpu_csr_interface *dst_csr = (struct starpu_csr_interface *) dst_interface; uint32_t nnz = src_csr->nnz; uint32_t nrow = src_csr->nrow; size_t elemsize = src_csr->elemsize; int ret = 0; if (starpu_interface_copy(src_csr->nzval, 0, src_node, dst_csr->nzval, 0, dst_node, nnz*elemsize, async_data)) ret = -EAGAIN; if (starpu_interface_copy((uintptr_t)src_csr->colind, 0, src_node, (uintptr_t)dst_csr->colind, 0, dst_node, nnz*sizeof(uint32_t), async_data)) ret = -EAGAIN; if (starpu_interface_copy((uintptr_t)src_csr->rowptr, 0, src_node, (uintptr_t)dst_csr->rowptr, 0, dst_node, (nrow+1)*sizeof(uint32_t), async_data)) ret = -EAGAIN; _STARPU_TRACE_DATA_COPY(src_node, dst_node, nnz*elemsize + (nnz+nrow+1)*sizeof(uint32_t)); return ret; } static starpu_ssize_t describe(void *data_interface, char *buf, size_t size) { struct starpu_csr_interface *csr = (struct starpu_csr_interface *) data_interface; return snprintf(buf, size, "C%ux%ux%u", (unsigned) csr->nnz, (unsigned) csr->nrow, (unsigned) csr->elemsize); } static int pack_data(starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_csr_interface *csr = (struct starpu_csr_interface *) starpu_data_get_interface_on_node(handle, node); // We first pack colind *count = csr->nnz * sizeof(csr->colind[0]); // Then rowptr *count += (csr->nrow + 1) * sizeof(csr->rowptr[0]); // Then nnzval *count += csr->nnz * csr->elemsize; if (ptr != NULL) { starpu_malloc_flags(ptr, *count, 0); char *tmp = *ptr; memcpy(tmp, (void*)csr->colind, csr->nnz * sizeof(csr->colind[0])); tmp += csr->nnz * sizeof(csr->colind[0]); memcpy(tmp, (void*)csr->rowptr, (csr->nrow + 1) * sizeof(csr->rowptr[0])); tmp += (csr->nrow + 1) * sizeof(csr->rowptr[0]); memcpy(tmp, (void*)csr->nzval, csr->nnz * csr->elemsize); } return 0; } static int unpack_data(starpu_data_handle_t handle, unsigned node, void *ptr, size_t count) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_csr_interface *csr = (struct starpu_csr_interface *) starpu_data_get_interface_on_node(handle, node); STARPU_ASSERT(count == (csr->nnz * sizeof(csr->colind[0]))+((csr->nrow + 1) * sizeof(csr->rowptr[0]))+(csr->nnz * csr->elemsize)); char *tmp = ptr; memcpy((void*)csr->colind, tmp, csr->nnz * sizeof(csr->colind[0])); tmp += csr->nnz * sizeof(csr->colind[0]); memcpy((void*)csr->rowptr, tmp, (csr->nrow + 1) * sizeof(csr->rowptr[0])); tmp += (csr->nrow + 1) * sizeof(csr->rowptr[0]); memcpy((void*)csr->nzval, tmp, csr->nnz * csr->elemsize); return 0; } starpu-1.2.3+dfsg/src/datawizard/interfaces/data_interface.c000066400000000000000000000770031320135501600241160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * Copyright (C) 2014, 2016 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #ifdef STARPU_OPENMP #include #endif /* Entry in the `registered_handles' hash table. */ struct handle_entry { UT_hash_handle hh; void *pointer; starpu_data_handle_t handle; }; /* Hash table mapping host pointers to data handles. */ static int nregistered, maxnregistered; static struct handle_entry *registered_handles; static struct _starpu_spinlock registered_handles_lock; static int _data_interface_number = STARPU_MAX_INTERFACE_ID; starpu_arbiter_t _starpu_global_arbiter; static void _starpu_data_unregister(starpu_data_handle_t handle, unsigned coherent, unsigned nowait); void _starpu_data_interface_init(void) { _starpu_spin_init(®istered_handles_lock); /* Just for testing purpose */ if (starpu_get_env_number_default("STARPU_GLOBAL_ARBITER", 0) > 0) _starpu_global_arbiter = starpu_arbiter_create(); } void _starpu_data_interface_shutdown() { struct handle_entry *entry, *tmp; if (registered_handles) { _STARPU_DISP("[warning] The application has not unregistered all data handles.\n"); } _starpu_spin_destroy(®istered_handles_lock); HASH_ITER(hh, registered_handles, entry, tmp) { HASH_DEL(registered_handles, entry); nregistered--; free(entry); } if (starpu_get_env_number_default("STARPU_MAX_MEMORY_USE", 0)) _STARPU_DISP("Memory used for %d data handles: %lu MiB\n", maxnregistered, (unsigned long) (maxnregistered * sizeof(struct _starpu_data_state)) >> 20); STARPU_ASSERT(nregistered == 0); registered_handles = NULL; } #ifdef STARPU_OPENMP void _starpu_omp_unregister_region_handles(struct starpu_omp_region *region) { _starpu_spin_lock(®ion->registered_handles_lock); struct handle_entry *entry, *tmp; HASH_ITER(hh, (region->registered_handles), entry, tmp) { entry->handle->removed_from_context_hash = 1; HASH_DEL(region->registered_handles, entry); starpu_data_unregister(entry->handle); free(entry); } _starpu_spin_unlock(®ion->registered_handles_lock); } void _starpu_omp_unregister_task_handles(struct starpu_omp_task *task) { struct handle_entry *entry, *tmp; HASH_ITER(hh, task->registered_handles, entry, tmp) { entry->handle->removed_from_context_hash = 1; HASH_DEL(task->registered_handles, entry); starpu_data_unregister(entry->handle); free(entry); } } #endif struct starpu_data_interface_ops *_starpu_data_interface_get_ops(unsigned interface_id) { switch (interface_id) { case STARPU_MATRIX_INTERFACE_ID: return &starpu_interface_matrix_ops; case STARPU_BLOCK_INTERFACE_ID: return &starpu_interface_block_ops; case STARPU_VECTOR_INTERFACE_ID: return &starpu_interface_vector_ops; case STARPU_CSR_INTERFACE_ID: return &starpu_interface_csr_ops; case STARPU_BCSR_INTERFACE_ID: return &starpu_interface_bcsr_ops; case STARPU_VARIABLE_INTERFACE_ID: return &starpu_interface_variable_ops; case STARPU_VOID_INTERFACE_ID: return &starpu_interface_void_ops; case STARPU_MULTIFORMAT_INTERFACE_ID: return &starpu_interface_multiformat_ops; default: STARPU_ABORT(); return NULL; } } /* Register the mapping from PTR to HANDLE. If PTR is already mapped to * some handle, the new mapping shadows the previous one. */ void _starpu_data_register_ram_pointer(starpu_data_handle_t handle, void *ptr) { struct handle_entry *entry; _STARPU_MALLOC(entry, sizeof(*entry)); entry->pointer = ptr; entry->handle = handle; #ifdef STARPU_OPENMP struct starpu_omp_task *task = _starpu_omp_get_task(); if (task) { if (task->is_implicit) { struct starpu_omp_region *parallel_region = task->owner_region; _starpu_spin_lock(¶llel_region->registered_handles_lock); HASH_ADD_PTR(parallel_region->registered_handles, pointer, entry); _starpu_spin_unlock(¶llel_region->registered_handles_lock); } else { HASH_ADD_PTR(task->registered_handles, pointer, entry); } } else #endif { struct handle_entry *old_entry; _starpu_spin_lock(®istered_handles_lock); HASH_FIND_PTR(registered_handles, &ptr, old_entry); if (old_entry) { /* Already registered this pointer, avoid undefined * behavior of duplicate in hash table */ _starpu_spin_unlock(®istered_handles_lock); free(entry); } else { nregistered++; if (nregistered > maxnregistered) maxnregistered = nregistered; HASH_ADD_PTR(registered_handles, pointer, entry); _starpu_spin_unlock(®istered_handles_lock); } } } starpu_data_handle_t starpu_data_lookup(const void *ptr) { starpu_data_handle_t result; #ifdef STARPU_OPENMP struct starpu_omp_task *task = _starpu_omp_get_task(); if (task) { if (task->is_implicit) { struct starpu_omp_region *parallel_region = task->owner_region; _starpu_spin_lock(¶llel_region->registered_handles_lock); { struct handle_entry *entry; HASH_FIND_PTR(parallel_region->registered_handles, &ptr, entry); if(STARPU_UNLIKELY(entry == NULL)) result = NULL; else result = entry->handle; } _starpu_spin_unlock(¶llel_region->registered_handles_lock); } else { struct handle_entry *entry; HASH_FIND_PTR(task->registered_handles, &ptr, entry); if(STARPU_UNLIKELY(entry == NULL)) result = NULL; else result = entry->handle; } } else #endif { _starpu_spin_lock(®istered_handles_lock); { struct handle_entry *entry; HASH_FIND_PTR(registered_handles, &ptr, entry); if(STARPU_UNLIKELY(entry == NULL)) result = NULL; else result = entry->handle; } _starpu_spin_unlock(®istered_handles_lock); } return result; } /* * Start monitoring a piece of data */ static void _starpu_register_new_data(starpu_data_handle_t handle, int home_node, uint32_t wt_mask) { void *ptr; STARPU_ASSERT(handle); /* initialize the new lock */ _starpu_data_requester_list_init(&handle->req_list); handle->refcnt = 0; handle->unlocking_reqs = 0; handle->busy_count = 0; handle->busy_waiting = 0; STARPU_PTHREAD_MUTEX_INIT(&handle->busy_mutex, NULL); STARPU_PTHREAD_COND_INIT(&handle->busy_cond, NULL); _starpu_spin_init(&handle->header_lock); /* first take care to properly lock the data */ _starpu_spin_lock(&handle->header_lock); /* there is no hierarchy yet */ handle->nchildren = 0; handle->nplans = 0; handle->switch_cl = NULL; handle->partitioned = 0; handle->readonly = 0; handle->root_handle = handle; handle->father_handle = NULL; handle->sibling_index = 0; /* could be anything for the root */ handle->depth = 1; /* the tree is just a node yet */ handle->mpi_data = NULL; /* invalid until set */ handle->is_not_important = 0; handle->sequential_consistency = starpu_data_get_default_sequential_consistency_flag(); handle->initialized = home_node != -1; STARPU_PTHREAD_MUTEX_INIT(&handle->sequential_consistency_mutex, NULL); handle->last_submitted_mode = STARPU_R; handle->last_sync_task = NULL; handle->last_submitted_accessors.task = NULL; handle->last_submitted_accessors.next = &handle->last_submitted_accessors; handle->last_submitted_accessors.prev = &handle->last_submitted_accessors; handle->post_sync_tasks = NULL; /* Tell helgrind that the race in _starpu_unlock_post_sync_tasks is fine */ STARPU_HG_DISABLE_CHECKING(handle->post_sync_tasks_cnt); handle->post_sync_tasks_cnt = 0; /* By default, there are no methods available to perform a reduction */ handle->redux_cl = NULL; handle->init_cl = NULL; handle->reduction_refcnt = 0; _starpu_data_requester_list_init(&handle->reduction_req_list); handle->reduction_tmp_handles = NULL; handle->write_invalidation_req = NULL; #ifdef STARPU_USE_FXT handle->last_submitted_ghost_sync_id_is_valid = 0; handle->last_submitted_ghost_sync_id = 0; handle->last_submitted_ghost_accessors_id = NULL; #endif handle->wt_mask = wt_mask; /* Store some values directly in the handle not to recompute them all * the time. */ handle->footprint = _starpu_compute_data_footprint(handle); handle->home_node = home_node; if (_starpu_global_arbiter) /* Just for testing purpose */ starpu_data_assign_arbiter(handle, _starpu_global_arbiter); else handle->arbiter = NULL; _starpu_data_requester_list_init(&handle->arbitered_req_list); handle->last_locality = -1; /* that new data is invalid from all nodes perpective except for the * home node */ unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct _starpu_data_replicate *replicate; replicate = &handle->per_node[node]; replicate->memory_node = node; replicate->relaxed_coherency = 0; replicate->refcnt = 0; if ((int) node == home_node) { /* this is the home node with the only valid copy */ replicate->state = STARPU_OWNER; replicate->allocated = 1; replicate->automatically_allocated = 0; replicate->initialized = 1; } else { /* the value is not available here yet */ replicate->state = STARPU_INVALID; replicate->allocated = 0; replicate->initialized = 0; } } handle->per_worker = NULL; handle->user_data = NULL; /* now the data is available ! */ _starpu_spin_unlock(&handle->header_lock); ptr = starpu_data_handle_to_pointer(handle, STARPU_MAIN_RAM); if (ptr != NULL) { _starpu_data_register_ram_pointer(handle, ptr); } } void _starpu_data_initialize_per_worker(starpu_data_handle_t handle) { unsigned worker; unsigned nworkers = starpu_worker_get_count(); _starpu_spin_checklocked(&handle->header_lock); _STARPU_CALLOC(handle->per_worker, nworkers, sizeof(*handle->per_worker)); size_t interfacesize = handle->ops->interface_size; for (worker = 0; worker < nworkers; worker++) { struct _starpu_data_replicate *replicate; unsigned node; replicate = &handle->per_worker[worker]; replicate->allocated = 0; replicate->automatically_allocated = 0; replicate->state = STARPU_INVALID; replicate->refcnt = 0; replicate->handle = handle; replicate->requested = 0; for (node = 0; node < STARPU_MAXNODES; node++) { replicate->request[node] = NULL; } /* Assuming being used for SCRATCH for now, patched when entering REDUX mode */ replicate->relaxed_coherency = 1; replicate->initialized = 0; replicate->memory_node = starpu_worker_get_memory_node(worker); _STARPU_CALLOC(replicate->data_interface, 1, interfacesize); /* duplicate the content of the interface on node 0 */ memcpy(replicate->data_interface, handle->per_node[STARPU_MAIN_RAM].data_interface, interfacesize); } } void starpu_data_ptr_register(starpu_data_handle_t handle, unsigned node) { struct _starpu_data_replicate *replicate = &handle->per_node[node]; _starpu_spin_lock(&handle->header_lock); STARPU_ASSERT_MSG(replicate->allocated == 0, "starpu_data_ptr_register must be called right after starpu_data_register"); replicate->allocated = 1; replicate->automatically_allocated = 0; _starpu_spin_unlock(&handle->header_lock); } int _starpu_data_handle_init(starpu_data_handle_t handle, struct starpu_data_interface_ops *interface_ops, unsigned int mf_node) { unsigned node; /* Tell helgrind that our access to busy_count in * starpu_data_unregister is actually safe */ STARPU_HG_DISABLE_CHECKING(handle->busy_count); handle->magic = 42; handle->ops = interface_ops; handle->mf_node = mf_node; handle->mpi_data = NULL; size_t interfacesize = interface_ops->interface_size; _starpu_memory_stats_init(handle); for (node = 0; node < STARPU_MAXNODES; node++) { _starpu_memory_stats_init_per_node(handle, node); struct _starpu_data_replicate *replicate; replicate = &handle->per_node[node]; /* relaxed_coherency = 0 */ replicate->handle = handle; _STARPU_CALLOC(replicate->data_interface, 1, interfacesize); } return 0; } static starpu_data_handle_t _starpu_data_handle_allocate(struct starpu_data_interface_ops *interface_ops, unsigned int mf_node) { starpu_data_handle_t handle; _STARPU_CALLOC(handle, 1, sizeof(struct _starpu_data_state)); _starpu_data_handle_init(handle, interface_ops, mf_node); return handle; } void starpu_data_register(starpu_data_handle_t *handleptr, int home_node, void *data_interface, struct starpu_data_interface_ops *ops) { starpu_data_handle_t handle = _starpu_data_handle_allocate(ops, home_node); STARPU_ASSERT(handleptr); *handleptr = handle; /* fill the interface fields with the appropriate method */ STARPU_ASSERT(ops->register_data_handle); ops->register_data_handle(handle, home_node, data_interface); _starpu_register_new_data(handle, home_node, 0); _STARPU_TRACE_HANDLE_DATA_REGISTER(handle); } void starpu_data_register_same(starpu_data_handle_t *handledst, starpu_data_handle_t handlesrc) { void *local_interface = starpu_data_get_interface_on_node(handlesrc, STARPU_MAIN_RAM); starpu_data_register(handledst, -1, local_interface, handlesrc->ops); } void *starpu_data_handle_to_pointer(starpu_data_handle_t handle, unsigned node) { /* Check whether the operation is supported and the node has actually * been allocated. */ if (handle->ops->handle_to_pointer && starpu_data_test_if_allocated_on_node(handle, node)) { return handle->ops->handle_to_pointer(handle, node); } return NULL; } void *starpu_data_get_local_ptr(starpu_data_handle_t handle) { return starpu_data_handle_to_pointer(handle, _starpu_memory_node_get_local_key()); } struct starpu_data_interface_ops* starpu_data_get_interface_ops(starpu_data_handle_t handle) { return handle->ops; } /* * Stop monitoring a piece of data */ void _starpu_data_unregister_ram_pointer(starpu_data_handle_t handle) { const void *ram_ptr = starpu_data_handle_to_pointer(handle, STARPU_MAIN_RAM); #ifdef STARPU_OPENMP if (handle->removed_from_context_hash) return; #endif if (ram_ptr != NULL) { /* Remove the PTR -> HANDLE mapping. If a mapping from PTR * to another handle existed before (e.g., when using * filters), it becomes visible again. */ struct handle_entry *entry; #ifdef STARPU_OPENMP struct starpu_omp_task *task = _starpu_omp_get_task(); if (task) { if (task->is_implicit) { struct starpu_omp_region *parallel_region = task->owner_region; _starpu_spin_lock(¶llel_region->registered_handles_lock); HASH_FIND_PTR(parallel_region->registered_handles, &ram_ptr, entry); STARPU_ASSERT(entry != NULL); HASH_DEL(registered_handles, entry); _starpu_spin_unlock(¶llel_region->registered_handles_lock); } else { HASH_FIND_PTR(task->registered_handles, &ram_ptr, entry); STARPU_ASSERT(entry != NULL); HASH_DEL(task->registered_handles, entry); } } else #endif { _starpu_spin_lock(®istered_handles_lock); HASH_FIND_PTR(registered_handles, &ram_ptr, entry); if (entry) { if (entry->handle == handle) { nregistered--; HASH_DEL(registered_handles, entry); } else /* don't free it, it's not ours */ entry = NULL; } _starpu_spin_unlock(®istered_handles_lock); } free(entry); } } void _starpu_data_free_interfaces(starpu_data_handle_t handle) { unsigned node; unsigned nworkers = starpu_worker_get_count(); for (node = 0; node < STARPU_MAXNODES; node++) free(handle->per_node[node].data_interface); if (handle->per_worker) { unsigned worker; for (worker = 0; worker < nworkers; worker++) free(handle->per_worker[worker].data_interface); free(handle->per_worker); } } struct _starpu_unregister_callback_arg { unsigned memory_node; starpu_data_handle_t handle; unsigned terminated; starpu_pthread_mutex_t mutex; starpu_pthread_cond_t cond; }; /* Check whether we should tell starpu_data_unregister that the data handle is * not busy any more. * The header is supposed to be locked. * This may free the handle, if it was lazily unregistered (1 is returned in * that case). The handle pointer thus becomes invalid for the caller. * * Note: we inline some of the tests in the _starpu_data_check_not_busy macro. */ int __starpu_data_check_not_busy(starpu_data_handle_t handle) { if (STARPU_LIKELY(handle->busy_count)) return 0; /* Not busy any more, perhaps have to unregister etc. */ if (STARPU_UNLIKELY(handle->busy_waiting)) { STARPU_PTHREAD_MUTEX_LOCK(&handle->busy_mutex); STARPU_PTHREAD_COND_BROADCAST(&handle->busy_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&handle->busy_mutex); } /* The handle has been destroyed in between (eg. this was a temporary * handle created for a reduction.) */ if (STARPU_UNLIKELY(handle->lazy_unregister)) { handle->lazy_unregister = 0; _starpu_spin_unlock(&handle->header_lock); _starpu_data_unregister(handle, 0, 1); /* Warning: in case we unregister the handle, we must be sure * that the caller will not try to unlock the header after * !*/ return 1; } return 0; } static void _starpu_check_if_valid_and_fetch_data_on_node(starpu_data_handle_t handle, struct _starpu_data_replicate *replicate) { unsigned node; unsigned nnodes = starpu_memory_nodes_get_count(); int valid = 0; for (node = 0; node < nnodes; node++) { if (handle->per_node[node].state != STARPU_INVALID) { /* we found a copy ! */ valid = 1; } } if (valid) { int ret = _starpu_fetch_data_on_node(handle, handle->home_node, replicate, STARPU_R, 0, 0, 0, NULL, NULL); STARPU_ASSERT(!ret); _starpu_release_data_on_node(handle, handle->home_node, replicate); } else { _starpu_spin_lock(&handle->header_lock); if (!_starpu_notify_data_dependencies(handle)) _starpu_spin_unlock(&handle->header_lock); } } static void _starpu_data_unregister_fetch_data_callback(void *_arg) { struct _starpu_unregister_callback_arg *arg = (struct _starpu_unregister_callback_arg *) _arg; starpu_data_handle_t handle = arg->handle; STARPU_ASSERT(handle); struct _starpu_data_replicate *replicate = &handle->per_node[arg->memory_node]; _starpu_check_if_valid_and_fetch_data_on_node(handle, replicate); /* unlock the caller */ STARPU_PTHREAD_MUTEX_LOCK(&arg->mutex); arg->terminated = 1; STARPU_PTHREAD_COND_SIGNAL(&arg->cond); STARPU_PTHREAD_MUTEX_UNLOCK(&arg->mutex); } /* Unregister the data handle, perhaps we don't need to update the home_node * (in that case coherent is set to 0) * nowait is for internal use when we already know for sure that we won't have to wait. */ static void _starpu_data_unregister(starpu_data_handle_t handle, unsigned coherent, unsigned nowait) { STARPU_ASSERT(handle); STARPU_ASSERT_MSG(handle->nchildren == 0, "data %p needs to be unpartitioned before unregistration", handle); STARPU_ASSERT_MSG(handle->nplans == 0, "data %p needs its partition plans to be cleaned before unregistration", handle); STARPU_ASSERT_MSG(handle->partitioned == 0, "data %p needs its partitioned plans to be unpartitioned before unregistration", handle); /* TODO: also check that it has the latest coherency */ STARPU_ASSERT(!(nowait && handle->busy_count != 0)); int sequential_consistency = handle->sequential_consistency; if (sequential_consistency && !nowait) { STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "starpu_data_unregister must not be called from a task or callback, perhaps you can use starpu_data_unregister_submit instead"); /* If sequential consistency is enabled, wait until data is available */ _starpu_data_wait_until_available(handle, STARPU_RW, "starpu_data_unregister"); } if (coherent && !nowait) { STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "starpu_data_unregister must not be called from a task or callback, perhaps you can use starpu_data_unregister_submit instead"); /* Fetch data in the home of the data to ensure we have a valid copy * where we registered it */ int home_node = handle->home_node; if (home_node >= 0) { struct _starpu_unregister_callback_arg arg; arg.handle = handle; arg.memory_node = (unsigned)home_node; arg.terminated = 0; STARPU_PTHREAD_MUTEX_INIT(&arg.mutex, NULL); STARPU_PTHREAD_COND_INIT(&arg.cond, NULL); if (!_starpu_attempt_to_submit_data_request_from_apps(handle, STARPU_R, _starpu_data_unregister_fetch_data_callback, &arg)) { /* no one has locked this data yet, so we proceed immediately */ struct _starpu_data_replicate *home_replicate = &handle->per_node[home_node]; _starpu_check_if_valid_and_fetch_data_on_node(handle, home_replicate); } else { STARPU_PTHREAD_MUTEX_LOCK(&arg.mutex); while (!arg.terminated) STARPU_PTHREAD_COND_WAIT(&arg.cond, &arg.mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&arg.mutex); } STARPU_PTHREAD_MUTEX_DESTROY(&arg.mutex); STARPU_PTHREAD_COND_DESTROY(&arg.cond); } /* If this handle uses a multiformat interface, we may have to convert * this piece of data back into the CPU format. * XXX : This is quite hacky, could we submit a task instead ? */ if (_starpu_data_is_multiformat_handle(handle) && ( starpu_node_get_kind(handle->mf_node) != STARPU_CPU_RAM && starpu_node_get_kind(handle->mf_node) != STARPU_SCC_RAM && starpu_node_get_kind(handle->mf_node) != STARPU_SCC_SHM )) { _STARPU_DEBUG("Conversion needed\n"); void *buffers[1]; struct starpu_multiformat_interface *format_interface; format_interface = (struct starpu_multiformat_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); struct starpu_codelet *cl = NULL; enum starpu_node_kind node_kind = starpu_node_get_kind(handle->mf_node); switch (node_kind) { #ifdef STARPU_USE_CUDA case STARPU_CUDA_RAM: { struct starpu_multiformat_data_interface_ops *mf_ops; mf_ops = (struct starpu_multiformat_data_interface_ops *) handle->ops->get_mf_ops(format_interface); cl = mf_ops->cuda_to_cpu_cl; break; } #endif #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_RAM: { struct starpu_multiformat_data_interface_ops *mf_ops; mf_ops = (struct starpu_multiformat_data_interface_ops *) handle->ops->get_mf_ops(format_interface); cl = mf_ops->opencl_to_cpu_cl; break; } #endif #ifdef STARPU_USE_MIC case STARPU_MIC_RAM: { struct starpu_multiformat_data_interface_ops *mf_ops; mf_ops = (struct starpu_multiformat_data_interface_ops *) handle->ops->get_mf_ops(format_interface); cl = mf_ops->mic_to_cpu_cl; break; } #endif case STARPU_CPU_RAM: /* Impossible ! */ case STARPU_SCC_RAM: /* Impossible ! */ case STARPU_SCC_SHM: /* Impossible ! */ default: STARPU_ABORT(); } buffers[0] = format_interface; _starpu_cl_func_t func = _starpu_task_get_cpu_nth_implementation(cl, 0); STARPU_ASSERT(func); func(buffers, NULL); } } /* Prevent any further unregistration */ handle->magic = 0; _starpu_spin_lock(&handle->header_lock); if (!coherent) { /* Should we postpone the unregister operation ? */ if ((handle->busy_count > 0) && handle->lazy_unregister) { _starpu_spin_unlock(&handle->header_lock); return; } } /* Tell holders of references that we're starting waiting */ handle->busy_waiting = 1; _starpu_spin_unlock(&handle->header_lock); retry_busy: /* Wait for all requests to finish (notably WT requests) */ STARPU_PTHREAD_MUTEX_LOCK(&handle->busy_mutex); while (1) { /* Here helgrind would shout that this an unprotected access, * but this is actually fine: all threads who do busy_count-- * are supposed to call _starpu_data_check_not_busy, which will * wake us up through the busy_mutex/busy_cond. */ if (!handle->busy_count) break; /* This is woken by _starpu_data_check_not_busy, always called * after decrementing busy_count */ STARPU_PTHREAD_COND_WAIT(&handle->busy_cond, &handle->busy_mutex); } STARPU_PTHREAD_MUTEX_UNLOCK(&handle->busy_mutex); /* Wait for finished requests to release the handle */ _starpu_spin_lock(&handle->header_lock); if (handle->busy_count) { /* Bad luck: some request went in in between, wait again... */ _starpu_spin_unlock(&handle->header_lock); goto retry_busy; } size_t size = _starpu_data_get_size(handle); _starpu_data_unregister_ram_pointer(handle); /* Destroy the data now */ unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct _starpu_data_replicate *local = &handle->per_node[node]; /* free the data copy in a lazy fashion */ if (local->allocated && local->automatically_allocated) _starpu_request_mem_chunk_removal(handle, local, node, size); } if (handle->per_worker) { unsigned worker; unsigned nworkers = starpu_worker_get_count(); for (worker = 0; worker < nworkers; worker++) { struct _starpu_data_replicate *local = &handle->per_worker[worker]; /* free the data copy in a lazy fashion */ if (local->allocated && local->automatically_allocated) _starpu_request_mem_chunk_removal(handle, local, starpu_worker_get_memory_node(worker), size); } } _starpu_data_free_interfaces(handle); _starpu_memory_stats_free(handle); _starpu_spin_unlock(&handle->header_lock); _starpu_spin_destroy(&handle->header_lock); _starpu_data_clear_implicit(handle); STARPU_PTHREAD_MUTEX_DESTROY(&handle->busy_mutex); STARPU_PTHREAD_COND_DESTROY(&handle->busy_cond); STARPU_PTHREAD_MUTEX_DESTROY(&handle->sequential_consistency_mutex); STARPU_HG_ENABLE_CHECKING(handle->post_sync_tasks_cnt); STARPU_HG_ENABLE_CHECKING(handle->busy_count); if (handle->switch_cl) { free(handle->switch_cl->dyn_nodes); free(handle->switch_cl); } _STARPU_TRACE_HANDLE_DATA_UNREGISTER(handle); free(handle); } void starpu_data_unregister(starpu_data_handle_t handle) { STARPU_ASSERT_MSG(handle->magic == 42, "data %p is invalid (was it already registered?)", handle); STARPU_ASSERT_MSG(!handle->lazy_unregister, "data %p can not be unregistered twice", handle); if (handle->unregister_hook) { handle->unregister_hook(handle); } _starpu_data_unregister(handle, 1, 0); } void starpu_data_unregister_no_coherency(starpu_data_handle_t handle) { STARPU_ASSERT_MSG(handle->magic == 42, "data %p is invalid (was it already registered?)", handle); if (handle->unregister_hook) { handle->unregister_hook(handle); } _starpu_data_unregister(handle, 0, 0); } static void _starpu_data_unregister_submit_cb(void *arg) { starpu_data_handle_t handle = arg; _starpu_spin_lock(&handle->header_lock); handle->lazy_unregister = 1; /* The handle should be busy since we are working on it. * when we releases the handle below, it will be destroyed by * _starpu_data_check_not_busy */ STARPU_ASSERT(handle->busy_count); _starpu_spin_unlock(&handle->header_lock); starpu_data_release_on_node(handle, STARPU_ACQUIRE_ALL_NODES); } void starpu_data_unregister_submit(starpu_data_handle_t handle) { STARPU_ASSERT_MSG(handle->magic == 42, "data %p is invalid (was it already registered?)", handle); STARPU_ASSERT_MSG(!handle->lazy_unregister, "data %p can not be unregistered twice", handle); if (handle->unregister_hook) { handle->unregister_hook(handle); } /* Wait for all task dependencies on this handle before putting it for free */ starpu_data_acquire_on_node_cb(handle, STARPU_ACQUIRE_ALL_NODES, handle->initialized?STARPU_RW:STARPU_W, _starpu_data_unregister_submit_cb, handle); } static void _starpu_data_invalidate(void *data) { starpu_data_handle_t handle = data; size_t size = _starpu_data_get_size(handle); _starpu_spin_lock(&handle->header_lock); //_STARPU_DEBUG("Really invalidating data %p\n", data); #ifdef STARPU_DEBUG { /* There shouldn't be any pending request since we acquired the data in W mode */ unsigned i, j, nnodes = starpu_memory_nodes_get_count(); for (i = 0; i < nnodes; i++) for (j = 0; j < nnodes; j++) STARPU_ASSERT_MSG(!handle->per_node[i].request[j], "request for handle %p pending from %u to %u while invalidating data!", handle, j, i); } #endif unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct _starpu_data_replicate *local = &handle->per_node[node]; if (local->mc && local->allocated && local->automatically_allocated) { if (node == STARPU_MAIN_RAM) _starpu_data_unregister_ram_pointer(handle); /* free the data copy in a lazy fashion */ _starpu_request_mem_chunk_removal(handle, local, node, size); } if (local->state != STARPU_INVALID) _STARPU_TRACE_DATA_INVALIDATE(handle, node); local->state = STARPU_INVALID; } if (handle->per_worker) { unsigned worker; unsigned nworkers = starpu_worker_get_count(); for (worker = 0; worker < nworkers; worker++) { struct _starpu_data_replicate *local = &handle->per_worker[worker]; if (local->mc && local->allocated && local->automatically_allocated) /* free the data copy in a lazy fashion */ _starpu_request_mem_chunk_removal(handle, local, starpu_worker_get_memory_node(worker), size); local->state = STARPU_INVALID; } } _starpu_spin_unlock(&handle->header_lock); starpu_data_release_on_node(handle, STARPU_ACQUIRE_ALL_NODES); } void starpu_data_invalidate(starpu_data_handle_t handle) { STARPU_ASSERT(handle); starpu_data_acquire_on_node(handle, STARPU_ACQUIRE_ALL_NODES, STARPU_W); _starpu_data_invalidate(handle); handle->initialized = 0; } void starpu_data_invalidate_submit(starpu_data_handle_t handle) { STARPU_ASSERT(handle); starpu_data_acquire_on_node_cb(handle, STARPU_ACQUIRE_ALL_NODES, STARPU_W, _starpu_data_invalidate, handle); handle->initialized = 0; } enum starpu_data_interface_id starpu_data_get_interface_id(starpu_data_handle_t handle) { return handle->ops->interfaceid; } void *starpu_data_get_interface_on_node(starpu_data_handle_t handle, unsigned memory_node) { return handle->per_node[memory_node].data_interface; } int starpu_data_interface_get_next_id(void) { _data_interface_number += 1; return _data_interface_number-1; } int starpu_data_pack(starpu_data_handle_t handle, void **ptr, starpu_ssize_t *count) { STARPU_ASSERT_MSG(handle->ops->pack_data, "The datatype interface %s (%d) does not have a pack operation", handle->ops->name, handle->ops->interfaceid); return handle->ops->pack_data(handle, _starpu_memory_node_get_local_key(), ptr, count); } int starpu_data_unpack(starpu_data_handle_t handle, void *ptr, size_t count) { STARPU_ASSERT_MSG(handle->ops->unpack_data, "The datatype interface %s (%d) does not have an unpack operation", handle->ops->name, handle->ops->interfaceid); int ret; ret = handle->ops->unpack_data(handle, _starpu_memory_node_get_local_key(), ptr, count); starpu_free_flags(ptr, count, 0); return ret; } size_t starpu_data_get_size(starpu_data_handle_t handle) { return handle->ops->get_size(handle); } void starpu_data_set_name(starpu_data_handle_t handle, const char *name) { _STARPU_TRACE_DATA_NAME(handle, name); } void starpu_data_set_coordinates_array(starpu_data_handle_t handle, int dimensions, int dims[]) { _STARPU_TRACE_DATA_COORDINATES(handle, dimensions, dims); } void starpu_data_set_coordinates(starpu_data_handle_t handle, unsigned dimensions, ...) { int dims[dimensions]; unsigned i; va_list varg_list; va_start(varg_list, dimensions); for (i = 0; i < dimensions; i++) dims[i] = va_arg(varg_list, int); va_end(varg_list); starpu_data_set_coordinates_array(handle, dimensions, dims); } starpu-1.2.3+dfsg/src/datawizard/interfaces/data_interface.h000066400000000000000000000066651320135501600241310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012, 2014-2016 Université de Bordeaux * Copyright (C) 2010, 2012, 2013, 2014, 2015 CNRS * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DATA_INTERFACE_H__ #define __DATA_INTERFACE_H__ #include #include #include #ifdef STARPU_OPENMP #include #endif /* Generic type representing an interface, for now it's only used before * execution on message-passing devices but it can be useful in other cases. */ union _starpu_interface { struct starpu_matrix_interface matrix; struct starpu_block_interface block; struct starpu_vector_interface vector; struct starpu_csr_interface csr; struct starpu_coo_interface coo; struct starpu_bcsr_interface bcsr; struct starpu_variable_interface variable; struct starpu_multiformat_interface multiformat; }; /* Some data interfaces or filters use this interface internally */ extern struct starpu_data_interface_ops starpu_interface_matrix_ops; extern struct starpu_data_interface_ops starpu_interface_block_ops; extern struct starpu_data_interface_ops starpu_interface_vector_ops; extern struct starpu_data_interface_ops starpu_interface_csr_ops; extern struct starpu_data_interface_ops starpu_interface_bcsr_ops; extern struct starpu_data_interface_ops starpu_interface_variable_ops; extern struct starpu_data_interface_ops starpu_interface_void_ops; extern struct starpu_data_interface_ops starpu_interface_multiformat_ops; void _starpu_data_free_interfaces(starpu_data_handle_t handle) STARPU_ATTRIBUTE_INTERNAL; extern int _starpu_data_handle_init(starpu_data_handle_t handle, struct starpu_data_interface_ops *interface_ops, unsigned int mf_node); void _starpu_data_initialize_per_worker(starpu_data_handle_t handle); extern struct starpu_arbiter *_starpu_global_arbiter; extern void _starpu_data_interface_init(void) STARPU_ATTRIBUTE_INTERNAL; extern int __starpu_data_check_not_busy(starpu_data_handle_t handle) STARPU_ATTRIBUTE_INTERNAL STARPU_ATTRIBUTE_WARN_UNUSED_RESULT; #define _starpu_data_check_not_busy(handle) \ (STARPU_UNLIKELY(!handle->busy_count && \ (handle->busy_waiting || handle->lazy_unregister)) ? \ __starpu_data_check_not_busy(handle) : 0) extern void _starpu_data_interface_shutdown(void) STARPU_ATTRIBUTE_INTERNAL; #ifdef STARPU_OPENMP void _starpu_omp_unregister_region_handles(struct starpu_omp_region *region); void _starpu_omp_unregister_task_handles(struct starpu_omp_task *task); #endif struct starpu_data_interface_ops *_starpu_data_interface_get_ops(unsigned interface_id); extern void _starpu_data_register_ram_pointer(starpu_data_handle_t handle, void *ptr) STARPU_ATTRIBUTE_INTERNAL; extern void _starpu_data_unregister_ram_pointer(starpu_data_handle_t handle) STARPU_ATTRIBUTE_INTERNAL; #define _starpu_data_is_multiformat_handle(handle) handle->ops->is_multiformat #endif // __DATA_INTERFACE_H__ starpu-1.2.3+dfsg/src/datawizard/interfaces/matrix_filters.c000066400000000000000000000146361320135501600242240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013, 2016 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include /* * an example of a dummy partition function : blocks ... */ void starpu_matrix_filter_block(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nchunks) { struct starpu_matrix_interface *matrix_father = (struct starpu_matrix_interface *) father_interface; struct starpu_matrix_interface *matrix_child = (struct starpu_matrix_interface *) child_interface; uint32_t nx = matrix_father->nx; uint32_t ny = matrix_father->ny; size_t elemsize = matrix_father->elemsize; STARPU_ASSERT_MSG(nchunks <= nx, "%u parts for %u elements", nchunks, nx); uint32_t child_nx; size_t offset; _starpu_filter_nparts_compute_chunk_size_and_offset(nx, nchunks, elemsize, id, 1, &child_nx, &offset); STARPU_ASSERT_MSG(matrix_father->id == STARPU_MATRIX_INTERFACE_ID, "%s can only be applied on a matrix data", __func__); /* update the child's interface */ matrix_child->id = matrix_father->id; matrix_child->nx = child_nx; matrix_child->ny = ny; matrix_child->elemsize = elemsize; /* is the information on this node valid ? */ if (matrix_father->dev_handle) { if (matrix_father->ptr) matrix_child->ptr = matrix_father->ptr + offset; matrix_child->ld = matrix_father->ld; matrix_child->dev_handle = matrix_father->dev_handle; matrix_child->offset = matrix_father->offset + offset; } } /* * an example of a dummy partition function : blocks ... */ void starpu_matrix_filter_block_shadow(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nchunks) { struct starpu_matrix_interface *matrix_father = (struct starpu_matrix_interface *) father_interface; struct starpu_matrix_interface *matrix_child = (struct starpu_matrix_interface *) child_interface; uintptr_t shadow_size = (uintptr_t) f->filter_arg_ptr; /* actual number of elements */ uint32_t nx = matrix_father->nx - 2 * shadow_size; uint32_t ny = matrix_father->ny; size_t elemsize = matrix_father->elemsize; STARPU_ASSERT_MSG(nchunks <= nx, "%u parts for %u elements", nchunks, nx); uint32_t child_nx; size_t offset; _starpu_filter_nparts_compute_chunk_size_and_offset(nx, nchunks, elemsize, id, 1, &child_nx, &offset); child_nx += 2 * shadow_size; STARPU_ASSERT_MSG(matrix_father->id == STARPU_MATRIX_INTERFACE_ID, "%s can only be applied on a matrix data", __func__); /* update the child's interface */ matrix_child->id = matrix_father->id; matrix_child->nx = child_nx; matrix_child->ny = ny; matrix_child->elemsize = elemsize; /* is the information on this node valid ? */ if (matrix_father->dev_handle) { if (matrix_father->ptr) matrix_child->ptr = matrix_father->ptr + offset; matrix_child->ld = matrix_father->ld; matrix_child->dev_handle = matrix_father->dev_handle; matrix_child->offset = matrix_father->offset + offset; } } void starpu_matrix_filter_vertical_block(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nchunks) { struct starpu_matrix_interface *matrix_father = (struct starpu_matrix_interface *) father_interface; struct starpu_matrix_interface *matrix_child = (struct starpu_matrix_interface *) child_interface; uint32_t nx = matrix_father->nx; uint32_t ny = matrix_father->ny; size_t elemsize = matrix_father->elemsize; STARPU_ASSERT_MSG(nchunks <= ny, "%u parts for %u elements", nchunks, ny); uint32_t child_ny; size_t offset; _starpu_filter_nparts_compute_chunk_size_and_offset(ny, nchunks, elemsize, id, matrix_father->ld, &child_ny, &offset); STARPU_ASSERT_MSG(matrix_father->id == STARPU_MATRIX_INTERFACE_ID, "%s can only be applied on a matrix data", __func__); matrix_child->id = matrix_father->id; matrix_child->nx = nx; matrix_child->ny = child_ny; matrix_child->elemsize = elemsize; /* is the information on this node valid ? */ if (matrix_father->dev_handle) { if (matrix_father->ptr) matrix_child->ptr = matrix_father->ptr + offset; matrix_child->ld = matrix_father->ld; matrix_child->dev_handle = matrix_father->dev_handle; matrix_child->offset = matrix_father->offset + offset; } } void starpu_matrix_filter_vertical_block_shadow(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nchunks) { struct starpu_matrix_interface *matrix_father = (struct starpu_matrix_interface *) father_interface; struct starpu_matrix_interface *matrix_child = (struct starpu_matrix_interface *) child_interface; uintptr_t shadow_size = (uintptr_t) f->filter_arg_ptr; uint32_t nx = matrix_father->nx; /* actual number of elements */ uint32_t ny = matrix_father->ny - 2 * shadow_size; size_t elemsize = matrix_father->elemsize; STARPU_ASSERT_MSG(nchunks <= ny, "%u parts for %u elements", nchunks, ny); uint32_t child_ny; size_t offset; _starpu_filter_nparts_compute_chunk_size_and_offset(ny, nchunks, elemsize, id, matrix_father->ld, &child_ny, &offset); child_ny += 2 * shadow_size; STARPU_ASSERT_MSG(matrix_father->id == STARPU_MATRIX_INTERFACE_ID, "%s can only be applied on a matrix data", __func__); matrix_child->id = matrix_father->id; matrix_child->nx = nx; matrix_child->ny = child_ny; matrix_child->elemsize = elemsize; /* is the information on this node valid ? */ if (matrix_father->dev_handle) { if (matrix_father->ptr) matrix_child->ptr = matrix_father->ptr + offset; matrix_child->ld = matrix_father->ld; matrix_child->dev_handle = matrix_father->dev_handle; matrix_child->offset = matrix_father->offset + offset; } } starpu-1.2.3+dfsg/src/datawizard/interfaces/matrix_interface.c000066400000000000000000000570711320135501600245140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include #ifdef STARPU_USE_CUDA /* At least CUDA 4.2 still didn't have working memcpy3D */ #if CUDART_VERSION < 5000 #define BUGGED_MEMCPY3D #endif static int copy_ram_to_cuda(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); static int copy_cuda_to_ram(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); static int copy_cuda_to_cuda(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); static int copy_ram_to_cuda_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cudaStream_t stream); static int copy_cuda_to_ram_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cudaStream_t stream); #ifndef BUGGED_MEMCPY3D static int copy_cuda_to_cuda_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cudaStream_t stream); #endif #endif #ifdef STARPU_USE_OPENCL static int copy_ram_to_opencl(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); static int copy_opencl_to_ram(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); static int copy_opencl_to_opencl(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); static int copy_ram_to_opencl_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cl_event *event); static int copy_opencl_to_ram_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cl_event *event); static int copy_opencl_to_opencl_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cl_event *event); #endif static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data); static const struct starpu_data_copy_methods matrix_copy_data_methods_s = { #ifdef STARPU_USE_CUDA .ram_to_cuda = copy_ram_to_cuda, .cuda_to_ram = copy_cuda_to_ram, .ram_to_cuda_async = copy_ram_to_cuda_async, .cuda_to_ram_async = copy_cuda_to_ram_async, .cuda_to_cuda = copy_cuda_to_cuda, #ifndef BUGGED_MEMCPY3D .cuda_to_cuda_async = copy_cuda_to_cuda_async, #endif #else #ifdef STARPU_SIMGRID #ifndef BUGGED_MEMCPY3D /* Enable GPU-GPU transfers in simgrid */ .cuda_to_cuda_async = (void *)1, #endif #endif #endif #ifdef STARPU_USE_OPENCL .ram_to_opencl = copy_ram_to_opencl, .opencl_to_ram = copy_opencl_to_ram, .opencl_to_opencl = copy_opencl_to_opencl, .ram_to_opencl_async = copy_ram_to_opencl_async, .opencl_to_ram_async = copy_opencl_to_ram_async, .opencl_to_opencl_async = copy_opencl_to_opencl_async, #endif .any_to_any = copy_any_to_any, }; static void register_matrix_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface); static void *matrix_handle_to_pointer(starpu_data_handle_t data_handle, unsigned node); static starpu_ssize_t allocate_matrix_buffer_on_node(void *data_interface_, unsigned dst_node); static void free_matrix_buffer_on_node(void *data_interface, unsigned node); static size_t matrix_interface_get_size(starpu_data_handle_t handle); static uint32_t footprint_matrix_interface_crc32(starpu_data_handle_t handle); static int matrix_compare(void *data_interface_a, void *data_interface_b); static void display_matrix_interface(starpu_data_handle_t handle, FILE *f); static int pack_matrix_handle(starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count); static int unpack_matrix_handle(starpu_data_handle_t handle, unsigned node, void *ptr, size_t count); static starpu_ssize_t describe(void *data_interface, char *buf, size_t size); struct starpu_data_interface_ops starpu_interface_matrix_ops = { .register_data_handle = register_matrix_handle, .allocate_data_on_node = allocate_matrix_buffer_on_node, .handle_to_pointer = matrix_handle_to_pointer, .free_data_on_node = free_matrix_buffer_on_node, .copy_methods = &matrix_copy_data_methods_s, .get_size = matrix_interface_get_size, .footprint = footprint_matrix_interface_crc32, .compare = matrix_compare, .interfaceid = STARPU_MATRIX_INTERFACE_ID, .interface_size = sizeof(struct starpu_matrix_interface), .display = display_matrix_interface, .pack_data = pack_matrix_handle, .unpack_data = unpack_matrix_handle, .describe = describe, .name = "STARPU_MATRIX_INTERFACE" }; static void register_matrix_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface) { struct starpu_matrix_interface *matrix_interface = (struct starpu_matrix_interface *) data_interface; unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct starpu_matrix_interface *local_interface = (struct starpu_matrix_interface *) starpu_data_get_interface_on_node(handle, node); if (node == home_node) { local_interface->ptr = matrix_interface->ptr; local_interface->dev_handle = matrix_interface->dev_handle; local_interface->offset = matrix_interface->offset; local_interface->ld = matrix_interface->ld; } else { local_interface->ptr = 0; local_interface->dev_handle = 0; local_interface->offset = 0; local_interface->ld = 0; } local_interface->id = matrix_interface->id; local_interface->nx = matrix_interface->nx; local_interface->ny = matrix_interface->ny; local_interface->elemsize = matrix_interface->elemsize; } } static void *matrix_handle_to_pointer(starpu_data_handle_t handle, unsigned node) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_matrix_interface *matrix_interface = (struct starpu_matrix_interface *) starpu_data_get_interface_on_node(handle, node); return (void*) matrix_interface->ptr; } /* declare a new data with the matrix interface */ void starpu_matrix_data_register(starpu_data_handle_t *handleptr, int home_node, uintptr_t ptr, uint32_t ld, uint32_t nx, uint32_t ny, size_t elemsize) { struct starpu_matrix_interface matrix_interface = { .id = STARPU_MATRIX_INTERFACE_ID, .ptr = ptr, .ld = ld, .nx = nx, .ny = ny, .elemsize = elemsize, .dev_handle = ptr, .offset = 0 }; #ifndef STARPU_SIMGRID if (home_node == STARPU_MAIN_RAM) { STARPU_ASSERT_ACCESSIBLE(ptr); STARPU_ASSERT_ACCESSIBLE(ptr + (ny-1)*ld*elemsize + nx*elemsize - 1); } #endif #ifdef STARPU_USE_SCC _starpu_scc_set_offset_in_shared_memory((void*)matrix_interface.ptr, (void**)&(matrix_interface.dev_handle), &(matrix_interface.offset)); #endif starpu_data_register(handleptr, home_node, &matrix_interface, &starpu_interface_matrix_ops); } void starpu_matrix_ptr_register(starpu_data_handle_t handle, unsigned node, uintptr_t ptr, uintptr_t dev_handle, size_t offset, uint32_t ld) { struct starpu_matrix_interface *matrix_interface = starpu_data_get_interface_on_node(handle, node); starpu_data_ptr_register(handle, node); matrix_interface->ptr = ptr; matrix_interface->dev_handle = dev_handle; matrix_interface->offset = offset; matrix_interface->ld = ld; } static uint32_t footprint_matrix_interface_crc32(starpu_data_handle_t handle) { return starpu_hash_crc32c_be(starpu_matrix_get_nx(handle), starpu_matrix_get_ny(handle)); } static int matrix_compare(void *data_interface_a, void *data_interface_b) { struct starpu_matrix_interface *matrix_a = (struct starpu_matrix_interface *) data_interface_a; struct starpu_matrix_interface *matrix_b = (struct starpu_matrix_interface *) data_interface_b; /* Two matricess are considered compatible if they have the same size */ return (matrix_a->nx == matrix_b->nx) && (matrix_a->ny == matrix_b->ny) && (matrix_a->elemsize == matrix_b->elemsize); } static void display_matrix_interface(starpu_data_handle_t handle, FILE *f) { struct starpu_matrix_interface *matrix_interface = (struct starpu_matrix_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); fprintf(f, "%u\t%u\t", matrix_interface->nx, matrix_interface->ny); } static int pack_matrix_handle(starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_matrix_interface *matrix_interface = (struct starpu_matrix_interface *) starpu_data_get_interface_on_node(handle, node); *count = matrix_interface->nx*matrix_interface->ny*matrix_interface->elemsize; if (ptr != NULL) { uint32_t y; char *matrix = (void *)matrix_interface->ptr; starpu_malloc_flags(ptr, *count, 0); char *cur = *ptr; for(y=0 ; yny ; y++) { memcpy(cur, matrix, matrix_interface->nx*matrix_interface->elemsize); cur += matrix_interface->nx*matrix_interface->elemsize; matrix += matrix_interface->ld * matrix_interface->elemsize; } } return 0; } static int unpack_matrix_handle(starpu_data_handle_t handle, unsigned node, void *ptr, size_t count) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_matrix_interface *matrix_interface = (struct starpu_matrix_interface *) starpu_data_get_interface_on_node(handle, node); STARPU_ASSERT(count == matrix_interface->elemsize * matrix_interface->nx * matrix_interface->ny); uint32_t y; char *cur = ptr; char *matrix = (void *)matrix_interface->ptr; for(y=0 ; yny ; y++) { memcpy(matrix, cur, matrix_interface->nx*matrix_interface->elemsize); cur += matrix_interface->nx*matrix_interface->elemsize; matrix += matrix_interface->ld * matrix_interface->elemsize; } return 0; } static size_t matrix_interface_get_size(starpu_data_handle_t handle) { struct starpu_matrix_interface *matrix_interface = (struct starpu_matrix_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(matrix_interface->id == STARPU_MATRIX_INTERFACE_ID, "Error. The given data is not a matrix."); #endif size_t size; size = (size_t)matrix_interface->nx*matrix_interface->ny*matrix_interface->elemsize; return size; } /* offer an access to the data parameters */ uint32_t starpu_matrix_get_nx(starpu_data_handle_t handle) { struct starpu_matrix_interface *matrix_interface = (struct starpu_matrix_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(matrix_interface->id == STARPU_MATRIX_INTERFACE_ID, "Error. The given data is not a matrix."); #endif return matrix_interface->nx; } uint32_t starpu_matrix_get_ny(starpu_data_handle_t handle) { struct starpu_matrix_interface *matrix_interface = (struct starpu_matrix_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(matrix_interface->id == STARPU_MATRIX_INTERFACE_ID, "Error. The given data is not a matrix."); #endif return matrix_interface->ny; } uint32_t starpu_matrix_get_local_ld(starpu_data_handle_t handle) { unsigned node; node = _starpu_memory_node_get_local_key(); STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_matrix_interface *matrix_interface = (struct starpu_matrix_interface *) starpu_data_get_interface_on_node(handle, node); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(matrix_interface->id == STARPU_MATRIX_INTERFACE_ID, "Error. The given data is not a matrix."); #endif return matrix_interface->ld; } uintptr_t starpu_matrix_get_local_ptr(starpu_data_handle_t handle) { unsigned node; node = _starpu_memory_node_get_local_key(); STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_matrix_interface *matrix_interface = (struct starpu_matrix_interface *) starpu_data_get_interface_on_node(handle, node); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(matrix_interface->id == STARPU_MATRIX_INTERFACE_ID, "Error. The given data is not a matrix."); #endif return matrix_interface->ptr; } size_t starpu_matrix_get_elemsize(starpu_data_handle_t handle) { struct starpu_matrix_interface *matrix_interface = (struct starpu_matrix_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(matrix_interface->id == STARPU_MATRIX_INTERFACE_ID, "Error. The given data is not a matrix."); #endif return matrix_interface->elemsize; } /* memory allocation/deallocation primitives for the matrix interface */ /* returns the size of the allocated area */ static starpu_ssize_t allocate_matrix_buffer_on_node(void *data_interface_, unsigned dst_node) { uintptr_t addr = 0, handle; struct starpu_matrix_interface *matrix_interface = (struct starpu_matrix_interface *) data_interface_; uint32_t nx = matrix_interface->nx; uint32_t ny = matrix_interface->ny; uint32_t ld = nx; // by default size_t elemsize = matrix_interface->elemsize; starpu_ssize_t allocated_memory; handle = starpu_malloc_on_node(dst_node, nx*ny*elemsize); if (!handle) return -ENOMEM; if (starpu_node_get_kind(dst_node) != STARPU_OPENCL_RAM) addr = handle; allocated_memory = (size_t)nx*ny*elemsize; /* update the data properly in consequence */ matrix_interface->ptr = addr; matrix_interface->dev_handle = handle; matrix_interface->offset = 0; matrix_interface->ld = ld; return allocated_memory; } static void free_matrix_buffer_on_node(void *data_interface, unsigned node) { struct starpu_matrix_interface *matrix_interface = (struct starpu_matrix_interface *) data_interface; uint32_t nx = matrix_interface->nx; uint32_t ny = matrix_interface->ny; size_t elemsize = matrix_interface->elemsize; starpu_free_on_node(node, matrix_interface->dev_handle, nx*ny*elemsize); } #ifdef STARPU_USE_CUDA static int copy_cuda_common(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, enum cudaMemcpyKind kind, int is_async, cudaStream_t stream) { struct starpu_matrix_interface *src_matrix = src_interface; struct starpu_matrix_interface *dst_matrix = dst_interface; size_t elemsize = src_matrix->elemsize; cudaError_t cures; if (is_async) { _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); cures = cudaMemcpy2DAsync((char *)dst_matrix->ptr, dst_matrix->ld*elemsize, (char *)src_matrix->ptr, src_matrix->ld*elemsize, src_matrix->nx*elemsize, src_matrix->ny, kind, stream); _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); if (!cures) return -EAGAIN; } cures = cudaMemcpy2D((char *)dst_matrix->ptr, dst_matrix->ld*elemsize, (char *)src_matrix->ptr, src_matrix->ld*elemsize, src_matrix->nx*elemsize, src_matrix->ny, kind); if (STARPU_UNLIKELY(cures)) { int ret = copy_any_to_any(src_interface, src_node, dst_interface, dst_node, (void*)(uintptr_t)is_async); if (ret == -EAGAIN) return ret; if (ret) STARPU_CUDA_REPORT_ERROR(cures); } _STARPU_TRACE_DATA_COPY(src_node, dst_node, (size_t)src_matrix->nx*src_matrix->ny*src_matrix->elemsize); return 0; } #ifndef BUGGED_MEMCPY3D static int copy_cuda_peer(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, int is_async, cudaStream_t stream) { #ifdef HAVE_CUDA_MEMCPY_PEER struct starpu_matrix_interface *src_matrix = src_interface; struct starpu_matrix_interface *dst_matrix = dst_interface; size_t elemsize = src_matrix->elemsize; cudaError_t cures; int src_dev = _starpu_memory_node_get_devid(src_node); int dst_dev = _starpu_memory_node_get_devid(dst_node); struct cudaMemcpy3DPeerParms p; memset(&p, 0, sizeof(p)); p.srcDevice = src_dev; p.dstDevice = dst_dev; p.srcPtr = make_cudaPitchedPtr((char *)src_matrix->ptr, src_matrix->ld * elemsize, src_matrix->nx, src_matrix->ny); p.dstPtr = make_cudaPitchedPtr((char *)dst_matrix->ptr, dst_matrix->ld * elemsize, dst_matrix->nx, dst_matrix->ny); p.extent = make_cudaExtent(src_matrix->nx * elemsize, src_matrix->ny, 1); if (is_async) { _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); cures = cudaMemcpy3DPeerAsync(&p, stream); _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); if (!cures) return -EAGAIN; } cures = cudaMemcpy3DPeer(&p); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); _STARPU_TRACE_DATA_COPY(src_node, dst_node, (size_t)src_matrix->nx*src_matrix->ny*src_matrix->elemsize); return 0; #else STARPU_ABORT_MSG("CUDA memcpy 3D peer not available, but core triggered one ?!"); #endif } #endif static int copy_cuda_to_ram(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { return copy_cuda_common(src_interface, src_node, dst_interface, dst_node, cudaMemcpyDeviceToHost, 0, 0); } static int copy_ram_to_cuda(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { return copy_cuda_common(src_interface, src_node, dst_interface, dst_node, cudaMemcpyHostToDevice, 0, 0); } static int copy_cuda_to_cuda(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { if (src_node == dst_node) return copy_cuda_common(src_interface, src_node, dst_interface, dst_node, cudaMemcpyDeviceToDevice, 0, 0); else #ifdef BUGGED_MEMCPY3D STARPU_ABORT_MSG("CUDA memcpy 3D peer not available, but core triggered one?!"); #else return copy_cuda_peer(src_interface, src_node, dst_interface, dst_node, 0, 0); #endif } static int copy_cuda_to_ram_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cudaStream_t stream) { return copy_cuda_common(src_interface, src_node, dst_interface, dst_node, cudaMemcpyDeviceToHost, 1, stream); } static int copy_ram_to_cuda_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cudaStream_t stream) { return copy_cuda_common(src_interface, src_node, dst_interface, dst_node, cudaMemcpyHostToDevice, 1, stream); } #ifndef BUGGED_MEMCPY3D static int copy_cuda_to_cuda_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cudaStream_t stream) { if (src_node == dst_node) return copy_cuda_common(src_interface, src_node, dst_interface, dst_node, cudaMemcpyDeviceToDevice, 1, stream); else return copy_cuda_peer(src_interface, src_node, dst_interface, dst_node, 1, stream); } #endif #endif // STARPU_USE_CUDA #ifdef STARPU_USE_OPENCL static int copy_opencl_common(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event) { struct starpu_matrix_interface *src_matrix = src_interface; struct starpu_matrix_interface *dst_matrix = dst_interface; int ret; STARPU_ASSERT_MSG((src_matrix->ld == src_matrix->nx) && (dst_matrix->ld == dst_matrix->nx), "XXX non contiguous buffers are not properly supported in OpenCL yet. (TODO)"); ret = starpu_opencl_copy_async_sync(src_matrix->dev_handle, src_matrix->offset, src_node, dst_matrix->dev_handle, dst_matrix->offset, dst_node, src_matrix->nx*src_matrix->ny*src_matrix->elemsize, event); _STARPU_TRACE_DATA_COPY(src_node, dst_node, src_matrix->nx*src_matrix->ny*src_matrix->elemsize); return ret; } static int copy_ram_to_opencl_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event) { return copy_opencl_common(src_interface, src_node, dst_interface, dst_node, event); } static int copy_opencl_to_ram_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event) { return copy_opencl_common(src_interface, src_node, dst_interface, dst_node, event); } static int copy_opencl_to_opencl_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event) { return copy_opencl_common(src_interface, src_node, dst_interface, dst_node, event); } static int copy_ram_to_opencl(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { return copy_ram_to_opencl_async(src_interface, src_node, dst_interface, dst_node, NULL); } static int copy_opencl_to_ram(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { return copy_opencl_to_ram_async(src_interface, src_node, dst_interface, dst_node, NULL); } static int copy_opencl_to_opencl(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { return copy_opencl_to_opencl_async(src_interface, src_node, dst_interface, dst_node, NULL); } #endif static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data) { struct starpu_matrix_interface *src_matrix = (struct starpu_matrix_interface *) src_interface; struct starpu_matrix_interface *dst_matrix = (struct starpu_matrix_interface *) dst_interface; int ret = 0; uint32_t nx = dst_matrix->nx; uint32_t ny = dst_matrix->ny; size_t elemsize = dst_matrix->elemsize; uint32_t ld_src = src_matrix->ld; uint32_t ld_dst = dst_matrix->ld; if (ld_src == nx && ld_dst == nx) { /* Optimize unpartitioned and y-partitioned cases */ if (starpu_interface_copy(src_matrix->dev_handle, src_matrix->offset, src_node, dst_matrix->dev_handle, dst_matrix->offset, dst_node, nx*ny*elemsize, async_data)) ret = -EAGAIN; } else { unsigned y; for (y = 0; y < ny; y++) { uint32_t src_offset = y*ld_src*elemsize; uint32_t dst_offset = y*ld_dst*elemsize; if (starpu_interface_copy(src_matrix->dev_handle, src_matrix->offset + src_offset, src_node, dst_matrix->dev_handle, dst_matrix->offset + dst_offset, dst_node, nx*elemsize, async_data)) ret = -EAGAIN; } } _STARPU_TRACE_DATA_COPY(src_node, dst_node, (size_t)nx*ny*elemsize); return ret; } static starpu_ssize_t describe(void *data_interface, char *buf, size_t size) { struct starpu_matrix_interface *matrix = (struct starpu_matrix_interface *) data_interface; return snprintf(buf, size, "M%ux%ux%u", (unsigned) matrix->nx, (unsigned) matrix->ny, (unsigned) matrix->elemsize); } starpu-1.2.3+dfsg/src/datawizard/interfaces/multiformat_interface.c000066400000000000000000000654231320135501600255530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2012 INRIA * Copyright (C) 2012, 2013, 2014, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include static int copy_ram_to_ram(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node); #ifdef STARPU_USE_CUDA static int copy_ram_to_cuda(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node); static int copy_cuda_to_ram(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node); static int copy_ram_to_cuda_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node, cudaStream_t stream); static int copy_cuda_to_ram_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node, cudaStream_t stream); static int copy_cuda_to_cuda(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); static int copy_cuda_to_cuda_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cudaStream_t stream); #endif #ifdef STARPU_USE_OPENCL static int copy_ram_to_opencl(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node); static int copy_opencl_to_ram(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node); static int copy_opencl_to_opencl(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node); static int copy_ram_to_opencl_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node, cl_event *event); static int copy_opencl_to_ram_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node, cl_event *event); #endif #ifdef STARPU_USE_MIC static int copy_ram_to_mic(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node); static int copy_mic_to_ram(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node); static int copy_ram_to_mic_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node); static int copy_mic_to_ram_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node); #endif static const struct starpu_data_copy_methods multiformat_copy_data_methods_s = { .ram_to_ram = copy_ram_to_ram, #ifdef STARPU_USE_CUDA .ram_to_cuda = copy_ram_to_cuda, .cuda_to_ram = copy_cuda_to_ram, .ram_to_cuda_async = copy_ram_to_cuda_async, .cuda_to_ram_async = copy_cuda_to_ram_async, .cuda_to_cuda = copy_cuda_to_cuda, .cuda_to_cuda_async = copy_cuda_to_cuda_async, #else #ifdef STARPU_SIMGRID /* Enable GPU-GPU transfers in simgrid */ .cuda_to_cuda_async = (void *)1, #endif #endif #ifdef STARPU_USE_OPENCL .ram_to_opencl = copy_ram_to_opencl, .opencl_to_ram = copy_opencl_to_ram, .opencl_to_opencl = copy_opencl_to_opencl, .ram_to_opencl_async = copy_ram_to_opencl_async, .opencl_to_ram_async = copy_opencl_to_ram_async, #endif #ifdef STARPU_USE_MIC .ram_to_mic = copy_ram_to_mic, .mic_to_ram = copy_mic_to_ram, .ram_to_mic_async = copy_ram_to_mic_async, .mic_to_ram_async = copy_mic_to_ram_async, #endif }; static void register_multiformat_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface); static starpu_ssize_t allocate_multiformat_buffer_on_node(void *data_interface_, unsigned dst_node); static void *multiformat_handle_to_pointer(starpu_data_handle_t data_handle, unsigned node); static void free_multiformat_buffer_on_node(void *data_interface, unsigned node); static size_t multiformat_interface_get_size(starpu_data_handle_t handle); static uint32_t footprint_multiformat_interface_crc32(starpu_data_handle_t handle); static int multiformat_compare(void *data_interface_a, void *data_interface_b); static void display_multiformat_interface(starpu_data_handle_t handle, FILE *f); static uint32_t starpu_multiformat_get_nx(starpu_data_handle_t handle); static struct starpu_multiformat_data_interface_ops* get_mf_ops(void *data_interface) { struct starpu_multiformat_interface *mf; mf = (struct starpu_multiformat_interface *) data_interface; return mf->ops; } struct starpu_data_interface_ops starpu_interface_multiformat_ops = { .register_data_handle = register_multiformat_handle, .allocate_data_on_node = allocate_multiformat_buffer_on_node, .handle_to_pointer = multiformat_handle_to_pointer, .free_data_on_node = free_multiformat_buffer_on_node, .copy_methods = &multiformat_copy_data_methods_s, .get_size = multiformat_interface_get_size, .footprint = footprint_multiformat_interface_crc32, .compare = multiformat_compare, .interfaceid = STARPU_MULTIFORMAT_INTERFACE_ID, .interface_size = sizeof(struct starpu_multiformat_interface), .display = display_multiformat_interface, .is_multiformat = 1, .get_mf_ops = get_mf_ops }; static void *multiformat_handle_to_pointer(starpu_data_handle_t handle, unsigned node) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_multiformat_interface *multiformat_interface = (struct starpu_multiformat_interface *) starpu_data_get_interface_on_node(handle, node); switch(starpu_node_get_kind(node)) { case STARPU_CPU_RAM: return multiformat_interface->cpu_ptr; #ifdef STARPU_USE_CUDA case STARPU_CUDA_RAM: return multiformat_interface->cuda_ptr; #endif #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_RAM: return multiformat_interface->opencl_ptr; #endif #ifdef STARPU_USE_MIC case STARPU_MIC_RAM: return multiformat_interface->mic_ptr; #endif default: STARPU_ABORT(); } return NULL; } static void register_multiformat_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface) { struct starpu_multiformat_interface *multiformat_interface; multiformat_interface = (struct starpu_multiformat_interface *) data_interface; unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct starpu_multiformat_interface *local_interface = (struct starpu_multiformat_interface *) starpu_data_get_interface_on_node(handle, node); if (node == home_node) { local_interface->cpu_ptr = multiformat_interface->cpu_ptr; #ifdef STARPU_USE_CUDA local_interface->cuda_ptr = multiformat_interface->cuda_ptr; #endif #ifdef STARPU_USE_OPENCL local_interface->opencl_ptr = multiformat_interface->opencl_ptr; #endif #ifdef STARPU_USE_MIC local_interface->mic_ptr = multiformat_interface->mic_ptr; #endif } else { local_interface->cpu_ptr = NULL; #ifdef STARPU_USE_CUDA local_interface->cuda_ptr = NULL; #endif #ifdef STARPU_USE_OPENCL local_interface->opencl_ptr = NULL; #endif #ifdef STARPU_USE_MIC local_interface->mic_ptr = NULL; #endif } local_interface->id = multiformat_interface->id; local_interface->nx = multiformat_interface->nx; local_interface->ops = multiformat_interface->ops; } } void starpu_multiformat_data_register(starpu_data_handle_t *handleptr, int home_node, void *ptr, uint32_t nobjects, struct starpu_multiformat_data_interface_ops *format_ops) { _starpu_codelet_check_deprecated_fields(format_ops->cpu_to_opencl_cl); _starpu_codelet_check_deprecated_fields(format_ops->opencl_to_cpu_cl); _starpu_codelet_check_deprecated_fields(format_ops->cpu_to_cuda_cl); _starpu_codelet_check_deprecated_fields(format_ops->cuda_to_cpu_cl); _starpu_codelet_check_deprecated_fields(format_ops->cpu_to_mic_cl); _starpu_codelet_check_deprecated_fields(format_ops->mic_to_cpu_cl); struct starpu_multiformat_interface multiformat = { .id = STARPU_MULTIFORMAT_INTERFACE_ID, .cpu_ptr = ptr, .cuda_ptr = NULL, .opencl_ptr = NULL, .mic_ptr = NULL, .nx = nobjects, .ops = format_ops }; starpu_data_register(handleptr, home_node, &multiformat, &starpu_interface_multiformat_ops); } static uint32_t footprint_multiformat_interface_crc32(starpu_data_handle_t handle) { return starpu_hash_crc32c_be(starpu_multiformat_get_nx(handle), 0); } static int multiformat_compare(void *data_interface_a, void *data_interface_b) { struct starpu_multiformat_interface *multiformat_a = (struct starpu_multiformat_interface *) data_interface_a; struct starpu_multiformat_interface *multiformat_b = (struct starpu_multiformat_interface *) data_interface_b; return (multiformat_a->nx == multiformat_b->nx) && (multiformat_a->ops->cpu_elemsize == multiformat_b->ops->cpu_elemsize) #ifdef STARPU_USE_CUDA && (multiformat_a->ops->cuda_elemsize == multiformat_b->ops->cuda_elemsize) #endif #ifdef STARPU_USE_OPENCL && (multiformat_a->ops->opencl_elemsize == multiformat_b->ops->opencl_elemsize) #endif #ifdef STARPU_USE_MIC && (multiformat_a->ops->mic_elemsize == multiformat_b->ops->mic_elemsize) #endif ; } static void display_multiformat_interface(starpu_data_handle_t handle, FILE *f) { struct starpu_multiformat_interface *multiformat_interface; multiformat_interface = (struct starpu_multiformat_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); fprintf(f, "%u\t", multiformat_interface->nx); } /* XXX : returns CPU size */ static size_t multiformat_interface_get_size(starpu_data_handle_t handle) { size_t size; struct starpu_multiformat_interface *multiformat_interface; multiformat_interface = (struct starpu_multiformat_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); size = multiformat_interface->nx * multiformat_interface->ops->cpu_elemsize; return size; } uint32_t starpu_multiformat_get_nx(starpu_data_handle_t handle) { struct starpu_multiformat_interface *multiformat_interface; multiformat_interface = (struct starpu_multiformat_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); return multiformat_interface->nx; } static starpu_ssize_t allocate_multiformat_buffer_on_node(void *data_interface_, unsigned dst_node) { struct starpu_multiformat_interface *multiformat_interface; multiformat_interface = (struct starpu_multiformat_interface *) data_interface_; uintptr_t addr = 0; starpu_ssize_t allocated_memory = 0; size_t size; size = multiformat_interface->nx * multiformat_interface->ops->cpu_elemsize; allocated_memory += size; addr = starpu_malloc_on_node(dst_node, size); if (!addr) goto fail_cpu; multiformat_interface->cpu_ptr = (void *) addr; #ifdef STARPU_USE_CUDA size = multiformat_interface->nx * multiformat_interface->ops->cuda_elemsize; allocated_memory += size; addr = starpu_malloc_on_node(dst_node, size); if (!addr) goto fail_cuda; multiformat_interface->cuda_ptr = (void *) addr; #endif #ifdef STARPU_USE_OPENCL size = multiformat_interface->nx * multiformat_interface->ops->opencl_elemsize; allocated_memory += size; addr = starpu_malloc_on_node(dst_node, size); if (!addr) goto fail_opencl; multiformat_interface->opencl_ptr = (void *) addr; #endif #ifdef STARPU_USE_MIC size = multiformat_interface->nx * multiformat_interface->ops->mic_elemsize; allocated_memory += size; addr = starpu_malloc_on_node(dst_node, size); if (!addr) goto fail_mic; multiformat_interface->mic_ptr = (void *) addr; #endif return allocated_memory; #ifdef STARPU_USE_MIC fail_mic: #endif #ifdef STARPU_USE_OPENCL starpu_free_on_node(dst_node, (uintptr_t) multiformat_interface->opencl_ptr, multiformat_interface->nx * multiformat_interface->ops->opencl_elemsize); fail_opencl: #endif #ifdef STARPU_USE_CUDA starpu_free_on_node(dst_node, (uintptr_t) multiformat_interface->cuda_ptr, multiformat_interface->nx * multiformat_interface->ops->cuda_elemsize); fail_cuda: #endif starpu_free_on_node(dst_node, (uintptr_t) multiformat_interface->cpu_ptr, multiformat_interface->nx * multiformat_interface->ops->cpu_elemsize); fail_cpu: return -ENOMEM; } static void free_multiformat_buffer_on_node(void *data_interface, unsigned node) { struct starpu_multiformat_interface *multiformat_interface; multiformat_interface = (struct starpu_multiformat_interface *) data_interface; starpu_free_on_node(node, (uintptr_t) multiformat_interface->cpu_ptr, multiformat_interface->nx * multiformat_interface->ops->cpu_elemsize); multiformat_interface->cpu_ptr = NULL; #ifdef STARPU_USE_CUDA starpu_free_on_node(node, (uintptr_t) multiformat_interface->cuda_ptr, multiformat_interface->nx * multiformat_interface->ops->cuda_elemsize); multiformat_interface->cuda_ptr = NULL; #endif #ifdef STARPU_USE_OPENCL starpu_free_on_node(node, (uintptr_t) multiformat_interface->opencl_ptr, multiformat_interface->nx * multiformat_interface->ops->opencl_elemsize); multiformat_interface->opencl_ptr = NULL; #endif #ifdef STARPU_USE_MIC starpu_free_on_node(node, (uintptr_t) multiformat_interface->mic_ptr, multiformat_interface->nx * multiformat_interface->ops->mic_elemsize); multiformat_interface->mic_ptr = NULL; #endif } /* * Copy methods */ static int copy_ram_to_ram(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { struct starpu_multiformat_interface *src_multiformat; struct starpu_multiformat_interface *dst_multiformat; src_multiformat = (struct starpu_multiformat_interface *) src_interface; dst_multiformat = (struct starpu_multiformat_interface *) dst_interface; STARPU_ASSERT(src_multiformat != NULL); STARPU_ASSERT(dst_multiformat != NULL); STARPU_ASSERT(dst_multiformat->ops != NULL); size_t size = dst_multiformat->nx * dst_multiformat->ops->cpu_elemsize; memcpy(dst_multiformat->cpu_ptr, src_multiformat->cpu_ptr, size); return 0; } #ifdef STARPU_USE_CUDA static int copy_cuda_common(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, enum cudaMemcpyKind kind) { struct starpu_multiformat_interface *src_multiformat; struct starpu_multiformat_interface *dst_multiformat; src_multiformat = (struct starpu_multiformat_interface *) src_interface; dst_multiformat = (struct starpu_multiformat_interface *) dst_interface; size_t size; cudaError_t status; switch (kind) { case cudaMemcpyHostToDevice: { size = src_multiformat->nx * src_multiformat->ops->cuda_elemsize; if (src_multiformat->cuda_ptr == NULL) { src_multiformat->cuda_ptr = malloc(size); if (src_multiformat->cuda_ptr == NULL) return -ENOMEM; } status = cudaMemcpy(dst_multiformat->cpu_ptr, src_multiformat->cpu_ptr, size, kind); if (STARPU_UNLIKELY(status)) { STARPU_CUDA_REPORT_ERROR(status); } break; } case cudaMemcpyDeviceToHost: { size = src_multiformat->nx * src_multiformat->ops->cuda_elemsize; status = cudaMemcpy(dst_multiformat->cuda_ptr, src_multiformat->cuda_ptr, size, kind); if (STARPU_UNLIKELY(status)) STARPU_CUDA_REPORT_ERROR(status); break; } case cudaMemcpyDeviceToDevice: { size = src_multiformat->nx * src_multiformat->ops->cuda_elemsize; status = cudaMemcpy(dst_multiformat->cuda_ptr, src_multiformat->cuda_ptr, size, kind); if (STARPU_UNLIKELY(status)) STARPU_CUDA_REPORT_ERROR(status); break; } default: STARPU_ABORT(); } return 0; } static int copy_ram_to_cuda(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node) { return copy_cuda_common(src_interface, src_node, dst_interface, dst_node, cudaMemcpyHostToDevice); } static int copy_cuda_to_ram(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node) { return copy_cuda_common(src_interface, src_node, dst_interface, dst_node, cudaMemcpyDeviceToHost); } static int copy_cuda_common_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cudaStream_t stream, enum cudaMemcpyKind kind) { struct starpu_multiformat_interface *src_multiformat; struct starpu_multiformat_interface *dst_multiformat; src_multiformat = (struct starpu_multiformat_interface *) src_interface; dst_multiformat = (struct starpu_multiformat_interface *) dst_interface; size_t size; cudaError_t status; switch (kind) { case cudaMemcpyHostToDevice: { size = src_multiformat->nx * src_multiformat->ops->cuda_elemsize; if (src_multiformat->cuda_ptr == NULL) { src_multiformat->cuda_ptr = malloc(size); if (src_multiformat->cuda_ptr == NULL) return -ENOMEM; } status = cudaMemcpyAsync(dst_multiformat->cpu_ptr, src_multiformat->cpu_ptr, size, kind, stream); if (STARPU_UNLIKELY(status)) { STARPU_CUDA_REPORT_ERROR(status); } break; } case cudaMemcpyDeviceToHost: { size = src_multiformat->nx * src_multiformat->ops->cuda_elemsize; status = cudaMemcpy(dst_multiformat->cuda_ptr, src_multiformat->cuda_ptr, size, kind); if (STARPU_UNLIKELY(status)) STARPU_CUDA_REPORT_ERROR(status); break; } case cudaMemcpyDeviceToDevice: { size = src_multiformat->nx * src_multiformat->ops->cuda_elemsize; status = cudaMemcpyAsync(dst_multiformat->cuda_ptr, src_multiformat->cuda_ptr, size, kind, stream); if (STARPU_UNLIKELY(status)) STARPU_CUDA_REPORT_ERROR(status); break; } default: STARPU_ABORT(); } return 0; } static int copy_ram_to_cuda_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node, cudaStream_t stream) { return copy_cuda_common_async(src_interface, src_node, dst_interface, dst_node, stream, cudaMemcpyHostToDevice); } static int copy_cuda_to_ram_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node, cudaStream_t stream) { return copy_cuda_common_async(src_interface, src_node, dst_interface, dst_node, stream, cudaMemcpyDeviceToHost); } #ifdef HAVE_CUDA_MEMCPY_PEER static int copy_cuda_peer_common(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cudaStream_t stream) { struct starpu_multiformat_interface *src_multiformat; struct starpu_multiformat_interface *dst_multiformat; src_multiformat = (struct starpu_multiformat_interface *) src_interface; dst_multiformat = (struct starpu_multiformat_interface *) dst_interface; STARPU_ASSERT(src_multiformat != NULL); STARPU_ASSERT(dst_multiformat != NULL); STARPU_ASSERT(src_multiformat->ops != NULL); cudaError_t status; int size = src_multiformat->nx * src_multiformat->ops->cuda_elemsize; int src_dev = _starpu_memory_node_get_devid(src_node); int dst_dev = _starpu_memory_node_get_devid(dst_node); if (stream) { _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); status = cudaMemcpyPeerAsync(dst_multiformat->cuda_ptr, dst_dev, src_multiformat->cuda_ptr, src_dev, size, stream); _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); /* All good ! Still, returning -EAGAIN, because we will need to check the transfert completion later */ if (status == cudaSuccess) return -EAGAIN; } /* Either a synchronous transfert was requested, or the asynchronous one failed. */ status = cudaMemcpyPeer(dst_multiformat->cuda_ptr, dst_dev, src_multiformat->cuda_ptr, src_dev, size); if (STARPU_UNLIKELY(status != cudaSuccess)) STARPU_CUDA_REPORT_ERROR(status); _STARPU_TRACE_DATA_COPY(src_node, dst_node, size); return 0; } #endif static int copy_cuda_to_cuda(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { if (src_node == dst_node) { return copy_cuda_common(src_interface, src_node, dst_interface, dst_node, cudaMemcpyDeviceToDevice); } else { #ifdef HAVE_CUDA_MEMCPY_PEER return copy_cuda_peer_common(src_interface, src_node, dst_interface, dst_node, NULL); #else STARPU_ABORT(); #endif } } static int copy_cuda_to_cuda_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cudaStream_t stream) { if (src_node == dst_node) { return copy_cuda_common_async(src_interface, src_node, dst_interface, dst_node, stream, cudaMemcpyDeviceToDevice); } else { #ifdef HAVE_CUDA_MEMCPY_PEER return copy_cuda_peer_common(src_interface, src_node, dst_interface, dst_node, stream); #else STARPU_ABORT(); #endif } } #endif /* STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL static int copy_ram_to_opencl_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event) { int err, ret; size_t size; struct starpu_multiformat_interface *src_multiformat; struct starpu_multiformat_interface *dst_multiformat; src_multiformat = (struct starpu_multiformat_interface *) src_interface; dst_multiformat = (struct starpu_multiformat_interface *) dst_interface; STARPU_ASSERT(src_multiformat != NULL); STARPU_ASSERT(dst_multiformat != NULL); STARPU_ASSERT(src_multiformat->ops != NULL); size = src_multiformat->nx * src_multiformat->ops->opencl_elemsize; err = starpu_opencl_copy_ram_to_opencl(src_multiformat->cpu_ptr, src_node, (cl_mem) dst_multiformat->cpu_ptr, dst_node, size, 0, event, &ret); if (STARPU_UNLIKELY(err)) STARPU_OPENCL_REPORT_ERROR(err); _STARPU_TRACE_DATA_COPY(src_node, dst_node, size); return ret; } static int copy_opencl_to_ram_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event) { int err, ret; size_t size; struct starpu_multiformat_interface *src_multiformat; struct starpu_multiformat_interface *dst_multiformat; src_multiformat = (struct starpu_multiformat_interface *) src_interface; dst_multiformat = (struct starpu_multiformat_interface *) dst_interface; STARPU_ASSERT(src_multiformat != NULL); STARPU_ASSERT(dst_multiformat != NULL); STARPU_ASSERT(src_multiformat->ops != NULL); STARPU_ASSERT(dst_multiformat->ops != NULL); size = src_multiformat->nx * src_multiformat->ops->opencl_elemsize; if (dst_multiformat->opencl_ptr == NULL) { /* XXX : it is weird that we might have to allocate memory here... */ _STARPU_MALLOC(dst_multiformat->opencl_ptr, dst_multiformat->nx * dst_multiformat->ops->opencl_elemsize); } err = starpu_opencl_copy_opencl_to_ram((cl_mem)src_multiformat->opencl_ptr, src_node, dst_multiformat->opencl_ptr, dst_node, size, 0, event, &ret); if (STARPU_UNLIKELY(err)) STARPU_OPENCL_REPORT_ERROR(err); _STARPU_TRACE_DATA_COPY(src_node, dst_node, size); return ret; } static int copy_ram_to_opencl(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { return copy_ram_to_opencl_async(src_interface, src_node, dst_interface, dst_node, NULL); } static int copy_opencl_to_ram(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { return copy_opencl_to_ram_async(src_interface, src_node, dst_interface, dst_node, NULL); } static int copy_opencl_to_opencl(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) { (void) src_interface; (void) dst_interface; (void) src_node; (void) dst_node; STARPU_ASSERT_MSG(0, "XXX multiformat copy OpenCL-OpenCL not supported yet (TODO)"); return 0; } #endif #ifdef STARPU_USE_MIC static int copy_mic_common_ram_to_mic(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, int (*copy_func)(void *, unsigned, void *, unsigned, size_t)) { struct starpu_multiformat_interface *src_multiformat = src_interface; struct starpu_multiformat_interface *dst_multiformat = dst_interface; STARPU_ASSERT(src_multiformat != NULL); STARPU_ASSERT(dst_multiformat != NULL); STARPU_ASSERT(dst_multiformat->ops != NULL); size_t size = dst_multiformat->nx * dst_multiformat->ops->mic_elemsize; if (src_multiformat->mic_ptr == NULL) { src_multiformat->mic_ptr = malloc(size); if (src_multiformat->mic_ptr == NULL) return -ENOMEM; } copy_func(src_multiformat->cpu_ptr, src_node, dst_multiformat->cpu_ptr, dst_node, size); _STARPU_TRACE_DATA_COPY(src_node, dst_node, size); return 0; } static int copy_mic_common_mic_to_ram(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, int (*copy_func)(void *, unsigned, void *, unsigned, size_t)) { struct starpu_multiformat_interface *src_multiformat = src_interface; struct starpu_multiformat_interface *dst_multiformat = dst_interface; STARPU_ASSERT(src_multiformat != NULL); STARPU_ASSERT(dst_multiformat != NULL); STARPU_ASSERT(dst_multiformat->ops != NULL); size_t size = src_multiformat->nx * src_multiformat->ops->mic_elemsize; copy_func(src_multiformat->mic_ptr, src_node, dst_multiformat->mic_ptr, dst_node, size); _STARPU_TRACE_DATA_COPY(src_node, dst_node, size); return 0; } static int copy_ram_to_mic(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) { return copy_mic_common_ram_to_mic(src_interface, src_node, dst_interface, dst_node, _starpu_mic_copy_ram_to_mic); } static int copy_mic_to_ram(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) { return copy_mic_common_mic_to_ram(src_interface, src_node, dst_interface, dst_node, _starpu_mic_copy_mic_to_ram); } static int copy_ram_to_mic_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) { copy_mic_common_ram_to_mic(src_interface, src_node, dst_interface, dst_node, _starpu_mic_copy_ram_to_mic_async); return -EAGAIN; } static int copy_mic_to_ram_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) { copy_mic_common_mic_to_ram(src_interface, src_node, dst_interface, dst_node, _starpu_mic_copy_mic_to_ram_async); return -EAGAIN; } #endif starpu-1.2.3+dfsg/src/datawizard/interfaces/variable_interface.c000066400000000000000000000231031320135501600247620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data); static const struct starpu_data_copy_methods variable_copy_data_methods_s = { .any_to_any = copy_any_to_any, }; static void register_variable_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface); static starpu_ssize_t allocate_variable_buffer_on_node(void *data_interface_, unsigned dst_node); static void *variable_handle_to_pointer(starpu_data_handle_t data_handle, unsigned node); static void free_variable_buffer_on_node(void *data_interface, unsigned node); static size_t variable_interface_get_size(starpu_data_handle_t handle); static uint32_t footprint_variable_interface_crc32(starpu_data_handle_t handle); static int variable_compare(void *data_interface_a, void *data_interface_b); static void display_variable_interface(starpu_data_handle_t handle, FILE *f); static int pack_variable_handle(starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count); static int unpack_variable_handle(starpu_data_handle_t handle, unsigned node, void *ptr, size_t count); static starpu_ssize_t describe(void *data_interface, char *buf, size_t size); struct starpu_data_interface_ops starpu_interface_variable_ops = { .register_data_handle = register_variable_handle, .allocate_data_on_node = allocate_variable_buffer_on_node, .handle_to_pointer = variable_handle_to_pointer, .free_data_on_node = free_variable_buffer_on_node, .copy_methods = &variable_copy_data_methods_s, .get_size = variable_interface_get_size, .footprint = footprint_variable_interface_crc32, .compare = variable_compare, .interfaceid = STARPU_VARIABLE_INTERFACE_ID, .interface_size = sizeof(struct starpu_variable_interface), .display = display_variable_interface, .pack_data = pack_variable_handle, .unpack_data = unpack_variable_handle, .describe = describe, .name = "STARPU_VARIABLE_INTERFACE" }; static void *variable_handle_to_pointer(starpu_data_handle_t handle, unsigned node) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); return (void*) STARPU_VARIABLE_GET_PTR(starpu_data_get_interface_on_node(handle, node)); } static void register_variable_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface) { struct starpu_variable_interface *variable_interface = (struct starpu_variable_interface *)data_interface; unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct starpu_variable_interface *local_interface = (struct starpu_variable_interface *) starpu_data_get_interface_on_node(handle, node); if (node == home_node) { local_interface->ptr = variable_interface->ptr; local_interface->dev_handle = variable_interface->dev_handle; local_interface->offset = variable_interface->offset; } else { local_interface->ptr = 0; local_interface->dev_handle = 0; local_interface->offset = 0; } local_interface->id = variable_interface->id; local_interface->elemsize = variable_interface->elemsize; } } /* declare a new data with the variable interface */ void starpu_variable_data_register(starpu_data_handle_t *handleptr, int home_node, uintptr_t ptr, size_t elemsize) { struct starpu_variable_interface variable = { .id = STARPU_VARIABLE_INTERFACE_ID, .ptr = ptr, .dev_handle = ptr, .offset = 0, .elemsize = elemsize }; #ifndef STARPU_SIMGRID if (home_node == STARPU_MAIN_RAM) { STARPU_ASSERT_ACCESSIBLE(ptr); STARPU_ASSERT_ACCESSIBLE(ptr + elemsize - 1); } #endif #ifdef STARPU_USE_SCC _starpu_scc_set_offset_in_shared_memory((void*)variable.ptr, (void**)&(variable.dev_handle), &(variable.offset)); #endif starpu_data_register(handleptr, home_node, &variable, &starpu_interface_variable_ops); } void starpu_variable_ptr_register(starpu_data_handle_t handle, unsigned node, uintptr_t ptr, uintptr_t dev_handle, size_t offset) { struct starpu_variable_interface *variable_interface = starpu_data_get_interface_on_node(handle, node); starpu_data_ptr_register(handle, node); variable_interface->ptr = ptr; variable_interface->dev_handle = dev_handle; variable_interface->offset = offset; } static uint32_t footprint_variable_interface_crc32(starpu_data_handle_t handle) { return starpu_hash_crc32c_be(starpu_variable_get_elemsize(handle), 0); } static int variable_compare(void *data_interface_a, void *data_interface_b) { struct starpu_variable_interface *variable_a = (struct starpu_variable_interface *) data_interface_a; struct starpu_variable_interface *variable_b = (struct starpu_variable_interface *) data_interface_b; /* Two variables are considered compatible if they have the same size */ return variable_a->elemsize == variable_b->elemsize; } static void display_variable_interface(starpu_data_handle_t handle, FILE *f) { struct starpu_variable_interface *variable_interface = (struct starpu_variable_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); fprintf(f, "%ld\t", (long)variable_interface->elemsize); } static int pack_variable_handle(starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_variable_interface *variable_interface = (struct starpu_variable_interface *) starpu_data_get_interface_on_node(handle, node); *count = variable_interface->elemsize; if (ptr != NULL) { starpu_malloc_flags(ptr, *count, 0); memcpy(*ptr, (void*)variable_interface->ptr, variable_interface->elemsize); } return 0; } static int unpack_variable_handle(starpu_data_handle_t handle, unsigned node, void *ptr, size_t count) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_variable_interface *variable_interface = (struct starpu_variable_interface *) starpu_data_get_interface_on_node(handle, node); STARPU_ASSERT(count == variable_interface->elemsize); memcpy((void*)variable_interface->ptr, ptr, variable_interface->elemsize); return 0; } static size_t variable_interface_get_size(starpu_data_handle_t handle) { struct starpu_variable_interface *variable_interface = (struct starpu_variable_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(variable_interface->id == STARPU_VARIABLE_INTERFACE_ID, "Error. The given data is not a variable."); #endif return variable_interface->elemsize; } uintptr_t starpu_variable_get_local_ptr(starpu_data_handle_t handle) { unsigned node; node = _starpu_memory_node_get_local_key(); STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); return STARPU_VARIABLE_GET_PTR(starpu_data_get_interface_on_node(handle, node)); } size_t starpu_variable_get_elemsize(starpu_data_handle_t handle) { return STARPU_VARIABLE_GET_ELEMSIZE(starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM)); } /* memory allocation/deallocation primitives for the variable interface */ /* returns the size of the allocated area */ static starpu_ssize_t allocate_variable_buffer_on_node(void *data_interface_, unsigned dst_node) { struct starpu_variable_interface *variable_interface = (struct starpu_variable_interface *) data_interface_; size_t elemsize = variable_interface->elemsize; uintptr_t addr = starpu_malloc_on_node(dst_node, elemsize); if (!addr) return -ENOMEM; /* update the data properly in consequence */ variable_interface->ptr = addr; return elemsize; } static void free_variable_buffer_on_node(void *data_interface, unsigned node) { struct starpu_variable_interface *variable_interface = (struct starpu_variable_interface *) data_interface; starpu_free_on_node(node, variable_interface->ptr, variable_interface->elemsize); } static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data) { struct starpu_variable_interface *src_variable = (struct starpu_variable_interface *) src_interface; struct starpu_variable_interface *dst_variable = (struct starpu_variable_interface *) dst_interface; size_t elemsize = dst_variable->elemsize; uintptr_t ptr_src = src_variable->ptr; uintptr_t ptr_dst = dst_variable->ptr; int ret; ret = starpu_interface_copy(ptr_src, 0, src_node, ptr_dst, 0, dst_node, elemsize, async_data); _STARPU_TRACE_DATA_COPY(src_node, dst_node, elemsize); return ret; } static starpu_ssize_t describe(void *data_interface, char *buf, size_t size) { struct starpu_variable_interface *variable = (struct starpu_variable_interface *) data_interface; return snprintf(buf, size, "v%u", (unsigned) variable->elemsize); } starpu-1.2.3+dfsg/src/datawizard/interfaces/vector_filters.c000066400000000000000000000160241320135501600242130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2013, 2016-2017 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include void starpu_vector_filter_block(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nchunks) { struct starpu_vector_interface *vector_father = (struct starpu_vector_interface *) father_interface; struct starpu_vector_interface *vector_child = (struct starpu_vector_interface *) child_interface; uint32_t nx = vector_father->nx; size_t elemsize = vector_father->elemsize; STARPU_ASSERT_MSG(nchunks <= nx, "%u parts for %u elements", nchunks, nx); uint32_t child_nx; size_t offset; _starpu_filter_nparts_compute_chunk_size_and_offset(nx, nchunks, elemsize, id, 1, &child_nx, &offset); STARPU_ASSERT_MSG(vector_father->id == STARPU_VECTOR_INTERFACE_ID, "%s can only be applied on a vector data", __func__); vector_child->id = vector_father->id; vector_child->nx = child_nx; vector_child->elemsize = elemsize; if (vector_father->dev_handle) { if (vector_father->ptr) vector_child->ptr = vector_father->ptr + offset; vector_child->dev_handle = vector_father->dev_handle; vector_child->offset = vector_father->offset + offset; } } void starpu_vector_filter_block_shadow(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nchunks) { struct starpu_vector_interface *vector_father = (struct starpu_vector_interface *) father_interface; struct starpu_vector_interface *vector_child = (struct starpu_vector_interface *) child_interface; uintptr_t shadow_size = (uintptr_t) f->filter_arg_ptr; /* actual number of elements */ uint32_t nx = vector_father->nx - 2 * shadow_size; size_t elemsize = vector_father->elemsize; STARPU_ASSERT_MSG(nchunks <= nx, "%u parts for %u elements", nchunks, nx); uint32_t child_nx; size_t offset; _starpu_filter_nparts_compute_chunk_size_and_offset(nx, nchunks, elemsize, id, 1, &child_nx, &offset); child_nx += 2*shadow_size; STARPU_ASSERT_MSG(vector_father->id == STARPU_VECTOR_INTERFACE_ID, "%s can only be applied on a vector data", __func__); vector_child->id = vector_father->id; vector_child->nx = child_nx; vector_child->elemsize = elemsize; if (vector_father->dev_handle) { if (vector_father->ptr) vector_child->ptr = vector_father->ptr + offset; vector_child->dev_handle = vector_father->dev_handle; vector_child->offset = vector_father->offset + offset; } } void starpu_vector_filter_divide_in_2(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, STARPU_ATTRIBUTE_UNUSED unsigned nchunks) { /* there cannot be more than 2 chunks */ STARPU_ASSERT_MSG(id < 2, "Only %u parts", id); struct starpu_vector_interface *vector_father = (struct starpu_vector_interface *) father_interface; struct starpu_vector_interface *vector_child = (struct starpu_vector_interface *) child_interface; uint32_t length_first = f->filter_arg; uint32_t nx = vector_father->nx; size_t elemsize = vector_father->elemsize; STARPU_ASSERT_MSG(length_first < nx, "First part is too long: %u vs %u", length_first, nx); STARPU_ASSERT_MSG(vector_father->id == STARPU_VECTOR_INTERFACE_ID, "%s can only be applied on a vector data", __func__); vector_child->id = vector_father->id; /* this is the first child */ if (id == 0) { vector_child->nx = length_first; vector_child->elemsize = elemsize; if (vector_father->dev_handle) { if (vector_father->ptr) vector_child->ptr = vector_father->ptr; vector_child->offset = vector_father->offset; vector_child->dev_handle = vector_father->dev_handle; } } else /* the second child */ { vector_child->nx = nx - length_first; vector_child->elemsize = elemsize; if (vector_father->dev_handle) { if (vector_father->ptr) vector_child->ptr = vector_father->ptr + length_first*elemsize; vector_child->offset = vector_father->offset + length_first*elemsize; vector_child->dev_handle = vector_father->dev_handle; } } } void starpu_vector_filter_list_long(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, STARPU_ATTRIBUTE_UNUSED unsigned nchunks) { struct starpu_vector_interface *vector_father = (struct starpu_vector_interface *) father_interface; struct starpu_vector_interface *vector_child = (struct starpu_vector_interface *) child_interface; long *length_tab = (long *) f->filter_arg_ptr; size_t elemsize = vector_father->elemsize; long chunk_size = length_tab[id]; STARPU_ASSERT_MSG(vector_father->id == STARPU_VECTOR_INTERFACE_ID, "%s can only be applied on a vector data", __func__); vector_child->id = vector_father->id; vector_child->nx = chunk_size; vector_child->elemsize = elemsize; if (vector_father->dev_handle) { /* compute the current position */ unsigned current_pos = 0; unsigned i; for (i = 0; i < id; i++) current_pos += length_tab[i]; if (vector_father->ptr) vector_child->ptr = vector_father->ptr + current_pos*elemsize; vector_child->offset = vector_father->offset + current_pos*elemsize; vector_child->dev_handle = vector_father->dev_handle; } } void starpu_vector_filter_list(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, STARPU_ATTRIBUTE_UNUSED unsigned nchunks) { struct starpu_vector_interface *vector_father = (struct starpu_vector_interface *) father_interface; struct starpu_vector_interface *vector_child = (struct starpu_vector_interface *) child_interface; uint32_t *length_tab = (uint32_t *) f->filter_arg_ptr; size_t elemsize = vector_father->elemsize; uint32_t chunk_size = length_tab[id]; STARPU_ASSERT_MSG(vector_father->id == STARPU_VECTOR_INTERFACE_ID, "%s can only be applied on a vector data", __func__); vector_child->id = vector_father->id; vector_child->nx = chunk_size; vector_child->elemsize = elemsize; if (vector_father->dev_handle) { /* compute the current position */ unsigned current_pos = 0; unsigned i; for (i = 0; i < id; i++) current_pos += length_tab[i]; if (vector_father->ptr) vector_child->ptr = vector_father->ptr + current_pos*elemsize; vector_child->offset = vector_father->offset + current_pos*elemsize; vector_child->dev_handle = vector_father->dev_handle; } } starpu-1.2.3+dfsg/src/datawizard/interfaces/vector_interface.c000066400000000000000000000260701320135501600245050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data); static const struct starpu_data_copy_methods vector_copy_data_methods_s = { .any_to_any = copy_any_to_any, }; static void register_vector_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface); static starpu_ssize_t allocate_vector_buffer_on_node(void *data_interface_, unsigned dst_node); static void *vector_handle_to_pointer(starpu_data_handle_t data_handle, unsigned node); static void free_vector_buffer_on_node(void *data_interface, unsigned node); static size_t vector_interface_get_size(starpu_data_handle_t handle); static uint32_t footprint_vector_interface_crc32(starpu_data_handle_t handle); static int vector_compare(void *data_interface_a, void *data_interface_b); static void display_vector_interface(starpu_data_handle_t handle, FILE *f); static int pack_vector_handle(starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count); static int unpack_vector_handle(starpu_data_handle_t handle, unsigned node, void *ptr, size_t count); static starpu_ssize_t describe(void *data_interface, char *buf, size_t size); struct starpu_data_interface_ops starpu_interface_vector_ops = { .register_data_handle = register_vector_handle, .allocate_data_on_node = allocate_vector_buffer_on_node, .handle_to_pointer = vector_handle_to_pointer, .free_data_on_node = free_vector_buffer_on_node, .copy_methods = &vector_copy_data_methods_s, .get_size = vector_interface_get_size, .footprint = footprint_vector_interface_crc32, .compare = vector_compare, .interfaceid = STARPU_VECTOR_INTERFACE_ID, .interface_size = sizeof(struct starpu_vector_interface), .display = display_vector_interface, .pack_data = pack_vector_handle, .unpack_data = unpack_vector_handle, .describe = describe, .name = "STARPU_VECTOR_INTERFACE" }; static void *vector_handle_to_pointer(starpu_data_handle_t handle, unsigned node) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_vector_interface *vector_interface = (struct starpu_vector_interface *) starpu_data_get_interface_on_node(handle, node); return (void*) vector_interface->ptr; } static void register_vector_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface) { struct starpu_vector_interface *vector_interface = (struct starpu_vector_interface *) data_interface; unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct starpu_vector_interface *local_interface = (struct starpu_vector_interface *) starpu_data_get_interface_on_node(handle, node); if (node == home_node) { local_interface->ptr = vector_interface->ptr; local_interface->dev_handle = vector_interface->dev_handle; local_interface->offset = vector_interface->offset; } else { local_interface->ptr = 0; local_interface->dev_handle = 0; local_interface->offset = 0; } local_interface->id = vector_interface->id; local_interface->nx = vector_interface->nx; local_interface->elemsize = vector_interface->elemsize; local_interface->slice_base = vector_interface->slice_base; } } /* declare a new data with the vector interface */ void starpu_vector_data_register(starpu_data_handle_t *handleptr, int home_node, uintptr_t ptr, uint32_t nx, size_t elemsize) { struct starpu_vector_interface vector = { .id = STARPU_VECTOR_INTERFACE_ID, .ptr = ptr, .nx = nx, .elemsize = elemsize, .dev_handle = ptr, .slice_base = 0, .offset = 0 }; #if (!defined(STARPU_SIMGRID) && !defined(STARPU_OPENMP)) if (home_node == STARPU_MAIN_RAM) { STARPU_ASSERT_ACCESSIBLE(ptr); STARPU_ASSERT_ACCESSIBLE(ptr + nx*elemsize - 1); } #endif #ifdef STARPU_USE_SCC _starpu_scc_set_offset_in_shared_memory((void*)vector.ptr, (void**)&(vector.dev_handle), &(vector.offset)); #endif starpu_data_register(handleptr, home_node, &vector, &starpu_interface_vector_ops); } void starpu_vector_ptr_register(starpu_data_handle_t handle, unsigned node, uintptr_t ptr, uintptr_t dev_handle, size_t offset) { struct starpu_vector_interface *vector_interface = starpu_data_get_interface_on_node(handle, node); starpu_data_ptr_register(handle, node); vector_interface->ptr = ptr; vector_interface->dev_handle = dev_handle; vector_interface->offset = offset; } static uint32_t footprint_vector_interface_crc32(starpu_data_handle_t handle) { return starpu_hash_crc32c_be(starpu_vector_get_nx(handle), 0); } static int vector_compare(void *data_interface_a, void *data_interface_b) { struct starpu_vector_interface *vector_a = (struct starpu_vector_interface *) data_interface_a; struct starpu_vector_interface *vector_b = (struct starpu_vector_interface *) data_interface_b; /* Two vectors are considered compatible if they have the same size */ return (vector_a->nx == vector_b->nx) && (vector_a->elemsize == vector_b->elemsize); } static void display_vector_interface(starpu_data_handle_t handle, FILE *f) { struct starpu_vector_interface *vector_interface = (struct starpu_vector_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); fprintf(f, "%u\t", vector_interface->nx); } static int pack_vector_handle(starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_vector_interface *vector_interface = (struct starpu_vector_interface *) starpu_data_get_interface_on_node(handle, node); *count = vector_interface->nx*vector_interface->elemsize; if (ptr != NULL) { starpu_malloc_flags(ptr, *count, 0); memcpy(*ptr, (void*)vector_interface->ptr, vector_interface->elemsize*vector_interface->nx); } return 0; } static int unpack_vector_handle(starpu_data_handle_t handle, unsigned node, void *ptr, size_t count) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_vector_interface *vector_interface = (struct starpu_vector_interface *) starpu_data_get_interface_on_node(handle, node); STARPU_ASSERT(count == vector_interface->elemsize * vector_interface->nx); memcpy((void*)vector_interface->ptr, ptr, count); return 0; } static size_t vector_interface_get_size(starpu_data_handle_t handle) { size_t size; struct starpu_vector_interface *vector_interface = (struct starpu_vector_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(vector_interface->id == STARPU_VECTOR_INTERFACE_ID, "Error. The given data is not a vector."); #endif size = vector_interface->nx*vector_interface->elemsize; return size; } /* offer an access to the data parameters */ uint32_t starpu_vector_get_nx(starpu_data_handle_t handle) { struct starpu_vector_interface *vector_interface = (struct starpu_vector_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(vector_interface->id == STARPU_VECTOR_INTERFACE_ID, "Error. The given data is not a vector."); #endif return vector_interface->nx; } uintptr_t starpu_vector_get_local_ptr(starpu_data_handle_t handle) { unsigned node; node = _starpu_memory_node_get_local_key(); STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_vector_interface *vector_interface = (struct starpu_vector_interface *) starpu_data_get_interface_on_node(handle, node); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(vector_interface->id == STARPU_VECTOR_INTERFACE_ID, "Error. The given data is not a vector."); #endif return vector_interface->ptr; } size_t starpu_vector_get_elemsize(starpu_data_handle_t handle) { struct starpu_vector_interface *vector_interface = (struct starpu_vector_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(vector_interface->id == STARPU_VECTOR_INTERFACE_ID, "Error. The given data is not a vector."); #endif return vector_interface->elemsize; } /* memory allocation/deallocation primitives for the vector interface */ /* returns the size of the allocated area */ static starpu_ssize_t allocate_vector_buffer_on_node(void *data_interface_, unsigned dst_node) { uintptr_t addr = 0, handle; struct starpu_vector_interface *vector_interface = (struct starpu_vector_interface *) data_interface_; uint32_t nx = vector_interface->nx; size_t elemsize = vector_interface->elemsize; starpu_ssize_t allocated_memory; handle = starpu_malloc_on_node(dst_node, nx*elemsize); if (!handle) return -ENOMEM; if (starpu_node_get_kind(dst_node) != STARPU_OPENCL_RAM) addr = handle; allocated_memory = nx*elemsize; /* update the data properly in consequence */ vector_interface->ptr = addr; vector_interface->dev_handle = handle; vector_interface->offset = 0; return allocated_memory; } static void free_vector_buffer_on_node(void *data_interface, unsigned node) { struct starpu_vector_interface *vector_interface = (struct starpu_vector_interface *) data_interface; uint32_t nx = vector_interface->nx; size_t elemsize = vector_interface->elemsize; starpu_free_on_node(node, vector_interface->dev_handle, nx*elemsize); } static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data) { struct starpu_vector_interface *src_vector = src_interface; struct starpu_vector_interface *dst_vector = dst_interface; int ret; ret = starpu_interface_copy(src_vector->dev_handle, src_vector->offset, src_node, dst_vector->dev_handle, dst_vector->offset, dst_node, src_vector->nx*src_vector->elemsize, async_data); _STARPU_TRACE_DATA_COPY(src_node, dst_node, src_vector->nx*src_vector->elemsize); return ret; } static starpu_ssize_t describe(void *data_interface, char *buf, size_t size) { struct starpu_vector_interface *vector = (struct starpu_vector_interface *) data_interface; return snprintf(buf, size, "V%ux%u", (unsigned) vector->nx, (unsigned) vector->elemsize); } starpu-1.2.3+dfsg/src/datawizard/interfaces/void_interface.c000066400000000000000000000116641320135501600241470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2014 Université de Bordeaux * Copyright (C) 2011, 2012, 2013, 2014, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include static int dummy_copy(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data); static const struct starpu_data_copy_methods void_copy_data_methods_s = { .any_to_any = dummy_copy, }; static void register_void_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface); static starpu_ssize_t allocate_void_buffer_on_node(void *data_interface_, unsigned dst_node); static void free_void_buffer_on_node(void *data_interface, unsigned node); static size_t void_interface_get_size(starpu_data_handle_t handle); static uint32_t footprint_void_interface_crc32(starpu_data_handle_t handle); static int void_compare(void *data_interface_a, void *data_interface_b); static void display_void_interface(starpu_data_handle_t handle, FILE *f); static int pack_void_handle(starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count); static int unpack_void_handle(starpu_data_handle_t handle, unsigned node, void *ptr, size_t count); static starpu_ssize_t describe(void *data_interface, char *buf, size_t size); struct starpu_data_interface_ops starpu_interface_void_ops = { .register_data_handle = register_void_handle, .allocate_data_on_node = allocate_void_buffer_on_node, .free_data_on_node = free_void_buffer_on_node, .copy_methods = &void_copy_data_methods_s, .get_size = void_interface_get_size, .footprint = footprint_void_interface_crc32, .compare = void_compare, .interfaceid = STARPU_VOID_INTERFACE_ID, .interface_size = 0, .display = display_void_interface, .pack_data = pack_void_handle, .unpack_data = unpack_void_handle, .describe = describe, .name = "STARPU_VOID_INTERFACE" }; static void register_void_handle(starpu_data_handle_t handle STARPU_ATTRIBUTE_UNUSED, unsigned home_node STARPU_ATTRIBUTE_UNUSED, void *data_interface STARPU_ATTRIBUTE_UNUSED) { /* Since there is no real data to register, we don't do anything */ } /* declare a new data with the void interface */ void starpu_void_data_register(starpu_data_handle_t *handleptr) { starpu_data_register(handleptr, STARPU_MAIN_RAM, NULL, &starpu_interface_void_ops); } static uint32_t footprint_void_interface_crc32(starpu_data_handle_t handle STARPU_ATTRIBUTE_UNUSED) { return 0; } static int void_compare(void *data_interface_a STARPU_ATTRIBUTE_UNUSED, void *data_interface_b STARPU_ATTRIBUTE_UNUSED) { /* There is no allocation required, and therefore nothing to cache * anyway. */ return 1; } static void display_void_interface(starpu_data_handle_t handle STARPU_ATTRIBUTE_UNUSED, FILE *f) { fprintf(f, "void\t"); } static int pack_void_handle(starpu_data_handle_t handle STARPU_ATTRIBUTE_UNUSED, unsigned node STARPU_ATTRIBUTE_UNUSED, void **ptr, starpu_ssize_t *count) { *count = 0; *ptr = NULL; return 0; } static int unpack_void_handle(starpu_data_handle_t handle STARPU_ATTRIBUTE_UNUSED, unsigned node STARPU_ATTRIBUTE_UNUSED, void *ptr STARPU_ATTRIBUTE_UNUSED, size_t count STARPU_ATTRIBUTE_UNUSED) { return 0; } static size_t void_interface_get_size(starpu_data_handle_t handle STARPU_ATTRIBUTE_UNUSED) { return 0; } /* memory allocation/deallocation primitives for the void interface */ /* returns the size of the allocated area */ static starpu_ssize_t allocate_void_buffer_on_node(void *data_interface STARPU_ATTRIBUTE_UNUSED, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { /* Successfuly allocated 0 bytes */ return 0; } static void free_void_buffer_on_node(void *data_interface STARPU_ATTRIBUTE_UNUSED , unsigned node STARPU_ATTRIBUTE_UNUSED) { /* There is no buffer actually */ } static int dummy_copy(void *src_interface STARPU_ATTRIBUTE_UNUSED, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface STARPU_ATTRIBUTE_UNUSED, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, void *async_data STARPU_ATTRIBUTE_UNUSED) { return 0; } static starpu_ssize_t describe(void *data_interface STARPU_ATTRIBUTE_UNUSED, char *buf, size_t size) { return snprintf(buf, size, "0"); } starpu-1.2.3+dfsg/src/datawizard/malloc.c000066400000000000000000000747351320135501600203220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2010, 2012-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include #ifdef STARPU_SIMGRID #include #include #include #endif #ifndef O_BINARY #define O_BINARY 0 #endif #ifndef MAP_POPULATE #define MAP_POPULATE 0 #endif static size_t _malloc_align = sizeof(void*); static int disable_pinning; static int malloc_on_node_default_flags[STARPU_MAXNODES]; /* This file is used for implementing "folded" allocation */ #ifdef STARPU_SIMGRID #if SIMGRID_VERSION_MAJOR < 3 || (SIMGRID_VERSION_MAJOR == 3 && SIMGRID_VERSION_MINOR < 15) /* TODO: drop when simgrid 3.15 is reasonably largely used by people who need the feature */ static int bogusfile = -1; static unsigned long _starpu_malloc_simulation_fold; #endif #endif void starpu_malloc_set_align(size_t align) { STARPU_ASSERT_MSG(!(align & (align - 1)), "Alignment given to starpu_malloc_set_align (%lu) must be a power of two", (unsigned long) align); if (_malloc_align < align) _malloc_align = align; } #if (defined(STARPU_USE_CUDA) && !defined(HAVE_CUDA_MEMCPY_PEER))// || defined(STARPU_USE_OPENCL) struct malloc_pinned_codelet_struct { void **ptr; size_t dim; }; #endif /* Would be difficult to do it this way, we need to remember the cl_mem to be able to free it later... */ //#ifdef STARPU_USE_OPENCL //static void malloc_pinned_opencl_codelet(void *buffers[] STARPU_ATTRIBUTE_UNUSED, void *arg) //{ // struct malloc_pinned_codelet_struct *s = arg; // // _STARPU_MALLOC(*(s->ptr), s->dim); // starpu_opencl_allocate_memory(devid, (void **)(s->ptr), s->dim, CL_MEM_READ_WRITE|CL_MEM_ALLOC_HOST_PTR); //} //#endif #if defined(STARPU_USE_CUDA) && !defined(HAVE_CUDA_MEMCPY_PEER) && !defined(STARPU_SIMGRID) static void malloc_pinned_cuda_codelet(void *buffers[] STARPU_ATTRIBUTE_UNUSED, void *arg) { struct malloc_pinned_codelet_struct *s = arg; cudaError_t cures; cures = cudaHostAlloc((void **)(s->ptr), s->dim, cudaHostAllocPortable); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); } #endif #if (defined(STARPU_USE_CUDA) && !defined(HAVE_CUDA_MEMCPY_PEER)) && !defined(STARPU_SIMGRID)// || defined(STARPU_USE_OPENCL) static struct starpu_perfmodel malloc_pinned_model = { .type = STARPU_HISTORY_BASED, .symbol = "malloc_pinned" }; static struct starpu_codelet malloc_pinned_cl = { .cuda_funcs = {malloc_pinned_cuda_codelet}, //#ifdef STARPU_USE_OPENCL // .opencl_funcs = {malloc_pinned_opencl_codelet}, //#endif .nbuffers = 0, .model = &malloc_pinned_model }; #endif int starpu_malloc_flags(void **A, size_t dim, int flags) { int ret=0; STARPU_ASSERT(A); if (flags & STARPU_MALLOC_COUNT) { if (!(flags & STARPU_MALLOC_NORECLAIM)) while (starpu_memory_allocate(STARPU_MAIN_RAM, dim, flags) != 0) { size_t freed; size_t reclaim = 2 * dim; _STARPU_DEBUG("There is not enough memory left, we are going to reclaim %ld\n", (long)reclaim); _STARPU_TRACE_START_MEMRECLAIM(STARPU_MAIN_RAM,0); freed = _starpu_memory_reclaim_generic(STARPU_MAIN_RAM, 0, reclaim); _STARPU_TRACE_END_MEMRECLAIM(STARPU_MAIN_RAM,0); if (freed < dim && !(flags & STARPU_MEMORY_WAIT)) { // We could not reclaim enough memory *A = NULL; return -ENOMEM; } } else if (flags & STARPU_MEMORY_WAIT) starpu_memory_allocate(STARPU_MAIN_RAM, dim, flags); else starpu_memory_allocate(STARPU_MAIN_RAM, dim, flags | STARPU_MEMORY_OVERFLOW); } struct _starpu_machine_config *config = _starpu_get_machine_config(); if (flags & STARPU_MALLOC_PINNED && disable_pinning <= 0 && STARPU_RUNNING_ON_VALGRIND == 0 && config->conf.ncuda != 0) { #ifdef STARPU_SIMGRID /* FIXME: CUDA seems to be taking 650µs every 1MiB. * Ideally we would simulate this batching in 1MiB requests * instead of computing an average value. */ if (_starpu_simgrid_cuda_malloc_cost()) MSG_process_sleep((float) dim * 0.000650 / 1048576.); #else /* STARPU_SIMGRID */ if (_starpu_can_submit_cuda_task()) { #ifdef STARPU_USE_CUDA #ifdef HAVE_CUDA_MEMCPY_PEER cudaError_t cures; cures = cudaHostAlloc(A, dim, cudaHostAllocPortable); if (STARPU_UNLIKELY(cures)) { STARPU_CUDA_REPORT_ERROR(cures); ret = -ENOMEM; } goto end; #else int push_res; /* Old versions of CUDA are not thread-safe, we have to * run cudaHostAlloc from CUDA workers */ STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "without CUDA peer allocation support, pinned allocation must not be done from task or callback"); struct malloc_pinned_codelet_struct s = { .ptr = A, .dim = dim }; malloc_pinned_cl.where = STARPU_CUDA; struct starpu_task *task = starpu_task_create(); task->name = "cuda_malloc_pinned"; task->callback_func = NULL; task->cl = &malloc_pinned_cl; task->cl_arg = &s; task->synchronous = 1; _starpu_exclude_task_from_dag(task); push_res = _starpu_task_submit_internally(task); STARPU_ASSERT(push_res != -ENODEV); goto end; #endif /* HAVE_CUDA_MEMCPY_PEER */ #endif /* STARPU_USE_CUDA */ } // else if (_starpu_can_submit_opencl_task()) // { //#ifdef STARPU_USE_OPENCL // int push_res; // // STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "pinned OpenCL allocation must not be done from task or callback"); // // struct malloc_pinned_codelet_struct s = // { // .ptr = A, // .dim = dim // }; // // malloc_pinned_cl.where = STARPU_OPENCL; // struct starpu_task *task = starpu_task_create(); // task->name = "opencl_malloc_pinned"; // task->callback_func = NULL; // task->cl = &malloc_pinned_cl; // task->cl_arg = &s; // task->synchronous = 1; // // _starpu_exclude_task_from_dag(task); // // push_res = _starpu_task_submit_internally(task); // STARPU_ASSERT(push_res != -ENODEV); // goto end; //#endif /* STARPU_USE_OPENCL */ // } #endif /* STARPU_SIMGRID */ } #ifdef STARPU_SIMGRID if (flags & STARPU_MALLOC_SIMULATION_FOLDED) { #if SIMGRID_VERSION_MAJOR > 3 || (SIMGRID_VERSION_MAJOR == 3 && SIMGRID_VERSION_MINOR >= 15) *A = SMPI_SHARED_MALLOC(dim); #else /* TODO: drop when simgrid 3.15 is reasonably largely used by people who need the feature */ /* Use "folded" allocation: the same file is mapped several * times contiguously, to get a memory area one can read/write, * without consuming memory */ /* First reserve memory area */ void *buf = mmap (NULL, dim, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); unsigned i; if (buf == MAP_FAILED) { _STARPU_DISP("Warning: could not allocate %luMiB of memory, you need to run \"sysctl vm.overcommit_memory=1\" as root to allow so big allocations\n", (unsigned long) (dim >> 20)); ret = -ENOMEM; *A = NULL; } else { if (bogusfile == -1) { char *path = starpu_getenv("TMPDIR"); if (!path) path = starpu_getenv("TEMP"); if (!path) path = starpu_getenv("TMP"); if (!path) path = "/tmp"; /* Create bogus file if not done already */ char *name = _starpu_mktemp(path, O_RDWR | O_BINARY, &bogusfile); char *dumb; if (!name) { ret = errno; munmap(buf, dim); *A = NULL; goto end; } unlink(name); free(name); _STARPU_CALLOC(dumb, 1,_starpu_malloc_simulation_fold); write(bogusfile, dumb, _starpu_malloc_simulation_fold); free(dumb); } /* Map the bogus file in place of the anonymous memory */ for (i = 0; i < dim / _starpu_malloc_simulation_fold; i++) { void *pos = (void*) ((unsigned long) buf + i * _starpu_malloc_simulation_fold); void *res = mmap(pos, _starpu_malloc_simulation_fold, PROT_READ|PROT_WRITE, MAP_FIXED|MAP_SHARED|MAP_POPULATE, bogusfile, 0); STARPU_ASSERT_MSG(res == pos, "Could not map folded virtual memory (%s). Do you perhaps need to increase the STARPU_MALLOC_SIMULATION_FOLD environment variable or the sysctl vm.max_map_count?", strerror(errno)); } if (dim % _starpu_malloc_simulation_fold) { void *pos = (void*) ((unsigned long) buf + i * _starpu_malloc_simulation_fold); void *res = mmap(pos, dim % _starpu_malloc_simulation_fold, PROT_READ|PROT_WRITE, MAP_FIXED|MAP_SHARED|MAP_POPULATE, bogusfile, 0); STARPU_ASSERT_MSG(res == pos, "Could not map folded virtual memory (%s). Do you perhaps need to increase the STARPU_MALLOC_SIMULATION_FOLD environment variable or the sysctl vm.max_map_count?", strerror(errno)); } *A = buf; } #endif } else #endif if (_starpu_can_submit_scc_task()) { #ifdef STARPU_USE_SCC _starpu_scc_allocate_shared_memory(A, dim); #endif } else #ifdef STARPU_HAVE_POSIX_MEMALIGN if (_malloc_align != sizeof(void*)) { if (posix_memalign(A, _malloc_align, dim)) { ret = -ENOMEM; *A = NULL; } } else #elif defined(STARPU_HAVE_MEMALIGN) if (_malloc_align != sizeof(void*)) { *A = memalign(_malloc_align, dim); if (!*A) ret = -ENOMEM; } else #endif /* STARPU_HAVE_POSIX_MEMALIGN */ { *A = malloc(dim); if (!*A) ret = -ENOMEM; } #if defined(STARPU_SIMGRID) || defined(STARPU_USE_CUDA) end: #endif if (ret == 0) { STARPU_ASSERT_MSG(*A, "Failed to allocated memory of size %lu b\n", (unsigned long)dim); } else if (flags & STARPU_MALLOC_COUNT) { starpu_memory_deallocate(STARPU_MAIN_RAM, dim); } return ret; } int starpu_malloc(void **A, size_t dim) { return starpu_malloc_flags(A, dim, STARPU_MALLOC_PINNED); } #if defined(STARPU_USE_CUDA) && !defined(HAVE_CUDA_MEMCPY_PEER) && !defined(STARPU_SIMGRID) static void free_pinned_cuda_codelet(void *buffers[] STARPU_ATTRIBUTE_UNUSED, void *arg) { cudaError_t cures; cures = cudaFreeHost(arg); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); } #endif //#ifdef STARPU_USE_OPENCL //static void free_pinned_opencl_codelet(void *buffers[] STARPU_ATTRIBUTE_UNUSED, void *arg) //{ // // free(arg); // int err = clReleaseMemObject(arg); // if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); //} //#endif #if defined(STARPU_USE_CUDA) && !defined(HAVE_CUDA_MEMCPY_PEER) && !defined(STARPU_SIMGRID) // || defined(STARPU_USE_OPENCL) static struct starpu_perfmodel free_pinned_model = { .type = STARPU_HISTORY_BASED, .symbol = "free_pinned" }; static struct starpu_codelet free_pinned_cl = { .cuda_funcs = {free_pinned_cuda_codelet}, //#ifdef STARPU_USE_OPENCL // .opencl_funcs = {free_pinned_opencl_codelet}, //#endif .nbuffers = 0, .model = &free_pinned_model }; #endif int starpu_free_flags(void *A, size_t dim, int flags) { #ifndef STARPU_SIMGRID if (flags & STARPU_MALLOC_PINNED && disable_pinning <= 0 && STARPU_RUNNING_ON_VALGRIND == 0) { if (_starpu_can_submit_cuda_task()) { #ifdef STARPU_USE_CUDA #ifndef HAVE_CUDA_MEMCPY_PEER if (!_starpu_is_initialized()) { #endif /* This is especially useful when starpu_free is called from * the GCC-plugin. starpu_shutdown will probably have already * been called, so we will not be able to submit a task. */ cudaError_t err = cudaFreeHost(A); if (STARPU_UNLIKELY(err)) STARPU_CUDA_REPORT_ERROR(err); goto out; #ifndef HAVE_CUDA_MEMCPY_PEER } else { int push_res; STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "without CUDA peer allocation support, pinned deallocation must not be done from task or callback"); free_pinned_cl.where = STARPU_CUDA; struct starpu_task *task = starpu_task_create(); task->name = "cuda_free_pinned"; task->callback_func = NULL; task->cl = &free_pinned_cl; task->cl_arg = A; task->synchronous = 1; _starpu_exclude_task_from_dag(task); push_res = _starpu_task_submit_internally(task); STARPU_ASSERT(push_res != -ENODEV); goto out; } #endif /* HAVE_CUDA_MEMCPY_PEER */ #endif /* STARPU_USE_CUDA */ } // else if (_starpu_can_submit_opencl_task()) // { //#ifdef STARPU_USE_OPENCL // int push_res; // // STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "pinned OpenCL deallocation must not be done from task or callback"); // // free_pinned_cl.where = STARPU_OPENCL; // struct starpu_task *task = starpu_task_create(); // task->name = "opencl_free_pinned"; // task->callback_func = NULL; // task->cl = &free_pinned_cl; // task->cl_arg = A; // task->synchronous = 1; // // _starpu_exclude_task_from_dag(task); // // push_res = starpu_task_submit(task); // STARPU_ASSERT(push_res != -ENODEV); // goto out; // } //#endif } #endif /* STARPU_SIMGRID */ #ifdef STARPU_SIMGRID if (flags & STARPU_MALLOC_SIMULATION_FOLDED) { #if SIMGRID_VERSION_MAJOR > 3 || (SIMGRID_VERSION_MAJOR == 3 && SIMGRID_VERSION_MINOR >= 15) SMPI_SHARED_FREE(A); #else /* TODO: drop when simgrid 3.15 is reasonably largely used by people who need the feature */ munmap(A, dim); #endif } else #endif if (_starpu_can_submit_scc_task()) { #ifdef STARPU_USE_SCC _starpu_scc_free_shared_memory(A); #endif } else free(A); #if !defined(STARPU_SIMGRID) && defined(STARPU_USE_CUDA) out: #endif if (flags & STARPU_MALLOC_COUNT) { starpu_memory_deallocate(STARPU_MAIN_RAM, dim); } return 0; } int starpu_free(void *A) { return starpu_free_flags(A, 0, STARPU_MALLOC_PINNED); } #ifdef STARPU_SIMGRID static starpu_pthread_mutex_t cuda_alloc_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static starpu_pthread_mutex_t opencl_alloc_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; #endif static uintptr_t _starpu_malloc_on_node(unsigned dst_node, size_t size, int flags) { uintptr_t addr = 0; #if defined(STARPU_USE_CUDA) && !defined(STARPU_SIMGRID) cudaError_t status; #endif /* Handle count first */ if (flags & STARPU_MALLOC_COUNT) { if (starpu_memory_allocate(dst_node, size, flags) != 0) return 0; /* And prevent double-count in starpu_malloc_flags */ flags &= ~STARPU_MALLOC_COUNT; } switch(starpu_node_get_kind(dst_node)) { case STARPU_CPU_RAM: { starpu_malloc_flags((void**) &addr, size, #if defined(STARPU_USE_CUDA) && !defined(HAVE_CUDA_MEMCPY_PEER) && !defined(STARPU_SIMGRID) /* without memcpy_peer, we can not * allocated pinned memory, since it * requires waiting for a task, and we * may be called with a spinlock held */ flags & ~STARPU_MALLOC_PINNED #else flags #endif ); break; } #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) case STARPU_CUDA_RAM: { #ifdef STARPU_SIMGRID static uintptr_t last[STARPU_MAXNODES]; #ifdef STARPU_DEVEL #warning TODO: record used memory, using a simgrid property to know the available memory #endif /* Sleep for the allocation */ STARPU_PTHREAD_MUTEX_LOCK(&cuda_alloc_mutex); if (_starpu_simgrid_cuda_malloc_cost()) MSG_process_sleep(0.000175); if (!last[dst_node]) last[dst_node] = 1<<10; addr = last[dst_node]; last[dst_node]+=size; STARPU_ASSERT(last[dst_node] >= addr); STARPU_PTHREAD_MUTEX_UNLOCK(&cuda_alloc_mutex); #else struct _starpu_worker *worker = _starpu_get_local_worker_key(); unsigned devid = _starpu_memory_node_get_devid(dst_node); if (!worker || worker->arch != STARPU_CUDA_WORKER || worker->devid != devid) #if defined(HAVE_CUDA_MEMCPY_PEER) starpu_cuda_set_device(devid); #else STARPU_ASSERT_MSG(0, "CUDA peer access is not available with this version of CUDA"); #endif status = cudaMalloc((void **)&addr, size); if (!addr || (status != cudaSuccess)) { if (STARPU_UNLIKELY(status != cudaErrorMemoryAllocation)) STARPU_CUDA_REPORT_ERROR(status); addr = 0; } #endif break; } #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) case STARPU_OPENCL_RAM: { #ifdef STARPU_SIMGRID static uintptr_t last[STARPU_MAXNODES]; /* Sleep for the allocation */ STARPU_PTHREAD_MUTEX_LOCK(&opencl_alloc_mutex); if (_starpu_simgrid_cuda_malloc_cost()) MSG_process_sleep(0.000175); if (!last[dst_node]) last[dst_node] = 1<<10; addr = last[dst_node]; last[dst_node]+=size; STARPU_ASSERT(last[dst_node] >= addr); STARPU_PTHREAD_MUTEX_UNLOCK(&opencl_alloc_mutex); #else int ret; cl_mem ptr; ret = starpu_opencl_allocate_memory(_starpu_memory_node_get_devid(dst_node), &ptr, size, CL_MEM_READ_WRITE); if (ret) { addr = 0; } else { addr = (uintptr_t)ptr; } #endif break; } #endif case STARPU_DISK_RAM: { addr = (uintptr_t) _starpu_disk_alloc(dst_node, size); break; } #ifdef STARPU_USE_MIC case STARPU_MIC_RAM: if (_starpu_mic_allocate_memory((void **)(&addr), size, dst_node)) addr = 0; break; #endif #ifdef STARPU_USE_SCC case STARPU_SCC_RAM: if (_starpu_scc_allocate_memory((void **)(&addr), size, dst_node)) addr = 0; break; #endif default: STARPU_ABORT(); } if (addr == 0) { // Allocation failed, gives the memory back to the memory manager _STARPU_TRACE_MEMORY_FULL(size); starpu_memory_deallocate(dst_node, size); } return addr; } void _starpu_free_on_node_flags(unsigned dst_node, uintptr_t addr, size_t size, int flags) { int count = flags & STARPU_MALLOC_COUNT; flags &= ~STARPU_MALLOC_COUNT; enum starpu_node_kind kind = starpu_node_get_kind(dst_node); switch(kind) { case STARPU_CPU_RAM: starpu_free_flags((void*)addr, size, #if defined(STARPU_USE_CUDA) && !defined(HAVE_CUDA_MEMCPY_PEER) && !defined(STARPU_SIMGRID) flags & ~STARPU_MALLOC_PINNED #else flags #endif ); break; #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) case STARPU_CUDA_RAM: { #ifdef STARPU_SIMGRID STARPU_PTHREAD_MUTEX_LOCK(&cuda_alloc_mutex); /* Sleep for the free */ if (_starpu_simgrid_cuda_malloc_cost()) MSG_process_sleep(0.000750); STARPU_PTHREAD_MUTEX_UNLOCK(&cuda_alloc_mutex); #else cudaError_t err; struct _starpu_worker *worker = _starpu_get_local_worker_key(); unsigned devid = _starpu_memory_node_get_devid(dst_node); if (!worker || worker->arch != STARPU_CUDA_WORKER || worker->devid != devid) #if defined(HAVE_CUDA_MEMCPY_PEER) starpu_cuda_set_device(devid); #else STARPU_ASSERT_MSG(0, "CUDA peer access is not available with this version of CUDA"); #endif err = cudaFree((void*)addr); if (STARPU_UNLIKELY(err != cudaSuccess #ifdef STARPU_OPENMP /* When StarPU is used as Open Runtime support, * starpu_omp_shutdown() will usually be called from a * destructor, in which case cudaThreadExit() reports a * cudaErrorCudartUnloading here. There should not * be any remaining tasks running at this point so * we can probably ignore it without much consequences. */ && err != cudaErrorCudartUnloading #endif /* STARPU_OPENMP */ )) STARPU_CUDA_REPORT_ERROR(err); #endif break; } #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) case STARPU_OPENCL_RAM: { #ifdef STARPU_SIMGRID STARPU_PTHREAD_MUTEX_LOCK(&opencl_alloc_mutex); /* Sleep for the free */ if (_starpu_simgrid_cuda_malloc_cost()) MSG_process_sleep(0.000750); STARPU_PTHREAD_MUTEX_UNLOCK(&opencl_alloc_mutex); #else cl_int err; err = clReleaseMemObject((void*)addr); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); #endif break; } #endif case STARPU_DISK_RAM: { _starpu_disk_free (dst_node, (void *) addr , size); break; } #ifdef STARPU_USE_MIC case STARPU_MIC_RAM: _starpu_mic_free_memory((void*) addr, size, dst_node); break; #endif #ifdef STARPU_USE_SCC case STARPU_SCC_RAM: _starpu_scc_free_memory((void *) addr, dst_node); break; #endif default: STARPU_ABORT(); } if (count) starpu_memory_deallocate(dst_node, size); } int starpu_memory_pin(void *addr STARPU_ATTRIBUTE_UNUSED, size_t size STARPU_ATTRIBUTE_UNUSED) { if (STARPU_MALLOC_PINNED && disable_pinning <= 0 && STARPU_RUNNING_ON_VALGRIND == 0) { #if defined(STARPU_USE_CUDA) && defined(HAVE_CUDA_MEMCPY_PEER) if (cudaHostRegister(addr, size, cudaHostRegisterPortable) != cudaSuccess) return -1; #endif } return 0; } int starpu_memory_unpin(void *addr STARPU_ATTRIBUTE_UNUSED, size_t size STARPU_ATTRIBUTE_UNUSED) { if (STARPU_MALLOC_PINNED && disable_pinning <= 0 && STARPU_RUNNING_ON_VALGRIND == 0) { #if defined(STARPU_USE_CUDA) && defined(HAVE_CUDA_MEMCPY_PEER) if (cudaHostUnregister(addr) != cudaSuccess) return -1; #endif } return 0; } /* * On CUDA which has very expensive malloc, for small sizes, allocate big * chunks divided in blocks, and we actually allocate segments of consecutive * blocks. * * We try to keep the list of chunks with increasing occupancy, so we can * quickly find free segments to allocate. */ /* Size of each chunk, 32MiB granularity brings 128 chunks to be allocated in * order to fill a 4GiB GPU. */ #define CHUNK_SIZE (32*1024*1024) /* Maximum segment size we will allocate in chunks */ #define CHUNK_ALLOC_MAX (CHUNK_SIZE / 8) /* Granularity of allocation, i.e. block size, StarPU will never allocate less * than this. * 16KiB (i.e. 64x64 float) granularity eats 2MiB RAM for managing a 4GiB GPU. */ #define CHUNK_ALLOC_MIN (16*1024) /* Number of blocks */ #define CHUNK_NBLOCKS (CHUNK_SIZE/CHUNK_ALLOC_MIN) /* Linked list for available segments */ struct block { int length; /* Number of consecutive free blocks */ int next; /* next free segment */ }; /* One chunk */ LIST_TYPE(_starpu_chunk, uintptr_t base; /* Available number of blocks, for debugging */ int available; /* Overestimation of the maximum size of available segments in this chunk */ int available_max; /* Bitmap describing availability of the block */ /* Block 0 is always empty, and is just the head of the free segments list */ struct block bitmap[CHUNK_NBLOCKS+1]; ) /* One list of chunks per node */ static struct _starpu_chunk_list chunks[STARPU_MAXNODES]; /* Number of completely free chunks */ static int nfreechunks[STARPU_MAXNODES]; /* This protects chunks and nfreechunks */ static starpu_pthread_mutex_t chunk_mutex[STARPU_MAXNODES]; void _starpu_malloc_init(unsigned dst_node) { _starpu_chunk_list_init(&chunks[dst_node]); nfreechunks[dst_node] = 0; STARPU_PTHREAD_MUTEX_INIT(&chunk_mutex[dst_node], NULL); disable_pinning = starpu_get_env_number("STARPU_DISABLE_PINNING"); malloc_on_node_default_flags[dst_node] = STARPU_MALLOC_PINNED | STARPU_MALLOC_COUNT; #ifdef STARPU_SIMGRID #if SIMGRID_VERSION_MAJOR < 3 || (SIMGRID_VERSION_MAJOR == 3 && SIMGRID_VERSION_MINOR < 15) /* Reasonably "costless" */ _starpu_malloc_simulation_fold = starpu_get_env_number_default("STARPU_MALLOC_SIMULATION_FOLD", 1) << 20; #endif #endif } void _starpu_malloc_shutdown(unsigned dst_node) { struct _starpu_chunk *chunk, *next_chunk; STARPU_PTHREAD_MUTEX_LOCK(&chunk_mutex[dst_node]); for (chunk = _starpu_chunk_list_begin(&chunks[dst_node]); chunk != _starpu_chunk_list_end(&chunks[dst_node]); chunk = next_chunk) { next_chunk = _starpu_chunk_list_next(chunk); _starpu_free_on_node_flags(dst_node, chunk->base, CHUNK_SIZE, malloc_on_node_default_flags[dst_node]); _starpu_chunk_list_erase(&chunks[dst_node], chunk); free(chunk); } STARPU_PTHREAD_MUTEX_UNLOCK(&chunk_mutex[dst_node]); STARPU_PTHREAD_MUTEX_DESTROY(&chunk_mutex[dst_node]); } /* Create a new chunk */ static struct _starpu_chunk *_starpu_new_chunk(unsigned dst_node, int flags) { struct _starpu_chunk *chunk; uintptr_t base = _starpu_malloc_on_node(dst_node, CHUNK_SIZE, flags); if (!base) return NULL; /* Create a new chunk */ chunk = _starpu_chunk_new(); chunk->base = base; /* First block is just a fake block pointing to the free segments list */ chunk->bitmap[0].length = 0; chunk->bitmap[0].next = 1; /* At first we have only one big segment for the whole chunk */ chunk->bitmap[1].length = CHUNK_NBLOCKS; chunk->bitmap[1].next = -1; chunk->available_max = CHUNK_NBLOCKS; chunk->available = CHUNK_NBLOCKS; return chunk; } uintptr_t starpu_malloc_on_node_flags(unsigned dst_node, size_t size, int flags) { /* Big allocation, allocate normally */ if (size > CHUNK_ALLOC_MAX || starpu_node_get_kind(dst_node) != STARPU_CUDA_RAM) return _starpu_malloc_on_node(dst_node, size, flags); /* Round up allocation to block size */ int nblocks = (size + CHUNK_ALLOC_MIN - 1) / CHUNK_ALLOC_MIN; struct _starpu_chunk *chunk; int prevblock, block; int available_max; struct block *bitmap; STARPU_PTHREAD_MUTEX_LOCK(&chunk_mutex[dst_node]); /* Try to find a big enough segment among the chunks */ for (chunk = _starpu_chunk_list_begin(&chunks[dst_node]); chunk != _starpu_chunk_list_end(&chunks[dst_node]); chunk = _starpu_chunk_list_next(chunk)) { if (chunk->available_max < nblocks) continue; bitmap = chunk->bitmap; available_max = 0; for (prevblock = block = 0; block != -1; prevblock = block, block = bitmap[prevblock].next) { STARPU_ASSERT(block >= 0 && block <= CHUNK_NBLOCKS); int length = bitmap[block].length; if (length >= nblocks) { if (length >= 2*nblocks) { /* This one this has quite some room, * put it front, to make finding it * easier next time. */ _starpu_chunk_list_erase(&chunks[dst_node], chunk); _starpu_chunk_list_push_front(&chunks[dst_node], chunk); } if (chunk->available == CHUNK_NBLOCKS) /* This one was empty, it's not empty any more */ nfreechunks[dst_node]--; goto found; } if (length > available_max) available_max = length; } /* Didn't find a big enough segment in this chunk, its * available_max is out of date */ chunk->available_max = available_max; } /* Didn't find a big enough segment, create another chunk. */ chunk = _starpu_new_chunk(dst_node, flags); if (!chunk) { /* Really no memory any more, fail */ STARPU_PTHREAD_MUTEX_UNLOCK(&chunk_mutex[dst_node]); errno = ENOMEM; return 0; } /* And make it easy to find. */ _starpu_chunk_list_push_front(&chunks[dst_node], chunk); bitmap = chunk->bitmap; prevblock = 0; block = 1; found: chunk->available -= nblocks; STARPU_ASSERT(bitmap[block].length >= nblocks); STARPU_ASSERT(block <= CHUNK_NBLOCKS); if (bitmap[block].length == nblocks) { /* Fits exactly, drop this segment from the skip list */ bitmap[prevblock].next = bitmap[block].next; } else { /* Still some room */ STARPU_ASSERT(block + nblocks <= CHUNK_NBLOCKS); bitmap[prevblock].next = block + nblocks; bitmap[block + nblocks].length = bitmap[block].length - nblocks; bitmap[block + nblocks].next = bitmap[block].next; } STARPU_PTHREAD_MUTEX_UNLOCK(&chunk_mutex[dst_node]); return chunk->base + (block-1) * CHUNK_ALLOC_MIN; } void starpu_free_on_node_flags(unsigned dst_node, uintptr_t addr, size_t size, int flags) { /* Big allocation, deallocate normally */ if (size > CHUNK_ALLOC_MAX || starpu_node_get_kind(dst_node) != STARPU_CUDA_RAM) { _starpu_free_on_node_flags(dst_node, addr, size, flags); return; } struct _starpu_chunk *chunk; /* Round up allocation to block size */ int nblocks = (size + CHUNK_ALLOC_MIN - 1) / CHUNK_ALLOC_MIN; STARPU_PTHREAD_MUTEX_LOCK(&chunk_mutex[dst_node]); for (chunk = _starpu_chunk_list_begin(&chunks[dst_node]); chunk != _starpu_chunk_list_end(&chunks[dst_node]); chunk = _starpu_chunk_list_next(chunk)) if (addr >= chunk->base && addr < chunk->base + CHUNK_SIZE) break; STARPU_ASSERT(chunk != _starpu_chunk_list_end(&chunks[dst_node])); struct block *bitmap = chunk->bitmap; int block = ((addr - chunk->base) / CHUNK_ALLOC_MIN) + 1, prevblock, nextblock; /* Look for free segment just before this one */ for (prevblock = 0; prevblock != -1; prevblock = nextblock) { STARPU_ASSERT(prevblock >= 0 && prevblock <= CHUNK_NBLOCKS); nextblock = bitmap[prevblock].next; STARPU_ASSERT_MSG(nextblock != block, "It seems data 0x%lx (size %u) on node %u is being freed a second time\n", (unsigned long) addr, (unsigned) size, dst_node); if (nextblock > block || nextblock == -1) break; } STARPU_ASSERT(prevblock != -1); chunk->available += nblocks; /* Insert in free segments list */ bitmap[block].next = nextblock; bitmap[prevblock].next = block; bitmap[block].length = nblocks; STARPU_ASSERT(nextblock >= -1 && nextblock <= CHUNK_NBLOCKS); if (nextblock == block + nblocks) { /* This freed segment is just before a free segment, merge them */ bitmap[block].next = bitmap[nextblock].next; bitmap[block].length += bitmap[nextblock].length; if (bitmap[block].length > chunk->available_max) chunk->available_max = bitmap[block].length; } if (prevblock > 0 && prevblock + bitmap[prevblock].length == block) { /* This free segment is just after a free segment, merge them */ bitmap[prevblock].next = bitmap[block].next; bitmap[prevblock].length += bitmap[block].length; if (bitmap[prevblock].length > chunk->available_max) chunk->available_max = bitmap[prevblock].length; block = prevblock; } if (chunk->available == CHUNK_NBLOCKS) { /* This chunk is now empty, but avoid chunk free/alloc * ping-pong by keeping some of these. */ if (nfreechunks[dst_node] >= 1) { /* We already have free chunks, release this one */ _starpu_free_on_node_flags(dst_node, chunk->base, CHUNK_SIZE, flags); _starpu_chunk_list_erase(&chunks[dst_node], chunk); free(chunk); } else nfreechunks[dst_node]++; } else { /* Freed some room, put this first in chunks list */ _starpu_chunk_list_erase(&chunks[dst_node], chunk); _starpu_chunk_list_push_front(&chunks[dst_node], chunk); } STARPU_PTHREAD_MUTEX_UNLOCK(&chunk_mutex[dst_node]); } void starpu_malloc_on_node_set_default_flags(unsigned node, int flags) { STARPU_ASSERT_MSG(node < STARPU_MAXNODES, "bogus node value %u given to starpu_malloc_on_node_set_default_flags\n", node); malloc_on_node_default_flags[node] = flags; } uintptr_t starpu_malloc_on_node(unsigned dst_node, size_t size) { return starpu_malloc_on_node_flags(dst_node, size, malloc_on_node_default_flags[dst_node]); } void starpu_free_on_node(unsigned dst_node, uintptr_t addr, size_t size) { starpu_free_on_node_flags(dst_node, addr, size, malloc_on_node_default_flags[dst_node]); } starpu-1.2.3+dfsg/src/datawizard/malloc.h000066400000000000000000000015501320135501600203100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __ALLOC_H__ #define __ALLOC_H__ void _starpu_malloc_init(unsigned dst_node); void _starpu_malloc_shutdown(unsigned dst_node); void _starpu_free_on_node(unsigned dst_node, uintptr_t addr, size_t size); #endif starpu-1.2.3+dfsg/src/datawizard/memalloc.c000066400000000000000000001351511320135501600206320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * Copyright (C) 2016 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include /* Minimum percentage of available memory in each node */ static unsigned minimum_p; static unsigned target_p; /* Minimum percentage of number of clean buffer in each node */ static unsigned minimum_clean_p; static unsigned target_clean_p; /* Whether CPU memory has been explicitly limited by user */ static int limit_cpu_mem; /* This per-node RW-locks protect mc_list and memchunk_cache entries */ /* Note: handle header lock is always taken before this (normal add/remove case) */ static struct _starpu_spinlock mc_lock[STARPU_MAXNODES]; /* Potentially in use memory chunks. The beginning of the list is clean (home * node has a copy of the data, or the data is being transferred there), the * remainder of the list may not be clean. */ static struct _starpu_mem_chunk_list mc_list[STARPU_MAXNODES]; /* This is a shortcut inside the mc_list to the first potentially dirty MC. All * MC before this are clean, MC before this only *may* be clean. */ static struct _starpu_mem_chunk *mc_dirty_head[STARPU_MAXNODES]; /* Number of elements in mc_list, number of elements in the clean part of * mc_list plus the non-automatically allocated elements (which are thus always * considered as clean) */ static unsigned mc_nb[STARPU_MAXNODES], mc_clean_nb[STARPU_MAXNODES]; /* TODO: no home doesn't mean always clean, should push to larger memory nodes */ #define MC_LIST_PUSH_BACK(node, mc) do { \ _starpu_mem_chunk_list_push_back(&mc_list[node], mc); \ if ((mc)->clean || (mc)->home) \ /* This is clean */ \ mc_clean_nb[node]++; \ else if (!mc_dirty_head[node]) \ /* This is the only dirty element for now */ \ mc_dirty_head[node] = mc; \ mc_nb[node]++; \ } while(0) /* Put new clean mc at the end of the clean part of mc_list, i.e. just before mc_dirty_head (if any) */ #define MC_LIST_PUSH_CLEAN(node, mc) do { \ if (mc_dirty_head[node]) \ _starpu_mem_chunk_list_insert_before(&mc_list[node], mc, mc_dirty_head[node]); \ else \ _starpu_mem_chunk_list_push_back(&mc_list[node], mc); \ /* This is clean */ \ mc_clean_nb[node]++; \ mc_nb[node]++; \ } while (0) #define MC_LIST_ERASE(node, mc) do { \ if ((mc)->clean || (mc)->home) \ mc_clean_nb[node]--; /* One clean element less */ \ if ((mc) == mc_dirty_head[node]) \ /* This was the dirty head */ \ mc_dirty_head[node] = _starpu_mem_chunk_list_next((mc)); \ /* One element less */ \ mc_nb[node]--; \ /* Remove element */ \ _starpu_mem_chunk_list_erase(&mc_list[node], (mc)); \ /* Notify whoever asked for it */ \ if ((mc)->remove_notify) \ { \ *((mc)->remove_notify) = NULL; \ (mc)->remove_notify = NULL; \ } \ } while (0) /* Explicitly caches memory chunks that can be reused */ struct mc_cache_entry { UT_hash_handle hh; struct _starpu_mem_chunk_list list; uint32_t footprint; }; static struct mc_cache_entry *mc_cache[STARPU_MAXNODES]; static int mc_cache_nb[STARPU_MAXNODES]; static starpu_ssize_t mc_cache_size[STARPU_MAXNODES]; /* Whether some thread is currently tidying this node */ static unsigned tidying[STARPU_MAXNODES]; /* Whether some thread is currently reclaiming memory for this node */ static unsigned reclaiming[STARPU_MAXNODES]; int _starpu_is_reclaiming(unsigned node) { return tidying[node] || reclaiming[node]; } /* When reclaiming memory to allocate, we reclaim MAX(what_is_to_reclaim_on_device, data_size_coefficient*data_size) */ const unsigned starpu_memstrategy_data_size_coefficient=2; static int get_better_disk_can_accept_size(starpu_data_handle_t handle, unsigned node); static unsigned choose_target(starpu_data_handle_t handle, unsigned node); void _starpu_init_mem_chunk_lists(void) { unsigned i; for (i = 0; i < STARPU_MAXNODES; i++) { _starpu_spin_init(&mc_lock[i]); _starpu_mem_chunk_list_init(&mc_list[i]); STARPU_HG_DISABLE_CHECKING(mc_cache_size[i]); STARPU_HG_DISABLE_CHECKING(mc_nb[i]); STARPU_HG_DISABLE_CHECKING(mc_clean_nb[i]); } minimum_p = starpu_get_env_number_default("STARPU_MINIMUM_AVAILABLE_MEM", 5); target_p = starpu_get_env_number_default("STARPU_TARGET_AVAILABLE_MEM", 10); minimum_clean_p = starpu_get_env_number_default("STARPU_MINIMUM_CLEAN_BUFFERS", 5); target_clean_p = starpu_get_env_number_default("STARPU_TARGET_CLEAN_BUFFERS", 10); limit_cpu_mem = starpu_get_env_number("STARPU_LIMIT_CPU_MEM"); } void _starpu_deinit_mem_chunk_lists(void) { unsigned i; for (i = 0; i < STARPU_MAXNODES; i++) { struct mc_cache_entry *entry, *tmp; STARPU_ASSERT(mc_nb[i] == 0); STARPU_ASSERT(mc_clean_nb[i] == 0); STARPU_ASSERT(mc_dirty_head[i] == NULL); HASH_ITER(hh, mc_cache[i], entry, tmp) { STARPU_ASSERT (_starpu_mem_chunk_list_empty(&entry->list)); HASH_DEL(mc_cache[i], entry); free(entry); } STARPU_ASSERT(mc_cache_nb[i] == 0); STARPU_ASSERT(mc_cache_size[i] == 0); _starpu_spin_destroy(&mc_lock[i]); } } /* * Manipulate subtrees */ static void unlock_all_subtree(starpu_data_handle_t handle) { /* lock all sub-subtrees children * Note that this is done in the reverse order of the * lock_all_subtree so that we avoid deadlock */ unsigned i; for (i =0; i < handle->nchildren; i++) { unsigned child = handle->nchildren - 1 - i; starpu_data_handle_t child_handle = starpu_data_get_child(handle, child); unlock_all_subtree(child_handle); } _starpu_spin_unlock(&handle->header_lock); } static int lock_all_subtree(starpu_data_handle_t handle) { int child; /* lock parent */ if (_starpu_spin_trylock(&handle->header_lock)) /* the handle is busy, abort */ return 0; /* lock all sub-subtrees children */ for (child = 0; child < (int) handle->nchildren; child++) { if (!lock_all_subtree(starpu_data_get_child(handle, child))) { /* Some child is busy, abort */ while (--child >= 0) /* Unlock what we have already uselessly locked */ unlock_all_subtree(starpu_data_get_child(handle, child)); return 0; } } return 1; } static unsigned may_free_subtree(starpu_data_handle_t handle, unsigned node) { /* we only free if no one refers to the leaf */ uint32_t refcnt = _starpu_get_data_refcnt(handle, node); if (refcnt) return 0; if (handle->current_mode == STARPU_W) { if (handle->write_invalidation_req) /* Some request is invalidating it anyway */ return 0; unsigned n; for (n = 0; n < STARPU_MAXNODES; n++) if (_starpu_get_data_refcnt(handle, n)) /* Some task is writing to the handle somewhere */ return 0; } /* look into all sub-subtrees children */ unsigned child; for (child = 0; child < handle->nchildren; child++) { unsigned res; starpu_data_handle_t child_handle = starpu_data_get_child(handle, child); res = may_free_subtree(child_handle, node); if (!res) return 0; } /* no problem was found */ return 1; } /* Warn: this releases the header lock of the handle during the transfer * The handle may thus unexpectedly disappear. This returns 1 in that case. */ static int STARPU_ATTRIBUTE_WARN_UNUSED_RESULT transfer_subtree_to_node(starpu_data_handle_t handle, unsigned src_node, unsigned dst_node) { STARPU_ASSERT(dst_node != src_node); if (handle->nchildren == 0) { struct _starpu_data_replicate *src_replicate = &handle->per_node[src_node]; struct _starpu_data_replicate *dst_replicate = &handle->per_node[dst_node]; /* this is a leaf */ while (src_replicate->state == STARPU_OWNER) { /* This is the only copy, push it to destination */ struct _starpu_data_request *r; r = _starpu_create_request_to_fetch_data(handle, dst_replicate, STARPU_R, 0, 0, NULL, NULL); /* There is no way we don't need a request, since * source is OWNER, destination can't be having it */ STARPU_ASSERT(r); /* Keep the handle alive while we are working on it */ handle->busy_count++; _starpu_spin_unlock(&handle->header_lock); _starpu_wait_data_request_completion(r, 1); _starpu_spin_lock(&handle->header_lock); handle->busy_count--; if (_starpu_data_check_not_busy(handle)) /* Actually disappeared, abort completely */ return -1; if (!may_free_subtree(handle, src_node)) /* Oops, while we released the header lock, a * task got in, abort. */ return 0; } STARPU_ASSERT(may_free_subtree(handle, src_node)); if (src_replicate->state == STARPU_SHARED) { unsigned i; unsigned last = 0; unsigned cnt = 0; /* some other node may have the copy */ _STARPU_TRACE_DATA_INVALIDATE(handle, src_node); src_replicate->state = STARPU_INVALID; /* count the number of copies */ for (i = 0; i < STARPU_MAXNODES; i++) { if (handle->per_node[i].state == STARPU_SHARED) { cnt++; last = i; } } STARPU_ASSERT(cnt > 0); if (cnt == 1) handle->per_node[last].state = STARPU_OWNER; } else STARPU_ASSERT(src_replicate->state == STARPU_INVALID); /* Already dropped by somebody, in which case there is nothing to be done */ } else { /* transfer all sub-subtrees children */ unsigned child; for (child = 0; child < handle->nchildren; child++) { starpu_data_handle_t child_handle = starpu_data_get_child(handle, child); int res = transfer_subtree_to_node(child_handle, src_node, dst_node); if (res == 0) return 0; /* There is no way children have disappeared since we * keep the parent lock held */ STARPU_ASSERT(res != -1); } } /* Success! */ return 1; } static void notify_handle_children(starpu_data_handle_t handle, struct _starpu_data_replicate *replicate, unsigned node) { unsigned child; replicate->allocated = 0; /* XXX why do we need that ? */ replicate->automatically_allocated = 0; for (child = 0; child < handle->nchildren; child++) { /* Notify children that their buffer has been deallocated too */ starpu_data_handle_t child_handle = starpu_data_get_child(handle, child); notify_handle_children(child_handle, &child_handle->per_node[node], node); } } static size_t free_memory_on_node(struct _starpu_mem_chunk *mc, unsigned node) { size_t freed = 0; STARPU_ASSERT(mc->ops); STARPU_ASSERT(mc->ops->free_data_on_node); starpu_data_handle_t handle = mc->data; struct _starpu_data_replicate *replicate = mc->replicate; if (handle) _starpu_spin_checklocked(&handle->header_lock); if (mc->automatically_allocated && (!handle || replicate->refcnt == 0)) { void *data_interface; if (handle) STARPU_ASSERT(replicate->allocated); #if defined(STARPU_USE_CUDA) && defined(HAVE_CUDA_MEMCPY_PEER) && !defined(STARPU_SIMGRID) if (starpu_node_get_kind(node) == STARPU_CUDA_RAM) { /* To facilitate the design of interface, we set the * proper CUDA device in case it is needed. This avoids * having to set it again in the free method of each * interface. */ starpu_cuda_set_device(_starpu_memory_node_get_devid(node)); } #endif if (handle) data_interface = replicate->data_interface; else data_interface = mc->chunk_interface; STARPU_ASSERT(data_interface); if (handle && node == STARPU_MAIN_RAM) _starpu_data_unregister_ram_pointer(handle); _STARPU_TRACE_START_FREE(node, mc->size); mc->ops->free_data_on_node(data_interface, node); _STARPU_TRACE_END_FREE(node); if (handle) notify_handle_children(handle, replicate, node); freed = mc->size; if (handle) STARPU_ASSERT(replicate->refcnt == 0); } return freed; } /* mc_lock is held */ static size_t do_free_mem_chunk(struct _starpu_mem_chunk *mc, unsigned node) { size_t size; starpu_data_handle_t handle = mc->data; if (handle) { _starpu_spin_checklocked(&handle->header_lock); mc->size = _starpu_data_get_size(handle); } if (mc->replicate) mc->replicate->mc=NULL; /* free the actual buffer */ size = free_memory_on_node(mc, node); /* remove the mem_chunk from the list */ MC_LIST_ERASE(node, mc); _starpu_mem_chunk_delete(mc); return size; } /* This function is called for memory chunks that are possibly in used (ie. not * in the cache). They should therefore still be associated to a handle. */ /* mc_lock is held and may be temporarily released! */ static size_t try_to_free_mem_chunk(struct _starpu_mem_chunk *mc, unsigned node) { size_t freed = 0; starpu_data_handle_t handle; handle = mc->data; STARPU_ASSERT(handle); /* This data should be written through to this node, avoid dropping it! */ if (handle->wt_mask & (1<home_node) return 0; /* REDUX memchunk */ if (mc->relaxed_coherency == 2) { /* TODO: reduce it back to e.g. main memory */ } else /* Either it's a "relaxed coherency" memchunk (SCRATCH), or it's a * memchunk that could be used with filters. */ if (mc->relaxed_coherency == 1) { STARPU_ASSERT(mc->replicate); if (_starpu_spin_trylock(&handle->header_lock)) /* Handle is busy, abort */ return 0; if (mc->replicate->refcnt == 0) { /* Note that there is no need to transfer any data or * to update the status in terms of MSI protocol * because this memchunk is associated to a replicate * in "relaxed coherency" mode. */ freed = do_free_mem_chunk(mc, node); } _starpu_spin_unlock(&handle->header_lock); } /* try to lock all the subtree */ else if (lock_all_subtree(handle)) { /* check if they are all "free" */ if (may_free_subtree(handle, node)) { int target = -1; /* XXX Considering only owner to invalidate */ STARPU_ASSERT(handle->per_node[node].refcnt == 0); /* in case there was nobody using that buffer, throw it * away after writing it back to main memory */ /* choose the best target */ target = choose_target(handle, node); if (target != -1) { int res; /* Should have been avoided in our caller */ STARPU_ASSERT(!mc->remove_notify); mc->remove_notify = &mc; _starpu_spin_unlock(&mc_lock[node]); #ifdef STARPU_MEMORY_STATS if (handle->per_node[node].state == STARPU_OWNER) _starpu_memory_handle_stats_invalidated(handle, node); #endif _STARPU_TRACE_START_WRITEBACK(node); /* Note: this may need to allocate data etc. * and thus release the header lock, take * mc_lock, etc. */ res = transfer_subtree_to_node(handle, node, target); _STARPU_TRACE_END_WRITEBACK(node); #ifdef STARPU_MEMORY_STATS _starpu_memory_handle_stats_loaded_owner(handle, target); #endif _starpu_spin_lock(&mc_lock[node]); if (!mc) { if (res == -1) { /* handle disappeared, abort without unlocking it */ return 0; } } else { STARPU_ASSERT(mc->remove_notify == &mc); mc->remove_notify = NULL; if (res == -1) { /* handle disappeared, abort without unlocking it */ return 0; } if (res == 1) { /* mc is still associated with the old * handle, now free it. */ if (handle->per_node[node].refcnt == 0) { /* And still nobody on it, now the actual buffer may be freed */ freed = do_free_mem_chunk(mc, node); } } } } } /* unlock the tree */ unlock_all_subtree(handle); } return freed; } #ifdef STARPU_USE_ALLOCATION_CACHE /* We assume that mc_lock[node] is taken. is_already_in_mc_list indicates * that the mc is already in the list of buffers that are possibly used, and * therefore not in the cache. */ static void reuse_mem_chunk(unsigned node, struct _starpu_data_replicate *new_replicate, struct _starpu_mem_chunk *mc, unsigned is_already_in_mc_list) { void *data_interface; /* we found an appropriate mem chunk: so we get it out * of the "to free" list, and reassign it to the new * piece of data */ struct _starpu_data_replicate *old_replicate = mc->replicate; if (old_replicate) { if (node == STARPU_MAIN_RAM) _starpu_data_unregister_ram_pointer(old_replicate->handle); old_replicate->allocated = 0; old_replicate->automatically_allocated = 0; old_replicate->initialized = 0; data_interface = old_replicate->data_interface; } else data_interface = mc->chunk_interface; STARPU_ASSERT(new_replicate->data_interface); STARPU_ASSERT(data_interface); memcpy(new_replicate->data_interface, data_interface, mc->size_interface); if (!old_replicate) { /* Free the copy that we made */ free(mc->chunk_interface); mc->chunk_interface = NULL; } /* XXX: We do not actually reuse the mc at the moment, only the interface */ /* mc->data = new_replicate->handle; */ /* mc->footprint, mc->ops, mc->size_interface, mc->automatically_allocated should be * unchanged ! */ /* remove the mem chunk from the list of active memory chunks, register_mem_chunk will put it back later */ if (is_already_in_mc_list) MC_LIST_ERASE(node, mc); free(mc); } /* mc_lock is held and may be temporarily released! */ static unsigned try_to_reuse_mem_chunk(struct _starpu_mem_chunk *mc, unsigned node, struct _starpu_data_replicate *replicate, unsigned is_already_in_mc_list) { unsigned success = 0; starpu_data_handle_t old_data; old_data = mc->data; STARPU_ASSERT(old_data); /* try to lock all the subtree */ /* and check if they are all "free" */ if (lock_all_subtree(old_data)) { if (may_free_subtree(old_data, node)) { int res; /* Should have been avoided in our caller */ STARPU_ASSERT(!mc->remove_notify); mc->remove_notify = &mc; /* in case there was nobody using that buffer, throw it * away after writing it back to main memory */ _starpu_spin_unlock(&mc_lock[node]); _STARPU_TRACE_START_WRITEBACK(node); res = transfer_subtree_to_node(old_data, node, STARPU_MAIN_RAM); _STARPU_TRACE_END_WRITEBACK(node); _starpu_spin_lock(&mc_lock[node]); if (!mc) { if (res == -1) { /* handle disappeared, abort without unlocking it */ return 0; } } else { STARPU_ASSERT(mc->remove_notify == &mc); mc->remove_notify = NULL; if (res == -1) { /* handle disappeared, abort without unlocking it */ return 0; } if (res == 1) { /* mc is still associated with the old * handle, now replace the previous data */ if (old_data->per_node[node].refcnt == 0) { /* And still nobody on it, now the actual buffer may be reused */ reuse_mem_chunk(node, replicate, mc, is_already_in_mc_list); success = 1; } } } } /* unlock the tree */ unlock_all_subtree(old_data); } return success; } static int _starpu_data_interface_compare(void *data_interface_a, struct starpu_data_interface_ops *ops_a, void *data_interface_b, struct starpu_data_interface_ops *ops_b) { if (ops_a->interfaceid != ops_b->interfaceid) return -1; int ret = ops_a->compare(data_interface_a, data_interface_b); return ret; } /* This function must be called with mc_lock[node] taken */ static struct _starpu_mem_chunk *_starpu_memchunk_cache_lookup_locked(unsigned node, starpu_data_handle_t handle, uint32_t footprint) { /* go through all buffers in the cache */ struct mc_cache_entry *entry; HASH_FIND(hh, mc_cache[node], &footprint, sizeof(footprint), entry); if (!entry) /* No data with that footprint */ return NULL; struct _starpu_mem_chunk *mc; for (mc = _starpu_mem_chunk_list_begin(&entry->list); mc != _starpu_mem_chunk_list_end(&entry->list); mc = _starpu_mem_chunk_list_next(mc)) { /* Is that a false hit ? (this is _very_ unlikely) */ if (_starpu_data_interface_compare(handle->per_node[node].data_interface, handle->ops, mc->chunk_interface, mc->ops) != 1) continue; /* Cache hit */ /* Remove from the cache */ _starpu_mem_chunk_list_erase(&entry->list, mc); mc_cache_nb[node]--; STARPU_ASSERT(mc_cache_nb[node] >= 0); mc_cache_size[node] -= mc->size; STARPU_ASSERT(mc_cache_size[node] >= 0); return mc; } /* This is a cache miss */ return NULL; } /* this function looks for a memory chunk that matches a given footprint in the * list of mem chunk that need to be freed. */ static unsigned try_to_find_reusable_mem_chunk(unsigned node, starpu_data_handle_t data, struct _starpu_data_replicate *replicate, uint32_t footprint) { struct _starpu_mem_chunk *mc, *orig_next_mc, *next_mc; int success = 0; _starpu_spin_lock(&mc_lock[node]); /* go through all buffers in the cache */ mc = _starpu_memchunk_cache_lookup_locked(node, data, footprint); if (mc) { /* We found an entry in the cache so we can reuse it */ reuse_mem_chunk(node, replicate, mc, 0); _starpu_spin_unlock(&mc_lock[node]); return 1; } if (!_starpu_has_not_important_data) { _starpu_spin_unlock(&mc_lock[node]); return 0; } restart: /* now look for some non essential data in the active list */ for (mc = _starpu_mem_chunk_list_begin(&mc_list[node]); mc != _starpu_mem_chunk_list_end(&mc_list[node]) && !success; mc = next_mc) { /* there is a risk that the memory chunk is freed before next * iteration starts: so we compute the next element of the list * now */ orig_next_mc = next_mc = _starpu_mem_chunk_list_next(mc); if (mc->remove_notify) /* Somebody already working here, skip */ continue; if (next_mc) { if (next_mc->remove_notify) /* Somebody already working here, skip */ continue; next_mc->remove_notify = &next_mc; } if (mc->data->is_not_important && (mc->footprint == footprint)) { /* Note: this may unlock mc_list! */ success = try_to_reuse_mem_chunk(mc, node, replicate, 1); } if (orig_next_mc) { if (!next_mc) /* Oops, somebody dropped the next item while we were * not keeping the mc_lock. Restart from the beginning * of the list */ goto restart; else { STARPU_ASSERT(next_mc->remove_notify == &next_mc); next_mc->remove_notify = NULL; } } } _starpu_spin_unlock(&mc_lock[node]); return success; } #endif /* * Free the memory chuncks that are explicitely tagged to be freed. */ static size_t flush_memchunk_cache(unsigned node, size_t reclaim) { struct _starpu_mem_chunk *mc; struct mc_cache_entry *entry, *tmp; size_t freed = 0; restart: _starpu_spin_lock(&mc_lock[node]); HASH_ITER(hh, mc_cache[node], entry, tmp) { if (!_starpu_mem_chunk_list_empty(&entry->list)) { mc = _starpu_mem_chunk_list_pop_front(&entry->list); STARPU_ASSERT(!mc->data); STARPU_ASSERT(!mc->replicate); mc_cache_nb[node]--; STARPU_ASSERT(mc_cache_nb[node] >= 0); mc_cache_size[node] -= mc->size; STARPU_ASSERT(mc_cache_size[node] >= 0); _starpu_spin_unlock(&mc_lock[node]); freed += free_memory_on_node(mc, node); free(mc->chunk_interface); _starpu_mem_chunk_delete(mc); if (reclaim && freed >= reclaim) goto out; goto restart; } if (reclaim && freed >= reclaim) break; } _starpu_spin_unlock(&mc_lock[node]); out: return freed; } /* * Try to free the buffers currently in use on the memory node. If the force * flag is set, the memory is freed regardless of coherency concerns (this * should only be used at the termination of StarPU for instance). */ static size_t free_potentially_in_use_mc(unsigned node, unsigned force, size_t reclaim) { size_t freed = 0; struct _starpu_mem_chunk *mc, *next_mc; /* * We have to unlock mc_lock before locking header_lock, so we have * to be careful with the list. We try to do just one pass, by * remembering the next mc to be tried. If it gets dropped, we restart * from zero. So we continue until we go through the whole list without * finding anything to free. */ restart: _starpu_spin_lock(&mc_lock[node]); restart2: for (mc = _starpu_mem_chunk_list_begin(&mc_list[node]); mc != _starpu_mem_chunk_list_end(&mc_list[node]) && (!reclaim || freed < reclaim); mc = next_mc) { /* mc hopefully gets out of the list, we thus need to prefetch * the next element */ next_mc = _starpu_mem_chunk_list_next(mc); if (!force) { struct _starpu_mem_chunk *orig_next_mc = next_mc; if (mc->remove_notify) /* Somebody already working here, skip */ continue; if (next_mc) { if (next_mc->remove_notify) /* Somebody already working here, skip */ continue; next_mc->remove_notify = &next_mc; } /* Note: this may unlock mc_list! */ freed += try_to_free_mem_chunk(mc, node); if (orig_next_mc) { if (!next_mc) /* Oops, somebody dropped the next item while we were * not keeping the mc_lock. Restart from the beginning * of the list */ goto restart2; else { STARPU_ASSERT(next_mc->remove_notify == &next_mc); next_mc->remove_notify = NULL; } } } else { /* Shutting down, really free */ starpu_data_handle_t handle = mc->data; if (_starpu_spin_trylock(&handle->header_lock)) { /* Ergl. We are shutting down, but somebody is * still locking the handle. That's not * supposed to happen, but better be safe by * letting it go through. */ _starpu_spin_unlock(&mc_lock[node]); goto restart; } /* We must free the memory now, because we are * terminating the drivers: note that data coherency is * not maintained in that case ! */ freed += do_free_mem_chunk(mc, node); _starpu_spin_unlock(&handle->header_lock); } } _starpu_spin_unlock(&mc_lock[node]); return freed; } size_t _starpu_memory_reclaim_generic(unsigned node, unsigned force, size_t reclaim) { size_t freed = 0; if (reclaim && !force) { static unsigned warned; if (!warned) { if (STARPU_ATOMIC_ADD(&warned, 1) == 1) { char name[32]; _starpu_memory_node_get_name(node, name, sizeof(name)); _STARPU_DISP("Not enough memory left on node %s. Your application data set seems too huge to fit on the device, StarPU will cope by trying to purge %lu MiB out. This message will not be printed again for further purges\n", name, (unsigned long) (reclaim / 1048576)); } } } /* remove all buffers for which there was a removal request */ freed += flush_memchunk_cache(node, reclaim); /* try to free all allocated data potentially in use */ if (force || (reclaim && freed 0 && available >= (total * minimum_p) / 100) /* Enough available space, do not trigger reclaiming */ return; if (mc_clean_nb[node] < (mc_nb[node] * minimum_clean_p) / 100) { struct _starpu_mem_chunk *mc, *orig_next_mc, *next_mc; int skipped = 0; /* Whether we skipped a dirty MC, and we should thus stop updating mc_dirty_head. */ /* _STARPU_DEBUG("%d not clean: %d %d\n", node, mc_clean_nb[node], mc_nb[node]); */ _STARPU_TRACE_START_WRITEBACK_ASYNC(node); _starpu_spin_lock(&mc_lock[node]); for (mc = mc_dirty_head[node]; mc && mc_clean_nb[node] < (mc_nb[node] * target_clean_p) / 100; mc = next_mc, mc && skipped ? 0 : (mc_dirty_head[node] = mc)) { starpu_data_handle_t handle; /* mc may get out of the list, we thus need to prefetch * the next element */ next_mc = _starpu_mem_chunk_list_next(mc); if (mc->home) /* Home node, it's always clean */ continue; if (mc->clean) /* already clean */ continue; if (next_mc && next_mc->remove_notify) { /* Somebody already working here, skip */ skipped = 1; continue; } handle = mc->data; STARPU_ASSERT(handle); STARPU_ASSERT(handle->home_node != -1); if (_starpu_spin_trylock(&handle->header_lock)) { /* the handle is busy, abort */ skipped = 1; continue; } if (handle->current_mode == STARPU_W) { if (handle->write_invalidation_req) { /* Some request is invalidating it anyway */ _starpu_spin_unlock(&handle->header_lock); continue; } unsigned n; for (n = 0; n < STARPU_MAXNODES; n++) if (_starpu_get_data_refcnt(handle, n)) break; if (n < STARPU_MAXNODES) { /* Some task is writing to the handle somewhere */ _starpu_spin_unlock(&handle->header_lock); skipped = 1; continue; } } if ( /* This data should be written through to this node, avoid * dropping it! */ handle->wt_mask & (1<nchildren /* REDUX, can't do anything with it, skip it */ || mc->relaxed_coherency == 2 ) { _starpu_spin_unlock(&handle->header_lock); continue; } /* This should have been marked as clean already */ if (handle->per_node[handle->home_node].state != STARPU_INVALID || mc->relaxed_coherency == 1) { /* it's actually clean */ mc->clean = 1; mc_clean_nb[node]++; } else { /* MC is dirty and nobody working on it, submit writeback */ /* MC will be clean, consider it as such */ mc->clean = 1; mc_clean_nb[node]++; orig_next_mc = next_mc; if (next_mc) { STARPU_ASSERT(!next_mc->remove_notify); next_mc->remove_notify = &next_mc; } _starpu_spin_unlock(&mc_lock[node]); if (!_starpu_create_request_to_fetch_data(handle, &handle->per_node[handle->home_node], STARPU_R, 2, 1, NULL, NULL)) { /* No request was actually needed?? * Odd, but cope with it. */ handle = NULL; } _starpu_spin_lock(&mc_lock[node]); if (orig_next_mc) { if (!next_mc) /* Oops, somebody dropped the next item while we were * not keeping the mc_lock. Give up for now, and we'll * see the rest later */ ; else { STARPU_ASSERT(next_mc->remove_notify == &next_mc); next_mc->remove_notify = NULL; } } } if (handle) _starpu_spin_unlock(&handle->header_lock); } _starpu_spin_unlock(&mc_lock[node]); _STARPU_TRACE_END_WRITEBACK_ASYNC(node); } if (total <= 0) return; /* Not enough available space, reclaim until we reach the target. */ target = (total * target_p) / 100; amount = target - available; if (!STARPU_RUNNING_ON_VALGRIND && tidying[node]) /* Some thread is already tidying this node, let it do it */ return; if (STARPU_ATOMIC_ADD(&tidying[node], 1) > 1) /* Some thread got it before us, let it do it */ goto out; static unsigned warned; if (!warned) { if (STARPU_ATOMIC_ADD(&warned, 1) == 1) { char name[32]; _starpu_memory_node_get_name(node, name, sizeof(name)); _STARPU_DISP("Low memory left on node %s (%ldMiB over %luMiB). Your application data set seems too huge to fit on the device, StarPU will cope by trying to purge %lu MiB out. This message will not be printed again for further purges. The thresholds can be tuned using the STARPU_MINIMUM_AVAILABLE_MEM and STARPU_TARGET_AVAILABLE_MEM environment variables.\n", name, (long) (available / 1048576), (unsigned long) (total / 1048576), (unsigned long) (amount / 1048576)); } } _STARPU_TRACE_START_MEMRECLAIM(node,2); _STARPU_TRACE_START_MEMRECLAIM(node,2); free_potentially_in_use_mc(node, 0, amount); _STARPU_TRACE_END_MEMRECLAIM(node,2); out: (void) STARPU_ATOMIC_ADD(&tidying[node], -1); } static struct _starpu_mem_chunk *_starpu_memchunk_init(struct _starpu_data_replicate *replicate, size_t interface_size, unsigned home, unsigned automatically_allocated) { struct _starpu_mem_chunk *mc = _starpu_mem_chunk_new(); starpu_data_handle_t handle = replicate->handle; STARPU_ASSERT(handle); STARPU_ASSERT(handle->ops); mc->data = handle; mc->footprint = _starpu_compute_data_footprint(handle); mc->ops = handle->ops; mc->automatically_allocated = automatically_allocated; mc->relaxed_coherency = replicate->relaxed_coherency; mc->home = home; mc->clean = 0; if (replicate->relaxed_coherency == 1) /* SCRATCH is always easy to drop, thus clean */ mc->clean = 1; else if (replicate->relaxed_coherency == 0 && handle->home_node != -1 && handle->per_node[(int) replicate->memory_node].state != STARPU_INVALID) /* This is a normal data and the home node has the value */ mc->clean = 1; mc->replicate = replicate; mc->replicate->mc = mc; mc->chunk_interface = NULL; mc->size_interface = interface_size; mc->remove_notify = NULL; return mc; } static void register_mem_chunk(starpu_data_handle_t handle, struct _starpu_data_replicate *replicate, unsigned automatically_allocated) { unsigned dst_node = replicate->memory_node; struct _starpu_mem_chunk *mc; /* the interface was already filled by ops->allocate_data_on_node */ size_t interface_size = replicate->handle->ops->interface_size; /* Put this memchunk in the list of memchunk in use */ mc = _starpu_memchunk_init(replicate, interface_size, handle->home_node == -1 || (int) dst_node == handle->home_node, automatically_allocated); _starpu_spin_lock(&mc_lock[dst_node]); MC_LIST_PUSH_BACK(dst_node, mc); _starpu_spin_unlock(&mc_lock[dst_node]); } /* This function is called when the handle is destroyed (eg. when calling * unregister or unpartition). It puts all the memchunks that refer to the * specified handle into the cache. */ void _starpu_request_mem_chunk_removal(starpu_data_handle_t handle, struct _starpu_data_replicate *replicate, unsigned node, size_t size) { struct _starpu_mem_chunk *mc = replicate->mc; STARPU_ASSERT(mc->data == handle); _starpu_spin_checklocked(&handle->header_lock); /* Record the allocated size, so that later in memory * reclaiming we can estimate how much memory we free * by freeing this. */ mc->size = size; /* Also keep the interface parameters and pointers, for later reuse * while detached, or freed */ _STARPU_MALLOC(mc->chunk_interface, mc->size_interface); memcpy(mc->chunk_interface, replicate->data_interface, mc->size_interface); /* This memchunk doesn't have to do with the data any more. */ replicate->mc = NULL; mc->replicate = NULL; replicate->allocated = 0; replicate->automatically_allocated = 0; replicate->initialized = 0; _starpu_spin_lock(&mc_lock[node]); mc->data = NULL; /* remove it from the main list */ MC_LIST_ERASE(node, mc); _starpu_spin_unlock(&mc_lock[node]); /* * Unless the user has provided a main RAM limitation, we would fill * memory with cached data and then eventually swap. */ /* * This is particularly important when * STARPU_USE_ALLOCATION_CACHE is not enabled, as we * wouldn't even re-use these allocations! */ if (handle->ops->dontcache || (starpu_node_get_kind(node) == STARPU_CPU_RAM #ifdef STARPU_USE_ALLOCATION_CACHE && limit_cpu_mem < 0 #endif )) { /* Free data immediately */ free_memory_on_node(mc, node); free(mc->chunk_interface); _starpu_mem_chunk_delete(mc); } else { /* put it in the list of buffers to be removed */ uint32_t footprint = mc->footprint; struct mc_cache_entry *entry; _starpu_spin_lock(&mc_lock[node]); HASH_FIND(hh, mc_cache[node], &footprint, sizeof(footprint), entry); if (!entry) { _STARPU_MALLOC(entry, sizeof(*entry)); _starpu_mem_chunk_list_init(&entry->list); entry->footprint = footprint; HASH_ADD(hh, mc_cache[node], footprint, sizeof(entry->footprint), entry); } mc_cache_nb[node]++; mc_cache_size[node] += mc->size; _starpu_mem_chunk_list_push_front(&entry->list, mc); _starpu_spin_unlock(&mc_lock[node]); } } /* * In order to allocate a piece of data, we try to reuse existing buffers if * its possible. * 1 - we try to reuse a memchunk that is explicitely unused. * 2 - we go through the list of memory chunks and find one that is not * referenced and that has the same footprint to reuse it. * 3 - we call the usual driver's alloc method * 4 - we go through the list of memory chunks and release those that are * not referenced (or part of those). * */ static starpu_ssize_t _starpu_allocate_interface(starpu_data_handle_t handle, struct _starpu_data_replicate *replicate, unsigned dst_node, unsigned is_prefetch) { unsigned attempts = 0; starpu_ssize_t allocated_memory; int ret; starpu_ssize_t data_size = _starpu_data_get_size(handle); int told_reclaiming = 0; _starpu_spin_checklocked(&handle->header_lock); _starpu_data_allocation_inc_stats(dst_node); #ifdef STARPU_USE_ALLOCATION_CACHE /* perhaps we can directly reuse a buffer in the free-list */ uint32_t footprint = _starpu_compute_data_footprint(handle); _STARPU_TRACE_START_ALLOC_REUSE(dst_node, data_size); if (try_to_find_reusable_mem_chunk(dst_node, handle, replicate, footprint)) { _starpu_allocation_cache_hit(dst_node); _STARPU_TRACE_END_ALLOC_REUSE(dst_node); return data_size; } _STARPU_TRACE_END_ALLOC_REUSE(dst_node); #endif STARPU_ASSERT(handle->ops); STARPU_ASSERT(handle->ops->allocate_data_on_node); STARPU_ASSERT(replicate->data_interface); size_t size = handle->ops->interface_size; if (!size) /* nul-size VLA is undefined... */ size = 1; char data_interface[size]; memcpy(data_interface, replicate->data_interface, handle->ops->interface_size); /* Take temporary reference on the replicate */ replicate->refcnt++; handle->busy_count++; _starpu_spin_unlock(&handle->header_lock); do { _STARPU_TRACE_START_ALLOC(dst_node, data_size); #if defined(STARPU_USE_CUDA) && defined(HAVE_CUDA_MEMCPY_PEER) && !defined(STARPU_SIMGRID) if (starpu_node_get_kind(dst_node) == STARPU_CUDA_RAM) { /* To facilitate the design of interface, we set the * proper CUDA device in case it is needed. This avoids * having to set it again in the malloc method of each * interface. */ starpu_cuda_set_device(_starpu_memory_node_get_devid(dst_node)); } #endif allocated_memory = handle->ops->allocate_data_on_node(data_interface, dst_node); _STARPU_TRACE_END_ALLOC(dst_node); if (allocated_memory == -ENOMEM) { if (!told_reclaiming) { /* Prevent prefetches and such from happening */ (void) STARPU_ATOMIC_ADD(&reclaiming[dst_node], 1); told_reclaiming = 1; } size_t reclaim = 0.25*_starpu_memory_manager_get_global_memory_size(dst_node); size_t handle_size = handle->ops->get_size(handle); if (starpu_memstrategy_data_size_coefficient*handle_size > reclaim) reclaim = starpu_memstrategy_data_size_coefficient*handle_size; _STARPU_TRACE_START_MEMRECLAIM(dst_node,is_prefetch); if (is_prefetch) { flush_memchunk_cache(dst_node, reclaim); } else _starpu_memory_reclaim_generic(dst_node, 0, reclaim); _STARPU_TRACE_END_MEMRECLAIM(dst_node,is_prefetch); } } while((allocated_memory == -ENOMEM) && attempts++ < 2); int cpt = 0; while (cpt < STARPU_SPIN_MAXTRY && _starpu_spin_trylock(&handle->header_lock)) { cpt++; _starpu_datawizard_progress(_starpu_memory_node_get_local_key(), 0); } if (cpt == STARPU_SPIN_MAXTRY) _starpu_spin_lock(&handle->header_lock); replicate->refcnt--; STARPU_ASSERT(replicate->refcnt >= 0); STARPU_ASSERT(handle->busy_count > 0); handle->busy_count--; ret = _starpu_data_check_not_busy(handle); STARPU_ASSERT(ret == 0); if (told_reclaiming) /* We've finished with reclaiming memory, let prefetches start again */ (void) STARPU_ATOMIC_ADD(&reclaiming[dst_node], -1); if (allocated_memory == -ENOMEM) { if (replicate->allocated) /* Didn't manage to allocate, but somebody else did */ allocated_memory = 0; goto out; } if (replicate->allocated) { /* Argl, somebody allocated it in between already, drop this one */ _STARPU_TRACE_START_FREE(dst_node, data_size); handle->ops->free_data_on_node(data_interface, dst_node); _STARPU_TRACE_END_FREE(dst_node); allocated_memory = 0; } else /* Install allocated interface */ memcpy(replicate->data_interface, data_interface, handle->ops->interface_size); out: return allocated_memory; } int _starpu_allocate_memory_on_node(starpu_data_handle_t handle, struct _starpu_data_replicate *replicate, unsigned is_prefetch) { starpu_ssize_t allocated_memory; unsigned dst_node = replicate->memory_node; STARPU_ASSERT(handle); _starpu_spin_checklocked(&handle->header_lock); /* A buffer is already allocated on the node */ if (replicate->allocated) return 0; STARPU_ASSERT(replicate->data_interface); allocated_memory = _starpu_allocate_interface(handle, replicate, dst_node, is_prefetch); /* perhaps we could really not handle that capacity misses */ if (allocated_memory == -ENOMEM) return -ENOMEM; if (replicate->allocated) /* Somebody allocated it in between already */ return 0; register_mem_chunk(handle, replicate, 1); replicate->allocated = 1; replicate->automatically_allocated = 1; if (replicate->relaxed_coherency == 0 && dst_node == STARPU_MAIN_RAM) { /* We are allocating the buffer in main memory, also register it * for the gcc plugin. */ void *ptr = starpu_data_handle_to_pointer(handle, STARPU_MAIN_RAM); if (ptr != NULL) { _starpu_data_register_ram_pointer(handle, ptr); } } return 0; } unsigned starpu_data_test_if_allocated_on_node(starpu_data_handle_t handle, unsigned memory_node) { return handle->per_node[memory_node].allocated; } /* This memchunk has been recently used, put it last on the mc_list, so we will * try to evict it as late as possible */ void _starpu_memchunk_recently_used(struct _starpu_mem_chunk *mc, unsigned node) { if (!mc) /* user-allocated memory */ return; _starpu_spin_lock(&mc_lock[node]); MC_LIST_ERASE(node, mc); MC_LIST_PUSH_BACK(node, mc); _starpu_spin_unlock(&mc_lock[node]); } /* This memchunk will not be used in the close future, put it on the clean * list, so we will to evict it first */ void _starpu_memchunk_wont_use(struct _starpu_mem_chunk *mc, unsigned node) { if (!mc) /* user-allocated memory */ return; _starpu_spin_lock(&mc_lock[node]); MC_LIST_ERASE(node, mc); /* Caller will schedule a clean transfer */ mc->clean = 1; MC_LIST_PUSH_CLEAN(node, mc); _starpu_spin_unlock(&mc_lock[node]); } /* This memchunk is being written to, and thus becomes dirty */ void _starpu_memchunk_dirty(struct _starpu_mem_chunk *mc, unsigned node) { if (!mc) /* user-allocated memory */ return; if (mc->home) /* Home is always clean */ return; _starpu_spin_lock(&mc_lock[node]); if (mc->relaxed_coherency == 1) { /* SCRATCH, make it clean if not already*/ if (!mc->clean) { mc_clean_nb[node]++; mc->clean = 1; } } else { if (mc->clean) { mc_clean_nb[node]--; mc->clean = 0; } } _starpu_spin_unlock(&mc_lock[node]); } #ifdef STARPU_MEMORY_STATS void _starpu_memory_display_stats_by_node(FILE *stream, int node) { _starpu_spin_lock(&mc_lock[node]); if (!_starpu_mem_chunk_list_empty(&mc_list[node])) { struct _starpu_mem_chunk *mc; fprintf(stream, "#-------\n"); fprintf(stream, "Data on Node #%d\n",node); for (mc = _starpu_mem_chunk_list_begin(&mc_list[node]); mc != _starpu_mem_chunk_list_end(&mc_list[node]); mc = _starpu_mem_chunk_list_next(mc)) { if (mc->automatically_allocated == 0) _starpu_memory_display_handle_stats(stream, mc->data); } } _starpu_spin_unlock(&mc_lock[node]); } void _starpu_data_display_memory_stats(FILE *stream) { unsigned node; fprintf(stream, "\n#---------------------\n"); fprintf(stream, "Memory stats :\n"); for (node = 0; node < STARPU_MAXNODES; node++) { _starpu_memory_display_stats_by_node(stream, node); } fprintf(stream, "\n#---------------------\n"); } #endif void starpu_data_display_memory_stats(void) { #ifdef STARPU_MEMORY_STATS _starpu_data_display_memory_stats(stderr); #endif } static int get_better_disk_can_accept_size(starpu_data_handle_t handle, unsigned node) { int target = -1; unsigned nnodes = starpu_memory_nodes_get_count(); unsigned int i; double time_disk = 0; for (i = 0; i < nnodes; i++) { if (starpu_node_get_kind(i) == STARPU_DISK_RAM && i != node && (_starpu_memory_manager_test_allocate_size(i, _starpu_data_get_size(handle)) == 1 || handle->per_node[i].allocated)) { /* if we can write on the disk */ if (_starpu_get_disk_flag(i) != STARPU_DISK_NO_RECLAIM) { /* only time can change between disk <-> main_ram * and not between main_ram <-> worker if we compare diks*/ double time_tmp = starpu_transfer_predict(i, STARPU_MAIN_RAM, _starpu_data_get_size(handle)); if (target == -1 || time_disk > time_tmp) { target = i; time_disk = time_tmp; } } } } return target; } static unsigned choose_target(starpu_data_handle_t handle, unsigned node) { int target = -1; size_t size_handle = _starpu_data_get_size(handle); if (handle->home_node != -1) /* try to push on RAM if we can before to push on disk */ if(starpu_node_get_kind(handle->home_node) == STARPU_DISK_RAM && node != STARPU_MAIN_RAM) { if (handle->per_node[STARPU_MAIN_RAM].allocated || _starpu_memory_manager_test_allocate_size(STARPU_MAIN_RAM, size_handle) == 1) { target = STARPU_MAIN_RAM; } else { target = get_better_disk_can_accept_size(handle, node); } } /* others memory nodes */ else { target = handle->home_node; } else { /* handle->home_node == -1 */ /* no place for datas in RAM, we push on disk */ if (node == STARPU_MAIN_RAM) { target = get_better_disk_can_accept_size(handle, node); } /* node != 0 */ /* try to push data to RAM if we can before to push on disk*/ else if (handle->per_node[STARPU_MAIN_RAM].allocated || _starpu_memory_manager_test_allocate_size(STARPU_MAIN_RAM, size_handle) == 1) { target = STARPU_MAIN_RAM; } /* no place in RAM */ else { target = get_better_disk_can_accept_size(handle, node); } } /* we haven't the right to write on the disk */ if (target != -1 && starpu_node_get_kind(target) == STARPU_DISK_RAM && _starpu_get_disk_flag(target) == STARPU_DISK_NO_RECLAIM) target = -1; return target; } void starpu_data_set_user_data(starpu_data_handle_t handle, void* user_data) { handle->user_data = user_data; } void *starpu_data_get_user_data(starpu_data_handle_t handle) { return handle->user_data; } starpu-1.2.3+dfsg/src/datawizard/memalloc.h000066400000000000000000000070171320135501600206360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2010, 2012-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __MEMALLOC_H__ #define __MEMALLOC_H__ #include #include #include #include #include #include struct _starpu_data_replicate; /* While associated with a handle, the content is protected by the handle lock, except a few fields */ LIST_TYPE(_starpu_mem_chunk, /* protected by the mc_lock */ starpu_data_handle_t data; uint32_t footprint; /* * When re-using a memchunk, the footprint of the data is not * sufficient to determine whether two pieces of data have the same * layout (there could be collision in the hash function ...) so we * still keep a copy of the actual layout (ie. the data interface) to * stay on the safe side while the memchunk is detached from an actual * data. */ struct starpu_data_interface_ops *ops; void *chunk_interface; size_t size_interface; /* Whether StarPU automatically allocated this memory, or the application did */ unsigned automatically_allocated:1; /* A buffer that is used for SCRATCH or reduction cannnot be used with * filters. */ unsigned relaxed_coherency:2; /* Whether this is the home chunk, or there is no home chunk (and it is thus always clean) */ unsigned home:1; /* Whether the memchunk is in the clean part of the mc_list */ unsigned clean:1; /* the size of the data is only set when calling _starpu_request_mem_chunk_removal(), * it is needed to estimate how much memory is in mc_cache, and by * free_memory_on_node() which is called when the handle is no longer * valid. * It should not be used otherwise. */ size_t size; struct _starpu_data_replicate *replicate; /* This is set when one keeps a pointer to this mc obtained from the * mc_list without mc_lock held. We need to clear the pointer if we * remove this entry from the mc_list, so we know we have to restart * from zero. This is protected by the corresponding mc_lock. */ struct _starpu_mem_chunk **remove_notify; ) void _starpu_init_mem_chunk_lists(void); void _starpu_deinit_mem_chunk_lists(void); void _starpu_request_mem_chunk_removal(starpu_data_handle_t handle, struct _starpu_data_replicate *replicate, unsigned node, size_t size); int _starpu_allocate_memory_on_node(starpu_data_handle_t handle, struct _starpu_data_replicate *replicate, unsigned is_prefetch); size_t _starpu_free_all_automatically_allocated_buffers(unsigned node); void _starpu_memchunk_recently_used(struct _starpu_mem_chunk *mc, unsigned node); void _starpu_memchunk_wont_use(struct _starpu_mem_chunk *m, unsigned nodec); void _starpu_memchunk_dirty(struct _starpu_mem_chunk *mc, unsigned node); void _starpu_display_memory_stats_by_node(int node); size_t _starpu_memory_reclaim_generic(unsigned node, unsigned force, size_t reclaim); int _starpu_is_reclaiming(unsigned node); #endif starpu-1.2.3+dfsg/src/datawizard/memory_manager.c000066400000000000000000000121401320135501600220330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2013, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include static size_t global_size[STARPU_MAXNODES]; static size_t used_size[STARPU_MAXNODES]; /* This is used as an optimization to avoid to wake up allocating threads for * each and every deallocation, only to find that there is still not enough * room. */ /* Minimum amount being waited for */ static size_t min_waiting_size[STARPU_MAXNODES]; /* Number of waiters */ static int waiters[STARPU_MAXNODES]; static starpu_pthread_mutex_t lock_nodes[STARPU_MAXNODES]; static starpu_pthread_cond_t cond_nodes[STARPU_MAXNODES]; int _starpu_memory_manager_init() { int i; for(i=0 ; istatus; _starpu_set_worker_status(worker, STATUS_WAITING); } while (used_size[node] + size > global_size[node]) STARPU_PTHREAD_COND_WAIT(&cond_nodes[node], &lock_nodes[node]); if (worker) { _starpu_set_worker_status(worker, old_status); } /* And take it */ used_size[node] += size; _STARPU_TRACE_USED_MEM(node, used_size[node]); ret = 0; if (!--waiters[node]) /* Nobody is waiting any more, we can reset the minimum */ min_waiting_size[node] = 0; } else if (flags & STARPU_MEMORY_OVERFLOW || global_size[node] == 0 || used_size[node] + size <= global_size[node]) { used_size[node] += size; _STARPU_TRACE_USED_MEM(node, used_size[node]); ret = 0; } else { ret = -ENOMEM; } STARPU_PTHREAD_MUTEX_UNLOCK(&lock_nodes[node]); return ret; } void starpu_memory_deallocate(unsigned node, size_t size) { STARPU_PTHREAD_MUTEX_LOCK(&lock_nodes[node]); used_size[node] -= size; _STARPU_TRACE_USED_MEM(node, used_size[node]); /* If there's now room for waiters, wake them */ if (min_waiting_size[node] && global_size[node] - used_size[node] >= min_waiting_size[node]) STARPU_PTHREAD_COND_BROADCAST(&cond_nodes[node]); STARPU_PTHREAD_MUTEX_UNLOCK(&lock_nodes[node]); } starpu_ssize_t starpu_memory_get_total(unsigned node) { if (global_size[node] == 0) return -1; else return global_size[node]; } starpu_ssize_t starpu_memory_get_available(unsigned node) { starpu_ssize_t ret; if (global_size[node] == 0) return -1; ret = global_size[node] - used_size[node]; return ret; } void starpu_memory_wait_available(unsigned node, size_t size) { STARPU_PTHREAD_MUTEX_LOCK(&lock_nodes[node]); waiters[node]++; /* Tell deallocators we need this amount */ if (!min_waiting_size[node] || size < min_waiting_size[node]) min_waiting_size[node] = size; /* Wait for it */ while (used_size[node] + size > global_size[node]) STARPU_PTHREAD_COND_WAIT(&cond_nodes[node], &lock_nodes[node]); if (!--waiters[node]) /* Nobody is waiting any more, we can reset the minimum */ min_waiting_size[node] = 0; STARPU_PTHREAD_MUTEX_UNLOCK(&lock_nodes[node]); } int _starpu_memory_manager_test_allocate_size(unsigned node, size_t size) { int ret; STARPU_PTHREAD_MUTEX_LOCK(&lock_nodes[node]); if (global_size[node] == 0) ret = 1; else if (used_size[node] + size <= global_size[node]) ret = 1; else ret = 0; STARPU_PTHREAD_MUTEX_UNLOCK(&lock_nodes[node]); return ret; } starpu-1.2.3+dfsg/src/datawizard/memory_manager.h000066400000000000000000000023501320135501600220420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __MEMORY_MANAGER_H__ #define __MEMORY_MANAGER_H__ #include #ifdef __cplusplus extern "C" { #endif /** * Initialises the memory manager */ int _starpu_memory_manager_init(); /** * Initialises the global memory size for the given node * */ void _starpu_memory_manager_set_global_memory_size(unsigned node, size_t size); /** * Gets the global memory size for the given node * */ size_t _starpu_memory_manager_get_global_memory_size(unsigned node); int _starpu_memory_manager_test_allocate_size(unsigned node, size_t size); #ifdef __cplusplus } #endif #endif /* __MEMORY_MANAGER_H__ */ starpu-1.2.3+dfsg/src/datawizard/memory_nodes.c000066400000000000000000000123551320135501600215410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include "copy_driver.h" #include "memalloc.h" struct _starpu_memory_node_descr _starpu_descr; starpu_pthread_key_t _starpu_memory_node_key STARPU_ATTRIBUTE_INTERNAL; void _starpu_memory_nodes_init(void) { /* there is no node yet, subsequent nodes will be * added using _starpu_memory_node_register */ _starpu_descr.nnodes = 0; STARPU_PTHREAD_KEY_CREATE(&_starpu_memory_node_key, NULL); unsigned i; for (i = 0; i < STARPU_MAXNODES; i++) { _starpu_descr.nodes[i] = STARPU_UNUSED; _starpu_descr.nworkers[i] = 0; } _starpu_init_mem_chunk_lists(); _starpu_init_data_request_lists(); _starpu_memory_manager_init(); STARPU_PTHREAD_RWLOCK_INIT(&_starpu_descr.conditions_rwlock, NULL); _starpu_descr.total_condition_count = 0; } void _starpu_memory_nodes_deinit(void) { _starpu_deinit_data_request_lists(); _starpu_deinit_mem_chunk_lists(); STARPU_PTHREAD_RWLOCK_DESTROY(&_starpu_descr.conditions_rwlock); STARPU_PTHREAD_KEY_DELETE(_starpu_memory_node_key); } #undef starpu_node_get_kind enum starpu_node_kind starpu_node_get_kind(unsigned node) { return _starpu_node_get_kind(node); } #undef starpu_memory_nodes_get_count unsigned starpu_memory_nodes_get_count(void) { return _starpu_memory_nodes_get_count(); } void _starpu_memory_node_get_name(unsigned node, char *name, int size) { const char *prefix; switch (_starpu_descr.nodes[node]) { case STARPU_CPU_RAM: prefix = "RAM"; break; case STARPU_CUDA_RAM: prefix = "CUDA"; break; case STARPU_OPENCL_RAM: prefix = "OpenCL"; break; case STARPU_DISK_RAM: prefix = "Disk"; break; case STARPU_MIC_RAM: prefix = "MIC"; break; case STARPU_SCC_RAM: prefix = "SCC_RAM"; break; case STARPU_SCC_SHM: prefix = "SCC_shared"; break; case STARPU_UNUSED: default: prefix = "unknown"; STARPU_ASSERT(0); } snprintf(name, size, "%s %d", prefix, _starpu_descr.devid[node]); } unsigned _starpu_memory_node_register(enum starpu_node_kind kind, int devid) { unsigned node; /* ATOMIC_ADD returns the new value ... */ node = STARPU_ATOMIC_ADD(&_starpu_descr.nnodes, 1) - 1; STARPU_ASSERT_MSG(node < STARPU_MAXNODES,"Too many nodes (%u) for maximum %u. Use configure option --enable-maxnodes=xxx to update the maximum number of nodes.", node, STARPU_MAXNODES); _starpu_descr.nodes[node] = kind; _STARPU_TRACE_NEW_MEM_NODE(node); _starpu_descr.devid[node] = devid; /* for now, there is no condition associated to that newly created node */ _starpu_descr.condition_count[node] = 0; _starpu_malloc_init(node); return node; } /* TODO move in a more appropriate file !! */ /* Register a condition variable associated to worker which is associated to a * memory node itself. */ void _starpu_memory_node_register_condition(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex, unsigned nodeid) { unsigned cond_id; unsigned nconds_total, nconds; STARPU_PTHREAD_RWLOCK_WRLOCK(&_starpu_descr.conditions_rwlock); /* we only insert the queue if it's not already in the list */ nconds = _starpu_descr.condition_count[nodeid]; for (cond_id = 0; cond_id < nconds; cond_id++) { if (_starpu_descr.conditions_attached_to_node[nodeid][cond_id].cond == cond) { STARPU_ASSERT(_starpu_descr.conditions_attached_to_node[nodeid][cond_id].mutex == mutex); /* the condition is already in the list */ STARPU_PTHREAD_RWLOCK_UNLOCK(&_starpu_descr.conditions_rwlock); return; } } /* it was not found locally */ _starpu_descr.conditions_attached_to_node[nodeid][cond_id].cond = cond; _starpu_descr.conditions_attached_to_node[nodeid][cond_id].mutex = mutex; _starpu_descr.condition_count[nodeid]++; /* do we have to add it in the global list as well ? */ nconds_total = _starpu_descr.total_condition_count; for (cond_id = 0; cond_id < nconds_total; cond_id++) { if (_starpu_descr.conditions_all[cond_id].cond == cond) { /* the queue is already in the global list */ STARPU_PTHREAD_RWLOCK_UNLOCK(&_starpu_descr.conditions_rwlock); return; } } /* it was not in the global list either */ _starpu_descr.conditions_all[nconds_total].cond = cond; _starpu_descr.conditions_all[nconds_total].mutex = mutex; _starpu_descr.total_condition_count++; STARPU_PTHREAD_RWLOCK_UNLOCK(&_starpu_descr.conditions_rwlock); } #undef starpu_worker_get_memory_node unsigned starpu_worker_get_memory_node(unsigned workerid) { return _starpu_worker_get_memory_node(workerid); } starpu-1.2.3+dfsg/src/datawizard/memory_nodes.h000066400000000000000000000122311320135501600215370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012, 2014-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __MEMORY_NODES_H__ #define __MEMORY_NODES_H__ #include #include #include #include #include #include #ifdef STARPU_SIMGRID #include #endif #define _STARPU_MEMORY_NODE_TUPLE(node1,node2) (node1 | (node2 << 4)) #define _STARPU_MEMORY_NODE_TUPLE_FIRST(tuple) (tuple & 0x0F) #define _STARPU_MEMORY_NODE_TUPLE_SECOND(tuple) (tuple & 0xF0) struct _starpu_cond_and_mutex { starpu_pthread_cond_t *cond; starpu_pthread_mutex_t *mutex; }; struct _starpu_memory_node_descr { unsigned nnodes; enum starpu_node_kind nodes[STARPU_MAXNODES]; /* Get the device id associated to this node, or -1 if not applicable */ int devid[STARPU_MAXNODES]; unsigned nworkers[STARPU_MAXNODES]; #ifdef STARPU_SIMGRID msg_host_t host[STARPU_MAXNODES]; #endif // TODO move this 2 lists outside struct _starpu_memory_node_descr /* Every worker is associated to a condition variable on which the * worker waits when there is task available. It is possible that * multiple worker share the same condition variable, so we maintain a * list of all these condition variables so that we can wake up all * worker attached to a memory node that are waiting on a task. */ starpu_pthread_rwlock_t conditions_rwlock; struct _starpu_cond_and_mutex conditions_attached_to_node[STARPU_MAXNODES][STARPU_NMAXWORKERS]; struct _starpu_cond_and_mutex conditions_all[STARPU_MAXNODES*STARPU_NMAXWORKERS]; /* the number of queues attached to each node */ unsigned total_condition_count; unsigned condition_count[STARPU_MAXNODES]; }; extern struct _starpu_memory_node_descr _starpu_descr; void _starpu_memory_nodes_init(void); void _starpu_memory_nodes_deinit(void); extern starpu_pthread_key_t _starpu_memory_node_key STARPU_ATTRIBUTE_INTERNAL; static inline void _starpu_memory_node_set_local_key(unsigned *node) { STARPU_PTHREAD_SETSPECIFIC(_starpu_memory_node_key, node); } static inline unsigned _starpu_memory_node_get_local_key(void) { unsigned *memory_node; memory_node = (unsigned *) STARPU_PTHREAD_GETSPECIFIC(_starpu_memory_node_key); /* in case this is called by the programmer, we assume the RAM node is the appropriate memory node ... XXX */ if (STARPU_UNLIKELY(!memory_node)) return STARPU_MAIN_RAM; return *memory_node; } static inline void _starpu_memory_node_add_nworkers(unsigned node) { _starpu_descr.nworkers[node]++; } static inline unsigned _starpu_memory_node_get_nworkers(unsigned node) { return _starpu_descr.nworkers[node]; } #ifdef STARPU_SIMGRID static inline void _starpu_simgrid_memory_node_set_host(unsigned node, msg_host_t host) { _starpu_descr.host[node] = host; } static inline msg_host_t _starpu_simgrid_memory_node_get_host(unsigned node) { return _starpu_descr.host[node]; } #endif unsigned _starpu_memory_node_register(enum starpu_node_kind kind, int devid); //void _starpu_memory_node_attach_queue(struct starpu_jobq_s *q, unsigned nodeid); void _starpu_memory_node_register_condition(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex, unsigned memory_node); static inline int _starpu_memory_node_get_devid(unsigned node) { return _starpu_descr.devid[node]; } void _starpu_memory_node_get_name(unsigned node, char *name, int size); static inline struct _starpu_memory_node_descr *_starpu_memory_node_get_description(void) { return &_starpu_descr; } static inline enum starpu_node_kind _starpu_node_get_kind(unsigned node) { return _starpu_descr.nodes[node]; } #define starpu_node_get_kind _starpu_node_get_kind static inline unsigned _starpu_memory_nodes_get_count(void) { return _starpu_descr.nnodes; } #define starpu_memory_nodes_get_count _starpu_memory_nodes_get_count static inline unsigned _starpu_worker_get_memory_node(unsigned workerid) { struct _starpu_machine_config *config = _starpu_get_machine_config(); /* This workerid may either be a basic worker or a combined worker */ unsigned nworkers = config->topology.nworkers; if (workerid < config->topology.nworkers) return config->workers[workerid].memory_node; /* We have a combined worker */ unsigned ncombinedworkers STARPU_ATTRIBUTE_UNUSED = config->topology.ncombinedworkers; STARPU_ASSERT_MSG(workerid < ncombinedworkers + nworkers, "Bad workerid %u, maximum %u", workerid, ncombinedworkers + nworkers); return config->combined_workers[workerid - nworkers].memory_node; } #define starpu_worker_get_memory_node _starpu_worker_get_memory_node #endif // __MEMORY_NODES_H__ starpu-1.2.3+dfsg/src/datawizard/memstats.c000066400000000000000000000067441320135501600207030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2012 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include void _starpu_memory_stats_init(starpu_data_handle_t handle STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_MEMORY_STATS _STARPU_CALLOC(handle->memory_stats, 1, sizeof(struct _starpu_memory_stats)); #endif } void _starpu_memory_stats_init_per_node(starpu_data_handle_t handle STARPU_ATTRIBUTE_UNUSED, unsigned node STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_MEMORY_STATS /* Stats initilization */ handle->memory_stats->direct_access[node]=0; handle->memory_stats->loaded_shared[node]=0; handle->memory_stats->shared_to_owner[node]=0; handle->memory_stats->loaded_owner[node]=0; handle->memory_stats->invalidated[node]=0; #endif } void _starpu_memory_stats_free(starpu_data_handle_t handle STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_MEMORY_STATS free(handle->memory_stats); #endif } #ifdef STARPU_MEMORY_STATS void _starpu_memory_display_handle_stats(FILE *stream, starpu_data_handle_t handle) { unsigned node; fprintf(stream, "#-----\n"); fprintf(stream, "Data : %p\n", handle); fprintf(stream, "Size : %d\n", (int)handle->ops->get_size(handle)); fprintf(stream, "\n"); fprintf(stream, "#--\n"); fprintf(stream, "Data access stats\n"); fprintf(stream, "/!\\ Work Underway\n"); for (node = 0; node < STARPU_MAXNODES; node++) { if (handle->memory_stats->direct_access[node]+handle->memory_stats->loaded_shared[node] +handle->memory_stats->invalidated[node]+handle->memory_stats->loaded_owner[node]) { fprintf(stream, "Node #%u\n", node); fprintf(stream, "\tDirect access : %u\n", handle->memory_stats->direct_access[node]); /* XXX Not Working yet. */ if (handle->memory_stats->shared_to_owner[node]) fprintf(stream, "\t\tShared to Owner : %u\n", handle->memory_stats->shared_to_owner[node]); fprintf(stream, "\tLoaded (Owner) : %u\n", handle->memory_stats->loaded_owner[node]); fprintf(stream, "\tLoaded (Shared) : %u\n", handle->memory_stats->loaded_shared[node]); fprintf(stream, "\tInvalidated (was Owner) : %u\n\n", handle->memory_stats->invalidated[node]); } } } void _starpu_memory_handle_stats_cache_hit(starpu_data_handle_t handle, unsigned node) { handle->memory_stats->direct_access[node]++; } void _starpu_memory_handle_stats_loaded_shared(starpu_data_handle_t handle, unsigned node) { handle->memory_stats->loaded_shared[node]++; } void _starpu_memory_handle_stats_loaded_owner(starpu_data_handle_t handle, unsigned node) { handle->memory_stats->loaded_owner[node]++; } void _starpu_memory_handle_stats_shared_to_owner(starpu_data_handle_t handle, unsigned node) { handle->memory_stats->shared_to_owner[node]++; } void _starpu_memory_handle_stats_invalidated(starpu_data_handle_t handle, unsigned node) { handle->memory_stats->invalidated[node]++; } #endif starpu-1.2.3+dfsg/src/datawizard/memstats.h000066400000000000000000000037201320135501600206770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __MEMSTATS_H__ #define __MEMSTATS_H__ #include #include #ifdef STARPU_MEMORY_STATS struct _starpu_memory_stats { /* Handle access stats per node */ unsigned direct_access[STARPU_MAXNODES]; unsigned loaded_shared[STARPU_MAXNODES]; unsigned loaded_owner[STARPU_MAXNODES]; unsigned shared_to_owner[STARPU_MAXNODES]; unsigned invalidated[STARPU_MAXNODES]; }; typedef struct _starpu_memory_stats * _starpu_memory_stats_t; #else typedef void * _starpu_memory_stats_t; #endif void _starpu_memory_stats_init(starpu_data_handle_t handle); void _starpu_memory_stats_init_per_node(starpu_data_handle_t handle, unsigned node); void _starpu_memory_stats_free(starpu_data_handle_t handle); void _starpu_memory_display_handle_stats(FILE *stream, starpu_data_handle_t handle); void _starpu_memory_handle_stats_cache_hit(starpu_data_handle_t handle, unsigned node); void _starpu_memory_handle_stats_loaded_shared(starpu_data_handle_t handle, unsigned node); void _starpu_memory_handle_stats_loaded_owner(starpu_data_handle_t handle, unsigned node); void _starpu_memory_handle_stats_shared_to_owner(starpu_data_handle_t handle, unsigned node); void _starpu_memory_handle_stats_invalidated(starpu_data_handle_t handle, unsigned node); #endif /* __MEMSTATS_H__ */ starpu-1.2.3+dfsg/src/datawizard/reduction.c000066400000000000000000000310171320135501600210310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2014, 2016 Université de Bordeaux * Copyright (C) 2011, 2012, 2013, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include void starpu_data_set_reduction_methods(starpu_data_handle_t handle, struct starpu_codelet *redux_cl, struct starpu_codelet *init_cl) { _starpu_spin_lock(&handle->header_lock); _starpu_codelet_check_deprecated_fields(redux_cl); _starpu_codelet_check_deprecated_fields(init_cl); unsigned child; for (child = 0; child < handle->nchildren; child++) { /* make sure that the flags are applied to the children as well */ starpu_data_handle_t child_handle = starpu_data_get_child(handle, child); if (child_handle->nchildren > 0) starpu_data_set_reduction_methods(child_handle, redux_cl, init_cl); } handle->redux_cl = redux_cl; handle->init_cl = init_cl; _starpu_spin_unlock(&handle->header_lock); } void _starpu_redux_init_data_replicate(starpu_data_handle_t handle, struct _starpu_data_replicate *replicate, int workerid) { STARPU_ASSERT(replicate); STARPU_ASSERT(replicate->allocated); struct starpu_codelet *init_cl = handle->init_cl; STARPU_ASSERT(init_cl); _starpu_cl_func_t init_func = NULL; /* TODO Check that worker may execute the codelet */ switch (starpu_worker_get_type(workerid)) { case STARPU_CPU_WORKER: init_func = _starpu_task_get_cpu_nth_implementation(init_cl, 0); break; case STARPU_CUDA_WORKER: init_func = _starpu_task_get_cuda_nth_implementation(init_cl, 0); break; case STARPU_OPENCL_WORKER: init_func = _starpu_task_get_opencl_nth_implementation(init_cl, 0); break; #ifdef STARPU_USE_MIC case STARPU_MIC_WORKER: init_func = _starpu_mic_src_get_kernel_from_codelet(init_cl, 0); break; #endif /* TODO: SCC */ default: STARPU_ABORT(); break; } STARPU_ASSERT(init_func); #ifdef STARPU_USE_MIC if (starpu_worker_get_type(workerid) == STARPU_MIC_WORKER) { struct _starpu_mp_node *node = _starpu_mic_src_get_actual_thread_mp_node(); int devid = _starpu_get_worker_struct(workerid)->devid; void * arg; int arg_size; _starpu_src_common_execute_kernel(node, (void(*)(void))init_func, devid, STARPU_SEQ, 0, 0, &handle, &(replicate->data_interface), 1, NULL, 0); _starpu_src_common_wait_completed_execution(node,devid,&arg,&arg_size); } else #endif { init_func(&replicate->data_interface, NULL); } replicate->initialized = 1; } /* Enable reduction mode. This function must be called with the header lock * taken. */ void _starpu_data_start_reduction_mode(starpu_data_handle_t handle) { STARPU_ASSERT(handle->reduction_refcnt == 0); if (!handle->per_worker) _starpu_data_initialize_per_worker(handle); unsigned worker; unsigned nworkers = starpu_worker_get_count(); for (worker = 0; worker < nworkers; worker++) { struct _starpu_data_replicate *replicate; replicate = &handle->per_worker[worker]; replicate->initialized = 0; replicate->relaxed_coherency = 2; if (replicate->mc) replicate->mc->relaxed_coherency = 2; } } //#define NO_TREE_REDUCTION /* Force reduction. The lock should already have been taken. */ void _starpu_data_end_reduction_mode(starpu_data_handle_t handle) { unsigned worker; unsigned node; unsigned empty; /* Whether the handle is initially unallocated */ /* Put every valid replicate in the same array */ unsigned replicate_count = 0; starpu_data_handle_t replicate_array[1 + STARPU_NMAXWORKERS]; _starpu_spin_checklocked(&handle->header_lock); for (node = 0; node < STARPU_MAXNODES; node++) { if (handle->per_node[node].state != STARPU_INVALID) break; } empty = node == STARPU_MAXNODES; #ifndef NO_TREE_REDUCTION if (!empty) /* Include the initial value into the reduction tree */ replicate_array[replicate_count++] = handle; #endif /* Register all valid per-worker replicates */ unsigned nworkers = starpu_worker_get_count(); STARPU_ASSERT(!handle->reduction_tmp_handles); _STARPU_MALLOC(handle->reduction_tmp_handles, nworkers * sizeof(handle->reduction_tmp_handles[0])); for (worker = 0; worker < nworkers; worker++) { if (handle->per_worker[worker].initialized) { /* Make sure the replicate is not removed */ handle->per_worker[worker].refcnt++; unsigned home_node = starpu_worker_get_memory_node(worker); starpu_data_register(&handle->reduction_tmp_handles[worker], home_node, handle->per_worker[worker].data_interface, handle->ops); starpu_data_set_sequential_consistency_flag(handle->reduction_tmp_handles[worker], 0); replicate_array[replicate_count++] = handle->reduction_tmp_handles[worker]; } else { handle->reduction_tmp_handles[worker] = NULL; } } #ifndef NO_TREE_REDUCTION if (empty) { /* Only the final copy will touch the actual handle */ handle->reduction_refcnt = 1; } else { unsigned step = 1; handle->reduction_refcnt = 0; while (step < replicate_count) { /* Each stage will touch the actual handle */ handle->reduction_refcnt++; step *= 2; } } #else /* We know that in this reduction algorithm there is exactly one task per valid replicate. */ handle->reduction_refcnt = replicate_count + empty; #endif // fprintf(stderr, "REDUX REFCNT = %d\n", handle->reduction_refcnt); if (replicate_count > #ifndef NO_TREE_REDUCTION !empty #else 0 #endif ) { /* Temporarily unlock the handle */ _starpu_spin_unlock(&handle->header_lock); #ifndef NO_TREE_REDUCTION /* We will store a pointer to the last task which should modify the * replicate */ struct starpu_task *last_replicate_deps[replicate_count]; memset(last_replicate_deps, 0, replicate_count*sizeof(struct starpu_task *)); struct starpu_task *redux_tasks[replicate_count]; /* Redux step-by-step for step from 1 to replicate_count/2, i.e. * 1-by-1, then 2-by-2, then 4-by-4, etc. */ unsigned step; unsigned redux_task_idx = 0; for (step = 1; step < replicate_count; step *=2) { unsigned i; for (i = 0; i < replicate_count; i+=2*step) { if (i + step < replicate_count) { /* Perform the reduction between replicates i * and i+step and put the result in replicate i */ struct starpu_task *redux_task = starpu_task_create(); redux_task->name = "redux_task_between_replicates"; /* Mark these tasks so that StarPU does not block them * when they try to access the handle (normal tasks are * data requests to that handle are frozen until the * data is coherent again). */ struct _starpu_job *j = _starpu_get_job_associated_to_task(redux_task); j->reduction_task = 1; redux_task->cl = handle->redux_cl; STARPU_ASSERT(redux_task->cl); if (!(STARPU_CODELET_GET_MODE(redux_task->cl, 0))) STARPU_CODELET_SET_MODE(redux_task->cl, STARPU_RW, 0); if (!(STARPU_CODELET_GET_MODE(redux_task->cl, 1))) STARPU_CODELET_SET_MODE(redux_task->cl, STARPU_R, 1); STARPU_ASSERT_MSG(STARPU_CODELET_GET_MODE(redux_task->cl, 0) == STARPU_RW, "First parameter of reduction codelet %p has to be RW", redux_task->cl); STARPU_ASSERT_MSG(STARPU_CODELET_GET_MODE(redux_task->cl, 1) == STARPU_R, "Second parameter of reduction codelet %p has to be R", redux_task->cl); STARPU_TASK_SET_HANDLE(redux_task, replicate_array[i], 0); STARPU_TASK_SET_HANDLE(redux_task, replicate_array[i+step], 1); int ndeps = 0; struct starpu_task *task_deps[2]; if (last_replicate_deps[i]) task_deps[ndeps++] = last_replicate_deps[i]; if (last_replicate_deps[i+step]) task_deps[ndeps++] = last_replicate_deps[i+step]; /* i depends on this task */ last_replicate_deps[i] = redux_task; /* we don't perform the reduction until both replicates are ready */ starpu_task_declare_deps_array(redux_task, ndeps, task_deps); /* We cannot submit tasks here : we do * not want to depend on tasks that have * been completed, so we juste store * this task : it will be submitted * later. */ redux_tasks[redux_task_idx++] = redux_task; } } } if (empty) /* The handle was empty, we just need to copy the reduced value. */ _starpu_data_cpy(handle, replicate_array[0], 1, NULL, 0, 1, last_replicate_deps[0]); /* Let's submit all the reduction tasks. */ unsigned i; for (i = 0; i < redux_task_idx; i++) { int ret = _starpu_task_submit_internally(redux_tasks[i]); STARPU_ASSERT(ret == 0); } #else if (empty) { struct starpu_task *redux_task = starpu_task_create(); redux_task->name = "redux_task_empty"; /* Mark these tasks so that StarPU does not block them * when they try to access the handle (normal tasks are * data requests to that handle are frozen until the * data is coherent again). */ struct _starpu_job *j = _starpu_get_job_associated_to_task(redux_task); j->reduction_task = 1; redux_task->cl = handle->init_cl; STARPU_ASSERT(redux_task->cl); if (!(STARPU_CODELET_GET_MODE(redux_task->cl, 0))) STARPU_CODELET_SET_MODE(redux_task->cl, STARPU_W, 0); STARPU_ASSERT_MSG(STARPU_CODELET_GET_MODE(redux_task->cl, 0) == STARPU_W, "Parameter of initialization codelet %p has to be W", redux_task->cl); STARPU_TASK_SET_HANDLE(redux_task, handle, 0); int ret = _starpu_task_submit_internally(redux_task); STARPU_ASSERT(!ret); } /* Create a set of tasks to perform the reduction */ unsigned replicate; for (replicate = 0; replicate < replicate_count; replicate++) { struct starpu_task *redux_task = starpu_task_create(); redux_task->name = "redux_task_reduction"; /* Mark these tasks so that StarPU does not block them * when they try to access the handle (normal tasks are * data requests to that handle are frozen until the * data is coherent again). */ struct _starpu_job *j = _starpu_get_job_associated_to_task(redux_task); j->reduction_task = 1; redux_task->cl = handle->redux_cl; STARPU_ASSERT(redux_task->cl); if (!(STARPU_CODELET_GET_MODE(redux_task->cl, 0))) STARPU_CODELET_SET_MODE(redux_task->cl, STARPU_RW, 0); if (!(STARPU_CODELET_GET_MODE(redux_task->cl, 1))) STARPU_CODELET_SET_MODE(redux_task->cl, STARPU_R, 1); STARPU_ASSERT_MSG(STARPU_CODELET_GET_MODE(redux_task->cl, 0) == STARPU_RW, "First parameter of reduction codelet %p has to be RW", redux_task->cl); STARPU_ASSERT_MSG(STARPU_CODELET_GET_MODE(redux_task->cl, 1) == STARPU_R, "Second parameter of reduction codelet %p has to be R", redux_task->cl); STARPU_TASK_SET_HANDLE(redux_task, handle, 0); STARPU_TASK_SET_HANDLE(redux_task, replicate_array[replicate], 1); int ret = _starpu_task_submit_internally(redux_task); STARPU_ASSERT(!ret); } #endif /* Get the header lock back */ _starpu_spin_lock(&handle->header_lock); } for (worker = 0; worker < nworkers; worker++) { struct _starpu_data_replicate *replicate; replicate = &handle->per_worker[worker]; replicate->relaxed_coherency = 1; if (replicate->mc) replicate->mc->relaxed_coherency = 1; } } void _starpu_data_end_reduction_mode_terminate(starpu_data_handle_t handle) { unsigned nworkers = starpu_worker_get_count(); // fprintf(stderr, "_starpu_data_end_reduction_mode_terminate\n"); unsigned worker; _starpu_spin_checklocked(&handle->header_lock); for (worker = 0; worker < nworkers; worker++) { struct _starpu_data_replicate *replicate; replicate = &handle->per_worker[worker]; replicate->initialized = 0; if (handle->reduction_tmp_handles[worker]) { // fprintf(stderr, "unregister handle %p\n", handle); _starpu_spin_lock(&handle->reduction_tmp_handles[worker]->header_lock); handle->reduction_tmp_handles[worker]->lazy_unregister = 1; _starpu_spin_unlock(&handle->reduction_tmp_handles[worker]->header_lock); starpu_data_unregister_no_coherency(handle->reduction_tmp_handles[worker]); handle->per_worker[worker].refcnt--; /* TODO put in cache */ } } free(handle->reduction_tmp_handles); handle->reduction_tmp_handles = NULL; } starpu-1.2.3+dfsg/src/datawizard/sort_data_handles.c000066400000000000000000000105641320135501600225170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2014-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2015, 2017 CNRS * Copyright (C) 2015 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include /* To avoid deadlocks in case we have multiple tasks accessing the same piece * of data (eg. task T1 needs A and B, and T2 needs B and A), we need to lock * them in order, so that we need a total order over data. We must also not * lock a child before its parent. */ static void find_data_path(struct _starpu_data_state *data, unsigned path[]) { unsigned depth = data->depth; struct _starpu_data_state *current = data; /* Compute the path from the root to the data */ unsigned level; /* level is the distance between the node and the current node */ for (level = 0; level < depth; level++) { path[depth - level - 1] = current->sibling_index; current = current->father_handle; } } static int _compar_data_paths(const unsigned pathA[], unsigned depthA, const unsigned pathB[], unsigned depthB) { unsigned level; unsigned depth = STARPU_MIN(depthA, depthB); for (level = 0; level < depth; level++) { if (pathA[level] != pathB[level]) return (pathA[level] < pathB[level])?-1:1; } /* If this is the same path */ if (depthA == depthB) return 0; /* A is a subdata of B or B is a subdata of A, so the smallest one is * the father of the other (we take this convention). */ return (depthA < depthB)?-1:1; } /* A comparision function between two handles makes it possible to use qsort to * sort a list of handles */ static int _starpu_compar_handles(const struct _starpu_data_descr *descrA, const struct _starpu_data_descr *descrB) { struct _starpu_data_state *dataA = descrA->handle; struct _starpu_data_state *dataB = descrB->handle; /* Perhaps we have the same piece of data */ if (dataA == dataB) { /* Process write requests first, this is needed for proper * locking, see _submit_job_enforce_data_deps, * _starpu_fetch_task_input, and _starpu_push_task_output */ if (descrA->mode & STARPU_W) { if (descrB->mode & STARPU_W) /* Both A and B write, take the reader first */ if (descrA->mode & STARPU_R) return -1; else return 1; else /* Only A writes, take it first */ return -1; } else /* A doesn't write, take B before */ return 1; } /* Put arbitered accesses after non-arbitered */ if (dataA->arbiter && !(dataB->arbiter)) return 1; if (dataB->arbiter && !(dataA->arbiter)) return -1; if (dataA->arbiter != dataB->arbiter) /* Both are arbitered, sort by arbiter pointer order */ return (dataA->arbiter < dataB->arbiter)?-1:1; /* If both are arbitered by the same arbiter (or they are both not * arbitered), we'll sort them by handle */ /* In case we have data/subdata from different trees */ if (dataA->root_handle != dataB->root_handle) return (dataA->root_handle < dataB->root_handle)?-1:1; /* Things get more complicated: we need to find the location of dataA * and dataB within the tree. */ unsigned dataA_path[dataA->depth]; unsigned dataB_path[dataB->depth]; find_data_path(dataA, dataA_path); find_data_path(dataB, dataB_path); return _compar_data_paths(dataA_path, dataA->depth, dataB_path, dataB->depth); } static int _starpu_compar_buffer_descr(const void *_descrA, const void *_descrB) { const struct _starpu_data_descr *descrA = (const struct _starpu_data_descr *) _descrA; const struct _starpu_data_descr *descrB = (const struct _starpu_data_descr *) _descrB; return _starpu_compar_handles(descrA, descrB); } /* The descr array will be overwritten, so this must be a copy ! */ void _starpu_sort_task_handles(struct _starpu_data_descr descr[], unsigned nbuffers) { qsort(descr, nbuffers, sizeof(descr[0]), _starpu_compar_buffer_descr); } starpu-1.2.3+dfsg/src/datawizard/sort_data_handles.h000066400000000000000000000022771320135501600225260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2014 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __SORT_DATA_HANDLES_H__ #define __SORT_DATA_HANDLES_H__ #include #include #include #include #include #include #include /* To avoid deadlocks, we reorder the different buffers accessed to by the task * so that we always grab the rw-lock associated to the handles in the same * order. */ void _starpu_sort_task_handles(struct _starpu_data_descr descr[], unsigned nbuffers); #endif // SORT_DATA_HANDLES starpu-1.2.3+dfsg/src/datawizard/user_interactions.c000066400000000000000000000555151320135501600226060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include static void _starpu_data_check_initialized(starpu_data_handle_t handle, enum starpu_data_access_mode mode) { if (!(mode & STARPU_R)) return; if (!handle->initialized && handle->init_cl) { int ret = starpu_task_insert(handle->init_cl, STARPU_W, handle, 0); STARPU_ASSERT(ret == 0); } STARPU_ASSERT_MSG(handle->initialized, "handle %p is not initialized while trying to read it\n", handle); } /* Explicitly ask StarPU to allocate room for a piece of data on the specified * memory node. */ int starpu_data_request_allocation(starpu_data_handle_t handle, unsigned node) { struct _starpu_data_request *r; STARPU_ASSERT(handle); _starpu_spin_lock(&handle->header_lock); r = _starpu_create_data_request(handle, NULL, &handle->per_node[node], node, STARPU_NONE, 0, 1, 0); /* we do not increase the refcnt associated to the request since we are * not waiting for its termination */ _starpu_post_data_request(r); _starpu_spin_unlock(&handle->header_lock); return 0; } struct user_interaction_wrapper { starpu_data_handle_t handle; enum starpu_data_access_mode mode; int node; starpu_pthread_cond_t cond; starpu_pthread_mutex_t lock; unsigned finished; unsigned async; unsigned prefetch; void (*callback)(void *); void (*callback_fetch_data)(void *); // called after fetch_data void *callback_arg; struct starpu_task *pre_sync_task; struct starpu_task *post_sync_task; }; /* * Non Blocking data request from application */ /* put the current value of the data into RAM */ static void _starpu_data_acquire_fetch_data_callback(void *arg) { struct user_interaction_wrapper *wrapper = (struct user_interaction_wrapper *) arg; starpu_data_handle_t handle = wrapper->handle; /* At that moment, the caller holds a reference to the piece of data. * We enqueue the "post" sync task in the list associated to the handle * so that it is submitted by the starpu_data_release * function. */ if (wrapper->post_sync_task) _starpu_add_post_sync_tasks(wrapper->post_sync_task, handle); wrapper->callback(wrapper->callback_arg); free(wrapper); } static void _starpu_data_acquire_continuation_non_blocking(void *arg) { int ret; struct user_interaction_wrapper *wrapper = (struct user_interaction_wrapper *) arg; starpu_data_handle_t handle = wrapper->handle; STARPU_ASSERT(handle); struct _starpu_data_replicate *replicate = wrapper->node >= 0 ? &handle->per_node[wrapper->node] : NULL; ret = _starpu_fetch_data_on_node(handle, wrapper->node, replicate, wrapper->mode, 0, 0, 1, _starpu_data_acquire_fetch_data_callback, wrapper); STARPU_ASSERT(!ret); } static void starpu_data_acquire_cb_pre_sync_callback(void *arg) { struct user_interaction_wrapper *wrapper = (struct user_interaction_wrapper *) arg; /* we try to get the data, if we do not succeed immediately, we set a * callback function that will be executed automatically when the data is * available again, otherwise we fetch the data directly */ if (!_starpu_attempt_to_submit_data_request_from_apps(wrapper->handle, wrapper->mode, _starpu_data_acquire_continuation_non_blocking, wrapper)) { /* no one has locked this data yet, so we proceed immediately */ _starpu_data_acquire_continuation_non_blocking(wrapper); } } /* The data must be released by calling starpu_data_release later on */ int starpu_data_acquire_on_node_cb_sequential_consistency_sync_jobids(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg, int sequential_consistency, long *pre_sync_jobid, long *post_sync_jobid) { STARPU_ASSERT(handle); STARPU_ASSERT_MSG(handle->nchildren == 0, "Acquiring a partitioned data (%p) is not possible", handle); _STARPU_LOG_IN(); /* Check that previous tasks have set a value if needed */ _starpu_data_check_initialized(handle, mode); struct user_interaction_wrapper *wrapper; _STARPU_MALLOC(wrapper, sizeof(struct user_interaction_wrapper)); wrapper->handle = handle; wrapper->node = node; wrapper->mode = mode; wrapper->callback = callback; wrapper->callback_arg = arg; STARPU_PTHREAD_COND_INIT(&wrapper->cond, NULL); STARPU_PTHREAD_MUTEX_INIT(&wrapper->lock, NULL); wrapper->finished = 0; wrapper->pre_sync_task = NULL; wrapper->post_sync_task = NULL; STARPU_PTHREAD_MUTEX_LOCK(&handle->sequential_consistency_mutex); int handle_sequential_consistency = handle->sequential_consistency; if (handle_sequential_consistency && sequential_consistency) { struct starpu_task *new_task; wrapper->pre_sync_task = starpu_task_create(); wrapper->pre_sync_task->name = "_starpu_data_acquire_cb_pre"; wrapper->pre_sync_task->detach = 1; wrapper->pre_sync_task->callback_func = starpu_data_acquire_cb_pre_sync_callback; wrapper->pre_sync_task->callback_arg = wrapper; if (pre_sync_jobid) *pre_sync_jobid = _starpu_get_job_associated_to_task(wrapper->pre_sync_task)->job_id; wrapper->post_sync_task = starpu_task_create(); wrapper->post_sync_task->name = "_starpu_data_acquire_cb_post"; wrapper->post_sync_task->detach = 1; if (post_sync_jobid) *post_sync_jobid = _starpu_get_job_associated_to_task(wrapper->post_sync_task)->job_id; new_task = _starpu_detect_implicit_data_deps_with_handle(wrapper->pre_sync_task, wrapper->post_sync_task, &_starpu_get_job_associated_to_task(wrapper->post_sync_task)->implicit_dep_slot, handle, mode); STARPU_PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex); if (new_task) { int ret = _starpu_task_submit_internally(new_task); STARPU_ASSERT(!ret); } /* TODO detect if this is superflous */ int ret = _starpu_task_submit_internally(wrapper->pre_sync_task); STARPU_ASSERT(!ret); } else { if (pre_sync_jobid) *pre_sync_jobid = -1; if (post_sync_jobid) *post_sync_jobid = -1; STARPU_PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex); starpu_data_acquire_cb_pre_sync_callback(wrapper); } _STARPU_LOG_OUT(); return 0; } int starpu_data_acquire_on_node_cb_sequential_consistency(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg, int sequential_consistency) { return starpu_data_acquire_on_node_cb_sequential_consistency_sync_jobids(handle, node, mode, callback, arg, sequential_consistency, NULL, NULL); } int starpu_data_acquire_on_node_cb(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg) { return starpu_data_acquire_on_node_cb_sequential_consistency(handle, node, mode, callback, arg, 1); } int starpu_data_acquire_cb(starpu_data_handle_t handle, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg) { return starpu_data_acquire_on_node_cb(handle, STARPU_MAIN_RAM, mode, callback, arg); } int starpu_data_acquire_cb_sequential_consistency(starpu_data_handle_t handle, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg, int sequential_consistency) { return starpu_data_acquire_on_node_cb_sequential_consistency(handle, STARPU_MAIN_RAM, mode, callback, arg, sequential_consistency); } /* * Blocking data request from application */ static inline void _starpu_data_acquire_continuation(void *arg) { struct user_interaction_wrapper *wrapper = (struct user_interaction_wrapper *) arg; starpu_data_handle_t handle = wrapper->handle; STARPU_ASSERT(handle); struct _starpu_data_replicate *replicate = wrapper->node >= 0 ? &handle->per_node[wrapper->node] : NULL; int ret; ret = _starpu_fetch_data_on_node(handle, wrapper->node, replicate, wrapper->mode, 0, 0, 0, NULL, NULL); STARPU_ASSERT(!ret); /* continuation of starpu_data_acquire */ STARPU_PTHREAD_MUTEX_LOCK(&wrapper->lock); wrapper->finished = 1; STARPU_PTHREAD_COND_SIGNAL(&wrapper->cond); STARPU_PTHREAD_MUTEX_UNLOCK(&wrapper->lock); } /* The data must be released by calling starpu_data_release later on */ int starpu_data_acquire_on_node(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode) { STARPU_ASSERT(handle); STARPU_ASSERT_MSG(handle->nchildren == 0, "Acquiring a partitioned data is not possible"); _STARPU_LOG_IN(); /* unless asynchronous, it is forbidden to call this function from a callback or a codelet */ STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "Acquiring a data synchronously is not possible from a codelet or from a task callback, use starpu_data_acquire_cb instead."); /* Check that previous tasks have set a value if needed */ _starpu_data_check_initialized(handle, mode); if (node >= 0 && _starpu_data_is_multiformat_handle(handle) && _starpu_handle_needs_conversion_task(handle, node)) { struct starpu_task *task = _starpu_create_conversion_task(handle, node); int ret; _starpu_spin_lock(&handle->header_lock); handle->refcnt--; handle->busy_count--; handle->mf_node = node; _starpu_spin_unlock(&handle->header_lock); task->synchronous = 1; ret = _starpu_task_submit_internally(task); STARPU_ASSERT(!ret); } struct user_interaction_wrapper wrapper = { .handle = handle, .mode = mode, .node = node, .finished = 0 }; STARPU_PTHREAD_COND_INIT(&wrapper.cond, NULL); STARPU_PTHREAD_MUTEX_INIT(&wrapper.lock, NULL); // _STARPU_DEBUG("TAKE sequential_consistency_mutex starpu_data_acquire\n"); STARPU_PTHREAD_MUTEX_LOCK(&handle->sequential_consistency_mutex); int sequential_consistency = handle->sequential_consistency; if (sequential_consistency) { struct starpu_task *new_task; wrapper.pre_sync_task = starpu_task_create(); wrapper.pre_sync_task->name = "_starpu_data_acquire_pre"; wrapper.pre_sync_task->detach = 0; wrapper.post_sync_task = starpu_task_create(); wrapper.post_sync_task->name = "_starpu_data_acquire_post"; wrapper.post_sync_task->detach = 1; new_task = _starpu_detect_implicit_data_deps_with_handle(wrapper.pre_sync_task, wrapper.post_sync_task, &_starpu_get_job_associated_to_task(wrapper.post_sync_task)->implicit_dep_slot, handle, mode); STARPU_PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex); if (new_task) { int ret = _starpu_task_submit_internally(new_task); STARPU_ASSERT(!ret); } /* TODO detect if this is superflous */ wrapper.pre_sync_task->synchronous = 1; int ret = _starpu_task_submit_internally(wrapper.pre_sync_task); STARPU_ASSERT(!ret); } else { STARPU_PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex); } /* we try to get the data, if we do not succeed immediately, we set a * callback function that will be executed automatically when the data is * available again, otherwise we fetch the data directly */ if (!_starpu_attempt_to_submit_data_request_from_apps(handle, mode, _starpu_data_acquire_continuation, &wrapper)) { struct _starpu_data_replicate *replicate = node >= 0 ? &handle->per_node[node] : NULL; /* no one has locked this data yet, so we proceed immediately */ int ret = _starpu_fetch_data_on_node(handle, node, replicate, mode, 0, 0, 0, NULL, NULL); STARPU_ASSERT(!ret); } else { STARPU_PTHREAD_MUTEX_LOCK(&wrapper.lock); while (!wrapper.finished) STARPU_PTHREAD_COND_WAIT(&wrapper.cond, &wrapper.lock); STARPU_PTHREAD_MUTEX_UNLOCK(&wrapper.lock); } STARPU_PTHREAD_COND_DESTROY(&wrapper.cond); STARPU_PTHREAD_MUTEX_DESTROY(&wrapper.lock); /* At that moment, the caller holds a reference to the piece of data. * We enqueue the "post" sync task in the list associated to the handle * so that it is submitted by the starpu_data_release * function. */ if (sequential_consistency) _starpu_add_post_sync_tasks(wrapper.post_sync_task, handle); _STARPU_LOG_OUT(); return 0; } int starpu_data_acquire(starpu_data_handle_t handle, enum starpu_data_access_mode mode) { return starpu_data_acquire_on_node(handle, STARPU_MAIN_RAM, mode); } int starpu_data_acquire_on_node_try(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode) { STARPU_ASSERT(handle); STARPU_ASSERT_MSG(handle->nchildren == 0, "Acquiring a partitioned data is not possible"); /* it is forbidden to call this function from a callback or a codelet */ STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "Acquiring a data synchronously is not possible from a codelet or from a task callback, use starpu_data_acquire_cb instead."); /* Check that previous tasks have set a value if needed */ _starpu_data_check_initialized(handle, mode); int ret; STARPU_ASSERT_MSG(!_starpu_data_is_multiformat_handle(handle), "not supported yet"); STARPU_PTHREAD_MUTEX_LOCK(&handle->sequential_consistency_mutex); ret = _starpu_test_implicit_data_deps_with_handle(handle, mode); STARPU_PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex); if (ret) return ret; struct user_interaction_wrapper wrapper = { .handle = handle, .mode = mode, .node = node, .finished = 0 }; STARPU_PTHREAD_COND_INIT(&wrapper.cond, NULL); STARPU_PTHREAD_MUTEX_INIT(&wrapper.lock, NULL); /* we try to get the data, if we do not succeed immediately, we set a * callback function that will be executed automatically when the data is * available again, otherwise we fetch the data directly */ if (!_starpu_attempt_to_submit_data_request_from_apps(handle, mode, _starpu_data_acquire_continuation, &wrapper)) { struct _starpu_data_replicate *replicate = node >= 0 ? &handle->per_node[node] : NULL; /* no one has locked this data yet, so we proceed immediately */ ret = _starpu_fetch_data_on_node(handle, node, replicate, mode, 0, 0, 0, NULL, NULL); STARPU_ASSERT(!ret); } else { STARPU_PTHREAD_MUTEX_LOCK(&wrapper.lock); while (!wrapper.finished) STARPU_PTHREAD_COND_WAIT(&wrapper.cond, &wrapper.lock); STARPU_PTHREAD_MUTEX_UNLOCK(&wrapper.lock); } STARPU_PTHREAD_COND_DESTROY(&wrapper.cond); STARPU_PTHREAD_MUTEX_DESTROY(&wrapper.lock); return 0; } int starpu_data_acquire_try(starpu_data_handle_t handle, enum starpu_data_access_mode mode) { return starpu_data_acquire_on_node_try(handle, STARPU_MAIN_RAM, mode); } /* This function must be called after starpu_data_acquire so that the * application release the data */ void starpu_data_release_on_node(starpu_data_handle_t handle, int node) { STARPU_ASSERT(handle); /* In case there are some implicit dependencies, unlock the "post sync" tasks */ _starpu_unlock_post_sync_tasks(handle); /* The application can now release the rw-lock */ if (node >= 0) _starpu_release_data_on_node(handle, 0, &handle->per_node[node]); else { _starpu_spin_lock(&handle->header_lock); if (node == STARPU_ACQUIRE_ALL_NODES) { int i; for (i = 0; i < STARPU_MAXNODES; i++) handle->per_node[i].refcnt--; } handle->busy_count--; if (!_starpu_notify_data_dependencies(handle)) _starpu_spin_unlock(&handle->header_lock); } } void starpu_data_release(starpu_data_handle_t handle) { starpu_data_release_on_node(handle, STARPU_MAIN_RAM); } static void _prefetch_data_on_node(void *arg) { struct user_interaction_wrapper *wrapper = (struct user_interaction_wrapper *) arg; starpu_data_handle_t handle = wrapper->handle; int ret; struct _starpu_data_replicate *replicate = &handle->per_node[wrapper->node]; ret = _starpu_fetch_data_on_node(handle, wrapper->node, replicate, STARPU_R, wrapper->async, wrapper->prefetch, wrapper->async, NULL, NULL); STARPU_ASSERT(!ret); if (wrapper->async) free(wrapper); else { STARPU_PTHREAD_MUTEX_LOCK(&wrapper->lock); wrapper->finished = 1; STARPU_PTHREAD_COND_SIGNAL(&wrapper->cond); STARPU_PTHREAD_MUTEX_UNLOCK(&wrapper->lock); } _starpu_spin_lock(&handle->header_lock); if (!_starpu_notify_data_dependencies(handle)) _starpu_spin_unlock(&handle->header_lock); } static int _starpu_prefetch_data_on_node_with_mode(starpu_data_handle_t handle, unsigned node, unsigned async, enum starpu_data_access_mode mode, unsigned prefetch) { STARPU_ASSERT(handle); /* it is forbidden to call this function from a callback or a codelet */ STARPU_ASSERT_MSG(async || _starpu_worker_may_perform_blocking_calls(), "Synchronous prefetch is not possible from a task or a callback"); /* Check that previous tasks have set a value if needed */ _starpu_data_check_initialized(handle, mode); struct user_interaction_wrapper *wrapper; _STARPU_MALLOC(wrapper, sizeof(*wrapper)); wrapper->handle = handle; wrapper->node = node; wrapper->async = async; wrapper->prefetch = prefetch; STARPU_PTHREAD_COND_INIT(&wrapper->cond, NULL); STARPU_PTHREAD_MUTEX_INIT(&wrapper->lock, NULL); wrapper->finished = 0; if (!_starpu_attempt_to_submit_data_request_from_apps(handle, mode, _prefetch_data_on_node, wrapper)) { /* we can immediately proceed */ struct _starpu_data_replicate *replicate = &handle->per_node[node]; STARPU_PTHREAD_COND_DESTROY(&wrapper->cond); STARPU_PTHREAD_MUTEX_DESTROY(&wrapper->lock); free(wrapper); _starpu_fetch_data_on_node(handle, node, replicate, mode, async, prefetch, async, NULL, NULL); /* remove the "lock"/reference */ _starpu_spin_lock(&handle->header_lock); if (!async) { /* Release our refcnt, like _starpu_release_data_on_node would do */ replicate->refcnt--; STARPU_ASSERT(replicate->refcnt >= 0); STARPU_ASSERT(handle->busy_count > 0); handle->busy_count--; } /* In case there was a temporary handle (eg. used for reduction), this * handle may have requested to be destroyed when the data is released * */ if (!_starpu_notify_data_dependencies(handle)) _starpu_spin_unlock(&handle->header_lock); } else if (!async) { STARPU_PTHREAD_MUTEX_LOCK(&wrapper->lock); while (!wrapper->finished) STARPU_PTHREAD_COND_WAIT(&wrapper->cond, &wrapper->lock); STARPU_PTHREAD_MUTEX_UNLOCK(&wrapper->lock); STARPU_PTHREAD_COND_DESTROY(&wrapper->cond); STARPU_PTHREAD_MUTEX_DESTROY(&wrapper->lock); free(wrapper); } return 0; } int starpu_data_fetch_on_node(starpu_data_handle_t handle, unsigned node, unsigned async) { return _starpu_prefetch_data_on_node_with_mode(handle, node, async, STARPU_R, 0); } int starpu_data_prefetch_on_node(starpu_data_handle_t handle, unsigned node, unsigned async) { return _starpu_prefetch_data_on_node_with_mode(handle, node, async, STARPU_R, 1); } int starpu_data_idle_prefetch_on_node(starpu_data_handle_t handle, unsigned node, unsigned async) { return _starpu_prefetch_data_on_node_with_mode(handle, node, async, STARPU_R, 2); } static void _starpu_data_wont_use(void *data) { unsigned node; starpu_data_handle_t handle = data; _starpu_spin_lock(&handle->header_lock); for (node = 0; node < STARPU_MAXNODES; node++) { struct _starpu_data_replicate *local = &handle->per_node[node]; if (local->allocated && local->automatically_allocated) _starpu_memchunk_wont_use(local->mc, node); } if (handle->per_worker) { unsigned nworkers = starpu_worker_get_count(); unsigned worker; for (worker = 0; worker < nworkers; worker++) { struct _starpu_data_replicate *local = &handle->per_worker[worker]; if (local->allocated && local->automatically_allocated) _starpu_memchunk_wont_use(local->mc, starpu_worker_get_memory_node(worker)); } } _starpu_spin_unlock(&handle->header_lock); starpu_data_release_on_node(handle, STARPU_ACQUIRE_ALL_NODES); if (handle->home_node != -1) starpu_data_idle_prefetch_on_node(handle, handle->home_node, 1); } void starpu_data_wont_use(starpu_data_handle_t handle) { starpu_data_acquire_on_node_cb(handle, STARPU_ACQUIRE_ALL_NODES, STARPU_R, _starpu_data_wont_use, handle); } /* * It is possible to specify that a piece of data can be discarded without * impacting the application. */ int _starpu_has_not_important_data; void starpu_data_advise_as_important(starpu_data_handle_t handle, unsigned is_important) { if (!is_important) _starpu_has_not_important_data = 1; _starpu_spin_lock(&handle->header_lock); /* first take all the children lock (in order !) */ unsigned child; for (child = 0; child < handle->nchildren; child++) { /* make sure the intermediate children is advised as well */ starpu_data_handle_t child_handle = starpu_data_get_child(handle, child); if (child_handle->nchildren > 0) starpu_data_advise_as_important(child_handle, is_important); } handle->is_not_important = !is_important; /* now the parent may be used again so we release the lock */ _starpu_spin_unlock(&handle->header_lock); } void starpu_data_set_sequential_consistency_flag(starpu_data_handle_t handle, unsigned flag) { _starpu_spin_lock(&handle->header_lock); unsigned child; for (child = 0; child < handle->nchildren; child++) { /* make sure that the flags are applied to the children as well */ starpu_data_handle_t child_handle = starpu_data_get_child(handle, child); if (child_handle->nchildren > 0) starpu_data_set_sequential_consistency_flag(child_handle, flag); } STARPU_PTHREAD_MUTEX_LOCK(&handle->sequential_consistency_mutex); handle->sequential_consistency = flag; STARPU_PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex); _starpu_spin_unlock(&handle->header_lock); } unsigned starpu_data_get_sequential_consistency_flag(starpu_data_handle_t handle) { return handle->sequential_consistency; } /* By default, sequential consistency is enabled */ static unsigned default_sequential_consistency_flag = 1; unsigned starpu_data_get_default_sequential_consistency_flag(void) { return default_sequential_consistency_flag; } void starpu_data_set_default_sequential_consistency_flag(unsigned flag) { default_sequential_consistency_flag = flag; } /* Query the status of the handle on the specified memory node. */ void starpu_data_query_status(starpu_data_handle_t handle, int memory_node, int *is_allocated, int *is_valid, int *is_requested) { // XXX : this is just a hint, so we don't take the lock ... // _starpu_spin_lock(&handle->header_lock); if (is_allocated) *is_allocated = handle->per_node[memory_node].allocated; if (is_valid) *is_valid = (handle->per_node[memory_node].state != STARPU_INVALID); if (is_requested) { int requested = 0; unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { if (handle->per_node[memory_node].requested & (1UL << node)) { requested = 1; break; } } *is_requested = requested; } // _starpu_spin_unlock(&handle->header_lock); } starpu-1.2.3+dfsg/src/datawizard/write_back.c000066400000000000000000000055351320135501600211550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include static void wt_callback(void *arg) { starpu_data_handle_t handle = (starpu_data_handle_t) arg; _starpu_spin_lock(&handle->header_lock); if (!_starpu_notify_data_dependencies(handle)) _starpu_spin_unlock(&handle->header_lock); } void _starpu_write_through_data(starpu_data_handle_t handle, unsigned requesting_node, uint32_t write_through_mask) { if ((write_through_mask & ~(1<header_lock)) { cpt++; _starpu_datawizard_progress(requesting_node, 1); } if (cpt == STARPU_SPIN_MAXTRY) _starpu_spin_lock(&handle->header_lock); /* We need to keep a Read lock to avoid letting writers corrupt our copy. */ STARPU_ASSERT(handle->current_mode != STARPU_REDUX); STARPU_ASSERT(handle->current_mode != STARPU_SCRATCH); handle->refcnt++; handle->busy_count++; handle->current_mode = STARPU_R; struct _starpu_data_request *r; r = _starpu_create_request_to_fetch_data(handle, &handle->per_node[node], STARPU_R, 1, 1, wt_callback, handle); /* If no request was created, the handle was already up-to-date on the * node */ if (r) _starpu_spin_unlock(&handle->header_lock); } } } } void starpu_data_set_wt_mask(starpu_data_handle_t handle, uint32_t wt_mask) { handle->wt_mask = wt_mask; /* in case the data has some children, set their wt_mask as well */ if (handle->nchildren > 0) { unsigned child; for (child = 0; child < handle->nchildren; child++) { starpu_data_handle_t handle_child = starpu_data_get_child(handle, child); starpu_data_set_wt_mask(handle_child, wt_mask); } } } starpu-1.2.3+dfsg/src/datawizard/write_back.h000066400000000000000000000021731320135501600211550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DW_WRITE_BACK_H__ #define __DW_WRITE_BACK_H__ #include #include /* If a write-through mask is associated to that data handle, this propagates * the the current value of the data onto the different memory nodes in the * write_through_mask. */ void _starpu_write_through_data(starpu_data_handle_t handle, unsigned requesting_node, uint32_t write_through_mask); #endif // __DW_WRITE_BACK_H__ starpu-1.2.3+dfsg/src/debug/000077500000000000000000000000001320135501600156235ustar00rootroot00000000000000starpu-1.2.3+dfsg/src/debug/latency.c000066400000000000000000000034561320135501600174360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012, 2015-2016 Université de Bordeaux * Copyright (C) 2010, 2011 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include void _starpu_benchmark_ping_pong(starpu_data_handle_t handle, unsigned node0, unsigned node1, unsigned niter) { /* We assume that no one is using that handle !! */ unsigned iter; for (iter = 0; iter < niter; iter++) { int ret; _starpu_spin_lock(&handle->header_lock); handle->refcnt++; handle->busy_count++; _starpu_spin_unlock(&handle->header_lock); struct _starpu_data_replicate *replicate_0 = &handle->per_node[node0]; ret = _starpu_fetch_data_on_node(handle, node0, replicate_0, STARPU_RW, 0, 0, 0, NULL, NULL); STARPU_ASSERT(!ret); _starpu_release_data_on_node(handle, node0, replicate_0); _starpu_spin_lock(&handle->header_lock); handle->refcnt++; handle->busy_count++; _starpu_spin_unlock(&handle->header_lock); struct _starpu_data_replicate *replicate_1 = &handle->per_node[node1]; ret = _starpu_fetch_data_on_node(handle, node1, replicate_1, STARPU_RW, 0, 0, 0, NULL, NULL); STARPU_ASSERT(!ret); _starpu_release_data_on_node(handle, node1, replicate_1); } } starpu-1.2.3+dfsg/src/debug/starpu_debug_helpers.h000066400000000000000000000022711320135501600222040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_DEBUG_HELPERS_H__ #define __STARPU_DEBUG_HELPERS_H__ #include #include #include #ifdef __cplusplus extern "C" { #endif /* Perform a ping pong between the two memory nodes */ void _starpu_benchmark_ping_pong(starpu_data_handle_t handle, unsigned node0, unsigned node1, unsigned niter); /* Display the size of different data structures */ void _starpu_debug_display_structures_size(FILE *stream); #ifdef __cplusplus } #endif #endif // __STARPU_DEBUG_HELPERS_H__ starpu-1.2.3+dfsg/src/debug/structures_size.c000066400000000000000000000034061320135501600212470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011 Université de Bordeaux * Copyright (C) 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include void _starpu_debug_display_structures_size(FILE *stream) { fprintf(stream, "struct starpu_task\t\t%u bytes\t(%x)\n", (unsigned) sizeof(struct starpu_task), (unsigned) sizeof(struct starpu_task)); fprintf(stream, "struct _starpu_job\t\t%u bytes\t(%x)\n", (unsigned) sizeof(struct _starpu_job), (unsigned) sizeof(struct _starpu_job)); fprintf(stream, "struct _starpu_data_state\t%u bytes\t(%x)\n", (unsigned) sizeof(struct _starpu_data_state), (unsigned) sizeof(struct _starpu_data_state)); fprintf(stream, "struct _starpu_tag\t\t%u bytes\t(%x)\n", (unsigned) sizeof(struct _starpu_tag), (unsigned) sizeof(struct _starpu_tag)); fprintf(stream, "struct _starpu_cg\t\t%u bytes\t(%x)\n", (unsigned) sizeof(struct _starpu_cg), (unsigned) sizeof(struct _starpu_cg)); fprintf(stream, "struct _starpu_worker\t\t%u bytes\t(%x)\n", (unsigned) sizeof(struct _starpu_worker), (unsigned) sizeof(struct _starpu_worker)); } starpu-1.2.3+dfsg/src/debug/traces/000077500000000000000000000000001320135501600171045ustar00rootroot00000000000000starpu-1.2.3+dfsg/src/debug/traces/anim.c000066400000000000000000000466741320135501600202150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015 Université de Bordeaux * Copyright (C) 2015 Anthony Simonet * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include "starpu_fxt.h" #ifdef STARPU_USE_FXT static struct component { UT_hash_handle hh; char *name; int workerid; uint64_t ptr; unsigned nchildren; struct component **children; struct component *parent; unsigned ntasks; unsigned npriotasks; } *components; static unsigned global_state = 1; static unsigned nsubmitted; static unsigned curq_size; static unsigned nflowing; #define COMPONENT_ADD(head, field, add) HASH_ADD(hh, head, field, sizeof(uint64_t), add); #define COMPONENT_FIND(head, find, out) HASH_FIND(hh, head, &find, sizeof(uint64_t), out); static struct component *fxt_component_root(void) { struct component *comp, *tmp; HASH_ITER(hh, components, comp, tmp) { while (comp->parent) comp = comp->parent; return comp; } return NULL; } void _starpu_fxt_component_new(uint64_t component, char *name) { struct component *comp; _STARPU_MALLOC(comp, sizeof(*comp)); if (!strncmp(name, "worker ", 7)) { comp->name = strdup("worker"); comp->workerid = atoi(name+7); } else { comp->name = strdup(name); comp->workerid = -1; } comp->ptr = component; comp->nchildren = 0; comp->children = NULL; comp->parent = NULL; comp->ntasks = 0; comp->npriotasks = 0; COMPONENT_ADD(components, ptr, comp); } static void fxt_component_dump(FILE *file, struct component *comp, unsigned depth) { unsigned i; fprintf(file,"%*s%s (%d %"PRIx64", %d tasks %d prio tasks)\n", 2*depth, "", comp->name, depth, comp->ptr, comp->ntasks, comp->npriotasks); for (i = 0; i < comp->nchildren; i++) if (comp->children[i]->parent == comp) fxt_component_dump(file, comp->children[i], depth+1); } void _starpu_fxt_component_dump(FILE *file) { fxt_component_dump(file, fxt_component_root(), 0); } static void fxt_worker_print(FILE *file, struct starpu_fxt_options *options, int workerid, unsigned comp_workerid, unsigned depth) { fprintf(file, "\t\t\t%*s\n", 2*depth, ""); fprintf(file, "\t\t\t%*s
    %s\n", 2*depth, "", (int) comp_workerid == workerid ? "_sched":"", options->worker_names[comp_workerid]); if (_starpu_last_codelet_symbol[comp_workerid][0]) fprintf(file, "\t\t\t%*s
    %s
    \n", 2*(depth+1), "", _starpu_last_codelet_symbol[comp_workerid]); else fprintf(file, "\t\t\t%*s
    \n", 2*(depth+1), ""); fprintf(file, "\t\t\t%*s
    ", 2*depth, ""); } static void fxt_component_print(FILE *file, struct starpu_fxt_options *options, int workerid, struct component *from, struct component *to, struct component *comp, unsigned depth) { unsigned i, n; unsigned ntasks = comp->ntasks + comp->npriotasks; if (from == comp) /* Additionally show now-empty slot */ ntasks++; for (i = 0, n = 0; i < comp->nchildren; i++) if (comp->children[i]->parent == comp) n++; fprintf(file, "\t\t\t%*s\n", 2*depth, ""); if (comp->nchildren > 0) { fprintf(file, "\t\t\t%*s\n", 2*depth, ""); for (i = 0; i < comp->nchildren; i++) if (comp->children[i]->parent == comp) { fprintf(file, "\t\t\t%*s\n", 2*depth, ""); } fprintf(file, "\t\t\t%*s\n", 2*depth, ""); } if (!strcmp(comp->name, "worker")) { fprintf(file, "\t\t\t%*s\n", 2*depth, ""); fprintf(file, "\t\t\t%*s\n", 2*depth, ""); fprintf(file, "\t\t\t%*s\n", 2*depth, ""); } fprintf(file, "\t\t\t%*s
    %s\n", 2*depth, "", n, comp->name); if (!strcmp(comp->name,"prio") || !strcmp(comp->name,"fifo") || !strcmp(comp->name,"heft") || !strcmp(comp->name,"work_stealing")) { /* Show task queue */ #define N 3 n = ntasks; if (n > N) n = N; for (i = 0; i < N-n; i++) fprintf(file, "\t\t\t%*s
    \n", 2*depth, ""); if (ntasks) { if (ntasks > N) fprintf(file, "\t\t\t%*s
    %u
    \n", 2*depth, "", from == comp ? (comp->npriotasks >= N ? "last_task_full_prio" : "last_task_full") : (comp->npriotasks >= N ? "task_prio" : "task"), comp->ntasks + comp->npriotasks); else fprintf(file, "\t\t\t%*s
    \n", 2*depth, "", from == comp ? "last_task_empty" : (comp->ntasks ? "task" : "task_prio")); for (i = 1; i < n; i++) fprintf(file, "\t\t\t%*s
    \n", 2*depth, "", n - i > comp->npriotasks ? "task" : "task_prio"); } } else { if (ntasks == 0) fprintf(file, "\t\t\t%*s
    \n", 2*depth, ""); else if (ntasks == 1) fprintf(file, "\t\t\t%*s
    \n", 2*depth, "", from == comp ? "last_task_empty" : (comp->npriotasks ? "task_prio" : "task")); else fprintf(file, "\t\t\t%*s
    %u
    \n", 2*depth, "", from == comp ? (comp->npriotasks ? "last_task_full_prio" : "last_task_full") : (comp->npriotasks ? "task_prio" : "task"), comp->ntasks + comp->npriotasks); } fprintf(file, "\t\t\t%*s
    \n", 2*depth, ""); fxt_component_print(file, options, workerid, from, to, comp->children[i], depth+1); fprintf(file, "\t\t\t%*s
    \n", 2*depth, ""); fxt_worker_print(file, options, workerid, comp->workerid, depth+1); fprintf(file, "\t\t\t%*s
    ", 2*depth, ""); } void _starpu_fxt_component_print(FILE *file, struct starpu_fxt_options *options, int workerid, struct component *from, struct component *to) { fprintf(file, "

    \n"); fxt_component_print(file, options, workerid, from, to, fxt_component_root(), 0); fprintf(file, "
    \n"); } void _starpu_fxt_component_print_header(FILE *file) { /* CSS and Javascript code from Anthony Simonet */ fprintf(file, "\n"); fprintf(file, "\n"); fprintf(file, "\t\n"); fprintf(file, "\t\t\n"); fprintf(file, "\t\t\n"); fprintf(file, "\t\t\n"); fprintf(file, "\t\t\n"); //fprintf(file, "\t\t\n"); //fprintf(file, "\t\t\n"); fprintf(file, "\t\t\n"); fprintf(file, "\t\t\n"); fprintf(file, "\t\t\n"); fprintf(file, "\t\n"); fprintf(file, "\t\n"); } static void fxt_component_print_step(FILE *file, struct starpu_fxt_options *options, double timestamp, int workerid, unsigned push, struct component *from, struct component *to) { fprintf(file, "\t\t
    \n", global_state, global_state > 1 ? "none":"block", global_state); fprintf(file, "\t\t

    Time %f, %u submitted %u ready, %s

    \n", timestamp, nsubmitted, curq_size-nflowing, push?"push":"pull"); //fprintf(file, "\t\t\t
    \n");
    	//_starpu_fxt_component_dump(file);
    	//fprintf(file, "\t\t\t
    \n"); _starpu_fxt_component_print(file, options, workerid, from, to); fprintf(file,"\t\t
    "); global_state++; } void _starpu_fxt_component_connect(uint64_t parent, uint64_t child) { struct component *parent_p, *child_p; unsigned n; COMPONENT_FIND(components, parent, parent_p); COMPONENT_FIND(components, child, child_p); STARPU_ASSERT(parent_p); STARPU_ASSERT(child_p); n = ++parent_p->nchildren; _STARPU_REALLOC(parent_p->children, n * sizeof(*parent_p->children)); parent_p->children[n-1] = child_p; if (!child_p->parent) child_p->parent = parent_p; } void _starpu_fxt_component_update_ntasks(unsigned _nsubmitted, unsigned _curq_size) { nsubmitted = _nsubmitted; curq_size = _curq_size; } void _starpu_fxt_component_push(FILE *output, struct starpu_fxt_options *options, double timestamp, int workerid, uint64_t from, uint64_t to, uint64_t task STARPU_ATTRIBUTE_UNUSED, unsigned prio) { struct component *from_p = NULL, *to_p = NULL; if (to == from) return; if (from) { COMPONENT_FIND(components, from, from_p); STARPU_ASSERT(from_p); } if (to) { COMPONENT_FIND(components, to, to_p); STARPU_ASSERT(to_p); } if (from_p) { if (prio) from_p->npriotasks--; else from_p->ntasks--; } else nflowing++; if (prio) to_p->npriotasks++; else to_p->ntasks++; // fprintf(stderr,"push from %s to %s\n", from_p?from_p->name:"none", to_p?to_p->name:"none"); fxt_component_print_step(output, options, timestamp, workerid, 1, from_p, to_p); } void _starpu_fxt_component_pull(FILE *output, struct starpu_fxt_options *options, double timestamp, int workerid, uint64_t from, uint64_t to, uint64_t task STARPU_ATTRIBUTE_UNUSED, unsigned prio) { struct component *from_p = NULL, *to_p = NULL; if (to == from) return; if (from) { COMPONENT_FIND(components, from, from_p); STARPU_ASSERT(from_p); } if (to) { COMPONENT_FIND(components, to, to_p); STARPU_ASSERT(to_p); } if (prio) from_p->npriotasks--; else from_p->ntasks--; if (to_p) { if (prio) to_p->npriotasks++; else to_p->ntasks++; } else nflowing--; // fprintf(stderr,"pull from %s to %s\n", from_p?from_p->name:"none", to_p?to_p->name:"none"); fxt_component_print_step(output, options, timestamp, workerid, 0, from_p, to_p); } void _starpu_fxt_component_finish(FILE *file) { /* Javascript code from Anthony Simonet */ fprintf(file, "\t\t\n"); fprintf(file, "\t\t
    \n"); fprintf(file, "\t\t
    \n"); fprintf(file, "\t\t\t

    \n"); fprintf(file, "\t\t\t\t\n"); fprintf(file, "\t\t\t\t\n"); fprintf(file, "\t\t\t\t\n"); fprintf(file, "\t\t\t\t\n"); fprintf(file, "\t\t\t\t\n"); fprintf(file, "\t\t\t\t\n"); fprintf(file, "\t\t\t\t\n"); fprintf(file, "\t\t\t\t\n"); fprintf(file, "\t\t\t\t\n"); fprintf(file, "\t\t\t\t\n"); fprintf(file, "\t\t\t

    \n"); fprintf(file, "\t\t\t\tAuto speed (state/s): 4\n"); fprintf(file, "\t\t\t\t\n"); fprintf(file, "\t\t\t\t\n"); fprintf(file, "\t\t\t\t\n"); fprintf(file, "\t\t\t\t\n"); fprintf(file, "\t\t\t

    \n"); fprintf(file, "\t\t\t

    \n"); fprintf(file, "\t\t\t
    \n"); fprintf(file, "\t\t\t\tGo to state\n"); fprintf(file, "\t\t\t\t\n"); fprintf(file, "\t\t\t\t\n"); /* Dummy input preventing the page from being refreshed when enter is pressed. */ fprintf(file, "\t\t\t\t\n"); fprintf(file, "\t\t\t
    \n"); fprintf(file, "\t\t\t
    \n"); fprintf(file, "\t\t
    \n"); fprintf(file, "\t\n"); fprintf(file, "\n"); } #endif starpu-1.2.3+dfsg/src/debug/traces/starpu_fxt.c000066400000000000000000003264411320135501600214610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2017 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #ifdef STARPU_HAVE_POTI #include #define STARPU_POTI_STR_LEN 200 #endif #ifdef STARPU_USE_FXT #include "starpu_fxt.h" #include #include #define CPUS_WORKER_COLORS_NB 8 #define CUDA_WORKER_COLORS_NB 9 #define OPENCL_WORKER_COLORS_NB 9 #define MIC_WORKER_COLORS_NB 9 #define SCC_WORKER_COLORS_NB 9 #define OTHER_WORKER_COLORS_NB 4 static char *cpus_worker_colors[CPUS_WORKER_COLORS_NB] = {"/greens9/7", "/greens9/6", "/greens9/5", "/greens9/4", "/greens9/9", "/greens9/3", "/greens9/2", "/greens9/1" }; static char *cuda_worker_colors[CUDA_WORKER_COLORS_NB] = {"/ylorrd9/9", "/ylorrd9/6", "/ylorrd9/3", "/ylorrd9/1", "/ylorrd9/8", "/ylorrd9/7", "/ylorrd9/4", "/ylorrd9/2", "/ylorrd9/1"}; static char *opencl_worker_colors[OPENCL_WORKER_COLORS_NB] = {"/blues9/9", "/blues9/6", "/blues9/3", "/blues9/1", "/blues9/8", "/blues9/7", "/blues9/4", "/blues9/2", "/blues9/1"}; static char *mic_worker_colors[MIC_WORKER_COLORS_NB] = {"/reds9/9", "/reds9/6", "/reds9/3", "/reds9/1", "/reds9/8", "/reds9/7", "/reds9/4", "/reds9/2", "/reds9/1"}; static char *scc_worker_colors[SCC_WORKER_COLORS_NB] = {"/reds9/9", "/reds9/6", "/reds9/3", "/reds9/1", "/reds9/8", "/reds9/7", "/reds9/4", "/reds9/2", "/reds9/1"}; static char *other_worker_colors[OTHER_WORKER_COLORS_NB] = {"/greys9/9", "/greys9/8", "/greys9/7", "/greys9/6"}; static char *worker_colors[STARPU_NMAXWORKERS]; static unsigned opencl_index = 0; static unsigned cuda_index = 0; static unsigned cpus_index = 0; static unsigned mic_index = 0; static unsigned scc_index = 0; static unsigned other_index = 0; static unsigned long fut_keymask; /* Get pointer to string starting at nth parameter */ static char *get_fxt_string(struct fxt_ev_64 *ev, int n) { char *s = (char *)&ev->param[n]; s[(FXT_MAX_PARAMS-n)*sizeof(unsigned long) - 1] = 0; return s; } /* * Paje trace file tools */ static FILE *out_paje_file; static FILE *distrib_time; static FILE *activity_file; static FILE *anim_file; static FILE *tasks_file; static FILE *data_file; struct data_parameter_info { unsigned long handle; unsigned long size; int mode; }; struct task_info { UT_hash_handle hh; char *model_name; char *name; int exclude_from_dag; unsigned long job_id; uint64_t tag; int workerid; int node; double submit_time; double start_time; double end_time; unsigned long footprint; unsigned long kflops; long iterations[2]; char *parameters; unsigned int ndeps; unsigned long *dependencies; unsigned long ndata; struct data_parameter_info *data; int mpi_rank; }; struct task_info *tasks_info; static struct task_info *get_task(unsigned long job_id, int mpi_rank) { struct task_info *task; unsigned i; HASH_FIND(hh, tasks_info, &job_id, sizeof(job_id), task); if (!task) { _STARPU_MALLOC(task, sizeof(*task)); task->model_name = NULL; task->name = NULL; task->exclude_from_dag = 0; task->job_id = job_id; task->tag = 0; task->workerid = -1; task->node = -1; task->submit_time = 0.; task->start_time = 0.; task->end_time = 0.; task->footprint = 0; task->kflops = 0.; for (i = 0; i < sizeof(task->iterations)/sizeof(task->iterations[0]); i++) task->iterations[i] = -1; task->parameters = NULL; task->ndeps = 0; task->dependencies = NULL; task->ndata = 0; task->data = NULL; task->mpi_rank = mpi_rank; HASH_ADD(hh, tasks_info, job_id, sizeof(task->job_id), task); } else STARPU_ASSERT(task->mpi_rank == mpi_rank); return task; } static void task_dump(struct task_info *task) { unsigned i; if (task->exclude_from_dag) goto out; if (!tasks_file) goto out; if (task->name) { fprintf(tasks_file, "Name: %s\n", task->name); if (!task->model_name) fprintf(tasks_file, "Model: %s\n", task->name); free(task->name); } if (task->model_name) { fprintf(tasks_file, "Model: %s\n", task->model_name); free(task->model_name); } fprintf(tasks_file, "JobId: %lu\n", task->job_id); if (task->dependencies) { fprintf(tasks_file, "DependsOn:"); for (i = 0; i < task->ndeps; i++) fprintf(tasks_file, " %lu", task->dependencies[i]); fprintf(tasks_file, "\n"); free(task->dependencies); } fprintf(tasks_file, "Tag: %"PRIx64"\n", task->tag); if (task->workerid >= 0) fprintf(tasks_file, "WorkerId: %d\n", task->workerid); if (task->node >= 0) fprintf(tasks_file, "MemoryNode: %d\n", task->node); if (task->submit_time != 0.) fprintf(tasks_file, "SubmitTime: %f\n", task->submit_time); if (task->start_time != 0.) fprintf(tasks_file, "StartTime: %f\n", task->start_time); if (task->end_time != 0.) fprintf(tasks_file, "EndTime: %f\n", task->end_time); fprintf(tasks_file, "Footprint: %lx\n", task->footprint); if (task->kflops != 0) fprintf(tasks_file, "GFlop: %f\n", ((double) task->kflops) / 1000000); if (task->iterations[0] != -1) { fprintf(tasks_file, "Iteration:"); for (i = 0; i < sizeof(task->iterations)/sizeof(task->iterations[0]); i++) { if (task->iterations[i] == -1) break; fprintf(tasks_file, " %ld", task->iterations[i]); } fprintf(tasks_file, "\n"); } if (task->parameters) { fprintf(tasks_file, "Parameters: %s\n", task->parameters); free(task->parameters); } if (task->data) { fprintf(tasks_file, "Handles:"); for (i = 0; i < task->ndata; i++) fprintf(tasks_file, " %lx", task->data[i].handle); fprintf(tasks_file, "\n"); fprintf(tasks_file, "Modes:"); for (i = 0; i < task->ndata; i++) fprintf(tasks_file, " %s%s%s%s%s", (task->data[i].mode & STARPU_R)?"R":"", (task->data[i].mode & STARPU_W)?"W":"", (task->data[i].mode & STARPU_SCRATCH)?"S":"", (task->data[i].mode & STARPU_REDUX)?"X":"", (task->data[i].mode & STARPU_COMMUTE)?"C":""); fprintf(tasks_file, "\n"); fprintf(tasks_file, "Sizes:"); for (i = 0; i < task->ndata; i++) fprintf(tasks_file, " %lu", task->data[i].size); fprintf(tasks_file, "\n"); } fprintf(tasks_file, "MPIRank: %d\n", task->mpi_rank); fprintf(tasks_file, "\n"); out: HASH_DEL(tasks_info, task); free(task); } struct data_info { UT_hash_handle hh; unsigned long handle; char *name; size_t size; char *description; unsigned dimensions; unsigned long *dims; int home_node; int mpi_rank; int mpi_owner; }; struct data_info *data_info; static struct data_info *get_data(unsigned long handle, int mpi_rank) { struct data_info *data; HASH_FIND(hh, data_info, &handle, sizeof(handle), data); if (!data) { _STARPU_MALLOC(data, sizeof(*data)); data->handle = handle; data->name = NULL; data->size = 0; data->description = 0; data->dimensions = 0; data->dims = NULL; data->home_node = STARPU_MAIN_RAM; data->mpi_rank = mpi_rank; data->mpi_owner = mpi_rank; HASH_ADD(hh, data_info, handle, sizeof(handle), data); } else STARPU_ASSERT(data->mpi_rank == mpi_rank); return data; } static void data_dump(struct data_info *data) { if (!data_file) goto out; fprintf(data_file, "Handle: %lx\n", data->handle); fprintf(data_file, "HomeNode: %d\n", data->home_node); if (data->mpi_rank >= 0) fprintf(data_file, "MPIRank: %d\n", data->mpi_rank); if (data->name) { fprintf(data_file, "Name: %s\n", data->name); free(data->name); } fprintf(data_file, "Size: %lu\n", (unsigned long) data->size); if (data->description) { fprintf(data_file, "Description: %s\n", data->description); free(data->description); } if (data->dimensions) { unsigned i; fprintf(data_file, "Coordinates:"); for (i = 0; i < data->dimensions; i++) fprintf(data_file, " %lu", data->dims[i]); fprintf(data_file, "\n"); } if (data->mpi_owner >= 0) fprintf(data_file, "MPIOwner: %d\n", data->mpi_owner); fprintf(data_file, "\n"); out: HASH_DEL(data_info, data); free(data); } static void set_next_other_worker_color(int workerid) { if (workerid >= STARPU_NMAXWORKERS) return; worker_colors[workerid] = other_worker_colors[other_index++]; if (other_index == OTHER_WORKER_COLORS_NB) other_index = 0; } static void set_next_cpu_worker_color(int workerid) { if (workerid >= STARPU_NMAXWORKERS) return; worker_colors[workerid] = cpus_worker_colors[cpus_index++]; if (cpus_index == CPUS_WORKER_COLORS_NB) cpus_index = 0; } static void set_next_cuda_worker_color(int workerid) { if (workerid >= STARPU_NMAXWORKERS) return; worker_colors[workerid] = cuda_worker_colors[cuda_index++]; if (cuda_index == CUDA_WORKER_COLORS_NB) cuda_index = 0; } static void set_next_opencl_worker_color(int workerid) { if (workerid >= STARPU_NMAXWORKERS) return; worker_colors[workerid] = opencl_worker_colors[opencl_index++]; if (opencl_index == OPENCL_WORKER_COLORS_NB) opencl_index = 0; } static void set_next_mic_worker_color(int workerid) { if (workerid >= STARPU_NMAXWORKERS) return; worker_colors[workerid] = mic_worker_colors[mic_index++]; if (mic_index == MIC_WORKER_COLORS_NB) mic_index = 0; } static void set_next_scc_worker_color(int workerid) { if (workerid >= STARPU_NMAXWORKERS) return; worker_colors[workerid] = scc_worker_colors[scc_index++]; if (scc_index == SCC_WORKER_COLORS_NB) scc_index = 0; } static const char *get_worker_color(int workerid) { if (workerid >= STARPU_NMAXWORKERS) workerid = STARPU_NMAXWORKERS - 1; return worker_colors[workerid]; } static unsigned get_colour_symbol_red(char *name) { /* choose some colour ... that's disguting yes */ uint32_t hash_symbol = starpu_hash_crc32c_string(name, 0); return (unsigned)starpu_hash_crc32c_string("red", hash_symbol) % 1024; } static unsigned get_colour_symbol_green(char *name) { /* choose some colour ... that's disguting yes */ uint32_t hash_symbol = starpu_hash_crc32c_string(name, 0); return (unsigned)starpu_hash_crc32c_string("green", hash_symbol) % 1024; } static unsigned get_colour_symbol_blue(char *name) { /* choose some colour ... that's disguting yes */ uint32_t hash_symbol = starpu_hash_crc32c_string(name, 0); return (unsigned)starpu_hash_crc32c_string("blue", hash_symbol) % 1024; } static double last_codelet_start[STARPU_NMAXWORKERS]; /* _STARPU_FUT_DO_PROBE5STR records only 3 longs */ char _starpu_last_codelet_symbol[STARPU_NMAXWORKERS][(FXT_MAX_PARAMS-5)*sizeof(unsigned long)]; static int last_codelet_parameter[STARPU_NMAXWORKERS]; #define MAX_PARAMETERS 8 static char last_codelet_parameter_description[STARPU_NMAXWORKERS][MAX_PARAMETERS][FXT_MAX_PARAMS*sizeof(unsigned long)]; /* If more than a period of time has elapsed, we flush the profiling info, * otherwise they are accumulated everytime there is a new relevant event. */ #define ACTIVITY_PERIOD 75.0 static double last_activity_flush_timestamp[STARPU_NMAXWORKERS]; static double accumulated_sleep_time[STARPU_NMAXWORKERS]; static double accumulated_exec_time[STARPU_NMAXWORKERS]; static unsigned steal_number = 0; LIST_TYPE(_starpu_symbol_name, char *name; ) static struct _starpu_symbol_name_list symbol_list; /* List of on-going communications */ LIST_TYPE(_starpu_communication, unsigned comid; double comm_start; double bandwidth; unsigned src_node; unsigned dst_node; const char *type; struct _starpu_communication *peer; ) static struct _starpu_communication_list communication_list; static double current_bandwidth_in_per_node[STARPU_MAXNODES] = {0.0}; static double current_bandwidth_out_per_node[STARPU_MAXNODES] = {0.0}; /* List of on-going computations */ LIST_TYPE(_starpu_computation, double comp_start; double gflops; struct _starpu_computation *peer; ) static struct _starpu_computation_list computation_list; static struct _starpu_computation *ongoing_computation[STARPU_NMAXWORKERS]; static double current_computation = 0.0; /* * Generic tools */ static double get_event_time_stamp(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { return (((double)(ev->time-options->file_offset))/1000000.0); } /* * Auxiliary functions for poti handling names */ #ifdef STARPU_HAVE_POTI static char *memnode_container_alias(char *output, int len, const char *prefix, long unsigned int memnodeid) { snprintf(output, len, "%smn%lu", prefix, memnodeid); return output; } static char *memmanager_container_alias(char *output, int len, const char *prefix, long unsigned int memnodeid) { snprintf(output, len, "%smm%lu", prefix, memnodeid); return output; } static char *thread_container_alias(char *output, int len, const char *prefix, long unsigned int threadid) { snprintf(output, len, "%st%lu", prefix, threadid); return output; } static char *worker_container_alias(char *output, int len, const char *prefix, long unsigned int workerid) { snprintf(output, len, "%sw%lu", prefix, workerid); return output; } static char *mpicommthread_container_alias(char *output, int len, const char *prefix) { snprintf(output, len, "%smpict", prefix); return output; } static char *program_container_alias(char *output, int len, const char *prefix) { snprintf(output, len, "%sp", prefix); return output; } static char *scheduler_container_alias(char *output, int len, const char *prefix) { snprintf(output, len, "%ssched", prefix); return output; } #endif static int nworkers = 0; struct worker_entry { UT_hash_handle hh; unsigned long tid; int workerid; int sync; } *worker_ids; static int register_thread(unsigned long tid, int workerid, int sync) { struct worker_entry *entry; HASH_FIND(hh, worker_ids, &tid, sizeof(tid), entry); /* only register a thread once */ if (entry) return 0; _STARPU_MALLOC(entry, sizeof(*entry)); entry->tid = tid; entry->workerid = workerid; entry->sync = sync; HASH_ADD(hh, worker_ids, tid, sizeof(tid), entry); return 1; } static int register_worker_id(unsigned long tid, int workerid, int sync) { nworkers++; STARPU_ASSERT_MSG(workerid < STARPU_NMAXWORKERS, "Too many workers in this trace, please increase in ./configure invocation the maximum number of CPUs and GPUs to the same value as was used for execution"); return register_thread(tid, workerid, sync); } /* Register user threads if not done already */ static void register_user_thread(double timestamp, unsigned long tid, const char *prefix) { if (register_thread(tid, -1, 0) && out_paje_file) { #ifdef STARPU_HAVE_POTI char program_container[STARPU_POTI_STR_LEN]; program_container_alias(program_container, STARPU_POTI_STR_LEN, prefix); char new_thread_container_alias[STARPU_POTI_STR_LEN]; thread_container_alias (new_thread_container_alias, STARPU_POTI_STR_LEN, prefix, tid); char new_thread_container_name[STARPU_POTI_STR_LEN]; snprintf(new_thread_container_name, STARPU_POTI_STR_LEN, "%sUserThread%lu", prefix, tid); poti_CreateContainer(timestamp, new_thread_container_alias, "UT", program_container, new_thread_container_alias); #else fprintf(out_paje_file, "7 %.9f %st%lu UT %sp %sUserThread%lu\n", timestamp, prefix, tid, prefix, prefix, tid); #endif } } static void register_mpi_thread(unsigned long tid) { int ret = register_thread(tid, -2, 0); STARPU_ASSERT(ret == 1); } static int find_worker_id(unsigned long tid) { struct worker_entry *entry; HASH_FIND(hh, worker_ids, &tid, sizeof(tid), entry); if (!entry) return -1; return entry->workerid; } /* check whether this thread manages several workers */ static int find_sync(unsigned long tid) { struct worker_entry *entry; HASH_FIND(hh, worker_ids, &tid, sizeof(tid), entry); if (!entry) return 0; return entry->sync; } static void update_accumulated_time(int worker, double sleep_time, double exec_time, double current_timestamp, int forceflush) { accumulated_sleep_time[worker] += sleep_time; accumulated_exec_time[worker] += exec_time; /* If sufficient time has elapsed since the last flush, we have a new * point in our graph */ double elapsed = current_timestamp - last_activity_flush_timestamp[worker]; if (forceflush || (elapsed > ACTIVITY_PERIOD)) { if (activity_file) fprintf(activity_file, "%d\t%.9f\t%.9f\t%.9f\t%.9f\n", worker, current_timestamp, elapsed, accumulated_exec_time[worker], accumulated_sleep_time[worker]); /* reset the accumulated times */ last_activity_flush_timestamp[worker] = current_timestamp; accumulated_sleep_time[worker] = 0.0; accumulated_exec_time[worker] = 0.0; } } static void memnode_set_state(double time, const char *prefix, unsigned int memnodeid, const char *name) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; memmanager_container_alias(container, STARPU_POTI_STR_LEN, prefix, memnodeid); poti_SetState(time, container, "MS", name); #else fprintf(out_paje_file, "10 %.9f %smm%u MS %s\n", time, prefix, memnodeid, name); #endif } static void memnode_push_state(double time, const char *prefix, unsigned int memnodeid, const char *name) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; memmanager_container_alias(container, STARPU_POTI_STR_LEN, prefix, memnodeid); poti_PushState(time, container, "MS", name); #else fprintf(out_paje_file, "11 %.9f %smm%u MS %s\n", time, prefix, memnodeid, name); #endif } static void memnode_pop_state(double time, const char *prefix, unsigned int memnodeid) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; memmanager_container_alias(container, STARPU_POTI_STR_LEN, prefix, memnodeid); poti_PopState(time, container, "MS"); #else fprintf(out_paje_file, "12 %.9f %smm%u MS\n", time, prefix, memnodeid); #endif } static void worker_set_state(double time, const char *prefix, long unsigned int workerid, const char *name) { if (fut_keymask == FUT_KEYMASK0) return; #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; worker_container_alias(container, STARPU_POTI_STR_LEN, prefix, workerid); poti_SetState(time, container, "WS", name); #else fprintf(out_paje_file, "10 %.9f %sw%lu WS \"%s\"\n", time, prefix, workerid, name); #endif } static void worker_push_state(double time, const char *prefix, long unsigned int workerid, const char *name) { if (fut_keymask == FUT_KEYMASK0) return; #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; worker_container_alias(container, STARPU_POTI_STR_LEN, prefix, workerid); poti_PushState(time, container, "WS", name); #else fprintf(out_paje_file, "11 %.9f %sw%lu WS %s\n", time, prefix, workerid, name); #endif } static void worker_pop_state(double time, const char *prefix, long unsigned int workerid) { if (fut_keymask == FUT_KEYMASK0) return; #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; worker_container_alias(container, STARPU_POTI_STR_LEN, prefix, workerid); poti_PopState(time, container, "WS"); #else fprintf(out_paje_file, "12 %.9f %sw%lu WS\n", time, prefix, workerid); #endif } static void thread_set_state(double time, const char *prefix, long unsigned int threadid, const char *name) { if (find_sync(threadid)) /* Unless using worker sets, collapse thread and worker */ return worker_set_state(time, prefix, find_worker_id(threadid), name); #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; thread_container_alias(container, STARPU_POTI_STR_LEN, prefix, threadid); poti_SetState(time, container, "S", name); #else fprintf(out_paje_file, "10 %.9f %st%lu S %s\n", time, prefix, threadid, name); #endif } #if 0 /* currently unused */ static void user_thread_set_state(double time, const char *prefix, long unsigned int threadid, const char *name) { register_user_thread(time, threadid, prefix); #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; thread_container_alias(container, STARPU_POTI_STR_LEN, prefix, threadid); poti_SetState(time, container, "US", name); #else fprintf(out_paje_file, "10 %.9f %st%lu US %s\n", time, prefix, threadid, name); #endif } #endif static void user_thread_push_state(double time, const char *prefix, long unsigned int threadid, const char *name) { register_user_thread(time, threadid, prefix); if (out_paje_file) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; thread_container_alias(container, STARPU_POTI_STR_LEN, prefix, threadid); poti_PushState(time, container, "US", name); #else fprintf(out_paje_file, "11 %.9f %st%lu US %s\n", time, prefix, threadid, name); #endif } } static void user_thread_pop_state(double time, const char *prefix, long unsigned int threadid) { register_user_thread(time, threadid, prefix); if (out_paje_file) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; thread_container_alias(container, STARPU_POTI_STR_LEN, prefix, threadid); poti_PopState(time, container, "US"); #else fprintf(out_paje_file, "12 %.9f %st%lu US\n", time, prefix, threadid); #endif } } static void thread_push_state(double time, const char *prefix, long unsigned int threadid, const char *name) { if (find_sync(threadid)) /* Unless using worker sets, collapse thread and worker */ return worker_push_state(time, prefix, find_worker_id(threadid), name); #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; thread_container_alias(container, STARPU_POTI_STR_LEN, prefix, threadid); poti_PushState(time, container, "S", name); #else fprintf(out_paje_file, "11 %.9f %st%lu S %s\n", time, prefix, threadid, name); #endif } static void thread_pop_state(double time, const char *prefix, long unsigned int threadid) { if (find_sync(threadid)) /* Unless using worker sets, collapse thread and worker */ return worker_pop_state(time, prefix, find_worker_id(threadid)); #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; thread_container_alias(container, STARPU_POTI_STR_LEN, prefix, threadid); poti_PopState(time, container, "S"); #else fprintf(out_paje_file, "12 %.9f %st%lu S\n", time, prefix, threadid); #endif } static void worker_set_detailed_state(double time, const char *prefix, long unsigned int workerid, const char *name, unsigned long size, const char *parameters, unsigned long footprint, unsigned long long tag, unsigned long job_id, double gflop, unsigned X, unsigned Y, unsigned Z, long iteration, long subiteration) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; worker_container_alias(container, STARPU_POTI_STR_LEN, prefix, workerid); /* TODO: set detailed state */ poti_SetState(time, container, "WS", name); #else fprintf(out_paje_file, "20 %.9f %sw%lu WS %s %lu %s %08lx %016llx %lu %f %u %u %u %ld %ld\n", time, prefix, workerid, name, size, parameters, footprint, tag, job_id, gflop, X, Y, Z, iteration, subiteration); #endif } static void mpicommthread_set_state(double time, const char *prefix, const char *name) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; mpicommthread_container_alias(container, STARPU_POTI_STR_LEN, prefix); poti_SetState(time, container, "CtS", name); #else fprintf(out_paje_file, "10 %.9f %smpict CtS %s\n", time, prefix, name); #endif } static void mpicommthread_push_state(double time, const char *prefix, const char *name) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; mpicommthread_container_alias(container, STARPU_POTI_STR_LEN, prefix); poti_PushState(time, container, "CtS", name); #else fprintf(out_paje_file, "11 %.9f %smpict CtS %s\n", time, prefix, name); #endif } static void mpicommthread_pop_state(double time, const char *prefix) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; mpicommthread_container_alias(container, STARPU_POTI_STR_LEN, prefix); poti_PopState(time, container, "CtS"); #else fprintf(out_paje_file, "12 %.9f %smpict CtS\n", time, prefix); #endif } /* * Initialization */ static void handle_new_mem_node(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { char *prefix = options->file_prefix; if (out_paje_file) { #ifdef STARPU_HAVE_POTI char program_container[STARPU_POTI_STR_LEN]; program_container_alias(program_container, STARPU_POTI_STR_LEN, prefix); char new_memnode_container_alias[STARPU_POTI_STR_LEN], new_memnode_container_name[STARPU_POTI_STR_LEN]; char new_memmanager_container_alias[STARPU_POTI_STR_LEN], new_memmanager_container_name[STARPU_POTI_STR_LEN]; memnode_container_alias (new_memnode_container_alias, STARPU_POTI_STR_LEN, prefix, ev->param[0]); /* TODO: ramkind */ snprintf(new_memnode_container_name, STARPU_POTI_STR_LEN, "%sMEMNODE%"PRIu64"", prefix, ev->param[0]); poti_CreateContainer(get_event_time_stamp(ev, options), new_memnode_container_alias, "Mn", program_container, new_memnode_container_name); memmanager_container_alias (new_memmanager_container_alias, STARPU_POTI_STR_LEN, prefix, ev->param[0]); /* TODO: ramkind */ snprintf(new_memmanager_container_name, STARPU_POTI_STR_LEN, "%sMEMMANAGER%"PRIu64"", prefix, ev->param[0]); poti_CreateContainer(get_event_time_stamp(ev, options), new_memmanager_container_alias, "Mm", new_memnode_container_alias, new_memmanager_container_name); #else fprintf(out_paje_file, "7 %.9f %smn%"PRIu64" Mn %sp %sMEMNODE%"PRIu64"\n", get_event_time_stamp(ev, options), prefix, ev->param[0], prefix, options->file_prefix, ev->param[0]); fprintf(out_paje_file, "7 %.9f %smm%"PRIu64" Mm %smn%"PRIu64" %sMEMMANAGER%"PRIu64"\n", get_event_time_stamp(ev, options), prefix, ev->param[0], prefix, ev->param[0], options->file_prefix, ev->param[0]); #endif if (!options->no_bus) { #ifdef STARPU_HAVE_POTI poti_SetVariable(0.0, new_memmanager_container_alias, "use", 0.0); poti_SetVariable(0.0, new_memmanager_container_alias, "bwi", 0.0); poti_SetVariable(0.0, new_memmanager_container_alias, "bwo", 0.0); #else fprintf(out_paje_file, "13 %.9f %smm%"PRIu64" use 0.0\n", 0.0, prefix, ev->param[0]); fprintf(out_paje_file, "13 %.9f %smm%"PRIu64" bwi 0.0\n", 0.0, prefix, ev->param[0]); fprintf(out_paje_file, "13 %.9f %smm%"PRIu64" bwo 0.0\n", 0.0, prefix, ev->param[0]); #endif } } } static void handle_worker_init_start(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { /* arg0 : type of worker (cuda, cpu ..) arg1 : memory node arg2 : thread id */ char *prefix = options->file_prefix; int devid = ev->param[2]; int workerid = ev->param[1]; int nodeid = ev->param[3]; int bindid = ev->param[4]; int set = ev->param[5]; long unsigned int threadid = ev->param[6]; int new_thread; new_thread = register_worker_id(threadid, workerid, set); char *kindstr = ""; struct starpu_perfmodel_arch arch; arch.ndevices = 1; _STARPU_MALLOC(arch.devices, sizeof(struct starpu_perfmodel_device)); switch (ev->param[0]) { case _STARPU_FUT_APPS_KEY: set_next_other_worker_color(workerid); kindstr = "APPS"; break; case _STARPU_FUT_CPU_KEY: set_next_cpu_worker_color(workerid); kindstr = "CPU"; arch.devices[0].type = STARPU_CPU_WORKER; arch.devices[0].devid = 0; arch.devices[0].ncores = 1; break; case _STARPU_FUT_CUDA_KEY: set_next_cuda_worker_color(workerid); kindstr = "CUDA"; arch.devices[0].type = STARPU_CUDA_WORKER; arch.devices[0].devid = devid; arch.devices[0].ncores = 1; break; case _STARPU_FUT_OPENCL_KEY: set_next_opencl_worker_color(workerid); kindstr = "OPENCL"; arch.devices[0].type = STARPU_OPENCL_WORKER; arch.devices[0].devid = devid; arch.devices[0].ncores = 1; break; case _STARPU_FUT_MIC_KEY: set_next_mic_worker_color(workerid); kindstr = "mic"; arch.devices[0].type = STARPU_MIC_WORKER; arch.devices[0].devid = devid; arch.devices[0].ncores = 1; break; case _STARPU_FUT_SCC_KEY: set_next_scc_worker_color(workerid); kindstr = "scc"; arch.devices[0].type = STARPU_SCC_WORKER; arch.devices[0].devid = devid; arch.devices[0].ncores = 1; break; default: STARPU_ABORT(); } if (out_paje_file) { #ifdef STARPU_HAVE_POTI char new_thread_container_alias[STARPU_POTI_STR_LEN]; thread_container_alias (new_thread_container_alias, STARPU_POTI_STR_LEN, prefix, threadid); char new_worker_container_alias[STARPU_POTI_STR_LEN]; worker_container_alias (new_worker_container_alias, STARPU_POTI_STR_LEN, prefix, workerid); char memnode_container[STARPU_POTI_STR_LEN]; memnode_container_alias(memnode_container, STARPU_POTI_STR_LEN, prefix, nodeid); char new_thread_container_name[STARPU_POTI_STR_LEN]; snprintf(new_thread_container_name, STARPU_POTI_STR_LEN, "%s%d", prefix, bindid); char new_worker_container_name[STARPU_POTI_STR_LEN]; snprintf(new_worker_container_name, STARPU_POTI_STR_LEN, "%s%s%d", prefix, kindstr, devid); if (new_thread) poti_CreateContainer(get_event_time_stamp(ev, options), new_thread_container_alias, "T", memnode_container, new_thread_container_name); poti_CreateContainer(get_event_time_stamp(ev, options), new_worker_container_alias, "W", new_thread_container_alias, new_worker_container_name); if (!options->no_flops) poti_SetVariable(0.0, new_worker_container_alias, "gf", 0.0); #else if (new_thread) fprintf(out_paje_file, "7 %.9f %st%lu T %smn%d %s%d\n", get_event_time_stamp(ev, options), prefix, threadid, prefix, nodeid, prefix, bindid); fprintf(out_paje_file, "7 %.9f %sw%d W %st%lu %s%s%d\n", get_event_time_stamp(ev, options), prefix, workerid, prefix, threadid, prefix, kindstr, devid); if (!options->no_flops) fprintf(out_paje_file, "13 %.9f %sw%d gf 0.0\n", 0.0, prefix, workerid); #endif } /* start initialization */ if (out_paje_file) thread_set_state(get_event_time_stamp(ev, options), prefix, threadid, "In"); if (activity_file) fprintf(activity_file, "name\t%d\t%s %d\n", workerid, kindstr, devid); snprintf(options->worker_names[workerid], sizeof(options->worker_names[workerid])-1, "%s %d", kindstr, devid); options->worker_names[workerid][sizeof(options->worker_names[workerid])-1] = 0; options->worker_archtypes[workerid] = arch; } static void handle_worker_init_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { char *prefix = options->file_prefix; int worker; if (out_paje_file) thread_set_state(get_event_time_stamp(ev, options), prefix, ev->param[0], "B"); if (ev->nb_params < 2) worker = find_worker_id(ev->param[0]); else worker = ev->param[1]; if (out_paje_file) worker_set_state(get_event_time_stamp(ev, options), prefix, worker, "I"); /* Initilize the accumulated time counters */ last_activity_flush_timestamp[worker] = get_event_time_stamp(ev, options); accumulated_sleep_time[worker] = 0.0; accumulated_exec_time[worker] = 0.0; } static void handle_worker_deinit_start(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { char *prefix = options->file_prefix; if (out_paje_file) thread_set_state(get_event_time_stamp(ev, options), prefix, ev->param[0], "D"); } static void handle_worker_deinit_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { char *prefix = options->file_prefix; if (out_paje_file) { #ifdef STARPU_HAVE_POTI char worker_container[STARPU_POTI_STR_LEN]; thread_container_alias(worker_container, STARPU_POTI_STR_LEN, prefix, ev->param[1]); poti_DestroyContainer(get_event_time_stamp(ev, options), "T", worker_container); #else fprintf(out_paje_file, "8 %.9f %st%"PRIu64" T\n", get_event_time_stamp(ev, options), prefix, ev->param[1]); #endif } } #ifdef STARPU_HAVE_POTI static void create_paje_state_color(char *name, char *type, int ctx, float red, float green, float blue) { char color[STARPU_POTI_STR_LEN]; char alias[STARPU_POTI_STR_LEN]; snprintf(color, sizeof(color), "%f %f %f", red, green, blue); if (ctx) { snprintf(alias, sizeof(alias), "%s_%d", name, ctx); } else { snprintf(alias, sizeof(alias), "%s", name); } poti_DefineEntityValue(alias, type, name, color); } #endif static void create_paje_state_if_not_found(char *name, struct starpu_fxt_options *options) { struct _starpu_symbol_name *itor; for (itor = _starpu_symbol_name_list_begin(&symbol_list); itor != _starpu_symbol_name_list_end(&symbol_list); itor = _starpu_symbol_name_list_next(itor)) { if (!strcmp(name, itor->name)) { /* we found an entry */ return; } } /* it's the first time ... */ struct _starpu_symbol_name *entry = _starpu_symbol_name_new(); entry->name = strdup(name); STARPU_ASSERT(entry->name); _starpu_symbol_name_list_push_front(&symbol_list, entry); /* choose some colour ... that's disguting yes */ unsigned hash_symbol_red = get_colour_symbol_red(name); unsigned hash_symbol_green = get_colour_symbol_green(name); unsigned hash_symbol_blue = get_colour_symbol_blue(name); uint32_t hash_sum = hash_symbol_red + hash_symbol_green + hash_symbol_blue; float red, green, blue; if (options->per_task_colour) { red = (1.0f * hash_symbol_red) / hash_sum; green = (1.0f * hash_symbol_green) / hash_sum; blue = (1.0f * hash_symbol_blue) / hash_sum; } else { /* Use the hardcoded value for execution mode */ red = 0.0f; green = 0.6f; blue = 0.4f; } /* create the Paje state */ if (out_paje_file) { #ifdef STARPU_HAVE_POTI create_paje_state_color(name, "WS", 0, red, green, blue); int i; for(i = 1; i < STARPU_NMAX_SCHED_CTXS; i++) { char ctx[10]; snprintf(ctx, sizeof(ctx), "Ctx%d", i); if(i%10 == 1) create_paje_state_color(name, ctx, i, 1.0, 0.39, 1.0); if(i%10 == 2) create_paje_state_color(name, ctx, i, .0, 1.0, 0.0); if(i%10 == 3) create_paje_state_color(name, ctx, i, 1.0, 1.0, .0); if(i%10 == 4) create_paje_state_color(name, ctx, i, .0, 0.95, 1.0); if(i%10 == 5) create_paje_state_color(name, ctx, i, .0, .0, .0); if(i%10 == 6) create_paje_state_color(name, ctx, i, .0, .0, 0.5); if(i%10 == 7) create_paje_state_color(name, ctx, i, 0.41, 0.41, 0.41); if(i%10 == 8) create_paje_state_color(name, ctx, i, 1.0, .0, 1.0); if(i%10 == 9) create_paje_state_color(name, ctx, i, .0, .0, 1.0); if(i%10 == 0) create_paje_state_color(name, ctx, i, 0.6, 0.80, 50.0); } /* create_paje_state_color(name, "Ctx1", 1.0, 0.39, 1.0); */ /* create_paje_state_color(name, "Ctx2", .0, 1.0, 0.0); */ /* create_paje_state_color(name, "Ctx3", 1.0, 1.0, .0); */ /* create_paje_state_color(name, "Ctx4", .0, 0.95, 1.0); */ /* create_paje_state_color(name, "Ctx5", .0, .0, .0); */ /* create_paje_state_color(name, "Ctx6", .0, .0, 0.5); */ /* create_paje_state_color(name, "Ctx7", 0.41, 0.41, 0.41); */ /* create_paje_state_color(name, "Ctx8", 1.0, .0, 1.0); */ /* create_paje_state_color(name, "Ctx9", .0, .0, 1.0); */ /* create_paje_state_color(name, "Ctx10", 0.6, 0.80, 0.19); */ #else fprintf(out_paje_file, "6 %s WS %s \"%f %f %f\" \n", name, name, red, green, blue); int i; for(i = 1; i < STARPU_NMAX_SCHED_CTXS; i++) { if(i%10 == 1) fprintf(out_paje_file, "6 %s_%d Ctx%d %s \"1.0 0.39 1.0\" \n", name, i, i, name); if(i%10 == 2) fprintf(out_paje_file, "6 %s_%d Ctx%d %s \".0 1.0 .0\" \n", name, i, i, name); if(i%10 == 3) fprintf(out_paje_file, "6 %s_%d Ctx%d %s \"0.87 0.87 .0\" \n", name, i, i, name); if(i%10 == 4) fprintf(out_paje_file, "6 %s_%d Ctx%d %s \".0 0.95 1.0\" \n", name, i, i, name); if(i%10 == 5) fprintf(out_paje_file, "6 %s_%d Ctx%d %s \".0 .0 .0\" \n", name, i, i, name); if(i%10 == 6) fprintf(out_paje_file, "6 %s_%d Ctx%d %s \".0 .0 0.5\" \n", name, i, i, name); if(i%10 == 7) fprintf(out_paje_file, "6 %s_%d Ctx%d %s \"0.41 0.41 0.41\" \n", name, i, i, name); if(i%10 == 8) fprintf(out_paje_file, "6 %s_%d Ctx%d %s \"1.0 .0 1.0\" \n", name, i, i, name); if(i%10 == 9) fprintf(out_paje_file, "6 %s_%d Ctx%d %s \".0 .0 1.0\" \n", name, i, i, name); if(i%10 == 0) fprintf(out_paje_file, "6 %s_%d Ctx%d %s \"0.6 0.80 0.19\" \n", name, i, i, name); } /* fprintf(out_paje_file, "6 %s Ctx1 %s \"1.0 0.39 1.0\" \n", name, name); */ /* fprintf(out_paje_file, "6 %s Ctx2 %s \".0 1.0 .0\" \n", name, name); */ /* fprintf(out_paje_file, "6 %s Ctx3 %s \"0.87 0.87 .0\" \n", name, name); */ /* fprintf(out_paje_file, "6 %s Ctx4 %s \".0 0.95 1.0\" \n", name, name); */ /* fprintf(out_paje_file, "6 %s Ctx5 %s \".0 .0 .0\" \n", name, name); */ /* fprintf(out_paje_file, "6 %s Ctx6 %s \".0 .0 0.5\" \n", name, name); */ /* fprintf(out_paje_file, "6 %s Ctx7 %s \"0.41 0.41 0.41\" \n", name, name); */ /* fprintf(out_paje_file, "6 %s Ctx8 %s \"1.0 .0 1.0\" \n", name, name); */ /* fprintf(out_paje_file, "6 %s Ctx9 %s \".0 .0 1.0\" \n", name, name); */ /* fprintf(out_paje_file, "6 %s Ctx10 %s \"0.6 0.80 0.19\" \n", name, name); */ #endif } } static void handle_start_codelet_body(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker = ev->param[2]; int node = ev->param[3]; if (worker < 0) return; unsigned long has_name = ev->param[4]; char *name = has_name?get_fxt_string(ev, 5):"unknown"; snprintf(_starpu_last_codelet_symbol[worker], sizeof(_starpu_last_codelet_symbol[worker])-1, "%s", name); _starpu_last_codelet_symbol[worker][sizeof(_starpu_last_codelet_symbol[worker])-1] = 0; last_codelet_parameter[worker] = 0; double start_codelet_time = get_event_time_stamp(ev, options); last_codelet_start[worker] = start_codelet_time; create_paje_state_if_not_found(name, options); struct task_info *task = get_task(ev->param[0], options->file_rank); task->start_time = start_codelet_time; task->workerid = worker; task->name = strdup(name); task->node = node; if (out_paje_file) { char *prefix = options->file_prefix; unsigned sched_ctx = ev->param[1]; worker_set_state(start_codelet_time, prefix, ev->param[2], name); if (sched_ctx != 0) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; char ctx[6]; snprintf(ctx, sizeof(ctx), "Ctx%u", sched_ctx); worker_container_alias(container, STARPU_POTI_STR_LEN, prefix, ev->param[2]); poti_SetState(start_codelet_time, container, ctx, name); #else fprintf(out_paje_file, "10 %.9f %sw%"PRIu64" Ctx%d \"%s\"\n", start_codelet_time, prefix, ev->param[2], sched_ctx, name); #endif } } if (!options->no_flops) { struct _starpu_computation *comp = _starpu_computation_new(); comp->comp_start = start_codelet_time; comp->peer = NULL; ongoing_computation[worker] = comp; _starpu_computation_list_push_back(&computation_list, comp); } } static void handle_model_name(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { struct task_info *task = get_task(ev->param[0], options->file_rank); char *name = get_fxt_string(ev, 1); task->model_name = strdup(name); } static void handle_codelet_data(struct fxt_ev_64 *ev STARPU_ATTRIBUTE_UNUSED, struct starpu_fxt_options *options STARPU_ATTRIBUTE_UNUSED) { int worker = ev->param[0]; if (worker < 0) return; int num = last_codelet_parameter[worker]++; if (num >= MAX_PARAMETERS) return; char *name = get_fxt_string(ev, 1); snprintf(last_codelet_parameter_description[worker][num], sizeof(last_codelet_parameter_description[worker][num])-1, "%s", name); last_codelet_parameter_description[worker][num][sizeof(last_codelet_parameter_description[worker][num])-1] = 0; } static void handle_codelet_data_handle(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { struct task_info *task = get_task(ev->param[0], options->file_rank); unsigned alloc = 0; if (task->ndata == 0) /* Start with 8=2^3, should be plenty in most cases */ alloc = 8; else if (task->ndata >= 8) { /* Allocate dependencies array by powers of two */ if (! ((task->ndata - 1) & task->ndata)) /* Is task->ndata a power of two? */ { /* We have filled the previous power of two, get another one */ alloc = task->ndata * 2; } } if (alloc) _STARPU_REALLOC(task->data, sizeof(*task->data) * alloc); task->data[task->ndata].handle = ev->param[1]; task->data[task->ndata].size = ev->param[2]; task->data[task->ndata].mode = ev->param[3]; task->ndata++; } static void handle_codelet_details(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker = ev->param[5]; unsigned long job_id = ev->param[6]; if (worker < 0) return; char parameters[256]; size_t eaten = 0; if (!last_codelet_parameter[worker]) eaten += snprintf(parameters + eaten, sizeof(parameters) - eaten - 1, "nodata"); else { int i; for (i = 0; i < last_codelet_parameter[worker] && i < MAX_PARAMETERS; i++) { eaten += snprintf(parameters + eaten, sizeof(parameters) - eaten - 1, "%s%s", i?"_":"", last_codelet_parameter_description[worker][i]); } } parameters[sizeof(parameters)-1] = 0; struct task_info *task = get_task(job_id, options->file_rank); task->parameters = strdup(parameters); task->footprint = ev->param[2]; task->kflops = ev->param[3]; task->tag = ev->param[4]; unsigned i, X = 0, Y = 0, Z = 0; for (i = 0; i < task->ndata; i++) { if (task->data[i].mode & STARPU_W) { struct data_info *data = get_data(task->data[i].handle, options->file_rank); if (data->dimensions >= 1) X = data->dims[0]; if (data->dimensions >= 2) Y = data->dims[1]; if (data->dimensions >= 3) Z = data->dims[2]; break; } } if (out_paje_file) { char *prefix = options->file_prefix; unsigned sched_ctx = ev->param[0]; worker_set_detailed_state(last_codelet_start[worker], prefix, worker, _starpu_last_codelet_symbol[worker], ev->param[1], parameters, ev->param[2], ev->param[4], job_id, ((double) task->kflops) / 1000000, X, Y, Z, task->iterations[0], task->iterations[1]); if (sched_ctx != 0) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; char ctx[6]; snprintf(ctx, sizeof(ctx), "Ctx%u", sched_ctx); worker_container_alias(container, STARPU_POTI_STR_LEN, prefix, worker); poti_SetState(last_codelet_start[worker], container, ctx, _starpu_last_codelet_symbol[worker]); #else fprintf(out_paje_file, "20 %.9f %sw%d Ctx%u \"%s\" %lu %s %08lx %016lx %lu\n", last_codelet_start[worker], prefix, worker, sched_ctx, _starpu_last_codelet_symbol[worker], ev->param[1], parameters, ev->param[2], ev->param[4], job_id); #endif } } } static long dumped_codelets_count; static struct starpu_fxt_codelet_event *dumped_codelets; static void handle_end_codelet_body(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker = ev->param[3]; if (worker < 0) return; char *prefix = options->file_prefix; double end_codelet_time = get_event_time_stamp(ev, options); size_t codelet_size = ev->param[1]; uint32_t codelet_hash = ev->param[2]; long unsigned int threadid = ev->param[4]; char *name = get_fxt_string(ev, 4); const char *state = "I"; if (find_sync(threadid)) state = "B"; if (out_paje_file) worker_set_state(end_codelet_time, prefix, worker, state); double codelet_length = (end_codelet_time - last_codelet_start[worker]); struct task_info *task = get_task(ev->param[0], options->file_rank); double gflops = (((double)task->kflops) / 1000000) / (codelet_length / 1000); get_task(ev->param[0], options->file_rank)->end_time = end_codelet_time; update_accumulated_time(worker, 0.0, codelet_length, end_codelet_time, 0); if (!options->no_flops) { if (out_paje_file) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; worker_container_alias(container, STARPU_POTI_STR_LEN, prefix, worker); poti_SetVariable(task->start_time, container, "gf", gflops); poti_SetVariable(end_codelet_time, container, "gf", 0); #else fprintf(out_paje_file, "13 %.9f %sw%d gf %f\n", task->start_time, prefix, worker, gflops); fprintf(out_paje_file, "13 %.9f %sw%d gf %f\n", end_codelet_time, prefix, worker, 0.); #endif } struct _starpu_computation *comp = _starpu_computation_new(); comp->comp_start = end_codelet_time; comp->gflops = -gflops; comp->peer = ongoing_computation[worker]; ongoing_computation[worker] = NULL; comp->peer->gflops = +gflops; comp->peer->peer = comp; _starpu_computation_list_push_back(&computation_list, comp); } if (distrib_time) fprintf(distrib_time, "%s\t%s%d\t%ld\t%"PRIx32"\t%.9f\n", _starpu_last_codelet_symbol[worker], prefix, worker, (unsigned long) codelet_size, codelet_hash, codelet_length); if (options->dumped_codelets) { dumped_codelets_count++; _STARPU_REALLOC(dumped_codelets, dumped_codelets_count*sizeof(struct starpu_fxt_codelet_event)); snprintf(dumped_codelets[dumped_codelets_count - 1].symbol, sizeof(dumped_codelets[dumped_codelets_count - 1].symbol)-1, "%s", _starpu_last_codelet_symbol[worker]); dumped_codelets[dumped_codelets_count - 1].symbol[sizeof(dumped_codelets[dumped_codelets_count - 1].symbol)-1] = 0; dumped_codelets[dumped_codelets_count - 1].workerid = worker; snprintf(dumped_codelets[dumped_codelets_count - 1].perfmodel_archname, sizeof(dumped_codelets[dumped_codelets_count - 1].perfmodel_archname)-1, "%s", name); dumped_codelets[dumped_codelets_count - 1].perfmodel_archname[sizeof(dumped_codelets[dumped_codelets_count - 1].perfmodel_archname)-1] = 0; dumped_codelets[dumped_codelets_count - 1].size = codelet_size; dumped_codelets[dumped_codelets_count - 1].hash = codelet_hash; dumped_codelets[dumped_codelets_count - 1].time = codelet_length; } _starpu_last_codelet_symbol[worker][0] = 0; } static void handle_start_executing(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { char *prefix = options->file_prefix; long unsigned int threadid = ev->param[0]; if (out_paje_file && !find_sync(threadid)) thread_set_state(get_event_time_stamp(ev, options), prefix, threadid, "E"); } static void handle_end_executing(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { char *prefix = options->file_prefix; long unsigned int threadid = ev->param[0]; if (out_paje_file && !find_sync(threadid)) thread_set_state(get_event_time_stamp(ev, options), prefix, threadid, "B"); } static void handle_user_event(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; unsigned long code = ev->param[0]; #ifdef STARPU_HAVE_POTI char paje_value[STARPU_POTI_STR_LEN], container[STARPU_POTI_STR_LEN]; snprintf(paje_value, STARPU_POTI_STR_LEN, "%lu", code); #endif char *prefix = options->file_prefix; worker = find_worker_id(ev->param[1]); if (worker < 0) { if (out_paje_file) #ifdef STARPU_HAVE_POTI program_container_alias (container, STARPU_POTI_STR_LEN, prefix); #else fprintf(out_paje_file, "9 %.9f user_user_event %sp %lu\n", get_event_time_stamp(ev, options), prefix, code); #endif } else { if (out_paje_file) #ifdef STARPU_HAVE_POTI thread_container_alias (container, STARPU_POTI_STR_LEN, prefix, ev->param[1]); #else fprintf(out_paje_file, "9 %.9f user_event %st%"PRIu64" %lu\n", get_event_time_stamp(ev, options), prefix, ev->param[1], code); #endif } #ifdef STARPU_HAVE_POTI if (out_paje_file) poti_NewEvent(get_event_time_stamp(ev, options), container, "user_event", paje_value); #endif } static void handle_start_callback(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; worker = find_worker_id(ev->param[1]); if (worker >= 0) { if (out_paje_file) thread_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[1], "C"); } else if (worker == -2) { /* MPI thread */ mpicommthread_push_state(get_event_time_stamp(ev, options), options->file_prefix, "C"); } else user_thread_push_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[1], "C"); } static void handle_end_callback(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; worker = find_worker_id(ev->param[1]); if (worker >= 0) { if (out_paje_file) thread_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[1], "B"); } else if (worker == -2) { /* MPI thread */ mpicommthread_pop_state(get_event_time_stamp(ev, options), options->file_prefix); } else user_thread_pop_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[1]); } static void handle_hypervisor_begin(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; worker = find_worker_id(ev->param[0]); if (worker >= 0) { if (out_paje_file) thread_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[0], "H"); } else if (worker == -2) { /* MPI thread */ mpicommthread_push_state(get_event_time_stamp(ev, options), options->file_prefix, "H"); } else user_thread_push_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[1], "H"); } static void handle_hypervisor_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; worker = find_worker_id(ev->param[0]); if (worker >= 0) { if (out_paje_file) thread_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[0], "B"); } else if (worker == -2) { /* MPI thread */ mpicommthread_pop_state(get_event_time_stamp(ev, options), options->file_prefix); } else user_thread_pop_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[1]); } static void handle_worker_status_on_tid(struct fxt_ev_64 *ev, struct starpu_fxt_options *options, const char *newstatus) { int worker; worker = find_worker_id(ev->param[1]); if (worker < 0) return; if (out_paje_file) thread_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[1], newstatus); } static void handle_worker_status(struct fxt_ev_64 *ev, struct starpu_fxt_options *options, const char *newstatus) { int worker; worker = find_worker_id(ev->param[1]); if (worker < 0) return; if (out_paje_file) thread_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[1], newstatus); } static double last_sleep_start[STARPU_NMAXWORKERS]; static void handle_worker_scheduling_start(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; worker = find_worker_id(ev->param[0]); if (worker < 0) return; if (out_paje_file) thread_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[0], "Sc"); } static void handle_worker_scheduling_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; worker = find_worker_id(ev->param[0]); if (worker < 0) return; if (out_paje_file) thread_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[0], "B"); } static void handle_worker_scheduling_push(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; worker = find_worker_id(ev->param[0]); if (worker < 0) return; if (out_paje_file) thread_push_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[0], "Sc"); } static void handle_worker_scheduling_pop(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; worker = find_worker_id(ev->param[0]); if (worker < 0) return; if (out_paje_file) thread_pop_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[0]); } static void handle_worker_sleep_start(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; worker = find_worker_id(ev->param[0]); if (worker < 0) return; double start_sleep_time = get_event_time_stamp(ev, options); last_sleep_start[worker] = start_sleep_time; if (out_paje_file) thread_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[0], "Sl"); } static void handle_worker_sleep_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; worker = find_worker_id(ev->param[0]); if (worker < 0) return; double end_sleep_timestamp = get_event_time_stamp(ev, options); if (out_paje_file) thread_set_state(end_sleep_timestamp, options->file_prefix, ev->param[0], "B"); double sleep_length = end_sleep_timestamp - last_sleep_start[worker]; update_accumulated_time(worker, sleep_length, 0.0, end_sleep_timestamp, 0); } static void handle_data_register(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned long handle = ev->param[0]; char *prefix = options->file_prefix; struct data_info *data = get_data(handle, options->file_rank); char *description = get_fxt_string(ev, 3); data->size = ev->param[1]; data->home_node = ev->param[2]; if (description[0]) data->description = strdup(description); if (out_paje_file && !options->no_events) { #ifdef STARPU_HAVE_POTI char paje_value[STARPU_POTI_STR_LEN], container[STARPU_POTI_STR_LEN]; snprintf(paje_value, STARPU_POTI_STR_LEN, "%lx", handle); program_container_alias (container, STARPU_POTI_STR_LEN, prefix); poti_NewEvent(get_event_time_stamp(ev, options), container, "register", paje_value); #else fprintf(out_paje_file, "9 %.9f register %sp %lx\n", get_event_time_stamp(ev, options), prefix, handle); #endif } } static void handle_data_unregister(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned long handle = ev->param[0]; char *prefix = options->file_prefix; struct data_info *data = get_data(handle, options->file_rank); if (out_paje_file && !options->no_events) { #ifdef STARPU_HAVE_POTI char paje_value[STARPU_POTI_STR_LEN], container[STARPU_POTI_STR_LEN]; snprintf(paje_value, STARPU_POTI_STR_LEN, "%lx", handle); program_container_alias (container, STARPU_POTI_STR_LEN, prefix); poti_NewEvent(get_event_time_stamp(ev, options), container, "unregister", paje_value); #else fprintf(out_paje_file, "9 %.9f unregister %sp %lx\n", get_event_time_stamp(ev, options), prefix, handle); #endif } data_dump(data); } static void handle_data_invalidate(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned long handle = ev->param[0]; unsigned node = ev->param[1]; char *prefix = options->file_prefix; if (out_paje_file) { #ifdef STARPU_HAVE_POTI char paje_value[STARPU_POTI_STR_LEN], memnode_container[STARPU_POTI_STR_LEN]; memmanager_container_alias(memnode_container, STARPU_POTI_STR_LEN, prefix, node); snprintf(paje_value, STARPU_POTI_STR_LEN, "%lx", handle); poti_NewEvent(get_event_time_stamp(ev, options), memnode_container, "invalidate", paje_value); #else fprintf(out_paje_file, "9 %.9f invalidate %smm%u %lx\n", get_event_time_stamp(ev, options), prefix, node, handle); #endif } } static void handle_data_copy(void) { } static void handle_data_name(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned long handle = ev->param[0]; char *name = get_fxt_string(ev, 1); struct data_info *data = get_data(handle, options->file_rank); data->name = strdup(name); } static void handle_data_coordinates(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned long handle = ev->param[0]; unsigned dimensions = ev->param[1]; struct data_info *data = get_data(handle, options->file_rank); unsigned i; data->dimensions = dimensions; _STARPU_MALLOC(data->dims, dimensions * sizeof(*data->dims)); for (i = 0; i < dimensions; i++) data->dims[i] = ev->param[i+2]; } static void handle_mpi_data_set_rank(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned long handle = ev->param[0]; unsigned long rank = ev->param[1]; struct data_info *data = get_data(handle, options->file_rank); data->mpi_owner = rank; } static const char *copy_link_type(unsigned prefetch) { switch (prefetch) { case 0: return "F"; case 1: return "PF"; case 2: return "IF"; default: STARPU_ASSERT(0); } } static void handle_start_driver_copy(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned src = ev->param[0]; unsigned dst = ev->param[1]; unsigned size = ev->param[2]; unsigned comid = ev->param[3]; unsigned prefetch = ev->param[4]; const char *link_type = copy_link_type(prefetch); char *prefix = options->file_prefix; if (!options->no_bus) { if (out_paje_file) { double time = get_event_time_stamp(ev, options); memnode_push_state(time, prefix, dst, "Co"); #ifdef STARPU_HAVE_POTI char paje_value[STARPU_POTI_STR_LEN], paje_key[STARPU_POTI_STR_LEN], src_memnode_container[STARPU_POTI_STR_LEN]; char program_container[STARPU_POTI_STR_LEN]; snprintf(paje_value, STARPU_POTI_STR_LEN, "%u", size); snprintf(paje_key, STARPU_POTI_STR_LEN, "com_%u", comid); program_container_alias(program_container, STARPU_POTI_STR_LEN, prefix); memmanager_container_alias(src_memnode_container, STARPU_POTI_STR_LEN, prefix, src); poti_StartLink(time, program_container, link_type, src_memnode_container, paje_value, paje_key); #else fprintf(out_paje_file, "18 %.9f %s %sp %u %smm%u com_%u\n", time, link_type, prefix, size, prefix, src, comid); #endif } /* create a structure to store the start of the communication, this will be matched later */ struct _starpu_communication *com = _starpu_communication_new(); com->comid = comid; com->comm_start = get_event_time_stamp(ev, options); com->src_node = src; com->dst_node = dst; com->type = link_type; com->peer = NULL; _starpu_communication_list_push_back(&communication_list, com); } } static void handle_work_stealing(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { if (out_paje_file) { unsigned dst = ev->param[0]; unsigned src = ev->param[1]; char *prefix = options->file_prefix; unsigned size = 0; double time = get_event_time_stamp(ev, options); #ifdef STARPU_HAVE_POTI char paje_value[STARPU_POTI_STR_LEN], paje_key[STARPU_POTI_STR_LEN], src_worker_container[STARPU_POTI_STR_LEN], dst_worker_container[STARPU_POTI_STR_LEN]; char program_container[STARPU_POTI_STR_LEN]; snprintf(paje_value, STARPU_POTI_STR_LEN, "%u", size); snprintf(paje_key, STARPU_POTI_STR_LEN, "steal_%u", steal_number); program_container_alias(program_container, STARPU_POTI_STR_LEN, prefix); worker_container_alias(src_worker_container, STARPU_POTI_STR_LEN, prefix, src); worker_container_alias(dst_worker_container, STARPU_POTI_STR_LEN, prefix, dst); poti_StartLink(time, program_container, "WSL", src_worker_container, paje_value, paje_key); poti_EndLink(time+0.000000001, program_container, "WSL", dst_worker_container, paje_value, paje_key); #else fprintf(out_paje_file, "18 %.9f WSL %sp %u %sw%u steal_%u\n", time, prefix, size, prefix, src, steal_number); fprintf(out_paje_file, "19 %.9f WSL %sp %u %sw%u steal_%u\n", time+0.000000001, prefix, size, prefix, dst, steal_number); #endif } steal_number++; } static void handle_end_driver_copy(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned dst = ev->param[1]; unsigned size = ev->param[2]; unsigned comid = ev->param[3]; unsigned prefetch = ev->param[4]; const char *link_type = copy_link_type(prefetch); char *prefix = options->file_prefix; if (!options->no_bus) { /* look for a data transfer to match */ struct _starpu_communication *itor; for (itor = _starpu_communication_list_begin(&communication_list); itor != _starpu_communication_list_end(&communication_list); itor = _starpu_communication_list_next(itor)) { if (itor->comid == comid) { double comm_end = get_event_time_stamp(ev, options); double bandwidth = (double)((0.001*size)/(comm_end - itor->comm_start)); itor->bandwidth = bandwidth; struct _starpu_communication *com = _starpu_communication_new(); com->comid = comid; com->comm_start = get_event_time_stamp(ev, options); com->bandwidth = -bandwidth; com->src_node = itor->src_node; com->dst_node = itor->dst_node; com->type = itor->type; link_type = itor->type; com->peer = itor; itor->peer = com; _starpu_communication_list_push_back(&communication_list, com); break; } } if (out_paje_file) { double time = get_event_time_stamp(ev, options); memnode_pop_state(time, prefix, dst); #ifdef STARPU_HAVE_POTI char paje_value[STARPU_POTI_STR_LEN], paje_key[STARPU_POTI_STR_LEN]; char dst_memnode_container[STARPU_POTI_STR_LEN], program_container[STARPU_POTI_STR_LEN]; snprintf(paje_value, STARPU_POTI_STR_LEN, "%u", size); snprintf(paje_key, STARPU_POTI_STR_LEN, "com_%u", comid); program_container_alias(program_container, STARPU_POTI_STR_LEN, prefix); memmanager_container_alias(dst_memnode_container, STARPU_POTI_STR_LEN, prefix, dst); poti_EndLink(time, program_container, link_type, dst_memnode_container, paje_value, paje_key); #else fprintf(out_paje_file, "19 %.9f %s %sp %u %smm%u com_%u\n", time, link_type, prefix, size, prefix, dst, comid); #endif } } } static void handle_start_driver_copy_async(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned dst = ev->param[1]; char *prefix = options->file_prefix; if (!options->no_bus) if (out_paje_file) memnode_push_state(get_event_time_stamp(ev, options), prefix, dst, "CoA"); } static void handle_end_driver_copy_async(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned dst = ev->param[1]; char *prefix = options->file_prefix; if (!options->no_bus) if (out_paje_file) memnode_pop_state(get_event_time_stamp(ev, options), prefix, dst); } static void handle_memnode_event(struct fxt_ev_64 *ev, struct starpu_fxt_options *options, const char *eventstr) { unsigned memnode = ev->param[0]; if (out_paje_file) memnode_set_state(get_event_time_stamp(ev, options), options->file_prefix, memnode, eventstr); } static void handle_push_memnode_event(struct fxt_ev_64 *ev, struct starpu_fxt_options *options, const char *eventstr) { unsigned memnode = ev->param[0]; if (out_paje_file) memnode_push_state(get_event_time_stamp(ev, options), options->file_prefix, memnode, eventstr); } static void handle_pop_memnode_event(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned memnode = ev->param[0]; if (out_paje_file) memnode_pop_state(get_event_time_stamp(ev, options), options->file_prefix, memnode); } static void handle_used_mem(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned memnode = ev->param[0]; if (out_paje_file) { #ifdef STARPU_HAVE_POTI char memnode_container[STARPU_POTI_STR_LEN]; memmanager_container_alias(memnode_container, STARPU_POTI_STR_LEN, options->file_prefix, memnode); poti_SetVariable(get_event_time_stamp(ev, options), memnode_container, "use", (double)ev->param[1] / (1<<20)); #else fprintf(out_paje_file, "13 %.9f %smm%u use %f\n", get_event_time_stamp(ev, options), options->file_prefix, memnode, (double)ev->param[1] / (1<<20)); #endif } } static void handle_task_submit_event(struct fxt_ev_64 *ev, struct starpu_fxt_options *options, unsigned long tid, const char *eventstr) { int workerid = find_worker_id(tid); double timestamp = get_event_time_stamp(ev, options); char *prefix = options->file_prefix; if (workerid >= 0) { /* Normal worker */ if (eventstr) thread_push_state(timestamp, prefix, tid, eventstr); else thread_pop_state(timestamp, prefix, tid); } else if (workerid == -2) { /* MPI thread */ if (eventstr) mpicommthread_push_state(timestamp, prefix, eventstr); else mpicommthread_pop_state(timestamp, prefix); } else { if (eventstr) user_thread_push_state(timestamp, prefix, tid, eventstr); else user_thread_pop_state(timestamp, prefix, tid); } } /* * Number of task submitted to the scheduler */ static int curq_size = 0; static int nsubmitted = 0; static void handle_job_push(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double current_timestamp = get_event_time_stamp(ev, options); curq_size++; _starpu_fxt_component_update_ntasks(nsubmitted, curq_size); if (!options->no_counter && out_paje_file) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; scheduler_container_alias(container, STARPU_POTI_STR_LEN, options->file_prefix); poti_SetVariable(current_timestamp, container, "nready", (double)curq_size); #else fprintf(out_paje_file, "13 %.9f %ssched nready %f\n", current_timestamp, options->file_prefix, (float)curq_size); #endif } if (activity_file) fprintf(activity_file, "cnt_ready\t%.9f\t%d\n", current_timestamp, curq_size); } static void handle_job_pop(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double current_timestamp = get_event_time_stamp(ev, options); curq_size--; nsubmitted--; _starpu_fxt_component_update_ntasks(nsubmitted, curq_size); if (!options->no_counter && out_paje_file) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; scheduler_container_alias(container, STARPU_POTI_STR_LEN, options->file_prefix); poti_SetVariable(current_timestamp, container, "nready", (double)curq_size); poti_SetVariable(current_timestamp, container, "nsubmitted", (double)nsubmitted); #else fprintf(out_paje_file, "13 %.9f %ssched nready %f\n", current_timestamp, options->file_prefix, (float)curq_size); fprintf(out_paje_file, "13 %.9f %ssched nsubmitted %f\n", current_timestamp, options->file_prefix, (float)nsubmitted); #endif } if (activity_file) { fprintf(activity_file, "cnt_ready\t%.9f\t%d\n", current_timestamp, curq_size); fprintf(activity_file, "cnt_submitted\t%.9f\t%d\n", current_timestamp, nsubmitted); } } static void handle_component_new(struct fxt_ev_64 *ev, struct starpu_fxt_options *options STARPU_ATTRIBUTE_UNUSED) { _starpu_fxt_component_new(ev->param[0], get_fxt_string(ev, 1)); } static void handle_component_connect(struct fxt_ev_64 *ev, struct starpu_fxt_options *options STARPU_ATTRIBUTE_UNUSED) { _starpu_fxt_component_connect(ev->param[0], ev->param[1]); } static void handle_component_push(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double current_timestamp = get_event_time_stamp(ev, options); int workerid = find_worker_id(ev->param[0]); _starpu_fxt_component_push(anim_file, options, current_timestamp, workerid, ev->param[1], ev->param[2], ev->param[3], ev->param[4]); } static void handle_component_pull(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double current_timestamp = get_event_time_stamp(ev, options); int workerid = find_worker_id(ev->param[0]); _starpu_fxt_component_pull(anim_file, options, current_timestamp, workerid, ev->param[1], ev->param[2], ev->param[3], ev->param[4]); } static void handle_update_task_cnt(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double current_timestamp = get_event_time_stamp(ev, options); nsubmitted++; _starpu_fxt_component_update_ntasks(nsubmitted, curq_size); if (!options->no_counter && out_paje_file) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; scheduler_container_alias(container, STARPU_POTI_STR_LEN, options->file_prefix); poti_SetVariable(current_timestamp, container, "nsubmitted", (double)nsubmitted); #else fprintf(out_paje_file, "13 %.9f %ssched nsubmitted %f\n", current_timestamp, options->file_prefix, (float)nsubmitted); #endif } if (activity_file) fprintf(activity_file, "cnt_submitted\t%.9f\t%d\n", current_timestamp, nsubmitted); } static void handle_tag(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { uint64_t tag; unsigned long job; tag = ev->param[0]; job = ev->param[1]; _starpu_fxt_dag_add_tag(options->file_prefix, tag, job); } static void handle_tag_deps(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { uint64_t child; uint64_t father; child = ev->param[0]; father = ev->param[1]; _starpu_fxt_dag_add_tag_deps(options->file_prefix, child, father); } static void handle_task_deps(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned long dep_prev = ev->param[0]; unsigned long dep_succ = ev->param[1]; struct task_info *task = get_task(dep_succ, options->file_rank); unsigned alloc = 0; if (task->ndeps == 0) /* Start with 8=2^3, should be plenty in most cases */ alloc = 8; else if (task->ndeps >= 8) { /* Allocate dependencies array by powers of two */ if (! ((task->ndeps - 1) & task->ndeps)) /* Is task->ndeps a power of two? */ { /* We have filled the previous power of two, get another one */ alloc = task->ndeps * 2; } } if (alloc) _STARPU_REALLOC(task->dependencies, sizeof(*task->dependencies) * alloc); task->dependencies[task->ndeps++] = dep_prev; /* There is a dependency between both job id : dep_prev -> dep_succ */ _starpu_fxt_dag_add_task_deps(options->file_prefix, dep_prev, dep_succ); } static void handle_task_submit(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned long job_id = ev->param[0]; unsigned long iteration = ev->param[1]; unsigned long subiteration = ev->param[2]; struct task_info *task = get_task(job_id, options->file_rank); task->submit_time = get_event_time_stamp(ev, options); task->iterations[0] = iteration; task->iterations[1] = subiteration; } static void handle_task_name(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned long job_id; job_id = ev->param[0]; unsigned long has_name = ev->param[3]; char *name = has_name?get_fxt_string(ev,4):"unknown"; int worker; worker = find_worker_id(ev->param[1]); const char *colour; char buffer[32]; if (options->per_task_colour) { snprintf(buffer, 32, "#%x%x%x", get_colour_symbol_red(name)/4, get_colour_symbol_green(name)/4, get_colour_symbol_blue(name)/4); colour = &buffer[0]; } else { colour= (worker < 0)?"#aaaaaa":get_worker_color(worker); } unsigned exclude_from_dag = ev->param[2]; struct task_info *task = get_task(job_id, options->file_rank); task->exclude_from_dag = exclude_from_dag; if (!exclude_from_dag) _starpu_fxt_dag_set_task_name(options->file_prefix, job_id, name, colour); } static void handle_task_done(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned long job_id; job_id = ev->param[0]; struct task_info *task = get_task(job_id, options->file_rank); task_dump(task); } static void handle_tag_done(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { uint64_t tag_id; tag_id = ev->param[0]; unsigned long has_name = ev->param[2]; char *name = has_name?get_fxt_string(ev,3):"unknown"; int worker; worker = find_worker_id(ev->param[1]); const char *colour; char buffer[32]; if (options->per_task_colour) { snprintf(buffer, 32, "%.4f,%.4f,%.4f", get_colour_symbol_red(name)/1024.0, get_colour_symbol_green(name)/1024.0, get_colour_symbol_blue(name)/1024.0); colour = &buffer[0]; } else { colour= (worker < 0)?"white":get_worker_color(worker); } _starpu_fxt_dag_set_tag_done(options->file_prefix, tag_id, colour); } static void handle_mpi_barrier(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int rank = ev->param[0]; STARPU_ASSERT(rank == options->file_rank || options->file_rank == -1); /* Add an event in the trace */ if (out_paje_file) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN], paje_value[STARPU_POTI_STR_LEN]; snprintf(container, STARPU_POTI_STR_LEN, "%sp", options->file_prefix); snprintf(paje_value, STARPU_POTI_STR_LEN, "%d", rank); poti_NewEvent(get_event_time_stamp(ev, options), container, "prog_event", paje_value); #else fprintf(out_paje_file, "9 %.9f prog_event %sp %d\n", get_event_time_stamp(ev, options), options->file_prefix, rank); #endif } } static void handle_mpi_start(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); char *prefix = options->file_prefix; register_mpi_thread(ev->param[2]); if (out_paje_file) { #ifdef STARPU_HAVE_POTI char program_container[STARPU_POTI_STR_LEN]; program_container_alias(program_container, STARPU_POTI_STR_LEN, prefix); char new_mpicommthread_container_alias[STARPU_POTI_STR_LEN], new_mpicommthread_container_name[STARPU_POTI_STR_LEN]; mpicommthread_container_alias(new_mpicommthread_container_alias, STARPU_POTI_STR_LEN, prefix); snprintf(new_mpicommthread_container_alias, STARPU_POTI_STR_LEN, "%smpict", prefix); poti_CreateContainer(date, new_mpicommthread_container_alias, "MPICt", program_container, new_mpicommthread_container_name); #else fprintf(out_paje_file, "7 %.9f %smpict MPICt %sp %smpict\n", date, prefix, prefix, prefix); #endif mpicommthread_set_state(date, prefix, "Sl"); } } static void handle_mpi_stop(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); char *prefix = options->file_prefix; if (out_paje_file) { #ifdef STARPU_HAVE_POTI char mpicommthread_container[STARPU_POTI_STR_LEN]; mpicommthread_container_alias(mpicommthread_container, STARPU_POTI_STR_LEN, prefix); poti_DestroyContainer(date, "MPICt", mpicommthread_container); #else fprintf(out_paje_file, "8 %.9f %smpict MPICt\n", date, prefix); #endif } } static void handle_mpi_isend_submit_begin(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "SdS"); } static int mpi_warned; static void handle_mpi_isend_submit_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int dest = ev->param[0]; int mpi_tag = ev->param[1]; size_t size = ev->param[2]; long jobid = ev->param[3]; double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "P"); if (options->file_rank < 0) { if (!mpi_warned) { _STARPU_MSG("Warning : Only one trace file is given. MPI transfers will not be displayed. Add all trace files to show them ! \n"); mpi_warned = 1; } } else _starpu_fxt_mpi_add_send_transfer(options->file_rank, dest, mpi_tag, size, date, jobid); } static void handle_mpi_irecv_submit_begin(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "RvS"); } static void handle_mpi_irecv_submit_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "P"); } static void handle_mpi_isend_complete_begin(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "SdC"); } static void handle_mpi_isend_complete_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "P"); } static void handle_mpi_irecv_complete_begin(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "RvC"); } static void handle_mpi_irecv_complete_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "P"); } static void handle_mpi_irecv_terminated(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int src = ev->param[0]; int mpi_tag = ev->param[1]; long jobid = ev->param[2]; double date = get_event_time_stamp(ev, options); if (options->file_rank < 0) { if (!mpi_warned) { _STARPU_MSG("Warning : Only one trace file is given. MPI transfers will not be displayed. Add all trace files to show them ! \n"); mpi_warned = 1; } } else _starpu_fxt_mpi_add_recv_transfer(src, options->file_rank, mpi_tag, date, jobid); } static void handle_mpi_sleep_begin(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "Sl"); } static void handle_mpi_sleep_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "P"); } static void handle_mpi_dtesting_begin(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "DT"); } static void handle_mpi_dtesting_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "P"); } static void handle_mpi_utesting_begin(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "UT"); } static void handle_mpi_utesting_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "P"); } static void handle_mpi_uwait_begin(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "UW"); } static void handle_mpi_uwait_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "P"); } static void handle_mpi_testing_detached_begin(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_push_state(date, options->file_prefix, "TD"); } static void handle_mpi_testing_detached_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_pop_state(date, options->file_prefix); } static void handle_mpi_test_begin(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_push_state(date, options->file_prefix, "MT"); } static void handle_mpi_test_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_pop_state(date, options->file_prefix); } static void handle_set_profiling(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int status = ev->param[0]; if (activity_file) fprintf(activity_file, "set_profiling\t%.9f\t%d\n", get_event_time_stamp(ev, options), status); } static void handle_task_wait_for_all(void) { _starpu_fxt_dag_add_sync_point(); } static void handle_string_event(struct fxt_ev_64 *ev, const char *event, struct starpu_fxt_options *options) { /* Add an event in the trace */ if (out_paje_file) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; snprintf(container, STARPU_POTI_STR_LEN, "%sp", options->file_prefix); poti_NewEvent(get_event_time_stamp(ev, options), container, "prog_event", event); #else fprintf(out_paje_file, "9 %.9f prog_event %sp \"%s\"\n", get_event_time_stamp(ev, options), options->file_prefix, event); #endif } } static void handle_event(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { char *event = get_fxt_string(ev, 0); handle_string_event(ev, event, options); } static void handle_thread_event(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { /* Add an event in the trace */ if (out_paje_file) { char *event = get_fxt_string(ev, 1); #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; thread_container_alias(container, STARPU_POTI_STR_LEN, options->file_prefix, ev->param[0]); poti_NewEvent(get_event_time_stamp(ev, options), container, "thread_event", event); #else fprintf(out_paje_file, "9 %.9f thread_event %st%"PRIu64" %s\n", get_event_time_stamp(ev, options), options->file_prefix, ev->param[0], event); #endif } } static void _starpu_fxt_process_bandwidth(struct starpu_fxt_options *options) { char *prefix = options->file_prefix; /* Loop through completed communications */ struct _starpu_communication*itor; while (!_starpu_communication_list_empty(&communication_list) && _starpu_communication_list_begin(&communication_list)->peer) { /* This communication is complete */ itor = _starpu_communication_list_pop_front(&communication_list); current_bandwidth_out_per_node[itor->src_node] += itor->bandwidth; if (out_paje_file) { #ifdef STARPU_HAVE_POTI char src_memnode_container[STARPU_POTI_STR_LEN]; memmanager_container_alias(src_memnode_container, STARPU_POTI_STR_LEN, prefix, itor->src_node); poti_SetVariable(itor->comm_start, src_memnode_container, "bwo", current_bandwidth_out_per_node[itor->src_node]); #else fprintf(out_paje_file, "13 %.9f %smm%u bwo %f\n", itor->comm_start, prefix, itor->src_node, current_bandwidth_out_per_node[itor->src_node]); #endif } current_bandwidth_in_per_node[itor->dst_node] += itor->bandwidth; if (out_paje_file) { #ifdef STARPU_HAVE_POTI char dst_memnode_container[STARPU_POTI_STR_LEN]; memmanager_container_alias(dst_memnode_container, STARPU_POTI_STR_LEN, prefix, itor->dst_node); poti_SetVariable(itor->comm_start, dst_memnode_container, "bwi", current_bandwidth_in_per_node[itor->dst_node]); #else fprintf(out_paje_file, "13 %.9f %smm%u bwi %f\n", itor->comm_start, prefix, itor->dst_node, current_bandwidth_in_per_node[itor->dst_node]); #endif } _starpu_communication_delete(itor); } } static void _starpu_fxt_process_computations(struct starpu_fxt_options *options) { char *prefix = options->file_prefix; /* Loop through completed computations */ struct _starpu_computation*itor; while (!_starpu_computation_list_empty(&computation_list) && _starpu_computation_list_begin(&computation_list)->peer) { /* This computation is complete */ itor = _starpu_computation_list_pop_front(&computation_list); current_computation += itor->gflops; if (out_paje_file) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; scheduler_container_alias(container, STARPU_POTI_STR_LEN, prefix); poti_SetVariable(itor->comp_start, container, "gft", (double)current_computation); #else fprintf(out_paje_file, "13 %.9f %ssched gft %f\n", itor->comp_start, prefix, (float)current_computation); #endif } _starpu_computation_delete(itor); } } static void _starpu_fxt_parse_new_file(char *filename_in, struct starpu_fxt_options *options) { /* Open the trace file */ int fd_in; fd_in = open(filename_in, O_RDONLY); if (fd_in < 0) { perror("open failed :"); exit(-1); } static fxt_t fut; fut = fxt_fdopen(fd_in); if (!fut) { perror("fxt_fdopen :"); exit(-1); } fxt_blockev_t block; block = fxt_blockev_enter(fut); char *prefix = options->file_prefix; /* TODO starttime ...*/ /* create the "program" container */ if (out_paje_file) { #ifdef STARPU_HAVE_POTI char new_program_container_alias[STARPU_POTI_STR_LEN], new_program_container_name[STARPU_POTI_STR_LEN]; program_container_alias(new_program_container_alias, STARPU_POTI_STR_LEN, prefix); snprintf(new_program_container_name, STARPU_POTI_STR_LEN, "program %s", prefix); poti_CreateContainer (0, new_program_container_alias, "P", "MPIroot", new_program_container_name); char new_scheduler_container_alias[STARPU_POTI_STR_LEN], new_scheduler_container_name[STARPU_POTI_STR_LEN]; scheduler_container_alias(new_scheduler_container_alias, STARPU_POTI_STR_LEN, prefix); snprintf(new_scheduler_container_name, STARPU_POTI_STR_LEN, "%sscheduler", prefix); if (!options->no_counter || !options->no_flops) { poti_CreateContainer(0.0, new_scheduler_container_alias, "Sc", new_program_container_alias, new_scheduler_container_name); } if (!options->no_counter) { poti_SetVariable(0.0, new_scheduler_container_alias, "nsubmitted", 0.0); poti_SetVariable(0.0, new_scheduler_container_alias, "nready", 0.0); } if (!options->no_flops) { poti_SetVariable(0.0, new_scheduler_container_alias, "gft", 0.0); } #else fprintf(out_paje_file, "7 0.0 %sp P MPIroot %sprogram \n", prefix, prefix); if (!options->no_counter || !options->no_flops) { fprintf(out_paje_file, "7 %.9f %ssched Sc %sp %sscheduler\n", 0.0, prefix, prefix, prefix); } if (!options->no_counter) { /* create a variable with the number of tasks */ fprintf(out_paje_file, "13 0.0 %ssched nsubmitted 0.0\n", prefix); fprintf(out_paje_file, "13 0.0 %ssched nready 0.0\n", prefix); } if (!options->no_flops) { fprintf(out_paje_file, "13 0.0 %ssched gft 0.0\n", prefix); } #endif } struct fxt_ev_64 ev; while(1) { unsigned i; int ret = fxt_next_ev(block, FXT_EV_TYPE_64, (struct fxt_ev *)&ev); for (i = ev.nb_params; i < FXT_MAX_PARAMS; i++) ev.param[i] = 0; if (ret != FXT_EV_OK) { break; } switch (ev.code) { case _STARPU_FUT_WORKER_INIT_START: handle_worker_init_start(&ev, options); break; case _STARPU_FUT_WORKER_INIT_END: handle_worker_init_end(&ev, options); break; case _STARPU_FUT_NEW_MEM_NODE: handle_new_mem_node(&ev, options); break; /* detect when the workers were idling or not */ case _STARPU_FUT_START_CODELET_BODY: handle_start_codelet_body(&ev, options); break; case _STARPU_FUT_MODEL_NAME: handle_model_name(&ev, options); break; case _STARPU_FUT_CODELET_DATA: handle_codelet_data(&ev, options); break; case _STARPU_FUT_CODELET_DATA_HANDLE: handle_codelet_data_handle(&ev, options); break; case _STARPU_FUT_CODELET_DETAILS: handle_codelet_details(&ev, options); break; case _STARPU_FUT_END_CODELET_BODY: handle_end_codelet_body(&ev, options); break; case _STARPU_FUT_START_EXECUTING: handle_start_executing(&ev, options); break; case _STARPU_FUT_END_EXECUTING: handle_end_executing(&ev, options); break; case _STARPU_FUT_START_CALLBACK: handle_start_callback(&ev, options); break; case _STARPU_FUT_END_CALLBACK: handle_end_callback(&ev, options); break; case _STARPU_FUT_UPDATE_TASK_CNT: handle_update_task_cnt(&ev, options); break; /* monitor stack size */ case _STARPU_FUT_JOB_PUSH: handle_job_push(&ev, options); break; case _STARPU_FUT_JOB_POP: handle_job_pop(&ev, options); break; case _STARPU_FUT_SCHED_COMPONENT_NEW: handle_component_new(&ev, options); break; case _STARPU_FUT_SCHED_COMPONENT_CONNECT: handle_component_connect(&ev, options); break; case _STARPU_FUT_SCHED_COMPONENT_PUSH: handle_component_push(&ev, options); break; case _STARPU_FUT_SCHED_COMPONENT_PULL: handle_component_pull(&ev, options); break; /* check the memory transfer overhead */ case _STARPU_FUT_START_FETCH_INPUT: handle_worker_status(&ev, options, "Fi"); break; case _STARPU_FUT_START_PUSH_OUTPUT: handle_worker_status(&ev, options, "Po"); break; case _STARPU_FUT_START_PROGRESS_ON_TID: handle_worker_status_on_tid(&ev, options, "P"); break; case _STARPU_FUT_START_UNPARTITION: handle_worker_status(&ev, options, "U"); break; case _STARPU_FUT_END_PROGRESS_ON_TID: handle_worker_status_on_tid(&ev, options, "B"); break; case _STARPU_FUT_END_FETCH_INPUT: case _STARPU_FUT_END_PUSH_OUTPUT: case _STARPU_FUT_END_UNPARTITION: handle_worker_status(&ev, options, "B"); break; case _STARPU_FUT_WORKER_SCHEDULING_START: handle_worker_scheduling_start(&ev, options); break; case _STARPU_FUT_WORKER_SCHEDULING_END: handle_worker_scheduling_end(&ev, options); break; case _STARPU_FUT_WORKER_SCHEDULING_PUSH: handle_worker_scheduling_push(&ev, options); break; case _STARPU_FUT_WORKER_SCHEDULING_POP: handle_worker_scheduling_pop(&ev, options); break; case _STARPU_FUT_WORKER_SLEEP_START: handle_worker_sleep_start(&ev, options); break; case _STARPU_FUT_WORKER_SLEEP_END: handle_worker_sleep_end(&ev, options); break; case _STARPU_FUT_TAG: handle_tag(&ev, options); break; case _STARPU_FUT_TAG_DEPS: handle_tag_deps(&ev, options); break; case _STARPU_FUT_TASK_DEPS: handle_task_deps(&ev, options); break; case _STARPU_FUT_TASK_SUBMIT: handle_task_submit(&ev, options); break; case _STARPU_FUT_TASK_BUILD_START: handle_task_submit_event(&ev, options, ev.param[0], "Bu"); break; case _STARPU_FUT_TASK_SUBMIT_START: handle_task_submit_event(&ev, options, ev.param[0], "Su"); break; case _STARPU_FUT_TASK_THROTTLE_START: handle_task_submit_event(&ev, options, ev.param[0], "Th"); break; case _STARPU_FUT_TASK_MPI_DECODE_START: handle_task_submit_event(&ev, options, ev.param[0], "MD"); break; case _STARPU_FUT_TASK_MPI_PRE_START: handle_task_submit_event(&ev, options, ev.param[0], "MPr"); break; case _STARPU_FUT_TASK_MPI_POST_START: handle_task_submit_event(&ev, options, ev.param[0], "MPo"); break; case _STARPU_FUT_TASK_WAIT_START: handle_task_submit_event(&ev, options, ev.param[1], "W"); break; case _STARPU_FUT_TASK_WAIT_FOR_ALL_START: handle_task_submit_event(&ev, options, ev.param[0], "WA"); break; case _STARPU_FUT_TASK_BUILD_END: case _STARPU_FUT_TASK_SUBMIT_END: case _STARPU_FUT_TASK_THROTTLE_END: case _STARPU_FUT_TASK_MPI_DECODE_END: case _STARPU_FUT_TASK_MPI_PRE_END: case _STARPU_FUT_TASK_MPI_POST_END: case _STARPU_FUT_TASK_WAIT_FOR_ALL_END: handle_task_submit_event(&ev, options, ev.param[0], NULL); break; case _STARPU_FUT_TASK_WAIT_END: handle_task_submit_event(&ev, options, ev.param[0], NULL); break; case _STARPU_FUT_TASK_NAME: handle_task_name(&ev, options); break; case _STARPU_FUT_TASK_DONE: handle_task_done(&ev, options); break; case _STARPU_FUT_TAG_DONE: handle_tag_done(&ev, options); break; case _STARPU_FUT_HANDLE_DATA_REGISTER: handle_data_register(&ev, options); break; case _STARPU_FUT_HANDLE_DATA_UNREGISTER: handle_data_unregister(&ev, options); break; case _STARPU_FUT_DATA_INVALIDATE: handle_data_invalidate(&ev, options); break; case _STARPU_FUT_DATA_COPY: if (!options->no_bus) handle_data_copy(); break; case _STARPU_FUT_DATA_LOAD: break; case _STARPU_FUT_DATA_NAME: handle_data_name(&ev, options); break; case _STARPU_FUT_DATA_COORDINATES: handle_data_coordinates(&ev, options); break; case _STARPU_FUT_START_DRIVER_COPY: if (!options->no_bus) handle_start_driver_copy(&ev, options); break; case _STARPU_FUT_END_DRIVER_COPY: if (!options->no_bus) handle_end_driver_copy(&ev, options); break; case _STARPU_FUT_START_DRIVER_COPY_ASYNC: if (!options->no_bus) handle_start_driver_copy_async(&ev, options); break; case _STARPU_FUT_END_DRIVER_COPY_ASYNC: if (!options->no_bus) handle_end_driver_copy_async(&ev, options); break; case _STARPU_FUT_WORK_STEALING: handle_work_stealing(&ev, options); break; case _STARPU_FUT_WORKER_DEINIT_START: handle_worker_deinit_start(&ev, options); break; case _STARPU_FUT_WORKER_DEINIT_END: handle_worker_deinit_end(&ev, options); break; case _STARPU_FUT_START_ALLOC: if (!options->no_bus) handle_push_memnode_event(&ev, options, "A"); break; case _STARPU_FUT_START_ALLOC_REUSE: if (!options->no_bus) handle_push_memnode_event(&ev, options, "Ar"); break; case _STARPU_FUT_END_ALLOC: case _STARPU_FUT_END_ALLOC_REUSE: if (!options->no_bus) handle_pop_memnode_event(&ev, options); break; case _STARPU_FUT_START_FREE: if (!options->no_bus) handle_push_memnode_event(&ev, options, "F"); break; case _STARPU_FUT_END_FREE: if (!options->no_bus) handle_pop_memnode_event(&ev, options); break; case _STARPU_FUT_START_WRITEBACK: if (!options->no_bus) handle_push_memnode_event(&ev, options, "W"); break; case _STARPU_FUT_END_WRITEBACK: if (!options->no_bus) handle_pop_memnode_event(&ev, options); break; case _STARPU_FUT_START_WRITEBACK_ASYNC: if (!options->no_bus) handle_push_memnode_event(&ev, options, "Wa"); break; case _STARPU_FUT_END_WRITEBACK_ASYNC: if (!options->no_bus) handle_pop_memnode_event(&ev, options); break; case _STARPU_FUT_START_MEMRECLAIM: if (!options->no_bus) handle_push_memnode_event(&ev, options, "R"); break; case _STARPU_FUT_END_MEMRECLAIM: if (!options->no_bus) handle_pop_memnode_event(&ev, options); break; case _STARPU_FUT_USED_MEM: handle_used_mem(&ev, options); break; case _STARPU_FUT_USER_EVENT: if (!options->no_events) handle_user_event(&ev, options); break; case _STARPU_MPI_FUT_START: handle_mpi_start(&ev, options); break; case _STARPU_MPI_FUT_STOP: handle_mpi_stop(&ev, options); break; case _STARPU_MPI_FUT_BARRIER: handle_mpi_barrier(&ev, options); break; case _STARPU_MPI_FUT_ISEND_SUBMIT_BEGIN: handle_mpi_isend_submit_begin(&ev, options); break; case _STARPU_MPI_FUT_ISEND_SUBMIT_END: handle_mpi_isend_submit_end(&ev, options); break; case _STARPU_MPI_FUT_IRECV_SUBMIT_BEGIN: handle_mpi_irecv_submit_begin(&ev, options); break; case _STARPU_MPI_FUT_IRECV_SUBMIT_END: handle_mpi_irecv_submit_end(&ev, options); break; case _STARPU_MPI_FUT_ISEND_COMPLETE_BEGIN: handle_mpi_isend_complete_begin(&ev, options); break; case _STARPU_MPI_FUT_ISEND_COMPLETE_END: handle_mpi_isend_complete_end(&ev, options); break; case _STARPU_MPI_FUT_IRECV_COMPLETE_BEGIN: handle_mpi_irecv_complete_begin(&ev, options); break; case _STARPU_MPI_FUT_IRECV_COMPLETE_END: handle_mpi_irecv_complete_end(&ev, options); break; case _STARPU_MPI_FUT_ISEND_TERMINATED: break; case _STARPU_MPI_FUT_IRECV_TERMINATED: handle_mpi_irecv_terminated(&ev, options); break; case _STARPU_MPI_FUT_SLEEP_BEGIN: handle_mpi_sleep_begin(&ev, options); break; case _STARPU_MPI_FUT_SLEEP_END: handle_mpi_sleep_end(&ev, options); break; case _STARPU_MPI_FUT_DTESTING_BEGIN: handle_mpi_dtesting_begin(&ev, options); break; case _STARPU_MPI_FUT_DTESTING_END: handle_mpi_dtesting_end(&ev, options); break; case _STARPU_MPI_FUT_UTESTING_BEGIN: handle_mpi_utesting_begin(&ev, options); break; case _STARPU_MPI_FUT_UTESTING_END: handle_mpi_utesting_end(&ev, options); break; case _STARPU_MPI_FUT_UWAIT_BEGIN: handle_mpi_uwait_begin(&ev, options); break; case _STARPU_MPI_FUT_UWAIT_END: handle_mpi_uwait_end(&ev, options); break; case _STARPU_MPI_FUT_DATA_SET_RANK: handle_mpi_data_set_rank(&ev, options); break; case _STARPU_MPI_FUT_TESTING_DETACHED_BEGIN: handle_mpi_testing_detached_begin(&ev, options); break; case _STARPU_MPI_FUT_TESTING_DETACHED_END: handle_mpi_testing_detached_end(&ev, options); break; case _STARPU_MPI_FUT_TEST_BEGIN: handle_mpi_test_begin(&ev, options); break; case _STARPU_MPI_FUT_TEST_END: handle_mpi_test_end(&ev, options); break; case _STARPU_FUT_SET_PROFILING: handle_set_profiling(&ev, options); break; case _STARPU_FUT_TASK_WAIT_FOR_ALL: handle_task_wait_for_all(); break; case _STARPU_FUT_EVENT: if (!options->no_events) handle_event(&ev, options); break; case _STARPU_FUT_THREAD_EVENT: if (!options->no_events) handle_thread_event(&ev, options); break; case _STARPU_FUT_LOCKING_MUTEX: break; case _STARPU_FUT_MUTEX_LOCKED: break; case _STARPU_FUT_UNLOCKING_MUTEX: break; case _STARPU_FUT_MUTEX_UNLOCKED: break; case _STARPU_FUT_TRYLOCK_MUTEX: break; case _STARPU_FUT_RDLOCKING_RWLOCK: break; case _STARPU_FUT_RWLOCK_RDLOCKED: break; case _STARPU_FUT_WRLOCKING_RWLOCK: break; case _STARPU_FUT_RWLOCK_WRLOCKED: break; case _STARPU_FUT_UNLOCKING_RWLOCK: break; case _STARPU_FUT_RWLOCK_UNLOCKED: break; case _STARPU_FUT_LOCKING_SPINLOCK: break; case _STARPU_FUT_SPINLOCK_LOCKED: break; case _STARPU_FUT_UNLOCKING_SPINLOCK: break; case _STARPU_FUT_SPINLOCK_UNLOCKED: break; case _STARPU_FUT_TRYLOCK_SPINLOCK: break; case _STARPU_FUT_COND_WAIT_BEGIN: break; case _STARPU_FUT_COND_WAIT_END: break; case _STARPU_FUT_BARRIER_WAIT_BEGIN: break; case _STARPU_FUT_BARRIER_WAIT_END: break; case _STARPU_FUT_MEMORY_FULL: break; case _STARPU_FUT_SCHED_COMPONENT_POP_PRIO: break; case _STARPU_FUT_SCHED_COMPONENT_PUSH_PRIO: break; case _STARPU_FUT_HYPERVISOR_BEGIN: handle_hypervisor_begin(&ev, options); break; case _STARPU_FUT_HYPERVISOR_END: handle_hypervisor_end(&ev, options); break; case FUT_SETUP_CODE: fut_keymask = ev.param[0]; break; case FUT_KEYCHANGE_CODE: fut_keymask = ev.param[0]; break; case FUT_START_FLUSH_CODE: handle_string_event(&ev, "fxt_start_flush", options); break; case FUT_STOP_FLUSH_CODE: handle_string_event(&ev, "fxt_stop_flush", options); break; /* We can safely ignore FUT internal events */ case FUT_CALIBRATE0_CODE: case FUT_CALIBRATE1_CODE: case FUT_CALIBRATE2_CODE: case FUT_NEW_LWP_CODE: case FUT_GCC_INSTRUMENT_ENTRY_CODE: break; default: #ifdef STARPU_VERBOSE _STARPU_MSG("unknown event.. %x at time %llx WITH OFFSET %llx\n", (unsigned)ev.code, (long long unsigned)ev.time, (long long unsigned)(ev.time-options->file_offset)); #endif break; } _starpu_fxt_process_bandwidth(options); if (!options->no_flops) _starpu_fxt_process_computations(options); } { struct data_info *data, *tmp; HASH_ITER(hh, data_info, data, tmp) { data_dump(data); } } { struct task_info *task, *tmp; HASH_ITER(hh, tasks_info, task, tmp) { task_dump(task); } } /* Close the trace file */ if (close(fd_in)) { perror("close failed :"); exit(-1); } } /* Initialize FxT options to default values */ void starpu_fxt_options_init(struct starpu_fxt_options *options) { options->per_task_colour = 0; options->no_events = 0; options->no_counter = 0; options->no_bus = 0; options->no_flops = 0; options->ninputfiles = 0; options->out_paje_path = "paje.trace"; options->dag_path = "dag.dot"; options->tasks_path = "tasks.rec"; options->data_path = "data.rec"; options->anim_path = "trace.html"; options->distrib_time_path = "distrib.data"; options->dumped_codelets = NULL; options->activity_path = "activity.data"; } static void _starpu_fxt_distrib_file_init(struct starpu_fxt_options *options) { dumped_codelets_count = 0; dumped_codelets = NULL; if (options->distrib_time_path) { distrib_time = fopen(options->distrib_time_path, "w+"); } else { distrib_time = NULL; } } static void _starpu_fxt_distrib_file_close(struct starpu_fxt_options *options) { if (distrib_time) fclose(distrib_time); if (options->dumped_codelets) { *options->dumped_codelets = dumped_codelets; options->dumped_codelets_count = dumped_codelets_count; } } static void _starpu_fxt_activity_file_init(struct starpu_fxt_options *options) { if (options->activity_path) activity_file = fopen(options->activity_path, "w+"); else activity_file = NULL; } static void _starpu_fxt_anim_file_init(struct starpu_fxt_options *options) { if (options->anim_path) { anim_file = fopen(options->anim_path, "w+"); _starpu_fxt_component_print_header(anim_file); } else anim_file = NULL; } static void _starpu_fxt_tasks_file_init(struct starpu_fxt_options *options) { if (options->tasks_path) tasks_file = fopen(options->tasks_path, "w+"); else tasks_file = NULL; } static void _starpu_fxt_data_file_init(struct starpu_fxt_options *options) { if (options->data_path) data_file = fopen(options->data_path, "w+"); else data_file = NULL; } static void _starpu_fxt_activity_file_close(void) { if (activity_file) fclose(activity_file); } static void _starpu_fxt_anim_file_close(void) { //_starpu_fxt_component_dump(stderr); _starpu_fxt_component_finish(anim_file); if (anim_file) fclose(anim_file); } static void _starpu_fxt_tasks_file_close(void) { if (tasks_file) fclose(tasks_file); } static void _starpu_fxt_data_file_close(void) { if (data_file) fclose(data_file); } void _starpu_fxt_paje_file_init(struct starpu_fxt_options *options) { /* create a new file */ if (options->out_paje_path) { out_paje_file = fopen(options->out_paje_path, "w+"); if (!out_paje_file) { _STARPU_MSG("error while opening %s\n", options->out_paje_path); perror("fopen"); exit(1); } #ifdef STARPU_HAVE_POTI #ifdef HAVE_POTI_INIT_CUSTOM fclose(out_paje_file); poti_init_custom (options->out_paje_path, 0, //if false, allow extended events 1, //if true, an old header (pj_dump -n) 0, //if false, the trace has no comments 1, //if true, events have aliases 1);//if true, relative timestamps #else poti_init (out_paje_file); #endif #endif _starpu_fxt_write_paje_header(out_paje_file); } else { out_paje_file = NULL; } /* create lists for symbols (kernel states) and communications */ _starpu_symbol_name_list_init(&symbol_list); _starpu_communication_list_init(&communication_list); if (!options->no_flops) _starpu_computation_list_init(&computation_list); } static void _starpu_fxt_paje_file_close(void) { if (out_paje_file) fclose(out_paje_file); } static uint64_t _starpu_fxt_find_start_time(char *filename_in) { /* Open the trace file */ int fd_in; fd_in = open(filename_in, O_RDONLY); if (fd_in < 0) { perror("open failed :"); exit(-1); } static fxt_t fut; fut = fxt_fdopen(fd_in); if (!fut) { perror("fxt_fdopen :"); exit(-1); } fxt_blockev_t block; block = fxt_blockev_enter(fut); struct fxt_ev_64 ev; int ret = fxt_next_ev(block, FXT_EV_TYPE_64, (struct fxt_ev *)&ev); STARPU_ASSERT (ret == FXT_EV_OK); /* Close the trace file */ if (close(fd_in)) { perror("close failed :"); exit(-1); } return (ev.time); } void starpu_fxt_generate_trace(struct starpu_fxt_options *options) { _starpu_fxt_dag_init(options->dag_path); _starpu_fxt_distrib_file_init(options); _starpu_fxt_activity_file_init(options); _starpu_fxt_anim_file_init(options); _starpu_fxt_tasks_file_init(options); _starpu_fxt_data_file_init(options); _starpu_fxt_paje_file_init(options); if (options->ninputfiles == 0) { return; } else if (options->ninputfiles == 1) { /* we usually only have a single trace */ uint64_t file_start_time = _starpu_fxt_find_start_time(options->filenames[0]); options->file_prefix = strdup(""); options->file_offset = file_start_time; options->file_rank = -1; _starpu_fxt_parse_new_file(options->filenames[0], options); } else { unsigned inputfile; uint64_t offsets[options->ninputfiles]; /* * Find the trace offsets: * - If there is no sync point * psi_k(x) = x - start_k * - If there is a sync point sync_k * psi_k(x) = x - sync_k + M * where M = max { sync_i - start_i | there exists sync_i} * More generally: * - psi_k(x) = x - offset_k */ int unique_keys[options->ninputfiles]; int rank_k[options->ninputfiles]; uint64_t start_k[options->ninputfiles]; uint64_t sync_k[options->ninputfiles]; unsigned sync_k_exists[options->ninputfiles]; uint64_t M = 0; unsigned found_one_sync_point = 0; int key = 0; unsigned display_mpi = 0; /* Compute all start_k */ for (inputfile = 0; inputfile < options->ninputfiles; inputfile++) { uint64_t file_start = _starpu_fxt_find_start_time(options->filenames[inputfile]); start_k[inputfile] = file_start; } /* Compute all sync_k if they exist */ for (inputfile = 0; inputfile < options->ninputfiles; inputfile++) { int ret = _starpu_fxt_mpi_find_sync_point(options->filenames[inputfile], &sync_k[inputfile], &unique_keys[inputfile], &rank_k[inputfile]); if (ret == -1) { /* There was no sync point, we assume there is no offset */ sync_k_exists[inputfile] = 0; } else { if (!found_one_sync_point) { key = unique_keys[inputfile]; display_mpi = 1; found_one_sync_point = 1; } else { if (key != unique_keys[inputfile]) { _STARPU_MSG("Warning: traces are coming from different run so we will not try to display MPI communications.\n"); display_mpi = 0; } } STARPU_ASSERT(sync_k[inputfile] >= start_k[inputfile]); sync_k_exists[inputfile] = 1; uint64_t diff = sync_k[inputfile] - start_k[inputfile]; if (diff > M) M = diff; } } /* Compute the offset */ for (inputfile = 0; inputfile < options->ninputfiles; inputfile++) { offsets[inputfile] = sync_k_exists[inputfile]? (sync_k[inputfile]-M):start_k[inputfile]; } /* generate the Paje trace for the different files */ for (inputfile = 0; inputfile < options->ninputfiles; inputfile++) { int filerank = rank_k[inputfile]; _STARPU_DISP("Parsing file %s (rank %d)\n", options->filenames[inputfile], filerank); char file_prefix[32]; snprintf(file_prefix, sizeof(file_prefix), "%d_", filerank); free(options->file_prefix); options->file_prefix = strdup(file_prefix); options->file_offset = offsets[inputfile]; options->file_rank = filerank; _starpu_fxt_parse_new_file(options->filenames[inputfile], options); } /* display the MPI transfers if possible */ if (display_mpi) _starpu_fxt_display_mpi_transfers(options, rank_k, out_paje_file); } /* close the different files */ _starpu_fxt_paje_file_close(); _starpu_fxt_activity_file_close(); _starpu_fxt_distrib_file_close(options); _starpu_fxt_anim_file_close(); _starpu_fxt_tasks_file_close(); _starpu_fxt_data_file_close(); _starpu_fxt_dag_terminate(); options->nworkers = nworkers; free(options->file_prefix); } #define DATA_STR_MAX_SIZE 15 struct parse_task { unsigned exec_time; unsigned data_total; char *codelet_name; }; static struct parse_task tasks[STARPU_NMAXWORKERS]; struct starpu_data_trace_kernel { UT_hash_handle hh; char *name; FILE *file; } *kernels; #define NANO_SEC_TO_MILI_SEC 0.000001 static FILE *codelet_list; static void write_task(struct parse_task pt) { struct starpu_data_trace_kernel *kernel; char *codelet_name = pt.codelet_name; HASH_FIND_STR(kernels, codelet_name, kernel); //fprintf(stderr, "%p %p %s\n", kernel, kernels, codelet_name); if(kernel == NULL) { _STARPU_MALLOC(kernel, sizeof(*kernel)); kernel->name = strdup(codelet_name); //fprintf(stderr, "%s\n", kernel->name); kernel->file = fopen(codelet_name, "w+"); if(!kernel->file) { perror("open failed :"); exit(-1); } HASH_ADD_STR(kernels, name, kernel); fprintf(codelet_list, "%s\n", codelet_name); } double time = pt.exec_time * NANO_SEC_TO_MILI_SEC; fprintf(kernel->file, "%lf %u\n", time, pt.data_total); } void starpu_fxt_write_data_trace(char *filename_in) { int fd_in; fd_in = open(filename_in, O_RDONLY); if (fd_in < 0) { perror("open failed :"); exit(-1); } static fxt_t fut; fut = fxt_fdopen(fd_in); if (!fut) { perror("fxt_fdopen :"); exit(-1); } codelet_list = fopen("codelet_list", "w+"); if(!codelet_list) { perror("open failed :"); exit(-1); } fxt_blockev_t block; block = fxt_blockev_enter(fut); struct fxt_ev_64 ev; int workerid=-1; unsigned long has_name = 0; while(1) { unsigned i; int ret = fxt_next_ev(block, FXT_EV_TYPE_64, (struct fxt_ev *)&ev); for (i = ev.nb_params; i < FXT_MAX_PARAMS; i++) ev.param[i] = 0; if (ret != FXT_EV_OK) { break; } switch (ev.code) { case _STARPU_FUT_WORKER_INIT_START: register_worker_id(ev.param[6], ev.param[1], ev.param[5]); break; case _STARPU_FUT_START_CODELET_BODY: workerid = ev.param[2]; tasks[workerid].exec_time = ev.time; has_name = ev.param[4]; tasks[workerid].codelet_name = strdup(has_name ? get_fxt_string(&ev, 5): "unknown"); //fprintf(stderr, "start codelet :[%d][%s]\n", workerid, tasks[workerid].codelet_name); break; case _STARPU_FUT_END_CODELET_BODY: workerid = ev.param[3]; assert(workerid != -1); tasks[workerid].exec_time = ev.time - tasks[workerid].exec_time; write_task(tasks[workerid]); break; case _STARPU_FUT_DATA_LOAD: workerid = ev.param[0]; tasks[workerid].data_total = ev.param[1]; break; default: #ifdef STARPU_VERBOSE _STARPU_MSG("unknown event.. %x at time %llx WITH OFFSET %llx\n", (unsigned)ev.code, (long long unsigned)ev.time, (long long unsigned)(ev.time)); #endif break; } } if (close(fd_in)) { perror("close failed :"); exit(-1); } if(fclose(codelet_list)) { perror("close failed :"); exit(-1); } struct starpu_data_trace_kernel *kernel, *tmp; HASH_ITER(hh, kernels, kernel, tmp) { if(fclose(kernel->file)) { perror("close failed :"); exit(-1); } HASH_DEL(kernels, kernel); free(kernel->name); free(kernel); } } #endif // STARPU_USE_FXT starpu-1.2.3+dfsg/src/debug/traces/starpu_fxt.h000066400000000000000000000063371320135501600214650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012, 2015-2017 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU__FXT_H__ #define __STARPU__FXT_H__ #include #include #include #ifdef STARPU_USE_FXT #include #include #include #include #include #include #include #include #include #include "../mpi/src/starpu_mpi_fxt.h" #include #include "../../../include/starpu_fxt.h" extern char _starpu_last_codelet_symbol[STARPU_NMAXWORKERS][(FXT_MAX_PARAMS-5)*sizeof(unsigned long)]; void _starpu_fxt_dag_init(char *dag_filename); void _starpu_fxt_dag_terminate(void); void _starpu_fxt_dag_add_tag(const char *prefix, uint64_t tag, unsigned long job_id); void _starpu_fxt_dag_add_tag_deps(const char *prefix, uint64_t child, uint64_t father); void _starpu_fxt_dag_set_tag_done(const char *prefix, uint64_t tag, const char *color); void _starpu_fxt_dag_add_task_deps(const char *prefix, unsigned long dep_prev, unsigned long dep_succ); void _starpu_fxt_dag_set_task_name(const char *prefix, unsigned long job_id, const char *label, const char *color); void _starpu_fxt_dag_add_send(int src, unsigned long dep_prev, unsigned long tag, unsigned long id); void _starpu_fxt_dag_add_receive(int dst, unsigned long dep_prev, unsigned long tag, unsigned long id); void _starpu_fxt_dag_add_sync_point(void); /* * MPI */ int _starpu_fxt_mpi_find_sync_point(char *filename_in, uint64_t *offset, int *key, int *rank); void _starpu_fxt_mpi_add_send_transfer(int src, int dst, int mpi_tag, size_t size, float date, long jobid); void _starpu_fxt_mpi_add_recv_transfer(int src, int dst, int mpi_tag, float date, long jobid); void _starpu_fxt_display_mpi_transfers(struct starpu_fxt_options *options, int *ranks, FILE *out_paje_file); void _starpu_fxt_write_paje_header(FILE *file); /* * Animation */ void _starpu_fxt_component_print_header(FILE *output); void _starpu_fxt_component_new(uint64_t component, char *name); void _starpu_fxt_component_connect(uint64_t parent, uint64_t child); void _starpu_fxt_component_update_ntasks(unsigned nsubmitted, unsigned curq_size); void _starpu_fxt_component_push(FILE *output, struct starpu_fxt_options *options, double timestamp, int workerid, uint64_t from, uint64_t to, uint64_t task, unsigned prio); void _starpu_fxt_component_pull(FILE *output, struct starpu_fxt_options *options, double timestamp, int workerid, uint64_t from, uint64_t to, uint64_t task, unsigned prio); void _starpu_fxt_component_dump(FILE *output); void _starpu_fxt_component_finish(FILE *output); #endif // STARPU_USE_FXT #endif // __STARPU__FXT_H__ starpu-1.2.3+dfsg/src/debug/traces/starpu_fxt_dag.c000066400000000000000000000067061320135501600222730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013, 2015, 2017 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #ifdef STARPU_USE_FXT #include "starpu_fxt.h" static FILE *out_file; static unsigned cluster_cnt; void _starpu_fxt_dag_init(char *out_path) { if (!out_path) { out_file = NULL; return; } /* create a new file */ out_file = fopen(out_path, "w+"); if (!out_file) { _STARPU_MSG("error while opening %s\n", out_path); perror("fopen"); exit(1); } cluster_cnt = 0; fprintf(out_file, "digraph G {\n"); fprintf(out_file, "\tcolor=white\n"); fprintf(out_file, "\trankdir=LR;\n"); /* Create a new cluster */ fprintf(out_file, "subgraph cluster_%u {\n", cluster_cnt); fprintf(out_file, "\tcolor=black;\n"); } void _starpu_fxt_dag_terminate(void) { if (!out_file) return; /* Close the last cluster */ fprintf(out_file, "}\n"); /* Close the graph */ fprintf(out_file, "}\n"); fclose(out_file); } void _starpu_fxt_dag_add_tag(const char *prefix, uint64_t tag, unsigned long job_id) { if (out_file) fprintf(out_file, "\t \"tag_%s%llx\"->\"task_%s%lu\"->\"tag_%s%llx\" [style=dashed]\n", prefix, (unsigned long long)tag, prefix, (unsigned long)job_id, prefix, (unsigned long long) tag); } void _starpu_fxt_dag_add_tag_deps(const char *prefix, uint64_t child, uint64_t father) { if (out_file) fprintf(out_file, "\t \"tag_%s%llx\"->\"tag_%s%llx\"\n", prefix, (unsigned long long)father, prefix, (unsigned long long)child); } void _starpu_fxt_dag_add_task_deps(const char *prefix, unsigned long dep_prev, unsigned long dep_succ) { if (out_file) fprintf(out_file, "\t \"task_%s%lu\"->\"task_%s%lu\"\n", prefix, dep_prev, prefix, dep_succ); } void _starpu_fxt_dag_set_tag_done(const char *prefix, uint64_t tag, const char *color) { if (out_file) fprintf(out_file, "\t \"tag_%s%llx\" [ style=filled, fillcolor=\"%s\"]\n", prefix, (unsigned long long)tag, color); } void _starpu_fxt_dag_set_task_name(const char *prefix, unsigned long job_id, const char *label, const char *color) { if (out_file) fprintf(out_file, "\t \"task_%s%lu\" [ style=filled, label=\"%s\", fillcolor=\"%s\"]\n", prefix, job_id, label, color); } void _starpu_fxt_dag_add_send(int src, unsigned long dep_prev, unsigned long tag, unsigned long id) { if (out_file) fprintf(out_file, "\t \"task_%d_%lu\"->\"mpi_%lu_%lu\"\n", src, dep_prev, tag, id); } void _starpu_fxt_dag_add_receive(int dst, unsigned long dep_prev, unsigned long tag, unsigned long id) { if (out_file) fprintf(out_file, "\t \"mpi_%lu_%lu\"->\"task_%d_%lu\"\n", tag, id, dst, dep_prev); } void _starpu_fxt_dag_add_sync_point(void) { if (!out_file) return; /* Close the previous cluster */ fprintf(out_file, "}\n"); cluster_cnt++; /* Create a new cluster */ fprintf(out_file, "subgraph cluster_%u {\n", cluster_cnt); fprintf(out_file, "\tcolor=black;\n"); } #endif /* STARPU_USE_FXT */ starpu-1.2.3+dfsg/src/debug/traces/starpu_fxt_mpi.c000066400000000000000000000170231320135501600223170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2013, 2017 Université Bordeaux * Copyright (C) 2010, 2011, 2014, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #ifdef STARPU_USE_FXT #include "starpu_fxt.h" #ifdef STARPU_HAVE_POTI #include #define STARPU_POTI_STR_LEN 200 #endif #define MAX_MPI_NODES 64 struct mpi_transfer { unsigned matched; int other_rank; /* src for a recv, dest for a send */ int mpi_tag; size_t size; float date; long jobid; }; /* Returns 0 if a barrier is found, -1 otherwise. In case of success, offset is * filled with the timestamp of the barrier */ int _starpu_fxt_mpi_find_sync_point(char *filename_in, uint64_t *offset, int *key, int *rank) { STARPU_ASSERT(offset); /* Open the trace file */ int fd_in; fd_in = open(filename_in, O_RDONLY); if (fd_in < 0) { perror("open failed :"); exit(-1); } static fxt_t fut; fut = fxt_fdopen(fd_in); if (!fut) { perror("fxt_fdopen :"); exit(-1); } fxt_blockev_t block; block = fxt_blockev_enter(fut); struct fxt_ev_64 ev; int func_ret = -1; unsigned found = 0; while(!found) { int ret = fxt_next_ev(block, FXT_EV_TYPE_64, (struct fxt_ev *)&ev); if (ret != FXT_EV_OK) { _STARPU_MSG("no more block ...\n"); break; } if (ev.code == _STARPU_MPI_FUT_BARRIER) { /* We found the sync point */ *offset = ev.time; *rank = ev.param[0]; *key = ev.param[2]; found = 1; func_ret = 0; } } /* Close the trace file */ if (close(fd_in)) { perror("close failed :"); exit(-1); } return func_ret; } /* * Deal with the actual MPI transfers performed with the MPI lib */ /* the list of MPI transfers found in the different traces */ static struct mpi_transfer *mpi_sends[MAX_MPI_NODES] = {NULL}; static struct mpi_transfer *mpi_recvs[MAX_MPI_NODES] = {NULL}; /* number of available slots in the lists */ unsigned mpi_sends_list_size[MAX_MPI_NODES] = {0}; unsigned mpi_recvs_list_size[MAX_MPI_NODES] = {0}; /* number of slots actually used in the list */ unsigned mpi_sends_used[MAX_MPI_NODES] = {0}; unsigned mpi_recvs_used[MAX_MPI_NODES] = {0}; /* number of slots already matched at the beginning of the list. This permits * going through the lists from the beginning to match each and every * transfer, thus avoiding a quadratic complexity. */ unsigned mpi_recvs_matched[MAX_MPI_NODES][MAX_MPI_NODES] = { {0} }; void _starpu_fxt_mpi_add_send_transfer(int src, int dst STARPU_ATTRIBUTE_UNUSED, int mpi_tag, size_t size, float date, long jobid) { if (src >= MAX_MPI_NODES) return; unsigned slot = mpi_sends_used[src]++; if (mpi_sends_used[src] > mpi_sends_list_size[src]) { if (mpi_sends_list_size[src] > 0) { mpi_sends_list_size[src] *= 2; } else { mpi_sends_list_size[src] = 1; } _STARPU_REALLOC(mpi_sends[src], mpi_sends_list_size[src]*sizeof(struct mpi_transfer)); } mpi_sends[src][slot].matched = 0; mpi_sends[src][slot].other_rank = dst; mpi_sends[src][slot].mpi_tag = mpi_tag; mpi_sends[src][slot].size = size; mpi_sends[src][slot].date = date; mpi_sends[src][slot].jobid = jobid; } void _starpu_fxt_mpi_add_recv_transfer(int src STARPU_ATTRIBUTE_UNUSED, int dst, int mpi_tag, float date, long jobid) { if (dst >= MAX_MPI_NODES) return; unsigned slot = mpi_recvs_used[dst]++; if (mpi_recvs_used[dst] > mpi_recvs_list_size[dst]) { if (mpi_recvs_list_size[dst] > 0) { mpi_recvs_list_size[dst] *= 2; } else { mpi_recvs_list_size[dst] = 1; } _STARPU_REALLOC(mpi_recvs[dst], mpi_recvs_list_size[dst]*sizeof(struct mpi_transfer)); } mpi_recvs[dst][slot].matched = 0; mpi_recvs[dst][slot].other_rank = dst; mpi_recvs[dst][slot].mpi_tag = mpi_tag; mpi_recvs[dst][slot].date = date; mpi_recvs[dst][slot].jobid = jobid; } static struct mpi_transfer *try_to_match_send_transfer(int src STARPU_ATTRIBUTE_UNUSED, int dst, int mpi_tag) { unsigned slot; unsigned firstslot = mpi_recvs_matched[src][dst]; unsigned all_previous_were_matched = 1; for (slot = firstslot; slot < mpi_recvs_used[dst]; slot++) { if (!mpi_recvs[dst][slot].matched) { if (mpi_recvs[dst][slot].mpi_tag == mpi_tag) { /* we found a match ! */ mpi_recvs[dst][slot].matched = 1; return &mpi_recvs[dst][slot]; } all_previous_were_matched = 0; } else { if (all_previous_were_matched) { /* All previous transfers are already matched, * we need not consider them anymore */ mpi_recvs_matched[src][dst] = slot; } } } /* If we reached that point, we could not find a match */ return NULL; } static unsigned long mpi_com_id = 0; static void display_all_transfers_from_trace(FILE *out_paje_file, int src) { unsigned slot; for (slot = 0; slot < mpi_sends_used[src]; slot++) { int dst = mpi_sends[src][slot].other_rank; int mpi_tag = mpi_sends[src][slot].mpi_tag; float start_date = mpi_sends[src][slot].date; size_t size = mpi_sends[src][slot].size; struct mpi_transfer *match; if (dst < MAX_MPI_NODES) match = try_to_match_send_transfer(src, dst, mpi_tag); else match = NULL; if (match) { float end_date = match->date; unsigned long id = mpi_com_id++; if (mpi_sends[src][slot].jobid != -1) _starpu_fxt_dag_add_send(src, mpi_sends[src][slot].jobid, mpi_tag, id); if (match->jobid != -1) _starpu_fxt_dag_add_receive(dst, match->jobid, mpi_tag, id); /* TODO replace 0 by a MPI program ? */ if (out_paje_file) { #ifdef STARPU_HAVE_POTI char paje_value[STARPU_POTI_STR_LEN], paje_key[STARPU_POTI_STR_LEN]; snprintf(paje_value, STARPU_POTI_STR_LEN, "%lu", (long unsigned) size); snprintf(paje_key, STARPU_POTI_STR_LEN, "mpicom_%lu", id); char mpi_container[STARPU_POTI_STR_LEN]; snprintf(mpi_container, sizeof(mpi_container), "%d_mpict", /* XXX */src); poti_StartLink(start_date, "MPICt", "MPIL", mpi_container, paje_value, paje_key); snprintf(mpi_container, sizeof(mpi_container), "%d_mpict", /* XXX */dst); poti_EndLink(end_date, "MPICt", "MPIL", mpi_container, paje_value, paje_key); #else fprintf(out_paje_file, "18 %.9f MPIL MPIroot %lu %d_mpict mpicom_%lu\n", start_date, (unsigned long)size, /* XXX */src, id); fprintf(out_paje_file, "19 %.9f MPIL MPIroot %lu %d_mpict mpicom_%lu\n", end_date, (unsigned long)size, /* XXX */dst, id); #endif } } else { _STARPU_DISP("Warning, could not match MPI transfer from %d to %d (tag %x) starting at %f\n", src, dst, mpi_tag, start_date); } } } void _starpu_fxt_display_mpi_transfers(struct starpu_fxt_options *options, int *ranks, FILE *out_paje_file) { unsigned inputfile; if (options->ninputfiles > MAX_MPI_NODES) { _STARPU_DISP("Warning: %u files given, maximum %u supported, truncating to %u\n", options->ninputfiles, MAX_MPI_NODES, MAX_MPI_NODES); options->ninputfiles = MAX_MPI_NODES; } /* display the MPI transfers if possible */ for (inputfile = 0; inputfile < options->ninputfiles; inputfile++) { int filerank = ranks[inputfile]; display_all_transfers_from_trace(out_paje_file, filerank); } } #endif // STARPU_USE_FXT starpu-1.2.3+dfsg/src/debug/traces/starpu_paje.c000066400000000000000000000525421320135501600215750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2017 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "starpu_fxt.h" #include #ifdef STARPU_HAVE_POTI #include #endif #ifdef STARPU_USE_FXT void _starpu_fxt_write_paje_header(FILE *file STARPU_ATTRIBUTE_UNUSED) { unsigned i; #ifdef STARPU_HAVE_POTI #ifdef HAVE_POTI_INIT_CUSTOM poti_header(); /* see poti_init_custom to customize the header */ #else poti_header(1,1); #endif #else fprintf(file, "%%EventDef PajeDefineContainerType 1\n"); fprintf(file, "%% Alias string\n"); fprintf(file, "%% Type string\n"); fprintf(file, "%% Name string\n"); fprintf(file, "%%EndEventDef\n"); fprintf(file, "%%EventDef PajeDefineEventType 2\n"); fprintf(file, "%% Alias string\n"); fprintf(file, "%% Type string\n"); fprintf(file, "%% Name string\n"); fprintf(file, "%%EndEventDef\n"); fprintf(file, "%%EventDef PajeDefineStateType 3\n"); fprintf(file, "%% Alias string\n"); fprintf(file, "%% Type string\n"); fprintf(file, "%% Name string\n"); fprintf(file, "%%EndEventDef\n"); fprintf(file, "%%EventDef PajeDefineVariableType 4\n"); fprintf(file, "%% Alias string\n"); fprintf(file, "%% Type string\n"); fprintf(file, "%% Name string\n"); fprintf(file, "%%EndEventDef\n"); fprintf(file, "%%EventDef PajeDefineLinkType 5\n"); fprintf(file, "%% Alias string\n"); fprintf(file, "%% Type string\n"); fprintf(file, "%% StartContainerType string\n"); fprintf(file, "%% EndContainerType string\n"); fprintf(file, "%% Name string\n"); fprintf(file, "%%EndEventDef\n"); fprintf(file, "%%EventDef PajeDefineEntityValue 6\n"); fprintf(file, "%% Alias string\n"); fprintf(file, "%% Type string\n"); fprintf(file, "%% Name string\n"); fprintf(file, "%% Color color\n"); fprintf(file, "%%EndEventDef\n"); fprintf(file, "%%EventDef PajeCreateContainer 7\n"); fprintf(file, "%% Time date\n"); fprintf(file, "%% Alias string\n"); fprintf(file, "%% Type string\n"); fprintf(file, "%% Container string\n"); fprintf(file, "%% Name string\n"); fprintf(file, "%%EndEventDef\n"); fprintf(file, "%%EventDef PajeDestroyContainer 8\n"); fprintf(file, "%% Time date\n"); fprintf(file, "%% Name string\n"); fprintf(file, "%% Type string\n"); fprintf(file, "%%EndEventDef\n"); fprintf(file, "%%EventDef PajeNewEvent 9\n"); fprintf(file, "%% Time date\n"); fprintf(file, "%% Type string\n"); fprintf(file, "%% Container string\n"); fprintf(file, "%% Value string\n"); fprintf(file, "%%EndEventDef\n"); fprintf(file, "%%EventDef PajeSetState 10\n"); fprintf(file, "%% Time date\n"); fprintf(file, "%% Container string\n"); fprintf(file, "%% Type string\n"); fprintf(file, "%% Value string\n"); fprintf(file, "%%EndEventDef\n"); fprintf(file, "%%EventDef PajePushState 11\n"); fprintf(file, "%% Time date\n"); fprintf(file, "%% Container string\n"); fprintf(file, "%% Type string\n"); fprintf(file, "%% Value string\n"); fprintf(file, "%%EndEventDef\n"); fprintf(file, "%%EventDef PajePopState 12\n"); fprintf(file, "%% Time date\n"); fprintf(file, "%% Container string\n"); fprintf(file, "%% Type string\n"); fprintf(file, "%%EndEventDef\n"); fprintf(file, "%%EventDef PajeSetVariable 13\n"); fprintf(file, "%% Time date\n"); fprintf(file, "%% Container string\n"); fprintf(file, "%% Type string\n"); fprintf(file, "%% Value double\n"); fprintf(file, "%%EndEventDef\n"); fprintf(file, "%%EventDef PajeAddVariable 14\n"); fprintf(file, "%% Time date\n"); fprintf(file, "%% Type string\n"); fprintf(file, "%% Container string\n"); fprintf(file, "%% Value double\n"); fprintf(file, "%%EndEventDef\n"); fprintf(file, "%%EventDef PajeSubVariable 15\n"); fprintf(file, "%% Time date\n"); fprintf(file, "%% Type string\n"); fprintf(file, "%% Container string\n"); fprintf(file, "%% Value double\n"); fprintf(file, "%%EndEventDef\n"); fprintf(file, "%%EventDef PajeStartLink 18\n"); fprintf(file, "%% Time date\n"); fprintf(file, "%% Type string\n"); fprintf(file, "%% Container string\n"); fprintf(file, "%% Value string\n"); fprintf(file, "%% StartContainer string\n"); fprintf(file, "%% Key string\n"); fprintf(file, "%%EndEventDef\n"); fprintf(file, "%%EventDef PajeEndLink 19\n"); fprintf(file, "%% Time date\n"); fprintf(file, "%% Type string\n"); fprintf(file, "%% Container string\n"); fprintf(file, "%% Value string\n"); fprintf(file, "%% EndContainer string\n"); fprintf(file, "%% Key string\n"); fprintf(file, "%%EndEventDef\n"); fprintf(file, "%%EventDef PajeSetState 20\n"); fprintf(file, "%% Time date\n"); fprintf(file, "%% Container string\n"); fprintf(file, "%% Type string\n"); fprintf(file, "%% Value string\n"); #if 0 /* TODO: implement in worker_set_detailed_state() and handle_codelet_details() */ fprintf(file, "%% Size string\n"); fprintf(file, "%% Params string\n"); fprintf(file, "%% Footprint string\n"); fprintf(file, "%% Tag string\n"); fprintf(file, "%% JobId string\n"); fprintf(file, "%% GFlop string\n"); fprintf(file, "%% X string\n"); fprintf(file, "%% Y string\n"); fprintf(file, "%% Z string\n"); fprintf(file, "%% Iteration string\n"); fprintf(file, "%% Subiteration string\n"); #endif fprintf(file, "%%EndEventDef\n"); #endif #ifdef STARPU_HAVE_POTI poti_DefineContainerType("MPIP", "0", "MPI Program"); poti_DefineContainerType("P", "MPIP", "Program"); poti_DefineContainerType("Mn", "P", "Memory Node"); poti_DefineContainerType("T", "Mn", "Thread"); poti_DefineContainerType("UT", "P", "User Thread"); poti_DefineContainerType("Mm", "Mn", "Memory Manager"); poti_DefineContainerType("W", "T", "Worker"); poti_DefineContainerType("MPICt", "P", "MPI Communication Thread"); poti_DefineContainerType("Sc", "P", "Scheduler"); poti_DefineEventType("prog_event", "P", "program event type"); poti_DefineEventType("register", "P", "data registration"); poti_DefineEventType("unregister", "P", "data unregistration"); /* Types for the memory node */ poti_DefineEventType("invalidate", "Mm", "data invalidation"); poti_DefineVariableType("use", "Mm", "Used (MB)", "0 0 0"); poti_DefineVariableType("bwi", "Mm", "Bandwidth In (MB/s)", "0 0 0"); poti_DefineVariableType("bwo", "Mm", "Bandwidth Out (MB/s)", "0 0 0"); poti_DefineStateType("MS", "Mm", "Memory Node State"); poti_DefineEntityValue("A", "MS", "Allocating", ".4 .1 .0"); poti_DefineEntityValue("Ar", "MS", "AllocatingReuse", ".1 .1 .8"); poti_DefineEntityValue("F", "MS", "Freeing", ".6 .3 .0"); poti_DefineEntityValue("W", "MS", "WritingBack", ".0 .0 .5"); poti_DefineEntityValue("Wa", "MS", "WritingBackAsync", ".0 .0 .4"); poti_DefineEntityValue("R", "MS", "Reclaiming", ".0 .1 .6"); poti_DefineEntityValue("Co", "MS", "DriverCopy", ".3 .5 .1"); poti_DefineEntityValue("CoA", "MS", "DriverCopyAsync", ".1 .3 .1"); poti_DefineEntityValue("No", "MS", "Nothing", ".0 .0 .0"); /* Types for the Worker of the Memory Node */ poti_DefineEventType("user_event", "T", "user event type"); poti_DefineEventType("thread_event", "T", "thread event type"); poti_DefineVariableType("gf", "W", "GFlops", "0 0 0"); poti_DefineStateType("S", "T", "Thread State"); poti_DefineEntityValue("I", "S", "Idle", ".9 .1 0"); poti_DefineEntityValue("In", "S", "Initializing", "0.0 .7 1.0"); poti_DefineEntityValue("D", "S", "Deinitializing", "0.0 .1 .7"); poti_DefineEntityValue("Fi", "S", "FetchingInput", "1.0 .1 1.0"); poti_DefineEntityValue("Po", "S", "PushingOutput", "0.1 1.0 1.0"); poti_DefineEntityValue("C", "S", "Callback", ".0 .3 .8"); poti_DefineEntityValue("B", "S", "Overhead", ".5 .18 .0"); poti_DefineEntityValue("E", "S", "Executing", ".0 .6 .5"); poti_DefineEntityValue("Sc", "S", "Scheduling", ".7 .36 .0"); poti_DefineEntityValue("Sl", "S", "Sleeping", ".9 .1 .0"); poti_DefineEntityValue("P", "S", "Progressing", ".1 .3 .1"); poti_DefineEntityValue("U", "S", "Unpartitioning", ".0 .0 1.0"); poti_DefineEntityValue("H", "S", "Hypervisor", ".5 .18 .0"); poti_DefineEntityValue("Bu", "S", "Building task", ".5 .18 .0"); poti_DefineEntityValue("Su", "S", "Submiting task", ".3 .09 .0"); poti_DefineEntityValue("Th", "S", "Throttling task submission", ".8 .6 .6"); poti_DefineEntityValue("MD", "S", "Decoding task for MPI", ".5 .18 .2"); poti_DefineEntityValue("MPr", "S", "Preparing task for MPI", ".4 .14 .2"); poti_DefineEntityValue("MPo", "S", "Post-processing task for MPI", ".3 .09 .2"); poti_DefineStateType("WS", "W", "Worker State"); poti_DefineEntityValue("I", "WS", "Idle", ".9 .1 .0"); poti_DefineEntityValue("In", "WS", "Initializing", "0.0 .7 1.0"); poti_DefineEntityValue("D", "WS", "Deinitializing", "0.0 .1 .7"); poti_DefineEntityValue("Fi", "WS", "FetchingInput", "1.0 .1 1.0"); poti_DefineEntityValue("Po", "WS", "PushingOutput", "0.1 1.0 1.0"); poti_DefineEntityValue("C", "WS", "Callback", ".0 .3 .8"); poti_DefineEntityValue("B", "WS", "Overhead", ".5 .18 .0"); poti_DefineEntityValue("E", "WS", "Executing", ".0 .6 .5"); poti_DefineEntityValue("Sc", "WS", "Scheduling", ".7 .36 .0"); poti_DefineEntityValue("Sl", "WS", "Sleeping", ".9 .1 .0"); poti_DefineEntityValue("P", "WS", "Progressing", ".1 .3 .1"); poti_DefineEntityValue("U", "WS", "Unpartitioning", ".0 .0 1.0"); poti_DefineEntityValue("H", "WS", "Hypervisor", ".5 .18 .0"); poti_DefineEntityValue("Bu", "WS", "Building task", ".5 .18 .0"); poti_DefineEntityValue("Su", "WS", "Submiting task", ".3 .09 .0"); poti_DefineEntityValue("Th", "WS", "Throttling task submission", ".8 .6 .6"); /* Types for the MPI Communication Thread of the Memory Node */ poti_DefineEventType("MPIev", "MPICt", "MPI event type"); poti_DefineStateType("CtS", "MPICt", "Communication Thread State"); poti_DefineEntityValue("P", "CtS", "Processing", "0 0 0"); poti_DefineEntityValue("Sl", "CtS", "Sleeping", ".9 .1 .0"); poti_DefineEntityValue("UT", "CtS", "UserTesting", ".2 .1 .6"); poti_DefineEntityValue("UW", "CtS", "UserWaiting", ".4 .1 .3"); poti_DefineEntityValue("SdS", "CtS", "SendSubmitted", "1.0 .1 1.0"); poti_DefineEntityValue("RvS", "CtS", "RecieveSubmitted", "0.1 1.0 1.0"); poti_DefineEntityValue("SdC", "CtS", "SendCompleted", "1.0 .5 1.0"); poti_DefineEntityValue("RvC", "CtS", "ReceiveCompleted", "0.5 1.0 1.0"); poti_DefineEntityValue("TD", "CtS", "Testing Detached", ".0 .0 .6"); poti_DefineEntityValue("MT", "CtS", "MPI Test", ".0 .0 .8"); poti_DefineEntityValue("Bu", "CtS", "Building task", ".5 .18 .0"); poti_DefineEntityValue("Su", "CtS", "Submiting task", ".3 .09 .0"); poti_DefineEntityValue("Th", "CtS", "Throttling task submission", ".8 .6 .6"); poti_DefineEntityValue("C", "CtS", "Callback", ".0 .3 .8"); /* Type for other threads */ poti_DefineEventType("user_user_event", "UT", "user event type"); poti_DefineEventType("user_thread_event", "UT", "thread event type"); poti_DefineStateType("US", "UT", "User Thread State"); poti_DefineEntityValue("Bu", "US", "Building task", ".5 .18 .0"); poti_DefineEntityValue("Su", "US", "Submiting task", ".3 .09 .0"); poti_DefineEntityValue("C", "US", "Callback", ".0 .3 .8"); poti_DefineEntityValue("Th", "US", "Throttling task submission", ".8 .6 .6"); poti_DefineEntityValue("MD", "US", "Decoding task for MPI", ".5 .18 .2"); poti_DefineEntityValue("MPr", "US", "Preparing task for MPI", ".4 .14 .2"); poti_DefineEntityValue("MPo", "US", "Post-processing task for MPI", ".3 .09 .2"); poti_DefineEntityValue("W", "US", "Waiting task", ".9 .1 .0"); poti_DefineEntityValue("WA", "US", "Waiting all tasks", ".9 .1 .0"); poti_DefineEntityValue("No", "US", "Nothing", ".0 .0 .0"); for (i=1; i #include #if defined(_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__) #include #endif int main(int argc, char *argv[]) { char *prog, *arch, *def, *effective_version, *version, *lib; char s[1024]; char name[16]; int current, age, revision; if (argc != 7) { fprintf(stderr,"bad number of arguments"); exit(EXIT_FAILURE); } prog = argv[1]; arch = argv[2]; def = argv[3]; effective_version = argv[4]; version = argv[5]; lib = argv[6]; if (sscanf(version, "%d:%d:%d", ¤t, &revision, &age) != 3) exit(EXIT_FAILURE); _snprintf(name, sizeof(name), "libstarpu-%s-%d", effective_version, current - age); printf("using soname %s\n", name); _snprintf(s, sizeof(s), "\"%s\" /machine:%s /def:%s /name:%s /out:%s", prog, arch, def, name, lib); if (system(s)) { fprintf(stderr, "%s failed\n", s); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); } starpu-1.2.3+dfsg/src/drivers/000077500000000000000000000000001320135501600162135ustar00rootroot00000000000000starpu-1.2.3+dfsg/src/drivers/cpu/000077500000000000000000000000001320135501600170025ustar00rootroot00000000000000starpu-1.2.3+dfsg/src/drivers/cpu/driver_cpu.c000066400000000000000000000253301320135501600213130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2017 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010-2014 CNRS * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include "driver_cpu.h" #include #include #include #include #ifdef STARPU_HAVE_HWLOC #include #ifndef HWLOC_API_VERSION #define HWLOC_OBJ_PU HWLOC_OBJ_PROC #endif #endif #ifdef STARPU_HAVE_WINDOWS #include #endif /* Actually launch the job on a cpu worker. * Handle binding CPUs on cores. * In the case of a combined worker WORKER_TASK != J->TASK */ static int execute_job_on_cpu(struct _starpu_job *j, struct starpu_task *worker_task, struct _starpu_worker *cpu_args, int rank, struct starpu_perfmodel_arch* perf_arch) { int ret; int is_parallel_task = (j->task_size > 1); int profiling = starpu_profiling_status_get(); struct starpu_task *task = j->task; struct starpu_codelet *cl = task->cl; #ifdef STARPU_OPENMP /* At this point, j->continuation as been cleared as the task is being * woken up, thus we use j->discontinuous instead for the check */ const unsigned continuation_wake_up = j->discontinuous; #else const unsigned continuation_wake_up = 0; #endif STARPU_ASSERT(cl); if (rank == 0 && !continuation_wake_up) { ret = _starpu_fetch_task_input(j); if (ret != 0) { /* there was not enough memory so the codelet cannot be executed right now ... */ /* push the codelet back and try another one ... */ return -EAGAIN; } } if (is_parallel_task) { STARPU_PTHREAD_BARRIER_WAIT(&j->before_work_barrier); /* In the case of a combined worker, the scheduler needs to know * when each actual worker begins the execution */ _starpu_sched_pre_exec_hook(worker_task); } /* Give profiling variable */ _starpu_driver_start_job(cpu_args, j, perf_arch, rank, profiling); /* In case this is a Fork-join parallel task, the worker does not * execute the kernel at all. */ if ((rank == 0) || (cl->type != STARPU_FORKJOIN)) { _starpu_cl_func_t func = _starpu_task_get_cpu_nth_implementation(cl, j->nimpl); if (is_parallel_task && cl->type == STARPU_FORKJOIN) /* bind to parallel worker */ _starpu_bind_thread_on_cpus(cpu_args->config, _starpu_get_combined_worker_struct(j->combined_workerid)); STARPU_ASSERT_MSG(func, "when STARPU_CPU is defined in 'where', cpu_func or cpu_funcs has to be defined"); if (_starpu_get_disable_kernels() <= 0) { _STARPU_TRACE_START_EXECUTING(); #ifdef STARPU_SIMGRID if (cl->flags & STARPU_CODELET_SIMGRID_EXECUTE) func(_STARPU_TASK_GET_INTERFACES(task), task->cl_arg); else _starpu_simgrid_submit_job(cpu_args->workerid, j, perf_arch, NAN, NULL, NULL, NULL); #else func(_STARPU_TASK_GET_INTERFACES(task), task->cl_arg); #endif _STARPU_TRACE_END_EXECUTING(); } if (is_parallel_task && cl->type == STARPU_FORKJOIN) /* rebind to single CPU */ _starpu_bind_thread_on_cpu(cpu_args->config, cpu_args->bindid, cpu_args->workerid); } _starpu_driver_end_job(cpu_args, j, perf_arch, rank, profiling); if (is_parallel_task) { STARPU_PTHREAD_BARRIER_WAIT(&j->after_work_barrier); #ifdef STARPU_SIMGRID if (rank == 0) { /* Wait for other threads to exit barrier_wait so we * can safely drop the job structure */ MSG_process_sleep(0.0000001); j->after_work_busy_barrier = 0; } #else ANNOTATE_HAPPENS_BEFORE(&j->after_work_busy_barrier); (void) STARPU_ATOMIC_ADD(&j->after_work_busy_barrier, -1); if (rank == 0) { /* Wait with a busy barrier for other workers to have * finished with the blocking barrier before we can * safely drop the job structure */ while (j->after_work_busy_barrier > 0) { STARPU_UYIELD(); STARPU_SYNCHRONIZE(); } ANNOTATE_HAPPENS_AFTER(&j->after_work_busy_barrier); } #endif } if (rank == 0) { _starpu_driver_update_job_feedback(j, cpu_args, perf_arch, profiling); #ifdef STARPU_OPENMP if (!j->continuation) #endif { _starpu_push_task_output(j); } } return 0; } static size_t _starpu_cpu_get_global_mem_size(int nodeid STARPU_ATTRIBUTE_UNUSED, struct _starpu_machine_config *config STARPU_ATTRIBUTE_UNUSED) { size_t global_mem; starpu_ssize_t limit; limit = starpu_get_env_number("STARPU_LIMIT_CPU_MEM"); #ifdef STARPU_DEVEL # warning TODO: take into account NUMA node and check STARPU_LIMIT_CPU_numanode_MEM #endif #if defined(STARPU_HAVE_HWLOC) struct _starpu_machine_topology *topology = &config->topology; #if 0 /* Do not limit ourself to a single NUMA node yet, as we don't have real NUMA support for now */ int depth_node = hwloc_get_type_depth(topology->hwtopology, HWLOC_OBJ_NODE); if (depth_node == HWLOC_TYPE_DEPTH_UNKNOWN) global_mem = hwloc_get_root_obj(topology->hwtopology)->memory.total_memory; else global_mem = hwloc_get_obj_by_depth(topology->hwtopology, depth_node, nodeid)->memory.local_memory; #else global_mem = hwloc_get_root_obj(topology->hwtopology)->memory.total_memory; #endif #else /* STARPU_HAVE_HWLOC */ #ifdef STARPU_DEVEL # warning use sysinfo when available to get global size #endif global_mem = 0; #endif if (limit < 0) // No limit is defined, we return the global memory size return global_mem; else if (global_mem && (size_t)limit * 1024*1024 > global_mem) // The requested limit is higher than what is available, we return the global memory size return global_mem; else // We limit the memory return limit*1024*1024; } int _starpu_cpu_driver_init(struct _starpu_worker *cpu_worker) { int devid = cpu_worker->devid; _starpu_driver_start(cpu_worker, _STARPU_FUT_CPU_KEY, 1); /* FIXME: when we have NUMA support, properly turn node number into NUMA node number */ _starpu_memory_manager_set_global_memory_size(cpu_worker->memory_node, _starpu_cpu_get_global_mem_size(cpu_worker->memory_node, cpu_worker->config)); snprintf(cpu_worker->name, sizeof(cpu_worker->name), "CPU %d", devid); snprintf(cpu_worker->short_name, sizeof(cpu_worker->short_name), "CPU %d", devid); starpu_pthread_setname(cpu_worker->short_name); _STARPU_TRACE_WORKER_INIT_END(cpu_worker->workerid); /* tell the main thread that we are ready */ STARPU_PTHREAD_MUTEX_LOCK(&cpu_worker->mutex); cpu_worker->status = STATUS_UNKNOWN; cpu_worker->worker_is_initialized = 1; STARPU_PTHREAD_COND_SIGNAL(&cpu_worker->ready_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&cpu_worker->mutex); return 0; } int _starpu_cpu_driver_run_once(struct _starpu_worker *cpu_worker) { unsigned memnode = cpu_worker->memory_node; int workerid = cpu_worker->workerid; _starpu_datawizard_progress(memnode, 1); if (memnode != STARPU_MAIN_RAM) _starpu_datawizard_progress(STARPU_MAIN_RAM, 1); struct _starpu_job *j; struct starpu_task *task; int res; task = _starpu_get_worker_task(cpu_worker, workerid, memnode); if (!task) return 0; j = _starpu_get_job_associated_to_task(task); /* can a cpu perform that task ? */ if (!_STARPU_CPU_MAY_PERFORM(j)) { /* put it and the end of the queue ... XXX */ _starpu_push_task_to_workers(task); return 0; } int rank = 0; int is_parallel_task = (j->task_size > 1); struct starpu_perfmodel_arch* perf_arch; _STARPU_TRACE_END_PROGRESS(memnode); /* Get the rank in case it is a parallel task */ if (is_parallel_task) { STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex); rank = j->active_task_alias_count++; STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); if(j->combined_workerid != -1) { struct _starpu_combined_worker *combined_worker; combined_worker = _starpu_get_combined_worker_struct(j->combined_workerid); cpu_worker->combined_workerid = j->combined_workerid; cpu_worker->worker_size = combined_worker->worker_size; cpu_worker->current_rank = rank; perf_arch = &combined_worker->perf_arch; } else { struct _starpu_sched_ctx *sched_ctx = _starpu_sched_ctx_get_sched_ctx_for_worker_and_job(cpu_worker, j); STARPU_ASSERT_MSG(sched_ctx != NULL, "there should be a worker %d in the ctx of this job \n", cpu_worker->workerid); perf_arch = &sched_ctx->perf_arch; } } else { cpu_worker->combined_workerid = cpu_worker->workerid; cpu_worker->worker_size = 1; cpu_worker->current_rank = 0; perf_arch = &cpu_worker->perf_arch; } _starpu_set_current_task(j->task); cpu_worker->current_task = j->task; res = execute_job_on_cpu(j, task, cpu_worker, rank, perf_arch); _starpu_set_current_task(NULL); cpu_worker->current_task = NULL; if (res) { switch (res) { case -EAGAIN: _starpu_push_task_to_workers(task); _STARPU_TRACE_START_PROGRESS(memnode); return 0; default: STARPU_ABORT(); } } /* In the case of combined workers, we need to inform the * scheduler each worker's execution is over. * Then we free the workers' task alias */ if (is_parallel_task) { _starpu_sched_post_exec_hook(task); free(task); } if (rank == 0) _starpu_handle_job_termination(j); _STARPU_TRACE_START_PROGRESS(memnode); return 0; } int _starpu_cpu_driver_deinit(struct _starpu_worker *cpu_worker) { _STARPU_TRACE_WORKER_DEINIT_START; unsigned memnode = cpu_worker->memory_node; _starpu_handle_all_pending_node_data_requests(memnode); /* In case there remains some memory that was automatically * allocated by StarPU, we release it now. Note that data * coherency is not maintained anymore at that point ! */ _starpu_free_all_automatically_allocated_buffers(memnode); cpu_worker->worker_is_initialized = 0; _STARPU_TRACE_WORKER_DEINIT_END(_STARPU_FUT_CPU_KEY); return 0; } void * _starpu_cpu_worker(void *arg) { struct _starpu_worker *args = arg; _starpu_cpu_driver_init(args); _STARPU_TRACE_START_PROGRESS(args->memory_node); while (_starpu_machine_is_running()) { _starpu_may_pause(); _starpu_cpu_driver_run_once(args); } _STARPU_TRACE_END_PROGRESS(args->memory_node); _starpu_cpu_driver_deinit(args); return NULL; } int _starpu_run_cpu(struct _starpu_worker *worker) { worker->set = NULL; worker->worker_is_initialized = 0; _starpu_cpu_worker(worker); return 0; } starpu-1.2.3+dfsg/src/drivers/cpu/driver_cpu.h000066400000000000000000000024501320135501600213160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2014 Université de Bordeaux * Copyright (C) 2010, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DRIVER_CPU_H__ #define __DRIVER_CPU_H__ #include #include #include #include #include #include #include #include #ifdef STARPU_USE_CPU void *_starpu_cpu_worker(void *); struct _starpu_worker; int _starpu_run_cpu(struct _starpu_worker *); int _starpu_cpu_driver_init(struct _starpu_worker *); int _starpu_cpu_driver_run_once(struct _starpu_worker *); int _starpu_cpu_driver_deinit(struct _starpu_worker *); #endif /* !STARPU_USE_CPU */ #endif // __DRIVER_CPU_H__ starpu-1.2.3+dfsg/src/drivers/cuda/000077500000000000000000000000001320135501600171275ustar00rootroot00000000000000starpu-1.2.3+dfsg/src/drivers/cuda/driver_cuda.c000066400000000000000000000725171320135501600215760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2015, 2017 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016, 2017 CNRS * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include "driver_cuda.h" #include #ifdef HAVE_CUDA_GL_INTEROP_H #include #endif #include #include #include #ifdef STARPU_SIMGRID #include #endif #ifdef STARPU_USE_CUDA #if CUDART_VERSION >= 5000 /* Avoid letting our streams spuriously synchonize with the NULL stream */ #define starpu_cudaStreamCreate(stream) cudaStreamCreateWithFlags(stream, cudaStreamNonBlocking) #else #define starpu_cudaStreamCreate(stream) cudaStreamCreate(stream) #endif #endif /* the number of CUDA devices */ static int ncudagpus = -1; static size_t global_mem[STARPU_MAXCUDADEVS]; #ifdef STARPU_USE_CUDA static cudaStream_t streams[STARPU_NMAXWORKERS]; static cudaStream_t out_transfer_streams[STARPU_MAXCUDADEVS]; static cudaStream_t in_transfer_streams[STARPU_MAXCUDADEVS]; /* Note: streams are not thread-safe, so we define them for each CUDA worker * emitting a GPU-GPU transfer */ static cudaStream_t in_peer_transfer_streams[STARPU_MAXCUDADEVS][STARPU_MAXCUDADEVS]; static cudaStream_t out_peer_transfer_streams[STARPU_MAXCUDADEVS][STARPU_MAXCUDADEVS]; static struct cudaDeviceProp props[STARPU_MAXCUDADEVS]; #ifndef STARPU_SIMGRID static cudaEvent_t task_events[STARPU_NMAXWORKERS][STARPU_MAX_PIPELINE]; #endif #endif /* STARPU_USE_CUDA */ #ifdef STARPU_SIMGRID static unsigned task_finished[STARPU_NMAXWORKERS][STARPU_MAX_PIPELINE]; static starpu_pthread_mutex_t task_mutex[STARPU_NMAXWORKERS][STARPU_MAX_PIPELINE]; static starpu_pthread_cond_t task_cond[STARPU_NMAXWORKERS][STARPU_MAX_PIPELINE]; #endif /* STARPU_SIMGRID */ void _starpu_cuda_discover_devices (struct _starpu_machine_config *config) { /* Discover the number of CUDA devices. Fill the result in CONFIG. */ #ifdef STARPU_SIMGRID config->topology.nhwcudagpus = _starpu_simgrid_get_nbhosts("CUDA"); #else int cnt; cudaError_t cures; cures = cudaGetDeviceCount (&cnt); if (STARPU_UNLIKELY(cures != cudaSuccess)) cnt = 0; config->topology.nhwcudagpus = cnt; #endif } /* In case we want to cap the amount of memory available on the GPUs by the * mean of the STARPU_LIMIT_CUDA_MEM, we decrease the value of * global_mem[devid] which is the value returned by * _starpu_cuda_get_global_mem_size() to indicate how much memory can * be allocated on the device */ static void _starpu_cuda_limit_gpu_mem_if_needed(unsigned devid) { starpu_ssize_t limit; size_t STARPU_ATTRIBUTE_UNUSED totalGlobalMem = 0; size_t STARPU_ATTRIBUTE_UNUSED to_waste = 0; #ifdef STARPU_SIMGRID totalGlobalMem = _starpu_simgrid_get_memsize("CUDA", devid); #elif defined(STARPU_USE_CUDA) /* Find the size of the memory on the device */ totalGlobalMem = props[devid].totalGlobalMem; #endif limit = starpu_get_env_number("STARPU_LIMIT_CUDA_MEM"); if (limit == -1) { char name[30]; sprintf(name, "STARPU_LIMIT_CUDA_%u_MEM", devid); limit = starpu_get_env_number(name); } #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) if (limit == -1) { /* Use 90% of the available memory by default. */ limit = totalGlobalMem / (1024*1024) * 0.9; } #endif global_mem[devid] = limit * 1024*1024; #ifdef STARPU_USE_CUDA /* How much memory to waste ? */ to_waste = totalGlobalMem - global_mem[devid]; props[devid].totalGlobalMem -= to_waste; #endif /* STARPU_USE_CUDA */ _STARPU_DEBUG("CUDA device %u: Wasting %ld MB / Limit %ld MB / Total %ld MB / Remains %ld MB\n", devid, (long) to_waste/(1024*1024), (long) limit, (long) totalGlobalMem/(1024*1024), (long) (totalGlobalMem - to_waste)/(1024*1024)); } #ifdef STARPU_USE_CUDA cudaStream_t starpu_cuda_get_local_in_transfer_stream() { int worker = starpu_worker_get_id(); int devid = starpu_worker_get_devid(worker); cudaStream_t stream; stream = in_transfer_streams[devid]; STARPU_ASSERT(stream); return stream; } cudaStream_t starpu_cuda_get_local_out_transfer_stream() { int worker = starpu_worker_get_id(); int devid = starpu_worker_get_devid(worker); cudaStream_t stream; stream = out_transfer_streams[devid]; STARPU_ASSERT(stream); return stream; } cudaStream_t starpu_cuda_get_peer_transfer_stream(unsigned src_node, unsigned dst_node) { int worker = starpu_worker_get_id(); int devid = starpu_worker_get_devid(worker); int src_devid = _starpu_memory_node_get_devid(src_node); int dst_devid = _starpu_memory_node_get_devid(dst_node); cudaStream_t stream; STARPU_ASSERT(devid == src_devid || devid == dst_devid); if (devid == dst_devid) stream = in_peer_transfer_streams[src_devid][dst_devid]; else stream = out_peer_transfer_streams[src_devid][dst_devid]; STARPU_ASSERT(stream); return stream; } cudaStream_t starpu_cuda_get_local_stream(void) { int worker = starpu_worker_get_id(); return streams[worker]; } const struct cudaDeviceProp *starpu_cuda_get_device_properties(unsigned workerid) { struct _starpu_machine_config *config = _starpu_get_machine_config(); unsigned devid = config->workers[workerid].devid; return &props[devid]; } #endif /* STARPU_USE_CUDA */ void starpu_cuda_set_device(unsigned devid STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_SIMGRID STARPU_ABORT(); #else cudaError_t cures; struct starpu_conf *conf = &_starpu_get_machine_config()->conf; #if !defined(HAVE_CUDA_MEMCPY_PEER) && defined(HAVE_CUDA_GL_INTEROP_H) unsigned i; #endif #ifdef HAVE_CUDA_MEMCPY_PEER if (conf->n_cuda_opengl_interoperability) { _STARPU_MSG("OpenGL interoperability was requested, but StarPU was built with multithread GPU control support, please reconfigure with --disable-cuda-memcpy-peer but that will disable the memcpy-peer optimizations\n"); STARPU_ABORT(); } #elif !defined(HAVE_CUDA_GL_INTEROP_H) if (conf->n_cuda_opengl_interoperability) { _STARPU_MSG("OpenGL interoperability was requested, but cuda_gl_interop.h could not be compiled, please make sure that OpenGL headers were available before ./configure run."); STARPU_ABORT(); } #else for (i = 0; i < conf->n_cuda_opengl_interoperability; i++) if (conf->cuda_opengl_interoperability[i] == devid) { cures = cudaGLSetGLDevice(devid); goto done; } #endif cures = cudaSetDevice(devid); #if !defined(HAVE_CUDA_MEMCPY_PEER) && defined(HAVE_CUDA_GL_INTEROP_H) done: #endif if (STARPU_UNLIKELY(cures #ifdef STARPU_OPENMP /* When StarPU is used as Open Runtime support, * starpu_omp_shutdown() will usually be called from a * destructor, in which case cudaThreadExit() reports a * cudaErrorCudartUnloading here. There should not * be any remaining tasks running at this point so * we can probably ignore it without much consequences. */ && cures != cudaErrorCudartUnloading #endif /* STARPU_OPENMP */ )) STARPU_CUDA_REPORT_ERROR(cures); #endif } #ifndef STARPU_SIMGRID static void init_device_context(unsigned devid) { cudaError_t cures; /* TODO: cudaSetDeviceFlag(cudaDeviceMapHost) */ starpu_cuda_set_device(devid); #ifdef HAVE_CUDA_MEMCPY_PEER if (starpu_get_env_number("STARPU_ENABLE_CUDA_GPU_GPU_DIRECT") != 0) { int nworkers = starpu_worker_get_count(); int workerid; for (workerid = 0; workerid < nworkers; workerid++) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); if (worker->arch == STARPU_CUDA_WORKER && worker->devid != devid) { int can; cures = cudaDeviceCanAccessPeer(&can, devid, worker->devid); if (!cures && can) { cures = cudaDeviceEnablePeerAccess(worker->devid, 0); if (!cures) _STARPU_DEBUG("Enabled GPU-Direct %d -> %d\n", worker->devid, devid); } } } } #endif /* force CUDA to initialize the context for real */ cures = cudaFree(0); if (STARPU_UNLIKELY(cures)) { if (cures == cudaErrorDevicesUnavailable) { _STARPU_MSG("All CUDA-capable devices are busy or unavailable\n"); exit(77); } STARPU_CUDA_REPORT_ERROR(cures); } cures = cudaGetDeviceProperties(&props[devid], devid); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); #ifdef HAVE_CUDA_MEMCPY_PEER if (props[devid].computeMode == cudaComputeModeExclusive) { _STARPU_MSG("CUDA is in EXCLUSIVE-THREAD mode, but StarPU was built with multithread GPU control support, please either ask your administrator to use EXCLUSIVE-PROCESS mode (which should really be fine), or reconfigure with --disable-cuda-memcpy-peer but that will disable the memcpy-peer optimizations\n"); STARPU_ABORT(); } #endif cures = starpu_cudaStreamCreate(&in_transfer_streams[devid]); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); cures = starpu_cudaStreamCreate(&out_transfer_streams[devid]); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); unsigned i; for (i = 0; i < ncudagpus; i++) { cures = starpu_cudaStreamCreate(&in_peer_transfer_streams[i][devid]); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); cures = starpu_cudaStreamCreate(&out_peer_transfer_streams[devid][i]); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); } } #endif /* !STARPU_SIMGRID */ static void init_worker_context(unsigned workerid) { int j; #ifdef STARPU_SIMGRID for (j = 0; j < STARPU_MAX_PIPELINE; j++) { task_finished[workerid][j] = 0; STARPU_PTHREAD_MUTEX_INIT(&task_mutex[workerid][j], NULL); STARPU_PTHREAD_COND_INIT(&task_cond[workerid][j], NULL); } #else /* !STARPU_SIMGRID */ cudaError_t cures; for (j = 0; j < STARPU_MAX_PIPELINE; j++) { cures = cudaEventCreateWithFlags(&task_events[workerid][j], cudaEventDisableTiming); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); } cures = starpu_cudaStreamCreate(&streams[workerid]); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); #endif /* !STARPU_SIMGRID */ } #ifndef STARPU_SIMGRID static void deinit_device_context(unsigned devid) { unsigned i; cudaStreamDestroy(in_transfer_streams[devid]); cudaStreamDestroy(out_transfer_streams[devid]); for (i = 0; i < ncudagpus; i++) { cudaStreamDestroy(in_peer_transfer_streams[i][devid]); cudaStreamDestroy(out_peer_transfer_streams[devid][i]); } } #endif /* !STARPU_SIMGRID */ static void deinit_worker_context(unsigned workerid) { unsigned j; #ifdef STARPU_SIMGRID for (j = 0; j < STARPU_MAX_PIPELINE; j++) { STARPU_PTHREAD_MUTEX_DESTROY(&task_mutex[workerid][j]); STARPU_PTHREAD_COND_DESTROY(&task_cond[workerid][j]); } #else /* STARPU_SIMGRID */ for (j = 0; j < STARPU_MAX_PIPELINE; j++) cudaEventDestroy(task_events[workerid][j]); cudaStreamDestroy(streams[workerid]); #endif /* STARPU_SIMGRID */ } static size_t _starpu_cuda_get_global_mem_size(unsigned devid) { return global_mem[devid]; } /* Return the number of devices usable in the system. * The value returned cannot be greater than MAXCUDADEVS */ unsigned _starpu_get_cuda_device_count(void) { int cnt; #ifdef STARPU_SIMGRID cnt = _starpu_simgrid_get_nbhosts("CUDA"); #else cudaError_t cures; cures = cudaGetDeviceCount(&cnt); if (STARPU_UNLIKELY(cures)) return 0; #endif if (cnt > STARPU_MAXCUDADEVS) { _STARPU_MSG("# Warning: %d CUDA devices available. Only %d enabled. Use configure option --enable-maxcudadev=xxx to update the maximum value of supported CUDA devices.\n", cnt, STARPU_MAXCUDADEVS); cnt = STARPU_MAXCUDADEVS; } return (unsigned)cnt; } void _starpu_init_cuda(void) { if (ncudagpus < 0) { ncudagpus = _starpu_get_cuda_device_count(); STARPU_ASSERT(ncudagpus <= STARPU_MAXCUDADEVS); } } static int start_job_on_cuda(struct _starpu_job *j, struct _starpu_worker *worker, unsigned char pipeline_idx STARPU_ATTRIBUTE_UNUSED) { int ret; STARPU_ASSERT(j); struct starpu_task *task = j->task; int profiling = starpu_profiling_status_get(); STARPU_ASSERT(task); struct starpu_codelet *cl = task->cl; STARPU_ASSERT(cl); _starpu_set_current_task(task); ret = _starpu_fetch_task_input(j); if (ret != 0) { /* there was not enough memory, so the input of * the codelet cannot be fetched ... put the * codelet back, and try it later */ return -EAGAIN; } if (worker->ntasks == 1) { /* We are alone in the pipeline, the kernel will start now, record it */ _starpu_driver_start_job(worker, j, &worker->perf_arch, 0, profiling); } #if defined(HAVE_CUDA_MEMCPY_PEER) && !defined(STARPU_SIMGRID) /* We make sure we do manipulate the proper device */ starpu_cuda_set_device(worker->devid); #endif starpu_cuda_func_t func = _starpu_task_get_cuda_nth_implementation(cl, j->nimpl); STARPU_ASSERT_MSG(func, "when STARPU_CUDA is defined in 'where', cuda_func or cuda_funcs has to be defined"); if (_starpu_get_disable_kernels() <= 0) { _STARPU_TRACE_START_EXECUTING(); #ifdef STARPU_SIMGRID int async = task->cl->cuda_flags[j->nimpl] & STARPU_CUDA_ASYNC; unsigned workerid = worker->workerid; if (cl->flags & STARPU_CODELET_SIMGRID_EXECUTE && !async) func(_STARPU_TASK_GET_INTERFACES(task), task->cl_arg); else _starpu_simgrid_submit_job(workerid, j, &worker->perf_arch, NAN, async ? &task_finished[workerid][pipeline_idx] : NULL, async ? &task_mutex[workerid][pipeline_idx] : NULL, async ? &task_cond[workerid][pipeline_idx] : NULL); #else func(_STARPU_TASK_GET_INTERFACES(task), task->cl_arg); #endif _STARPU_TRACE_END_EXECUTING(); } return 0; } static void finish_job_on_cuda(struct _starpu_job *j, struct _starpu_worker *worker) { int profiling = starpu_profiling_status_get(); _starpu_set_current_task(NULL); if (worker->pipeline_length) worker->current_tasks[worker->first_task] = NULL; else worker->current_task = NULL; worker->first_task = (worker->first_task + 1) % STARPU_MAX_PIPELINE; worker->ntasks--; _starpu_driver_end_job(worker, j, &worker->perf_arch, 0, profiling); struct _starpu_sched_ctx *sched_ctx = _starpu_sched_ctx_get_sched_ctx_for_worker_and_job(worker, j); if(!sched_ctx) sched_ctx = _starpu_get_sched_ctx_struct(j->task->sched_ctx); if(!sched_ctx->sched_policy) _starpu_driver_update_job_feedback(j, worker, &sched_ctx->perf_arch, profiling); else _starpu_driver_update_job_feedback(j, worker, &worker->perf_arch, profiling); _starpu_push_task_output(j); _starpu_handle_job_termination(j); } /* Execute a job, up to completion for synchronous jobs */ static void execute_job_on_cuda(struct starpu_task *task, struct _starpu_worker *worker) { int workerid = worker->workerid; int res; struct _starpu_job *j = _starpu_get_job_associated_to_task(task); unsigned char pipeline_idx = (worker->first_task + worker->ntasks - 1)%STARPU_MAX_PIPELINE; res = start_job_on_cuda(j, worker, pipeline_idx); if (res) { switch (res) { case -EAGAIN: _STARPU_DISP("ouch, CUDA could not actually run task %p, putting it back...\n", task); _starpu_push_task_to_workers(task); STARPU_ABORT(); default: STARPU_ABORT(); } } if (task->cl->cuda_flags[j->nimpl] & STARPU_CUDA_ASYNC) { if (worker->pipeline_length == 0) { #ifdef STARPU_SIMGRID _starpu_simgrid_wait_tasks(workerid); #else /* Forced synchronous execution */ cudaStreamSynchronize(starpu_cuda_get_local_stream()); #endif finish_job_on_cuda(j, worker); } else { #ifndef STARPU_SIMGRID /* Record event to synchronize with task termination later */ cudaEventRecord(task_events[workerid][pipeline_idx], starpu_cuda_get_local_stream()); #endif #ifdef STARPU_USE_FXT int k; for (k = 0; k < (int) worker->set->nworkers; k++) if (worker->set->workers[k].ntasks == worker->set->workers[k].pipeline_length) break; if (k == (int) worker->set->nworkers) /* Everybody busy */ _STARPU_TRACE_START_EXECUTING(); #endif } } else /* Synchronous execution */ { #if !defined(STARPU_SIMGRID) STARPU_ASSERT_MSG(cudaStreamQuery(starpu_cuda_get_local_stream()) == cudaSuccess, "Unless when using the STARPU_CUDA_ASYNC flag, CUDA codelets have to wait for termination of their kernels on the starpu_cuda_get_local_stream() stream"); #endif finish_job_on_cuda(j, worker); } } /* XXX Should this be merged with _starpu_init_cuda ? */ int _starpu_cuda_driver_init(struct _starpu_worker_set *worker_set) { struct _starpu_worker *worker0 = &worker_set->workers[0]; int lastdevid = -1; unsigned i; _starpu_driver_start(worker0, _STARPU_FUT_CUDA_KEY, 0); _starpu_set_local_worker_set_key(worker_set); #ifdef STARPU_USE_FXT for (i = 1; i < worker_set->nworkers; i++) _starpu_worker_start(&worker_set->workers[i], _STARPU_FUT_CUDA_KEY, 0); #endif for (i = 0; i < worker_set->nworkers; i++) { struct _starpu_worker *worker = &worker_set->workers[i]; unsigned devid = worker->devid; unsigned memnode = worker->memory_node; if ((int) devid == lastdevid) /* Already initialized */ continue; lastdevid = devid; #ifndef STARPU_SIMGRID init_device_context(devid); #endif #ifdef STARPU_SIMGRID STARPU_ASSERT_MSG(worker_set->nworkers == 1, "Simgrid mode does not support concurrent kernel execution yet\n"); #else /* !STARPU_SIMGRID */ if (worker_set->nworkers > 1 && props[devid].concurrentKernels == 0) _STARPU_DISP("Warning: STARPU_NWORKER_PER_CUDA is %u, but the device does not support concurrent kernel execution!\n", worker_set->nworkers); #endif /* !STARPU_SIMGRID */ _starpu_cuda_limit_gpu_mem_if_needed(devid); _starpu_memory_manager_set_global_memory_size(memnode, _starpu_cuda_get_global_mem_size(devid)); } /* one more time to avoid hacks from third party lib :) */ _starpu_bind_thread_on_cpu(worker0->config, worker0->bindid, worker0->workerid); for (i = 0; i < worker_set->nworkers; i++) { struct _starpu_worker *worker = &worker_set->workers[i]; unsigned devid = worker->devid; unsigned workerid = worker->workerid; float size = (float) global_mem[devid] / (1<<30); #ifdef STARPU_SIMGRID const char *devname = "Simgrid"; #else /* get the device's name */ char devname[128]; strncpy(devname, props[devid].name, 127); devname[127] = 0; #endif #if defined(STARPU_HAVE_BUSID) && !defined(STARPU_SIMGRID) #if defined(STARPU_HAVE_DOMAINID) && !defined(STARPU_SIMGRID) if (props[devid].pciDomainID) snprintf(worker->name, sizeof(worker->name), "CUDA %u.%u (%s %.1f GiB %04x:%02x:%02x.0)", devid, i, devname, size, props[devid].pciDomainID, props[devid].pciBusID, props[devid].pciDeviceID); else #endif snprintf(worker->name, sizeof(worker->name), "CUDA %u.%u (%s %.1f GiB %02x:%02x.0)", devid, i, devname, size, props[devid].pciBusID, props[devid].pciDeviceID); #else snprintf(worker->name, sizeof(worker->name), "CUDA %u.%u (%s %.1f GiB)", devid, i, devname, size); #endif snprintf(worker->short_name, sizeof(worker->short_name), "CUDA %u.%u", devid, i); _STARPU_DEBUG("cuda (%s) dev id %u worker %u thread is ready to run on CPU %d !\n", devname, devid, i, worker->bindid); worker->pipeline_length = starpu_get_env_number_default("STARPU_CUDA_PIPELINE", 2); if (worker->pipeline_length > STARPU_MAX_PIPELINE) { _STARPU_DISP("Warning: STARPU_CUDA_PIPELINE is %u, but STARPU_MAX_PIPELINE is only %u", worker->pipeline_length, STARPU_MAX_PIPELINE); worker->pipeline_length = STARPU_MAX_PIPELINE; } #if defined(STARPU_SIMGRID) && defined(STARPU_NON_BLOCKING_DRIVERS) if (worker->pipeline_length >= 1) { /* We need blocking drivers, otherwise idle drivers * would keep consuming real CPU time while just * polling for task termination */ _STARPU_DISP("Warning: reducing STARPU_CUDA_PIPELINE to 0 because simgrid is enabled and blocking drivers are not enabled\n"); worker->pipeline_length = 0; } #endif #if !defined(STARPU_SIMGRID) && !defined(STARPU_NON_BLOCKING_DRIVERS) if (worker->pipeline_length >= 1) { /* We need non-blocking drivers, to poll for CUDA task * termination */ _STARPU_DISP("Warning: reducing STARPU_CUDA_PIPELINE to 0 because blocking drivers are enabled (and simgrid is not enabled)\n"); worker->pipeline_length = 0; } #endif init_worker_context(workerid); _STARPU_TRACE_WORKER_INIT_END(workerid); } { char thread_name[16]; snprintf(thread_name, sizeof(thread_name), "CUDA %u", worker0->devid); starpu_pthread_setname(thread_name); } /* tell the main thread that this one is ready */ STARPU_PTHREAD_MUTEX_LOCK(&worker0->mutex); worker0->status = STATUS_UNKNOWN; worker0->worker_is_initialized = 1; STARPU_PTHREAD_COND_SIGNAL(&worker0->ready_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&worker0->mutex); /* tell the main thread that this one is ready */ STARPU_PTHREAD_MUTEX_LOCK(&worker_set->mutex); worker_set->set_is_initialized = 1; STARPU_PTHREAD_COND_SIGNAL(&worker_set->ready_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&worker_set->mutex); return 0; } int _starpu_cuda_driver_run_once(struct _starpu_worker_set *worker_set) { struct _starpu_worker *worker0 = &worker_set->workers[0]; unsigned memnode = worker0->memory_node; struct starpu_task *tasks[worker_set->nworkers], *task; struct _starpu_job *j; int i, res; int idle; /* First poll for completed jobs */ idle = 0; for (i = 0; i < (int) worker_set->nworkers; i++) { struct _starpu_worker *worker = &worker_set->workers[i]; int workerid = worker->workerid; if (!worker->ntasks) { idle++; /* Even nothing to test */ continue; } if (worker->pipeline_length) task = worker->current_tasks[worker->first_task]; else task = worker->current_task; /* On-going asynchronous task, check for its termination first */ #ifdef STARPU_SIMGRID if (task_finished[workerid][worker->first_task]) #else /* !STARPU_SIMGRID */ cudaError_t cures = cudaEventQuery(task_events[workerid][worker->first_task]); if (cures != cudaSuccess) { STARPU_ASSERT_MSG(cures == cudaErrorNotReady, "CUDA error on task %p, codelet %p (%s): %s (%d)", task, task->cl, _starpu_codelet_get_model_name(task->cl), cudaGetErrorString(cures), cures); } else #endif /* !STARPU_SIMGRID */ { _STARPU_TRACE_END_PROGRESS(memnode); /* Asynchronous task completed! */ _starpu_set_local_worker_key(worker); finish_job_on_cuda(_starpu_get_job_associated_to_task(task), worker); /* See next task if any */ if (worker->ntasks) { task = worker->current_tasks[worker->first_task]; j = _starpu_get_job_associated_to_task(task); if (task->cl->cuda_flags[j->nimpl] & STARPU_CUDA_ASYNC) { /* An asynchronous task, it was already * queued, it's now running, record its start time. */ _starpu_driver_start_job(worker, j, &worker->perf_arch, 0, starpu_profiling_status_get()); } else { /* A synchronous task, we have finished * flushing the pipeline, we can now at * last execute it. */ _STARPU_TRACE_EVENT("sync_task"); execute_job_on_cuda(task, worker); _STARPU_TRACE_EVENT("end_sync_task"); worker->pipeline_stuck = 0; } } #ifdef STARPU_USE_FXT int k; for (k = 0; k < (int) worker_set->nworkers; k++) if (worker_set->workers[k].ntasks) break; if (k == (int) worker_set->nworkers) /* Everybody busy */ _STARPU_TRACE_END_EXECUTING() #endif _STARPU_TRACE_START_PROGRESS(memnode); } if (!worker->pipeline_length || worker->ntasks < worker->pipeline_length) idle++; } #ifdef STARPU_NON_BLOCKING_DRIVERS if (!idle) { /* Nothing ready yet, no better thing to do than waiting */ __starpu_datawizard_progress(memnode, 1, 0); __starpu_datawizard_progress(STARPU_MAIN_RAM, 1, 0); return 0; } #endif /* Something done, make some progress */ __starpu_datawizard_progress(memnode, 1, 1); __starpu_datawizard_progress(STARPU_MAIN_RAM, 1, 1); /* And pull tasks */ res = _starpu_get_multi_worker_task(worker_set->workers, tasks, worker_set->nworkers, worker0->memory_node); if (!res) return 0; for (i = 0; i < (int) worker_set->nworkers; i++) { struct _starpu_worker *worker = &worker_set->workers[i]; task = tasks[i]; if (!task) continue; j = _starpu_get_job_associated_to_task(task); /* can CUDA do that task ? */ if (!_STARPU_CUDA_MAY_PERFORM(j)) { /* this is neither a cuda or a cublas task */ worker->ntasks--; _starpu_push_task_to_workers(task); continue; } if (worker->ntasks > 1 && !(task->cl->cuda_flags[j->nimpl] & STARPU_CUDA_ASYNC)) { /* We have to execute a non-asynchronous task but we * still have tasks in the pipeline... Record it to * prevent more tasks from coming, and do it later */ worker->pipeline_stuck = 1; continue; } _starpu_set_local_worker_key(worker); _STARPU_TRACE_END_PROGRESS(memnode); execute_job_on_cuda(task, worker); _STARPU_TRACE_START_PROGRESS(memnode); } return 0; } int _starpu_cuda_driver_deinit(struct _starpu_worker_set *worker_set) { int lastdevid = -1; unsigned i; _STARPU_TRACE_WORKER_DEINIT_START; for (i = 0; i < worker_set->nworkers; i++) { struct _starpu_worker *worker = &worker_set->workers[i]; unsigned devid = worker->devid; unsigned memnode = worker->memory_node; if ((int) devid == lastdevid) /* Already initialized */ continue; lastdevid = devid; _starpu_handle_all_pending_node_data_requests(memnode); /* In case there remains some memory that was automatically * allocated by StarPU, we release it now. Note that data * coherency is not maintained anymore at that point ! */ _starpu_free_all_automatically_allocated_buffers(memnode); _starpu_malloc_shutdown(memnode); #ifndef STARPU_SIMGRID deinit_device_context(devid); #endif /* !STARPU_SIMGRID */ } for (i = 0; i < worker_set->nworkers; i++) { unsigned workerid = worker_set->workers[i].workerid; deinit_worker_context(workerid); } worker_set->workers[0].worker_is_initialized = 0; _STARPU_TRACE_WORKER_DEINIT_END(_STARPU_FUT_CUDA_KEY); return 0; } void *_starpu_cuda_worker(void *_arg) { struct _starpu_worker_set* worker_set = _arg; unsigned i; _starpu_cuda_driver_init(worker_set); for (i = 0; i < worker_set->nworkers; i++) _STARPU_TRACE_START_PROGRESS(worker_set->workers[i].memory_node); while (_starpu_machine_is_running()) { _starpu_may_pause(); _starpu_cuda_driver_run_once(worker_set); } for (i = 0; i < worker_set->nworkers; i++) _STARPU_TRACE_END_PROGRESS(worker_set->workers[i].memory_node); _starpu_cuda_driver_deinit(worker_set); return NULL; } #ifdef STARPU_USE_CUDA void starpu_cublas_report_error(const char *func, const char *file, int line, int status) { char *errormsg; switch (status) { case CUBLAS_STATUS_SUCCESS: errormsg = "success"; break; case CUBLAS_STATUS_NOT_INITIALIZED: errormsg = "not initialized"; break; case CUBLAS_STATUS_ALLOC_FAILED: errormsg = "alloc failed"; break; case CUBLAS_STATUS_INVALID_VALUE: errormsg = "invalid value"; break; case CUBLAS_STATUS_ARCH_MISMATCH: errormsg = "arch mismatch"; break; case CUBLAS_STATUS_EXECUTION_FAILED: errormsg = "execution failed"; break; case CUBLAS_STATUS_INTERNAL_ERROR: errormsg = "internal error"; break; default: errormsg = "unknown error"; break; } _STARPU_MSG("oops in %s (%s:%d)... %d: %s \n", func, file, line, status, errormsg); STARPU_ABORT(); } void starpu_cuda_report_error(const char *func, const char *file, int line, cudaError_t status) { const char *errormsg = cudaGetErrorString(status); printf("oops in %s (%s:%d)... %d: %s \n", func, file, line, status, errormsg); STARPU_ABORT(); } #endif /* STARPU_USE_CUDA */ #ifdef STARPU_USE_CUDA int starpu_cuda_copy_async_sync(void *src_ptr, unsigned src_node, void *dst_ptr, unsigned dst_node, size_t ssize, cudaStream_t stream, enum cudaMemcpyKind kind) { #ifdef HAVE_CUDA_MEMCPY_PEER int peer_copy = 0; int src_dev = -1, dst_dev = -1; #endif cudaError_t cures = 0; if (kind == cudaMemcpyDeviceToDevice && src_node != dst_node) { #ifdef HAVE_CUDA_MEMCPY_PEER peer_copy = 1; src_dev = _starpu_memory_node_get_devid(src_node); dst_dev = _starpu_memory_node_get_devid(dst_node); #else STARPU_ABORT(); #endif } if (stream) { _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); #ifdef HAVE_CUDA_MEMCPY_PEER if (peer_copy) { cures = cudaMemcpyPeerAsync((char *) dst_ptr, dst_dev, (char *) src_ptr, src_dev, ssize, stream); } else #endif { cures = cudaMemcpyAsync((char *)dst_ptr, (char *)src_ptr, ssize, kind, stream); } _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); } /* Test if the asynchronous copy has failed or if the caller only asked for a synchronous copy */ if (stream == NULL || cures) { /* do it in a synchronous fashion */ #ifdef HAVE_CUDA_MEMCPY_PEER if (peer_copy) { cures = cudaMemcpyPeer((char *) dst_ptr, dst_dev, (char *) src_ptr, src_dev, ssize); } else #endif { cures = cudaMemcpy((char *)dst_ptr, (char *)src_ptr, ssize, kind); } if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); return 0; } return -EAGAIN; } #endif /* STARPU_USE_CUDA */ int _starpu_run_cuda(struct _starpu_worker_set *workerarg) { /* Let's go ! */ _starpu_cuda_worker(workerarg); return 0; } starpu-1.2.3+dfsg/src/drivers/cuda/driver_cuda.h000066400000000000000000000035531320135501600215750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2012-2014 Université de Bordeaux * Copyright (C) 2010, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DRIVER_CUDA_H__ #define __DRIVER_CUDA_H__ #ifdef STARPU_USE_CUDA #include #include #include #endif #include #include #include #include #include #include #include unsigned _starpu_get_cuda_device_count(void); #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) void _starpu_cuda_discover_devices (struct _starpu_machine_config *); void _starpu_init_cuda(void); void *_starpu_cuda_worker(void *); #else # define _starpu_cuda_discover_devices(config) ((void) config) #endif #ifdef STARPU_USE_CUDA cudaStream_t starpu_cuda_get_local_in_transfer_stream(void); cudaStream_t starpu_cuda_get_local_out_transfer_stream(void); cudaStream_t starpu_cuda_get_peer_transfer_stream(unsigned src_node, unsigned dst_node); struct _starpu_worker_set; int _starpu_run_cuda(struct _starpu_worker_set *); int _starpu_cuda_driver_init(struct _starpu_worker_set *); int _starpu_cuda_driver_run_once(struct _starpu_worker_set *); int _starpu_cuda_driver_deinit(struct _starpu_worker_set *); #endif #endif // __DRIVER_CUDA_H__ starpu-1.2.3+dfsg/src/drivers/cuda/starpu_cublas.c000066400000000000000000000041101320135501600221360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012, 2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #ifdef STARPU_USE_CUDA #include #include static cublasHandle_t cublas_handles[STARPU_NMAXWORKERS]; static cublasHandle_t main_handle; static void init_cublas_func(void *args STARPU_ATTRIBUTE_UNUSED) { cublasStatus cublasst = cublasInit(); if (STARPU_UNLIKELY(cublasst)) STARPU_CUBLAS_REPORT_ERROR(cublasst); cublasCreate(&cublas_handles[starpu_worker_get_id_check()]); cublasSetStream(cublas_handles[starpu_worker_get_id_check()], starpu_cuda_get_local_stream()); cublasSetKernelStream(starpu_cuda_get_local_stream()); } static void shutdown_cublas_func(void *args STARPU_ATTRIBUTE_UNUSED) { cublasShutdown(); cublasDestroy(cublas_handles[starpu_worker_get_id_check()]); } #endif void starpu_cublas_init(void) { #ifdef STARPU_USE_CUDA starpu_execute_on_each_worker(init_cublas_func, NULL, STARPU_CUDA); if (cublasCreate(&main_handle) != CUBLAS_STATUS_SUCCESS) main_handle = NULL; #endif } void starpu_cublas_shutdown(void) { #ifdef STARPU_USE_CUDA starpu_execute_on_each_worker(shutdown_cublas_func, NULL, STARPU_CUDA); if (main_handle) cublasDestroy(main_handle); #endif } #ifdef STARPU_USE_CUDA cublasHandle_t starpu_cublas_get_local_handle(void) { int workerid = starpu_worker_get_id(); if (workerid >= 0) return cublas_handles[workerid]; else return main_handle; } #endif starpu-1.2.3+dfsg/src/drivers/cuda/starpu_cusparse.c000066400000000000000000000041331320135501600225170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012, 2014, 2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #ifdef HAVE_LIBCUSPARSE #include static cusparseHandle_t cusparse_handles[STARPU_NMAXWORKERS]; static cusparseHandle_t main_handle; static void init_cusparse_func(void *args STARPU_ATTRIBUTE_UNUSED) { cusparseCreate(&cusparse_handles[starpu_worker_get_id_check()]); #if HAVE_DECL_CUSPARSESETSTREAM cusparseSetStream(cusparse_handles[starpu_worker_get_id_check()], starpu_cuda_get_local_stream()); #else cusparseSetKernelStream(cusparse_handles[starpu_worker_get_id_check()], starpu_cuda_get_local_stream()); #endif } static void shutdown_cusparse_func(void *args STARPU_ATTRIBUTE_UNUSED) { cusparseDestroy(cusparse_handles[starpu_worker_get_id_check()]); } #endif void starpu_cusparse_init(void) { #ifdef HAVE_LIBCUSPARSE starpu_execute_on_each_worker(init_cusparse_func, NULL, STARPU_CUDA); if (cusparseCreate(&main_handle) != CUSPARSE_STATUS_SUCCESS) main_handle = NULL; #endif } void starpu_cusparse_shutdown(void) { #ifdef HAVE_LIBCUSPARSE starpu_execute_on_each_worker(shutdown_cusparse_func, NULL, STARPU_CUDA); if (main_handle) cusparseDestroy(main_handle); #endif } #ifdef HAVE_LIBCUSPARSE cusparseHandle_t starpu_cusparse_get_local_handle(void) { int workerid = starpu_worker_get_id(); if (workerid >= 0) return cusparse_handles[workerid]; else return main_handle; } #endif starpu-1.2.3+dfsg/src/drivers/disk/000077500000000000000000000000001320135501600171455ustar00rootroot00000000000000starpu-1.2.3+dfsg/src/drivers/disk/driver_disk.c000066400000000000000000000034261320135501600216230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Corentin Salingue * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include int _starpu_disk_copy_src_to_disk(void * src, unsigned src_node, void * dst, size_t dst_offset, unsigned dst_node, size_t size, void * async_channel) { STARPU_ASSERT(starpu_node_get_kind(src_node) == STARPU_CPU_RAM); return _starpu_disk_write(src_node, dst_node, dst, src, dst_offset, size, async_channel); } int _starpu_disk_copy_disk_to_src(void * src, size_t src_offset, unsigned src_node, void * dst, unsigned dst_node, size_t size, void * async_channel) { STARPU_ASSERT(starpu_node_get_kind(dst_node) == STARPU_CPU_RAM); return _starpu_disk_read(src_node, dst_node, src, dst, src_offset, size, async_channel); } int _starpu_disk_copy_disk_to_disk(void * src, size_t src_offset, unsigned src_node, void * dst, size_t dst_offset, unsigned dst_node, size_t size, void * async_channel) { STARPU_ASSERT(starpu_node_get_kind(src_node) == STARPU_DISK_RAM && starpu_node_get_kind(dst_node) == STARPU_DISK_RAM); return _starpu_disk_copy(src_node, src, src_offset, dst_node, dst, dst_offset, size, async_channel); } starpu-1.2.3+dfsg/src/drivers/disk/driver_disk.h000066400000000000000000000022361320135501600216260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Corentin Salingue * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DRIVER_DISK_H__ #define __DRIVER_DISK_H__ int _starpu_disk_copy_src_to_disk(void * src, unsigned src_node, void * dst, size_t dst_offset, unsigned dst_node, size_t size, void * async_channel); int _starpu_disk_copy_disk_to_src(void * src, size_t src_offset, unsigned src_node, void * dst, unsigned dst_node, size_t size, void * async_channel); int _starpu_disk_copy_disk_to_disk(void * src, size_t src_offset, unsigned src_node, void * dst, size_t dst_offset, unsigned dst_node, size_t size, void * async_channel); #endif starpu-1.2.3+dfsg/src/drivers/driver_common/000077500000000000000000000000001320135501600210565ustar00rootroot00000000000000starpu-1.2.3+dfsg/src/drivers/driver_common/driver_common.c000066400000000000000000000455231320135501600240760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016 CNRS * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2014, 2016 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include #define BACKOFF_MAX 32 /* TODO : use parameter to define them */ #define BACKOFF_MIN 1 void _starpu_driver_start_job(struct _starpu_worker *worker, struct _starpu_job *j, struct starpu_perfmodel_arch* perf_arch STARPU_ATTRIBUTE_UNUSED, int rank, int profiling) { struct starpu_task *task = j->task; struct starpu_codelet *cl = task->cl; int starpu_top=_starpu_top_status_get(); int workerid = worker->workerid; unsigned calibrate_model = 0; if (cl->model && cl->model->benchmarking) calibrate_model = 1; /* If the job is executed on a combined worker there is no need for the * scheduler to process it : it doesn't contain any valuable data * as it's not linked to an actual worker */ if (j->task_size == 1) _starpu_sched_pre_exec_hook(task); _starpu_set_worker_status(worker, STATUS_EXECUTING); task->status = STARPU_TASK_RUNNING; if (rank == 0) { STARPU_AYU_RUNTASK(j->job_id); cl->per_worker_stats[workerid]++; struct starpu_profiling_task_info *profiling_info = task->profiling_info; if ((profiling && profiling_info) || calibrate_model || starpu_top) { _starpu_clock_gettime(&worker->cl_start); _starpu_worker_register_executing_start_date(workerid, &worker->cl_start); } } if (starpu_top) _starpu_top_task_started(task,workerid,&worker->cl_start); // Find out if the worker is the master of a parallel context struct _starpu_sched_ctx *sched_ctx = _starpu_sched_ctx_get_sched_ctx_for_worker_and_job(worker, j); if(!sched_ctx) sched_ctx = _starpu_get_sched_ctx_struct(j->task->sched_ctx); if(!sched_ctx->sched_policy) { if(!sched_ctx->awake_workers && sched_ctx->main_master == worker->workerid) { struct starpu_worker_collection *workers = sched_ctx->workers; struct starpu_sched_ctx_iterator it; if (workers->init_iterator) workers->init_iterator(workers, &it); while (workers->has_next(workers, &it)) { int _workerid = workers->get_next(workers, &it); if (_workerid != workerid) { struct _starpu_worker *_worker = _starpu_get_worker_struct(_workerid); _starpu_driver_start_job(_worker, j, &_worker->perf_arch, rank, profiling); } } } _STARPU_TRACE_START_CODELET_BODY(j, j->nimpl, &sched_ctx->perf_arch, workerid); } else _STARPU_TRACE_START_CODELET_BODY(j, j->nimpl, perf_arch, workerid); _STARPU_TASK_BREAK_ON(task, exec); } void _starpu_driver_end_job(struct _starpu_worker *worker, struct _starpu_job *j, struct starpu_perfmodel_arch* perf_arch STARPU_ATTRIBUTE_UNUSED, int rank, int profiling) { struct starpu_task *task = j->task; struct starpu_codelet *cl = task->cl; int starpu_top=_starpu_top_status_get(); int workerid = worker->workerid; unsigned calibrate_model = 0; // Find out if the worker is the master of a parallel context struct _starpu_sched_ctx *sched_ctx = _starpu_sched_ctx_get_sched_ctx_for_worker_and_job(worker, j); if(!sched_ctx) sched_ctx = _starpu_get_sched_ctx_struct(j->task->sched_ctx); if (!sched_ctx->sched_policy) { _starpu_perfmodel_create_comb_if_needed(&(sched_ctx->perf_arch)); _STARPU_TRACE_END_CODELET_BODY(j, j->nimpl, &(sched_ctx->perf_arch), workerid); } else { _starpu_perfmodel_create_comb_if_needed(perf_arch); _STARPU_TRACE_END_CODELET_BODY(j, j->nimpl, perf_arch, workerid); } if (cl && cl->model && cl->model->benchmarking) calibrate_model = 1; if (rank == 0) { struct starpu_profiling_task_info *profiling_info = task->profiling_info; if ((profiling && profiling_info) || calibrate_model || starpu_top) { _starpu_clock_gettime(&worker->cl_end); _starpu_worker_register_executing_end(workerid); } STARPU_AYU_POSTRUNTASK(j->job_id); } if (starpu_top) _starpu_top_task_ended(task,workerid,&worker->cl_end); _starpu_set_worker_status(worker, STATUS_UNKNOWN); if(!sched_ctx->sched_policy && !sched_ctx->awake_workers && sched_ctx->main_master == worker->workerid) { struct starpu_worker_collection *workers = sched_ctx->workers; struct starpu_sched_ctx_iterator it; if (workers->init_iterator) workers->init_iterator(workers, &it); while (workers->has_next(workers, &it)) { int _workerid = workers->get_next(workers, &it); if (_workerid != workerid) { struct _starpu_worker *_worker = _starpu_get_worker_struct(_workerid); _starpu_driver_end_job(_worker, j, &_worker->perf_arch, rank, profiling); } } } } void _starpu_driver_update_job_feedback(struct _starpu_job *j, struct _starpu_worker *worker, struct starpu_perfmodel_arch* perf_arch, int profiling) { struct starpu_profiling_task_info *profiling_info = j->task->profiling_info; struct timespec measured_ts; int workerid = worker->workerid; struct starpu_codelet *cl = j->task->cl; int calibrate_model = 0; int updated = 0; _starpu_perfmodel_create_comb_if_needed(perf_arch); #ifndef STARPU_SIMGRID if (cl->model && cl->model->benchmarking) calibrate_model = 1; #endif if ((profiling && profiling_info) || calibrate_model) { double measured; starpu_timespec_sub(&worker->cl_end, &worker->cl_start, &measured_ts); measured = starpu_timing_timespec_to_us(&measured_ts); if (profiling && profiling_info) { memcpy(&profiling_info->start_time, &worker->cl_start, sizeof(struct timespec)); memcpy(&profiling_info->end_time, &worker->cl_end, sizeof(struct timespec)); profiling_info->workerid = workerid; _starpu_worker_update_profiling_info_executing(workerid, &measured_ts, 1, profiling_info->used_cycles, profiling_info->stall_cycles, profiling_info->energy_consumed); updated = 1; } if (calibrate_model) { #ifdef STARPU_OPENMP double time_consumed = measured; unsigned do_update_time_model; if (j->continuation) { /* The job is only paused, thus we accumulate * its timing, but we don't update its * perfmodel now. */ starpu_timespec_accumulate(&j->cumulated_ts, &measured_ts); do_update_time_model = 0; } else { if (j->discontinuous) { /* The job was paused at least once but is now * really completing. We need to take into * account its past execution time in its * perfmodel. */ starpu_timespec_accumulate(&measured_ts, &j->cumulated_ts); time_consumed = starpu_timing_timespec_to_us(&measured_ts); } do_update_time_model = 1; } #else const unsigned do_update_time_model = 1; const double time_consumed = measured; #endif if (do_update_time_model) { _starpu_update_perfmodel_history(j, j->task->cl->model, perf_arch, worker->devid, time_consumed, j->nimpl); } } } if (!updated) _starpu_worker_update_profiling_info_executing(workerid, NULL, 1, 0, 0, 0); if (profiling_info && profiling_info->energy_consumed && cl->energy_model && cl->energy_model->benchmarking) { #ifdef STARPU_OPENMP double energy_consumed = profiling_info->energy_consumed; unsigned do_update_energy_model; if (j->continuation) { j->cumulated_energy_consumed += energy_consumed; do_update_energy_model = 0; } else { if (j->discontinuous) { energy_consumed += j->cumulated_energy_consumed; } do_update_energy_model = 1; } #else const double energy_consumed = profiling_info->energy_consumed; const unsigned do_update_energy_model = 1; #endif if (do_update_energy_model) { _starpu_update_perfmodel_history(j, j->task->cl->energy_model, perf_arch, worker->devid, energy_consumed, j->nimpl); } } } static void _starpu_worker_set_status_scheduling(int workerid) { if (_starpu_worker_get_status(workerid) != STATUS_SLEEPING && _starpu_worker_get_status(workerid) != STATUS_WAKING_UP && _starpu_worker_get_status(workerid) != STATUS_SCHEDULING) { _STARPU_TRACE_WORKER_SCHEDULING_START; _starpu_worker_set_status(workerid, STATUS_SCHEDULING); } } static void _starpu_worker_set_status_scheduling_done(int workerid) { if (_starpu_worker_get_status(workerid) == STATUS_SCHEDULING) { _STARPU_TRACE_WORKER_SCHEDULING_END; _starpu_worker_set_status(workerid, STATUS_UNKNOWN); } } static void _starpu_worker_set_status_sleeping(int workerid) { if ( _starpu_worker_get_status(workerid) == STATUS_WAKING_UP) _starpu_worker_set_status(workerid, STATUS_SLEEPING); else if (_starpu_worker_get_status(workerid) != STATUS_SLEEPING) { _STARPU_TRACE_WORKER_SLEEP_START; _starpu_worker_restart_sleeping(workerid); _starpu_worker_set_status(workerid, STATUS_SLEEPING); } } static void _starpu_worker_set_status_wakeup(int workerid) { if (_starpu_worker_get_status(workerid) == STATUS_SLEEPING || _starpu_worker_get_status(workerid) == STATUS_WAKING_UP) { _STARPU_TRACE_WORKER_SLEEP_END; _starpu_worker_stop_sleeping(workerid); _starpu_worker_set_status(workerid, STATUS_UNKNOWN); } } static void _starpu_exponential_backoff(struct _starpu_worker *worker) { int delay = worker->spinning_backoff; if (worker->spinning_backoff < BACKOFF_MAX) worker->spinning_backoff<<=1; while(delay--) STARPU_UYIELD(); } /* Workers may block when there is no work to do at all. */ struct starpu_task *_starpu_get_worker_task(struct _starpu_worker *worker, int workerid, unsigned memnode STARPU_ATTRIBUTE_UNUSED) { STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); struct starpu_task *task; unsigned needed = 1; unsigned executing STARPU_ATTRIBUTE_UNUSED = 0; _starpu_worker_set_status_scheduling(workerid); while(needed) { struct _starpu_sched_ctx *sched_ctx = NULL; struct _starpu_sched_ctx_list *l = NULL; for (l = worker->sched_ctx_list; l; l = l->next) { sched_ctx = _starpu_get_sched_ctx_struct(l->sched_ctx); if(sched_ctx && sched_ctx->id > 0 && sched_ctx->id < STARPU_NMAX_SCHED_CTXS) { STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx->parallel_sect_mutex[workerid]); if(!sched_ctx->sched_policy && sched_ctx->awake_workers) worker->slave = sched_ctx->main_master != workerid; if(sched_ctx->parallel_sect[workerid]) { /* don't let the worker sleep with the sched_mutex taken */ /* we need it until here bc of the list of ctxs of the workers that can change in another thread */ STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); needed = 0; _starpu_sched_ctx_signal_worker_blocked(sched_ctx->id, workerid); sched_ctx->busy[workerid] = 1; STARPU_PTHREAD_COND_WAIT(&sched_ctx->parallel_sect_cond[workerid], &sched_ctx->parallel_sect_mutex[workerid]); sched_ctx->busy[workerid] = 0; STARPU_PTHREAD_COND_SIGNAL(&sched_ctx->parallel_sect_cond_busy[workerid]); _starpu_sched_ctx_signal_worker_woke_up(sched_ctx->id, workerid); sched_ctx->parallel_sect[workerid] = 0; STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); } STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx->parallel_sect_mutex[workerid]); } if(!needed) break; } /* don't worry if the value is not correct (no lock) it will do it next time */ if(worker->tmp_sched_ctx != -1) { sched_ctx = _starpu_get_sched_ctx_struct(worker->tmp_sched_ctx); STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx->parallel_sect_mutex[workerid]); if(sched_ctx->parallel_sect[workerid]) { // needed = 0; STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); _starpu_sched_ctx_signal_worker_blocked(sched_ctx->id, workerid); sched_ctx->busy[workerid] = 1; STARPU_PTHREAD_COND_WAIT(&sched_ctx->parallel_sect_cond[workerid], &sched_ctx->parallel_sect_mutex[workerid]); sched_ctx->busy[workerid] = 0; STARPU_PTHREAD_COND_SIGNAL(&sched_ctx->parallel_sect_cond_busy[workerid]); _starpu_sched_ctx_signal_worker_woke_up(sched_ctx->id, workerid); sched_ctx->parallel_sect[workerid] = 0; STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); } STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx->parallel_sect_mutex[workerid]); } needed = !needed; } if ((worker->pipeline_length == 0 && worker->current_task) || (worker->pipeline_length != 0 && worker->ntasks)) /* This worker is executing something */ executing = 1; if (worker->pipeline_length && (worker->ntasks == worker->pipeline_length || worker->pipeline_stuck)) task = NULL; else task = _starpu_pop_task(worker); if (task == NULL && !executing) { /* Didn't get a task to run and none are running, go to sleep */ /* Note: we need to keep the sched condition mutex all along the path * from popping a task from the scheduler to blocking. Otherwise the * driver may go block just after the scheduler got a new task to be * executed, and thus hanging. */ _starpu_worker_set_status_sleeping(workerid); if (_starpu_worker_can_block(memnode, worker) #ifndef STARPU_SIMGRID && !_starpu_sched_ctx_last_worker_awake(worker) #endif ) { STARPU_PTHREAD_COND_WAIT(&worker->sched_cond, &worker->sched_mutex); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); } else { STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); if (_starpu_machine_is_running()) { _starpu_exponential_backoff(worker); #ifdef STARPU_SIMGRID static int warned; if (!warned) { warned = 1; _STARPU_DISP("Has to make simgrid spin for CPU idle time. You can try to pass --enable-blocking-drivers to ./configure to avoid this\n"); } MSG_process_sleep(0.000010); #endif } } return NULL; } if (task) { _starpu_worker_set_status_scheduling_done(workerid); _starpu_worker_set_status_wakeup(workerid); } else { _starpu_worker_set_status_sleeping(workerid); } worker->spinning_backoff = BACKOFF_MIN; STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); STARPU_AYU_PRERUNTASK(_starpu_get_job_associated_to_task(task)->job_id, workerid); return task; } int _starpu_get_multi_worker_task(struct _starpu_worker *workers, struct starpu_task ** tasks, int nworkers, unsigned memnode STARPU_ATTRIBUTE_UNUSED) { int i, count = 0; struct _starpu_job * j; int is_parallel_task; struct _starpu_combined_worker *combined_worker; int executing STARPU_ATTRIBUTE_UNUSED = 0; /*for each worker*/ #ifndef STARPU_NON_BLOCKING_DRIVERS /* This assumes only 1 worker */ STARPU_ASSERT_MSG(nworkers == 1, "Multiple workers is not yet possible in blocking drivers mode\n"); STARPU_PTHREAD_MUTEX_LOCK_SCHED(&workers[0].sched_mutex); #endif for (i = 0; i < nworkers; i++) { if ((workers[i].pipeline_length == 0 && workers[i].current_task) || (workers[i].pipeline_length != 0 && workers[i].ntasks)) /* At least this worker is executing something */ executing = 1; /*if the worker is already executing a task then */ if((workers[i].pipeline_length == 0 && workers[i].current_task) || (workers[i].pipeline_length != 0 && (workers[i].ntasks == workers[i].pipeline_length || workers[i].pipeline_stuck))) { tasks[i] = NULL; } /*else try to pop a task*/ else { #ifdef STARPU_NON_BLOCKING_DRIVERS STARPU_PTHREAD_MUTEX_LOCK_SCHED(&workers[i].sched_mutex); #endif _starpu_worker_set_status_scheduling(workers[i].workerid); _starpu_set_local_worker_key(&workers[i]); tasks[i] = _starpu_pop_task(&workers[i]); if(tasks[i] != NULL) { _starpu_worker_set_status_scheduling_done(workers[i].workerid); _starpu_worker_set_status_wakeup(workers[i].workerid); #ifdef STARPU_NON_BLOCKING_DRIVERS STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&workers[i].sched_mutex); #endif count ++; j = _starpu_get_job_associated_to_task(tasks[i]); is_parallel_task = (j->task_size > 1); if (workers[i].pipeline_length) workers[i].current_tasks[(workers[i].first_task + workers[i].ntasks)%STARPU_MAX_PIPELINE] = tasks[i]; else workers[i].current_task = j->task; workers[i].ntasks++; /* Get the rank in case it is a parallel task */ if (is_parallel_task) { STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex); workers[i].current_rank = j->active_task_alias_count++; STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); if(j->combined_workerid != -1) { combined_worker = _starpu_get_combined_worker_struct(j->combined_workerid); workers[i].combined_workerid = j->combined_workerid; workers[i].worker_size = combined_worker->worker_size; } } else { workers[i].combined_workerid = workers[i].workerid; workers[i].worker_size = 1; workers[i].current_rank = 0; } STARPU_AYU_PRERUNTASK(_starpu_get_job_associated_to_task(tasks[i])->job_id, workers[i].workerid); } else { _starpu_worker_set_status_sleeping(workers[i].workerid); #ifdef STARPU_NON_BLOCKING_DRIVERS STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&workers[i].sched_mutex); #endif } } } #ifndef STARPU_NON_BLOCKING_DRIVERS /* Block the assumed-to-be-only worker */ struct _starpu_worker *worker = &workers[0]; unsigned workerid = workers[0].workerid; if (!count && !executing) { /* Didn't get a task to run and none are running, go to sleep */ /* Note: we need to keep the sched condition mutex all along the path * from popping a task from the scheduler to blocking. Otherwise the * driver may go block just after the scheduler got a new task to be * executed, and thus hanging. */ _starpu_worker_set_status_sleeping(workerid); if (_starpu_worker_can_block(memnode, worker) #ifndef STARPU_SIMGRID && !_starpu_sched_ctx_last_worker_awake(worker) #endif ) { STARPU_PTHREAD_COND_WAIT(&worker->sched_cond, &worker->sched_mutex); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); } else { STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); if (_starpu_machine_is_running()) { _starpu_exponential_backoff(worker); #ifdef STARPU_SIMGRID static int warned; if (!warned) { warned = 1; _STARPU_DISP("Has to make simgrid spin for CPU idle time. You can try to pass --enable-blocking-drivers to ./configure to avoid this\n"); } MSG_process_sleep(0.000010); #endif } } return 0; } _starpu_worker_set_status_wakeup(workerid); worker->spinning_backoff = BACKOFF_MIN; STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); #endif /* !STARPU_NON_BLOCKING_DRIVERS */ return count; } starpu-1.2.3+dfsg/src/drivers/driver_common/driver_common.h000066400000000000000000000030711320135501600240730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012, 2014, 2017 Université de Bordeaux * Copyright (C) 2010, 2011 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DRIVER_COMMON_H__ #define __DRIVER_COMMON_H__ #include #include #include #include void _starpu_driver_start_job(struct _starpu_worker *args, struct _starpu_job *j, struct starpu_perfmodel_arch* perf_arch, int rank, int profiling); void _starpu_driver_end_job(struct _starpu_worker *args, struct _starpu_job *j, struct starpu_perfmodel_arch* perf_arch, int rank, int profiling); void _starpu_driver_update_job_feedback(struct _starpu_job *j, struct _starpu_worker *worker_args, struct starpu_perfmodel_arch* perf_arch, int profiling); struct starpu_task *_starpu_get_worker_task(struct _starpu_worker *args, int workerid, unsigned memnode); int _starpu_get_multi_worker_task(struct _starpu_worker *workers, struct starpu_task ** tasks, int nworker, unsigned memnode); #endif // __DRIVER_COMMON_H__ starpu-1.2.3+dfsg/src/drivers/mic/000077500000000000000000000000001320135501600167635ustar00rootroot00000000000000starpu-1.2.3+dfsg/src/drivers/mic/driver_mic_common.c000066400000000000000000000120131320135501600226170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include void _starpu_mic_common_report_scif_error(const char *func, const char *file, const int line, const int status) { const char *errormsg = strerror(status); printf("Common: oops in %s (%s:%d)... %d: %s \n", func, file, line, status, errormsg); STARPU_ASSERT(0); } /* Handles the error so the caller (which must be generic) doesn't have to * care about it. */ void _starpu_mic_common_send(const struct _starpu_mp_node *node, void *msg, int len) { if ((scif_send(node->mp_connection.mic_endpoint, msg, len, SCIF_SEND_BLOCK)) < 0) STARPU_MP_COMMON_REPORT_ERROR(node, errno); } /* Teel is the mic endpoint is ready * return 1 if a message has been receive, 0 if no message has been receive */ int _starpu_mic_common_recv_is_ready(const struct _starpu_mp_node *mp_node) { struct scif_pollepd pollepd; pollepd.epd = mp_node->mp_connection.mic_endpoint; pollepd.events = SCIF_POLLIN; pollepd.revents = 0; return scif_poll(&pollepd,1,0); } /* Handles the error so the caller (which must be generic) doesn't have to * care about it. */ void _starpu_mic_common_recv(const struct _starpu_mp_node *node, void *msg, int len) { if ((scif_recv(node->mp_connection.mic_endpoint, msg, len, SCIF_RECV_BLOCK)) < 0) STARPU_MP_COMMON_REPORT_ERROR(node, errno); } /* Handles the error so the caller (which must be generic) doesn't have to * care about it. */ void _starpu_mic_common_dt_send(const struct _starpu_mp_node *mp_node, void *msg, int len) { if ((scif_send(mp_node->host_sink_dt_connection.mic_endpoint, msg, len, SCIF_SEND_BLOCK)) < 0) STARPU_MP_COMMON_REPORT_ERROR(mp_node, errno); } /* Handles the error so the caller (which must be generic) doesn't have to * care about it. */ void _starpu_mic_common_dt_recv(const struct _starpu_mp_node *mp_node, void *msg, int len) { if ((scif_recv(mp_node->host_sink_dt_connection.mic_endpoint, msg, len, SCIF_SEND_BLOCK)) < 0) STARPU_MP_COMMON_REPORT_ERROR(mp_node, errno); } void _starpu_mic_common_connect(scif_epd_t *endpoint, uint16_t remote_node, COIPROCESS process, uint16_t local_port_number, uint16_t remote_port_number) { /* Endpoint only useful for the initialization of the connection */ struct scif_portID portID; portID.node = remote_node; portID.port = remote_port_number; if ((*endpoint = scif_open()) < 0) STARPU_MIC_COMMON_REPORT_SCIF_ERROR(errno); if ((scif_bind(*endpoint, local_port_number)) < 0) STARPU_MIC_COMMON_REPORT_SCIF_ERROR(errno); _STARPU_DEBUG("Connecting to MIC %d on %d:%d...\n", remote_node, local_port_number, remote_port_number); while (scif_connect(*endpoint, &portID) == -1) { if (process) { const char *main_name = "starpu_init"; COIFUNCTION func; COIRESULT res; /* Check whether it's still alive */ res = COIProcessGetFunctionHandles(process, 1, &main_name, &func); STARPU_ASSERT_MSG(res != COI_PROCESS_DIED, "process died on MIC %d", remote_node-1); STARPU_ASSERT_MSG(res != COI_DOES_NOT_EXIST, "MIC program does not expose the 'starpu_init' function, please link it with -rdynamic or -export-dynamic"); if (res != COI_SUCCESS) STARPU_MIC_SRC_REPORT_COI_ERROR(res); } if (errno != ECONNREFUSED) STARPU_MIC_COMMON_REPORT_SCIF_ERROR(errno); } _STARPU_DEBUG("done\n"); } /* Wait and accept the connection from the wanted device on the port PORT_NUMBER * and then initialize the connection, the resutling endpoint is stored in ENDPOINT */ void _starpu_mic_common_accept(scif_epd_t *endpoint, uint16_t port_number) { /* Unused variables, only useful to make scif_accept don't cause * a seg fault when trying to access PEER parameter */ struct scif_portID portID; /* Endpoint only useful for the initialization of the connection */ int init_epd; if ((init_epd = scif_open()) < 0) STARPU_MIC_COMMON_REPORT_SCIF_ERROR(errno); if ((scif_bind(init_epd, port_number)) < 0) STARPU_MIC_COMMON_REPORT_SCIF_ERROR(errno); /* We fix the maximum number of request to 1 as we * only need one connection, more would be an error */ if ((scif_listen(init_epd, 1)) < 0) STARPU_MIC_COMMON_REPORT_SCIF_ERROR(errno); _STARPU_DEBUG("MIC accepting connection on %u...\n", port_number); if ((scif_accept(init_epd, &portID, endpoint, SCIF_ACCEPT_SYNC)) < 0) STARPU_MIC_COMMON_REPORT_SCIF_ERROR(errno); _STARPU_DEBUG("done : %d\n", init_epd); scif_close(init_epd); } starpu-1.2.3+dfsg/src/drivers/mic/driver_mic_common.h000066400000000000000000000053051320135501600226320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DRIVER_MIC_COMMON_H__ #define __DRIVER_MIC_COMMON_H__ #include #ifdef STARPU_USE_MIC #include #define STARPU_TO_MIC_ID(id) ((id) + 1) /* TODO: rather allocate ports on the host and pass them as parameters to the device process */ // We use the last SCIF reserved port and add 1000 to be safe #define STARPU_MIC_PORTS_BEGIN SCIF_PORT_RSVD+1000 #define STARPU_MIC_SOURCE_PORT_NUMBER STARPU_MIC_PORTS_BEGIN #define STARPU_MIC_SINK_PORT_NUMBER(id) ((id) + STARPU_MIC_PORTS_BEGIN) #define STARPU_MIC_SOURCE_DT_PORT_NUMBER (STARPU_MAXMICDEVS + STARPU_MIC_PORTS_BEGIN) #define STARPU_MIC_SINK_DT_PORT_NUMBER(id) ((id) + STARPU_MAXMICDEVS + STARPU_MIC_PORTS_BEGIN + 1) #define STARPU_MIC_SINK_SINK_DT_PORT_NUMBER(me, peer_id) \ ((me) * STARPU_MAXMICDEVS + (peer_id) + 2 * STARPU_MAXMICDEVS + STARPU_MIC_PORTS_BEGIN + 1) #define STARPU_MIC_PAGE_SIZE 0x1000 #define STARPU_MIC_GET_PAGE_SIZE_MULTIPLE(size) \ (((size) % STARPU_MIC_PAGE_SIZE == 0) ? (size) : (((size) / STARPU_MIC_PAGE_SIZE + 1) * STARPU_MIC_PAGE_SIZE)) #define STARPU_MIC_COMMON_REPORT_SCIF_ERROR(status) \ _starpu_mic_common_report_scif_error(__starpu_func__, __FILE__, __LINE__, status) struct _starpu_mic_free_command { void *addr; size_t size; }; void _starpu_mic_common_report_scif_error(const char *func, const char *file, int line, const int status); int _starpu_mic_common_recv_is_ready(const struct _starpu_mp_node *mp_node); void _starpu_mic_common_send(const struct _starpu_mp_node *node, void *msg, int len); void _starpu_mic_common_recv(const struct _starpu_mp_node *node, void *msg, int len); void _starpu_mic_common_dt_send(const struct _starpu_mp_node *node, void *msg, int len); void _starpu_mic_common_dt_recv(const struct _starpu_mp_node *node, void *msg, int len); void _starpu_mic_common_connect(scif_epd_t *endpoint, uint16_t remote_node, COIPROCESS process, uint16_t local_port_number, uint16_t remote_port_number); void _starpu_mic_common_accept(scif_epd_t *endpoint, uint16_t port_number); #endif /* STARPU_USE_MIC */ #endif /* __DRIVER_MIC_COMMON_H__ */ starpu-1.2.3+dfsg/src/drivers/mic/driver_mic_sink.c000066400000000000000000000155471320135501600223120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include "driver_mic_common.h" #include "driver_mic_sink.h" static int mic_core_to_thread[240]; /* Initialize the MIC sink, initializing connection to the source * and to the other devices (not implemented yet). */ void _starpu_mic_sink_init(struct _starpu_mp_node *node) { #ifdef __KNC__ starpu_pthread_t self; cpu_set_t cpuset; /* We reserve one core for the communications */ /*Bind on the first core*/ self = pthread_self(); CPU_ZERO(&cpuset); CPU_SET(0,&cpuset); pthread_setaffinity_np(self,sizeof(cpu_set_t),&cpuset); #endif /* Initialize connection with the source */ _starpu_mic_common_accept(&node->mp_connection.mic_endpoint, STARPU_MIC_SOURCE_PORT_NUMBER); _starpu_mic_common_accept(&node->host_sink_dt_connection.mic_endpoint, STARPU_MIC_SOURCE_DT_PORT_NUMBER); node->nb_cores = COISysGetHardwareThreadCount() - COISysGetHardwareThreadCount() / COISysGetCoreCount(); _STARPU_MALLOC(node->thread_table, sizeof(starpu_pthread_t)*node->nb_cores); #ifdef STARPU_DEVEL #warning rather use hwloc #endif #ifdef __KNC__ unsigned core,thread; /* Round-robin between cores. Take care of the odd numbering of threads on the KNC */ for (core = 0; core < 60; core++) for (thread = 0; thread < 4; thread++) mic_core_to_thread[core + thread * 60] = core * 4 + thread + 1; #elif defined(__KNF__) #error need to check the numbering #endif //_STARPU_MALLOC(node->sink_sink_dt_connections, node->nb_mp_sinks * sizeof(union _starpu_mp_connection)); //for (i = 0; i < (unsigned int)node->devid; ++i) // _starpu_mic_common_connect(&node->sink_sink_dt_connections[i].mic_endpoint, // STARPU_TO_MIC_ID(i), // NULL, // STARPU_MIC_SINK_SINK_DT_PORT_NUMBER(node->devid, i), // STARPU_MIC_SINK_SINK_DT_PORT_NUMBER(i, node->devid)); //for (i = node->devid + 1; i < node->nb_mp_sinks; ++i) // _starpu_mic_common_accept(&node->sink_sink_dt_connections[i].mic_endpoint, // STARPU_MIC_SINK_SINK_DT_PORT_NUMBER(node->devid, i)); } /* Launch all workers on the mic */ void _starpu_mic_sink_launch_workers(struct _starpu_mp_node *node) { int i; struct arg_sink_thread * arg; cpu_set_t cpuset; starpu_pthread_attr_t attr; starpu_pthread_t thread; /*for each core init the mutex, the task pointer and launch the thread */ for(i=0; inb_cores; i++) { int ret; //init the set CPU_ZERO(&cpuset); CPU_SET(i,&cpuset); ret = starpu_pthread_attr_init(&attr); STARPU_ASSERT(ret == 0); ret = pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t), &cpuset); STARPU_ASSERT(ret == 0); /*prepare the argument for the thread*/ _STARPU_MALLOC(arg, sizeof(struct arg_sink_thread)); arg->coreid = i; arg->node = node; ret = starpu_pthread_create(&thread, &attr, _starpu_sink_thread, arg); STARPU_ASSERT(ret == 0); ((starpu_pthread_t *)node->thread_table)[i] = thread; } } /* Deinitialize the MIC sink, close all the connections. */ void _starpu_mic_sink_deinit(struct _starpu_mp_node *node) { int i; node->is_running = 0; for(i=0; inb_cores; i++) { sem_post(&node->sem_run_table[i]); starpu_pthread_join(((starpu_pthread_t *)node->thread_table)[i],NULL); } free(node->thread_table); scif_close(node->host_sink_dt_connection.mic_endpoint); scif_close(node->mp_connection.mic_endpoint); //unsigned int i; //for (i = 0; i < node->nb_mp_sinks; ++i) //{ // if (i != (unsigned int)node->devid) // scif_close(node->sink_sink_dt_connections[i].mic_endpoint); //} //free(node->sink_sink_dt_connections); } /* Report an error which occured when using a MIC device * and print this error in a human-readable style */ void _starpu_mic_sink_report_error(const char *func, const char *file, const int line, const int status) { const char *errormsg = strerror(status); printf("SINK: oops in %s (%s:%d)... %d: %s \n", func, file, line, status, errormsg); STARPU_ASSERT(0); } /* Allocate memory on the MIC. * Memory is register for remote direct access. */ void _starpu_mic_sink_allocate(const struct _starpu_mp_node *mp_node, void *arg, int arg_size) { STARPU_ASSERT(arg_size == sizeof(size_t)); void *addr = NULL; size_t size = *(size_t *)(arg); if (posix_memalign(&addr, STARPU_MIC_PAGE_SIZE, size) != 0) _starpu_mp_common_send_command(mp_node, STARPU_ERROR_ALLOCATE, NULL, 0); #ifndef STARPU_DISABLE_ASYNCHRONOUS_MIC_COPY scif_epd_t epd = mp_node->host_sink_dt_connection.mic_endpoint; size_t window_size = STARPU_MIC_GET_PAGE_SIZE_MULTIPLE(size); if (scif_register(epd, addr, window_size, (off_t)addr, SCIF_PROT_READ | SCIF_PROT_WRITE, SCIF_MAP_FIXED) < 0) { free(addr); _starpu_mp_common_send_command(mp_node, STARPU_ERROR_ALLOCATE, NULL, 0); } #endif _starpu_mp_common_send_command(mp_node, STARPU_ANSWER_ALLOCATE, &addr, sizeof(addr)); } /* Unregister and free memory. */ void _starpu_mic_sink_free(const struct _starpu_mp_node *mp_node STARPU_ATTRIBUTE_UNUSED, void *arg, int arg_size) { STARPU_ASSERT(arg_size == sizeof(struct _starpu_mic_free_command)); void *addr = ((struct _starpu_mic_free_command *)arg)->addr; #ifndef STARPU_DISABLE_ASYNCHRONOUS_MIC_COPY scif_epd_t epd = mp_node->host_sink_dt_connection.mic_endpoint; size_t size = ((struct _starpu_mic_free_command *)arg)->size; size_t window_size = STARPU_MIC_GET_PAGE_SIZE_MULTIPLE(size); scif_unregister(epd, (off_t)addr, window_size); #endif free(addr); } /* bind the thread to a core */ #ifdef STARPU_DEVEL #warning Use hwloc, the numbering is *really* odd on the MIC #endif void _starpu_mic_sink_bind_thread(const struct _starpu_mp_node *mp_node STARPU_ATTRIBUTE_UNUSED, int coreid, int * core_table, int nb_core) { cpu_set_t cpuset; int i; //init the set CPU_ZERO(&cpuset); //adding the core to the set for(i=0;ithread_table)[coreid],sizeof(cpu_set_t),&cpuset); } void (*_starpu_mic_sink_lookup (const struct _starpu_mp_node * node STARPU_ATTRIBUTE_UNUSED, char* func_name))(void) { void *dl_handle = dlopen(NULL, RTLD_NOW); return dlsym(dl_handle, func_name); } starpu-1.2.3+dfsg/src/drivers/mic/driver_mic_sink.h000066400000000000000000000034241320135501600223060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DRIVER_MIC_SINK_H__ #define __DRIVER_MIC_SINK_H__ #include #ifdef STARPU_USE_MIC #include #include #include #define STARPU_MIC_SINK_REPORT_ERROR(status) \ _starpu_mic_sink_report_error(__starpu_func__, __FILE__, __LINE__, status) void _starpu_mic_sink_report_error(const char *func, const char *file, const int line, const int status); void _starpu_mic_sink_init(struct _starpu_mp_node *node); void _starpu_mic_sink_launch_workers(struct _starpu_mp_node *node); void _starpu_mic_sink_deinit(struct _starpu_mp_node *node); void _starpu_mic_sink_allocate(const struct _starpu_mp_node *mp_node, void *arg, int arg_size); void _starpu_mic_sink_free(const struct _starpu_mp_node *mp_node STARPU_ATTRIBUTE_UNUSED, void *arg, int arg_size); void _starpu_mic_sink_bind_thread(const struct _starpu_mp_node *mp_node STARPU_ATTRIBUTE_UNUSED, int coreid, int * core_table, int nb_core); void (*_starpu_mic_sink_lookup (const struct _starpu_mp_node * node STARPU_ATTRIBUTE_UNUSED, char* func_name))(void); #endif /* STARPU_USE_MIC */ #endif /* __DRIVER_MIC_SINK_H__ */ starpu-1.2.3+dfsg/src/drivers/mic/driver_mic_source.c000066400000000000000000000417771320135501600226520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include "driver_mic_common.h" #include "driver_mic_source.h" /* Array of structures containing all the informations useful to send * and receive informations with devices */ struct _starpu_mp_node *mic_nodes[STARPU_MAXMICDEVS]; static COIENGINE handles[STARPU_MAXMICDEVS]; /* Structure used by host to store informations about a kernel executable on * a MIC device : its name, and its address on each device. * If a kernel has been initialized, then a lookup has already been achieved and the * device knows how to call it, else the host still needs to do a lookup. */ struct _starpu_mic_kernel { UT_hash_handle hh; char *name; starpu_mic_kernel_t func[STARPU_MAXMICDEVS]; } *kernels; /* Mutex for concurrent access to the table. */ starpu_pthread_mutex_t htbl_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; /* Number of MIC worker initialized. */ unsigned int nb_mic_worker_init = 0; starpu_pthread_mutex_t nb_mic_worker_init_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; /* Returns the ID of the MIC device controlled by the caller. * if the worker doesn't control a MIC device -ENODEV is returned */ //static int _starpu_mic_get_devid(void) //{ // struct _starpu_machine_config *config = _starpu_get_machine_config(); // int workerid = starpu_worker_get_id(); // // if (config->workers[workerid].arch != STARPU_MIC_WORKER) // return -ENODEV; // // return config->workers[workerid].devid; //} struct _starpu_mp_node *_starpu_mic_src_get_actual_thread_mp_node() { struct _starpu_worker *actual_worker = _starpu_get_local_worker_key(); STARPU_ASSERT(actual_worker); int devid = actual_worker->devid; STARPU_ASSERT(devid >= 0 && devid < STARPU_MAXMICDEVS); return mic_nodes[devid]; } const struct _starpu_mp_node *_starpu_mic_src_get_mp_node_from_memory_node(int memory_node) { int devid = _starpu_memory_node_get_devid(memory_node); STARPU_ASSERT_MSG(devid >= 0 && devid < STARPU_MAXMICDEVS, "bogus devid %d for memory node %d\n", devid, memory_node); return mic_nodes[devid]; } static void _starpu_mic_src_free_kernel(void *kernel) { struct _starpu_mic_kernel *k = kernel; free(k->name); free(kernel); } void _starpu_mic_clear_kernels(void) { struct _starpu_mic_kernel *kernel, *tmp; HASH_ITER(hh, kernels, kernel, tmp) { HASH_DEL(kernels, kernel); _starpu_mic_src_free_kernel(kernel); } } int _starpu_mic_src_register_kernel(starpu_mic_func_symbol_t *symbol, const char *func_name) { unsigned int func_name_size = (strlen(func_name) + 1) * sizeof(char); STARPU_PTHREAD_MUTEX_LOCK(&htbl_mutex); struct _starpu_mic_kernel *kernel; HASH_FIND_STR(kernels, func_name, kernel); if (kernel != NULL) { STARPU_PTHREAD_MUTEX_UNLOCK(&htbl_mutex); // Function already in the table. *symbol = kernel; return 0; } kernel = malloc(sizeof(*kernel)); if (kernel == NULL) { STARPU_PTHREAD_MUTEX_UNLOCK(&htbl_mutex); return -ENOMEM; } kernel->name = malloc(func_name_size); if (kernel->name == NULL) { STARPU_PTHREAD_MUTEX_UNLOCK(&htbl_mutex); free(kernel); return -ENOMEM; } memcpy(kernel->name, func_name, func_name_size); HASH_ADD_STR(kernels, name, kernel); unsigned int nb_mic_devices = _starpu_mic_src_get_device_count(); unsigned int i; for (i = 0; i < nb_mic_devices; ++i) kernel->func[i] = NULL; STARPU_PTHREAD_MUTEX_UNLOCK(&htbl_mutex); *symbol = kernel; return 0; } starpu_mic_kernel_t _starpu_mic_src_get_kernel(starpu_mic_func_symbol_t symbol) { int workerid = starpu_worker_get_id(); /* This function has to be called in the codelet only, by the thread * which will handle the task */ if (workerid < 0) return NULL; int devid = starpu_worker_get_devid(workerid); struct _starpu_mic_kernel *kernel = symbol; if (kernel->func[devid] == NULL) { struct _starpu_mp_node *node = mic_nodes[devid]; int ret = _starpu_src_common_lookup(node, (void (**)(void))&kernel->func[devid], kernel->name); if (ret) return NULL; } return kernel->func[devid]; } /* Report an error which occured when using a MIC device * and print this error in a human-readable style. * It hanbles errors occuring when using COI. */ void _starpu_mic_src_report_coi_error(const char *func, const char *file, const int line, const COIRESULT status) { const char *errormsg = COIResultGetName(status); printf("SRC: oops in %s (%s:%d)... %d: %s \n", func, file, line, status, errormsg); STARPU_ASSERT(0); } /* Report an error which occured when using a MIC device * and print this error in a human-readable style. * It hanbles errors occuring when using SCIF. */ void _starpu_mic_src_report_scif_error(const char *func, const char *file, const int line, const int status) { const char *errormsg = strerror(status); printf("SRC: oops in %s (%s:%d)... %d: %s \n", func, file, line, status, errormsg); STARPU_ASSERT(0); } /* Return the number of MIC devices in the system. * If the number of devices is already known, we use the cached value * without calling again COI. */ unsigned _starpu_mic_src_get_device_count(void) { static unsigned short cached = 0; static unsigned nb_devices = 0; /* We don't need to call the COI API again if we already * have the result in cache */ if (!cached) { COIRESULT res; res = COIEngineGetCount(COI_ISA_MIC, &nb_devices); /* If something is wrong with the COI engine, we shouldn't * use MIC devices (if there is any...) */ if (res != COI_SUCCESS) nb_devices = 0; cached = 1; } return nb_devices; } unsigned starpu_mic_device_get_count(void) { // Return the number of configured MIC devices. struct _starpu_machine_config *config = _starpu_get_machine_config (); struct _starpu_machine_topology *topology = &config->topology; return topology->nmicdevices; } starpu_mic_kernel_t _starpu_mic_src_get_kernel_from_codelet(struct starpu_codelet *cl, unsigned nimpl) { starpu_mic_kernel_t kernel = NULL; starpu_mic_func_t func = _starpu_task_get_mic_nth_implementation(cl, nimpl); if (func) { /* We execute the function contained in the codelet, it must return a * pointer to the function to execute on the device, either specified * directly by the user or by a call to starpu_mic_get_func(). */ kernel = func(); } else { /* If user dont define any starpu_mic_fun_t in cl->mic_func we try to use * cpu_func_name. */ char *func_name = _starpu_task_get_cpu_name_nth_implementation(cl, nimpl); if (func_name) { starpu_mic_func_symbol_t symbol; _starpu_mic_src_register_kernel(&symbol, func_name); kernel = _starpu_mic_src_get_kernel(symbol); } } STARPU_ASSERT_MSG(kernel, "when STARPU_MIC is defined in 'where', mic_funcs or cpu_funcs_name has to be defined and the function be non-static"); return kernel; } void(* _starpu_mic_src_get_kernel_from_job(const struct _starpu_mp_node *node STARPU_ATTRIBUTE_UNUSED, struct _starpu_job *j))(void) { starpu_mic_kernel_t kernel = NULL; starpu_mic_func_t func = _starpu_task_get_mic_nth_implementation(j->task->cl, j->nimpl); if (func) { /* We execute the function contained in the codelet, it must return a * pointer to the function to execute on the device, either specified * directly by the user or by a call to starpu_mic_get_func(). */ kernel = func(); } else { /* If user dont define any starpu_mic_fun_t in cl->mic_func we try to use * cpu_func_name. */ char *func_name = _starpu_task_get_cpu_name_nth_implementation(j->task->cl, j->nimpl); if (func_name) { starpu_mic_func_symbol_t symbol; _starpu_mic_src_register_kernel(&symbol, func_name); kernel = _starpu_mic_src_get_kernel(symbol); } } STARPU_ASSERT(kernel); return (void (*)(void))kernel; } /* Initialize the node structure describing the MIC source. */ void _starpu_mic_src_init(struct _starpu_mp_node *node) { extern COIPROCESS _starpu_mic_process[STARPU_MAXMICDEVS]; /* Let's initialize the connection with the peered sink device */ _starpu_mic_common_connect(&node->mp_connection.mic_endpoint, STARPU_TO_MIC_ID(node->peer_id), _starpu_mic_process[node->peer_id], STARPU_MIC_SINK_PORT_NUMBER(node->peer_id), STARPU_MIC_SOURCE_PORT_NUMBER); _starpu_mic_common_connect(&node->host_sink_dt_connection.mic_endpoint, STARPU_TO_MIC_ID(node->peer_id), _starpu_mic_process[node->peer_id], STARPU_MIC_SINK_DT_PORT_NUMBER(node->peer_id), STARPU_MIC_SOURCE_DT_PORT_NUMBER); } /* Deinitialize the MIC sink, close all the connections. */ void _starpu_mic_src_deinit(struct _starpu_mp_node *node) { scif_close(node->host_sink_dt_connection.mic_endpoint); scif_close(node->mp_connection.mic_endpoint); } /* Get infos of the MIC associed to memory_node */ static void _starpu_mic_get_engine_info(COI_ENGINE_INFO *info, int devid) { STARPU_ASSERT(devid >= 0 && devid < STARPU_MAXMICDEVS); if (COIEngineGetInfo(handles[devid], sizeof(*info), info) != COI_SUCCESS) STARPU_MIC_SRC_REPORT_COI_ERROR(errno); } /* TODO: call _starpu_memory_manager_set_global_memory_size instead */ /* Return the size of the memory on the MIC associed to memory_node */ size_t _starpu_mic_get_global_mem_size(int devid) { COI_ENGINE_INFO infos; _starpu_mic_get_engine_info(&infos, devid); return infos.PhysicalMemory; } /* Return the size of the free memory on the MIC associed to memory_node */ size_t _starpu_mic_get_free_mem_size(int devid) { COI_ENGINE_INFO infos; _starpu_mic_get_engine_info(&infos, devid); return infos.PhysicalMemoryFree; } /* Allocate memory on MIC. * Return 0 if OK or 1 if not. */ int _starpu_mic_allocate_memory(void **addr, size_t size, unsigned memory_node) { /* We check we have (1.25 * size) free space in the MIC because * transfert with scif is not possible when the MIC * doesn't have enought free memory. * In this cas we can't tell any things to the host. */ //int devid = _starpu_memory_node_get_devid(memory_node); //if (_starpu_mic_get_free_mem_size(devid) < size * 1.25) // return 1; const struct _starpu_mp_node *mp_node = _starpu_mic_src_get_mp_node_from_memory_node(memory_node); return _starpu_src_common_allocate(mp_node, addr, size); } /* Free memory on MIC. * Mic need size to free memory for use the function scif_unregister. */ void _starpu_mic_free_memory(void *addr, size_t size, unsigned memory_node) { const struct _starpu_mp_node *mp_node = _starpu_mic_src_get_mp_node_from_memory_node(memory_node); struct _starpu_mic_free_command cmd = {addr, size}; return _starpu_mp_common_send_command(mp_node, STARPU_FREE, &cmd, sizeof(cmd)); } /* Transfert SIZE bytes from the address pointed by SRC in the SRC_NODE memory * node to the address pointed by DST in the DST_NODE memory node */ int _starpu_mic_copy_ram_to_mic(void *src, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst, unsigned dst_node, size_t size) { const struct _starpu_mp_node *mp_node = _starpu_mic_src_get_mp_node_from_memory_node(dst_node); return _starpu_src_common_copy_host_to_sink(mp_node, src, dst, size); } /* Transfert SIZE bytes from the address pointed by SRC in the SRC_NODE memory * node to the address pointed by DST in the DST_NODE memory node */ int _starpu_mic_copy_mic_to_ram(void *src, unsigned src_node, void *dst, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, size_t size) { const struct _starpu_mp_node *mp_node = _starpu_mic_src_get_mp_node_from_memory_node(src_node); return _starpu_src_common_copy_sink_to_host(mp_node, src, dst, size); } /* Asynchronous transfers */ int _starpu_mic_copy_ram_to_mic_async(void *src, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst, unsigned dst_node, size_t size) { const struct _starpu_mp_node *mp_node = _starpu_mic_src_get_mp_node_from_memory_node(dst_node); if (scif_vwriteto(mp_node->host_sink_dt_connection.mic_endpoint, src, size, (off_t)dst, 0) < 0) STARPU_MIC_SRC_REPORT_SCIF_ERROR(errno); return 0; } int _starpu_mic_copy_mic_to_ram_async(void *src, unsigned src_node, void *dst, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, size_t size) { const struct _starpu_mp_node *mp_node = _starpu_mic_src_get_mp_node_from_memory_node(src_node); if (scif_vreadfrom(mp_node->host_sink_dt_connection.mic_endpoint, dst, size, (off_t)src, 0) < 0) STARPU_MIC_SRC_REPORT_SCIF_ERROR(errno); return 0; } /* Initialize a _starpu_mic_async_event. */ int _starpu_mic_init_event(struct _starpu_mic_async_event *event, unsigned memory_node) { const struct _starpu_mp_node *mp_node = _starpu_mic_src_get_mp_node_from_memory_node(memory_node); scif_epd_t epd = mp_node->host_sink_dt_connection.mic_endpoint; event->memory_node = memory_node; /* Address of allocation must be multiple of the page size. */ if (posix_memalign((void **)&(event->signal), 0x1000, sizeof(*(event->signal))) != 0) return -ENOMEM; *(event->signal) = 0; /* The size pass to scif_register is 0x1000 because it should be a multiple of the page size. */ if (scif_register(epd, event->signal, 0x1000, (off_t)(event->signal), SCIF_PROT_WRITE, SCIF_MAP_FIXED) < 0) STARPU_MIC_SRC_REPORT_SCIF_ERROR(errno); /* Mark for a futur wait. */ if (scif_fence_mark(epd, SCIF_FENCE_INIT_SELF, &(event->mark)) < 0) STARPU_MIC_SRC_REPORT_SCIF_ERROR(errno); /* Tell to scif to write STARPU_MIC_REQUEST_COMPLETE in event->signal when the transfer is complete. * We use this for test the end of a transfer. */ if (scif_fence_signal(epd, (off_t)event->signal, STARPU_MIC_REQUEST_COMPLETE, 0, 0, SCIF_FENCE_INIT_SELF | SCIF_SIGNAL_LOCAL) < 0) STARPU_MIC_SRC_REPORT_SCIF_ERROR(errno); return 0; } /* Wait the end of the asynchronous request */ void _starpu_mic_wait_request_completion(struct _starpu_mic_async_event *event) { if (event->signal != NULL) { const struct _starpu_mp_node *mp_node = _starpu_mic_src_get_mp_node_from_memory_node(event->memory_node); scif_epd_t epd = mp_node->host_sink_dt_connection.mic_endpoint; if (scif_fence_wait(epd, event->mark) < 0) STARPU_MIC_SRC_REPORT_SCIF_ERROR(errno); if (scif_unregister(epd, (off_t)(event->signal), 0x1000) < 0) STARPU_MIC_SRC_REPORT_SCIF_ERROR(errno); free(event->signal); event->signal = NULL; } } /* Test if a asynchronous request is end. * Return 1 if is end, 0 else. */ int _starpu_mic_request_is_complete(struct _starpu_mic_async_event *event) { if (event->signal != NULL && *(event->signal) != STARPU_MIC_REQUEST_COMPLETE) return 0; const struct _starpu_mp_node *mp_node = _starpu_mic_src_get_mp_node_from_memory_node(event->memory_node); scif_epd_t epd = mp_node->host_sink_dt_connection.mic_endpoint; if (scif_unregister(epd, (off_t)(event->signal), 0x1000) < 0) STARPU_MIC_SRC_REPORT_SCIF_ERROR(errno); free(event->signal); event->signal = NULL; return 1; } void *_starpu_mic_src_worker(void *arg) { struct _starpu_worker_set *worker_set = arg; /* As all workers of a set share common data, we just use the first * one for intializing the following stuffs. */ struct _starpu_worker *baseworker = &worker_set->workers[0]; struct _starpu_machine_config *config = baseworker->config; unsigned baseworkerid = baseworker - config->workers; unsigned devid = baseworker->devid; unsigned i; /* unsigned memnode = baseworker->memory_node; */ _starpu_driver_start(baseworker, _STARPU_FUT_MIC_KEY, 0); #ifdef STARPU_USE_FXT for (i = 1; i < worker_set->nworkers; i++) _starpu_worker_start(&worker_set->workers[i], _STARPU_FUT_MIC_KEY, 0); #endif // Current task for a thread managing a worker set has no sense. _starpu_set_current_task(NULL); for (i = 0; i < config->topology.nmiccores[devid]; i++) { struct _starpu_worker *worker = &config->workers[baseworkerid+i]; snprintf(worker->name, sizeof(worker->name), "MIC %u core %u", devid, i); snprintf(worker->short_name, sizeof(worker->short_name), "MIC %u.%u", devid, i); } { char thread_name[16]; snprintf(thread_name, sizeof(thread_name), "MIC %u", devid); starpu_pthread_setname(thread_name); } for (i = 0; i < worker_set->nworkers; i++) { struct _starpu_worker *worker = &worker_set->workers[i]; _STARPU_TRACE_WORKER_INIT_END(worker->workerid); } /* tell the main thread that this one is ready */ STARPU_PTHREAD_MUTEX_LOCK(&worker_set->mutex); baseworker->status = STATUS_UNKNOWN; worker_set->set_is_initialized = 1; STARPU_PTHREAD_COND_SIGNAL(&worker_set->ready_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&worker_set->mutex); _starpu_src_common_worker(worker_set, baseworkerid, mic_nodes[devid]); return NULL; } starpu-1.2.3+dfsg/src/drivers/mic/driver_mic_source.h000066400000000000000000000067761320135501600226570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DRIVER_MIC_SOURCE_H__ #define __DRIVER_MIC_SOURCE_H__ #include #include #ifdef STARPU_USE_MIC #include #include #include #include /* Array of structures containing all the informations useful to send * and receive informations with devices */ extern struct _starpu_mp_node *mic_nodes[STARPU_MAXMICDEVS]; struct _starpu_mic_async_event *event; #define STARPU_MIC_REQUEST_COMPLETE 42 #define STARPU_MIC_SRC_REPORT_COI_ERROR(status) \ _starpu_mic_src_report_coi_error(__starpu_func__, __FILE__, __LINE__, status) #define STARPU_MIC_SRC_REPORT_SCIF_ERROR(status) \ _starpu_mic_src_report_scif_error(__starpu_func__, __FILE__, __LINE__, status) struct _starpu_mp_node *_starpu_mic_src_get_actual_thread_mp_node(); const struct _starpu_mp_node *_starpu_mic_src_get_mp_node_from_memory_node(int memory_node); void(* _starpu_mic_src_get_kernel_from_job(const struct _starpu_mp_node *node STARPU_ATTRIBUTE_UNUSED, struct _starpu_job *j))(void); int _starpu_mic_src_register_kernel(starpu_mic_func_symbol_t *symbol, const char *func_name); starpu_mic_kernel_t _starpu_mic_src_get_kernel(starpu_mic_func_symbol_t symbol); void _starpu_mic_src_report_coi_error(const char *func, const char *file, int line, const COIRESULT status); void _starpu_mic_src_report_scif_error(const char *func, const char *file, int line, const int status); unsigned _starpu_mic_src_get_device_count(void); starpu_mic_kernel_t _starpu_mic_src_get_kernel_from_codelet(struct starpu_codelet *cl, unsigned nimpl); void _starpu_mic_src_init(struct _starpu_mp_node *node); void _starpu_mic_clear_kernels(void); void _starpu_mic_src_deinit(struct _starpu_mp_node *node); size_t _starpu_mic_get_global_mem_size(int devid); size_t _starpu_mic_get_free_mem_size(int devid); int _starpu_mic_allocate_memory(void **addr, size_t size, unsigned memory_node); void _starpu_mic_free_memory(void *addr, size_t size, unsigned memory_node); int _starpu_mic_copy_ram_to_mic(void *src, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst, unsigned dst_node, size_t size); int _starpu_mic_copy_mic_to_ram(void *src, unsigned src_node, void *dst, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, size_t size); int _starpu_mic_copy_ram_to_mic_async(void *src, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst, unsigned dst_node, size_t size); int _starpu_mic_copy_mic_to_ram_async(void *src, unsigned src_node, void *dst, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, size_t size); int _starpu_mic_init_event(struct _starpu_mic_async_event *event, unsigned memory_node); void _starpu_mic_wait_request_completion(struct _starpu_mic_async_event *event); int _starpu_mic_request_is_complete(struct _starpu_mic_async_event *event); void *_starpu_mic_src_worker(void *arg); #endif /* STARPU_USE_MIC */ #endif /* __DRIVER_MIC_SOURCE_H__ */ starpu-1.2.3+dfsg/src/drivers/mic/driver_mic_utils.c000066400000000000000000000027541320135501600225020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include /* Initiate a lookup on each MIC device to find the adress of the function * named FUNC_NAME, store them in the global array kernels and return * the index in the array through SYMBOL. * If success, returns 0. If the user has registered too many kernels (more * than STARPU_MAXMICDEVS) returns -ENOMEM */ int starpu_mic_register_kernel(starpu_mic_func_symbol_t *symbol, const char *func_name) { return _starpu_mic_src_register_kernel(symbol, func_name); } /* If success, return the pointer to the function defined by SYMBOL on the * device linked to the called * device. */ starpu_mic_kernel_t starpu_mic_get_kernel(starpu_mic_func_symbol_t symbol) { return _starpu_mic_src_get_kernel(symbol); } starpu-1.2.3+dfsg/src/drivers/mp_common/000077500000000000000000000000001320135501600201775ustar00rootroot00000000000000starpu-1.2.3+dfsg/src/drivers/mp_common/mp_common.c000066400000000000000000000240231320135501600223300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include const char *_starpu_mp_common_command_to_string(const int command) { switch(command) { case STARPU_EXIT: return "EXIT"; case STARPU_EXECUTE: return "EXECUTE"; case STARPU_ERROR_EXECUTE: return "ERROR_EXECUTE"; case STARPU_LOOKUP: return "LOOKUP"; case STARPU_ANSWER_LOOKUP: return "ANSWER_LOOKUP"; case STARPU_ERROR_LOOKUP: return "ERROR_LOOKUP"; case STARPU_ALLOCATE: return "ALLOCATE"; case STARPU_ANSWER_ALLOCATE: return "ANSWER_ALLOCATE"; case STARPU_ERROR_ALLOCATE: return "ERROR_ALLOCATE"; case STARPU_FREE: return "FREE"; case STARPU_RECV_FROM_HOST: return "RECV_FROM_HOST"; case STARPU_SEND_TO_HOST: return "SEND_TO_HOST"; case STARPU_RECV_FROM_SINK: return "RECV_FROM_SINK"; case STARPU_SEND_TO_SINK: return "SEND_TO_SINK"; case STARPU_TRANSFER_COMPLETE: return "TRANSFER_COMPLETE"; case STARPU_SINK_NBCORES: return "SINK_NBCORES"; case STARPU_ANSWER_SINK_NBCORES: return "ANSWER_SINK_NBCORES"; case STARPU_EXECUTION_SUBMITTED: return "EXECUTION_SUBMITTED"; case STARPU_EXECUTION_COMPLETED: return "EXECUTION_COMPLETED"; case STARPU_PRE_EXECUTION: return "PRE_EXECUTION"; case STARPU_SYNC_WORKERS: return "SYNC_WORKERS"; default: return ""; } } const char *_starpu_mp_common_node_kind_to_string(const int kind) { switch(kind) { case STARPU_MIC_SINK: return "MIC_SINK"; case STARPU_MIC_SOURCE: return "MIC_SOURCE"; case STARPU_SCC_SINK: return "SCC_SINK"; case STARPU_SCC_SOURCE: return "SCC_SOURCE"; case STARPU_MPI_SINK: return "MPI_SINK"; case STARPU_MPI_SOURCE: return "MPI_SOURCE"; default: return ""; } } /* Allocate and initialize the sink structure, when the function returns * all the pointer of functions are linked to the right ones. */ struct _starpu_mp_node * STARPU_ATTRIBUTE_MALLOC _starpu_mp_common_node_create(enum _starpu_mp_node_kind node_kind, int peer_id) { struct _starpu_mp_node *node; _STARPU_MALLOC(node, sizeof(struct _starpu_mp_node)); node->kind = node_kind; node->peer_id = peer_id; switch(node->kind) { #ifdef STARPU_USE_MIC case STARPU_MIC_SOURCE: { node->nb_mp_sinks = starpu_mic_worker_get_count(); node->devid = peer_id; node->init = _starpu_mic_src_init; node->launch_workers= NULL; node->deinit = _starpu_mic_src_deinit; node->report_error = _starpu_mic_src_report_scif_error; node->mp_recv_is_ready = _starpu_mic_common_recv_is_ready; node->mp_send = _starpu_mic_common_send; node->mp_recv = _starpu_mic_common_recv; node->dt_send = _starpu_mic_common_dt_send; node->dt_recv = _starpu_mic_common_dt_recv; node->get_kernel_from_job =_starpu_mic_src_get_kernel_from_job; node->lookup = NULL; node->bind_thread = NULL; node->execute = NULL; node->allocate = NULL; node->free = NULL; } break; case STARPU_MIC_SINK: { node->devid = atoi(starpu_getenv("_STARPU_MIC_DEVID")); node->nb_mp_sinks = atoi(starpu_getenv("_STARPU_MIC_NB")); node->init = _starpu_mic_sink_init; node->launch_workers = _starpu_mic_sink_launch_workers; node->deinit = _starpu_mic_sink_deinit; node->report_error = _starpu_mic_sink_report_error; node->mp_recv_is_ready = _starpu_mic_common_recv_is_ready; node->mp_send = _starpu_mic_common_send; node->mp_recv = _starpu_mic_common_recv; node->dt_send = _starpu_mic_common_dt_send; node->dt_recv = _starpu_mic_common_dt_recv; node->get_kernel_from_job = NULL; node->lookup = _starpu_mic_sink_lookup; node->bind_thread = _starpu_mic_sink_bind_thread; node->execute = _starpu_sink_common_execute; node->allocate = _starpu_mic_sink_allocate; node->free = _starpu_mic_sink_free; } break; #endif /* STARPU_USE_MIC */ #ifdef STARPU_USE_SCC case STARPU_SCC_SOURCE: { node->init = _starpu_scc_src_init; node->deinit = NULL; node->report_error = _starpu_scc_common_report_rcce_error; node->mp_recv_is_ready = _starpu_scc_common_recv_is_ready; node->mp_send = _starpu_scc_common_send; node->mp_recv = _starpu_scc_common_recv; node->dt_send = _starpu_scc_common_send; node->dt_recv = _starpu_scc_common_recv; node->dt_send_to_device = NULL; node->dt_recv_from_device = NULL; node->get_kernel_from_job =_starpu_scc_src_get_kernel_from_job; node->lookup = NULL; node->bind_thread = NULL; node->execute = NULL; node->allocate = NULL; node->free = NULL; } break; case STARPU_SCC_SINK: { node->init = _starpu_scc_sink_init; node->launch_workers = _starpu_scc_sink_launch_workers; node->deinit = _starpu_scc_sink_deinit; node->report_error = _starpu_scc_common_report_rcce_error; node->mp_recv_is_ready = _starpu_scc_common_recv_is_ready; node->mp_send = _starpu_scc_common_send; node->mp_recv = _starpu_scc_common_recv; node->dt_send = _starpu_scc_common_send; node->dt_recv = _starpu_scc_common_recv; node->dt_send_to_device = _starpu_scc_sink_send_to_device; node->dt_recv_from_device = _starpu_scc_sink_recv_from_device; node->get_kernel_from_job = NULL; node->lookup = _starpu_scc_sink_lookup; node->bind_thread = _starpu_scc_sink_bind_thread; node->execute = _starpu_scc_sink_execute; node->allocate = _starpu_sink_common_allocate; node->free = _starpu_sink_common_free; } break; #endif /* STARPU_USE_SCC */ #ifdef STARPU_USE_MPI case STARPU_MPI_SOURCE: STARPU_ABORT(); break; case STARPU_MPI_SINK: STARPU_ABORT(); break; #endif /* STARPU_USE_MPI */ default: STARPU_ASSERT(0); } /* Let's allocate the buffer, we want it to be big enough to contain * a command, an argument and the argument size */ _STARPU_MALLOC(node->buffer, BUFFER_SIZE); if (node->init) node->init(node); mp_message_list_init(&node->message_queue); STARPU_PTHREAD_MUTEX_INIT(&node->message_queue_mutex,NULL); /* If the node is a sink then we must initialize some field */ if(node->kind == STARPU_MIC_SINK || node->kind == STARPU_SCC_SINK) { int i; node->is_running = 1; _STARPU_MALLOC(node->run_table, sizeof(struct mp_task *)*node->nb_cores); _STARPU_MALLOC(node->sem_run_table, sizeof(sem_t)*node->nb_cores); for(i=0; inb_cores; i++) { node->run_table[i] = NULL; sem_init(&node->sem_run_table[i],0,0); } mp_barrier_list_init(&node->barrier_list); STARPU_PTHREAD_MUTEX_INIT(&node->barrier_mutex,NULL); STARPU_PTHREAD_BARRIER_INIT(&node->init_completed_barrier, NULL, node->nb_cores+1); node->launch_workers(node); } return node; } /* Deinitialize the sink structure and release the structure */ void _starpu_mp_common_node_destroy(struct _starpu_mp_node *node) { if (node->deinit) node->deinit(node); STARPU_PTHREAD_MUTEX_DESTROY(&node->message_queue_mutex); /* If the node is a sink then we must destroy some field */ if(node->kind == STARPU_MIC_SINK || node->kind == STARPU_SCC_SINK) { int i; for(i=0; inb_cores; i++) { sem_destroy(&node->sem_run_table[i]); } free(node->run_table); free(node->sem_run_table); STARPU_PTHREAD_MUTEX_DESTROY(&node->barrier_mutex); STARPU_PTHREAD_BARRIER_DESTROY(&node->init_completed_barrier); } free(node->buffer); free(node); } /* Send COMMAND to RECIPIENT, along with ARG if ARG_SIZE is non-zero */ void _starpu_mp_common_send_command(const struct _starpu_mp_node *node, const enum _starpu_mp_command command, void *arg, int arg_size) { STARPU_ASSERT_MSG(arg_size <= BUFFER_SIZE, "Too much data (%d) for the static MIC buffer (%d), increase BUFFER_SIZE perhaps?", arg_size, BUFFER_SIZE); /* MIC and MPI sizes are given through a int */ int command_size = sizeof(enum _starpu_mp_command); int arg_size_size = sizeof(int); /* Let's copy the data into the command line buffer */ memcpy(node->buffer, &command, command_size); memcpy((void*) ((uintptr_t)node->buffer + command_size), &arg_size, arg_size_size); node->mp_send(node, node->buffer, command_size + arg_size_size); if (arg_size) node->mp_send(node, arg, arg_size); } /* Return the command received from SENDER. In case SENDER sent an argument * beside the command, an address to a copy of this argument is returns in arg. * There is no need to free this address as it's not allocated at this time. * However, the data pointed by arg shouldn't be relied on after a new call to * STARPU_MP_COMMON_RECV_COMMAND as it might corrupt it. */ enum _starpu_mp_command _starpu_mp_common_recv_command(const struct _starpu_mp_node *node, void **arg, int *arg_size) { enum _starpu_mp_command command; /* MIC and MPI sizes are given through a int */ int command_size = sizeof(enum _starpu_mp_command); int arg_size_size = sizeof(int); node->mp_recv(node, node->buffer, command_size + arg_size_size); command = *((enum _starpu_mp_command *) node->buffer); *arg_size = *((int *) ((uintptr_t)node->buffer + command_size)); /* If there is no argument (ie. arg_size == 0), * let's return the command right now */ if (!(*arg_size)) { *arg = NULL; return command; } STARPU_ASSERT(*arg_size <= BUFFER_SIZE); node->mp_recv(node, node->buffer, *arg_size); *arg = node->buffer; return command; } starpu-1.2.3+dfsg/src/drivers/mp_common/mp_common.h000066400000000000000000000145571320135501600223500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __MP_COMMON_H__ #define __MP_COMMON_H__ #include #include #include #include #include #include #include #include #ifdef STARPU_USE_MP #ifdef STARPU_USE_MIC #include #endif /* STARPU_USE_MIC */ #define BUFFER_SIZE 65536 #define STARPU_MP_SRC_NODE 0 #define STARPU_MP_SINK_NODE(a) ((a) + 1) #define STARPU_MP_COMMON_REPORT_ERROR(node, status) \ (node)->report_error(__starpu_func__, __FILE__, __LINE__, (status)) enum _starpu_mp_command { STARPU_EXIT, STARPU_EXECUTE, STARPU_ERROR_EXECUTE, STARPU_LOOKUP, STARPU_ANSWER_LOOKUP, STARPU_ERROR_LOOKUP, STARPU_ALLOCATE, STARPU_ANSWER_ALLOCATE, STARPU_ERROR_ALLOCATE, STARPU_FREE, STARPU_RECV_FROM_HOST, STARPU_SEND_TO_HOST, STARPU_RECV_FROM_SINK, STARPU_SEND_TO_SINK, STARPU_TRANSFER_COMPLETE, STARPU_SINK_NBCORES, STARPU_ANSWER_SINK_NBCORES, STARPU_EXECUTION_SUBMITTED, STARPU_EXECUTION_COMPLETED, STARPU_PRE_EXECUTION, STARPU_SYNC_WORKERS, }; const char *_starpu_mp_common_command_to_string(const int command); enum _starpu_mp_node_kind { STARPU_MIC_SINK, STARPU_MIC_SOURCE, STARPU_SCC_SINK, STARPU_SCC_SOURCE, STARPU_MPI_SINK, STARPU_MPI_SOURCE, STARPU_INVALID_KIND }; const char *_starpu_mp_common_node_kind_to_string(const int kind); union _starpu_mp_connection { #ifdef STARPU_USE_MIC scif_epd_t mic_endpoint; #endif #ifdef STARPU_USE_SCC int scc_nodeid; #endif int mpi_nodeid; }; struct _starpu_mp_transfer_command { size_t size; void *addr; }; struct _starpu_mp_transfer_command_to_device { int devid; size_t size; void *addr; }; LIST_TYPE(mp_barrier, int id; starpu_pthread_barrier_t before_work_barrier; starpu_pthread_barrier_t after_work_barrier; ); LIST_TYPE(mp_message, enum _starpu_mp_command type; char *buffer; int size; ); struct mp_task { void (*kernel)(void **, void *); void * interfaces[STARPU_NMAXBUFS]; unsigned nb_interfaces; void *cl_arg; unsigned coreid; enum starpu_codelet_type type; int is_parallel_task; int combined_workerid; struct mp_barrier* mp_barrier; }; /* Message-passing working node, whether source * or sink */ struct _starpu_mp_node { enum _starpu_mp_node_kind kind; int baseworkerid; /*the number of core on the device * Must be initialized during init function*/ int nb_cores; /*Is starpu running*/ int is_running; /* Buffer used for scif data transfers, allocated * during node initialization. * Size : BUFFER_SIZE */ void *buffer; /* For sink : -1. * For host : index of the sink = devid. */ int peer_id; /* Only MIC use this for now !! * This is the devid both for the sink and the host. */ int devid; /* Only MIC use this for now !! * Is the number ok MIC on the system. */ unsigned int nb_mp_sinks; /* Connection used for command passing between the host thread and the * sink it controls */ union _starpu_mp_connection mp_connection; /* Only MIC use this for now !! * Connection used for data transfers between the host and his sink. */ union _starpu_mp_connection host_sink_dt_connection; /* Only MIC use this for now !! * Only sink use this for now !! * Connection used for data transfer between devices. * A sink opens a connection with each other sink, * thus each sink can directly send data to each other. * For sink : * - sink_sink_dt_connections[i] is the connection to the sink number i. * - sink_sink_dt_connections[j] is not initialized for the sink number j. */ union _starpu_mp_connection *sink_sink_dt_connections; /* */ starpu_pthread_barrier_t init_completed_barrier; /* table to store pointer of the thread workers*/ void* thread_table; /*list where threads add messages to send to the source node */ struct mp_message_list message_queue; starpu_pthread_mutex_t message_queue_mutex; /*list of barrier for combined worker*/ struct mp_barrier_list barrier_list; starpu_pthread_mutex_t barrier_mutex; /*table where worker comme pick task*/ struct mp_task ** run_table; sem_t * sem_run_table; /* Node general functions */ void (*init)(struct _starpu_mp_node *node); void (*launch_workers)(struct _starpu_mp_node *node); void (*deinit)(struct _starpu_mp_node *node); void (*report_error)(const char *, const char *, const int, const int); /* Message passing */ int (*mp_recv_is_ready)(const struct _starpu_mp_node *); void (*mp_send)(const struct _starpu_mp_node *, void *, int); void (*mp_recv)(const struct _starpu_mp_node *, void *, int); /* Data transfers */ void (*dt_send)(const struct _starpu_mp_node *, void *, int); void (*dt_recv)(const struct _starpu_mp_node *, void *, int); void (*dt_send_to_device)(const struct _starpu_mp_node *, int, void *, int); void (*dt_recv_from_device)(const struct _starpu_mp_node *, int, void *, int); void (*(*get_kernel_from_job)(const struct _starpu_mp_node *,struct _starpu_job *))(void); void (*(*lookup)(const struct _starpu_mp_node *, char* ))(void); void (*bind_thread)(const struct _starpu_mp_node *, int,int *,int); void (*execute)(struct _starpu_mp_node *, void *, int); void (*allocate)(const struct _starpu_mp_node *, void *, int); void (*free)(const struct _starpu_mp_node *, void *, int); }; struct _starpu_mp_node * _starpu_mp_common_node_create(enum _starpu_mp_node_kind node_kind, int peer_devid) STARPU_ATTRIBUTE_MALLOC; void _starpu_mp_common_node_destroy(struct _starpu_mp_node *node); void _starpu_mp_common_send_command(const struct _starpu_mp_node *node, const enum _starpu_mp_command command, void *arg, int arg_size); enum _starpu_mp_command _starpu_mp_common_recv_command(const struct _starpu_mp_node *node, void **arg, int *arg_size); #endif /* STARPU_USE_MP */ #endif /* __MP_COMMON_H__ */ starpu-1.2.3+dfsg/src/drivers/mp_common/sink_common.c000066400000000000000000000455501320135501600226700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #ifdef STARPU_USE_MIC #include #endif #include "sink_common.h" /* Return the sink kind of the running process, based on the value of the * STARPU_SINK environment variable. * If there is no valid value retrieved, return STARPU_INVALID_KIND */ static enum _starpu_mp_node_kind _starpu_sink_common_get_kind(void) { /* Environment varible STARPU_SINK must be defined when running on sink * side : let's use it to get the kind of node we're running on */ char *node_kind = starpu_getenv("STARPU_SINK"); STARPU_ASSERT(node_kind); if (!strcmp(node_kind, "STARPU_MIC")) return STARPU_MIC_SINK; else if (!strcmp(node_kind, "STARPU_SCC")) return STARPU_SCC_SINK; else if (!strcmp(node_kind, "STARPU_MPI")) return STARPU_MPI_SINK; else return STARPU_INVALID_KIND; } /* Send to host the number of cores of the sink device */ static void _starpu_sink_common_get_nb_cores (struct _starpu_mp_node *node) { // Process packet received from `_starpu_src_common_sink_cores'. _starpu_mp_common_send_command (node, STARPU_ANSWER_SINK_NBCORES, &node->nb_cores, sizeof (int)); } /* Send to host the address of the function given in parameter */ static void _starpu_sink_common_lookup(const struct _starpu_mp_node *node, char *func_name) { void (*func)(void); func = node->lookup(node,func_name); //_STARPU_DEBUG("Looked up %s, got %p\n", func_name, func); /* If we couldn't find the function, let's send an error to the host. * The user probably made a mistake in the name */ if (func) _starpu_mp_common_send_command(node, STARPU_ANSWER_LOOKUP, &func, sizeof(func)); else _starpu_mp_common_send_command(node, STARPU_ERROR_LOOKUP, NULL, 0); } /* Allocate a memory space and send the address of this space to the host */ void _starpu_sink_common_allocate(const struct _starpu_mp_node *mp_node, void *arg, int arg_size) { STARPU_ASSERT(arg_size == sizeof(size_t)); void *addr = malloc(*(size_t *)(arg)); /* If the allocation fail, let's send an error to the host. */ if (addr) _starpu_mp_common_send_command(mp_node, STARPU_ANSWER_ALLOCATE, &addr, sizeof(addr)); else _starpu_mp_common_send_command(mp_node, STARPU_ERROR_ALLOCATE, NULL, 0); } void _starpu_sink_common_free(const struct _starpu_mp_node *mp_node STARPU_ATTRIBUTE_UNUSED, void *arg, int arg_size) { STARPU_ASSERT(arg_size == sizeof(void *)); free(*(void **)(arg)); } static void _starpu_sink_common_copy_from_host(const struct _starpu_mp_node *mp_node, void *arg, int arg_size) { STARPU_ASSERT(arg_size == sizeof(struct _starpu_mp_transfer_command)); struct _starpu_mp_transfer_command *cmd = (struct _starpu_mp_transfer_command *)arg; mp_node->dt_recv(mp_node, cmd->addr, cmd->size); } static void _starpu_sink_common_copy_to_host(const struct _starpu_mp_node *mp_node, void *arg, int arg_size) { STARPU_ASSERT(arg_size == sizeof(struct _starpu_mp_transfer_command)); struct _starpu_mp_transfer_command *cmd = (struct _starpu_mp_transfer_command *)arg; mp_node->dt_send(mp_node, cmd->addr, cmd->size); } static void _starpu_sink_common_copy_from_sink(const struct _starpu_mp_node *mp_node, void *arg, int arg_size) { STARPU_ASSERT(arg_size == sizeof(struct _starpu_mp_transfer_command_to_device)); struct _starpu_mp_transfer_command_to_device *cmd = (struct _starpu_mp_transfer_command_to_device *)arg; mp_node->dt_recv_from_device(mp_node, cmd->devid, cmd->addr, cmd->size); _starpu_mp_common_send_command(mp_node, STARPU_TRANSFER_COMPLETE, NULL, 0); } static void _starpu_sink_common_copy_to_sink(const struct _starpu_mp_node *mp_node, void *arg, int arg_size) { STARPU_ASSERT(arg_size == sizeof(struct _starpu_mp_transfer_command_to_device)); struct _starpu_mp_transfer_command_to_device *cmd = (struct _starpu_mp_transfer_command_to_device *)arg; mp_node->dt_send_to_device(mp_node, cmd->devid, cmd->addr, cmd->size); } /* Receive workers and combined workers and store them into the struct config */ static void _starpu_sink_common_recv_workers(struct _starpu_mp_node * node, void *arg, int arg_size) { /* Retrieve information from the message */ STARPU_ASSERT(arg_size == (sizeof(int)*5)); uintptr_t arg_ptr = (uintptr_t) arg; int i; int nworkers = *(int *)arg_ptr; arg_ptr += sizeof(nworkers); int worker_size = *(int *)arg_ptr; arg_ptr += sizeof(worker_size); int combined_worker_size = *(int *)arg_ptr; arg_ptr += sizeof(combined_worker_size); int baseworkerid = *(int *)arg_ptr; arg_ptr += sizeof(baseworkerid); struct _starpu_machine_config *config = _starpu_get_machine_config(); config->topology.nworkers = *(int *)arg_ptr; /* Retrieve workers */ struct _starpu_worker * workers = &config->workers[baseworkerid]; node->dt_recv(node,workers,worker_size); /* Update workers to have coherent field */ for(i=0; icombined_workers; node->dt_recv(node, combined_workers, combined_worker_size); node->baseworkerid = baseworkerid; STARPU_PTHREAD_BARRIER_WAIT(&node->init_completed_barrier); } /* Function looping on the sink, waiting for tasks to execute. * If the caller is the host, don't do anything. */ void _starpu_sink_common_worker(void) { struct _starpu_mp_node *node = NULL; enum _starpu_mp_command command = STARPU_EXIT; int arg_size = 0; void *arg = NULL; int exit_starpu = 0; enum _starpu_mp_node_kind node_kind = _starpu_sink_common_get_kind(); if (node_kind == STARPU_INVALID_KIND) _STARPU_ERROR("No valid sink kind retrieved, use the" "STARPU_SINK environment variable to specify" "this\n"); /* Create and initialize the node */ node = _starpu_mp_common_node_create(node_kind, -1); starpu_pthread_key_t worker_key; STARPU_PTHREAD_KEY_CREATE(&worker_key, NULL); while (!exit_starpu) { /* If we have received a message */ if(node->mp_recv_is_ready(node)) { command = _starpu_mp_common_recv_command(node, &arg, &arg_size); switch(command) { case STARPU_EXIT: exit_starpu = 1; break; case STARPU_EXECUTE: node->execute(node, arg, arg_size); break; case STARPU_SINK_NBCORES: _starpu_sink_common_get_nb_cores(node); break; case STARPU_LOOKUP: _starpu_sink_common_lookup(node, (char *) arg); break; case STARPU_ALLOCATE: node->allocate(node, arg, arg_size); break; case STARPU_FREE: node->free(node, arg, arg_size); break; case STARPU_RECV_FROM_HOST: _starpu_sink_common_copy_from_host(node, arg, arg_size); break; case STARPU_SEND_TO_HOST: _starpu_sink_common_copy_to_host(node, arg, arg_size); break; case STARPU_RECV_FROM_SINK: _starpu_sink_common_copy_from_sink(node, arg, arg_size); break; case STARPU_SEND_TO_SINK: _starpu_sink_common_copy_to_sink(node, arg, arg_size); break; case STARPU_SYNC_WORKERS: _starpu_sink_common_recv_workers(node, arg, arg_size); break; default: printf("Oops, command %x unrecognized\n", command); } } STARPU_PTHREAD_MUTEX_LOCK(&node->message_queue_mutex); /* If the list is not empty */ if(!mp_message_list_empty(&node->message_queue)) { /* We pop a message and send it to the host */ struct mp_message * message = mp_message_list_pop_back(&node->message_queue); STARPU_PTHREAD_MUTEX_UNLOCK(&node->message_queue_mutex); //_STARPU_DEBUG("telling host that we have finished the task %p sur %d.\n", task->kernel, task->coreid); _starpu_mp_common_send_command(node, message->type, message->buffer, message->size); free(message->buffer); mp_message_delete(message); } else { STARPU_PTHREAD_MUTEX_UNLOCK(&node->message_queue_mutex); } } STARPU_PTHREAD_KEY_DELETE(worker_key); /* Deinitialize the node and release it */ _starpu_mp_common_node_destroy(node); exit(0); } /* Search for the mp_barrier correspondind to the specified combined worker * and create it if it doesn't exist */ static struct mp_barrier * _starpu_sink_common_get_barrier(struct _starpu_mp_node * node, int cb_workerid, int cb_workersize) { struct mp_barrier * b = NULL; STARPU_PTHREAD_MUTEX_LOCK(&node->barrier_mutex); /* Search if the barrier already exist */ for(b = mp_barrier_list_begin(&node->barrier_list); b != mp_barrier_list_end(&node->barrier_list) && b->id != cb_workerid; b = mp_barrier_list_next(b)); /* If we found the barrier */ if(b != NULL) { STARPU_PTHREAD_MUTEX_UNLOCK(&node->barrier_mutex); return b; } else { /* Else we create, initialize and add it to the list*/ b = mp_barrier_new(); b->id = cb_workerid; STARPU_PTHREAD_BARRIER_INIT(&b->before_work_barrier,NULL,cb_workersize); STARPU_PTHREAD_BARRIER_INIT(&b->after_work_barrier,NULL,cb_workersize); mp_barrier_list_push_back(&node->barrier_list,b); STARPU_PTHREAD_MUTEX_UNLOCK(&node->barrier_mutex); return b; } } /* Erase for the mp_barrier correspondind to the specified combined worker */ static void _starpu_sink_common_erase_barrier(struct _starpu_mp_node * node, struct mp_barrier *barrier) { STARPU_PTHREAD_MUTEX_LOCK(&node->barrier_mutex); mp_barrier_list_erase(&node->barrier_list,barrier); STARPU_PTHREAD_MUTEX_UNLOCK(&node->barrier_mutex); } /* Append the message given in parameter to the message list */ static void _starpu_sink_common_append_message(struct _starpu_mp_node *node, struct mp_message * message) { STARPU_PTHREAD_MUTEX_LOCK(&node->message_queue_mutex); mp_message_list_push_front(&node->message_queue,message); STARPU_PTHREAD_MUTEX_UNLOCK(&node->message_queue_mutex); } /* Append to the message list a "STARPU_PRE_EXECUTION" message */ static void _starpu_sink_common_pre_execution_message(struct _starpu_mp_node *node, struct mp_task *task) { /* Init message to tell the sink that the execution has begun */ struct mp_message * message = mp_message_new(); message->type = STARPU_PRE_EXECUTION; _STARPU_MALLOC(message->buffer, sizeof(int)); *(int *) message->buffer = task->combined_workerid; message->size = sizeof(int); /* Append the message to the queue */ _starpu_sink_common_append_message(node, message); } /* Append to the message list a "STARPU_EXECUTION_COMPLETED" message */ static void _starpu_sink_common_execution_completed_message(struct _starpu_mp_node *node, struct mp_task *task) { /* Init message to tell the sink that the execution is completed */ struct mp_message * message = mp_message_new(); message->type = STARPU_EXECUTION_COMPLETED; _STARPU_MALLOC(message->buffer, sizeof(int)); *(int*) message->buffer = task->coreid; message->size = sizeof(int); /* Append the message to the queue */ _starpu_sink_common_append_message(node, message); } /* Bind the thread which is running on the specified core to the combined worker */ static void _starpu_sink_common_bind_to_combined_worker(struct _starpu_mp_node *node, int coreid, struct _starpu_combined_worker * combined_worker) { int i; int * bind_set; _STARPU_MALLOC(bind_set, sizeof(int)*combined_worker->worker_size); for(i=0;iworker_size;i++) bind_set[i] = combined_worker->combined_workerid[i] - node->baseworkerid; node->bind_thread(node, coreid, bind_set, combined_worker->worker_size); } /* Get the current rank of the worker in the combined worker */ static int _starpu_sink_common_get_current_rank(int workerid, struct _starpu_combined_worker * combined_worker) { int i; for(i=0; iworker_size; i++) if(workerid == combined_worker->combined_workerid[i]) return i; STARPU_ASSERT(0); } /* Execute the task */ static void _starpu_sink_common_execute_kernel(struct _starpu_mp_node *node, int coreid, struct _starpu_worker * worker) { struct _starpu_combined_worker * combined_worker = NULL; struct mp_task* task = node->run_table[coreid]; /* If it's a parallel task */ if(task->is_parallel_task) { combined_worker = _starpu_get_combined_worker_struct(task->combined_workerid); worker->current_rank = _starpu_sink_common_get_current_rank(worker->workerid, combined_worker); worker->combined_workerid = task->combined_workerid; worker->worker_size = combined_worker->worker_size; /* Synchronize with others threads of the combined worker*/ STARPU_PTHREAD_BARRIER_WAIT(&task->mp_barrier->before_work_barrier); /* The first thread of the combined worker */ if(worker->current_rank == 0) { /* tell the sink that the execution has begun */ _starpu_sink_common_pre_execution_message(node,task); /* If the mode is FORKJOIN, * the first thread binds himself * on all core of the combined worker*/ if(task->type == STARPU_FORKJOIN) { _starpu_sink_common_bind_to_combined_worker(node, coreid, combined_worker); } } } else { worker->current_rank = 0; worker->combined_workerid = 0; worker->worker_size = 1; } if(task->type != STARPU_FORKJOIN || worker->current_rank == 0) { if (_starpu_get_disable_kernels() <= 0) { /* execute the task */ task->kernel(task->interfaces,task->cl_arg); } } /* If it's a parallel task */ if(task->is_parallel_task) { /* Synchronize with others threads of the combined worker*/ STARPU_PTHREAD_BARRIER_WAIT(&task->mp_barrier->after_work_barrier); /* The fisrt thread of the combined */ if(worker->current_rank == 0) { /* Erase the barrier from the list */ _starpu_sink_common_erase_barrier(node,task->mp_barrier); /* If the mode is FORKJOIN, * the first thread rebinds himself on his own core */ if(task->type == STARPU_FORKJOIN) node->bind_thread(node, coreid, &coreid, 1); } } node->run_table[coreid] = NULL; /* tell the sink that the execution is completed */ _starpu_sink_common_execution_completed_message(node,task); /*free the task*/ unsigned i; for (i = 0; i < task->nb_interfaces; i++) free(task->interfaces[i]); if (task->cl_arg != NULL) free(task->cl_arg); free(task); } /* The main function executed by the thread * thread_arg is a structure containing the information needed by the thread */ void* _starpu_sink_thread(void * thread_arg) { /* Retrieve the information from the structure */ struct _starpu_mp_node *node = ((struct arg_sink_thread *)thread_arg)->node; int coreid =((struct arg_sink_thread *)thread_arg)->coreid; /* free the structure */ free(thread_arg); STARPU_PTHREAD_BARRIER_WAIT(&node->init_completed_barrier); struct _starpu_worker *worker = &_starpu_get_machine_config()->workers[node->baseworkerid + coreid]; node->bind_thread(node, coreid, &coreid, 1); _starpu_set_local_worker_key(worker); while(node->is_running) { /*Wait there is a task available */ sem_wait(&node->sem_run_table[coreid]); if(node->run_table[coreid] != NULL) _starpu_sink_common_execute_kernel(node,coreid,worker); } starpu_pthread_exit(NULL); } /* Add the task to the specific thread and wake him up */ static void _starpu_sink_common_execute_thread(struct _starpu_mp_node *node, struct mp_task *task) { /* Add the task to the specific thread */ node->run_table[task->coreid] = task; /* Unlock the mutex to wake up the thread which will execute the task */ sem_post(&node->sem_run_table[task->coreid]); } /* Receive paquet from _starpu_src_common_execute_kernel in the form below : * [Function pointer on sink, number of interfaces, interfaces * (union _starpu_interface), cl_arg] * Then call the function given, passing as argument an array containing the * addresses of the received interfaces */ void _starpu_sink_common_execute(struct _starpu_mp_node *node, void *arg, int arg_size) { unsigned i; uintptr_t arg_ptr = (uintptr_t) arg; struct mp_task *task; _STARPU_MALLOC(task, sizeof(struct mp_task)); task->kernel = *(void(**)(void **, void *)) arg_ptr; arg_ptr += sizeof(task->kernel); task->type = *(enum starpu_codelet_type *) arg_ptr; arg_ptr += sizeof(task->type); task->is_parallel_task = *(int *) arg_ptr; arg_ptr += sizeof(task->is_parallel_task); if(task->is_parallel_task) { task->combined_workerid= *(int *) arg_ptr; arg_ptr += sizeof(task->combined_workerid); task->mp_barrier = _starpu_sink_common_get_barrier(node,task->combined_workerid,_starpu_get_combined_worker_struct(task->combined_workerid)->worker_size); } task->coreid = *(unsigned *) arg_ptr; arg_ptr += sizeof(task->coreid); task->nb_interfaces = *(unsigned *) arg_ptr; arg_ptr += sizeof(task->nb_interfaces); /* The function needs an array pointing to each interface it needs * during execution. As in sink-side there is no mean to know which * kind of interface to expect, the array is composed of unions of * interfaces, thus we expect the same size anyway */ for (i = 0; i < task->nb_interfaces; i++) { union _starpu_interface * interface; _STARPU_MALLOC(interface, sizeof(union _starpu_interface)); memcpy(interface, (void*) arg_ptr, sizeof(union _starpu_interface)); task->interfaces[i] = interface; arg_ptr += sizeof(union _starpu_interface); } /* Was cl_arg sent ? */ if (arg_size > arg_ptr - (uintptr_t) arg) { /* Copy cl_arg to prevent overwriting by an other task */ unsigned cl_arg_size = arg_size - (arg_ptr - (uintptr_t) arg); _STARPU_MALLOC(task->cl_arg, cl_arg_size); memcpy(task->cl_arg, (void *) arg_ptr, cl_arg_size); } else task->cl_arg = NULL; //_STARPU_DEBUG("telling host that we have submitted the task %p.\n", task->kernel); _starpu_mp_common_send_command(node, STARPU_EXECUTION_SUBMITTED, NULL, 0); //_STARPU_DEBUG("executing the task %p\n", task->kernel); _starpu_sink_common_execute_thread(node, task); } starpu-1.2.3+dfsg/src/drivers/mp_common/sink_common.h000066400000000000000000000027131320135501600226670ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __SINK_COMMON_H__ #define __SINK_COMMON_H__ #include #ifdef STARPU_USE_MP #include /* Represent the topology of sink devices, contains useful informations about * their capabilities */ // XXX: unused. struct _starpu_sink_topology { unsigned nb_cpus; }; struct arg_sink_thread { struct _starpu_mp_node *node; int coreid; }; void _starpu_sink_common_worker(void); void _starpu_sink_common_execute(struct _starpu_mp_node *node, void *arg, int arg_size); void _starpu_sink_common_allocate(const struct _starpu_mp_node *mp_node, void *arg, int arg_size); void _starpu_sink_common_free(const struct _starpu_mp_node *mp_node STARPU_ATTRIBUTE_UNUSED, void *arg, int arg_size); void* _starpu_sink_thread(void * thread_arg); #endif /* STARPU_USE_MP */ #endif /* __SINK_COMMON_H__ */ starpu-1.2.3+dfsg/src/drivers/mp_common/source_common.c000066400000000000000000000534421320135501600232230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include static unsigned mp_node_memory_node(struct _starpu_mp_node *node) { return starpu_worker_get_memory_node(node->baseworkerid); } /* Finalize the execution of a task by a worker*/ static int _starpu_src_common_finalize_job (struct _starpu_job *j, struct _starpu_worker *worker) { int profiling = starpu_profiling_status_get(); _starpu_driver_end_job(worker, j, &worker->perf_arch, 0, profiling); int count = worker->current_rank; /* If it's a combined worker, we check if it's the last one of his combined */ if(j->task_size > 1) { struct _starpu_combined_worker * cb_worker = _starpu_get_combined_worker_struct(worker->combined_workerid); (void) STARPU_ATOMIC_ADD(&j->after_work_busy_barrier, -1); STARPU_PTHREAD_MUTEX_LOCK(&cb_worker->count_mutex); count = cb_worker->count--; if(count == 0) cb_worker->count = cb_worker->worker_size - 1; STARPU_PTHREAD_MUTEX_UNLOCK(&cb_worker->count_mutex); } /* Finalize the execution */ if(count == 0) { _starpu_driver_update_job_feedback(j, worker, &worker->perf_arch, profiling); _starpu_push_task_output (j); _starpu_handle_job_termination(j); } return 0; } /* Complete the execution of the job */ static int _starpu_src_common_process_completed_job(struct _starpu_worker_set *workerset, void * arg, int arg_size) { int coreid; STARPU_ASSERT(sizeof(coreid) == arg_size); coreid = *(int *) arg; struct _starpu_worker *worker = &workerset->workers[coreid]; struct _starpu_job *j = _starpu_get_job_associated_to_task(worker->current_task); struct _starpu_worker * old_worker = _starpu_get_local_worker_key(); _starpu_set_local_worker_key(worker); _starpu_src_common_finalize_job (j, worker); _starpu_set_local_worker_key(old_worker); worker->current_task = NULL; return 0; } /* Tell the scheduler when the execution has begun */ static void _starpu_src_common_pre_exec(void * arg, int arg_size) { int cb_workerid, i; STARPU_ASSERT(sizeof(cb_workerid) == arg_size); cb_workerid = *(int *) arg; struct _starpu_combined_worker *combined_worker = _starpu_get_combined_worker_struct(cb_workerid); for(i=0; i < combined_worker->worker_size; i++) { struct _starpu_worker * worker = _starpu_get_worker_struct(combined_worker->combined_workerid[i]); _starpu_set_local_worker_key(worker); _starpu_sched_pre_exec_hook(worker->current_task); } } /* recv a message and handle asynchronous message * return 0 if the message has not been handle (it's certainly mean that it's a synchronous message) * return 1 if the message has been handle */ static int _starpu_src_common_handle_async(const struct _starpu_mp_node *node STARPU_ATTRIBUTE_UNUSED, void * arg, int arg_size, enum _starpu_mp_command answer) { struct _starpu_worker_set * worker_set=NULL; switch(answer) { case STARPU_EXECUTION_COMPLETED: worker_set = _starpu_get_worker_struct(starpu_worker_get_id())->set; _starpu_src_common_process_completed_job(worker_set, arg, arg_size); break; case STARPU_PRE_EXECUTION: _starpu_src_common_pre_exec(arg,arg_size); break; default: return 0; break; } return 1; } /* Handle all message which have been stored in the message_queue */ static void _starpu_src_common_handle_stored_async(struct _starpu_mp_node *node) { int stopped_progress = 0; STARPU_PTHREAD_MUTEX_LOCK(&node->message_queue_mutex); /* while the list is not empty */ while(!mp_message_list_empty(&node->message_queue)) { /* We pop a message and handle it */ struct mp_message * message = mp_message_list_pop_back(&node->message_queue); stopped_progress = 1; _STARPU_TRACE_END_PROGRESS(mp_node_memory_node(node)); _starpu_src_common_handle_async(node, message->buffer, message->size, message->type); free(message->buffer); mp_message_delete(message); } STARPU_PTHREAD_MUTEX_UNLOCK(&node->message_queue_mutex); if (stopped_progress) _STARPU_TRACE_START_PROGRESS(mp_node_memory_node(node)); } /* Store a message if is asynchronous * return 1 if the message has been stored * return 0 if the message is unknown or synchrone */ int _starpu_src_common_store_message(struct _starpu_mp_node *node, void * arg, int arg_size, enum _starpu_mp_command answer) { switch(answer) { case STARPU_EXECUTION_COMPLETED: case STARPU_PRE_EXECUTION: struct mp_message *message = mp_message_new(); message->type = answer; _STARPU_MALLOC(message->buffer, arg_size); memcpy(message->buffer, arg, arg_size); message->size = arg_size; STARPU_PTHREAD_MUTEX_LOCK(&node->message_queue_mutex); mp_message_list_push_front(&node->message_queue,message); STARPU_PTHREAD_MUTEX_UNLOCK(&node->message_queue_mutex); return 1; break; default: return 0; break; } } /* Store all asynchronous messages and return when a synchronous message is received */ static enum _starpu_mp_command _starpu_src_common_wait_command_sync(struct _starpu_mp_node *node, void ** arg, int* arg_size) { enum _starpu_mp_command answer; int is_sync = 0; while(!is_sync) { answer = _starpu_mp_common_recv_command(node, arg, arg_size); if(!_starpu_src_common_store_message(node,*arg,*arg_size,answer)) is_sync=1; } return answer; } /* Handle a asynchrone message and return a error if a synchronous message is received */ static void _starpu_src_common_recv_async(struct _starpu_mp_node * node) { enum _starpu_mp_command answer; void *arg; int arg_size; answer = _starpu_mp_common_recv_command(node, &arg, &arg_size); if(!_starpu_src_common_handle_async(node,arg,arg_size,answer)) { printf("incorrect commande: unknown command or sync command"); STARPU_ASSERT(0); } } /* Handle all asynchrone message while a completed execution message from a specific worker has been receive */ enum _starpu_mp_command _starpu_src_common_wait_completed_execution(struct _starpu_mp_node *node, int devid, void **arg, int * arg_size) { enum _starpu_mp_command answer; int completed = 0; /*While the waited completed execution message has not been receive*/ while(!completed) { answer = _starpu_mp_common_recv_command (node, arg, arg_size); if(answer == STARPU_EXECUTION_COMPLETED) { int coreid; STARPU_ASSERT(sizeof(coreid) == *arg_size); coreid = *(int *) *arg; if(devid == coreid) completed = 1; else if(!_starpu_src_common_store_message(node, *arg, *arg_size, answer)) /* We receive a unknown or asynchronous message */ STARPU_ASSERT(0); } else { if(!_starpu_src_common_store_message(node, *arg, *arg_size, answer)) /* We receive a unknown or asynchronous message */ STARPU_ASSERT(0); } } return answer; } /* Send a request to the sink NODE for the number of cores on it. */ int _starpu_src_common_sink_nbcores (const struct _starpu_mp_node *node, int *buf) { enum _starpu_mp_command answer; void *arg; int arg_size = sizeof (int); _starpu_mp_common_send_command (node, STARPU_SINK_NBCORES, NULL, 0); answer = _starpu_mp_common_recv_command (node, &arg, &arg_size); STARPU_ASSERT (answer == STARPU_ANSWER_SINK_NBCORES && arg_size == sizeof (int)); memcpy (buf, arg, arg_size); return 0; } /* Send a request to the sink linked to NODE for the pointer to the * function defined by FUNC_NAME. * In case of success, it returns 0 and FUNC_PTR contains the pointer ; * else it returns -ESPIPE if the function was not found. */ int _starpu_src_common_lookup(struct _starpu_mp_node *node, void (**func_ptr)(void), const char *func_name) { enum _starpu_mp_command answer; void *arg; int arg_size; /* strlen ignore the terminating '\0' */ arg_size = (strlen(func_name) + 1) * sizeof(char); //_STARPU_DEBUG("Looking up %s\n", func_name); _starpu_mp_common_send_command(node, STARPU_LOOKUP, (void *) func_name, arg_size); answer = _starpu_src_common_wait_command_sync(node, (void **) &arg, &arg_size); if (answer == STARPU_ERROR_LOOKUP) { _STARPU_DISP("Error looking up symbol %s\n", func_name); return -ESPIPE; } /* We have to be sure the device answered the right question and the * answer has the right size */ STARPU_ASSERT(answer == STARPU_ANSWER_LOOKUP); STARPU_ASSERT(arg_size == sizeof(*func_ptr)); memcpy(func_ptr, arg, arg_size); //_STARPU_DEBUG("got %p\n", *func_ptr); return 0; } /* Send a message to the sink to execute a kernel. * The message sent has the form below : * [Function pointer on sink, number of interfaces, interfaces * (union _starpu_interface), cl_arg] */ /* Launch the execution of the function KERNEL points to on the sink linked * to NODE. Returns 0 in case of success, -EINVAL if kernel is an invalid * pointer. * Data interfaces in task are send to the sink. */ int _starpu_src_common_execute_kernel(struct _starpu_mp_node *node, void (*kernel)(void), unsigned coreid, enum starpu_codelet_type type, int is_parallel_task, int cb_workerid, starpu_data_handle_t *handles, void **interfaces, unsigned nb_interfaces, void *cl_arg, size_t cl_arg_size) { void *buffer, *arg =NULL; uintptr_t buffer_ptr; int buffer_size = 0, arg_size =0; unsigned i; buffer_size = sizeof(kernel) + sizeof(coreid) + sizeof(type) + sizeof(nb_interfaces) + nb_interfaces * sizeof(union _starpu_interface) + sizeof(is_parallel_task); /*if the task is parallel*/ if(is_parallel_task) { buffer_size += sizeof(cb_workerid); } /* If the user didn't give any cl_arg, there is no need to send it */ if (cl_arg) { STARPU_ASSERT(cl_arg_size); buffer_size += cl_arg_size; } /* We give to send_command a buffer we just allocated, which contains * a pointer to the function (sink-side), core on which execute this * function (sink-side), number of interfaces we send, * an array of generic (union) interfaces and the value of cl_arg */ _STARPU_MALLOC(buffer, buffer_size); buffer_ptr = (uintptr_t) buffer; *(void(**)(void)) buffer = kernel; buffer_ptr += sizeof(kernel); *(enum starpu_codelet_type *) buffer_ptr = type; buffer_ptr += sizeof(type); *(int *) buffer_ptr = is_parallel_task; buffer_ptr += sizeof(is_parallel_task); if(is_parallel_task) { *(int *) buffer_ptr = cb_workerid ; buffer_ptr += sizeof(cb_workerid); } *(unsigned *) buffer_ptr = coreid; buffer_ptr += sizeof(coreid); *(unsigned *) buffer_ptr = nb_interfaces; buffer_ptr += sizeof(nb_interfaces); /* Message-passing execution is a particular case as the codelet is * executed on a sink with a different memory, whereas a codelet is * executed on the host part for the other accelerators. * Thus we need to send a copy of each interface on the MP device */ for (i = 0; i < nb_interfaces; i++) { starpu_data_handle_t handle = handles[i]; memcpy ((void*) buffer_ptr, interfaces[i], handle->ops->interface_size); /* The sink side has no mean to get the type of each * interface, we use a union to make it generic and permit the * sink to go through the array */ buffer_ptr += sizeof(union _starpu_interface); } if (cl_arg) memcpy((void*) buffer_ptr, cl_arg, cl_arg_size); _starpu_mp_common_send_command(node, STARPU_EXECUTE, buffer, buffer_size); enum _starpu_mp_command answer = _starpu_src_common_wait_command_sync(node, &arg, &arg_size); if (answer == STARPU_ERROR_EXECUTE) return -EINVAL; STARPU_ASSERT(answer == STARPU_EXECUTION_SUBMITTED); free(buffer); return 0; } /* Get the information and call the function to send to the sink a message to execute the task*/ static int _starpu_src_common_execute(struct _starpu_job *j, struct _starpu_worker *worker, struct _starpu_mp_node * node) { STARPU_ASSERT(j); struct starpu_task *task = j->task; int profiling = starpu_profiling_status_get(); STARPU_ASSERT(task); if (worker->current_rank == 0) { int ret = _starpu_fetch_task_input(j); if (ret != 0) { /* there was not enough memory, so the input of * the codelet cannot be fetched ... put the * codelet back, and try it later */ return -EAGAIN; } } void (*kernel)(void) = node->get_kernel_from_job(node,j); _starpu_driver_start_job(worker, j, &worker->perf_arch, 0, profiling); //_STARPU_DEBUG("\nworkerid:%d, rank:%d, type:%d, cb_workerid:%d, task_size:%d\n\n",worker->devid,worker->current_rank,task->cl->type,j->combined_workerid,j->task_size); _starpu_src_common_execute_kernel(node, kernel, worker->subworkerid, task->cl->type, (j->task_size > 1), j->combined_workerid, STARPU_TASK_GET_HANDLES(task), _STARPU_TASK_GET_INTERFACES(task), STARPU_TASK_GET_NBUFFERS(task), task->cl_arg, task->cl_arg_size); return 0; } /* Send a request to the sink linked to the MP_NODE to allocate SIZE bytes on * the sink. * In case of success, it returns 0 and *ADDR contains the address of the * allocated area ; * else it returns 1 if the allocation fail. */ int _starpu_src_common_allocate(struct _starpu_mp_node *mp_node, void **addr, size_t size) { enum _starpu_mp_command answer; void *arg; int arg_size; _starpu_mp_common_send_command(mp_node, STARPU_ALLOCATE, &size, sizeof(size)); answer = _starpu_src_common_wait_command_sync(mp_node, &arg, &arg_size); if (answer == STARPU_ERROR_ALLOCATE) return 1; STARPU_ASSERT(answer == STARPU_ANSWER_ALLOCATE && arg_size == sizeof(*addr)); memcpy(addr, arg, arg_size); return 0; } /* Send a request to the sink linked to the MP_NODE to deallocate the memory * area pointed by ADDR. */ void _starpu_src_common_free(const struct _starpu_mp_node *mp_node, void *addr) { _starpu_mp_common_send_command(mp_node, STARPU_FREE, &addr, sizeof(addr)); } /* Send SIZE bytes pointed by SRC to DST on the sink linked to the MP_NODE. */ int _starpu_src_common_copy_host_to_sink(const struct _starpu_mp_node *mp_node, void *src, void *dst, size_t size) { struct _starpu_mp_transfer_command cmd = {size, dst}; _starpu_mp_common_send_command(mp_node, STARPU_RECV_FROM_HOST, &cmd, sizeof(cmd)); mp_node->dt_send(mp_node, src, size); return 0; } /* Receive SIZE bytes pointed by SRC on the sink linked to the MP_NODE and store them in DST. */ int _starpu_src_common_copy_sink_to_host(const struct _starpu_mp_node *mp_node, void *src, void *dst, size_t size) { struct _starpu_mp_transfer_command cmd = {size, src}; _starpu_mp_common_send_command(mp_node, STARPU_SEND_TO_HOST, &cmd, sizeof(cmd)); mp_node->dt_recv(mp_node, dst, size); return 0; } /* Tell the sink linked to SRC_NODE to send SIZE bytes of data pointed by SRC * to the sink linked to DST_NODE. The latter store them in DST. */ int _starpu_src_common_copy_sink_to_sink(const struct _starpu_mp_node *src_node, const struct _starpu_mp_node *dst_node, void *src, void *dst, size_t size) { enum _starpu_mp_command answer; void *arg; int arg_size; struct _starpu_mp_transfer_command_to_device cmd = {dst_node->peer_id, size, src}; /* Tell source to send data to dest. */ _starpu_mp_common_send_command(src_node, STARPU_SEND_TO_SINK, &cmd, sizeof(cmd)); cmd.devid = src_node->peer_id; cmd.size = size; cmd.addr = dst; /* Tell dest to receive data from source. */ _starpu_mp_common_send_command(dst_node, STARPU_RECV_FROM_SINK, &cmd, sizeof(cmd)); /* Wait for answer from dest to know wether transfer is finished. */ answer = _starpu_mp_common_recv_command(dst_node, &arg, &arg_size); STARPU_ASSERT(answer == STARPU_TRANSFER_COMPLETE); return 0; } /* 5 functions to determine the executable to run on the device (MIC, SCC, * MPI). */ static void _starpu_src_common_cat_3(char *final, const size_t len, const char *first, const char *second, const char *third) { snprintf(final, len, "%s%s%s", first, second, third); } static void _starpu_src_common_cat_2(char *final, const size_t len, const char *first, const char *second) { _starpu_src_common_cat_3(final, len, first, second, ""); } static void _starpu_src_common_dir_cat(char *final, const size_t len, const char *dir, const char *file) { if (file[0] == '/') ++file; size_t size = strlen(dir); if (dir[size - 1] == '/') _starpu_src_common_cat_2(final, len, dir, file); else _starpu_src_common_cat_3(final, len, dir, "/", file); } static int _starpu_src_common_test_suffixes(char *located_file_name, const size_t len, const char *base, const char **suffixes) { unsigned int i; for (i = 0; suffixes[i] != NULL; ++i) { _starpu_src_common_cat_2(located_file_name, len, base, suffixes[i]); if (access(located_file_name, R_OK) == 0) return 0; } return 1; } int _starpu_src_common_locate_file(char *located_file_name, size_t len, const char *env_file_name, const char *env_mic_path, const char *config_file_name, const char *actual_file_name, const char **suffixes) { if (env_file_name != NULL) { if (access(env_file_name, R_OK) == 0) { strncpy(located_file_name, env_file_name, len); return 0; } else if(env_mic_path != NULL) { _starpu_src_common_dir_cat(located_file_name, len, env_mic_path, env_file_name); return access(located_file_name, R_OK); } } else if (config_file_name != NULL) { if (access(config_file_name, R_OK) == 0) { strncpy(located_file_name, config_file_name, len); return 0; } else if (env_mic_path != NULL) { _starpu_src_common_dir_cat(located_file_name, len, env_mic_path, config_file_name); return access(located_file_name, R_OK); } } else if (actual_file_name != NULL) { if (_starpu_src_common_test_suffixes(located_file_name, len, actual_file_name, suffixes) == 0) return 0; if (env_mic_path != NULL) { char actual_cpy[1024]; strncpy(actual_cpy, actual_file_name, sizeof(actual_cpy)); char *last = strrchr(actual_cpy, '/'); while (last != NULL) { char tmp[1024]; _starpu_src_common_dir_cat(tmp, sizeof(tmp), env_mic_path, last); if (access(tmp, R_OK) == 0) { strncpy(located_file_name, tmp, len); return 0; } if (_starpu_src_common_test_suffixes(located_file_name, len, tmp, suffixes) == 0) return 0; *last = '\0'; char *last_tmp = strrchr(actual_cpy, '/'); *last = '/'; last = last_tmp; } } } return 1; } /* Send workers to the sink node */ static void _starpu_src_common_send_workers(struct _starpu_mp_node * node, int baseworkerid, int nworkers) { struct _starpu_machine_config *config = _starpu_get_machine_config(); int worker_size = sizeof(struct _starpu_worker)*nworkers; int combined_worker_size = STARPU_NMAX_COMBINEDWORKERS*sizeof(struct _starpu_combined_worker); int msg[5]; msg[0] = nworkers; msg[1] = worker_size; msg[2] = combined_worker_size; msg[3] = baseworkerid; msg[4] = starpu_worker_get_count(); /* tell the sink node that we will send him all workers */ _starpu_mp_common_send_command(node, STARPU_SYNC_WORKERS, &msg, sizeof(msg)); /* Send all worker to the sink node */ node->dt_send(node,&config->workers[baseworkerid],worker_size); /* Send all combined workers to the sink node */ node->dt_send(node, &config->combined_workers,combined_worker_size); } /* Function looping on the source node */ void _starpu_src_common_worker(struct _starpu_worker_set * worker_set, unsigned baseworkerid, struct _starpu_mp_node * mp_node) { unsigned memnode = worker_set->workers[0].memory_node; struct starpu_task **tasks; _STARPU_MALLOC(tasks, sizeof(struct starpu_task *)*worker_set->nworkers); _starpu_src_common_send_workers(mp_node, baseworkerid, worker_set->nworkers); _STARPU_TRACE_START_PROGRESS(memnode); /*main loop*/ while (_starpu_machine_is_running()) { int res; _starpu_may_pause(); _starpu_datawizard_progress(memnode, 1); _starpu_datawizard_progress(STARPU_MAIN_RAM, 1); /* Handle message which have been store */ _starpu_src_common_handle_stored_async(mp_node); unsigned stopped_progress = 0; /* poll the device for completed jobs.*/ while(mp_node->mp_recv_is_ready(mp_node)) { stopped_progress = 1; _STARPU_TRACE_END_PROGRESS(memnode); _starpu_src_common_recv_async(mp_node); } if (stopped_progress) _STARPU_TRACE_START_PROGRESS(memnode); /* get task for each worker*/ res = _starpu_get_multi_worker_task(worker_set->workers, tasks, worker_set->nworkers, memnode); /*if at least one worker have pop a task*/ if(res != 0) { unsigned i; for(i=0; inworkers; i++) { if(tasks[i] != NULL) { struct _starpu_worker *worker = &worker_set->workers[i]; _STARPU_TRACE_END_PROGRESS(worker->memory_node); struct _starpu_job * j = _starpu_get_job_associated_to_task(tasks[i]); _starpu_set_local_worker_key(worker); res = _starpu_src_common_execute(j, worker, mp_node); switch (res) { case 0: /* The task task has been launched with no error */ break; case -EAGAIN: _STARPU_DISP("ouch, this MP worker could not actually run task %p, putting it back...\n", tasks[i]); _starpu_push_task_to_workers(tasks[i]); STARPU_ABORT(); continue; break; default: STARPU_ASSERT(0); } _STARPU_TRACE_START_PROGRESS(worker->memory_node); } } } } _STARPU_TRACE_END_PROGRESS(memnode); free(tasks); _starpu_handle_all_pending_node_data_requests(memnode); /* In case there remains some memory that was automatically * allocated by StarPU, we release it now. Note that data * coherency is not maintained anymore at that point ! */ _starpu_free_all_automatically_allocated_buffers(memnode); } starpu-1.2.3+dfsg/src/drivers/mp_common/source_common.h000066400000000000000000000056251320135501600232300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __SOURCE_COMMON_H__ #define __SOURCE_COMMON_H__ #ifdef STARPU_USE_MP #include #include #include enum _starpu_mp_command _starpu_src_common_wait_command_sync(struct _starpu_mp_node *node, void ** arg, int* arg_size); void _starpu_src_common_recv_async(struct _starpu_worker_set *worker_set, struct _starpu_mp_node * baseworker_node); int _starpu_src_common_store_message(struct _starpu_mp_node *node, void * arg, int arg_size, enum _starpu_mp_command answer); enum _starpu_mp_command _starpu_src_common_wait_completed_execution(struct _starpu_mp_node *node, int devid, void **arg, int * arg_size); int _starpu_src_common_sink_nbcores (const struct _starpu_mp_node *node, int *buf); int _starpu_src_common_lookup(const struct _starpu_mp_node *node, void (**func_ptr)(void), const char *func_name); int _starpu_src_common_allocate(const struct _starpu_mp_node *mp_node, void **addr, size_t size); void _starpu_src_common_free(const struct _starpu_mp_node *mp_node, void *addr); int _starpu_src_common_execute_kernel(const struct _starpu_mp_node *node, void (*kernel)(void), unsigned coreid, enum starpu_codelet_type type, int is_parallel_task, int cb_workerid, starpu_data_handle_t *handles, void **interfaces, unsigned nb_interfaces, void *cl_arg, size_t cl_arg_size); int _starpu_src_common_copy_host_to_sink(const struct _starpu_mp_node *mp_node, void *src, void *dst, size_t size); int _starpu_src_common_copy_sink_to_host(const struct _starpu_mp_node *mp_node, void *src, void *dst, size_t size); int _starpu_src_common_copy_sink_to_sink(const struct _starpu_mp_node *src_node, const struct _starpu_mp_node *dst_node, void *src, void *dst, size_t size); int _starpu_src_common_locate_file(char *located_file_name, size_t len, const char *env_file_name, const char *env_mic_path, const char *config_file_name, const char *actual_file_name, const char **suffixes); void _starpu_src_common_worker(struct _starpu_worker_set * worker_set, unsigned baseworkerid, struct _starpu_mp_node * node_set); #endif /* STARPU_USE_MP */ #endif /* __SOURCE_COMMON_H__ */ starpu-1.2.3+dfsg/src/drivers/opencl/000077500000000000000000000000001320135501600174735ustar00rootroot00000000000000starpu-1.2.3+dfsg/src/drivers/opencl/driver_opencl.c000066400000000000000000001025621320135501600225000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2016 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include "driver_opencl.h" #include "driver_opencl_utils.h" #include #include #include #include #ifdef STARPU_SIMGRID #include #endif static int nb_devices = -1; static int init_done = 0; static starpu_pthread_mutex_t big_lock = STARPU_PTHREAD_MUTEX_INITIALIZER; static size_t global_mem[STARPU_MAXOPENCLDEVS]; #ifdef STARPU_USE_OPENCL static cl_context contexts[STARPU_MAXOPENCLDEVS]; static cl_device_id devices[STARPU_MAXOPENCLDEVS]; static cl_command_queue queues[STARPU_MAXOPENCLDEVS]; static cl_command_queue in_transfer_queues[STARPU_MAXOPENCLDEVS]; static cl_command_queue out_transfer_queues[STARPU_MAXOPENCLDEVS]; static cl_command_queue peer_transfer_queues[STARPU_MAXOPENCLDEVS]; #ifndef STARPU_SIMGRID static cl_command_queue alloc_queues[STARPU_MAXOPENCLDEVS]; static cl_event task_events[STARPU_MAXOPENCLDEVS][STARPU_MAX_PIPELINE]; #endif /* !STARPU_SIMGRID */ #endif #ifdef STARPU_SIMGRID static unsigned task_finished[STARPU_MAXOPENCLDEVS][STARPU_MAX_PIPELINE]; static starpu_pthread_mutex_t task_mutex[STARPU_MAXOPENCLDEVS][STARPU_MAX_PIPELINE]; static starpu_pthread_cond_t task_cond[STARPU_MAXOPENCLDEVS][STARPU_MAX_PIPELINE]; #endif /* STARPU_SIMGRID */ #define _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err) do { if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); } while(0) void _starpu_opencl_discover_devices(struct _starpu_machine_config *config) { /* Discover the number of OpenCL devices. Fill the result in CONFIG. */ /* As OpenCL must have been initialized before calling this function, * `nb_device' is ensured to be correctly set. */ STARPU_ASSERT(init_done == 1); config->topology.nhwopenclgpus = nb_devices; } static void _starpu_opencl_limit_gpu_mem_if_needed(unsigned devid) { starpu_ssize_t limit; size_t STARPU_ATTRIBUTE_UNUSED totalGlobalMem = 0; size_t STARPU_ATTRIBUTE_UNUSED to_waste = 0; #ifdef STARPU_SIMGRID totalGlobalMem = _starpu_simgrid_get_memsize("OpenCL", devid); #elif defined(STARPU_USE_OPENCL) /* Request the size of the current device's memory */ cl_int err; cl_ulong size; err = clGetDeviceInfo(devices[devid], CL_DEVICE_GLOBAL_MEM_SIZE, sizeof(size), &size, NULL); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); totalGlobalMem = size; #endif limit = starpu_get_env_number("STARPU_LIMIT_OPENCL_MEM"); if (limit == -1) { char name[30]; sprintf(name, "STARPU_LIMIT_OPENCL_%u_MEM", devid); limit = starpu_get_env_number(name); } #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) if (limit == -1) { /* Use 90% of the available memory by default. */ limit = totalGlobalMem / (1024*1024) * 0.9; } #endif global_mem[devid] = limit * 1024*1024; #ifdef STARPU_USE_OPENCL /* How much memory to waste ? */ to_waste = totalGlobalMem - global_mem[devid]; #endif _STARPU_DEBUG("OpenCL device %u: Wasting %ld MB / Limit %ld MB / Total %ld MB / Remains %ld MB\n", devid, (long)to_waste/(1024*1024), (long) limit, (long)totalGlobalMem/(1024*1024), (long)(totalGlobalMem - to_waste)/(1024*1024)); } #ifdef STARPU_USE_OPENCL void starpu_opencl_get_context(int devid, cl_context *context) { *context = contexts[devid]; } void starpu_opencl_get_device(int devid, cl_device_id *device) { *device = devices[devid]; } void starpu_opencl_get_queue(int devid, cl_command_queue *queue) { *queue = queues[devid]; } void starpu_opencl_get_current_queue(cl_command_queue *queue) { struct _starpu_worker *worker = _starpu_get_local_worker_key(); STARPU_ASSERT(queue); *queue = queues[worker->devid]; } void starpu_opencl_get_current_context(cl_context *context) { struct _starpu_worker *worker = _starpu_get_local_worker_key(); STARPU_ASSERT(context); *context = contexts[worker->devid]; } #endif /* STARPU_USE_OPENCL */ int _starpu_opencl_init_context(int devid) { #ifdef STARPU_SIMGRID int j; for (j = 0; j < STARPU_MAX_PIPELINE; j++) { task_finished[devid][j] = 0; STARPU_PTHREAD_MUTEX_INIT(&task_mutex[devid][j], NULL); STARPU_PTHREAD_COND_INIT(&task_cond[devid][j], NULL); } #else /* !STARPU_SIMGRID */ cl_int err; cl_uint uint; STARPU_PTHREAD_MUTEX_LOCK(&big_lock); _STARPU_DEBUG("Initialising context for dev %d\n", devid); // Create a compute context err = 0; contexts[devid] = clCreateContext(NULL, 1, &devices[devid], NULL, NULL, &err); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); err = clGetDeviceInfo(devices[devid], CL_DEVICE_MEM_BASE_ADDR_ALIGN, sizeof(uint), &uint, NULL); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); starpu_malloc_set_align(uint/8); // Create execution queue for the given device queues[devid] = clCreateCommandQueue(contexts[devid], devices[devid], 0, &err); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); // Create transfer queue for the given device cl_command_queue_properties props; err = clGetDeviceInfo(devices[devid], CL_DEVICE_QUEUE_PROPERTIES, sizeof(props), &props, NULL); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); props &= ~CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE; in_transfer_queues[devid] = clCreateCommandQueue(contexts[devid], devices[devid], props, &err); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); out_transfer_queues[devid] = clCreateCommandQueue(contexts[devid], devices[devid], props, &err); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); peer_transfer_queues[devid] = clCreateCommandQueue(contexts[devid], devices[devid], props, &err); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); alloc_queues[devid] = clCreateCommandQueue(contexts[devid], devices[devid], 0, &err); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); STARPU_PTHREAD_MUTEX_UNLOCK(&big_lock); #endif /* !STARPU_SIMGRID */ return 0; } int _starpu_opencl_deinit_context(int devid) { #ifdef STARPU_SIMGRID int j; for (j = 0; j < STARPU_MAX_PIPELINE; j++) { task_finished[devid][j] = 0; STARPU_PTHREAD_MUTEX_DESTROY(&task_mutex[devid][j]); STARPU_PTHREAD_COND_DESTROY(&task_cond[devid][j]); } #else /* !STARPU_SIMGRID */ cl_int err; STARPU_PTHREAD_MUTEX_LOCK(&big_lock); _STARPU_DEBUG("De-initialising context for dev %d\n", devid); err = clFinish(queues[devid]); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); err = clReleaseCommandQueue(queues[devid]); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); err = clFinish(in_transfer_queues[devid]); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); err = clReleaseCommandQueue(in_transfer_queues[devid]); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); err = clFinish(out_transfer_queues[devid]); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); err = clReleaseCommandQueue(out_transfer_queues[devid]); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); err = clFinish(peer_transfer_queues[devid]); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); err = clReleaseCommandQueue(peer_transfer_queues[devid]); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); err = clFinish(alloc_queues[devid]); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); err = clReleaseCommandQueue(alloc_queues[devid]); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); err = clReleaseContext(contexts[devid]); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); contexts[devid] = NULL; STARPU_PTHREAD_MUTEX_UNLOCK(&big_lock); #endif return 0; } #ifdef STARPU_USE_OPENCL cl_int starpu_opencl_allocate_memory(int devid STARPU_ATTRIBUTE_UNUSED, cl_mem *mem STARPU_ATTRIBUTE_UNUSED, size_t size STARPU_ATTRIBUTE_UNUSED, cl_mem_flags flags STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_SIMGRID STARPU_ABORT(); #else cl_int err; cl_mem memory; memory = clCreateBuffer(contexts[devid], flags, size, NULL, &err); if (err == CL_OUT_OF_HOST_MEMORY) return err; if (err == CL_MEM_OBJECT_ALLOCATION_FAILURE) return err; _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); /* * OpenCL uses lazy memory allocation: we will only know if the * allocation failed when trying to copy data onto the device. But we * want to know this __now__, so we just perform a dummy copy. */ char dummy = 0; cl_event ev; err = clEnqueueWriteBuffer(alloc_queues[devid], memory, CL_TRUE, 0, sizeof(dummy), &dummy, 0, NULL, &ev); if (err == CL_MEM_OBJECT_ALLOCATION_FAILURE) return err; if (err == CL_OUT_OF_RESOURCES) return err; _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); clWaitForEvents(1, &ev); clReleaseEvent(ev); *mem = memory; return CL_SUCCESS; #endif } cl_int starpu_opencl_copy_ram_to_opencl(void *ptr, unsigned src_node STARPU_ATTRIBUTE_UNUSED, cl_mem buffer, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, size_t size, size_t offset, cl_event *event, int *ret) { cl_int err; struct _starpu_worker *worker = _starpu_get_local_worker_key(); if (event) _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); cl_event ev; err = clEnqueueWriteBuffer(in_transfer_queues[worker->devid], buffer, CL_FALSE, offset, size, ptr, 0, NULL, &ev); if (event) _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); if (STARPU_LIKELY(err == CL_SUCCESS)) { if (event == NULL) { /* We want a synchronous copy, let's synchronise the queue */ err = clWaitForEvents(1, &ev); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); err = clReleaseEvent(ev); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); } else { *event = ev; } if (ret) { *ret = (event == NULL) ? 0 : -EAGAIN; } } return err; } cl_int starpu_opencl_copy_opencl_to_ram(cl_mem buffer, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *ptr, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, size_t size, size_t offset, cl_event *event, int *ret) { cl_int err; struct _starpu_worker *worker = _starpu_get_local_worker_key(); if (event) _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); cl_event ev; err = clEnqueueReadBuffer(out_transfer_queues[worker->devid], buffer, CL_FALSE, offset, size, ptr, 0, NULL, &ev); if (event) _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); if (STARPU_LIKELY(err == CL_SUCCESS)) { if (event == NULL) { /* We want a synchronous copy, let's synchronise the queue */ err = clWaitForEvents(1, &ev); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); err = clReleaseEvent(ev); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); } else { *event = ev; } if (ret) { *ret = (event == NULL) ? 0 : -EAGAIN; } } return err; } cl_int starpu_opencl_copy_opencl_to_opencl(cl_mem src, unsigned src_node STARPU_ATTRIBUTE_UNUSED, size_t src_offset, cl_mem dst, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, size_t dst_offset, size_t size, cl_event *event, int *ret) { cl_int err; struct _starpu_worker *worker = _starpu_get_local_worker_key(); if (event) _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); cl_event ev; err = clEnqueueCopyBuffer(peer_transfer_queues[worker->devid], src, dst, src_offset, dst_offset, size, 0, NULL, &ev); if (event) _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); if (STARPU_LIKELY(err == CL_SUCCESS)) { if (event == NULL) { /* We want a synchronous copy, let's synchronise the queue */ err = clWaitForEvents(1, &ev); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); err = clReleaseEvent(ev); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); } else { *event = ev; } if (ret) { *ret = (event == NULL) ? 0 : -EAGAIN; } } return err; } cl_int starpu_opencl_copy_async_sync(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, cl_event *event) { enum starpu_node_kind src_kind = starpu_node_get_kind(src_node); enum starpu_node_kind dst_kind = starpu_node_get_kind(dst_node); cl_int err; int ret; switch (_STARPU_MEMORY_NODE_TUPLE(src_kind,dst_kind)) { case _STARPU_MEMORY_NODE_TUPLE(STARPU_OPENCL_RAM,STARPU_CPU_RAM): err = starpu_opencl_copy_opencl_to_ram( (cl_mem) src, src_node, (void*) (dst + dst_offset), dst_node, size, src_offset, event, &ret); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); return ret; case _STARPU_MEMORY_NODE_TUPLE(STARPU_CPU_RAM,STARPU_OPENCL_RAM): err = starpu_opencl_copy_ram_to_opencl( (void*) (src + src_offset), src_node, (cl_mem) dst, dst_node, size, dst_offset, event, &ret); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); return ret; case _STARPU_MEMORY_NODE_TUPLE(STARPU_OPENCL_RAM,STARPU_OPENCL_RAM): err = starpu_opencl_copy_opencl_to_opencl( (cl_mem) src, src_node, src_offset, (cl_mem) dst, dst_node, dst_offset, size, event, &ret); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); return ret; default: STARPU_ABORT(); break; } } #if 0 cl_int _starpu_opencl_copy_rect_opencl_to_ram(cl_mem buffer, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *ptr, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, const size_t buffer_origin[3], const size_t host_origin[3], const size_t region[3], size_t buffer_row_pitch, size_t buffer_slice_pitch, size_t host_row_pitch, size_t host_slice_pitch, cl_event *event) { cl_int err; struct _starpu_worker *worker = _starpu_get_local_worker_key(); cl_bool blocking; blocking = (event == NULL) ? CL_TRUE : CL_FALSE; if (event) _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); err = clEnqueueReadBufferRect(out_transfer_queues[worker->devid], buffer, blocking, buffer_origin, host_origin, region, buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, ptr, 0, NULL, event); if (event) _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); return CL_SUCCESS; } cl_int _starpu_opencl_copy_rect_ram_to_opencl(void *ptr, unsigned src_node STARPU_ATTRIBUTE_UNUSED, cl_mem buffer, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, const size_t buffer_origin[3], const size_t host_origin[3], const size_t region[3], size_t buffer_row_pitch, size_t buffer_slice_pitch, size_t host_row_pitch, size_t host_slice_pitch, cl_event *event) { cl_int err; struct _starpu_worker *worker = _starpu_get_local_worker_key(); cl_bool blocking; blocking = (event == NULL) ? CL_TRUE : CL_FALSE; if (event) _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); err = clEnqueueWriteBufferRect(in_transfer_queues[worker->devid], buffer, blocking, buffer_origin, host_origin, region, buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, ptr, 0, NULL, event); if (event) _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); return CL_SUCCESS; } #endif #endif /* STARPU_USE_OPENCL */ static size_t _starpu_opencl_get_global_mem_size(int devid) { return global_mem[devid]; } void _starpu_opencl_init(void) { STARPU_PTHREAD_MUTEX_LOCK(&big_lock); if (!init_done) { #ifdef STARPU_SIMGRID nb_devices = _starpu_simgrid_get_nbhosts("OpenCL"); #else /* STARPU_USE_OPENCL */ cl_platform_id platform_id[_STARPU_OPENCL_PLATFORM_MAX]; cl_uint nb_platforms; cl_int err; int i; cl_device_type device_type = CL_DEVICE_TYPE_GPU|CL_DEVICE_TYPE_ACCELERATOR; _STARPU_DEBUG("Initialising OpenCL\n"); // Get Platforms if (starpu_get_env_number("STARPU_OPENCL_ON_CPUS") > 0) device_type |= CL_DEVICE_TYPE_CPU; if (starpu_get_env_number("STARPU_OPENCL_ONLY_ON_CPUS") > 0) device_type = CL_DEVICE_TYPE_CPU; err = clGetPlatformIDs(_STARPU_OPENCL_PLATFORM_MAX, platform_id, &nb_platforms); if (STARPU_UNLIKELY(err != CL_SUCCESS)) nb_platforms=0; _STARPU_DEBUG("Platforms detected: %u\n", nb_platforms); _STARPU_DEBUG("CPU device type: %s\n", (device_type&CL_DEVICE_TYPE_CPU)?"requested":"not requested"); _STARPU_DEBUG("GPU device type: %s\n", (device_type&CL_DEVICE_TYPE_GPU)?"requested":"not requested"); _STARPU_DEBUG("Accelerator device type: %s\n", (device_type&CL_DEVICE_TYPE_ACCELERATOR)?"requested":"not requested"); // Get devices nb_devices = 0; { unsigned j; for (j=0; j STARPU_MAXOPENCLDEVS) { _STARPU_DISP("# Warning: %u OpenCL devices available. Only %d enabled. Use configure option --enable-maxopencldev=xxx to update the maximum value of supported OpenCL devices?\n", nb_devices, STARPU_MAXOPENCLDEVS); nb_devices = STARPU_MAXOPENCLDEVS; } // initialise internal structures for(i=0 ; idevid; _starpu_driver_start(worker, _STARPU_FUT_OPENCL_KEY, 0); _starpu_opencl_init_context(devid); /* one more time to avoid hacks from third party lib :) */ _starpu_bind_thread_on_cpu(worker->config, worker->bindid, worker->workerid); _starpu_opencl_limit_gpu_mem_if_needed(devid); _starpu_memory_manager_set_global_memory_size(worker->memory_node, _starpu_opencl_get_global_mem_size(devid)); float size = (float) global_mem[devid] / (1<<30); #ifdef STARPU_SIMGRID const char *devname = "Simgrid"; #else /* get the device's name */ char devname[128]; _starpu_opencl_get_device_name(devid, devname, 128); #endif snprintf(worker->name, sizeof(worker->name), "OpenCL %d (%s %.1f GiB)", devid, devname, size); snprintf(worker->short_name, sizeof(worker->short_name), "OpenCL %d", devid); starpu_pthread_setname(worker->short_name); worker->pipeline_length = starpu_get_env_number_default("STARPU_OPENCL_PIPELINE", 2); if (worker->pipeline_length > STARPU_MAX_PIPELINE) { _STARPU_DISP("Warning: STARPU_OPENCL_PIPELINE is %u, but STARPU_MAX_PIPELINE is only %u", worker->pipeline_length, STARPU_MAX_PIPELINE); worker->pipeline_length = STARPU_MAX_PIPELINE; } #if defined(STARPU_SIMGRID) && defined(STARPU_NON_BLOCKING_DRIVERS) if (worker->pipeline_length >= 1) { /* We need blocking drivers, otherwise idle drivers * would keep consuming real CPU time while just * polling for task termination */ _STARPU_DISP("Warning: reducing STARPU_OPENCL_PIPELINE to 0 because simgrid is enabled and blocking drivers are not enabled\n"); worker->pipeline_length = 0; } #endif #if !defined(STARPU_SIMGRID) && !defined(STARPU_NON_BLOCKING_DRIVERS) if (worker->pipeline_length >= 1) { /* We need non-blocking drivers, to poll for OPENCL task * termination */ _STARPU_DISP("Warning: reducing STARPU_OPENCL_PIPELINE to 0 because blocking drivers are enabled (and simgrid is not enabled)\n"); worker->pipeline_length = 0; } #endif _STARPU_DEBUG("OpenCL (%s) dev id %d thread is ready to run on CPU %d !\n", devname, devid, worker->bindid); _STARPU_TRACE_WORKER_INIT_END(worker->workerid); /* tell the main thread that this one is ready */ STARPU_PTHREAD_MUTEX_LOCK(&worker->mutex); worker->status = STATUS_UNKNOWN; worker->worker_is_initialized = 1; STARPU_PTHREAD_COND_SIGNAL(&worker->ready_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&worker->mutex); return 0; } int _starpu_opencl_driver_run_once(struct _starpu_worker *worker) { int workerid = worker->workerid; unsigned memnode = worker->memory_node; struct _starpu_job *j; struct starpu_task *task; if (worker->ntasks) { #ifndef STARPU_SIMGRID size_t size; int err; #endif /* On-going asynchronous task, check for its termination first */ task = worker->current_tasks[worker->first_task]; #ifdef STARPU_SIMGRID if (!task_finished[worker->devid][worker->first_task]) #else /* !STARPU_SIMGRID */ cl_int status; err = clGetEventInfo(task_events[worker->devid][worker->first_task], CL_EVENT_COMMAND_EXECUTION_STATUS, sizeof(cl_int), &status, &size); STARPU_ASSERT(size == sizeof(cl_int)); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); if (status != CL_COMPLETE) #endif /* !STARPU_SIMGRID */ { /* Not ready yet, no better thing to do than waiting */ __starpu_datawizard_progress(memnode, 1, 0); __starpu_datawizard_progress(STARPU_MAIN_RAM, 1, 0); return 0; } else { _STARPU_TRACE_END_PROGRESS(memnode); #ifndef STARPU_SIMGRID err = clReleaseEvent(task_events[worker->devid][worker->first_task]); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); task_events[worker->devid][worker->first_task] = 0; #endif /* Asynchronous task completed! */ _starpu_opencl_stop_job(_starpu_get_job_associated_to_task(task), worker); /* See next task if any */ if (worker->ntasks) { task = worker->current_tasks[worker->first_task]; j = _starpu_get_job_associated_to_task(task); if (task->cl->opencl_flags[j->nimpl] & STARPU_OPENCL_ASYNC) { /* An asynchronous task, it was already queued, * it's now running, record its start time. */ _starpu_driver_start_job(worker, j, &worker->perf_arch, 0, starpu_profiling_status_get()); } else { /* A synchronous task, we have finished flushing the pipeline, we can now at last execute it. */ _STARPU_TRACE_EVENT("sync_task"); _starpu_opencl_execute_job(task, worker); _STARPU_TRACE_EVENT("end_sync_task"); worker->pipeline_stuck = 0; } } _STARPU_TRACE_START_PROGRESS(memnode); } } __starpu_datawizard_progress(memnode, 1, 1); __starpu_datawizard_progress(STARPU_MAIN_RAM, 1, 1); task = _starpu_get_worker_task(worker, workerid, memnode); if (task == NULL) return 0; j = _starpu_get_job_associated_to_task(task); /* can OpenCL do that task ? */ if (!_STARPU_OPENCL_MAY_PERFORM(j)) { /* this is not a OpenCL task */ _starpu_push_task_to_workers(task); return 0; } _STARPU_TRACE_END_PROGRESS(memnode); worker->current_tasks[(worker->first_task + worker->ntasks)%STARPU_MAX_PIPELINE] = task; worker->ntasks++; if (worker->ntasks > 1 && !(task->cl->opencl_flags[j->nimpl] & STARPU_OPENCL_ASYNC)) { /* We have to execute a non-asynchronous task but we * still have tasks in the pipeline... Record it to * prevent more tasks from coming, and do it later */ worker->pipeline_stuck = 1; return 0; } _starpu_opencl_execute_job(task, worker); _STARPU_TRACE_START_PROGRESS(memnode); return 0; } int _starpu_opencl_driver_deinit(struct _starpu_worker *worker) { _STARPU_TRACE_WORKER_DEINIT_START; unsigned memnode = worker->memory_node; _starpu_handle_all_pending_node_data_requests(memnode); /* In case there remains some memory that was automatically * allocated by StarPU, we release it now. Note that data * coherency is not maintained anymore at that point ! */ _starpu_free_all_automatically_allocated_buffers(memnode); _starpu_malloc_shutdown(memnode); unsigned devid = worker->devid; _starpu_opencl_deinit_context(devid); worker->worker_is_initialized = 0; _STARPU_TRACE_WORKER_DEINIT_END(_STARPU_FUT_OPENCL_KEY); return 0; } void *_starpu_opencl_worker(void *_arg) { struct _starpu_worker* worker = _arg; _starpu_opencl_driver_init(worker); _STARPU_TRACE_START_PROGRESS(worker->memory_node); while (_starpu_machine_is_running()) { _starpu_may_pause(); _starpu_opencl_driver_run_once(worker); } _starpu_opencl_driver_deinit(worker); _STARPU_TRACE_END_PROGRESS(worker->memory_node); return NULL; } #ifdef STARPU_USE_OPENCL #ifndef STARPU_SIMGRID static unsigned _starpu_opencl_get_device_name(int dev, char *name, int lname) { int err; if (!init_done) { _starpu_opencl_init(); } // Get device name err = clGetDeviceInfo(devices[dev], CL_DEVICE_NAME, lname, name, NULL); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); _STARPU_DEBUG("Device %d : [%s]\n", dev, name); return EXIT_SUCCESS; } #endif #endif unsigned _starpu_opencl_get_device_count(void) { if (!init_done) { _starpu_opencl_init(); } return nb_devices; } #ifdef STARPU_USE_OPENCL cl_device_type _starpu_opencl_get_device_type(int devid) { int err; cl_device_type type; if (!init_done) _starpu_opencl_init(); err = clGetDeviceInfo(devices[devid], CL_DEVICE_TYPE, sizeof(cl_device_type), &type, NULL); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); return type; } #endif /* STARPU_USE_OPENCL */ static int _starpu_opencl_start_job(struct _starpu_job *j, struct _starpu_worker *worker, unsigned char pipeline_idx STARPU_ATTRIBUTE_UNUSED) { int ret; STARPU_ASSERT(j); struct starpu_task *task = j->task; int profiling = starpu_profiling_status_get(); STARPU_ASSERT(task); struct starpu_codelet *cl = task->cl; STARPU_ASSERT(cl); _starpu_set_current_task(j->task); ret = _starpu_fetch_task_input(j); if (ret != 0) { /* there was not enough memory, so the input of * the codelet cannot be fetched ... put the * codelet back, and try it later */ return -EAGAIN; } if (worker->ntasks == 1) { /* We are alone in the pipeline, the kernel will start now, record it */ _starpu_driver_start_job(worker, j, &worker->perf_arch, 0, profiling); } starpu_opencl_func_t func = _starpu_task_get_opencl_nth_implementation(cl, j->nimpl); STARPU_ASSERT_MSG(func, "when STARPU_OPENCL is defined in 'where', opencl_func or opencl_funcs has to be defined"); if (_starpu_get_disable_kernels() <= 0) { _STARPU_TRACE_START_EXECUTING(); #ifdef STARPU_SIMGRID double length = NAN; int async = task->cl->opencl_flags[j->nimpl] & STARPU_OPENCL_ASYNC; int simulate = 1; if (cl->flags & STARPU_CODELET_SIMGRID_EXECUTE && !async) { /* Actually execute function */ simulate = 0; func(_STARPU_TASK_GET_INTERFACES(task), task->cl_arg); #ifdef STARPU_OPENCL_SIMULATOR #ifndef CL_PROFILING_CLOCK_CYCLE_COUNT #ifdef CL_PROFILING_COMMAND_SHAVE_CYCLE_COUNT #define CL_PROFILING_CLOCK_CYCLE_COUNT CL_PROFILING_COMMAND_SHAVE_CYCLE_COUNT #else #error The OpenCL simulator must provide CL_PROFILING_CLOCK_CYCLE_COUNT #endif #endif struct starpu_profiling_task_info *profiling_info = task->profiling_info; STARPU_ASSERT_MSG(profiling_info->used_cycles, "Application kernel must call starpu_opencl_collect_stats to collect simulated time"); #ifdef HAVE_MSG_HOST_GET_SPEED length = ((double) profiling_info->used_cycles)/MSG_host_get_speed(MSG_host_self()); #else length = ((double) profiling_info->used_cycles)/MSG_get_host_speed(MSG_host_self()); #endif /* And give the simulated time to simgrid */ simulate = 1; #endif } if (simulate) _starpu_simgrid_submit_job(worker->workerid, j, &worker->perf_arch, length, async ? &task_finished[worker->devid][pipeline_idx] : NULL, async ? &task_mutex[worker->devid][pipeline_idx] : NULL, async ? &task_cond[worker->devid][pipeline_idx] : NULL); #else func(_STARPU_TASK_GET_INTERFACES(task), task->cl_arg); #endif _STARPU_TRACE_END_EXECUTING(); } return 0; } static void _starpu_opencl_stop_job(struct _starpu_job *j, struct _starpu_worker *worker) { int profiling = starpu_profiling_status_get(); _starpu_set_current_task(NULL); if (worker->pipeline_length) worker->current_tasks[worker->first_task] = NULL; else worker->current_task = NULL; worker->first_task = (worker->first_task + 1) % STARPU_MAX_PIPELINE; worker->ntasks--; _starpu_driver_end_job(worker, j, &worker->perf_arch, 0, profiling); struct _starpu_sched_ctx *sched_ctx = _starpu_sched_ctx_get_sched_ctx_for_worker_and_job(worker, j); STARPU_ASSERT_MSG(sched_ctx != NULL, "there should be a worker %d in the ctx of this job \n", worker->workerid); if(!sched_ctx->sched_policy) _starpu_driver_update_job_feedback(j, worker, &sched_ctx->perf_arch, profiling); else _starpu_driver_update_job_feedback(j, worker, &worker->perf_arch, profiling); _starpu_push_task_output(j); _starpu_handle_job_termination(j); } static void _starpu_opencl_execute_job(struct starpu_task *task, struct _starpu_worker *worker) { int res; struct _starpu_job *j = _starpu_get_job_associated_to_task(task); unsigned char pipeline_idx = (worker->first_task + worker->ntasks - 1)%STARPU_MAX_PIPELINE; res = _starpu_opencl_start_job(j, worker, pipeline_idx); if (res) { switch (res) { case -EAGAIN: _STARPU_DISP("ouch, OpenCL could not actually run task %p, putting it back...\n", task); _starpu_push_task_to_workers(task); STARPU_ABORT(); default: STARPU_ABORT(); } } if (task->cl->opencl_flags[j->nimpl] & STARPU_OPENCL_ASYNC) { /* Record event to synchronize with task termination later */ #ifndef STARPU_SIMGRID cl_command_queue queue; starpu_opencl_get_queue(worker->devid, &queue); #endif if (worker->pipeline_length == 0) { #ifdef STARPU_SIMGRID _starpu_simgrid_wait_tasks(worker->workerid); #else starpu_opencl_get_queue(worker->devid, &queue); clFinish(queue); #endif _starpu_opencl_stop_job(j, worker); } else { #ifndef STARPU_SIMGRID int err; /* the function clEnqueueMarker is deprecated from * OpenCL version 1.2. We would like to use the new * function clEnqueueMarkerWithWaitList. We could do * it by checking its availability through our own * configure macro HAVE_CLENQUEUEMARKERWITHWAITLIST * and the OpenCL macro CL_VERSION_1_2. However these * 2 macros detect the function availability in the * ICD and not in the device implementation. */ err = clEnqueueMarker(queue, &task_events[worker->devid][pipeline_idx]); _STARPU_OPENCL_CHECK_AND_REPORT_ERROR(err); #endif _STARPU_TRACE_START_EXECUTING(); } } else /* Synchronous execution */ { _starpu_opencl_stop_job(j, worker); } } #ifdef STARPU_USE_OPENCL int _starpu_run_opencl(struct _starpu_worker *workerarg) { _STARPU_DEBUG("Running OpenCL %u from the application\n", workerarg->devid); workerarg->set = NULL; workerarg->worker_is_initialized = 0; /* Let's go ! */ _starpu_opencl_worker(workerarg); return 0; } #endif /* STARPU_USE_OPENCL */ starpu-1.2.3+dfsg/src/drivers/opencl/driver_opencl.h000066400000000000000000000055361320135501600225100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013-2014 Université de Bordeaux * Copyright (C) 2010, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DRIVER_OPENCL_H__ #define __DRIVER_OPENCL_H__ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #ifdef STARPU_USE_OPENCL #ifdef __APPLE__ #include #else #include #endif #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) struct _starpu_machine_config; void _starpu_opencl_discover_devices(struct _starpu_machine_config *config); #else #define _starpu_opencl_discover_devices(config) ((void) (config)) #endif #ifdef STARPU_USE_OPENCL extern char *_starpu_opencl_program_dir; extern int _starpu_opencl_init_context(int devid); extern int _starpu_opencl_deinit_context(int devid); #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) extern unsigned _starpu_opencl_get_device_count(void); #endif #ifdef STARPU_USE_OPENCL extern cl_device_type _starpu_opencl_get_device_type(int devid); #if 0 extern cl_int _starpu_opencl_copy_rect_opencl_to_ram(cl_mem buffer, unsigned src_node, void *ptr, unsigned dst_node, const size_t buffer_origin[3], const size_t host_origin[3], const size_t region[3], size_t buffer_row_pitch, size_t buffer_slice_pitch, size_t host_row_pitch, size_t host_slice_pitch, cl_event *event); extern cl_int _starpu_opencl_copy_rect_ram_to_opencl(void *ptr, unsigned src_node, cl_mem buffer, unsigned dst_node, const size_t buffer_origin[3], const size_t host_origin[3], const size_t region[3], size_t buffer_row_pitch, size_t buffer_slice_pitch, size_t host_row_pitch, size_t host_slice_pitch, cl_event *event); #endif #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) extern void _starpu_opencl_init(void); extern void *_starpu_opencl_worker(void *); #endif #ifdef STARPU_USE_OPENCL struct _starpu_worker; extern int _starpu_run_opencl(struct _starpu_worker *); extern int _starpu_opencl_driver_init(struct _starpu_worker *); extern int _starpu_opencl_driver_run_once(struct _starpu_worker *); extern int _starpu_opencl_driver_deinit(struct _starpu_worker *); #endif // STARPU_USE_OPENCL #endif // __DRIVER_OPENCL_H__ starpu-1.2.3+dfsg/src/drivers/opencl/driver_opencl_utils.c000066400000000000000000000540451320135501600237220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012, 2014, 2015, 2016, 2017 CNRS * Copyright (C) 2010-2014, 2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include #include "driver_opencl_utils.h" #include "driver_opencl.h" #ifdef HAVE_CL_CL_EXT_H #include #endif char *_starpu_opencl_program_dir; #define _STARPU_STRINGIFY_(x) #x #define _STARPU_STRINGIFY(x) _STARPU_STRINGIFY_(x) static int _starpu_opencl_locate_file(const char *source_file_name, char **located_file_name, char **located_dir_name) { int ret = EXIT_FAILURE; *located_file_name = NULL; *located_dir_name = NULL; _STARPU_DEBUG("Trying to locate <%s>\n", source_file_name); if (access(source_file_name, R_OK) == 0) { _STARPU_CALLOC(*located_file_name, 1, strlen(source_file_name)+1); sprintf(*located_file_name, "%s", source_file_name); ret = EXIT_SUCCESS; } if (ret == EXIT_FAILURE && _starpu_opencl_program_dir) { _STARPU_CALLOC(*located_file_name, 1, strlen(_starpu_opencl_program_dir)+1+strlen(source_file_name)+1); sprintf(*located_file_name, "%s/%s", _starpu_opencl_program_dir, source_file_name); _STARPU_DEBUG("Trying to locate <%s>\n", *located_file_name); if (access(*located_file_name, R_OK) == 0) ret = EXIT_SUCCESS; } if (ret == EXIT_FAILURE) { _STARPU_CALLOC(*located_file_name, 1, strlen(STARPU_SRC_DIR)+1+strlen(source_file_name)+1); sprintf(*located_file_name, "%s/%s", STARPU_SRC_DIR, source_file_name); _STARPU_DEBUG("Trying to locate <%s>\n", *located_file_name); if (access(*located_file_name, R_OK) == 0) ret = EXIT_SUCCESS; } if (ret == EXIT_FAILURE) { _STARPU_CALLOC(*located_file_name, 1, strlen(_STARPU_STRINGIFY(STARPU_OPENCL_DATADIR))+1+strlen(source_file_name)+1); sprintf(*located_file_name, "%s/%s", _STARPU_STRINGIFY(STARPU_OPENCL_DATADIR), source_file_name); _STARPU_DEBUG("Trying to locate <%s>\n", *located_file_name); if (access(*located_file_name, R_OK) == 0) ret = EXIT_SUCCESS; } if (ret == EXIT_FAILURE) { _STARPU_ERROR("Cannot locate file <%s>\n", source_file_name); } else { char *last = strrchr(*located_file_name, '/'); if (!last) { _STARPU_CALLOC(*located_dir_name, 2, sizeof(char)); sprintf(*located_dir_name, "%s", ""); } else { _STARPU_CALLOC(*located_dir_name, 1, 1+strlen(*located_file_name)); sprintf(*located_dir_name, "%s", *located_file_name); (*located_dir_name)[strlen(*located_file_name)-strlen(last)+1] = '\0'; } } return ret; } cl_int starpu_opencl_load_kernel(cl_kernel *kernel, cl_command_queue *queue, struct starpu_opencl_program *opencl_programs, const char *kernel_name, int devid) { cl_int err; cl_device_id device; cl_program program; starpu_opencl_get_device(devid, &device); starpu_opencl_get_queue(devid, queue); program = opencl_programs->programs[devid]; if (!program) { _STARPU_DISP("Program not available for device <%d>\n", devid); return CL_INVALID_PROGRAM; } // Create the compute kernel in the program we wish to run *kernel = clCreateKernel(program, kernel_name, &err); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); return CL_SUCCESS; } cl_int starpu_opencl_release_kernel(cl_kernel kernel) { cl_int err; err = clReleaseKernel(kernel); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); return CL_SUCCESS; } static char *_starpu_opencl_load_program_source(const char *filename) { struct stat statbuf; FILE *fh; char *source; int x; int c; fh = fopen(filename, "r"); if (!fh) return NULL; stat(filename, &statbuf); _STARPU_MALLOC(source, statbuf.st_size + 1); for(c=fgetc(fh), x=0 ; c != EOF ; c =fgetc(fh), x++) { source[x] = (char)c; } source[x] = '\0'; _STARPU_EXTRA_DEBUG("OpenCL kernel <%s>\n", source); fclose(fh); return source; } static char *_starpu_opencl_load_program_binary(const char *filename, size_t *len) { struct stat statbuf; FILE *fh; char *binary; fh = fopen(filename, "r"); if (fh == 0) return NULL; stat(filename, &statbuf); binary = (char *) malloc(statbuf.st_size); if (!binary) { fclose(fh); return binary; } fread(binary, statbuf.st_size, 1, fh); fclose(fh); *len = statbuf.st_size; return binary; } static void _starpu_opencl_create_binary_directory(char *path, size_t maxlen) { static int _directory_created = 0; snprintf(path, maxlen, "%s/.starpu/opencl/", _starpu_get_home_path()); if (_directory_created == 0) { _STARPU_DEBUG("Creating directory %s\n", path); _starpu_mkpath_and_check(path, S_IRWXU); _directory_created = 1; } } char *_starpu_opencl_get_device_type_as_string(int id) { cl_device_type type; type = _starpu_opencl_get_device_type(id); switch (type) { case CL_DEVICE_TYPE_GPU: return "gpu"; case CL_DEVICE_TYPE_ACCELERATOR: return "acc"; case CL_DEVICE_TYPE_CPU: return "cpu"; default: return "unk"; } } static int _starpu_opencl_get_binary_name(char *binary_file_name, size_t maxlen, const char *source_file_name, int dev, cl_device_id device) { char binary_directory[1024]; char *p; cl_int err; cl_uint vendor_id; _starpu_opencl_create_binary_directory(binary_directory, 1024); p = strrchr(source_file_name, '/'); snprintf(binary_file_name, maxlen, "%s/%s", binary_directory, p?p:source_file_name); p = strstr(binary_file_name, ".cl"); if (p == NULL) p=binary_file_name + strlen(binary_file_name); err = clGetDeviceInfo(device, CL_DEVICE_VENDOR_ID, sizeof(vendor_id), &vendor_id, NULL); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); sprintf(p, ".%s.vendor_id_%d_device_id_%d", _starpu_opencl_get_device_type_as_string(dev), (int)vendor_id, dev); return CL_SUCCESS; } static int _starpu_opencl_compile_or_load_opencl_from_string(const char *opencl_program_source, const char* build_options, struct starpu_opencl_program *opencl_programs, const char* source_file_name) { unsigned int dev; unsigned int nb_devices; nb_devices = _starpu_opencl_get_device_count(); // Iterate over each device for(dev = 0; dev < nb_devices; dev ++) { cl_device_id device; cl_context context; cl_program program; cl_int err; if (opencl_programs) { opencl_programs->programs[dev] = NULL; } starpu_opencl_get_device(dev, &device); starpu_opencl_get_context(dev, &context); if (context == NULL) { _STARPU_DEBUG("[%u] is not a valid OpenCL context\n", dev); continue; } // Create the compute program from the source buffer program = clCreateProgramWithSource(context, 1, (const char **) &opencl_program_source, NULL, &err); if (!program || err != CL_SUCCESS) { _STARPU_DISP("Error: Failed to load program source with options %s!\n", build_options); return EXIT_FAILURE; } // Build the program executable err = clBuildProgram(program, 1, &device, build_options, NULL, NULL); // Get the status { cl_build_status status; size_t len; clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG, 0, NULL, &len); if (len > 2) { char *buffer; _STARPU_MALLOC(buffer, len); clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG, len, buffer, &len); _STARPU_DISP("Compilation output\n%s\n", buffer); free(buffer); } clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_STATUS, sizeof(status), &status, NULL); if (err != CL_SUCCESS || status != CL_BUILD_SUCCESS) { _STARPU_DISP("Error: Failed to build program executable!\n"); _STARPU_DISP("clBuildProgram: %d - clGetProgramBuildInfo: %d\n", err, status); return EXIT_FAILURE; } } // Store program if (opencl_programs) { opencl_programs->programs[dev] = program; } else { char binary_file_name[1024]; char *binary; size_t binary_len; FILE *fh; err = _starpu_opencl_get_binary_name(binary_file_name, 1024, source_file_name, dev, device); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); err = clGetProgramInfo(program, CL_PROGRAM_BINARY_SIZES, sizeof(size_t), &binary_len, NULL); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); _STARPU_MALLOC(binary, binary_len); err = clGetProgramInfo(program, CL_PROGRAM_BINARIES, sizeof(binary), &binary, NULL); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); fh = fopen(binary_file_name, "w"); if (fh == NULL) { _STARPU_DISP("Error: Failed to open file <%s>\n", binary_file_name); perror("fopen"); return EXIT_FAILURE; } fwrite(binary, binary_len, 1, fh); fclose(fh); free(binary); _STARPU_DEBUG("File <%s> created\n", binary_file_name); err = clReleaseProgram(program); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); } } return EXIT_SUCCESS; } void starpu_opencl_load_program_source_malloc(const char *source_file_name, char **located_file_name, char **located_dir_name, char **opencl_program_source) { // Locate source file _starpu_opencl_locate_file(source_file_name, located_file_name, located_dir_name); _STARPU_DEBUG("Source file name : <%s>\n", *located_file_name); _STARPU_DEBUG("Source directory name : <%s>\n", *located_dir_name); // Load the compute program from disk into a char * char *source = _starpu_opencl_load_program_source(*located_file_name); if(!source) _STARPU_ERROR("Failed to load compute program from file <%s>!\n", *located_file_name); _STARPU_MALLOC(*opencl_program_source, strlen(source)+1); sprintf(*opencl_program_source, "%s", source); free(source); } void starpu_opencl_load_program_source(const char *source_file_name, char *located_file_name, char *located_dir_name, char *opencl_program_source) { char *_located_file_name; char *_located_dir_name; // Locate source file _starpu_opencl_locate_file(source_file_name, &_located_file_name, &_located_dir_name); _STARPU_DEBUG("Source file name : <%s>\n", _located_file_name); _STARPU_DEBUG("Source directory name : <%s>\n", _located_dir_name); // Load the compute program from disk into a char * char *source = _starpu_opencl_load_program_source(_located_file_name); if(!source) _STARPU_ERROR("Failed to load compute program from file <%s>!\n", _located_file_name); sprintf(located_file_name, "%s", _located_file_name); free(_located_file_name); sprintf(located_dir_name, "%s", _located_dir_name); free(_located_dir_name); sprintf(opencl_program_source, "%s", source); free(source); } static int _starpu_opencl_compile_or_load_opencl_from_file(const char *source_file_name, struct starpu_opencl_program *opencl_programs, const char* build_options) { int nb_devices; int ret; char *located_file_name; char *located_dir_name; char new_build_options[1024]; char *opencl_program_source; // Do not try to load and compile the file if there is no devices nb_devices = starpu_opencl_worker_get_count(); if (nb_devices == 0) return EXIT_SUCCESS; starpu_opencl_load_program_source_malloc(source_file_name, &located_file_name, &located_dir_name, &opencl_program_source); if (!build_options) build_options = ""; if (!strcmp(located_dir_name, "")) { sprintf(new_build_options, "%s", build_options); } else if (build_options) sprintf(new_build_options, "-I %s %s", located_dir_name, build_options); else { sprintf(new_build_options, "-I %s", located_dir_name); } _STARPU_DEBUG("Build options: <%s>\n", new_build_options); ret = _starpu_opencl_compile_or_load_opencl_from_string(opencl_program_source, new_build_options, opencl_programs, source_file_name); _STARPU_DEBUG("located_file_name : <%s>\n", located_file_name); _STARPU_DEBUG("located_dir_name : <%s>\n", located_dir_name); free(located_file_name); free(located_dir_name); free(opencl_program_source); return ret; } int starpu_opencl_compile_opencl_from_file(const char *source_file_name, const char* build_options) { return _starpu_opencl_compile_or_load_opencl_from_file(source_file_name, NULL, build_options); } int starpu_opencl_compile_opencl_from_string(const char *opencl_program_source, const char *file_name, const char* build_options) { return _starpu_opencl_compile_or_load_opencl_from_string(opencl_program_source, build_options, NULL, file_name); } int starpu_opencl_load_opencl_from_string(const char *opencl_program_source, struct starpu_opencl_program *opencl_programs, const char* build_options) { return _starpu_opencl_compile_or_load_opencl_from_string(opencl_program_source, build_options, opencl_programs, NULL); } int starpu_opencl_load_opencl_from_file(const char *source_file_name, struct starpu_opencl_program *opencl_programs, const char* build_options) { return _starpu_opencl_compile_or_load_opencl_from_file(source_file_name, opencl_programs, build_options); } int starpu_opencl_load_binary_opencl(const char *kernel_id, struct starpu_opencl_program *opencl_programs) { unsigned int dev; unsigned int nb_devices; nb_devices = _starpu_opencl_get_device_count(); // Iterate over each device for(dev = 0; dev < nb_devices; dev ++) { cl_device_id device; cl_context context; cl_program program; cl_int err; char *binary; char binary_file_name[1024]; size_t length; cl_int binary_status; opencl_programs->programs[dev] = NULL; starpu_opencl_get_device(dev, &device); starpu_opencl_get_context(dev, &context); if (context == NULL) { _STARPU_DEBUG("[%u] is not a valid OpenCL context\n", dev); continue; } // Load the binary buffer err = _starpu_opencl_get_binary_name(binary_file_name, 1024, kernel_id, dev, device); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); binary = _starpu_opencl_load_program_binary(binary_file_name, &length); // Create the compute program from the binary buffer program = clCreateProgramWithBinary(context, 1, &device, &length, (const unsigned char **) &binary, &binary_status, &err); if (!program || err != CL_SUCCESS) { _STARPU_DISP("Error: Failed to load program binary!\n"); return EXIT_FAILURE; } // Build the program executable err = clBuildProgram(program, 1, &device, NULL, NULL, NULL); // Get the status { cl_build_status status; size_t len; clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG, 0, NULL, &len); if (len > 2) { char *buffer; _STARPU_MALLOC(buffer, len); clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG, len, buffer, &len); _STARPU_DISP("Compilation output\n%s\n", buffer); free(buffer); } clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_STATUS, sizeof(status), &status, NULL); if (err != CL_SUCCESS || status != CL_BUILD_SUCCESS) { _STARPU_DISP("Error: Failed to build program executable!\n"); _STARPU_DISP("clBuildProgram: %d - clGetProgramBuildInfo: %d\n", err, status); return EXIT_FAILURE; } } // Store program opencl_programs->programs[dev] = program; free(binary); } return 0; } int starpu_opencl_unload_opencl(struct starpu_opencl_program *opencl_programs) { unsigned int dev; unsigned int nb_devices; if (!starpu_opencl_worker_get_count()) return 0; nb_devices = _starpu_opencl_get_device_count(); // Iterate over each device for(dev = 0; dev < nb_devices; dev ++) { if (opencl_programs->programs[dev]) { cl_int err; err = clReleaseProgram(opencl_programs->programs[dev]); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); } } return 0; } int starpu_opencl_collect_stats(cl_event event STARPU_ATTRIBUTE_UNUSED) { #if defined(CL_PROFILING_CLOCK_CYCLE_COUNT)||defined(CL_PROFILING_STALL_CYCLE_COUNT)||defined(CL_PROFILING_POWER_CONSUMED) struct starpu_task *task = starpu_task_get_current(); struct starpu_profiling_task_info *info = task->profiling_info; #endif #ifdef CL_PROFILING_CLOCK_CYCLE_COUNT if (starpu_profiling_status_get() && info) { cl_int err; unsigned int clock_cycle_count; size_t size; err = clGetEventProfilingInfo(event, CL_PROFILING_CLOCK_CYCLE_COUNT, sizeof(clock_cycle_count), &clock_cycle_count, &size); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); STARPU_ASSERT(size == sizeof(clock_cycle_count)); info->used_cycles += clock_cycle_count; } #endif #ifdef CL_PROFILING_STALL_CYCLE_COUNT if (starpu_profiling_status_get() && info) { cl_int err; unsigned int stall_cycle_count; size_t size; err = clGetEventProfilingInfo(event, CL_PROFILING_STALL_CYCLE_COUNT, sizeof(stall_cycle_count), &stall_cycle_count, &size); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); STARPU_ASSERT(size == sizeof(stall_cycle_count)); info->stall_cycles += stall_cycle_count; } #endif #ifdef CL_PROFILING_POWER_CONSUMED if (info && (starpu_profiling_status_get() || (task->cl && task->cl->energy_model && task->cl->energy_model->benchmarking))) { cl_int err; double energy_consumed; size_t size; err = clGetEventProfilingInfo(event, CL_PROFILING_POWER_CONSUMED, sizeof(energy_consumed), &energy_consumed, &size); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); STARPU_ASSERT(size == sizeof(energy_consumed)); info->energy_consumed += energy_consumed; } #endif return 0; } const char *starpu_opencl_error_string(cl_int status) { const char *errormsg; switch (status) { case CL_SUCCESS: errormsg = "Success"; break; case CL_DEVICE_NOT_FOUND: errormsg = "Device not found"; break; case CL_DEVICE_NOT_AVAILABLE: errormsg = "Device not available"; break; case CL_COMPILER_NOT_AVAILABLE: errormsg = "Compiler not available"; break; case CL_MEM_OBJECT_ALLOCATION_FAILURE: errormsg = "Memory object allocation failure"; break; case CL_OUT_OF_RESOURCES: errormsg = "Out of resources"; break; case CL_OUT_OF_HOST_MEMORY: errormsg = "Out of host memory"; break; case CL_PROFILING_INFO_NOT_AVAILABLE: errormsg = "Profiling info not available"; break; case CL_MEM_COPY_OVERLAP: errormsg = "Memory copy overlap"; break; case CL_IMAGE_FORMAT_MISMATCH: errormsg = "Image format mismatch"; break; case CL_IMAGE_FORMAT_NOT_SUPPORTED: errormsg = "Image format not supported"; break; case CL_BUILD_PROGRAM_FAILURE: errormsg = "Build program failure"; break; case CL_MAP_FAILURE: errormsg = "Map failure"; break; case CL_INVALID_VALUE: errormsg = "Invalid value"; break; case CL_INVALID_DEVICE_TYPE: errormsg = "Invalid device type"; break; case CL_INVALID_PLATFORM: errormsg = "Invalid platform"; break; case CL_INVALID_DEVICE: errormsg = "Invalid device"; break; case CL_INVALID_CONTEXT: errormsg = "Invalid context"; break; case CL_INVALID_QUEUE_PROPERTIES: errormsg = "Invalid queue properties"; break; case CL_INVALID_COMMAND_QUEUE: errormsg = "Invalid command queue"; break; case CL_INVALID_HOST_PTR: errormsg = "Invalid host pointer"; break; case CL_INVALID_MEM_OBJECT: errormsg = "Invalid memory object"; break; case CL_INVALID_IMAGE_FORMAT_DESCRIPTOR: errormsg = "Invalid image format descriptor"; break; case CL_INVALID_IMAGE_SIZE: errormsg = "Invalid image size"; break; case CL_INVALID_SAMPLER: errormsg = "Invalid sampler"; break; case CL_INVALID_BINARY: errormsg = "Invalid binary"; break; case CL_INVALID_BUILD_OPTIONS: errormsg = "Invalid build options"; break; case CL_INVALID_PROGRAM: errormsg = "Invalid program"; break; case CL_INVALID_PROGRAM_EXECUTABLE: errormsg = "Invalid program executable"; break; case CL_INVALID_KERNEL_NAME: errormsg = "Invalid kernel name"; break; case CL_INVALID_KERNEL_DEFINITION: errormsg = "Invalid kernel definition"; break; case CL_INVALID_KERNEL: errormsg = "Invalid kernel"; break; case CL_INVALID_ARG_INDEX: errormsg = "Invalid argument index"; break; case CL_INVALID_ARG_VALUE: errormsg = "Invalid argument value"; break; case CL_INVALID_ARG_SIZE: errormsg = "Invalid argument size"; break; case CL_INVALID_KERNEL_ARGS: errormsg = "Invalid kernel arguments"; break; case CL_INVALID_WORK_DIMENSION: errormsg = "Invalid work dimension"; break; case CL_INVALID_WORK_GROUP_SIZE: errormsg = "Invalid work group size"; break; case CL_INVALID_WORK_ITEM_SIZE: errormsg = "Invalid work item size"; break; case CL_INVALID_GLOBAL_OFFSET: errormsg = "Invalid global offset"; break; case CL_INVALID_EVENT_WAIT_LIST: errormsg = "Invalid event wait list"; break; case CL_INVALID_EVENT: errormsg = "Invalid event"; break; case CL_INVALID_OPERATION: errormsg = "Invalid operation"; break; case CL_INVALID_GL_OBJECT: errormsg = "Invalid GL object"; break; case CL_INVALID_BUFFER_SIZE: errormsg = "Invalid buffer size"; break; case CL_INVALID_MIP_LEVEL: errormsg = "Invalid MIP level"; break; #ifdef CL_PLATFORM_NOT_FOUND_KHR case CL_PLATFORM_NOT_FOUND_KHR: errormsg = "Platform not found"; break; #endif default: errormsg = "unknown OpenCL error"; break; } return errormsg; } void starpu_opencl_display_error(const char *func, const char *file, int line, const char* msg, cl_int status) { printf("oops in %s (%s:%d) (%s) ... <%s> (%d) \n", func, file, line, msg, starpu_opencl_error_string (status), status); } int starpu_opencl_set_kernel_args(cl_int *error, cl_kernel *kernel, ...) { int i; va_list ap; va_start(ap, kernel); for (i = 0; ; i++) { int size = va_arg(ap, int); if (size == 0) break; cl_mem *ptr = va_arg(ap, cl_mem *); int err = clSetKernelArg(*kernel, i, size, ptr); if (STARPU_UNLIKELY(err != CL_SUCCESS)) { *error = err; break; } } va_end(ap); return i; } starpu-1.2.3+dfsg/src/drivers/opencl/driver_opencl_utils.h000066400000000000000000000015471320135501600237260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_OPENCL_UTILS_H__ #define __STARPU_OPENCL_UTILS_H__ #include char *_starpu_opencl_get_device_type_as_string(int id); #define _STARPU_OPENCL_PLATFORM_MAX 4 #endif /* __STARPU_OPENCL_UTILS_H__ */ starpu-1.2.3+dfsg/src/drivers/scc/000077500000000000000000000000001320135501600167635ustar00rootroot00000000000000starpu-1.2.3+dfsg/src/drivers/scc/driver_scc_common.c000066400000000000000000000107541320135501600226310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include static int rcce_initialized; static int src_node_id; static t_vcharp rckncm_map; static t_vcharp shm_addr; static void _starpu_scc_set_src_node_id() { int node_id = starpu_get_env_number("STARPU_SCC_MASTER_NODE"); if (node_id != -1) { if (node_id < RCCE_num_ues()) { src_node_id = node_id; return; } else if (RCCE_ue() == 0) { /* Only node 0 print the error message. */ _STARPU_MSG("The node you specify to be the master is " "greater than the total number of nodes.\n" "Taking node 0 (core %d) by default...\n", RC_COREID[0]); } } /* Node 0 by default. */ src_node_id = 0; } /* Try to init the RCCE API. * return: 1 on success * 0 on failure */ int _starpu_scc_common_mp_init() { int rckncm_fd; rcce_initialized = 0; /* "/dev/rckncm" is to access shared memory on SCC. */ if ((rckncm_fd = open("/dev/rckncm", O_RDWR | O_SYNC)) < 0) { /* It seems that we're not on a SCC system. */ return rcce_initialized; } int page_size = getpagesize(); unsigned int aligne_addr = (SHM_ADDR) & (~(page_size - 1)); if ((rckncm_map = (t_vcharp)mmap(NULL, SHMSIZE, PROT_WRITE | PROT_READ, MAP_SHARED, rckncm_fd, aligne_addr)) == MAP_FAILED) { perror("mmap"); close(rckncm_fd); return rcce_initialized; } int *argc = _starpu_get_argc(); char ***argv = _starpu_get_argv(); /* We can't initialize RCCE without argc and argv. */ if (!argc || *argc <= 1 || !argv || (RCCE_init(argc, argv) != RCCE_SUCCESS)) { close(rckncm_fd); munmap((void*)rckncm_map, SHMSIZE); return 0; } unsigned int page_offset = (SHM_ADDR) - aligne_addr; shm_addr = rckncm_map + page_offset; RCCE_shmalloc_init(shm_addr, RCCE_SHM_SIZE_MAX); /* Which core of the SCC will be the master one? */ _starpu_scc_set_src_node_id(); close(rckncm_fd); rcce_initialized = 1; return rcce_initialized; } void *_starpu_scc_common_get_shared_memory_addr() { return (void*)shm_addr; } void _starpu_scc_common_unmap_shared_memory() { munmap((void*)rckncm_map, SHMSIZE); } /* To know if the pointer "ptr" points into the shared memory map */ int _starpu_scc_common_is_in_shared_memory(void *ptr) { return (void*)shm_addr <= ptr && ptr < (void*)((uintptr_t)shm_addr + SHMSIZE); } int _starpu_scc_common_is_mp_initialized() { return rcce_initialized; } int _starpu_scc_common_get_src_node_id() { return src_node_id; } int _starpu_scc_common_is_src_node() { return RCCE_ue() == src_node_id; } void _starpu_scc_common_send(const struct _starpu_mp_node *node, void *msg, int len) { int ret; /* There are potentially 48 threads running on the master core and RCCE_send write * data in the MPB associated to this core. It's not thread safe, so we have to protect it. * RCCE_acquire_lock uses a test&set register on SCC. */ RCCE_acquire_lock(RCCE_ue()); if ((ret = RCCE_send(msg, len, node->mp_connection.scc_nodeid)) != RCCE_SUCCESS) { RCCE_release_lock(RCCE_ue()); STARPU_MP_COMMON_REPORT_ERROR(node, ret); } RCCE_release_lock(RCCE_ue()); } void _starpu_scc_common_recv(const struct _starpu_mp_node *node, void *msg, int len) { int ret; if ((ret = RCCE_recv(msg, len, node->mp_connection.scc_nodeid)) != RCCE_SUCCESS) STARPU_MP_COMMON_REPORT_ERROR(node, ret); } void _starpu_scc_common_report_rcce_error(const char *func, const char *file, const int line, const int err_no) { char error_string[RCCE_MAX_ERROR_STRING]; int error_string_length; RCCE_error_string(err_no, error_string, &error_string_length); _STARPU_MSG("RCCE error in %s (%s:%d): %s\n", func, file, line, error_string); STARPU_ABORT(); } int _starpu_scc_common_recv_is_ready(const struct _starpu_mp_node *mp_node) { /*********** TODO ************/ STARPU_ASSERT(0); } starpu-1.2.3+dfsg/src/drivers/scc/driver_scc_common.h000066400000000000000000000031441320135501600226310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DRIVER_SCC_COMMON_H__ #define __DRIVER_SCC_COMMON_H__ #include #ifdef STARPU_USE_SCC #include #include #define STARPU_TO_SCC_SINK_ID(id) (id) < RCCE_ue() ? (id) : ((id) + 1) int _starpu_scc_common_mp_init(); void *_starpu_scc_common_get_shared_memory_addr(); void _starpu_scc_common_unmap_shared_memory(); int _starpu_scc_common_is_in_shared_memory(void *ptr); int _starpu_scc_common_is_mp_initialized(); int _starpu_scc_common_get_src_node_id(); int _starpu_scc_common_is_src_node(); void _starpu_scc_common_send(const struct _starpu_mp_node *node, void *msg, int len); void _starpu_scc_common_recv(const struct _starpu_mp_node *node, void *msg, int len); void _starpu_scc_common_report_rcce_error(const char *func, const char *file, const int line, const int err_no); int _starpu_scc_common_recv_is_ready(const struct _starpu_mp_node *mp_node); #endif /* STARPU_USE_SCC */ #endif /* __DRIVER_SCC_COMMON_H__ */ starpu-1.2.3+dfsg/src/drivers/scc/driver_scc_sink.c000066400000000000000000000110231320135501600222730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include void _starpu_scc_sink_init(struct _starpu_mp_node *node) { node->mp_connection.scc_nodeid = _starpu_scc_common_get_src_node_id(); /**************** * TODO * * get nb_cores * ****************/ node->nb_cores = 1; STARPU_ASSERT(0); } void _starpu_scc_sink_launch_workers(struct _starpu_mp_node *node) { /***************** * TODO * * init thread * *****************/ STARPU_ASSERT(0); } void _starpu_scc_sink_deinit(struct _starpu_mp_node *node) { (void)node; _starpu_scc_common_unmap_shared_memory(); RCCE_finalize(); } void _starpu_scc_sink_send_to_device(const struct _starpu_mp_node *node, int dst_devid, void *msg, int len) { int ret; if ((ret = RCCE_send(msg, len, STARPU_TO_SCC_SINK_ID(dst_devid))) != RCCE_SUCCESS) STARPU_MP_COMMON_REPORT_ERROR(node, ret); } void _starpu_scc_sink_recv_from_device(const struct _starpu_mp_node *node, int src_devid, void *msg, int len) { int ret; if ((ret = RCCE_recv(msg, len, STARPU_TO_SCC_SINK_ID(src_devid))) != RCCE_SUCCESS) STARPU_MP_COMMON_REPORT_ERROR(node, ret); } void _starpu_scc_sink_bind_thread(const struct _starpu_mp_node *mp_node STARPU_ATTRIBUTE_UNUSED, cpu_set_t * cpuset, int coreid, starpu_pthread_t *thread) { /**************** * TODO * ****************/ STARPU_ASSERT(0); } /* arg -> [Function pointer on sink, number of interfaces, interfaces * (union _starpu_interface), cl_arg] * * This function change the dev_handle and the ptr of each interfaces * given to the sink. * dev_handle -> start of the shared memory (different for each sink) * ptr -> dev_handle + offset */ void _starpu_scc_sink_execute(const struct _starpu_mp_node *node, void *arg, int arg_size) { void *local_arg = arg; /* point after the kernel */ local_arg = (void*) ((uintptr_t)local_arg + sizeof(void(*)(void**, void*))); unsigned nb_interfaces = *(unsigned*)local_arg; local_arg = (void*) ((uintptr_t)local_arg + sizeof(nb_interfaces)); uintptr_t shm_addr = (uintptr_t)_starpu_scc_common_get_shared_memory_addr(); unsigned i; for (i = 0; i < nb_interfaces; ++i) { /* The first field of an interface is the interface id. */ switch (*(enum starpu_data_interface_id *)local_arg) { case STARPU_MATRIX_INTERFACE_ID: { struct starpu_matrix_interface *matrix = (struct starpu_matrix_interface *)local_arg; matrix->dev_handle = shm_addr; matrix->ptr = matrix->dev_handle + matrix->offset; break; } case STARPU_BLOCK_INTERFACE_ID: { struct starpu_block_interface *block = (struct starpu_block_interface *)local_arg; block->dev_handle = shm_addr; block->ptr = block->dev_handle + block->offset; break; } case STARPU_VECTOR_INTERFACE_ID: { struct starpu_vector_interface *vector = (struct starpu_vector_interface *)local_arg; vector->dev_handle = shm_addr; vector->ptr = vector->dev_handle + vector->offset; break; } case STARPU_VARIABLE_INTERFACE_ID: { struct starpu_variable_interface *variable = (struct starpu_variable_interface *)local_arg; variable->dev_handle = shm_addr; variable->ptr = variable->dev_handle + variable->offset; break; } case STARPU_CSR_INTERFACE_ID: case STARPU_BCSR_INTERFACE_ID: case STARPU_MULTIFORMAT_INTERFACE_ID: _STARPU_MSG("Data type not supported on SCC.\n"); default: STARPU_ABORT(); } /* point to the next interface */ local_arg = (void*)((uintptr_t)local_arg + sizeof(union _starpu_interface)); } _starpu_sink_common_execute(node, arg, arg_size); } void (*_starpu_scc_sink_lookup (const struct _starpu_mp_node * node STARPU_ATTRIBUTE_UNUSED, char* func_name))(void) { void *dl_handle = dlopen(NULL, RTLD_NOW); return dlsym(dl_handle, func_name); } starpu-1.2.3+dfsg/src/drivers/scc/driver_scc_sink.h000066400000000000000000000031401320135501600223010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DRIVER_SCC_SINK_H__ #define __DRIVER_SCC_SINK_H__ #include #ifdef STARPU_USE_SCC #include void _starpu_scc_sink_init(struct _starpu_mp_node *node); void _starpu_scc_sink_launch_workers(struct _starpu_mp_node *node); void _starpu_scc_sink_deinit(struct _starpu_mp_node *node); void _starpu_scc_sink_send_to_device(const struct _starpu_mp_node *node, int dst_devid, void *msg, int len); void _starpu_scc_sink_recv_from_device(const struct _starpu_mp_node *node, int src_devid, void *msg, int len); void _starpu_scc_sink_bind_thread(const struct _starpu_mp_node *mp_node STARPU_ATTRIBUTE_UNUSED, cpu_set_t * cpuset, int coreid, starpu_pthread_t *thread); void _starpu_scc_sink_execute(const struct _starpu_mp_node *node, void *arg, int arg_size); void (*_starpu_scc_sink_lookup (const struct _starpu_mp_node * node STARPU_ATTRIBUTE_UNUSED, char* func_name))(void); #endif /* STARPU_USE_SCC */ #endif /* __DRIVER_SCC_SINK_H__ */ starpu-1.2.3+dfsg/src/drivers/scc/driver_scc_source.c000066400000000000000000000217011320135501600226330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include static struct _starpu_mp_node *scc_mp_nodes[STARPU_MAXSCCDEVS]; struct _starpu_scc_kernel { UT_hash_handle hh; char *name; starpu_scc_kernel_t func[STARPU_MAXSCCDEVS]; } *kernels; starpu_pthread_mutex_t htbl_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static struct _starpu_mp_node *_starpu_scc_src_memory_node_to_mp_node(unsigned memory_node) { int devid = _starpu_memory_node_get_devid(memory_node); STARPU_ASSERT(devid < STARPU_MAXSCCDEVS); return scc_mp_nodes[devid]; } static void _starpu_scc_src_init_context(int devid) { /* Let's create the node structure, we'll communicate with the peer * through RCCE thanks to it */ scc_mp_nodes[devid] = _starpu_mp_common_node_create(STARPU_SCC_SOURCE, devid); } static void _starpu_scc_src_deinit_context(int devid) { _starpu_mp_common_send_command(scc_mp_nodes[devid], STARPU_EXIT, NULL, 0); _starpu_mp_common_node_destroy(scc_mp_nodes[devid]); } void (*_starpu_scc_src_get_kernel_from_job(const struct _starpu_mp_node *,struct _starpu_job *j))(void) { starpu_scc_kernel_t kernel = NULL; starpu_scc_func_t func = _starpu_task_get_scc_nth_implementation(j->task->cl, j->nimpl); if (func) { /* We execute the function contained in the codelet, it must return a * pointer to the function to execute on the device, either specified * directly by the user or by a call to starpu_scc_get_kernel(). */ kernel = func(); } else { /* If user doesn't define any starpu_scc_func_t in cl->scc_funcs we try to use * cpu_funcs_name. */ char *func_name = _starpu_task_get_cpu_name_nth_implementation(j->task->cl, j->nimpl); if (func_name) { starpu_scc_func_symbol_t symbol; _starpu_scc_src_register_kernel(&symbol, func_name); kernel = _starpu_scc_src_get_kernel(symbol); } } STARPU_ASSERT_MSG(kernel, "when STARPU_MIC is defined in 'where', mic_funcs or cpu_funcs_name has to be defined"); return (void (*)(void))kernel; } void _starpu_scc_src_mp_deinit() { _starpu_scc_common_unmap_shared_memory(); RCCE_finalize(); } int _starpu_scc_src_register_kernel(starpu_scc_func_symbol_t *symbol, const char *func_name) { unsigned int func_name_size = (strlen(func_name) + 1) * sizeof(char); STARPU_PTHREAD_MUTEX_LOCK(&htbl_mutex); struct _starpu_scc_kernel *kernel; HASH_FIND_STR(kernels, func_name, kernel); if (kernel != NULL) { STARPU_PTHREAD_MUTEX_UNLOCK(&htbl_mutex); // Function already in the table. *symbol = kernel; return 0; } kernel = malloc(sizeof(*kernel)); if (kernel == NULL) { STARPU_PTHREAD_MUTEX_UNLOCK(&htbl_mutex); return -ENOMEM; } kernel->name = malloc(func_name_size); if (kernel->name == NULL) { STARPU_PTHREAD_MUTEX_UNLOCK(&htbl_mutex); free(kernel); return -ENOMEM; } memcpy(kernel->name, func_name, func_name_size); HASH_ADD_STR(kernels, name, kernel); unsigned int nb_scc_devices = starpu_scc_worker_get_count(); unsigned int i; for (i = 0; i < nb_scc_devices; ++i) kernel->func[i] = NULL; STARPU_PTHREAD_MUTEX_UNLOCK(&htbl_mutex); *symbol = kernel; return 0; } starpu_scc_kernel_t _starpu_scc_src_get_kernel(starpu_scc_func_symbol_t symbol) { int workerid = starpu_worker_get_id(); /* This function has to be called in the codelet only, by the thread * which will handle the task */ if (workerid < 0) return NULL; int devid = starpu_worker_get_devid(workerid); struct _starpu_scc_kernel *kernel = symbol; if (kernel->func[devid] == NULL) { struct _starpu_mp_node *node = scc_mp_nodes[devid]; int ret = _starpu_src_common_lookup(node, (void (**)(void))&kernel->func[devid], kernel->name); if (ret) return NULL; } return kernel->func[devid]; } unsigned _starpu_scc_src_get_device_count() { int nb_scc_devices; if (!_starpu_scc_common_is_mp_initialized()) { return 0; } nb_scc_devices = RCCE_num_ues() - 1; nb_scc_devices = nb_scc_devices < 0 ? 0 : nb_scc_devices; return nb_scc_devices; } void _starpu_scc_exit_useless_node(int devid) { struct _starpu_mp_node *node = _starpu_mp_common_node_create(STARPU_SCC_SOURCE, devid); _starpu_mp_common_send_command(node, STARPU_EXIT, NULL, 0); _starpu_mp_common_node_destroy(node); } void _starpu_scc_src_init(struct _starpu_mp_node *node) { node->mp_connection.scc_nodeid = STARPU_TO_SCC_SINK_ID(node->peer_id); } /* Allocate memory on SCC. * Return 0 if OK or 1 if not. */ int _starpu_scc_allocate_memory(void **addr, size_t size, unsigned memory_node) { return _starpu_src_common_allocate(_starpu_scc_src_memory_node_to_mp_node(memory_node), addr, size); } /* Free memory on SCC. */ void _starpu_scc_free_memory(void *addr, unsigned memory_node) { return _starpu_src_common_free(_starpu_scc_src_memory_node_to_mp_node(memory_node), addr); } int _starpu_scc_allocate_shared_memory(void **addr, size_t size) { return (*addr = (void*)RCCE_shmalloc(size)) == NULL; } void _starpu_scc_free_shared_memory(void *addr) { RCCE_shfree(addr); } /* Assigns the offset to "offset" between "ptr" and the start of the shared memory. * Affect "dev_handle" with the start of the shared memory is useful for data * partionning. */ void _starpu_scc_set_offset_in_shared_memory(void *ptr, void **dev_handle, size_t *offset) { /* We're on SCC... */ if (_starpu_can_submit_scc_task()) { if (!_starpu_scc_common_is_in_shared_memory(ptr)) { _STARPU_MSG("The data (%p) you want to register does not seem to be allocated in shared memory. " "Please use starpu_malloc to do this.\n", ptr); STARPU_ABORT(); } void *shm_addr = _starpu_scc_common_get_shared_memory_addr(); if (dev_handle) *dev_handle = shm_addr; if (offset) *offset = ptr - shm_addr; } } /* Transfert SIZE bytes from the address pointed by SRC in the SRC_NODE memory * node to the address pointed by DST in the DST_NODE memory node */ int _starpu_scc_copy_src_to_sink(void *src, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst, unsigned dst_node, size_t size) { return _starpu_src_common_copy_host_to_sink(_starpu_scc_src_memory_node_to_mp_node(dst_node), src, dst, size); } /* Transfert SIZE bytes from the address pointed by SRC in the SRC_NODE memory * node to the address pointed by DST in the DST_NODE memory node */ int _starpu_scc_copy_sink_to_src(void *src, unsigned src_node, void *dst, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, size_t size) { return _starpu_src_common_copy_sink_to_host(_starpu_scc_src_memory_node_to_mp_node(src_node), src, dst, size); } int _starpu_scc_copy_sink_to_sink(void *src, unsigned src_node, void *dst, unsigned dst_node, size_t size) { return _starpu_src_common_copy_sink_to_sink(_starpu_scc_src_memory_node_to_mp_node(src_node), _starpu_scc_src_memory_node_to_mp_node(dst_node), src, dst, size); } void *_starpu_scc_src_worker(void *arg) { struct _starpu_worker_set *args = arg; int devid = args->devid; int workerid = args->workerid; struct _starpu_machine_config *config = args->config; unsigned baseworkerid = args - config->workers; unsigned subworkerid = args->subworkerid; unsigned i; _starpu_driver_start(args, _STARPU_FUT_SCC_KEY, 0); _starpu_scc_src_init_context(subworkerid); for (i = 0; i < config->topology.nmiccores[devid]; i++) { struct _starpu_worker *worker = &config->workers[baseworkerid+i]; snprintf(worker->name, sizeof(worker->name), "SCC %d core %u", devid, i); snprintf(worker->short_name, sizeof(worker->short_name), "SCC %d core %u", devid, i); } { char thread_name[16]; snprintf(thread_name, sizeof(thread_name), "SCC %d", devid); starpu_pthread_setname(thread_name); } _STARPU_TRACE_WORKER_INIT_END(workerid); /* tell the main thread that this one is ready */ STARPU_PTHREAD_MUTEX_LOCK(&args->mutex); args->status = STATUS_UNKNOWN; args->worker_is_initialized = 1; STARPU_PTHREAD_COND_SIGNAL(&args->ready_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&args->mutex); _starpu_src_common_worker(args, baseworkerid, scc_mp_nodes[devid]); _STARPU_TRACE_WORKER_DEINIT_START; _starpu_scc_src_deinit_context(args->subworkerid); worker->worker_is_initialized = 0; _STARPU_TRACE_WORKER_DEINIT_END(_STARPU_FUT_SCC_KEY); return NULL; } starpu-1.2.3+dfsg/src/drivers/scc/driver_scc_source.h000066400000000000000000000041341320135501600226410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DRIVER_SCC_SOURCE_H__ #define __DRIVER_SCC_SOURCE_H__ #include #include #include #ifdef STARPU_USE_SCC #include void _starpu_scc_src_mp_deinit(); void (*_starpu_scc_src_get_kernel_from_job(const struct _starpu_mp_node *,struct _starpu_job *j))(void); int _starpu_scc_src_register_kernel(starpu_scc_func_symbol_t *symbol, const char *func_name); starpu_scc_kernel_t _starpu_scc_src_get_kernel(starpu_scc_func_symbol_t symbol); unsigned _starpu_scc_src_get_device_count(); void _starpu_scc_exit_useless_node(int devid); void _starpu_scc_src_init(struct _starpu_mp_node *node); int _starpu_scc_allocate_memory(void **addr, size_t size, unsigned memory_node); void _starpu_scc_free_memory(void *addr, unsigned memory_node); int _starpu_scc_allocate_shared_memory(void **addr, size_t size); void _starpu_scc_free_shared_memory(void *addr); void _starpu_scc_set_offset_in_shared_memory(void *ptr, void **dev_handle, size_t *offset); int _starpu_scc_copy_src_to_sink(void *src, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst, unsigned dst_node, size_t size); int _starpu_scc_copy_sink_to_src(void *src, unsigned src_node, void *dst, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, size_t size); int _starpu_scc_copy_sink_to_sink(void *src, unsigned src_node, void *dst, unsigned dst_node, size_t size); void *_starpu_scc_src_worker(void *arg); #endif /* STARPU_USE_SCC */ #endif /* __DRIVER_SCC_SOURCE_H__ */ starpu-1.2.3+dfsg/src/drivers/scc/driver_scc_utils.c000066400000000000000000000027541320135501600225020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include /* Initiate a lookup on each SCC device to find the adress of the function * named FUNC_NAME, store them in the global array kernels and return * the index in the array through SYMBOL. * If success, returns 0. If the user has registered too many kernels (more * than STARPU_MAXSCCDEVS) returns -ENOMEM */ int starpu_scc_register_kernel(starpu_scc_func_symbol_t *symbol, const char *func_name) { return _starpu_scc_src_register_kernel(symbol, func_name); } /* If success, return the pointer to the function defined by SYMBOL on the * device linked to the called * device. */ starpu_scc_kernel_t starpu_scc_get_kernel(starpu_scc_func_symbol_t symbol) { return _starpu_scc_src_get_kernel(symbol); } starpu-1.2.3+dfsg/src/profiling/000077500000000000000000000000001320135501600165265ustar00rootroot00000000000000starpu-1.2.3+dfsg/src/profiling/bound.c000066400000000000000000000777771320135501600200320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012, 2013, 2017 CNRS * Copyright (C) 2010-2017 Université de Bordeaux * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * Record which kinds of tasks have been executed, to later on compute an upper * bound of the performance that could have theoretically been achieved */ #include #include #include #include #include #ifdef STARPU_HAVE_GLPK_H #include #endif /* STARPU_HAVE_GLPK_H */ /* TODO: output duration between starpu_bound_start and starpu_bound_stop */ /* TODO: compute critical path and introduce it in the LP */ /* * Record without dependencies: just count each kind of task * * The linear programming problem will just have as variables: * - the number of tasks of kind `t' executed by worker `w' * - the total duration * * and the constraints will be: * - the time taken by each worker to complete its assigned tasks is lower than * the total duration. * - the total numer of tasks of a given kind is equal to the number run by the * application. */ struct bound_task_pool { /* Which codelet has been executed */ struct starpu_codelet *cl; /* Task footprint key (for history-based perfmodel) */ uint32_t footprint; /* Number of tasks of this kind */ unsigned long n; /* Other task kinds */ struct bound_task_pool *next; }; /* * Record with dependencies: each task is recorded separately * * The linear programming problem will have as variables: * - The start time of each task * - The completion time of each tag * - The total duration * - For each task and for each worker, whether the task is executing on that worker. * - For each pair of task, which task is scheduled first. * * and the constraints will be: * - All task start time plus duration are less than total duration * - Each task is executed on exactly one worker. * - Each task starts after all its task dependencies finish. * - Each task starts after all its tag dependencies finish. * - For each task pair and each worker, if both tasks are executed by that worker, * one is started after the other's completion. */ struct task_dep { /* Task this depends on */ struct bound_task *dep; /* Data transferred between tasks (i.e. implicit data dep size) */ size_t size; }; struct bound_task { /* Unique ID */ unsigned long id; /* Tag ID, if any */ starpu_tag_t tag_id; int use_tag; /* Which codelet has been executed */ struct starpu_codelet *cl; /* Task footprint key */ uint32_t footprint; /* Task priority */ int priority; /* Tasks this one depends on */ struct task_dep *deps; int depsn; /* Estimated duration */ double** duration[STARPU_NARCH]; /* Other tasks */ struct bound_task *next; }; struct bound_tag_dep { starpu_tag_t tag; starpu_tag_t dep_tag; struct bound_tag_dep *next; }; static struct bound_task_pool *task_pools, *last; static struct bound_task *tasks; static struct bound_tag_dep *tag_deps; int _starpu_bound_recording; static int recorddeps; static int recordprio; static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; /* Initialization */ void starpu_bound_start(int deps, int prio) { struct bound_task_pool *tp; struct bound_task *t; struct bound_tag_dep *td; STARPU_PTHREAD_MUTEX_LOCK(&mutex); tp = task_pools; task_pools = NULL; last = NULL; t = tasks; tasks = NULL; td = tag_deps; tag_deps = NULL; _starpu_bound_recording = 1; recorddeps = deps; recordprio = prio; STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); while (tp != NULL) { struct bound_task_pool *next = tp->next; free(tp); tp = next; } while (t != NULL) { struct bound_task *next = t->next; free(t); t = next; } while (td != NULL) { struct bound_tag_dep *next = td->next; free(td); td = next; } } /* Whether we will include it in the computation */ static int good_job(struct _starpu_job *j) { /* No codelet, nothing to measure */ if (j->exclude_from_dag) return 0; if (!j->task->cl) return 0; /* No performance model, no time duration estimation */ if (!j->task->cl->model) return 0; /* Only support history based */ if (j->task->cl->model->type != STARPU_HISTORY_BASED && j->task->cl->model->type != STARPU_NL_REGRESSION_BASED) return 0; return 1; } static double** initialize_arch_duration(int maxdevid, unsigned* maxncore_table) { int devid, maxncore; double **arch_model; _STARPU_MALLOC(arch_model, sizeof(*arch_model)*(maxdevid+1)); arch_model[maxdevid] = NULL; for(devid=0; devidduration[STARPU_CPU_WORKER] = initialize_arch_duration(1,&conf->topology.nhwcpus); task->duration[STARPU_CUDA_WORKER] = initialize_arch_duration(conf->topology.nhwcudagpus,NULL); task->duration[STARPU_OPENCL_WORKER] = initialize_arch_duration(conf->topology.nhwopenclgpus,NULL); task->duration[STARPU_MIC_WORKER] = initialize_arch_duration(conf->topology.nhwmicdevices,conf->topology.nmiccores); task->duration[STARPU_SCC_WORKER] = initialize_arch_duration(conf->topology.nhwscc,NULL); } static struct starpu_perfmodel_device device = { .type = STARPU_CPU_WORKER, .devid = 0, .ncores = 1, }; static struct starpu_perfmodel_arch dumb_arch = { .ndevices = 1, .devices = &device, }; /* Create a new task (either because it has just been submitted, or a * dependency was added before submission) */ static void new_task(struct _starpu_job *j) { struct bound_task *t; if (j->bound_task) return; _STARPU_MALLOC(t, sizeof(*t)); memset(t, 0, sizeof(*t)); t->id = j->job_id; t->tag_id = j->task->tag_id; t->use_tag = j->task->use_tag; t->cl = j->task->cl; t->footprint = _starpu_compute_buffers_footprint(j->task->cl?j->task->cl->model:NULL, &dumb_arch, 0, j); t->priority = j->task->priority; t->deps = NULL; t->depsn = 0; initialize_duration(t); t->next = tasks; j->bound_task = t; tasks = t; } /* A new task was submitted, record it */ void _starpu_bound_record(struct _starpu_job *j) { if (!_starpu_bound_recording) return; if (!good_job(j)) return; STARPU_PTHREAD_MUTEX_LOCK(&mutex); /* Re-check, this time with mutex held */ if (!_starpu_bound_recording) { STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); return; } if (recorddeps) { new_task(j); } else { struct bound_task_pool *tp; _starpu_compute_buffers_footprint(j->task->cl?j->task->cl->model:NULL, NULL, 0, j); if (last && last->cl == j->task->cl && last->footprint == j->footprint) tp = last; else for (tp = task_pools; tp; tp = tp->next) if (tp->cl == j->task->cl && tp->footprint == j->footprint) break; if (!tp) { _STARPU_MALLOC(tp, sizeof(*tp)); tp->cl = j->task->cl; tp->footprint = j->footprint; tp->n = 0; tp->next = task_pools; task_pools = tp; } /* One more task of this kind */ tp->n++; } STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } /* A tag dependency was emitted, record it */ void _starpu_bound_tag_dep(starpu_tag_t id, starpu_tag_t dep_id) { struct bound_tag_dep *td; if (!_starpu_bound_recording || !recorddeps) return; STARPU_PTHREAD_MUTEX_LOCK(&mutex); /* Re-check, this time with mutex held */ if (!_starpu_bound_recording || !recorddeps) { STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); return; } _STARPU_MALLOC(td, sizeof(*td)); td->tag = id; td->dep_tag = dep_id; td->next = tag_deps; tag_deps = td; STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } /* A task dependency was emitted, record it */ void _starpu_bound_task_dep(struct _starpu_job *j, struct _starpu_job *dep_j) { struct bound_task *t; int i; if (!_starpu_bound_recording || !recorddeps) return; if (!good_job(j) || !good_job(dep_j)) return; STARPU_PTHREAD_MUTEX_LOCK(&mutex); /* Re-check, this time with mutex held */ if (!_starpu_bound_recording || !recorddeps) { STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); return; } new_task(j); new_task(dep_j); t = j->bound_task; for (i = 0; i < t->depsn; i++) if (t->deps[i].dep == dep_j->bound_task) break; if (i == t->depsn) { /* Not already there, add */ _STARPU_REALLOC(t->deps, ++t->depsn * sizeof(t->deps[0])); t->deps[t->depsn-1].dep = dep_j->bound_task; t->deps[t->depsn-1].size = 0; /* We don't have data information in that case */ } STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } /* Look for job with id ID among our tasks */ static struct bound_task *find_job(unsigned long id) { struct bound_task *t; for (t = tasks; t; t = t->next) if (t->id == id) return t; return NULL; } /* Job J depends on previous job of id ID (which is already finished) */ void _starpu_bound_job_id_dep(starpu_data_handle_t handle, struct _starpu_job *j, unsigned long id) { struct bound_task *t, *dep_t; int i; if (!_starpu_bound_recording || !recorddeps) return; if (!good_job(j)) return; STARPU_PTHREAD_MUTEX_LOCK(&mutex); /* Re-check, this time with mutex held */ if (!_starpu_bound_recording || !recorddeps) { STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); return; } new_task(j); dep_t = find_job(id); if (!dep_t) { _STARPU_MSG("dependency %lu not found !\n", id); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); return; } t = j->bound_task; for (i = 0; i < t->depsn; i++) if (t->deps[i].dep == dep_t) { /* Found, just add size */ t->deps[i].size += _starpu_data_get_size(handle); break; } if (i == t->depsn) { /* Not already there, add */ _STARPU_REALLOC(t->deps, ++t->depsn * sizeof(t->deps[0])); t->deps[t->depsn-1].dep = dep_t; t->deps[t->depsn-1].size = _starpu_data_get_size(handle); } STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } void starpu_bound_stop(void) { STARPU_PTHREAD_MUTEX_LOCK(&mutex); _starpu_bound_recording = 0; STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } /* Compute all tasks times on all workers */ static void _starpu_get_tasks_times(int nw, int nt, double *times) { struct bound_task_pool *tp; int w, t; for (w = 0; w < nw; w++) { for (t = 0, tp = task_pools; tp; t++, tp = tp->next) { struct _starpu_job j = { .footprint = tp->footprint, .footprint_is_computed = 1, }; struct starpu_perfmodel_arch* arch = starpu_worker_get_perf_archtype(w, STARPU_NMAX_SCHED_CTXS); double length = _starpu_history_based_job_expected_perf(tp->cl->model, arch, &j, j.nimpl); if (isnan(length)) times[w*nt+t] = NAN; else times[w*nt+t] = length / 1000.; } } } /* Return whether PARENT is an ancestor of CHILD */ static int ancestor(struct bound_task *child, struct bound_task *parent) { int i; for (i = 0; i < child->depsn; i++) { if (parent == child->deps[i].dep) return 1; if (ancestor(child->deps[i].dep, parent)) return -1; } return 0; } /* Print bound recording in .dot format */ void starpu_bound_print_dot(FILE *output) { struct bound_task *t; struct bound_tag_dep *td; int i; if (!recorddeps) { fprintf(output, "Not supported\n"); return; } fprintf(output, "strict digraph bounddeps {\n"); for (t = tasks; t; t = t->next) { fprintf(output, "\"t%lu\" [label=\"%lu: %s\"]\n", t->id, t->id, _starpu_codelet_get_model_name(t->cl)); for (i = 0; i < t->depsn; i++) fprintf(output, "\"t%lu\" -> \"t%lu\"\n", t->deps[i].dep->id, t->id); } for (td = tag_deps; td; td = td->next) fprintf(output, "\"tag%lu\" -> \"tag%lu\";\n", (unsigned long) td->dep_tag, (unsigned long) td->tag); fprintf(output, "}\n"); } /* * Print bound system in lp_solve format * * When dependencies are enabled, you can check the set of tasks and deps that * were recorded by using tools/lp2paje and vite. */ void starpu_bound_print_lp(FILE *output) { int nt; /* Number of different kinds of tasks */ int nw; /* Number of different workers */ int t; int w, w2; /* worker */ unsigned n, n2; STARPU_PTHREAD_MUTEX_LOCK(&mutex); nw = starpu_worker_get_count(); if (!nw) /* Make llvm happy about the VLA below */ return; if (recorddeps) { struct bound_task *t1, *t2; struct bound_tag_dep *td; int i; nt = 0; for (t1 = tasks; t1; t1 = t1->next) { if (t1->cl->model->type != STARPU_HISTORY_BASED && t1->cl->model->type != STARPU_NL_REGRESSION_BASED) /* TODO: */ _STARPU_MSG("Warning: task %s uses a perf model which is neither history nor non-linear regression-based, support for such model is not implemented yet, system will not be solvable.\n", _starpu_codelet_get_model_name(t1->cl)); struct _starpu_job j = { .footprint = t1->footprint, .footprint_is_computed = 1, }; for (w = 0; w < nw; w++) { struct starpu_perfmodel_arch* arch = starpu_worker_get_perf_archtype(w, STARPU_NMAX_SCHED_CTXS); if (_STARPU_IS_ZERO(t1->duration[arch->devices[0].type][arch->devices[0].devid][arch->devices[0].ncores])) { double length = _starpu_history_based_job_expected_perf(t1->cl->model, arch, &j,j.nimpl); if (isnan(length)) /* Avoid problems with binary coding of doubles */ t1->duration[arch->devices[0].type][arch->devices[0].devid][arch->devices[0].ncores] = NAN; else t1->duration[arch->devices[0].type][arch->devices[0].devid][arch->devices[0].ncores] = length / 1000.; } } nt++; } if (!nt) return; fprintf(output, "/* StarPU upper bound linear programming problem, to be run in lp_solve. */\n\n"); fprintf(output, "/* !! This is a big system, it will be long to solve !! */\n\n"); fprintf(output, "/* We want to minimize total execution time (ms) */\n"); fprintf(output, "min: tmax;\n\n"); fprintf(output, "/* Number of tasks */\n"); fprintf(output, "nt = %d;\n", nt); fprintf(output, "/* Number of workers */\n"); fprintf(output, "nw = %d;\n", nw); fprintf(output, "/* The total execution time is the maximum of all task completion times (ms) */\n"); for (t1 = tasks; t1; t1 = t1->next) fprintf(output, "c%lu <= tmax;\n", t1->id); fprintf(output, "\n/* We have tasks executing on workers, exactly one worker executes each task */\n"); for (t1 = tasks; t1; t1 = t1->next) { for (w = 0; w < nw; w++) { struct starpu_perfmodel_arch* arch = starpu_worker_get_perf_archtype(w, STARPU_NMAX_SCHED_CTXS); if (!isnan(t1->duration[arch->devices[0].type][arch->devices[0].devid][arch->devices[0].ncores])) fprintf(output, " +t%luw%d", t1->id, w); } fprintf(output, " = 1;\n"); } fprintf(output, "\n/* Completion time is start time plus computation time */\n"); fprintf(output, "/* According to where the task is indeed executed */\n"); for (t1 = tasks; t1; t1 = t1->next) { fprintf(output, "/* %s %x */\tc%lu = s%lu", _starpu_codelet_get_model_name(t1->cl), (unsigned) t1->footprint, t1->id, t1->id); for (w = 0; w < nw; w++) { struct starpu_perfmodel_arch* arch = starpu_worker_get_perf_archtype(w, STARPU_NMAX_SCHED_CTXS); if (!isnan(t1->duration[arch->devices[0].type][arch->devices[0].devid][arch->devices[0].ncores])) fprintf(output, " + %f t%luw%d", t1->duration[arch->devices[0].type][arch->devices[0].devid][arch->devices[0].ncores], t1->id, w); } fprintf(output, ";\n"); } fprintf(output, "\n/* Each task starts after all its task dependencies finish and data is transferred. */\n"); fprintf(output, "/* Note that the dependency finish time depends on the worker where it's working */\n"); for (t1 = tasks; t1; t1 = t1->next) for (i = 0; i < t1->depsn; i++) { fprintf(output, "/* %lu bytes transferred */\n", (unsigned long) t1->deps[i].size); fprintf(output, "s%lu >= c%lu", t1->id, t1->deps[i].dep->id); /* Transfer time: pick up one source node and a worker on it */ for (n = 0; n < starpu_memory_nodes_get_count(); n++) for (w = 0; w < nw; w++) if (starpu_worker_get_memory_node(w) == n) { /* pick up another destination node and a worker on it */ for (n2 = 0; n2 < starpu_memory_nodes_get_count(); n2++) if (n2 != n) { for (w2 = 0; w2 < nw; w2++) if (starpu_worker_get_memory_node(w2) == n2) { /* If predecessor is on worker w and successor * on worker w2 on different nodes, we need to * transfer the data. */ fprintf(output, " + d_t%luw%dt%luw%d", t1->deps[i].dep->id, w, t1->id, w2); } } } fprintf(output, ";\n"); /* Transfer time: pick up one source node and a worker on it */ for (n = 0; n < starpu_memory_nodes_get_count(); n++) for (w = 0; w < nw; w++) if (starpu_worker_get_memory_node(w) == n) { /* pick up another destination node and a worker on it */ for (n2 = 0; n2 < starpu_memory_nodes_get_count(); n2++) if (n2 != n) { for (w2 = 0; w2 < nw; w2++) if (starpu_worker_get_memory_node(w2) == n2) { /* The data transfer is at least 0ms */ fprintf(output, "d_t%luw%dt%luw%d >= 0;\n", t1->deps[i].dep->id, w, t1->id, w2); /* The data transfer from w to w2 only happens if tasks run there */ fprintf(output, "d_t%luw%dt%luw%d >= %f - 2e5 + 1e5 t%luw%d + 1e5 t%luw%d;\n", t1->deps[i].dep->id, w, t1->id, w2, starpu_transfer_predict(n, n2, t1->deps[i].size)/1000., t1->deps[i].dep->id, w, t1->id, w2); } } } } fprintf(output, "\n/* Each tag finishes when its corresponding task finishes */\n"); for (t1 = tasks; t1; t1 = t1->next) if (t1->use_tag) { for (w = 0; w < nw; w++) fprintf(output, "c%lu = tag%lu;\n", t1->id, (unsigned long) t1->tag_id); } fprintf(output, "\n/* tags start after all their tag dependencies finish. */\n"); for (td = tag_deps; td; td = td->next) fprintf(output, "tag%lu >= tag%lu;\n", (unsigned long) td->tag, (unsigned long) td->dep_tag); /* TODO: factorize ancestor calls */ fprintf(output, "\n/* For each task pair and each worker, if both tasks are executed by the same worker,\n"); fprintf(output, " one is started after the other's completion */\n"); for (t1 = tasks; t1; t1 = t1->next) { for (t2 = t1->next; t2; t2 = t2->next) { if (!ancestor(t1, t2) && !ancestor(t2, t1)) { for (w = 0; w < nw; w++) { struct starpu_perfmodel_arch* arch = starpu_worker_get_perf_archtype(w, STARPU_NMAX_SCHED_CTXS); if (!isnan(t1->duration[arch->devices[0].type][arch->devices[0].devid][arch->devices[0].ncores])) { fprintf(output, "s%lu - c%lu >= -3e5 + 1e5 t%luw%d + 1e5 t%luw%d + 1e5 t%luafter%lu;\n", t1->id, t2->id, t1->id, w, t2->id, w, t1->id, t2->id); fprintf(output, "s%lu - c%lu >= -2e5 + 1e5 t%luw%d + 1e5 t%luw%d - 1e5 t%luafter%lu;\n", t2->id, t1->id, t1->id, w, t2->id, w, t1->id, t2->id); } } } } } #if 0 /* Doesn't help at all to actually express what "after" means */ for (t1 = tasks; t1; t1 = t1->next) for (t2 = t1->next; t2; t2 = t2->next) if (!ancestor(t1, t2) && !ancestor(t2, t1)) { fprintf(output, "s%lu - s%lu >= -1e5 + 1e5 t%luafter%lu;\n", t1->id, t2->id, t1->id, t2->id); fprintf(output, "s%lu - s%lu >= -1e5 t%luafter%lu;\n", t2->id, t1->id, t1->id, t2->id); } #endif if (recordprio) { fprintf(output, "\n/* For StarPU, a priority means given schedulable tasks it will consider the\n"); fprintf(output, " * more prioritized first */\n"); for (t1 = tasks; t1; t1 = t1->next) { for (t2 = t1->next; t2; t2 = t2->next) { if (!ancestor(t1, t2) && !ancestor(t2, t1) && t1->priority != t2->priority) { if (t1->priority > t2->priority) { /* Either t2 is scheduled before t1, but then it needs to be scheduled before some t dep finishes */ /* One of the t1 deps to give the maximum start time for t2 */ if (t1->depsn > 1) { for (i = 0; i < t1->depsn; i++) fprintf(output, " + t%lut%lud%d", t2->id, t1->id, i); fprintf(output, " = 1;\n"); } for (i = 0; i < t1->depsn; i++) { fprintf(output, "c%lu - s%lu >= ", t1->deps[i].dep->id, t2->id); if (t1->depsn > 1) /* Only checks this when it's this dependency that is chosen */ fprintf(output, "-2e5 + 1e5 t%lut%lud%d", t2->id, t1->id, i); else fprintf(output, "-1e5"); /* Only check this if t1 is after t2 */ fprintf(output, " + 1e5 t%luafter%lu", t1->id, t2->id); fprintf(output, ";\n"); } /* Or t2 is scheduled after t1 is. */ fprintf(output, "s%lu - s%lu >= -1e5 t%luafter%lu;\n", t2->id, t1->id, t1->id, t2->id); } else { /* Either t1 is scheduled before t2, but then it needs to be scheduled before some t2 dep finishes */ /* One of the t2 deps to give the maximum start time for t1 */ if (t2->depsn > 1) { for (i = 0; i < t2->depsn; i++) fprintf(output, " + t%lut%lud%d", t1->id, t2->id, i); fprintf(output, " = 1;\n"); } for (i = 0; i < t2->depsn; i++) { fprintf(output, "c%lu - s%lu >= ", t2->deps[i].dep->id, t1->id); if (t2->depsn > 1) /* Only checks this when it's this dependency that is chosen */ fprintf(output, "-1e5 + 1e5 t%lut%lud%d", t1->id, t2->id, i); /* Only check this if t2 is after t1 */ fprintf(output, " - 1e5 t%luafter%lu;\n", t1->id, t2->id); } /* Or t1 is scheduled after t2 is. */ fprintf(output, "s%lu - s%lu >= -1e5 + 1e5 t%luafter%lu;\n", t1->id, t2->id, t1->id, t2->id); } } } } } for (t1 = tasks; t1; t1 = t1->next) for (t2 = t1->next; t2; t2 = t2->next) if (!ancestor(t1, t2) && !ancestor(t2, t1)) { fprintf(output, "bin t%luafter%lu;\n", t1->id, t2->id); if (recordprio && t1->priority != t2->priority) { if (t1->priority > t2->priority) { if (t1->depsn > 1) for (i = 0; i < t1->depsn; i++) fprintf(output, "bin t%lut%lud%d;\n", t2->id, t1->id, i); } else { if (t2->depsn > 1) for (i = 0; i < t2->depsn; i++) fprintf(output, "bin t%lut%lud%d;\n", t1->id, t2->id, i); } } } for (t1 = tasks; t1; t1 = t1->next) for (w = 0; w < nw; w++) fprintf(output, "bin t%luw%d;\n", t1->id, w); } else { struct bound_task_pool *tp; nt = 0; for (tp = task_pools; tp; tp = tp->next) nt++; if (!nt) return; { double times[nw*nt]; _starpu_get_tasks_times(nw, nt, times); fprintf(output, "/* StarPU upper bound linear programming problem, to be run in lp_solve. */\n\n"); fprintf(output, "/* We want to minimize total execution time (ms) */\n"); fprintf(output, "min: tmax;\n\n"); fprintf(output, "/* Which is the maximum of all worker execution times (ms) */\n"); for (w = 0; w < nw; w++) { char name[32]; starpu_worker_get_name(w, name, sizeof(name)); fprintf(output, "/* worker %s */\n0", name); for (t = 0, tp = task_pools; tp; t++, tp = tp->next) { if (!isnan(times[w*nt+t])) fprintf(output, "\t%+f * w%dt%dn", (float) times[w*nt+t], w, t); } fprintf(output, " <= tmax;\n"); } fprintf(output, "\n"); fprintf(output, "/* And we have to have computed exactly all tasks */\n"); for (t = 0, tp = task_pools; tp; t++, tp = tp->next) { int got_one = 0; fprintf(output, "/* task %s key %x */\n0", _starpu_codelet_get_model_name(tp->cl), (unsigned) tp->footprint); for (w = 0; w < nw; w++) { if (isnan(times[w*nt+t])) _STARPU_MSG("Warning: task %s has no performance measurement for worker %d.\n", _starpu_codelet_get_model_name(tp->cl), w); else { got_one = 1; fprintf(output, "\t+w%dt%dn", w, t); } } fprintf(output, " = %lu;\n", tp->n); if (!got_one) _STARPU_MSG("Warning: task %s has no performance measurement for any worker, system will not be solvable!\n", _starpu_codelet_get_model_name(tp->cl)); /* Show actual values */ fprintf(output, "/*"); for (w = 0; w < nw; w++) fprintf(output, "\t+%lu", tp->cl->per_worker_stats[w]); fprintf(output, "\t*/\n\n"); } fprintf(output, "/* Optionally tell that tasks can not be divided */\n"); fprintf(output, "/* int "); int first = 1; for (w = 0; w < nw; w++) for (t = 0, tp = task_pools; tp; t++, tp = tp->next) { if (!first) fprintf(output, ","); else first = 0; fprintf(output, "w%dt%dn", w, t); } fprintf(output, "; */\n"); } } STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } /* * Print bound system in MPS output format */ void starpu_bound_print_mps(FILE *output) { struct bound_task_pool * tp; int nt; /* Number of different kinds of tasks */ int nw; /* Number of different workers */ int t, w; if (recorddeps) { fprintf(output, "Not supported\n"); return; } nw = starpu_worker_get_count(); if (!nw) /* Make llvm happy about the VLA below */ return; STARPU_PTHREAD_MUTEX_LOCK(&mutex); nt = 0; for (tp = task_pools; tp; tp = tp->next) nt++; if (!nt) { STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); return; } { double times[nw*nt]; _starpu_get_tasks_times(nw, nt, times); fprintf(output, "NAME StarPU theoretical bound\n"); fprintf(output, "*\nROWS\n"); fprintf(output, "* We want to minimize total execution time (ms)\n"); fprintf(output, " N TMAX\n"); fprintf(output, "* Which is the maximum of all worker execution times (ms)\n"); for (w = 0; w < nw; w++) { char name[32]; starpu_worker_get_name(w, name, sizeof(name)); fprintf(output, "* worker %s\n", name); fprintf(output, " L W%d\n", w); } fprintf(output, "*\n* And we have to have computed exactly all tasks\n*\n"); for (t = 0, tp = task_pools; tp; t++, tp = tp->next) { fprintf(output, "* task %s key %x\n", _starpu_codelet_get_model_name(tp->cl), (unsigned) tp->footprint); fprintf(output, " E T%d\n", t); } fprintf(output, "*\nCOLUMNS\n*\n"); fprintf(output, "*\n* Execution times and completion of all tasks\n*\n"); for (w = 0; w < nw; w++) for (t = 0, tp = task_pools; tp; t++, tp = tp->next) if (!isnan(times[w*nt+t])) { char name[23]; snprintf(name, sizeof(name), "W%dT%d", w, t); fprintf(output," %-8s W%-7d %12f\n", name, w, times[w*nt+t]); fprintf(output," %-8s T%-7d %12d\n", name, t, 1); } fprintf(output, "*\n* Total execution time\n*\n"); for (w = 0; w < nw; w++) fprintf(output," TMAX W%-2d %12d\n", w, -1); fprintf(output," TMAX TMAX %12d\n", 1); fprintf(output, "*\nRHS\n*\n"); fprintf(output, "*\n* Total number of tasks\n*\n"); for (t = 0, tp = task_pools; tp; t++, tp = tp->next) fprintf(output," NT%-2d T%-7d %12lu\n", t, t, tp->n); fprintf(output, "ENDATA\n"); } STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } /* * Solve bound system thanks to GNU Linear Programming Kit backend */ #ifdef STARPU_HAVE_GLPK_H static glp_prob *_starpu_bound_glp_resolve(int integer) { struct bound_task_pool * tp; int nt; /* Number of different kinds of tasks */ int nw; /* Number of different workers */ int t, w; glp_prob *lp; int ret; nw = starpu_worker_get_count(); if (!nw) /* Make llvm happy about the VLA below */ return NULL; nt = 0; for (tp = task_pools; tp; tp = tp->next) nt++; if (!nt) return NULL; lp = glp_create_prob(); glp_set_prob_name(lp, "StarPU theoretical bound"); glp_set_obj_dir(lp, GLP_MIN); glp_set_obj_name(lp, "total execution time"); { double times[nw*nt]; int ne = nw * (nt+1) /* worker execution time */ + nt * nw + 1; /* glp dumbness */ int n = 1; int ia[ne], ja[ne]; double ar[ne]; _starpu_get_tasks_times(nw, nt, times); /* Variables: number of tasks i assigned to worker j, and tmax */ glp_add_cols(lp, nw*nt+1); #define colnum(w, t) ((t)*nw+(w)+1) glp_set_obj_coef(lp, nw*nt+1, 1.); for (w = 0; w < nw; w++) for (t = 0, tp = task_pools; tp; t++, tp = tp->next) { char name[32]; snprintf(name, sizeof(name), "w%dt%dn", w, t); glp_set_col_name(lp, colnum(w, t), name); if (integer) glp_set_col_kind(lp, colnum(w, t), GLP_IV); glp_set_col_bnds(lp, colnum(w, t), GLP_LO, 0., 0.); } glp_set_col_bnds(lp, nw*nt+1, GLP_LO, 0., 0.); /* Total worker execution time */ glp_add_rows(lp, nw); for (t = 0, tp = task_pools; tp; t++, tp = tp->next) { int someone = 0; for (w = 0; w < nw; w++) if (!isnan(times[w*nt+t])) someone = 1; if (!someone) { /* This task does not have any performance model at all, abort */ glp_delete_prob(lp); return NULL; } } for (w = 0; w < nw; w++) { char name[32], title[64]; starpu_worker_get_name(w, name, sizeof(name)); snprintf(title, sizeof(title), "worker %s", name); glp_set_row_name(lp, w+1, title); for (t = 0, tp = task_pools; tp; t++, tp = tp->next) { ia[n] = w+1; ja[n] = colnum(w, t); if (isnan(times[w*nt+t])) ar[n] = 1000000000.; else ar[n] = times[w*nt+t]; n++; } /* tmax */ ia[n] = w+1; ja[n] = nw*nt+1; ar[n] = -1; n++; glp_set_row_bnds(lp, w+1, GLP_UP, 0, 0); } /* Total task completion */ glp_add_rows(lp, nt); for (t = 0, tp = task_pools; tp; t++, tp = tp->next) { char name[32], title[64]; starpu_worker_get_name(w, name, sizeof(name)); snprintf(title, sizeof(title), "task %s key %x", _starpu_codelet_get_model_name(tp->cl), (unsigned) tp->footprint); glp_set_row_name(lp, nw+t+1, title); for (w = 0; w < nw; w++) { ia[n] = nw+t+1; ja[n] = colnum(w, t); ar[n] = 1; n++; } glp_set_row_bnds(lp, nw+t+1, GLP_FX, tp->n, tp->n); } STARPU_ASSERT(n == ne); glp_load_matrix(lp, ne-1, ia, ja, ar); } glp_smcp parm; glp_init_smcp(&parm); parm.msg_lev = GLP_MSG_OFF; ret = glp_simplex(lp, &parm); if (ret) { glp_delete_prob(lp); lp = NULL; return NULL; } if (integer) { glp_iocp iocp; glp_init_iocp(&iocp); iocp.msg_lev = GLP_MSG_OFF; glp_intopt(lp, &iocp); } return lp; } #endif /* STARPU_HAVE_GLPK_H */ /* Print the computed bound as well as the optimized distribution of tasks */ void starpu_bound_print(FILE *output, int integer STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_HAVE_GLPK_H if (recorddeps) { fprintf(output, "Not supported\n"); return; } STARPU_PTHREAD_MUTEX_LOCK(&mutex); glp_prob *lp = _starpu_bound_glp_resolve(integer); if (lp) { struct bound_task_pool * tp; int t, w; int nw; /* Number of different workers */ double tmax; nw = starpu_worker_get_count(); if (integer) tmax = glp_mip_obj_val(lp); else tmax = glp_get_obj_val(lp); fprintf(output, "Theoretical minimum execution time: %f ms\n", tmax); for (t = 0, tp = task_pools; tp; t++, tp = tp->next) { fprintf(output, "%s key %x\n", _starpu_codelet_get_model_name(tp->cl), (unsigned) tp->footprint); for (w = 0; w < nw; w++) if (integer) fprintf(output, "\tw%dt%dn %f", w, t, glp_mip_col_val(lp, colnum(w, t))); else fprintf(output, "\tw%dt%dn %f", w, t, glp_get_col_prim(lp, colnum(w, t))); fprintf(output, "\n"); } glp_delete_prob(lp); } else { _STARPU_MSG("Simplex failed\n"); } STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); #else /* STARPU_HAVE_GLPK_H */ fprintf(output, "Please rebuild StarPU with glpk installed.\n"); #endif /* STARPU_HAVE_GLPK_H */ } /* Compute and return the bound */ void starpu_bound_compute(double *res, double *integer_res STARPU_ATTRIBUTE_UNUSED, int integer STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_HAVE_GLPK_H double ret; if (recorddeps) { *res = 0.; return; } STARPU_PTHREAD_MUTEX_LOCK(&mutex); glp_prob *lp = _starpu_bound_glp_resolve(integer); if (lp) { ret = glp_get_obj_val(lp); if (integer) *integer_res = glp_mip_obj_val(lp); glp_delete_prob(lp); } else ret = 0.; STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); *res = ret; #else /* STARPU_HAVE_GLPK_H */ *res = 0.; #endif /* STARPU_HAVE_GLPK_H */ } starpu-1.2.3+dfsg/src/profiling/bound.h000066400000000000000000000025441320135501600200130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __BOUND_H__ #define __BOUND_H__ #include #include #include /* Are we recording? */ extern int _starpu_bound_recording; /* Record task for bound computation */ extern void _starpu_bound_record(struct _starpu_job *j); /* Record tag dependency: id depends on dep_id */ extern void _starpu_bound_tag_dep(starpu_tag_t id, starpu_tag_t dep_id); /* Record task dependency: j depends on dep_j */ extern void _starpu_bound_task_dep(struct _starpu_job *j, struct _starpu_job *dep_j); /* Record job id dependency: j depends on job_id */ extern void _starpu_bound_job_id_dep(starpu_data_handle_t handle, struct _starpu_job *dep_j, unsigned long job_id); #endif // __BOUND_H__ starpu-1.2.3+dfsg/src/profiling/profiling.c000066400000000000000000000320571320135501600206720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include static struct starpu_profiling_worker_info worker_info[STARPU_NMAXWORKERS]; static starpu_pthread_mutex_t worker_info_mutex[STARPU_NMAXWORKERS]; /* In case the worker is still sleeping when the user request profiling info, * we need to account for the time elasped while sleeping. */ static unsigned worker_registered_sleeping_start[STARPU_NMAXWORKERS]; static struct timespec sleeping_start_date[STARPU_NMAXWORKERS]; static unsigned worker_registered_executing_start[STARPU_NMAXWORKERS]; static struct timespec executing_start_date[STARPU_NMAXWORKERS]; /* Store the busid of the different (src, dst) pairs. busid_matrix[src][dst] * contains the busid of (src, dst) or -1 if the bus was not registered. */ struct node_pair { int src; int dst; struct starpu_profiling_bus_info *bus_info; }; static int busid_matrix[STARPU_MAXNODES][STARPU_MAXNODES]; static struct starpu_profiling_bus_info bus_profiling_info[STARPU_MAXNODES][STARPU_MAXNODES]; static struct node_pair busid_to_node_pair[STARPU_MAXNODES*STARPU_MAXNODES]; static unsigned busid_cnt = 0; static void _starpu_bus_reset_profiling_info(struct starpu_profiling_bus_info *bus_info); /* Clear all the profiling info related to the worker. */ static void _starpu_worker_reset_profiling_info_with_lock(int workerid); /* * Global control of profiling */ /* Disabled by default, unless simulating */ int _starpu_profiling = #ifdef STARPU_SIMGRID 1 #else 0 #endif ; void starpu_profiling_init() { _starpu_profiling_init(); } static void _starpu_profiling_reset_counters() { int worker; for (worker = 0; worker < STARPU_NMAXWORKERS; worker++) { _starpu_worker_reset_profiling_info_with_lock(worker); } int busid; int bus_cnt = starpu_bus_get_count(); for (busid = 0; busid < bus_cnt; busid++) { struct starpu_profiling_bus_info *bus_info; bus_info = busid_to_node_pair[busid].bus_info; _starpu_bus_reset_profiling_info(bus_info); } } int starpu_profiling_status_set(int status) { int worker; for (worker = 0; worker < STARPU_NMAXWORKERS; worker++) { STARPU_PTHREAD_MUTEX_LOCK(&worker_info_mutex[worker]); } ANNOTATE_HAPPENS_AFTER(&_starpu_profiling); int prev_value = _starpu_profiling; _starpu_profiling = status; ANNOTATE_HAPPENS_BEFORE(&_starpu_profiling); _STARPU_TRACE_SET_PROFILING(status); /* If we enable profiling, we reset the counters. */ if (status == STARPU_PROFILING_ENABLE) { _starpu_profiling_reset_counters(); } for (worker = 0; worker < STARPU_NMAXWORKERS; worker++) { STARPU_PTHREAD_MUTEX_UNLOCK(&worker_info_mutex[worker]); } return prev_value; } void _starpu_profiling_init(void) { int worker; for (worker = 0; worker < STARPU_NMAXWORKERS; worker++) { STARPU_PTHREAD_MUTEX_INIT(&worker_info_mutex[worker], NULL); } _starpu_profiling_reset_counters(); } void _starpu_profiling_start(void) { const char *env; if ((env = starpu_getenv("STARPU_PROFILING")) && atoi(env)) { starpu_profiling_status_set(STARPU_PROFILING_ENABLE); } } void _starpu_profiling_terminate(void) { } /* * Task profiling */ struct starpu_profiling_task_info *_starpu_allocate_profiling_info_if_needed(struct starpu_task *task) { struct starpu_profiling_task_info *info = NULL; /* If we are benchmarking, we need room for the energy */ if (starpu_profiling_status_get() || (task->cl && task->cl->energy_model && (task->cl->energy_model->benchmarking || _starpu_get_calibrate_flag()))) { _STARPU_CALLOC(info, 1, sizeof(struct starpu_profiling_task_info)); } return info; } /* * Worker profiling */ static void _starpu_worker_reset_profiling_info_with_lock(int workerid) { _starpu_clock_gettime(&worker_info[workerid].start_time); /* This is computed in a lazy fashion when the application queries * profiling info. */ starpu_timespec_clear(&worker_info[workerid].total_time); starpu_timespec_clear(&worker_info[workerid].executing_time); starpu_timespec_clear(&worker_info[workerid].sleeping_time); worker_info[workerid].executed_tasks = 0; worker_info[workerid].used_cycles = 0; worker_info[workerid].stall_cycles = 0; worker_info[workerid].energy_consumed = 0; /* We detect if the worker is already sleeping or doing some * computation */ enum _starpu_worker_status status = _starpu_worker_get_status(workerid); if (status == STATUS_SLEEPING || status == STATUS_WAKING_UP) { worker_registered_sleeping_start[workerid] = 1; _starpu_clock_gettime(&sleeping_start_date[workerid]); } else { worker_registered_sleeping_start[workerid] = 0; } if (status == STATUS_EXECUTING) { worker_registered_executing_start[workerid] = 1; _starpu_clock_gettime(&executing_start_date[workerid]); } else { worker_registered_executing_start[workerid] = 0; } } void _starpu_worker_restart_sleeping(int workerid) { if (starpu_profiling_status_get()) { struct timespec sleep_start_time; _starpu_clock_gettime(&sleep_start_time); STARPU_PTHREAD_MUTEX_LOCK(&worker_info_mutex[workerid]); if (worker_registered_sleeping_start[workerid] == 0) { worker_registered_sleeping_start[workerid] = 1; memcpy(&sleeping_start_date[workerid], &sleep_start_time, sizeof(struct timespec)); } STARPU_PTHREAD_MUTEX_UNLOCK(&worker_info_mutex[workerid]); } } void _starpu_worker_stop_sleeping(int workerid) { if (starpu_profiling_status_get()) { struct timespec *sleeping_start, sleep_end_time; _starpu_clock_gettime(&sleep_end_time); STARPU_PTHREAD_MUTEX_LOCK(&worker_info_mutex[workerid]); STARPU_ASSERT(worker_registered_sleeping_start[workerid] == 1); sleeping_start = &sleeping_start_date[workerid]; /* Perhaps that profiling was enabled while the worker was * already blocked, so we don't measure (end - start), but * (end - max(start,worker_start)) where worker_start is the * date of the previous profiling info reset on the worker */ struct timespec *worker_start = &worker_info[workerid].start_time; if (starpu_timespec_cmp(sleeping_start, worker_start, <)) { /* sleeping_start < worker_start */ sleeping_start = worker_start; } struct timespec sleeping_time; starpu_timespec_sub(&sleep_end_time, sleeping_start, &sleeping_time); starpu_timespec_accumulate(&worker_info[workerid].sleeping_time, &sleeping_time); worker_registered_sleeping_start[workerid] = 0; STARPU_PTHREAD_MUTEX_UNLOCK(&worker_info_mutex[workerid]); } } void _starpu_worker_register_executing_start_date(int workerid, struct timespec *executing_start) { if (starpu_profiling_status_get()) { STARPU_PTHREAD_MUTEX_LOCK(&worker_info_mutex[workerid]); worker_registered_executing_start[workerid] = 1; memcpy(&executing_start_date[workerid], executing_start, sizeof(struct timespec)); STARPU_PTHREAD_MUTEX_UNLOCK(&worker_info_mutex[workerid]); } } void _starpu_worker_register_executing_end(int workerid) { if (starpu_profiling_status_get()) { STARPU_PTHREAD_MUTEX_LOCK(&worker_info_mutex[workerid]); worker_registered_executing_start[workerid] = 0; STARPU_PTHREAD_MUTEX_UNLOCK(&worker_info_mutex[workerid]); } } void _starpu_worker_update_profiling_info_executing(int workerid, struct timespec *executing_time, int executed_tasks, uint64_t used_cycles, uint64_t stall_cycles, double energy_consumed) { if (starpu_profiling_status_get()) { STARPU_PTHREAD_MUTEX_LOCK(&worker_info_mutex[workerid]); if (executing_time) starpu_timespec_accumulate(&worker_info[workerid].executing_time, executing_time); worker_info[workerid].used_cycles += used_cycles; worker_info[workerid].stall_cycles += stall_cycles; worker_info[workerid].energy_consumed += energy_consumed; worker_info[workerid].executed_tasks += executed_tasks; STARPU_PTHREAD_MUTEX_UNLOCK(&worker_info_mutex[workerid]); } else /* Not thread safe, shouldn't be too much a problem */ worker_info[workerid].executed_tasks += executed_tasks; } int starpu_profiling_worker_get_info(int workerid, struct starpu_profiling_worker_info *info) { if (!starpu_profiling_status_get()) { /* Not thread safe, shouldn't be too much a problem */ info->executed_tasks = worker_info[workerid].executed_tasks; } STARPU_PTHREAD_MUTEX_LOCK(&worker_info_mutex[workerid]); if (info) { /* The total time is computed in a lazy fashion */ struct timespec now; _starpu_clock_gettime(&now); /* In case some worker is currently sleeping, we take into * account the time spent since it registered. */ if (worker_registered_sleeping_start[workerid]) { struct timespec sleeping_time; starpu_timespec_sub(&now, &sleeping_start_date[workerid], &sleeping_time); starpu_timespec_accumulate(&worker_info[workerid].sleeping_time, &sleeping_time); } if (worker_registered_executing_start[workerid]) { struct timespec executing_time; starpu_timespec_sub(&now, &executing_start_date[workerid], &executing_time); starpu_timespec_accumulate(&worker_info[workerid].executing_time, &executing_time); } /* total_time = now - start_time */ starpu_timespec_sub(&now, &worker_info[workerid].start_time, &worker_info[workerid].total_time); memcpy(info, &worker_info[workerid], sizeof(struct starpu_profiling_worker_info)); } _starpu_worker_reset_profiling_info_with_lock(workerid); STARPU_PTHREAD_MUTEX_UNLOCK(&worker_info_mutex[workerid]); return 0; } /* When did the task reach the scheduler ? */ void _starpu_profiling_set_task_push_start_time(struct starpu_task *task) { if (!starpu_profiling_status_get()) return; struct starpu_profiling_task_info *profiling_info; profiling_info = task->profiling_info; if (profiling_info) _starpu_clock_gettime(&profiling_info->push_start_time); } void _starpu_profiling_set_task_push_end_time(struct starpu_task *task) { if (!starpu_profiling_status_get()) return; struct starpu_profiling_task_info *profiling_info; profiling_info = task->profiling_info; if (profiling_info) _starpu_clock_gettime(&profiling_info->push_end_time); } /* * Bus profiling */ void _starpu_initialize_busid_matrix(void) { int i, j; for (j = 0; j < STARPU_MAXNODES; j++) for (i = 0; i < STARPU_MAXNODES; i++) busid_matrix[i][j] = -1; busid_cnt = 0; } static void _starpu_bus_reset_profiling_info(struct starpu_profiling_bus_info *bus_info) { _starpu_clock_gettime(&bus_info->start_time); bus_info->transferred_bytes = 0; bus_info->transfer_count = 0; } int _starpu_register_bus(int src_node, int dst_node) { if (busid_matrix[src_node][dst_node] != -1) return -EBUSY; int busid = STARPU_ATOMIC_ADD(&busid_cnt, 1) - 1; busid_matrix[src_node][dst_node] = busid; busid_to_node_pair[busid].src = src_node; busid_to_node_pair[busid].dst = dst_node; busid_to_node_pair[busid].bus_info = &bus_profiling_info[src_node][dst_node]; _starpu_bus_reset_profiling_info(&bus_profiling_info[src_node][dst_node]); return busid; } int starpu_bus_get_count(void) { return busid_cnt; } int starpu_bus_get_id(int src, int dst) { return busid_matrix[src][dst]; } int starpu_bus_get_src(int busid) { return busid_to_node_pair[busid].src; } int starpu_bus_get_dst(int busid) { return busid_to_node_pair[busid].dst; } int starpu_bus_get_profiling_info(int busid, struct starpu_profiling_bus_info *bus_info) { int src_node = busid_to_node_pair[busid].src; int dst_node = busid_to_node_pair[busid].dst; /* XXX protect all this method with a mutex */ if (bus_info) { struct timespec now; _starpu_clock_gettime(&now); /* total_time = now - start_time */ starpu_timespec_sub(&now, &bus_profiling_info[src_node][dst_node].start_time, &bus_profiling_info[src_node][dst_node].total_time); memcpy(bus_info, &bus_profiling_info[src_node][dst_node], sizeof(struct starpu_profiling_bus_info)); } _starpu_bus_reset_profiling_info(&bus_profiling_info[src_node][dst_node]); return 0; } void _starpu_bus_update_profiling_info(int src_node, int dst_node, size_t size) { bus_profiling_info[src_node][dst_node].transferred_bytes += size; bus_profiling_info[src_node][dst_node].transfer_count++; // fprintf(stderr, "PROFILE %d -> %d : %d (cnt %d)\n", src_node, dst_node, size, bus_profiling_info[src_node][dst_node].transfer_count); } #undef starpu_profiling_status_get int starpu_profiling_status_get(void) { int ret; ANNOTATE_HAPPENS_AFTER(&_starpu_profiling); ret = _starpu_profiling; ANNOTATE_HAPPENS_BEFORE(&_starpu_profiling); return ret; } starpu-1.2.3+dfsg/src/profiling/profiling.h000066400000000000000000000064761320135501600207050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012, 2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __PROFILING_H__ #define __PROFILING_H__ #include #include #include #include /* Create a task profiling info structure (with the proper time stamps) in case * profiling is enabled. */ struct starpu_profiling_task_info *_starpu_allocate_profiling_info_if_needed(struct starpu_task *task); /* Update the per-worker profiling info after a task (or more) was executed. * This tells StarPU how much time was spent doing computation. */ void _starpu_worker_update_profiling_info_executing(int workerid, struct timespec *executing_time, int executed_tasks, uint64_t used_cycles, uint64_t stall_cycles, double consumed_energy); /* Record the date when the worker started to sleep. This permits to measure * how much time was spent sleeping. */ void _starpu_worker_restart_sleeping(int workerid); /* Record the date when the worker stopped sleeping. This permits to measure * how much time was spent sleeping. */ void _starpu_worker_stop_sleeping(int workerid); /* Record the date when the worker started to execute a piece of code. This * permits to measure how much time was really spent doing computation at the * end of the codelet. */ void _starpu_worker_register_executing_start_date(int workerid, struct timespec *executing_start); /* Record that the worker is not executing any more. */ void _starpu_worker_register_executing_end(int workerid); /* When StarPU is initialized, a matrix describing all the bus between memory * nodes is created: it indicates whether there is a physical link between two * memory nodes or not. This matrix should contain the identifier of the bus * between two nodes or -1 in case there is no link. */ void _starpu_initialize_busid_matrix(void); /* Tell StarPU that there exists a link between the two memory nodes. This * function returns the identifier associated to the bus which can be used to * retrieve profiling information about the bus activity later on. */ int _starpu_register_bus(int src_node, int dst_node); /* Tell StarPU that "size" bytes were transferred between the two specified * memory nodes. */ void _starpu_bus_update_profiling_info(int src_node, int dst_node, size_t size); void _starpu_profiling_set_task_push_start_time(struct starpu_task *task); void _starpu_profiling_set_task_push_end_time(struct starpu_task *task); /* This function needs to be called before other starpu_profile_* functions */ void _starpu_profiling_init(void); /* This function starts profiling if the STARPU_PROFILING environment variable was set */ void _starpu_profiling_start(void); void _starpu_profiling_terminate(void); #endif // __PROFILING_H__ starpu-1.2.3+dfsg/src/profiling/profiling_helpers.c000066400000000000000000000101711320135501600224050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2013, 2016-2017 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include void _starpu_profiling_bus_helper_display_summary(FILE *stream) { int long long sum_transferred = 0; fprintf(stream, "\nData transfer statistics:\n"); fprintf(stream, "*************************\n"); int busid; int bus_cnt = starpu_bus_get_count(); for (busid = 0; busid < bus_cnt; busid++) { int src, dst; src = starpu_bus_get_src(busid); dst = starpu_bus_get_dst(busid); struct starpu_profiling_bus_info bus_info; starpu_bus_get_profiling_info(busid, &bus_info); int long long transferred = bus_info.transferred_bytes; int long long transfer_cnt = bus_info.transfer_count; double elapsed_time = starpu_timing_timespec_to_us(&bus_info.total_time); fprintf(stream, "\t%d -> %d\t%.2lf MB\t%.2lfMB/s\t(transfers : %lld - avg %.2lf MB)\n", src, dst, (1.0*transferred)/(1024*1024), transferred/elapsed_time, transfer_cnt, (1.0*transferred)/(transfer_cnt*1024*1024)); sum_transferred += transferred; } fprintf(stream, "Total transfers: %.2lf MB\n", (1.0*sum_transferred)/(1024*1024)); } void starpu_profiling_bus_helper_display_summary(void) { const char *stats; if (!((stats = starpu_getenv("STARPU_BUS_STATS")) && atoi(stats))) return; _starpu_profiling_bus_helper_display_summary(stderr); } void _starpu_profiling_worker_helper_display_summary(FILE *stream) { double sum_consumed = 0.; int profiling = starpu_profiling_status_get(); double overall_time = 0; int workerid; int worker_cnt = starpu_worker_get_count(); fprintf(stream, "\nWorker statistics:\n"); fprintf(stream, "******************\n"); for (workerid = 0; workerid < worker_cnt; workerid++) { struct starpu_profiling_worker_info info; starpu_profiling_worker_get_info(workerid, &info); char name[64]; starpu_worker_get_name(workerid, name, sizeof(name)); if (profiling) { double total_time = starpu_timing_timespec_to_us(&info.total_time) / 1000.; double executing_time = starpu_timing_timespec_to_us(&info.executing_time) / 1000.; double sleeping_time = starpu_timing_timespec_to_us(&info.sleeping_time) / 1000.; if (total_time > overall_time) overall_time = total_time; fprintf(stream, "%-32s\n", name); fprintf(stream, "\t%d task(s)\n\ttotal: %.2lf ms executing: %.2lf ms sleeping: %.2lf ms overhead %.2lf ms\n", info.executed_tasks, total_time, executing_time, sleeping_time, total_time - executing_time - sleeping_time); if (info.used_cycles || info.stall_cycles) fprintf(stream, "\t%llu Mcy %llu Mcy stall\n", (unsigned long long)info.used_cycles/1000000, (unsigned long long)info.stall_cycles/1000000); if (info.energy_consumed) fprintf(stream, "\t%f J consumed\n", info.energy_consumed); } else { fprintf(stream, "\t%-32s\t%d task(s)\n", name, info.executed_tasks); } sum_consumed += info.energy_consumed; } if (profiling) { const char *strval_idle_power = starpu_getenv("STARPU_IDLE_POWER"); if (strval_idle_power) { double idle_power = atof(strval_idle_power); /* Watt */ double idle_energy = idle_power * overall_time / 1000.; /* J */ fprintf(stream, "Idle energy: %.2lf J\n", idle_energy); sum_consumed += idle_energy; } } if (profiling && sum_consumed) fprintf(stream, "Total consumption: %.2lf J\n", sum_consumed); } void starpu_profiling_worker_helper_display_summary(void) { const char *stats; if (!((stats = starpu_getenv("STARPU_WORKER_STATS")) && atoi(stats))) return; _starpu_profiling_worker_helper_display_summary(stderr); } starpu-1.2.3+dfsg/src/sched_policies/000077500000000000000000000000001320135501600175125ustar00rootroot00000000000000starpu-1.2.3+dfsg/src/sched_policies/component_best_implementation.c000066400000000000000000000071511320135501600260060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 INRIA * Copyright (C) 2013 Simon Archipoff * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include /* return true if workerid can execute task, and fill task->predicted and task->predicted_transfer * according to best implementation predictions */ static int find_best_impl(unsigned sched_ctx_id, struct starpu_task * task, int workerid) { double len = DBL_MAX; int best_impl = -1; int impl; for(impl = 0; impl < STARPU_MAXIMPLEMENTATIONS; impl++) { if(starpu_worker_can_execute_task(workerid, task, impl)) { struct starpu_perfmodel_arch* archtype = starpu_worker_get_perf_archtype(workerid, sched_ctx_id); double d = starpu_task_expected_length(task, archtype, impl); if(isnan(d)) { best_impl = impl; len = 0.0; break; } if(d < len) { len = d; best_impl = impl; } } } if(best_impl == -1) return 0; int memory_node = starpu_worker_get_memory_node(workerid); task->predicted = len; task->predicted_transfer = starpu_task_expected_data_transfer_time(memory_node, task); starpu_task_set_implementation(task, best_impl); return 1; } /* set implementation, task->predicted and task->predicted_transfer with the first worker of workers that can execute that task * or have to be calibrated */ static void select_best_implementation_and_set_preds(unsigned sched_ctx_id, struct starpu_bitmap * workers, struct starpu_task * task) { int workerid; for(workerid = starpu_bitmap_first(workers); -1 != workerid; workerid = starpu_bitmap_next(workers, workerid)) if(find_best_impl(sched_ctx_id, task, workerid)) break; } static int best_implementation_push_task(struct starpu_sched_component * component, struct starpu_task * task) { STARPU_ASSERT(component->nchildren == 1); select_best_implementation_and_set_preds(component->tree->sched_ctx_id, component->workers_in_ctx, task); return starpu_sched_component_push_task(component,component->children[0],task); } int starpu_sched_component_is_best_implementation(struct starpu_sched_component * component) { return component->push_task == best_implementation_push_task; } static struct starpu_task * best_implementation_pull_task(struct starpu_sched_component * component) { struct starpu_task * task = NULL; int i; for(i=0; i < component->nparents; i++) { if(component->parents[i] == NULL) continue; else { task = starpu_sched_component_pull_task(component->parents[i], component); if(task) break; } } if(task) /* this worker can execute this task as it was returned by a pop*/ (void)find_best_impl(component->tree->sched_ctx_id, task, starpu_worker_get_id_check()); return task; } struct starpu_sched_component * starpu_sched_component_best_implementation_create(struct starpu_sched_tree *tree, void * arg STARPU_ATTRIBUTE_UNUSED) { struct starpu_sched_component * component = starpu_sched_component_create(tree, "best_impl"); component->push_task = best_implementation_push_task; component->pull_task = best_implementation_pull_task; return component; } starpu-1.2.3+dfsg/src/sched_policies/component_composed.c000066400000000000000000000171731320135501600235620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 INRIA * Copyright (C) 2013 Simon Archipoff * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include /* a composed component is parametred by a list of pair * (create_component_function(arg), arg) */ LIST_TYPE(fun_create_component, struct starpu_sched_component *(*create_component)(struct starpu_sched_tree *tree, void * arg); void * arg; ); struct starpu_sched_component_composed_recipe { struct fun_create_component_list list; }; struct starpu_sched_component_composed_recipe * starpu_sched_component_composed_recipe_create(void) { struct starpu_sched_component_composed_recipe *recipe; _STARPU_MALLOC(recipe, sizeof(*recipe)); fun_create_component_list_init(&recipe->list); return recipe; } void starpu_sched_component_composed_recipe_add(struct starpu_sched_component_composed_recipe * recipe, struct starpu_sched_component *(*create_component)(struct starpu_sched_tree *tree, void * arg), void * arg) { struct fun_create_component * e = fun_create_component_new(); e->create_component = create_component; e->arg = arg; fun_create_component_list_push_back(&recipe->list, e); } struct starpu_sched_component_composed_recipe * starpu_sched_component_composed_recipe_create_singleton(struct starpu_sched_component *(*create_component)(struct starpu_sched_tree *tree, void * arg), void * arg) { struct starpu_sched_component_composed_recipe * r = starpu_sched_component_composed_recipe_create(); starpu_sched_component_composed_recipe_add(r, create_component, arg); return r; } void starpu_sched_component_composed_recipe_destroy(struct starpu_sched_component_composed_recipe * recipe) { if(!recipe) return; while(!fun_create_component_list_empty(&recipe->list)) fun_create_component_delete(fun_create_component_list_pop_back(&recipe->list)); free(recipe); } struct composed_component { struct starpu_sched_component *top,*bottom; }; /* this function actualy build the composed component data by changing the list of * (component_create_fun, arg_create_fun) into a tree where all components have 1 childs */ struct composed_component create_composed_component(struct starpu_sched_tree *tree, struct starpu_sched_component_composed_recipe * recipe #ifdef STARPU_HAVE_HWLOC ,hwloc_obj_t obj #endif ) { struct composed_component c; STARPU_ASSERT(recipe); struct fun_create_component_list * list = &recipe->list; struct fun_create_component * i = fun_create_component_list_begin(list); STARPU_ASSERT(i); STARPU_ASSERT(i->create_component); c.top = c.bottom = i->create_component(tree, i->arg); #ifdef STARPU_HAVE_HWLOC c.top->obj = obj; #endif for(i = fun_create_component_list_next(i); i != fun_create_component_list_end(list); i = fun_create_component_list_next(i)) { STARPU_ASSERT(i->create_component); struct starpu_sched_component * component = i->create_component(tree, i->arg); #ifdef STARPU_HAVE_HWLOC component->obj = obj; #endif c.bottom->add_child(c.bottom, component); /* we want to be able to traverse scheduler bottom up for all sched ctxs * when a worker call pop() */ unsigned j; for(j = 0; j < STARPU_NMAX_SCHED_CTXS; j++) component->add_parent(component, c.bottom); c.bottom = component; } STARPU_ASSERT(!starpu_sched_component_is_worker(c.bottom)); return c; } static int composed_component_push_task(struct starpu_sched_component * component, struct starpu_task * task) { struct composed_component *c = component->data; return starpu_sched_component_push_task(component,c->top,task); } struct starpu_task * composed_component_pull_task(struct starpu_sched_component *component) { struct composed_component *c = component->data; struct starpu_task * task = NULL; task = starpu_sched_component_pull_task(c->bottom,component); if(task) return task; int i; for(i=0; i < component->nparents; i++) { if(component->parents[i] == NULL) continue; else { task = starpu_sched_component_pull_task(component->parents[i],component); if(task) break; } } return task; } double composed_component_estimated_load(struct starpu_sched_component * component) { struct composed_component * c = component->data; return c->top->estimated_load(c->top); } static void composed_component_add_child(struct starpu_sched_component * component, struct starpu_sched_component * child) { struct composed_component * c = component->data; component->add_child(component, child); c->bottom->add_child(c->bottom, child); } static void composed_component_remove_child(struct starpu_sched_component * component, struct starpu_sched_component * child) { struct composed_component * c = component->data; component->remove_child(component, child); c->bottom->remove_child(c->bottom, child); } static void composed_component_notify_change_workers(struct starpu_sched_component * component) { struct composed_component * c = component->data; struct starpu_bitmap * workers = component->workers; struct starpu_bitmap * workers_in_ctx = component->workers_in_ctx; struct starpu_sched_component * n; for(n = c->top; ;n = n->children[0]) { starpu_bitmap_unset_all(n->workers); starpu_bitmap_or(n->workers, workers); starpu_bitmap_unset_all(n->workers_in_ctx); starpu_bitmap_or(n->workers_in_ctx, workers_in_ctx); n->properties = component->properties; if(n == c->bottom) break; } } void composed_component_deinit_data(struct starpu_sched_component * _component) { struct composed_component *c = _component->data; c->bottom->children = NULL; c->bottom->nchildren = 0; struct starpu_sched_component * component = c->top; struct starpu_sched_component * next = NULL; do { component->workers = NULL; next = component->children ? component->children[0] : NULL; starpu_sched_component_destroy(component); } while(next); free(c); _component->data = NULL; } struct starpu_sched_component * starpu_sched_component_composed_component_create(struct starpu_sched_tree *tree, struct starpu_sched_component_composed_recipe * recipe) { STARPU_ASSERT(!fun_create_component_list_empty(&recipe->list)); struct fun_create_component_list * l = &recipe->list; if(l->_head == l->_tail) return l->_head->create_component(tree, l->_head->arg); struct starpu_sched_component * component = starpu_sched_component_create(tree, "composed"); struct composed_component *c; _STARPU_MALLOC(c, sizeof(struct composed_component)); *c = create_composed_component(tree, recipe #ifdef STARPU_HAVE_HWLOC , component->obj #endif ); c->bottom->nchildren = component->nchildren; c->bottom->children = component->children; c->bottom->nparents = component->nparents; c->bottom->parents = component->parents; component->data = c; component->push_task = composed_component_push_task; component->pull_task = composed_component_pull_task; component->estimated_load = composed_component_estimated_load; component->estimated_end = starpu_sched_component_estimated_end_min; component->add_child = composed_component_add_child; component->remove_child = composed_component_remove_child; component->notify_change_workers = composed_component_notify_change_workers; return component; } starpu-1.2.3+dfsg/src/sched_policies/component_eager.c000066400000000000000000000046331320135501600230310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include static int eager_push_task(struct starpu_sched_component * component, struct starpu_task * task) { int ret; STARPU_ASSERT(component && task && starpu_sched_component_is_eager(component)); STARPU_ASSERT(starpu_sched_component_can_execute_task(component,task)); int workerid; for(workerid = starpu_bitmap_first(component->workers_in_ctx); workerid != -1; workerid = starpu_bitmap_next(component->workers_in_ctx, workerid)) { int nimpl; for(nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) { if(starpu_worker_can_execute_task(workerid,task,nimpl) || starpu_combined_worker_can_execute_task(workerid, task, nimpl)) { int i; for (i = 0; i < component->nchildren; i++) { int idworker; for(idworker = starpu_bitmap_first(component->children[i]->workers); idworker != -1; idworker = starpu_bitmap_next(component->children[i]->workers, idworker)) { if (idworker == workerid) { if(starpu_sched_component_is_worker(component->children[i])) { component->children[i]->can_pull(component->children[i]); return 1; } else { ret = starpu_sched_component_push_task(component,component->children[i],task); if (!ret) return 0; } } } } } } } return 1; } int starpu_sched_component_is_eager(struct starpu_sched_component * component) { return component->push_task == eager_push_task; } struct starpu_sched_component * starpu_sched_component_eager_create(struct starpu_sched_tree *tree, void * arg STARPU_ATTRIBUTE_UNUSED) { struct starpu_sched_component * component = starpu_sched_component_create(tree, "eager"); component->push_task = eager_push_task; return component; } starpu-1.2.3+dfsg/src/sched_policies/component_eager_calibration.c000066400000000000000000000054561320135501600254040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include static int eager_calibration_push_task(struct starpu_sched_component * component, struct starpu_task * task) { STARPU_ASSERT(component && task && starpu_sched_component_is_eager_calibration(component)); STARPU_ASSERT(starpu_sched_component_can_execute_task(component,task)); starpu_task_bundle_t bundle = task->bundle; int workerid; for(workerid = starpu_bitmap_first(component->workers_in_ctx); workerid != -1; workerid = starpu_bitmap_next(component->workers_in_ctx, workerid)) { struct starpu_perfmodel_arch* archtype = starpu_worker_get_perf_archtype(workerid, component->tree->sched_ctx_id); int nimpl; for(nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) { if(starpu_worker_can_execute_task(workerid,task,nimpl) || starpu_combined_worker_can_execute_task(workerid, task, nimpl)) { double d; if(bundle) d = starpu_task_bundle_expected_length(bundle, archtype, nimpl); else d = starpu_task_expected_length(task, archtype, nimpl); if(isnan(d)) { int i; for (i = 0; i < component->nchildren; i++) { int idworker; for(idworker = starpu_bitmap_first(component->children[i]->workers); idworker != -1; idworker = starpu_bitmap_next(component->children[i]->workers, idworker)) { if (idworker == workerid) { if(starpu_sched_component_is_worker(component->children[i])) { component->children[i]->can_pull(component->children[i]); return 1; } else return starpu_sched_component_push_task(component,component->children[i],task); } } } } } } } return 1; } int starpu_sched_component_is_eager_calibration(struct starpu_sched_component * component) { return component->push_task == eager_calibration_push_task; } struct starpu_sched_component * starpu_sched_component_eager_calibration_create(struct starpu_sched_tree *tree, void * arg STARPU_ATTRIBUTE_UNUSED) { struct starpu_sched_component * component = starpu_sched_component_create(tree, "eager_calibration"); component->push_task = eager_calibration_push_task; return component; } starpu-1.2.3+dfsg/src/sched_policies/component_fifo.c000066400000000000000000000202071320135501600226640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 INRIA * Copyright (C) 2013 Simon Archipoff * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "fifo_queues.h" #include "sched_component.h" struct _starpu_fifo_data { struct _starpu_fifo_taskq * fifo; starpu_pthread_mutex_t mutex; unsigned ntasks_threshold; double exp_len_threshold; }; static void fifo_component_deinit_data(struct starpu_sched_component * component) { STARPU_ASSERT(component && component->data); struct _starpu_fifo_data * f = component->data; _starpu_destroy_fifo(f->fifo); STARPU_PTHREAD_MUTEX_DESTROY(&f->mutex); free(f); } static double fifo_estimated_end(struct starpu_sched_component * component) { STARPU_ASSERT(component && component->data); struct _starpu_fifo_data * data = component->data; struct _starpu_fifo_taskq * fifo = data->fifo; starpu_pthread_mutex_t * mutex = &data->mutex; int card = starpu_bitmap_cardinal(component->workers_in_ctx); STARPU_ASSERT(card != 0); double estimated_end = starpu_sched_component_estimated_end_average(component); STARPU_PTHREAD_MUTEX_LOCK(mutex); fifo->exp_start = STARPU_MAX(fifo->exp_start, starpu_timing_now()); estimated_end += fifo->exp_start + fifo->exp_len / card; STARPU_PTHREAD_MUTEX_UNLOCK(mutex); return estimated_end; } static double fifo_estimated_load(struct starpu_sched_component * component) { STARPU_ASSERT(component && component->data); STARPU_ASSERT(starpu_bitmap_cardinal(component->workers_in_ctx) != 0); struct _starpu_fifo_data * data = component->data; struct _starpu_fifo_taskq * fifo = data->fifo; starpu_pthread_mutex_t * mutex = &data->mutex; double relative_speedup = 0.0; double load = starpu_sched_component_estimated_load(component); if(STARPU_SCHED_COMPONENT_IS_HOMOGENEOUS(component)) { int first_worker = starpu_bitmap_first(component->workers_in_ctx); relative_speedup = starpu_worker_get_relative_speedup(starpu_worker_get_perf_archtype(first_worker, component->tree->sched_ctx_id)); STARPU_PTHREAD_MUTEX_LOCK(mutex); load += fifo->ntasks / relative_speedup; STARPU_PTHREAD_MUTEX_UNLOCK(mutex); return load; } else { int i; for(i = starpu_bitmap_first(component->workers_in_ctx); i != -1; i = starpu_bitmap_next(component->workers_in_ctx, i)) relative_speedup += starpu_worker_get_relative_speedup(starpu_worker_get_perf_archtype(i, component->tree->sched_ctx_id)); relative_speedup /= starpu_bitmap_cardinal(component->workers_in_ctx); STARPU_ASSERT(!_STARPU_IS_ZERO(relative_speedup)); STARPU_PTHREAD_MUTEX_LOCK(mutex); load += fifo->ntasks / relative_speedup; STARPU_PTHREAD_MUTEX_UNLOCK(mutex); } return load; } static int fifo_push_local_task(struct starpu_sched_component * component, struct starpu_task * task, unsigned is_pushback) { STARPU_ASSERT(component && component->data && task); STARPU_ASSERT(starpu_sched_component_can_execute_task(component,task)); struct _starpu_fifo_data * data = component->data; struct _starpu_fifo_taskq * fifo = data->fifo; starpu_pthread_mutex_t * mutex = &data->mutex; int ret = 0; STARPU_PTHREAD_MUTEX_LOCK(mutex); double exp_len; if(!isnan(task->predicted)) exp_len = fifo->exp_len + task->predicted; else exp_len = fifo->exp_len; if((data->ntasks_threshold != 0) && (data->exp_len_threshold != 0.0) && ((fifo->ntasks >= data->ntasks_threshold) || (exp_len >= data->exp_len_threshold))) { static int warned; if(task->predicted > data->exp_len_threshold && !warned) { _STARPU_DISP("Warning : a predicted task length (%lf) exceeds the expected length threshold (%lf) of a prio component queue, you should reconsider the value of this threshold. This message will not be printed again for further thresholds exceeding.\n",task->predicted,data->exp_len_threshold); warned = 1; } STARPU_ASSERT(!is_pushback); ret = 1; STARPU_PTHREAD_MUTEX_UNLOCK(mutex); } else { if(is_pushback) ret = _starpu_fifo_push_back_task(fifo,task); else { ret = _starpu_fifo_push_task(fifo,task); starpu_sched_component_prefetch_on_node(component, task); } if(!isnan(task->predicted)) { fifo->exp_len = exp_len; fifo->exp_end = fifo->exp_start + fifo->exp_len; } STARPU_ASSERT(!isnan(fifo->exp_end)); STARPU_ASSERT(!isnan(fifo->exp_len)); STARPU_ASSERT(!isnan(fifo->exp_start)); if(!is_pushback) component->can_pull(component); STARPU_PTHREAD_MUTEX_UNLOCK(mutex); } return ret; } static int fifo_push_task(struct starpu_sched_component * component, struct starpu_task * task) { return fifo_push_local_task(component, task, 0); } static struct starpu_task * fifo_pull_task(struct starpu_sched_component * component) { STARPU_ASSERT(component && component->data); struct _starpu_fifo_data * data = component->data; struct _starpu_fifo_taskq * fifo = data->fifo; starpu_pthread_mutex_t * mutex = &data->mutex; STARPU_PTHREAD_MUTEX_LOCK(mutex); struct starpu_task * task = _starpu_fifo_pop_task(fifo, starpu_worker_get_id_check()); if(task) { if(!isnan(task->predicted)) { fifo->exp_start = starpu_timing_now() + task->predicted; fifo->exp_len -= task->predicted; } fifo->exp_end = fifo->exp_start + fifo->exp_len; if(fifo->ntasks == 0) fifo->exp_len = 0.0; } STARPU_ASSERT(!isnan(fifo->exp_end)); STARPU_ASSERT(!isnan(fifo->exp_len)); STARPU_ASSERT(!isnan(fifo->exp_start)); STARPU_PTHREAD_MUTEX_UNLOCK(mutex); // When a pop is called, a can_push is called for pushing tasks onto // the empty place of the queue left by the popped task. int i,ret; for(i=0; i < component->nparents; i++) { if(component->parents[i] == NULL) continue; else { ret = component->parents[i]->can_push(component->parents[i]); if(ret) break; } } if(task) return task; return NULL; } /* When a can_push is caught by this function, we try to pop and push * tasks from our local queue as much as possible, until a * push fails, which means that the worker fifo_components are * currently "full". */ static int fifo_can_push(struct starpu_sched_component * component) { STARPU_ASSERT(component && starpu_sched_component_is_fifo(component)); int ret = 0; int res = 0; STARPU_ASSERT(component->nchildren == 1); struct starpu_sched_component * child = component->children[0]; struct starpu_task * task = starpu_sched_component_pull_task(component,NULL); if(task) ret = starpu_sched_component_push_task(NULL,child,task); while(task && !ret) { if(!res) res = 1; task = starpu_sched_component_pull_task(component,NULL); if(task) ret = starpu_sched_component_push_task(NULL,child,task); } if(task && ret) fifo_push_local_task(component,task,1); return res; } int starpu_sched_component_is_fifo(struct starpu_sched_component * component) { return component->push_task == fifo_push_task; } struct starpu_sched_component * starpu_sched_component_fifo_create(struct starpu_sched_tree *tree, struct starpu_sched_component_fifo_data * params) { struct starpu_sched_component * component = starpu_sched_component_create(tree, "fifo"); struct _starpu_fifo_data * data; _STARPU_MALLOC(data, sizeof(*data)); data->fifo = _starpu_create_fifo(); STARPU_PTHREAD_MUTEX_INIT(&data->mutex,NULL); component->data = data; component->estimated_end = fifo_estimated_end; component->estimated_load = fifo_estimated_load; component->push_task = fifo_push_task; component->pull_task = fifo_pull_task; component->can_push = fifo_can_push; component->deinit_data = fifo_component_deinit_data; if(params) { data->ntasks_threshold=params->ntasks_threshold; data->exp_len_threshold=params->exp_len_threshold; } else { data->ntasks_threshold=0; data->exp_len_threshold=0.0; } return component; } starpu-1.2.3+dfsg/src/sched_policies/component_heft.c000066400000000000000000000161331320135501600226720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2017 Université de Bordeaux * Copyright (C) 2013 INRIA * Copyright (C) 2013 Simon Archipoff * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* HEFT variant which tries to schedule a given number of tasks instead of just * the first of its scheduling window, and actually schedule the task for which * the most benefit is achieved. */ #include #include "prio_deque.h" #include "sched_component.h" #include #include "helper_mct.h" #include #include #define NTASKS 5 struct _starpu_heft_data { struct _starpu_prio_deque prio; starpu_pthread_mutex_t mutex; struct _starpu_mct_data *mct_data; }; static int heft_progress_one(struct starpu_sched_component *component) { struct _starpu_heft_data * data = component->data; starpu_pthread_mutex_t * mutex = &data->mutex; struct _starpu_prio_deque * prio = &data->prio; struct starpu_task * (tasks[NTASKS]); unsigned ntasks; STARPU_PTHREAD_MUTEX_LOCK(mutex); /* Try to look at NTASKS from the queue */ for (ntasks = 0; ntasks < NTASKS; ntasks++) { tasks[ntasks] = _starpu_prio_deque_pop_task(prio); if (!tasks[ntasks]) break; } STARPU_PTHREAD_MUTEX_UNLOCK(mutex); if (!ntasks) { return 1; } { struct _starpu_mct_data * d = data->mct_data; struct starpu_sched_component * best_component = NULL; unsigned n, i; /* Estimated task duration for each child */ double estimated_lengths[component->nchildren * ntasks]; /* Estimated transfer duration for each child */ double estimated_transfer_length[component->nchildren * ntasks]; /* Estimated transfer+task termination for each child */ double estimated_ends_with_task[component->nchildren * ntasks]; /* Minimum transfer+task termination on all children */ double min_exp_end_with_task[ntasks]; /* Maximum transfer+task termination on all children */ double max_exp_end_with_task[ntasks]; int suitable_components[component->nchildren * ntasks]; unsigned nsuitable_components[ntasks]; /* Estimate durations */ for (n = 0; n < ntasks; n++) { int offset = component->nchildren * n; min_exp_end_with_task[n] = DBL_MAX; max_exp_end_with_task[n] = 0.0; nsuitable_components[n] = starpu_mct_compute_expected_times(component, tasks[n], estimated_lengths + offset, estimated_transfer_length + offset, estimated_ends_with_task + offset, &min_exp_end_with_task[n], &max_exp_end_with_task[n], suitable_components + offset); } int best_task = 0; double max_benefit = 0; /* Find the task which provides the most computation time benefit */ for (n = 1; n < ntasks; n++) { double benefit = max_exp_end_with_task[n] - min_exp_end_with_task[n]; if (max_benefit < benefit) { max_benefit = benefit; best_task = n; } } double best_fitness = DBL_MAX; int best_icomponent = -1; /* Push back the other tasks */ STARPU_PTHREAD_MUTEX_LOCK(mutex); for (n = ntasks - 1; n < ntasks; n--) if ((int) n != best_task) _starpu_prio_deque_push_back_task(prio, tasks[n]); STARPU_PTHREAD_MUTEX_UNLOCK(mutex); /* And now find out which worker suits best for this task, * including data transfer */ for(i = 0; i < nsuitable_components[best_task]; i++) { int offset = component->nchildren * best_task; int icomponent = suitable_components[offset + i]; #ifdef STARPU_DEVEL #warning FIXME: take energy consumption into account #endif double tmp = starpu_mct_compute_fitness(d, estimated_ends_with_task[offset + icomponent] - estimated_transfer_length[offset + icomponent], min_exp_end_with_task[best_task], max_exp_end_with_task[best_task], estimated_transfer_length[offset + icomponent], 0.0); if(tmp < best_fitness) { best_fitness = tmp; best_icomponent = icomponent; } } STARPU_ASSERT(best_icomponent != -1); STARPU_ASSERT(best_task >= 0); best_component = component->children[best_icomponent]; if(starpu_sched_component_is_worker(best_component)) { best_component->can_pull(best_component); return 1; } _STARPU_TASK_BREAK_ON(tasks[best_task], sched); int ret = starpu_sched_component_push_task(component, best_component, tasks[best_task]); if (ret) { /* Could not push to child actually, push that one back too */ STARPU_PTHREAD_MUTEX_LOCK(mutex); _starpu_prio_deque_push_back_task(prio, tasks[best_task]); STARPU_PTHREAD_MUTEX_UNLOCK(mutex); return 1; } else return 0; } } /* Try to push some tasks below */ static void heft_progress(struct starpu_sched_component *component) { STARPU_ASSERT(component && starpu_sched_component_is_heft(component)); while (!heft_progress_one(component)) ; } static int heft_push_task(struct starpu_sched_component * component, struct starpu_task * task) { STARPU_ASSERT(component && task && starpu_sched_component_is_heft(component)); struct _starpu_heft_data * data = component->data; struct _starpu_prio_deque * prio = &data->prio; starpu_pthread_mutex_t * mutex = &data->mutex; STARPU_PTHREAD_MUTEX_LOCK(mutex); _starpu_prio_deque_push_task(prio,task); STARPU_PTHREAD_MUTEX_UNLOCK(mutex); heft_progress(component); return 0; } static int heft_can_push(struct starpu_sched_component *component) { heft_progress(component); int ret = 0, j; for(j=0; j < component->nparents; j++) { if(component->parents[j] == NULL) continue; else { ret = component->parents[j]->can_push(component->parents[j]); if(ret) break; } } return ret; } static void heft_component_deinit_data(struct starpu_sched_component * component) { STARPU_ASSERT(starpu_sched_component_is_heft(component)); struct _starpu_heft_data * d = component->data; struct _starpu_mct_data * mct_d = d->mct_data; _starpu_prio_deque_destroy(&d->prio); free(mct_d); free(d); } int starpu_sched_component_is_heft(struct starpu_sched_component * component) { return component->push_task == heft_push_task; } struct starpu_sched_component * starpu_sched_component_heft_create(struct starpu_sched_tree *tree, struct starpu_sched_component_mct_data * params) { struct starpu_sched_component * component = starpu_sched_component_create(tree, "heft"); struct _starpu_mct_data *mct_data = starpu_mct_init_parameters(params); struct _starpu_heft_data *data; _STARPU_MALLOC(data, sizeof(*data)); _starpu_prio_deque_init(&data->prio); STARPU_PTHREAD_MUTEX_INIT(&data->mutex,NULL); data->mct_data = mct_data; component->data = data; component->push_task = heft_push_task; component->can_push = heft_can_push; component->deinit_data = heft_component_deinit_data; return component; } starpu-1.2.3+dfsg/src/sched_policies/component_mct.c000066400000000000000000000105201320135501600225210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2017 Université de Bordeaux * Copyright (C) 2013 INRIA * Copyright (C) 2013 Simon Archipoff * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "sched_component.h" #include #include "helper_mct.h" #include #include static int mct_push_task(struct starpu_sched_component * component, struct starpu_task * task) { STARPU_ASSERT(component && task && starpu_sched_component_is_mct(component)); struct _starpu_mct_data * d = component->data; struct starpu_sched_component * best_component = NULL; /* Estimated task duration for each child */ double estimated_lengths[component->nchildren]; /* Estimated transfer duration for each child */ double estimated_transfer_length[component->nchildren]; /* Estimated transfer+task termination for each child */ double estimated_ends_with_task[component->nchildren]; int i; for(i=0; i < component->nchildren; i++) { estimated_lengths[i] = 0.0; estimated_transfer_length[i] = 0.0; estimated_ends_with_task[i] = 0.0; } /* Minimum transfer+task termination on all children */ double min_exp_end_with_task = DBL_MAX; /* Maximum transfer+task termination on all children */ double max_exp_end_with_task = 0.0; int suitable_components[component->nchildren]; int nsuitable_components = 0; nsuitable_components = starpu_mct_compute_expected_times(component, task, estimated_lengths, estimated_transfer_length, estimated_ends_with_task, &min_exp_end_with_task, &max_exp_end_with_task, suitable_components); /* If no suitable components were found, it means that the perfmodel of * the task had been purged since it has been pushed on the mct component. * We should send a push_fail message to its parent so that it will * be able to reschedule the task properly. */ if(nsuitable_components == 0) return 1; double best_fitness = DBL_MAX; int best_icomponent = -1; for(i = 0; i < nsuitable_components; i++) { int icomponent = suitable_components[i]; #ifdef STARPU_DEVEL #warning FIXME: take energy consumption into account #endif double tmp = starpu_mct_compute_fitness(d, estimated_ends_with_task[icomponent] - estimated_transfer_length[icomponent], min_exp_end_with_task, max_exp_end_with_task, estimated_transfer_length[icomponent], 0.0); if(tmp < best_fitness) { best_fitness = tmp; best_icomponent = icomponent; } } /* If no best component is found, it means that the perfmodel of * the task had been purged since it has been pushed on the mct component. * We should send a push_fail message to its parent so that it will * be able to reschedule the task properly. */ if(best_icomponent == -1) return 1; best_component = component->children[best_icomponent]; if(starpu_sched_component_is_worker(best_component)) { best_component->can_pull(best_component); return 1; } _STARPU_TASK_BREAK_ON(task, sched); int ret = starpu_sched_component_push_task(component, best_component, task); return ret; } static void mct_component_deinit_data(struct starpu_sched_component * component) { STARPU_ASSERT(starpu_sched_component_is_mct(component)); struct _starpu_mct_data * d = component->data; free(d); } int starpu_sched_component_is_mct(struct starpu_sched_component * component) { return component->push_task == mct_push_task; } struct starpu_sched_component * starpu_sched_component_mct_create(struct starpu_sched_tree *tree, struct starpu_sched_component_mct_data * params) { struct starpu_sched_component * component = starpu_sched_component_create(tree, "mct"); struct _starpu_mct_data *data = starpu_mct_init_parameters(params); component->data = data; component->push_task = mct_push_task; component->deinit_data = mct_component_deinit_data; return component; } starpu-1.2.3+dfsg/src/sched_policies/component_perfmodel_select.c000066400000000000000000000071331320135501600252600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include /* The decision component takes care of the scheduling of tasks which are not * calibrated, or tasks which don't have a performance model, because the scheduling * architecture of this scheduler for tasks with no performance model is exactly * the same as the tree-prio scheduler. * Tasks with a perfmodel are pushed to the perfmodel_component, which takes care of the * scheduling of those tasks on the correct worker_component. */ struct _starpu_perfmodel_select_data { struct starpu_sched_component * calibrator_component; struct starpu_sched_component * no_perfmodel_component; struct starpu_sched_component * perfmodel_component; }; static int perfmodel_select_push_task(struct starpu_sched_component * component, struct starpu_task * task) { STARPU_ASSERT(component && component->data && task && starpu_sched_component_is_perfmodel_select(component)); STARPU_ASSERT(starpu_sched_component_can_execute_task(component,task)); struct _starpu_perfmodel_select_data * data = component->data; double length; int can_execute = starpu_sched_component_execute_preds(component,task,&length); if(can_execute) { if(isnan(length)) { static int warned; if (!warned) { warned = 1; _STARPU_DISP("Warning: performance model for %s not finished calibrating, using a dumb scheduling heuristic for now\n",starpu_task_get_name(task)); } return starpu_sched_component_push_task(component,data->calibrator_component,task); } if(_STARPU_IS_ZERO(length)) return starpu_sched_component_push_task(component,data->no_perfmodel_component,task); return starpu_sched_component_push_task(component,data->perfmodel_component,task); } else return 1; } static void perfmodel_select_component_deinit_data(struct starpu_sched_component * component) { STARPU_ASSERT(component && component->data); struct _starpu_perfmodel_select_data * d = component->data; free(d); } int starpu_sched_component_is_perfmodel_select(struct starpu_sched_component * component) { return component->push_task == perfmodel_select_push_task; } struct starpu_sched_component * starpu_sched_component_perfmodel_select_create(struct starpu_sched_tree *tree, struct starpu_sched_component_perfmodel_select_data * params) { STARPU_ASSERT(params); STARPU_ASSERT(params->calibrator_component && params->no_perfmodel_component && params->perfmodel_component); struct starpu_sched_component * component = starpu_sched_component_create(tree, "perfmodel_selector"); struct _starpu_perfmodel_select_data *data; _STARPU_MALLOC(data, sizeof(*data)); data->calibrator_component = params->calibrator_component; data->no_perfmodel_component = params->no_perfmodel_component; data->perfmodel_component = params->perfmodel_component; component->data = data; component->push_task = perfmodel_select_push_task; component->deinit_data = perfmodel_select_component_deinit_data; component->estimated_end = starpu_sched_component_estimated_end_min; return component; } starpu-1.2.3+dfsg/src/sched_policies/component_prio.c000066400000000000000000000224741320135501600227220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "prio_deque.h" #include "sched_component.h" #ifdef STARPU_USE_FXT #define STARPU_TRACE_SCHED_COMPONENT_PUSH_PRIO(component,ntasks,exp_len) do { \ int workerid = STARPU_NMAXWORKERS + 1; \ if((component->nchildren == 1) && starpu_sched_component_is_worker(component->children[0])) \ workerid = starpu_sched_component_worker_get_workerid(component->children[0]); \ _STARPU_TRACE_SCHED_COMPONENT_PUSH_PRIO(workerid, ntasks, exp_len); \ } while (0) #define STARPU_TRACE_SCHED_COMPONENT_POP_PRIO(component,ntasks,exp_len) do { \ int workerid = STARPU_NMAXWORKERS + 1; \ if((component->nchildren == 1) && starpu_sched_component_is_worker(component->children[0])) \ workerid = starpu_sched_component_worker_get_workerid(component->children[0]); \ _STARPU_TRACE_SCHED_COMPONENT_POP_PRIO(workerid, ntasks, exp_len); \ } while (0) #else #define STARPU_TRACE_SCHED_COMPONENT_PUSH_PRIO(component,ntasks,exp_len) do { } while (0) #define STARPU_TRACE_SCHED_COMPONENT_POP_PRIO(component,ntasks,exp_len) do { } while (0) #endif struct _starpu_prio_data { struct _starpu_prio_deque prio; starpu_pthread_mutex_t mutex; unsigned ntasks_threshold; double exp_len_threshold; }; static void prio_component_deinit_data(struct starpu_sched_component * component) { STARPU_ASSERT(component && component->data); struct _starpu_prio_data * f = component->data; _starpu_prio_deque_destroy(&f->prio); STARPU_PTHREAD_MUTEX_DESTROY(&f->mutex); free(f); } static double prio_estimated_end(struct starpu_sched_component * component) { STARPU_ASSERT(component && component->data); struct _starpu_prio_data * data = component->data; struct _starpu_prio_deque * prio = &data->prio; starpu_pthread_mutex_t * mutex = &data->mutex; int card = starpu_bitmap_cardinal(component->workers_in_ctx); STARPU_ASSERT(card != 0); double estimated_end = starpu_sched_component_estimated_end_average(component); STARPU_PTHREAD_MUTEX_LOCK(mutex); prio->exp_start = STARPU_MAX(prio->exp_start, starpu_timing_now()); estimated_end += prio->exp_start + prio->exp_len / card; STARPU_PTHREAD_MUTEX_UNLOCK(mutex); return estimated_end; } static double prio_estimated_load(struct starpu_sched_component * component) { STARPU_ASSERT(component && component->data); STARPU_ASSERT(starpu_bitmap_cardinal(component->workers_in_ctx) != 0); struct _starpu_prio_data * data = component->data; struct _starpu_prio_deque * prio = &data->prio; starpu_pthread_mutex_t * mutex = &data->mutex; double relative_speedup = 0.0; double load = starpu_sched_component_estimated_load(component); if(STARPU_SCHED_COMPONENT_IS_HOMOGENEOUS(component)) { int first_worker = starpu_bitmap_first(component->workers_in_ctx); relative_speedup = starpu_worker_get_relative_speedup(starpu_worker_get_perf_archtype(first_worker, component->tree->sched_ctx_id)); STARPU_PTHREAD_MUTEX_LOCK(mutex); load += prio->ntasks / relative_speedup; STARPU_PTHREAD_MUTEX_UNLOCK(mutex); return load; } else { int i; for(i = starpu_bitmap_first(component->workers_in_ctx); i != -1; i = starpu_bitmap_next(component->workers_in_ctx, i)) relative_speedup += starpu_worker_get_relative_speedup(starpu_worker_get_perf_archtype(i, component->tree->sched_ctx_id)); relative_speedup /= starpu_bitmap_cardinal(component->workers_in_ctx); STARPU_ASSERT(!_STARPU_IS_ZERO(relative_speedup)); STARPU_PTHREAD_MUTEX_LOCK(mutex); load += prio->ntasks / relative_speedup; STARPU_PTHREAD_MUTEX_UNLOCK(mutex); } return load; } static int prio_push_local_task(struct starpu_sched_component * component, struct starpu_task * task, unsigned is_pushback) { STARPU_ASSERT(component && component->data && task); STARPU_ASSERT(starpu_sched_component_can_execute_task(component,task)); struct _starpu_prio_data * data = component->data; struct _starpu_prio_deque * prio = &data->prio; starpu_pthread_mutex_t * mutex = &data->mutex; int ret; STARPU_PTHREAD_MUTEX_LOCK(mutex); double exp_len; if(!isnan(task->predicted)) exp_len = prio->exp_len + task->predicted; else exp_len = prio->exp_len; if((data->ntasks_threshold != 0) && (data->exp_len_threshold != 0.0) && ((prio->ntasks >= data->ntasks_threshold) || (exp_len >= data->exp_len_threshold))) { static int warned; if(task->predicted > data->exp_len_threshold && !warned) { _STARPU_DISP("Warning : a predicted task length (%lf) exceeds the expected length threshold (%lf) of a prio component queue, you should reconsider the value of this threshold. This message will not be printed again for further thresholds exceeding.\n",task->predicted,data->exp_len_threshold); warned = 1; } ret = 1; STARPU_PTHREAD_MUTEX_UNLOCK(mutex); } else { if(is_pushback) ret = _starpu_prio_deque_push_back_task(prio,task); else { ret = _starpu_prio_deque_push_task(prio,task); starpu_sched_component_prefetch_on_node(component, task); STARPU_TRACE_SCHED_COMPONENT_PUSH_PRIO(component, prio->ntasks, exp_len); } if(!isnan(task->predicted)) { prio->exp_len = exp_len; prio->exp_end = prio->exp_start + prio->exp_len; } STARPU_ASSERT(!isnan(prio->exp_end)); STARPU_ASSERT(!isnan(prio->exp_len)); STARPU_ASSERT(!isnan(prio->exp_start)); if(!is_pushback) component->can_pull(component); STARPU_PTHREAD_MUTEX_UNLOCK(mutex); } return ret; } static int prio_push_task(struct starpu_sched_component * component, struct starpu_task * task) { int ret = prio_push_local_task(component, task, 0); return ret; } static struct starpu_task * prio_pull_task(struct starpu_sched_component * component) { STARPU_ASSERT(component && component->data); struct _starpu_prio_data * data = component->data; struct _starpu_prio_deque * prio = &data->prio; starpu_pthread_mutex_t * mutex = &data->mutex; STARPU_PTHREAD_MUTEX_LOCK(mutex); struct starpu_task * task = _starpu_prio_deque_pop_task(prio); if(task) { if(!isnan(task->predicted)) { prio->exp_start = starpu_timing_now() + task->predicted; prio->exp_len -= task->predicted; } prio->exp_end = prio->exp_start + prio->exp_len; if(prio->ntasks == 0) prio->exp_len = 0.0; STARPU_TRACE_SCHED_COMPONENT_POP_PRIO(component, prio->ntasks, prio->exp_len); } STARPU_ASSERT(!isnan(prio->exp_end)); STARPU_ASSERT(!isnan(prio->exp_len)); STARPU_ASSERT(!isnan(prio->exp_start)); STARPU_PTHREAD_MUTEX_UNLOCK(mutex); // When a pop is called, a can_push is called for pushing tasks onto // the empty place of the queue left by the popped task. int i,ret; for(i=0; i < component->nparents; i++) { if(component->parents[i] == NULL) continue; else { ret = component->parents[i]->can_push(component->parents[i]); if(ret) break; } } if(task) return task; return NULL; } /* When a can_push is caught by this function, we try to pop and push * tasks from our local queue as much as possible, until a * push fails, which means that the worker prio_components are * currently "full". */ static int prio_can_push(struct starpu_sched_component * component) { STARPU_ASSERT(component && starpu_sched_component_is_prio(component)); int ret = 0; int res = 0; STARPU_ASSERT(component->nchildren == 1); struct starpu_sched_component * child = component->children[0]; struct starpu_task * task = starpu_sched_component_pull_task(component, component); if(task) ret = starpu_sched_component_push_task(component,child,task); while(task && !ret) { if(!res) res = 1; task = starpu_sched_component_pull_task(component,component); if(task) ret = starpu_sched_component_push_task(component,child,task); } if(task && ret) prio_push_local_task(component,task,1); return res; } int starpu_sched_component_is_prio(struct starpu_sched_component * component) { return component->push_task == prio_push_task; } struct starpu_sched_component * starpu_sched_component_prio_create(struct starpu_sched_tree *tree, struct starpu_sched_component_prio_data * params) { struct starpu_sched_component * component = starpu_sched_component_create(tree, "prio"); struct _starpu_prio_data *data; _STARPU_MALLOC(data, sizeof(*data)); _starpu_prio_deque_init(&data->prio); STARPU_PTHREAD_MUTEX_INIT(&data->mutex,NULL); component->data = data; component->estimated_end = prio_estimated_end; component->estimated_load = prio_estimated_load; component->push_task = prio_push_task; component->pull_task = prio_pull_task; component->can_push = prio_can_push; component->deinit_data = prio_component_deinit_data; if(params) { data->ntasks_threshold=params->ntasks_threshold; data->exp_len_threshold=params->exp_len_threshold; } else { data->ntasks_threshold=0; data->exp_len_threshold=0.0; } return component; } starpu-1.2.3+dfsg/src/sched_policies/component_random.c000066400000000000000000000062131320135501600232220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 INRIA * Copyright (C) 2013 Simon Archipoff * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include static double compute_relative_speedup(struct starpu_sched_component * component) { double sum = 0.0; int id; for(id = starpu_bitmap_first(component->workers_in_ctx); id != -1; id = starpu_bitmap_next(component->workers_in_ctx, id)) { struct starpu_perfmodel_arch* perf_arch = starpu_worker_get_perf_archtype(id, component->tree->sched_ctx_id); sum += starpu_worker_get_relative_speedup(perf_arch); } STARPU_ASSERT(sum != 0.0); return sum; } static int random_push_task(struct starpu_sched_component * component, struct starpu_task * task) { STARPU_ASSERT(component->nchildren > 0); /* indexes_components and size are used to memoize component that can execute tasks * during the first phase of algorithm, it contain the size indexes of the components * that can execute task. */ int indexes_components[component->nchildren]; int size=0; /* speedup[i] is revelant only if i is in the size firsts elements of * indexes_components */ double speedup[component->nchildren]; double alpha_sum = 0.0; int i; for(i = 0; i < component->nchildren ; i++) { if(starpu_sched_component_can_execute_task(component->children[i],task)) { speedup[size] = compute_relative_speedup(component->children[i]); alpha_sum += speedup[size]; indexes_components[size] = i; size++; } } if(size == 0) return -ENODEV; /* not fully sure that this code is correct * because of bad properties of double arithmetic */ double random = starpu_drand48()*alpha_sum; double alpha = 0.0; struct starpu_sched_component * select = NULL; for(i = 0; i < size ; i++) { int index = indexes_components[i]; if(alpha + speedup[i] >= random) { select = component->children[index]; break; } alpha += speedup[i]; } STARPU_ASSERT(select != NULL); if(starpu_sched_component_is_worker(select)) { select->can_pull(select); return 1; } _STARPU_TASK_BREAK_ON(task, sched); int ret_val = starpu_sched_component_push_task(component,select,task); return ret_val; } int starpu_sched_component_is_random(struct starpu_sched_component *component) { return component->push_task == random_push_task; } struct starpu_sched_component * starpu_sched_component_random_create(struct starpu_sched_tree *tree, void * arg STARPU_ATTRIBUTE_UNUSED) { struct starpu_sched_component * component = starpu_sched_component_create(tree, "random"); component->push_task = random_push_task; return component; } starpu-1.2.3+dfsg/src/sched_policies/component_sched.c000066400000000000000000000474661320135501600230470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 INRIA * Copyright (C) 2013 Simon Archipoff * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include "sched_component.h" /****************************************************************************** * Generic Scheduling Components' helper functions * ******************************************************************************/ /* this function find the best implementation or an implementation that need to be calibrated for a worker available * and set prediction in *length. nan if a implementation need to be calibrated, 0.0 if no perf model are available * return false if no worker on the component can execute that task */ int starpu_sched_component_execute_preds(struct starpu_sched_component * component, struct starpu_task * task, double * length) { STARPU_ASSERT(component && task); int can_execute = 0; starpu_task_bundle_t bundle = task->bundle; double len = DBL_MAX; int workerid; for(workerid = starpu_bitmap_first(component->workers_in_ctx); workerid != -1; workerid = starpu_bitmap_next(component->workers_in_ctx, workerid)) { struct starpu_perfmodel_arch* archtype = starpu_worker_get_perf_archtype(workerid, component->tree->sched_ctx_id); int nimpl; for(nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) { if(starpu_worker_can_execute_task(workerid,task,nimpl) || starpu_combined_worker_can_execute_task(workerid, task, nimpl)) { double d; can_execute = 1; if(bundle) d = starpu_task_bundle_expected_length(bundle, archtype, nimpl); else d = starpu_task_expected_length(task, archtype, nimpl); if(isnan(d)) { *length = d; return can_execute; } if(_STARPU_IS_ZERO(d)) { continue; } if(d < len) { len = d; } } } if(STARPU_SCHED_COMPONENT_IS_HOMOGENEOUS(component)) break; } if(len == DBL_MAX) /* we dont have perf model */ len = 0.0; if(length) *length = len; return can_execute; } /* very similar function that dont compute prediction */ int starpu_sched_component_can_execute_task(struct starpu_sched_component * component, struct starpu_task * task) { STARPU_ASSERT(task); STARPU_ASSERT(component); unsigned nimpl; int worker; for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) for(worker = starpu_bitmap_first(component->workers_in_ctx); -1 != worker; worker = starpu_bitmap_next(component->workers_in_ctx, worker)) if (starpu_worker_can_execute_task(worker, task, nimpl) || starpu_combined_worker_can_execute_task(worker, task, nimpl)) return 1; return 0; } /* compute the average of transfer length for tasks on all workers * maybe this should be optimised if all workers are under the same numa component */ double starpu_sched_component_transfer_length(struct starpu_sched_component * component, struct starpu_task * task) { STARPU_ASSERT(component && task); int nworkers = starpu_bitmap_cardinal(component->workers_in_ctx); double sum = 0.0; int worker; if(STARPU_SCHED_COMPONENT_IS_SINGLE_MEMORY_NODE(component)) { unsigned memory_node = starpu_worker_get_memory_node(starpu_bitmap_first(component->workers_in_ctx)); if(task->bundle) return starpu_task_bundle_expected_data_transfer_time(task->bundle,memory_node); else return starpu_task_expected_data_transfer_time(memory_node, task); } for(worker = starpu_bitmap_first(component->workers_in_ctx); worker != -1; worker = starpu_bitmap_next(component->workers_in_ctx, worker)) { unsigned memory_node = starpu_worker_get_memory_node(worker); if(task->bundle) { sum += starpu_task_bundle_expected_data_transfer_time(task->bundle,memory_node); } else { sum += starpu_task_expected_data_transfer_time(memory_node, task); /* sum += starpu_task_expected_conversion_time(task, starpu_worker_get_perf_archtype(worker, component->tree->sched_ctx_id), impl ?) * I dont know what to do as we dont know what implementation would be used here... */ } } return sum / nworkers; } /* This function can be called by components when they think that a prefetching request can be submitted. * For example, it is currently used by the MCT component to begin the prefetching on accelerators * on which it pushed tasks as soon as possible. */ void starpu_sched_component_prefetch_on_node(struct starpu_sched_component * component, struct starpu_task * task) { if (starpu_get_prefetch_flag() && (!task->prefetched) && (component->properties >= STARPU_SCHED_COMPONENT_SINGLE_MEMORY_NODE)) { int worker = starpu_bitmap_first(component->workers_in_ctx); unsigned memory_node = starpu_worker_get_memory_node(worker); starpu_prefetch_task_input_on_node(task, memory_node); task->prefetched = 1; } } /* remove all child * for all child of component, if child->parents[x] == component, set child->parents[x] to null * call component->deinit_data */ void starpu_sched_component_destroy(struct starpu_sched_component *component) { STARPU_ASSERT(component); int i,j; for(i = 0; i < component->nchildren; i++) { struct starpu_sched_component * child = component->children[i]; for(j = 0; j < child->nparents; j++) if(child->parents[j] == component) child->remove_parent(child,component); } while(component->nchildren != 0) component->remove_child(component, component->children[0]); for(i = 0; i < component->nparents; i++) { struct starpu_sched_component * parent = component->parents[i]; for(j = 0; j < parent->nchildren; j++) if(parent->children[j] == component) parent->remove_child(parent,component); } while(component->nparents != 0) component->remove_parent(component, component->parents[0]); component->deinit_data(component); free(component->children); free(component->parents); free(component->name); starpu_bitmap_destroy(component->workers); starpu_bitmap_destroy(component->workers_in_ctx); free(component); } void starpu_sched_component_destroy_rec(struct starpu_sched_component * component) { if(component == NULL) return; int i = 0; while(i < component->nchildren) { if (starpu_sched_component_is_worker(component->children[i])) i++; else starpu_sched_component_destroy_rec(component->children[i]); } if (!starpu_sched_component_is_worker(component)) starpu_sched_component_destroy(component); } void set_properties(struct starpu_sched_component * component) { STARPU_ASSERT(component); component->properties = 0; int worker = starpu_bitmap_first(component->workers_in_ctx); if (worker == -1) return; #ifdef STARPU_DEVEL #warning FIXME: Not all CUDA devices have the same speed #endif uint32_t first_worker = _starpu_get_worker_struct(worker)->worker_mask; unsigned first_memory_node = _starpu_get_worker_struct(worker)->memory_node; int is_homogeneous = 1; int is_all_same_component = 1; for(; worker != -1; worker = starpu_bitmap_next(component->workers_in_ctx, worker)) { if(first_worker != _starpu_get_worker_struct(worker)->worker_mask) is_homogeneous = 0; if(first_memory_node != _starpu_get_worker_struct(worker)->memory_node) is_all_same_component = 0; } if(is_homogeneous) component->properties |= STARPU_SCHED_COMPONENT_HOMOGENEOUS; if(is_all_same_component) component->properties |= STARPU_SCHED_COMPONENT_SINGLE_MEMORY_NODE; } /* recursively set the component->workers member of component's subtree */ void _starpu_sched_component_update_workers(struct starpu_sched_component * component) { STARPU_ASSERT(component); if(starpu_sched_component_is_worker(component)) return; starpu_bitmap_unset_all(component->workers); int i; for(i = 0; i < component->nchildren; i++) { _starpu_sched_component_update_workers(component->children[i]); starpu_bitmap_or(component->workers, component->children[i]->workers); component->notify_change_workers(component); } } /* recursively set the component->workers_in_ctx in component's subtree */ void _starpu_sched_component_update_workers_in_ctx(struct starpu_sched_component * component, unsigned sched_ctx_id) { STARPU_ASSERT(component); if(starpu_sched_component_is_worker(component)) return; struct starpu_bitmap * workers_in_ctx = _starpu_get_worker_mask(sched_ctx_id); starpu_bitmap_unset_and(component->workers_in_ctx,component->workers, workers_in_ctx); int i,j; for(i = 0; i < component->nchildren; i++) { struct starpu_sched_component * child = component->children[i]; _starpu_sched_component_update_workers_in_ctx(child, sched_ctx_id); for(j = 0; j < STARPU_NMAX_SCHED_CTXS; j++) if(child->parents[j] == component) { starpu_bitmap_or(component->workers_in_ctx, child->workers_in_ctx); break; } } set_properties(component); component->notify_change_workers(component); } /****************************************************************************** * Scheduling Trees' helper functions * ******************************************************************************/ struct starpu_bitmap * _starpu_get_worker_mask(unsigned sched_ctx_id) { STARPU_ASSERT(sched_ctx_id < STARPU_NMAX_SCHED_CTXS); struct starpu_sched_tree * t = starpu_sched_ctx_get_policy_data(sched_ctx_id); STARPU_ASSERT(t); return t->workers; } void starpu_sched_tree_update_workers_in_ctx(struct starpu_sched_tree * t) { STARPU_ASSERT(t); _starpu_sched_component_update_workers_in_ctx(t->root, t->sched_ctx_id); } void starpu_sched_tree_update_workers(struct starpu_sched_tree * t) { STARPU_ASSERT(t); _starpu_sched_component_update_workers(t->root); } /****************************************************************************** * Scheduling Trees' Functions * * Most of them are used to define the starpu_sched_policy interface * ******************************************************************************/ void starpu_sched_component_connect(struct starpu_sched_component *parent, struct starpu_sched_component *child) { parent->add_child(parent, child); child->add_parent(child, parent); _STARPU_TRACE_SCHED_COMPONENT_CONNECT(parent,child); } int starpu_sched_tree_push_task(struct starpu_task * task) { STARPU_ASSERT(task); unsigned sched_ctx_id = task->sched_ctx; struct starpu_sched_tree *tree = starpu_sched_ctx_get_policy_data(sched_ctx_id); int ret_val = starpu_sched_component_push_task(NULL, tree->root,task); return ret_val; } int starpu_sched_component_push_task(struct starpu_sched_component *from STARPU_ATTRIBUTE_UNUSED, struct starpu_sched_component *to, struct starpu_task *task) { _STARPU_TRACE_SCHED_COMPONENT_PUSH(from, to, task); return to->push_task(to, task); } struct starpu_task * starpu_sched_tree_pop_task(unsigned sched_ctx) { unsigned workerid = starpu_worker_get_id_check(); struct starpu_sched_component * component = starpu_sched_component_worker_get(sched_ctx, workerid); /* _starpu_sched_component_lock_worker(workerid) is called by component->pull_task() */ struct starpu_task * task = starpu_sched_component_pull_task(component,NULL); return task; } struct starpu_task * starpu_sched_component_pull_task(struct starpu_sched_component *from, struct starpu_sched_component *to STARPU_ATTRIBUTE_UNUSED) { struct starpu_task *task = from->pull_task(from); if (task) _STARPU_TRACE_SCHED_COMPONENT_PULL(from, to, task); return task; } void starpu_sched_tree_add_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers) { STARPU_ASSERT(sched_ctx_id < STARPU_NMAX_SCHED_CTXS); STARPU_ASSERT(workerids); struct starpu_sched_tree * t = starpu_sched_ctx_get_policy_data(sched_ctx_id); STARPU_PTHREAD_MUTEX_LOCK(&t->lock); _starpu_sched_component_lock_all_workers(sched_ctx_id); unsigned i; for(i = 0; i < nworkers; i++) starpu_bitmap_set(t->workers, workerids[i]); starpu_sched_tree_update_workers_in_ctx(t); _starpu_sched_component_unlock_all_workers(sched_ctx_id); STARPU_PTHREAD_MUTEX_UNLOCK(&t->lock); } void starpu_sched_tree_remove_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers) { STARPU_ASSERT(sched_ctx_id < STARPU_NMAX_SCHED_CTXS); STARPU_ASSERT(workerids); struct starpu_sched_tree * t = starpu_sched_ctx_get_policy_data(sched_ctx_id); STARPU_PTHREAD_MUTEX_LOCK(&t->lock); _starpu_sched_component_lock_all_workers(sched_ctx_id); unsigned i; for(i = 0; i < nworkers; i++) starpu_bitmap_unset(t->workers, workerids[i]); starpu_sched_tree_update_workers_in_ctx(t); _starpu_sched_component_unlock_all_workers(sched_ctx_id); STARPU_PTHREAD_MUTEX_UNLOCK(&t->lock); } static struct starpu_sched_tree *trees[STARPU_NMAX_SCHED_CTXS]; struct starpu_sched_tree * starpu_sched_tree_create(unsigned sched_ctx_id) { STARPU_ASSERT(sched_ctx_id < STARPU_NMAX_SCHED_CTXS); STARPU_ASSERT(!trees[sched_ctx_id]); struct starpu_sched_tree *t; _STARPU_MALLOC(t, sizeof(*t)); memset(t, 0, sizeof(*t)); t->sched_ctx_id = sched_ctx_id; t->workers = starpu_bitmap_create(); STARPU_PTHREAD_MUTEX_INIT(&t->lock,NULL); trees[sched_ctx_id] = t; return t; } void starpu_sched_tree_destroy(struct starpu_sched_tree * tree) { STARPU_ASSERT(tree); STARPU_ASSERT(trees[tree->sched_ctx_id] == tree); trees[tree->sched_ctx_id] = NULL; if(tree->root) starpu_sched_component_destroy_rec(tree->root); starpu_bitmap_destroy(tree->workers); STARPU_PTHREAD_MUTEX_DESTROY(&tree->lock); free(tree); } struct starpu_sched_tree * starpu_sched_tree_get(unsigned sched_ctx_id) { return trees[sched_ctx_id]; } /****************************************************************************** * Interface Functions for Generic Scheduling Components * ******************************************************************************/ void starpu_sched_component_add_child(struct starpu_sched_component* component, struct starpu_sched_component * child) { STARPU_ASSERT(component && child); STARPU_ASSERT(!starpu_sched_component_is_worker(component)); int i; for(i = 0; i < component->nchildren; i++) { STARPU_ASSERT(component->children[i] != component); STARPU_ASSERT(component->children[i] != NULL); } _STARPU_REALLOC(component->children, sizeof(struct starpu_sched_component *) * (component->nchildren + 1)); component->children[component->nchildren] = child; component->nchildren++; } static void starpu_sched_component_remove_child(struct starpu_sched_component * component, struct starpu_sched_component * child) { STARPU_ASSERT(component && child); STARPU_ASSERT(!starpu_sched_component_is_worker(component)); int pos; for(pos = 0; pos < component->nchildren; pos++) if(component->children[pos] == child) break; STARPU_ASSERT(pos != component->nchildren); component->children[pos] = component->children[--component->nchildren]; } static void starpu_sched_component_add_parent(struct starpu_sched_component* component, struct starpu_sched_component * parent) { STARPU_ASSERT(component && parent); int i; for(i = 0; i < component->nparents; i++) { STARPU_ASSERT(component->parents[i] != component); STARPU_ASSERT(component->parents[i] != NULL); } _STARPU_REALLOC(component->parents, sizeof(struct starpu_sched_component *) * (component->nparents + 1)); component->parents[component->nparents] = parent; component->nparents++; } static void starpu_sched_component_remove_parent(struct starpu_sched_component * component, struct starpu_sched_component * parent) { STARPU_ASSERT(component && parent); int pos; for(pos = 0; pos < component->nparents; pos++) if(component->parents[pos] == parent) break; STARPU_ASSERT(pos != component->nparents); component->parents[pos] = component->parents[--component->nparents]; } /* default implementation for component->pull_task() * just perform a recursive call on parent */ static struct starpu_task * starpu_sched_component_parents_pull_task(struct starpu_sched_component * component) { STARPU_ASSERT(component); struct starpu_task * task = NULL; int i; for(i=0; i < component->nparents; i++) { if(component->parents[i] == NULL) continue; else { task = starpu_sched_component_pull_task(component->parents[i], component); if(task) break; } } return task; } /* The default implementation of the can_push function is a recursive call to its parents. * A personally-made can_push in a component (like in prio components) is necessary to catch * this recursive call somewhere, if the user wants to exploit it. */ static int starpu_sched_component_can_push(struct starpu_sched_component * component) { STARPU_ASSERT(component); int ret = 0; if(component->nparents > 0) { int i; for(i=0; i < component->nparents; i++) { struct starpu_sched_component * parent = component->parents[i]; if(parent != NULL) ret = parent->can_push(parent); if(ret) break; } } return ret; } /* A can_pull call will try to wake up one worker associated to the childs of the * component. It is currenly called by components which holds a queue (like fifo and prio * components) to signify its childs that a task has been pushed on its local queue. */ static void starpu_sched_component_can_pull(struct starpu_sched_component * component) { STARPU_ASSERT(component); STARPU_ASSERT(!starpu_sched_component_is_worker(component)); int i; for(i = 0; i < component->nchildren; i++) component->children[i]->can_pull(component->children[i]); } double starpu_sched_component_estimated_load(struct starpu_sched_component * component) { double sum = 0.0; int i; for( i = 0; i < component->nchildren; i++) { struct starpu_sched_component * c = component->children[i]; sum += c->estimated_load(c); } return sum; } double starpu_sched_component_estimated_end_min(struct starpu_sched_component * component) { STARPU_ASSERT(component); double min = DBL_MAX; int i; for(i = 0; i < component->nchildren; i++) { double tmp = component->children[i]->estimated_end(component->children[i]); if(tmp < min) min = tmp; } return min; } double starpu_sched_component_estimated_end_average(struct starpu_sched_component * component) { STARPU_ASSERT(component); double sum = 0.0; int i; for(i = 0; i < component->nchildren; i++) sum += component->children[i]->estimated_end(component->children[i]); return sum / component->nchildren; } static void take_component_and_does_nothing(struct starpu_sched_component * component STARPU_ATTRIBUTE_UNUSED) { } struct starpu_sched_component * starpu_sched_component_create(struct starpu_sched_tree *tree, const char *name) { struct starpu_sched_component *component; _STARPU_MALLOC(component, sizeof(*component)); memset(component,0,sizeof(*component)); component->tree = tree; component->workers = starpu_bitmap_create(); component->workers_in_ctx = starpu_bitmap_create(); component->add_child = starpu_sched_component_add_child; component->remove_child = starpu_sched_component_remove_child; component->add_parent = starpu_sched_component_add_parent; component->remove_parent = starpu_sched_component_remove_parent; component->pull_task = starpu_sched_component_parents_pull_task; component->can_push = starpu_sched_component_can_push; component->can_pull = starpu_sched_component_can_pull; component->estimated_load = starpu_sched_component_estimated_load; component->estimated_end = starpu_sched_component_estimated_end_average; component->deinit_data = take_component_and_does_nothing; component->notify_change_workers = take_component_and_does_nothing; component->name = strdup(name); _STARPU_TRACE_SCHED_COMPONENT_NEW(component); return component; } starpu-1.2.3+dfsg/src/sched_policies/component_worker.c000066400000000000000000000742721320135501600232650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2014, 2015, 2016, 2017 CNRS * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2011-2013 INRIA * Copyright (C) 2013 Simon Archipoff * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include /* data structure for worker's queue look like this : * W = worker * T = simple task * P = parallel task * * * P--P T * | | \| * P--P T T P T * | | | | | | * T T P--P--P T * | | | | | | * W W W W W W * * * * its possible that a _starpu_task_grid wont have task, because it have been * poped by a worker. * * N = no task * * T T T * | | | * P--N--N * | | | * W W W * * * this API is a little asymmetric : struct _starpu_task_grid are allocated by the caller and freed by the data structure * */ /****************************************************************************** * Worker Components' Data Structures * *****************************************************************************/ struct _starpu_task_grid { /* this member may be NULL if a worker have poped it but its a * parallel task and we dont want mad pointers */ struct starpu_task * task; struct _starpu_task_grid *up, *down, *left, *right; /* this is used to count the number of task to be poped by a worker * the leftist _starpu_task_grid maintain the ntasks counter (ie .left == NULL), * all the others use the pntasks that point to it * * when the counter reach 0, all the left and right member are set to NULL, * that mean that we will free that components. */ union { int ntasks; int * pntasks; }; }; /* list->exp_start, list->exp_len, list-exp_end and list->ntasks * are updated by starpu_sched_component_worker_push_task(component, task) and pre_exec_hook */ struct _starpu_worker_task_list { double exp_start, exp_len, exp_end, pipeline_len; struct _starpu_task_grid *first, *last; unsigned ntasks; starpu_pthread_mutex_t mutex; }; enum _starpu_worker_component_status { COMPONENT_STATUS_SLEEPING, COMPONENT_STATUS_RESET, COMPONENT_STATUS_CHANGED }; struct _starpu_worker_component_data { union { struct { struct _starpu_worker * worker; starpu_pthread_mutex_t lock; }; struct _starpu_combined_worker * combined_worker; }; struct _starpu_worker_task_list * list; enum _starpu_worker_component_status status; }; /* this array store worker components */ static struct starpu_sched_component * _worker_components[STARPU_NMAX_SCHED_CTXS][STARPU_NMAXWORKERS]; /****************************************************************************** * Worker Components' Task List and Grid Functions * *****************************************************************************/ static struct _starpu_worker_task_list * _starpu_worker_task_list_create(void) { struct _starpu_worker_task_list *l; _STARPU_MALLOC(l, sizeof(*l)); memset(l, 0, sizeof(*l)); l->exp_len = l->pipeline_len = 0.0; l->exp_start = l->exp_end = starpu_timing_now(); STARPU_PTHREAD_MUTEX_INIT(&l->mutex,NULL); return l; } static struct _starpu_task_grid * _starpu_task_grid_create(void) { struct _starpu_task_grid *t; _STARPU_MALLOC(t, sizeof(*t)); memset(t, 0, sizeof(*t)); return t; } static struct _starpu_worker_task_list * _worker_get_list(unsigned sched_ctx_id) { unsigned workerid = starpu_worker_get_id_check(); STARPU_ASSERT(workerid < starpu_worker_get_count()); struct _starpu_worker_component_data * d = starpu_sched_component_worker_get(sched_ctx_id, workerid)->data; return d->list; } static void _starpu_task_grid_destroy(struct _starpu_task_grid * t) { free(t); } static void _starpu_worker_task_list_destroy(struct _starpu_worker_task_list * l) { if(l) { /* There can be empty task grids, when we picked the last task after the front task grid */ struct _starpu_task_grid *t = l->first, *nextt; while(t) { STARPU_ASSERT(!t->task); nextt = t->up; _starpu_task_grid_destroy(t); t = nextt; } STARPU_PTHREAD_MUTEX_DESTROY(&l->mutex); free(l); } } static inline void _starpu_worker_task_list_push(struct _starpu_worker_task_list * l, struct _starpu_task_grid * t) { /* the task, ntasks, pntasks, left and right members of t are set by the caller */ STARPU_ASSERT(t->task); if(l->first == NULL) l->first = l->last = t; t->down = l->last; l->last->up = t; t->up = NULL; l->last = t; l->ntasks++; double predicted = t->task->predicted; double predicted_transfer = t->task->predicted_transfer; /* Sometimes workers didn't take the tasks as early as we expected */ l->exp_start = STARPU_MAX(l->exp_start, starpu_timing_now()); l->exp_end = l->exp_start + l->exp_len; if (starpu_timing_now() + predicted_transfer < l->exp_end) { /* We may hope that the transfer will be finished by * the start of the task. */ predicted_transfer = 0.0; } else { /* The transfer will not be finished by then, take the * remainder into account */ predicted_transfer = (starpu_timing_now() + predicted_transfer) - l->exp_end; } if(!isnan(predicted_transfer)) { l->exp_end += predicted_transfer; l->exp_len += predicted_transfer; } if(!isnan(predicted)) { l->exp_end += predicted; l->exp_len += predicted; } t->task->predicted = predicted; t->task->predicted_transfer = predicted_transfer; } /* recursively set left and right pointers to NULL */ static inline void _starpu_task_grid_unset_left_right_member(struct _starpu_task_grid * t) { STARPU_ASSERT(t->task == NULL); struct _starpu_task_grid * t_left = t->left; struct _starpu_task_grid * t_right = t->right; t->left = t->right = NULL; while(t_left) { STARPU_ASSERT(t_left->task == NULL); t = t_left; t_left = t_left->left; t->left = NULL; t->right = NULL; } while(t_right) { STARPU_ASSERT(t_right->task == NULL); t = t_right; t_right = t_right->right; t->left = NULL; t->right = NULL; } } static inline struct starpu_task * _starpu_worker_task_list_pop(struct _starpu_worker_task_list * l) { if(!l->first) { l->exp_start = l->exp_end = starpu_timing_now(); l->exp_len = 0; return NULL; } struct _starpu_task_grid * t = l->first; /* if there is no task there is no tasks linked to this, then we can free it */ if(t->task == NULL && t->right == NULL && t->left == NULL) { l->first = t->up; if(l->first) l->first->down = NULL; if(l->last == t) l->last = NULL; _starpu_task_grid_destroy(t); return _starpu_worker_task_list_pop(l); } while(t) { if(t->task) { struct starpu_task * task = t->task; t->task = NULL; /* the leftist thing hold the number of tasks, other have a pointer to it */ int * p = t->left ? t->pntasks : &t->ntasks; /* the worker who pop the last task allow the rope to be freed */ if(STARPU_ATOMIC_ADD(p, -1) == 0) _starpu_task_grid_unset_left_right_member(t); l->ntasks--; return task; } t = t->up; } return NULL; } /****************************************************************************** * Worker Components' Public Helper Functions (Part 1) * *****************************************************************************/ struct _starpu_worker * _starpu_sched_component_worker_get_worker(struct starpu_sched_component * worker_component) { STARPU_ASSERT(starpu_sched_component_is_simple_worker(worker_component)); struct _starpu_worker_component_data * data = worker_component->data; return data->worker; } struct _starpu_combined_worker * _starpu_sched_component_combined_worker_get_combined_worker(struct starpu_sched_component * worker_component) { STARPU_ASSERT(starpu_sched_component_is_combined_worker(worker_component)); struct _starpu_worker_component_data * data = worker_component->data; return data->combined_worker; } void _starpu_sched_component_lock_worker(unsigned sched_ctx_id, int workerid) { STARPU_ASSERT(workerid >= 0 && workerid < (int) starpu_worker_get_count()); struct _starpu_worker_component_data * data = starpu_sched_component_worker_get(sched_ctx_id, workerid)->data; STARPU_PTHREAD_MUTEX_LOCK(&data->lock); } void _starpu_sched_component_unlock_worker(unsigned sched_ctx_id, int workerid) { STARPU_ASSERT(workerid >= 0 && workerid < (int)starpu_worker_get_count()); struct _starpu_worker_component_data * data = starpu_sched_component_worker_get(sched_ctx_id, workerid)->data; STARPU_PTHREAD_MUTEX_UNLOCK(&data->lock); } /****************************************************************************** * Worker Components' Private Helper Functions * *****************************************************************************/ /* Allows a worker to lock/unlock scheduling mutexes. Currently used in * self-defined can_push calls to allow can_pull calls to take those mutexes while the * current worker is pushing tasks on other workers (or itself). */ static void _starpu_sched_component_worker_lock_scheduling(unsigned sched_ctx_id) { unsigned workerid = starpu_worker_get_id_check(); starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond); _starpu_sched_component_lock_worker(sched_ctx_id, workerid); STARPU_PTHREAD_MUTEX_LOCK_SCHED(sched_mutex); } static void _starpu_sched_component_worker_unlock_scheduling(unsigned sched_ctx_id) { unsigned workerid = starpu_worker_get_id_check(); starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(sched_mutex); _starpu_sched_component_unlock_worker(sched_ctx_id, workerid); } static void _starpu_sched_component_worker_set_sleep_status(struct starpu_sched_component * worker_component) { STARPU_ASSERT(starpu_sched_component_is_worker(worker_component)); struct _starpu_worker_component_data * data = worker_component->data; data->status = COMPONENT_STATUS_SLEEPING; } static void _starpu_sched_component_worker_set_changed_status(struct starpu_sched_component * worker_component) { STARPU_ASSERT(starpu_sched_component_is_worker(worker_component)); struct _starpu_worker_component_data * data = worker_component->data; data->status = COMPONENT_STATUS_CHANGED; } static void _starpu_sched_component_worker_reset_status(struct starpu_sched_component * worker_component) { STARPU_ASSERT(starpu_sched_component_is_worker(worker_component)); struct _starpu_worker_component_data * data = worker_component->data; data->status = COMPONENT_STATUS_RESET; } static int _starpu_sched_component_worker_is_reset_status(struct starpu_sched_component * worker_component) { STARPU_ASSERT(starpu_sched_component_is_worker(worker_component)); struct _starpu_worker_component_data * data = worker_component->data; return (data->status == COMPONENT_STATUS_RESET); } static int _starpu_sched_component_worker_is_changed_status(struct starpu_sched_component * worker_component) { STARPU_ASSERT(starpu_sched_component_is_worker(worker_component)); struct _starpu_worker_component_data * data = worker_component->data; return (data->status == COMPONENT_STATUS_CHANGED); } static int _starpu_sched_component_worker_is_sleeping_status(struct starpu_sched_component * worker_component) { STARPU_ASSERT(starpu_sched_component_is_worker(worker_component)); struct _starpu_worker_component_data * data = worker_component->data; return (data->status == COMPONENT_STATUS_SLEEPING); } #ifndef STARPU_NO_ASSERT static int _worker_consistant(struct starpu_sched_component * component) { int is_a_worker = 0; int i; for(i = 0; itree->sched_ctx_id][i] == component) is_a_worker = 1; if(!is_a_worker) return 0; struct _starpu_worker_component_data * data = component->data; if(data->worker) { int id = data->worker->workerid; return (_worker_components[component->tree->sched_ctx_id][id] == component) && component->nchildren == 0; } return 1; } #endif /****************************************************************************** * Simple Worker Components' Interface Functions * *****************************************************************************/ static void simple_worker_can_pull(struct starpu_sched_component * worker_component) { (void) worker_component; struct _starpu_worker * w = _starpu_sched_component_worker_get_worker(worker_component); _starpu_sched_component_lock_worker(worker_component->tree->sched_ctx_id, w->workerid); if(_starpu_sched_component_worker_is_reset_status(worker_component)) _starpu_sched_component_worker_set_changed_status(worker_component); if(w->workerid == starpu_worker_get_id()) { _starpu_sched_component_unlock_worker(worker_component->tree->sched_ctx_id, w->workerid); return; } if(_starpu_sched_component_worker_is_sleeping_status(worker_component)) { /* FIXME Ça n'a pas l'air de fonctionner */ starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(w->workerid, &sched_mutex, &sched_cond); _starpu_sched_component_unlock_worker(worker_component->tree->sched_ctx_id, w->workerid); starpu_wakeup_worker(w->workerid, sched_cond, sched_mutex); } else _starpu_sched_component_unlock_worker(worker_component->tree->sched_ctx_id, w->workerid); } static int simple_worker_push_task(struct starpu_sched_component * component, struct starpu_task *task) { STARPU_ASSERT(starpu_sched_component_is_worker(component)); /*this function take the worker's mutex */ struct _starpu_worker_component_data * data = component->data; struct _starpu_task_grid * t = _starpu_task_grid_create(); t->task = task; t->ntasks = 1; task->workerid = starpu_bitmap_first(component->workers); #if 1 /* dead lock problem? */ if (starpu_get_prefetch_flag() && !task->prefetched) { unsigned memory_node = starpu_worker_get_memory_node(task->workerid); starpu_prefetch_task_input_on_node(task, memory_node); } #endif STARPU_PTHREAD_MUTEX_LOCK(&data->list->mutex); _starpu_worker_task_list_push(data->list, t); STARPU_PTHREAD_MUTEX_UNLOCK(&data->list->mutex); simple_worker_can_pull(component); return 0; } static struct starpu_task * simple_worker_pull_task(struct starpu_sched_component *component) { unsigned workerid = starpu_worker_get_id_check(); struct _starpu_worker_component_data * data = component->data; struct _starpu_worker_task_list * list = data->list; STARPU_PTHREAD_MUTEX_LOCK(&list->mutex); struct starpu_task * task = _starpu_worker_task_list_pop(list); STARPU_PTHREAD_MUTEX_UNLOCK(&list->mutex); if(task) { starpu_push_task_end(task); return task; } _starpu_sched_component_lock_worker(component->tree->sched_ctx_id, workerid); int i; do { _starpu_sched_component_worker_reset_status(component); for(i=0; i < component->nparents; i++) { if(component->parents[i] == NULL) continue; else { _starpu_sched_component_worker_unlock_scheduling(component->tree->sched_ctx_id); task = starpu_sched_component_pull_task(component->parents[i],component); _starpu_sched_component_worker_lock_scheduling(component->tree->sched_ctx_id); if(task) break; } } } while((!task) && _starpu_sched_component_worker_is_changed_status(component)); _starpu_sched_component_worker_set_sleep_status(component); /* Remplacer par le sched condition */ _starpu_sched_component_unlock_worker(component->tree->sched_ctx_id, workerid); if(!task) return NULL; if(task->cl->type == STARPU_SPMD) { if(!starpu_worker_is_combined_worker(workerid)) { starpu_push_task_end(task); return task; } struct starpu_sched_component * combined_worker_component = starpu_sched_component_worker_get(component->tree->sched_ctx_id, workerid); starpu_sched_component_push_task(component, combined_worker_component, task); /* we have pushed a task in queue, so can make a recursive call */ return simple_worker_pull_task(component); } if(task) starpu_push_task_end(task); return task; } static double simple_worker_estimated_end(struct starpu_sched_component * component) { struct _starpu_worker_component_data * data = component->data; STARPU_PTHREAD_MUTEX_LOCK(&data->list->mutex); data->list->exp_start = STARPU_MAX(starpu_timing_now(), data->list->exp_start); double tmp = data->list->exp_end = data->list->exp_start + data->list->exp_len; STARPU_PTHREAD_MUTEX_UNLOCK(&data->list->mutex); return tmp; } static double simple_worker_estimated_load(struct starpu_sched_component * component) { struct _starpu_worker * worker = _starpu_sched_component_worker_get_worker(component); int nb_task = 0; STARPU_PTHREAD_MUTEX_LOCK(&worker->mutex); struct starpu_task_list list = worker->local_tasks; struct starpu_task * task; for(task = starpu_task_list_front(&list); task != starpu_task_list_end(&list); task = starpu_task_list_next(task)) nb_task++; STARPU_PTHREAD_MUTEX_UNLOCK(&worker->mutex); struct _starpu_worker_component_data * d = component->data; struct _starpu_worker_task_list * l = d->list; int ntasks_in_fifo = l ? l->ntasks : 0; return (double) (nb_task + ntasks_in_fifo) / starpu_worker_get_relative_speedup( starpu_worker_get_perf_archtype(starpu_bitmap_first(component->workers), component->tree->sched_ctx_id)); } static void _worker_component_deinit_data(struct starpu_sched_component * component) { struct _starpu_worker_component_data * d = component->data; _starpu_worker_task_list_destroy(d->list); if(starpu_sched_component_is_simple_worker(component)) STARPU_PTHREAD_MUTEX_DESTROY(&d->lock); int i, j; for(j = 0; j < STARPU_NMAX_SCHED_CTXS; j++) for(i = 0; i < STARPU_NMAXWORKERS; i++) if(_worker_components[j][i] == component) { _worker_components[j][i] = NULL; break; } free(d); } static struct starpu_sched_component * starpu_sched_component_worker_create(struct starpu_sched_tree *tree, int workerid) { STARPU_ASSERT(workerid >= 0 && workerid < (int) starpu_worker_get_count()); if(_worker_components[tree->sched_ctx_id][workerid]) return _worker_components[tree->sched_ctx_id][workerid]; struct _starpu_worker * worker = _starpu_get_worker_struct(workerid); if(worker == NULL) return NULL; char name[32]; snprintf(name, sizeof(name), "worker %d", workerid); struct starpu_sched_component * component = starpu_sched_component_create(tree, name); struct _starpu_worker_component_data *data; _STARPU_MALLOC(data, sizeof(*data)); memset(data, 0, sizeof(*data)); data->worker = worker; STARPU_PTHREAD_MUTEX_INIT(&data->lock,NULL); data->status = COMPONENT_STATUS_SLEEPING; data->list = _starpu_worker_task_list_create(); component->data = data; component->push_task = simple_worker_push_task; component->pull_task = simple_worker_pull_task; component->can_pull = simple_worker_can_pull; component->estimated_end = simple_worker_estimated_end; component->estimated_load = simple_worker_estimated_load; component->deinit_data = _worker_component_deinit_data; starpu_bitmap_set(component->workers, workerid); starpu_bitmap_or(component->workers_in_ctx, component->workers); _worker_components[tree->sched_ctx_id][workerid] = component; /* #ifdef STARPU_HAVE_HWLOC struct _starpu_machine_config *config = _starpu_get_machine_config(); struct _starpu_machine_topology *topology = &config->topology; hwloc_obj_t obj = hwloc_get_obj_by_depth(topology->hwtopology, config->cpu_depth, worker->bindid); STARPU_ASSERT(obj); component->obj = obj; #endif */ return component; } /****************************************************************************** * Combined Worker Components' Interface Functions * *****************************************************************************/ static void combined_worker_can_pull(struct starpu_sched_component * component) { (void) component; STARPU_ASSERT(starpu_sched_component_is_combined_worker(component)); struct _starpu_worker_component_data * data = component->data; unsigned workerid = starpu_worker_get_id_check(); int i; for(i = 0; i < data->combined_worker->worker_size; i++) { if((unsigned) i == workerid) continue; int worker = data->combined_worker->combined_workerid[i]; _starpu_sched_component_lock_worker(component->tree->sched_ctx_id, worker); if(_starpu_sched_component_worker_is_sleeping_status(component)) { starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(worker, &sched_mutex, &sched_cond); starpu_wakeup_worker(worker, sched_cond, sched_mutex); } if(_starpu_sched_component_worker_is_reset_status(component)) _starpu_sched_component_worker_set_changed_status(component); _starpu_sched_component_unlock_worker(component->tree->sched_ctx_id, worker); } } static int combined_worker_push_task(struct starpu_sched_component * component, struct starpu_task *task) { STARPU_ASSERT(starpu_sched_component_is_combined_worker(component)); struct _starpu_worker_component_data * data = component->data; STARPU_ASSERT(data->combined_worker && !data->worker); struct _starpu_combined_worker * combined_worker = data->combined_worker; STARPU_ASSERT(combined_worker->worker_size >= 1); struct _starpu_task_grid * task_alias[combined_worker->worker_size]; starpu_parallel_task_barrier_init(task, starpu_bitmap_first(component->workers)); task_alias[0] = _starpu_task_grid_create(); task_alias[0]->task = starpu_task_dup(task); task_alias[0]->task->workerid = combined_worker->combined_workerid[0]; task_alias[0]->task->destroy = 1; task_alias[0]->left = NULL; task_alias[0]->ntasks = combined_worker->worker_size; int i; for(i = 1; i < combined_worker->worker_size; i++) { task_alias[i] = _starpu_task_grid_create(); task_alias[i]->task = starpu_task_dup(task); task_alias[i]->task->destroy = 1; task_alias[i]->task->workerid = combined_worker->combined_workerid[i]; task_alias[i]->left = task_alias[i-1]; task_alias[i - 1]->right = task_alias[i]; task_alias[i]->pntasks = &(task_alias[0]->ntasks); } starpu_pthread_mutex_t * mutex_to_unlock = NULL; i = 0; do { struct starpu_sched_component * worker_component = starpu_sched_component_worker_get(component->tree->sched_ctx_id, combined_worker->combined_workerid[i]); struct _starpu_worker_component_data * worker_data = worker_component->data; struct _starpu_worker_task_list * list = worker_data->list; STARPU_PTHREAD_MUTEX_LOCK(&list->mutex); if(mutex_to_unlock) STARPU_PTHREAD_MUTEX_UNLOCK(mutex_to_unlock); mutex_to_unlock = &list->mutex; _starpu_worker_task_list_push(list, task_alias[i]); i++; } while(i < combined_worker->worker_size); STARPU_PTHREAD_MUTEX_UNLOCK(mutex_to_unlock); int workerid = starpu_worker_get_id(); if(-1 == workerid) { combined_worker_can_pull(component); } else { starpu_pthread_mutex_t *worker_sched_mutex; starpu_pthread_cond_t *worker_sched_cond; starpu_worker_get_sched_condition(workerid, &worker_sched_mutex, &worker_sched_cond); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(worker_sched_mutex); /* wake up all other workers of combined worker */ for(i = 0; i < combined_worker->worker_size; i++) { struct starpu_sched_component * worker_component = starpu_sched_component_worker_get(component->tree->sched_ctx_id, combined_worker->combined_workerid[i]); simple_worker_can_pull(worker_component); } combined_worker_can_pull(component); STARPU_PTHREAD_MUTEX_LOCK_SCHED(worker_sched_mutex); } return 0; } static double combined_worker_estimated_end(struct starpu_sched_component * component) { STARPU_ASSERT(starpu_sched_component_is_combined_worker(component)); struct _starpu_worker_component_data * data = component->data; struct _starpu_combined_worker * combined_worker = data->combined_worker; double max = 0.0; int i; for(i = 0; i < combined_worker->worker_size; i++) { data = _worker_components[component->tree->sched_ctx_id][combined_worker->combined_workerid[i]]->data; STARPU_PTHREAD_MUTEX_LOCK(&data->list->mutex); double tmp = data->list->exp_end; STARPU_PTHREAD_MUTEX_UNLOCK(&data->list->mutex); max = tmp > max ? tmp : max; } return max; } static double combined_worker_estimated_load(struct starpu_sched_component * component) { struct _starpu_worker_component_data * d = component->data; struct _starpu_combined_worker * c = d->combined_worker; double load = 0; int i; for(i = 0; i < c->worker_size; i++) { struct starpu_sched_component * n = starpu_sched_component_worker_get(component->tree->sched_ctx_id, c->combined_workerid[i]); load += n->estimated_load(n); } return load; } static struct starpu_sched_component * starpu_sched_component_combined_worker_create(struct starpu_sched_tree *tree, int workerid) { STARPU_ASSERT(workerid >= 0 && workerid < STARPU_NMAXWORKERS); if(_worker_components[tree->sched_ctx_id][workerid]) return _worker_components[tree->sched_ctx_id][workerid]; struct _starpu_combined_worker * combined_worker = _starpu_get_combined_worker_struct(workerid); if(combined_worker == NULL) return NULL; struct starpu_sched_component * component = starpu_sched_component_create(tree, "combined_worker"); struct _starpu_worker_component_data *data; _STARPU_MALLOC(data, sizeof(*data)); memset(data, 0, sizeof(*data)); data->combined_worker = combined_worker; data->status = COMPONENT_STATUS_SLEEPING; component->data = data; component->push_task = combined_worker_push_task; component->pull_task = NULL; component->estimated_end = combined_worker_estimated_end; component->estimated_load = combined_worker_estimated_load; component->can_pull = combined_worker_can_pull; component->deinit_data = _worker_component_deinit_data; starpu_bitmap_set(component->workers, workerid); starpu_bitmap_or(component->workers_in_ctx, component->workers); _worker_components[tree->sched_ctx_id][workerid] = component; #ifdef STARPU_HAVE_HWLOC struct _starpu_machine_config *config = _starpu_get_machine_config(); struct _starpu_machine_topology *topology = &config->topology; hwloc_obj_t obj = hwloc_get_obj_by_depth(topology->hwtopology, config->cpu_depth, combined_worker->combined_workerid[0]); STARPU_ASSERT(obj); component->obj = obj; #endif return component; } /****************************************************************************** * Worker Components' Public Helper Functions (Part 2) * *****************************************************************************/ void _starpu_sched_component_lock_all_workers(unsigned sched_ctx_id) { unsigned i; for(i = 0; i < starpu_worker_get_count(); i++) _starpu_sched_component_lock_worker(sched_ctx_id, i); } void _starpu_sched_component_unlock_all_workers(unsigned sched_ctx_id) { unsigned i; for(i = 0; i < starpu_worker_get_count(); i++) _starpu_sched_component_unlock_worker(sched_ctx_id, i); } void _starpu_sched_component_workers_destroy(void) { int i, j; for(j = 0; j < STARPU_NMAX_SCHED_CTXS; j++) for(i = 0; i < STARPU_NMAXWORKERS; i++) if (_worker_components[j][i]) starpu_sched_component_destroy(_worker_components[j][i]); } int starpu_sched_component_worker_get_workerid(struct starpu_sched_component * worker_component) { #ifndef STARPU_NO_ASSERT STARPU_ASSERT(_worker_consistant(worker_component)); #endif STARPU_ASSERT(1 == starpu_bitmap_cardinal(worker_component->workers)); return starpu_bitmap_first(worker_component->workers); } void starpu_sched_component_worker_pre_exec_hook(struct starpu_task * task) { double model = task->predicted; double transfer_model = task->predicted_transfer; if(!isnan(task->predicted) || !isnan(task->predicted_transfer)) { unsigned sched_ctx_id = task->sched_ctx; struct _starpu_worker_task_list * list = _worker_get_list(sched_ctx_id); STARPU_PTHREAD_MUTEX_LOCK(&list->mutex); list->exp_start = STARPU_MAX(starpu_timing_now(), list->exp_start); /* The transfer is over, get rid of it in the completion * prediction */ if (!isnan(transfer_model)) list->exp_len -= transfer_model; if (!isnan(model)) { /* We now start the computation, get rid of it in the * completion prediction */ list->exp_len -= model; list->exp_start += model; } if(list->ntasks == 0) list->exp_len = 0.0; list->exp_end = list->exp_start + list->exp_len; STARPU_PTHREAD_MUTEX_UNLOCK(&list->mutex); } } void starpu_sched_component_worker_post_exec_hook(struct starpu_task * task) { if(task->execute_on_a_specific_worker) return; unsigned sched_ctx_id = task->sched_ctx; struct _starpu_worker_task_list * list = _worker_get_list(sched_ctx_id); STARPU_PTHREAD_MUTEX_LOCK(&list->mutex); list->exp_start = starpu_timing_now(); list->exp_end = list->exp_start + list->exp_len; STARPU_PTHREAD_MUTEX_UNLOCK(&list->mutex); } int starpu_sched_component_is_simple_worker(struct starpu_sched_component * component) { return component->push_task == simple_worker_push_task; } int starpu_sched_component_is_combined_worker(struct starpu_sched_component * component) { return component->push_task == combined_worker_push_task; } int starpu_sched_component_is_worker(struct starpu_sched_component * component) { return starpu_sched_component_is_simple_worker(component) || starpu_sched_component_is_combined_worker(component); } /* As Worker Components' creating functions are protected, this function allows * the user to get a Worker Component from a worker id */ struct starpu_sched_component * starpu_sched_component_worker_get(unsigned sched_ctx, int workerid) { STARPU_ASSERT(workerid >= 0 && workerid < STARPU_NMAXWORKERS); /* we may need to take a mutex here */ if(_worker_components[sched_ctx][workerid]) return _worker_components[sched_ctx][workerid]; else { struct starpu_sched_component * component; if(workerid < (int) starpu_worker_get_count()) component = starpu_sched_component_worker_create(starpu_sched_tree_get(sched_ctx), workerid); else component = starpu_sched_component_combined_worker_create(starpu_sched_tree_get(sched_ctx), workerid); _worker_components[sched_ctx][workerid] = component; return component; } } starpu-1.2.3+dfsg/src/sched_policies/deque_modeling_policy_data_aware.c000066400000000000000000001202601320135501600263670ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015, 2016, 2017 CNRS * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2011-2012, 2016 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Distributed queues using performance modeling to assign tasks */ #include #include #include #include #include #include #include #include #ifndef DBL_MIN #define DBL_MIN __DBL_MIN__ #endif #ifndef DBL_MAX #define DBL_MAX __DBL_MAX__ #endif struct _starpu_dmda_data { double alpha; double beta; double _gamma; double idle_power; struct _starpu_fifo_taskq **queue_array; long int total_task_cnt; long int ready_task_cnt; long int eager_task_cnt; /* number of tasks scheduled without model */ int num_priorities; }; /* The dmda scheduling policy uses * * alpha * T_computation + beta * T_communication + gamma * Consumption * * Here are the default values of alpha, beta, gamma */ #define _STARPU_SCHED_ALPHA_DEFAULT 1.0 #define _STARPU_SCHED_BETA_DEFAULT 1.0 #define _STARPU_SCHED_GAMMA_DEFAULT 1000.0 #ifdef STARPU_USE_TOP static double alpha = _STARPU_SCHED_ALPHA_DEFAULT; static double beta = _STARPU_SCHED_BETA_DEFAULT; static double _gamma = _STARPU_SCHED_GAMMA_DEFAULT; static double idle_power = 0.0; static const float alpha_minimum=0; static const float alpha_maximum=10.0; static const float beta_minimum=0; static const float beta_maximum=10.0; static const float gamma_minimum=0; static const float gamma_maximum=10000.0; static const float idle_power_minimum=0; static const float idle_power_maximum=10000.0; #endif /* !STARPU_USE_TOP */ static int count_non_ready_buffers(struct starpu_task *task, unsigned node) { int cnt = 0; unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); unsigned index; for (index = 0; index < nbuffers; index++) { starpu_data_handle_t handle; handle = STARPU_TASK_GET_HANDLE(task, index); int is_valid; starpu_data_query_status(handle, node, NULL, &is_valid, NULL); if (!is_valid) cnt++; } return cnt; } #ifdef STARPU_USE_TOP static void param_modified(struct starpu_top_param* d) { #ifdef STARPU_DEVEL #warning FIXME: get sched ctx to get alpha/beta/gamma/idle values #endif /* Just to show parameter modification. */ _STARPU_MSG("%s has been modified : " "alpha=%f|beta=%f|gamma=%f|idle_power=%f !\n", d->name, alpha,beta,_gamma, idle_power); } #endif /* !STARPU_USE_TOP */ static int _normalize_prio(int priority, int num_priorities, unsigned sched_ctx_id) { int min = starpu_sched_ctx_get_min_priority(sched_ctx_id); int max = starpu_sched_ctx_get_max_priority(sched_ctx_id); return ((num_priorities-1)/(max-min)) * (priority - min); } static struct starpu_task *_starpu_fifo_pop_first_ready_task(struct _starpu_fifo_taskq *fifo_queue, unsigned node, int num_priorities) { struct starpu_task *task = NULL, *current; if (fifo_queue->ntasks == 0) return NULL; if (fifo_queue->ntasks > 0) { fifo_queue->ntasks--; task = starpu_task_list_front(&fifo_queue->taskq); if (STARPU_UNLIKELY(!task)) return NULL; int first_task_priority = task->priority; current = task; int non_ready_best = INT_MAX; while (current) { int priority = current->priority; if (priority >= first_task_priority) { int non_ready = count_non_ready_buffers(current, node); if (non_ready < non_ready_best) { non_ready_best = non_ready; task = current; if (non_ready == 0) break; } } current = current->next; } if(num_priorities != -1) { int i; int task_prio = _normalize_prio(task->priority, num_priorities, task->sched_ctx); for(i = 0; i <= task_prio; i++) fifo_queue->ntasks_per_priority[i]--; } starpu_task_list_erase(&fifo_queue->taskq, task); } return task; } static struct starpu_task *dmda_pop_ready_task(unsigned sched_ctx_id) { struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct starpu_task *task; unsigned workerid = starpu_worker_get_id_check(); struct _starpu_fifo_taskq *fifo = dt->queue_array[workerid]; unsigned node = starpu_worker_get_memory_node(workerid); /* Take the opportunity to update start time */ fifo->exp_start = STARPU_MAX(starpu_timing_now(), fifo->exp_start); fifo->exp_end = fifo->exp_start + fifo->exp_len; task = _starpu_fifo_pop_first_ready_task(fifo, node, dt->num_priorities); if (task) { #ifdef STARPU_VERBOSE if (task->cl) { int non_ready = count_non_ready_buffers(task, node); if (non_ready == 0) dt->ready_task_cnt++; } dt->total_task_cnt++; #endif } return task; } static struct starpu_task *dmda_pop_task(unsigned sched_ctx_id) { struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct starpu_task *task; unsigned workerid = starpu_worker_get_id_check(); struct _starpu_fifo_taskq *fifo = dt->queue_array[workerid]; /* Take the opportunity to update start time */ fifo->exp_start = STARPU_MAX(starpu_timing_now(), fifo->exp_start); fifo->exp_end = fifo->exp_start + fifo->exp_len; STARPU_ASSERT_MSG(fifo, "worker %u does not belong to ctx %u anymore.\n", workerid, sched_ctx_id); task = _starpu_fifo_pop_local_task(fifo); if (task) { #ifdef STARPU_VERBOSE if (task->cl) { int non_ready = count_non_ready_buffers(task, starpu_worker_get_memory_node(workerid)); if (non_ready == 0) dt->ready_task_cnt++; } dt->total_task_cnt++; #endif } return task; } static struct starpu_task *dmda_pop_every_task(unsigned sched_ctx_id) { struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct starpu_task *new_list; unsigned workerid = starpu_worker_get_id_check(); struct _starpu_fifo_taskq *fifo = dt->queue_array[workerid]; /* Take the opportunity to update start time */ fifo->exp_start = STARPU_MAX(starpu_timing_now(), fifo->exp_start); fifo->exp_end = fifo->exp_start + fifo->exp_len; starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond); STARPU_PTHREAD_MUTEX_LOCK_SCHED(sched_mutex); new_list = _starpu_fifo_pop_every_task(fifo, workerid); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(sched_mutex); return new_list; } static int push_task_on_best_worker(struct starpu_task *task, int best_workerid, double predicted, double predicted_transfer, int prio, unsigned sched_ctx_id) { struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); /* make sure someone coule execute that task ! */ STARPU_ASSERT(best_workerid != -1); unsigned child_sched_ctx = starpu_sched_ctx_worker_is_master_for_child_ctx(best_workerid, sched_ctx_id); if(child_sched_ctx != STARPU_NMAX_SCHED_CTXS) { starpu_sched_ctx_revert_task_counters(sched_ctx_id, task->flops); starpu_sched_ctx_move_task_to_ctx(task, child_sched_ctx); return 0; } struct _starpu_fifo_taskq *fifo = dt->queue_array[best_workerid]; starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(best_workerid, &sched_mutex, &sched_cond); #ifdef STARPU_USE_SC_HYPERVISOR starpu_sched_ctx_call_pushed_task_cb(best_workerid, sched_ctx_id); #endif //STARPU_USE_SC_HYPERVISOR STARPU_PTHREAD_MUTEX_LOCK_SCHED(sched_mutex); /* Sometimes workers didn't take the tasks as early as we expected */ fifo->exp_start = isnan(fifo->exp_start) ? starpu_timing_now() : STARPU_MAX(fifo->exp_start, starpu_timing_now()); fifo->exp_end = fifo->exp_start + fifo->exp_len; fifo->exp_end = fifo->exp_start + fifo->exp_len; if ((starpu_timing_now() + predicted_transfer) < fifo->exp_end) { /* We may hope that the transfer will be finished by * the start of the task. */ predicted_transfer = 0.0; } else { /* The transfer will not be finished by then, take the * remainder into account */ predicted_transfer = (starpu_timing_now() + predicted_transfer) - fifo->exp_end; } if(!isnan(predicted_transfer)) { fifo->exp_end += predicted_transfer; fifo->exp_len += predicted_transfer; if(dt->num_priorities != -1) { int i; int task_prio = _normalize_prio(task->priority, dt->num_priorities, task->sched_ctx); for(i = 0; i <= task_prio; i++) fifo->exp_len_per_priority[i] += predicted_transfer; } } if(!isnan(predicted)) { fifo->exp_end += predicted; fifo->exp_len += predicted; if(dt->num_priorities != -1) { int i; int task_prio = _normalize_prio(task->priority, dt->num_priorities, task->sched_ctx); for(i = 0; i <= task_prio; i++) fifo->exp_len_per_priority[i] += predicted; } } STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(sched_mutex); task->predicted = predicted; task->predicted_transfer = predicted_transfer; #ifdef STARPU_USE_TOP starpu_top_task_prevision(task, best_workerid, (unsigned long long)(fifo->exp_end-predicted)/1000, (unsigned long long)fifo->exp_end/1000); #endif /* !STARPU_USE_TOP */ if (starpu_get_prefetch_flag()) { unsigned memory_node = starpu_worker_get_memory_node(best_workerid); starpu_prefetch_task_input_on_node(task, memory_node); } STARPU_AYU_ADDTOTASKQUEUE(starpu_task_get_job_id(task), best_workerid); int ret = 0; if (prio) { STARPU_PTHREAD_MUTEX_LOCK_SCHED(sched_mutex); ret =_starpu_fifo_push_sorted_task(dt->queue_array[best_workerid], task); if(dt->num_priorities != -1) { int i; int task_prio = _normalize_prio(task->priority, dt->num_priorities, task->sched_ctx); for(i = 0; i <= task_prio; i++) dt->queue_array[best_workerid]->ntasks_per_priority[i]++; } #if !defined(STARPU_NON_BLOCKING_DRIVERS) || defined(STARPU_SIMGRID) starpu_wakeup_worker_locked(best_workerid, sched_cond, sched_mutex); #endif starpu_push_task_end(task); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(sched_mutex); } else { STARPU_PTHREAD_MUTEX_LOCK_SCHED(sched_mutex); starpu_task_list_push_back (&dt->queue_array[best_workerid]->taskq, task); dt->queue_array[best_workerid]->ntasks++; dt->queue_array[best_workerid]->nprocessed++; #if !defined(STARPU_NON_BLOCKING_DRIVERS) || defined(STARPU_SIMGRID) starpu_wakeup_worker_locked(best_workerid, sched_cond, sched_mutex); #endif starpu_push_task_end(task); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(sched_mutex); } return ret; } /* TODO: factorize with dmda!! */ static int _dm_push_task(struct starpu_task *task, unsigned prio, unsigned sched_ctx_id) { struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned worker, worker_ctx = 0; int best = -1; double best_exp_end = 0.0; double model_best = 0.0; double transfer_model_best = 0.0; int ntasks_best = -1; double ntasks_best_end = 0.0; int calibrating = 0; /* A priori, we know all estimations */ int unknown = 0; unsigned best_impl = 0; unsigned nimpl; unsigned impl_mask; struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next_master(workers, &it)) { worker = workers->get_next_master(workers, &it); struct _starpu_fifo_taskq *fifo = dt->queue_array[worker]; unsigned memory_node = starpu_worker_get_memory_node(worker); struct starpu_perfmodel_arch* perf_arch = starpu_worker_get_perf_archtype(worker, sched_ctx_id); /* Sometimes workers didn't take the tasks as early as we expected */ double exp_start = isnan(fifo->exp_start) ? starpu_timing_now() : STARPU_MAX(fifo->exp_start, starpu_timing_now()); if (!starpu_worker_can_execute_task_impl(worker, task, &impl_mask)) continue; for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) { if (!(impl_mask & (1U << nimpl))) { /* no one on that queue may execute this task */ // worker_ctx++; continue; } double exp_end; double local_length = starpu_task_expected_length(task, perf_arch, nimpl); double local_penalty = starpu_task_expected_data_transfer_time(memory_node, task); double ntasks_end = fifo->ntasks / starpu_worker_get_relative_speedup(perf_arch); //_STARPU_DEBUG("Scheduler dm: task length (%lf) worker (%u) kernel (%u) \n", local_length,worker,nimpl); /* * This implements a default greedy scheduler for the * case of tasks which have no performance model, or * whose performance model is not calibrated yet. * * It simply uses the number of tasks already pushed to * the workers, divided by the relative performance of * a CPU and of a GPU. * * This is always computed, but the ntasks_best * selection is only really used if the task indeed has * no performance model, or is not calibrated yet. */ if (ntasks_best == -1 /* Always compute the greedy decision, at least for * the tasks with no performance model. */ || (!calibrating && ntasks_end < ntasks_best_end) /* The performance model of this task is not * calibrated on this worker, try to run it there * to calibrate it there. */ || (!calibrating && isnan(local_length)) /* the performance model of this task is not * calibrated on this worker either, rather run it * there if this one is low on scheduled tasks. */ || (calibrating && isnan(local_length) && ntasks_end < ntasks_best_end) ) { ntasks_best_end = ntasks_end; ntasks_best = worker; best_impl = nimpl; } if (isnan(local_length)) { /* we are calibrating, we want to speed-up calibration time * so we privilege non-calibrated tasks (but still * greedily distribute them to avoid dumb schedules) */ static int warned; if (!warned) { warned = 1; _STARPU_DISP("Warning: performance model for %s not finished calibrating on worker %u, using a dumb scheduling heuristic for now\n", starpu_task_get_name(task), worker); } calibrating = 1; } if (isnan(local_length) || _STARPU_IS_ZERO(local_length)) /* there is no prediction available for that task * with that arch yet, so switch to a greedy strategy */ unknown = 1; if (unknown) continue; exp_end = exp_start + fifo->exp_len + local_length; if (best == -1 || exp_end < best_exp_end) { /* a better solution was found */ best_exp_end = exp_end; best = worker; model_best = local_length; transfer_model_best = local_penalty; best_impl = nimpl; } } worker_ctx++; } if (unknown) { best = ntasks_best; model_best = 0.0; transfer_model_best = 0.0; #ifdef STARPU_VERBOSE dt->eager_task_cnt++; #endif } //_STARPU_DEBUG("Scheduler dm: kernel (%u)\n", best_impl); starpu_task_set_implementation(task, best_impl); _STARPU_TASK_BREAK_ON(task, sched); /* we should now have the best worker in variable "best" */ return push_task_on_best_worker(task, best, model_best, transfer_model_best, prio, sched_ctx_id); } /* TODO: factorise CPU computations, expensive with a lot of cores */ static void compute_all_performance_predictions(struct starpu_task *task, unsigned nworkers, double local_task_length[nworkers][STARPU_MAXIMPLEMENTATIONS], double exp_end[nworkers][STARPU_MAXIMPLEMENTATIONS], double *max_exp_endp, double *best_exp_endp, double local_data_penalty[nworkers][STARPU_MAXIMPLEMENTATIONS], double local_energy[nworkers][STARPU_MAXIMPLEMENTATIONS], int *forced_worker, int *forced_impl, unsigned sched_ctx_id, unsigned sorted_decision) { int calibrating = 0; double max_exp_end = DBL_MIN; double best_exp_end = DBL_MAX; int ntasks_best = -1; int nimpl_best = 0; double ntasks_best_end = 0.0; /* A priori, we know all estimations */ int unknown = 0; unsigned worker, worker_ctx = 0; unsigned nimpl; unsigned impl_mask; int task_prio = 0; starpu_task_bundle_t bundle = task->bundle; struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); if(sorted_decision && dt->num_priorities != -1) task_prio = _normalize_prio(task->priority, dt->num_priorities, sched_ctx_id); struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next_master(workers, &it)) { worker = workers->get_next_master(workers, &it); struct _starpu_fifo_taskq *fifo = dt->queue_array[worker]; struct starpu_perfmodel_arch* perf_arch = starpu_worker_get_perf_archtype(worker, sched_ctx_id); unsigned memory_node = starpu_worker_get_memory_node(worker); STARPU_ASSERT_MSG(fifo != NULL, "worker %u ctx %u\n", worker, sched_ctx_id); /* Sometimes workers didn't take the tasks as early as we expected */ double exp_start = isnan(fifo->exp_start) ? starpu_timing_now() : STARPU_MAX(fifo->exp_start, starpu_timing_now()); if (!starpu_worker_can_execute_task_impl(worker, task, &impl_mask)) continue; for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) { if (!(impl_mask & (1U << nimpl))) { /* no one on that queue may execute this task */ continue; } int fifo_ntasks = fifo->ntasks; double prev_exp_len = fifo->exp_len; /* consider the priority of the task when deciding on which worker to schedule, compute the expected_end of the task if it is inserted before other tasks already scheduled */ if(sorted_decision) { if(dt->num_priorities != -1) { prev_exp_len = fifo->exp_len_per_priority[task_prio]; fifo_ntasks = fifo->ntasks_per_priority[task_prio]; } else { starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(worker, &sched_mutex, &sched_cond); STARPU_PTHREAD_MUTEX_LOCK_SCHED(sched_mutex); prev_exp_len = _starpu_fifo_get_exp_len_prev_task_list(fifo, task, worker, nimpl, &fifo_ntasks); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(sched_mutex); } } exp_end[worker_ctx][nimpl] = exp_start + prev_exp_len; if (exp_end[worker_ctx][nimpl] > max_exp_end) max_exp_end = exp_end[worker_ctx][nimpl]; //_STARPU_DEBUG("Scheduler dmda: task length (%lf) worker (%u) kernel (%u) \n", local_task_length[worker][nimpl],worker,nimpl); if (bundle) { /* TODO : conversion time */ local_task_length[worker_ctx][nimpl] = starpu_task_bundle_expected_length(bundle, perf_arch, nimpl); local_data_penalty[worker_ctx][nimpl] = starpu_task_bundle_expected_data_transfer_time(bundle, memory_node); local_energy[worker_ctx][nimpl] = starpu_task_bundle_expected_energy(bundle, perf_arch,nimpl); } else { local_task_length[worker_ctx][nimpl] = starpu_task_expected_length(task, perf_arch, nimpl); local_data_penalty[worker_ctx][nimpl] = starpu_task_expected_data_transfer_time(memory_node, task); local_energy[worker_ctx][nimpl] = starpu_task_expected_energy(task, perf_arch,nimpl); double conversion_time = starpu_task_expected_conversion_time(task, perf_arch, nimpl); if (conversion_time > 0.0) local_task_length[worker_ctx][nimpl] += conversion_time; } double ntasks_end = fifo_ntasks / starpu_worker_get_relative_speedup(perf_arch); /* * This implements a default greedy scheduler for the * case of tasks which have no performance model, or * whose performance model is not calibrated yet. * * It simply uses the number of tasks already pushed to * the workers, divided by the relative performance of * a CPU and of a GPU. * * This is always computed, but the ntasks_best * selection is only really used if the task indeed has * no performance model, or is not calibrated yet. */ if (ntasks_best == -1 /* Always compute the greedy decision, at least for * the tasks with no performance model. */ || (!calibrating && ntasks_end < ntasks_best_end) /* The performance model of this task is not * calibrated on this worker, try to run it there * to calibrate it there. */ || (!calibrating && isnan(local_task_length[worker_ctx][nimpl])) /* the performance model of this task is not * calibrated on this worker either, rather run it * there if this one is low on scheduled tasks. */ || (calibrating && isnan(local_task_length[worker_ctx][nimpl]) && ntasks_end < ntasks_best_end) ) { ntasks_best_end = ntasks_end; ntasks_best = worker; nimpl_best = nimpl; } if (isnan(local_task_length[worker_ctx][nimpl])) /* we are calibrating, we want to speed-up calibration time * so we privilege non-calibrated tasks (but still * greedily distribute them to avoid dumb schedules) */ calibrating = 1; if (isnan(local_task_length[worker_ctx][nimpl]) || _STARPU_IS_ZERO(local_task_length[worker_ctx][nimpl])) /* there is no prediction available for that task * with that arch (yet or at all), so switch to a greedy strategy */ unknown = 1; if (unknown) continue; exp_end[worker_ctx][nimpl] = exp_start + prev_exp_len + local_task_length[worker_ctx][nimpl]; if (exp_end[worker_ctx][nimpl] < best_exp_end) { /* a better solution was found */ best_exp_end = exp_end[worker_ctx][nimpl]; nimpl_best = nimpl; } if (isnan(local_energy[worker_ctx][nimpl])) local_energy[worker_ctx][nimpl] = 0.; } worker_ctx++; } *forced_worker = unknown?ntasks_best:-1; *forced_impl = unknown?nimpl_best:-1; #ifdef STARPU_VERBOSE if (unknown) { dt->eager_task_cnt++; } #endif *best_exp_endp = best_exp_end; *max_exp_endp = max_exp_end; } static double _dmda_push_task(struct starpu_task *task, unsigned prio, unsigned sched_ctx_id, unsigned simulate, unsigned sorted_decision) { /* find the queue */ unsigned worker, worker_ctx = 0; int best = -1, best_in_ctx = -1; int selected_impl = 0; double model_best = 0.0; double transfer_model_best = 0.0; /* this flag is set if the corresponding worker is selected because there is no performance prediction available yet */ int forced_best = -1; int forced_impl = -1; struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); unsigned nworkers_ctx = workers->nworkers; double local_task_length[nworkers_ctx][STARPU_MAXIMPLEMENTATIONS]; double local_data_penalty[nworkers_ctx][STARPU_MAXIMPLEMENTATIONS]; double local_energy[nworkers_ctx][STARPU_MAXIMPLEMENTATIONS]; /* Expected end of this task on the workers */ double exp_end[nworkers_ctx][STARPU_MAXIMPLEMENTATIONS]; /* This is the minimum among the exp_end[] matrix */ double best_exp_end; /* This is the maximum termination time of already-scheduled tasks over all workers */ double max_exp_end = 0.0; double fitness[nworkers_ctx][STARPU_MAXIMPLEMENTATIONS]; compute_all_performance_predictions(task, nworkers_ctx, local_task_length, exp_end, &max_exp_end, &best_exp_end, local_data_penalty, local_energy, &forced_best, &forced_impl, sched_ctx_id, sorted_decision); double best_fitness = -1; unsigned nimpl; unsigned impl_mask; if (forced_best == -1) { struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next_master(workers, &it)) { worker = workers->get_next_master(workers, &it); if (!starpu_worker_can_execute_task_impl(worker, task, &impl_mask)) continue; for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) { if (!(impl_mask & (1U << nimpl))) { /* no one on that queue may execute this task */ continue; } fitness[worker_ctx][nimpl] = dt->alpha*(exp_end[worker_ctx][nimpl] - best_exp_end) + dt->beta*(local_data_penalty[worker_ctx][nimpl]) + dt->_gamma*(local_energy[worker_ctx][nimpl]); if (exp_end[worker_ctx][nimpl] > max_exp_end) { /* This placement will make the computation * longer, take into account the idle * consumption of other cpus */ fitness[worker_ctx][nimpl] += dt->_gamma * dt->idle_power * (exp_end[worker_ctx][nimpl] - max_exp_end) / 1000000.0; } if (best == -1 || fitness[worker_ctx][nimpl] < best_fitness) { /* we found a better solution */ best_fitness = fitness[worker_ctx][nimpl]; best = worker; best_in_ctx = worker_ctx; selected_impl = nimpl; //_STARPU_DEBUG("best fitness (worker %d) %e = alpha*(%e) + beta(%e) +gamma(%e)\n", worker, best_fitness, exp_end[worker][nimpl] - best_exp_end, local_data_penalty[worker][nimpl], local_energy[worker][nimpl]); } } worker_ctx++; } } STARPU_ASSERT(forced_best != -1 || best != -1); if (forced_best != -1) { /* there is no prediction available for that task * with that arch we want to speed-up calibration time * so we force this measurement */ best = forced_best; selected_impl = forced_impl; model_best = 0.0; transfer_model_best = 0.0; } else if (task->bundle) { struct starpu_perfmodel_arch* perf_arch = starpu_worker_get_perf_archtype(best_in_ctx, sched_ctx_id); unsigned memory_node = starpu_worker_get_memory_node(best); model_best = starpu_task_expected_length(task, perf_arch, selected_impl); transfer_model_best = starpu_task_expected_data_transfer_time(memory_node, task); } else { model_best = local_task_length[best_in_ctx][selected_impl]; transfer_model_best = local_data_penalty[best_in_ctx][selected_impl]; } //_STARPU_DEBUG("Scheduler dmda: kernel (%u)\n", best_impl); starpu_task_set_implementation(task, selected_impl); _STARPU_TASK_BREAK_ON(task, sched); if(!simulate) { /* we should now have the best worker in variable "best" */ return push_task_on_best_worker(task, best, model_best, transfer_model_best, prio, sched_ctx_id); } else { // double max_len = (max_exp_end - starpu_timing_now()); /* printf("%d: dmda max_exp_end %lf best_exp_end %lf max_len %lf \n", sched_ctx_id, max_exp_end/1000000.0, best_exp_end/1000000.0, max_len/1000000.0); */ return exp_end[best_in_ctx][selected_impl] ; } } static int dmda_push_sorted_decision_task(struct starpu_task *task) { return _dmda_push_task(task, 1, task->sched_ctx, 0, 1); } static int dmda_push_sorted_task(struct starpu_task *task) { #ifdef STARPU_DEVEL #warning TODO: after defining a scheduling window, use that instead of empty_ctx_tasks #endif return _dmda_push_task(task, 1, task->sched_ctx, 0, 0); } static int dm_push_task(struct starpu_task *task) { return _dm_push_task(task, 0, task->sched_ctx); } static int dmda_push_task(struct starpu_task *task) { STARPU_ASSERT(task); return _dmda_push_task(task, 0, task->sched_ctx, 0, 0); } static double dmda_simulate_push_task(struct starpu_task *task) { STARPU_ASSERT(task); return _dmda_push_task(task, 0, task->sched_ctx, 1, 0); } static double dmda_simulate_push_sorted_task(struct starpu_task *task) { STARPU_ASSERT(task); return _dmda_push_task(task, 1, task->sched_ctx, 1, 0); } static double dmda_simulate_push_sorted_decision_task(struct starpu_task *task) { STARPU_ASSERT(task); return _dmda_push_task(task, 1, task->sched_ctx, 1, 1); } static void dmda_add_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers) { struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned i; for (i = 0; i < nworkers; i++) { struct _starpu_fifo_taskq *q; int workerid = workerids[i]; /* if the worker has alreadry belonged to this context the queue and the synchronization variables have been already initialized */ q = dt->queue_array[workerid]; if(q == NULL) { q = dt->queue_array[workerid] = _starpu_create_fifo(); /* These are only stats, they can be read with races */ STARPU_HG_DISABLE_CHECKING(q->exp_start); STARPU_HG_DISABLE_CHECKING(q->exp_len); STARPU_HG_DISABLE_CHECKING(q->exp_end); } if(dt->num_priorities != -1) { _STARPU_MALLOC(q->exp_len_per_priority, dt->num_priorities*sizeof(double)); _STARPU_MALLOC(q->ntasks_per_priority, dt->num_priorities*sizeof(unsigned)); int j; for(j = 0; j < dt->num_priorities; j++) { q->exp_len_per_priority[j] = 0.0; q->ntasks_per_priority[j] = 0; } } } } static void dmda_remove_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers) { struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); int workerid; unsigned i; for (i = 0; i < nworkers; i++) { workerid = workerids[i]; if(dt->queue_array[workerid] != NULL) { if(dt->num_priorities != -1) { free(dt->queue_array[workerid]->exp_len_per_priority); free(dt->queue_array[workerid]->ntasks_per_priority); } _starpu_destroy_fifo(dt->queue_array[workerid]); dt->queue_array[workerid] = NULL; } } } static void initialize_dmda_policy(unsigned sched_ctx_id) { starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); struct _starpu_dmda_data *dt; _STARPU_CALLOC(dt, 1, sizeof(struct _starpu_dmda_data)); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)dt); _STARPU_MALLOC(dt->queue_array, STARPU_NMAXWORKERS*sizeof(struct _starpu_fifo_taskq*)); int i; for(i = 0; i < STARPU_NMAXWORKERS; i++) dt->queue_array[i] = NULL; dt->alpha = starpu_get_env_float_default("STARPU_SCHED_ALPHA", _STARPU_SCHED_ALPHA_DEFAULT); dt->beta = starpu_get_env_float_default("STARPU_SCHED_BETA", _STARPU_SCHED_BETA_DEFAULT); dt->_gamma = starpu_get_env_float_default("STARPU_SCHED_GAMMA", _STARPU_SCHED_GAMMA_DEFAULT); dt->idle_power = starpu_get_env_float_default("STARPU_IDLE_POWER", 0.0); if(starpu_sched_ctx_min_priority_is_set(sched_ctx_id) != 0 && starpu_sched_ctx_max_priority_is_set(sched_ctx_id) != 0) dt->num_priorities = starpu_sched_ctx_get_max_priority(sched_ctx_id) - starpu_sched_ctx_get_min_priority(sched_ctx_id) + 1; else dt->num_priorities = -1; #ifdef STARPU_USE_TOP /* FIXME: broken, needs to access context variable */ starpu_top_register_parameter_float("DMDA_ALPHA", &alpha, alpha_minimum, alpha_maximum, param_modified); starpu_top_register_parameter_float("DMDA_BETA", &beta, beta_minimum, beta_maximum, param_modified); starpu_top_register_parameter_float("DMDA_GAMMA", &_gamma, gamma_minimum, gamma_maximum, param_modified); starpu_top_register_parameter_float("DMDA_IDLE_POWER", &idle_power, idle_power_minimum, idle_power_maximum, param_modified); #endif /* !STARPU_USE_TOP */ } static void initialize_dmda_sorted_policy(unsigned sched_ctx_id) { initialize_dmda_policy(sched_ctx_id); /* The application may use any integer */ if (starpu_sched_ctx_min_priority_is_set(sched_ctx_id) == 0) starpu_sched_ctx_set_min_priority(sched_ctx_id, INT_MIN); if (starpu_sched_ctx_max_priority_is_set(sched_ctx_id) == 0) starpu_sched_ctx_set_max_priority(sched_ctx_id, INT_MAX); } static void deinitialize_dmda_policy(unsigned sched_ctx_id) { struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); #ifdef STARPU_VERBOSE { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); long int modelled_task_cnt = dt->total_task_cnt - dt->eager_task_cnt; _STARPU_DEBUG("%s sched policy (sched_ctx %u): total_task_cnt %ld ready_task_cnt %ld (%.1f%%), modelled_task_cnt = %ld (%.1f%%)%s\n", sched_ctx->sched_policy?sched_ctx->sched_policy->policy_name:"", sched_ctx_id, dt->total_task_cnt, dt->ready_task_cnt, (100.0f*dt->ready_task_cnt)/dt->total_task_cnt, modelled_task_cnt, (100.0f*modelled_task_cnt)/dt->total_task_cnt, modelled_task_cnt==0?" *** Check if performance models are enabled and converging on a per-codelet basis, or use an non-modeling scheduling policy. ***":""); } #endif free(dt->queue_array); free(dt); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); } /* dmda_pre_exec_hook is called right after the data transfer is done and right * before the computation to begin, it is useful to update more precisely the * value of the expected start, end, length, etc... */ static void dmda_pre_exec_hook(struct starpu_task *task) { unsigned sched_ctx_id = task->sched_ctx; unsigned workerid = starpu_worker_get_id_check(); struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct _starpu_fifo_taskq *fifo = dt->queue_array[workerid]; double model = task->predicted; double transfer_model = task->predicted_transfer; starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond); /* Once the task is executing, we can update the predicted amount * of work. */ STARPU_PTHREAD_MUTEX_LOCK_SCHED(sched_mutex); /* Take the opportunity to update start time */ fifo->exp_start = STARPU_MAX(starpu_timing_now(), fifo->exp_start); fifo->exp_end = fifo->exp_start + fifo->exp_len; if(!isnan(transfer_model)) { /* The transfer is over, get rid of it in the completion * prediction */ fifo->exp_len -= transfer_model; if(dt->num_priorities != -1) { int i; int task_prio = _normalize_prio(task->priority, dt->num_priorities, task->sched_ctx); for(i = 0; i <= task_prio; i++) fifo->exp_len_per_priority[i] -= transfer_model; } } if(!isnan(model)) { /* We now start the computation, get rid of it in the completion * prediction */ fifo->exp_len -= model; fifo->exp_start += model; if(dt->num_priorities != -1) { int i; int task_prio = _normalize_prio(task->priority, dt->num_priorities, task->sched_ctx); for(i = 0; i <= task_prio; i++) fifo->exp_len_per_priority[i] -= model; } } fifo->exp_end = fifo->exp_start + fifo->exp_len; STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(sched_mutex); } static void dmda_push_task_notify(struct starpu_task *task, int workerid, int perf_workerid, unsigned sched_ctx_id) { struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct _starpu_fifo_taskq *fifo = dt->queue_array[workerid]; /* Compute the expected penality */ struct starpu_perfmodel_arch *perf_arch = starpu_worker_get_perf_archtype(perf_workerid, sched_ctx_id); unsigned memory_node = starpu_worker_get_memory_node(workerid); double predicted = starpu_task_expected_length(task, perf_arch, starpu_task_get_implementation(task)); double predicted_transfer = starpu_task_expected_data_transfer_time(memory_node, task); starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond); /* Update the predictions */ STARPU_PTHREAD_MUTEX_LOCK_SCHED(sched_mutex); /* Sometimes workers didn't take the tasks as early as we expected */ fifo->exp_start = isnan(fifo->exp_start) ? starpu_timing_now() : STARPU_MAX(fifo->exp_start, starpu_timing_now()); fifo->exp_end = fifo->exp_start + fifo->exp_len; /* If there is no prediction available, we consider the task has a null length */ if (!isnan(predicted_transfer)) { if (starpu_timing_now() + predicted_transfer < fifo->exp_end) { /* We may hope that the transfer will be finished by * the start of the task. */ predicted_transfer = 0; } else { /* The transfer will not be finished by then, take the * remainder into account */ predicted_transfer = (starpu_timing_now() + predicted_transfer) - fifo->exp_end; } task->predicted_transfer = predicted_transfer; fifo->exp_end += predicted_transfer; fifo->exp_len += predicted_transfer; if(dt->num_priorities != -1) { int i; int task_prio = _normalize_prio(task->priority, dt->num_priorities, task->sched_ctx); for(i = 0; i <= task_prio; i++) fifo->exp_len_per_priority[i] += predicted_transfer; } } /* If there is no prediction available, we consider the task has a null length */ if (!isnan(predicted)) { task->predicted = predicted; fifo->exp_end += predicted; fifo->exp_len += predicted; if(dt->num_priorities != -1) { int i; int task_prio = _normalize_prio(task->priority, dt->num_priorities, task->sched_ctx); for(i = 0; i <= task_prio; i++) fifo->exp_len_per_priority[i] += predicted; } } if(dt->num_priorities != -1) { int i; int task_prio = _normalize_prio(task->priority, dt->num_priorities, task->sched_ctx); for(i = 0; i <= task_prio; i++) fifo->ntasks_per_priority[i]++; } fifo->ntasks++; STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(sched_mutex); } static void dmda_post_exec_hook(struct starpu_task * task) { struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(task->sched_ctx); unsigned workerid = starpu_worker_get_id_check(); struct _starpu_fifo_taskq *fifo = dt->queue_array[workerid]; starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond); STARPU_PTHREAD_MUTEX_LOCK_SCHED(sched_mutex); fifo->exp_start = starpu_timing_now(); fifo->exp_end = fifo->exp_start + fifo->exp_len; STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(sched_mutex); } struct starpu_sched_policy _starpu_sched_dm_policy = { .init_sched = initialize_dmda_policy, .deinit_sched = deinitialize_dmda_policy, .add_workers = dmda_add_workers , .remove_workers = dmda_remove_workers, .push_task = dm_push_task, .simulate_push_task = NULL, .pop_task = dmda_pop_task, .pre_exec_hook = dmda_pre_exec_hook, .post_exec_hook = dmda_post_exec_hook, .pop_every_task = dmda_pop_every_task, .policy_name = "dm", .policy_description = "performance model" }; struct starpu_sched_policy _starpu_sched_dmda_policy = { .init_sched = initialize_dmda_policy, .deinit_sched = deinitialize_dmda_policy, .add_workers = dmda_add_workers , .remove_workers = dmda_remove_workers, .push_task = dmda_push_task, .simulate_push_task = dmda_simulate_push_task, .push_task_notify = dmda_push_task_notify, .pop_task = dmda_pop_task, .pre_exec_hook = dmda_pre_exec_hook, .post_exec_hook = dmda_post_exec_hook, .pop_every_task = dmda_pop_every_task, .policy_name = "dmda", .policy_description = "data-aware performance model" }; struct starpu_sched_policy _starpu_sched_dmda_sorted_policy = { .init_sched = initialize_dmda_sorted_policy, .deinit_sched = deinitialize_dmda_policy, .add_workers = dmda_add_workers , .remove_workers = dmda_remove_workers, .push_task = dmda_push_sorted_task, .simulate_push_task = dmda_simulate_push_sorted_task, .push_task_notify = dmda_push_task_notify, .pop_task = dmda_pop_ready_task, .pre_exec_hook = dmda_pre_exec_hook, .post_exec_hook = dmda_post_exec_hook, .pop_every_task = dmda_pop_every_task, .policy_name = "dmdas", .policy_description = "data-aware performance model (sorted)" }; struct starpu_sched_policy _starpu_sched_dmda_sorted_decision_policy = { .init_sched = initialize_dmda_sorted_policy, .deinit_sched = deinitialize_dmda_policy, .add_workers = dmda_add_workers , .remove_workers = dmda_remove_workers, .push_task = dmda_push_sorted_decision_task, .simulate_push_task = dmda_simulate_push_sorted_decision_task, .push_task_notify = dmda_push_task_notify, .pop_task = dmda_pop_ready_task, .pre_exec_hook = dmda_pre_exec_hook, .post_exec_hook = dmda_post_exec_hook, .pop_every_task = dmda_pop_every_task, .policy_name = "dmdasd", .policy_description = "data-aware performance model (sorted decision)" }; struct starpu_sched_policy _starpu_sched_dmda_ready_policy = { .init_sched = initialize_dmda_policy, .deinit_sched = deinitialize_dmda_policy, .add_workers = dmda_add_workers , .remove_workers = dmda_remove_workers, .push_task = dmda_push_task, .simulate_push_task = dmda_simulate_push_task, .push_task_notify = dmda_push_task_notify, .pop_task = dmda_pop_ready_task, .pre_exec_hook = dmda_pre_exec_hook, .post_exec_hook = dmda_post_exec_hook, .pop_every_task = dmda_pop_every_task, .policy_name = "dmdar", .policy_description = "data-aware performance model (ready)" }; starpu-1.2.3+dfsg/src/sched_policies/eager_central_policy.c000066400000000000000000000164471320135501600240440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2016 Université de Bordeaux * Copyright (C) 2010-2013, 2017 CNRS * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This is just the trivial policy where every worker use the same * JOB QUEUE. */ #include #include #include #include struct _starpu_eager_center_policy_data { struct _starpu_fifo_taskq *fifo; starpu_pthread_mutex_t policy_mutex; struct starpu_bitmap *waiters; }; static void initialize_eager_center_policy(unsigned sched_ctx_id) { if (starpu_get_env_number_default("STARPU_WORKER_TREE", 0)) { #ifdef STARPU_HAVE_HWLOC starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_TREE); #else _STARPU_DISP("STARPU_WORKER_TREE ignored, please rebuild StarPU with hwloc support to enable it."); starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); #endif } else starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); struct _starpu_eager_center_policy_data *data; _STARPU_MALLOC(data, sizeof(struct _starpu_eager_center_policy_data)); _STARPU_DISP("Warning: you are running the default eager scheduler, which is not a very smart scheduler. Make sure to read the StarPU documentation about adding performance models in order to be able to use the dmda or dmdas scheduler instead.\n"); /* there is only a single queue in that trivial design */ data->fifo = _starpu_create_fifo(); data->waiters = starpu_bitmap_create(); /* Tell helgrind that it's fine to check for empty fifo in * pop_task_eager_policy without actual mutex (it's just an integer) */ STARPU_HG_DISABLE_CHECKING(data->fifo->ntasks); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)data); STARPU_PTHREAD_MUTEX_INIT(&data->policy_mutex, NULL); } static void deinitialize_eager_center_policy(unsigned sched_ctx_id) { /* TODO check that there is no task left in the queue */ struct _starpu_eager_center_policy_data *data = (struct _starpu_eager_center_policy_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); /* deallocate the job queue */ _starpu_destroy_fifo(data->fifo); starpu_bitmap_destroy(data->waiters); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); STARPU_PTHREAD_MUTEX_DESTROY(&data->policy_mutex); free(data); } static int push_task_eager_policy(struct starpu_task *task) { unsigned sched_ctx_id = task->sched_ctx; struct _starpu_eager_center_policy_data *data = (struct _starpu_eager_center_policy_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); starpu_task_list_push_back(&data->fifo->taskq,task); data->fifo->ntasks++; data->fifo->nprocessed++; starpu_push_task_end(task); /*if there are no tasks block */ /* wake people waiting for a task */ unsigned worker = 0; struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; #ifndef STARPU_NON_BLOCKING_DRIVERS char dowake[STARPU_NMAXWORKERS] = { 0 }; #endif workers->init_iterator(workers, &it); while(workers->has_next_master(workers, &it)) { worker = workers->get_next_master(workers, &it); #ifdef STARPU_NON_BLOCKING_DRIVERS if (!starpu_bitmap_get(data->waiters, worker)) /* This worker is not waiting for a task */ continue; #endif if (starpu_worker_can_execute_task_first_impl(worker, task, NULL)) { /* It can execute this one, tell him! */ #ifdef STARPU_NON_BLOCKING_DRIVERS starpu_bitmap_unset(data->waiters, worker); /* We really woke at least somebody, no need to wake somebody else */ break; #else dowake[worker] = 1; #endif } } /* Let the task free */ STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); #ifndef STARPU_NON_BLOCKING_DRIVERS /* Now that we have a list of potential workers, try to wake one */ workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); if (dowake[worker]) if (starpu_wake_worker(worker)) break; // wake up a single worker } #endif return 0; } static struct starpu_task *pop_every_task_eager_policy(unsigned sched_ctx_id) { struct _starpu_eager_center_policy_data *data = (struct _starpu_eager_center_policy_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned workerid = starpu_worker_get_id_check(); STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); struct starpu_task* task = _starpu_fifo_pop_every_task(data->fifo, workerid); STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); return task; } static struct starpu_task *pop_task_eager_policy(unsigned sched_ctx_id) { struct starpu_task *chosen_task = NULL; unsigned workerid = starpu_worker_get_id_check(); struct _starpu_eager_center_policy_data *data = (struct _starpu_eager_center_policy_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); /* block until some event happens */ /* Here helgrind would shout that this is unprotected, this is just an * integer access, and we hold the sched mutex, so we can not miss any * wake up. */ if (!STARPU_RUNNING_ON_VALGRIND && _starpu_fifo_empty(data->fifo)) return NULL; #ifdef STARPU_NON_BLOCKING_DRIVERS if (!STARPU_RUNNING_ON_VALGRIND && starpu_bitmap_get(data->waiters, workerid)) /* Nobody woke us, avoid bothering the mutex */ return NULL; #endif STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); chosen_task = _starpu_fifo_pop_task(data->fifo, workerid); if (!chosen_task) /* Tell pushers that we are waiting for tasks for us */ starpu_bitmap_set(data->waiters, workerid); STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); if(chosen_task) { unsigned child_sched_ctx = starpu_sched_ctx_worker_is_master_for_child_ctx(workerid, sched_ctx_id); if(child_sched_ctx != STARPU_NMAX_SCHED_CTXS) { starpu_sched_ctx_move_task_to_ctx(chosen_task, child_sched_ctx); starpu_sched_ctx_revert_task_counters(sched_ctx_id, chosen_task->flops); return NULL; } } return chosen_task; } static void eager_add_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers) { int workerid; unsigned i; for (i = 0; i < nworkers; i++) { workerid = workerids[i]; int curr_workerid = starpu_worker_get_id(); if(workerid != curr_workerid) starpu_wake_worker(workerid); starpu_sched_ctx_worker_shares_tasks_lists(workerid, sched_ctx_id); } } struct starpu_sched_policy _starpu_sched_eager_policy = { .init_sched = initialize_eager_center_policy, .deinit_sched = deinitialize_eager_center_policy, .add_workers = eager_add_workers, .remove_workers = NULL, .push_task = push_task_eager_policy, .pop_task = pop_task_eager_policy, .pre_exec_hook = NULL, .post_exec_hook = NULL, .pop_every_task = pop_every_task_eager_policy, .policy_name = "eager", .policy_description = "eager policy with a central queue" }; starpu-1.2.3+dfsg/src/sched_policies/eager_central_priority_policy.c000066400000000000000000000244121320135501600257740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015, 2017 CNRS * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This is policy where every worker use the same JOB QUEUE, but taking * task priorities into account */ #include #include #include #include #include #define DEFAULT_MIN_LEVEL (-5) #define DEFAULT_MAX_LEVEL (+5) struct _starpu_priority_taskq { int min_prio; int max_prio; /* the actual lists * taskq[p] is for priority [p - STARPU_MIN_PRIO] */ struct starpu_task_list *taskq; unsigned *ntasks; unsigned total_ntasks; }; struct _starpu_eager_central_prio_data { struct _starpu_priority_taskq *taskq; starpu_pthread_mutex_t policy_mutex; struct starpu_bitmap *waiters; }; /* * Centralized queue with priorities */ static struct _starpu_priority_taskq *_starpu_create_priority_taskq(int min_prio, int max_prio) { struct _starpu_priority_taskq *central_queue; _STARPU_MALLOC(central_queue, sizeof(struct _starpu_priority_taskq)); central_queue->min_prio = min_prio; central_queue->max_prio = max_prio; central_queue->total_ntasks = 0; _STARPU_MALLOC(central_queue->taskq, (max_prio-min_prio+1) * sizeof(struct starpu_task_list)); _STARPU_MALLOC(central_queue->ntasks, (max_prio-min_prio+1) * sizeof(unsigned)); int prio; for (prio = 0; prio < (max_prio-min_prio+1); prio++) { starpu_task_list_init(¢ral_queue->taskq[prio]); central_queue->ntasks[prio] = 0; } return central_queue; } static void _starpu_destroy_priority_taskq(struct _starpu_priority_taskq *priority_queue) { free(priority_queue->ntasks); free(priority_queue->taskq); free(priority_queue); } static void initialize_eager_center_priority_policy(unsigned sched_ctx_id) { if (starpu_get_env_number_default("STARPU_WORKER_TREE", 0)) { #ifdef STARPU_HAVE_HWLOC starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_TREE); #else _STARPU_DISP("STARPU_WORKER_TREE ignored, please rebuild StarPU with hwloc support to enable it."); starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); #endif } else starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); struct _starpu_eager_central_prio_data *data; _STARPU_MALLOC(data, sizeof(struct _starpu_eager_central_prio_data)); /* In this policy, we support more than two levels of priority. */ if (starpu_sched_ctx_min_priority_is_set(sched_ctx_id) == 0) starpu_sched_ctx_set_min_priority(sched_ctx_id, DEFAULT_MIN_LEVEL); if (starpu_sched_ctx_max_priority_is_set(sched_ctx_id) == 0) starpu_sched_ctx_set_max_priority(sched_ctx_id, DEFAULT_MAX_LEVEL); /* only a single queue (even though there are several internaly) */ data->taskq = _starpu_create_priority_taskq(starpu_sched_ctx_get_min_priority(sched_ctx_id), starpu_sched_ctx_get_max_priority(sched_ctx_id)); data->waiters = starpu_bitmap_create(); /* Tell helgrind that it's fine to check for empty fifo in * _starpu_priority_pop_task without actual mutex (it's just an * integer) */ STARPU_HG_DISABLE_CHECKING(data->taskq->total_ntasks); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)data); STARPU_PTHREAD_MUTEX_INIT(&data->policy_mutex, NULL); } static void deinitialize_eager_center_priority_policy(unsigned sched_ctx_id) { /* TODO check that there is no task left in the queue */ struct _starpu_eager_central_prio_data *data = (struct _starpu_eager_central_prio_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); /* deallocate the job queue */ _starpu_destroy_priority_taskq(data->taskq); starpu_bitmap_destroy(data->waiters); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); STARPU_PTHREAD_MUTEX_DESTROY(&data->policy_mutex); free(data); } static int _starpu_priority_push_task(struct starpu_task *task) { unsigned sched_ctx_id = task->sched_ctx; struct _starpu_eager_central_prio_data *data = (struct _starpu_eager_central_prio_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct _starpu_priority_taskq *taskq = data->taskq; STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); unsigned priolevel = task->priority - starpu_sched_ctx_get_min_priority(sched_ctx_id); STARPU_ASSERT_MSG(task->priority >= starpu_sched_ctx_get_min_priority(sched_ctx_id) && task->priority <= starpu_sched_ctx_get_max_priority(sched_ctx_id), "task priority %d is not between minimum %d and maximum %d\n", task->priority, starpu_sched_ctx_get_min_priority(sched_ctx_id), starpu_sched_ctx_get_max_priority(sched_ctx_id)); starpu_task_list_push_back(&taskq->taskq[priolevel], task); taskq->ntasks[priolevel]++; taskq->total_ntasks++; starpu_push_task_end(task); /*if there are no tasks block */ /* wake people waiting for a task */ struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; #ifndef STARPU_NON_BLOCKING_DRIVERS char dowake[STARPU_NMAXWORKERS] = { 0 }; #endif workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { unsigned worker = workers->get_next(workers, &it); #ifdef STARPU_NON_BLOCKING_DRIVERS if (!starpu_bitmap_get(data->waiters, worker)) /* This worker is not waiting for a task */ continue; #endif if (starpu_worker_can_execute_task_first_impl(worker, task, NULL)) { /* It can execute this one, tell him! */ #ifdef STARPU_NON_BLOCKING_DRIVERS starpu_bitmap_unset(data->waiters, worker); /* We really woke at least somebody, no need to wake somebody else */ break; #else dowake[worker] = 1; #endif } } /* Let the task free */ STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); #ifndef STARPU_NON_BLOCKING_DRIVERS /* Now that we have a list of potential workers, try to wake one */ workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { unsigned worker = workers->get_next(workers, &it); if (dowake[worker]) if (starpu_wake_worker(worker)) break; // wake up a single worker } #endif return 0; } static struct starpu_task *_starpu_priority_pop_task(unsigned sched_ctx_id) { struct starpu_task *chosen_task = NULL, *task, *nexttask; unsigned workerid = starpu_worker_get_id_check(); int skipped = 0; struct _starpu_eager_central_prio_data *data = (struct _starpu_eager_central_prio_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct _starpu_priority_taskq *taskq = data->taskq; /* block until some event happens */ /* Here helgrind would shout that this is unprotected, this is just an * integer access, and we hold the sched mutex, so we can not miss any * wake up. */ if (!STARPU_RUNNING_ON_VALGRIND && taskq->total_ntasks == 0) return NULL; #ifdef STARPU_NON_BLOCKING_DRIVERS if (!STARPU_RUNNING_ON_VALGRIND && starpu_bitmap_get(data->waiters, workerid)) /* Nobody woke us, avoid bothering the mutex */ return NULL; #endif /* release this mutex before trying to wake up other workers */ starpu_pthread_mutex_t *curr_sched_mutex; starpu_pthread_cond_t *curr_sched_cond; starpu_worker_get_sched_condition(workerid, &curr_sched_mutex, &curr_sched_cond); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(curr_sched_mutex); /* all workers will block on this mutex anyway so there's no need for their own mutex to be locked */ STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); unsigned priolevel = taskq->max_prio - taskq->min_prio; do { if (taskq->ntasks[priolevel] > 0) { for (task = starpu_task_list_begin(&taskq->taskq[priolevel]); task != starpu_task_list_end(&taskq->taskq[priolevel]) && !chosen_task; task = nexttask) { unsigned nimpl; nexttask = starpu_task_list_next(task); if (starpu_worker_can_execute_task_first_impl(workerid, task, &nimpl)) { /* there is some task that we can grab */ starpu_task_set_implementation(task, nimpl); starpu_task_list_erase(&taskq->taskq[priolevel], task); chosen_task = task; taskq->ntasks[priolevel]--; taskq->total_ntasks--; break; } else skipped = 1; } } } while (!chosen_task && priolevel-- > 0); if (!chosen_task && skipped) { /* Notify another worker to do that task */ struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { unsigned worker = workers->get_next(workers, &it); if(worker != workerid) { #ifdef STARPU_NON_BLOCKING_DRIVERS starpu_bitmap_unset(data->waiters, worker); #else starpu_wake_worker_locked(worker); #endif } } } if (!chosen_task) /* Tell pushers that we are waiting for tasks for us */ starpu_bitmap_set(data->waiters, workerid); STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); /* leave the mutex how it was found before this */ STARPU_PTHREAD_MUTEX_LOCK_SCHED(curr_sched_mutex); return chosen_task; } static void eager_center_priority_add_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers) { unsigned i; for (i = 0; i < nworkers; i++) { int workerid = workerids[i]; int curr_workerid = starpu_worker_get_id(); if(workerid != curr_workerid) starpu_wake_worker(workerid); starpu_sched_ctx_worker_shares_tasks_lists(workerid, sched_ctx_id); } } struct starpu_sched_policy _starpu_sched_prio_policy = { .add_workers = eager_center_priority_add_workers, .init_sched = initialize_eager_center_priority_policy, .deinit_sched = deinitialize_eager_center_priority_policy, /* we always use priorities in that policy */ .push_task = _starpu_priority_push_task, .pop_task = _starpu_priority_pop_task, .pre_exec_hook = NULL, .post_exec_hook = NULL, .pop_every_task = NULL, .policy_name = "prio", .policy_description = "eager (with priorities)" }; starpu-1.2.3+dfsg/src/sched_policies/fifo_queues.c000066400000000000000000000167321320135501600222010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2013, 2017 CNRS * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* FIFO queues, ready for use by schedulers */ #include #include #include /* static int is_sorted_task_list(struct starpu_task * task) { if(!task) return 1; struct starpu_task * next = task->next; if(!next) return 1; while(next) { if(task->priority < next->priority) return 0; task = next; next = next->next; } return 1; } */ struct _starpu_fifo_taskq *_starpu_create_fifo(void) { struct _starpu_fifo_taskq *fifo; _STARPU_MALLOC(fifo, sizeof(struct _starpu_fifo_taskq)); /* note that not all mechanisms (eg. the semaphore) have to be used */ starpu_task_list_init(&fifo->taskq); fifo->ntasks = 0; STARPU_HG_DISABLE_CHECKING(fifo->ntasks); fifo->nprocessed = 0; fifo->exp_start = starpu_timing_now(); fifo->exp_len = 0.0; fifo->exp_end = fifo->exp_start; fifo->exp_len_per_priority = NULL; return fifo; } void _starpu_destroy_fifo(struct _starpu_fifo_taskq *fifo) { free(fifo); } int _starpu_fifo_empty(struct _starpu_fifo_taskq *fifo) { return fifo->ntasks == 0; } double _starpu_fifo_get_exp_len_prev_task_list(struct _starpu_fifo_taskq *fifo_queue, struct starpu_task *task, int workerid, int nimpl, int *fifo_ntasks) { struct starpu_task_list *list = &fifo_queue->taskq; struct starpu_perfmodel_arch* perf_arch = starpu_worker_get_perf_archtype(workerid, task->sched_ctx); double exp_len = 0.0; if (list->head != NULL) { struct starpu_task *current = list->head; struct starpu_task *prev = NULL; if (list->head->priority == task->priority && list->head->priority == list->tail->priority) { /* They all have the same priority, the task's place is at the end */ prev = list->tail; current = NULL; } else while (current) { if (current->priority < task->priority) break; prev = current; current = current->next; } if (prev != NULL) { if (current) { /* the task's place is between prev and current */ struct starpu_task *it; for(it = list->head; it != current; it = it->next) { exp_len += starpu_task_expected_length(it, perf_arch, nimpl); (*fifo_ntasks) ++; } } else { /* the task's place is at the tail of the list */ exp_len = fifo_queue->exp_len; *fifo_ntasks = fifo_queue->ntasks; } } } return exp_len; } int _starpu_fifo_push_sorted_task(struct _starpu_fifo_taskq *fifo_queue, struct starpu_task *task) { struct starpu_task_list *list = &fifo_queue->taskq; if (list->head == NULL) { list->head = task; list->tail = task; task->prev = NULL; task->next = NULL; } else if (list->head->priority == task->priority && list->head->priority == list->tail->priority) { /* They all have the same priority, just put at the end */ list->tail->next = task; task->next = NULL; task->prev = list->tail; list->tail = task; } else { struct starpu_task *current = list->head; struct starpu_task *prev = NULL; while (current) { if (current->priority < task->priority) break; prev = current; current = current->next; } if (prev == NULL) { /* Insert at the front of the list */ list->head->prev = task; task->prev = NULL; task->next = list->head; list->head = task; } else { if (current) { /* Insert between prev and current */ task->prev = prev; prev->next = task; task->next = current; current->prev = task; } else { /* Insert at the tail of the list */ list->tail->next = task; task->next = NULL; task->prev = list->tail; list->tail = task; } } } fifo_queue->ntasks++; fifo_queue->nprocessed++; return 0; } int _starpu_fifo_push_task(struct _starpu_fifo_taskq *fifo_queue, struct starpu_task *task) { if (task->priority > 0) { _starpu_fifo_push_sorted_task(fifo_queue, task); } else { starpu_task_list_push_back(&fifo_queue->taskq, task); fifo_queue->ntasks++; fifo_queue->nprocessed++; } return 0; } int _starpu_fifo_push_back_task(struct _starpu_fifo_taskq *fifo_queue, struct starpu_task *task) { if (task->priority > 0) { _starpu_fifo_push_sorted_task(fifo_queue, task); } else { starpu_task_list_push_front(&fifo_queue->taskq, task); fifo_queue->ntasks++; } return 0; } int _starpu_fifo_pop_this_task(struct _starpu_fifo_taskq *fifo_queue, int workerid, struct starpu_task *task) { unsigned nimpl = 0; STARPU_ASSERT(task); #ifdef STARPU_DEBUG STARPU_ASSERT(starpu_task_list_ismember(&fifo_queue->taskq, task)); #endif if (workerid < 0 || starpu_worker_can_execute_task_first_impl(workerid, task, &nimpl)) { starpu_task_set_implementation(task, nimpl); starpu_task_list_erase(&fifo_queue->taskq, task); fifo_queue->ntasks--; return 1; } return 0; } struct starpu_task *_starpu_fifo_pop_task(struct _starpu_fifo_taskq *fifo_queue, int workerid) { struct starpu_task *task; for (task = starpu_task_list_begin(&fifo_queue->taskq); task != starpu_task_list_end(&fifo_queue->taskq); task = starpu_task_list_next(task)) { if (_starpu_fifo_pop_this_task(fifo_queue, workerid, task)) return task; } return NULL; } /* This is the same as _starpu_fifo_pop_task, but without checking that the * worker will be able to execute this task. This is useful when the scheduler * has already checked it. */ struct starpu_task *_starpu_fifo_pop_local_task(struct _starpu_fifo_taskq *fifo_queue) { struct starpu_task *task = NULL; if (!starpu_task_list_empty(&fifo_queue->taskq)) { task = starpu_task_list_pop_front(&fifo_queue->taskq); fifo_queue->ntasks--; } return task; } /* pop every task that can be executed on the calling driver */ struct starpu_task *_starpu_fifo_pop_every_task(struct _starpu_fifo_taskq *fifo_queue, int workerid) { unsigned size = fifo_queue->ntasks; struct starpu_task *new_list = NULL; if (size > 0) { struct starpu_task_list *old_list = &fifo_queue->taskq; struct starpu_task *new_list_tail = NULL; unsigned new_list_size = 0; struct starpu_task *task, *next_task; /* note that this starts at the _head_ of the list, so we put * elements at the back of the new list */ task = starpu_task_list_front(old_list); while (task) { unsigned nimpl; next_task = task->next; if (starpu_worker_can_execute_task_first_impl(workerid, task, &nimpl)) { /* this elements can be moved into the new list */ new_list_size++; starpu_task_list_erase(old_list, task); if (new_list_tail) { new_list_tail->next = task; task->prev = new_list_tail; task->next = NULL; new_list_tail = task; } else { new_list = task; new_list_tail = task; task->prev = NULL; task->next = NULL; } starpu_task_set_implementation(task, nimpl); } task = next_task; } fifo_queue->ntasks -= new_list_size; } return new_list; } starpu-1.2.3+dfsg/src/sched_policies/fifo_queues.h000066400000000000000000000051601320135501600221770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013, 2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* FIFO queues, ready for use by schedulers */ #ifndef __FIFO_QUEUES_H__ #define __FIFO_QUEUES_H__ #include struct _starpu_fifo_taskq { /* the actual list */ struct starpu_task_list taskq; /* the number of tasks currently in the queue */ unsigned ntasks; /* the number of tasks currently in the queue corresponding to each priority */ unsigned *ntasks_per_priority; /* the number of tasks that were processed */ unsigned nprocessed; /* only meaningful if the queue is only used by a single worker */ double exp_start; /* Expected start date of next item to do in the * queue (i.e. not started yet). This is thus updated * when we start it. */ double exp_end; /* Expected end date of last task in the queue */ double exp_len; /* Expected duration of the set of tasks in the queue */ double *exp_len_per_priority; /* Expected duration of the set of tasks in the queue corresponding to each priority */ }; struct _starpu_fifo_taskq*_starpu_create_fifo(void) STARPU_ATTRIBUTE_MALLOC; void _starpu_destroy_fifo(struct _starpu_fifo_taskq *fifo); int _starpu_fifo_empty(struct _starpu_fifo_taskq *fifo); double _starpu_fifo_get_exp_len_prev_task_list(struct _starpu_fifo_taskq *fifo_queue, struct starpu_task *task, int workerid, int nimpl, int *fifo_ntasks); int _starpu_fifo_push_sorted_task(struct _starpu_fifo_taskq *fifo_queue, struct starpu_task *task); int _starpu_fifo_push_task(struct _starpu_fifo_taskq *fifo, struct starpu_task *task); int _starpu_fifo_push_back_task(struct _starpu_fifo_taskq *fifo_queue, struct starpu_task *task); int _starpu_fifo_pop_this_task(struct _starpu_fifo_taskq *fifo_queue, int workerid, struct starpu_task *task); struct starpu_task *_starpu_fifo_pop_task(struct _starpu_fifo_taskq *fifo, int workerid); struct starpu_task *_starpu_fifo_pop_local_task(struct _starpu_fifo_taskq *fifo); struct starpu_task *_starpu_fifo_pop_every_task(struct _starpu_fifo_taskq *fifo, int workerid); #endif // __FIFO_QUEUES_H__ starpu-1.2.3+dfsg/src/sched_policies/graph_test_policy.c000066400000000000000000000270351320135501600234040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2017 Université de Bordeaux * Copyright (C) 2010-2013, 2017 CNRS * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This is just a test policy for using task graph information * * We keep tasks in the fifo queue, and store the graph of tasks, until we * get the do_schedule call from the application, which tells us all tasks * were queued, and we can now compute task depths or descendants and let a simple * central-queue greedy algorithm proceed. * * TODO: let workers starting running tasks before the whole graph is submitted? */ #include #include #include #include #include #include #include struct _starpu_graph_test_policy_data { struct _starpu_fifo_taskq *fifo; /* Bag of tasks which are ready before do_schedule is called */ struct _starpu_prio_deque prio_cpu; struct _starpu_prio_deque prio_gpu; starpu_pthread_mutex_t policy_mutex; struct starpu_bitmap *waiters; unsigned computed; unsigned descendants; /* Whether we use descendants, or depths, for priorities */ }; static void initialize_graph_test_policy(unsigned sched_ctx_id) { if (starpu_get_env_number_default("STARPU_WORKER_TREE", 0)) { #ifdef STARPU_HAVE_HWLOC starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_TREE); #else _STARPU_DISP("STARPU_WORKER_TREE ignored, please rebuild StarPU with hwloc support to enable it."); starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); #endif } else starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); struct _starpu_graph_test_policy_data *data; _STARPU_MALLOC(data, sizeof(struct _starpu_graph_test_policy_data)); /* there is only a single queue in that trivial design */ data->fifo = _starpu_create_fifo(); _starpu_prio_deque_init(&data->prio_cpu); _starpu_prio_deque_init(&data->prio_gpu); data->waiters = starpu_bitmap_create(); data->computed = 0; data->descendants = starpu_get_env_number_default("STARPU_SCHED_GRAPH_TEST_DESCENDANTS", 0); _starpu_graph_record = 1; /* Tell helgrind that it's fine to check for empty fifo in * pop_task_graph_test_policy without actual mutex (it's just an integer) */ STARPU_HG_DISABLE_CHECKING(data->fifo->ntasks); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)data); STARPU_PTHREAD_MUTEX_INIT(&data->policy_mutex, NULL); } static void deinitialize_graph_test_policy(unsigned sched_ctx_id) { struct _starpu_graph_test_policy_data *data = (struct _starpu_graph_test_policy_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct _starpu_fifo_taskq *fifo = data->fifo; STARPU_ASSERT(starpu_task_list_empty(&fifo->taskq)); /* deallocate the job queue */ _starpu_destroy_fifo(fifo); _starpu_prio_deque_destroy(&data->prio_cpu); _starpu_prio_deque_destroy(&data->prio_gpu); starpu_bitmap_destroy(data->waiters); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); STARPU_PTHREAD_MUTEX_DESTROY(&data->policy_mutex); free(data); } /* Push the given task on CPU or GPU prio list, using a dumb heuristic */ static struct _starpu_prio_deque *select_prio(unsigned sched_ctx_id, struct _starpu_graph_test_policy_data *data, struct starpu_task *task) { int cpu_can = 0, gpu_can = 0; double cpu_speed = 0.; double gpu_speed = 0.; /* Compute how fast CPUs can compute it, and how fast GPUs can compute it */ unsigned worker; struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); if (!starpu_worker_can_execute_task(worker, task, 0)) /* This worker can not execute this task, don't count it */ continue; if (starpu_worker_get_type(worker) == STARPU_CPU_WORKER) /* At least one CPU can run it */ cpu_can = 1; else /* At least one GPU can run it */ gpu_can = 1; /* Get expected task duration for this worker */ struct starpu_perfmodel_arch* perf_arch = starpu_worker_get_perf_archtype(worker, sched_ctx_id); double length = starpu_task_expected_length(task, perf_arch, 0); double power; if (isnan(length)) /* We don't have an estimation yet */ length = 0.; if (length == 0.) { _STARPU_DISP("Warning: graph_test needs performance models for all tasks, including %s\n", starpu_task_get_name(task)); power = 0.; } else power = 1./length; /* Add the computation power to the CPU or GPU pool */ if (starpu_worker_get_type(worker) == STARPU_CPU_WORKER) cpu_speed += power; else gpu_speed += power; } /* Decide to push on CPUs or GPUs depending on the overall computation power */ if (!gpu_can || (cpu_can && cpu_speed > gpu_speed)) return &data->prio_cpu; else return &data->prio_gpu; } static void set_priority(void *_data, struct _starpu_graph_node *node) { struct _starpu_graph_test_policy_data *data = _data; STARPU_PTHREAD_MUTEX_LOCK(&node->mutex); struct _starpu_job *job = node->job; if (job) { if (data->descendants) job->task->priority = node->descendants; else job->task->priority = node->depth; } STARPU_PTHREAD_MUTEX_UNLOCK(&node->mutex); } static void do_schedule_graph_test_policy(unsigned sched_ctx_id) { struct _starpu_graph_test_policy_data *data = (struct _starpu_graph_test_policy_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); if (data->descendants) _starpu_graph_compute_descendants(); else _starpu_graph_compute_depths(); data->computed = 1; _starpu_graph_foreach(set_priority, data); /* Now that we have priorities, move tasks from bag to priority queue */ while(!_starpu_fifo_empty(data->fifo)) { struct starpu_task *task = _starpu_fifo_pop_task(data->fifo, -1); struct _starpu_prio_deque *prio = select_prio(sched_ctx_id, data, task); _starpu_prio_deque_push_back_task(prio, task); } /* And unleash the beast! */ unsigned worker; struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; #ifdef STARPU_NON_BLOCKING_DRIVERS workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { /* Tell each worker is shouldn't sleep any more */ worker = workers->get_next(workers, &it); starpu_bitmap_unset(data->waiters, worker); } #endif STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); #if !defined(STARPU_NON_BLOCKING_DRIVERS) || defined(STARPU_SIMGRID) workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { /* Wake each worker */ worker = workers->get_next(workers, &it); starpu_wake_worker(worker); } #endif } static int push_task_graph_test_policy(struct starpu_task *task) { unsigned sched_ctx_id = task->sched_ctx; struct _starpu_graph_test_policy_data *data = (struct _starpu_graph_test_policy_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); if (!data->computed) { /* Priorities are not computed, leave the task in the bag for now */ starpu_task_list_push_back(&data->fifo->taskq,task); data->fifo->ntasks++; data->fifo->nprocessed++; starpu_push_task_end(task); STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); return 0; } /* Priorities are computed, we can push to execution */ struct _starpu_prio_deque *prio = select_prio(sched_ctx_id, data, task); _starpu_prio_deque_push_back_task(prio, task); starpu_push_task_end(task); /*if there are no tasks block */ /* wake people waiting for a task */ unsigned worker = 0; struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; #ifndef STARPU_NON_BLOCKING_DRIVERS char dowake[STARPU_NMAXWORKERS] = { 0 }; #endif workers->init_iterator(workers, &it); while(workers->has_next_master(workers, &it)) { worker = workers->get_next_master(workers, &it); #ifdef STARPU_NON_BLOCKING_DRIVERS if (!starpu_bitmap_get(data->waiters, worker)) /* This worker is not waiting for a task */ continue; #endif if (prio == &data->prio_cpu && starpu_worker_get_type(worker) != STARPU_CPU_WORKER) /* This worker doesn't pop from the queue we have filled */ continue; if (prio == &data->prio_gpu && starpu_worker_get_type(worker) == STARPU_CPU_WORKER) /* This worker doesn't pop from the queue we have filled */ continue; if (starpu_worker_can_execute_task_first_impl(worker, task, NULL)) { /* It can execute this one, tell him! */ #ifdef STARPU_NON_BLOCKING_DRIVERS starpu_bitmap_unset(data->waiters, worker); /* We really woke at least somebody, no need to wake somebody else */ break; #else dowake[worker] = 1; #endif } } /* Let the task free */ STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); #if !defined(STARPU_NON_BLOCKING_DRIVERS) || defined(STARPU_SIMGRID) /* Now that we have a list of potential workers, try to wake one */ workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); if (dowake[worker]) if (starpu_wake_worker(worker)) break; // wake up a single worker } #endif return 0; } static struct starpu_task *pop_task_graph_test_policy(unsigned sched_ctx_id) { struct starpu_task *chosen_task = NULL; unsigned workerid = starpu_worker_get_id_check(); struct _starpu_graph_test_policy_data *data = (struct _starpu_graph_test_policy_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct _starpu_prio_deque *prio; if (starpu_worker_get_type(workerid) == STARPU_CPU_WORKER) prio = &data->prio_cpu; else prio = &data->prio_gpu; /* block until some event happens */ /* Here helgrind would shout that this is unprotected, this is just an * integer access, and we hold the sched mutex, so we can not miss any * wake up. */ if (!STARPU_RUNNING_ON_VALGRIND && _starpu_prio_deque_is_empty(prio)) return NULL; #ifdef STARPU_NON_BLOCKING_DRIVERS if (!STARPU_RUNNING_ON_VALGRIND && !data->computed) /* Not computed yet */ return NULL; if (!STARPU_RUNNING_ON_VALGRIND && starpu_bitmap_get(data->waiters, workerid)) /* Nobody woke us, avoid bothering the mutex */ return NULL; #endif STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); if (!data->computed) { STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); return NULL; } chosen_task = _starpu_prio_deque_pop_task_for_worker(prio, workerid); if (!chosen_task) /* Tell pushers that we are waiting for tasks for us */ starpu_bitmap_set(data->waiters, workerid); STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); return chosen_task; } struct starpu_sched_policy _starpu_sched_graph_test_policy = { .init_sched = initialize_graph_test_policy, .deinit_sched = deinitialize_graph_test_policy, .do_schedule = do_schedule_graph_test_policy, .push_task = push_task_graph_test_policy, .pop_task = pop_task_graph_test_policy, .policy_name = "graph_test", .policy_description = "test policy for using graphs in scheduling decisions", }; starpu-1.2.3+dfsg/src/sched_policies/helper_mct.c000066400000000000000000000132701320135501600220030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2014, 2016-2017 Université de Bordeaux * Copyright (C) 2013 INRIA * Copyright (C) 2013 Simon Archipoff * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "helper_mct.h" /* Alpha, Beta and Gamma are MCT-specific values, which allows the * user to set more precisely the weight of each computing value. * Beta, for example, controls the weight of communications between * memories for the computation of the best component to choose. */ #define _STARPU_SCHED_ALPHA_DEFAULT 1.0 #define _STARPU_SCHED_BETA_DEFAULT 1.0 #define _STARPU_SCHED_GAMMA_DEFAULT 1000.0 #ifdef STARPU_USE_TOP static void param_modified(struct starpu_top_param* d) { /* Just to show parameter modification. */ _STARPU_MSG("%s has been modified : %f\n", d->name, *(double*) d->value); } #endif /* !STARPU_USE_TOP */ #ifdef STARPU_USE_TOP static const float alpha_minimum=0; static const float alpha_maximum=10.0; static const float beta_minimum=0; static const float beta_maximum=10.0; static const float gamma_minimum=0; static const float gamma_maximum=10000.0; static const float idle_power_minimum=0; static const float idle_power_maximum=10000.0; #endif /* !STARPU_USE_TOP */ struct _starpu_mct_data *starpu_mct_init_parameters(struct starpu_sched_component_mct_data *params) { struct _starpu_mct_data *data; _STARPU_MALLOC(data, sizeof(*data)); if (params) { data->alpha = params->alpha; data->beta = params->beta; data->_gamma = params->_gamma; data->idle_power = params->idle_power; } else { data->alpha = starpu_get_env_float_default("STARPU_SCHED_ALPHA", _STARPU_SCHED_ALPHA_DEFAULT); data->beta = starpu_get_env_float_default("STARPU_SCHED_BETA", _STARPU_SCHED_BETA_DEFAULT); data->_gamma = starpu_get_env_float_default("STARPU_SCHED_GAMMA", _STARPU_SCHED_GAMMA_DEFAULT); data->idle_power = starpu_get_env_float_default("STARPU_IDLE_POWER", 0.0); } #ifdef STARPU_USE_TOP starpu_top_register_parameter_float("MCT_ALPHA", &data->alpha, alpha_minimum, alpha_maximum, param_modified); starpu_top_register_parameter_float("MCT_BETA", &data->beta, beta_minimum, beta_maximum, param_modified); starpu_top_register_parameter_float("MCT_GAMMA", &data->_gamma, gamma_minimum, gamma_maximum, param_modified); starpu_top_register_parameter_float("MCT_IDLE_POWER", &data->idle_power, idle_power_minimum, idle_power_maximum, param_modified); #endif /* !STARPU_USE_TOP */ return data; } /* compute predicted_end by taking into account the case of the predicted transfer and the predicted_end overlap */ static double compute_expected_time(double now, double predicted_end, double predicted_length, double *predicted_transfer) { STARPU_ASSERT(!isnan(now + predicted_end + predicted_length + *predicted_transfer)); STARPU_ASSERT(now >= 0.0 && predicted_end >= 0.0 && predicted_length >= 0.0 && *predicted_transfer >= 0.0); /* TODO: actually schedule transfers */ if (now + *predicted_transfer < predicted_end) { /* We may hope that the transfer will be finished by * the start of the task. */ *predicted_transfer = 0; } else { /* The transfer will not be finished by then, take the * remainder into account */ *predicted_transfer -= (predicted_end - now); } predicted_end += *predicted_transfer; predicted_end += predicted_length; return predicted_end; } double starpu_mct_compute_fitness(struct _starpu_mct_data * d, double exp_end, double min_exp_end, double max_exp_end, double transfer_len, double local_energy) { /* Note: the expected end includes the data transfer duration, which we want to be able to tune separately */ return d->alpha * (exp_end - min_exp_end) + d->beta * transfer_len + d->_gamma * local_energy + d->_gamma * d->idle_power * (exp_end - max_exp_end); } int starpu_mct_compute_expected_times(struct starpu_sched_component *component, struct starpu_task *task, double *estimated_lengths, double *estimated_transfer_length, double *estimated_ends_with_task, double *min_exp_end_with_task, double *max_exp_end_with_task, int *suitable_components) { int nsuitable_components = 0; int i; for(i = 0; i < component->nchildren; i++) { struct starpu_sched_component * c = component->children[i]; if(starpu_sched_component_execute_preds(c, task, estimated_lengths + i)) { if(isnan(estimated_lengths[i])) /* The perfmodel had been purged since the task was pushed * onto the mct component. */ continue; /* Estimated availability of worker */ double estimated_end = c->estimated_end(c); double now = starpu_timing_now(); if (estimated_end < now) estimated_end = now; estimated_transfer_length[i] = starpu_sched_component_transfer_length(c, task); estimated_ends_with_task[i] = compute_expected_time(now, estimated_end, estimated_lengths[i], &estimated_transfer_length[i]); if(estimated_ends_with_task[i] < *min_exp_end_with_task) *min_exp_end_with_task = estimated_ends_with_task[i]; if(estimated_ends_with_task[i] > *max_exp_end_with_task) *max_exp_end_with_task = estimated_ends_with_task[i]; suitable_components[nsuitable_components++] = i; } } return nsuitable_components; } starpu-1.2.3+dfsg/src/sched_policies/helper_mct.h000066400000000000000000000024471320135501600220140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2014, 2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ struct _starpu_mct_data { double alpha; double beta; double _gamma; double idle_power; }; struct _starpu_mct_data *starpu_mct_init_parameters(struct starpu_sched_component_mct_data *params); int starpu_mct_compute_expected_times(struct starpu_sched_component *component, struct starpu_task *task, double *estimated_lengths, double *estimated_transfer_length, double *estimated_ends_with_task, double *min_exp_end_with_task, double *max_exp_end_with_task, int *suitable_components); double starpu_mct_compute_fitness(struct _starpu_mct_data * d, double exp_end, double min_exp_end, double max_exp_end, double transfer_len, double local_energy); starpu-1.2.3+dfsg/src/sched_policies/locality_work_stealing_policy.c000066400000000000000000000514111320135501600260070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Work stealing policy */ #include #include #include #include #include /* * Experimental code for improving data cache locality: * * USE_LOCALITY: * - for each data, we record on which worker it was last accessed with the * locality flag. * * - when pushing a ready task, we choose the worker which has last accessed the * most data of the task with the locality flag. * * USE_LOCALITY_TASKS: * - for each worker, we record the locality data that the task used last (i.e. a rough * estimation of what is contained in the innermost caches). * * - for each worker, we have a hash table associating from a data handle to * all the ready tasks pushed to it that will use it with the locality flag. * * - When fetching a task from a queue, pick a task which has the biggest number * of data estimated to be contained in the cache. */ //#define USE_LOCALITY //#define USE_LOCALITY_TASKS /* Maximum number of recorded locality data per task */ #define MAX_LOCALITY 8 /* Entry for queued_tasks_per_data: records that a queued task is accessing the data with locality flag */ struct locality_entry { UT_hash_handle hh; starpu_data_handle_t data; struct starpu_task *task; }; struct _starpu_lws_data_per_worker { struct _starpu_fifo_taskq *queue_array; int *proxlist; starpu_pthread_mutex_t worker_mutex; int busy; #ifdef USE_LOCALITY_TASKS /* This records the same as queue_array, but hashed by data accessed with locality flag. */ /* FIXME: we record only one task per data, assuming that the access is * RW, and thus only one task is ready to write to it. Do we really need to handle the R case too? */ struct locality_entry *queued_tasks_per_data; /* This records the last data accessed by the worker */ starpu_data_handle_t last_locality[MAX_LOCALITY]; int nlast_locality; #endif }; struct _starpu_lws_data { struct _starpu_lws_data_per_worker *per_worker; unsigned last_pop_worker; unsigned last_push_worker; }; #ifdef STARPU_HAVE_HWLOC /* Return a worker to steal a task from. The worker is selected * according to the proximity list built using the info on te * architecture provided by hwloc */ static int select_victim_neighborhood(unsigned sched_ctx_id, int workerid) { struct _starpu_lws_data *ws = (struct _starpu_lws_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); int nworkers = starpu_sched_ctx_get_nworkers(sched_ctx_id); int i; int neighbor; for(i=0; iper_worker[workerid].proxlist[i]; int ntasks = ws->per_worker[neighbor].queue_array->ntasks; if (ntasks && ws->per_worker[neighbor].busy) return neighbor; } return workerid; } #else /* Return a worker to steal a task from. The worker is selected * in a round-robin fashion */ static int select_victim_round_robin(unsigned sched_ctx_id) { struct _starpu_lws_data *ws = (struct _starpu_lws_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned worker = ws->last_pop_worker; unsigned nworkers; int *workerids; unsigned ntasks; nworkers = starpu_sched_ctx_get_workers_list_raw(sched_ctx_id, &workerids); /* If the worker's queue is empty, let's try * the next ones */ while (1) { ntasks = ws->per_worker[workerids[worker]].queue_array->ntasks; if (ntasks && ws->per_worker[workerids[worker]].busy) break; worker = (worker + 1) % nworkers; if (worker == ws->last_pop_worker) { /* We got back to the first worker, * don't go in infinite loop */ ntasks = 0; break; } } ws->last_pop_worker = (worker + 1) % nworkers; worker = workerids[worker]; if (ntasks) return worker; else return -1; } #endif /** * Return a worker to whom add a task. * Selecting a worker is done in a round-robin fashion. */ static unsigned select_worker_round_robin(struct starpu_task *task, unsigned sched_ctx_id) { struct _starpu_lws_data *ws = (struct _starpu_lws_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned worker; unsigned nworkers; int *workerids; nworkers = starpu_sched_ctx_get_workers_list_raw(sched_ctx_id, &workerids); worker = ws->last_push_worker; do worker = (worker + 1) % nworkers; while (!starpu_worker_can_execute_task_first_impl(workerids[worker], task, NULL)); ws->last_push_worker = worker; return workerids[worker]; } #ifdef USE_LOCALITY /* Select a worker according to the locality of the data of the task to be scheduled */ static unsigned select_worker_locality(struct starpu_task *task, unsigned sched_ctx_id) { struct _starpu_lws_data *ws = (struct _starpu_lws_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); if (nbuffers == 0) return -1; unsigned i, n; unsigned ndata[STARPU_NMAXWORKERS] = { 0 }; int best_worker = -1; unsigned best_ndata = 0; n = 0; for (i = 0; i < nbuffers; i++) if (STARPU_TASK_GET_MODE(task, i) & STARPU_LOCALITY) { starpu_data_handle_t data = STARPU_TASK_GET_HANDLE(task, i); int locality = data->last_locality; if (locality >= 0) ndata[locality]++; n++; } if (n) { /* Some locality buffers, choose worker which has most of them */ struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { int workerid = workers->get_next(workers, &it); if (ndata[workerid] > best_ndata && ws->per_worker[workerid].busy) { best_worker = workerid; best_ndata = ndata[workerid]; } } } return best_worker; } /* Record in the data which worker will handle the task with the locality flag */ static void record_data_locality(struct starpu_task *task, int workerid) { /* Record where in locality data where the task went */ unsigned i; for (i = 0; i < STARPU_TASK_GET_NBUFFERS(task); i++) if (STARPU_TASK_GET_MODE(task, i) & STARPU_LOCALITY) { STARPU_TASK_GET_HANDLE(task, i)->last_locality = workerid; } } #else static void record_data_locality(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, int workerid STARPU_ATTRIBUTE_UNUSED) { } #endif #ifdef USE_LOCALITY_TASKS /* Record in the worker which data it used last with the locality flag */ static void record_worker_locality(struct starpu_task *task, int workerid, unsigned sched_ctx_id) { /* Record where in locality data where the task went */ unsigned i; struct _starpu_lws_data *ws = (struct _starpu_lws_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct _starpu_lws_data_per_worker *data = &ws->per_worker[workerid]; data->nlast_locality = 0; for (i = 0; i < STARPU_TASK_GET_NBUFFERS(task); i++) if (STARPU_TASK_GET_MODE(task, i) & STARPU_LOCALITY) { data->last_locality[data->nlast_locality] = STARPU_TASK_GET_HANDLE(task, i); data->nlast_locality++; if (data->nlast_locality == MAX_LOCALITY) break; } } /* Called when pushing a task to a queue */ static void locality_pushed_task(struct starpu_task *task, int workerid, unsigned sched_ctx_id) { struct _starpu_lws_data *ws = (struct _starpu_lws_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct _starpu_lws_data_per_worker *data = &ws->per_worker[workerid]; unsigned i; for (i = 0; i < STARPU_TASK_GET_NBUFFERS(task); i++) if (STARPU_TASK_GET_MODE(task, i) & STARPU_LOCALITY) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, i); struct locality_entry *entry; HASH_FIND_PTR(data->queued_tasks_per_data, &handle, entry); if (STARPU_LIKELY(!entry)) { _STARPU_MALLOC(entry, sizeof(*entry)); entry->data = handle; entry->task = task; HASH_ADD_PTR(data->queued_tasks_per_data, data, entry); } } } /* Pick a task from workerid's queue, for execution on target */ static struct starpu_task *ws_pick_task(struct _starpu_lws_data *ws, int source, int target) { struct _starpu_lws_data_per_worker *data_source = &ws->per_worker[source]; struct _starpu_lws_data_per_worker *data_target = &ws->per_worker[target]; unsigned i, j, n = data_target->nlast_locality; struct starpu_task *(tasks[MAX_LOCALITY]) = { NULL }, *best_task; int ntasks[MAX_LOCALITY] = { 0 }, best_n; /* Number of locality data for this worker used by this task */ /* Look at the last data accessed by this worker */ STARPU_ASSERT(n < MAX_LOCALITY); for (i = 0; i < n; i++) { starpu_data_handle_t handle = data_target->last_locality[i]; struct locality_entry *entry; HASH_FIND_PTR(data_source->queued_tasks_per_data, &handle, entry); if (entry) { /* Record task */ tasks[i] = entry->task; ntasks[i] = 1; /* And increment counter of the same task */ for (j = 0; j < i; j++) { if (tasks[j] == tasks[i]) { ntasks[j]++; break; } } } } /* Now find the task with most locality data for this worker */ best_n = 0; for (i = 0; i < n; i++) { if (ntasks[i] > best_n) { best_task = tasks[i]; best_n = ntasks[i]; } } if (best_n > 0) { /* found an interesting task, try to pick it! */ if (_starpu_fifo_pop_this_task(data_source->queue_array, target, best_task)) return best_task; } /* Didn't find an interesting task, or couldn't run it :( */ return _starpu_fifo_pop_task(data_source->queue_array, target); } /* Called when popping a task from a queue */ static void locality_popped_task(struct starpu_task *task, int workerid, unsigned sched_ctx_id) { struct _starpu_lws_data *ws = (struct _starpu_lws_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct _starpu_lws_data_per_worker *data = &ws->per_worker[workerid]; unsigned i; for (i = 0; i < STARPU_TASK_GET_NBUFFERS(task); i++) if (STARPU_TASK_GET_MODE(task, i) & STARPU_LOCALITY) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, i); struct locality_entry *entry; HASH_FIND_PTR(data->queued_tasks_per_data, &handle, entry); if (STARPU_LIKELY(entry)) { if (entry->task == task) { HASH_DEL(data->queued_tasks_per_data, entry); free(entry); } } } } #else static void record_worker_locality(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, int workerid STARPU_ATTRIBUTE_UNUSED, unsigned sched_ctx_id STARPU_ATTRIBUTE_UNUSED) { } /* Called when pushing a task to a queue */ static void locality_pushed_task(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, int workerid STARPU_ATTRIBUTE_UNUSED, unsigned sched_ctx_id STARPU_ATTRIBUTE_UNUSED) { } /* Pick a task from workerid's queue, for execution on target */ static struct starpu_task *ws_pick_task(struct _starpu_lws_data *ws, int source, int target) { return _starpu_fifo_pop_task(ws->per_worker[source].queue_array, target); } /* Called when popping a task from a queue */ static void locality_popped_task(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, int workerid STARPU_ATTRIBUTE_UNUSED, unsigned sched_ctx_id STARPU_ATTRIBUTE_UNUSED) { } #endif /** * Return a worker from which a task can be stolen. */ static inline int select_victim(unsigned sched_ctx_id, int workerid STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_HAVE_HWLOC return select_victim_neighborhood(sched_ctx_id, workerid); #else return select_victim_round_robin(sched_ctx_id); #endif } /** * Return a worker on whose queue a task can be pushed. This is only * needed when the push is done by the master */ static inline unsigned select_worker(struct starpu_task *task, unsigned sched_ctx_id) { return select_worker_round_robin(task, sched_ctx_id); } static struct starpu_task *lws_pop_task(unsigned sched_ctx_id) { struct _starpu_lws_data *ws = (struct _starpu_lws_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct starpu_task *task = NULL; unsigned workerid = starpu_worker_get_id_check(); ws->per_worker[workerid].busy = 0; #ifdef STARPU_NON_BLOCKING_DRIVERS if (STARPU_RUNNING_ON_VALGRIND || !_starpu_fifo_empty(ws->per_worker[workerid].queue_array)) #endif { STARPU_PTHREAD_MUTEX_LOCK(&ws->per_worker[workerid].worker_mutex); task = ws_pick_task(ws, workerid, workerid); if (task) locality_popped_task(task, workerid, sched_ctx_id); STARPU_PTHREAD_MUTEX_UNLOCK(&ws->per_worker[workerid].worker_mutex); } if (task) { /* there was a local task */ /* printf("Own task!%d\n",workerid); */ ws->per_worker[workerid].busy = 1; return task; } starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond); /* While stealing, relieve mutex used to synchronize with pushers */ STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(sched_mutex); /* we need to steal someone's job */ int victim = select_victim(sched_ctx_id, workerid); if (victim == -1) { STARPU_PTHREAD_MUTEX_LOCK_SCHED(sched_mutex); return NULL; } if (STARPU_PTHREAD_MUTEX_TRYLOCK(&ws->per_worker[victim].worker_mutex)) { /* victim is busy, don't bother it, come back later */ STARPU_PTHREAD_MUTEX_LOCK_SCHED(sched_mutex); return NULL; } if (ws->per_worker[victim].queue_array != NULL && ws->per_worker[victim].queue_array->ntasks > 0) { task = ws_pick_task(ws, victim, workerid); } if (task) { _STARPU_TRACE_WORK_STEALING(workerid, victim); _STARPU_TASK_BREAK_ON(task, sched); record_data_locality(task, workerid); record_worker_locality(task, workerid, sched_ctx_id); locality_popped_task(task, victim, sched_ctx_id); } STARPU_PTHREAD_MUTEX_UNLOCK(&ws->per_worker[victim].worker_mutex); /* Done with stealing, resynchronize with core */ STARPU_PTHREAD_MUTEX_LOCK_SCHED(sched_mutex); #ifndef STARPU_NON_BLOCKING_DRIVERS /* While stealing, perhaps somebody actually give us a task, don't miss * the opportunity to take it before going to sleep. */ if (!task) { STARPU_PTHREAD_MUTEX_LOCK(&ws->per_worker[workerid].worker_mutex); task = ws_pick_task(ws, workerid, workerid); if (task) locality_popped_task(task, workerid, sched_ctx_id); STARPU_PTHREAD_MUTEX_UNLOCK(&ws->per_worker[workerid].worker_mutex); } #endif ws->per_worker[workerid].busy = !!task; return task; } static int lws_push_task(struct starpu_task *task) { unsigned sched_ctx_id = task->sched_ctx; struct _starpu_lws_data *ws = (struct _starpu_lws_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); int workerid = -1; #ifdef USE_LOCALITY workerid = select_worker_locality(task, sched_ctx_id); #endif if (workerid == -1) workerid = starpu_worker_get_id(); /* If the current thread is not a worker but * the main thread (-1) or the current worker is not in the target * context, we find the better one to put task on its queue */ if (workerid == -1 || !starpu_sched_ctx_contains_worker(workerid, sched_ctx_id) || !starpu_worker_can_execute_task_first_impl(workerid, task, NULL)) workerid = select_worker(task, sched_ctx_id); record_data_locality(task, workerid); /* int workerid = starpu_worker_get_id(); */ /* print_neighborhood(sched_ctx_id, 0); */ starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond); STARPU_PTHREAD_MUTEX_LOCK_SCHED(sched_mutex); STARPU_AYU_ADDTOTASKQUEUE(_starpu_get_job_associated_to_task(task)->job_id, workerid); STARPU_PTHREAD_MUTEX_LOCK(&ws->per_worker[workerid].worker_mutex); _STARPU_TASK_BREAK_ON(task, sched); _starpu_fifo_push_task(ws->per_worker[workerid].queue_array, task); locality_pushed_task(task, workerid, sched_ctx_id); STARPU_PTHREAD_MUTEX_UNLOCK(&ws->per_worker[workerid].worker_mutex); starpu_push_task_end(task); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(sched_mutex); #if !defined(STARPU_NON_BLOCKING_DRIVERS) || defined(STARPU_SIMGRID) /* TODO: implement fine-grain signaling, similar to what eager does */ struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) starpu_wake_worker(workers->get_next(workers, &it)); #endif return 0; } static void lws_add_workers(unsigned sched_ctx_id, int *workerids,unsigned nworkers) { struct _starpu_lws_data *ws = (struct _starpu_lws_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned i; int workerid; for (i = 0; i < nworkers; i++) { workerid = workerids[i]; starpu_sched_ctx_worker_shares_tasks_lists(workerid, sched_ctx_id); ws->per_worker[workerid].queue_array = _starpu_create_fifo(); /* Tell helgrid that we are fine with getting outdated values, * this is just an estimation */ STARPU_HG_DISABLE_CHECKING(ws->per_worker[workerid].queue_array->ntasks); ws->per_worker[workerid].queue_array->nprocessed = 0; ws->per_worker[workerid].queue_array->ntasks = 0; STARPU_PTHREAD_MUTEX_INIT(&ws->per_worker[workerid].worker_mutex, NULL); ws->per_worker[workerid].busy = 0; STARPU_HG_DISABLE_CHECKING(ws->per_worker[workerid].busy); } #ifdef STARPU_HAVE_HWLOC /* Build a proximity list for every worker. It is cheaper to * build this once and then use it for popping tasks rather * than traversing the hwloc tree every time a task must be * stolen */ struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_tree *tree = (struct starpu_tree*)workers->collection_private; /* get the complete list of workers (not just the added one) and rebuild the proxlists */ nworkers = starpu_sched_ctx_get_workers_list_raw(sched_ctx_id, &workerids); for (i = 0; i < nworkers; i++) { int bindid; struct starpu_tree *neighbour = NULL; struct starpu_sched_ctx_iterator it; workerid = workerids[i]; if (ws->per_worker[workerid].proxlist == NULL) _STARPU_MALLOC(ws->per_worker[workerid].proxlist, STARPU_NMAXWORKERS*sizeof(int)); workers->init_iterator(workers, &it); bindid = starpu_worker_get_bindid(workerid); it.value = starpu_tree_get(tree, bindid); int cnt = 0; for(;;) { neighbour = (struct starpu_tree*)it.value; int *neigh_workerids; int neigh_nworkers = _starpu_bindid_get_workerids(neighbour->id, &neigh_workerids); int w; for(w = 0; w < neigh_nworkers; w++) { if(!it.visited[neigh_workerids[w]] && workers->present[neigh_workerids[w]]) { ws->per_worker[workerid].proxlist[cnt++] = neigh_workerids[w]; it.visited[neigh_workerids[w]] = 1; } } if(!workers->has_next(workers, &it)) break; it.value = it.possible_value; it.possible_value = NULL; } } #endif } static void lws_remove_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers) { struct _starpu_lws_data *ws = (struct _starpu_lws_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned i; int workerid; for (i = 0; i < nworkers; i++) { workerid = workerids[i]; _starpu_destroy_fifo(ws->per_worker[workerid].queue_array); #ifdef STARPU_HAVE_HWLOC free(ws->per_worker[workerid].proxlist); ws->per_worker[workerid].proxlist = NULL; #endif STARPU_PTHREAD_MUTEX_DESTROY(&ws->per_worker[workerid].worker_mutex); } } static void lws_initialize_policy(unsigned sched_ctx_id) { #ifdef STARPU_HAVE_HWLOC starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_TREE); #else starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); #endif struct _starpu_lws_data *ws; _STARPU_MALLOC(ws, sizeof(struct _starpu_lws_data)); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)ws); ws->last_pop_worker = 0; ws->last_push_worker = 0; STARPU_HG_DISABLE_CHECKING(ws->last_pop_worker); STARPU_HG_DISABLE_CHECKING(ws->last_push_worker); /* unsigned nw = starpu_sched_ctx_get_nworkers(sched_ctx_id); */ unsigned nw = starpu_worker_get_count(); _STARPU_CALLOC(ws->per_worker, nw, sizeof(struct _starpu_lws_data_per_worker)); } static void lws_deinit_policy(unsigned sched_ctx_id) { struct _starpu_lws_data *ws = (struct _starpu_lws_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); free(ws->per_worker); free(ws); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); } struct starpu_sched_policy _starpu_sched_lws_policy = { .init_sched = lws_initialize_policy, .deinit_sched = lws_deinit_policy, .add_workers = lws_add_workers, .remove_workers = lws_remove_workers, .push_task = lws_push_task, .pop_task = lws_pop_task, .pre_exec_hook = NULL, .post_exec_hook = NULL, .pop_every_task = NULL, .policy_name = "lws", .policy_description = "locality work stealing" }; starpu-1.2.3+dfsg/src/sched_policies/modular_eager.c000066400000000000000000000050661320135501600224730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 INRIA * Copyright (C) 2013 Simon Archipoff * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include static void initialize_eager_center_policy(unsigned sched_ctx_id) { _STARPU_DISP("Warning: you are running the default modular-eager scheduler, which is not a very smart scheduler. Make sure to read the StarPU documentation about adding performance models in order to be able to use the modular-heft scheduler instead.\n"); struct starpu_sched_tree *t; struct starpu_sched_component * eager_component; starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); t = starpu_sched_tree_create(sched_ctx_id); t->root = starpu_sched_component_fifo_create(t, NULL); eager_component = starpu_sched_component_eager_create(t, NULL); starpu_sched_component_connect(t->root, eager_component); unsigned i; for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++) starpu_sched_component_connect(eager_component, starpu_sched_component_worker_get(sched_ctx_id, i)); starpu_sched_tree_update_workers(t); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)t); } static void deinitialize_eager_center_policy(unsigned sched_ctx_id) { struct starpu_sched_tree *tree = (struct starpu_sched_tree*)starpu_sched_ctx_get_policy_data(sched_ctx_id); starpu_sched_tree_destroy(tree); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_eager_policy = { .init_sched = initialize_eager_center_policy, .deinit_sched = deinitialize_eager_center_policy, .add_workers = starpu_sched_tree_add_workers, .remove_workers = starpu_sched_tree_remove_workers, .push_task = starpu_sched_tree_push_task, .pop_task = starpu_sched_tree_pop_task, .pre_exec_hook = starpu_sched_component_worker_pre_exec_hook, .post_exec_hook = starpu_sched_component_worker_post_exec_hook, .pop_every_task = NULL, .policy_name = "modular-eager", .policy_description = "eager modular policy" }; starpu-1.2.3+dfsg/src/sched_policies/modular_eager_prefetching.c000066400000000000000000000064621320135501600250520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 INRIA * Copyright (C) 2013 Simon Archipoff * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #define _STARPU_SCHED_NTASKS_THRESHOLD_DEFAULT 2 #define _STARPU_SCHED_EXP_LEN_THRESHOLD_DEFAULT 1000000000.0 static void initialize_eager_prefetching_center_policy(unsigned sched_ctx_id) { _STARPU_DISP("Warning: you are running the default modular-eager-prefetching scheduler, which is not a very smart scheduler. Make sure to read the StarPU documentation about adding performance models in order to be able to use the modular-heft scheduler instead.\n"); struct starpu_sched_tree *t; struct starpu_sched_component * eager_component; starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); t = starpu_sched_tree_create(sched_ctx_id); t->root = starpu_sched_component_fifo_create(t, NULL); eager_component = starpu_sched_component_eager_create(t, NULL); starpu_sched_component_connect(t->root, eager_component); struct starpu_sched_component_fifo_data fifo_data = { .ntasks_threshold = starpu_get_env_number_default("STARPU_NTASKS_THRESHOLD", _STARPU_SCHED_NTASKS_THRESHOLD_DEFAULT), .exp_len_threshold = starpu_get_env_float_default("STARPU_EXP_LEN_THRESHOLD", _STARPU_SCHED_EXP_LEN_THRESHOLD_DEFAULT), }; unsigned i; for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++) { struct starpu_sched_component * worker_component = starpu_sched_component_worker_get(sched_ctx_id, i); struct starpu_sched_component * fifo_component = starpu_sched_component_fifo_create(t, &fifo_data); starpu_sched_component_connect(fifo_component, worker_component); starpu_sched_component_connect(eager_component, fifo_component); } starpu_sched_tree_update_workers(t); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)t); } static void deinitialize_eager_prefetching_center_policy(unsigned sched_ctx_id) { struct starpu_sched_tree *tree = (struct starpu_sched_tree*)starpu_sched_ctx_get_policy_data(sched_ctx_id); starpu_sched_tree_destroy(tree); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_eager_prefetching_policy = { .init_sched = initialize_eager_prefetching_center_policy, .deinit_sched = deinitialize_eager_prefetching_center_policy, .add_workers = starpu_sched_tree_add_workers, .remove_workers = starpu_sched_tree_remove_workers, .push_task = starpu_sched_tree_push_task, .pop_task = starpu_sched_tree_pop_task, .pre_exec_hook = starpu_sched_component_worker_pre_exec_hook, .post_exec_hook = starpu_sched_component_worker_post_exec_hook, .pop_every_task = NULL, .policy_name = "modular-eager-prefetching", .policy_description = "eager with prefetching modular policy" }; starpu-1.2.3+dfsg/src/sched_policies/modular_heft.c000066400000000000000000000146621320135501600223400ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2015, 2017 Université de Bordeaux * Copyright (C) 2013 INRIA * Copyright (C) 2013 Simon Archipoff * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include /* The two thresolds concerns the prio components, which contains queues * who can handle the priority of StarPU tasks. You can tune your * scheduling by benching those values and choose which one is the * best for your current application. * The current value of the ntasks_threshold is the best we found * so far across several types of applications (cholesky, LU, stencil). */ #define _STARPU_SCHED_NTASKS_THRESHOLD_DEFAULT 30 #define _STARPU_SCHED_EXP_LEN_THRESHOLD_DEFAULT 1000000000.0 static void initialize_heft_center_policy(unsigned sched_ctx_id) { starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); /* The application may use any integer */ if (starpu_sched_ctx_min_priority_is_set(sched_ctx_id) == 0) starpu_sched_ctx_set_min_priority(sched_ctx_id, INT_MIN); if (starpu_sched_ctx_max_priority_is_set(sched_ctx_id) == 0) starpu_sched_ctx_set_max_priority(sched_ctx_id, INT_MAX); /* The scheduling strategy look like this : * * | * window_component * | * mct_component <--push-- perfmodel_select_component --push--> eager_component * | | * | | * >----------------------------------------------------< * | | * best_impl_component best_impl_component * | | * prio_component prio_component * | | * worker_component worker_component * * A window contain the tasks that failed to be pushed, so as when the prio_components reclaim * tasks by calling can_push to their parent (classically, just after a successful pop have * been made by its associated worker_component), this call goes up to the window_component which * pops a task from its local queue and try to schedule it by pushing it to the * decision_component. * Finally, the task will be pushed to the prio_component which is the direct * parent in the tree of the worker_component the task has been scheduled on. This * component will push the task on its local queue if no one of the two thresholds * have been reached for it, or send a push_error signal to its parent. */ struct starpu_sched_tree * t = starpu_sched_tree_create(sched_ctx_id); struct starpu_sched_component * window_component = starpu_sched_component_prio_create(t, NULL); struct starpu_sched_component * perfmodel_component = starpu_sched_component_mct_create(t, NULL); struct starpu_sched_component * no_perfmodel_component = starpu_sched_component_eager_create(t, NULL); struct starpu_sched_component * calibrator_component = starpu_sched_component_eager_calibration_create(t, NULL); struct starpu_sched_component_perfmodel_select_data perfmodel_select_data = { .calibrator_component = calibrator_component, .no_perfmodel_component = no_perfmodel_component, .perfmodel_component = perfmodel_component, }; struct starpu_sched_component * perfmodel_select_component = starpu_sched_component_perfmodel_select_create(t, &perfmodel_select_data); t->root = window_component; starpu_sched_component_connect(window_component, perfmodel_select_component); starpu_sched_component_connect(perfmodel_select_component, perfmodel_component); starpu_sched_component_connect(perfmodel_select_component, calibrator_component); starpu_sched_component_connect(perfmodel_select_component, no_perfmodel_component); struct starpu_sched_component_prio_data prio_data = { .ntasks_threshold = starpu_get_env_number_default("STARPU_NTASKS_THRESHOLD", _STARPU_SCHED_NTASKS_THRESHOLD_DEFAULT), .exp_len_threshold = starpu_get_env_float_default("STARPU_EXP_LEN_THRESHOLD", _STARPU_SCHED_EXP_LEN_THRESHOLD_DEFAULT), }; unsigned i; for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++) { struct starpu_sched_component * worker_component = starpu_sched_component_worker_get(sched_ctx_id, i); struct starpu_sched_component * prio_component = starpu_sched_component_prio_create(t, &prio_data); struct starpu_sched_component * impl_component = starpu_sched_component_best_implementation_create(t, NULL); starpu_sched_component_connect(prio_component, worker_component); starpu_sched_component_connect(impl_component, prio_component); starpu_sched_component_connect(perfmodel_component, impl_component); starpu_sched_component_connect(no_perfmodel_component, impl_component); starpu_sched_component_connect(calibrator_component, impl_component); } starpu_sched_tree_update_workers(t); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)t); } static void deinitialize_heft_center_policy(unsigned sched_ctx_id) { struct starpu_sched_tree *t = (struct starpu_sched_tree*)starpu_sched_ctx_get_policy_data(sched_ctx_id); starpu_sched_tree_destroy(t); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_heft_policy = { .init_sched = initialize_heft_center_policy, .deinit_sched = deinitialize_heft_center_policy, .add_workers = starpu_sched_tree_add_workers, .remove_workers = starpu_sched_tree_remove_workers, .push_task = starpu_sched_tree_push_task, .pop_task = starpu_sched_tree_pop_task, .pre_exec_hook = starpu_sched_component_worker_pre_exec_hook, .post_exec_hook = starpu_sched_component_worker_post_exec_hook, .pop_every_task = NULL, .policy_name = "modular-heft", .policy_description = "heft modular policy" }; starpu-1.2.3+dfsg/src/sched_policies/modular_heft2.c000066400000000000000000000146731320135501600224240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2015, 2017 Université de Bordeaux * Copyright (C) 2013 INRIA * Copyright (C) 2013 Simon Archipoff * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include /* The two thresolds concerns the prio components, which contains queues * who can handle the priority of StarPU tasks. You can tune your * scheduling by benching those values and choose which one is the * best for your current application. * The current value of the ntasks_threshold is the best we found * so far across several types of applications (cholesky, LU, stencil). */ #define _STARPU_SCHED_NTASKS_THRESHOLD_DEFAULT 30 #define _STARPU_SCHED_EXP_LEN_THRESHOLD_DEFAULT 1000000000.0 static void initialize_heft2_center_policy(unsigned sched_ctx_id) { starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); /* The application may use any integer */ if (starpu_sched_ctx_min_priority_is_set(sched_ctx_id) == 0) starpu_sched_ctx_set_min_priority(sched_ctx_id, INT_MIN); if (starpu_sched_ctx_max_priority_is_set(sched_ctx_id) == 0) starpu_sched_ctx_set_max_priority(sched_ctx_id, INT_MAX); /* The scheduling strategy look like this : * * | * window_component * | * heft_component <--push-- perfmodel_select_component --push--> eager_component * | | * | | * >----------------------------------------------------< * | | * best_impl_component best_impl_component * | | * prio_component prio_component * | | * worker_component worker_component * * A window contain the tasks that failed to be pushed, so as when the prio_components reclaim * tasks by calling can_push to their parent (classically, just after a successful pop have * been made by its associated worker_component), this call goes up to the window_component which * pops a task from its local queue and try to schedule it by pushing it to the * decision_component. * Finally, the task will be pushed to the prio_component which is the direct * parent in the tree of the worker_component the task has been scheduled on. This * component will push the task on its local queue if no one of the two thresholds * have been reached for it, or send a push_error signal to its parent. */ struct starpu_sched_tree * t = starpu_sched_tree_create(sched_ctx_id); struct starpu_sched_component * window_component = starpu_sched_component_prio_create(t, NULL); struct starpu_sched_component * perfmodel_component = starpu_sched_component_heft_create(t, NULL); struct starpu_sched_component * no_perfmodel_component = starpu_sched_component_eager_create(t, NULL); struct starpu_sched_component * calibrator_component = starpu_sched_component_eager_calibration_create(t, NULL); struct starpu_sched_component_perfmodel_select_data perfmodel_select_data = { .calibrator_component = calibrator_component, .no_perfmodel_component = no_perfmodel_component, .perfmodel_component = perfmodel_component, }; struct starpu_sched_component * perfmodel_select_component = starpu_sched_component_perfmodel_select_create(t, &perfmodel_select_data); t->root = window_component; starpu_sched_component_connect(window_component, perfmodel_select_component); starpu_sched_component_connect(perfmodel_select_component, perfmodel_component); starpu_sched_component_connect(perfmodel_select_component, calibrator_component); starpu_sched_component_connect(perfmodel_select_component, no_perfmodel_component); struct starpu_sched_component_prio_data prio_data = { .ntasks_threshold = starpu_get_env_number_default("STARPU_NTASKS_THRESHOLD", _STARPU_SCHED_NTASKS_THRESHOLD_DEFAULT), .exp_len_threshold = starpu_get_env_float_default("STARPU_EXP_LEN_THRESHOLD", _STARPU_SCHED_EXP_LEN_THRESHOLD_DEFAULT), }; unsigned i; for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++) { struct starpu_sched_component * worker_component = starpu_sched_component_worker_get(sched_ctx_id, i); struct starpu_sched_component * prio_component = starpu_sched_component_prio_create(t, &prio_data); struct starpu_sched_component * impl_component = starpu_sched_component_best_implementation_create(t, NULL); starpu_sched_component_connect(prio_component, worker_component); starpu_sched_component_connect(impl_component, prio_component); starpu_sched_component_connect(perfmodel_component, impl_component); starpu_sched_component_connect(no_perfmodel_component, impl_component); starpu_sched_component_connect(calibrator_component, impl_component); } starpu_sched_tree_update_workers(t); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)t); } static void deinitialize_heft2_center_policy(unsigned sched_ctx_id) { struct starpu_sched_tree *t = (struct starpu_sched_tree*)starpu_sched_ctx_get_policy_data(sched_ctx_id); starpu_sched_tree_destroy(t); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_heft2_policy = { .init_sched = initialize_heft2_center_policy, .deinit_sched = deinitialize_heft2_center_policy, .add_workers = starpu_sched_tree_add_workers, .remove_workers = starpu_sched_tree_remove_workers, .push_task = starpu_sched_tree_push_task, .pop_task = starpu_sched_tree_pop_task, .pre_exec_hook = starpu_sched_component_worker_pre_exec_hook, .post_exec_hook = starpu_sched_component_worker_post_exec_hook, .pop_every_task = NULL, .policy_name = "modular-heft2", .policy_description = "heft modular2 policy" }; starpu-1.2.3+dfsg/src/sched_policies/modular_heft_prio.c000066400000000000000000000174511320135501600233700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2015, 2017 Université de Bordeaux * Copyright (C) 2013 INRIA * Copyright (C) 2013 Simon Archipoff * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include /* The two thresolds concerns the prio components, which contains queues * who can handle the priority of StarPU tasks. You can tune your * scheduling by benching those values and choose which one is the * best for your current application. * The current value of the ntasks_threshold is the best we found * so far across several types of applications (cholesky, LU, stencil). */ #define _STARPU_SCHED_NTASKS_THRESHOLD_DEFAULT 30 #define _STARPU_SCHED_EXP_LEN_THRESHOLD_DEFAULT 1000000000.0 static void initialize_heft_prio_policy(unsigned sched_ctx_id) { unsigned i, j, n, nnodes; /* First count how many memory nodes really have workers */ n = starpu_memory_nodes_get_count(); nnodes = 0; for(i = 0; i < n; i++) { for(j = 0; j < starpu_worker_get_count() + starpu_combined_worker_get_count(); j++) if (starpu_worker_get_memory_node(j) == i) break; if (j >= starpu_worker_get_count() + starpu_combined_worker_get_count()) /* Don't create a component for this memory node with no worker */ continue; nnodes++; } if (nnodes == 1) { /* Just one memory node, we don't actually need MCT etc., just * initialize a prio scheduler */ return starpu_initialize_prio_center_policy(sched_ctx_id); } starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); /* The application may use any integer */ if (starpu_sched_ctx_min_priority_is_set(sched_ctx_id) == 0) starpu_sched_ctx_set_min_priority(sched_ctx_id, INT_MIN); if (starpu_sched_ctx_max_priority_is_set(sched_ctx_id) == 0) starpu_sched_ctx_set_max_priority(sched_ctx_id, INT_MAX); /* The scheduling strategy look like this : * * | * window_component * | * mct_component <--push-- perfmodel_select_component --push--> eager_component * | | | | * prio prio prio | * | | | | * eager eager eager | * | | | | * >--------------------------------------------------------------< * | | * best_impl_component best_impl_component * | | * worker_component worker_component * * A window contain the tasks that failed to be pushed, so as when the prio_components reclaim * tasks by calling can_push to their parent (classically, just after a successful pop have * been made by its associated worker_component), this call goes up to the window_component which * pops a task from its local queue and try to schedule it by pushing it to the * decision_component. * Finally, the task will be pushed to the prio_component which is the direct * parent in the tree of the worker_component the task has been scheduled on. This * component will push the task on its local queue if no one of the two thresholds * have been reached for it, or send a push_error signal to its parent. */ struct starpu_sched_tree * t = starpu_sched_tree_create(sched_ctx_id); struct starpu_sched_component * window_component = starpu_sched_component_prio_create(t, NULL); struct starpu_sched_component * perfmodel_component = starpu_sched_component_mct_create(t, NULL); struct starpu_sched_component * no_perfmodel_component = starpu_sched_component_eager_create(t, NULL); struct starpu_sched_component * calibrator_component = starpu_sched_component_eager_calibration_create(t, NULL); struct starpu_sched_component_perfmodel_select_data perfmodel_select_data = { .calibrator_component = calibrator_component, .no_perfmodel_component = no_perfmodel_component, .perfmodel_component = perfmodel_component, }; struct starpu_sched_component * perfmodel_select_component = starpu_sched_component_perfmodel_select_create(t, &perfmodel_select_data); t->root = window_component; starpu_sched_component_connect(window_component, perfmodel_select_component); starpu_sched_component_connect(perfmodel_select_component, perfmodel_component); starpu_sched_component_connect(perfmodel_select_component, calibrator_component); starpu_sched_component_connect(perfmodel_select_component, no_perfmodel_component); struct starpu_sched_component_prio_data prio_data = { .ntasks_threshold = starpu_get_env_number_default("STARPU_NTASKS_THRESHOLD", _STARPU_SCHED_NTASKS_THRESHOLD_DEFAULT), .exp_len_threshold = starpu_get_env_float_default("STARPU_EXP_LEN_THRESHOLD", _STARPU_SCHED_EXP_LEN_THRESHOLD_DEFAULT), }; struct starpu_sched_component * eagers[starpu_memory_nodes_get_count()]; /* Create one fifo+eager component pair per memory node, below mct */ for(i = 0; i < starpu_memory_nodes_get_count(); i++) { for(j = 0; j < starpu_worker_get_count() + starpu_combined_worker_get_count(); j++) if (starpu_worker_get_memory_node(j) == i) break; if (j == starpu_worker_get_count() + starpu_combined_worker_get_count()) /* Don't create a component for this memory node with no worker */ continue; struct starpu_sched_component * prio_component = starpu_sched_component_prio_create(t, &prio_data); eagers[i] = starpu_sched_component_eager_create(t, NULL); starpu_sched_component_connect(perfmodel_component, prio_component); starpu_sched_component_connect(prio_component, eagers[i]); } for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++) { struct starpu_sched_component * worker_component = starpu_sched_component_worker_get(sched_ctx_id, i); struct starpu_sched_component * impl_component = starpu_sched_component_best_implementation_create(t, NULL); starpu_sched_component_connect(eagers[starpu_worker_get_memory_node(i)], impl_component); starpu_sched_component_connect(no_perfmodel_component, impl_component); starpu_sched_component_connect(calibrator_component, impl_component); starpu_sched_component_connect(impl_component, worker_component); } starpu_sched_tree_update_workers(t); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)t); } static void deinitialize_heft_prio_policy(unsigned sched_ctx_id) { struct starpu_sched_tree *t = (struct starpu_sched_tree*)starpu_sched_ctx_get_policy_data(sched_ctx_id); starpu_sched_tree_destroy(t); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_heft_prio_policy = { .init_sched = initialize_heft_prio_policy, .deinit_sched = deinitialize_heft_prio_policy, .add_workers = starpu_sched_tree_add_workers, .remove_workers = starpu_sched_tree_remove_workers, .push_task = starpu_sched_tree_push_task, .pop_task = starpu_sched_tree_pop_task, .pre_exec_hook = starpu_sched_component_worker_pre_exec_hook, .post_exec_hook = starpu_sched_component_worker_post_exec_hook, .pop_every_task = NULL, .policy_name = "modular-heft-prio", .policy_description = "heft+prio modular policy", }; starpu-1.2.3+dfsg/src/sched_policies/modular_prio.c000066400000000000000000000051011320135501600223470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include void starpu_initialize_prio_center_policy(unsigned sched_ctx_id) { struct starpu_sched_tree *t; struct starpu_sched_component * eager_component; starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); t = starpu_sched_tree_create(sched_ctx_id); t->root = starpu_sched_component_prio_create(t, NULL); eager_component = starpu_sched_component_eager_create(t, NULL); starpu_sched_component_connect(t->root, eager_component); unsigned i; for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++) starpu_sched_component_connect(eager_component, starpu_sched_component_worker_get(sched_ctx_id, i)); starpu_sched_tree_update_workers(t); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)t); /* The application may use any integer */ if (starpu_sched_ctx_min_priority_is_set(sched_ctx_id) == 0) starpu_sched_ctx_set_min_priority(sched_ctx_id, INT_MIN); if (starpu_sched_ctx_max_priority_is_set(sched_ctx_id) == 0) starpu_sched_ctx_set_max_priority(sched_ctx_id, INT_MAX); } static void deinitialize_prio_center_policy(unsigned sched_ctx_id) { struct starpu_sched_tree *tree = (struct starpu_sched_tree*)starpu_sched_ctx_get_policy_data(sched_ctx_id); starpu_sched_tree_destroy(tree); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_prio_policy = { .init_sched = starpu_initialize_prio_center_policy, .deinit_sched = deinitialize_prio_center_policy, .add_workers = starpu_sched_tree_add_workers, .remove_workers = starpu_sched_tree_remove_workers, .push_task = starpu_sched_tree_push_task, .pop_task = starpu_sched_tree_pop_task, .pre_exec_hook = starpu_sched_component_worker_pre_exec_hook, .post_exec_hook = starpu_sched_component_worker_post_exec_hook, .pop_every_task = NULL, .policy_name = "modular-prio", .policy_description = "prio modular policy" }; starpu-1.2.3+dfsg/src/sched_policies/modular_prio_prefetching.c000066400000000000000000000064451320135501600247410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #define _STARPU_SCHED_NTASKS_THRESHOLD_DEFAULT 4 #define _STARPU_SCHED_EXP_LEN_THRESHOLD_DEFAULT 1000000000.0 static void initialize_prio_prefetching_center_policy(unsigned sched_ctx_id) { struct starpu_sched_tree *t; struct starpu_sched_component * eager_component; starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); t = starpu_sched_tree_create(sched_ctx_id); t->root = starpu_sched_component_prio_create(t, NULL); eager_component = starpu_sched_component_eager_create(t, NULL); starpu_sched_component_connect(t->root, eager_component); struct starpu_sched_component_prio_data prio_data = { .ntasks_threshold = starpu_get_env_number_default("STARPU_NTASKS_THRESHOLD", _STARPU_SCHED_NTASKS_THRESHOLD_DEFAULT), .exp_len_threshold = starpu_get_env_float_default("STARPU_EXP_LEN_THRESHOLD", _STARPU_SCHED_EXP_LEN_THRESHOLD_DEFAULT), }; unsigned i; for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++) { struct starpu_sched_component * worker_component = starpu_sched_component_worker_get(sched_ctx_id, i); struct starpu_sched_component * prio_component = starpu_sched_component_prio_create(t, &prio_data); starpu_sched_component_connect(prio_component, worker_component); starpu_sched_component_connect(eager_component, prio_component); } starpu_sched_tree_update_workers(t); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)t); /* The application may use any integer */ if (starpu_sched_ctx_min_priority_is_set(sched_ctx_id) == 0) starpu_sched_ctx_set_min_priority(sched_ctx_id, INT_MIN); if (starpu_sched_ctx_max_priority_is_set(sched_ctx_id) == 0) starpu_sched_ctx_set_max_priority(sched_ctx_id, INT_MAX); } static void deinitialize_prio_prefetching_center_policy(unsigned sched_ctx_id) { struct starpu_sched_tree *tree = (struct starpu_sched_tree*)starpu_sched_ctx_get_policy_data(sched_ctx_id); starpu_sched_tree_destroy(tree); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_prio_prefetching_policy = { .init_sched = initialize_prio_prefetching_center_policy, .deinit_sched = deinitialize_prio_prefetching_center_policy, .add_workers = starpu_sched_tree_add_workers, .remove_workers = starpu_sched_tree_remove_workers, .push_task = starpu_sched_tree_push_task, .pop_task = starpu_sched_tree_pop_task, .pre_exec_hook = starpu_sched_component_worker_pre_exec_hook, .post_exec_hook = starpu_sched_component_worker_post_exec_hook, .pop_every_task = NULL, .policy_name = "modular-prio-prefetching", .policy_description = "prio prefetching modular policy" }; starpu-1.2.3+dfsg/src/sched_policies/modular_random.c000066400000000000000000000103651320135501600226660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 INRIA * Copyright (C) 2013 Simon Archipoff * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include /* Random scheduler with a fifo queue for its scheduling window */ static void initialize_random_fifo_center_policy(unsigned sched_ctx_id) { struct starpu_sched_tree *t; struct starpu_sched_component * random_component; starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); t = starpu_sched_tree_create(sched_ctx_id); t->root = starpu_sched_component_fifo_create(t, NULL); random_component = starpu_sched_component_random_create(t, NULL); starpu_sched_component_connect(t->root, random_component); unsigned i; for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++) starpu_sched_component_connect(random_component, starpu_sched_component_worker_get(sched_ctx_id, i)); starpu_sched_tree_update_workers(t); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)t); } static void deinitialize_random_fifo_center_policy(unsigned sched_ctx_id) { struct starpu_sched_tree *tree = (struct starpu_sched_tree*)starpu_sched_ctx_get_policy_data(sched_ctx_id); starpu_sched_tree_destroy(tree); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_random_policy = { .init_sched = initialize_random_fifo_center_policy, .deinit_sched = deinitialize_random_fifo_center_policy, .add_workers = starpu_sched_tree_add_workers, .remove_workers = starpu_sched_tree_remove_workers, .push_task = starpu_sched_tree_push_task, .pop_task = starpu_sched_tree_pop_task, .pre_exec_hook = NULL, .post_exec_hook = NULL, .pop_every_task = NULL, .policy_name = "modular-random", .policy_description = "random modular policy" }; /* Random scheduler with a priority queue for its scheduling window */ static void initialize_random_prio_center_policy(unsigned sched_ctx_id) { struct starpu_sched_tree *t; struct starpu_sched_component * random_component; starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); t = starpu_sched_tree_create(sched_ctx_id); t->root = starpu_sched_component_prio_create(t, NULL); random_component = starpu_sched_component_random_create(t, NULL); starpu_sched_component_connect(t->root, random_component); unsigned i; for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++) starpu_sched_component_connect(random_component, starpu_sched_component_worker_get(sched_ctx_id, i)); starpu_sched_tree_update_workers(t); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)t); /* The application may use any integer */ if (starpu_sched_ctx_min_priority_is_set(sched_ctx_id) == 0) starpu_sched_ctx_set_min_priority(sched_ctx_id, INT_MIN); if (starpu_sched_ctx_max_priority_is_set(sched_ctx_id) == 0) starpu_sched_ctx_set_max_priority(sched_ctx_id, INT_MAX); } static void deinitialize_random_prio_center_policy(unsigned sched_ctx_id) { struct starpu_sched_tree *tree = (struct starpu_sched_tree*)starpu_sched_ctx_get_policy_data(sched_ctx_id); starpu_sched_tree_destroy(tree); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_random_prio_policy = { .init_sched = initialize_random_prio_center_policy, .deinit_sched = deinitialize_random_prio_center_policy, .add_workers = starpu_sched_tree_add_workers, .remove_workers = starpu_sched_tree_remove_workers, .push_task = starpu_sched_tree_push_task, .pop_task = starpu_sched_tree_pop_task, .pre_exec_hook = NULL, .post_exec_hook = NULL, .pop_every_task = NULL, .policy_name = "modular-random-prio", .policy_description = "random-prio modular policy" }; starpu-1.2.3+dfsg/src/sched_policies/modular_random_prefetching.c000066400000000000000000000131731320135501600252440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 INRIA * Copyright (C) 2013 Simon Archipoff * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #define _STARPU_SCHED_NTASKS_THRESHOLD_DEFAULT 2 #define _STARPU_SCHED_EXP_LEN_THRESHOLD_DEFAULT 1000000000.0 /* Random scheduler with fifo queues for its scheduling window and its workers. */ static void initialize_random_fifo_prefetching_center_policy(unsigned sched_ctx_id) { struct starpu_sched_tree *t; struct starpu_sched_component * random_component; starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); t = starpu_sched_tree_create(sched_ctx_id); t->root = starpu_sched_component_fifo_create(t, NULL); random_component = starpu_sched_component_random_create(t, NULL); starpu_sched_component_connect(t->root, random_component); struct starpu_sched_component_fifo_data fifo_data = { .ntasks_threshold = starpu_get_env_number_default("STARPU_NTASKS_THRESHOLD", _STARPU_SCHED_NTASKS_THRESHOLD_DEFAULT), .exp_len_threshold = starpu_get_env_float_default("STARPU_EXP_LEN_THRESHOLD", _STARPU_SCHED_EXP_LEN_THRESHOLD_DEFAULT), }; unsigned i; for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++) { struct starpu_sched_component * worker_component = starpu_sched_component_worker_get(sched_ctx_id, i); struct starpu_sched_component * fifo_component = starpu_sched_component_fifo_create(t, &fifo_data); starpu_sched_component_connect(fifo_component, worker_component); starpu_sched_component_connect(random_component, fifo_component); } starpu_sched_tree_update_workers(t); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)t); } static void deinitialize_random_fifo_prefetching_center_policy(unsigned sched_ctx_id) { struct starpu_sched_tree *tree = (struct starpu_sched_tree*)starpu_sched_ctx_get_policy_data(sched_ctx_id); starpu_sched_tree_destroy(tree); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_random_prefetching_policy = { .init_sched = initialize_random_fifo_prefetching_center_policy, .deinit_sched = deinitialize_random_fifo_prefetching_center_policy, .add_workers = starpu_sched_tree_add_workers, .remove_workers = starpu_sched_tree_remove_workers, .push_task = starpu_sched_tree_push_task, .pop_task = starpu_sched_tree_pop_task, .pre_exec_hook = NULL, .post_exec_hook = NULL, .pop_every_task = NULL, .policy_name = "modular-random-prefetching", .policy_description = "random prefetching modular policy" }; /* Random scheduler with priority queues for its scheduling window and its workers. */ static void initialize_random_prio_prefetching_center_policy(unsigned sched_ctx_id) { struct starpu_sched_tree *t; struct starpu_sched_component *random_component; starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); t = starpu_sched_tree_create(sched_ctx_id); t->root = starpu_sched_component_prio_create(t, NULL); random_component = starpu_sched_component_random_create(t, NULL); starpu_sched_component_connect(t->root, random_component); struct starpu_sched_component_prio_data prio_data = { .ntasks_threshold = starpu_get_env_number_default("STARPU_NTASKS_THRESHOLD", _STARPU_SCHED_NTASKS_THRESHOLD_DEFAULT), .exp_len_threshold = starpu_get_env_float_default("STARPU_EXP_LEN_THRESHOLD", _STARPU_SCHED_EXP_LEN_THRESHOLD_DEFAULT), }; unsigned i; for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++) { struct starpu_sched_component * worker_component = starpu_sched_component_worker_get(sched_ctx_id, i); struct starpu_sched_component * prio_component = starpu_sched_component_prio_create(t, &prio_data); starpu_sched_component_connect(prio_component, worker_component); starpu_sched_component_connect(random_component, prio_component); } starpu_sched_tree_update_workers(t); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)t); /* The application may use any integer */ if (starpu_sched_ctx_min_priority_is_set(sched_ctx_id) == 0) starpu_sched_ctx_set_min_priority(sched_ctx_id, INT_MIN); if (starpu_sched_ctx_max_priority_is_set(sched_ctx_id) == 0) starpu_sched_ctx_set_max_priority(sched_ctx_id, INT_MAX); } static void deinitialize_random_prio_prefetching_center_policy(unsigned sched_ctx_id) { struct starpu_sched_tree *tree = (struct starpu_sched_tree*)starpu_sched_ctx_get_policy_data(sched_ctx_id); starpu_sched_tree_destroy(tree); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_random_prio_prefetching_policy = { .init_sched = initialize_random_prio_prefetching_center_policy, .deinit_sched = deinitialize_random_prio_prefetching_center_policy, .add_workers = starpu_sched_tree_add_workers, .remove_workers = starpu_sched_tree_remove_workers, .push_task = starpu_sched_tree_push_task, .pop_task = starpu_sched_tree_pop_task, .pre_exec_hook = NULL, .post_exec_hook = NULL, .pop_every_task = NULL, .policy_name = "modular-random-prio-prefetching", .policy_description = "random-prio prefetching modular policy" }; starpu-1.2.3+dfsg/src/sched_policies/parallel_eager.c000066400000000000000000000226571320135501600226310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2016 Université de Bordeaux * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2011-2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include struct _starpu_peager_data { struct _starpu_fifo_taskq *fifo; struct _starpu_fifo_taskq *local_fifo[STARPU_NMAXWORKERS]; int master_id[STARPU_NMAXWORKERS]; starpu_pthread_mutex_t policy_mutex; }; #define STARPU_NMAXCOMBINED_WORKERS 520 /* instead of STARPU_NMAXCOMBINED_WORKERS, we should use some "MAX combination .."*/ static int possible_combinations_cnt[STARPU_NMAXWORKERS]; static int possible_combinations[STARPU_NMAXWORKERS][STARPU_NMAXCOMBINED_WORKERS]; static int possible_combinations_size[STARPU_NMAXWORKERS][STARPU_NMAXCOMBINED_WORKERS]; /*!!!!!!! It doesn't work with several contexts because the combined workers are constructed from the workers available to the program, and not to the context !!!!!!!!!!!!!!!!!!!!!!! */ static void peager_add_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers) { _starpu_sched_find_worker_combinations(workerids, nworkers); struct _starpu_peager_data *data = (struct _starpu_peager_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned nbasic_workers = starpu_worker_get_count(); unsigned ncombined_workers= starpu_combined_worker_get_count(); unsigned workerid, i; /* Find the master of each worker. We first assign the worker as its * own master, and then iterate over the different worker combinations * to find the biggest combination containing this worker. */ for(i = 0; i < nworkers; i++) { workerid = workerids[i]; starpu_sched_ctx_worker_shares_tasks_lists(workerid, sched_ctx_id); int cnt = possible_combinations_cnt[workerid]++; possible_combinations[workerid][cnt] = workerid; possible_combinations_size[workerid][cnt] = 1; data->master_id[workerid] = workerid; } for (i = 0; i < ncombined_workers; i++) { workerid = nbasic_workers + i; /* Note that we ASSUME that the workers are sorted by size ! */ int *workers; int size; starpu_combined_worker_get_description(workerid, &size, &workers); int master = workers[0]; int j; for (j = 0; j < size; j++) { if (data->master_id[workers[j]] > master) data->master_id[workers[j]] = master; int cnt = possible_combinations_cnt[workers[j]]++; possible_combinations[workers[j]][cnt] = workerid; possible_combinations_size[workers[j]][cnt] = size; } } for(i = 0; i < nworkers; i++) { workerid = workerids[i]; /* slaves pick up tasks from their local queue, their master * will put tasks directly in that local list when a parallel * tasks comes. */ data->local_fifo[workerid] = _starpu_create_fifo(); } #if 0 for(i = 0; i < nworkers; i++) { workerid = workerids[i]; _STARPU_MSG("MASTER of %d = %d\n", workerid, master_id[workerid]); } #endif } static void peager_remove_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers) { struct _starpu_peager_data *data = (struct _starpu_peager_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned i; for(i = 0; i < nworkers; i++) { int workerid = workerids[i]; if(!starpu_worker_is_combined_worker(workerid)) _starpu_destroy_fifo(data->local_fifo[workerid]); } } static void initialize_peager_policy(unsigned sched_ctx_id) { starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); struct _starpu_peager_data *data; _STARPU_MALLOC(data, sizeof(struct _starpu_peager_data)); /* masters pick tasks from that queue */ data->fifo = _starpu_create_fifo(); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)data); STARPU_PTHREAD_MUTEX_INIT(&data->policy_mutex, NULL); } static void deinitialize_peager_policy(unsigned sched_ctx_id) { /* TODO check that there is no task left in the queue */ struct _starpu_peager_data *data = (struct _starpu_peager_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); /* deallocate the job queue */ _starpu_destroy_fifo(data->fifo); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); STARPU_PTHREAD_MUTEX_DESTROY(&data->policy_mutex); free(data); } static int push_task_peager_policy(struct starpu_task *task) { unsigned sched_ctx_id = task->sched_ctx; int ret_val; struct _starpu_peager_data *data = (struct _starpu_peager_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); ret_val = _starpu_fifo_push_task(data->fifo, task); starpu_push_task_end(task); STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); #ifndef STARPU_NON_BLOCKING_DRIVERS /* if there are no tasks block */ /* wake people waiting for a task */ struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { int worker = workers->get_next(workers, &it); int master = data->master_id[worker]; /* If this is not a CPU or a MIC, then the worker simply grabs tasks from the fifo */ if ((!starpu_worker_is_combined_worker(worker) && starpu_worker_get_type(worker) != STARPU_MIC_WORKER && starpu_worker_get_type(worker) != STARPU_CPU_WORKER) || (master == worker)) starpu_wake_worker(worker); } #endif return ret_val; } static struct starpu_task *pop_task_peager_policy(unsigned sched_ctx_id) { struct _starpu_peager_data *data = (struct _starpu_peager_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); int workerid = starpu_worker_get_id_check(); /* If this is not a CPU or a MIC, then the worker simply grabs tasks from the fifo */ if (starpu_worker_get_type(workerid) != STARPU_CPU_WORKER && starpu_worker_get_type(workerid) != STARPU_MIC_WORKER) { struct starpu_task *task = NULL; STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); task = _starpu_fifo_pop_task(data->fifo, workerid); STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); return task; } int master = data->master_id[workerid]; //_STARPU_DEBUG("workerid:%d, master:%d\n",workerid,master); if (master == workerid) { /* The worker is a master */ struct starpu_task *task = NULL; STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); task = _starpu_fifo_pop_task(data->fifo, workerid); STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); if (!task) return NULL; /* Find the largest compatible worker combination */ int best_size = -1; int best_workerid = -1; int i; for (i = 0; i < possible_combinations_cnt[master]; i++) { if (possible_combinations_size[workerid][i] > best_size) { int combined_worker = possible_combinations[workerid][i]; if (starpu_combined_worker_can_execute_task(combined_worker, task, 0)) { best_size = possible_combinations_size[workerid][i]; best_workerid = combined_worker; } } } /* In case nobody can execute this task, we let the master * worker take it anyway, so that it can discard it afterward. * */ if (best_workerid == -1) return task; /* Is this a basic worker or a combined worker ? */ int nbasic_workers = (int)starpu_worker_get_count(); int is_basic_worker = (best_workerid < nbasic_workers); if (is_basic_worker) { /* The master is alone */ return task; } else { starpu_parallel_task_barrier_init(task, best_workerid); int worker_size = 0; int *combined_workerid; starpu_combined_worker_get_description(best_workerid, &worker_size, &combined_workerid); /* Dispatch task aliases to the different slaves */ for (i = 1; i < worker_size; i++) { struct starpu_task *alias = starpu_task_dup(task); int local_worker = combined_workerid[i]; alias->destroy = 1; starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(local_worker, &sched_mutex, &sched_cond); STARPU_PTHREAD_MUTEX_LOCK_SCHED(sched_mutex); _starpu_fifo_push_task(data->local_fifo[local_worker], alias); #if !defined(STARPU_NON_BLOCKING_DRIVERS) || defined(STARPU_SIMGRID) starpu_wakeup_worker_locked(local_worker, sched_cond, sched_mutex); #endif STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(sched_mutex); } /* The master also manipulated an alias */ struct starpu_task *master_alias = starpu_task_dup(task); master_alias->destroy = 1; return master_alias; } } else { /* The worker is a slave */ return _starpu_fifo_pop_task(data->local_fifo[workerid], workerid); } } struct starpu_sched_policy _starpu_sched_peager_policy = { .init_sched = initialize_peager_policy, .deinit_sched = deinitialize_peager_policy, .add_workers = peager_add_workers, .remove_workers = peager_remove_workers, .push_task = push_task_peager_policy, .pop_task = pop_task_peager_policy, .pre_exec_hook = NULL, .post_exec_hook = NULL, .pop_every_task = NULL, .policy_name = "peager", .policy_description = "parallel eager policy" }; starpu-1.2.3+dfsg/src/sched_policies/parallel_heft.c000066400000000000000000000500641320135501600224650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * Copyright (C) 2010-2017 Université de Bordeaux * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Distributed queues using performance modeling to assign tasks */ #include #include #include #include #include #include #include #ifndef DBL_MIN #define DBL_MIN __DBL_MIN__ #endif #ifndef DBL_MAX #define DBL_MAX __DBL_MAX__ #endif /* if no priority is set when creating the scheduling context, we use the following ones */ #define DEFAULT_MIN_PRIORITY 0 #define DEFAULT_MAX_PRIORITY 1 //static unsigned ncombinedworkers; //static enum starpu_perfmodel_archtype applicable_perf_archtypes[STARPU_NARCH_VARIATIONS]; //static unsigned napplicable_perf_archtypes = 0; /* * Here are the default values of alpha, beta, gamma */ #define _STARPU_SCHED_ALPHA_DEFAULT 1.0 #define _STARPU_SCHED_BETA_DEFAULT 1.0 #define _STARPU_SCHED_GAMMA_DEFAULT 1000.0 struct _starpu_pheft_data { double alpha; double beta; double _gamma; double idle_power; /* When we push a task on a combined worker we need all the cpu workers it contains * to be locked at once */ starpu_pthread_mutex_t global_push_mutex; }; static double worker_exp_start[STARPU_NMAXWORKERS]; static double worker_exp_end[STARPU_NMAXWORKERS]; static double worker_exp_len[STARPU_NMAXWORKERS]; static int ntasks[STARPU_NMAXWORKERS]; /*!!!!!!! It doesn't work with several contexts because the combined workers are constructed from the workers available to the program, and not to the context !!!!!!!!!!!!!!!!!!!!!!! */ static void parallel_heft_pre_exec_hook(struct starpu_task *task) { if (!task->cl || task->execute_on_a_specific_worker) return; unsigned workerid = starpu_worker_get_id_check(); double model = task->predicted; double transfer_model = task->predicted_transfer; if (isnan(model)) model = 0.0; if (isnan(transfer_model)) transfer_model = 0.0; starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond); /* Once we have executed the task, we can update the predicted amount * of work. */ STARPU_PTHREAD_MUTEX_LOCK_SCHED(sched_mutex); worker_exp_len[workerid] -= model + transfer_model; worker_exp_start[workerid] = starpu_timing_now() + model; worker_exp_end[workerid] = worker_exp_start[workerid] + worker_exp_len[workerid]; ntasks[workerid]--; STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(sched_mutex); } static int push_task_on_best_worker(struct starpu_task *task, int best_workerid, double exp_end_predicted, int prio, unsigned sched_ctx_id) { /* make sure someone coule execute that task ! */ STARPU_ASSERT(best_workerid != -1); struct _starpu_pheft_data *hd = (struct _starpu_pheft_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); /* Is this a basic worker or a combined worker ? */ unsigned memory_node; memory_node = starpu_worker_get_memory_node(best_workerid); if (starpu_get_prefetch_flag()) starpu_prefetch_task_input_on_node(task, memory_node); int ret = 0; if (!starpu_worker_is_combined_worker(best_workerid)) { starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(best_workerid, &sched_mutex, &sched_cond); STARPU_PTHREAD_MUTEX_LOCK_SCHED(sched_mutex); task->predicted = exp_end_predicted - worker_exp_end[best_workerid]; /* TODO */ task->predicted_transfer = 0; worker_exp_len[best_workerid] += task->predicted; worker_exp_end[best_workerid] = exp_end_predicted; worker_exp_start[best_workerid] = exp_end_predicted - worker_exp_len[best_workerid]; ntasks[best_workerid]++; STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(sched_mutex); /* We don't want it to interlace its task with a combined * worker's one */ STARPU_PTHREAD_MUTEX_LOCK(&hd->global_push_mutex); ret = starpu_push_local_task(best_workerid, task, prio); STARPU_PTHREAD_MUTEX_UNLOCK(&hd->global_push_mutex); } else { /* This task doesn't belong to an actual worker, it belongs * to a combined worker and thus the scheduler doesn't care * of its predicted values which are insignificant */ task->predicted = 0; task->predicted_transfer = 0; starpu_parallel_task_barrier_init(task, best_workerid); int worker_size = 0; int *combined_workerid; starpu_combined_worker_get_description(best_workerid, &worker_size, &combined_workerid); /* All cpu workers must be locked at once */ STARPU_PTHREAD_MUTEX_LOCK(&hd->global_push_mutex); /* This is a combined worker so we create task aliases */ int i; for (i = 0; i < worker_size; i++) { struct starpu_task *alias = starpu_task_dup(task); int local_worker = combined_workerid[i]; alias->predicted = exp_end_predicted - worker_exp_end[local_worker]; /* TODO */ alias->predicted_transfer = 0; alias->destroy = 1; starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(local_worker, &sched_mutex, &sched_cond); STARPU_PTHREAD_MUTEX_LOCK_SCHED(sched_mutex); worker_exp_len[local_worker] += alias->predicted; worker_exp_end[local_worker] = exp_end_predicted; worker_exp_start[local_worker] = exp_end_predicted - worker_exp_len[local_worker]; ntasks[local_worker]++; STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(sched_mutex); ret |= starpu_push_local_task(local_worker, alias, prio); } STARPU_PTHREAD_MUTEX_UNLOCK(&hd->global_push_mutex); } return ret; } static double compute_expected_end(int workerid, double length) { starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond); if (!starpu_worker_is_combined_worker(workerid)) { double res; /* This is a basic worker */ /* Here helgrind would shout that this is unprotected, but we * are fine with getting outdated values, this is just an * estimation */ res = worker_exp_start[workerid] + worker_exp_len[workerid] + length; return res; } else { /* This is a combined worker, the expected end is the end for the latest worker */ int worker_size; int *combined_workerid; starpu_combined_worker_get_description(workerid, &worker_size, &combined_workerid); double exp_end = DBL_MIN; /* Here helgrind would shout that this is unprotected, but we * are fine with getting outdated values, this is just an * estimation */ int i; for (i = 0; i < worker_size; i++) { double local_exp_start = worker_exp_start[combined_workerid[i]]; double local_exp_len = worker_exp_len[combined_workerid[i]]; double local_exp_end = local_exp_start + local_exp_len + length; exp_end = STARPU_MAX(exp_end, local_exp_end); } return exp_end; } } static double compute_ntasks_end(int workerid, unsigned sched_ctx_id) { struct starpu_perfmodel_arch* perf_arch = starpu_worker_get_perf_archtype(workerid, sched_ctx_id); starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond); if (!starpu_worker_is_combined_worker(workerid)) { double res; /* This is a basic worker */ /* Here helgrind would shout that this is unprotected, but we * are fine with getting outdated values, this is just an * estimation */ res = ntasks[workerid] / starpu_worker_get_relative_speedup(perf_arch); return res; } else { /* This is a combined worker, the expected end is the end for the latest worker */ int worker_size; int *combined_workerid; starpu_combined_worker_get_description(workerid, &worker_size, &combined_workerid); int ntasks_end=0; /* Here helgrind would shout that this is unprotected, but we * are fine with getting outdated values, this is just an * estimation */ int i; for (i = 0; i < worker_size; i++) { /* XXX: this is actually bogus: not all pushed tasks are necessarily parallel... */ ntasks_end = STARPU_MAX(ntasks_end, (int) ((double) ntasks[combined_workerid[i]] / starpu_worker_get_relative_speedup(perf_arch))); } return ntasks_end; } } static int _parallel_heft_push_task(struct starpu_task *task, unsigned prio, unsigned sched_ctx_id) { struct _starpu_pheft_data *hd = (struct _starpu_pheft_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); unsigned nworkers_ctx = workers->nworkers; unsigned worker, worker_ctx = 0; int best = -1, best_id_ctx = -1; /* this flag is set if the corresponding worker is selected because there is no performance prediction available yet */ int forced_best = -1, forced_best_ctx = -1, forced_nimpl = -1; double local_task_length[nworkers_ctx][STARPU_MAXIMPLEMENTATIONS]; double local_data_penalty[nworkers_ctx][STARPU_MAXIMPLEMENTATIONS]; double local_energy[nworkers_ctx][STARPU_MAXIMPLEMENTATIONS]; double local_exp_end[nworkers_ctx][STARPU_MAXIMPLEMENTATIONS]; double fitness[nworkers_ctx][STARPU_MAXIMPLEMENTATIONS]; double max_exp_end = 0.0; int skip_worker[nworkers_ctx][STARPU_MAXIMPLEMENTATIONS]; double best_exp_end = DBL_MAX; //double penality_best = 0.0; int ntasks_best = -1, ntasks_best_ctx = -1, nimpl_best = -1; double ntasks_best_end = 0.0; int calibrating = 0; /* A priori, we know all estimations */ int unknown = 0; struct starpu_sched_ctx_iterator it; memset(skip_worker, 0, nworkers_ctx*STARPU_MAXIMPLEMENTATIONS*sizeof(int)); workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); if(!starpu_worker_is_combined_worker(worker)) { starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(worker, &sched_mutex, &sched_cond); /* Sometimes workers didn't take the tasks as early as we expected */ STARPU_PTHREAD_MUTEX_LOCK_SCHED(sched_mutex); worker_exp_start[worker] = STARPU_MAX(worker_exp_start[worker], starpu_timing_now()); worker_exp_end[worker] = worker_exp_start[worker] + worker_exp_len[worker]; if (worker_exp_end[worker] > max_exp_end) max_exp_end = worker_exp_end[worker]; STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(sched_mutex); } } unsigned nimpl; worker_ctx = 0; while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) { if (!starpu_combined_worker_can_execute_task(worker, task, nimpl)) { /* no one on that queue may execute this task */ skip_worker[worker_ctx][nimpl] = 1; continue; } else { skip_worker[worker_ctx][nimpl] = 0; } struct starpu_perfmodel_arch* perf_arch = starpu_worker_get_perf_archtype(worker, sched_ctx_id); local_task_length[worker_ctx][nimpl] = starpu_task_expected_length(task, perf_arch,nimpl); unsigned memory_node = starpu_worker_get_memory_node(worker); local_data_penalty[worker_ctx][nimpl] = starpu_task_expected_data_transfer_time(memory_node, task); double ntasks_end = compute_ntasks_end(worker, sched_ctx_id); if (ntasks_best == -1 || (!calibrating && ntasks_end < ntasks_best_end) /* Not calibrating, take better task */ || (!calibrating && isnan(local_task_length[worker_ctx][nimpl])) /* Not calibrating but this worker is being calibrated */ || (calibrating && isnan(local_task_length[worker_ctx][nimpl]) && ntasks_end < ntasks_best_end) /* Calibrating, compete this worker with other non-calibrated */ ) { ntasks_best_end = ntasks_end; ntasks_best = worker; ntasks_best_ctx = worker_ctx; nimpl_best = nimpl; } if (isnan(local_task_length[worker_ctx][nimpl])) { static int warned; if (!warned) { warned = 1; _STARPU_DISP("Warning: performance model for %s not finished calibrating on %u, using a dumb scheduling heuristic for now\n", starpu_task_get_name(task), worker); } /* we are calibrating, we want to speed-up calibration time * so we privilege non-calibrated tasks (but still * greedily distribute them to avoid dumb schedules) */ calibrating = 1; } if (isnan(local_task_length[worker_ctx][nimpl]) || _STARPU_IS_ZERO(local_task_length[worker_ctx][nimpl])) /* there is no prediction available for that task * with that arch yet, so switch to a greedy strategy */ unknown = 1; if (unknown) continue; local_exp_end[worker_ctx][nimpl] = compute_expected_end(worker, local_task_length[worker_ctx][nimpl]); //fprintf(stderr, "WORKER %d -> length %e end %e\n", worker, local_task_length[worker_ctx][nimpl], local_exp_end[worker][nimpl]); if (local_exp_end[worker_ctx][nimpl] < best_exp_end) { /* a better solution was found */ best_exp_end = local_exp_end[worker_ctx][nimpl]; nimpl_best = nimpl; } local_energy[worker_ctx][nimpl] = starpu_task_expected_energy(task, perf_arch,nimpl); //_STARPU_DEBUG("Scheduler parallel heft: task length (%lf) local energy (%lf) worker (%u) kernel (%u) \n", local_task_length[worker],local_energy[worker],worker,nimpl); if (isnan(local_energy[worker_ctx][nimpl])) local_energy[worker_ctx][nimpl] = 0.; } worker_ctx++; } if (unknown) { forced_best = ntasks_best; forced_best_ctx = ntasks_best_ctx; forced_nimpl = nimpl_best; } if (forced_best == -1) { double best_fitness = -1; worker_ctx = 0; while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) { if (skip_worker[worker_ctx][nimpl]) { /* no one on that queue may execute this task */ continue; } fitness[worker_ctx][nimpl] = hd->alpha*(local_exp_end[worker_ctx][nimpl] - best_exp_end) + hd->beta*(local_data_penalty[worker_ctx][nimpl]) + hd->_gamma*(local_energy[worker_ctx][nimpl]); if (local_exp_end[worker_ctx][nimpl] > max_exp_end) /* This placement will make the computation * longer, take into account the idle * consumption of other cpus */ fitness[worker_ctx][nimpl] += hd->_gamma * hd->idle_power * (local_exp_end[worker_ctx][nimpl] - max_exp_end) / 1000000.0; if (best == -1 || fitness[worker_ctx][nimpl] < best_fitness) { /* we found a better solution */ best_fitness = fitness[worker_ctx][nimpl]; best = worker; best_id_ctx = worker_ctx; nimpl_best = nimpl; } // fprintf(stderr, "FITNESS worker %d -> %e local_exp_end %e - local_data_penalty %e\n", worker, fitness[worker][nimpl], local_exp_end[worker][nimpl] - best_exp_end, local_data_penalty[worker][nimpl]); } worker_ctx++; } } STARPU_ASSERT(forced_best != -1 || best != -1); if (forced_best != -1) { /* there is no prediction available for that task * with that arch we want to speed-up calibration time * so we force this measurement */ best = forced_best; best_id_ctx = forced_best_ctx; nimpl_best = forced_nimpl; //penality_best = 0.0; best_exp_end = compute_expected_end(best, 0); } else { //penality_best = local_data_penalty[best_id_ctx][nimpl_best]; best_exp_end = local_exp_end[best_id_ctx][nimpl_best]; } //_STARPU_DEBUG("Scheduler parallel heft: kernel (%u)\n", nimpl_best); starpu_task_set_implementation(task, nimpl_best); /* we should now have the best worker in variable "best" */ _STARPU_TASK_BREAK_ON(task, sched); return push_task_on_best_worker(task, best, best_exp_end, prio, sched_ctx_id); } static int parallel_heft_push_task(struct starpu_task *task) { unsigned sched_ctx_id = task->sched_ctx; int ret_val = -1; if (task->priority == STARPU_MAX_PRIO) { ret_val = _parallel_heft_push_task(task, 1, sched_ctx_id); return ret_val; } ret_val = _parallel_heft_push_task(task, 0, sched_ctx_id); return ret_val; } static void parallel_heft_add_workers(__attribute__((unused)) unsigned sched_ctx_id, int *workerids, unsigned nworkers) { unsigned i; for (i = 0; i < nworkers; i++) { int workerid = workerids[i]; struct _starpu_worker *workerarg = _starpu_get_worker_struct(workerid); /* init these structures only once for each worker */ if(!workerarg->has_prev_init) { worker_exp_start[workerid] = starpu_timing_now(); worker_exp_len[workerid] = 0.0; worker_exp_end[workerid] = worker_exp_start[workerid]; ntasks[workerid] = 0; workerarg->has_prev_init = 1; } } _starpu_sched_find_worker_combinations(workerids, nworkers); // start_unclear_part: not very clear where this is used /* struct _starpu_machine_config *config = _starpu_get_machine_config(); */ /* ncombinedworkers = config->topology.ncombinedworkers; */ /* /\* We pre-compute an array of all the perfmodel archs that are applicable *\/ */ /* unsigned total_worker_count = nworkers + ncombinedworkers; */ /* unsigned used_perf_archtypes[STARPU_NARCH_VARIATIONS]; */ /* memset(used_perf_archtypes, 0, sizeof(used_perf_archtypes)); */ /* for (workerid = 0; workerid < total_worker_count; workerid++) */ /* { */ /* enum starpu_perfmodel_archtype perf_archtype = starpu_worker_get_perf_archtype(workerid); */ /* used_perf_archtypes[perf_archtype] = 1; */ /* } */ // end_unclear_part // napplicable_perf_archtypes = 0; // int arch; // for (arch = 0; arch < STARPU_NARCH_VARIATIONS; arch++) // { // if (used_perf_archtypes[arch]) // applicable_perf_archtypes[napplicable_perf_archtypes++] = arch; // } } static void initialize_parallel_heft_policy(unsigned sched_ctx_id) { starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); struct _starpu_pheft_data *hd; _STARPU_MALLOC(hd, sizeof(struct _starpu_pheft_data)); if (starpu_sched_ctx_min_priority_is_set(sched_ctx_id) == 0) starpu_sched_ctx_set_min_priority(sched_ctx_id, DEFAULT_MIN_PRIORITY); if (starpu_sched_ctx_max_priority_is_set(sched_ctx_id) == 0) starpu_sched_ctx_set_max_priority(sched_ctx_id, DEFAULT_MAX_PRIORITY); STARPU_ASSERT_MSG(starpu_sched_ctx_get_min_priority(sched_ctx_id) < starpu_sched_ctx_get_max_priority(sched_ctx_id), "Priority min %d should be lower than priority max %d\n", starpu_sched_ctx_get_min_priority(sched_ctx_id), starpu_sched_ctx_get_max_priority(sched_ctx_id)); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)hd); hd->alpha = starpu_get_env_float_default("STARPU_SCHED_ALPHA", _STARPU_SCHED_ALPHA_DEFAULT); hd->beta = starpu_get_env_float_default("STARPU_SCHED_BETA", _STARPU_SCHED_BETA_DEFAULT); hd->_gamma = starpu_get_env_float_default("STARPU_SCHED_GAMMA", _STARPU_SCHED_GAMMA_DEFAULT); hd->idle_power = starpu_get_env_float_default("STARPU_IDLE_POWER", 0.0); STARPU_PTHREAD_MUTEX_INIT(&hd->global_push_mutex, NULL); /* Tell helgrind that we are fine with getting outdated values when * estimating schedules */ STARPU_HG_DISABLE_CHECKING(worker_exp_start); STARPU_HG_DISABLE_CHECKING(worker_exp_end); STARPU_HG_DISABLE_CHECKING(worker_exp_len); STARPU_HG_DISABLE_CHECKING(ntasks); } static void parallel_heft_deinit(unsigned sched_ctx_id) { struct _starpu_pheft_data *hd = (struct _starpu_pheft_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); STARPU_PTHREAD_MUTEX_DESTROY(&hd->global_push_mutex); free(hd); } /* TODO: use post_exec_hook to fix the expected start */ struct starpu_sched_policy _starpu_sched_parallel_heft_policy = { .init_sched = initialize_parallel_heft_policy, .deinit_sched = parallel_heft_deinit, .add_workers = parallel_heft_add_workers, .remove_workers = NULL, .push_task = parallel_heft_push_task, .pop_task = NULL, .pre_exec_hook = parallel_heft_pre_exec_hook, .post_exec_hook = NULL, .pop_every_task = NULL, .policy_name = "pheft", .policy_description = "parallel HEFT" }; starpu-1.2.3+dfsg/src/sched_policies/prio_deque.c000066400000000000000000000105531320135501600220160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Simon Archipoff * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "prio_deque.h" void _starpu_prio_deque_init(struct _starpu_prio_deque * pdeque) { STARPU_ASSERT(pdeque); memset(pdeque,0,sizeof(*pdeque)); } void _starpu_prio_deque_destroy(struct _starpu_prio_deque * pdeque) { STARPU_ASSERT(pdeque); int i; for(i = 0; i < pdeque->size_array; i++) { STARPU_ASSERT(starpu_task_list_empty(&pdeque->array[i].list)); } free(pdeque->array); } int _starpu_prio_deque_is_empty(struct _starpu_prio_deque * pdeque) { STARPU_ASSERT(pdeque); return pdeque->ntasks == 0; } /* return the struct starpu_prio_list * of prio, * create it and return it if none exist yet */ static struct starpu_task_list * get_prio(struct _starpu_prio_deque * pdeque, int prio) { STARPU_ASSERT(pdeque); int i; for(i = 0; i < pdeque->size_array; i++) { if(pdeque->array[i].prio == prio) { return &pdeque->array[i].list; } else if(pdeque->array[i].prio < prio) break; } pdeque->size_array++; _STARPU_REALLOC(pdeque->array, sizeof(struct _starpu_prio_list) * (pdeque->size_array)); memmove(pdeque->array + i + 1, pdeque->array + i, (pdeque->size_array - i - 1) * sizeof(struct _starpu_prio_list)); pdeque->array[i].prio = prio; starpu_task_list_init(&pdeque->array[i].list); return &pdeque->array[i].list; } int _starpu_prio_deque_push_task(struct _starpu_prio_deque * pdeque, struct starpu_task * task) { STARPU_ASSERT(pdeque && task); struct starpu_task_list * list = get_prio(pdeque, task->priority); starpu_task_list_push_back(list, task); pdeque->ntasks++; return 0; } int _starpu_prio_deque_push_back_task(struct _starpu_prio_deque * pdeque, struct starpu_task * task) { STARPU_ASSERT(pdeque && task); struct starpu_task_list * list = get_prio(pdeque, task->priority); starpu_task_list_push_front(list, task); pdeque->ntasks++; return 0; } /* a little dirty code factorization */ static inline int pred_true(struct starpu_task * t STARPU_ATTRIBUTE_UNUSED, void * v STARPU_ATTRIBUTE_UNUSED) { return 1; } static inline int pred_can_execute(struct starpu_task * t, void * pworkerid) { int i; for(i = 0; i < STARPU_MAXIMPLEMENTATIONS; i++) if(starpu_worker_can_execute_task(*(int*)pworkerid, t,i)) return 1; return 0; } #define REMOVE_TASK(pdeque, first_task_field, next_task_field, predicate, parg) \ { \ int i; \ struct starpu_task * t = NULL; \ for(i = 0; i < pdeque->size_array; i++) \ { \ t = pdeque->array[i].list.first_task_field; \ while(t && !predicate(t,parg)) \ t = t->next_task_field; \ if(t) \ { \ starpu_task_list_erase(&pdeque->array[i].list, t); \ pdeque->ntasks--; \ return t; \ } \ } \ return NULL; \ } /* deque a task of the higher priority available */ /* From the front of the list for the highest priority */ struct starpu_task * _starpu_prio_deque_pop_task(struct _starpu_prio_deque * pdeque) { REMOVE_TASK(pdeque, head, prev, pred_true, STARPU_POISON_PTR); } struct starpu_task * _starpu_prio_deque_pop_task_for_worker(struct _starpu_prio_deque * pdeque, int workerid) { STARPU_ASSERT(pdeque); STARPU_ASSERT(workerid >= 0 && (unsigned) workerid < starpu_worker_get_count()); REMOVE_TASK(pdeque, head, prev, pred_can_execute, &workerid); } /* From the back of the list for the highest priority */ struct starpu_task * _starpu_prio_deque_deque_task(struct _starpu_prio_deque * pdeque) { STARPU_ASSERT(pdeque); REMOVE_TASK(pdeque, tail, next, pred_true, STARPU_POISON_PTR); } struct starpu_task * _starpu_prio_deque_deque_task_for_worker(struct _starpu_prio_deque * pdeque, int workerid) { STARPU_ASSERT(pdeque); STARPU_ASSERT(workerid >= 0 && (unsigned) workerid < starpu_worker_get_count()); REMOVE_TASK(pdeque, tail, next, pred_can_execute, &workerid); } starpu-1.2.3+dfsg/src/sched_policies/prio_deque.h000066400000000000000000000041311320135501600220160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Simon Archipoff * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __PRIO_DEQUE_H__ #define __PRIO_DEQUE_H__ #include #include struct _starpu_prio_list { int prio; struct starpu_task_list list; }; struct _starpu_prio_deque { struct _starpu_prio_list * array; int size_array; unsigned ntasks; unsigned nprocessed; double exp_start, exp_end, exp_len; }; void _starpu_prio_deque_init(struct _starpu_prio_deque *); void _starpu_prio_deque_destroy(struct _starpu_prio_deque *); /* return 0 iff the struct _starpu_prio_deque is not empty */ int _starpu_prio_deque_is_empty(struct _starpu_prio_deque *); /* push a task in O(nb priorities) */ int _starpu_prio_deque_push_task(struct _starpu_prio_deque *, struct starpu_task *); int _starpu_prio_deque_push_back_task(struct _starpu_prio_deque *, struct starpu_task *); /* all _starpu_prio_deque_pop/deque_task function return a task or a NULL pointer if none are available * in O(nb priorities) */ struct starpu_task * _starpu_prio_deque_pop_task(struct _starpu_prio_deque *); /* return a task that can be executed by workerid */ struct starpu_task * _starpu_prio_deque_pop_task_for_worker(struct _starpu_prio_deque *, int workerid); /* deque a task of the higher priority available */ struct starpu_task * _starpu_prio_deque_deque_task(struct _starpu_prio_deque *); /* return a task that can be executed by workerid */ struct starpu_task * _starpu_prio_deque_deque_task_for_worker(struct _starpu_prio_deque *, int workerid); #endif /* __PRIO_DEQUE_H__ */ starpu-1.2.3+dfsg/src/sched_policies/random_policy.c000066400000000000000000000064211320135501600225200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2014, 2016-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014 CNRS * Copyright (C) 2016 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Policy attributing tasks randomly to workers */ #include #include #include #include #include #include static int _random_push_task(struct starpu_task *task, unsigned prio) { /* find the queue */ double alpha_sum = 0.0; unsigned sched_ctx_id = task->sched_ctx; struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); int worker; int worker_arr[STARPU_NMAXWORKERS]; double speedup_arr[STARPU_NMAXWORKERS]; int size = 0; struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); unsigned impl; if(starpu_worker_can_execute_task_first_impl(worker, task, &impl)) { struct starpu_perfmodel_arch* perf_arch = starpu_worker_get_perf_archtype(worker, sched_ctx_id); double speedup = starpu_worker_get_relative_speedup(perf_arch); alpha_sum += speedup; speedup_arr[size] = speedup; worker_arr[size++] = worker; } } double random = starpu_drand48()*alpha_sum; //printf("my rand is %e over %e\n", random, alpha_sum); if(size == 0) return -ENODEV; unsigned selected = worker_arr[size - 1]; double alpha = 0.0; int i; for(i = 0; i < size; i++) { worker = worker_arr[i]; double worker_alpha = speedup_arr[i]; if (alpha + worker_alpha >= random) { /* we found the worker */ selected = worker; break; } alpha += worker_alpha; } STARPU_AYU_ADDTOTASKQUEUE(starpu_task_get_job_id(task), selected); _STARPU_TASK_BREAK_ON(task, sched); return starpu_push_local_task(selected, task, prio); } static int random_push_task(struct starpu_task *task) { return _random_push_task(task, !!task->priority); } static void initialize_random_policy(unsigned sched_ctx_id) { starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); starpu_srand48(time(NULL)); } static void deinitialize_random_policy(unsigned sched_ctx_id) { starpu_sched_ctx_delete_worker_collection(sched_ctx_id); } struct starpu_sched_policy _starpu_sched_random_policy = { .init_sched = initialize_random_policy, .add_workers = NULL, .remove_workers = NULL, .deinit_sched = deinitialize_random_policy, .push_task = random_push_task, .pop_task = NULL, .pre_exec_hook = NULL, .post_exec_hook = NULL, .pop_every_task = NULL, .policy_name = "random", .policy_description = "weighted random based on worker overall performance" }; starpu-1.2.3+dfsg/src/sched_policies/sched_component.h000066400000000000000000000030631320135501600230350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Simon Archipoff * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __SCHED_COMPONENT_H__ #define __SCHED_COMPONENT_H__ #include /* lock and unlock drivers for modifying schedulers */ void _starpu_sched_component_lock_all_workers(unsigned sched_ctx_id); void _starpu_sched_component_unlock_all_workers(unsigned sched_ctx_id); void _starpu_sched_component_lock_worker(unsigned sched_ctx_id, int workerid); void _starpu_sched_component_unlock_worker(unsigned sched_ctx_id, int workerid); void _starpu_sched_component_workers_destroy(void); struct _starpu_worker * _starpu_sched_component_worker_get_worker(struct starpu_sched_component *); struct _starpu_combined_worker * _starpu_sched_component_combined_worker_get_combined_worker(struct starpu_sched_component * worker_component); struct starpu_bitmap * _starpu_get_worker_mask(unsigned sched_ctx_id); void _starpu_sched_component_lock_scheduling(void); void _starpu_sched_component_unlock_scheduling(void); #endif starpu-1.2.3+dfsg/src/sched_policies/work_stealing_policy.c000066400000000000000000000577171320135501600241260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2017 CNRS * Copyright (C) 2011, 2012, 2016 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Work stealing policy */ #include #include #include #include #include #include #include #include /* * Experimental code for improving data cache locality: * * USE_LOCALITY: * - for each data, we record on which worker it was last accessed with the * locality flag. * * - when pushing a ready task, we choose the worker which has last accessed the * most data of the task with the locality flag. * * USE_LOCALITY_TASKS: * - for each worker, we record the locality data that the task used last (i.e. a rough * estimation of what is contained in the innermost caches). * * - for each worker, we have a hash table associating from a data handle to * all the ready tasks pushed to it that will use it with the locality flag. * * - When fetching a task from a queue, pick a task which has the biggest number * of data estimated to be contained in the cache. */ //#define USE_LOCALITY //#define USE_LOCALITY_TASKS /* Maximum number of recorded locality data per task */ #define MAX_LOCALITY 8 /* Entry for queued_tasks_per_data: records that a queued task is accessing the data with locality flag */ struct locality_entry { UT_hash_handle hh; starpu_data_handle_t data; struct starpu_task *task; }; struct _starpu_work_stealing_data_per_worker { struct _starpu_fifo_taskq *queue_array; int *proxlist; starpu_pthread_mutex_t worker_mutex; int busy; #ifdef USE_LOCALITY_TASKS /* This records the same as queue_array, but hashed by data accessed with locality flag. */ /* FIXME: we record only one task per data, assuming that the access is * RW, and thus only one task is ready to write to it. Do we really need to handle the R case too? */ struct locality_entry *queued_tasks_per_data; /* This records the last data accessed by the worker */ starpu_data_handle_t last_locality[MAX_LOCALITY]; int nlast_locality; #endif }; struct _starpu_work_stealing_data { struct _starpu_work_stealing_data_per_worker *per_worker; unsigned rr_worker; /* keep track of the work performed from the beginning of the algorithm to make * better decisions about which queue to select when stealing or deferring work */ unsigned performed_total; unsigned last_pop_worker; unsigned last_push_worker; }; #ifdef USE_OVERLOAD /** * Minimum number of task we wait for being processed before we start assuming * on which worker the computation would be faster. */ static int calibration_value = 0; #endif /* USE_OVERLOAD */ /** * Return a worker from which a task can be stolen. * Selecting a worker is done in a round-robin fashion, unless * the worker previously selected doesn't own any task, * then we return the first non-empty worker. */ static int select_victim_round_robin(unsigned sched_ctx_id) { struct _starpu_work_stealing_data *ws = (struct _starpu_work_stealing_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned worker = ws->last_pop_worker; unsigned nworkers; int *workerids = NULL; nworkers = starpu_sched_ctx_get_workers_list_raw(sched_ctx_id, &workerids); unsigned ntasks = 0; /* If the worker's queue is empty, let's try * the next ones */ while (1) { /* Here helgrind would shout that this is unprotected, but we * are fine with getting outdated values, this is just an * estimation */ ntasks = ws->per_worker[workerids[worker]].queue_array->ntasks; if (ntasks && ws->per_worker[workerids[worker]].busy) break; worker = (worker + 1) % nworkers; if (worker == ws->last_pop_worker) { /* We got back to the first worker, * don't go in infinite loop */ ntasks = 0; break; } } ws->last_pop_worker = (worker + 1) % nworkers; worker = workerids[worker]; if (ntasks) return worker; else return -1; } /** * Return a worker to whom add a task. * Selecting a worker is done in a round-robin fashion. */ static unsigned select_worker_round_robin(struct starpu_task *task, unsigned sched_ctx_id) { struct _starpu_work_stealing_data *ws = (struct _starpu_work_stealing_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned worker; unsigned nworkers; int *workerids; nworkers = starpu_sched_ctx_get_workers_list_raw(sched_ctx_id, &workerids); worker = ws->last_push_worker; do worker = (worker + 1) % nworkers; while (!starpu_worker_can_execute_task_first_impl(workerids[worker], task, NULL)); ws->last_push_worker = worker; return workerids[worker]; } #ifdef USE_LOCALITY /* Select a worker according to the locality of the data of the task to be scheduled */ static unsigned select_worker_locality(struct starpu_task *task, unsigned sched_ctx_id) { struct _starpu_work_stealing_data *ws = (struct _starpu_work_stealing_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); if (nbuffers == 0) return -1; unsigned i, n; unsigned ndata[STARPU_NMAXWORKERS] = { 0 }; int best_worker = -1; unsigned best_ndata = 0; n = 0; for (i = 0; i < nbuffers; i++) if (STARPU_TASK_GET_MODE(task, i) & STARPU_LOCALITY) { starpu_data_handle_t data = STARPU_TASK_GET_HANDLE(task, i); int locality = data->last_locality; if (locality >= 0) ndata[locality]++; n++; } if (n) { /* Some locality buffers, choose worker which has most of them */ struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { int workerid = workers->get_next(workers, &it); if (ndata[workerid] > best_ndata && ws->per_worker[workerid].busy) { best_worker = workerid; best_ndata = ndata[workerid]; } } } return best_worker; } /* Record in the data which worker will handle the task with the locality flag */ static void record_data_locality(struct starpu_task *task, int workerid) { /* Record where in locality data where the task went */ unsigned i; for (i = 0; i < STARPU_TASK_GET_NBUFFERS(task); i++) if (STARPU_TASK_GET_MODE(task, i) & STARPU_LOCALITY) { STARPU_TASK_GET_HANDLE(task, i)->last_locality = workerid; } } #else static void record_data_locality(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, int workerid STARPU_ATTRIBUTE_UNUSED) { } #endif #ifdef USE_LOCALITY_TASKS /* Record in the worker which data it used last with the locality flag */ static void record_worker_locality(struct starpu_task *task, int workerid, unsigned sched_ctx_id) { /* Record where in locality data where the task went */ unsigned i; struct _starpu_work_stealing_data *ws = (struct _starpu_work_stealing_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct _starpu_work_stealing_data_per_worker *data = &ws->per_worker[workerid]; data->nlast_locality = 0; for (i = 0; i < STARPU_TASK_GET_NBUFFERS(task); i++) if (STARPU_TASK_GET_MODE(task, i) & STARPU_LOCALITY) { data->last_locality[data->nlast_locality] = STARPU_TASK_GET_HANDLE(task, i); data->nlast_locality++; if (data->nlast_locality == MAX_LOCALITY) break; } } /* Called when pushing a task to a queue */ static void locality_pushed_task(struct starpu_task *task, int workerid, unsigned sched_ctx_id) { struct _starpu_work_stealing_data *ws = (struct _starpu_work_stealing_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct _starpu_work_stealing_data_per_worker *data = &ws->per_worker[workerid]; unsigned i; for (i = 0; i < STARPU_TASK_GET_NBUFFERS(task); i++) if (STARPU_TASK_GET_MODE(task, i) & STARPU_LOCALITY) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, i); struct locality_entry *entry; HASH_FIND_PTR(data->queued_tasks_per_data, &handle, entry); if (STARPU_LIKELY(!entry)) { _STARPU_MALLOC(entry, sizeof(*entry)); entry->data = handle; entry->task = task; HASH_ADD_PTR(data->queued_tasks_per_data, data, entry); } } } /* Pick a task from workerid's queue, for execution on target */ static struct starpu_task *ws_pick_task(struct _starpu_work_stealing_data *ws, int source, int target) { struct _starpu_work_stealing_data_per_worker *data_source = &ws->per_worker[source]; struct _starpu_work_stealing_data_per_worker *data_target = &ws->per_worker[target]; unsigned i, j, n = data_target->nlast_locality; struct starpu_task *(tasks[MAX_LOCALITY]) = { NULL }, *best_task; int ntasks[MAX_LOCALITY] = { 0 }, best_n; /* Number of locality data for this worker used by this task */ /* Look at the last data accessed by this worker */ STARPU_ASSERT(n < MAX_LOCALITY); for (i = 0; i < n; i++) { starpu_data_handle_t handle = data_target->last_locality[i]; struct locality_entry *entry; HASH_FIND_PTR(data_source->queued_tasks_per_data, &handle, entry); if (entry) { /* Record task */ tasks[i] = entry->task; ntasks[i] = 1; /* And increment counter of the same task */ for (j = 0; j < i; j++) { if (tasks[j] == tasks[i]) { ntasks[j]++; break; } } } } /* Now find the task with most locality data for this worker */ best_n = 0; for (i = 0; i < n; i++) { if (ntasks[i] > best_n) { best_task = tasks[i]; best_n = ntasks[i]; } } if (best_n > 0) { /* found an interesting task, try to pick it! */ if (_starpu_fifo_pop_this_task(data_source->queue_array, target, best_task)) return best_task; } /* Didn't find an interesting task, or couldn't run it :( */ return _starpu_fifo_pop_task(data_source->queue_array, target); } /* Called when popping a task from a queue */ static void locality_popped_task(struct starpu_task *task, int workerid, unsigned sched_ctx_id) { struct _starpu_work_stealing_data *ws = (struct _starpu_work_stealing_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct _starpu_work_stealing_data_per_worker *data = &ws->per_worker[workerid]; unsigned i; for (i = 0; i < STARPU_TASK_GET_NBUFFERS(task); i++) if (STARPU_TASK_GET_MODE(task, i) & STARPU_LOCALITY) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, i); struct locality_entry *entry; HASH_FIND_PTR(data->queued_tasks_per_data, &handle, entry); if (STARPU_LIKELY(entry)) { if (entry->task == task) { HASH_DEL(data->queued_tasks_per_data, entry); free(entry); } } } } #else static void record_worker_locality(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, int workerid STARPU_ATTRIBUTE_UNUSED, unsigned sched_ctx_id STARPU_ATTRIBUTE_UNUSED) { } /* Called when pushing a task to a queue */ static void locality_pushed_task(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, int workerid STARPU_ATTRIBUTE_UNUSED, unsigned sched_ctx_id STARPU_ATTRIBUTE_UNUSED) { } /* Pick a task from workerid's queue, for execution on target */ static struct starpu_task *ws_pick_task(struct _starpu_work_stealing_data *ws, int source, int target) { return _starpu_fifo_pop_task(ws->per_worker[source].queue_array, target); } /* Called when popping a task from a queue */ static void locality_popped_task(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, int workerid STARPU_ATTRIBUTE_UNUSED, unsigned sched_ctx_id STARPU_ATTRIBUTE_UNUSED) { } #endif #ifdef USE_OVERLOAD /** * Return a ratio helpful to determine whether a worker is suitable to steal * tasks from or to put some tasks in its queue. * * \return a ratio with a positive or negative value, describing the current state of the worker : * a smaller value implies a faster worker with an relatively emptier queue : more suitable to put tasks in * a bigger value implies a slower worker with an reletively more replete queue : more suitable to steal tasks from */ static float overload_metric(unsigned sched_ctx_id, unsigned id) { struct _starpu_work_stealing_data *ws = (struct _starpu_work_stealing_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); float execution_ratio = 0.0f; float current_ratio = 0.0f; int nprocessed = _starpu_get_deque_nprocessed(ws->per_worker[id].queue_array); unsigned njobs = _starpu_get_deque_njobs(ws->per_worker[id].queue_array); /* Did we get enough information ? */ if (ws->performed_total > 0 && nprocessed > 0) { /* How fast or slow is the worker compared to the other workers */ execution_ratio = (float) nprocessed / ws->performed_total; /* How replete is its queue */ current_ratio = (float) njobs / nprocessed; } else { return 0.0f; } return (current_ratio - execution_ratio); } /** * Return the most suitable worker from which a task can be stolen. * The number of previously processed tasks, total and local, * and the number of tasks currently awaiting to be processed * by the tasks are taken into account to select the most suitable * worker to steal task from. */ static int select_victim_overload(unsigned sched_ctx_id) { struct _starpu_work_stealing_data *ws = (struct _starpu_work_stealing_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned worker; float worker_ratio; unsigned best_worker = 0; float best_ratio = FLT_MIN; /* Don't try to play smart until we get * enough informations. */ if (ws->performed_total < calibration_value) return select_victim_round_robin(sched_ctx_id); struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); worker_ratio = overload_metric(sched_ctx_id, worker); if (worker_ratio > best_ratio && ws->per_worker[worker].busy) { best_worker = worker; best_ratio = worker_ratio; } } return best_worker; } /** * Return the most suitable worker to whom add a task. * The number of previously processed tasks, total and local, * and the number of tasks currently awaiting to be processed * by the tasks are taken into account to select the most suitable * worker to add a task to. */ static unsigned select_worker_overload(struct starpu_task *task, unsigned sched_ctx_id) { struct _starpu_work_stealing_data *ws = (struct _starpu_work_stealing_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned worker; float worker_ratio; unsigned best_worker = 0; float best_ratio = FLT_MAX; /* Don't try to play smart until we get * enough informations. */ if (ws->performed_total < calibration_value) return select_worker_round_robin(task, sched_ctx_id); struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); worker_ratio = overload_metric(sched_ctx_id, worker); if (worker_ratio < best_ratio && starpu_worker_can_execute_task_first_impl(worker, task, NULL)) { best_worker = worker; best_ratio = worker_ratio; } } return best_worker; } #endif /* USE_OVERLOAD */ /** * Return a worker from which a task can be stolen. * This is a phony function used to call the right * function depending on the value of USE_OVERLOAD. */ static inline int select_victim(unsigned sched_ctx_id) { #ifdef USE_OVERLOAD return select_victim_overload(sched_ctx_id); #else return select_victim_round_robin(sched_ctx_id); #endif /* USE_OVERLOAD */ } /** * Return a worker from which a task can be stolen. * This is a phony function used to call the right * function depending on the value of USE_OVERLOAD. */ static inline unsigned select_worker(struct starpu_task *task, unsigned sched_ctx_id) { #ifdef USE_OVERLOAD return select_worker_overload(task, sched_ctx_id); #else return select_worker_round_robin(task, sched_ctx_id); #endif /* USE_OVERLOAD */ } /* Note: this is not scalable work stealing, use lws instead */ static struct starpu_task *ws_pop_task(unsigned sched_ctx_id) { struct _starpu_work_stealing_data *ws = (struct _starpu_work_stealing_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct starpu_task *task = NULL; unsigned workerid = starpu_worker_get_id_check(); ws->per_worker[workerid].busy = 0; #ifdef STARPU_NON_BLOCKING_DRIVERS if (STARPU_RUNNING_ON_VALGRIND || !_starpu_fifo_empty(ws->per_worker[workerid].queue_array)) #endif { STARPU_PTHREAD_MUTEX_LOCK(&ws->per_worker[workerid].worker_mutex); task = ws_pick_task(ws, workerid, workerid); if (task) locality_popped_task(task, workerid, sched_ctx_id); STARPU_PTHREAD_MUTEX_UNLOCK(&ws->per_worker[workerid].worker_mutex); } if (task) { /* there was a local task */ ws->performed_total++; ws->per_worker[workerid].busy = 1; return task; } starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond); /* While stealing, relieve mutex used to synchronize with pushers */ STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(sched_mutex); /* we need to steal someone's job */ int victim = select_victim(sched_ctx_id); if (victim == -1) { STARPU_PTHREAD_MUTEX_LOCK_SCHED(sched_mutex); return NULL; } if (STARPU_PTHREAD_MUTEX_TRYLOCK(&ws->per_worker[victim].worker_mutex)) { /* victim is busy, don't bother it, come back later */ STARPU_PTHREAD_MUTEX_LOCK_SCHED(sched_mutex); return NULL; } if (ws->per_worker[victim].queue_array != NULL && ws->per_worker[victim].queue_array->ntasks > 0) { task = ws_pick_task(ws, victim, workerid); } if (task) { ws->performed_total++; _STARPU_TRACE_WORK_STEALING(workerid, victim); _STARPU_TASK_BREAK_ON(task, sched); record_data_locality(task, workerid); record_worker_locality(task, workerid, sched_ctx_id); locality_popped_task(task, victim, sched_ctx_id); } STARPU_PTHREAD_MUTEX_UNLOCK(&ws->per_worker[victim].worker_mutex); /* Done with stealing, resynchronize with core */ STARPU_PTHREAD_MUTEX_LOCK_SCHED(sched_mutex); #ifndef STARPU_NON_BLOCKING_DRIVERS /* While stealing, perhaps somebody actually give us a task, don't miss * the opportunity to take it before going to sleep. */ if (!task) { STARPU_PTHREAD_MUTEX_LOCK(&ws->per_worker[workerid].worker_mutex); task = ws_pick_task(ws, workerid, workerid); if (task) locality_popped_task(task, workerid, sched_ctx_id); STARPU_PTHREAD_MUTEX_UNLOCK(&ws->per_worker[workerid].worker_mutex); } #endif ws->per_worker[workerid].busy = !!task; return task; } static int ws_push_task(struct starpu_task *task) { unsigned sched_ctx_id = task->sched_ctx; struct _starpu_work_stealing_data *ws = (struct _starpu_work_stealing_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); int workerid; unsigned worker = 0; struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); /* !! C'est ballot de tout locker! */ while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(worker, &sched_mutex, &sched_cond); STARPU_PTHREAD_MUTEX_LOCK_SCHED(sched_mutex); } #ifdef USE_LOCALITY workerid = select_worker_locality(task, sched_ctx_id); #else workerid = -1; #endif if (workerid == -1) workerid = starpu_worker_get_id(); /* If the current thread is not a worker but * the main thread (-1) or the current worker is not in the target * context, we find the better one to put task on its queue */ if (workerid == -1 || !starpu_sched_ctx_contains_worker(workerid, sched_ctx_id) || !starpu_worker_can_execute_task_first_impl(workerid, task, NULL)) workerid = select_worker(task, sched_ctx_id); record_data_locality(task, workerid); STARPU_AYU_ADDTOTASKQUEUE(starpu_task_get_job_id(task), workerid); STARPU_PTHREAD_MUTEX_LOCK(&ws->per_worker[workerid].worker_mutex); _STARPU_TASK_BREAK_ON(task, sched); _starpu_fifo_push_task(ws->per_worker[workerid].queue_array, task); locality_pushed_task(task, workerid, sched_ctx_id); STARPU_PTHREAD_MUTEX_UNLOCK(&ws->per_worker[workerid].worker_mutex); starpu_push_task_end(task); workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(worker, &sched_mutex, &sched_cond); #if !defined(STARPU_NON_BLOCKING_DRIVERS) || defined(STARPU_SIMGRID) starpu_wakeup_worker_locked(worker, sched_cond, sched_mutex); #endif STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(sched_mutex); } return 0; } static void ws_add_workers(unsigned sched_ctx_id, int *workerids,unsigned nworkers) { struct _starpu_work_stealing_data *ws = (struct _starpu_work_stealing_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned i; int workerid; for (i = 0; i < nworkers; i++) { workerid = workerids[i]; starpu_sched_ctx_worker_shares_tasks_lists(workerid, sched_ctx_id); ws->per_worker[workerid].queue_array = _starpu_create_fifo(); /* Tell helgrid that we are fine with getting outdated values, * this is just an estimation */ STARPU_HG_DISABLE_CHECKING(ws->per_worker[workerid].queue_array->ntasks); /** * The first WS_POP_TASK will increase NPROCESSED though no task was actually performed yet, * we need to initialize it at -1. */ ws->per_worker[workerid].queue_array->nprocessed = -1; ws->per_worker[workerid].queue_array->ntasks = 0; STARPU_PTHREAD_MUTEX_INIT(&ws->per_worker[workerid].worker_mutex, NULL); ws->per_worker[workerid].busy = 0; STARPU_HG_DISABLE_CHECKING(ws->per_worker[workerid].busy); } } static void ws_remove_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers) { struct _starpu_work_stealing_data *ws = (struct _starpu_work_stealing_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned i; int workerid; for (i = 0; i < nworkers; i++) { workerid = workerids[i]; if (ws->per_worker[workerid].queue_array != NULL) { _starpu_destroy_fifo(ws->per_worker[workerid].queue_array); ws->per_worker[workerid].queue_array = NULL; } STARPU_PTHREAD_MUTEX_DESTROY(&ws->per_worker[workerid].worker_mutex); } } static void initialize_ws_policy(unsigned sched_ctx_id) { starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); struct _starpu_work_stealing_data *ws; _STARPU_MALLOC(ws, sizeof(struct _starpu_work_stealing_data)); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)ws); ws->last_pop_worker = 0; ws->last_push_worker = 0; STARPU_HG_DISABLE_CHECKING(ws->last_pop_worker); STARPU_HG_DISABLE_CHECKING(ws->last_push_worker); /** * The first WS_POP_TASK will increase PERFORMED_TOTAL though no task was actually performed yet, * we need to initialize it at -1. */ ws->performed_total = -1; _STARPU_CALLOC(ws->per_worker, STARPU_NMAXWORKERS, sizeof(struct _starpu_work_stealing_data_per_worker)); } static void deinit_ws_policy(unsigned sched_ctx_id) { struct _starpu_work_stealing_data *ws = (struct _starpu_work_stealing_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); free(ws->per_worker); free(ws); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); } struct starpu_sched_policy _starpu_sched_ws_policy = { .init_sched = initialize_ws_policy, .deinit_sched = deinit_ws_policy, .add_workers = ws_add_workers, .remove_workers = ws_remove_workers, .push_task = ws_push_task, .pop_task = ws_pop_task, .pre_exec_hook = NULL, .post_exec_hook = NULL, .pop_every_task = NULL, .policy_name = "ws", .policy_description = "work stealing" }; starpu-1.2.3+dfsg/src/starpu_parameters.h000066400000000000000000000021321320135501600204450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2014-2015 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef _STARPU_PARAMETERS_H #define _STARPU_PARAMETERS_H /* Parameters which are not worth being added to ./configure options, but * still interesting to easily change */ /* Assumed relative performance ratios */ /* TODO: benchmark a bit instead */ #define _STARPU_CPU_ALPHA 1.0f #define _STARPU_CUDA_ALPHA 13.33f #define _STARPU_OPENCL_ALPHA 12.22f #define _STARPU_MIC_ALPHA 0.5f #define _STARPU_SCC_ALPHA 1.0f #endif /* _STARPU_PARAMETERS_H */ starpu-1.2.3+dfsg/src/top/000077500000000000000000000000001320135501600153375ustar00rootroot00000000000000starpu-1.2.3+dfsg/src/top/starpu_top.c000066400000000000000000000507471320135501600177200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 William Braik, Yann Courtois, Jean-Marie Couteyen, Anthony Roy * Copyright (C) 2011, 2012, 2013, 2016, 2017 CNRS * Copyright (C) 2016, 2017 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include extern struct _starpu_top_message_queue* _starpu_top_mt; int _starpu_top = 0; int starpu_top_debug_on = 0; unsigned int starpu_top_data_cpt = 0; unsigned int starpu_top_param_cpt = 0; struct starpu_top_data* starpu_top_first_data = NULL; struct starpu_top_param* starpu_top_first_param = NULL; struct starpu_top_data** starpu_top_datas; struct starpu_top_param** starpu_top_params; sem_t starpu_top_wait_for_go; starpu_pthread_mutex_t starpu_top_wait_for_continue_mutex; starpu_pthread_cond_t starpu_top_wait_for_continue_cond = STARPU_PTHREAD_COND_INITIALIZER; #undef _starpu_top_status_get int _starpu_top_status_get(void) { return _starpu_top; } static unsigned long long current_timestamp(void); /********************************************* *****************INIT FUNC******************** **********************************************/ static char *message_for_topdata_init(struct starpu_top_data* data); static char *message_for_topparam_init(struct starpu_top_param* param); /* * we store data and param in a tab to offer a O(1) access when the program is * running */ static void copy_data_and_param(void) { printf("%s:%d trace\n", __FILE__, __LINE__); //copying datas _STARPU_MALLOC(starpu_top_datas, starpu_top_data_cpt*sizeof(struct starpu_top_data*)); struct starpu_top_data* cur = starpu_top_first_data; unsigned int i = 0; for(i = 0; i < starpu_top_data_cpt; i++) { starpu_top_datas[i] = cur; cur = cur->next; } //copying params _STARPU_MALLOC(starpu_top_params, starpu_top_param_cpt*sizeof(struct starpu_top_param*)); struct starpu_top_param* cur2 = starpu_top_first_param; for(i = 0; i < starpu_top_param_cpt; i++) { starpu_top_params[i] = cur2; cur2 = cur2->next; } } static void starpu_top_get_device_type(int id, char* type) { enum starpu_worker_archtype device_type=starpu_worker_get_type(id); switch (device_type) { case STARPU_CPU_WORKER: strncpy(type, "CPU",9); break; case STARPU_CUDA_WORKER: strncpy(type, "CUDA",9); break; case STARPU_OPENCL_WORKER: strncpy(type, "OPENCL",9); break; case STARPU_ANY_WORKER: strncpy(type, "ANY",9); break; case STARPU_MIC_WORKER: strncpy(type, "MIC", 9); break; case STARPU_SCC_WORKER: strncpy(type, "SCC", 9); break; } type[9] = 0; } static void starpu_top_send_devices_info(void) { char *message; _STARPU_MALLOC(message, 5*sizeof(char)); snprintf(message,5,"DEV\n"); _starpu_top_message_add(_starpu_top_mt,message); unsigned int i; for(i=0;inext; } _STARPU_MALLOC(message, strlen("/DATA\n")+1); sprintf(message, "%s", "/DATA\n"); _starpu_top_message_add(_starpu_top_mt,message); //sending parameter list _STARPU_MALLOC(message, strlen("PARAMS\n")+1); sprintf(message, "%s", "PARAMS\n"); _starpu_top_message_add(_starpu_top_mt,message); struct starpu_top_param * cur_param = starpu_top_first_param; printf("%s:%d sending parameters\n", __FILE__, __LINE__); while(cur_param != NULL) { _starpu_top_message_add(_starpu_top_mt,message_for_topparam_init(cur_param)); cur_param = cur_param->next; } printf("%s:%d parameters sended\n", __FILE__, __LINE__); _STARPU_MALLOC(message, strlen("/PARAMS\n")+1); sprintf(message, "%s", "/PARAMS\n"); _starpu_top_message_add(_starpu_top_mt,message); //sending DEVICE list printf("%s:%d sending devices info\n", __FILE__, __LINE__); starpu_top_send_devices_info(); printf("%s:%d devices_info sended\n", __FILE__, __LINE__); //copying data and params copy_data_and_param(); //sending READY message _STARPU_MALLOC(message, strlen("READY\n")+1); sprintf(message, "%s", "READY\n"); _starpu_top_message_add(_starpu_top_mt,message); //This threads keeps locked while we don't receive an GO message from UI printf("%s:%d waiting for GO message\n", __FILE__, __LINE__); sem_wait(&starpu_top_wait_for_go); } void _starpu_top_shutdown(void) { { struct starpu_top_data * cur = starpu_top_first_data, * next; while (cur) { next = cur->next; free(cur); cur = next; } starpu_top_first_data = NULL; } { struct starpu_top_param * cur = starpu_top_first_param, *next; while (cur) { next = cur->next; free(cur); cur = next; } starpu_top_first_param = NULL; } } static void starpu_top_enqueue_data(struct starpu_top_data * data) { if(starpu_top_first_data == NULL) { starpu_top_first_data = data; } else { struct starpu_top_data * cur = starpu_top_first_data; while(cur->next != NULL) cur = cur->next; cur->next = data; } } struct starpu_top_data * starpu_top_add_data_boolean(const char* data_name, int active) { struct starpu_top_data *data; _STARPU_MALLOC(data, sizeof(struct starpu_top_data)); data->id = starpu_top_data_cpt++; data->name = data_name; data->type = STARPU_TOP_DATA_BOOLEAN; data->active = active; data->next = NULL; starpu_top_enqueue_data(data); return data; } struct starpu_top_data * starpu_top_add_data_integer(const char* data_name, int minimum_value, int maximum_value, int active) { struct starpu_top_data *data; _STARPU_MALLOC(data, sizeof(struct starpu_top_data)); data->id = starpu_top_data_cpt++; data->name = data_name; data->type = STARPU_TOP_DATA_INTEGER; data->int_min_value = minimum_value; data->int_max_value = maximum_value; data->active = active; data->next = NULL; starpu_top_enqueue_data(data); return data; } struct starpu_top_data* starpu_top_add_data_float(const char* data_name, double minimum_value, double maximum_value, int active) { struct starpu_top_data *data; _STARPU_MALLOC(data, sizeof(struct starpu_top_data)); data->id = starpu_top_data_cpt++; data->name = data_name; data->type = STARPU_TOP_DATA_FLOAT; data->double_min_value = minimum_value; data->double_max_value = maximum_value; data->active = active; data->next = NULL; starpu_top_enqueue_data(data); return data; } char *message_for_topdata_init(struct starpu_top_data* data) { char *message; _STARPU_MALLOC(message, 256+strlen(data->name)); switch(data->type) { case STARPU_TOP_DATA_BOOLEAN: sprintf(message, "BOOL;%u;%s;%d\n", data->id, data->name, data->active ? 1 : 0); break; case STARPU_TOP_DATA_INTEGER: sprintf(message, "INT;%u;%s;%d;%d;%d\n", data->id, data->name, data->int_min_value, data->int_max_value, data->active ? 1 : 0); break; case STARPU_TOP_DATA_FLOAT: sprintf(message, "FLOAT;%u;%s;%f;%f;%d\n", data->id, data->name, data->double_min_value, data->double_max_value, data->active ? 1 : 0); break; } return message; } char *message_for_topparam_init(struct starpu_top_param* param) { char*message = NULL; int i; int length=0; switch(param->type) { case STARPU_TOP_PARAM_BOOLEAN: _STARPU_MALLOC(message, 256); sprintf(message, "BOOL;%u;%s;%d\n", param->id, param->name, (*(int*)(param->value)) ? 1 : 0); break; case STARPU_TOP_PARAM_INTEGER: _STARPU_MALLOC(message, 256); sprintf(message, "INT;%u;%s;%d;%d;%d\n",param->id, param->name, param->int_min_value, param->int_max_value, *(int*)(param->value)); break; case STARPU_TOP_PARAM_FLOAT: _STARPU_MALLOC(message, 256); sprintf(message, "FLOAT;%u;%s;%f;%f;%f\n", param->id, param->name, param->double_min_value, param->double_max_value, *(double*)(param->value)); break; case STARPU_TOP_PARAM_ENUM: //compute message lenght for(i = 0; i < param->nb_values; i++) { length += strlen(param->enum_values[i])+1; } _STARPU_MALLOC(message, 256+length); sprintf(message, "ENUM;%u;%s;", param->id, param->name); //compute the begin of enums elements in message char* cur = message+strlen(message); //add each enum element for(i = 0; i < param->nb_values; i++) { strcpy(cur, param->enum_values[i]); cur+=strlen(cur); *cur=';'; cur++; } sprintf(cur, "%d\n", *((int*)(param->value))); break; } return message; } static void starpu_top_enqueue_param(struct starpu_top_param* param) { if(starpu_top_first_param == NULL) { starpu_top_first_param = param; } else { struct starpu_top_param * cur = starpu_top_first_param; while(cur->next != NULL) cur = cur->next; cur->next = param; } } struct starpu_top_param* starpu_top_register_parameter_boolean(const char* param_name, int* parameter_field, void (*callback)(struct starpu_top_param*)) { STARPU_ASSERT(!_starpu_top_status_get()); struct starpu_top_param *param; _STARPU_MALLOC(param, sizeof(struct starpu_top_param)); param->callback = callback; param->name = param_name; param->id = starpu_top_param_cpt++; param->type = STARPU_TOP_PARAM_BOOLEAN; param->value = (void*)parameter_field; param->next = NULL; starpu_top_enqueue_param(param); return param; } struct starpu_top_param* starpu_top_register_parameter_integer(const char* param_name, int* parameter_field, int minimum_value, int maximum_value, void (*callback)(struct starpu_top_param*)) { STARPU_ASSERT(!_starpu_top_status_get()); struct starpu_top_param *param; _STARPU_MALLOC(param, sizeof(struct starpu_top_param)); param->callback = callback; param->name = param_name; param->id = starpu_top_param_cpt++; param->type = STARPU_TOP_PARAM_INTEGER; param->value = (void*)parameter_field; param->int_min_value = minimum_value; param->int_max_value = maximum_value; param->next = NULL; starpu_top_enqueue_param(param); return param; } struct starpu_top_param* starpu_top_register_parameter_float(const char* param_name, double* parameter_field, double minimum_value, double maximum_value, void (*callback)(struct starpu_top_param*)) { STARPU_ASSERT(!_starpu_top_status_get()); struct starpu_top_param *param; _STARPU_MALLOC(param, sizeof(struct starpu_top_param)); param->callback = callback; param->name = param_name; param->id = starpu_top_param_cpt++; param->type = STARPU_TOP_PARAM_FLOAT; param->value = (void*)parameter_field; param->double_min_value = minimum_value; param->double_max_value = maximum_value; param->next = NULL; starpu_top_enqueue_param(param); return param; } struct starpu_top_param* starpu_top_register_parameter_enum(const char* param_name, int* parameter_field, char** values, int nb_values, void (*callback)(struct starpu_top_param*)) { STARPU_ASSERT(!_starpu_top_status_get()); struct starpu_top_param *param; _STARPU_MALLOC(param, sizeof(struct starpu_top_param)); param->callback = callback; param->name = param_name; param->id = starpu_top_param_cpt++; param->type = STARPU_TOP_PARAM_ENUM; param->value = (void*)parameter_field; param->enum_values = values; param->nb_values = nb_values; param->next = NULL; starpu_top_enqueue_param(param); return param; } /********************************************* *****************UPDATE FUNC****************** **********************************************/ void starpu_top_update_data_boolean(const struct starpu_top_data* data, int value) { if (!_starpu_top_status_get()) return; if(data->active) { char *message; _STARPU_MALLOC(message, 256+strlen(data->name)); sprintf(message, "U;%u;%d;%llu\n", data->id, (value?1:0), current_timestamp()); _starpu_top_message_add(_starpu_top_mt,message); } } void starpu_top_update_data_integer(const struct starpu_top_data* data, int value) { if (!_starpu_top_status_get()) return; if(data->active) { char *message; _STARPU_MALLOC(message, 256+strlen(data->name)); sprintf(message, "U;%u;%d;%llu\n", data->id, value, current_timestamp()); _starpu_top_message_add(_starpu_top_mt,message); } } void starpu_top_update_data_float(const struct starpu_top_data* data, double value) { if (!_starpu_top_status_get()) return; if(data->active) { char *message; _STARPU_MALLOC(message, 256+strlen(data->name)); sprintf(message, "U;%u;%f;%llu\n", data->id, value, current_timestamp()); _starpu_top_message_add(_starpu_top_mt,message); } } void starpu_top_update_parameter(const struct starpu_top_param* param) { if (!_starpu_top_status_get()) return; char *message; _STARPU_MALLOC(message, 50); switch(param->type) { case STARPU_TOP_PARAM_BOOLEAN: case STARPU_TOP_PARAM_INTEGER: case STARPU_TOP_PARAM_ENUM: sprintf(message, "SET;%u;%d;%llu\n", param->id, *((int*)param->value), current_timestamp()); break; case STARPU_TOP_PARAM_FLOAT: sprintf(message, "SET;%u;%f;%llu\n", param->id, *((double*)param->value), current_timestamp()); break; } _starpu_top_message_add(_starpu_top_mt,message); } /********************************************* *****************DEBUG FUNC****************** **********************************************/ void starpu_top_debug_log(const char* debug_message) { if(starpu_top_debug_on) { //length can be up to strlen*2, if message contains only unwanted chars char *message; _STARPU_MALLOC(message, strlen(debug_message)*2+16); sprintf(message,"MESSAGE;"); //escape unwanted char : ; and \n char* cur = message+8; while(*debug_message!='\0') { if(*debug_message=='\n' || *debug_message==';') { *cur='\\'; cur++; } *cur = *debug_message; cur++; debug_message++; } *cur='\n'; cur++; *cur='\0'; _starpu_top_message_add(_starpu_top_mt,message); } } void starpu_top_debug_lock(const char* debug_message) { if(starpu_top_debug_on) { char *message; _STARPU_MALLOC(message, strlen(debug_message)*2+16); sprintf(message,"LOCK;"); char* cur = message+5; while(*debug_message!='\0') { if(*debug_message=='\n' || *debug_message==';') { *cur='\\'; cur++; } *cur = *debug_message; cur++; debug_message++; } *cur='\n'; *(cur+1)='\0'; _starpu_top_message_add(_starpu_top_mt,message); //This threads keeps locked while we don't receive an STEP message STARPU_PTHREAD_MUTEX_LOCK(&starpu_top_wait_for_continue_mutex); STARPU_PTHREAD_COND_WAIT(&starpu_top_wait_for_continue_cond, &starpu_top_wait_for_continue_mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&starpu_top_wait_for_continue_mutex); } } /******************************************** **************TIME FUNCTION**************** *******************************************/ unsigned long long current_timestamp(void) { struct timespec now; _starpu_clock_gettime(&now); return _starpu_top_timing_timespec_to_ms(&now); } unsigned long long _starpu_top_timing_timespec_to_ms(const struct timespec *ts) { return (1000.0*ts->tv_sec) + (0.000001*ts->tv_nsec); } /******************************************** **************INPUT PROCESSING************** *******************************************/ static enum starpu_top_message_type starpu_top_get_message_type(const char* message) { if(!strncmp("GO\n", message,3)) return TOP_TYPE_GO; else if(!strncmp("SET;", message,4)) return TOP_TYPE_SET; else if(!strncmp("STEP\n", message,9)) return TOP_TYPE_CONTINUE; else if(!strncmp("ENABLE;", message,7)) return TOP_TYPE_ENABLE; else if(!strncmp("DISABLE;", message,8)) return TOP_TYPE_DISABLE; else if(!strncmp("DEBUG;", message,6)) return TOP_TYPE_DEBUG; else return TOP_TYPE_UNKNOW; } static void starpu_top_unlock_starpu(void) { sem_post(&starpu_top_wait_for_go); printf("%s:%d starpu started\n", __FILE__, __LINE__); } static void starpu_top_change_data_active(char* message, int active) { char* debut = strstr(message, ";")+1; char* fin = strstr(debut+1, "\n"); *fin = '\0'; int data_id = atoi(debut); printf("%s:%d data %d %s\n", __FILE__, __LINE__, data_id, active ? "ENABLED" : "DISABLE"); starpu_top_datas[data_id]->active = active; } static void starpu_top_change_parameter_value(const char* message) { const char*tmp = strstr(message, ";")+1; int param_id = atoi(tmp); struct starpu_top_param* param = starpu_top_params[param_id]; tmp = strstr(tmp+1,";")+1; int* val_ptr_int; double* val_ptr_double; switch(param->type) { case STARPU_TOP_PARAM_BOOLEAN: case STARPU_TOP_PARAM_INTEGER: val_ptr_int = (int*)param->value; *val_ptr_int = atoi(tmp); break; case STARPU_TOP_PARAM_FLOAT: val_ptr_double = (double*)param->value; *val_ptr_double = atof(tmp); break; case STARPU_TOP_PARAM_ENUM: val_ptr_int = (int*)param->value; *val_ptr_int = atoi(tmp); break; } if(param->callback != NULL) param->callback(param); } static void starpu_top_change_debug_mode(const char*message) { const char* debut = strstr(message, ";")+1; if(!strncmp("ON",debut, 2)) { starpu_top_debug_on = 1; printf("%s:%d debug is now ON\n", __FILE__, __LINE__); } else { starpu_top_debug_on = 0; printf("%s:%d debug is now OFF\n", __FILE__, __LINE__); } char *m; _STARPU_MALLOC(m, strlen(message)+1); sprintf(m,"%s",message); _starpu_top_message_add(_starpu_top_mt,m); } /* * Unlock starpu if it was locked in debug state */ static void starpu_top_debug_next_step(void) { STARPU_PTHREAD_COND_SIGNAL(&starpu_top_wait_for_continue_cond); } void _starpu_top_process_input_message(char *buffer) { enum starpu_top_message_type message_type = starpu_top_get_message_type(buffer); switch(message_type) { case TOP_TYPE_GO: starpu_top_unlock_starpu(); break; case TOP_TYPE_ENABLE: starpu_top_change_data_active(buffer, 1); break; case TOP_TYPE_DISABLE: starpu_top_change_data_active(buffer, 0); break; case TOP_TYPE_SET: starpu_top_change_parameter_value(buffer); break; case TOP_TYPE_DEBUG: starpu_top_change_debug_mode(buffer); break; case TOP_TYPE_CONTINUE: starpu_top_debug_next_step(); break; default: printf("%s:%d unknow message : '%s'\n", __FILE__, __LINE__, buffer); } } starpu-1.2.3+dfsg/src/top/starpu_top_connection.c000066400000000000000000000110421320135501600221200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 William Braik, Yann Courtois, Jean-Marie Couteyen, Anthony * Roy * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifdef __MINGW32__ # define WINVER 0x0501 /* WindowsXP, for getaddrinfo */ #endif #include #ifdef STARPU_HAVE_WINDOWS # include # include # include #else # include # include # include #endif #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif const char *STARPU_TOP_PORT = "2011"; const int STARPU_TOP_BUFFER_SIZE=1024; //client socket after fopen FILE* starpu_top_socket_fd_read; FILE* starpu_top_socket_fd_write; //client socket (file descriptor) int starpu_top_socket_fd; static void * message_from_ui(void * p) { (void) p; char str[STARPU_TOP_BUFFER_SIZE]; starpu_pthread_setname("starpu_top_message_from_ui"); while(1) { char * check=fgets (str, STARPU_TOP_BUFFER_SIZE, starpu_top_socket_fd_read); printf("Message from UI : %s",str); if (check) { _starpu_top_process_input_message(str); } else { fprintf(stderr,"Connection dropped\n"); //unlocking StarPU. _starpu_top_process_input_message("GO\n"); _starpu_top_process_input_message("DEBUG;OFF\n"); _starpu_top_process_input_message("STEP\n"); return NULL; } } } static void * message_to_ui(void * p) { (void) p; starpu_pthread_setname("starpu_top_message_to_ui"); while(1) { char* message = _starpu_top_message_remove(_starpu_top_mt); int len=strlen(message); int check=fwrite(message, sizeof(char), len, starpu_top_socket_fd_write); int check2=fflush(starpu_top_socket_fd_write); free(message); if (check!=len || check2==EOF ) { fprintf(stderr,"Connection dropped : message no longer send\n"); while(1) { message=_starpu_top_message_remove(_starpu_top_mt); free(message); } } } return NULL; } void _starpu_top_communications_threads_launcher(void) { starpu_pthread_t from_ui; starpu_pthread_t to_ui; starpu_pthread_attr_t threads_attr; //Connection to UI & Socket Initilization printf("%s:%d Connection to UI initilization\n",__FILE__, __LINE__); struct sockaddr_storage from; struct addrinfo req, *ans; int code; req.ai_flags = AI_PASSIVE; req.ai_family = PF_UNSPEC; req.ai_socktype = SOCK_STREAM; req.ai_protocol = 0; if ((code = getaddrinfo(NULL, STARPU_TOP_PORT, &req, &ans)) != 0) { fprintf(stderr, " getaddrinfo failed %d\n", code); exit(EXIT_FAILURE); } int sock=socket(ans->ai_family, ans->ai_socktype, ans->ai_protocol); if (sock < 0) { perror("socket"); exit(EXIT_FAILURE); } int optval = 1; if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void*) &optval, sizeof(optval)) == -1) { perror("setsockopt"); exit(EXIT_FAILURE); } if (bind(sock, ans->ai_addr, ans->ai_addrlen) < 0) { perror("bind"); exit(EXIT_FAILURE); } freeaddrinfo(ans); listen(sock, 2); socklen_t len = sizeof(from); if ((starpu_top_socket_fd=accept(sock, (struct sockaddr *) &from, &len)) ==-1) { fprintf(stderr, "accept error\n"); perror("accept"); exit(EXIT_FAILURE); } if ( (starpu_top_socket_fd_read=fdopen(starpu_top_socket_fd, "r")) == NULL) { perror("fdopen"); exit(EXIT_FAILURE); } starpu_top_socket_fd=dup(starpu_top_socket_fd); if (starpu_top_socket_fd == -1) { perror("dup"); exit(EXIT_FAILURE); } if ((starpu_top_socket_fd_write=fdopen(starpu_top_socket_fd, "w")) == NULL) { perror("fdopen"); exit(EXIT_FAILURE); } close(sock); //Threads creation fprintf(stderr,"Threads Creation\n"); starpu_pthread_attr_init(&threads_attr); starpu_pthread_attr_setdetachstate(&threads_attr, PTHREAD_CREATE_DETACHED); STARPU_PTHREAD_CREATE(&from_ui, &threads_attr, message_from_ui, NULL); STARPU_PTHREAD_CREATE(&to_ui, &threads_attr, message_to_ui, NULL); } starpu-1.2.3+dfsg/src/top/starpu_top_connection.h000066400000000000000000000025401320135501600221300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 William Braik, Yann Courtois, Jean-Marie Couteyen, Anthony * Roy * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_TOP_CONNECTION_H__ #define __STARPU_TOP_CONNECTION_H__ #include #include #include #ifdef __cplusplus extern "C" { #endif extern struct _starpu_top_message_queue* _starpu_top_mt; /* * This function initialize the two communications threads. * It initializes the connection and then launches the threads. * The function wait the UI connection before launching the threads. * About mt : mt MUST be allocated before call. * All messages in the queue are freed after used. */ void _starpu_top_communications_threads_launcher(void); #ifdef __cplusplus } #endif #endif // __STARPU_TOP_CONNECTION_H__ starpu-1.2.3+dfsg/src/top/starpu_top_core.h000066400000000000000000000037631320135501600207310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 William Braik, Yann Courtois, Jean-Marie Couteyen, Anthony Roy * Copyright (C) 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include struct starpu_task; /* * Convert timespec to ms */ unsigned long long _starpu_top_timing_timespec_to_ms(const struct timespec *ts); /* * This function returns 1 if starpu_top is initialized. 0 otherwise. */ extern int _starpu_top; void _starpu_top_shutdown(void); int _starpu_top_status_get(void); #define _starpu_top_status_get() _starpu_top /* * This functions notify UI than the task has started or ended */ void _starpu_top_task_started(struct starpu_task *task, int devid, const struct timespec* ts); void _starpu_top_task_ended(struct starpu_task *task, int devid, const struct timespec* ts ); /* * This functions notify UI than the task have been planed to * run from timestamp_begin to timestamp_end, on computation-core */ void __starpu_top_task_prevision_timespec(struct starpu_task *task, int devid, const struct timespec* start, const struct timespec* end); void starpu_top_task_prevision(struct starpu_task *task, int devid, unsigned long long start, unsigned long long end); /**************************************************** ***************** Callback function ***************** *****************************************************/ void _starpu_top_process_input_message(char *message); starpu-1.2.3+dfsg/src/top/starpu_top_message_queue.c000066400000000000000000000055011320135501600226140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 William Braik, Yann Courtois, Jean-Marie Couteyen, Anthony * Roy * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "starpu_top_message_queue.h" #include #include #include #include //this global queue is used both by API and by network threads struct _starpu_top_message_queue* _starpu_top_mt = NULL; /* Will always return the pointer to starpu_top_message_queue */ struct _starpu_top_message_queue* _starpu_top_message_add(struct _starpu_top_message_queue* s, char* msg) { if( NULL == s ) { printf("Queue not initialized\n"); free(msg); return s; } struct _starpu_top_message_queue_item* p = (struct _starpu_top_message_queue_item *) malloc( 1 * sizeof(*p) ); STARPU_PTHREAD_MUTEX_LOCK(&(s->mutex)); if( NULL == p ) { fprintf(stderr, "IN %s, %s: malloc() failed\n", __FILE__, "list_add"); free(msg); STARPU_PTHREAD_MUTEX_UNLOCK(&(s->mutex)); return s; } p->message = msg; p->next = NULL; if( NULL == s->head && NULL == s->tail ) { /* printf("Empty list, adding p->num: %d\n\n", p->num); */ sem_post(&(s->semaphore)); s->head = s->tail = p; STARPU_PTHREAD_MUTEX_UNLOCK(&(s->mutex)); return s; } else { /* printf("List not empty, adding element to tail\n"); */ sem_post(&(s->semaphore)); s->tail->next = p; s->tail = p; } STARPU_PTHREAD_MUTEX_UNLOCK(&(s->mutex)); return s; } //this is a queue and it is FIFO, so we will always remove the first element char* _starpu_top_message_remove(struct _starpu_top_message_queue* s) { if( NULL == s ) { printf("List is null\n"); return NULL; } sem_wait(&(s->semaphore)); struct _starpu_top_message_queue_item* h = NULL; struct _starpu_top_message_queue_item* p = NULL; STARPU_PTHREAD_MUTEX_LOCK(&(s->mutex)); h = s->head; p = h->next; char* value = h->message; free(h); s->head = p; if( NULL == s->head ) //the element tail was pointing to is free(), so we need an update s->tail = s->head; STARPU_PTHREAD_MUTEX_UNLOCK(&(s->mutex)); return value; } struct _starpu_top_message_queue* _starpu_top_message_queue_new(void) { struct _starpu_top_message_queue *p; _STARPU_MALLOC(p, sizeof(*p)); p->head = p->tail = NULL; sem_init(&(p->semaphore),0,0); STARPU_PTHREAD_MUTEX_INIT(&(p->mutex), NULL); return p; } starpu-1.2.3+dfsg/src/top/starpu_top_message_queue.h000066400000000000000000000027211320135501600226220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 William Braik, Yann Courtois, Jean-Marie Couteyen, Anthony * Roy * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #ifndef __STARPU_TOP_MESSAGE_QUEUE_H__ #define __STARPU_TOP_MESSAGE_QUEUE_H__ struct _starpu_top_message_queue_item { char *message; struct _starpu_top_message_queue_item* next; }; struct _starpu_top_message_queue { struct _starpu_top_message_queue_item* head; struct _starpu_top_message_queue_item* tail; sem_t semaphore; starpu_pthread_mutex_t mutex; }; struct _starpu_top_message_queue *_starpu_top_message_add(struct _starpu_top_message_queue*, char*); char* _starpu_top_message_remove(struct _starpu_top_message_queue*); struct _starpu_top_message_queue* _starpu_top_message_queue_new(); struct _starpu_top_message_queue* _starpu_top_message_queue_free(struct _starpu_top_message_queue*); #endif starpu-1.2.3+dfsg/src/top/starpu_top_task.c000066400000000000000000000055271320135501600207360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 William Braik, Yann Courtois, Jean-Marie Couteyen, Anthony Roy * Copyright (C) 2011, 2013, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include /******************************************** **************TASK RELATED FUNCTIONS******** *******************************************/ void _starpu_top_task_started(struct starpu_task *task, int devid, const struct timespec *ts) { unsigned long long taskid = _starpu_get_job_associated_to_task(task)->job_id; STARPU_ASSERT(_starpu_top_status_get()); char *str; _STARPU_MALLOC(str, sizeof(char)*64); snprintf(str, 64, "START;%llu;%d;%llu\n", taskid, devid, _starpu_top_timing_timespec_to_ms(ts)); _starpu_top_message_add(_starpu_top_mt, str); } void _starpu_top_task_ended(struct starpu_task *task, int devid, const struct timespec *ts) { unsigned long long taskid = _starpu_get_job_associated_to_task(task)->job_id; (void) devid; //unused STARPU_ASSERT(_starpu_top_status_get()); char *str; _STARPU_MALLOC(str, sizeof(char)*64); snprintf(str, 64, "END;%llu;%llu\n", taskid, _starpu_top_timing_timespec_to_ms(ts)); _starpu_top_message_add(_starpu_top_mt, str); } void __starpu_top_task_prevision_timespec(struct starpu_task *task, int devid, const struct timespec* start, const struct timespec* end) { starpu_top_task_prevision(task, devid, _starpu_top_timing_timespec_to_ms(start), _starpu_top_timing_timespec_to_ms(end)); } void starpu_top_task_prevision(struct starpu_task *task, int devid, unsigned long long start, unsigned long long end) { if (!_starpu_top_status_get()) return; unsigned long long taskid = _starpu_get_job_associated_to_task(task)->job_id; STARPU_ASSERT(_starpu_top_status_get()); struct timespec now; _starpu_clock_gettime(&now); char *str; _STARPU_MALLOC(str, sizeof(char)*200); snprintf(str, 128, "PREV;%llu;%d;%llu;%llu;%llu\n", taskid, devid, _starpu_top_timing_timespec_to_ms(&now), start, end); _starpu_top_message_add(_starpu_top_mt, str); } starpu-1.2.3+dfsg/src/util/000077500000000000000000000000001320135501600155125ustar00rootroot00000000000000starpu-1.2.3+dfsg/src/util/execute_on_all.c000066400000000000000000000102161320135501600206440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include struct wrapper_func_args { void (*func)(void *); void *arg; }; static void wrapper_func(void *buffers[] STARPU_ATTRIBUTE_UNUSED, void *_args) { struct wrapper_func_args *args = (struct wrapper_func_args *) _args; args->func(args->arg); } /** * Execute func(arg) on the given workers. */ void starpu_execute_on_specific_workers(void (*func)(void*), void * arg, unsigned num_workers, unsigned * workers, const char * name) { int ret; unsigned w; struct starpu_task *tasks[STARPU_NMAXWORKERS]; /* create a wrapper codelet */ struct starpu_codelet wrapper_cl = { .where = 0xFF, .cuda_funcs = {wrapper_func}, .cpu_funcs = {wrapper_func}, .opencl_funcs = {wrapper_func}, /* XXX we do not handle Cell .. */ .nbuffers = 0, .name = name }; struct wrapper_func_args args = { .func = func, .arg = arg }; for (w = 0; w < num_workers; w++) { unsigned worker = workers[w]; tasks[w] = starpu_task_create(); tasks[w]->name = name; tasks[w]->cl = &wrapper_cl; tasks[w]->cl_arg = &args; tasks[w]->execute_on_a_specific_worker = 1; tasks[w]->workerid = worker; tasks[w]->detach = 0; tasks[w]->destroy = 0; _starpu_exclude_task_from_dag(tasks[w]); ret = starpu_task_submit(tasks[w]); if (ret == -ENODEV) { /* if the worker is not able to execute this tasks, we * don't insist as this means the worker is not * designated by the "where" bitmap */ starpu_task_destroy(tasks[w]); tasks[w] = NULL; } } for (w= 0; w < num_workers; w++) { if (tasks[w]) { ret = starpu_task_wait(tasks[w]); STARPU_ASSERT(!ret); starpu_task_destroy(tasks[w]); } } } /* execute func(arg) on each worker that matches the "where" flag */ void starpu_execute_on_each_worker_ex(void (*func)(void *), void *arg, uint32_t where, const char * name) { int ret; unsigned worker; unsigned nworkers = starpu_worker_get_count(); struct starpu_task *tasks[STARPU_NMAXWORKERS]; /* This method only work on CPU, CUDA, OPENCL */ STARPU_ASSERT((where & ~STARPU_CPU & ~STARPU_CUDA & ~STARPU_OPENCL) == 0); /* create a wrapper codelet */ struct starpu_codelet wrapper_cl = { .where = where, .cuda_funcs = {wrapper_func}, .cpu_funcs = {wrapper_func}, .opencl_funcs = {wrapper_func}, .nbuffers = 0, .name = (name != NULL ? name : "execute_on_all_wrapper") }; struct wrapper_func_args args = { .func = func, .arg = arg }; for (worker = 0; worker < nworkers; worker++) { tasks[worker] = starpu_task_create(); tasks[worker]->name = wrapper_cl.name; tasks[worker]->cl = &wrapper_cl; tasks[worker]->cl_arg = &args; tasks[worker]->execute_on_a_specific_worker = 1; tasks[worker]->workerid = worker; tasks[worker]->detach = 0; tasks[worker]->destroy = 0; _starpu_exclude_task_from_dag(tasks[worker]); ret = _starpu_task_submit_internally(tasks[worker]); if (ret == -ENODEV) { /* if the worker is not able to execute this task, we * don't insist as this means the worker is not * designated by the "where" bitmap */ starpu_task_destroy(tasks[worker]); tasks[worker] = NULL; } } for (worker = 0; worker < nworkers; worker++) { if (tasks[worker]) { ret = starpu_task_wait(tasks[worker]); STARPU_ASSERT(!ret); starpu_task_destroy(tasks[worker]); } } } void starpu_execute_on_each_worker(void (*func)(void *), void *arg, uint32_t where) { starpu_execute_on_each_worker_ex(func, arg, where, NULL); } starpu-1.2.3+dfsg/src/util/file.c000066400000000000000000000020561320135501600166000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2016 Université de Bordeaux * Copyright (C) 2010, 2011 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include void _starpu_drop_comments(FILE *f) { while(1) { int c = getc(f); switch (c) { case '#': { char s[128]; char *ret; do { ret = fgets(s, sizeof(s), f); } while (ret && (!strchr(s, '\n'))); continue; } case '\n': continue; default: ungetc(c, f); return; } } } starpu-1.2.3+dfsg/src/util/fstarpu.c000066400000000000000000000524111320135501600173450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #define _FSTARPU_ERROR(msg) do {fprintf(stderr, "fstarpu error: %s\n", (msg));abort();} while(0) typedef void (*_starpu_callback_func_t)(void *); static const intptr_t fstarpu_r = STARPU_R; static const intptr_t fstarpu_w = STARPU_W; static const intptr_t fstarpu_rw = STARPU_RW; static const intptr_t fstarpu_scratch = STARPU_SCRATCH; static const intptr_t fstarpu_redux = STARPU_REDUX; static const intptr_t fstarpu_commute = STARPU_COMMUTE; static const intptr_t fstarpu_ssend = STARPU_SSEND; static const intptr_t fstarpu_locality = STARPU_LOCALITY; static const intptr_t fstarpu_data_array = STARPU_DATA_ARRAY; static const intptr_t fstarpu_data_mode_array = STARPU_DATA_MODE_ARRAY; static const intptr_t fstarpu_cl_args = STARPU_CL_ARGS; static const intptr_t fstarpu_callback = STARPU_CALLBACK; static const intptr_t fstarpu_callback_with_arg = STARPU_CALLBACK_WITH_ARG; static const intptr_t fstarpu_callback_arg = STARPU_CALLBACK_ARG; static const intptr_t fstarpu_prologue_callback = STARPU_PROLOGUE_CALLBACK; static const intptr_t fstarpu_prologue_callback_arg = STARPU_PROLOGUE_CALLBACK_ARG; static const intptr_t fstarpu_prologue_callback_pop = STARPU_PROLOGUE_CALLBACK_POP; static const intptr_t fstarpu_prologue_callback_pop_arg = STARPU_PROLOGUE_CALLBACK_POP_ARG; static const intptr_t fstarpu_priority = STARPU_PRIORITY; static const intptr_t fstarpu_execute_on_node = STARPU_EXECUTE_ON_NODE; static const intptr_t fstarpu_execute_on_data = STARPU_EXECUTE_ON_DATA; static const intptr_t fstarpu_execute_on_worker = STARPU_EXECUTE_ON_WORKER; static const intptr_t fstarpu_worker_order = STARPU_WORKER_ORDER; static const intptr_t fstarpu_hypervisor_tag = STARPU_HYPERVISOR_TAG; static const intptr_t fstarpu_possibly_parallel = STARPU_POSSIBLY_PARALLEL; static const intptr_t fstarpu_flops = STARPU_FLOPS; static const intptr_t fstarpu_tag = STARPU_TAG; static const intptr_t fstarpu_tag_only = STARPU_TAG_ONLY; static const intptr_t fstarpu_name = STARPU_NAME; static const intptr_t fstarpu_node_selection_policy = STARPU_NODE_SELECTION_POLICY; static const intptr_t fstarpu_value = STARPU_VALUE; static const intptr_t fstarpu_sched_ctx = STARPU_SCHED_CTX; static const intptr_t fstarpu_cpu_worker = STARPU_CPU_WORKER; static const intptr_t fstarpu_cuda_worker = STARPU_CUDA_WORKER; static const intptr_t fstarpu_opencl_worker = STARPU_OPENCL_WORKER; static const intptr_t fstarpu_mic_worker = STARPU_MIC_WORKER; static const intptr_t fstarpu_scc_worker = STARPU_SCC_WORKER; static const intptr_t fstarpu_any_worker = STARPU_ANY_WORKER; static const intptr_t fstarpu_nmaxbufs = STARPU_NMAXBUFS; static const intptr_t fstarpu_sched_ctx_policy_name = STARPU_SCHED_CTX_POLICY_NAME; static const intptr_t fstarpu_sched_ctx_policy_struct = STARPU_SCHED_CTX_POLICY_STRUCT; static const intptr_t fstarpu_sched_ctx_policy_min_prio = STARPU_SCHED_CTX_POLICY_MIN_PRIO; static const intptr_t fstarpu_sched_ctx_policy_max_prio = STARPU_SCHED_CTX_POLICY_MAX_PRIO; static const intptr_t fstarpu_sched_ctx_hierarchy_level = STARPU_SCHED_CTX_HIERARCHY_LEVEL; static const intptr_t fstarpu_sched_ctx_nested = STARPU_SCHED_CTX_NESTED; static const intptr_t fstarpu_sched_ctx_awake_workers = STARPU_SCHED_CTX_AWAKE_WORKERS; static const intptr_t fstarpu_starpu_nowhere = STARPU_NOWHERE; static const intptr_t fstarpu_starpu_cpu = STARPU_CPU; static const intptr_t fstarpu_starpu_cuda = STARPU_CUDA; static const intptr_t fstarpu_starpu_opencl = STARPU_OPENCL; static const intptr_t fstarpu_starpu_mic = STARPU_MIC; static const intptr_t fstarpu_starpu_scc = STARPU_SCC; static const intptr_t fstarpu_starpu_codelet_simgrid_execute = STARPU_CODELET_SIMGRID_EXECUTE; static const intptr_t fstarpu_starpu_cuda_async = STARPU_CUDA_ASYNC; static const intptr_t fstarpu_starpu_opencl_async = STARPU_OPENCL_ASYNC; intptr_t fstarpu_get_constant(char *s) { if (!strcmp(s, "FSTARPU_R")) { return fstarpu_r; } else if (!strcmp(s, "FSTARPU_W")) { return fstarpu_w; } else if (!strcmp(s, "FSTARPU_RW")) { return fstarpu_rw; } else if (!strcmp(s, "FSTARPU_SCRATCH")) { return fstarpu_scratch; } else if (!strcmp(s, "FSTARPU_REDUX")) { return fstarpu_redux; } else if (!strcmp(s, "FSTARPU_COMMUTE")) { return fstarpu_commute; } else if (!strcmp(s, "FSTARPU_SSEND")) { return fstarpu_ssend; } else if (!strcmp(s, "FSTARPU_LOCALITY")) { return fstarpu_locality; } else if (!strcmp(s, "FSTARPU_DATA_ARRAY")) { return fstarpu_data_array; } else if (!strcmp(s, "FSTARPU_DATA_MODE_ARRAY")) { return fstarpu_data_mode_array; } else if (!strcmp(s, "FSTARPU_CL_ARGS")) { return fstarpu_cl_args; } else if (!strcmp(s, "FSTARPU_CALLBACK")) { return fstarpu_callback; } else if (!strcmp(s, "FSTARPU_CALLBACK_WITH_ARG")) { return fstarpu_callback_with_arg; } else if (!strcmp(s, "FSTARPU_CALLBACK_ARG")) { return fstarpu_callback_arg; } else if (!strcmp(s, "FSTARPU_PROLOGUE_CALLBACK")) { return fstarpu_prologue_callback; } else if (!strcmp(s, "FSTARPU_PROLOGUE_CALLBACK_ARG")) { return fstarpu_prologue_callback_arg; } else if (!strcmp(s, "FSTARPU_PROLOGUE_CALLBACK_POP")) { return fstarpu_prologue_callback_pop; } else if (!strcmp(s, "FSTARPU_PROLOGUE_CALLBACK_POP_ARG")) { return fstarpu_prologue_callback_pop_arg; } else if (!strcmp(s, "FSTARPU_PRIORITY")) { return fstarpu_priority; } else if (!strcmp(s, "FSTARPU_EXECUTE_ON_NODE")) { return fstarpu_execute_on_node; } else if (!strcmp(s, "FSTARPU_EXECUTE_ON_DATA")) { return fstarpu_execute_on_data; } else if (!strcmp(s, "FSTARPU_EXECUTE_ON_WORKER")) { return fstarpu_execute_on_worker; } else if (!strcmp(s, "FSTARPU_WORKER_ORDER")) { return fstarpu_worker_order; } else if (!strcmp(s, "FSTARPU_HYPERVISOR_TAG")) { return fstarpu_hypervisor_tag; } else if (!strcmp(s, "FSTARPU_POSSIBLY_PARALLEL")) { return fstarpu_possibly_parallel; } else if (!strcmp(s, "FSTARPU_FLOPS")) { return fstarpu_flops; } else if (!strcmp(s, "FSTARPU_TAG")) { return fstarpu_tag; } else if (!strcmp(s, "FSTARPU_TAG_ONLY")) { return fstarpu_tag_only; } else if (!strcmp(s, "FSTARPU_NAME")) { return fstarpu_name; } else if (!strcmp(s, "FSTARPU_NODE_SELECTION_POLICY")) { return fstarpu_node_selection_policy; } else if (!strcmp(s, "FSTARPU_VALUE")) { return fstarpu_value; } else if (!strcmp(s, "FSTARPU_SCHED_CTX")) { return fstarpu_sched_ctx; } else if (!strcmp(s, "FSTARPU_CPU_WORKER")) { return fstarpu_cpu_worker; } else if (!strcmp(s, "FSTARPU_CUDA_WORKER")) { return fstarpu_cuda_worker; } else if (!strcmp(s, "FSTARPU_OPENCL_WORKER")) { return fstarpu_opencl_worker; } else if (!strcmp(s, "FSTARPU_MIC_WORKER")) { return fstarpu_mic_worker; } else if (!strcmp(s, "FSTARPU_SCC_WORKER")) { return fstarpu_scc_worker; } else if (!strcmp(s, "FSTARPU_ANY_WORKER")) { return fstarpu_any_worker; } else if (!strcmp(s, "FSTARPU_NMAXBUFS")) { return fstarpu_nmaxbufs; } else if (!strcmp(s, "FSTARPU_SCHED_CTX_POLICY_NAME")) { return fstarpu_sched_ctx_policy_name; } else if (!strcmp(s, "FSTARPU_SCHED_CTX_POLICY_STRUCT")) { return fstarpu_sched_ctx_policy_struct; } else if (!strcmp(s, "FSTARPU_SCHED_CTX_POLICY_MIN_PRIO")) { return fstarpu_sched_ctx_policy_min_prio; } else if (!strcmp(s, "FSTARPU_SCHED_CTX_POLICY_MAX_PRIO")) { return fstarpu_sched_ctx_policy_max_prio; } else if (!strcmp(s, "FSTARPU_SCHED_CTX_HIERARCHY_LEVEL")) { return fstarpu_sched_ctx_hierarchy_level; } else if (!strcmp(s, "FSTARPU_SCHED_CTX_NESTED")) { return fstarpu_sched_ctx_nested; } else if (!strcmp(s, "FSTARPU_SCHED_CTX_AWAKE_WORKERS")) { return fstarpu_sched_ctx_awake_workers; } else if (!strcmp(s, "FSTARPU_NOWHERE")) { return fstarpu_starpu_nowhere; } else if (!strcmp(s, "FSTARPU_CPU")) { return fstarpu_starpu_cpu; } else if (!strcmp(s, "FSTARPU_CUDA")) { return fstarpu_starpu_cuda; } else if (!strcmp(s, "FSTARPU_OPENCL")) { return fstarpu_starpu_opencl; } else if (!strcmp(s, "FSTARPU_MIC")) { return fstarpu_starpu_mic; } else if (!strcmp(s, "FSTARPU_SCC")) { return fstarpu_starpu_scc; } else if (!strcmp(s, "FSTARPU_CODELET_SIMGRID_EXECUTE")) { return fstarpu_starpu_codelet_simgrid_execute; } else if (!strcmp(s, "FSTARPU_CUDA_ASYNC")) { return fstarpu_starpu_cuda_async; } else if (!strcmp(s, "FSTARPU_OPENCL_ASYNC")) { return fstarpu_starpu_opencl_async; } else { _FSTARPU_ERROR("unknown constant"); } } struct starpu_conf *fstarpu_conf_allocate(void) { struct starpu_conf *conf; _STARPU_MALLOC(conf, sizeof(*conf)); starpu_conf_init(conf); return conf; } void fstarpu_conf_free(struct starpu_conf *conf) { memset(conf, 0, sizeof(*conf)); free(conf); } void fstarpu_conf_set_sched_policy_name(struct starpu_conf *conf, const char *sched_policy_name) { conf->sched_policy_name = sched_policy_name; } void fstarpu_conf_set_min_prio(struct starpu_conf *conf, int min_prio) { conf->global_sched_ctx_min_priority = min_prio; } void fstarpu_conf_set_max_prio(struct starpu_conf *conf, int max_prio) { conf->global_sched_ctx_max_priority = max_prio; } void fstarpu_conf_set_ncpu(struct starpu_conf *conf, int ncpu) { STARPU_ASSERT(ncpu >= 0 && ncpu <= STARPU_NMAXWORKERS); conf->ncpus = ncpu; } void fstarpu_conf_set_ncuda(struct starpu_conf *conf, int ncuda) { STARPU_ASSERT(ncuda >= 0 && ncuda <= STARPU_NMAXWORKERS); conf->ncuda = ncuda; } void fstarpu_conf_set_nopencl(struct starpu_conf *conf, int nopencl) { STARPU_ASSERT(nopencl >= 0 && nopencl <= STARPU_NMAXWORKERS); conf->nopencl = nopencl; } void fstarpu_conf_set_nmic(struct starpu_conf *conf, int nmic) { STARPU_ASSERT(nmic >= 0 && nmic <= STARPU_NMAXWORKERS); conf->nmic = nmic; } void fstarpu_conf_set_nscc(struct starpu_conf *conf, int nscc) { STARPU_ASSERT(nscc >= 0 && nscc <= STARPU_NMAXWORKERS); conf->nscc = nscc; } void fstarpu_conf_set_calibrate(struct starpu_conf *conf, int calibrate) { STARPU_ASSERT(calibrate == 0 || calibrate == 1); conf->calibrate = calibrate; } void fstarpu_conf_set_bus_calibrate(struct starpu_conf *conf, int bus_calibrate) { STARPU_ASSERT(bus_calibrate == 0 || bus_calibrate == 1); conf->bus_calibrate = bus_calibrate; } void fstarpu_topology_print(void) { starpu_topology_print(stderr); } struct starpu_codelet *fstarpu_codelet_allocate(void) { struct starpu_codelet *cl; _STARPU_MALLOC(cl, sizeof(*cl)); starpu_codelet_init(cl); return cl; } void fstarpu_codelet_free(struct starpu_codelet *cl) { memset(cl, 0, sizeof(*cl)); free(cl); } void fstarpu_codelet_set_name(struct starpu_codelet *cl, const char *cl_name) { cl->name = cl_name; } void fstarpu_codelet_add_cpu_func(struct starpu_codelet *cl, void *f_ptr) { const size_t max_cpu_funcs = sizeof(cl->cpu_funcs)/sizeof(cl->cpu_funcs[0])-1; size_t i; for (i = 0; i < max_cpu_funcs; i++) { if (cl->cpu_funcs[i] == NULL) { cl->cpu_funcs[i] = f_ptr; return; } } _FSTARPU_ERROR("fstarpu: too many cpu functions in Fortran codelet"); } void fstarpu_codelet_add_cuda_func(struct starpu_codelet *cl, void *f_ptr) { const size_t max_cuda_funcs = sizeof(cl->cuda_funcs)/sizeof(cl->cuda_funcs[0])-1; unsigned i; for (i = 0; i < max_cuda_funcs; i++) { if (cl->cuda_funcs[i] == NULL) { cl->cuda_funcs[i] = f_ptr; return; } } _FSTARPU_ERROR("fstarpu: too many cuda functions in Fortran codelet"); } void fstarpu_codelet_add_cuda_flags(struct starpu_codelet *cl, intptr_t flags) { const size_t max_cuda_flags = sizeof(cl->cuda_flags)/sizeof(cl->cuda_flags[0])-1; unsigned i; for (i = 0; i < max_cuda_flags; i++) { if (cl->cuda_flags[i] == 0) { cl->cuda_flags[i] = (char)flags; return; } } _FSTARPU_ERROR("fstarpu: too many cuda flags in Fortran codelet"); } void fstarpu_codelet_add_opencl_func(struct starpu_codelet *cl, void *f_ptr) { const size_t max_opencl_funcs = sizeof(cl->opencl_funcs)/sizeof(cl->opencl_funcs[0])-1; unsigned i; for (i = 0; i < max_opencl_funcs; i++) { if (cl->opencl_funcs[i] == NULL) { cl->opencl_funcs[i] = f_ptr; return; } } _FSTARPU_ERROR("fstarpu: too many opencl functions in Fortran codelet"); } void fstarpu_codelet_add_opencl_flags(struct starpu_codelet *cl, intptr_t flags) { const size_t max_opencl_flags = sizeof(cl->opencl_flags)/sizeof(cl->opencl_flags[0])-1; unsigned i; for (i = 0; i < max_opencl_flags; i++) { if (cl->opencl_flags[i] == 0) { cl->opencl_flags[i] = (char)flags; return; } } _FSTARPU_ERROR("fstarpu: too many opencl flags in Fortran codelet"); } void fstarpu_codelet_add_mic_func(struct starpu_codelet *cl, void *f_ptr) { const size_t max_mic_funcs = sizeof(cl->mic_funcs)/sizeof(cl->mic_funcs[0])-1; unsigned i; for (i = 0; i < max_mic_funcs; i++) { if (cl->mic_funcs[i] == NULL) { cl->mic_funcs[i] = f_ptr; return; } } _FSTARPU_ERROR("fstarpu: too many mic functions in Fortran codelet"); } void fstarpu_codelet_add_scc_func(struct starpu_codelet *cl, void *f_ptr) { const size_t max_scc_funcs = sizeof(cl->scc_funcs)/sizeof(cl->scc_funcs[0])-1; unsigned i; for (i = 0; i < max_scc_funcs; i++) { if (cl->scc_funcs[i] == NULL) { cl->scc_funcs[i] = f_ptr; return; } } _FSTARPU_ERROR("fstarpu: too many scc functions in Fortran codelet"); } void fstarpu_codelet_add_buffer(struct starpu_codelet *cl, intptr_t _mode) { enum starpu_data_access_mode mode = (enum starpu_data_access_mode) _mode; const size_t max_modes = sizeof(cl->modes)/sizeof(cl->modes[0])-1; if ((mode & (STARPU_ACCESS_MODE_MAX-1)) != mode) { _FSTARPU_ERROR("fstarpu: invalid data mode"); } if (cl->nbuffers < (int) max_modes) { cl->modes[cl->nbuffers] = (unsigned int)mode; cl->nbuffers++; } else { _FSTARPU_ERROR("fstarpu: too many buffers in Fortran codelet"); } } void fstarpu_codelet_set_variable_nbuffers(struct starpu_codelet *cl) { cl->nbuffers = STARPU_VARIABLE_NBUFFERS; } void fstarpu_codelet_set_nbuffers(struct starpu_codelet *cl, int nbuffers) { if (nbuffers >= 0) { cl->nbuffers = nbuffers; } else { _FSTARPU_ERROR("fstarpu: invalid nbuffers parameter"); } } void fstarpu_codelet_set_flags(struct starpu_codelet *cl, intptr_t flags) { cl->flags = (int)flags; } void fstarpu_codelet_set_where(struct starpu_codelet *cl, intptr_t where) { STARPU_ASSERT(where >= 0); cl->where = (uint32_t)where; } void * fstarpu_variable_get_ptr(void *buffers[], int i) { return (void *)STARPU_VARIABLE_GET_PTR(buffers[i]); } void * fstarpu_vector_get_ptr(void *buffers[], int i) { return (void *)STARPU_VECTOR_GET_PTR(buffers[i]); } int fstarpu_vector_get_nx(void *buffers[], int i) { return STARPU_VECTOR_GET_NX(buffers[i]); } void * fstarpu_matrix_get_ptr(void *buffers[], int i) { return (void *)STARPU_MATRIX_GET_PTR(buffers[i]); } int fstarpu_matrix_get_ld(void *buffers[], int i) { return STARPU_MATRIX_GET_LD(buffers[i]); } int fstarpu_matrix_get_nx(void *buffers[], int i) { return STARPU_MATRIX_GET_NX(buffers[i]); } int fstarpu_matrix_get_ny(void *buffers[], int i) { return STARPU_MATRIX_GET_NY(buffers[i]); } void * fstarpu_block_get_ptr(void *buffers[], int i) { return (void *)STARPU_BLOCK_GET_PTR(buffers[i]); } int fstarpu_block_get_ldy(void *buffers[], int i) { return STARPU_BLOCK_GET_LDY(buffers[i]); } int fstarpu_block_get_ldz(void *buffers[], int i) { return STARPU_BLOCK_GET_LDZ(buffers[i]); } int fstarpu_block_get_nx(void *buffers[], int i) { return STARPU_BLOCK_GET_NX(buffers[i]); } int fstarpu_block_get_ny(void *buffers[], int i) { return STARPU_BLOCK_GET_NY(buffers[i]); } int fstarpu_block_get_nz(void *buffers[], int i) { return STARPU_BLOCK_GET_NZ(buffers[i]); } void fstarpu_data_acquire(starpu_data_handle_t handle, intptr_t mode) { STARPU_ASSERT(mode == fstarpu_r || mode == fstarpu_w || mode == fstarpu_rw); starpu_data_acquire(handle, (int)mode); } void fstarpu_unpack_arg(char *cl_arg, void **buffer_list) { size_t current_arg_offset = 0; int nargs, arg; /* We fill the different pointers with the appropriate arguments */ memcpy(&nargs, cl_arg, sizeof(nargs)); current_arg_offset += sizeof(nargs); for (arg = 0; arg < nargs; arg++) { void *argptr = buffer_list[arg]; /* If not reading all cl_args */ if(argptr == NULL) break; size_t arg_size; memcpy(&arg_size, cl_arg+current_arg_offset, sizeof(arg_size)); current_arg_offset += sizeof(arg_size); memcpy(argptr, cl_arg+current_arg_offset, arg_size); current_arg_offset += arg_size; } } void fstarpu_sched_ctx_display_workers(int ctx) { starpu_sched_ctx_display_workers((unsigned)ctx, stderr); } intptr_t fstarpu_worker_get_type(int workerid) { return (intptr_t)starpu_worker_get_type(workerid); } int fstarpu_worker_get_count_by_type(intptr_t type) { return starpu_worker_get_count_by_type((enum starpu_worker_archtype)type); } int fstarpu_worker_get_ids_by_type(intptr_t type, int *workerids, int maxsize) { return starpu_worker_get_ids_by_type((enum starpu_worker_archtype)type, workerids, maxsize); } int fstarpu_worker_get_by_type(intptr_t type, int num) { return starpu_worker_get_by_type((enum starpu_worker_archtype)type, num); } int fstarpu_worker_get_by_devid(intptr_t type, int devid) { return starpu_worker_get_by_type((enum starpu_worker_archtype)type, devid); } void fstarpu_worker_get_type_as_string(intptr_t type, char *dst, size_t maxlen) { const char *str = starpu_worker_get_type_as_string((enum starpu_worker_archtype)type); snprintf(dst, maxlen, "%s", str); } starpu_data_handle_t *fstarpu_data_handle_array_alloc(int nb) { starpu_data_handle_t *p; _STARPU_CALLOC(p, (size_t)nb, sizeof(starpu_data_handle_t)); return p; } void fstarpu_data_handle_array_free(starpu_data_handle_t *handles) { free(handles); } void fstarpu_data_handle_array_set(starpu_data_handle_t *handles, int i, starpu_data_handle_t handle) { handles[i] = handle; } struct starpu_data_descr *fstarpu_data_descr_array_alloc(int nb) { struct starpu_data_descr *p; _STARPU_CALLOC(p, (size_t)nb, sizeof(struct starpu_data_descr)); return p; } struct starpu_data_descr *fstarpu_data_descr_alloc(void) { return fstarpu_data_descr_array_alloc(1); } void fstarpu_data_descr_array_free(struct starpu_data_descr *descrs) { free(descrs); } void fstarpu_data_descr_free(struct starpu_data_descr *descr) { fstarpu_data_descr_array_free(descr); } void fstarpu_data_descr_array_set(struct starpu_data_descr *descrs, int i, starpu_data_handle_t handle, intptr_t mode) { descrs[i].handle = handle; descrs[i].mode = (enum starpu_data_access_mode)mode; } void fstarpu_data_descr_set(struct starpu_data_descr *descr, starpu_data_handle_t handle, intptr_t mode) { fstarpu_data_descr_array_set(descr, 1, handle, mode); } struct starpu_data_filter *fstarpu_data_filter_allocate(void) { struct starpu_data_filter *filter; _STARPU_CALLOC(filter, 1, sizeof(*filter)); return filter; } /* Note: use fstarpu_df_alloc_ prefix instead of fstarpu_data_filter_allocate_ to fit within the * Fortran id length limit */ #define _FSTARPU_DATA_FILTER_ALLOCATOR(name) \ struct starpu_data_filter *fstarpu_df_alloc_##name(void) \ { \ struct starpu_data_filter *filter = fstarpu_data_filter_allocate(); \ filter->filter_func = starpu_##name; \ return filter; \ } _FSTARPU_DATA_FILTER_ALLOCATOR(bcsr_filter_canonical_block); _FSTARPU_DATA_FILTER_ALLOCATOR(csr_filter_vertical_block); _FSTARPU_DATA_FILTER_ALLOCATOR(matrix_filter_block); _FSTARPU_DATA_FILTER_ALLOCATOR(matrix_filter_block_shadow); _FSTARPU_DATA_FILTER_ALLOCATOR(matrix_filter_vertical_block); _FSTARPU_DATA_FILTER_ALLOCATOR(matrix_filter_vertical_block_shadow); _FSTARPU_DATA_FILTER_ALLOCATOR(vector_filter_block); _FSTARPU_DATA_FILTER_ALLOCATOR(vector_filter_block_shadow); _FSTARPU_DATA_FILTER_ALLOCATOR(vector_filter_list); _FSTARPU_DATA_FILTER_ALLOCATOR(vector_filter_divide_in_2); _FSTARPU_DATA_FILTER_ALLOCATOR(block_filter_block); _FSTARPU_DATA_FILTER_ALLOCATOR(block_filter_block_shadow); _FSTARPU_DATA_FILTER_ALLOCATOR(block_filter_vertical_block); _FSTARPU_DATA_FILTER_ALLOCATOR(block_filter_vertical_block_shadow); #undef _FSTARPU_DATA_FILTER_ALLOCATOR void fstarpu_data_filter_free(struct starpu_data_filter *filter) { memset(filter, 0, sizeof(*filter)); free(filter); } void fstarpu_data_filter_set_filter_func(struct starpu_data_filter *filter, void *f_ptr) { STARPU_ASSERT(f_ptr != NULL); filter->filter_func = f_ptr; } void fstarpu_data_filter_set_nchildren(struct starpu_data_filter *filter, int nchildren) { STARPU_ASSERT(nchildren >= 0); filter->nchildren = nchildren; } void fstarpu_data_filter_set_get_nchildren_func(struct starpu_data_filter *filter, void *f_ptr) { filter->get_nchildren = f_ptr; } void fstarpu_data_filter_set_get_child_ops_func(struct starpu_data_filter *filter, void *f_ptr) { filter->get_child_ops = f_ptr; } void fstarpu_data_filter_set_filter_arg(struct starpu_data_filter *filter, int filter_arg) { STARPU_ASSERT(filter_arg >= 0); /* starpu_data_filter.filter_arg is unsigned, but * Fortran does not support unsigned types */ filter->filter_arg = (unsigned)filter_arg; } void fstarpu_data_filter_set_filter_arg_ptr(struct starpu_data_filter *filter, void *filter_arg_ptr) { filter->filter_arg_ptr = filter_arg_ptr; } starpu-1.2.3+dfsg/src/util/misc.c000066400000000000000000000032721320135501600166150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012, 2015, 2017 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include const char *_starpu_codelet_get_model_name(struct starpu_codelet *cl) { if (!cl) return NULL; if (cl->model && cl->model->symbol && cl->model->symbol[0]) return cl->model->symbol; else return cl->name; } const char *_starpu_job_get_model_name(struct _starpu_job *j) { if (!j) return NULL; struct starpu_task *task = j->task; if (!task) return NULL; return _starpu_codelet_get_model_name(task->cl); } const char *_starpu_job_get_task_name(struct _starpu_job *j) { if (!j) return NULL; struct starpu_task *task = j->task; if (!task) return NULL; if (task->name) return task->name; else return _starpu_job_get_model_name(j); } const char *starpu_task_get_model_name(struct starpu_task *task) { if (!task) return NULL; return _starpu_codelet_get_model_name(task->cl); } const char *starpu_task_get_name(struct starpu_task *task) { if (!task) return NULL; if (task->name) return task->name; else return starpu_task_get_model_name(task); } starpu-1.2.3+dfsg/src/util/openmp_runtime_support.c000066400000000000000000002303131320135501600225150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #ifdef STARPU_OPENMP /* * locally disable -Wdeprecated-declarations to avoid * lots of deprecated warnings for ucontext related functions */ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #include #include #include #include #include #include #include #include #include #include #define _STARPU_INITIAL_THREAD_STACKSIZE 2097152 static struct starpu_omp_global _global_state; static starpu_pthread_key_t omp_thread_key; static starpu_pthread_key_t omp_task_key; static struct starpu_conf omp_starpu_conf; struct starpu_omp_global *_starpu_omp_global_state = NULL; double _starpu_omp_clock_ref = 0.0; /* clock reference for starpu_omp_get_wtick */ static struct starpu_omp_critical *create_omp_critical_struct(void); static void destroy_omp_critical_struct(struct starpu_omp_critical *critical); static struct starpu_omp_device *create_omp_device_struct(void); static void destroy_omp_device_struct(struct starpu_omp_device *device); static struct starpu_omp_region *create_omp_region_struct(struct starpu_omp_region *parent_region, struct starpu_omp_device *owner_device); static void destroy_omp_region_struct(struct starpu_omp_region *region); static struct starpu_omp_thread *create_omp_thread_struct(struct starpu_omp_region *owner_region); static void destroy_omp_thread_struct(struct starpu_omp_thread *thread); static struct starpu_omp_task *create_omp_task_struct(struct starpu_omp_task *parent_task, struct starpu_omp_thread *owner_thread, struct starpu_omp_region *owner_region, int is_implicit); static void destroy_omp_task_struct(struct starpu_omp_task *task); static void wake_up_and_unlock_task(struct starpu_omp_task *task); static void wake_up_barrier(struct starpu_omp_region *parallel_region); static void starpu_omp_task_preempt(void); struct starpu_omp_thread *_starpu_omp_get_thread(void) { struct starpu_omp_thread *thread = STARPU_PTHREAD_GETSPECIFIC(omp_thread_key); return thread; } struct starpu_omp_task *_starpu_omp_get_task(void) { struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); return task; } static void weak_task_lock(struct starpu_omp_task *task) { _starpu_spin_lock(&task->lock); while (task->transaction_pending) { _starpu_spin_unlock(&task->lock); STARPU_UYIELD(); _starpu_spin_lock(&task->lock); } } static void weak_task_unlock(struct starpu_omp_task *task) { _starpu_spin_unlock(&task->lock); } static void wake_up_and_unlock_task(struct starpu_omp_task *task) { STARPU_ASSERT(task->transaction_pending == 0); if (task->wait_on == 0) { weak_task_unlock(task); int ret = starpu_task_submit(task->starpu_task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } else { weak_task_unlock(task); } } static void transaction_callback(void *_task) { struct starpu_omp_task *task = _task; _starpu_spin_lock(&task->lock); STARPU_ASSERT(task->transaction_pending != 0); task->transaction_pending = 0; _starpu_spin_unlock(&task->lock); } static void condition_init(struct starpu_omp_condition *condition) { condition->contention_list_head = NULL; } static void condition_exit(struct starpu_omp_condition *condition) { STARPU_ASSERT(condition->contention_list_head == NULL); condition->contention_list_head = NULL; } static void condition_wait(struct starpu_omp_condition *condition, struct _starpu_spinlock *lock) { struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); struct starpu_omp_task_link link; _starpu_spin_lock(&task->lock); task->wait_on |= starpu_omp_task_wait_on_condition; link.task = task; link.next = condition->contention_list_head; condition->contention_list_head = &link; task->transaction_pending = 1; _starpu_spin_unlock(&task->lock); _starpu_spin_unlock(lock); _starpu_task_prepare_for_continuation_ext(0, transaction_callback, task); starpu_omp_task_preempt(); /* re-acquire the lock released by the callback */ _starpu_spin_lock(lock); } #if 0 /* unused for now */ static void condition_signal(struct starpu_omp_condition *condition) { if (condition->contention_list_head != NULL) { struct starpu_omp_task *next_task = condition->contention_list_head->task; weak_task_lock(next_task); condition->contention_list_head = condition->contention_list_head->next; STARPU_ASSERT(next_task->wait_on & starpu_omp_task_wait_on_condition); next_task->wait_on &= ~starpu_omp_task_wait_on_condition; wake_up_and_unlock_task(next_task); } } #endif static void condition_broadcast(struct starpu_omp_condition *condition) { while (condition->contention_list_head != NULL) { struct starpu_omp_task *next_task = condition->contention_list_head->task; weak_task_lock(next_task); condition->contention_list_head = condition->contention_list_head->next; STARPU_ASSERT(next_task->wait_on & starpu_omp_task_wait_on_condition); next_task->wait_on &= ~starpu_omp_task_wait_on_condition; wake_up_and_unlock_task(next_task); } } static void register_thread_worker(struct starpu_omp_thread *thread) { STARPU_ASSERT(thread->worker != NULL); _starpu_spin_lock(&_global_state.hash_workers_lock); struct _starpu_worker *check = thread->worker; struct starpu_omp_thread *tmp = NULL; HASH_FIND_PTR(_global_state.hash_workers, &check, tmp); STARPU_ASSERT(tmp == NULL); HASH_ADD_PTR(_global_state.hash_workers, worker, thread); _starpu_spin_unlock(&_global_state.hash_workers_lock); } static struct starpu_omp_thread *get_worker_thread(struct _starpu_worker *starpu_worker) { struct starpu_omp_thread *thread = NULL; _starpu_spin_lock(&_global_state.hash_workers_lock); HASH_FIND_PTR(_global_state.hash_workers, &starpu_worker, thread); _starpu_spin_unlock(&_global_state.hash_workers_lock); return thread; } static struct starpu_omp_thread *get_local_thread(void) { struct starpu_omp_thread *thread = STARPU_PTHREAD_GETSPECIFIC(omp_thread_key); if (thread == NULL) { struct _starpu_worker *starpu_worker = _starpu_get_local_worker_key(); STARPU_ASSERT(starpu_worker != NULL); _starpu_spin_lock(&_global_state.hash_workers_lock); HASH_FIND_PTR(_global_state.hash_workers, &starpu_worker, thread); _starpu_spin_unlock(&_global_state.hash_workers_lock); if ( #if STARPU_USE_CUDA (starpu_worker->arch != STARPU_CUDA_WORKER) && #endif #if STARPU_USE_OPENCL (starpu_worker->arch != STARPU_OPENCL_WORKER) && #endif 1 ) { STARPU_ASSERT(thread != NULL); } if (thread != NULL) { STARPU_PTHREAD_SETSPECIFIC(omp_thread_key, thread); } } return thread; } static struct starpu_omp_critical *create_omp_critical_struct(void) { struct starpu_omp_critical *critical; _STARPU_MALLOC(critical, sizeof(*critical)); memset(critical, 0, sizeof(*critical)); _starpu_spin_init(&critical->lock); return critical; } static void destroy_omp_critical_struct(struct starpu_omp_critical *critical) { STARPU_ASSERT(critical->state == 0); STARPU_ASSERT(critical->contention_list_head == NULL); _starpu_spin_destroy(&critical->lock); critical->name = NULL; free(critical); } static struct starpu_omp_device *create_omp_device_struct(void) { struct starpu_omp_device *device; _STARPU_MALLOC(device, sizeof(*device)); memset(device, 0, sizeof(*device)); _starpu_spin_init(&device->atomic_lock); return device; } static void destroy_omp_device_struct(struct starpu_omp_device *device) { _starpu_spin_destroy(&device->atomic_lock); memset(device, 0, sizeof(*device)); free(device); } static struct starpu_omp_device *get_caller_device(void) { struct starpu_omp_task *task = _starpu_omp_get_task(); struct starpu_omp_device *device; if (task) { STARPU_ASSERT(task->owner_region != NULL); device = task->owner_region->owner_device; } else { device = _global_state.initial_device; } STARPU_ASSERT(device != NULL); return device; } static struct starpu_omp_region *create_omp_region_struct(struct starpu_omp_region *parent_region, struct starpu_omp_device *owner_device) { struct starpu_omp_region *region; _STARPU_MALLOC(region, sizeof(*region)); memset(region, 0, sizeof(*region)); region->parent_region = parent_region; region->owner_device = owner_device; starpu_omp_thread_list_init(®ion->thread_list); _starpu_spin_init(®ion->lock); _starpu_spin_init(®ion->registered_handles_lock); region->level = (parent_region != NULL)?parent_region->level+1:0; return region; } static void destroy_omp_region_struct(struct starpu_omp_region *region) { STARPU_ASSERT(region->nb_threads == 0); STARPU_ASSERT(starpu_omp_thread_list_empty(®ion->thread_list)); STARPU_ASSERT(region->continuation_starpu_task == NULL); _starpu_spin_destroy(®ion->registered_handles_lock); _starpu_spin_destroy(®ion->lock); memset(region, 0, sizeof(*region)); free(region); } static void omp_initial_thread_func(void) { struct starpu_omp_thread *initial_thread = _global_state.initial_thread; struct starpu_omp_task *initial_task = _global_state.initial_task; while (1) { struct starpu_task *continuation_starpu_task = initial_task->nested_region->continuation_starpu_task; starpu_driver_run_once(&initial_thread->starpu_driver); /* * if we are leaving the first nested region we give control back to initial task * otherwise, we should continue to execute work */ if (_starpu_task_test_termination(continuation_starpu_task)) { initial_task->nested_region->continuation_starpu_task = NULL; STARPU_PTHREAD_SETSPECIFIC(omp_task_key, initial_task); swapcontext(&initial_thread->ctx, &initial_task->ctx); } } } static struct starpu_omp_thread *create_omp_thread_struct(struct starpu_omp_region *owner_region) { struct starpu_omp_thread *thread = starpu_omp_thread_new(); if (thread == NULL) _STARPU_ERROR("memory allocation failed"); memset(thread, 0, sizeof(*thread)); thread->owner_region = owner_region; return thread; } static void destroy_omp_thread_struct(struct starpu_omp_thread *thread) { STARPU_ASSERT(thread->current_task == NULL); memset(thread, 0, sizeof(*thread)); starpu_omp_thread_delete(thread); } static void starpu_omp_explicit_task_entry(struct starpu_omp_task *task) { STARPU_ASSERT(!task->is_implicit); struct _starpu_worker *starpu_worker = _starpu_get_local_worker_key(); if (starpu_worker->arch == STARPU_CPU_WORKER) { task->cpu_f(task->starpu_buffers, task->starpu_cl_arg); } #if STARPU_USE_CUDA else if (starpu_worker->arch == STARPU_CUDA_WORKER) { task->cuda_f(task->starpu_buffers, task->starpu_cl_arg); } #endif #if STARPU_USE_OPENCL else if (starpu_worker->arch == STARPU_OPENCL_WORKER) { task->opencl_f(task->starpu_buffers, task->starpu_cl_arg); } #endif else _STARPU_ERROR("invalid worker architecture"); _starpu_omp_unregister_task_handles(task); _starpu_spin_lock(&task->lock); task->state = starpu_omp_task_state_terminated; task->transaction_pending=1; _starpu_spin_unlock(&task->lock); struct starpu_omp_thread *thread = STARPU_PTHREAD_GETSPECIFIC(omp_thread_key); /* * the task reached the terminated state, definitively give hand back to the worker code. * * about to run on the worker stack... */ setcontext(&thread->ctx); STARPU_ASSERT(0); /* unreachable code */ } static void starpu_omp_implicit_task_entry(struct starpu_omp_task *task) { struct starpu_omp_thread *thread = STARPU_PTHREAD_GETSPECIFIC(omp_thread_key); STARPU_ASSERT(task->is_implicit); task->cpu_f(task->starpu_buffers, task->starpu_cl_arg); starpu_omp_barrier(); if (thread == task->owner_region->master_thread) { _starpu_omp_unregister_region_handles(task->owner_region); } task->state = starpu_omp_task_state_terminated; /* * the task reached the terminated state, definitively give hand back to the worker code. * * about to run on the worker stack... */ setcontext(&thread->ctx); STARPU_ASSERT(0); /* unreachable code */ } /* * stop executing a task that is about to block * and give hand back to the thread */ static void starpu_omp_task_preempt(void) { struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); struct starpu_omp_thread *thread = STARPU_PTHREAD_GETSPECIFIC(omp_thread_key); task->state = starpu_omp_task_state_preempted; /* * the task reached a blocked state, give hand back to the worker code. * * about to run on the worker stack... */ swapcontext(&task->ctx, &thread->ctx); /* now running on the task stack again */ } /* * wrap a task function to allow the task to be preempted */ static void starpu_omp_implicit_task_exec(void *buffers[], void *cl_arg) { struct starpu_omp_task *task = starpu_task_get_current()->omp_task; STARPU_ASSERT(task->is_implicit); STARPU_PTHREAD_SETSPECIFIC(omp_task_key, task); struct starpu_omp_thread *thread = get_local_thread(); if (task->state != starpu_omp_task_state_preempted) { task->starpu_buffers = buffers; task->starpu_cl_arg = cl_arg; STARPU_ASSERT(task->stack == NULL); STARPU_ASSERT(task->stacksize > 0); _STARPU_MALLOC(task->stack, task->stacksize); getcontext(&task->ctx); /* * we do not use uc_link, starpu_omp_task_entry will handle * the end of the task */ task->ctx.uc_link = NULL; task->ctx.uc_stack.ss_sp = task->stack; task->ctx.uc_stack.ss_size = task->stacksize; task->stack_vg_id = VALGRIND_STACK_REGISTER(task->stack, task->stack+task->stacksize); makecontext(&task->ctx, (void (*) ()) starpu_omp_implicit_task_entry, 1, task); } task->state = starpu_omp_task_state_clear; /* * start the task execution, or restore a previously preempted task. * about to run on the task stack... * */ swapcontext(&thread->ctx, &task->ctx); /* now running on the worker stack again */ STARPU_ASSERT(task->state == starpu_omp_task_state_preempted || task->state == starpu_omp_task_state_terminated); STARPU_PTHREAD_SETSPECIFIC(omp_task_key, NULL); /* TODO: analyse the cause of the return and take appropriate steps */ if (task->state == starpu_omp_task_state_terminated) { task->starpu_task->omp_task = NULL; task->starpu_task = NULL; VALGRIND_STACK_DEREGISTER(task->stack_vg_id); task->stack_vg_id = 0; free(task->stack); task->stack = NULL; memset(&task->ctx, 0, sizeof(task->ctx)); } else if (task->state != starpu_omp_task_state_preempted) _STARPU_ERROR("invalid omp task state"); } static void starpu_omp_task_completion_accounting(struct starpu_omp_task *task) { struct starpu_omp_task *parent_task = task->parent_task; struct starpu_omp_region *parallel_region = task->owner_region; weak_task_lock(parent_task); if (STARPU_ATOMIC_ADD(&parent_task->child_task_count, -1) == 0) { if (parent_task->state == starpu_omp_task_state_zombie) { STARPU_ASSERT(!parent_task->is_implicit); weak_task_unlock(parent_task); destroy_omp_task_struct(parent_task); } else if (parent_task->wait_on & starpu_omp_task_wait_on_task_childs) { parent_task->wait_on &= ~starpu_omp_task_wait_on_task_childs; wake_up_and_unlock_task(parent_task); } else { weak_task_unlock(parent_task); } } else { weak_task_unlock(parent_task); } _starpu_spin_lock(¶llel_region->lock); if (STARPU_ATOMIC_ADD(¶llel_region->bound_explicit_task_count, -1) == 0) { struct starpu_omp_task *waiting_task = parallel_region->waiting_task; _starpu_spin_unlock(¶llel_region->lock); if (waiting_task) { weak_task_lock(waiting_task); _starpu_spin_lock(¶llel_region->lock); parallel_region->waiting_task = NULL; STARPU_ASSERT(waiting_task->wait_on & starpu_omp_task_wait_on_region_tasks); waiting_task->wait_on &= ~starpu_omp_task_wait_on_region_tasks; _starpu_spin_unlock(¶llel_region->lock); wake_up_and_unlock_task(waiting_task); } } else { _starpu_spin_unlock(¶llel_region->lock); } if (task->task_group) { struct starpu_omp_task *leader_task = task->task_group->leader_task; STARPU_ASSERT(leader_task != task); weak_task_lock(leader_task); if (STARPU_ATOMIC_ADD(&task->task_group->descendent_task_count, -1) == 0) { if (leader_task->wait_on & starpu_omp_task_wait_on_group && task->task_group == leader_task->task_group) /* only wake the leader_task if it is actually * waiting for the current task's task_group */ { leader_task->wait_on &= ~starpu_omp_task_wait_on_group; wake_up_and_unlock_task(leader_task); } else { weak_task_unlock(leader_task); } } else { weak_task_unlock(leader_task); } } } /* * wrap a task function to allow the task to be preempted */ static void starpu_omp_explicit_task_exec(void *buffers[], void *cl_arg) { struct starpu_omp_task *task = starpu_task_get_current()->omp_task; STARPU_ASSERT(!task->is_implicit); STARPU_PTHREAD_SETSPECIFIC(omp_task_key, task); struct starpu_omp_thread *thread = get_local_thread(); if (task->state != starpu_omp_task_state_preempted) { if (thread == NULL) { struct _starpu_worker *starpu_worker = _starpu_get_local_worker_key(); if (starpu_worker->arch != STARPU_CPU_WORKER) { if ( #if STARPU_USE_CUDA (starpu_worker->arch != STARPU_CUDA_WORKER) && #endif #if STARPU_USE_OPENCL (starpu_worker->arch != STARPU_OPENCL_WORKER) && #endif 1 ) { _STARPU_ERROR("invalid worker architecture"); } struct starpu_omp_thread *new_thread; new_thread = create_omp_thread_struct(NULL); new_thread->worker = starpu_worker; register_thread_worker(new_thread); thread = get_local_thread(); STARPU_ASSERT(thread == new_thread); } else { _STARPU_ERROR("orphaned CPU thread"); } } STARPU_ASSERT(thread != NULL); if (!task->is_untied) { struct _starpu_worker *starpu_worker = _starpu_get_local_worker_key(); task->starpu_task->workerid = starpu_worker->workerid; task->starpu_task->execute_on_a_specific_worker = 1; } task->starpu_buffers = buffers; task->starpu_cl_arg = cl_arg; STARPU_ASSERT(task->stack == NULL); STARPU_ASSERT(task->stacksize > 0); _STARPU_MALLOC(task->stack, task->stacksize); getcontext(&task->ctx); /* * we do not use uc_link, starpu_omp_task_entry will handle * the end of the task */ task->ctx.uc_link = NULL; task->ctx.uc_stack.ss_sp = task->stack; task->ctx.uc_stack.ss_size = task->stacksize; makecontext(&task->ctx, (void (*) ()) starpu_omp_explicit_task_entry, 1, task); } task->state = starpu_omp_task_state_clear; /* * start the task execution, or restore a previously preempted task. * about to run on the task stack... * */ swapcontext(&thread->ctx, &task->ctx); /* now running on the worker stack again */ STARPU_ASSERT(task->state == starpu_omp_task_state_preempted || task->state == starpu_omp_task_state_terminated); STARPU_PTHREAD_SETSPECIFIC(omp_task_key, NULL); /* TODO: analyse the cause of the return and take appropriate steps */ if (task->state == starpu_omp_task_state_terminated) { free(task->stack); task->stack = NULL; memset(&task->ctx, 0, sizeof(task->ctx)); starpu_omp_task_completion_accounting(task); } else if (task->state != starpu_omp_task_state_preempted) _STARPU_ERROR("invalid omp task state"); } static struct starpu_omp_task *create_omp_task_struct(struct starpu_omp_task *parent_task, struct starpu_omp_thread *owner_thread, struct starpu_omp_region *owner_region, int is_implicit) { struct starpu_omp_task *task = starpu_omp_task_new(); if (task == NULL) _STARPU_ERROR("memory allocation failed"); memset(task, 0, sizeof(*task)); task->parent_task = parent_task; task->owner_thread = owner_thread; task->owner_region = owner_region; task->is_implicit = is_implicit; _starpu_spin_init(&task->lock); /* TODO: initialize task->data_env_icvs with proper values */ memset(&task->data_env_icvs, 0, sizeof(task->data_env_icvs)); if (is_implicit) { /* TODO: initialize task->implicit_task_icvs with proper values */ memset(&task->implicit_task_icvs, 0, sizeof(task->implicit_task_icvs)); } if (owner_region->level > 0) { STARPU_ASSERT(owner_region->owner_device->icvs.stacksize_var > 0); task->stacksize = owner_region->owner_device->icvs.stacksize_var; } return task; } static void destroy_omp_task_struct(struct starpu_omp_task *task) { STARPU_ASSERT(task->state == starpu_omp_task_state_terminated || (task->state == starpu_omp_task_state_zombie && task->child_task_count == 0) || task->state == starpu_omp_task_state_target); if (task->state == starpu_omp_task_state_target) { starpu_omp_task_completion_accounting(task); } STARPU_ASSERT(task->nested_region == NULL); STARPU_ASSERT(task->starpu_task == NULL); STARPU_ASSERT(task->stack == NULL); _starpu_spin_destroy(&task->lock); memset(task, 0, sizeof(*task)); starpu_omp_task_delete(task); } /* * setup the main application thread to handle the possible preemption of the initial task */ static void omp_initial_thread_setup(void) { struct starpu_omp_thread *initial_thread = _global_state.initial_thread; struct starpu_omp_task *initial_task = _global_state.initial_task; /* .current_task */ initial_thread->current_task = initial_task; /* .owner_region already set in create_omp_thread_struct */ /* .initial_thread_stack */ _STARPU_MALLOC(initial_thread->initial_thread_stack, _STARPU_INITIAL_THREAD_STACKSIZE); /* .ctx */ getcontext(&initial_thread->ctx); /* * we do not use uc_link, the initial thread always should give hand back to the initial task */ initial_thread->ctx.uc_link = NULL; initial_thread->ctx.uc_stack.ss_sp = initial_thread->initial_thread_stack; initial_thread->ctx.uc_stack.ss_size = _STARPU_INITIAL_THREAD_STACKSIZE; initial_thread->initial_thread_stack_vg_id = VALGRIND_STACK_REGISTER(initial_thread->initial_thread_stack, initial_thread->initial_thread_stack+_STARPU_INITIAL_THREAD_STACKSIZE); makecontext(&initial_thread->ctx, omp_initial_thread_func, 0); /* .starpu_driver */ /* * we configure starpu to not launch CPU worker 0 * because we will use the main thread to play the role of worker 0 */ int ret = starpu_conf_init(&omp_starpu_conf); STARPU_CHECK_RETURN_VALUE(ret, "starpu_conf_init"); initial_thread->starpu_driver.type = STARPU_CPU_WORKER; initial_thread->starpu_driver.id.cpu_id = 0; omp_starpu_conf.not_launched_drivers = &initial_thread->starpu_driver; omp_starpu_conf.n_not_launched_drivers = 1; /* we are now ready to start StarPU */ ret = starpu_init(&omp_starpu_conf); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_driver_init(&initial_thread->starpu_driver); STARPU_CHECK_RETURN_VALUE(ret, "starpu_driver_init"); STARPU_PTHREAD_SETSPECIFIC(omp_task_key, initial_task); _global_state.nb_starpu_cpu_workers = starpu_worker_get_count_by_type(STARPU_CPU_WORKER); _STARPU_MALLOC(_global_state.starpu_cpu_worker_ids, _global_state.nb_starpu_cpu_workers * sizeof(int)); ret = starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, _global_state.starpu_cpu_worker_ids, _global_state.nb_starpu_cpu_workers); STARPU_ASSERT(ret == _global_state.nb_starpu_cpu_workers); initial_thread->worker = _starpu_get_worker_struct(_global_state.starpu_cpu_worker_ids[0]); STARPU_ASSERT(initial_thread->worker); STARPU_ASSERT(initial_thread->worker->arch == STARPU_CPU_WORKER); STARPU_PTHREAD_SETSPECIFIC(omp_thread_key, initial_thread); register_thread_worker(initial_thread); } static void omp_initial_thread_exit() { struct starpu_omp_thread *initial_thread = _global_state.initial_thread; int ret = starpu_driver_deinit(&initial_thread->starpu_driver); STARPU_CHECK_RETURN_VALUE(ret, "starpu_driver_deinit"); memset(&initial_thread->starpu_driver, 0, sizeof (initial_thread->starpu_driver)); /* the driver for the main thread is now de-inited, we can shutdown Starpu */ starpu_shutdown(); free(_global_state.starpu_cpu_worker_ids); _global_state.starpu_cpu_worker_ids = NULL; _global_state.nb_starpu_cpu_workers = 0; VALGRIND_STACK_DEREGISTER(initial_thread->initial_thread_stack_vg_id); free(initial_thread->initial_thread_stack); initial_thread->initial_thread_stack = NULL; memset(&initial_thread->ctx, 0, sizeof (initial_thread->ctx)); initial_thread->current_task = NULL; } static void omp_initial_region_setup(void) { omp_initial_thread_setup(); const int max_active_levels = _starpu_omp_initial_icv_values->max_active_levels_var; const int max_threads = (int)starpu_cpu_worker_get_count(); /* implementation specific initial ICV values override */ if (_starpu_omp_initial_icv_values->nthreads_var[0] == 0) { _starpu_omp_initial_icv_values->nthreads_var[0] = max_threads; _starpu_omp_initial_icv_values->nthreads_var[1] = 0; } else { int i; for (i = 0; i < max_active_levels; i++) { if (_starpu_omp_initial_icv_values->nthreads_var[i] == 0) break; if (_starpu_omp_initial_icv_values->nthreads_var[i] > max_threads) { _starpu_omp_initial_icv_values->nthreads_var[i] = max_threads; } } } _starpu_omp_initial_icv_values->dyn_var = 0; _starpu_omp_initial_icv_values->nest_var = 0; _global_state.initial_device->icvs.max_active_levels_var = max_active_levels; _global_state.initial_device->icvs.def_sched_var = _starpu_omp_initial_icv_values->def_sched_var; _global_state.initial_device->icvs.def_sched_chunk_var = _starpu_omp_initial_icv_values->def_sched_chunk_var; _global_state.initial_device->icvs.stacksize_var = _starpu_omp_initial_icv_values->stacksize_var; _global_state.initial_device->icvs.wait_policy_var = _starpu_omp_initial_icv_values->wait_policy_var; _global_state.initial_region->master_thread = _global_state.initial_thread; _global_state.initial_region->nb_threads++; _global_state.initial_region->icvs.dyn_var = _starpu_omp_initial_icv_values->dyn_var; _global_state.initial_region->icvs.nest_var = _starpu_omp_initial_icv_values->nest_var; if (_starpu_omp_initial_icv_values->nthreads_var[1] != 0) { _STARPU_MALLOC(_global_state.initial_region->icvs.nthreads_var, (1+max_active_levels-_global_state.initial_region->level) * sizeof(*_global_state.initial_region->icvs.nthreads_var)); int i,j; for (i = _global_state.initial_region->level, j = 0; i < max_active_levels; i++, j++) { _global_state.initial_region->icvs.nthreads_var[j] = _starpu_omp_initial_icv_values->nthreads_var[j]; } _global_state.initial_region->icvs.nthreads_var[j] = 0; } else { _STARPU_MALLOC(_global_state.initial_region->icvs.nthreads_var, 2 * sizeof(*_global_state.initial_region->icvs.nthreads_var)); _global_state.initial_region->icvs.nthreads_var[0] = _starpu_omp_initial_icv_values->nthreads_var[0]; _global_state.initial_region->icvs.nthreads_var[1] = 0; } if (_starpu_omp_initial_icv_values->bind_var[1] != starpu_omp_proc_bind_undefined) { _STARPU_MALLOC(_global_state.initial_region->icvs.bind_var, (1+max_active_levels-_global_state.initial_region->level) * sizeof(*_global_state.initial_region->icvs.bind_var)); int i,j; for (i = _global_state.initial_region->level, j = 0; i < max_active_levels; i++, j++) { _global_state.initial_region->icvs.bind_var[j] = _starpu_omp_initial_icv_values->bind_var[j]; } _global_state.initial_region->icvs.bind_var[j] = starpu_omp_proc_bind_undefined; } else { _STARPU_MALLOC(_global_state.initial_region->icvs.bind_var, 2 * sizeof(*_global_state.initial_region->icvs.bind_var)); _global_state.initial_region->icvs.bind_var[0] = _starpu_omp_initial_icv_values->bind_var[0]; _global_state.initial_region->icvs.bind_var[1] = starpu_omp_proc_bind_undefined; } _global_state.initial_region->icvs.thread_limit_var = _starpu_omp_initial_icv_values->thread_limit_var; _global_state.initial_region->icvs.active_levels_var = 0; _global_state.initial_region->icvs.levels_var = 0; _global_state.initial_region->icvs.run_sched_var = _starpu_omp_initial_icv_values->run_sched_var; _global_state.initial_region->icvs.run_sched_chunk_var = _starpu_omp_initial_icv_values->run_sched_chunk_var; _global_state.initial_region->icvs.default_device_var = _starpu_omp_initial_icv_values->default_device_var; _global_state.initial_region->implicit_task_array = &_global_state.initial_task; } static void omp_initial_region_exit(void) { omp_initial_thread_exit(); _global_state.initial_task->state = starpu_omp_task_state_terminated; _global_state.initial_region->implicit_task_array = NULL; _global_state.initial_region->master_thread = NULL; free(_global_state.initial_region->icvs.nthreads_var); free(_global_state.initial_region->icvs.bind_var); _global_state.initial_region->nb_threads--; } /* * If StarPU was compiled with --enable-openmp, but the OpenMP runtime support * is not in use, starpu_init() may have been called directly instead of * through starpu_omp_init(). However, some starpu_omp functions may be still * be called such as _starpu_omp_get_task(). So let's setup a basic environment * for them. */ void _starpu_omp_dummy_init(void) { if (_starpu_omp_global_state != &_global_state) { STARPU_PTHREAD_KEY_CREATE(&omp_thread_key, NULL); STARPU_PTHREAD_KEY_CREATE(&omp_task_key, NULL); } } /* * Free data structures allocated by _starpu_omp_dummy_init(). */ void _starpu_omp_dummy_shutdown(void) { if (_starpu_omp_global_state != &_global_state) { STARPU_PTHREAD_KEY_DELETE(omp_thread_key); STARPU_PTHREAD_KEY_DELETE(omp_task_key); } } /* * Entry point to be called by the OpenMP runtime constructor */ int starpu_omp_init(void) { _starpu_omp_global_state = &_global_state; STARPU_PTHREAD_KEY_CREATE(&omp_thread_key, NULL); STARPU_PTHREAD_KEY_CREATE(&omp_task_key, NULL); _global_state.initial_device = create_omp_device_struct(); _global_state.initial_region = create_omp_region_struct(NULL, _global_state.initial_device); _global_state.initial_thread = create_omp_thread_struct(_global_state.initial_region); _global_state.initial_task = create_omp_task_struct(NULL, _global_state.initial_thread, _global_state.initial_region, 1); _global_state.default_critical = create_omp_critical_struct(); _global_state.default_arbiter = starpu_arbiter_create(); _global_state.named_criticals = NULL; _starpu_spin_init(&_global_state.named_criticals_lock); _global_state.hash_workers = NULL; _starpu_spin_init(&_global_state.hash_workers_lock); _starpu_omp_environment_init(); _global_state.icvs.cancel_var = _starpu_omp_initial_icv_values->cancel_var; omp_initial_region_setup(); /* init clock reference for starpu_omp_get_wtick */ _starpu_omp_clock_ref = starpu_timing_now(); return 0; } void starpu_omp_shutdown(void) { omp_initial_region_exit(); /* TODO: free ICV variables */ /* TODO: free task/thread/region/device structures */ destroy_omp_task_struct(_global_state.initial_task); _global_state.initial_task = NULL; _global_state.initial_thread = NULL; destroy_omp_region_struct(_global_state.initial_region); _global_state.initial_region = NULL; destroy_omp_device_struct(_global_state.initial_device); _global_state.initial_device = NULL; destroy_omp_critical_struct(_global_state.default_critical); _global_state.default_critical = NULL; starpu_arbiter_destroy(_global_state.default_arbiter); _global_state.default_arbiter = NULL; _starpu_spin_lock(&_global_state.named_criticals_lock); { struct starpu_omp_critical *critical, *tmp; HASH_ITER(hh, _global_state.named_criticals, critical, tmp) { STARPU_ASSERT(critical != NULL); HASH_DEL(_global_state.named_criticals, critical); destroy_omp_critical_struct(critical); } } STARPU_ASSERT(_global_state.named_criticals == NULL); _starpu_spin_unlock(&_global_state.named_criticals_lock); _starpu_spin_destroy(&_global_state.named_criticals_lock); _starpu_spin_lock(&_global_state.hash_workers_lock); { struct starpu_omp_thread *thread, *tmp; HASH_ITER(hh, _global_state.hash_workers, thread, tmp) { STARPU_ASSERT(thread != NULL); HASH_DEL(_global_state.hash_workers, thread); destroy_omp_thread_struct(thread); } } STARPU_ASSERT(_global_state.hash_workers == NULL); _starpu_spin_unlock(&_global_state.hash_workers_lock); _starpu_spin_destroy(&_global_state.hash_workers_lock); _starpu_omp_environment_exit(); STARPU_PTHREAD_KEY_DELETE(omp_task_key); STARPU_PTHREAD_KEY_DELETE(omp_thread_key); } static void implicit_task__destroy_callback(void *_task) { struct starpu_omp_task *task = _task; destroy_omp_task_struct(task); } void starpu_omp_parallel_region(const struct starpu_omp_parallel_region_attr *attr) { struct starpu_omp_thread *master_thread = STARPU_PTHREAD_GETSPECIFIC(omp_thread_key); struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); struct starpu_omp_region *generating_region = task->owner_region; const int max_active_levels = generating_region->owner_device->icvs.max_active_levels_var; struct starpu_omp_region *new_region = create_omp_region_struct(generating_region, _global_state.initial_device); int ret; int nb_threads = 1; /* TODO: for now, nested parallel sections are not supported, thus we * open an active parallel section only if the generating region is the * initial region */ if (attr->if_clause != 0) { const int max_threads = (int)starpu_cpu_worker_get_count(); if (attr->num_threads > 0) { nb_threads = attr->num_threads; } else { nb_threads = generating_region->icvs.nthreads_var[0]; } if (nb_threads > max_threads) { nb_threads = max_threads; } if (nb_threads > 1 && generating_region->icvs.active_levels_var+1 > max_active_levels) { nb_threads = 1; } } STARPU_ASSERT(nb_threads > 0); new_region->icvs.dyn_var = generating_region->icvs.dyn_var; new_region->icvs.nest_var = generating_region->icvs.nest_var; /* the nthreads_var and bind_var arrays do not hold more than * max_active_levels entries at most, even if some in-between levels * are inactive */ if (new_region->level < max_active_levels) { if (generating_region->icvs.nthreads_var[1] != 0) { _STARPU_MALLOC(new_region->icvs.nthreads_var, (1+max_active_levels-new_region->level) * sizeof(*new_region->icvs.nthreads_var)); int i,j; for (i = new_region->level, j = 0; i < max_active_levels; i++, j++) { new_region->icvs.nthreads_var[j] = generating_region->icvs.nthreads_var[j+1]; } new_region->icvs.nthreads_var[j] = 0; } else { _STARPU_MALLOC(new_region->icvs.nthreads_var, 2 * sizeof(*new_region->icvs.nthreads_var)); new_region->icvs.nthreads_var[0] = generating_region->icvs.nthreads_var[0]; new_region->icvs.nthreads_var[1] = 0; } if (generating_region->icvs.bind_var[1] != starpu_omp_proc_bind_undefined) { _STARPU_MALLOC(new_region->icvs.bind_var, (1+max_active_levels-new_region->level) * sizeof(*new_region->icvs.bind_var)); int i,j; for (i = new_region->level, j = 0; i < max_active_levels; i++, j++) { new_region->icvs.bind_var[j] = generating_region->icvs.bind_var[j+1]; } new_region->icvs.bind_var[j] = starpu_omp_proc_bind_undefined; } else { _STARPU_MALLOC(new_region->icvs.bind_var, 2 * sizeof(*new_region->icvs.bind_var)); new_region->icvs.bind_var[0] = generating_region->icvs.bind_var[0]; new_region->icvs.bind_var[1] = starpu_omp_proc_bind_undefined; } } else { _STARPU_MALLOC(new_region->icvs.nthreads_var, sizeof(*new_region->icvs.nthreads_var)); new_region->icvs.nthreads_var[0] = generating_region->icvs.nthreads_var[0]; _STARPU_MALLOC(new_region->icvs.bind_var, sizeof(*new_region->icvs.bind_var)); new_region->icvs.bind_var[0] = generating_region->icvs.bind_var[0]; } new_region->icvs.thread_limit_var = generating_region->icvs.thread_limit_var; new_region->icvs.active_levels_var = (nb_threads > 1)?generating_region->icvs.active_levels_var+1:generating_region->icvs.active_levels_var; new_region->icvs.levels_var = generating_region->icvs.levels_var+1; new_region->icvs.run_sched_var = generating_region->icvs.run_sched_var; new_region->icvs.run_sched_chunk_var = generating_region->icvs.run_sched_chunk_var; new_region->icvs.default_device_var = generating_region->icvs.default_device_var; _STARPU_CALLOC(new_region->implicit_task_array, nb_threads, sizeof(*new_region->implicit_task_array)); int i; for (i = 0; i < nb_threads; i++) { struct starpu_omp_thread *new_thread; if (i == 0) { new_thread = master_thread; new_region->master_thread = master_thread; } else { /* TODO: specify actual starpu worker */ /* TODO: use a less arbitrary thread/worker mapping scheme */ if (generating_region->level == 0) { struct _starpu_worker *worker = _starpu_get_worker_struct(_global_state.starpu_cpu_worker_ids[i]); new_thread = get_worker_thread(worker); if (new_thread == NULL) { new_thread = create_omp_thread_struct(new_region); new_thread->worker = _starpu_get_worker_struct(_global_state.starpu_cpu_worker_ids[i]); register_thread_worker(new_thread); } } else { new_thread = master_thread; } starpu_omp_thread_list_push_back(&new_region->thread_list, new_thread); } struct starpu_omp_task *new_task = create_omp_task_struct(task, new_thread, new_region, 1); new_task->rank = new_region->nb_threads; new_region->nb_threads++; new_region->implicit_task_array[i] = new_task; } STARPU_ASSERT(new_region->nb_threads == nb_threads); /* * if task == initial_task, create a starpu task as a continuation to all the implicit * tasks of the new region, else prepare the task for preemption, * to become itself a continuation to the implicit tasks of the new region */ if (task == _global_state.initial_task) { new_region->continuation_starpu_task = starpu_task_create(); /* in that case, the continuation starpu task is only used for synchronisation */ new_region->continuation_starpu_task->cl = NULL; new_region->continuation_starpu_task->workerid = master_thread->worker->workerid; new_region->continuation_starpu_task->execute_on_a_specific_worker = 1; /* this sync task will be tested for completion in omp_initial_thread_func() */ new_region->continuation_starpu_task->detach = 0; } else { /* through the preemption, the parent starpu task becomes the continuation task */ _starpu_task_prepare_for_continuation(); new_region->continuation_starpu_task = task->starpu_task; } task->nested_region = new_region; /* * create the starpu tasks for the implicit omp tasks, * create explicit dependencies between these starpu tasks and the continuation starpu task */ for (i = 0; i < nb_threads; i++) { struct starpu_omp_task * implicit_task = new_region->implicit_task_array[i]; implicit_task->cl = attr->cl; /* * save pointer to the regions user function from the parallel region codelet * * TODO: add support for multiple/heterogeneous implementations */ implicit_task->cpu_f = implicit_task->cl.cpu_funcs[0]; /* * plug the task wrapper into the parallel region codelet instead, to support task preemption */ implicit_task->cl.cpu_funcs[0] = starpu_omp_implicit_task_exec; implicit_task->starpu_task = starpu_task_create(); _starpu_task_set_omp_cleanup_callback(implicit_task->starpu_task, implicit_task__destroy_callback, implicit_task); implicit_task->starpu_task->cl = &implicit_task->cl; { int j; for (j = 0; j < implicit_task->cl.nbuffers; j++) { implicit_task->starpu_task->handles[j] = attr->handles[j]; } } implicit_task->starpu_task->cl_arg = attr->cl_arg; implicit_task->starpu_task->cl_arg_size = attr->cl_arg_size; implicit_task->starpu_task->cl_arg_free = attr->cl_arg_free; implicit_task->starpu_task->omp_task = implicit_task; implicit_task->starpu_task->workerid = implicit_task->owner_thread->worker->workerid; implicit_task->starpu_task->execute_on_a_specific_worker = 1; starpu_task_declare_deps_array(new_region->continuation_starpu_task, 1, &implicit_task->starpu_task); } attr = NULL; /* * submit all the region implicit starpu tasks */ for (i = 0; i < nb_threads; i++) { struct starpu_omp_task * implicit_task = new_region->implicit_task_array[i]; ret = starpu_task_submit(implicit_task->starpu_task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } /* * submit the region continuation starpu task if task == initial_task */ if (task == _global_state.initial_task) { ret = _starpu_task_submit_internally(new_region->continuation_starpu_task); STARPU_CHECK_RETURN_VALUE(ret, "_starpu_task_submit_internally"); } /* * preempt for completion of the region */ starpu_omp_task_preempt(); if (task == _global_state.initial_task) { STARPU_ASSERT(new_region->continuation_starpu_task == NULL); } else { STARPU_ASSERT(new_region->continuation_starpu_task != NULL); new_region->continuation_starpu_task = NULL; } /* * TODO: free region resources */ for (i = 0; i < nb_threads; i++) { if (i == 0) { new_region->master_thread = NULL; } else { starpu_omp_thread_list_pop_front(&new_region->thread_list); /* TODO: cleanup unused threads */ } new_region->nb_threads--; } /* implicit tasks will be freed in implicit_task__destroy_callback() */ free(new_region->implicit_task_array); STARPU_ASSERT(new_region->nb_threads == 0); task->nested_region = NULL; free(new_region->icvs.bind_var); free(new_region->icvs.nthreads_var); destroy_omp_region_struct(new_region); } static void wake_up_barrier(struct starpu_omp_region *parallel_region) { struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); int i; for (i = 0; i < parallel_region->nb_threads; i++) { struct starpu_omp_task * implicit_task = parallel_region->implicit_task_array[i]; if (implicit_task == task) continue; weak_task_lock(implicit_task); STARPU_ASSERT(implicit_task->wait_on & starpu_omp_task_wait_on_barrier); implicit_task->wait_on &= ~starpu_omp_task_wait_on_barrier; wake_up_and_unlock_task(implicit_task); } } void starpu_omp_barrier(void) { struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); /* Assume barriers are performed in by the implicit tasks of a parallel_region */ STARPU_ASSERT(task->is_implicit); struct starpu_omp_region *parallel_region = task->owner_region; _starpu_spin_lock(&task->lock); int inc_barrier_count = STARPU_ATOMIC_ADD(¶llel_region->barrier_count, 1); if (inc_barrier_count == parallel_region->nb_threads) { /* last task reaching the barrier */ _starpu_spin_lock(¶llel_region->lock); ANNOTATE_HAPPENS_AFTER(¶llel_region->barrier_count); ANNOTATE_HAPPENS_BEFORE_FORGET_ALL(¶llel_region->barrier_count); parallel_region->barrier_count = 0; ANNOTATE_HAPPENS_AFTER(¶llel_region->barrier_count); ANNOTATE_HAPPENS_BEFORE_FORGET_ALL(¶llel_region->barrier_count); if (parallel_region->bound_explicit_task_count > 0) { task->wait_on |= starpu_omp_task_wait_on_region_tasks; parallel_region->waiting_task = task; task->transaction_pending = 1; _starpu_spin_unlock(¶llel_region->lock); _starpu_spin_unlock(&task->lock); _starpu_task_prepare_for_continuation_ext(0, transaction_callback, task); starpu_omp_task_preempt(); } else { _starpu_spin_unlock(¶llel_region->lock); _starpu_spin_unlock(&task->lock); } wake_up_barrier(parallel_region); } else { ANNOTATE_HAPPENS_BEFORE(¶llel_region->barrier_count); /* not the last task reaching the barrier * . prepare for conditional continuation * . sleep */ task->wait_on |= starpu_omp_task_wait_on_barrier; task->transaction_pending = 1; _starpu_spin_unlock(&task->lock); _starpu_task_prepare_for_continuation_ext(0, transaction_callback, task); starpu_omp_task_preempt(); STARPU_ASSERT(task->child_task_count == 0); } } void starpu_omp_master(void (*f)(void *arg), void *arg) { struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); struct starpu_omp_thread *thread = STARPU_PTHREAD_GETSPECIFIC(omp_thread_key); /* Assume master is performed in by the implicit tasks of a region */ STARPU_ASSERT(task->is_implicit); struct starpu_omp_region *region = task->owner_region; if (thread == region->master_thread) { f(arg); } } /* variant of omp_master for inlined code * return !0 for the task that should perform the master section * return 0 for the tasks that should not perform the master section */ int starpu_omp_master_inline(void) { struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); struct starpu_omp_thread *thread = STARPU_PTHREAD_GETSPECIFIC(omp_thread_key); /* Assume master is performed in by the implicit tasks of a region */ STARPU_ASSERT(task->is_implicit); struct starpu_omp_region *region = task->owner_region; return thread == region->master_thread; } void starpu_omp_single(void (*f)(void *arg), void *arg, int nowait) { struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); /* Assume singles are performed in by the implicit tasks of a region */ STARPU_ASSERT(task->is_implicit); struct starpu_omp_region *region = task->owner_region; int first = STARPU_BOOL_COMPARE_AND_SWAP(®ion->single_id, task->single_id, task->single_id+1); task->single_id++; if (first) { f(arg); } if (!nowait) { starpu_omp_barrier(); } } /* variant of omp_single for inlined code * return !0 for the task that should perform the single section * return 0 for the tasks that should not perform the single section * wait/nowait should be handled directly by the calling code using starpu_omp_barrier */ int starpu_omp_single_inline(void) { struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); /* Assume singles are performed in by the implicit tasks of a region */ STARPU_ASSERT(task->is_implicit); struct starpu_omp_region *region = task->owner_region; int first = STARPU_BOOL_COMPARE_AND_SWAP(®ion->single_id, task->single_id, task->single_id+1); task->single_id++; return first; } void starpu_omp_single_copyprivate(void (*f)(void *arg, void *data, unsigned long long data_size), void *arg, void *data, unsigned long long data_size) { struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); /* Assume singles are performed in by the implicit tasks of a region */ STARPU_ASSERT(task->is_implicit); struct starpu_omp_region *region = task->owner_region; int first = STARPU_BOOL_COMPARE_AND_SWAP(®ion->single_id, task->single_id, task->single_id+1); task->single_id++; if (first) { region->copy_private_data = data; f(arg, data, data_size); } starpu_omp_barrier(); if (!first) { memcpy(data, region->copy_private_data, data_size); } starpu_omp_barrier(); } void *starpu_omp_single_copyprivate_inline_begin(void *data) { struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); /* Assume singles are performed in by the implicit tasks of a region */ STARPU_ASSERT(task->is_implicit); struct starpu_omp_region *region = task->owner_region; int first = STARPU_BOOL_COMPARE_AND_SWAP(®ion->single_id, task->single_id, task->single_id+1); task->single_id++; if (first) { task->single_first = 1; region->copy_private_data = data; } else { starpu_omp_barrier(); } return first?NULL:region->copy_private_data; } void starpu_omp_single_copyprivate_inline_end(void) { struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); /* Assume singles are performed in by the implicit tasks of a region */ STARPU_ASSERT(task->is_implicit); if (task->single_first) { task->single_first = 0; starpu_omp_barrier(); } starpu_omp_barrier(); } void starpu_omp_critical(void (*f)(void *arg), void *arg, const char *name) { starpu_omp_critical_inline_begin(name); f(arg); starpu_omp_critical_inline_end(name); } void starpu_omp_critical_inline_begin(const char *name) { struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); struct starpu_omp_critical *critical = NULL; struct starpu_omp_task_link link; if (name) { _starpu_spin_lock(&_global_state.named_criticals_lock); HASH_FIND_STR(_global_state.named_criticals, name, critical); if (critical == NULL) { critical = create_omp_critical_struct(); critical->name = name; HASH_ADD_STR(_global_state.named_criticals, name, critical); } _starpu_spin_unlock(&_global_state.named_criticals_lock); } else { critical = _global_state.default_critical; } _starpu_spin_lock(&critical->lock); while (critical->state != 0) { _starpu_spin_lock(&task->lock); task->wait_on |= starpu_omp_task_wait_on_critical; task->transaction_pending = 1; link.task = task; link.next = critical->contention_list_head; critical->contention_list_head = &link; _starpu_spin_unlock(&task->lock); _starpu_spin_unlock(&critical->lock); _starpu_task_prepare_for_continuation_ext(0, transaction_callback, task); starpu_omp_task_preempt(); /* re-acquire the spin lock */ _starpu_spin_lock(&critical->lock); } critical->state = 1; _starpu_spin_unlock(&critical->lock); } void starpu_omp_critical_inline_end(const char *name) { struct starpu_omp_critical *critical = NULL; if (name) { _starpu_spin_lock(&_global_state.named_criticals_lock); HASH_FIND_STR(_global_state.named_criticals, name, critical); _starpu_spin_unlock(&_global_state.named_criticals_lock); } else { critical = _global_state.default_critical; } STARPU_ASSERT(critical != NULL); _starpu_spin_lock(&critical->lock); STARPU_ASSERT(critical->state == 1); critical->state = 0; if (critical->contention_list_head != NULL) { struct starpu_omp_task *next_task = critical->contention_list_head->task; weak_task_lock(next_task); critical->contention_list_head = critical->contention_list_head->next; STARPU_ASSERT(next_task->wait_on & starpu_omp_task_wait_on_critical); next_task->wait_on &= ~starpu_omp_task_wait_on_critical; wake_up_and_unlock_task(next_task); } _starpu_spin_unlock(&critical->lock); } static void explicit_task__destroy_callback(void *_task) { struct starpu_omp_task *task = _task; STARPU_ASSERT(!task->is_implicit); task->starpu_task->omp_task = NULL; task->starpu_task = NULL; _starpu_spin_lock(&task->lock); if (task->state != starpu_omp_task_state_target) { STARPU_ASSERT(task->transaction_pending == 1); task->transaction_pending = 0; if (task->child_task_count != 0) { task->state = starpu_omp_task_state_zombie; _starpu_spin_unlock(&task->lock); return; } } _starpu_spin_unlock(&task->lock); destroy_omp_task_struct(task); } void starpu_omp_task_region(const struct starpu_omp_task_region_attr *attr) { struct starpu_omp_task *generating_task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); struct starpu_omp_region *parallel_region = generating_task->owner_region; int is_undeferred = 0; int is_final = 0; int is_included = 0; int is_merged = 0; int is_untied = 0; int ret; if (generating_task == _global_state.initial_task) { is_undeferred = 1; is_final = 1; is_included = 1; } else { if (!attr->if_clause) { is_undeferred = 1; } if (generating_task->is_final) { is_final = 1; is_included = 1; } else if (attr->final_clause) { is_final = 1; } if (is_included) { is_undeferred = 1; } if ((is_undeferred || is_included) & attr->mergeable_clause) { is_merged = 1; } } if (is_merged || is_included) { if (is_included) { /* TODO: backup current ICVs and setup new ICVs for the included task */ } int i; unsigned n = attr->cl.nbuffers; if (n == 0) n = 1; void *data_interfaces[n]; for (i = 0; i < attr->cl.nbuffers; i++) { starpu_data_handle_t handle = attr->handles[i]; ret = starpu_data_acquire(handle, attr->cl.modes[i]); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire"); data_interfaces[i] = starpu_data_get_interface_on_node(handle, handle->home_node); } void (*f)(void **starpu_buffers, void *starpu_cl_arg) = attr->cl.cpu_funcs[0]; f(data_interfaces, attr->cl_arg); for (i = 0; i < attr->cl.nbuffers; i++) { starpu_data_release(attr->handles[i]); } if (attr->cl_arg_free) { free(attr->cl_arg); } if (is_included) { /* TODO: restore backuped ICVs */ } } else { struct starpu_omp_task *generated_task = create_omp_task_struct(generating_task, NULL, parallel_region, 0); generated_task->cl = attr->cl; if (attr->untied_clause) { is_untied = 1; } generated_task->is_undeferred = is_undeferred; generated_task->is_final = is_final; generated_task->is_untied = is_untied; generated_task->task_group = generating_task->task_group; generated_task->rank = -1; /* * save pointer to the regions user function from the task region codelet * * TODO: add support for multiple/heterogeneous implementations */ if (generated_task->cl.cpu_funcs[0]) { generated_task->cpu_f = generated_task->cl.cpu_funcs[0]; /* * plug the task wrapper into the task region codelet instead, to support task preemption */ generated_task->cl.cpu_funcs[0] = starpu_omp_explicit_task_exec; } #if STARPU_USE_CUDA if (generated_task->cl.cuda_funcs[0]) { generated_task->cuda_f = generated_task->cl.cuda_funcs[0]; #if 1 /* we assume for now that Cuda task won't block, thus we don't need * to initialize the StarPU OpenMP Runtime Support context for enabling * continuations on Cuda tasks */ generated_task->state = starpu_omp_task_state_target; #else generated_task->cl.cuda_funcs[0] = starpu_omp_explicit_task_exec; #endif } #endif #if STARPU_USE_OPENCL if (generated_task->cl.opencl_funcs[0]) { generated_task->opencl_f = generated_task->cl.opencl_funcs[0]; #if 1 /* we assume for now that OpenCL task won't block, thus we don't need * to initialize the StarPU OpenMP Runtime Support context for enabling * continuations on OpenCL tasks */ generated_task->state = starpu_omp_task_state_target; #else generated_task->cl.opencl_funcs[0] = starpu_omp_explicit_task_exec; #endif } #endif /* TODO: add other accelerator support */ generated_task->starpu_task = starpu_task_create(); generated_task->starpu_task->cl = &generated_task->cl; generated_task->starpu_task->cl_arg = attr->cl_arg; generated_task->starpu_task->cl_arg_size = attr->cl_arg_size; generated_task->starpu_task->cl_arg_free = attr->cl_arg_free; generated_task->starpu_task->priority = attr->priority; { int i; for (i = 0; i < generated_task->cl.nbuffers; i++) { generated_task->starpu_task->handles[i] = attr->handles[i]; } } generated_task->starpu_task->omp_task = generated_task; _starpu_task_set_omp_cleanup_callback(generated_task->starpu_task, explicit_task__destroy_callback, generated_task); /* if the task is tied, execute_on_a_specific_worker will be changed to 1 * upon the first preemption of the generated task, once we know * which worker thread has been selected */ generated_task->starpu_task->execute_on_a_specific_worker = 0; (void)STARPU_ATOMIC_ADD(&generating_task->child_task_count, 1); (void)STARPU_ATOMIC_ADD(¶llel_region->bound_explicit_task_count, 1); if (generated_task->task_group) { (void)STARPU_ATOMIC_ADD(&generated_task->task_group->descendent_task_count, 1); } /* do not use the attribute struct afterward as it may become out of scope */ attr = NULL; if (is_undeferred) { _starpu_task_prepare_for_continuation(); starpu_task_declare_deps_array(generating_task->starpu_task, 1, &generated_task->starpu_task); } ret = starpu_task_submit(generated_task->starpu_task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); if (is_undeferred) { starpu_omp_task_preempt(); } } } void starpu_omp_taskwait(void) { struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); _starpu_spin_lock(&task->lock); if (task->child_task_count > 0) { task->wait_on |= starpu_omp_task_wait_on_task_childs; task->transaction_pending = 1; _starpu_spin_unlock(&task->lock); _starpu_task_prepare_for_continuation_ext(0, transaction_callback, task); starpu_omp_task_preempt(); STARPU_ASSERT(task->child_task_count == 0); } else { _starpu_spin_unlock(&task->lock); } } void starpu_omp_taskgroup(void (*f)(void *arg), void *arg) { struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); struct starpu_omp_task_group task_group; task_group.p_previous_task_group = task->task_group; task_group.descendent_task_count = 0; task_group.leader_task = task; task->task_group = &task_group; f(arg); _starpu_spin_lock(&task->lock); if (task_group.descendent_task_count > 0) { task->wait_on |= starpu_omp_task_wait_on_group; task->transaction_pending = 1; _starpu_spin_unlock(&task->lock); _starpu_task_prepare_for_continuation_ext(0, transaction_callback, task); starpu_omp_task_preempt(); STARPU_ASSERT(task_group.descendent_task_count == 0); } else { _starpu_spin_unlock(&task->lock); } task->task_group = task_group.p_previous_task_group; } void starpu_omp_taskgroup_inline_begin(void) { struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); struct starpu_omp_task_group *p_task_group; _STARPU_MALLOC(p_task_group, sizeof(*p_task_group)); p_task_group->p_previous_task_group = task->task_group; p_task_group->descendent_task_count = 0; p_task_group->leader_task = task; task->task_group = p_task_group; } void starpu_omp_taskgroup_inline_end(void) { struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); _starpu_spin_lock(&task->lock); struct starpu_omp_task_group *p_task_group = task->task_group; if (p_task_group->descendent_task_count > 0) { task->wait_on |= starpu_omp_task_wait_on_group; task->transaction_pending = 1; _starpu_spin_unlock(&task->lock); _starpu_task_prepare_for_continuation_ext(0, transaction_callback, task); starpu_omp_task_preempt(); STARPU_ASSERT(p_task_group->descendent_task_count == 0); } else { _starpu_spin_unlock(&task->lock); } task->task_group = p_task_group->p_previous_task_group; free(p_task_group); } static inline void _starpu_omp_for_loop(struct starpu_omp_region *parallel_region, struct starpu_omp_task *task, struct starpu_omp_loop *loop, int first_call, unsigned long long nb_iterations, unsigned long long chunk, int schedule, int ordered, unsigned long long *_first_i, unsigned long long *_nb_i) { *_nb_i = 0; if (schedule == starpu_omp_sched_undefined) { schedule = parallel_region->owner_device->icvs.def_sched_var; chunk = parallel_region->owner_device->icvs.def_sched_chunk_var; } else if (schedule == starpu_omp_sched_runtime) { schedule = parallel_region->icvs.run_sched_var; chunk = parallel_region->icvs.run_sched_chunk_var; } STARPU_ASSERT( schedule == starpu_omp_sched_static || schedule == starpu_omp_sched_dynamic || schedule == starpu_omp_sched_guided || schedule == starpu_omp_sched_auto); if (schedule == starpu_omp_sched_auto) { schedule = starpu_omp_sched_static; chunk = 0; } if (schedule == starpu_omp_sched_static) { if (chunk > 0) { if (first_call) { *_first_i = task->rank * chunk; } else { *_first_i += parallel_region->nb_threads * chunk; } if (*_first_i < nb_iterations) { if (*_first_i + chunk > nb_iterations) { *_nb_i = nb_iterations - *_first_i; } else { *_nb_i = chunk; } } } else { if (first_call) { *_nb_i = nb_iterations / parallel_region->nb_threads; *_first_i = (unsigned)task->rank * (*_nb_i); unsigned long long remainder = nb_iterations % parallel_region->nb_threads; if (remainder > 0) { if ((unsigned)task->rank < remainder) { (*_nb_i)++; *_first_i += (unsigned)task->rank; } else { *_first_i += remainder; } } } } } else if (schedule == starpu_omp_sched_dynamic) { if (chunk == 0) { chunk = 1; } if (first_call) { *_first_i = 0; } _starpu_spin_lock(¶llel_region->lock); if (loop->next_iteration < nb_iterations) { *_first_i = loop->next_iteration; if (*_first_i + chunk > nb_iterations) { *_nb_i = nb_iterations - *_first_i; } else { *_nb_i = chunk; } loop->next_iteration += *_nb_i; } _starpu_spin_unlock(¶llel_region->lock); } else if (schedule == starpu_omp_sched_guided) { if (chunk == 0) { chunk = 1; } if (first_call) { *_first_i = 0; } _starpu_spin_lock(¶llel_region->lock); if (loop->next_iteration < nb_iterations) { *_first_i = loop->next_iteration; *_nb_i = (nb_iterations - *_first_i)/parallel_region->nb_threads; if (*_nb_i < chunk) { if (*_first_i+chunk > nb_iterations) { *_nb_i = nb_iterations - *_first_i; } else { *_nb_i = chunk; } } loop->next_iteration += *_nb_i; } _starpu_spin_unlock(¶llel_region->lock); } if (ordered) { task->ordered_first_i = *_first_i; task->ordered_nb_i = *_nb_i; } } static inline struct starpu_omp_loop *_starpu_omp_for_get_loop(struct starpu_omp_region *parallel_region, struct starpu_omp_task *task) { struct starpu_omp_loop *loop; loop = parallel_region->loop_list; while (loop && loop->id != task->loop_id) { loop = loop->next_loop; } return loop; } static inline struct starpu_omp_loop *_starpu_omp_for_loop_begin(struct starpu_omp_region *parallel_region, struct starpu_omp_task *task, int ordered) { struct starpu_omp_loop *loop; _starpu_spin_lock(¶llel_region->lock); loop = _starpu_omp_for_get_loop(parallel_region, task); if (!loop) { _STARPU_MALLOC(loop, sizeof(*loop)); loop->id = task->loop_id; loop->next_iteration = 0; loop->nb_completed_threads = 0; loop->next_loop = parallel_region->loop_list; parallel_region->loop_list = loop; if (ordered) { loop->ordered_iteration = 0; _starpu_spin_init(&loop->ordered_lock); condition_init(&loop->ordered_cond); } } _starpu_spin_unlock(¶llel_region->lock); return loop; } static inline void _starpu_omp_for_loop_end(struct starpu_omp_region *parallel_region, struct starpu_omp_task *task, struct starpu_omp_loop *loop, int ordered) { _starpu_spin_lock(¶llel_region->lock); loop->nb_completed_threads++; if (loop->nb_completed_threads == parallel_region->nb_threads) { struct starpu_omp_loop **p_loop; if (ordered) { loop->ordered_iteration = 0; condition_exit(&loop->ordered_cond); _starpu_spin_destroy(&loop->ordered_lock); } STARPU_ASSERT(loop->next_loop == NULL); p_loop = &(parallel_region->loop_list); while (*p_loop != loop) { p_loop = &((*p_loop)->next_loop); } *p_loop = NULL; free(loop); } _starpu_spin_unlock(¶llel_region->lock); task->loop_id++; } int starpu_omp_for_inline_first(unsigned long long nb_iterations, unsigned long long chunk, int schedule, int ordered, unsigned long long *_first_i, unsigned long long *_nb_i) { struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); struct starpu_omp_region *parallel_region = task->owner_region; struct starpu_omp_loop *loop = _starpu_omp_for_loop_begin(parallel_region, task, ordered); _starpu_omp_for_loop(parallel_region, task, loop, 1, nb_iterations, chunk, schedule, ordered, _first_i, _nb_i); if (*_nb_i == 0) { _starpu_omp_for_loop_end(parallel_region, task, loop, ordered); } return *_nb_i != 0; } int starpu_omp_for_inline_next(unsigned long long nb_iterations, unsigned long long chunk, int schedule, int ordered, unsigned long long *_first_i, unsigned long long *_nb_i) { struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); struct starpu_omp_region *parallel_region = task->owner_region; struct starpu_omp_loop *loop = _starpu_omp_for_loop_begin(parallel_region, task, ordered); _starpu_omp_for_loop(parallel_region, task, loop, 0, nb_iterations, chunk, schedule, ordered, _first_i, _nb_i); if (*_nb_i == 0) { _starpu_omp_for_loop_end(parallel_region, task, loop, ordered); } return *_nb_i != 0; } int starpu_omp_for_inline_first_alt(unsigned long long nb_iterations, unsigned long long chunk, int schedule, int ordered, unsigned long long *_begin_i, unsigned long long *_end_i) { unsigned long long nb_i; int end = starpu_omp_for_inline_first(nb_iterations, chunk, schedule, ordered, _begin_i, &nb_i); *_end_i = *_begin_i + nb_i; return end; } int starpu_omp_for_inline_next_alt(unsigned long long nb_iterations, unsigned long long chunk, int schedule, int ordered, unsigned long long *_begin_i, unsigned long long *_end_i) { unsigned long long nb_i; int end = starpu_omp_for_inline_next(nb_iterations, chunk, schedule, ordered, _begin_i, &nb_i); *_end_i = *_begin_i + nb_i; return end; } void starpu_omp_for(void (*f)(unsigned long long _first_i, unsigned long long _nb_i, void *arg), void *arg, unsigned long long nb_iterations, unsigned long long chunk, int schedule, int ordered, int nowait) { unsigned long long _first_i = 0; unsigned long long _nb_i = 0; if (starpu_omp_for_inline_first(nb_iterations, chunk, schedule, ordered, &_first_i, &_nb_i)) { do { f(_first_i, _nb_i, arg); } while (starpu_omp_for_inline_next(nb_iterations, chunk, schedule, ordered, &_first_i, &_nb_i)); } if (!nowait) { starpu_omp_barrier(); } } void starpu_omp_for_alt(void (*f)(unsigned long long _begin_i, unsigned long long _end_i, void *arg), void *arg, unsigned long long nb_iterations, unsigned long long chunk, int schedule, int ordered, int nowait) { unsigned long long _begin_i = 0; unsigned long long _end_i = 0; if (starpu_omp_for_inline_first_alt(nb_iterations, chunk, schedule, ordered, &_begin_i, &_end_i)) { do { f(_begin_i, _end_i, arg); } while (starpu_omp_for_inline_next_alt(nb_iterations, chunk, schedule, ordered, &_begin_i, &_end_i)); } if (!nowait) { starpu_omp_barrier(); } } void starpu_omp_ordered(void (*f)(void *arg), void *arg) { struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); struct starpu_omp_region *parallel_region = task->owner_region; struct starpu_omp_loop *loop = _starpu_omp_for_get_loop(parallel_region, task); unsigned long long i; STARPU_ASSERT(task->ordered_nb_i > 0); i = task->ordered_first_i; task->ordered_first_i++; task->ordered_nb_i--; _starpu_spin_lock(&loop->ordered_lock); while (i != loop->ordered_iteration) { STARPU_ASSERT(i > loop->ordered_iteration); condition_wait(&loop->ordered_cond, &loop->ordered_lock); } f(arg); loop->ordered_iteration++; condition_broadcast(&loop->ordered_cond); _starpu_spin_unlock(&loop->ordered_lock); } void starpu_omp_ordered_inline_begin(void) { struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); struct starpu_omp_region *parallel_region = task->owner_region; struct starpu_omp_loop *loop = _starpu_omp_for_get_loop(parallel_region, task); unsigned long long i; STARPU_ASSERT(task->ordered_nb_i > 0); i = task->ordered_first_i; task->ordered_first_i++; task->ordered_nb_i--; _starpu_spin_lock(&loop->ordered_lock); while (i != loop->ordered_iteration) { STARPU_ASSERT(i > loop->ordered_iteration); condition_wait(&loop->ordered_cond, &loop->ordered_lock); } } void starpu_omp_ordered_inline_end(void) { struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); struct starpu_omp_region *parallel_region = task->owner_region; struct starpu_omp_loop *loop = _starpu_omp_for_get_loop(parallel_region, task); loop->ordered_iteration++; condition_broadcast(&loop->ordered_cond); _starpu_spin_unlock(&loop->ordered_lock); } static inline struct starpu_omp_sections *_starpu_omp_get_sections(struct starpu_omp_region *parallel_region, struct starpu_omp_task *task) { struct starpu_omp_sections *sections; sections = parallel_region->sections_list; while (sections && sections->id != task->sections_id) { sections = sections->next_sections; } return sections; } static inline struct starpu_omp_sections *_starpu_omp_sections_begin(struct starpu_omp_region *parallel_region, struct starpu_omp_task *task) { struct starpu_omp_sections *sections; _starpu_spin_lock(¶llel_region->lock); sections = _starpu_omp_get_sections(parallel_region, task); if (!sections) { _STARPU_MALLOC(sections, sizeof(*sections)); sections->id = task->sections_id; sections->next_section_num = 0; sections->nb_completed_threads = 0; sections->next_sections = parallel_region->sections_list; parallel_region->sections_list = sections; } _starpu_spin_unlock(¶llel_region->lock); return sections; } static inline void _starpu_omp_sections_end(struct starpu_omp_region *parallel_region, struct starpu_omp_task *task, struct starpu_omp_sections *sections) { _starpu_spin_lock(¶llel_region->lock); sections->nb_completed_threads++; if (sections->nb_completed_threads == parallel_region->nb_threads) { struct starpu_omp_sections **p_sections; STARPU_ASSERT(sections->next_sections == NULL); p_sections = &(parallel_region->sections_list); while (*p_sections != sections) { p_sections = &((*p_sections)->next_sections); } *p_sections = NULL; free(sections); } _starpu_spin_unlock(¶llel_region->lock); task->sections_id++; } void starpu_omp_sections(unsigned long long nb_sections, void (**section_f)(void *arg), void **section_arg, int nowait) { struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); struct starpu_omp_region *parallel_region = task->owner_region; struct starpu_omp_sections *sections = _starpu_omp_sections_begin(parallel_region, task); for (;;) { void (*f)(void *arg) = NULL; void *arg = NULL; _starpu_spin_lock(¶llel_region->lock); if (sections->next_section_num < nb_sections) { f = section_f[sections->next_section_num]; arg = section_arg[sections->next_section_num]; sections->next_section_num ++; } _starpu_spin_unlock(¶llel_region->lock); if (f == NULL) break; f(arg); } _starpu_omp_sections_end(parallel_region, task, sections); if (!nowait) { starpu_omp_barrier(); } } void starpu_omp_sections_combined(unsigned long long nb_sections, void (*section_f)(unsigned long long section_num, void *arg), void *section_arg, int nowait) { struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key); struct starpu_omp_region *parallel_region = task->owner_region; struct starpu_omp_sections *sections = _starpu_omp_sections_begin(parallel_region, task); for (;;) { unsigned long long section_num; void *arg = NULL; _starpu_spin_lock(¶llel_region->lock); if (sections->next_section_num < nb_sections) { section_num = sections->next_section_num; arg = section_arg; sections->next_section_num ++; } else { _starpu_spin_unlock(¶llel_region->lock); break; } _starpu_spin_unlock(¶llel_region->lock); section_f(section_num, arg); } _starpu_omp_sections_end(parallel_region, task, sections); if (!nowait) { starpu_omp_barrier(); } } static void _starpu_omp_lock_init(void **_internal) { struct _starpu_omp_lock_internal * _lock; _STARPU_MALLOC(_lock, sizeof(*_lock)); memset(_lock, 0, sizeof(*_lock)); _starpu_spin_init(&_lock->lock); condition_init(&_lock->cond); *_internal = _lock; } static void _starpu_omp_lock_destroy(void **_internal) { struct _starpu_omp_lock_internal * const _lock = *_internal; STARPU_ASSERT(_lock->state == 0); condition_exit(&_lock->cond); _starpu_spin_destroy(&_lock->lock); memset(_lock, 0, sizeof(*_lock)); free(_lock); *_internal = NULL; } static void _starpu_omp_lock_set(void **_internal) { struct _starpu_omp_lock_internal * const _lock = *_internal; _starpu_spin_lock(&_lock->lock); while (_lock->state != 0) { condition_wait(&_lock->cond, &_lock->lock); } _lock->state = 1; _starpu_spin_unlock(&_lock->lock); } static void _starpu_omp_lock_unset(void **_internal) { struct _starpu_omp_lock_internal * const _lock = *_internal; _starpu_spin_lock(&_lock->lock); STARPU_ASSERT(_lock->state == 1); _lock->state = 0; condition_broadcast(&_lock->cond); _starpu_spin_unlock(&_lock->lock); } static int _starpu_omp_lock_test(void **_internal) { struct _starpu_omp_lock_internal * const _lock = *_internal; int ret = 0; _starpu_spin_lock(&_lock->lock); if (_lock->state == 0) { _lock->state = 1; ret = 1; } _starpu_spin_unlock(&_lock->lock); return ret; } static void _starpu_omp_nest_lock_init(void **_internal) { struct _starpu_omp_nest_lock_internal * _nest_lock; _STARPU_MALLOC(_nest_lock, sizeof(*_nest_lock)); memset(_nest_lock, 0, sizeof(*_nest_lock)); _starpu_spin_init(&_nest_lock->lock); condition_init(&_nest_lock->cond); *_internal = _nest_lock; } static void _starpu_omp_nest_lock_destroy(void **_internal) { struct _starpu_omp_nest_lock_internal * const _nest_lock = *_internal; STARPU_ASSERT(_nest_lock->state == 0); STARPU_ASSERT(_nest_lock->nesting == 0); STARPU_ASSERT(_nest_lock->owner_task == NULL); condition_exit(&_nest_lock->cond); _starpu_spin_destroy(&_nest_lock->lock); memset(_nest_lock, 0, sizeof(*_nest_lock)); free(_nest_lock); *_internal = NULL; } static void _starpu_omp_nest_lock_set(void **_internal) { struct _starpu_omp_nest_lock_internal * const _nest_lock = *_internal; struct starpu_omp_task * const task = _starpu_omp_get_task(); _starpu_spin_lock(&_nest_lock->lock); if (_nest_lock->owner_task == task) { STARPU_ASSERT(_nest_lock->state == 1); STARPU_ASSERT(_nest_lock->nesting > 0); _nest_lock->nesting++; } else { while (_nest_lock->state != 0) { condition_wait(&_nest_lock->cond, &_nest_lock->lock); } STARPU_ASSERT(_nest_lock->nesting == 0); STARPU_ASSERT(_nest_lock->owner_task == NULL); _nest_lock->state = 1; _nest_lock->owner_task = task; _nest_lock->nesting = 1; } _starpu_spin_unlock(&_nest_lock->lock); } static void _starpu_omp_nest_lock_unset(void **_internal) { struct _starpu_omp_nest_lock_internal * const _nest_lock = *_internal; struct starpu_omp_task * const task = _starpu_omp_get_task(); _starpu_spin_lock(&_nest_lock->lock); STARPU_ASSERT(_nest_lock->owner_task == task); STARPU_ASSERT(_nest_lock->state == 1); STARPU_ASSERT(_nest_lock->nesting > 0); _nest_lock->nesting--; if (_nest_lock->nesting == 0) { _nest_lock->state = 0; _nest_lock->owner_task = NULL; condition_broadcast(&_nest_lock->cond); } _starpu_spin_unlock(&_nest_lock->lock); } static int _starpu_omp_nest_lock_test(void **_internal) { struct _starpu_omp_nest_lock_internal * const _nest_lock = *_internal; struct starpu_omp_task * const task = _starpu_omp_get_task(); int ret = 0; _starpu_spin_lock(&_nest_lock->lock); if (_nest_lock->state == 0) { STARPU_ASSERT(_nest_lock->nesting == 0); STARPU_ASSERT(_nest_lock->owner_task == NULL); _nest_lock->state = 1; _nest_lock->owner_task = task; _nest_lock->nesting = 1; ret = _nest_lock->nesting; } else if (_nest_lock->owner_task == task) { STARPU_ASSERT(_nest_lock->state == 1); STARPU_ASSERT(_nest_lock->nesting > 0); _nest_lock->nesting++; ret = _nest_lock->nesting; } _starpu_spin_unlock(&_nest_lock->lock); return ret; } void starpu_omp_init_lock (starpu_omp_lock_t *lock) { _starpu_omp_lock_init(&lock->internal); } void starpu_omp_destroy_lock (starpu_omp_lock_t *lock) { _starpu_omp_lock_destroy(&lock->internal); } void starpu_omp_set_lock (starpu_omp_lock_t *lock) { _starpu_omp_lock_set(&lock->internal); } void starpu_omp_unset_lock (starpu_omp_lock_t *lock) { _starpu_omp_lock_unset(&lock->internal); } int starpu_omp_test_lock (starpu_omp_lock_t *lock) { return _starpu_omp_lock_test(&lock->internal); } void starpu_omp_init_nest_lock (starpu_omp_nest_lock_t *nest_lock) { _starpu_omp_nest_lock_init(&nest_lock->internal); } void starpu_omp_destroy_nest_lock (starpu_omp_nest_lock_t *nest_lock) { _starpu_omp_nest_lock_destroy(&nest_lock->internal); } void starpu_omp_set_nest_lock (starpu_omp_nest_lock_t *nest_lock) { _starpu_omp_nest_lock_set(&nest_lock->internal); } void starpu_omp_unset_nest_lock (starpu_omp_nest_lock_t *nest_lock) { _starpu_omp_nest_lock_unset(&nest_lock->internal); } int starpu_omp_test_nest_lock (starpu_omp_nest_lock_t *nest_lock) { return _starpu_omp_nest_lock_test(&nest_lock->internal); } void starpu_omp_atomic_fallback_inline_begin(void) { struct starpu_omp_device *device = get_caller_device(); _starpu_spin_lock(&device->atomic_lock); } void starpu_omp_atomic_fallback_inline_end(void) { struct starpu_omp_device *device = get_caller_device(); _starpu_spin_unlock(&device->atomic_lock); } void starpu_omp_vector_annotate(starpu_data_handle_t handle, uint32_t slice_base) { struct starpu_vector_interface *vector_interface = (struct starpu_vector_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); assert(vector_interface->id == STARPU_VECTOR_INTERFACE_ID); vector_interface->slice_base = slice_base; } struct starpu_arbiter *starpu_omp_get_default_arbiter(void) { return _global_state.default_arbiter; } /* * restore deprecated diagnostics (-Wdeprecated-declarations) */ #pragma GCC diagnostic pop #endif /* STARPU_OPENMP */ starpu-1.2.3+dfsg/src/util/openmp_runtime_support.h000066400000000000000000000225031320135501600225220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __OPENMP_RUNTIME_SUPPORT_H__ #define __OPENMP_RUNTIME_SUPPORT_H__ #include #ifdef STARPU_OPENMP #include #include #include /* ucontexts have been deprecated as of POSIX 1-2004 * _XOPEN_SOURCE required at least on OS/X * * TODO: add detection in configure.ac */ #ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE #endif #include /* * Arbitrary limit on the number of nested parallel sections */ #define STARPU_OMP_MAX_ACTIVE_LEVELS 1 /* * Possible abstract names for OpenMP places */ enum starpu_omp_place_name { starpu_omp_place_undefined = 0, starpu_omp_place_threads = 1, starpu_omp_place_cores = 2, starpu_omp_place_sockets = 3, starpu_omp_place_numerical = 4 /* place specified numerically */ }; struct starpu_omp_numeric_place { int excluded_place; int *included_numeric_items; int nb_included_numeric_items; int *excluded_numeric_items; int nb_excluded_numeric_items; }; /* * OpenMP place for thread afinity, defined by the OpenMP spec */ struct starpu_omp_place { int abstract_name; int abstract_excluded; int abstract_length; struct starpu_omp_numeric_place *numeric_places; int nb_numeric_places; }; /* * Internal Control Variables (ICVs) declared following * OpenMP 4.0.0 spec section 2.3.1 */ struct starpu_omp_data_environment_icvs { /* parallel region icvs */ int dyn_var; int nest_var; int *nthreads_var; /* nthreads_var ICV is a list */ int thread_limit_var; int active_levels_var; int levels_var; int *bind_var; /* bind_var ICV is a list */ /* loop region icvs */ int run_sched_var; unsigned long long run_sched_chunk_var; /* program execution icvs */ int default_device_var; }; struct starpu_omp_device_icvs { /* parallel region icvs */ int max_active_levels_var; /* loop region icvs */ int def_sched_var; unsigned long long def_sched_chunk_var; /* program execution icvs */ int stacksize_var; int wait_policy_var; }; struct starpu_omp_implicit_task_icvs { /* parallel region icvs */ int place_partition_var; }; struct starpu_omp_global_icvs { /* program execution icvs */ int cancel_var; }; struct starpu_omp_initial_icv_values { int dyn_var; int nest_var; int *nthreads_var; int run_sched_var; unsigned long long run_sched_chunk_var; int def_sched_var; unsigned long long def_sched_chunk_var; int *bind_var; int stacksize_var; int wait_policy_var; int thread_limit_var; int max_active_levels_var; int active_levels_var; int levels_var; int place_partition_var; int cancel_var; int default_device_var; /* not a real ICV, but needed to store the contents of OMP_PLACES */ struct starpu_omp_place places; }; struct starpu_omp_task_group { int descendent_task_count; struct starpu_omp_task *leader_task; struct starpu_omp_task_group *p_previous_task_group; }; struct starpu_omp_task_link { struct starpu_omp_task *task; struct starpu_omp_task_link *next; }; struct starpu_omp_condition { struct starpu_omp_task_link *contention_list_head; }; struct starpu_omp_critical { UT_hash_handle hh; struct _starpu_spinlock lock; unsigned state; struct starpu_omp_task_link *contention_list_head; const char *name; }; enum starpu_omp_task_state { starpu_omp_task_state_clear = 0, starpu_omp_task_state_preempted = 1, starpu_omp_task_state_terminated = 2, starpu_omp_task_state_zombie = 3, /* target tasks are non-preemptible tasks, without dedicated stack and OpenMP Runtime Support context */ starpu_omp_task_state_target = 4, }; enum starpu_omp_task_wait_on { starpu_omp_task_wait_on_task_childs = 1 << 0, starpu_omp_task_wait_on_region_tasks = 1 << 1, starpu_omp_task_wait_on_barrier = 1 << 2, starpu_omp_task_wait_on_group = 1 << 3, starpu_omp_task_wait_on_critical = 1 << 4, starpu_omp_task_wait_on_condition = 1 << 5 }; LIST_TYPE(starpu_omp_task, struct starpu_omp_implicit_task_icvs icvs; struct starpu_omp_task *parent_task; struct starpu_omp_thread *owner_thread; struct starpu_omp_region *owner_region; struct starpu_omp_region *nested_region; int is_implicit; int is_undeferred; int is_final; int is_untied; int rank; int child_task_count; struct starpu_omp_task_group *task_group; struct _starpu_spinlock lock; int transaction_pending; int wait_on; int barrier_count; int single_id; int single_first; int loop_id; unsigned long long ordered_first_i; unsigned long long ordered_nb_i; int sections_id; struct starpu_omp_data_environment_icvs data_env_icvs; struct starpu_omp_implicit_task_icvs implicit_task_icvs; struct handle_entry *registered_handles; struct starpu_task *starpu_task; struct starpu_codelet cl; void **starpu_buffers; void *starpu_cl_arg; /* actual task function to be run */ void (*cpu_f)(void **starpu_buffers, void *starpu_cl_arg); #ifdef STARPU_USE_CUDA void (*cuda_f)(void **starpu_buffers, void *starpu_cl_arg); #endif #ifdef STARPU_USE_OPENCL void (*opencl_f)(void **starpu_buffers, void *starpu_cl_arg); #endif enum starpu_omp_task_state state; /* * context to store the processing state of the task * in case of blocking/recursive task operation */ ucontext_t ctx; /* * stack to execute the task over, to be able to switch * in case blocking/recursive task operation */ void *stack; /* * Valgrind stack id */ int stack_vg_id; size_t stacksize; ) LIST_TYPE(starpu_omp_thread, UT_hash_handle hh; struct starpu_omp_task *current_task; struct starpu_omp_region *owner_region; /* * stack to execute the initial thread over * when preempting the initial task * note: should not be used for other threads */ void *initial_thread_stack; /* * Valgrind stack id */ int initial_thread_stack_vg_id; /* * context to store the 'scheduler' state of the thread, * to which the execution of thread comes back upon a * blocking/recursive task operation */ ucontext_t ctx; struct starpu_driver starpu_driver; struct _starpu_worker *worker; ) struct _starpu_omp_lock_internal { struct _starpu_spinlock lock; struct starpu_omp_condition cond; unsigned state; }; struct _starpu_omp_nest_lock_internal { struct _starpu_spinlock lock; struct starpu_omp_condition cond; unsigned state; struct starpu_omp_task *owner_task; unsigned nesting; }; struct starpu_omp_loop { int id; unsigned long long next_iteration; int nb_completed_threads; struct starpu_omp_loop *next_loop; struct _starpu_spinlock ordered_lock; struct starpu_omp_condition ordered_cond; unsigned long long ordered_iteration; }; struct starpu_omp_sections { int id; unsigned long long next_section_num; int nb_completed_threads; struct starpu_omp_sections *next_sections; }; struct starpu_omp_region { struct starpu_omp_data_environment_icvs icvs; struct starpu_omp_region *parent_region; struct starpu_omp_device *owner_device; struct starpu_omp_thread *master_thread; /* note: the list of threads does not include the master_thread */ struct starpu_omp_thread_list thread_list; /* list of implicit omp tasks created to run the region */ struct starpu_omp_task **implicit_task_array; /* include both the master thread and the region own threads */ int nb_threads; struct _starpu_spinlock lock; struct starpu_omp_task *waiting_task; int barrier_count; int bound_explicit_task_count; int single_id; void *copy_private_data; int level; struct starpu_omp_loop *loop_list; struct starpu_omp_sections *sections_list; struct starpu_task *continuation_starpu_task; struct handle_entry *registered_handles; struct _starpu_spinlock registered_handles_lock; }; struct starpu_omp_device { struct starpu_omp_device_icvs icvs; /* atomic fallback implementation lock */ struct _starpu_spinlock atomic_lock; }; struct starpu_omp_global { struct starpu_omp_global_icvs icvs; struct starpu_omp_task *initial_task; struct starpu_omp_thread *initial_thread; struct starpu_omp_region *initial_region; struct starpu_omp_device *initial_device; struct starpu_omp_critical *default_critical; struct starpu_omp_critical *named_criticals; struct _starpu_spinlock named_criticals_lock; struct starpu_omp_thread *hash_workers; struct _starpu_spinlock hash_workers_lock; struct starpu_arbiter *default_arbiter; int nb_starpu_cpu_workers; int *starpu_cpu_worker_ids; }; /* * internal global variables */ extern struct starpu_omp_initial_icv_values *_starpu_omp_initial_icv_values; extern struct starpu_omp_global *_starpu_omp_global_state; extern double _starpu_omp_clock_ref; /* * internal API */ void _starpu_omp_environment_init(void); void _starpu_omp_environment_exit(void); struct starpu_omp_thread *_starpu_omp_get_thread(void); struct starpu_omp_task *_starpu_omp_get_task(void); void _starpu_omp_dummy_init(void); void _starpu_omp_dummy_shutdown(void); #endif // STARPU_OPENMP #endif // __OPENMP_RUNTIME_SUPPORT_H__ starpu-1.2.3+dfsg/src/util/openmp_runtime_support_environment.c000066400000000000000000000565201320135501600251470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #ifdef STARPU_OPENMP #include #include #include #include #define _STARPU_INITIAL_PLACES_LIST_SIZE 4 #define _STARPU_INITIAL_PLACE_ITEMS_LIST_SIZE 4 #define _STARPU_DEFAULT_STACKSIZE 2097152 static struct starpu_omp_initial_icv_values _initial_icv_values = { .dyn_var = 0, .nest_var = 0, .nthreads_var = NULL, .run_sched_var = starpu_omp_sched_static, .run_sched_chunk_var = 0, .def_sched_var = starpu_omp_sched_static, .def_sched_chunk_var = 0, .bind_var = NULL, .stacksize_var = _STARPU_DEFAULT_STACKSIZE, .wait_policy_var = 0, .max_active_levels_var = STARPU_OMP_MAX_ACTIVE_LEVELS, .active_levels_var = 0, .levels_var = 0, .place_partition_var = 0, .cancel_var = 0, .default_device_var = 0 }; struct starpu_omp_initial_icv_values *_starpu_omp_initial_icv_values = NULL; /* TODO: move to utils */ static void remove_spaces(char *str) { int i = 0; int j = 0; while (str[j] != '\0') { if (isspace(str[j])) { j++; continue; } if (j > i) { str[i] = str[j]; } i++; j++; } if (j > i) { str[i] = str[j]; } } /* TODO: move to utils */ static int strings_cmp(const char *strings[], const char *str) { int mode = 0; while (strings[mode]) { if (strcasecmp(str, strings[mode]) == 0) break; mode++; } if (strings[mode] == NULL) return -1; return mode; } /* TODO: move to utils */ static int stringsn_cmp(const char *strings[], const char *str, size_t n) { int mode = 0; while (strings[mode]) { if (strncasecmp(str, strings[mode], n) == 0) break; mode++; } if (strings[mode] == NULL) return -1; return mode; } /* TODO: move to utils */ static void read_boolean_var(const char *var, int *dest) { const char *env = starpu_getenv(var); if (env) { char *str = strdup(env); if (str == NULL) _STARPU_ERROR("memory allocation failed\n"); remove_spaces(str); if (str[0] == '\0') { free(str); return; } static const char *strings[] = { "false", "true", NULL }; int mode = strings_cmp(strings, str); if (mode < 0) _STARPU_ERROR("parse error in variable %s\n", var); *dest = mode; free(str); } } /* TODO: move to utils */ static void read_int_var(const char *var, int *dest) { const char *env = starpu_getenv(var); if (env) { char *str = strdup(env); if (str == NULL) _STARPU_ERROR("memory allocation failed\n"); remove_spaces(str); if (str[0] == '\0') { free(str); return; } errno = 0; int v = (int)strtol(str, NULL, 10); if (errno != 0) _STARPU_ERROR("could not parse environment variable %s, strtol failed with error %s\n", var, strerror(errno)); *dest = v; free(str); } } static void read_size_var(const char *var, int *dest) { const char *env = starpu_getenv(var); if (env) { char *str = strdup(env); if (str == NULL) _STARPU_ERROR("memory allocation failed\n"); remove_spaces(str); if (str[0] == '\0') { free(str); return; } char *endptr = NULL; int mult = 1024; errno = 0; int v = (int)strtol(str, &endptr, 10); if (errno != 0) _STARPU_ERROR("could not parse environment variable %s, strtol failed with error %s\n", var, strerror(errno)); if (*endptr != '\0') { switch (*endptr) { case 'b': case 'B': mult = 1; break; case 'k': case 'K': mult = 1024; break; case 'm': case 'M': mult = 1024*1024; break; case 'g': case 'G': mult = 1024*1024*1024; break; default: _STARPU_ERROR("could not parse environment variable %s size suffix invalid\n", var); } } *dest = v*mult; free(str); } } static void read_sched_var(const char *var, int *dest, unsigned long long *dest_chunk) { const char *env = starpu_getenv(var); if (env) { char *str = strdup(env); if (str == NULL) _STARPU_ERROR("memory allocation failed\n"); remove_spaces(str); if (str[0] == '\0') { free(str); return; } static const char *strings[] = { "static", "dynamic", "guided", "auto", NULL }; int mode = strings_cmp(strings, str); if (mode < 0) _STARPU_ERROR("parse error in variable %s\n", var); *dest = mode; int offset = strlen(strings[mode]); if (str[offset] == ',') { offset++; errno = 0; long long v = strtoll(str+offset, NULL, 10); if (errno != 0) _STARPU_ERROR("could not parse environment variable %s, strtol failed with error %s\n", var, strerror(errno)); if (v < 0) _STARPU_ERROR("invalid negative modifier in environment variable %s\n", var); unsigned long long uv = (unsigned long long) v; *dest_chunk = uv; } else { *dest_chunk = 1; } free(str); } } static void read_wait_policy_var(const char *var, int *dest) { const char *env = starpu_getenv(var); if (env) { char *str = strdup(env); if (str == NULL) _STARPU_ERROR("memory allocation failed\n"); remove_spaces(str); if (str[0] == '\0') { free(str); return; } static const char *strings[] = { "passive", "active", NULL }; int mode = strings_cmp(strings, str); if (mode < 0) _STARPU_ERROR("parse error in variable %s\n", var); *dest = mode; free(str); } } static void read_display_env_var(const char *var, int *dest) { const char *env = starpu_getenv(var); if (env) { char *str = strdup(env); if (str == NULL) _STARPU_ERROR("memory allocation failed\n"); remove_spaces(str); if (str[0] == '\0') { free(str); return; } static const char *strings[] = { "false", "true", "verbose", NULL }; int mode = strings_cmp(strings, str); if (mode < 0) _STARPU_ERROR("parse error in variable %s\n", var); *dest = mode; free(str); } } static int convert_bind_mode(const char *str, size_t n) { static const char *strings[] = { "false", "true", "master", "close", "spread", NULL }; int mode = stringsn_cmp(strings, str, n); if (mode < 0) _STARPU_ERROR("proc_bind list parse error\n"); return mode; } static void convert_bind_string(const char *_str, int *bind_list, const int max_levels) { char *str = strdup(_str); if (str == NULL) _STARPU_ERROR("memory allocation failed\n"); remove_spaces(str); if (str[0] == '\0') { free(str); return; } enum { state_split, state_read }; int level = 0; int i = 0; int state = state_read; while (1) { if (state == state_split) { if (str[i] == '\0') break; if (str[i] != ',') _STARPU_ERROR("proc_bind list parse error\n"); i++; state = state_read; } else if (state == state_read) { int n = 0; while (isalpha(str[i+n])) n++; if (n == 0) _STARPU_ERROR("proc_bind list parse error\n"); int mode = convert_bind_mode(str+i,n); STARPU_ASSERT(mode >= starpu_omp_proc_bind_false && mode <= starpu_omp_proc_bind_spread); bind_list[level] = mode; level++; if (level == max_levels) break; i += n; state = state_split; } else _STARPU_ERROR("invalid state in parsing proc_bind list\n"); } free(str); } static void convert_num_threads_string(const char *_str, int *num_threads_list, const int max_levels) { char *str = strdup(_str); if (str == NULL) _STARPU_ERROR("memory allocation failed\n"); remove_spaces(str); if (str[0] == '\0') { free(str); return; } enum { state_split, state_read }; int level = 0; int i = 0; int state = state_read; while (1) { /* split a comma separated list of numerical items */ if (state == state_split) { if (str[i] == '\0') break; if (str[i] != ',') _STARPU_ERROR("num_threads list parse error\n"); i++; state = state_read; } /* read a numerical item */ else if (state == state_read) { char *endptr = NULL; errno = 0; int num_threads = (int)strtol(str+i, &endptr, 10); if (errno != 0) _STARPU_ERROR("num_threads list parse error, strtol failed with error %s\n", strerror(errno)); if (num_threads < 1) _STARPU_ERROR("num_threads list invalid value\n"); num_threads_list[level] = num_threads; level++; if (level == max_levels) break; i = endptr - str; state = state_split; } else _STARPU_ERROR("invalid state in parsing num_threads list\n"); } free(str); } static int convert_place_name(const char *str, size_t n) { static const char *strings[] = { "threads", "cores", "sockets", NULL }; int mode = stringsn_cmp(strings, str, n); if (mode < 0) _STARPU_ERROR("place abstract name parse error\n"); return mode+1; /* 0 is for undefined abstract name */ } /* Note: this function modifies the string str */ static void read_a_place_name(char *str, struct starpu_omp_place *places) { int i = 0; /* detect exclusion of abstract name expressed as '!' prefix */ if (str[i] == '!') { places->abstract_excluded = 1; i++; } else { places->abstract_excluded = 0; } /* detect length value for abstract name expressed as '(length)' suffix) */ char *begin_length_spec = strchr(str+i,'('); if (begin_length_spec != NULL) { char *end_length_spec = strrchr(begin_length_spec+1, ')'); if (end_length_spec == NULL || end_length_spec <= begin_length_spec+1) _STARPU_ERROR("parse error in places list\n"); *begin_length_spec = '\0'; *end_length_spec = '\0'; errno = 0; int v = (int)strtol(begin_length_spec+1, NULL, 10); if (errno != 0) _STARPU_ERROR("parse error in places list\n"); places->abstract_length = v; } else { places->abstract_length = 1; } /* convert abstract place name string to corresponding value */ { int mode = convert_place_name(str+i, strlen(str+i)); STARPU_ASSERT(mode >= starpu_omp_place_threads && mode <= starpu_omp_place_sockets); places->abstract_name = mode; places->numeric_places = NULL; places->nb_numeric_places = 0; } } static void read_a_places_list(const char *str, struct starpu_omp_place *places) { if (str[0] == '\0') { places->numeric_places = NULL; places->nb_numeric_places = 0; places->abstract_name = starpu_omp_place_undefined; return; } enum { state_split, state_read_brace_prefix, state_read_opening_brace, state_read_numeric_prefix, state_read_numeric, state_split_numeric, state_read_closing_brace, state_read_brace_suffix, }; struct starpu_omp_numeric_place *places_list = NULL; int places_list_size = 0; int nb_places = 0; int *included_items_list = NULL; int included_items_list_size = 0; int nb_included_items = 0; int *excluded_items_list = NULL; int excluded_items_list_size = 0; int nb_excluded_items = 0; int exclude_place_flag = 0; int exclude_item_flag = 0; int i = 0; int state = state_read_brace_prefix; while (1) { switch (state) { /* split a comma separated list of numerical places */ case state_split: if (str[i] == '\0') { goto eol; } else if (str[i] != ',') _STARPU_ERROR("parse error in places list\n"); i++; state = state_read_brace_prefix; break; /* read optional exclude flag '!' for numerical place */ case state_read_brace_prefix: exclude_place_flag = 0; if (str[i] == '!') { exclude_place_flag = 1; i++; } state = state_read_opening_brace; break; /* read place opening brace */ case state_read_opening_brace: if (str[i] != '{') _STARPU_ERROR("parse error in places list\n"); i++; state = state_read_numeric_prefix; break; /* read optional exclude flag '!' for numerical item */ case state_read_numeric_prefix: exclude_item_flag = 0; if (str[i] == '!') { exclude_item_flag = 1; i++; } state = state_read_numeric; break; /* read numerical item */ case state_read_numeric: { char *endptr = NULL; errno = 0; int v = (int)strtol(str+i, &endptr, 10); if (errno != 0) _STARPU_ERROR("parse error in places list, strtol failed with error %s\n", strerror(errno)); if (exclude_item_flag) { if (excluded_items_list_size == 0) { excluded_items_list_size = _STARPU_INITIAL_PLACE_ITEMS_LIST_SIZE; _STARPU_MALLOC( excluded_items_list, excluded_items_list_size * sizeof(int)); } else if (nb_excluded_items == excluded_items_list_size) { excluded_items_list_size *= 2; _STARPU_REALLOC(excluded_items_list, excluded_items_list_size * sizeof(int)); } excluded_items_list[nb_excluded_items] = v; nb_excluded_items++; } else { if (included_items_list_size == 0) { included_items_list_size = _STARPU_INITIAL_PLACE_ITEMS_LIST_SIZE; _STARPU_MALLOC(included_items_list, included_items_list_size * sizeof(int)); } else if (nb_included_items == included_items_list_size) { included_items_list_size *= 2; _STARPU_REALLOC(included_items_list, included_items_list_size * sizeof(int)); } included_items_list[nb_included_items] = v; nb_included_items++; } exclude_item_flag = 0; i = endptr - str; state = state_split_numeric; } break; /* read comma separated or colon separated numerical item list */ case state_split_numeric: if (str[i] == ':') /* length and stride colon separated arguments not supported for now */ _STARPU_ERROR("colon support unimplemented in numeric place list"); if (str[i] == ',') { i++; state = state_read_numeric_prefix; } else { state = state_read_closing_brace; } break; /* read end of numerical item list */ case state_read_closing_brace: if (str[i] != '}') _STARPU_ERROR("parse error in places list\n"); if (places_list_size == 0) { places_list_size = _STARPU_INITIAL_PLACES_LIST_SIZE; _STARPU_MALLOC(places_list, places_list_size * sizeof(*places_list)); } else if (nb_places == places_list_size) { places_list_size *= 2; _STARPU_REALLOC(places_list, places_list_size * sizeof(*places_list)); } places_list[nb_places].excluded_place = exclude_place_flag; places_list[nb_places].included_numeric_items = included_items_list; places_list[nb_places].nb_included_numeric_items = nb_included_items; places_list[nb_places].excluded_numeric_items = excluded_items_list; places_list[nb_places].nb_excluded_numeric_items = nb_excluded_items; nb_places++; exclude_place_flag = 0; included_items_list = NULL; included_items_list_size = 0; nb_included_items = 0; excluded_items_list = NULL; excluded_items_list_size = 0; nb_excluded_items = 0; i++; state = state_read_brace_suffix; break; /* read optional place colon separated suffix */ case state_read_brace_suffix: if (str[i] == ':') /* length and stride colon separated arguments not supported for now */ _STARPU_ERROR("colon support unimplemented in numeric place list"); state = state_split; break; default: _STARPU_ERROR("invalid state in parsing places list\n"); } } eol: places->numeric_places = places_list; places->nb_numeric_places = nb_places; places->abstract_name = starpu_omp_place_numerical; } static void convert_places_string(const char *_str, struct starpu_omp_place *places) { char *str = strdup(_str); if (str == NULL) _STARPU_ERROR("memory allocation failed\n"); remove_spaces(str); if (str[0] != '\0') { /* check whether this is the start of an abstract name */ if (isalpha(str[0]) || (str[0] == '!' && isalpha(str[1]))) { read_a_place_name(str, places); } /* else the string must contain a list of braces */ else { read_a_places_list(str, places); } } free(str); } static void free_places(struct starpu_omp_place *places) { int i; for (i = 0; i < places->nb_numeric_places; i++) { if (places->numeric_places[i].nb_included_numeric_items > 0) { free(places->numeric_places[i].included_numeric_items); } if (places->numeric_places[i].nb_excluded_numeric_items > 0) { free(places->numeric_places[i].excluded_numeric_items); } } if (places->nb_numeric_places > 0) { free(places->numeric_places); } } static void read_omp_environment(void) { read_boolean_var("OMP_DYNAMIC", &_initial_icv_values.dyn_var); read_boolean_var("OMP_NESTED", &_initial_icv_values.nest_var); read_sched_var("OMP_SCHEDULE", &_initial_icv_values.run_sched_var, &_initial_icv_values.run_sched_chunk_var); read_size_var("OMP_STACKSIZE", &_initial_icv_values.stacksize_var); read_wait_policy_var("OMP_WAIT_POLICY", &_initial_icv_values.wait_policy_var); read_int_var("OMP_THREAD_LIMIT", &_initial_icv_values.thread_limit_var); read_int_var("OMP_MAX_ACTIVE_LEVELS", &_initial_icv_values.max_active_levels_var); read_boolean_var("OMP_CANCELLATION", &_initial_icv_values.cancel_var); read_int_var("OMP_DEFAULT_DEVICE", &_initial_icv_values.default_device_var); const int max_levels = _initial_icv_values.max_active_levels_var; /* read OMP_PROC_BIND */ { int *bind_list; int level; _STARPU_MALLOC(bind_list, (1+max_levels) * sizeof(*bind_list)); for (level = 0;level < max_levels+1;level++) { /* TODO: check what should be used as default value */ bind_list[level] = starpu_omp_proc_bind_undefined; } const char *env = starpu_getenv("OMP_PROC_BIND"); if (env) { convert_bind_string(env, bind_list, max_levels); } _initial_icv_values.bind_var = bind_list; } /* read OMP_NUM_THREADS */ { int *num_threads_list; int level; _STARPU_MALLOC(num_threads_list, (1+max_levels) * sizeof(*num_threads_list)); for (level = 0;level < max_levels+1;level++) { /* TODO: check what should be used as default value */ num_threads_list[level] = 0; } const char *env = starpu_getenv("OMP_NUM_THREADS"); if (env) { convert_num_threads_string(env, num_threads_list, max_levels); } _initial_icv_values.nthreads_var = num_threads_list; } /* read OMP_PLACES */ { memset(&_initial_icv_values.places, 0, sizeof(_initial_icv_values.places)); _initial_icv_values.places.abstract_name = starpu_omp_place_undefined; const char *env = starpu_getenv("OMP_PLACES"); if (env) { convert_places_string(env, &_initial_icv_values.places); } } _starpu_omp_initial_icv_values = &_initial_icv_values; } static void free_omp_environment(void) { /**/ _starpu_omp_initial_icv_values = NULL; /* OMP_DYNAMIC */ /* OMP_NESTED */ /* OMP_SCHEDULE */ /* OMP_STACKSIZE */ /* OMP_WAIT_POLICY */ /* OMP_THREAD_LIMIT */ /* OMP_MAX_ACTIVE_LEVELS */ /* OMP_CANCELLATION */ /* OMP_DEFAULT_DEVICE */ /* OMP_PROC_BIND */ free(_initial_icv_values.bind_var); _initial_icv_values.bind_var = NULL; /* OMP_NUM_THREADS */ free(_initial_icv_values.nthreads_var); _initial_icv_values.nthreads_var = NULL; /* OMP_PLACES */ free_places(&_initial_icv_values.places); } static void display_omp_environment(int verbosity_level) { if (verbosity_level > 0) { printf("OPENMP DISPLAY ENVIRONMENT BEGIN\n"); printf(" _OPENMP='xxxxxx'\n"); printf(" [host] OMP_DYNAMIC='%s'\n", _starpu_omp_initial_icv_values->dyn_var?"true":"false"); printf(" [host] OMP_NESTED='%s'\n", _starpu_omp_initial_icv_values->nest_var?"true":"false"); printf(" [host] OMP_SCHEDULE='"); switch (_starpu_omp_initial_icv_values->run_sched_var) { case starpu_omp_sched_static: printf("static, %llu", _starpu_omp_initial_icv_values->run_sched_chunk_var); break; case starpu_omp_sched_dynamic: printf("dynamic, %llu", _starpu_omp_initial_icv_values->run_sched_chunk_var); break; case starpu_omp_sched_guided: printf("guided, %llu", _starpu_omp_initial_icv_values->run_sched_chunk_var); break; case starpu_omp_sched_auto: printf("auto, %llu", _starpu_omp_initial_icv_values->run_sched_chunk_var); break; default: printf(""); break; } printf("'\n"); printf(" [host] OMP_STACKSIZE='%d'\n", _starpu_omp_initial_icv_values->stacksize_var); printf(" [host] OMP_WAIT_POLICY='%s'\n", _starpu_omp_initial_icv_values->wait_policy_var?"active":"passive"); printf(" [host] OMP_MAX_ACTIVE_LEVELS='%d'\n", _starpu_omp_initial_icv_values->max_active_levels_var); printf(" [host] OMP_CANCELLATION='%s'\n", _starpu_omp_initial_icv_values->cancel_var?"true":"false"); printf(" [host] OMP_DEFAULT_DEVICE='%d'\n", _starpu_omp_initial_icv_values->default_device_var); printf(" [host] OMP_PROC_BIND='"); { int level; for (level = 0; level < _starpu_omp_initial_icv_values->max_active_levels_var; level++) { if (level > 0) { printf(", "); } switch (_starpu_omp_initial_icv_values->bind_var[level]) { case starpu_omp_proc_bind_false: printf("false"); break; case starpu_omp_proc_bind_true: printf("true"); break; case starpu_omp_proc_bind_master: printf("master"); break; case starpu_omp_proc_bind_close: printf("close"); break; case starpu_omp_proc_bind_spread: printf("spread"); break; default: printf(""); break; } } } printf("'\n"); printf(" [host] OMP_NUM_THREADS='"); { int level; for (level = 0; level < _starpu_omp_initial_icv_values->max_active_levels_var; level++) { if (level > 0) { printf(", "); } printf("%d", _starpu_omp_initial_icv_values->nthreads_var[level]); } } printf("'\n"); printf(" [host] OMP_PLACES='"); { struct starpu_omp_place *places = &_starpu_omp_initial_icv_values->places; if (places->nb_numeric_places > 0) { int p; for (p = 0; p < places->nb_numeric_places; p++) { if (p > 0) { printf(","); } struct starpu_omp_numeric_place *np = &places->numeric_places[p]; if (np->excluded_place) { printf("!"); } printf("{"); int i; for (i = 0; i < np->nb_included_numeric_items; i++) { if (i > 0) { printf(","); } printf("%d", np->included_numeric_items[i]); } for (i = 0; i < np->nb_excluded_numeric_items; i++) { if (i > 0 || np->nb_included_numeric_items) { printf(","); } printf("!%d", np->excluded_numeric_items[i]); } printf("}"); /* TODO: print length/stride suffix */ } } else { if (places->abstract_excluded) { printf("!"); } switch (places->abstract_name) { case starpu_omp_place_undefined: printf("undefined"); break; case starpu_omp_place_threads: printf("threads"); break; case starpu_omp_place_cores: printf("cores"); break; case starpu_omp_place_sockets: printf("sockets"); break; case starpu_omp_place_numerical: printf(""); break; default: printf(""); break; } if (places->abstract_length) { printf("(%d)", places->abstract_length); } } } printf("'\n"); if (verbosity_level > 1) { /* no vendor specific runtime variable */ } printf("OPENMP DISPLAY ENVIRONMENT END\n"); } } void _starpu_omp_environment_init(void) { read_omp_environment(); int display_env = 0; read_display_env_var("OMP_DISPLAY_ENV", &display_env); if (display_env > 0) { display_omp_environment(display_env); } } void _starpu_omp_environment_exit(void) { free_omp_environment(); } #endif /* STARPU_OPENMP */ starpu-1.2.3+dfsg/src/util/openmp_runtime_support_omp_api.c000066400000000000000000000171471320135501600242310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #ifdef STARPU_OPENMP #include #define __not_implemented__ do { fprintf (stderr, "omp lib function %s not implemented\n", __func__); abort(); } while (0) void starpu_omp_set_num_threads(int threads) { STARPU_ASSERT(threads > 0); struct starpu_omp_task *task = _starpu_omp_get_task(); STARPU_ASSERT(task != NULL); struct starpu_omp_region *region; region = task->owner_region; STARPU_ASSERT(region != NULL); region->icvs.nthreads_var[0] = threads; } int starpu_omp_get_num_threads() { struct starpu_omp_task *task = _starpu_omp_get_task(); struct starpu_omp_region *region; if (task == NULL) return 1; region = task->owner_region; return region->nb_threads; } static int _starpu_omp_get_region_thread_num(const struct starpu_omp_region * const region) { struct starpu_omp_thread *thread = _starpu_omp_get_thread(); STARPU_ASSERT(thread != NULL); if (thread == region->master_thread) return 0; struct starpu_omp_thread * region_thread; int tid = 1; for (region_thread = starpu_omp_thread_list_begin(®ion->thread_list); region_thread != starpu_omp_thread_list_end(®ion->thread_list); region_thread = starpu_omp_thread_list_next(region_thread)) { if (thread == region_thread) { return tid; } tid++; } _STARPU_ERROR("unrecognized omp thread\n"); } int starpu_omp_get_thread_num() { struct starpu_omp_task *task = _starpu_omp_get_task(); if (task == NULL) return 0; return _starpu_omp_get_region_thread_num(task->owner_region); } int starpu_omp_get_max_threads() { const struct starpu_omp_region * const parallel_region = _starpu_omp_get_task()->owner_region; int max_threads = parallel_region->icvs.nthreads_var[0]; /* TODO: for now, nested parallel sections are not supported, thus we * open an active parallel section only if the generating region is the * initial region */ if (parallel_region->level > 0) { max_threads = 1; } return max_threads; } int starpu_omp_get_num_procs (void) { /* starpu_cpu_worker_get_count defined as topology.ncpus */ return starpu_cpu_worker_get_count(); } int starpu_omp_in_parallel (void) { const struct starpu_omp_region * const parallel_region = _starpu_omp_get_task()->owner_region; return parallel_region->icvs.active_levels_var > 0; } void starpu_omp_set_dynamic (int dynamic_threads) { (void) dynamic_threads; /* TODO: dynamic adjustment of the number of threads is not supported for now */ } int starpu_omp_get_dynamic (void) { const struct starpu_omp_region * const parallel_region = _starpu_omp_get_task()->owner_region; return parallel_region->icvs.dyn_var; } void starpu_omp_set_nested (int nested) { (void) nested; /* TODO: nested parallelism not supported for now */ } int starpu_omp_get_nested (void) { const struct starpu_omp_region * const parallel_region = _starpu_omp_get_task()->owner_region; return parallel_region->icvs.nest_var; } int starpu_omp_get_cancellation(void) { return _starpu_omp_global_state->icvs.cancel_var; } void starpu_omp_set_schedule (enum starpu_omp_sched_value kind, int modifier) { struct starpu_omp_region * const parallel_region = _starpu_omp_get_task()->owner_region; STARPU_ASSERT( kind == starpu_omp_sched_static || kind == starpu_omp_sched_dynamic || kind == starpu_omp_sched_guided || kind == starpu_omp_sched_auto); STARPU_ASSERT(modifier >= 0); parallel_region->icvs.run_sched_var = kind; parallel_region->icvs.run_sched_chunk_var = (unsigned long long)modifier; } void starpu_omp_get_schedule (enum starpu_omp_sched_value *kind, int *modifier) { const struct starpu_omp_region * const parallel_region = _starpu_omp_get_task()->owner_region; *kind = parallel_region->icvs.run_sched_var; *modifier = (int)parallel_region->icvs.run_sched_chunk_var; } int starpu_omp_get_thread_limit (void) { return starpu_cpu_worker_get_count(); } void starpu_omp_set_max_active_levels (int max_levels) { struct starpu_omp_device * const device = _starpu_omp_get_task()->owner_region->owner_device; if (max_levels > 1) { /* TODO: nested parallelism not supported for now */ max_levels = 1; } device->icvs.max_active_levels_var = max_levels; } int starpu_omp_get_max_active_levels (void) { const struct starpu_omp_device * const device = _starpu_omp_get_task()->owner_region->owner_device; return device->icvs.max_active_levels_var; } int starpu_omp_get_level (void) { const struct starpu_omp_region * const parallel_region = _starpu_omp_get_task()->owner_region; return parallel_region->icvs.levels_var; } int starpu_omp_get_ancestor_thread_num (int level) { if (level == 0) return 0; const struct starpu_omp_task *task = _starpu_omp_get_task(); if (task == NULL) return -1; const struct starpu_omp_region *parallel_region = task->owner_region; if (level < 0 || level > parallel_region->icvs.levels_var) return -1; while (level < parallel_region->icvs.levels_var) { parallel_region = parallel_region->parent_region; } return _starpu_omp_get_region_thread_num(parallel_region); } int starpu_omp_get_team_size (int level) { if (level == 0) return 1; const struct starpu_omp_task *task = _starpu_omp_get_task(); if (task == NULL) return -1; const struct starpu_omp_region *parallel_region = task->owner_region; if (level < 0 || level > parallel_region->icvs.levels_var) return -1; while (level < parallel_region->icvs.levels_var) { parallel_region = parallel_region->parent_region; } return parallel_region->nb_threads; } int starpu_omp_get_active_level (void) { const struct starpu_omp_region * const parallel_region = _starpu_omp_get_task()->owner_region; return parallel_region->icvs.active_levels_var; } int starpu_omp_in_final(void) { const struct starpu_omp_task *task = _starpu_omp_get_task(); return task->is_final; } enum starpu_omp_proc_bind_value starpu_omp_get_proc_bind(void) { const struct starpu_omp_region * const parallel_region = _starpu_omp_get_task()->owner_region; int proc_bind = parallel_region->icvs.bind_var[0]; return proc_bind; } void starpu_omp_set_default_device(int device_num) { (void) device_num; /* TODO: set_default_device not supported for now */ } int starpu_omp_get_default_device(void) { const struct starpu_omp_region * const parallel_region = _starpu_omp_get_task()->owner_region; return parallel_region->icvs.default_device_var; } int starpu_omp_get_num_devices(void) { /* TODO: get_num_devices not supported for now * assume 1 device */ return 1; } int starpu_omp_get_num_teams(void) { /* TODO: num_teams not supported for now * assume 1 team */ return 1; } int starpu_omp_get_team_num(void) { /* TODO: team_num not supported for now * assume team_num 0 */ return 0; } int starpu_omp_is_initial_device(void) { const struct starpu_omp_device * const device = _starpu_omp_get_task()->owner_region->owner_device; return device == _starpu_omp_global_state->initial_device; } double starpu_omp_get_wtime (void) { return 1e-6 * (starpu_timing_now() - _starpu_omp_clock_ref); } double starpu_omp_get_wtick (void) { /* arbitrary precision value */ return 1e-6; } #endif /* STARPU_OPENMP */ starpu-1.2.3+dfsg/src/util/starpu_create_sync_task.c000066400000000000000000000030631320135501600225770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include /* This creates (and submits) an empty task that unlocks a tag once all its * dependencies are fulfilled. */ /* TODO it would be nice to have such a function without sync_tag in case we * just want to execute the callback. */ void starpu_create_sync_task(starpu_tag_t sync_tag, unsigned ndeps, starpu_tag_t *deps, void (*callback)(void *), void *callback_arg) { starpu_tag_declare_deps_array(sync_tag, ndeps, deps); /* We create an empty task */ struct starpu_task *sync_task = starpu_task_create(); sync_task->name = "create_sync_task"; sync_task->use_tag = 1; sync_task->tag_id = sync_tag; sync_task->callback_func = callback; sync_task->callback_arg = callback_arg; /* This task does nothing */ sync_task->cl = NULL; int sync_ret = _starpu_task_submit_internally(sync_task); STARPU_ASSERT(!sync_ret); } starpu-1.2.3+dfsg/src/util/starpu_data_cpy.c000066400000000000000000000120571320135501600210450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2013, 2015 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include static void common_data_cpy_func(void *descr[], void *cl_arg) { unsigned interface_id = *(unsigned *)cl_arg; const struct starpu_data_interface_ops *interface_ops = _starpu_data_interface_get_ops(interface_id); const struct starpu_data_copy_methods *copy_methods = interface_ops->copy_methods; int workerid = starpu_worker_get_id(); enum starpu_worker_archtype type = starpu_worker_get_type(workerid); unsigned memory_node = starpu_worker_get_memory_node(workerid); void *dst_interface = descr[0]; void *src_interface = descr[1]; switch (type) { case STARPU_CPU_WORKER: if (copy_methods->ram_to_ram) { copy_methods->ram_to_ram(src_interface, memory_node, dst_interface, memory_node); return; } break; case STARPU_CUDA_WORKER: if (copy_methods->cuda_to_cuda) { copy_methods->cuda_to_cuda(src_interface, memory_node, dst_interface, memory_node); return; } break; case STARPU_OPENCL_WORKER: if (copy_methods->opencl_to_opencl) { copy_methods->opencl_to_opencl(src_interface, memory_node, dst_interface, memory_node); return; } break; default: /* unknown architecture */ STARPU_ABORT(); } STARPU_ASSERT(copy_methods->any_to_any); copy_methods->any_to_any(src_interface, memory_node, dst_interface, memory_node, NULL); } void mp_cpy_kernel(void *descr[], void *cl_arg) { unsigned interface_id = *(unsigned *)cl_arg; const struct starpu_data_interface_ops *interface_ops = _starpu_data_interface_get_ops(interface_id); const struct starpu_data_copy_methods *copy_methods = interface_ops->copy_methods; void *dst_interface = descr[0]; void *src_interface = descr[1]; if(copy_methods->ram_to_ram) copy_methods->ram_to_ram(src_interface, STARPU_MAIN_RAM, dst_interface, STARPU_MAIN_RAM); else if(copy_methods->any_to_any) copy_methods->any_to_any(src_interface, STARPU_MAIN_RAM, dst_interface, STARPU_MAIN_RAM, NULL); else STARPU_ABORT(); } static starpu_mic_kernel_t mic_cpy_func() { #ifdef STARPU_USE_MIC starpu_mic_func_symbol_t mic_symbol = NULL; starpu_mic_register_kernel(&mic_symbol, "mp_cpy_kernel"); return starpu_mic_get_kernel(mic_symbol); #else STARPU_ABORT(); return NULL; #endif } static starpu_scc_kernel_t scc_cpy_func() { #ifdef STARPU_USE_SCC static starpu_scc_func_symbol_t scc_symbol = NULL; if (scc_symbol == NULL) starpu_scc_register_kernel(&scc_symbol, "mp_cpy_kernel"); return starpu_scc_get_kernel(scc_symbol); #else STARPU_ABORT(); return NULL; #endif } struct starpu_perfmodel copy_model = { .type = STARPU_HISTORY_BASED, .symbol = "starpu_data_cpy" }; static struct starpu_codelet copy_cl = { .where = STARPU_CPU|STARPU_CUDA|STARPU_OPENCL|STARPU_MIC|STARPU_SCC, .cpu_funcs = {common_data_cpy_func}, .cuda_funcs = {common_data_cpy_func}, .opencl_funcs = {common_data_cpy_func}, .mic_funcs = {mic_cpy_func}, .scc_funcs = {scc_cpy_func}, .nbuffers = 2, .modes = {STARPU_W, STARPU_R}, .model = ©_model }; int _starpu_data_cpy(starpu_data_handle_t dst_handle, starpu_data_handle_t src_handle, int asynchronous, void (*callback_func)(void*), void *callback_arg, int reduction, struct starpu_task *reduction_dep_task) { struct starpu_task *task = starpu_task_create(); STARPU_ASSERT(task); task->name = "data_cpy"; struct _starpu_job *j = _starpu_get_job_associated_to_task(task); if (reduction) { j->reduction_task = reduction; if (reduction_dep_task) starpu_task_declare_deps_array(task, 1, &reduction_dep_task); } task->cl = ©_cl; unsigned *interface_id; _STARPU_MALLOC(interface_id, sizeof(*interface_id)); *interface_id = dst_handle->ops->interfaceid; task->cl_arg = interface_id; task->cl_arg_size = sizeof(*interface_id); task->cl_arg_free = 1; task->callback_func = callback_func; task->callback_arg = callback_arg; STARPU_TASK_SET_HANDLE(task, dst_handle, 0); STARPU_TASK_SET_HANDLE(task, src_handle, 1); task->synchronous = !asynchronous; int ret = _starpu_task_submit_internally(task); STARPU_ASSERT(!ret); return 0; } int starpu_data_cpy(starpu_data_handle_t dst_handle, starpu_data_handle_t src_handle, int asynchronous, void (*callback_func)(void*), void *callback_arg) { return _starpu_data_cpy(dst_handle, src_handle, asynchronous, callback_func, callback_arg, 0, NULL); } starpu-1.2.3+dfsg/src/util/starpu_data_cpy.h000066400000000000000000000017271320135501600210540ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 Université Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_DATA_CPY_H__ #define __STARPU_DATA_CPY_H__ #include int _starpu_data_cpy(starpu_data_handle_t dst_handle, starpu_data_handle_t src_handle, int asynchronous, void (*callback_func)(void*), void *callback_arg, int reduction, struct starpu_task *reduction_dep_task); #endif // __STARPU_DATA_CPY_H__ starpu-1.2.3+dfsg/src/util/starpu_task_insert.c000066400000000000000000000120641320135501600216050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012, 2014-2017 Université de Bordeaux * Copyright (C) 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* This file provides an interface that is very similar to that of the Quark * scheduler from the PLASMA project (see http://icl.cs.utk.edu/plasma/). */ #include #include #include #include void starpu_codelet_pack_args(void **arg_buffer, size_t *arg_buffer_size, ...) { va_list varg_list; va_start(varg_list, arg_buffer_size); _starpu_codelet_pack_args(arg_buffer, arg_buffer_size, varg_list); va_end(varg_list); } void _starpu_codelet_unpack_args_and_copyleft(char *cl_arg, void *_buffer, size_t buffer_size, va_list varg_list) { size_t current_arg_offset = 0; int nargs, arg; /* We fill the different pointers with the appropriate arguments */ memcpy(&nargs, cl_arg, sizeof(nargs)); current_arg_offset += sizeof(nargs); for (arg = 0; arg < nargs; arg++) { void *argptr = va_arg(varg_list, void *); /* If not reading all cl_args */ // NULL was the initial end marker, we now use 0 // 0 and NULL should be the same value, but we // keep both equalities for systems on which they could be different // cppcheck-suppress duplicateExpression if(argptr == 0 || argptr == NULL) break; size_t arg_size; memcpy(&arg_size, cl_arg+current_arg_offset, sizeof(arg_size)); current_arg_offset += sizeof(arg_size); memcpy(argptr, cl_arg+current_arg_offset, arg_size); current_arg_offset += arg_size; } if (buffer_size) { int left = nargs-arg; char *buffer = (char *) _buffer; int current_buffer_offset = 0; memcpy(buffer, (int *)&left, sizeof(left)); current_buffer_offset += sizeof(left); for ( ; arg < nargs; arg++) { size_t arg_size; memcpy(&arg_size, cl_arg+current_arg_offset, sizeof(arg_size)); current_arg_offset += sizeof(arg_size); memcpy(buffer+current_buffer_offset, &arg_size, sizeof(arg_size)); current_buffer_offset += sizeof(arg_size); memcpy(buffer+current_buffer_offset, cl_arg+current_arg_offset, arg_size); current_arg_offset += arg_size; current_buffer_offset += arg_size; } } } void starpu_codelet_unpack_args_and_copyleft(void *_cl_arg, void *buffer, size_t buffer_size, ...) { char *cl_arg = (char *) _cl_arg; va_list varg_list; STARPU_ASSERT(cl_arg); va_start(varg_list, buffer_size); _starpu_codelet_unpack_args_and_copyleft(cl_arg, buffer, buffer_size, varg_list); va_end(varg_list); } void starpu_codelet_unpack_args(void *_cl_arg, ...) { char *cl_arg = (char *) _cl_arg; va_list varg_list; STARPU_ASSERT(cl_arg); va_start(varg_list, _cl_arg); _starpu_codelet_unpack_args_and_copyleft(cl_arg, NULL, 0, varg_list); va_end(varg_list); } static struct starpu_task *_starpu_task_build_v(struct starpu_codelet *cl, const char* task_name, int cl_arg_free, va_list varg_list) { va_list varg_list_copy; int ret; struct starpu_task *task = starpu_task_create(); task->name = task_name; task->cl_arg_free = cl_arg_free; va_copy(varg_list_copy, varg_list); ret = _starpu_task_insert_create(cl, &task, varg_list_copy); va_end(varg_list_copy); if (ret != 0) { task->destroy = 0; starpu_task_destroy(task); } return (ret == 0) ? task : NULL; } static int _starpu_task_insert_v(struct starpu_codelet *cl, va_list varg_list) { struct starpu_task *task; int ret; task = _starpu_task_build_v(cl, NULL, 1, varg_list); ret = starpu_task_submit(task); if (STARPU_UNLIKELY(ret == -ENODEV)) { _STARPU_MSG("submission of task %p wih codelet %p failed (symbol `%s') (err: ENODEV)\n", task, task->cl, (cl == NULL) ? "none" : task->cl->name ? task->cl->name : (task->cl->model && task->cl->model->symbol)?task->cl->model->symbol:"none"); task->destroy = 0; starpu_task_destroy(task); } return ret; } int starpu_task_insert(struct starpu_codelet *cl, ...) { va_list varg_list; int ret; va_start(varg_list, cl); ret = _starpu_task_insert_v(cl, varg_list); va_end(varg_list); return ret; } int starpu_insert_task(struct starpu_codelet *cl, ...) { va_list varg_list; int ret; va_start(varg_list, cl); ret = _starpu_task_insert_v(cl, varg_list); va_end(varg_list); return ret; } struct starpu_task *starpu_task_build(struct starpu_codelet *cl, ...) { struct starpu_task *task; va_list varg_list; va_start(varg_list, cl); task = _starpu_task_build_v(cl, "task_build", 0, varg_list); if (task && task->cl_arg) { task->cl_arg_free = 1; } va_end(varg_list); return task; } starpu-1.2.3+dfsg/src/util/starpu_task_insert_utils.c000066400000000000000000000504211320135501600230240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2013-2016 Université Bordeaux * Copyright (C) 2011-2017 CNRS * Copyright (C) 2011, 2014 INRIA * Copyright (C) 2016 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include static void _starpu_pack_arguments(size_t *current_offset, size_t *arg_buffer_size_, char **arg_buffer_, void *ptr, size_t ptr_size) { if (*current_offset + sizeof(ptr_size) + ptr_size > *arg_buffer_size_) { if (*arg_buffer_size_ == 0) *arg_buffer_size_ = 128 + sizeof(ptr_size) + ptr_size; else *arg_buffer_size_ = 2 * *arg_buffer_size_ + sizeof(ptr_size) + ptr_size; _STARPU_REALLOC(*arg_buffer_, *arg_buffer_size_); } memcpy(*arg_buffer_+*current_offset, (void *)&ptr_size, sizeof(ptr_size)); *current_offset += sizeof(ptr_size); memcpy(*arg_buffer_+*current_offset, ptr, ptr_size); *current_offset += ptr_size; STARPU_ASSERT(*current_offset <= *arg_buffer_size_); } int _starpu_codelet_pack_args(void **arg_buffer, size_t *arg_buffer_size, va_list varg_list) { int arg_type; int nargs = 0; char *_arg_buffer = NULL; // We would like a void* but we use a char* to allow pointer arithmetic size_t _arg_buffer_size = 0; size_t current_offset = sizeof(nargs); while((arg_type = va_arg(varg_list, int)) != 0) { if (arg_type & STARPU_R || arg_type & STARPU_W || arg_type & STARPU_SCRATCH || arg_type & STARPU_REDUX) { (void)va_arg(varg_list, starpu_data_handle_t); } else if (arg_type==STARPU_DATA_ARRAY) { (void)va_arg(varg_list, starpu_data_handle_t*); (void)va_arg(varg_list, int); } else if (arg_type==STARPU_DATA_MODE_ARRAY) { (void)va_arg(varg_list, struct starpu_data_descr*); (void)va_arg(varg_list, int); } else if (arg_type==STARPU_VALUE) { /* We have a constant value: this should be followed by a pointer to the cst value and the size of the constant */ void *ptr = va_arg(varg_list, void *); size_t ptr_size = va_arg(varg_list, size_t); nargs++; _starpu_pack_arguments(¤t_offset, &_arg_buffer_size, &_arg_buffer, ptr, ptr_size); } else if (arg_type==STARPU_CL_ARGS) { (void)va_arg(varg_list, void *); (void)va_arg(varg_list, size_t); } else if (arg_type==STARPU_CALLBACK) { (void)va_arg(varg_list, _starpu_callback_func_t); } else if (arg_type==STARPU_CALLBACK_WITH_ARG) { va_arg(varg_list, _starpu_callback_func_t); va_arg(varg_list, void *); } else if (arg_type==STARPU_CALLBACK_ARG) { (void)va_arg(varg_list, void *); } else if (arg_type==STARPU_PROLOGUE_CALLBACK) { va_arg(varg_list, _starpu_callback_func_t); } else if (arg_type==STARPU_PROLOGUE_CALLBACK_ARG) { (void)va_arg(varg_list, void *); } else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP) { va_arg(varg_list, _starpu_callback_func_t); } else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP_ARG) { (void)va_arg(varg_list, void *); } else if (arg_type==STARPU_PRIORITY) { (void)va_arg(varg_list, int); } else if (arg_type==STARPU_EXECUTE_ON_NODE) { (void)va_arg(varg_list, int); } else if (arg_type==STARPU_EXECUTE_ON_DATA) { (void)va_arg(varg_list, starpu_data_handle_t); } else if (arg_type==STARPU_EXECUTE_ON_WORKER) { va_arg(varg_list, int); } else if (arg_type==STARPU_WORKER_ORDER) { va_arg(varg_list, unsigned); } else if (arg_type==STARPU_SCHED_CTX) { (void)va_arg(varg_list, unsigned); } else if (arg_type==STARPU_HYPERVISOR_TAG) { (void)va_arg(varg_list, int); } else if (arg_type==STARPU_POSSIBLY_PARALLEL) { (void)va_arg(varg_list, unsigned); } else if (arg_type==STARPU_FLOPS) { (void)va_arg(varg_list, double); } else if (arg_type==STARPU_TAG || arg_type==STARPU_TAG_ONLY) { (void)va_arg(varg_list, starpu_tag_t); } else if (arg_type==STARPU_NAME) { (void)va_arg(varg_list, const char *); } else if (arg_type==STARPU_NODE_SELECTION_POLICY) { (void)va_arg(varg_list, int); } else { STARPU_ABORT_MSG("Unrecognized argument %d, did you perhaps forget to end arguments with 0?\n", arg_type); } } if (nargs) { memcpy(_arg_buffer, (int *)&nargs, sizeof(nargs)); } else { free(_arg_buffer); _arg_buffer = NULL; } *arg_buffer = _arg_buffer; *arg_buffer_size = _arg_buffer_size; return 0; } static void _starpu_task_insert_check_nb_buffers(struct starpu_codelet *cl, struct starpu_task **task, int *allocated_buffers, int current_buffer) { if (current_buffer >= STARPU_NMAXBUFS) { if (*allocated_buffers == 0) { int i; struct starpu_codelet *cl2 = (*task)->cl; *allocated_buffers = STARPU_NMAXBUFS * 2; _STARPU_MALLOC((*task)->dyn_handles, *allocated_buffers * sizeof(starpu_data_handle_t)); for(i=0 ; idyn_handles[i] = (*task)->handles[i]; } if (cl2->nbuffers == STARPU_VARIABLE_NBUFFERS || !cl2->dyn_modes) { _STARPU_MALLOC((*task)->dyn_modes, *allocated_buffers * sizeof(enum starpu_data_access_mode)); for(i=0 ; idyn_modes[i] = (*task)->modes[i]; } } } else if (current_buffer >= *allocated_buffers) { *allocated_buffers *= 2; _STARPU_REALLOC((*task)->dyn_handles, *allocated_buffers * sizeof(starpu_data_handle_t)); if (cl->nbuffers == STARPU_VARIABLE_NBUFFERS || !cl->dyn_modes) _STARPU_REALLOC((*task)->dyn_modes, *allocated_buffers * sizeof(enum starpu_data_access_mode)); } } } static inline void starpu_task_insert_process_data_arg(struct starpu_codelet *cl, struct starpu_task **task, int arg_type, starpu_data_handle_t handle, int *current_buffer, int *allocated_buffers) { enum starpu_data_access_mode mode = (enum starpu_data_access_mode) arg_type & ~STARPU_SSEND; STARPU_ASSERT(cl != NULL); STARPU_ASSERT_MSG(cl->nbuffers == STARPU_VARIABLE_NBUFFERS || *current_buffer < cl->nbuffers, "Too many data passed to starpu_task_insert"); _starpu_task_insert_check_nb_buffers(cl, task, allocated_buffers, *current_buffer); STARPU_TASK_SET_HANDLE((*task), handle, *current_buffer); if (cl->nbuffers == STARPU_VARIABLE_NBUFFERS || (cl->nbuffers > STARPU_NMAXBUFS && !cl->dyn_modes)) STARPU_TASK_SET_MODE(*task, mode,* current_buffer); else if (STARPU_CODELET_GET_MODE(cl, *current_buffer)) { STARPU_ASSERT_MSG(STARPU_CODELET_GET_MODE(cl, *current_buffer) == mode, "The codelet <%s> defines the access mode %d for the buffer %d which is different from the mode %d given to starpu_task_insert\n", cl->name, STARPU_CODELET_GET_MODE(cl, *current_buffer), *current_buffer, mode); } else { #ifdef STARPU_DEVEL # warning shall we print a warning to the user /* Morse uses it to avoid having to set it in the codelet structure */ #endif STARPU_CODELET_SET_MODE(cl, mode, *current_buffer); } (*current_buffer)++; } static inline void starpu_task_insert_process_data_array_arg(struct starpu_codelet *cl, struct starpu_task **task, int nb_handles, starpu_data_handle_t *handles, int *current_buffer, int *allocated_buffers) { STARPU_ASSERT(cl != NULL); int i; for(i=0 ; inbuffers == STARPU_VARIABLE_NBUFFERS || *current_buffer < cl->nbuffers, "Too many data passed to starpu_task_insert"); _starpu_task_insert_check_nb_buffers(cl, task, allocated_buffers, *current_buffer); STARPU_TASK_SET_HANDLE((*task), descrs[i].handle, *current_buffer); if ((*task)->dyn_modes) { (*task)->dyn_modes[*current_buffer] = descrs[i].mode; } else if (cl->nbuffers == STARPU_VARIABLE_NBUFFERS || (cl->nbuffers > STARPU_NMAXBUFS && !cl->dyn_modes)) STARPU_TASK_SET_MODE(*task, descrs[i].mode, *current_buffer); else if (STARPU_CODELET_GET_MODE(cl, *current_buffer)) { STARPU_ASSERT_MSG(STARPU_CODELET_GET_MODE(cl, *current_buffer) == descrs[i].mode, "The codelet <%s> defines the access mode %d for the buffer %d which is different from the mode %d given to starpu_task_insert\n", cl->name, STARPU_CODELET_GET_MODE(cl, *current_buffer), *current_buffer, descrs[i].mode); } else { STARPU_CODELET_SET_MODE(cl, descrs[i].mode, *current_buffer); } (*current_buffer)++; } } int _starpu_task_insert_create(struct starpu_codelet *cl, struct starpu_task **task, va_list varg_list) { int arg_type; char *arg_buffer_ = NULL; size_t arg_buffer_size_ = 0; size_t current_offset = sizeof(int); int current_buffer; int nargs = 0; int allocated_buffers = 0; _STARPU_TRACE_TASK_BUILD_START(); (*task)->cl = cl; current_buffer = 0; while((arg_type = va_arg(varg_list, int)) != 0) { if (arg_type & STARPU_R || arg_type & STARPU_W || arg_type & STARPU_SCRATCH || arg_type & STARPU_REDUX) { /* We have an access mode : we expect to find a handle */ starpu_data_handle_t handle = va_arg(varg_list, starpu_data_handle_t); starpu_task_insert_process_data_arg(cl, task, arg_type, handle, ¤t_buffer, &allocated_buffers); } else if (arg_type == STARPU_DATA_ARRAY) { // Expect to find a array of handles and its size starpu_data_handle_t *handles = va_arg(varg_list, starpu_data_handle_t *); int nb_handles = va_arg(varg_list, int); starpu_task_insert_process_data_array_arg(cl, task, nb_handles, handles, ¤t_buffer, &allocated_buffers); } else if (arg_type==STARPU_DATA_MODE_ARRAY) { // Expect to find a array of descr and its size struct starpu_data_descr *descrs = va_arg(varg_list, struct starpu_data_descr *); int nb_descrs = va_arg(varg_list, int); starpu_task_insert_process_data_mode_array_arg(cl, task, nb_descrs, descrs, ¤t_buffer, &allocated_buffers); } else if (arg_type==STARPU_VALUE) { void *ptr = va_arg(varg_list, void *); size_t ptr_size = va_arg(varg_list, size_t); nargs++; _starpu_pack_arguments(¤t_offset, &arg_buffer_size_, &arg_buffer_, ptr, ptr_size); } else if (arg_type==STARPU_CL_ARGS) { (*task)->cl_arg = va_arg(varg_list, void *); (*task)->cl_arg_size = va_arg(varg_list, size_t); (*task)->cl_arg_free = 1; } else if (arg_type==STARPU_CALLBACK) { (*task)->callback_func = va_arg(varg_list, _starpu_callback_func_t); } else if (arg_type==STARPU_CALLBACK_WITH_ARG) { (*task)->callback_func = va_arg(varg_list, _starpu_callback_func_t); (*task)->callback_arg = va_arg(varg_list, void *); } else if (arg_type==STARPU_CALLBACK_ARG) { (*task)->callback_arg = va_arg(varg_list, void *); } else if (arg_type==STARPU_PROLOGUE_CALLBACK) { (*task)->prologue_callback_func = va_arg(varg_list, _starpu_callback_func_t); } else if (arg_type==STARPU_PROLOGUE_CALLBACK_ARG) { (*task)->prologue_callback_arg = va_arg(varg_list, void *); } else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP) { (*task)->prologue_callback_pop_func = va_arg(varg_list, _starpu_callback_func_t); } else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP_ARG) { (*task)->prologue_callback_pop_arg = va_arg(varg_list, void *); } else if (arg_type==STARPU_PRIORITY) { /* Followed by a priority level */ int prio = va_arg(varg_list, int); (*task)->priority = prio; } else if (arg_type==STARPU_EXECUTE_ON_NODE) { (void)va_arg(varg_list, int); } else if (arg_type==STARPU_EXECUTE_ON_DATA) { (void)va_arg(varg_list, starpu_data_handle_t); } else if (arg_type==STARPU_EXECUTE_ON_WORKER) { int worker = va_arg(varg_list, int); if (worker != -1) { (*task)->workerid = worker; (*task)->execute_on_a_specific_worker = 1; } } else if (arg_type==STARPU_WORKER_ORDER) { unsigned order = va_arg(varg_list, unsigned); if (order != 0) { STARPU_ASSERT_MSG((*task)->execute_on_a_specific_worker, "worker order only makes sense if a workerid is provided"); (*task)->workerorder = order; } } else if (arg_type==STARPU_SCHED_CTX) { unsigned sched_ctx = va_arg(varg_list, unsigned); (*task)->sched_ctx = sched_ctx; } else if (arg_type==STARPU_HYPERVISOR_TAG) { int hypervisor_tag = va_arg(varg_list, int); (*task)->hypervisor_tag = hypervisor_tag; } else if (arg_type==STARPU_POSSIBLY_PARALLEL) { unsigned possibly_parallel = va_arg(varg_list, unsigned); (*task)->possibly_parallel = possibly_parallel; } else if (arg_type==STARPU_FLOPS) { double flops = va_arg(varg_list, double); (*task)->flops = flops; } else if (arg_type==STARPU_TAG) { starpu_tag_t tag = va_arg(varg_list, starpu_tag_t); (*task)->tag_id = tag; (*task)->use_tag = 1; } else if (arg_type==STARPU_TAG_ONLY) { starpu_tag_t tag = va_arg(varg_list, starpu_tag_t); (*task)->tag_id = tag; } else if (arg_type==STARPU_NAME) { const char *name = va_arg(varg_list, const char *); (*task)->name = name; } else if (arg_type==STARPU_NODE_SELECTION_POLICY) { (void)va_arg(varg_list, int); } else { STARPU_ABORT_MSG("Unrecognized argument %d, did you perhaps forget to end arguments with 0?\n", arg_type); } } if (cl) { if (cl->nbuffers == STARPU_VARIABLE_NBUFFERS) { (*task)->nbuffers = current_buffer; } else { STARPU_ASSERT_MSG(current_buffer == cl->nbuffers, "Incoherent number of buffers between cl (%d) and number of parameters (%d)", cl->nbuffers, current_buffer); } } if (nargs) { if ((*task)->cl_arg != NULL) { _STARPU_DISP("Parameters STARPU_CL_ARGS and STARPU_VALUE cannot be used in the same call\n"); free(arg_buffer_); arg_buffer_ = NULL; return -EINVAL; } memcpy(arg_buffer_, (int *)&nargs, sizeof(nargs)); (*task)->cl_arg = arg_buffer_; (*task)->cl_arg_size = arg_buffer_size_; } else { free(arg_buffer_); arg_buffer_ = NULL; } _STARPU_TRACE_TASK_BUILD_END(); return 0; } int _fstarpu_task_insert_create(struct starpu_codelet *cl, struct starpu_task **task, void **arglist) { int arg_i = 0; char *arg_buffer_ = NULL; size_t arg_buffer_size_ = 0; size_t current_offset = sizeof(int); int current_buffer = 0; int nargs = 0; int allocated_buffers = 0; _STARPU_TRACE_TASK_BUILD_START(); (*task)->cl = cl; (*task)->name = NULL; (*task)->cl_arg_free = 1; while (arglist[arg_i] != NULL) { const int arg_type = (int)(intptr_t)arglist[arg_i]; if (arg_type & STARPU_R || arg_type & STARPU_W || arg_type & STARPU_SCRATCH || arg_type & STARPU_REDUX) { arg_i++; starpu_data_handle_t handle = arglist[arg_i]; starpu_task_insert_process_data_arg(cl, task, arg_type, handle, ¤t_buffer, &allocated_buffers); } else if (arg_type == STARPU_DATA_ARRAY) { arg_i++; starpu_data_handle_t *handles = arglist[arg_i]; arg_i++; int nb_handles = *(int *)arglist[arg_i]; starpu_task_insert_process_data_array_arg(cl, task, nb_handles, handles, ¤t_buffer, &allocated_buffers); } else if (arg_type == STARPU_DATA_MODE_ARRAY) { arg_i++; struct starpu_data_descr *descrs = arglist[arg_i]; arg_i++; int nb_descrs = *(int *)arglist[arg_i]; starpu_task_insert_process_data_mode_array_arg(cl, task, nb_descrs, descrs, ¤t_buffer, &allocated_buffers); } else if (arg_type == STARPU_VALUE) { arg_i++; void *ptr = arglist[arg_i]; arg_i++; size_t ptr_size = (size_t)(intptr_t)arglist[arg_i]; nargs++; _starpu_pack_arguments(¤t_offset, &arg_buffer_size_, &arg_buffer_, ptr, ptr_size); } else if (arg_type == STARPU_CL_ARGS) { arg_i++; (*task)->cl_arg = arglist[arg_i]; arg_i++; (*task)->cl_arg_size = (size_t)(intptr_t)arglist[arg_i]; (*task)->cl_arg_free = 1; } else if (arg_type == STARPU_CALLBACK) { arg_i++; (*task)->callback_func = (_starpu_callback_func_t)arglist[arg_i]; } else if (arg_type == STARPU_CALLBACK_WITH_ARG) { arg_i++; (*task)->callback_func = (_starpu_callback_func_t)arglist[arg_i]; arg_i++; (*task)->callback_arg = arglist[arg_i]; } else if (arg_type == STARPU_CALLBACK_ARG) { arg_i++; (*task)->callback_arg = arglist[arg_i]; } else if (arg_type == STARPU_PROLOGUE_CALLBACK) { arg_i++; (*task)->prologue_callback_func = (_starpu_callback_func_t)arglist[arg_i]; } else if (arg_type == STARPU_PROLOGUE_CALLBACK_ARG) { arg_i++; (*task)->prologue_callback_arg = arglist[arg_i]; } else if (arg_type == STARPU_PROLOGUE_CALLBACK_POP) { arg_i++; (*task)->prologue_callback_pop_func = (_starpu_callback_func_t)arglist[arg_i]; } else if (arg_type == STARPU_PROLOGUE_CALLBACK_POP_ARG) { arg_i++; (*task)->prologue_callback_pop_arg = arglist[arg_i]; } else if (arg_type == STARPU_PRIORITY) { arg_i++; (*task)->priority = *(int *)arglist[arg_i]; } else if (arg_type == STARPU_EXECUTE_ON_NODE) { arg_i++; (void)arglist[arg_i]; } else if (arg_type == STARPU_EXECUTE_ON_DATA) { arg_i++; (void)arglist[arg_i]; } else if (arg_type == STARPU_EXECUTE_ON_WORKER) { arg_i++; int worker = *(int *)arglist[arg_i]; if (worker != -1) { (*task)->workerid = worker; (*task)->execute_on_a_specific_worker = 1; } } else if (arg_type == STARPU_WORKER_ORDER) { arg_i++; unsigned order = *(unsigned *)arglist[arg_i]; if (order != 0) { STARPU_ASSERT_MSG((*task)->execute_on_a_specific_worker, "worker order only makes sense if a workerid is provided"); (*task)->workerorder = order; } } else if (arg_type == STARPU_SCHED_CTX) { arg_i++; (*task)->sched_ctx = *(unsigned *)arglist[arg_i]; } else if (arg_type == STARPU_HYPERVISOR_TAG) { arg_i++; (*task)->hypervisor_tag = *(int *)arglist[arg_i]; } else if (arg_type == STARPU_POSSIBLY_PARALLEL) { arg_i++; (*task)->possibly_parallel = *(unsigned *)arglist[arg_i]; } else if (arg_type == STARPU_FLOPS) { arg_i++; (*task)->flops = *(double *)arglist[arg_i]; } else if (arg_type == STARPU_TAG) { arg_i++; (*task)->tag_id = *(starpu_tag_t *)arglist[arg_i]; (*task)->use_tag = 1; } else if (arg_type == STARPU_TAG_ONLY) { arg_i++; (*task)->tag_id = *(starpu_tag_t *)arglist[arg_i]; } else if (arg_type == STARPU_NAME) { arg_i++; (*task)->name = arglist[arg_i]; } else if (arg_type == STARPU_NODE_SELECTION_POLICY) { arg_i++; (void)arglist[arg_i]; } else { STARPU_ABORT_MSG("unknown/unsupported argument %d, did you perhaps forget to end arguments with 0?", arg_type); } arg_i++; } if (cl) { if (cl->nbuffers == STARPU_VARIABLE_NBUFFERS) { (*task)->nbuffers = current_buffer; } else { STARPU_ASSERT_MSG(current_buffer == cl->nbuffers, "Incoherent number of buffers between cl (%d) and number of parameters (%d)", cl->nbuffers, current_buffer); } } if (nargs) { if ((*task)->cl_arg != NULL) { _STARPU_DISP("Parameters STARPU_CL_ARGS and STARPU_VALUE cannot be used in the same call\n"); free(arg_buffer_); arg_buffer_ = NULL; return -EINVAL; } memcpy(arg_buffer_, (int *)&nargs, sizeof(nargs)); (*task)->cl_arg = arg_buffer_; (*task)->cl_arg_size = arg_buffer_size_; } else { free(arg_buffer_); arg_buffer_ = NULL; } _STARPU_TRACE_TASK_BUILD_END(); return 0; } /* Fortran interface to task_insert */ void fstarpu_task_insert(void **arglist) { struct starpu_codelet *cl = arglist[0]; if (cl == NULL) { STARPU_ABORT_MSG("task without codelet"); } struct starpu_task *task = starpu_task_create(); int ret = _fstarpu_task_insert_create(cl, &task, arglist+1); if (ret != 0) { STARPU_ABORT_MSG("task creation failed"); } ret = starpu_task_submit(task); if (ret != 0) { STARPU_ABORT_MSG("starpu_task_submit failed"); } } /* fstarpu_insert_task: aliased to fstarpu_task_insert in fstarpu_mod.f90 */ starpu-1.2.3+dfsg/src/util/starpu_task_insert_utils.h000066400000000000000000000023141320135501600230270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013, 2014, 2015, 2016 CNRS * Copyright (C) 2016 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_TASK_INSERT_UTILS_H__ #define __STARPU_TASK_INSERT_UTILS_H__ #include #include #include typedef void (*_starpu_callback_func_t)(void *); int _starpu_codelet_pack_args(void **arg_buffer, size_t *arg_buffer_size, va_list varg_list); int _starpu_task_insert_create(struct starpu_codelet *cl, struct starpu_task **task, va_list varg_list); int _fstarpu_task_insert_create(struct starpu_codelet *cl, struct starpu_task **task, void **arglist); #endif // __STARPU_TASK_INSERT_UTILS_H__ starpu-1.2.3+dfsg/src/worker_collection/000077500000000000000000000000001320135501600202615ustar00rootroot00000000000000starpu-1.2.3+dfsg/src/worker_collection/worker_list.c000066400000000000000000000126721320135501600230010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2014, 2016 Université de Bordeaux * Copyright (C) 2012-2013, 2016, 2017 CNRS * Copyright (C) 2011-2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include static unsigned list_has_next(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it) { int nworkers = workers->nworkers; STARPU_ASSERT(it != NULL); unsigned ret = it->cursor < nworkers ; if(!ret) it->cursor = 0; return ret; } static int list_get_next(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it) { int *workerids = (int *)workers->workerids; int nworkers = (int)workers->nworkers; STARPU_ASSERT(it->cursor < nworkers); int ret = workerids[it->cursor++]; return ret; } static unsigned list_has_next_master(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it) { int nworkers = workers->nmasters; STARPU_ASSERT(it != NULL); unsigned ret = it->cursor < nworkers ; if(!ret) it->cursor = 0; return ret; } static int list_get_next_master(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it) { int *workerids = (int *)workers->masters; int nworkers = (int)workers->nmasters; STARPU_ASSERT_MSG(it->cursor < nworkers, "cursor %d nworkers %d\n", it->cursor, nworkers); int ret = workerids[it->cursor++]; return ret; } static unsigned _worker_belongs_to_ctx(struct starpu_worker_collection *workers, int workerid) { int *workerids = (int *)workers->workerids; unsigned nworkers = workers->nworkers; unsigned i; for(i = 0; i < nworkers; i++) { if(workerids[i] == workerid) return 1; } return 0; } static int list_add(struct starpu_worker_collection *workers, int worker) { int *workerids = (int *)workers->workerids; unsigned *nworkers = &workers->nworkers; STARPU_ASSERT(*nworkers < (STARPU_NMAXWORKERS+STARPU_NMAX_COMBINEDWORKERS)); if(!_worker_belongs_to_ctx(workers, worker)) { workerids[(*nworkers)++] = worker; return worker; } else return -1; } static int _get_first_free_worker(int *workerids, int nworkers) { int i; for(i = 0; i < nworkers; i++) if(workerids[i] == -1) return i; return -1; } /* rearange array of workerids in order not to have {-1, -1, 5, -1, 7} and have instead {5, 7, -1, -1, -1} it is easier afterwards to iterate the array */ static void _rearange_workerids(int *workerids, int old_nworkers) { int first_free_id = -1; int i; for(i = 0; i < old_nworkers; i++) { if(workerids[i] != -1) { first_free_id = _get_first_free_worker(workerids, old_nworkers); if(first_free_id != -1) { workerids[first_free_id] = workerids[i]; workerids[i] = -1; } } } } static int list_remove(struct starpu_worker_collection *workers, int worker) { int *workerids = (int *)workers->workerids; unsigned nworkers = workers->nworkers; int *masters = (int *)workers->masters; unsigned nmasters = workers->nmasters; unsigned i; int found_worker = -1; for(i = 0; i < nworkers; i++) { if(workerids[i] == worker) { workerids[i] = -1; found_worker = worker; break; } } _rearange_workerids(workerids, nworkers); if(found_worker != -1) workers->nworkers--; int found_master = -1; for(i = 0; i < nmasters; i++) { if(masters[i] == worker) { masters[i] = -1; found_master = worker; break; } } _rearange_workerids(masters, nmasters); if(found_master != -1) workers->nmasters--; return found_worker; } static void _init_workers(int *workerids) { unsigned i; unsigned nworkers = starpu_worker_get_count(); for(i = 0; i < nworkers; i++) workerids[i] = -1; return; } static void list_init(struct starpu_worker_collection *workers) { int *workerids; int *masters; _STARPU_MALLOC(workerids, (STARPU_NMAXWORKERS+STARPU_NMAX_COMBINEDWORKERS) * sizeof(int)); _STARPU_MALLOC(masters, (STARPU_NMAXWORKERS+STARPU_NMAX_COMBINEDWORKERS) * sizeof(int)); _init_workers(workerids); _init_workers(masters); workers->workerids = (void*)workerids; workers->nworkers = 0; workers->masters = (void*)masters; workers->nmasters = 0; return; } static void list_deinit(struct starpu_worker_collection *workers) { free(workers->workerids); free(workers->masters); } static void list_init_iterator(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it) { (void) workers; it->cursor = 0; int *workerids = (int *)workers->workerids; unsigned nworkers = workers->nworkers; unsigned i; int nm = 0; for(i = 0; i < nworkers; i++) { if(!starpu_worker_is_slave(workerids[i])) ((int*)workers->masters)[nm++] = workerids[i]; } workers->nmasters = nm; } struct starpu_worker_collection worker_list = { .has_next = list_has_next, .get_next = list_get_next, .has_next_master = list_has_next_master, .get_next_master = list_get_next_master, .add = list_add, .remove = list_remove, .init = list_init, .deinit = list_deinit, .init_iterator = list_init_iterator, .type = STARPU_WORKER_LIST }; starpu-1.2.3+dfsg/src/worker_collection/worker_tree.c000066400000000000000000000153531320135501600227640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013, 2016-2017 Université de Bordeaux * Copyright (C) 2012-2014, 2016, 2017 CNRS * Copyright (C) 2011-2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #ifdef STARPU_HAVE_HWLOC #include #include "core/workers.h" static unsigned tree_has_next(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it) { STARPU_ASSERT(it != NULL); if(workers->nworkers == 0) return 0; struct starpu_tree *tree = (struct starpu_tree*)workers->collection_private; int *workerids; int nworkers; int w; if (it->value) { struct starpu_tree *node = it->value; /* Are there workers left to be processed in the current node? */ nworkers = _starpu_bindid_get_workerids(node->id, &workerids); for(w = 0; w < nworkers; w++) { if(!it->visited[workerids[w]] && workers->present[workerids[w]] ) { /* Still some! */ it->possible_value = node; return 1; } } } struct starpu_tree *neighbour = starpu_tree_get_neighbour(tree, (struct starpu_tree*)it->value, it->visited, workers->present); if(!neighbour) { starpu_tree_reset_visited(tree, it->visited); it->value = NULL; it->possible_value = NULL; return 0; } int id = -1; nworkers = _starpu_bindid_get_workerids(neighbour->id, &workerids); for(w = 0; w < nworkers; w++) { if(!it->visited[workerids[w]] && workers->present[workerids[w]]) { id = workerids[w]; it->possible_value = neighbour; break; } } STARPU_ASSERT_MSG(id != -1, "bind id (%d) for workerid (%d) not correct", neighbour->id, id); return 1; } static int tree_get_next(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it) { int ret = -1; struct starpu_tree *tree = (struct starpu_tree *)workers->collection_private; struct starpu_tree *neighbour = NULL; if(it->possible_value) { neighbour = it->possible_value; it->possible_value = NULL; } else neighbour = starpu_tree_get_neighbour(tree, (struct starpu_tree*)it->value, it->visited, workers->present); STARPU_ASSERT_MSG(neighbour, "no element anymore"); int *workerids; int nworkers = _starpu_bindid_get_workerids(neighbour->id, &workerids); int w; for(w = 0; w < nworkers; w++) { if(!it->visited[workerids[w]] && workers->present[workerids[w]]) { ret = workerids[w]; it->visited[workerids[w]] = 1; it->value = neighbour; break; } } STARPU_ASSERT_MSG(ret != -1, "bind id not correct"); return ret; } static unsigned tree_has_next_master(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it) { STARPU_ASSERT(it != NULL); if(workers->nworkers == 0) return 0; struct starpu_tree *tree = (struct starpu_tree*)workers->collection_private; struct starpu_tree *neighbour = starpu_tree_get_neighbour(tree, (struct starpu_tree*)it->value, it->visited, workers->is_master); if(!neighbour) { starpu_tree_reset_visited(tree, it->visited); it->value = NULL; it->possible_value = NULL; return 0; } int id = -1; int *workerids; int nworkers = _starpu_bindid_get_workerids(neighbour->id, &workerids); int w; for(w = 0; w < nworkers; w++) { if(!it->visited[workerids[w]] && workers->is_master[workerids[w]]) { id = workerids[w]; it->possible_value = neighbour; break; } } STARPU_ASSERT_MSG(id != -1, "bind id (%d) for workerid (%d) not correct", neighbour->id, id); return 1; } static int tree_get_next_master(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it) { int ret = -1; struct starpu_tree *tree = (struct starpu_tree *)workers->collection_private; struct starpu_tree *neighbour = NULL; if(it->possible_value) { neighbour = it->possible_value; it->possible_value = NULL; } else neighbour = starpu_tree_get_neighbour(tree, (struct starpu_tree*)it->value, it->visited, workers->is_master); STARPU_ASSERT_MSG(neighbour, "no element anymore"); int *workerids; int nworkers = _starpu_bindid_get_workerids(neighbour->id, &workerids); int w; for(w = 0; w < nworkers; w++) { if(!it->visited[workerids[w]] && workers->is_master[workerids[w]]) { ret = workerids[w]; it->visited[workerids[w]] = 1; it->value = neighbour; break; } } STARPU_ASSERT_MSG(ret != -1, "bind id not correct"); return ret; } static int tree_add(struct starpu_worker_collection *workers, int worker) { if(!workers->present[worker]) { workers->present[worker] = 1; workers->workerids[workers->nworkers] = worker; workers->nworkers++; return worker; } else return -1; } static int tree_remove(struct starpu_worker_collection *workers, int worker) { if(workers->present[worker]) { unsigned i; for (i = 0; i < workers->nworkers; i++) if (workers->workerids[i] == worker) { memmove(&workers->workerids[i], &workers->workerids[i+1], (workers->nworkers-1-i) * sizeof(workers->workerids[i])); break; } workers->present[worker] = 0; workers->is_master[worker] = 0; workers->nworkers--; return worker; } else return -1; } static void tree_init(struct starpu_worker_collection *workers) { _STARPU_MALLOC(workers->workerids, (STARPU_NMAXWORKERS+STARPU_NMAX_COMBINEDWORKERS) * sizeof(int)); workers->collection_private = (void*)starpu_workers_get_tree(); workers->nworkers = 0; int i; int nworkers = starpu_worker_get_count(); for(i = 0; i < nworkers; i++) { workers->workerids[i] = -1; workers->present[i] = 0; workers->is_master[i] = 0; } return; } static void tree_deinit(struct starpu_worker_collection *workers) { (void) workers; free(workers->workerids); } static void tree_init_iterator(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it) { (void) workers; it->value = NULL; it->possible_value = NULL; int i; int nworkers = starpu_worker_get_count(); for(i = 0; i < nworkers; i++) { workers->is_master[i] = (workers->present[i] && !starpu_worker_is_slave(i)); it->visited[i] = 0; } } struct starpu_worker_collection worker_tree = { .has_next = tree_has_next, .get_next = tree_get_next, .has_next_master = tree_has_next_master, .get_next_master = tree_get_next_master, .add = tree_add, .remove = tree_remove, .init = tree_init, .deinit = tree_deinit, .init_iterator = tree_init_iterator, .type = STARPU_WORKER_TREE }; #endif// STARPU_HAVE_HWLOC starpu-1.2.3+dfsg/starpu-1.0.pc.in000066400000000000000000000026331320135501600165150ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2012, 2014-2015 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ pkglibdir=@pkglibdir@ includedir=@includedir@ # When the GCC plug-in is available, the following lines indicate # where it is installed. @GCC_PLUGIN_DIR_PKGCONFIG@ @GCC_PLUGIN_PKGCONFIG@ Name: starpu Description: offers support for heterogeneous multicore architecture Version: @PACKAGE_VERSION@ Cflags: -I${includedir}/starpu/@STARPU_EFFECTIVE_VERSION@ @STARPU_CUDA_CPPFLAGS@ @SIMGRID_CFLAGS@ -DSTARPU_USE_DEPRECATED_ONE_ZERO_API Libs: @STARPU_EXPORT_DYNAMIC@ -L${libdir} -lstarpu-@STARPU_EFFECTIVE_VERSION@ @STARPU_OPENCL_LDFLAGS@ @STARPU_CUDA_LDFLAGS@ @STARPU_SC_HYPERVISOR@ @STARPU_EXPORTED_LIBS@ Libs.private: @LDFLAGS@ @LIBS@ @LIBSTARPU_LDFLAGS@ Requires: @HWLOC_REQUIRES@ starpu-1.2.3+dfsg/starpu-1.1.pc.in000066400000000000000000000025661320135501600165230ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2012, 2014-2015 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ pkglibdir=@pkglibdir@ includedir=@includedir@ # When the GCC plug-in is available, the following lines indicate # where it is installed. @GCC_PLUGIN_DIR_PKGCONFIG@ @GCC_PLUGIN_PKGCONFIG@ Name: starpu Description: offers support for heterogeneous multicore architecture Version: @PACKAGE_VERSION@ Cflags: -I${includedir}/starpu/@STARPU_EFFECTIVE_VERSION@ @STARPU_CUDA_CPPFLAGS@ @SIMGRID_CFLAGS@ Libs: @STARPU_EXPORT_DYNAMIC@ -L${libdir} -lstarpu-@STARPU_EFFECTIVE_VERSION@ @STARPU_OPENCL_LDFLAGS@ @STARPU_CUDA_LDFLAGS@ @STARPU_SC_HYPERVISOR@ @STARPU_EXPORTED_LIBS@ Libs.private: @LDFLAGS@ @LIBS@ @LIBSTARPU_LDFLAGS@ Requires: @HWLOC_REQUIRES@ starpu-1.2.3+dfsg/starpu-1.2.pc.in000066400000000000000000000025661320135501600165240ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2012, 2014-2015 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ pkglibdir=@pkglibdir@ includedir=@includedir@ # When the GCC plug-in is available, the following lines indicate # where it is installed. @GCC_PLUGIN_DIR_PKGCONFIG@ @GCC_PLUGIN_PKGCONFIG@ Name: starpu Description: offers support for heterogeneous multicore architecture Version: @PACKAGE_VERSION@ Cflags: -I${includedir}/starpu/@STARPU_EFFECTIVE_VERSION@ @STARPU_CUDA_CPPFLAGS@ @SIMGRID_CFLAGS@ Libs: @STARPU_EXPORT_DYNAMIC@ -L${libdir} -lstarpu-@STARPU_EFFECTIVE_VERSION@ @STARPU_OPENCL_LDFLAGS@ @STARPU_CUDA_LDFLAGS@ @STARPU_SC_HYPERVISOR@ @STARPU_EXPORTED_LIBS@ Libs.private: @LDFLAGS@ @LIBS@ @LIBSTARPU_LDFLAGS@ Requires: @HWLOC_REQUIRES@ starpu-1.2.3+dfsg/starpu-top/000077500000000000000000000000001320135501600160645ustar00rootroot00000000000000starpu-1.2.3+dfsg/starpu-top/StarPU-Top-common.pri000066400000000000000000000033131320135501600220040ustar00rootroot00000000000000# ------------------------------------------------- # Project created by QtCreator 2011-01-22T11:55:16 # ------------------------------------------------- QT += network QT += opengl QT += sql TARGET = starpu_top TEMPLATE = app SOURCES += $$SRCDIR/main.cpp \ #STARPU-TOP $$SRCDIR/mainwindow.cpp \ $$SRCDIR/configurationmanager.cpp \ $$SRCDIR/widgetwindowsmanager.cpp \ $$SRCDIR/communicationthread.cpp \ $$SRCDIR/communicationmanager.cpp \ $$SRCDIR/preferencesdialog.cpp \ $$SRCDIR/datawidget.cpp \ $$SRCDIR/interactivewidget.cpp \ $$SRCDIR/ganttwidget.cpp \ $$SRCDIR/debugconsole.cpp \ $$SRCDIR/dataaggregatorwidget.cpp \ $$SRCDIR/taskmanager.cpp \ $$SRCDIR/abstractwidgetwindow.cpp \ $$SRCDIR/sessionsetupmanager.cpp \ #QLEDINDICATOR $$SRCDIR/qledindicator/qledindicator.cpp \ $$SRCDIR/aboutdialog.cpp HEADERS += $$SRCDIR/mainwindow.h \ #STARPU-TOP $$SRCDIR/starpu_top_types.h \ $$SRCDIR/widgetwindowsmanager.h \ $$SRCDIR/configurationmanager.h \ $$SRCDIR/communicationthread.h \ $$SRCDIR/communicationmanager.h \ $$SRCDIR/preferencesdialog.h \ $$SRCDIR/datawidget.h \ $$SRCDIR/interactivewidget.h \ $$SRCDIR/ganttwidget.h \ $$SRCDIR/debugconsole.h \ $$SRCDIR/dataaggregatorwidget.h \ $$SRCDIR/taskmanager.h \ $$SRCDIR/abstractwidgetwindow.h \ $$SRCDIR/sessionsetupmanager.h \ #QLEDINDICATOR $$SRCDIR/qledindicator/qledindicator.h \ $$SRCDIR/aboutdialog.h FORMS += $$SRCDIR/mainwindow.ui \ $$SRCDIR/preferencesdialog.ui \ $$SRCDIR/debugconsole.ui \ $$SRCDIR/aboutdialog.ui RESOURCES += $$SRCDIR/resources.qrc OTHER_FILES += $$SRCDIR/TODO.txt starpu-1.2.3+dfsg/starpu-top/StarPU-Top-qwt-embed.pri000066400000000000000000000061041320135501600224020ustar00rootroot00000000000000SRCDIR=. SOURCES += \ $$SRCDIR/qwt/qwt_thermo.cpp \ $$SRCDIR/qwt/qwt_math.cpp \ $$SRCDIR/qwt/qwt_scale_engine.cpp \ $$SRCDIR/qwt/qwt_scale_draw.cpp \ $$SRCDIR/qwt/qwt_scale_map.cpp \ $$SRCDIR/qwt/qwt_scale_div.cpp \ $$SRCDIR/qwt/qwt_painter.cpp \ $$SRCDIR/qwt/qwt_abstract_scale.cpp \ $$SRCDIR/qwt/qwt_abstract_scale_draw.cpp \ $$SRCDIR/qwt/qwt_interval.cpp \ $$SRCDIR/qwt/qwt_text.cpp \ $$SRCDIR/qwt/qwt_text_engine.cpp \ $$SRCDIR/qwt/qwt_clipper.cpp \ $$SRCDIR/qwt/qwt_color_map.cpp \ $$SRCDIR/qwt/qwt_plot.cpp \ $$SRCDIR/qwt/qwt_plot_dict.cpp \ $$SRCDIR/qwt/qwt_plot_layout.cpp \ $$SRCDIR/qwt/qwt_scale_widget.cpp \ $$SRCDIR/qwt/qwt_text_label.cpp \ $$SRCDIR/qwt/qwt_legend.cpp \ $$SRCDIR/qwt/qwt_dyngrid_layout.cpp \ $$SRCDIR/qwt/qwt_plot_canvas.cpp \ $$SRCDIR/qwt/qwt_plot_item.cpp \ $$SRCDIR/qwt/qwt_legend_item.cpp \ $$SRCDIR/qwt/qwt_symbol.cpp \ $$SRCDIR/qwt/qwt_plot_axis.cpp \ $$SRCDIR/qwt/qwt_plot_xml.cpp \ $$SRCDIR/qwt/qwt_knob.cpp \ $$SRCDIR/qwt/qwt_abstract_slider.cpp \ $$SRCDIR/qwt/qwt_round_scale_draw.cpp \ $$SRCDIR/qwt/qwt_double_range.cpp \ $$SRCDIR/qwt/qwt_wheel.cpp \ $$SRCDIR/qwt/qwt_slider.cpp \ $$SRCDIR/qwt/qwt_plot_curve.cpp \ $$SRCDIR/qwt/qwt_plot_seriesitem.cpp \ $$SRCDIR/qwt/qwt_series_data.cpp \ $$SRCDIR/qwt/qwt_point_polar.cpp \ $$SRCDIR/qwt/qwt_curve_fitter.cpp \ $$SRCDIR/qwt/qwt_spline.cpp \ $$SRCDIR/qwt/qwt_dial.cpp \ $$SRCDIR/qwt/qwt_dial_needle.cpp HEADERS += \ $$SRCDIR/qwt/qwt_thermo.h \ $$SRCDIR/qwt/qwt_math.h \ $$SRCDIR/qwt/qwt_scale_engine.h \ $$SRCDIR/qwt/qwt_scale_draw.h \ $$SRCDIR/qwt/qwt_scale_map.h \ $$SRCDIR/qwt/qwt_scale_div.h \ $$SRCDIR/qwt/qwt_painter.h \ $$SRCDIR/qwt/qwt_global.h \ $$SRCDIR/qwt/qwt_abstract_scale.h \ $$SRCDIR/qwt/qwt_abstract_scale_draw.h \ $$SRCDIR/qwt/qwt_interval.h \ $$SRCDIR/qwt/qwt_text.h \ $$SRCDIR/qwt/qwt_text_engine.h \ $$SRCDIR/qwt/qwt_clipper.h \ $$SRCDIR/qwt/qwt_color_map.h \ $$SRCDIR/qwt/qwt_plot.h \ $$SRCDIR/qwt/qwt_plot_dict.h \ $$SRCDIR/qwt/qwt_plot_layout.h \ $$SRCDIR/qwt/qwt_scale_widget.h \ $$SRCDIR/qwt/qwt_text_label.h \ $$SRCDIR/qwt/qwt_legend.h \ $$SRCDIR/qwt/qwt_dyngrid_layout.h \ $$SRCDIR/qwt/qwt_plot_canvas.h \ $$SRCDIR/qwt/qwt_plot_item.h \ $$SRCDIR/qwt/qwt_legend_itemmanager.h \ $$SRCDIR/qwt/qwt_legend_item.h \ $$SRCDIR/qwt/qwt_symbol.h \ $$SRCDIR/qwt/qwt_knob.h \ $$SRCDIR/qwt/qwt_abstract_slider.h \ $$SRCDIR/qwt/qwt_round_scale_draw.h \ $$SRCDIR/qwt/qwt_double_range.h \ $$SRCDIR/qwt/qwt_wheel.h \ $$SRCDIR/qwt/qwt_slider.h \ $$SRCDIR/qwt/qwt_plot_curve.h \ $$SRCDIR/qwt/qwt_plot_seriesitem.h \ $$SRCDIR/qwt/qwt_series_data.h \ $$SRCDIR/qwt/qwt_point_polar.h \ $$SRCDIR/qwt/qwt_curve_fitter.h \ $$SRCDIR/qwt/qwt_spline.h \ $$SRCDIR/qwt/qwt_dial.h \ $$SRCDIR/qwt/qwt_dial_needle.h INCLUDEPATH += $$SRCDIR/qwt starpu-1.2.3+dfsg/starpu-top/StarPU-Top-qwt-embed.pri.in000066400000000000000000000061131320135501600230070ustar00rootroot00000000000000SRCDIR=@srcdir@ SOURCES += \ $$SRCDIR/qwt/qwt_thermo.cpp \ $$SRCDIR/qwt/qwt_math.cpp \ $$SRCDIR/qwt/qwt_scale_engine.cpp \ $$SRCDIR/qwt/qwt_scale_draw.cpp \ $$SRCDIR/qwt/qwt_scale_map.cpp \ $$SRCDIR/qwt/qwt_scale_div.cpp \ $$SRCDIR/qwt/qwt_painter.cpp \ $$SRCDIR/qwt/qwt_abstract_scale.cpp \ $$SRCDIR/qwt/qwt_abstract_scale_draw.cpp \ $$SRCDIR/qwt/qwt_interval.cpp \ $$SRCDIR/qwt/qwt_text.cpp \ $$SRCDIR/qwt/qwt_text_engine.cpp \ $$SRCDIR/qwt/qwt_clipper.cpp \ $$SRCDIR/qwt/qwt_color_map.cpp \ $$SRCDIR/qwt/qwt_plot.cpp \ $$SRCDIR/qwt/qwt_plot_dict.cpp \ $$SRCDIR/qwt/qwt_plot_layout.cpp \ $$SRCDIR/qwt/qwt_scale_widget.cpp \ $$SRCDIR/qwt/qwt_text_label.cpp \ $$SRCDIR/qwt/qwt_legend.cpp \ $$SRCDIR/qwt/qwt_dyngrid_layout.cpp \ $$SRCDIR/qwt/qwt_plot_canvas.cpp \ $$SRCDIR/qwt/qwt_plot_item.cpp \ $$SRCDIR/qwt/qwt_legend_item.cpp \ $$SRCDIR/qwt/qwt_symbol.cpp \ $$SRCDIR/qwt/qwt_plot_axis.cpp \ $$SRCDIR/qwt/qwt_plot_xml.cpp \ $$SRCDIR/qwt/qwt_knob.cpp \ $$SRCDIR/qwt/qwt_abstract_slider.cpp \ $$SRCDIR/qwt/qwt_round_scale_draw.cpp \ $$SRCDIR/qwt/qwt_double_range.cpp \ $$SRCDIR/qwt/qwt_wheel.cpp \ $$SRCDIR/qwt/qwt_slider.cpp \ $$SRCDIR/qwt/qwt_plot_curve.cpp \ $$SRCDIR/qwt/qwt_plot_seriesitem.cpp \ $$SRCDIR/qwt/qwt_series_data.cpp \ $$SRCDIR/qwt/qwt_point_polar.cpp \ $$SRCDIR/qwt/qwt_curve_fitter.cpp \ $$SRCDIR/qwt/qwt_spline.cpp \ $$SRCDIR/qwt/qwt_dial.cpp \ $$SRCDIR/qwt/qwt_dial_needle.cpp HEADERS += \ $$SRCDIR/qwt/qwt_thermo.h \ $$SRCDIR/qwt/qwt_math.h \ $$SRCDIR/qwt/qwt_scale_engine.h \ $$SRCDIR/qwt/qwt_scale_draw.h \ $$SRCDIR/qwt/qwt_scale_map.h \ $$SRCDIR/qwt/qwt_scale_div.h \ $$SRCDIR/qwt/qwt_painter.h \ $$SRCDIR/qwt/qwt_global.h \ $$SRCDIR/qwt/qwt_abstract_scale.h \ $$SRCDIR/qwt/qwt_abstract_scale_draw.h \ $$SRCDIR/qwt/qwt_interval.h \ $$SRCDIR/qwt/qwt_text.h \ $$SRCDIR/qwt/qwt_text_engine.h \ $$SRCDIR/qwt/qwt_clipper.h \ $$SRCDIR/qwt/qwt_color_map.h \ $$SRCDIR/qwt/qwt_plot.h \ $$SRCDIR/qwt/qwt_plot_dict.h \ $$SRCDIR/qwt/qwt_plot_layout.h \ $$SRCDIR/qwt/qwt_scale_widget.h \ $$SRCDIR/qwt/qwt_text_label.h \ $$SRCDIR/qwt/qwt_legend.h \ $$SRCDIR/qwt/qwt_dyngrid_layout.h \ $$SRCDIR/qwt/qwt_plot_canvas.h \ $$SRCDIR/qwt/qwt_plot_item.h \ $$SRCDIR/qwt/qwt_legend_itemmanager.h \ $$SRCDIR/qwt/qwt_legend_item.h \ $$SRCDIR/qwt/qwt_symbol.h \ $$SRCDIR/qwt/qwt_knob.h \ $$SRCDIR/qwt/qwt_abstract_slider.h \ $$SRCDIR/qwt/qwt_round_scale_draw.h \ $$SRCDIR/qwt/qwt_double_range.h \ $$SRCDIR/qwt/qwt_wheel.h \ $$SRCDIR/qwt/qwt_slider.h \ $$SRCDIR/qwt/qwt_plot_curve.h \ $$SRCDIR/qwt/qwt_plot_seriesitem.h \ $$SRCDIR/qwt/qwt_series_data.h \ $$SRCDIR/qwt/qwt_point_polar.h \ $$SRCDIR/qwt/qwt_curve_fitter.h \ $$SRCDIR/qwt/qwt_spline.h \ $$SRCDIR/qwt/qwt_dial.h \ $$SRCDIR/qwt/qwt_dial_needle.h INCLUDEPATH += $$SRCDIR/qwt starpu-1.2.3+dfsg/starpu-top/StarPU-Top-qwt-system.pri000066400000000000000000000000331320135501600226450ustar00rootroot00000000000000LIBS += INCLUDEPATH += starpu-1.2.3+dfsg/starpu-top/StarPU-Top-qwt-system.pri.in000066400000000000000000000001031320135501600232500ustar00rootroot00000000000000LIBS += @STARPU_QWT_LDFLAGS@ INCLUDEPATH += @STARPU_QWT_INCLUDE@ starpu-1.2.3+dfsg/starpu-top/StarPU-Top.pro.in000066400000000000000000000001431320135501600211270ustar00rootroot00000000000000SRCDIR=@srcdir@ include ($$SRCDIR/StarPU-Top-common.pri) include (StarPU-Top-qwt-@QWT_PRI@.pri) starpu-1.2.3+dfsg/starpu-top/StarPU-Top.pro.user000066400000000000000000000176071320135501600215140ustar00rootroot00000000000000 ProjectExplorer.Project.ActiveTarget 0 ProjectExplorer.Project.EditorSettings UTF-8 ProjectExplorer.Project.Target.0 Bureau Qt4ProjectManager.Target.DesktopTarget 0 0 qmake QtProjectManager.QMakeBuildStep Make Qt4ProjectManager.MakeStep false 2 Make Qt4ProjectManager.MakeStep true clean 1 false Déboguer Qt4ProjectManager.Qt4BuildConfiguration 2 C:/Users/Will/Documents/My Dropbox/Projets/Projets partagés/StarPU-Top-build-desktop 14 2 true qmake QtProjectManager.QMakeBuildStep Make Qt4ProjectManager.MakeStep false 2 Make Qt4ProjectManager.MakeStep true clean 1 false Release Qt4ProjectManager.Qt4BuildConfiguration 0 C:/Users/Will/Documents/My Dropbox/Projets/Projets partagés/StarPU-Top-build-desktop 14 2 true 2 StarPU-Top Qt4ProjectManager.Qt4RunConfiguration 2 StarPU-Top.pro false false false false 1 ProjectExplorer.Project.TargetCount 1 ProjectExplorer.Project.Updater.FileVersion 4 starpu-1.2.3+dfsg/starpu-top/StarPU-Top.pro.user.1.3000066400000000000000000000257331320135501600220130ustar00rootroot00000000000000 RunConfiguration0-BaseEnvironmentBase 2 RunConfiguration0-CommandLineArguments RunConfiguration0-ProFile StarPU-Top.pro RunConfiguration0-RunConfiguration.name StarPU-Top RunConfiguration0-UseDyldImageSuffix false RunConfiguration0-UseTerminal false RunConfiguration0-UserEnvironmentChanges RunConfiguration0-UserSetName false RunConfiguration0-UserSetWorkingDirectory false RunConfiguration0-UserWorkingDirectory RunConfiguration0-type Qt4ProjectManager.Qt4RunConfiguration activeRunConfiguration 0 activebuildconfiguration Debug buildConfiguration-Debug Debug 0 0 2 buildConfiguration-Release Release 0 0 buildconfiguration-Debug-buildstep0 Debug DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-xjteyoVy4U,guid=2ff41d777326f17fae0e40cc4d946e56 DESKTOP_SESSION=gnome DISPLAY=:0.0 DM_CONTROL=/var/run/xdmctl FLUENT_EDUCATIONAL=yes GNOME_DESKTOP_SESSION_ID=this-is-deprecated GNOME_KEYRING_CONTROL=/tmp/keyring-rP2qY8 GPG_AGENT_INFO=/tmp/gpg-G3amdS/S.gpg-agent:4516:1 GTK_MODULES=canberra-gtk-module HOME=/net/cremi/wbraik HOOPS_DRIVER=X11 JAVA=/usr/lib/jvm/java-6-sun/bin/java JAVA_HOME=/usr/lib/jvm/java-6-sun KRB5CCNAME=FILE:/tmp/krb5cc_18733_aqBO3a LANG=fr_FR.UTF-8 LD_LIBRARY_PATH=/usr/lib/qtcreator LOGNAME=wbraik ORBIT_SOCKETDIR=/tmp/orbit-wbraik PATH=/usr/bin:/usr/lib/jvm/java-6-sun/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games PWD=/net/cremi/wbraik QTDIR=/usr/share/qt4 SESSION_MANAGER=local/lebris:@/tmp/.ICE-unix/3965,unix/lebris:/tmp/.ICE-unix/3965 SHELL=/bin/bash SHLVL=0 SPEECHD_PORT=25293 SSH_AGENT_PID=4515 SSH_AUTH_SOCK=/tmp/keyring-rP2qY8/ssh UDEdir= USER=wbraik USERCACHE=/tmp/cache-wbraik WINDOWPATH=8 XDG_CONFIG_DIRS=/usr/share/ubuntustudio-menu/:/etc/xdg/ XDG_DATA_DIRS=/usr/share/gnome:/usr/local/share/:/usr/share/ XDG_SESSION_COOKIE=a3e0486a642ad65955ad302d4ce13336-1301573197.240134-346611465 XDM_MANAGED=method=classic /autofs/netapp/account/cremi/wbraik/Dropbox/Projets/Projets partagés/StarPU-Top/StarPU-Top.pro -spec linux-g++ -r CONFIG+=debug /usr/bin/qmake-qt4 true /autofs/netapp/account/cremi/wbraik/Dropbox/Projets/Projets partagés/StarPU-Top buildconfiguration-Debug-buildstep1 Debug DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-xjteyoVy4U,guid=2ff41d777326f17fae0e40cc4d946e56 DESKTOP_SESSION=gnome DISPLAY=:0.0 DM_CONTROL=/var/run/xdmctl FLUENT_EDUCATIONAL=yes GNOME_DESKTOP_SESSION_ID=this-is-deprecated GNOME_KEYRING_CONTROL=/tmp/keyring-rP2qY8 GPG_AGENT_INFO=/tmp/gpg-G3amdS/S.gpg-agent:4516:1 GTK_MODULES=canberra-gtk-module HOME=/net/cremi/wbraik HOOPS_DRIVER=X11 JAVA=/usr/lib/jvm/java-6-sun/bin/java JAVA_HOME=/usr/lib/jvm/java-6-sun KRB5CCNAME=FILE:/tmp/krb5cc_18733_aqBO3a LANG=fr_FR.UTF-8 LD_LIBRARY_PATH=/usr/lib/qtcreator LOGNAME=wbraik ORBIT_SOCKETDIR=/tmp/orbit-wbraik PATH=/usr/bin:/usr/lib/jvm/java-6-sun/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games PWD=/net/cremi/wbraik QTDIR=/usr/share/qt4 SESSION_MANAGER=local/lebris:@/tmp/.ICE-unix/3965,unix/lebris:/tmp/.ICE-unix/3965 SHELL=/bin/bash SHLVL=0 SPEECHD_PORT=25293 SSH_AGENT_PID=4515 SSH_AUTH_SOCK=/tmp/keyring-rP2qY8/ssh UDEdir= USER=wbraik USERCACHE=/tmp/cache-wbraik WINDOWPATH=8 XDG_CONFIG_DIRS=/usr/share/ubuntustudio-menu/:/etc/xdg/ XDG_DATA_DIRS=/usr/share/gnome:/usr/local/share/:/usr/share/ XDG_SESSION_COOKIE=a3e0486a642ad65955ad302d4ce13336-1301573197.240134-346611465 XDM_MANAGED=method=classic false -w /usr/bin/make true /autofs/netapp/account/cremi/wbraik/Dropbox/Projets/Projets partagés/StarPU-Top buildconfiguration-Debug-cleanstep0 Debug true clean buildconfiguration-Release-buildstep0 Release buildconfiguration-Release-buildstep1 Release buildconfiguration-Release-cleanstep0 Release buildconfigurations Debug Release buildstep0 buildstep1 buildsteps trolltech.qt4projectmanager.qmake trolltech.qt4projectmanager.make cleanstep0 true cleansteps trolltech.qt4projectmanager.make defaultFileEncoding System project starpu-1.2.3+dfsg/starpu-top/TODO.txt000066400000000000000000000004051320135501600173710ustar00rootroot00000000000000FONCTIONS : - cleanup dans le destructeur final (~MainWindow) - mettre en place l'interface DescriptionProvider BUGS : - parfois un QLIST ASSERT (index out of range) lors de la restauration de session (a priori assez difficile reproduire)? TESTS : starpu-1.2.3+dfsg/starpu-top/aboutdialog.cpp000066400000000000000000000022551320135501600210660ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "aboutdialog.h" #include "ui_aboutdialog.h" #include AboutDialog::AboutDialog(QWidget *parent) : QDialog(parent), ui(new Ui::AboutDialog) { ui->setupUi(this); qDebug() << "AboutDialog : initializing"; } AboutDialog::~AboutDialog() { qDebug() << "AboutDialog : terminating"; delete ui; } starpu-1.2.3+dfsg/starpu-top/aboutdialog.h000066400000000000000000000022121320135501600205240ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef ABOUTDIALOG_H #define ABOUTDIALOG_H #include namespace Ui { class AboutDialog; } class AboutDialog : public QDialog { Q_OBJECT public: explicit AboutDialog(QWidget *parent = 0); ~AboutDialog(); private: Ui::AboutDialog *ui; }; #endif // ABOUTDIALOG_H starpu-1.2.3+dfsg/starpu-top/aboutdialog.ui000066400000000000000000000117001320135501600207140ustar00rootroot00000000000000 AboutDialog 0 0 328 340 0 0 0 0 About StarPU-Top... :/images/about.png:/images/about.png true 16777215 110 Developers true QAbstractItemView::NoSelection William BRAIK Yann COURTOIS Jean-Marie COUTEYEN Anthony ROY 16777215 50 font: 12pt "MS Shell Dlg 2"; StarPU-Top, for StarPU false Qt::AlignCenter 120 110 :/images/starpu_top.png true 0 0 16777215 90 Software true 0 0 16777215 16777215 QAbstractItemView::NoSelection Year : 2011 Version : 0.1 Licence : LGPL starpu-1.2.3+dfsg/starpu-top/abstractwidgetwindow.cpp000066400000000000000000000113021320135501600230240ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "abstractwidgetwindow.h" #include "widgetwindowsmanager.h" #include "mainwindow.h" #include AbstractWidgetWindow::AbstractWidgetWindow( WidgetWindowsManager *widgetWindowsManager, MainWindow *mainWindow, bool inside) : QWidget(mainWindow) { _widgetWindowsManager = widgetWindowsManager; _mainWindow = mainWindow; _inside = inside; // Init id _windowId = generateWindowId(); // Init GUI _sizeGrip = new QSizeGrip(this); _sizeGrip->move(width()-32,height()-32); _sizeGrip->resize(32,32); _inOutButton = new QToolButton(); QObject::connect(_inOutButton, SIGNAL(clicked()), this, SLOT(on_inOutButton_clicked())); _inside ? _inOutButton->setToolTip(tr("To flying window")) : _inOutButton->setToolTip(tr("To MDI")); _inside ? _inOutButton->setIcon(QIcon(":/images/outside.png")) : _inOutButton->setIcon(QIcon(":/images/inside.png")); // Set attributes setAttribute(Qt::WA_DeleteOnClose); } AbstractWidgetWindow::~AbstractWidgetWindow() { delete _sizeGrip; delete _inOutButton; } /* -------------------------------------------------------------------------- */ /* Events */ /* -------------------------------------------------------------------------- */ void AbstractWidgetWindow::mousePressEvent(QMouseEvent *event) { if ((isInside() == false) && (event->button() == Qt::LeftButton)) { dragPosition = event->globalPos() - frameGeometry().topLeft(); event->accept(); } } void AbstractWidgetWindow::mouseMoveEvent(QMouseEvent *event) { if ((isInside() == false) && (event->buttons() & Qt::LeftButton)) { move(event->globalPos() - dragPosition); event->accept(); } } void AbstractWidgetWindow::resizeEvent(QResizeEvent *event) { _sizeGrip->move(width()-32,height()-32); _sizeGrip->resize(32,32); } /* -------------------------------------------------------------------------- */ /* Getters */ /* -------------------------------------------------------------------------- */ int AbstractWidgetWindow::windowId() const { return _windowId; } bool AbstractWidgetWindow::isInside() const { return _inside; } /* -------------------------------------------------------------------------- */ /* Setters */ /* -------------------------------------------------------------------------- */ void AbstractWidgetWindow::setInside(bool inside) { _inside = inside; if(isInside() == false) { _inOutButton->setToolTip(tr("To MDI")); _inOutButton->setIcon(QIcon(":/images/inside.png")); } else { _inOutButton->setToolTip(tr("To flying window")); _inOutButton->setIcon(QIcon(":/images/outside.png")); } } /* -------------------------------------------------------------------------- */ /* GUI interactions */ /* -------------------------------------------------------------------------- */ void AbstractWidgetWindow::on_inOutButton_clicked() { setInside(!isInside()); if(_inside) { _widgetWindowsManager->flyingWindowToMdi(this); } else { _widgetWindowsManager->mdiToFlyingWindow(this); } } /* -------------------------------------------------------------------------- */ /* Window ID generation */ /* -------------------------------------------------------------------------- */ int AbstractWidgetWindow::generateWindowId() { static int windowId = 0; return windowId++; } starpu-1.2.3+dfsg/starpu-top/abstractwidgetwindow.h000066400000000000000000000044031320135501600224750ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef ABSTRACTWIDGETWINDOW_H #define ABSTRACTWIDGETWINDOW_H class WidgetWindowsManager; class MainWindow; #include #include #include #include class AbstractWidgetWindow : public QWidget { /* Abstract class representing a widget window. It can be put "outside" (flying window) or "inside" (MDI) at any moment. The widget window is managed by the widget windows manager. */ Q_OBJECT public: explicit AbstractWidgetWindow( WidgetWindowsManager *widgetWindowsManager, MainWindow *mainWindow, bool inside = false); virtual ~AbstractWidgetWindow(); // Getters int windowId() const; bool isInside() const; // Setters void setInside(bool inside); protected: // Components WidgetWindowsManager *_widgetWindowsManager; MainWindow *_mainWindow; QPoint dragPosition; // GUI components QSizeGrip *_sizeGrip; QToolButton *_inOutButton; // Metadata int _windowId; bool _inside; // Window id generation int generateWindowId(); // Events void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void resizeEvent(QResizeEvent *event); virtual void closeEvent(QCloseEvent *ce) = 0; private slots: // GUI interactions void on_inOutButton_clicked(); }; #endif // ABSTRACTWIDGETWINDOW_H starpu-1.2.3+dfsg/starpu-top/communicationmanager.cpp000066400000000000000000001414041320135501600227740ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "communicationmanager.h" // Protocol messages delimiters const char COM_MSG_SEPARATOR = ';'; const char COM_MSG_ENDL = '\n'; CommunicationManager::CommunicationManager(QObject *parent) : QTcpSocket(parent) { static bool instanciated = false; Q_ASSERT_X(instanciated == false, "CommunicationManager's' constructor", "Singleton pattern violated - " "CommunicationManager instanciated more than once"); qDebug() << "CommunicationManager : initializing"; // Init incoming messages initInMessageStrings(); // Init outgoing messages initOutMessageStrings(); // Init session data and communication states initializeSession(); QObject::connect(this, SIGNAL(readyRead()), this, SLOT(messageReceived())); QObject::connect(this, SIGNAL(disconnected()), this, SLOT(clearDescriptions())); QObject::connect(this, SIGNAL(disconnected()), this, SLOT(initializeSession())); instanciated = true; } CommunicationManager::~CommunicationManager() { qDebug() << "CommunicationManager : terminating"; delete _dataDescriptions; delete _paramDescriptions; delete _serverDevices; } void CommunicationManager::initializeSession() { _dataDescriptions = new QList (); _paramDescriptions = new QList (); _serverDevices = new QList ; _serverInfoMsgCount = 0; _state = COM_STATE_INIT; _initServerInfoCompleted = _initDataCompleted = _initParamsCompleted = _initDevCompleted = false; } /* -------------------------------------------------------------------------- */ /* Receive messages */ /* -------------------------------------------------------------------------- */ void CommunicationManager::messageReceived() { while (canReadLine()) { QByteArray message = readLine(); QString messageString = QString(message).trimmed(); switch (_state) { case COM_STATE_INIT: { if (_beginEndMessageStrings.contains(messageString)) { parseInitMessage(messageString); } else { emit protocolError( "Unexpected message received in INIT (" + messageString + ")"); } break; } case COM_STATE_INIT_SERVERINFO: parseInitServerInfoMessage(messageString); break; case COM_STATE_INIT_DATA: parseInitDataMessage(messageString); break; case COM_STATE_INIT_PARAMS: parseInitParamsMessage(messageString); break; case COM_STATE_INIT_DEV: parseInitDevMessage(messageString); break; case COM_STATE_READY: parseReadyMessage(messageString); break; case COM_STATE_LOOP: parseLoopMessage(messageString); break; } } } /* -------------------------------------------------------------------------- */ /* Parse messages */ /* -------------------------------------------------------------------------- */ void CommunicationManager::parseInitMessage(QString messageString) { switch (_inMessageStrings.value(messageString)) { case COM_MSG_IN_SERVERINFO_BEGIN: qDebug() << "CommunicationManager : SERVERINFO BEGIN received in INIT"; _state = COM_STATE_INIT_SERVERINFO; break; case COM_MSG_IN_DATA_BEGIN: qDebug() << "CommunicationManager : DATA BEGIN received in INIT"; _state = COM_STATE_INIT_DATA; break; case COM_MSG_IN_PARAMS_BEGIN: qDebug() << "CommunicationManager : PARAMS BEGIN received in INIT"; _state = COM_STATE_INIT_PARAMS; break; case COM_MSG_IN_DEV_BEGIN: qDebug() << "CommunicationManager : DEV BEGIN received in INIT"; _state = COM_STATE_INIT_DEV; break; default: ; } } void CommunicationManager::parseInitServerInfoMessage(QString messageString) { if (_beginEndMessageStrings.contains(messageString)) { if (_inMessageStrings.value(messageString) == COM_MSG_IN_SERVERINFO_END) { qDebug() << "CommunicationManager : " "SERVERINFO END received in INIT SERVERINFO"; _initServerInfoCompleted = true; emit protoConnected(); if (isInitCompleted()) { _state = COM_STATE_READY; } else { _state = COM_STATE_INIT; } } else { emit protocolError( "Bogus message received in INIT SERVERINFO (" + messageString + ")"); } } else if (_serverInfoMsgCount == 0) { // First server info : Server ID qDebug() << "CommunicationManager : " "SERVERINFO received in INIT SERVERINFO (" << messageString + ")"; _serverID = messageString; _serverInfoMsgCount++; } else if (_serverInfoMsgCount == 1) { // Second server info : Server timestamp qDebug() << "CommunicationManager : " "SERVERTIMESTAMP received in INIT SERVERINFO (" << messageString + ")"; QString serverTimestampString = messageString; bool ok = false; qlonglong serverTimestamp = serverTimestampString.toLongLong(&ok); Q_ASSERT_X(ok == true, "CommunicationManager::parseInitServerInfoMessage()", "Bogus SERVERTIMESTAMP received in INIT SERVERINFO"); emit(sessionTimeSynchronized(serverTimestamp)); _serverTimestamp = serverTimestamp; _serverInfoMsgCount++; } } void CommunicationManager::parseInitDataMessage(QString messageString) { if (_beginEndMessageStrings.contains(messageString)) { if (_inMessageStrings.value(messageString) == COM_MSG_IN_DATA_END) { qDebug() << "CommunicationManager : DATA END received in INIT DATA"; _initDataCompleted = true; if (isInitCompleted()) { _state = COM_STATE_READY; } else { _state = COM_STATE_INIT; } } else { emit protocolError( "Bogus message received in INIT DATA (" + messageString + ")"); } } else { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); QString typeString = messageParts.at(0); QString idString = messageParts.at(1); bool ok = false; int id = idString.toInt(&ok); // Data ID Q_ASSERT_X(ok == true, "CommunicationManager::parseInitDataMessage()", "Bogus message received in INIT DATA"); QString description = messageParts.at(2); // Data description DataType type; DataWidgetType widget; // Data widget double valMax = 0., valMin = 0.; bool active; Q_ASSERT_X(_typeMessageStrings.contains(typeString), "CommunicationManager::parseInitDataMessage()", "Bogus message received in INIT DATA"); switch (_inMessageStrings.value(typeString)) { case COM_MSG_IN_TYPE_BOOL: { Q_ASSERT_X(messageParts.count() == 4, "CommunicationManager::parseInitDataMessage()", "Bogus message received in INIT DATA"); QString activeString = messageParts.at(3); Q_ASSERT_X( (activeString.compare("0") == 0) || (activeString.compare("1") == 0), "CommunicationManager::parseInitDataMessage()", "Bogus message received in INIT DATA"); if (activeString.compare("1") == 0) { active = true; } else { active = false; } type = DATA_TYPE_BOOL; widget = DEFAULT_DATA_WIDGET_BOOL; break; } case COM_MSG_IN_TYPE_INT: { Q_ASSERT_X(messageParts.count() == 6, "CommunicationManager::parseInitDataMessage()", "Bogus message received in INIT DATA"); QString activeString = messageParts.at(5); bool ok = false; int activeInt = activeString.toInt(&ok); Q_ASSERT_X(ok == true && (activeInt == 0 || activeInt == 1), "CommunicationManager::parseInitDataMessage()", "Bogus message received in INIT DATA"); if (activeInt == 1) { active = true; } else { active = false; } QString valMinString = messageParts.at(3); valMin = valMinString.toDouble(&ok); // Data ID Q_ASSERT_X(ok == true, "CommunicationManager::parseInitDataMessage()", "Bogus message received in INIT DATA"); QString valMaxString = messageParts.at(4); valMax = valMaxString.toDouble(&ok); Q_ASSERT_X(ok == true, "CommunicationManager::parseInitDataMessage()", "Bogus message received in INIT DATA"); type = DATA_TYPE_INT; widget = DEFAULT_DATA_WIDGET_INT; break; } case COM_MSG_IN_TYPE_FLOAT: { Q_ASSERT_X(messageParts.count() == 6, "CommunicationManager::parseInitDataMessage()", "Bogus message received in INIT DATA"); QString activeString = messageParts.at(5); bool ok = false; int activeInt = activeString.toInt(&ok); Q_ASSERT_X(ok == true && (activeInt == 0 || activeInt == 1), "CommunicationManager::parseInitDataMessage()", "Bogus message received in INIT DATA"); if (activeInt == 1) { active = true; } else { active = false; } QString valMinString = messageParts.at(3); valMin = valMinString.toDouble(&ok); Q_ASSERT_X(ok == true, "CommunicationManager::parseInitDataMessage()", "Bogus message received in INIT DATA"); QString valMaxString = messageParts.at(4); valMax = valMaxString.toDouble(&ok); Q_ASSERT_X(ok == true, "CommunicationManager::parseInitDataMessage()", "Bogus message received in INIT DATA"); type = DATA_TYPE_FLOAT; widget = DEFAULT_DATA_WIDGET_FLOAT; break; } default: emit protocolError( "Bogus message received in INIT DATA (" + messageString + ")"); return; } // Build the data description corresponding to this message if (active == false) { widget = DATA_WIDGET_NONE; } DataDescription *dataWidgetDescription = new DataDescription; dataWidgetDescription->id = id; dataWidgetDescription->descriptionString = description; dataWidgetDescription->type = type; dataWidgetDescription->widget = widget; dataWidgetDescription->valMin = valMin; dataWidgetDescription->valMax = valMax; _dataDescriptions->append(dataWidgetDescription); qDebug() << "CommunicationManager : " "DATA MSG successfully parsed in INIT DATA (" << messageString + ")"; } } void CommunicationManager::parseInitParamsMessage(QString messageString) { if (_beginEndMessageStrings.contains(messageString)) { if (_inMessageStrings.value(messageString) == COM_MSG_IN_PARAMS_END) { qDebug() << "CommunicationManager : " "PARAMS END received in INIT PARAMS"; _initParamsCompleted = true; if (isInitCompleted()) { _state = COM_STATE_READY; } else { _state = COM_STATE_INIT; } } else { emit protocolError( "Bogus message received in INIT PARAMS (" + messageString + ")"); } } else { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); QString typeString = messageParts.at(0); QString idString = messageParts.at(1); bool ok = false; int id = idString.toInt(&ok); // Param ID Q_ASSERT_X(ok == true, "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); QString description = messageParts.at(2); // Param description ParamType type; InteractiveWidgetType widget; bool valInitBool = false; int valInitInt = 0; double valInitDouble = 0.; int valInitEnum = 0; double valMax = 0., valMin = 0.; QStringList enumValues; Q_ASSERT_X(_typeMessageStrings.contains(typeString), "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); switch (_inMessageStrings.value(typeString)) { case COM_MSG_IN_TYPE_BOOL: { QString valInitString = messageParts.at(3); Q_ASSERT_X( messageParts.count() == 4 && (valInitString.compare("0") == 0 || valInitString.compare("1") == 1), "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); if (valInitString.compare("0") == 0) { valInitBool = false; } else { valInitBool = true; } type = PARAM_TYPE_BOOL; widget = DEFAULT_INTERACTIVE_WIDGET_BOOL; break; } case COM_MSG_IN_TYPE_INT: { Q_ASSERT_X(messageParts.count() == 6, "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); QString valInitString = messageParts.at(5); bool ok = false; valInitInt = valInitString.toInt(&ok); Q_ASSERT_X(ok == true, "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); QString valMinString = messageParts.at(3); valMin = valMinString.toDouble(&ok); Q_ASSERT_X(ok == true, "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); QString valMaxString = messageParts.at(4); valMax = valMaxString.toDouble(&ok); Q_ASSERT_X(ok == true, "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); type = PARAM_TYPE_INT; widget = DEFAULT_INTERACTIVE_WIDGET_INT; break; } case COM_MSG_IN_TYPE_FLOAT: { Q_ASSERT_X(messageParts.count() == 6, "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); QString valInitString = messageParts.at(5); bool ok = false; valInitDouble = valInitString.toDouble(&ok); Q_ASSERT_X(ok == true, "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); QString valMinString = messageParts.at(3); valMin = valMinString.toDouble(&ok); Q_ASSERT_X(ok == true, "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); QString valMaxString = messageParts.at(4); valMax = valMaxString.toDouble(&ok); Q_ASSERT_X(ok == true, "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); type = PARAM_TYPE_FLOAT; widget = DEFAULT_INTERACTIVE_WIDGET_FLOAT; break; } case COM_MSG_IN_TYPE_ENUM: { Q_ASSERT_X(messageParts.count() > 4, "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); QString valInitString = messageParts.at(messageParts.count()-1); bool ok = false; valInitEnum = valInitString.toInt(&ok); Q_ASSERT_X(ok == true, "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); QStringList values; for (int i = 3; i < messageParts.count() - 1; i++) { values << messageParts.at(i); } valMin = 0.0; valMax = messageParts.count() - 3 - 1; enumValues = values; type = PARAM_TYPE_ENUM; widget = DEFAULT_INTERACTIVE_WIDGET_ENUM; break; } default: emit protocolError( "Bogus message received in INIT PARAMS (" + messageString + ")"); return; } // Build the param description corresponding to this message ParamDescription *interactiveWidgetDescription = new ParamDescription; interactiveWidgetDescription->id = id; interactiveWidgetDescription->descriptionString = description; interactiveWidgetDescription->type = type; interactiveWidgetDescription->widget = widget; interactiveWidgetDescription->valInitBool = valInitBool; interactiveWidgetDescription->valInitInt = valInitInt; interactiveWidgetDescription->valInitDouble = valInitDouble; interactiveWidgetDescription->valInitEnum = valInitEnum; interactiveWidgetDescription->valMin = valMin; interactiveWidgetDescription->valMax = valMax; interactiveWidgetDescription->enumValues = enumValues; _paramDescriptions->append(interactiveWidgetDescription); qDebug() << "CommunicationManager : " "PARAMS MSG successfully parsed in INIT PARAMS (" << messageString + ")"; } } void CommunicationManager::parseInitDevMessage(QString messageString) { if (_beginEndMessageStrings.contains(messageString)) { if (_inMessageStrings.value(messageString) == COM_MSG_IN_DEV_END) { qDebug() << "CommunicationManager : DEV END received in INIT DEV"; _initDevCompleted = true; if (isInitCompleted()) { _state = COM_STATE_READY; } else { _state = COM_STATE_INIT; } } else { emit protocolError( "Bogus message received in INIT DEV (" + messageString + ")"); } } else { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); Q_ASSERT_X(messageParts.count() == 3, "CommunicationManager::parseInitDevMessage()", "Bogus message received in INIT DEV"); QString deviceIdString = messageParts.at(0); QString deviceTypeString = messageParts.at(1); QString deviceNameString = messageParts.at(2); bool ok = false; int deviceId = deviceIdString.toInt(&ok); Q_ASSERT_X(ok == true, "CommunicationManager::parseInitDevMessage()", "Bogus message received in INIT DEV"); starpu_top_device_type deviceType; Q_ASSERT_X( deviceTypeString.compare( _inMessageStrings.key(COM_MSG_IN_DEV_CPU)) == 0 || deviceTypeString.compare( _inMessageStrings.key(COM_MSG_IN_DEV_CUDA)) == 0 || deviceTypeString.compare( _inMessageStrings.key(COM_MSG_IN_DEV_OPENCL)) == 0 , "CommunicationManager::parseInitDevMessage()", "Bogus message received in INIT DEV"); if (deviceTypeString.compare(_inMessageStrings.key(COM_MSG_IN_DEV_CPU)) == 0) { deviceType = SERVERDEVICE_CPU; } else if (deviceTypeString.compare( _inMessageStrings.key(COM_MSG_IN_DEV_CUDA)) == 0) { deviceType = SERVERDEVICE_CUDA; } else if (deviceTypeString.compare( _inMessageStrings.key(COM_MSG_IN_DEV_OPENCL)) == 0) { deviceType = SERVERDEVICE_OPENCL; } starpu_top_device device; device.id = deviceId; device.type = deviceType; device.name = deviceNameString; _serverDevices->append(device); qDebug() << "CommunicationManager : " "DEV MSG successfully parsed in INIT DEV (" << messageString + ")"; } } void CommunicationManager::parseReadyMessage(QString messageString) { if (_inMessageStrings.value(messageString) == COM_MSG_IN_READY) { qDebug() << "CommunicationManager : READY received in READY (" << messageString + ")"; emit serverInitCompleted(_serverID, _dataDescriptions, _paramDescriptions, _serverDevices); _state = COM_STATE_LOOP; } else { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); QString head = messageParts.at(0); Q_ASSERT_X(_widgetStatusChangeMessageStrings.contains(head), "CommunicationManager::parseReadyMessage()", "Bogus message received in READY"); switch (_inMessageStrings.value(head)) { case COM_MSG_IN_SET: parseParamNotificationMessage(messageString); break; default: ; } } } void CommunicationManager::parseLoopMessage(QString messageString) { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); QString head = messageParts.at(0); if (_widgetStatusChangeMessageStrings.contains(head)) { switch (_inMessageStrings.value(head)) { case COM_MSG_IN_SET: parseParamNotificationMessage(messageString); break; default: ; } } else if (_loopMessageStrings.contains(head)) { switch (_inMessageStrings.value(head)) { case COM_MSG_IN_PREV: parseTaskPrevMessage(messageString); break; case COM_MSG_IN_SHORT_PREV: parseTaskPrevMessage(messageString); break; case COM_MSG_IN_START: parseTaskStartMessage(messageString); break; case COM_MSG_IN_SHORT_START: parseTaskStartMessage(messageString); break; case COM_MSG_IN_END: parseTaskEndMessage(messageString); break; case COM_MSG_IN_SHORT_END: parseTaskEndMessage(messageString); break; case COM_MSG_IN_UPDATE: parseDataUpdateMessage(messageString); break; case COM_MSG_IN_SHORT_UPDATE: parseDataUpdateMessage(messageString); break; default: ; } } else if (_debugMessageStrings.contains(head)) { switch (_inMessageStrings.value(head)) { case COM_MSG_IN_DEBUG: parseDebugEnabledMessage(messageString); break; case COM_MSG_IN_DEBUG_MESSAGE: parseDebugMessageMessage(messageString); break; case COM_MSG_IN_DEBUG_LOCK: parseDebugLockMessage(messageString); break; default: ; } } else { emit protocolError( "Unexpected message received in LOOP (" + messageString + ")"); } } void CommunicationManager::parseTaskPrevMessage(QString messageString) { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); if (messageParts.count() == 6) { QString taskIdString = messageParts.at(1); QString deviceIdString = messageParts.at(2); QString timestampString = messageParts.at(3); QString timestampStartString = messageParts.at(4); QString timestampEndString = messageParts.at(5); int taskId; int deviceId; qlonglong timestamp; qlonglong timestampStart; qlonglong timestampEnd; bool ok = false; taskId = taskIdString.toInt(&ok); if (ok == false) { emit protocolError( "Unexpected TASK PREV message received in LOOP (" + messageString + ")"); return; } deviceId = deviceIdString.toInt(&ok); if (ok == false) { emit protocolError( "Unexpected TASK PREV message received in LOOP (" + messageString + ")"); return; } timestamp = timestampString.toLongLong(&ok); if (ok == false) { emit protocolError( "Unexpected TASK PREV message received in LOOP (" + messageString + ")"); return; } timestampStart = timestampStartString.toLongLong(&ok); if (ok == false) { emit protocolError( "Unexpected TASK PREV message received in LOOP (" + messageString + ")"); return; } timestampEnd = timestampEndString.toLongLong(&ok); if (ok == false) { emit protocolError( "Unexpected TASK PREV message received in LOOP (" + messageString + ")"); return; } emit notifyTaskPrevUpdate(taskId, deviceId, timestamp, timestampStart, timestampEnd); qDebug() << "CommunicationManager : " "TASK PREV message successfully parsed in LOOP (" << messageString + ")"; } else { emit protocolError( "Unexpected TASK PREV message received in LOOP (" + messageString + ")"); } } void CommunicationManager::parseTaskStartMessage(QString messageString) { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); if (messageParts.count() == 4) { QString taskIdString = messageParts.at(1); QString deviceIdString = messageParts.at(2); QString timestampString = messageParts.at(3); int taskId; int deviceId; qlonglong timestamp; bool ok = false; taskId = taskIdString.toInt(&ok); if (ok == false) { emit protocolError( "Bogus TASK START message received in LOOP (" + messageString + ")"); return; } deviceId = deviceIdString.toInt(&ok); if (ok == false) { emit protocolError( "Bogus TASK START message received in LOOP (" + messageString + ")"); return; } timestamp = timestampString.toLongLong(&ok); if (ok == false) { emit protocolError( "Bogus TASK START message received in LOOP (" + messageString + ")"); return; } emit notifyTaskStartUpdate(taskId, deviceId, timestamp); qDebug() << "CommunicationManager : " "TASK START message succesfully parsed in LOOP (" << messageString + ")"; } else { emit protocolError( "Bogus TASK START message received in LOOP (" + messageString + ")"); } } void CommunicationManager::parseTaskEndMessage(QString messageString) { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); if (messageParts.count() == 3) { QString taskIdString = messageParts.at(1); QString timestampString = messageParts.at(2); int taskId; qlonglong timestamp; bool ok = false; taskId = taskIdString.toInt(&ok); if (ok == false) { emit protocolError( "Bogus TASK END message received in LOOP (" + messageString + ")"); return; } timestamp = timestampString.toLongLong(&ok); if (ok == false) { emit protocolError( "Bogus TASK END message received in LOOP (" + messageString + ")"); return; } emit notifyTaskEndUpdate(taskId, timestamp); qDebug() << "CommunicationManager : " "TASK END message successfully parsed in LOOP (" << messageString + ")"; } else { emit protocolError( "Bogus TASK END message received in LOOP (" + messageString + ")"); } } void CommunicationManager::parseDataUpdateMessage(QString messageString) { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); if (messageParts.count() == 4) { QString dataIdString = messageParts.at(1); QString timestampString = messageParts.at(3); QString dataValueString = messageParts.at(2); int dataId; qlonglong timestamp; bool ok = false; dataId = dataIdString.toInt(&ok); if (ok == false || (dataDescriptionFromId(dataId) == 0)) { emit protocolError( "Bogus UPDATE message received in LOOP (" + messageString + ")"); return; } timestamp = timestampString.toLongLong(&ok); if (ok == false) { emit protocolError( "Bogus UPDATE message received in LOOP (" + messageString + ")"); return; } switch (dataDescriptionFromId(dataId)->type) { case DATA_TYPE_BOOL: { bool dataVal; if (dataValueString.compare("0") == 0) { dataVal = false; } else if (dataValueString.compare("1") == 0) { dataVal = true; } else { emit protocolError( "Bogus UPDATE message received in LOOP (" + messageString + ")"); return; } emit notifyDataUpdate(dataId, dataVal, timestamp); break; } case DATA_TYPE_INT: { int dataVal = dataValueString.toInt(&ok); if (ok == false) { emit protocolError( "Bogus UPDATE message received in LOOP (" + messageString + ")"); return; } emit notifyDataUpdate(dataId, dataVal, timestamp); break; } case DATA_TYPE_FLOAT: { double dataVal = dataValueString.toDouble(&ok); if (ok == false) { emit protocolError( "Bogus UPDATE message received in LOOP (" + messageString + ")"); return; } emit notifyDataUpdate(dataId, dataVal, timestamp); break; } default: emit protocolError( "Bogus UPDATE message received in LOOP (" + messageString + ")"); } qDebug() << "CommunicationManager : " "UPDATE message successfully parsed in LOOP (" << messageString + ")"; } else { emit protocolError( "Bogus UPDATE message received in LOOP (" + messageString + ")"); } } void CommunicationManager::parseParamNotificationMessage(QString messageString) { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); if (messageParts.count() != 4) { emit protocolError( "Bogus SET message received (" + messageString + ")"); return; } QString paramIdString = messageParts.at(1); QString paramValueString = messageParts.at(2); QString timestampString = messageParts.at(3); int paramId; qlonglong timestamp; bool ok = false; paramId = paramIdString.toInt(&ok); if (ok == false || (paramDescriptionFromId(paramId) == 0)) { emit protocolError( "Bogus SET message received (" + messageString + ")"); return; } timestamp = timestampString.toLongLong(&ok); if (ok == false) { emit protocolError( "Bogus SET message received (" + messageString + ")"); return; } switch (paramDescriptionFromId(paramId)->type) { case PARAM_TYPE_BOOL: { bool paramVal; if (paramValueString.compare("0") == 0) { paramVal = false; } else if (paramValueString.compare("1") == 0) { paramVal = true; } else { emit protocolError( "Bogus SET message received (" + messageString + ")"); return; } emit notifyParamUpdate(paramId, paramVal, timestamp); break; } case PARAM_TYPE_INT: { int paramVal = paramValueString.toInt(&ok); if (ok == false) { emit protocolError( "Bogus SET message received (" + messageString + ")"); return; } emit notifyParamUpdate(paramId, paramVal, timestamp); break; } case PARAM_TYPE_FLOAT: { double paramVal = paramValueString.toDouble(&ok); if (ok == false) { emit protocolError( "Bogus SET message received (" + messageString + ")"); return; } emit notifyParamUpdate(paramId, paramVal, timestamp); break; } case PARAM_TYPE_ENUM: { int paramVal = paramValueString.toInt(&ok); if (ok == false) { emit protocolError( "Bogus SET message received (" + messageString + ")"); return; } emit notifyParamUpdate(paramId, paramVal, timestamp); break; } default: emit protocolError( "Bogus SET message received (" + messageString + ")"); } qDebug() << "CommunicationManager : SET successfully parsed in LOOP (" << messageString + ")"; } void CommunicationManager::parseDebugEnabledMessage(QString messageString) { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); if (messageParts.count() != 2) { emit protocolError( "Bogus DEBUG message received (" + messageString + ")"); return; } QString debugEnabledString = messageParts.at(1); if (debugEnabledString.compare(_inMessageStrings.key(COM_MSG_IN_DEBUG_ON)) == 0) { qDebug() << "CommunicationManager : DEBUG ON received (" << messageString + ")"; emit notifyDebugEnabled(true); } else if (debugEnabledString.compare( _inMessageStrings.key(COM_MSG_IN_DEBUG_OFF)) == 0) { qDebug() << "CommunicationManager : DEBUG OFF received (" << messageString + ")"; emit notifyDebugEnabled(false); } else { emit protocolError( "Bogus DEBUG message received (" + messageString + ")"); } } void CommunicationManager::parseDebugMessageMessage(QString messageString) { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); if (messageParts.count() != 2) { emit protocolError( "Bogus DEBUG message received (" + messageString + ")"); return; } QString debugMessageString = messageParts.at(1); emit notifyDebugMessage(debugMessageString); qDebug() << "CommunicationManager : DEBUG MESSAGE received (" << messageString + ")"; } void CommunicationManager::parseDebugLockMessage(QString messageString) { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); if (messageParts.count() != 2) { emit protocolError( "Bogus DEBUG message received (" + messageString + ")"); return; } QString lockMessageString = messageParts.at(1); emit notifyDebugLock(lockMessageString); qDebug() << "CommunicationManager : DEBUG LOCK received (" << messageString + ")"; } /* -------------------------------------------------------------------------- */ /* Send messages */ /* -------------------------------------------------------------------------- */ void CommunicationManager::sendMessage(QString messageString) { messageString.append(COM_MSG_ENDL); #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) write(messageString.toLatin1()); #else write(messageString.toAscii()); #endif } void CommunicationManager::sendGoMessage() { sendMessage( buildGoMessage()); } void CommunicationManager::sendDataEnableMessage(int dataId) { sendMessage(buildDataEnableMessage(dataId)); } void CommunicationManager::sendDataDisableMessage(int dataId) { sendMessage(buildDataDisableMessage(dataId)); } void CommunicationManager::sendParamSetMessage(int paramId, bool paramValue) { sendMessage(buildParamSetMessage(paramId, paramValue)); } void CommunicationManager::sendParamSetMessage(int paramId, int paramValue) { sendMessage(buildParamSetMessage(paramId, paramValue)); } void CommunicationManager::sendParamSetMessage(int paramId, double paramValue) { sendMessage(buildParamSetMessage(paramId, paramValue)); } void CommunicationManager::sendDebugEnabledMessage(bool enabled) { sendMessage(buildDebugEnabledMessage(enabled)); } void CommunicationManager::sendStepMessage() { sendMessage( buildStepMessage()); } /* -------------------------------------------------------------------------- */ /* Getters */ /* -------------------------------------------------------------------------- */ CommunicationState CommunicationManager::state() const { return _state; } bool CommunicationManager::isInitCompleted() const { return (_initServerInfoCompleted && _initDataCompleted && _initParamsCompleted && _initDevCompleted); } /* -------------------------------------------------------------------------- */ /* Build messages */ /* -------------------------------------------------------------------------- */ QString CommunicationManager::buildGoMessage() { QString messageString = _outMessageStrings.value(COM_MSG_OUT_GO); return messageString; } QString CommunicationManager::buildDataEnableMessage(int dataId) { QString head = _outMessageStrings.value(COM_MSG_OUT_ENABLE); QString dataIdString = QString::number(dataId); QString messageString = head.append(COM_MSG_SEPARATOR).append(dataIdString); return messageString; } QString CommunicationManager::buildDataDisableMessage(int dataId) { QString head = _outMessageStrings.value(COM_MSG_OUT_DISABLE); QString dataIdString = QString::number(dataId); QString messageString = head.append(COM_MSG_SEPARATOR).append(dataIdString); return messageString; } QString CommunicationManager::buildParamSetMessage(int paramId, bool paramValue) { QString head = _outMessageStrings.value(COM_MSG_OUT_SET); QString paramIdString = QString::number(paramId); QString paramValueString = QString::number(paramValue ? 1 : 0); QString messageString = head.append(COM_MSG_SEPARATOR).append(paramIdString).append( COM_MSG_SEPARATOR) .append(paramValueString); return messageString; } QString CommunicationManager::buildParamSetMessage(int paramId, int paramValue) { QString head = _outMessageStrings.value(COM_MSG_OUT_SET); QString paramIdString = QString::number(paramId); QString paramValueString = QString::number(paramValue); QString messageString = head.append(COM_MSG_SEPARATOR).append(paramIdString).append( COM_MSG_SEPARATOR) .append(paramValueString); return messageString; } QString CommunicationManager::buildParamSetMessage(int paramId, double paramValue) { QString head = _outMessageStrings.value(COM_MSG_OUT_SET); QString paramIdString = QString::number(paramId); QString paramValueString = QString::number(paramValue); QString messageString = head.append(COM_MSG_SEPARATOR).append(paramIdString).append( COM_MSG_SEPARATOR) .append(paramValueString); return messageString; } QString CommunicationManager::buildDebugEnabledMessage(bool enabled) { QString head = _outMessageStrings.value(COM_MSG_OUT_DEBUG); QString debugEnabledString = (enabled ? _outMessageStrings.value( COM_MSG_OUT_DEBUG_ON) : _outMessageStrings.value( COM_MSG_OUT_DEBUG_OFF)); QString messageString = head.append(COM_MSG_SEPARATOR).append( debugEnabledString); return messageString; } QString CommunicationManager::buildStepMessage() { QString messageString = _outMessageStrings.value(COM_MSG_OUT_DEBUG_STEP); return messageString; } DataDescription *CommunicationManager::dataDescriptionFromId(int dataId) const { for (int i = 0; i < _dataDescriptions->count(); i++) { if (_dataDescriptions->at(i)->id == dataId) return _dataDescriptions->at(i); } return 0; } ParamDescription *CommunicationManager::paramDescriptionFromId(int paramId) const { for (int i = 0; i < _paramDescriptions->count(); i++) { if (_paramDescriptions->at(i)->id == paramId) return _paramDescriptions->at(i); } return 0; } void CommunicationManager::clearDescriptions() { _dataDescriptions->clear(); _paramDescriptions->clear(); } /* -------------------------------------------------------------------------- */ /* Init message strings */ /* -------------------------------------------------------------------------- */ void CommunicationManager::initInMessageStrings() { // Types _inMessageStrings.insert("BOOL", COM_MSG_IN_TYPE_BOOL); _inMessageStrings.insert("INT", COM_MSG_IN_TYPE_INT); _inMessageStrings.insert("FLOAT", COM_MSG_IN_TYPE_FLOAT); _inMessageStrings.insert("ENUM", COM_MSG_IN_TYPE_ENUM); _typeMessageStrings.insert("BOOL"); _typeMessageStrings.insert("INT"); _typeMessageStrings.insert("FLOAT"); _typeMessageStrings.insert("ENUM"); // Init server ID _inMessageStrings.insert("SERVERINFO", COM_MSG_IN_SERVERINFO_BEGIN); _inMessageStrings.insert("/SERVERINFO", COM_MSG_IN_SERVERINFO_END); _beginEndMessageStrings.insert("SERVERINFO"); _beginEndMessageStrings.insert("/SERVERINFO"); // Init data _inMessageStrings.insert("DATA", COM_MSG_IN_DATA_BEGIN); _inMessageStrings.insert("/DATA", COM_MSG_IN_DATA_END); _beginEndMessageStrings.insert("DATA"); _beginEndMessageStrings.insert("/DATA"); // Init parameters _inMessageStrings.insert("PARAMS", COM_MSG_IN_PARAMS_BEGIN); _inMessageStrings.insert("/PARAMS", COM_MSG_IN_PARAMS_END); _beginEndMessageStrings.insert("PARAMS"); _beginEndMessageStrings.insert("/PARAMS"); // Init devices _inMessageStrings.insert("DEV", COM_MSG_IN_DEV_BEGIN); _inMessageStrings.insert("/DEV", COM_MSG_IN_DEV_END); _inMessageStrings.insert("CPU", COM_MSG_IN_DEV_CPU); _inMessageStrings.insert("GPU", COM_MSG_IN_DEV_CUDA); _inMessageStrings.insert("OPENCL", COM_MSG_IN_DEV_OPENCL); _beginEndMessageStrings.insert("DEV"); _beginEndMessageStrings.insert("/DEV"); // Server ready _inMessageStrings.insert("READY", COM_MSG_IN_READY); // Widget status _inMessageStrings.insert("SET", COM_MSG_IN_SET); _widgetStatusChangeMessageStrings.insert("SET"); // Loop messages // Complete versions _inMessageStrings.insert("PREV", COM_MSG_IN_PREV); _inMessageStrings.insert("START", COM_MSG_IN_START); _inMessageStrings.insert("END", COM_MSG_IN_END); _inMessageStrings.insert("UPDATE", COM_MSG_IN_UPDATE); // Short versions _inMessageStrings.insert("P", COM_MSG_IN_SHORT_PREV); _inMessageStrings.insert("S", COM_MSG_IN_SHORT_START); _inMessageStrings.insert("E", COM_MSG_IN_SHORT_END); _inMessageStrings.insert("U", COM_MSG_IN_SHORT_UPDATE); // Complete versions _loopMessageStrings.insert("PREV"); _loopMessageStrings.insert("START"); _loopMessageStrings.insert("END"); _loopMessageStrings.insert("UPDATE"); // Short versions _loopMessageStrings.insert("P"); _loopMessageStrings.insert("S"); _loopMessageStrings.insert("E"); _loopMessageStrings.insert("U"); // Debug messages _inMessageStrings.insert("DEBUG", COM_MSG_IN_DEBUG); _inMessageStrings.insert("ON", COM_MSG_IN_DEBUG_ON); _inMessageStrings.insert("OFF", COM_MSG_IN_DEBUG_OFF); _inMessageStrings.insert("MESSAGE", COM_MSG_IN_DEBUG_MESSAGE); _inMessageStrings.insert("LOCK", COM_MSG_IN_DEBUG_LOCK); _debugMessageStrings.insert("DEBUG"); _debugMessageStrings.insert("MESSAGE"); _debugMessageStrings.insert("LOCK"); } void CommunicationManager::initOutMessageStrings() { // Launch session on server _outMessageStrings.insert(COM_MSG_OUT_GO, "GO"); // Widget status change _outMessageStrings.insert(COM_MSG_OUT_ENABLE, "ENABLE"); _outMessageStrings.insert(COM_MSG_OUT_DISABLE, "DISABLE"); _outMessageStrings.insert(COM_MSG_OUT_SET, "SET"); // Debug mode _outMessageStrings.insert(COM_MSG_OUT_DEBUG, "DEBUG"); _outMessageStrings.insert(COM_MSG_OUT_DEBUG_ON, "ON"); _outMessageStrings.insert(COM_MSG_OUT_DEBUG_OFF, "OFF"); _outMessageStrings.insert(COM_MSG_OUT_DEBUG_STEP, "STEP"); } starpu-1.2.3+dfsg/starpu-top/communicationmanager.h000066400000000000000000000137121320135501600224410ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef COMMUNICATIONMANAGER_H #define COMMUNICATIONMANAGER_H #include #include "starpu_top_types.h" class CommunicationManager : public QTcpSocket { /* Receives protocol messages from server, parses them and notifies the GUI appropriately using signals. Sends protocol messages to server when the GUI notifies. */ Q_OBJECT public: CommunicationManager(QObject *parent = 0); ~CommunicationManager(); private: // Protocol message strings QHash _inMessageStrings; QHash _outMessageStrings; QSet _typeMessageStrings; QSet _beginEndMessageStrings; QSet _widgetStatusChangeMessageStrings; QSet _debugMessageStrings; QSet _loopMessageStrings; // Metadata int _serverInfoMsgCount; QString _serverID; qlonglong _serverTimestamp; QList *_dataDescriptions; QList *_paramDescriptions; QList *_serverDevices; // Communication states CommunicationState _state; bool _initServerInfoCompleted; bool _initDataCompleted; bool _initParamsCompleted; bool _initDevCompleted; // Getters // Get communication states CommunicationState state() const; bool isInitCompleted() const; // Get session descriptions DataDescription *dataDescriptionFromId(int dataId) const; ParamDescription *paramDescriptionFromId(int paramId) const; // Init protocol message strings void initInMessageStrings(); void initOutMessageStrings(); private slots: // Initialize a new session void initializeSession(); // Receive protocol messages void messageReceived(); // Parse different protocol messages void parseInitMessage(QString messageString); void parseInitServerInfoMessage(QString messageString); void parseInitDataMessage(QString messageString); void parseInitParamsMessage(QString messageString); void parseInitDevMessage(QString messageString); void parseReadyMessage(QString messageString); void parseLoopMessage(QString messageString); void parseTaskPrevMessage(QString messageString); void parseTaskStartMessage(QString messageString); void parseTaskEndMessage(QString messageString); void parseDataUpdateMessage(QString messageString); void parseParamNotificationMessage(QString messageString); void parseDebugEnabledMessage(QString messageString); void parseDebugMessageMessage(QString messageString); void parseDebugLockMessage(QString messageString); public slots: // Build different protocol messages QString buildGoMessage(); QString buildDataEnableMessage(int dataId); QString buildDataDisableMessage(int dataId); QString buildParamSetMessage(int paramId, bool paramValue); QString buildParamSetMessage(int paramId, int paramValue); QString buildParamSetMessage(int paramId, double paramValue); QString buildDebugEnabledMessage(bool enabled); QString buildStepMessage(); // Send different protocol messages void sendMessage(QString messageString); void sendGoMessage(); void sendDataEnableMessage(int dataId); void sendDataDisableMessage(int dataId); void sendParamSetMessage(int paramId, bool paramValue); void sendParamSetMessage(int paramId, int paramValue); void sendParamSetMessage(int paramId, double paramValue); void sendDebugEnabledMessage(bool enabled); void sendStepMessage(); // Clear session descriptions void clearDescriptions(); signals: // Reference time received from server void sessionTimeSynchronized(qlonglong serverTimestamp); // Send init session data to GUI void serverInitCompleted(QString serverID, QList *dataDescriptions, QList *paramDescriptions, QList *serverDevices); // Notify GUI with a protocol message // Protocol error void protocolError(QString errorMessage); // Debug protocol messages void notifyDebugEnabled(bool enabled); void notifyDebugMessage(QString debugMessage); void notifyDebugLock(QString lockMessage); // Data update protocol messages void notifyDataUpdate(int dataId, bool dataValue, qlonglong timestamp); void notifyDataUpdate(int dataId, int dataValue, qlonglong timestamp); void notifyDataUpdate(int dataId, double dataValue, qlonglong timestamp); // Parameter update protocol messages void notifyParamUpdate(int paramId, bool paramValue, qlonglong timestamp); void notifyParamUpdate(int paramId, int paramValue, qlonglong timestamp); void notifyParamUpdate(int paramId, double paramValue, qlonglong timestamp); // Task update protocol messages void notifyTaskPrevUpdate(int taskId, int deviceId, qlonglong timestamp, qlonglong timestampStart, qlonglong timestampEnd); void notifyTaskStartUpdate(int taskId, int deviceId, qlonglong timestamp); void notifyTaskEndUpdate(int taskId, qlonglong timestamp); void protoConnected(); }; #endif // COMMUNICATIONMANAGER_H starpu-1.2.3+dfsg/starpu-top/communicationthread.cpp000066400000000000000000000256551320135501600226420ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy Copyright (C) 2011 Université de Bordeaux This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "communicationthread.h" #include "configurationmanager.h" #include "mainwindow.h" #include "communicationmanager.h" #include "starpu_top_types.h" const int MAX_CONNECTION_ATTEMPTS = 10; CommunicationThread::CommunicationThread( MainWindow *mainWindow, ConfigurationManager *configurationManager) { static bool instanciated = false; Q_ASSERT_X(instanciated == false, "CommunicationThread's' constructor", "Singleton pattern violated - " "CommunicationThread instanciated more than once"); _mainWindow = mainWindow; _configurationManager = configurationManager; _communicationManager = 0; _SSHProcess = NULL; instanciated = true; QObject::connect(this, SIGNAL(progress(QString)), _mainWindow, SLOT(updateStatusBarMessage(QString))); QObject::connect(this, SIGNAL(disconnected()), _mainWindow, SLOT(disconnected())); QObject::connect(this, SIGNAL(abort(QString)), _mainWindow, SLOT(connectionAborted(QString))); qDebug() << "CommunicationThread : initializing"; } CommunicationThread::~CommunicationThread() { qDebug() << "CommunicationThread : terminating"; delete _communicationManager; } void CommunicationThread::createNewCommunicationManager(void) { emit progress(tr("Connecting...")); if (_communicationManager == 0) delete(_communicationManager ); _communicationManager = new CommunicationManager(this); // Type registering is necessary for Qt "Queued Connections" // as we are going to send signals to a different thread qRegisterMetaType ( "QAbstractSocket::SocketError"); // Connection events QObject::connect(_communicationManager, SIGNAL(protoConnected()), _mainWindow, SLOT(connectionSucceeded())); QObject::connect(_communicationManager, SIGNAL(protoConnected()), this, SLOT(connectionSucceeded())); QObject::connect(_communicationManager, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(connectionError(QAbstractSocket::SocketError))); QObject::connect(_communicationManager, SIGNAL(disconnected()), this, SLOT(connectionDisconnected())); // Change communication state QObject::connect(_communicationManager, SIGNAL(protocolError(QString)), _mainWindow, SLOT(protocolErrorCaught(QString))); QObject::connect(_communicationManager, SIGNAL(sessionTimeSynchronized(qlonglong)), _mainWindow, SLOT(synchronizeSessionTime(qlonglong))); QObject::connect(_communicationManager, SIGNAL(serverInitCompleted(QString, QList*, QList*, QList*)), _mainWindow, SLOT(initClient( QString, QList*, QList*, QList*))); // Output data QObject::connect(_mainWindow, SIGNAL(clientLaunched()), _communicationManager, SLOT(sendGoMessage())); QObject::connect(_mainWindow, SIGNAL(dataEnabled(int)), _communicationManager, SLOT(sendDataEnableMessage(int))); QObject::connect(_mainWindow, SIGNAL(dataDisabled(int)), _communicationManager, SLOT(sendDataDisableMessage(int))); QObject::connect(_mainWindow, SIGNAL(paramValueUpdated(int,bool)), _communicationManager, SLOT(sendParamSetMessage(int,bool))); QObject::connect(_mainWindow, SIGNAL(paramValueUpdated(int,int)), _communicationManager, SLOT(sendParamSetMessage(int,int))); QObject::connect(_mainWindow, SIGNAL(paramValueUpdated(int,double)), _communicationManager, SLOT(sendParamSetMessage(int,double))); QObject::connect(_mainWindow, SIGNAL(debugEnabled(bool)), _communicationManager, SLOT(sendDebugEnabledMessage(bool))); QObject::connect(_mainWindow, SIGNAL(debugStepped()), _communicationManager, SLOT(sendStepMessage())); // Input data QObject::connect(_communicationManager, SIGNAL(notifyDebugEnabled(bool)), _mainWindow, SLOT(setDebug(bool))); QObject::connect(_communicationManager, SIGNAL(notifyDebugMessage(QString)), _mainWindow, SLOT(setDebugMessage(QString))); QObject::connect(_communicationManager, SIGNAL(notifyDebugLock(QString)), _mainWindow, SLOT(setDebugLock(QString))); QObject ::connect(_communicationManager, SIGNAL(notifyParamUpdate(int,bool,qlonglong)), _mainWindow, SLOT(updateInteractiveWidget(int,bool,qlonglong))); QObject::connect(_communicationManager, SIGNAL(notifyParamUpdate(int,int,qlonglong)), _mainWindow, SLOT(updateInteractiveWidget(int,int,qlonglong))); QObject::connect(_communicationManager, SIGNAL(notifyParamUpdate(int,double,qlonglong)), _mainWindow, SLOT(updateInteractiveWidget(int,double,qlonglong))); QObject::connect(_communicationManager, SIGNAL(notifyTaskPrevUpdate(int,int,qlonglong,qlonglong,qlonglong)), _mainWindow, SLOT(updateTaskPrev(int,int,qlonglong,qlonglong,qlonglong))); QObject::connect(_communicationManager, SIGNAL(notifyTaskStartUpdate(int,int,qlonglong)), _mainWindow, SLOT(updateTaskStart(int,int,qlonglong))); QObject::connect(_communicationManager, SIGNAL(notifyTaskEndUpdate(int,qlonglong)), _mainWindow, SLOT(updateTaskEnd(int,qlonglong))); QObject::connect(_communicationManager, SIGNAL(notifyDataUpdate(int,bool,qlonglong)), _mainWindow, SLOT(updateDataWidget(int,bool,qlonglong))); QObject::connect(_communicationManager, SIGNAL(notifyDataUpdate(int,int,qlonglong)), _mainWindow, SLOT(updateDataWidget(int,int,qlonglong))); QObject::connect(_communicationManager, SIGNAL(notifyDataUpdate(int,double,qlonglong)), _mainWindow, SLOT(updateDataWidget(int,double,qlonglong))); _communicationManager->connectToHost(_configurationManager->serverHost(), _configurationManager->serverPort()); } void CommunicationThread::run() { if(_configurationManager->ssh()) { _connectionAttemptsCount = 0; QString commandLine; #ifdef WIN32 commandLine.append("cmd /c start "); #else commandLine.append("xterm -e "); #endif commandLine.append(_configurationManager->commandLine()); qDebug() << "CommunicationThread : executing SSH command line : " << commandLine; _SSHProcess = new QProcess(); _SSHProcess->start(commandLine); } createNewCommunicationManager(); exec(); } void CommunicationThread::connectionError(QAbstractSocket::SocketError error) { qDebug() << "CommunicationThread : connection error occured" << error; switch (error) { case QAbstractSocket::ConnectionRefusedError: if (_configurationManager->ssh()) { if (_connectionAttemptsCount++ <= MAX_CONNECTION_ATTEMPTS) { qDebug() << "refused, retrying"; emit progress(tr("Connecting refused, retrying (") + QString::number(_connectionAttemptsCount)+(")...")); this->sleep(1); _communicationManager->connectToHost(_configurationManager->serverHost(), _configurationManager->serverPort()); break; } } qDebug() << "Too many retries, giving up"; emit abort(tr("Connection refused by server (port : ") + QString::number( _configurationManager->serverPort()) + tr(") !")); delete _SSHProcess; exit(1); break; case QAbstractSocket::RemoteHostClosedError: if (_connectionAttemptsCount == INT_MAX) { _communicationManager->abort(); } else { if (_configurationManager->ssh()) { if (_connectionAttemptsCount++ <= MAX_CONNECTION_ATTEMPTS) { qDebug() << "closed, retrying"; emit progress(tr("Connecting closed, retrying (") + QString::number(_connectionAttemptsCount)+(")...")); _communicationManager->abort(); break; } } qDebug() << "Too many retries, giving up"; emit abort(tr("Server closed the connection !")); } delete _SSHProcess; exit(1); break; case QAbstractSocket::HostNotFoundError: emit abort(tr("Server not found (host name : ") + _configurationManager->serverHost() + tr(") !")); delete _SSHProcess; exit(1); break; default: emit abort(tr("Connection to server is broken !")); delete _SSHProcess; exit(1); } } void CommunicationThread::connectionSucceeded() { /* Connected at application level, do not try to reconnect on closure */ _connectionAttemptsCount = INT_MAX; } void CommunicationThread::connectionDisconnected() { if (_connectionAttemptsCount == INT_MAX) { /* Only raise to mainWindow if we had connected */ emit disconnected(); } else { /* Just closing for a retry, do retry */ qDebug() << "and retrying"; this->sleep(1); createNewCommunicationManager(); } } starpu-1.2.3+dfsg/starpu-top/communicationthread.h000066400000000000000000000036451320135501600223020ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef COMMUNICATIONTHREAD_H #define COMMUNICATIONTHREAD_H class MainWindow; class ConfigurationManager; class CommunicationManager; #include #include #include class CommunicationThread : public QThread { Q_OBJECT public: CommunicationThread( MainWindow *mainWindow, ConfigurationManager *configurationManager); ~CommunicationThread(); // Thread execution loop void run(); private: // Linked components MainWindow *_mainWindow; ConfigurationManager *_configurationManager; CommunicationManager *_communicationManager; QProcess * _SSHProcess; int _connectionAttemptsCount; void createNewCommunicationManager(void); private slots: void connectionError(QAbstractSocket::SocketError error); void connectionSucceeded(); void connectionDisconnected(); signals: void SocketError(QAbstractSocket::SocketError); void progress(QString message); void abort(QString message); void disconnected(); }; #endif // COMMUNICATIONTHREAD_H starpu-1.2.3+dfsg/starpu-top/config.h.in000066400000000000000000000017221320135501600201110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_TOP_CONFIG_H__ #define __STARPU_TOP_CONFIG_H__ /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the version of this package. */ #undef PACKAGE_VERSION #endif /* __STARPU_TOP_CONFIG_H__ */ starpu-1.2.3+dfsg/starpu-top/configurationmanager.cpp000066400000000000000000000061331320135501600227750ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "configurationmanager.h" #include ConfigurationManager::ConfigurationManager() { static bool instanciated = false; Q_ASSERT_X(instanciated == false, "ConfigurationManager's' constructor", "Singleton pattern violated - " "ConfigurationManager instanciated more than once"); qDebug() << "ConfigurationManager : initializing"; // Init settings _applicationSettings = new QSettings(CONFIG_FILE_DIR+"/"+CONFIG_FILE_NAME, QSettings::IniFormat); instanciated = true; } ConfigurationManager::~ConfigurationManager() { qDebug() << "ConfigurationManager : terminating"; delete _applicationSettings; } // Getters QString ConfigurationManager::serverHost() const { return _applicationSettings->value("connection/serverhost", QString("localhost")).toString(); } int ConfigurationManager::serverPort() const { return _applicationSettings->value("connection/serverport", 2011).toInt(); } bool ConfigurationManager::ssh() const { return _applicationSettings->value("connection/ssh", false).toBool(); } QString ConfigurationManager::commandLine() const { return _applicationSettings->value("connection/commandline", QString("ssh -L")).toString(); } bool ConfigurationManager::antialiasing() const { return _applicationSettings->value("display/antialiasing", true).toBool(); } // Setters void ConfigurationManager::setServerHost(QString serverIP) { _applicationSettings->setValue("connection/serverhost", serverIP); } void ConfigurationManager::setServerPort(int serverPort) { _applicationSettings->setValue("connection/serverport", serverPort); } void ConfigurationManager::setSSH(bool enabled) { _applicationSettings->setValue("connection/ssh", enabled); } void ConfigurationManager::setCommandLine(QString commandLine) { _applicationSettings->setValue("connection/commandline", commandLine); } void ConfigurationManager::setAntialiasing(bool enabled) { _applicationSettings->setValue("display/antialiasing", enabled); } // Other methods void ConfigurationManager::syncConfiguration() { qDebug() << "ConfigurationManager : synchronizing application settings"; _applicationSettings->sync(); } starpu-1.2.3+dfsg/starpu-top/configurationmanager.h000066400000000000000000000034331320135501600224420ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CONFIGURATIONMANAGER_H #define CONFIGURATIONMANAGER_H #include static const QString CONFIG_FILE_DIR = "."; static const QString CONFIG_FILE_NAME = "starpu_top.cfg"; class ConfigurationManager { /* Contains and manages all the application settings of the current instance, and remembers them for use in the next instances */ public: ConfigurationManager(); ~ConfigurationManager(); // Getters QString serverHost() const; int serverPort() const; bool ssh() const; QString commandLine() const; bool antialiasing() const; // Setters void setServerHost(QString serverIP); void setServerPort(int serverPort); void setSSH(bool enabled); void setCommandLine(QString commandLine); void setAntialiasing(bool enabled); // Other methods void syncConfiguration(); private: // Data QSettings *_applicationSettings; }; #endif // CONFIGURATIONMANAGER_H starpu-1.2.3+dfsg/starpu-top/dataaggregatorwidget.cpp000066400000000000000000000304341320135501600227540ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "dataaggregatorwidget.h" #include "mainwindow.h" #include "widgetwindowsmanager.h" #include "datawidget.h" #include "configurationmanager.h" #include #include #include #include #include #include #include DataAggregatorWidget::DataAggregatorWidget( WidgetWindowsManager *widgetWindowsManager, MainWindow *mainWindow, bool inside, QList dataIds) : AbstractWidgetWindow(widgetWindowsManager, mainWindow, inside) { // Init UI setWindowTitle(tr("Aggregator")); setWindowIcon(QIcon(":/images/widget.png")); // Buttons QToolBar *buttonsToolBar = new QToolBar(); // In/out button buttonsToolBar->addWidget(_inOutButton); // Add data button _addDataButton = new QToolButton(); _addDataButton->setIcon(QIcon(":/images/add.png")); _addDataButton->setPopupMode(QToolButton::InstantPopup); _addDataButton->setToolTip(tr("Add data source")); buttonsToolBar->addSeparator(); buttonsToolBar->addWidget(_addDataButton); // Remove data button _removeDataButton = new QToolButton(); _removeDataButton->setIcon(QIcon(":/images/remove.png")); _removeDataButton->setPopupMode(QToolButton::InstantPopup); _removeDataButton->setToolTip(tr("Remove data source")); buttonsToolBar->addWidget(_removeDataButton); // Set layout QVBoxLayout *layout = new QVBoxLayout(); setLayout(layout); layout->addWidget(buttonsToolBar); // Init actions for (int i = 0; i < _mainWindow->dataDescriptions()->count(); i++) { if (_mainWindow->dataDescriptions()->at(i)->type != DATA_TYPE_BOOL) { QAction *addDataAction = new QAction( _mainWindow->dataDescriptions()->at(i)->descriptionString, _addDataButton); addDataAction->setData(_mainWindow->dataDescriptions()->at(i)->id); QObject::connect(addDataAction, SIGNAL(triggered()), this, SLOT(dataAdded())); if (_mainWindow->dataDescriptions()->at(i)->widget == DATA_WIDGET_NONE) { addDataAction->setEnabled(false); } _addDataButton->addAction(addDataAction); } } // Init curve colors _curveColors.append(Qt::black); _curveColors.append(Qt::red); _curveColors.append(Qt::green); _curveColors.append(Qt::blue); _curveColors.append(Qt::magenta); _curveColors.append(Qt::yellow); _curveColors.append(Qt::gray); _curveColors.append(Qt::darkRed); _curveColors.append(Qt::darkGreen); _curveColors.append(Qt::darkBlue); _curveColors.append(Qt::darkCyan); _curveColors.append(Qt::darkMagenta); _curveColors.append(Qt::darkYellow); _curveColors.append(Qt::cyan); _colorIterator = new QListIterator (_curveColors); // Create internal widget createInternalWidget(); // Know when a data source is disabled / enabled QObject::connect(_mainWindow, SIGNAL(dataDisabled(int)), this, SLOT(disableData(int))); QObject::connect(_mainWindow, SIGNAL(dataEnabled(int)), this, SLOT(enableData(int))); // Init data if (dataIds.empty() == false) { for (int i = 0; i < dataIds.count(); i++) { addData(dataIds.at(i)); } } // Setup automatic cleanup QObject::connect(this, SIGNAL(destroyed()), _mainWindow, SLOT(removeDestroyedDataAggregatorWidgets())); qDebug() << "DataAggregatorWidget" << windowId() << ": initializing"; } DataAggregatorWidget::~DataAggregatorWidget() { delete _colorIterator; delete _addDataButton; delete _removeDataButton; delete _plot; qDebug() << "DataAggregatorWidget" << windowId() << ": terminating"; } void DataAggregatorWidget::closeEvent(QCloseEvent *ce) { ce->accept(); } void DataAggregatorWidget::createInternalWidget() { _plot = new QwtPlot(QwtText(tr("Aggregator"))); QwtLegend *legend = new QwtLegend; legend->setItemMode(QwtLegend::CheckableItem); _plot->insertLegend(legend, QwtPlot::BottomLegend); _plot->setMinimumSize(300, 200); _plot->setAttribute(Qt::WA_DeleteOnClose); layout()->addWidget(_plot); QObject::connect(_plot, SIGNAL(legendChecked(QwtPlotItem *, bool)), SLOT(curveChecked(QwtPlotItem *, bool))); } void DataAggregatorWidget::addData(int dataId) { DataWidget *dataWidget = _mainWindow->dataWidgetFromDataId(dataId); if (dataWidget != 0) { qDebug() << "Aggregator" << _windowId << ": adding new data of id" << dataId; switch (dataWidget->description()->type) { case DATA_TYPE_INT: { QObject::connect(dataWidget, SIGNAL(valueChanged(int,int)), this, SLOT(update(int,int))); break; } case DATA_TYPE_FLOAT: { QObject::connect(dataWidget, SIGNAL(valueChanged(double,int)), this, SLOT(update(double,int))); break; } default: qDebug() << "Aggregator" << _windowId << ": attempt to add data of unsupported type (id :" << dataId << ")"; } QwtPlotCurve *curve = new QwtPlotCurve( _mainWindow->dataDescriptionFromId(dataId)->descriptionString); if (_mainWindow->configurationManager()->antialiasing() == true) { curve->setRenderHint(QwtPlotItem::RenderAntialiased); } QColor c; if (_colorIterator->hasNext()) { c = _colorIterator->next(); c.setAlpha(150); curve->setPen(c); } _curves.insert(dataId, curve); CurveData curveData; curveData.xData = new QVector (); curveData.yData = new QVector (); _curvesData.insert(dataId, curveData); curve->attach(_plot); } else { qDebug() << "Aggregator" << _windowId << ": failed to add data of id" << dataId; } } void DataAggregatorWidget::removeData(int dataId) { DataWidget *dataWidget = _mainWindow->dataWidgetFromDataId(dataId); if (dataWidget != 0) { qDebug() << "Aggregator" << _windowId << ": removing data of id" << dataId; switch (dataWidget->description()->type) { case DATA_TYPE_INT: QObject::disconnect(dataWidget, SIGNAL(valueChanged(int,int)), this, SLOT(update(int,int))); break; case DATA_TYPE_FLOAT: QObject::disconnect(dataWidget, SIGNAL(valueChanged(double,int)), this, SLOT(update(double,int))); break; default: ; } _curves.value(dataId)->detach(); _curvesData.remove(dataId); _curves.remove(dataId); } else { qDebug() << "Aggregator" << _windowId << ": failed to remove data of id" << dataId; } } void DataAggregatorWidget::update(int value, int dataId) { qDebug() << "Aggregator" << _windowId << ": updating data of id" << dataId << "with value" << value; _curvesData.value(dataId).xData->append(_mainWindow ->effectiveRunningTime()); _curvesData.value(dataId).yData->append(value); #if QWT_VERSION >= 0x060000 _curves.value(dataId)->setRawSamples( _curvesData.value(dataId).xData->data(), _curvesData.value(dataId).yData->data(), _curvesData.value(dataId).xData->size()); #else # warning Old version of qwt being used, data aggregator will not work. #endif _plot->replot(); } void DataAggregatorWidget::update(double value, int dataId) { qDebug() << "Aggregator" << _windowId << ": updating data of id" << dataId << "with value" << value; _curvesData.value(dataId).xData->append(_mainWindow ->effectiveRunningTime()); _curvesData.value(dataId).yData->append(value); #if QWT_VERSION >= 0x060000 _curves.value(dataId)->setRawSamples( _curvesData.value(dataId).xData->data(), _curvesData.value(dataId).yData->data(), _curvesData.value(dataId).xData->size()); #else # warning Old version of qwt being used, data aggregator will not work. #endif _plot->replot(); } QSize DataAggregatorWidget::minimumInternalWidgetSize() const { return _plot->minimumSize(); } QList DataAggregatorWidget::aggregatedData() const { QList addedData; for (int i = 0; i < _curves.values().count(); i++) { addedData.append(_curves.key(_curves.values().at(i))); } return addedData; } void DataAggregatorWidget::curveChecked(QwtPlotItem *curve, bool checked) { curve->setVisible(!checked); } void DataAggregatorWidget::dataAdded() { QAction *action = (QAction*) QObject::sender(); int dataId = action->data().toInt(); _addDataButton->removeAction(action); addData(dataId); QAction *removeDataAction = new QAction( _mainWindow->dataDescriptionFromId(dataId)->descriptionString, _removeDataButton); removeDataAction->setData(dataId); QObject::connect(removeDataAction, SIGNAL(triggered()), this, SLOT(dataRemoved())); _removeDataButton->addAction(removeDataAction); } void DataAggregatorWidget::dataRemoved() { QAction *action = (QAction*) QObject::sender(); int dataId = action->data().toInt(); _removeDataButton->removeAction(action); removeData(dataId); QAction *addDataAction = new QAction( _mainWindow->dataDescriptionFromId(dataId)->descriptionString, _addDataButton); addDataAction->setData(dataId); QObject::connect(addDataAction, SIGNAL(triggered()), this, SLOT(dataAdded())); _addDataButton->addAction(addDataAction); } void DataAggregatorWidget::disableData(int dataId) { // Search the action on the add button for (int i = 0; i < _addDataButton->actions().count(); i++) { if (_addDataButton->actions().at(i)->data().toInt() == dataId) { _addDataButton->actions().at(i)->setEnabled(false); return; } } // If not found, it has already been added for (int i = 0; i < _removeDataButton->actions().count(); i++) { if (_removeDataButton->actions().at(i)->data().toInt() == dataId) { _removeDataButton->removeAction(_removeDataButton->actions().at(i)); removeData(dataId); QAction *action = new QAction( _mainWindow->dataDescriptionFromId(dataId) ->descriptionString, _addDataButton); action->setData(dataId); QObject::connect(action, SIGNAL(triggered()), this, SLOT(dataAdded())); action->setEnabled(false); _addDataButton->addAction(action); return; } } } void DataAggregatorWidget::enableData(int dataId) { // Search the action on the add button for (int i = 0; i < _addDataButton->actions().count(); i++) { if (_addDataButton->actions().at(i)->data().toInt() == dataId) { _addDataButton->actions().at(i)->setEnabled(true); return; } } } starpu-1.2.3+dfsg/starpu-top/dataaggregatorwidget.h000066400000000000000000000046411320135501600224220ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef DATAAGGREGATORWIDGET_H #define DATAAGGREGATORWIDGET_H class MainWindow; class WidgetWindowsManager; class QwtPlotItem; class QwtPlotCurve; class QwtPlot; #include #include #include "starpu_top_types.h" #include "abstractwidgetwindow.h" class DataAggregatorWidget : public AbstractWidgetWindow { /* Aggregates data from different data sources so they can be easily compared. Each data source is displayed as a curve in a plot widget. */ Q_OBJECT public: explicit DataAggregatorWidget( WidgetWindowsManager *widgetWindowsManager, MainWindow *mainWindow, bool inside = false, QList dataIds = QList()); ~DataAggregatorWidget(); // Getters QSize minimumInternalWidgetSize() const; QList aggregatedData() const; private: // Metadata // Curve colors QList _curveColors; QListIterator *_colorIterator; // Bound data descriptions QHash _curves; QHash _curvesData; // GUI components QToolButton *_addDataButton; QToolButton *_removeDataButton; QwtPlot *_plot; // Events void closeEvent(QCloseEvent *ce); public slots: void addData(int dataId); void removeData(int dataId); private slots: void createInternalWidget(); void update(int value, int dataId); void update(double value, int dataId); void curveChecked(QwtPlotItem *curve, bool checked); void dataAdded(); void dataRemoved(); void disableData(int dataId); void enableData(int dataId); }; #endif // DATAAGGREGATORWIDGET_H starpu-1.2.3+dfsg/starpu-top/datawidget.cpp000066400000000000000000000313651320135501600207150ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "datawidget.h" #include "mainwindow.h" #include "widgetwindowsmanager.h" #include "configurationmanager.h" #include #include #include #include #include #include #include "qledindicator/qledindicator.h" #include #include #include #include #include #include DataWidget::DataWidget(DataDescription *dataDescription, WidgetWindowsManager *widgetWindowsManager, MainWindow *mainWindow, bool inside) : AbstractWidgetWindow(widgetWindowsManager, mainWindow, inside) { _dataDescription = dataDescription; _internalWidget = 0; // For the plot widget _curve = 0; _curveData = 0; _dataWidgetNames = _mainWindow->dataWidgetNames(); _dataWidgetPossibilities = _mainWindow->dataWidgetPossibilities() ->value( _dataDescription->type).values(); // Init context menu actions QActionGroup *actionGroup = new QActionGroup(this); for (int i = 0; i < _dataWidgetPossibilities.count(); i++) { QAction *action = new QAction( _dataWidgetNames ->value(_dataWidgetPossibilities.at(i)), actionGroup); action->setCheckable(true); if (_dataWidgetPossibilities.at(i) == _dataDescription->widget) { action->setChecked(true); } QObject::connect(action, SIGNAL(triggered()), this, SLOT(widgetTypeChanged())); actionGroup->addAction(action); } addActions(actionGroup->actions()); // Set attributes setContextMenuPolicy(Qt::ActionsContextMenu); // Init GUI setWindowTitle(_dataDescription->descriptionString); setWindowIcon(QIcon(":/images/widget.png")); // Set layout QVBoxLayout *globalLayout = new QVBoxLayout(); setLayout(globalLayout); QHBoxLayout *topLayout = new QHBoxLayout(); topLayout->addWidget(_inOutButton); QString labelText = _dataDescription->descriptionString; if (_dataDescription->descriptionString.size() > 14) { labelText.truncate(12); labelText.append("..."); } QLabel *dataTitle = new QLabel(labelText); dataTitle->setToolTip(_dataDescription->descriptionString); topLayout->addWidget(dataTitle, 0, Qt::AlignHCenter); dataTitle->setFixedHeight(dataTitle->sizeHint().height()); globalLayout->addLayout(topLayout); // Create internal widget createInternalWidget(); setParent(0); // Needed if it is a flying window // Will be updated anyway if it goes into the MDI area // However the object HAS to be constructed with the main window as parent // so it can connect to its slots. // Setup automatic cleanup QObject::connect(this, SIGNAL(destroyed()), _mainWindow, SLOT(removeDestroyedDataWidgets())); qDebug() << "DataWidget : initializing [desc" << _dataDescription->descriptionString << "; id" << _dataDescription->id << "; type" << _dataDescription->type << "; min" << _dataDescription->valMin << "; max" << _dataDescription->valMax << "; widget" << _dataDescription->widget << "]"; } DataWidget::~DataWidget() { qDebug() << "DataWidget" << _dataDescription->id << ": terminating"; delete _internalWidget; } void DataWidget::closeEvent(QCloseEvent *ce) { if (isEnabled() == true) {// The widget is alive (session active) _mainWindow->updateDataWidgetType(_dataDescription->id, DATA_WIDGET_NONE); } ce->accept(); } void DataWidget::recreateInternalWidget() { if (_internalWidget != 0) { _internalWidget->close(); _internalWidget = 0; } createInternalWidget(); adjustSize(); if (isInside() == true) { parentWidget()->resize(minimumInternalWidgetSize() + QSize(85, 85)); } updateAction(_dataDescription->widget); } void DataWidget::updateAction(DataWidgetType newWidget) { for (int i = 0; i < actions().count(); i++) { if (actions().at(i)->text().compare(_dataWidgetNames->value(newWidget)) == 0) { actions().at(i)->setChecked(true); return; } } } void DataWidget::createInternalWidget() { qDebug() << "Creating the data widget for data id" << _dataDescription->id; switch (_dataDescription->widget) { case DATA_WIDGET_LCD: { _internalWidget = new QLCDNumber(this); _internalWidget->setMinimumSize(50, 50); break; } case DATA_WIDGET_PLOT: { _internalWidget = new QwtPlot(this); _curve = new QwtPlotCurve(_dataDescription->descriptionString); if (_mainWindow->configurationManager()->antialiasing() == true) { _curve->setRenderHint(QwtPlotItem::RenderAntialiased); } _curve->attach((QwtPlot*) _internalWidget); _curveData = new CurveData; _curveData->xData = new QVector (); _curveData->yData = new QVector (); _internalWidget->setMinimumSize(300, 200); break; } case DATA_WIDGET_LEVEL: { _internalWidget = new QwtThermo(this); QwtThermo *widget = (QwtThermo*) _internalWidget; widget->setRange(_dataDescription->valMin, _dataDescription->valMax); _internalWidget->setMinimumSize(100, 200); break; } case DATA_WIDGET_LED: { _internalWidget = new QLedIndicator(this); _internalWidget->setMinimumSize(50, 50); break; } case DATA_WIDGET_DIAL: { _internalWidget = new QwtDial(this); _internalWidget->setMinimumSize(250, 250); QwtDial *widget = (QwtDial*) _internalWidget; widget->setReadOnly(true); widget->setWrapping(false); widget->setOrigin(135.0); widget->setRange(_dataDescription->valMin, _dataDescription->valMax); widget->setScaleArc(0.0, 270.0); widget->scaleDraw()->setSpacing(8); QwtDialSimpleNeedle *needle = new QwtDialSimpleNeedle( QwtDialSimpleNeedle::Arrow, true, Qt::red, QColor(Qt::gray).light(130)); widget->setNeedle(needle); widget->setScaleOptions(QwtDial::ScaleTicks | QwtDial::ScaleLabel); widget->setScaleTicks(0, 4, 8); } default: ; } _internalWidget->setAttribute(Qt::WA_DeleteOnClose); layout()->addWidget(_internalWidget); } /* -------------------------------------------------------------------------- */ /* Getters */ /* -------------------------------------------------------------------------- */ DataDescription *DataWidget::description() const { return _dataDescription; } QSize DataWidget::minimumInternalWidgetSize() const { return _internalWidget->minimumSize(); } /* -------------------------------------------------------------------------- */ /* Setters */ /* -------------------------------------------------------------------------- */ void DataWidget::setValue(bool value) { switch (_dataDescription->widget) { case DATA_WIDGET_LED: { QLedIndicator *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setChecked(value); } else { qDebug() << "Bad data widget cast (DataWidget::setValue()) !"; } break; } default: ; } emit valueChanged(value, _dataDescription->id); } void DataWidget::setValue(int value) { switch (_dataDescription->widget) { case DATA_WIDGET_PLOT: { QwtPlot *widget = qobject_cast (_internalWidget); if (widget != 0) { _curveData->xData->append(_mainWindow->effectiveRunningTime()); _curveData->yData->append(value); #if QWT_VERSION >= 0x060000 _curve->setRawSamples(_curveData->xData->data(), _curveData->yData->data(), _curveData->xData->size()); #else # warning Old version of qwt being used, data aggregator will not work. #endif widget->replot(); } else { qDebug() << "Bad data widget cast (DataWidget::setValue()) !"; } break; } case DATA_WIDGET_LCD: { QLCDNumber *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->display(value); } else { qDebug() << "Bad data widget cast (DataWidget::setValue()) !"; } break; } case DATA_WIDGET_LEVEL: { QwtThermo *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad data widget cast (DataWidget::setValue()) !"; } break; } case DATA_WIDGET_DIAL: { QwtDial *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad data widget cast (DataWidget::setValue()) !"; } break; } default: ; } emit valueChanged(value, _dataDescription->id); } void DataWidget::setValue(double value) { switch (_dataDescription->widget) { case DATA_WIDGET_PLOT: { QwtPlot *widget = qobject_cast (_internalWidget); if (widget != 0) { _curveData->xData->append(_mainWindow->effectiveRunningTime()); _curveData->yData->append(value); #if QWT_VERSION >= 0x060000 _curve->setRawSamples(_curveData->xData->data(), _curveData->yData->data(), _curveData->xData->size()); #else # warning Old version of qwt being used, data aggregator will not work. #endif widget->replot(); } else { qDebug() << "Bad data widget cast (DataWidget::setValue()) !"; } break; } case DATA_WIDGET_LCD: { QLCDNumber *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->display(value); } else { qDebug() << "Bad data widget cast (DataWidget::setValue()) !"; } break; } case DATA_WIDGET_LEVEL: { QwtThermo *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad data widget cast (DataWidget::setValue()) !"; } break; } case DATA_WIDGET_DIAL: { QwtDial *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad data widget cast (DataWidget::setValue()) !"; } break; } default: ; } emit valueChanged(value, _dataDescription->id); } void DataWidget::widgetTypeChanged() { QAction *action = (QAction*) QObject::sender(); if(_dataDescription->widget != _dataWidgetNames->key(action->text())) { _mainWindow->updateDataWidgetType(_dataDescription->id, _dataWidgetNames->key(action->text())); } } starpu-1.2.3+dfsg/starpu-top/datawidget.h000066400000000000000000000045431320135501600203600ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef DATAWIDGET_H #define DATAWIDGET_H class MainWindow; class WidgetWindowsManager; class QwtPlotCurve; class QwtPlot; #include "starpu_top_types.h" #include "abstractwidgetwindow.h" class DataWidget : public AbstractWidgetWindow { /* Displays a single type of data in an internal widget, under different forms defined by the data widget specifications. The internal widget can be changed at any time. */ Q_OBJECT public: explicit DataWidget( DataDescription *dataDescription, WidgetWindowsManager *widgetWindowManager, MainWindow *mainWindow, bool inside = false); ~DataWidget(); // Getters DataDescription *description() const; QSize minimumInternalWidgetSize() const; private: // Events void closeEvent(QCloseEvent *ce); // Metadata DataDescription *_dataDescription; const QHash *_dataWidgetNames; QList _dataWidgetPossibilities; // GUI components QWidget *_internalWidget; QwtPlotCurve *_curve; CurveData *_curveData; public slots: // Setters void setValue(bool value); void setValue(int value); void setValue(double value); // Other methods void recreateInternalWidget(); private slots: void createInternalWidget(); void widgetTypeChanged(); void updateAction(DataWidgetType newWidget); signals: void valueChanged(bool value, int dataId); void valueChanged(int value, int dataId); void valueChanged(double value, int dataId); }; #endif // DATAWIDGET_H starpu-1.2.3+dfsg/starpu-top/debugconsole.cpp000066400000000000000000000031331320135501600212410ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "debugconsole.h" #include "ui_debugconsole.h" DebugConsole::DebugConsole(QWidget *parent) : QWidget(parent), ui(new Ui::DebugConsole) { ui->setupUi(this); ui->stepButton->setEnabled(false); QObject::connect(ui->stepButton, SIGNAL(clicked()), this, SLOT(step())); } DebugConsole::~DebugConsole() { delete ui; } void DebugConsole::appendDebugLogMessage(QString debugMessage) { ui->console->append("INFO : " + debugMessage); } void DebugConsole::appendDebugLockMessage(QString lockMessage) { ui->stepButton->setEnabled(true); ui->console->append("LOCK : " + lockMessage); } void DebugConsole::clearConsole() { ui->console->clear(); } void DebugConsole::step() { ui->stepButton->setEnabled(false); emit stepped(); } starpu-1.2.3+dfsg/starpu-top/debugconsole.h000066400000000000000000000027431320135501600207140ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef DEBUGCONSOLE_H #define DEBUGCONSOLE_H #include namespace Ui { class DebugConsole; } class DebugConsole : public QWidget { Q_OBJECT public: explicit DebugConsole(QWidget *parent); ~DebugConsole(); // Display debug message void appendDebugLogMessage(QString debugMessage); void appendDebugLockMessage(QString lockMessage); // Clear console void clearConsole(); private: // GUI components Ui::DebugConsole *ui; private slots: // Perform a debug step (unlock) void step(); signals: // Step performed void stepped(); }; #endif // DEBUGCONSOLE_H starpu-1.2.3+dfsg/starpu-top/debugconsole.ui000066400000000000000000000016731320135501600211030ustar00rootroot00000000000000 DebugConsole 0 0 710 50 500 50 Form true Step starpu-1.2.3+dfsg/starpu-top/extradist000066400000000000000000000225621320135501600200250ustar00rootroot00000000000000EXTRA_DIST += \ starpu-top/extradist \ starpu-top/configurationmanager.h \ starpu-top/taskmanager.cpp \ starpu-top/aboutdialog.cpp \ starpu-top/aboutdialog.h \ starpu-top/widgetwindowsmanager.cpp \ starpu-top/widgetwindowsmanager.h \ starpu-top/abstractwidgetwindow.cpp \ starpu-top/communicationthread.h \ starpu-top/configurationmanager.cpp \ starpu-top/starpu_top_types.h \ starpu-top/mainwindow.ui \ starpu-top/mainwindow.cpp \ starpu-top/sessionsetupmanager.cpp \ starpu-top/resources.qrc \ starpu-top/images \ starpu-top/images/connect.png \ starpu-top/images/debugon.png \ starpu-top/images/help.png \ starpu-top/images/starpu_top.png \ starpu-top/images/widget.png \ starpu-top/images/lock.png \ starpu-top/images/about.png \ starpu-top/images/add.png \ starpu-top/images/preferences.png \ starpu-top/images/outside.png \ starpu-top/images/inside.png \ starpu-top/images/quit.png \ starpu-top/images/remove.png \ starpu-top/images/play.png \ starpu-top/images/windows.png \ starpu-top/images/debugoff.png \ starpu-top/abstractwidgetwindow.h \ starpu-top/interactivewidget.h \ starpu-top/main.cpp \ starpu-top/debugconsole.h \ starpu-top/TODO.txt \ starpu-top/StarPU-Top-qwt-embed.pri \ starpu-top/qledindicator \ starpu-top/qledindicator/qledindicator.cpp \ starpu-top/qledindicator/qledindicator.h \ starpu-top/communicationthread.cpp \ starpu-top/debugconsole.ui \ starpu-top/dataaggregatorwidget.cpp \ starpu-top/datawidget.cpp \ starpu-top/datawidget.h \ starpu-top/debugconsole.cpp \ starpu-top/ganttwidget.h \ starpu-top/mainwindow.h \ starpu-top/ganttwidget.cpp \ starpu-top/qwt \ starpu-top/qwt/qwt_spline.cpp \ starpu-top/qwt/qwt_double_range.h \ starpu-top/qwt/qwt_plot_curve.cpp \ starpu-top/qwt/qwt_math.h \ starpu-top/qwt/qwt_scale_draw.cpp \ starpu-top/qwt/qwt_slider.h \ starpu-top/qwt/qwt_interval.h \ starpu-top/qwt/qwt_thermo.h \ starpu-top/qwt/qwt_text_label.h \ starpu-top/qwt/qwt_series_data.h \ starpu-top/qwt/qwt_plot_curve.h \ starpu-top/qwt/qwt_knob.h \ starpu-top/qwt/qwt_plot_seriesitem.h \ starpu-top/qwt/qwt_painter.h \ starpu-top/qwt/qwt_dial.cpp \ starpu-top/qwt/qwt_scale_map.cpp \ starpu-top/qwt/qwt_global.h \ starpu-top/qwt/qwt_double_range.cpp \ starpu-top/qwt/qwt_point_polar.h \ starpu-top/qwt/qwt_painter.cpp \ starpu-top/qwt/qwt_abstract_scale.cpp \ starpu-top/qwt/qwt_plot_dict.cpp \ starpu-top/qwt/qwt_series_data.cpp \ starpu-top/qwt/qwt_wheel.h \ starpu-top/qwt/qwt_plot_seriesitem.cpp \ starpu-top/qwt/qwt_abstract_scale_draw.h \ starpu-top/qwt/qwt_symbol.h \ starpu-top/qwt/qwt_text_engine.cpp \ starpu-top/qwt/qwt_plot_layout.cpp \ starpu-top/qwt/qwt_round_scale_draw.cpp \ starpu-top/qwt/qwt_plot.cpp \ starpu-top/qwt/qwt_clipper.cpp \ starpu-top/qwt/qwt_clipper.h \ starpu-top/qwt/qwt_point_3d.cpp \ starpu-top/qwt/qwt_legend.cpp \ starpu-top/qwt/qwt_scale_widget.h \ starpu-top/qwt/qwt_interval.cpp \ starpu-top/qwt/qwt_scale_draw.h \ starpu-top/qwt/qwt_plot_dict.h \ starpu-top/qwt/qwt_text.cpp \ starpu-top/qwt/qwt_scale_widget.cpp \ starpu-top/qwt/qwt_legend_item.cpp \ starpu-top/qwt/qwt_abstract_scale.h \ starpu-top/qwt/qwt_spline.h \ starpu-top/qwt/qwt_plot_canvas.h \ starpu-top/qwt/qwt_color_map.cpp \ starpu-top/qwt/qwt_dial_needle.h \ starpu-top/qwt/qwt_scale_map.h \ starpu-top/qwt/qwt_legend_item.h \ starpu-top/qwt/qwt_legend_itemmanager.h \ starpu-top/qwt/qwt_curve_fitter.h \ starpu-top/qwt/qwt_dyngrid_layout.cpp \ starpu-top/qwt/qwt_color_map.h \ starpu-top/qwt/qwt_scale_div.h \ starpu-top/qwt/qwt_plot_xml.cpp \ starpu-top/qwt/qwt_round_scale_draw.h \ starpu-top/qwt/qwt_text_engine.h \ starpu-top/qwt/qwt_dial.h \ starpu-top/qwt/qwt_dyngrid_layout.h \ starpu-top/qwt/qwt_plot_item.cpp \ starpu-top/qwt/qwt_curve_fitter.cpp \ starpu-top/qwt/qwt_dial_needle.cpp \ starpu-top/qwt/qwt_plot_item.h \ starpu-top/qwt/qwt_plot_axis.cpp \ starpu-top/qwt/qwt_slider.cpp \ starpu-top/qwt/qwt_text_label.cpp \ starpu-top/qwt/qwt_abstract_slider.h \ starpu-top/qwt/qwt_math.cpp \ starpu-top/qwt/qwt_abstract_slider.cpp \ starpu-top/qwt/qwt_plot_canvas.cpp \ starpu-top/qwt/qwt_thermo.cpp \ starpu-top/qwt/qwt_point_3d.h \ starpu-top/qwt/qwt_abstract_scale_draw.cpp \ starpu-top/qwt/qwt_plot_layout.h \ starpu-top/qwt/qwt_symbol.cpp \ starpu-top/qwt/qwt_plot.h \ starpu-top/qwt/qwt_text.h \ starpu-top/qwt/qwt_wheel.cpp \ starpu-top/qwt/qwt_point_polar.cpp \ starpu-top/qwt/qwt_scale_engine.h \ starpu-top/qwt/qwt_scale_engine.cpp \ starpu-top/qwt/qwt_scale_div.cpp \ starpu-top/qwt/qwt_knob.cpp \ starpu-top/qwt/qwt_legend.h \ starpu-top/taskmanager.h \ starpu-top/preferencesdialog.cpp \ starpu-top/communicationmanager.h \ starpu-top/aboutdialog.ui \ starpu-top/StarPU-Top-qwt-system.pri \ starpu-top/StarPU-Top.pro.user \ starpu-top/communicationmanager.cpp \ starpu-top/interactivewidget.cpp \ starpu-top/preferencesdialog.ui \ starpu-top/sessionsetupmanager.h \ starpu-top/StarPU-Top.pro.user.1.3 \ starpu-top/StarPU-Top-common.pri \ starpu-top/dataaggregatorwidget.h \ starpu-top/preferencesdialog.h \ starpu-top/StarPU-Top.pro.in starpu-1.2.3+dfsg/starpu-top/ganttwidget.cpp000066400000000000000000000637561320135501600211320ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "ganttwidget.h" #include "mainwindow.h" #include "taskmanager.h" #include #include #include #include const int MAX_CPU_NUM = 6; const int MAX_GPU_NUM = 3; const int MARGIN = 5; const int DEFAULT_TIME_TOTAL = 20000; const int HEIGHT_TIME_AXIS = 20; const int WIDTH_GLOBAL_PU = 50; // Width of the big CPU rect const int WIDTH_PROGRAM = 50; const int WIDTH_PU = 70; const int GRAD_NUM = 5; // Number of gradations between each label const int WIDTH_PRESENT_LINE = 1; const int SIGNIF_NUM = 100; const int FIRST_THRESHOLD = 25; const int SECOND_THRESHOLD = 75; const int SHIFT_LEFT_TIME_AXIS = 3; const int SHIFT_TOP_TIME_AXIS = 3; const QColor GANTT_BACKGROUND_COLOR = Qt::gray; const QFont::StyleHint GANTT_TEXT_FONT = QFont::Times; const QColor GANTT_TEXT_COLOR = Qt::white; const QColor GANTT_PU_COLOR = Qt::blue; const QColor GANTT_TIMELINE_COLOR = Qt::blue; const QColor GANTT_PRESENTLINE_COLOR = Qt::black; const QColor GANTT_IDLE_COLOR = Qt::red; const QColor GANTT_WORKING_COLOR = Qt::green; const QColor GANTT_PREV_COLOR = Qt::yellow; GanttWidget::GanttWidget(MainWindow *mainWindow, TaskManager *taskManager) : QGLWidget(QGLFormat(QGL::SampleBuffers), mainWindow) { _mainWindow = mainWindow; _taskManager = taskManager; setAutoFillBackground(false); _background = QBrush(GANTT_BACKGROUND_COLOR); _textPen = QPen(GANTT_TEXT_COLOR); _textFont.setPixelSize(50); _textFont.setStyleHint(GANTT_TEXT_FONT); _coordxPresentLine = 0; _numPUs = 0; _wasRunning = false; _timeTotal = DEFAULT_TIME_TOTAL; _timeBefore = _timeTotal * 0.66; _timeAfter = _timeTotal * 0.34; _lastValPrevLine = 66; _timePresent = 0; _timeToShow = 0; _numCPUs = 0; _numGPUs = 0; _heightPU = 0; _initCompleted = false; _PUsByDevice = 0; _PUsByPos = 0; // Start display update timer _timer = new QTimer(this); _timer->start(35); // Connect events QObject::connect(_mainWindow, SIGNAL(sessionOpened()), this, SLOT(connected())); QObject::connect(_mainWindow, SIGNAL(sessionClosed()), this, SLOT(disconnected())); QObject::connect(_mainWindow, SIGNAL(debugLocked()), this, SLOT(ganttLocked())); QObject::connect(_mainWindow, SIGNAL(debugStepped()), this, SLOT(ganttUnlocked())); QObject::connect(_timer, SIGNAL(timeout()), this, SLOT(update())); } GanttWidget::~GanttWidget() { delete _timer; delete _rectPUs; } void GanttWidget::defaultScreen(QPainter *painter) { painter->setPen(GANTT_TEXT_COLOR); drawPresentLine(painter); drawTime(painter); } // Called each time the window is resized void GanttWidget::resizeGL(int width, int height) { update(); } void GanttWidget::paintEvent(QPaintEvent *event) { QPainter painter; painter.begin(this); painter.setRenderHint(QPainter::Antialiasing); paint(&painter, event); painter.end(); } /* Draw CPU and GPU rects */ void GanttWidget::drawPUs(QPainter *painter) { QFont f; QPen penRect; QPen penText; QPointF coordTxt; QString txt; QStaticText name; f.setFamily("utf8"); f.setWeight(QFont::Bold); f.setPixelSize(12); painter->setFont(f); penRect.setColor(GANTT_PU_COLOR); penText.setColor(GANTT_TEXT_COLOR); painter->setPen(penRect); _rectPUs = new QRectF[_numCPUs + _numGPUs]; int height_allowed = size().height() - HEIGHT_TIME_AXIS - MARGIN; // height of each processor unit rectangles int height = height_allowed / (_numCPUs + _numGPUs); _heightPU = height; int height_cpublock = height * _numCPUs; int height_gpublock = height * _numGPUs; /* The CPUs rect */ if (_numCPUs > 0) { _rectCPUblock = QRectF(WIDTH_PROGRAM + MARGIN, HEIGHT_TIME_AXIS + MARGIN, WIDTH_GLOBAL_PU, height_cpublock - MARGIN); painter->drawRect(_rectCPUblock); painter->fillRect(_rectCPUblock, GANTT_PU_COLOR); painter->setPen(penText); coordTxt = QPointF( _rectCPUblock.center().rx() - (WIDTH_GLOBAL_PU / 2) + 3, _rectCPUblock.center().ry() - f.pixelSize()); txt = QString("CPU(s)"); name = QStaticText(txt); name.setPerformanceHint(QStaticText::AggressiveCaching); painter->drawStaticText(coordTxt, name); } f.setWeight(QFont::Light); f.setPixelSize(10); painter->setFont(f); painter->setPen(penRect); /* devices */ for (int i = 0; i < _numCPUs + _numGPUs; i++) { painter->setPen(penRect); _rectPUs[i] = QRectF(WIDTH_PROGRAM + MARGIN + WIDTH_GLOBAL_PU + MARGIN, HEIGHT_TIME_AXIS + MARGIN + i * height, WIDTH_PU, height - MARGIN); painter->drawRect(_rectPUs[i]); painter->fillRect(_rectPUs[i], Qt::blue); painter->setPen(penText); if (_heightPU >= f.pixelSize() * 2) { painter->drawText(_rectPUs[i], Qt::AlignVCenter, _PUsByPos[i].name); } } f.setFamily("utf8"); f.setWeight(QFont::Bold); f.setPixelSize(12); painter->setFont(f); painter->setPen(penRect); /* The GPUs rect */ if (_numGPUs > 0) { _rectGPUblock = QRectF(WIDTH_PROGRAM + MARGIN, HEIGHT_TIME_AXIS + MARGIN + height_cpublock, WIDTH_GLOBAL_PU, height_gpublock - MARGIN); painter->drawRect(_rectGPUblock); painter->fillRect(_rectGPUblock, Qt::blue); coordTxt = QPointF( _rectGPUblock.center().rx() - (WIDTH_GLOBAL_PU / 2) + 3, _rectGPUblock.center().ry() - f.pixelSize()); txt = QString("GPU(s)"); name = QStaticText(txt); name.setPerformanceHint(QStaticText::AggressiveCaching); painter->setPen(penText); painter->drawStaticText(coordTxt, name); } } /* calculate abscissa on the screen for a given time (in ms) if it's displayable return -1 if timestampMs is outside time displayable because of scale*/ qreal GanttWidget::coordxForTime(qlonglong timestampMs) { qreal startx = (qreal) WIDTH_PROGRAM + MARGIN + WIDTH_GLOBAL_PU + MARGIN + WIDTH_PU + MARGIN; qreal widthAllowed = (qreal) size().width() - startx; qreal scale = (qreal) widthAllowed / _timeTotal; qreal coordx = -1; if (timestampMs >= 0) { if ((timestampMs <= _timePresent) && (timestampMs >= (_timePresent - _timeBefore))) { coordx = (qreal) startx + (qreal)( (_timeBefore - (_timePresent - timestampMs)) * scale); } else if ((timestampMs > _timePresent) && timestampMs <= (_timeAfter + _timePresent)) { coordx = (qreal) _coordxPresentLine + (qreal)( (timestampMs - _timePresent) * scale); } } return coordx; } void GanttWidget::drawTime(QPainter *painter) { QFont f; QPen penRect; QPen penText; penRect.setColor(GANTT_TIMELINE_COLOR); penText.setColor(GANTT_TEXT_COLOR); painter->setPen(penRect); f.setFamily("utf8"); f.setWeight(QFont::DemiBold); f.setPixelSize(10); painter->setFont(f); _rectTime = QRectF(0, 0, size().width(), 20); painter->drawRect(_rectTime); painter->fillRect(_rectTime, Qt::blue); QString titre = QString("Time (ms)"); QStaticText titreTxt = QStaticText(titre); titreTxt.setPerformanceHint(QStaticText::AggressiveCaching); QPointF coordRect = QPointF(_rectTime.left() + SHIFT_LEFT_TIME_AXIS, _rectTime.center().ry() - f.pixelSize() + SHIFT_TOP_TIME_AXIS); painter->setPen(penText); painter->drawStaticText(coordRect, titreTxt); f.setWeight(QFont::Light); f.setPixelSize(10); painter->setFont(f); qreal ourStartx = WIDTH_PROGRAM + MARGIN + WIDTH_GLOBAL_PU + MARGIN + WIDTH_PU + MARGIN; qreal widthAvailable = ((qreal)(size().width() - ourStartx)); qreal scale = ((qreal)(_timeBefore + _timeAfter) / widthAvailable); qreal scale_time_px = (qreal) widthAvailable / (_timeBefore + _timeAfter); int timeInterval = computeTimeInterval(_timeTotal); qreal sizeInterval = ((qreal)(timeInterval * scale_time_px)); qreal step_x = (qreal)(sizeInterval / GRAD_NUM); //we calculate the location of the next gradation in the future part qlonglong first = _timePresent - _timePresent % ((qlonglong) timeInterval); qlonglong cur_t = first; //gradations in the past while (cur_t > _timePresent - _timeBefore) { if (cur_t >= (qlonglong) 0) { qreal cur_x = ((qreal)((_timeBefore - (_timePresent - cur_t)) / scale) + ourStartx); QString buffer; buffer.append(QString("%1").arg(cur_t)); QStaticText gradTxt = QStaticText(buffer); gradTxt.setPerformanceHint(QStaticText::AggressiveCaching); //calculate the fading int fading = 3 * (cur_x - ourStartx); if (fading < 0) { fading = 0; } if (fading > 255) { fading = 255; } _textPen.setColor(QColor(255, 255, 255, fading)); painter->setPen(_textPen); painter->drawLine( QLineF(cur_x, 0, cur_x, HEIGHT_TIME_AXIS - MARGIN)); if (widthAvailable > 500) { painter->drawStaticText( QPointF(cur_x, HEIGHT_TIME_AXIS - MARGIN - f.pixelSize()), gradTxt); } for (int k = 1; k < GRAD_NUM; k++) { // k=1 ,because of spans painter->drawLine( QLineF(cur_x + step_x * k, 0, cur_x + step_x * k, HEIGHT_TIME_AXIS - MARGIN * 3)); } } cur_t -= timeInterval; } //in the future cur_t = first + timeInterval; while (cur_t < _timePresent + _timeAfter) { qreal cur_x = ((qreal)((_timeBefore - (_timePresent - cur_t)) / scale) + ourStartx); QString buffer; buffer.append(QString("%1").arg(cur_t)); QStaticText gradTxt = QStaticText(buffer); gradTxt.setPerformanceHint(QStaticText::AggressiveCaching); //calculate the fading int fading = 3 * (size().width() - cur_x); if (fading > 255) { fading = 255; } _textPen.setColor(QColor(255, 255, 255, fading)); painter->setPen(_textPen); painter->drawLine(QLineF(cur_x, 0, cur_x, HEIGHT_TIME_AXIS - MARGIN)); if (widthAvailable > 500) { painter->drawStaticText( QPointF(cur_x, HEIGHT_TIME_AXIS - MARGIN - f.pixelSize()), gradTxt); } for (int k = 1; k < GRAD_NUM; k++) { painter->drawLine( QLineF(cur_x + step_x * k, 0, cur_x + step_x * k, HEIGHT_TIME_AXIS - MARGIN * 3)); } cur_t += timeInterval; } _textPen.setColor(QColor(255, 255, 255)); painter->setPen(_textPen); } //calculate un lapse of time to get at least 20 gradations if 1000 <= timeTotal //and <=24 * 10^X int GanttWidget::computeTimeInterval(int timeTotal) { int coef = 1; while (timeTotal >= SIGNIF_NUM) { timeTotal = timeTotal / 10; coef *= 10; } //we have a number between 1 and 99 if (timeTotal < FIRST_THRESHOLD) { return coef; } else if (timeTotal < SECOND_THRESHOLD) { return coef * 5; } else { return coef * 10; } } void GanttWidget::drawProgram(QPainter *painter) { QFont f; QPen penRect; QPen penText; penRect.setColor(GANTT_PU_COLOR); penText.setColor(GANTT_TEXT_COLOR); f.setFamily("utf8"); f.setWeight(QFont::Black); f.setPixelSize(10); painter->setFont(f); painter->setPen(penRect); _rectProg = QRectF(0, HEIGHT_TIME_AXIS + MARGIN, WIDTH_PROGRAM, size().height() - HEIGHT_TIME_AXIS - MARGIN * 2); painter->drawRect(_rectProg); painter->fillRect(_rectProg, Qt::blue); QPointF coordTxt = QPointF( _rectProg.center().rx() - (WIDTH_PROGRAM / 2) + 3, _rectProg.center().ry() - f.pixelSize()); QString txt = QString("Program"); QStaticText name = QStaticText(txt); name.setPerformanceHint(QStaticText::AggressiveCaching); painter->setPen(penText); painter->drawStaticText(coordTxt, name); } void GanttWidget::drawPresentLine(QPainter *painter) { QPen pen; pen.setColor(GANTT_PRESENTLINE_COLOR); painter->setPen(pen); qreal widthAllowed = (qreal)( size().width() - WIDTH_PROGRAM - MARGIN - WIDTH_GLOBAL_PU - MARGIN - WIDTH_PU - MARGIN); int timeTotal = _timeBefore + _timeAfter; int x, y, w, h; x = WIDTH_PROGRAM + MARGIN + WIDTH_GLOBAL_PU + MARGIN + WIDTH_PU + MARGIN; y = (HEIGHT_TIME_AXIS + MARGIN); w = WIDTH_PRESENT_LINE; h = size().height() - (HEIGHT_TIME_AXIS + MARGIN); qreal scale = (qreal)(widthAllowed / timeTotal); qreal gap_x = (qreal)(scale * _timeBefore); _linePresent = QRectF(x + gap_x, y, w, h); _coordxPresentLine = (qreal)(x + gap_x); painter->drawRect(_linePresent); painter->fillRect(_linePresent, Qt::black); } /* Draw whole gantt diagram depending on time showing line present location. Useful to draw the diagram after the complete execution. */ void GanttWidget::drawFromTime(QPainter *painter, qlonglong timestamp) { Q_ASSERT_X(timestamp >= 0, "GanttWidget::drawFromTime", "Negative timestamp !"); /* program rect */ drawProgram(painter); _timePresent = timestamp; /* time line */ drawTime(painter); drawPUs(painter); /* Tasks */ drawIdlePU(painter); qlonglong borneBefore = _timePresent - _timeBefore; if (borneBefore < 0) { borneBefore = 0; } _tasks = _taskManager->tasks(borneBefore, _timePresent); foreach(starpu_top_task t, _tasks) { drawWorkPU(painter,t); } } /* draw idle time for each processor */ void GanttWidget::drawIdlePU(QPainter *painter) { int starty = HEIGHT_TIME_AXIS + MARGIN; int widthAllowed = size().width() - WIDTH_PROGRAM - MARGIN - WIDTH_GLOBAL_PU - MARGIN - WIDTH_PU - MARGIN; int timeTotal = _timeBefore + _timeAfter; qreal posBlockx = 0; qreal placeTime = 0; bool isStartx = false; qreal scale = (qreal) widthAllowed / timeTotal; QRectF rectIdle; qlonglong timestampS = 0; if (_timePresent >= _timeBefore) { timestampS = _timePresent - _timeBefore; } /* drawIdlePu */ for (qlonglong j = timestampS; j < _timePresent; j++) { if (!isStartx) { isStartx = true; posBlockx = coordxForTime(j); } placeTime++; } QFont f; QPen pen; f.setFamily("utf8"); f.setWeight(QFont::DemiBold); f.setPixelSize(10); painter->setFont(f); pen.setColor(GANTT_IDLE_COLOR.lighter(110)); painter->setPen(pen); for (int i = 0; i < _numPUs; i++) { rectIdle = QRectF(posBlockx, starty + (_heightPU) * i, placeTime * scale, (_heightPU - MARGIN)); painter->drawRect(rectIdle); painter->fillRect(rectIdle, GANTT_IDLE_COLOR); } } /* draw forecasted working time for each processor */ void GanttWidget::drawPrevWorkPU(QPainter *painter, starpu_top_task t) { int starty = HEIGHT_TIME_AXIS + MARGIN; int widthAllowed = size().width() - WIDTH_PROGRAM - MARGIN - WIDTH_GLOBAL_PU - MARGIN - WIDTH_PU - MARGIN; qreal posBlockx = 0; qreal placeTime = 0; bool isStartx = false; qreal scale = (qreal) widthAllowed / _timeTotal; QRectF rectForecast; //either the beginning is in the Future Part //( timeAfter ) or either in the Past Part (timeBefore) qlonglong timestampS = (t.timestampStart - _timePresent); if (timestampS > 0) { // the beginning is in the Future part (displayable here) timestampS = t.timestampStart; } else { // the beginning is in the Past part (not displayable here) timestampS = _timePresent; // +1 just to be sure we don't draw over the line of Present posBlockx = _coordxPresentLine + WIDTH_PRESENT_LINE + 1; isStartx = true; placeTime -= WIDTH_PRESENT_LINE + 1; } qlonglong timestampE = (t.timestampEnd - _timePresent); if (timestampE > 0) { if (timestampE <= _timeAfter) { timestampE = t.timestampEnd; // the end is displayable } else { // the end is not displayable because it's in the future // more than timePresent + timeAfter timestampE = _timePresent + _timeAfter; } } else { // the end is not displayable because it's in the past timestampE = _timePresent; posBlockx = _coordxPresentLine + WIDTH_PRESENT_LINE + 1; isStartx = true; placeTime -= WIDTH_PRESENT_LINE + 1; } /* Future */ for (qlonglong i = timestampS; i <= timestampE; i++) { if (!isStartx) { isStartx = true; posBlockx = coordxForTime(i); } placeTime++; } int pos = _PUsByDevice[t.deviceId].id; QFont f; QPen pen; pen.setColor(GANTT_TEXT_COLOR); painter->setPen(pen); f.setFamily("utf8"); f.setWeight(QFont::DemiBold); f.setPixelSize(10); painter->setFont(f); QLinearGradient gradient(posBlockx, starty + (_heightPU) * pos + (_heightPU - MARGIN) / 2, posBlockx + placeTime * scale, starty + (_heightPU) * pos + (_heightPU - MARGIN) / 2); QColor prevColor = GANTT_PREV_COLOR; gradient.setColorAt(0.2, prevColor.lighter(110)); gradient.setColorAt(0.3, Qt::yellow); gradient.setColorAt(0.80, prevColor.darker(270)); QBrush brush(gradient); pen.setBrush(brush); painter->setPen(pen); rectForecast = QRectF(posBlockx, starty + (_heightPU) * pos, placeTime * scale, (_heightPU - MARGIN)); painter->drawRect(rectForecast); painter->fillRect(rectForecast, brush); } /* Draw working time for each processor. Working PUs. We don't mind about task values because the taskmanager gives us only the tasks between timeBefore and timePresent so we haven't to test if they are displayable or not. We just have to calculate which part of time is displayable. The task t has its begin or its end between time Before and timePresent */ void GanttWidget::drawWorkPU(QPainter *painter, starpu_top_task t) { int starty = HEIGHT_TIME_AXIS + MARGIN; int widthAllowed = size().width() - WIDTH_PROGRAM - MARGIN - WIDTH_GLOBAL_PU - MARGIN - WIDTH_PU - MARGIN; qreal posBlockx = 0; qreal placeTime = 0; bool isStartx = false; qreal scale = (qreal) widthAllowed / _timeTotal; QRectF rectWorking; qlonglong timestampS = (_timePresent - t.timestampStart); qlonglong timestampE = -1; if (timestampS > _timeBefore) { // Begin time of task t is not displayable timestampS = _timePresent - _timeBefore; } else { timestampS = t.timestampStart; // Begin time of task t is displayable } if (t.timestampEnd == -1) { for (qlonglong i = timestampS; i <= _timePresent; i++) { if (!isStartx) { isStartx = true; posBlockx = coordxForTime(i); } placeTime++; } } else { timestampE = t.timestampEnd; if (timestampE > _timePresent) { timestampE = _timePresent; } for (qlonglong i = timestampS; i <= timestampE; i++) { if (!isStartx) { isStartx = true; posBlockx = coordxForTime(i); } placeTime++; } } int pos = _PUsByDevice[t.deviceId].id; QFont f; QPen pen; f.setFamily("utf8"); f.setWeight(QFont::DemiBold); f.setPixelSize(10); painter->setFont(f); rectWorking = QRectF(posBlockx, starty + (_heightPU) * pos, placeTime * scale, (_heightPU - MARGIN)); painter->drawRect(rectWorking); QLinearGradient gradient(posBlockx, starty + (_heightPU) * pos + (_heightPU - MARGIN) / 2, posBlockx + placeTime * scale, starty + (_heightPU) * pos + (_heightPU - MARGIN) / 2); QColor workingColor = GANTT_WORKING_COLOR; gradient.setColorAt(0.2, workingColor.lighter(110)); gradient.setColorAt(0.3, Qt::green); gradient.setColorAt(0.8, workingColor.darker(270)); gradient.setSpread(QGradient::PadSpread); QBrush brush(gradient); pen.setBrush(brush); painter->setPen(pen); painter->fillRect(rectWorking, brush); } void GanttWidget::updateZoom(double value) { qDebug() << "VALEUR === " << value; // if(!(value == 0.0)) // { _timeTotal = value; updatePrevLine( _lastValPrevLine); //} } void GanttWidget::updatePrevLine(double value) { _timeBefore = _timeTotal * (value / 100); _timeAfter = _timeTotal * ((100 - value) / 100); _lastValPrevLine = value; if (!(_timer->isActive())) { update(); } } void GanttWidget::updateTimeView(int time) { qlonglong newTimeToShow = time; if (!(_timer->isActive())) { _timeToShow = newTimeToShow; update(); } } void GanttWidget::connected() { _wasRunning = false; _initCompleted = false; _timePresent = 0; if (!(_timer->isActive())) { _timer->start(35); } } void GanttWidget::disconnected() { _wasRunning = true; if (_timer->isActive()) { _timer->stop(); } } void GanttWidget::ganttLocked() { update(); // a last drawing update before to freeze the drawing if (_timer->isActive()) { _timer->stop(); // freeze the drawing } } void GanttWidget::ganttUnlocked() { if (!(_timer->isActive())) { _timer->start(35); // start the timer again } } void GanttWidget::countPUs() { int length; _numCPUs = 0; _numGPUs = 0; length = _mainWindow->serverDevices()->length(); _numPUs = length; delete _PUsByDevice; delete _PUsByPos; _PUsByDevice = new starpu_top_device[length]; _PUsByPos = new starpu_top_device[length]; int pos = 0; /* CPUs */ foreach(starpu_top_device sD,*_mainWindow->serverDevices()) { if(sD.type == 0) { _PUsByDevice[sD.id].name = sD.name; _PUsByDevice[sD.id].type = sD.type; _PUsByDevice[sD.id].id = pos; // actual location _PUsByPos[pos].id = sD.id; // the reak id _PUsByPos[pos].name = sD.name; _PUsByPos[pos].type = sD.type; _numCPUs++; pos++; } } /* GPUs */ foreach (starpu_top_device sD , *_mainWindow->serverDevices()) { if(sD.type == 1 || sD.type == 2) { _PUsByDevice[sD.id].name = sD.name; _PUsByDevice[sD.id].type = sD.type; _PUsByDevice[sD.id].id = pos; // actually location _PUsByPos[pos].id = sD.id; // the real id _PUsByPos[pos].name = sD.name; _PUsByPos[pos].type = sD.type; pos++; _numGPUs++; } } } void GanttWidget::paint(QPainter *painter, QPaintEvent *event) { painter->fillRect(event->rect(), _background); painter->setPen(_textPen); if (_mainWindow->isReady()) { if (!_initCompleted) { // do not call countPUs more than once per execution countPUs(); _initCompleted = true; } drawProgram(painter); drawPUs(painter); if (_mainWindow->isRunning()) { _timePresent = _mainWindow->effectiveRunningTime(); _timeToShow = _timePresent; // saved the time of end drawTime(painter); drawPresentLine(painter); drawIdlePU(painter); /* Past part */ qlonglong borneBefore = _timePresent - _timeBefore; if (borneBefore < 0) { borneBefore = 0; } _tasks = _taskManager->tasks(borneBefore, _timePresent); foreach (starpu_top_task t, _tasks) { drawWorkPU(painter,t); } /* Future past */ qlonglong borneAfter = _timePresent + _timeAfter; _tasks = _taskManager->prevTasks(_timePresent, borneAfter); foreach (starpu_top_task t, _tasks) { drawPrevWorkPU(painter,t); } } else if (!_wasRunning) { defaultScreen(painter); } } else { if (_wasRunning) { // display wanted part of execution (only if it's finished) drawFromTime(painter,_timeToShow); } } } starpu-1.2.3+dfsg/starpu-top/ganttwidget.h000066400000000000000000000055731320135501600205700ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef GANTTWIDGET_H #define GANTTWIDGET_H class MainWindow; class TaskManager; #include #include #include "starpu_top_types.h" class GanttWidget : public QGLWidget { Q_OBJECT public: explicit GanttWidget( MainWindow *mainWindow, TaskManager *taskManager); ~GanttWidget(); public slots: void updateZoom(double value); void updatePrevLine(double value); void updateTimeView(int time); void connected(); void disconnected(); void ganttLocked(); void ganttUnlocked(); protected: void paintEvent(QPaintEvent *event); void paint(QPainter *painter, QPaintEvent *event); void drawPUs(QPainter *painter); void drawTime(QPainter *painter); void drawProgram(QPainter *painter); void resizeGL (int width,int height); void drawWorkPU(QPainter *painter, starpu_top_task t); void drawIdlePU(QPainter *painter); void drawPrevWorkPU(QPainter *painter, starpu_top_task t); void defaultScreen(QPainter *painter); void drawPresentLine(QPainter *painter); int computeTimeInterval(int timeTotal); qreal coordxForTime(qlonglong timestamp_ms); void drawFromTime(QPainter *painter, qlonglong timestamp); void countPUs(); private: MainWindow *_mainWindow; TaskManager *_taskManager; QBrush _background; QFont _textFont; QPen _textPen; QRectF _rectTime; QRectF _rectProg; QRectF _rectCPUblock; QRectF _rectGPUblock; QRectF *_rectPUs; QRectF _linePresent; qreal _coordxPresentLine; int _numPUs; bool _wasRunning; QList _tasks; int _timeTotal; int _timeAfter; int _timeBefore; double _lastValPrevLine; QTimer *_timer; qlonglong _timePresent; qlonglong _timeToShow; starpu_top_device *_PUsByDevice; starpu_top_device *_PUsByPos; int _numCPUs; int _numGPUs; bool _initCompleted; int _heightPU; // Height of each CPU or GPU rectangles }; #endif // GANTTWIDGET_H starpu-1.2.3+dfsg/starpu-top/images/000077500000000000000000000000001320135501600173315ustar00rootroot00000000000000starpu-1.2.3+dfsg/starpu-top/images/about.png000066400000000000000000000026751320135501600211630ustar00rootroot00000000000000PNG  IHDRw=IDATxb`19b''eW*'˥./_o6zoc3eW{D"?##D߿~_~0?3bBIt= .NV?0j.nnaaaaaannn3e`gcaHLOg``` Y(,-##]."? A??1 wg8y5X?^.6!raiX<1@@'J |e*Zw /QUws02>w~0000W.aRtiX^e  ,,, ۻ>|v./]j&BfQf6.}I*a%;R\COhE0 BqV1 Qif6|͗b  W f``` l|JJL,< ;>=4 Ye200pC-c``٠200-Qe[C-`\ /ԥ /JsȎg1dVtz"ˈ߳o] X:e]kw]#ۛ>teP.hUG,V'89I/@i -_IKυONPl)p}9  4b)vIǛc52U OmbypBjM{pu7a F>A|Z.U!hOfaUeu;P>v}dZ_J?.^.>+{3q>ûLZƹq=(IftL_J.m+{Hx3.̘{"͔H#?'. xJJ]s3w~fHt$ZQr+RZܒ|H#uZĝ$O1h0,;(Cb-qlG(8 -U~!,pFroRݢVzUHD/5oQEP{\qJZ, "9! HMIѡ?G[O}00q~-(Q F4F{=^K[Ã6PRSzԁo>Y ®yk>6֣ҌжLL"6i/4DU"nv`ݪ٫D߉^w=QYV}Ikƪ" AQgzؐ!hg,=HKφP"j7lY1S8*9 Q%GOP'47Xd CIAh/fԘE;rBENS‚+9XpmTS0y?YeE=7ц6PZ.13Oz*2\\/'dunQɅ]Žk>F*77o`tV_=dw]W^!) #,$&)K <դ}XDVn Aٔs76||pv72xVF}Qdץa#WkIENDB`starpu-1.2.3+dfsg/starpu-top/images/debugoff.png000066400000000000000000000044411320135501600216230ustar00rootroot00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڬWipU~r{H!"k)I $)Z;miG1XԩG[VGEFAdѡ,D!\sT`'N}y;n\d(`m(5(tRۺt8ȷ8]S7s&hEdd t bw1^ ʘgg]PY)PTGs~ @zꙟn\Wwsp h yeS_cr(z5\VW@)E=f1[Ċu9$|˗ݵsG3Q^׈yϾX L4AHfXg'c荪ᄚ+`K[Z3ě7wn([*k5?mZ;%-C'؃>p&\n]Dy#l^ԡ[^{l E=2gc{ϞFih ؊1ڋԡw.z؞P-,Q4 YTj֢vRD'1ֽJ'˓YCr:4HPBC&dS(~^#mEPI,0 "sĥa["692Q'}Bd9"0H|^OS+yFV#߾;0/}z[| Q"Uu0i) MiZ6Y'(!C|3P2 7#݆WpCvyV~zg ~P__׋]g3h* J޲1`8N[%JA>s9[|e 8%x:ɶЂFhm{2ͶIF YʩW?;dW 69ֵ"GP\JN٣QXԟ@A,l`:[ᱳ#S; `XDI'%cT ľj$.zPP WMæ> y!?;Ň;הeRc)f!2tp8 0ȩI{"߅iOȽkR#P@#y9{@X|-'oG711KBM054Al0.,"S@iWCݺ Ɬte!*w֦L{ |߄y Z!76-y;=θoA5IasR^j(60e?*"&҇lܱ:sC%"3ReY"r&y(trlsy -DݜI{.jpIS{la[k Ydd jbxkwC 5m@vFx\xD!eشp7}>4~Mj%^U /GM=V8қ~~4 ͕5 ]*eI/sF\x\LZHqD&ryo|L*Iis rXC1#xW MNQZ(MJx6MWt76pTÌlJPN,]N:T>-2N3iMSlk\L) )H $>ZTC<^~y\EIF,F0 TbK;/>@å$HWKG7Lo= .$kc}l̥5H>I9ٗ ;iȾq/ OÚ<ʈx!Ҏ m5# g͜6"]m_B_s䷽~@DJ YHΧWylӞr8<|뾉XjaSĉX,s{Нѱe M>ʁߊ{*F[;5Y>7̎mğ6 |~ ]SuR_L烄p.~A=h}A\eQeɟ0IENDB`starpu-1.2.3+dfsg/starpu-top/images/debugon.png000066400000000000000000000042331320135501600214640ustar00rootroot00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<=IDATxڴW}lUs?ҁl($X; - p> g0@ ưit A+ v:lm,-ro=ysLȲ9I۰T=MmAt(tDь<W9/Xpѻm[k*R.MGޥ9aZ HW3[1rÁPY*hE5( W lxZ|ݿ{l+[3lƊ0_5٨"cZ~VeRј1Kjؼ3""Wʿ+;>>~ˑw6ύ Ý+o_lǁC"XxA 6pf O` <ڶcyCC'\q ҩ٪jB%5M0,'1, u"wr;"7c0\yJ``.~Hõ•)l 辮6D$~[l%pK>sGIU}ks~dT,@-|iG800 c:sfJEV}cJ:! 1Z d/z##021kjᯨ-D@l5N{ףm]u 'GH ɓ.)9T/oA624c򵃈yj" )W֠sv6>ǶQ{K m{*3 Ml F~OT>G$»lYcFSZ8|t YabSIO!)l'1,$ Q0S6bJܹ'ٻ%ۈX:LjfEY4I'rJ'3R-PӐ}xq.{m?_Cy/6I4Y ' Pۭ0:^<kM@0_eq( B_|xph}gy}4s-9`@g$ rLYBKԊswK,_Wcd H˼ ޠ`rJ3md xšw u+X'|J .q:^^TAwhCׄL5+JMu-22[q^$7&p+%/ ])L$$r~aSw 8._E'hj H㺯e'I[+ӡ `P&`јc3QKY'Y8[.B8.8NTu.fI1)XA5 Q2LKapb9|)9g_[s (*3ܲ7Z>G d砤/,%`g+- 9HkѱUh&Bߢ vbһߘ> 7}d:*>wD*K ].%3nc;~ }Df'RE蒻жMꟇbÊӝGBhYvEQz݀X#AO6n}w.;pz,3qH!߉=߅}4AyşOG$á t'.L@" D[nx!) T{grgv0@ii٪@00,)' BHNuD$\7kX\,AVΌC`l@Y٭ xEߜďG$.q>NLl"DYB7P` %fn9 1s á*UUn"3$oX ֚Apo^D"4< 72t_Q-YadЏG5gq- Gxxjckx0%G8$+1TIR?1,l>j?m_@Mǣ\E@}u٬j =kqZ+^u8A7LoOz{X7w gYnE*IENDB`starpu-1.2.3+dfsg/starpu-top/images/help.png000066400000000000000000000014141320135501600207670ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time11/05/07ݺ`IDATx}OHTaޛ1 j%cB(AÕڵ2h2rӟ[2 )q,͌f޽}{.4ׁ~EҡE 6r6ד6מd3ˍjlKNJ۰GС%:;FLxӬ)D3<0"@\|ͩ秊Tr}Ě; GYH a-~B޴=_u]abeMxX$_r [rmlO%z{P[/Pp\䯢hL {dynM`bFeliH϶=:m`(܋sS(G |x8RU /=N9Lzcdfcvo+i(q%݂@8}P)L14k@|%x,99D ] ԏ5uVfΎVM"vyA`,'5#^RтrD.O!5Kr]U=tiUA Sñ l%15ܵK y&$]pA)N|+ <7DIENDB`starpu-1.2.3+dfsg/starpu-top/images/inside.png000066400000000000000000000030571320135501600213170ustar00rootroot00000000000000PNG  IHDR szzIDATXŗ]lػM%R4.izC! 4EUiUz7R{QUZ.R7R **R%YpA Mb9b6ݐA8}3gќ=ߙֈoiVW狂G `׺J$xz QvvqEP$NAHh8[aW{ HnD' ỔR ޞT*8^q;硭`D5wuvq2yY33?gڳboNxO$Q5QbŏCZ:A[0^AC.05}pZ Skmk!GM:$FkG@+DME,{XehM>1`_2̎G^ʺ^i@B iiԀ(%pQwy4|bH0?z9p ~g2]bX Jk (% kh!Ik~hQɔWg2by IurR & h-}!b B*tnǂ'.UdjX JjcDk0QMtu_9LhMv+h5XAlp{MFڽQbD[0^9A$;ĝ9zj~N)+ub iP1&: XȖ>8gpQDWٶ"SO?lvn'5ȟ>>N&:@7֧`O 7_~=YXw$Hj=mi*^XWԛJW/d 3Ipyix }&3迺(T9O 튟%й#| drhfa=[ip A_J0IENDB`starpu-1.2.3+dfsg/starpu-top/images/lock.png000066400000000000000000000017251320135501600207740ustar00rootroot00000000000000PNG  IHDR(-SPLTEܶش!حѝ݀n]J8ɌĂv ԥ̒H%ܒzbsJP2ǎkHs%WUI=1s%PԱkkHH%%sPksHW%UI=1%sPkH%zbJs2PkH%ssPP¶zzznnnbbbVVVJJJ>>>222&&&𠠤vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv)tRNS@f pHYs  ~nIDATxڅY 0 EѾTc:ߥXA9@8M܁lxfH)=1vûy"bX@fZEi*o2  6aqZ8ܯW<$zIENDB`starpu-1.2.3+dfsg/starpu-top/images/outside.png000066400000000000000000000032211320135501600215110ustar00rootroot00000000000000PNG  IHDR szzXIDATX͖YlW93wr7N&NIԊVhiCAMDhYEo偪/1S5CK%딋|D(N\s'l|~hY8R9g.lZ,j7+J =YR:XR)sOioN}탽]PlOgZۻV(CGgFmK}O?8uDdZkDpy> esh[Z+rDisܮ4P*_;0V;pWݳ:҆bh lv3QmBR+1{ƀsPH: =~⏏~QysnhKKk-o 8E UD KKOc3 ay ?ljN N*߿ ȈR%Qq2i|SLJqbt3{KQIȮp+amW<:T'%۽~ZbruB:1bEd;Vl,~a]O݁QJ@06 AJǫ\d[z6wo~۹.@9F;`B'";LC6MVGkuXTc]~k5A3Q*PDtHh35a`?Ad{&jX>J &2xH9"(Pg$r K7!-\)kU6Ή_}@&] qy@8>AcQҊhϝIމ4E\Z61rRLx^0c N>`'rRy8x 3œ=hr/A)NQ_'{@t(4|‘U[#@Zԟ'}H!nˊ/(g\|w yxt_~S#}N2ȓ;y`0Cw" w~^p20G2.YV~"?Q⸗HZ6OjQ~tsz$Ѹ\ H,'} M2,ݰ^ÕԿU0IENDB`starpu-1.2.3+dfsg/starpu-top/images/play.png000066400000000000000000000071011320135501600210030ustar00rootroot00000000000000PNG  IHDR szz pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FlIDATxOU?}y<:`EyQX2Fbo1]v_3z13 Y%p1@iݺKi<?>zw2; %i"wz5MRs(6 |xWͳDn%yU XJ jIInP7[]x4sopb ce-~Qn!W{baw:3$ )vƂbw9X3~t5uhmkQ0@raաX]̅Wsysd7FTPchH!bSМn\ !r e$mM@c(LnSМK15 ؊_ί?s7"!`Eux\"u&Hx1yl0@qS#kwHJ~7Z1]0=,fKݣs!✞Q47@s‑U/w VI $[[5]~xr3:3hHIENDB`starpu-1.2.3+dfsg/starpu-top/images/preferences.png000066400000000000000000000041211320135501600223360ustar00rootroot00000000000000PNG  IHDR szzsBIT|dIDATXkPT]eeA.j:BDcjLS`AtR)budHd:m´Z FƚN(-.,{fVg}y{3nCMMrHܗ`PxTH ȑ#&i@[8L'~ĻU([Jw>|O>+l&=Hp`ڬ$IwYuuuSeu_-.(@bJaWx;(eRUU^$d-Ȧ zÂ꣯NZwLƛLf֜EVAAhR%o2STUUk%/Lz\8YV3˲e$I H [ /&`^漂(#{VͲK'4*r,Zrs$8h a0 dY?0EV "k pGYq٢;!L'Tvsg.j% Т(j6 Hhuu X3v~)dKW)"T1ߔa?[[ "q^', .WfzP̒Wǚ##ڽb<6b$;:! $g(׮64>gTTTx'紟ⰥnޮenŞ&- (2&!!!ʍ5_:N䥦lȲn..L&z9<ƛM5#?g.hp8IY K mnn{Z|.n.^*qˍN06 <~YwKrPqSH%?f^Eԕ A~ ~`!> .7~)EQ@$^(XNl91uuuS:%@Zq.>\̤>} NVDK,K  Qbk6[Vx)/֚Y3`S^!)> %vԍPZZިʖˍ^AdYX"Vn<7H.n[m1Z< 14F =.pxr8սm\sX E3?=c-)(s~9+#3fFiqftv . Hm.X)iOF{WeYE  \D^8p`PWbLCFi3M8xz`6@ꬸ7*RTPg$MzQq!~x<DEE$,N-CL:]:vf4MHEk[wn?ݤhgK?рa2"(,*y94QNB׃6vbO/4q( @?W\yy9w{_pI#^oOe"ֶ'+M3.]BWx_ . "a0j%{LaE[Q C Xύ[>[8h¹!LOT(BDcL̊6&,Y{[n>扨V8<c.Sx|b%W/IENDB`starpu-1.2.3+dfsg/starpu-top/images/quit.png000066400000000000000000000011271320135501600210220ustar00rootroot00000000000000PNG  IHDRw=sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATH͕kaϵDApsn,.fԂ8 &6:IעmiCЭ8'{Mm*uZ}Z}w̸NEEY, `hS@,o:@R"# 'RI{|kp M`'KsGVA^ X:n_ 8`i _tSXn0ۙVC ]`;'hlZ~E 'hgμ# 4 zǥ~?Z߀=5{\%/+ { yKMC(3<@#8MipS"(xbh2<5?efO 1m@5cfl@Úf2/1o#(nzr-58]LGk`'*c4:r[p_P5?]0Ğ KwȫIENDB`starpu-1.2.3+dfsg/starpu-top/images/remove.png000066400000000000000000000004121320135501600213310ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?%qjŁAl?~b`A?0Vlb?gI2慳ʌYYX98 7@>:鿿g`0`=^c&IENDB`starpu-1.2.3+dfsg/starpu-top/images/starpu_top.png000066400000000000000000000607741320135501600222550ustar00rootroot00000000000000PNG  IHDR\rfsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitleTerminaltEXtAuthorLapo Calamandreiߑ*)tEXtDescriptionBased of Jakub Steiner's work''aIDATxIȖ&#c"Ǘozݯi#ҢvFF+E-j/mB^U^N}ӎ6h4N~oNt;w13vnmo&v`mmnmmvnm;vn)ݶvNݶv `ݶSmmmnmmvnm;vn)ݶvNݶv `ݶSmmmnmmvnm;vn)ݶvNݶv `ݶSmmmnmmvnm;vnnIz?Zk)ewnkޘ9R_R//*(|>o{>9m5?6M^?E|.1Rp8D$;v[ )%V<˿ˇ77G=q`8ADox-2,K, l6Z "l6xKUj|bw3#c%+=6736ǹuǴm>UBa]X)equokis:w{ksqqsQ?ADH.*![m}uWoWU `>wv9}t6?UVunmK3>D,0N!VCE<~pZǮִW:vm~w}9su ̿C-E)2:޿#/r׉U/kf^w_4zhw=w48o۸ߡMx浦ll_eB=@FXPڿ/R<.v۫-/716,WI&^-w7Kы`w¿v[ ]@@W'_ef/쪅k^*|vy sώ>ep|kd?x CsԾ[ naOgr?'+=W P?UNT/8M?7FЩY{;"pf-޷NGE-ᅪ~x{ ǥk >9w3i>sxsH uW!DjcN>Km2ql/KlMمG{pwtiy5hX0R[je ސ:7D6 }`cP/c':Lj1 eBøl-BGusi{?g !7oV(񣣸$>4xFR<_u晏 1@m\_ cZl~2g֙{˼|qq &7g9[nԟo0Zrou0<1:`pi٦R Wa3|* 1;]CsMjJ0dvIiEqf)槛I.(U.8VOcp }}|#83gC ӧi𿬺RfAv^u+cX,Yp-~$$~DH&~^gXg~O\*pM=y>ɗKN+e ,,}K[ NEʈ n6E{Jlk,)Y< ]KЭ(][U%A&yy//-}![ |UoX RB) a8#@A<+CoV^% -.!oC}VPxag۲߂rW"g #zj*oeXm<_A@"#d !I,5ƛس6 Ro4K*S˸ytuJS2^I]weYqNx'glumւK,ل)'Ֆ_ A_Mq RȔT{ѳT#n<> lgÁ~{{%Awk|y <%W>ʣM8NZwW=wV; {̇E1A"V @DGXl$dKH?@X$?m>0Iv1 |٭w熉Us]e +M;q9ٯp+~B.n?rE Dr!NQ"pt qzLgTWm,˜[}.ɘs\- 9r,b~S)d4|±\ÞB @PdP@Dzzo͢FI%6 e| (YbkZZ\pjb*jF,낉PUS\iuFۺ4}&Z,$?Q?qpcc[} mF-6hQ3sߋ弲PW,a0Er9b<@UpZUP)fNz뚁KW|&v Lb|}'Q'J㓸C.~ t׼&IO[b!O=T.qKO!y>sX^o4wE{( VEAW*/)'1h H`1`xcn Dp`,e:r|+T2P# ˺ο-8URcE={ (PJWzayJ4 <_)r%"W/(^Ƈ.u+&W%Vk놅z{|)1?5( DL8vo!"u~Ϸ&xD58F"9M{=NӉA,pc,'»adc$=1: T`-*Qg-b٬Wl &I%bc%ߍ`MYT?"B) ~J_%fV|$("z}X!7ct[đrI"}Dю T$cr c Ǡ{CY{(+4 բy-F?(\4mk ~:pQВxq;kq_-t87@2ξ_+X`ۀ]A`0`k7HY#ݬqVzV)[c|;*^C_pʡ bŸ>(폆 ?b|T>WFHp۟$ˋh6=I?*04mtc~;y^ ?U~7"/pa9(XܚC3|boX^nJ_f;K |t+o~zdzo,HKRPZS!yj{+Sկ軮p]޸5 Hb»:SHX\6Id!]J 6ԥ@AEZs @$cq) (d+p +>sjCKO?D  p5N] cIF5`xV]o)ހ<opz,۔4m= 4ߋ4lms$`og䂅ąޞtS Q>G|l麸f[S]Aj.1?5e *6nP @i&?0U!%+H&^'.~B.t(F h!{:3Mq9 ~&pkMb_~u2mIAߎ:ѵo|ϭ)GD8½`KU~l=p<ʕdbg`E?ėgr_]F!IN4ФPeTSTB*,~A3Mr !P@uy_C_{ |DHt" P;OUm~S&Nn|y~~νi ,cc2ErS~/X[GZ|Bܲ"W׫, TZ,-e౛ǜeW)Z)pAd?Ry F/l5xKz f Xpa9s=j*Cj8? *i YZJ(q$?۟ ,Z~ | J _Wu n7z)oZfNVc$La,!@t? KulgB_(A=ZeMRb Xt*S1Jeكp=(PA.@/)&߄4`cҁp];[_ (T.`- T?{ENvŌ@uRU6tYl ӁME5Yb?O1'c cLqB!̀To"BI &Y "$ .1<!n#6jG[(:OheiUIxY( "0l-{^Ip,$Uך#P@3vuh8DKpHܿKT`.ܞ;EAH@ 5Pdi90cL&NiȪPק򊼊:KD5P§ӋԠ `K&npЮ w͞2?Q7p0_vLCo P@p^ w-֜21QK/W1P( ^"(#n +]}^WLMf?QD4  T\ %O8-#jgߨ o:t Bo"=H/\YL? IYKO62Ձpf=cՖv?~V `0HU@k8IfX#) Zpv@:1Yd-%6 R/bXd7lKp+\t-~N`.hQ6}9< 6ETAt!1t؋rCYz_"q?@`fKrZɻ P*^%yo%"h!b»?W_B~}&+E`0ԵsC{QeG9Zä30"LF{&gWX:kRyE1!}6 Kf4G"{4ٻ>8 #sд-c1Ӂj/؂j#) 2턾⼂Q@i|#Mr1k<{8Yru pcŹqK#L[b@]' 4 owLGT(qBcU$%(T(Qq NEB%%x+M;ah~q/-4FZhYyt &%miy}wt`-FX^nf|_ZN3K1G=0G3+~;'4a& "?؋1؏5'5R]ͥDY7?a~b~ؿFze}% fX/3DafDTMVVAo?l&\s=jAa 0CLOSRF@r& gt`tq.OVm :=h'+dV5˹Ej#ݟ_1?_[OZ-6 z`jquI̢0i- ͪ5QUJ"":3 ̟W"Ō(!ڃN"u&S[tu =T^YCQs((scִxnW~u@7݅>tN算;SW_ /<2E,ԀJ 8@!UF\tۀ2LKY=9om290dbW!9 Q,پTzDLʻ<۔G5 똢_]o2,ъ!tuK3tQ>}_@~d?Wu .3%@,m$2alK;+|כ_ );UDa!/L[7[ Ԅ/v5'屿DÏ~wMuߐ{YU[Q.zc擠#@gr^d>J 5 +ӡ$(| J9TL)zm 0W6osQ&+4^#:FLk)IZc EɦT 婶lSA7j4C _rQ Lɤ9qOΟo0)bb՘C2."r(NʚJ? WIAqGֶ |mV4Mn>Z ˜=p;?7,)@*N8J0AbqϺ!!~x)4[Cr*)N=&@ǭQML yEl+""| 5Lb9 'qL+|p. i\as O4 vot|4ӀOS~t1}<ͯ/΃S@,bHV`z8@,%H6[2goX[`<&MY'g;NpGcd |3{L$@7FAh0=8BаEX v9?TN4mتev,@WW*^+S>WU!/g]ocvw,D:0ECS;%J赐K",w7`U%uw*/q?x SRsEoϱL]\0ȢU J->CYM&!ULFv |c06ӁKHJKB u-Ub7?I8UqNqwݧD _(SPE4$rvZH[w J|8W"7]xy|ْS+dDrAJ'6LcX Խ_?ϞgBN_V A`W)<)V(TCawE)5GS}CsRukܘZB壴"/SȌEH,؂m@%wD݊8m˖ߺƌ[4H~f8?@˿?Gb=Y^8Rn,7?ke/+`y0vS+a ?פ^ु!p r!0Fu?r\ SՅuťGiaQcˤThF7">lp̙F}vw  ?* \j^/SՒl=%?jRIɜ1%BkNrC!E^Vp|PCMe9f,3u B!`RU2?K%??1=]۹6i N"6$czT@d"\97i F=3lϡF#x ϶d:p=a9MtoHp| 0؋KirWq4K/* n.cH+f$w?V}"8p EBNaz3G d\ ԖɖȺ&[:٠?S~0 :wbtsBdfk|3ȌdMz"3,/T&?`hްuw?~SETrOrkL/VވB ]ȭjaR#YO[Ҁ 8b-?փ1)D^ ydTg5M pQG__枃5\/lӎ1D?‡~0/O_ӥeY.`b&IOM1}~+p!wzb0)*;kh |*5+U!,h_1F=pto^ I_SdHu ‡L?ػG2RGQ 3Re@# g;CZ>D a27ڏqL֢otF] #Phk ݈yI<ӇiWBz(=ptOYLyP ?NS<~'ͱ.UOsv Sk|99[e`0NY_UyD@8B=*_2NW$SN dRj^F+c,wa>[973,/BB[iCʳ)><}8ϩRUSW9SvoUEf`qMf4)(I?1(fo.,l]qup_P/. f[l"U a nE0@f|6HNӰ?XM${?;|ϧkH dՒJr5!g96#͠XTF刼dUd )}Z< ,ΝZ_F\ A:r5بʸk ,.6zM}ڏQ>v FbLOV8}4w;uLu)1K!tьGlj%{90δYm%vƝ@ @B, "@qXti1(~OȤDzgERJ62#L0p_A76Ԋ\AS%LVvPV-.7X?k-pT _ˁۼd3&N;?=P]lgoXHX\+"a"͊lDo~{%ԹI*Z:j=̛3N?A8ߏRN=Qn'E}VHyXVE%F|v =Rˀ;8**jHtq"!9ӵc4bzS$,%$vA 3=l5ycWF:Ѧ8)/{Crˍ-'cH?BQ>U(1Kǥ|a=MVlc2ԫ3PS'~.! iSHyw_*<5ใnMU:.Rrʥ;cʽWW AxNJߞC: _F% ׮ U lXg+ #LOCË'LpoDu"rOm$d{?$ V3ߟb9[+wsC@ȹS˩NM"=닰cµAtm5^S15;#ν,aT6e0QM7t})]zB+  )UB&} ]K*AG@px%) cPS"]EFycӀDfhTScD/Lß,Uj4‚#0Z ½O^Em 7O6`D:deXsг]x|dY1˧MCAAE(Ј=F 7Lw|uQ3]oۜit]Ϫ 37F1uFLO8y9OSqf0Kb%#q\" 2 I$ ̍pm182l9#]`kcY_W-1bʕ$#-o"K3&wŬf-)n0AH>2cuyw?o?q˖ȳ^ \ʏ8Jߜ+kI,,L(CVu 4UI1rXeu-j>pĄawh.`9NS<9MȤ~=`$МI]XT` #s=l"`qXsQe ]]n^SHD0t?J})+/[nW"oKUzQs~>[1 dZ @H# iB`zNA:QQ0נfQ\?? Isj ,1TXM n핚'GF* OP I*兪k<H*qpV6ν@%ejk<<&"3`zz4d3!Cj s84HAltZ*b S8(\TPSOz*^!YY~ h3*t̤5N 0>Ù-v@il@@Z8/i1(R^^ɍ9J2pT#p%:fz0";;hU'*]/ 1KƞW*_1(LiXj}x+I t^@@R5_i;q\`F.B~ʃ 2Ese,/+KHz8)GR5oz^M3Mz۶X& #i`v&LDRbM0Ox#dl2z7?4Rlr&TDՉl+RG`6< $2S鿼_WF SېR K?px$eaB_,{@$T?)g~zus$ő=J2F 2g;r$X^lPtk w`y:E^ :嫆bT0r"H$P-Έ 2UL:$X-6v~ L}sdpF[~ Y ' SnT$c8I 9*i4Ez,f &///-M;k?˴+7mp?\s<$-$`4IHsÑH{ TQX.+SB|^u<*s?Jt\x_>0kIW{x!`=\ xr U0U4폿aw) dޚ,ǶeY[knmA B0Jݣaټ9Y\h`x3pҜ. s20ԌGFX^X\g}8I \LS,0ڒd X ' ;#,kDlqNe@ឲFX/7HWFƁ?=?^S迫p(pxo1V} vIY^X?;C,)VNnc"%~Lq(E;{̕7k>-5˿` _!,h|ÃDq7lhL 3 e""KjiBLbNRΰk,.8~woE>!Y4NI. pR.GwG8{<tlRյ=&!X/R) qliK~I(/*LXrZll#< rb&W;@rrN;:- ajf0i` 'X/3wq;#UW©~.T".*?P# oWZ-7O?$gX\6 g30m-DcJH ,giTF3_̔ <dg r2bPgoӴaJ:ܦ[͌Go(pouQEz/-J-ۆknuΊt-urek$8b3k6x;Vs |AL̆aaK!"ɑ;U+[OTKk ŧb\obp*ιZl#D@|FIh w_Z⣼,_N_BN!/|DLAn^f^F6[3Ι&Wul~ ^w53#sO$YeU}{#Hb;M1(JPrR7dޅ)Srp^lGG:("R~ㅦ(Nf/`5ﯧ䟪@Zt¿˿mp0ΐu6T:'~гϟ)ޏsLfɺԗ^IȸXj? 5`J.uyO7#V8Y)`v 7XV`Oh7@"z>ETp65$vϕ+gb"@$~{c0pV9A= Ě]I1ʀ|"QX2[7!IJ!` ˼t"|$>)*\ HgK[vn : ~{@O(0G G=cVU8 5EvBצk*n8PU0T;("`SqD`/-_mւ%f4?J1~38-Yޮy o-2$2frn0Ej$Cg=8u*6V\hl׺~xw^+)ZΐL֋gL "i3HČ/3 xG ;6+*_m5Uأ5 ^' p箩% *u^_K}}DK8D^ jN=o8:a,?-!D=rj$M(j>Oq7fnYv^ m4>Hw T[8t3˞j!b2q GE! סW 4`MFuq$ǁo+בlm+ )"&<1!`F߻!.|f5%!_sLW`nBxU8?w8~tVf3lkPhSxS}B J+w~jP0b'@lAL*jH`8NTY F1!s; >HU1?c~zsw tS =?fZhLfbFWtE(V*{|AU7;9U~I2je0'`?$s(NЁ`ҷe߃OXӼ] Ll*㤝b@2?I30g^.T_F{ fHQN)3L10ýJ {IY :W0'mKmR(W s::[qa?XY(*9nn dx28Թ',?Z*(|\H>m `r43JHΫ h!jt!(RZ?yK~` 3=/t8Ip|@qm u:Q XNnuSd\J%3F%Ӌ&=$(wik[8!@!㤝姰28;=T|~A;;_,g}03&Rt\v%8߽Q!=So h2b;#Ο̑zC wtwAĪsU1-.5yl)7R׿67bc镅{5K+l\7a`,2-~<TqQtK;sN(C r)g5Pg"}w#Qad' IHF"N=bfLuNCe>/d (AZ@o\Ж,V'׮VE< ν YADOQp֋4/uFXkz ?:}/T5=I d XN82;wR7mfUZ* P\}tH5y 7@Đ`1xv 0p$gHn縼ێ%mK_ аǫ+VY*Uts$#?nSf] r&eU#)7hQ`U_b_s#P7e,gM^fWZq|]p9?HAt "$dpyųN @ @2Ưtр<`hw :܄[e`r+H:&1t`gT9m' p+4RbS3&}^ĬW`6Wz<?S|\DXpKŠ&/OkJA൪| S5q?5B7H=3P 5~%Ο0;] ҥvZ%WĿN0Xq@g 4X:l 405F}Q¿2@P*ljt ?!˴ɉ0mM|[ד,?О}G7oOUEӕ,9o;13V[}2U1UEP亄E302-R51=[ Ig ^UTR*eP5l501 (8:? b8ppƜ`,}:dވ᠝b._G׿u~nߡFV %$?ɤ&GXWfN @\źԝzjgp蘗8[4pB-ÄJeoob܅! HJ0"2eOIb;̸taQPh sT"ٱCv[[se+0|nؑ*5 -ߜlֵ nZ8 JBn܎F rb@e*춸A0,BW B&ᦖLJ9u(u܌Fq`]y6}VPB!gHEUZu5E? z@Kk\S/}kh[9FxX+BCm NH0P~s*R7e߈4}7}vX_7ymAEA*%Mӊ7f bqQB4`ײ EiBWcQWg *贵PmCa)3@BA[më&?wk !zUu_) -4۔2ʠuqҊ7 +} ҽaР %o/3p)<;gmqPn2%u_ h BL@!FImx 4cy^[g1*8Ja@S mu=]!_/רA gZ7XV6 >^p8,8CwÚV . 94ka\wx*o?ۡ-pt"@I!{k \:Qb , wٱ.f" 3YeZ 4ý|)0h"0bq*.@Ns*-@1w<_MM쿜x?] FPEuEkӳnY`JKs W զ<ˑ:Zs߆4O Ow@P,OgUes D-]/.S|WXϯh3˛ =7~u_RHxUa"4ƅ]õϻe`C)6@ Ü/|Z<^[}ji օxpҭ>tCKcaTVnvugFS\BݨPP= N!`LkqBQ XҰ0ѽmkm2/c\B[aDlRʠ|p `*io!Z ?f-[)>Ɇz/!Č[wU,6\]e>wMY!_AǬ뭲K[iT}6#4Kv` @5Bu_ā_Th[BBݕaT(-CFFvQ"7밅AW:~sfh0(֊ n~oz?]]tF 8""_ @lQow;rhwn7@lU`" @o z-vvBfi7$Q^z 'vyWK-hv-MS(W}n&VaShjSm]q˲,z"BB_,^@S pzv!nm׆MUQ"r8vnkh ?θZEИ=[pp^.ݶfIpg6 Xd׸bE/j|>t:UZCiy>~^e?3cX`Za^c^ Po%@W@>#Fk=6a@|@4=<;;xZEofY6FJӴ2[/wy_vwwuppP.i,)+{6/~@h,zYe >~l}gGCIlrd `vvvVGԴ\oM$f6WWW_?%%4w RPJI2< t[9jzb@MSyokɾvzVF ͂ r_v&lTgmiצH\ ^]^˭~$Mmx=^6:Bl(]ٞW<:)S}ˁu 3kS^DzX`ntɭ?mnA$H P8{nɫׁ* t}0&~w.\^n *t4f)@j~_E r`l`"I %y1v_)=1INF@+7*gVcKh1 EױBjIM`m?N='z??!CK1P鋾2 {;mIj^T@mE`_M13D⿏+q?‡A- n5MFTII$$305o= 4WMF. ZR&G|F~@@S"PX_h 7v /RԮӏ#hN݅@BWǨԌ@zEMjh|1P#7FNFPCyݦdh/H=\5f:qQMz@DP7`kt@&V@K#x1V_c:[4 z3E1; o``````````[4<]IENDB`starpu-1.2.3+dfsg/starpu-top/images/widget.png000066400000000000000000000077561320135501600213410ustar00rootroot00000000000000PNG  IHDR00W pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxOhU?3J6۬d1ZKAăAHѴV4 Ҹ*mM-PD0-&PPEhB Քl6;n7;;3!;&f!,}oAu*Tx[7n`pA0Wwz{{SQۃ`EF333'"M:*E<@0d{%DرcGE~:SSSզ]uVEC|Ȳ\1KHeiҎ4MCӴ@?ccc]hkk++nMtww[|>RTهoٲ8'p8Lgg'i7nܰ$ ܿ6/nJ\}&qsⳫOW (bINmNJ 9J΀$I|'NKpm[90oU( Cl6-yU;9[_gxϮV\*DT*I:vj "g 9SUd25 滴늢 IX%2LIj+(@P {ḆsR)$IbaaYu90tx!zO`\& ;,b+מ!{>>zcp@ 8\-u3GGذaC͗ Ήj%Jѿغu-LU[րݬGQrz 4V, ܳVTĚQUUe;+vc\:J$ KRO2,+֖-_(Y8Xu#r[>bjnnf|||UDn޼*---NKH1 -  G,%+zxZn9^JB>-z޾}醆???iw bCW\R I@O5@5$D/?^fyQ#^.rnd Q'<UDXz?dc&*go޹v\(rl[O77DAvI~7Vާjٸ5y}A"h\rln!#"TyYxDD I\!R 5+G1; =T+I%ۍ޸{W7frלy.Mc-ʲhUw-"I;Bv*!b )<}6xY#/vQ DH<)Kp8d*OUvq|ԛ9of^Us:::-6EUɲ Uekk =e񾤪*Qr\-kGU;sn5,t sЂ1_J\OIENDB`starpu-1.2.3+dfsg/starpu-top/interactivewidget.cpp000066400000000000000000000444331320135501600223210ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "interactivewidget.h" #include "mainwindow.h" #include #include #include #include #include #include #include #include InteractiveWidget::InteractiveWidget(ParamDescription *paramDescription, MainWindow *mainWindow) : QWidget(mainWindow) { _mainWindow = mainWindow; _paramDescription = paramDescription; _internalWidget = 0; _interactiveWidgetNames = _mainWindow->interactiveWidgetNames(); _interactiveWidgetPossibilities = _mainWindow->interactiveWidgetPossibilities() ->value( _paramDescription->type).values(); // Init context menu actions QActionGroup *actionGroup = new QActionGroup(this); for (int i = 0; i < _interactiveWidgetPossibilities.count(); i++) { QAction *action = new QAction( _interactiveWidgetNames ->value( _interactiveWidgetPossibilities.at(i)), actionGroup); action->setCheckable(true); if (_interactiveWidgetPossibilities.at(i) == _paramDescription->widget) { action->setChecked(true); } QObject::connect(action, SIGNAL(triggered()), this, SLOT(widgetTypeChanged())); actionGroup->addAction(action); } addActions(actionGroup->actions()); // Set attributes setAttribute(Qt::WA_DeleteOnClose); setContextMenuPolicy(Qt::ActionsContextMenu); // Init GUI QString labelText = _paramDescription->descriptionString; if (_paramDescription->descriptionString.size() > 14) { labelText.truncate(12); labelText.append("..."); } _label = new QLabel(labelText); _label->setToolTip(_paramDescription->descriptionString); // Set layout _layout = new QHBoxLayout(this); setLayout( _layout); _layout->addWidget(_label); // Create internal widget createInternalWidget(); // Bind notifications QObject::connect(this, SIGNAL(paramValueChanged(int,bool)), _mainWindow, SLOT(interactiveWidgetUpdated(int,bool))); QObject::connect(this, SIGNAL(paramValueChanged(int,int)), _mainWindow, SLOT(interactiveWidgetUpdated(int,int))); QObject::connect(this, SIGNAL(paramValueChanged(int,double)), _mainWindow, SLOT(interactiveWidgetUpdated(int,double))); // Setup automatic cleanup QObject::connect(this, SIGNAL(destroyed()), _mainWindow, SLOT(removeDestroyedInteractiveWidgets())); qDebug() << "InteractiveWidget : initializing [desc" << _paramDescription->descriptionString << "; id" << _paramDescription->id << "; type" << _paramDescription->type << "; min" << _paramDescription->valMin << "; max" << _paramDescription->valMax << "; init bool" << _paramDescription->valInitBool << "; init double" << _paramDescription->valInitDouble << "; init enum" << _paramDescription->valInitEnum << "; init int" << _paramDescription->valInitInt << "; widget" << _paramDescription->widget << "]"; } InteractiveWidget::~InteractiveWidget() { qDebug() << "InteractiveWidget" << _paramDescription->id << ": terminating"; } void InteractiveWidget::closeEvent(QCloseEvent *ce) { ce->accept(); } void InteractiveWidget::recreateInternalWidget() { if (_internalWidget != 0) { _internalWidget->close(); _internalWidget = 0; } createInternalWidget(); adjustSize(); updateAction(_paramDescription->widget); } void InteractiveWidget::updateAction(InteractiveWidgetType newWidget) { for (int i = 0; i < actions().count(); i++) { if (actions().at(i)->text().compare( _interactiveWidgetNames->value(newWidget)) == 0) { actions().at(i)->setChecked(true); return; } } } void InteractiveWidget::createInternalWidget() { qDebug() << "Creating the interactive widget for param id" << _paramDescription->id; switch (_paramDescription->widget) { case INTERACTIVE_WIDGET_SLIDER: { _internalWidget = new QwtSlider(this); _internalWidget->setMinimumWidth(100); QwtSlider *widget = (QwtSlider*) _internalWidget; widget->setRange(_paramDescription->valMin, _paramDescription->valMax); widget->setScalePosition(QwtSlider::BottomScale); widget->setValue(_paramDescription->valInitInt); QObject::connect(widget, SIGNAL(sliderReleased()), this, SLOT(sliderValueChanged())); break; } case INTERACTIVE_WIDGET_KNOB: { _internalWidget = new QwtKnob(this); _internalWidget->setMinimumSize(50, 50); QwtKnob *widget = (QwtKnob*) _internalWidget; widget->setRange(_paramDescription->valMin, _paramDescription->valMax); widget->setValue(_paramDescription->valInitDouble); QObject::connect(widget, SIGNAL(sliderReleased()), this, SLOT(knobValueChanged())); break; } case INTERACTIVE_WIDGET_WHEEL: { _internalWidget = new QwtWheel(this); _internalWidget->setMinimumSize(50, 30); QwtWheel *widget = (QwtWheel*) _internalWidget; widget->setRange(_paramDescription->valMin, _paramDescription->valMax); widget->setValue(_paramDescription->valInitDouble); QObject::connect(widget, SIGNAL(sliderReleased()), this, SLOT(wheelValueChanged())); break; } case INTERACTIVE_WIDGET_CHECKBOX: { _internalWidget = new QCheckBox(this); _internalWidget->setMinimumSize(25, 25); QCheckBox *widget = (QCheckBox*) _internalWidget; widget->setChecked(_paramDescription->valInitBool); QObject::connect(widget, SIGNAL(clicked(bool)), this, SLOT(notifyValueChanged(bool))); break; } case INTERACTIVE_WIDGET_SPINBOX: { _internalWidget = new QSpinBox(this); _internalWidget->setMinimumSize(75, 30); QSpinBox *widget = (QSpinBox*) _internalWidget; widget->setRange(_paramDescription->valMin, _paramDescription->valMax); widget->setValue(_paramDescription->valInitInt); QObject::connect(widget, SIGNAL(valueChanged(int)), this, SLOT(notifyValueChanged(int))); break; } case INTERACTIVE_WIDGET_DOUBLESPINBOX: { _internalWidget = new QDoubleSpinBox(this); _internalWidget->setMinimumSize(75, 30); QDoubleSpinBox *widget = (QDoubleSpinBox*) _internalWidget; widget->setRange(_paramDescription->valMin, _paramDescription->valMax); widget->setValue(_paramDescription->valInitDouble); QObject::connect(widget, SIGNAL(valueChanged(double)), this, SLOT(notifyValueChanged(double))); break; } case INTERACTIVE_WIDGET_DIAL: { _internalWidget = new QDial(this); _internalWidget->setMinimumSize(80, 40); QDial *widget = (QDial*) _internalWidget; widget->setRange(_paramDescription->valMin, _paramDescription->valMax); widget->setValue(_paramDescription->valInitInt); QObject::connect(widget, SIGNAL(sliderReleased()), this, SLOT(dialValueChanged())); break; } case INTERACTIVE_WIDGET_COMBOBOX: { _internalWidget = new QComboBox(this); _internalWidget->setMinimumSize(75, 25); QComboBox *widget = (QComboBox*) _internalWidget; widget->addItems(_paramDescription->enumValues); widget->setCurrentIndex(_paramDescription->valInitEnum); QObject::connect(widget, SIGNAL(currentIndexChanged(int)), this, SLOT(notifyValueChanged(int))); break; } default: ; } _internalWidget->setAttribute(Qt::WA_DeleteOnClose); layout()->addWidget(_internalWidget); } /* -------------------------------------------------------------------------- */ /* Getters */ /* -------------------------------------------------------------------------- */ ParamDescription *InteractiveWidget::description() const { return _paramDescription; } QSize InteractiveWidget::minimumInternalWidgetSize() const { return _internalWidget->minimumSize(); } /* -------------------------------------------------------------------------- */ /* Setters */ /* -------------------------------------------------------------------------- */ void InteractiveWidget::setValue(bool value) { switch (_paramDescription->widget) { case INTERACTIVE_WIDGET_CHECKBOX: { QCheckBox *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setChecked(value); } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } default: ; } } void InteractiveWidget::setValue(int value) { switch (_paramDescription->widget) { case INTERACTIVE_WIDGET_SLIDER: { QwtSlider *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } case INTERACTIVE_WIDGET_KNOB: { QwtKnob *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } case INTERACTIVE_WIDGET_WHEEL: { QwtWheel *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } case INTERACTIVE_WIDGET_SPINBOX: { QSpinBox *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } case INTERACTIVE_WIDGET_DOUBLESPINBOX: { QDoubleSpinBox *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } case INTERACTIVE_WIDGET_DIAL: { QDial *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } case INTERACTIVE_WIDGET_COMBOBOX: { QComboBox *widget = qobject_cast (_internalWidget); if (widget != 0) { if (value >= _paramDescription->valMin && value <= _paramDescription->valMax) { widget->setCurrentIndex(value); } else { qDebug() << "Trying to set out of range enum value for enum widget " << _paramDescription->id << "value" << value; } } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } default: ; } } void InteractiveWidget::setValue(double value) { switch (_paramDescription->widget) { case INTERACTIVE_WIDGET_SLIDER: { QwtSlider *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } case INTERACTIVE_WIDGET_KNOB: { QwtKnob *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } case INTERACTIVE_WIDGET_WHEEL: { QwtWheel *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } case INTERACTIVE_WIDGET_DOUBLESPINBOX: { QDoubleSpinBox *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } case INTERACTIVE_WIDGET_DIAL: { QDial *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } default: ; } } /* -------------------------------------------------------------------------- */ /* Other methods */ /* -------------------------------------------------------------------------- */ void InteractiveWidget::sliderValueChanged() { QwtSlider *widget = (QwtSlider*) QObject::sender(); if (_paramDescription->type == PARAM_TYPE_INT) { int valueInt = (int) widget->value(); notifyValueChanged(valueInt); } else { // Param type is double double valueDouble = (double) widget->value(); notifyValueChanged(valueDouble); } } void InteractiveWidget::wheelValueChanged() { QwtWheel *widget = (QwtWheel*) QObject::sender(); if (_paramDescription->type == PARAM_TYPE_INT) { int valueInt = (int) widget->value(); notifyValueChanged(valueInt); } else { // Param type is double double valueDouble = (double) widget->value(); notifyValueChanged(valueDouble); } } void InteractiveWidget::knobValueChanged() { QwtKnob *widget = (QwtKnob*) QObject::sender(); if (_paramDescription->type == PARAM_TYPE_INT) { int valueInt = (int) widget->value(); notifyValueChanged(valueInt); } else { // Param type is double double valueDouble = (double) widget->value(); notifyValueChanged(valueDouble); } } void InteractiveWidget::dialValueChanged() { QDial *widget = (QDial*) QObject::sender(); if (_paramDescription->type == PARAM_TYPE_INT) { int valueInt = (int) widget->value(); notifyValueChanged(valueInt); } else { // Param type is double double valueDouble = (double) widget->value(); notifyValueChanged(valueDouble); } } void InteractiveWidget::notifyValueChanged(bool value) { emit paramValueChanged(_paramDescription->id, value); } void InteractiveWidget::notifyValueChanged(int value) { emit paramValueChanged(_paramDescription->id, value); } void InteractiveWidget::notifyValueChanged(double value) { emit paramValueChanged(_paramDescription->id, value); } void InteractiveWidget::widgetTypeChanged() { QAction *action = (QAction*) QObject::sender(); if(_paramDescription->widget != _interactiveWidgetNames->key(action->text())) { _mainWindow->updateInteractiveWidgetType (_paramDescription->id, _interactiveWidgetNames->key(action->text())); } } starpu-1.2.3+dfsg/starpu-top/interactivewidget.h000066400000000000000000000053671320135501600217710ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef INTERACTIVEWIDGET_H #define INTERACTIVEWIDGET_H #include #include #include #include #include "starpu_top_types.h" class MainWindow; class InteractiveWidget: public QWidget { /* Widget which represents a single parameter on the server and which takes place in the parameters dock of the main window. Can display the parameter under different forms defined in the interactive widget specifications. The internal widget can be changed at any time. */ Q_OBJECT public: explicit InteractiveWidget(ParamDescription *paramDescription, MainWindow *mainWindow); ~InteractiveWidget(); // Getters ParamDescription *description() const; QSize minimumInternalWidgetSize() const; private: // Events void closeEvent(QCloseEvent *ce); // UI components MainWindow *_mainWindow; QLabel *_label; QWidget *_internalWidget; QHBoxLayout *_layout; // Data ParamDescription *_paramDescription; const QHash *_interactiveWidgetNames; QList _interactiveWidgetPossibilities; // Create the internal widget void createInternalWidget(); /** SLOTS **/ public slots: // Setters void setValue(bool value); void setValue(int value); void setValue(double value); // Other methods void recreateInternalWidget(); private slots: // Other methods void sliderValueChanged(); void wheelValueChanged(); void knobValueChanged(); void dialValueChanged(); void notifyValueChanged(bool value); void notifyValueChanged(int value); void notifyValueChanged(double value); void widgetTypeChanged(); void updateAction(InteractiveWidgetType newWidget); signals: void paramValueChanged(int id, bool value); void paramValueChanged(int id, int value); void paramValueChanged(int id, double value); }; #endif // INTERACTIVEWIDGET_H starpu-1.2.3+dfsg/starpu-top/main.cpp000066400000000000000000000051101320135501600175110ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "mainwindow.h" #include #include #define PROGNAME "starpu_top" static void parse_args(int argc, char **argv) { if (argc == 1) return; if (argc > 2 || /* Argc should be either 1 or 2 */ strncmp(argv[1], "--help", 6) == 0 || strncmp(argv[1], "-h", 2) == 0) { (void) fprintf(stderr, "\ starpu-top is an interface which remotely displays the \n\ on-line state of a StarPU application and permits the user \n\ to change parameters on the fly. \n\ \n\ Usage: %s [OPTION] \n\ \n\ Options: \n\ -h, --help display this help and exit \n\ -v, --version output version information and exit \n\ \n\ Report bugs to <" PACKAGE_BUGREPORT ">.", PROGNAME); } else if (strncmp(argv[1], "--version", 9) == 0 || strncmp(argv[1], "-v", 2) == 0) { fprintf(stderr, "%s (%s) %s\n", PROGNAME, PACKAGE_NAME, PACKAGE_VERSION); } else { fprintf(stderr, "Unknown arg %s\n", argv[1]); } exit(EXIT_FAILURE); } int main(int argc, char *argv[]) { parse_args(argc, argv); QApplication a(argc, argv); // Application description QCoreApplication::setOrganizationName("INRIA Bordeaux Sud-Ouest"); QCoreApplication::setOrganizationDomain("runtime.bordeaux.inria.fr"); QCoreApplication::setApplicationName("StarPU-Top"); QCoreApplication::setApplicationVersion("0.1"); MainWindow w; w.show(); return a.exec(); } starpu-1.2.3+dfsg/starpu-top/mainwindow.cpp000066400000000000000000001360271320135501600207550ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #include #include #include "configurationmanager.h" #include "communicationthread.h" #include "widgetwindowsmanager.h" #include "sessionsetupmanager.h" #include "taskmanager.h" #include "debugconsole.h" #include "ganttwidget.h" #include "preferencesdialog.h" #include "interactivewidget.h" #include "datawidget.h" #include "dataaggregatorwidget.h" #include "aboutdialog.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { // Set up GUI components ui->setupUi(this); ui->mainToolBar->setWindowTitle("Toolbar"); _mdiArea = new QMdiArea(); _mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); _mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); // Init data initDataWidgetLists(); initInteractiveWidgetLists(); _dataWidgets = new QList > (); _interactiveWidgets = new QList > (); _dataAggregatorWidgets = new QList > (); _dataDescriptions = new QList (); _paramDescriptions = new QList (); _serverDevices = new QList (); _nbDataWidgets = _nbInteractiveWidgets = _nbDataAggregatorWidgets = 0; // Init managers _configurationManager = new ConfigurationManager(); _communicationThread = new CommunicationThread(this, _configurationManager); _widgetWindowsManager = new WidgetWindowsManager(this, _mdiArea); _sessionSetupManager = new SessionSetupManager(this); _taskManager = new TaskManager(); // Setup status bar _statusBarIcon = new QLabel(); _statusBarLabel = new QLabel(); statusBar()->addPermanentWidget(_statusBarIcon); statusBar()->addWidget(_statusBarLabel); // Setup interactions // Setup main actions // Action connect _actionConnect = ui->mainToolBar->addAction(QIcon(":/images/connect.png"), tr("Connect to StarPU")); _actionConnect->setIconText("Connect to StarPU"); _actionConnect->setToolTip("Connect to StarPU"); _actionConnect->setShortcut(QKeySequence("Ctrl+C")); QToolButton *connectButton = (QToolButton*)ui->mainToolBar->widgetForAction(_actionConnect); connectButton->setPopupMode(QToolButton::InstantPopup); QObject::connect(_actionConnect, SIGNAL(triggered()), this, SLOT(on_actionConnect_triggered())); QAction *settingsAction = new QAction( "Edit connection settings", _actionConnect); settingsAction->setIcon(QIcon(":/images/preferences.png")); QObject::connect(settingsAction, SIGNAL(triggered()), this, SLOT(on_actionPreferences_triggered())); connectButton->addAction(settingsAction); ui->menu_starpu_top->addAction(_actionConnect); // Action launch _actionLaunch = ui->mainToolBar->addAction(QIcon(":/images/play.png"), tr("Launch StarPU")); _actionLaunch->setIconText("Launch StarPU"); _actionLaunch->setToolTip("Launch StarPU"); _actionLaunch->setShortcut(QKeySequence("Ctrl+L")); ui->menu_starpu_top->addAction(_actionLaunch); QObject::connect(_actionLaunch, SIGNAL(triggered()), this, SLOT(on_actionLaunch_StarPU_triggered())); ui->mainToolBar->addSeparator(); ui->menu_starpu_top->addSeparator(); // Action debug _actionDebug = ui->mainToolBar->addAction(QIcon(":/images/debugon.png"), tr("Enable debug")); _actionDebug->setIconText("Enable debug"); _actionDebug->setToolTip("Enable debug"); _actionDebug->setShortcut(QKeySequence("Ctrl+D")); _actionDebug->setCheckable(true); ui->menu_starpu_top->addAction(_actionDebug); QObject::connect(_actionDebug, SIGNAL(toggled(bool)), this, SLOT(on_actionDebug_triggered(bool))); // Action save session setup _actionSaveSessionSetup = ui->mainToolBar->addAction( QIcon(":/images/windows.png"), tr("Save session setup")); _actionSaveSessionSetup->setIconText("Save session setup"); _actionSaveSessionSetup->setToolTip("Save session setup"); _actionSaveSessionSetup->setShortcut(QKeySequence("Ctrl+S")); ui->menu_starpu_top->addAction(_actionSaveSessionSetup); QObject::connect(_actionSaveSessionSetup, SIGNAL(triggered()), this, SLOT(on_actionSaveSessionSetup_triggered())); // Action add data aggregator widget _actionAddDataAggregatorWidget = ui->mainToolBar->addAction(QIcon(":/images/widget.png"), tr("Add data aggregator widget")); _actionAddDataAggregatorWidget->setIconText("Add data aggregator widget"); _actionAddDataAggregatorWidget->setToolTip("Add data aggregator widget"); _actionAddDataAggregatorWidget->setShortcut(QKeySequence("Ctrl+G")); ui->menu_starpu_top->addAction(_actionAddDataAggregatorWidget); QObject::connect(_actionAddDataAggregatorWidget, SIGNAL(triggered()), this, SLOT(on_actionAddDataAggregatorWidget_triggered())); ui->mainToolBar->addSeparator(); ui->menu_starpu_top->addSeparator(); // Action quit QAction *actionQuit = ui->menu_starpu_top->addAction( QIcon(":/images/quit.png"), tr("Quit")); actionQuit->setIconText("Quit"); actionQuit->setToolTip("Quit"); QObject::connect(actionQuit, SIGNAL(triggered()), this, SLOT(on_actionQuit_triggered())); actionQuit->setShortcut(QKeySequence("Ctrl+Q")); _widgetsDisplayModesList = new QComboBox(ui->mainToolBar); _widgetsDisplayModesList->addItem(tr("Flying windows"), DISPLAY_FLYING_WINDOWS); _widgetsDisplayModesList->addItem(tr("MDI, normal"), DISPLAY_MDI_NORMAL); _widgetsDisplayModesList->setCurrentIndex(1); QObject::connect(_widgetsDisplayModesList, SIGNAL(currentIndexChanged(int)), this, SLOT(updateDataWidgetsDisplayMode(int))); ui->mainToolBar->addWidget(_widgetsDisplayModesList); // Init GUI components // Retrieve the central widget layout QGridLayout *centralLayout = (QGridLayout*) ui->centralWidget->layout(); // Install MDI area _mdiArea->setMinimumSize(500, 200); _mdiArea->addAction(_actionAddDataAggregatorWidget); _mdiArea->setContextMenuPolicy(Qt::ActionsContextMenu); _mdiArea->setEnabled(false); // Install gantt widget _ganttWidget = new GanttWidget(this, _taskManager); _ganttWidget->setMinimumSize(500, 200); // Install parameters dock _parametersDockScrollArea = new QScrollArea(); _parametersDockScrollArea->setMinimumSize(250, 250); _parametersDockScrollArea->setLayout(new QVBoxLayout()); ui->parametersDock->setWidget(_parametersDockScrollArea); // Install the gantt widget container and the gantt controllers QWidget *ganttContainer = new QWidget(); QGridLayout *ganttContainerLayout = new QGridLayout(); ganttContainer->setLayout(ganttContainerLayout); // Zoom controller QwtSlider *ganttZoom = new QwtSlider(ganttContainer, Qt::Vertical); ganttZoom->setRange(100.0, 20000.0, 1.0); ganttZoom->setValue(10000.0); QObject::connect(ganttZoom, SIGNAL(valueChanged(double)), _ganttWidget, SLOT(updateZoom(double))); // Time view controller _ganttTimeView = new QSpinBox(); _ganttTimeView->setRange(0, INT_MAX); _ganttTimeView->setAccelerated(true); QObject::connect(_ganttTimeView, SIGNAL(valueChanged(int)), _ganttWidget, SLOT(updateTimeView(int))); // Prevision line controller QwtSlider *ganttPrevLine = new QwtSlider(ganttContainer, Qt::Horizontal); ganttPrevLine->setRange(0, 100); ganttPrevLine->setValue(66.67); QObject::connect(ganttPrevLine, SIGNAL(valueChanged(double)), _ganttWidget, SLOT(updatePrevLine(double))); // Set gantt layouts QHBoxLayout *ganttBottom = new QHBoxLayout(); ganttBottom->addWidget(_ganttTimeView, 0); ganttBottom->addWidget(ganttPrevLine, 1); ganttContainerLayout->addWidget(_ganttWidget, 0, 0); ganttContainerLayout->addWidget(ganttZoom, 0, 1); ganttContainerLayout->addLayout(ganttBottom, 1, 0); // Install debug console _debugConsole = new DebugConsole(this); QObject::connect(_debugConsole, SIGNAL(stepped()), this, SLOT(debugStep())); _debugConsole->setVisible(false); // Install splitter _splitter = new QSplitter(Qt::Vertical); _splitter->setChildrenCollapsible(false); _splitter->setHandleWidth(5); _splitter->addWidget(_mdiArea); _splitter->addWidget(ganttContainer); _splitter->addWidget(_debugConsole); centralLayout->addWidget(_splitter, 0, 0); // Restore main window setup when a session setup is loaded QObject::connect(_sessionSetupManager, SIGNAL(mainWindowSetupLoaded(MainWindowSetup)), this, SLOT(sessionMainWindowSetupLoaded(MainWindowSetup))); // Restore parameters dock setup when a session setup is loaded QObject::connect(_sessionSetupManager, SIGNAL(parametersDockSetupLoaded(ParametersDockSetup)), this, SLOT(sessionParametersDockSetupLoaded(ParametersDockSetup))); // Restore widgets windows setup when a session setup is loaded QObject::connect( _sessionSetupManager, SIGNAL( widgetWindowsSetupLoaded( QList , QList )), this, SLOT( sessionWidgetWindowsSetupLoaded( QList , QList ))); // Init UI states _displayMode = DISPLAY_MDI_NORMAL; _connected = false; _ready = false; _running = false; _debug = false; // Init main window connexion status setConnected(false); // Load previously saved configuration _configurationManager->syncConfiguration(); } MainWindow::~MainWindow() { delete _statusBarLabel; delete _statusBarIcon; delete ui; delete _taskManager; } /* -------------------------------------------------------------------------- */ /* Events */ /* -------------------------------------------------------------------------- */ void MainWindow::changeEvent(QEvent *e) { QMainWindow::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } void MainWindow::closeEvent(QCloseEvent *ce) { int returned = -1; if (isRunning()) { returned = QMessageBox::question( this, tr("Quit StarPU-Top ?"), tr("StarPU-Top is currently monitoring.\n") + tr( "Do you really want to stop " "monitoring and exit the application ?"), QMessageBox::Ok | QMessageBox::Cancel); } else { _configurationManager->syncConfiguration(); qDebug() << "MainWindow : exiting the application"; qApp->quit(); // Exit the application } if (returned == QMessageBox::Ok) { if (_communicationThread->isRunning()) { _communicationThread->exit(0); qDebug() << "MainWindow : stopped communication thread"; } _configurationManager->syncConfiguration(); qDebug() << "MainWindow : exiting the application"; qApp->quit(); // exit application } else { ce->ignore(); // ignore close event } } void MainWindow::openSession() { bool ok; // (Re)initialize the tasks database _taskManager->initialize(); ok = _taskManager->connectDatabase(); Q_ASSERT_X(ok == true, "MainWindow::openSession()", "Couldn't connect to the tasks database !"); // Init time references _lockedTime = 0; // Possibly clear old session widgets clearWidgets(); // Enable the MDI area _mdiArea->setEnabled(true); // Install fresh data widgets for (int i = 0; i < _dataDescriptions->count(); i++) { if (_dataDescriptions->at(i)->widget != DATA_WIDGET_NONE) { DataWidget* dataWidget = addDataWidget(_dataDescriptions->at(i)); _widgetWindowsManager->displayWidgetWindow(dataWidget); } } // Install fresh interactive widgets for (int i = 0; i < _paramDescriptions->count(); i++) { if (_paramDescriptions->at(i)->widget != INTERACTIVE_WIDGET_NONE) { InteractiveWidget* interactiveWidget = addInteractiveWidget( _paramDescriptions->at(i)); displayInteractiveWidget(interactiveWidget); } } emit sessionOpened(); } void MainWindow::closeSession() { // Clear old data/params descriptions clearDescriptions(); // Disable the MDI area _mdiArea->setEnabled(false); // Update gantt time controller _ganttTimeView->setValue(effectiveRunningTime()); // Close the preferences dialog if open if (_preferencesDialog != 0) { _preferencesDialog->close(); } // Stop the communication thread if (_communicationThread->isRunning()) { _communicationThread->exit(0); qDebug() << "MainWindow : stopped communication thread"; } QMessageBox::information( this, tr("End of the session"), tr("The session has just finished (time running : ") + QString::number(runningTime()) + "ms, time locked : " + QString::number(lockedTime()) + "ms, time effectively running : " + QString::number( effectiveRunningTime()) + "ms)", QMessageBox::Ok); emit sessionClosed(); } void MainWindow::debugLock() { qDebug() << "MainWindow : locking session"; _currentLockTime.start(); setStatusBarIcon(":/images/lock.png"); setStatusBarMessage("Locked"); emit debugLocked(); } void MainWindow::debugStep() { qDebug() << "MainWindow : unlocking session"; _lockedTime += _currentLockTime.elapsed(); _currentLockTime = QTime(); _actionDebug->setEnabled(true); setStatusBarIcon(""); setStatusBarMessage("Running"); emit debugStepped(); } void MainWindow::sessionMainWindowSetupLoaded(MainWindowSetup mainWindowSetup) { qDebug() << "MainWindow : restoring main window setup from another session"; // Load geometry if (restoreGeometry(mainWindowSetup.geometry) == false) { qDebug() << "MainWindow : failed to restore main window geometry"; } // Load display mode setDisplayMode(mainWindowSetup.displayMode); } void MainWindow::sessionParametersDockSetupLoaded( ParametersDockSetup parametersDockSetup) { qDebug() << "MainWindow : " "restoring parameters dock setup from another session"; } void MainWindow::sessionWidgetWindowsSetupLoaded( QList dataWidgetsSetup, QList dataAggregatorWidgetsSetup) { qDebug() << "MainWindow : " "restoring widget windows setup from another session"; // Restore data widgets setup for (int i = 0; i < dataWidgetsSetup.count(); i++) { DataWidget *dataWidget = dataWidgetFromDataId( dataWidgetsSetup.at(i).dataId); if (dataWidget->isInside() != dataWidgetsSetup.at(i).inside) { dataWidget->setInside(dataWidgetsSetup.at(i).inside); if (dataWidget->isInside() == true) { _widgetWindowsManager->flyingWindowToMdi(dataWidget); } else { _widgetWindowsManager->mdiToFlyingWindow(dataWidget); } } if (dataWidget->isInside() == false) { dataWidget->restoreGeometry(dataWidgetsSetup.at(i).geometry); } else { dataWidget->parentWidget()->restoreGeometry( dataWidgetsSetup.at(i).geometry); } } // Restore data aggregator widgets setup for (int i = 0; i < dataAggregatorWidgetsSetup.count(); i++) { DataAggregatorWidget *dataAggregatorWidget = addDataAggregatorWidget( dataAggregatorWidgetsSetup.at(i).dataIds); _widgetWindowsManager->displayWidgetWindow(dataAggregatorWidget); if (dataAggregatorWidget->isInside() != dataAggregatorWidgetsSetup.at(i).inside) { dataAggregatorWidget->setInside( dataAggregatorWidgetsSetup.at(i).inside); if (dataAggregatorWidget->isInside() == true) { _widgetWindowsManager->flyingWindowToMdi(dataAggregatorWidget); } else { _widgetWindowsManager->mdiToFlyingWindow(dataAggregatorWidget); } } if (dataAggregatorWidget->isInside() == false) { dataAggregatorWidget ->restoreGeometry( dataAggregatorWidgetsSetup.at(i).geometry); } else { dataAggregatorWidget->parentWidget() ->restoreGeometry( dataAggregatorWidgetsSetup.at(i).geometry); } } } void MainWindow::protocolErrorCaught(QString errorMessage) { qDebug() << "MainWindow : protocol error caught (" + errorMessage + ")"; } void MainWindow::synchronizeSessionTime(qlonglong serverTimestamp) { qDebug() << "Synchronized with server reference timestamp (" << serverTimestamp << ")"; _referenceTimestamp = serverTimestamp; if (_preGoTimer.isNull()) { _preGoTimer.start(); } else { _preGoTimer.restart(); } } void MainWindow::initClient(QString serverID, QList *dataDescriptions, QList *paramDescriptions, QList *serverDevices) { _serverID = serverID; _dataDescriptions = dataDescriptions; _paramDescriptions = paramDescriptions; _serverDevices = serverDevices; setReady(true); // Display widget choices list in preferences dialog _preferencesDialog = new PreferencesDialog(this, _configurationManager, _sessionSetupManager, 1); emit preferencesDialogCreated(_widgetsDisplayModesList->currentIndex()); _preferencesDialog->setVisible(true); } /* -------------------------------------------------------------------------- */ /* Actions */ /* -------------------------------------------------------------------------- */ void MainWindow::connectionSucceeded() { qDebug() << "MainWindow : connected to server"; setConnected(true); } void MainWindow::connectionAborted(QString message) { QMessageBox::critical(this, "StarPU-Top", message, QMessageBox::Ok); setConnected(false); } void MainWindow::disconnected() { if (isRunning()) { setRunning(false); } if (isReady()) { setReady(false); } setConnected(false); qDebug() << "MainWindow : disconnected from server"; } void MainWindow::on_actionConnect_triggered() { setStatusBarMessage("Awaiting connection..."); _actionConnect->setEnabled(false); // Initiate connection to server _communicationThread->start(/*QThread::NormalPriority*/); _communicationThread->moveToThread(_communicationThread); } void MainWindow::on_actionLaunch_StarPU_triggered() { // Tell server to launch the session setRunning(true); emit clientLaunched(); } void MainWindow::on_actionDebug_triggered(bool enabled) { _actionDebug->setEnabled(false); _actionDebug->setToolTip("Waiting for the server's acknowledgement..."); _actionDebug->setIconText("Waiting for the server's acknowledgement..."); emit debugEnabled(enabled); } void MainWindow::on_actionSaveSessionSetup_triggered() { if (_sessionSetupManager->saveSessionSetup(_serverID) == true) { qDebug() << "MainWindow : session setup successfully saved"; statusBar()->showMessage(tr("Session setup successfully saved"),3000); } else { statusBar()->showMessage(tr("Couldn't save the session setup"),3000); } } void MainWindow::on_actionQuit_triggered() { close(); // Calls CloseEvent() } void MainWindow::on_actionAddDataAggregatorWidget_triggered() { AbstractWidgetWindow *widgetWindow = (AbstractWidgetWindow*) addDataAggregatorWidget(); _widgetWindowsManager->displayWidgetWindow(widgetWindow); } void MainWindow::on_actionPreferences_triggered() { int tabindex = (_connected ? 1 : 0); // Open preferences dialog _preferencesDialog = new PreferencesDialog(this, _configurationManager, _sessionSetupManager, tabindex); _preferencesDialog->setVisible(true); emit preferencesDialogCreated(_widgetsDisplayModesList->currentIndex()); } void MainWindow::on_actionAbout_triggered() { AboutDialog *aboutDialog = new AboutDialog(this); aboutDialog->setVisible(true); } /* -------------------------------------------------------------------------- */ /* Getters */ /* -------------------------------------------------------------------------- */ const QSplitter *MainWindow::splitter() const { return _splitter; } const QDockWidget *MainWindow::parametersDock() const { return ui->parametersDock; } const WidgetWindowsManager* MainWindow::widgetWindowsManager() const { return _widgetWindowsManager; } const ConfigurationManager* MainWindow::configurationManager() const { return _configurationManager; } const SessionSetupManager* MainWindow::sessionSetupManager() const { return _sessionSetupManager; } const TaskManager* MainWindow::taskManager() const { return _taskManager; } const QHash *MainWindow::dataWidgetNames() const { return &_dataWidgetNames; } const QHash > *MainWindow::dataWidgetPossibilities() const { return &_dataWidgetPossibilities; } const QHash *MainWindow::interactiveWidgetNames() const { return &_interactiveWidgetNames; } const QHash > *MainWindow::interactiveWidgetPossibilities() const { return &_interactiveWidgetPossibilities; } int MainWindow::nbDataWidgets() const { return _nbDataWidgets; } int MainWindow::nbInteractiveWidgets() const { return _nbInteractiveWidgets; } int MainWindow::nbDataAggregatorWidgets() const { return _nbDataAggregatorWidgets; } QString MainWindow::serverID() const { return _serverID; } const QList *MainWindow::dataDescriptions() const { return _dataDescriptions; } const QList *MainWindow::paramDescriptions() const { return _paramDescriptions; } bool MainWindow::isConnected() const { return _connected; } bool MainWindow::isReady() const { return _ready; } bool MainWindow::isRunning() const { return _running; } bool MainWindow::isDebugEnabled() const { return _debug; } DisplayMode MainWindow::displayMode() const { return _displayMode; } int MainWindow::effectiveRunningTime() const { if (_runningTime.isNull()) { return 0; } return _runningTime.elapsed() - (_lockedTime + currentLockTime()); } int MainWindow::runningTime() const { if (_runningTime.isNull()) { return 0; } return _runningTime.elapsed(); } int MainWindow::currentLockTime() const { if (_currentLockTime.isNull()) { return 0; } return _currentLockTime.elapsed(); } int MainWindow::lockedTime() const { return _lockedTime; } /* -------------------------------------------------------------------------- */ /* Setters */ /* -------------------------------------------------------------------------- */ void MainWindow::setStatusBarMessage(QString message) { if (_statusBarLabel != 0) { _statusBarLabel->setText(message); } } void MainWindow::updateStatusBarMessage(QString message) { setStatusBarMessage(message); } void MainWindow::setStatusBarIcon(QString iconFile) { if (_statusBarIcon != 0) { _statusBarIcon->setPixmap(QPixmap(iconFile)); } } void MainWindow::setConnected(bool connected) { _connected = connected; if (_connected == false) { Q_ASSERT_X(_ready == false && _running == false, "MainWindow::setConnected()", "MainWindow states hierarchy violated"); _actionConnect->setEnabled(true); _actionLaunch->setEnabled(false); _actionDebug->setEnabled(false); _actionSaveSessionSetup->setEnabled(false); _actionAddDataAggregatorWidget->setEnabled(false); setStatusBarMessage(tr("Disconnected")); } else { _actionConnect->setEnabled(false); setStatusBarMessage( tr("Connected (") + _configurationManager->serverHost() + ":" + QString::number(_configurationManager->serverPort()) + ")"); } } void MainWindow::setReady(bool ready) { _ready = ready; if (_ready == true) { Q_ASSERT_X(_connected == true, "MainWindow::setReady()", "MainWindow states hierarchy violated"); _actionLaunch->setEnabled(true); _actionDebug->setEnabled(true); _actionAddDataAggregatorWidget->setEnabled(true); setStatusBarMessage( tr("Connected and ready (") + _serverID + tr(" on ") + _configurationManager->serverHost() + ":" + QString::number(_configurationManager->serverPort()) + ")"); openSession(); _actionSaveSessionSetup->setEnabled(true); } else { Q_ASSERT_X(_running == false, "MainWindow::setReady()", "MainWindow states hierarchy violated"); _actionConnect->setEnabled(false); _actionLaunch->setEnabled(false); _actionDebug->setEnabled(false); _actionAddDataAggregatorWidget->setEnabled(false); setStatusBarMessage( tr("Connected (") + _configurationManager->serverHost() + ":" + QString::number(_configurationManager->serverPort()) + ")"); closeSession(); _actionSaveSessionSetup->setEnabled(false); } } void MainWindow::setRunning(bool running) { _running = running; if (running == true) { Q_ASSERT_X(_connected == true && _ready == true, "MainWindow::setRunning()", "MainWindow states hierarchy violated"); // Stop pre-running time and start running time _preGoTime = _preGoTimer.elapsed() + _referenceTimestamp; qDebug() << "Pre-Go time :" << _preGoTime; if (_runningTime.isNull()) { _runningTime.start(); } else { _runningTime.restart(); } _actionLaunch->setEnabled(false); setStatusBarMessage(tr("Running")); setWindowTitle( windowTitle() + " (" + _serverID + tr(" on ") + _configurationManager->serverHost() + ":" + QString::number(_configurationManager->serverPort()) + ")"); } else { _actionLaunch->setEnabled(true); setStatusBarMessage( tr("Connected and ready (") + _serverID + tr(" on ") + _configurationManager->serverHost() + ":" + QString::number(_configurationManager->serverPort()) + ")"); setWindowTitle(tr("StarPU-Top")); } } void MainWindow::setDebug(bool enabled) { _debug = enabled; _actionDebug->setEnabled(true); if (_debug == true) { qDebug() << "MainWindow : enabling debug mode"; _actionDebug->setIcon(QIcon(":/images/debugoff.png")); _actionDebug->setIconText("Disable debug"); _actionDebug->setText("Disable debug"); _actionDebug->setToolTip("Disable debug"); _debugConsole->setVisible(true); } else { qDebug() << "MainWindow : disabling debug mode"; _actionDebug->setIcon(QIcon(":/images/debugon.png")); _actionDebug->setIconText("Enable debug"); _actionDebug->setText("Enable debug"); _actionDebug->setToolTip("Enable debug"); _debugConsole->setVisible(false); } } void MainWindow::setDisplayMode(DisplayMode displayMode) { _displayMode = displayMode; switch (_displayMode) { case DISPLAY_FLYING_WINDOWS: _widgetWindowsManager->mdiToFlyingWindows(); break; case DISPLAY_MDI_NORMAL: _widgetWindowsManager->flyingWindowsToMdi(); break; } } void MainWindow::setDebugMessage(QString debugMessage) { if (isDebugEnabled() == true) { _debugConsole->appendDebugLogMessage(debugMessage); } else { qDebug() << "Debug message ignored (received while not in debug mode)"; } } void MainWindow::setDebugLock(QString debugLockMessage) { if (isDebugEnabled() == true) { debugLock(); _debugConsole->appendDebugLockMessage(debugLockMessage); } else { qDebug() << "Debug lock ignored (received while not in debug mode)"; } } /* -------------------------------------------------------------------------- */ /* Other methods */ /* -------------------------------------------------------------------------- */ void MainWindow::clearDescriptions() { clearDataDescriptions(); clearParamDescriptions(); } DataWidget* MainWindow::addDataWidget(DataDescription *dataDescription) { // Create new data widget following the description bool inside = (_displayMode == DISPLAY_FLYING_WINDOWS ? false : true); DataWidget *dataWidget = new DataWidget(dataDescription, _widgetWindowsManager, this, inside); _dataWidgets->append(QPointer (dataWidget)); _nbDataWidgets++; return dataWidget; } void MainWindow::clearWidgets() { clearDataWidgets(); clearInteractiveWidgets(); } void MainWindow::clearDataWidgets() { _widgetWindowsManager->closeWidgetWindows(); _dataWidgets->clear(); } void MainWindow::removeDestroyedDataWidgets() { // Clear all null data widget pointers in the data widgets list for (int i = 0; i < _dataWidgets->count(); i++) { if (_dataWidgets->at(i).isNull()) { _dataWidgets->removeAt(i); _nbDataWidgets--; } } } void MainWindow::clearDataDescriptions() { _dataDescriptions->clear(); } InteractiveWidget *MainWindow::addInteractiveWidget( ParamDescription *paramDescription) { // Add new interactive widget following the description InteractiveWidget *interactiveWidget = new InteractiveWidget( paramDescription, this); _interactiveWidgets->append( QPointer (interactiveWidget)); _nbInteractiveWidgets++; return interactiveWidget; } DataAggregatorWidget *MainWindow::addDataAggregatorWidget(QList dataIds) { bool inside = (_displayMode == DISPLAY_FLYING_WINDOWS ? false : true); DataAggregatorWidget *dataAggregatorWidget = new DataAggregatorWidget( _widgetWindowsManager, this, inside, dataIds); _dataAggregatorWidgets->append( QPointer (dataAggregatorWidget)); _nbDataAggregatorWidgets++; return dataAggregatorWidget; } void MainWindow::displayInteractiveWidget(InteractiveWidget *interactiveWidget) { // Display interactive widget in the dock widget QVBoxLayout* layout = (QVBoxLayout*) _parametersDockScrollArea->layout(); layout->addWidget(interactiveWidget); } void MainWindow::clearInteractiveWidgets() { qDebug() << "Closing all interactive widgets"; for (int i = 0; i < _interactiveWidgets->count(); i++) { _interactiveWidgets->at(i).data()->close(); } _interactiveWidgets->clear(); } void MainWindow::removeDestroyedInteractiveWidgets() { // Clear all null data widget pointers in the data widgets list for (int i = 0; i < _interactiveWidgets->count(); i++) { if (_interactiveWidgets->at(i).isNull()) { _interactiveWidgets->removeAt(i); _paramDescriptions->at(i)->widget = INTERACTIVE_WIDGET_NONE; _nbInteractiveWidgets--; } } } void MainWindow::clearParamDescriptions() { _paramDescriptions->clear(); } void MainWindow::removeDestroyedDataAggregatorWidgets() { // Clear all null data aggregator widget pointers in list for (int i = 0; i < _dataAggregatorWidgets->count(); i++) { if (_dataAggregatorWidgets->at(i).isNull()) { _dataAggregatorWidgets->removeAt(i); _nbDataAggregatorWidgets--; } } } /* -------------------------------------------------------------------------- */ /* Getters */ /* -------------------------------------------------------------------------- */ QString MainWindow::statusBarMessage() const { return _statusBarLabel->text(); } const QList > *MainWindow::dataWidgets() const { return _dataWidgets; } const QList > *MainWindow::interactiveWidgets() const { return _interactiveWidgets; } const QList > *MainWindow::dataAggregatorWidgets() const { return _dataAggregatorWidgets; } DataWidget *MainWindow::dataWidgetFromDataId(int dataId) { for (int i = 0; i < _dataWidgets->count(); i++) { if (_dataWidgets->at(i)->description()->id == dataId) return _dataWidgets->at(i); } return 0; } InteractiveWidget *MainWindow::interactiveWidgetFromParamId(int paramId) { for (int i = 0; i < _interactiveWidgets->count(); i++) { if (_interactiveWidgets->at(i)->description()->id == paramId) return _interactiveWidgets->at(i); } return 0; } DataDescription *MainWindow::dataDescriptionFromId(int dataId) { for (int i = 0; i < _dataDescriptions->count(); i++) { if (_dataDescriptions->at(i)->id == dataId) return _dataDescriptions->at(i); } return 0; } ParamDescription *MainWindow::paramDescriptionFromId(int paramId) { for (int i = 0; i < _paramDescriptions->count(); i++) { if (_paramDescriptions->at(i)->id == paramId) return _paramDescriptions->at(i); } return 0; } const QList *MainWindow::serverDevices() const { return _serverDevices; } /* -------------------------------------------------------------------------- */ /* Other methods */ /* -------------------------------------------------------------------------- */ void MainWindow::updateDataWidgetsDisplayMode(int index) { // Update the display mode setDisplayMode( (DisplayMode) _widgetsDisplayModesList->itemData(index).toInt()); } void MainWindow::updateDisplayModeIndex(int index) { // Update display mode choice index in the toolbar _widgetsDisplayModesList->setCurrentIndex(index); } void MainWindow::updateDataWidgetType(int dataId, DataWidgetType newWidget) { // Update the data widget description with type selected by user DataDescription *dataDescription = dataDescriptionFromId(dataId); if (dataDescription != 0) { DataWidgetType oldWidget = dataDescription->widget; dataDescription->widget = newWidget; qDebug() << "Data of id" << dataId << "changed widget type (old :" << oldWidget << " new:" << newWidget << ")"; DataWidget *dataWidget = dataWidgetFromDataId(dataId); if (newWidget == DATA_WIDGET_NONE && oldWidget != DATA_WIDGET_NONE) { // We have disabled this data emit dataDisabled(dataId); qDebug() << "Data of id has been" << dataId << "DISABLED"; _widgetWindowsManager->closeWidgetWindow(dataWidget); } else if (newWidget != DATA_WIDGET_NONE && oldWidget == DATA_WIDGET_NONE) { // We have enabled this data // The entire widget needs to be created _widgetWindowsManager->displayWidgetWindow( addDataWidget(dataDescriptionFromId(dataId))); emit dataEnabled(dataId); qDebug() << "Data of id has been" << dataId << "ENABLED"; } else if (newWidget != DATA_WIDGET_NONE && oldWidget != DATA_WIDGET_NONE) { // Neither disable nor enabled, just change of the widget // The widget just needs to redraw the internal data widget dataWidget->recreateInternalWidget(); } } } void MainWindow::updateInteractiveWidgetType(int paramId, InteractiveWidgetType newWidget) { ParamDescription *paramDescription = paramDescriptionFromId(paramId); if (paramDescription != 0) { InteractiveWidgetType oldWidget = paramDescription->widget; paramDescription->widget = newWidget; qDebug() << "Param of id" << paramId << "changed widget type (old :" << oldWidget << " new:" << newWidget << ")"; // The widget just needs to redraw the internal interactive widget InteractiveWidget *interactiveWidget = interactiveWidgetFromParamId( paramId); interactiveWidget->recreateInternalWidget(); } } /* -------------------------------------------------------------------------- */ /* Slots */ /* -------------------------------------------------------------------------- */ void MainWindow::updateInteractiveWidget(int interactiveWidgetId, bool value, qlonglong timestamp) { InteractiveWidget *interactiveWidget = interactiveWidgetFromParamId( interactiveWidgetId); if (interactiveWidget != 0) { qDebug() << "Updating interactive widget of id" << interactiveWidgetId << "updated with value" << value << "and timestamp" << timestamp; interactiveWidget->setValue(value); } else { qDebug() << "Trying to update inexistant interactive widget ! (id" << interactiveWidgetId << ")"; } } void MainWindow::updateInteractiveWidget(int interactiveWidgetId, int value, qlonglong timestamp) { InteractiveWidget *interactiveWidget = interactiveWidgetFromParamId( interactiveWidgetId); if (interactiveWidget != 0) { qDebug() << "Updating interactive widget of id" << interactiveWidgetId << "updated with value" << value << "and timestamp" << timestamp; interactiveWidget->setValue(value); } else { qDebug() << "Trying to update inexistant interactive widget ! (id" << interactiveWidgetId << ")"; } } void MainWindow::updateInteractiveWidget(int interactiveWidgetId, double value, qlonglong timestamp) { InteractiveWidget *interactiveWidget = interactiveWidgetFromParamId( interactiveWidgetId); if (interactiveWidget != 0) { qDebug() << "Updating interactive widget of id" << interactiveWidgetId << "updated with value" << value << "and timestamp" << timestamp; interactiveWidget->setValue(value); } else { qDebug() << "Trying to update inexistant interactive widget ! (id" << interactiveWidgetId << ")"; } } void MainWindow::updateTaskPrev(int taskId, int deviceId, qlonglong timestamp, qlonglong timestampStart, qlonglong timestampEnd) { _taskManager->addTaskPrev(taskId, deviceId, timestampStart - _preGoTime, timestampEnd - _preGoTime); } void MainWindow::updateTaskStart(int taskId, int deviceId, qlonglong timestamp) { _taskManager->addTaskStart(taskId, deviceId, timestamp - _preGoTime); } void MainWindow::updateTaskEnd(int taskId, qlonglong timestamp) { _taskManager->addTaskEnd(taskId, timestamp - _preGoTime); } void MainWindow::updateDataWidget(int dataWidgetId, bool value, qlonglong timestamp) { DataWidget *dataWidget = dataWidgetFromDataId(dataWidgetId); if (dataWidget != 0) { qDebug() << "MainWindow : updating data widget of id" << dataWidgetId << "with value" << value << "and timestamp" << timestamp; dataWidget->setValue(value); } else { qDebug() << "MainWindow : trying to update inexistant data widget ! (id" << dataWidgetId << ")"; } } void MainWindow::updateDataWidget(int dataWidgetId, int value, qlonglong timestamp) { DataWidget *dataWidget = dataWidgetFromDataId(dataWidgetId); if (dataWidget != 0) { qDebug() << "MainWindow : updating data widget of id" << dataWidgetId << "with value" << value << "and timestamp" << timestamp; dataWidget->setValue(value); } else { qDebug() << "MainWindow : trying to update inexistant data widget ! (id" << dataWidgetId << ")"; } } void MainWindow::updateDataWidget(int dataWidgetId, double value, qlonglong timestamp) { DataWidget *dataWidget = dataWidgetFromDataId(dataWidgetId); if (dataWidget != 0) { qDebug() << "MainWindow : updating data widget of id" << dataWidgetId << "with value" << value << "and timestamp" << timestamp; dataWidget->setValue(value); } else { qDebug() << "MainWindow : trying to update inexistant data widget ! (id" << dataWidgetId << ")"; } } void MainWindow::interactiveWidgetUpdated(int interactiveWidgetId, bool value) { qDebug() << "MainWindow : interactive widget of id" << interactiveWidgetId << "updated with value" << value; emit paramValueUpdated(interactiveWidgetId, value); } void MainWindow::interactiveWidgetUpdated(int interactiveWidgetId, int value) { qDebug() << "MainWindow : interactive widget of id" << interactiveWidgetId << "updated with value" << value; emit paramValueUpdated(interactiveWidgetId, value); } void MainWindow::interactiveWidgetUpdated(int interactiveWidgetId, double value) { qDebug() << "MainWindow : interactive widget of id" << interactiveWidgetId << "updated with value" << value; emit paramValueUpdated(interactiveWidgetId, value); } void MainWindow::initDataWidgetLists() { //Names _dataWidgetNames.insert(DATA_WIDGET_LCD, tr("Lcd")); _dataWidgetNames.insert(DATA_WIDGET_PLOT, tr("Plot")); _dataWidgetNames.insert(DATA_WIDGET_LEVEL, tr("Level")); _dataWidgetNames.insert(DATA_WIDGET_LED, tr("Led")); _dataWidgetNames.insert(DATA_WIDGET_DIAL, tr("Dial")); _dataWidgetNames.insert(DATA_WIDGET_NONE, tr("")); // Sets of widgets for each type // Bool _dataBoolWidgets.insert(DATA_WIDGET_LED); // Int _dataIntWidgets.insert(DATA_WIDGET_LCD); _dataIntWidgets.insert(DATA_WIDGET_PLOT); _dataIntWidgets.insert(DATA_WIDGET_LEVEL); _dataIntWidgets.insert(DATA_WIDGET_DIAL); // Float _dataFloatWidgets.insert(DATA_WIDGET_LCD); _dataFloatWidgets.insert(DATA_WIDGET_PLOT); _dataFloatWidgets.insert(DATA_WIDGET_LEVEL); _dataFloatWidgets.insert(DATA_WIDGET_DIAL); // Associate a type to widget possibilities _dataWidgetPossibilities.insert(DATA_TYPE_BOOL, _dataBoolWidgets); _dataWidgetPossibilities.insert(DATA_TYPE_INT, _dataIntWidgets); _dataWidgetPossibilities.insert(DATA_TYPE_FLOAT, _dataFloatWidgets); } void MainWindow::initInteractiveWidgetLists() { _interactiveWidgetNames.insert(INTERACTIVE_WIDGET_SLIDER, tr("Slider")); _interactiveWidgetNames.insert(INTERACTIVE_WIDGET_KNOB, tr("Knob")); _interactiveWidgetNames.insert(INTERACTIVE_WIDGET_WHEEL, tr("Wheel")); _interactiveWidgetNames.insert(INTERACTIVE_WIDGET_CHECKBOX, tr("Checkbox")); _interactiveWidgetNames.insert(INTERACTIVE_WIDGET_SPINBOX, tr("Spinbox")); _interactiveWidgetNames.insert(INTERACTIVE_WIDGET_DOUBLESPINBOX, tr("Double Spinbox")); _interactiveWidgetNames.insert(INTERACTIVE_WIDGET_DIAL, tr("Dial")); _interactiveWidgetNames.insert(INTERACTIVE_WIDGET_COMBOBOX, tr("Combobox")); _interactiveWidgetNames.insert(INTERACTIVE_WIDGET_NONE, tr("")); // Sets of widgets for each type // Bool _paramBoolWidgets.insert(INTERACTIVE_WIDGET_CHECKBOX); // Int _paramIntWidgets.insert(INTERACTIVE_WIDGET_SLIDER); _paramIntWidgets.insert(INTERACTIVE_WIDGET_KNOB); _paramIntWidgets.insert(INTERACTIVE_WIDGET_WHEEL); _paramIntWidgets.insert(INTERACTIVE_WIDGET_SPINBOX); _paramIntWidgets.insert(INTERACTIVE_WIDGET_DIAL); // Float _paramFloatWidgets.insert(INTERACTIVE_WIDGET_SLIDER); _paramFloatWidgets.insert(INTERACTIVE_WIDGET_KNOB); _paramFloatWidgets.insert(INTERACTIVE_WIDGET_WHEEL); _paramFloatWidgets.insert(INTERACTIVE_WIDGET_DOUBLESPINBOX); _paramFloatWidgets.insert(INTERACTIVE_WIDGET_DIAL); // Enum _paramEnumWidgets.insert(INTERACTIVE_WIDGET_COMBOBOX); // Associate a type to widget possibilities _interactiveWidgetPossibilities.insert(PARAM_TYPE_BOOL, _paramBoolWidgets); _interactiveWidgetPossibilities.insert(PARAM_TYPE_INT, _paramIntWidgets); _interactiveWidgetPossibilities.insert(PARAM_TYPE_FLOAT, _paramFloatWidgets); _interactiveWidgetPossibilities.insert(PARAM_TYPE_ENUM, _paramEnumWidgets); } starpu-1.2.3+dfsg/starpu-top/mainwindow.h000066400000000000000000000245131320135501600204160ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef MAINWINDOW_H #define MAINWINDOW_H class GanttWidget; class PreferencesDialog; class DebugConsole; class AbstractWidgetWindow; class DataWidget; class DataAggregatorWidget; class InteractiveWidget; class CommunicationThread; class ConfigurationManager; class WidgetWindowsManager; class SessionSetupManager; class TaskManager; #include #include #include #include #include #include #include #include #include #include #include "starpu_top_types.h" namespace Ui { class MainWindow; } class MainWindow: public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); // Getters // Get GUI components const QSplitter *splitter() const; const QDockWidget *parametersDock() const; // Get managers const WidgetWindowsManager* widgetWindowsManager() const; const ConfigurationManager* configurationManager() const; const SessionSetupManager* sessionSetupManager() const; const TaskManager* taskManager() const; // Get different descriptions for the current session QString serverID() const; const QList *dataDescriptions() const; const QList *paramDescriptions() const; DataDescription *dataDescriptionFromId(int dataId); ParamDescription *paramDescriptionFromId(int interactiveId); const QList *serverDevices() const; // Get different widgets metadata const QHash *dataWidgetNames() const; const QHash > *dataWidgetPossibilities() const; const QHash *interactiveWidgetNames() const; const QHash > *interactiveWidgetPossibilities() const; // Get the actual widgets const QList > *dataWidgets() const; const QList > *dataAggregatorWidgets() const; const QList > *interactiveWidgets() const; DataWidget *dataWidgetFromDataId(int id); InteractiveWidget *interactiveWidgetFromParamId(int id); // Get widgets counts int nbDataWidgets() const; int nbDataAggregatorWidgets() const; int nbInteractiveWidgets() const; // Get GUI states bool isConnected() const; bool isReady() const; bool isRunning() const; bool isDebugEnabled() const; DisplayMode displayMode() const; // Get effective session time int effectiveRunningTime() const; // Add new widgets to the session DataWidget *addDataWidget(DataDescription *dataDescription); DataAggregatorWidget *addDataAggregatorWidget( QList dataIds = QList ()); InteractiveWidget *addInteractiveWidget(ParamDescription *paramDescription); protected: // Events void changeEvent(QEvent *e); void closeEvent(QCloseEvent *e); private: // GUI components Ui::MainWindow *ui; QComboBox *_widgetsDisplayModesList; QSplitter *_splitter; QMdiArea *_mdiArea; GanttWidget *_ganttWidget; QSpinBox *_ganttTimeView; QScrollArea *_parametersDockScrollArea; DebugConsole *_debugConsole; QLabel *_statusBarIcon; QLabel *_statusBarLabel; PreferencesDialog *_preferencesDialog; QList > *_dataWidgets; QList > *_dataAggregatorWidgets; QList > *_interactiveWidgets; // Managers ConfigurationManager *_configurationManager; CommunicationThread *_communicationThread; // Will instantiate the communication manager WidgetWindowsManager *_widgetWindowsManager; SessionSetupManager *_sessionSetupManager; TaskManager *_taskManager; // GUI states DisplayMode _displayMode; bool _connected; bool _ready; bool _running; bool _debug; // GUI actions QAction *_actionConnect; QAction *_actionLaunch; QAction *_actionDebug; QAction *_actionSaveSessionSetup; QAction *_actionAddDataWidget; QAction *_actionAddDataAggregatorWidget; // Widgets metadata QHash _dataWidgetNames; QSet _dataBoolWidgets, _dataIntWidgets, _dataFloatWidgets; QHash > _dataWidgetPossibilities; QHash _interactiveWidgetNames; QSet _paramBoolWidgets, _paramIntWidgets, _paramFloatWidgets, _paramEnumWidgets; QHash > _interactiveWidgetPossibilities; // Session metadata QString _serverID; qlonglong _referenceTimestamp; // Different descriptions QList *_dataDescriptions; QList *_paramDescriptions; QList *_serverDevices; int _nbDataWidgets; int _nbDataAggregatorWidgets; int _nbInteractiveWidgets; // Time references QTime _preGoTimer; int _preGoTime; QTime _runningTime; QTime _currentLockTime; int _lockedTime; // Get the current status bar message QString statusBarMessage() const; // Get the current session running time int runningTime() const; int currentLockTime() const; int lockedTime() const; /** SLOTS **/ private slots: // Actions on GUI void on_actionConnect_triggered(); void on_actionLaunch_StarPU_triggered(); void on_actionSaveSessionSetup_triggered(); void on_actionDebug_triggered(bool enabled); void on_actionQuit_triggered(); void on_actionPreferences_triggered(); void on_actionAbout_triggered(); void on_actionAddDataAggregatorWidget_triggered(); // Setters // Set GUI states void setConnected(bool connected); void setReady(bool ready); void setRunning(bool running); void setDebug(bool enabled); void setDisplayMode(DisplayMode displayMode); // Other methods void initDataWidgetLists(); void initInteractiveWidgetLists(); void displayInteractiveWidget(InteractiveWidget *interactiveWidget); void removeDestroyedDataWidgets(); void removeDestroyedInteractiveWidgets(); void removeDestroyedDataAggregatorWidgets(); void clearDescriptions(); void clearDataDescriptions(); void clearParamDescriptions(); void clearWidgets(); void clearDataWidgets(); void clearInteractiveWidgets(); void openSession(); void closeSession(); void setStatusBarIcon(QString iconFile); void setStatusBarMessage(QString message); void debugLock(); void debugStep(); void sessionMainWindowSetupLoaded(MainWindowSetup mainWindowSetup); void sessionParametersDockSetupLoaded( ParametersDockSetup parametersDockSetup); void sessionWidgetWindowsSetupLoaded( QList dataWidgetsSetup, QList dataAggregatorWidgetsSetup); public slots: void synchronizeSessionTime(qlonglong serverTimestamp); void initClient(QString serverID, QList *dataDescriptions, QList *paramDescriptions, QList *serverDevices); // Connection events handlers void connectionSucceeded(); void connectionAborted(QString message); void disconnected(); // GUI updates void updateDataWidgetsDisplayMode(int index); void updateDisplayModeIndex(int index); void updateDataWidgetType(int dataId, DataWidgetType newWidget); void updateInteractiveWidgetType(int paramId, InteractiveWidgetType newWidget); void updateStatusBarMessage(QString message); // Responses to protocol messages void protocolErrorCaught(QString errorMessage); // Debug void setDebugMessage(QString debugMessage); void setDebugLock(QString debugLockMessage); // Incoming widget update messages void updateDataWidget(int dataWidgetId, bool value, qlonglong timestamp); void updateDataWidget(int dataWidgetId, int value, qlonglong timestamp); void updateDataWidget(int dataWidgetId, double value, qlonglong timestamp); void updateInteractiveWidget(int interactiveWidgetId, bool value, qlonglong timestamp); void updateInteractiveWidget(int interactiveWidgetId, int value, qlonglong timestamp); void updateInteractiveWidget(int interactiveWidgetId, double value, qlonglong timestamp); // Incoming task update messages void updateTaskPrev(int taskId, int deviceId, qlonglong timestamp, qlonglong timestampStart, qlonglong timestampEnd); void updateTaskStart(int taskId, int deviceId, qlonglong timestamp); void updateTaskEnd(int taskId, qlonglong timestamp); // Outgoing widget update messages void interactiveWidgetUpdated(int interactiveWidgetId, bool value); void interactiveWidgetUpdated(int interactiveWidgetId, int value); void interactiveWidgetUpdated(int interactiveWidgetId, double value); /** SIGNALS **/ signals: void preferencesDialogCreated(int); void sessionOpened(); void sessionClosed(); void clientLaunched(); void dataEnabled(int dataId); void dataDisabled(int dataId); void paramValueUpdated(int paramId, bool paramValue); void paramValueUpdated(int paramId, int paramValue); void paramValueUpdated(int paramId, double paramValue); void debugEnabled(bool enabled); void debugStepped(); void debugLocked(); }; #endif // MAINWINDOW_H starpu-1.2.3+dfsg/starpu-top/mainwindow.ui000066400000000000000000000130741320135501600206040ustar00rootroot00000000000000 MainWindow 0 0 987 700 0 0 StarPU-Top :/images/starpu_top.png:/images/starpu_top.png 1 6 0 0 987 21 StarPU-Top ? Settings Toolbar false Qt::TopToolBarArea false TopToolBarArea false 60 38 Qt::DefaultContextMenu QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable Parameters 2 :/images/connect.png:/images/connect.png Connect to StarPU Ctrl+C false :/images/play.png:/images/play.png Launch StarPU Ctrl+L :/images/quit.png:/images/quit.png Quit Ctrl+Q :/images/help.png:/images/help.png Help Ctrl+H :/images/about.png:/images/about.png About StarPU-Top... :/images/preferences.png:/images/preferences.png Preferences Ctrl+P false :/images/debugon.png:/images/debugon.png Enable Debug starpu-1.2.3+dfsg/starpu-top/preferencesdialog.cpp000066400000000000000000000427521320135501600222630ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "preferencesdialog.h" #include "ui_preferencesdialog.h" #include "mainwindow.h" #include "configurationmanager.h" #include "sessionsetupmanager.h" #include #include #include const QString DEFAULT_SESSION_SETUP_NAME = ""; PreferencesDialog::PreferencesDialog(MainWindow *mainWindow, ConfigurationManager *configurationManager, SessionSetupManager *sessionSetupManger, int activeTab) : QDialog(mainWindow), ui(new Ui::PreferencesDialog) { ui->setupUi(this); _mainWindow = mainWindow; _configurationManager = configurationManager; _sessionSetupManager = sessionSetupManger; _dataWidgetNames = _mainWindow->dataWidgetNames(); _dataWidgetPossibilities = _mainWindow->dataWidgetPossibilities(); _interactiveWidgetNames = _mainWindow->interactiveWidgetNames(); _interactiveWidgetPossibilities = _mainWindow->interactiveWidgetPossibilities(); ui->ipEdit->setText(_configurationManager->serverHost()); ui->portEdit->setValue(_configurationManager->serverPort()); ui->commandEdit->setText(_configurationManager->commandLine()); ui->connectionSSHGroupBox->setChecked(_configurationManager); ui->antialiasingCheckBox->setChecked(_configurationManager->antialiasing()); ui->displayModeComboBox->addItem(tr("Flying windows"), DISPLAY_FLYING_WINDOWS); ui->displayModeComboBox->addItem(tr("MDI, normal"), DISPLAY_MDI_NORMAL); ui->preferencesTab->setCurrentIndex(activeTab); // Synchronize display mode indexes with the main window's toolbar QObject::connect(_mainWindow, SIGNAL(preferencesDialogCreated(int)), this, SLOT(updateDisplayModeIndex(int))); QObject::connect(ui->displayModeComboBox, SIGNAL(currentIndexChanged(int)), _mainWindow, SLOT(updateDisplayModeIndex(int))); // Synchronize descriptions setup when session setup is loaded QObject::connect( _mainWindow->sessionSetupManager(), SIGNAL( descriptionsSetupLoaded(QList , QList )), this, SLOT( sessionDescriptionsSetupLoaded( QList , QList ))); // Synchronize main window setup when session setup is loaded QObject::connect(_mainWindow->sessionSetupManager(), SIGNAL(mainWindowSetupLoaded(MainWindowSetup)), this, SLOT(sessionMainWindowSetupLoaded(MainWindowSetup))); if (_mainWindow->isConnected()) { ui->connectionServerGroupBox->setEnabled(false); } if (_mainWindow->isReady() == false) { ui->displayWidgetsGroupBox->setEnabled(false); } displayWidgetPreferences(); displaySessionSetupsList(); } PreferencesDialog::~PreferencesDialog() { delete ui; } void PreferencesDialog::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } void PreferencesDialog::closeEvent(QCloseEvent *ce) { _configurationManager->setServerHost(ui->ipEdit->text()); _configurationManager->setServerPort(ui->portEdit->value()); _configurationManager->setCommandLine(ui->commandEdit->text()); _configurationManager->setAntialiasing( ui->antialiasingCheckBox->isChecked()); _configurationManager->setSSH(ui->connectionSSHGroupBox->isChecked()); ce->accept(); } void PreferencesDialog::displayWidgetPreferences() { // Read data descriptions for (int i = 0; i < _mainWindow->dataDescriptions()->count(); i++) { DataDescription *dataDescription = _mainWindow->dataDescriptions()->at( i); // Init UI QGridLayout *layout = (QGridLayout*) ui->dataWidgetsGroupBox->layout(); layout->addWidget(new QLabel(dataDescription->descriptionString), i, 0, Qt::AlignHCenter); QComboBox *dataWidgetList = new QComboBox(); dataWidgetList->setMinimumWidth(100); // Init list int dataId = dataDescription->id; DataType dataType = dataDescription->type; DataWidgetListItemData dataStruct; dataStruct.id = dataId; QVariant data; QList < DataWidgetType > dataWidgetPossibilities = _dataWidgetPossibilities->value(dataType).values(); int currentDataWidgetIndex; for (int j = 0; j < dataWidgetPossibilities.count(); j++) { DataWidgetType widget = dataWidgetPossibilities.at(j); if (widget == dataDescription->widget) { currentDataWidgetIndex = j; } dataStruct.widget = widget; data.setValue(dataStruct); dataWidgetList->addItem(_dataWidgetNames->value(widget), data); } // Last item : MUST be DATA_WIDGET_NONE dataStruct.widget = DATA_WIDGET_NONE; data.setValue(dataStruct); dataWidgetList->addItem( _dataWidgetNames->value(DATA_WIDGET_NONE), data); // Init index if (dataDescription->widget == DATA_WIDGET_NONE) { // NONE is the last item dataWidgetList->setCurrentIndex(dataWidgetList->count() - 1); } else { dataWidgetList->setCurrentIndex(currentDataWidgetIndex); } QObject::connect(dataWidgetList, SIGNAL(currentIndexChanged(int)), this, SLOT(updateDataWidgetType(int))); _dataWidgetListComboBoxes.append(dataWidgetList); layout->addWidget(dataWidgetList, i, 1, Qt::AlignHCenter); } // Param descriptions for (int i = 0; i < _mainWindow->paramDescriptions()->count(); i++) { ParamDescription *paramDescription = _mainWindow->paramDescriptions()->at(i); QGridLayout *layout = (QGridLayout*) ui->interactiveWidgetsGroupBox->layout(); layout->addWidget(new QLabel(paramDescription->descriptionString), i, 0, Qt::AlignHCenter); QComboBox *interactiveWidgetList = new QComboBox(); interactiveWidgetList->setMinimumWidth(100); // Init list int paramId = paramDescription->id; ParamType paramType = paramDescription->type; InteractiveWidgetListItemData dataStruct; dataStruct.id = paramId; QVariant data; QList < InteractiveWidgetType > interactiveWidgetPossibilities = _interactiveWidgetPossibilities->value(paramType).values(); int currentInteractiveWidgetIndex; for (int j = 0; j < interactiveWidgetPossibilities.count(); j++) { InteractiveWidgetType widget = interactiveWidgetPossibilities.at(j); if (widget == paramDescription->widget) { currentInteractiveWidgetIndex = j; } dataStruct.widget = widget; data.setValue(dataStruct); interactiveWidgetList->addItem( _interactiveWidgetNames->value(widget), data); } // Init index interactiveWidgetList->setCurrentIndex(currentInteractiveWidgetIndex); QObject::connect(interactiveWidgetList, SIGNAL(currentIndexChanged(int)), this, SLOT(updateInteractiveWidgetType(int))); _interactiveWidgetListComboBoxes.append(interactiveWidgetList); layout->addWidget(interactiveWidgetList, i, 1, Qt::AlignHCenter); } } void PreferencesDialog::displaySessionSetupsList() { // Default session setup must be the first index ui->loadSessionSetupComboBox->addItem(DEFAULT_SESSION_SETUP_NAME); QDir sessionSetupsDir = QDir(SESSION_SETUPS_DIR); QStringList filter; filter << "*" + SESSION_SETUPS_FILEEXT; sessionSetupsDir.setNameFilters(filter); sessionSetupsDir.setSorting(QDir::Time); QStringList sessionSetupFiles = sessionSetupsDir.entryList(); QStringList sessionSetupNames; for (int i = 0; i < sessionSetupFiles.count(); i++) { QString sessionSetupFile = sessionSetupFiles.at(i); QString sessionSetupName = sessionSetupFile; sessionSetupName.chop(SESSION_SETUPS_FILEEXT.size()); sessionSetupNames.append(sessionSetupName); } ui->loadSessionSetupComboBox->addItems(sessionSetupNames); ui->loadSessionSetupComboBox->setCurrentIndex(0); QObject::connect(ui->loadSessionSetupComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(loadSessionSetup(QString))); } void PreferencesDialog::updateDisplayModeIndex(int index) { ui->displayModeComboBox->setCurrentIndex(index); } void PreferencesDialog::updateDataWidgetType(int index) { QComboBox *dataWidgetList = (QComboBox*) QObject::sender(); QVariant data = dataWidgetList->itemData(index, Qt::UserRole); DataWidgetListItemData dataStruct; Q_ASSERT_X(data.canConvert () == true, "PreferencesDialog::updateDataWidgetType()", "Data extraction from QVariant failed !"); dataStruct = data.value (); int dataId = dataStruct.id; DataWidgetType newWidget = dataStruct.widget; _mainWindow->updateDataWidgetType(dataId, newWidget); } void PreferencesDialog::updateInteractiveWidgetType(int index) { QComboBox *interactiveWidgetList = (QComboBox*) QObject::sender(); QVariant data = interactiveWidgetList->itemData(index, Qt::UserRole); InteractiveWidgetListItemData dataStruct; Q_ASSERT_X(data.canConvert () == true, "PreferencesDialog::updateInteractiveWidgetType()", "Data extraction from QVariant failed !"); dataStruct = data.value (); int paramId = dataStruct.id; InteractiveWidgetType newWidget = dataStruct.widget; _mainWindow->updateInteractiveWidgetType(paramId, newWidget); } void PreferencesDialog::loadSessionSetup(QString sessionSetupName) { if (sessionSetupName.compare(DEFAULT_SESSION_SETUP_NAME) == 0) { qDebug() << "PreferencesDialog : loading default session setup"; // Load default data widgets loadDefaultDataWidgets(); // Load default interactive widgets loadDefaultInteractiveWidgets(); } else { qDebug() << "PreferencesDialog : loading session setup" << sessionSetupName; if (_sessionSetupManager->loadSessionSetup(sessionSetupName) == true) { qDebug() << "PreferencesDialog : loaded session setup successfully"; } else { QMessageBox::warning(this, tr("StarPU-Top"), tr("Couldn't load the session setup !"), QMessageBox::Ok); QComboBox *comboBox = (QComboBox*) QObject::sender(); int indexToRemove = comboBox->currentIndex(); comboBox->setCurrentIndex(0); comboBox->removeItem(indexToRemove); } } } void PreferencesDialog::loadDefaultDataWidgets() { for (int i = 0; i < _dataWidgetListComboBoxes.count(); i++) { for (int j = 0; _dataWidgetListComboBoxes.at(i)->count(); j++) { Q_ASSERT_X( _dataWidgetListComboBoxes.at(i)->itemData(j). canConvert< DataWidgetListItemData> () == true, "PreferencesDialog::loadSessionSetup()", "Data extraction from QVariant failed !"); DataWidgetListItemData dataStruct = _dataWidgetListComboBoxes.at(i)->itemData(j).value< DataWidgetListItemData> (); if (dataStruct.widget == DEFAULT_DATA_WIDGET_BOOL || dataStruct.widget == DEFAULT_DATA_WIDGET_INT || dataStruct.widget == DEFAULT_DATA_WIDGET_FLOAT) { _dataWidgetListComboBoxes.at(i)->setCurrentIndex(j); break; } } } } void PreferencesDialog::loadDefaultInteractiveWidgets() { for (int i = 0; i < _interactiveWidgetListComboBoxes.count(); i++) { for (int j = 0; _interactiveWidgetListComboBoxes.at(i)->count(); j++) { Q_ASSERT_X( _interactiveWidgetListComboBoxes. at(i)->itemData(j). canConvert< InteractiveWidgetListItemData> () == true, "PreferencesDialog::loadSessionSetup()", "Data extraction from QVariant failed !"); InteractiveWidgetListItemData dataStruct = _interactiveWidgetListComboBoxes.at(i) ->itemData(j).value< InteractiveWidgetListItemData> (); if (dataStruct.widget == DEFAULT_INTERACTIVE_WIDGET_BOOL || dataStruct.widget == DEFAULT_INTERACTIVE_WIDGET_INT || dataStruct.widget == DEFAULT_INTERACTIVE_WIDGET_FLOAT || dataStruct.widget == DEFAULT_INTERACTIVE_WIDGET_ENUM) { _interactiveWidgetListComboBoxes.at(i)->setCurrentIndex(j); break; } } } } void PreferencesDialog::sessionDescriptionsSetupLoaded( QList dataDescriptionsSetup, QList paramDescriptionsSetup) { qDebug() << "PreferencesDialog : " "restoring descriptions setup from another session"; // Load data descriptions setup for (int i = 0; i < dataDescriptionsSetup.count(); i++) { // The comboboxes are created following the order of the descriptions int newIndex = indexOfDataWidget(_dataWidgetListComboBoxes.at(i), dataDescriptionsSetup.at(i).widget); Q_ASSERT_X(newIndex != -1, "PreferencesDialog::sessionSetupLoaded()", "Couldn't find loaded data widget index in the list !"); _dataWidgetListComboBoxes.at(i)->setCurrentIndex(newIndex); } // Load param descriptions setup for (int i = 0; i < paramDescriptionsSetup.count(); i++) { // The comboboxes are created following the order of the descriptions int newIndex = indexOfInteractiveWidget( _interactiveWidgetListComboBoxes.at(i), paramDescriptionsSetup.at(i).widget); Q_ASSERT_X(newIndex != -1, "PreferencesDialog::sessionSetupLoaded()", "Couldn't find loaded interactive widget index in the list !"); _interactiveWidgetListComboBoxes.at(i)->setCurrentIndex(newIndex); } } void PreferencesDialog::sessionMainWindowSetupLoaded( MainWindowSetup mainWindowSetup) { if (_mainWindow->displayMode() != mainWindowSetup.displayMode) { for (int i = 0; i < ui->displayModeComboBox->count(); i++) { DisplayMode displayMode = (DisplayMode) ui->displayModeComboBox ->itemData(i).toInt(); if (displayMode == mainWindowSetup.displayMode) { ui->displayModeComboBox->setCurrentIndex(i); return; } } } } // Util methods int PreferencesDialog::indexOfDataWidget(QComboBox* dataWidgetList, DataWidgetType widget) { for (int i = 0; dataWidgetList->count(); i++) { Q_ASSERT_X( dataWidgetList->itemData(i) . canConvert () == true, "PreferencesDialog::indexOfDataWidget()", "Data extraction from QVariant failed !"); DataWidgetListItemData dataStruct = dataWidgetList->itemData(i).value< DataWidgetListItemData> (); if (dataStruct.widget == widget) { return i; } } return -1; } int PreferencesDialog::indexOfInteractiveWidget( QComboBox* interactiveWidgetList, InteractiveWidgetType widget) { for (int i = 0; interactiveWidgetList->count(); i++) { Q_ASSERT_X( interactiveWidgetList->itemData(i). canConvert< InteractiveWidgetListItemData> () == true, "PreferencesDialog::indexOfInteractiveWidget()", "Data extraction from QVariant failed !"); InteractiveWidgetListItemData dataStruct = interactiveWidgetList->itemData(i).value< InteractiveWidgetListItemData> (); if (dataStruct.widget == widget) { return i; } } return -1; } starpu-1.2.3+dfsg/starpu-top/preferencesdialog.h000066400000000000000000000064321320135501600217230ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PREFERENCESDIALOG_H #define PREFERENCESDIALOG_H class MainWindow; class ConfigurationManager; class SessionSetupManager; #include #include #include #include "starpu_top_types.h" namespace Ui { class PreferencesDialog; } class PreferencesDialog: public QDialog { /* The preferences panel of the application. Each type of preferences is in a different tab. */ Q_OBJECT public: explicit PreferencesDialog(MainWindow *mainWindow, ConfigurationManager *configurationManager, SessionSetupManager *sessionSetupManger, int activeTab = 0); ~PreferencesDialog(); protected: // Events void changeEvent(QEvent *e); void closeEvent(QCloseEvent *ce); private: // GUI components Ui::PreferencesDialog *ui; QList _dataWidgetListComboBoxes; QList _interactiveWidgetListComboBoxes; // Components MainWindow *_mainWindow; ConfigurationManager *_configurationManager; SessionSetupManager *_sessionSetupManager; // Metadata const QHash *_dataWidgetNames; const QHash > *_dataWidgetPossibilities; const QHash *_interactiveWidgetNames; const QHash > *_interactiveWidgetPossibilities; // Util methods int indexOfDataWidget(QComboBox* dataWidgetList, DataWidgetType widget); int indexOfInteractiveWidget(QComboBox* interactiveWidgetList, InteractiveWidgetType widget); private slots: // Other methods void displayWidgetPreferences(); void displaySessionSetupsList(); void updateDisplayModeIndex(int index); void updateDataWidgetType(int index); void updateInteractiveWidgetType(int index); void loadSessionSetup(QString fileName); void loadDefaultDataWidgets(); void loadDefaultInteractiveWidgets(); void sessionDescriptionsSetupLoaded( QList dataDescriptionsSetup, QList paramDescriptionsSetup); void sessionMainWindowSetupLoaded(MainWindowSetup mainWindowSetup); }; // Model structs for the widget choice comboboxes Q_DECLARE_METATYPE( DataWidgetListItemData) Q_DECLARE_METATYPE(InteractiveWidgetListItemData) #endif // PREFERENCESDIALOG_H starpu-1.2.3+dfsg/starpu-top/preferencesdialog.ui000066400000000000000000000215701320135501600221110ustar00rootroot00000000000000 PreferencesDialog 0 0 387 490 0 0 Preferences :/images/preferences.png:/images/preferences.png true 250 0 0 Connection Server settings Port IP Address 127.0.0.1 true 1024 65535 2011 SSH true false Command Line ssh -L Display Widgets true 0 0 100 51 true 0 0 16777215 16777215 Data widgets false false true 0 0 130 51 Interactive widgets Load a session setup General Display mode Enable antialiasing true starpu-1.2.3+dfsg/starpu-top/qledindicator/000077500000000000000000000000001320135501600207065ustar00rootroot00000000000000starpu-1.2.3+dfsg/starpu-top/qledindicator/qledindicator.cpp000066400000000000000000000063221320135501600242370ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2010 by Tn * * thenobody@poczta.fm * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Library General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include "qledindicator.h" const qreal QLedIndicator::scaledSize = 1000; QLedIndicator::QLedIndicator(QWidget *parent) : QWidget(parent) { this->checked = false; onColor1 = QColor(0, 255, 0); onColor2 = QColor(0, 192, 0); offColor1 = QColor(255, 0, 0); offColor2 = QColor(192, 0, 0); } void QLedIndicator::paintEvent(QPaintEvent *event) { qreal realSize = qMin(width() / 1.3, height() / 1.3); QRadialGradient gradient; QPainter painter(this); QPen pen(Qt::black); pen.setWidth(1); painter.setRenderHint(QPainter::Antialiasing); painter.translate(width() / 2, height() / 2); painter.scale(realSize / scaledSize, realSize / scaledSize); gradient = QRadialGradient(QPointF(-500, -500), 1500, QPointF(-500, -500)); gradient.setColorAt(0, QColor(224, 224, 224)); gradient.setColorAt(1, QColor(28, 28, 28)); painter.setPen(pen); painter.setBrush(QBrush(gradient)); painter.drawEllipse(QPointF(0, 0), 500, 500); gradient = QRadialGradient(QPointF(500, 500), 1500, QPointF(500, 500)); gradient.setColorAt(0, QColor(224, 224, 224)); gradient.setColorAt(1, QColor(28, 28, 28)); painter.setPen(pen); painter.setBrush(QBrush(gradient)); painter.drawEllipse(QPointF(0, 0), 450, 450); painter.setPen(pen); if (isChecked()) { gradient = QRadialGradient(QPointF(-500, -500), 1500, QPointF(-500, -500)); gradient.setColorAt(0, onColor1); gradient.setColorAt(1, onColor2); } else { gradient = QRadialGradient(QPointF(500, 500), 1500, QPointF(500, 500)); gradient.setColorAt(0, offColor1); gradient.setColorAt(1, offColor2); } painter.setBrush(gradient); painter.drawEllipse(QPointF(0, 0), 400, 400); } void QLedIndicator::setChecked(bool checked) { this->checked = checked; update(); } bool QLedIndicator::isChecked() const { return this->checked; } starpu-1.2.3+dfsg/starpu-top/qledindicator/qledindicator.h000066400000000000000000000051201320135501600236770ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2010 by Tn * * thenobody@poczta.fm * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Library General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef QLEDINDICATOR_H #define QLEDINDICATOR_H #include #include #include #include class QLedIndicator: public QWidget { Q_PROPERTY(QColor onColor1 WRITE setOnColor1 READ getOnColor1 );Q_PROPERTY(QColor onColor2 WRITE setOnColor2 READ getOnColor2 );Q_PROPERTY(QColor offColor1 WRITE setOffColor1 READ getOffColor1 );Q_PROPERTY(QColor offColor2 WRITE setOffColor2 READ getOffColor2 );Q_OBJECT public: QLedIndicator(QWidget *parent); void setOnColor1(QColor c) { onColor1 = c; } void setOffColor1(QColor c) { offColor1 = c; } void setOnColor2(QColor c) { onColor2 = c; } void setOffColor2(QColor c) { offColor2 = c; } QColor getOnColor1(void) { return onColor1; } QColor getOffColor1(void) { return offColor1; } QColor getOnColor2(void) { return onColor2; } QColor getOffColor2(void) { return offColor2; } void setChecked(bool checked); bool isChecked() const; protected: virtual void paintEvent(QPaintEvent *event); private: bool checked; static const qreal scaledSize; QColor onColor1, offColor1; QColor onColor2, offColor2; QPixmap ledBuffer; }; #endif // QLEDINDICATOR_H starpu-1.2.3+dfsg/starpu-top/qwt/000077500000000000000000000000001320135501600166775ustar00rootroot00000000000000starpu-1.2.3+dfsg/starpu-top/qwt/qwt_abstract_scale.cpp000066400000000000000000000161111320135501600232500ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_abstract_scale.h" #include "qwt_scale_engine.h" #include "qwt_scale_draw.h" #include "qwt_scale_div.h" #include "qwt_scale_map.h" #include "qwt_interval.h" class QwtAbstractScale::PrivateData { public: PrivateData(): maxMajor( 5 ), maxMinor( 3 ), stepSize( 0.0 ), autoScale( true ) { scaleEngine = new QwtLinearScaleEngine; scaleDraw = new QwtScaleDraw(); } ~PrivateData() { delete scaleEngine; delete scaleDraw; } QwtScaleEngine *scaleEngine; QwtAbstractScaleDraw *scaleDraw; int maxMajor; int maxMinor; double stepSize; bool autoScale; }; /*! Constructor Creates a default QwtScaleDraw and a QwtLinearScaleEngine. Autoscaling is enabled, and the stepSize is initialized by 0.0. */ QwtAbstractScale::QwtAbstractScale() { d_data = new PrivateData; rescale( 0.0, 100.0 ); } //! Destructor QwtAbstractScale::~QwtAbstractScale() { delete d_data; } /*! \brief Specify a scale. Disable autoscaling and define a scale by an interval and a step size \param vmin lower limit of the scale interval \param vmax upper limit of the scale interval \param stepSize major step size \sa setAutoScale() */ void QwtAbstractScale::setScale( double vmin, double vmax, double stepSize ) { d_data->autoScale = false; d_data->stepSize = stepSize; rescale( vmin, vmax, stepSize ); } /*! \brief Specify a scale. Disable autoscaling and define a scale by an interval and a step size \param interval Interval \param stepSize major step size \sa setAutoScale() */ void QwtAbstractScale::setScale( const QwtInterval &interval, double stepSize ) { setScale( interval.minValue(), interval.maxValue(), stepSize ); } /*! \brief Specify a scale. Disable autoscaling and define a scale by a scale division \param scaleDiv Scale division \sa setAutoScale() */ void QwtAbstractScale::setScale( const QwtScaleDiv &scaleDiv ) { d_data->autoScale = false; if ( scaleDiv != d_data->scaleDraw->scaleDiv() ) { d_data->scaleDraw->setScaleDiv( scaleDiv ); scaleChange(); } } /*! Recalculate the scale division and update the scale draw. \param vmin Lower limit of the scale interval \param vmax Upper limit of the scale interval \param stepSize Major step size \sa scaleChange() */ void QwtAbstractScale::rescale( double vmin, double vmax, double stepSize ) { const QwtScaleDiv scaleDiv = d_data->scaleEngine->divideScale( vmin, vmax, d_data->maxMajor, d_data->maxMinor, stepSize ); if ( scaleDiv != d_data->scaleDraw->scaleDiv() ) { d_data->scaleDraw->setTransformation( d_data->scaleEngine->transformation() ); d_data->scaleDraw->setScaleDiv( scaleDiv ); scaleChange(); } } /*! \brief Advise the widget to control the scale range internally. Autoscaling is on by default. \sa setScale(), autoScale() */ void QwtAbstractScale::setAutoScale() { if ( !d_data->autoScale ) { d_data->autoScale = true; scaleChange(); } } /*! \return \c true if autoscaling is enabled */ bool QwtAbstractScale::autoScale() const { return d_data->autoScale; } /*! \brief Set the maximum number of major tick intervals. The scale's major ticks are calculated automatically such that the number of major intervals does not exceed ticks. The default value is 5. \param ticks maximal number of major ticks. \sa QwtAbstractScaleDraw */ void QwtAbstractScale::setScaleMaxMajor( int ticks ) { if ( ticks != d_data->maxMajor ) { d_data->maxMajor = ticks; updateScaleDraw(); } } /*! \brief Set the maximum number of minor tick intervals The scale's minor ticks are calculated automatically such that the number of minor intervals does not exceed ticks. The default value is 3. \param ticks \sa QwtAbstractScaleDraw */ void QwtAbstractScale::setScaleMaxMinor( int ticks ) { if ( ticks != d_data->maxMinor ) { d_data->maxMinor = ticks; updateScaleDraw(); } } /*! \return Max. number of minor tick intervals The default value is 3. */ int QwtAbstractScale::scaleMaxMinor() const { return d_data->maxMinor; } /*! \return Max. number of major tick intervals The default value is 5. */ int QwtAbstractScale::scaleMaxMajor() const { return d_data->maxMajor; } /*! \brief Set a scale draw scaleDraw has to be created with new and will be deleted in ~QwtAbstractScale or the next call of setAbstractScaleDraw. */ void QwtAbstractScale::setAbstractScaleDraw( QwtAbstractScaleDraw *scaleDraw ) { if ( scaleDraw == NULL || scaleDraw == d_data->scaleDraw ) return; if ( d_data->scaleDraw != NULL ) scaleDraw->setScaleDiv( d_data->scaleDraw->scaleDiv() ); delete d_data->scaleDraw; d_data->scaleDraw = scaleDraw; } /*! \return Scale draw \sa setAbstractScaleDraw() */ QwtAbstractScaleDraw *QwtAbstractScale::abstractScaleDraw() { return d_data->scaleDraw; } /*! \return Scale draw \sa setAbstractScaleDraw() */ const QwtAbstractScaleDraw *QwtAbstractScale::abstractScaleDraw() const { return d_data->scaleDraw; } void QwtAbstractScale::updateScaleDraw() { rescale( d_data->scaleDraw->scaleDiv().lowerBound(), d_data->scaleDraw->scaleDiv().upperBound(), d_data->stepSize ); } /*! \brief Set a scale engine The scale engine is responsible for calculating the scale division, and in case of auto scaling how to align the scale. scaleEngine has to be created with new and will be deleted in ~QwtAbstractScale or the next call of setScaleEngine. */ void QwtAbstractScale::setScaleEngine( QwtScaleEngine *scaleEngine ) { if ( scaleEngine != NULL && scaleEngine != d_data->scaleEngine ) { delete d_data->scaleEngine; d_data->scaleEngine = scaleEngine; } } /*! \return Scale engine \sa setScaleEngine() */ const QwtScaleEngine *QwtAbstractScale::scaleEngine() const { return d_data->scaleEngine; } /*! \return Scale engine \sa setScaleEngine() */ QwtScaleEngine *QwtAbstractScale::scaleEngine() { return d_data->scaleEngine; } /*! \brief Notify changed scale Dummy empty implementation, intended to be overloaded by derived classes */ void QwtAbstractScale::scaleChange() { } /*! \return abstractScaleDraw()->scaleMap() */ const QwtScaleMap &QwtAbstractScale::scaleMap() const { return d_data->scaleDraw->scaleMap(); } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_abstract_scale.h000066400000000000000000000035511320135501600227210ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_ABSTRACT_SCALE_H #define QWT_ABSTRACT_SCALE_H #include "qwt_global.h" class QwtScaleEngine; class QwtAbstractScaleDraw; class QwtScaleDiv; class QwtScaleMap; class QwtInterval; /*! \brief An abstract base class for classes containing a scale QwtAbstractScale is used to provide classes with a QwtScaleDraw, and a QwtScaleDiv. The QwtScaleDiv might be set explicitely or calculated by a QwtScaleEngine. */ class QWT_EXPORT QwtAbstractScale { public: QwtAbstractScale(); virtual ~QwtAbstractScale(); void setScale( double vmin, double vmax, double step = 0.0 ); void setScale( const QwtInterval &, double step = 0.0 ); void setScale( const QwtScaleDiv & ); void setAutoScale(); bool autoScale() const; void setScaleMaxMajor( int ticks ); int scaleMaxMinor() const; void setScaleMaxMinor( int ticks ); int scaleMaxMajor() const; void setScaleEngine( QwtScaleEngine * ); const QwtScaleEngine *scaleEngine() const; QwtScaleEngine *scaleEngine(); const QwtScaleMap &scaleMap() const; protected: void rescale( double vmin, double vmax, double step = 0.0 ); void setAbstractScaleDraw( QwtAbstractScaleDraw * ); const QwtAbstractScaleDraw *abstractScaleDraw() const; QwtAbstractScaleDraw *abstractScaleDraw(); virtual void scaleChange(); private: void updateScaleDraw(); class PrivateData; PrivateData *d_data; }; #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_abstract_scale_draw.cpp000066400000000000000000000231021320135501600242630ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_abstract_scale_draw.h" #include "qwt_math.h" #include "qwt_text.h" #include "qwt_painter.h" #include "qwt_scale_map.h" #include #include #include #include class QwtAbstractScaleDraw::PrivateData { public: PrivateData(): components( Backbone | Ticks | Labels ), spacing( 4.0 ), penWidth( 0 ), minExtent( 0.0 ) { tickLength[QwtScaleDiv::MinorTick] = 4.0; tickLength[QwtScaleDiv::MediumTick] = 6.0; tickLength[QwtScaleDiv::MajorTick] = 8.0; } int components; QwtScaleMap map; QwtScaleDiv scldiv; double spacing; double tickLength[QwtScaleDiv::NTickTypes]; int penWidth; double minExtent; QMap labelCache; }; /*! \brief Constructor The range of the scale is initialized to [0, 100], The spacing (distance between ticks and labels) is set to 4, the tick lengths are set to 4,6 and 8 pixels */ QwtAbstractScaleDraw::QwtAbstractScaleDraw() { d_data = new QwtAbstractScaleDraw::PrivateData; } //! Destructor QwtAbstractScaleDraw::~QwtAbstractScaleDraw() { delete d_data; } /*! En/Disable a component of the scale \param component Scale component \param enable On/Off \sa hasComponent() */ void QwtAbstractScaleDraw::enableComponent( ScaleComponent component, bool enable ) { if ( enable ) d_data->components |= component; else d_data->components &= ~component; } /*! Check if a component is enabled \sa enableComponent() */ bool QwtAbstractScaleDraw::hasComponent( ScaleComponent component ) const { return ( d_data->components & component ); } /*! Change the scale division \param sd New scale division */ void QwtAbstractScaleDraw::setScaleDiv( const QwtScaleDiv &sd ) { d_data->scldiv = sd; d_data->map.setScaleInterval( sd.lowerBound(), sd.upperBound() ); d_data->labelCache.clear(); } /*! Change the transformation of the scale \param transformation New scale transformation */ void QwtAbstractScaleDraw::setTransformation( QwtScaleTransformation *transformation ) { d_data->map.setTransformation( transformation ); } //! \return Map how to translate between scale and pixel values const QwtScaleMap &QwtAbstractScaleDraw::map() const { return d_data->map; } //! \return Map how to translate between scale and pixel values QwtScaleMap &QwtAbstractScaleDraw::scaleMap() { return d_data->map; } //! \return scale division const QwtScaleDiv& QwtAbstractScaleDraw::scaleDiv() const { return d_data->scldiv; } /*! \brief Specify the width of the scale pen \param width Pen width \sa penWidth() */ void QwtAbstractScaleDraw::setPenWidth( int width ) { if ( width < 0 ) width = 0; if ( width != d_data->penWidth ) d_data->penWidth = width; } /*! \return Scale pen width \sa setPenWidth() */ int QwtAbstractScaleDraw::penWidth() const { return d_data->penWidth; } /*! \brief Draw the scale \param painter The painter \param palette Palette, text color is used for the labels, foreground color for ticks and backbone */ void QwtAbstractScaleDraw::draw( QPainter *painter, const QPalette& palette ) const { painter->save(); QPen pen = painter->pen(); pen.setWidth( d_data->penWidth ); pen.setCosmetic( false ); painter->setPen( pen ); if ( hasComponent( QwtAbstractScaleDraw::Labels ) ) { painter->save(); painter->setPen( palette.color( QPalette::Text ) ); // ignore pen style const QList &majorTicks = d_data->scldiv.ticks( QwtScaleDiv::MajorTick ); for ( int i = 0; i < ( int )majorTicks.count(); i++ ) { const double v = majorTicks[i]; if ( d_data->scldiv.contains( v ) ) drawLabel( painter, majorTicks[i] ); } painter->restore(); } if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ) { painter->save(); QPen pen = painter->pen(); pen.setColor( palette.color( QPalette::WindowText ) ); pen.setCapStyle( Qt::FlatCap ); painter->setPen( pen ); for ( int tickType = QwtScaleDiv::MinorTick; tickType < QwtScaleDiv::NTickTypes; tickType++ ) { const QList &ticks = d_data->scldiv.ticks( tickType ); for ( int i = 0; i < ( int )ticks.count(); i++ ) { const double v = ticks[i]; if ( d_data->scldiv.contains( v ) ) drawTick( painter, v, d_data->tickLength[tickType] ); } } painter->restore(); } if ( hasComponent( QwtAbstractScaleDraw::Backbone ) ) { painter->save(); QPen pen = painter->pen(); pen.setColor( palette.color( QPalette::WindowText ) ); pen.setCapStyle( Qt::FlatCap ); painter->setPen( pen ); drawBackbone( painter ); painter->restore(); } painter->restore(); } /*! \brief Set the spacing between tick and labels The spacing is the distance between ticks and labels. The default spacing is 4 pixels. \param spacing Spacing \sa spacing() */ void QwtAbstractScaleDraw::setSpacing( double spacing ) { if ( spacing < 0 ) spacing = 0; d_data->spacing = spacing; } /*! \brief Get the spacing The spacing is the distance between ticks and labels. The default spacing is 4 pixels. \sa setSpacing() */ double QwtAbstractScaleDraw::spacing() const { return d_data->spacing; } /*! \brief Set a minimum for the extent The extent is calculated from the coomponents of the scale draw. In situations, where the labels are changing and the layout depends on the extent (f.e scrolling a scale), setting an upper limit as minimum extent will avoid jumps of the layout. \param minExtent Minimum extent \sa extent(), minimumExtent() */ void QwtAbstractScaleDraw::setMinimumExtent( double minExtent ) { if ( minExtent < 0.0 ) minExtent = 0.0; d_data->minExtent = minExtent; } /*! Get the minimum extent \sa extent(), setMinimumExtent() */ double QwtAbstractScaleDraw::minimumExtent() const { return d_data->minExtent; } /*! Set the length of the ticks \param tickType Tick type \param length New length \warning the length is limited to [0..1000] */ void QwtAbstractScaleDraw::setTickLength( QwtScaleDiv::TickType tickType, double length ) { if ( tickType < QwtScaleDiv::MinorTick || tickType > QwtScaleDiv::MajorTick ) { return; } if ( length < 0.0 ) length = 0.0; const double maxTickLen = 1000.0; if ( length > maxTickLen ) length = maxTickLen; d_data->tickLength[tickType] = length; } /*! Return the length of the ticks \sa setTickLength(), majTickLength() */ double QwtAbstractScaleDraw::tickLength( QwtScaleDiv::TickType tickType ) const { if ( tickType < QwtScaleDiv::MinorTick || tickType > QwtScaleDiv::MajorTick ) { return 0; } return d_data->tickLength[tickType]; } /*! The same as QwtAbstractScaleDraw::tickLength(QwtScaleDiv::MajorTick). */ double QwtAbstractScaleDraw::majTickLength() const { return d_data->tickLength[QwtScaleDiv::MajorTick]; } /*! \brief Convert a value into its representing label The value is converted to a plain text using QLocale::system().toString(value). This method is often overloaded by applications to have individual labels. \param value Value \return Label string. */ QwtText QwtAbstractScaleDraw::label( double value ) const { return QLocale::system().toString( value ); } /*! \brief Convert a value into its representing label and cache it. The conversion between value and label is called very often in the layout and painting code. Unfortunately the calculation of the label sizes might be slow (really slow for rich text in Qt4), so it's necessary to cache the labels. \param font Font \param value Value \return Tick label */ const QwtText &QwtAbstractScaleDraw::tickLabel( const QFont &font, double value ) const { QMap::const_iterator it = d_data->labelCache.find( value ); if ( it == d_data->labelCache.end() ) { QwtText lbl = label( value ); lbl.setRenderFlags( 0 ); lbl.setLayoutAttribute( QwtText::MinimumLayout ); ( void )lbl.textSize( font ); // initialize the internal cache it = d_data->labelCache.insert( value, lbl ); } return ( *it ); } /*! Invalidate the cache used by QwtAbstractScaleDraw::tickLabel The cache is invalidated, when a new QwtScaleDiv is set. If the labels need to be changed. while the same QwtScaleDiv is set, QwtAbstractScaleDraw::invalidateCache needs to be called manually. */ void QwtAbstractScaleDraw::invalidateCache() { d_data->labelCache.clear(); } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_abstract_scale_draw.h000066400000000000000000000067131320135501600237410ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_ABSTRACT_SCALE_DRAW_H #define QWT_ABSTRACT_SCALE_DRAW_H #include "qwt_global.h" #include "qwt_scale_div.h" #include "qwt_text.h" class QPalette; class QPainter; class QFont; class QwtScaleTransformation; class QwtScaleMap; /*! \brief A abstract base class for drawing scales QwtAbstractScaleDraw can be used to draw linear or logarithmic scales. After a scale division has been specified as a QwtScaleDiv object using QwtAbstractScaleDraw::setScaleDiv(const QwtScaleDiv &s), the scale can be drawn with the QwtAbstractScaleDraw::draw() member. */ class QWT_EXPORT QwtAbstractScaleDraw { public: /*! Components of a scale - Backbone - Ticks - Labels \sa enableComponent(), hasComponent */ enum ScaleComponent { Backbone = 1, Ticks = 2, Labels = 4 }; QwtAbstractScaleDraw(); virtual ~QwtAbstractScaleDraw(); void setScaleDiv( const QwtScaleDiv &s ); const QwtScaleDiv& scaleDiv() const; void setTransformation( QwtScaleTransformation * ); const QwtScaleMap &map() const; void enableComponent( ScaleComponent, bool enable = true ); bool hasComponent( ScaleComponent ) const; void setTickLength( QwtScaleDiv::TickType, double length ); double tickLength( QwtScaleDiv::TickType ) const; double majTickLength() const; void setSpacing( double margin ); double spacing() const; void setPenWidth( int width ); int penWidth() const; virtual void draw( QPainter *, const QPalette & ) const; virtual QwtText label( double ) const; /*! Calculate the extent The extent is the distcance from the baseline to the outermost pixel of the scale draw in opposite to its orientation. It is at least minimumExtent() pixels. \sa setMinimumExtent(), minimumExtent() */ virtual double extent( const QFont & ) const = 0; void setMinimumExtent( double ); double minimumExtent() const; QwtScaleMap &scaleMap(); protected: /*! Draw a tick \param painter Painter \param value Value of the tick \param len Lenght of the tick \sa drawBackbone(), drawLabel() */ virtual void drawTick( QPainter *painter, double value, double len ) const = 0; /*! Draws the baseline of the scale \param painter Painter \sa drawTick(), drawLabel() */ virtual void drawBackbone( QPainter *painter ) const = 0; /*! Draws the label for a major scale tick \param painter Painter \param value Value \sa drawTick, drawBackbone */ virtual void drawLabel( QPainter *painter, double value ) const = 0; void invalidateCache(); const QwtText &tickLabel( const QFont &, double value ) const; private: QwtAbstractScaleDraw( const QwtAbstractScaleDraw & ); QwtAbstractScaleDraw &operator=( const QwtAbstractScaleDraw & ); class PrivateData; PrivateData *d_data; }; #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_abstract_slider.cpp000066400000000000000000000327071320135501600234540ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_abstract_slider.h" #include "qwt_math.h" #include #include #if QT_VERSION < 0x040601 #define qFabs(x) ::fabs(x) #define qExp(x) ::exp(x) #endif class QwtAbstractSlider::PrivateData { public: PrivateData(): scrollMode( ScrNone ), mouseOffset( 0.0 ), tracking( true ), tmrID( 0 ), updTime( 150 ), mass( 0.0 ), readOnly( false ) { } int scrollMode; double mouseOffset; int direction; int tracking; int tmrID; int updTime; int timerTick; QTime time; double speed; double mass; Qt::Orientation orientation; bool readOnly; }; /*! \brief Constructor \param orientation Orientation \param parent Parent widget */ QwtAbstractSlider::QwtAbstractSlider( Qt::Orientation orientation, QWidget *parent ): QWidget( parent, NULL ) { d_data = new QwtAbstractSlider::PrivateData; d_data->orientation = orientation; setFocusPolicy( Qt::TabFocus ); } //! Destructor QwtAbstractSlider::~QwtAbstractSlider() { if ( d_data->tmrID ) killTimer( d_data->tmrID ); delete d_data; } /*! En/Disable read only mode In read only mode the slider can't be controlled by mouse or keyboard. \param readOnly Enables in case of true \sa isReadOnly() */ void QwtAbstractSlider::setReadOnly( bool readOnly ) { d_data->readOnly = readOnly; update(); } /*! In read only mode the slider can't be controlled by mouse or keyboard. \return true if read only \sa setReadOnly() */ bool QwtAbstractSlider::isReadOnly() const { return d_data->readOnly; } /*! \brief Set the orientation. \param o Orientation. Allowed values are Qt::Horizontal and Qt::Vertical. */ void QwtAbstractSlider::setOrientation( Qt::Orientation o ) { d_data->orientation = o; } /*! \return Orientation \sa setOrientation() */ Qt::Orientation QwtAbstractSlider::orientation() const { return d_data->orientation; } //! Stop updating if automatic scrolling is active void QwtAbstractSlider::stopMoving() { if ( d_data->tmrID ) { killTimer( d_data->tmrID ); d_data->tmrID = 0; } } /*! \brief Specify the update interval for automatic scrolling \param t update interval in milliseconds \sa getScrollMode() */ void QwtAbstractSlider::setUpdateTime( int t ) { if ( t < 50 ) t = 50; d_data->updTime = t; } /*! Mouse press event handler \param e Mouse event */ void QwtAbstractSlider::mousePressEvent( QMouseEvent *e ) { if ( isReadOnly() ) { e->ignore(); return; } if ( !isValid() ) return; const QPoint &p = e->pos(); d_data->timerTick = 0; getScrollMode( p, d_data->scrollMode, d_data->direction ); stopMoving(); switch ( d_data->scrollMode ) { case ScrPage: case ScrTimer: d_data->mouseOffset = 0; d_data->tmrID = startTimer( qMax( 250, 2 * d_data->updTime ) ); break; case ScrMouse: d_data->time.start(); d_data->speed = 0; d_data->mouseOffset = getValue( p ) - value(); Q_EMIT sliderPressed(); break; default: d_data->mouseOffset = 0; d_data->direction = 0; break; } } //! Emits a valueChanged() signal if necessary void QwtAbstractSlider::buttonReleased() { if ( ( !d_data->tracking ) || ( value() != prevValue() ) ) Q_EMIT valueChanged( value() ); } /*! Mouse Release Event handler \param e Mouse event */ void QwtAbstractSlider::mouseReleaseEvent( QMouseEvent *e ) { if ( isReadOnly() ) { e->ignore(); return; } if ( !isValid() ) return; const double inc = step(); switch ( d_data->scrollMode ) { case ScrMouse: { setPosition( e->pos() ); d_data->direction = 0; d_data->mouseOffset = 0; if ( d_data->mass > 0.0 ) { const int ms = d_data->time.elapsed(); if ( ( qFabs( d_data->speed ) > 0.0 ) && ( ms < 50 ) ) d_data->tmrID = startTimer( d_data->updTime ); } else { d_data->scrollMode = ScrNone; buttonReleased(); } Q_EMIT sliderReleased(); break; } case ScrDirect: { setPosition( e->pos() ); d_data->direction = 0; d_data->mouseOffset = 0; d_data->scrollMode = ScrNone; buttonReleased(); break; } case ScrPage: { stopMoving(); if ( !d_data->timerTick ) QwtDoubleRange::incPages( d_data->direction ); d_data->timerTick = 0; buttonReleased(); d_data->scrollMode = ScrNone; break; } case ScrTimer: { stopMoving(); if ( !d_data->timerTick ) QwtDoubleRange::fitValue( value() + double( d_data->direction ) * inc ); d_data->timerTick = 0; buttonReleased(); d_data->scrollMode = ScrNone; break; } default: { d_data->scrollMode = ScrNone; buttonReleased(); } } } /*! Move the slider to a specified point, adjust the value and emit signals if necessary. */ void QwtAbstractSlider::setPosition( const QPoint &p ) { QwtDoubleRange::fitValue( getValue( p ) - d_data->mouseOffset ); } /*! \brief Enables or disables tracking. If tracking is enabled, the slider emits a valueChanged() signal whenever its value changes (the default behaviour). If tracking is disabled, the value changed() signal will only be emitted if:
    • the user releases the mouse button and the value has changed or
    • at the end of automatic scrolling.
    Tracking is enabled by default. \param enable \c true (enable) or \c false (disable) tracking. */ void QwtAbstractSlider::setTracking( bool enable ) { d_data->tracking = enable; } /*! Mouse Move Event handler \param e Mouse event */ void QwtAbstractSlider::mouseMoveEvent( QMouseEvent *e ) { if ( isReadOnly() ) { e->ignore(); return; } if ( !isValid() ) return; if ( d_data->scrollMode == ScrMouse ) { setPosition( e->pos() ); if ( d_data->mass > 0.0 ) { double ms = double( d_data->time.elapsed() ); if ( ms < 1.0 ) ms = 1.0; d_data->speed = ( exactValue() - exactPrevValue() ) / ms; d_data->time.start(); } if ( value() != prevValue() ) Q_EMIT sliderMoved( value() ); } } /*! Wheel Event handler \param e Whell event */ void QwtAbstractSlider::wheelEvent( QWheelEvent *e ) { if ( isReadOnly() ) { e->ignore(); return; } if ( !isValid() ) return; int mode = ScrNone, direction = 0; // Give derived classes a chance to say ScrNone getScrollMode( e->pos(), mode, direction ); if ( mode != ScrNone ) { // Most mouse types work in steps of 15 degrees, in which case // the delta value is a multiple of 120 const int inc = e->delta() / 120; QwtDoubleRange::incPages( inc ); if ( value() != prevValue() ) Q_EMIT sliderMoved( value() ); } } /*! Handles key events - Key_Down, KeyLeft\n Decrement by 1 - Key_Up, Key_Right\n Increment by 1 \param e Key event \sa isReadOnly() */ void QwtAbstractSlider::keyPressEvent( QKeyEvent *e ) { if ( isReadOnly() ) { e->ignore(); return; } if ( !isValid() ) return; int increment = 0; switch ( e->key() ) { case Qt::Key_Down: if ( orientation() == Qt::Vertical ) increment = -1; break; case Qt::Key_Up: if ( orientation() == Qt::Vertical ) increment = 1; break; case Qt::Key_Left: if ( orientation() == Qt::Horizontal ) increment = -1; break; case Qt::Key_Right: if ( orientation() == Qt::Horizontal ) increment = 1; break; default:; e->ignore(); } if ( increment != 0 ) { QwtDoubleRange::incValue( increment ); if ( value() != prevValue() ) Q_EMIT sliderMoved( value() ); } } /*! Qt timer event \param e Timer event */ void QwtAbstractSlider::timerEvent( QTimerEvent * ) { const double inc = step(); switch ( d_data->scrollMode ) { case ScrMouse: { if ( d_data->mass > 0.0 ) { d_data->speed *= qExp( - double( d_data->updTime ) * 0.001 / d_data->mass ); const double newval = exactValue() + d_data->speed * double( d_data->updTime ); QwtDoubleRange::fitValue( newval ); // stop if d_data->speed < one step per second if ( qFabs( d_data->speed ) < 0.001 * qFabs( step() ) ) { d_data->speed = 0; stopMoving(); buttonReleased(); } } else stopMoving(); break; } case ScrPage: { QwtDoubleRange::incPages( d_data->direction ); if ( !d_data->timerTick ) { killTimer( d_data->tmrID ); d_data->tmrID = startTimer( d_data->updTime ); } break; } case ScrTimer: { QwtDoubleRange::fitValue( value() + double( d_data->direction ) * inc ); if ( !d_data->timerTick ) { killTimer( d_data->tmrID ); d_data->tmrID = startTimer( d_data->updTime ); } break; } default: { stopMoving(); break; } } d_data->timerTick = 1; } /*! Notify change of value This function can be reimplemented by derived classes in order to keep track of changes, i.e. repaint the widget. The default implementation emits a valueChanged() signal if tracking is enabled. */ void QwtAbstractSlider::valueChange() { if ( d_data->tracking ) Q_EMIT valueChanged( value() ); } /*! \brief Set the slider's mass for flywheel effect. If the slider's mass is greater then 0, it will continue to move after the mouse button has been released. Its speed decreases with time at a rate depending on the slider's mass. A large mass means that it will continue to move for a long time. Derived widgets may overload this function to make it public. \param val New mass in kg \bug If the mass is smaller than 1g, it is set to zero. The maximal mass is limited to 100kg. \sa mass() */ void QwtAbstractSlider::setMass( double val ) { if ( val < 0.001 ) d_data->mass = 0.0; else if ( val > 100.0 ) d_data->mass = 100.0; else d_data->mass = val; } /*! \return mass \sa setMass() */ double QwtAbstractSlider::mass() const { return d_data->mass; } /*! \brief Move the slider to a specified value This function can be used to move the slider to a value which is not an integer multiple of the step size. \param val new value \sa fitValue() */ void QwtAbstractSlider::setValue( double val ) { if ( d_data->scrollMode == ScrMouse ) stopMoving(); QwtDoubleRange::setValue( val ); } /*! \brief Set the slider's value to the nearest integer multiple of the step size. \param value Value \sa setValue(), incValue() */ void QwtAbstractSlider::fitValue( double value ) { if ( d_data->scrollMode == ScrMouse ) stopMoving(); QwtDoubleRange::fitValue( value ); } /*! \brief Increment the value by a specified number of steps \param steps number of steps \sa setValue() */ void QwtAbstractSlider::incValue( int steps ) { if ( d_data->scrollMode == ScrMouse ) stopMoving(); QwtDoubleRange::incValue( steps ); } /*! \sa mouseOffset() */ void QwtAbstractSlider::setMouseOffset( double offset ) { d_data->mouseOffset = offset; } /*! \sa setMouseOffset() */ double QwtAbstractSlider::mouseOffset() const { return d_data->mouseOffset; } //! sa ScrollMode int QwtAbstractSlider::scrollMode() const { return d_data->scrollMode; } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_abstract_slider.h000066400000000000000000000124161320135501600231140ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_ABSTRACT_SLIDER_H #define QWT_ABSTRACT_SLIDER_H #include "qwt_global.h" #include "qwt_double_range.h" #include /*! \brief An abstract base class for slider widgets QwtAbstractSlider is a base class for slider widgets. It handles mouse events and updates the slider's value accordingly. Derived classes only have to implement the getValue() and getScrollMode() members, and should react to a valueChange(), which normally requires repainting. */ class QWT_EXPORT QwtAbstractSlider : public QWidget, public QwtDoubleRange { Q_OBJECT Q_PROPERTY( bool readOnly READ isReadOnly WRITE setReadOnly ) Q_PROPERTY( bool valid READ isValid WRITE setValid ) Q_PROPERTY( double mass READ mass WRITE setMass ) Q_PROPERTY( Qt::Orientation orientation READ orientation WRITE setOrientation ) public: /*! Scroll mode \sa getScrollMode() */ enum ScrollMode { ScrNone, ScrMouse, ScrTimer, ScrDirect, ScrPage }; explicit QwtAbstractSlider( Qt::Orientation, QWidget *parent = NULL ); virtual ~QwtAbstractSlider(); void setUpdateTime( int t ); void stopMoving(); void setTracking( bool enable ); virtual void setMass( double val ); virtual double mass() const; virtual void setOrientation( Qt::Orientation o ); Qt::Orientation orientation() const; bool isReadOnly() const; /* Wrappers for QwtDblRange::isValid/QwtDblRange::setValid made to be available as Q_PROPERTY in the designer. */ /*! \sa QwtDblRange::isValid() */ bool isValid() const { return QwtDoubleRange::isValid(); } /*! \param valid true/false \sa QwtDblRange::isValid() */ void setValid( bool valid ) { QwtDoubleRange::setValid( valid ); } public Q_SLOTS: virtual void setValue( double val ); virtual void fitValue( double val ); virtual void incValue( int steps ); virtual void setReadOnly( bool ); Q_SIGNALS: /*! \brief Notify a change of value. In the default setting (tracking enabled), this signal will be emitted every time the value changes ( see setTracking() ). \param value new value */ void valueChanged( double value ); /*! This signal is emitted when the user presses the movable part of the slider (start ScrMouse Mode). */ void sliderPressed(); /*! This signal is emitted when the user releases the movable part of the slider. */ void sliderReleased(); /*! This signal is emitted when the user moves the slider with the mouse. \param value new value */ void sliderMoved( double value ); protected: virtual void setPosition( const QPoint & ); virtual void valueChange(); virtual void timerEvent( QTimerEvent *e ); virtual void mousePressEvent( QMouseEvent *e ); virtual void mouseReleaseEvent( QMouseEvent *e ); virtual void mouseMoveEvent( QMouseEvent *e ); virtual void keyPressEvent( QKeyEvent *e ); virtual void wheelEvent( QWheelEvent *e ); /*! \brief Determine the value corresponding to a specified poind This is an abstract virtual function which is called when the user presses or releases a mouse button or moves the mouse. It has to be implemented by the derived class. \param p point */ virtual double getValue( const QPoint & p ) = 0; /*! \brief Determine what to do when the user presses a mouse button. This function is abstract and has to be implemented by derived classes. It is called on a mousePress event. The derived class can determine what should happen next in dependence of the position where the mouse was pressed by returning scrolling mode and direction. QwtAbstractSlider knows the following modes: - ScrNone\n Scrolling switched off. Don't change the value. - ScrMouse Change the value while the user keeps the button pressed and moves the mouse. - ScrTimer Automatic scrolling. Increment the value in the specified direction as long as the user keeps the button pressed. - ScrPage Automatic scrolling. Same as ScrTimer, but increment by page size. \param p point where the mouse was pressed \retval scrollMode The scrolling mode \retval direction direction: 1, 0, or -1. */ virtual void getScrollMode( const QPoint &p, int &scrollMode, int &direction ) = 0; void setMouseOffset( double ); double mouseOffset() const; int scrollMode() const; private: void buttonReleased(); class PrivateData; PrivateData *d_data; }; #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_clipper.cpp000066400000000000000000000304571320135501600217450ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_clipper.h" #include "qwt_math.h" #include #if QT_VERSION < 0x040601 #define qAtan(x) ::atan(x) #endif static inline QRectF boundingRect( const QPolygonF &polygon ) { return polygon.boundingRect(); } enum Edge { Left, Top, Right, Bottom, NEdges }; class QwtPolygonClipper: public QRect { public: QwtPolygonClipper( const QRect &r ); QPolygon clipPolygon( const QPolygon & ) const; private: void clipEdge( Edge, const QPolygon &, QPolygon & ) const; bool insideEdge( const QPoint &, Edge edge ) const; QPoint intersectEdge( const QPoint &p1, const QPoint &p2, Edge edge ) const; void addPoint( QPolygon &, uint pos, const QPoint &point ) const; }; class QwtPolygonClipperF: public QRectF { public: QwtPolygonClipperF( const QRectF &r ); QPolygonF clipPolygon( const QPolygonF & ) const; private: void clipEdge( Edge, const QPolygonF &, QPolygonF & ) const; bool insideEdge( const QPointF &, Edge edge ) const; QPointF intersectEdge( const QPointF &p1, const QPointF &p2, Edge edge ) const; void addPoint( QPolygonF &, uint pos, const QPointF &point ) const; }; class QwtCircleClipper: public QRectF { public: QwtCircleClipper( const QRectF &r ); QVector clipCircle( const QPointF &, double radius ) const; private: QList cuttingPoints( Edge, const QPointF &pos, double radius ) const; double toAngle( const QPointF &, const QPointF & ) const; }; QwtPolygonClipper::QwtPolygonClipper( const QRect &r ): QRect( r ) { } inline void QwtPolygonClipper::addPoint( QPolygon &pa, uint pos, const QPoint &point ) const { if ( uint( pa.size() ) <= pos ) pa.resize( pos + 5 ); pa.setPoint( pos, point ); } //! Sutherland-Hodgman polygon clipping QPolygon QwtPolygonClipper::clipPolygon( const QPolygon &pa ) const { if ( contains( pa.boundingRect() ) ) return pa; QPolygon cpa( pa.size() ); clipEdge( ( Edge )0, pa, cpa ); for ( uint edge = 1; edge < NEdges; edge++ ) { const QPolygon rpa = cpa; clipEdge( ( Edge )edge, rpa, cpa ); } return cpa; } bool QwtPolygonClipper::insideEdge( const QPoint &p, Edge edge ) const { switch ( edge ) { case Left: return p.x() > left(); case Top: return p.y() > top(); case Right: return p.x() < right(); case Bottom: return p.y() < bottom(); default: break; } return false; } QPoint QwtPolygonClipper::intersectEdge( const QPoint &p1, const QPoint &p2, Edge edge ) const { int x = 0, y = 0; double m = 0; const double dy = p2.y() - p1.y(); const double dx = p2.x() - p1.x(); switch ( edge ) { case Left: x = left(); m = double( qAbs( p1.x() - x ) ) / qAbs( dx ); y = p1.y() + int( dy * m ); break; case Top: y = top(); m = double( qAbs( p1.y() - y ) ) / qAbs( dy ); x = p1.x() + int( dx * m ); break; case Right: x = right(); m = double( qAbs( p1.x() - x ) ) / qAbs( dx ); y = p1.y() + int( dy * m ); break; case Bottom: y = bottom(); m = double( qAbs( p1.y() - y ) ) / qAbs( dy ); x = p1.x() + int( dx * m ); break; default: break; } return QPoint( x, y ); } void QwtPolygonClipper::clipEdge( Edge edge, const QPolygon &pa, QPolygon &cpa ) const { if ( pa.count() == 0 ) { cpa.resize( 0 ); return; } unsigned int count = 0; QPoint p1 = pa.point( 0 ); if ( insideEdge( p1, edge ) ) addPoint( cpa, count++, p1 ); const uint nPoints = pa.size(); for ( uint i = 1; i < nPoints; i++ ) { const QPoint p2 = pa.point( i ); if ( insideEdge( p2, edge ) ) { if ( insideEdge( p1, edge ) ) addPoint( cpa, count++, p2 ); else { addPoint( cpa, count++, intersectEdge( p1, p2, edge ) ); addPoint( cpa, count++, p2 ); } } else { if ( insideEdge( p1, edge ) ) addPoint( cpa, count++, intersectEdge( p1, p2, edge ) ); } p1 = p2; } cpa.resize( count ); } QwtPolygonClipperF::QwtPolygonClipperF( const QRectF &r ): QRectF( r ) { } inline void QwtPolygonClipperF::addPoint( QPolygonF &pa, uint pos, const QPointF &point ) const { if ( uint( pa.size() ) <= pos ) pa.resize( pos + 5 ); pa[( int )pos] = point; } //! Sutherland-Hodgman polygon clipping QPolygonF QwtPolygonClipperF::clipPolygon( const QPolygonF &pa ) const { if ( contains( ::boundingRect( pa ) ) ) return pa; QPolygonF cpa( pa.size() ); clipEdge( ( Edge )0, pa, cpa ); for ( uint edge = 1; edge < NEdges; edge++ ) { const QPolygonF rpa = cpa; clipEdge( ( Edge )edge, rpa, cpa ); } return cpa; } bool QwtPolygonClipperF::insideEdge( const QPointF &p, Edge edge ) const { switch ( edge ) { case Left: return p.x() > left(); case Top: return p.y() > top(); case Right: return p.x() < right(); case Bottom: return p.y() < bottom(); default: break; } return false; } QPointF QwtPolygonClipperF::intersectEdge( const QPointF &p1, const QPointF &p2, Edge edge ) const { double x = 0.0, y = 0.0; double m = 0; const double dy = p2.y() - p1.y(); const double dx = p2.x() - p1.x(); switch ( edge ) { case Left: x = left(); m = double( qAbs( p1.x() - x ) ) / qAbs( dx ); y = p1.y() + int( dy * m ); break; case Top: y = top(); m = double( qAbs( p1.y() - y ) ) / qAbs( dy ); x = p1.x() + int( dx * m ); break; case Right: x = right(); m = double( qAbs( p1.x() - x ) ) / qAbs( dx ); y = p1.y() + int( dy * m ); break; case Bottom: y = bottom(); m = double( qAbs( p1.y() - y ) ) / qAbs( dy ); x = p1.x() + int( dx * m ); break; default: break; } return QPointF( x, y ); } void QwtPolygonClipperF::clipEdge( Edge edge, const QPolygonF &pa, QPolygonF &cpa ) const { if ( pa.count() == 0 ) { cpa.resize( 0 ); return; } unsigned int count = 0; QPointF p1 = pa[0]; if ( insideEdge( p1, edge ) ) addPoint( cpa, count++, p1 ); const uint nPoints = pa.size(); for ( uint i = 1; i < nPoints; i++ ) { const QPointF p2 = pa[( int )i]; if ( insideEdge( p2, edge ) ) { if ( insideEdge( p1, edge ) ) addPoint( cpa, count++, p2 ); else { addPoint( cpa, count++, intersectEdge( p1, p2, edge ) ); addPoint( cpa, count++, p2 ); } } else { if ( insideEdge( p1, edge ) ) addPoint( cpa, count++, intersectEdge( p1, p2, edge ) ); } p1 = p2; } cpa.resize( count ); } QwtCircleClipper::QwtCircleClipper( const QRectF &r ): QRectF( r ) { } QVector QwtCircleClipper::clipCircle( const QPointF &pos, double radius ) const { QList points; for ( int edge = 0; edge < NEdges; edge++ ) points += cuttingPoints( ( Edge )edge, pos, radius ); QVector intv; if ( points.size() <= 0 ) { QRectF cRect( 0, 0, 2 * radius, 2* radius ); cRect.moveCenter( pos ); if ( contains( cRect ) ) intv += QwtInterval( 0.0, 2 * M_PI ); } else { QList angles; for ( int i = 0; i < points.size(); i++ ) angles += toAngle( pos, points[i] ); qSort( angles ); const int in = contains( qwtPolar2Pos( pos, radius, angles[0] + ( angles[1] - angles[0] ) / 2 ) ); if ( in ) { for ( int i = 0; i < angles.size() - 1; i += 2 ) intv += QwtInterval( angles[i], angles[i+1] ); } else { for ( int i = 1; i < angles.size() - 1; i += 2 ) intv += QwtInterval( angles[i], angles[i+1] ); intv += QwtInterval( angles.last(), angles.first() ); } } return intv; } double QwtCircleClipper::toAngle( const QPointF &from, const QPointF &to ) const { if ( from.x() == to.x() ) return from.y() <= to.y() ? M_PI / 2.0 : 3 * M_PI / 2.0; const double m = qAbs( ( to.y() - from.y() ) / ( to.x() - from.x() ) ); double angle = qAtan( m ); if ( to.x() > from.x() ) { if ( to.y() > from.y() ) angle = 2 * M_PI - angle; } else { if ( to.y() > from.y() ) angle = M_PI + angle; else angle = M_PI - angle; } return angle; } QList QwtCircleClipper::cuttingPoints( Edge edge, const QPointF &pos, double radius ) const { QList points; if ( edge == Left || edge == Right ) { const double x = ( edge == Left ) ? left() : right(); if ( qAbs( pos.x() - x ) < radius ) { const double off = qSqrt( qwtSqr( radius ) - qwtSqr( pos.x() - x ) ); const double y1 = pos.y() + off; if ( y1 >= top() && y1 <= bottom() ) points += QPointF( x, y1 ); const double y2 = pos.y() - off; if ( y2 >= top() && y2 <= bottom() ) points += QPointF( x, y2 ); } } else { const double y = ( edge == Top ) ? top() : bottom(); if ( qAbs( pos.y() - y ) < radius ) { const double off = qSqrt( qwtSqr( radius ) - qwtSqr( pos.y() - y ) ); const double x1 = pos.x() + off; if ( x1 >= left() && x1 <= right() ) points += QPointF( x1, y ); const double x2 = pos.x() - off; if ( x2 >= left() && x2 <= right() ) points += QPointF( x2, y ); } } return points; } /*! Sutherland-Hodgman polygon clipping \param clipRect Clip rectangle \param polygon Polygon \return Clipped polygon */ QPolygon QwtClipper::clipPolygon( const QRect &clipRect, const QPolygon &polygon ) { QwtPolygonClipper clipper( clipRect ); return clipper.clipPolygon( polygon ); } /*! Sutherland-Hodgman polygon clipping \param clipRect Clip rectangle \param polygon Polygon \return Clipped polygon */ QPolygonF QwtClipper::clipPolygonF( const QRectF &clipRect, const QPolygonF &polygon ) { QwtPolygonClipperF clipper( clipRect ); return clipper.clipPolygon( polygon ); } /*! Circle clipping clipCircle() devides a circle into intervals of angles representing arcs of the circle. When the circle is completely inside the clip rectangle an interval [0.0, 2 * M_PI] is returned. \param clipRect Clip rectangle \param center Center of the circle \param radius Radius of the circle \return Arcs of the circle */ QVector QwtClipper::clipCircle( const QRectF &clipRect, const QPointF ¢er, double radius ) { QwtCircleClipper clipper( clipRect ); return clipper.clipCircle( center, radius ); } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_clipper.h000066400000000000000000000016251320135501600214050ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_CLIPPER_H #define QWT_CLIPPER_H #include "qwt_global.h" #include "qwt_interval.h" #include #include class QRect; class QRectF; /*! \brief Some clipping algos */ class QWT_EXPORT QwtClipper { public: static QPolygon clipPolygon( const QRect &, const QPolygon & ); static QPolygonF clipPolygonF( const QRectF &, const QPolygonF & ); static QVector clipCircle( const QRectF &, const QPointF &, double radius ); }; #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_color_map.cpp000066400000000000000000000245661320135501600222660ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_color_map.h" #include "qwt_math.h" #include "qwt_interval.h" #include typedef QVector QwtColorTable; class QwtLinearColorMap::ColorStops { public: ColorStops() { _stops.reserve( 256 ); } void insert( double pos, const QColor &color ); QRgb rgb( QwtLinearColorMap::Mode, double pos ) const; QVector stops() const; private: class ColorStop { public: ColorStop(): pos( 0.0 ), rgb( 0 ) { }; ColorStop( double p, const QColor &c ): pos( p ), rgb( c.rgb() ) { r = qRed( rgb ); g = qGreen( rgb ); b = qBlue( rgb ); } double pos; QRgb rgb; int r, g, b; }; inline int findUpper( double pos ) const; QVector _stops; }; void QwtLinearColorMap::ColorStops::insert( double pos, const QColor &color ) { // Lookups need to be very fast, insertions are not so important. // Anyway, a balanced tree is what we need here. TODO ... if ( pos < 0.0 || pos > 1.0 ) return; int index; if ( _stops.size() == 0 ) { index = 0; _stops.resize( 1 ); } else { index = findUpper( pos ); if ( index == ( int )_stops.size() || qAbs( _stops[index].pos - pos ) >= 0.001 ) { _stops.resize( _stops.size() + 1 ); for ( int i = _stops.size() - 1; i > index; i-- ) _stops[i] = _stops[i-1]; } } _stops[index] = ColorStop( pos, color ); } inline QVector QwtLinearColorMap::ColorStops::stops() const { QVector positions( _stops.size() ); for ( int i = 0; i < ( int )_stops.size(); i++ ) positions[i] = _stops[i].pos; return positions; } inline int QwtLinearColorMap::ColorStops::findUpper( double pos ) const { int index = 0; int n = _stops.size(); const ColorStop *stops = _stops.data(); while ( n > 0 ) { const int half = n >> 1; const int middle = index + half; if ( stops[middle].pos <= pos ) { index = middle + 1; n -= half + 1; } else n = half; } return index; } inline QRgb QwtLinearColorMap::ColorStops::rgb( QwtLinearColorMap::Mode mode, double pos ) const { if ( pos <= 0.0 ) return _stops[0].rgb; if ( pos >= 1.0 ) return _stops[( int )( _stops.size() - 1 )].rgb; const int index = findUpper( pos ); if ( mode == FixedColors ) { return _stops[index-1].rgb; } else { const ColorStop &s1 = _stops[index-1]; const ColorStop &s2 = _stops[index]; const double ratio = ( pos - s1.pos ) / ( s2.pos - s1.pos ); const int r = s1.r + qRound( ratio * ( s2.r - s1.r ) ); const int g = s1.g + qRound( ratio * ( s2.g - s1.g ) ); const int b = s1.b + qRound( ratio * ( s2.b - s1.b ) ); return qRgb( r, g, b ); } } //! Constructor QwtColorMap::QwtColorMap( Format format ): d_format( format ) { } //! Destructor QwtColorMap::~QwtColorMap() { } /*! Build and return a color map of 256 colors The color table is needed for rendering indexed images in combination with using colorIndex(). \param interval Range for the values \return A color table, that can be used for a QImage */ QwtColorTable QwtColorMap::colorTable( const QwtInterval &interval ) const { QwtColorTable table( 256 ); if ( interval.isValid() ) { const double step = interval.width() / ( table.size() - 1 ); for ( int i = 0; i < ( int ) table.size(); i++ ) table[i] = rgb( interval, interval.minValue() + step * i ); } return table; } class QwtLinearColorMap::PrivateData { public: ColorStops colorStops; QwtLinearColorMap::Mode mode; }; /*! Build a color map with two stops at 0.0 and 1.0. The color at 0.0 is Qt::blue, at 1.0 it is Qt::yellow. \param format Preferred format of the color map */ QwtLinearColorMap::QwtLinearColorMap( QwtColorMap::Format format ): QwtColorMap( format ) { d_data = new PrivateData; d_data->mode = ScaledColors; setColorInterval( Qt::blue, Qt::yellow ); } /*! Build a color map with two stops at 0.0 and 1.0. \param color1 Color used for the minimum value of the value interval \param color2 Color used for the maximum value of the value interval \param format Preferred format of the coor map */ QwtLinearColorMap::QwtLinearColorMap( const QColor &color1, const QColor &color2, QwtColorMap::Format format ): QwtColorMap( format ) { d_data = new PrivateData; d_data->mode = ScaledColors; setColorInterval( color1, color2 ); } //! Destructor QwtLinearColorMap::~QwtLinearColorMap() { delete d_data; } /*! \brief Set the mode of the color map FixedColors means the color is calculated from the next lower color stop. ScaledColors means the color is calculated by interpolating the colors of the adjacent stops. \sa mode() */ void QwtLinearColorMap::setMode( Mode mode ) { d_data->mode = mode; } /*! \return Mode of the color map \sa setMode() */ QwtLinearColorMap::Mode QwtLinearColorMap::mode() const { return d_data->mode; } /*! Set the color range Add stops at 0.0 and 1.0. \param color1 Color used for the minimum value of the value interval \param color2 Color used for the maximum value of the value interval \sa color1(), color2() */ void QwtLinearColorMap::setColorInterval( const QColor &color1, const QColor &color2 ) { d_data->colorStops = ColorStops(); d_data->colorStops.insert( 0.0, color1 ); d_data->colorStops.insert( 1.0, color2 ); } /*! Add a color stop The value has to be in the range [0.0, 1.0]. F.e. a stop at position 17.0 for a range [10.0,20.0] must be passed as: (17.0 - 10.0) / (20.0 - 10.0) \param value Value between [0.0, 1.0] \param color Color stop */ void QwtLinearColorMap::addColorStop( double value, const QColor& color ) { if ( value >= 0.0 && value <= 1.0 ) d_data->colorStops.insert( value, color ); } /*! Return all positions of color stops in increasing order */ QVector QwtLinearColorMap::colorStops() const { return d_data->colorStops.stops(); } /*! \return the first color of the color range \sa setColorInterval() */ QColor QwtLinearColorMap::color1() const { return QColor( d_data->colorStops.rgb( d_data->mode, 0.0 ) ); } /*! \return the second color of the color range \sa setColorInterval() */ QColor QwtLinearColorMap::color2() const { return QColor( d_data->colorStops.rgb( d_data->mode, 1.0 ) ); } /*! Map a value of a given interval into a rgb value \param interval Range for all values \param value Value to map into a rgb value */ QRgb QwtLinearColorMap::rgb( const QwtInterval &interval, double value ) const { if ( qIsNaN(value) ) return qRgba(0, 0, 0, 0); const double width = interval.width(); double ratio = 0.0; if ( width > 0.0 ) ratio = ( value - interval.minValue() ) / width; return d_data->colorStops.rgb( d_data->mode, ratio ); } /*! Map a value of a given interval into a color index, between 0 and 255 \param interval Range for all values \param value Value to map into a color index */ unsigned char QwtLinearColorMap::colorIndex( const QwtInterval &interval, double value ) const { const double width = interval.width(); if ( qIsNaN(value) || width <= 0.0 || value <= interval.minValue() ) return 0; if ( value >= interval.maxValue() ) return ( unsigned char )255; const double ratio = ( value - interval.minValue() ) / width; unsigned char index; if ( d_data->mode == FixedColors ) index = ( unsigned char )( ratio * 255 ); // always floor else index = ( unsigned char )qRound( ratio * 255 ); return index; } class QwtAlphaColorMap::PrivateData { public: QColor color; QRgb rgb; }; /*! Constructor \param color Color of the map */ QwtAlphaColorMap::QwtAlphaColorMap( const QColor &color ): QwtColorMap( QwtColorMap::RGB ) { d_data = new PrivateData; d_data->color = color; d_data->rgb = color.rgb() & qRgba( 255, 255, 255, 0 ); } //! Destructor QwtAlphaColorMap::~QwtAlphaColorMap() { delete d_data; } /*! Set the color \param color Color \sa color() */ void QwtAlphaColorMap::setColor( const QColor &color ) { d_data->color = color; d_data->rgb = color.rgb(); } /*! \return the color \sa setColor() */ QColor QwtAlphaColorMap::color() const { return d_data->color; } /*! \brief Map a value of a given interval into a alpha value alpha := (value - interval.minValue()) / interval.width(); \param interval Range for all values \param value Value to map into a rgb value \return rgb value, with an alpha value */ QRgb QwtAlphaColorMap::rgb( const QwtInterval &interval, double value ) const { const double width = interval.width(); if ( !qIsNaN(value) && width >= 0.0 ) { const double ratio = ( value - interval.minValue() ) / width; int alpha = qRound( 255 * ratio ); if ( alpha < 0 ) alpha = 0; if ( alpha > 255 ) alpha = 255; return d_data->rgb | ( alpha << 24 ); } return d_data->rgb; } /*! Dummy function, needed to be implemented as it is pure virtual in QwtColorMap. Color indices make no sense in combination with an alpha channel. \return Always 0 */ unsigned char QwtAlphaColorMap::colorIndex( const QwtInterval &, double ) const { return 0; } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_color_map.h000066400000000000000000000122121320135501600217140ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_COLOR_MAP_H #define QWT_COLOR_MAP_H #include "qwt_global.h" #include "qwt_interval.h" #include #include /*! \brief QwtColorMap is used to map values into colors. For displaying 3D data on a 2D plane the 3rd dimension is often displayed using colors, like f.e in a spectrogram. Each color map is optimized to return colors for only one of the following image formats: - QImage::Format_Indexed8\n - QImage::Format_ARGB32\n \sa QwtPlotSpectrogram, QwtScaleWidget */ class QWT_EXPORT QwtColorMap { public: /*! - RGB\n The map is intended to map into QRgb values. - Indexed\n The map is intended to map into 8 bit values, that are indices into the color table. \sa rgb(), colorIndex(), colorTable() */ enum Format { RGB, Indexed }; QwtColorMap( Format = QwtColorMap::RGB ); virtual ~QwtColorMap(); Format format() const; /*! Map a value of a given interval into a rgb value. \param interval Range for the values \param value Value \return rgb value, corresponding to value */ virtual QRgb rgb( const QwtInterval &interval, double value ) const = 0; /*! Map a value of a given interval into a color index \param interval Range for the values \param value Value \return color index, corresponding to value */ virtual unsigned char colorIndex( const QwtInterval &interval, double value ) const = 0; QColor color( const QwtInterval &, double value ) const; virtual QVector colorTable( const QwtInterval & ) const; private: Format d_format; }; /*! \brief QwtLinearColorMap builds a color map from color stops. A color stop is a color at a specific position. The valid range for the positions is [0.0, 1.0]. When mapping a value into a color it is translated into this interval. If mode() == FixedColors the color is calculated from the next lower color stop. If mode() == ScaledColors the color is calculated by interpolating the colors of the adjacent stops. */ class QWT_EXPORT QwtLinearColorMap: public QwtColorMap { public: /*! Mode of color map \sa setMode(), mode() */ enum Mode { FixedColors, ScaledColors }; QwtLinearColorMap( QwtColorMap::Format = QwtColorMap::RGB ); QwtLinearColorMap( const QColor &from, const QColor &to, QwtColorMap::Format = QwtColorMap::RGB ); virtual ~QwtLinearColorMap(); void setMode( Mode ); Mode mode() const; void setColorInterval( const QColor &color1, const QColor &color2 ); void addColorStop( double value, const QColor& ); QVector colorStops() const; QColor color1() const; QColor color2() const; virtual QRgb rgb( const QwtInterval &, double value ) const; virtual unsigned char colorIndex( const QwtInterval &, double value ) const; class ColorStops; private: // Disabled copy constructor and operator= QwtLinearColorMap( const QwtLinearColorMap & ); QwtLinearColorMap &operator=( const QwtLinearColorMap & ); class PrivateData; PrivateData *d_data; }; /*! \brief QwtAlphaColorMap variies the alpha value of a color */ class QWT_EXPORT QwtAlphaColorMap: public QwtColorMap { public: QwtAlphaColorMap( const QColor & = QColor( Qt::gray ) ); virtual ~QwtAlphaColorMap(); void setColor( const QColor & ); QColor color() const; virtual QRgb rgb( const QwtInterval &, double value ) const; private: QwtAlphaColorMap( const QwtAlphaColorMap & ); QwtAlphaColorMap &operator=( const QwtAlphaColorMap & ); virtual unsigned char colorIndex( const QwtInterval &, double value ) const; class PrivateData; PrivateData *d_data; }; /*! Map a value into a color \param interval Valid interval for values \param value Value \return Color corresponding to value \warning This method is slow for Indexed color maps. If it is necessary to map many values, its better to get the color table once and find the color using colorIndex(). */ inline QColor QwtColorMap::color( const QwtInterval &interval, double value ) const { if ( d_format == RGB ) { return QColor( rgb( interval, value ) ); } else { const unsigned int index = colorIndex( interval, value ); return colorTable( interval )[index]; // slow } } /*! \return Intended format of the color map \sa Format */ inline QwtColorMap::Format QwtColorMap::format() const { return d_format; } #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_curve_fitter.cpp000066400000000000000000000227411320135501600230050ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_curve_fitter.h" #include "qwt_math.h" #include "qwt_spline.h" #include #include #if QT_VERSION < 0x040601 #define qFabs(x) ::fabs(x) #endif //! Constructor QwtCurveFitter::QwtCurveFitter() { } //! Destructor QwtCurveFitter::~QwtCurveFitter() { } class QwtSplineCurveFitter::PrivateData { public: PrivateData(): fitMode( QwtSplineCurveFitter::Auto ), splineSize( 250 ) { } QwtSpline spline; QwtSplineCurveFitter::FitMode fitMode; int splineSize; }; //! Constructor QwtSplineCurveFitter::QwtSplineCurveFitter() { d_data = new PrivateData; } //! Destructor QwtSplineCurveFitter::~QwtSplineCurveFitter() { delete d_data; } /*! Select the algorithm used for building the spline \param mode Mode representing a spline algorithm \sa fitMode() */ void QwtSplineCurveFitter::setFitMode( FitMode mode ) { d_data->fitMode = mode; } /*! \return Mode representing a spline algorithm \sa setFitMode() */ QwtSplineCurveFitter::FitMode QwtSplineCurveFitter::fitMode() const { return d_data->fitMode; } /*! Assign a spline \param spline Spline \sa spline() */ void QwtSplineCurveFitter::setSpline( const QwtSpline &spline ) { d_data->spline = spline; d_data->spline.reset(); } /*! \return Spline \sa setSpline() */ const QwtSpline &QwtSplineCurveFitter::spline() const { return d_data->spline; } /*! \return Spline \sa setSpline() */ QwtSpline &QwtSplineCurveFitter::spline() { return d_data->spline; } /*! Assign a spline size ( has to be at least 10 points ) \param splineSize Spline size \sa splineSize() */ void QwtSplineCurveFitter::setSplineSize( int splineSize ) { d_data->splineSize = qMax( splineSize, 10 ); } /*! \return Spline size \sa setSplineSize() */ int QwtSplineCurveFitter::splineSize() const { return d_data->splineSize; } /*! Find a curve which has the best fit to a series of data points \param points Series of data points \return Curve points */ QPolygonF QwtSplineCurveFitter::fitCurve( const QPolygonF &points ) const { const int size = ( int )points.size(); if ( size <= 2 ) return points; FitMode fitMode = d_data->fitMode; if ( fitMode == Auto ) { fitMode = Spline; const QPointF *p = points.data(); for ( int i = 1; i < size; i++ ) { if ( p[i].x() <= p[i-1].x() ) { fitMode = ParametricSpline; break; } }; } if ( fitMode == ParametricSpline ) return fitParametric( points ); else return fitSpline( points ); } QPolygonF QwtSplineCurveFitter::fitSpline( const QPolygonF &points ) const { d_data->spline.setPoints( points ); if ( !d_data->spline.isValid() ) return points; QPolygonF fittedPoints( d_data->splineSize ); const double x1 = points[0].x(); const double x2 = points[int( points.size() - 1 )].x(); const double dx = x2 - x1; const double delta = dx / ( d_data->splineSize - 1 ); for ( int i = 0; i < d_data->splineSize; i++ ) { QPointF &p = fittedPoints[i]; const double v = x1 + i * delta; const double sv = d_data->spline.value( v ); p.setX( qRound( v ) ); p.setY( qRound( sv ) ); } d_data->spline.reset(); return fittedPoints; } QPolygonF QwtSplineCurveFitter::fitParametric( const QPolygonF &points ) const { int i; const int size = points.size(); QPolygonF fittedPoints( d_data->splineSize ); QPolygonF splinePointsX( size ); QPolygonF splinePointsY( size ); const QPointF *p = points.data(); QPointF *spX = splinePointsX.data(); QPointF *spY = splinePointsY.data(); double param = 0.0; for ( i = 0; i < size; i++ ) { const double x = p[i].x(); const double y = p[i].y(); if ( i > 0 ) { const double delta = qSqrt( qwtSqr( x - spX[i-1].y() ) + qwtSqr( y - spY[i-1].y() ) ); param += qMax( delta, 1.0 ); } spX[i].setX( param ); spX[i].setY( x ); spY[i].setX( param ); spY[i].setY( y ); } d_data->spline.setPoints( splinePointsX ); if ( !d_data->spline.isValid() ) return points; const double deltaX = splinePointsX[size - 1].x() / ( d_data->splineSize - 1 ); for ( i = 0; i < d_data->splineSize; i++ ) { const double dtmp = i * deltaX; fittedPoints[i].setX( qRound( d_data->spline.value( dtmp ) ) ); } d_data->spline.setPoints( splinePointsY ); if ( !d_data->spline.isValid() ) return points; const double deltaY = splinePointsY[size - 1].x() / ( d_data->splineSize - 1 ); for ( i = 0; i < d_data->splineSize; i++ ) { const double dtmp = i * deltaY; fittedPoints[i].setY( qRound( d_data->spline.value( dtmp ) ) ); } return fittedPoints; } class QwtWeedingCurveFitter::PrivateData { public: PrivateData(): tolerance( 1.0 ) { } double tolerance; }; class QwtWeedingCurveFitter::Line { public: Line( int i1 = 0, int i2 = 0 ): from( i1 ), to( i2 ) { } int from; int to; }; /*! Constructor \param tolerance Tolerance \sa setTolerance(), tolerance() */ QwtWeedingCurveFitter::QwtWeedingCurveFitter( double tolerance ) { d_data = new PrivateData; setTolerance( tolerance ); } //! Destructor QwtWeedingCurveFitter::~QwtWeedingCurveFitter() { delete d_data; } /*! Assign the tolerance The tolerance is the maximum distance, that is accaptable between the original curve and the smoothed curve. Increasing the tolerance will reduce the number of the resulting points. \param tolerance Tolerance \sa tolerance() */ void QwtWeedingCurveFitter::setTolerance( double tolerance ) { d_data->tolerance = qMax( tolerance, 0.0 ); } /*! \return Tolerance \sa setTolerance() */ double QwtWeedingCurveFitter::tolerance() const { return d_data->tolerance; } /*! \param points Series of data points \return Curve points */ QPolygonF QwtWeedingCurveFitter::fitCurve( const QPolygonF &points ) const { QStack stack; stack.reserve( 500 ); const QPointF *p = points.data(); const int nPoints = points.size(); QVector usePoint( nPoints, false ); double distToSegment; stack.push( Line( 0, nPoints - 1 ) ); while ( !stack.isEmpty() ) { const Line r = stack.pop(); // initialize line segment const double vecX = p[r.to].x() - p[r.from].x(); const double vecY = p[r.to].y() - p[r.from].y(); const double vecLength = qSqrt( vecX * vecX + vecY * vecY ); const double unitVecX = ( vecLength != 0.0 ) ? vecX / vecLength : 0.0; const double unitVecY = ( vecLength != 0.0 ) ? vecY / vecLength : 0.0; double maxDist = 0.0; int nVertexIndexMaxDistance = r.from + 1; for ( int i = r.from + 1; i < r.to; i++ ) { //compare to anchor const double fromVecX = p[i].x() - p[r.from].x(); const double fromVecY = p[i].y() - p[r.from].y(); const double fromVecLength = qSqrt( fromVecX * fromVecX + fromVecY * fromVecY ); if ( fromVecX * unitVecX + fromVecY * unitVecY < 0.0 ) { distToSegment = fromVecLength; } if ( fromVecX * unitVecX + fromVecY * unitVecY < 0.0 ) { distToSegment = fromVecLength; } else { const double toVecX = p[i].x() - p[r.to].x(); const double toVecY = p[i].y() - p[r.to].y(); const double toVecLength = qSqrt( toVecX * toVecX + toVecY * toVecY ); const double s = toVecX * ( -unitVecX ) + toVecY * ( -unitVecY ); if ( s < 0.0 ) distToSegment = toVecLength; else { distToSegment = qSqrt( qFabs( toVecLength * toVecLength - s * s ) ); } } if ( maxDist < distToSegment ) { maxDist = distToSegment; nVertexIndexMaxDistance = i; } } if ( maxDist <= d_data->tolerance ) { usePoint[r.from] = true; usePoint[r.to] = true; } else { stack.push( Line( r.from, nVertexIndexMaxDistance ) ); stack.push( Line( nVertexIndexMaxDistance, r.to ) ); } } int cnt = 0; QPolygonF stripped( nPoints ); for ( int i = 0; i < nPoints; i++ ) { if ( usePoint[i] ) stripped[cnt++] = p[i]; } stripped.resize( cnt ); return stripped; } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_curve_fitter.h000066400000000000000000000065301320135501600224500ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_CURVE_FITTER_H #define QWT_CURVE_FITTER_H #include "qwt_global.h" #include #include class QwtSpline; /*! \brief Abstract base class for a curve fitter */ class QWT_EXPORT QwtCurveFitter { public: virtual ~QwtCurveFitter(); /*! Find a curve which has the best fit to a series of data points \param polygon Series of data points \return Curve points */ virtual QPolygonF fitCurve( const QPolygonF &polygon ) const = 0; protected: QwtCurveFitter(); private: QwtCurveFitter( const QwtCurveFitter & ); QwtCurveFitter &operator=( const QwtCurveFitter & ); }; /*! \brief A curve fitter using cubic splines */ class QWT_EXPORT QwtSplineCurveFitter: public QwtCurveFitter { public: /*! - Spline\n Use a default spline algorithm - ParametricSpline\n Use a parametric spline algorithm - Auto\n Use the default spline algorithm for polygons with increasing x values ( p[i-1] < p[i] ), otherwise use a parametric spline algorithm. The default setting is Auto \sa setFitMode(), FitMode() */ enum FitMode { Auto, Spline, ParametricSpline }; QwtSplineCurveFitter(); virtual ~QwtSplineCurveFitter(); void setFitMode( FitMode ); FitMode fitMode() const; void setSpline( const QwtSpline& ); const QwtSpline &spline() const; QwtSpline &spline(); void setSplineSize( int size ); int splineSize() const; virtual QPolygonF fitCurve( const QPolygonF & ) const; private: QPolygonF fitSpline( const QPolygonF & ) const; QPolygonF fitParametric( const QPolygonF & ) const; class PrivateData; PrivateData *d_data; }; /*! \brief A curve fitter implementing Douglas and Peucker algorithm The purpose of the Douglas and Peucker algorithm is that given a 'curve' composed of line segments to find a curve not too dissimilar but that has fewer points. The algorithm defines 'too dissimilar' based on the maximum distance (tolerance) between the original curve and the smoothed curve. The smoothed curve consists of a subset of the points that defined the original curve. In opposite to QwtSplineCurveFitter the Douglas and Peucker algorithm reduces the number of points. By adjusting the tolerance parameter according to the axis scales QwtSplineCurveFitter can be used to implement different level of details to speed up painting of curves of many points. */ class QWT_EXPORT QwtWeedingCurveFitter: public QwtCurveFitter { public: QwtWeedingCurveFitter( double tolerance = 1.0 ); virtual ~QwtWeedingCurveFitter(); void setTolerance( double ); double tolerance() const; virtual QPolygonF fitCurve( const QPolygonF & ) const; private: class Line; class PrivateData; PrivateData *d_data; }; #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_dial.cpp000066400000000000000000000717051320135501600212210ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_dial.h" #include "qwt_dial_needle.h" #include "qwt_math.h" #include "qwt_scale_engine.h" #include "qwt_scale_map.h" #include "qwt_painter.h" #include #include #include #include #include #include #include #if QT_VERSION < 0x040601 #define qAtan(x) ::atan(x) #endif class QwtDial::PrivateData { public: PrivateData(): visibleBackground( true ), frameShadow( Sunken ), lineWidth( 0 ), mode( RotateNeedle ), direction( Clockwise ), origin( 90.0 ), minScaleArc( 0.0 ), maxScaleArc( 0.0 ), scaleDraw( 0 ), maxMajIntv( 36 ), maxMinIntv( 10 ), scaleStep( 0.0 ), needle( 0 ) { } ~PrivateData() { delete scaleDraw; delete needle; } bool visibleBackground; Shadow frameShadow; int lineWidth; QwtDial::Mode mode; QwtDial::Direction direction; double origin; double minScaleArc; double maxScaleArc; QwtDialScaleDraw *scaleDraw; int maxMajIntv; int maxMinIntv; double scaleStep; QwtDialNeedle *needle; static double previousDir; }; double QwtDial::PrivateData::previousDir = -1.0; /*! Constructor \param parent Parent dial widget */ QwtDialScaleDraw::QwtDialScaleDraw( QwtDial *parent ): d_parent( parent ), d_penWidth( 1.0 ) { } /*! Set the pen width used for painting the scale \param penWidth Pen width \sa penWidth(), QwtDial::drawScale() */ void QwtDialScaleDraw::setPenWidth( double penWidth ) { d_penWidth = qMax( penWidth, 0.0 ); } /*! \return Pen width used for painting the scale \sa setPenWidth, QwtDial::drawScale() */ double QwtDialScaleDraw::penWidth() const { return d_penWidth; } /*! Call QwtDial::scaleLabel of the parent dial widget. \param value Value to display \sa QwtDial::scaleLabel() */ QwtText QwtDialScaleDraw::label( double value ) const { if ( d_parent == NULL ) return QwtRoundScaleDraw::label( value ); return d_parent->scaleLabel( value ); } /*! \brief Constructor \param parent Parent widget Create a dial widget with no scale and no needle. The default origin is 90.0 with no valid value. It accepts mouse and keyboard inputs and has no step size. The default mode is QwtDial::RotateNeedle. */ QwtDial::QwtDial( QWidget* parent ): QwtAbstractSlider( Qt::Horizontal, parent ) { initDial(); } void QwtDial::initDial() { d_data = new PrivateData; setFocusPolicy( Qt::TabFocus ); QPalette p = palette(); for ( int i = 0; i < QPalette::NColorGroups; i++ ) { const QPalette::ColorGroup cg = ( QPalette::ColorGroup )i; // Base: background color of the circle inside the frame. // WindowText: background color of the circle inside the scale p.setColor( cg, QPalette::WindowText, p.color( cg, QPalette::Base ) ); } setPalette( p ); d_data->scaleDraw = new QwtDialScaleDraw( this ); d_data->scaleDraw->setRadius( 0 ); setScaleArc( 0.0, 360.0 ); // scale as a full circle setRange( 0.0, 360.0, 1.0, 10 ); // degrees as deafult } //! Destructor QwtDial::~QwtDial() { delete d_data; } /*! Show/Hide the area outside of the frame \param show Show if true, hide if false \sa hasVisibleBackground(), setMask() \warning When QwtDial is a toplevel widget the window border might disappear too. */ void QwtDial::showBackground( bool show ) { if ( d_data->visibleBackground != show ) { d_data->visibleBackground = show; updateMask(); } } /*! true when the area outside of the frame is visible \sa showBackground(), setMask() */ bool QwtDial::hasVisibleBackground() const { return d_data->visibleBackground; } /*! Sets the frame shadow value from the frame style. \param shadow Frame shadow \sa setLineWidth(), QFrame::setFrameShadow() */ void QwtDial::setFrameShadow( Shadow shadow ) { if ( shadow != d_data->frameShadow ) { d_data->frameShadow = shadow; if ( lineWidth() > 0 ) update(); } } /*! \return Frame shadow /sa setFrameShadow(), lineWidth(), QFrame::frameShadow */ QwtDial::Shadow QwtDial::frameShadow() const { return d_data->frameShadow; } /*! Sets the line width \param lineWidth Line width \sa setFrameShadow() */ void QwtDial::setLineWidth( int lineWidth ) { if ( lineWidth < 0 ) lineWidth = 0; if ( d_data->lineWidth != lineWidth ) { d_data->lineWidth = lineWidth; update(); } } /*! \return Line width of the frame \sa setLineWidth(), frameShadow(), lineWidth() */ int QwtDial::lineWidth() const { return d_data->lineWidth; } /*! \return bounding rect of the circle inside the frame \sa setLineWidth(), scaleContentsRect(), boundingRect() */ QRect QwtDial::contentsRect() const { const int lw = lineWidth(); QRect r = boundingRect(); if ( lw > 0 ) { r.setRect( r.x() + lw, r.y() + lw, r.width() - 2 * lw, r.height() - 2 * lw ); } return r; } /*! \return bounding rect of the dial including the frame \sa setLineWidth(), scaleContentsRect(), contentsRect() */ QRect QwtDial::boundingRect() const { const int radius = qMin( width(), height() ) / 2; QRect r( 0, 0, 2 * radius, 2 * radius ); r.moveCenter( rect().center() ); return r; } /*! \return rect inside the scale \sa setLineWidth(), boundingRect(), contentsRect() */ QRect QwtDial::scaleContentsRect() const { const QPen scalePen( palette().text(), 0, Qt::NoPen ); int scaleDist = 0; if ( d_data->scaleDraw ) { scaleDist = qCeil( d_data->scaleDraw->extent( font() ) ); scaleDist++; // margin } const QRect rect = contentsRect(); return QRect( rect.x() + scaleDist, rect.y() + scaleDist, rect.width() - 2 * scaleDist, rect.height() - 2 * scaleDist ); } /*! \brief Change the mode of the meter. \param mode New mode The value of the meter is indicated by the difference between north of the scale and the direction of the needle. In case of QwtDial::RotateNeedle north is pointing to the origin() and the needle is rotating, in case of QwtDial::RotateScale, the needle points to origin() and the scale is rotating. The default mode is QwtDial::RotateNeedle. \sa mode(), setValue(), setOrigin() */ void QwtDial::setMode( Mode mode ) { if ( mode != d_data->mode ) { d_data->mode = mode; update(); } } /*! \return mode of the dial. The value of the dial is indicated by the difference between the origin and the direction of the needle. In case of QwtDial::RotateNeedle the scale arc is fixed to the origin() and the needle is rotating, in case of QwtDial::RotateScale, the needle points to origin() and the scale is rotating. The default mode is QwtDial::RotateNeedle. \sa setMode(), origin(), setScaleArc(), value() */ QwtDial::Mode QwtDial::mode() const { return d_data->mode; } /*! Sets whether it is possible to step the value from the highest value to the lowest value and vice versa to on. \param wrapping en/disables wrapping \sa wrapping(), QwtDoubleRange::periodic() \note The meaning of wrapping is like the wrapping property of QSpinBox, but not like it is used in QDial. */ void QwtDial::setWrapping( bool wrapping ) { setPeriodic( wrapping ); } /*! wrapping() holds whether it is possible to step the value from the highest value to the lowest value and vice versa. \sa setWrapping(), QwtDoubleRange::setPeriodic() \note The meaning of wrapping is like the wrapping property of QSpinBox, but not like it is used in QDial. */ bool QwtDial::wrapping() const { return periodic(); } /*! Set the direction of the dial (clockwise/counterclockwise) Direction direction \sa direction() */ void QwtDial::setDirection( Direction direction ) { if ( direction != d_data->direction ) { d_data->direction = direction; update(); } } /*! \return Direction of the dial The default direction of a dial is QwtDial::Clockwise \sa setDirection() */ QwtDial::Direction QwtDial::direction() const { return d_data->direction; } /*! Resize the dial widget \param e Resize event */ void QwtDial::resizeEvent( QResizeEvent *e ) { QWidget::resizeEvent( e ); if ( !hasVisibleBackground() ) updateMask(); } /*! Paint the dial \param e Paint event */ void QwtDial::paintEvent( QPaintEvent *e ) { const QRect &ur = e->rect(); if ( ur.isValid() ) { QPainter painter( this ); painter.setRenderHint( QPainter::Antialiasing, true ); painter.save(); drawContents( &painter ); painter.restore(); painter.save(); drawFrame( &painter ); painter.restore(); if ( hasFocus() ) drawFocusIndicator( &painter ); } } /*! Draw a dotted round circle, if !isReadOnly() \param painter Painter */ void QwtDial::drawFocusIndicator( QPainter *painter ) const { if ( !isReadOnly() ) { QRect focusRect = contentsRect(); const int margin = 2; focusRect.setRect( focusRect.x() + margin, focusRect.y() + margin, focusRect.width() - 2 * margin, focusRect.height() - 2 * margin ); QColor color = palette().color( QPalette::Base ); if ( color.isValid() ) { const QColor gray( Qt::gray ); int h, s, v; color.getHsv( &h, &s, &v ); color = ( v > 128 ) ? gray.dark( 120 ) : gray.light( 120 ); } else color = Qt::darkGray; painter->save(); painter->setBrush( Qt::NoBrush ); painter->setPen( QPen( color, 0, Qt::DotLine ) ); painter->drawEllipse( focusRect ); painter->restore(); } } /*! Draw the frame around the dial \param painter Painter \sa lineWidth(), frameShadow() */ void QwtDial::drawFrame( QPainter *painter ) { const int lw = lineWidth(); const int off = ( lw + 1 ) % 2; QRect r = boundingRect(); r.setRect( r.x() + lw / 2 - off, r.y() + lw / 2 - off, r.width() - lw + off + 1, r.height() - lw + off + 1 ); r.setX( r.x() + 1 ); r.setY( r.y() + 1 ); r.setWidth( r.width() - 2 ); r.setHeight( r.height() - 2 ); if ( lw > 0 ) { switch ( d_data->frameShadow ) { case QwtDial::Raised: QwtPainter::drawRoundFrame( painter, r, lw, palette(), false ); break; case QwtDial::Sunken: QwtPainter::drawRoundFrame( painter, r, lw, palette(), true ); break; default: // Plain { painter->save(); painter->setPen( QPen( Qt::black, lw ) ); painter->setBrush( Qt::NoBrush ); painter->drawEllipse( r ); painter->restore(); } } } } /*! \brief Draw the contents inside the frame QPalette::Window is the background color outside of the frame. QPalette::Base is the background color inside the frame. QPalette::WindowText is the background color inside the scale. \param painter Painter \sa boundingRect(), contentsRect(), scaleContentsRect(), QWidget::setPalette() */ void QwtDial::drawContents( QPainter *painter ) const { if ( testAttribute( Qt::WA_NoSystemBackground ) || palette().brush( QPalette::Base ) != palette().brush( QPalette::Window ) ) { const QRect br = boundingRect(); painter->save(); painter->setPen( Qt::NoPen ); painter->setBrush( palette().brush( QPalette::Base ) ); painter->drawEllipse( br ); painter->restore(); } const QRect insideScaleRect = scaleContentsRect(); if ( palette().brush( QPalette::WindowText ) != palette().brush( QPalette::Base ) ) { painter->save(); painter->setPen( Qt::NoPen ); painter->setBrush( palette().brush( QPalette::WindowText ) ); painter->drawEllipse( insideScaleRect.x() - 1, insideScaleRect.y() - 1, insideScaleRect.width(), insideScaleRect.height() ); painter->restore(); } const QPoint center = insideScaleRect.center(); const int radius = insideScaleRect.width() / 2; painter->save(); drawScaleContents( painter, center, radius ); painter->restore(); double direction = d_data->origin; if ( isValid() ) { direction = d_data->minScaleArc; if ( maxValue() > minValue() && d_data->maxScaleArc > d_data->minScaleArc ) { const double ratio = ( value() - minValue() ) / ( maxValue() - minValue() ); direction += ratio * ( d_data->maxScaleArc - d_data->minScaleArc ); } if ( d_data->direction == QwtDial::CounterClockwise ) direction = d_data->maxScaleArc - ( direction - d_data->minScaleArc ); direction += d_data->origin; if ( direction >= 360.0 ) direction -= 360.0; else if ( direction < 0.0 ) direction += 360.0; } double origin = d_data->origin; if ( mode() == RotateScale ) { origin -= direction - d_data->origin; direction = d_data->origin; } painter->save(); drawScale( painter, center, radius, origin, d_data->minScaleArc, d_data->maxScaleArc ); painter->restore(); if ( isValid() ) { QPalette::ColorGroup cg; if ( isEnabled() ) cg = hasFocus() ? QPalette::Active : QPalette::Inactive; else cg = QPalette::Disabled; painter->save(); drawNeedle( painter, center, radius, direction, cg ); painter->restore(); } } /*! Draw the needle \param painter Painter \param center Center of the dial \param radius Length for the needle \param direction Direction of the needle in degrees, counter clockwise \param cg ColorGroup */ void QwtDial::drawNeedle( QPainter *painter, const QPoint ¢er, int radius, double direction, QPalette::ColorGroup cg ) const { if ( d_data->needle ) { direction = 360.0 - direction; // counter clockwise d_data->needle->draw( painter, center, radius, direction, cg ); } } /*! Draw the scale \param painter Painter \param center Center of the dial \param radius Radius of the scale \param origin Origin of the scale \param minArc Minimum of the arc \param maxArc Minimum of the arc \sa QwtAbstractScaleDraw::setAngleRange() */ void QwtDial::drawScale( QPainter *painter, const QPoint ¢er, int radius, double origin, double minArc, double maxArc ) const { if ( d_data->scaleDraw == NULL ) return; origin -= 270.0; // hardcoded origin of QwtScaleDraw double angle = maxArc - minArc; if ( angle > 360.0 ) angle = ::fmod( angle, 360.0 ); minArc += origin; if ( minArc < -360.0 ) minArc = ::fmod( minArc, 360.0 ); maxArc = minArc + angle; if ( maxArc > 360.0 ) { // QwtAbstractScaleDraw::setAngleRange accepts only values // in the range [-360.0..360.0] minArc -= 360.0; maxArc -= 360.0; } if ( d_data->direction == QwtDial::CounterClockwise ) qSwap( minArc, maxArc ); painter->setFont( font() ); d_data->scaleDraw->setAngleRange( minArc, maxArc ); d_data->scaleDraw->setRadius( radius ); d_data->scaleDraw->moveCenter( center ); QPalette pal = palette(); const QColor textColor = pal.color( QPalette::Text ); pal.setColor( QPalette::WindowText, textColor ); //ticks, backbone painter->setPen( QPen( textColor, d_data->scaleDraw->penWidth() ) ); d_data->scaleDraw->draw( painter, pal ); } void QwtDial::drawScaleContents( QPainter *, const QPoint &, int ) const { // empty default implementation } /*! Set a needle for the dial Qwt is missing a set of good looking needles. Contributions are very welcome. \param needle Needle \warning The needle will be deleted, when a different needle is set or in ~QwtDial() */ void QwtDial::setNeedle( QwtDialNeedle *needle ) { if ( needle != d_data->needle ) { if ( d_data->needle ) delete d_data->needle; d_data->needle = needle; update(); } } /*! \return needle \sa setNeedle() */ const QwtDialNeedle *QwtDial::needle() const { return d_data->needle; } /*! \return needle \sa setNeedle() */ QwtDialNeedle *QwtDial::needle() { return d_data->needle; } //! QwtDoubleRange update hook void QwtDial::rangeChange() { updateScale(); } /*! Update the scale with the current attributes \sa setScale() */ void QwtDial::updateScale() { if ( d_data->scaleDraw ) { QwtLinearScaleEngine scaleEngine; const QwtScaleDiv scaleDiv = scaleEngine.divideScale( minValue(), maxValue(), d_data->maxMajIntv, d_data->maxMinIntv, d_data->scaleStep ); d_data->scaleDraw->setTransformation( scaleEngine.transformation() ); d_data->scaleDraw->setScaleDiv( scaleDiv ); } } //! Return the scale draw QwtDialScaleDraw *QwtDial::scaleDraw() { return d_data->scaleDraw; } //! Return the scale draw const QwtDialScaleDraw *QwtDial::scaleDraw() const { return d_data->scaleDraw; } /*! Set an individual scale draw \param scaleDraw Scale draw \warning The previous scale draw is deleted */ void QwtDial::setScaleDraw( QwtDialScaleDraw *scaleDraw ) { if ( scaleDraw != d_data->scaleDraw ) { if ( d_data->scaleDraw ) delete d_data->scaleDraw; d_data->scaleDraw = scaleDraw; updateScale(); update(); } } /*! Change the intervals of the scale \sa QwtAbstractScaleDraw::setScale() */ void QwtDial::setScale( int maxMajIntv, int maxMinIntv, double step ) { d_data->maxMajIntv = maxMajIntv; d_data->maxMinIntv = maxMinIntv; d_data->scaleStep = step; updateScale(); } /*! A wrapper method for accessing the scale draw. - options == 0\n No visible scale: setScaleDraw(NULL) - options & ScaleBackbone\n En/disable the backbone of the scale. - options & ScaleTicks\n En/disable the ticks of the scale. - options & ScaleLabel\n En/disable scale labels \sa QwtAbstractScaleDraw::enableComponent() */ void QwtDial::setScaleOptions( int options ) { if ( options == 0 ) setScaleDraw( NULL ); QwtDialScaleDraw *sd = d_data->scaleDraw; if ( sd == NULL ) return; sd->enableComponent( QwtAbstractScaleDraw::Backbone, options & ScaleBackbone ); sd->enableComponent( QwtAbstractScaleDraw::Ticks, options & ScaleTicks ); sd->enableComponent( QwtAbstractScaleDraw::Labels, options & ScaleLabel ); } /*! Assign length and width of the ticks \param minLen Length of the minor ticks \param medLen Length of the medium ticks \param majLen Length of the major ticks \param penWidth Width of the pen for all ticks \sa QwtAbstractScaleDraw::setTickLength(), QwtDialScaleDraw::setPenWidth() */ void QwtDial::setScaleTicks( int minLen, int medLen, int majLen, int penWidth ) { QwtDialScaleDraw *sd = d_data->scaleDraw; if ( sd ) { sd->setTickLength( QwtScaleDiv::MinorTick, minLen ); sd->setTickLength( QwtScaleDiv::MediumTick, medLen ); sd->setTickLength( QwtScaleDiv::MajorTick, majLen ); sd->setPenWidth( penWidth ); } } /*! Find the label for a value \param value Value \return label */ QwtText QwtDial::scaleLabel( double value ) const { #if 1 if ( value == -0 ) value = 0; #endif return QString::number( value ); } //! \return Lower limit of the scale arc double QwtDial::minScaleArc() const { return d_data->minScaleArc; } //! \return Upper limit of the scale arc double QwtDial::maxScaleArc() const { return d_data->maxScaleArc; } /*! \brief Change the origin The origin is the angle where scale and needle is relative to. \param origin New origin \sa origin() */ void QwtDial::setOrigin( double origin ) { d_data->origin = origin; update(); } /*! The origin is the angle where scale and needle is relative to. \return Origin of the dial \sa setOrigin() */ double QwtDial::origin() const { return d_data->origin; } /*! Change the arc of the scale \param minArc Lower limit \param maxArc Upper limit */ void QwtDial::setScaleArc( double minArc, double maxArc ) { if ( minArc != 360.0 && minArc != -360.0 ) minArc = ::fmod( minArc, 360.0 ); if ( maxArc != 360.0 && maxArc != -360.0 ) maxArc = ::fmod( maxArc, 360.0 ); d_data->minScaleArc = qMin( minArc, maxArc ); d_data->maxScaleArc = qMax( minArc, maxArc ); if ( d_data->maxScaleArc - d_data->minScaleArc > 360.0 ) d_data->maxScaleArc = d_data->minScaleArc + 360.0; update(); } //! QwtDoubleRange update hook void QwtDial::valueChange() { update(); QwtAbstractSlider::valueChange(); } /*! \return Size hint */ QSize QwtDial::sizeHint() const { int sh = 0; if ( d_data->scaleDraw ) sh = qCeil( d_data->scaleDraw->extent( font() ) ); const int d = 6 * sh + 2 * lineWidth(); return QSize( d, d ); } /*! \brief Return a minimum size hint \warning The return value of QwtDial::minimumSizeHint() depends on the font and the scale. */ QSize QwtDial::minimumSizeHint() const { int sh = 0; if ( d_data->scaleDraw ) sh = qCeil( d_data->scaleDraw->extent( font() ) ); const int d = 3 * sh + 2 * lineWidth(); return QSize( d, d ); } static double line2Radians( const QPoint &p1, const QPoint &p2 ) { const QPoint p = p2 - p1; double angle; if ( p.x() == 0 ) angle = ( p.y() <= 0 ) ? M_PI_2 : 3 * M_PI_2; else { angle = qAtan( double( -p.y() ) / double( p.x() ) ); if ( p.x() < 0 ) angle += M_PI; if ( angle < 0.0 ) angle += 2 * M_PI; } return 360.0 - angle * 180.0 / M_PI; } /*! Find the value for a given position \param pos Position \return Value */ double QwtDial::getValue( const QPoint &pos ) { if ( d_data->maxScaleArc == d_data->minScaleArc || maxValue() == minValue() ) return minValue(); double dir = line2Radians( rect().center(), pos ) - d_data->origin; if ( dir < 0.0 ) dir += 360.0; if ( mode() == RotateScale ) dir = 360.0 - dir; // The position might be in the area that is outside the scale arc. // We need the range of the scale if it was a complete circle. const double completeCircle = 360.0 / ( d_data->maxScaleArc - d_data->minScaleArc ) * ( maxValue() - minValue() ); double posValue = minValue() + completeCircle * dir / 360.0; if ( scrollMode() == ScrMouse ) { if ( d_data->previousDir >= 0.0 ) // valid direction { // We have to find out whether the mouse is moving // clock or counter clockwise bool clockWise = false; const double angle = dir - d_data->previousDir; if ( ( angle >= 0.0 && angle <= 180.0 ) || angle < -180.0 ) clockWise = true; if ( clockWise ) { if ( dir < d_data->previousDir && mouseOffset() > 0.0 ) { // We passed 360 -> 0 setMouseOffset( mouseOffset() - completeCircle ); } if ( wrapping() ) { if ( posValue - mouseOffset() > maxValue() ) { // We passed maxValue and the value will be set // to minValue. We have to adjust the mouseOffset. setMouseOffset( posValue - minValue() ); } } else { if ( posValue - mouseOffset() > maxValue() || value() == maxValue() ) { // We fix the value at maxValue by adjusting // the mouse offset. setMouseOffset( posValue - maxValue() ); } } } else { if ( dir > d_data->previousDir && mouseOffset() < 0.0 ) { // We passed 0 -> 360 setMouseOffset( mouseOffset() + completeCircle ); } if ( wrapping() ) { if ( posValue - mouseOffset() < minValue() ) { // We passed minValue and the value will be set // to maxValue. We have to adjust the mouseOffset. setMouseOffset( posValue - maxValue() ); } } else { if ( posValue - mouseOffset() < minValue() || value() == minValue() ) { // We fix the value at minValue by adjusting // the mouse offset. setMouseOffset( posValue - minValue() ); } } } } d_data->previousDir = dir; } return posValue; } /*! See QwtAbstractSlider::getScrollMode() \param pos point where the mouse was pressed \retval scrollMode The scrolling mode \retval direction direction: 1, 0, or -1. \sa QwtAbstractSlider::getScrollMode() */ void QwtDial::getScrollMode( const QPoint &pos, int &scrollMode, int &direction ) { direction = 0; scrollMode = ScrNone; const QRegion region( contentsRect(), QRegion::Ellipse ); if ( region.contains( pos ) && pos != rect().center() ) { scrollMode = ScrMouse; d_data->previousDir = -1.0; } } /*! Handles key events - Key_Down, KeyLeft\n Decrement by 1 - Key_Prior\n Decrement by pageSize() - Key_Home\n Set the value to minValue() - Key_Up, KeyRight\n Increment by 1 - Key_Next\n Increment by pageSize() - Key_End\n Set the value to maxValue() \param event Key event \sa isReadOnly() */ void QwtDial::keyPressEvent( QKeyEvent *event ) { if ( isReadOnly() ) { event->ignore(); return; } if ( !isValid() ) return; double previous = prevValue(); switch ( event->key() ) { case Qt::Key_Down: case Qt::Key_Left: QwtDoubleRange::incValue( -1 ); break; case Qt::Key_PageUp: QwtDoubleRange::incValue( -pageSize() ); break; case Qt::Key_Home: setValue( minValue() ); break; case Qt::Key_Up: case Qt::Key_Right: QwtDoubleRange::incValue( 1 ); break; case Qt::Key_PageDown: QwtDoubleRange::incValue( pageSize() ); break; case Qt::Key_End: setValue( maxValue() ); break; default:; event->ignore(); } if ( value() != previous ) Q_EMIT sliderMoved( value() ); } /*! \brief Update the mask of the dial In case of "hasVisibleBackground() == false", the backgound is transparent by a mask. \sa showBackground(), hasVisibleBackground() */ void QwtDial::updateMask() { if ( d_data->visibleBackground ) clearMask(); else setMask( QRegion( boundingRect(), QRegion::Ellipse ) ); } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_dial.h000066400000000000000000000141101320135501600206510ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_DIAL_H #define QWT_DIAL_H 1 #include "qwt_global.h" #include "qwt_abstract_slider.h" #include "qwt_round_scale_draw.h" #include #include class QwtDialNeedle; class QwtDial; /*! \brief A special scale draw made for QwtDial \sa QwtDial, QwtCompass */ class QWT_EXPORT QwtDialScaleDraw: public QwtRoundScaleDraw { public: explicit QwtDialScaleDraw( QwtDial * ); virtual QwtText label( double value ) const; void setPenWidth( double ); double penWidth() const; private: QwtDial *d_parent; double d_penWidth; }; /*! \brief QwtDial class provides a rounded range control. QwtDial is intended as base class for dial widgets like speedometers, compass widgets, clocks ... \image html dials2.png A dial contains a scale and a needle indicating the current value of the dial. Depending on Mode one of them is fixed and the other is rotating. If not isReadOnly() the dial can be rotated by dragging the mouse or using keyboard inputs (see keyPressEvent()). A dial might be wrapping, what means a rotation below/above one limit continues on the other limit (f.e compass). The scale might cover any arc of the dial, its values are related to the origin() of the dial. Qwt is missing a set of good looking needles (QwtDialNeedle). Contributions are very welcome. \sa QwtCompass, QwtAnalogClock, QwtDialNeedle \note The examples/dials example shows different types of dials. */ class QWT_EXPORT QwtDial: public QwtAbstractSlider { Q_OBJECT Q_ENUMS( Shadow ) Q_ENUMS( Mode ) Q_ENUMS( Direction ) Q_PROPERTY( bool visibleBackground READ hasVisibleBackground WRITE showBackground ) Q_PROPERTY( int lineWidth READ lineWidth WRITE setLineWidth ) Q_PROPERTY( Shadow frameShadow READ frameShadow WRITE setFrameShadow ) Q_PROPERTY( Mode mode READ mode WRITE setMode ) Q_PROPERTY( double origin READ origin WRITE setOrigin ) Q_PROPERTY( bool wrapping READ wrapping WRITE setWrapping ) Q_PROPERTY( Direction direction READ direction WRITE setDirection ) friend class QwtDialScaleDraw; public: /*! \brief Frame shadow Unfortunately it is not possible to use QFrame::Shadow as a property of a widget that is not derived from QFrame. The following enum is made for the designer only. It is safe to use QFrame::Shadow instead. */ enum Shadow { Plain = QFrame::Plain, Raised = QFrame::Raised, Sunken = QFrame::Sunken }; //! see QwtDial::setScaleOptions enum ScaleOptions { ScaleBackbone = 1, ScaleTicks = 2, ScaleLabel = 4 }; /*! In case of RotateNeedle the needle is rotating, in case of RotateScale, the needle points to origin() and the scale is rotating. */ enum Mode { RotateNeedle, RotateScale }; /*! Direction of the dial */ enum Direction { Clockwise, CounterClockwise }; explicit QwtDial( QWidget *parent = NULL ); virtual ~QwtDial(); void setFrameShadow( Shadow ); Shadow frameShadow() const; bool hasVisibleBackground() const; void showBackground( bool ); void setLineWidth( int ); int lineWidth() const; void setMode( Mode ); Mode mode() const; virtual void setWrapping( bool ); bool wrapping() const; virtual void setScale( int maxMajIntv, int maxMinIntv, double step = 0.0 ); void setScaleArc( double min, double max ); void setScaleOptions( int ); void setScaleTicks( int minLen, int medLen, int majLen, int penWidth = 1 ); double minScaleArc() const; double maxScaleArc() const; virtual void setOrigin( double ); double origin() const; void setDirection( Direction ); Direction direction() const; virtual void setNeedle( QwtDialNeedle * ); const QwtDialNeedle *needle() const; QwtDialNeedle *needle(); QRect boundingRect() const; QRect contentsRect() const; virtual QRect scaleContentsRect() const; virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; virtual void setScaleDraw( QwtDialScaleDraw * ); QwtDialScaleDraw *scaleDraw(); const QwtDialScaleDraw *scaleDraw() const; protected: virtual void paintEvent( QPaintEvent * ); virtual void resizeEvent( QResizeEvent * ); virtual void keyPressEvent( QKeyEvent * ); virtual void updateMask(); virtual void drawFrame( QPainter *p ); virtual void drawContents( QPainter * ) const; virtual void drawFocusIndicator( QPainter * ) const; virtual void drawScale( QPainter *, const QPoint ¢er, int radius, double origin, double arcMin, double arcMax ) const; /*! Draw the contents inside the scale Paints nothing. \param painter Painter \param center Center of the contents circle \param radius Radius of the contents circle */ virtual void drawScaleContents( QPainter *painter, const QPoint ¢er, int radius ) const; virtual void drawNeedle( QPainter *, const QPoint &, int radius, double direction, QPalette::ColorGroup ) const; virtual QwtText scaleLabel( double ) const; void updateScale(); virtual void rangeChange(); virtual void valueChange(); virtual double getValue( const QPoint & ); virtual void getScrollMode( const QPoint &, int &scrollMode, int &direction ); private: void initDial(); class PrivateData; PrivateData *d_data; }; #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_dial_needle.cpp000066400000000000000000000420411320135501600225240ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_dial_needle.h" #include "qwt_global.h" #include "qwt_math.h" #include "qwt_painter.h" #include #include //! Constructor QwtDialNeedle::QwtDialNeedle(): d_palette( QApplication::palette() ) { } //! Destructor QwtDialNeedle::~QwtDialNeedle() { } /*! Sets the palette for the needle. \param palette New Palette */ void QwtDialNeedle::setPalette( const QPalette &palette ) { d_palette = palette; } /*! \return the palette of the needle. */ const QPalette &QwtDialNeedle::palette() const { return d_palette; } //! Draw the knob void QwtDialNeedle::drawKnob( QPainter *painter, const QPoint &pos, int width, const QBrush &brush, bool sunken ) { painter->save(); QRect rect( 0, 0, width, width ); rect.moveCenter( pos ); painter->setPen( Qt::NoPen ); painter->setBrush( brush ); painter->drawEllipse( rect ); painter->setBrush( Qt::NoBrush ); const int colorOffset = 20; int startAngle = 45; if ( sunken ) startAngle += 180; QPen pen; pen.setWidth( 1 ); pen.setColor( brush.color().dark( 100 - colorOffset ) ); painter->setPen( pen ); painter->drawArc( rect, startAngle * 16, 180 * 16 ); pen.setColor( brush.color().dark( 100 + colorOffset ) ); painter->setPen( pen ); painter->drawArc( rect, ( startAngle + 180 ) * 16, 180 * 16 ); painter->restore(); } /*! Constructor \param style Style \param hasKnob With/Without knob \param mid Middle color \param base Base color */ QwtDialSimpleNeedle::QwtDialSimpleNeedle( Style style, bool hasKnob, const QColor &mid, const QColor &base ): d_style( style ), d_hasKnob( hasKnob ), d_width( -1 ) { QPalette palette; for ( int i = 0; i < QPalette::NColorGroups; i++ ) { palette.setColor( ( QPalette::ColorGroup )i, QPalette::Mid, mid ); palette.setColor( ( QPalette::ColorGroup )i, QPalette::Base, base ); } setPalette( palette ); } /*! Set the width of the needle \param width Width \sa width() */ void QwtDialSimpleNeedle::setWidth( int width ) { d_width = width; } /*! \return the width of the needle \sa setWidth() */ int QwtDialSimpleNeedle::width() const { return d_width; } /*! Draw the needle \param painter Painter \param center Center of the dial, start position for the needle \param length Length of the needle \param direction Direction of the needle, in degrees counter clockwise \param colorGroup Color group, used for painting */ void QwtDialSimpleNeedle::draw( QPainter *painter, const QPoint ¢er, int length, double direction, QPalette::ColorGroup colorGroup ) const { if ( d_style == Arrow ) { drawArrowNeedle( painter, palette(), colorGroup, center, length, d_width, direction, d_hasKnob ); } else { drawRayNeedle( painter, palette(), colorGroup, center, length, d_width, direction, d_hasKnob ); } } /*! Draw a needle looking like a ray \param painter Painter \param palette Palette \param colorGroup Color group \param center center of the needle \param length Length of the needle \param width Width of the needle \param direction Current Direction \param hasKnob With/Without knob */ void QwtDialSimpleNeedle::drawRayNeedle( QPainter *painter, const QPalette &palette, QPalette::ColorGroup colorGroup, const QPoint ¢er, int length, int width, double direction, bool hasKnob ) { if ( width <= 0 ) width = 5; direction *= M_PI / 180.0; painter->save(); const QPoint p1( center.x() + 1, center.y() + 2 ); const QPoint p2 = qwtPolar2Pos( p1, length, direction ); if ( width == 1 ) { const QColor midColor = palette.color( colorGroup, QPalette::Mid ); painter->setPen( QPen( midColor, 1 ) ); painter->drawLine( p1, p2 ); } else { QPolygon pa( 4 ); pa.setPoint( 0, qwtPolar2Pos( p1, width / 2, direction + M_PI_2 ) ); pa.setPoint( 1, qwtPolar2Pos( p2, width / 2, direction + M_PI_2 ) ); pa.setPoint( 2, qwtPolar2Pos( p2, width / 2, direction - M_PI_2 ) ); pa.setPoint( 3, qwtPolar2Pos( p1, width / 2, direction - M_PI_2 ) ); painter->setPen( Qt::NoPen ); painter->setBrush( palette.brush( colorGroup, QPalette::Mid ) ); painter->drawPolygon( pa ); } if ( hasKnob ) { int knobWidth = qMax( qRound( width * 0.7 ), 5 ); if ( knobWidth % 2 == 0 ) knobWidth++; drawKnob( painter, center, knobWidth, palette.brush( colorGroup, QPalette::Base ), false ); } painter->restore(); } /*! Draw a needle looking like an arrow \param painter Painter \param palette Palette \param colorGroup Color group \param center center of the needle \param length Length of the needle \param width Width of the needle \param direction Current Direction \param hasKnob With/Without knob */ void QwtDialSimpleNeedle::drawArrowNeedle( QPainter *painter, const QPalette &palette, QPalette::ColorGroup colorGroup, const QPoint ¢er, int length, int width, double direction, bool hasKnob ) { direction *= M_PI / 180.0; painter->save(); if ( width <= 0 ) { width = ( int )qMax( length * 0.06, 9.0 ); if ( width % 2 == 0 ) width++; } const int peak = 3; const QPoint p1( center.x() + 1, center.y() + 1 ); const QPoint p2 = qwtPolar2Pos( p1, length - peak, direction ); const QPoint p3 = qwtPolar2Pos( p1, length, direction ); QPolygon pa( 5 ); pa.setPoint( 0, qwtPolar2Pos( p1, width / 2, direction - M_PI_2 ) ); pa.setPoint( 1, qwtPolar2Pos( p2, 1, direction - M_PI_2 ) ); pa.setPoint( 2, p3 ); pa.setPoint( 3, qwtPolar2Pos( p2, 1, direction + M_PI_2 ) ); pa.setPoint( 4, qwtPolar2Pos( p1, width / 2, direction + M_PI_2 ) ); painter->setPen( Qt::NoPen ); painter->setBrush( palette.brush( colorGroup, QPalette::Mid ) ); painter->drawPolygon( pa ); QPolygon shadowPa( 3 ); const int colorOffset = 10; int i; for ( i = 0; i < 3; i++ ) shadowPa.setPoint( i, pa[i] ); const QColor midColor = palette.color( colorGroup, QPalette::Mid ); painter->setPen( midColor.dark( 100 + colorOffset ) ); painter->drawPolyline( shadowPa ); for ( i = 0; i < 3; i++ ) shadowPa.setPoint( i, pa[i + 2] ); painter->setPen( midColor.dark( 100 - colorOffset ) ); painter->drawPolyline( shadowPa ); if ( hasKnob ) { drawKnob( painter, center, qRound( width * 1.3 ), palette.brush( colorGroup, QPalette::Base ), false ); } painter->restore(); } //! Constructor QwtCompassMagnetNeedle::QwtCompassMagnetNeedle( Style style, const QColor &light, const QColor &dark ): d_style( style ) { QPalette palette; for ( int i = 0; i < QPalette::NColorGroups; i++ ) { palette.setColor( ( QPalette::ColorGroup )i, QPalette::Light, light ); palette.setColor( ( QPalette::ColorGroup )i, QPalette::Dark, dark ); palette.setColor( ( QPalette::ColorGroup )i, QPalette::Base, Qt::darkGray ); } setPalette( palette ); } /*! Draw the needle \param painter Painter \param center Center of the dial, start position for the needle \param length Length of the needle \param direction Direction of the needle, in degrees counter clockwise \param colorGroup Color group, used for painting */ void QwtCompassMagnetNeedle::draw( QPainter *painter, const QPoint ¢er, int length, double direction, QPalette::ColorGroup colorGroup ) const { if ( d_style == ThinStyle ) { drawThinNeedle( painter, palette(), colorGroup, center, length, direction ); } else { drawTriangleNeedle( painter, palette(), colorGroup, center, length, direction ); } } /*! Draw a compass needle \param painter Painter \param palette Palette \param colorGroup Color group \param center Center, where the needle starts \param length Length of the needle \param direction Direction */ void QwtCompassMagnetNeedle::drawTriangleNeedle( QPainter *painter, const QPalette &palette, QPalette::ColorGroup colorGroup, const QPoint ¢er, int length, double direction ) { const QBrush darkBrush = palette.brush( colorGroup, QPalette::Dark ); const QBrush lightBrush = palette.brush( colorGroup, QPalette::Light ); QBrush brush; const int width = qRound( length / 3.0 ); const int colorOffset = 10; painter->save(); painter->setPen( Qt::NoPen ); const QPoint arrowCenter( center.x() + 1, center.y() + 1 ); QPolygon pa( 3 ); pa.setPoint( 0, arrowCenter ); pa.setPoint( 1, qwtDegree2Pos( arrowCenter, length, direction ) ); pa.setPoint( 2, qwtDegree2Pos( arrowCenter, width / 2, direction + 90.0 ) ); brush = darkBrush; brush.setColor( brush.color().dark( 100 + colorOffset ) ); painter->setBrush( brush ); painter->drawPolygon( pa ); pa.setPoint( 2, qwtDegree2Pos( arrowCenter, width / 2, direction - 90.0 ) ); brush = darkBrush; brush.setColor( brush.color().dark( 100 - colorOffset ) ); painter->setBrush( brush ); painter->drawPolygon( pa ); // -- pa.setPoint( 1, qwtDegree2Pos( arrowCenter, length, direction + 180.0 ) ); pa.setPoint( 2, qwtDegree2Pos( arrowCenter, width / 2, direction + 90.0 ) ); brush = lightBrush; brush.setColor( brush.color().dark( 100 + colorOffset ) ); painter->setBrush( brush ); painter->drawPolygon( pa ); pa.setPoint( 2, qwtDegree2Pos( arrowCenter, width / 2, direction - 90.0 ) ); brush = lightBrush; brush.setColor( brush.color().dark( 100 - colorOffset ) ); painter->setBrush( brush ); painter->drawPolygon( pa ); painter->restore(); } /*! Draw a compass needle \param painter Painter \param palette Palette \param colorGroup Color group \param center Center, where the needle starts \param length Length of the needle \param direction Direction */ void QwtCompassMagnetNeedle::drawThinNeedle( QPainter *painter, const QPalette &palette, QPalette::ColorGroup colorGroup, const QPoint ¢er, int length, double direction ) { const QBrush darkBrush = palette.brush( colorGroup, QPalette::Dark ); const QBrush lightBrush = palette.brush( colorGroup, QPalette::Light ); const QBrush baseBrush = palette.brush( colorGroup, QPalette::Base ); const int colorOffset = 10; const int width = qMax( qRound( length / 6.0 ), 3 ); painter->save(); const QPoint arrowCenter( center.x() + 1, center.y() + 1 ); drawPointer( painter, darkBrush, colorOffset, arrowCenter, length, width, direction ); drawPointer( painter, lightBrush, -colorOffset, arrowCenter, length, width, direction + 180.0 ); drawKnob( painter, arrowCenter, width, baseBrush, true ); painter->restore(); } /*! Draw a compass needle \param painter Painter \param brush Brush \param colorOffset Color offset \param center Center, where the needle starts \param length Length of the needle \param width Width of the needle \param direction Direction */ void QwtCompassMagnetNeedle::drawPointer( QPainter *painter, const QBrush &brush, int colorOffset, const QPoint ¢er, int length, int width, double direction ) { painter->save(); const int peak = qMax( qRound( length / 10.0 ), 5 ); const int knobWidth = width + 8; QRect knobRect( 0, 0, knobWidth, knobWidth ); knobRect.moveCenter( center ); QPolygon pa( 5 ); pa.setPoint( 0, qwtDegree2Pos( center, width / 2, direction + 90.0 ) ); pa.setPoint( 1, center ); pa.setPoint( 2, qwtDegree2Pos( pa.point( 1 ), length - peak, direction ) ); pa.setPoint( 3, qwtDegree2Pos( center, length, direction ) ); pa.setPoint( 4, qwtDegree2Pos( pa.point( 0 ), length - peak, direction ) ); painter->setPen( Qt::NoPen ); QBrush darkBrush = brush; darkBrush.setColor( darkBrush.color().dark( 100 + colorOffset ) ); painter->setBrush( darkBrush ); painter->drawPolygon( pa ); painter->drawPie( knobRect, qRound( direction * 16 ), 90 * 16 ); pa.setPoint( 0, qwtDegree2Pos( center, width / 2, direction - 90.0 ) ); pa.setPoint( 4, qwtDegree2Pos( pa.point( 0 ), length - peak, direction ) ); QBrush lightBrush = brush; lightBrush.setColor( lightBrush.color().dark( 100 - colorOffset ) ); painter->setBrush( lightBrush ); painter->drawPolygon( pa ); painter->drawPie( knobRect, qRound( direction * 16 ), -90 * 16 ); painter->restore(); } /*! Constructor \param style Arrow style \param light Light color \param dark Dark color */ QwtCompassWindArrow::QwtCompassWindArrow( Style style, const QColor &light, const QColor &dark ): d_style( style ) { QPalette palette; for ( int i = 0; i < QPalette::NColorGroups; i++ ) { palette.setColor( ( QPalette::ColorGroup )i, QPalette::Light, light ); palette.setColor( ( QPalette::ColorGroup )i, QPalette::Dark, dark ); } setPalette( palette ); } /*! Draw the needle \param painter Painter \param center Center of the dial, start position for the needle \param length Length of the needle \param direction Direction of the needle, in degrees counter clockwise \param colorGroup Color group, used for painting */ void QwtCompassWindArrow::draw( QPainter *painter, const QPoint ¢er, int length, double direction, QPalette::ColorGroup colorGroup ) const { if ( d_style == Style1 ) { drawStyle1Needle( painter, palette(), colorGroup, center, length, direction ); } else { drawStyle2Needle( painter, palette(), colorGroup, center, length, direction ); } } /*! Draw a compass needle \param painter Painter \param palette Palette \param colorGroup colorGroup \param center Center of the dial, start position for the needle \param length Length of the needle \param direction Direction of the needle, in degrees counter clockwise */ void QwtCompassWindArrow::drawStyle1Needle( QPainter *painter, const QPalette &palette, QPalette::ColorGroup colorGroup, const QPoint ¢er, int length, double direction ) { const QBrush lightBrush = palette.brush( colorGroup, QPalette::Light ); const double AR1[] = {0, 0.4, 0.3, 1, 0.8, 1, 0.3, 0.4}; const double AW1[] = {0, -45, -20, -15, 0, 15, 20, 45}; const QPoint arrowCenter( center.x() + 1, center.y() + 1 ); QPolygon pa( 8 ); pa.setPoint( 0, arrowCenter ); for ( int i = 1; i < 8; i++ ) { const QPoint p = qwtDegree2Pos( center, AR1[i] * length, direction + AW1[i] ); pa.setPoint( i, p ); } painter->save(); painter->setPen( Qt::NoPen ); painter->setBrush( lightBrush ); painter->drawPolygon( pa ); painter->restore(); } /*! Draw a compass needle \param painter Painter \param palette Palette \param colorGroup colorGroup \param center Center of the dial, start position for the needle \param length Length of the needle \param direction Direction of the needle, in degrees counter clockwise */ void QwtCompassWindArrow::drawStyle2Needle( QPainter *painter, const QPalette &palette, QPalette::ColorGroup colorGroup, const QPoint ¢er, int length, double direction ) { const QBrush lightBrush = palette.brush( colorGroup, QPalette::Light ); const QBrush darkBrush = palette.brush( colorGroup, QPalette::Dark ); painter->save(); painter->setPen( Qt::NoPen ); const double angle = 12.0; const double ratio = 0.7; const QPoint arrowCenter( center.x() + 1, center.y() + 1 ); QPolygon pa( 3 ); pa.setPoint( 0, center ); pa.setPoint( 2, qwtDegree2Pos( arrowCenter, ratio * length, direction ) ); pa.setPoint( 1, qwtDegree2Pos( arrowCenter, length, direction + angle ) ); painter->setBrush( darkBrush ); painter->drawPolygon( pa ); pa.setPoint( 1, qwtDegree2Pos( arrowCenter, length, direction - angle ) ); painter->setBrush( lightBrush ); painter->drawPolygon( pa ); painter->restore(); } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_dial_needle.h000066400000000000000000000120601320135501600221670ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_DIAL_NEEDLE_H #define QWT_DIAL_NEEDLE_H 1 #include "qwt_global.h" #include class QPainter; class QPoint; /*! \brief Base class for needles that can be used in a QwtDial. QwtDialNeedle is a pointer that indicates a value by pointing to a specific direction. Qwt is missing a set of good looking needles. Contributions are very welcome. \sa QwtDial, QwtCompass */ class QWT_EXPORT QwtDialNeedle { public: QwtDialNeedle(); virtual ~QwtDialNeedle(); /*! Draw the needle \param painter Painter \param center Center of the dial, start position for the needle \param length Length of the needle \param direction Direction of the needle, in degrees counter clockwise \param colorGroup Color group, used for painting */ virtual void draw( QPainter *painter, const QPoint ¢er, int length, double direction, QPalette::ColorGroup colorGroup = QPalette::Active ) const = 0; virtual void setPalette( const QPalette & ); const QPalette &palette() const; protected: static void drawKnob( QPainter *, const QPoint &pos, int width, const QBrush &, bool sunken ); private: QPalette d_palette; }; /*! \brief A needle for dial widgets The following colors are used: - QPalette::Mid\n Pointer - QPalette::Base\n Knob \sa QwtDial, QwtCompass */ class QWT_EXPORT QwtDialSimpleNeedle: public QwtDialNeedle { public: //! Style of the needle enum Style { Arrow, Ray }; QwtDialSimpleNeedle( Style, bool hasKnob = true, const QColor &mid = Qt::gray, const QColor &base = Qt::darkGray ); virtual void draw( QPainter *, const QPoint &, int length, double direction, QPalette::ColorGroup = QPalette::Active ) const; static void drawArrowNeedle( QPainter *, const QPalette &, QPalette::ColorGroup, const QPoint &, int length, int width, double direction, bool hasKnob ); static void drawRayNeedle( QPainter *, const QPalette &, QPalette::ColorGroup, const QPoint &, int length, int width, double direction, bool hasKnob ); void setWidth( int width ); int width() const; private: Style d_style; bool d_hasKnob; int d_width; }; /*! \brief A magnet needle for compass widgets A magnet needle points to two opposite directions indicating north and south. The following colors are used: - QPalette::Light\n Used for pointing south - QPalette::Dark\n Used for pointing north - QPalette::Base\n Knob (ThinStyle only) \sa QwtDial, QwtCompass */ class QWT_EXPORT QwtCompassMagnetNeedle: public QwtDialNeedle { public: //! Style of the needle enum Style { TriangleStyle, ThinStyle }; QwtCompassMagnetNeedle( Style = TriangleStyle, const QColor &light = Qt::white, const QColor &dark = Qt::red ); virtual void draw( QPainter *, const QPoint &, int length, double direction, QPalette::ColorGroup = QPalette::Active ) const; static void drawTriangleNeedle( QPainter *, const QPalette &, QPalette::ColorGroup, const QPoint &, int length, double direction ); static void drawThinNeedle( QPainter *, const QPalette &, QPalette::ColorGroup, const QPoint &, int length, double direction ); protected: static void drawPointer( QPainter *painter, const QBrush &brush, int colorOffset, const QPoint ¢er, int length, int width, double direction ); private: Style d_style; }; /*! \brief An indicator for the wind direction QwtCompassWindArrow shows the direction where the wind comes from. - QPalette::Light\n Used for Style1, or the light half of Style2 - QPalette::Dark\n Used for the dark half of Style2 \sa QwtDial, QwtCompass */ class QWT_EXPORT QwtCompassWindArrow: public QwtDialNeedle { public: //! Style of the arrow enum Style { Style1, Style2 }; QwtCompassWindArrow( Style, const QColor &light = Qt::white, const QColor &dark = Qt::gray ); virtual void draw( QPainter *, const QPoint &, int length, double direction, QPalette::ColorGroup = QPalette::Active ) const; static void drawStyle1Needle( QPainter *, const QPalette &, QPalette::ColorGroup, const QPoint &, int length, double direction ); static void drawStyle2Needle( QPainter *, const QPalette &, QPalette::ColorGroup, const QPoint &, int length, double direction ); private: Style d_style; }; #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_double_range.cpp000066400000000000000000000226211320135501600227270ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_double_range.h" #include "qwt_math.h" #if QT_VERSION < 0x040601 #define qFabs(x) ::fabs(x) #endif static double MinRelStep = 1.0e-10; static double DefaultRelStep = 1.0e-2; static double MinEps = 1.0e-10; /*! The range is initialized to [0.0, 100.0], the step size to 1.0, and the value to 0.0. */ QwtDoubleRange::QwtDoubleRange(): d_minValue( 0.0 ), d_maxValue( 0.0 ), d_step( 1.0 ), d_pageSize( 1 ), d_isValid( false ), d_value( 0.0 ), d_exactValue( 0.0 ), d_exactPrevValue( 0.0 ), d_prevValue( 0.0 ), d_periodic( false ) { } //! Destroys the QwtDoubleRange QwtDoubleRange::~QwtDoubleRange() { } //! Set the value to be valid/invalid void QwtDoubleRange::setValid( bool isValid ) { if ( isValid != d_isValid ) { d_isValid = isValid; valueChange(); } } //! Indicates if the value is valid bool QwtDoubleRange::isValid() const { return d_isValid; } /*! \brief No docs Description \param x ??? \param align \todo Documentation */ void QwtDoubleRange::setNewValue( double x, bool align ) { double vmin, vmax; d_prevValue = d_value; vmin = qMin( d_minValue, d_maxValue ); vmax = qMax( d_minValue, d_maxValue ); // // Range check // if ( x < vmin ) { if ( ( d_periodic ) && ( vmin != vmax ) ) d_value = x + qCeil( ( vmin - x ) / ( vmax - vmin ) ) * ( vmax - vmin ); else d_value = vmin; } else if ( x > vmax ) { if ( ( d_periodic ) && ( vmin != vmax ) ) d_value = x - qCeil( ( x - vmax ) / ( vmax - vmin ) ) * ( vmax - vmin ); else d_value = vmax; } else d_value = x; d_exactPrevValue = d_exactValue; d_exactValue = d_value; // align to grid if ( align ) { if ( d_step != 0.0 ) { d_value = d_minValue + qRound( ( d_value - d_minValue ) / d_step ) * d_step; } else d_value = d_minValue; // correct rounding error at the border if ( qFabs( d_value - d_maxValue ) < MinEps * qAbs( d_step ) ) d_value = d_maxValue; // correct rounding error if value = 0 if ( qFabs( d_value ) < MinEps * qAbs( d_step ) ) d_value = 0.0; } if ( !d_isValid || d_prevValue != d_value ) { d_isValid = true; valueChange(); } } /*! \brief Adjust the value to the closest point in the step raster. \param x value \warning The value is clipped when it lies outside the range. When the range is QwtDoubleRange::periodic, it will be mapped to a point in the interval such that \verbatim new value := x + n * (max. value - min. value)\endverbatim with an integer number n. */ void QwtDoubleRange::fitValue( double x ) { setNewValue( x, true ); } /*! \brief Set a new value without adjusting to the step raster \param x new value \warning The value is clipped when it lies outside the range. When the range is QwtDoubleRange::periodic, it will be mapped to a point in the interval such that \verbatim new value := x + n * (max. value - min. value)\endverbatim with an integer number n. */ void QwtDoubleRange::setValue( double x ) { setNewValue( x, false ); } /*! \brief Specify range and step size \param vmin lower boundary of the interval \param vmax higher boundary of the interval \param vstep step width \param pageSize page size in steps \warning \li A change of the range changes the value if it lies outside the new range. The current value will *not* be adjusted to the new step raster. \li vmax < vmin is allowed. \li If the step size is left out or set to zero, it will be set to 1/100 of the interval length. \li If the step size has an absurd value, it will be corrected to a better one. */ void QwtDoubleRange::setRange( double vmin, double vmax, double vstep, int pageSize ) { bool rchg = ( ( d_maxValue != vmax ) || ( d_minValue != vmin ) ); if ( rchg ) { d_minValue = vmin; d_maxValue = vmax; } // // look if the step width has an acceptable // value or otherwise change it. // setStep( vstep ); // // limit page size // d_pageSize = qwtLim( pageSize, 0, int( qAbs( ( d_maxValue - d_minValue ) / d_step ) ) ); // If the value lies out of the range, it // will be changed. Note that it will not be adjusted to // the new step width. setNewValue( d_value, false ); // call notifier after the step width has been // adjusted. if ( rchg ) rangeChange(); } /*! \brief Change the step raster \param vstep new step width \warning The value will \e not be adjusted to the new step raster. */ void QwtDoubleRange::setStep( double vstep ) { double intv = d_maxValue - d_minValue; double newStep; if ( vstep == 0.0 ) newStep = intv * DefaultRelStep; else { if ( ( intv > 0.0 && vstep < 0.0 ) || ( intv < 0.0 && vstep > 0.0 ) ) newStep = -vstep; else newStep = vstep; if ( qFabs( newStep ) < qFabs( MinRelStep * intv ) ) newStep = MinRelStep * intv; } if ( newStep != d_step ) { d_step = newStep; stepChange(); } } /*! \brief Make the range periodic When the range is periodic, the value will be set to a point inside the interval such that \verbatim point = value + n * width \endverbatim if the user tries to set a new value which is outside the range. If the range is nonperiodic (the default), values outside the range will be clipped. \param tf true for a periodic range */ void QwtDoubleRange::setPeriodic( bool tf ) { d_periodic = tf; } /*! \brief Increment the value by a specified number of steps \param nSteps Number of steps to increment \warning As a result of this operation, the new value will always be adjusted to the step raster. */ void QwtDoubleRange::incValue( int nSteps ) { if ( isValid() ) setNewValue( d_value + double( nSteps ) * d_step, true ); } /*! \brief Increment the value by a specified number of pages \param nPages Number of pages to increment. A negative number decrements the value. \warning The Page size is specified in the constructor. */ void QwtDoubleRange::incPages( int nPages ) { if ( isValid() ) setNewValue( d_value + double( nPages ) * double( d_pageSize ) * d_step, true ); } /*! \brief Notify a change of value This virtual function is called whenever the value changes. The default implementation does nothing. */ void QwtDoubleRange::valueChange() { } /*! \brief Notify a change of the range This virtual function is called whenever the range changes. The default implementation does nothing. */ void QwtDoubleRange::rangeChange() { } /*! \brief Notify a change of the step size This virtual function is called whenever the step size changes. The default implementation does nothing. */ void QwtDoubleRange::stepChange() { } /*! \return the step size \sa setStep(), setRange() */ double QwtDoubleRange::step() const { return qAbs( d_step ); } /*! \brief Returns the value of the second border of the range maxValue returns the value which has been specified as the second parameter in QwtDoubleRange::setRange. \sa setRange() */ double QwtDoubleRange::maxValue() const { return d_maxValue; } /*! \brief Returns the value at the first border of the range minValue returns the value which has been specified as the first parameter in setRange(). \sa setRange() */ double QwtDoubleRange::minValue() const { return d_minValue; } /*! \brief Returns true if the range is periodic \sa setPeriodic() */ bool QwtDoubleRange::periodic() const { return d_periodic; } //! Returns the page size in steps. int QwtDoubleRange::pageSize() const { return d_pageSize; } //! Returns the current value. double QwtDoubleRange::value() const { return d_value; } /*! \brief Returns the exact value The exact value is the value which QwtDoubleRange::value would return if the value were not adjusted to the step raster. It differs from the current value only if QwtDoubleRange::fitValue or QwtDoubleRange::incValue have been used before. This function is intended for internal use in derived classes. */ double QwtDoubleRange::exactValue() const { return d_exactValue; } //! Returns the exact previous value double QwtDoubleRange::exactPrevValue() const { return d_exactPrevValue; } //! Returns the previous value double QwtDoubleRange::prevValue() const { return d_prevValue; } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_double_range.h000066400000000000000000000045051320135501600223750ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_DOUBLE_RANGE_H #define QWT_DOUBLE_RANGE_H #include "qwt_global.h" /*! \brief A class which controls a value within an interval This class is useful as a base class or a member for sliders. It represents an interval of type double within which a value can be moved. The value can be either an arbitrary point inside the interval (see QwtDoubleRange::setValue), or it can be fitted into a step raster (see QwtDoubleRange::fitValue and QwtDoubleRange::incValue). As a special case, a QwtDoubleRange can be periodic, which means that a value outside the interval will be mapped to a value inside the interval when QwtDoubleRange::setValue(), QwtDoubleRange::fitValue(), QwtDoubleRange::incValue() or QwtDoubleRange::incPages() are called. */ class QWT_EXPORT QwtDoubleRange { public: QwtDoubleRange(); virtual ~QwtDoubleRange(); void setRange( double vmin, double vmax, double vstep = 0.0, int pagesize = 1 ); void setValid( bool ); bool isValid() const; virtual void setValue( double ); double value() const; void setPeriodic( bool tf ); bool periodic() const; void setStep( double ); double step() const; double maxValue() const; double minValue() const; int pageSize() const; virtual void incValue( int ); virtual void incPages( int ); virtual void fitValue( double ); protected: double exactValue() const; double exactPrevValue() const; double prevValue() const; virtual void valueChange(); virtual void stepChange(); virtual void rangeChange(); private: void setNewValue( double x, bool align = false ); double d_minValue; double d_maxValue; double d_step; int d_pageSize; bool d_isValid; double d_value; double d_exactValue; double d_exactPrevValue; double d_prevValue; bool d_periodic; }; #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_dyngrid_layout.cpp000066400000000000000000000337141320135501600233430ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_dyngrid_layout.h" #include "qwt_math.h" #include #include class QwtDynGridLayout::PrivateData { public: PrivateData(): isDirty( true ) { } void updateLayoutCache(); mutable QList itemList; uint maxCols; uint numRows; uint numCols; Qt::Orientations expanding; bool isDirty; QVector itemSizeHints; }; void QwtDynGridLayout::PrivateData::updateLayoutCache() { itemSizeHints.resize( itemList.count() ); int index = 0; for ( QList::iterator it = itemList.begin(); it != itemList.end(); ++it, index++ ) { itemSizeHints[ index ] = ( *it )->sizeHint(); } isDirty = false; } /*! \param parent Parent widget \param margin Margin \param spacing Spacing */ QwtDynGridLayout::QwtDynGridLayout( QWidget *parent, int margin, int spacing ): QLayout( parent ) { init(); setSpacing( spacing ); setMargin( margin ); } /*! \param spacing Spacing */ QwtDynGridLayout::QwtDynGridLayout( int spacing ) { init(); setSpacing( spacing ); } /*! Initialize the layout with default values. */ void QwtDynGridLayout::init() { d_data = new QwtDynGridLayout::PrivateData; d_data->maxCols = d_data->numRows = d_data->numCols = 0; d_data->expanding = 0; } //! Destructor QwtDynGridLayout::~QwtDynGridLayout() { for ( int i = 0; i < d_data->itemList.size(); i++ ) delete d_data->itemList[i]; delete d_data; } //! Invalidate all internal caches void QwtDynGridLayout::invalidate() { d_data->isDirty = true; QLayout::invalidate(); } /*! Limit the number of columns. \param maxCols upper limit, 0 means unlimited \sa maxCols() */ void QwtDynGridLayout::setMaxCols( uint maxCols ) { d_data->maxCols = maxCols; } /*! Return the upper limit for the number of columns. 0 means unlimited, what is the default. \sa setMaxCols() */ uint QwtDynGridLayout::maxCols() const { return d_data->maxCols; } //! Adds item to the next free position. void QwtDynGridLayout::addItem( QLayoutItem *item ) { d_data->itemList.append( item ); invalidate(); } /*! \return true if this layout is empty. */ bool QwtDynGridLayout::isEmpty() const { return d_data->itemList.isEmpty(); } /*! \return number of layout items */ uint QwtDynGridLayout::itemCount() const { return d_data->itemList.count(); } /*! Find the item at a spcific index \param index Index \sa takeAt() */ QLayoutItem *QwtDynGridLayout::itemAt( int index ) const { if ( index < 0 || index >= d_data->itemList.count() ) return NULL; return d_data->itemList.at( index ); } /*! Find the item at a spcific index and remove it from the layout \param index Index \sa itemAt() */ QLayoutItem *QwtDynGridLayout::takeAt( int index ) { if ( index < 0 || index >= d_data->itemList.count() ) return NULL; d_data->isDirty = true; return d_data->itemList.takeAt( index ); } //! \return Number of items in the layout int QwtDynGridLayout::count() const { return d_data->itemList.count(); } /*! Set whether this layout can make use of more space than sizeHint(). A value of Qt::Vertical or Qt::Horizontal means that it wants to grow in only one dimension, while Qt::Vertical | Qt::Horizontal means that it wants to grow in both dimensions. The default value is 0. \param expanding Or'd orientations \sa expandingDirections() */ void QwtDynGridLayout::setExpandingDirections( Qt::Orientations expanding ) { d_data->expanding = expanding; } /*! Returns whether this layout can make use of more space than sizeHint(). A value of Qt::Vertical or Qt::Horizontal means that it wants to grow in only one dimension, while Qt::Vertical | Qt::Horizontal means that it wants to grow in both dimensions. \sa setExpandingDirections() */ Qt::Orientations QwtDynGridLayout::expandingDirections() const { return d_data->expanding; } /*! Reorganizes columns and rows and resizes managed widgets within the rectangle rect. \param rect Layout geometry */ void QwtDynGridLayout::setGeometry( const QRect &rect ) { QLayout::setGeometry( rect ); if ( isEmpty() ) return; d_data->numCols = columnsForWidth( rect.width() ); d_data->numRows = itemCount() / d_data->numCols; if ( itemCount() % d_data->numCols ) d_data->numRows++; QList itemGeometries = layoutItems( rect, d_data->numCols ); int index = 0; for ( QList::iterator it = d_data->itemList.begin(); it != d_data->itemList.end(); ++it ) { QWidget *w = ( *it )->widget(); if ( w ) { w->setGeometry( itemGeometries[index] ); index++; } } } /*! Calculate the number of columns for a given width. It tries to use as many columns as possible (limited by maxCols()) \param width Available width for all columns \sa maxCols(), setMaxCols() */ uint QwtDynGridLayout::columnsForWidth( int width ) const { if ( isEmpty() ) return 0; const int maxCols = ( d_data->maxCols > 0 ) ? d_data->maxCols : itemCount(); if ( maxRowWidth( maxCols ) <= width ) return maxCols; for ( int numCols = 2; numCols <= maxCols; numCols++ ) { const int rowWidth = maxRowWidth( numCols ); if ( rowWidth > width ) return numCols - 1; } return 1; // At least 1 column } /*! Calculate the width of a layout for a given number of columns. \param numCols Given number of columns \param itemWidth Array of the width hints for all items */ int QwtDynGridLayout::maxRowWidth( int numCols ) const { int col; QVector colWidth( numCols ); for ( col = 0; col < ( int )numCols; col++ ) colWidth[col] = 0; if ( d_data->isDirty ) d_data->updateLayoutCache(); for ( uint index = 0; index < ( uint )d_data->itemSizeHints.count(); index++ ) { col = index % numCols; colWidth[col] = qMax( colWidth[col], d_data->itemSizeHints[int( index )].width() ); } int rowWidth = 2 * margin() + ( numCols - 1 ) * spacing(); for ( col = 0; col < ( int )numCols; col++ ) rowWidth += colWidth[col]; return rowWidth; } /*! \return the maximum width of all layout items */ int QwtDynGridLayout::maxItemWidth() const { if ( isEmpty() ) return 0; if ( d_data->isDirty ) d_data->updateLayoutCache(); int w = 0; for ( uint i = 0; i < ( uint )d_data->itemSizeHints.count(); i++ ) { const int itemW = d_data->itemSizeHints[int( i )].width(); if ( itemW > w ) w = itemW; } return w; } /*! Calculate the geometries of the layout items for a layout with numCols columns and a given rect. \param rect Rect where to place the items \param numCols Number of columns \return item geometries */ QList QwtDynGridLayout::layoutItems( const QRect &rect, uint numCols ) const { QList itemGeometries; if ( numCols == 0 || isEmpty() ) return itemGeometries; uint numRows = itemCount() / numCols; if ( numRows % itemCount() ) numRows++; QVector rowHeight( numRows ); QVector colWidth( numCols ); layoutGrid( numCols, rowHeight, colWidth ); bool expandH, expandV; expandH = expandingDirections() & Qt::Horizontal; expandV = expandingDirections() & Qt::Vertical; if ( expandH || expandV ) stretchGrid( rect, numCols, rowHeight, colWidth ); const int maxCols = d_data->maxCols; d_data->maxCols = numCols; const QRect alignedRect = alignmentRect( rect ); d_data->maxCols = maxCols; const int xOffset = expandH ? 0 : alignedRect.x(); const int yOffset = expandV ? 0 : alignedRect.y(); QVector colX( numCols ); QVector rowY( numRows ); const int xySpace = spacing(); rowY[0] = yOffset + margin(); for ( int r = 1; r < ( int )numRows; r++ ) rowY[r] = rowY[r-1] + rowHeight[r-1] + xySpace; colX[0] = xOffset + margin(); for ( int c = 1; c < ( int )numCols; c++ ) colX[c] = colX[c-1] + colWidth[c-1] + xySpace; const int itemCount = d_data->itemList.size(); for ( int i = 0; i < itemCount; i++ ) { const int row = i / numCols; const int col = i % numCols; QRect itemGeometry( colX[col], rowY[row], colWidth[col], rowHeight[row] ); itemGeometries.append( itemGeometry ); } return itemGeometries; } /*! Calculate the dimensions for the columns and rows for a grid of numCols columns. \param numCols Number of columns. \param rowHeight Array where to fill in the calculated row heights. \param colWidth Array where to fill in the calculated column widths. */ void QwtDynGridLayout::layoutGrid( uint numCols, QVector& rowHeight, QVector& colWidth ) const { if ( numCols <= 0 ) return; if ( d_data->isDirty ) d_data->updateLayoutCache(); for ( uint index = 0; index < ( uint )d_data->itemSizeHints.count(); index++ ) { const int row = index / numCols; const int col = index % numCols; const QSize &size = d_data->itemSizeHints[int( index )]; rowHeight[row] = ( col == 0 ) ? size.height() : qMax( rowHeight[row], size.height() ); colWidth[col] = ( row == 0 ) ? size.width() : qMax( colWidth[col], size.width() ); } } /*! \return true: QwtDynGridLayout implements heightForWidth. \sa heightForWidth() */ bool QwtDynGridLayout::hasHeightForWidth() const { return true; } /*! \return The preferred height for this layout, given the width w. \sa hasHeightForWidth() */ int QwtDynGridLayout::heightForWidth( int width ) const { if ( isEmpty() ) return 0; const uint numCols = columnsForWidth( width ); uint numRows = itemCount() / numCols; if ( itemCount() % numCols ) numRows++; QVector rowHeight( numRows ); QVector colWidth( numCols ); layoutGrid( numCols, rowHeight, colWidth ); int h = 2 * margin() + ( numRows - 1 ) * spacing(); for ( int row = 0; row < ( int )numRows; row++ ) h += rowHeight[row]; return h; } /*! Stretch columns in case of expanding() & QSizePolicy::Horizontal and rows in case of expanding() & QSizePolicy::Vertical to fill the entire rect. Rows and columns are stretched with the same factor. \sa setExpanding(), expanding() */ void QwtDynGridLayout::stretchGrid( const QRect &rect, uint numCols, QVector& rowHeight, QVector& colWidth ) const { if ( numCols == 0 || isEmpty() ) return; bool expandH, expandV; expandH = expandingDirections() & Qt::Horizontal; expandV = expandingDirections() & Qt::Vertical; if ( expandH ) { int xDelta = rect.width() - 2 * margin() - ( numCols - 1 ) * spacing(); for ( int col = 0; col < ( int )numCols; col++ ) xDelta -= colWidth[col]; if ( xDelta > 0 ) { for ( int col = 0; col < ( int )numCols; col++ ) { const int space = xDelta / ( numCols - col ); colWidth[col] += space; xDelta -= space; } } } if ( expandV ) { uint numRows = itemCount() / numCols; if ( itemCount() % numCols ) numRows++; int yDelta = rect.height() - 2 * margin() - ( numRows - 1 ) * spacing(); for ( int row = 0; row < ( int )numRows; row++ ) yDelta -= rowHeight[row]; if ( yDelta > 0 ) { for ( int row = 0; row < ( int )numRows; row++ ) { const int space = yDelta / ( numRows - row ); rowHeight[row] += space; yDelta -= space; } } } } /*! Return the size hint. If maxCols() > 0 it is the size for a grid with maxCols() columns, otherwise it is the size for a grid with only one row. \sa maxCols(), setMaxCols() */ QSize QwtDynGridLayout::sizeHint() const { if ( isEmpty() ) return QSize(); const uint numCols = ( d_data->maxCols > 0 ) ? d_data->maxCols : itemCount(); uint numRows = itemCount() / numCols; if ( itemCount() % numCols ) numRows++; QVector rowHeight( numRows ); QVector colWidth( numCols ); layoutGrid( numCols, rowHeight, colWidth ); int h = 2 * margin() + ( numRows - 1 ) * spacing(); for ( int row = 0; row < ( int )numRows; row++ ) h += rowHeight[row]; int w = 2 * margin() + ( numCols - 1 ) * spacing(); for ( int col = 0; col < ( int )numCols; col++ ) w += colWidth[col]; return QSize( w, h ); } /*! \return Number of rows of the current layout. \sa numCols() \warning The number of rows might change whenever the geometry changes */ uint QwtDynGridLayout::numRows() const { return d_data->numRows; } /*! \return Number of columns of the current layout. \sa numRows() \warning The number of columns might change whenever the geometry changes */ uint QwtDynGridLayout::numCols() const { return d_data->numCols; } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_dyngrid_layout.h000066400000000000000000000045571320135501600230130ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_DYNGRID_LAYOUT_H #define QWT_DYNGRID_LAYOUT_H #include "qwt_global.h" #include #include #include /*! \brief The QwtDynGridLayout class lays out widgets in a grid, adjusting the number of columns and rows to the current size. QwtDynGridLayout takes the space it gets, divides it up into rows and columns, and puts each of the widgets it manages into the correct cell(s). It lays out as many number of columns as possible (limited by maxCols()). */ class QWT_EXPORT QwtDynGridLayout : public QLayout { Q_OBJECT public: explicit QwtDynGridLayout( QWidget *, int margin = 0, int space = -1 ); explicit QwtDynGridLayout( int space = -1 ); virtual ~QwtDynGridLayout(); virtual void invalidate(); void setMaxCols( uint maxCols ); uint maxCols() const; uint numRows () const; uint numCols () const; virtual void addItem( QLayoutItem * ); virtual QLayoutItem *itemAt( int index ) const; virtual QLayoutItem *takeAt( int index ); virtual int count() const; void setExpandingDirections( Qt::Orientations ); virtual Qt::Orientations expandingDirections() const; QList layoutItems( const QRect &, uint numCols ) const; virtual int maxItemWidth() const; virtual void setGeometry( const QRect &rect ); virtual bool hasHeightForWidth() const; virtual int heightForWidth( int ) const; virtual QSize sizeHint() const; virtual bool isEmpty() const; uint itemCount() const; virtual uint columnsForWidth( int width ) const; protected: void layoutGrid( uint numCols, QVector& rowHeight, QVector& colWidth ) const; void stretchGrid( const QRect &rect, uint numCols, QVector& rowHeight, QVector& colWidth ) const; private: void init(); int maxRowWidth( int numCols ) const; class PrivateData; PrivateData *d_data; }; #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_global.h000066400000000000000000000023421320135501600212040ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_GLOBAL_H #define QWT_GLOBAL_H #include // QWT_VERSION is (major << 16) + (minor << 8) + patch. #define QWT_VERSION 0x060000 #define QWT_VERSION_STR "6.0.0-svn" #if defined(Q_WS_WIN) || defined(Q_WS_S60) #if defined(_MSC_VER) /* MSVC Compiler */ /* template-class specialization 'identifier' is already instantiated */ #pragma warning(disable: 4660) #endif // _MSC_VER #ifdef QWT_DLL #if defined(QWT_MAKEDLL) // create a Qwt DLL library #define QWT_EXPORT __declspec(dllexport) #define QWT_TEMPLATEDLL #else // use a Qwt DLL library #define QWT_EXPORT __declspec(dllimport) #endif #endif // QWT_DLL #endif // Q_WS_WIN || Q_WS_S60 #ifndef QWT_EXPORT #define QWT_EXPORT #endif // #define QWT_NO_COMPAT 1 // disable withdrawn functionality #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_interval.cpp000066400000000000000000000202671320135501600221310ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_interval.h" #include "qwt_math.h" #include /*! \brief Normalize the limits of the interval If maxValue() < minValue() the limits will be inverted. \return Normalized interval \sa isValid(), inverted() */ QwtInterval QwtInterval::normalized() const { if ( d_minValue > d_maxValue ) { return inverted(); } if ( d_minValue == d_maxValue && d_borderFlags == ExcludeMinimum ) { return inverted(); } return *this; } /*! Invert the limits of the interval \return Inverted interval \sa normalized() */ QwtInterval QwtInterval::inverted() const { int borderFlags = 0; if ( d_borderFlags & ExcludeMinimum ) borderFlags |= ExcludeMaximum; if ( d_borderFlags & ExcludeMaximum ) borderFlags |= ExcludeMinimum; return QwtInterval( d_maxValue, d_minValue, borderFlags ); } /*! Test if a value is inside an interval \param value Value \return true, if value >= minValue() && value <= maxValue() */ bool QwtInterval::contains( double value ) const { if ( !isValid() ) return false; if ( value < d_minValue || value > d_maxValue ) return false; if ( value == d_minValue && d_borderFlags & ExcludeMinimum ) return false; if ( value == d_maxValue && d_borderFlags & ExcludeMaximum ) return false; return true; } //! Unite 2 intervals QwtInterval QwtInterval::unite( const QwtInterval &other ) const { /* If one of the intervals is invalid return the other one. If both are invalid return an invalid default interval */ if ( !isValid() ) { if ( !other.isValid() ) return QwtInterval(); else return other; } if ( !other.isValid() ) return *this; QwtInterval united; int flags = 0; // minimum if ( d_minValue < other.minValue() ) { united.setMinValue( d_minValue ); flags &= d_borderFlags & ExcludeMinimum; } else if ( other.minValue() < d_minValue ) { united.setMinValue( other.minValue() ); flags &= other.borderFlags() & ExcludeMinimum; } else // d_minValue == other.minValue() { united.setMinValue( d_minValue ); flags &= ( d_borderFlags & other.borderFlags() ) & ExcludeMinimum; } // maximum if ( d_maxValue > other.maxValue() ) { united.setMaxValue( d_maxValue ); flags &= d_borderFlags & ExcludeMaximum; } else if ( other.maxValue() > d_maxValue ) { united.setMaxValue( other.maxValue() ); flags &= other.borderFlags() & ExcludeMaximum; } else // d_maxValue == other.maxValue() ) { united.setMaxValue( d_maxValue ); flags &= d_borderFlags & other.borderFlags() & ExcludeMaximum; } united.setBorderFlags( flags ); return united; } //! Intersect 2 intervals QwtInterval QwtInterval::intersect( const QwtInterval &other ) const { if ( !other.isValid() || !isValid() ) return QwtInterval(); QwtInterval i1 = *this; QwtInterval i2 = other; // swap i1/i2, so that the minimum of i1 // is smaller then the minimum of i2 if ( i1.minValue() > i2.minValue() ) { qSwap( i1, i2 ); } else if ( i1.minValue() == i2.minValue() ) { if ( i1.borderFlags() & ExcludeMinimum ) qSwap( i1, i2 ); } if ( i1.maxValue() < i2.minValue() ) { return QwtInterval(); } if ( i1.maxValue() == i2.minValue() ) { if ( i1.borderFlags() & ExcludeMaximum || i2.borderFlags() & ExcludeMinimum ) { return QwtInterval(); } } QwtInterval intersected; int flags = 0; intersected.setMinValue( i2.minValue() ); flags |= i2.borderFlags() & ExcludeMinimum; if ( i1.maxValue() < i2.maxValue() ) { intersected.setMaxValue( i1.maxValue() ); flags |= i1.borderFlags() & ExcludeMaximum; } else if ( i2.maxValue() < i1.maxValue() ) { intersected.setMaxValue( i2.maxValue() ); flags |= i2.borderFlags() & ExcludeMaximum; } else // i1.maxValue() == i2.maxValue() { intersected.setMaxValue( i1.maxValue() ); flags |= i1.borderFlags() & i2.borderFlags() & ExcludeMaximum; } intersected.setBorderFlags( flags ); return intersected; } //! Unites this interval with the given interval. QwtInterval& QwtInterval::operator|=( const QwtInterval & interval ) { *this = *this | interval; return *this; } //! Intersects this interval with the given interval. QwtInterval& QwtInterval::operator&=( const QwtInterval & interval ) { *this = *this & interval; return *this; } /*! Test if two intervals overlap */ bool QwtInterval::intersects( const QwtInterval &other ) const { if ( !isValid() || !other.isValid() ) return false; QwtInterval i1 = *this; QwtInterval i2 = other; // swap i1/i2, so that the minimum of i1 // is smaller then the minimum of i2 if ( i1.minValue() > i2.minValue() ) { qSwap( i1, i2 ); } else if ( i1.minValue() == i2.minValue() && i1.borderFlags() & ExcludeMinimum ) { qSwap( i1, i2 ); } if ( i1.maxValue() > i2.minValue() ) { return true; } if ( i1.maxValue() == i2.minValue() ) { return !( ( i1.borderFlags() & ExcludeMaximum ) || ( i2.borderFlags() & ExcludeMinimum ) ); } return false; } /*! Adjust the limit that is closer to value, so that value becomes the center of the interval. \param value Center \return Interval with value as center */ QwtInterval QwtInterval::symmetrize( double value ) const { if ( !isValid() ) return *this; const double delta = qMax( qAbs( value - d_maxValue ), qAbs( value - d_minValue ) ); return QwtInterval( value - delta, value + delta ); } /*! Limit the interval, keeping the border modes \param lowerBound Lower limit \param upperBound Upper limit \return Limited interval */ QwtInterval QwtInterval::limited( double lowerBound, double upperBound ) const { if ( !isValid() || lowerBound > upperBound ) return QwtInterval(); double minValue = qMax( d_minValue, lowerBound ); minValue = qMin( minValue, upperBound ); double maxValue = qMax( d_maxValue, lowerBound ); maxValue = qMin( maxValue, upperBound ); return QwtInterval( minValue, maxValue, d_borderFlags ); } /*! Extend the interval If value is below minValue, value becomes the lower limit. If value is above maxValue, value becomes the upper limit. extend has no effect for invalid intervals \param value Value \sa isValid() */ QwtInterval QwtInterval::extend( double value ) const { if ( !isValid() ) return *this; return QwtInterval( qMin( value, d_minValue ), qMax( value, d_maxValue ), d_borderFlags ); } /*! Extend an interval \param value Value \return Reference of the extended interval \sa extend() */ QwtInterval& QwtInterval::operator|=( double value ) { *this = *this | value; return *this; } #ifndef QT_NO_DEBUG_STREAM QDebug operator<<( QDebug debug, const QwtInterval &interval ) { const int flags = interval.borderFlags(); debug.nospace() << "QwtInterval(" << ( ( flags & QwtInterval::ExcludeMinimum ) ? "]" : "[" ) << interval.minValue() << "," << interval.maxValue() << ( ( flags & QwtInterval::ExcludeMaximum ) ? "[" : "]" ) << ")"; return debug.space(); } #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_interval.h000066400000000000000000000152321320135501600215720ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_INTERVAL_H #define QWT_INTERVAL_H #include "qwt_global.h" #ifndef QT_NO_DEBUG_STREAM #include #endif /*! \brief A class representing an interval The interval is represented by 2 doubles, the lower and the upper limit. */ class QWT_EXPORT QwtInterval { public: /*! Flag indicating if a border is included/excluded from an interval - IncludeBorders\n min/max values are inside the interval - ExcludeMinimum\n min value is not included in the interval - ExcludeMaximum\n max value is not included in the interval - ExcludeBorders\n min/max values are not included in the interval \sa setBorderMode(), testBorderMode() */ enum BorderMode { IncludeBorders = 0, ExcludeMinimum = 1, ExcludeMaximum = 2, ExcludeBorders = ExcludeMinimum | ExcludeMaximum }; QwtInterval(); QwtInterval( double minValue, double maxValue, int borderFlags = IncludeBorders ); void setInterval( double minValue, double maxValue, int borderFlags = IncludeBorders ); QwtInterval normalized() const; QwtInterval inverted() const; QwtInterval limited( double minValue, double maxValue ) const; bool operator==( const QwtInterval & ) const; bool operator!=( const QwtInterval & ) const; void setBorderFlags( int ); int borderFlags() const; double minValue() const; double maxValue() const; double width() const; void setMinValue( double ); void setMaxValue( double ); bool contains( double value ) const; bool intersects( const QwtInterval & ) const; QwtInterval intersect( const QwtInterval & ) const; QwtInterval unite( const QwtInterval & ) const; QwtInterval operator|( const QwtInterval & ) const; QwtInterval operator&( const QwtInterval & ) const; QwtInterval &operator|=( const QwtInterval & ); QwtInterval &operator&=( const QwtInterval & ); QwtInterval extend( double value ) const; QwtInterval operator|( double ) const; QwtInterval &operator|=( double ); bool isValid() const; bool isNull() const; void invalidate(); QwtInterval symmetrize( double value ) const; private: double d_minValue; double d_maxValue; int d_borderFlags; }; /*! \brief Default Constructor Creates an invalid interval [0.0, -1.0] \sa setInterval(), isValid() */ inline QwtInterval::QwtInterval(): d_minValue( 0.0 ), d_maxValue( -1.0 ), d_borderFlags( IncludeBorders ) { } /*! Constructor Build an interval with from min/max values \param minValue Minimum value \param maxValue Maximum value \param borderFlags Include/Exclude borders */ inline QwtInterval::QwtInterval( double minValue, double maxValue, int borderFlags ): d_minValue( minValue ), d_maxValue( maxValue ), d_borderFlags( borderFlags ) { } /*! Assign the limits of the interval \param minValue Minimum value \param maxValue Maximum value \param borderFlags Include/Exclude borders */ inline void QwtInterval::setInterval( double minValue, double maxValue, int borderFlags ) { d_minValue = minValue; d_maxValue = maxValue; d_borderFlags = borderFlags; } /*! Change the border flags \param borderFlags Or'd BorderMode flags \sa borderFlags() */ inline void QwtInterval::setBorderFlags( int borderFlags ) { d_borderFlags = borderFlags; } /*! \return Border flags \sa setBorderFlags() */ inline int QwtInterval::borderFlags() const { return d_borderFlags; } /*! Assign the lower limit of the interval \param minValue Minimum value */ inline void QwtInterval::setMinValue( double minValue ) { d_minValue = minValue; } /*! Assign the upper limit of the interval \param maxValue Maximum value */ inline void QwtInterval::setMaxValue( double maxValue ) { d_maxValue = maxValue; } //! \return Lower limit of the interval inline double QwtInterval::minValue() const { return d_minValue; } //! \return Upper limit of the interval inline double QwtInterval::maxValue() const { return d_maxValue; } /*! Return the width of an interval The width of invalid intervals is 0.0, otherwise the result is maxValue() - minValue(). \sa isValid() */ inline double QwtInterval::width() const { return isValid() ? ( d_maxValue - d_minValue ) : 0.0; } /*! Intersection of two intervals \sa intersect() */ inline QwtInterval QwtInterval::operator&( const QwtInterval &interval ) const { return intersect( interval ); } /*! Union of two intervals \sa unite() */ inline QwtInterval QwtInterval::operator|( const QwtInterval &interval ) const { return unite( interval ); } //! Compare two intervals inline bool QwtInterval::operator==( const QwtInterval &other ) const { return ( d_minValue == other.d_minValue ) && ( d_maxValue == other.d_maxValue ) && ( d_borderFlags == other.d_borderFlags ); } //! Compare two intervals inline bool QwtInterval::operator!=( const QwtInterval &other ) const { return ( !( *this == other ) ); } /*! Extend an interval \param value Value \return Extended interval \sa extend() */ inline QwtInterval QwtInterval::operator|( double value ) const { return extend( value ); } //! \return true, if isValid() && (minValue() >= maxValue()) inline bool QwtInterval::isNull() const { return isValid() && d_minValue >= d_maxValue; } /*! A interval is valid when minValue() <= maxValue(). In case of QwtInterval::ExcludeBorders it is true when minValue() < maxValue() */ inline bool QwtInterval::isValid() const { if ( ( d_borderFlags & ExcludeBorders ) == 0 ) return d_minValue <= d_maxValue; else return d_minValue < d_maxValue; } /*! Invalidate the interval The limits are set to interval [0.0, -1.0] \sa isValid() */ inline void QwtInterval::invalidate() { d_minValue = 0.0; d_maxValue = -1.0; } #ifndef QT_NO_DEBUG_STREAM QWT_EXPORT QDebug operator<<( QDebug, const QwtInterval & ); #endif #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_knob.cpp000066400000000000000000000277731320135501600212470ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_knob.h" #include "qwt_round_scale_draw.h" #include "qwt_math.h" #include "qwt_painter.h" #include #include #include #include #include #if QT_VERSION < 0x040601 #define qAtan2(y, x) ::atan2(y, x) #define qFabs(x) ::fabs(x) #define qFastCos(x) ::cos(x) #define qFastSin(x) ::sin(x) #endif class QwtKnob::PrivateData { public: PrivateData() { angle = 0.0; nTurns = 0.0; borderWidth = 2; borderDist = 4; totalAngle = 270.0; scaleDist = 4; symbol = Line; maxScaleTicks = 11; knobWidth = 50; dotWidth = 8; } int borderWidth; int borderDist; int scaleDist; int maxScaleTicks; int knobWidth; int dotWidth; Symbol symbol; double angle; double totalAngle; double nTurns; QRect knobRect; // bounding rect of the knob without scale }; /*! Constructor \param parent Parent widget */ QwtKnob::QwtKnob( QWidget* parent ): QwtAbstractSlider( Qt::Horizontal, parent ) { initKnob(); } void QwtKnob::initKnob() { d_data = new PrivateData; setScaleDraw( new QwtRoundScaleDraw() ); setUpdateTime( 50 ); setTotalAngle( 270.0 ); recalcAngle(); setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum ) ); setRange( 0.0, 10.0, 1.0 ); setValue( 0.0 ); } //! Destructor QwtKnob::~QwtKnob() { delete d_data; } /*! \brief Set the symbol of the knob \sa symbol() */ void QwtKnob::setSymbol( QwtKnob::Symbol s ) { if ( d_data->symbol != s ) { d_data->symbol = s; update(); } } /*! \return symbol of the knob \sa setSymbol() */ QwtKnob::Symbol QwtKnob::symbol() const { return d_data->symbol; } /*! \brief Set the total angle by which the knob can be turned \param angle Angle in degrees. The default angle is 270 degrees. It is possible to specify an angle of more than 360 degrees so that the knob can be turned several times around its axis. */ void QwtKnob::setTotalAngle ( double angle ) { if ( angle < 10.0 ) d_data->totalAngle = 10.0; else d_data->totalAngle = angle; scaleDraw()->setAngleRange( -0.5 * d_data->totalAngle, 0.5 * d_data->totalAngle ); layoutKnob(); } //! Return the total angle double QwtKnob::totalAngle() const { return d_data->totalAngle; } /*! Change the scale draw of the knob For changing the labels of the scales, it is necessary to derive from QwtRoundScaleDraw and overload QwtRoundScaleDraw::label(). \sa scaleDraw() */ void QwtKnob::setScaleDraw( QwtRoundScaleDraw *scaleDraw ) { setAbstractScaleDraw( scaleDraw ); setTotalAngle( d_data->totalAngle ); } /*! \return the scale draw of the knob \sa setScaleDraw() */ const QwtRoundScaleDraw *QwtKnob::scaleDraw() const { return static_cast( abstractScaleDraw() ); } /*! \return the scale draw of the knob \sa setScaleDraw() */ QwtRoundScaleDraw *QwtKnob::scaleDraw() { return static_cast( abstractScaleDraw() ); } /*! \brief Draw the knob \param painter painter \param r Bounding rectangle of the knob (without scale) */ void QwtKnob::drawKnob( QPainter *painter, const QRect &r ) { const QBrush buttonBrush = palette().brush( QPalette::Button ); const QColor buttonTextColor = palette().color( QPalette::ButtonText ); const QColor lightColor = palette().color( QPalette::Light ); const QColor darkColor = palette().color( QPalette::Dark ); const int bw2 = d_data->borderWidth / 2; const int radius = ( qMin( r.width(), r.height() ) - bw2 ) / 2; const QRect aRect( r.center().x() - radius, r.center().y() - radius, 2 * radius, 2 * radius ); // // draw button face // painter->setBrush( buttonBrush ); painter->drawEllipse( aRect ); // // draw button shades // QPen pn; pn.setWidth( d_data->borderWidth ); pn.setColor( lightColor ); painter->setPen( pn ); painter->drawArc( aRect, 45*16, 180*16 ); pn.setColor( darkColor ); painter->setPen( pn ); painter->drawArc( aRect, 225*16, 180*16 ); // // draw marker // if ( isValid() ) drawMarker( painter, d_data->angle, buttonTextColor ); } /*! \brief Notify change of value Sets the knob's value to the nearest multiple of the step size. */ void QwtKnob::valueChange() { recalcAngle(); update(); QwtAbstractSlider::valueChange(); } /*! \brief Determine the value corresponding to a specified position Called by QwtAbstractSlider \param p point */ double QwtKnob::getValue( const QPoint &p ) { const double dx = double( ( rect().x() + rect().width() / 2 ) - p.x() ); const double dy = double( ( rect().y() + rect().height() / 2 ) - p.y() ); const double arc = qAtan2( -dx, dy ) * 180.0 / M_PI; double newValue = 0.5 * ( minValue() + maxValue() ) + ( arc + d_data->nTurns * 360.0 ) * ( maxValue() - minValue() ) / d_data->totalAngle; const double oneTurn = qFabs( maxValue() - minValue() ) * 360.0 / d_data->totalAngle; const double eqValue = value() + mouseOffset(); if ( qFabs( newValue - eqValue ) > 0.5 * oneTurn ) { if ( newValue < eqValue ) newValue += oneTurn; else newValue -= oneTurn; } return newValue; } /*! \brief Set the scrolling mode and direction Called by QwtAbstractSlider \param p Point in question */ void QwtKnob::getScrollMode( const QPoint &p, int &scrollMode, int &direction ) { const int r = d_data->knobRect.width() / 2; const int dx = d_data->knobRect.x() + r - p.x(); const int dy = d_data->knobRect.y() + r - p.y(); if ( ( dx * dx ) + ( dy * dy ) <= ( r * r ) ) // point is inside the knob { scrollMode = ScrMouse; direction = 0; } else // point lies outside { scrollMode = ScrTimer; double arc = qAtan2( double( -dx ), double( dy ) ) * 180.0 / M_PI; if ( arc < d_data->angle ) direction = -1; else if ( arc > d_data->angle ) direction = 1; else direction = 0; } } /*! \brief Notify a change of the range Called by QwtAbstractSlider */ void QwtKnob::rangeChange() { if ( autoScale() ) rescale( minValue(), maxValue() ); layoutKnob(); recalcAngle(); } /*! Qt Resize Event */ void QwtKnob::resizeEvent( QResizeEvent * ) { layoutKnob( false ); } /*! Recalculate the knob's geometry and layout based on the current rect and fonts. \param update_geometry notify the layout system and call update to redraw the scale */ void QwtKnob::layoutKnob( bool update_geometry ) { const QRect r = rect(); const int radius = d_data->knobWidth / 2; d_data->knobRect.setWidth( 2 * radius ); d_data->knobRect.setHeight( 2 * radius ); d_data->knobRect.moveCenter( r.center() ); scaleDraw()->setRadius( radius + d_data->scaleDist ); scaleDraw()->moveCenter( r.center() ); if ( update_geometry ) { updateGeometry(); update(); } } /*! Repaint the knob \param e Paint event */ void QwtKnob::paintEvent( QPaintEvent *e ) { const QRect &ur = e->rect(); if ( ur.isValid() ) { QPainter painter( this ); painter.setRenderHint( QPainter::Antialiasing ); draw( &painter, ur ); } } /*! Repaint the knob \param painter Painter \param rect Update rectangle */ void QwtKnob::draw( QPainter *painter, const QRect& rect ) { if ( !d_data->knobRect.contains( rect ) ) // event from valueChange() scaleDraw()->draw( painter, palette() ); drawKnob( painter, d_data->knobRect ); if ( hasFocus() ) QwtPainter::drawFocusRect( painter, this, rect ); } /*! \brief Draw the marker at the knob's front \param p Painter \param arc Angle of the marker \param c Marker color */ void QwtKnob::drawMarker( QPainter *p, double arc, const QColor &c ) { const double rarc = arc * M_PI / 180.0; const double ca = qFastCos( rarc ); const double sa = - qFastSin( rarc ); int radius = d_data->knobRect.width() / 2 - d_data->borderWidth; if ( radius < 3 ) radius = 3; const int ym = d_data->knobRect.y() + radius + d_data->borderWidth; const int xm = d_data->knobRect.x() + radius + d_data->borderWidth; switch ( d_data->symbol ) { case Dot: { p->setBrush( c ); p->setPen( Qt::NoPen ); const double rb = double( qMax( radius - 4 - d_data->dotWidth / 2, 0 ) ); p->drawEllipse( xm - qRound( sa * rb ) - d_data->dotWidth / 2, ym - qRound( ca * rb ) - d_data->dotWidth / 2, d_data->dotWidth, d_data->dotWidth ); break; } case Line: { p->setPen( QPen( c, 2 ) ); const double rb = qMax( double( ( radius - 4 ) / 3.0 ), 0.0 ); const double re = qMax( double( radius - 4 ), 0.0 ); p->drawLine ( xm - qRound( sa * rb ), ym - qRound( ca * rb ), xm - qRound( sa * re ), ym - qRound( ca * re ) ); break; } } } /*! \brief Change the knob's width. The specified width must be >= 5, or it will be clipped. \param w New width */ void QwtKnob::setKnobWidth( int w ) { d_data->knobWidth = qMax( w, 5 ); layoutKnob(); } //! Return the width of the knob int QwtKnob::knobWidth() const { return d_data->knobWidth; } /*! \brief Set the knob's border width \param bw new border width */ void QwtKnob::setBorderWidth( int bw ) { d_data->borderWidth = qMax( bw, 0 ); layoutKnob(); } //! Return the border width int QwtKnob::borderWidth() const { return d_data->borderWidth; } /*! \brief Recalculate the marker angle corresponding to the current value */ void QwtKnob::recalcAngle() { // // calculate the angle corresponding to the value // if ( maxValue() == minValue() ) { d_data->angle = 0; d_data->nTurns = 0; } else { d_data->angle = ( value() - 0.5 * ( minValue() + maxValue() ) ) / ( maxValue() - minValue() ) * d_data->totalAngle; d_data->nTurns = qFloor( ( d_data->angle + 180.0 ) / 360.0 ); d_data->angle = d_data->angle - d_data->nTurns * 360.0; } } /*! Recalculates the layout \sa layoutKnob() */ void QwtKnob::scaleChange() { layoutKnob(); } /*! Recalculates the layout \sa layoutKnob() */ void QwtKnob::fontChange( const QFont &f ) { #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) QwtAbstractSlider::fontChange( f ); #endif layoutKnob(); } /*! \return minimumSizeHint() */ QSize QwtKnob::sizeHint() const { return minimumSizeHint(); } /*! \brief Return a minimum size hint \warning The return value of QwtKnob::minimumSizeHint() depends on the font and the scale. */ QSize QwtKnob::minimumSizeHint() const { // Add the scale radial thickness to the knobWidth const int sh = qCeil( scaleDraw()->extent( font() ) ); const int d = 2 * sh + 2 * d_data->scaleDist + d_data->knobWidth; return QSize( d, d ); } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_knob.h000066400000000000000000000055331320135501600207020ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_KNOB_H #define QWT_KNOB_H #include "qwt_global.h" #include "qwt_abstract_slider.h" #include "qwt_abstract_scale.h" class QwtRoundScaleDraw; /*! \brief The Knob Widget The QwtKnob widget imitates look and behaviour of a volume knob on a radio. It contains a scale around the knob which is set up automatically or can be configured manually (see QwtAbstractScale). Automatic scrolling is enabled when the user presses a mouse button on the scale. For a description of signals, slots and other members, see QwtAbstractSlider. \image html knob.png \sa QwtAbstractSlider and QwtAbstractScale for the descriptions of the inherited members. */ class QWT_EXPORT QwtKnob : public QwtAbstractSlider, public QwtAbstractScale { Q_OBJECT Q_ENUMS ( Symbol ) Q_PROPERTY( int knobWidth READ knobWidth WRITE setKnobWidth ) Q_PROPERTY( int borderWidth READ borderWidth WRITE setBorderWidth ) Q_PROPERTY( double totalAngle READ totalAngle WRITE setTotalAngle ) Q_PROPERTY( Symbol symbol READ symbol WRITE setSymbol ) public: /*! Symbol \sa setSymbol() */ enum Symbol { Line, Dot }; explicit QwtKnob( QWidget* parent = NULL ); virtual ~QwtKnob(); void setKnobWidth( int w ); int knobWidth() const; void setTotalAngle ( double angle ); double totalAngle() const; void setBorderWidth( int bw ); int borderWidth() const; void setSymbol( Symbol ); Symbol symbol() const; virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; void setScaleDraw( QwtRoundScaleDraw * ); const QwtRoundScaleDraw *scaleDraw() const; QwtRoundScaleDraw *scaleDraw(); protected: virtual void paintEvent( QPaintEvent *e ); virtual void resizeEvent( QResizeEvent *e ); void draw( QPainter *p, const QRect& ur ); void drawKnob( QPainter *p, const QRect &r ); void drawMarker( QPainter *p, double arc, const QColor &c ); private: void initKnob(); void layoutKnob( bool update = true ); double getValue( const QPoint &p ); void getScrollMode( const QPoint &p, int &scrollMode, int &direction ); void recalcAngle(); virtual void valueChange(); virtual void rangeChange(); virtual void scaleChange(); virtual void fontChange( const QFont &oldFont ); class PrivateData; PrivateData *d_data; }; #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_legend.cpp000066400000000000000000000307011320135501600215350ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_legend.h" #include "qwt_legend_itemmanager.h" #include "qwt_legend_item.h" #include "qwt_dyngrid_layout.h" #include "qwt_math.h" #include #include #include #include class QwtLegend::PrivateData { public: class LegendMap { public: void insert( const QwtLegendItemManager *, QWidget * ); void remove( const QwtLegendItemManager * ); void remove( QWidget * ); void clear(); uint count() const; inline const QWidget *find( const QwtLegendItemManager * ) const; inline QWidget *find( const QwtLegendItemManager * ); inline const QwtLegendItemManager *find( const QWidget * ) const; inline QwtLegendItemManager *find( const QWidget * ); const QMap &widgetMap() const; QMap &widgetMap(); private: QMap d_widgetMap; QMap d_itemMap; }; QwtLegend::LegendItemMode itemMode; LegendMap map; class LegendView; LegendView *view; }; class QwtLegend::PrivateData::LegendView: public QScrollArea { public: LegendView( QWidget *parent ): QScrollArea( parent ) { contentsWidget = new QWidget( this ); setWidget( contentsWidget ); setWidgetResizable( false ); setFocusPolicy( Qt::NoFocus ); } virtual bool viewportEvent( QEvent *e ) { bool ok = QScrollArea::viewportEvent( e ); if ( e->type() == QEvent::Resize ) { QEvent event( QEvent::LayoutRequest ); QApplication::sendEvent( contentsWidget, &event ); } return ok; } QSize viewportSize( int w, int h ) const { const int sbHeight = horizontalScrollBar()->sizeHint().height(); const int sbWidth = verticalScrollBar()->sizeHint().width(); const int cw = contentsRect().width(); const int ch = contentsRect().height(); int vw = cw; int vh = ch; if ( w > vw ) vh -= sbHeight; if ( h > vh ) { vw -= sbWidth; if ( w > vw && vh == ch ) vh -= sbHeight; } return QSize( vw, vh ); } QWidget *contentsWidget; }; void QwtLegend::PrivateData::LegendMap::insert( const QwtLegendItemManager *item, QWidget *widget ) { d_itemMap.insert( item, widget ); d_widgetMap.insert( widget, item ); } void QwtLegend::PrivateData::LegendMap::remove( const QwtLegendItemManager *item ) { QWidget *widget = d_itemMap[item]; d_itemMap.remove( item ); d_widgetMap.remove( widget ); } void QwtLegend::PrivateData::LegendMap::remove( QWidget *widget ) { const QwtLegendItemManager *item = d_widgetMap[widget]; d_itemMap.remove( item ); d_widgetMap.remove( widget ); } void QwtLegend::PrivateData::LegendMap::clear() { /* We can't delete the widgets in the following loop, because we would get ChildRemoved events, changing d_itemMap, while we are iterating. */ QList widgets; QMap::const_iterator it; for ( it = d_itemMap.begin(); it != d_itemMap.end(); ++it ) widgets.append( it.value() ); d_itemMap.clear(); d_widgetMap.clear(); for ( int i = 0; i < ( int )widgets.size(); i++ ) delete widgets[i]; } uint QwtLegend::PrivateData::LegendMap::count() const { return d_itemMap.count(); } inline const QWidget *QwtLegend::PrivateData::LegendMap::find( const QwtLegendItemManager *item ) const { if ( !d_itemMap.contains( item ) ) return NULL; return d_itemMap[item]; } inline QWidget *QwtLegend::PrivateData::LegendMap::find( const QwtLegendItemManager *item ) { if ( !d_itemMap.contains( item ) ) return NULL; return d_itemMap[item]; } inline const QwtLegendItemManager *QwtLegend::PrivateData::LegendMap::find( const QWidget *widget ) const { QWidget *w = const_cast( widget ); if ( !d_widgetMap.contains( w ) ) return NULL; return d_widgetMap[w]; } inline QwtLegendItemManager *QwtLegend::PrivateData::LegendMap::find( const QWidget *widget ) { QWidget *w = const_cast( widget ); if ( !d_widgetMap.contains( w ) ) return NULL; return const_cast( d_widgetMap[w] ); } inline const QMap & QwtLegend::PrivateData::LegendMap::widgetMap() const { return d_widgetMap; } inline QMap & QwtLegend::PrivateData::LegendMap::widgetMap() { return d_widgetMap; } /*! Constructor \param parent Parent widget */ QwtLegend::QwtLegend( QWidget *parent ): QFrame( parent ) { setFrameStyle( NoFrame ); d_data = new QwtLegend::PrivateData; d_data->itemMode = QwtLegend::ReadOnlyItem; d_data->view = new QwtLegend::PrivateData::LegendView( this ); d_data->view->setFrameStyle( NoFrame ); QwtDynGridLayout *layout = new QwtDynGridLayout( d_data->view->contentsWidget ); layout->setAlignment( Qt::AlignHCenter | Qt::AlignTop ); d_data->view->contentsWidget->installEventFilter( this ); } //! Destructor QwtLegend::~QwtLegend() { delete d_data; } //! \sa LegendItemMode void QwtLegend::setItemMode( LegendItemMode mode ) { d_data->itemMode = mode; } //! \sa LegendItemMode QwtLegend::LegendItemMode QwtLegend::itemMode() const { return d_data->itemMode; } /*! The contents widget is the only child of the viewport() and the parent widget of all legend items. */ QWidget *QwtLegend::contentsWidget() { return d_data->view->contentsWidget; } /*! \return Horizontal scrollbar \sa verticalScrollBar() */ QScrollBar *QwtLegend::horizontalScrollBar() const { return d_data->view->horizontalScrollBar(); } /*! \return Vertical scrollbar \sa horizontalScrollBar() */ QScrollBar *QwtLegend::verticalScrollBar() const { return d_data->view->verticalScrollBar(); } /*! The contents widget is the only child of the viewport() and the parent widget of all legend items. */ const QWidget *QwtLegend::contentsWidget() const { return d_data->view->contentsWidget; } /*! Insert a new item for a plot item \param plotItem Plot item \param legendItem New legend item \note The parent of item will be changed to QwtLegend::contentsWidget() */ void QwtLegend::insert( const QwtLegendItemManager *plotItem, QWidget *legendItem ) { if ( legendItem == NULL || plotItem == NULL ) return; QWidget *contentsWidget = d_data->view->contentsWidget; if ( legendItem->parent() != contentsWidget ) legendItem->setParent( contentsWidget ); legendItem->show(); d_data->map.insert( plotItem, legendItem ); layoutContents(); if ( contentsWidget->layout() ) { contentsWidget->layout()->addWidget( legendItem ); // set tab focus chain QWidget *w = NULL; for ( int i = 0; i < contentsWidget->layout()->count(); i++ ) { QLayoutItem *item = contentsWidget->layout()->itemAt( i ); if ( w && item->widget() ) QWidget::setTabOrder( w, item->widget() ); w = item->widget(); } } if ( parentWidget() && parentWidget()->layout() == NULL ) { /* updateGeometry() doesn't post LayoutRequest in certain situations, like when we are hidden. But we want the parent widget notified, so it can show/hide the legend depending on its items. */ QApplication::postEvent( parentWidget(), new QEvent( QEvent::LayoutRequest ) ); } } /*! Find the widget that represents a plot item \param plotItem Plot item \return Widget on the legend, or NULL */ QWidget *QwtLegend::find( const QwtLegendItemManager *plotItem ) const { return d_data->map.find( plotItem ); } /*! Find the widget that represents a plot item \param legendItem Legend item \return Widget on the legend, or NULL */ QwtLegendItemManager *QwtLegend::find( const QWidget *legendItem ) const { return d_data->map.find( legendItem ); } /*! Find the corresponding item for a plotItem and remove it from the item list. \param plotItem Plot item */ void QwtLegend::remove( const QwtLegendItemManager *plotItem ) { QWidget *legendItem = d_data->map.find( plotItem ); d_data->map.remove( legendItem ); delete legendItem; } //! Remove all items. void QwtLegend::clear() { bool doUpdate = updatesEnabled(); if ( doUpdate ) setUpdatesEnabled( false ); d_data->map.clear(); if ( doUpdate ) setUpdatesEnabled( true ); update(); } //! Return a size hint. QSize QwtLegend::sizeHint() const { QSize hint = d_data->view->contentsWidget->sizeHint(); hint += QSize( 2 * frameWidth(), 2 * frameWidth() ); return hint; } /*! \return The preferred height, for the width w. \param width Width */ int QwtLegend::heightForWidth( int width ) const { width -= 2 * frameWidth(); int h = d_data->view->contentsWidget->heightForWidth( width ); if ( h >= 0 ) h += 2 * frameWidth(); return h; } /*! Adjust contents widget and item layout to the size of the viewport(). */ void QwtLegend::layoutContents() { const QSize visibleSize = d_data->view->viewport()->size(); const QLayout *l = d_data->view->contentsWidget->layout(); if ( l && l->inherits( "QwtDynGridLayout" ) ) { const QwtDynGridLayout *tl = ( const QwtDynGridLayout * )l; const int minW = int( tl->maxItemWidth() ) + 2 * tl->margin(); int w = qMax( visibleSize.width(), minW ); int h = qMax( tl->heightForWidth( w ), visibleSize.height() ); const int vpWidth = d_data->view->viewportSize( w, h ).width(); if ( w > vpWidth ) { w = qMax( vpWidth, minW ); h = qMax( tl->heightForWidth( w ), visibleSize.height() ); } d_data->view->contentsWidget->resize( w, h ); } } /*! Filter layout related events of QwtLegend::contentsWidget(). \param o Object to be filtered \param e Event */ bool QwtLegend::eventFilter( QObject *o, QEvent *e ) { if ( o == d_data->view->contentsWidget ) { switch ( e->type() ) { case QEvent::ChildRemoved: { const QChildEvent *ce = ( const QChildEvent * )e; if ( ce->child()->isWidgetType() ) d_data->map.remove( ( QWidget * )ce->child() ); break; } case QEvent::LayoutRequest: { layoutContents(); break; } default: break; } } return QFrame::eventFilter( o, e ); } //! Return true, if there are no legend items. bool QwtLegend::isEmpty() const { return d_data->map.count() == 0; } //! Return the number of legend items. uint QwtLegend::itemCount() const { return d_data->map.count(); } //! Return a list of all legend items QList QwtLegend::legendItems() const { const QMap &map = d_data->map.widgetMap(); QList list; QMap::const_iterator it; for ( it = map.begin(); it != map.end(); ++it ) list += it.key(); return list; } /*! Resize event \param e Resize event */ void QwtLegend::resizeEvent( QResizeEvent *e ) { QFrame::resizeEvent( e ); d_data->view->setGeometry( contentsRect() ); } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_legend.h000066400000000000000000000050171320135501600212040ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_LEGEND_H #define QWT_LEGEND_H #include "qwt_global.h" #include #include class QScrollBar; class QwtLegendItemManager; /*! \brief The legend widget The QwtLegend widget is a tabular arrangement of legend items. Legend items might be any type of widget, but in general they will be a QwtLegendItem. \sa QwtLegendItem, QwtLegendItemManager QwtPlot */ class QWT_EXPORT QwtLegend : public QFrame { Q_OBJECT public: /*! \brief Interaction mode for the legend items - ReadOnlyItem\n The legend item is not interactive, like a label - ClickableItem\n The legend item is clickable, like a push button - CheckableItem\n The legend item is checkable, like a checkable button Default is ReadOnlyItem. \sa setItemMode(), itemMode(), QwtLegendItem::IdentifierMode QwtLegendItem::clicked(), QwtLegendItem::checked(), QwtPlot::legendClicked(), QwtPlot::legendChecked() */ enum LegendItemMode { ReadOnlyItem, ClickableItem, CheckableItem }; explicit QwtLegend( QWidget *parent = NULL ); virtual ~QwtLegend(); void setItemMode( LegendItemMode ); LegendItemMode itemMode() const; QWidget *contentsWidget(); const QWidget *contentsWidget() const; void insert( const QwtLegendItemManager *, QWidget * ); void remove( const QwtLegendItemManager * ); QWidget *find( const QwtLegendItemManager * ) const; QwtLegendItemManager *find( const QWidget * ) const; virtual QList legendItems() const; void clear(); bool isEmpty() const; uint itemCount() const; virtual bool eventFilter( QObject *, QEvent * ); virtual QSize sizeHint() const; virtual int heightForWidth( int w ) const; QScrollBar *horizontalScrollBar() const; QScrollBar *verticalScrollBar() const; protected: virtual void resizeEvent( QResizeEvent * ); virtual void layoutContents(); private: class PrivateData; PrivateData *d_data; }; #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_legend_item.cpp000066400000000000000000000220211320135501600225470ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_legend_item.h" #include "qwt_math.h" #include "qwt_painter.h" #include "qwt_symbol.h" #include #include #include #include #include #include static const int ButtonFrame = 2; static const int Margin = 2; static QSize buttonShift( const QwtLegendItem *w ) { QStyleOption option; option.init( w ); const int ph = w->style()->pixelMetric( QStyle::PM_ButtonShiftHorizontal, &option, w ); const int pv = w->style()->pixelMetric( QStyle::PM_ButtonShiftVertical, &option, w ); return QSize( ph, pv ); } class QwtLegendItem::PrivateData { public: PrivateData(): itemMode( QwtLegend::ReadOnlyItem ), isDown( false ), identifierSize( 8, 8 ), spacing( Margin ) { } QwtLegend::LegendItemMode itemMode; bool isDown; QSize identifierSize; QPixmap identifier; int spacing; }; /*! \param parent Parent widget */ QwtLegendItem::QwtLegendItem( QWidget *parent ): QwtTextLabel( parent ) { d_data = new PrivateData; setMargin( Margin ); setIndent( Margin + d_data->identifierSize.width() + 2 * d_data->spacing ); } //! Destructor QwtLegendItem::~QwtLegendItem() { delete d_data; d_data = NULL; } /*! Set the text to the legend item \param text Text label \sa QwtTextLabel::text() */ void QwtLegendItem::setText( const QwtText &text ) { const int flags = Qt::AlignLeft | Qt::AlignVCenter | Qt::TextExpandTabs | Qt::TextWordWrap; QwtText txt = text; txt.setRenderFlags( flags ); QwtTextLabel::setText( txt ); } /*! Set the item mode The default is QwtLegend::ReadOnlyItem \param mode Item mode \sa itemMode() */ void QwtLegendItem::setItemMode( QwtLegend::LegendItemMode mode ) { if ( mode != d_data->itemMode ) { d_data->itemMode = mode; d_data->isDown = false; setFocusPolicy( mode != QwtLegend::ReadOnlyItem ? Qt::TabFocus : Qt::NoFocus ); setMargin( ButtonFrame + Margin ); updateGeometry(); } } /*! Return the item mode \sa setItemMode() */ QwtLegend::LegendItemMode QwtLegendItem::itemMode() const { return d_data->itemMode; } /*! Assign the identifier The identifier needs to be created according to the identifierWidth() \param identifier Pixmap representing a plot item \sa identifier(), identifierWidth() */ void QwtLegendItem::setIdentifier( const QPixmap &identifier ) { d_data->identifier = identifier; update(); } /*! \return pixmap representing a plot item \sa setIdentifier() */ QPixmap QwtLegendItem::identifier() const { return d_data->identifier; } /*! Set the size for the identifier Default is 8x8 pixels \param size New size \sa identifierSize() */ void QwtLegendItem::setIdentifierSize( const QSize &size ) { QSize sz = size.expandedTo( QSize( 0, 0 ) ); if ( sz != d_data->identifierSize ) { d_data->identifierSize = sz; setIndent( margin() + d_data->identifierSize.width() + 2 * d_data->spacing ); updateGeometry(); } } /*! Return the width of the identifier \sa setIdentifierSize() */ QSize QwtLegendItem::identifierSize() const { return d_data->identifierSize; } /*! Change the spacing \param spacing Spacing \sa spacing(), identifierWidth(), QwtTextLabel::margin() */ void QwtLegendItem::setSpacing( int spacing ) { spacing = qMax( spacing, 0 ); if ( spacing != d_data->spacing ) { d_data->spacing = spacing; setIndent( margin() + d_data->identifierSize.width() + 2 * d_data->spacing ); } } /*! Return the spacing \sa setSpacing(), identifierWidth(), QwtTextLabel::margin() */ int QwtLegendItem::spacing() const { return d_data->spacing; } /*! Check/Uncheck a the item \param on check/uncheck \sa setItemMode() */ void QwtLegendItem::setChecked( bool on ) { if ( d_data->itemMode == QwtLegend::CheckableItem ) { const bool isBlocked = signalsBlocked(); blockSignals( true ); setDown( on ); blockSignals( isBlocked ); } } //! Return true, if the item is checked bool QwtLegendItem::isChecked() const { return d_data->itemMode == QwtLegend::CheckableItem && isDown(); } //! Set the item being down void QwtLegendItem::setDown( bool down ) { if ( down == d_data->isDown ) return; d_data->isDown = down; update(); if ( d_data->itemMode == QwtLegend::ClickableItem ) { if ( d_data->isDown ) Q_EMIT pressed(); else { Q_EMIT released(); Q_EMIT clicked(); } } if ( d_data->itemMode == QwtLegend::CheckableItem ) Q_EMIT checked( d_data->isDown ); } //! Return true, if the item is down bool QwtLegendItem::isDown() const { return d_data->isDown; } //! Return a size hint QSize QwtLegendItem::sizeHint() const { QSize sz = QwtTextLabel::sizeHint(); sz.setHeight( qMax( sz.height(), d_data->identifier.height() + 4 ) ); if ( d_data->itemMode != QwtLegend::ReadOnlyItem ) sz += buttonShift( this ); return sz; } //! Paint event void QwtLegendItem::paintEvent( QPaintEvent *e ) { const QRect cr = contentsRect(); QPainter painter( this ); painter.setClipRegion( e->region() ); if ( d_data->isDown ) { qDrawWinButton( &painter, 0, 0, width(), height(), palette(), true ); } painter.save(); if ( d_data->isDown ) { const QSize shiftSize = buttonShift( this ); painter.translate( shiftSize.width(), shiftSize.height() ); } painter.setClipRect( cr ); drawContents( &painter ); if ( !d_data->identifier.isNull() ) { QRect identRect = cr; identRect.setX( identRect.x() + margin() ); if ( d_data->itemMode != QwtLegend::ReadOnlyItem ) identRect.setX( identRect.x() + ButtonFrame ); identRect.setSize( d_data->identifier.size() ); identRect.moveCenter( QPoint( identRect.center().x(), cr.center().y() ) ); painter.drawPixmap( identRect, d_data->identifier ); } painter.restore(); } //! Handle mouse press events void QwtLegendItem::mousePressEvent( QMouseEvent *e ) { if ( e->button() == Qt::LeftButton ) { switch ( d_data->itemMode ) { case QwtLegend::ClickableItem: { setDown( true ); return; } case QwtLegend::CheckableItem: { setDown( !isDown() ); return; } default:; } } QwtTextLabel::mousePressEvent( e ); } //! Handle mouse release events void QwtLegendItem::mouseReleaseEvent( QMouseEvent *e ) { if ( e->button() == Qt::LeftButton ) { switch ( d_data->itemMode ) { case QwtLegend::ClickableItem: { setDown( false ); return; } case QwtLegend::CheckableItem: { return; // do nothing, but accept } default:; } } QwtTextLabel::mouseReleaseEvent( e ); } //! Handle key press events void QwtLegendItem::keyPressEvent( QKeyEvent *e ) { if ( e->key() == Qt::Key_Space ) { switch ( d_data->itemMode ) { case QwtLegend::ClickableItem: { if ( !e->isAutoRepeat() ) setDown( true ); return; } case QwtLegend::CheckableItem: { if ( !e->isAutoRepeat() ) setDown( !isDown() ); return; } default:; } } QwtTextLabel::keyPressEvent( e ); } //! Handle key release events void QwtLegendItem::keyReleaseEvent( QKeyEvent *e ) { if ( e->key() == Qt::Key_Space ) { switch ( d_data->itemMode ) { case QwtLegend::ClickableItem: { if ( !e->isAutoRepeat() ) setDown( false ); return; } case QwtLegend::CheckableItem: { return; // do nothing, but accept } default:; } } QwtTextLabel::keyReleaseEvent( e ); }starpu-1.2.3+dfsg/starpu-top/qwt/qwt_legend_item.h000066400000000000000000000037641320135501600222310ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_LEGEND_ITEM_H #define QWT_LEGEND_ITEM_H #include "qwt_global.h" #include "qwt_legend.h" #include "qwt_text.h" #include "qwt_text_label.h" #include /*! \brief A widget representing something on a QwtLegend(). */ class QWT_EXPORT QwtLegendItem: public QwtTextLabel { Q_OBJECT public: explicit QwtLegendItem( QWidget *parent = 0 ); virtual ~QwtLegendItem(); void setItemMode( QwtLegend::LegendItemMode ); QwtLegend::LegendItemMode itemMode() const; void setSpacing( int spacing ); int spacing() const; virtual void setText( const QwtText & ); void setIdentifier( const QPixmap & ); QPixmap identifier() const; void setIdentifierSize( const QSize & ); QSize identifierSize() const; virtual QSize sizeHint() const; bool isChecked() const; public Q_SLOTS: void setChecked( bool on ); Q_SIGNALS: //! Signal, when the legend item has been clicked void clicked(); //! Signal, when the legend item has been pressed void pressed(); //! Signal, when the legend item has been relased void released(); //! Signal, when the legend item has been toggled void checked( bool ); protected: void setDown( bool ); bool isDown() const; virtual void paintEvent( QPaintEvent * ); virtual void mousePressEvent( QMouseEvent * ); virtual void mouseReleaseEvent( QMouseEvent * ); virtual void keyPressEvent( QKeyEvent * ); virtual void keyReleaseEvent( QKeyEvent * ); private: class PrivateData; PrivateData *d_data; }; #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_legend_itemmanager.h000066400000000000000000000031061320135501600235520ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_LEGEND_ITEM_MANAGER_H #define QWT_LEGEND_ITEM_MANAGER_H #include "qwt_global.h" class QwtLegend; class QWidget; class QRectF; class QPainter; /*! \brief Abstract API to bind plot items to the legend */ class QWT_EXPORT QwtLegendItemManager { public: //! Constructor QwtLegendItemManager() { } //! Destructor virtual ~QwtLegendItemManager() { } /*! Update the widget that represents the item on the legend \param legend Legend \sa legendItem() */ virtual void updateLegend( QwtLegend *legend ) const = 0; /*! Allocate the widget that represents the item on the legend \return Allocated widget \sa updateLegend() QwtLegend() */ virtual QWidget *legendItem() const = 0; /*! QwtLegendItem can display an icon-identifier followed by a text. The icon helps to identify a plot item on the plot canvas and depends on the type of information, that is displayed. The default implementation paints nothing. */ virtual void drawLegendIdentifier( QPainter *, const QRectF & ) const { } }; #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_math.cpp000066400000000000000000000021131320135501600212240ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_math.h" /*! \brief Find the smallest value in an array \param array Pointer to an array \param size Array size */ double qwtGetMin( const double *array, int size ) { if ( size <= 0 ) return 0.0; double rv = array[0]; for ( int i = 1; i < size; i++ ) rv = qMin( rv, array[i] ); return rv; } /*! \brief Find the largest value in an array \param array Pointer to an array \param size Array size */ double qwtGetMax( const double *array, int size ) { if ( size <= 0 ) return 0.0; double rv = array[0]; for ( int i = 1; i < size; i++ ) rv = qMax( rv, array[i] ); return rv; } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_math.h000066400000000000000000000116631320135501600207030ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_MATH_H #define QWT_MATH_H #include "qwt_global.h" #if defined(_MSC_VER) /* Microsoft says: Define _USE_MATH_DEFINES before including math.h to expose these macro definitions for common math constants. These are placed under an #ifdef since these commonly-defined names are not part of the C/C++ standards. */ #define _USE_MATH_DEFINES 1 #endif #include #include #include "qwt_global.h" #ifndef LOG10_2 #define LOG10_2 0.30102999566398119802 /* log10(2) */ #endif #ifndef LOG10_3 #define LOG10_3 0.47712125471966243540 /* log10(3) */ #endif #ifndef LOG10_5 #define LOG10_5 0.69897000433601885749 /* log10(5) */ #endif #ifndef M_2PI #define M_2PI 6.28318530717958623200 /* 2 pi */ #endif #ifndef LOG_MIN //! Mininum value for logarithmic scales #define LOG_MIN 1.0e-100 #endif #ifndef LOG_MAX //! Maximum value for logarithmic scales #define LOG_MAX 1.0e100 #endif #ifndef M_E #define M_E 2.7182818284590452354 /* e */ #endif #ifndef M_LOG2E #define M_LOG2E 1.4426950408889634074 /* log_2 e */ #endif #ifndef M_LOG10E #define M_LOG10E 0.43429448190325182765 /* log_10 e */ #endif #ifndef M_LN2 #define M_LN2 0.69314718055994530942 /* log_e 2 */ #endif #ifndef M_LN10 #define M_LN10 2.30258509299404568402 /* log_e 10 */ #endif #ifndef M_PI #define M_PI 3.14159265358979323846 /* pi */ #endif #ifndef M_PI_2 #define M_PI_2 1.57079632679489661923 /* pi/2 */ #endif #ifndef M_PI_4 #define M_PI_4 0.78539816339744830962 /* pi/4 */ #endif #ifndef M_1_PI #define M_1_PI 0.31830988618379067154 /* 1/pi */ #endif #ifndef M_2_PI #define M_2_PI 0.63661977236758134308 /* 2/pi */ #endif #ifndef M_2_SQRTPI #define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */ #endif #ifndef M_SQRT2 #define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ #endif #ifndef M_SQRT1_2 #define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */ #endif QWT_EXPORT double qwtGetMin( const double *array, int size ); QWT_EXPORT double qwtGetMax( const double *array, int size ); /*! \brief Compare 2 values, relative to an interval Values are "equal", when : \f$\cdot value2 - value1 <= abs(intervalSize * 10e^{-6})\f$ \param value1 First value to compare \param value2 Second value to compare \param intervalSize interval size \return 0: if equal, -1: if value2 > value1, 1: if value1 > value2 */ inline int qwtFuzzyCompare( double value1, double value2, double intervalSize ) { const double eps = qAbs( 1.0e-6 * intervalSize ); if ( value2 - value1 > eps ) return -1; if ( value1 - value2 > eps ) return 1; return 0; } inline bool qwtFuzzyGreaterOrEqual( double d1, double d2 ) { return ( d1 >= d2 ) || qFuzzyCompare( d1, d2 ); } inline bool qwtFuzzyLessOrEqual( double d1, double d2 ) { return ( d1 <= d2 ) || qFuzzyCompare( d1, d2 ); } //! Return the sign inline int qwtSign( double x ) { if ( x > 0.0 ) return 1; else if ( x < 0.0 ) return ( -1 ); else return 0; } //! Return the square of a number inline double qwtSqr( const double x ) { return x * x; } /*! \brief Limit a value to fit into a specified interval \param x Input value \param x1 First interval boundary \param x2 Second interval boundary */ template T qwtLim( const T& x, const T& x1, const T& x2 ) { T rv; T xmin, xmax; xmin = qMin( x1, x2 ); xmax = qMax( x1, x2 ); if ( x < xmin ) rv = xmin; else if ( x > xmax ) rv = xmax; else rv = x; return rv; } inline QPoint qwtPolar2Pos( const QPoint &pole, double radius, double angle ) { const double x = pole.x() + radius * qCos( angle ); const double y = pole.y() - radius * qSin( angle ); return QPoint( qRound( x ), qRound( y ) ); } inline QPoint qwtDegree2Pos( const QPoint &pole, double radius, double angle ) { return qwtPolar2Pos( pole, radius, angle / 180.0 * M_PI ); } inline QPointF qwtPolar2Pos( const QPointF &pole, double radius, double angle ) { const double x = pole.x() + radius * qCos( angle ); const double y = pole.y() - radius * qSin( angle ); return QPoint( qRound( x ), qRound( y ) ); } inline QPointF qwtDegree2Pos( const QPointF &pole, double radius, double angle ) { return qwtPolar2Pos( pole, radius, angle / 180.0 * M_PI ); } #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_painter.cpp000066400000000000000000000420751320135501600217500ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_painter.h" #include "qwt_math.h" #include "qwt_clipper.h" #include "qwt_color_map.h" #include "qwt_scale_map.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include bool QwtPainter::d_polylineSplitting = true; bool QwtPainter::d_roundingAlignment = true; static inline bool isClippingNeeded( const QPainter *painter, QRectF &clipRect ) { bool doClipping = false; const QPaintEngine *pe = painter->paintEngine(); if ( pe && pe->type() == QPaintEngine::SVG ) { // The SVG paint engine ignores any clipping, if ( painter->hasClipping() ) { doClipping = true; clipRect = painter->clipRegion().boundingRect(); } } return doClipping; } static inline void drawPolyline( QPainter *painter, const QPointF *points, int pointCount, bool polylineSplitting ) { bool doSplit = false; if ( polylineSplitting ) { const QPaintEngine *pe = painter->paintEngine(); if ( pe && pe->type() == QPaintEngine::Raster ) { /* The raster paint engine seems to use some algo with O(n*n). ( Qt 4.3 is better than Qt 4.2, but remains unacceptable) To work around this problem, we have to split the polygon into smaller pieces. */ doSplit = true; } } if ( doSplit ) { const int splitSize = 20; for ( int i = 0; i < pointCount; i += splitSize ) { const int n = qMin( splitSize + 1, pointCount - i ); painter->drawPolyline( points + i, n ); } } else painter->drawPolyline( points, pointCount ); } static inline void unscaleFont( QPainter *painter ) { if ( painter->font().pixelSize() >= 0 ) return; static QSize screenResolution; if ( !screenResolution.isValid() ) { QDesktopWidget *desktop = QApplication::desktop(); if ( desktop ) { screenResolution.setWidth( desktop->logicalDpiX() ); screenResolution.setHeight( desktop->logicalDpiY() ); } } const QPaintDevice *pd = painter->device(); if ( pd->logicalDpiX() != screenResolution.width() || pd->logicalDpiY() != screenResolution.height() ) { QFont pixelFont( painter->font(), QApplication::desktop() ); pixelFont.setPixelSize( QFontInfo( pixelFont ).pixelSize() ); painter->setFont( pixelFont ); } } /*! Check if the painter is using a paint engine, that aligns coordinates to integers. Today these are all paint engines beside QPaintEngine::Pdf and QPaintEngine::SVG. \param painter Painter \return true, when the paint engine is aligning \sa setRoundingAlignment() */ bool QwtPainter::isAligning( QPainter *painter ) { if ( painter && painter->isActive() ) { switch ( painter->paintEngine()->type() ) { case QPaintEngine::Pdf: case QPaintEngine::SVG: return false; default:; } } return true; } /*! Enable whether coordinates should be rounded, before they are painted to a paint engine that floors to integer values. For other paint engines this ( Pdf, SVG ), this flag has no effect. QwtPainter stores this flag only, the rounding itsself is done in the painting code ( f.e the plot items ). The default setting is true. \sa roundingAlignment(), isAligning() */ void QwtPainter::setRoundingAlignment( bool enable ) { d_roundingAlignment = enable; } /*! \brief En/Disable line splitting for the raster paint engine The raster paint engine paints polylines of many points much faster when they are splitted in smaller chunks. \sa polylineSplitting() */ void QwtPainter::setPolylineSplitting( bool enable ) { d_polylineSplitting = enable; } //! Wrapper for QPainter::drawRect() void QwtPainter::drawRect( QPainter *painter, double x, double y, double w, double h ) { drawRect( painter, QRectF( x, y, w, h ) ); } //! Wrapper for QPainter::drawRect() void QwtPainter::drawRect( QPainter *painter, const QRectF &rect ) { const QRectF r = rect; QRectF clipRect; const bool deviceClipping = isClippingNeeded( painter, clipRect ); if ( deviceClipping ) { if ( !clipRect.intersects( r ) ) return; if ( !clipRect.contains( r ) ) { fillRect( painter, r & clipRect, painter->brush() ); painter->save(); painter->setBrush( Qt::NoBrush ); drawPolyline( painter, QPolygonF( r ) ); painter->restore(); return; } } painter->drawRect( r ); } //! Wrapper for QPainter::fillRect() void QwtPainter::fillRect( QPainter *painter, const QRectF &rect, const QBrush &brush ) { if ( !rect.isValid() ) return; QRectF clipRect; const bool deviceClipping = isClippingNeeded( painter, clipRect ); /* Performance of Qt4 is horrible for non trivial brushs. Without clipping expect minutes or hours for repainting large rects (might result from zooming) */ if ( deviceClipping ) clipRect &= painter->window(); else clipRect = painter->window(); if ( painter->hasClipping() ) clipRect &= painter->clipRegion().boundingRect(); QRectF r = rect; if ( deviceClipping ) r = r.intersected( clipRect ); if ( r.isValid() ) painter->fillRect( r, brush ); } //! Wrapper for QPainter::drawPie() void QwtPainter::drawPie( QPainter *painter, const QRectF &rect, int a, int alen ) { QRectF clipRect; const bool deviceClipping = isClippingNeeded( painter, clipRect ); if ( deviceClipping && !clipRect.contains( rect ) ) return; painter->drawPie( rect, a, alen ); } //! Wrapper for QPainter::drawEllipse() void QwtPainter::drawEllipse( QPainter *painter, const QRectF &rect ) { QRectF clipRect; const bool deviceClipping = isClippingNeeded( painter, clipRect ); if ( deviceClipping && !clipRect.contains( rect ) ) return; painter->drawEllipse( rect ); } //! Wrapper for QPainter::drawText() void QwtPainter::drawText( QPainter *painter, double x, double y, const QString &text ) { drawText( painter, QPointF( x, y ), text ); } //! Wrapper for QPainter::drawText() void QwtPainter::drawText( QPainter *painter, const QPointF &pos, const QString &text ) { QRectF clipRect; const bool deviceClipping = isClippingNeeded( painter, clipRect ); if ( deviceClipping && !clipRect.contains( pos ) ) return; painter->save(); unscaleFont( painter ); painter->drawText( pos, text ); painter->restore(); } //! Wrapper for QPainter::drawText() void QwtPainter::drawText( QPainter *painter, double x, double y, double w, double h, int flags, const QString &text ) { drawText( painter, QRectF( x, y, w, h ), flags, text ); } //! Wrapper for QPainter::drawText() void QwtPainter::drawText( QPainter *painter, const QRectF &rect, int flags, const QString &text ) { painter->save(); unscaleFont( painter ); painter->drawText( rect, flags, text ); painter->restore(); } #ifndef QT_NO_RICHTEXT /*! Draw a text document into a rectangle \param painter Painter \param rect Traget rectangle \param flags Alignments/Text flags, see QPainter::drawText() \param text Text document */ void QwtPainter::drawSimpleRichText( QPainter *painter, const QRectF &rect, int flags, const QTextDocument &text ) { QTextDocument *txt = text.clone(); painter->save(); painter->setFont( txt->defaultFont() ); unscaleFont( painter ); txt->setDefaultFont( painter->font() ); txt->setPageSize( QSizeF( rect.width(), QWIDGETSIZE_MAX ) ); QAbstractTextDocumentLayout* layout = txt->documentLayout(); const double height = layout->documentSize().height(); double y = rect.y(); if ( flags & Qt::AlignBottom ) y += ( rect.height() - height ); else if ( flags & Qt::AlignVCenter ) y += ( rect.height() - height ) / 2; QAbstractTextDocumentLayout::PaintContext context; context.palette.setColor( QPalette::Text, painter->pen().color() ); painter->translate( rect.x(), y ); layout->draw( painter, context ); painter->restore(); delete txt; } #endif // !QT_NO_RICHTEXT //! Wrapper for QPainter::drawLine() void QwtPainter::drawLine( QPainter *painter, const QPointF &p1, const QPointF &p2 ) { QRectF clipRect; const bool deviceClipping = isClippingNeeded( painter, clipRect ); if ( deviceClipping && !( clipRect.contains( p1 ) && clipRect.contains( p2 ) ) ) { QPolygonF polygon; polygon += p1; polygon += p2; drawPolyline( painter, polygon ); return; } painter->drawLine( p1, p2 ); } //! Wrapper for QPainter::drawPolygon() void QwtPainter::drawPolygon( QPainter *painter, const QPolygonF &polygon ) { QRectF clipRect; const bool deviceClipping = isClippingNeeded( painter, clipRect ); QPolygonF cpa = polygon; if ( deviceClipping ) cpa = QwtClipper::clipPolygonF( clipRect, polygon ); painter->drawPolygon( cpa ); } //! Wrapper for QPainter::drawPolyline() void QwtPainter::drawPolyline( QPainter *painter, const QPolygonF &polygon ) { QRectF clipRect; const bool deviceClipping = isClippingNeeded( painter, clipRect ); QPolygonF cpa = polygon; if ( deviceClipping ) cpa = QwtClipper::clipPolygonF( clipRect, cpa ); ::drawPolyline( painter, cpa.constData(), cpa.size(), d_polylineSplitting ); } //! Wrapper for QPainter::drawPolyline() void QwtPainter::drawPolyline( QPainter *painter, const QPointF *points, int pointCount ) { QRectF clipRect; const bool deviceClipping = isClippingNeeded( painter, clipRect ); if ( deviceClipping ) { QPolygonF polygon( pointCount ); memcpy( polygon.data(), points, pointCount * sizeof( QPointF ) ); polygon = QwtClipper::clipPolygonF( clipRect, polygon ); ::drawPolyline( painter, polygon.constData(), polygon.size(), d_polylineSplitting ); } else ::drawPolyline( painter, points, pointCount, d_polylineSplitting ); } //! Wrapper for QPainter::drawPoint() void QwtPainter::drawPoint( QPainter *painter, const QPointF &pos ) { QRectF clipRect; const bool deviceClipping = isClippingNeeded( painter, clipRect ); if ( deviceClipping && !clipRect.contains( pos ) ) return; painter->drawPoint( pos ); } //! Wrapper for QPainter::drawImage() void QwtPainter::drawImage( QPainter *painter, const QRectF &rect, const QImage &image ) { const QRect alignedRect = rect.toAlignedRect(); if ( alignedRect != rect ) { const QRectF clipRect = rect.adjusted( 0.0, 0.0, -1.0, -1.0 ); painter->save(); painter->setClipRect( clipRect, Qt::IntersectClip ); painter->drawImage( alignedRect, image ); painter->restore(); } else { painter->drawImage( alignedRect, image ); } } //! Wrapper for QPainter::drawPixmap() void QwtPainter::drawPixmap( QPainter *painter, const QRectF &rect, const QPixmap &pixmap ) { const QRect alignedRect = rect.toAlignedRect(); if ( alignedRect != rect ) { const QRectF clipRect = rect.adjusted( 0.0, 0.0, -1.0, -1.0 ); painter->save(); painter->setClipRect( clipRect, Qt::IntersectClip ); painter->drawPixmap( alignedRect, pixmap ); painter->restore(); } else { painter->drawPixmap( alignedRect, pixmap ); } } /*! Draw a arc with a linear gradient \note This method needs to be replaced by using QGradient */ void QwtPainter::drawColoredArc( QPainter *painter, const QRect &rect, int peak, int arc, int interval, const QColor &c1, const QColor &c2 ) { int h1, s1, v1; int h2, s2, v2; c1.getHsv( &h1, &s1, &v1 ); c2.getHsv( &h2, &s2, &v2 ); arc /= 2; for ( int angle = -arc; angle < arc; angle += interval ) { double ratio; if ( angle >= 0 ) ratio = 1.0 - angle / double( arc ); else ratio = 1.0 + angle / double( arc ); QColor c; c.setHsv( h1 + qRound( ratio * ( h2 - h1 ) ), s1 + qRound( ratio * ( s2 - s1 ) ), v1 + qRound( ratio * ( v2 - v1 ) ) ); painter->setPen( QPen( c, painter->pen().width() ) ); painter->drawArc( rect, ( peak + angle ) * 16, interval * 16 ); } } //! Draw a focus rectangle on a widget using its style. void QwtPainter::drawFocusRect( QPainter *painter, QWidget *widget ) { drawFocusRect( painter, widget, widget->rect() ); } //! Draw a focus rectangle on a widget using its style. void QwtPainter::drawFocusRect( QPainter *painter, QWidget *widget, const QRect &rect ) { QStyleOptionFocusRect opt; opt.init( widget ); opt.rect = rect; opt.state |= QStyle::State_HasFocus; widget->style()->drawPrimitive( QStyle::PE_FrameFocusRect, &opt, painter, widget ); } //! Draw a round frame void QwtPainter::drawRoundFrame( QPainter *painter, const QRect &rect, int width, const QPalette &palette, bool sunken ) { QColor c0 = palette.color( QPalette::Mid ); QColor c1, c2; if ( sunken ) { c1 = palette.color( QPalette::Dark ); c2 = palette.color( QPalette::Light ); } else { c1 = palette.color( QPalette::Light ); c2 = palette.color( QPalette::Dark ); } painter->setPen( QPen( c0, width ) ); painter->drawArc( rect, 0, 360 * 16 ); // full const int peak = 150; const int interval = 2; if ( c0 != c1 ) drawColoredArc( painter, rect, peak, 160, interval, c0, c1 ); if ( c0 != c2 ) drawColoredArc( painter, rect, peak + 180, 120, interval, c0, c2 ); } /*! Draw a color bar into a rectangle \param painter Painter \param colorMap Color map \param interval Value range \param scaleMap Scale map \param orientation Orientation \param rect Traget rectangle */ void QwtPainter::drawColorBar( QPainter *painter, const QwtColorMap &colorMap, const QwtInterval &interval, const QwtScaleMap &scaleMap, Qt::Orientation orientation, const QRectF &rect ) { QVector colorTable; if ( colorMap.format() == QwtColorMap::Indexed ) colorTable = colorMap.colorTable( interval ); QColor c; const QRect devRect = rect.toAlignedRect(); /* We paint to a pixmap first to have something scalable for printing ( f.e. in a Pdf document ) */ QPixmap pixmap( devRect.size() ); QPainter pmPainter( &pixmap ); pmPainter.translate( -devRect.x(), -devRect.y() ); if ( orientation == Qt::Horizontal ) { QwtScaleMap sMap = scaleMap; sMap.setPaintInterval( rect.left(), rect.right() ); for ( int x = devRect.left(); x <= devRect.right(); x++ ) { const double value = sMap.invTransform( x ); if ( colorMap.format() == QwtColorMap::RGB ) c.setRgb( colorMap.rgb( interval, value ) ); else c = colorTable[colorMap.colorIndex( interval, value )]; pmPainter.setPen( c ); pmPainter.drawLine( x, devRect.top(), x, devRect.bottom() ); } } else // Vertical { QwtScaleMap sMap = scaleMap; sMap.setPaintInterval( rect.bottom(), rect.top() ); for ( int y = devRect.top(); y <= devRect.bottom(); y++ ) { const double value = sMap.invTransform( y ); if ( colorMap.format() == QwtColorMap::RGB ) c.setRgb( colorMap.rgb( interval, value ) ); else c = colorTable[colorMap.colorIndex( interval, value )]; pmPainter.setPen( c ); pmPainter.drawLine( devRect.left(), y, devRect.right(), y ); } } pmPainter.end(); drawPixmap( painter, rect, pixmap ); } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_painter.h000066400000000000000000000111641320135501600214100ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PAINTER_H #define QWT_PAINTER_H #include "qwt_global.h" #include #include #include #include class QPainter; class QBrush; class QColor; class QWidget; class QPolygonF; class QRectF; class QImage; class QPixmap; class QwtScaleMap; class QwtColorMap; class QwtInterval; class QPalette; class QTextDocument; /*! \brief A collection of QPainter workarounds */ class QWT_EXPORT QwtPainter { public: static void setPolylineSplitting( bool ); static bool polylineSplitting(); static void setRoundingAlignment( bool ); static bool roundingAlignment(); static bool roundingAlignment(QPainter *); static void drawText( QPainter *, double x, double y, const QString & ); static void drawText( QPainter *, const QPointF &, const QString & ); static void drawText( QPainter *, double x, double y, double w, double h, int flags, const QString & ); static void drawText( QPainter *, const QRectF &, int flags, const QString & ); #ifndef QT_NO_RICHTEXT static void drawSimpleRichText( QPainter *, const QRectF &, int flags, const QTextDocument & ); #endif static void drawRect( QPainter *, double x, double y, double w, double h ); static void drawRect( QPainter *, const QRectF &rect ); static void fillRect( QPainter *, const QRectF &, const QBrush & ); static void drawEllipse( QPainter *, const QRectF & ); static void drawPie( QPainter *, const QRectF & r, int a, int alen ); static void drawLine( QPainter *, double x1, double y1, double x2, double y2 ); static void drawLine( QPainter *, const QPointF &p1, const QPointF &p2 ); static void drawLine( QPainter *, const QLineF & ); static void drawPolygon( QPainter *, const QPolygonF &pa ); static void drawPolyline( QPainter *, const QPolygonF &pa ); static void drawPolyline( QPainter *, const QPointF *, int pointCount ); static void drawPoint( QPainter *, double x, double y ); static void drawPoint( QPainter *, const QPointF & ); static void drawImage( QPainter *, const QRectF &, const QImage & ); static void drawPixmap( QPainter *, const QRectF &, const QPixmap & ); static void drawRoundFrame( QPainter *, const QRect &, int width, const QPalette &, bool sunken ); static void drawFocusRect( QPainter *, QWidget * ); static void drawFocusRect( QPainter *, QWidget *, const QRect & ); static void drawColorBar( QPainter *painter, const QwtColorMap &, const QwtInterval &, const QwtScaleMap &, Qt::Orientation, const QRectF & ); static bool isAligning( QPainter *painter ); private: static void drawColoredArc( QPainter *, const QRect &, int peak, int arc, int intervall, const QColor &c1, const QColor &c2 ); static bool d_polylineSplitting; static bool d_roundingAlignment; }; //! Wrapper for QPainter::drawPoint() inline void QwtPainter::drawPoint( QPainter *painter, double x, double y ) { QwtPainter::drawPoint( painter, QPointF( x, y ) ); } //! Wrapper for QPainter::drawLine() inline void QwtPainter::drawLine( QPainter *painter, double x1, double y1, double x2, double y2 ) { QwtPainter::drawLine( painter, QPointF( x1, y1 ), QPointF( x2, y2 ) ); } //! Wrapper for QPainter::drawLine() inline void QwtPainter::drawLine( QPainter *painter, const QLineF &line ) { QwtPainter::drawLine( painter, line.p1(), line.p2() ); } /*! Returns whether line splitting for the raster paint engine is enabled. \sa setPolylineSplitting() */ inline bool QwtPainter::polylineSplitting() { return d_polylineSplitting; } /*! Returns whether coordinates should be rounded, before they are painted to a paint engine that floors to integer values. For other paint engines this ( Pdf, SVG ), this flag has no effect. \sa setRoundingAlignment(), isAligning() */ inline bool QwtPainter::roundingAlignment() { return d_roundingAlignment; } /*! \return roundingAlignment() && isAligning(painter); \param painter Painter */ inline bool QwtPainter::roundingAlignment(QPainter *painter) { return d_roundingAlignment && isAligning(painter); } #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_plot.cpp000066400000000000000000000474311320135501600212650ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot.h" #include "qwt_plot_dict.h" #include "qwt_plot_layout.h" #include "qwt_scale_widget.h" #include "qwt_scale_engine.h" #include "qwt_text_label.h" #include "qwt_legend.h" #include "qwt_dyngrid_layout.h" #include "qwt_plot_canvas.h" #include #include #include #include #include class QwtPlot::PrivateData { public: QPointer lblTitle; QPointer canvas; QPointer legend; QwtPlotLayout *layout; bool autoReplot; }; /*! \brief Constructor \param parent Parent widget */ QwtPlot::QwtPlot( QWidget *parent ): QFrame( parent ) { initPlot( QwtText() ); } /*! \brief Constructor \param title Title text \param parent Parent widget */ QwtPlot::QwtPlot( const QwtText &title, QWidget *parent ): QFrame( parent ) { initPlot( title ); } //! Destructor QwtPlot::~QwtPlot() { detachItems( QwtPlotItem::Rtti_PlotItem, autoDelete() ); delete d_data->layout; deleteAxesData(); delete d_data; } /*! \brief Initializes a QwtPlot instance \param title Title text */ void QwtPlot::initPlot( const QwtText &title ) { d_data = new PrivateData; d_data->layout = new QwtPlotLayout; d_data->autoReplot = false; d_data->lblTitle = new QwtTextLabel( title, this ); d_data->lblTitle->setFont( QFont( fontInfo().family(), 14, QFont::Bold ) ); QwtText text( title ); text.setRenderFlags( Qt::AlignCenter | Qt::TextWordWrap ); d_data->lblTitle->setText( text ); d_data->legend = NULL; initAxesData(); d_data->canvas = new QwtPlotCanvas( this ); d_data->canvas->setFrameStyle( QFrame::Panel | QFrame::Sunken ); d_data->canvas->setLineWidth( 2 ); updateTabOrder(); setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding ); } /*! \brief Adds handling of layout requests */ bool QwtPlot::event( QEvent *e ) { bool ok = QFrame::event( e ); switch ( e->type() ) { case QEvent::LayoutRequest: updateLayout(); break; case QEvent::PolishRequest: polish(); break; default:; } return ok; } //! Replots the plot if QwtPlot::autoReplot() is \c true. void QwtPlot::autoRefresh() { if ( d_data->autoReplot ) replot(); } /*! \brief Set or reset the autoReplot option If the autoReplot option is set, the plot will be updated implicitly by manipulating member functions. Since this may be time-consuming, it is recommended to leave this option switched off and call replot() explicitly if necessary. The autoReplot option is set to false by default, which means that the user has to call replot() in order to make changes visible. \param tf \c true or \c false. Defaults to \c true. \sa replot() */ void QwtPlot::setAutoReplot( bool tf ) { d_data->autoReplot = tf; } //! \return true if the autoReplot option is set. bool QwtPlot::autoReplot() const { return d_data->autoReplot; } /*! Change the plot's title \param title New title */ void QwtPlot::setTitle( const QString &title ) { if ( title != d_data->lblTitle->text().text() ) { d_data->lblTitle->setText( title ); updateLayout(); } } /*! Change the plot's title \param title New title */ void QwtPlot::setTitle( const QwtText &title ) { if ( title != d_data->lblTitle->text() ) { d_data->lblTitle->setText( title ); updateLayout(); } } //! \return the plot's title QwtText QwtPlot::title() const { return d_data->lblTitle->text(); } //! \return the plot's title QwtPlotLayout *QwtPlot::plotLayout() { return d_data->layout; } //! \return the plot's titel label. const QwtPlotLayout *QwtPlot::plotLayout() const { return d_data->layout; } //! \return the plot's titel label. QwtTextLabel *QwtPlot::titleLabel() { return d_data->lblTitle; } /*! \return the plot's titel label. */ const QwtTextLabel *QwtPlot::titleLabel() const { return d_data->lblTitle; } /*! \return the plot's legend \sa insertLegend() */ QwtLegend *QwtPlot::legend() { return d_data->legend; } /*! \return the plot's legend \sa insertLegend() */ const QwtLegend *QwtPlot::legend() const { return d_data->legend; } /*! \return the plot's canvas */ QwtPlotCanvas *QwtPlot::canvas() { return d_data->canvas; } /*! \return the plot's canvas */ const QwtPlotCanvas *QwtPlot::canvas() const { return d_data->canvas; } //! Polish void QwtPlot::polish() { replot(); } /*! Return sizeHint \sa minimumSizeHint() */ QSize QwtPlot::sizeHint() const { int dw = 0; int dh = 0; for ( int axisId = 0; axisId < axisCnt; axisId++ ) { if ( axisEnabled( axisId ) ) { const int niceDist = 40; const QwtScaleWidget *scaleWidget = axisWidget( axisId ); const QwtScaleDiv &scaleDiv = scaleWidget->scaleDraw()->scaleDiv(); const int majCnt = scaleDiv.ticks( QwtScaleDiv::MajorTick ).count(); if ( axisId == yLeft || axisId == yRight ) { int hDiff = ( majCnt - 1 ) * niceDist - scaleWidget->minimumSizeHint().height(); if ( hDiff > dh ) dh = hDiff; } else { int wDiff = ( majCnt - 1 ) * niceDist - scaleWidget->minimumSizeHint().width(); if ( wDiff > dw ) dw = wDiff; } } } return minimumSizeHint() + QSize( dw, dh ); } /*! \brief Return a minimum size hint */ QSize QwtPlot::minimumSizeHint() const { QSize hint = d_data->layout->minimumSizeHint( this ); hint += QSize( 2 * frameWidth(), 2 * frameWidth() ); return hint; } /*! Resize and update internal layout \param e Resize event */ void QwtPlot::resizeEvent( QResizeEvent *e ) { QFrame::resizeEvent( e ); updateLayout(); } /*! \brief Redraw the plot If the autoReplot option is not set (which is the default) or if any curves are attached to raw data, the plot has to be refreshed explicitly in order to make changes visible. \sa setAutoReplot() \warning Calls canvas()->repaint, take care of infinite recursions */ void QwtPlot::replot() { bool doAutoReplot = autoReplot(); setAutoReplot( false ); updateAxes(); /* Maybe the layout needs to be updated, because of changed axes labels. We need to process them here before painting to avoid that scales and canvas get out of sync. */ QApplication::sendPostedEvents( this, QEvent::LayoutRequest ); d_data->canvas->replot(); setAutoReplot( doAutoReplot ); } /*! \brief Adjust plot content to its current size. \sa resizeEvent() */ void QwtPlot::updateLayout() { d_data->layout->activate( this, contentsRect() ); QRect titleRect = d_data->layout->titleRect().toRect(); QRect scaleRect[QwtPlot::axisCnt]; for ( int axisId = 0; axisId < axisCnt; axisId++ ) scaleRect[axisId] = d_data->layout->scaleRect( axisId ).toRect(); QRect legendRect = d_data->layout->legendRect().toRect(); QRect canvasRect = d_data->layout->canvasRect().toRect(); // // resize and show the visible widgets // if ( !d_data->lblTitle->text().isEmpty() ) { d_data->lblTitle->setGeometry( titleRect ); if ( !d_data->lblTitle->isVisible() ) d_data->lblTitle->show(); } else d_data->lblTitle->hide(); for ( int axisId = 0; axisId < axisCnt; axisId++ ) { if ( axisEnabled( axisId ) ) { axisWidget( axisId )->setGeometry( scaleRect[axisId] ); if ( axisId == xBottom || axisId == xTop ) { QRegion r( scaleRect[axisId] ); if ( axisEnabled( yLeft ) ) r = r.subtracted( QRegion( scaleRect[yLeft] ) ); if ( axisEnabled( yRight ) ) r = r.subtracted( QRegion( scaleRect[yRight] ) ); r.translate( -d_data->layout->scaleRect( axisId ).x(), -scaleRect[axisId].y() ); axisWidget( axisId )->setMask( r ); } if ( !axisWidget( axisId )->isVisible() ) axisWidget( axisId )->show(); } else axisWidget( axisId )->hide(); } if ( d_data->legend && d_data->layout->legendPosition() != ExternalLegend ) { if ( d_data->legend->itemCount() > 0 ) { d_data->legend->setGeometry( legendRect ); d_data->legend->show(); } else d_data->legend->hide(); } d_data->canvas->setGeometry( canvasRect ); } /*! Update the focus tab order The order is changed so that the canvas will be in front of the first legend item, or behind the last legend item - depending on the position of the legend. */ void QwtPlot::updateTabOrder() { if ( d_data->canvas->focusPolicy() == Qt::NoFocus ) return; if ( d_data->legend.isNull() || d_data->layout->legendPosition() == ExternalLegend || d_data->legend->legendItems().count() == 0 ) { return; } // Depending on the position of the legend the // tab order will be changed that the canvas is // next to the last legend item, or before // the first one. const bool canvasFirst = d_data->layout->legendPosition() == QwtPlot::BottomLegend || d_data->layout->legendPosition() == QwtPlot::RightLegend; QWidget *previous = NULL; QWidget *w = d_data->canvas; while ( ( w = w->nextInFocusChain() ) != d_data->canvas ) { bool isLegendItem = false; if ( w->focusPolicy() != Qt::NoFocus && w->parent() && w->parent() == d_data->legend->contentsWidget() ) { isLegendItem = true; } if ( canvasFirst ) { if ( isLegendItem ) break; previous = w; } else { if ( isLegendItem ) previous = w; else { if ( previous ) break; } } } if ( previous && previous != d_data->canvas ) setTabOrder( previous, d_data->canvas ); } /*! Redraw the canvas. \param painter Painter used for drawing \warning drawCanvas calls drawItems what is also used for printing. Applications that like to add individual plot items better overload drawItems() \sa drawItems() */ void QwtPlot::drawCanvas( QPainter *painter ) { QwtScaleMap maps[axisCnt]; for ( int axisId = 0; axisId < axisCnt; axisId++ ) maps[axisId] = canvasMap( axisId ); drawItems( painter, d_data->canvas->contentsRect(), maps ); } /*! Redraw the canvas items. \param painter Painter used for drawing \param canvasRect Bounding rectangle where to paint \param map QwtPlot::axisCnt maps, mapping between plot and paint device coordinates */ void QwtPlot::drawItems( QPainter *painter, const QRectF &canvasRect, const QwtScaleMap map[axisCnt] ) const { const QwtPlotItemList& itmList = itemList(); for ( QwtPlotItemIterator it = itmList.begin(); it != itmList.end(); ++it ) { QwtPlotItem *item = *it; if ( item && item->isVisible() ) { painter->save(); painter->setRenderHint( QPainter::Antialiasing, item->testRenderHint( QwtPlotItem::RenderAntialiased ) ); item->draw( painter, map[item->xAxis()], map[item->yAxis()], canvasRect ); painter->restore(); } } } /*! \param axisId Axis \return Map for the axis on the canvas. With this map pixel coordinates can translated to plot coordinates and vice versa. \sa QwtScaleMap, transform(), invTransform() */ QwtScaleMap QwtPlot::canvasMap( int axisId ) const { QwtScaleMap map; if ( !d_data->canvas ) return map; map.setTransformation( axisScaleEngine( axisId )->transformation() ); const QwtScaleDiv *sd = axisScaleDiv( axisId ); map.setScaleInterval( sd->lowerBound(), sd->upperBound() ); if ( axisEnabled( axisId ) ) { const QwtScaleWidget *s = axisWidget( axisId ); if ( axisId == yLeft || axisId == yRight ) { double y = s->y() + s->startBorderDist() - d_data->canvas->y(); double h = s->height() - s->startBorderDist() - s->endBorderDist(); map.setPaintInterval( y + h, y ); } else { double x = s->x() + s->startBorderDist() - d_data->canvas->x(); double w = s->width() - s->startBorderDist() - s->endBorderDist(); map.setPaintInterval( x, x + w ); } } else { int margin = 0; if ( !plotLayout()->alignCanvasToScales() ) margin = plotLayout()->canvasMargin( axisId ); const QRect &canvasRect = d_data->canvas->contentsRect(); if ( axisId == yLeft || axisId == yRight ) { map.setPaintInterval( canvasRect.bottom() - margin, canvasRect.top() + margin ); } else { map.setPaintInterval( canvasRect.left() + margin, canvasRect.right() - margin ); } } return map; } /*! Change the margin of the plot. The margin is the space around all components. \param margin new margin \sa QwtPlotLayout::setMargin(), margin(), plotLayout() */ void QwtPlot::setMargin( int margin ) { if ( margin < 0 ) margin = 0; if ( margin != d_data->layout->margin() ) { d_data->layout->setMargin( margin ); updateLayout(); } } /*! \return margin \sa setMargin(), QwtPlotLayout::margin(), plotLayout() */ int QwtPlot::margin() const { return d_data->layout->margin(); } /*! \brief Change the background of the plotting area Sets c to QPalette::Window of all colorgroups of the palette of the canvas. Using canvas()->setPalette() is a more powerful way to set these colors. \param c new background color */ void QwtPlot::setCanvasBackground( const QColor &c ) { QPalette p = d_data->canvas->palette(); for ( int i = 0; i < QPalette::NColorGroups; i++ ) p.setColor( ( QPalette::ColorGroup )i, QPalette::Window, c ); canvas()->setPalette( p ); } /*! Nothing else than: canvas()->palette().color( QPalette::Normal, QPalette::Window); \return the background color of the plotting area. */ const QColor &QwtPlot::canvasBackground() const { return canvas()->palette().color( QPalette::Normal, QPalette::Window ); } /*! \brief Change the border width of the plotting area Nothing else than canvas()->setLineWidth(w), left for compatibility only. \param w new border width */ void QwtPlot::setCanvasLineWidth( int w ) { canvas()->setLineWidth( w ); updateLayout(); } /*! Nothing else than: canvas()->lineWidth(), left for compatibility only. \return the border width of the plotting area */ int QwtPlot::canvasLineWidth() const { return canvas()->lineWidth(); } /*! \return \c true if the specified axis exists, otherwise \c false \param axisId axis index */ bool QwtPlot::axisValid( int axisId ) { return ( ( axisId >= QwtPlot::yLeft ) && ( axisId < QwtPlot::axisCnt ) ); } /*! Called internally when the legend has been clicked on. Emits a legendClicked() signal. */ void QwtPlot::legendItemClicked() { if ( d_data->legend && sender()->isWidgetType() ) { QwtPlotItem *plotItem = ( QwtPlotItem* )d_data->legend->find( ( QWidget * )sender() ); if ( plotItem ) Q_EMIT legendClicked( plotItem ); } } /*! Called internally when the legend has been checked Emits a legendClicked() signal. */ void QwtPlot::legendItemChecked( bool on ) { if ( d_data->legend && sender()->isWidgetType() ) { QwtPlotItem *plotItem = ( QwtPlotItem* )d_data->legend->find( ( QWidget * )sender() ); if ( plotItem ) Q_EMIT legendChecked( plotItem, on ); } } /*! \brief Insert a legend If the position legend is \c QwtPlot::LeftLegend or \c QwtPlot::RightLegend the legend will be organized in one column from top to down. Otherwise the legend items will be placed in a table with a best fit number of columns from left to right. If pos != QwtPlot::ExternalLegend the plot widget will become parent of the legend. It will be deleted when the plot is deleted, or another legend is set with insertLegend(). \param legend Legend \param pos The legend's position. For top/left position the number of colums will be limited to 1, otherwise it will be set to unlimited. \param ratio Ratio between legend and the bounding rect of title, canvas and axes. The legend will be shrinked if it would need more space than the given ratio. The ratio is limited to ]0.0 .. 1.0]. In case of <= 0.0 it will be reset to the default ratio. The default vertical/horizontal ratio is 0.33/0.5. \sa legend(), QwtPlotLayout::legendPosition(), QwtPlotLayout::setLegendPosition() */ void QwtPlot::insertLegend( QwtLegend *legend, QwtPlot::LegendPosition pos, double ratio ) { d_data->layout->setLegendPosition( pos, ratio ); if ( legend != d_data->legend ) { if ( d_data->legend && d_data->legend->parent() == this ) delete d_data->legend; d_data->legend = legend; if ( d_data->legend ) { if ( pos != ExternalLegend ) { if ( d_data->legend->parent() != this ) d_data->legend->setParent( this ); } const QwtPlotItemList& itmList = itemList(); for ( QwtPlotItemIterator it = itmList.begin(); it != itmList.end(); ++it ) { ( *it )->updateLegend( d_data->legend ); } QLayout *l = d_data->legend->contentsWidget()->layout(); if ( l && l->inherits( "QwtDynGridLayout" ) ) { QwtDynGridLayout *tl = ( QwtDynGridLayout * )l; switch ( d_data->layout->legendPosition() ) { case LeftLegend: case RightLegend: tl->setMaxCols( 1 ); // 1 column: align vertical break; case TopLegend: case BottomLegend: tl->setMaxCols( 0 ); // unlimited break; case ExternalLegend: break; } } } updateTabOrder(); } updateLayout(); } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_plot.h000066400000000000000000000176021320135501600207270ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_H #define QWT_PLOT_H #include "qwt_global.h" #include "qwt_text.h" #include "qwt_plot_dict.h" #include "qwt_scale_map.h" #include class QwtPlotLayout; class QwtLegend; class QwtScaleWidget; class QwtScaleEngine; class QwtScaleDiv; class QwtScaleDraw; class QwtTextLabel; class QwtPlotCanvas; /*! \brief A 2-D plotting widget QwtPlot is a widget for plotting two-dimensional graphs. An unlimited number of plot items can be displayed on its canvas. Plot items might be curves (QwtPlotCurve), markers (QwtPlotMarker), the grid (QwtPlotGrid), or anything else derived from QwtPlotItem. A plot can have up to four axes, with each plot item attached to an x- and a y axis. The scales at the axes can be explicitely set (QwtScaleDiv), or are calculated from the plot items, using algorithms (QwtScaleEngine) which can be configured separately for each axis. \image html plot.png \par Example The following example shows (schematically) the most simple way to use QwtPlot. By default, only the left and bottom axes are visible and their scales are computed automatically. \verbatim #include #include QwtPlot *myPlot = new QwtPlot("Two Curves", parent); // add curves QwtPlotCurve *curve1 = new QwtPlotCurve("Curve 1"); QwtPlotCurve *curve2 = new QwtPlotCurve("Curve 2"); // copy the data into the curves curve1->setData(...); curve2->setData(...); curve1->attach(myPlot); curve2->attach(myPlot); // finally, refresh the plot myPlot->replot(); \endverbatim */ class QWT_EXPORT QwtPlot: public QFrame, public QwtPlotDict { Q_OBJECT Q_PROPERTY( QString propertiesDocument READ grabProperties WRITE applyProperties ) public: /*! Axis index - yLeft\n - yRight\n - xBottom\n - xTop\n */ enum Axis { yLeft, yRight, xBottom, xTop, axisCnt }; /*! Position of the legend, relative to the canvas. - LeftLegend\n The legend will be left from the yLeft axis. - RightLegend\n The legend will be right from the yLeft axis. - BottomLegend\n The legend will be right below the xBottom axis. - TopLegend\n The legend will be between xTop axis and the title. - ExternalLegend\n External means that only the content of the legend will be handled by QwtPlot, but not its geometry. This might be interesting if an application wants to have a legend in an external window ( or on the canvas ). \note In case of ExternalLegend, the legend is not handled by QwtPlotRenderer \sa insertLegend() */ enum LegendPosition { LeftLegend, RightLegend, BottomLegend, TopLegend, ExternalLegend }; explicit QwtPlot( QWidget * = NULL ); explicit QwtPlot( const QwtText &title, QWidget *p = NULL ); virtual ~QwtPlot(); void applyProperties( const QString & ); QString grabProperties() const; void setAutoReplot( bool tf = true ); bool autoReplot() const; // Layout QwtPlotLayout *plotLayout(); const QwtPlotLayout *plotLayout() const; void setMargin( int margin ); int margin() const; // Title void setTitle( const QString & ); void setTitle( const QwtText &t ); QwtText title() const; QwtTextLabel *titleLabel(); const QwtTextLabel *titleLabel() const; // Canvas QwtPlotCanvas *canvas(); const QwtPlotCanvas *canvas() const; void setCanvasBackground ( const QColor &c ); const QColor& canvasBackground() const; void setCanvasLineWidth( int w ); int canvasLineWidth() const; virtual QwtScaleMap canvasMap( int axisId ) const; double invTransform( int axisId, int pos ) const; double transform( int axisId, double value ) const; // Axes QwtScaleEngine *axisScaleEngine( int axisId ); const QwtScaleEngine *axisScaleEngine( int axisId ) const; void setAxisScaleEngine( int axisId, QwtScaleEngine * ); void setAxisAutoScale( int axisId ); bool axisAutoScale( int axisId ) const; void enableAxis( int axisId, bool tf = true ); bool axisEnabled( int axisId ) const; void setAxisFont( int axisId, const QFont &f ); QFont axisFont( int axisId ) const; void setAxisScale( int axisId, double min, double max, double step = 0 ); void setAxisScaleDiv( int axisId, const QwtScaleDiv & ); void setAxisScaleDraw( int axisId, QwtScaleDraw * ); double axisStepSize( int axisId ) const; const QwtScaleDiv *axisScaleDiv( int axisId ) const; QwtScaleDiv *axisScaleDiv( int axisId ); const QwtScaleDraw *axisScaleDraw( int axisId ) const; QwtScaleDraw *axisScaleDraw( int axisId ); const QwtScaleWidget *axisWidget( int axisId ) const; QwtScaleWidget *axisWidget( int axisId ); void setAxisLabelAlignment( int axisId, Qt::Alignment ); void setAxisLabelRotation( int axisId, double rotation ); void setAxisTitle( int axisId, const QString & ); void setAxisTitle( int axisId, const QwtText & ); QwtText axisTitle( int axisId ) const; void setAxisMaxMinor( int axisId, int maxMinor ); int axisMaxMinor( int axisId ) const; void setAxisMaxMajor( int axisId, int maxMajor ); int axisMaxMajor( int axisId ) const; // Legend void insertLegend( QwtLegend *, LegendPosition = QwtPlot::RightLegend, double ratio = -1.0 ); QwtLegend *legend(); const QwtLegend *legend() const; // Misc virtual void polish(); virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; virtual void updateLayout(); virtual void drawCanvas( QPainter * ); void updateAxes(); virtual bool event( QEvent * ); virtual void drawItems( QPainter *, const QRectF &, const QwtScaleMap maps[axisCnt] ) const; Q_SIGNALS: /*! A signal which is emitted when the user has clicked on a legend item, which is in QwtLegend::ClickableItem mode. \param plotItem Corresponding plot item of the selected legend item \note clicks are disabled as default \sa QwtLegend::setItemMode(), QwtLegend::itemMode() */ void legendClicked( QwtPlotItem *plotItem ); /*! A signal which is emitted when the user has clicked on a legend item, which is in QwtLegend::CheckableItem mode \param plotItem Corresponding plot item of the selected legend item \param on True when the legen item is checked \note clicks are disabled as default \sa QwtLegend::setItemMode(), QwtLegend::itemMode() */ void legendChecked( QwtPlotItem *plotItem, bool on ); public Q_SLOTS: virtual void replot(); void autoRefresh(); protected Q_SLOTS: virtual void legendItemClicked(); virtual void legendItemChecked( bool ); protected: static bool axisValid( int axisId ); virtual void updateTabOrder(); virtual void resizeEvent( QResizeEvent *e ); private: void initAxesData(); void deleteAxesData(); void updateScaleDiv(); void initPlot( const QwtText &title ); class AxisData; AxisData *d_axisData[axisCnt]; class PrivateData; PrivateData *d_data; }; #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_plot_axis.cpp000066400000000000000000000401501320135501600223000ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot.h" #include "qwt_math.h" #include "qwt_scale_widget.h" #include "qwt_scale_div.h" #include "qwt_scale_engine.h" class QwtPlot::AxisData { public: bool isEnabled; bool doAutoScale; double minValue; double maxValue; double stepSize; int maxMajor; int maxMinor; QwtScaleDiv scaleDiv; QwtScaleEngine *scaleEngine; QwtScaleWidget *scaleWidget; }; //! Initialize axes void QwtPlot::initAxesData() { int axisId; for ( axisId = 0; axisId < axisCnt; axisId++ ) d_axisData[axisId] = new AxisData; d_axisData[yLeft]->scaleWidget = new QwtScaleWidget( QwtScaleDraw::LeftScale, this ); d_axisData[yRight]->scaleWidget = new QwtScaleWidget( QwtScaleDraw::RightScale, this ); d_axisData[xTop]->scaleWidget = new QwtScaleWidget( QwtScaleDraw::TopScale, this ); d_axisData[xBottom]->scaleWidget = new QwtScaleWidget( QwtScaleDraw::BottomScale, this ); QFont fscl( fontInfo().family(), 10 ); QFont fttl( fontInfo().family(), 12, QFont::Bold ); for ( axisId = 0; axisId < axisCnt; axisId++ ) { AxisData &d = *d_axisData[axisId]; d.scaleWidget->setFont( fscl ); d.scaleWidget->setMargin( 2 ); QwtText text = d.scaleWidget->title(); text.setFont( fttl ); d.scaleWidget->setTitle( text ); d.doAutoScale = true; d.minValue = 0.0; d.maxValue = 1000.0; d.stepSize = 0.0; d.maxMinor = 5; d.maxMajor = 8; d.scaleEngine = new QwtLinearScaleEngine; d.scaleDiv.invalidate(); } d_axisData[yLeft]->isEnabled = true; d_axisData[yRight]->isEnabled = false; d_axisData[xBottom]->isEnabled = true; d_axisData[xTop]->isEnabled = false; } void QwtPlot::deleteAxesData() { for ( int axisId = 0; axisId < axisCnt; axisId++ ) { delete d_axisData[axisId]->scaleEngine; delete d_axisData[axisId]; d_axisData[axisId] = NULL; } } /*! \return specified axis, or NULL if axisId is invalid. \param axisId axis index */ const QwtScaleWidget *QwtPlot::axisWidget( int axisId ) const { if ( axisValid( axisId ) ) return d_axisData[axisId]->scaleWidget; return NULL; } /*! \return specified axis, or NULL if axisId is invalid. \param axisId axis index */ QwtScaleWidget *QwtPlot::axisWidget( int axisId ) { if ( axisValid( axisId ) ) return d_axisData[axisId]->scaleWidget; return NULL; } /*! Change the scale engine for an axis \param axisId axis index \param scaleEngine Scale engine \sa axisScaleEngine() */ void QwtPlot::setAxisScaleEngine( int axisId, QwtScaleEngine *scaleEngine ) { if ( axisValid( axisId ) && scaleEngine != NULL ) { AxisData &d = *d_axisData[axisId]; delete d.scaleEngine; d.scaleEngine = scaleEngine; d.scaleDiv.invalidate(); autoRefresh(); } } /*! \param axisId axis index \return Scale engine for a specific axis */ QwtScaleEngine *QwtPlot::axisScaleEngine( int axisId ) { if ( axisValid( axisId ) ) return d_axisData[axisId]->scaleEngine; else return NULL; } /*! \param axisId axis index \return Scale engine for a specific axis */ const QwtScaleEngine *QwtPlot::axisScaleEngine( int axisId ) const { if ( axisValid( axisId ) ) return d_axisData[axisId]->scaleEngine; else return NULL; } /*! \return \c true if autoscaling is enabled \param axisId axis index */ bool QwtPlot::axisAutoScale( int axisId ) const { if ( axisValid( axisId ) ) return d_axisData[axisId]->doAutoScale; else return false; } /*! \return \c true if a specified axis is enabled \param axisId axis index */ bool QwtPlot::axisEnabled( int axisId ) const { if ( axisValid( axisId ) ) return d_axisData[axisId]->isEnabled; else return false; } /*! \return the font of the scale labels for a specified axis \param axisId axis index */ QFont QwtPlot::axisFont( int axisId ) const { if ( axisValid( axisId ) ) return axisWidget( axisId )->font(); else return QFont(); } /*! \return the maximum number of major ticks for a specified axis \param axisId axis index sa setAxisMaxMajor() */ int QwtPlot::axisMaxMajor( int axisId ) const { if ( axisValid( axisId ) ) return d_axisData[axisId]->maxMajor; else return 0; } /*! \return the maximum number of minor ticks for a specified axis \param axisId axis index sa setAxisMaxMinor() */ int QwtPlot::axisMaxMinor( int axisId ) const { if ( axisValid( axisId ) ) return d_axisData[axisId]->maxMinor; else return 0; } /*! \brief Return the scale division of a specified axis axisScaleDiv(axisId)->lowerBound(), axisScaleDiv(axisId)->upperBound() are the current limits of the axis scale. \param axisId axis index \return Scale division \sa QwtScaleDiv, setAxisScaleDiv() */ const QwtScaleDiv *QwtPlot::axisScaleDiv( int axisId ) const { if ( !axisValid( axisId ) ) return NULL; return &d_axisData[axisId]->scaleDiv; } /*! \brief Return the scale division of a specified axis axisScaleDiv(axisId)->lowerBound(), axisScaleDiv(axisId)->upperBound() are the current limits of the axis scale. \param axisId axis index \return Scale division \sa QwtScaleDiv, setAxisScaleDiv() */ QwtScaleDiv *QwtPlot::axisScaleDiv( int axisId ) { if ( !axisValid( axisId ) ) return NULL; return &d_axisData[axisId]->scaleDiv; } /*! \returns the scale draw of a specified axis \param axisId axis index \return specified scaleDraw for axis, or NULL if axis is invalid. \sa QwtScaleDraw */ const QwtScaleDraw *QwtPlot::axisScaleDraw( int axisId ) const { if ( !axisValid( axisId ) ) return NULL; return axisWidget( axisId )->scaleDraw(); } /*! \returns the scale draw of a specified axis \param axisId axis index \return specified scaleDraw for axis, or NULL if axis is invalid. \sa QwtScaleDraw */ QwtScaleDraw *QwtPlot::axisScaleDraw( int axisId ) { if ( !axisValid( axisId ) ) return NULL; return axisWidget( axisId )->scaleDraw(); } /*! Return the step size parameter, that has been set in setAxisScale. This doesn't need to be the step size of the current scale. \param axisId axis index \return step size parameter value \sa setAxisScale() */ double QwtPlot::axisStepSize( int axisId ) const { if ( !axisValid( axisId ) ) return 0; return d_axisData[axisId]->stepSize; } /*! \return the title of a specified axis \param axisId axis index */ QwtText QwtPlot::axisTitle( int axisId ) const { if ( axisValid( axisId ) ) return axisWidget( axisId )->title(); else return QwtText(); } /*! \brief Enable or disable a specified axis When an axis is disabled, this only means that it is not visible on the screen. Curves, markers and can be attached to disabled axes, and transformation of screen coordinates into values works as normal. Only xBottom and yLeft are enabled by default. \param axisId axis index \param tf \c true (enabled) or \c false (disabled) */ void QwtPlot::enableAxis( int axisId, bool tf ) { if ( axisValid( axisId ) && tf != d_axisData[axisId]->isEnabled ) { d_axisData[axisId]->isEnabled = tf; updateLayout(); } } /*! Transform the x or y coordinate of a position in the drawing region into a value. \param axisId axis index \param pos position \warning The position can be an x or a y coordinate, depending on the specified axis. */ double QwtPlot::invTransform( int axisId, int pos ) const { if ( axisValid( axisId ) ) return( canvasMap( axisId ).invTransform( pos ) ); else return 0.0; } /*! \brief Transform a value into a coordinate in the plotting region \param axisId axis index \param value value \return X or y coordinate in the plotting region corresponding to the value. */ double QwtPlot::transform( int axisId, double value ) const { if ( axisValid( axisId ) ) return( canvasMap( axisId ).transform( value ) ); else return 0.0; } /*! \brief Change the font of an axis \param axisId axis index \param f font \warning This function changes the font of the tick labels, not of the axis title. */ void QwtPlot::setAxisFont( int axisId, const QFont &f ) { if ( axisValid( axisId ) ) axisWidget( axisId )->setFont( f ); } /*! \brief Enable autoscaling for a specified axis This member function is used to switch back to autoscaling mode after a fixed scale has been set. Autoscaling is enabled by default. \param axisId axis index \sa setAxisScale(), setAxisScaleDiv() */ void QwtPlot::setAxisAutoScale( int axisId ) { if ( axisValid( axisId ) && !d_axisData[axisId]->doAutoScale ) { d_axisData[axisId]->doAutoScale = true; autoRefresh(); } } /*! \brief Disable autoscaling and specify a fixed scale for a selected axis. \param axisId axis index \param min \param max minimum and maximum of the scale \param stepSize Major step size. If step == 0, the step size is calculated automatically using the maxMajor setting. \sa setAxisMaxMajor(), setAxisAutoScale(), axisStepSize() */ void QwtPlot::setAxisScale( int axisId, double min, double max, double stepSize ) { if ( axisValid( axisId ) ) { AxisData &d = *d_axisData[axisId]; d.doAutoScale = false; d.scaleDiv.invalidate(); d.minValue = min; d.maxValue = max; d.stepSize = stepSize; autoRefresh(); } } /*! \brief Disable autoscaling and specify a fixed scale for a selected axis. \param axisId axis index \param scaleDiv Scale division \sa setAxisScale(), setAxisAutoScale() */ void QwtPlot::setAxisScaleDiv( int axisId, const QwtScaleDiv &scaleDiv ) { if ( axisValid( axisId ) ) { AxisData &d = *d_axisData[axisId]; d.doAutoScale = false; d.scaleDiv = scaleDiv; autoRefresh(); } } /*! \brief Set a scale draw \param axisId axis index \param scaleDraw object responsible for drawing scales. By passing scaleDraw it is possible to extend QwtScaleDraw functionality and let it take place in QwtPlot. Please note that scaleDraw has to be created with new and will be deleted by the corresponding QwtScale member ( like a child object ). \sa QwtScaleDraw, QwtScaleWidget \warning The attributes of scaleDraw will be overwritten by those of the previous QwtScaleDraw. */ void QwtPlot::setAxisScaleDraw( int axisId, QwtScaleDraw *scaleDraw ) { if ( axisValid( axisId ) ) { axisWidget( axisId )->setScaleDraw( scaleDraw ); autoRefresh(); } } /*! Change the alignment of the tick labels \param axisId axis index \param alignment Or'd Qt::AlignmentFlags \sa QwtScaleDraw::setLabelAlignment() */ void QwtPlot::setAxisLabelAlignment( int axisId, Qt::Alignment alignment ) { if ( axisValid( axisId ) ) axisWidget( axisId )->setLabelAlignment( alignment ); } /*! Rotate all tick labels \param axisId axis index \param rotation Angle in degrees. When changing the label rotation, the label alignment might be adjusted too. \sa QwtScaleDraw::setLabelRotation(), setAxisLabelAlignment() */ void QwtPlot::setAxisLabelRotation( int axisId, double rotation ) { if ( axisValid( axisId ) ) axisWidget( axisId )->setLabelRotation( rotation ); } /*! Set the maximum number of minor scale intervals for a specified axis \param axisId axis index \param maxMinor maximum number of minor steps \sa axisMaxMinor() */ void QwtPlot::setAxisMaxMinor( int axisId, int maxMinor ) { if ( axisValid( axisId ) ) { if ( maxMinor < 0 ) maxMinor = 0; if ( maxMinor > 100 ) maxMinor = 100; AxisData &d = *d_axisData[axisId]; if ( maxMinor != d.maxMinor ) { d.maxMinor = maxMinor; d.scaleDiv.invalidate(); autoRefresh(); } } } /*! Set the maximum number of major scale intervals for a specified axis \param axisId axis index \param maxMajor maximum number of major steps \sa axisMaxMajor() */ void QwtPlot::setAxisMaxMajor( int axisId, int maxMajor ) { if ( axisValid( axisId ) ) { if ( maxMajor < 1 ) maxMajor = 1; if ( maxMajor > 1000 ) maxMajor = 10000; AxisData &d = *d_axisData[axisId]; if ( maxMajor != d.maxMajor ) { d.maxMajor = maxMajor; d.scaleDiv.invalidate(); autoRefresh(); } } } /*! \brief Change the title of a specified axis \param axisId axis index \param title axis title */ void QwtPlot::setAxisTitle( int axisId, const QString &title ) { if ( axisValid( axisId ) ) axisWidget( axisId )->setTitle( title ); } /*! \brief Change the title of a specified axis \param axisId axis index \param title axis title */ void QwtPlot::setAxisTitle( int axisId, const QwtText &title ) { if ( axisValid( axisId ) ) axisWidget( axisId )->setTitle( title ); } //! Rebuild the scales void QwtPlot::updateAxes() { // Find bounding interval of the item data // for all axes, where autoscaling is enabled QwtInterval intv[axisCnt]; const QwtPlotItemList& itmList = itemList(); QwtPlotItemIterator it; for ( it = itmList.begin(); it != itmList.end(); ++it ) { const QwtPlotItem *item = *it; if ( !item->testItemAttribute( QwtPlotItem::AutoScale ) ) continue; if ( axisAutoScale( item->xAxis() ) || axisAutoScale( item->yAxis() ) ) { const QRectF rect = item->boundingRect(); intv[item->xAxis()] |= QwtInterval( rect.left(), rect.right() ); intv[item->yAxis()] |= QwtInterval( rect.top(), rect.bottom() ); } } // Adjust scales for ( int axisId = 0; axisId < axisCnt; axisId++ ) { AxisData &d = *d_axisData[axisId]; double minValue = d.minValue; double maxValue = d.maxValue; double stepSize = d.stepSize; if ( d.doAutoScale && intv[axisId].isValid() ) { d.scaleDiv.invalidate(); minValue = intv[axisId].minValue(); maxValue = intv[axisId].maxValue(); d.scaleEngine->autoScale( d.maxMajor, minValue, maxValue, stepSize ); } if ( !d.scaleDiv.isValid() ) { d.scaleDiv = d.scaleEngine->divideScale( minValue, maxValue, d.maxMajor, d.maxMinor, stepSize ); } QwtScaleWidget *scaleWidget = axisWidget( axisId ); scaleWidget->setScaleDiv( d.scaleEngine->transformation(), d.scaleDiv ); int startDist, endDist; scaleWidget->getBorderDistHint( startDist, endDist ); scaleWidget->setBorderDist( startDist, endDist ); } for ( it = itmList.begin(); it != itmList.end(); ++it ) { QwtPlotItem *item = *it; item->updateScaleDiv( *axisScaleDiv( item->xAxis() ), *axisScaleDiv( item->yAxis() ) ); } } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_plot_canvas.cpp000066400000000000000000000217031320135501600226120ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_canvas.h" #include "qwt_painter.h" #include "qwt_math.h" #include "qwt_plot.h" #include #include #include #include #ifdef Q_WS_X11 #include #endif #include class QwtPlotCanvas::PrivateData { public: PrivateData(): focusIndicator( NoFocusIndicator ), paintAttributes( 0 ), cache( NULL ) { } ~PrivateData() { delete cache; } FocusIndicator focusIndicator; int paintAttributes; QPixmap *cache; }; //! Sets a cross cursor, enables QwtPlotCanvas::PaintCached QwtPlotCanvas::QwtPlotCanvas( QwtPlot *plot ): QFrame( plot ) { d_data = new PrivateData; setAutoFillBackground( true ); #ifndef QT_NO_CURSOR setCursor( Qt::CrossCursor ); #endif setPaintAttribute( PaintCached, true ); setPaintAttribute( PaintPacked, true ); } //! Destructor QwtPlotCanvas::~QwtPlotCanvas() { delete d_data; } //! Return parent plot widget QwtPlot *QwtPlotCanvas::plot() { return qobject_cast( parentWidget() ); } //! Return parent plot widget const QwtPlot *QwtPlotCanvas::plot() const { return qobject_cast( parentWidget() ); } /*! \brief Changing the paint attributes \param attribute Paint attribute \param on On/Off The default setting enables PaintCached and PaintPacked \sa testPaintAttribute(), drawCanvas(), drawContents(), paintCache() */ void QwtPlotCanvas::setPaintAttribute( PaintAttribute attribute, bool on ) { if ( bool( d_data->paintAttributes & attribute ) == on ) return; if ( on ) d_data->paintAttributes |= attribute; else d_data->paintAttributes &= ~attribute; switch ( attribute ) { case PaintCached: { if ( on ) { if ( d_data->cache == NULL ) d_data->cache = new QPixmap(); if ( isVisible() ) { const QRect cr = contentsRect(); *d_data->cache = QPixmap::grabWidget( this, cr.x(), cr.y(), cr.width(), cr.height() ); } } else { delete d_data->cache; d_data->cache = NULL; } break; } case PaintPacked: { /* If not visible, changing of the background mode is delayed until it becomes visible. This tries to avoid looking through the canvas when the canvas is shown the first time. */ if ( on == false || isVisible() ) QwtPlotCanvas::setSystemBackground( !on ); break; } } } /*! Test wether a paint attribute is enabled \param attribute Paint attribute \return true if the attribute is enabled \sa setPaintAttribute() */ bool QwtPlotCanvas::testPaintAttribute( PaintAttribute attribute ) const { return ( d_data->paintAttributes & attribute ) != 0; } //! Return the paint cache, might be null QPixmap *QwtPlotCanvas::paintCache() { return d_data->cache; } //! Return the paint cache, might be null const QPixmap *QwtPlotCanvas::paintCache() const { return d_data->cache; } //! Invalidate the internal paint cache void QwtPlotCanvas::invalidatePaintCache() { if ( d_data->cache ) *d_data->cache = QPixmap(); } /*! Set the focus indicator \sa FocusIndicator, focusIndicator() */ void QwtPlotCanvas::setFocusIndicator( FocusIndicator focusIndicator ) { d_data->focusIndicator = focusIndicator; } /*! \return Focus indicator \sa FocusIndicator, setFocusIndicator() */ QwtPlotCanvas::FocusIndicator QwtPlotCanvas::focusIndicator() const { return d_data->focusIndicator; } /*! Hide event \param event Hide event */ void QwtPlotCanvas::hideEvent( QHideEvent *event ) { QFrame::hideEvent( event ); if ( d_data->paintAttributes & PaintPacked ) { // enable system background to avoid the "looking through // the canvas" effect, for the next show setSystemBackground( true ); } } /*! Paint event \param event Paint event */ void QwtPlotCanvas::paintEvent( QPaintEvent *event ) { QPainter painter( this ); if ( !contentsRect().contains( event->rect() ) ) { painter.save(); painter.setClipRegion( event->region() & frameRect() ); drawFrame( &painter ); painter.restore(); } painter.setClipRegion( event->region() & contentsRect() ); drawContents( &painter ); if ( d_data->paintAttributes & PaintPacked ) setSystemBackground( false ); } /*! Redraw the canvas, and focus rect \param painter Painter */ void QwtPlotCanvas::drawContents( QPainter *painter ) { if ( d_data->paintAttributes & PaintCached && d_data->cache && d_data->cache->size() == contentsRect().size() ) { painter->drawPixmap( contentsRect().topLeft(), *d_data->cache ); } else { QwtPlot *plot = ( ( QwtPlot * )parent() ); const bool doAutoReplot = plot->autoReplot(); plot->setAutoReplot( false ); drawCanvas( painter ); plot->setAutoReplot( doAutoReplot ); } if ( hasFocus() && focusIndicator() == CanvasFocusIndicator ) drawFocusIndicator( painter ); } /*! Draw the the canvas Paints all plot items to the contentsRect(), using QwtPlot::drawCanvas and updates the paint cache. \param painter Painter \sa QwtPlot::drawCanvas(), setPaintAttributes(), testPaintAttributes() */ void QwtPlotCanvas::drawCanvas( QPainter *painter ) { if ( !contentsRect().isValid() ) return; QBrush bgBrush = palette().brush( backgroundRole() ); if ( d_data->paintAttributes & PaintCached && d_data->cache ) { *d_data->cache = QPixmap( contentsRect().size() ); #ifdef Q_WS_X11 if ( d_data->cache->x11Info().screen() != x11Info().screen() ) d_data->cache->x11SetScreen( x11Info().screen() ); #endif if ( d_data->paintAttributes & PaintPacked ) { QPainter bgPainter( d_data->cache ); bgPainter.setPen( Qt::NoPen ); bgPainter.setBrush( bgBrush ); bgPainter.drawRect( d_data->cache->rect() ); } else d_data->cache->fill( this, d_data->cache->rect().topLeft() ); QPainter cachePainter( d_data->cache ); cachePainter.translate( -contentsRect().x(), -contentsRect().y() ); ( ( QwtPlot * )parent() )->drawCanvas( &cachePainter ); cachePainter.end(); painter->drawPixmap( contentsRect(), *d_data->cache ); } else { if ( d_data->paintAttributes & PaintPacked ) { painter->save(); painter->setPen( Qt::NoPen ); painter->setBrush( bgBrush ); painter->drawRect( contentsRect() ); painter->restore(); } ( ( QwtPlot * )parent() )->drawCanvas( painter ); } } /*! Draw the focus indication \param painter Painter */ void QwtPlotCanvas::drawFocusIndicator( QPainter *painter ) { const int margin = 1; QRect focusRect = contentsRect(); focusRect.setRect( focusRect.x() + margin, focusRect.y() + margin, focusRect.width() - 2 * margin, focusRect.height() - 2 * margin ); QwtPainter::drawFocusRect( painter, this, focusRect ); } void QwtPlotCanvas::setSystemBackground( bool on ) { if ( testAttribute( Qt::WA_NoSystemBackground ) == on ) setAttribute( Qt::WA_NoSystemBackground, !on ); } /*! Invalidate the paint cache and repaint the canvas \sa invalidatePaintCache() */ void QwtPlotCanvas::replot() { invalidatePaintCache(); /* In case of cached or packed painting the canvas is repainted completely and doesn't need to be erased. */ const bool erase = !testPaintAttribute( QwtPlotCanvas::PaintPacked ) && !testPaintAttribute( QwtPlotCanvas::PaintCached ); const bool noBackgroundMode = testAttribute( Qt::WA_NoBackground ); if ( !erase && !noBackgroundMode ) setAttribute( Qt::WA_NoBackground, true ); repaint( contentsRect() ); if ( !erase && !noBackgroundMode ) setAttribute( Qt::WA_NoBackground, false ); } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_plot_canvas.h000066400000000000000000000060431320135501600222570ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_CANVAS_H #define QWT_PLOT_CANVAS_H #include "qwt_global.h" #include #include class QwtPlot; class QPixmap; /*! \brief Canvas of a QwtPlot. \sa QwtPlot */ class QWT_EXPORT QwtPlotCanvas : public QFrame { Q_OBJECT public: /*! \brief Paint attributes - PaintCached\n Paint double buffered and reuse the content of the pixmap buffer for some spontaneous repaints that happen when a plot gets unhidden, deiconified or changes the focus. Disabling the cache will improve the performance for incremental paints (using QwtPlotCurve::draw). - PaintPacked\n Suppress system background repaints and paint it together with the canvas contents. Painting packed might avoid flickering for expensive repaints, when there is a notable gap between painting the background and the plot contents. The default setting enables PaintCached and PaintPacked \sa setPaintAttribute(), testPaintAttribute(), paintCache() */ enum PaintAttribute { PaintCached = 1, PaintPacked = 2 }; /*! \brief Focus indicator - NoFocusIndicator\n Don't paint a focus indicator - CanvasFocusIndicator\n The focus is related to the complete canvas. Paint the focus indicator using paintFocus() - ItemFocusIndicator\n The focus is related to an item (curve, point, ...) on the canvas. It is up to the application to display a focus indication using f.e. highlighting. \sa setFocusIndicator(), focusIndicator(), paintFocus() */ enum FocusIndicator { NoFocusIndicator, CanvasFocusIndicator, ItemFocusIndicator }; explicit QwtPlotCanvas( QwtPlot * ); virtual ~QwtPlotCanvas(); QwtPlot *plot(); const QwtPlot *plot() const; void setFocusIndicator( FocusIndicator ); FocusIndicator focusIndicator() const; void setPaintAttribute( PaintAttribute, bool on = true ); bool testPaintAttribute( PaintAttribute ) const; QPixmap *paintCache(); const QPixmap *paintCache() const; void invalidatePaintCache(); void replot(); protected: virtual void hideEvent( QHideEvent * ); virtual void paintEvent( QPaintEvent * ); virtual void drawContents( QPainter * ); virtual void drawFocusIndicator( QPainter * ); void drawCanvas( QPainter *painter = NULL ); private: void setSystemBackground( bool ); class PrivateData; PrivateData *d_data; }; #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_plot_curve.cpp000066400000000000000000000712461320135501600224720ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_curve.h" #include "qwt_math.h" #include "qwt_clipper.h" #include "qwt_painter.h" #include "qwt_legend.h" #include "qwt_legend_item.h" #include "qwt_scale_map.h" #include "qwt_plot.h" #include "qwt_plot_canvas.h" #include "qwt_curve_fitter.h" #include "qwt_symbol.h" #include #include #include #include static int verifyRange( int size, int &i1, int &i2 ) { if ( size < 1 ) return 0; i1 = qwtLim( i1, 0, size - 1 ); i2 = qwtLim( i2, 0, size - 1 ); if ( i1 > i2 ) qSwap( i1, i2 ); return ( i2 - i1 + 1 ); } class QwtPlotCurve::PrivateData { public: PrivateData(): style( QwtPlotCurve::Lines ), baseline( 0.0 ), symbol( NULL ), attributes( 0 ), paintAttributes( QwtPlotCurve::ClipPolygons ), legendAttributes( 0 ) { pen = QPen( Qt::black ); curveFitter = new QwtSplineCurveFitter; } ~PrivateData() { delete symbol; delete curveFitter; } QwtPlotCurve::CurveStyle style; double baseline; const QwtSymbol *symbol; QwtCurveFitter *curveFitter; QPen pen; QBrush brush; int attributes; int paintAttributes; int legendAttributes; }; /*! Constructor \param title Title of the curve */ QwtPlotCurve::QwtPlotCurve( const QwtText &title ): QwtPlotSeriesItem( title ) { init(); } /*! Constructor \param title Title of the curve */ QwtPlotCurve::QwtPlotCurve( const QString &title ): QwtPlotSeriesItem( QwtText( title ) ) { init(); } //! Destructor QwtPlotCurve::~QwtPlotCurve() { delete d_data; } //! Initialize internal members void QwtPlotCurve::init() { setItemAttribute( QwtPlotItem::Legend ); setItemAttribute( QwtPlotItem::AutoScale ); d_data = new PrivateData; d_series = new QwtPointSeriesData(); setZ( 20.0 ); } //! \return QwtPlotItem::Rtti_PlotCurve int QwtPlotCurve::rtti() const { return QwtPlotItem::Rtti_PlotCurve; } /*! Specify an attribute how to draw the curve \param attribute Paint attribute \param on On/Off /sa PaintAttribute, testPaintAttribute() */ void QwtPlotCurve::setPaintAttribute( PaintAttribute attribute, bool on ) { if ( on ) d_data->paintAttributes |= attribute; else d_data->paintAttributes &= ~attribute; } /*! \brief Return the current paint attributes \sa PaintAttribute, setPaintAttribute() */ bool QwtPlotCurve::testPaintAttribute( PaintAttribute attribute ) const { return ( d_data->paintAttributes & attribute ); } /*! Specify an attribute how to draw the legend identifier \param attribute Attribute \param on On/Off /sa LegendAttribute, testLegendAttribute() */ void QwtPlotCurve::setLegendAttribute( LegendAttribute attribute, bool on ) { if ( on ) d_data->legendAttributes |= attribute; else d_data->legendAttributes &= ~attribute; } /*! \brief Return the current paint attributes \sa LegendAttribute, setLegendAttribute() */ bool QwtPlotCurve::testLegendAttribute( LegendAttribute attribute ) const { return ( d_data->legendAttributes & attribute ); } /*! Set the curve's drawing style \param style Curve style \sa CurveStyle, style() */ void QwtPlotCurve::setStyle( CurveStyle style ) { if ( style != d_data->style ) { d_data->style = style; itemChanged(); } } /*! Return the current style \sa CurveStyle, setStyle() */ QwtPlotCurve::CurveStyle QwtPlotCurve::style() const { return d_data->style; } /*! Assign a symbol \param symbol Symbol \sa symbol() */ void QwtPlotCurve::setSymbol( const QwtSymbol *symbol ) { if ( symbol != d_data->symbol ) { delete d_data->symbol; d_data->symbol = symbol; itemChanged(); } } /*! \return Current symbol or NULL, when no symbol has been assigned \sa setSymbol() */ const QwtSymbol *QwtPlotCurve::symbol() const { return d_data->symbol; } /*! Assign a pen \param pen New pen \sa pen(), brush() */ void QwtPlotCurve::setPen( const QPen &pen ) { if ( pen != d_data->pen ) { d_data->pen = pen; itemChanged(); } } /*! \return Pen used to draw the lines \sa setPen(), brush() */ const QPen& QwtPlotCurve::pen() const { return d_data->pen; } /*! \brief Assign a brush. In case of brush.style() != QBrush::NoBrush and style() != QwtPlotCurve::Sticks the area between the curve and the baseline will be filled. In case !brush.color().isValid() the area will be filled by pen.color(). The fill algorithm simply connects the first and the last curve point to the baseline. So the curve data has to be sorted (ascending or descending). \param brush New brush \sa brush(), setBaseline(), baseline() */ void QwtPlotCurve::setBrush( const QBrush &brush ) { if ( brush != d_data->brush ) { d_data->brush = brush; itemChanged(); } } /*! \return Brush used to fill the area between lines and the baseline \sa setBrush(), setBaseline(), baseline() */ const QBrush& QwtPlotCurve::brush() const { return d_data->brush; } /*! Draw an interval of the curve \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rect of the canvas \param from Index of the first point to be painted \param to Index of the last point to be painted. If to < 0 the curve will be painted to its last point. \sa drawCurve(), drawSymbols(), */ void QwtPlotCurve::drawSeries( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { if ( !painter || dataSize() <= 0 ) return; if ( to < 0 ) to = dataSize() - 1; if ( verifyRange( dataSize(), from, to ) > 0 ) { painter->save(); painter->setPen( d_data->pen ); /* Qt 4.0.0 is slow when drawing lines, but it's even slower when the painter has a brush. So we don't set the brush before we really need it. */ drawCurve( painter, d_data->style, xMap, yMap, canvasRect, from, to ); painter->restore(); if ( d_data->symbol && ( d_data->symbol->style() != QwtSymbol::NoSymbol ) ) { painter->save(); drawSymbols( painter, *d_data->symbol, xMap, yMap, canvasRect, from, to ); painter->restore(); } } } /*! \brief Draw the line part (without symbols) of a curve interval. \param painter Painter \param style curve style, see QwtPlotCurve::CurveStyle \param xMap x map \param yMap y map \param canvasRect Contents rect of the canvas \param from index of the first point to be painted \param to index of the last point to be painted \sa draw(), drawDots(), drawLines(), drawSteps(), drawSticks() */ void QwtPlotCurve::drawCurve( QPainter *painter, int style, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { switch ( style ) { case Lines: if ( testCurveAttribute( Fitted ) ) { // we always need the complete // curve for fitting from = 0; to = dataSize() - 1; } drawLines( painter, xMap, yMap, canvasRect, from, to ); break; case Sticks: drawSticks( painter, xMap, yMap, canvasRect, from, to ); break; case Steps: drawSteps( painter, xMap, yMap, canvasRect, from, to ); break; case Dots: drawDots( painter, xMap, yMap, canvasRect, from, to ); break; case NoCurve: default: break; } } /*! \brief Draw lines If the CurveAttribute Fitted is enabled a QwtCurveFitter tries to interpolate/smooth the curve, before it is painted. \param painter Painter \param xMap x map \param yMap y map \param canvasRect Contents rect of the canvas \param from index of the first point to be painted \param to index of the last point to be painted \sa setCurveAttribute(), setCurveFitter(), draw(), drawLines(), drawDots(), drawSteps(), drawSticks() */ void QwtPlotCurve::drawLines( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { int size = to - from + 1; if ( size <= 0 ) return; const bool doAlign = QwtPainter::roundingAlignment( painter ); QPolygonF polyline( size ); QPointF *points = polyline.data(); for ( int i = from; i <= to; i++ ) { const QPointF sample = d_series->sample( i ); double x = xMap.transform( sample.x() ); double y = yMap.transform( sample.y() ); if ( doAlign ) { x = qRound( x ); y = qRound( y ); } points[i - from].rx() = x; points[i - from].ry() = y; } if ( ( d_data->attributes & Fitted ) && d_data->curveFitter ) polyline = d_data->curveFitter->fitCurve( polyline ); if ( d_data->paintAttributes & ClipPolygons ) { qreal pw = qMax( qreal( 1.0 ), painter->pen().widthF()); polyline = QwtClipper::clipPolygonF( canvasRect.adjusted(-pw, -pw, pw, pw), polyline ); } QwtPainter::drawPolyline( painter, polyline ); if ( d_data->brush.style() != Qt::NoBrush ) fillCurve( painter, xMap, yMap, polyline ); } /*! Draw sticks \param painter Painter \param xMap x map \param yMap y map \param canvasRect Contents rect of the canvas \param from index of the first point to be painted \param to index of the last point to be painted \sa draw(), drawCurve(), drawDots(), drawLines(), drawSteps() */ void QwtPlotCurve::drawSticks( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &, int from, int to ) const { painter->save(); painter->setRenderHint( QPainter::Antialiasing, false ); const bool doAlign = QwtPainter::roundingAlignment( painter ); double x0 = xMap.transform( d_data->baseline ); double y0 = yMap.transform( d_data->baseline ); if ( doAlign ) { x0 = qRound( x0 ); y0 = qRound( y0 ); } const Qt::Orientation o = orientation(); for ( int i = from; i <= to; i++ ) { const QPointF sample = d_series->sample( i ); double xi = xMap.transform( sample.x() ); double yi = yMap.transform( sample.y() ); if ( doAlign ) { xi = qRound( xi ); yi = qRound( yi ); } if ( o == Qt::Horizontal ) QwtPainter::drawLine( painter, x0, yi, xi, yi ); else QwtPainter::drawLine( painter, xi, y0, xi, yi ); } painter->restore(); } /*! Draw dots \param painter Painter \param xMap x map \param yMap y map \param canvasRect Contents rect of the canvas \param from index of the first point to be painted \param to index of the last point to be painted \sa draw(), drawCurve(), drawSticks(), drawLines(), drawSteps() */ void QwtPlotCurve::drawDots( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { const bool doFill = d_data->brush.style() != Qt::NoBrush; const bool doAlign = QwtPainter::roundingAlignment( painter ); QPolygonF polyline; if ( doFill ) polyline.resize( to - from + 1 ); QPointF *points = polyline.data(); for ( int i = from; i <= to; i++ ) { const QPointF sample = d_series->sample( i ); double xi = xMap.transform( sample.x() ); double yi = yMap.transform( sample.y() ); if ( doAlign ) { xi = qRound( xi ); yi = qRound( yi ); } QwtPainter::drawPoint( painter, QPointF( xi, yi ) ); if ( doFill ) { points[i - from].rx() = xi; points[i - from].ry() = yi; } } if ( doFill ) { if ( d_data->paintAttributes & ClipPolygons ) polyline = QwtClipper::clipPolygonF( canvasRect, polyline ); fillCurve( painter, xMap, yMap, polyline ); } } /*! Draw step function The direction of the steps depends on Inverted attribute. \param painter Painter \param xMap x map \param yMap y map \param canvasRect Contents rect of the canvas \param from index of the first point to be painted \param to index of the last point to be painted \sa CurveAttribute, setCurveAttribute(), draw(), drawCurve(), drawDots(), drawLines(), drawSticks() */ void QwtPlotCurve::drawSteps( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { const bool doAlign = QwtPainter::roundingAlignment( painter ); QPolygonF polygon( 2 * ( to - from ) + 1 ); QPointF *points = polygon.data(); bool inverted = orientation() == Qt::Vertical; if ( d_data->attributes & Inverted ) inverted = !inverted; int i, ip; for ( i = from, ip = 0; i <= to; i++, ip += 2 ) { const QPointF sample = d_series->sample( i ); double xi = xMap.transform( sample.x() ); double yi = yMap.transform( sample.y() ); if ( doAlign ) { xi = qRound( xi ); yi = qRound( yi ); } if ( ip > 0 ) { const QPointF &p0 = points[ip - 2]; QPointF &p = points[ip - 1]; if ( inverted ) { p.rx() = p0.x(); p.ry() = yi; } else { p.rx() = xi; p.ry() = p0.y(); } } points[ip].rx() = xi; points[ip].ry() = yi; } if ( d_data->paintAttributes & ClipPolygons ) polygon = QwtClipper::clipPolygonF( canvasRect, polygon ); QwtPainter::drawPolyline( painter, polygon ); if ( d_data->brush.style() != Qt::NoBrush ) fillCurve( painter, xMap, yMap, polygon ); } /*! Specify an attribute for drawing the curve \param attribute Curve attribute \param on On/Off /sa CurveAttribute, testCurveAttribute(), setCurveFitter() */ void QwtPlotCurve::setCurveAttribute( CurveAttribute attribute, bool on ) { if ( bool( d_data->attributes & attribute ) == on ) return; if ( on ) d_data->attributes |= attribute; else d_data->attributes &= ~attribute; itemChanged(); } /*! \return true, if attribute is enabled \sa CurveAttribute, setCurveAttribute() */ bool QwtPlotCurve::testCurveAttribute( CurveAttribute attribute ) const { return d_data->attributes & attribute; } /*! Assign a curve fitter The curve fitter "smooths" the curve points, when the Fitted CurveAttribute is set. setCurveFitter(NULL) also disables curve fitting. The curve fitter operates on the translated points ( = widget coordinates) to be functional for logarithmic scales. Obviously this is less performant for fitting algorithms, that reduce the number of points. For situations, where curve fitting is used to improve the performance of painting huge series of points it might be better to execute the fitter on the curve points once and to cache the result in the QwtSeriesData object. \param curveFitter() Curve fitter \sa Fitted */ void QwtPlotCurve::setCurveFitter( QwtCurveFitter *curveFitter ) { delete d_data->curveFitter; d_data->curveFitter = curveFitter; itemChanged(); } /*! Get the curve fitter. If curve fitting is disabled NULL is returned. \return Curve fitter \sa setCurveFitter(), Fitted */ QwtCurveFitter *QwtPlotCurve::curveFitter() const { return d_data->curveFitter; } /*! Fill the area between the curve and the baseline with the curve brush \param painter Painter \param xMap x map \param yMap y map \param polygon Polygon \sa setBrush(), setBaseline(), setCurveType() */ void QwtPlotCurve::fillCurve( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, QPolygonF &polygon ) const { if ( d_data->brush.style() == Qt::NoBrush ) return; closePolyline( painter, xMap, yMap, polygon ); if ( polygon.count() <= 2 ) // a line can't be filled return; QBrush b = d_data->brush; if ( !b.color().isValid() ) b.setColor( d_data->pen.color() ); painter->save(); painter->setPen( QPen( Qt::NoPen ) ); painter->setBrush( b ); QwtPainter::drawPolygon( painter, polygon ); painter->restore(); } /*! \brief Complete a polygon to be a closed polygon including the area between the original polygon and the baseline. \param painter Painter \param xMap X map \param yMap Y map \param polygon Polygon to be completed */ void QwtPlotCurve::closePolyline( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, QPolygonF &polygon ) const { if ( polygon.size() < 2 ) return; const bool doAlign = QwtPainter::roundingAlignment( painter ); double baseline = d_data->baseline; if ( orientation() == Qt::Vertical ) { if ( yMap.transformation()->type() == QwtScaleTransformation::Log10 ) { if ( baseline < QwtScaleMap::LogMin ) baseline = QwtScaleMap::LogMin; } double refY = yMap.transform( baseline ); if ( doAlign ) refY = qRound( refY ); polygon += QPointF( polygon.last().x(), refY ); polygon += QPointF( polygon.first().x(), refY ); } else { if ( xMap.transformation()->type() == QwtScaleTransformation::Log10 ) { if ( baseline < QwtScaleMap::LogMin ) baseline = QwtScaleMap::LogMin; } double refX = xMap.transform( baseline ); if ( doAlign ) refX = qRound( refX ); polygon += QPointF( refX, polygon.last().y() ); polygon += QPointF( refX, polygon.first().y() ); } } /*! Draw symbols \param painter Painter \param symbol Curve symbol \param xMap x map \param yMap y map \param canvasRect Contents rect of the canvas \param from Index of the first point to be painted \param to Index of the last point to be painted \sa setSymbol(), drawSeries(), drawCurve() */ void QwtPlotCurve::drawSymbols( QPainter *painter, const QwtSymbol &symbol, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { const bool doAlign = QwtPainter::roundingAlignment( painter ); bool usePixmap = testPaintAttribute( CacheSymbols ); if ( usePixmap && !doAlign ) { // Don't use the pixmap, when the paint device // could generate scalable vectors usePixmap = false; } if ( usePixmap ) { QPixmap pm( symbol.boundingSize() ); pm.fill( Qt::transparent ); const double pw2 = 0.5 * pm.width(); const double ph2 = 0.5 * pm.height(); QPainter p( &pm ); p.setRenderHints( painter->renderHints() ); symbol.drawSymbol( &p, QPointF( pw2, ph2 ) ); p.end(); for ( int i = from; i <= to; i++ ) { const QPointF sample = d_series->sample( i ); double xi = xMap.transform( sample.x() ); double yi = yMap.transform( sample.y() ); if ( doAlign ) { xi = qRound( xi ); yi = qRound( yi ); } if ( canvasRect.contains( xi, yi ) ) { const int left = qCeil( xi ) - pw2; const int top = qCeil( yi ) - ph2; painter->drawPixmap( left, top, pm ); } } } else { const int chunkSize = 500; for ( int i = from; i <= to; i += chunkSize ) { const int n = qMin( chunkSize, to - i + 1 ); QPolygonF points; for ( int j = 0; j < n; j++ ) { const QPointF sample = d_series->sample( i + j ); const double xi = xMap.transform( sample.x() ); const double yi = yMap.transform( sample.y() ); if ( canvasRect.contains( xi, yi ) ) points += QPointF( xi, yi ); } if ( points.size() > 0 ) symbol.drawSymbols( painter, points ); } } } /*! \brief Set the value of the baseline The baseline is needed for filling the curve with a brush or the Sticks drawing style. The interpretation of the baseline depends on the CurveType. With QwtPlotCurve::Yfx, the baseline is interpreted as a horizontal line at y = baseline(), with QwtPlotCurve::Yfy, it is interpreted as a vertical line at x = baseline(). The default value is 0.0. \param value Value of the baseline \sa baseline(), setBrush(), setStyle(), setCurveType() */ void QwtPlotCurve::setBaseline( double value ) { if ( d_data->baseline != value ) { d_data->baseline = value; itemChanged(); } } /*! \return the value of the baseline \sa setBaseline() */ double QwtPlotCurve::baseline() const { return d_data->baseline; } /*! Find the closest curve point for a specific position \param pos Position, where to look for the closest curve point \param dist If dist != NULL, closestPoint() returns the distance between the position and the clostest curve point \return Index of the closest curve point, or -1 if none can be found ( f.e when the curve has no points ) \note closestPoint() implements a dumb algorithm, that iterates over all points */ int QwtPlotCurve::closestPoint( const QPoint &pos, double *dist ) const { if ( plot() == NULL || dataSize() <= 0 ) return -1; const QwtScaleMap xMap = plot()->canvasMap( xAxis() ); const QwtScaleMap yMap = plot()->canvasMap( yAxis() ); int index = -1; double dmin = 1.0e10; for ( uint i = 0; i < dataSize(); i++ ) { const QPointF sample = d_series->sample( i ); const double cx = xMap.transform( sample.x() ) - pos.x(); const double cy = yMap.transform( sample.y() ) - pos.y(); const double f = qwtSqr( cx ) + qwtSqr( cy ); if ( f < dmin ) { index = i; dmin = f; } } if ( dist ) *dist = qSqrt( dmin ); return index; } /*! \brief Update the widget that represents the item on the legend \param legend Legend \sa drawLegendIdentifier(), legendItem(), itemChanged(), QwtLegend() */ void QwtPlotCurve::updateLegend( QwtLegend *legend ) const { if ( legend && testItemAttribute( QwtPlotItem::Legend ) && ( d_data->legendAttributes & QwtPlotCurve::LegendShowSymbol ) && d_data->symbol && d_data->symbol->style() != QwtSymbol::NoSymbol ) { QWidget *lgdItem = legend->find( this ); if ( lgdItem == NULL ) { lgdItem = legendItem(); if ( lgdItem ) legend->insert( this, lgdItem ); } if ( lgdItem && lgdItem->inherits( "QwtLegendItem" ) ) { QwtLegendItem *l = ( QwtLegendItem * )lgdItem; l->setIdentifierSize( d_data->symbol->boundingSize() ); } } QwtPlotItem::updateLegend( legend ); } /*! \brief Draw the identifier representing the curve on the legend \param painter Üainter \param rect Bounding rectangle for the identifier \sa setLegendAttribute */ void QwtPlotCurve::drawLegendIdentifier( QPainter *painter, const QRectF &rect ) const { if ( rect.isEmpty() ) return; const int dim = qMin( rect.width(), rect.height() ); QSize size( dim, dim ); QRectF r( 0, 0, size.width(), size.height() ); r.moveCenter( rect.center() ); if ( d_data->legendAttributes == 0 ) { QBrush brush = d_data->brush; if ( brush.style() == Qt::NoBrush ) { if ( style() != QwtPlotCurve::NoCurve ) brush = QBrush( pen().color() ); else if ( d_data->symbol && ( d_data->symbol->style() != QwtSymbol::NoSymbol ) ) { brush = QBrush( d_data->symbol->pen().color() ); } } if ( brush.style() != Qt::NoBrush ) painter->fillRect( r, brush ); } if ( d_data->legendAttributes & QwtPlotCurve::LegendShowBrush ) { if ( d_data->brush.style() != Qt::NoBrush ) painter->fillRect( r, d_data->brush ); } if ( d_data->legendAttributes & QwtPlotCurve::LegendShowLine ) { if ( pen() != Qt::NoPen ) { painter->setPen( pen() ); QwtPainter::drawLine( painter, rect.left(), rect.center().y(), rect.right() - 1.0, rect.center().y() ); } } if ( d_data->legendAttributes & QwtPlotCurve::LegendShowSymbol ) { if ( d_data->symbol && ( d_data->symbol->style() != QwtSymbol::NoSymbol ) ) { QSize symbolSize = d_data->symbol->boundingSize(); symbolSize -= QSize( 2, 2 ); // scale the symbol size down if it doesn't fit into rect. double xRatio = 1.0; if ( rect.width() < symbolSize.width() ) xRatio = rect.width() / symbolSize.width(); double yRatio = 1.0; if ( rect.height() < symbolSize.height() ) yRatio = rect.height() / symbolSize.height(); const double ratio = qMin( xRatio, yRatio ); painter->save(); painter->scale( ratio, ratio ); d_data->symbol->drawSymbol( painter, rect.center() / ratio ); painter->restore(); } } } /*! Initialize data with an array of points (explicitly shared). \param samples Vector of points */ void QwtPlotCurve::setSamples( const QVector &samples ) { delete d_series; d_series = new QwtPointSeriesData( samples ); itemChanged(); } #ifndef QWT_NO_COMPAT /*! \brief Initialize the data by pointing to memory blocks which are not managed by QwtPlotCurve. setRawSamples is provided for efficiency. It is important to keep the pointers during the lifetime of the underlying QwtCPointerData class. \param xData pointer to x data \param yData pointer to y data \param size size of x and y \sa QwtCPointerData::setSamples() */ void QwtPlotCurve::setRawSamples( const double *xData, const double *yData, int size ) { delete d_series; d_series = new QwtCPointerData( xData, yData, size ); itemChanged(); } /*! Set data by copying x- and y-values from specified memory blocks. Contrary to setRawSamples(), this function makes a 'deep copy' of the data. \param xData pointer to x values \param yData pointer to y values \param size size of xData and yData \sa QwtCPointerData */ void QwtPlotCurve::setSamples( const double *xData, const double *yData, int size ) { delete d_series; d_series = new QwtPointArrayData( xData, yData, size ); itemChanged(); } /*! \brief Initialize data with x- and y-arrays (explicitly shared) \param xData x data \param yData y data \sa QwtArrayData */ void QwtPlotCurve::setSamples( const QVector &xData, const QVector &yData ) { delete d_series; d_series = new QwtPointArrayData( xData, yData ); itemChanged(); } #endif // !QWT_NO_COMPAT starpu-1.2.3+dfsg/starpu-top/qwt/qwt_plot_curve.h000066400000000000000000000220271320135501600221300ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_CURVE_H #define QWT_PLOT_CURVE_H #include "qwt_global.h" #include "qwt_plot_seriesitem.h" #include "qwt_series_data.h" #include "qwt_text.h" #include #include class QPainter; class QPolygonF; class QwtScaleMap; class QwtSymbol; class QwtCurveFitter; /*! \brief A plot item, that represents a series of points A curve is the representation of a series of points in the x-y plane. It supports different display styles, interpolation ( f.e. spline ) and symbols. \par Usage
    a) Assign curve properties
    When a curve is created, it is configured to draw black solid lines with in Lines style and no symbols. You can change this by calling setPen(), setStyle() and setSymbol().
    b) Connect/Assign data.
    QwtPlotCurve gets its points using a QwtData object offering a bridge to the real storage of the points ( like QAbstractItemModel ). There are several convenience classes derived from QwtData, that also store the points inside ( like QStandardItemModel ). QwtPlotCurve also offers a couple of variations of setData(), that build QwtData objects from arrays internally.
    c) Attach the curve to a plot
    See QwtPlotItem::attach()
    \par Example: see examples/bode \sa QwtPointSeriesData, QwtSymbol, QwtScaleMap */ class QWT_EXPORT QwtPlotCurve: public QwtPlotSeriesItem { public: /*! Curve styles. - NoCurve\n Don't draw a curve. Note: This doesn't affect the symbols. - Lines\n Connect the points with straight lines. The lines might be interpolated depending on the 'Fitted' attribute. Curve fitting can be configured using setCurveFitter(). - Sticks\n Draw vertical or horizontal sticks ( depending on the orientation() ) from a baseline which is defined by setBaseline(). - Steps\n Connect the points with a step function. The step function is drawn from the left to the right or vice versa, depending on the 'Inverted' attribute. - Dots\n Draw dots at the locations of the data points. Note: This is different from a dotted line (see setPen()), and faster as a curve in NoStyle style and a symbol painting a point. - UserCurve\n Styles >= UserCurve are reserved for derived classes of QwtPlotCurve that overload drawCurve() with additional application specific curve types. \sa setStyle(), style() */ enum CurveStyle { NoCurve, Lines, Sticks, Steps, Dots, UserCurve = 100 }; /*! Attribute for drawing the curve - Fitted ( in combination with the Lines QwtPlotCurve::CurveStyle only )\n A QwtCurveFitter tries to interpolate/smooth the curve, before it is painted. Note that curve fitting requires temorary memory for calculating coefficients and additional points. If painting in Fitted mode is slow it might be better to fit the points, before they are passed to QwtPlotCurve. - Inverted\n For Steps only. Draws a step function from the right to the left. \sa setCurveAttribute(), testCurveAttribute(), curveFitter() */ enum CurveAttribute { Inverted = 1, Fitted = 2 }; /*! Attributes how to represent the curve on the legend - LegendShowLine If the curveStyle() is not NoCurve a line is painted with the curvePen(). - LegendShowSymbol If the curve has a valid symbol it is painted. - LegendShowBrush If the curve has a brush a rectangle filled with this brush is painted If none of the flags is activated QwtPlotCurve tries to find a color representing the curve and paints a rectangle with it. In the default setting all attributes are off. \sa setLegendAttribute(), testLegendAttribute(), drawLegendIdentifier() */ enum LegendAttribute { LegendShowLine = 1, LegendShowSymbol = 2, LegendShowBrush = 4 }; /*! Attributes to modify the drawing algorithm. - ClipPolygons\n Clip polygons before painting them. In situations, where points are far outside the visible area (f.e when zooming deep) this might be a substantial improvement for the painting performance ( especially on Windows ). - CacheSymbols\n Paint the symbol to a QPixmap and paint the pixmap instead rendering the symbol for each point. The flag has no effect, when the curve is not painted to the canvas ( or its cache ) The default setting enables ClipPolygons \sa setPaintAttribute(), testPaintAttribute() */ enum PaintAttribute { ClipPolygons = 1, CacheSymbols = 2 }; explicit QwtPlotCurve( const QString &title = QString::null ); explicit QwtPlotCurve( const QwtText &title ); virtual ~QwtPlotCurve(); virtual int rtti() const; void setPaintAttribute( PaintAttribute, bool on = true ); bool testPaintAttribute( PaintAttribute ) const; void setLegendAttribute( LegendAttribute, bool on = true ); bool testLegendAttribute( LegendAttribute ) const; #ifndef QWT_NO_COMPAT void setRawSamples( const double *xData, const double *yData, int size ); void setSamples( const double *xData, const double *yData, int size ); void setSamples( const QVector &xData, const QVector &yData ); #endif void setSamples( const QVector & ); int closestPoint( const QPoint &pos, double *dist = NULL ) const; double minXValue() const; double maxXValue() const; double minYValue() const; double maxYValue() const; void setCurveAttribute( CurveAttribute, bool on = true ); bool testCurveAttribute( CurveAttribute ) const; void setPen( const QPen & ); const QPen &pen() const; void setBrush( const QBrush & ); const QBrush &brush() const; void setBaseline( double ref ); double baseline() const; void setStyle( CurveStyle style ); CurveStyle style() const; void setSymbol( const QwtSymbol *s ); const QwtSymbol *symbol() const; void setCurveFitter( QwtCurveFitter * ); QwtCurveFitter *curveFitter() const; virtual void drawSeries( QPainter *, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual void updateLegend( QwtLegend * ) const; virtual void drawLegendIdentifier( QPainter *, const QRectF & ) const; protected: void init(); virtual void drawCurve( QPainter *p, int style, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual void drawSymbols( QPainter *p, const QwtSymbol &, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; void drawLines( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; void drawSticks( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; void drawDots( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; void drawSteps( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual void fillCurve( QPainter *, const QwtScaleMap &, const QwtScaleMap &, QPolygonF & ) const; void closePolyline( QPainter *, const QwtScaleMap &, const QwtScaleMap &, QPolygonF & ) const; private: class PrivateData; PrivateData *d_data; }; //! boundingRect().left() inline double QwtPlotCurve::minXValue() const { return boundingRect().left(); } //! boundingRect().right() inline double QwtPlotCurve::maxXValue() const { return boundingRect().right(); } //! boundingRect().top() inline double QwtPlotCurve::minYValue() const { return boundingRect().top(); } //! boundingRect().bottom() inline double QwtPlotCurve::maxYValue() const { return boundingRect().bottom(); } #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_plot_dict.cpp000066400000000000000000000112131320135501600222550ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_dict.h" class QwtPlotDict::PrivateData { public: class ItemList: public QList { public: void insertItem( QwtPlotItem *item ) { if ( item == NULL ) return; QList::iterator it = qUpperBound( begin(), end(), item, LessZThan() ); insert( it, item ); } void removeItem( QwtPlotItem *item ) { if ( item == NULL ) return; QList::iterator it = qLowerBound( begin(), end(), item, LessZThan() ); for ( ; it != end(); ++it ) { if ( item == *it ) { erase( it ); break; } } } private: class LessZThan { public: inline bool operator()( const QwtPlotItem *item1, const QwtPlotItem *item2 ) const { return item1->z() < item2->z(); } }; }; ItemList itemList; bool autoDelete; }; /*! Constructor Auto deletion is enabled. \sa setAutoDelete(), attachItem() */ QwtPlotDict::QwtPlotDict() { d_data = new QwtPlotDict::PrivateData; d_data->autoDelete = true; } /*! Destructor If autoDelete is on, all attached items will be deleted \sa setAutoDelete(), autoDelete(), attachItem() */ QwtPlotDict::~QwtPlotDict() { detachItems( QwtPlotItem::Rtti_PlotItem, d_data->autoDelete ); delete d_data; } /*! En/Disable Auto deletion If Auto deletion is on all attached plot items will be deleted in the destructor of QwtPlotDict. The default value is on. \sa autoDelete(), attachItem() */ void QwtPlotDict::setAutoDelete( bool autoDelete ) { d_data->autoDelete = autoDelete; } /*! \return true if auto deletion is enabled \sa setAutoDelete(), attachItem() */ bool QwtPlotDict::autoDelete() const { return d_data->autoDelete; } /*! Attach/Detach a plot item Attached items will be deleted in the destructor, if auto deletion is enabled (default). Manually detached items are not deleted. \param item Plot item to attach/detach \ on If true attach, else detach the item \sa setAutoDelete(), ~QwtPlotDict() */ void QwtPlotDict::attachItem( QwtPlotItem *item, bool on ) { if ( on ) d_data->itemList.insertItem( item ); else d_data->itemList.removeItem( item ); } /*! Detach items from the dictionary \param rtti In case of QwtPlotItem::Rtti_PlotItem detach all items otherwise only those items of the type rtti. \param autoDelete If true, delete all detached items */ void QwtPlotDict::detachItems( int rtti, bool autoDelete ) { PrivateData::ItemList list = d_data->itemList; QwtPlotItemIterator it = list.begin(); while ( it != list.end() ) { QwtPlotItem *item = *it; ++it; // increment before removing item from the list if ( rtti == QwtPlotItem::Rtti_PlotItem || item->rtti() == rtti ) { item->attach( NULL ); if ( autoDelete ) delete item; } } } /*! \brief A QwtPlotItemList of all attached plot items. Use caution when iterating these lists, as removing/detaching an item will invalidate the iterator. Instead you can place pointers to objects to be removed in a removal list, and traverse that list later. \return List of all attached plot items. */ const QwtPlotItemList &QwtPlotDict::itemList() const { return d_data->itemList; } /*! \return List of all attached plot items of a specific type. \sa QwtPlotItem::rtti() */ QwtPlotItemList QwtPlotDict::itemList( int rtti ) const { if ( rtti == QwtPlotItem::Rtti_PlotItem ) return d_data->itemList; QwtPlotItemList items; PrivateData::ItemList list = d_data->itemList; for ( QwtPlotItemIterator it = list.begin(); it != list.end(); ++it ) { QwtPlotItem *item = *it; if ( item->rtti() == rtti ) items += item; } return items; } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_plot_dict.h000066400000000000000000000030341320135501600217240ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ /*! \file !*/ #ifndef QWT_PLOT_DICT #define QWT_PLOT_DICT #include "qwt_global.h" #include "qwt_plot_item.h" #include /// \var typedef QList< QwtPlotItem *> QwtPlotItemList /// \brief See QT 4.x assistant documentation for QList typedef QList QwtPlotItemList; typedef QList::ConstIterator QwtPlotItemIterator; /*! \brief A dictionary for plot items QwtPlotDict organizes plot items in increasing z-order. If autoDelete() is enabled, all attached items will be deleted in the destructor of the dictionary. \sa QwtPlotItem::attach(), QwtPlotItem::detach(), QwtPlotItem::z() */ class QWT_EXPORT QwtPlotDict { public: explicit QwtPlotDict(); virtual ~QwtPlotDict(); void setAutoDelete( bool ); bool autoDelete() const; const QwtPlotItemList& itemList() const; QwtPlotItemList itemList( int rtti ) const; void detachItems( int rtti = QwtPlotItem::Rtti_PlotItem, bool autoDelete = true ); private: friend class QwtPlotItem; void attachItem( QwtPlotItem *, bool ); class PrivateData; PrivateData *d_data; }; #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_plot_item.cpp000066400000000000000000000271751320135501600223060ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_item.h" #include "qwt_text.h" #include "qwt_plot.h" #include "qwt_legend.h" #include "qwt_legend_item.h" #include class QwtPlotItem::PrivateData { public: PrivateData(): plot( NULL ), isVisible( true ), attributes( 0 ), renderHints( 0 ), z( 0.0 ), xAxis( QwtPlot::xBottom ), yAxis( QwtPlot::yLeft ) { } mutable QwtPlot *plot; bool isVisible; int attributes; int renderHints; double z; int xAxis; int yAxis; QwtText title; }; /*! Constructor \param title Title of the item */ QwtPlotItem::QwtPlotItem( const QwtText &title ) { d_data = new PrivateData; d_data->title = title; } //! Destroy the QwtPlotItem QwtPlotItem::~QwtPlotItem() { attach( NULL ); delete d_data; } /*! \brief Attach the item to a plot. This method will attach a QwtPlotItem to the QwtPlot argument. It will first detach the QwtPlotItem from any plot from a previous call to attach (if necessary). If a NULL argument is passed, it will detach from any QwtPlot it was attached to. \param plot Plot widget \sa detach() */ void QwtPlotItem::attach( QwtPlot *plot ) { if ( plot == d_data->plot ) return; // remove the item from the previous plot if ( d_data->plot ) { if ( d_data->plot->legend() ) d_data->plot->legend()->remove( this ); d_data->plot->attachItem( this, false ); if ( d_data->plot->autoReplot() ) d_data->plot->update(); } d_data->plot = plot; if ( d_data->plot ) { // insert the item into the current plot d_data->plot->attachItem( this, true ); itemChanged(); } } /*! Return rtti for the specific class represented. QwtPlotItem is simply a virtual interface class, and base classes will implement this method with specific rtti values so a user can differentiate them. The rtti value is useful for environments, where the runtime type information is disabled and it is not possible to do a dynamic_cast<...>. \return rtti value \sa RttiValues */ int QwtPlotItem::rtti() const { return Rtti_PlotItem; } //! Return attached plot QwtPlot *QwtPlotItem::plot() const { return d_data->plot; } /*! Plot items are painted in increasing z-order. \return setZ(), QwtPlotDict::itemList() */ double QwtPlotItem::z() const { return d_data->z; } /*! \brief Set the z value Plot items are painted in increasing z-order. \param z Z-value \sa z(), QwtPlotDict::itemList() */ void QwtPlotItem::setZ( double z ) { if ( d_data->z != z ) { d_data->z = z; if ( d_data->plot ) { // update the z order d_data->plot->attachItem( this, false ); d_data->plot->attachItem( this, true ); } itemChanged(); } } /*! Set a new title \param title Title \sa title() */ void QwtPlotItem::setTitle( const QString &title ) { setTitle( QwtText( title ) ); } /*! Set a new title \param title Title \sa title() */ void QwtPlotItem::setTitle( const QwtText &title ) { if ( d_data->title != title ) { d_data->title = title; itemChanged(); } } /*! \return Title of the item \sa setTitle() */ const QwtText &QwtPlotItem::title() const { return d_data->title; } /*! Toggle an item attribute \param attribute Attribute type \param on true/false \sa testItemAttribute(), ItemAttribute */ void QwtPlotItem::setItemAttribute( ItemAttribute attribute, bool on ) { if ( bool( d_data->attributes & attribute ) != on ) { if ( on ) d_data->attributes |= attribute; else d_data->attributes &= ~attribute; itemChanged(); } } /*! Test an item attribute \param attribute Attribute type \return true/false \sa setItemAttribute(), ItemAttribute */ bool QwtPlotItem::testItemAttribute( ItemAttribute attribute ) const { return d_data->attributes & attribute; } /*! Toggle an render hint \param hint Render hint \param on true/false \sa testRenderHint(), RenderHint */ void QwtPlotItem::setRenderHint( RenderHint hint, bool on ) { if ( ( ( d_data->renderHints & hint ) != 0 ) != on ) { if ( on ) d_data->renderHints |= hint; else d_data->renderHints &= ~hint; itemChanged(); } } /*! Test a render hint \param hint Render hint \return true/false \sa setRenderHint(), RenderHint */ bool QwtPlotItem::testRenderHint( RenderHint hint ) const { return ( d_data->renderHints & hint ); } //! Show the item void QwtPlotItem::show() { setVisible( true ); } //! Hide the item void QwtPlotItem::hide() { setVisible( false ); } /*! Show/Hide the item \param on Show if true, otherwise hide \sa isVisible(), show(), hide() */ void QwtPlotItem::setVisible( bool on ) { if ( on != d_data->isVisible ) { d_data->isVisible = on; itemChanged(); } } /*! \return true if visible \sa setVisible(), show(), hide() */ bool QwtPlotItem::isVisible() const { return d_data->isVisible; } /*! Update the legend and call QwtPlot::autoRefresh for the parent plot. \sa updateLegend() */ void QwtPlotItem::itemChanged() { if ( d_data->plot ) { if ( d_data->plot->legend() ) updateLegend( d_data->plot->legend() ); d_data->plot->autoRefresh(); } } /*! Set X and Y axis The item will painted according to the coordinates its Axes. \param xAxis X Axis \param yAxis Y Axis \sa setXAxis(), setYAxis(), xAxis(), yAxis() */ void QwtPlotItem::setAxes( int xAxis, int yAxis ) { if ( xAxis == QwtPlot::xBottom || xAxis == QwtPlot::xTop ) d_data->xAxis = xAxis; if ( yAxis == QwtPlot::yLeft || yAxis == QwtPlot::yRight ) d_data->yAxis = yAxis; itemChanged(); } /*! Set the X axis The item will painted according to the coordinates its Axes. \param axis X Axis \sa setAxes(), setYAxis(), xAxis() */ void QwtPlotItem::setXAxis( int axis ) { if ( axis == QwtPlot::xBottom || axis == QwtPlot::xTop ) { d_data->xAxis = axis; itemChanged(); } } /*! Set the Y axis The item will painted according to the coordinates its Axes. \param axis Y Axis \sa setAxes(), setXAxis(), yAxis() */ void QwtPlotItem::setYAxis( int axis ) { if ( axis == QwtPlot::yLeft || axis == QwtPlot::yRight ) { d_data->yAxis = axis; itemChanged(); } } //! Return xAxis int QwtPlotItem::xAxis() const { return d_data->xAxis; } //! Return yAxis int QwtPlotItem::yAxis() const { return d_data->yAxis; } /*! \return An invalid bounding rect: QRectF(1.0, 1.0, -2.0, -2.0) */ QRectF QwtPlotItem::boundingRect() const { return QRectF( 1.0, 1.0, -2.0, -2.0 ); // invalid } /*! \brief Allocate the widget that represents the item on the legend The default implementation returns a QwtLegendItem(), but an item could be represented by any type of widget, by overloading legendItem() and updateLegend(). \return QwtLegendItem() \sa updateLegend() QwtLegend() */ QWidget *QwtPlotItem::legendItem() const { QwtLegendItem *item = new QwtLegendItem; if ( d_data->plot ) { QObject::connect( item, SIGNAL( clicked() ), d_data->plot, SLOT( legendItemClicked() ) ); QObject::connect( item, SIGNAL( checked( bool ) ), d_data->plot, SLOT( legendItemChecked( bool ) ) ); } return item; } /*! \brief Update the widget that represents the item on the legend updateLegend() is called from itemChanged() to adopt the widget representing the item on the legend to its new configuration. The default implementation updates a QwtLegendItem(), but an item could be represented by any type of widget, by overloading legendItem() and updateLegend(). \param legend Legend \sa legendItem(), itemChanged(), QwtLegend() */ void QwtPlotItem::updateLegend( QwtLegend *legend ) const { if ( legend == NULL ) return; QWidget *lgdItem = legend->find( this ); if ( testItemAttribute( QwtPlotItem::Legend ) ) { if ( lgdItem == NULL ) { lgdItem = legendItem(); if ( lgdItem ) legend->insert( this, lgdItem ); } if ( lgdItem && lgdItem->inherits( "QwtLegendItem" ) ) { QwtLegendItem* label = ( QwtLegendItem* )lgdItem; if ( label ) { // paint the identifier const QSize sz = label->identifierSize(); QPixmap identifier( sz.width(), sz.height() ); identifier.fill( Qt::transparent ); QPainter painter( &identifier ); painter.setRenderHint( QPainter::Antialiasing, testRenderHint( QwtPlotItem::RenderAntialiased ) ); drawLegendIdentifier( &painter, QRect( 0, 0, sz.width(), sz.height() ) ); painter.end(); const bool doUpdate = label->updatesEnabled(); if ( doUpdate ) label->setUpdatesEnabled( false ); label->setText( title() ); label->setIdentifier( identifier ); label->setItemMode( legend->itemMode() ); if ( doUpdate ) label->setUpdatesEnabled( true ); label->update(); } } } else { if ( lgdItem ) { lgdItem->hide(); lgdItem->deleteLater(); } } } /*! \brief Update the item to changes of the axes scale division Update the item, when the axes of plot have changed. The default implementation does nothing, but items that depend on the scale division (like QwtPlotGrid()) have to reimplement updateScaleDiv() \param xScaleDiv Scale division of the x-axis \param yScaleDiv Scale division of the y-axis \sa QwtPlot::updateAxes() */ void QwtPlotItem::updateScaleDiv( const QwtScaleDiv &, const QwtScaleDiv & ) { } /*! \brief Calculate the bounding scale rect of 2 maps \param xMap X map \param yMap X map \return Bounding scale rect of the scale maps, normalized */ QRectF QwtPlotItem::scaleRect( const QwtScaleMap &xMap, const QwtScaleMap &yMap ) const { return QRectF( xMap.s1(), yMap.s1(), xMap.sDist(), yMap.sDist() ); } /*! \brief Calculate the bounding paint rect of 2 maps \param xMap X map \param yMap X map \return Bounding paint rect of the scale maps, normalized */ QRectF QwtPlotItem::paintRect( const QwtScaleMap &xMap, const QwtScaleMap &yMap ) const { const QRectF rect( xMap.p1(), yMap.p1(), xMap.pDist(), yMap.pDist() ); return rect; } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_plot_item.h000066400000000000000000000122221320135501600217360ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_ITEM_H #define QWT_PLOT_ITEM_H #include "qwt_global.h" #include "qwt_legend_itemmanager.h" #include "qwt_text.h" #include class QString; class QPainter; class QWidget; class QwtPlot; class QwtLegend; class QwtScaleMap; class QwtScaleDiv; /*! \brief Base class for items on the plot canvas A plot item is "something", that can be painted on the plot canvas, or only affects the scales of the plot widget. They can be categorized as: - Representator\n A "Representator" is an item that represents some sort of data on the plot canvas. The different representator classes are organized according to the characteristics of the data: - QwtPlotMarker Represents a point or a horizontal/vertical coordinate - QwtPlotCurve Represents a series of points - QwtPlotSpectrogram ( QwtPlotRasterItem ) Represents raster data - ... - Decorators\n A "Decorator" is an item, that displays additional information, that is not related to any data: - QwtPlotGrid - QwtPlotScaleItem - QwtPlotSvgItem - ... Depending on the QwtPlotItem::ItemAttribute flags, an item is included into autoscaling or has an entry on the legnd. Before misusing the existing item classes it might be better to implement a new type of plot item ( don't implement a watermark as spectrogram ). Deriving a new type of QwtPlotItem primarily means to implement the YourPlotItem::draw() method. \sa The cpuplot example shows the implementation of additional plot items. */ class QWT_EXPORT QwtPlotItem: public QwtLegendItemManager { public: /*! \brief Runtime type information RttiValues is used to cast plot items, without having to enable runtime type information of the compiler. */ enum RttiValues { Rtti_PlotItem = 0, Rtti_PlotGrid, Rtti_PlotScale, Rtti_PlotMarker, Rtti_PlotCurve, Rtti_PlotSpectroCurve, Rtti_PlotIntervalCurve, Rtti_PlotHistogram, Rtti_PlotSpectrogram, Rtti_PlotSVG, Rtti_PlotUserItem = 1000 }; /*! Plot Item Attributes - Legend\n The item is represented on the legend. - AutoScale \n The boundingRect() of the item is included in the autoscaling calculation. \sa setItemAttribute(), testItemAttribute() */ enum ItemAttribute { Legend = 1, AutoScale = 2 }; //! Render hints enum RenderHint { RenderAntialiased = 1 }; explicit QwtPlotItem( const QwtText &title = QwtText() ); virtual ~QwtPlotItem(); void attach( QwtPlot *plot ); /*! \brief This method detaches a QwtPlotItem from any QwtPlot it has been associated with. detach() is equivalent to calling attach( NULL ) \sa attach( QwtPlot* plot ) */ void detach() { attach( NULL ); } QwtPlot *plot() const; void setTitle( const QString &title ); void setTitle( const QwtText &title ); const QwtText &title() const; virtual int rtti() const; void setItemAttribute( ItemAttribute, bool on = true ); bool testItemAttribute( ItemAttribute ) const; void setRenderHint( RenderHint, bool on = true ); bool testRenderHint( RenderHint ) const; double z() const; void setZ( double z ); void show(); void hide(); virtual void setVisible( bool ); bool isVisible () const; void setAxes( int xAxis, int yAxis ); void setXAxis( int axis ); int xAxis() const; void setYAxis( int axis ); int yAxis() const; virtual void itemChanged(); /*! \brief Draw the item \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rect of the canvas in painter coordinates */ virtual void draw( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect ) const = 0; virtual QRectF boundingRect() const; virtual void updateLegend( QwtLegend * ) const; virtual void updateScaleDiv( const QwtScaleDiv&, const QwtScaleDiv& ); virtual QWidget *legendItem() const; QRectF scaleRect( const QwtScaleMap &, const QwtScaleMap & ) const; QRectF paintRect( const QwtScaleMap &, const QwtScaleMap & ) const; private: // Disabled copy constructor and operator= QwtPlotItem( const QwtPlotItem & ); QwtPlotItem &operator=( const QwtPlotItem & ); class PrivateData; PrivateData *d_data; }; #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_plot_layout.cpp000066400000000000000000001162251320135501600226600ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_layout.h" #include "qwt_text.h" #include "qwt_text_label.h" #include "qwt_plot_canvas.h" #include "qwt_scale_widget.h" #include "qwt_legend.h" #include #include class QwtPlotLayout::LayoutData { public: void init( const QwtPlot *, const QRectF &rect ); struct t_legendData { int frameWidth; int vScrollBarWidth; int hScrollBarHeight; QSize hint; } legend; struct t_titleData { QwtText text; int frameWidth; } title; struct t_scaleData { bool isEnabled; const QwtScaleWidget *scaleWidget; QFont scaleFont; int start; int end; int baseLineOffset; int tickOffset; int dimWithoutTitle; } scale[QwtPlot::axisCnt]; struct t_canvasData { int frameWidth; } canvas; }; /* Extract all layout relevant data from the plot components */ void QwtPlotLayout::LayoutData::init( const QwtPlot *plot, const QRectF &rect ) { // legend if ( plot->plotLayout()->legendPosition() != QwtPlot::ExternalLegend && plot->legend() ) { legend.frameWidth = plot->legend()->frameWidth(); legend.vScrollBarWidth = plot->legend()->verticalScrollBar()->sizeHint().width(); legend.hScrollBarHeight = plot->legend()->horizontalScrollBar()->sizeHint().height(); const QSize hint = plot->legend()->sizeHint(); int w = qMin( hint.width(), ( int )rect.width() ); int h = plot->legend()->heightForWidth( w ); if ( h == 0 ) h = hint.height(); if ( h > rect.height() ) w += legend.vScrollBarWidth; legend.hint = QSize( w, h ); } // title title.frameWidth = 0; title.text = QwtText(); if ( plot->titleLabel() ) { const QwtTextLabel *label = plot->titleLabel(); title.text = label->text(); if ( !( title.text.testPaintAttribute( QwtText::PaintUsingTextFont ) ) ) title.text.setFont( label->font() ); title.frameWidth = plot->titleLabel()->frameWidth(); } // scales for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { if ( plot->axisEnabled( axis ) ) { const QwtScaleWidget *scaleWidget = plot->axisWidget( axis ); scale[axis].isEnabled = true; scale[axis].scaleWidget = scaleWidget; scale[axis].scaleFont = scaleWidget->font(); scale[axis].start = scaleWidget->startBorderDist(); scale[axis].end = scaleWidget->endBorderDist(); scale[axis].baseLineOffset = scaleWidget->margin(); scale[axis].tickOffset = scaleWidget->margin(); if ( scaleWidget->scaleDraw()->hasComponent( QwtAbstractScaleDraw::Ticks ) ) { scale[axis].tickOffset += ( int )scaleWidget->scaleDraw()->majTickLength(); } scale[axis].dimWithoutTitle = scaleWidget->dimForLength( QWIDGETSIZE_MAX, scale[axis].scaleFont ); if ( !scaleWidget->title().isEmpty() ) { scale[axis].dimWithoutTitle -= scaleWidget->titleHeightForWidth( QWIDGETSIZE_MAX ); } } else { scale[axis].isEnabled = false; scale[axis].start = 0; scale[axis].end = 0; scale[axis].baseLineOffset = 0; scale[axis].tickOffset = 0; scale[axis].dimWithoutTitle = 0; } } // canvas canvas.frameWidth = plot->canvas()->frameWidth(); } class QwtPlotLayout::PrivateData { public: PrivateData(): margin( 0 ), spacing( 5 ), alignCanvasToScales( false ) { } QRectF titleRect; QRectF legendRect; QRectF scaleRect[QwtPlot::axisCnt]; QRectF canvasRect; QwtPlotLayout::LayoutData layoutData; QwtPlot::LegendPosition legendPos; double legendRatio; unsigned int margin; unsigned int spacing; unsigned int canvasMargin[QwtPlot::axisCnt]; bool alignCanvasToScales; }; /*! \brief Constructor */ QwtPlotLayout::QwtPlotLayout() { d_data = new PrivateData; setLegendPosition( QwtPlot::BottomLegend ); setCanvasMargin( 4 ); invalidate(); } //! Destructor QwtPlotLayout::~QwtPlotLayout() { delete d_data; } /*! Change the margin of the plot. The margin is the space around all components. \param margin new margin \sa margin(), setSpacing(), QwtPlot::setMargin() */ void QwtPlotLayout::setMargin( int margin ) { if ( margin < 0 ) margin = 0; d_data->margin = margin; } /*! \return margin \sa setMargin(), spacing(), QwtPlot::margin() */ int QwtPlotLayout::margin() const { return d_data->margin; } /*! Change a margin of the canvas. The margin is the space above/below the scale ticks. A negative margin will be set to -1, excluding the borders of the scales. \param margin New margin \param axis One of QwtPlot::Axis. Specifies where the position of the margin. -1 means margin at all borders. \sa canvasMargin() \warning The margin will have no effect when alignCanvasToScales is true */ void QwtPlotLayout::setCanvasMargin( int margin, int axis ) { if ( margin < -1 ) margin = -1; if ( axis == -1 ) { for ( axis = 0; axis < QwtPlot::axisCnt; axis++ ) d_data->canvasMargin[axis] = margin; } else if ( axis >= 0 && axis < QwtPlot::axisCnt ) d_data->canvasMargin[axis] = margin; } /*! \return Margin around the scale tick borders \sa setCanvasMargin() */ int QwtPlotLayout::canvasMargin( int axis ) const { if ( axis < 0 || axis >= QwtPlot::axisCnt ) return 0; return d_data->canvasMargin[axis]; } /*! Change the align-canvas-to-axis-scales setting. The canvas may: - extend beyond the axis scale ends to maximize its size, - align with the axis scale ends to control its size. \param alignCanvasToScales New align-canvas-to-axis-scales setting \sa setCanvasMargin() \note In this context the term 'scale' means the backbone of a scale. \warning In case of alignCanvasToScales == true canvasMargin will have no effect */ void QwtPlotLayout::setAlignCanvasToScales( bool alignCanvasToScales ) { d_data->alignCanvasToScales = alignCanvasToScales; } /*! Return the align-canvas-to-axis-scales setting. The canvas may: - extend beyond the axis scale ends to maximize its size - align with the axis scale ends to control its size. \return align-canvas-to-axis-scales setting \sa setAlignCanvasToScales, setCanvasMargin() \note In this context the term 'scale' means the backbone of a scale. */ bool QwtPlotLayout::alignCanvasToScales() const { return d_data->alignCanvasToScales; } /*! Change the spacing of the plot. The spacing is the distance between the plot components. \param spacing new spacing \sa setMargin(), spacing() */ void QwtPlotLayout::setSpacing( int spacing ) { d_data->spacing = qMax( 0, spacing ); } /*! \return spacing \sa margin(), setSpacing() */ int QwtPlotLayout::spacing() const { return d_data->spacing; } /*! \brief Specify the position of the legend \param pos The legend's position. \param ratio Ratio between legend and the bounding rect of title, canvas and axes. The legend will be shrinked if it would need more space than the given ratio. The ratio is limited to ]0.0 .. 1.0]. In case of <= 0.0 it will be reset to the default ratio. The default vertical/horizontal ratio is 0.33/0.5. \sa QwtPlot::setLegendPosition() */ void QwtPlotLayout::setLegendPosition( QwtPlot::LegendPosition pos, double ratio ) { if ( ratio > 1.0 ) ratio = 1.0; switch ( pos ) { case QwtPlot::TopLegend: case QwtPlot::BottomLegend: if ( ratio <= 0.0 ) ratio = 0.33; d_data->legendRatio = ratio; d_data->legendPos = pos; break; case QwtPlot::LeftLegend: case QwtPlot::RightLegend: if ( ratio <= 0.0 ) ratio = 0.5; d_data->legendRatio = ratio; d_data->legendPos = pos; break; case QwtPlot::ExternalLegend: d_data->legendRatio = ratio; // meaningless d_data->legendPos = pos; default: break; } } /*! \brief Specify the position of the legend \param pos The legend's position. Valid values are \c QwtPlot::LeftLegend, \c QwtPlot::RightLegend, \c QwtPlot::TopLegend, \c QwtPlot::BottomLegend. \sa QwtPlot::setLegendPosition() */ void QwtPlotLayout::setLegendPosition( QwtPlot::LegendPosition pos ) { setLegendPosition( pos, 0.0 ); } /*! \return Position of the legend \sa setLegendPosition(), QwtPlot::setLegendPosition(), QwtPlot::legendPosition() */ QwtPlot::LegendPosition QwtPlotLayout::legendPosition() const { return d_data->legendPos; } /*! Specify the relative size of the legend in the plot \param ratio Ratio between legend and the bounding rect of title, canvas and axes. The legend will be shrinked if it would need more space than the given ratio. The ratio is limited to ]0.0 .. 1.0]. In case of <= 0.0 it will be reset to the default ratio. The default vertical/horizontal ratio is 0.33/0.5. */ void QwtPlotLayout::setLegendRatio( double ratio ) { setLegendPosition( legendPosition(), ratio ); } /*! \return The relative size of the legend in the plot. \sa setLegendPosition() */ double QwtPlotLayout::legendRatio() const { return d_data->legendRatio; } /*! \return Geometry for the title \sa activate(), invalidate() */ const QRectF &QwtPlotLayout::titleRect() const { return d_data->titleRect; } /*! \return Geometry for the legend \sa activate(), invalidate() */ const QRectF &QwtPlotLayout::legendRect() const { return d_data->legendRect; } /*! \param axis Axis index \return Geometry for the scale \sa activate(), invalidate() */ const QRectF &QwtPlotLayout::scaleRect( int axis ) const { if ( axis < 0 || axis >= QwtPlot::axisCnt ) { static QRectF dummyRect; return dummyRect; } return d_data->scaleRect[axis]; } /*! \return Geometry for the canvas \sa activate(), invalidate() */ const QRectF &QwtPlotLayout::canvasRect() const { return d_data->canvasRect; } /*! Invalidate the geometry of all components. \sa activate() */ void QwtPlotLayout::invalidate() { d_data->titleRect = d_data->legendRect = d_data->canvasRect = QRect(); for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) d_data->scaleRect[axis] = QRect(); } /*! \brief Return a minimum size hint \sa QwtPlot::minimumSizeHint() */ QSize QwtPlotLayout::minimumSizeHint( const QwtPlot *plot ) const { class ScaleData { public: ScaleData() { w = h = minLeft = minRight = tickOffset = 0; } int w; int h; int minLeft; int minRight; int tickOffset; } scaleData[QwtPlot::axisCnt]; int canvasBorder[QwtPlot::axisCnt]; int axis; for ( axis = 0; axis < QwtPlot::axisCnt; axis++ ) { if ( plot->axisEnabled( axis ) ) { const QwtScaleWidget *scl = plot->axisWidget( axis ); ScaleData &sd = scaleData[axis]; const QSize hint = scl->minimumSizeHint(); sd.w = hint.width(); sd.h = hint.height(); scl->getBorderDistHint( sd.minLeft, sd.minRight ); sd.tickOffset = scl->margin(); if ( scl->scaleDraw()->hasComponent( QwtAbstractScaleDraw::Ticks ) ) sd.tickOffset += scl->scaleDraw()->majTickLength(); } canvasBorder[axis] = plot->canvas()->frameWidth() + d_data->canvasMargin[axis] + 1; } for ( axis = 0; axis < QwtPlot::axisCnt; axis++ ) { ScaleData &sd = scaleData[axis]; if ( sd.w && ( axis == QwtPlot::xBottom || axis == QwtPlot::xTop ) ) { if ( ( sd.minLeft > canvasBorder[QwtPlot::yLeft] ) && scaleData[QwtPlot::yLeft].w ) { int shiftLeft = sd.minLeft - canvasBorder[QwtPlot::yLeft]; if ( shiftLeft > scaleData[QwtPlot::yLeft].w ) shiftLeft = scaleData[QwtPlot::yLeft].w; sd.w -= shiftLeft; } if ( ( sd.minRight > canvasBorder[QwtPlot::yRight] ) && scaleData[QwtPlot::yRight].w ) { int shiftRight = sd.minRight - canvasBorder[QwtPlot::yRight]; if ( shiftRight > scaleData[QwtPlot::yRight].w ) shiftRight = scaleData[QwtPlot::yRight].w; sd.w -= shiftRight; } } if ( sd.h && ( axis == QwtPlot::yLeft || axis == QwtPlot::yRight ) ) { if ( ( sd.minLeft > canvasBorder[QwtPlot::xBottom] ) && scaleData[QwtPlot::xBottom].h ) { int shiftBottom = sd.minLeft - canvasBorder[QwtPlot::xBottom]; if ( shiftBottom > scaleData[QwtPlot::xBottom].tickOffset ) shiftBottom = scaleData[QwtPlot::xBottom].tickOffset; sd.h -= shiftBottom; } if ( ( sd.minLeft > canvasBorder[QwtPlot::xTop] ) && scaleData[QwtPlot::xTop].h ) { int shiftTop = sd.minRight - canvasBorder[QwtPlot::xTop]; if ( shiftTop > scaleData[QwtPlot::xTop].tickOffset ) shiftTop = scaleData[QwtPlot::xTop].tickOffset; sd.h -= shiftTop; } } } const QwtPlotCanvas *canvas = plot->canvas(); const QSize minCanvasSize = canvas->minimumSize(); int w = scaleData[QwtPlot::yLeft].w + scaleData[QwtPlot::yRight].w; int cw = qMax( scaleData[QwtPlot::xBottom].w, scaleData[QwtPlot::xTop].w ) + 2 * ( canvas->frameWidth() + 1 ); w += qMax( cw, minCanvasSize.width() ); int h = scaleData[QwtPlot::xBottom].h + scaleData[QwtPlot::xTop].h; int ch = qMax( scaleData[QwtPlot::yLeft].h, scaleData[QwtPlot::yRight].h ) + 2 * ( canvas->frameWidth() + 1 ); h += qMax( ch, minCanvasSize.height() ); const QwtTextLabel *title = plot->titleLabel(); if ( title && !title->text().isEmpty() ) { // If only QwtPlot::yLeft or QwtPlot::yRight is showing, // we center on the plot canvas. const bool centerOnCanvas = !( plot->axisEnabled( QwtPlot::yLeft ) && plot->axisEnabled( QwtPlot::yRight ) ); int titleW = w; if ( centerOnCanvas ) { titleW -= scaleData[QwtPlot::yLeft].w + scaleData[QwtPlot::yRight].w; } int titleH = title->heightForWidth( titleW ); if ( titleH > titleW ) // Compensate for a long title { w = titleW = titleH; if ( centerOnCanvas ) { w += scaleData[QwtPlot::yLeft].w + scaleData[QwtPlot::yRight].w; } titleH = title->heightForWidth( titleW ); } h += titleH + d_data->spacing; } // Compute the legend contribution const QwtLegend *legend = plot->legend(); if ( d_data->legendPos != QwtPlot::ExternalLegend && legend && !legend->isEmpty() ) { if ( d_data->legendPos == QwtPlot::LeftLegend || d_data->legendPos == QwtPlot::RightLegend ) { int legendW = legend->sizeHint().width(); int legendH = legend->heightForWidth( legendW ); if ( legend->frameWidth() > 0 ) w += d_data->spacing; if ( legendH > h ) legendW += legend->verticalScrollBar()->sizeHint().height(); if ( d_data->legendRatio < 1.0 ) legendW = qMin( legendW, int( w / ( 1.0 - d_data->legendRatio ) ) ); w += legendW + d_data->spacing; } else // QwtPlot::Top, QwtPlot::Bottom { int legendW = qMin( legend->sizeHint().width(), w ); int legendH = legend->heightForWidth( legendW ); if ( legend->frameWidth() > 0 ) h += d_data->spacing; if ( d_data->legendRatio < 1.0 ) legendH = qMin( legendH, int( h / ( 1.0 - d_data->legendRatio ) ) ); h += legendH + d_data->spacing; } } w += 2 * d_data->margin; h += 2 * d_data->margin; return QSize( w, h ); } /*! Find the geometry for the legend \param options Options how to layout the legend \param rect Rectangle where to place the legend \return Geometry for the legend \sa Options */ QRectF QwtPlotLayout::layoutLegend( int options, const QRectF &rect ) const { const QSize hint( d_data->layoutData.legend.hint ); int dim; if ( d_data->legendPos == QwtPlot::LeftLegend || d_data->legendPos == QwtPlot::RightLegend ) { // We don't allow vertical legends to take more than // half of the available space. dim = qMin( hint.width(), int( rect.width() * d_data->legendRatio ) ); if ( !( options & IgnoreScrollbars ) ) { if ( hint.height() > rect.height() ) { // The legend will need additional // space for the vertical scrollbar. dim += d_data->layoutData.legend.vScrollBarWidth; } } } else { dim = qMin( hint.height(), int( rect.height() * d_data->legendRatio ) ); dim = qMax( dim, d_data->layoutData.legend.hScrollBarHeight ); } QRectF legendRect = rect; switch ( d_data->legendPos ) { case QwtPlot::LeftLegend: legendRect.setWidth( dim ); break; case QwtPlot::RightLegend: legendRect.setX( rect.right() - dim ); legendRect.setWidth( dim ); break; case QwtPlot::TopLegend: legendRect.setHeight( dim ); break; case QwtPlot::BottomLegend: legendRect.setY( rect.bottom() - dim ); legendRect.setHeight( dim ); break; case QwtPlot::ExternalLegend: break; } return legendRect; } /*! Align the legend to the canvas \param canvasRect Geometry of the canvas \param legendRect Maximum geometry for the legend \return Geometry for the aligned legend */ QRectF QwtPlotLayout::alignLegend( const QRectF &canvasRect, const QRectF &legendRect ) const { QRectF alignedRect = legendRect; if ( d_data->legendPos == QwtPlot::BottomLegend || d_data->legendPos == QwtPlot::TopLegend ) { if ( d_data->layoutData.legend.hint.width() < canvasRect.width() ) { alignedRect.setX( canvasRect.x() ); alignedRect.setWidth( canvasRect.width() ); } } else { if ( d_data->layoutData.legend.hint.height() < canvasRect.height() ) { alignedRect.setY( canvasRect.y() ); alignedRect.setHeight( canvasRect.height() ); } } return alignedRect; } /*! Expand all line breaks in text labels, and calculate the height of their widgets in orientation of the text. \param options Options how to layout the legend \param rect Bounding rect for title, axes and canvas. \param dimTitle Expanded height of the title widget \param dimAxis Expanded heights of the axis in axis orientation. \sa Options */ void QwtPlotLayout::expandLineBreaks( int options, const QRectF &rect, int &dimTitle, int dimAxis[QwtPlot::axisCnt] ) const { dimTitle = 0; for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) dimAxis[axis] = 0; int backboneOffset[QwtPlot::axisCnt]; for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { backboneOffset[axis] = 0; if ( !d_data->alignCanvasToScales ) backboneOffset[axis] += d_data->canvasMargin[axis]; if ( !( options & IgnoreFrames ) ) backboneOffset[axis] += d_data->layoutData.canvas.frameWidth; } bool done = false; while ( !done ) { done = true; // the size for the 4 axis depend on each other. Expanding // the height of a horizontal axis will shrink the height // for the vertical axis, shrinking the height of a vertical // axis will result in a line break what will expand the // width and results in shrinking the width of a horizontal // axis what might result in a line break of a horizontal // axis ... . So we loop as long until no size changes. if ( !d_data->layoutData.title.text.isEmpty() ) { int w = rect.width(); if ( d_data->layoutData.scale[QwtPlot::yLeft].isEnabled != d_data->layoutData.scale[QwtPlot::yRight].isEnabled ) { // center to the canvas w -= dimAxis[QwtPlot::yLeft] + dimAxis[QwtPlot::yRight]; } int d = qCeil( d_data->layoutData.title.text.heightForWidth( w ) ); if ( !( options & IgnoreFrames ) ) d += 2 * d_data->layoutData.title.frameWidth; if ( d > dimTitle ) { dimTitle = d; done = false; } } for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { const struct LayoutData::t_scaleData &scaleData = d_data->layoutData.scale[axis]; if ( scaleData.isEnabled ) { int length; if ( axis == QwtPlot::xTop || axis == QwtPlot::xBottom ) { length = rect.width() - dimAxis[QwtPlot::yLeft] - dimAxis[QwtPlot::yRight]; length -= scaleData.start + scaleData.end; if ( dimAxis[QwtPlot::yRight] > 0 ) length -= 1; length += qMin( dimAxis[QwtPlot::yLeft], scaleData.start - backboneOffset[QwtPlot::yLeft] ); length += qMin( dimAxis[QwtPlot::yRight], scaleData.end - backboneOffset[QwtPlot::yRight] ); } else // QwtPlot::yLeft, QwtPlot::yRight { length = rect.height() - dimAxis[QwtPlot::xTop] - dimAxis[QwtPlot::xBottom]; length -= scaleData.start + scaleData.end; length -= 1; if ( dimAxis[QwtPlot::xBottom] <= 0 ) length -= 1; if ( dimAxis[QwtPlot::xTop] <= 0 ) length -= 1; if ( dimAxis[QwtPlot::xBottom] > 0 ) { length += qMin( d_data->layoutData.scale[QwtPlot::xBottom].tickOffset, scaleData.start - backboneOffset[QwtPlot::xBottom] ); } if ( dimAxis[QwtPlot::xTop] > 0 ) { length += qMin( d_data->layoutData.scale[QwtPlot::xTop].tickOffset, scaleData.end - backboneOffset[QwtPlot::xTop] ); } if ( dimTitle > 0 ) length -= dimTitle + d_data->spacing; } int d = scaleData.dimWithoutTitle; if ( !scaleData.scaleWidget->title().isEmpty() ) { d += scaleData.scaleWidget->titleHeightForWidth( length ); } if ( d > dimAxis[axis] ) { dimAxis[axis] = d; done = false; } } } } } /*! Align the ticks of the axis to the canvas borders using the empty corners. \sa Options */ void QwtPlotLayout::alignScales( int options, QRectF &canvasRect, QRectF scaleRect[QwtPlot::axisCnt] ) const { int backboneOffset[QwtPlot::axisCnt]; for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { backboneOffset[axis] = 0; if ( !d_data->alignCanvasToScales ) backboneOffset[axis] += d_data->canvasMargin[axis]; if ( !( options & IgnoreFrames ) ) backboneOffset[axis] += d_data->layoutData.canvas.frameWidth; } for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { if ( !scaleRect[axis].isValid() ) continue; const int startDist = d_data->layoutData.scale[axis].start; const int endDist = d_data->layoutData.scale[axis].end; QRectF &axisRect = scaleRect[axis]; if ( axis == QwtPlot::xTop || axis == QwtPlot::xBottom ) { const QRectF &leftScaleRect = scaleRect[QwtPlot::yLeft]; const int leftOffset = backboneOffset[QwtPlot::yLeft] - startDist; if ( leftScaleRect.isValid() ) { const int dx = leftOffset + leftScaleRect.width(); if ( d_data->alignCanvasToScales && dx < 0 ) { /* The axis needs more space than the width of the left scale. */ canvasRect.setLeft( qMax( canvasRect.left(), axisRect.left() - dx ) ); } else { const double minLeft = leftScaleRect.left(); const double left = axisRect.left() + leftOffset; axisRect.setLeft( qMax( left, minLeft ) ); } } else { if ( d_data->alignCanvasToScales && leftOffset < 0 ) { canvasRect.setLeft( qMax( canvasRect.left(), axisRect.left() - leftOffset ) ); } else { if ( leftOffset > 0 ) axisRect.setLeft( axisRect.left() + leftOffset ); } } const QRectF &rightScaleRect = scaleRect[QwtPlot::yRight]; const int rightOffset = backboneOffset[QwtPlot::yRight] - endDist + 1; if ( rightScaleRect.isValid() ) { const int dx = rightOffset + rightScaleRect.width(); if ( d_data->alignCanvasToScales && dx < 0 ) { /* The axis needs more space than the width of the right scale. */ canvasRect.setRight( qMin( canvasRect.right(), axisRect.right() + dx ) ); } const double maxRight = rightScaleRect.right(); const double right = axisRect.right() - rightOffset; axisRect.setRight( qMin( right, maxRight ) ); } else { if ( d_data->alignCanvasToScales && rightOffset < 0 ) { canvasRect.setRight( qMin( canvasRect.right(), axisRect.right() + rightOffset ) ); } else { if ( rightOffset > 0 ) axisRect.setRight( axisRect.right() - rightOffset ); } } } else // QwtPlot::yLeft, QwtPlot::yRight { const QRectF &bottomScaleRect = scaleRect[QwtPlot::xBottom]; const int bottomOffset = backboneOffset[QwtPlot::xBottom] - endDist + 1; if ( bottomScaleRect.isValid() ) { const int dy = bottomOffset + bottomScaleRect.height(); if ( d_data->alignCanvasToScales && dy < 0 ) { /* The axis needs more space than the height of the bottom scale. */ canvasRect.setBottom( qMin( canvasRect.bottom(), axisRect.bottom() + dy ) ); } else { const double maxBottom = bottomScaleRect.top() + d_data->layoutData.scale[QwtPlot::xBottom].tickOffset; const double bottom = axisRect.bottom() - bottomOffset; axisRect.setBottom( qMin( bottom, maxBottom ) ); } } else { if ( d_data->alignCanvasToScales && bottomOffset < 0 ) { canvasRect.setBottom( qMin( canvasRect.bottom(), axisRect.bottom() + bottomOffset ) ); } else { if ( bottomOffset > 0 ) axisRect.setBottom( axisRect.bottom() - bottomOffset ); } } const QRectF &topScaleRect = scaleRect[QwtPlot::xTop]; const int topOffset = backboneOffset[QwtPlot::xTop] - startDist; if ( topScaleRect.isValid() ) { const int dy = topOffset + topScaleRect.height(); if ( d_data->alignCanvasToScales && dy < 0 ) { /* The axis needs more space than the height of the top scale. */ canvasRect.setTop( qMax( canvasRect.top(), axisRect.top() - dy ) ); } else { const double minTop = topScaleRect.bottom() - d_data->layoutData.scale[QwtPlot::xTop].tickOffset; const double top = axisRect.top() + topOffset; axisRect.setTop( qMax( top, minTop ) ); } } else { if ( d_data->alignCanvasToScales && topOffset < 0 ) { canvasRect.setTop( qMax( canvasRect.top(), axisRect.top() - topOffset ) ); } else { if ( topOffset > 0 ) axisRect.setTop( axisRect.top() + topOffset ); } } } } if ( d_data->alignCanvasToScales ) { /* The canvas has been aligned to the scale with largest border distances. Now we have to realign the other scale. */ int fw = 0; if ( !( options & IgnoreFrames ) ) fw = d_data->layoutData.canvas.frameWidth; for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { if ( !scaleRect[axis].isValid() ) continue; if ( axis == QwtPlot::xBottom || axis == QwtPlot::xTop ) { scaleRect[axis].setLeft( canvasRect.left() + fw - d_data->layoutData.scale[axis].start ); scaleRect[axis].setRight( canvasRect.right() - fw - 1 + d_data->layoutData.scale[axis].end ); } else { scaleRect[axis].setTop( canvasRect.top() + fw - d_data->layoutData.scale[axis].start ); scaleRect[axis].setBottom( canvasRect.bottom() - fw - 1 + d_data->layoutData.scale[axis].end ); } } if ( scaleRect[QwtPlot::xTop].isValid() ) scaleRect[QwtPlot::xTop].setBottom( canvasRect.top() ); if ( scaleRect[QwtPlot::xBottom].isValid() ) scaleRect[QwtPlot::xBottom].setTop( canvasRect.bottom() ); if ( scaleRect[QwtPlot::yLeft].isValid() ) scaleRect[QwtPlot::yLeft].setRight( canvasRect.left() ); if ( scaleRect[QwtPlot::yRight].isValid() ) scaleRect[QwtPlot::yRight].setLeft( canvasRect.right() ); } } /*! \brief Recalculate the geometry of all components. \param plot Plot to be layout \param plotRect Rect where to place the components \param options Options \sa invalidate(), Options, titleRect(), legendRect(), scaleRect(), canvasRect() */ void QwtPlotLayout::activate( const QwtPlot *plot, const QRectF &plotRect, int options ) { invalidate(); QRectF rect( plotRect ); // undistributed rest of the plot rect if ( !( options & IgnoreMargin ) ) { // subtract the margin rect.setRect( rect.x() + d_data->margin, rect.y() + d_data->margin, rect.width() - 2 * d_data->margin, rect.height() - 2 * d_data->margin ); } // We extract all layout relevant data from the widgets, // filter them through pfilter and save them to d_data->layoutData. d_data->layoutData.init( plot, rect ); if ( !( options & IgnoreLegend ) && d_data->legendPos != QwtPlot::ExternalLegend && plot->legend() && !plot->legend()->isEmpty() ) { d_data->legendRect = layoutLegend( options, rect ); // subtract d_data->legendRect from rect const QRegion region( rect.toRect() ); rect = region.subtracted( d_data->legendRect.toRect() ).boundingRect(); switch ( d_data->legendPos ) { case QwtPlot::LeftLegend: rect.setLeft( rect.left() + d_data->spacing ); break; case QwtPlot::RightLegend: rect.setRight( rect.right() - d_data->spacing ); break; case QwtPlot::TopLegend: rect.setTop( rect.top() + d_data->spacing ); break; case QwtPlot::BottomLegend: rect.setBottom( rect.bottom() - d_data->spacing ); break; case QwtPlot::ExternalLegend: break; // suppress compiler warning } } /* +---+-----------+---+ | Title | +---+-----------+---+ | | Axis | | +---+-----------+---+ | A | | A | | x | Canvas | x | | i | | i | | s | | s | +---+-----------+---+ | | Axis | | +---+-----------+---+ */ // axes and title include text labels. The height of each // label depends on its line breaks, that depend on the width // for the label. A line break in a horizontal text will reduce // the available width for vertical texts and vice versa. // expandLineBreaks finds the height/width for title and axes // including all line breaks. int dimTitle, dimAxes[QwtPlot::axisCnt]; expandLineBreaks( options, rect, dimTitle, dimAxes ); if ( dimTitle > 0 ) { d_data->titleRect = QRect( rect.x(), rect.y(), rect.width(), dimTitle ); if ( d_data->layoutData.scale[QwtPlot::yLeft].isEnabled != d_data->layoutData.scale[QwtPlot::yRight].isEnabled ) { // if only one of the y axes is missing we align // the title centered to the canvas d_data->titleRect.setX( rect.x() + dimAxes[QwtPlot::yLeft] ); d_data->titleRect.setWidth( rect.width() - dimAxes[QwtPlot::yLeft] - dimAxes[QwtPlot::yRight] ); } // subtract title rect.setTop( rect.top() + dimTitle + d_data->spacing ); } d_data->canvasRect.setRect( rect.x() + dimAxes[QwtPlot::yLeft], rect.y() + dimAxes[QwtPlot::xTop], rect.width() - dimAxes[QwtPlot::yRight] - dimAxes[QwtPlot::yLeft], rect.height() - dimAxes[QwtPlot::xBottom] - dimAxes[QwtPlot::xTop] ); for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { // set the rects for the axes if ( dimAxes[axis] ) { int dim = dimAxes[axis]; QRectF &scaleRect = d_data->scaleRect[axis]; scaleRect = d_data->canvasRect; switch ( axis ) { case QwtPlot::yLeft: scaleRect.setX( d_data->canvasRect.left() - dim ); scaleRect.setWidth( dim ); break; case QwtPlot::yRight: scaleRect.setX( d_data->canvasRect.right() ); scaleRect.setWidth( dim ); break; case QwtPlot::xBottom: scaleRect.setY( d_data->canvasRect.bottom() ); scaleRect.setHeight( dim ); break; case QwtPlot::xTop: scaleRect.setY( d_data->canvasRect.top() - dim ); scaleRect.setHeight( dim ); break; } scaleRect = scaleRect.normalized(); } } // +---+-----------+---+ // | <- Axis -> | // +-^-+-----------+-^-+ // | | | | | | // | | | | // | A | | A | // | x | Canvas | x | // | i | | i | // | s | | s | // | | | | // | | | | | | // +-V-+-----------+-V-+ // | <- Axis -> | // +---+-----------+---+ // The ticks of the axes - not the labels above - should // be aligned to the canvas. So we try to use the empty // corners to extend the axes, so that the label texts // left/right of the min/max ticks are moved into them. alignScales( options, d_data->canvasRect, d_data->scaleRect ); if ( !d_data->legendRect.isEmpty() ) { // We prefer to align the legend to the canvas - not to // the complete plot - if possible. d_data->legendRect = alignLegend( d_data->canvasRect, d_data->legendRect ); } } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_plot_layout.h000066400000000000000000000056221320135501600223230ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_LAYOUT_H #define QWT_PLOT_LAYOUT_H #include "qwt_global.h" #include "qwt_plot.h" /*! \brief Layout engine for QwtPlot. It is used by the QwtPlot widget to organize its internal widgets or by QwtPlot::print() to render its content to a QPaintDevice like a QPrinter, QPixmap/QImage or QSvgRenderer. */ class QWT_EXPORT QwtPlotLayout { public: /*! Options to configure the plot layout engine - AlignScales\n Unused - IgnoreScrollbars\n Ignore the dimension of the scrollbars. There are no scrollbars, when the plot is rendered to a paint device (QwtPlot::print() ). - IgnoreFrames\n Ignore all frames. QwtPlot::print() doesn't paint them. - IgnoreMargin\n Ignore the margin(). - IgnoreLegend\n Ignore the legend. \sa activate() */ enum Options { AlignScales = 1, IgnoreScrollbars = 2, IgnoreFrames = 4, IgnoreMargin = 8, IgnoreLegend = 16 }; explicit QwtPlotLayout(); virtual ~QwtPlotLayout(); void setMargin( int ); int margin() const; void setCanvasMargin( int margin, int axis = -1 ); int canvasMargin( int axis ) const; void setAlignCanvasToScales( bool ); bool alignCanvasToScales() const; void setSpacing( int ); int spacing() const; void setLegendPosition( QwtPlot::LegendPosition pos, double ratio ); void setLegendPosition( QwtPlot::LegendPosition pos ); QwtPlot::LegendPosition legendPosition() const; void setLegendRatio( double ratio ); double legendRatio() const; virtual QSize minimumSizeHint( const QwtPlot * ) const; virtual void activate( const QwtPlot *, const QRectF &rect, int options = 0 ); virtual void invalidate(); const QRectF &titleRect() const; const QRectF &legendRect() const; const QRectF &scaleRect( int axis ) const; const QRectF &canvasRect() const; class LayoutData; protected: QRectF layoutLegend( int options, const QRectF & ) const; QRectF alignLegend( const QRectF &canvasRect, const QRectF &legendRect ) const; void expandLineBreaks( int options, const QRectF &rect, int &dimTitle, int dimAxes[QwtPlot::axisCnt] ) const; void alignScales( int options, QRectF &canvasRect, QRectF scaleRect[QwtPlot::axisCnt] ) const; private: class PrivateData; PrivateData *d_data; }; #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_plot_seriesitem.cpp000066400000000000000000000042721320135501600235120ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_seriesitem.h" class QwtPlotAbstractSeriesItem::PrivateData { public: PrivateData(): orientation( Qt::Vertical ) { } Qt::Orientation orientation; }; /*! Constructor \param title Title of the curve */ QwtPlotAbstractSeriesItem::QwtPlotAbstractSeriesItem( const QwtText &title ): QwtPlotItem( title ) { d_data = new PrivateData(); } /*! Constructor \param title Title of the curve */ QwtPlotAbstractSeriesItem::QwtPlotAbstractSeriesItem( const QString &title ): QwtPlotItem( QwtText( title ) ) { d_data = new PrivateData(); } //! Destructor QwtPlotAbstractSeriesItem::~QwtPlotAbstractSeriesItem() { delete d_data; } /*! Set the orientation of the item. The orientation() might be used in specific way by a plot item. F.e. a QwtPlotCurve uses it to identify how to display the curve int QwtPlotCurve::Steps or QwtPlotCurve::Sticks style. \sa orientation() */ void QwtPlotAbstractSeriesItem::setOrientation( Qt::Orientation orientation ) { if ( d_data->orientation != orientation ) { d_data->orientation = orientation; itemChanged(); } } /*! \return Orientation of the plot item \sa setOrientation() */ Qt::Orientation QwtPlotAbstractSeriesItem::orientation() const { return d_data->orientation; } /*! \brief Draw the complete series \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rect of the canvas */ void QwtPlotAbstractSeriesItem::draw( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect ) const { drawSeries( painter, xMap, yMap, canvasRect, 0, -1 ); } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_plot_seriesitem.h000066400000000000000000000121461320135501600231560ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_SERIES_ITEM_H #define QWT_PLOT_SERIES_ITEM_H #include "qwt_global.h" #include "qwt_plot_item.h" #include "qwt_scale_div.h" #include "qwt_series_data.h" /*! \brief Base class for plot items reprsenting a series of samples */ class QWT_EXPORT QwtPlotAbstractSeriesItem: public QwtPlotItem { public: explicit QwtPlotAbstractSeriesItem( const QString &title = QString::null ); explicit QwtPlotAbstractSeriesItem( const QwtText &title ); virtual ~QwtPlotAbstractSeriesItem(); void setOrientation( Qt::Orientation ); Qt::Orientation orientation() const; virtual void draw( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF & ) const; /*! Draw a subset of the samples \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rect of the canvas \param from Index of the first point to be painted \param to Index of the last point to be painted. If to < 0 the curve will be painted to its last point. */ virtual void drawSeries( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const = 0; private: class PrivateData; PrivateData *d_data; }; /*! \brief Class template for plot items reprsenting a series of samples */ template class QwtPlotSeriesItem: public QwtPlotAbstractSeriesItem { public: explicit QwtPlotSeriesItem( const QString &title = QString::null ); explicit QwtPlotSeriesItem( const QwtText &title ); virtual ~QwtPlotSeriesItem(); void setData( QwtSeriesData * ); QwtSeriesData *data(); const QwtSeriesData *data() const; size_t dataSize() const; T sample( int i ) const; virtual QRectF boundingRect() const; virtual void updateScaleDiv( const QwtScaleDiv &, const QwtScaleDiv & ); protected: //! Series QwtSeriesData *d_series; }; /*! Constructor \param title Title of the series item */ template QwtPlotSeriesItem::QwtPlotSeriesItem( const QString &title ): QwtPlotAbstractSeriesItem( QwtText( title ) ), d_series( NULL ) { } /*! Constructor \param title Title of the series item */ template QwtPlotSeriesItem::QwtPlotSeriesItem( const QwtText &title ): QwtPlotAbstractSeriesItem( title ), d_series( NULL ) { } //! Destructor template QwtPlotSeriesItem::~QwtPlotSeriesItem() { delete d_series; } //! \return the the curve data template inline QwtSeriesData *QwtPlotSeriesItem::data() { return d_series; } //! \return the the curve data template inline const QwtSeriesData *QwtPlotSeriesItem::data() const { return d_series; } /*! \param index Index \return Sample at position index */ template inline T QwtPlotSeriesItem::sample( int index ) const { return d_series ? d_series->sample( index ) : T(); } /*! Assign a series of samples \param data Data \warning The item takes ownership of the data object, deleting it when its not used anymore. */ template void QwtPlotSeriesItem::setData( QwtSeriesData *data ) { if ( d_series != data ) { delete d_series; d_series = data; itemChanged(); } } /*! Return the size of the data arrays \sa setData() */ template size_t QwtPlotSeriesItem::dataSize() const { if ( d_series == NULL ) return 0; return d_series->size(); } /*! \return Bounding rectangle of the data. If there is no bounding rect, like for empty data the rectangle is invalid. \sa QwtSeriesData::boundingRect(), QRectF::isValid() */ template QRectF QwtPlotSeriesItem::boundingRect() const { if ( d_series == NULL ) return QRectF( 1.0, 1.0, -2.0, -2.0 ); // invalid return d_series->boundingRect(); } /*! Update the rect of interest according to the current scale ranges \param xScaleDiv Scale division of the x-axis \param yScaleDiv Scale division of the y-axis \sa QwtSeriesData::setRectOfInterest() */ template void QwtPlotSeriesItem::updateScaleDiv( const QwtScaleDiv &xScaleDiv, const QwtScaleDiv &yScaleDiv ) { const QRectF rect = QRectF( xScaleDiv.lowerBound(), yScaleDiv.lowerBound(), xScaleDiv.range(), yScaleDiv.range() ); d_series->setRectOfInterest( rect ); } #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_plot_xml.cpp000066400000000000000000000021641320135501600221370ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot.h" /*! This method is intended for manipulating the plot widget from a specific editor in the Qwt designer plugin. \warning The plot editor has never been implemented. */ void QwtPlot::applyProperties( const QString & /* xmlDocument */ ) { #if 0 // Temporary dummy code, for designer tests setTitle( xmlDocument ); replot(); #endif } /*! This method is intended for manipulating the plot widget from a specific editor in the Qwt designer plugin. \warning The plot editor has never been implemented. */ QString QwtPlot::grabProperties() const { #if 0 // Temporary dummy code, for designer tests return title().text(); #else return QString::null; #endif } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_point_3d.cpp000066400000000000000000000012341320135501600220150ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_point_3d.h" #ifndef QT_NO_DEBUG_STREAM QDebug operator<<( QDebug debug, const QwtPoint3D &point ) { debug.nospace() << "QwtPoint3D(" << point.x() << "," << point.y() << "," << point.z() << ")"; return debug.space(); } #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_point_3d.h000066400000000000000000000077771320135501600215040ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ /*! \file */ #ifndef QWT_POINT_3D_H #define QWT_POINT_3D_H 1 #include "qwt_global.h" #include #ifndef QT_NO_DEBUG_STREAM #include #endif /*! \brief QwtPoint3D class defines a 3D point in double coordinates */ class QWT_EXPORT QwtPoint3D { public: QwtPoint3D(); QwtPoint3D( double x, double y, double z ); QwtPoint3D( const QwtPoint3D & ); QwtPoint3D( const QPointF & ); bool isNull() const; double x() const; double y() const; double z() const; double &rx(); double &ry(); double &rz(); void setX( double x ); void setY( double y ); void setZ( double y ); QPointF toPoint() const; bool operator==( const QwtPoint3D & ) const; bool operator!=( const QwtPoint3D & ) const; private: double d_x; double d_y; double d_z; }; #ifndef QT_NO_DEBUG_STREAM QWT_EXPORT QDebug operator<<( QDebug, const QwtPoint3D & ); #endif /*! Constructs a null point. \sa isNull() */ inline QwtPoint3D::QwtPoint3D(): d_x( 0.0 ), d_y( 0.0 ), d_z( 0.0 ) { } //! Constructs a point with coordinates specified by x, y and z. inline QwtPoint3D::QwtPoint3D( double x, double y, double z = 0.0 ): d_x( x ), d_y( y ), d_z( z ) { } /*! Copy constructor. Constructs a point using the values of the point specified. */ inline QwtPoint3D::QwtPoint3D( const QwtPoint3D &other ): d_x( other.d_x ), d_y( other.d_y ), d_z( other.d_z ) { } /*! Constructs a point with x and y coordinates from a 2D point, and a z coordinate of 0. */ inline QwtPoint3D::QwtPoint3D( const QPointF &other ): d_x( other.x() ), d_y( other.y() ), d_z( 0.0 ) { } /*! Returns true if the point is null; otherwise returns false. A point is considered to be null if x, y and z-coordinates are equal to zero. */ inline bool QwtPoint3D::isNull() const { return d_x == 0.0 && d_y == 0.0 && d_z == 0; } //! Returns the x-coordinate of the point. inline double QwtPoint3D::x() const { return d_x; } //! Returns the y-coordinate of the point. inline double QwtPoint3D::y() const { return d_y; } //! Returns the z-coordinate of the point. inline double QwtPoint3D::z() const { return d_z; } //! Returns a reference to the x-coordinate of the point. inline double &QwtPoint3D::rx() { return d_x; } //! Returns a reference to the y-coordinate of the point. inline double &QwtPoint3D::ry() { return d_y; } //! Returns a reference to the z-coordinate of the point. inline double &QwtPoint3D::rz() { return d_z; } //! Sets the x-coordinate of the point to the value specified by x. inline void QwtPoint3D::setX( double x ) { d_x = x; } //! Sets the y-coordinate of the point to the value specified by y. inline void QwtPoint3D::setY( double y ) { d_y = y; } //! Sets the z-coordinate of the point to the value specified by z. inline void QwtPoint3D::setZ( double z ) { d_z = z; } /*! Rounds 2D point, where the z coordinate is dropped. */ inline QPointF QwtPoint3D::toPoint() const { return QPointF( d_x, d_y ); } //! Returns true if this point and other are equal; otherwise returns false. inline bool QwtPoint3D::operator==( const QwtPoint3D &other ) const { return ( d_x == other.d_x ) && ( d_y == other.d_y ) && ( d_z == other.d_z ); } //! Returns true if this rect and other are different; otherwise returns false. inline bool QwtPoint3D::operator!=( const QwtPoint3D &other ) const { return !operator==( other ); } #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_point_polar.cpp000066400000000000000000000060761320135501600226350ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * QwtPolar Widget Library * Copyright (C) 2008 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_point_polar.h" #include "qwt_math.h" #if QT_VERSION < 0x040601 #define qAtan2(y, x) ::atan2(y, x) #endif /*! Convert and assign values from a point in Cartesian coordinates \param p Point in Cartesian coordinates \sa setPoint(), toPoint() */ QwtPointPolar::QwtPointPolar( const QPointF &p ) { d_radius = qSqrt( qwtSqr( p.x() ) + qwtSqr( p.y() ) ); d_azimuth = qAtan2( p.y(), p.x() ); } /*! Convert and assign values from a point in Cartesian coordinates \param p Point in Cartesian coordinates */ void QwtPointPolar::setPoint( const QPointF &p ) { d_radius = qSqrt( qwtSqr( p.x() ) + qwtSqr( p.y() ) ); d_azimuth = qAtan2( p.y(), p.x() ); } /*! Convert and return values in Cartesian coordinates \note Invalid or null points will be returned as QPointF(0.0, 0.0) \sa isValid(), isNull() */ QPointF QwtPointPolar::toPoint() const { if ( d_radius <= 0.0 ) return QPointF( 0.0, 0.0 ); const double x = d_radius * qCos( d_azimuth ); const double y = d_radius * qSin( d_azimuth ); return QPointF( x, y ); } /*! Returns true if point1 is equal to point2; otherwise returns false. Two points are equal to each other if radius and azimuth-coordinates are the same. Points are not equal, when the azimuth differs, but other.azimuth() == azimuth() % (2 * PI). \sa normalized() */ bool QwtPointPolar::operator==( const QwtPointPolar &other ) const { return d_radius == other.d_radius && d_azimuth == other.d_azimuth; } /*! Returns true if point1 is not equal to point2; otherwise returns false. Two points are equal to each other if radius and azimuth-coordinates are the same. Points are not equal, when the azimuth differs, but other.azimuth() == azimuth() % (2 * PI). \sa normalized() */ bool QwtPointPolar::operator!=( const QwtPointPolar &other ) const { return d_radius != other.d_radius || d_azimuth != other.d_azimuth; } /*! Normalize radius and azimuth When the radius is < 0.0 it is set to 0.0. The azimuth is a value >= 0.0 and < 2 * M_PI. */ QwtPointPolar QwtPointPolar::normalized() const { const double radius = qMax( d_radius, 0.0 ); double azimuth = d_azimuth; if ( azimuth < -2.0 * M_PI || azimuth >= 2 * M_PI ) azimuth = ::fmod( d_azimuth, 2 * M_PI ); if ( azimuth < 0.0 ) azimuth += 2 * M_PI; return QwtPointPolar( azimuth, radius ); } #ifndef QT_NO_DEBUG_STREAM QDebug operator<<( QDebug debug, const QwtPointPolar &point ) { debug.nospace() << "QwtPointPolar(" << point.azimuth() << "," << point.radius() << ")"; return debug.space(); } #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_point_polar.h000066400000000000000000000061451320135501600222770ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ /*! \file */ #ifndef _QWT_POINT_POLAR_H_ #define _QWT_POINT_POLAR_H_ 1 #include "qwt_global.h" #include #ifndef QT_NO_DEBUG_STREAM #include #endif /*! \brief A point in polar coordinates In polar coordinates a point is determined by an angle and a distance. See http://en.wikipedia.org/wiki/Polar_coordinate_system */ class QWT_EXPORT QwtPointPolar { public: QwtPointPolar(); QwtPointPolar( double azimuth, double radius ); QwtPointPolar( const QwtPointPolar & ); QwtPointPolar( const QPointF & ); void setPoint( const QPointF & ); QPointF toPoint() const; bool isValid() const; bool isNull() const; double radius() const; double azimuth() const; double &rRadius(); double &rAzimuth(); void setRadius( double ); void setAzimuth( double ); bool operator==( const QwtPointPolar & ) const; bool operator!=( const QwtPointPolar & ) const; QwtPointPolar normalized() const; private: double d_azimuth; double d_radius; }; /*! Constructs a null point, with a radius and azimuth set to 0.0. \sa QPointF::isNull */ inline QwtPointPolar::QwtPointPolar(): d_azimuth( 0.0 ), d_radius( 0.0 ) { } /*! Constructs a point with coordinates specified by radius and azimuth. \param azimuth Azimuth \param radius Radius */ inline QwtPointPolar::QwtPointPolar( double azimuth, double radius ): d_azimuth( azimuth ), d_radius( radius ) { } /*! Constructs a point using the values of the point specified. \param other Other point */ inline QwtPointPolar::QwtPointPolar( const QwtPointPolar &other ): d_azimuth( other.d_azimuth ), d_radius( other.d_radius ) { } //! Returns true if radius() >= 0.0 inline bool QwtPointPolar::isValid() const { return d_radius >= 0.0; } //! Returns true if radius() >= 0.0 inline bool QwtPointPolar::isNull() const { return d_radius == 0.0; } //! Returns the radius. inline double QwtPointPolar::radius() const { return d_radius; } //! Returns the azimuth. inline double QwtPointPolar::azimuth() const { return d_azimuth; } //! Returns the radius. inline double &QwtPointPolar::rRadius() { return d_radius; } //! Returns the azimuth. inline double &QwtPointPolar::rAzimuth() { return d_azimuth; } //! Sets the radius to radius. inline void QwtPointPolar::setRadius( double radius ) { d_radius = radius; } //! Sets the atimuth to atimuth. inline void QwtPointPolar::setAzimuth( double azimuth ) { d_azimuth = azimuth; } #ifndef QT_NO_DEBUG_STREAM QWT_EXPORT QDebug operator<<( QDebug, const QwtPointPolar & ); #endif #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_round_scale_draw.cpp000066400000000000000000000203771320135501600236220ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_round_scale_draw.h" #include "qwt_painter.h" #include "qwt_scale_div.h" #include "qwt_scale_map.h" #include #include #include #include class QwtRoundScaleDraw::PrivateData { public: PrivateData(): center( 50, 50 ), radius( 50 ), startAngle( -135 * 16 ), endAngle( 135 * 16 ) { } QPointF center; double radius; double startAngle; double endAngle; }; /*! \brief Constructor The range of the scale is initialized to [0, 100], The center is set to (50, 50) with a radius of 50. The angle range is set to [-135, 135]. */ QwtRoundScaleDraw::QwtRoundScaleDraw() { d_data = new QwtRoundScaleDraw::PrivateData; setRadius( 50 ); scaleMap().setPaintInterval( d_data->startAngle, d_data->endAngle ); } //! Destructor QwtRoundScaleDraw::~QwtRoundScaleDraw() { delete d_data; } /*! Change of radius the scale Radius is the radius of the backbone without ticks and labels. \param radius New Radius \sa moveCenter() */ void QwtRoundScaleDraw::setRadius( int radius ) { d_data->radius = radius; } /*! Get the radius Radius is the radius of the backbone without ticks and labels. \sa setRadius(), extent() */ int QwtRoundScaleDraw::radius() const { return d_data->radius; } /*! Move the center of the scale draw, leaving the radius unchanged \param center New center \sa setRadius() */ void QwtRoundScaleDraw::moveCenter( const QPointF ¢er ) { d_data->center = center; } //! Get the center of the scale QPointF QwtRoundScaleDraw::center() const { return d_data->center; } /*! \brief Adjust the baseline circle segment for round scales. The baseline will be drawn from min(angle1,angle2) to max(angle1, angle2). The default setting is [ -135, 135 ]. An angle of 0 degrees corresponds to the 12 o'clock position, and positive angles count in a clockwise direction. \param angle1 \param angle2 boundaries of the angle interval in degrees. \warning
    • The angle range is limited to [-360, 360] degrees. Angles exceeding this range will be clipped.
    • For angles more than 359 degrees above or below min(angle1, angle2), scale marks will not be drawn.
    • If you need a counterclockwise scale, use QwtScaleDiv::setRange
    */ void QwtRoundScaleDraw::setAngleRange( double angle1, double angle2 ) { angle1 = qwtLim( angle1, -360.0, 360.0 ); angle2 = qwtLim( angle2, -360.0, 360.0 ); d_data->startAngle = angle1 * 16.0; d_data->endAngle = angle2 * 16.0; if ( d_data->startAngle == d_data->endAngle ) { d_data->startAngle -= 1; d_data->endAngle += 1; } scaleMap().setPaintInterval( d_data->startAngle, d_data->endAngle ); } /*! Draws the label for a major scale tick \param painter Painter \param value Value \sa drawTick(), drawBackbone() */ void QwtRoundScaleDraw::drawLabel( QPainter *painter, double value ) const { const QwtText label = tickLabel( painter->font(), value ); if ( label.isEmpty() ) return; const double tval = map().transform( value ); if ( ( tval > d_data->startAngle + 359 * 16 ) || ( tval < d_data->startAngle - 359 * 16 ) ) { return; } double radius = d_data->radius; if ( hasComponent( QwtAbstractScaleDraw::Ticks ) || hasComponent( QwtAbstractScaleDraw::Backbone ) ) { radius += spacing(); } if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ) radius += majTickLength(); const QSizeF sz = label.textSize( painter->font() ); const double arc = tval / 16.0 / 360.0 * 2 * M_PI; const double x = d_data->center.x() + ( radius + sz.width() / 2.0 ) * qSin( arc ); const double y = d_data->center.y() - ( radius + sz.height() / 2.0 ) * cos( arc ); const QRectF r( x - sz.width() / 2, y - sz.height() / 2, sz.width(), sz.height() ); label.draw( painter, r ); } /*! Draw a tick \param painter Painter \param value Value of the tick \param len Lenght of the tick \sa drawBackbone(), drawLabel() */ void QwtRoundScaleDraw::drawTick( QPainter *painter, double value, double len ) const { if ( len <= 0 ) return; const double tval = map().transform( value ); const double cx = d_data->center.x(); const double cy = d_data->center.y(); const double radius = d_data->radius; if ( ( tval <= d_data->startAngle + 359 * 16 ) || ( tval >= d_data->startAngle - 359 * 16 ) ) { const double arc = double( tval ) / 16.0 * M_PI / 180.0; const double sinArc = qSin( arc ); const double cosArc = qCos( arc ); const double x1 = cx + radius * sinArc; const double x2 = cx + ( radius + len ) * sinArc; const double y1 = cy - radius * cosArc; const double y2 = cy - ( radius + len ) * cosArc; QwtPainter::drawLine( painter, x1, y1, x2, y2 ); } } /*! Draws the baseline of the scale \param painter Painter \sa drawTick(), drawLabel() */ void QwtRoundScaleDraw::drawBackbone( QPainter *painter ) const { const double a1 = qMin( map().p1(), map().p2() ) - 90 * 16; const double a2 = qMax( map().p1(), map().p2() ) - 90 * 16; const double radius = d_data->radius; const double x = d_data->center.x() - radius; const double y = d_data->center.y() - radius; painter->drawArc( x, y, 2 * radius, 2 * radius, -a2, a2 - a1 + 1 ); // counterclockwise } /*! Calculate the extent of the scale The extent is the distcance between the baseline to the outermost pixel of the scale draw. radius() + extent() is an upper limit for the radius of the bounding circle. \param font Font used for painting the labels \sa setMinimumExtent(), minimumExtent() \warning The implemented algo is not too smart and calculates only an upper limit, that might be a few pixels too large */ double QwtRoundScaleDraw::extent( const QFont &font ) const { double d = 0.0; if ( hasComponent( QwtAbstractScaleDraw::Labels ) ) { const QwtScaleDiv &sd = scaleDiv(); const QList &ticks = sd.ticks( QwtScaleDiv::MajorTick ); for ( uint i = 0; i < ( uint )ticks.count(); i++ ) { const double value = ticks[i]; if ( !sd.contains( value ) ) continue; const QwtText label = tickLabel( font, value ); if ( label.isEmpty() ) continue; const double tval = map().transform( value ); if ( ( tval < d_data->startAngle + 360 * 16 ) && ( tval > d_data->startAngle - 360 * 16 ) ) { const double arc = tval / 16.0 / 360.0 * 2 * M_PI; const QSizeF sz = label.textSize( font ); const double off = qMax( sz.width(), sz.height() ); double x = off * qSin( arc ); double y = off * qCos( arc ); const double dist = qSqrt( x * x + y * y ); if ( dist > d ) d = dist; } } } if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ) { d += majTickLength(); } if ( hasComponent( QwtAbstractScaleDraw::Backbone ) ) { const double pw = qMax( 1, penWidth() ); // penwidth can be zero d += pw; } if ( hasComponent( QwtAbstractScaleDraw::Labels ) && ( hasComponent( QwtAbstractScaleDraw::Ticks ) || hasComponent( QwtAbstractScaleDraw::Backbone ) ) ) { d += spacing(); } d = qMax( d, minimumExtent() ); return d; } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_round_scale_draw.h000066400000000000000000000040511320135501600232560ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_ROUND_SCALE_DRAW_H #define QWT_ROUND_SCALE_DRAW_H #include "qwt_global.h" #include "qwt_abstract_scale_draw.h" #include class QPen; /*! \brief A class for drawing round scales QwtRoundScaleDraw can be used to draw round scales. The circle segment can be adjusted by QwtRoundScaleDraw::setAngleRange(). The geometry of the scale can be specified with QwtRoundScaleDraw::moveCenter() and QwtRoundScaleDraw::setRadius(). After a scale division has been specified as a QwtScaleDiv object using QwtAbstractScaleDraw::setScaleDiv(const QwtScaleDiv &s), the scale can be drawn with the QwtAbstractScaleDraw::draw() member. */ class QWT_EXPORT QwtRoundScaleDraw: public QwtAbstractScaleDraw { public: QwtRoundScaleDraw(); virtual ~QwtRoundScaleDraw(); void setRadius( int radius ); int radius() const; void moveCenter( double x, double y ); void moveCenter( const QPointF & ); QPointF center() const; void setAngleRange( double angle1, double angle2 ); virtual double extent( const QFont & ) const; protected: virtual void drawTick( QPainter *p, double val, double len ) const; virtual void drawBackbone( QPainter *p ) const; virtual void drawLabel( QPainter *p, double val ) const; private: QwtRoundScaleDraw( const QwtRoundScaleDraw & ); QwtRoundScaleDraw &operator=( const QwtRoundScaleDraw &other ); class PrivateData; PrivateData *d_data; }; //! Move the center of the scale draw, leaving the radius unchanged inline void QwtRoundScaleDraw::moveCenter( double x, double y ) { moveCenter( QPointF( x, y ) ); } #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_scale_div.cpp000066400000000000000000000100071320135501600222250ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_scale_div.h" #include "qwt_math.h" #include "qwt_interval.h" #include //! Construct an invalid QwtScaleDiv instance. QwtScaleDiv::QwtScaleDiv(): d_lowerBound( 0.0 ), d_upperBound( 0.0 ), d_isValid( false ) { } /*! Construct QwtScaleDiv instance. \param interval Interval \param ticks List of major, medium and minor ticks */ QwtScaleDiv::QwtScaleDiv( const QwtInterval &interval, QList ticks[NTickTypes] ): d_lowerBound( interval.minValue() ), d_upperBound( interval.maxValue() ), d_isValid( true ) { for ( int i = 0; i < NTickTypes; i++ ) d_ticks[i] = ticks[i]; } /*! Construct QwtScaleDiv instance. \param lowerBound First interval limit \param upperBound Second interval limit \param ticks List of major, medium and minor ticks */ QwtScaleDiv::QwtScaleDiv( double lowerBound, double upperBound, QList ticks[NTickTypes] ): d_lowerBound( lowerBound ), d_upperBound( upperBound ), d_isValid( true ) { for ( int i = 0; i < NTickTypes; i++ ) d_ticks[i] = ticks[i]; } /*! Change the interval \param interval Interval */ void QwtScaleDiv::setInterval( const QwtInterval &interval ) { setInterval( interval.minValue(), interval.maxValue() ); } /*! \brief Equality operator \return true if this instance is equal to other */ bool QwtScaleDiv::operator==( const QwtScaleDiv &other ) const { if ( d_lowerBound != other.d_lowerBound || d_upperBound != other.d_upperBound || d_isValid != other.d_isValid ) { return false; } for ( int i = 0; i < NTickTypes; i++ ) { if ( d_ticks[i] != other.d_ticks[i] ) return false; } return true; } /*! \brief Inequality \return true if this instance is not equal to s */ bool QwtScaleDiv::operator!=( const QwtScaleDiv &s ) const { return ( !( *this == s ) ); } //! Invalidate the scale division void QwtScaleDiv::invalidate() { d_isValid = false; // detach arrays for ( int i = 0; i < NTickTypes; i++ ) d_ticks[i].clear(); d_lowerBound = d_upperBound = 0; } //! Check if the scale division is valid bool QwtScaleDiv::isValid() const { return d_isValid; } /*! Return if a value is between lowerBound() and upperBound() \param value Value \return true/false */ bool QwtScaleDiv::contains( double value ) const { if ( !d_isValid ) return false; const double min = qMin( d_lowerBound, d_upperBound ); const double max = qMax( d_lowerBound, d_upperBound ); return value >= min && value <= max; } //! Invert the scale divison void QwtScaleDiv::invert() { qSwap( d_lowerBound, d_upperBound ); for ( int i = 0; i < NTickTypes; i++ ) { QList& ticks = d_ticks[i]; const int size = ticks.count(); const int size2 = size / 2; for ( int i = 0; i < size2; i++ ) qSwap( ticks[i], ticks[size - 1 - i] ); } } /*! Assign ticks \param type MinorTick, MediumTick or MajorTick \param ticks Values of the tick positions */ void QwtScaleDiv::setTicks( int type, const QList &ticks ) { if ( type >= 0 || type < NTickTypes ) d_ticks[type] = ticks; } /*! Return a list of ticks \param type MinorTick, MediumTick or MajorTick */ const QList &QwtScaleDiv::ticks( int type ) const { if ( type >= 0 || type < NTickTypes ) return d_ticks[type]; static QList noTicks; return noTicks; } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_scale_div.h000066400000000000000000000053231320135501600216770ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SCALE_DIV_H #define QWT_SCALE_DIV_H #include "qwt_global.h" #include "qwt_interval.h" #include class QwtInterval; /*! \brief A class representing a scale division A scale division consists of its limits and 3 list of tick values qualified as major, medium and minor ticks. In most cases scale divisions are calculated by a QwtScaleEngine. \sa subDivideInto(), subDivide() */ class QWT_EXPORT QwtScaleDiv { public: //! Scale tick types enum TickType { NoTick = -1, MinorTick, MediumTick, MajorTick, NTickTypes }; explicit QwtScaleDiv(); explicit QwtScaleDiv( const QwtInterval &, QList[NTickTypes] ); explicit QwtScaleDiv( double lowerBound, double upperBound, QList[NTickTypes] ); bool operator==( const QwtScaleDiv &s ) const; bool operator!=( const QwtScaleDiv &s ) const; void setInterval( double lowerBound, double upperBound ); void setInterval( const QwtInterval & ); QwtInterval interval() const; double lowerBound() const; double upperBound() const; double range() const; bool contains( double v ) const; void setTicks( int type, const QList & ); const QList &ticks( int type ) const; void invalidate(); bool isValid() const; void invert(); private: double d_lowerBound; double d_upperBound; QList d_ticks[NTickTypes]; bool d_isValid; }; /*! Change the interval \param lowerBound lower bound \param upperBound upper bound */ inline void QwtScaleDiv::setInterval( double lowerBound, double upperBound ) { d_lowerBound = lowerBound; d_upperBound = upperBound; } /*! \return lowerBound -> upperBound */ inline QwtInterval QwtScaleDiv::interval() const { return QwtInterval( d_lowerBound, d_upperBound ); } /*! \return lower bound \sa upperBound() */ inline double QwtScaleDiv::lowerBound() const { return d_lowerBound; } /*! \return upper bound \sa lowerBound() */ inline double QwtScaleDiv::upperBound() const { return d_upperBound; } /*! \return upperBound() - lowerBound() */ inline double QwtScaleDiv::range() const { return d_upperBound - d_lowerBound; } #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_scale_draw.cpp000066400000000000000000000546101320135501600224100ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_scale_draw.h" #include "qwt_scale_div.h" #include "qwt_scale_map.h" #include "qwt_math.h" #include "qwt_painter.h" #include #include #include class QwtScaleDraw::PrivateData { public: PrivateData(): len( 0 ), alignment( QwtScaleDraw::BottomScale ), labelAlignment( 0 ), labelRotation( 0.0 ) { } QPointF pos; double len; Alignment alignment; Qt::Alignment labelAlignment; double labelRotation; }; /*! \brief Constructor The range of the scale is initialized to [0, 100], The position is at (0, 0) with a length of 100. The orientation is QwtAbstractScaleDraw::Bottom. */ QwtScaleDraw::QwtScaleDraw() { d_data = new QwtScaleDraw::PrivateData; setLength( 100 ); } //! Destructor QwtScaleDraw::~QwtScaleDraw() { delete d_data; } /*! Return alignment of the scale \sa setAlignment() */ QwtScaleDraw::Alignment QwtScaleDraw::alignment() const { return d_data->alignment; } /*! Set the alignment of the scale The default alignment is QwtScaleDraw::BottomScale \sa alignment() */ void QwtScaleDraw::setAlignment( Alignment align ) { d_data->alignment = align; } /*! Return the orientation TopScale, BottomScale are horizontal (Qt::Horizontal) scales, LeftScale, RightScale are vertical (Qt::Vertical) scales. \sa alignment() */ Qt::Orientation QwtScaleDraw::orientation() const { switch ( d_data->alignment ) { case TopScale: case BottomScale: return Qt::Horizontal; case LeftScale: case RightScale: default: return Qt::Vertical; } } /*! \brief Determine the minimum border distance This member function returns the minimum space needed to draw the mark labels at the scale's endpoints. \param font Font \param start Start border distance \param end End border distance */ void QwtScaleDraw::getBorderDistHint( const QFont &font, int &start, int &end ) const { start = 0; end = 0; if ( !hasComponent( QwtAbstractScaleDraw::Labels ) ) return; const QList &ticks = scaleDiv().ticks( QwtScaleDiv::MajorTick ); if ( ticks.count() == 0 ) return; // Find the ticks, that are mapped to the borders. // minTick is the tick, that is mapped to the top/left-most position // in widget coordinates. double minTick = ticks[0]; double minPos = map().transform( minTick ); double maxTick = minTick; double maxPos = minPos; for ( uint i = 1; i < ( uint )ticks.count(); i++ ) { const double tickPos = map().transform( ticks[i] ); if ( tickPos < minPos ) { minTick = ticks[i]; minPos = tickPos; } if ( tickPos > map().transform( maxTick ) ) { maxTick = ticks[i]; maxPos = tickPos; } } double e = 0.0; double s = 0.0; if ( orientation() == Qt::Vertical ) { s = -labelRect( font, minTick ).top(); s -= qAbs( minPos - qRound( map().p2() ) ); e = labelRect( font, maxTick ).bottom(); e -= qAbs( maxPos - map().p1() ); } else { s = -labelRect( font, minTick ).left(); s -= qAbs( minPos - map().p1() ); e = labelRect( font, maxTick ).right(); e -= qAbs( maxPos - map().p2() ); } if ( s < 0.0 ) s = 0.0; if ( e < 0.0 ) e = 0.0; start = qCeil( s ); end = qCeil( e ); } /*! Determine the minimum distance between two labels, that is necessary that the texts don't overlap. \param font Font \return The maximum width of a label \sa getBorderDistHint() */ int QwtScaleDraw::minLabelDist( const QFont &font ) const { if ( !hasComponent( QwtAbstractScaleDraw::Labels ) ) return 0; const QList &ticks = scaleDiv().ticks( QwtScaleDiv::MajorTick ); if ( ticks.count() == 0 ) return 0; const QFontMetrics fm( font ); const bool vertical = ( orientation() == Qt::Vertical ); QRectF bRect1; QRectF bRect2 = labelRect( font, ticks[0] ); if ( vertical ) { bRect2.setRect( -bRect2.bottom(), 0, bRect2.height(), bRect2.width() ); } int maxDist = 0; for ( uint i = 1; i < ( uint )ticks.count(); i++ ) { bRect1 = bRect2; bRect2 = labelRect( font, ticks[i] ); if ( vertical ) { bRect2.setRect( -bRect2.bottom(), 0, bRect2.height(), bRect2.width() ); } int dist = fm.leading(); // space between the labels if ( bRect1.right() > 0 ) dist += bRect1.right(); if ( bRect2.left() < 0 ) dist += -bRect2.left(); if ( dist > maxDist ) maxDist = dist; } double angle = labelRotation() / 180.0 * M_PI; if ( vertical ) angle += M_PI / 2; if ( qSin( angle ) == 0.0 ) return maxDist; const int fmHeight = fm.ascent() - 2; // The distance we need until there is // the height of the label font. This height is needed // for the neighbour labal. int labelDist = ( int )( fmHeight / qSin( angle ) * qCos( angle ) ); if ( labelDist < 0 ) labelDist = -labelDist; // The cast above floored labelDist. We want to ceil. labelDist++; // For text orientations close to the scale orientation if ( labelDist > maxDist ) labelDist = maxDist; // For text orientations close to the opposite of the // scale orientation if ( labelDist < fmHeight ) labelDist = fmHeight; return labelDist; } /*! Calculate the width/height that is needed for a vertical/horizontal scale. The extent is calculated from the pen width of the backbone, the major tick length, the spacing and the maximum width/height of the labels. \param font Font used for painting the labels \sa minLength() */ double QwtScaleDraw::extent( const QFont &font ) const { double d = 0; if ( hasComponent( QwtAbstractScaleDraw::Labels ) ) { if ( orientation() == Qt::Vertical ) d = maxLabelWidth( font ); else d = maxLabelHeight( font ); if ( d > 0 ) d += spacing(); } if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ) { d += majTickLength(); } if ( hasComponent( QwtAbstractScaleDraw::Backbone ) ) { const double pw = qMax( 1, penWidth() ); // penwidth can be zero d += pw; } d = qMax( d, minimumExtent() ); return d; } /*! Calculate the minimum length that is needed to draw the scale \param font Font used for painting the labels \sa extent() */ int QwtScaleDraw::minLength( const QFont &font ) const { int startDist, endDist; getBorderDistHint( font, startDist, endDist ); const QwtScaleDiv &sd = scaleDiv(); const uint minorCount = sd.ticks( QwtScaleDiv::MinorTick ).count() + sd.ticks( QwtScaleDiv::MediumTick ).count(); const uint majorCount = sd.ticks( QwtScaleDiv::MajorTick ).count(); int lengthForLabels = 0; if ( hasComponent( QwtAbstractScaleDraw::Labels ) ) { if ( majorCount >= 2 ) lengthForLabels = minLabelDist( font ) * ( majorCount - 1 ); } int lengthForTicks = 0; if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ) { const double pw = qMax( 1, penWidth() ); // penwidth can be zero lengthForTicks = qCeil( ( majorCount + minorCount ) * ( pw + 1.0 ) ); } return startDist + endDist + qMax( lengthForLabels, lengthForTicks ); } /*! Find the position, where to paint a label The position has a distance of majTickLength() + spacing() + 1 from the backbone. The direction depends on the alignment() \param value Value */ QPointF QwtScaleDraw::labelPosition( double value ) const { const double tval = map().transform( value ); double dist = spacing(); if ( hasComponent( QwtAbstractScaleDraw::Backbone ) ) dist += qMax( 1, penWidth() ); if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ) dist += majTickLength(); double px = 0; double py = 0; switch ( alignment() ) { case RightScale: { px = d_data->pos.x() + dist; py = tval; break; } case LeftScale: { px = d_data->pos.x() - dist; py = tval; break; } case BottomScale: { px = tval; py = d_data->pos.y() + dist; break; } case TopScale: { px = tval; py = d_data->pos.y() - dist; break; } } return QPointF( px, py ); } /*! Draw a tick \param painter Painter \param value Value of the tick \param len Lenght of the tick \sa drawBackbone(), drawLabel() */ void QwtScaleDraw::drawTick( QPainter *painter, double value, double len ) const { if ( len <= 0 ) return; const bool roundingAlignment = QwtPainter::roundingAlignment( painter ); QwtScaleMap scaleMap = map(); QPointF pos = d_data->pos; double tval = scaleMap.transform( value ); if ( roundingAlignment ) tval = qRound( tval ); const int pw = penWidth(); int a = 0; if ( pw > 1 && roundingAlignment ) a = 1; switch ( alignment() ) { case LeftScale: { double x1 = pos.x() + a; double x2 = pos.x() + a - pw - len; if ( roundingAlignment ) { x1 = qRound( x1 ); x2 = qRound( x2 ); } QwtPainter::drawLine( painter, x1, tval, x2, tval ); break; } case RightScale: { double x1 = pos.x(); double x2 = pos.x() + pw + len; if ( roundingAlignment ) { x1 = qRound( x1 ); x2 = qRound( x2 ); } QwtPainter::drawLine( painter, x1, tval, x2, tval ); break; } case BottomScale: { double y1 = pos.y(); double y2 = pos.y() + pw + len; if ( roundingAlignment ) { y1 = qRound( y1 ); y2 = qRound( y2 ); } QwtPainter::drawLine( painter, tval, y1, tval, y2 ); break; } case TopScale: { double y1 = pos.y() + a; double y2 = pos.y() - pw - len + a; if ( roundingAlignment ) { y1 = qRound( y1 ); y2 = qRound( y2 ); } QwtPainter::drawLine( painter, tval, y1, tval, y2 ); break; } } } /*! Draws the baseline of the scale \param painter Painter \sa drawTick(), drawLabel() */ void QwtScaleDraw::drawBackbone( QPainter *painter ) const { const bool doAlign = QwtPainter::roundingAlignment( painter ); const QPointF &pos = d_data->pos; const double len = d_data->len; const int pw = qMax( penWidth(), 1 ); // pos indicates a border not the center of the backbone line // so we need to shift its position depending on the pen width // and the alignment of the scale double off; if ( doAlign ) { if ( alignment() == LeftScale || alignment() == TopScale ) off = ( pw - 1 ) / 2; else off = pw / 2; } else { off = 0.5 * penWidth(); } switch ( alignment() ) { case LeftScale: { double x = pos.x() - off; if ( doAlign ) x = qRound( x ); QwtPainter::drawLine( painter, x, pos.y(), x, pos.y() + len ); break; } case RightScale: { double x = pos.x() + off; if ( doAlign ) x = qRound( x ); QwtPainter::drawLine( painter, x, pos.y(), x, pos.y() + len ); break; } case TopScale: { double y = pos.y() - off; if ( doAlign ) y = qRound( y ); QwtPainter::drawLine( painter, pos.x(), y, pos.x() + len, y ); break; } case BottomScale: { double y = pos.y() + off; if ( doAlign ) y = qRound( y ); QwtPainter::drawLine( painter, pos.x(), y, pos.x() + len, y ); break; } } } /*! \brief Move the position of the scale The meaning of the parameter pos depends on the alignment:
    QwtScaleDraw::LeftScale
    The origin is the topmost point of the backbone. The backbone is a vertical line. Scale marks and labels are drawn at the left of the backbone.
    QwtScaleDraw::RightScale
    The origin is the topmost point of the backbone. The backbone is a vertical line. Scale marks and labels are drawn at the right of the backbone.
    QwtScaleDraw::TopScale
    The origin is the leftmost point of the backbone. The backbone is a horizontal line. Scale marks and labels are drawn above the backbone.
    QwtScaleDraw::BottomScale
    The origin is the leftmost point of the backbone. The backbone is a horizontal line Scale marks and labels are drawn below the backbone.
    \param pos Origin of the scale \sa pos(), setLength() */ void QwtScaleDraw::move( const QPointF &pos ) { d_data->pos = pos; updateMap(); } /*! \return Origin of the scale \sa move(), length() */ QPointF QwtScaleDraw::pos() const { return d_data->pos; } /*! Set the length of the backbone. The length doesn't include the space needed for overlapping labels. \sa move(), minLabelDist() */ void QwtScaleDraw::setLength( double length ) { if ( length >= 0 && length < 10 ) length = 10; if ( length < 0 && length > -10 ) length = -10; d_data->len = length; updateMap(); } /*! \return the length of the backbone \sa setLength(), pos() */ double QwtScaleDraw::length() const { return d_data->len; } /*! Draws the label for a major scale tick \param painter Painter \param value Value \sa drawTick(), drawBackbone(), boundingLabelRect() */ void QwtScaleDraw::drawLabel( QPainter *painter, double value ) const { QwtText lbl = tickLabel( painter->font(), value ); if ( lbl.isEmpty() ) return; QPointF pos = labelPosition( value ); QSizeF labelSize = lbl.textSize( painter->font() ); const QTransform transform = labelTransformation( pos, labelSize ); painter->save(); painter->setWorldTransform( transform, true ); lbl.draw ( painter, QRect( QPoint( 0, 0 ), labelSize.toSize() ) ); painter->restore(); } /*! Find the bounding rect for the label. The coordinates of the rect are absolute coordinates ( calculated from pos() ). in direction of the tick. \param font Font used for painting \param value Value \sa labelRect() */ QRect QwtScaleDraw::boundingLabelRect( const QFont &font, double value ) const { QwtText lbl = tickLabel( font, value ); if ( lbl.isEmpty() ) return QRect(); const QPointF pos = labelPosition( value ); QSizeF labelSize = lbl.textSize( font ); const QTransform transform = labelTransformation( pos, labelSize ); return transform.mapRect( QRect( QPoint( 0, 0 ), labelSize.toSize() ) ); } /*! Calculate the transformation that is needed to paint a label depending on its alignment and rotation. \param pos Position where to paint the label \param size Size of the label \sa setLabelAlignment(), setLabelRotation() */ QTransform QwtScaleDraw::labelTransformation( const QPointF &pos, const QSizeF &size ) const { QTransform transform; transform.translate( pos.x(), pos.y() ); transform.rotate( labelRotation() ); int flags = labelAlignment(); if ( flags == 0 ) { switch ( alignment() ) { case RightScale: { if ( flags == 0 ) flags = Qt::AlignRight | Qt::AlignVCenter; break; } case LeftScale: { if ( flags == 0 ) flags = Qt::AlignLeft | Qt::AlignVCenter; break; } case BottomScale: { if ( flags == 0 ) flags = Qt::AlignHCenter | Qt::AlignBottom; break; } case TopScale: { if ( flags == 0 ) flags = Qt::AlignHCenter | Qt::AlignTop; break; } } } double x, y; if ( flags & Qt::AlignLeft ) x = -size.width(); else if ( flags & Qt::AlignRight ) x = 0.0; else // Qt::AlignHCenter x = -( 0.5 * size.width() ); if ( flags & Qt::AlignTop ) y = -size.height(); else if ( flags & Qt::AlignBottom ) y = 0; else // Qt::AlignVCenter y = -( 0.5 * size.height() ); transform.translate( x, y ); return transform; } /*! Find the bounding rect for the label. The coordinates of the rect are relative to spacing + ticklength from the backbone in direction of the tick. \param font Font used for painting \param value Value */ QRectF QwtScaleDraw::labelRect( const QFont &font, double value ) const { QwtText lbl = tickLabel( font, value ); if ( lbl.isEmpty() ) return QRectF( 0.0, 0.0, 0.0, 0.0 ); const QPointF pos = labelPosition( value ); const QSizeF labelSize = lbl.textSize( font ); const QTransform transform = labelTransformation( pos, labelSize ); QRectF br = transform.mapRect( QRectF( QPointF( 0, 0 ), labelSize ) ); br.translate( -pos.x(), -pos.y() ); return br; } /*! Calculate the size that is needed to draw a label \param font Label font \param value Value */ QSizeF QwtScaleDraw::labelSize( const QFont &font, double value ) const { return labelRect( font, value ).size(); } /*! Rotate all labels. When changing the rotation, it might be necessary to adjust the label flags too. Finding a useful combination is often the result of try and error. \param rotation Angle in degrees. When changing the label rotation, the label flags often needs to be adjusted too. \sa setLabelAlignment(), labelRotation(), labelAlignment(). */ void QwtScaleDraw::setLabelRotation( double rotation ) { d_data->labelRotation = rotation; } /*! \return the label rotation \sa setLabelRotation(), labelAlignment() */ double QwtScaleDraw::labelRotation() const { return d_data->labelRotation; } /*! \brief Change the label flags Labels are aligned to the point ticklength + spacing away from the backbone. The alignment is relative to the orientation of the label text. In case of an flags of 0 the label will be aligned depending on the orientation of the scale: QwtScaleDraw::TopScale: Qt::AlignHCenter | Qt::AlignTop\n QwtScaleDraw::BottomScale: Qt::AlignHCenter | Qt::AlignBottom\n QwtScaleDraw::LeftScale: Qt::AlignLeft | Qt::AlignVCenter\n QwtScaleDraw::RightScale: Qt::AlignRight | Qt::AlignVCenter\n Changing the alignment is often necessary for rotated labels. \param alignment Or'd Qt::AlignmentFlags \sa setLabelRotation(), labelRotation(), labelAlignment() \warning The various alignments might be confusing. The alignment of the label is not the alignment of the scale and is not the alignment of the flags (QwtText::flags()) returned from QwtAbstractScaleDraw::label(). */ void QwtScaleDraw::setLabelAlignment( Qt::Alignment alignment ) { d_data->labelAlignment = alignment; } /*! \return the label flags \sa setLabelAlignment(), labelRotation() */ Qt::Alignment QwtScaleDraw::labelAlignment() const { return d_data->labelAlignment; } /*! \param font Font \return the maximum width of a label */ int QwtScaleDraw::maxLabelWidth( const QFont &font ) const { int maxWidth = 0; const QList &ticks = scaleDiv().ticks( QwtScaleDiv::MajorTick ); for ( uint i = 0; i < ( uint )ticks.count(); i++ ) { const double v = ticks[i]; if ( scaleDiv().contains( v ) ) { const int w = labelSize( font, ticks[i] ).width(); if ( w > maxWidth ) maxWidth = w; } } return maxWidth; } /*! \param font Font \return the maximum height of a label */ int QwtScaleDraw::maxLabelHeight( const QFont &font ) const { int maxHeight = 0; const QList &ticks = scaleDiv().ticks( QwtScaleDiv::MajorTick ); for ( uint i = 0; i < ( uint )ticks.count(); i++ ) { const double v = ticks[i]; if ( scaleDiv().contains( v ) ) { const int h = labelSize( font, ticks[i] ).height(); if ( h > maxHeight ) maxHeight = h; } } return maxHeight; } void QwtScaleDraw::updateMap() { const QPointF pos = d_data->pos; double len = d_data->len; QwtScaleMap &sm = scaleMap(); if ( orientation() == Qt::Vertical ) sm.setPaintInterval( pos.y() + len, pos.y() ); else sm.setPaintInterval( pos.x(), pos.x() + len ); } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_scale_draw.h000066400000000000000000000057431320135501600220600ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SCALE_DRAW_H #define QWT_SCALE_DRAW_H #include "qwt_global.h" #include "qwt_abstract_scale_draw.h" #include #include #include /*! \brief A class for drawing scales QwtScaleDraw can be used to draw linear or logarithmic scales. A scale has a position, an alignment and a length, which can be specified . The labels can be rotated and aligned to the ticks using setLabelRotation() and setLabelAlignment(). After a scale division has been specified as a QwtScaleDiv object using QwtAbstractScaleDraw::setScaleDiv(const QwtScaleDiv &s), the scale can be drawn with the QwtAbstractScaleDraw::draw() member. */ class QWT_EXPORT QwtScaleDraw: public QwtAbstractScaleDraw { public: /*! Alignment of the scale draw \sa setAlignment(), alignment() */ enum Alignment { BottomScale, TopScale, LeftScale, RightScale }; QwtScaleDraw(); virtual ~QwtScaleDraw(); void getBorderDistHint( const QFont &, int &start, int &end ) const; int minLabelDist( const QFont & ) const; int minLength( const QFont & ) const; virtual double extent( const QFont & ) const; void move( double x, double y ); void move( const QPointF & ); void setLength( double length ); Alignment alignment() const; void setAlignment( Alignment ); Qt::Orientation orientation() const; QPointF pos() const; double length() const; void setLabelAlignment( Qt::Alignment ); Qt::Alignment labelAlignment() const; void setLabelRotation( double rotation ); double labelRotation() const; int maxLabelHeight( const QFont & ) const; int maxLabelWidth( const QFont & ) const; QPointF labelPosition( double val ) const; QRectF labelRect( const QFont &, double val ) const; QSizeF labelSize( const QFont &, double val ) const; QRect boundingLabelRect( const QFont &, double val ) const; protected: QTransform labelTransformation( const QPointF &, const QSizeF & ) const; virtual void drawTick( QPainter *, double val, double len ) const; virtual void drawBackbone( QPainter * ) const; virtual void drawLabel( QPainter *, double val ) const; private: QwtScaleDraw( const QwtScaleDraw & ); QwtScaleDraw &operator=( const QwtScaleDraw &other ); void updateMap(); class PrivateData; PrivateData *d_data; }; /*! Move the position of the scale \sa move(const QPointF &) */ inline void QwtScaleDraw::move( double x, double y ) { move( QPointF( x, y ) ); } #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_scale_engine.cpp000066400000000000000000000602171320135501600227200ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_scale_engine.h" #include "qwt_math.h" #include "qwt_scale_map.h" #include #include #if QT_VERSION < 0x040601 #define qFabs(x) ::fabs(x) #define qExp(x) ::exp(x) #endif static const double _eps = 1.0e-6; /*! Ceil a value, relative to an interval \param value Value to ceil \param intervalSize Interval size \sa floorEps() */ double QwtScaleArithmetic::ceilEps( double value, double intervalSize ) { const double eps = _eps * intervalSize; value = ( value - eps ) / intervalSize; return qCeil( value ) * intervalSize; } /*! Floor a value, relative to an interval \param value Value to floor \param intervalSize Interval size \sa floorEps() */ double QwtScaleArithmetic::floorEps( double value, double intervalSize ) { const double eps = _eps * intervalSize; value = ( value + eps ) / intervalSize; return qFloor( value ) * intervalSize; } /*! \brief Divide an interval into steps \f$stepSize = (intervalSize - intervalSize * 10e^{-6}) / numSteps\f$ \param intervalSize Interval size \param numSteps Number of steps \return Step size */ double QwtScaleArithmetic::divideEps( double intervalSize, double numSteps ) { if ( numSteps == 0.0 || intervalSize == 0.0 ) return 0.0; return ( intervalSize - ( _eps * intervalSize ) ) / numSteps; } /*! Find the smallest value out of {1,2,5}*10^n with an integer number n which is greater than or equal to x \param x Input value */ double QwtScaleArithmetic::ceil125( double x ) { if ( x == 0.0 ) return 0.0; const double sign = ( x > 0 ) ? 1.0 : -1.0; const double lx = ::log10( qFabs( x ) ); const double p10 = qFloor( lx ); double fr = qPow( 10.0, lx - p10 ); if ( fr <= 1.0 ) fr = 1.0; else if ( fr <= 2.0 ) fr = 2.0; else if ( fr <= 5.0 ) fr = 5.0; else fr = 10.0; return sign * fr * qPow( 10.0, p10 ); } /*! \brief Find the largest value out of {1,2,5}*10^n with an integer number n which is smaller than or equal to x \param x Input value */ double QwtScaleArithmetic::floor125( double x ) { if ( x == 0.0 ) return 0.0; double sign = ( x > 0 ) ? 1.0 : -1.0; const double lx = ::log10( qFabs( x ) ); const double p10 = qFloor( lx ); double fr = qPow( 10.0, lx - p10 ); if ( fr >= 10.0 ) fr = 10.0; else if ( fr >= 5.0 ) fr = 5.0; else if ( fr >= 2.0 ) fr = 2.0; else fr = 1.0; return sign * fr * qPow( 10.0, p10 ); } class QwtScaleEngine::PrivateData { public: PrivateData(): attributes( QwtScaleEngine::NoAttribute ), lowerMargin( 0.0 ), upperMargin( 0.0 ), referenceValue( 0.0 ) { } int attributes; // scale attributes double lowerMargin; // margins double upperMargin; double referenceValue; // reference value }; //! Constructor QwtScaleEngine::QwtScaleEngine() { d_data = new PrivateData; } //! Destructor QwtScaleEngine::~QwtScaleEngine () { delete d_data; } /*! \return the margin at the lower end of the scale The default margin is 0. \sa setMargins() */ double QwtScaleEngine::lowerMargin() const { return d_data->lowerMargin; } /*! \return the margin at the upper end of the scale The default margin is 0. \sa setMargins() */ double QwtScaleEngine::upperMargin() const { return d_data->upperMargin; } /*! \brief Specify margins at the scale's endpoints \param lower minimum distance between the scale's lower boundary and the smallest enclosed value \param upper minimum distance between the scale's upper boundary and the greatest enclosed value Margins can be used to leave a minimum amount of space between the enclosed intervals and the boundaries of the scale. \warning \li QwtLog10ScaleEngine measures the margins in decades. \sa upperMargin(), lowerMargin() */ void QwtScaleEngine::setMargins( double lower, double upper ) { d_data->lowerMargin = qMax( lower, 0.0 ); d_data->upperMargin = qMax( upper, 0.0 ); } /*! Calculate a step size for an interval size \param intervalSize Interval size \param numSteps Number of steps \return Step size */ double QwtScaleEngine::divideInterval( double intervalSize, int numSteps ) const { if ( numSteps <= 0 ) return 0.0; double v = QwtScaleArithmetic::divideEps( intervalSize, numSteps ); return QwtScaleArithmetic::ceil125( v ); } /*! Check if an interval "contains" a value \param interval Interval \param value Value \sa QwtScaleArithmetic::compareEps() */ bool QwtScaleEngine::contains( const QwtInterval &interval, double value ) const { if ( !interval.isValid() ) return false; if ( qwtFuzzyCompare( value, interval.minValue(), interval.width() ) < 0 ) return false; if ( qwtFuzzyCompare( value, interval.maxValue(), interval.width() ) > 0 ) return false; return true; } /*! Remove ticks from a list, that are not inside an interval \param ticks Tick list \param interval Interval \return Stripped tick list */ QList QwtScaleEngine::strip( const QList& ticks, const QwtInterval &interval ) const { if ( !interval.isValid() || ticks.count() == 0 ) return QList(); if ( contains( interval, ticks.first() ) && contains( interval, ticks.last() ) ) { return ticks; } QList strippedTicks; for ( int i = 0; i < ( int )ticks.count(); i++ ) { if ( contains( interval, ticks[i] ) ) strippedTicks += ticks[i]; } return strippedTicks; } /*! \brief Build an interval for a value In case of v == 0.0 the interval is [-0.5, 0.5], otherwide it is [0.5 * v, 1.5 * v] */ QwtInterval QwtScaleEngine::buildInterval( double v ) const { const double delta = ( v == 0.0 ) ? 0.5 : qAbs( 0.5 * v ); return QwtInterval( v - delta, v + delta ); } /*! Change a scale attribute \param attribute Attribute to change \param on On/Off \sa Attribute, testAttribute() */ void QwtScaleEngine::setAttribute( Attribute attribute, bool on ) { if ( on ) d_data->attributes |= attribute; else d_data->attributes &= ( ~attribute ); } /*! Check if a attribute is set. \param attribute Attribute to be tested \sa Attribute, setAttribute() */ bool QwtScaleEngine::testAttribute( Attribute attribute ) const { return bool( d_data->attributes & attribute ); } /*! Change the scale attribute \param attributes Set scale attributes \sa Attribute, attributes() */ void QwtScaleEngine::setAttributes( int attributes ) { d_data->attributes = attributes; } /*! Return the scale attributes \sa Attribute, setAttributes(), testAttribute() */ int QwtScaleEngine::attributes() const { return d_data->attributes; } /*! \brief Specify a reference point \param r new reference value The reference point is needed if options IncludeReference or Symmetric are active. Its default value is 0.0. \sa Attribute */ void QwtScaleEngine::setReference( double r ) { d_data->referenceValue = r; } /*! \return the reference value \sa setReference(), setAttribute() */ double QwtScaleEngine::reference() const { return d_data->referenceValue; } /*! Return a transformation, for linear scales */ QwtScaleTransformation *QwtLinearScaleEngine::transformation() const { return new QwtScaleTransformation( QwtScaleTransformation::Linear ); } /*! Align and divide an interval \param maxNumSteps Max. number of steps \param x1 First limit of the interval (In/Out) \param x2 Second limit of the interval (In/Out) \param stepSize Step size (Out) \sa setAttribute() */ void QwtLinearScaleEngine::autoScale( int maxNumSteps, double &x1, double &x2, double &stepSize ) const { QwtInterval interval( x1, x2 ); interval = interval.normalized(); interval.setMinValue( interval.minValue() - lowerMargin() ); interval.setMaxValue( interval.maxValue() + upperMargin() ); if ( testAttribute( QwtScaleEngine::Symmetric ) ) interval = interval.symmetrize( reference() ); if ( testAttribute( QwtScaleEngine::IncludeReference ) ) interval = interval.extend( reference() ); if ( interval.width() == 0.0 ) interval = buildInterval( interval.minValue() ); stepSize = divideInterval( interval.width(), qMax( maxNumSteps, 1 ) ); if ( !testAttribute( QwtScaleEngine::Floating ) ) interval = align( interval, stepSize ); x1 = interval.minValue(); x2 = interval.maxValue(); if ( testAttribute( QwtScaleEngine::Inverted ) ) { qSwap( x1, x2 ); stepSize = -stepSize; } } /*! \brief Calculate a scale division \param x1 First interval limit \param x2 Second interval limit \param maxMajSteps Maximum for the number of major steps \param maxMinSteps Maximum number of minor steps \param stepSize Step size. If stepSize == 0, the scaleEngine calculates one. \sa QwtScaleEngine::stepSize(), QwtScaleEngine::subDivide() */ QwtScaleDiv QwtLinearScaleEngine::divideScale( double x1, double x2, int maxMajSteps, int maxMinSteps, double stepSize ) const { QwtInterval interval = QwtInterval( x1, x2 ).normalized(); if ( interval.width() <= 0 ) return QwtScaleDiv(); stepSize = qAbs( stepSize ); if ( stepSize == 0.0 ) { if ( maxMajSteps < 1 ) maxMajSteps = 1; stepSize = divideInterval( interval.width(), maxMajSteps ); } QwtScaleDiv scaleDiv; if ( stepSize != 0.0 ) { QList ticks[QwtScaleDiv::NTickTypes]; buildTicks( interval, stepSize, maxMinSteps, ticks ); scaleDiv = QwtScaleDiv( interval, ticks ); } if ( x1 > x2 ) scaleDiv.invert(); return scaleDiv; } /*! \brief Calculate ticks for an interval \param interval Interval \param stepSize Step size \param maxMinSteps Maximum number of minor steps \param ticks Arrays to be filled with the calculated ticks \sa buildMajorTicks(), buildMinorTicks */ void QwtLinearScaleEngine::buildTicks( const QwtInterval& interval, double stepSize, int maxMinSteps, QList ticks[QwtScaleDiv::NTickTypes] ) const { const QwtInterval boundingInterval = align( interval, stepSize ); ticks[QwtScaleDiv::MajorTick] = buildMajorTicks( boundingInterval, stepSize ); if ( maxMinSteps > 0 ) { buildMinorTicks( ticks[QwtScaleDiv::MajorTick], maxMinSteps, stepSize, ticks[QwtScaleDiv::MinorTick], ticks[QwtScaleDiv::MediumTick] ); } for ( int i = 0; i < QwtScaleDiv::NTickTypes; i++ ) { ticks[i] = strip( ticks[i], interval ); // ticks very close to 0.0 are // explicitely set to 0.0 for ( int j = 0; j < ( int )ticks[i].count(); j++ ) { if ( qwtFuzzyCompare( ticks[i][j], 0.0, stepSize ) == 0 ) ticks[i][j] = 0.0; } } } /*! \brief Calculate major ticks for an interval \param interval Interval \param stepSize Step size \return Calculated ticks */ QList QwtLinearScaleEngine::buildMajorTicks( const QwtInterval &interval, double stepSize ) const { int numTicks = qRound( interval.width() / stepSize ) + 1; if ( numTicks > 10000 ) numTicks = 10000; QList ticks; ticks += interval.minValue(); for ( int i = 1; i < numTicks - 1; i++ ) ticks += interval.minValue() + i * stepSize; ticks += interval.maxValue(); return ticks; } /*! \brief Calculate minor/medium ticks for major ticks \param majorTicks Major ticks \param maxMinSteps Maximum number of minor steps \param stepSize Step size \param minorTicks Array to be filled with the calculated minor ticks \param mediumTicks Array to be filled with the calculated medium ticks */ void QwtLinearScaleEngine::buildMinorTicks( const QList& majorTicks, int maxMinSteps, double stepSize, QList &minorTicks, QList &mediumTicks ) const { double minStep = divideInterval( stepSize, maxMinSteps ); if ( minStep == 0.0 ) return; // # ticks per interval int numTicks = qCeil( qAbs( stepSize / minStep ) ) - 1; // Do the minor steps fit into the interval? if ( qwtFuzzyCompare( ( numTicks + 1 ) * qAbs( minStep ), qAbs( stepSize ), stepSize ) > 0 ) { numTicks = 1; minStep = stepSize * 0.5; } int medIndex = -1; if ( numTicks % 2 ) medIndex = numTicks / 2; // calculate minor ticks for ( int i = 0; i < ( int )majorTicks.count(); i++ ) { double val = majorTicks[i]; for ( int k = 0; k < numTicks; k++ ) { val += minStep; double alignedValue = val; if ( qwtFuzzyCompare( val, 0.0, stepSize ) == 0 ) alignedValue = 0.0; if ( k == medIndex ) mediumTicks += alignedValue; else minorTicks += alignedValue; } } } /*! \brief Align an interval to a step size The limits of an interval are aligned that both are integer multiples of the step size. \param interval Interval \param stepSize Step size \return Aligned interval */ QwtInterval QwtLinearScaleEngine::align( const QwtInterval &interval, double stepSize ) const { double x1 = QwtScaleArithmetic::floorEps( interval.minValue(), stepSize ); if ( qwtFuzzyCompare( interval.minValue(), x1, stepSize ) == 0 ) x1 = interval.minValue(); double x2 = QwtScaleArithmetic::ceilEps( interval.maxValue(), stepSize ); if ( qwtFuzzyCompare( interval.maxValue(), x2, stepSize ) == 0 ) x2 = interval.maxValue(); return QwtInterval( x1, x2 ); } /*! Return a transformation, for logarithmic (base 10) scales */ QwtScaleTransformation *QwtLog10ScaleEngine::transformation() const { return new QwtScaleTransformation( QwtScaleTransformation::Log10 ); } /*! Align and divide an interval \param maxNumSteps Max. number of steps \param x1 First limit of the interval (In/Out) \param x2 Second limit of the interval (In/Out) \param stepSize Step size (Out) \sa QwtScaleEngine::setAttribute() */ void QwtLog10ScaleEngine::autoScale( int maxNumSteps, double &x1, double &x2, double &stepSize ) const { if ( x1 > x2 ) qSwap( x1, x2 ); QwtInterval interval( x1 / qPow( 10.0, lowerMargin() ), x2 * qPow( 10.0, upperMargin() ) ); if ( interval.maxValue() / interval.minValue() < 10.0 ) { // scale width is less than one decade -> build linear scale QwtLinearScaleEngine linearScaler; linearScaler.setAttributes( attributes() ); linearScaler.setReference( reference() ); linearScaler.setMargins( lowerMargin(), upperMargin() ); linearScaler.autoScale( maxNumSteps, x1, x2, stepSize ); stepSize = ::log10( stepSize ); return; } double logRef = 1.0; if ( reference() > LOG_MIN / 2 ) logRef = qMin( reference(), LOG_MAX / 2 ); if ( testAttribute( QwtScaleEngine::Symmetric ) ) { const double delta = qMax( interval.maxValue() / logRef, logRef / interval.minValue() ); interval.setInterval( logRef / delta, logRef * delta ); } if ( testAttribute( QwtScaleEngine::IncludeReference ) ) interval = interval.extend( logRef ); interval = interval.limited( LOG_MIN, LOG_MAX ); if ( interval.width() == 0.0 ) interval = buildInterval( interval.minValue() ); stepSize = divideInterval( log10( interval ).width(), qMax( maxNumSteps, 1 ) ); if ( stepSize < 1.0 ) stepSize = 1.0; if ( !testAttribute( QwtScaleEngine::Floating ) ) interval = align( interval, stepSize ); x1 = interval.minValue(); x2 = interval.maxValue(); if ( testAttribute( QwtScaleEngine::Inverted ) ) { qSwap( x1, x2 ); stepSize = -stepSize; } } /*! \brief Calculate a scale division \param x1 First interval limit \param x2 Second interval limit \param maxMajSteps Maximum for the number of major steps \param maxMinSteps Maximum number of minor steps \param stepSize Step size. If stepSize == 0, the scaleEngine calculates one. \sa QwtScaleEngine::stepSize(), QwtLog10ScaleEngine::subDivide() */ QwtScaleDiv QwtLog10ScaleEngine::divideScale( double x1, double x2, int maxMajSteps, int maxMinSteps, double stepSize ) const { QwtInterval interval = QwtInterval( x1, x2 ).normalized(); interval = interval.limited( LOG_MIN, LOG_MAX ); if ( interval.width() <= 0 ) return QwtScaleDiv(); if ( interval.maxValue() / interval.minValue() < 10.0 ) { // scale width is less than one decade -> build linear scale QwtLinearScaleEngine linearScaler; linearScaler.setAttributes( attributes() ); linearScaler.setReference( reference() ); linearScaler.setMargins( lowerMargin(), upperMargin() ); if ( stepSize != 0.0 ) stepSize = qPow( 10.0, stepSize ); return linearScaler.divideScale( x1, x2, maxMajSteps, maxMinSteps, stepSize ); } stepSize = qAbs( stepSize ); if ( stepSize == 0.0 ) { if ( maxMajSteps < 1 ) maxMajSteps = 1; stepSize = divideInterval( log10( interval ).width(), maxMajSteps ); if ( stepSize < 1.0 ) stepSize = 1.0; // major step must be >= 1 decade } QwtScaleDiv scaleDiv; if ( stepSize != 0.0 ) { QList ticks[QwtScaleDiv::NTickTypes]; buildTicks( interval, stepSize, maxMinSteps, ticks ); scaleDiv = QwtScaleDiv( interval, ticks ); } if ( x1 > x2 ) scaleDiv.invert(); return scaleDiv; } /*! \brief Calculate ticks for an interval \param interval Interval \param maxMinSteps Maximum number of minor steps \param stepSize Step size \param ticks Arrays to be filled with the calculated ticks \sa buildMajorTicks(), buildMinorTicks */ void QwtLog10ScaleEngine::buildTicks( const QwtInterval& interval, double stepSize, int maxMinSteps, QList ticks[QwtScaleDiv::NTickTypes] ) const { const QwtInterval boundingInterval = align( interval, stepSize ); ticks[QwtScaleDiv::MajorTick] = buildMajorTicks( boundingInterval, stepSize ); if ( maxMinSteps > 0 ) { ticks[QwtScaleDiv::MinorTick] = buildMinorTicks( ticks[QwtScaleDiv::MajorTick], maxMinSteps, stepSize ); } for ( int i = 0; i < QwtScaleDiv::NTickTypes; i++ ) ticks[i] = strip( ticks[i], interval ); } /*! \brief Calculate major ticks for an interval \param interval Interval \param stepSize Step size \return Calculated ticks */ QList QwtLog10ScaleEngine::buildMajorTicks( const QwtInterval &interval, double stepSize ) const { double width = log10( interval ).width(); int numTicks = qRound( width / stepSize ) + 1; if ( numTicks > 10000 ) numTicks = 10000; const double lxmin = ::log( interval.minValue() ); const double lxmax = ::log( interval.maxValue() ); const double lstep = ( lxmax - lxmin ) / double( numTicks - 1 ); QList ticks; ticks += interval.minValue(); for ( int i = 1; i < numTicks; i++ ) ticks += qExp( lxmin + double( i ) * lstep ); ticks += interval.maxValue(); return ticks; } /*! \brief Calculate minor/medium ticks for major ticks \param majorTicks Major ticks \param maxMinSteps Maximum number of minor steps \param stepSize Step size */ QList QwtLog10ScaleEngine::buildMinorTicks( const QList &majorTicks, int maxMinSteps, double stepSize ) const { if ( stepSize < 1.1 ) // major step width is one decade { if ( maxMinSteps < 1 ) return QList(); int k0, kstep, kmax; if ( maxMinSteps >= 8 ) { k0 = 2; kmax = 9; kstep = 1; } else if ( maxMinSteps >= 4 ) { k0 = 2; kmax = 8; kstep = 2; } else if ( maxMinSteps >= 2 ) { k0 = 2; kmax = 5; kstep = 3; } else { k0 = 5; kmax = 5; kstep = 1; } QList minorTicks; for ( int i = 0; i < ( int )majorTicks.count(); i++ ) { const double v = majorTicks[i]; for ( int k = k0; k <= kmax; k += kstep ) minorTicks += v * double( k ); } return minorTicks; } else // major step > one decade { double minStep = divideInterval( stepSize, maxMinSteps ); if ( minStep == 0.0 ) return QList(); if ( minStep < 1.0 ) minStep = 1.0; // # subticks per interval int nMin = qRound( stepSize / minStep ) - 1; // Do the minor steps fit into the interval? if ( qwtFuzzyCompare( ( nMin + 1 ) * minStep, qAbs( stepSize ), stepSize ) > 0 ) { nMin = 0; } if ( nMin < 1 ) return QList(); // no subticks // substep factor = 10^substeps const qreal minFactor = qMax( qPow( 10.0, minStep ), qreal( 10.0 ) ); QList minorTicks; for ( int i = 0; i < ( int )majorTicks.count(); i++ ) { double val = majorTicks[i]; for ( int k = 0; k < nMin; k++ ) { val *= minFactor; minorTicks += val; } } return minorTicks; } } /*! \brief Align an interval to a step size The limits of an interval are aligned that both are integer multiples of the step size. \param interval Interval \param stepSize Step size \return Aligned interval */ QwtInterval QwtLog10ScaleEngine::align( const QwtInterval &interval, double stepSize ) const { const QwtInterval intv = log10( interval ); double x1 = QwtScaleArithmetic::floorEps( intv.minValue(), stepSize ); if ( qwtFuzzyCompare( interval.minValue(), x1, stepSize ) == 0 ) x1 = interval.minValue(); double x2 = QwtScaleArithmetic::ceilEps( intv.maxValue(), stepSize ); if ( qwtFuzzyCompare( interval.maxValue(), x2, stepSize ) == 0 ) x2 = interval.maxValue(); return pow10( QwtInterval( x1, x2 ) ); } /*! Return the interval [log10(interval.minValue(), log10(interval.maxValue] */ QwtInterval QwtLog10ScaleEngine::log10( const QwtInterval &interval ) const { return QwtInterval( ::log10( interval.minValue() ), ::log10( interval.maxValue() ) ); } /*! Return the interval [pow10(interval.minValue(), pow10(interval.maxValue] */ QwtInterval QwtLog10ScaleEngine::pow10( const QwtInterval &interval ) const { return QwtInterval( qPow( 10.0, interval.minValue() ), qPow( 10.0, interval.maxValue() ) ); } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_scale_engine.h000066400000000000000000000142621320135501600223640ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SCALE_ENGINE_H #define QWT_SCALE_ENGINE_H #include "qwt_global.h" #include "qwt_scale_div.h" #include "qwt_interval.h" class QwtScaleTransformation; /*! \brief Arithmetic including a tolerance */ class QWT_EXPORT QwtScaleArithmetic { public: static double ceilEps( double value, double intervalSize ); static double floorEps( double value, double intervalSize ); static double divideEps( double interval, double steps ); static double ceil125( double x ); static double floor125( double x ); }; /*! \brief Base class for scale engines. A scale engine trys to find "reasonable" ranges and step sizes for scales. The layout of the scale can be varied with setAttribute(). Qwt offers implementations for logarithmic (log10) and linear scales. Contributions for other types of scale engines (date/time, log2 ... ) are welcome. */ class QWT_EXPORT QwtScaleEngine { public: /*! - IncludeReference\n Build a scale which includes the reference() value. - Symmetric\n Build a scale which is symmetric to the reference() value. - Floating\n The endpoints of the scale are supposed to be equal the outmost included values plus the specified margins (see setMargins()). If this attribute is *not* set, the endpoints of the scale will be integer multiples of the step size. - Inverted\n Turn the scale upside down. \sa setAttribute(), testAttribute(), reference(), lowerMargin(), upperMargin() */ enum Attribute { NoAttribute = 0, IncludeReference = 1, Symmetric = 2, Floating = 4, Inverted = 8 }; explicit QwtScaleEngine(); virtual ~QwtScaleEngine(); void setAttribute( Attribute, bool on = true ); bool testAttribute( Attribute ) const; void setAttributes( int ); int attributes() const; void setReference( double reference ); double reference() const; void setMargins( double lower, double upper ); double lowerMargin() const; double upperMargin() const; /*! Align and divide an interval \param maxNumSteps Max. number of steps \param x1 First limit of the interval (In/Out) \param x2 Second limit of the interval (In/Out) \param stepSize Step size (Return value) */ virtual void autoScale( int maxNumSteps, double &x1, double &x2, double &stepSize ) const = 0; /*! \brief Calculate a scale division \param x1 First interval limit \param x2 Second interval limit \param maxMajSteps Maximum for the number of major steps \param maxMinSteps Maximum number of minor steps \param stepSize Step size. If stepSize == 0.0, the scaleEngine calculates one. */ virtual QwtScaleDiv divideScale( double x1, double x2, int maxMajSteps, int maxMinSteps, double stepSize = 0.0 ) const = 0; //! \return a transformation virtual QwtScaleTransformation *transformation() const = 0; protected: bool contains( const QwtInterval &, double val ) const; QList strip( const QList&, const QwtInterval & ) const; double divideInterval( double interval, int numSteps ) const; QwtInterval buildInterval( double v ) const; private: class PrivateData; PrivateData *d_data; }; /*! \brief A scale engine for linear scales The step size will fit into the pattern \f$\left\{ 1,2,5\right\} \cdot 10^{n}\f$, where n is an integer. */ class QWT_EXPORT QwtLinearScaleEngine: public QwtScaleEngine { public: virtual void autoScale( int maxSteps, double &x1, double &x2, double &stepSize ) const; virtual QwtScaleDiv divideScale( double x1, double x2, int numMajorSteps, int numMinorSteps, double stepSize = 0.0 ) const; virtual QwtScaleTransformation *transformation() const; protected: QwtInterval align( const QwtInterval&, double stepSize ) const; void buildTicks( const QwtInterval &, double stepSize, int maxMinSteps, QList ticks[QwtScaleDiv::NTickTypes] ) const; QList buildMajorTicks( const QwtInterval &interval, double stepSize ) const; void buildMinorTicks( const QList& majorTicks, int maxMinMark, double step, QList &, QList & ) const; }; /*! \brief A scale engine for logarithmic (base 10) scales The step size is measured in *decades* and the major step size will be adjusted to fit the pattern \f$\left\{ 1,2,3,5\right\} \cdot 10^{n}\f$, where n is a natural number including zero. \warning the step size as well as the margins are measured in *decades*. */ class QWT_EXPORT QwtLog10ScaleEngine: public QwtScaleEngine { public: virtual void autoScale( int maxSteps, double &x1, double &x2, double &stepSize ) const; virtual QwtScaleDiv divideScale( double x1, double x2, int numMajorSteps, int numMinorSteps, double stepSize = 0.0 ) const; virtual QwtScaleTransformation *transformation() const; protected: QwtInterval log10( const QwtInterval& ) const; QwtInterval pow10( const QwtInterval& ) const; QwtInterval align( const QwtInterval&, double stepSize ) const; void buildTicks( const QwtInterval &, double stepSize, int maxMinSteps, QList ticks[QwtScaleDiv::NTickTypes] ) const; QList buildMajorTicks( const QwtInterval &interval, double stepSize ) const; QList buildMinorTicks( const QList& majorTicks, int maxMinMark, double step ) const; }; #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_scale_map.cpp000066400000000000000000000165051320135501600222310ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_scale_map.h" #include #include #include #include #if QT_VERSION < 0x040601 #define qExp(x) ::exp(x) #endif const double QwtScaleMap::LogMin = 1.0e-150; const double QwtScaleMap::LogMax = 1.0e150; //! Constructor for a linear transformation QwtScaleTransformation::QwtScaleTransformation( Type type ): d_type( type ) { } //! Destructor QwtScaleTransformation::~QwtScaleTransformation() { } //! Create a clone of the transformation QwtScaleTransformation *QwtScaleTransformation::copy() const { return new QwtScaleTransformation( d_type ); } /*! \brief Transform a value between 2 linear intervals \param s value related to the interval [s1, s2] \param s1 first border of scale interval \param s2 second border of scale interval \param p1 first border of target interval \param p2 second border of target interval \return
    linear mapping:
    p1 + (p2 - p1) / (s2 - s1) * (s - s1)
    log10 mapping:
    p1 + (p2 - p1) / log(s2 / s1) * log(s / s1)
    */ double QwtScaleTransformation::xForm( double s, double s1, double s2, double p1, double p2 ) const { if ( d_type == Log10 ) return p1 + ( p2 - p1 ) / log( s2 / s1 ) * log( s / s1 ); else return p1 + ( p2 - p1 ) / ( s2 - s1 ) * ( s - s1 ); } /*! \brief Transform a value from a linear to a logarithmic interval \param p value related to the linear interval [p1, p2] \param p1 first border of linear interval \param p2 second border of linear interval \param s1 first border of logarithmic interval \param s2 second border of logarithmic interval \return
    exp((p - p1) / (p2 - p1) * log(s2 / s1)) * s1;
    */ double QwtScaleTransformation::invXForm( double p, double p1, double p2, double s1, double s2 ) const { if ( d_type == Log10 ) return qExp( ( p - p1 ) / ( p2 - p1 ) * log( s2 / s1 ) ) * s1; else return s1 + ( s2 - s1 ) / ( p2 - p1 ) * ( p - p1 ); } /*! \brief Constructor The scale and paint device intervals are both set to [0,1]. */ QwtScaleMap::QwtScaleMap(): d_s1( 0.0 ), d_s2( 1.0 ), d_p1( 0.0 ), d_p2( 1.0 ), d_cnv( 1.0 ) { d_transformation = new QwtScaleTransformation( QwtScaleTransformation::Linear ); } //! Copy constructor QwtScaleMap::QwtScaleMap( const QwtScaleMap& other ): d_s1( other.d_s1 ), d_s2( other.d_s2 ), d_p1( other.d_p1 ), d_p2( other.d_p2 ), d_cnv( other.d_cnv ) { d_transformation = other.d_transformation->copy(); } /*! Destructor */ QwtScaleMap::~QwtScaleMap() { delete d_transformation; } //! Assignment operator QwtScaleMap &QwtScaleMap::operator=( const QwtScaleMap & other ) { d_s1 = other.d_s1; d_s2 = other.d_s2; d_p1 = other.d_p1; d_p2 = other.d_p2; d_cnv = other.d_cnv; delete d_transformation; d_transformation = other.d_transformation->copy(); return *this; } /*! Initialize the map with a transformation */ void QwtScaleMap::setTransformation( QwtScaleTransformation *transformation ) { if ( transformation == NULL ) return; if ( transformation != d_transformation ) { delete d_transformation; d_transformation = transformation; } setScaleInterval( d_s1, d_s2 ); } //! Get the transformation const QwtScaleTransformation *QwtScaleMap::transformation() const { return d_transformation; } /*! \brief Specify the borders of the scale interval \param s1 first border \param s2 second border \warning logarithmic scales might be aligned to [LogMin, LogMax] */ void QwtScaleMap::setScaleInterval( double s1, double s2 ) { if ( d_transformation->type() == QwtScaleTransformation::Log10 ) { if ( s1 < LogMin ) s1 = LogMin; else if ( s1 > LogMax ) s1 = LogMax; if ( s2 < LogMin ) s2 = LogMin; else if ( s2 > LogMax ) s2 = LogMax; } d_s1 = s1; d_s2 = s2; if ( d_transformation->type() != QwtScaleTransformation::Other ) newFactor(); } /*! \brief Specify the borders of the paint device interval \param p1 first border \param p2 second border */ void QwtScaleMap::setPaintInterval( double p1, double p2 ) { d_p1 = p1; d_p2 = p2; if ( d_transformation->type() != QwtScaleTransformation::Other ) newFactor(); } /*! \brief Re-calculate the conversion factor. */ void QwtScaleMap::newFactor() { d_cnv = 0.0; switch ( d_transformation->type() ) { case QwtScaleTransformation::Linear: if ( d_s2 != d_s1 ) d_cnv = ( d_p2 - d_p1 ) / ( d_s2 - d_s1 ); break; case QwtScaleTransformation::Log10: if ( d_s1 != 0 ) d_cnv = ( d_p2 - d_p1 ) / log( d_s2 / d_s1 ); break; default:; } } /*! Transform a rectangle \param xMap X map \param yMap Y map \param rect Rectangle in scale coordinates \return Rectangle in paint coordinates \sa invTransform() */ QRectF QwtScaleMap::transform( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &rect ) { double x1 = xMap.transform( rect.left() ); double x2 = xMap.transform( rect.right() ); double y1 = yMap.transform( rect.top() ); double y2 = yMap.transform( rect.bottom() ); if ( x2 < x1 ) qSwap( x1, x2 ); if ( y2 < y1 ) qSwap( y1, y2 ); if ( qwtFuzzyCompare( x1, 0.0, x2 - x1 ) == 0 ) x1 = 0.0; if ( qwtFuzzyCompare( x2, 0.0, x2 - x1 ) == 0 ) x2 = 0.0; if ( qwtFuzzyCompare( y1, 0.0, y2 - y1 ) == 0 ) y1 = 0.0; if ( qwtFuzzyCompare( y2, 0.0, y2 - y1 ) == 0 ) y2 = 0.0; return QRectF( x1, y1, x2 - x1 + 1, y2 - y1 + 1 ); } /*! Transform a rectangle from paint to scale coordinates \param xMap X map \param yMap Y map \param rect Rectangle in paint coordinates \return Rectangle in scale coordinates \sa transform() */ QRectF QwtScaleMap::invTransform( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &rect ) { const double x1 = xMap.invTransform( rect.left() ); const double x2 = xMap.invTransform( rect.right() - 1 ); const double y1 = yMap.invTransform( rect.top() ); const double y2 = yMap.invTransform( rect.bottom() - 1 ); const QRectF r( x1, y1, x2 - x1, y2 - y1 ); return r.normalized(); } #ifndef QT_NO_DEBUG_STREAM QDebug operator<<( QDebug debug, const QwtScaleMap &map ) { debug.nospace() << "QwtScaleMap(" << static_cast( map.transformation()->type() ) << ", s:" << map.s1() << "->" << map.s2() << ", p:" << map.p1() << "->" << map.p2() << ")"; return debug.space(); } #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_scale_map.h000066400000000000000000000115101320135501600216650ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SCALE_MAP_H #define QWT_SCALE_MAP_H #include "qwt_global.h" #include "qwt_math.h" #ifndef QT_NO_DEBUG_STREAM #include #endif class QRectF; /*! \brief Operations for linear or logarithmic (base 10) transformations */ class QWT_EXPORT QwtScaleTransformation { public: /*! - Linear\n Transformation between 2 linear scales - Log10 Transformation between a linear and a logarithmic ( base 10 ) scale - Other Any other type of transformation */ enum Type { Linear, Log10, Other }; QwtScaleTransformation( Type type ); virtual ~QwtScaleTransformation(); virtual double xForm( double x, double s1, double s2, double p1, double p2 ) const; virtual double invXForm( double x, double s1, double s2, double p1, double p2 ) const; Type type() const; virtual QwtScaleTransformation *copy() const; private: QwtScaleTransformation(); QwtScaleTransformation &operator=( const QwtScaleTransformation ); const Type d_type; }; //! \return Transformation type inline QwtScaleTransformation::Type QwtScaleTransformation::type() const { return d_type; } /*! \brief A scale map QwtScaleMap offers transformations from a scale into a paint interval and vice versa. */ class QWT_EXPORT QwtScaleMap { public: QwtScaleMap(); QwtScaleMap( const QwtScaleMap& ); ~QwtScaleMap(); QwtScaleMap &operator=( const QwtScaleMap & ); void setTransformation( QwtScaleTransformation * ); const QwtScaleTransformation *transformation() const; void setPaintInterval( double p1, double p2 ); void setScaleInterval( double s1, double s2 ); double transform( double s ) const; double invTransform( double p ) const; double p1() const; double p2() const; double s1() const; double s2() const; double pDist() const; double sDist() const; static const double LogMin; static const double LogMax; static QRectF transform( const QwtScaleMap &, const QwtScaleMap &, const QRectF & ); static QRectF invTransform( const QwtScaleMap &, const QwtScaleMap &, const QRectF & ); bool isInverting() const; private: void newFactor(); double d_s1, d_s2; // scale interval boundaries double d_p1, d_p2; // paint device interval boundaries double d_cnv; // conversion factor QwtScaleTransformation *d_transformation; }; /*! \return First border of the scale interval */ inline double QwtScaleMap::s1() const { return d_s1; } /*! \return Second border of the scale interval */ inline double QwtScaleMap::s2() const { return d_s2; } /*! \return First border of the paint interval */ inline double QwtScaleMap::p1() const { return d_p1; } /*! \return Second border of the paint interval */ inline double QwtScaleMap::p2() const { return d_p2; } /*! \return qwtAbs(p2() - p1()) */ inline double QwtScaleMap::pDist() const { return qAbs( d_p2 - d_p1 ); } /*! \return qwtAbs(s2() - s1()) */ inline double QwtScaleMap::sDist() const { return qAbs( d_s2 - d_s1 ); } /*! Transform a point related to the scale interval into an point related to the interval of the paint device \param s Value relative to the coordinates of the scale */ inline double QwtScaleMap::transform( double s ) const { // try to inline code from QwtScaleTransformation if ( d_transformation->type() == QwtScaleTransformation::Linear ) return d_p1 + ( s - d_s1 ) * d_cnv; if ( d_transformation->type() == QwtScaleTransformation::Log10 ) return d_p1 + log( s / d_s1 ) * d_cnv; return d_transformation->xForm( s, d_s1, d_s2, d_p1, d_p2 ); } /*! Transform an paint device value into a value in the interval of the scale. \param p Value relative to the coordinates of the paint device \sa transform() */ inline double QwtScaleMap::invTransform( double p ) const { return d_transformation->invXForm( p, d_p1, d_p2, d_s1, d_s2 ); } //! \return True, when ( p1() < p2() ) != ( s1() < s2() ) inline bool QwtScaleMap::isInverting() const { return ( ( d_p1 < d_p2 ) != ( d_s1 < d_s2 ) ); } #ifndef QT_NO_DEBUG_STREAM QWT_EXPORT QDebug operator<<( QDebug, const QwtScaleMap & ); #endif #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_scale_widget.cpp000066400000000000000000000537011320135501600227360ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_scale_widget.h" #include "qwt_painter.h" #include "qwt_color_map.h" #include "qwt_scale_map.h" #include "qwt_math.h" #include "qwt_scale_div.h" #include "qwt_text.h" #include #include #include class QwtScaleWidget::PrivateData { public: PrivateData(): scaleDraw( NULL ) { colorBar.colorMap = NULL; } ~PrivateData() { delete scaleDraw; delete colorBar.colorMap; } QwtScaleDraw *scaleDraw; int borderDist[2]; int minBorderDist[2]; int scaleLength; int margin; int titleOffset; int spacing; QwtText title; int layoutFlags; struct t_colorBar { bool isEnabled; int width; QwtInterval interval; QwtColorMap *colorMap; } colorBar; }; /*! \brief Create a scale with the position QwtScaleWidget::Left \param parent Parent widget */ QwtScaleWidget::QwtScaleWidget( QWidget *parent ): QWidget( parent ) { initScale( QwtScaleDraw::LeftScale ); } /*! \brief Constructor \param align Alignment. \param parent Parent widget */ QwtScaleWidget::QwtScaleWidget( QwtScaleDraw::Alignment align, QWidget *parent ): QWidget( parent ) { initScale( align ); } //! Destructor QwtScaleWidget::~QwtScaleWidget() { delete d_data; } //! Initialize the scale void QwtScaleWidget::initScale( QwtScaleDraw::Alignment align ) { d_data = new PrivateData; d_data->layoutFlags = 0; if ( align == QwtScaleDraw::RightScale ) d_data->layoutFlags |= TitleInverted; d_data->borderDist[0] = 0; d_data->borderDist[1] = 0; d_data->minBorderDist[0] = 0; d_data->minBorderDist[1] = 0; d_data->margin = 4; d_data->titleOffset = 0; d_data->spacing = 2; d_data->scaleDraw = new QwtScaleDraw; d_data->scaleDraw->setAlignment( align ); d_data->scaleDraw->setLength( 10 ); d_data->colorBar.colorMap = new QwtLinearColorMap(); d_data->colorBar.isEnabled = false; d_data->colorBar.width = 10; const int flags = Qt::AlignHCenter | Qt::TextExpandTabs | Qt::TextWordWrap; d_data->title.setRenderFlags( flags ); d_data->title.setFont( font() ); QSizePolicy policy( QSizePolicy::MinimumExpanding, QSizePolicy::Fixed ); if ( d_data->scaleDraw->orientation() == Qt::Vertical ) policy.transpose(); setSizePolicy( policy ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); } /*! Toggle an layout flag \param flag Layout flag \param on true/false \sa testLayoutFlag(), LayoutFlag */ void QwtScaleWidget::setLayoutFlag( LayoutFlag flag, bool on ) { if ( ( ( d_data->layoutFlags & flag ) != 0 ) != on ) { if ( on ) d_data->layoutFlags |= flag; else d_data->layoutFlags &= ~flag; } } /*! Test a layout flag \param flag Layout flag \return true/false \sa setLayoutFlag(), LayoutFlag */ bool QwtScaleWidget::testLayoutFlag( LayoutFlag flag ) const { return ( d_data->layoutFlags & flag ); } /*! Give title new text contents \param title New title \sa title(), setTitle(const QwtText &); */ void QwtScaleWidget::setTitle( const QString &title ) { if ( d_data->title.text() != title ) { d_data->title.setText( title ); layoutScale(); } } /*! Give title new text contents \param title New title \sa title() \warning The title flags are interpreted in direction of the label, AlignTop, AlignBottom can't be set as the title will always be aligned to the scale. */ void QwtScaleWidget::setTitle( const QwtText &title ) { QwtText t = title; const int flags = title.renderFlags() & ~( Qt::AlignTop | Qt::AlignBottom ); t.setRenderFlags( flags ); if ( t != d_data->title ) { d_data->title = t; layoutScale(); } } /*! Change the alignment \param alignment New alignment \sa alignment() */ void QwtScaleWidget::setAlignment( QwtScaleDraw::Alignment alignment ) { if ( !testAttribute( Qt::WA_WState_OwnSizePolicy ) ) { QSizePolicy policy( QSizePolicy::MinimumExpanding, QSizePolicy::Fixed ); if ( d_data->scaleDraw->orientation() == Qt::Vertical ) policy.transpose(); setSizePolicy( policy ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); } if ( d_data->scaleDraw ) d_data->scaleDraw->setAlignment( alignment ); layoutScale(); } /*! \return position \sa setPosition() */ QwtScaleDraw::Alignment QwtScaleWidget::alignment() const { if ( !scaleDraw() ) return QwtScaleDraw::LeftScale; return scaleDraw()->alignment(); } /*! Specify distances of the scale's endpoints from the widget's borders. The actual borders will never be less than minimum border distance. \param dist1 Left or top Distance \param dist2 Right or bottom distance \sa borderDist() */ void QwtScaleWidget::setBorderDist( int dist1, int dist2 ) { if ( dist1 != d_data->borderDist[0] || dist2 != d_data->borderDist[1] ) { d_data->borderDist[0] = dist1; d_data->borderDist[1] = dist2; layoutScale(); } } /*! \brief Specify the margin to the colorBar/base line. \param margin Margin \sa margin() */ void QwtScaleWidget::setMargin( int margin ) { margin = qMax( 0, margin ); if ( margin != d_data->margin ) { d_data->margin = margin; layoutScale(); } } /*! \brief Specify the distance between color bar, scale and title \param spacing Spacing \sa spacing() */ void QwtScaleWidget::setSpacing( int spacing ) { spacing = qMax( 0, spacing ); if ( spacing != d_data->spacing ) { d_data->spacing = spacing; layoutScale(); } } /*! \brief Change the alignment for the labels. \sa QwtScaleDraw::setLabelAlignment(), setLabelRotation() */ void QwtScaleWidget::setLabelAlignment( Qt::Alignment alignment ) { d_data->scaleDraw->setLabelAlignment( alignment ); layoutScale(); } /*! \brief Change the rotation for the labels. See QwtScaleDraw::setLabelRotation(). \param rotation Rotation \sa QwtScaleDraw::setLabelRotation(), setLabelFlags() */ void QwtScaleWidget::setLabelRotation( double rotation ) { d_data->scaleDraw->setLabelRotation( rotation ); layoutScale(); } /*! Set a scale draw sd has to be created with new and will be deleted in ~QwtScaleWidget() or the next call of setScaleDraw(). \param sd ScaleDraw object \sa scaleDraw() */ void QwtScaleWidget::setScaleDraw( QwtScaleDraw *sd ) { if ( sd == NULL || sd == d_data->scaleDraw ) return; if ( d_data->scaleDraw ) sd->setAlignment( d_data->scaleDraw->alignment() ); delete d_data->scaleDraw; d_data->scaleDraw = sd; layoutScale(); } /*! scaleDraw of this scale \sa setScaleDraw(), QwtScaleDraw::setScaleDraw() */ const QwtScaleDraw *QwtScaleWidget::scaleDraw() const { return d_data->scaleDraw; } /*! scaleDraw of this scale \sa QwtScaleDraw::setScaleDraw() */ QwtScaleDraw *QwtScaleWidget::scaleDraw() { return d_data->scaleDraw; } /*! \return title \sa setTitle() */ QwtText QwtScaleWidget::title() const { return d_data->title; } /*! \return start border distance \sa setBorderDist() */ int QwtScaleWidget::startBorderDist() const { return d_data->borderDist[0]; } /*! \return end border distance \sa setBorderDist() */ int QwtScaleWidget::endBorderDist() const { return d_data->borderDist[1]; } /*! \return margin \sa setMargin() */ int QwtScaleWidget::margin() const { return d_data->margin; } /*! \return distance between scale and title \sa setMargin() */ int QwtScaleWidget::spacing() const { return d_data->spacing; } /*! \brief paintEvent */ void QwtScaleWidget::paintEvent( QPaintEvent *event ) { QPainter painter( this ); painter.setClipRegion( event->region() ); draw( &painter ); } /*! \brief draw the scale */ void QwtScaleWidget::draw( QPainter *painter ) const { d_data->scaleDraw->draw( painter, palette() ); if ( d_data->colorBar.isEnabled && d_data->colorBar.width > 0 && d_data->colorBar.interval.isValid() ) { drawColorBar( painter, colorBarRect( rect() ) ); } QRect r = rect(); if ( d_data->scaleDraw->orientation() == Qt::Horizontal ) { r.setLeft( r.left() + d_data->borderDist[0] ); r.setWidth( r.width() - d_data->borderDist[1] ); } else { r.setTop( r.top() + d_data->borderDist[0] ); r.setHeight( r.height() - d_data->borderDist[1] ); } if ( !d_data->title.isEmpty() ) drawTitle( painter, d_data->scaleDraw->alignment(), r ); } /*! Calculate the the rectangle for the color bar \param rect Bounding rectangle for all components of the scale \return Rectabgle for the color bar */ QRectF QwtScaleWidget::colorBarRect( const QRectF& rect ) const { QRectF cr = rect; if ( d_data->scaleDraw->orientation() == Qt::Horizontal ) { cr.setLeft( cr.left() + d_data->borderDist[0] ); cr.setWidth( cr.width() - d_data->borderDist[1] + 1 ); } else { cr.setTop( cr.top() + d_data->borderDist[0] ); cr.setHeight( cr.height() - d_data->borderDist[1] + 1 ); } switch ( d_data->scaleDraw->alignment() ) { case QwtScaleDraw::LeftScale: { cr.setLeft( cr.right() - d_data->margin - d_data->colorBar.width ); cr.setWidth( d_data->colorBar.width ); break; } case QwtScaleDraw::RightScale: { cr.setLeft( cr.left() + d_data->margin ); cr.setWidth( d_data->colorBar.width ); break; } case QwtScaleDraw::BottomScale: { cr.setTop( cr.top() + d_data->margin ); cr.setHeight( d_data->colorBar.width ); break; } case QwtScaleDraw::TopScale: { cr.setTop( cr.bottom() - d_data->margin - d_data->colorBar.width ); cr.setHeight( d_data->colorBar.width ); break; } } return cr; } /*! Event handler for resize event \param event Resize event */ void QwtScaleWidget::resizeEvent( QResizeEvent * ) { layoutScale( false ); } /*! Recalculate the scale's geometry and layout based on the current rect and fonts. \param update_geometry Notify the layout system and call update to redraw the scale */ void QwtScaleWidget::layoutScale( bool update_geometry ) { int bd0, bd1; getBorderDistHint( bd0, bd1 ); if ( d_data->borderDist[0] > bd0 ) bd0 = d_data->borderDist[0]; if ( d_data->borderDist[1] > bd1 ) bd1 = d_data->borderDist[1]; int colorBarWidth = 0; if ( d_data->colorBar.isEnabled && d_data->colorBar.interval.isValid() ) colorBarWidth = d_data->colorBar.width + d_data->spacing; const QRectF r = rect(); double x, y, length; if ( d_data->scaleDraw->orientation() == Qt::Vertical ) { y = r.top() + bd0; length = r.height() - ( bd0 + bd1 ); if ( d_data->scaleDraw->alignment() == QwtScaleDraw::LeftScale ) x = r.right() - 1.0 - d_data->margin - colorBarWidth; else x = r.left() + d_data->margin + colorBarWidth; } else { x = r.left() + bd0; length = r.width() - ( bd0 + bd1 ); if ( d_data->scaleDraw->alignment() == QwtScaleDraw::BottomScale ) y = r.top() + d_data->margin + colorBarWidth; else y = r.bottom() - 1.0 - d_data->margin - colorBarWidth; } d_data->scaleDraw->move( x, y ); d_data->scaleDraw->setLength( length ); const int extent = qCeil( d_data->scaleDraw->extent( font() ) ); d_data->titleOffset = d_data->margin + d_data->spacing + colorBarWidth + extent; if ( update_geometry ) { updateGeometry(); update(); } } /*! Draw the color bar of the scale widget \param painter Painter \param rect Bounding rectangle for the color bar \sa setColorBarEnabled() */ void QwtScaleWidget::drawColorBar( QPainter *painter, const QRectF& rect ) const { if ( !d_data->colorBar.interval.isValid() ) return; const QwtScaleDraw* sd = d_data->scaleDraw; QwtPainter::drawColorBar( painter, *d_data->colorBar.colorMap, d_data->colorBar.interval.normalized(), sd->map(), sd->orientation(), rect ); } /*! Rotate and paint a title according to its position into a given rectangle. \param painter Painter \param align Alignment \param rect Bounding rectangle */ void QwtScaleWidget::drawTitle( QPainter *painter, QwtScaleDraw::Alignment align, const QRectF &rect ) const { QRectF r = rect; double angle; int flags = d_data->title.renderFlags() & ~( Qt::AlignTop | Qt::AlignBottom | Qt::AlignVCenter ); switch ( align ) { case QwtScaleDraw::LeftScale: angle = -90.0; flags |= Qt::AlignTop; r.setRect( r.left(), r.bottom(), r.height(), r.width() - d_data->titleOffset ); break; case QwtScaleDraw::RightScale: angle = -90.0; flags |= Qt::AlignTop; r.setRect( r.left() + d_data->titleOffset, r.bottom(), r.height(), r.width() - d_data->titleOffset ); break; case QwtScaleDraw::BottomScale: angle = 0.0; flags |= Qt::AlignBottom; r.setTop( r.top() + d_data->titleOffset ); break; case QwtScaleDraw::TopScale: default: angle = 0.0; flags |= Qt::AlignTop; r.setBottom( r.bottom() - d_data->titleOffset ); break; } if ( d_data->layoutFlags & TitleInverted ) { if ( align == QwtScaleDraw::LeftScale || align == QwtScaleDraw::RightScale ) { angle = -angle; r.setRect( r.x() + r.height(), r.y() - r.width(), r.width(), r.height() ); } } painter->save(); painter->setFont( font() ); painter->setPen( palette().color( QPalette::Text ) ); painter->translate( r.x(), r.y() ); if ( angle != 0.0 ) painter->rotate( angle ); QwtText title = d_data->title; title.setRenderFlags( flags ); title.draw( painter, QRect( 0, 0, r.width(), r.height() ) ); painter->restore(); } /*! \brief Notify a change of the scale This virtual function can be overloaded by derived classes. The default implementation updates the geometry and repaints the widget. */ void QwtScaleWidget::scaleChange() { layoutScale(); } /*! \return a size hint */ QSize QwtScaleWidget::sizeHint() const { return minimumSizeHint(); } /*! \return a minimum size hint */ QSize QwtScaleWidget::minimumSizeHint() const { const Qt::Orientation o = d_data->scaleDraw->orientation(); // Border Distance cannot be less than the scale borderDistHint // Note, the borderDistHint is already included in minHeight/minWidth int length = 0; int mbd1, mbd2; getBorderDistHint( mbd1, mbd2 ); length += qMax( 0, d_data->borderDist[0] - mbd1 ); length += qMax( 0, d_data->borderDist[1] - mbd2 ); length += d_data->scaleDraw->minLength( font() ); int dim = dimForLength( length, font() ); if ( length < dim ) { // compensate for long titles length = dim; dim = dimForLength( length, font() ); } QSize size( length + 2, dim ); if ( o == Qt::Vertical ) size.transpose(); return size; } /*! \brief Find the height of the title for a given width. \param width Width \return height Height */ int QwtScaleWidget::titleHeightForWidth( int width ) const { return d_data->title.heightForWidth( width, font() ); } /*! \brief Find the minimum dimension for a given length. dim is the height, length the width seen in direction of the title. \param length width for horizontal, height for vertical scales \param scaleFont Font of the scale \return height for horizontal, width for vertical scales */ int QwtScaleWidget::dimForLength( int length, const QFont &scaleFont ) const { const int extent = qCeil( d_data->scaleDraw->extent( scaleFont ) ); int dim = d_data->margin + extent + 1; if ( !d_data->title.isEmpty() ) dim += titleHeightForWidth( length ) + d_data->spacing; if ( d_data->colorBar.isEnabled && d_data->colorBar.interval.isValid() ) dim += d_data->colorBar.width + d_data->spacing; return dim; } /*! \brief Calculate a hint for the border distances. This member function calculates the distance of the scale's endpoints from the widget borders which is required for the mark labels to fit into the widget. The maximum of this distance an the minimum border distance is returned. \warning
    • The minimum border distance depends on the font.
    \sa setMinBorderDist(), getMinBorderDist(), setBorderDist() */ void QwtScaleWidget::getBorderDistHint( int &start, int &end ) const { d_data->scaleDraw->getBorderDistHint( font(), start, end ); if ( start < d_data->minBorderDist[0] ) start = d_data->minBorderDist[0]; if ( end < d_data->minBorderDist[1] ) end = d_data->minBorderDist[1]; } /*! Set a minimum value for the distances of the scale's endpoints from the widget borders. This is useful to avoid that the scales are "jumping", when the tick labels or their positions change often. \param start Minimum for the start border \param end Minimum for the end border \sa getMinBorderDist(), getBorderDistHint() */ void QwtScaleWidget::setMinBorderDist( int start, int end ) { d_data->minBorderDist[0] = start; d_data->minBorderDist[1] = end; } /*! Get the minimum value for the distances of the scale's endpoints from the widget borders. \sa setMinBorderDist(), getBorderDistHint() */ void QwtScaleWidget::getMinBorderDist( int &start, int &end ) const { start = d_data->minBorderDist[0]; end = d_data->minBorderDist[1]; } /*! \brief Assign a scale division The scale division determines where to set the tick marks. \param transformation Transformation, needed to translate between scale and pixal values \param scaleDiv Scale Division \sa For more information about scale divisions, see QwtScaleDiv. */ void QwtScaleWidget::setScaleDiv( QwtScaleTransformation *transformation, const QwtScaleDiv &scaleDiv ) { QwtScaleDraw *sd = d_data->scaleDraw; if ( sd->scaleDiv() != scaleDiv || sd->map().transformation()->type() != transformation->type() ) { sd->setTransformation( transformation ); sd->setScaleDiv( scaleDiv ); layoutScale(); Q_EMIT scaleDivChanged(); } else { /* The transformation doesn't anything different as the previous one. So we better throw it silently away instead of initiating heavy updates */ delete transformation; } } /*! En/disable a color bar associated to the scale \sa isColorBarEnabled(), setColorBarWidth() */ void QwtScaleWidget::setColorBarEnabled( bool on ) { if ( on != d_data->colorBar.isEnabled ) { d_data->colorBar.isEnabled = on; layoutScale(); } } /*! \return true, when the color bar is enabled \sa setColorBarEnabled(), setColorBarWidth() */ bool QwtScaleWidget::isColorBarEnabled() const { return d_data->colorBar.isEnabled; } /*! Set the width of the color bar \param width Width \sa colorBarWidth(), setColorBarEnabled() */ void QwtScaleWidget::setColorBarWidth( int width ) { if ( width != d_data->colorBar.width ) { d_data->colorBar.width = width; if ( isColorBarEnabled() ) layoutScale(); } } /*! \return Width of the color bar \sa setColorBarEnabled(), setColorBarEnabled() */ int QwtScaleWidget::colorBarWidth() const { return d_data->colorBar.width; } /*! \return Value interval for the color bar \sa setColorMap(), colorMap() */ QwtInterval QwtScaleWidget::colorBarInterval() const { return d_data->colorBar.interval; } /*! Set the color map and value interval, that are used for displaying the color bar. \param interval Value interval \param colorMap Color map \sa colorMap(), colorBarInterval() */ void QwtScaleWidget::setColorMap( const QwtInterval &interval, QwtColorMap *colorMap ) { d_data->colorBar.interval = interval; if ( colorMap != d_data->colorBar.colorMap ) { delete d_data->colorBar.colorMap; d_data->colorBar.colorMap = colorMap; } if ( isColorBarEnabled() ) layoutScale(); } /*! \return Color map \sa setColorMap(), colorBarInterval() */ const QwtColorMap *QwtScaleWidget::colorMap() const { return d_data->colorBar.colorMap; } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_scale_widget.h000066400000000000000000000067111320135501600224020ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SCALE_WIDGET_H #define QWT_SCALE_WIDGET_H #include "qwt_global.h" #include "qwt_text.h" #include "qwt_scale_draw.h" #include #include #include #include class QPainter; class QwtScaleTransformation; class QwtScaleDiv; class QwtColorMap; /*! \brief A Widget which contains a scale This Widget can be used to decorate composite widgets with a scale. */ class QWT_EXPORT QwtScaleWidget : public QWidget { Q_OBJECT public: /*! Layout flags of the title - TitleInverted\n The title of vertical scales is painted from top to bottom. Otherwise it is painted from bottom to top. */ enum LayoutFlag { TitleInverted = 1 }; explicit QwtScaleWidget( QWidget *parent = NULL ); explicit QwtScaleWidget( QwtScaleDraw::Alignment, QWidget *parent = NULL ); virtual ~QwtScaleWidget(); Q_SIGNALS: //! Signal emitted, whenever the scale divison changes void scaleDivChanged(); public: void setTitle( const QString &title ); void setTitle( const QwtText &title ); QwtText title() const; void setLayoutFlag( LayoutFlag, bool on ); bool testLayoutFlag( LayoutFlag ) const; void setBorderDist( int start, int end ); int startBorderDist() const; int endBorderDist() const; void getBorderDistHint( int &start, int &end ) const; void getMinBorderDist( int &start, int &end ) const; void setMinBorderDist( int start, int end ); void setMargin( int ); int margin() const; void setSpacing( int td ); int spacing() const; void setScaleDiv( QwtScaleTransformation *, const QwtScaleDiv &sd ); void setScaleDraw( QwtScaleDraw * ); const QwtScaleDraw *scaleDraw() const; QwtScaleDraw *scaleDraw(); void setLabelAlignment( Qt::Alignment ); void setLabelRotation( double rotation ); void setColorBarEnabled( bool ); bool isColorBarEnabled() const; void setColorBarWidth( int ); int colorBarWidth() const; void setColorMap( const QwtInterval &, QwtColorMap * ); QwtInterval colorBarInterval() const; const QwtColorMap *colorMap() const; virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; int titleHeightForWidth( int width ) const; int dimForLength( int length, const QFont &scaleFont ) const; void drawColorBar( QPainter *painter, const QRectF & ) const; void drawTitle( QPainter *painter, QwtScaleDraw::Alignment, const QRectF &rect ) const; void setAlignment( QwtScaleDraw::Alignment ); QwtScaleDraw::Alignment alignment() const; QRectF colorBarRect( const QRectF& ) const; protected: virtual void paintEvent( QPaintEvent * ); virtual void resizeEvent( QResizeEvent * ); void draw( QPainter *p ) const; void scaleChange(); void layoutScale( bool update = true ); private: void initScale( QwtScaleDraw::Alignment ); class PrivateData; PrivateData *d_data; }; #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_series_data.cpp000066400000000000000000000316621320135501600225710ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_series_data.h" #include "qwt_math.h" static inline QRectF qwtBoundingRect( const QPointF &sample ) { return QRectF( sample.x(), sample.y(), 0.0, 0.0 ); } static inline QRectF qwtBoundingRect( const QwtPoint3D &sample ) { return QRectF( sample.x(), sample.y(), 0.0, 0.0 ); } static inline QRectF qwtBoundingRect( const QwtPointPolar &sample ) { return QRectF( sample.azimuth(), sample.radius(), 0.0, 0.0 ); } static inline QRectF qwtBoundingRect( const QwtIntervalSample &sample ) { return QRectF( sample.interval.minValue(), sample.value, sample.interval.maxValue() - sample.interval.minValue(), 0.0 ); } static inline QRectF qwtBoundingRect( const QwtSetSample &sample ) { double minX = sample.set[0]; double maxX = sample.set[0]; for ( int i = 1; i < ( int )sample.set.size(); i++ ) { if ( sample.set[i] < minX ) minX = sample.set[i]; if ( sample.set[i] > maxX ) maxX = sample.set[i]; } double minY = sample.value; double maxY = sample.value; return QRectF( minX, minY, maxX - minX, maxY - minY ); } /*! \brief Calculate the bounding rect of a series Slow implementation, that iterates over the series. \param series Series \return Bounding rectangle */ template QRectF qwtBoundingRectT( const QwtSeriesData& series ) { QRectF boundingRect( 1.0, 1.0, -2.0, -2.0 ); // invalid; const size_t sz = series.size(); if ( sz <= 0 ) return boundingRect; size_t i; for ( i = 0; i < sz; i++ ) { const QRectF rect = qwtBoundingRect( series.sample( i ) ); if ( rect.width() >= 0.0 && rect.height() >= 0.0 ) { boundingRect = rect; i++; break; } } for ( ; i < sz; i++ ) { const QRectF rect = qwtBoundingRect( series.sample( i ) ); if ( rect.width() >= 0.0 && rect.height() >= 0.0 ) { boundingRect.setLeft( qMin( boundingRect.left(), rect.left() ) ); boundingRect.setRight( qMax( boundingRect.right(), rect.right() ) ); boundingRect.setTop( qMin( boundingRect.top(), rect.top() ) ); boundingRect.setBottom( qMax( boundingRect.bottom(), rect.bottom() ) ); } } return boundingRect; } /*! \brief Calculate the bounding rect of a series Slow implementation, that iterates over the series. \param series Series \return Bounding rectangle */ QRectF qwtBoundingRect( const QwtSeriesData &series ) { return qwtBoundingRectT( series ); } /*! \brief Calculate the bounding rect of a series Slow implementation, that iterates over the series. \param series Series \return Bounding rectangle */ QRectF qwtBoundingRect( const QwtSeriesData &series ) { return qwtBoundingRectT( series ); } /*! \brief Calculate the bounding rect of a series The horizontal coordinates represent the azimuth, the vertical coordinates the radius. Slow implementation, that iterates over the series. \param series Series \return Bounding rectangle */ QRectF qwtBoundingRect( const QwtSeriesData &series ) { return qwtBoundingRectT( series ); } /*! \brief Calculate the bounding rect of a series Slow implementation, that iterates over the series. \param series Series \return Bounding rectangle */ QRectF qwtBoundingRect( const QwtSeriesData& series ) { return qwtBoundingRectT( series ); } /*! \brief Calculate the bounding rect of a series Slow implementation, that iterates over the series. \param series Series \return Bounding rectangle */ QRectF qwtBoundingRect( const QwtSeriesData& series ) { return qwtBoundingRectT( series ); } /*! Constructor \param samples Samples */ QwtPointSeriesData::QwtPointSeriesData( const QVector &samples ): QwtArraySeriesData( samples ) { } /*! \brief Calculate the bounding rect The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtPointSeriesData::boundingRect() const { if ( d_boundingRect.width() < 0.0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } /*! Constructor \param samples Samples */ QwtPoint3DSeriesData::QwtPoint3DSeriesData( const QVector &samples ): QwtArraySeriesData( samples ) { } /*! \brief Calculate the bounding rect The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtPoint3DSeriesData::boundingRect() const { if ( d_boundingRect.width() < 0.0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } /*! Constructor \param samples Samples */ QwtIntervalSeriesData::QwtIntervalSeriesData( const QVector &samples ): QwtArraySeriesData( samples ) { } /*! \brief Calculate the bounding rect The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtIntervalSeriesData::boundingRect() const { if ( d_boundingRect.width() < 0.0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } /*! Constructor \param samples Samples */ QwtSetSeriesData::QwtSetSeriesData( const QVector &samples ): QwtArraySeriesData( samples ) { } /*! \brief Calculate the bounding rect The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtSetSeriesData::boundingRect() const { if ( d_boundingRect.width() < 0.0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } /*! Constructor \param x Array of x values \param y Array of y values \sa QwtPlotCurve::setData(), QwtPlotCurve::setSamples() */ QwtPointArrayData::QwtPointArrayData( const QVector &x, const QVector &y ): d_x( x ), d_y( y ) { } /*! Constructor \param x Array of x values \param y Array of y values \param size Size of the x and y arrays \sa QwtPlotCurve::setData(), QwtPlotCurve::setSamples() */ QwtPointArrayData::QwtPointArrayData( const double *x, const double *y, size_t size ) { d_x.resize( size ); memcpy( d_x.data(), x, size * sizeof( double ) ); d_y.resize( size ); memcpy( d_y.data(), y, size * sizeof( double ) ); } /*! \brief Calculate the bounding rect The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtPointArrayData::boundingRect() const { if ( d_boundingRect.width() < 0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } //! \return Size of the data set size_t QwtPointArrayData::size() const { return qMin( d_x.size(), d_y.size() ); } /*! Return the sample at position i \param i Index \return Sample at position i */ QPointF QwtPointArrayData::sample( size_t i ) const { return QPointF( d_x[int( i )], d_y[int( i )] ); } //! \return Array of the x-values const QVector &QwtPointArrayData::xData() const { return d_x; } //! \return Array of the y-values const QVector &QwtPointArrayData::yData() const { return d_y; } /*! Constructor \param x Array of x values \param y Array of y values \param size Size of the x and y arrays \warning The programmer must assure that the memory blocks referenced by the pointers remain valid during the lifetime of the QwtPlotCPointer object. \sa QwtPlotCurve::setData(), QwtPlotCurve::setRawSamples() */ QwtCPointerData::QwtCPointerData( const double *x, const double *y, size_t size ): d_x( x ), d_y( y ), d_size( size ) { } /*! \brief Calculate the bounding rect The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtCPointerData::boundingRect() const { if ( d_boundingRect.width() < 0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } //! \return Size of the data set size_t QwtCPointerData::size() const { return d_size; } /*! Return the sample at position i \param i Index \return Sample at position i */ QPointF QwtCPointerData::sample( size_t i ) const { return QPointF( d_x[int( i )], d_y[int( i )] ); } //! \return Array of the x-values const double *QwtCPointerData::xData() const { return d_x; } //! \return Array of the y-values const double *QwtCPointerData::yData() const { return d_y; } /*! Constructor \param size Number of points \param interval Bounding interval for the points \sa setInterval(), setSize() */ QwtSyntheticPointData::QwtSyntheticPointData( size_t size, const QwtInterval &interval ): d_size( size ), d_interval( interval ) { } /*! Change the number of points \param size Number of points \sa size(), setInterval() */ void QwtSyntheticPointData::setSize( size_t size ) { d_size = size; } /*! \return Number of points \sa setSize(), interval() */ size_t QwtSyntheticPointData::size() const { return d_size; } /*! Set the bounding interval \param interval Interval \sa interval(), setSize() */ void QwtSyntheticPointData::setInterval( const QwtInterval &interval ) { d_interval = interval.normalized(); } /*! \return Bounding interval \sa setInterval(), size() */ QwtInterval QwtSyntheticPointData::interval() const { return d_interval; } /*! Set a the "rect of interest" QwtPlotSeriesItem defines the current area of the plot canvas as "rect of interest" ( QwtPlotSeriesItem::updateScaleDiv() ). If interval().isValid() == false the x values are calculated in the interval rect.left() -> rect.right(). \sa rectOfInterest() */ void QwtSyntheticPointData::setRectOfInterest( const QRectF &rect ) { d_rectOfInterest = rect; d_intervalOfInterest = QwtInterval( rect.left(), rect.right() ).normalized(); } /*! \return "rect of interest" \sa setRectOfInterest() */ QRectF QwtSyntheticPointData::rectOfInterest() const { return d_rectOfInterest; } /*! \brief Calculate the bounding rect This implementation iterates over all points, what could often be implemented much faster using the characteristics of the series. When there are many points it is recommended to overload and reimplement this method using the characteristics of the series ( if possible ). \return Bounding rectangle */ QRectF QwtSyntheticPointData::boundingRect() const { if ( d_size == 0 || !( d_interval.isValid() || d_intervalOfInterest.isValid() ) ) { return QRectF(1.0, 1.0, -2.0, -2.0); // something invalid } return qwtBoundingRect( *this ); } /*! Calculate the point from an index \param index Index \return QPointF(x(index), y(x(index))); \warning For invalid indices ( index < 0 || index >= size() ) (0, 0) is returned. */ QPointF QwtSyntheticPointData::sample( size_t index ) const { if ( index >= d_size ) return QPointF( 0, 0 ); const double xValue = x( index ); const double yValue = y( xValue ); return QPointF( xValue, yValue ); } /*! Calculate a x-value from an index x values are calculated by deviding an interval into equidistant steps. If !interval().isValid() the interval is calculated from the "rect of interest". \sa interval(), rectOfInterest(), y() */ double QwtSyntheticPointData::x( uint index ) const { const QwtInterval &interval = d_interval.isValid() ? d_interval : d_intervalOfInterest; if ( !interval.isValid() || d_size == 0 || index >= d_size ) return 0.0; const double dx = interval.width() / d_size; return interval.minValue() + index * dx; } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_series_data.h000066400000000000000000000251271320135501600222350ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SERIES_DATA_H #define QWT_SERIES_DATA_H 1 #include "qwt_global.h" #include "qwt_interval.h" #include "qwt_point_3d.h" #include "qwt_point_polar.h" #include #include //! \brief A sample of the types (x1-x2, y) or (x, y1-y2) class QWT_EXPORT QwtIntervalSample { public: QwtIntervalSample(); QwtIntervalSample( double, const QwtInterval & ); QwtIntervalSample( double value, double min, double max ); bool operator==( const QwtIntervalSample & ) const; bool operator!=( const QwtIntervalSample & ) const; //! Value double value; //! Interval QwtInterval interval; }; /*! Constructor The value is set to 0.0, the interval is invalid */ inline QwtIntervalSample::QwtIntervalSample(): value( 0.0 ) { } //! Constructor inline QwtIntervalSample::QwtIntervalSample( double v, const QwtInterval &intv ): value( v ), interval( intv ) { } //! Constructor inline QwtIntervalSample::QwtIntervalSample( double v, double min, double max ): value( v ), interval( min, max ) { } //! Compare operator inline bool QwtIntervalSample::operator==( const QwtIntervalSample &other ) const { return value == other.value && interval == other.interval; } //! Compare operator inline bool QwtIntervalSample::operator!=( const QwtIntervalSample &other ) const { return !( *this == other ); } //! \brief A sample of the types (x1...xn, y) or (x, y1..yn) class QWT_EXPORT QwtSetSample { public: QwtSetSample(); bool operator==( const QwtSetSample &other ) const; bool operator!=( const QwtSetSample &other ) const; //! value double value; //! Vector of values associated to value QVector set; }; /*! Constructor The value is set to 0.0 */ inline QwtSetSample::QwtSetSample(): value( 0.0 ) { } //! Compare operator inline bool QwtSetSample::operator==( const QwtSetSample &other ) const { return value == other.value && set == other.set; } //! Compare operator inline bool QwtSetSample::operator!=( const QwtSetSample &other ) const { return !( *this == other ); } /*! \brief Abstract interface for iterating over samples Qwt offers several implementations of the QwtSeriesData API, but in situations, where data of an application specific format needs to be displayed, without having to copy it, it is recommended to implement an individual data access. */ template class QwtSeriesData { public: QwtSeriesData(); virtual ~QwtSeriesData(); //! \return Number of samples virtual size_t size() const = 0; /*! Return a sample \param i Index \return Sample at position i */ virtual T sample( size_t i ) const = 0; /*! Calculate the bounding rect of all samples The bounding rect is necessary for autoscaling and can be used for a couple of painting optimizations. qwtBoundingRect(...) offers slow implementations iterating over the samples. For large sets it is recommended to implement something faster f.e. by caching the bounding rect. */ virtual QRectF boundingRect() const = 0; virtual void setRectOfInterest( const QRectF & ); protected: //! Can be used to cache a calculated bounding rectangle mutable QRectF d_boundingRect; private: QwtSeriesData &operator=( const QwtSeriesData & ); }; //! Constructor template QwtSeriesData::QwtSeriesData(): d_boundingRect( 0.0, 0.0, -1.0, -1.0 ) { } //! Destructor template QwtSeriesData::~QwtSeriesData() { } /*! Set a the "rect of interest" QwtPlotSeriesItem defines the current area of the plot canvas as "rect of interest" ( QwtPlotSeriesItem::updateScaleDiv() ). It can be used to implement different levels of details. The default implementation does nothing. */ template void QwtSeriesData::setRectOfInterest( const QRectF & ) { } /*! \brief Template class for data, that is organized as QVector QVector uses implicit data sharing and can be passed around as argument efficiently. */ template class QwtArraySeriesData: public QwtSeriesData { public: QwtArraySeriesData(); QwtArraySeriesData( const QVector & ); void setSamples( const QVector & ); const QVector samples() const; virtual size_t size() const; virtual T sample( size_t ) const; protected: //! Vector of samples QVector d_samples; }; //! Constructor template QwtArraySeriesData::QwtArraySeriesData() { } /*! Constructor \param samples Array of samples */ template QwtArraySeriesData::QwtArraySeriesData( const QVector &samples ): d_samples( samples ) { } /*! Assign an array of samples \param samples Array of samples */ template void QwtArraySeriesData::setSamples( const QVector &samples ) { QwtSeriesData::d_boundingRect = QRectF( 0.0, 0.0, -1.0, -1.0 ); d_samples = samples; } //! \return Array of samples template const QVector QwtArraySeriesData::samples() const { return d_samples; } //! \return Number of samples template size_t QwtArraySeriesData::size() const { return d_samples.size(); } /*! Return a sample \param i Index \return Sample at position i */ template T QwtArraySeriesData::sample( size_t i ) const { return d_samples[i]; } //! Interface for iterating over an array of points class QWT_EXPORT QwtPointSeriesData: public QwtArraySeriesData { public: QwtPointSeriesData( const QVector & = QVector() ); virtual QRectF boundingRect() const; }; //! Interface for iterating over an array of 3D points class QWT_EXPORT QwtPoint3DSeriesData: public QwtArraySeriesData { public: QwtPoint3DSeriesData( const QVector & = QVector() ); virtual QRectF boundingRect() const; }; //! Interface for iterating over an array of intervals class QWT_EXPORT QwtIntervalSeriesData: public QwtArraySeriesData { public: QwtIntervalSeriesData( const QVector & = QVector() ); virtual QRectF boundingRect() const; }; //! Interface for iterating over an array of samples class QWT_EXPORT QwtSetSeriesData: public QwtArraySeriesData { public: QwtSetSeriesData( const QVector & = QVector() ); virtual QRectF boundingRect() const; }; /*! \brief Interface for iterating over two QVector objects. */ class QWT_EXPORT QwtPointArrayData: public QwtSeriesData { public: QwtPointArrayData( const QVector &x, const QVector &y ); QwtPointArrayData( const double *x, const double *y, size_t size ); virtual QRectF boundingRect() const; virtual size_t size() const; virtual QPointF sample( size_t i ) const; const QVector &xData() const; const QVector &yData() const; private: QVector d_x; QVector d_y; }; /*! \brief Data class containing two pointers to memory blocks of doubles. */ class QWT_EXPORT QwtCPointerData: public QwtSeriesData { public: QwtCPointerData( const double *x, const double *y, size_t size ); virtual QRectF boundingRect() const; virtual size_t size() const; virtual QPointF sample( size_t i ) const; const double *xData() const; const double *yData() const; private: const double *d_x; const double *d_y; size_t d_size; }; /*! \brief Synthetic point data QwtSyntheticPointData provides a fixed number of points for an interval. The points are calculated in equidistant steps in x-direction. If the interval is invalid, the points are calculated for the "rect of interest", what normally is the displayed area on the plot canvas. In this mode you get different levels of detail, when zooming in/out. \par Example The following example shows how to implement a sinus curve. \verbatim #include #include #include #include #include class SinusData: public QwtSyntheticPointData { public: SinusData(): QwtSyntheticPointData(100) { } virtual double y(double x) const { return qSin(x); } }; int main(int argc, char **argv) { QApplication a(argc, argv); QwtPlot plot; plot.setAxisScale(QwtPlot::xBottom, 0.0, 10.0); plot.setAxisScale(QwtPlot::yLeft, -1.0, 1.0); QwtPlotCurve *curve = new QwtPlotCurve("y = sin(x)"); curve->setData(SinusData()); curve->attach(&plot); plot.show(); return a.exec(); } \endverbatim */ class QWT_EXPORT QwtSyntheticPointData: public QwtSeriesData { public: QwtSyntheticPointData( size_t size, const QwtInterval & = QwtInterval() ); void setSize( size_t size ); size_t size() const; void setInterval( const QwtInterval& ); QwtInterval interval() const; virtual QRectF boundingRect() const; virtual QPointF sample( size_t i ) const; /*! Calculate a y value for a x value \param x x value \return Corresponding y value */ virtual double y( double x ) const = 0; virtual double x( uint index ) const; virtual void setRectOfInterest( const QRectF & ); QRectF rectOfInterest() const; private: size_t d_size; QwtInterval d_interval; QRectF d_rectOfInterest; QwtInterval d_intervalOfInterest; }; QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData & ); QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData & ); QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData & ); QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData & ); QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData & ); #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_slider.cpp000066400000000000000000000520531320135501600215650ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_slider.h" #include "qwt_painter.h" #include "qwt_scale_draw.h" #include "qwt_scale_map.h" #include #include #include #include #include class QwtSlider::PrivateData { public: QRect sliderRect; int thumbLength; int thumbWidth; int borderWidth; int scaleDist; int xMargin; int yMargin; QwtSlider::ScalePos scalePos; QwtSlider::BGSTYLE bgStyle; /* Scale and values might have different maps. This is confusing and I can't see strong arguments for such a feature. TODO ... */ QwtScaleMap map; // linear map mutable QSize sizeHintCache; }; /*! \brief Constructor \param parent parent widget \param orientation Orientation of the slider. Can be Qt::Horizontal or Qt::Vertical. Defaults to Qt::Horizontal. \param scalePos Position of the scale. Defaults to QwtSlider::NoScale. \param bgStyle Background style. QwtSlider::BgTrough draws the slider button in a trough, QwtSlider::BgSlot draws a slot underneath the button. An or-combination of both may also be used. The default is QwtSlider::BgTrough. QwtSlider enforces valid combinations of its orientation and scale position. If the combination is invalid, the scale position will be set to NoScale. Valid combinations are: - Qt::Horizonal with NoScale, TopScale, or BottomScale; - Qt::Vertical with NoScale, LeftScale, or RightScale. */ QwtSlider::QwtSlider( QWidget *parent, Qt::Orientation orientation, ScalePos scalePos, BGSTYLE bgStyle ): QwtAbstractSlider( orientation, parent ) { initSlider( orientation, scalePos, bgStyle ); } void QwtSlider::initSlider( Qt::Orientation orientation, ScalePos scalePos, BGSTYLE bgStyle ) { if ( orientation == Qt::Vertical ) setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Expanding ); else setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); d_data = new QwtSlider::PrivateData; d_data->borderWidth = 2; d_data->scaleDist = 4; d_data->scalePos = scalePos; d_data->xMargin = 0; d_data->yMargin = 0; d_data->bgStyle = bgStyle; if ( bgStyle == BgSlot ) { d_data->thumbLength = 16; d_data->thumbWidth = 30; } else { d_data->thumbLength = 31; d_data->thumbWidth = 16; } d_data->sliderRect.setRect( 0, 0, 8, 8 ); QwtScaleDraw::Alignment align; if ( orientation == Qt::Vertical ) { // enforce a valid combination of scale position and orientation if ( ( d_data->scalePos == BottomScale ) || ( d_data->scalePos == TopScale ) ) d_data->scalePos = NoScale; // adopt the policy of layoutSlider (NoScale lays out like Left) if ( d_data->scalePos == RightScale ) align = QwtScaleDraw::RightScale; else align = QwtScaleDraw::LeftScale; } else { // enforce a valid combination of scale position and orientation if ( ( d_data->scalePos == LeftScale ) || ( d_data->scalePos == RightScale ) ) d_data->scalePos = NoScale; // adopt the policy of layoutSlider (NoScale lays out like Bottom) if ( d_data->scalePos == TopScale ) align = QwtScaleDraw::TopScale; else align = QwtScaleDraw::BottomScale; } scaleDraw()->setAlignment( align ); scaleDraw()->setLength( 100 ); setRange( 0.0, 100.0, 1.0 ); setValue( 0.0 ); } QwtSlider::~QwtSlider() { delete d_data; } /*! \brief Set the orientation. \param o Orientation. Allowed values are Qt::Horizontal and Qt::Vertical. If the new orientation and the old scale position are an invalid combination, the scale position will be set to QwtSlider::NoScale. \sa QwtAbstractSlider::orientation() */ void QwtSlider::setOrientation( Qt::Orientation o ) { if ( o == orientation() ) return; if ( o == Qt::Horizontal ) { if ( ( d_data->scalePos == LeftScale ) || ( d_data->scalePos == RightScale ) ) d_data->scalePos = NoScale; } else // if (o == Qt::Vertical) { if ( ( d_data->scalePos == BottomScale ) || ( d_data->scalePos == TopScale ) ) d_data->scalePos = NoScale; } if ( !testAttribute( Qt::WA_WState_OwnSizePolicy ) ) { QSizePolicy sp = sizePolicy(); sp.transpose(); setSizePolicy( sp ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); } QwtAbstractSlider::setOrientation( o ); layoutSlider(); } /*! \brief Change the scale position (and slider orientation). \param s Position of the scale. A valid combination of scale position and orientation is enforced: - if the new scale position is Left or Right, the scale orientation will become Qt::Vertical; - if the new scale position is Bottom or Top the scale orientation will become Qt::Horizontal; - if the new scale position is QwtSlider::NoScale, the scale orientation will not change. */ void QwtSlider::setScalePosition( ScalePos s ) { if ( d_data->scalePos == s ) return; d_data->scalePos = s; switch ( d_data->scalePos ) { case BottomScale: { setOrientation( Qt::Horizontal ); scaleDraw()->setAlignment( QwtScaleDraw::BottomScale ); break; } case TopScale: { setOrientation( Qt::Horizontal ); scaleDraw()->setAlignment( QwtScaleDraw::TopScale ); break; } case LeftScale: { setOrientation( Qt::Vertical ); scaleDraw()->setAlignment( QwtScaleDraw::LeftScale ); break; } case RightScale: { setOrientation( Qt::Vertical ); scaleDraw()->setAlignment( QwtScaleDraw::RightScale ); break; } default: { // nothing } } layoutSlider(); } //! Return the scale position. QwtSlider::ScalePos QwtSlider::scalePosition() const { return d_data->scalePos; } /*! \brief Change the slider's border width \param bd border width */ void QwtSlider::setBorderWidth( int bd ) { if ( bd < 0 ) bd = 0; if ( bd != d_data->borderWidth ) { d_data->borderWidth = bd; layoutSlider(); } } /*! \brief Set the slider's thumb length \param thumbLength new length */ void QwtSlider::setThumbLength( int thumbLength ) { if ( thumbLength < 8 ) thumbLength = 8; if ( thumbLength != d_data->thumbLength ) { d_data->thumbLength = thumbLength; layoutSlider(); } } /*! \brief Change the width of the thumb \param w new width */ void QwtSlider::setThumbWidth( int w ) { if ( w < 4 ) w = 4; if ( d_data->thumbWidth != w ) { d_data->thumbWidth = w; layoutSlider(); } } /*! \brief Set a scale draw For changing the labels of the scales, it is necessary to derive from QwtScaleDraw and overload QwtScaleDraw::label(). \param scaleDraw ScaleDraw object, that has to be created with new and will be deleted in ~QwtSlider or the next call of setScaleDraw(). */ void QwtSlider::setScaleDraw( QwtScaleDraw *scaleDraw ) { const QwtScaleDraw *previousScaleDraw = this->scaleDraw(); if ( scaleDraw == NULL || scaleDraw == previousScaleDraw ) return; if ( previousScaleDraw ) scaleDraw->setAlignment( previousScaleDraw->alignment() ); setAbstractScaleDraw( scaleDraw ); layoutSlider(); } /*! \return the scale draw of the slider \sa setScaleDraw() */ const QwtScaleDraw *QwtSlider::scaleDraw() const { return static_cast( abstractScaleDraw() ); } /*! \return the scale draw of the slider \sa setScaleDraw() */ QwtScaleDraw *QwtSlider::scaleDraw() { return static_cast( abstractScaleDraw() ); } //! Notify changed scale void QwtSlider::scaleChange() { layoutSlider(); } //! Notify change in font void QwtSlider::fontChange( const QFont &f ) { #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) QwtAbstractSlider::fontChange( f ); #endif layoutSlider(); } /*! Draw the slider into the specified rectangle. \param painter Painter \param r Rectangle */ void QwtSlider::drawSlider( QPainter *painter, const QRect &r ) { QRect cr( r ); if ( d_data->bgStyle & BgTrough ) { qDrawShadePanel( painter, r.x(), r.y(), r.width(), r.height(), palette(), true, d_data->borderWidth, 0 ); cr.setRect( r.x() + d_data->borderWidth, r.y() + d_data->borderWidth, r.width() - 2 * d_data->borderWidth, r.height() - 2 * d_data->borderWidth ); painter->fillRect( cr.x(), cr.y(), cr.width(), cr.height(), palette().brush( QPalette::Mid ) ); } if ( d_data->bgStyle & BgSlot ) { int ws = 4; int ds = d_data->thumbLength / 2 - 4; if ( ds < 1 ) ds = 1; QRect rSlot; if ( orientation() == Qt::Horizontal ) { if ( cr.height() & 1 ) ws++; rSlot = QRect( cr.x() + ds, cr.y() + ( cr.height() - ws ) / 2, cr.width() - 2 * ds, ws ); } else { if ( cr.width() & 1 ) ws++; rSlot = QRect( cr.x() + ( cr.width() - ws ) / 2, cr.y() + ds, ws, cr.height() - 2 * ds ); } painter->fillRect( rSlot.x(), rSlot.y(), rSlot.width(), rSlot.height(), palette().brush( QPalette::Dark ) ); qDrawShadePanel( painter, rSlot.x(), rSlot.y(), rSlot.width(), rSlot.height(), palette(), true, 1 , 0 ); } if ( isValid() ) drawThumb( painter, cr, xyPosition( value() ) ); } /*! Draw the thumb at a position \param painter Painter \param sliderRect Bounding rectangle of the slider \param pos Position of the slider thumb */ void QwtSlider::drawThumb( QPainter *painter, const QRect &sliderRect, int pos ) { pos++; // shade line points one pixel below if ( orientation() == Qt::Horizontal ) { qDrawShadePanel( painter, pos - d_data->thumbLength / 2, sliderRect.y(), d_data->thumbLength, sliderRect.height(), palette(), false, d_data->borderWidth, &palette().brush( QPalette::Button ) ); qDrawShadeLine( painter, pos, sliderRect.y(), pos, sliderRect.y() + sliderRect.height() - 2, palette(), true, 1 ); } else // Vertical { qDrawShadePanel( painter, sliderRect.x(), pos - d_data->thumbLength / 2, sliderRect.width(), d_data->thumbLength, palette(), false, d_data->borderWidth, &palette().brush( QPalette::Button ) ); qDrawShadeLine( painter, sliderRect.x(), pos, sliderRect.x() + sliderRect.width() - 2, pos, palette(), true, 1 ); } } /*! Find the x/y position for a given value v \param value Value */ int QwtSlider::xyPosition( double value ) const { return qRound( d_data->map.transform( value ) ); } /*! Determine the value corresponding to a specified mouse location. \param pos Mouse position */ double QwtSlider::getValue( const QPoint &pos ) { return d_data->map.invTransform( orientation() == Qt::Horizontal ? pos.x() : pos.y() ); } /*! \brief Determine scrolling mode and direction \param p point \param scrollMode Scrolling mode \param direction Direction */ void QwtSlider::getScrollMode( const QPoint &p, int &scrollMode, int &direction ) { if ( !d_data->sliderRect.contains( p ) ) { scrollMode = ScrNone; direction = 0; return; } const int pos = ( orientation() == Qt::Horizontal ) ? p.x() : p.y(); const int markerPos = xyPosition( value() ); if ( ( pos > markerPos - d_data->thumbLength / 2 ) && ( pos < markerPos + d_data->thumbLength / 2 ) ) { scrollMode = ScrMouse; direction = 0; return; } scrollMode = ScrPage; direction = ( pos > markerPos ) ? 1 : -1; if ( scaleDraw()->map().p1() > scaleDraw()->map().p2() ) direction = -direction; } /*! Qt paint event \param event Paint event */ void QwtSlider::paintEvent( QPaintEvent *event ) { const QRect &ur = event->rect(); if ( ur.isValid() ) { QPainter painter( this ); draw( &painter, ur ); } } //! Draw the QwtSlider void QwtSlider::draw( QPainter *painter, const QRect& ) { if ( d_data->scalePos != NoScale ) scaleDraw()->draw( painter, palette() ); drawSlider( painter, d_data->sliderRect ); if ( hasFocus() ) QwtPainter::drawFocusRect( painter, this, d_data->sliderRect ); } //! Qt resize event void QwtSlider::resizeEvent( QResizeEvent * ) { layoutSlider( false ); } /*! Recalculate the slider's geometry and layout based on the current rect and fonts. \param update_geometry notify the layout system and call update to redraw the scale */ void QwtSlider::layoutSlider( bool update_geometry ) { int sliderWidth = d_data->thumbWidth; int sld1 = d_data->thumbLength / 2 - 1; int sld2 = d_data->thumbLength / 2 + d_data->thumbLength % 2; if ( d_data->bgStyle & BgTrough ) { sliderWidth += 2 * d_data->borderWidth; sld1 += d_data->borderWidth; sld2 += d_data->borderWidth; } int scd = 0; if ( d_data->scalePos != NoScale ) { int d1, d2; scaleDraw()->getBorderDistHint( font(), d1, d2 ); scd = qMax( d1, d2 ); } int slo = scd - sld1; if ( slo < 0 ) slo = 0; int x, y, length; const QRect r = rect(); if ( orientation() == Qt::Horizontal ) { switch ( d_data->scalePos ) { case TopScale: { d_data->sliderRect.setRect( r.x() + d_data->xMargin + slo, r.y() + r.height() - d_data->yMargin - sliderWidth, r.width() - 2 * d_data->xMargin - 2 * slo, sliderWidth ); x = d_data->sliderRect.x() + sld1; y = d_data->sliderRect.y() - d_data->scaleDist; break; } case BottomScale: { d_data->sliderRect.setRect( r.x() + d_data->xMargin + slo, r.y() + d_data->yMargin, r.width() - 2 * d_data->xMargin - 2 * slo, sliderWidth ); x = d_data->sliderRect.x() + sld1; y = d_data->sliderRect.y() + d_data->sliderRect.height() + d_data->scaleDist; break; } case NoScale: // like Bottom, but no scale. See QwtSlider(). default: // inconsistent orientation and scale position { d_data->sliderRect.setRect( r.x() + d_data->xMargin + slo, r.y() + d_data->yMargin, r.width() - 2 * d_data->xMargin - 2 * slo, sliderWidth ); x = d_data->sliderRect.x() + sld1; y = 0; break; } } length = d_data->sliderRect.width() - ( sld1 + sld2 ); } else // if (orientation() == Qt::Vertical { switch ( d_data->scalePos ) { case RightScale: d_data->sliderRect.setRect( r.x() + d_data->xMargin, r.y() + d_data->yMargin + slo, sliderWidth, r.height() - 2 * d_data->yMargin - 2 * slo ); x = d_data->sliderRect.x() + d_data->sliderRect.width() + d_data->scaleDist; y = d_data->sliderRect.y() + sld1; break; case LeftScale: d_data->sliderRect.setRect( r.x() + r.width() - sliderWidth - d_data->xMargin, r.y() + d_data->yMargin + slo, sliderWidth, r.height() - 2 * d_data->yMargin - 2 * slo ); x = d_data->sliderRect.x() - d_data->scaleDist; y = d_data->sliderRect.y() + sld1; break; case NoScale: // like Left, but no scale. See QwtSlider(). default: // inconsistent orientation and scale position d_data->sliderRect.setRect( r.x() + r.width() - sliderWidth - d_data->xMargin, r.y() + d_data->yMargin + slo, sliderWidth, r.height() - 2 * d_data->yMargin - 2 * slo ); x = 0; y = d_data->sliderRect.y() + sld1; break; } length = d_data->sliderRect.height() - ( sld1 + sld2 ); } scaleDraw()->move( x, y ); scaleDraw()->setLength( length ); d_data->map.setPaintInterval( scaleDraw()->map().p1(), scaleDraw()->map().p2() ); if ( update_geometry ) { d_data->sizeHintCache = QSize(); // invalidate updateGeometry(); update(); } } //! Notify change of value void QwtSlider::valueChange() { QwtAbstractSlider::valueChange(); update(); } //! Notify change of range void QwtSlider::rangeChange() { d_data->map.setScaleInterval( minValue(), maxValue() ); if ( autoScale() ) rescale( minValue(), maxValue() ); QwtAbstractSlider::rangeChange(); layoutSlider(); } /*! \brief Set distances between the widget's border and internals. \param xMargin Horizontal margin \param yMargin Vertical margin */ void QwtSlider::setMargins( int xMargin, int yMargin ) { if ( xMargin < 0 ) xMargin = 0; if ( yMargin < 0 ) yMargin = 0; if ( xMargin != d_data->xMargin || yMargin != d_data->yMargin ) { d_data->xMargin = xMargin; d_data->yMargin = yMargin; layoutSlider(); } } /*! Set the background style. */ void QwtSlider::setBgStyle( BGSTYLE st ) { d_data->bgStyle = st; layoutSlider(); } /*! \return the background style. */ QwtSlider::BGSTYLE QwtSlider::bgStyle() const { return d_data->bgStyle; } /*! \return the thumb length. */ int QwtSlider::thumbLength() const { return d_data->thumbLength; } /*! \return the thumb width. */ int QwtSlider::thumbWidth() const { return d_data->thumbWidth; } /*! \return the border width. */ int QwtSlider::borderWidth() const { return d_data->borderWidth; } /*! \return QwtSlider::minimumSizeHint() */ QSize QwtSlider::sizeHint() const { return minimumSizeHint(); } /*! \brief Return a minimum size hint \warning The return value of QwtSlider::minimumSizeHint() depends on the font and the scale. */ QSize QwtSlider::minimumSizeHint() const { if ( !d_data->sizeHintCache.isEmpty() ) return d_data->sizeHintCache; int sliderWidth = d_data->thumbWidth; if ( d_data->bgStyle & BgTrough ) sliderWidth += 2 * d_data->borderWidth; int w = 0, h = 0; if ( d_data->scalePos != NoScale ) { int d1, d2; scaleDraw()->getBorderDistHint( font(), d1, d2 ); int msMbd = qMax( d1, d2 ); int mbd = d_data->thumbLength / 2; if ( d_data->bgStyle & BgTrough ) mbd += d_data->borderWidth; if ( mbd < msMbd ) mbd = msMbd; const int sdExtent = qCeil( scaleDraw()->extent( font() ) ); const int sdLength = scaleDraw()->minLength( font() ); h = sliderWidth + sdExtent + d_data->scaleDist; w = sdLength - 2 * msMbd + 2 * mbd; } else // no scale { w = 200; h = sliderWidth; } if ( orientation() == Qt::Vertical ) qSwap( w, h ); w += 2 * d_data->xMargin; h += 2 * d_data->yMargin; d_data->sizeHintCache = QSize( w, h ); return d_data->sizeHintCache; } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_slider.h000066400000000000000000000071441320135501600212330ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SLIDER_H #define QWT_SLIDER_H #include "qwt_global.h" #include "qwt_abstract_scale.h" #include "qwt_abstract_slider.h" class QwtScaleDraw; /*! \brief The Slider Widget QwtSlider is a slider widget which operates on an interval of type double. QwtSlider supports different layouts as well as a scale. \image html sliders.png \sa QwtAbstractSlider and QwtAbstractScale for the descriptions of the inherited members. */ class QWT_EXPORT QwtSlider : public QwtAbstractSlider, public QwtAbstractScale { Q_OBJECT Q_ENUMS( ScalePos ) Q_ENUMS( BGSTYLE ) Q_PROPERTY( ScalePos scalePosition READ scalePosition WRITE setScalePosition ) Q_PROPERTY( BGSTYLE bgStyle READ bgStyle WRITE setBgStyle ) Q_PROPERTY( int thumbLength READ thumbLength WRITE setThumbLength ) Q_PROPERTY( int thumbWidth READ thumbWidth WRITE setThumbWidth ) Q_PROPERTY( int borderWidth READ borderWidth WRITE setBorderWidth ) public: /*! Scale position. QwtSlider tries to enforce valid combinations of its orientation and scale position: - Qt::Horizonal combines with NoScale, TopScale and BottomScale - Qt::Vertical combines with NoScale, LeftScale and RightScale \sa QwtSlider() */ enum ScalePos { NoScale, LeftScale, RightScale, TopScale, BottomScale }; /*! Background style. \sa QwtSlider() */ enum BGSTYLE { BgTrough = 0x1, BgSlot = 0x2, BgBoth = BgTrough | BgSlot }; explicit QwtSlider( QWidget *parent, Qt::Orientation = Qt::Horizontal, ScalePos = NoScale, BGSTYLE bgStyle = BgTrough ); virtual ~QwtSlider(); virtual void setOrientation( Qt::Orientation ); void setBgStyle( BGSTYLE ); BGSTYLE bgStyle() const; void setScalePosition( ScalePos s ); ScalePos scalePosition() const; int thumbLength() const; int thumbWidth() const; int borderWidth() const; void setThumbLength( int l ); void setThumbWidth( int w ); void setBorderWidth( int bw ); void setMargins( int x, int y ); virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; void setScaleDraw( QwtScaleDraw * ); const QwtScaleDraw *scaleDraw() const; protected: virtual double getValue( const QPoint &p ); virtual void getScrollMode( const QPoint &p, int &scrollMode, int &direction ); void draw( QPainter *p, const QRect& update_rect ); virtual void drawSlider ( QPainter *p, const QRect &r ); virtual void drawThumb( QPainter *p, const QRect &, int pos ); virtual void resizeEvent( QResizeEvent *e ); virtual void paintEvent ( QPaintEvent *e ); virtual void valueChange(); virtual void rangeChange(); virtual void scaleChange(); virtual void fontChange( const QFont &oldFont ); void layoutSlider( bool update = true ); int xyPosition( double v ) const; QwtScaleDraw *scaleDraw(); private: void initSlider( Qt::Orientation, ScalePos scalePos, BGSTYLE bgStyle ); class PrivateData; PrivateData *d_data; }; #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_spline.cpp000066400000000000000000000210651320135501600215740ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_spline.h" #include "qwt_math.h" class QwtSpline::PrivateData { public: PrivateData(): splineType( QwtSpline::Natural ) { } QwtSpline::SplineType splineType; // coefficient vectors QVector a; QVector b; QVector c; // control points QPolygonF points; }; static int lookup( double x, const QPolygonF &values ) { #if 0 //qLowerBound/qHigherBound ??? #endif int i1; const int size = ( int )values.size(); if ( x <= values[0].x() ) i1 = 0; else if ( x >= values[size - 2].x() ) i1 = size - 2; else { i1 = 0; int i2 = size - 2; int i3 = 0; while ( i2 - i1 > 1 ) { i3 = i1 + ( ( i2 - i1 ) >> 1 ); if ( values[i3].x() > x ) i2 = i3; else i1 = i3; } } return i1; } //! Constructor QwtSpline::QwtSpline() { d_data = new PrivateData; } /*! Copy constructor \param other Spline used for initilization */ QwtSpline::QwtSpline( const QwtSpline& other ) { d_data = new PrivateData( *other.d_data ); } /*! Assignment operator \param other Spline used for initilization */ QwtSpline &QwtSpline::operator=( const QwtSpline & other ) { *d_data = *other.d_data; return *this; } //! Destructor QwtSpline::~QwtSpline() { delete d_data; } /*! Select the algorithm used for calculating the spline \param splineType Spline type \sa splineType() */ void QwtSpline::setSplineType( SplineType splineType ) { d_data->splineType = splineType; } /*! \return the spline type \sa setSplineType() */ QwtSpline::SplineType QwtSpline::splineType() const { return d_data->splineType; } /*! \brief Calculate the spline coefficients Depending on the value of \a periodic, this function will determine the coefficients for a natural or a periodic spline and store them internally. \param points Points \return true if successful \warning The sequence of x (but not y) values has to be strictly monotone increasing, which means points[i].x() < points[i+1].x(). If this is not the case, the function will return false */ bool QwtSpline::setPoints( const QPolygonF& points ) { const int size = points.size(); if ( size <= 2 ) { reset(); return false; } d_data->points = points; d_data->a.resize( size - 1 ); d_data->b.resize( size - 1 ); d_data->c.resize( size - 1 ); bool ok; if ( d_data->splineType == Periodic ) ok = buildPeriodicSpline( points ); else ok = buildNaturalSpline( points ); if ( !ok ) reset(); return ok; } /*! Return points passed by setPoints */ QPolygonF QwtSpline::points() const { return d_data->points; } //! \return A coefficients const QVector &QwtSpline::coefficientsA() const { return d_data->a; } //! \return B coefficients const QVector &QwtSpline::coefficientsB() const { return d_data->b; } //! \return C coefficients const QVector &QwtSpline::coefficientsC() const { return d_data->c; } //! Free allocated memory and set size to 0 void QwtSpline::reset() { d_data->a.resize( 0 ); d_data->b.resize( 0 ); d_data->c.resize( 0 ); d_data->points.resize( 0 ); } //! True if valid bool QwtSpline::isValid() const { return d_data->a.size() > 0; } /*! Calculate the interpolated function value corresponding to a given argument x. */ double QwtSpline::value( double x ) const { if ( d_data->a.size() == 0 ) return 0.0; const int i = lookup( x, d_data->points ); const double delta = x - d_data->points[i].x(); return( ( ( ( d_data->a[i] * delta ) + d_data->b[i] ) * delta + d_data->c[i] ) * delta + d_data->points[i].y() ); } /*! \brief Determines the coefficients for a natural spline \return true if successful */ bool QwtSpline::buildNaturalSpline( const QPolygonF &points ) { int i; const QPointF *p = points.data(); const int size = points.size(); double *a = d_data->a.data(); double *b = d_data->b.data(); double *c = d_data->c.data(); // set up tridiagonal equation system; use coefficient // vectors as temporary buffers QVector h( size - 1 ); for ( i = 0; i < size - 1; i++ ) { h[i] = p[i+1].x() - p[i].x(); if ( h[i] <= 0 ) return false; } QVector d( size - 1 ); double dy1 = ( p[1].y() - p[0].y() ) / h[0]; for ( i = 1; i < size - 1; i++ ) { b[i] = c[i] = h[i]; a[i] = 2.0 * ( h[i-1] + h[i] ); const double dy2 = ( p[i+1].y() - p[i].y() ) / h[i]; d[i] = 6.0 * ( dy1 - dy2 ); dy1 = dy2; } // // solve it // // L-U Factorization for ( i = 1; i < size - 2; i++ ) { c[i] /= a[i]; a[i+1] -= b[i] * c[i]; } // forward elimination QVector s( size ); s[1] = d[1]; for ( i = 2; i < size - 1; i++ ) s[i] = d[i] - c[i-1] * s[i-1]; // backward elimination s[size - 2] = - s[size - 2] / a[size - 2]; for ( i = size - 3; i > 0; i-- ) s[i] = - ( s[i] + b[i] * s[i+1] ) / a[i]; s[size - 1] = s[0] = 0.0; // // Finally, determine the spline coefficients // for ( i = 0; i < size - 1; i++ ) { a[i] = ( s[i+1] - s[i] ) / ( 6.0 * h[i] ); b[i] = 0.5 * s[i]; c[i] = ( p[i+1].y() - p[i].y() ) / h[i] - ( s[i+1] + 2.0 * s[i] ) * h[i] / 6.0; } return true; } /*! \brief Determines the coefficients for a periodic spline \return true if successful */ bool QwtSpline::buildPeriodicSpline( const QPolygonF &points ) { int i; const QPointF *p = points.data(); const int size = points.size(); double *a = d_data->a.data(); double *b = d_data->b.data(); double *c = d_data->c.data(); QVector d( size - 1 ); QVector h( size - 1 ); QVector s( size ); // // setup equation system; use coefficient // vectors as temporary buffers // for ( i = 0; i < size - 1; i++ ) { h[i] = p[i+1].x() - p[i].x(); if ( h[i] <= 0.0 ) return false; } const int imax = size - 2; double htmp = h[imax]; double dy1 = ( p[0].y() - p[imax].y() ) / htmp; for ( i = 0; i <= imax; i++ ) { b[i] = c[i] = h[i]; a[i] = 2.0 * ( htmp + h[i] ); const double dy2 = ( p[i+1].y() - p[i].y() ) / h[i]; d[i] = 6.0 * ( dy1 - dy2 ); dy1 = dy2; htmp = h[i]; } // // solve it // // L-U Factorization a[0] = qSqrt( a[0] ); c[0] = h[imax] / a[0]; double sum = 0; for ( i = 0; i < imax - 1; i++ ) { b[i] /= a[i]; if ( i > 0 ) c[i] = - c[i-1] * b[i-1] / a[i]; a[i+1] = qSqrt( a[i+1] - qwtSqr( b[i] ) ); sum += qwtSqr( c[i] ); } b[imax-1] = ( b[imax-1] - c[imax-2] * b[imax-2] ) / a[imax-1]; a[imax] = qSqrt( a[imax] - qwtSqr( b[imax-1] ) - sum ); // forward elimination s[0] = d[0] / a[0]; sum = 0; for ( i = 1; i < imax; i++ ) { s[i] = ( d[i] - b[i-1] * s[i-1] ) / a[i]; sum += c[i-1] * s[i-1]; } s[imax] = ( d[imax] - b[imax-1] * s[imax-1] - sum ) / a[imax]; // backward elimination s[imax] = - s[imax] / a[imax]; s[imax-1] = -( s[imax-1] + b[imax-1] * s[imax] ) / a[imax-1]; for ( i = imax - 2; i >= 0; i-- ) s[i] = - ( s[i] + b[i] * s[i+1] + c[i] * s[imax] ) / a[i]; // // Finally, determine the spline coefficients // s[size-1] = s[0]; for ( i = 0; i < size - 1; i++ ) { a[i] = ( s[i+1] - s[i] ) / ( 6.0 * h[i] ); b[i] = 0.5 * s[i]; c[i] = ( p[i+1].y() - p[i].y() ) / h[i] - ( s[i+1] + 2.0 * s[i] ) * h[i] / 6.0; } return true; } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_spline.h000066400000000000000000000046471320135501600212500ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SPLINE_H #define QWT_SPLINE_H #include "qwt_global.h" #include #include /*! \brief A class for spline interpolation The QwtSpline class is used for cubical spline interpolation. Two types of splines, natural and periodic, are supported. \par Usage:
    1. First call setPoints() to determine the spline coefficients for a tabulated function y(x).
    2. After the coefficients have been set up, the interpolated function value for an argument x can be determined by calling QwtSpline::value().
    \par Example: \code #include QPolygonF interpolate(const QPolygonF& points, int numValues) { QwtSpline spline; if ( !spline.setPoints(points) ) return points; QPolygonF interpolatedPoints(numValues); const double delta = (points[numPoints - 1].x() - points[0].x()) / (points.size() - 1); for(i = 0; i < points.size(); i++) / interpolate { const double x = points[0].x() + i * delta; interpolatedPoints[i].setX(x); interpolatedPoints[i].setY(spline.value(x)); } return interpolatedPoints; } \endcode */ class QWT_EXPORT QwtSpline { public: //! Spline type enum SplineType { Natural, Periodic }; QwtSpline(); QwtSpline( const QwtSpline & ); ~QwtSpline(); QwtSpline &operator=( const QwtSpline & ); void setSplineType( SplineType ); SplineType splineType() const; bool setPoints( const QPolygonF& points ); QPolygonF points() const; void reset(); bool isValid() const; double value( double x ) const; const QVector &coefficientsA() const; const QVector &coefficientsB() const; const QVector &coefficientsC() const; protected: bool buildNaturalSpline( const QPolygonF & ); bool buildPeriodicSpline( const QPolygonF & ); private: class PrivateData; PrivateData *d_data; }; #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_symbol.cpp000066400000000000000000000633531320135501600216150ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_symbol.h" #include "qwt_painter.h" #include #include #include namespace QwtTriangle { enum Type { Left, Right, Up, Down }; } static inline void qwtDrawEllipseSymbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { painter->setBrush( symbol.brush() ); painter->setPen( symbol.pen() ); const QSize size = symbol.size(); if ( QwtPainter::roundingAlignment( painter ) ) { const int sw = size.width(); const int sh = size.height(); const int sw2 = size.width() / 2; const int sh2 = size.height() / 2; for ( int i = 0; i < numPoints; i++ ) { const int x = qRound( points[i].x() ); const int y = qRound( points[i].y() ); const QRectF r( x - sw2, y - sh2, sw, sh ); QwtPainter::drawEllipse( painter, r ); } } else { const double sw = size.width(); const double sh = size.height(); const double sw2 = 0.5 * size.width(); const double sh2 = 0.5 * size.height(); for ( int i = 0; i < numPoints; i++ ) { const double x = points[i].x(); const double y = points[i].y(); const QRectF r( x - sw2, y - sh2, sw, sh ); QwtPainter::drawEllipse( painter, r ); } } } static inline void qwtDrawRectSymbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { const QSize size = symbol.size(); QPen pen = symbol.pen(); pen.setJoinStyle( Qt::MiterJoin ); painter->setPen( pen ); painter->setBrush( symbol.brush() ); painter->setRenderHint( QPainter::Antialiasing, false ); if ( QwtPainter::roundingAlignment( painter ) ) { const int sw = size.width(); const int sh = size.height(); const int sw2 = size.width() / 2; const int sh2 = size.height() / 2; for ( int i = 0; i < numPoints; i++ ) { const int x = qRound( points[i].x() ); const int y = qRound( points[i].y() ); const QRect r( x - sw2, y - sh2, sw, sh ); QwtPainter::drawRect( painter, r ); } } else { const double sw = size.width(); const double sh = size.height(); const double sw2 = 0.5 * size.width(); const double sh2 = 0.5 * size.height(); for ( int i = 0; i < numPoints; i++ ) { const double x = points[i].x(); const double y = points[i].y(); const QRectF r( x - sw2, y - sh2, sw, sh ); QwtPainter::drawRect( painter, r ); } } } static inline void qwtDrawDiamondSymbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { const QSize size = symbol.size(); QPen pen = symbol.pen(); pen.setJoinStyle( Qt::MiterJoin ); painter->setPen( pen ); painter->setBrush( symbol.brush() ); if ( QwtPainter::roundingAlignment( painter ) ) { for ( int i = 0; i < numPoints; i++ ) { const int x = qRound( points[i].x() ); const int y = qRound( points[i].y() ); const int x1 = x - size.width() / 2; const int y1 = y - size.height() / 2; const int x2 = x1 + size.width(); const int y2 = y1 + size.height(); QPolygonF polygon; polygon += QPointF( x, y1 ); polygon += QPointF( x1, y ); polygon += QPointF( x, y2 ); polygon += QPointF( x2, y ); QwtPainter::drawPolygon( painter, polygon ); } } else { for ( int i = 0; i < numPoints; i++ ) { const QPointF &pos = points[i]; const double x1 = pos.x() - 0.5 * size.width(); const double y1 = pos.y() - 0.5 * size.height(); const double x2 = x1 + size.width(); const double y2 = y1 + size.height(); QPolygonF polygon; polygon += QPointF( pos.x(), y1 ); polygon += QPointF( x2, pos.y() ); polygon += QPointF( pos.x(), y2 ); polygon += QPointF( x1, pos.y() ); QwtPainter::drawPolygon( painter, polygon ); } } } static inline void qwtDrawTriangleSymbols( QPainter *painter, QwtTriangle::Type type, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { const QSize size = symbol.size(); QPen pen = symbol.pen(); pen.setJoinStyle( Qt::MiterJoin ); painter->setPen( pen ); painter->setBrush( symbol.brush() ); const bool doAlign = QwtPainter::roundingAlignment( painter ); double sw2 = 0.5 * size.width(); double sh2 = 0.5 * size.height(); if ( doAlign ) { sw2 = qFloor( sw2 ); sh2 = qFloor( sh2 ); } QPolygonF triangle( 3 ); QPointF *trianglePoints = triangle.data(); for ( int i = 0; i < numPoints; i++ ) { const QPointF &pos = points[i]; double x = pos.x(); double y = pos.y(); if ( doAlign ) { x = qRound( x ); y = qRound( y ); } const double x1 = x - sw2; const double x2 = x1 + size.width(); const double y1 = y - sh2; const double y2 = y1 + size.height(); switch ( type ) { case QwtTriangle::Left: { trianglePoints[0].rx() = x2; trianglePoints[0].ry() = y1; trianglePoints[1].rx() = x1; trianglePoints[1].ry() = y; trianglePoints[2].rx() = x2; trianglePoints[2].ry() = y2; break; } case QwtTriangle::Right: { trianglePoints[0].rx() = x1; trianglePoints[0].ry() = y1; trianglePoints[1].rx() = x2; trianglePoints[1].ry() = y; trianglePoints[2].rx() = x1; trianglePoints[2].ry() = y2; break; } case QwtTriangle::Up: { trianglePoints[0].rx() = x1; trianglePoints[0].ry() = y2; trianglePoints[1].rx() = x; trianglePoints[1].ry() = y1; trianglePoints[2].rx() = x2; trianglePoints[2].ry() = y2; break; } case QwtTriangle::Down: { trianglePoints[0].rx() = x1; trianglePoints[0].ry() = y1; trianglePoints[1].rx() = x; trianglePoints[1].ry() = y2; trianglePoints[2].rx() = x2; trianglePoints[2].ry() = y1; break; } } QwtPainter::drawPolygon( painter, triangle ); } } static inline void qwtDrawLineSymbols( QPainter *painter, int orientations, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { const QSize size = symbol.size(); QPen pen = symbol.pen(); pen.setCapStyle( Qt::FlatCap ); painter->setPen( pen ); painter->setRenderHint( QPainter::Antialiasing, false ); if ( QwtPainter::roundingAlignment( painter ) ) { const int sw = qFloor( size.width() ); const int sh = qFloor( size.height() ); const int sw2 = size.width() / 2; const int sh2 = size.height() / 2; for ( int i = 0; i < numPoints; i++ ) { if ( orientations & Qt::Horizontal ) { const int x = qRound( points[i].x() ) - sw2; const int y = qRound( points[i].y() ); QwtPainter::drawLine( painter, x, y, x + sw, y ); } if ( orientations & Qt::Vertical ) { const int x = qRound( points[i].x() ); const int y = qRound( points[i].y() ) - sh2; QwtPainter::drawLine( painter, x, y, x, y + sh ); } } } else { const double sw = size.width(); const double sh = size.height(); const double sw2 = 0.5 * size.width(); const double sh2 = 0.5 * size.height(); for ( int i = 0; i < numPoints; i++ ) { if ( orientations & Qt::Horizontal ) { const double x = points[i].x() - sw2; const double y = points[i].y(); QwtPainter::drawLine( painter, x, y, x + sw, y ); } if ( orientations & Qt::Vertical ) { const double y = points[i].y() - sh2; const double x = points[i].x(); QwtPainter::drawLine( painter, x, y, x, y + sh ); } } } } static inline void qwtDrawXCrossSymbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { const QSize size = symbol.size(); QPen pen = symbol.pen(); pen.setCapStyle( Qt::FlatCap ); painter->setPen( pen ); if ( QwtPainter::roundingAlignment( painter ) ) { const int sw = size.width(); const int sh = size.height(); const int sw2 = size.width() / 2; const int sh2 = size.height() / 2; for ( int i = 0; i < numPoints; i++ ) { const QPointF &pos = points[i]; const int x = qRound( pos.x() ); const int y = qRound( pos.y() ); const int x1 = x - sw2; const int x2 = x1 + sw; const int y1 = y - sh2; const int y2 = y1 + sh; QwtPainter::drawLine( painter, x1, y1, x2, y2 ); QwtPainter::drawLine( painter, x2, y1, x1, y2 ); } } else { const double sw = size.width(); const double sh = size.height(); const double sw2 = 0.5 * size.width(); const double sh2 = 0.5 * size.height(); for ( int i = 0; i < numPoints; i++ ) { const QPointF &pos = points[i]; const double x1 = pos.x() - sw2; const double x2 = x1 + sw; const double y1 = pos.y() - sh2; const double y2 = y1 + sh; QwtPainter::drawLine( painter, x1, y1, x2, y2 ); QwtPainter::drawLine( painter, x1, y2, x2, y1 ); } } } static inline void qwtDrawStar1Symbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { const QSize size = symbol.size(); painter->setPen( symbol.pen() ); if ( QwtPainter::roundingAlignment( painter ) ) { QRect r( 0, 0, size.width(), size.height() ); for ( int i = 0; i < numPoints; i++ ) { r.moveCenter( points[i].toPoint() ); const double sqrt1_2 = 0.70710678118654752440; /* 1/sqrt(2) */ const double d1 = r.width() / 2.0 * ( 1.0 - sqrt1_2 ); QwtPainter::drawLine( painter, qRound( r.left() + d1 ), qRound( r.top() + d1 ), qRound( r.right() - d1 ), qRound( r.bottom() - d1 ) ); QwtPainter::drawLine( painter, qRound( r.left() + d1 ), qRound( r.bottom() - d1 ), qRound( r .right() - d1), qRound( r.top() + d1 ) ); const QPoint c = r.center(); QwtPainter::drawLine( painter, c.x(), r.top(), c.x(), r.bottom() ); QwtPainter::drawLine( painter, r.left(), c.y(), r.right(), c.y() ); } } else { QRectF r( 0, 0, size.width(), size.height() ); for ( int i = 0; i < numPoints; i++ ) { r.moveCenter( points[i] ); const double sqrt1_2 = 0.70710678118654752440; /* 1/sqrt(2) */ const QPointF c = r.center(); const double d1 = r.width() / 2.0 * ( 1.0 - sqrt1_2 ); QwtPainter::drawLine( painter, r.left() + d1, r.top() + d1, r.right() - d1, r.bottom() - d1 ); QwtPainter::drawLine( painter, r.left() + d1, r.bottom() - d1, r.right() - d1, r.top() + d1 ); QwtPainter::drawLine( painter, c.x(), r.top(), c.x(), r.bottom() ); QwtPainter::drawLine( painter, r.left(), c.y(), r.right(), c.y() ); } } } static inline void qwtDrawStar2Symbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { QPen pen = symbol.pen(); pen.setCapStyle( Qt::FlatCap ); pen.setJoinStyle( Qt::MiterJoin ); painter->setPen( pen ); painter->setBrush( symbol.brush() ); const double cos30 = 0.866025; // cos(30°) const double dy = 0.25 * symbol.size().height(); const double dx = 0.5 * symbol.size().width() * cos30 / 3.0; QPolygonF star( 12 ); QPointF *starPoints = star.data(); const bool doAlign = QwtPainter::roundingAlignment( painter ); for ( int i = 0; i < numPoints; i++ ) { double x = points[i].x(); double y = points[i].y(); if ( doAlign ) { x = qRound( x ); y = qRound( y ); } double x1 = x - 3 * dx; double y1 = y - 2 * dy; if ( doAlign ) { x1 = qRound( x - 3 * dx ); y1 = qRound( y - 2 * dy ); } const double x2 = x1 + 1 * dx; const double x3 = x1 + 2 * dx; const double x4 = x1 + 3 * dx; const double x5 = x1 + 4 * dx; const double x6 = x1 + 5 * dx; const double x7 = x1 + 6 * dx; const double y2 = y1 + 1 * dy; const double y3 = y1 + 2 * dy; const double y4 = y1 + 3 * dy; const double y5 = y1 + 4 * dy; starPoints[0].rx() = x4; starPoints[0].ry() = y1; starPoints[1].rx() = x5; starPoints[1].ry() = y2; starPoints[2].rx() = x7; starPoints[2].ry() = y2; starPoints[3].rx() = x6; starPoints[3].ry() = y3; starPoints[4].rx() = x7; starPoints[4].ry() = y4; starPoints[5].rx() = x5; starPoints[5].ry() = y4; starPoints[6].rx() = x4; starPoints[6].ry() = y5; starPoints[7].rx() = x3; starPoints[7].ry() = y4; starPoints[8].rx() = x1; starPoints[8].ry() = y4; starPoints[9].rx() = x2; starPoints[9].ry() = y3; starPoints[10].rx() = x1; starPoints[10].ry() = y2; starPoints[11].rx() = x3; starPoints[11].ry() = y2; QwtPainter::drawPolygon( painter, star ); } } static inline void qwtDrawHexagonSymbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { painter->setBrush( symbol.brush() ); painter->setPen( symbol.pen() ); const double cos30 = 0.866025; // cos(30°) const double dx = 0.5 * ( symbol.size().width() - cos30 ); const double dy = 0.25 * symbol.size().height(); QPolygonF hexaPolygon( 6 ); QPointF *hexaPoints = hexaPolygon.data(); const bool doAlign = QwtPainter::roundingAlignment( painter ); for ( int i = 0; i < numPoints; i++ ) { double x = points[i].x(); double y = points[i].y(); if ( doAlign ) { x = qRound( x ); y = qRound( y ); } double x1 = x - dx; double y1 = y - 2 * dy; if ( doAlign ) { x1 = qCeil( x1 ); y1 = qCeil( y1 ); } const double x2 = x1 + 1 * dx; const double x3 = x1 + 2 * dx; const double y2 = y1 + 1 * dy; const double y3 = y1 + 3 * dy; const double y4 = y1 + 4 * dy; hexaPoints[0].rx() = x2; hexaPoints[0].ry() = y1; hexaPoints[1].rx() = x3; hexaPoints[1].ry() = y2; hexaPoints[2].rx() = x3; hexaPoints[2].ry() = y3; hexaPoints[3].rx() = x2; hexaPoints[3].ry() = y4; hexaPoints[4].rx() = x1; hexaPoints[4].ry() = y3; hexaPoints[5].rx() = x1; hexaPoints[5].ry() = y2; QwtPainter::drawPolygon( painter, hexaPolygon ); } } class QwtSymbol::PrivateData { public: PrivateData( QwtSymbol::Style st, const QBrush &br, const QPen &pn, const QSize &sz ): style( st ), size( sz ), brush( br ), pen( pn ) { } bool operator==( const PrivateData &other ) const { return ( style == other.style ) && ( size == other.size ) && ( brush == other.brush ) && ( pen == other.pen ); } Style style; QSize size; QBrush brush; QPen pen; }; /*! Default Constructor \param style Symbol Style The symbol is constructed with gray interior, black outline with zero width, no size and style 'NoSymbol'. */ QwtSymbol::QwtSymbol( Style style ) { d_data = new PrivateData( style, QBrush( Qt::gray ), QPen( Qt::black ), QSize( 0.0, 0.0 ) ); } /*! \brief Constructor \param style Symbol Style \param brush brush to fill the interior \param pen outline pen \param size size \sa setStyle(), setBrush(), setPen(), setSize() */ QwtSymbol::QwtSymbol( QwtSymbol::Style style, const QBrush &brush, const QPen &pen, const QSize &size ) { d_data = new PrivateData( style, brush, pen, size ); } /*! \brief Copy constructor \param other Symbol */ QwtSymbol::QwtSymbol( const QwtSymbol &other ) { d_data = new PrivateData( other.style(), other.brush(), other.pen(), other.size() ); }; //! Destructor QwtSymbol::~QwtSymbol() { delete d_data; } //! \brief Assignment operator QwtSymbol &QwtSymbol::operator=( const QwtSymbol &other ) { *d_data = *other.d_data; return *this; } //! \brief Compare two symbols bool QwtSymbol::operator==( const QwtSymbol &other ) const { return *d_data == *other.d_data; } //! \brief Compare two symbols bool QwtSymbol::operator!=( const QwtSymbol &other ) const { return !( *d_data == *other.d_data ); } /*! \brief Specify the symbol's size If the 'h' parameter is left out or less than 0, and the 'w' parameter is greater than or equal to 0, the symbol size will be set to (w,w). \param width Width \param height Height (defaults to -1) \sa size() */ void QwtSymbol::setSize( int width, int height ) { if ( ( width >= 0 ) && ( height < 0 ) ) height = width; d_data->size = QSize( width, height ); } /*! Set the symbol's size \param size Size \sa size() */ void QwtSymbol::setSize( const QSize &size ) { if ( size.isValid() ) d_data->size = size; } /*! \return Size \sa setSize() */ const QSize& QwtSymbol::size() const { return d_data->size; } /*! \brief Assign a brush The brush is used to draw the interior of the symbol. \param brush Brush \sa brush() */ void QwtSymbol::setBrush( const QBrush &brush ) { d_data->brush = brush; } /*! \return Brush \sa setBrush() */ const QBrush& QwtSymbol::brush() const { return d_data->brush; } /*! Assign a pen The pen is used to draw the symbol's outline. \param pen Pen \sa pen(), setBrush() */ void QwtSymbol::setPen( const QPen &pen ) { d_data->pen = pen; } /*! \return Pen \sa setPen(), brush() */ const QPen& QwtSymbol::pen() const { return d_data->pen; } /*! \brief Set the color of the symbol Change the color of the brush for symbol types with a filled area. For all other symbol types the color will be assigned to the pen. \param color Color \sa setBrush(), setPen(), brush(), pen() */ void QwtSymbol::setColor( const QColor &color ) { switch ( d_data->style ) { case QwtSymbol::Ellipse: case QwtSymbol::Rect: case QwtSymbol::Diamond: case QwtSymbol::Triangle: case QwtSymbol::UTriangle: case QwtSymbol::DTriangle: case QwtSymbol::RTriangle: case QwtSymbol::LTriangle: case QwtSymbol::Star2: case QwtSymbol::Hexagon: { d_data->brush.setColor( color ); break; } case QwtSymbol::Cross: case QwtSymbol::XCross: case QwtSymbol::HLine: case QwtSymbol::VLine: case QwtSymbol::Star1: { d_data->pen.setColor( color ); break; } default: { d_data->brush.setColor( color ); d_data->pen.setColor( color ); } } } /*! Draw an array of symbols Painting several symbols is more effective than drawing symbols one by one, as a couple of layout calculations and setting of pen/brush can be done once for the complete array. \param painter Painter \param points Array of points \param numPoints Number of points */ void QwtSymbol::drawSymbols( QPainter *painter, const QPointF *points, int numPoints ) const { if ( numPoints <= 0 ) return; painter->save(); switch ( d_data->style ) { case QwtSymbol::Ellipse: { qwtDrawEllipseSymbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Rect: { qwtDrawRectSymbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Diamond: { qwtDrawDiamondSymbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Cross: { qwtDrawLineSymbols( painter, Qt::Horizontal | Qt::Vertical, points, numPoints, *this ); break; } case QwtSymbol::XCross: { qwtDrawXCrossSymbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Triangle: case QwtSymbol::UTriangle: { qwtDrawTriangleSymbols( painter, QwtTriangle::Up, points, numPoints, *this ); break; } case QwtSymbol::DTriangle: { qwtDrawTriangleSymbols( painter, QwtTriangle::Down, points, numPoints, *this ); break; } case QwtSymbol::RTriangle: { qwtDrawTriangleSymbols( painter, QwtTriangle::Right, points, numPoints, *this ); break; } case QwtSymbol::LTriangle: { qwtDrawTriangleSymbols( painter, QwtTriangle::Left, points, numPoints, *this ); break; } case QwtSymbol::HLine: { qwtDrawLineSymbols( painter, Qt::Horizontal, points, numPoints, *this ); break; } case QwtSymbol::VLine: { qwtDrawLineSymbols( painter, Qt::Vertical, points, numPoints, *this ); break; } case QwtSymbol::Star1: { qwtDrawStar1Symbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Star2: { qwtDrawStar2Symbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Hexagon: { qwtDrawHexagonSymbols( painter, points, numPoints, *this ); break; } default:; } painter->restore(); } //! \return Size of the bounding rectangle of a symbol QSize QwtSymbol::boundingSize() const { QSize size; switch ( d_data->style ) { case QwtSymbol::Ellipse: case QwtSymbol::Rect: case QwtSymbol::Hexagon: { qreal pw = 0.0; if ( d_data->pen.style() != Qt::NoPen ) pw = qMax( d_data->pen.widthF(), qreal( 1.0 ) ); size = d_data->size + QSize( pw, pw ); break; } case QwtSymbol::XCross: case QwtSymbol::Diamond: case QwtSymbol::Triangle: case QwtSymbol::UTriangle: case QwtSymbol::DTriangle: case QwtSymbol::RTriangle: case QwtSymbol::LTriangle: case QwtSymbol::Star1: case QwtSymbol::Star2: { qreal pw = 0.0; if ( d_data->pen.style() != Qt::NoPen ) pw = qMax( d_data->pen.widthF(), qreal( 1.0 ) ); size = d_data->size + QSize( 2 * pw, 2 * pw ); break; } default: { size = d_data->size; } } return size + QSize( 1, 1 ); // for antialiasing } /*! Specify the symbol style \param style Style \sa style() */ void QwtSymbol::setStyle( QwtSymbol::Style style ) { d_data->style = style; } /*! \return Current symbol style \sa setStyle() */ QwtSymbol::Style QwtSymbol::style() const { return d_data->style; } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_symbol.h000066400000000000000000000072261320135501600212570ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SYMBOL_H #define QWT_SYMBOL_H #include "qwt_global.h" #include class QPainter; class QRect; class QSize; class QBrush; class QPen; class QColor; class QPointF; //! A class for drawing symbols class QWT_EXPORT QwtSymbol { public: /*! Symbol Style - NoSymbol\n No Style. The symbol cannot be drawn. - Ellipse\n Ellipse or circle - Rect\n Rectangle - Diamond\n Diamond - Triangle\n Triangle pointing upwards - DTriangle\n Triangle pointing downwards - UTriangle\n Triangle pointing upwards - LTriangle\n Triangle pointing left - RTriangle\n Triangle pointing right - Cross\n Cross (+) - XCross\n Diagonal cross (X) - HLine\n Horizontal line - VLine\n Vertical line - Star1\n X combined with + - Star2\n Six-pointed star - Hexagon\n Hexagon - UserSymbol\n Styles >= UserSymbol are reserved for derived classes of QwtSymbol that overload drawSymbols() with additional application specific symbol types. \sa setStyle(), style() */ enum Style { NoSymbol = -1, Ellipse, Rect, Diamond, Triangle, DTriangle, UTriangle, LTriangle, RTriangle, Cross, XCross, HLine, VLine, Star1, Star2, Hexagon, UserSymbol = 1000 }; public: QwtSymbol( Style = NoSymbol ); QwtSymbol( Style, const QBrush &, const QPen &, const QSize & ); QwtSymbol( const QwtSymbol & ); virtual ~QwtSymbol(); QwtSymbol &operator=( const QwtSymbol & ); bool operator==( const QwtSymbol & ) const; bool operator!=( const QwtSymbol & ) const; void setSize( const QSize & ); void setSize( int width, int height = -1 ); const QSize& size() const; virtual void setColor( const QColor & ); void setBrush( const QBrush& b ); const QBrush& brush() const; void setPen( const QPen & ); const QPen& pen() const; void setStyle( Style ); Style style() const; void drawSymbol( QPainter *, const QPointF & ) const; void drawSymbols( QPainter *, const QPolygonF & ) const; virtual QSize boundingSize() const; protected: virtual void drawSymbols( QPainter *, const QPointF *, int numPoints ) const; private: class PrivateData; PrivateData *d_data; }; /*! \brief Draw the symbol at a specified position \param painter Painter \param pos Position of the symbol in screen coordinates */ inline void QwtSymbol::drawSymbol( QPainter *painter, const QPointF &pos ) const { drawSymbols( painter, &pos, 1 ); } /*! \brief Draw symbols at the specified points \param painter Painter \param points Positions of the symbols in screen coordinates */ inline void QwtSymbol::drawSymbols( QPainter *painter, const QPolygonF &points ) const { drawSymbols( painter, points.data(), points.size() ); } #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_text.cpp000066400000000000000000000364621320135501600212750ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2003 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_text.h" #include "qwt_painter.h" #include "qwt_text_engine.h" #include #include #include #include #include #include #include #include #include class QwtTextEngineDict { public: static QwtTextEngineDict &dict(); void setTextEngine( QwtText::TextFormat, QwtTextEngine * ); const QwtTextEngine *textEngine( QwtText::TextFormat ) const; const QwtTextEngine *textEngine( const QString &, QwtText::TextFormat ) const; private: QwtTextEngineDict(); ~QwtTextEngineDict(); typedef QMap EngineMap; inline const QwtTextEngine *engine( EngineMap::const_iterator &it ) const { return it.value(); } EngineMap d_map; }; QwtTextEngineDict &QwtTextEngineDict::dict() { static QwtTextEngineDict engineDict; return engineDict; } QwtTextEngineDict::QwtTextEngineDict() { d_map.insert( QwtText::PlainText, new QwtPlainTextEngine() ); #ifndef QT_NO_RICHTEXT d_map.insert( QwtText::RichText, new QwtRichTextEngine() ); #endif } QwtTextEngineDict::~QwtTextEngineDict() { for ( EngineMap::const_iterator it = d_map.begin(); it != d_map.end(); ++it ) { const QwtTextEngine *textEngine = engine( it ); delete textEngine; } } const QwtTextEngine *QwtTextEngineDict::textEngine( const QString& text, QwtText::TextFormat format ) const { if ( format == QwtText::AutoText ) { for ( EngineMap::const_iterator it = d_map.begin(); it != d_map.end(); ++it ) { if ( it.key() != QwtText::PlainText ) { const QwtTextEngine *e = engine( it ); if ( e && e->mightRender( text ) ) return e; } } } EngineMap::const_iterator it = d_map.find( format ); if ( it != d_map.end() ) { const QwtTextEngine *e = engine( it ); if ( e ) return e; } it = d_map.find( QwtText::PlainText ); return engine( it ); } void QwtTextEngineDict::setTextEngine( QwtText::TextFormat format, QwtTextEngine *engine ) { if ( format == QwtText::AutoText ) return; if ( format == QwtText::PlainText && engine == NULL ) return; EngineMap::const_iterator it = d_map.find( format ); if ( it != d_map.end() ) { const QwtTextEngine *e = this->engine( it ); if ( e ) delete e; d_map.remove( format ); } if ( engine != NULL ) d_map.insert( format, engine ); } const QwtTextEngine *QwtTextEngineDict::textEngine( QwtText::TextFormat format ) const { const QwtTextEngine *e = NULL; EngineMap::const_iterator it = d_map.find( format ); if ( it != d_map.end() ) e = engine( it ); return e; } class QwtText::PrivateData { public: PrivateData(): renderFlags( Qt::AlignCenter ), backgroundPen( Qt::NoPen ), backgroundBrush( Qt::NoBrush ), paintAttributes( 0 ), layoutAttributes( 0 ), textEngine( NULL ) { } int renderFlags; QString text; QFont font; QColor color; QPen backgroundPen; QBrush backgroundBrush; int paintAttributes; int layoutAttributes; const QwtTextEngine *textEngine; }; class QwtText::LayoutCache { public: void invalidate() { textSize = QSizeF(); } QFont font; QSizeF textSize; }; /*! Constructor \param text Text content \param textFormat Text format */ QwtText::QwtText( const QString &text, QwtText::TextFormat textFormat ) { d_data = new PrivateData; d_data->text = text; d_data->textEngine = textEngine( text, textFormat ); d_layoutCache = new LayoutCache; } //! Copy constructor QwtText::QwtText( const QwtText &other ) { d_data = new PrivateData; *d_data = *other.d_data; d_layoutCache = new LayoutCache; *d_layoutCache = *other.d_layoutCache; } //! Destructor QwtText::~QwtText() { delete d_data; delete d_layoutCache; } //! Assignment operator QwtText &QwtText::operator=( const QwtText & other ) { *d_data = *other.d_data; *d_layoutCache = *other.d_layoutCache; return *this; } //! Relational operator bool QwtText::operator==( const QwtText &other ) const { return d_data->renderFlags == other.d_data->renderFlags && d_data->text == other.d_data->text && d_data->font == other.d_data->font && d_data->color == other.d_data->color && d_data->backgroundPen == other.d_data->backgroundPen && d_data->backgroundBrush == other.d_data->backgroundBrush && d_data->paintAttributes == other.d_data->paintAttributes && d_data->textEngine == other.d_data->textEngine; } //! Relational operator bool QwtText::operator!=( const QwtText &other ) const // invalidate { return !( other == *this ); } /*! Assign a new text content \param text Text content \param textFormat Text format \sa text() */ void QwtText::setText( const QString &text, QwtText::TextFormat textFormat ) { d_data->text = text; d_data->textEngine = textEngine( text, textFormat ); d_layoutCache->invalidate(); } /*! Return the text. \sa setText() */ QString QwtText::text() const { return d_data->text; } /*! \brief Change the render flags The default setting is Qt::AlignCenter \param renderFlags Bitwise OR of the flags used like in QPainter::drawText \sa renderFlags(), QwtTextEngine::draw() \note Some renderFlags might have no effect, depending on the text format. */ void QwtText::setRenderFlags( int renderFlags ) { if ( renderFlags != d_data->renderFlags ) { d_data->renderFlags = renderFlags; d_layoutCache->invalidate(); } } /*! \return Render flags \sa setRenderFlags() */ int QwtText::renderFlags() const { return d_data->renderFlags; } /*! Set the font. \param font Font \note Setting the font might have no effect, when the text contains control sequences for setting fonts. */ void QwtText::setFont( const QFont &font ) { d_data->font = font; setPaintAttribute( PaintUsingTextFont ); } //! Return the font. QFont QwtText::font() const { return d_data->font; } /*! Return the font of the text, if it has one. Otherwise return defaultFont. \param defaultFont Default font \sa setFont(), font(), PaintAttributes */ QFont QwtText::usedFont( const QFont &defaultFont ) const { if ( d_data->paintAttributes & PaintUsingTextFont ) return d_data->font; return defaultFont; } /*! Set the pen color used for painting the text. \param color Color \note Setting the color might have no effect, when the text contains control sequences for setting colors. */ void QwtText::setColor( const QColor &color ) { d_data->color = color; setPaintAttribute( PaintUsingTextColor ); } //! Return the pen color, used for painting the text QColor QwtText::color() const { return d_data->color; } /*! Return the color of the text, if it has one. Otherwise return defaultColor. \param defaultColor Default color \sa setColor(), color(), PaintAttributes */ QColor QwtText::usedColor( const QColor &defaultColor ) const { if ( d_data->paintAttributes & PaintUsingTextColor ) return d_data->color; return defaultColor; } /*! Set the background pen \param pen Background pen \sa backgroundPen(), setBackgroundBrush() */ void QwtText::setBackgroundPen( const QPen &pen ) { d_data->backgroundPen = pen; setPaintAttribute( PaintBackground ); } /*! \return Background pen \sa setBackgroundPen(), backgroundBrush() */ QPen QwtText::backgroundPen() const { return d_data->backgroundPen; } /*! Set the background brush \param brush Background brush \sa backgroundBrush(), setBackgroundPen() */ void QwtText::setBackgroundBrush( const QBrush &brush ) { d_data->backgroundBrush = brush; setPaintAttribute( PaintBackground ); } /*! \return Background brush \sa setBackgroundBrush(), backgroundPen() */ QBrush QwtText::backgroundBrush() const { return d_data->backgroundBrush; } /*! Change a paint attribute \param attribute Paint attribute \param on On/Off \note Used by setFont(), setColor(), setBackgroundPen() and setBackgroundBrush() \sa testPaintAttribute() */ void QwtText::setPaintAttribute( PaintAttribute attribute, bool on ) { if ( on ) d_data->paintAttributes |= attribute; else d_data->paintAttributes &= ~attribute; } /*! Test a paint attribute \param attribute Paint attribute \return true, if attribute is enabled \sa setPaintAttribute() */ bool QwtText::testPaintAttribute( PaintAttribute attribute ) const { return d_data->paintAttributes & attribute; } /*! Change a layout attribute \param attribute Layout attribute \param on On/Off \sa testLayoutAttribute() */ void QwtText::setLayoutAttribute( LayoutAttribute attribute, bool on ) { if ( on ) d_data->layoutAttributes |= attribute; else d_data->layoutAttributes &= ~attribute; } /*! Test a layout attribute \param attribute Layout attribute \return true, if attribute is enabled \sa setLayoutAttribute() */ bool QwtText::testLayoutAttribute( LayoutAttribute attribute ) const { return d_data->layoutAttributes | attribute; } /*! Find the height for a given width \param defaultFont Font, used for the calculation if the text has no font \param width Width \return Calculated height */ double QwtText::heightForWidth( double width, const QFont &defaultFont ) const { // We want to calculate in screen metrics. So // we need a font that uses screen metrics const QFont font( usedFont( defaultFont ), QApplication::desktop() ); double h = 0; if ( d_data->layoutAttributes & MinimumLayout ) { double left, right, top, bottom; d_data->textEngine->textMargins( font, d_data->text, left, right, top, bottom ); h = d_data->textEngine->heightForWidth( font, d_data->renderFlags, d_data->text, width + left + right ); h -= top + bottom; } else { h = d_data->textEngine->heightForWidth( font, d_data->renderFlags, d_data->text, width ); } return h; } /*! Find the height for a given width \param defaultFont Font, used for the calculation if the text has no font \return Calculated height */ /*! Returns the size, that is needed to render text \param defaultFont Font of the text \return Caluclated size */ QSizeF QwtText::textSize( const QFont &defaultFont ) const { // We want to calculate in screen metrics. So // we need a font that uses screen metrics const QFont font( usedFont( defaultFont ), QApplication::desktop() ); if ( !d_layoutCache->textSize.isValid() || d_layoutCache->font != font ) { d_layoutCache->textSize = d_data->textEngine->textSize( font, d_data->renderFlags, d_data->text ); d_layoutCache->font = font; } QSizeF sz = d_layoutCache->textSize; if ( d_data->layoutAttributes & MinimumLayout ) { double left, right, top, bottom; d_data->textEngine->textMargins( font, d_data->text, left, right, top, bottom ); sz -= QSizeF( left + right, top + bottom ); } return sz; } /*! Draw a text into a rectangle \param painter Painter \param rect Rectangle */ void QwtText::draw( QPainter *painter, const QRectF &rect ) const { if ( d_data->paintAttributes & PaintBackground ) { if ( d_data->backgroundPen != Qt::NoPen || d_data->backgroundBrush != Qt::NoBrush ) { painter->save(); painter->setPen( d_data->backgroundPen ); painter->setBrush( d_data->backgroundBrush ); QwtPainter::drawRect( painter, rect ); painter->restore(); } } painter->save(); if ( d_data->paintAttributes & PaintUsingTextFont ) { painter->setFont( d_data->font ); } if ( d_data->paintAttributes & PaintUsingTextColor ) { if ( d_data->color.isValid() ) painter->setPen( d_data->color ); } QRectF expandedRect = rect; if ( d_data->layoutAttributes & MinimumLayout ) { // We want to calculate in screen metrics. So // we need a font that uses screen metrics const QFont font( painter->font(), QApplication::desktop() ); double left, right, top, bottom; d_data->textEngine->textMargins( font, d_data->text, left, right, top, bottom ); expandedRect.setTop( rect.top() - top ); expandedRect.setBottom( rect.bottom() + bottom ); expandedRect.setLeft( rect.left() - left ); expandedRect.setRight( rect.right() + right ); } d_data->textEngine->draw( painter, expandedRect, d_data->renderFlags, d_data->text ); painter->restore(); } /*! Find the text engine for a text format In case of QwtText::AutoText the first text engine (beside QwtPlainTextEngine) is returned, where QwtTextEngine::mightRender returns true. If there is none QwtPlainTextEngine is returnd. If no text engine is registered for the format QwtPlainTextEngine is returnd. \param text Text, needed in case of AutoText \param format Text format */ const QwtTextEngine *QwtText::textEngine( const QString &text, QwtText::TextFormat format ) { return QwtTextEngineDict::dict().textEngine( text, format ); } /*! Assign/Replace a text engine for a text format With setTextEngine it is possible to extend Qwt with other types of text formats. For QwtText::PlainText it is not allowed to assign a engine == NULL. \param format Text format \param engine Text engine \sa QwtMathMLTextEngine \warning Using QwtText::AutoText does nothing. */ void QwtText::setTextEngine( QwtText::TextFormat format, QwtTextEngine *engine ) { QwtTextEngineDict::dict().setTextEngine( format, engine ); } /*! \brief Find the text engine for a text format textEngine can be used to find out if a text format is supported. \param format Text format \return The text engine, or NULL if no engine is available. */ const QwtTextEngine *QwtText::textEngine( QwtText::TextFormat format ) { return QwtTextEngineDict::dict().textEngine( format ); } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_text.h000066400000000000000000000135041320135501600207320ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2003 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_TEXT_H #define QWT_TEXT_H #include "qwt_global.h" #include #include #include class QColor; class QPen; class QBrush; class QRectF; class QPainter; class QwtTextEngine; /*! \brief A class representing a text A QwtText is a text including a set of attributes how to render it. - Format\n A text might include control sequences (f.e tags) describing how to render it. Each format (f.e MathML, TeX, Qt Rich Text) has its own set of control sequences, that can be handles by a QwtTextEngine for this format. - Background\n A text might have a background, defined by a QPen and QBrush to improve its visibility. - Font\n A text might have an individual font. - Color\n A text might have an individual color. - Render Flags\n Flags from Qt::AlignmentFlag and Qt::TextFlag used like in QPainter::drawText. \sa QwtTextEngine, QwtTextLabel */ class QWT_EXPORT QwtText { public: /*! \brief Text format The text format defines the QwtTextEngine, that is used to render the text. - AutoText\n The text format is determined using QwtTextEngine::mightRender for all available text engines in increasing order > PlainText. If none of the text engines can render the text is rendered like PlainText. - PlainText\n Draw the text as it is, using a QwtPlainTextEngine. - RichText\n Use the Scribe framework (Qt Rich Text) to render the text. - MathMLText\n Use a MathML (http://en.wikipedia.org/wiki/MathML) render engine to display the text. The Qwt MathML extension offers such an engine based on the MathML renderer of the Qt solutions package. To enable MathML support the following code needs to be added to the application: \verbatimQwtText::setTextEngine(QwtText::MathMLText, new QwtMathMLTextEngine());\endverbatim - TeXText\n Use a TeX (http://en.wikipedia.org/wiki/TeX) render engine to display the text ( not implemented yet ). - OtherFormat\n The number of text formats can be extended using setTextEngine. Formats >= OtherFormat are not used by Qwt. \sa QwtTextEngine, setTextEngine() */ enum TextFormat { AutoText = 0, PlainText, RichText, MathMLText, TeXText, OtherFormat = 100 }; /*! \brief Paint Attributes Font and color and background are optional attributes of a QwtText. The paint attributes hold the information, if they are set. - PaintUsingTextFont\n The text has an individual font. - PaintUsingTextColor\n The text has an individual color. - PaintBackground\n The text has an individual background. */ enum PaintAttribute { PaintUsingTextFont = 1, PaintUsingTextColor = 2, PaintBackground = 4 }; /*! \brief Layout Attributes The layout attributes affects some aspects of the layout of the text. - MinimumLayout\n Layout the text without its margins. This mode is useful if a text needs to be aligned accurately, like the tick labels of a scale. If QwtTextEngine::textMargins is not implemented for the format of the text, MinimumLayout has no effect. */ enum LayoutAttribute { MinimumLayout = 1 }; QwtText( const QString & = QString::null, TextFormat textFormat = AutoText ); QwtText( const QwtText & ); ~QwtText(); QwtText &operator=( const QwtText & ); bool operator==( const QwtText & ) const; bool operator!=( const QwtText & ) const; void setText( const QString &, QwtText::TextFormat textFormat = AutoText ); QString text() const; bool isNull() const; bool isEmpty() const; void setFont( const QFont & ); QFont font() const; QFont usedFont( const QFont & ) const; void setRenderFlags( int flags ); int renderFlags() const; void setColor( const QColor & ); QColor color() const; QColor usedColor( const QColor & ) const; void setBackgroundPen( const QPen & ); QPen backgroundPen() const; void setBackgroundBrush( const QBrush & ); QBrush backgroundBrush() const; void setPaintAttribute( PaintAttribute, bool on = true ); bool testPaintAttribute( PaintAttribute ) const; void setLayoutAttribute( LayoutAttribute, bool on = true ); bool testLayoutAttribute( LayoutAttribute ) const; double heightForWidth( double width, const QFont & = QFont() ) const; QSizeF textSize( const QFont & = QFont() ) const; void draw( QPainter *painter, const QRectF &rect ) const; static const QwtTextEngine *textEngine( const QString &text, QwtText::TextFormat = AutoText ); static const QwtTextEngine *textEngine( QwtText::TextFormat ); static void setTextEngine( QwtText::TextFormat, QwtTextEngine * ); private: class PrivateData; PrivateData *d_data; class LayoutCache; LayoutCache *d_layoutCache; }; //! \return text().isNull() inline bool QwtText::isNull() const { return text().isNull(); } //! \return text().isEmpty() inline bool QwtText::isEmpty() const { return text().isEmpty(); } #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_text_engine.cpp000066400000000000000000000216051320135501600226130ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2003 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_text_engine.h" #include "qwt_math.h" #include "qwt_painter.h" #include #include #include #include #include #include #include #include static QString taggedRichText( const QString &text, int flags ) { QString richText = text; // By default QSimpleRichText is Qt::AlignLeft if ( flags & Qt::AlignJustify ) { richText.prepend( QString::fromLatin1( "
    " ) ); richText.append( QString::fromLatin1( "
    " ) ); } else if ( flags & Qt::AlignRight ) { richText.prepend( QString::fromLatin1( "
    " ) ); richText.append( QString::fromLatin1( "
    " ) ); } else if ( flags & Qt::AlignHCenter ) { richText.prepend( QString::fromLatin1( "
    " ) ); richText.append( QString::fromLatin1( "
    " ) ); } return richText; } class QwtRichTextDocument: public QTextDocument { public: QwtRichTextDocument( const QString &text, int flags, const QFont &font ) { setUndoRedoEnabled( false ); setDefaultFont( font ); setHtml( text ); // make sure we have a document layout ( void )documentLayout(); QTextOption option = defaultTextOption(); if ( flags & Qt::TextWordWrap ) option.setWrapMode( QTextOption::WordWrap ); else option.setWrapMode( QTextOption::NoWrap ); option.setAlignment( ( Qt::Alignment ) flags ); setDefaultTextOption( option ); QTextFrame *root = rootFrame(); QTextFrameFormat fm = root->frameFormat(); fm.setBorder( 0 ); fm.setMargin( 0 ); fm.setPadding( 0 ); fm.setBottomMargin( 0 ); fm.setLeftMargin( 0 ); root->setFrameFormat( fm ); adjustSize(); } }; class QwtPlainTextEngine::PrivateData { public: int effectiveAscent( const QFont &font ) const { const QString fontKey = font.key(); QMap::const_iterator it = d_ascentCache.find( fontKey ); if ( it == d_ascentCache.end() ) { int ascent = findAscent( font ); it = d_ascentCache.insert( fontKey, ascent ); } return ( *it ); } private: int findAscent( const QFont &font ) const { static const QString dummy( "E" ); static const QColor white( Qt::white ); const QFontMetrics fm( font ); QPixmap pm( fm.width( dummy ), fm.height() ); pm.fill( white ); QPainter p( &pm ); p.setFont( font ); p.drawText( 0, 0, pm.width(), pm.height(), 0, dummy ); p.end(); const QImage img = pm.toImage(); int row = 0; for ( row = 0; row < img.height(); row++ ) { const QRgb *line = ( const QRgb * )img.scanLine( row ); const int w = pm.width(); for ( int col = 0; col < w; col++ ) { if ( line[col] != white.rgb() ) return fm.ascent() - row + 1; } } return fm.ascent(); } mutable QMap d_ascentCache; }; //! Constructor QwtTextEngine::QwtTextEngine() { } //! Destructor QwtTextEngine::~QwtTextEngine() { } //! Constructor QwtPlainTextEngine::QwtPlainTextEngine() { d_data = new PrivateData; } //! Destructor QwtPlainTextEngine::~QwtPlainTextEngine() { delete d_data; } /*! Find the height for a given width \param font Font of the text \param flags Bitwise OR of the flags used like in QPainter::drawText \param text Text to be rendered \param width Width \return Calculated height */ double QwtPlainTextEngine::heightForWidth( const QFont& font, int flags, const QString& text, double width ) const { const QFontMetricsF fm( font ); const QRectF rect = fm.boundingRect( QRectF( 0, 0, width, QWIDGETSIZE_MAX ), flags, text ); return rect.height(); } /*! Returns the size, that is needed to render text \param font Font of the text \param flags Bitwise OR of the flags used like in QPainter::drawText \param text Text to be rendered \return Caluclated size */ QSizeF QwtPlainTextEngine::textSize( const QFont &font, int flags, const QString& text ) const { const QFontMetricsF fm( font ); const QRectF rect = fm.boundingRect( QRectF( 0, 0, QWIDGETSIZE_MAX, QWIDGETSIZE_MAX ), flags, text ); return rect.size(); } /*! Return margins around the texts \param font Font of the text \param left Return 0 \param right Return 0 \param top Return value for the top margin \param bottom Return value for the bottom margin */ void QwtPlainTextEngine::textMargins( const QFont &font, const QString &, double &left, double &right, double &top, double &bottom ) const { left = right = top = 0; const QFontMetricsF fm( font ); top = fm.ascent() - d_data->effectiveAscent( font ); bottom = fm.descent(); } /*! \brief Draw the text in a clipping rectangle A wrapper for QPainter::drawText. \param painter Painter \param rect Clipping rectangle \param flags Bitwise OR of the flags used like in QPainter::drawText \param text Text to be rendered */ void QwtPlainTextEngine::draw( QPainter *painter, const QRectF &rect, int flags, const QString& text ) const { QwtPainter::drawText( painter, rect, flags, text ); } /*! Test if a string can be rendered by this text engine. \return Always true. All texts can be rendered by QwtPlainTextEngine */ bool QwtPlainTextEngine::mightRender( const QString & ) const { return true; } #ifndef QT_NO_RICHTEXT //! Constructor QwtRichTextEngine::QwtRichTextEngine() { } /*! Find the height for a given width \param font Font of the text \param flags Bitwise OR of the flags used like in QPainter::drawText \param text Text to be rendered \param width Width \return Calculated height */ double QwtRichTextEngine::heightForWidth( const QFont& font, int flags, const QString& text, double width ) const { QwtRichTextDocument doc( text, flags, font ); doc.setPageSize( QSizeF( width, QWIDGETSIZE_MAX ) ); return doc.documentLayout()->documentSize().height(); } /*! Returns the size, that is needed to render text \param font Font of the text \param flags Bitwise OR of the flags used like in QPainter::drawText \param text Text to be rendered \return Caluclated size */ QSizeF QwtRichTextEngine::textSize( const QFont &font, int flags, const QString& text ) const { QwtRichTextDocument doc( text, flags, font ); QTextOption option = doc.defaultTextOption(); if ( option.wrapMode() != QTextOption::NoWrap ) { option.setWrapMode( QTextOption::NoWrap ); doc.setDefaultTextOption( option ); doc.adjustSize(); } return doc.size(); } /*! Draw the text in a clipping rectangle \param painter Painter \param rect Clipping rectangle \param flags Bitwise OR of the flags like in for QPainter::drawText \param text Text to be rendered */ void QwtRichTextEngine::draw( QPainter *painter, const QRectF &rect, int flags, const QString& text ) const { QwtRichTextDocument doc( text, flags, painter->font() ); QwtPainter::drawSimpleRichText( painter, rect, flags, doc ); } /*! Wrap text into
    tags according flags \param text Text \param flags Bitwise OR of the flags like in for QPainter::drawText \return Tagged text */ QString QwtRichTextEngine::taggedText( const QString &text, int flags ) const { return taggedRichText( text, flags ); } /*! Test if a string can be rendered by this text engine \param text Text to be tested \return QStyleSheet::mightBeRichText(text); */ bool QwtRichTextEngine::mightRender( const QString &text ) const { return Qt::mightBeRichText( text ); } /*! Return margins around the texts \param left Return 0 \param right Return 0 \param top Return 0 \param bottom Return 0 */ void QwtRichTextEngine::textMargins( const QFont &, const QString &, double &left, double &right, double &top, double &bottom ) const { left = right = top = bottom = 0; } #endif // !QT_NO_RICHTEXT starpu-1.2.3+dfsg/starpu-top/qwt/qwt_text_engine.h000066400000000000000000000116371320135501600222640ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2003 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_TEXT_ENGINE_H #define QWT_TEXT_ENGINE_H 1 #include "qwt_global.h" #include class QFont; class QRectF; class QString; class QPainter; /*! \brief Abstract base class for rendering text strings A text engine is responsible for rendering texts for a specific text format. They are used by QwtText to render a text. QwtPlainTextEngine and QwtRichTextEngine are part of the Qwt library. The implementation of QwtMathMLTextEngine uses code from the Qt solution package. Because of license implications it is built into a separate library. \sa QwtText::setTextEngine() */ class QWT_EXPORT QwtTextEngine { public: virtual ~QwtTextEngine(); /*! Find the height for a given width \param font Font of the text \param flags Bitwise OR of the flags used like in QPainter::drawText \param text Text to be rendered \param width Width \return Calculated height */ virtual double heightForWidth( const QFont &font, int flags, const QString &text, double width ) const = 0; /*! Returns the size, that is needed to render text \param font Font of the text \param flags Bitwise OR of the flags like in for QPainter::drawText \param text Text to be rendered \return Caluclated size */ virtual QSizeF textSize( const QFont &font, int flags, const QString &text ) const = 0; /*! Test if a string can be rendered by this text engine \param text Text to be tested \return true, if it can be rendered */ virtual bool mightRender( const QString &text ) const = 0; /*! Return margins around the texts The textSize might include margins around the text, like QFontMetrics::descent. In situations where texts need to be aligend in detail, knowing these margins might improve the layout calculations. \param font Font of the text \param text Text to be rendered \param left Return value for the left margin \param right Return value for the right margin \param top Return value for the top margin \param bottom Return value for the bottom margin */ virtual void textMargins( const QFont &font, const QString &text, double &left, double &right, double &top, double &bottom ) const = 0; /*! Draw the text in a clipping rectangle \param painter Painter \param rect Clipping rectangle \param flags Bitwise OR of the flags like in for QPainter::drawText \param text Text to be rendered */ virtual void draw( QPainter *painter, const QRectF &rect, int flags, const QString &text ) const = 0; protected: QwtTextEngine(); }; /*! \brief A text engine for plain texts QwtPlainTextEngine renders texts using the basic Qt classes QPainter and QFontMetrics. */ class QWT_EXPORT QwtPlainTextEngine: public QwtTextEngine { public: QwtPlainTextEngine(); virtual ~QwtPlainTextEngine(); virtual double heightForWidth( const QFont &font, int flags, const QString &text, double width ) const; virtual QSizeF textSize( const QFont &font, int flags, const QString &text ) const; virtual void draw( QPainter *painter, const QRectF &rect, int flags, const QString &text ) const; virtual bool mightRender( const QString & ) const; virtual void textMargins( const QFont &, const QString &, double &left, double &right, double &top, double &bottom ) const; private: class PrivateData; PrivateData *d_data; }; #ifndef QT_NO_RICHTEXT /*! \brief A text engine for Qt rich texts QwtRichTextEngine renders Qt rich texts using the classes of the Scribe framework of Qt. */ class QWT_EXPORT QwtRichTextEngine: public QwtTextEngine { public: QwtRichTextEngine(); virtual double heightForWidth( const QFont &font, int flags, const QString &text, double width ) const; virtual QSizeF textSize( const QFont &font, int flags, const QString &text ) const; virtual void draw( QPainter *painter, const QRectF &rect, int flags, const QString &text ) const; virtual bool mightRender( const QString & ) const; virtual void textMargins( const QFont &, const QString &, double &left, double &right, double &top, double &bottom ) const; private: QString taggedText( const QString &, int flags ) const; }; #endif // !QT_NO_RICHTEXT #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_text_label.cpp000066400000000000000000000154171320135501600224310ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_text_label.h" #include "qwt_text.h" #include "qwt_painter.h" #include #include #include class QwtTextLabel::PrivateData { public: PrivateData(): indent( 4 ), margin( 0 ) { } int indent; int margin; QwtText text; }; /*! Constructs an empty label. \param parent Parent widget */ QwtTextLabel::QwtTextLabel( QWidget *parent ): QFrame( parent ) { init(); } /*! Constructs a label that displays the text, text \param parent Parent widget \param text Text */ QwtTextLabel::QwtTextLabel( const QwtText &text, QWidget *parent ): QFrame( parent ) { init(); d_data->text = text; } //! Destructor QwtTextLabel::~QwtTextLabel() { delete d_data; } void QwtTextLabel::init() { d_data = new PrivateData(); setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ); } /*! Change the label's text, keeping all other QwtText attributes \param text New text \param textFormat Format of text \sa QwtText */ void QwtTextLabel::setText( const QString &text, QwtText::TextFormat textFormat ) { d_data->text.setText( text, textFormat ); update(); updateGeometry(); } /*! Change the label's text \param text New text */ void QwtTextLabel::setText( const QwtText &text ) { d_data->text = text; update(); updateGeometry(); } //! Return the text const QwtText &QwtTextLabel::text() const { return d_data->text; } //! Clear the text and all QwtText attributes void QwtTextLabel::clear() { d_data->text = QwtText(); update(); updateGeometry(); } //! Return label's text indent in pixels int QwtTextLabel::indent() const { return d_data->indent; } /*! Set label's text indent in pixels \param indent Indentation in pixels */ void QwtTextLabel::setIndent( int indent ) { if ( indent < 0 ) indent = 0; d_data->indent = indent; update(); updateGeometry(); } //! Return label's text indent in pixels int QwtTextLabel::margin() const { return d_data->margin; } /*! Set label's margin in pixels \param margin Margin in pixels */ void QwtTextLabel::setMargin( int margin ) { d_data->margin = margin; update(); updateGeometry(); } //! Return label's margin in pixels QSize QwtTextLabel::sizeHint() const { return minimumSizeHint(); } //! Return a minimum size hint QSize QwtTextLabel::minimumSizeHint() const { QSizeF sz = d_data->text.textSize( font() ); int mw = 2 * ( frameWidth() + d_data->margin ); int mh = mw; int indent = d_data->indent; if ( indent <= 0 ) indent = defaultIndent(); if ( indent > 0 ) { const int align = d_data->text.renderFlags(); if ( align & Qt::AlignLeft || align & Qt::AlignRight ) mw += d_data->indent; else if ( align & Qt::AlignTop || align & Qt::AlignBottom ) mh += d_data->indent; } sz += QSizeF( mw, mh ); return QSize( qCeil( sz.width() ), qCeil( sz.height() ) ); } /*! Returns the preferred height for this widget, given the width. \param width Width */ int QwtTextLabel::heightForWidth( int width ) const { const int renderFlags = d_data->text.renderFlags(); int indent = d_data->indent; if ( indent <= 0 ) indent = defaultIndent(); width -= 2 * frameWidth(); if ( renderFlags & Qt::AlignLeft || renderFlags & Qt::AlignRight ) width -= indent; int height = d_data->text.heightForWidth( width, font() ); if ( renderFlags & Qt::AlignTop || renderFlags & Qt::AlignBottom ) height += indent; height += 2 * frameWidth(); return height; } /*! Qt paint event \param event Paint event */ void QwtTextLabel::paintEvent( QPaintEvent *event ) { QPainter painter( this ); if ( !contentsRect().contains( event->rect() ) ) { painter.save(); painter.setClipRegion( event->region() & frameRect() ); drawFrame( &painter ); painter.restore(); } painter.setClipRegion( event->region() & contentsRect() ); drawContents( &painter ); } //! Redraw the text and focus indicator void QwtTextLabel::drawContents( QPainter *painter ) { const QRect r = textRect(); if ( r.isEmpty() ) return; painter->setFont( font() ); painter->setPen( palette().color( QPalette::Active, QPalette::Text ) ); drawText( painter, r ); if ( hasFocus() ) { const int margin = 2; QRect focusRect = contentsRect(); focusRect.setRect( focusRect.x() + margin, focusRect.y() + margin, focusRect.width() - 2 * margin - 2, focusRect.height() - 2 * margin - 2 ); QwtPainter::drawFocusRect( painter, this, focusRect ); } } //! Redraw the text void QwtTextLabel::drawText( QPainter *painter, const QRect &textRect ) { d_data->text.draw( painter, textRect ); } /*! Calculate the rect for the text in widget coordinates \return Text rect */ QRect QwtTextLabel::textRect() const { QRect r = contentsRect(); if ( !r.isEmpty() && d_data->margin > 0 ) { r.setRect( r.x() + d_data->margin, r.y() + d_data->margin, r.width() - 2 * d_data->margin, r.height() - 2 * d_data->margin ); } if ( !r.isEmpty() ) { int indent = d_data->indent; if ( indent <= 0 ) indent = defaultIndent(); if ( indent > 0 ) { const int renderFlags = d_data->text.renderFlags(); if ( renderFlags & Qt::AlignLeft ) r.setX( r.x() + indent ); else if ( renderFlags & Qt::AlignRight ) r.setWidth( r.width() - indent ); else if ( renderFlags & Qt::AlignTop ) r.setY( r.y() + indent ); else if ( renderFlags & Qt::AlignBottom ) r.setHeight( r.height() - indent ); } } return r; } int QwtTextLabel::defaultIndent() const { if ( frameWidth() <= 0 ) return 0; QFont fnt; if ( d_data->text.testPaintAttribute( QwtText::PaintUsingTextFont ) ) fnt = d_data->text.font(); else fnt = font(); return QFontMetrics( fnt ).width( 'x' ) / 2; } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_text_label.h000066400000000000000000000033541320135501600220730ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_TEXT_LABEL_H #define QWT_TEXT_LABEL_H #include "qwt_global.h" #include "qwt_text.h" #include class QString; class QPaintEvent; class QPainter; /*! \brief A Widget which displays a QwtText */ class QWT_EXPORT QwtTextLabel : public QFrame { Q_OBJECT Q_PROPERTY( int indent READ indent WRITE setIndent ) Q_PROPERTY( int margin READ margin WRITE setMargin ) public: explicit QwtTextLabel( QWidget *parent = NULL ); explicit QwtTextLabel( const QwtText &, QWidget *parent = NULL ); virtual ~QwtTextLabel(); public Q_SLOTS: void setText( const QString &, QwtText::TextFormat textFormat = QwtText::AutoText ); virtual void setText( const QwtText & ); void clear(); public: const QwtText &text() const; int indent() const; void setIndent( int ); int margin() const; void setMargin( int ); virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; virtual int heightForWidth( int ) const; QRect textRect() const; protected: virtual void paintEvent( QPaintEvent *e ); virtual void drawContents( QPainter * ); virtual void drawText( QPainter *, const QRect & ); private: void init(); int defaultIndent() const; class PrivateData; PrivateData *d_data; }; #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_thermo.cpp000066400000000000000000000564661320135501600216150ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_thermo.h" #include "qwt_math.h" #include "qwt_scale_engine.h" #include "qwt_scale_draw.h" #include "qwt_scale_map.h" #include #include #include #include #include #include #include class QwtThermo::PrivateData { public: PrivateData(): fillBrush( Qt::black ), alarmBrush( Qt::white ), orientation( Qt::Vertical ), scalePos( QwtThermo::LeftScale ), borderWidth( 2 ), scaleDist( 3 ), thermoWidth( 10 ), minValue( 0.0 ), maxValue( 1.0 ), value( 0.0 ), alarmLevel( 0.0 ), alarmEnabled( false ) { map.setScaleInterval( minValue, maxValue ); } QwtScaleMap map; QRect thermoRect; QBrush fillBrush; QBrush alarmBrush; Qt::Orientation orientation; ScalePos scalePos; int borderWidth; int scaleDist; int thermoWidth; double minValue; double maxValue; double value; double alarmLevel; bool alarmEnabled; }; /*! Constructor \param parent Parent widget */ QwtThermo::QwtThermo( QWidget *parent ): QWidget( parent ) { initThermo(); } void QwtThermo::initThermo() { d_data = new PrivateData; setRange( d_data->minValue, d_data->maxValue, false ); QSizePolicy policy( QSizePolicy::MinimumExpanding, QSizePolicy::Fixed ); if ( d_data->orientation == Qt::Vertical ) policy.transpose(); setSizePolicy( policy ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); } //! Destructor QwtThermo::~QwtThermo() { delete d_data; } /*! Set the maximum value. \param max Maximum value \sa maxValue(), setMinValue() */ void QwtThermo::setMaxValue( double max ) { setRange( d_data->minValue, max ); } //! Return the maximum value. double QwtThermo::maxValue() const { return d_data->maxValue; } /*! Set the minimum value. \param min Minimum value \sa minValue(), setMaxValue() */ void QwtThermo::setMinValue( double min ) { setRange( min, d_data->maxValue ); } //! Return the minimum value. double QwtThermo::minValue() const { return d_data->minValue; } /*! Set the current value. \param value New Value \sa value() */ void QwtThermo::setValue( double value ) { if ( d_data->value != value ) { d_data->value = value; update(); } } //! Return the value. double QwtThermo::value() const { return d_data->value; } /*! \brief Set a scale draw For changing the labels of the scales, it is necessary to derive from QwtScaleDraw and overload QwtScaleDraw::label(). \param scaleDraw ScaleDraw object, that has to be created with new and will be deleted in ~QwtThermo or the next call of setScaleDraw(). */ void QwtThermo::setScaleDraw( QwtScaleDraw *scaleDraw ) { setAbstractScaleDraw( scaleDraw ); } /*! \return the scale draw of the thermo \sa setScaleDraw() */ const QwtScaleDraw *QwtThermo::scaleDraw() const { return static_cast( abstractScaleDraw() ); } /*! \return the scale draw of the thermo \sa setScaleDraw() */ QwtScaleDraw *QwtThermo::scaleDraw() { return static_cast( abstractScaleDraw() ); } /*! Qt paint event. event Paint event */ void QwtThermo::paintEvent( QPaintEvent *event ) { // Use double-buffering const QRect &ur = event->rect(); if ( ur.isValid() ) { QPainter painter( this ); draw( &painter, ur ); } } /*! Draw the whole QwtThermo. \param painter Painter \param rect Update rectangle */ void QwtThermo::draw( QPainter *painter, const QRect& rect ) { if ( !d_data->thermoRect.contains( rect ) ) { if ( d_data->scalePos != NoScale ) scaleDraw()->draw( painter, palette() ); qDrawShadePanel( painter, d_data->thermoRect.x() - d_data->borderWidth, d_data->thermoRect.y() - d_data->borderWidth, d_data->thermoRect.width() + 2 * d_data->borderWidth, d_data->thermoRect.height() + 2 * d_data->borderWidth, palette(), true, d_data->borderWidth, 0 ); } drawThermo( painter ); } //! Qt resize event handler void QwtThermo::resizeEvent( QResizeEvent * ) { layoutThermo( false ); } /*! Recalculate the QwtThermo geometry and layout based on the QwtThermo::rect() and the fonts. \param update_geometry notify the layout system and call update to redraw the scale */ void QwtThermo::layoutThermo( bool update_geometry ) { QRect r = rect(); int mbd = 0; if ( d_data->scalePos != NoScale ) { int d1, d2; scaleDraw()->getBorderDistHint( font(), d1, d2 ); mbd = qMax( d1, d2 ); } if ( d_data->orientation == Qt::Horizontal ) { switch ( d_data->scalePos ) { case TopScale: { d_data->thermoRect.setRect( r.x() + mbd + d_data->borderWidth, r.y() + r.height() - d_data->thermoWidth - 2*d_data->borderWidth, r.width() - 2*( d_data->borderWidth + mbd ), d_data->thermoWidth ); scaleDraw()->setAlignment( QwtScaleDraw::TopScale ); scaleDraw()->move( d_data->thermoRect.x(), d_data->thermoRect.y() - d_data->borderWidth - d_data->scaleDist ); scaleDraw()->setLength( d_data->thermoRect.width() ); break; } case BottomScale: case NoScale: // like Bottom but without scale default: // inconsistent orientation and scale position // Mapping between values and pixels requires // initialization of the scale geometry { d_data->thermoRect.setRect( r.x() + mbd + d_data->borderWidth, r.y() + d_data->borderWidth, r.width() - 2*( d_data->borderWidth + mbd ), d_data->thermoWidth ); scaleDraw()->setAlignment( QwtScaleDraw::BottomScale ); scaleDraw()->move( d_data->thermoRect.x(), d_data->thermoRect.y() + d_data->thermoRect.height() + d_data->borderWidth + d_data->scaleDist ); scaleDraw()->setLength( d_data->thermoRect.width() ); break; } } d_data->map.setPaintInterval( d_data->thermoRect.x(), d_data->thermoRect.x() + d_data->thermoRect.width() - 1 ); } else // Qt::Vertical { switch ( d_data->scalePos ) { case RightScale: { d_data->thermoRect.setRect( r.x() + d_data->borderWidth, r.y() + mbd + d_data->borderWidth, d_data->thermoWidth, r.height() - 2*( d_data->borderWidth + mbd ) ); scaleDraw()->setAlignment( QwtScaleDraw::RightScale ); scaleDraw()->move( d_data->thermoRect.x() + d_data->thermoRect.width() + d_data->borderWidth + d_data->scaleDist, d_data->thermoRect.y() ); scaleDraw()->setLength( d_data->thermoRect.height() ); break; } case LeftScale: case NoScale: // like Left but without scale default: // inconsistent orientation and scale position // Mapping between values and pixels requires // initialization of the scale geometry { d_data->thermoRect.setRect( r.x() + r.width() - 2*d_data->borderWidth - d_data->thermoWidth, r.y() + mbd + d_data->borderWidth, d_data->thermoWidth, r.height() - 2*( d_data->borderWidth + mbd ) ); scaleDraw()->setAlignment( QwtScaleDraw::LeftScale ); scaleDraw()->move( d_data->thermoRect.x() - d_data->scaleDist - d_data->borderWidth, d_data->thermoRect.y() ); scaleDraw()->setLength( d_data->thermoRect.height() ); break; } } d_data->map.setPaintInterval( d_data->thermoRect.y() + d_data->thermoRect.height() - 1, d_data->thermoRect.y() ); } if ( update_geometry ) { updateGeometry(); update(); } } /*! \brief Set the thermometer orientation and the scale position. The scale position NoScale disables the scale. \param o orientation. Possible values are Qt::Horizontal and Qt::Vertical. The default value is Qt::Vertical. \param s Position of the scale. The default value is NoScale. A valid combination of scale position and orientation is enforced: - a horizontal thermometer can have the scale positions TopScale, BottomScale or NoScale; - a vertical thermometer can have the scale positions LeftScale, RightScale or NoScale; - an invalid scale position will default to NoScale. \sa setScalePosition() */ void QwtThermo::setOrientation( Qt::Orientation o, ScalePos s ) { if ( o == d_data->orientation && s == d_data->scalePos ) return; switch ( o ) { case Qt::Horizontal: { if ( ( s == NoScale ) || ( s == BottomScale ) || ( s == TopScale ) ) d_data->scalePos = s; else d_data->scalePos = NoScale; break; } case Qt::Vertical: { if ( ( s == NoScale ) || ( s == LeftScale ) || ( s == RightScale ) ) d_data->scalePos = s; else d_data->scalePos = NoScale; break; } } if ( o != d_data->orientation ) { if ( !testAttribute( Qt::WA_WState_OwnSizePolicy ) ) { QSizePolicy sp = sizePolicy(); sp.transpose(); setSizePolicy( sp ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); } } d_data->orientation = o; layoutThermo(); } /*! \brief Change the scale position (and thermometer orientation). \param scalePos Position of the scale. A valid combination of scale position and orientation is enforced: - if the new scale position is LeftScale or RightScale, the scale orientation will become Qt::Vertical; - if the new scale position is BottomScale or TopScale, the scale orientation will become Qt::Horizontal; - if the new scale position is NoScale, the scale orientation will not change. \sa setOrientation(), scalePosition() */ void QwtThermo::setScalePosition( ScalePos scalePos ) { if ( ( scalePos == BottomScale ) || ( scalePos == TopScale ) ) setOrientation( Qt::Horizontal, scalePos ); else if ( ( scalePos == LeftScale ) || ( scalePos == RightScale ) ) setOrientation( Qt::Vertical, scalePos ); else setOrientation( d_data->orientation, NoScale ); } /*! Return the scale position. \sa setScalePosition() */ QwtThermo::ScalePos QwtThermo::scalePosition() const { return d_data->scalePos; } //! Notify a font change. void QwtThermo::fontChange( const QFont &f ) { #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) QWidget::fontChange( f ); #endif layoutThermo(); } //! Notify a scale change. void QwtThermo::scaleChange() { update(); layoutThermo(); } /*! Redraw the liquid in thermometer pipe. \param painter Painter */ void QwtThermo::drawThermo( QPainter *painter ) { int alarm = 0, taval = 0; QRect fRect; QRect aRect; QRect bRect; int inverted = ( d_data->maxValue < d_data->minValue ); // // Determine if value exceeds alarm threshold. // Note: The alarm value is allowed to lie // outside the interval (minValue, maxValue). // if ( d_data->alarmEnabled ) { if ( inverted ) { alarm = ( ( d_data->alarmLevel >= d_data->maxValue ) && ( d_data->alarmLevel <= d_data->minValue ) && ( d_data->value >= d_data->alarmLevel ) ); } else { alarm = ( ( d_data->alarmLevel >= d_data->minValue ) && ( d_data->alarmLevel <= d_data->maxValue ) && ( d_data->value >= d_data->alarmLevel ) ); } } // // transform values // int tval = transform( d_data->value ); if ( alarm ) taval = transform( d_data->alarmLevel ); // // calculate recangles // if ( d_data->orientation == Qt::Horizontal ) { if ( inverted ) { bRect.setRect( d_data->thermoRect.x(), d_data->thermoRect.y(), tval - d_data->thermoRect.x(), d_data->thermoRect.height() ); if ( alarm ) { aRect.setRect( tval, d_data->thermoRect.y(), taval - tval + 1, d_data->thermoRect.height() ); fRect.setRect( taval + 1, d_data->thermoRect.y(), d_data->thermoRect.x() + d_data->thermoRect.width() - ( taval + 1 ), d_data->thermoRect.height() ); } else { fRect.setRect( tval, d_data->thermoRect.y(), d_data->thermoRect.x() + d_data->thermoRect.width() - tval, d_data->thermoRect.height() ); } } else { bRect.setRect( tval + 1, d_data->thermoRect.y(), d_data->thermoRect.width() - ( tval + 1 - d_data->thermoRect.x() ), d_data->thermoRect.height() ); if ( alarm ) { aRect.setRect( taval, d_data->thermoRect.y(), tval - taval + 1, d_data->thermoRect.height() ); fRect.setRect( d_data->thermoRect.x(), d_data->thermoRect.y(), taval - d_data->thermoRect.x(), d_data->thermoRect.height() ); } else { fRect.setRect( d_data->thermoRect.x(), d_data->thermoRect.y(), tval - d_data->thermoRect.x() + 1, d_data->thermoRect.height() ); } } } else // Qt::Vertical { if ( tval < d_data->thermoRect.y() ) tval = d_data->thermoRect.y(); else { if ( tval > d_data->thermoRect.y() + d_data->thermoRect.height() ) tval = d_data->thermoRect.y() + d_data->thermoRect.height(); } if ( inverted ) { bRect.setRect( d_data->thermoRect.x(), tval + 1, d_data->thermoRect.width(), d_data->thermoRect.height() - ( tval + 1 - d_data->thermoRect.y() ) ); if ( alarm ) { aRect.setRect( d_data->thermoRect.x(), taval, d_data->thermoRect.width(), tval - taval + 1 ); fRect.setRect( d_data->thermoRect.x(), d_data->thermoRect.y(), d_data->thermoRect.width(), taval - d_data->thermoRect.y() ); } else { fRect.setRect( d_data->thermoRect.x(), d_data->thermoRect.y(), d_data->thermoRect.width(), tval - d_data->thermoRect.y() + 1 ); } } else { bRect.setRect( d_data->thermoRect.x(), d_data->thermoRect.y(), d_data->thermoRect.width(), tval - d_data->thermoRect.y() ); if ( alarm ) { aRect.setRect( d_data->thermoRect.x(), tval, d_data->thermoRect.width(), taval - tval + 1 ); fRect.setRect( d_data->thermoRect.x(), taval + 1, d_data->thermoRect.width(), d_data->thermoRect.y() + d_data->thermoRect.height() - ( taval + 1 ) ); } else { fRect.setRect( d_data->thermoRect.x(), tval, d_data->thermoRect.width(), d_data->thermoRect.y() + d_data->thermoRect.height() - tval ); } } } // // paint thermometer // const QColor bgColor = palette().color( QPalette::Window ); painter->fillRect( bRect, bgColor ); if ( alarm ) painter->fillRect( aRect, d_data->alarmBrush ); painter->fillRect( fRect, d_data->fillBrush ); } /*! Set the border width of the pipe. \param width Border width \sa borderWidth() */ void QwtThermo::setBorderWidth( int width ) { if ( ( width >= 0 ) && ( width < ( qMin( d_data->thermoRect.width(), d_data->thermoRect.height() ) + d_data->borderWidth ) / 2 - 1 ) ) { d_data->borderWidth = width; layoutThermo(); } } /*! Return the border width of the thermometer pipe. \sa setBorderWidth() */ int QwtThermo::borderWidth() const { return d_data->borderWidth; } /*! \brief Set the range \param vmin value corresponding lower or left end of the thermometer \param vmax value corresponding to the upper or right end of the thermometer \param logarithmic logarithmic mapping, true or false */ void QwtThermo::setRange( double vmin, double vmax, bool logarithmic ) { d_data->minValue = vmin; d_data->maxValue = vmax; if ( logarithmic ) setScaleEngine( new QwtLog10ScaleEngine ); else setScaleEngine( new QwtLinearScaleEngine ); /* There are two different maps, one for the scale, the other for the values. This is confusing and will be changed in the future. TODO ... */ d_data->map.setTransformation( scaleEngine()->transformation() ); d_data->map.setScaleInterval( d_data->minValue, d_data->maxValue ); if ( autoScale() ) rescale( d_data->minValue, d_data->maxValue ); layoutThermo(); } /*! \brief Change the brush of the liquid. \param brush New brush. The default brush is solid black. \sa fillBrush() */ void QwtThermo::setFillBrush( const QBrush& brush ) { d_data->fillBrush = brush; update(); } /*! Return the liquid brush. \sa setFillBrush() */ const QBrush& QwtThermo::fillBrush() const { return d_data->fillBrush; } /*! \brief Change the color of the liquid. \param c New color. The default color is black. \sa fillColor() */ void QwtThermo::setFillColor( const QColor &c ) { d_data->fillBrush.setColor( c ); update(); } /*! Return the liquid color. \sa setFillColor() */ const QColor &QwtThermo::fillColor() const { return d_data->fillBrush.color(); } /*! \brief Specify the liquid brush above the alarm threshold \param brush New brush. The default is solid white. \sa alarmBrush() */ void QwtThermo::setAlarmBrush( const QBrush& brush ) { d_data->alarmBrush = brush; update(); } /*! Return the liquid brush above the alarm threshold. \sa setAlarmBrush() */ const QBrush& QwtThermo::alarmBrush() const { return d_data->alarmBrush; } /*! \brief Specify the liquid color above the alarm threshold \param c New color. The default is white. */ void QwtThermo::setAlarmColor( const QColor &c ) { d_data->alarmBrush.setColor( c ); update(); } //! Return the liquid color above the alarm threshold. const QColor &QwtThermo::alarmColor() const { return d_data->alarmBrush.color(); } /*! Specify the alarm threshold. \param level Alarm threshold \sa alarmLevel() */ void QwtThermo::setAlarmLevel( double level ) { d_data->alarmLevel = level; d_data->alarmEnabled = 1; update(); } /*! Return the alarm threshold. \sa setAlarmLevel() */ double QwtThermo::alarmLevel() const { return d_data->alarmLevel; } /*! Change the width of the pipe. \param width Width of the pipe \sa pipeWidth() */ void QwtThermo::setPipeWidth( int width ) { if ( width > 0 ) { d_data->thermoWidth = width; layoutThermo(); } } /*! Return the width of the pipe. \sa setPipeWidth() */ int QwtThermo::pipeWidth() const { return d_data->thermoWidth; } /*! \brief Specify the distance between the pipe's endpoints and the widget's border The margin is used to leave some space for the scale labels. If a large font is used, it is advisable to adjust the margins. \param m New Margin. The default values are 10 for horizontal orientation and 20 for vertical orientation. \warning The margin has no effect if the scale is disabled. \warning This function is a NOOP because margins are determined automatically. */ void QwtThermo::setMargin( int ) { } /*! \brief Enable or disable the alarm threshold \param tf true (disabled) or false (enabled) */ void QwtThermo::setAlarmEnabled( bool tf ) { d_data->alarmEnabled = tf; update(); } //! Return if the alarm threshold is enabled or disabled. bool QwtThermo::alarmEnabled() const { return d_data->alarmEnabled; } /*! \return the minimum size hint \sa minimumSizeHint() */ QSize QwtThermo::sizeHint() const { return minimumSizeHint(); } /*! \brief Return a minimum size hint \warning The return value depends on the font and the scale. \sa sizeHint() */ QSize QwtThermo::minimumSizeHint() const { int w = 0, h = 0; if ( d_data->scalePos != NoScale ) { const int sdExtent = qCeil( scaleDraw()->extent( font() ) ); const int sdLength = scaleDraw()->minLength( font() ); w = sdLength; h = d_data->thermoWidth + sdExtent + d_data->borderWidth + d_data->scaleDist; } else // no scale { w = 200; h = d_data->thermoWidth; } if ( d_data->orientation == Qt::Vertical ) qSwap( w, h ); w += 2 * d_data->borderWidth; h += 2 * d_data->borderWidth; return QSize( w, h ); } int QwtThermo::transform( double value ) const { const double min = qMin( d_data->map.s1(), d_data->map.s2() ); const double max = qMax( d_data->map.s1(), d_data->map.s2() ); if ( value > max ) value = max; if ( value < min ) value = min; return qRound( d_data->map.transform( value ) ); } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_thermo.h000066400000000000000000000121161320135501600212420ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_THERMO_H #define QWT_THERMO_H #include "qwt_global.h" #include "qwt_abstract_scale.h" #include #include #include #include class QwtScaleDraw; /*! \brief The Thermometer Widget QwtThermo is a widget which displays a value in an interval. It supports: - a horizontal or vertical layout; - a range; - a scale; - an alarm level. \image html sysinfo.png By default, the scale and range run over the same interval of values. QwtAbstractScale::setScale() changes the interval of the scale and allows easy conversion between physical units. The example shows how to make the scale indicate in degrees Fahrenheit and to set the value in degrees Kelvin: \code #include #include double Kelvin2Fahrenheit(double kelvin) { // see http://en.wikipedia.org/wiki/Kelvin return 1.8*kelvin - 459.67; } int main(int argc, char **argv) { const double minKelvin = 0.0; const double maxKelvin = 500.0; QApplication a(argc, argv); QwtThermo t; t.setRange(minKelvin, maxKelvin); t.setScale(Kelvin2Fahrenheit(minKelvin), Kelvin2Fahrenheit(maxKelvin)); // set the value in Kelvin but the scale displays in Fahrenheit // 273.15 Kelvin = 0 Celsius = 32 Fahrenheit t.setValue(273.15); a.setMainWidget(&t); t.show(); return a.exec(); } \endcode \todo Improve the support for a logarithmic range and/or scale. */ class QWT_EXPORT QwtThermo: public QWidget, public QwtAbstractScale { Q_OBJECT Q_ENUMS( ScalePos ) Q_PROPERTY( QBrush alarmBrush READ alarmBrush WRITE setAlarmBrush ) Q_PROPERTY( QColor alarmColor READ alarmColor WRITE setAlarmColor ) Q_PROPERTY( bool alarmEnabled READ alarmEnabled WRITE setAlarmEnabled ) Q_PROPERTY( double alarmLevel READ alarmLevel WRITE setAlarmLevel ) Q_PROPERTY( ScalePos scalePosition READ scalePosition WRITE setScalePosition ) Q_PROPERTY( int borderWidth READ borderWidth WRITE setBorderWidth ) Q_PROPERTY( QBrush fillBrush READ fillBrush WRITE setFillBrush ) Q_PROPERTY( QColor fillColor READ fillColor WRITE setFillColor ) Q_PROPERTY( double maxValue READ maxValue WRITE setMaxValue ) Q_PROPERTY( double minValue READ minValue WRITE setMinValue ) Q_PROPERTY( int pipeWidth READ pipeWidth WRITE setPipeWidth ) Q_PROPERTY( double value READ value WRITE setValue ) public: /*! Scale position. QwtThermo tries to enforce valid combinations of its orientation and scale position: - Qt::Horizonal combines with NoScale, TopScale and BottomScale - Qt::Vertical combines with NoScale, LeftScale and RightScale \sa setOrientation(), setScalePosition() */ enum ScalePos { NoScale, LeftScale, RightScale, TopScale, BottomScale }; explicit QwtThermo( QWidget *parent = NULL ); virtual ~QwtThermo(); void setOrientation( Qt::Orientation o, ScalePos s ); void setScalePosition( ScalePos s ); ScalePos scalePosition() const; void setBorderWidth( int w ); int borderWidth() const; void setFillBrush( const QBrush &b ); const QBrush &fillBrush() const; void setFillColor( const QColor &c ); const QColor &fillColor() const; void setAlarmBrush( const QBrush &b ); const QBrush &alarmBrush() const; void setAlarmColor( const QColor &c ); const QColor &alarmColor() const; void setAlarmLevel( double v ); double alarmLevel() const; void setAlarmEnabled( bool tf ); bool alarmEnabled() const; void setPipeWidth( int w ); int pipeWidth() const; void setMaxValue( double v ); double maxValue() const; void setMinValue( double v ); double minValue() const; double value() const; void setRange( double vmin, double vmax, bool lg = false ); void setMargin( int m ); virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; void setScaleDraw( QwtScaleDraw * ); const QwtScaleDraw *scaleDraw() const; public Q_SLOTS: virtual void setValue( double val ); protected: void draw( QPainter *p, const QRect& update_rect ); void drawThermo( QPainter *p ); void layoutThermo( bool update = true ); virtual void scaleChange(); virtual void fontChange( const QFont &oldFont ); virtual void paintEvent( QPaintEvent *e ); virtual void resizeEvent( QResizeEvent *e ); QwtScaleDraw *scaleDraw(); private: void initThermo(); int transform( double v ) const; class PrivateData; PrivateData *d_data; }; #endif starpu-1.2.3+dfsg/starpu-top/qwt/qwt_wheel.cpp000066400000000000000000000373471320135501600214200ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_wheel.h" #include "qwt_math.h" #include "qwt_painter.h" #include #include #include #include #define NUM_COLORS 30 class QwtWheel::PrivateData { public: PrivateData() { viewAngle = 175.0; totalAngle = 360.0; tickCnt = 10; intBorder = 2; borderWidth = 2; wheelWidth = 20; }; QRect sliderRect; double viewAngle; double totalAngle; int tickCnt; int intBorder; int borderWidth; int wheelWidth; QColor colors[NUM_COLORS]; }; //! Constructor QwtWheel::QwtWheel( QWidget *parent ): QwtAbstractSlider( Qt::Horizontal, parent ) { initWheel(); } void QwtWheel::initWheel() { d_data = new PrivateData; setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); setUpdateTime( 50 ); } //! Destructor QwtWheel::~QwtWheel() { delete d_data; } //! Set up the color array for the background pixmap. void QwtWheel::setColorArray() { if ( !d_data->colors ) return; const QColor light = palette().color( QPalette::Light ); const QColor dark = palette().color( QPalette::Dark ); if ( !d_data->colors[0].isValid() || d_data->colors[0] != light || d_data->colors[NUM_COLORS - 1] != dark ) { d_data->colors[0] = light; d_data->colors[NUM_COLORS - 1] = dark; int dh, ds, dv, lh, ls, lv; d_data->colors[0].getRgb( &lh, &ls, &lv ); d_data->colors[NUM_COLORS - 1].getRgb( &dh, &ds, &dv ); for ( int i = 1; i < NUM_COLORS - 1; ++i ) { const double factor = double( i ) / double( NUM_COLORS ); d_data->colors[i].setRgb( lh + int( double( dh - lh ) * factor ), ls + int( double( ds - ls ) * factor ), lv + int( double( dv - lv ) * factor ) ); } } } /*! \brief Adjust the number of grooves in the wheel's surface. The number of grooves is limited to 6 <= cnt <= 50. Values outside this range will be clipped. The default value is 10. \param cnt Number of grooves per 360 degrees \sa tickCnt() */ void QwtWheel::setTickCnt( int cnt ) { d_data->tickCnt = qwtLim( cnt, 6, 50 ); update(); } /*! \return Number of grooves in the wheel's surface. \sa setTickCnt() */ int QwtWheel::tickCnt() const { return d_data->tickCnt; } /*! \return mass */ double QwtWheel::mass() const { return QwtAbstractSlider::mass(); } /*! \brief Set the internal border width of the wheel. The internal border must not be smaller than 1 and is limited in dependence on the wheel's size. Values outside the allowed range will be clipped. The internal border defaults to 2. \param w border width \sa internalBorder() */ void QwtWheel::setInternalBorder( int w ) { const int d = qMin( width(), height() ) / 3; w = qMin( w, d ); d_data->intBorder = qMax( w, 1 ); layoutWheel(); } /*! \return Internal border width of the wheel. \sa setInternalBorder() */ int QwtWheel::internalBorder() const { return d_data->intBorder; } /*! Draw the Wheel's background gradient \param painter Painter \param r Bounding rectangle */ void QwtWheel::drawWheelBackground( QPainter *painter, const QRect &r ) { painter->save(); // // initialize pens // const QColor light = palette().color( QPalette::Light ); const QColor dark = palette().color( QPalette::Dark ); QPen lightPen; lightPen.setColor( light ); lightPen.setWidth( d_data->intBorder ); QPen darkPen; darkPen.setColor( dark ); darkPen.setWidth( d_data->intBorder ); setColorArray(); // // initialize auxiliary variables // const int nFields = NUM_COLORS * 13 / 10; const int hiPos = nFields - NUM_COLORS + 1; if ( orientation() == Qt::Horizontal ) { const int rx = r.x(); int ry = r.y() + d_data->intBorder; const int rh = r.height() - 2 * d_data->intBorder; const int rw = r.width(); // // draw shaded background // int x1 = rx; for ( int i = 1; i < nFields; i++ ) { const int x2 = rx + ( rw * i ) / nFields; painter->fillRect( x1, ry, x2 - x1 + 1 , rh, d_data->colors[qAbs( i-hiPos )] ); x1 = x2 + 1; } painter->fillRect( x1, ry, rw - ( x1 - rx ), rh, d_data->colors[NUM_COLORS - 1] ); // // draw internal border // painter->setPen( lightPen ); ry = r.y() + d_data->intBorder / 2; painter->drawLine( r.x(), ry, r.x() + r.width() , ry ); painter->setPen( darkPen ); ry = r.y() + r.height() - ( d_data->intBorder - d_data->intBorder / 2 ); painter->drawLine( r.x(), ry , r.x() + r.width(), ry ); } else // Qt::Vertical { int rx = r.x() + d_data->intBorder; const int ry = r.y(); const int rh = r.height(); const int rw = r.width() - 2 * d_data->intBorder; // // draw shaded background // int y1 = ry; for ( int i = 1; i < nFields; i++ ) { const int y2 = ry + ( rh * i ) / nFields; painter->fillRect( rx, y1, rw, y2 - y1 + 1, d_data->colors[qAbs( i-hiPos )] ); y1 = y2 + 1; } painter->fillRect( rx, y1, rw, rh - ( y1 - ry ), d_data->colors[NUM_COLORS - 1] ); // // draw internal borders // painter->setPen( lightPen ); rx = r.x() + d_data->intBorder / 2; painter->drawLine( rx, r.y(), rx, r.y() + r.height() ); painter->setPen( darkPen ); rx = r.x() + r.width() - ( d_data->intBorder - d_data->intBorder / 2 ); painter->drawLine( rx, r.y(), rx , r.y() + r.height() ); } painter->restore(); } /*! \brief Set the total angle which the wheel can be turned. One full turn of the wheel corresponds to an angle of 360 degrees. A total angle of n*360 degrees means that the wheel has to be turned n times around its axis to get from the minimum value to the maximum value. The default setting of the total angle is 360 degrees. \param angle total angle in degrees \sa totalAngle() */ void QwtWheel::setTotalAngle( double angle ) { if ( angle < 0.0 ) angle = 0.0; d_data->totalAngle = angle; update(); } /*! \return Total angle which the wheel can be turned. \sa setTotalAngle() */ double QwtWheel::totalAngle() const { return d_data->totalAngle; } /*! \brief Set the wheel's orientation. \param o Orientation. Allowed values are Qt::Horizontal and Qt::Vertical. Defaults to Qt::Horizontal. \sa QwtAbstractSlider::orientation() */ void QwtWheel::setOrientation( Qt::Orientation o ) { if ( orientation() == o ) return; if ( !testAttribute( Qt::WA_WState_OwnSizePolicy ) ) { QSizePolicy sp = sizePolicy(); sp.transpose(); setSizePolicy( sp ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); } QwtAbstractSlider::setOrientation( o ); layoutWheel(); } /*! \brief Specify the visible portion of the wheel. You may use this function for fine-tuning the appearance of the wheel. The default value is 175 degrees. The value is limited from 10 to 175 degrees. \param angle Visible angle in degrees \sa viewAngle(), setTotalAngle() */ void QwtWheel::setViewAngle( double angle ) { d_data->viewAngle = qwtLim( angle, 10.0, 175.0 ); update(); } /*! \return Visible portion of the wheel \sa setViewAngle(), totalAngle() */ double QwtWheel::viewAngle() const { return d_data->viewAngle; } /*! \brief Redraw the wheel \param painter painter \param r contents rectangle */ void QwtWheel::drawWheel( QPainter *painter, const QRect &r ) { // // draw background gradient // drawWheelBackground( painter, r ); if ( maxValue() == minValue() || d_data->totalAngle == 0.0 ) return; const QColor light = palette().color( QPalette::Light ); const QColor dark = palette().color( QPalette::Dark ); const double sign = ( minValue() < maxValue() ) ? 1.0 : -1.0; double cnvFactor = qAbs( d_data->totalAngle / ( maxValue() - minValue() ) ); const double halfIntv = 0.5 * d_data->viewAngle / cnvFactor; const double loValue = value() - halfIntv; const double hiValue = value() + halfIntv; const double tickWidth = 360.0 / double( d_data->tickCnt ) / cnvFactor; const double sinArc = qSin( d_data->viewAngle * M_PI / 360.0 ); cnvFactor *= M_PI / 180.0; // // draw grooves // if ( orientation() == Qt::Horizontal ) { const double halfSize = double( r.width() ) * 0.5; int l1 = r.y() + d_data->intBorder; int l2 = r.y() + r.height() - d_data->intBorder - 1; // draw one point over the border if border > 1 if ( d_data->intBorder > 1 ) { l1 --; l2 ++; } const int maxpos = r.x() + r.width() - 2; const int minpos = r.x() + 2; // // draw tick marks // for ( double tickValue = qCeil( loValue / tickWidth ) * tickWidth; tickValue < hiValue; tickValue += tickWidth ) { // // calculate position // const int tickPos = r.x() + r.width() - int( halfSize * ( sinArc + sign * qSin( ( tickValue - value() ) * cnvFactor ) ) / sinArc ); // // draw vertical line // if ( ( tickPos <= maxpos ) && ( tickPos > minpos ) ) { painter->setPen( dark ); painter->drawLine( tickPos - 1 , l1, tickPos - 1, l2 ); painter->setPen( light ); painter->drawLine( tickPos, l1, tickPos, l2 ); } } } else if ( orientation() == Qt::Vertical ) { const double halfSize = double( r.height() ) * 0.5; int l1 = r.x() + d_data->intBorder; int l2 = r.x() + r.width() - d_data->intBorder - 1; if ( d_data->intBorder > 1 ) { l1--; l2++; } const int maxpos = r.y() + r.height() - 2; const int minpos = r.y() + 2; // // draw tick marks // for ( double tickValue = qCeil( loValue / tickWidth ) * tickWidth; tickValue < hiValue; tickValue += tickWidth ) { // // calculate position // const int tickPos = r.y() + int( halfSize * ( sinArc + sign * qSin( ( tickValue - value() ) * cnvFactor ) ) / sinArc ); // // draw horizontal line // if ( ( tickPos <= maxpos ) && ( tickPos > minpos ) ) { painter->setPen( dark ); painter->drawLine( l1, tickPos - 1 , l2, tickPos - 1 ); painter->setPen( light ); painter->drawLine( l1, tickPos, l2, tickPos ); } } } } //! Determine the value corresponding to a specified point double QwtWheel::getValue( const QPoint &p ) { // The reference position is arbitrary, but the // sign of the offset is important int w, dx; if ( orientation() == Qt::Vertical ) { w = d_data->sliderRect.height(); dx = d_data->sliderRect.y() - p.y(); } else { w = d_data->sliderRect.width(); dx = p.x() - d_data->sliderRect.x(); } // w pixels is an arc of viewAngle degrees, // so we convert change in pixels to change in angle const double ang = dx * d_data->viewAngle / w; // value range maps to totalAngle degrees, // so convert the change in angle to a change in value const double val = ang * ( maxValue() - minValue() ) / d_data->totalAngle; // Note, range clamping and rasterizing to step is automatically // handled by QwtAbstractSlider, so we simply return the change in value return val; } //! Qt Resize Event void QwtWheel::resizeEvent( QResizeEvent * ) { layoutWheel( false ); } //! Recalculate the slider's geometry and layout based on // the current rect and fonts. // \param update_geometry notify the layout system and call update // to redraw the scale void QwtWheel::layoutWheel( bool update_geometry ) { const QRect r = this->rect(); d_data->sliderRect.setRect( r.x() + d_data->borderWidth, r.y() + d_data->borderWidth, r.width() - 2*d_data->borderWidth, r.height() - 2*d_data->borderWidth ); if ( update_geometry ) { updateGeometry(); update(); } } //! Qt Paint Event void QwtWheel::paintEvent( QPaintEvent *e ) { // Use double-buffering const QRect &ur = e->rect(); if ( ur.isValid() ) { QPainter painter( this ); draw( &painter, ur ); } } /*! Redraw panel and wheel \param painter Painter */ void QwtWheel::draw( QPainter *painter, const QRect& ) { qDrawShadePanel( painter, rect().x(), rect().y(), rect().width(), rect().height(), palette(), true, d_data->borderWidth ); drawWheel( painter, d_data->sliderRect ); if ( hasFocus() ) QwtPainter::drawFocusRect( painter, this ); } //! Notify value change void QwtWheel::valueChange() { QwtAbstractSlider::valueChange(); update(); } /*! \brief Determine the scrolling mode and direction corresponding to a specified point \param p point \param scrollMode scrolling mode \param direction direction */ void QwtWheel::getScrollMode( const QPoint &p, int &scrollMode, int &direction ) { if ( d_data->sliderRect.contains( p ) ) scrollMode = ScrMouse; else scrollMode = ScrNone; direction = 0; } /*! \brief Set the mass of the wheel Assigning a mass turns the wheel into a flywheel. \param val the wheel's mass */ void QwtWheel::setMass( double val ) { QwtAbstractSlider::setMass( val ); } /*! \brief Set the width of the wheel Corresponds to the wheel height for horizontal orientation, and the wheel width for vertical orientation. \param w the wheel's width */ void QwtWheel::setWheelWidth( int w ) { d_data->wheelWidth = w; layoutWheel(); } /*! \return a size hint */ QSize QwtWheel::sizeHint() const { return minimumSizeHint(); } /*! \brief Return a minimum size hint \warning The return value is based on the wheel width. */ QSize QwtWheel::minimumSizeHint() const { QSize sz( 3*d_data->wheelWidth + 2*d_data->borderWidth, d_data->wheelWidth + 2*d_data->borderWidth ); if ( orientation() != Qt::Horizontal ) sz.transpose(); return sz; } /*! \brief Call update() when the palette changes */ void QwtWheel::paletteChange( const QPalette& ) { update(); } starpu-1.2.3+dfsg/starpu-top/qwt/qwt_wheel.h000066400000000000000000000045661320135501600210620ustar00rootroot00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_WHEEL_H #define QWT_WHEEL_H #include "qwt_global.h" #include "qwt_abstract_slider.h" /*! \brief The Wheel Widget The wheel widget can be used to change values over a very large range in very small steps. Using the setMass member, it can be configured as a flywheel. \sa The radio example. */ class QWT_EXPORT QwtWheel : public QwtAbstractSlider { Q_OBJECT Q_PROPERTY( double totalAngle READ totalAngle WRITE setTotalAngle ) Q_PROPERTY( double viewAngle READ viewAngle WRITE setViewAngle ) Q_PROPERTY( int tickCnt READ tickCnt WRITE setTickCnt ) Q_PROPERTY( int internalBorder READ internalBorder WRITE setInternalBorder ) Q_PROPERTY( double mass READ mass WRITE setMass ) public: explicit QwtWheel( QWidget *parent = NULL ); virtual ~QwtWheel(); virtual void setOrientation( Qt::Orientation ); double totalAngle() const; double viewAngle() const; int tickCnt() const; int internalBorder() const; double mass() const; void setTotalAngle ( double angle ); void setTickCnt( int cnt ); void setViewAngle( double angle ); void setInternalBorder( int width ); void setMass( double val ); void setWheelWidth( int w ); virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; protected: virtual void resizeEvent( QResizeEvent *e ); virtual void paintEvent( QPaintEvent *e ); void layoutWheel( bool update = true ); void draw( QPainter *, const QRect & ); void drawWheel( QPainter *, const QRect & ); void drawWheelBackground( QPainter *, const QRect & ); void setColorArray(); virtual void valueChange(); virtual void paletteChange( const QPalette & ); virtual double getValue( const QPoint & ); virtual void getScrollMode( const QPoint &, int &scrollMode, int &direction ); private: void initWheel(); class PrivateData; PrivateData *d_data; }; #endif starpu-1.2.3+dfsg/starpu-top/resources.qrc000066400000000000000000000012541320135501600206070ustar00rootroot00000000000000 images/play.png images/connect.png images/quit.png images/preferences.png images/help.png images/inside.png images/outside.png images/about.png images/debugoff.png images/debugon.png images/add.png images/remove.png images/widget.png images/starpu_top.png images/windows.png images/lock.png starpu-1.2.3+dfsg/starpu-top/sessionsetupmanager.cpp000066400000000000000000000366661320135501600227100ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "sessionsetupmanager.h" #include "mainwindow.h" #include "widgetwindowsmanager.h" #include "abstractwidgetwindow.h" #include "datawidget.h" #include "dataaggregatorwidget.h" #include #include #include #include SessionSetupManager::SessionSetupManager(MainWindow *mainWindow) { static bool instanciated = false; Q_ASSERT_X(instanciated == false, "SessionSetupManager's' constructor", "Singleton pattern violated - " "SessionSetupManager instanciated more than once"); qDebug() << "SessionSetupManager : initializing"; _mainWindow = mainWindow; _sessionStateSettings = 0; instanciated = true; } SessionSetupManager::~SessionSetupManager() { delete _sessionStateSettings; } bool SessionSetupManager::saveSessionSetup(QString sessionSetupName) { QString fileName = SESSION_SETUPS_DIR + "/" + sessionSetupName + SESSION_SETUPS_FILEEXT; if (QFile(fileName).exists() == true) { if (QFile(fileName).remove() == false) { qDebug() << "SessionSetupManager : " "coudln't reinitialize session setup file before saving !"; return false; } } // Init settings delete _sessionStateSettings; _sessionStateSettings = new QSettings(fileName, QSettings::IniFormat); qDebug() << "SessionSetupManager : saving session setup to" << _sessionStateSettings->fileName(); // Save data setup _sessionStateSettings->beginWriteArray("datadescriptions", _mainWindow->dataDescriptions()->count()); for (int i = 0; i < _mainWindow->dataDescriptions()->count(); i++) { _sessionStateSettings->setArrayIndex(i); int dataId = _mainWindow->dataDescriptions()->at(i)->id; DataType type = _mainWindow->dataDescriptions()->at(i)->type; DataWidgetType widget = _mainWindow->dataDescriptions()->at(i)->widget; _sessionStateSettings->setValue("id", dataId); _sessionStateSettings->setValue("type", (int) type); _sessionStateSettings->setValue("widget", (int) widget); } _sessionStateSettings->endArray(); // Save parameters setup _sessionStateSettings->beginWriteArray("paramdescriptions", _mainWindow->paramDescriptions()->count()); for (int i = 0; i < _mainWindow->paramDescriptions()->count(); i++) { _sessionStateSettings->setArrayIndex(i); int paramId = _mainWindow->paramDescriptions()->at(i)->id; ParamType type = _mainWindow->paramDescriptions()->at(i)->type; InteractiveWidgetType widget = _mainWindow->paramDescriptions()->at(i)->widget; _sessionStateSettings->setValue("id", paramId); _sessionStateSettings->setValue("type", (int) type); _sessionStateSettings->setValue("widget", (int) widget); } _sessionStateSettings->endArray(); // Save main window setup _sessionStateSettings->beginGroup("mainwindow"); _sessionStateSettings->setValue("displaymode", (int) _mainWindow->displayMode()); _sessionStateSettings->setValue("geometry", _mainWindow->saveGeometry()); _sessionStateSettings->endGroup(); // Save parameters dock setup _sessionStateSettings->beginGroup("parametersdock"); _sessionStateSettings->setValue("floating", _mainWindow->parametersDock()->isFloating()); _sessionStateSettings->setValue("geometry", _mainWindow->parametersDock()->saveGeometry()); _sessionStateSettings->endGroup(); // Save widget windows setup _sessionStateSettings->beginWriteArray("widgetwindows", _mainWindow->widgetWindowsManager() ->widgetWindows().count()); for (int i = 0; i < _mainWindow->widgetWindowsManager()->widgetWindows().count(); i++) { _sessionStateSettings->setArrayIndex(i); // Retrive general information to save bool inside = _mainWindow->widgetWindowsManager()->widgetWindows().at( i)->isInside(); QByteArray windowGeometry; if (inside == false) { windowGeometry = _mainWindow->widgetWindowsManager() ->widgetWindows().at(i)->saveGeometry(); } else { // Save the geometry of the parent subwindow, not the widget itself windowGeometry = _mainWindow->widgetWindowsManager() ->widgetWindows().at(i)->parentWidget()->saveGeometry(); } DataWidget *dataWidget = qobject_cast ( _mainWindow->widgetWindowsManager()->widgetWindows().at(i)); if (dataWidget != 0) { // Data widgets // Retrieve specific information to save int dataId = dataWidget->description()->id; // Save information _sessionStateSettings->beginGroup("datawidget"); _sessionStateSettings->setValue("inside", inside); _sessionStateSettings->setValue("geometry", windowGeometry); _sessionStateSettings->setValue("dataid", dataId); _sessionStateSettings->endGroup(); } else { // Data aggregator widgets DataAggregatorWidget *dataAggregatorWidget = qobject_cast< DataAggregatorWidget*> ( _mainWindow->widgetWindowsManager()->widgetWindows().at(i)); // Retrieve specific information to save QList aggregatedData = dataAggregatorWidget->aggregatedData(); QString aggregatedDataString; for (int i = 0; i < aggregatedData.count(); i++) { aggregatedDataString.append( QString::number(aggregatedData.at(i)) + ","); } // Save information _sessionStateSettings->beginGroup("dataaggregatorwidget"); _sessionStateSettings->setValue("inside", inside); _sessionStateSettings->setValue("geometry", windowGeometry); _sessionStateSettings->setValue("dataids", aggregatedDataString); _sessionStateSettings->endGroup(); } } _sessionStateSettings->endArray(); // Write the session setup _sessionStateSettings->sync(); return true; } bool SessionSetupManager::loadSessionSetup(QString sessionName) { QString fileName = SESSION_SETUPS_DIR + "/" + sessionName + SESSION_SETUPS_FILEEXT; if (QFile(fileName).exists() == false) { qDebug() << "SessionSetupManager : session setup file doesn't exist !"; return false; } delete _sessionStateSettings; _sessionStateSettings = new QSettings(fileName, QSettings::IniFormat); qDebug() << "SessionSetupManager : loading session setup from" << _sessionStateSettings->fileName(); // Load data descriptions setup QList < DataDescriptionSetup > dataDescriptionsSetup; int size = _sessionStateSettings->beginReadArray("datadescriptions"); for (int i = 0; i < size; i++) { _sessionStateSettings->setArrayIndex(i); DataDescriptionSetup dataDescriptionSetup; bool ok = false; dataDescriptionSetup.id = _sessionStateSettings->value("id").toInt(&ok); if (ok == false) { qDebug() << "SessionSetupManager : " "attempted to load incorrect data widget !"; return false; } dataDescriptionSetup.type = (DataType) _sessionStateSettings->value( "type").toInt(&ok); if (ok == false) { qDebug() << "SessionSetupManager : " "attempted to load incorrect data widget !"; return false; } if (dataDescriptionSetup.type != _mainWindow->dataDescriptionFromId( dataDescriptionSetup.id)->type) { qDebug() << "SessionSetupManager : " "incompatible data types between the sessions !"; return false; } dataDescriptionSetup.widget = (DataWidgetType) _sessionStateSettings->value("widget").toInt( &ok); if (ok == false) { qDebug() << "SessionSetupManager : " "attempted to load incorrect data widget !"; return false; } dataDescriptionsSetup.append(dataDescriptionSetup); } _sessionStateSettings->endArray(); // Load param descriptions setup QList < ParamDescriptionSetup > paramDescriptionsSetup; size = _sessionStateSettings->beginReadArray("paramdescriptions"); for (int i = 0; i < size; i++) { _sessionStateSettings->setArrayIndex(i); ParamDescriptionSetup paramDescriptionSetup; bool ok = false; paramDescriptionSetup.id = _sessionStateSettings->value("id").toInt(&ok); if (ok == false) { qDebug() << "SessionSetupManager : " "attempted to load incorrect param id !"; return false; } paramDescriptionSetup.type = (ParamType) _sessionStateSettings->value( "type").toInt(&ok); if (ok == false) { qDebug() << "SessionSetupManager : " "attempted to load incorrect param type !"; return false; } if (paramDescriptionSetup.type != _mainWindow->paramDescriptionFromId( paramDescriptionSetup.id)->type) { qDebug() << "SessionSetupManager : " "incompatible data types between the sessions !"; return false; } paramDescriptionSetup.widget = (InteractiveWidgetType) _sessionStateSettings ->value("widget").toInt(&ok); if (ok == false) { qDebug() << "SessionSetupManager : " "attempted to load incorrect param widget !"; return false; } paramDescriptionsSetup.append(paramDescriptionSetup); } _sessionStateSettings->endArray(); emit descriptionsSetupLoaded(dataDescriptionsSetup, paramDescriptionsSetup); // Load main window setup MainWindowSetup mainWindowSetup; _sessionStateSettings->beginGroup("mainwindow"); mainWindowSetup.geometry = _sessionStateSettings->value("geometry").toByteArray(); bool ok = false; mainWindowSetup.displayMode = (DisplayMode) _sessionStateSettings->value( "displaymode").toInt(&ok); if (ok == false) { qDebug() << "SessionSetupManager : " "attempted to load incorrect main window display mode !"; return false; } _sessionStateSettings->endGroup(); emit mainWindowSetupLoaded(mainWindowSetup); // Load main window setup ParametersDockSetup parametersDockSetup; _sessionStateSettings->beginGroup("mainwindow"); parametersDockSetup.floating = _sessionStateSettings->value("floating").toBool(); parametersDockSetup.geometry = _sessionStateSettings->value("geometry").toByteArray(); _sessionStateSettings->endGroup(); emit parametersDockSetupLoaded(parametersDockSetup); // Load widget windows setup QList < DataWidgetSetup > dataWidgetsSetup; QList < DataAggregatorWidgetSetup > dataAggregatorWidgetsSetup; size = _sessionStateSettings->beginReadArray("widgetwindows"); for (int i = 0; i < size; i++) { _sessionStateSettings->setArrayIndex(i); QString currentGroup = _sessionStateSettings->childGroups().at(0); if (currentGroup.compare("datawidget") == 0) { _sessionStateSettings->beginGroup("datawidget"); DataWidgetSetup dataWidgetSetup; dataWidgetSetup.inside = _sessionStateSettings->value("inside").toBool(); dataWidgetSetup.geometry = _sessionStateSettings->value("geometry").toByteArray(); bool ok = false; dataWidgetSetup.dataId = _sessionStateSettings->value("dataid").toInt(&ok); if (ok == false) { qDebug() << "SessionSetupManager : " "attempted to load incorrect data id for the data widget !"; return false; } dataWidgetsSetup.append(dataWidgetSetup); _sessionStateSettings->endGroup(); } else if (currentGroup.compare("dataaggregatorwidget") == 0) { _sessionStateSettings->beginGroup("dataaggregatorwidget"); DataAggregatorWidgetSetup dataAggregatorWidgetSetup; dataAggregatorWidgetSetup.inside = _sessionStateSettings->value( "inside").toBool(); dataAggregatorWidgetSetup.geometry = _sessionStateSettings->value( "geometry").toByteArray(); QString dataIdsString = _sessionStateSettings->value("dataids").toString(); QStringList dataIdsStringParts = dataIdsString.split(",", QString::SkipEmptyParts); QList dataIds; for (int i = 0; i < dataIdsStringParts.count(); i++) { QString dataIdsStringPart = dataIdsStringParts.at(i); bool ok = false; dataIds.append(dataIdsStringPart.toInt(&ok)); if (ok == false) { qDebug() << "SessionSetupManager : " "attempted to load incorrect data id for data aggregator widget !"; return false; } } dataAggregatorWidgetSetup.dataIds = dataIds; dataAggregatorWidgetsSetup.append(dataAggregatorWidgetSetup); _sessionStateSettings->endGroup(); } else { qDebug() << "SessionSetupManager : " "attempted to load unknow window widget type !"; return false; } } _sessionStateSettings->endArray(); emit widgetWindowsSetupLoaded(dataWidgetsSetup, dataAggregatorWidgetsSetup); return true; } starpu-1.2.3+dfsg/starpu-top/sessionsetupmanager.h000066400000000000000000000042021320135501600223320ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef SESSIONSETUPMANAGER_H #define SESSIONSETUPMANAGER_H class MainWindow; #include "starpu_top_types.h" #include static const QString SESSION_SETUPS_DIR = "./sessionsetups"; static const QString SESSION_SETUPS_FILEEXT = ".ses"; class SessionSetupManager: public QObject { /* Saves and loads a session setup. The session setup includes the geometries and states of the widget windows and the descriptions of the data and the parameters. */ Q_OBJECT public: SessionSetupManager(MainWindow *mainWindow); ~SessionSetupManager(); private: // Data MainWindow *_mainWindow; QSettings *_sessionStateSettings; public slots: bool saveSessionSetup(QString sessionSetupName); bool loadSessionSetup(QString sessionSetupName); signals: void descriptionsSetupLoaded( QList dataDescriptionsSetup, QList paramDescriptionsSetup); void mainWindowSetupLoaded(MainWindowSetup mainWindowSetup); void parametersDockSetupLoaded(ParametersDockSetup parametersDockSetup); void widgetWindowsSetupLoaded(QList dataWidgetsSetup, QList dataAggregatorWidgetsSetup); }; #endif // SESSIONSETUPMANAGER_H starpu-1.2.3+dfsg/starpu-top/starpu_top.1000066400000000000000000000011701320135501600203450ustar00rootroot00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH STARPU_TOP "1" "November 2017" "starpu_top (StarPU) 1.2.3" "User Commands" .SH NAME starpu_top \- manual page for starpu_top (StarPU) 1.2.3 .SH SYNOPSIS .B starpu_top [\fIOPTION\fR] .SH DESCRIPTION starpu\-top is an interface which remotely displays the on\-line state of a StarPU application and permits the user to change parameters on the fly. .SH OPTIONS .TP \fB\-h\fR, \fB\-\-help\fR display this help and exit .TP \fB\-v\fR, \fB\-\-version\fR output version information and exit .SH "REPORTING BUGS" Report bugs to . starpu-1.2.3+dfsg/starpu-top/starpu_top_types.h000066400000000000000000000205031320135501600216610ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef STARPU_TOP_TYPES_H #define STARPU_TOP_TYPES_H #include #include #include /* -------------------------------------------------------------------------- */ /* Display modes */ /* -------------------------------------------------------------------------- */ enum DisplayMode { DISPLAY_FLYING_WINDOWS = 0, DISPLAY_MDI_NORMAL = 1, }; /* -------------------------------------------------------------------------- */ /* Widgets */ /* -------------------------------------------------------------------------- */ // Types enum DataWidgetType { // Data widgets /** You must pass any modification to the following functions : MainWindow::initDataWidgetLists(), DataWidget::DataWidget(), DataWidget::updateValue() **/ DATA_WIDGET_NONE = -1, DATA_WIDGET_LCD = 0, DATA_WIDGET_PLOT = 1, DATA_WIDGET_LEVEL = 2, DATA_WIDGET_LED = 3, DATA_WIDGET_DIAL = 4, }; enum InteractiveWidgetType { // Interactive widgets /** You must pass any modification to the following functions : MainWindow::initInteractiveWidgetLists(), InteractiveWidget::InteractiveWidget() **/ INTERACTIVE_WIDGET_NONE = -1, INTERACTIVE_WIDGET_SLIDER = 0, INTERACTIVE_WIDGET_KNOB = 1, INTERACTIVE_WIDGET_WHEEL = 2, INTERACTIVE_WIDGET_CHECKBOX = 3, INTERACTIVE_WIDGET_SPINBOX = 4, INTERACTIVE_WIDGET_DOUBLESPINBOX = 5, INTERACTIVE_WIDGET_DIAL = 6, INTERACTIVE_WIDGET_COMBOBOX = 7, }; static const DataWidgetType DEFAULT_DATA_WIDGET_BOOL = DATA_WIDGET_LED; static const DataWidgetType DEFAULT_DATA_WIDGET_INT = DATA_WIDGET_LCD; static const DataWidgetType DEFAULT_DATA_WIDGET_FLOAT = DATA_WIDGET_LCD; static const InteractiveWidgetType DEFAULT_INTERACTIVE_WIDGET_BOOL = INTERACTIVE_WIDGET_CHECKBOX; static const InteractiveWidgetType DEFAULT_INTERACTIVE_WIDGET_INT = INTERACTIVE_WIDGET_SPINBOX; static const InteractiveWidgetType DEFAULT_INTERACTIVE_WIDGET_FLOAT = INTERACTIVE_WIDGET_DOUBLESPINBOX; static const InteractiveWidgetType DEFAULT_INTERACTIVE_WIDGET_ENUM = INTERACTIVE_WIDGET_COMBOBOX; enum DataType { // Data /** If types were to be added the following functions should be updated : PreferencesDialog::initDataWidgetLists() **/ DATA_TYPE_BOOL = 0, DATA_TYPE_INT = 1, DATA_TYPE_FLOAT = 2, }; enum ParamType { // Params /** If types were to be added the following functions should be updated : PreferencesDialog::initInteractiveWidgetLists() **/ PARAM_TYPE_BOOL = 0, PARAM_TYPE_INT = 1, PARAM_TYPE_FLOAT = 2, PARAM_TYPE_ENUM = 4, }; enum starpu_top_device_type { SERVERDEVICE_CPU = 0, SERVERDEVICE_CUDA = 1, SERVERDEVICE_OPENCL = 2 }; // Server devices typedef struct { int id; starpu_top_device_type type; QString name; } starpu_top_device; // Server tasks typedef struct { int taskId; int deviceId; qlonglong timestampStart; qlonglong timestampEnd; } starpu_top_task; // Descriptions typedef struct { // Certain fields must be ignored depending on type int id; QString descriptionString; DataWidgetType widget; DataType type; double valMax; double valMin; } DataDescription; typedef struct { // Certain fields must be ignored depending on type int id; QString descriptionString; InteractiveWidgetType widget; ParamType type; bool valInitBool; int valInitInt; double valInitDouble; int valInitEnum; double valMax; double valMin; QStringList enumValues; } ParamDescription; /* --------------------------------------------------------------------------- */ /* Widget lists items data */ /* --------------------------------------------------------------------------- */ typedef struct { int id; DataWidgetType widget; } DataWidgetListItemData; typedef struct { int id; InteractiveWidgetType widget; } InteractiveWidgetListItemData; /* --------------------------------------------------------------------------- */ /* Plot curves data */ /* --------------------------------------------------------------------------- */ typedef struct { QVector *xData; QVector *yData; } CurveData; /* --------------------------------------------------------------------------- */ /* Communication Manager states */ /* --------------------------------------------------------------------------- */ enum CommunicationState { COM_STATE_INIT = 0, COM_STATE_INIT_SERVERINFO = 1, COM_STATE_INIT_DATA = 2, COM_STATE_INIT_PARAMS = 3, COM_STATE_INIT_DEV = 4, COM_STATE_READY = 8, COM_STATE_LOOP = 10, }; /* --------------------------------------------------------------------------- */ /* Communication protocol messages */ /* --------------------------------------------------------------------------- */ enum CommunicationInMessageType { /* Complete commands */ COM_MSG_IN_TYPE_BOOL = 0, COM_MSG_IN_TYPE_INT = 1, COM_MSG_IN_TYPE_FLOAT = 2, COM_MSG_IN_TYPE_ENUM = 3, COM_MSG_IN_SERVERINFO_BEGIN = 5, COM_MSG_IN_SERVERINFO_END = 6, COM_MSG_IN_DATA_BEGIN = 10, COM_MSG_IN_DATA_END = 11, COM_MSG_IN_PARAMS_BEGIN = 20, COM_MSG_IN_PARAMS_END = 21, COM_MSG_IN_DEV_BEGIN = 30, COM_MSG_IN_DEV_END = 31, COM_MSG_IN_DEV_CPU = 32, COM_MSG_IN_DEV_CUDA = 33, COM_MSG_IN_DEV_OPENCL = 34, COM_MSG_IN_READY = 40, COM_MSG_IN_SET = 50, COM_MSG_IN_PREV = 60, COM_MSG_IN_START = 61, COM_MSG_IN_END = 62, COM_MSG_IN_UPDATE = 70, COM_MSG_IN_DEBUG = 80, COM_MSG_IN_DEBUG_ON = 81, COM_MSG_IN_DEBUG_OFF = 82, COM_MSG_IN_DEBUG_MESSAGE = 83, COM_MSG_IN_DEBUG_LOCK = 84, /* Shortened commands */ COM_MSG_IN_SHORT_UPDATE = 100, COM_MSG_IN_SHORT_PREV = 110, COM_MSG_IN_SHORT_START = 111, COM_MSG_IN_SHORT_END = 112, }; enum CommunicationOutMessageType { /* Complete commands */ COM_MSG_OUT_GO = 0, COM_MSG_OUT_ENABLE = 10, COM_MSG_OUT_DISABLE = 11, COM_MSG_OUT_SET = 20, COM_MSG_OUT_DEBUG = 30, COM_MSG_OUT_DEBUG_ON = 31, COM_MSG_OUT_DEBUG_OFF = 32, COM_MSG_OUT_DEBUG_STEP = 33, }; /* --------------------------------------------------------------------------- */ /* Session setup data for loading session setups */ /* --------------------------------------------------------------------------- */ typedef struct { int id; DataType type; DataWidgetType widget; } DataDescriptionSetup; typedef struct { int id; ParamType type; InteractiveWidgetType widget; } ParamDescriptionSetup; typedef struct { QByteArray geometry; DisplayMode displayMode; } MainWindowSetup; typedef struct { bool floating; QByteArray geometry; } ParametersDockSetup; typedef struct { bool inside; QByteArray geometry; int dataId; } DataWidgetSetup; typedef struct { bool inside; QByteArray geometry; QList dataIds; } DataAggregatorWidgetSetup; #endif // STARPU_TOP_TYPES_H starpu-1.2.3+dfsg/starpu-top/taskmanager.cpp000066400000000000000000000220011320135501600210600ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "taskmanager.h" #include #include #include TaskManager::TaskManager() { static bool instanciated = false; Q_ASSERT_X(instanciated == false, "TaskManager's' constructor", "Singleton pattern violated - " "TaskManager instanciated more than once"); qDebug() << "TaskManager : initializing"; instanciated = true; } TaskManager::~TaskManager() { qDebug() << "TaskManager : terminating"; _database.close(); } void TaskManager::initialize() { if (_database.isOpen()) { _database.close(); } _database = QSqlDatabase::addDatabase("QSQLITE"); _database.setDatabaseName(":memory:"); } bool TaskManager::connectDatabase() { if (_database.open() == false) { qDebug() << "TaskManager : connection to tasks database failed"; return false; } qDebug() << "TaskManager : connection to tasks database established"; QSqlQuery createDbQuery; // Real tasks table createDbQuery.exec("create table tasks (id int primary key, " "device int, start int, end int)"); createDbQuery.exec("create index tsidx on tasks(start,end)"); // Prev tasks table createDbQuery.exec("create table prevtasks (id int primary key, " "device int, start int, end int)"); createDbQuery.exec("create index prevtsidx on prevtasks(start,end)"); // Prepare the queries QSqlQuery insertTaskPrevQuery, insertTaskStartQuery, updateTaskEndQuery, selectTasksQuery, selectPrevTasksQuery; insertTaskPrevQuery.prepare( "insert or replace into prevtasks (id, device, start, end) " "values (?, ?, ?, ?)"); insertTaskStartQuery.prepare("insert into tasks (id, device, start, end) " "values (?, ?, ?, -1)"); updateTaskEndQuery.prepare("update tasks set end = ? where id = ?"); selectTasksQuery.prepare( "select * from tasks where (start between ? and ?) " "or (end between ? and ?) or (start < ? and end = -1)"); selectPrevTasksQuery.prepare( "select * from prevtasks where (start between ? and ?) " "or (end between ? and ?) or (start < ? and end = -1)"); // Optimisation insertTaskPrevQuery.setForwardOnly(true); insertTaskStartQuery.setForwardOnly(true); updateTaskEndQuery.setForwardOnly(true); selectTasksQuery.setForwardOnly(true); selectPrevTasksQuery.setForwardOnly(true); _insertTaskPrevQuery = insertTaskPrevQuery; _insertTaskStartQuery = insertTaskStartQuery; _updateTaskEndQuery = updateTaskEndQuery; _selectTasksQuery = selectTasksQuery; _selectPrevTasksQuery = selectPrevTasksQuery; return true; } void TaskManager::addTaskPrev(int taskId, int deviceId, qlonglong timestampStart, qlonglong timestampEnd) { _insertTaskPrevQuery.addBindValue(taskId); _insertTaskPrevQuery.addBindValue(deviceId); _insertTaskPrevQuery.addBindValue(timestampStart); _insertTaskPrevQuery.addBindValue(timestampEnd); if (_insertTaskPrevQuery.exec() == false) { qDebug() << "TaskManager : add task PREV for task" << taskId << "failed ! (" << _insertTaskPrevQuery.lastError() << ")"; } else { qDebug() << "TaskManager : registered new task PREV with id" << taskId << "on device" << deviceId << ", timestampStart" << timestampStart << ", timestampEnd" << timestampEnd; } } void TaskManager::addTaskStart(int taskId, int deviceId, qlonglong timestampStart) { _insertTaskStartQuery.addBindValue(taskId); _insertTaskStartQuery.addBindValue(deviceId); _insertTaskStartQuery.addBindValue(timestampStart); if (_insertTaskStartQuery.exec() == false) { qDebug() << "TaskManager : add task START for task" << taskId << "failed !" << _insertTaskStartQuery.lastError() << ")"; } else { qDebug() << "TaskManager : registered task START with id" << taskId << "on device" << deviceId << ", timestampStart" << timestampStart; } } void TaskManager::addTaskEnd(int taskId, qlonglong timestampEnd) { _updateTaskEndQuery.addBindValue(timestampEnd); _updateTaskEndQuery.addBindValue(taskId); if (_updateTaskEndQuery.exec() == false) { qDebug() << "TaskManager : add task END for task" << taskId << "failed !" << _updateTaskEndQuery.lastError() << ")"; } else { qDebug() << "TaskManager : registered task END with id" << taskId << ", timestampEnd" << timestampEnd; } } QList TaskManager::tasks(qlonglong timestampStart, qlonglong timestampEnd) { QList < starpu_top_task > tasks; _selectTasksQuery.addBindValue(timestampStart); _selectTasksQuery.addBindValue(timestampEnd); _selectTasksQuery.addBindValue(timestampStart); _selectTasksQuery.addBindValue(timestampEnd); _selectTasksQuery.addBindValue(timestampStart); if (_selectTasksQuery.exec() == false) { qDebug() << "TaskManager : failed to select tasks ! (" << _selectTasksQuery.lastError() << ")"; } else { qDebug() << "TaskManager : fetching tasks between" << timestampStart << "and" << timestampEnd; int idField = _selectTasksQuery.record().indexOf("id"); int deviceField = _selectTasksQuery.record().indexOf("device"); int startField = _selectTasksQuery.record().indexOf("start"); int endField = _selectTasksQuery.record().indexOf("end"); while (_selectTasksQuery.next()) { int taskId = _selectTasksQuery.value(idField).toInt(); int deviceId = _selectTasksQuery.value(deviceField).toInt(); qlonglong timestampStart = _selectTasksQuery.value(startField).toLongLong(); qlonglong timestampEnd = _selectTasksQuery.value(endField).toLongLong(); starpu_top_task task; task.taskId = taskId; task.deviceId = deviceId; task.timestampStart = timestampStart; task.timestampEnd = timestampEnd; tasks.append(task); } qDebug() << "TaskManager : selected" << tasks.count() << "tasks"; } return tasks; } QList TaskManager::prevTasks(qlonglong timestampStart, qlonglong timestampEnd) { QList < starpu_top_task > prevTasks; _selectPrevTasksQuery.addBindValue(timestampStart); _selectPrevTasksQuery.addBindValue(timestampEnd); _selectPrevTasksQuery.addBindValue(timestampStart); _selectPrevTasksQuery.addBindValue(timestampEnd); _selectPrevTasksQuery.addBindValue(timestampStart); if (_selectPrevTasksQuery.exec() == false) { qDebug() << "TaskManager : failed to select prev tasks ! (" << _selectPrevTasksQuery.lastError() << ")"; } else { qDebug() << "TaskManager : fetching prev tasks between" << timestampStart << "and" << timestampEnd; int idField = _selectPrevTasksQuery.record().indexOf("id"); int deviceField = _selectPrevTasksQuery.record().indexOf("device"); int startField = _selectPrevTasksQuery.record().indexOf("start"); int endField = _selectPrevTasksQuery.record().indexOf("end"); while (_selectPrevTasksQuery.next()) { int taskId = _selectPrevTasksQuery.value(idField).toInt(); int deviceId = _selectPrevTasksQuery.value(deviceField).toInt(); qlonglong timestampStart = _selectPrevTasksQuery.value(startField).toLongLong(); qlonglong timestampEnd = _selectPrevTasksQuery.value(endField).toLongLong(); starpu_top_task prevTask; prevTask.taskId = taskId; prevTask.deviceId = deviceId; prevTask.timestampStart = timestampStart; prevTask.timestampEnd = timestampEnd; prevTasks.append(prevTask); } qDebug() << "TaskManager : selected" << prevTasks.count() << "prev tasks"; } return prevTasks; } starpu-1.2.3+dfsg/starpu-top/taskmanager.h000066400000000000000000000037051320135501600205370ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef TASKMANAGER_H #define TASKMANAGER_H #include "starpu_top_types.h" #include #include #include class TaskManager { /* Manages the tasks received from the server in a memory SQLITE database. */ public: TaskManager(); ~TaskManager(); void initialize(); bool connectDatabase(); // Add new tasks void addTaskPrev(int taskId, int deviceId, qlonglong timestampStart, qlonglong timestampEnd); void addTaskStart(int taskId, int deviceId, qlonglong timestampStart); void addTaskEnd(int taskId, qlonglong timestampEnd); // Getters QList tasks(qlonglong timestampStart, qlonglong timestampEnd); QList prevTasks(qlonglong timestampStart, qlonglong timestampEnd); private: // Metadata // Database QSqlDatabase _database; // Queries QSqlQuery _insertTaskPrevQuery; QSqlQuery _insertTaskStartQuery; QSqlQuery _updateTaskEndQuery; QSqlQuery _selectTasksQuery; QSqlQuery _selectPrevTasksQuery; }; #endif // TASKMANAGER_H starpu-1.2.3+dfsg/starpu-top/widgetwindowsmanager.cpp000066400000000000000000000144341320135501600230270ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "widgetwindowsmanager.h" #include "mainwindow.h" #include "abstractwidgetwindow.h" #include "datawidget.h" #include "dataaggregatorwidget.h" #include WidgetWindowsManager::WidgetWindowsManager(MainWindow *mainWindow, QMdiArea *mdiArea) { static bool instanciated = false; Q_ASSERT_X(instanciated == false, "WidgetWindowsManager's' constructor", "Singleton pattern violated - " "WidgetWindowsManager instanciated more than once"); qDebug() << "WindowsWidgetManager : initializing"; _mainWindow = mainWindow; _mdiArea = mdiArea; instanciated = true; } WidgetWindowsManager::~WidgetWindowsManager() { qDebug() << "WindowsWidgetManager : terminating"; } void WidgetWindowsManager::displayWidgetWindow( AbstractWidgetWindow *widgetWindow) const { qDebug() << "WidgetWindowsManager : displaying widget window"; if (widgetWindow->isInside() == true) { // MDI mode _mdiArea->addSubWindow(widgetWindow); } widgetWindow->setVisible(true); } void WidgetWindowsManager::mdiToFlyingWindows() const { qDebug() << "WidgetWindowsManager : putting all widget windows outside"; _mdiArea->setVisible(false); // Data widgets for (int i = 0; i < _mainWindow->dataWidgets()->count(); i++) { AbstractWidgetWindow *widgetWindow = _mainWindow->dataWidgets()->at(i); if (widgetWindow != 0) { if (widgetWindow->isInside()) { _mdiArea->removeSubWindow(widgetWindow); widgetWindow->setInside(false); displayWidgetWindow(widgetWindow); } } } // Data aggregator widgets for (int i = 0; i < _mainWindow->dataAggregatorWidgets()->count(); i++) { AbstractWidgetWindow *widgetWindow = (AbstractWidgetWindow*) _mainWindow ->dataAggregatorWidgets()->at(i).data(); if (widgetWindow != 0) { if (widgetWindow->isInside()) { _mdiArea->removeSubWindow(widgetWindow); widgetWindow->setInside(false); displayWidgetWindow(widgetWindow); } } } _mdiArea->closeAllSubWindows(); } void WidgetWindowsManager::flyingWindowsToMdi() const { qDebug() << "WidgetWindowsManager : putting all widget windows inside"; _mdiArea->setVisible(true); // Data widgets for (int i = 0; i < _mainWindow->dataWidgets()->count(); i++) { AbstractWidgetWindow *widgetWindow = _mainWindow->dataWidgets()->at(i); if (widgetWindow != 0) { if (widgetWindow->isInside() == false) { widgetWindow->setInside(true); displayWidgetWindow(widgetWindow); } } } // Data aggregator widgets for (int i = 0; i < _mainWindow->dataAggregatorWidgets()->count(); i++) { AbstractWidgetWindow *widgetWindow = (AbstractWidgetWindow*) _mainWindow ->dataAggregatorWidgets()->at(i).data(); if (widgetWindow != 0) { if (widgetWindow->isInside() == false) { widgetWindow->setInside(true); displayWidgetWindow(widgetWindow); } } } } void WidgetWindowsManager::mdiToFlyingWindow( AbstractWidgetWindow *widgetWindow) const { QWidget* parentWindow = widgetWindow->parentWidget(); _mdiArea->removeSubWindow(widgetWindow); _mdiArea->removeSubWindow(parentWindow); displayWidgetWindow(widgetWindow); } void WidgetWindowsManager::flyingWindowToMdi( AbstractWidgetWindow *widgetWindow) const { if (_mdiArea->isVisible() == false) _mdiArea->setVisible(true); displayWidgetWindow(widgetWindow); } void WidgetWindowsManager::closeWidgetWindow( AbstractWidgetWindow *widgetWindow) const { if (widgetWindow->isInside()) { QWidget* parentWindow = widgetWindow->parentWidget(); _mdiArea->removeSubWindow(widgetWindow); _mdiArea->removeSubWindow(parentWindow); } widgetWindow->close(); } void WidgetWindowsManager::closeWidgetWindows() const { qDebug() << "WidgetWindowsManager : closing all widget windows"; // Data widgets for (int i = 0; i < _mainWindow->dataWidgets()->count(); i++) { AbstractWidgetWindow* widgetWindow = _mainWindow->dataWidgets()->at(i).data(); if (widgetWindow != 0) { closeWidgetWindow(widgetWindow); } } // Data aggregator widgets for (int i = 0; i < _mainWindow->dataAggregatorWidgets()->count(); i++) { AbstractWidgetWindow * widgetWindow = (AbstractWidgetWindow*) _mainWindow ->dataAggregatorWidgets()->at(i).data(); if (widgetWindow != 0) { closeWidgetWindow(widgetWindow); } } } const QList WidgetWindowsManager::widgetWindows() const { QList widgetWindows; // Get data widget windows for (int i = 0; i < _mainWindow->dataWidgets()->count(); i++) { widgetWindows.append(_mainWindow->dataWidgets()->at(i)); } // Get data aggregator widget windows for (int i = 0; i < _mainWindow->dataAggregatorWidgets()->count(); i++) { widgetWindows.append(_mainWindow->dataAggregatorWidgets()->at(i)); } return widgetWindows; } starpu-1.2.3+dfsg/starpu-top/widgetwindowsmanager.h000066400000000000000000000036141320135501600224720ustar00rootroot00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef WIDGETWINDOWSMANAGER_H #define WIDGETWINDOWSMANAGER_H #include #include #include #include class MainWindow; class AbstractWidgetWindow; class WidgetWindowsManager { /* Manages the widget windows of the current session and can save their states and geometries for use in another session */ public: WidgetWindowsManager( MainWindow *mainWindow, QMdiArea *mdiArea); ~WidgetWindowsManager(); void displayWidgetWindow(AbstractWidgetWindow *widgetWindow) const; void flyingWindowsToMdi() const; void mdiToFlyingWindows() const; void flyingWindowToMdi(AbstractWidgetWindow *widgetWindow) const; void mdiToFlyingWindow(AbstractWidgetWindow *widgetWindow) const; void closeWidgetWindow(AbstractWidgetWindow *widgetWindow) const; void closeWidgetWindows() const; const QList widgetWindows() const; private: // Data MainWindow *_mainWindow; QMdiArea *_mdiArea; }; #endif // WIDGETWINDOWSMANAGER_H starpu-1.2.3+dfsg/starpu.mk000066400000000000000000000022631320135501600156200ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. showcheck: -cat $(TEST_LOGS) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q " runtime error: " $(TEST_LOGS) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET starpu-1.2.3+dfsg/starpufft/000077500000000000000000000000001320135501600157645ustar00rootroot00000000000000starpu-1.2.3+dfsg/starpufft/Makefile.am000066400000000000000000000021171320135501600200210ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2013 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # SUBDIRS=src if BUILD_STARPUFFT_EXAMPLES SUBDIRS += tests endif versincludedir = $(includedir)/starpu/$(STARPU_EFFECTIVE_VERSION) versinclude_HEADERS = \ include/starpufft.h pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libstarpufft.pc starpufft-1.0.pc starpufft-1.1.pc starpufft-1.2.pc showcheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET starpu-1.2.3+dfsg/starpufft/Makefile.in000066400000000000000000000704701320135501600200410ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2013 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @BUILD_STARPUFFT_EXAMPLES_TRUE@am__append_1 = tests subdir = starpufft ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(versinclude_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = libstarpufft.pc starpufft-1.0.pc starpufft-1.1.pc \ starpufft-1.2.pc CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgconfigdir)" \ "$(DESTDIR)$(versincludedir)" DATA = $(pkgconfig_DATA) HEADERS = $(versinclude_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = src tests am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/libstarpufft.pc.in \ $(srcdir)/starpufft-1.0.pc.in $(srcdir)/starpufft-1.1.pc.in \ $(srcdir)/starpufft-1.2.pc.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POTI_CFLAGS = @POTI_CFLAGS@ POTI_LIBS = @POTI_LIBS@ PROG_DATE = @PROG_DATE@ PROG_STAT = @PROG_STAT@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_COI_CPPFLAGS = @STARPU_COI_CPPFLAGS@ STARPU_COI_LDFLAGS = @STARPU_COI_LDFLAGS@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LEVELDB_LDFLAGS = @STARPU_LEVELDB_LDFLAGS@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RCCE_CFLAGS = @STARPU_RCCE_CFLAGS@ STARPU_RCCE_CPPFLAGS = @STARPU_RCCE_CPPFLAGS@ STARPU_RCCE_LDFLAGS = @STARPU_RCCE_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SCIF_CPPFLAGS = @STARPU_SCIF_CPPFLAGS@ STARPU_SCIF_LDFLAGS = @STARPU_SCIF_LDFLAGS@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SC_HYPERVISOR_DEBUG = @STARPU_SC_HYPERVISOR_DEBUG@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ mpifort_path = @mpifort_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ smpirun_path = @smpirun_path@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = src $(am__append_1) versincludedir = $(includedir)/starpu/$(STARPU_EFFECTIVE_VERSION) versinclude_HEADERS = \ include/starpufft.h pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libstarpufft.pc starpufft-1.0.pc starpufft-1.1.pc starpufft-1.2.pc all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign starpufft/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign starpufft/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): libstarpufft.pc: $(top_builddir)/config.status $(srcdir)/libstarpufft.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ starpufft-1.0.pc: $(top_builddir)/config.status $(srcdir)/starpufft-1.0.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ starpufft-1.1.pc: $(top_builddir)/config.status $(srcdir)/starpufft-1.1.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ starpufft-1.2.pc: $(top_builddir)/config.status $(srcdir)/starpufft-1.2.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) install-versincludeHEADERS: $(versinclude_HEADERS) @$(NORMAL_INSTALL) @list='$(versinclude_HEADERS)'; test -n "$(versincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(versincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(versincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(versincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(versincludedir)" || exit $$?; \ done uninstall-versincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(versinclude_HEADERS)'; test -n "$(versincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(versincludedir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(DATA) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(versincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-pkgconfigDATA install-versincludeHEADERS install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-pkgconfigDATA uninstall-versincludeHEADERS .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgconfigDATA install-ps \ install-ps-am install-strip install-versincludeHEADERS \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-pkgconfigDATA \ uninstall-versincludeHEADERS .PRECIOUS: Makefile showcheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.2.3+dfsg/starpufft/include/000077500000000000000000000000001320135501600174075ustar00rootroot00000000000000starpu-1.2.3+dfsg/starpufft/include/starpufft.h000066400000000000000000000045651320135501600216100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2011 Université de Bordeaux * Copyright (C) 2010, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #ifdef STARPU_USE_CUDA #include #define STARPU_CUFFT_REPORT_ERROR(status) \ STARPUFFT(report_error)(__starpu_func__, __FILE__, __LINE__, status) #endif /* !STARPU_USE_CUDA */ #define STARPUFFT_FORWARD -1 #define STARPUFFT_INVERSE 1 #define __STARPUFFT(name) starpufft_##name #define __STARPUFFTF(name) starpufftf_##name #define __STARPUFFTL(name) starpufftl_##name #define __STARPUFFT_INTERFACE(starpufft,real) \ typedef real _Complex starpufft(complex); \ \ typedef struct starpufft(plan) *starpufft(plan); \ \ starpufft(plan) starpufft(plan_dft_1d)(int n, int sign, unsigned flags); \ starpufft(plan) starpufft(plan_dft_2d)(int n, int m, int sign, unsigned flags); \ starpufft(plan) starpufft(plan_dft_r2c_1d)(int n, unsigned flags); \ starpufft(plan) starpufft(plan_dft_c2r_1d)(int n, unsigned flags); \ \ void *starpufft(malloc)(size_t n); \ void starpufft(free)(void *p); \ \ int starpufft(execute)(starpufft(plan) p, void *in, void *out); \ struct starpu_task *starpufft(start)(starpufft(plan) p, void *in, void *out); \ \ int starpufft(execute_handle)(starpufft(plan) p, starpu_data_handle_t in, starpu_data_handle_t out); \ struct starpu_task *starpufft(start_handle)(starpufft(plan) p, starpu_data_handle_t in, starpu_data_handle_t out); \ \ void starpufft(cleanup)(starpufft(plan) p); \ void starpufft(destroy_plan)(starpufft(plan) p); \ \ void starpufft(startstats)(void); \ void starpufft(stopstats)(void); \ void starpufft(showstats)(FILE *out); __STARPUFFT_INTERFACE(__STARPUFFT, double) __STARPUFFT_INTERFACE(__STARPUFFTF, float) __STARPUFFT_INTERFACE(__STARPUFFTL, long double) /* Internal use */ extern int starpufft_last_plan_number; starpu-1.2.3+dfsg/starpufft/libstarpufft.pc.in000066400000000000000000000021401320135501600214170ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2012 Université de Bordeaux # Copyright (C) 2010, 2011, 2012 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: starpufft Description: offers support for heterogeneous multicore architecture Version: @PACKAGE_VERSION@ Cflags: -I${includedir}/starpu/@STARPU_EFFECTIVE_VERSION@ @STARPU_CUDA_CPPFLAGS@ -DSTARPU_USE_DEPRECATED_API Libs: -L${libdir} -lstarpufft-@STARPU_EFFECTIVE_VERSION@ Libs.private: @LDFLAGS@ @LIBS@ @STARPU_CUFFT_LDFLAGS@ @FFTW_LIBS@ @FFTWF_LIBS@ starpu-1.2.3+dfsg/starpufft/src/000077500000000000000000000000001320135501600165535ustar00rootroot00000000000000starpu-1.2.3+dfsg/starpufft/src/Makefile.am000066400000000000000000000051031320135501600206060ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2013, 2015-2016 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # include $(top_srcdir)/starpu.mk AM_CFLAGS = $(GLOBAL_AM_CFLAGS) $(HWLOC_CFLAGS) AM_CPPFLAGS = -I$(top_srcdir)/include/ -I$(top_srcdir)/starpufft/include/ -I$(top_builddir)/include $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) lib_LTLIBRARIES = libstarpufft-@STARPU_EFFECTIVE_VERSION@.la EXTRA_DIST = \ starpufft-float.h \ starpufft-double.h \ cudax_kernels.h \ starpufftx.c \ starpufftx1d.c \ starpufftx2d.c \ cuda_kernels.cu \ cudaf_kernels.cu \ cudax_kernels.cu libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_SOURCES = starpufft.c starpufftf.c starpufft_common.c libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_LIBADD = $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la $(FFTW_LIBS) $(FFTWF_LIBS) $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) $(STARPU_CUFFT_LDFLAGS) $(STARPU_COI_LDFLAGS) $(STARPU_SCIF_LDFLAGS) libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_CFLAGS = $(FFTWF_CFLAGS) libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_LDFLAGS = $(ldflags) -no-undefined \ -version-info $(LIBSTARPUFFT_INTERFACE_CURRENT):$(LIBSTARPUFFT_INTERFACE_REVISION):$(LIBSTARPUFFT_INTERFACE_AGE) if STARPU_USE_CUDA NVCCFLAGS += -Xcompiler -fPIC -Xlinker -fPIC cudaf_kernels.o: cudaf_kernels.cu $(NVCC) $(AM_CPPFLAGS) $< -c -o $@ --compiler-options -fno-strict-aliasing $(NVCCFLAGS) -I${includedir} libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_SOURCES += cudaf_kernels.cu am_libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS = cudaf_kernels.o starpufft.lo starpufftf.lo starpufft_common.lo if STARPU_HAVE_CUFFTDOUBLECOMPLEX cuda_kernels.o: cuda_kernels.cu $(NVCC) $(AM_CPPFLAGS) $< -c -o $@ --compiler-options -fno-strict-aliasing $(NVCCFLAGS) -I${includedir} libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_SOURCES += cuda_kernels.cu am_libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS += cuda_kernels.o endif libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_LIBADD += $(STARPU_CUDA_LDFLAGS) endif starpu-1.2.3+dfsg/starpufft/src/Makefile.in000066400000000000000000001014021320135501600206160ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2013, 2015-2016 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @STARPU_USE_CUDA_TRUE@am__append_1 = -Xcompiler -fPIC -Xlinker -fPIC @STARPU_USE_CUDA_TRUE@am__append_2 = cudaf_kernels.cu @STARPU_USE_CUDA_FALSE@am_libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS = libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft.lo \ @STARPU_USE_CUDA_FALSE@ libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufftf.lo \ @STARPU_USE_CUDA_FALSE@ libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft_common.lo \ @STARPU_USE_CUDA_FALSE@ $(am__objects_1) $(am__objects_1) @STARPU_HAVE_CUFFTDOUBLECOMPLEX_TRUE@@STARPU_USE_CUDA_TRUE@am__append_3 = cuda_kernels.cu @STARPU_HAVE_CUFFTDOUBLECOMPLEX_TRUE@@STARPU_USE_CUDA_TRUE@am__append_4 = cuda_kernels.o @STARPU_USE_CUDA_TRUE@am__append_5 = $(STARPU_CUDA_LDFLAGS) subdir = starpufft/src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = @STARPU_USE_CUDA_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_DEPENDENCIES = \ $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) am__libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_SOURCES_DIST = \ starpufft.c starpufftf.c starpufft_common.c cudaf_kernels.cu \ cuda_kernels.cu am__objects_1 = libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS = \ $(am_libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_CFLAGS) $(CFLAGS) \ $(libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/common -I$(top_builddir)/include -I$(top_builddir)/gcc-plugin/include/starpu-gcc -I$(top_builddir)/starpu-top depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_SOURCES) DIST_SOURCES = $(am__libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/build-aux/depcomp $(top_srcdir)/starpu.mk DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ $(am__append_1) NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POTI_CFLAGS = @POTI_CFLAGS@ POTI_LIBS = @POTI_LIBS@ PROG_DATE = @PROG_DATE@ PROG_STAT = @PROG_STAT@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_COI_CPPFLAGS = @STARPU_COI_CPPFLAGS@ STARPU_COI_LDFLAGS = @STARPU_COI_LDFLAGS@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LEVELDB_LDFLAGS = @STARPU_LEVELDB_LDFLAGS@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RCCE_CFLAGS = @STARPU_RCCE_CFLAGS@ STARPU_RCCE_CPPFLAGS = @STARPU_RCCE_CPPFLAGS@ STARPU_RCCE_LDFLAGS = @STARPU_RCCE_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SCIF_CPPFLAGS = @STARPU_SCIF_CPPFLAGS@ STARPU_SCIF_LDFLAGS = @STARPU_SCIF_LDFLAGS@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SC_HYPERVISOR_DEBUG = @STARPU_SC_HYPERVISOR_DEBUG@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ mpifort_path = @mpifort_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ smpirun_path = @smpirun_path@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CFLAGS = $(GLOBAL_AM_CFLAGS) $(HWLOC_CFLAGS) AM_CPPFLAGS = -I$(top_srcdir)/include/ -I$(top_srcdir)/starpufft/include/ -I$(top_builddir)/include $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) lib_LTLIBRARIES = libstarpufft-@STARPU_EFFECTIVE_VERSION@.la EXTRA_DIST = \ starpufft-float.h \ starpufft-double.h \ cudax_kernels.h \ starpufftx.c \ starpufftx1d.c \ starpufftx2d.c \ cuda_kernels.cu \ cudaf_kernels.cu \ cudax_kernels.cu libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_SOURCES = starpufft.c \ starpufftf.c starpufft_common.c $(am__append_2) \ $(am__append_3) libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_LIBADD = \ $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la \ $(FFTW_LIBS) $(FFTWF_LIBS) $(STARPU_OPENCL_LDFLAGS) \ $(STARPU_CUDA_LDFLAGS) $(STARPU_CUFFT_LDFLAGS) \ $(STARPU_COI_LDFLAGS) $(STARPU_SCIF_LDFLAGS) $(am__append_5) libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_CFLAGS = $(FFTWF_CFLAGS) libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_LDFLAGS = $(ldflags) -no-undefined \ -version-info $(LIBSTARPUFFT_INTERFACE_CURRENT):$(LIBSTARPUFFT_INTERFACE_REVISION):$(LIBSTARPUFFT_INTERFACE_AGE) @STARPU_USE_CUDA_TRUE@am_libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS = \ @STARPU_USE_CUDA_TRUE@ cudaf_kernels.o starpufft.lo \ @STARPU_USE_CUDA_TRUE@ starpufftf.lo starpufft_common.lo \ @STARPU_USE_CUDA_TRUE@ $(am__append_4) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/starpu.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign starpufft/src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign starpufft/src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/starpu.mk $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libstarpufft-@STARPU_EFFECTIVE_VERSION@.la: $(libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS) $(libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_DEPENDENCIES) $(EXTRA_libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_DEPENDENCIES) $(AM_V_CCLD)$(libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_LINK) -rpath $(libdir) $(libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS) $(libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft_common.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufftf.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft.lo: starpufft.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_CFLAGS) $(CFLAGS) -MT libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft.lo -MD -MP -MF $(DEPDIR)/libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft.Tpo -c -o libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft.lo `test -f 'starpufft.c' || echo '$(srcdir)/'`starpufft.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft.Tpo $(DEPDIR)/libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='starpufft.c' object='libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft.lo `test -f 'starpufft.c' || echo '$(srcdir)/'`starpufft.c libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufftf.lo: starpufftf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_CFLAGS) $(CFLAGS) -MT libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufftf.lo -MD -MP -MF $(DEPDIR)/libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufftf.Tpo -c -o libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufftf.lo `test -f 'starpufftf.c' || echo '$(srcdir)/'`starpufftf.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufftf.Tpo $(DEPDIR)/libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufftf.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='starpufftf.c' object='libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufftf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufftf.lo `test -f 'starpufftf.c' || echo '$(srcdir)/'`starpufftf.c libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft_common.lo: starpufft_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_CFLAGS) $(CFLAGS) -MT libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft_common.lo -MD -MP -MF $(DEPDIR)/libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft_common.Tpo -c -o libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft_common.lo `test -f 'starpufft_common.c' || echo '$(srcdir)/'`starpufft_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft_common.Tpo $(DEPDIR)/libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft_common.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='starpufft_common.c' object='libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft_common.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft_common.lo `test -f 'starpufft_common.c' || echo '$(srcdir)/'`starpufft_common.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool cscopelist-am ctags-am \ distclean distclean-compile distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags-am uninstall uninstall-am uninstall-libLTLIBRARIES .PRECIOUS: Makefile showcheck: -cat $(TEST_LOGS) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q " runtime error: " $(TEST_LOGS) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET @STARPU_USE_CUDA_TRUE@cudaf_kernels.o: cudaf_kernels.cu @STARPU_USE_CUDA_TRUE@ $(NVCC) $(AM_CPPFLAGS) $< -c -o $@ --compiler-options -fno-strict-aliasing $(NVCCFLAGS) -I${includedir} @STARPU_HAVE_CUFFTDOUBLECOMPLEX_TRUE@@STARPU_USE_CUDA_TRUE@cuda_kernels.o: cuda_kernels.cu @STARPU_HAVE_CUFFTDOUBLECOMPLEX_TRUE@@STARPU_USE_CUDA_TRUE@ $(NVCC) $(AM_CPPFLAGS) $< -c -o $@ --compiler-options -fno-strict-aliasing $(NVCCFLAGS) -I${includedir} # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.2.3+dfsg/starpufft/src/cuda_kernels.cu000066400000000000000000000013511320135501600215430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2012 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "starpufft-double.h" #include "cudax_kernels.cu" starpu-1.2.3+dfsg/starpufft/src/cudaf_kernels.cu000066400000000000000000000013501320135501600217100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2012 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "starpufft-float.h" #include "cudax_kernels.cu" starpu-1.2.3+dfsg/starpufft/src/cudax_kernels.cu000066400000000000000000000114271320135501600217400ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2011 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #define _externC extern "C" #include "cudax_kernels.h" /* Note: these assume that the sizes are powers of two */ #define VARS_1d \ unsigned start = threadIdx.x + blockIdx.x * blockDim.x; \ unsigned numthreads = blockDim.x * gridDim.x; #define DISTRIB_1d(n, func,args) \ unsigned threads_per_block = 128; \ \ if (n < threads_per_block) \ { \ dim3 dimGrid(n); \ func <<>> args; \ } \ else \ { \ dim3 dimGrid(n / threads_per_block); \ dim3 dimBlock(threads_per_block); \ func <<>> args; \ } \ cudaStreamSynchronize(starpu_cuda_get_local_stream()); \ extern "C" __global__ void STARPUFFT(cuda_twist1_1d)(const _cuComplex *in, _cuComplex *twisted1, unsigned i, unsigned n1, unsigned n2) { unsigned j; VARS_1d unsigned end = n2; for (j = start; j < end; j += numthreads) twisted1[j] = in[i+j*n1]; } extern "C" void STARPUFFT(cuda_twist1_1d_host)(const _cuComplex *in, _cuComplex *twisted1, unsigned i, unsigned n1, unsigned n2) { DISTRIB_1d(n2, STARPUFFT(cuda_twist1_1d), (in, twisted1, i, n1, n2)); } extern "C" __global__ void STARPUFFT(cuda_twiddle_1d)(_cuComplex * out, const _cuComplex * roots, unsigned n, unsigned i) { unsigned j; VARS_1d unsigned end = n; for (j = start; j < end; j += numthreads) out[j] = _cuCmul(out[j], roots[i*j]); return; } extern "C" void STARPUFFT(cuda_twiddle_1d_host)(_cuComplex *out, const _cuComplex *roots, unsigned n, unsigned i) { DISTRIB_1d(n, STARPUFFT(cuda_twiddle_1d), (out, roots, n, i)); } #define VARS_2d \ unsigned startx = threadIdx.x + blockIdx.x * blockDim.x; \ unsigned starty = threadIdx.y + blockIdx.y * blockDim.y; \ unsigned numthreadsx = blockDim.x * gridDim.x; \ unsigned numthreadsy = blockDim.y * gridDim.y; /* FIXME: introduce threads_per_dim_n / m instead */ #define DISTRIB_2d(n, m, func, args) \ unsigned threads_per_dim = 16; \ if (n < threads_per_dim) \ { \ if (m < threads_per_dim) \ { \ dim3 dimGrid(n, m); \ func <<>> args; \ } \ else \ { \ dim3 dimGrid(1, m / threads_per_dim); \ dim3 dimBlock(n, threads_per_dim); \ func <<>> args; \ } \ } \ else \ { \ if (m < threads_per_dim) \ { \ dim3 dimGrid(n / threads_per_dim, 1); \ dim3 dimBlock(threads_per_dim, m); \ func <<>> args; \ } \ else \ { \ dim3 dimGrid(n / threads_per_dim, m / threads_per_dim); \ dim3 dimBlock(threads_per_dim, threads_per_dim); \ func <<>> args; \ } \ } \ cudaStreamSynchronize(starpu_cuda_get_local_stream()); \ extern "C" __global__ void STARPUFFT(cuda_twist1_2d)(const _cuComplex *in, _cuComplex *twisted1, unsigned i, unsigned j, unsigned n1, unsigned n2, unsigned m1, unsigned m2) { unsigned k, l; VARS_2d unsigned endx = n2; unsigned endy = m2; unsigned m = m1*m2; for (k = startx; k < endx; k += numthreadsx) for (l = starty; l < endy; l += numthreadsy) twisted1[k*m2+l] = in[i*m+j+k*m*n1+l*m1]; } extern "C" void STARPUFFT(cuda_twist1_2d_host)(const _cuComplex *in, _cuComplex *twisted1, unsigned i, unsigned j, unsigned n1, unsigned n2, unsigned m1, unsigned m2) { DISTRIB_2d(n2, m2, STARPUFFT(cuda_twist1_2d), (in, twisted1, i, j, n1, n2, m1, m2)); } extern "C" __global__ void STARPUFFT(cuda_twiddle_2d)(_cuComplex * out, const _cuComplex * roots0, const _cuComplex * roots1, unsigned n2, unsigned m2, unsigned i, unsigned j) { unsigned k, l; VARS_2d unsigned endx = n2; unsigned endy = m2; for (k = startx; k < endx ; k += numthreadsx) for (l = starty; l < endy ; l += numthreadsy) out[k*m2 + l] = _cuCmul(_cuCmul(out[k*m2 + l], roots0[i*k]), roots1[j*l]); return; } extern "C" void STARPUFFT(cuda_twiddle_2d_host)(_cuComplex *out, const _cuComplex *roots0, const _cuComplex *roots1, unsigned n2, unsigned m2, unsigned i, unsigned j) { DISTRIB_2d(n2, m2, STARPUFFT(cuda_twiddle_2d), (out, roots0, roots1, n2, m2, i, j)); } starpu-1.2.3+dfsg/starpufft/src/cudax_kernels.h000066400000000000000000000024341320135501600215560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include _externC void STARPUFFT(cuda_twist1_1d_host)(const _cuComplex *in, _cuComplex *twisted1, unsigned i, unsigned n1, unsigned n2); _externC void STARPUFFT(cuda_twiddle_1d_host)(_cuComplex *out, const _cuComplex *roots, unsigned n, unsigned i); _externC void STARPUFFT(cuda_twist1_2d_host)(const _cuComplex *in, _cuComplex *twisted1, unsigned i, unsigned j, unsigned n1, unsigned n2, unsigned m1, unsigned m2); _externC void STARPUFFT(cuda_twiddle_2d_host)(_cuComplex *out, const _cuComplex *roots0, const _cuComplex *roots1, unsigned n2, unsigned m2, unsigned i, unsigned j); starpu-1.2.3+dfsg/starpufft/src/starpufft-double.h000066400000000000000000000031241320135501600222120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2012 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #if defined(STARPU_HAVE_FFTW) && !defined(__CUDACC__) #include #include #endif #ifdef STARPU_USE_CUDA #include #endif #undef FLOAT #define DOUBLE typedef double real; #if defined(STARPU_HAVE_FFTW) && !defined(__CUDACC__) typedef fftw_complex _fftw_complex; typedef fftw_plan _fftw_plan; #endif #ifdef STARPU_USE_CUDA typedef cuDoubleComplex _cuComplex; typedef cufftDoubleComplex _cufftComplex; #define _cufftExecC2C cufftExecZ2Z #define _cufftExecR2C cufftExecD2Z #define _cufftExecC2R cufftExecZ2D #define _CUFFT_C2C CUFFT_Z2Z #define _CUFFT_R2C CUFFT_D2Z #define _CUFFT_C2R CUFFT_Z2D #define _cuCmul(x,y) cuCmul(x,y) #endif #define STARPUFFT(name) starpufft_##name #define _FFTW(name) fftw_##name #ifdef STARPU_USE_CUDA void STARPUFFT(report_error)(const char *func, const char *file, int line, cufftResult status); #endif /* !STARPU_USE_CUDA */ #define TYPE "" starpu-1.2.3+dfsg/starpufft/src/starpufft-float.h000066400000000000000000000031151320135501600220450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2012 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #if defined(STARPU_HAVE_FFTW) && !defined(__CUDACC__) #include #include #endif #ifdef STARPU_USE_CUDA #include #endif #undef DOUBLE #define FLOAT typedef float real; #if defined(STARPU_HAVE_FFTW) && !defined(__CUDACC__) typedef fftwf_complex _fftw_complex; typedef fftwf_plan _fftw_plan; #endif #ifdef STARPU_USE_CUDA typedef cuComplex _cuComplex; typedef cufftComplex _cufftComplex; #define _cufftExecC2C cufftExecC2C #define _cufftExecR2C cufftExecR2C #define _cufftExecC2R cufftExecC2R #define _CUFFT_C2C CUFFT_C2C #define _CUFFT_R2C CUFFT_R2C #define _CUFFT_C2R CUFFT_C2R #define _cuCmul(x,y) cuCmulf(x,y) #endif #define STARPUFFT(name) starpufftf_##name #define _FFTW(name) fftwf_##name #ifdef STARPU_USE_CUDA void STARPUFFT(report_error)(const char *func, const char *file, int line, cufftResult status); #endif /* !STARPU_USE_CUDA */ #define TYPE "f" starpu-1.2.3+dfsg/starpufft/src/starpufft.c000066400000000000000000000013451320135501600207400ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2012 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "starpufft-double.h" #include "starpufftx.c" starpu-1.2.3+dfsg/starpufft/src/starpufft_common.c000066400000000000000000000014571320135501600223140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 CNRS * Copyright (C) 2010-2011 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "starpufft.h" /* Used as an identifier in starpu tags to let plans run concurrently */ int starpufft_last_plan_number; starpu-1.2.3+dfsg/starpufft/src/starpufftf.c000066400000000000000000000013441320135501600211050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2012 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "starpufft-float.h" #include "starpufftx.c" starpu-1.2.3+dfsg/starpufft/src/starpufftx.c000066400000000000000000000276401320135501600211360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012, 2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #define PARALLEL 0 #include #include #include #include #include #include "starpufft.h" #ifdef STARPU_USE_CUDA #define _externC extern #include "cudax_kernels.h" #if defined(FLOAT) || defined(STARPU_HAVE_CUFFTDOUBLECOMPLEX) # define __STARPU_USE_CUDA #else # undef __STARPU_USE_CUDA #endif #endif #define _FFTW_FLAGS FFTW_ESTIMATE /* Steps for the parallel variant */ enum steps { SPECIAL, TWIST1, FFT1, JOIN, TWIST2, FFT2, TWIST3, END }; #define NUMBER_BITS 5 #define NUMBER_SHIFT (64 - NUMBER_BITS) #define STEP_BITS 3 #define STEP_SHIFT (NUMBER_SHIFT - STEP_BITS) /* Tags for the steps of the parallel variant */ #define _STEP_TAG(plan, step, i) (((starpu_tag_t) plan->number << NUMBER_SHIFT) | ((starpu_tag_t)(step) << STEP_SHIFT) | (starpu_tag_t) (i)) #define I_BITS STEP_SHIFT enum type { R2C, C2R, C2C }; static unsigned task_per_worker[STARPU_NMAXWORKERS]; static unsigned samples_per_worker[STARPU_NMAXWORKERS]; static struct timeval start, submit_tasks, end; /* * * The actual kernels * */ struct STARPUFFT(plan) { int number; /* uniquely identifies the plan, for starpu tags */ int *n; int *n1; int *n2; int totsize; int totsize1; /* Number of first-round tasks */ int totsize2; /* Size of first-round tasks */ int totsize3; /* Number of second-round tasks */ int totsize4; /* Size of second-round tasks */ int dim; enum type type; int sign; STARPUFFT(complex) *roots[2]; starpu_data_handle_t roots_handle[2]; /* For each worker, we need some data */ struct { #ifdef STARPU_USE_CUDA /* CUFFT plans */ cufftHandle plan1_cuda, plan2_cuda; /* Sequential version */ cufftHandle plan_cuda; #endif #ifdef STARPU_HAVE_FFTW /* FFTW plans */ _fftw_plan plan1_cpu, plan2_cpu; /* Sequential version */ _fftw_plan plan_cpu; #endif } plans[STARPU_NMAXWORKERS]; /* Buffers for codelets */ STARPUFFT(complex) *in, *twisted1, *fft1, *twisted2, *fft2, *out; /* corresponding starpu DSM handles */ starpu_data_handle_t in_handle, *twisted1_handle, *fft1_handle, *twisted2_handle, *fft2_handle, out_handle; /* Tasks */ struct starpu_task **twist1_tasks, **fft1_tasks, **twist2_tasks, **fft2_tasks, **twist3_tasks; struct starpu_task *join_task, *end_task; /* Arguments for tasks */ struct STARPUFFT(args) *fft1_args, *fft2_args; }; struct STARPUFFT(args) { struct STARPUFFT(plan) *plan; int i, j, jj, kk, ll, *iv, *kkv; }; static void check_dims(STARPUFFT(plan) plan) { int dim; for (dim = 0; dim < plan->dim; dim++) if (plan->n[dim] & (plan->n[dim]-1)) { fprintf(stderr,"can't cope with non-power-of-2\n"); STARPU_ABORT(); } } static void compute_roots(STARPUFFT(plan) plan) { int dim, k; /* Compute the n-roots and m-roots of unity for twiddling */ for (dim = 0; dim < plan->dim; dim++) { STARPUFFT(complex) exp = (plan->sign * 2. * 4.*atan(1.)) * _Complex_I / (STARPUFFT(complex)) plan->n[dim]; plan->roots[dim] = malloc(plan->n[dim] * sizeof(**plan->roots)); for (k = 0; k < plan->n[dim]; k++) plan->roots[dim][k] = cexp(exp*k); starpu_vector_data_register(&plan->roots_handle[dim], STARPU_MAIN_RAM, (uintptr_t) plan->roots[dim], plan->n[dim], sizeof(**plan->roots)); #ifdef STARPU_USE_CUDA if (plan->n[dim] > 100000) { /* prefetch the big root array on GPUs */ unsigned worker; unsigned nworkers = starpu_worker_get_count(); for (worker = 0; worker < nworkers; worker++) { unsigned node = starpu_worker_get_memory_node(worker); if (starpu_worker_get_type(worker) == STARPU_CUDA_WORKER) starpu_data_prefetch_on_node(plan->roots_handle[dim], node, 0); } } #endif } } /* Only CUDA capability >= 1.3 supports doubles, rule old card out. */ #ifdef DOUBLE static int can_execute(unsigned workerid, struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned nimpl STARPU_ATTRIBUTE_UNUSED) { if (starpu_worker_get_type(workerid) == STARPU_CPU_WORKER) return 1; #ifdef STARPU_USE_CUDA { /* Cuda device */ const struct cudaDeviceProp *props; props = starpu_cuda_get_device_properties(workerid); if (props->major >= 2 || props->minor >= 3) /* At least compute capability 1.3, supports doubles */ return 1; /* Old card does not support doubles */ return 0; } #endif return 0; } #define CAN_EXECUTE .can_execute = can_execute, #else #define CAN_EXECUTE #endif #include "starpufftx1d.c" #include "starpufftx2d.c" struct starpu_task * STARPUFFT(start)(STARPUFFT(plan) plan, void *_in, void *_out) { struct starpu_task *task; int z; plan->in = _in; plan->out = _out; switch (plan->dim) { case 1: { switch (plan->type) { case C2C: starpu_vector_data_register(&plan->in_handle, STARPU_MAIN_RAM, (uintptr_t) plan->in, plan->totsize, sizeof(STARPUFFT(complex))); if (!PARALLEL) starpu_vector_data_register(&plan->out_handle, STARPU_MAIN_RAM, (uintptr_t) plan->out, plan->totsize, sizeof(STARPUFFT(complex))); if (PARALLEL) { for (z = 0; z < plan->totsize1; z++) plan->twist1_tasks[z]->handles[0] = plan->in_handle; } task = STARPUFFT(start1dC2C)(plan, plan->in_handle, plan->out_handle); break; default: STARPU_ABORT(); break; } break; } case 2: starpu_vector_data_register(&plan->in_handle, STARPU_MAIN_RAM, (uintptr_t) plan->in, plan->totsize, sizeof(STARPUFFT(complex))); if (!PARALLEL) starpu_vector_data_register(&plan->out_handle, STARPU_MAIN_RAM, (uintptr_t) plan->out, plan->totsize, sizeof(STARPUFFT(complex))); if (PARALLEL) { for (z = 0; z < plan->totsize1; z++) plan->twist1_tasks[z]->handles[0] = plan->in_handle; } task = STARPUFFT(start2dC2C)(plan, plan->in_handle, plan->out_handle); break; default: STARPU_ABORT(); break; } return task; } void STARPUFFT(cleanup)(STARPUFFT(plan) plan) { if (plan->in_handle) starpu_data_unregister(plan->in_handle); if (!PARALLEL) { if (plan->out_handle) starpu_data_unregister(plan->out_handle); } } struct starpu_task * STARPUFFT(start_handle)(STARPUFFT(plan) plan, starpu_data_handle_t in, starpu_data_handle_t out) { return STARPUFFT(start1dC2C)(plan, in, out); } int STARPUFFT(execute)(STARPUFFT(plan) plan, void *in, void *out) { int ret; memset(task_per_worker, 0, sizeof(task_per_worker)); memset(samples_per_worker, 0, sizeof(task_per_worker)); gettimeofday(&start, NULL); struct starpu_task *task = STARPUFFT(start)(plan, in, out); gettimeofday(&submit_tasks, NULL); if (task) { ret = starpu_task_wait(task); STARPU_ASSERT(ret == 0); } STARPUFFT(cleanup)(plan); gettimeofday(&end, NULL); return (task == NULL ? -1 : 0); } int STARPUFFT(execute_handle)(STARPUFFT(plan) plan, starpu_data_handle_t in, starpu_data_handle_t out) { int ret; struct starpu_task *task = STARPUFFT(start_handle)(plan, in, out); if (!task) return -1; ret = starpu_task_wait(task); STARPU_ASSERT(ret == 0); return 0; } /* Destroy FFTW plans, unregister and free buffers, and free tags */ void STARPUFFT(destroy_plan)(STARPUFFT(plan) plan) { unsigned workerid; int dim, i; for (workerid = 0; workerid < starpu_worker_get_count(); workerid++) { switch (starpu_worker_get_type(workerid)) { case STARPU_CPU_WORKER: #ifdef STARPU_HAVE_FFTW if (PARALLEL) { _FFTW(destroy_plan)(plan->plans[workerid].plan1_cpu); _FFTW(destroy_plan)(plan->plans[workerid].plan2_cpu); } else { _FFTW(destroy_plan)(plan->plans[workerid].plan_cpu); } #endif break; case STARPU_CUDA_WORKER: #ifdef STARPU_USE_CUDA /* FIXME: Can't deallocate */ #endif break; default: /* Do not care, we won't be executing anything there. */ break; } } if (PARALLEL) { for (i = 0; i < plan->totsize1; i++) { starpu_data_unregister(plan->twisted1_handle[i]); free(plan->twist1_tasks[i]); starpu_data_unregister(plan->fft1_handle[i]); free(plan->fft1_tasks[i]); } free(plan->twisted1_handle); free(plan->twist1_tasks); free(plan->fft1_handle); free(plan->fft1_tasks); free(plan->fft1_args); free(plan->join_task); for (i = 0; i < plan->totsize3; i++) { starpu_data_unregister(plan->twisted2_handle[i]); free(plan->twist2_tasks[i]); starpu_data_unregister(plan->fft2_handle[i]); free(plan->fft2_tasks[i]); free(plan->twist3_tasks[i]); } free(plan->end_task); free(plan->twisted2_handle); free(plan->twist2_tasks); free(plan->fft2_handle); free(plan->fft2_tasks); free(plan->twist3_tasks); free(plan->fft2_args); for (dim = 0; dim < plan->dim; dim++) { starpu_data_unregister(plan->roots_handle[dim]); free(plan->roots[dim]); } switch (plan->dim) { case 1: STARPUFFT(free_1d_tags)(plan); break; case 2: STARPUFFT(free_2d_tags)(plan); break; default: STARPU_ABORT(); break; } free(plan->n1); free(plan->n2); STARPUFFT(free)(plan->twisted1); STARPUFFT(free)(plan->fft1); STARPUFFT(free)(plan->twisted2); STARPUFFT(free)(plan->fft2); } free(plan->n); free(plan); } void * STARPUFFT(malloc)(size_t n) { #ifdef STARPU_USE_CUDA void *res; starpu_malloc(&res, n); return res; #else # ifdef STARPU_HAVE_FFTW return _FFTW(malloc)(n); # else return malloc(n); # endif #endif } void STARPUFFT(free)(void *p) { #ifdef STARPU_USE_CUDA starpu_free(p); #else # ifdef STARPU_HAVE_FFTW _FFTW(free)(p); # else free(p); # endif #endif } void STARPUFFT(showstats)(FILE *out) { unsigned worker; unsigned total; #define TIMING(begin,end) (double)((end.tv_sec - begin.tv_sec)*1000000 + (end.tv_usec - begin.tv_usec)) #define MSTIMING(begin,end) (TIMING(begin,end)/1000.) double paratiming = TIMING(start,end); fprintf(out, "Tasks submission took %2.2f ms\n", MSTIMING(start,submit_tasks)); fprintf(out, "Tasks termination took %2.2f ms\n", MSTIMING(submit_tasks,end)); fprintf(out, "Total %2.2f ms\n", MSTIMING(start,end)); for (worker = 0, total = 0; worker < starpu_worker_get_count(); worker++) total += task_per_worker[worker]; for (worker = 0; worker < starpu_worker_get_count(); worker++) { if (task_per_worker[worker]) { char name[32]; starpu_worker_get_name(worker, name, sizeof(name)); unsigned long bytes = sizeof(STARPUFFT(complex))*samples_per_worker[worker]; fprintf(stderr, "\t%s -> %2.2f MB\t%2.2f\tMB/s\t%u %2.2f %%\n", name, (1.0*bytes)/(1024*1024), bytes/paratiming, task_per_worker[worker], (100.0*task_per_worker[worker])/total); } } } #ifdef STARPU_USE_CUDA void STARPUFFT(report_error)(const char *func, const char *file, int line, cufftResult status) { char *errormsg; switch (status) { case CUFFT_SUCCESS: errormsg = "success"; /* It'd be weird to get here. */ break; case CUFFT_INVALID_PLAN: errormsg = "invalid plan"; break; case CUFFT_ALLOC_FAILED: errormsg = "alloc failed"; break; case CUFFT_INVALID_TYPE: errormsg = "invalid type"; break; case CUFFT_INVALID_VALUE: errormsg = "invalid value"; break; case CUFFT_INTERNAL_ERROR: errormsg = "internal error"; break; case CUFFT_EXEC_FAILED: errormsg = "exec failed"; break; case CUFFT_SETUP_FAILED: errormsg = "setup failed"; break; case CUFFT_INVALID_SIZE: errormsg = "invalid size"; break; case CUFFT_UNALIGNED_DATA: errormsg = "unaligned data"; break; default: errormsg = "unknown error"; break; } fprintf(stderr, "oops in %s (%s:%d)... %d: %s\n", func, file, line, status, errormsg); STARPU_ABORT(); } #endif /* !STARPU_USE_CUDA */ starpu-1.2.3+dfsg/starpufft/src/starpufftx1d.c000066400000000000000000000625631320135501600213660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * * Dumb parallel version * */ #define DIV_1D 64 /* * Overall strategy for an fft of size n: * - perform n1 ffts of size n2 * - twiddle * - perform n2 ffts of size n1 * * - n1 defaults to DIV_1D, thus n2 defaults to n / DIV_1D. * * Precise tasks: * * - twist1: twist the whole n-element input (called "in") into n1 chunks of * size n2, by using n1 tasks taking the whole n-element input as a * R parameter and one n2 output as a W parameter. The result is * called twisted1. * - fft1: perform n1 (n2) ffts, by using n1 tasks doing one fft each. Also * twiddle the result to prepare for the fft2. The result is called * fft1. * - join: depends on all the fft1s, to gather the n1 results of size n2 in * the fft1 vector. * - twist2: twist the fft1 vector into n2 chunks of size n1, called twisted2. * since n2 is typically very large, this step is divided in DIV_1D * tasks, each of them performing n2/DIV_1D of them * - fft2: perform n2 ffts of size n1. This is divided in DIV_1D tasks of * n2/DIV_1D ffts, to be performed in batches. The result is called * fft2. * - twist3: twist back the result of the fft2s above into the output buffer. * Only implemented on CPUs for simplicity of the gathering. * * The tag space thus uses 3 dimensions: * - the number of the plan. * - the step (TWIST1, FFT1, JOIN, TWIST2, FFT2, TWIST3, END) * - an index i between 0 and DIV_1D-1. */ #define STEP_TAG_1D(plan, step, i) _STEP_TAG(plan, step, i) #ifdef __STARPU_USE_CUDA /* twist1: * * Twist the full input vector (first parameter) into one chunk of size n2 * (second parameter) */ static void STARPUFFT(twist1_1d_kernel_gpu)(void *descr[], void *_args) { struct STARPUFFT(args) *args = _args; STARPUFFT(plan) plan = args->plan; int i = args->i; int n1 = plan->n1[0]; int n2 = plan->n2[0]; _cufftComplex * restrict in = (_cufftComplex *)STARPU_VECTOR_GET_PTR(descr[0]); _cufftComplex * restrict twisted1 = (_cufftComplex *)STARPU_VECTOR_GET_PTR(descr[1]); STARPUFFT(cuda_twist1_1d_host)(in, twisted1, i, n1, n2); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } /* fft1: * * Perform one fft of size n2 */ static void STARPUFFT(fft1_1d_plan_gpu)(void *args) { STARPUFFT(plan) plan = args; int n2 = plan->n2[0]; int workerid = starpu_worker_get_id_check(); cufftResult cures; cures = cufftPlan1d(&plan->plans[workerid].plan1_cuda, n2, _CUFFT_C2C, 1); if (cures != CUFFT_SUCCESS) STARPU_CUFFT_REPORT_ERROR(cures); cufftSetStream(plan->plans[workerid].plan1_cuda, starpu_cuda_get_local_stream()); if (cures != CUFFT_SUCCESS) STARPU_CUFFT_REPORT_ERROR(cures); } static void STARPUFFT(fft1_1d_kernel_gpu)(void *descr[], void *_args) { struct STARPUFFT(args) *args = _args; STARPUFFT(plan) plan = args->plan; int i = args->i; int n2 = plan->n2[0]; cufftResult cures; _cufftComplex * restrict in = (_cufftComplex *)STARPU_VECTOR_GET_PTR(descr[0]); _cufftComplex * restrict out = (_cufftComplex *)STARPU_VECTOR_GET_PTR(descr[1]); const _cufftComplex * restrict roots = (_cufftComplex *)STARPU_VECTOR_GET_PTR(descr[2]); int workerid = starpu_worker_get_id_check(); task_per_worker[workerid]++; cures = _cufftExecC2C(plan->plans[workerid].plan1_cuda, in, out, plan->sign == -1 ? CUFFT_FORWARD : CUFFT_INVERSE); if (cures != CUFFT_SUCCESS) STARPU_CUFFT_REPORT_ERROR(cures); STARPUFFT(cuda_twiddle_1d_host)(out, roots, n2, i); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } /* fft2: * * Perform n3 = n2/DIV_1D ffts of size n1 */ static void STARPUFFT(fft2_1d_plan_gpu)(void *args) { STARPUFFT(plan) plan = args; int n1 = plan->n1[0]; int n2 = plan->n2[0]; int n3 = n2/DIV_1D; cufftResult cures; int workerid = starpu_worker_get_id_check(); cures = cufftPlan1d(&plan->plans[workerid].plan2_cuda, n1, _CUFFT_C2C, n3); if (cures != CUFFT_SUCCESS) STARPU_CUFFT_REPORT_ERROR(cures); cufftSetStream(plan->plans[workerid].plan2_cuda, starpu_cuda_get_local_stream()); if (cures != CUFFT_SUCCESS) STARPU_CUFFT_REPORT_ERROR(cures); } static void STARPUFFT(fft2_1d_kernel_gpu)(void *descr[], void *_args) { struct STARPUFFT(args) *args = _args; STARPUFFT(plan) plan = args->plan; cufftResult cures; _cufftComplex * restrict in = (_cufftComplex *)STARPU_VECTOR_GET_PTR(descr[0]); _cufftComplex * restrict out = (_cufftComplex *)STARPU_VECTOR_GET_PTR(descr[1]); int workerid = starpu_worker_get_id_check(); task_per_worker[workerid]++; /* NOTE using batch support */ cures = _cufftExecC2C(plan->plans[workerid].plan2_cuda, in, out, plan->sign == -1 ? CUFFT_FORWARD : CUFFT_INVERSE); if (cures != CUFFT_SUCCESS) STARPU_CUFFT_REPORT_ERROR(cures); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } #endif /* twist1: * * Twist the full input vector (first parameter) into one chunk of size n2 * (second parameter) */ static void STARPUFFT(twist1_1d_kernel_cpu)(void *descr[], void *_args) { struct STARPUFFT(args) *args = _args; STARPUFFT(plan) plan = args->plan; int i = args->i; int j; int n1 = plan->n1[0]; int n2 = plan->n2[0]; STARPUFFT(complex) * restrict in = (STARPUFFT(complex) *)STARPU_VECTOR_GET_PTR(descr[0]); STARPUFFT(complex) * restrict twisted1 = (STARPUFFT(complex) *)STARPU_VECTOR_GET_PTR(descr[1]); /* printf("twist1 %d %g\n", i, (double) cabs(plan->in[i])); */ for (j = 0; j < n2; j++) twisted1[j] = in[i+j*n1]; } #ifdef STARPU_HAVE_FFTW /* fft1: * * Perform one fft of size n2 */ static void STARPUFFT(fft1_1d_kernel_cpu)(void *descr[], void *_args) { struct STARPUFFT(args) *args = _args; STARPUFFT(plan) plan = args->plan; int i = args->i; int j; int n2 = plan->n2[0]; int workerid = starpu_worker_get_id_check(); task_per_worker[workerid]++; STARPUFFT(complex) * restrict twisted1 = (STARPUFFT(complex) *)STARPU_VECTOR_GET_PTR(descr[0]); STARPUFFT(complex) * restrict fft1 = (STARPUFFT(complex) *)STARPU_VECTOR_GET_PTR(descr[1]); /* printf("fft1 %d %g\n", i, (double) cabs(twisted1[0])); */ _FFTW(execute_dft)(plan->plans[workerid].plan1_cpu, twisted1, fft1); /* twiddle fft1 buffer */ for (j = 0; j < n2; j++) fft1[j] = fft1[j] * plan->roots[0][i*j]; } #endif /* twist2: * * Twist the full vector (results of the fft1s) into one package of n2/DIV_1D * chunks of size n1 */ static void STARPUFFT(twist2_1d_kernel_cpu)(void *descr[], void *_args) { struct STARPUFFT(args) *args = _args; STARPUFFT(plan) plan = args->plan; int jj = args->jj; /* between 0 and DIV_1D */ int jjj; /* beetween 0 and n3 */ int i; int n1 = plan->n1[0]; int n2 = plan->n2[0]; int n3 = n2/DIV_1D; STARPUFFT(complex) * restrict twisted2 = (STARPUFFT(complex) *)STARPU_VECTOR_GET_PTR(descr[0]); /* printf("twist2 %d %g\n", jj, (double) cabs(plan->fft1[jj])); */ for (jjj = 0; jjj < n3; jjj++) { int j = jj * n3 + jjj; for (i = 0; i < n1; i++) twisted2[jjj*n1+i] = plan->fft1[i*n2+j]; } } #ifdef STARPU_HAVE_FFTW /* fft2: * * Perform n3 = n2/DIV_1D ffts of size n1 */ static void STARPUFFT(fft2_1d_kernel_cpu)(void *descr[], void *_args) { struct STARPUFFT(args) *args = _args; STARPUFFT(plan) plan = args->plan; /* int jj = args->jj; */ int workerid = starpu_worker_get_id_check(); task_per_worker[workerid]++; STARPUFFT(complex) * restrict twisted2 = (STARPUFFT(complex) *)STARPU_VECTOR_GET_PTR(descr[0]); STARPUFFT(complex) * restrict fft2 = (STARPUFFT(complex) *)STARPU_VECTOR_GET_PTR(descr[1]); /* printf("fft2 %d %g\n", jj, (double) cabs(twisted2[plan->totsize4-1])); */ _FFTW(execute_dft)(plan->plans[workerid].plan2_cpu, twisted2, fft2); } #endif /* twist3: * * Spread the package of n2/DIV_1D chunks of size n1 into the output vector */ static void STARPUFFT(twist3_1d_kernel_cpu)(void *descr[], void *_args) { struct STARPUFFT(args) *args = _args; STARPUFFT(plan) plan = args->plan; int jj = args->jj; /* between 0 and DIV_1D */ int jjj; /* beetween 0 and n3 */ int i; int n1 = plan->n1[0]; int n2 = plan->n2[0]; int n3 = n2/DIV_1D; const STARPUFFT(complex) * restrict fft2 = (STARPUFFT(complex) *)STARPU_VECTOR_GET_PTR(descr[0]); /* printf("twist3 %d %g\n", jj, (double) cabs(fft2[0])); */ for (jjj = 0; jjj < n3; jjj++) { int j = jj * n3 + jjj; for (i = 0; i < n1; i++) plan->out[i*n2+j] = fft2[jjj*n1+i]; } } /* Performance models for the 5 kinds of tasks */ static struct starpu_perfmodel STARPUFFT(twist1_1d_model) = { .type = STARPU_HISTORY_BASED, .symbol = TYPE"twist1_1d" }; static struct starpu_perfmodel STARPUFFT(fft1_1d_model) = { .type = STARPU_HISTORY_BASED, .symbol = TYPE"fft1_1d" }; static struct starpu_perfmodel STARPUFFT(twist2_1d_model) = { .type = STARPU_HISTORY_BASED, .symbol = TYPE"twist2_1d" }; static struct starpu_perfmodel STARPUFFT(fft2_1d_model) = { .type = STARPU_HISTORY_BASED, .symbol = TYPE"fft2_1d" }; static struct starpu_perfmodel STARPUFFT(twist3_1d_model) = { .type = STARPU_HISTORY_BASED, .symbol = TYPE"twist3_1d" }; /* codelet pointers for the 5 kinds of tasks */ static struct starpu_codelet STARPUFFT(twist1_1d_codelet) = { .where = #ifdef __STARPU_USE_CUDA STARPU_CUDA| #endif STARPU_CPU, #ifdef __STARPU_USE_CUDA .cuda_funcs = {STARPUFFT(twist1_1d_kernel_gpu)}, #endif .cpu_funcs = {STARPUFFT(twist1_1d_kernel_cpu)}, CAN_EXECUTE .model = &STARPUFFT(twist1_1d_model), .nbuffers = 2, .modes = {STARPU_R, STARPU_W}, .name = "twist1_1d_codelet" }; static struct starpu_codelet STARPUFFT(fft1_1d_codelet) = { .where = #ifdef __STARPU_USE_CUDA STARPU_CUDA| #endif #ifdef STARPU_HAVE_FFTW STARPU_CPU| #endif 0, #ifdef __STARPU_USE_CUDA .cuda_funcs = {STARPUFFT(fft1_1d_kernel_gpu)}, #endif #ifdef STARPU_HAVE_FFTW .cpu_funcs = {STARPUFFT(fft1_1d_kernel_cpu)}, #endif CAN_EXECUTE .model = &STARPUFFT(fft1_1d_model), .nbuffers = 3, .modes = {STARPU_R, STARPU_W, STARPU_R}, .name = "fft1_1d_codelet" }; static struct starpu_codelet STARPUFFT(twist2_1d_codelet) = { .where = STARPU_CPU, .cpu_funcs = {STARPUFFT(twist2_1d_kernel_cpu)}, CAN_EXECUTE .model = &STARPUFFT(twist2_1d_model), .nbuffers = 1, .modes = {STARPU_W}, .name = "twist2_1d_codelet" }; static struct starpu_codelet STARPUFFT(fft2_1d_codelet) = { .where = #ifdef __STARPU_USE_CUDA STARPU_CUDA| #endif #ifdef STARPU_HAVE_FFTW STARPU_CPU| #endif 0, #ifdef __STARPU_USE_CUDA .cuda_funcs = {STARPUFFT(fft2_1d_kernel_gpu)}, #endif #ifdef STARPU_HAVE_FFTW .cpu_funcs = {STARPUFFT(fft2_1d_kernel_cpu)}, #endif CAN_EXECUTE .model = &STARPUFFT(fft2_1d_model), .nbuffers = 2, .modes = {STARPU_R, STARPU_W}, .name = "fft2_1d_codelet" }; static struct starpu_codelet STARPUFFT(twist3_1d_codelet) = { .where = STARPU_CPU, .cpu_funcs = {STARPUFFT(twist3_1d_kernel_cpu)}, CAN_EXECUTE .model = &STARPUFFT(twist3_1d_model), .nbuffers = 1, .modes = {STARPU_R}, .name = "twist3_1d_codelet" }; /* * * Sequential version * */ #ifdef __STARPU_USE_CUDA /* Perform one fft of size n */ static void STARPUFFT(fft_1d_plan_gpu)(void *args) { STARPUFFT(plan) plan = args; cufftResult cures; int n = plan->n[0]; int workerid = starpu_worker_get_id_check(); cures = cufftPlan1d(&plan->plans[workerid].plan_cuda, n, _CUFFT_C2C, 1); if (cures != CUFFT_SUCCESS) STARPU_CUFFT_REPORT_ERROR(cures); cufftSetStream(plan->plans[workerid].plan_cuda, starpu_cuda_get_local_stream()); if (cures != CUFFT_SUCCESS) STARPU_CUFFT_REPORT_ERROR(cures); } static void STARPUFFT(fft_1d_kernel_gpu)(void *descr[], void *args) { STARPUFFT(plan) plan = args; cufftResult cures; _cufftComplex * restrict in = (_cufftComplex *)STARPU_VECTOR_GET_PTR(descr[0]); _cufftComplex * restrict out = (_cufftComplex *)STARPU_VECTOR_GET_PTR(descr[1]); int workerid = starpu_worker_get_id_check(); task_per_worker[workerid]++; cures = _cufftExecC2C(plan->plans[workerid].plan_cuda, in, out, plan->sign == -1 ? CUFFT_FORWARD : CUFFT_INVERSE); if (cures != CUFFT_SUCCESS) STARPU_CUFFT_REPORT_ERROR(cures); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } #endif #ifdef STARPU_HAVE_FFTW /* Perform one fft of size n */ static void STARPUFFT(fft_1d_kernel_cpu)(void *descr[], void *_args) { STARPUFFT(plan) plan = _args; int workerid = starpu_worker_get_id_check(); task_per_worker[workerid]++; STARPUFFT(complex) * restrict in = (STARPUFFT(complex) *)STARPU_VECTOR_GET_PTR(descr[0]); STARPUFFT(complex) * restrict out = (STARPUFFT(complex) *)STARPU_VECTOR_GET_PTR(descr[1]); _FFTW(execute_dft)(plan->plans[workerid].plan_cpu, in, out); } #endif static struct starpu_perfmodel STARPUFFT(fft_1d_model) = { .type = STARPU_HISTORY_BASED, .symbol = TYPE"fft_1d" }; static struct starpu_codelet STARPUFFT(fft_1d_codelet) = { .where = #ifdef __STARPU_USE_CUDA STARPU_CUDA| #endif #ifdef STARPU_HAVE_FFTW STARPU_CPU| #endif 0, #ifdef __STARPU_USE_CUDA .cuda_funcs = {STARPUFFT(fft_1d_kernel_gpu)}, #endif #ifdef STARPU_HAVE_FFTW .cpu_funcs = {STARPUFFT(fft_1d_kernel_cpu)}, #endif CAN_EXECUTE .model = &STARPUFFT(fft_1d_model), .nbuffers = 2, .modes = {STARPU_R, STARPU_W}, .name = "fft_1d_codelet" }; /* Planning: * * - For each CPU worker, we need to plan the two fftw stages. * - For GPU workers, we need to do the planning in the CUDA context, so we do * this lazily through the initialised1 and initialised2 flags ; TODO: use * starpu_execute_on_each_worker instead (done in the omp branch). * - We allocate all the temporary buffers and register them to starpu. * - We create all the tasks, but do not submit them yet. It will be possible * to reuse them at will to perform several ffts with the same planning. */ STARPUFFT(plan) STARPUFFT(plan_dft_1d)(int n, int sign, unsigned flags) { unsigned workerid; int n1 = DIV_1D; int n2 = n / n1; int n3; int z; struct starpu_task *task; if (PARALLEL) { #ifdef __STARPU_USE_CUDA /* cufft 1D limited to 8M elements */ while (n2 > 8 << 20) { n1 *= 2; n2 /= 2; } #endif STARPU_ASSERT(n == n1*n2); STARPU_ASSERT(n1 < (1ULL << I_BITS)); /* distribute the n2 second ffts into DIV_1D packages */ n3 = n2 / DIV_1D; STARPU_ASSERT(n2 == n3*DIV_1D); } /* TODO: flags? Automatically set FFTW_MEASURE on calibration? */ STARPU_ASSERT(flags == 0); STARPUFFT(plan) plan = malloc(sizeof(*plan)); memset(plan, 0, sizeof(*plan)); if (PARALLEL) { plan->number = STARPU_ATOMIC_ADD(&starpufft_last_plan_number, 1) - 1; /* The plan number has a limited size */ STARPU_ASSERT(plan->number < (1ULL << NUMBER_BITS)); } /* Just one dimension */ plan->dim = 1; plan->n = malloc(plan->dim * sizeof(*plan->n)); plan->n[0] = n; if (PARALLEL) { check_dims(plan); plan->n1 = malloc(plan->dim * sizeof(*plan->n1)); plan->n1[0] = n1; plan->n2 = malloc(plan->dim * sizeof(*plan->n2)); plan->n2[0] = n2; } /* Note: this is for coherency with the 2D case */ plan->totsize = n; if (PARALLEL) { plan->totsize1 = n1; plan->totsize2 = n2; plan->totsize3 = DIV_1D; plan->totsize4 = plan->totsize / plan->totsize3; } plan->type = C2C; plan->sign = sign; if (PARALLEL) { /* Compute the w^k just once. */ compute_roots(plan); } /* Initialize per-worker working set */ for (workerid = 0; workerid < starpu_worker_get_count(); workerid++) { switch (starpu_worker_get_type(workerid)) { case STARPU_CPU_WORKER: #ifdef STARPU_HAVE_FFTW if (PARALLEL) { /* first fft plan: one fft of size n2. * FFTW imposes that buffer pointers are known at * planning time. */ plan->plans[workerid].plan1_cpu = _FFTW(plan_dft_1d)(n2, NULL, (void*) 1, sign, _FFTW_FLAGS); STARPU_ASSERT(plan->plans[workerid].plan1_cpu); /* second fft plan: n3 ffts of size n1 */ plan->plans[workerid].plan2_cpu = _FFTW(plan_many_dft)(plan->dim, plan->n1, n3, NULL, NULL, 1, plan->totsize1, (void*) 1, NULL, 1, plan->totsize1, sign, _FFTW_FLAGS); STARPU_ASSERT(plan->plans[workerid].plan2_cpu); } else { /* fft plan: one fft of size n. */ plan->plans[workerid].plan_cpu = _FFTW(plan_dft_1d)(n, NULL, (void*) 1, sign, _FFTW_FLAGS); STARPU_ASSERT(plan->plans[workerid].plan_cpu); } #else /* #warning libstarpufft can not work correctly if libfftw3 is not installed */ #endif break; case STARPU_CUDA_WORKER: break; default: /* Do not care, we won't be executing anything there. */ break; } } #ifdef __STARPU_USE_CUDA if (PARALLEL) { starpu_execute_on_each_worker(STARPUFFT(fft1_1d_plan_gpu), plan, STARPU_CUDA); starpu_execute_on_each_worker(STARPUFFT(fft2_1d_plan_gpu), plan, STARPU_CUDA); } else { starpu_execute_on_each_worker(STARPUFFT(fft_1d_plan_gpu), plan, STARPU_CUDA); } #endif if (PARALLEL) { /* Allocate buffers. */ plan->twisted1 = STARPUFFT(malloc)(plan->totsize * sizeof(*plan->twisted1)); memset(plan->twisted1, 0, plan->totsize * sizeof(*plan->twisted1)); plan->fft1 = STARPUFFT(malloc)(plan->totsize * sizeof(*plan->fft1)); memset(plan->fft1, 0, plan->totsize * sizeof(*plan->fft1)); plan->twisted2 = STARPUFFT(malloc)(plan->totsize * sizeof(*plan->twisted2)); memset(plan->twisted2, 0, plan->totsize * sizeof(*plan->twisted2)); plan->fft2 = STARPUFFT(malloc)(plan->totsize * sizeof(*plan->fft2)); memset(plan->fft2, 0, plan->totsize * sizeof(*plan->fft2)); /* Allocate handle arrays */ plan->twisted1_handle = malloc(plan->totsize1 * sizeof(*plan->twisted1_handle)); plan->fft1_handle = malloc(plan->totsize1 * sizeof(*plan->fft1_handle)); plan->twisted2_handle = malloc(plan->totsize3 * sizeof(*plan->twisted2_handle)); plan->fft2_handle = malloc(plan->totsize3 * sizeof(*plan->fft2_handle)); /* Allocate task arrays */ plan->twist1_tasks = malloc(plan->totsize1 * sizeof(*plan->twist1_tasks)); plan->fft1_tasks = malloc(plan->totsize1 * sizeof(*plan->fft1_tasks)); plan->twist2_tasks = malloc(plan->totsize3 * sizeof(*plan->twist2_tasks)); plan->fft2_tasks = malloc(plan->totsize3 * sizeof(*plan->fft2_tasks)); plan->twist3_tasks = malloc(plan->totsize3 * sizeof(*plan->twist3_tasks)); /* Allocate codelet argument arrays */ plan->fft1_args = malloc(plan->totsize1 * sizeof(*plan->fft1_args)); plan->fft2_args = malloc(plan->totsize3 * sizeof(*plan->fft2_args)); /* Create first-round tasks: DIV_1D tasks of type twist1 and fft1 */ for (z = 0; z < plan->totsize1; z++) { int i = z; #define STEP_TAG(step) STEP_TAG_1D(plan, step, i) /* TODO: get rid of tags */ plan->fft1_args[z].plan = plan; plan->fft1_args[z].i = i; /* Register the twisted1 buffer of size n2. */ starpu_vector_data_register(&plan->twisted1_handle[z], STARPU_MAIN_RAM, (uintptr_t) &plan->twisted1[z*plan->totsize2], plan->totsize2, sizeof(*plan->twisted1)); /* Register the fft1 buffer of size n2. */ starpu_vector_data_register(&plan->fft1_handle[z], STARPU_MAIN_RAM, (uintptr_t) &plan->fft1[z*plan->totsize2], plan->totsize2, sizeof(*plan->fft1)); /* We'll need the result of fft1 on the CPU for the second * twist anyway, so tell starpu to not keep the fft1 buffer in * the GPU. */ starpu_data_set_wt_mask(plan->fft1_handle[z], 1<<0); /* Create twist1 task */ plan->twist1_tasks[z] = task = starpu_task_create(); task->cl = &STARPUFFT(twist1_1d_codelet); /* task->handles[0] = to be filled at execution to point to the application input. */ task->handles[1] = plan->twisted1_handle[z]; task->cl_arg = &plan->fft1_args[z]; task->tag_id = STEP_TAG(TWIST1); task->use_tag = 1; task->destroy = 0; /* Tell that fft1 depends on twisted1 */ starpu_tag_declare_deps(STEP_TAG(FFT1), 1, STEP_TAG(TWIST1)); /* Create FFT1 task */ plan->fft1_tasks[z] = task = starpu_task_create(); task->cl = &STARPUFFT(fft1_1d_codelet); task->handles[0] = plan->twisted1_handle[z]; task->handles[1] = plan->fft1_handle[z]; task->handles[2] = plan->roots_handle[0]; task->cl_arg = &plan->fft1_args[z]; task->tag_id = STEP_TAG(FFT1); task->use_tag = 1; task->destroy = 0; /* Tell that the join task will depend on the fft1 task. */ starpu_tag_declare_deps(STEP_TAG_1D(plan, JOIN, 0), 1, STEP_TAG(FFT1)); #undef STEP_TAG } /* Create the join task, only serving as a dependency point between * fft1 and twist2 tasks */ plan->join_task = task = starpu_task_create(); task->cl = NULL; task->tag_id = STEP_TAG_1D(plan, JOIN, 0); task->use_tag = 1; task->destroy = 0; /* Create second-round tasks: DIV_1D batches of n2/DIV_1D twist2, fft2, * and twist3 */ for (z = 0; z < plan->totsize3; z++) { int jj = z; #define STEP_TAG(step) STEP_TAG_1D(plan, step, jj) plan->fft2_args[z].plan = plan; plan->fft2_args[z].jj = jj; /* Register n3 twisted2 buffers of size n1 */ starpu_vector_data_register(&plan->twisted2_handle[z], STARPU_MAIN_RAM, (uintptr_t) &plan->twisted2[z*plan->totsize4], plan->totsize4, sizeof(*plan->twisted2)); starpu_vector_data_register(&plan->fft2_handle[z], STARPU_MAIN_RAM, (uintptr_t) &plan->fft2[z*plan->totsize4], plan->totsize4, sizeof(*plan->fft2)); /* We'll need the result of fft2 on the CPU for the third * twist anyway, so tell starpu to not keep the fft2 buffer in * the GPU. */ starpu_data_set_wt_mask(plan->fft2_handle[z], 1<<0); /* Tell that twisted2 depends on the join task */ starpu_tag_declare_deps(STEP_TAG(TWIST2), 1, STEP_TAG_1D(plan, JOIN, 0)); /* Create twist2 task */ plan->twist2_tasks[z] = task = starpu_task_create(); task->cl = &STARPUFFT(twist2_1d_codelet); task->handles[0] = plan->twisted2_handle[z]; task->cl_arg = &plan->fft2_args[z]; task->tag_id = STEP_TAG(TWIST2); task->use_tag = 1; task->destroy = 0; /* Tell that fft2 depends on twisted2 */ starpu_tag_declare_deps(STEP_TAG(FFT2), 1, STEP_TAG(TWIST2)); /* Create FFT2 task */ plan->fft2_tasks[z] = task = starpu_task_create(); task->cl = &STARPUFFT(fft2_1d_codelet); task->handles[0] = plan->twisted2_handle[z]; task->handles[1] = plan->fft2_handle[z]; task->cl_arg = &plan->fft2_args[z]; task->tag_id = STEP_TAG(FFT2); task->use_tag = 1; task->destroy = 0; /* Tell that twist3 depends on fft2 */ starpu_tag_declare_deps(STEP_TAG(TWIST3), 1, STEP_TAG(FFT2)); /* Create twist3 tasks */ /* These run only on CPUs and thus write directly into the * application output buffer. */ plan->twist3_tasks[z] = task = starpu_task_create(); task->cl = &STARPUFFT(twist3_1d_codelet); task->handles[0] = plan->fft2_handle[z]; task->cl_arg = &plan->fft2_args[z]; task->tag_id = STEP_TAG(TWIST3); task->use_tag = 1; task->destroy = 0; /* Tell that to be completely finished we need to have finished * this twisted3 */ starpu_tag_declare_deps(STEP_TAG_1D(plan, END, 0), 1, STEP_TAG(TWIST3)); #undef STEP_TAG } /* Create end task, only serving as a join point. */ plan->end_task = task = starpu_task_create(); task->cl = NULL; task->tag_id = STEP_TAG_1D(plan, END, 0); task->use_tag = 1; task->destroy = 0; task->detach = 0; } return plan; } /* Actually submit all the tasks. */ static struct starpu_task * STARPUFFT(start1dC2C)(STARPUFFT(plan) plan, starpu_data_handle_t in, starpu_data_handle_t out) { STARPU_ASSERT(plan->type == C2C); int z; int ret; if (PARALLEL) { for (z=0; z < plan->totsize1; z++) { ret = starpu_task_submit(plan->twist1_tasks[z]); if (ret == -ENODEV) return NULL; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(plan->fft1_tasks[z]); if (ret == -ENODEV) return NULL; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_submit(plan->join_task); if (ret == -ENODEV) return NULL; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); for (z=0; z < plan->totsize3; z++) { ret = starpu_task_submit(plan->twist2_tasks[z]); if (ret == -ENODEV) return NULL; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(plan->fft2_tasks[z]); if (ret == -ENODEV) return NULL; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(plan->twist3_tasks[z]); if (ret == -ENODEV) return NULL; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_submit(plan->end_task); if (ret == -ENODEV) return NULL; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); return plan->end_task; } else /* !PARALLEL */ { struct starpu_task *task; /* Create FFT task */ task = starpu_task_create(); task->detach = 0; task->cl = &STARPUFFT(fft_1d_codelet); task->handles[0] = in; task->handles[1] = out; task->cl_arg = plan; ret = starpu_task_submit(task); if (ret == -ENODEV) return NULL; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); return task; } } /* Free all the tags. The generic code handles freeing the buffers. */ static void STARPUFFT(free_1d_tags)(STARPUFFT(plan) plan) { int i; int n1 = plan->n1[0]; if (!PARALLEL) return; for (i = 0; i < n1; i++) { starpu_tag_remove(STEP_TAG_1D(plan, TWIST1, i)); starpu_tag_remove(STEP_TAG_1D(plan, FFT1, i)); } starpu_tag_remove(STEP_TAG_1D(plan, JOIN, 0)); for (i = 0; i < DIV_1D; i++) { starpu_tag_remove(STEP_TAG_1D(plan, TWIST2, i)); starpu_tag_remove(STEP_TAG_1D(plan, FFT2, i)); starpu_tag_remove(STEP_TAG_1D(plan, TWIST3, i)); } starpu_tag_remove(STEP_TAG_1D(plan, END, 0)); } starpu-1.2.3+dfsg/starpufft/src/starpufftx2d.c000066400000000000000000000614401320135501600213600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * ; Copyright (C) 2009-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #define DIV_2D_N 8 #define DIV_2D_M 8 #define I_SHIFT (I_BITS/2) #define J_BITS I_SHIFT #define STEP_TAG_2D(plan, step, i, j) _STEP_TAG(plan, step, ((starpu_tag_t) i << I_SHIFT) | (starpu_tag_t) j) #ifdef __STARPU_USE_CUDA /* Twist the full vector into a n2,m2 chunk */ static void STARPUFFT(twist1_2d_kernel_gpu)(void *descr[], void *_args) { struct STARPUFFT(args) *args = _args; STARPUFFT(plan) plan = args->plan; int i = args->i; int j = args->j; int n1 = plan->n1[0]; int n2 = plan->n2[0]; int m1 = plan->n1[1]; int m2 = plan->n2[1]; _cufftComplex * restrict in = (_cufftComplex *)STARPU_VECTOR_GET_PTR(descr[0]); _cufftComplex * restrict twisted1 = (_cufftComplex *)STARPU_VECTOR_GET_PTR(descr[1]); STARPUFFT(cuda_twist1_2d_host)(in, twisted1, i, j, n1, n2, m1, m2); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } /* fft1: * * Perform one fft of size n2,m2 */ static void STARPUFFT(fft1_2d_plan_gpu)(void *args) { STARPUFFT(plan) plan = args; int n2 = plan->n2[0]; int m2 = plan->n2[1]; int workerid = starpu_worker_get_id_check(); cufftResult cures; cures = cufftPlan2d(&plan->plans[workerid].plan1_cuda, n2, m2, _CUFFT_C2C); if (cures != CUFFT_SUCCESS) STARPU_CUFFT_REPORT_ERROR(cures); cufftSetStream(plan->plans[workerid].plan1_cuda, starpu_cuda_get_local_stream()); if (cures != CUFFT_SUCCESS) STARPU_CUFFT_REPORT_ERROR(cures); } static void STARPUFFT(fft1_2d_kernel_gpu)(void *descr[], void *_args) { struct STARPUFFT(args) *args = _args; STARPUFFT(plan) plan = args->plan; int i = args->i; int j = args->j; int n2 = plan->n2[0]; int m2 = plan->n2[1]; cufftResult cures; _cufftComplex * restrict in = (_cufftComplex *)STARPU_VECTOR_GET_PTR(descr[0]); _cufftComplex * restrict out = (_cufftComplex *)STARPU_VECTOR_GET_PTR(descr[1]); const _cufftComplex * restrict roots0 = (_cufftComplex *)STARPU_VECTOR_GET_PTR(descr[2]); const _cufftComplex * restrict roots1 = (_cufftComplex *)STARPU_VECTOR_GET_PTR(descr[3]); int workerid = starpu_worker_get_id_check(); task_per_worker[workerid]++; cures = _cufftExecC2C(plan->plans[workerid].plan1_cuda, in, out, plan->sign == -1 ? CUFFT_FORWARD : CUFFT_INVERSE); if (cures != CUFFT_SUCCESS) STARPU_CUFFT_REPORT_ERROR(cures); /* synchronization is done after the twiddling */ STARPUFFT(cuda_twiddle_2d_host)(out, roots0, roots1, n2, m2, i, j); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } /* fft2: * * Perform n3*m3 ffts of size n1,m1 */ static void STARPUFFT(fft2_2d_plan_gpu(void *args)) { STARPUFFT(plan) plan = args; int n1 = plan->n1[0]; int m1 = plan->n1[1]; cufftResult cures; int workerid = starpu_worker_get_id_check(); cures = cufftPlan2d(&plan->plans[workerid].plan2_cuda, n1, m1, _CUFFT_C2C); if (cures != CUFFT_SUCCESS) STARPU_CUFFT_REPORT_ERROR(cures); cufftSetStream(plan->plans[workerid].plan2_cuda, starpu_cuda_get_local_stream()); if (cures != CUFFT_SUCCESS) STARPU_CUFFT_REPORT_ERROR(cures); } static void STARPUFFT(fft2_2d_kernel_gpu)(void *descr[], void *_args) { struct STARPUFFT(args) *args = _args; STARPUFFT(plan) plan = args->plan; int n1 = plan->n1[0]; int n2 = plan->n2[0]; int m1 = plan->n1[1]; int m2 = plan->n2[1]; int n3 = n2/DIV_2D_N; int m3 = m2/DIV_2D_M; int n; cufftResult cures; _cufftComplex * restrict in = (_cufftComplex *)STARPU_VECTOR_GET_PTR(descr[0]); _cufftComplex * restrict out = (_cufftComplex *)STARPU_VECTOR_GET_PTR(descr[1]); int workerid = starpu_worker_get_id_check(); task_per_worker[workerid]++; for (n = 0; n < n3*m3; n++) { cures = _cufftExecC2C(plan->plans[workerid].plan2_cuda, in + n * n1*m1, out + n * n1*m1, plan->sign == -1 ? CUFFT_FORWARD : CUFFT_INVERSE); if (cures != CUFFT_SUCCESS) STARPU_CUFFT_REPORT_ERROR(cures); } cudaStreamSynchronize(starpu_cuda_get_local_stream()); } #endif /* Twist the full vector into a n2,m2 chunk */ static void STARPUFFT(twist1_2d_kernel_cpu)(void *descr[], void *_args) { struct STARPUFFT(args) *args = _args; STARPUFFT(plan) plan = args->plan; int i = args->i; int j = args->j; int k, l; int n1 = plan->n1[0]; int n2 = plan->n2[0]; int m1 = plan->n1[1]; int m2 = plan->n2[1]; int m = plan->n[1]; STARPUFFT(complex) * restrict in = (STARPUFFT(complex) *)STARPU_VECTOR_GET_PTR(descr[0]); STARPUFFT(complex) * restrict twisted1 = (STARPUFFT(complex) *)STARPU_VECTOR_GET_PTR(descr[1]); /* printf("twist1 %d %d %g\n", i, j, (double) cabs(plan->in[i+j])); */ for (k = 0; k < n2; k++) for (l = 0; l < m2; l++) twisted1[k*m2+l] = in[i*m+j+k*m*n1+l*m1]; } #ifdef STARPU_HAVE_FFTW /* Perform an n2,m2 fft */ static void STARPUFFT(fft1_2d_kernel_cpu)(void *descr[], void *_args) { struct STARPUFFT(args) *args = _args; STARPUFFT(plan) plan = args->plan; int i = args->i; int j = args->j; int k, l; int n2 = plan->n2[0]; int m2 = plan->n2[1]; int workerid = starpu_worker_get_id_check(); task_per_worker[workerid]++; STARPUFFT(complex) *twisted1 = (STARPUFFT(complex) *)STARPU_VECTOR_GET_PTR(descr[0]); STARPUFFT(complex) *fft1 = (STARPUFFT(complex) *)STARPU_VECTOR_GET_PTR(descr[1]); /* printf("fft1 %d %d %g\n", i, j, (double) cabs(twisted1[0])); */ _FFTW(execute_dft)(plan->plans[workerid].plan1_cpu, twisted1, fft1); for (k = 0; k < n2; k++) for (l = 0; l < m2; l++) fft1[k*m2 + l] = fft1[k*m2 + l] * plan->roots[0][i*k] * plan->roots[1][j*l]; } #endif /* Twist the full vector into a package of n2/DIV_2D_N,m2/DIV_2D_M (n1,m1) chunks */ static void STARPUFFT(twist2_2d_kernel_cpu)(void *descr[], void *_args) { struct STARPUFFT(args) *args = _args; STARPUFFT(plan) plan = args->plan; int kk = args->kk; /* between 0 and DIV_2D_N */ int ll = args->ll; /* between 0 and DIV_2D_M */ int kkk, lll; /* beetween 0,0 and n3,m3 */ int i, j; int n1 = plan->n1[0]; int n2 = plan->n2[0]; int m1 = plan->n1[1]; int m2 = plan->n2[1]; int n3 = n2/DIV_2D_N; int m3 = m2/DIV_2D_M; STARPUFFT(complex) * restrict twisted2 = (STARPUFFT(complex) *)STARPU_VECTOR_GET_PTR(descr[0]); /* printf("twist2 %d %d %g\n", kk, ll, (double) cabs(plan->fft1[kk+ll])); */ for (kkk = 0; kkk < n3; kkk++) { int k = kk * n3 + kkk; for (lll = 0; lll < m3; lll++) { int l = ll * m3 + lll; for (i = 0; i < n1; i++) for (j = 0; j < m1; j++) twisted2[kkk*m3*n1*m1+lll*n1*m1+i*m1+j] = plan->fft1[i*n1*n2*m2+j*n2*m2+k*m2+l]; } } } #ifdef STARPU_HAVE_FFTW /* Perform (n2/DIV_2D_N)*(m2/DIV_2D_M) (n1,m1) ffts */ static void STARPUFFT(fft2_2d_kernel_cpu)(void *descr[], void *_args) { struct STARPUFFT(args) *args = _args; STARPUFFT(plan) plan = args->plan; /* int kk = args->kk; */ /* int ll = args->ll; */ int workerid = starpu_worker_get_id_check(); task_per_worker[workerid]++; STARPUFFT(complex) *twisted2 = (STARPUFFT(complex) *)STARPU_VECTOR_GET_PTR(descr[0]); STARPUFFT(complex) *fft2 = (STARPUFFT(complex) *)STARPU_VECTOR_GET_PTR(descr[1]); /* printf("fft2 %d %d %g\n", kk, ll, (double) cabs(twisted2[plan->totsize4-1])); */ _FFTW(execute_dft)(plan->plans[workerid].plan2_cpu, twisted2, fft2); } #endif /* Spread the package of (n2/DIV_2D_N)*(m2/DIV_2D_M) (n1,m1) chunks into the full vector */ static void STARPUFFT(twist3_2d_kernel_cpu)(void *descr[], void *_args) { struct STARPUFFT(args) *args = _args; STARPUFFT(plan) plan = args->plan; int kk = args->kk; /* between 0 and DIV_2D_N */ int ll = args->ll; /* between 0 and DIV_2D_M */ int kkk, lll; /* beetween 0,0 and n3,m3 */ int i, j; int n1 = plan->n1[0]; int n2 = plan->n2[0]; int m1 = plan->n1[1]; int m2 = plan->n2[1]; int n3 = n2/DIV_2D_N; int m3 = m2/DIV_2D_M; int m = plan->n[1]; const STARPUFFT(complex) * restrict fft2 = (STARPUFFT(complex) *)STARPU_VECTOR_GET_PTR(descr[0]); /* printf("twist3 %d %d %g\n", kk, ll, (double) cabs(fft2[0])); */ for (kkk = 0; kkk < n3; kkk++) { int k = kk * n3 + kkk; for (lll = 0; lll < m3; lll++) { int l = ll * m3 + lll; for (i = 0; i < n1; i++) for (j = 0; j < m1; j++) plan->out[i*n2*m+j*m2+k*m+l] = fft2[kkk*m3*n1*m1+lll*n1*m1+i*m1+j]; } } } struct starpu_perfmodel STARPUFFT(twist1_2d_model) = { .type = STARPU_HISTORY_BASED, .symbol = TYPE"twist1_2d" }; struct starpu_perfmodel STARPUFFT(fft1_2d_model) = { .type = STARPU_HISTORY_BASED, .symbol = TYPE"fft1_2d" }; struct starpu_perfmodel STARPUFFT(twist2_2d_model) = { .type = STARPU_HISTORY_BASED, .symbol = TYPE"twist2_2d" }; struct starpu_perfmodel STARPUFFT(fft2_2d_model) = { .type = STARPU_HISTORY_BASED, .symbol = TYPE"fft2_2d" }; struct starpu_perfmodel STARPUFFT(twist3_2d_model) = { .type = STARPU_HISTORY_BASED, .symbol = TYPE"twist3_2d" }; static struct starpu_codelet STARPUFFT(twist1_2d_codelet) = { .where = #ifdef __STARPU_USE_CUDA STARPU_CUDA| #endif STARPU_CPU, #ifdef __STARPU_USE_CUDA .cuda_funcs = {STARPUFFT(twist1_2d_kernel_gpu)}, #endif .cpu_funcs = {STARPUFFT(twist1_2d_kernel_cpu)}, CAN_EXECUTE .model = &STARPUFFT(twist1_2d_model), .nbuffers = 2, .modes = {STARPU_R, STARPU_W}, .name = "twist1_2d_codelet" }; static struct starpu_codelet STARPUFFT(fft1_2d_codelet) = { .where = #ifdef __STARPU_USE_CUDA STARPU_CUDA| #endif #ifdef STARPU_HAVE_FFTW STARPU_CPU| #endif 0, #ifdef __STARPU_USE_CUDA .cuda_funcs = {STARPUFFT(fft1_2d_kernel_gpu)}, #endif #ifdef STARPU_HAVE_FFTW .cpu_funcs = {STARPUFFT(fft1_2d_kernel_cpu)}, #endif CAN_EXECUTE .model = &STARPUFFT(fft1_2d_model), .nbuffers = 4, .modes = {STARPU_R, STARPU_W, STARPU_R, STARPU_R}, .name = "fft1_2d_codelet" }; static struct starpu_codelet STARPUFFT(twist2_2d_codelet) = { .where = STARPU_CPU, .cpu_funcs = {STARPUFFT(twist2_2d_kernel_cpu)}, CAN_EXECUTE .model = &STARPUFFT(twist2_2d_model), .nbuffers = 1, .modes = {STARPU_W}, .name = "twist2_2d_codelet" }; static struct starpu_codelet STARPUFFT(fft2_2d_codelet) = { .where = #ifdef __STARPU_USE_CUDA STARPU_CUDA| #endif #ifdef STARPU_HAVE_FFTW STARPU_CPU| #endif 0, #ifdef __STARPU_USE_CUDA .cuda_funcs = {STARPUFFT(fft2_2d_kernel_gpu)}, #endif #ifdef STARPU_HAVE_FFTW .cpu_funcs = {STARPUFFT(fft2_2d_kernel_cpu)}, #endif CAN_EXECUTE .model = &STARPUFFT(fft2_2d_model), .nbuffers = 2, .modes = {STARPU_R, STARPU_W}, .name = "fft2_2d_codelet" }; static struct starpu_codelet STARPUFFT(twist3_2d_codelet) = { .where = STARPU_CPU, .cpu_funcs = {STARPUFFT(twist3_2d_kernel_cpu)}, CAN_EXECUTE .model = &STARPUFFT(twist3_2d_model), .nbuffers = 1, .modes = {STARPU_R}, .name = "twist3_2d_codelet" }; /* * * Sequential version * */ #ifdef __STARPU_USE_CUDA /* Perform one fft of size n,m */ static void STARPUFFT(fft_2d_plan_gpu)(void *args) { STARPUFFT(plan) plan = args; cufftResult cures; int n = plan->n[0]; int m = plan->n[1]; int workerid = starpu_worker_get_id_check(); cures = cufftPlan2d(&plan->plans[workerid].plan_cuda, n, m, _CUFFT_C2C); if (cures != CUFFT_SUCCESS) STARPU_CUFFT_REPORT_ERROR(cures); cufftSetStream(plan->plans[workerid].plan_cuda, starpu_cuda_get_local_stream()); if (cures != CUFFT_SUCCESS) STARPU_CUFFT_REPORT_ERROR(cures); } static void STARPUFFT(fft_2d_kernel_gpu)(void *descr[], void *args) { STARPUFFT(plan) plan = args; cufftResult cures; _cufftComplex * restrict in = (_cufftComplex *)STARPU_VECTOR_GET_PTR(descr[0]); _cufftComplex * restrict out = (_cufftComplex *)STARPU_VECTOR_GET_PTR(descr[1]); int workerid = starpu_worker_get_id_check(); task_per_worker[workerid]++; cures = _cufftExecC2C(plan->plans[workerid].plan_cuda, in, out, plan->sign == -1 ? CUFFT_FORWARD : CUFFT_INVERSE); if (cures != CUFFT_SUCCESS) STARPU_CUFFT_REPORT_ERROR(cures); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } #endif #ifdef STARPU_HAVE_FFTW /* Perform one fft of size n,m */ static void STARPUFFT(fft_2d_kernel_cpu)(void *descr[], void *_args) { STARPUFFT(plan) plan = _args; int workerid = starpu_worker_get_id_check(); task_per_worker[workerid]++; STARPUFFT(complex) * restrict in = (STARPUFFT(complex) *)STARPU_VECTOR_GET_PTR(descr[0]); STARPUFFT(complex) * restrict out = (STARPUFFT(complex) *)STARPU_VECTOR_GET_PTR(descr[1]); _FFTW(execute_dft)(plan->plans[workerid].plan_cpu, in, out); } #endif static struct starpu_perfmodel STARPUFFT(fft_2d_model) = { .type = STARPU_HISTORY_BASED, .symbol = TYPE"fft_2d" }; static struct starpu_codelet STARPUFFT(fft_2d_codelet) = { .where = #ifdef __STARPU_USE_CUDA STARPU_CUDA| #endif #ifdef STARPU_HAVE_FFTW STARPU_CPU| #endif 0, #ifdef __STARPU_USE_CUDA .cuda_funcs = {STARPUFFT(fft_2d_kernel_gpu)}, #endif #ifdef STARPU_HAVE_FFTW .cpu_funcs = {STARPUFFT(fft_2d_kernel_cpu)}, #endif CAN_EXECUTE .model = &STARPUFFT(fft_2d_model), .nbuffers = 2, .modes = {STARPU_R, STARPU_W}, .name = "fft_2d_codelet" }; STARPUFFT(plan) STARPUFFT(plan_dft_2d)(int n, int m, int sign, unsigned flags) { unsigned workerid; int n1 = DIV_2D_N; int n2 = n / n1; int n3; int m1 = DIV_2D_M; int m2 = m / m1; int m3; int z; struct starpu_task *task; if (PARALLEL) { /* * Simple strategy: * * - twist1: twist input in n1*m1 (n2,m2) chunks * - fft1: perform n1*m1 (n2,m2) ffts * - twist2: twist into n2*m2 (n1,m1) chunks distributed in * DIV_2D_N*DIV_2D_M groups * - fft2: perform DIV_2D_N*DIV_2D_M times n3*m3 (n1,m1) ffts * - twist3: twist back into output */ #ifdef __STARPU_USE_CUDA /* cufft 2D-3D limited to [2,16384] */ while (n2 > 16384) { n1 *= 2; n2 /= 2; } #endif STARPU_ASSERT(n == n1*n2); STARPU_ASSERT(n1 < (1ULL << J_BITS)); #ifdef __STARPU_USE_CUDA /* cufft 2D-3D limited to [2,16384] */ while (m2 > 16384) { m1 *= 2; m2 /= 2; } #endif STARPU_ASSERT(m == m1*m2); STARPU_ASSERT(m1 < (1ULL << J_BITS)); /* distribute the n2*m2 second ffts into DIV_2D_N*DIV_2D_M packages */ n3 = n2 / DIV_2D_N; STARPU_ASSERT(n2 == n3*DIV_2D_N); m3 = m2 / DIV_2D_M; STARPU_ASSERT(m2 == m3*DIV_2D_M); } /* TODO: flags? Automatically set FFTW_MEASURE on calibration? */ STARPU_ASSERT(flags == 0); STARPUFFT(plan) plan = malloc(sizeof(*plan)); memset(plan, 0, sizeof(*plan)); if (PARALLEL) { plan->number = STARPU_ATOMIC_ADD(&starpufft_last_plan_number, 1) - 1; /* 4bit limitation in the tag space */ STARPU_ASSERT(plan->number < (1ULL << NUMBER_BITS)); } plan->dim = 2; plan->n = malloc(plan->dim * sizeof(*plan->n)); plan->n[0] = n; plan->n[1] = m; if (PARALLEL) { check_dims(plan); plan->n1 = malloc(plan->dim * sizeof(*plan->n1)); plan->n1[0] = n1; plan->n1[1] = m1; plan->n2 = malloc(plan->dim * sizeof(*plan->n2)); plan->n2[0] = n2; plan->n2[1] = m2; } plan->totsize = n * m; if (PARALLEL) { plan->totsize1 = n1 * m1; plan->totsize2 = n2 * m2; plan->totsize3 = DIV_2D_N * DIV_2D_M; plan->totsize4 = plan->totsize / plan->totsize3; } plan->type = C2C; plan->sign = sign; if (PARALLEL) { /* Compute the w^k just once. */ compute_roots(plan); } /* Initialize per-worker working set */ for (workerid = 0; workerid < starpu_worker_get_count(); workerid++) { switch (starpu_worker_get_type(workerid)) { case STARPU_CPU_WORKER: #ifdef STARPU_HAVE_FFTW if (PARALLEL) { /* first fft plan: one n2*m2 fft */ plan->plans[workerid].plan1_cpu = _FFTW(plan_dft_2d)(n2, m2, NULL, (void*) 1, sign, _FFTW_FLAGS); STARPU_ASSERT(plan->plans[workerid].plan1_cpu); /* second fft plan: n3*m3 n1*m1 ffts */ plan->plans[workerid].plan2_cpu = _FFTW(plan_many_dft)(plan->dim, plan->n1, n3*m3, NULL, NULL, 1, plan->totsize1, (void*) 1, NULL, 1, plan->totsize1, sign, _FFTW_FLAGS); STARPU_ASSERT(plan->plans[workerid].plan2_cpu); } else { /* fft plan: one fft of size n, m. */ plan->plans[workerid].plan_cpu = _FFTW(plan_dft_2d)(n, m, NULL, (void*) 1, sign, _FFTW_FLAGS); STARPU_ASSERT(plan->plans[workerid].plan_cpu); } #else /* #warning libstarpufft can not work correctly if libfftw3 is not installed */ #endif break; case STARPU_CUDA_WORKER: break; default: /* Do not care, we won't be executing anything there. */ break; } } #ifdef __STARPU_USE_CUDA if (PARALLEL) { starpu_execute_on_each_worker(STARPUFFT(fft1_2d_plan_gpu), plan, STARPU_CUDA); starpu_execute_on_each_worker(STARPUFFT(fft2_2d_plan_gpu), plan, STARPU_CUDA); } else { starpu_execute_on_each_worker(STARPUFFT(fft_2d_plan_gpu), plan, STARPU_CUDA); } #endif if (PARALLEL) { /* Allocate buffers. */ plan->twisted1 = STARPUFFT(malloc)(plan->totsize * sizeof(*plan->twisted1)); memset(plan->twisted1, 0, plan->totsize * sizeof(*plan->twisted1)); plan->fft1 = STARPUFFT(malloc)(plan->totsize * sizeof(*plan->fft1)); memset(plan->fft1, 0, plan->totsize * sizeof(*plan->fft1)); plan->twisted2 = STARPUFFT(malloc)(plan->totsize * sizeof(*plan->twisted2)); memset(plan->twisted2, 0, plan->totsize * sizeof(*plan->twisted2)); plan->fft2 = STARPUFFT(malloc)(plan->totsize * sizeof(*plan->fft2)); memset(plan->fft2, 0, plan->totsize * sizeof(*plan->fft2)); /* Allocate handle arrays */ plan->twisted1_handle = malloc(plan->totsize1 * sizeof(*plan->twisted1_handle)); plan->fft1_handle = malloc(plan->totsize1 * sizeof(*plan->fft1_handle)); plan->twisted2_handle = malloc(plan->totsize3 * sizeof(*plan->twisted2_handle)); plan->fft2_handle = malloc(plan->totsize3 * sizeof(*plan->fft2_handle)); /* Allocate task arrays */ plan->twist1_tasks = malloc(plan->totsize1 * sizeof(*plan->twist1_tasks)); plan->fft1_tasks = malloc(plan->totsize1 * sizeof(*plan->fft1_tasks)); plan->twist2_tasks = malloc(plan->totsize3 * sizeof(*plan->twist2_tasks)); plan->fft2_tasks = malloc(plan->totsize3 * sizeof(*plan->fft2_tasks)); plan->twist3_tasks = malloc(plan->totsize3 * sizeof(*plan->twist3_tasks)); /* Allocate codelet argument arrays */ plan->fft1_args = malloc(plan->totsize1 * sizeof(*plan->fft1_args)); plan->fft2_args = malloc(plan->totsize3 * sizeof(*plan->fft2_args)); /* Create first-round tasks */ for (z = 0; z < plan->totsize1; z++) { int i = z / m1, j = z % m1; #define STEP_TAG(step) STEP_TAG_2D(plan, step, i, j) /* TODO: get rid of tags */ plan->fft1_args[z].plan = plan; plan->fft1_args[z].i = i; plan->fft1_args[z].j = j; /* Register (n2,m2) chunks */ starpu_vector_data_register(&plan->twisted1_handle[z], STARPU_MAIN_RAM, (uintptr_t) &plan->twisted1[z*plan->totsize2], plan->totsize2, sizeof(*plan->twisted1)); starpu_vector_data_register(&plan->fft1_handle[z], STARPU_MAIN_RAM, (uintptr_t) &plan->fft1[z*plan->totsize2], plan->totsize2, sizeof(*plan->fft1)); /* We'll need it on the CPU for the second twist anyway */ starpu_data_set_wt_mask(plan->fft1_handle[z], 1<<0); /* Create twist1 task */ plan->twist1_tasks[z] = task = starpu_task_create(); task->cl = &STARPUFFT(twist1_2d_codelet); /* task->handles[0] = to be filled at execution */ task->handles[1] = plan->twisted1_handle[z]; task->cl_arg = &plan->fft1_args[z]; task->tag_id = STEP_TAG(TWIST1); task->use_tag = 1; task->destroy = 0; /* Tell that fft1 depends on twisted1 */ starpu_tag_declare_deps(STEP_TAG(FFT1), 1, STEP_TAG(TWIST1)); /* Create FFT1 task */ plan->fft1_tasks[z] = task = starpu_task_create(); task->cl = &STARPUFFT(fft1_2d_codelet); task->handles[0] = plan->twisted1_handle[z]; task->handles[1] = plan->fft1_handle[z]; task->handles[2] = plan->roots_handle[0]; task->handles[3] = plan->roots_handle[1]; task->cl_arg = &plan->fft1_args[z]; task->tag_id = STEP_TAG(FFT1); task->use_tag = 1; task->destroy = 0; /* Tell that to be done with first step we need to have * finished this fft1 */ starpu_tag_declare_deps(STEP_TAG_2D(plan, JOIN, 0, 0), 1, STEP_TAG(FFT1)); #undef STEP_TAG } /* Create join task */ plan->join_task = task = starpu_task_create(); task->cl = NULL; task->tag_id = STEP_TAG_2D(plan, JOIN, 0, 0); task->use_tag = 1; task->destroy = 0; /* Create second-round tasks */ for (z = 0; z < plan->totsize3; z++) { int kk = z / DIV_2D_M, ll = z % DIV_2D_M; #define STEP_TAG(step) STEP_TAG_2D(plan, step, kk, ll) plan->fft2_args[z].plan = plan; plan->fft2_args[z].kk = kk; plan->fft2_args[z].ll = ll; /* Register n3*m3 (n1,m1) chunks */ starpu_vector_data_register(&plan->twisted2_handle[z], STARPU_MAIN_RAM, (uintptr_t) &plan->twisted2[z*plan->totsize4], plan->totsize4, sizeof(*plan->twisted2)); starpu_vector_data_register(&plan->fft2_handle[z], STARPU_MAIN_RAM, (uintptr_t) &plan->fft2[z*plan->totsize4], plan->totsize4, sizeof(*plan->fft2)); /* We'll need it on the CPU for the last twist anyway */ starpu_data_set_wt_mask(plan->fft2_handle[z], 1<<0); /* Tell that twisted2 depends on the whole first step to be * done */ starpu_tag_declare_deps(STEP_TAG(TWIST2), 1, STEP_TAG_2D(plan, JOIN, 0, 0)); /* Create twist2 task */ plan->twist2_tasks[z] = task = starpu_task_create(); task->cl = &STARPUFFT(twist2_2d_codelet); task->handles[0] = plan->twisted2_handle[z]; task->cl_arg = &plan->fft2_args[z]; task->tag_id = STEP_TAG(TWIST2); task->use_tag = 1; task->destroy = 0; /* Tell that fft2 depends on twisted2 */ starpu_tag_declare_deps(STEP_TAG(FFT2), 1, STEP_TAG(TWIST2)); /* Create FFT2 task */ plan->fft2_tasks[z] = task = starpu_task_create(); task->cl = &STARPUFFT(fft2_2d_codelet); task->handles[0] = plan->twisted2_handle[z]; task->handles[1] = plan->fft2_handle[z]; task->cl_arg = &plan->fft2_args[z]; task->tag_id = STEP_TAG(FFT2); task->use_tag = 1; task->destroy = 0; /* Tell that twist3 depends on fft2 */ starpu_tag_declare_deps(STEP_TAG(TWIST3), 1, STEP_TAG(FFT2)); /* Create twist3 tasks */ /* These run only on CPUs and thus write directly into the * application output buffer. */ plan->twist3_tasks[z] = task = starpu_task_create(); task->cl = &STARPUFFT(twist3_2d_codelet); task->handles[0] = plan->fft2_handle[z]; task->cl_arg = &plan->fft2_args[z]; task->tag_id = STEP_TAG(TWIST3); task->use_tag = 1; task->destroy = 0; /* Tell that to be completely finished we need to have finished this twisted3 */ starpu_tag_declare_deps(STEP_TAG_2D(plan, END, 0, 0), 1, STEP_TAG(TWIST3)); #undef STEP_TAG } /* Create end task */ plan->end_task = task = starpu_task_create(); task->cl = NULL; task->tag_id = STEP_TAG_2D(plan, END, 0, 0); task->use_tag = 1; task->destroy = 0; task->detach = 0; } return plan; } /* Actually submit all the tasks. */ static struct starpu_task * STARPUFFT(start2dC2C)(STARPUFFT(plan) plan, starpu_data_handle_t in, starpu_data_handle_t out) { STARPU_ASSERT(plan->type == C2C); int z; int ret; if (PARALLEL) { for (z=0; z < plan->totsize1; z++) { ret = starpu_task_submit(plan->twist1_tasks[z]); if (ret == -ENODEV) return NULL; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(plan->fft1_tasks[z]); if (ret == -ENODEV) return NULL; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_submit(plan->join_task); if (ret == -ENODEV) return NULL; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); for (z=0; z < plan->totsize3; z++) { ret = starpu_task_submit(plan->twist2_tasks[z]); if (ret == -ENODEV) return NULL; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(plan->fft2_tasks[z]); if (ret == -ENODEV) return NULL; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(plan->twist3_tasks[z]); if (ret == -ENODEV) return NULL; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_submit(plan->end_task); if (ret == -ENODEV) return NULL; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); return plan->end_task; } else /* !PARALLEL */ { struct starpu_task *task; /* Create FFT task */ task = starpu_task_create(); task->detach = 0; task->cl = &STARPUFFT(fft_2d_codelet); task->handles[0] = in; task->handles[1] = out; task->cl_arg = plan; ret = starpu_task_submit(task); if (ret == -ENODEV) return NULL; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); return task; } } /* Free all the tags. The generic code handles freeing the buffers. */ static void STARPUFFT(free_2d_tags)(STARPUFFT(plan) plan) { int i, j; int n1 = plan->n1[0]; int m1 = plan->n1[1]; if (!PARALLEL) return; for (i = 0; i < n1; i++) { for (j = 0; j < m1; j++) { starpu_tag_remove(STEP_TAG_2D(plan, TWIST1, i, j)); starpu_tag_remove(STEP_TAG_2D(plan, FFT1, i, j)); } } starpu_tag_remove(STEP_TAG_2D(plan, JOIN, 0, 0)); for (i = 0; i < DIV_2D_N; i++) { for (j = 0; j < DIV_2D_M; j++) { starpu_tag_remove(STEP_TAG_2D(plan, TWIST2, i, j)); starpu_tag_remove(STEP_TAG_2D(plan, FFT2, i, j)); starpu_tag_remove(STEP_TAG_2D(plan, TWIST3, i, j)); } } starpu_tag_remove(STEP_TAG_2D(plan, END, 0, 0)); } starpu-1.2.3+dfsg/starpufft/starpufft-1.0.pc.in000066400000000000000000000020761320135501600212340ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2012 Université de Bordeaux # Copyright (C) 2010, 2011 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: starpufft Description: offers support for heterogeneous multicore architecture Version: @PACKAGE_VERSION@ Cflags: -I${includedir}/starpu/@STARPU_EFFECTIVE_VERSION@ @STARPU_CUDA_CPPFLAGS@ Libs: -L${libdir} -lstarpufft-@STARPU_EFFECTIVE_VERSION@ Libs.private: @LDFLAGS@ @LIBS@ @STARPU_CUFFT_LDFLAGS@ @FFTW_LIBS@ @FFTWF_LIBS@ starpu-1.2.3+dfsg/starpufft/starpufft-1.1.pc.in000066400000000000000000000020761320135501600212350ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2012 Université de Bordeaux # Copyright (C) 2010, 2011 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: starpufft Description: offers support for heterogeneous multicore architecture Version: @PACKAGE_VERSION@ Cflags: -I${includedir}/starpu/@STARPU_EFFECTIVE_VERSION@ @STARPU_CUDA_CPPFLAGS@ Libs: -L${libdir} -lstarpufft-@STARPU_EFFECTIVE_VERSION@ Libs.private: @LDFLAGS@ @LIBS@ @STARPU_CUFFT_LDFLAGS@ @FFTW_LIBS@ @FFTWF_LIBS@ starpu-1.2.3+dfsg/starpufft/starpufft-1.2.pc.in000066400000000000000000000020761320135501600212360ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2012 Université de Bordeaux # Copyright (C) 2010, 2011 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: starpufft Description: offers support for heterogeneous multicore architecture Version: @PACKAGE_VERSION@ Cflags: -I${includedir}/starpu/@STARPU_EFFECTIVE_VERSION@ @STARPU_CUDA_CPPFLAGS@ Libs: -L${libdir} -lstarpufft-@STARPU_EFFECTIVE_VERSION@ Libs.private: @LDFLAGS@ @LIBS@ @STARPU_CUFFT_LDFLAGS@ @FFTW_LIBS@ @FFTWF_LIBS@ starpu-1.2.3+dfsg/starpufft/tests/000077500000000000000000000000001320135501600171265ustar00rootroot00000000000000starpu-1.2.3+dfsg/starpufft/tests/Makefile.am000066400000000000000000000057541320135501600211750ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2013, 2015-2016 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # include $(top_srcdir)/starpu.mk CLEANFILES = starpu_idle_microsec.log examplebindir = $(libdir)/starpu/examples/starpufft EXTRA_DIST = \ testx.c \ testx_threads.c \ testf_threads.c \ test_threads.c if STARPU_HAVE_WINDOWS check_PROGRAMS = $(STARPU_FFT_EXAMPLES) else check_PROGRAMS = $(LOADER) $(STARPU_FFT_EXAMPLES) endif if !STARPU_HAVE_WINDOWS ## test loader program LOADER = loader loader_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -I$(top_builddir)/src/ LOADER_BIN = $(abs_top_builddir)/starpufft/tests/$(LOADER) loader_SOURCES = ../../tests/loader.c if STARPU_HAVE_AM111 TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" LOG_COMPILER = $(LOADER_BIN) else TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(LOADER_BIN) endif endif AM_CFLAGS = -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(FXT_CFLAGS) $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) $(GLOBAL_AM_CFLAGS) -Wno-unused LIBS = $(top_builddir)/src/@LIBSTARPU_LINK@ @LIBS@ $(FXT_LIBS) $(MAGMA_LIBS) AM_CPPFLAGS = -I$(top_srcdir)/include/ -I$(top_builddir)/include -I$(top_srcdir)/starpufft/include -I$(top_srcdir)/starpufft/src AM_LDFLAGS = $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) $(FXT_LDFLAGS) $(STARPU_COI_LDFLAGS) $(STARPU_SCIF_LDFLAGS) examplebin_PROGRAMS = if BUILD_EXAMPLES examplebin_PROGRAMS += \ testf \ test endif STARPU_FFT_EXAMPLES = testf testf_LDADD = ../src/libstarpufft-@STARPU_EFFECTIVE_VERSION@.la $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la $(FFTWF_LIBS) # If we don't have CUDA, we assume that we have fftw available in double # precision anyway, we just want to make sure that if CUFFT is used, it also # supports double precision. if !STARPU_USE_CUDA STARPU_FFT_EXAMPLES += test else if STARPU_HAVE_CUFFTDOUBLECOMPLEX STARPU_FFT_EXAMPLES += test endif endif test_LDADD = ../src/libstarpufft-@STARPU_EFFECTIVE_VERSION@.la $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la $(FFTW_LIBS) TESTS = $(STARPU_FFT_EXAMPLES) #check_PROGRAMS += examples/test_threads examples/testf_threads #examples_test_threads_LDADD = libstarpufft-@STARPU_EFFECTIVE_VERSION@.la $(top_builddir)/src/libstarpu.la -lfftw3_threads #examples_testf_threads_LDADD = libstarpufft-@STARPU_EFFECTIVE_VERSION@.la $(top_builddir)/src/libstarpu.la -lfftw3f_threads starpu-1.2.3+dfsg/starpufft/tests/Makefile.in000066400000000000000000001342041320135501600211770ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2013, 2015-2016 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @STARPU_HAVE_WINDOWS_FALSE@check_PROGRAMS = $(am__EXEEXT_1) \ @STARPU_HAVE_WINDOWS_FALSE@ $(am__EXEEXT_4) @STARPU_HAVE_WINDOWS_TRUE@check_PROGRAMS = $(am__EXEEXT_4) examplebin_PROGRAMS = $(am__EXEEXT_5) @BUILD_EXAMPLES_TRUE@am__append_1 = \ @BUILD_EXAMPLES_TRUE@ testf \ @BUILD_EXAMPLES_TRUE@ test # If we don't have CUDA, we assume that we have fftw available in double # precision anyway, we just want to make sure that if CUFFT is used, it also # supports double precision. @STARPU_USE_CUDA_FALSE@am__append_2 = test @STARPU_HAVE_CUFFTDOUBLECOMPLEX_TRUE@@STARPU_USE_CUDA_TRUE@am__append_3 = test TESTS = $(am__EXEEXT_4) subdir = starpufft/tests ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @STARPU_HAVE_WINDOWS_FALSE@am__EXEEXT_1 = loader$(EXEEXT) @STARPU_USE_CUDA_FALSE@am__EXEEXT_2 = test$(EXEEXT) @STARPU_HAVE_CUFFTDOUBLECOMPLEX_TRUE@@STARPU_USE_CUDA_TRUE@am__EXEEXT_3 = test$(EXEEXT) am__EXEEXT_4 = testf$(EXEEXT) $(am__EXEEXT_2) $(am__EXEEXT_3) @BUILD_EXAMPLES_TRUE@am__EXEEXT_5 = testf$(EXEEXT) test$(EXEEXT) am__installdirs = "$(DESTDIR)$(examplebindir)" PROGRAMS = $(examplebin_PROGRAMS) am__loader_SOURCES_DIST = ../../tests/loader.c @STARPU_HAVE_WINDOWS_FALSE@am_loader_OBJECTS = \ @STARPU_HAVE_WINDOWS_FALSE@ loader-loader.$(OBJEXT) loader_OBJECTS = $(am_loader_OBJECTS) loader_LDADD = $(LDADD) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = test_SOURCES = test.c test_OBJECTS = test.$(OBJEXT) am__DEPENDENCIES_1 = test_DEPENDENCIES = ../src/libstarpufft-@STARPU_EFFECTIVE_VERSION@.la \ $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la \ $(am__DEPENDENCIES_1) testf_SOURCES = testf.c testf_OBJECTS = testf.$(OBJEXT) testf_DEPENDENCIES = \ ../src/libstarpufft-@STARPU_EFFECTIVE_VERSION@.la \ $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la \ $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/common -I$(top_builddir)/include -I$(top_builddir)/gcc-plugin/include/starpu-gcc -I$(top_builddir)/starpu-top depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(loader_SOURCES) test.c testf.c DIST_SOURCES = $(am__loader_SOURCES_DIST) test.c testf.c am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/build-aux/depcomp \ $(top_srcdir)/build-aux/test-driver $(top_srcdir)/starpu.mk DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = $(top_builddir)/src/@LIBSTARPU_LINK@ @LIBS@ $(FXT_LIBS) $(MAGMA_LIBS) LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POTI_CFLAGS = @POTI_CFLAGS@ POTI_LIBS = @POTI_LIBS@ PROG_DATE = @PROG_DATE@ PROG_STAT = @PROG_STAT@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_COI_CPPFLAGS = @STARPU_COI_CPPFLAGS@ STARPU_COI_LDFLAGS = @STARPU_COI_LDFLAGS@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LEVELDB_LDFLAGS = @STARPU_LEVELDB_LDFLAGS@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RCCE_CFLAGS = @STARPU_RCCE_CFLAGS@ STARPU_RCCE_CPPFLAGS = @STARPU_RCCE_CPPFLAGS@ STARPU_RCCE_LDFLAGS = @STARPU_RCCE_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SCIF_CPPFLAGS = @STARPU_SCIF_CPPFLAGS@ STARPU_SCIF_LDFLAGS = @STARPU_SCIF_LDFLAGS@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SC_HYPERVISOR_DEBUG = @STARPU_SC_HYPERVISOR_DEBUG@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ mpifort_path = @mpifort_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ smpirun_path = @smpirun_path@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ CLEANFILES = starpu_idle_microsec.log examplebindir = $(libdir)/starpu/examples/starpufft EXTRA_DIST = \ testx.c \ testx_threads.c \ testf_threads.c \ test_threads.c @STARPU_HAVE_WINDOWS_FALSE@LOADER = loader @STARPU_HAVE_WINDOWS_FALSE@loader_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -I$(top_builddir)/src/ @STARPU_HAVE_WINDOWS_FALSE@LOADER_BIN = $(abs_top_builddir)/starpufft/tests/$(LOADER) @STARPU_HAVE_WINDOWS_FALSE@loader_SOURCES = ../../tests/loader.c @STARPU_HAVE_AM111_FALSE@@STARPU_HAVE_WINDOWS_FALSE@TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(LOADER_BIN) @STARPU_HAVE_AM111_TRUE@@STARPU_HAVE_WINDOWS_FALSE@TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" @STARPU_HAVE_AM111_TRUE@@STARPU_HAVE_WINDOWS_FALSE@LOG_COMPILER = $(LOADER_BIN) AM_CFLAGS = -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(FXT_CFLAGS) $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) $(GLOBAL_AM_CFLAGS) -Wno-unused AM_CPPFLAGS = -I$(top_srcdir)/include/ -I$(top_builddir)/include -I$(top_srcdir)/starpufft/include -I$(top_srcdir)/starpufft/src AM_LDFLAGS = $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) $(FXT_LDFLAGS) $(STARPU_COI_LDFLAGS) $(STARPU_SCIF_LDFLAGS) STARPU_FFT_EXAMPLES = testf $(am__append_2) $(am__append_3) testf_LDADD = ../src/libstarpufft-@STARPU_EFFECTIVE_VERSION@.la $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la $(FFTWF_LIBS) test_LDADD = ../src/libstarpufft-@STARPU_EFFECTIVE_VERSION@.la $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la $(FFTW_LIBS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/starpu.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign starpufft/tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign starpufft/tests/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/starpu.mk $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-examplebinPROGRAMS: $(examplebin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(examplebin_PROGRAMS)'; test -n "$(examplebindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(examplebindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(examplebindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(examplebindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(examplebindir)$$dir" || exit $$?; \ } \ ; done uninstall-examplebinPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(examplebin_PROGRAMS)'; test -n "$(examplebindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(examplebindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(examplebindir)" && rm -f $$files clean-examplebinPROGRAMS: @list='$(examplebin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list loader$(EXEEXT): $(loader_OBJECTS) $(loader_DEPENDENCIES) $(EXTRA_loader_DEPENDENCIES) @rm -f loader$(EXEEXT) $(AM_V_CCLD)$(LINK) $(loader_OBJECTS) $(loader_LDADD) $(LIBS) test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) testf$(EXEEXT): $(testf_OBJECTS) $(testf_DEPENDENCIES) $(EXTRA_testf_DEPENDENCIES) @rm -f testf$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testf_OBJECTS) $(testf_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loader-loader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testf.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< loader-loader.o: ../../tests/loader.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT loader-loader.o -MD -MP -MF $(DEPDIR)/loader-loader.Tpo -c -o loader-loader.o `test -f '../../tests/loader.c' || echo '$(srcdir)/'`../../tests/loader.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/loader-loader.Tpo $(DEPDIR)/loader-loader.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../tests/loader.c' object='loader-loader.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o loader-loader.o `test -f '../../tests/loader.c' || echo '$(srcdir)/'`../../tests/loader.c loader-loader.obj: ../../tests/loader.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT loader-loader.obj -MD -MP -MF $(DEPDIR)/loader-loader.Tpo -c -o loader-loader.obj `if test -f '../../tests/loader.c'; then $(CYGPATH_W) '../../tests/loader.c'; else $(CYGPATH_W) '$(srcdir)/../../tests/loader.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/loader-loader.Tpo $(DEPDIR)/loader-loader.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../tests/loader.c' object='loader-loader.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o loader-loader.obj `if test -f '../../tests/loader.c'; then $(CYGPATH_W) '../../tests/loader.c'; else $(CYGPATH_W) '$(srcdir)/../../tests/loader.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? testf.log: testf$(EXEEXT) @p='testf$(EXEEXT)'; \ b='testf'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(examplebindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-examplebinPROGRAMS clean-generic \ clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-examplebinPROGRAMS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-examplebinPROGRAMS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-examplebinPROGRAMS clean-generic \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-examplebinPROGRAMS install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-examplebinPROGRAMS .PRECIOUS: Makefile showcheck: -cat $(TEST_LOGS) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q " runtime error: " $(TEST_LOGS) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET #check_PROGRAMS += examples/test_threads examples/testf_threads #examples_test_threads_LDADD = libstarpufft-@STARPU_EFFECTIVE_VERSION@.la $(top_builddir)/src/libstarpu.la -lfftw3_threads #examples_testf_threads_LDADD = libstarpufft-@STARPU_EFFECTIVE_VERSION@.la $(top_builddir)/src/libstarpu.la -lfftw3f_threads # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.2.3+dfsg/starpufft/tests/test.c000066400000000000000000000013401320135501600202470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2012 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "starpufft-double.h" #include "testx.c" starpu-1.2.3+dfsg/starpufft/tests/test_threads.c000066400000000000000000000013501320135501600217620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2012 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "starpufft-double.h" #include "testx_threads.c" starpu-1.2.3+dfsg/starpufft/tests/testf.c000066400000000000000000000013371320135501600204230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2012 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "starpufft-float.h" #include "testx.c" starpu-1.2.3+dfsg/starpufft/tests/testf_threads.c000066400000000000000000000013471320135501600221360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2012 Université de Bordeaux * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "starpufft-float.h" #include "testx_threads.c" starpu-1.2.3+dfsg/starpufft/tests/testx.c000066400000000000000000000162311320135501600204440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2012 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include "starpufft.h" #undef STARPU_USE_CUDA #ifdef STARPU_HAVE_FFTW #include #endif #ifdef STARPU_USE_CUDA #include #endif #define SIGN (-1) /* #define SIGN (1) */ #ifdef STARPU_HAVE_FFTW static void check_fftw(STARPUFFT(complex) *out, STARPUFFT(complex) *out_fftw, int size) { int i; double max = 0., tot = 0., norm = 0., normdiff = 0.; for (i = 0; i < size; i++) { double diff = cabs(out[i]-out_fftw[i]); double diff2 = diff * diff; double dsize = cabs(out_fftw[i]); double size2 = dsize * dsize; if (diff > max) max = diff; tot += diff; normdiff += diff2; norm += size2; } fprintf(stderr, "\nmaximum difference %g\n", max); fprintf(stderr, "average difference %g\n", tot / size); fprintf(stderr, "difference norm %g\n", sqrt(normdiff)); double relmaxdiff = max / sqrt(norm); fprintf(stderr, "relative maximum difference %g\n", relmaxdiff); double relavgdiff = (tot / size) / sqrt(norm); fprintf(stderr, "relative average difference %g\n", relavgdiff); if (!strcmp(TYPE, "f") && (relmaxdiff > 1e-7 || relavgdiff > 1e-7)) { fprintf(stderr, "Failure: Difference too big (TYPE f)\n"); exit(EXIT_FAILURE); } if (!strcmp(TYPE, "") && (relmaxdiff > 1e-16 || relavgdiff > 1e-16)) { fprintf(stderr, "Failure: Difference too big\n"); exit(EXIT_FAILURE); } } #endif #ifdef STARPU_USE_CUDA static void check_cuda(STARPUFFT(complex) *out, STARPUFFT(complex) *out_fftw, int size) { int i; double max = 0., tot = 0., norm = 0., normdiff = 0.; for (i = 0; i < size; i++) { double diff = cabs(out_cuda[i]-out_fftw[i]); double diff2 = diff * diff; double size = cabs(out_fftw[i]); double size2 = size * size; if (diff > max) max = diff; tot += diff; normdiff += diff2; norm += size2; } fprintf(stderr, "\nmaximum difference %g\n", max); fprintf(stderr, "average difference %g\n", tot / size); fprintf(stderr, "difference norm %g\n", sqrt(normdiff)); double relmaxdiff = max / sqrt(norm); fprintf(stderr, "relative maximum difference %g\n", relmaxdiff); double relavgdiff = (tot / size) / sqrt(norm); fprintf(stderr, "relative average difference %g\n", relavgdiff); if (!strcmp(TYPE, "f") && (relmaxdiff > 1e-8 || relavgdiff > 1e-8)) exit(EXIT_FAILURE); if (!strcmp(TYPE, "") && (relmaxdiff > 1e-16 || relavgdiff > 1e-16)) exit(EXIT_FAILURE); } #endif int main(int argc, char *argv[]) { int i, ret; int size; int n = 0, m = 0; STARPUFFT(plan) plan; starpu_data_handle_t in_handle, out_handle; #ifdef STARPU_HAVE_FFTW _FFTW(plan) fftw_plan; #endif #ifdef STARPU_USE_CUDA cufftHandle cuda_plan; cudaError_t cures; #endif #if defined(STARPU_HAVE_FFTW) || defined(STARPU_USE_CUDA) struct timeval begin, end; double timing; size_t bytes; #endif ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); if (argc == 1) { n = 42; /* 1D */ size = n; } else if (argc == 2) { n = atoi(argv[1]); /* 1D */ size = n; } else if (argc == 3) { n = atoi(argv[1]); m = atoi(argv[2]); /* 2D */ size = n * m; } else { assert(0); } #if defined(STARPU_HAVE_FFTW) || defined(STARPU_USE_CUDA) bytes = size * sizeof(STARPUFFT(complex)); #endif STARPUFFT(complex) *in = STARPUFFT(malloc)(size * sizeof(*in)); starpu_srand48(0); for (i = 0; i < size; i++) in[i] = starpu_drand48() + I * starpu_drand48(); STARPUFFT(complex) *out = STARPUFFT(malloc)(size * sizeof(*out)); #ifdef STARPU_HAVE_FFTW STARPUFFT(complex) *out_fftw = STARPUFFT(malloc)(size * sizeof(*out_fftw)); #endif #ifdef STARPU_USE_CUDA STARPUFFT(complex) *out_cuda = STARPUFFT(malloc)(size * sizeof(*out_cuda)); #endif if (argc <= 2) { plan = STARPUFFT(plan_dft_1d)(n, SIGN, 0); #ifdef STARPU_HAVE_FFTW fftw_plan = _FFTW(plan_dft_1d)(n, NULL, (void*) 1, SIGN, FFTW_ESTIMATE); #endif #ifdef STARPU_USE_CUDA if (cufftPlan1d(&cuda_plan, n, _CUFFT_C2C, 1) != CUFFT_SUCCESS) printf("erf\n"); #endif } else if (argc == 3) { plan = STARPUFFT(plan_dft_2d)(n, m, SIGN, 0); #ifdef STARPU_HAVE_FFTW fftw_plan = _FFTW(plan_dft_2d)(n, m, NULL, (void*) 1, SIGN, FFTW_ESTIMATE); #endif #ifdef STARPU_USE_CUDA STARPU_ASSERT(cufftPlan2d(&cuda_plan, n, m, _CUFFT_C2C) == CUFFT_SUCCESS); #endif } else { assert(0); } #ifdef STARPU_HAVE_FFTW gettimeofday(&begin, NULL); _FFTW(execute_dft)(fftw_plan, in, out_fftw); gettimeofday(&end, NULL); _FFTW(destroy_plan)(fftw_plan); timing = (double)((end.tv_sec - begin.tv_sec)*1000000 + (end.tv_usec - begin.tv_usec)); printf("FFTW took %2.2f ms (%2.2f MB/s)\n\n", timing/1000, bytes/timing); #endif #ifdef STARPU_USE_CUDA gettimeofday(&begin, NULL); if (cufftExecC2C(cuda_plan, (cufftComplex*) in, (cufftComplex*) out_cuda, CUFFT_FORWARD) != CUFFT_SUCCESS) printf("erf2\n"); if ((cures = cudaThreadSynchronize()) != cudaSuccess) STARPU_CUDA_REPORT_ERROR(cures); gettimeofday(&end, NULL); cufftDestroy(cuda_plan); timing = (double)((end.tv_sec - begin.tv_sec)*1000000 + (end.tv_usec - begin.tv_usec)); printf("CUDA took %2.2f ms (%2.2f MB/s)\n\n", timing/1000, bytes/timing); #endif ret = STARPUFFT(execute)(plan, in, out); if (ret == -1) return 77; STARPUFFT(showstats)(stdout); #ifdef STARPU_HAVE_FFTW check_fftw(out, out_fftw, size); #endif #ifdef STARPU_USE_CUDA check_cuda(out, out_cuda, size); #endif #if 1 starpu_vector_data_register(&in_handle, STARPU_MAIN_RAM, (uintptr_t) in, size, sizeof(*in)); starpu_vector_data_register(&out_handle, STARPU_MAIN_RAM, (uintptr_t) out, size, sizeof(*out)); ret = STARPUFFT(execute_handle)(plan, in_handle, out_handle); if (ret == -1) return 77; starpu_data_unregister(in_handle); starpu_data_unregister(out_handle); #ifdef STARPU_HAVE_FFTW check_fftw(out, out_fftw, size); #endif #ifdef STARPU_USE_CUDA check_cuda(out, out_cuda, size); #endif #endif STARPUFFT(showstats)(stdout); STARPUFFT(destroy_plan)(plan); printf("\n"); #if 0 for (i = 0; i < 16; i++) printf("(%f,%f) ", cimag(in[i]), creal(in[i])); printf("\n\n"); for (i = 0; i < 16; i++) printf("(%f,%f) ", cimag(out[i]), creal(out[i])); printf("\n\n"); #ifdef STARPU_HAVE_FFTW for (i = 0; i < 16; i++) printf("(%f,%f) ", cimag(out_fftw[i]), creal(out_fftw[i])); printf("\n\n"); #endif #endif STARPUFFT(free)(in); STARPUFFT(free)(out); #ifdef STARPU_HAVE_FFTW STARPUFFT(free)(out_fftw); #endif #ifdef STARPU_USE_CUDA free(out_cuda); #endif starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/starpufft/tests/testx_threads.c000066400000000000000000000046031320135501600221560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011 Université de Bordeaux * Copyright (C) 2010, 2011 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include "starpufft.h" #include #define SIGN (-1) /* #define SIGN (1) */ int main(int argc, char *argv[]) { int i; struct timeval begin, end; int size; size_t bytes; int n = 0, m = 0; _FFTW(plan) fftw_plan; double timing; char *num; int num_threads = 1; _FFTW(init_threads)(); num = getenv("NUM_THREADS"); if (num) num_threads = atoi(num); _FFTW(plan_with_nthreads)(num_threads); if (argc < 2 || argc > 3) { fprintf(stderr,"need one or two size of vector\n"); exit(EXIT_FAILURE); } if (argc == 2) { n = atoi(argv[1]); /* 1D */ size = n; } else if (argc == 3) { n = atoi(argv[1]); m = atoi(argv[2]); /* 2D */ size = n * m; } else { assert(0); } bytes = size * sizeof(_FFTW(complex)); _FFTW(complex) *in = _FFTW(malloc)(size * sizeof(*in)); starpu_srand48(0); for (i = 0; i < size; i++) in[i] = starpu_drand48() + I * starpu_drand48(); _FFTW(complex) *out_fftw = _FFTW(malloc)(size * sizeof(*out_fftw)); if (argc == 2) { fftw_plan = _FFTW(plan_dft_1d)(n, in, out_fftw, SIGN, FFTW_ESTIMATE); } else if (argc == 3) { fftw_plan = _FFTW(plan_dft_2d)(n, m, in, out_fftw, SIGN, FFTW_ESTIMATE); } else { assert(0); } gettimeofday(&begin, NULL); _FFTW(execute)(fftw_plan); gettimeofday(&end, NULL); _FFTW(destroy_plan)(fftw_plan); timing = (double)((end.tv_sec - begin.tv_sec)*1000000 + (end.tv_usec - begin.tv_usec)); printf("FFTW with %d threads took %2.2f ms (%2.2f MB/s)\n\n", num_threads, timing/1000, bytes/(timing*num_threads)); printf("\n"); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/000077500000000000000000000000001320135501600151105ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/Makefile.am000066400000000000000000000631631320135501600171550ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2017 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS # Copyright (C) 2010, 2011, 2012 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. include $(top_srcdir)/starpu.mk if STARPU_SIMGRID STARPU_PERF_MODEL_DIR=$(abs_top_srcdir)/tools/perfmodels/sampling STARPU_HOSTNAME=mirage MALLOC_PERTURB_=0 export STARPU_PERF_MODEL_DIR export STARPU_HOSTNAME export MALLOC_PERTURB_ endif AM_CFLAGS = $(HWLOC_CFLAGS) $(FXT_CFLAGS) -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(STARPU_COI_CPPFLAGS) $(STARPU_SCIF_CPPFLAGS) $(GLOBAL_AM_CFLAGS) -Wno-unused LIBS = $(top_builddir)/src/@LIBSTARPU_LINK@ $(HWLOC_LIBS) @LIBS@ $(FXT_LIBS) AM_CPPFLAGS = -I$(top_srcdir)/include/ -I$(top_builddir)/src -I$(top_srcdir)/src/ AM_LDFLAGS = @STARPU_EXPORT_DYNAMIC@ $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) $(STARPU_COI_LDFLAGS) $(STARPU_SCIF_LDFLAGS) $(FXT_LDFLAGS) EXTRA_DIST = \ helper.h \ datawizard/locality.sh \ overlap/overlap.sh \ datawizard/scal.h \ datawizard/mpi_like.h \ microbenchs/tasks_size_overhead.sh \ microbenchs/tasks_size_overhead.gp \ datawizard/scratch_opencl_kernel.cl \ datawizard/sync_and_notify_data_opencl_codelet.cl\ datawizard/opencl_codelet_unsigned_inc_kernel.cl \ coverage/coverage.sh \ datawizard/acquire_release_opencl_kernel.cl \ datawizard/interfaces/test_interfaces.h \ datawizard/interfaces/bcsr/bcsr_opencl_kernel.cl \ datawizard/interfaces/coo/coo_opencl_kernel.cl \ datawizard/interfaces/matrix/matrix_opencl_kernel.cl \ datawizard/interfaces/variable/variable_opencl_kernel.cl \ datawizard/interfaces/vector/test_vector_opencl_kernel.cl \ datawizard/interfaces/multiformat/multiformat_types.h \ datawizard/interfaces/multiformat/multiformat_opencl_kernel.cl \ datawizard/interfaces/multiformat/multiformat_conversion_codelets_kernel.cl \ datawizard/interfaces/multiformat/advanced/generic.h \ datawizard/interfaces/csr/csr_opencl_kernel.cl \ datawizard/interfaces/block/block_opencl_kernel.cl \ perfmodels/opencl_memset_kernel.cl \ $(MICROBENCHS:=.sh) \ microbenchs/microbench.sh CLEANFILES = \ *.gcno *.gcda *.linkinfo core starpu_idle_microsec.log *.mod BUILT_SOURCES = SUBDIRS = examplebindir = $(libdir)/starpu/examples if STARPU_USE_OPENCL nobase_STARPU_OPENCL_DATA_DATA = endif if STARPU_USE_CUDA # TODO define NVCCFLAGS NVCC ?= nvcc NVCCFLAGS += -I$(top_srcdir)/include/ -I$(top_srcdir)/src -I$(top_builddir)/src -I$(top_builddir)/src/common -I$(top_builddir)/include $(HWLOC_CFLAGS) $(SIMGRID_CFLAGS) .cu.cubin: $(MKDIR_P) `dirname $@` $(NVCC) -cubin $< -o $@ --compiler-options -fno-strict-aliasing $(NVCCFLAGS) .cu.o: $(MKDIR_P) `dirname $@` $(NVCC) $< -c -o $@ --compiler-options -fno-strict-aliasing $(NVCCFLAGS) -I${includedir} endif testbindir = $(libdir)/starpu/tests ##################################### # What to install and what to check # ##################################### if !STARPU_HAVE_WINDOWS ## test loader program if !STARPU_CROSS_COMPILING LOADER = loader LOADER_BIN = $(abs_top_builddir)/tests/$(LOADER) else LOADER = LOADER_BIN = $(top_builddir)/tests/loader-cross.sh endif if STARPU_HAVE_AM111 TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" LOG_COMPILER = $(LOADER_BIN) else TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(LOADER_BIN) endif endif TESTS = $(noinst_PROGRAMS) if STARPU_COVERAGE_ENABLED TESTS += coverage/coverage.sh endif XFAIL_TESTS = \ errorcheck/invalid_blocking_calls noinst_PROGRAMS = noinst_PROGRAMS += \ main/mkdtemp \ main/execute_schedule \ main/insert_task_pack \ main/insert_task_nullcodelet \ main/multithreaded_init \ main/empty_task \ main/empty_task_chain \ main/starpu_worker_exists \ main/codelet_null_callback \ datawizard/allocate \ datawizard/acquire_cb \ datawizard/user_interaction_implicit \ datawizard/interfaces/copy_interfaces \ datawizard/locality \ datawizard/simgrid-locality \ errorcheck/starpu_init_noworker \ errorcheck/invalid_tasks \ helper/cublas_init \ helper/cusparse_init \ helper/pinned_memory \ helper/execute_on_all \ microbenchs/display_structures_size \ microbenchs/local_pingpong \ overlap/overlap \ perfmodels/value_nan if !STARPU_SIMGRID noinst_PROGRAMS += \ main/deprecated_func \ main/driver_api/init_run_deinit \ main/driver_api/run_driver \ main/deploop \ main/execute_on_a_specific_worker \ main/insert_task \ main/insert_task_value \ main/insert_task_dyn_handles \ main/insert_task_array \ main/insert_task_many \ main/multithreaded \ main/starpu_task_bundle \ main/starpu_task_wait_for_all \ main/starpu_task_wait \ main/static_restartable \ main/static_restartable_using_initializer\ main/static_restartable_tag \ main/regenerate \ main/regenerate_pipeline \ main/restart \ main/wait_all_regenerable_tasks \ main/subgraph_repeat \ main/subgraph_repeat_tag \ main/subgraph_repeat_regenerate \ main/subgraph_repeat_regenerate_tag \ main/empty_task_sync_point \ main/empty_task_sync_point_tasks \ main/tag_wait_api \ main/task_wait_api \ main/declare_deps_in_callback \ main/declare_deps_after_submission \ main/declare_deps_after_submission_synchronous \ main/get_current_task \ main/starpu_init \ main/submit \ main/pause_resume \ main/pack \ main/get_children_tasks \ datawizard/acquire_cb_insert \ datawizard/acquire_release \ datawizard/acquire_release2 \ datawizard/acquire_try \ datawizard/cache \ datawizard/commute \ datawizard/commute2 \ datawizard/copy \ datawizard/data_implicit_deps \ datawizard/data_lookup \ datawizard/scratch \ datawizard/sync_and_notify_data \ datawizard/sync_and_notify_data_implicit\ datawizard/dsm_stress \ datawizard/double_parameter \ datawizard/write_only_tmp_buffer \ datawizard/data_invalidation \ datawizard/dining_philosophers \ datawizard/manual_reduction \ datawizard/readers_and_writers \ datawizard/unpartition \ datawizard/sync_with_data_with_mem \ datawizard/sync_with_data_with_mem_non_blocking\ datawizard/sync_with_data_with_mem_non_blocking_implicit\ datawizard/mpi_like \ datawizard/mpi_like_async \ datawizard/critical_section_with_void_interface\ datawizard/increment_init \ datawizard/increment_redux \ datawizard/increment_redux_v2 \ datawizard/increment_redux_lazy \ datawizard/handle_to_pointer \ datawizard/lazy_allocation \ datawizard/lazy_unregister \ datawizard/no_unregister \ datawizard/noreclaim \ datawizard/nowhere \ datawizard/interfaces/block/block_interface \ datawizard/interfaces/bcsr/bcsr_interface \ datawizard/interfaces/coo/coo_interface \ datawizard/interfaces/csr/csr_interface \ datawizard/interfaces/matrix/matrix_interface \ datawizard/interfaces/multiformat/multiformat_interface \ datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl \ datawizard/interfaces/multiformat/advanced/multiformat_data_release \ datawizard/interfaces/multiformat/advanced/multiformat_worker \ datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion \ datawizard/interfaces/multiformat/advanced/same_handle \ datawizard/interfaces/variable/variable_interface \ datawizard/interfaces/vector/test_vector_interface \ datawizard/interfaces/void/void_interface \ datawizard/in_place_partition \ datawizard/partition_dep \ datawizard/partition_lazy \ datawizard/gpu_register \ datawizard/gpu_ptr_register \ datawizard/variable_parameters \ datawizard/wt_host \ datawizard/wt_broadcast \ datawizard/readonly \ datawizard/specific_node \ datawizard/task_with_multiple_time_the_same_handle \ datawizard/test_arbiter \ datawizard/invalidate_pending_requests \ datawizard/temporary_partition \ datawizard/redux_acquire \ disk/disk_copy \ disk/disk_compute \ disk/disk_pack \ disk/mem_reclaim \ errorcheck/invalid_blocking_calls \ helper/starpu_data_cpy \ helper/starpu_create_sync_task \ microbenchs/async_tasks_overhead \ microbenchs/sync_tasks_overhead \ microbenchs/tasks_overhead \ microbenchs/tasks_size_overhead \ microbenchs/prefetch_data_on_node \ microbenchs/redundant_buffer \ microbenchs/matrix_as_vector \ openmp/init_exit_01 \ openmp/init_exit_02 \ openmp/environment \ openmp/api_01 \ openmp/parallel_01 \ openmp/parallel_02 \ openmp/parallel_03 \ openmp/parallel_barrier_01 \ openmp/parallel_master_01 \ openmp/parallel_master_inline_01 \ openmp/parallel_single_wait_01 \ openmp/parallel_single_nowait_01 \ openmp/parallel_single_inline_01 \ openmp/parallel_single_copyprivate_01 \ openmp/parallel_single_copyprivate_inline_01 \ openmp/parallel_critical_01 \ openmp/parallel_critical_inline_01 \ openmp/parallel_critical_named_01 \ openmp/parallel_critical_named_inline_01\ openmp/parallel_simple_lock_01 \ openmp/parallel_nested_lock_01 \ openmp/parallel_for_01 \ openmp/parallel_for_02 \ openmp/parallel_for_ordered_01 \ openmp/parallel_sections_01 \ openmp/parallel_sections_combined_01 \ openmp/task_01 \ openmp/task_02 \ openmp/taskwait_01 \ openmp/taskgroup_01 \ openmp/taskgroup_02 \ openmp/array_slice_01 \ openmp/cuda_task_01 \ overlap/gpu_concurrency \ parallel_tasks/explicit_combined_worker \ parallel_tasks/parallel_kernels \ parallel_tasks/parallel_kernels_spmd \ parallel_tasks/spmd_peager \ parallel_tasks/cuda_only \ perfmodels/regression_based \ perfmodels/non_linear_regression_based \ perfmodels/feed \ perfmodels/user_base \ perfmodels/valid_model \ perfmodels/memory \ sched_policies/data_locality \ sched_policies/execute_all_tasks \ sched_policies/prio \ sched_policies/simple_deps \ sched_policies/simple_cpu_gpu_sched endif MICROBENCHS = if STARPU_SIMGRID noinst_PROGRAMS += $(MICROBENCHS) TESTS += $(MICROBENCHS:=.sh) endif if STARPU_HAVE_FC if !STARPU_SANITIZE if !STARPU_SIMGRID noinst_PROGRAMS += \ fortran90/init_01 endif endif endif if !STARPU_SIMGRID if STARPU_LONG_CHECK noinst_PROGRAMS += \ main/tag_task_data_deps \ datawizard/reclaim endif endif examplebin_PROGRAMS = \ microbenchs/tasks_size_overhead \ microbenchs/local_pingpong examplebin_SCRIPTS = \ microbenchs/tasks_size_overhead.gp \ microbenchs/tasks_size_overhead.sh if STARPU_HAVE_WINDOWS check_PROGRAMS = $(noinst_PROGRAMS) else check_PROGRAMS = $(LOADER) $(noinst_PROGRAMS) endif TESTS += \ datawizard/locality.sh \ overlap/overlap.sh ####################### # Source files # ####################### datawizard_acquire_release_SOURCES = \ datawizard/acquire_release.c if STARPU_USE_CUDA datawizard_acquire_release_SOURCES += \ datawizard/acquire_release_cuda.cu endif if STARPU_USE_OPENCL datawizard_acquire_release_SOURCES += \ datawizard/acquire_release_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ datawizard/acquire_release_opencl_kernel.cl endif datawizard_acquire_release2_SOURCES = \ datawizard/acquire_release2.c if STARPU_USE_CUDA datawizard_acquire_release2_SOURCES += \ datawizard/acquire_release_cuda.cu endif if STARPU_USE_OPENCL datawizard_acquire_release2_SOURCES += \ datawizard/acquire_release_opencl.c endif datawizard_scratch_SOURCES = \ datawizard/scratch.c if STARPU_USE_CUDA datawizard_scratch_SOURCES += \ datawizard/scratch_cuda.cu endif if STARPU_USE_OPENCL datawizard_scratch_SOURCES += \ datawizard/scratch_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ datawizard/scratch_opencl_kernel.cl endif datawizard_mpi_like_SOURCES = \ datawizard/mpi_like.c if STARPU_USE_CUDA datawizard_mpi_like_SOURCES += \ datawizard/cuda_codelet_unsigned_inc.cu endif if STARPU_USE_OPENCL datawizard_mpi_like_SOURCES += \ datawizard/opencl_codelet_unsigned_inc.c nobase_STARPU_OPENCL_DATA_DATA+= \ datawizard/opencl_codelet_unsigned_inc_kernel.cl endif datawizard_mpi_like_async_SOURCES = \ datawizard/mpi_like_async.c if STARPU_USE_CUDA datawizard_mpi_like_async_SOURCES += \ datawizard/cuda_codelet_unsigned_inc.cu endif if STARPU_USE_OPENCL datawizard_mpi_like_async_SOURCES += \ datawizard/opencl_codelet_unsigned_inc.c endif datawizard_sync_and_notify_data_SOURCES = \ datawizard/sync_and_notify_data.c if STARPU_USE_CUDA datawizard_sync_and_notify_data_SOURCES += \ datawizard/sync_and_notify_data_kernels.cu endif if STARPU_USE_OPENCL datawizard_sync_and_notify_data_SOURCES += \ datawizard/sync_and_notify_data_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ datawizard/sync_and_notify_data_opencl_codelet.cl endif datawizard_sync_and_notify_data_implicit_SOURCES = \ datawizard/sync_and_notify_data_implicit.c if STARPU_USE_CUDA datawizard_sync_and_notify_data_implicit_SOURCES += \ datawizard/sync_and_notify_data_kernels.cu endif if STARPU_USE_OPENCL datawizard_sync_and_notify_data_implicit_SOURCES += \ datawizard/sync_and_notify_data_opencl.c endif datawizard_in_place_partition_SOURCES = \ datawizard/in_place_partition.c \ datawizard/scal.c if STARPU_USE_CUDA datawizard_in_place_partition_SOURCES += \ datawizard/scal_cuda.cu endif if STARPU_USE_OPENCL datawizard_in_place_partition_SOURCES += \ datawizard/scal_opencl.cl endif datawizard_partition_dep_SOURCES = \ datawizard/partition_dep.c \ datawizard/scal.c if STARPU_USE_CUDA datawizard_partition_dep_SOURCES += \ datawizard/scal_cuda.cu endif if STARPU_USE_OPENCL datawizard_partition_dep_SOURCES += \ datawizard/scal_opencl.cl endif datawizard_partition_lazy_SOURCES = \ datawizard/partition_lazy.c \ datawizard/scal.c if STARPU_USE_CUDA datawizard_partition_lazy_SOURCES += \ datawizard/scal_cuda.cu endif if STARPU_USE_OPENCL datawizard_partition_lazy_SOURCES += \ datawizard/scal_opencl.cl endif datawizard_gpu_register_SOURCES = \ datawizard/gpu_register.c \ datawizard/scal.c if STARPU_USE_CUDA datawizard_gpu_register_SOURCES += \ datawizard/scal_cuda.cu endif if STARPU_USE_OPENCL datawizard_gpu_register_SOURCES += \ datawizard/scal_opencl.cl endif datawizard_gpu_ptr_register_SOURCES = \ datawizard/gpu_ptr_register.c \ datawizard/scal.c if STARPU_USE_CUDA datawizard_gpu_ptr_register_SOURCES += \ datawizard/scal_cuda.cu endif if STARPU_USE_OPENCL datawizard_gpu_ptr_register_SOURCES += \ datawizard/scal_opencl.cl endif datawizard_wt_host_SOURCES = \ datawizard/wt_host.c datawizard_wt_broadcast_SOURCES = \ datawizard/wt_broadcast.c datawizard_specific_node_SOURCES = \ datawizard/specific_node.c if STARPU_USE_CUDA datawizard_specific_node_SOURCES += \ datawizard/cuda_codelet_unsigned_inc.cu endif if STARPU_USE_OPENCL datawizard_specific_node_SOURCES += \ datawizard/opencl_codelet_unsigned_inc.c endif datawizard_test_arbiter_SOURCES = \ datawizard/test_arbiter.cpp main_deprecated_func_CFLAGS = $(AM_CFLAGS) -Wno-deprecated-declarations main_subgraph_repeat_SOURCES = \ main/subgraph_repeat.c if STARPU_USE_CUDA main_subgraph_repeat_SOURCES += \ main/increment.cu endif main_subgraph_repeat_tag_SOURCES = \ main/subgraph_repeat_tag.c if STARPU_USE_CUDA main_subgraph_repeat_tag_SOURCES += \ main/increment.cu endif main_subgraph_repeat_regenerate_SOURCES = \ main/subgraph_repeat_regenerate.c if STARPU_USE_CUDA main_subgraph_repeat_regenerate_SOURCES += \ main/increment.cu endif main_subgraph_repeat_regenerate_tag_SOURCES = \ main/subgraph_repeat_regenerate_tag.c if STARPU_USE_CUDA main_subgraph_repeat_regenerate_tag_SOURCES += \ main/increment.cu endif openmp_init_exit_01_SOURCES = \ openmp/init_exit_01.c openmp_init_exit_02_SOURCES = \ openmp/init_exit_02.c openmp_environment_SOURCES = \ openmp/environment.c openmp_api_01_SOURCES = \ openmp/api_01.c openmp_parallel_01_SOURCES = \ openmp/parallel_01.c openmp_parallel_02_SOURCES = \ openmp/parallel_02.c openmp_parallel_03_SOURCES = \ openmp/parallel_03.c openmp_parallel_barrier_01_SOURCES = \ openmp/parallel_barrier_01.c openmp_parallel_master_01_SOURCES = \ openmp/parallel_master_01.c openmp_parallel_master_inline_01_SOURCES = \ openmp/parallel_master_inline_01.c openmp_parallel_single_wait_01_SOURCES = \ openmp/parallel_single_wait_01.c openmp_parallel_single_nowait_01_SOURCES = \ openmp/parallel_single_nowait_01.c openmp_parallel_single_inline_01_SOURCES = \ openmp/parallel_single_inline_01.c openmp_parallel_single_copyprivate_01_SOURCES = \ openmp/parallel_single_copyprivate_01.c openmp_parallel_single_copyprivate_inline_01_SOURCES = \ openmp/parallel_single_copyprivate_inline_01.c openmp_parallel_critical_01_SOURCES = \ openmp/parallel_critical_01.c openmp_parallel_critical_inline_01_SOURCES = \ openmp/parallel_critical_inline_01.c openmp_parallel_critical_named_01_SOURCES = \ openmp/parallel_critical_named_01.c openmp_parallel_critical_named_inline_01_SOURCES = \ openmp/parallel_critical_named_inline_01.c openmp_parallel_simple_lock_01_SOURCES = \ openmp/parallel_simple_lock_01.c openmp_parallel_nested_lock_01_SOURCES = \ openmp/parallel_nested_lock_01.c openmp_parallel_for_01_SOURCES = \ openmp/parallel_for_01.c openmp_parallel_for_02_SOURCES = \ openmp/parallel_for_02.c openmp_parallel_for_ordered_01_SOURCES = \ openmp/parallel_for_ordered_01.c openmp_parallel_sections_01_SOURCES = \ openmp/parallel_sections_01.c openmp_parallel_sections_combined_01_SOURCES = \ openmp/parallel_sections_combined_01.c openmp_task_01_SOURCES = \ openmp/task_01.c openmp_task_02_SOURCES = \ openmp/task_02.c openmp_taskwait_01_SOURCES = \ openmp/taskwait_01.c openmp_taskgroup_01_SOURCES = \ openmp/taskgroup_01.c openmp_taskgroup_02_SOURCES = \ openmp/taskgroup_02.c openmp_array_slice_01_SOURCES = \ openmp/array_slice_01.c openmp_cuda_task_01_SOURCES = \ openmp/cuda_task_01.c if STARPU_HAVE_FC fortran90_init_01_SOURCES = \ $(top_srcdir)/include/starpu_mod.f90 \ fortran90/init_01.f90 endif ################### # Block interface # ################### datawizard_interfaces_block_block_interface_SOURCES= \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/block/block_interface.c if STARPU_USE_CUDA datawizard_interfaces_block_block_interface_SOURCES+= \ datawizard/interfaces/block/block_cuda.cu endif if STARPU_USE_OPENCL datawizard_interfaces_block_block_interface_SOURCES+= \ datawizard/interfaces/block/block_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ datawizard/interfaces/block/block_opencl_kernel.cl endif ################## # BSCR interface # ################## datawizard_interfaces_bcsr_bcsr_interface_SOURCES= \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/bcsr/bcsr_interface.c if STARPU_USE_CUDA datawizard_interfaces_bcsr_bcsr_interface_SOURCES+= \ datawizard/interfaces/bcsr/bcsr_cuda.cu endif if STARPU_USE_OPENCL datawizard_interfaces_bcsr_bcsr_interface_SOURCES+= \ datawizard/interfaces/bcsr/bcsr_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ datawizard/interfaces/bcsr/bcsr_opencl_kernel.cl endif ################# # COO interface # ################# datawizard_interfaces_coo_coo_interface_SOURCES= \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/coo/coo_interface.c if STARPU_USE_CUDA datawizard_interfaces_coo_coo_interface_SOURCES+= \ datawizard/interfaces/coo/coo_cuda.cu endif if STARPU_USE_OPENCL datawizard_interfaces_coo_coo_interface_SOURCES+= \ datawizard/interfaces/coo/coo_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ datawizard/interfaces/coo/coo_opencl_kernel.cl endif ################# # CSR interface # ################# datawizard_interfaces_csr_csr_interface_SOURCES= \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/csr/csr_interface.c if STARPU_USE_CUDA datawizard_interfaces_csr_csr_interface_SOURCES+= \ datawizard/interfaces/csr/csr_cuda.cu endif if STARPU_USE_OPENCL datawizard_interfaces_csr_csr_interface_SOURCES+= \ datawizard/interfaces/csr/csr_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ datawizard/interfaces/csr/csr_opencl_kernel.cl endif datawizard_interfaces_vector_test_vector_interface_SOURCES = \ datawizard/interfaces/vector/test_vector_interface.c \ datawizard/interfaces/test_interfaces.c if STARPU_USE_CUDA datawizard_interfaces_vector_test_vector_interface_SOURCES += \ datawizard/interfaces/vector/test_vector_cuda.cu endif if STARPU_USE_OPENCL datawizard_interfaces_vector_test_vector_interface_SOURCES += \ datawizard/interfaces/vector/test_vector_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ datawizard/interfaces/vector/test_vector_opencl_kernel.cl endif #################### # Matrix interface # #################### datawizard_interfaces_matrix_matrix_interface_SOURCES= \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/matrix/matrix_interface.c if STARPU_USE_CUDA datawizard_interfaces_matrix_matrix_interface_SOURCES+= \ datawizard/interfaces/matrix/matrix_cuda.cu endif if STARPU_USE_OPENCL datawizard_interfaces_matrix_matrix_interface_SOURCES+= \ datawizard/interfaces/matrix/matrix_opencl.c nobase_STARPU_OPENCL_DATA_DATA+= \ datawizard/interfaces/matrix/matrix_opencl_kernel.cl endif ######################### # Multiformat interface # ######################### datawizard_interfaces_multiformat_multiformat_interface_SOURCES = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/multiformat/multiformat_interface.c \ datawizard/interfaces/multiformat/multiformat_conversion_codelets.c if STARPU_USE_CUDA datawizard_interfaces_multiformat_multiformat_interface_SOURCES+= \ datawizard/interfaces/multiformat/multiformat_cuda.cu \ datawizard/interfaces/multiformat/multiformat_conversion_codelets_cuda.cu endif if STARPU_USE_OPENCL datawizard_interfaces_multiformat_multiformat_interface_SOURCES+= \ datawizard/interfaces/multiformat/multiformat_opencl.c \ datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ datawizard/interfaces/multiformat/multiformat_opencl_kernel.cl \ datawizard/interfaces/multiformat/multiformat_conversion_codelets_kernel.cl endif datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_SOURCES=\ datawizard/interfaces/multiformat/advanced/generic.c \ datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c datawizard_interfaces_multiformat_advanced_multiformat_data_release_SOURCES = \ datawizard/interfaces/multiformat/advanced/generic.c \ datawizard/interfaces/multiformat/advanced/multiformat_data_release.c datawizard_interfaces_multiformat_advanced_multiformat_worker_SOURCES=\ datawizard/interfaces/multiformat/advanced/generic.c \ datawizard/interfaces/multiformat/advanced/multiformat_worker.c datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_SOURCES = \ datawizard/interfaces/multiformat/advanced/generic.c \ datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c datawizard_interfaces_multiformat_advanced_same_handle_SOURCES= \ datawizard/interfaces/multiformat/advanced/generic.c \ datawizard/interfaces/multiformat/advanced/same_handle.c datawizard_interfaces_variable_variable_interface_SOURCES= \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/variable/variable_interface.c if STARPU_USE_CUDA datawizard_interfaces_variable_variable_interface_SOURCES+= \ datawizard/interfaces/variable/variable_cuda.cu endif if STARPU_USE_OPENCL datawizard_interfaces_variable_variable_interface_SOURCES+= \ datawizard/interfaces/variable/variable_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ datawizard/interfaces/variable/variable_opencl_kernel.cl endif ################## # Void interface # ################## datawizard_interfaces_void_void_interface_SOURCES=\ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/void/void_interface.c overlap_gpu_concurrency_SOURCES=\ overlap/gpu_concurrency.c if STARPU_USE_CUDA overlap_gpu_concurrency_SOURCES+=\ overlap/long_kernel.cu endif perfmodels_regression_based_SOURCES=\ perfmodels/regression_based.c if STARPU_USE_OPENCL perfmodels_regression_based_SOURCES+=\ perfmodels/opencl_memset.c nobase_STARPU_OPENCL_DATA_DATA += \ perfmodels/opencl_memset_kernel.cl endif perfmodels_non_linear_regression_based_SOURCES=\ perfmodels/non_linear_regression_based.c if STARPU_USE_OPENCL perfmodels_non_linear_regression_based_SOURCES+=\ perfmodels/opencl_memset.c endif perfmodels_feed_SOURCES=\ perfmodels/feed.c sched_policies_execute_all_tasks_LDFLAGS = $(AM_LDFLAGS) -lm if STARPU_HAVE_FC # Fortran90 tests # - list explicit dependences to control proper module files generation # - the overriding rule fully disables the corresponing default rule, thus # the default rule body must be copied entirely starpu_mod.mod: starpu_mod.o starpu_mod.o: $(top_srcdir)/include/starpu_mod.f90 $(AM_V_FC)$(FC) $(fortran90_init_01_FCFLAGS) $(FCFLAGS) -c -o $@ '$(top_srcdir)/'include/starpu_mod.f90 init_01.o: $(top_srcdir)/tests/fortran90/init_01.f90 starpu_mod.mod $(AM_V_FC)$(FC) $(fortran90_init_01_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'fortran90/init_01.f90' || echo '$(srcdir)/'`fortran90/init_01.f90 endif starpu-1.2.3+dfsg/tests/Makefile.in000066400000000000000000027342511320135501600171730ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2017 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS # Copyright (C) 2010, 2011, 2012 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @STARPU_USE_CUDA_TRUE@am__append_1 = -I$(top_srcdir)/include/ -I$(top_srcdir)/src -I$(top_builddir)/src -I$(top_builddir)/src/common -I$(top_builddir)/include $(HWLOC_CFLAGS) $(SIMGRID_CFLAGS) TESTS = $(noinst_PROGRAMS) $(am__append_2) $(am__EXEEXT_4) \ datawizard/locality.sh overlap/overlap.sh @STARPU_COVERAGE_ENABLED_TRUE@am__append_2 = coverage/coverage.sh XFAIL_TESTS = errorcheck/invalid_blocking_calls$(EXEEXT) noinst_PROGRAMS = main/mkdtemp$(EXEEXT) main/execute_schedule$(EXEEXT) \ main/insert_task_pack$(EXEEXT) \ main/insert_task_nullcodelet$(EXEEXT) \ main/multithreaded_init$(EXEEXT) main/empty_task$(EXEEXT) \ main/empty_task_chain$(EXEEXT) \ main/starpu_worker_exists$(EXEEXT) \ main/codelet_null_callback$(EXEEXT) \ datawizard/allocate$(EXEEXT) datawizard/acquire_cb$(EXEEXT) \ datawizard/user_interaction_implicit$(EXEEXT) \ datawizard/interfaces/copy_interfaces$(EXEEXT) \ datawizard/locality$(EXEEXT) \ datawizard/simgrid-locality$(EXEEXT) \ errorcheck/starpu_init_noworker$(EXEEXT) \ errorcheck/invalid_tasks$(EXEEXT) helper/cublas_init$(EXEEXT) \ helper/cusparse_init$(EXEEXT) helper/pinned_memory$(EXEEXT) \ helper/execute_on_all$(EXEEXT) \ microbenchs/display_structures_size$(EXEEXT) \ microbenchs/local_pingpong$(EXEEXT) overlap/overlap$(EXEEXT) \ perfmodels/value_nan$(EXEEXT) $(am__EXEEXT_2) $(am__EXEEXT_4) \ $(am__EXEEXT_5) $(am__EXEEXT_6) @STARPU_SIMGRID_FALSE@am__append_3 = \ @STARPU_SIMGRID_FALSE@ main/deprecated_func \ @STARPU_SIMGRID_FALSE@ main/driver_api/init_run_deinit \ @STARPU_SIMGRID_FALSE@ main/driver_api/run_driver \ @STARPU_SIMGRID_FALSE@ main/deploop \ @STARPU_SIMGRID_FALSE@ main/execute_on_a_specific_worker \ @STARPU_SIMGRID_FALSE@ main/insert_task \ @STARPU_SIMGRID_FALSE@ main/insert_task_value \ @STARPU_SIMGRID_FALSE@ main/insert_task_dyn_handles \ @STARPU_SIMGRID_FALSE@ main/insert_task_array \ @STARPU_SIMGRID_FALSE@ main/insert_task_many \ @STARPU_SIMGRID_FALSE@ main/multithreaded \ @STARPU_SIMGRID_FALSE@ main/starpu_task_bundle \ @STARPU_SIMGRID_FALSE@ main/starpu_task_wait_for_all \ @STARPU_SIMGRID_FALSE@ main/starpu_task_wait \ @STARPU_SIMGRID_FALSE@ main/static_restartable \ @STARPU_SIMGRID_FALSE@ main/static_restartable_using_initializer\ @STARPU_SIMGRID_FALSE@ main/static_restartable_tag \ @STARPU_SIMGRID_FALSE@ main/regenerate \ @STARPU_SIMGRID_FALSE@ main/regenerate_pipeline \ @STARPU_SIMGRID_FALSE@ main/restart \ @STARPU_SIMGRID_FALSE@ main/wait_all_regenerable_tasks \ @STARPU_SIMGRID_FALSE@ main/subgraph_repeat \ @STARPU_SIMGRID_FALSE@ main/subgraph_repeat_tag \ @STARPU_SIMGRID_FALSE@ main/subgraph_repeat_regenerate \ @STARPU_SIMGRID_FALSE@ main/subgraph_repeat_regenerate_tag \ @STARPU_SIMGRID_FALSE@ main/empty_task_sync_point \ @STARPU_SIMGRID_FALSE@ main/empty_task_sync_point_tasks \ @STARPU_SIMGRID_FALSE@ main/tag_wait_api \ @STARPU_SIMGRID_FALSE@ main/task_wait_api \ @STARPU_SIMGRID_FALSE@ main/declare_deps_in_callback \ @STARPU_SIMGRID_FALSE@ main/declare_deps_after_submission \ @STARPU_SIMGRID_FALSE@ main/declare_deps_after_submission_synchronous \ @STARPU_SIMGRID_FALSE@ main/get_current_task \ @STARPU_SIMGRID_FALSE@ main/starpu_init \ @STARPU_SIMGRID_FALSE@ main/submit \ @STARPU_SIMGRID_FALSE@ main/pause_resume \ @STARPU_SIMGRID_FALSE@ main/pack \ @STARPU_SIMGRID_FALSE@ main/get_children_tasks \ @STARPU_SIMGRID_FALSE@ datawizard/acquire_cb_insert \ @STARPU_SIMGRID_FALSE@ datawizard/acquire_release \ @STARPU_SIMGRID_FALSE@ datawizard/acquire_release2 \ @STARPU_SIMGRID_FALSE@ datawizard/acquire_try \ @STARPU_SIMGRID_FALSE@ datawizard/cache \ @STARPU_SIMGRID_FALSE@ datawizard/commute \ @STARPU_SIMGRID_FALSE@ datawizard/commute2 \ @STARPU_SIMGRID_FALSE@ datawizard/copy \ @STARPU_SIMGRID_FALSE@ datawizard/data_implicit_deps \ @STARPU_SIMGRID_FALSE@ datawizard/data_lookup \ @STARPU_SIMGRID_FALSE@ datawizard/scratch \ @STARPU_SIMGRID_FALSE@ datawizard/sync_and_notify_data \ @STARPU_SIMGRID_FALSE@ datawizard/sync_and_notify_data_implicit\ @STARPU_SIMGRID_FALSE@ datawizard/dsm_stress \ @STARPU_SIMGRID_FALSE@ datawizard/double_parameter \ @STARPU_SIMGRID_FALSE@ datawizard/write_only_tmp_buffer \ @STARPU_SIMGRID_FALSE@ datawizard/data_invalidation \ @STARPU_SIMGRID_FALSE@ datawizard/dining_philosophers \ @STARPU_SIMGRID_FALSE@ datawizard/manual_reduction \ @STARPU_SIMGRID_FALSE@ datawizard/readers_and_writers \ @STARPU_SIMGRID_FALSE@ datawizard/unpartition \ @STARPU_SIMGRID_FALSE@ datawizard/sync_with_data_with_mem \ @STARPU_SIMGRID_FALSE@ datawizard/sync_with_data_with_mem_non_blocking\ @STARPU_SIMGRID_FALSE@ datawizard/sync_with_data_with_mem_non_blocking_implicit\ @STARPU_SIMGRID_FALSE@ datawizard/mpi_like \ @STARPU_SIMGRID_FALSE@ datawizard/mpi_like_async \ @STARPU_SIMGRID_FALSE@ datawizard/critical_section_with_void_interface\ @STARPU_SIMGRID_FALSE@ datawizard/increment_init \ @STARPU_SIMGRID_FALSE@ datawizard/increment_redux \ @STARPU_SIMGRID_FALSE@ datawizard/increment_redux_v2 \ @STARPU_SIMGRID_FALSE@ datawizard/increment_redux_lazy \ @STARPU_SIMGRID_FALSE@ datawizard/handle_to_pointer \ @STARPU_SIMGRID_FALSE@ datawizard/lazy_allocation \ @STARPU_SIMGRID_FALSE@ datawizard/lazy_unregister \ @STARPU_SIMGRID_FALSE@ datawizard/no_unregister \ @STARPU_SIMGRID_FALSE@ datawizard/noreclaim \ @STARPU_SIMGRID_FALSE@ datawizard/nowhere \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/block/block_interface \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/bcsr/bcsr_interface \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/coo/coo_interface \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/csr/csr_interface \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/matrix/matrix_interface \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/multiformat/multiformat_interface \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/multiformat/advanced/multiformat_data_release \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/multiformat/advanced/multiformat_worker \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/multiformat/advanced/same_handle \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/variable/variable_interface \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/vector/test_vector_interface \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/void/void_interface \ @STARPU_SIMGRID_FALSE@ datawizard/in_place_partition \ @STARPU_SIMGRID_FALSE@ datawizard/partition_dep \ @STARPU_SIMGRID_FALSE@ datawizard/partition_lazy \ @STARPU_SIMGRID_FALSE@ datawizard/gpu_register \ @STARPU_SIMGRID_FALSE@ datawizard/gpu_ptr_register \ @STARPU_SIMGRID_FALSE@ datawizard/variable_parameters \ @STARPU_SIMGRID_FALSE@ datawizard/wt_host \ @STARPU_SIMGRID_FALSE@ datawizard/wt_broadcast \ @STARPU_SIMGRID_FALSE@ datawizard/readonly \ @STARPU_SIMGRID_FALSE@ datawizard/specific_node \ @STARPU_SIMGRID_FALSE@ datawizard/task_with_multiple_time_the_same_handle \ @STARPU_SIMGRID_FALSE@ datawizard/test_arbiter \ @STARPU_SIMGRID_FALSE@ datawizard/invalidate_pending_requests \ @STARPU_SIMGRID_FALSE@ datawizard/temporary_partition \ @STARPU_SIMGRID_FALSE@ datawizard/redux_acquire \ @STARPU_SIMGRID_FALSE@ disk/disk_copy \ @STARPU_SIMGRID_FALSE@ disk/disk_compute \ @STARPU_SIMGRID_FALSE@ disk/disk_pack \ @STARPU_SIMGRID_FALSE@ disk/mem_reclaim \ @STARPU_SIMGRID_FALSE@ errorcheck/invalid_blocking_calls \ @STARPU_SIMGRID_FALSE@ helper/starpu_data_cpy \ @STARPU_SIMGRID_FALSE@ helper/starpu_create_sync_task \ @STARPU_SIMGRID_FALSE@ microbenchs/async_tasks_overhead \ @STARPU_SIMGRID_FALSE@ microbenchs/sync_tasks_overhead \ @STARPU_SIMGRID_FALSE@ microbenchs/tasks_overhead \ @STARPU_SIMGRID_FALSE@ microbenchs/tasks_size_overhead \ @STARPU_SIMGRID_FALSE@ microbenchs/prefetch_data_on_node \ @STARPU_SIMGRID_FALSE@ microbenchs/redundant_buffer \ @STARPU_SIMGRID_FALSE@ microbenchs/matrix_as_vector \ @STARPU_SIMGRID_FALSE@ openmp/init_exit_01 \ @STARPU_SIMGRID_FALSE@ openmp/init_exit_02 \ @STARPU_SIMGRID_FALSE@ openmp/environment \ @STARPU_SIMGRID_FALSE@ openmp/api_01 \ @STARPU_SIMGRID_FALSE@ openmp/parallel_01 \ @STARPU_SIMGRID_FALSE@ openmp/parallel_02 \ @STARPU_SIMGRID_FALSE@ openmp/parallel_03 \ @STARPU_SIMGRID_FALSE@ openmp/parallel_barrier_01 \ @STARPU_SIMGRID_FALSE@ openmp/parallel_master_01 \ @STARPU_SIMGRID_FALSE@ openmp/parallel_master_inline_01 \ @STARPU_SIMGRID_FALSE@ openmp/parallel_single_wait_01 \ @STARPU_SIMGRID_FALSE@ openmp/parallel_single_nowait_01 \ @STARPU_SIMGRID_FALSE@ openmp/parallel_single_inline_01 \ @STARPU_SIMGRID_FALSE@ openmp/parallel_single_copyprivate_01 \ @STARPU_SIMGRID_FALSE@ openmp/parallel_single_copyprivate_inline_01 \ @STARPU_SIMGRID_FALSE@ openmp/parallel_critical_01 \ @STARPU_SIMGRID_FALSE@ openmp/parallel_critical_inline_01 \ @STARPU_SIMGRID_FALSE@ openmp/parallel_critical_named_01 \ @STARPU_SIMGRID_FALSE@ openmp/parallel_critical_named_inline_01\ @STARPU_SIMGRID_FALSE@ openmp/parallel_simple_lock_01 \ @STARPU_SIMGRID_FALSE@ openmp/parallel_nested_lock_01 \ @STARPU_SIMGRID_FALSE@ openmp/parallel_for_01 \ @STARPU_SIMGRID_FALSE@ openmp/parallel_for_02 \ @STARPU_SIMGRID_FALSE@ openmp/parallel_for_ordered_01 \ @STARPU_SIMGRID_FALSE@ openmp/parallel_sections_01 \ @STARPU_SIMGRID_FALSE@ openmp/parallel_sections_combined_01 \ @STARPU_SIMGRID_FALSE@ openmp/task_01 \ @STARPU_SIMGRID_FALSE@ openmp/task_02 \ @STARPU_SIMGRID_FALSE@ openmp/taskwait_01 \ @STARPU_SIMGRID_FALSE@ openmp/taskgroup_01 \ @STARPU_SIMGRID_FALSE@ openmp/taskgroup_02 \ @STARPU_SIMGRID_FALSE@ openmp/array_slice_01 \ @STARPU_SIMGRID_FALSE@ openmp/cuda_task_01 \ @STARPU_SIMGRID_FALSE@ overlap/gpu_concurrency \ @STARPU_SIMGRID_FALSE@ parallel_tasks/explicit_combined_worker \ @STARPU_SIMGRID_FALSE@ parallel_tasks/parallel_kernels \ @STARPU_SIMGRID_FALSE@ parallel_tasks/parallel_kernels_spmd \ @STARPU_SIMGRID_FALSE@ parallel_tasks/spmd_peager \ @STARPU_SIMGRID_FALSE@ parallel_tasks/cuda_only \ @STARPU_SIMGRID_FALSE@ perfmodels/regression_based \ @STARPU_SIMGRID_FALSE@ perfmodels/non_linear_regression_based \ @STARPU_SIMGRID_FALSE@ perfmodels/feed \ @STARPU_SIMGRID_FALSE@ perfmodels/user_base \ @STARPU_SIMGRID_FALSE@ perfmodels/valid_model \ @STARPU_SIMGRID_FALSE@ perfmodels/memory \ @STARPU_SIMGRID_FALSE@ sched_policies/data_locality \ @STARPU_SIMGRID_FALSE@ sched_policies/execute_all_tasks \ @STARPU_SIMGRID_FALSE@ sched_policies/prio \ @STARPU_SIMGRID_FALSE@ sched_policies/simple_deps \ @STARPU_SIMGRID_FALSE@ sched_policies/simple_cpu_gpu_sched @STARPU_SIMGRID_TRUE@am__append_4 = $(MICROBENCHS) @STARPU_SIMGRID_TRUE@am__append_5 = $(MICROBENCHS:=.sh) @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@am__append_6 = \ @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@ fortran90/init_01 @STARPU_LONG_CHECK_TRUE@@STARPU_SIMGRID_FALSE@am__append_7 = \ @STARPU_LONG_CHECK_TRUE@@STARPU_SIMGRID_FALSE@ main/tag_task_data_deps \ @STARPU_LONG_CHECK_TRUE@@STARPU_SIMGRID_FALSE@ datawizard/reclaim examplebin_PROGRAMS = microbenchs/tasks_size_overhead$(EXEEXT) \ microbenchs/local_pingpong$(EXEEXT) @STARPU_HAVE_WINDOWS_FALSE@check_PROGRAMS = $(am__EXEEXT_1) \ @STARPU_HAVE_WINDOWS_FALSE@ $(am__EXEEXT_7) @STARPU_HAVE_WINDOWS_TRUE@check_PROGRAMS = $(am__EXEEXT_7) @STARPU_USE_CUDA_TRUE@am__append_8 = \ @STARPU_USE_CUDA_TRUE@ datawizard/acquire_release_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_9 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/acquire_release_opencl.c @STARPU_USE_CUDA_TRUE@am__append_10 = \ @STARPU_USE_CUDA_TRUE@ datawizard/acquire_release_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_11 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/acquire_release_opencl.c @STARPU_USE_CUDA_TRUE@am__append_12 = \ @STARPU_USE_CUDA_TRUE@ datawizard/scratch_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_13 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/scratch_opencl.c @STARPU_USE_CUDA_TRUE@am__append_14 = \ @STARPU_USE_CUDA_TRUE@ datawizard/cuda_codelet_unsigned_inc.cu @STARPU_USE_OPENCL_TRUE@am__append_15 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/opencl_codelet_unsigned_inc.c @STARPU_USE_CUDA_TRUE@am__append_16 = \ @STARPU_USE_CUDA_TRUE@ datawizard/cuda_codelet_unsigned_inc.cu @STARPU_USE_OPENCL_TRUE@am__append_17 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/opencl_codelet_unsigned_inc.c @STARPU_USE_CUDA_TRUE@am__append_18 = \ @STARPU_USE_CUDA_TRUE@ datawizard/sync_and_notify_data_kernels.cu @STARPU_USE_OPENCL_TRUE@am__append_19 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/sync_and_notify_data_opencl.c @STARPU_USE_CUDA_TRUE@am__append_20 = \ @STARPU_USE_CUDA_TRUE@ datawizard/sync_and_notify_data_kernels.cu @STARPU_USE_OPENCL_TRUE@am__append_21 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/sync_and_notify_data_opencl.c @STARPU_USE_CUDA_TRUE@am__append_22 = \ @STARPU_USE_CUDA_TRUE@ datawizard/scal_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_23 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/scal_opencl.cl @STARPU_USE_CUDA_TRUE@am__append_24 = \ @STARPU_USE_CUDA_TRUE@ datawizard/scal_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_25 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/scal_opencl.cl @STARPU_USE_CUDA_TRUE@am__append_26 = \ @STARPU_USE_CUDA_TRUE@ datawizard/scal_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_27 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/scal_opencl.cl @STARPU_USE_CUDA_TRUE@am__append_28 = \ @STARPU_USE_CUDA_TRUE@ datawizard/scal_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_29 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/scal_opencl.cl @STARPU_USE_CUDA_TRUE@am__append_30 = \ @STARPU_USE_CUDA_TRUE@ datawizard/scal_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_31 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/scal_opencl.cl @STARPU_USE_CUDA_TRUE@am__append_32 = \ @STARPU_USE_CUDA_TRUE@ datawizard/cuda_codelet_unsigned_inc.cu @STARPU_USE_OPENCL_TRUE@am__append_33 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/opencl_codelet_unsigned_inc.c @STARPU_USE_CUDA_TRUE@am__append_34 = \ @STARPU_USE_CUDA_TRUE@ main/increment.cu @STARPU_USE_CUDA_TRUE@am__append_35 = \ @STARPU_USE_CUDA_TRUE@ main/increment.cu @STARPU_USE_CUDA_TRUE@am__append_36 = \ @STARPU_USE_CUDA_TRUE@ main/increment.cu @STARPU_USE_CUDA_TRUE@am__append_37 = \ @STARPU_USE_CUDA_TRUE@ main/increment.cu @STARPU_USE_CUDA_TRUE@am__append_38 = \ @STARPU_USE_CUDA_TRUE@ datawizard/interfaces/block/block_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_39 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/block/block_opencl.c @STARPU_USE_CUDA_TRUE@am__append_40 = \ @STARPU_USE_CUDA_TRUE@ datawizard/interfaces/bcsr/bcsr_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_41 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/bcsr/bcsr_opencl.c @STARPU_USE_CUDA_TRUE@am__append_42 = \ @STARPU_USE_CUDA_TRUE@ datawizard/interfaces/coo/coo_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_43 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/coo/coo_opencl.c @STARPU_USE_CUDA_TRUE@am__append_44 = \ @STARPU_USE_CUDA_TRUE@ datawizard/interfaces/csr/csr_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_45 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/csr/csr_opencl.c @STARPU_USE_CUDA_TRUE@am__append_46 = \ @STARPU_USE_CUDA_TRUE@ datawizard/interfaces/vector/test_vector_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_47 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/vector/test_vector_opencl.c @STARPU_USE_CUDA_TRUE@am__append_48 = \ @STARPU_USE_CUDA_TRUE@ datawizard/interfaces/matrix/matrix_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_49 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/matrix/matrix_opencl.c @STARPU_USE_CUDA_TRUE@am__append_50 = \ @STARPU_USE_CUDA_TRUE@ datawizard/interfaces/multiformat/multiformat_cuda.cu \ @STARPU_USE_CUDA_TRUE@ datawizard/interfaces/multiformat/multiformat_conversion_codelets_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_51 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/multiformat/multiformat_opencl.c \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c @STARPU_USE_CUDA_TRUE@am__append_52 = \ @STARPU_USE_CUDA_TRUE@ datawizard/interfaces/variable/variable_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_53 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/variable/variable_opencl.c @STARPU_USE_CUDA_TRUE@am__append_54 = \ @STARPU_USE_CUDA_TRUE@ overlap/long_kernel.cu @STARPU_USE_OPENCL_TRUE@am__append_55 = \ @STARPU_USE_OPENCL_TRUE@ perfmodels/opencl_memset.c @STARPU_USE_OPENCL_TRUE@am__append_56 = \ @STARPU_USE_OPENCL_TRUE@ perfmodels/opencl_memset.c subdir = tests ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = loader-cross.sh CONFIG_CLEAN_VPATH_FILES = @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@am__EXEEXT_1 = loader$(EXEEXT) @STARPU_SIMGRID_FALSE@am__EXEEXT_2 = main/deprecated_func$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/driver_api/init_run_deinit$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/driver_api/run_driver$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/deploop$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/execute_on_a_specific_worker$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/insert_task$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/insert_task_value$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/insert_task_dyn_handles$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/insert_task_array$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/insert_task_many$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/multithreaded$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/starpu_task_bundle$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/starpu_task_wait_for_all$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/starpu_task_wait$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/static_restartable$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/static_restartable_using_initializer$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/static_restartable_tag$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/regenerate$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/regenerate_pipeline$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/restart$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/wait_all_regenerable_tasks$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/subgraph_repeat$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/subgraph_repeat_tag$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/subgraph_repeat_regenerate$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/subgraph_repeat_regenerate_tag$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/empty_task_sync_point$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/empty_task_sync_point_tasks$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/tag_wait_api$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/task_wait_api$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/declare_deps_in_callback$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/declare_deps_after_submission$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/declare_deps_after_submission_synchronous$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/get_current_task$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/starpu_init$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/submit$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/pause_resume$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/pack$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/get_children_tasks$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/acquire_cb_insert$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/acquire_release$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/acquire_release2$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/acquire_try$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/cache$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/commute$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/commute2$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/copy$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/data_implicit_deps$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/data_lookup$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/scratch$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/sync_and_notify_data$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/sync_and_notify_data_implicit$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/dsm_stress$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/double_parameter$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/write_only_tmp_buffer$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/data_invalidation$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/dining_philosophers$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/manual_reduction$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/readers_and_writers$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/unpartition$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/sync_with_data_with_mem$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/sync_with_data_with_mem_non_blocking$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/sync_with_data_with_mem_non_blocking_implicit$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/mpi_like$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/mpi_like_async$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/critical_section_with_void_interface$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/increment_init$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/increment_redux$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/increment_redux_v2$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/increment_redux_lazy$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/handle_to_pointer$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/lazy_allocation$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/lazy_unregister$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/no_unregister$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/noreclaim$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/nowhere$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/block/block_interface$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/bcsr/bcsr_interface$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/coo/coo_interface$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/csr/csr_interface$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/matrix/matrix_interface$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/multiformat/multiformat_interface$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/multiformat/advanced/multiformat_data_release$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/multiformat/advanced/multiformat_worker$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/multiformat/advanced/same_handle$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/variable/variable_interface$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/vector/test_vector_interface$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/interfaces/void/void_interface$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/in_place_partition$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/partition_dep$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/partition_lazy$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/gpu_register$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/gpu_ptr_register$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/variable_parameters$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/wt_host$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/wt_broadcast$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/readonly$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/specific_node$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/task_with_multiple_time_the_same_handle$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/test_arbiter$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/invalidate_pending_requests$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/temporary_partition$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/redux_acquire$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ disk/disk_copy$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ disk/disk_compute$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ disk/disk_pack$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ disk/mem_reclaim$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ errorcheck/invalid_blocking_calls$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ helper/starpu_data_cpy$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ helper/starpu_create_sync_task$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ microbenchs/async_tasks_overhead$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ microbenchs/sync_tasks_overhead$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ microbenchs/tasks_overhead$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ microbenchs/tasks_size_overhead$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ microbenchs/prefetch_data_on_node$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ microbenchs/redundant_buffer$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ microbenchs/matrix_as_vector$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/init_exit_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/init_exit_02$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/environment$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/api_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/parallel_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/parallel_02$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/parallel_03$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/parallel_barrier_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/parallel_master_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/parallel_master_inline_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/parallel_single_wait_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/parallel_single_nowait_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/parallel_single_inline_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/parallel_single_copyprivate_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/parallel_single_copyprivate_inline_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/parallel_critical_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/parallel_critical_inline_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/parallel_critical_named_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/parallel_critical_named_inline_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/parallel_simple_lock_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/parallel_nested_lock_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/parallel_for_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/parallel_for_02$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/parallel_for_ordered_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/parallel_sections_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/parallel_sections_combined_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/task_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/task_02$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/taskwait_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/taskgroup_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/taskgroup_02$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/array_slice_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ openmp/cuda_task_01$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ overlap/gpu_concurrency$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ parallel_tasks/explicit_combined_worker$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ parallel_tasks/parallel_kernels$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ parallel_tasks/parallel_kernels_spmd$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ parallel_tasks/spmd_peager$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ parallel_tasks/cuda_only$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ perfmodels/regression_based$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ perfmodels/non_linear_regression_based$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ perfmodels/feed$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ perfmodels/user_base$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ perfmodels/valid_model$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ perfmodels/memory$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ sched_policies/data_locality$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ sched_policies/execute_all_tasks$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ sched_policies/prio$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ sched_policies/simple_deps$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ sched_policies/simple_cpu_gpu_sched$(EXEEXT) am__EXEEXT_3 = @STARPU_SIMGRID_TRUE@am__EXEEXT_4 = $(am__EXEEXT_3) @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@am__EXEEXT_5 = fortran90/init_01$(EXEEXT) @STARPU_LONG_CHECK_TRUE@@STARPU_SIMGRID_FALSE@am__EXEEXT_6 = main/tag_task_data_deps$(EXEEXT) \ @STARPU_LONG_CHECK_TRUE@@STARPU_SIMGRID_FALSE@ datawizard/reclaim$(EXEEXT) am__EXEEXT_7 = main/mkdtemp$(EXEEXT) main/execute_schedule$(EXEEXT) \ main/insert_task_pack$(EXEEXT) \ main/insert_task_nullcodelet$(EXEEXT) \ main/multithreaded_init$(EXEEXT) main/empty_task$(EXEEXT) \ main/empty_task_chain$(EXEEXT) \ main/starpu_worker_exists$(EXEEXT) \ main/codelet_null_callback$(EXEEXT) \ datawizard/allocate$(EXEEXT) datawizard/acquire_cb$(EXEEXT) \ datawizard/user_interaction_implicit$(EXEEXT) \ datawizard/interfaces/copy_interfaces$(EXEEXT) \ datawizard/locality$(EXEEXT) \ datawizard/simgrid-locality$(EXEEXT) \ errorcheck/starpu_init_noworker$(EXEEXT) \ errorcheck/invalid_tasks$(EXEEXT) helper/cublas_init$(EXEEXT) \ helper/cusparse_init$(EXEEXT) helper/pinned_memory$(EXEEXT) \ helper/execute_on_all$(EXEEXT) \ microbenchs/display_structures_size$(EXEEXT) \ microbenchs/local_pingpong$(EXEEXT) overlap/overlap$(EXEEXT) \ perfmodels/value_nan$(EXEEXT) $(am__EXEEXT_2) $(am__EXEEXT_4) \ $(am__EXEEXT_5) $(am__EXEEXT_6) am__installdirs = "$(DESTDIR)$(examplebindir)" \ "$(DESTDIR)$(examplebindir)" \ "$(DESTDIR)$(STARPU_OPENCL_DATAdir)" PROGRAMS = $(examplebin_PROGRAMS) $(noinst_PROGRAMS) datawizard_acquire_cb_SOURCES = datawizard/acquire_cb.c datawizard_acquire_cb_OBJECTS = acquire_cb.$(OBJEXT) datawizard_acquire_cb_LDADD = $(LDADD) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am__dirstamp = $(am__leading_dot)dirstamp datawizard_acquire_cb_insert_SOURCES = datawizard/acquire_cb_insert.c datawizard_acquire_cb_insert_OBJECTS = acquire_cb_insert.$(OBJEXT) datawizard_acquire_cb_insert_LDADD = $(LDADD) am__datawizard_acquire_release_SOURCES_DIST = \ datawizard/acquire_release.c \ datawizard/acquire_release_cuda.cu \ datawizard/acquire_release_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_1 = datawizard/acquire_release_cuda.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_2 = \ @STARPU_USE_OPENCL_TRUE@ acquire_release_opencl.$(OBJEXT) am_datawizard_acquire_release_OBJECTS = acquire_release.$(OBJEXT) \ $(am__objects_1) $(am__objects_2) datawizard_acquire_release_OBJECTS = \ $(am_datawizard_acquire_release_OBJECTS) datawizard_acquire_release_LDADD = $(LDADD) am__datawizard_acquire_release2_SOURCES_DIST = \ datawizard/acquire_release2.c \ datawizard/acquire_release_cuda.cu \ datawizard/acquire_release_opencl.c am_datawizard_acquire_release2_OBJECTS = acquire_release2.$(OBJEXT) \ $(am__objects_1) $(am__objects_2) datawizard_acquire_release2_OBJECTS = \ $(am_datawizard_acquire_release2_OBJECTS) datawizard_acquire_release2_LDADD = $(LDADD) datawizard_acquire_try_SOURCES = datawizard/acquire_try.c datawizard_acquire_try_OBJECTS = acquire_try.$(OBJEXT) datawizard_acquire_try_LDADD = $(LDADD) datawizard_allocate_SOURCES = datawizard/allocate.c datawizard_allocate_OBJECTS = allocate.$(OBJEXT) datawizard_allocate_LDADD = $(LDADD) datawizard_cache_SOURCES = datawizard/cache.c datawizard_cache_OBJECTS = cache.$(OBJEXT) datawizard_cache_LDADD = $(LDADD) datawizard_commute_SOURCES = datawizard/commute.c datawizard_commute_OBJECTS = commute.$(OBJEXT) datawizard_commute_LDADD = $(LDADD) datawizard_commute2_SOURCES = datawizard/commute2.c datawizard_commute2_OBJECTS = commute2.$(OBJEXT) datawizard_commute2_LDADD = $(LDADD) datawizard_copy_SOURCES = datawizard/copy.c datawizard_copy_OBJECTS = copy.$(OBJEXT) datawizard_copy_LDADD = $(LDADD) datawizard_critical_section_with_void_interface_SOURCES = \ datawizard/critical_section_with_void_interface.c datawizard_critical_section_with_void_interface_OBJECTS = \ critical_section_with_void_interface.$(OBJEXT) datawizard_critical_section_with_void_interface_LDADD = $(LDADD) datawizard_data_implicit_deps_SOURCES = \ datawizard/data_implicit_deps.c datawizard_data_implicit_deps_OBJECTS = data_implicit_deps.$(OBJEXT) datawizard_data_implicit_deps_LDADD = $(LDADD) datawizard_data_invalidation_SOURCES = datawizard/data_invalidation.c datawizard_data_invalidation_OBJECTS = data_invalidation.$(OBJEXT) datawizard_data_invalidation_LDADD = $(LDADD) datawizard_data_lookup_SOURCES = datawizard/data_lookup.c datawizard_data_lookup_OBJECTS = data_lookup.$(OBJEXT) datawizard_data_lookup_LDADD = $(LDADD) datawizard_dining_philosophers_SOURCES = \ datawizard/dining_philosophers.c datawizard_dining_philosophers_OBJECTS = \ dining_philosophers.$(OBJEXT) datawizard_dining_philosophers_LDADD = $(LDADD) datawizard_double_parameter_SOURCES = datawizard/double_parameter.c datawizard_double_parameter_OBJECTS = double_parameter.$(OBJEXT) datawizard_double_parameter_LDADD = $(LDADD) datawizard_dsm_stress_SOURCES = datawizard/dsm_stress.c datawizard_dsm_stress_OBJECTS = dsm_stress.$(OBJEXT) datawizard_dsm_stress_LDADD = $(LDADD) am__datawizard_gpu_ptr_register_SOURCES_DIST = \ datawizard/gpu_ptr_register.c datawizard/scal.c \ datawizard/scal_cuda.cu datawizard/scal_opencl.cl @STARPU_USE_CUDA_TRUE@am__objects_3 = datawizard/scal_cuda.$(OBJEXT) am__objects_4 = am_datawizard_gpu_ptr_register_OBJECTS = gpu_ptr_register.$(OBJEXT) \ scal.$(OBJEXT) $(am__objects_3) $(am__objects_4) datawizard_gpu_ptr_register_OBJECTS = \ $(am_datawizard_gpu_ptr_register_OBJECTS) datawizard_gpu_ptr_register_LDADD = $(LDADD) am__datawizard_gpu_register_SOURCES_DIST = datawizard/gpu_register.c \ datawizard/scal.c datawizard/scal_cuda.cu \ datawizard/scal_opencl.cl am_datawizard_gpu_register_OBJECTS = gpu_register.$(OBJEXT) \ scal.$(OBJEXT) $(am__objects_3) $(am__objects_4) datawizard_gpu_register_OBJECTS = \ $(am_datawizard_gpu_register_OBJECTS) datawizard_gpu_register_LDADD = $(LDADD) datawizard_handle_to_pointer_SOURCES = datawizard/handle_to_pointer.c datawizard_handle_to_pointer_OBJECTS = handle_to_pointer.$(OBJEXT) datawizard_handle_to_pointer_LDADD = $(LDADD) am__datawizard_in_place_partition_SOURCES_DIST = \ datawizard/in_place_partition.c datawizard/scal.c \ datawizard/scal_cuda.cu datawizard/scal_opencl.cl am_datawizard_in_place_partition_OBJECTS = \ in_place_partition.$(OBJEXT) scal.$(OBJEXT) $(am__objects_3) \ $(am__objects_4) datawizard_in_place_partition_OBJECTS = \ $(am_datawizard_in_place_partition_OBJECTS) datawizard_in_place_partition_LDADD = $(LDADD) datawizard_increment_init_SOURCES = datawizard/increment_init.c datawizard_increment_init_OBJECTS = increment_init.$(OBJEXT) datawizard_increment_init_LDADD = $(LDADD) datawizard_increment_redux_SOURCES = datawizard/increment_redux.c datawizard_increment_redux_OBJECTS = increment_redux.$(OBJEXT) datawizard_increment_redux_LDADD = $(LDADD) datawizard_increment_redux_lazy_SOURCES = \ datawizard/increment_redux_lazy.c datawizard_increment_redux_lazy_OBJECTS = \ increment_redux_lazy.$(OBJEXT) datawizard_increment_redux_lazy_LDADD = $(LDADD) datawizard_increment_redux_v2_SOURCES = \ datawizard/increment_redux_v2.c datawizard_increment_redux_v2_OBJECTS = increment_redux_v2.$(OBJEXT) datawizard_increment_redux_v2_LDADD = $(LDADD) am__datawizard_interfaces_bcsr_bcsr_interface_SOURCES_DIST = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/bcsr/bcsr_interface.c \ datawizard/interfaces/bcsr/bcsr_cuda.cu \ datawizard/interfaces/bcsr/bcsr_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_5 = datawizard/interfaces/bcsr/bcsr_cuda.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_6 = bcsr_opencl.$(OBJEXT) am_datawizard_interfaces_bcsr_bcsr_interface_OBJECTS = \ test_interfaces.$(OBJEXT) bcsr_interface.$(OBJEXT) \ $(am__objects_5) $(am__objects_6) datawizard_interfaces_bcsr_bcsr_interface_OBJECTS = \ $(am_datawizard_interfaces_bcsr_bcsr_interface_OBJECTS) datawizard_interfaces_bcsr_bcsr_interface_LDADD = $(LDADD) am__datawizard_interfaces_block_block_interface_SOURCES_DIST = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/block/block_interface.c \ datawizard/interfaces/block/block_cuda.cu \ datawizard/interfaces/block/block_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_7 = datawizard/interfaces/block/block_cuda.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_8 = block_opencl.$(OBJEXT) am_datawizard_interfaces_block_block_interface_OBJECTS = \ test_interfaces.$(OBJEXT) block_interface.$(OBJEXT) \ $(am__objects_7) $(am__objects_8) datawizard_interfaces_block_block_interface_OBJECTS = \ $(am_datawizard_interfaces_block_block_interface_OBJECTS) datawizard_interfaces_block_block_interface_LDADD = $(LDADD) am__datawizard_interfaces_coo_coo_interface_SOURCES_DIST = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/coo/coo_interface.c \ datawizard/interfaces/coo/coo_cuda.cu \ datawizard/interfaces/coo/coo_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_9 = datawizard/interfaces/coo/coo_cuda.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_10 = coo_opencl.$(OBJEXT) am_datawizard_interfaces_coo_coo_interface_OBJECTS = \ test_interfaces.$(OBJEXT) coo_interface.$(OBJEXT) \ $(am__objects_9) $(am__objects_10) datawizard_interfaces_coo_coo_interface_OBJECTS = \ $(am_datawizard_interfaces_coo_coo_interface_OBJECTS) datawizard_interfaces_coo_coo_interface_LDADD = $(LDADD) datawizard_interfaces_copy_interfaces_SOURCES = \ datawizard/interfaces/copy_interfaces.c datawizard_interfaces_copy_interfaces_OBJECTS = \ copy_interfaces.$(OBJEXT) datawizard_interfaces_copy_interfaces_LDADD = $(LDADD) am__datawizard_interfaces_csr_csr_interface_SOURCES_DIST = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/csr/csr_interface.c \ datawizard/interfaces/csr/csr_cuda.cu \ datawizard/interfaces/csr/csr_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_11 = datawizard/interfaces/csr/csr_cuda.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_12 = csr_opencl.$(OBJEXT) am_datawizard_interfaces_csr_csr_interface_OBJECTS = \ test_interfaces.$(OBJEXT) csr_interface.$(OBJEXT) \ $(am__objects_11) $(am__objects_12) datawizard_interfaces_csr_csr_interface_OBJECTS = \ $(am_datawizard_interfaces_csr_csr_interface_OBJECTS) datawizard_interfaces_csr_csr_interface_LDADD = $(LDADD) am__datawizard_interfaces_matrix_matrix_interface_SOURCES_DIST = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/matrix/matrix_interface.c \ datawizard/interfaces/matrix/matrix_cuda.cu \ datawizard/interfaces/matrix/matrix_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_13 = datawizard/interfaces/matrix/matrix_cuda.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_14 = matrix_opencl.$(OBJEXT) am_datawizard_interfaces_matrix_matrix_interface_OBJECTS = \ test_interfaces.$(OBJEXT) matrix_interface.$(OBJEXT) \ $(am__objects_13) $(am__objects_14) datawizard_interfaces_matrix_matrix_interface_OBJECTS = \ $(am_datawizard_interfaces_matrix_matrix_interface_OBJECTS) datawizard_interfaces_matrix_matrix_interface_LDADD = $(LDADD) am_datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_OBJECTS = \ generic.$(OBJEXT) multiformat_cuda_opencl.$(OBJEXT) datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_OBJECTS = $(am_datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_OBJECTS) datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_LDADD = \ $(LDADD) am_datawizard_interfaces_multiformat_advanced_multiformat_data_release_OBJECTS = \ generic.$(OBJEXT) multiformat_data_release.$(OBJEXT) datawizard_interfaces_multiformat_advanced_multiformat_data_release_OBJECTS = $(am_datawizard_interfaces_multiformat_advanced_multiformat_data_release_OBJECTS) datawizard_interfaces_multiformat_advanced_multiformat_data_release_LDADD = \ $(LDADD) am_datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_OBJECTS = \ generic.$(OBJEXT) multiformat_handle_conversion.$(OBJEXT) datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_OBJECTS = $(am_datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_OBJECTS) datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_LDADD = \ $(LDADD) am_datawizard_interfaces_multiformat_advanced_multiformat_worker_OBJECTS = \ generic.$(OBJEXT) multiformat_worker.$(OBJEXT) datawizard_interfaces_multiformat_advanced_multiformat_worker_OBJECTS = $(am_datawizard_interfaces_multiformat_advanced_multiformat_worker_OBJECTS) datawizard_interfaces_multiformat_advanced_multiformat_worker_LDADD = \ $(LDADD) am_datawizard_interfaces_multiformat_advanced_same_handle_OBJECTS = \ generic.$(OBJEXT) same_handle.$(OBJEXT) datawizard_interfaces_multiformat_advanced_same_handle_OBJECTS = $(am_datawizard_interfaces_multiformat_advanced_same_handle_OBJECTS) datawizard_interfaces_multiformat_advanced_same_handle_LDADD = \ $(LDADD) am__datawizard_interfaces_multiformat_multiformat_interface_SOURCES_DIST = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/multiformat/multiformat_interface.c \ datawizard/interfaces/multiformat/multiformat_conversion_codelets.c \ datawizard/interfaces/multiformat/multiformat_cuda.cu \ datawizard/interfaces/multiformat/multiformat_conversion_codelets_cuda.cu \ datawizard/interfaces/multiformat/multiformat_opencl.c \ datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_15 = datawizard/interfaces/multiformat/multiformat_cuda.$(OBJEXT) \ @STARPU_USE_CUDA_TRUE@ datawizard/interfaces/multiformat/multiformat_conversion_codelets_cuda.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_16 = multiformat_opencl.$(OBJEXT) \ @STARPU_USE_OPENCL_TRUE@ multiformat_conversion_codelets_opencl.$(OBJEXT) am_datawizard_interfaces_multiformat_multiformat_interface_OBJECTS = \ test_interfaces.$(OBJEXT) multiformat_interface.$(OBJEXT) \ multiformat_conversion_codelets.$(OBJEXT) $(am__objects_15) \ $(am__objects_16) datawizard_interfaces_multiformat_multiformat_interface_OBJECTS = $(am_datawizard_interfaces_multiformat_multiformat_interface_OBJECTS) datawizard_interfaces_multiformat_multiformat_interface_LDADD = \ $(LDADD) am__datawizard_interfaces_variable_variable_interface_SOURCES_DIST = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/variable/variable_interface.c \ datawizard/interfaces/variable/variable_cuda.cu \ datawizard/interfaces/variable/variable_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_17 = datawizard/interfaces/variable/variable_cuda.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_18 = variable_opencl.$(OBJEXT) am_datawizard_interfaces_variable_variable_interface_OBJECTS = \ test_interfaces.$(OBJEXT) variable_interface.$(OBJEXT) \ $(am__objects_17) $(am__objects_18) datawizard_interfaces_variable_variable_interface_OBJECTS = $(am_datawizard_interfaces_variable_variable_interface_OBJECTS) datawizard_interfaces_variable_variable_interface_LDADD = $(LDADD) am__datawizard_interfaces_vector_test_vector_interface_SOURCES_DIST = \ datawizard/interfaces/vector/test_vector_interface.c \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/vector/test_vector_cuda.cu \ datawizard/interfaces/vector/test_vector_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_19 = datawizard/interfaces/vector/test_vector_cuda.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_20 = test_vector_opencl.$(OBJEXT) am_datawizard_interfaces_vector_test_vector_interface_OBJECTS = \ test_vector_interface.$(OBJEXT) test_interfaces.$(OBJEXT) \ $(am__objects_19) $(am__objects_20) datawizard_interfaces_vector_test_vector_interface_OBJECTS = $(am_datawizard_interfaces_vector_test_vector_interface_OBJECTS) datawizard_interfaces_vector_test_vector_interface_LDADD = $(LDADD) am_datawizard_interfaces_void_void_interface_OBJECTS = \ test_interfaces.$(OBJEXT) void_interface.$(OBJEXT) datawizard_interfaces_void_void_interface_OBJECTS = \ $(am_datawizard_interfaces_void_void_interface_OBJECTS) datawizard_interfaces_void_void_interface_LDADD = $(LDADD) datawizard_invalidate_pending_requests_SOURCES = \ datawizard/invalidate_pending_requests.c datawizard_invalidate_pending_requests_OBJECTS = \ invalidate_pending_requests.$(OBJEXT) datawizard_invalidate_pending_requests_LDADD = $(LDADD) datawizard_lazy_allocation_SOURCES = datawizard/lazy_allocation.c datawizard_lazy_allocation_OBJECTS = lazy_allocation.$(OBJEXT) datawizard_lazy_allocation_LDADD = $(LDADD) datawizard_lazy_unregister_SOURCES = datawizard/lazy_unregister.c datawizard_lazy_unregister_OBJECTS = lazy_unregister.$(OBJEXT) datawizard_lazy_unregister_LDADD = $(LDADD) datawizard_locality_SOURCES = datawizard/locality.c datawizard_locality_OBJECTS = locality.$(OBJEXT) datawizard_locality_LDADD = $(LDADD) datawizard_manual_reduction_SOURCES = datawizard/manual_reduction.c datawizard_manual_reduction_OBJECTS = manual_reduction.$(OBJEXT) datawizard_manual_reduction_LDADD = $(LDADD) am__datawizard_mpi_like_SOURCES_DIST = datawizard/mpi_like.c \ datawizard/cuda_codelet_unsigned_inc.cu \ datawizard/opencl_codelet_unsigned_inc.c @STARPU_USE_CUDA_TRUE@am__objects_21 = datawizard/cuda_codelet_unsigned_inc.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_22 = \ @STARPU_USE_OPENCL_TRUE@ opencl_codelet_unsigned_inc.$(OBJEXT) am_datawizard_mpi_like_OBJECTS = mpi_like.$(OBJEXT) $(am__objects_21) \ $(am__objects_22) datawizard_mpi_like_OBJECTS = $(am_datawizard_mpi_like_OBJECTS) datawizard_mpi_like_LDADD = $(LDADD) am__datawizard_mpi_like_async_SOURCES_DIST = \ datawizard/mpi_like_async.c \ datawizard/cuda_codelet_unsigned_inc.cu \ datawizard/opencl_codelet_unsigned_inc.c am_datawizard_mpi_like_async_OBJECTS = mpi_like_async.$(OBJEXT) \ $(am__objects_21) $(am__objects_22) datawizard_mpi_like_async_OBJECTS = \ $(am_datawizard_mpi_like_async_OBJECTS) datawizard_mpi_like_async_LDADD = $(LDADD) datawizard_no_unregister_SOURCES = datawizard/no_unregister.c datawizard_no_unregister_OBJECTS = no_unregister.$(OBJEXT) datawizard_no_unregister_LDADD = $(LDADD) datawizard_noreclaim_SOURCES = datawizard/noreclaim.c datawizard_noreclaim_OBJECTS = noreclaim.$(OBJEXT) datawizard_noreclaim_LDADD = $(LDADD) datawizard_nowhere_SOURCES = datawizard/nowhere.c datawizard_nowhere_OBJECTS = nowhere.$(OBJEXT) datawizard_nowhere_LDADD = $(LDADD) am__datawizard_partition_dep_SOURCES_DIST = \ datawizard/partition_dep.c datawizard/scal.c \ datawizard/scal_cuda.cu datawizard/scal_opencl.cl am_datawizard_partition_dep_OBJECTS = partition_dep.$(OBJEXT) \ scal.$(OBJEXT) $(am__objects_3) $(am__objects_4) datawizard_partition_dep_OBJECTS = \ $(am_datawizard_partition_dep_OBJECTS) datawizard_partition_dep_LDADD = $(LDADD) am__datawizard_partition_lazy_SOURCES_DIST = \ datawizard/partition_lazy.c datawizard/scal.c \ datawizard/scal_cuda.cu datawizard/scal_opencl.cl am_datawizard_partition_lazy_OBJECTS = partition_lazy.$(OBJEXT) \ scal.$(OBJEXT) $(am__objects_3) $(am__objects_4) datawizard_partition_lazy_OBJECTS = \ $(am_datawizard_partition_lazy_OBJECTS) datawizard_partition_lazy_LDADD = $(LDADD) datawizard_readers_and_writers_SOURCES = \ datawizard/readers_and_writers.c datawizard_readers_and_writers_OBJECTS = \ readers_and_writers.$(OBJEXT) datawizard_readers_and_writers_LDADD = $(LDADD) datawizard_readonly_SOURCES = datawizard/readonly.c datawizard_readonly_OBJECTS = readonly.$(OBJEXT) datawizard_readonly_LDADD = $(LDADD) datawizard_reclaim_SOURCES = datawizard/reclaim.c datawizard_reclaim_OBJECTS = reclaim.$(OBJEXT) datawizard_reclaim_LDADD = $(LDADD) datawizard_redux_acquire_SOURCES = datawizard/redux_acquire.c datawizard_redux_acquire_OBJECTS = redux_acquire.$(OBJEXT) datawizard_redux_acquire_LDADD = $(LDADD) am__datawizard_scratch_SOURCES_DIST = datawizard/scratch.c \ datawizard/scratch_cuda.cu datawizard/scratch_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_23 = \ @STARPU_USE_CUDA_TRUE@ datawizard/scratch_cuda.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_24 = scratch_opencl.$(OBJEXT) am_datawizard_scratch_OBJECTS = scratch.$(OBJEXT) $(am__objects_23) \ $(am__objects_24) datawizard_scratch_OBJECTS = $(am_datawizard_scratch_OBJECTS) datawizard_scratch_LDADD = $(LDADD) datawizard_simgrid_locality_SOURCES = datawizard/simgrid-locality.c datawizard_simgrid_locality_OBJECTS = simgrid-locality.$(OBJEXT) datawizard_simgrid_locality_LDADD = $(LDADD) am__datawizard_specific_node_SOURCES_DIST = \ datawizard/specific_node.c \ datawizard/cuda_codelet_unsigned_inc.cu \ datawizard/opencl_codelet_unsigned_inc.c am_datawizard_specific_node_OBJECTS = specific_node.$(OBJEXT) \ $(am__objects_21) $(am__objects_22) datawizard_specific_node_OBJECTS = \ $(am_datawizard_specific_node_OBJECTS) datawizard_specific_node_LDADD = $(LDADD) am__datawizard_sync_and_notify_data_SOURCES_DIST = \ datawizard/sync_and_notify_data.c \ datawizard/sync_and_notify_data_kernels.cu \ datawizard/sync_and_notify_data_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_25 = datawizard/sync_and_notify_data_kernels.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_26 = \ @STARPU_USE_OPENCL_TRUE@ sync_and_notify_data_opencl.$(OBJEXT) am_datawizard_sync_and_notify_data_OBJECTS = \ sync_and_notify_data.$(OBJEXT) $(am__objects_25) \ $(am__objects_26) datawizard_sync_and_notify_data_OBJECTS = \ $(am_datawizard_sync_and_notify_data_OBJECTS) datawizard_sync_and_notify_data_LDADD = $(LDADD) am__datawizard_sync_and_notify_data_implicit_SOURCES_DIST = \ datawizard/sync_and_notify_data_implicit.c \ datawizard/sync_and_notify_data_kernels.cu \ datawizard/sync_and_notify_data_opencl.c am_datawizard_sync_and_notify_data_implicit_OBJECTS = \ sync_and_notify_data_implicit.$(OBJEXT) $(am__objects_25) \ $(am__objects_26) datawizard_sync_and_notify_data_implicit_OBJECTS = \ $(am_datawizard_sync_and_notify_data_implicit_OBJECTS) datawizard_sync_and_notify_data_implicit_LDADD = $(LDADD) datawizard_sync_with_data_with_mem_SOURCES = \ datawizard/sync_with_data_with_mem.c datawizard_sync_with_data_with_mem_OBJECTS = \ sync_with_data_with_mem.$(OBJEXT) datawizard_sync_with_data_with_mem_LDADD = $(LDADD) datawizard_sync_with_data_with_mem_non_blocking_SOURCES = \ datawizard/sync_with_data_with_mem_non_blocking.c datawizard_sync_with_data_with_mem_non_blocking_OBJECTS = \ sync_with_data_with_mem_non_blocking.$(OBJEXT) datawizard_sync_with_data_with_mem_non_blocking_LDADD = $(LDADD) datawizard_sync_with_data_with_mem_non_blocking_implicit_SOURCES = \ datawizard/sync_with_data_with_mem_non_blocking_implicit.c datawizard_sync_with_data_with_mem_non_blocking_implicit_OBJECTS = \ sync_with_data_with_mem_non_blocking_implicit.$(OBJEXT) datawizard_sync_with_data_with_mem_non_blocking_implicit_LDADD = \ $(LDADD) datawizard_task_with_multiple_time_the_same_handle_SOURCES = \ datawizard/task_with_multiple_time_the_same_handle.c datawizard_task_with_multiple_time_the_same_handle_OBJECTS = \ task_with_multiple_time_the_same_handle.$(OBJEXT) datawizard_task_with_multiple_time_the_same_handle_LDADD = $(LDADD) datawizard_temporary_partition_SOURCES = \ datawizard/temporary_partition.c datawizard_temporary_partition_OBJECTS = \ temporary_partition.$(OBJEXT) datawizard_temporary_partition_LDADD = $(LDADD) am_datawizard_test_arbiter_OBJECTS = test_arbiter.$(OBJEXT) datawizard_test_arbiter_OBJECTS = \ $(am_datawizard_test_arbiter_OBJECTS) datawizard_test_arbiter_LDADD = $(LDADD) datawizard_unpartition_SOURCES = datawizard/unpartition.c datawizard_unpartition_OBJECTS = unpartition.$(OBJEXT) datawizard_unpartition_LDADD = $(LDADD) datawizard_user_interaction_implicit_SOURCES = \ datawizard/user_interaction_implicit.c datawizard_user_interaction_implicit_OBJECTS = \ user_interaction_implicit.$(OBJEXT) datawizard_user_interaction_implicit_LDADD = $(LDADD) datawizard_variable_parameters_SOURCES = \ datawizard/variable_parameters.c datawizard_variable_parameters_OBJECTS = \ variable_parameters.$(OBJEXT) datawizard_variable_parameters_LDADD = $(LDADD) datawizard_write_only_tmp_buffer_SOURCES = \ datawizard/write_only_tmp_buffer.c datawizard_write_only_tmp_buffer_OBJECTS = \ write_only_tmp_buffer.$(OBJEXT) datawizard_write_only_tmp_buffer_LDADD = $(LDADD) am_datawizard_wt_broadcast_OBJECTS = wt_broadcast.$(OBJEXT) datawizard_wt_broadcast_OBJECTS = \ $(am_datawizard_wt_broadcast_OBJECTS) datawizard_wt_broadcast_LDADD = $(LDADD) am_datawizard_wt_host_OBJECTS = wt_host.$(OBJEXT) datawizard_wt_host_OBJECTS = $(am_datawizard_wt_host_OBJECTS) datawizard_wt_host_LDADD = $(LDADD) disk_disk_compute_SOURCES = disk/disk_compute.c disk_disk_compute_OBJECTS = disk_compute.$(OBJEXT) disk_disk_compute_LDADD = $(LDADD) disk_disk_copy_SOURCES = disk/disk_copy.c disk_disk_copy_OBJECTS = disk_copy.$(OBJEXT) disk_disk_copy_LDADD = $(LDADD) disk_disk_pack_SOURCES = disk/disk_pack.c disk_disk_pack_OBJECTS = disk_pack.$(OBJEXT) disk_disk_pack_LDADD = $(LDADD) disk_mem_reclaim_SOURCES = disk/mem_reclaim.c disk_mem_reclaim_OBJECTS = mem_reclaim.$(OBJEXT) disk_mem_reclaim_LDADD = $(LDADD) errorcheck_invalid_blocking_calls_SOURCES = \ errorcheck/invalid_blocking_calls.c errorcheck_invalid_blocking_calls_OBJECTS = \ invalid_blocking_calls.$(OBJEXT) errorcheck_invalid_blocking_calls_LDADD = $(LDADD) errorcheck_invalid_tasks_SOURCES = errorcheck/invalid_tasks.c errorcheck_invalid_tasks_OBJECTS = invalid_tasks.$(OBJEXT) errorcheck_invalid_tasks_LDADD = $(LDADD) errorcheck_starpu_init_noworker_SOURCES = \ errorcheck/starpu_init_noworker.c errorcheck_starpu_init_noworker_OBJECTS = \ starpu_init_noworker.$(OBJEXT) errorcheck_starpu_init_noworker_LDADD = $(LDADD) am__fortran90_init_01_SOURCES_DIST = \ $(top_srcdir)/include/starpu_mod.f90 fortran90/init_01.f90 @STARPU_HAVE_FC_TRUE@am_fortran90_init_01_OBJECTS = \ @STARPU_HAVE_FC_TRUE@ starpu_mod.$(OBJEXT) init_01.$(OBJEXT) fortran90_init_01_OBJECTS = $(am_fortran90_init_01_OBJECTS) fortran90_init_01_LDADD = $(LDADD) helper_cublas_init_SOURCES = helper/cublas_init.c helper_cublas_init_OBJECTS = cublas_init.$(OBJEXT) helper_cublas_init_LDADD = $(LDADD) helper_cusparse_init_SOURCES = helper/cusparse_init.c helper_cusparse_init_OBJECTS = cusparse_init.$(OBJEXT) helper_cusparse_init_LDADD = $(LDADD) helper_execute_on_all_SOURCES = helper/execute_on_all.c helper_execute_on_all_OBJECTS = execute_on_all.$(OBJEXT) helper_execute_on_all_LDADD = $(LDADD) helper_pinned_memory_SOURCES = helper/pinned_memory.c helper_pinned_memory_OBJECTS = pinned_memory.$(OBJEXT) helper_pinned_memory_LDADD = $(LDADD) helper_starpu_create_sync_task_SOURCES = \ helper/starpu_create_sync_task.c helper_starpu_create_sync_task_OBJECTS = \ starpu_create_sync_task.$(OBJEXT) helper_starpu_create_sync_task_LDADD = $(LDADD) helper_starpu_data_cpy_SOURCES = helper/starpu_data_cpy.c helper_starpu_data_cpy_OBJECTS = starpu_data_cpy.$(OBJEXT) helper_starpu_data_cpy_LDADD = $(LDADD) loader_SOURCES = loader.c loader_OBJECTS = loader.$(OBJEXT) loader_LDADD = $(LDADD) main_codelet_null_callback_SOURCES = main/codelet_null_callback.c main_codelet_null_callback_OBJECTS = codelet_null_callback.$(OBJEXT) main_codelet_null_callback_LDADD = $(LDADD) main_declare_deps_after_submission_SOURCES = \ main/declare_deps_after_submission.c main_declare_deps_after_submission_OBJECTS = \ declare_deps_after_submission.$(OBJEXT) main_declare_deps_after_submission_LDADD = $(LDADD) main_declare_deps_after_submission_synchronous_SOURCES = \ main/declare_deps_after_submission_synchronous.c main_declare_deps_after_submission_synchronous_OBJECTS = \ declare_deps_after_submission_synchronous.$(OBJEXT) main_declare_deps_after_submission_synchronous_LDADD = $(LDADD) main_declare_deps_in_callback_SOURCES = \ main/declare_deps_in_callback.c main_declare_deps_in_callback_OBJECTS = \ declare_deps_in_callback.$(OBJEXT) main_declare_deps_in_callback_LDADD = $(LDADD) main_deploop_SOURCES = main/deploop.c main_deploop_OBJECTS = deploop.$(OBJEXT) main_deploop_LDADD = $(LDADD) main_deprecated_func_SOURCES = main/deprecated_func.c main_deprecated_func_OBJECTS = \ main_deprecated_func-deprecated_func.$(OBJEXT) main_deprecated_func_LDADD = $(LDADD) main_deprecated_func_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(main_deprecated_func_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ main_driver_api_init_run_deinit_SOURCES = \ main/driver_api/init_run_deinit.c main_driver_api_init_run_deinit_OBJECTS = init_run_deinit.$(OBJEXT) main_driver_api_init_run_deinit_LDADD = $(LDADD) main_driver_api_run_driver_SOURCES = main/driver_api/run_driver.c main_driver_api_run_driver_OBJECTS = run_driver.$(OBJEXT) main_driver_api_run_driver_LDADD = $(LDADD) main_empty_task_SOURCES = main/empty_task.c main_empty_task_OBJECTS = empty_task.$(OBJEXT) main_empty_task_LDADD = $(LDADD) main_empty_task_chain_SOURCES = main/empty_task_chain.c main_empty_task_chain_OBJECTS = empty_task_chain.$(OBJEXT) main_empty_task_chain_LDADD = $(LDADD) main_empty_task_sync_point_SOURCES = main/empty_task_sync_point.c main_empty_task_sync_point_OBJECTS = empty_task_sync_point.$(OBJEXT) main_empty_task_sync_point_LDADD = $(LDADD) main_empty_task_sync_point_tasks_SOURCES = \ main/empty_task_sync_point_tasks.c main_empty_task_sync_point_tasks_OBJECTS = \ empty_task_sync_point_tasks.$(OBJEXT) main_empty_task_sync_point_tasks_LDADD = $(LDADD) main_execute_on_a_specific_worker_SOURCES = \ main/execute_on_a_specific_worker.c main_execute_on_a_specific_worker_OBJECTS = \ execute_on_a_specific_worker.$(OBJEXT) main_execute_on_a_specific_worker_LDADD = $(LDADD) main_execute_schedule_SOURCES = main/execute_schedule.c main_execute_schedule_OBJECTS = execute_schedule.$(OBJEXT) main_execute_schedule_LDADD = $(LDADD) main_get_children_tasks_SOURCES = main/get_children_tasks.c main_get_children_tasks_OBJECTS = get_children_tasks.$(OBJEXT) main_get_children_tasks_LDADD = $(LDADD) main_get_current_task_SOURCES = main/get_current_task.c main_get_current_task_OBJECTS = get_current_task.$(OBJEXT) main_get_current_task_LDADD = $(LDADD) main_insert_task_SOURCES = main/insert_task.c main_insert_task_OBJECTS = insert_task.$(OBJEXT) main_insert_task_LDADD = $(LDADD) main_insert_task_array_SOURCES = main/insert_task_array.c main_insert_task_array_OBJECTS = insert_task_array.$(OBJEXT) main_insert_task_array_LDADD = $(LDADD) main_insert_task_dyn_handles_SOURCES = main/insert_task_dyn_handles.c main_insert_task_dyn_handles_OBJECTS = \ insert_task_dyn_handles.$(OBJEXT) main_insert_task_dyn_handles_LDADD = $(LDADD) main_insert_task_many_SOURCES = main/insert_task_many.c main_insert_task_many_OBJECTS = insert_task_many.$(OBJEXT) main_insert_task_many_LDADD = $(LDADD) main_insert_task_nullcodelet_SOURCES = main/insert_task_nullcodelet.c main_insert_task_nullcodelet_OBJECTS = \ insert_task_nullcodelet.$(OBJEXT) main_insert_task_nullcodelet_LDADD = $(LDADD) main_insert_task_pack_SOURCES = main/insert_task_pack.c main_insert_task_pack_OBJECTS = insert_task_pack.$(OBJEXT) main_insert_task_pack_LDADD = $(LDADD) main_insert_task_value_SOURCES = main/insert_task_value.c main_insert_task_value_OBJECTS = insert_task_value.$(OBJEXT) main_insert_task_value_LDADD = $(LDADD) main_mkdtemp_SOURCES = main/mkdtemp.c main_mkdtemp_OBJECTS = mkdtemp.$(OBJEXT) main_mkdtemp_LDADD = $(LDADD) main_multithreaded_SOURCES = main/multithreaded.c main_multithreaded_OBJECTS = multithreaded.$(OBJEXT) main_multithreaded_LDADD = $(LDADD) main_multithreaded_init_SOURCES = main/multithreaded_init.c main_multithreaded_init_OBJECTS = multithreaded_init.$(OBJEXT) main_multithreaded_init_LDADD = $(LDADD) main_pack_SOURCES = main/pack.c main_pack_OBJECTS = pack.$(OBJEXT) main_pack_LDADD = $(LDADD) main_pause_resume_SOURCES = main/pause_resume.c main_pause_resume_OBJECTS = pause_resume.$(OBJEXT) main_pause_resume_LDADD = $(LDADD) main_regenerate_SOURCES = main/regenerate.c main_regenerate_OBJECTS = regenerate.$(OBJEXT) main_regenerate_LDADD = $(LDADD) main_regenerate_pipeline_SOURCES = main/regenerate_pipeline.c main_regenerate_pipeline_OBJECTS = regenerate_pipeline.$(OBJEXT) main_regenerate_pipeline_LDADD = $(LDADD) main_restart_SOURCES = main/restart.c main_restart_OBJECTS = restart.$(OBJEXT) main_restart_LDADD = $(LDADD) main_starpu_init_SOURCES = main/starpu_init.c main_starpu_init_OBJECTS = starpu_init.$(OBJEXT) main_starpu_init_LDADD = $(LDADD) main_starpu_task_bundle_SOURCES = main/starpu_task_bundle.c main_starpu_task_bundle_OBJECTS = starpu_task_bundle.$(OBJEXT) main_starpu_task_bundle_LDADD = $(LDADD) main_starpu_task_wait_SOURCES = main/starpu_task_wait.c main_starpu_task_wait_OBJECTS = starpu_task_wait.$(OBJEXT) main_starpu_task_wait_LDADD = $(LDADD) main_starpu_task_wait_for_all_SOURCES = \ main/starpu_task_wait_for_all.c main_starpu_task_wait_for_all_OBJECTS = \ starpu_task_wait_for_all.$(OBJEXT) main_starpu_task_wait_for_all_LDADD = $(LDADD) main_starpu_worker_exists_SOURCES = main/starpu_worker_exists.c main_starpu_worker_exists_OBJECTS = starpu_worker_exists.$(OBJEXT) main_starpu_worker_exists_LDADD = $(LDADD) main_static_restartable_SOURCES = main/static_restartable.c main_static_restartable_OBJECTS = static_restartable.$(OBJEXT) main_static_restartable_LDADD = $(LDADD) main_static_restartable_tag_SOURCES = main/static_restartable_tag.c main_static_restartable_tag_OBJECTS = \ static_restartable_tag.$(OBJEXT) main_static_restartable_tag_LDADD = $(LDADD) main_static_restartable_using_initializer_SOURCES = \ main/static_restartable_using_initializer.c main_static_restartable_using_initializer_OBJECTS = \ static_restartable_using_initializer.$(OBJEXT) main_static_restartable_using_initializer_LDADD = $(LDADD) am__main_subgraph_repeat_SOURCES_DIST = main/subgraph_repeat.c \ main/increment.cu @STARPU_USE_CUDA_TRUE@am__objects_27 = main/increment.$(OBJEXT) am_main_subgraph_repeat_OBJECTS = subgraph_repeat.$(OBJEXT) \ $(am__objects_27) main_subgraph_repeat_OBJECTS = $(am_main_subgraph_repeat_OBJECTS) main_subgraph_repeat_LDADD = $(LDADD) am__main_subgraph_repeat_regenerate_SOURCES_DIST = \ main/subgraph_repeat_regenerate.c main/increment.cu am_main_subgraph_repeat_regenerate_OBJECTS = \ subgraph_repeat_regenerate.$(OBJEXT) $(am__objects_27) main_subgraph_repeat_regenerate_OBJECTS = \ $(am_main_subgraph_repeat_regenerate_OBJECTS) main_subgraph_repeat_regenerate_LDADD = $(LDADD) am__main_subgraph_repeat_regenerate_tag_SOURCES_DIST = \ main/subgraph_repeat_regenerate_tag.c main/increment.cu am_main_subgraph_repeat_regenerate_tag_OBJECTS = \ subgraph_repeat_regenerate_tag.$(OBJEXT) $(am__objects_27) main_subgraph_repeat_regenerate_tag_OBJECTS = \ $(am_main_subgraph_repeat_regenerate_tag_OBJECTS) main_subgraph_repeat_regenerate_tag_LDADD = $(LDADD) am__main_subgraph_repeat_tag_SOURCES_DIST = \ main/subgraph_repeat_tag.c main/increment.cu am_main_subgraph_repeat_tag_OBJECTS = subgraph_repeat_tag.$(OBJEXT) \ $(am__objects_27) main_subgraph_repeat_tag_OBJECTS = \ $(am_main_subgraph_repeat_tag_OBJECTS) main_subgraph_repeat_tag_LDADD = $(LDADD) main_submit_SOURCES = main/submit.c main_submit_OBJECTS = submit.$(OBJEXT) main_submit_LDADD = $(LDADD) main_tag_task_data_deps_SOURCES = main/tag_task_data_deps.c main_tag_task_data_deps_OBJECTS = tag_task_data_deps.$(OBJEXT) main_tag_task_data_deps_LDADD = $(LDADD) main_tag_wait_api_SOURCES = main/tag_wait_api.c main_tag_wait_api_OBJECTS = tag_wait_api.$(OBJEXT) main_tag_wait_api_LDADD = $(LDADD) main_task_wait_api_SOURCES = main/task_wait_api.c main_task_wait_api_OBJECTS = task_wait_api.$(OBJEXT) main_task_wait_api_LDADD = $(LDADD) main_wait_all_regenerable_tasks_SOURCES = \ main/wait_all_regenerable_tasks.c main_wait_all_regenerable_tasks_OBJECTS = \ wait_all_regenerable_tasks.$(OBJEXT) main_wait_all_regenerable_tasks_LDADD = $(LDADD) microbenchs_async_tasks_overhead_SOURCES = \ microbenchs/async_tasks_overhead.c microbenchs_async_tasks_overhead_OBJECTS = \ async_tasks_overhead.$(OBJEXT) microbenchs_async_tasks_overhead_LDADD = $(LDADD) microbenchs_display_structures_size_SOURCES = \ microbenchs/display_structures_size.c microbenchs_display_structures_size_OBJECTS = \ display_structures_size.$(OBJEXT) microbenchs_display_structures_size_LDADD = $(LDADD) microbenchs_local_pingpong_SOURCES = microbenchs/local_pingpong.c microbenchs_local_pingpong_OBJECTS = local_pingpong.$(OBJEXT) microbenchs_local_pingpong_LDADD = $(LDADD) microbenchs_matrix_as_vector_SOURCES = microbenchs/matrix_as_vector.c microbenchs_matrix_as_vector_OBJECTS = matrix_as_vector.$(OBJEXT) microbenchs_matrix_as_vector_LDADD = $(LDADD) microbenchs_prefetch_data_on_node_SOURCES = \ microbenchs/prefetch_data_on_node.c microbenchs_prefetch_data_on_node_OBJECTS = \ prefetch_data_on_node.$(OBJEXT) microbenchs_prefetch_data_on_node_LDADD = $(LDADD) microbenchs_redundant_buffer_SOURCES = microbenchs/redundant_buffer.c microbenchs_redundant_buffer_OBJECTS = redundant_buffer.$(OBJEXT) microbenchs_redundant_buffer_LDADD = $(LDADD) microbenchs_sync_tasks_overhead_SOURCES = \ microbenchs/sync_tasks_overhead.c microbenchs_sync_tasks_overhead_OBJECTS = \ sync_tasks_overhead.$(OBJEXT) microbenchs_sync_tasks_overhead_LDADD = $(LDADD) microbenchs_tasks_overhead_SOURCES = microbenchs/tasks_overhead.c microbenchs_tasks_overhead_OBJECTS = tasks_overhead.$(OBJEXT) microbenchs_tasks_overhead_LDADD = $(LDADD) microbenchs_tasks_size_overhead_SOURCES = \ microbenchs/tasks_size_overhead.c microbenchs_tasks_size_overhead_OBJECTS = \ tasks_size_overhead.$(OBJEXT) microbenchs_tasks_size_overhead_LDADD = $(LDADD) am_openmp_api_01_OBJECTS = api_01.$(OBJEXT) openmp_api_01_OBJECTS = $(am_openmp_api_01_OBJECTS) openmp_api_01_LDADD = $(LDADD) am_openmp_array_slice_01_OBJECTS = array_slice_01.$(OBJEXT) openmp_array_slice_01_OBJECTS = $(am_openmp_array_slice_01_OBJECTS) openmp_array_slice_01_LDADD = $(LDADD) am_openmp_cuda_task_01_OBJECTS = cuda_task_01.$(OBJEXT) openmp_cuda_task_01_OBJECTS = $(am_openmp_cuda_task_01_OBJECTS) openmp_cuda_task_01_LDADD = $(LDADD) am_openmp_environment_OBJECTS = environment.$(OBJEXT) openmp_environment_OBJECTS = $(am_openmp_environment_OBJECTS) openmp_environment_LDADD = $(LDADD) am_openmp_init_exit_01_OBJECTS = init_exit_01.$(OBJEXT) openmp_init_exit_01_OBJECTS = $(am_openmp_init_exit_01_OBJECTS) openmp_init_exit_01_LDADD = $(LDADD) am_openmp_init_exit_02_OBJECTS = init_exit_02.$(OBJEXT) openmp_init_exit_02_OBJECTS = $(am_openmp_init_exit_02_OBJECTS) openmp_init_exit_02_LDADD = $(LDADD) am_openmp_parallel_01_OBJECTS = parallel_01.$(OBJEXT) openmp_parallel_01_OBJECTS = $(am_openmp_parallel_01_OBJECTS) openmp_parallel_01_LDADD = $(LDADD) am_openmp_parallel_02_OBJECTS = parallel_02.$(OBJEXT) openmp_parallel_02_OBJECTS = $(am_openmp_parallel_02_OBJECTS) openmp_parallel_02_LDADD = $(LDADD) am_openmp_parallel_03_OBJECTS = parallel_03.$(OBJEXT) openmp_parallel_03_OBJECTS = $(am_openmp_parallel_03_OBJECTS) openmp_parallel_03_LDADD = $(LDADD) am_openmp_parallel_barrier_01_OBJECTS = parallel_barrier_01.$(OBJEXT) openmp_parallel_barrier_01_OBJECTS = \ $(am_openmp_parallel_barrier_01_OBJECTS) openmp_parallel_barrier_01_LDADD = $(LDADD) am_openmp_parallel_critical_01_OBJECTS = \ parallel_critical_01.$(OBJEXT) openmp_parallel_critical_01_OBJECTS = \ $(am_openmp_parallel_critical_01_OBJECTS) openmp_parallel_critical_01_LDADD = $(LDADD) am_openmp_parallel_critical_inline_01_OBJECTS = \ parallel_critical_inline_01.$(OBJEXT) openmp_parallel_critical_inline_01_OBJECTS = \ $(am_openmp_parallel_critical_inline_01_OBJECTS) openmp_parallel_critical_inline_01_LDADD = $(LDADD) am_openmp_parallel_critical_named_01_OBJECTS = \ parallel_critical_named_01.$(OBJEXT) openmp_parallel_critical_named_01_OBJECTS = \ $(am_openmp_parallel_critical_named_01_OBJECTS) openmp_parallel_critical_named_01_LDADD = $(LDADD) am_openmp_parallel_critical_named_inline_01_OBJECTS = \ parallel_critical_named_inline_01.$(OBJEXT) openmp_parallel_critical_named_inline_01_OBJECTS = \ $(am_openmp_parallel_critical_named_inline_01_OBJECTS) openmp_parallel_critical_named_inline_01_LDADD = $(LDADD) am_openmp_parallel_for_01_OBJECTS = parallel_for_01.$(OBJEXT) openmp_parallel_for_01_OBJECTS = $(am_openmp_parallel_for_01_OBJECTS) openmp_parallel_for_01_LDADD = $(LDADD) am_openmp_parallel_for_02_OBJECTS = parallel_for_02.$(OBJEXT) openmp_parallel_for_02_OBJECTS = $(am_openmp_parallel_for_02_OBJECTS) openmp_parallel_for_02_LDADD = $(LDADD) am_openmp_parallel_for_ordered_01_OBJECTS = \ parallel_for_ordered_01.$(OBJEXT) openmp_parallel_for_ordered_01_OBJECTS = \ $(am_openmp_parallel_for_ordered_01_OBJECTS) openmp_parallel_for_ordered_01_LDADD = $(LDADD) am_openmp_parallel_master_01_OBJECTS = parallel_master_01.$(OBJEXT) openmp_parallel_master_01_OBJECTS = \ $(am_openmp_parallel_master_01_OBJECTS) openmp_parallel_master_01_LDADD = $(LDADD) am_openmp_parallel_master_inline_01_OBJECTS = \ parallel_master_inline_01.$(OBJEXT) openmp_parallel_master_inline_01_OBJECTS = \ $(am_openmp_parallel_master_inline_01_OBJECTS) openmp_parallel_master_inline_01_LDADD = $(LDADD) am_openmp_parallel_nested_lock_01_OBJECTS = \ parallel_nested_lock_01.$(OBJEXT) openmp_parallel_nested_lock_01_OBJECTS = \ $(am_openmp_parallel_nested_lock_01_OBJECTS) openmp_parallel_nested_lock_01_LDADD = $(LDADD) am_openmp_parallel_sections_01_OBJECTS = \ parallel_sections_01.$(OBJEXT) openmp_parallel_sections_01_OBJECTS = \ $(am_openmp_parallel_sections_01_OBJECTS) openmp_parallel_sections_01_LDADD = $(LDADD) am_openmp_parallel_sections_combined_01_OBJECTS = \ parallel_sections_combined_01.$(OBJEXT) openmp_parallel_sections_combined_01_OBJECTS = \ $(am_openmp_parallel_sections_combined_01_OBJECTS) openmp_parallel_sections_combined_01_LDADD = $(LDADD) am_openmp_parallel_simple_lock_01_OBJECTS = \ parallel_simple_lock_01.$(OBJEXT) openmp_parallel_simple_lock_01_OBJECTS = \ $(am_openmp_parallel_simple_lock_01_OBJECTS) openmp_parallel_simple_lock_01_LDADD = $(LDADD) am_openmp_parallel_single_copyprivate_01_OBJECTS = \ parallel_single_copyprivate_01.$(OBJEXT) openmp_parallel_single_copyprivate_01_OBJECTS = \ $(am_openmp_parallel_single_copyprivate_01_OBJECTS) openmp_parallel_single_copyprivate_01_LDADD = $(LDADD) am_openmp_parallel_single_copyprivate_inline_01_OBJECTS = \ parallel_single_copyprivate_inline_01.$(OBJEXT) openmp_parallel_single_copyprivate_inline_01_OBJECTS = \ $(am_openmp_parallel_single_copyprivate_inline_01_OBJECTS) openmp_parallel_single_copyprivate_inline_01_LDADD = $(LDADD) am_openmp_parallel_single_inline_01_OBJECTS = \ parallel_single_inline_01.$(OBJEXT) openmp_parallel_single_inline_01_OBJECTS = \ $(am_openmp_parallel_single_inline_01_OBJECTS) openmp_parallel_single_inline_01_LDADD = $(LDADD) am_openmp_parallel_single_nowait_01_OBJECTS = \ parallel_single_nowait_01.$(OBJEXT) openmp_parallel_single_nowait_01_OBJECTS = \ $(am_openmp_parallel_single_nowait_01_OBJECTS) openmp_parallel_single_nowait_01_LDADD = $(LDADD) am_openmp_parallel_single_wait_01_OBJECTS = \ parallel_single_wait_01.$(OBJEXT) openmp_parallel_single_wait_01_OBJECTS = \ $(am_openmp_parallel_single_wait_01_OBJECTS) openmp_parallel_single_wait_01_LDADD = $(LDADD) am_openmp_task_01_OBJECTS = task_01.$(OBJEXT) openmp_task_01_OBJECTS = $(am_openmp_task_01_OBJECTS) openmp_task_01_LDADD = $(LDADD) am_openmp_task_02_OBJECTS = task_02.$(OBJEXT) openmp_task_02_OBJECTS = $(am_openmp_task_02_OBJECTS) openmp_task_02_LDADD = $(LDADD) am_openmp_taskgroup_01_OBJECTS = taskgroup_01.$(OBJEXT) openmp_taskgroup_01_OBJECTS = $(am_openmp_taskgroup_01_OBJECTS) openmp_taskgroup_01_LDADD = $(LDADD) am_openmp_taskgroup_02_OBJECTS = taskgroup_02.$(OBJEXT) openmp_taskgroup_02_OBJECTS = $(am_openmp_taskgroup_02_OBJECTS) openmp_taskgroup_02_LDADD = $(LDADD) am_openmp_taskwait_01_OBJECTS = taskwait_01.$(OBJEXT) openmp_taskwait_01_OBJECTS = $(am_openmp_taskwait_01_OBJECTS) openmp_taskwait_01_LDADD = $(LDADD) am__overlap_gpu_concurrency_SOURCES_DIST = overlap/gpu_concurrency.c \ overlap/long_kernel.cu @STARPU_USE_CUDA_TRUE@am__objects_28 = overlap/long_kernel.$(OBJEXT) am_overlap_gpu_concurrency_OBJECTS = gpu_concurrency.$(OBJEXT) \ $(am__objects_28) overlap_gpu_concurrency_OBJECTS = \ $(am_overlap_gpu_concurrency_OBJECTS) overlap_gpu_concurrency_LDADD = $(LDADD) overlap_overlap_SOURCES = overlap/overlap.c overlap_overlap_OBJECTS = overlap.$(OBJEXT) overlap_overlap_LDADD = $(LDADD) parallel_tasks_cuda_only_SOURCES = parallel_tasks/cuda_only.c parallel_tasks_cuda_only_OBJECTS = cuda_only.$(OBJEXT) parallel_tasks_cuda_only_LDADD = $(LDADD) parallel_tasks_explicit_combined_worker_SOURCES = \ parallel_tasks/explicit_combined_worker.c parallel_tasks_explicit_combined_worker_OBJECTS = \ explicit_combined_worker.$(OBJEXT) parallel_tasks_explicit_combined_worker_LDADD = $(LDADD) parallel_tasks_parallel_kernels_SOURCES = \ parallel_tasks/parallel_kernels.c parallel_tasks_parallel_kernels_OBJECTS = parallel_kernels.$(OBJEXT) parallel_tasks_parallel_kernels_LDADD = $(LDADD) parallel_tasks_parallel_kernels_spmd_SOURCES = \ parallel_tasks/parallel_kernels_spmd.c parallel_tasks_parallel_kernels_spmd_OBJECTS = \ parallel_kernels_spmd.$(OBJEXT) parallel_tasks_parallel_kernels_spmd_LDADD = $(LDADD) parallel_tasks_spmd_peager_SOURCES = parallel_tasks/spmd_peager.c parallel_tasks_spmd_peager_OBJECTS = spmd_peager.$(OBJEXT) parallel_tasks_spmd_peager_LDADD = $(LDADD) am_perfmodels_feed_OBJECTS = feed.$(OBJEXT) perfmodels_feed_OBJECTS = $(am_perfmodels_feed_OBJECTS) perfmodels_feed_LDADD = $(LDADD) perfmodels_memory_SOURCES = perfmodels/memory.c perfmodels_memory_OBJECTS = memory.$(OBJEXT) perfmodels_memory_LDADD = $(LDADD) am__perfmodels_non_linear_regression_based_SOURCES_DIST = \ perfmodels/non_linear_regression_based.c \ perfmodels/opencl_memset.c @STARPU_USE_OPENCL_TRUE@am__objects_29 = opencl_memset.$(OBJEXT) am_perfmodels_non_linear_regression_based_OBJECTS = \ non_linear_regression_based.$(OBJEXT) $(am__objects_29) perfmodels_non_linear_regression_based_OBJECTS = \ $(am_perfmodels_non_linear_regression_based_OBJECTS) perfmodels_non_linear_regression_based_LDADD = $(LDADD) am__perfmodels_regression_based_SOURCES_DIST = \ perfmodels/regression_based.c perfmodels/opencl_memset.c am_perfmodels_regression_based_OBJECTS = regression_based.$(OBJEXT) \ $(am__objects_29) perfmodels_regression_based_OBJECTS = \ $(am_perfmodels_regression_based_OBJECTS) perfmodels_regression_based_LDADD = $(LDADD) perfmodels_user_base_SOURCES = perfmodels/user_base.c perfmodels_user_base_OBJECTS = user_base.$(OBJEXT) perfmodels_user_base_LDADD = $(LDADD) perfmodels_valid_model_SOURCES = perfmodels/valid_model.c perfmodels_valid_model_OBJECTS = valid_model.$(OBJEXT) perfmodels_valid_model_LDADD = $(LDADD) perfmodels_value_nan_SOURCES = perfmodels/value_nan.c perfmodels_value_nan_OBJECTS = value_nan.$(OBJEXT) perfmodels_value_nan_LDADD = $(LDADD) sched_policies_data_locality_SOURCES = sched_policies/data_locality.c sched_policies_data_locality_OBJECTS = data_locality.$(OBJEXT) sched_policies_data_locality_LDADD = $(LDADD) sched_policies_execute_all_tasks_SOURCES = \ sched_policies/execute_all_tasks.c sched_policies_execute_all_tasks_OBJECTS = \ execute_all_tasks.$(OBJEXT) sched_policies_execute_all_tasks_LDADD = $(LDADD) sched_policies_execute_all_tasks_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) \ $(sched_policies_execute_all_tasks_LDFLAGS) $(LDFLAGS) -o $@ sched_policies_prio_SOURCES = sched_policies/prio.c sched_policies_prio_OBJECTS = prio.$(OBJEXT) sched_policies_prio_LDADD = $(LDADD) sched_policies_simple_cpu_gpu_sched_SOURCES = \ sched_policies/simple_cpu_gpu_sched.c sched_policies_simple_cpu_gpu_sched_OBJECTS = \ simple_cpu_gpu_sched.$(OBJEXT) sched_policies_simple_cpu_gpu_sched_LDADD = $(LDADD) sched_policies_simple_deps_SOURCES = sched_policies/simple_deps.c sched_policies_simple_deps_OBJECTS = simple_deps.$(OBJEXT) sched_policies_simple_deps_LDADD = $(LDADD) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } SCRIPTS = $(examplebin_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/common -I$(top_builddir)/include -I$(top_builddir)/gcc-plugin/include/starpu-gcc -I$(top_builddir)/starpu-top depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = FCCOMPILE = $(FC) $(AM_FCFLAGS) $(FCFLAGS) LTFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS) AM_V_FC = $(am__v_FC_@AM_V@) am__v_FC_ = $(am__v_FC_@AM_DEFAULT_V@) am__v_FC_0 = @echo " FC " $@; am__v_FC_1 = FCLD = $(FC) FCLINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_FCLD = $(am__v_FCLD_@AM_V@) am__v_FCLD_ = $(am__v_FCLD_@AM_DEFAULT_V@) am__v_FCLD_0 = @echo " FCLD " $@; am__v_FCLD_1 = SOURCES = datawizard/acquire_cb.c datawizard/acquire_cb_insert.c \ $(datawizard_acquire_release_SOURCES) \ $(datawizard_acquire_release2_SOURCES) \ datawizard/acquire_try.c datawizard/allocate.c \ datawizard/cache.c datawizard/commute.c datawizard/commute2.c \ datawizard/copy.c \ datawizard/critical_section_with_void_interface.c \ datawizard/data_implicit_deps.c datawizard/data_invalidation.c \ datawizard/data_lookup.c datawizard/dining_philosophers.c \ datawizard/double_parameter.c datawizard/dsm_stress.c \ $(datawizard_gpu_ptr_register_SOURCES) \ $(datawizard_gpu_register_SOURCES) \ datawizard/handle_to_pointer.c \ $(datawizard_in_place_partition_SOURCES) \ datawizard/increment_init.c datawizard/increment_redux.c \ datawizard/increment_redux_lazy.c \ datawizard/increment_redux_v2.c \ $(datawizard_interfaces_bcsr_bcsr_interface_SOURCES) \ $(datawizard_interfaces_block_block_interface_SOURCES) \ $(datawizard_interfaces_coo_coo_interface_SOURCES) \ datawizard/interfaces/copy_interfaces.c \ $(datawizard_interfaces_csr_csr_interface_SOURCES) \ $(datawizard_interfaces_matrix_matrix_interface_SOURCES) \ $(datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_SOURCES) \ $(datawizard_interfaces_multiformat_advanced_multiformat_data_release_SOURCES) \ $(datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_SOURCES) \ $(datawizard_interfaces_multiformat_advanced_multiformat_worker_SOURCES) \ $(datawizard_interfaces_multiformat_advanced_same_handle_SOURCES) \ $(datawizard_interfaces_multiformat_multiformat_interface_SOURCES) \ $(datawizard_interfaces_variable_variable_interface_SOURCES) \ $(datawizard_interfaces_vector_test_vector_interface_SOURCES) \ $(datawizard_interfaces_void_void_interface_SOURCES) \ datawizard/invalidate_pending_requests.c \ datawizard/lazy_allocation.c datawizard/lazy_unregister.c \ datawizard/locality.c datawizard/manual_reduction.c \ $(datawizard_mpi_like_SOURCES) \ $(datawizard_mpi_like_async_SOURCES) \ datawizard/no_unregister.c datawizard/noreclaim.c \ datawizard/nowhere.c $(datawizard_partition_dep_SOURCES) \ $(datawizard_partition_lazy_SOURCES) \ datawizard/readers_and_writers.c datawizard/readonly.c \ datawizard/reclaim.c datawizard/redux_acquire.c \ $(datawizard_scratch_SOURCES) datawizard/simgrid-locality.c \ $(datawizard_specific_node_SOURCES) \ $(datawizard_sync_and_notify_data_SOURCES) \ $(datawizard_sync_and_notify_data_implicit_SOURCES) \ datawizard/sync_with_data_with_mem.c \ datawizard/sync_with_data_with_mem_non_blocking.c \ datawizard/sync_with_data_with_mem_non_blocking_implicit.c \ datawizard/task_with_multiple_time_the_same_handle.c \ datawizard/temporary_partition.c \ $(datawizard_test_arbiter_SOURCES) datawizard/unpartition.c \ datawizard/user_interaction_implicit.c \ datawizard/variable_parameters.c \ datawizard/write_only_tmp_buffer.c \ $(datawizard_wt_broadcast_SOURCES) \ $(datawizard_wt_host_SOURCES) disk/disk_compute.c \ disk/disk_copy.c disk/disk_pack.c disk/mem_reclaim.c \ errorcheck/invalid_blocking_calls.c errorcheck/invalid_tasks.c \ errorcheck/starpu_init_noworker.c $(fortran90_init_01_SOURCES) \ helper/cublas_init.c helper/cusparse_init.c \ helper/execute_on_all.c helper/pinned_memory.c \ helper/starpu_create_sync_task.c helper/starpu_data_cpy.c \ loader.c main/codelet_null_callback.c \ main/declare_deps_after_submission.c \ main/declare_deps_after_submission_synchronous.c \ main/declare_deps_in_callback.c main/deploop.c \ main/deprecated_func.c main/driver_api/init_run_deinit.c \ main/driver_api/run_driver.c main/empty_task.c \ main/empty_task_chain.c main/empty_task_sync_point.c \ main/empty_task_sync_point_tasks.c \ main/execute_on_a_specific_worker.c main/execute_schedule.c \ main/get_children_tasks.c main/get_current_task.c \ main/insert_task.c main/insert_task_array.c \ main/insert_task_dyn_handles.c main/insert_task_many.c \ main/insert_task_nullcodelet.c main/insert_task_pack.c \ main/insert_task_value.c main/mkdtemp.c main/multithreaded.c \ main/multithreaded_init.c main/pack.c main/pause_resume.c \ main/regenerate.c main/regenerate_pipeline.c main/restart.c \ main/starpu_init.c main/starpu_task_bundle.c \ main/starpu_task_wait.c main/starpu_task_wait_for_all.c \ main/starpu_worker_exists.c main/static_restartable.c \ main/static_restartable_tag.c \ main/static_restartable_using_initializer.c \ $(main_subgraph_repeat_SOURCES) \ $(main_subgraph_repeat_regenerate_SOURCES) \ $(main_subgraph_repeat_regenerate_tag_SOURCES) \ $(main_subgraph_repeat_tag_SOURCES) main/submit.c \ main/tag_task_data_deps.c main/tag_wait_api.c \ main/task_wait_api.c main/wait_all_regenerable_tasks.c \ microbenchs/async_tasks_overhead.c \ microbenchs/display_structures_size.c \ microbenchs/local_pingpong.c microbenchs/matrix_as_vector.c \ microbenchs/prefetch_data_on_node.c \ microbenchs/redundant_buffer.c \ microbenchs/sync_tasks_overhead.c microbenchs/tasks_overhead.c \ microbenchs/tasks_size_overhead.c $(openmp_api_01_SOURCES) \ $(openmp_array_slice_01_SOURCES) \ $(openmp_cuda_task_01_SOURCES) $(openmp_environment_SOURCES) \ $(openmp_init_exit_01_SOURCES) $(openmp_init_exit_02_SOURCES) \ $(openmp_parallel_01_SOURCES) $(openmp_parallel_02_SOURCES) \ $(openmp_parallel_03_SOURCES) \ $(openmp_parallel_barrier_01_SOURCES) \ $(openmp_parallel_critical_01_SOURCES) \ $(openmp_parallel_critical_inline_01_SOURCES) \ $(openmp_parallel_critical_named_01_SOURCES) \ $(openmp_parallel_critical_named_inline_01_SOURCES) \ $(openmp_parallel_for_01_SOURCES) \ $(openmp_parallel_for_02_SOURCES) \ $(openmp_parallel_for_ordered_01_SOURCES) \ $(openmp_parallel_master_01_SOURCES) \ $(openmp_parallel_master_inline_01_SOURCES) \ $(openmp_parallel_nested_lock_01_SOURCES) \ $(openmp_parallel_sections_01_SOURCES) \ $(openmp_parallel_sections_combined_01_SOURCES) \ $(openmp_parallel_simple_lock_01_SOURCES) \ $(openmp_parallel_single_copyprivate_01_SOURCES) \ $(openmp_parallel_single_copyprivate_inline_01_SOURCES) \ $(openmp_parallel_single_inline_01_SOURCES) \ $(openmp_parallel_single_nowait_01_SOURCES) \ $(openmp_parallel_single_wait_01_SOURCES) \ $(openmp_task_01_SOURCES) $(openmp_task_02_SOURCES) \ $(openmp_taskgroup_01_SOURCES) $(openmp_taskgroup_02_SOURCES) \ $(openmp_taskwait_01_SOURCES) \ $(overlap_gpu_concurrency_SOURCES) overlap/overlap.c \ parallel_tasks/cuda_only.c \ parallel_tasks/explicit_combined_worker.c \ parallel_tasks/parallel_kernels.c \ parallel_tasks/parallel_kernels_spmd.c \ parallel_tasks/spmd_peager.c $(perfmodels_feed_SOURCES) \ perfmodels/memory.c \ $(perfmodels_non_linear_regression_based_SOURCES) \ $(perfmodels_regression_based_SOURCES) perfmodels/user_base.c \ perfmodels/valid_model.c perfmodels/value_nan.c \ sched_policies/data_locality.c \ sched_policies/execute_all_tasks.c sched_policies/prio.c \ sched_policies/simple_cpu_gpu_sched.c \ sched_policies/simple_deps.c DIST_SOURCES = datawizard/acquire_cb.c datawizard/acquire_cb_insert.c \ $(am__datawizard_acquire_release_SOURCES_DIST) \ $(am__datawizard_acquire_release2_SOURCES_DIST) \ datawizard/acquire_try.c datawizard/allocate.c \ datawizard/cache.c datawizard/commute.c datawizard/commute2.c \ datawizard/copy.c \ datawizard/critical_section_with_void_interface.c \ datawizard/data_implicit_deps.c datawizard/data_invalidation.c \ datawizard/data_lookup.c datawizard/dining_philosophers.c \ datawizard/double_parameter.c datawizard/dsm_stress.c \ $(am__datawizard_gpu_ptr_register_SOURCES_DIST) \ $(am__datawizard_gpu_register_SOURCES_DIST) \ datawizard/handle_to_pointer.c \ $(am__datawizard_in_place_partition_SOURCES_DIST) \ datawizard/increment_init.c datawizard/increment_redux.c \ datawizard/increment_redux_lazy.c \ datawizard/increment_redux_v2.c \ $(am__datawizard_interfaces_bcsr_bcsr_interface_SOURCES_DIST) \ $(am__datawizard_interfaces_block_block_interface_SOURCES_DIST) \ $(am__datawizard_interfaces_coo_coo_interface_SOURCES_DIST) \ datawizard/interfaces/copy_interfaces.c \ $(am__datawizard_interfaces_csr_csr_interface_SOURCES_DIST) \ $(am__datawizard_interfaces_matrix_matrix_interface_SOURCES_DIST) \ $(datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_SOURCES) \ $(datawizard_interfaces_multiformat_advanced_multiformat_data_release_SOURCES) \ $(datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_SOURCES) \ $(datawizard_interfaces_multiformat_advanced_multiformat_worker_SOURCES) \ $(datawizard_interfaces_multiformat_advanced_same_handle_SOURCES) \ $(am__datawizard_interfaces_multiformat_multiformat_interface_SOURCES_DIST) \ $(am__datawizard_interfaces_variable_variable_interface_SOURCES_DIST) \ $(am__datawizard_interfaces_vector_test_vector_interface_SOURCES_DIST) \ $(datawizard_interfaces_void_void_interface_SOURCES) \ datawizard/invalidate_pending_requests.c \ datawizard/lazy_allocation.c datawizard/lazy_unregister.c \ datawizard/locality.c datawizard/manual_reduction.c \ $(am__datawizard_mpi_like_SOURCES_DIST) \ $(am__datawizard_mpi_like_async_SOURCES_DIST) \ datawizard/no_unregister.c datawizard/noreclaim.c \ datawizard/nowhere.c \ $(am__datawizard_partition_dep_SOURCES_DIST) \ $(am__datawizard_partition_lazy_SOURCES_DIST) \ datawizard/readers_and_writers.c datawizard/readonly.c \ datawizard/reclaim.c datawizard/redux_acquire.c \ $(am__datawizard_scratch_SOURCES_DIST) \ datawizard/simgrid-locality.c \ $(am__datawizard_specific_node_SOURCES_DIST) \ $(am__datawizard_sync_and_notify_data_SOURCES_DIST) \ $(am__datawizard_sync_and_notify_data_implicit_SOURCES_DIST) \ datawizard/sync_with_data_with_mem.c \ datawizard/sync_with_data_with_mem_non_blocking.c \ datawizard/sync_with_data_with_mem_non_blocking_implicit.c \ datawizard/task_with_multiple_time_the_same_handle.c \ datawizard/temporary_partition.c \ $(datawizard_test_arbiter_SOURCES) datawizard/unpartition.c \ datawizard/user_interaction_implicit.c \ datawizard/variable_parameters.c \ datawizard/write_only_tmp_buffer.c \ $(datawizard_wt_broadcast_SOURCES) \ $(datawizard_wt_host_SOURCES) disk/disk_compute.c \ disk/disk_copy.c disk/disk_pack.c disk/mem_reclaim.c \ errorcheck/invalid_blocking_calls.c errorcheck/invalid_tasks.c \ errorcheck/starpu_init_noworker.c \ $(am__fortran90_init_01_SOURCES_DIST) helper/cublas_init.c \ helper/cusparse_init.c helper/execute_on_all.c \ helper/pinned_memory.c helper/starpu_create_sync_task.c \ helper/starpu_data_cpy.c loader.c main/codelet_null_callback.c \ main/declare_deps_after_submission.c \ main/declare_deps_after_submission_synchronous.c \ main/declare_deps_in_callback.c main/deploop.c \ main/deprecated_func.c main/driver_api/init_run_deinit.c \ main/driver_api/run_driver.c main/empty_task.c \ main/empty_task_chain.c main/empty_task_sync_point.c \ main/empty_task_sync_point_tasks.c \ main/execute_on_a_specific_worker.c main/execute_schedule.c \ main/get_children_tasks.c main/get_current_task.c \ main/insert_task.c main/insert_task_array.c \ main/insert_task_dyn_handles.c main/insert_task_many.c \ main/insert_task_nullcodelet.c main/insert_task_pack.c \ main/insert_task_value.c main/mkdtemp.c main/multithreaded.c \ main/multithreaded_init.c main/pack.c main/pause_resume.c \ main/regenerate.c main/regenerate_pipeline.c main/restart.c \ main/starpu_init.c main/starpu_task_bundle.c \ main/starpu_task_wait.c main/starpu_task_wait_for_all.c \ main/starpu_worker_exists.c main/static_restartable.c \ main/static_restartable_tag.c \ main/static_restartable_using_initializer.c \ $(am__main_subgraph_repeat_SOURCES_DIST) \ $(am__main_subgraph_repeat_regenerate_SOURCES_DIST) \ $(am__main_subgraph_repeat_regenerate_tag_SOURCES_DIST) \ $(am__main_subgraph_repeat_tag_SOURCES_DIST) main/submit.c \ main/tag_task_data_deps.c main/tag_wait_api.c \ main/task_wait_api.c main/wait_all_regenerable_tasks.c \ microbenchs/async_tasks_overhead.c \ microbenchs/display_structures_size.c \ microbenchs/local_pingpong.c microbenchs/matrix_as_vector.c \ microbenchs/prefetch_data_on_node.c \ microbenchs/redundant_buffer.c \ microbenchs/sync_tasks_overhead.c microbenchs/tasks_overhead.c \ microbenchs/tasks_size_overhead.c $(openmp_api_01_SOURCES) \ $(openmp_array_slice_01_SOURCES) \ $(openmp_cuda_task_01_SOURCES) $(openmp_environment_SOURCES) \ $(openmp_init_exit_01_SOURCES) $(openmp_init_exit_02_SOURCES) \ $(openmp_parallel_01_SOURCES) $(openmp_parallel_02_SOURCES) \ $(openmp_parallel_03_SOURCES) \ $(openmp_parallel_barrier_01_SOURCES) \ $(openmp_parallel_critical_01_SOURCES) \ $(openmp_parallel_critical_inline_01_SOURCES) \ $(openmp_parallel_critical_named_01_SOURCES) \ $(openmp_parallel_critical_named_inline_01_SOURCES) \ $(openmp_parallel_for_01_SOURCES) \ $(openmp_parallel_for_02_SOURCES) \ $(openmp_parallel_for_ordered_01_SOURCES) \ $(openmp_parallel_master_01_SOURCES) \ $(openmp_parallel_master_inline_01_SOURCES) \ $(openmp_parallel_nested_lock_01_SOURCES) \ $(openmp_parallel_sections_01_SOURCES) \ $(openmp_parallel_sections_combined_01_SOURCES) \ $(openmp_parallel_simple_lock_01_SOURCES) \ $(openmp_parallel_single_copyprivate_01_SOURCES) \ $(openmp_parallel_single_copyprivate_inline_01_SOURCES) \ $(openmp_parallel_single_inline_01_SOURCES) \ $(openmp_parallel_single_nowait_01_SOURCES) \ $(openmp_parallel_single_wait_01_SOURCES) \ $(openmp_task_01_SOURCES) $(openmp_task_02_SOURCES) \ $(openmp_taskgroup_01_SOURCES) $(openmp_taskgroup_02_SOURCES) \ $(openmp_taskwait_01_SOURCES) \ $(am__overlap_gpu_concurrency_SOURCES_DIST) overlap/overlap.c \ parallel_tasks/cuda_only.c \ parallel_tasks/explicit_combined_worker.c \ parallel_tasks/parallel_kernels.c \ parallel_tasks/parallel_kernels_spmd.c \ parallel_tasks/spmd_peager.c $(perfmodels_feed_SOURCES) \ perfmodels/memory.c \ $(am__perfmodels_non_linear_regression_based_SOURCES_DIST) \ $(am__perfmodels_regression_based_SOURCES_DIST) \ perfmodels/user_base.c perfmodels/valid_model.c \ perfmodels/value_nan.c sched_policies/data_locality.c \ sched_policies/execute_all_tasks.c sched_policies/prio.c \ sched_policies/simple_cpu_gpu_sched.c \ sched_policies/simple_deps.c RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(nobase_STARPU_OPENCL_DATA_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ check recheck distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/loader-cross.sh.in \ $(top_srcdir)/build-aux/depcomp \ $(top_srcdir)/build-aux/test-driver $(top_srcdir)/starpu.mk DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = $(top_builddir)/src/@LIBSTARPU_LINK@ $(HWLOC_LIBS) @LIBS@ $(FXT_LIBS) LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ $(am__append_1) NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POTI_CFLAGS = @POTI_CFLAGS@ POTI_LIBS = @POTI_LIBS@ PROG_DATE = @PROG_DATE@ PROG_STAT = @PROG_STAT@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_COI_CPPFLAGS = @STARPU_COI_CPPFLAGS@ STARPU_COI_LDFLAGS = @STARPU_COI_LDFLAGS@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LEVELDB_LDFLAGS = @STARPU_LEVELDB_LDFLAGS@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RCCE_CFLAGS = @STARPU_RCCE_CFLAGS@ STARPU_RCCE_CPPFLAGS = @STARPU_RCCE_CPPFLAGS@ STARPU_RCCE_LDFLAGS = @STARPU_RCCE_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SCIF_CPPFLAGS = @STARPU_SCIF_CPPFLAGS@ STARPU_SCIF_LDFLAGS = @STARPU_SCIF_LDFLAGS@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SC_HYPERVISOR_DEBUG = @STARPU_SC_HYPERVISOR_DEBUG@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ mpifort_path = @mpifort_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ smpirun_path = @smpirun_path@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @STARPU_SIMGRID_TRUE@STARPU_PERF_MODEL_DIR = $(abs_top_srcdir)/tools/perfmodels/sampling @STARPU_SIMGRID_TRUE@STARPU_HOSTNAME = mirage @STARPU_SIMGRID_TRUE@MALLOC_PERTURB_ = 0 AM_CFLAGS = $(HWLOC_CFLAGS) $(FXT_CFLAGS) -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(STARPU_COI_CPPFLAGS) $(STARPU_SCIF_CPPFLAGS) $(GLOBAL_AM_CFLAGS) -Wno-unused AM_CPPFLAGS = -I$(top_srcdir)/include/ -I$(top_builddir)/src -I$(top_srcdir)/src/ AM_LDFLAGS = @STARPU_EXPORT_DYNAMIC@ $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) $(STARPU_COI_LDFLAGS) $(STARPU_SCIF_LDFLAGS) $(FXT_LDFLAGS) EXTRA_DIST = \ helper.h \ datawizard/locality.sh \ overlap/overlap.sh \ datawizard/scal.h \ datawizard/mpi_like.h \ microbenchs/tasks_size_overhead.sh \ microbenchs/tasks_size_overhead.gp \ datawizard/scratch_opencl_kernel.cl \ datawizard/sync_and_notify_data_opencl_codelet.cl\ datawizard/opencl_codelet_unsigned_inc_kernel.cl \ coverage/coverage.sh \ datawizard/acquire_release_opencl_kernel.cl \ datawizard/interfaces/test_interfaces.h \ datawizard/interfaces/bcsr/bcsr_opencl_kernel.cl \ datawizard/interfaces/coo/coo_opencl_kernel.cl \ datawizard/interfaces/matrix/matrix_opencl_kernel.cl \ datawizard/interfaces/variable/variable_opencl_kernel.cl \ datawizard/interfaces/vector/test_vector_opencl_kernel.cl \ datawizard/interfaces/multiformat/multiformat_types.h \ datawizard/interfaces/multiformat/multiformat_opencl_kernel.cl \ datawizard/interfaces/multiformat/multiformat_conversion_codelets_kernel.cl \ datawizard/interfaces/multiformat/advanced/generic.h \ datawizard/interfaces/csr/csr_opencl_kernel.cl \ datawizard/interfaces/block/block_opencl_kernel.cl \ perfmodels/opencl_memset_kernel.cl \ $(MICROBENCHS:=.sh) \ microbenchs/microbench.sh CLEANFILES = \ *.gcno *.gcda *.linkinfo core starpu_idle_microsec.log *.mod BUILT_SOURCES = SUBDIRS = examplebindir = $(libdir)/starpu/examples @STARPU_USE_OPENCL_TRUE@nobase_STARPU_OPENCL_DATA_DATA = datawizard/acquire_release_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ datawizard/scratch_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ datawizard/opencl_codelet_unsigned_inc_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ datawizard/sync_and_notify_data_opencl_codelet.cl \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/block/block_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/bcsr/bcsr_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/coo/coo_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/csr/csr_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/vector/test_vector_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/matrix/matrix_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/multiformat/multiformat_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/multiformat/multiformat_conversion_codelets_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/variable/variable_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ perfmodels/opencl_memset_kernel.cl testbindir = $(libdir)/starpu/tests ##################################### # What to install and what to check # ##################################### @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@LOADER = loader @STARPU_CROSS_COMPILING_TRUE@@STARPU_HAVE_WINDOWS_FALSE@LOADER = @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@LOADER_BIN = $(abs_top_builddir)/tests/$(LOADER) @STARPU_CROSS_COMPILING_TRUE@@STARPU_HAVE_WINDOWS_FALSE@LOADER_BIN = $(top_builddir)/tests/loader-cross.sh @STARPU_HAVE_AM111_FALSE@@STARPU_HAVE_WINDOWS_FALSE@TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(LOADER_BIN) @STARPU_HAVE_AM111_TRUE@@STARPU_HAVE_WINDOWS_FALSE@TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" @STARPU_HAVE_AM111_TRUE@@STARPU_HAVE_WINDOWS_FALSE@LOG_COMPILER = $(LOADER_BIN) MICROBENCHS = examplebin_SCRIPTS = \ microbenchs/tasks_size_overhead.gp \ microbenchs/tasks_size_overhead.sh ####################### # Source files # ####################### datawizard_acquire_release_SOURCES = datawizard/acquire_release.c \ $(am__append_8) $(am__append_9) datawizard_acquire_release2_SOURCES = datawizard/acquire_release2.c \ $(am__append_10) $(am__append_11) datawizard_scratch_SOURCES = datawizard/scratch.c $(am__append_12) \ $(am__append_13) datawizard_mpi_like_SOURCES = datawizard/mpi_like.c $(am__append_14) \ $(am__append_15) datawizard_mpi_like_async_SOURCES = datawizard/mpi_like_async.c \ $(am__append_16) $(am__append_17) datawizard_sync_and_notify_data_SOURCES = \ datawizard/sync_and_notify_data.c $(am__append_18) \ $(am__append_19) datawizard_sync_and_notify_data_implicit_SOURCES = \ datawizard/sync_and_notify_data_implicit.c $(am__append_20) \ $(am__append_21) datawizard_in_place_partition_SOURCES = \ datawizard/in_place_partition.c datawizard/scal.c \ $(am__append_22) $(am__append_23) datawizard_partition_dep_SOURCES = datawizard/partition_dep.c \ datawizard/scal.c $(am__append_24) $(am__append_25) datawizard_partition_lazy_SOURCES = datawizard/partition_lazy.c \ datawizard/scal.c $(am__append_26) $(am__append_27) datawizard_gpu_register_SOURCES = datawizard/gpu_register.c \ datawizard/scal.c $(am__append_28) $(am__append_29) datawizard_gpu_ptr_register_SOURCES = datawizard/gpu_ptr_register.c \ datawizard/scal.c $(am__append_30) $(am__append_31) datawizard_wt_host_SOURCES = \ datawizard/wt_host.c datawizard_wt_broadcast_SOURCES = \ datawizard/wt_broadcast.c datawizard_specific_node_SOURCES = datawizard/specific_node.c \ $(am__append_32) $(am__append_33) datawizard_test_arbiter_SOURCES = \ datawizard/test_arbiter.cpp main_deprecated_func_CFLAGS = $(AM_CFLAGS) -Wno-deprecated-declarations main_subgraph_repeat_SOURCES = main/subgraph_repeat.c $(am__append_34) main_subgraph_repeat_tag_SOURCES = main/subgraph_repeat_tag.c \ $(am__append_35) main_subgraph_repeat_regenerate_SOURCES = \ main/subgraph_repeat_regenerate.c $(am__append_36) main_subgraph_repeat_regenerate_tag_SOURCES = \ main/subgraph_repeat_regenerate_tag.c $(am__append_37) openmp_init_exit_01_SOURCES = \ openmp/init_exit_01.c openmp_init_exit_02_SOURCES = \ openmp/init_exit_02.c openmp_environment_SOURCES = \ openmp/environment.c openmp_api_01_SOURCES = \ openmp/api_01.c openmp_parallel_01_SOURCES = \ openmp/parallel_01.c openmp_parallel_02_SOURCES = \ openmp/parallel_02.c openmp_parallel_03_SOURCES = \ openmp/parallel_03.c openmp_parallel_barrier_01_SOURCES = \ openmp/parallel_barrier_01.c openmp_parallel_master_01_SOURCES = \ openmp/parallel_master_01.c openmp_parallel_master_inline_01_SOURCES = \ openmp/parallel_master_inline_01.c openmp_parallel_single_wait_01_SOURCES = \ openmp/parallel_single_wait_01.c openmp_parallel_single_nowait_01_SOURCES = \ openmp/parallel_single_nowait_01.c openmp_parallel_single_inline_01_SOURCES = \ openmp/parallel_single_inline_01.c openmp_parallel_single_copyprivate_01_SOURCES = \ openmp/parallel_single_copyprivate_01.c openmp_parallel_single_copyprivate_inline_01_SOURCES = \ openmp/parallel_single_copyprivate_inline_01.c openmp_parallel_critical_01_SOURCES = \ openmp/parallel_critical_01.c openmp_parallel_critical_inline_01_SOURCES = \ openmp/parallel_critical_inline_01.c openmp_parallel_critical_named_01_SOURCES = \ openmp/parallel_critical_named_01.c openmp_parallel_critical_named_inline_01_SOURCES = \ openmp/parallel_critical_named_inline_01.c openmp_parallel_simple_lock_01_SOURCES = \ openmp/parallel_simple_lock_01.c openmp_parallel_nested_lock_01_SOURCES = \ openmp/parallel_nested_lock_01.c openmp_parallel_for_01_SOURCES = \ openmp/parallel_for_01.c openmp_parallel_for_02_SOURCES = \ openmp/parallel_for_02.c openmp_parallel_for_ordered_01_SOURCES = \ openmp/parallel_for_ordered_01.c openmp_parallel_sections_01_SOURCES = \ openmp/parallel_sections_01.c openmp_parallel_sections_combined_01_SOURCES = \ openmp/parallel_sections_combined_01.c openmp_task_01_SOURCES = \ openmp/task_01.c openmp_task_02_SOURCES = \ openmp/task_02.c openmp_taskwait_01_SOURCES = \ openmp/taskwait_01.c openmp_taskgroup_01_SOURCES = \ openmp/taskgroup_01.c openmp_taskgroup_02_SOURCES = \ openmp/taskgroup_02.c openmp_array_slice_01_SOURCES = \ openmp/array_slice_01.c openmp_cuda_task_01_SOURCES = \ openmp/cuda_task_01.c @STARPU_HAVE_FC_TRUE@fortran90_init_01_SOURCES = \ @STARPU_HAVE_FC_TRUE@ $(top_srcdir)/include/starpu_mod.f90 \ @STARPU_HAVE_FC_TRUE@ fortran90/init_01.f90 ################### # Block interface # ################### datawizard_interfaces_block_block_interface_SOURCES = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/block/block_interface.c $(am__append_38) \ $(am__append_39) ################## # BSCR interface # ################## datawizard_interfaces_bcsr_bcsr_interface_SOURCES = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/bcsr/bcsr_interface.c $(am__append_40) \ $(am__append_41) ################# # COO interface # ################# datawizard_interfaces_coo_coo_interface_SOURCES = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/coo/coo_interface.c $(am__append_42) \ $(am__append_43) ################# # CSR interface # ################# datawizard_interfaces_csr_csr_interface_SOURCES = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/csr/csr_interface.c $(am__append_44) \ $(am__append_45) datawizard_interfaces_vector_test_vector_interface_SOURCES = \ datawizard/interfaces/vector/test_vector_interface.c \ datawizard/interfaces/test_interfaces.c $(am__append_46) \ $(am__append_47) #################### # Matrix interface # #################### datawizard_interfaces_matrix_matrix_interface_SOURCES = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/matrix/matrix_interface.c \ $(am__append_48) $(am__append_49) ######################### # Multiformat interface # ######################### datawizard_interfaces_multiformat_multiformat_interface_SOURCES = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/multiformat/multiformat_interface.c \ datawizard/interfaces/multiformat/multiformat_conversion_codelets.c \ $(am__append_50) $(am__append_51) datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_SOURCES = \ datawizard/interfaces/multiformat/advanced/generic.c \ datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c datawizard_interfaces_multiformat_advanced_multiformat_data_release_SOURCES = \ datawizard/interfaces/multiformat/advanced/generic.c \ datawizard/interfaces/multiformat/advanced/multiformat_data_release.c datawizard_interfaces_multiformat_advanced_multiformat_worker_SOURCES = \ datawizard/interfaces/multiformat/advanced/generic.c \ datawizard/interfaces/multiformat/advanced/multiformat_worker.c datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_SOURCES = \ datawizard/interfaces/multiformat/advanced/generic.c \ datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c datawizard_interfaces_multiformat_advanced_same_handle_SOURCES = \ datawizard/interfaces/multiformat/advanced/generic.c \ datawizard/interfaces/multiformat/advanced/same_handle.c datawizard_interfaces_variable_variable_interface_SOURCES = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/variable/variable_interface.c \ $(am__append_52) $(am__append_53) ################## # Void interface # ################## datawizard_interfaces_void_void_interface_SOURCES = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/void/void_interface.c overlap_gpu_concurrency_SOURCES = overlap/gpu_concurrency.c \ $(am__append_54) perfmodels_regression_based_SOURCES = perfmodels/regression_based.c \ $(am__append_55) perfmodels_non_linear_regression_based_SOURCES = \ perfmodels/non_linear_regression_based.c $(am__append_56) perfmodels_feed_SOURCES = \ perfmodels/feed.c sched_policies_execute_all_tasks_LDFLAGS = $(AM_LDFLAGS) -lm all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .c .cpp .cu .cubin .f90 .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/starpu.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/starpu.mk $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): loader-cross.sh: $(top_builddir)/config.status $(srcdir)/loader-cross.sh.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-examplebinPROGRAMS: $(examplebin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(examplebin_PROGRAMS)'; test -n "$(examplebindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(examplebindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(examplebindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(examplebindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(examplebindir)$$dir" || exit $$?; \ } \ ; done uninstall-examplebinPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(examplebin_PROGRAMS)'; test -n "$(examplebindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(examplebindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(examplebindir)" && rm -f $$files clean-examplebinPROGRAMS: @list='$(examplebin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list datawizard/$(am__dirstamp): @$(MKDIR_P) datawizard @: > datawizard/$(am__dirstamp) datawizard/acquire_cb$(EXEEXT): $(datawizard_acquire_cb_OBJECTS) $(datawizard_acquire_cb_DEPENDENCIES) $(EXTRA_datawizard_acquire_cb_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/acquire_cb$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_acquire_cb_OBJECTS) $(datawizard_acquire_cb_LDADD) $(LIBS) datawizard/acquire_cb_insert$(EXEEXT): $(datawizard_acquire_cb_insert_OBJECTS) $(datawizard_acquire_cb_insert_DEPENDENCIES) $(EXTRA_datawizard_acquire_cb_insert_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/acquire_cb_insert$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_acquire_cb_insert_OBJECTS) $(datawizard_acquire_cb_insert_LDADD) $(LIBS) datawizard/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) datawizard/$(DEPDIR) @: > datawizard/$(DEPDIR)/$(am__dirstamp) datawizard/acquire_release_cuda.$(OBJEXT): datawizard/$(am__dirstamp) \ datawizard/$(DEPDIR)/$(am__dirstamp) datawizard/acquire_release$(EXEEXT): $(datawizard_acquire_release_OBJECTS) $(datawizard_acquire_release_DEPENDENCIES) $(EXTRA_datawizard_acquire_release_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/acquire_release$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_acquire_release_OBJECTS) $(datawizard_acquire_release_LDADD) $(LIBS) datawizard/acquire_release2$(EXEEXT): $(datawizard_acquire_release2_OBJECTS) $(datawizard_acquire_release2_DEPENDENCIES) $(EXTRA_datawizard_acquire_release2_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/acquire_release2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_acquire_release2_OBJECTS) $(datawizard_acquire_release2_LDADD) $(LIBS) datawizard/acquire_try$(EXEEXT): $(datawizard_acquire_try_OBJECTS) $(datawizard_acquire_try_DEPENDENCIES) $(EXTRA_datawizard_acquire_try_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/acquire_try$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_acquire_try_OBJECTS) $(datawizard_acquire_try_LDADD) $(LIBS) datawizard/allocate$(EXEEXT): $(datawizard_allocate_OBJECTS) $(datawizard_allocate_DEPENDENCIES) $(EXTRA_datawizard_allocate_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/allocate$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_allocate_OBJECTS) $(datawizard_allocate_LDADD) $(LIBS) datawizard/cache$(EXEEXT): $(datawizard_cache_OBJECTS) $(datawizard_cache_DEPENDENCIES) $(EXTRA_datawizard_cache_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/cache$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_cache_OBJECTS) $(datawizard_cache_LDADD) $(LIBS) datawizard/commute$(EXEEXT): $(datawizard_commute_OBJECTS) $(datawizard_commute_DEPENDENCIES) $(EXTRA_datawizard_commute_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/commute$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_commute_OBJECTS) $(datawizard_commute_LDADD) $(LIBS) datawizard/commute2$(EXEEXT): $(datawizard_commute2_OBJECTS) $(datawizard_commute2_DEPENDENCIES) $(EXTRA_datawizard_commute2_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/commute2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_commute2_OBJECTS) $(datawizard_commute2_LDADD) $(LIBS) datawizard/copy$(EXEEXT): $(datawizard_copy_OBJECTS) $(datawizard_copy_DEPENDENCIES) $(EXTRA_datawizard_copy_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/copy$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_copy_OBJECTS) $(datawizard_copy_LDADD) $(LIBS) datawizard/critical_section_with_void_interface$(EXEEXT): $(datawizard_critical_section_with_void_interface_OBJECTS) $(datawizard_critical_section_with_void_interface_DEPENDENCIES) $(EXTRA_datawizard_critical_section_with_void_interface_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/critical_section_with_void_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_critical_section_with_void_interface_OBJECTS) $(datawizard_critical_section_with_void_interface_LDADD) $(LIBS) datawizard/data_implicit_deps$(EXEEXT): $(datawizard_data_implicit_deps_OBJECTS) $(datawizard_data_implicit_deps_DEPENDENCIES) $(EXTRA_datawizard_data_implicit_deps_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/data_implicit_deps$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_data_implicit_deps_OBJECTS) $(datawizard_data_implicit_deps_LDADD) $(LIBS) datawizard/data_invalidation$(EXEEXT): $(datawizard_data_invalidation_OBJECTS) $(datawizard_data_invalidation_DEPENDENCIES) $(EXTRA_datawizard_data_invalidation_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/data_invalidation$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_data_invalidation_OBJECTS) $(datawizard_data_invalidation_LDADD) $(LIBS) datawizard/data_lookup$(EXEEXT): $(datawizard_data_lookup_OBJECTS) $(datawizard_data_lookup_DEPENDENCIES) $(EXTRA_datawizard_data_lookup_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/data_lookup$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_data_lookup_OBJECTS) $(datawizard_data_lookup_LDADD) $(LIBS) datawizard/dining_philosophers$(EXEEXT): $(datawizard_dining_philosophers_OBJECTS) $(datawizard_dining_philosophers_DEPENDENCIES) $(EXTRA_datawizard_dining_philosophers_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/dining_philosophers$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_dining_philosophers_OBJECTS) $(datawizard_dining_philosophers_LDADD) $(LIBS) datawizard/double_parameter$(EXEEXT): $(datawizard_double_parameter_OBJECTS) $(datawizard_double_parameter_DEPENDENCIES) $(EXTRA_datawizard_double_parameter_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/double_parameter$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_double_parameter_OBJECTS) $(datawizard_double_parameter_LDADD) $(LIBS) datawizard/dsm_stress$(EXEEXT): $(datawizard_dsm_stress_OBJECTS) $(datawizard_dsm_stress_DEPENDENCIES) $(EXTRA_datawizard_dsm_stress_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/dsm_stress$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_dsm_stress_OBJECTS) $(datawizard_dsm_stress_LDADD) $(LIBS) datawizard/scal_cuda.$(OBJEXT): datawizard/$(am__dirstamp) \ datawizard/$(DEPDIR)/$(am__dirstamp) datawizard/gpu_ptr_register$(EXEEXT): $(datawizard_gpu_ptr_register_OBJECTS) $(datawizard_gpu_ptr_register_DEPENDENCIES) $(EXTRA_datawizard_gpu_ptr_register_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/gpu_ptr_register$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_gpu_ptr_register_OBJECTS) $(datawizard_gpu_ptr_register_LDADD) $(LIBS) datawizard/gpu_register$(EXEEXT): $(datawizard_gpu_register_OBJECTS) $(datawizard_gpu_register_DEPENDENCIES) $(EXTRA_datawizard_gpu_register_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/gpu_register$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_gpu_register_OBJECTS) $(datawizard_gpu_register_LDADD) $(LIBS) datawizard/handle_to_pointer$(EXEEXT): $(datawizard_handle_to_pointer_OBJECTS) $(datawizard_handle_to_pointer_DEPENDENCIES) $(EXTRA_datawizard_handle_to_pointer_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/handle_to_pointer$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_handle_to_pointer_OBJECTS) $(datawizard_handle_to_pointer_LDADD) $(LIBS) datawizard/in_place_partition$(EXEEXT): $(datawizard_in_place_partition_OBJECTS) $(datawizard_in_place_partition_DEPENDENCIES) $(EXTRA_datawizard_in_place_partition_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/in_place_partition$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_in_place_partition_OBJECTS) $(datawizard_in_place_partition_LDADD) $(LIBS) datawizard/increment_init$(EXEEXT): $(datawizard_increment_init_OBJECTS) $(datawizard_increment_init_DEPENDENCIES) $(EXTRA_datawizard_increment_init_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/increment_init$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_increment_init_OBJECTS) $(datawizard_increment_init_LDADD) $(LIBS) datawizard/increment_redux$(EXEEXT): $(datawizard_increment_redux_OBJECTS) $(datawizard_increment_redux_DEPENDENCIES) $(EXTRA_datawizard_increment_redux_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/increment_redux$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_increment_redux_OBJECTS) $(datawizard_increment_redux_LDADD) $(LIBS) datawizard/increment_redux_lazy$(EXEEXT): $(datawizard_increment_redux_lazy_OBJECTS) $(datawizard_increment_redux_lazy_DEPENDENCIES) $(EXTRA_datawizard_increment_redux_lazy_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/increment_redux_lazy$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_increment_redux_lazy_OBJECTS) $(datawizard_increment_redux_lazy_LDADD) $(LIBS) datawizard/increment_redux_v2$(EXEEXT): $(datawizard_increment_redux_v2_OBJECTS) $(datawizard_increment_redux_v2_DEPENDENCIES) $(EXTRA_datawizard_increment_redux_v2_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/increment_redux_v2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_increment_redux_v2_OBJECTS) $(datawizard_increment_redux_v2_LDADD) $(LIBS) datawizard/interfaces/bcsr/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/bcsr @: > datawizard/interfaces/bcsr/$(am__dirstamp) datawizard/interfaces/bcsr/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/bcsr/$(DEPDIR) @: > datawizard/interfaces/bcsr/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/bcsr/bcsr_cuda.$(OBJEXT): \ datawizard/interfaces/bcsr/$(am__dirstamp) \ datawizard/interfaces/bcsr/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/bcsr/bcsr_interface$(EXEEXT): $(datawizard_interfaces_bcsr_bcsr_interface_OBJECTS) $(datawizard_interfaces_bcsr_bcsr_interface_DEPENDENCIES) $(EXTRA_datawizard_interfaces_bcsr_bcsr_interface_DEPENDENCIES) datawizard/interfaces/bcsr/$(am__dirstamp) @rm -f datawizard/interfaces/bcsr/bcsr_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_bcsr_bcsr_interface_OBJECTS) $(datawizard_interfaces_bcsr_bcsr_interface_LDADD) $(LIBS) datawizard/interfaces/block/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/block @: > datawizard/interfaces/block/$(am__dirstamp) datawizard/interfaces/block/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/block/$(DEPDIR) @: > datawizard/interfaces/block/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/block/block_cuda.$(OBJEXT): \ datawizard/interfaces/block/$(am__dirstamp) \ datawizard/interfaces/block/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/block/block_interface$(EXEEXT): $(datawizard_interfaces_block_block_interface_OBJECTS) $(datawizard_interfaces_block_block_interface_DEPENDENCIES) $(EXTRA_datawizard_interfaces_block_block_interface_DEPENDENCIES) datawizard/interfaces/block/$(am__dirstamp) @rm -f datawizard/interfaces/block/block_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_block_block_interface_OBJECTS) $(datawizard_interfaces_block_block_interface_LDADD) $(LIBS) datawizard/interfaces/coo/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/coo @: > datawizard/interfaces/coo/$(am__dirstamp) datawizard/interfaces/coo/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/coo/$(DEPDIR) @: > datawizard/interfaces/coo/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/coo/coo_cuda.$(OBJEXT): \ datawizard/interfaces/coo/$(am__dirstamp) \ datawizard/interfaces/coo/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/coo/coo_interface$(EXEEXT): $(datawizard_interfaces_coo_coo_interface_OBJECTS) $(datawizard_interfaces_coo_coo_interface_DEPENDENCIES) $(EXTRA_datawizard_interfaces_coo_coo_interface_DEPENDENCIES) datawizard/interfaces/coo/$(am__dirstamp) @rm -f datawizard/interfaces/coo/coo_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_coo_coo_interface_OBJECTS) $(datawizard_interfaces_coo_coo_interface_LDADD) $(LIBS) datawizard/interfaces/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces @: > datawizard/interfaces/$(am__dirstamp) datawizard/interfaces/copy_interfaces$(EXEEXT): $(datawizard_interfaces_copy_interfaces_OBJECTS) $(datawizard_interfaces_copy_interfaces_DEPENDENCIES) $(EXTRA_datawizard_interfaces_copy_interfaces_DEPENDENCIES) datawizard/interfaces/$(am__dirstamp) @rm -f datawizard/interfaces/copy_interfaces$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_copy_interfaces_OBJECTS) $(datawizard_interfaces_copy_interfaces_LDADD) $(LIBS) datawizard/interfaces/csr/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/csr @: > datawizard/interfaces/csr/$(am__dirstamp) datawizard/interfaces/csr/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/csr/$(DEPDIR) @: > datawizard/interfaces/csr/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/csr/csr_cuda.$(OBJEXT): \ datawizard/interfaces/csr/$(am__dirstamp) \ datawizard/interfaces/csr/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/csr/csr_interface$(EXEEXT): $(datawizard_interfaces_csr_csr_interface_OBJECTS) $(datawizard_interfaces_csr_csr_interface_DEPENDENCIES) $(EXTRA_datawizard_interfaces_csr_csr_interface_DEPENDENCIES) datawizard/interfaces/csr/$(am__dirstamp) @rm -f datawizard/interfaces/csr/csr_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_csr_csr_interface_OBJECTS) $(datawizard_interfaces_csr_csr_interface_LDADD) $(LIBS) datawizard/interfaces/matrix/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/matrix @: > datawizard/interfaces/matrix/$(am__dirstamp) datawizard/interfaces/matrix/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/matrix/$(DEPDIR) @: > datawizard/interfaces/matrix/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/matrix/matrix_cuda.$(OBJEXT): \ datawizard/interfaces/matrix/$(am__dirstamp) \ datawizard/interfaces/matrix/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/matrix/matrix_interface$(EXEEXT): $(datawizard_interfaces_matrix_matrix_interface_OBJECTS) $(datawizard_interfaces_matrix_matrix_interface_DEPENDENCIES) $(EXTRA_datawizard_interfaces_matrix_matrix_interface_DEPENDENCIES) datawizard/interfaces/matrix/$(am__dirstamp) @rm -f datawizard/interfaces/matrix/matrix_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_matrix_matrix_interface_OBJECTS) $(datawizard_interfaces_matrix_matrix_interface_LDADD) $(LIBS) datawizard/interfaces/multiformat/advanced/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/multiformat/advanced @: > datawizard/interfaces/multiformat/advanced/$(am__dirstamp) datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl$(EXEEXT): $(datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_OBJECTS) $(datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_DEPENDENCIES) $(EXTRA_datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_DEPENDENCIES) datawizard/interfaces/multiformat/advanced/$(am__dirstamp) @rm -f datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_OBJECTS) $(datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_LDADD) $(LIBS) datawizard/interfaces/multiformat/advanced/multiformat_data_release$(EXEEXT): $(datawizard_interfaces_multiformat_advanced_multiformat_data_release_OBJECTS) $(datawizard_interfaces_multiformat_advanced_multiformat_data_release_DEPENDENCIES) $(EXTRA_datawizard_interfaces_multiformat_advanced_multiformat_data_release_DEPENDENCIES) datawizard/interfaces/multiformat/advanced/$(am__dirstamp) @rm -f datawizard/interfaces/multiformat/advanced/multiformat_data_release$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_multiformat_advanced_multiformat_data_release_OBJECTS) $(datawizard_interfaces_multiformat_advanced_multiformat_data_release_LDADD) $(LIBS) datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion$(EXEEXT): $(datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_OBJECTS) $(datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_DEPENDENCIES) $(EXTRA_datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_DEPENDENCIES) datawizard/interfaces/multiformat/advanced/$(am__dirstamp) @rm -f datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_OBJECTS) $(datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_LDADD) $(LIBS) datawizard/interfaces/multiformat/advanced/multiformat_worker$(EXEEXT): $(datawizard_interfaces_multiformat_advanced_multiformat_worker_OBJECTS) $(datawizard_interfaces_multiformat_advanced_multiformat_worker_DEPENDENCIES) $(EXTRA_datawizard_interfaces_multiformat_advanced_multiformat_worker_DEPENDENCIES) datawizard/interfaces/multiformat/advanced/$(am__dirstamp) @rm -f datawizard/interfaces/multiformat/advanced/multiformat_worker$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_multiformat_advanced_multiformat_worker_OBJECTS) $(datawizard_interfaces_multiformat_advanced_multiformat_worker_LDADD) $(LIBS) datawizard/interfaces/multiformat/advanced/same_handle$(EXEEXT): $(datawizard_interfaces_multiformat_advanced_same_handle_OBJECTS) $(datawizard_interfaces_multiformat_advanced_same_handle_DEPENDENCIES) $(EXTRA_datawizard_interfaces_multiformat_advanced_same_handle_DEPENDENCIES) datawizard/interfaces/multiformat/advanced/$(am__dirstamp) @rm -f datawizard/interfaces/multiformat/advanced/same_handle$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_multiformat_advanced_same_handle_OBJECTS) $(datawizard_interfaces_multiformat_advanced_same_handle_LDADD) $(LIBS) datawizard/interfaces/multiformat/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/multiformat @: > datawizard/interfaces/multiformat/$(am__dirstamp) datawizard/interfaces/multiformat/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/multiformat/$(DEPDIR) @: > datawizard/interfaces/multiformat/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/multiformat/multiformat_cuda.$(OBJEXT): \ datawizard/interfaces/multiformat/$(am__dirstamp) \ datawizard/interfaces/multiformat/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/multiformat/multiformat_conversion_codelets_cuda.$(OBJEXT): \ datawizard/interfaces/multiformat/$(am__dirstamp) \ datawizard/interfaces/multiformat/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/multiformat/multiformat_interface$(EXEEXT): $(datawizard_interfaces_multiformat_multiformat_interface_OBJECTS) $(datawizard_interfaces_multiformat_multiformat_interface_DEPENDENCIES) $(EXTRA_datawizard_interfaces_multiformat_multiformat_interface_DEPENDENCIES) datawizard/interfaces/multiformat/$(am__dirstamp) @rm -f datawizard/interfaces/multiformat/multiformat_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_multiformat_multiformat_interface_OBJECTS) $(datawizard_interfaces_multiformat_multiformat_interface_LDADD) $(LIBS) datawizard/interfaces/variable/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/variable @: > datawizard/interfaces/variable/$(am__dirstamp) datawizard/interfaces/variable/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/variable/$(DEPDIR) @: > datawizard/interfaces/variable/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/variable/variable_cuda.$(OBJEXT): \ datawizard/interfaces/variable/$(am__dirstamp) \ datawizard/interfaces/variable/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/variable/variable_interface$(EXEEXT): $(datawizard_interfaces_variable_variable_interface_OBJECTS) $(datawizard_interfaces_variable_variable_interface_DEPENDENCIES) $(EXTRA_datawizard_interfaces_variable_variable_interface_DEPENDENCIES) datawizard/interfaces/variable/$(am__dirstamp) @rm -f datawizard/interfaces/variable/variable_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_variable_variable_interface_OBJECTS) $(datawizard_interfaces_variable_variable_interface_LDADD) $(LIBS) datawizard/interfaces/vector/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/vector @: > datawizard/interfaces/vector/$(am__dirstamp) datawizard/interfaces/vector/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/vector/$(DEPDIR) @: > datawizard/interfaces/vector/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/vector/test_vector_cuda.$(OBJEXT): \ datawizard/interfaces/vector/$(am__dirstamp) \ datawizard/interfaces/vector/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/vector/test_vector_interface$(EXEEXT): $(datawizard_interfaces_vector_test_vector_interface_OBJECTS) $(datawizard_interfaces_vector_test_vector_interface_DEPENDENCIES) $(EXTRA_datawizard_interfaces_vector_test_vector_interface_DEPENDENCIES) datawizard/interfaces/vector/$(am__dirstamp) @rm -f datawizard/interfaces/vector/test_vector_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_vector_test_vector_interface_OBJECTS) $(datawizard_interfaces_vector_test_vector_interface_LDADD) $(LIBS) datawizard/interfaces/void/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/void @: > datawizard/interfaces/void/$(am__dirstamp) datawizard/interfaces/void/void_interface$(EXEEXT): $(datawizard_interfaces_void_void_interface_OBJECTS) $(datawizard_interfaces_void_void_interface_DEPENDENCIES) $(EXTRA_datawizard_interfaces_void_void_interface_DEPENDENCIES) datawizard/interfaces/void/$(am__dirstamp) @rm -f datawizard/interfaces/void/void_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_void_void_interface_OBJECTS) $(datawizard_interfaces_void_void_interface_LDADD) $(LIBS) datawizard/invalidate_pending_requests$(EXEEXT): $(datawizard_invalidate_pending_requests_OBJECTS) $(datawizard_invalidate_pending_requests_DEPENDENCIES) $(EXTRA_datawizard_invalidate_pending_requests_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/invalidate_pending_requests$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_invalidate_pending_requests_OBJECTS) $(datawizard_invalidate_pending_requests_LDADD) $(LIBS) datawizard/lazy_allocation$(EXEEXT): $(datawizard_lazy_allocation_OBJECTS) $(datawizard_lazy_allocation_DEPENDENCIES) $(EXTRA_datawizard_lazy_allocation_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/lazy_allocation$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_lazy_allocation_OBJECTS) $(datawizard_lazy_allocation_LDADD) $(LIBS) datawizard/lazy_unregister$(EXEEXT): $(datawizard_lazy_unregister_OBJECTS) $(datawizard_lazy_unregister_DEPENDENCIES) $(EXTRA_datawizard_lazy_unregister_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/lazy_unregister$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_lazy_unregister_OBJECTS) $(datawizard_lazy_unregister_LDADD) $(LIBS) datawizard/locality$(EXEEXT): $(datawizard_locality_OBJECTS) $(datawizard_locality_DEPENDENCIES) $(EXTRA_datawizard_locality_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/locality$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_locality_OBJECTS) $(datawizard_locality_LDADD) $(LIBS) datawizard/manual_reduction$(EXEEXT): $(datawizard_manual_reduction_OBJECTS) $(datawizard_manual_reduction_DEPENDENCIES) $(EXTRA_datawizard_manual_reduction_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/manual_reduction$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_manual_reduction_OBJECTS) $(datawizard_manual_reduction_LDADD) $(LIBS) datawizard/cuda_codelet_unsigned_inc.$(OBJEXT): \ datawizard/$(am__dirstamp) \ datawizard/$(DEPDIR)/$(am__dirstamp) datawizard/mpi_like$(EXEEXT): $(datawizard_mpi_like_OBJECTS) $(datawizard_mpi_like_DEPENDENCIES) $(EXTRA_datawizard_mpi_like_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/mpi_like$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_mpi_like_OBJECTS) $(datawizard_mpi_like_LDADD) $(LIBS) datawizard/mpi_like_async$(EXEEXT): $(datawizard_mpi_like_async_OBJECTS) $(datawizard_mpi_like_async_DEPENDENCIES) $(EXTRA_datawizard_mpi_like_async_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/mpi_like_async$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_mpi_like_async_OBJECTS) $(datawizard_mpi_like_async_LDADD) $(LIBS) datawizard/no_unregister$(EXEEXT): $(datawizard_no_unregister_OBJECTS) $(datawizard_no_unregister_DEPENDENCIES) $(EXTRA_datawizard_no_unregister_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/no_unregister$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_no_unregister_OBJECTS) $(datawizard_no_unregister_LDADD) $(LIBS) datawizard/noreclaim$(EXEEXT): $(datawizard_noreclaim_OBJECTS) $(datawizard_noreclaim_DEPENDENCIES) $(EXTRA_datawizard_noreclaim_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/noreclaim$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_noreclaim_OBJECTS) $(datawizard_noreclaim_LDADD) $(LIBS) datawizard/nowhere$(EXEEXT): $(datawizard_nowhere_OBJECTS) $(datawizard_nowhere_DEPENDENCIES) $(EXTRA_datawizard_nowhere_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/nowhere$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_nowhere_OBJECTS) $(datawizard_nowhere_LDADD) $(LIBS) datawizard/partition_dep$(EXEEXT): $(datawizard_partition_dep_OBJECTS) $(datawizard_partition_dep_DEPENDENCIES) $(EXTRA_datawizard_partition_dep_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/partition_dep$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_partition_dep_OBJECTS) $(datawizard_partition_dep_LDADD) $(LIBS) datawizard/partition_lazy$(EXEEXT): $(datawizard_partition_lazy_OBJECTS) $(datawizard_partition_lazy_DEPENDENCIES) $(EXTRA_datawizard_partition_lazy_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/partition_lazy$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_partition_lazy_OBJECTS) $(datawizard_partition_lazy_LDADD) $(LIBS) datawizard/readers_and_writers$(EXEEXT): $(datawizard_readers_and_writers_OBJECTS) $(datawizard_readers_and_writers_DEPENDENCIES) $(EXTRA_datawizard_readers_and_writers_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/readers_and_writers$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_readers_and_writers_OBJECTS) $(datawizard_readers_and_writers_LDADD) $(LIBS) datawizard/readonly$(EXEEXT): $(datawizard_readonly_OBJECTS) $(datawizard_readonly_DEPENDENCIES) $(EXTRA_datawizard_readonly_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/readonly$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_readonly_OBJECTS) $(datawizard_readonly_LDADD) $(LIBS) datawizard/reclaim$(EXEEXT): $(datawizard_reclaim_OBJECTS) $(datawizard_reclaim_DEPENDENCIES) $(EXTRA_datawizard_reclaim_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/reclaim$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_reclaim_OBJECTS) $(datawizard_reclaim_LDADD) $(LIBS) datawizard/redux_acquire$(EXEEXT): $(datawizard_redux_acquire_OBJECTS) $(datawizard_redux_acquire_DEPENDENCIES) $(EXTRA_datawizard_redux_acquire_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/redux_acquire$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_redux_acquire_OBJECTS) $(datawizard_redux_acquire_LDADD) $(LIBS) datawizard/scratch_cuda.$(OBJEXT): datawizard/$(am__dirstamp) \ datawizard/$(DEPDIR)/$(am__dirstamp) datawizard/scratch$(EXEEXT): $(datawizard_scratch_OBJECTS) $(datawizard_scratch_DEPENDENCIES) $(EXTRA_datawizard_scratch_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/scratch$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_scratch_OBJECTS) $(datawizard_scratch_LDADD) $(LIBS) datawizard/simgrid-locality$(EXEEXT): $(datawizard_simgrid_locality_OBJECTS) $(datawizard_simgrid_locality_DEPENDENCIES) $(EXTRA_datawizard_simgrid_locality_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/simgrid-locality$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_simgrid_locality_OBJECTS) $(datawizard_simgrid_locality_LDADD) $(LIBS) datawizard/specific_node$(EXEEXT): $(datawizard_specific_node_OBJECTS) $(datawizard_specific_node_DEPENDENCIES) $(EXTRA_datawizard_specific_node_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/specific_node$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_specific_node_OBJECTS) $(datawizard_specific_node_LDADD) $(LIBS) datawizard/sync_and_notify_data_kernels.$(OBJEXT): \ datawizard/$(am__dirstamp) \ datawizard/$(DEPDIR)/$(am__dirstamp) datawizard/sync_and_notify_data$(EXEEXT): $(datawizard_sync_and_notify_data_OBJECTS) $(datawizard_sync_and_notify_data_DEPENDENCIES) $(EXTRA_datawizard_sync_and_notify_data_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/sync_and_notify_data$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_sync_and_notify_data_OBJECTS) $(datawizard_sync_and_notify_data_LDADD) $(LIBS) datawizard/sync_and_notify_data_implicit$(EXEEXT): $(datawizard_sync_and_notify_data_implicit_OBJECTS) $(datawizard_sync_and_notify_data_implicit_DEPENDENCIES) $(EXTRA_datawizard_sync_and_notify_data_implicit_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/sync_and_notify_data_implicit$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_sync_and_notify_data_implicit_OBJECTS) $(datawizard_sync_and_notify_data_implicit_LDADD) $(LIBS) datawizard/sync_with_data_with_mem$(EXEEXT): $(datawizard_sync_with_data_with_mem_OBJECTS) $(datawizard_sync_with_data_with_mem_DEPENDENCIES) $(EXTRA_datawizard_sync_with_data_with_mem_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/sync_with_data_with_mem$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_sync_with_data_with_mem_OBJECTS) $(datawizard_sync_with_data_with_mem_LDADD) $(LIBS) datawizard/sync_with_data_with_mem_non_blocking$(EXEEXT): $(datawizard_sync_with_data_with_mem_non_blocking_OBJECTS) $(datawizard_sync_with_data_with_mem_non_blocking_DEPENDENCIES) $(EXTRA_datawizard_sync_with_data_with_mem_non_blocking_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/sync_with_data_with_mem_non_blocking$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_sync_with_data_with_mem_non_blocking_OBJECTS) $(datawizard_sync_with_data_with_mem_non_blocking_LDADD) $(LIBS) datawizard/sync_with_data_with_mem_non_blocking_implicit$(EXEEXT): $(datawizard_sync_with_data_with_mem_non_blocking_implicit_OBJECTS) $(datawizard_sync_with_data_with_mem_non_blocking_implicit_DEPENDENCIES) $(EXTRA_datawizard_sync_with_data_with_mem_non_blocking_implicit_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/sync_with_data_with_mem_non_blocking_implicit$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_sync_with_data_with_mem_non_blocking_implicit_OBJECTS) $(datawizard_sync_with_data_with_mem_non_blocking_implicit_LDADD) $(LIBS) datawizard/task_with_multiple_time_the_same_handle$(EXEEXT): $(datawizard_task_with_multiple_time_the_same_handle_OBJECTS) $(datawizard_task_with_multiple_time_the_same_handle_DEPENDENCIES) $(EXTRA_datawizard_task_with_multiple_time_the_same_handle_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/task_with_multiple_time_the_same_handle$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_task_with_multiple_time_the_same_handle_OBJECTS) $(datawizard_task_with_multiple_time_the_same_handle_LDADD) $(LIBS) datawizard/temporary_partition$(EXEEXT): $(datawizard_temporary_partition_OBJECTS) $(datawizard_temporary_partition_DEPENDENCIES) $(EXTRA_datawizard_temporary_partition_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/temporary_partition$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_temporary_partition_OBJECTS) $(datawizard_temporary_partition_LDADD) $(LIBS) datawizard/test_arbiter$(EXEEXT): $(datawizard_test_arbiter_OBJECTS) $(datawizard_test_arbiter_DEPENDENCIES) $(EXTRA_datawizard_test_arbiter_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/test_arbiter$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(datawizard_test_arbiter_OBJECTS) $(datawizard_test_arbiter_LDADD) $(LIBS) datawizard/unpartition$(EXEEXT): $(datawizard_unpartition_OBJECTS) $(datawizard_unpartition_DEPENDENCIES) $(EXTRA_datawizard_unpartition_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/unpartition$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_unpartition_OBJECTS) $(datawizard_unpartition_LDADD) $(LIBS) datawizard/user_interaction_implicit$(EXEEXT): $(datawizard_user_interaction_implicit_OBJECTS) $(datawizard_user_interaction_implicit_DEPENDENCIES) $(EXTRA_datawizard_user_interaction_implicit_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/user_interaction_implicit$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_user_interaction_implicit_OBJECTS) $(datawizard_user_interaction_implicit_LDADD) $(LIBS) datawizard/variable_parameters$(EXEEXT): $(datawizard_variable_parameters_OBJECTS) $(datawizard_variable_parameters_DEPENDENCIES) $(EXTRA_datawizard_variable_parameters_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/variable_parameters$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_variable_parameters_OBJECTS) $(datawizard_variable_parameters_LDADD) $(LIBS) datawizard/write_only_tmp_buffer$(EXEEXT): $(datawizard_write_only_tmp_buffer_OBJECTS) $(datawizard_write_only_tmp_buffer_DEPENDENCIES) $(EXTRA_datawizard_write_only_tmp_buffer_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/write_only_tmp_buffer$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_write_only_tmp_buffer_OBJECTS) $(datawizard_write_only_tmp_buffer_LDADD) $(LIBS) datawizard/wt_broadcast$(EXEEXT): $(datawizard_wt_broadcast_OBJECTS) $(datawizard_wt_broadcast_DEPENDENCIES) $(EXTRA_datawizard_wt_broadcast_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/wt_broadcast$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_wt_broadcast_OBJECTS) $(datawizard_wt_broadcast_LDADD) $(LIBS) datawizard/wt_host$(EXEEXT): $(datawizard_wt_host_OBJECTS) $(datawizard_wt_host_DEPENDENCIES) $(EXTRA_datawizard_wt_host_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/wt_host$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_wt_host_OBJECTS) $(datawizard_wt_host_LDADD) $(LIBS) disk/$(am__dirstamp): @$(MKDIR_P) disk @: > disk/$(am__dirstamp) disk/disk_compute$(EXEEXT): $(disk_disk_compute_OBJECTS) $(disk_disk_compute_DEPENDENCIES) $(EXTRA_disk_disk_compute_DEPENDENCIES) disk/$(am__dirstamp) @rm -f disk/disk_compute$(EXEEXT) $(AM_V_CCLD)$(LINK) $(disk_disk_compute_OBJECTS) $(disk_disk_compute_LDADD) $(LIBS) disk/disk_copy$(EXEEXT): $(disk_disk_copy_OBJECTS) $(disk_disk_copy_DEPENDENCIES) $(EXTRA_disk_disk_copy_DEPENDENCIES) disk/$(am__dirstamp) @rm -f disk/disk_copy$(EXEEXT) $(AM_V_CCLD)$(LINK) $(disk_disk_copy_OBJECTS) $(disk_disk_copy_LDADD) $(LIBS) disk/disk_pack$(EXEEXT): $(disk_disk_pack_OBJECTS) $(disk_disk_pack_DEPENDENCIES) $(EXTRA_disk_disk_pack_DEPENDENCIES) disk/$(am__dirstamp) @rm -f disk/disk_pack$(EXEEXT) $(AM_V_CCLD)$(LINK) $(disk_disk_pack_OBJECTS) $(disk_disk_pack_LDADD) $(LIBS) disk/mem_reclaim$(EXEEXT): $(disk_mem_reclaim_OBJECTS) $(disk_mem_reclaim_DEPENDENCIES) $(EXTRA_disk_mem_reclaim_DEPENDENCIES) disk/$(am__dirstamp) @rm -f disk/mem_reclaim$(EXEEXT) $(AM_V_CCLD)$(LINK) $(disk_mem_reclaim_OBJECTS) $(disk_mem_reclaim_LDADD) $(LIBS) errorcheck/$(am__dirstamp): @$(MKDIR_P) errorcheck @: > errorcheck/$(am__dirstamp) errorcheck/invalid_blocking_calls$(EXEEXT): $(errorcheck_invalid_blocking_calls_OBJECTS) $(errorcheck_invalid_blocking_calls_DEPENDENCIES) $(EXTRA_errorcheck_invalid_blocking_calls_DEPENDENCIES) errorcheck/$(am__dirstamp) @rm -f errorcheck/invalid_blocking_calls$(EXEEXT) $(AM_V_CCLD)$(LINK) $(errorcheck_invalid_blocking_calls_OBJECTS) $(errorcheck_invalid_blocking_calls_LDADD) $(LIBS) errorcheck/invalid_tasks$(EXEEXT): $(errorcheck_invalid_tasks_OBJECTS) $(errorcheck_invalid_tasks_DEPENDENCIES) $(EXTRA_errorcheck_invalid_tasks_DEPENDENCIES) errorcheck/$(am__dirstamp) @rm -f errorcheck/invalid_tasks$(EXEEXT) $(AM_V_CCLD)$(LINK) $(errorcheck_invalid_tasks_OBJECTS) $(errorcheck_invalid_tasks_LDADD) $(LIBS) errorcheck/starpu_init_noworker$(EXEEXT): $(errorcheck_starpu_init_noworker_OBJECTS) $(errorcheck_starpu_init_noworker_DEPENDENCIES) $(EXTRA_errorcheck_starpu_init_noworker_DEPENDENCIES) errorcheck/$(am__dirstamp) @rm -f errorcheck/starpu_init_noworker$(EXEEXT) $(AM_V_CCLD)$(LINK) $(errorcheck_starpu_init_noworker_OBJECTS) $(errorcheck_starpu_init_noworker_LDADD) $(LIBS) fortran90/$(am__dirstamp): @$(MKDIR_P) fortran90 @: > fortran90/$(am__dirstamp) fortran90/init_01$(EXEEXT): $(fortran90_init_01_OBJECTS) $(fortran90_init_01_DEPENDENCIES) $(EXTRA_fortran90_init_01_DEPENDENCIES) fortran90/$(am__dirstamp) @rm -f fortran90/init_01$(EXEEXT) $(AM_V_FCLD)$(FCLINK) $(fortran90_init_01_OBJECTS) $(fortran90_init_01_LDADD) $(LIBS) helper/$(am__dirstamp): @$(MKDIR_P) helper @: > helper/$(am__dirstamp) helper/cublas_init$(EXEEXT): $(helper_cublas_init_OBJECTS) $(helper_cublas_init_DEPENDENCIES) $(EXTRA_helper_cublas_init_DEPENDENCIES) helper/$(am__dirstamp) @rm -f helper/cublas_init$(EXEEXT) $(AM_V_CCLD)$(LINK) $(helper_cublas_init_OBJECTS) $(helper_cublas_init_LDADD) $(LIBS) helper/cusparse_init$(EXEEXT): $(helper_cusparse_init_OBJECTS) $(helper_cusparse_init_DEPENDENCIES) $(EXTRA_helper_cusparse_init_DEPENDENCIES) helper/$(am__dirstamp) @rm -f helper/cusparse_init$(EXEEXT) $(AM_V_CCLD)$(LINK) $(helper_cusparse_init_OBJECTS) $(helper_cusparse_init_LDADD) $(LIBS) helper/execute_on_all$(EXEEXT): $(helper_execute_on_all_OBJECTS) $(helper_execute_on_all_DEPENDENCIES) $(EXTRA_helper_execute_on_all_DEPENDENCIES) helper/$(am__dirstamp) @rm -f helper/execute_on_all$(EXEEXT) $(AM_V_CCLD)$(LINK) $(helper_execute_on_all_OBJECTS) $(helper_execute_on_all_LDADD) $(LIBS) helper/pinned_memory$(EXEEXT): $(helper_pinned_memory_OBJECTS) $(helper_pinned_memory_DEPENDENCIES) $(EXTRA_helper_pinned_memory_DEPENDENCIES) helper/$(am__dirstamp) @rm -f helper/pinned_memory$(EXEEXT) $(AM_V_CCLD)$(LINK) $(helper_pinned_memory_OBJECTS) $(helper_pinned_memory_LDADD) $(LIBS) helper/starpu_create_sync_task$(EXEEXT): $(helper_starpu_create_sync_task_OBJECTS) $(helper_starpu_create_sync_task_DEPENDENCIES) $(EXTRA_helper_starpu_create_sync_task_DEPENDENCIES) helper/$(am__dirstamp) @rm -f helper/starpu_create_sync_task$(EXEEXT) $(AM_V_CCLD)$(LINK) $(helper_starpu_create_sync_task_OBJECTS) $(helper_starpu_create_sync_task_LDADD) $(LIBS) helper/starpu_data_cpy$(EXEEXT): $(helper_starpu_data_cpy_OBJECTS) $(helper_starpu_data_cpy_DEPENDENCIES) $(EXTRA_helper_starpu_data_cpy_DEPENDENCIES) helper/$(am__dirstamp) @rm -f helper/starpu_data_cpy$(EXEEXT) $(AM_V_CCLD)$(LINK) $(helper_starpu_data_cpy_OBJECTS) $(helper_starpu_data_cpy_LDADD) $(LIBS) loader$(EXEEXT): $(loader_OBJECTS) $(loader_DEPENDENCIES) $(EXTRA_loader_DEPENDENCIES) @rm -f loader$(EXEEXT) $(AM_V_CCLD)$(LINK) $(loader_OBJECTS) $(loader_LDADD) $(LIBS) main/$(am__dirstamp): @$(MKDIR_P) main @: > main/$(am__dirstamp) main/codelet_null_callback$(EXEEXT): $(main_codelet_null_callback_OBJECTS) $(main_codelet_null_callback_DEPENDENCIES) $(EXTRA_main_codelet_null_callback_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/codelet_null_callback$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_codelet_null_callback_OBJECTS) $(main_codelet_null_callback_LDADD) $(LIBS) main/declare_deps_after_submission$(EXEEXT): $(main_declare_deps_after_submission_OBJECTS) $(main_declare_deps_after_submission_DEPENDENCIES) $(EXTRA_main_declare_deps_after_submission_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/declare_deps_after_submission$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_declare_deps_after_submission_OBJECTS) $(main_declare_deps_after_submission_LDADD) $(LIBS) main/declare_deps_after_submission_synchronous$(EXEEXT): $(main_declare_deps_after_submission_synchronous_OBJECTS) $(main_declare_deps_after_submission_synchronous_DEPENDENCIES) $(EXTRA_main_declare_deps_after_submission_synchronous_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/declare_deps_after_submission_synchronous$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_declare_deps_after_submission_synchronous_OBJECTS) $(main_declare_deps_after_submission_synchronous_LDADD) $(LIBS) main/declare_deps_in_callback$(EXEEXT): $(main_declare_deps_in_callback_OBJECTS) $(main_declare_deps_in_callback_DEPENDENCIES) $(EXTRA_main_declare_deps_in_callback_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/declare_deps_in_callback$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_declare_deps_in_callback_OBJECTS) $(main_declare_deps_in_callback_LDADD) $(LIBS) main/deploop$(EXEEXT): $(main_deploop_OBJECTS) $(main_deploop_DEPENDENCIES) $(EXTRA_main_deploop_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/deploop$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_deploop_OBJECTS) $(main_deploop_LDADD) $(LIBS) main/deprecated_func$(EXEEXT): $(main_deprecated_func_OBJECTS) $(main_deprecated_func_DEPENDENCIES) $(EXTRA_main_deprecated_func_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/deprecated_func$(EXEEXT) $(AM_V_CCLD)$(main_deprecated_func_LINK) $(main_deprecated_func_OBJECTS) $(main_deprecated_func_LDADD) $(LIBS) main/driver_api/$(am__dirstamp): @$(MKDIR_P) main/driver_api @: > main/driver_api/$(am__dirstamp) main/driver_api/init_run_deinit$(EXEEXT): $(main_driver_api_init_run_deinit_OBJECTS) $(main_driver_api_init_run_deinit_DEPENDENCIES) $(EXTRA_main_driver_api_init_run_deinit_DEPENDENCIES) main/driver_api/$(am__dirstamp) @rm -f main/driver_api/init_run_deinit$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_driver_api_init_run_deinit_OBJECTS) $(main_driver_api_init_run_deinit_LDADD) $(LIBS) main/driver_api/run_driver$(EXEEXT): $(main_driver_api_run_driver_OBJECTS) $(main_driver_api_run_driver_DEPENDENCIES) $(EXTRA_main_driver_api_run_driver_DEPENDENCIES) main/driver_api/$(am__dirstamp) @rm -f main/driver_api/run_driver$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_driver_api_run_driver_OBJECTS) $(main_driver_api_run_driver_LDADD) $(LIBS) main/empty_task$(EXEEXT): $(main_empty_task_OBJECTS) $(main_empty_task_DEPENDENCIES) $(EXTRA_main_empty_task_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/empty_task$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_empty_task_OBJECTS) $(main_empty_task_LDADD) $(LIBS) main/empty_task_chain$(EXEEXT): $(main_empty_task_chain_OBJECTS) $(main_empty_task_chain_DEPENDENCIES) $(EXTRA_main_empty_task_chain_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/empty_task_chain$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_empty_task_chain_OBJECTS) $(main_empty_task_chain_LDADD) $(LIBS) main/empty_task_sync_point$(EXEEXT): $(main_empty_task_sync_point_OBJECTS) $(main_empty_task_sync_point_DEPENDENCIES) $(EXTRA_main_empty_task_sync_point_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/empty_task_sync_point$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_empty_task_sync_point_OBJECTS) $(main_empty_task_sync_point_LDADD) $(LIBS) main/empty_task_sync_point_tasks$(EXEEXT): $(main_empty_task_sync_point_tasks_OBJECTS) $(main_empty_task_sync_point_tasks_DEPENDENCIES) $(EXTRA_main_empty_task_sync_point_tasks_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/empty_task_sync_point_tasks$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_empty_task_sync_point_tasks_OBJECTS) $(main_empty_task_sync_point_tasks_LDADD) $(LIBS) main/execute_on_a_specific_worker$(EXEEXT): $(main_execute_on_a_specific_worker_OBJECTS) $(main_execute_on_a_specific_worker_DEPENDENCIES) $(EXTRA_main_execute_on_a_specific_worker_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/execute_on_a_specific_worker$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_execute_on_a_specific_worker_OBJECTS) $(main_execute_on_a_specific_worker_LDADD) $(LIBS) main/execute_schedule$(EXEEXT): $(main_execute_schedule_OBJECTS) $(main_execute_schedule_DEPENDENCIES) $(EXTRA_main_execute_schedule_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/execute_schedule$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_execute_schedule_OBJECTS) $(main_execute_schedule_LDADD) $(LIBS) main/get_children_tasks$(EXEEXT): $(main_get_children_tasks_OBJECTS) $(main_get_children_tasks_DEPENDENCIES) $(EXTRA_main_get_children_tasks_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/get_children_tasks$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_get_children_tasks_OBJECTS) $(main_get_children_tasks_LDADD) $(LIBS) main/get_current_task$(EXEEXT): $(main_get_current_task_OBJECTS) $(main_get_current_task_DEPENDENCIES) $(EXTRA_main_get_current_task_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/get_current_task$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_get_current_task_OBJECTS) $(main_get_current_task_LDADD) $(LIBS) main/insert_task$(EXEEXT): $(main_insert_task_OBJECTS) $(main_insert_task_DEPENDENCIES) $(EXTRA_main_insert_task_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/insert_task$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_insert_task_OBJECTS) $(main_insert_task_LDADD) $(LIBS) main/insert_task_array$(EXEEXT): $(main_insert_task_array_OBJECTS) $(main_insert_task_array_DEPENDENCIES) $(EXTRA_main_insert_task_array_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/insert_task_array$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_insert_task_array_OBJECTS) $(main_insert_task_array_LDADD) $(LIBS) main/insert_task_dyn_handles$(EXEEXT): $(main_insert_task_dyn_handles_OBJECTS) $(main_insert_task_dyn_handles_DEPENDENCIES) $(EXTRA_main_insert_task_dyn_handles_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/insert_task_dyn_handles$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_insert_task_dyn_handles_OBJECTS) $(main_insert_task_dyn_handles_LDADD) $(LIBS) main/insert_task_many$(EXEEXT): $(main_insert_task_many_OBJECTS) $(main_insert_task_many_DEPENDENCIES) $(EXTRA_main_insert_task_many_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/insert_task_many$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_insert_task_many_OBJECTS) $(main_insert_task_many_LDADD) $(LIBS) main/insert_task_nullcodelet$(EXEEXT): $(main_insert_task_nullcodelet_OBJECTS) $(main_insert_task_nullcodelet_DEPENDENCIES) $(EXTRA_main_insert_task_nullcodelet_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/insert_task_nullcodelet$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_insert_task_nullcodelet_OBJECTS) $(main_insert_task_nullcodelet_LDADD) $(LIBS) main/insert_task_pack$(EXEEXT): $(main_insert_task_pack_OBJECTS) $(main_insert_task_pack_DEPENDENCIES) $(EXTRA_main_insert_task_pack_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/insert_task_pack$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_insert_task_pack_OBJECTS) $(main_insert_task_pack_LDADD) $(LIBS) main/insert_task_value$(EXEEXT): $(main_insert_task_value_OBJECTS) $(main_insert_task_value_DEPENDENCIES) $(EXTRA_main_insert_task_value_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/insert_task_value$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_insert_task_value_OBJECTS) $(main_insert_task_value_LDADD) $(LIBS) main/mkdtemp$(EXEEXT): $(main_mkdtemp_OBJECTS) $(main_mkdtemp_DEPENDENCIES) $(EXTRA_main_mkdtemp_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/mkdtemp$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_mkdtemp_OBJECTS) $(main_mkdtemp_LDADD) $(LIBS) main/multithreaded$(EXEEXT): $(main_multithreaded_OBJECTS) $(main_multithreaded_DEPENDENCIES) $(EXTRA_main_multithreaded_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/multithreaded$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_multithreaded_OBJECTS) $(main_multithreaded_LDADD) $(LIBS) main/multithreaded_init$(EXEEXT): $(main_multithreaded_init_OBJECTS) $(main_multithreaded_init_DEPENDENCIES) $(EXTRA_main_multithreaded_init_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/multithreaded_init$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_multithreaded_init_OBJECTS) $(main_multithreaded_init_LDADD) $(LIBS) main/pack$(EXEEXT): $(main_pack_OBJECTS) $(main_pack_DEPENDENCIES) $(EXTRA_main_pack_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/pack$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_pack_OBJECTS) $(main_pack_LDADD) $(LIBS) main/pause_resume$(EXEEXT): $(main_pause_resume_OBJECTS) $(main_pause_resume_DEPENDENCIES) $(EXTRA_main_pause_resume_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/pause_resume$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_pause_resume_OBJECTS) $(main_pause_resume_LDADD) $(LIBS) main/regenerate$(EXEEXT): $(main_regenerate_OBJECTS) $(main_regenerate_DEPENDENCIES) $(EXTRA_main_regenerate_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/regenerate$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_regenerate_OBJECTS) $(main_regenerate_LDADD) $(LIBS) main/regenerate_pipeline$(EXEEXT): $(main_regenerate_pipeline_OBJECTS) $(main_regenerate_pipeline_DEPENDENCIES) $(EXTRA_main_regenerate_pipeline_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/regenerate_pipeline$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_regenerate_pipeline_OBJECTS) $(main_regenerate_pipeline_LDADD) $(LIBS) main/restart$(EXEEXT): $(main_restart_OBJECTS) $(main_restart_DEPENDENCIES) $(EXTRA_main_restart_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/restart$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_restart_OBJECTS) $(main_restart_LDADD) $(LIBS) main/starpu_init$(EXEEXT): $(main_starpu_init_OBJECTS) $(main_starpu_init_DEPENDENCIES) $(EXTRA_main_starpu_init_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/starpu_init$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_starpu_init_OBJECTS) $(main_starpu_init_LDADD) $(LIBS) main/starpu_task_bundle$(EXEEXT): $(main_starpu_task_bundle_OBJECTS) $(main_starpu_task_bundle_DEPENDENCIES) $(EXTRA_main_starpu_task_bundle_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/starpu_task_bundle$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_starpu_task_bundle_OBJECTS) $(main_starpu_task_bundle_LDADD) $(LIBS) main/starpu_task_wait$(EXEEXT): $(main_starpu_task_wait_OBJECTS) $(main_starpu_task_wait_DEPENDENCIES) $(EXTRA_main_starpu_task_wait_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/starpu_task_wait$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_starpu_task_wait_OBJECTS) $(main_starpu_task_wait_LDADD) $(LIBS) main/starpu_task_wait_for_all$(EXEEXT): $(main_starpu_task_wait_for_all_OBJECTS) $(main_starpu_task_wait_for_all_DEPENDENCIES) $(EXTRA_main_starpu_task_wait_for_all_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/starpu_task_wait_for_all$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_starpu_task_wait_for_all_OBJECTS) $(main_starpu_task_wait_for_all_LDADD) $(LIBS) main/starpu_worker_exists$(EXEEXT): $(main_starpu_worker_exists_OBJECTS) $(main_starpu_worker_exists_DEPENDENCIES) $(EXTRA_main_starpu_worker_exists_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/starpu_worker_exists$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_starpu_worker_exists_OBJECTS) $(main_starpu_worker_exists_LDADD) $(LIBS) main/static_restartable$(EXEEXT): $(main_static_restartable_OBJECTS) $(main_static_restartable_DEPENDENCIES) $(EXTRA_main_static_restartable_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/static_restartable$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_static_restartable_OBJECTS) $(main_static_restartable_LDADD) $(LIBS) main/static_restartable_tag$(EXEEXT): $(main_static_restartable_tag_OBJECTS) $(main_static_restartable_tag_DEPENDENCIES) $(EXTRA_main_static_restartable_tag_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/static_restartable_tag$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_static_restartable_tag_OBJECTS) $(main_static_restartable_tag_LDADD) $(LIBS) main/static_restartable_using_initializer$(EXEEXT): $(main_static_restartable_using_initializer_OBJECTS) $(main_static_restartable_using_initializer_DEPENDENCIES) $(EXTRA_main_static_restartable_using_initializer_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/static_restartable_using_initializer$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_static_restartable_using_initializer_OBJECTS) $(main_static_restartable_using_initializer_LDADD) $(LIBS) main/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) main/$(DEPDIR) @: > main/$(DEPDIR)/$(am__dirstamp) main/increment.$(OBJEXT): main/$(am__dirstamp) \ main/$(DEPDIR)/$(am__dirstamp) main/subgraph_repeat$(EXEEXT): $(main_subgraph_repeat_OBJECTS) $(main_subgraph_repeat_DEPENDENCIES) $(EXTRA_main_subgraph_repeat_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/subgraph_repeat$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_subgraph_repeat_OBJECTS) $(main_subgraph_repeat_LDADD) $(LIBS) main/subgraph_repeat_regenerate$(EXEEXT): $(main_subgraph_repeat_regenerate_OBJECTS) $(main_subgraph_repeat_regenerate_DEPENDENCIES) $(EXTRA_main_subgraph_repeat_regenerate_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/subgraph_repeat_regenerate$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_subgraph_repeat_regenerate_OBJECTS) $(main_subgraph_repeat_regenerate_LDADD) $(LIBS) main/subgraph_repeat_regenerate_tag$(EXEEXT): $(main_subgraph_repeat_regenerate_tag_OBJECTS) $(main_subgraph_repeat_regenerate_tag_DEPENDENCIES) $(EXTRA_main_subgraph_repeat_regenerate_tag_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/subgraph_repeat_regenerate_tag$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_subgraph_repeat_regenerate_tag_OBJECTS) $(main_subgraph_repeat_regenerate_tag_LDADD) $(LIBS) main/subgraph_repeat_tag$(EXEEXT): $(main_subgraph_repeat_tag_OBJECTS) $(main_subgraph_repeat_tag_DEPENDENCIES) $(EXTRA_main_subgraph_repeat_tag_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/subgraph_repeat_tag$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_subgraph_repeat_tag_OBJECTS) $(main_subgraph_repeat_tag_LDADD) $(LIBS) main/submit$(EXEEXT): $(main_submit_OBJECTS) $(main_submit_DEPENDENCIES) $(EXTRA_main_submit_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/submit$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_submit_OBJECTS) $(main_submit_LDADD) $(LIBS) main/tag_task_data_deps$(EXEEXT): $(main_tag_task_data_deps_OBJECTS) $(main_tag_task_data_deps_DEPENDENCIES) $(EXTRA_main_tag_task_data_deps_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/tag_task_data_deps$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_tag_task_data_deps_OBJECTS) $(main_tag_task_data_deps_LDADD) $(LIBS) main/tag_wait_api$(EXEEXT): $(main_tag_wait_api_OBJECTS) $(main_tag_wait_api_DEPENDENCIES) $(EXTRA_main_tag_wait_api_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/tag_wait_api$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_tag_wait_api_OBJECTS) $(main_tag_wait_api_LDADD) $(LIBS) main/task_wait_api$(EXEEXT): $(main_task_wait_api_OBJECTS) $(main_task_wait_api_DEPENDENCIES) $(EXTRA_main_task_wait_api_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/task_wait_api$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_task_wait_api_OBJECTS) $(main_task_wait_api_LDADD) $(LIBS) main/wait_all_regenerable_tasks$(EXEEXT): $(main_wait_all_regenerable_tasks_OBJECTS) $(main_wait_all_regenerable_tasks_DEPENDENCIES) $(EXTRA_main_wait_all_regenerable_tasks_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/wait_all_regenerable_tasks$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_wait_all_regenerable_tasks_OBJECTS) $(main_wait_all_regenerable_tasks_LDADD) $(LIBS) microbenchs/$(am__dirstamp): @$(MKDIR_P) microbenchs @: > microbenchs/$(am__dirstamp) microbenchs/async_tasks_overhead$(EXEEXT): $(microbenchs_async_tasks_overhead_OBJECTS) $(microbenchs_async_tasks_overhead_DEPENDENCIES) $(EXTRA_microbenchs_async_tasks_overhead_DEPENDENCIES) microbenchs/$(am__dirstamp) @rm -f microbenchs/async_tasks_overhead$(EXEEXT) $(AM_V_CCLD)$(LINK) $(microbenchs_async_tasks_overhead_OBJECTS) $(microbenchs_async_tasks_overhead_LDADD) $(LIBS) microbenchs/display_structures_size$(EXEEXT): $(microbenchs_display_structures_size_OBJECTS) $(microbenchs_display_structures_size_DEPENDENCIES) $(EXTRA_microbenchs_display_structures_size_DEPENDENCIES) microbenchs/$(am__dirstamp) @rm -f microbenchs/display_structures_size$(EXEEXT) $(AM_V_CCLD)$(LINK) $(microbenchs_display_structures_size_OBJECTS) $(microbenchs_display_structures_size_LDADD) $(LIBS) microbenchs/local_pingpong$(EXEEXT): $(microbenchs_local_pingpong_OBJECTS) $(microbenchs_local_pingpong_DEPENDENCIES) $(EXTRA_microbenchs_local_pingpong_DEPENDENCIES) microbenchs/$(am__dirstamp) @rm -f microbenchs/local_pingpong$(EXEEXT) $(AM_V_CCLD)$(LINK) $(microbenchs_local_pingpong_OBJECTS) $(microbenchs_local_pingpong_LDADD) $(LIBS) microbenchs/matrix_as_vector$(EXEEXT): $(microbenchs_matrix_as_vector_OBJECTS) $(microbenchs_matrix_as_vector_DEPENDENCIES) $(EXTRA_microbenchs_matrix_as_vector_DEPENDENCIES) microbenchs/$(am__dirstamp) @rm -f microbenchs/matrix_as_vector$(EXEEXT) $(AM_V_CCLD)$(LINK) $(microbenchs_matrix_as_vector_OBJECTS) $(microbenchs_matrix_as_vector_LDADD) $(LIBS) microbenchs/prefetch_data_on_node$(EXEEXT): $(microbenchs_prefetch_data_on_node_OBJECTS) $(microbenchs_prefetch_data_on_node_DEPENDENCIES) $(EXTRA_microbenchs_prefetch_data_on_node_DEPENDENCIES) microbenchs/$(am__dirstamp) @rm -f microbenchs/prefetch_data_on_node$(EXEEXT) $(AM_V_CCLD)$(LINK) $(microbenchs_prefetch_data_on_node_OBJECTS) $(microbenchs_prefetch_data_on_node_LDADD) $(LIBS) microbenchs/redundant_buffer$(EXEEXT): $(microbenchs_redundant_buffer_OBJECTS) $(microbenchs_redundant_buffer_DEPENDENCIES) $(EXTRA_microbenchs_redundant_buffer_DEPENDENCIES) microbenchs/$(am__dirstamp) @rm -f microbenchs/redundant_buffer$(EXEEXT) $(AM_V_CCLD)$(LINK) $(microbenchs_redundant_buffer_OBJECTS) $(microbenchs_redundant_buffer_LDADD) $(LIBS) microbenchs/sync_tasks_overhead$(EXEEXT): $(microbenchs_sync_tasks_overhead_OBJECTS) $(microbenchs_sync_tasks_overhead_DEPENDENCIES) $(EXTRA_microbenchs_sync_tasks_overhead_DEPENDENCIES) microbenchs/$(am__dirstamp) @rm -f microbenchs/sync_tasks_overhead$(EXEEXT) $(AM_V_CCLD)$(LINK) $(microbenchs_sync_tasks_overhead_OBJECTS) $(microbenchs_sync_tasks_overhead_LDADD) $(LIBS) microbenchs/tasks_overhead$(EXEEXT): $(microbenchs_tasks_overhead_OBJECTS) $(microbenchs_tasks_overhead_DEPENDENCIES) $(EXTRA_microbenchs_tasks_overhead_DEPENDENCIES) microbenchs/$(am__dirstamp) @rm -f microbenchs/tasks_overhead$(EXEEXT) $(AM_V_CCLD)$(LINK) $(microbenchs_tasks_overhead_OBJECTS) $(microbenchs_tasks_overhead_LDADD) $(LIBS) microbenchs/tasks_size_overhead$(EXEEXT): $(microbenchs_tasks_size_overhead_OBJECTS) $(microbenchs_tasks_size_overhead_DEPENDENCIES) $(EXTRA_microbenchs_tasks_size_overhead_DEPENDENCIES) microbenchs/$(am__dirstamp) @rm -f microbenchs/tasks_size_overhead$(EXEEXT) $(AM_V_CCLD)$(LINK) $(microbenchs_tasks_size_overhead_OBJECTS) $(microbenchs_tasks_size_overhead_LDADD) $(LIBS) openmp/$(am__dirstamp): @$(MKDIR_P) openmp @: > openmp/$(am__dirstamp) openmp/api_01$(EXEEXT): $(openmp_api_01_OBJECTS) $(openmp_api_01_DEPENDENCIES) $(EXTRA_openmp_api_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/api_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_api_01_OBJECTS) $(openmp_api_01_LDADD) $(LIBS) openmp/array_slice_01$(EXEEXT): $(openmp_array_slice_01_OBJECTS) $(openmp_array_slice_01_DEPENDENCIES) $(EXTRA_openmp_array_slice_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/array_slice_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_array_slice_01_OBJECTS) $(openmp_array_slice_01_LDADD) $(LIBS) openmp/cuda_task_01$(EXEEXT): $(openmp_cuda_task_01_OBJECTS) $(openmp_cuda_task_01_DEPENDENCIES) $(EXTRA_openmp_cuda_task_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/cuda_task_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_cuda_task_01_OBJECTS) $(openmp_cuda_task_01_LDADD) $(LIBS) openmp/environment$(EXEEXT): $(openmp_environment_OBJECTS) $(openmp_environment_DEPENDENCIES) $(EXTRA_openmp_environment_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/environment$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_environment_OBJECTS) $(openmp_environment_LDADD) $(LIBS) openmp/init_exit_01$(EXEEXT): $(openmp_init_exit_01_OBJECTS) $(openmp_init_exit_01_DEPENDENCIES) $(EXTRA_openmp_init_exit_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/init_exit_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_init_exit_01_OBJECTS) $(openmp_init_exit_01_LDADD) $(LIBS) openmp/init_exit_02$(EXEEXT): $(openmp_init_exit_02_OBJECTS) $(openmp_init_exit_02_DEPENDENCIES) $(EXTRA_openmp_init_exit_02_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/init_exit_02$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_init_exit_02_OBJECTS) $(openmp_init_exit_02_LDADD) $(LIBS) openmp/parallel_01$(EXEEXT): $(openmp_parallel_01_OBJECTS) $(openmp_parallel_01_DEPENDENCIES) $(EXTRA_openmp_parallel_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/parallel_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_parallel_01_OBJECTS) $(openmp_parallel_01_LDADD) $(LIBS) openmp/parallel_02$(EXEEXT): $(openmp_parallel_02_OBJECTS) $(openmp_parallel_02_DEPENDENCIES) $(EXTRA_openmp_parallel_02_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/parallel_02$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_parallel_02_OBJECTS) $(openmp_parallel_02_LDADD) $(LIBS) openmp/parallel_03$(EXEEXT): $(openmp_parallel_03_OBJECTS) $(openmp_parallel_03_DEPENDENCIES) $(EXTRA_openmp_parallel_03_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/parallel_03$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_parallel_03_OBJECTS) $(openmp_parallel_03_LDADD) $(LIBS) openmp/parallel_barrier_01$(EXEEXT): $(openmp_parallel_barrier_01_OBJECTS) $(openmp_parallel_barrier_01_DEPENDENCIES) $(EXTRA_openmp_parallel_barrier_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/parallel_barrier_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_parallel_barrier_01_OBJECTS) $(openmp_parallel_barrier_01_LDADD) $(LIBS) openmp/parallel_critical_01$(EXEEXT): $(openmp_parallel_critical_01_OBJECTS) $(openmp_parallel_critical_01_DEPENDENCIES) $(EXTRA_openmp_parallel_critical_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/parallel_critical_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_parallel_critical_01_OBJECTS) $(openmp_parallel_critical_01_LDADD) $(LIBS) openmp/parallel_critical_inline_01$(EXEEXT): $(openmp_parallel_critical_inline_01_OBJECTS) $(openmp_parallel_critical_inline_01_DEPENDENCIES) $(EXTRA_openmp_parallel_critical_inline_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/parallel_critical_inline_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_parallel_critical_inline_01_OBJECTS) $(openmp_parallel_critical_inline_01_LDADD) $(LIBS) openmp/parallel_critical_named_01$(EXEEXT): $(openmp_parallel_critical_named_01_OBJECTS) $(openmp_parallel_critical_named_01_DEPENDENCIES) $(EXTRA_openmp_parallel_critical_named_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/parallel_critical_named_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_parallel_critical_named_01_OBJECTS) $(openmp_parallel_critical_named_01_LDADD) $(LIBS) openmp/parallel_critical_named_inline_01$(EXEEXT): $(openmp_parallel_critical_named_inline_01_OBJECTS) $(openmp_parallel_critical_named_inline_01_DEPENDENCIES) $(EXTRA_openmp_parallel_critical_named_inline_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/parallel_critical_named_inline_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_parallel_critical_named_inline_01_OBJECTS) $(openmp_parallel_critical_named_inline_01_LDADD) $(LIBS) openmp/parallel_for_01$(EXEEXT): $(openmp_parallel_for_01_OBJECTS) $(openmp_parallel_for_01_DEPENDENCIES) $(EXTRA_openmp_parallel_for_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/parallel_for_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_parallel_for_01_OBJECTS) $(openmp_parallel_for_01_LDADD) $(LIBS) openmp/parallel_for_02$(EXEEXT): $(openmp_parallel_for_02_OBJECTS) $(openmp_parallel_for_02_DEPENDENCIES) $(EXTRA_openmp_parallel_for_02_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/parallel_for_02$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_parallel_for_02_OBJECTS) $(openmp_parallel_for_02_LDADD) $(LIBS) openmp/parallel_for_ordered_01$(EXEEXT): $(openmp_parallel_for_ordered_01_OBJECTS) $(openmp_parallel_for_ordered_01_DEPENDENCIES) $(EXTRA_openmp_parallel_for_ordered_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/parallel_for_ordered_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_parallel_for_ordered_01_OBJECTS) $(openmp_parallel_for_ordered_01_LDADD) $(LIBS) openmp/parallel_master_01$(EXEEXT): $(openmp_parallel_master_01_OBJECTS) $(openmp_parallel_master_01_DEPENDENCIES) $(EXTRA_openmp_parallel_master_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/parallel_master_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_parallel_master_01_OBJECTS) $(openmp_parallel_master_01_LDADD) $(LIBS) openmp/parallel_master_inline_01$(EXEEXT): $(openmp_parallel_master_inline_01_OBJECTS) $(openmp_parallel_master_inline_01_DEPENDENCIES) $(EXTRA_openmp_parallel_master_inline_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/parallel_master_inline_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_parallel_master_inline_01_OBJECTS) $(openmp_parallel_master_inline_01_LDADD) $(LIBS) openmp/parallel_nested_lock_01$(EXEEXT): $(openmp_parallel_nested_lock_01_OBJECTS) $(openmp_parallel_nested_lock_01_DEPENDENCIES) $(EXTRA_openmp_parallel_nested_lock_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/parallel_nested_lock_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_parallel_nested_lock_01_OBJECTS) $(openmp_parallel_nested_lock_01_LDADD) $(LIBS) openmp/parallel_sections_01$(EXEEXT): $(openmp_parallel_sections_01_OBJECTS) $(openmp_parallel_sections_01_DEPENDENCIES) $(EXTRA_openmp_parallel_sections_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/parallel_sections_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_parallel_sections_01_OBJECTS) $(openmp_parallel_sections_01_LDADD) $(LIBS) openmp/parallel_sections_combined_01$(EXEEXT): $(openmp_parallel_sections_combined_01_OBJECTS) $(openmp_parallel_sections_combined_01_DEPENDENCIES) $(EXTRA_openmp_parallel_sections_combined_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/parallel_sections_combined_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_parallel_sections_combined_01_OBJECTS) $(openmp_parallel_sections_combined_01_LDADD) $(LIBS) openmp/parallel_simple_lock_01$(EXEEXT): $(openmp_parallel_simple_lock_01_OBJECTS) $(openmp_parallel_simple_lock_01_DEPENDENCIES) $(EXTRA_openmp_parallel_simple_lock_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/parallel_simple_lock_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_parallel_simple_lock_01_OBJECTS) $(openmp_parallel_simple_lock_01_LDADD) $(LIBS) openmp/parallel_single_copyprivate_01$(EXEEXT): $(openmp_parallel_single_copyprivate_01_OBJECTS) $(openmp_parallel_single_copyprivate_01_DEPENDENCIES) $(EXTRA_openmp_parallel_single_copyprivate_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/parallel_single_copyprivate_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_parallel_single_copyprivate_01_OBJECTS) $(openmp_parallel_single_copyprivate_01_LDADD) $(LIBS) openmp/parallel_single_copyprivate_inline_01$(EXEEXT): $(openmp_parallel_single_copyprivate_inline_01_OBJECTS) $(openmp_parallel_single_copyprivate_inline_01_DEPENDENCIES) $(EXTRA_openmp_parallel_single_copyprivate_inline_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/parallel_single_copyprivate_inline_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_parallel_single_copyprivate_inline_01_OBJECTS) $(openmp_parallel_single_copyprivate_inline_01_LDADD) $(LIBS) openmp/parallel_single_inline_01$(EXEEXT): $(openmp_parallel_single_inline_01_OBJECTS) $(openmp_parallel_single_inline_01_DEPENDENCIES) $(EXTRA_openmp_parallel_single_inline_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/parallel_single_inline_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_parallel_single_inline_01_OBJECTS) $(openmp_parallel_single_inline_01_LDADD) $(LIBS) openmp/parallel_single_nowait_01$(EXEEXT): $(openmp_parallel_single_nowait_01_OBJECTS) $(openmp_parallel_single_nowait_01_DEPENDENCIES) $(EXTRA_openmp_parallel_single_nowait_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/parallel_single_nowait_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_parallel_single_nowait_01_OBJECTS) $(openmp_parallel_single_nowait_01_LDADD) $(LIBS) openmp/parallel_single_wait_01$(EXEEXT): $(openmp_parallel_single_wait_01_OBJECTS) $(openmp_parallel_single_wait_01_DEPENDENCIES) $(EXTRA_openmp_parallel_single_wait_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/parallel_single_wait_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_parallel_single_wait_01_OBJECTS) $(openmp_parallel_single_wait_01_LDADD) $(LIBS) openmp/task_01$(EXEEXT): $(openmp_task_01_OBJECTS) $(openmp_task_01_DEPENDENCIES) $(EXTRA_openmp_task_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/task_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_task_01_OBJECTS) $(openmp_task_01_LDADD) $(LIBS) openmp/task_02$(EXEEXT): $(openmp_task_02_OBJECTS) $(openmp_task_02_DEPENDENCIES) $(EXTRA_openmp_task_02_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/task_02$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_task_02_OBJECTS) $(openmp_task_02_LDADD) $(LIBS) openmp/taskgroup_01$(EXEEXT): $(openmp_taskgroup_01_OBJECTS) $(openmp_taskgroup_01_DEPENDENCIES) $(EXTRA_openmp_taskgroup_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/taskgroup_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_taskgroup_01_OBJECTS) $(openmp_taskgroup_01_LDADD) $(LIBS) openmp/taskgroup_02$(EXEEXT): $(openmp_taskgroup_02_OBJECTS) $(openmp_taskgroup_02_DEPENDENCIES) $(EXTRA_openmp_taskgroup_02_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/taskgroup_02$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_taskgroup_02_OBJECTS) $(openmp_taskgroup_02_LDADD) $(LIBS) openmp/taskwait_01$(EXEEXT): $(openmp_taskwait_01_OBJECTS) $(openmp_taskwait_01_DEPENDENCIES) $(EXTRA_openmp_taskwait_01_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/taskwait_01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_taskwait_01_OBJECTS) $(openmp_taskwait_01_LDADD) $(LIBS) overlap/$(am__dirstamp): @$(MKDIR_P) overlap @: > overlap/$(am__dirstamp) overlap/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) overlap/$(DEPDIR) @: > overlap/$(DEPDIR)/$(am__dirstamp) overlap/long_kernel.$(OBJEXT): overlap/$(am__dirstamp) \ overlap/$(DEPDIR)/$(am__dirstamp) overlap/gpu_concurrency$(EXEEXT): $(overlap_gpu_concurrency_OBJECTS) $(overlap_gpu_concurrency_DEPENDENCIES) $(EXTRA_overlap_gpu_concurrency_DEPENDENCIES) overlap/$(am__dirstamp) @rm -f overlap/gpu_concurrency$(EXEEXT) $(AM_V_CCLD)$(LINK) $(overlap_gpu_concurrency_OBJECTS) $(overlap_gpu_concurrency_LDADD) $(LIBS) overlap/overlap$(EXEEXT): $(overlap_overlap_OBJECTS) $(overlap_overlap_DEPENDENCIES) $(EXTRA_overlap_overlap_DEPENDENCIES) overlap/$(am__dirstamp) @rm -f overlap/overlap$(EXEEXT) $(AM_V_CCLD)$(LINK) $(overlap_overlap_OBJECTS) $(overlap_overlap_LDADD) $(LIBS) parallel_tasks/$(am__dirstamp): @$(MKDIR_P) parallel_tasks @: > parallel_tasks/$(am__dirstamp) parallel_tasks/cuda_only$(EXEEXT): $(parallel_tasks_cuda_only_OBJECTS) $(parallel_tasks_cuda_only_DEPENDENCIES) $(EXTRA_parallel_tasks_cuda_only_DEPENDENCIES) parallel_tasks/$(am__dirstamp) @rm -f parallel_tasks/cuda_only$(EXEEXT) $(AM_V_CCLD)$(LINK) $(parallel_tasks_cuda_only_OBJECTS) $(parallel_tasks_cuda_only_LDADD) $(LIBS) parallel_tasks/explicit_combined_worker$(EXEEXT): $(parallel_tasks_explicit_combined_worker_OBJECTS) $(parallel_tasks_explicit_combined_worker_DEPENDENCIES) $(EXTRA_parallel_tasks_explicit_combined_worker_DEPENDENCIES) parallel_tasks/$(am__dirstamp) @rm -f parallel_tasks/explicit_combined_worker$(EXEEXT) $(AM_V_CCLD)$(LINK) $(parallel_tasks_explicit_combined_worker_OBJECTS) $(parallel_tasks_explicit_combined_worker_LDADD) $(LIBS) parallel_tasks/parallel_kernels$(EXEEXT): $(parallel_tasks_parallel_kernels_OBJECTS) $(parallel_tasks_parallel_kernels_DEPENDENCIES) $(EXTRA_parallel_tasks_parallel_kernels_DEPENDENCIES) parallel_tasks/$(am__dirstamp) @rm -f parallel_tasks/parallel_kernels$(EXEEXT) $(AM_V_CCLD)$(LINK) $(parallel_tasks_parallel_kernels_OBJECTS) $(parallel_tasks_parallel_kernels_LDADD) $(LIBS) parallel_tasks/parallel_kernels_spmd$(EXEEXT): $(parallel_tasks_parallel_kernels_spmd_OBJECTS) $(parallel_tasks_parallel_kernels_spmd_DEPENDENCIES) $(EXTRA_parallel_tasks_parallel_kernels_spmd_DEPENDENCIES) parallel_tasks/$(am__dirstamp) @rm -f parallel_tasks/parallel_kernels_spmd$(EXEEXT) $(AM_V_CCLD)$(LINK) $(parallel_tasks_parallel_kernels_spmd_OBJECTS) $(parallel_tasks_parallel_kernels_spmd_LDADD) $(LIBS) parallel_tasks/spmd_peager$(EXEEXT): $(parallel_tasks_spmd_peager_OBJECTS) $(parallel_tasks_spmd_peager_DEPENDENCIES) $(EXTRA_parallel_tasks_spmd_peager_DEPENDENCIES) parallel_tasks/$(am__dirstamp) @rm -f parallel_tasks/spmd_peager$(EXEEXT) $(AM_V_CCLD)$(LINK) $(parallel_tasks_spmd_peager_OBJECTS) $(parallel_tasks_spmd_peager_LDADD) $(LIBS) perfmodels/$(am__dirstamp): @$(MKDIR_P) perfmodels @: > perfmodels/$(am__dirstamp) perfmodels/feed$(EXEEXT): $(perfmodels_feed_OBJECTS) $(perfmodels_feed_DEPENDENCIES) $(EXTRA_perfmodels_feed_DEPENDENCIES) perfmodels/$(am__dirstamp) @rm -f perfmodels/feed$(EXEEXT) $(AM_V_CCLD)$(LINK) $(perfmodels_feed_OBJECTS) $(perfmodels_feed_LDADD) $(LIBS) perfmodels/memory$(EXEEXT): $(perfmodels_memory_OBJECTS) $(perfmodels_memory_DEPENDENCIES) $(EXTRA_perfmodels_memory_DEPENDENCIES) perfmodels/$(am__dirstamp) @rm -f perfmodels/memory$(EXEEXT) $(AM_V_CCLD)$(LINK) $(perfmodels_memory_OBJECTS) $(perfmodels_memory_LDADD) $(LIBS) perfmodels/non_linear_regression_based$(EXEEXT): $(perfmodels_non_linear_regression_based_OBJECTS) $(perfmodels_non_linear_regression_based_DEPENDENCIES) $(EXTRA_perfmodels_non_linear_regression_based_DEPENDENCIES) perfmodels/$(am__dirstamp) @rm -f perfmodels/non_linear_regression_based$(EXEEXT) $(AM_V_CCLD)$(LINK) $(perfmodels_non_linear_regression_based_OBJECTS) $(perfmodels_non_linear_regression_based_LDADD) $(LIBS) perfmodels/regression_based$(EXEEXT): $(perfmodels_regression_based_OBJECTS) $(perfmodels_regression_based_DEPENDENCIES) $(EXTRA_perfmodels_regression_based_DEPENDENCIES) perfmodels/$(am__dirstamp) @rm -f perfmodels/regression_based$(EXEEXT) $(AM_V_CCLD)$(LINK) $(perfmodels_regression_based_OBJECTS) $(perfmodels_regression_based_LDADD) $(LIBS) perfmodels/user_base$(EXEEXT): $(perfmodels_user_base_OBJECTS) $(perfmodels_user_base_DEPENDENCIES) $(EXTRA_perfmodels_user_base_DEPENDENCIES) perfmodels/$(am__dirstamp) @rm -f perfmodels/user_base$(EXEEXT) $(AM_V_CCLD)$(LINK) $(perfmodels_user_base_OBJECTS) $(perfmodels_user_base_LDADD) $(LIBS) perfmodels/valid_model$(EXEEXT): $(perfmodels_valid_model_OBJECTS) $(perfmodels_valid_model_DEPENDENCIES) $(EXTRA_perfmodels_valid_model_DEPENDENCIES) perfmodels/$(am__dirstamp) @rm -f perfmodels/valid_model$(EXEEXT) $(AM_V_CCLD)$(LINK) $(perfmodels_valid_model_OBJECTS) $(perfmodels_valid_model_LDADD) $(LIBS) perfmodels/value_nan$(EXEEXT): $(perfmodels_value_nan_OBJECTS) $(perfmodels_value_nan_DEPENDENCIES) $(EXTRA_perfmodels_value_nan_DEPENDENCIES) perfmodels/$(am__dirstamp) @rm -f perfmodels/value_nan$(EXEEXT) $(AM_V_CCLD)$(LINK) $(perfmodels_value_nan_OBJECTS) $(perfmodels_value_nan_LDADD) $(LIBS) sched_policies/$(am__dirstamp): @$(MKDIR_P) sched_policies @: > sched_policies/$(am__dirstamp) sched_policies/data_locality$(EXEEXT): $(sched_policies_data_locality_OBJECTS) $(sched_policies_data_locality_DEPENDENCIES) $(EXTRA_sched_policies_data_locality_DEPENDENCIES) sched_policies/$(am__dirstamp) @rm -f sched_policies/data_locality$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sched_policies_data_locality_OBJECTS) $(sched_policies_data_locality_LDADD) $(LIBS) sched_policies/execute_all_tasks$(EXEEXT): $(sched_policies_execute_all_tasks_OBJECTS) $(sched_policies_execute_all_tasks_DEPENDENCIES) $(EXTRA_sched_policies_execute_all_tasks_DEPENDENCIES) sched_policies/$(am__dirstamp) @rm -f sched_policies/execute_all_tasks$(EXEEXT) $(AM_V_CCLD)$(sched_policies_execute_all_tasks_LINK) $(sched_policies_execute_all_tasks_OBJECTS) $(sched_policies_execute_all_tasks_LDADD) $(LIBS) sched_policies/prio$(EXEEXT): $(sched_policies_prio_OBJECTS) $(sched_policies_prio_DEPENDENCIES) $(EXTRA_sched_policies_prio_DEPENDENCIES) sched_policies/$(am__dirstamp) @rm -f sched_policies/prio$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sched_policies_prio_OBJECTS) $(sched_policies_prio_LDADD) $(LIBS) sched_policies/simple_cpu_gpu_sched$(EXEEXT): $(sched_policies_simple_cpu_gpu_sched_OBJECTS) $(sched_policies_simple_cpu_gpu_sched_DEPENDENCIES) $(EXTRA_sched_policies_simple_cpu_gpu_sched_DEPENDENCIES) sched_policies/$(am__dirstamp) @rm -f sched_policies/simple_cpu_gpu_sched$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sched_policies_simple_cpu_gpu_sched_OBJECTS) $(sched_policies_simple_cpu_gpu_sched_LDADD) $(LIBS) sched_policies/simple_deps$(EXEEXT): $(sched_policies_simple_deps_OBJECTS) $(sched_policies_simple_deps_DEPENDENCIES) $(EXTRA_sched_policies_simple_deps_DEPENDENCIES) sched_policies/$(am__dirstamp) @rm -f sched_policies/simple_deps$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sched_policies_simple_deps_OBJECTS) $(sched_policies_simple_deps_LDADD) $(LIBS) install-examplebinSCRIPTS: $(examplebin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(examplebin_SCRIPTS)'; test -n "$(examplebindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(examplebindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(examplebindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(examplebindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(examplebindir)$$dir" || exit $$?; \ } \ ; done uninstall-examplebinSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(examplebin_SCRIPTS)'; test -n "$(examplebindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(examplebindir)'; $(am__uninstall_files_from_dir) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f datawizard/*.$(OBJEXT) -rm -f datawizard/interfaces/bcsr/*.$(OBJEXT) -rm -f datawizard/interfaces/block/*.$(OBJEXT) -rm -f datawizard/interfaces/coo/*.$(OBJEXT) -rm -f datawizard/interfaces/csr/*.$(OBJEXT) -rm -f datawizard/interfaces/matrix/*.$(OBJEXT) -rm -f datawizard/interfaces/multiformat/*.$(OBJEXT) -rm -f datawizard/interfaces/variable/*.$(OBJEXT) -rm -f datawizard/interfaces/vector/*.$(OBJEXT) -rm -f main/*.$(OBJEXT) -rm -f overlap/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acquire_cb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acquire_cb_insert.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acquire_release.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acquire_release2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acquire_release_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acquire_try.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/allocate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/api_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/array_slice_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/async_tasks_overhead.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bcsr_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bcsr_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/block_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/block_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codelet_null_callback.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/commute.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/commute2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coo_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coo_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copy_interfaces.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/critical_section_with_void_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csr_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csr_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cublas_init.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cuda_only.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cuda_task_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cusparse_init.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data_implicit_deps.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data_invalidation.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data_locality.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data_lookup.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/declare_deps_after_submission.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/declare_deps_after_submission_synchronous.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/declare_deps_in_callback.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/deploop.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dining_philosophers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disk_compute.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disk_copy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disk_pack.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/display_structures_size.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/double_parameter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsm_stress.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/empty_task.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/empty_task_chain.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/empty_task_sync_point.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/empty_task_sync_point_tasks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/environment.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute_all_tasks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute_on_a_specific_worker.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute_on_all.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute_schedule.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/explicit_combined_worker.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/feed.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get_children_tasks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get_current_task.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpu_concurrency.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpu_ptr_register.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpu_register.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/handle_to_pointer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/in_place_partition.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/increment_init.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/increment_redux.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/increment_redux_lazy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/increment_redux_v2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init_exit_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init_exit_02.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init_run_deinit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_array.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_dyn_handles.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_many.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_nullcodelet.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_pack.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_value.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/invalid_blocking_calls.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/invalid_tasks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/invalidate_pending_requests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lazy_allocation.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lazy_unregister.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/local_pingpong.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/locality.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main_deprecated_func-deprecated_func.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/manual_reduction.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrix_as_vector.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrix_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrix_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mem_reclaim.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkdtemp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_like.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_like_async.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_conversion_codelets.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_conversion_codelets_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_cuda_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_data_release.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_handle_conversion.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_worker.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multithreaded.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multithreaded_init.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/no_unregister.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/non_linear_regression_based.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/noreclaim.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nowhere.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/opencl_codelet_unsigned_inc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/opencl_memset.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/overlap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pack.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_02.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_03.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_barrier_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_critical_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_critical_inline_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_critical_named_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_critical_named_inline_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_for_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_for_02.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_for_ordered_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_kernels.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_kernels_spmd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_master_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_master_inline_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_nested_lock_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_sections_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_sections_combined_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_simple_lock_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_single_copyprivate_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_single_copyprivate_inline_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_single_inline_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_single_nowait_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_single_wait_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/partition_dep.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/partition_lazy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pause_resume.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pinned_memory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prefetch_data_on_node.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prio.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readers_and_writers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readonly.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reclaim.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/redundant_buffer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/redux_acquire.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regenerate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regenerate_pipeline.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regression_based.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/restart.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run_driver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/same_handle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scratch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scratch_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simgrid-locality.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple_cpu_gpu_sched.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple_deps.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/specific_node.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spmd_peager.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_create_sync_task.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_data_cpy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_init.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_init_noworker.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_task_bundle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_task_wait.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_task_wait_for_all.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_worker_exists.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/static_restartable.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/static_restartable_tag.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/static_restartable_using_initializer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subgraph_repeat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subgraph_repeat_regenerate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subgraph_repeat_regenerate_tag.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subgraph_repeat_tag.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/submit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_and_notify_data.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_and_notify_data_implicit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_and_notify_data_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_tasks_overhead.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_with_data_with_mem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_with_data_with_mem_non_blocking.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_with_data_with_mem_non_blocking_implicit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_task_data_deps.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_wait_api.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/task_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/task_02.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/task_wait_api.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/task_with_multiple_time_the_same_handle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/taskgroup_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/taskgroup_02.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tasks_overhead.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tasks_size_overhead.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/taskwait_01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/temporary_partition.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_arbiter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_interfaces.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_vector_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_vector_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unpartition.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/user_base.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/user_interaction_implicit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/valid_model.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/value_nan.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variable_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variable_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variable_parameters.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/void_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wait_all_regenerable_tasks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/write_only_tmp_buffer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wt_broadcast.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wt_host.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< acquire_cb.o: datawizard/acquire_cb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT acquire_cb.o -MD -MP -MF $(DEPDIR)/acquire_cb.Tpo -c -o acquire_cb.o `test -f 'datawizard/acquire_cb.c' || echo '$(srcdir)/'`datawizard/acquire_cb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acquire_cb.Tpo $(DEPDIR)/acquire_cb.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/acquire_cb.c' object='acquire_cb.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o acquire_cb.o `test -f 'datawizard/acquire_cb.c' || echo '$(srcdir)/'`datawizard/acquire_cb.c acquire_cb.obj: datawizard/acquire_cb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT acquire_cb.obj -MD -MP -MF $(DEPDIR)/acquire_cb.Tpo -c -o acquire_cb.obj `if test -f 'datawizard/acquire_cb.c'; then $(CYGPATH_W) 'datawizard/acquire_cb.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/acquire_cb.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acquire_cb.Tpo $(DEPDIR)/acquire_cb.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/acquire_cb.c' object='acquire_cb.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o acquire_cb.obj `if test -f 'datawizard/acquire_cb.c'; then $(CYGPATH_W) 'datawizard/acquire_cb.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/acquire_cb.c'; fi` acquire_cb_insert.o: datawizard/acquire_cb_insert.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT acquire_cb_insert.o -MD -MP -MF $(DEPDIR)/acquire_cb_insert.Tpo -c -o acquire_cb_insert.o `test -f 'datawizard/acquire_cb_insert.c' || echo '$(srcdir)/'`datawizard/acquire_cb_insert.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acquire_cb_insert.Tpo $(DEPDIR)/acquire_cb_insert.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/acquire_cb_insert.c' object='acquire_cb_insert.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o acquire_cb_insert.o `test -f 'datawizard/acquire_cb_insert.c' || echo '$(srcdir)/'`datawizard/acquire_cb_insert.c acquire_cb_insert.obj: datawizard/acquire_cb_insert.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT acquire_cb_insert.obj -MD -MP -MF $(DEPDIR)/acquire_cb_insert.Tpo -c -o acquire_cb_insert.obj `if test -f 'datawizard/acquire_cb_insert.c'; then $(CYGPATH_W) 'datawizard/acquire_cb_insert.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/acquire_cb_insert.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acquire_cb_insert.Tpo $(DEPDIR)/acquire_cb_insert.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/acquire_cb_insert.c' object='acquire_cb_insert.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o acquire_cb_insert.obj `if test -f 'datawizard/acquire_cb_insert.c'; then $(CYGPATH_W) 'datawizard/acquire_cb_insert.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/acquire_cb_insert.c'; fi` acquire_release.o: datawizard/acquire_release.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT acquire_release.o -MD -MP -MF $(DEPDIR)/acquire_release.Tpo -c -o acquire_release.o `test -f 'datawizard/acquire_release.c' || echo '$(srcdir)/'`datawizard/acquire_release.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acquire_release.Tpo $(DEPDIR)/acquire_release.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/acquire_release.c' object='acquire_release.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o acquire_release.o `test -f 'datawizard/acquire_release.c' || echo '$(srcdir)/'`datawizard/acquire_release.c acquire_release.obj: datawizard/acquire_release.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT acquire_release.obj -MD -MP -MF $(DEPDIR)/acquire_release.Tpo -c -o acquire_release.obj `if test -f 'datawizard/acquire_release.c'; then $(CYGPATH_W) 'datawizard/acquire_release.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/acquire_release.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acquire_release.Tpo $(DEPDIR)/acquire_release.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/acquire_release.c' object='acquire_release.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o acquire_release.obj `if test -f 'datawizard/acquire_release.c'; then $(CYGPATH_W) 'datawizard/acquire_release.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/acquire_release.c'; fi` acquire_release_opencl.o: datawizard/acquire_release_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT acquire_release_opencl.o -MD -MP -MF $(DEPDIR)/acquire_release_opencl.Tpo -c -o acquire_release_opencl.o `test -f 'datawizard/acquire_release_opencl.c' || echo '$(srcdir)/'`datawizard/acquire_release_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acquire_release_opencl.Tpo $(DEPDIR)/acquire_release_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/acquire_release_opencl.c' object='acquire_release_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o acquire_release_opencl.o `test -f 'datawizard/acquire_release_opencl.c' || echo '$(srcdir)/'`datawizard/acquire_release_opencl.c acquire_release_opencl.obj: datawizard/acquire_release_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT acquire_release_opencl.obj -MD -MP -MF $(DEPDIR)/acquire_release_opencl.Tpo -c -o acquire_release_opencl.obj `if test -f 'datawizard/acquire_release_opencl.c'; then $(CYGPATH_W) 'datawizard/acquire_release_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/acquire_release_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acquire_release_opencl.Tpo $(DEPDIR)/acquire_release_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/acquire_release_opencl.c' object='acquire_release_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o acquire_release_opencl.obj `if test -f 'datawizard/acquire_release_opencl.c'; then $(CYGPATH_W) 'datawizard/acquire_release_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/acquire_release_opencl.c'; fi` acquire_release2.o: datawizard/acquire_release2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT acquire_release2.o -MD -MP -MF $(DEPDIR)/acquire_release2.Tpo -c -o acquire_release2.o `test -f 'datawizard/acquire_release2.c' || echo '$(srcdir)/'`datawizard/acquire_release2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acquire_release2.Tpo $(DEPDIR)/acquire_release2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/acquire_release2.c' object='acquire_release2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o acquire_release2.o `test -f 'datawizard/acquire_release2.c' || echo '$(srcdir)/'`datawizard/acquire_release2.c acquire_release2.obj: datawizard/acquire_release2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT acquire_release2.obj -MD -MP -MF $(DEPDIR)/acquire_release2.Tpo -c -o acquire_release2.obj `if test -f 'datawizard/acquire_release2.c'; then $(CYGPATH_W) 'datawizard/acquire_release2.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/acquire_release2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acquire_release2.Tpo $(DEPDIR)/acquire_release2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/acquire_release2.c' object='acquire_release2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o acquire_release2.obj `if test -f 'datawizard/acquire_release2.c'; then $(CYGPATH_W) 'datawizard/acquire_release2.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/acquire_release2.c'; fi` acquire_try.o: datawizard/acquire_try.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT acquire_try.o -MD -MP -MF $(DEPDIR)/acquire_try.Tpo -c -o acquire_try.o `test -f 'datawizard/acquire_try.c' || echo '$(srcdir)/'`datawizard/acquire_try.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acquire_try.Tpo $(DEPDIR)/acquire_try.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/acquire_try.c' object='acquire_try.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o acquire_try.o `test -f 'datawizard/acquire_try.c' || echo '$(srcdir)/'`datawizard/acquire_try.c acquire_try.obj: datawizard/acquire_try.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT acquire_try.obj -MD -MP -MF $(DEPDIR)/acquire_try.Tpo -c -o acquire_try.obj `if test -f 'datawizard/acquire_try.c'; then $(CYGPATH_W) 'datawizard/acquire_try.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/acquire_try.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acquire_try.Tpo $(DEPDIR)/acquire_try.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/acquire_try.c' object='acquire_try.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o acquire_try.obj `if test -f 'datawizard/acquire_try.c'; then $(CYGPATH_W) 'datawizard/acquire_try.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/acquire_try.c'; fi` allocate.o: datawizard/allocate.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT allocate.o -MD -MP -MF $(DEPDIR)/allocate.Tpo -c -o allocate.o `test -f 'datawizard/allocate.c' || echo '$(srcdir)/'`datawizard/allocate.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/allocate.Tpo $(DEPDIR)/allocate.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/allocate.c' object='allocate.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o allocate.o `test -f 'datawizard/allocate.c' || echo '$(srcdir)/'`datawizard/allocate.c allocate.obj: datawizard/allocate.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT allocate.obj -MD -MP -MF $(DEPDIR)/allocate.Tpo -c -o allocate.obj `if test -f 'datawizard/allocate.c'; then $(CYGPATH_W) 'datawizard/allocate.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/allocate.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/allocate.Tpo $(DEPDIR)/allocate.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/allocate.c' object='allocate.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o allocate.obj `if test -f 'datawizard/allocate.c'; then $(CYGPATH_W) 'datawizard/allocate.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/allocate.c'; fi` cache.o: datawizard/cache.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cache.o -MD -MP -MF $(DEPDIR)/cache.Tpo -c -o cache.o `test -f 'datawizard/cache.c' || echo '$(srcdir)/'`datawizard/cache.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cache.Tpo $(DEPDIR)/cache.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/cache.c' object='cache.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cache.o `test -f 'datawizard/cache.c' || echo '$(srcdir)/'`datawizard/cache.c cache.obj: datawizard/cache.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cache.obj -MD -MP -MF $(DEPDIR)/cache.Tpo -c -o cache.obj `if test -f 'datawizard/cache.c'; then $(CYGPATH_W) 'datawizard/cache.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/cache.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cache.Tpo $(DEPDIR)/cache.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/cache.c' object='cache.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cache.obj `if test -f 'datawizard/cache.c'; then $(CYGPATH_W) 'datawizard/cache.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/cache.c'; fi` commute.o: datawizard/commute.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT commute.o -MD -MP -MF $(DEPDIR)/commute.Tpo -c -o commute.o `test -f 'datawizard/commute.c' || echo '$(srcdir)/'`datawizard/commute.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/commute.Tpo $(DEPDIR)/commute.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/commute.c' object='commute.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o commute.o `test -f 'datawizard/commute.c' || echo '$(srcdir)/'`datawizard/commute.c commute.obj: datawizard/commute.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT commute.obj -MD -MP -MF $(DEPDIR)/commute.Tpo -c -o commute.obj `if test -f 'datawizard/commute.c'; then $(CYGPATH_W) 'datawizard/commute.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/commute.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/commute.Tpo $(DEPDIR)/commute.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/commute.c' object='commute.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o commute.obj `if test -f 'datawizard/commute.c'; then $(CYGPATH_W) 'datawizard/commute.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/commute.c'; fi` commute2.o: datawizard/commute2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT commute2.o -MD -MP -MF $(DEPDIR)/commute2.Tpo -c -o commute2.o `test -f 'datawizard/commute2.c' || echo '$(srcdir)/'`datawizard/commute2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/commute2.Tpo $(DEPDIR)/commute2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/commute2.c' object='commute2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o commute2.o `test -f 'datawizard/commute2.c' || echo '$(srcdir)/'`datawizard/commute2.c commute2.obj: datawizard/commute2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT commute2.obj -MD -MP -MF $(DEPDIR)/commute2.Tpo -c -o commute2.obj `if test -f 'datawizard/commute2.c'; then $(CYGPATH_W) 'datawizard/commute2.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/commute2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/commute2.Tpo $(DEPDIR)/commute2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/commute2.c' object='commute2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o commute2.obj `if test -f 'datawizard/commute2.c'; then $(CYGPATH_W) 'datawizard/commute2.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/commute2.c'; fi` copy.o: datawizard/copy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT copy.o -MD -MP -MF $(DEPDIR)/copy.Tpo -c -o copy.o `test -f 'datawizard/copy.c' || echo '$(srcdir)/'`datawizard/copy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/copy.Tpo $(DEPDIR)/copy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/copy.c' object='copy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o copy.o `test -f 'datawizard/copy.c' || echo '$(srcdir)/'`datawizard/copy.c copy.obj: datawizard/copy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT copy.obj -MD -MP -MF $(DEPDIR)/copy.Tpo -c -o copy.obj `if test -f 'datawizard/copy.c'; then $(CYGPATH_W) 'datawizard/copy.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/copy.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/copy.Tpo $(DEPDIR)/copy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/copy.c' object='copy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o copy.obj `if test -f 'datawizard/copy.c'; then $(CYGPATH_W) 'datawizard/copy.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/copy.c'; fi` critical_section_with_void_interface.o: datawizard/critical_section_with_void_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT critical_section_with_void_interface.o -MD -MP -MF $(DEPDIR)/critical_section_with_void_interface.Tpo -c -o critical_section_with_void_interface.o `test -f 'datawizard/critical_section_with_void_interface.c' || echo '$(srcdir)/'`datawizard/critical_section_with_void_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/critical_section_with_void_interface.Tpo $(DEPDIR)/critical_section_with_void_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/critical_section_with_void_interface.c' object='critical_section_with_void_interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o critical_section_with_void_interface.o `test -f 'datawizard/critical_section_with_void_interface.c' || echo '$(srcdir)/'`datawizard/critical_section_with_void_interface.c critical_section_with_void_interface.obj: datawizard/critical_section_with_void_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT critical_section_with_void_interface.obj -MD -MP -MF $(DEPDIR)/critical_section_with_void_interface.Tpo -c -o critical_section_with_void_interface.obj `if test -f 'datawizard/critical_section_with_void_interface.c'; then $(CYGPATH_W) 'datawizard/critical_section_with_void_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/critical_section_with_void_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/critical_section_with_void_interface.Tpo $(DEPDIR)/critical_section_with_void_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/critical_section_with_void_interface.c' object='critical_section_with_void_interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o critical_section_with_void_interface.obj `if test -f 'datawizard/critical_section_with_void_interface.c'; then $(CYGPATH_W) 'datawizard/critical_section_with_void_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/critical_section_with_void_interface.c'; fi` data_implicit_deps.o: datawizard/data_implicit_deps.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT data_implicit_deps.o -MD -MP -MF $(DEPDIR)/data_implicit_deps.Tpo -c -o data_implicit_deps.o `test -f 'datawizard/data_implicit_deps.c' || echo '$(srcdir)/'`datawizard/data_implicit_deps.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/data_implicit_deps.Tpo $(DEPDIR)/data_implicit_deps.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/data_implicit_deps.c' object='data_implicit_deps.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o data_implicit_deps.o `test -f 'datawizard/data_implicit_deps.c' || echo '$(srcdir)/'`datawizard/data_implicit_deps.c data_implicit_deps.obj: datawizard/data_implicit_deps.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT data_implicit_deps.obj -MD -MP -MF $(DEPDIR)/data_implicit_deps.Tpo -c -o data_implicit_deps.obj `if test -f 'datawizard/data_implicit_deps.c'; then $(CYGPATH_W) 'datawizard/data_implicit_deps.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/data_implicit_deps.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/data_implicit_deps.Tpo $(DEPDIR)/data_implicit_deps.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/data_implicit_deps.c' object='data_implicit_deps.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o data_implicit_deps.obj `if test -f 'datawizard/data_implicit_deps.c'; then $(CYGPATH_W) 'datawizard/data_implicit_deps.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/data_implicit_deps.c'; fi` data_invalidation.o: datawizard/data_invalidation.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT data_invalidation.o -MD -MP -MF $(DEPDIR)/data_invalidation.Tpo -c -o data_invalidation.o `test -f 'datawizard/data_invalidation.c' || echo '$(srcdir)/'`datawizard/data_invalidation.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/data_invalidation.Tpo $(DEPDIR)/data_invalidation.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/data_invalidation.c' object='data_invalidation.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o data_invalidation.o `test -f 'datawizard/data_invalidation.c' || echo '$(srcdir)/'`datawizard/data_invalidation.c data_invalidation.obj: datawizard/data_invalidation.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT data_invalidation.obj -MD -MP -MF $(DEPDIR)/data_invalidation.Tpo -c -o data_invalidation.obj `if test -f 'datawizard/data_invalidation.c'; then $(CYGPATH_W) 'datawizard/data_invalidation.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/data_invalidation.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/data_invalidation.Tpo $(DEPDIR)/data_invalidation.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/data_invalidation.c' object='data_invalidation.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o data_invalidation.obj `if test -f 'datawizard/data_invalidation.c'; then $(CYGPATH_W) 'datawizard/data_invalidation.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/data_invalidation.c'; fi` data_lookup.o: datawizard/data_lookup.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT data_lookup.o -MD -MP -MF $(DEPDIR)/data_lookup.Tpo -c -o data_lookup.o `test -f 'datawizard/data_lookup.c' || echo '$(srcdir)/'`datawizard/data_lookup.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/data_lookup.Tpo $(DEPDIR)/data_lookup.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/data_lookup.c' object='data_lookup.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o data_lookup.o `test -f 'datawizard/data_lookup.c' || echo '$(srcdir)/'`datawizard/data_lookup.c data_lookup.obj: datawizard/data_lookup.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT data_lookup.obj -MD -MP -MF $(DEPDIR)/data_lookup.Tpo -c -o data_lookup.obj `if test -f 'datawizard/data_lookup.c'; then $(CYGPATH_W) 'datawizard/data_lookup.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/data_lookup.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/data_lookup.Tpo $(DEPDIR)/data_lookup.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/data_lookup.c' object='data_lookup.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o data_lookup.obj `if test -f 'datawizard/data_lookup.c'; then $(CYGPATH_W) 'datawizard/data_lookup.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/data_lookup.c'; fi` dining_philosophers.o: datawizard/dining_philosophers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dining_philosophers.o -MD -MP -MF $(DEPDIR)/dining_philosophers.Tpo -c -o dining_philosophers.o `test -f 'datawizard/dining_philosophers.c' || echo '$(srcdir)/'`datawizard/dining_philosophers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dining_philosophers.Tpo $(DEPDIR)/dining_philosophers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/dining_philosophers.c' object='dining_philosophers.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dining_philosophers.o `test -f 'datawizard/dining_philosophers.c' || echo '$(srcdir)/'`datawizard/dining_philosophers.c dining_philosophers.obj: datawizard/dining_philosophers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dining_philosophers.obj -MD -MP -MF $(DEPDIR)/dining_philosophers.Tpo -c -o dining_philosophers.obj `if test -f 'datawizard/dining_philosophers.c'; then $(CYGPATH_W) 'datawizard/dining_philosophers.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/dining_philosophers.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dining_philosophers.Tpo $(DEPDIR)/dining_philosophers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/dining_philosophers.c' object='dining_philosophers.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dining_philosophers.obj `if test -f 'datawizard/dining_philosophers.c'; then $(CYGPATH_W) 'datawizard/dining_philosophers.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/dining_philosophers.c'; fi` double_parameter.o: datawizard/double_parameter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT double_parameter.o -MD -MP -MF $(DEPDIR)/double_parameter.Tpo -c -o double_parameter.o `test -f 'datawizard/double_parameter.c' || echo '$(srcdir)/'`datawizard/double_parameter.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/double_parameter.Tpo $(DEPDIR)/double_parameter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/double_parameter.c' object='double_parameter.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o double_parameter.o `test -f 'datawizard/double_parameter.c' || echo '$(srcdir)/'`datawizard/double_parameter.c double_parameter.obj: datawizard/double_parameter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT double_parameter.obj -MD -MP -MF $(DEPDIR)/double_parameter.Tpo -c -o double_parameter.obj `if test -f 'datawizard/double_parameter.c'; then $(CYGPATH_W) 'datawizard/double_parameter.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/double_parameter.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/double_parameter.Tpo $(DEPDIR)/double_parameter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/double_parameter.c' object='double_parameter.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o double_parameter.obj `if test -f 'datawizard/double_parameter.c'; then $(CYGPATH_W) 'datawizard/double_parameter.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/double_parameter.c'; fi` dsm_stress.o: datawizard/dsm_stress.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsm_stress.o -MD -MP -MF $(DEPDIR)/dsm_stress.Tpo -c -o dsm_stress.o `test -f 'datawizard/dsm_stress.c' || echo '$(srcdir)/'`datawizard/dsm_stress.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dsm_stress.Tpo $(DEPDIR)/dsm_stress.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/dsm_stress.c' object='dsm_stress.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsm_stress.o `test -f 'datawizard/dsm_stress.c' || echo '$(srcdir)/'`datawizard/dsm_stress.c dsm_stress.obj: datawizard/dsm_stress.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsm_stress.obj -MD -MP -MF $(DEPDIR)/dsm_stress.Tpo -c -o dsm_stress.obj `if test -f 'datawizard/dsm_stress.c'; then $(CYGPATH_W) 'datawizard/dsm_stress.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/dsm_stress.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dsm_stress.Tpo $(DEPDIR)/dsm_stress.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/dsm_stress.c' object='dsm_stress.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsm_stress.obj `if test -f 'datawizard/dsm_stress.c'; then $(CYGPATH_W) 'datawizard/dsm_stress.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/dsm_stress.c'; fi` gpu_ptr_register.o: datawizard/gpu_ptr_register.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpu_ptr_register.o -MD -MP -MF $(DEPDIR)/gpu_ptr_register.Tpo -c -o gpu_ptr_register.o `test -f 'datawizard/gpu_ptr_register.c' || echo '$(srcdir)/'`datawizard/gpu_ptr_register.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gpu_ptr_register.Tpo $(DEPDIR)/gpu_ptr_register.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/gpu_ptr_register.c' object='gpu_ptr_register.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpu_ptr_register.o `test -f 'datawizard/gpu_ptr_register.c' || echo '$(srcdir)/'`datawizard/gpu_ptr_register.c gpu_ptr_register.obj: datawizard/gpu_ptr_register.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpu_ptr_register.obj -MD -MP -MF $(DEPDIR)/gpu_ptr_register.Tpo -c -o gpu_ptr_register.obj `if test -f 'datawizard/gpu_ptr_register.c'; then $(CYGPATH_W) 'datawizard/gpu_ptr_register.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/gpu_ptr_register.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gpu_ptr_register.Tpo $(DEPDIR)/gpu_ptr_register.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/gpu_ptr_register.c' object='gpu_ptr_register.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpu_ptr_register.obj `if test -f 'datawizard/gpu_ptr_register.c'; then $(CYGPATH_W) 'datawizard/gpu_ptr_register.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/gpu_ptr_register.c'; fi` scal.o: datawizard/scal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT scal.o -MD -MP -MF $(DEPDIR)/scal.Tpo -c -o scal.o `test -f 'datawizard/scal.c' || echo '$(srcdir)/'`datawizard/scal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/scal.Tpo $(DEPDIR)/scal.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/scal.c' object='scal.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o scal.o `test -f 'datawizard/scal.c' || echo '$(srcdir)/'`datawizard/scal.c scal.obj: datawizard/scal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT scal.obj -MD -MP -MF $(DEPDIR)/scal.Tpo -c -o scal.obj `if test -f 'datawizard/scal.c'; then $(CYGPATH_W) 'datawizard/scal.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/scal.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/scal.Tpo $(DEPDIR)/scal.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/scal.c' object='scal.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o scal.obj `if test -f 'datawizard/scal.c'; then $(CYGPATH_W) 'datawizard/scal.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/scal.c'; fi` gpu_register.o: datawizard/gpu_register.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpu_register.o -MD -MP -MF $(DEPDIR)/gpu_register.Tpo -c -o gpu_register.o `test -f 'datawizard/gpu_register.c' || echo '$(srcdir)/'`datawizard/gpu_register.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gpu_register.Tpo $(DEPDIR)/gpu_register.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/gpu_register.c' object='gpu_register.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpu_register.o `test -f 'datawizard/gpu_register.c' || echo '$(srcdir)/'`datawizard/gpu_register.c gpu_register.obj: datawizard/gpu_register.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpu_register.obj -MD -MP -MF $(DEPDIR)/gpu_register.Tpo -c -o gpu_register.obj `if test -f 'datawizard/gpu_register.c'; then $(CYGPATH_W) 'datawizard/gpu_register.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/gpu_register.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gpu_register.Tpo $(DEPDIR)/gpu_register.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/gpu_register.c' object='gpu_register.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpu_register.obj `if test -f 'datawizard/gpu_register.c'; then $(CYGPATH_W) 'datawizard/gpu_register.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/gpu_register.c'; fi` handle_to_pointer.o: datawizard/handle_to_pointer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT handle_to_pointer.o -MD -MP -MF $(DEPDIR)/handle_to_pointer.Tpo -c -o handle_to_pointer.o `test -f 'datawizard/handle_to_pointer.c' || echo '$(srcdir)/'`datawizard/handle_to_pointer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/handle_to_pointer.Tpo $(DEPDIR)/handle_to_pointer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/handle_to_pointer.c' object='handle_to_pointer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o handle_to_pointer.o `test -f 'datawizard/handle_to_pointer.c' || echo '$(srcdir)/'`datawizard/handle_to_pointer.c handle_to_pointer.obj: datawizard/handle_to_pointer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT handle_to_pointer.obj -MD -MP -MF $(DEPDIR)/handle_to_pointer.Tpo -c -o handle_to_pointer.obj `if test -f 'datawizard/handle_to_pointer.c'; then $(CYGPATH_W) 'datawizard/handle_to_pointer.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/handle_to_pointer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/handle_to_pointer.Tpo $(DEPDIR)/handle_to_pointer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/handle_to_pointer.c' object='handle_to_pointer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o handle_to_pointer.obj `if test -f 'datawizard/handle_to_pointer.c'; then $(CYGPATH_W) 'datawizard/handle_to_pointer.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/handle_to_pointer.c'; fi` in_place_partition.o: datawizard/in_place_partition.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT in_place_partition.o -MD -MP -MF $(DEPDIR)/in_place_partition.Tpo -c -o in_place_partition.o `test -f 'datawizard/in_place_partition.c' || echo '$(srcdir)/'`datawizard/in_place_partition.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/in_place_partition.Tpo $(DEPDIR)/in_place_partition.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/in_place_partition.c' object='in_place_partition.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o in_place_partition.o `test -f 'datawizard/in_place_partition.c' || echo '$(srcdir)/'`datawizard/in_place_partition.c in_place_partition.obj: datawizard/in_place_partition.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT in_place_partition.obj -MD -MP -MF $(DEPDIR)/in_place_partition.Tpo -c -o in_place_partition.obj `if test -f 'datawizard/in_place_partition.c'; then $(CYGPATH_W) 'datawizard/in_place_partition.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/in_place_partition.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/in_place_partition.Tpo $(DEPDIR)/in_place_partition.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/in_place_partition.c' object='in_place_partition.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o in_place_partition.obj `if test -f 'datawizard/in_place_partition.c'; then $(CYGPATH_W) 'datawizard/in_place_partition.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/in_place_partition.c'; fi` increment_init.o: datawizard/increment_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT increment_init.o -MD -MP -MF $(DEPDIR)/increment_init.Tpo -c -o increment_init.o `test -f 'datawizard/increment_init.c' || echo '$(srcdir)/'`datawizard/increment_init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/increment_init.Tpo $(DEPDIR)/increment_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/increment_init.c' object='increment_init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o increment_init.o `test -f 'datawizard/increment_init.c' || echo '$(srcdir)/'`datawizard/increment_init.c increment_init.obj: datawizard/increment_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT increment_init.obj -MD -MP -MF $(DEPDIR)/increment_init.Tpo -c -o increment_init.obj `if test -f 'datawizard/increment_init.c'; then $(CYGPATH_W) 'datawizard/increment_init.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/increment_init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/increment_init.Tpo $(DEPDIR)/increment_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/increment_init.c' object='increment_init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o increment_init.obj `if test -f 'datawizard/increment_init.c'; then $(CYGPATH_W) 'datawizard/increment_init.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/increment_init.c'; fi` increment_redux.o: datawizard/increment_redux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT increment_redux.o -MD -MP -MF $(DEPDIR)/increment_redux.Tpo -c -o increment_redux.o `test -f 'datawizard/increment_redux.c' || echo '$(srcdir)/'`datawizard/increment_redux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/increment_redux.Tpo $(DEPDIR)/increment_redux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/increment_redux.c' object='increment_redux.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o increment_redux.o `test -f 'datawizard/increment_redux.c' || echo '$(srcdir)/'`datawizard/increment_redux.c increment_redux.obj: datawizard/increment_redux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT increment_redux.obj -MD -MP -MF $(DEPDIR)/increment_redux.Tpo -c -o increment_redux.obj `if test -f 'datawizard/increment_redux.c'; then $(CYGPATH_W) 'datawizard/increment_redux.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/increment_redux.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/increment_redux.Tpo $(DEPDIR)/increment_redux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/increment_redux.c' object='increment_redux.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o increment_redux.obj `if test -f 'datawizard/increment_redux.c'; then $(CYGPATH_W) 'datawizard/increment_redux.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/increment_redux.c'; fi` increment_redux_lazy.o: datawizard/increment_redux_lazy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT increment_redux_lazy.o -MD -MP -MF $(DEPDIR)/increment_redux_lazy.Tpo -c -o increment_redux_lazy.o `test -f 'datawizard/increment_redux_lazy.c' || echo '$(srcdir)/'`datawizard/increment_redux_lazy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/increment_redux_lazy.Tpo $(DEPDIR)/increment_redux_lazy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/increment_redux_lazy.c' object='increment_redux_lazy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o increment_redux_lazy.o `test -f 'datawizard/increment_redux_lazy.c' || echo '$(srcdir)/'`datawizard/increment_redux_lazy.c increment_redux_lazy.obj: datawizard/increment_redux_lazy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT increment_redux_lazy.obj -MD -MP -MF $(DEPDIR)/increment_redux_lazy.Tpo -c -o increment_redux_lazy.obj `if test -f 'datawizard/increment_redux_lazy.c'; then $(CYGPATH_W) 'datawizard/increment_redux_lazy.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/increment_redux_lazy.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/increment_redux_lazy.Tpo $(DEPDIR)/increment_redux_lazy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/increment_redux_lazy.c' object='increment_redux_lazy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o increment_redux_lazy.obj `if test -f 'datawizard/increment_redux_lazy.c'; then $(CYGPATH_W) 'datawizard/increment_redux_lazy.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/increment_redux_lazy.c'; fi` increment_redux_v2.o: datawizard/increment_redux_v2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT increment_redux_v2.o -MD -MP -MF $(DEPDIR)/increment_redux_v2.Tpo -c -o increment_redux_v2.o `test -f 'datawizard/increment_redux_v2.c' || echo '$(srcdir)/'`datawizard/increment_redux_v2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/increment_redux_v2.Tpo $(DEPDIR)/increment_redux_v2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/increment_redux_v2.c' object='increment_redux_v2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o increment_redux_v2.o `test -f 'datawizard/increment_redux_v2.c' || echo '$(srcdir)/'`datawizard/increment_redux_v2.c increment_redux_v2.obj: datawizard/increment_redux_v2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT increment_redux_v2.obj -MD -MP -MF $(DEPDIR)/increment_redux_v2.Tpo -c -o increment_redux_v2.obj `if test -f 'datawizard/increment_redux_v2.c'; then $(CYGPATH_W) 'datawizard/increment_redux_v2.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/increment_redux_v2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/increment_redux_v2.Tpo $(DEPDIR)/increment_redux_v2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/increment_redux_v2.c' object='increment_redux_v2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o increment_redux_v2.obj `if test -f 'datawizard/increment_redux_v2.c'; then $(CYGPATH_W) 'datawizard/increment_redux_v2.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/increment_redux_v2.c'; fi` test_interfaces.o: datawizard/interfaces/test_interfaces.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_interfaces.o -MD -MP -MF $(DEPDIR)/test_interfaces.Tpo -c -o test_interfaces.o `test -f 'datawizard/interfaces/test_interfaces.c' || echo '$(srcdir)/'`datawizard/interfaces/test_interfaces.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_interfaces.Tpo $(DEPDIR)/test_interfaces.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/test_interfaces.c' object='test_interfaces.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_interfaces.o `test -f 'datawizard/interfaces/test_interfaces.c' || echo '$(srcdir)/'`datawizard/interfaces/test_interfaces.c test_interfaces.obj: datawizard/interfaces/test_interfaces.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_interfaces.obj -MD -MP -MF $(DEPDIR)/test_interfaces.Tpo -c -o test_interfaces.obj `if test -f 'datawizard/interfaces/test_interfaces.c'; then $(CYGPATH_W) 'datawizard/interfaces/test_interfaces.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/test_interfaces.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_interfaces.Tpo $(DEPDIR)/test_interfaces.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/test_interfaces.c' object='test_interfaces.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_interfaces.obj `if test -f 'datawizard/interfaces/test_interfaces.c'; then $(CYGPATH_W) 'datawizard/interfaces/test_interfaces.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/test_interfaces.c'; fi` bcsr_interface.o: datawizard/interfaces/bcsr/bcsr_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bcsr_interface.o -MD -MP -MF $(DEPDIR)/bcsr_interface.Tpo -c -o bcsr_interface.o `test -f 'datawizard/interfaces/bcsr/bcsr_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/bcsr/bcsr_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bcsr_interface.Tpo $(DEPDIR)/bcsr_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/bcsr/bcsr_interface.c' object='bcsr_interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bcsr_interface.o `test -f 'datawizard/interfaces/bcsr/bcsr_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/bcsr/bcsr_interface.c bcsr_interface.obj: datawizard/interfaces/bcsr/bcsr_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bcsr_interface.obj -MD -MP -MF $(DEPDIR)/bcsr_interface.Tpo -c -o bcsr_interface.obj `if test -f 'datawizard/interfaces/bcsr/bcsr_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/bcsr/bcsr_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/bcsr/bcsr_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bcsr_interface.Tpo $(DEPDIR)/bcsr_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/bcsr/bcsr_interface.c' object='bcsr_interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bcsr_interface.obj `if test -f 'datawizard/interfaces/bcsr/bcsr_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/bcsr/bcsr_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/bcsr/bcsr_interface.c'; fi` bcsr_opencl.o: datawizard/interfaces/bcsr/bcsr_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bcsr_opencl.o -MD -MP -MF $(DEPDIR)/bcsr_opencl.Tpo -c -o bcsr_opencl.o `test -f 'datawizard/interfaces/bcsr/bcsr_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/bcsr/bcsr_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bcsr_opencl.Tpo $(DEPDIR)/bcsr_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/bcsr/bcsr_opencl.c' object='bcsr_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bcsr_opencl.o `test -f 'datawizard/interfaces/bcsr/bcsr_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/bcsr/bcsr_opencl.c bcsr_opencl.obj: datawizard/interfaces/bcsr/bcsr_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bcsr_opencl.obj -MD -MP -MF $(DEPDIR)/bcsr_opencl.Tpo -c -o bcsr_opencl.obj `if test -f 'datawizard/interfaces/bcsr/bcsr_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/bcsr/bcsr_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/bcsr/bcsr_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bcsr_opencl.Tpo $(DEPDIR)/bcsr_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/bcsr/bcsr_opencl.c' object='bcsr_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bcsr_opencl.obj `if test -f 'datawizard/interfaces/bcsr/bcsr_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/bcsr/bcsr_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/bcsr/bcsr_opencl.c'; fi` block_interface.o: datawizard/interfaces/block/block_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT block_interface.o -MD -MP -MF $(DEPDIR)/block_interface.Tpo -c -o block_interface.o `test -f 'datawizard/interfaces/block/block_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/block/block_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/block_interface.Tpo $(DEPDIR)/block_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/block/block_interface.c' object='block_interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o block_interface.o `test -f 'datawizard/interfaces/block/block_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/block/block_interface.c block_interface.obj: datawizard/interfaces/block/block_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT block_interface.obj -MD -MP -MF $(DEPDIR)/block_interface.Tpo -c -o block_interface.obj `if test -f 'datawizard/interfaces/block/block_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/block/block_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/block/block_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/block_interface.Tpo $(DEPDIR)/block_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/block/block_interface.c' object='block_interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o block_interface.obj `if test -f 'datawizard/interfaces/block/block_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/block/block_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/block/block_interface.c'; fi` block_opencl.o: datawizard/interfaces/block/block_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT block_opencl.o -MD -MP -MF $(DEPDIR)/block_opencl.Tpo -c -o block_opencl.o `test -f 'datawizard/interfaces/block/block_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/block/block_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/block_opencl.Tpo $(DEPDIR)/block_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/block/block_opencl.c' object='block_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o block_opencl.o `test -f 'datawizard/interfaces/block/block_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/block/block_opencl.c block_opencl.obj: datawizard/interfaces/block/block_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT block_opencl.obj -MD -MP -MF $(DEPDIR)/block_opencl.Tpo -c -o block_opencl.obj `if test -f 'datawizard/interfaces/block/block_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/block/block_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/block/block_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/block_opencl.Tpo $(DEPDIR)/block_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/block/block_opencl.c' object='block_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o block_opencl.obj `if test -f 'datawizard/interfaces/block/block_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/block/block_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/block/block_opencl.c'; fi` coo_interface.o: datawizard/interfaces/coo/coo_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coo_interface.o -MD -MP -MF $(DEPDIR)/coo_interface.Tpo -c -o coo_interface.o `test -f 'datawizard/interfaces/coo/coo_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/coo/coo_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/coo_interface.Tpo $(DEPDIR)/coo_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/coo/coo_interface.c' object='coo_interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coo_interface.o `test -f 'datawizard/interfaces/coo/coo_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/coo/coo_interface.c coo_interface.obj: datawizard/interfaces/coo/coo_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coo_interface.obj -MD -MP -MF $(DEPDIR)/coo_interface.Tpo -c -o coo_interface.obj `if test -f 'datawizard/interfaces/coo/coo_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/coo/coo_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/coo/coo_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/coo_interface.Tpo $(DEPDIR)/coo_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/coo/coo_interface.c' object='coo_interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coo_interface.obj `if test -f 'datawizard/interfaces/coo/coo_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/coo/coo_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/coo/coo_interface.c'; fi` coo_opencl.o: datawizard/interfaces/coo/coo_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coo_opencl.o -MD -MP -MF $(DEPDIR)/coo_opencl.Tpo -c -o coo_opencl.o `test -f 'datawizard/interfaces/coo/coo_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/coo/coo_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/coo_opencl.Tpo $(DEPDIR)/coo_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/coo/coo_opencl.c' object='coo_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coo_opencl.o `test -f 'datawizard/interfaces/coo/coo_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/coo/coo_opencl.c coo_opencl.obj: datawizard/interfaces/coo/coo_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coo_opencl.obj -MD -MP -MF $(DEPDIR)/coo_opencl.Tpo -c -o coo_opencl.obj `if test -f 'datawizard/interfaces/coo/coo_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/coo/coo_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/coo/coo_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/coo_opencl.Tpo $(DEPDIR)/coo_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/coo/coo_opencl.c' object='coo_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coo_opencl.obj `if test -f 'datawizard/interfaces/coo/coo_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/coo/coo_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/coo/coo_opencl.c'; fi` copy_interfaces.o: datawizard/interfaces/copy_interfaces.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT copy_interfaces.o -MD -MP -MF $(DEPDIR)/copy_interfaces.Tpo -c -o copy_interfaces.o `test -f 'datawizard/interfaces/copy_interfaces.c' || echo '$(srcdir)/'`datawizard/interfaces/copy_interfaces.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/copy_interfaces.Tpo $(DEPDIR)/copy_interfaces.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/copy_interfaces.c' object='copy_interfaces.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o copy_interfaces.o `test -f 'datawizard/interfaces/copy_interfaces.c' || echo '$(srcdir)/'`datawizard/interfaces/copy_interfaces.c copy_interfaces.obj: datawizard/interfaces/copy_interfaces.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT copy_interfaces.obj -MD -MP -MF $(DEPDIR)/copy_interfaces.Tpo -c -o copy_interfaces.obj `if test -f 'datawizard/interfaces/copy_interfaces.c'; then $(CYGPATH_W) 'datawizard/interfaces/copy_interfaces.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/copy_interfaces.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/copy_interfaces.Tpo $(DEPDIR)/copy_interfaces.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/copy_interfaces.c' object='copy_interfaces.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o copy_interfaces.obj `if test -f 'datawizard/interfaces/copy_interfaces.c'; then $(CYGPATH_W) 'datawizard/interfaces/copy_interfaces.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/copy_interfaces.c'; fi` csr_interface.o: datawizard/interfaces/csr/csr_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT csr_interface.o -MD -MP -MF $(DEPDIR)/csr_interface.Tpo -c -o csr_interface.o `test -f 'datawizard/interfaces/csr/csr_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/csr/csr_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/csr_interface.Tpo $(DEPDIR)/csr_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/csr/csr_interface.c' object='csr_interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o csr_interface.o `test -f 'datawizard/interfaces/csr/csr_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/csr/csr_interface.c csr_interface.obj: datawizard/interfaces/csr/csr_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT csr_interface.obj -MD -MP -MF $(DEPDIR)/csr_interface.Tpo -c -o csr_interface.obj `if test -f 'datawizard/interfaces/csr/csr_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/csr/csr_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/csr/csr_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/csr_interface.Tpo $(DEPDIR)/csr_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/csr/csr_interface.c' object='csr_interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o csr_interface.obj `if test -f 'datawizard/interfaces/csr/csr_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/csr/csr_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/csr/csr_interface.c'; fi` csr_opencl.o: datawizard/interfaces/csr/csr_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT csr_opencl.o -MD -MP -MF $(DEPDIR)/csr_opencl.Tpo -c -o csr_opencl.o `test -f 'datawizard/interfaces/csr/csr_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/csr/csr_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/csr_opencl.Tpo $(DEPDIR)/csr_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/csr/csr_opencl.c' object='csr_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o csr_opencl.o `test -f 'datawizard/interfaces/csr/csr_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/csr/csr_opencl.c csr_opencl.obj: datawizard/interfaces/csr/csr_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT csr_opencl.obj -MD -MP -MF $(DEPDIR)/csr_opencl.Tpo -c -o csr_opencl.obj `if test -f 'datawizard/interfaces/csr/csr_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/csr/csr_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/csr/csr_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/csr_opencl.Tpo $(DEPDIR)/csr_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/csr/csr_opencl.c' object='csr_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o csr_opencl.obj `if test -f 'datawizard/interfaces/csr/csr_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/csr/csr_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/csr/csr_opencl.c'; fi` matrix_interface.o: datawizard/interfaces/matrix/matrix_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matrix_interface.o -MD -MP -MF $(DEPDIR)/matrix_interface.Tpo -c -o matrix_interface.o `test -f 'datawizard/interfaces/matrix/matrix_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/matrix/matrix_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matrix_interface.Tpo $(DEPDIR)/matrix_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/matrix/matrix_interface.c' object='matrix_interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o matrix_interface.o `test -f 'datawizard/interfaces/matrix/matrix_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/matrix/matrix_interface.c matrix_interface.obj: datawizard/interfaces/matrix/matrix_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matrix_interface.obj -MD -MP -MF $(DEPDIR)/matrix_interface.Tpo -c -o matrix_interface.obj `if test -f 'datawizard/interfaces/matrix/matrix_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/matrix/matrix_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/matrix/matrix_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matrix_interface.Tpo $(DEPDIR)/matrix_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/matrix/matrix_interface.c' object='matrix_interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o matrix_interface.obj `if test -f 'datawizard/interfaces/matrix/matrix_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/matrix/matrix_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/matrix/matrix_interface.c'; fi` matrix_opencl.o: datawizard/interfaces/matrix/matrix_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matrix_opencl.o -MD -MP -MF $(DEPDIR)/matrix_opencl.Tpo -c -o matrix_opencl.o `test -f 'datawizard/interfaces/matrix/matrix_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/matrix/matrix_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matrix_opencl.Tpo $(DEPDIR)/matrix_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/matrix/matrix_opencl.c' object='matrix_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o matrix_opencl.o `test -f 'datawizard/interfaces/matrix/matrix_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/matrix/matrix_opencl.c matrix_opencl.obj: datawizard/interfaces/matrix/matrix_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matrix_opencl.obj -MD -MP -MF $(DEPDIR)/matrix_opencl.Tpo -c -o matrix_opencl.obj `if test -f 'datawizard/interfaces/matrix/matrix_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/matrix/matrix_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/matrix/matrix_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matrix_opencl.Tpo $(DEPDIR)/matrix_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/matrix/matrix_opencl.c' object='matrix_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o matrix_opencl.obj `if test -f 'datawizard/interfaces/matrix/matrix_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/matrix/matrix_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/matrix/matrix_opencl.c'; fi` generic.o: datawizard/interfaces/multiformat/advanced/generic.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT generic.o -MD -MP -MF $(DEPDIR)/generic.Tpo -c -o generic.o `test -f 'datawizard/interfaces/multiformat/advanced/generic.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/advanced/generic.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/generic.Tpo $(DEPDIR)/generic.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/advanced/generic.c' object='generic.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o generic.o `test -f 'datawizard/interfaces/multiformat/advanced/generic.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/advanced/generic.c generic.obj: datawizard/interfaces/multiformat/advanced/generic.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT generic.obj -MD -MP -MF $(DEPDIR)/generic.Tpo -c -o generic.obj `if test -f 'datawizard/interfaces/multiformat/advanced/generic.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/advanced/generic.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/advanced/generic.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/generic.Tpo $(DEPDIR)/generic.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/advanced/generic.c' object='generic.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o generic.obj `if test -f 'datawizard/interfaces/multiformat/advanced/generic.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/advanced/generic.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/advanced/generic.c'; fi` multiformat_cuda_opencl.o: datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_cuda_opencl.o -MD -MP -MF $(DEPDIR)/multiformat_cuda_opencl.Tpo -c -o multiformat_cuda_opencl.o `test -f 'datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_cuda_opencl.Tpo $(DEPDIR)/multiformat_cuda_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c' object='multiformat_cuda_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_cuda_opencl.o `test -f 'datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c multiformat_cuda_opencl.obj: datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_cuda_opencl.obj -MD -MP -MF $(DEPDIR)/multiformat_cuda_opencl.Tpo -c -o multiformat_cuda_opencl.obj `if test -f 'datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_cuda_opencl.Tpo $(DEPDIR)/multiformat_cuda_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c' object='multiformat_cuda_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_cuda_opencl.obj `if test -f 'datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c'; fi` multiformat_data_release.o: datawizard/interfaces/multiformat/advanced/multiformat_data_release.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_data_release.o -MD -MP -MF $(DEPDIR)/multiformat_data_release.Tpo -c -o multiformat_data_release.o `test -f 'datawizard/interfaces/multiformat/advanced/multiformat_data_release.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/advanced/multiformat_data_release.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_data_release.Tpo $(DEPDIR)/multiformat_data_release.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/advanced/multiformat_data_release.c' object='multiformat_data_release.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_data_release.o `test -f 'datawizard/interfaces/multiformat/advanced/multiformat_data_release.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/advanced/multiformat_data_release.c multiformat_data_release.obj: datawizard/interfaces/multiformat/advanced/multiformat_data_release.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_data_release.obj -MD -MP -MF $(DEPDIR)/multiformat_data_release.Tpo -c -o multiformat_data_release.obj `if test -f 'datawizard/interfaces/multiformat/advanced/multiformat_data_release.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/advanced/multiformat_data_release.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/advanced/multiformat_data_release.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_data_release.Tpo $(DEPDIR)/multiformat_data_release.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/advanced/multiformat_data_release.c' object='multiformat_data_release.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_data_release.obj `if test -f 'datawizard/interfaces/multiformat/advanced/multiformat_data_release.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/advanced/multiformat_data_release.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/advanced/multiformat_data_release.c'; fi` multiformat_handle_conversion.o: datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_handle_conversion.o -MD -MP -MF $(DEPDIR)/multiformat_handle_conversion.Tpo -c -o multiformat_handle_conversion.o `test -f 'datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_handle_conversion.Tpo $(DEPDIR)/multiformat_handle_conversion.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c' object='multiformat_handle_conversion.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_handle_conversion.o `test -f 'datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c multiformat_handle_conversion.obj: datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_handle_conversion.obj -MD -MP -MF $(DEPDIR)/multiformat_handle_conversion.Tpo -c -o multiformat_handle_conversion.obj `if test -f 'datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_handle_conversion.Tpo $(DEPDIR)/multiformat_handle_conversion.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c' object='multiformat_handle_conversion.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_handle_conversion.obj `if test -f 'datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c'; fi` multiformat_worker.o: datawizard/interfaces/multiformat/advanced/multiformat_worker.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_worker.o -MD -MP -MF $(DEPDIR)/multiformat_worker.Tpo -c -o multiformat_worker.o `test -f 'datawizard/interfaces/multiformat/advanced/multiformat_worker.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/advanced/multiformat_worker.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_worker.Tpo $(DEPDIR)/multiformat_worker.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/advanced/multiformat_worker.c' object='multiformat_worker.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_worker.o `test -f 'datawizard/interfaces/multiformat/advanced/multiformat_worker.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/advanced/multiformat_worker.c multiformat_worker.obj: datawizard/interfaces/multiformat/advanced/multiformat_worker.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_worker.obj -MD -MP -MF $(DEPDIR)/multiformat_worker.Tpo -c -o multiformat_worker.obj `if test -f 'datawizard/interfaces/multiformat/advanced/multiformat_worker.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/advanced/multiformat_worker.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/advanced/multiformat_worker.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_worker.Tpo $(DEPDIR)/multiformat_worker.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/advanced/multiformat_worker.c' object='multiformat_worker.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_worker.obj `if test -f 'datawizard/interfaces/multiformat/advanced/multiformat_worker.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/advanced/multiformat_worker.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/advanced/multiformat_worker.c'; fi` same_handle.o: datawizard/interfaces/multiformat/advanced/same_handle.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT same_handle.o -MD -MP -MF $(DEPDIR)/same_handle.Tpo -c -o same_handle.o `test -f 'datawizard/interfaces/multiformat/advanced/same_handle.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/advanced/same_handle.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/same_handle.Tpo $(DEPDIR)/same_handle.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/advanced/same_handle.c' object='same_handle.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o same_handle.o `test -f 'datawizard/interfaces/multiformat/advanced/same_handle.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/advanced/same_handle.c same_handle.obj: datawizard/interfaces/multiformat/advanced/same_handle.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT same_handle.obj -MD -MP -MF $(DEPDIR)/same_handle.Tpo -c -o same_handle.obj `if test -f 'datawizard/interfaces/multiformat/advanced/same_handle.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/advanced/same_handle.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/advanced/same_handle.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/same_handle.Tpo $(DEPDIR)/same_handle.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/advanced/same_handle.c' object='same_handle.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o same_handle.obj `if test -f 'datawizard/interfaces/multiformat/advanced/same_handle.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/advanced/same_handle.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/advanced/same_handle.c'; fi` multiformat_interface.o: datawizard/interfaces/multiformat/multiformat_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_interface.o -MD -MP -MF $(DEPDIR)/multiformat_interface.Tpo -c -o multiformat_interface.o `test -f 'datawizard/interfaces/multiformat/multiformat_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/multiformat_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_interface.Tpo $(DEPDIR)/multiformat_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/multiformat_interface.c' object='multiformat_interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_interface.o `test -f 'datawizard/interfaces/multiformat/multiformat_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/multiformat_interface.c multiformat_interface.obj: datawizard/interfaces/multiformat/multiformat_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_interface.obj -MD -MP -MF $(DEPDIR)/multiformat_interface.Tpo -c -o multiformat_interface.obj `if test -f 'datawizard/interfaces/multiformat/multiformat_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/multiformat_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/multiformat_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_interface.Tpo $(DEPDIR)/multiformat_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/multiformat_interface.c' object='multiformat_interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_interface.obj `if test -f 'datawizard/interfaces/multiformat/multiformat_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/multiformat_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/multiformat_interface.c'; fi` multiformat_conversion_codelets.o: datawizard/interfaces/multiformat/multiformat_conversion_codelets.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_conversion_codelets.o -MD -MP -MF $(DEPDIR)/multiformat_conversion_codelets.Tpo -c -o multiformat_conversion_codelets.o `test -f 'datawizard/interfaces/multiformat/multiformat_conversion_codelets.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/multiformat_conversion_codelets.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_conversion_codelets.Tpo $(DEPDIR)/multiformat_conversion_codelets.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/multiformat_conversion_codelets.c' object='multiformat_conversion_codelets.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_conversion_codelets.o `test -f 'datawizard/interfaces/multiformat/multiformat_conversion_codelets.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/multiformat_conversion_codelets.c multiformat_conversion_codelets.obj: datawizard/interfaces/multiformat/multiformat_conversion_codelets.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_conversion_codelets.obj -MD -MP -MF $(DEPDIR)/multiformat_conversion_codelets.Tpo -c -o multiformat_conversion_codelets.obj `if test -f 'datawizard/interfaces/multiformat/multiformat_conversion_codelets.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/multiformat_conversion_codelets.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/multiformat_conversion_codelets.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_conversion_codelets.Tpo $(DEPDIR)/multiformat_conversion_codelets.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/multiformat_conversion_codelets.c' object='multiformat_conversion_codelets.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_conversion_codelets.obj `if test -f 'datawizard/interfaces/multiformat/multiformat_conversion_codelets.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/multiformat_conversion_codelets.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/multiformat_conversion_codelets.c'; fi` multiformat_opencl.o: datawizard/interfaces/multiformat/multiformat_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_opencl.o -MD -MP -MF $(DEPDIR)/multiformat_opencl.Tpo -c -o multiformat_opencl.o `test -f 'datawizard/interfaces/multiformat/multiformat_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/multiformat_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_opencl.Tpo $(DEPDIR)/multiformat_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/multiformat_opencl.c' object='multiformat_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_opencl.o `test -f 'datawizard/interfaces/multiformat/multiformat_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/multiformat_opencl.c multiformat_opencl.obj: datawizard/interfaces/multiformat/multiformat_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_opencl.obj -MD -MP -MF $(DEPDIR)/multiformat_opencl.Tpo -c -o multiformat_opencl.obj `if test -f 'datawizard/interfaces/multiformat/multiformat_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/multiformat_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/multiformat_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_opencl.Tpo $(DEPDIR)/multiformat_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/multiformat_opencl.c' object='multiformat_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_opencl.obj `if test -f 'datawizard/interfaces/multiformat/multiformat_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/multiformat_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/multiformat_opencl.c'; fi` multiformat_conversion_codelets_opencl.o: datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_conversion_codelets_opencl.o -MD -MP -MF $(DEPDIR)/multiformat_conversion_codelets_opencl.Tpo -c -o multiformat_conversion_codelets_opencl.o `test -f 'datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_conversion_codelets_opencl.Tpo $(DEPDIR)/multiformat_conversion_codelets_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c' object='multiformat_conversion_codelets_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_conversion_codelets_opencl.o `test -f 'datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c multiformat_conversion_codelets_opencl.obj: datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_conversion_codelets_opencl.obj -MD -MP -MF $(DEPDIR)/multiformat_conversion_codelets_opencl.Tpo -c -o multiformat_conversion_codelets_opencl.obj `if test -f 'datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_conversion_codelets_opencl.Tpo $(DEPDIR)/multiformat_conversion_codelets_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c' object='multiformat_conversion_codelets_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_conversion_codelets_opencl.obj `if test -f 'datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c'; fi` variable_interface.o: datawizard/interfaces/variable/variable_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT variable_interface.o -MD -MP -MF $(DEPDIR)/variable_interface.Tpo -c -o variable_interface.o `test -f 'datawizard/interfaces/variable/variable_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/variable/variable_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/variable_interface.Tpo $(DEPDIR)/variable_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/variable/variable_interface.c' object='variable_interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o variable_interface.o `test -f 'datawizard/interfaces/variable/variable_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/variable/variable_interface.c variable_interface.obj: datawizard/interfaces/variable/variable_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT variable_interface.obj -MD -MP -MF $(DEPDIR)/variable_interface.Tpo -c -o variable_interface.obj `if test -f 'datawizard/interfaces/variable/variable_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/variable/variable_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/variable/variable_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/variable_interface.Tpo $(DEPDIR)/variable_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/variable/variable_interface.c' object='variable_interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o variable_interface.obj `if test -f 'datawizard/interfaces/variable/variable_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/variable/variable_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/variable/variable_interface.c'; fi` variable_opencl.o: datawizard/interfaces/variable/variable_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT variable_opencl.o -MD -MP -MF $(DEPDIR)/variable_opencl.Tpo -c -o variable_opencl.o `test -f 'datawizard/interfaces/variable/variable_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/variable/variable_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/variable_opencl.Tpo $(DEPDIR)/variable_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/variable/variable_opencl.c' object='variable_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o variable_opencl.o `test -f 'datawizard/interfaces/variable/variable_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/variable/variable_opencl.c variable_opencl.obj: datawizard/interfaces/variable/variable_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT variable_opencl.obj -MD -MP -MF $(DEPDIR)/variable_opencl.Tpo -c -o variable_opencl.obj `if test -f 'datawizard/interfaces/variable/variable_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/variable/variable_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/variable/variable_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/variable_opencl.Tpo $(DEPDIR)/variable_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/variable/variable_opencl.c' object='variable_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o variable_opencl.obj `if test -f 'datawizard/interfaces/variable/variable_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/variable/variable_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/variable/variable_opencl.c'; fi` test_vector_interface.o: datawizard/interfaces/vector/test_vector_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_vector_interface.o -MD -MP -MF $(DEPDIR)/test_vector_interface.Tpo -c -o test_vector_interface.o `test -f 'datawizard/interfaces/vector/test_vector_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/vector/test_vector_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_vector_interface.Tpo $(DEPDIR)/test_vector_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/vector/test_vector_interface.c' object='test_vector_interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_vector_interface.o `test -f 'datawizard/interfaces/vector/test_vector_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/vector/test_vector_interface.c test_vector_interface.obj: datawizard/interfaces/vector/test_vector_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_vector_interface.obj -MD -MP -MF $(DEPDIR)/test_vector_interface.Tpo -c -o test_vector_interface.obj `if test -f 'datawizard/interfaces/vector/test_vector_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/vector/test_vector_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/vector/test_vector_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_vector_interface.Tpo $(DEPDIR)/test_vector_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/vector/test_vector_interface.c' object='test_vector_interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_vector_interface.obj `if test -f 'datawizard/interfaces/vector/test_vector_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/vector/test_vector_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/vector/test_vector_interface.c'; fi` test_vector_opencl.o: datawizard/interfaces/vector/test_vector_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_vector_opencl.o -MD -MP -MF $(DEPDIR)/test_vector_opencl.Tpo -c -o test_vector_opencl.o `test -f 'datawizard/interfaces/vector/test_vector_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/vector/test_vector_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_vector_opencl.Tpo $(DEPDIR)/test_vector_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/vector/test_vector_opencl.c' object='test_vector_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_vector_opencl.o `test -f 'datawizard/interfaces/vector/test_vector_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/vector/test_vector_opencl.c test_vector_opencl.obj: datawizard/interfaces/vector/test_vector_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_vector_opencl.obj -MD -MP -MF $(DEPDIR)/test_vector_opencl.Tpo -c -o test_vector_opencl.obj `if test -f 'datawizard/interfaces/vector/test_vector_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/vector/test_vector_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/vector/test_vector_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_vector_opencl.Tpo $(DEPDIR)/test_vector_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/vector/test_vector_opencl.c' object='test_vector_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_vector_opencl.obj `if test -f 'datawizard/interfaces/vector/test_vector_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/vector/test_vector_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/vector/test_vector_opencl.c'; fi` void_interface.o: datawizard/interfaces/void/void_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT void_interface.o -MD -MP -MF $(DEPDIR)/void_interface.Tpo -c -o void_interface.o `test -f 'datawizard/interfaces/void/void_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/void/void_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/void_interface.Tpo $(DEPDIR)/void_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/void/void_interface.c' object='void_interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o void_interface.o `test -f 'datawizard/interfaces/void/void_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/void/void_interface.c void_interface.obj: datawizard/interfaces/void/void_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT void_interface.obj -MD -MP -MF $(DEPDIR)/void_interface.Tpo -c -o void_interface.obj `if test -f 'datawizard/interfaces/void/void_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/void/void_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/void/void_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/void_interface.Tpo $(DEPDIR)/void_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/void/void_interface.c' object='void_interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o void_interface.obj `if test -f 'datawizard/interfaces/void/void_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/void/void_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/void/void_interface.c'; fi` invalidate_pending_requests.o: datawizard/invalidate_pending_requests.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT invalidate_pending_requests.o -MD -MP -MF $(DEPDIR)/invalidate_pending_requests.Tpo -c -o invalidate_pending_requests.o `test -f 'datawizard/invalidate_pending_requests.c' || echo '$(srcdir)/'`datawizard/invalidate_pending_requests.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/invalidate_pending_requests.Tpo $(DEPDIR)/invalidate_pending_requests.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/invalidate_pending_requests.c' object='invalidate_pending_requests.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o invalidate_pending_requests.o `test -f 'datawizard/invalidate_pending_requests.c' || echo '$(srcdir)/'`datawizard/invalidate_pending_requests.c invalidate_pending_requests.obj: datawizard/invalidate_pending_requests.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT invalidate_pending_requests.obj -MD -MP -MF $(DEPDIR)/invalidate_pending_requests.Tpo -c -o invalidate_pending_requests.obj `if test -f 'datawizard/invalidate_pending_requests.c'; then $(CYGPATH_W) 'datawizard/invalidate_pending_requests.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/invalidate_pending_requests.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/invalidate_pending_requests.Tpo $(DEPDIR)/invalidate_pending_requests.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/invalidate_pending_requests.c' object='invalidate_pending_requests.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o invalidate_pending_requests.obj `if test -f 'datawizard/invalidate_pending_requests.c'; then $(CYGPATH_W) 'datawizard/invalidate_pending_requests.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/invalidate_pending_requests.c'; fi` lazy_allocation.o: datawizard/lazy_allocation.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lazy_allocation.o -MD -MP -MF $(DEPDIR)/lazy_allocation.Tpo -c -o lazy_allocation.o `test -f 'datawizard/lazy_allocation.c' || echo '$(srcdir)/'`datawizard/lazy_allocation.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lazy_allocation.Tpo $(DEPDIR)/lazy_allocation.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/lazy_allocation.c' object='lazy_allocation.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lazy_allocation.o `test -f 'datawizard/lazy_allocation.c' || echo '$(srcdir)/'`datawizard/lazy_allocation.c lazy_allocation.obj: datawizard/lazy_allocation.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lazy_allocation.obj -MD -MP -MF $(DEPDIR)/lazy_allocation.Tpo -c -o lazy_allocation.obj `if test -f 'datawizard/lazy_allocation.c'; then $(CYGPATH_W) 'datawizard/lazy_allocation.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/lazy_allocation.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lazy_allocation.Tpo $(DEPDIR)/lazy_allocation.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/lazy_allocation.c' object='lazy_allocation.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lazy_allocation.obj `if test -f 'datawizard/lazy_allocation.c'; then $(CYGPATH_W) 'datawizard/lazy_allocation.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/lazy_allocation.c'; fi` lazy_unregister.o: datawizard/lazy_unregister.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lazy_unregister.o -MD -MP -MF $(DEPDIR)/lazy_unregister.Tpo -c -o lazy_unregister.o `test -f 'datawizard/lazy_unregister.c' || echo '$(srcdir)/'`datawizard/lazy_unregister.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lazy_unregister.Tpo $(DEPDIR)/lazy_unregister.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/lazy_unregister.c' object='lazy_unregister.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lazy_unregister.o `test -f 'datawizard/lazy_unregister.c' || echo '$(srcdir)/'`datawizard/lazy_unregister.c lazy_unregister.obj: datawizard/lazy_unregister.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lazy_unregister.obj -MD -MP -MF $(DEPDIR)/lazy_unregister.Tpo -c -o lazy_unregister.obj `if test -f 'datawizard/lazy_unregister.c'; then $(CYGPATH_W) 'datawizard/lazy_unregister.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/lazy_unregister.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lazy_unregister.Tpo $(DEPDIR)/lazy_unregister.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/lazy_unregister.c' object='lazy_unregister.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lazy_unregister.obj `if test -f 'datawizard/lazy_unregister.c'; then $(CYGPATH_W) 'datawizard/lazy_unregister.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/lazy_unregister.c'; fi` locality.o: datawizard/locality.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT locality.o -MD -MP -MF $(DEPDIR)/locality.Tpo -c -o locality.o `test -f 'datawizard/locality.c' || echo '$(srcdir)/'`datawizard/locality.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/locality.Tpo $(DEPDIR)/locality.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/locality.c' object='locality.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o locality.o `test -f 'datawizard/locality.c' || echo '$(srcdir)/'`datawizard/locality.c locality.obj: datawizard/locality.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT locality.obj -MD -MP -MF $(DEPDIR)/locality.Tpo -c -o locality.obj `if test -f 'datawizard/locality.c'; then $(CYGPATH_W) 'datawizard/locality.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/locality.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/locality.Tpo $(DEPDIR)/locality.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/locality.c' object='locality.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o locality.obj `if test -f 'datawizard/locality.c'; then $(CYGPATH_W) 'datawizard/locality.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/locality.c'; fi` manual_reduction.o: datawizard/manual_reduction.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT manual_reduction.o -MD -MP -MF $(DEPDIR)/manual_reduction.Tpo -c -o manual_reduction.o `test -f 'datawizard/manual_reduction.c' || echo '$(srcdir)/'`datawizard/manual_reduction.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/manual_reduction.Tpo $(DEPDIR)/manual_reduction.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/manual_reduction.c' object='manual_reduction.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o manual_reduction.o `test -f 'datawizard/manual_reduction.c' || echo '$(srcdir)/'`datawizard/manual_reduction.c manual_reduction.obj: datawizard/manual_reduction.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT manual_reduction.obj -MD -MP -MF $(DEPDIR)/manual_reduction.Tpo -c -o manual_reduction.obj `if test -f 'datawizard/manual_reduction.c'; then $(CYGPATH_W) 'datawizard/manual_reduction.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/manual_reduction.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/manual_reduction.Tpo $(DEPDIR)/manual_reduction.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/manual_reduction.c' object='manual_reduction.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o manual_reduction.obj `if test -f 'datawizard/manual_reduction.c'; then $(CYGPATH_W) 'datawizard/manual_reduction.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/manual_reduction.c'; fi` mpi_like.o: datawizard/mpi_like.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mpi_like.o -MD -MP -MF $(DEPDIR)/mpi_like.Tpo -c -o mpi_like.o `test -f 'datawizard/mpi_like.c' || echo '$(srcdir)/'`datawizard/mpi_like.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_like.Tpo $(DEPDIR)/mpi_like.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/mpi_like.c' object='mpi_like.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mpi_like.o `test -f 'datawizard/mpi_like.c' || echo '$(srcdir)/'`datawizard/mpi_like.c mpi_like.obj: datawizard/mpi_like.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mpi_like.obj -MD -MP -MF $(DEPDIR)/mpi_like.Tpo -c -o mpi_like.obj `if test -f 'datawizard/mpi_like.c'; then $(CYGPATH_W) 'datawizard/mpi_like.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/mpi_like.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_like.Tpo $(DEPDIR)/mpi_like.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/mpi_like.c' object='mpi_like.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mpi_like.obj `if test -f 'datawizard/mpi_like.c'; then $(CYGPATH_W) 'datawizard/mpi_like.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/mpi_like.c'; fi` opencl_codelet_unsigned_inc.o: datawizard/opencl_codelet_unsigned_inc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT opencl_codelet_unsigned_inc.o -MD -MP -MF $(DEPDIR)/opencl_codelet_unsigned_inc.Tpo -c -o opencl_codelet_unsigned_inc.o `test -f 'datawizard/opencl_codelet_unsigned_inc.c' || echo '$(srcdir)/'`datawizard/opencl_codelet_unsigned_inc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/opencl_codelet_unsigned_inc.Tpo $(DEPDIR)/opencl_codelet_unsigned_inc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/opencl_codelet_unsigned_inc.c' object='opencl_codelet_unsigned_inc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o opencl_codelet_unsigned_inc.o `test -f 'datawizard/opencl_codelet_unsigned_inc.c' || echo '$(srcdir)/'`datawizard/opencl_codelet_unsigned_inc.c opencl_codelet_unsigned_inc.obj: datawizard/opencl_codelet_unsigned_inc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT opencl_codelet_unsigned_inc.obj -MD -MP -MF $(DEPDIR)/opencl_codelet_unsigned_inc.Tpo -c -o opencl_codelet_unsigned_inc.obj `if test -f 'datawizard/opencl_codelet_unsigned_inc.c'; then $(CYGPATH_W) 'datawizard/opencl_codelet_unsigned_inc.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/opencl_codelet_unsigned_inc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/opencl_codelet_unsigned_inc.Tpo $(DEPDIR)/opencl_codelet_unsigned_inc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/opencl_codelet_unsigned_inc.c' object='opencl_codelet_unsigned_inc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o opencl_codelet_unsigned_inc.obj `if test -f 'datawizard/opencl_codelet_unsigned_inc.c'; then $(CYGPATH_W) 'datawizard/opencl_codelet_unsigned_inc.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/opencl_codelet_unsigned_inc.c'; fi` mpi_like_async.o: datawizard/mpi_like_async.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mpi_like_async.o -MD -MP -MF $(DEPDIR)/mpi_like_async.Tpo -c -o mpi_like_async.o `test -f 'datawizard/mpi_like_async.c' || echo '$(srcdir)/'`datawizard/mpi_like_async.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_like_async.Tpo $(DEPDIR)/mpi_like_async.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/mpi_like_async.c' object='mpi_like_async.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mpi_like_async.o `test -f 'datawizard/mpi_like_async.c' || echo '$(srcdir)/'`datawizard/mpi_like_async.c mpi_like_async.obj: datawizard/mpi_like_async.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mpi_like_async.obj -MD -MP -MF $(DEPDIR)/mpi_like_async.Tpo -c -o mpi_like_async.obj `if test -f 'datawizard/mpi_like_async.c'; then $(CYGPATH_W) 'datawizard/mpi_like_async.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/mpi_like_async.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_like_async.Tpo $(DEPDIR)/mpi_like_async.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/mpi_like_async.c' object='mpi_like_async.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mpi_like_async.obj `if test -f 'datawizard/mpi_like_async.c'; then $(CYGPATH_W) 'datawizard/mpi_like_async.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/mpi_like_async.c'; fi` no_unregister.o: datawizard/no_unregister.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT no_unregister.o -MD -MP -MF $(DEPDIR)/no_unregister.Tpo -c -o no_unregister.o `test -f 'datawizard/no_unregister.c' || echo '$(srcdir)/'`datawizard/no_unregister.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/no_unregister.Tpo $(DEPDIR)/no_unregister.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/no_unregister.c' object='no_unregister.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o no_unregister.o `test -f 'datawizard/no_unregister.c' || echo '$(srcdir)/'`datawizard/no_unregister.c no_unregister.obj: datawizard/no_unregister.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT no_unregister.obj -MD -MP -MF $(DEPDIR)/no_unregister.Tpo -c -o no_unregister.obj `if test -f 'datawizard/no_unregister.c'; then $(CYGPATH_W) 'datawizard/no_unregister.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/no_unregister.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/no_unregister.Tpo $(DEPDIR)/no_unregister.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/no_unregister.c' object='no_unregister.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o no_unregister.obj `if test -f 'datawizard/no_unregister.c'; then $(CYGPATH_W) 'datawizard/no_unregister.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/no_unregister.c'; fi` noreclaim.o: datawizard/noreclaim.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT noreclaim.o -MD -MP -MF $(DEPDIR)/noreclaim.Tpo -c -o noreclaim.o `test -f 'datawizard/noreclaim.c' || echo '$(srcdir)/'`datawizard/noreclaim.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/noreclaim.Tpo $(DEPDIR)/noreclaim.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/noreclaim.c' object='noreclaim.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o noreclaim.o `test -f 'datawizard/noreclaim.c' || echo '$(srcdir)/'`datawizard/noreclaim.c noreclaim.obj: datawizard/noreclaim.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT noreclaim.obj -MD -MP -MF $(DEPDIR)/noreclaim.Tpo -c -o noreclaim.obj `if test -f 'datawizard/noreclaim.c'; then $(CYGPATH_W) 'datawizard/noreclaim.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/noreclaim.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/noreclaim.Tpo $(DEPDIR)/noreclaim.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/noreclaim.c' object='noreclaim.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o noreclaim.obj `if test -f 'datawizard/noreclaim.c'; then $(CYGPATH_W) 'datawizard/noreclaim.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/noreclaim.c'; fi` nowhere.o: datawizard/nowhere.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT nowhere.o -MD -MP -MF $(DEPDIR)/nowhere.Tpo -c -o nowhere.o `test -f 'datawizard/nowhere.c' || echo '$(srcdir)/'`datawizard/nowhere.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nowhere.Tpo $(DEPDIR)/nowhere.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/nowhere.c' object='nowhere.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o nowhere.o `test -f 'datawizard/nowhere.c' || echo '$(srcdir)/'`datawizard/nowhere.c nowhere.obj: datawizard/nowhere.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT nowhere.obj -MD -MP -MF $(DEPDIR)/nowhere.Tpo -c -o nowhere.obj `if test -f 'datawizard/nowhere.c'; then $(CYGPATH_W) 'datawizard/nowhere.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/nowhere.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nowhere.Tpo $(DEPDIR)/nowhere.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/nowhere.c' object='nowhere.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o nowhere.obj `if test -f 'datawizard/nowhere.c'; then $(CYGPATH_W) 'datawizard/nowhere.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/nowhere.c'; fi` partition_dep.o: datawizard/partition_dep.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT partition_dep.o -MD -MP -MF $(DEPDIR)/partition_dep.Tpo -c -o partition_dep.o `test -f 'datawizard/partition_dep.c' || echo '$(srcdir)/'`datawizard/partition_dep.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/partition_dep.Tpo $(DEPDIR)/partition_dep.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/partition_dep.c' object='partition_dep.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o partition_dep.o `test -f 'datawizard/partition_dep.c' || echo '$(srcdir)/'`datawizard/partition_dep.c partition_dep.obj: datawizard/partition_dep.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT partition_dep.obj -MD -MP -MF $(DEPDIR)/partition_dep.Tpo -c -o partition_dep.obj `if test -f 'datawizard/partition_dep.c'; then $(CYGPATH_W) 'datawizard/partition_dep.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/partition_dep.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/partition_dep.Tpo $(DEPDIR)/partition_dep.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/partition_dep.c' object='partition_dep.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o partition_dep.obj `if test -f 'datawizard/partition_dep.c'; then $(CYGPATH_W) 'datawizard/partition_dep.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/partition_dep.c'; fi` partition_lazy.o: datawizard/partition_lazy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT partition_lazy.o -MD -MP -MF $(DEPDIR)/partition_lazy.Tpo -c -o partition_lazy.o `test -f 'datawizard/partition_lazy.c' || echo '$(srcdir)/'`datawizard/partition_lazy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/partition_lazy.Tpo $(DEPDIR)/partition_lazy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/partition_lazy.c' object='partition_lazy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o partition_lazy.o `test -f 'datawizard/partition_lazy.c' || echo '$(srcdir)/'`datawizard/partition_lazy.c partition_lazy.obj: datawizard/partition_lazy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT partition_lazy.obj -MD -MP -MF $(DEPDIR)/partition_lazy.Tpo -c -o partition_lazy.obj `if test -f 'datawizard/partition_lazy.c'; then $(CYGPATH_W) 'datawizard/partition_lazy.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/partition_lazy.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/partition_lazy.Tpo $(DEPDIR)/partition_lazy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/partition_lazy.c' object='partition_lazy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o partition_lazy.obj `if test -f 'datawizard/partition_lazy.c'; then $(CYGPATH_W) 'datawizard/partition_lazy.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/partition_lazy.c'; fi` readers_and_writers.o: datawizard/readers_and_writers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT readers_and_writers.o -MD -MP -MF $(DEPDIR)/readers_and_writers.Tpo -c -o readers_and_writers.o `test -f 'datawizard/readers_and_writers.c' || echo '$(srcdir)/'`datawizard/readers_and_writers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/readers_and_writers.Tpo $(DEPDIR)/readers_and_writers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/readers_and_writers.c' object='readers_and_writers.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o readers_and_writers.o `test -f 'datawizard/readers_and_writers.c' || echo '$(srcdir)/'`datawizard/readers_and_writers.c readers_and_writers.obj: datawizard/readers_and_writers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT readers_and_writers.obj -MD -MP -MF $(DEPDIR)/readers_and_writers.Tpo -c -o readers_and_writers.obj `if test -f 'datawizard/readers_and_writers.c'; then $(CYGPATH_W) 'datawizard/readers_and_writers.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/readers_and_writers.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/readers_and_writers.Tpo $(DEPDIR)/readers_and_writers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/readers_and_writers.c' object='readers_and_writers.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o readers_and_writers.obj `if test -f 'datawizard/readers_and_writers.c'; then $(CYGPATH_W) 'datawizard/readers_and_writers.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/readers_and_writers.c'; fi` readonly.o: datawizard/readonly.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT readonly.o -MD -MP -MF $(DEPDIR)/readonly.Tpo -c -o readonly.o `test -f 'datawizard/readonly.c' || echo '$(srcdir)/'`datawizard/readonly.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/readonly.Tpo $(DEPDIR)/readonly.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/readonly.c' object='readonly.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o readonly.o `test -f 'datawizard/readonly.c' || echo '$(srcdir)/'`datawizard/readonly.c readonly.obj: datawizard/readonly.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT readonly.obj -MD -MP -MF $(DEPDIR)/readonly.Tpo -c -o readonly.obj `if test -f 'datawizard/readonly.c'; then $(CYGPATH_W) 'datawizard/readonly.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/readonly.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/readonly.Tpo $(DEPDIR)/readonly.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/readonly.c' object='readonly.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o readonly.obj `if test -f 'datawizard/readonly.c'; then $(CYGPATH_W) 'datawizard/readonly.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/readonly.c'; fi` reclaim.o: datawizard/reclaim.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT reclaim.o -MD -MP -MF $(DEPDIR)/reclaim.Tpo -c -o reclaim.o `test -f 'datawizard/reclaim.c' || echo '$(srcdir)/'`datawizard/reclaim.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/reclaim.Tpo $(DEPDIR)/reclaim.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/reclaim.c' object='reclaim.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o reclaim.o `test -f 'datawizard/reclaim.c' || echo '$(srcdir)/'`datawizard/reclaim.c reclaim.obj: datawizard/reclaim.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT reclaim.obj -MD -MP -MF $(DEPDIR)/reclaim.Tpo -c -o reclaim.obj `if test -f 'datawizard/reclaim.c'; then $(CYGPATH_W) 'datawizard/reclaim.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/reclaim.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/reclaim.Tpo $(DEPDIR)/reclaim.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/reclaim.c' object='reclaim.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o reclaim.obj `if test -f 'datawizard/reclaim.c'; then $(CYGPATH_W) 'datawizard/reclaim.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/reclaim.c'; fi` redux_acquire.o: datawizard/redux_acquire.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT redux_acquire.o -MD -MP -MF $(DEPDIR)/redux_acquire.Tpo -c -o redux_acquire.o `test -f 'datawizard/redux_acquire.c' || echo '$(srcdir)/'`datawizard/redux_acquire.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/redux_acquire.Tpo $(DEPDIR)/redux_acquire.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/redux_acquire.c' object='redux_acquire.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o redux_acquire.o `test -f 'datawizard/redux_acquire.c' || echo '$(srcdir)/'`datawizard/redux_acquire.c redux_acquire.obj: datawizard/redux_acquire.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT redux_acquire.obj -MD -MP -MF $(DEPDIR)/redux_acquire.Tpo -c -o redux_acquire.obj `if test -f 'datawizard/redux_acquire.c'; then $(CYGPATH_W) 'datawizard/redux_acquire.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/redux_acquire.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/redux_acquire.Tpo $(DEPDIR)/redux_acquire.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/redux_acquire.c' object='redux_acquire.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o redux_acquire.obj `if test -f 'datawizard/redux_acquire.c'; then $(CYGPATH_W) 'datawizard/redux_acquire.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/redux_acquire.c'; fi` scratch.o: datawizard/scratch.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT scratch.o -MD -MP -MF $(DEPDIR)/scratch.Tpo -c -o scratch.o `test -f 'datawizard/scratch.c' || echo '$(srcdir)/'`datawizard/scratch.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/scratch.Tpo $(DEPDIR)/scratch.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/scratch.c' object='scratch.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o scratch.o `test -f 'datawizard/scratch.c' || echo '$(srcdir)/'`datawizard/scratch.c scratch.obj: datawizard/scratch.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT scratch.obj -MD -MP -MF $(DEPDIR)/scratch.Tpo -c -o scratch.obj `if test -f 'datawizard/scratch.c'; then $(CYGPATH_W) 'datawizard/scratch.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/scratch.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/scratch.Tpo $(DEPDIR)/scratch.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/scratch.c' object='scratch.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o scratch.obj `if test -f 'datawizard/scratch.c'; then $(CYGPATH_W) 'datawizard/scratch.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/scratch.c'; fi` scratch_opencl.o: datawizard/scratch_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT scratch_opencl.o -MD -MP -MF $(DEPDIR)/scratch_opencl.Tpo -c -o scratch_opencl.o `test -f 'datawizard/scratch_opencl.c' || echo '$(srcdir)/'`datawizard/scratch_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/scratch_opencl.Tpo $(DEPDIR)/scratch_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/scratch_opencl.c' object='scratch_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o scratch_opencl.o `test -f 'datawizard/scratch_opencl.c' || echo '$(srcdir)/'`datawizard/scratch_opencl.c scratch_opencl.obj: datawizard/scratch_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT scratch_opencl.obj -MD -MP -MF $(DEPDIR)/scratch_opencl.Tpo -c -o scratch_opencl.obj `if test -f 'datawizard/scratch_opencl.c'; then $(CYGPATH_W) 'datawizard/scratch_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/scratch_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/scratch_opencl.Tpo $(DEPDIR)/scratch_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/scratch_opencl.c' object='scratch_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o scratch_opencl.obj `if test -f 'datawizard/scratch_opencl.c'; then $(CYGPATH_W) 'datawizard/scratch_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/scratch_opencl.c'; fi` simgrid-locality.o: datawizard/simgrid-locality.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT simgrid-locality.o -MD -MP -MF $(DEPDIR)/simgrid-locality.Tpo -c -o simgrid-locality.o `test -f 'datawizard/simgrid-locality.c' || echo '$(srcdir)/'`datawizard/simgrid-locality.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/simgrid-locality.Tpo $(DEPDIR)/simgrid-locality.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/simgrid-locality.c' object='simgrid-locality.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o simgrid-locality.o `test -f 'datawizard/simgrid-locality.c' || echo '$(srcdir)/'`datawizard/simgrid-locality.c simgrid-locality.obj: datawizard/simgrid-locality.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT simgrid-locality.obj -MD -MP -MF $(DEPDIR)/simgrid-locality.Tpo -c -o simgrid-locality.obj `if test -f 'datawizard/simgrid-locality.c'; then $(CYGPATH_W) 'datawizard/simgrid-locality.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/simgrid-locality.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/simgrid-locality.Tpo $(DEPDIR)/simgrid-locality.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/simgrid-locality.c' object='simgrid-locality.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o simgrid-locality.obj `if test -f 'datawizard/simgrid-locality.c'; then $(CYGPATH_W) 'datawizard/simgrid-locality.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/simgrid-locality.c'; fi` specific_node.o: datawizard/specific_node.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT specific_node.o -MD -MP -MF $(DEPDIR)/specific_node.Tpo -c -o specific_node.o `test -f 'datawizard/specific_node.c' || echo '$(srcdir)/'`datawizard/specific_node.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/specific_node.Tpo $(DEPDIR)/specific_node.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/specific_node.c' object='specific_node.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o specific_node.o `test -f 'datawizard/specific_node.c' || echo '$(srcdir)/'`datawizard/specific_node.c specific_node.obj: datawizard/specific_node.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT specific_node.obj -MD -MP -MF $(DEPDIR)/specific_node.Tpo -c -o specific_node.obj `if test -f 'datawizard/specific_node.c'; then $(CYGPATH_W) 'datawizard/specific_node.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/specific_node.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/specific_node.Tpo $(DEPDIR)/specific_node.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/specific_node.c' object='specific_node.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o specific_node.obj `if test -f 'datawizard/specific_node.c'; then $(CYGPATH_W) 'datawizard/specific_node.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/specific_node.c'; fi` sync_and_notify_data.o: datawizard/sync_and_notify_data.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sync_and_notify_data.o -MD -MP -MF $(DEPDIR)/sync_and_notify_data.Tpo -c -o sync_and_notify_data.o `test -f 'datawizard/sync_and_notify_data.c' || echo '$(srcdir)/'`datawizard/sync_and_notify_data.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sync_and_notify_data.Tpo $(DEPDIR)/sync_and_notify_data.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/sync_and_notify_data.c' object='sync_and_notify_data.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sync_and_notify_data.o `test -f 'datawizard/sync_and_notify_data.c' || echo '$(srcdir)/'`datawizard/sync_and_notify_data.c sync_and_notify_data.obj: datawizard/sync_and_notify_data.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sync_and_notify_data.obj -MD -MP -MF $(DEPDIR)/sync_and_notify_data.Tpo -c -o sync_and_notify_data.obj `if test -f 'datawizard/sync_and_notify_data.c'; then $(CYGPATH_W) 'datawizard/sync_and_notify_data.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/sync_and_notify_data.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sync_and_notify_data.Tpo $(DEPDIR)/sync_and_notify_data.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/sync_and_notify_data.c' object='sync_and_notify_data.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sync_and_notify_data.obj `if test -f 'datawizard/sync_and_notify_data.c'; then $(CYGPATH_W) 'datawizard/sync_and_notify_data.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/sync_and_notify_data.c'; fi` sync_and_notify_data_opencl.o: datawizard/sync_and_notify_data_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sync_and_notify_data_opencl.o -MD -MP -MF $(DEPDIR)/sync_and_notify_data_opencl.Tpo -c -o sync_and_notify_data_opencl.o `test -f 'datawizard/sync_and_notify_data_opencl.c' || echo '$(srcdir)/'`datawizard/sync_and_notify_data_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sync_and_notify_data_opencl.Tpo $(DEPDIR)/sync_and_notify_data_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/sync_and_notify_data_opencl.c' object='sync_and_notify_data_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sync_and_notify_data_opencl.o `test -f 'datawizard/sync_and_notify_data_opencl.c' || echo '$(srcdir)/'`datawizard/sync_and_notify_data_opencl.c sync_and_notify_data_opencl.obj: datawizard/sync_and_notify_data_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sync_and_notify_data_opencl.obj -MD -MP -MF $(DEPDIR)/sync_and_notify_data_opencl.Tpo -c -o sync_and_notify_data_opencl.obj `if test -f 'datawizard/sync_and_notify_data_opencl.c'; then $(CYGPATH_W) 'datawizard/sync_and_notify_data_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/sync_and_notify_data_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sync_and_notify_data_opencl.Tpo $(DEPDIR)/sync_and_notify_data_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/sync_and_notify_data_opencl.c' object='sync_and_notify_data_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sync_and_notify_data_opencl.obj `if test -f 'datawizard/sync_and_notify_data_opencl.c'; then $(CYGPATH_W) 'datawizard/sync_and_notify_data_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/sync_and_notify_data_opencl.c'; fi` sync_and_notify_data_implicit.o: datawizard/sync_and_notify_data_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sync_and_notify_data_implicit.o -MD -MP -MF $(DEPDIR)/sync_and_notify_data_implicit.Tpo -c -o sync_and_notify_data_implicit.o `test -f 'datawizard/sync_and_notify_data_implicit.c' || echo '$(srcdir)/'`datawizard/sync_and_notify_data_implicit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sync_and_notify_data_implicit.Tpo $(DEPDIR)/sync_and_notify_data_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/sync_and_notify_data_implicit.c' object='sync_and_notify_data_implicit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sync_and_notify_data_implicit.o `test -f 'datawizard/sync_and_notify_data_implicit.c' || echo '$(srcdir)/'`datawizard/sync_and_notify_data_implicit.c sync_and_notify_data_implicit.obj: datawizard/sync_and_notify_data_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sync_and_notify_data_implicit.obj -MD -MP -MF $(DEPDIR)/sync_and_notify_data_implicit.Tpo -c -o sync_and_notify_data_implicit.obj `if test -f 'datawizard/sync_and_notify_data_implicit.c'; then $(CYGPATH_W) 'datawizard/sync_and_notify_data_implicit.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/sync_and_notify_data_implicit.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sync_and_notify_data_implicit.Tpo $(DEPDIR)/sync_and_notify_data_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/sync_and_notify_data_implicit.c' object='sync_and_notify_data_implicit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sync_and_notify_data_implicit.obj `if test -f 'datawizard/sync_and_notify_data_implicit.c'; then $(CYGPATH_W) 'datawizard/sync_and_notify_data_implicit.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/sync_and_notify_data_implicit.c'; fi` sync_with_data_with_mem.o: datawizard/sync_with_data_with_mem.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sync_with_data_with_mem.o -MD -MP -MF $(DEPDIR)/sync_with_data_with_mem.Tpo -c -o sync_with_data_with_mem.o `test -f 'datawizard/sync_with_data_with_mem.c' || echo '$(srcdir)/'`datawizard/sync_with_data_with_mem.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sync_with_data_with_mem.Tpo $(DEPDIR)/sync_with_data_with_mem.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/sync_with_data_with_mem.c' object='sync_with_data_with_mem.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sync_with_data_with_mem.o `test -f 'datawizard/sync_with_data_with_mem.c' || echo '$(srcdir)/'`datawizard/sync_with_data_with_mem.c sync_with_data_with_mem.obj: datawizard/sync_with_data_with_mem.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sync_with_data_with_mem.obj -MD -MP -MF $(DEPDIR)/sync_with_data_with_mem.Tpo -c -o sync_with_data_with_mem.obj `if test -f 'datawizard/sync_with_data_with_mem.c'; then $(CYGPATH_W) 'datawizard/sync_with_data_with_mem.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/sync_with_data_with_mem.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sync_with_data_with_mem.Tpo $(DEPDIR)/sync_with_data_with_mem.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/sync_with_data_with_mem.c' object='sync_with_data_with_mem.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sync_with_data_with_mem.obj `if test -f 'datawizard/sync_with_data_with_mem.c'; then $(CYGPATH_W) 'datawizard/sync_with_data_with_mem.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/sync_with_data_with_mem.c'; fi` sync_with_data_with_mem_non_blocking.o: datawizard/sync_with_data_with_mem_non_blocking.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sync_with_data_with_mem_non_blocking.o -MD -MP -MF $(DEPDIR)/sync_with_data_with_mem_non_blocking.Tpo -c -o sync_with_data_with_mem_non_blocking.o `test -f 'datawizard/sync_with_data_with_mem_non_blocking.c' || echo '$(srcdir)/'`datawizard/sync_with_data_with_mem_non_blocking.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sync_with_data_with_mem_non_blocking.Tpo $(DEPDIR)/sync_with_data_with_mem_non_blocking.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/sync_with_data_with_mem_non_blocking.c' object='sync_with_data_with_mem_non_blocking.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sync_with_data_with_mem_non_blocking.o `test -f 'datawizard/sync_with_data_with_mem_non_blocking.c' || echo '$(srcdir)/'`datawizard/sync_with_data_with_mem_non_blocking.c sync_with_data_with_mem_non_blocking.obj: datawizard/sync_with_data_with_mem_non_blocking.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sync_with_data_with_mem_non_blocking.obj -MD -MP -MF $(DEPDIR)/sync_with_data_with_mem_non_blocking.Tpo -c -o sync_with_data_with_mem_non_blocking.obj `if test -f 'datawizard/sync_with_data_with_mem_non_blocking.c'; then $(CYGPATH_W) 'datawizard/sync_with_data_with_mem_non_blocking.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/sync_with_data_with_mem_non_blocking.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sync_with_data_with_mem_non_blocking.Tpo $(DEPDIR)/sync_with_data_with_mem_non_blocking.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/sync_with_data_with_mem_non_blocking.c' object='sync_with_data_with_mem_non_blocking.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sync_with_data_with_mem_non_blocking.obj `if test -f 'datawizard/sync_with_data_with_mem_non_blocking.c'; then $(CYGPATH_W) 'datawizard/sync_with_data_with_mem_non_blocking.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/sync_with_data_with_mem_non_blocking.c'; fi` sync_with_data_with_mem_non_blocking_implicit.o: datawizard/sync_with_data_with_mem_non_blocking_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sync_with_data_with_mem_non_blocking_implicit.o -MD -MP -MF $(DEPDIR)/sync_with_data_with_mem_non_blocking_implicit.Tpo -c -o sync_with_data_with_mem_non_blocking_implicit.o `test -f 'datawizard/sync_with_data_with_mem_non_blocking_implicit.c' || echo '$(srcdir)/'`datawizard/sync_with_data_with_mem_non_blocking_implicit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sync_with_data_with_mem_non_blocking_implicit.Tpo $(DEPDIR)/sync_with_data_with_mem_non_blocking_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/sync_with_data_with_mem_non_blocking_implicit.c' object='sync_with_data_with_mem_non_blocking_implicit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sync_with_data_with_mem_non_blocking_implicit.o `test -f 'datawizard/sync_with_data_with_mem_non_blocking_implicit.c' || echo '$(srcdir)/'`datawizard/sync_with_data_with_mem_non_blocking_implicit.c sync_with_data_with_mem_non_blocking_implicit.obj: datawizard/sync_with_data_with_mem_non_blocking_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sync_with_data_with_mem_non_blocking_implicit.obj -MD -MP -MF $(DEPDIR)/sync_with_data_with_mem_non_blocking_implicit.Tpo -c -o sync_with_data_with_mem_non_blocking_implicit.obj `if test -f 'datawizard/sync_with_data_with_mem_non_blocking_implicit.c'; then $(CYGPATH_W) 'datawizard/sync_with_data_with_mem_non_blocking_implicit.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/sync_with_data_with_mem_non_blocking_implicit.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sync_with_data_with_mem_non_blocking_implicit.Tpo $(DEPDIR)/sync_with_data_with_mem_non_blocking_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/sync_with_data_with_mem_non_blocking_implicit.c' object='sync_with_data_with_mem_non_blocking_implicit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sync_with_data_with_mem_non_blocking_implicit.obj `if test -f 'datawizard/sync_with_data_with_mem_non_blocking_implicit.c'; then $(CYGPATH_W) 'datawizard/sync_with_data_with_mem_non_blocking_implicit.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/sync_with_data_with_mem_non_blocking_implicit.c'; fi` task_with_multiple_time_the_same_handle.o: datawizard/task_with_multiple_time_the_same_handle.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT task_with_multiple_time_the_same_handle.o -MD -MP -MF $(DEPDIR)/task_with_multiple_time_the_same_handle.Tpo -c -o task_with_multiple_time_the_same_handle.o `test -f 'datawizard/task_with_multiple_time_the_same_handle.c' || echo '$(srcdir)/'`datawizard/task_with_multiple_time_the_same_handle.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/task_with_multiple_time_the_same_handle.Tpo $(DEPDIR)/task_with_multiple_time_the_same_handle.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/task_with_multiple_time_the_same_handle.c' object='task_with_multiple_time_the_same_handle.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o task_with_multiple_time_the_same_handle.o `test -f 'datawizard/task_with_multiple_time_the_same_handle.c' || echo '$(srcdir)/'`datawizard/task_with_multiple_time_the_same_handle.c task_with_multiple_time_the_same_handle.obj: datawizard/task_with_multiple_time_the_same_handle.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT task_with_multiple_time_the_same_handle.obj -MD -MP -MF $(DEPDIR)/task_with_multiple_time_the_same_handle.Tpo -c -o task_with_multiple_time_the_same_handle.obj `if test -f 'datawizard/task_with_multiple_time_the_same_handle.c'; then $(CYGPATH_W) 'datawizard/task_with_multiple_time_the_same_handle.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/task_with_multiple_time_the_same_handle.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/task_with_multiple_time_the_same_handle.Tpo $(DEPDIR)/task_with_multiple_time_the_same_handle.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/task_with_multiple_time_the_same_handle.c' object='task_with_multiple_time_the_same_handle.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o task_with_multiple_time_the_same_handle.obj `if test -f 'datawizard/task_with_multiple_time_the_same_handle.c'; then $(CYGPATH_W) 'datawizard/task_with_multiple_time_the_same_handle.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/task_with_multiple_time_the_same_handle.c'; fi` temporary_partition.o: datawizard/temporary_partition.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT temporary_partition.o -MD -MP -MF $(DEPDIR)/temporary_partition.Tpo -c -o temporary_partition.o `test -f 'datawizard/temporary_partition.c' || echo '$(srcdir)/'`datawizard/temporary_partition.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/temporary_partition.Tpo $(DEPDIR)/temporary_partition.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/temporary_partition.c' object='temporary_partition.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o temporary_partition.o `test -f 'datawizard/temporary_partition.c' || echo '$(srcdir)/'`datawizard/temporary_partition.c temporary_partition.obj: datawizard/temporary_partition.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT temporary_partition.obj -MD -MP -MF $(DEPDIR)/temporary_partition.Tpo -c -o temporary_partition.obj `if test -f 'datawizard/temporary_partition.c'; then $(CYGPATH_W) 'datawizard/temporary_partition.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/temporary_partition.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/temporary_partition.Tpo $(DEPDIR)/temporary_partition.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/temporary_partition.c' object='temporary_partition.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o temporary_partition.obj `if test -f 'datawizard/temporary_partition.c'; then $(CYGPATH_W) 'datawizard/temporary_partition.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/temporary_partition.c'; fi` unpartition.o: datawizard/unpartition.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unpartition.o -MD -MP -MF $(DEPDIR)/unpartition.Tpo -c -o unpartition.o `test -f 'datawizard/unpartition.c' || echo '$(srcdir)/'`datawizard/unpartition.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unpartition.Tpo $(DEPDIR)/unpartition.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/unpartition.c' object='unpartition.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unpartition.o `test -f 'datawizard/unpartition.c' || echo '$(srcdir)/'`datawizard/unpartition.c unpartition.obj: datawizard/unpartition.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unpartition.obj -MD -MP -MF $(DEPDIR)/unpartition.Tpo -c -o unpartition.obj `if test -f 'datawizard/unpartition.c'; then $(CYGPATH_W) 'datawizard/unpartition.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/unpartition.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unpartition.Tpo $(DEPDIR)/unpartition.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/unpartition.c' object='unpartition.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unpartition.obj `if test -f 'datawizard/unpartition.c'; then $(CYGPATH_W) 'datawizard/unpartition.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/unpartition.c'; fi` user_interaction_implicit.o: datawizard/user_interaction_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT user_interaction_implicit.o -MD -MP -MF $(DEPDIR)/user_interaction_implicit.Tpo -c -o user_interaction_implicit.o `test -f 'datawizard/user_interaction_implicit.c' || echo '$(srcdir)/'`datawizard/user_interaction_implicit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/user_interaction_implicit.Tpo $(DEPDIR)/user_interaction_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/user_interaction_implicit.c' object='user_interaction_implicit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o user_interaction_implicit.o `test -f 'datawizard/user_interaction_implicit.c' || echo '$(srcdir)/'`datawizard/user_interaction_implicit.c user_interaction_implicit.obj: datawizard/user_interaction_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT user_interaction_implicit.obj -MD -MP -MF $(DEPDIR)/user_interaction_implicit.Tpo -c -o user_interaction_implicit.obj `if test -f 'datawizard/user_interaction_implicit.c'; then $(CYGPATH_W) 'datawizard/user_interaction_implicit.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/user_interaction_implicit.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/user_interaction_implicit.Tpo $(DEPDIR)/user_interaction_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/user_interaction_implicit.c' object='user_interaction_implicit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o user_interaction_implicit.obj `if test -f 'datawizard/user_interaction_implicit.c'; then $(CYGPATH_W) 'datawizard/user_interaction_implicit.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/user_interaction_implicit.c'; fi` variable_parameters.o: datawizard/variable_parameters.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT variable_parameters.o -MD -MP -MF $(DEPDIR)/variable_parameters.Tpo -c -o variable_parameters.o `test -f 'datawizard/variable_parameters.c' || echo '$(srcdir)/'`datawizard/variable_parameters.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/variable_parameters.Tpo $(DEPDIR)/variable_parameters.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/variable_parameters.c' object='variable_parameters.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o variable_parameters.o `test -f 'datawizard/variable_parameters.c' || echo '$(srcdir)/'`datawizard/variable_parameters.c variable_parameters.obj: datawizard/variable_parameters.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT variable_parameters.obj -MD -MP -MF $(DEPDIR)/variable_parameters.Tpo -c -o variable_parameters.obj `if test -f 'datawizard/variable_parameters.c'; then $(CYGPATH_W) 'datawizard/variable_parameters.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/variable_parameters.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/variable_parameters.Tpo $(DEPDIR)/variable_parameters.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/variable_parameters.c' object='variable_parameters.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o variable_parameters.obj `if test -f 'datawizard/variable_parameters.c'; then $(CYGPATH_W) 'datawizard/variable_parameters.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/variable_parameters.c'; fi` write_only_tmp_buffer.o: datawizard/write_only_tmp_buffer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT write_only_tmp_buffer.o -MD -MP -MF $(DEPDIR)/write_only_tmp_buffer.Tpo -c -o write_only_tmp_buffer.o `test -f 'datawizard/write_only_tmp_buffer.c' || echo '$(srcdir)/'`datawizard/write_only_tmp_buffer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/write_only_tmp_buffer.Tpo $(DEPDIR)/write_only_tmp_buffer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/write_only_tmp_buffer.c' object='write_only_tmp_buffer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o write_only_tmp_buffer.o `test -f 'datawizard/write_only_tmp_buffer.c' || echo '$(srcdir)/'`datawizard/write_only_tmp_buffer.c write_only_tmp_buffer.obj: datawizard/write_only_tmp_buffer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT write_only_tmp_buffer.obj -MD -MP -MF $(DEPDIR)/write_only_tmp_buffer.Tpo -c -o write_only_tmp_buffer.obj `if test -f 'datawizard/write_only_tmp_buffer.c'; then $(CYGPATH_W) 'datawizard/write_only_tmp_buffer.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/write_only_tmp_buffer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/write_only_tmp_buffer.Tpo $(DEPDIR)/write_only_tmp_buffer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/write_only_tmp_buffer.c' object='write_only_tmp_buffer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o write_only_tmp_buffer.obj `if test -f 'datawizard/write_only_tmp_buffer.c'; then $(CYGPATH_W) 'datawizard/write_only_tmp_buffer.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/write_only_tmp_buffer.c'; fi` wt_broadcast.o: datawizard/wt_broadcast.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wt_broadcast.o -MD -MP -MF $(DEPDIR)/wt_broadcast.Tpo -c -o wt_broadcast.o `test -f 'datawizard/wt_broadcast.c' || echo '$(srcdir)/'`datawizard/wt_broadcast.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wt_broadcast.Tpo $(DEPDIR)/wt_broadcast.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/wt_broadcast.c' object='wt_broadcast.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wt_broadcast.o `test -f 'datawizard/wt_broadcast.c' || echo '$(srcdir)/'`datawizard/wt_broadcast.c wt_broadcast.obj: datawizard/wt_broadcast.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wt_broadcast.obj -MD -MP -MF $(DEPDIR)/wt_broadcast.Tpo -c -o wt_broadcast.obj `if test -f 'datawizard/wt_broadcast.c'; then $(CYGPATH_W) 'datawizard/wt_broadcast.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/wt_broadcast.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wt_broadcast.Tpo $(DEPDIR)/wt_broadcast.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/wt_broadcast.c' object='wt_broadcast.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wt_broadcast.obj `if test -f 'datawizard/wt_broadcast.c'; then $(CYGPATH_W) 'datawizard/wt_broadcast.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/wt_broadcast.c'; fi` wt_host.o: datawizard/wt_host.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wt_host.o -MD -MP -MF $(DEPDIR)/wt_host.Tpo -c -o wt_host.o `test -f 'datawizard/wt_host.c' || echo '$(srcdir)/'`datawizard/wt_host.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wt_host.Tpo $(DEPDIR)/wt_host.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/wt_host.c' object='wt_host.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wt_host.o `test -f 'datawizard/wt_host.c' || echo '$(srcdir)/'`datawizard/wt_host.c wt_host.obj: datawizard/wt_host.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wt_host.obj -MD -MP -MF $(DEPDIR)/wt_host.Tpo -c -o wt_host.obj `if test -f 'datawizard/wt_host.c'; then $(CYGPATH_W) 'datawizard/wt_host.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/wt_host.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wt_host.Tpo $(DEPDIR)/wt_host.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/wt_host.c' object='wt_host.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wt_host.obj `if test -f 'datawizard/wt_host.c'; then $(CYGPATH_W) 'datawizard/wt_host.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/wt_host.c'; fi` disk_compute.o: disk/disk_compute.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT disk_compute.o -MD -MP -MF $(DEPDIR)/disk_compute.Tpo -c -o disk_compute.o `test -f 'disk/disk_compute.c' || echo '$(srcdir)/'`disk/disk_compute.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/disk_compute.Tpo $(DEPDIR)/disk_compute.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='disk/disk_compute.c' object='disk_compute.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o disk_compute.o `test -f 'disk/disk_compute.c' || echo '$(srcdir)/'`disk/disk_compute.c disk_compute.obj: disk/disk_compute.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT disk_compute.obj -MD -MP -MF $(DEPDIR)/disk_compute.Tpo -c -o disk_compute.obj `if test -f 'disk/disk_compute.c'; then $(CYGPATH_W) 'disk/disk_compute.c'; else $(CYGPATH_W) '$(srcdir)/disk/disk_compute.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/disk_compute.Tpo $(DEPDIR)/disk_compute.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='disk/disk_compute.c' object='disk_compute.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o disk_compute.obj `if test -f 'disk/disk_compute.c'; then $(CYGPATH_W) 'disk/disk_compute.c'; else $(CYGPATH_W) '$(srcdir)/disk/disk_compute.c'; fi` disk_copy.o: disk/disk_copy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT disk_copy.o -MD -MP -MF $(DEPDIR)/disk_copy.Tpo -c -o disk_copy.o `test -f 'disk/disk_copy.c' || echo '$(srcdir)/'`disk/disk_copy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/disk_copy.Tpo $(DEPDIR)/disk_copy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='disk/disk_copy.c' object='disk_copy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o disk_copy.o `test -f 'disk/disk_copy.c' || echo '$(srcdir)/'`disk/disk_copy.c disk_copy.obj: disk/disk_copy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT disk_copy.obj -MD -MP -MF $(DEPDIR)/disk_copy.Tpo -c -o disk_copy.obj `if test -f 'disk/disk_copy.c'; then $(CYGPATH_W) 'disk/disk_copy.c'; else $(CYGPATH_W) '$(srcdir)/disk/disk_copy.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/disk_copy.Tpo $(DEPDIR)/disk_copy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='disk/disk_copy.c' object='disk_copy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o disk_copy.obj `if test -f 'disk/disk_copy.c'; then $(CYGPATH_W) 'disk/disk_copy.c'; else $(CYGPATH_W) '$(srcdir)/disk/disk_copy.c'; fi` disk_pack.o: disk/disk_pack.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT disk_pack.o -MD -MP -MF $(DEPDIR)/disk_pack.Tpo -c -o disk_pack.o `test -f 'disk/disk_pack.c' || echo '$(srcdir)/'`disk/disk_pack.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/disk_pack.Tpo $(DEPDIR)/disk_pack.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='disk/disk_pack.c' object='disk_pack.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o disk_pack.o `test -f 'disk/disk_pack.c' || echo '$(srcdir)/'`disk/disk_pack.c disk_pack.obj: disk/disk_pack.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT disk_pack.obj -MD -MP -MF $(DEPDIR)/disk_pack.Tpo -c -o disk_pack.obj `if test -f 'disk/disk_pack.c'; then $(CYGPATH_W) 'disk/disk_pack.c'; else $(CYGPATH_W) '$(srcdir)/disk/disk_pack.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/disk_pack.Tpo $(DEPDIR)/disk_pack.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='disk/disk_pack.c' object='disk_pack.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o disk_pack.obj `if test -f 'disk/disk_pack.c'; then $(CYGPATH_W) 'disk/disk_pack.c'; else $(CYGPATH_W) '$(srcdir)/disk/disk_pack.c'; fi` mem_reclaim.o: disk/mem_reclaim.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mem_reclaim.o -MD -MP -MF $(DEPDIR)/mem_reclaim.Tpo -c -o mem_reclaim.o `test -f 'disk/mem_reclaim.c' || echo '$(srcdir)/'`disk/mem_reclaim.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mem_reclaim.Tpo $(DEPDIR)/mem_reclaim.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='disk/mem_reclaim.c' object='mem_reclaim.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mem_reclaim.o `test -f 'disk/mem_reclaim.c' || echo '$(srcdir)/'`disk/mem_reclaim.c mem_reclaim.obj: disk/mem_reclaim.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mem_reclaim.obj -MD -MP -MF $(DEPDIR)/mem_reclaim.Tpo -c -o mem_reclaim.obj `if test -f 'disk/mem_reclaim.c'; then $(CYGPATH_W) 'disk/mem_reclaim.c'; else $(CYGPATH_W) '$(srcdir)/disk/mem_reclaim.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mem_reclaim.Tpo $(DEPDIR)/mem_reclaim.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='disk/mem_reclaim.c' object='mem_reclaim.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mem_reclaim.obj `if test -f 'disk/mem_reclaim.c'; then $(CYGPATH_W) 'disk/mem_reclaim.c'; else $(CYGPATH_W) '$(srcdir)/disk/mem_reclaim.c'; fi` invalid_blocking_calls.o: errorcheck/invalid_blocking_calls.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT invalid_blocking_calls.o -MD -MP -MF $(DEPDIR)/invalid_blocking_calls.Tpo -c -o invalid_blocking_calls.o `test -f 'errorcheck/invalid_blocking_calls.c' || echo '$(srcdir)/'`errorcheck/invalid_blocking_calls.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/invalid_blocking_calls.Tpo $(DEPDIR)/invalid_blocking_calls.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='errorcheck/invalid_blocking_calls.c' object='invalid_blocking_calls.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o invalid_blocking_calls.o `test -f 'errorcheck/invalid_blocking_calls.c' || echo '$(srcdir)/'`errorcheck/invalid_blocking_calls.c invalid_blocking_calls.obj: errorcheck/invalid_blocking_calls.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT invalid_blocking_calls.obj -MD -MP -MF $(DEPDIR)/invalid_blocking_calls.Tpo -c -o invalid_blocking_calls.obj `if test -f 'errorcheck/invalid_blocking_calls.c'; then $(CYGPATH_W) 'errorcheck/invalid_blocking_calls.c'; else $(CYGPATH_W) '$(srcdir)/errorcheck/invalid_blocking_calls.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/invalid_blocking_calls.Tpo $(DEPDIR)/invalid_blocking_calls.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='errorcheck/invalid_blocking_calls.c' object='invalid_blocking_calls.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o invalid_blocking_calls.obj `if test -f 'errorcheck/invalid_blocking_calls.c'; then $(CYGPATH_W) 'errorcheck/invalid_blocking_calls.c'; else $(CYGPATH_W) '$(srcdir)/errorcheck/invalid_blocking_calls.c'; fi` invalid_tasks.o: errorcheck/invalid_tasks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT invalid_tasks.o -MD -MP -MF $(DEPDIR)/invalid_tasks.Tpo -c -o invalid_tasks.o `test -f 'errorcheck/invalid_tasks.c' || echo '$(srcdir)/'`errorcheck/invalid_tasks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/invalid_tasks.Tpo $(DEPDIR)/invalid_tasks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='errorcheck/invalid_tasks.c' object='invalid_tasks.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o invalid_tasks.o `test -f 'errorcheck/invalid_tasks.c' || echo '$(srcdir)/'`errorcheck/invalid_tasks.c invalid_tasks.obj: errorcheck/invalid_tasks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT invalid_tasks.obj -MD -MP -MF $(DEPDIR)/invalid_tasks.Tpo -c -o invalid_tasks.obj `if test -f 'errorcheck/invalid_tasks.c'; then $(CYGPATH_W) 'errorcheck/invalid_tasks.c'; else $(CYGPATH_W) '$(srcdir)/errorcheck/invalid_tasks.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/invalid_tasks.Tpo $(DEPDIR)/invalid_tasks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='errorcheck/invalid_tasks.c' object='invalid_tasks.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o invalid_tasks.obj `if test -f 'errorcheck/invalid_tasks.c'; then $(CYGPATH_W) 'errorcheck/invalid_tasks.c'; else $(CYGPATH_W) '$(srcdir)/errorcheck/invalid_tasks.c'; fi` starpu_init_noworker.o: errorcheck/starpu_init_noworker.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_init_noworker.o -MD -MP -MF $(DEPDIR)/starpu_init_noworker.Tpo -c -o starpu_init_noworker.o `test -f 'errorcheck/starpu_init_noworker.c' || echo '$(srcdir)/'`errorcheck/starpu_init_noworker.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_init_noworker.Tpo $(DEPDIR)/starpu_init_noworker.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='errorcheck/starpu_init_noworker.c' object='starpu_init_noworker.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_init_noworker.o `test -f 'errorcheck/starpu_init_noworker.c' || echo '$(srcdir)/'`errorcheck/starpu_init_noworker.c starpu_init_noworker.obj: errorcheck/starpu_init_noworker.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_init_noworker.obj -MD -MP -MF $(DEPDIR)/starpu_init_noworker.Tpo -c -o starpu_init_noworker.obj `if test -f 'errorcheck/starpu_init_noworker.c'; then $(CYGPATH_W) 'errorcheck/starpu_init_noworker.c'; else $(CYGPATH_W) '$(srcdir)/errorcheck/starpu_init_noworker.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_init_noworker.Tpo $(DEPDIR)/starpu_init_noworker.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='errorcheck/starpu_init_noworker.c' object='starpu_init_noworker.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_init_noworker.obj `if test -f 'errorcheck/starpu_init_noworker.c'; then $(CYGPATH_W) 'errorcheck/starpu_init_noworker.c'; else $(CYGPATH_W) '$(srcdir)/errorcheck/starpu_init_noworker.c'; fi` cublas_init.o: helper/cublas_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cublas_init.o -MD -MP -MF $(DEPDIR)/cublas_init.Tpo -c -o cublas_init.o `test -f 'helper/cublas_init.c' || echo '$(srcdir)/'`helper/cublas_init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cublas_init.Tpo $(DEPDIR)/cublas_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='helper/cublas_init.c' object='cublas_init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cublas_init.o `test -f 'helper/cublas_init.c' || echo '$(srcdir)/'`helper/cublas_init.c cublas_init.obj: helper/cublas_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cublas_init.obj -MD -MP -MF $(DEPDIR)/cublas_init.Tpo -c -o cublas_init.obj `if test -f 'helper/cublas_init.c'; then $(CYGPATH_W) 'helper/cublas_init.c'; else $(CYGPATH_W) '$(srcdir)/helper/cublas_init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cublas_init.Tpo $(DEPDIR)/cublas_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='helper/cublas_init.c' object='cublas_init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cublas_init.obj `if test -f 'helper/cublas_init.c'; then $(CYGPATH_W) 'helper/cublas_init.c'; else $(CYGPATH_W) '$(srcdir)/helper/cublas_init.c'; fi` cusparse_init.o: helper/cusparse_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cusparse_init.o -MD -MP -MF $(DEPDIR)/cusparse_init.Tpo -c -o cusparse_init.o `test -f 'helper/cusparse_init.c' || echo '$(srcdir)/'`helper/cusparse_init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cusparse_init.Tpo $(DEPDIR)/cusparse_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='helper/cusparse_init.c' object='cusparse_init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cusparse_init.o `test -f 'helper/cusparse_init.c' || echo '$(srcdir)/'`helper/cusparse_init.c cusparse_init.obj: helper/cusparse_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cusparse_init.obj -MD -MP -MF $(DEPDIR)/cusparse_init.Tpo -c -o cusparse_init.obj `if test -f 'helper/cusparse_init.c'; then $(CYGPATH_W) 'helper/cusparse_init.c'; else $(CYGPATH_W) '$(srcdir)/helper/cusparse_init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cusparse_init.Tpo $(DEPDIR)/cusparse_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='helper/cusparse_init.c' object='cusparse_init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cusparse_init.obj `if test -f 'helper/cusparse_init.c'; then $(CYGPATH_W) 'helper/cusparse_init.c'; else $(CYGPATH_W) '$(srcdir)/helper/cusparse_init.c'; fi` execute_on_all.o: helper/execute_on_all.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT execute_on_all.o -MD -MP -MF $(DEPDIR)/execute_on_all.Tpo -c -o execute_on_all.o `test -f 'helper/execute_on_all.c' || echo '$(srcdir)/'`helper/execute_on_all.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/execute_on_all.Tpo $(DEPDIR)/execute_on_all.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='helper/execute_on_all.c' object='execute_on_all.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o execute_on_all.o `test -f 'helper/execute_on_all.c' || echo '$(srcdir)/'`helper/execute_on_all.c execute_on_all.obj: helper/execute_on_all.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT execute_on_all.obj -MD -MP -MF $(DEPDIR)/execute_on_all.Tpo -c -o execute_on_all.obj `if test -f 'helper/execute_on_all.c'; then $(CYGPATH_W) 'helper/execute_on_all.c'; else $(CYGPATH_W) '$(srcdir)/helper/execute_on_all.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/execute_on_all.Tpo $(DEPDIR)/execute_on_all.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='helper/execute_on_all.c' object='execute_on_all.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o execute_on_all.obj `if test -f 'helper/execute_on_all.c'; then $(CYGPATH_W) 'helper/execute_on_all.c'; else $(CYGPATH_W) '$(srcdir)/helper/execute_on_all.c'; fi` pinned_memory.o: helper/pinned_memory.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pinned_memory.o -MD -MP -MF $(DEPDIR)/pinned_memory.Tpo -c -o pinned_memory.o `test -f 'helper/pinned_memory.c' || echo '$(srcdir)/'`helper/pinned_memory.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pinned_memory.Tpo $(DEPDIR)/pinned_memory.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='helper/pinned_memory.c' object='pinned_memory.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pinned_memory.o `test -f 'helper/pinned_memory.c' || echo '$(srcdir)/'`helper/pinned_memory.c pinned_memory.obj: helper/pinned_memory.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pinned_memory.obj -MD -MP -MF $(DEPDIR)/pinned_memory.Tpo -c -o pinned_memory.obj `if test -f 'helper/pinned_memory.c'; then $(CYGPATH_W) 'helper/pinned_memory.c'; else $(CYGPATH_W) '$(srcdir)/helper/pinned_memory.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pinned_memory.Tpo $(DEPDIR)/pinned_memory.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='helper/pinned_memory.c' object='pinned_memory.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pinned_memory.obj `if test -f 'helper/pinned_memory.c'; then $(CYGPATH_W) 'helper/pinned_memory.c'; else $(CYGPATH_W) '$(srcdir)/helper/pinned_memory.c'; fi` starpu_create_sync_task.o: helper/starpu_create_sync_task.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_create_sync_task.o -MD -MP -MF $(DEPDIR)/starpu_create_sync_task.Tpo -c -o starpu_create_sync_task.o `test -f 'helper/starpu_create_sync_task.c' || echo '$(srcdir)/'`helper/starpu_create_sync_task.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_create_sync_task.Tpo $(DEPDIR)/starpu_create_sync_task.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='helper/starpu_create_sync_task.c' object='starpu_create_sync_task.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_create_sync_task.o `test -f 'helper/starpu_create_sync_task.c' || echo '$(srcdir)/'`helper/starpu_create_sync_task.c starpu_create_sync_task.obj: helper/starpu_create_sync_task.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_create_sync_task.obj -MD -MP -MF $(DEPDIR)/starpu_create_sync_task.Tpo -c -o starpu_create_sync_task.obj `if test -f 'helper/starpu_create_sync_task.c'; then $(CYGPATH_W) 'helper/starpu_create_sync_task.c'; else $(CYGPATH_W) '$(srcdir)/helper/starpu_create_sync_task.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_create_sync_task.Tpo $(DEPDIR)/starpu_create_sync_task.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='helper/starpu_create_sync_task.c' object='starpu_create_sync_task.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_create_sync_task.obj `if test -f 'helper/starpu_create_sync_task.c'; then $(CYGPATH_W) 'helper/starpu_create_sync_task.c'; else $(CYGPATH_W) '$(srcdir)/helper/starpu_create_sync_task.c'; fi` starpu_data_cpy.o: helper/starpu_data_cpy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_data_cpy.o -MD -MP -MF $(DEPDIR)/starpu_data_cpy.Tpo -c -o starpu_data_cpy.o `test -f 'helper/starpu_data_cpy.c' || echo '$(srcdir)/'`helper/starpu_data_cpy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_data_cpy.Tpo $(DEPDIR)/starpu_data_cpy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='helper/starpu_data_cpy.c' object='starpu_data_cpy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_data_cpy.o `test -f 'helper/starpu_data_cpy.c' || echo '$(srcdir)/'`helper/starpu_data_cpy.c starpu_data_cpy.obj: helper/starpu_data_cpy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_data_cpy.obj -MD -MP -MF $(DEPDIR)/starpu_data_cpy.Tpo -c -o starpu_data_cpy.obj `if test -f 'helper/starpu_data_cpy.c'; then $(CYGPATH_W) 'helper/starpu_data_cpy.c'; else $(CYGPATH_W) '$(srcdir)/helper/starpu_data_cpy.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_data_cpy.Tpo $(DEPDIR)/starpu_data_cpy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='helper/starpu_data_cpy.c' object='starpu_data_cpy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_data_cpy.obj `if test -f 'helper/starpu_data_cpy.c'; then $(CYGPATH_W) 'helper/starpu_data_cpy.c'; else $(CYGPATH_W) '$(srcdir)/helper/starpu_data_cpy.c'; fi` codelet_null_callback.o: main/codelet_null_callback.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT codelet_null_callback.o -MD -MP -MF $(DEPDIR)/codelet_null_callback.Tpo -c -o codelet_null_callback.o `test -f 'main/codelet_null_callback.c' || echo '$(srcdir)/'`main/codelet_null_callback.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/codelet_null_callback.Tpo $(DEPDIR)/codelet_null_callback.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/codelet_null_callback.c' object='codelet_null_callback.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o codelet_null_callback.o `test -f 'main/codelet_null_callback.c' || echo '$(srcdir)/'`main/codelet_null_callback.c codelet_null_callback.obj: main/codelet_null_callback.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT codelet_null_callback.obj -MD -MP -MF $(DEPDIR)/codelet_null_callback.Tpo -c -o codelet_null_callback.obj `if test -f 'main/codelet_null_callback.c'; then $(CYGPATH_W) 'main/codelet_null_callback.c'; else $(CYGPATH_W) '$(srcdir)/main/codelet_null_callback.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/codelet_null_callback.Tpo $(DEPDIR)/codelet_null_callback.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/codelet_null_callback.c' object='codelet_null_callback.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o codelet_null_callback.obj `if test -f 'main/codelet_null_callback.c'; then $(CYGPATH_W) 'main/codelet_null_callback.c'; else $(CYGPATH_W) '$(srcdir)/main/codelet_null_callback.c'; fi` declare_deps_after_submission.o: main/declare_deps_after_submission.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT declare_deps_after_submission.o -MD -MP -MF $(DEPDIR)/declare_deps_after_submission.Tpo -c -o declare_deps_after_submission.o `test -f 'main/declare_deps_after_submission.c' || echo '$(srcdir)/'`main/declare_deps_after_submission.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/declare_deps_after_submission.Tpo $(DEPDIR)/declare_deps_after_submission.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/declare_deps_after_submission.c' object='declare_deps_after_submission.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o declare_deps_after_submission.o `test -f 'main/declare_deps_after_submission.c' || echo '$(srcdir)/'`main/declare_deps_after_submission.c declare_deps_after_submission.obj: main/declare_deps_after_submission.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT declare_deps_after_submission.obj -MD -MP -MF $(DEPDIR)/declare_deps_after_submission.Tpo -c -o declare_deps_after_submission.obj `if test -f 'main/declare_deps_after_submission.c'; then $(CYGPATH_W) 'main/declare_deps_after_submission.c'; else $(CYGPATH_W) '$(srcdir)/main/declare_deps_after_submission.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/declare_deps_after_submission.Tpo $(DEPDIR)/declare_deps_after_submission.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/declare_deps_after_submission.c' object='declare_deps_after_submission.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o declare_deps_after_submission.obj `if test -f 'main/declare_deps_after_submission.c'; then $(CYGPATH_W) 'main/declare_deps_after_submission.c'; else $(CYGPATH_W) '$(srcdir)/main/declare_deps_after_submission.c'; fi` declare_deps_after_submission_synchronous.o: main/declare_deps_after_submission_synchronous.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT declare_deps_after_submission_synchronous.o -MD -MP -MF $(DEPDIR)/declare_deps_after_submission_synchronous.Tpo -c -o declare_deps_after_submission_synchronous.o `test -f 'main/declare_deps_after_submission_synchronous.c' || echo '$(srcdir)/'`main/declare_deps_after_submission_synchronous.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/declare_deps_after_submission_synchronous.Tpo $(DEPDIR)/declare_deps_after_submission_synchronous.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/declare_deps_after_submission_synchronous.c' object='declare_deps_after_submission_synchronous.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o declare_deps_after_submission_synchronous.o `test -f 'main/declare_deps_after_submission_synchronous.c' || echo '$(srcdir)/'`main/declare_deps_after_submission_synchronous.c declare_deps_after_submission_synchronous.obj: main/declare_deps_after_submission_synchronous.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT declare_deps_after_submission_synchronous.obj -MD -MP -MF $(DEPDIR)/declare_deps_after_submission_synchronous.Tpo -c -o declare_deps_after_submission_synchronous.obj `if test -f 'main/declare_deps_after_submission_synchronous.c'; then $(CYGPATH_W) 'main/declare_deps_after_submission_synchronous.c'; else $(CYGPATH_W) '$(srcdir)/main/declare_deps_after_submission_synchronous.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/declare_deps_after_submission_synchronous.Tpo $(DEPDIR)/declare_deps_after_submission_synchronous.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/declare_deps_after_submission_synchronous.c' object='declare_deps_after_submission_synchronous.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o declare_deps_after_submission_synchronous.obj `if test -f 'main/declare_deps_after_submission_synchronous.c'; then $(CYGPATH_W) 'main/declare_deps_after_submission_synchronous.c'; else $(CYGPATH_W) '$(srcdir)/main/declare_deps_after_submission_synchronous.c'; fi` declare_deps_in_callback.o: main/declare_deps_in_callback.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT declare_deps_in_callback.o -MD -MP -MF $(DEPDIR)/declare_deps_in_callback.Tpo -c -o declare_deps_in_callback.o `test -f 'main/declare_deps_in_callback.c' || echo '$(srcdir)/'`main/declare_deps_in_callback.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/declare_deps_in_callback.Tpo $(DEPDIR)/declare_deps_in_callback.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/declare_deps_in_callback.c' object='declare_deps_in_callback.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o declare_deps_in_callback.o `test -f 'main/declare_deps_in_callback.c' || echo '$(srcdir)/'`main/declare_deps_in_callback.c declare_deps_in_callback.obj: main/declare_deps_in_callback.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT declare_deps_in_callback.obj -MD -MP -MF $(DEPDIR)/declare_deps_in_callback.Tpo -c -o declare_deps_in_callback.obj `if test -f 'main/declare_deps_in_callback.c'; then $(CYGPATH_W) 'main/declare_deps_in_callback.c'; else $(CYGPATH_W) '$(srcdir)/main/declare_deps_in_callback.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/declare_deps_in_callback.Tpo $(DEPDIR)/declare_deps_in_callback.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/declare_deps_in_callback.c' object='declare_deps_in_callback.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o declare_deps_in_callback.obj `if test -f 'main/declare_deps_in_callback.c'; then $(CYGPATH_W) 'main/declare_deps_in_callback.c'; else $(CYGPATH_W) '$(srcdir)/main/declare_deps_in_callback.c'; fi` deploop.o: main/deploop.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT deploop.o -MD -MP -MF $(DEPDIR)/deploop.Tpo -c -o deploop.o `test -f 'main/deploop.c' || echo '$(srcdir)/'`main/deploop.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/deploop.Tpo $(DEPDIR)/deploop.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/deploop.c' object='deploop.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o deploop.o `test -f 'main/deploop.c' || echo '$(srcdir)/'`main/deploop.c deploop.obj: main/deploop.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT deploop.obj -MD -MP -MF $(DEPDIR)/deploop.Tpo -c -o deploop.obj `if test -f 'main/deploop.c'; then $(CYGPATH_W) 'main/deploop.c'; else $(CYGPATH_W) '$(srcdir)/main/deploop.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/deploop.Tpo $(DEPDIR)/deploop.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/deploop.c' object='deploop.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o deploop.obj `if test -f 'main/deploop.c'; then $(CYGPATH_W) 'main/deploop.c'; else $(CYGPATH_W) '$(srcdir)/main/deploop.c'; fi` main_deprecated_func-deprecated_func.o: main/deprecated_func.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(main_deprecated_func_CFLAGS) $(CFLAGS) -MT main_deprecated_func-deprecated_func.o -MD -MP -MF $(DEPDIR)/main_deprecated_func-deprecated_func.Tpo -c -o main_deprecated_func-deprecated_func.o `test -f 'main/deprecated_func.c' || echo '$(srcdir)/'`main/deprecated_func.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/main_deprecated_func-deprecated_func.Tpo $(DEPDIR)/main_deprecated_func-deprecated_func.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/deprecated_func.c' object='main_deprecated_func-deprecated_func.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(main_deprecated_func_CFLAGS) $(CFLAGS) -c -o main_deprecated_func-deprecated_func.o `test -f 'main/deprecated_func.c' || echo '$(srcdir)/'`main/deprecated_func.c main_deprecated_func-deprecated_func.obj: main/deprecated_func.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(main_deprecated_func_CFLAGS) $(CFLAGS) -MT main_deprecated_func-deprecated_func.obj -MD -MP -MF $(DEPDIR)/main_deprecated_func-deprecated_func.Tpo -c -o main_deprecated_func-deprecated_func.obj `if test -f 'main/deprecated_func.c'; then $(CYGPATH_W) 'main/deprecated_func.c'; else $(CYGPATH_W) '$(srcdir)/main/deprecated_func.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/main_deprecated_func-deprecated_func.Tpo $(DEPDIR)/main_deprecated_func-deprecated_func.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/deprecated_func.c' object='main_deprecated_func-deprecated_func.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(main_deprecated_func_CFLAGS) $(CFLAGS) -c -o main_deprecated_func-deprecated_func.obj `if test -f 'main/deprecated_func.c'; then $(CYGPATH_W) 'main/deprecated_func.c'; else $(CYGPATH_W) '$(srcdir)/main/deprecated_func.c'; fi` init_run_deinit.o: main/driver_api/init_run_deinit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT init_run_deinit.o -MD -MP -MF $(DEPDIR)/init_run_deinit.Tpo -c -o init_run_deinit.o `test -f 'main/driver_api/init_run_deinit.c' || echo '$(srcdir)/'`main/driver_api/init_run_deinit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/init_run_deinit.Tpo $(DEPDIR)/init_run_deinit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/driver_api/init_run_deinit.c' object='init_run_deinit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o init_run_deinit.o `test -f 'main/driver_api/init_run_deinit.c' || echo '$(srcdir)/'`main/driver_api/init_run_deinit.c init_run_deinit.obj: main/driver_api/init_run_deinit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT init_run_deinit.obj -MD -MP -MF $(DEPDIR)/init_run_deinit.Tpo -c -o init_run_deinit.obj `if test -f 'main/driver_api/init_run_deinit.c'; then $(CYGPATH_W) 'main/driver_api/init_run_deinit.c'; else $(CYGPATH_W) '$(srcdir)/main/driver_api/init_run_deinit.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/init_run_deinit.Tpo $(DEPDIR)/init_run_deinit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/driver_api/init_run_deinit.c' object='init_run_deinit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o init_run_deinit.obj `if test -f 'main/driver_api/init_run_deinit.c'; then $(CYGPATH_W) 'main/driver_api/init_run_deinit.c'; else $(CYGPATH_W) '$(srcdir)/main/driver_api/init_run_deinit.c'; fi` run_driver.o: main/driver_api/run_driver.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT run_driver.o -MD -MP -MF $(DEPDIR)/run_driver.Tpo -c -o run_driver.o `test -f 'main/driver_api/run_driver.c' || echo '$(srcdir)/'`main/driver_api/run_driver.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/run_driver.Tpo $(DEPDIR)/run_driver.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/driver_api/run_driver.c' object='run_driver.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o run_driver.o `test -f 'main/driver_api/run_driver.c' || echo '$(srcdir)/'`main/driver_api/run_driver.c run_driver.obj: main/driver_api/run_driver.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT run_driver.obj -MD -MP -MF $(DEPDIR)/run_driver.Tpo -c -o run_driver.obj `if test -f 'main/driver_api/run_driver.c'; then $(CYGPATH_W) 'main/driver_api/run_driver.c'; else $(CYGPATH_W) '$(srcdir)/main/driver_api/run_driver.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/run_driver.Tpo $(DEPDIR)/run_driver.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/driver_api/run_driver.c' object='run_driver.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o run_driver.obj `if test -f 'main/driver_api/run_driver.c'; then $(CYGPATH_W) 'main/driver_api/run_driver.c'; else $(CYGPATH_W) '$(srcdir)/main/driver_api/run_driver.c'; fi` empty_task.o: main/empty_task.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT empty_task.o -MD -MP -MF $(DEPDIR)/empty_task.Tpo -c -o empty_task.o `test -f 'main/empty_task.c' || echo '$(srcdir)/'`main/empty_task.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/empty_task.Tpo $(DEPDIR)/empty_task.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/empty_task.c' object='empty_task.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o empty_task.o `test -f 'main/empty_task.c' || echo '$(srcdir)/'`main/empty_task.c empty_task.obj: main/empty_task.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT empty_task.obj -MD -MP -MF $(DEPDIR)/empty_task.Tpo -c -o empty_task.obj `if test -f 'main/empty_task.c'; then $(CYGPATH_W) 'main/empty_task.c'; else $(CYGPATH_W) '$(srcdir)/main/empty_task.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/empty_task.Tpo $(DEPDIR)/empty_task.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/empty_task.c' object='empty_task.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o empty_task.obj `if test -f 'main/empty_task.c'; then $(CYGPATH_W) 'main/empty_task.c'; else $(CYGPATH_W) '$(srcdir)/main/empty_task.c'; fi` empty_task_chain.o: main/empty_task_chain.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT empty_task_chain.o -MD -MP -MF $(DEPDIR)/empty_task_chain.Tpo -c -o empty_task_chain.o `test -f 'main/empty_task_chain.c' || echo '$(srcdir)/'`main/empty_task_chain.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/empty_task_chain.Tpo $(DEPDIR)/empty_task_chain.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/empty_task_chain.c' object='empty_task_chain.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o empty_task_chain.o `test -f 'main/empty_task_chain.c' || echo '$(srcdir)/'`main/empty_task_chain.c empty_task_chain.obj: main/empty_task_chain.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT empty_task_chain.obj -MD -MP -MF $(DEPDIR)/empty_task_chain.Tpo -c -o empty_task_chain.obj `if test -f 'main/empty_task_chain.c'; then $(CYGPATH_W) 'main/empty_task_chain.c'; else $(CYGPATH_W) '$(srcdir)/main/empty_task_chain.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/empty_task_chain.Tpo $(DEPDIR)/empty_task_chain.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/empty_task_chain.c' object='empty_task_chain.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o empty_task_chain.obj `if test -f 'main/empty_task_chain.c'; then $(CYGPATH_W) 'main/empty_task_chain.c'; else $(CYGPATH_W) '$(srcdir)/main/empty_task_chain.c'; fi` empty_task_sync_point.o: main/empty_task_sync_point.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT empty_task_sync_point.o -MD -MP -MF $(DEPDIR)/empty_task_sync_point.Tpo -c -o empty_task_sync_point.o `test -f 'main/empty_task_sync_point.c' || echo '$(srcdir)/'`main/empty_task_sync_point.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/empty_task_sync_point.Tpo $(DEPDIR)/empty_task_sync_point.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/empty_task_sync_point.c' object='empty_task_sync_point.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o empty_task_sync_point.o `test -f 'main/empty_task_sync_point.c' || echo '$(srcdir)/'`main/empty_task_sync_point.c empty_task_sync_point.obj: main/empty_task_sync_point.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT empty_task_sync_point.obj -MD -MP -MF $(DEPDIR)/empty_task_sync_point.Tpo -c -o empty_task_sync_point.obj `if test -f 'main/empty_task_sync_point.c'; then $(CYGPATH_W) 'main/empty_task_sync_point.c'; else $(CYGPATH_W) '$(srcdir)/main/empty_task_sync_point.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/empty_task_sync_point.Tpo $(DEPDIR)/empty_task_sync_point.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/empty_task_sync_point.c' object='empty_task_sync_point.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o empty_task_sync_point.obj `if test -f 'main/empty_task_sync_point.c'; then $(CYGPATH_W) 'main/empty_task_sync_point.c'; else $(CYGPATH_W) '$(srcdir)/main/empty_task_sync_point.c'; fi` empty_task_sync_point_tasks.o: main/empty_task_sync_point_tasks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT empty_task_sync_point_tasks.o -MD -MP -MF $(DEPDIR)/empty_task_sync_point_tasks.Tpo -c -o empty_task_sync_point_tasks.o `test -f 'main/empty_task_sync_point_tasks.c' || echo '$(srcdir)/'`main/empty_task_sync_point_tasks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/empty_task_sync_point_tasks.Tpo $(DEPDIR)/empty_task_sync_point_tasks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/empty_task_sync_point_tasks.c' object='empty_task_sync_point_tasks.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o empty_task_sync_point_tasks.o `test -f 'main/empty_task_sync_point_tasks.c' || echo '$(srcdir)/'`main/empty_task_sync_point_tasks.c empty_task_sync_point_tasks.obj: main/empty_task_sync_point_tasks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT empty_task_sync_point_tasks.obj -MD -MP -MF $(DEPDIR)/empty_task_sync_point_tasks.Tpo -c -o empty_task_sync_point_tasks.obj `if test -f 'main/empty_task_sync_point_tasks.c'; then $(CYGPATH_W) 'main/empty_task_sync_point_tasks.c'; else $(CYGPATH_W) '$(srcdir)/main/empty_task_sync_point_tasks.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/empty_task_sync_point_tasks.Tpo $(DEPDIR)/empty_task_sync_point_tasks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/empty_task_sync_point_tasks.c' object='empty_task_sync_point_tasks.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o empty_task_sync_point_tasks.obj `if test -f 'main/empty_task_sync_point_tasks.c'; then $(CYGPATH_W) 'main/empty_task_sync_point_tasks.c'; else $(CYGPATH_W) '$(srcdir)/main/empty_task_sync_point_tasks.c'; fi` execute_on_a_specific_worker.o: main/execute_on_a_specific_worker.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT execute_on_a_specific_worker.o -MD -MP -MF $(DEPDIR)/execute_on_a_specific_worker.Tpo -c -o execute_on_a_specific_worker.o `test -f 'main/execute_on_a_specific_worker.c' || echo '$(srcdir)/'`main/execute_on_a_specific_worker.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/execute_on_a_specific_worker.Tpo $(DEPDIR)/execute_on_a_specific_worker.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/execute_on_a_specific_worker.c' object='execute_on_a_specific_worker.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o execute_on_a_specific_worker.o `test -f 'main/execute_on_a_specific_worker.c' || echo '$(srcdir)/'`main/execute_on_a_specific_worker.c execute_on_a_specific_worker.obj: main/execute_on_a_specific_worker.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT execute_on_a_specific_worker.obj -MD -MP -MF $(DEPDIR)/execute_on_a_specific_worker.Tpo -c -o execute_on_a_specific_worker.obj `if test -f 'main/execute_on_a_specific_worker.c'; then $(CYGPATH_W) 'main/execute_on_a_specific_worker.c'; else $(CYGPATH_W) '$(srcdir)/main/execute_on_a_specific_worker.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/execute_on_a_specific_worker.Tpo $(DEPDIR)/execute_on_a_specific_worker.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/execute_on_a_specific_worker.c' object='execute_on_a_specific_worker.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o execute_on_a_specific_worker.obj `if test -f 'main/execute_on_a_specific_worker.c'; then $(CYGPATH_W) 'main/execute_on_a_specific_worker.c'; else $(CYGPATH_W) '$(srcdir)/main/execute_on_a_specific_worker.c'; fi` execute_schedule.o: main/execute_schedule.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT execute_schedule.o -MD -MP -MF $(DEPDIR)/execute_schedule.Tpo -c -o execute_schedule.o `test -f 'main/execute_schedule.c' || echo '$(srcdir)/'`main/execute_schedule.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/execute_schedule.Tpo $(DEPDIR)/execute_schedule.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/execute_schedule.c' object='execute_schedule.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o execute_schedule.o `test -f 'main/execute_schedule.c' || echo '$(srcdir)/'`main/execute_schedule.c execute_schedule.obj: main/execute_schedule.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT execute_schedule.obj -MD -MP -MF $(DEPDIR)/execute_schedule.Tpo -c -o execute_schedule.obj `if test -f 'main/execute_schedule.c'; then $(CYGPATH_W) 'main/execute_schedule.c'; else $(CYGPATH_W) '$(srcdir)/main/execute_schedule.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/execute_schedule.Tpo $(DEPDIR)/execute_schedule.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/execute_schedule.c' object='execute_schedule.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o execute_schedule.obj `if test -f 'main/execute_schedule.c'; then $(CYGPATH_W) 'main/execute_schedule.c'; else $(CYGPATH_W) '$(srcdir)/main/execute_schedule.c'; fi` get_children_tasks.o: main/get_children_tasks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT get_children_tasks.o -MD -MP -MF $(DEPDIR)/get_children_tasks.Tpo -c -o get_children_tasks.o `test -f 'main/get_children_tasks.c' || echo '$(srcdir)/'`main/get_children_tasks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/get_children_tasks.Tpo $(DEPDIR)/get_children_tasks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/get_children_tasks.c' object='get_children_tasks.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o get_children_tasks.o `test -f 'main/get_children_tasks.c' || echo '$(srcdir)/'`main/get_children_tasks.c get_children_tasks.obj: main/get_children_tasks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT get_children_tasks.obj -MD -MP -MF $(DEPDIR)/get_children_tasks.Tpo -c -o get_children_tasks.obj `if test -f 'main/get_children_tasks.c'; then $(CYGPATH_W) 'main/get_children_tasks.c'; else $(CYGPATH_W) '$(srcdir)/main/get_children_tasks.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/get_children_tasks.Tpo $(DEPDIR)/get_children_tasks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/get_children_tasks.c' object='get_children_tasks.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o get_children_tasks.obj `if test -f 'main/get_children_tasks.c'; then $(CYGPATH_W) 'main/get_children_tasks.c'; else $(CYGPATH_W) '$(srcdir)/main/get_children_tasks.c'; fi` get_current_task.o: main/get_current_task.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT get_current_task.o -MD -MP -MF $(DEPDIR)/get_current_task.Tpo -c -o get_current_task.o `test -f 'main/get_current_task.c' || echo '$(srcdir)/'`main/get_current_task.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/get_current_task.Tpo $(DEPDIR)/get_current_task.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/get_current_task.c' object='get_current_task.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o get_current_task.o `test -f 'main/get_current_task.c' || echo '$(srcdir)/'`main/get_current_task.c get_current_task.obj: main/get_current_task.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT get_current_task.obj -MD -MP -MF $(DEPDIR)/get_current_task.Tpo -c -o get_current_task.obj `if test -f 'main/get_current_task.c'; then $(CYGPATH_W) 'main/get_current_task.c'; else $(CYGPATH_W) '$(srcdir)/main/get_current_task.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/get_current_task.Tpo $(DEPDIR)/get_current_task.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/get_current_task.c' object='get_current_task.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o get_current_task.obj `if test -f 'main/get_current_task.c'; then $(CYGPATH_W) 'main/get_current_task.c'; else $(CYGPATH_W) '$(srcdir)/main/get_current_task.c'; fi` insert_task.o: main/insert_task.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT insert_task.o -MD -MP -MF $(DEPDIR)/insert_task.Tpo -c -o insert_task.o `test -f 'main/insert_task.c' || echo '$(srcdir)/'`main/insert_task.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/insert_task.Tpo $(DEPDIR)/insert_task.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/insert_task.c' object='insert_task.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o insert_task.o `test -f 'main/insert_task.c' || echo '$(srcdir)/'`main/insert_task.c insert_task.obj: main/insert_task.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT insert_task.obj -MD -MP -MF $(DEPDIR)/insert_task.Tpo -c -o insert_task.obj `if test -f 'main/insert_task.c'; then $(CYGPATH_W) 'main/insert_task.c'; else $(CYGPATH_W) '$(srcdir)/main/insert_task.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/insert_task.Tpo $(DEPDIR)/insert_task.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/insert_task.c' object='insert_task.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o insert_task.obj `if test -f 'main/insert_task.c'; then $(CYGPATH_W) 'main/insert_task.c'; else $(CYGPATH_W) '$(srcdir)/main/insert_task.c'; fi` insert_task_array.o: main/insert_task_array.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT insert_task_array.o -MD -MP -MF $(DEPDIR)/insert_task_array.Tpo -c -o insert_task_array.o `test -f 'main/insert_task_array.c' || echo '$(srcdir)/'`main/insert_task_array.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/insert_task_array.Tpo $(DEPDIR)/insert_task_array.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/insert_task_array.c' object='insert_task_array.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o insert_task_array.o `test -f 'main/insert_task_array.c' || echo '$(srcdir)/'`main/insert_task_array.c insert_task_array.obj: main/insert_task_array.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT insert_task_array.obj -MD -MP -MF $(DEPDIR)/insert_task_array.Tpo -c -o insert_task_array.obj `if test -f 'main/insert_task_array.c'; then $(CYGPATH_W) 'main/insert_task_array.c'; else $(CYGPATH_W) '$(srcdir)/main/insert_task_array.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/insert_task_array.Tpo $(DEPDIR)/insert_task_array.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/insert_task_array.c' object='insert_task_array.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o insert_task_array.obj `if test -f 'main/insert_task_array.c'; then $(CYGPATH_W) 'main/insert_task_array.c'; else $(CYGPATH_W) '$(srcdir)/main/insert_task_array.c'; fi` insert_task_dyn_handles.o: main/insert_task_dyn_handles.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT insert_task_dyn_handles.o -MD -MP -MF $(DEPDIR)/insert_task_dyn_handles.Tpo -c -o insert_task_dyn_handles.o `test -f 'main/insert_task_dyn_handles.c' || echo '$(srcdir)/'`main/insert_task_dyn_handles.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/insert_task_dyn_handles.Tpo $(DEPDIR)/insert_task_dyn_handles.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/insert_task_dyn_handles.c' object='insert_task_dyn_handles.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o insert_task_dyn_handles.o `test -f 'main/insert_task_dyn_handles.c' || echo '$(srcdir)/'`main/insert_task_dyn_handles.c insert_task_dyn_handles.obj: main/insert_task_dyn_handles.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT insert_task_dyn_handles.obj -MD -MP -MF $(DEPDIR)/insert_task_dyn_handles.Tpo -c -o insert_task_dyn_handles.obj `if test -f 'main/insert_task_dyn_handles.c'; then $(CYGPATH_W) 'main/insert_task_dyn_handles.c'; else $(CYGPATH_W) '$(srcdir)/main/insert_task_dyn_handles.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/insert_task_dyn_handles.Tpo $(DEPDIR)/insert_task_dyn_handles.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/insert_task_dyn_handles.c' object='insert_task_dyn_handles.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o insert_task_dyn_handles.obj `if test -f 'main/insert_task_dyn_handles.c'; then $(CYGPATH_W) 'main/insert_task_dyn_handles.c'; else $(CYGPATH_W) '$(srcdir)/main/insert_task_dyn_handles.c'; fi` insert_task_many.o: main/insert_task_many.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT insert_task_many.o -MD -MP -MF $(DEPDIR)/insert_task_many.Tpo -c -o insert_task_many.o `test -f 'main/insert_task_many.c' || echo '$(srcdir)/'`main/insert_task_many.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/insert_task_many.Tpo $(DEPDIR)/insert_task_many.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/insert_task_many.c' object='insert_task_many.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o insert_task_many.o `test -f 'main/insert_task_many.c' || echo '$(srcdir)/'`main/insert_task_many.c insert_task_many.obj: main/insert_task_many.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT insert_task_many.obj -MD -MP -MF $(DEPDIR)/insert_task_many.Tpo -c -o insert_task_many.obj `if test -f 'main/insert_task_many.c'; then $(CYGPATH_W) 'main/insert_task_many.c'; else $(CYGPATH_W) '$(srcdir)/main/insert_task_many.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/insert_task_many.Tpo $(DEPDIR)/insert_task_many.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/insert_task_many.c' object='insert_task_many.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o insert_task_many.obj `if test -f 'main/insert_task_many.c'; then $(CYGPATH_W) 'main/insert_task_many.c'; else $(CYGPATH_W) '$(srcdir)/main/insert_task_many.c'; fi` insert_task_nullcodelet.o: main/insert_task_nullcodelet.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT insert_task_nullcodelet.o -MD -MP -MF $(DEPDIR)/insert_task_nullcodelet.Tpo -c -o insert_task_nullcodelet.o `test -f 'main/insert_task_nullcodelet.c' || echo '$(srcdir)/'`main/insert_task_nullcodelet.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/insert_task_nullcodelet.Tpo $(DEPDIR)/insert_task_nullcodelet.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/insert_task_nullcodelet.c' object='insert_task_nullcodelet.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o insert_task_nullcodelet.o `test -f 'main/insert_task_nullcodelet.c' || echo '$(srcdir)/'`main/insert_task_nullcodelet.c insert_task_nullcodelet.obj: main/insert_task_nullcodelet.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT insert_task_nullcodelet.obj -MD -MP -MF $(DEPDIR)/insert_task_nullcodelet.Tpo -c -o insert_task_nullcodelet.obj `if test -f 'main/insert_task_nullcodelet.c'; then $(CYGPATH_W) 'main/insert_task_nullcodelet.c'; else $(CYGPATH_W) '$(srcdir)/main/insert_task_nullcodelet.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/insert_task_nullcodelet.Tpo $(DEPDIR)/insert_task_nullcodelet.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/insert_task_nullcodelet.c' object='insert_task_nullcodelet.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o insert_task_nullcodelet.obj `if test -f 'main/insert_task_nullcodelet.c'; then $(CYGPATH_W) 'main/insert_task_nullcodelet.c'; else $(CYGPATH_W) '$(srcdir)/main/insert_task_nullcodelet.c'; fi` insert_task_pack.o: main/insert_task_pack.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT insert_task_pack.o -MD -MP -MF $(DEPDIR)/insert_task_pack.Tpo -c -o insert_task_pack.o `test -f 'main/insert_task_pack.c' || echo '$(srcdir)/'`main/insert_task_pack.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/insert_task_pack.Tpo $(DEPDIR)/insert_task_pack.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/insert_task_pack.c' object='insert_task_pack.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o insert_task_pack.o `test -f 'main/insert_task_pack.c' || echo '$(srcdir)/'`main/insert_task_pack.c insert_task_pack.obj: main/insert_task_pack.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT insert_task_pack.obj -MD -MP -MF $(DEPDIR)/insert_task_pack.Tpo -c -o insert_task_pack.obj `if test -f 'main/insert_task_pack.c'; then $(CYGPATH_W) 'main/insert_task_pack.c'; else $(CYGPATH_W) '$(srcdir)/main/insert_task_pack.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/insert_task_pack.Tpo $(DEPDIR)/insert_task_pack.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/insert_task_pack.c' object='insert_task_pack.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o insert_task_pack.obj `if test -f 'main/insert_task_pack.c'; then $(CYGPATH_W) 'main/insert_task_pack.c'; else $(CYGPATH_W) '$(srcdir)/main/insert_task_pack.c'; fi` insert_task_value.o: main/insert_task_value.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT insert_task_value.o -MD -MP -MF $(DEPDIR)/insert_task_value.Tpo -c -o insert_task_value.o `test -f 'main/insert_task_value.c' || echo '$(srcdir)/'`main/insert_task_value.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/insert_task_value.Tpo $(DEPDIR)/insert_task_value.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/insert_task_value.c' object='insert_task_value.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o insert_task_value.o `test -f 'main/insert_task_value.c' || echo '$(srcdir)/'`main/insert_task_value.c insert_task_value.obj: main/insert_task_value.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT insert_task_value.obj -MD -MP -MF $(DEPDIR)/insert_task_value.Tpo -c -o insert_task_value.obj `if test -f 'main/insert_task_value.c'; then $(CYGPATH_W) 'main/insert_task_value.c'; else $(CYGPATH_W) '$(srcdir)/main/insert_task_value.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/insert_task_value.Tpo $(DEPDIR)/insert_task_value.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/insert_task_value.c' object='insert_task_value.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o insert_task_value.obj `if test -f 'main/insert_task_value.c'; then $(CYGPATH_W) 'main/insert_task_value.c'; else $(CYGPATH_W) '$(srcdir)/main/insert_task_value.c'; fi` mkdtemp.o: main/mkdtemp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mkdtemp.o -MD -MP -MF $(DEPDIR)/mkdtemp.Tpo -c -o mkdtemp.o `test -f 'main/mkdtemp.c' || echo '$(srcdir)/'`main/mkdtemp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mkdtemp.Tpo $(DEPDIR)/mkdtemp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/mkdtemp.c' object='mkdtemp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mkdtemp.o `test -f 'main/mkdtemp.c' || echo '$(srcdir)/'`main/mkdtemp.c mkdtemp.obj: main/mkdtemp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mkdtemp.obj -MD -MP -MF $(DEPDIR)/mkdtemp.Tpo -c -o mkdtemp.obj `if test -f 'main/mkdtemp.c'; then $(CYGPATH_W) 'main/mkdtemp.c'; else $(CYGPATH_W) '$(srcdir)/main/mkdtemp.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mkdtemp.Tpo $(DEPDIR)/mkdtemp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/mkdtemp.c' object='mkdtemp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mkdtemp.obj `if test -f 'main/mkdtemp.c'; then $(CYGPATH_W) 'main/mkdtemp.c'; else $(CYGPATH_W) '$(srcdir)/main/mkdtemp.c'; fi` multithreaded.o: main/multithreaded.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multithreaded.o -MD -MP -MF $(DEPDIR)/multithreaded.Tpo -c -o multithreaded.o `test -f 'main/multithreaded.c' || echo '$(srcdir)/'`main/multithreaded.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multithreaded.Tpo $(DEPDIR)/multithreaded.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/multithreaded.c' object='multithreaded.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multithreaded.o `test -f 'main/multithreaded.c' || echo '$(srcdir)/'`main/multithreaded.c multithreaded.obj: main/multithreaded.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multithreaded.obj -MD -MP -MF $(DEPDIR)/multithreaded.Tpo -c -o multithreaded.obj `if test -f 'main/multithreaded.c'; then $(CYGPATH_W) 'main/multithreaded.c'; else $(CYGPATH_W) '$(srcdir)/main/multithreaded.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multithreaded.Tpo $(DEPDIR)/multithreaded.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/multithreaded.c' object='multithreaded.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multithreaded.obj `if test -f 'main/multithreaded.c'; then $(CYGPATH_W) 'main/multithreaded.c'; else $(CYGPATH_W) '$(srcdir)/main/multithreaded.c'; fi` multithreaded_init.o: main/multithreaded_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multithreaded_init.o -MD -MP -MF $(DEPDIR)/multithreaded_init.Tpo -c -o multithreaded_init.o `test -f 'main/multithreaded_init.c' || echo '$(srcdir)/'`main/multithreaded_init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multithreaded_init.Tpo $(DEPDIR)/multithreaded_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/multithreaded_init.c' object='multithreaded_init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multithreaded_init.o `test -f 'main/multithreaded_init.c' || echo '$(srcdir)/'`main/multithreaded_init.c multithreaded_init.obj: main/multithreaded_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multithreaded_init.obj -MD -MP -MF $(DEPDIR)/multithreaded_init.Tpo -c -o multithreaded_init.obj `if test -f 'main/multithreaded_init.c'; then $(CYGPATH_W) 'main/multithreaded_init.c'; else $(CYGPATH_W) '$(srcdir)/main/multithreaded_init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multithreaded_init.Tpo $(DEPDIR)/multithreaded_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/multithreaded_init.c' object='multithreaded_init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multithreaded_init.obj `if test -f 'main/multithreaded_init.c'; then $(CYGPATH_W) 'main/multithreaded_init.c'; else $(CYGPATH_W) '$(srcdir)/main/multithreaded_init.c'; fi` pack.o: main/pack.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pack.o -MD -MP -MF $(DEPDIR)/pack.Tpo -c -o pack.o `test -f 'main/pack.c' || echo '$(srcdir)/'`main/pack.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pack.Tpo $(DEPDIR)/pack.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/pack.c' object='pack.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pack.o `test -f 'main/pack.c' || echo '$(srcdir)/'`main/pack.c pack.obj: main/pack.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pack.obj -MD -MP -MF $(DEPDIR)/pack.Tpo -c -o pack.obj `if test -f 'main/pack.c'; then $(CYGPATH_W) 'main/pack.c'; else $(CYGPATH_W) '$(srcdir)/main/pack.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pack.Tpo $(DEPDIR)/pack.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/pack.c' object='pack.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pack.obj `if test -f 'main/pack.c'; then $(CYGPATH_W) 'main/pack.c'; else $(CYGPATH_W) '$(srcdir)/main/pack.c'; fi` pause_resume.o: main/pause_resume.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pause_resume.o -MD -MP -MF $(DEPDIR)/pause_resume.Tpo -c -o pause_resume.o `test -f 'main/pause_resume.c' || echo '$(srcdir)/'`main/pause_resume.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pause_resume.Tpo $(DEPDIR)/pause_resume.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/pause_resume.c' object='pause_resume.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pause_resume.o `test -f 'main/pause_resume.c' || echo '$(srcdir)/'`main/pause_resume.c pause_resume.obj: main/pause_resume.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pause_resume.obj -MD -MP -MF $(DEPDIR)/pause_resume.Tpo -c -o pause_resume.obj `if test -f 'main/pause_resume.c'; then $(CYGPATH_W) 'main/pause_resume.c'; else $(CYGPATH_W) '$(srcdir)/main/pause_resume.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pause_resume.Tpo $(DEPDIR)/pause_resume.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/pause_resume.c' object='pause_resume.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pause_resume.obj `if test -f 'main/pause_resume.c'; then $(CYGPATH_W) 'main/pause_resume.c'; else $(CYGPATH_W) '$(srcdir)/main/pause_resume.c'; fi` regenerate.o: main/regenerate.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT regenerate.o -MD -MP -MF $(DEPDIR)/regenerate.Tpo -c -o regenerate.o `test -f 'main/regenerate.c' || echo '$(srcdir)/'`main/regenerate.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/regenerate.Tpo $(DEPDIR)/regenerate.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/regenerate.c' object='regenerate.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o regenerate.o `test -f 'main/regenerate.c' || echo '$(srcdir)/'`main/regenerate.c regenerate.obj: main/regenerate.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT regenerate.obj -MD -MP -MF $(DEPDIR)/regenerate.Tpo -c -o regenerate.obj `if test -f 'main/regenerate.c'; then $(CYGPATH_W) 'main/regenerate.c'; else $(CYGPATH_W) '$(srcdir)/main/regenerate.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/regenerate.Tpo $(DEPDIR)/regenerate.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/regenerate.c' object='regenerate.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o regenerate.obj `if test -f 'main/regenerate.c'; then $(CYGPATH_W) 'main/regenerate.c'; else $(CYGPATH_W) '$(srcdir)/main/regenerate.c'; fi` regenerate_pipeline.o: main/regenerate_pipeline.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT regenerate_pipeline.o -MD -MP -MF $(DEPDIR)/regenerate_pipeline.Tpo -c -o regenerate_pipeline.o `test -f 'main/regenerate_pipeline.c' || echo '$(srcdir)/'`main/regenerate_pipeline.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/regenerate_pipeline.Tpo $(DEPDIR)/regenerate_pipeline.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/regenerate_pipeline.c' object='regenerate_pipeline.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o regenerate_pipeline.o `test -f 'main/regenerate_pipeline.c' || echo '$(srcdir)/'`main/regenerate_pipeline.c regenerate_pipeline.obj: main/regenerate_pipeline.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT regenerate_pipeline.obj -MD -MP -MF $(DEPDIR)/regenerate_pipeline.Tpo -c -o regenerate_pipeline.obj `if test -f 'main/regenerate_pipeline.c'; then $(CYGPATH_W) 'main/regenerate_pipeline.c'; else $(CYGPATH_W) '$(srcdir)/main/regenerate_pipeline.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/regenerate_pipeline.Tpo $(DEPDIR)/regenerate_pipeline.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/regenerate_pipeline.c' object='regenerate_pipeline.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o regenerate_pipeline.obj `if test -f 'main/regenerate_pipeline.c'; then $(CYGPATH_W) 'main/regenerate_pipeline.c'; else $(CYGPATH_W) '$(srcdir)/main/regenerate_pipeline.c'; fi` restart.o: main/restart.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT restart.o -MD -MP -MF $(DEPDIR)/restart.Tpo -c -o restart.o `test -f 'main/restart.c' || echo '$(srcdir)/'`main/restart.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/restart.Tpo $(DEPDIR)/restart.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/restart.c' object='restart.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o restart.o `test -f 'main/restart.c' || echo '$(srcdir)/'`main/restart.c restart.obj: main/restart.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT restart.obj -MD -MP -MF $(DEPDIR)/restart.Tpo -c -o restart.obj `if test -f 'main/restart.c'; then $(CYGPATH_W) 'main/restart.c'; else $(CYGPATH_W) '$(srcdir)/main/restart.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/restart.Tpo $(DEPDIR)/restart.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/restart.c' object='restart.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o restart.obj `if test -f 'main/restart.c'; then $(CYGPATH_W) 'main/restart.c'; else $(CYGPATH_W) '$(srcdir)/main/restart.c'; fi` starpu_init.o: main/starpu_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_init.o -MD -MP -MF $(DEPDIR)/starpu_init.Tpo -c -o starpu_init.o `test -f 'main/starpu_init.c' || echo '$(srcdir)/'`main/starpu_init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_init.Tpo $(DEPDIR)/starpu_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/starpu_init.c' object='starpu_init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_init.o `test -f 'main/starpu_init.c' || echo '$(srcdir)/'`main/starpu_init.c starpu_init.obj: main/starpu_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_init.obj -MD -MP -MF $(DEPDIR)/starpu_init.Tpo -c -o starpu_init.obj `if test -f 'main/starpu_init.c'; then $(CYGPATH_W) 'main/starpu_init.c'; else $(CYGPATH_W) '$(srcdir)/main/starpu_init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_init.Tpo $(DEPDIR)/starpu_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/starpu_init.c' object='starpu_init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_init.obj `if test -f 'main/starpu_init.c'; then $(CYGPATH_W) 'main/starpu_init.c'; else $(CYGPATH_W) '$(srcdir)/main/starpu_init.c'; fi` starpu_task_bundle.o: main/starpu_task_bundle.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_task_bundle.o -MD -MP -MF $(DEPDIR)/starpu_task_bundle.Tpo -c -o starpu_task_bundle.o `test -f 'main/starpu_task_bundle.c' || echo '$(srcdir)/'`main/starpu_task_bundle.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_task_bundle.Tpo $(DEPDIR)/starpu_task_bundle.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/starpu_task_bundle.c' object='starpu_task_bundle.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_task_bundle.o `test -f 'main/starpu_task_bundle.c' || echo '$(srcdir)/'`main/starpu_task_bundle.c starpu_task_bundle.obj: main/starpu_task_bundle.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_task_bundle.obj -MD -MP -MF $(DEPDIR)/starpu_task_bundle.Tpo -c -o starpu_task_bundle.obj `if test -f 'main/starpu_task_bundle.c'; then $(CYGPATH_W) 'main/starpu_task_bundle.c'; else $(CYGPATH_W) '$(srcdir)/main/starpu_task_bundle.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_task_bundle.Tpo $(DEPDIR)/starpu_task_bundle.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/starpu_task_bundle.c' object='starpu_task_bundle.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_task_bundle.obj `if test -f 'main/starpu_task_bundle.c'; then $(CYGPATH_W) 'main/starpu_task_bundle.c'; else $(CYGPATH_W) '$(srcdir)/main/starpu_task_bundle.c'; fi` starpu_task_wait.o: main/starpu_task_wait.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_task_wait.o -MD -MP -MF $(DEPDIR)/starpu_task_wait.Tpo -c -o starpu_task_wait.o `test -f 'main/starpu_task_wait.c' || echo '$(srcdir)/'`main/starpu_task_wait.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_task_wait.Tpo $(DEPDIR)/starpu_task_wait.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/starpu_task_wait.c' object='starpu_task_wait.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_task_wait.o `test -f 'main/starpu_task_wait.c' || echo '$(srcdir)/'`main/starpu_task_wait.c starpu_task_wait.obj: main/starpu_task_wait.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_task_wait.obj -MD -MP -MF $(DEPDIR)/starpu_task_wait.Tpo -c -o starpu_task_wait.obj `if test -f 'main/starpu_task_wait.c'; then $(CYGPATH_W) 'main/starpu_task_wait.c'; else $(CYGPATH_W) '$(srcdir)/main/starpu_task_wait.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_task_wait.Tpo $(DEPDIR)/starpu_task_wait.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/starpu_task_wait.c' object='starpu_task_wait.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_task_wait.obj `if test -f 'main/starpu_task_wait.c'; then $(CYGPATH_W) 'main/starpu_task_wait.c'; else $(CYGPATH_W) '$(srcdir)/main/starpu_task_wait.c'; fi` starpu_task_wait_for_all.o: main/starpu_task_wait_for_all.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_task_wait_for_all.o -MD -MP -MF $(DEPDIR)/starpu_task_wait_for_all.Tpo -c -o starpu_task_wait_for_all.o `test -f 'main/starpu_task_wait_for_all.c' || echo '$(srcdir)/'`main/starpu_task_wait_for_all.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_task_wait_for_all.Tpo $(DEPDIR)/starpu_task_wait_for_all.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/starpu_task_wait_for_all.c' object='starpu_task_wait_for_all.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_task_wait_for_all.o `test -f 'main/starpu_task_wait_for_all.c' || echo '$(srcdir)/'`main/starpu_task_wait_for_all.c starpu_task_wait_for_all.obj: main/starpu_task_wait_for_all.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_task_wait_for_all.obj -MD -MP -MF $(DEPDIR)/starpu_task_wait_for_all.Tpo -c -o starpu_task_wait_for_all.obj `if test -f 'main/starpu_task_wait_for_all.c'; then $(CYGPATH_W) 'main/starpu_task_wait_for_all.c'; else $(CYGPATH_W) '$(srcdir)/main/starpu_task_wait_for_all.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_task_wait_for_all.Tpo $(DEPDIR)/starpu_task_wait_for_all.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/starpu_task_wait_for_all.c' object='starpu_task_wait_for_all.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_task_wait_for_all.obj `if test -f 'main/starpu_task_wait_for_all.c'; then $(CYGPATH_W) 'main/starpu_task_wait_for_all.c'; else $(CYGPATH_W) '$(srcdir)/main/starpu_task_wait_for_all.c'; fi` starpu_worker_exists.o: main/starpu_worker_exists.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_worker_exists.o -MD -MP -MF $(DEPDIR)/starpu_worker_exists.Tpo -c -o starpu_worker_exists.o `test -f 'main/starpu_worker_exists.c' || echo '$(srcdir)/'`main/starpu_worker_exists.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_worker_exists.Tpo $(DEPDIR)/starpu_worker_exists.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/starpu_worker_exists.c' object='starpu_worker_exists.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_worker_exists.o `test -f 'main/starpu_worker_exists.c' || echo '$(srcdir)/'`main/starpu_worker_exists.c starpu_worker_exists.obj: main/starpu_worker_exists.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_worker_exists.obj -MD -MP -MF $(DEPDIR)/starpu_worker_exists.Tpo -c -o starpu_worker_exists.obj `if test -f 'main/starpu_worker_exists.c'; then $(CYGPATH_W) 'main/starpu_worker_exists.c'; else $(CYGPATH_W) '$(srcdir)/main/starpu_worker_exists.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_worker_exists.Tpo $(DEPDIR)/starpu_worker_exists.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/starpu_worker_exists.c' object='starpu_worker_exists.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_worker_exists.obj `if test -f 'main/starpu_worker_exists.c'; then $(CYGPATH_W) 'main/starpu_worker_exists.c'; else $(CYGPATH_W) '$(srcdir)/main/starpu_worker_exists.c'; fi` static_restartable.o: main/static_restartable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT static_restartable.o -MD -MP -MF $(DEPDIR)/static_restartable.Tpo -c -o static_restartable.o `test -f 'main/static_restartable.c' || echo '$(srcdir)/'`main/static_restartable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/static_restartable.Tpo $(DEPDIR)/static_restartable.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/static_restartable.c' object='static_restartable.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o static_restartable.o `test -f 'main/static_restartable.c' || echo '$(srcdir)/'`main/static_restartable.c static_restartable.obj: main/static_restartable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT static_restartable.obj -MD -MP -MF $(DEPDIR)/static_restartable.Tpo -c -o static_restartable.obj `if test -f 'main/static_restartable.c'; then $(CYGPATH_W) 'main/static_restartable.c'; else $(CYGPATH_W) '$(srcdir)/main/static_restartable.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/static_restartable.Tpo $(DEPDIR)/static_restartable.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/static_restartable.c' object='static_restartable.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o static_restartable.obj `if test -f 'main/static_restartable.c'; then $(CYGPATH_W) 'main/static_restartable.c'; else $(CYGPATH_W) '$(srcdir)/main/static_restartable.c'; fi` static_restartable_tag.o: main/static_restartable_tag.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT static_restartable_tag.o -MD -MP -MF $(DEPDIR)/static_restartable_tag.Tpo -c -o static_restartable_tag.o `test -f 'main/static_restartable_tag.c' || echo '$(srcdir)/'`main/static_restartable_tag.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/static_restartable_tag.Tpo $(DEPDIR)/static_restartable_tag.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/static_restartable_tag.c' object='static_restartable_tag.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o static_restartable_tag.o `test -f 'main/static_restartable_tag.c' || echo '$(srcdir)/'`main/static_restartable_tag.c static_restartable_tag.obj: main/static_restartable_tag.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT static_restartable_tag.obj -MD -MP -MF $(DEPDIR)/static_restartable_tag.Tpo -c -o static_restartable_tag.obj `if test -f 'main/static_restartable_tag.c'; then $(CYGPATH_W) 'main/static_restartable_tag.c'; else $(CYGPATH_W) '$(srcdir)/main/static_restartable_tag.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/static_restartable_tag.Tpo $(DEPDIR)/static_restartable_tag.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/static_restartable_tag.c' object='static_restartable_tag.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o static_restartable_tag.obj `if test -f 'main/static_restartable_tag.c'; then $(CYGPATH_W) 'main/static_restartable_tag.c'; else $(CYGPATH_W) '$(srcdir)/main/static_restartable_tag.c'; fi` static_restartable_using_initializer.o: main/static_restartable_using_initializer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT static_restartable_using_initializer.o -MD -MP -MF $(DEPDIR)/static_restartable_using_initializer.Tpo -c -o static_restartable_using_initializer.o `test -f 'main/static_restartable_using_initializer.c' || echo '$(srcdir)/'`main/static_restartable_using_initializer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/static_restartable_using_initializer.Tpo $(DEPDIR)/static_restartable_using_initializer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/static_restartable_using_initializer.c' object='static_restartable_using_initializer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o static_restartable_using_initializer.o `test -f 'main/static_restartable_using_initializer.c' || echo '$(srcdir)/'`main/static_restartable_using_initializer.c static_restartable_using_initializer.obj: main/static_restartable_using_initializer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT static_restartable_using_initializer.obj -MD -MP -MF $(DEPDIR)/static_restartable_using_initializer.Tpo -c -o static_restartable_using_initializer.obj `if test -f 'main/static_restartable_using_initializer.c'; then $(CYGPATH_W) 'main/static_restartable_using_initializer.c'; else $(CYGPATH_W) '$(srcdir)/main/static_restartable_using_initializer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/static_restartable_using_initializer.Tpo $(DEPDIR)/static_restartable_using_initializer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/static_restartable_using_initializer.c' object='static_restartable_using_initializer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o static_restartable_using_initializer.obj `if test -f 'main/static_restartable_using_initializer.c'; then $(CYGPATH_W) 'main/static_restartable_using_initializer.c'; else $(CYGPATH_W) '$(srcdir)/main/static_restartable_using_initializer.c'; fi` subgraph_repeat.o: main/subgraph_repeat.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subgraph_repeat.o -MD -MP -MF $(DEPDIR)/subgraph_repeat.Tpo -c -o subgraph_repeat.o `test -f 'main/subgraph_repeat.c' || echo '$(srcdir)/'`main/subgraph_repeat.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/subgraph_repeat.Tpo $(DEPDIR)/subgraph_repeat.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/subgraph_repeat.c' object='subgraph_repeat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subgraph_repeat.o `test -f 'main/subgraph_repeat.c' || echo '$(srcdir)/'`main/subgraph_repeat.c subgraph_repeat.obj: main/subgraph_repeat.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subgraph_repeat.obj -MD -MP -MF $(DEPDIR)/subgraph_repeat.Tpo -c -o subgraph_repeat.obj `if test -f 'main/subgraph_repeat.c'; then $(CYGPATH_W) 'main/subgraph_repeat.c'; else $(CYGPATH_W) '$(srcdir)/main/subgraph_repeat.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/subgraph_repeat.Tpo $(DEPDIR)/subgraph_repeat.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/subgraph_repeat.c' object='subgraph_repeat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subgraph_repeat.obj `if test -f 'main/subgraph_repeat.c'; then $(CYGPATH_W) 'main/subgraph_repeat.c'; else $(CYGPATH_W) '$(srcdir)/main/subgraph_repeat.c'; fi` subgraph_repeat_regenerate.o: main/subgraph_repeat_regenerate.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subgraph_repeat_regenerate.o -MD -MP -MF $(DEPDIR)/subgraph_repeat_regenerate.Tpo -c -o subgraph_repeat_regenerate.o `test -f 'main/subgraph_repeat_regenerate.c' || echo '$(srcdir)/'`main/subgraph_repeat_regenerate.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/subgraph_repeat_regenerate.Tpo $(DEPDIR)/subgraph_repeat_regenerate.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/subgraph_repeat_regenerate.c' object='subgraph_repeat_regenerate.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subgraph_repeat_regenerate.o `test -f 'main/subgraph_repeat_regenerate.c' || echo '$(srcdir)/'`main/subgraph_repeat_regenerate.c subgraph_repeat_regenerate.obj: main/subgraph_repeat_regenerate.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subgraph_repeat_regenerate.obj -MD -MP -MF $(DEPDIR)/subgraph_repeat_regenerate.Tpo -c -o subgraph_repeat_regenerate.obj `if test -f 'main/subgraph_repeat_regenerate.c'; then $(CYGPATH_W) 'main/subgraph_repeat_regenerate.c'; else $(CYGPATH_W) '$(srcdir)/main/subgraph_repeat_regenerate.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/subgraph_repeat_regenerate.Tpo $(DEPDIR)/subgraph_repeat_regenerate.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/subgraph_repeat_regenerate.c' object='subgraph_repeat_regenerate.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subgraph_repeat_regenerate.obj `if test -f 'main/subgraph_repeat_regenerate.c'; then $(CYGPATH_W) 'main/subgraph_repeat_regenerate.c'; else $(CYGPATH_W) '$(srcdir)/main/subgraph_repeat_regenerate.c'; fi` subgraph_repeat_regenerate_tag.o: main/subgraph_repeat_regenerate_tag.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subgraph_repeat_regenerate_tag.o -MD -MP -MF $(DEPDIR)/subgraph_repeat_regenerate_tag.Tpo -c -o subgraph_repeat_regenerate_tag.o `test -f 'main/subgraph_repeat_regenerate_tag.c' || echo '$(srcdir)/'`main/subgraph_repeat_regenerate_tag.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/subgraph_repeat_regenerate_tag.Tpo $(DEPDIR)/subgraph_repeat_regenerate_tag.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/subgraph_repeat_regenerate_tag.c' object='subgraph_repeat_regenerate_tag.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subgraph_repeat_regenerate_tag.o `test -f 'main/subgraph_repeat_regenerate_tag.c' || echo '$(srcdir)/'`main/subgraph_repeat_regenerate_tag.c subgraph_repeat_regenerate_tag.obj: main/subgraph_repeat_regenerate_tag.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subgraph_repeat_regenerate_tag.obj -MD -MP -MF $(DEPDIR)/subgraph_repeat_regenerate_tag.Tpo -c -o subgraph_repeat_regenerate_tag.obj `if test -f 'main/subgraph_repeat_regenerate_tag.c'; then $(CYGPATH_W) 'main/subgraph_repeat_regenerate_tag.c'; else $(CYGPATH_W) '$(srcdir)/main/subgraph_repeat_regenerate_tag.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/subgraph_repeat_regenerate_tag.Tpo $(DEPDIR)/subgraph_repeat_regenerate_tag.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/subgraph_repeat_regenerate_tag.c' object='subgraph_repeat_regenerate_tag.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subgraph_repeat_regenerate_tag.obj `if test -f 'main/subgraph_repeat_regenerate_tag.c'; then $(CYGPATH_W) 'main/subgraph_repeat_regenerate_tag.c'; else $(CYGPATH_W) '$(srcdir)/main/subgraph_repeat_regenerate_tag.c'; fi` subgraph_repeat_tag.o: main/subgraph_repeat_tag.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subgraph_repeat_tag.o -MD -MP -MF $(DEPDIR)/subgraph_repeat_tag.Tpo -c -o subgraph_repeat_tag.o `test -f 'main/subgraph_repeat_tag.c' || echo '$(srcdir)/'`main/subgraph_repeat_tag.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/subgraph_repeat_tag.Tpo $(DEPDIR)/subgraph_repeat_tag.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/subgraph_repeat_tag.c' object='subgraph_repeat_tag.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subgraph_repeat_tag.o `test -f 'main/subgraph_repeat_tag.c' || echo '$(srcdir)/'`main/subgraph_repeat_tag.c subgraph_repeat_tag.obj: main/subgraph_repeat_tag.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subgraph_repeat_tag.obj -MD -MP -MF $(DEPDIR)/subgraph_repeat_tag.Tpo -c -o subgraph_repeat_tag.obj `if test -f 'main/subgraph_repeat_tag.c'; then $(CYGPATH_W) 'main/subgraph_repeat_tag.c'; else $(CYGPATH_W) '$(srcdir)/main/subgraph_repeat_tag.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/subgraph_repeat_tag.Tpo $(DEPDIR)/subgraph_repeat_tag.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/subgraph_repeat_tag.c' object='subgraph_repeat_tag.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subgraph_repeat_tag.obj `if test -f 'main/subgraph_repeat_tag.c'; then $(CYGPATH_W) 'main/subgraph_repeat_tag.c'; else $(CYGPATH_W) '$(srcdir)/main/subgraph_repeat_tag.c'; fi` submit.o: main/submit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT submit.o -MD -MP -MF $(DEPDIR)/submit.Tpo -c -o submit.o `test -f 'main/submit.c' || echo '$(srcdir)/'`main/submit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/submit.Tpo $(DEPDIR)/submit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/submit.c' object='submit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o submit.o `test -f 'main/submit.c' || echo '$(srcdir)/'`main/submit.c submit.obj: main/submit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT submit.obj -MD -MP -MF $(DEPDIR)/submit.Tpo -c -o submit.obj `if test -f 'main/submit.c'; then $(CYGPATH_W) 'main/submit.c'; else $(CYGPATH_W) '$(srcdir)/main/submit.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/submit.Tpo $(DEPDIR)/submit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/submit.c' object='submit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o submit.obj `if test -f 'main/submit.c'; then $(CYGPATH_W) 'main/submit.c'; else $(CYGPATH_W) '$(srcdir)/main/submit.c'; fi` tag_task_data_deps.o: main/tag_task_data_deps.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tag_task_data_deps.o -MD -MP -MF $(DEPDIR)/tag_task_data_deps.Tpo -c -o tag_task_data_deps.o `test -f 'main/tag_task_data_deps.c' || echo '$(srcdir)/'`main/tag_task_data_deps.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tag_task_data_deps.Tpo $(DEPDIR)/tag_task_data_deps.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/tag_task_data_deps.c' object='tag_task_data_deps.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tag_task_data_deps.o `test -f 'main/tag_task_data_deps.c' || echo '$(srcdir)/'`main/tag_task_data_deps.c tag_task_data_deps.obj: main/tag_task_data_deps.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tag_task_data_deps.obj -MD -MP -MF $(DEPDIR)/tag_task_data_deps.Tpo -c -o tag_task_data_deps.obj `if test -f 'main/tag_task_data_deps.c'; then $(CYGPATH_W) 'main/tag_task_data_deps.c'; else $(CYGPATH_W) '$(srcdir)/main/tag_task_data_deps.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tag_task_data_deps.Tpo $(DEPDIR)/tag_task_data_deps.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/tag_task_data_deps.c' object='tag_task_data_deps.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tag_task_data_deps.obj `if test -f 'main/tag_task_data_deps.c'; then $(CYGPATH_W) 'main/tag_task_data_deps.c'; else $(CYGPATH_W) '$(srcdir)/main/tag_task_data_deps.c'; fi` tag_wait_api.o: main/tag_wait_api.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tag_wait_api.o -MD -MP -MF $(DEPDIR)/tag_wait_api.Tpo -c -o tag_wait_api.o `test -f 'main/tag_wait_api.c' || echo '$(srcdir)/'`main/tag_wait_api.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tag_wait_api.Tpo $(DEPDIR)/tag_wait_api.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/tag_wait_api.c' object='tag_wait_api.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tag_wait_api.o `test -f 'main/tag_wait_api.c' || echo '$(srcdir)/'`main/tag_wait_api.c tag_wait_api.obj: main/tag_wait_api.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tag_wait_api.obj -MD -MP -MF $(DEPDIR)/tag_wait_api.Tpo -c -o tag_wait_api.obj `if test -f 'main/tag_wait_api.c'; then $(CYGPATH_W) 'main/tag_wait_api.c'; else $(CYGPATH_W) '$(srcdir)/main/tag_wait_api.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tag_wait_api.Tpo $(DEPDIR)/tag_wait_api.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/tag_wait_api.c' object='tag_wait_api.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tag_wait_api.obj `if test -f 'main/tag_wait_api.c'; then $(CYGPATH_W) 'main/tag_wait_api.c'; else $(CYGPATH_W) '$(srcdir)/main/tag_wait_api.c'; fi` task_wait_api.o: main/task_wait_api.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT task_wait_api.o -MD -MP -MF $(DEPDIR)/task_wait_api.Tpo -c -o task_wait_api.o `test -f 'main/task_wait_api.c' || echo '$(srcdir)/'`main/task_wait_api.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/task_wait_api.Tpo $(DEPDIR)/task_wait_api.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/task_wait_api.c' object='task_wait_api.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o task_wait_api.o `test -f 'main/task_wait_api.c' || echo '$(srcdir)/'`main/task_wait_api.c task_wait_api.obj: main/task_wait_api.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT task_wait_api.obj -MD -MP -MF $(DEPDIR)/task_wait_api.Tpo -c -o task_wait_api.obj `if test -f 'main/task_wait_api.c'; then $(CYGPATH_W) 'main/task_wait_api.c'; else $(CYGPATH_W) '$(srcdir)/main/task_wait_api.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/task_wait_api.Tpo $(DEPDIR)/task_wait_api.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/task_wait_api.c' object='task_wait_api.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o task_wait_api.obj `if test -f 'main/task_wait_api.c'; then $(CYGPATH_W) 'main/task_wait_api.c'; else $(CYGPATH_W) '$(srcdir)/main/task_wait_api.c'; fi` wait_all_regenerable_tasks.o: main/wait_all_regenerable_tasks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wait_all_regenerable_tasks.o -MD -MP -MF $(DEPDIR)/wait_all_regenerable_tasks.Tpo -c -o wait_all_regenerable_tasks.o `test -f 'main/wait_all_regenerable_tasks.c' || echo '$(srcdir)/'`main/wait_all_regenerable_tasks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wait_all_regenerable_tasks.Tpo $(DEPDIR)/wait_all_regenerable_tasks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/wait_all_regenerable_tasks.c' object='wait_all_regenerable_tasks.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wait_all_regenerable_tasks.o `test -f 'main/wait_all_regenerable_tasks.c' || echo '$(srcdir)/'`main/wait_all_regenerable_tasks.c wait_all_regenerable_tasks.obj: main/wait_all_regenerable_tasks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wait_all_regenerable_tasks.obj -MD -MP -MF $(DEPDIR)/wait_all_regenerable_tasks.Tpo -c -o wait_all_regenerable_tasks.obj `if test -f 'main/wait_all_regenerable_tasks.c'; then $(CYGPATH_W) 'main/wait_all_regenerable_tasks.c'; else $(CYGPATH_W) '$(srcdir)/main/wait_all_regenerable_tasks.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wait_all_regenerable_tasks.Tpo $(DEPDIR)/wait_all_regenerable_tasks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/wait_all_regenerable_tasks.c' object='wait_all_regenerable_tasks.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wait_all_regenerable_tasks.obj `if test -f 'main/wait_all_regenerable_tasks.c'; then $(CYGPATH_W) 'main/wait_all_regenerable_tasks.c'; else $(CYGPATH_W) '$(srcdir)/main/wait_all_regenerable_tasks.c'; fi` async_tasks_overhead.o: microbenchs/async_tasks_overhead.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT async_tasks_overhead.o -MD -MP -MF $(DEPDIR)/async_tasks_overhead.Tpo -c -o async_tasks_overhead.o `test -f 'microbenchs/async_tasks_overhead.c' || echo '$(srcdir)/'`microbenchs/async_tasks_overhead.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/async_tasks_overhead.Tpo $(DEPDIR)/async_tasks_overhead.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/async_tasks_overhead.c' object='async_tasks_overhead.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o async_tasks_overhead.o `test -f 'microbenchs/async_tasks_overhead.c' || echo '$(srcdir)/'`microbenchs/async_tasks_overhead.c async_tasks_overhead.obj: microbenchs/async_tasks_overhead.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT async_tasks_overhead.obj -MD -MP -MF $(DEPDIR)/async_tasks_overhead.Tpo -c -o async_tasks_overhead.obj `if test -f 'microbenchs/async_tasks_overhead.c'; then $(CYGPATH_W) 'microbenchs/async_tasks_overhead.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/async_tasks_overhead.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/async_tasks_overhead.Tpo $(DEPDIR)/async_tasks_overhead.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/async_tasks_overhead.c' object='async_tasks_overhead.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o async_tasks_overhead.obj `if test -f 'microbenchs/async_tasks_overhead.c'; then $(CYGPATH_W) 'microbenchs/async_tasks_overhead.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/async_tasks_overhead.c'; fi` display_structures_size.o: microbenchs/display_structures_size.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT display_structures_size.o -MD -MP -MF $(DEPDIR)/display_structures_size.Tpo -c -o display_structures_size.o `test -f 'microbenchs/display_structures_size.c' || echo '$(srcdir)/'`microbenchs/display_structures_size.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/display_structures_size.Tpo $(DEPDIR)/display_structures_size.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/display_structures_size.c' object='display_structures_size.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o display_structures_size.o `test -f 'microbenchs/display_structures_size.c' || echo '$(srcdir)/'`microbenchs/display_structures_size.c display_structures_size.obj: microbenchs/display_structures_size.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT display_structures_size.obj -MD -MP -MF $(DEPDIR)/display_structures_size.Tpo -c -o display_structures_size.obj `if test -f 'microbenchs/display_structures_size.c'; then $(CYGPATH_W) 'microbenchs/display_structures_size.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/display_structures_size.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/display_structures_size.Tpo $(DEPDIR)/display_structures_size.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/display_structures_size.c' object='display_structures_size.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o display_structures_size.obj `if test -f 'microbenchs/display_structures_size.c'; then $(CYGPATH_W) 'microbenchs/display_structures_size.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/display_structures_size.c'; fi` local_pingpong.o: microbenchs/local_pingpong.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT local_pingpong.o -MD -MP -MF $(DEPDIR)/local_pingpong.Tpo -c -o local_pingpong.o `test -f 'microbenchs/local_pingpong.c' || echo '$(srcdir)/'`microbenchs/local_pingpong.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/local_pingpong.Tpo $(DEPDIR)/local_pingpong.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/local_pingpong.c' object='local_pingpong.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o local_pingpong.o `test -f 'microbenchs/local_pingpong.c' || echo '$(srcdir)/'`microbenchs/local_pingpong.c local_pingpong.obj: microbenchs/local_pingpong.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT local_pingpong.obj -MD -MP -MF $(DEPDIR)/local_pingpong.Tpo -c -o local_pingpong.obj `if test -f 'microbenchs/local_pingpong.c'; then $(CYGPATH_W) 'microbenchs/local_pingpong.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/local_pingpong.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/local_pingpong.Tpo $(DEPDIR)/local_pingpong.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/local_pingpong.c' object='local_pingpong.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o local_pingpong.obj `if test -f 'microbenchs/local_pingpong.c'; then $(CYGPATH_W) 'microbenchs/local_pingpong.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/local_pingpong.c'; fi` matrix_as_vector.o: microbenchs/matrix_as_vector.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matrix_as_vector.o -MD -MP -MF $(DEPDIR)/matrix_as_vector.Tpo -c -o matrix_as_vector.o `test -f 'microbenchs/matrix_as_vector.c' || echo '$(srcdir)/'`microbenchs/matrix_as_vector.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matrix_as_vector.Tpo $(DEPDIR)/matrix_as_vector.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/matrix_as_vector.c' object='matrix_as_vector.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o matrix_as_vector.o `test -f 'microbenchs/matrix_as_vector.c' || echo '$(srcdir)/'`microbenchs/matrix_as_vector.c matrix_as_vector.obj: microbenchs/matrix_as_vector.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matrix_as_vector.obj -MD -MP -MF $(DEPDIR)/matrix_as_vector.Tpo -c -o matrix_as_vector.obj `if test -f 'microbenchs/matrix_as_vector.c'; then $(CYGPATH_W) 'microbenchs/matrix_as_vector.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/matrix_as_vector.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matrix_as_vector.Tpo $(DEPDIR)/matrix_as_vector.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/matrix_as_vector.c' object='matrix_as_vector.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o matrix_as_vector.obj `if test -f 'microbenchs/matrix_as_vector.c'; then $(CYGPATH_W) 'microbenchs/matrix_as_vector.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/matrix_as_vector.c'; fi` prefetch_data_on_node.o: microbenchs/prefetch_data_on_node.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prefetch_data_on_node.o -MD -MP -MF $(DEPDIR)/prefetch_data_on_node.Tpo -c -o prefetch_data_on_node.o `test -f 'microbenchs/prefetch_data_on_node.c' || echo '$(srcdir)/'`microbenchs/prefetch_data_on_node.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/prefetch_data_on_node.Tpo $(DEPDIR)/prefetch_data_on_node.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/prefetch_data_on_node.c' object='prefetch_data_on_node.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prefetch_data_on_node.o `test -f 'microbenchs/prefetch_data_on_node.c' || echo '$(srcdir)/'`microbenchs/prefetch_data_on_node.c prefetch_data_on_node.obj: microbenchs/prefetch_data_on_node.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prefetch_data_on_node.obj -MD -MP -MF $(DEPDIR)/prefetch_data_on_node.Tpo -c -o prefetch_data_on_node.obj `if test -f 'microbenchs/prefetch_data_on_node.c'; then $(CYGPATH_W) 'microbenchs/prefetch_data_on_node.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/prefetch_data_on_node.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/prefetch_data_on_node.Tpo $(DEPDIR)/prefetch_data_on_node.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/prefetch_data_on_node.c' object='prefetch_data_on_node.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prefetch_data_on_node.obj `if test -f 'microbenchs/prefetch_data_on_node.c'; then $(CYGPATH_W) 'microbenchs/prefetch_data_on_node.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/prefetch_data_on_node.c'; fi` redundant_buffer.o: microbenchs/redundant_buffer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT redundant_buffer.o -MD -MP -MF $(DEPDIR)/redundant_buffer.Tpo -c -o redundant_buffer.o `test -f 'microbenchs/redundant_buffer.c' || echo '$(srcdir)/'`microbenchs/redundant_buffer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/redundant_buffer.Tpo $(DEPDIR)/redundant_buffer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/redundant_buffer.c' object='redundant_buffer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o redundant_buffer.o `test -f 'microbenchs/redundant_buffer.c' || echo '$(srcdir)/'`microbenchs/redundant_buffer.c redundant_buffer.obj: microbenchs/redundant_buffer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT redundant_buffer.obj -MD -MP -MF $(DEPDIR)/redundant_buffer.Tpo -c -o redundant_buffer.obj `if test -f 'microbenchs/redundant_buffer.c'; then $(CYGPATH_W) 'microbenchs/redundant_buffer.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/redundant_buffer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/redundant_buffer.Tpo $(DEPDIR)/redundant_buffer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/redundant_buffer.c' object='redundant_buffer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o redundant_buffer.obj `if test -f 'microbenchs/redundant_buffer.c'; then $(CYGPATH_W) 'microbenchs/redundant_buffer.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/redundant_buffer.c'; fi` sync_tasks_overhead.o: microbenchs/sync_tasks_overhead.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sync_tasks_overhead.o -MD -MP -MF $(DEPDIR)/sync_tasks_overhead.Tpo -c -o sync_tasks_overhead.o `test -f 'microbenchs/sync_tasks_overhead.c' || echo '$(srcdir)/'`microbenchs/sync_tasks_overhead.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sync_tasks_overhead.Tpo $(DEPDIR)/sync_tasks_overhead.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/sync_tasks_overhead.c' object='sync_tasks_overhead.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sync_tasks_overhead.o `test -f 'microbenchs/sync_tasks_overhead.c' || echo '$(srcdir)/'`microbenchs/sync_tasks_overhead.c sync_tasks_overhead.obj: microbenchs/sync_tasks_overhead.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sync_tasks_overhead.obj -MD -MP -MF $(DEPDIR)/sync_tasks_overhead.Tpo -c -o sync_tasks_overhead.obj `if test -f 'microbenchs/sync_tasks_overhead.c'; then $(CYGPATH_W) 'microbenchs/sync_tasks_overhead.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/sync_tasks_overhead.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sync_tasks_overhead.Tpo $(DEPDIR)/sync_tasks_overhead.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/sync_tasks_overhead.c' object='sync_tasks_overhead.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sync_tasks_overhead.obj `if test -f 'microbenchs/sync_tasks_overhead.c'; then $(CYGPATH_W) 'microbenchs/sync_tasks_overhead.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/sync_tasks_overhead.c'; fi` tasks_overhead.o: microbenchs/tasks_overhead.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tasks_overhead.o -MD -MP -MF $(DEPDIR)/tasks_overhead.Tpo -c -o tasks_overhead.o `test -f 'microbenchs/tasks_overhead.c' || echo '$(srcdir)/'`microbenchs/tasks_overhead.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tasks_overhead.Tpo $(DEPDIR)/tasks_overhead.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/tasks_overhead.c' object='tasks_overhead.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tasks_overhead.o `test -f 'microbenchs/tasks_overhead.c' || echo '$(srcdir)/'`microbenchs/tasks_overhead.c tasks_overhead.obj: microbenchs/tasks_overhead.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tasks_overhead.obj -MD -MP -MF $(DEPDIR)/tasks_overhead.Tpo -c -o tasks_overhead.obj `if test -f 'microbenchs/tasks_overhead.c'; then $(CYGPATH_W) 'microbenchs/tasks_overhead.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/tasks_overhead.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tasks_overhead.Tpo $(DEPDIR)/tasks_overhead.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/tasks_overhead.c' object='tasks_overhead.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tasks_overhead.obj `if test -f 'microbenchs/tasks_overhead.c'; then $(CYGPATH_W) 'microbenchs/tasks_overhead.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/tasks_overhead.c'; fi` tasks_size_overhead.o: microbenchs/tasks_size_overhead.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tasks_size_overhead.o -MD -MP -MF $(DEPDIR)/tasks_size_overhead.Tpo -c -o tasks_size_overhead.o `test -f 'microbenchs/tasks_size_overhead.c' || echo '$(srcdir)/'`microbenchs/tasks_size_overhead.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tasks_size_overhead.Tpo $(DEPDIR)/tasks_size_overhead.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/tasks_size_overhead.c' object='tasks_size_overhead.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tasks_size_overhead.o `test -f 'microbenchs/tasks_size_overhead.c' || echo '$(srcdir)/'`microbenchs/tasks_size_overhead.c tasks_size_overhead.obj: microbenchs/tasks_size_overhead.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tasks_size_overhead.obj -MD -MP -MF $(DEPDIR)/tasks_size_overhead.Tpo -c -o tasks_size_overhead.obj `if test -f 'microbenchs/tasks_size_overhead.c'; then $(CYGPATH_W) 'microbenchs/tasks_size_overhead.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/tasks_size_overhead.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tasks_size_overhead.Tpo $(DEPDIR)/tasks_size_overhead.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/tasks_size_overhead.c' object='tasks_size_overhead.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tasks_size_overhead.obj `if test -f 'microbenchs/tasks_size_overhead.c'; then $(CYGPATH_W) 'microbenchs/tasks_size_overhead.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/tasks_size_overhead.c'; fi` api_01.o: openmp/api_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT api_01.o -MD -MP -MF $(DEPDIR)/api_01.Tpo -c -o api_01.o `test -f 'openmp/api_01.c' || echo '$(srcdir)/'`openmp/api_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/api_01.Tpo $(DEPDIR)/api_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/api_01.c' object='api_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o api_01.o `test -f 'openmp/api_01.c' || echo '$(srcdir)/'`openmp/api_01.c api_01.obj: openmp/api_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT api_01.obj -MD -MP -MF $(DEPDIR)/api_01.Tpo -c -o api_01.obj `if test -f 'openmp/api_01.c'; then $(CYGPATH_W) 'openmp/api_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/api_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/api_01.Tpo $(DEPDIR)/api_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/api_01.c' object='api_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o api_01.obj `if test -f 'openmp/api_01.c'; then $(CYGPATH_W) 'openmp/api_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/api_01.c'; fi` array_slice_01.o: openmp/array_slice_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT array_slice_01.o -MD -MP -MF $(DEPDIR)/array_slice_01.Tpo -c -o array_slice_01.o `test -f 'openmp/array_slice_01.c' || echo '$(srcdir)/'`openmp/array_slice_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/array_slice_01.Tpo $(DEPDIR)/array_slice_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/array_slice_01.c' object='array_slice_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o array_slice_01.o `test -f 'openmp/array_slice_01.c' || echo '$(srcdir)/'`openmp/array_slice_01.c array_slice_01.obj: openmp/array_slice_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT array_slice_01.obj -MD -MP -MF $(DEPDIR)/array_slice_01.Tpo -c -o array_slice_01.obj `if test -f 'openmp/array_slice_01.c'; then $(CYGPATH_W) 'openmp/array_slice_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/array_slice_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/array_slice_01.Tpo $(DEPDIR)/array_slice_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/array_slice_01.c' object='array_slice_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o array_slice_01.obj `if test -f 'openmp/array_slice_01.c'; then $(CYGPATH_W) 'openmp/array_slice_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/array_slice_01.c'; fi` cuda_task_01.o: openmp/cuda_task_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cuda_task_01.o -MD -MP -MF $(DEPDIR)/cuda_task_01.Tpo -c -o cuda_task_01.o `test -f 'openmp/cuda_task_01.c' || echo '$(srcdir)/'`openmp/cuda_task_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cuda_task_01.Tpo $(DEPDIR)/cuda_task_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/cuda_task_01.c' object='cuda_task_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cuda_task_01.o `test -f 'openmp/cuda_task_01.c' || echo '$(srcdir)/'`openmp/cuda_task_01.c cuda_task_01.obj: openmp/cuda_task_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cuda_task_01.obj -MD -MP -MF $(DEPDIR)/cuda_task_01.Tpo -c -o cuda_task_01.obj `if test -f 'openmp/cuda_task_01.c'; then $(CYGPATH_W) 'openmp/cuda_task_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/cuda_task_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cuda_task_01.Tpo $(DEPDIR)/cuda_task_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/cuda_task_01.c' object='cuda_task_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cuda_task_01.obj `if test -f 'openmp/cuda_task_01.c'; then $(CYGPATH_W) 'openmp/cuda_task_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/cuda_task_01.c'; fi` environment.o: openmp/environment.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT environment.o -MD -MP -MF $(DEPDIR)/environment.Tpo -c -o environment.o `test -f 'openmp/environment.c' || echo '$(srcdir)/'`openmp/environment.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/environment.Tpo $(DEPDIR)/environment.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/environment.c' object='environment.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o environment.o `test -f 'openmp/environment.c' || echo '$(srcdir)/'`openmp/environment.c environment.obj: openmp/environment.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT environment.obj -MD -MP -MF $(DEPDIR)/environment.Tpo -c -o environment.obj `if test -f 'openmp/environment.c'; then $(CYGPATH_W) 'openmp/environment.c'; else $(CYGPATH_W) '$(srcdir)/openmp/environment.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/environment.Tpo $(DEPDIR)/environment.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/environment.c' object='environment.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o environment.obj `if test -f 'openmp/environment.c'; then $(CYGPATH_W) 'openmp/environment.c'; else $(CYGPATH_W) '$(srcdir)/openmp/environment.c'; fi` init_exit_01.o: openmp/init_exit_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT init_exit_01.o -MD -MP -MF $(DEPDIR)/init_exit_01.Tpo -c -o init_exit_01.o `test -f 'openmp/init_exit_01.c' || echo '$(srcdir)/'`openmp/init_exit_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/init_exit_01.Tpo $(DEPDIR)/init_exit_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/init_exit_01.c' object='init_exit_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o init_exit_01.o `test -f 'openmp/init_exit_01.c' || echo '$(srcdir)/'`openmp/init_exit_01.c init_exit_01.obj: openmp/init_exit_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT init_exit_01.obj -MD -MP -MF $(DEPDIR)/init_exit_01.Tpo -c -o init_exit_01.obj `if test -f 'openmp/init_exit_01.c'; then $(CYGPATH_W) 'openmp/init_exit_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/init_exit_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/init_exit_01.Tpo $(DEPDIR)/init_exit_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/init_exit_01.c' object='init_exit_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o init_exit_01.obj `if test -f 'openmp/init_exit_01.c'; then $(CYGPATH_W) 'openmp/init_exit_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/init_exit_01.c'; fi` init_exit_02.o: openmp/init_exit_02.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT init_exit_02.o -MD -MP -MF $(DEPDIR)/init_exit_02.Tpo -c -o init_exit_02.o `test -f 'openmp/init_exit_02.c' || echo '$(srcdir)/'`openmp/init_exit_02.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/init_exit_02.Tpo $(DEPDIR)/init_exit_02.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/init_exit_02.c' object='init_exit_02.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o init_exit_02.o `test -f 'openmp/init_exit_02.c' || echo '$(srcdir)/'`openmp/init_exit_02.c init_exit_02.obj: openmp/init_exit_02.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT init_exit_02.obj -MD -MP -MF $(DEPDIR)/init_exit_02.Tpo -c -o init_exit_02.obj `if test -f 'openmp/init_exit_02.c'; then $(CYGPATH_W) 'openmp/init_exit_02.c'; else $(CYGPATH_W) '$(srcdir)/openmp/init_exit_02.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/init_exit_02.Tpo $(DEPDIR)/init_exit_02.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/init_exit_02.c' object='init_exit_02.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o init_exit_02.obj `if test -f 'openmp/init_exit_02.c'; then $(CYGPATH_W) 'openmp/init_exit_02.c'; else $(CYGPATH_W) '$(srcdir)/openmp/init_exit_02.c'; fi` parallel_01.o: openmp/parallel_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_01.o -MD -MP -MF $(DEPDIR)/parallel_01.Tpo -c -o parallel_01.o `test -f 'openmp/parallel_01.c' || echo '$(srcdir)/'`openmp/parallel_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_01.Tpo $(DEPDIR)/parallel_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_01.c' object='parallel_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_01.o `test -f 'openmp/parallel_01.c' || echo '$(srcdir)/'`openmp/parallel_01.c parallel_01.obj: openmp/parallel_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_01.obj -MD -MP -MF $(DEPDIR)/parallel_01.Tpo -c -o parallel_01.obj `if test -f 'openmp/parallel_01.c'; then $(CYGPATH_W) 'openmp/parallel_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_01.Tpo $(DEPDIR)/parallel_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_01.c' object='parallel_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_01.obj `if test -f 'openmp/parallel_01.c'; then $(CYGPATH_W) 'openmp/parallel_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_01.c'; fi` parallel_02.o: openmp/parallel_02.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_02.o -MD -MP -MF $(DEPDIR)/parallel_02.Tpo -c -o parallel_02.o `test -f 'openmp/parallel_02.c' || echo '$(srcdir)/'`openmp/parallel_02.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_02.Tpo $(DEPDIR)/parallel_02.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_02.c' object='parallel_02.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_02.o `test -f 'openmp/parallel_02.c' || echo '$(srcdir)/'`openmp/parallel_02.c parallel_02.obj: openmp/parallel_02.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_02.obj -MD -MP -MF $(DEPDIR)/parallel_02.Tpo -c -o parallel_02.obj `if test -f 'openmp/parallel_02.c'; then $(CYGPATH_W) 'openmp/parallel_02.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_02.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_02.Tpo $(DEPDIR)/parallel_02.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_02.c' object='parallel_02.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_02.obj `if test -f 'openmp/parallel_02.c'; then $(CYGPATH_W) 'openmp/parallel_02.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_02.c'; fi` parallel_03.o: openmp/parallel_03.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_03.o -MD -MP -MF $(DEPDIR)/parallel_03.Tpo -c -o parallel_03.o `test -f 'openmp/parallel_03.c' || echo '$(srcdir)/'`openmp/parallel_03.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_03.Tpo $(DEPDIR)/parallel_03.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_03.c' object='parallel_03.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_03.o `test -f 'openmp/parallel_03.c' || echo '$(srcdir)/'`openmp/parallel_03.c parallel_03.obj: openmp/parallel_03.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_03.obj -MD -MP -MF $(DEPDIR)/parallel_03.Tpo -c -o parallel_03.obj `if test -f 'openmp/parallel_03.c'; then $(CYGPATH_W) 'openmp/parallel_03.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_03.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_03.Tpo $(DEPDIR)/parallel_03.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_03.c' object='parallel_03.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_03.obj `if test -f 'openmp/parallel_03.c'; then $(CYGPATH_W) 'openmp/parallel_03.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_03.c'; fi` parallel_barrier_01.o: openmp/parallel_barrier_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_barrier_01.o -MD -MP -MF $(DEPDIR)/parallel_barrier_01.Tpo -c -o parallel_barrier_01.o `test -f 'openmp/parallel_barrier_01.c' || echo '$(srcdir)/'`openmp/parallel_barrier_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_barrier_01.Tpo $(DEPDIR)/parallel_barrier_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_barrier_01.c' object='parallel_barrier_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_barrier_01.o `test -f 'openmp/parallel_barrier_01.c' || echo '$(srcdir)/'`openmp/parallel_barrier_01.c parallel_barrier_01.obj: openmp/parallel_barrier_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_barrier_01.obj -MD -MP -MF $(DEPDIR)/parallel_barrier_01.Tpo -c -o parallel_barrier_01.obj `if test -f 'openmp/parallel_barrier_01.c'; then $(CYGPATH_W) 'openmp/parallel_barrier_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_barrier_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_barrier_01.Tpo $(DEPDIR)/parallel_barrier_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_barrier_01.c' object='parallel_barrier_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_barrier_01.obj `if test -f 'openmp/parallel_barrier_01.c'; then $(CYGPATH_W) 'openmp/parallel_barrier_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_barrier_01.c'; fi` parallel_critical_01.o: openmp/parallel_critical_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_critical_01.o -MD -MP -MF $(DEPDIR)/parallel_critical_01.Tpo -c -o parallel_critical_01.o `test -f 'openmp/parallel_critical_01.c' || echo '$(srcdir)/'`openmp/parallel_critical_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_critical_01.Tpo $(DEPDIR)/parallel_critical_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_critical_01.c' object='parallel_critical_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_critical_01.o `test -f 'openmp/parallel_critical_01.c' || echo '$(srcdir)/'`openmp/parallel_critical_01.c parallel_critical_01.obj: openmp/parallel_critical_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_critical_01.obj -MD -MP -MF $(DEPDIR)/parallel_critical_01.Tpo -c -o parallel_critical_01.obj `if test -f 'openmp/parallel_critical_01.c'; then $(CYGPATH_W) 'openmp/parallel_critical_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_critical_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_critical_01.Tpo $(DEPDIR)/parallel_critical_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_critical_01.c' object='parallel_critical_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_critical_01.obj `if test -f 'openmp/parallel_critical_01.c'; then $(CYGPATH_W) 'openmp/parallel_critical_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_critical_01.c'; fi` parallel_critical_inline_01.o: openmp/parallel_critical_inline_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_critical_inline_01.o -MD -MP -MF $(DEPDIR)/parallel_critical_inline_01.Tpo -c -o parallel_critical_inline_01.o `test -f 'openmp/parallel_critical_inline_01.c' || echo '$(srcdir)/'`openmp/parallel_critical_inline_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_critical_inline_01.Tpo $(DEPDIR)/parallel_critical_inline_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_critical_inline_01.c' object='parallel_critical_inline_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_critical_inline_01.o `test -f 'openmp/parallel_critical_inline_01.c' || echo '$(srcdir)/'`openmp/parallel_critical_inline_01.c parallel_critical_inline_01.obj: openmp/parallel_critical_inline_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_critical_inline_01.obj -MD -MP -MF $(DEPDIR)/parallel_critical_inline_01.Tpo -c -o parallel_critical_inline_01.obj `if test -f 'openmp/parallel_critical_inline_01.c'; then $(CYGPATH_W) 'openmp/parallel_critical_inline_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_critical_inline_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_critical_inline_01.Tpo $(DEPDIR)/parallel_critical_inline_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_critical_inline_01.c' object='parallel_critical_inline_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_critical_inline_01.obj `if test -f 'openmp/parallel_critical_inline_01.c'; then $(CYGPATH_W) 'openmp/parallel_critical_inline_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_critical_inline_01.c'; fi` parallel_critical_named_01.o: openmp/parallel_critical_named_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_critical_named_01.o -MD -MP -MF $(DEPDIR)/parallel_critical_named_01.Tpo -c -o parallel_critical_named_01.o `test -f 'openmp/parallel_critical_named_01.c' || echo '$(srcdir)/'`openmp/parallel_critical_named_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_critical_named_01.Tpo $(DEPDIR)/parallel_critical_named_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_critical_named_01.c' object='parallel_critical_named_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_critical_named_01.o `test -f 'openmp/parallel_critical_named_01.c' || echo '$(srcdir)/'`openmp/parallel_critical_named_01.c parallel_critical_named_01.obj: openmp/parallel_critical_named_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_critical_named_01.obj -MD -MP -MF $(DEPDIR)/parallel_critical_named_01.Tpo -c -o parallel_critical_named_01.obj `if test -f 'openmp/parallel_critical_named_01.c'; then $(CYGPATH_W) 'openmp/parallel_critical_named_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_critical_named_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_critical_named_01.Tpo $(DEPDIR)/parallel_critical_named_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_critical_named_01.c' object='parallel_critical_named_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_critical_named_01.obj `if test -f 'openmp/parallel_critical_named_01.c'; then $(CYGPATH_W) 'openmp/parallel_critical_named_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_critical_named_01.c'; fi` parallel_critical_named_inline_01.o: openmp/parallel_critical_named_inline_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_critical_named_inline_01.o -MD -MP -MF $(DEPDIR)/parallel_critical_named_inline_01.Tpo -c -o parallel_critical_named_inline_01.o `test -f 'openmp/parallel_critical_named_inline_01.c' || echo '$(srcdir)/'`openmp/parallel_critical_named_inline_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_critical_named_inline_01.Tpo $(DEPDIR)/parallel_critical_named_inline_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_critical_named_inline_01.c' object='parallel_critical_named_inline_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_critical_named_inline_01.o `test -f 'openmp/parallel_critical_named_inline_01.c' || echo '$(srcdir)/'`openmp/parallel_critical_named_inline_01.c parallel_critical_named_inline_01.obj: openmp/parallel_critical_named_inline_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_critical_named_inline_01.obj -MD -MP -MF $(DEPDIR)/parallel_critical_named_inline_01.Tpo -c -o parallel_critical_named_inline_01.obj `if test -f 'openmp/parallel_critical_named_inline_01.c'; then $(CYGPATH_W) 'openmp/parallel_critical_named_inline_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_critical_named_inline_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_critical_named_inline_01.Tpo $(DEPDIR)/parallel_critical_named_inline_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_critical_named_inline_01.c' object='parallel_critical_named_inline_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_critical_named_inline_01.obj `if test -f 'openmp/parallel_critical_named_inline_01.c'; then $(CYGPATH_W) 'openmp/parallel_critical_named_inline_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_critical_named_inline_01.c'; fi` parallel_for_01.o: openmp/parallel_for_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_for_01.o -MD -MP -MF $(DEPDIR)/parallel_for_01.Tpo -c -o parallel_for_01.o `test -f 'openmp/parallel_for_01.c' || echo '$(srcdir)/'`openmp/parallel_for_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_for_01.Tpo $(DEPDIR)/parallel_for_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_for_01.c' object='parallel_for_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_for_01.o `test -f 'openmp/parallel_for_01.c' || echo '$(srcdir)/'`openmp/parallel_for_01.c parallel_for_01.obj: openmp/parallel_for_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_for_01.obj -MD -MP -MF $(DEPDIR)/parallel_for_01.Tpo -c -o parallel_for_01.obj `if test -f 'openmp/parallel_for_01.c'; then $(CYGPATH_W) 'openmp/parallel_for_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_for_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_for_01.Tpo $(DEPDIR)/parallel_for_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_for_01.c' object='parallel_for_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_for_01.obj `if test -f 'openmp/parallel_for_01.c'; then $(CYGPATH_W) 'openmp/parallel_for_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_for_01.c'; fi` parallel_for_02.o: openmp/parallel_for_02.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_for_02.o -MD -MP -MF $(DEPDIR)/parallel_for_02.Tpo -c -o parallel_for_02.o `test -f 'openmp/parallel_for_02.c' || echo '$(srcdir)/'`openmp/parallel_for_02.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_for_02.Tpo $(DEPDIR)/parallel_for_02.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_for_02.c' object='parallel_for_02.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_for_02.o `test -f 'openmp/parallel_for_02.c' || echo '$(srcdir)/'`openmp/parallel_for_02.c parallel_for_02.obj: openmp/parallel_for_02.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_for_02.obj -MD -MP -MF $(DEPDIR)/parallel_for_02.Tpo -c -o parallel_for_02.obj `if test -f 'openmp/parallel_for_02.c'; then $(CYGPATH_W) 'openmp/parallel_for_02.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_for_02.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_for_02.Tpo $(DEPDIR)/parallel_for_02.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_for_02.c' object='parallel_for_02.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_for_02.obj `if test -f 'openmp/parallel_for_02.c'; then $(CYGPATH_W) 'openmp/parallel_for_02.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_for_02.c'; fi` parallel_for_ordered_01.o: openmp/parallel_for_ordered_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_for_ordered_01.o -MD -MP -MF $(DEPDIR)/parallel_for_ordered_01.Tpo -c -o parallel_for_ordered_01.o `test -f 'openmp/parallel_for_ordered_01.c' || echo '$(srcdir)/'`openmp/parallel_for_ordered_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_for_ordered_01.Tpo $(DEPDIR)/parallel_for_ordered_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_for_ordered_01.c' object='parallel_for_ordered_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_for_ordered_01.o `test -f 'openmp/parallel_for_ordered_01.c' || echo '$(srcdir)/'`openmp/parallel_for_ordered_01.c parallel_for_ordered_01.obj: openmp/parallel_for_ordered_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_for_ordered_01.obj -MD -MP -MF $(DEPDIR)/parallel_for_ordered_01.Tpo -c -o parallel_for_ordered_01.obj `if test -f 'openmp/parallel_for_ordered_01.c'; then $(CYGPATH_W) 'openmp/parallel_for_ordered_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_for_ordered_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_for_ordered_01.Tpo $(DEPDIR)/parallel_for_ordered_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_for_ordered_01.c' object='parallel_for_ordered_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_for_ordered_01.obj `if test -f 'openmp/parallel_for_ordered_01.c'; then $(CYGPATH_W) 'openmp/parallel_for_ordered_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_for_ordered_01.c'; fi` parallel_master_01.o: openmp/parallel_master_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_master_01.o -MD -MP -MF $(DEPDIR)/parallel_master_01.Tpo -c -o parallel_master_01.o `test -f 'openmp/parallel_master_01.c' || echo '$(srcdir)/'`openmp/parallel_master_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_master_01.Tpo $(DEPDIR)/parallel_master_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_master_01.c' object='parallel_master_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_master_01.o `test -f 'openmp/parallel_master_01.c' || echo '$(srcdir)/'`openmp/parallel_master_01.c parallel_master_01.obj: openmp/parallel_master_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_master_01.obj -MD -MP -MF $(DEPDIR)/parallel_master_01.Tpo -c -o parallel_master_01.obj `if test -f 'openmp/parallel_master_01.c'; then $(CYGPATH_W) 'openmp/parallel_master_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_master_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_master_01.Tpo $(DEPDIR)/parallel_master_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_master_01.c' object='parallel_master_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_master_01.obj `if test -f 'openmp/parallel_master_01.c'; then $(CYGPATH_W) 'openmp/parallel_master_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_master_01.c'; fi` parallel_master_inline_01.o: openmp/parallel_master_inline_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_master_inline_01.o -MD -MP -MF $(DEPDIR)/parallel_master_inline_01.Tpo -c -o parallel_master_inline_01.o `test -f 'openmp/parallel_master_inline_01.c' || echo '$(srcdir)/'`openmp/parallel_master_inline_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_master_inline_01.Tpo $(DEPDIR)/parallel_master_inline_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_master_inline_01.c' object='parallel_master_inline_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_master_inline_01.o `test -f 'openmp/parallel_master_inline_01.c' || echo '$(srcdir)/'`openmp/parallel_master_inline_01.c parallel_master_inline_01.obj: openmp/parallel_master_inline_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_master_inline_01.obj -MD -MP -MF $(DEPDIR)/parallel_master_inline_01.Tpo -c -o parallel_master_inline_01.obj `if test -f 'openmp/parallel_master_inline_01.c'; then $(CYGPATH_W) 'openmp/parallel_master_inline_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_master_inline_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_master_inline_01.Tpo $(DEPDIR)/parallel_master_inline_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_master_inline_01.c' object='parallel_master_inline_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_master_inline_01.obj `if test -f 'openmp/parallel_master_inline_01.c'; then $(CYGPATH_W) 'openmp/parallel_master_inline_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_master_inline_01.c'; fi` parallel_nested_lock_01.o: openmp/parallel_nested_lock_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_nested_lock_01.o -MD -MP -MF $(DEPDIR)/parallel_nested_lock_01.Tpo -c -o parallel_nested_lock_01.o `test -f 'openmp/parallel_nested_lock_01.c' || echo '$(srcdir)/'`openmp/parallel_nested_lock_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_nested_lock_01.Tpo $(DEPDIR)/parallel_nested_lock_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_nested_lock_01.c' object='parallel_nested_lock_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_nested_lock_01.o `test -f 'openmp/parallel_nested_lock_01.c' || echo '$(srcdir)/'`openmp/parallel_nested_lock_01.c parallel_nested_lock_01.obj: openmp/parallel_nested_lock_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_nested_lock_01.obj -MD -MP -MF $(DEPDIR)/parallel_nested_lock_01.Tpo -c -o parallel_nested_lock_01.obj `if test -f 'openmp/parallel_nested_lock_01.c'; then $(CYGPATH_W) 'openmp/parallel_nested_lock_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_nested_lock_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_nested_lock_01.Tpo $(DEPDIR)/parallel_nested_lock_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_nested_lock_01.c' object='parallel_nested_lock_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_nested_lock_01.obj `if test -f 'openmp/parallel_nested_lock_01.c'; then $(CYGPATH_W) 'openmp/parallel_nested_lock_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_nested_lock_01.c'; fi` parallel_sections_01.o: openmp/parallel_sections_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_sections_01.o -MD -MP -MF $(DEPDIR)/parallel_sections_01.Tpo -c -o parallel_sections_01.o `test -f 'openmp/parallel_sections_01.c' || echo '$(srcdir)/'`openmp/parallel_sections_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_sections_01.Tpo $(DEPDIR)/parallel_sections_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_sections_01.c' object='parallel_sections_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_sections_01.o `test -f 'openmp/parallel_sections_01.c' || echo '$(srcdir)/'`openmp/parallel_sections_01.c parallel_sections_01.obj: openmp/parallel_sections_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_sections_01.obj -MD -MP -MF $(DEPDIR)/parallel_sections_01.Tpo -c -o parallel_sections_01.obj `if test -f 'openmp/parallel_sections_01.c'; then $(CYGPATH_W) 'openmp/parallel_sections_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_sections_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_sections_01.Tpo $(DEPDIR)/parallel_sections_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_sections_01.c' object='parallel_sections_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_sections_01.obj `if test -f 'openmp/parallel_sections_01.c'; then $(CYGPATH_W) 'openmp/parallel_sections_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_sections_01.c'; fi` parallel_sections_combined_01.o: openmp/parallel_sections_combined_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_sections_combined_01.o -MD -MP -MF $(DEPDIR)/parallel_sections_combined_01.Tpo -c -o parallel_sections_combined_01.o `test -f 'openmp/parallel_sections_combined_01.c' || echo '$(srcdir)/'`openmp/parallel_sections_combined_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_sections_combined_01.Tpo $(DEPDIR)/parallel_sections_combined_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_sections_combined_01.c' object='parallel_sections_combined_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_sections_combined_01.o `test -f 'openmp/parallel_sections_combined_01.c' || echo '$(srcdir)/'`openmp/parallel_sections_combined_01.c parallel_sections_combined_01.obj: openmp/parallel_sections_combined_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_sections_combined_01.obj -MD -MP -MF $(DEPDIR)/parallel_sections_combined_01.Tpo -c -o parallel_sections_combined_01.obj `if test -f 'openmp/parallel_sections_combined_01.c'; then $(CYGPATH_W) 'openmp/parallel_sections_combined_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_sections_combined_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_sections_combined_01.Tpo $(DEPDIR)/parallel_sections_combined_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_sections_combined_01.c' object='parallel_sections_combined_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_sections_combined_01.obj `if test -f 'openmp/parallel_sections_combined_01.c'; then $(CYGPATH_W) 'openmp/parallel_sections_combined_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_sections_combined_01.c'; fi` parallel_simple_lock_01.o: openmp/parallel_simple_lock_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_simple_lock_01.o -MD -MP -MF $(DEPDIR)/parallel_simple_lock_01.Tpo -c -o parallel_simple_lock_01.o `test -f 'openmp/parallel_simple_lock_01.c' || echo '$(srcdir)/'`openmp/parallel_simple_lock_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_simple_lock_01.Tpo $(DEPDIR)/parallel_simple_lock_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_simple_lock_01.c' object='parallel_simple_lock_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_simple_lock_01.o `test -f 'openmp/parallel_simple_lock_01.c' || echo '$(srcdir)/'`openmp/parallel_simple_lock_01.c parallel_simple_lock_01.obj: openmp/parallel_simple_lock_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_simple_lock_01.obj -MD -MP -MF $(DEPDIR)/parallel_simple_lock_01.Tpo -c -o parallel_simple_lock_01.obj `if test -f 'openmp/parallel_simple_lock_01.c'; then $(CYGPATH_W) 'openmp/parallel_simple_lock_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_simple_lock_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_simple_lock_01.Tpo $(DEPDIR)/parallel_simple_lock_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_simple_lock_01.c' object='parallel_simple_lock_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_simple_lock_01.obj `if test -f 'openmp/parallel_simple_lock_01.c'; then $(CYGPATH_W) 'openmp/parallel_simple_lock_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_simple_lock_01.c'; fi` parallel_single_copyprivate_01.o: openmp/parallel_single_copyprivate_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_single_copyprivate_01.o -MD -MP -MF $(DEPDIR)/parallel_single_copyprivate_01.Tpo -c -o parallel_single_copyprivate_01.o `test -f 'openmp/parallel_single_copyprivate_01.c' || echo '$(srcdir)/'`openmp/parallel_single_copyprivate_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_single_copyprivate_01.Tpo $(DEPDIR)/parallel_single_copyprivate_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_single_copyprivate_01.c' object='parallel_single_copyprivate_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_single_copyprivate_01.o `test -f 'openmp/parallel_single_copyprivate_01.c' || echo '$(srcdir)/'`openmp/parallel_single_copyprivate_01.c parallel_single_copyprivate_01.obj: openmp/parallel_single_copyprivate_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_single_copyprivate_01.obj -MD -MP -MF $(DEPDIR)/parallel_single_copyprivate_01.Tpo -c -o parallel_single_copyprivate_01.obj `if test -f 'openmp/parallel_single_copyprivate_01.c'; then $(CYGPATH_W) 'openmp/parallel_single_copyprivate_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_single_copyprivate_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_single_copyprivate_01.Tpo $(DEPDIR)/parallel_single_copyprivate_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_single_copyprivate_01.c' object='parallel_single_copyprivate_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_single_copyprivate_01.obj `if test -f 'openmp/parallel_single_copyprivate_01.c'; then $(CYGPATH_W) 'openmp/parallel_single_copyprivate_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_single_copyprivate_01.c'; fi` parallel_single_copyprivate_inline_01.o: openmp/parallel_single_copyprivate_inline_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_single_copyprivate_inline_01.o -MD -MP -MF $(DEPDIR)/parallel_single_copyprivate_inline_01.Tpo -c -o parallel_single_copyprivate_inline_01.o `test -f 'openmp/parallel_single_copyprivate_inline_01.c' || echo '$(srcdir)/'`openmp/parallel_single_copyprivate_inline_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_single_copyprivate_inline_01.Tpo $(DEPDIR)/parallel_single_copyprivate_inline_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_single_copyprivate_inline_01.c' object='parallel_single_copyprivate_inline_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_single_copyprivate_inline_01.o `test -f 'openmp/parallel_single_copyprivate_inline_01.c' || echo '$(srcdir)/'`openmp/parallel_single_copyprivate_inline_01.c parallel_single_copyprivate_inline_01.obj: openmp/parallel_single_copyprivate_inline_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_single_copyprivate_inline_01.obj -MD -MP -MF $(DEPDIR)/parallel_single_copyprivate_inline_01.Tpo -c -o parallel_single_copyprivate_inline_01.obj `if test -f 'openmp/parallel_single_copyprivate_inline_01.c'; then $(CYGPATH_W) 'openmp/parallel_single_copyprivate_inline_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_single_copyprivate_inline_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_single_copyprivate_inline_01.Tpo $(DEPDIR)/parallel_single_copyprivate_inline_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_single_copyprivate_inline_01.c' object='parallel_single_copyprivate_inline_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_single_copyprivate_inline_01.obj `if test -f 'openmp/parallel_single_copyprivate_inline_01.c'; then $(CYGPATH_W) 'openmp/parallel_single_copyprivate_inline_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_single_copyprivate_inline_01.c'; fi` parallel_single_inline_01.o: openmp/parallel_single_inline_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_single_inline_01.o -MD -MP -MF $(DEPDIR)/parallel_single_inline_01.Tpo -c -o parallel_single_inline_01.o `test -f 'openmp/parallel_single_inline_01.c' || echo '$(srcdir)/'`openmp/parallel_single_inline_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_single_inline_01.Tpo $(DEPDIR)/parallel_single_inline_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_single_inline_01.c' object='parallel_single_inline_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_single_inline_01.o `test -f 'openmp/parallel_single_inline_01.c' || echo '$(srcdir)/'`openmp/parallel_single_inline_01.c parallel_single_inline_01.obj: openmp/parallel_single_inline_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_single_inline_01.obj -MD -MP -MF $(DEPDIR)/parallel_single_inline_01.Tpo -c -o parallel_single_inline_01.obj `if test -f 'openmp/parallel_single_inline_01.c'; then $(CYGPATH_W) 'openmp/parallel_single_inline_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_single_inline_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_single_inline_01.Tpo $(DEPDIR)/parallel_single_inline_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_single_inline_01.c' object='parallel_single_inline_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_single_inline_01.obj `if test -f 'openmp/parallel_single_inline_01.c'; then $(CYGPATH_W) 'openmp/parallel_single_inline_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_single_inline_01.c'; fi` parallel_single_nowait_01.o: openmp/parallel_single_nowait_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_single_nowait_01.o -MD -MP -MF $(DEPDIR)/parallel_single_nowait_01.Tpo -c -o parallel_single_nowait_01.o `test -f 'openmp/parallel_single_nowait_01.c' || echo '$(srcdir)/'`openmp/parallel_single_nowait_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_single_nowait_01.Tpo $(DEPDIR)/parallel_single_nowait_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_single_nowait_01.c' object='parallel_single_nowait_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_single_nowait_01.o `test -f 'openmp/parallel_single_nowait_01.c' || echo '$(srcdir)/'`openmp/parallel_single_nowait_01.c parallel_single_nowait_01.obj: openmp/parallel_single_nowait_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_single_nowait_01.obj -MD -MP -MF $(DEPDIR)/parallel_single_nowait_01.Tpo -c -o parallel_single_nowait_01.obj `if test -f 'openmp/parallel_single_nowait_01.c'; then $(CYGPATH_W) 'openmp/parallel_single_nowait_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_single_nowait_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_single_nowait_01.Tpo $(DEPDIR)/parallel_single_nowait_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_single_nowait_01.c' object='parallel_single_nowait_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_single_nowait_01.obj `if test -f 'openmp/parallel_single_nowait_01.c'; then $(CYGPATH_W) 'openmp/parallel_single_nowait_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_single_nowait_01.c'; fi` parallel_single_wait_01.o: openmp/parallel_single_wait_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_single_wait_01.o -MD -MP -MF $(DEPDIR)/parallel_single_wait_01.Tpo -c -o parallel_single_wait_01.o `test -f 'openmp/parallel_single_wait_01.c' || echo '$(srcdir)/'`openmp/parallel_single_wait_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_single_wait_01.Tpo $(DEPDIR)/parallel_single_wait_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_single_wait_01.c' object='parallel_single_wait_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_single_wait_01.o `test -f 'openmp/parallel_single_wait_01.c' || echo '$(srcdir)/'`openmp/parallel_single_wait_01.c parallel_single_wait_01.obj: openmp/parallel_single_wait_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_single_wait_01.obj -MD -MP -MF $(DEPDIR)/parallel_single_wait_01.Tpo -c -o parallel_single_wait_01.obj `if test -f 'openmp/parallel_single_wait_01.c'; then $(CYGPATH_W) 'openmp/parallel_single_wait_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_single_wait_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_single_wait_01.Tpo $(DEPDIR)/parallel_single_wait_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/parallel_single_wait_01.c' object='parallel_single_wait_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_single_wait_01.obj `if test -f 'openmp/parallel_single_wait_01.c'; then $(CYGPATH_W) 'openmp/parallel_single_wait_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/parallel_single_wait_01.c'; fi` task_01.o: openmp/task_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT task_01.o -MD -MP -MF $(DEPDIR)/task_01.Tpo -c -o task_01.o `test -f 'openmp/task_01.c' || echo '$(srcdir)/'`openmp/task_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/task_01.Tpo $(DEPDIR)/task_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/task_01.c' object='task_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o task_01.o `test -f 'openmp/task_01.c' || echo '$(srcdir)/'`openmp/task_01.c task_01.obj: openmp/task_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT task_01.obj -MD -MP -MF $(DEPDIR)/task_01.Tpo -c -o task_01.obj `if test -f 'openmp/task_01.c'; then $(CYGPATH_W) 'openmp/task_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/task_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/task_01.Tpo $(DEPDIR)/task_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/task_01.c' object='task_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o task_01.obj `if test -f 'openmp/task_01.c'; then $(CYGPATH_W) 'openmp/task_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/task_01.c'; fi` task_02.o: openmp/task_02.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT task_02.o -MD -MP -MF $(DEPDIR)/task_02.Tpo -c -o task_02.o `test -f 'openmp/task_02.c' || echo '$(srcdir)/'`openmp/task_02.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/task_02.Tpo $(DEPDIR)/task_02.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/task_02.c' object='task_02.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o task_02.o `test -f 'openmp/task_02.c' || echo '$(srcdir)/'`openmp/task_02.c task_02.obj: openmp/task_02.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT task_02.obj -MD -MP -MF $(DEPDIR)/task_02.Tpo -c -o task_02.obj `if test -f 'openmp/task_02.c'; then $(CYGPATH_W) 'openmp/task_02.c'; else $(CYGPATH_W) '$(srcdir)/openmp/task_02.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/task_02.Tpo $(DEPDIR)/task_02.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/task_02.c' object='task_02.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o task_02.obj `if test -f 'openmp/task_02.c'; then $(CYGPATH_W) 'openmp/task_02.c'; else $(CYGPATH_W) '$(srcdir)/openmp/task_02.c'; fi` taskgroup_01.o: openmp/taskgroup_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT taskgroup_01.o -MD -MP -MF $(DEPDIR)/taskgroup_01.Tpo -c -o taskgroup_01.o `test -f 'openmp/taskgroup_01.c' || echo '$(srcdir)/'`openmp/taskgroup_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/taskgroup_01.Tpo $(DEPDIR)/taskgroup_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/taskgroup_01.c' object='taskgroup_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o taskgroup_01.o `test -f 'openmp/taskgroup_01.c' || echo '$(srcdir)/'`openmp/taskgroup_01.c taskgroup_01.obj: openmp/taskgroup_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT taskgroup_01.obj -MD -MP -MF $(DEPDIR)/taskgroup_01.Tpo -c -o taskgroup_01.obj `if test -f 'openmp/taskgroup_01.c'; then $(CYGPATH_W) 'openmp/taskgroup_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/taskgroup_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/taskgroup_01.Tpo $(DEPDIR)/taskgroup_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/taskgroup_01.c' object='taskgroup_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o taskgroup_01.obj `if test -f 'openmp/taskgroup_01.c'; then $(CYGPATH_W) 'openmp/taskgroup_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/taskgroup_01.c'; fi` taskgroup_02.o: openmp/taskgroup_02.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT taskgroup_02.o -MD -MP -MF $(DEPDIR)/taskgroup_02.Tpo -c -o taskgroup_02.o `test -f 'openmp/taskgroup_02.c' || echo '$(srcdir)/'`openmp/taskgroup_02.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/taskgroup_02.Tpo $(DEPDIR)/taskgroup_02.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/taskgroup_02.c' object='taskgroup_02.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o taskgroup_02.o `test -f 'openmp/taskgroup_02.c' || echo '$(srcdir)/'`openmp/taskgroup_02.c taskgroup_02.obj: openmp/taskgroup_02.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT taskgroup_02.obj -MD -MP -MF $(DEPDIR)/taskgroup_02.Tpo -c -o taskgroup_02.obj `if test -f 'openmp/taskgroup_02.c'; then $(CYGPATH_W) 'openmp/taskgroup_02.c'; else $(CYGPATH_W) '$(srcdir)/openmp/taskgroup_02.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/taskgroup_02.Tpo $(DEPDIR)/taskgroup_02.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/taskgroup_02.c' object='taskgroup_02.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o taskgroup_02.obj `if test -f 'openmp/taskgroup_02.c'; then $(CYGPATH_W) 'openmp/taskgroup_02.c'; else $(CYGPATH_W) '$(srcdir)/openmp/taskgroup_02.c'; fi` taskwait_01.o: openmp/taskwait_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT taskwait_01.o -MD -MP -MF $(DEPDIR)/taskwait_01.Tpo -c -o taskwait_01.o `test -f 'openmp/taskwait_01.c' || echo '$(srcdir)/'`openmp/taskwait_01.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/taskwait_01.Tpo $(DEPDIR)/taskwait_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/taskwait_01.c' object='taskwait_01.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o taskwait_01.o `test -f 'openmp/taskwait_01.c' || echo '$(srcdir)/'`openmp/taskwait_01.c taskwait_01.obj: openmp/taskwait_01.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT taskwait_01.obj -MD -MP -MF $(DEPDIR)/taskwait_01.Tpo -c -o taskwait_01.obj `if test -f 'openmp/taskwait_01.c'; then $(CYGPATH_W) 'openmp/taskwait_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/taskwait_01.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/taskwait_01.Tpo $(DEPDIR)/taskwait_01.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/taskwait_01.c' object='taskwait_01.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o taskwait_01.obj `if test -f 'openmp/taskwait_01.c'; then $(CYGPATH_W) 'openmp/taskwait_01.c'; else $(CYGPATH_W) '$(srcdir)/openmp/taskwait_01.c'; fi` gpu_concurrency.o: overlap/gpu_concurrency.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpu_concurrency.o -MD -MP -MF $(DEPDIR)/gpu_concurrency.Tpo -c -o gpu_concurrency.o `test -f 'overlap/gpu_concurrency.c' || echo '$(srcdir)/'`overlap/gpu_concurrency.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gpu_concurrency.Tpo $(DEPDIR)/gpu_concurrency.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='overlap/gpu_concurrency.c' object='gpu_concurrency.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpu_concurrency.o `test -f 'overlap/gpu_concurrency.c' || echo '$(srcdir)/'`overlap/gpu_concurrency.c gpu_concurrency.obj: overlap/gpu_concurrency.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpu_concurrency.obj -MD -MP -MF $(DEPDIR)/gpu_concurrency.Tpo -c -o gpu_concurrency.obj `if test -f 'overlap/gpu_concurrency.c'; then $(CYGPATH_W) 'overlap/gpu_concurrency.c'; else $(CYGPATH_W) '$(srcdir)/overlap/gpu_concurrency.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gpu_concurrency.Tpo $(DEPDIR)/gpu_concurrency.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='overlap/gpu_concurrency.c' object='gpu_concurrency.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpu_concurrency.obj `if test -f 'overlap/gpu_concurrency.c'; then $(CYGPATH_W) 'overlap/gpu_concurrency.c'; else $(CYGPATH_W) '$(srcdir)/overlap/gpu_concurrency.c'; fi` overlap.o: overlap/overlap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT overlap.o -MD -MP -MF $(DEPDIR)/overlap.Tpo -c -o overlap.o `test -f 'overlap/overlap.c' || echo '$(srcdir)/'`overlap/overlap.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/overlap.Tpo $(DEPDIR)/overlap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='overlap/overlap.c' object='overlap.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o overlap.o `test -f 'overlap/overlap.c' || echo '$(srcdir)/'`overlap/overlap.c overlap.obj: overlap/overlap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT overlap.obj -MD -MP -MF $(DEPDIR)/overlap.Tpo -c -o overlap.obj `if test -f 'overlap/overlap.c'; then $(CYGPATH_W) 'overlap/overlap.c'; else $(CYGPATH_W) '$(srcdir)/overlap/overlap.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/overlap.Tpo $(DEPDIR)/overlap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='overlap/overlap.c' object='overlap.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o overlap.obj `if test -f 'overlap/overlap.c'; then $(CYGPATH_W) 'overlap/overlap.c'; else $(CYGPATH_W) '$(srcdir)/overlap/overlap.c'; fi` cuda_only.o: parallel_tasks/cuda_only.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cuda_only.o -MD -MP -MF $(DEPDIR)/cuda_only.Tpo -c -o cuda_only.o `test -f 'parallel_tasks/cuda_only.c' || echo '$(srcdir)/'`parallel_tasks/cuda_only.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cuda_only.Tpo $(DEPDIR)/cuda_only.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parallel_tasks/cuda_only.c' object='cuda_only.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cuda_only.o `test -f 'parallel_tasks/cuda_only.c' || echo '$(srcdir)/'`parallel_tasks/cuda_only.c cuda_only.obj: parallel_tasks/cuda_only.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cuda_only.obj -MD -MP -MF $(DEPDIR)/cuda_only.Tpo -c -o cuda_only.obj `if test -f 'parallel_tasks/cuda_only.c'; then $(CYGPATH_W) 'parallel_tasks/cuda_only.c'; else $(CYGPATH_W) '$(srcdir)/parallel_tasks/cuda_only.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cuda_only.Tpo $(DEPDIR)/cuda_only.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parallel_tasks/cuda_only.c' object='cuda_only.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cuda_only.obj `if test -f 'parallel_tasks/cuda_only.c'; then $(CYGPATH_W) 'parallel_tasks/cuda_only.c'; else $(CYGPATH_W) '$(srcdir)/parallel_tasks/cuda_only.c'; fi` explicit_combined_worker.o: parallel_tasks/explicit_combined_worker.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT explicit_combined_worker.o -MD -MP -MF $(DEPDIR)/explicit_combined_worker.Tpo -c -o explicit_combined_worker.o `test -f 'parallel_tasks/explicit_combined_worker.c' || echo '$(srcdir)/'`parallel_tasks/explicit_combined_worker.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/explicit_combined_worker.Tpo $(DEPDIR)/explicit_combined_worker.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parallel_tasks/explicit_combined_worker.c' object='explicit_combined_worker.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o explicit_combined_worker.o `test -f 'parallel_tasks/explicit_combined_worker.c' || echo '$(srcdir)/'`parallel_tasks/explicit_combined_worker.c explicit_combined_worker.obj: parallel_tasks/explicit_combined_worker.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT explicit_combined_worker.obj -MD -MP -MF $(DEPDIR)/explicit_combined_worker.Tpo -c -o explicit_combined_worker.obj `if test -f 'parallel_tasks/explicit_combined_worker.c'; then $(CYGPATH_W) 'parallel_tasks/explicit_combined_worker.c'; else $(CYGPATH_W) '$(srcdir)/parallel_tasks/explicit_combined_worker.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/explicit_combined_worker.Tpo $(DEPDIR)/explicit_combined_worker.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parallel_tasks/explicit_combined_worker.c' object='explicit_combined_worker.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o explicit_combined_worker.obj `if test -f 'parallel_tasks/explicit_combined_worker.c'; then $(CYGPATH_W) 'parallel_tasks/explicit_combined_worker.c'; else $(CYGPATH_W) '$(srcdir)/parallel_tasks/explicit_combined_worker.c'; fi` parallel_kernels.o: parallel_tasks/parallel_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_kernels.o -MD -MP -MF $(DEPDIR)/parallel_kernels.Tpo -c -o parallel_kernels.o `test -f 'parallel_tasks/parallel_kernels.c' || echo '$(srcdir)/'`parallel_tasks/parallel_kernels.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_kernels.Tpo $(DEPDIR)/parallel_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parallel_tasks/parallel_kernels.c' object='parallel_kernels.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_kernels.o `test -f 'parallel_tasks/parallel_kernels.c' || echo '$(srcdir)/'`parallel_tasks/parallel_kernels.c parallel_kernels.obj: parallel_tasks/parallel_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_kernels.obj -MD -MP -MF $(DEPDIR)/parallel_kernels.Tpo -c -o parallel_kernels.obj `if test -f 'parallel_tasks/parallel_kernels.c'; then $(CYGPATH_W) 'parallel_tasks/parallel_kernels.c'; else $(CYGPATH_W) '$(srcdir)/parallel_tasks/parallel_kernels.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_kernels.Tpo $(DEPDIR)/parallel_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parallel_tasks/parallel_kernels.c' object='parallel_kernels.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_kernels.obj `if test -f 'parallel_tasks/parallel_kernels.c'; then $(CYGPATH_W) 'parallel_tasks/parallel_kernels.c'; else $(CYGPATH_W) '$(srcdir)/parallel_tasks/parallel_kernels.c'; fi` parallel_kernels_spmd.o: parallel_tasks/parallel_kernels_spmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_kernels_spmd.o -MD -MP -MF $(DEPDIR)/parallel_kernels_spmd.Tpo -c -o parallel_kernels_spmd.o `test -f 'parallel_tasks/parallel_kernels_spmd.c' || echo '$(srcdir)/'`parallel_tasks/parallel_kernels_spmd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_kernels_spmd.Tpo $(DEPDIR)/parallel_kernels_spmd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parallel_tasks/parallel_kernels_spmd.c' object='parallel_kernels_spmd.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_kernels_spmd.o `test -f 'parallel_tasks/parallel_kernels_spmd.c' || echo '$(srcdir)/'`parallel_tasks/parallel_kernels_spmd.c parallel_kernels_spmd.obj: parallel_tasks/parallel_kernels_spmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_kernels_spmd.obj -MD -MP -MF $(DEPDIR)/parallel_kernels_spmd.Tpo -c -o parallel_kernels_spmd.obj `if test -f 'parallel_tasks/parallel_kernels_spmd.c'; then $(CYGPATH_W) 'parallel_tasks/parallel_kernels_spmd.c'; else $(CYGPATH_W) '$(srcdir)/parallel_tasks/parallel_kernels_spmd.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_kernels_spmd.Tpo $(DEPDIR)/parallel_kernels_spmd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parallel_tasks/parallel_kernels_spmd.c' object='parallel_kernels_spmd.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_kernels_spmd.obj `if test -f 'parallel_tasks/parallel_kernels_spmd.c'; then $(CYGPATH_W) 'parallel_tasks/parallel_kernels_spmd.c'; else $(CYGPATH_W) '$(srcdir)/parallel_tasks/parallel_kernels_spmd.c'; fi` spmd_peager.o: parallel_tasks/spmd_peager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT spmd_peager.o -MD -MP -MF $(DEPDIR)/spmd_peager.Tpo -c -o spmd_peager.o `test -f 'parallel_tasks/spmd_peager.c' || echo '$(srcdir)/'`parallel_tasks/spmd_peager.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/spmd_peager.Tpo $(DEPDIR)/spmd_peager.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parallel_tasks/spmd_peager.c' object='spmd_peager.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o spmd_peager.o `test -f 'parallel_tasks/spmd_peager.c' || echo '$(srcdir)/'`parallel_tasks/spmd_peager.c spmd_peager.obj: parallel_tasks/spmd_peager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT spmd_peager.obj -MD -MP -MF $(DEPDIR)/spmd_peager.Tpo -c -o spmd_peager.obj `if test -f 'parallel_tasks/spmd_peager.c'; then $(CYGPATH_W) 'parallel_tasks/spmd_peager.c'; else $(CYGPATH_W) '$(srcdir)/parallel_tasks/spmd_peager.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/spmd_peager.Tpo $(DEPDIR)/spmd_peager.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parallel_tasks/spmd_peager.c' object='spmd_peager.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o spmd_peager.obj `if test -f 'parallel_tasks/spmd_peager.c'; then $(CYGPATH_W) 'parallel_tasks/spmd_peager.c'; else $(CYGPATH_W) '$(srcdir)/parallel_tasks/spmd_peager.c'; fi` feed.o: perfmodels/feed.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT feed.o -MD -MP -MF $(DEPDIR)/feed.Tpo -c -o feed.o `test -f 'perfmodels/feed.c' || echo '$(srcdir)/'`perfmodels/feed.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/feed.Tpo $(DEPDIR)/feed.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perfmodels/feed.c' object='feed.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o feed.o `test -f 'perfmodels/feed.c' || echo '$(srcdir)/'`perfmodels/feed.c feed.obj: perfmodels/feed.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT feed.obj -MD -MP -MF $(DEPDIR)/feed.Tpo -c -o feed.obj `if test -f 'perfmodels/feed.c'; then $(CYGPATH_W) 'perfmodels/feed.c'; else $(CYGPATH_W) '$(srcdir)/perfmodels/feed.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/feed.Tpo $(DEPDIR)/feed.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perfmodels/feed.c' object='feed.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o feed.obj `if test -f 'perfmodels/feed.c'; then $(CYGPATH_W) 'perfmodels/feed.c'; else $(CYGPATH_W) '$(srcdir)/perfmodels/feed.c'; fi` memory.o: perfmodels/memory.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT memory.o -MD -MP -MF $(DEPDIR)/memory.Tpo -c -o memory.o `test -f 'perfmodels/memory.c' || echo '$(srcdir)/'`perfmodels/memory.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/memory.Tpo $(DEPDIR)/memory.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perfmodels/memory.c' object='memory.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o memory.o `test -f 'perfmodels/memory.c' || echo '$(srcdir)/'`perfmodels/memory.c memory.obj: perfmodels/memory.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT memory.obj -MD -MP -MF $(DEPDIR)/memory.Tpo -c -o memory.obj `if test -f 'perfmodels/memory.c'; then $(CYGPATH_W) 'perfmodels/memory.c'; else $(CYGPATH_W) '$(srcdir)/perfmodels/memory.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/memory.Tpo $(DEPDIR)/memory.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perfmodels/memory.c' object='memory.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o memory.obj `if test -f 'perfmodels/memory.c'; then $(CYGPATH_W) 'perfmodels/memory.c'; else $(CYGPATH_W) '$(srcdir)/perfmodels/memory.c'; fi` non_linear_regression_based.o: perfmodels/non_linear_regression_based.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT non_linear_regression_based.o -MD -MP -MF $(DEPDIR)/non_linear_regression_based.Tpo -c -o non_linear_regression_based.o `test -f 'perfmodels/non_linear_regression_based.c' || echo '$(srcdir)/'`perfmodels/non_linear_regression_based.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/non_linear_regression_based.Tpo $(DEPDIR)/non_linear_regression_based.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perfmodels/non_linear_regression_based.c' object='non_linear_regression_based.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o non_linear_regression_based.o `test -f 'perfmodels/non_linear_regression_based.c' || echo '$(srcdir)/'`perfmodels/non_linear_regression_based.c non_linear_regression_based.obj: perfmodels/non_linear_regression_based.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT non_linear_regression_based.obj -MD -MP -MF $(DEPDIR)/non_linear_regression_based.Tpo -c -o non_linear_regression_based.obj `if test -f 'perfmodels/non_linear_regression_based.c'; then $(CYGPATH_W) 'perfmodels/non_linear_regression_based.c'; else $(CYGPATH_W) '$(srcdir)/perfmodels/non_linear_regression_based.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/non_linear_regression_based.Tpo $(DEPDIR)/non_linear_regression_based.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perfmodels/non_linear_regression_based.c' object='non_linear_regression_based.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o non_linear_regression_based.obj `if test -f 'perfmodels/non_linear_regression_based.c'; then $(CYGPATH_W) 'perfmodels/non_linear_regression_based.c'; else $(CYGPATH_W) '$(srcdir)/perfmodels/non_linear_regression_based.c'; fi` opencl_memset.o: perfmodels/opencl_memset.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT opencl_memset.o -MD -MP -MF $(DEPDIR)/opencl_memset.Tpo -c -o opencl_memset.o `test -f 'perfmodels/opencl_memset.c' || echo '$(srcdir)/'`perfmodels/opencl_memset.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/opencl_memset.Tpo $(DEPDIR)/opencl_memset.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perfmodels/opencl_memset.c' object='opencl_memset.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o opencl_memset.o `test -f 'perfmodels/opencl_memset.c' || echo '$(srcdir)/'`perfmodels/opencl_memset.c opencl_memset.obj: perfmodels/opencl_memset.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT opencl_memset.obj -MD -MP -MF $(DEPDIR)/opencl_memset.Tpo -c -o opencl_memset.obj `if test -f 'perfmodels/opencl_memset.c'; then $(CYGPATH_W) 'perfmodels/opencl_memset.c'; else $(CYGPATH_W) '$(srcdir)/perfmodels/opencl_memset.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/opencl_memset.Tpo $(DEPDIR)/opencl_memset.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perfmodels/opencl_memset.c' object='opencl_memset.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o opencl_memset.obj `if test -f 'perfmodels/opencl_memset.c'; then $(CYGPATH_W) 'perfmodels/opencl_memset.c'; else $(CYGPATH_W) '$(srcdir)/perfmodels/opencl_memset.c'; fi` regression_based.o: perfmodels/regression_based.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT regression_based.o -MD -MP -MF $(DEPDIR)/regression_based.Tpo -c -o regression_based.o `test -f 'perfmodels/regression_based.c' || echo '$(srcdir)/'`perfmodels/regression_based.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/regression_based.Tpo $(DEPDIR)/regression_based.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perfmodels/regression_based.c' object='regression_based.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o regression_based.o `test -f 'perfmodels/regression_based.c' || echo '$(srcdir)/'`perfmodels/regression_based.c regression_based.obj: perfmodels/regression_based.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT regression_based.obj -MD -MP -MF $(DEPDIR)/regression_based.Tpo -c -o regression_based.obj `if test -f 'perfmodels/regression_based.c'; then $(CYGPATH_W) 'perfmodels/regression_based.c'; else $(CYGPATH_W) '$(srcdir)/perfmodels/regression_based.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/regression_based.Tpo $(DEPDIR)/regression_based.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perfmodels/regression_based.c' object='regression_based.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o regression_based.obj `if test -f 'perfmodels/regression_based.c'; then $(CYGPATH_W) 'perfmodels/regression_based.c'; else $(CYGPATH_W) '$(srcdir)/perfmodels/regression_based.c'; fi` user_base.o: perfmodels/user_base.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT user_base.o -MD -MP -MF $(DEPDIR)/user_base.Tpo -c -o user_base.o `test -f 'perfmodels/user_base.c' || echo '$(srcdir)/'`perfmodels/user_base.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/user_base.Tpo $(DEPDIR)/user_base.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perfmodels/user_base.c' object='user_base.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o user_base.o `test -f 'perfmodels/user_base.c' || echo '$(srcdir)/'`perfmodels/user_base.c user_base.obj: perfmodels/user_base.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT user_base.obj -MD -MP -MF $(DEPDIR)/user_base.Tpo -c -o user_base.obj `if test -f 'perfmodels/user_base.c'; then $(CYGPATH_W) 'perfmodels/user_base.c'; else $(CYGPATH_W) '$(srcdir)/perfmodels/user_base.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/user_base.Tpo $(DEPDIR)/user_base.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perfmodels/user_base.c' object='user_base.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o user_base.obj `if test -f 'perfmodels/user_base.c'; then $(CYGPATH_W) 'perfmodels/user_base.c'; else $(CYGPATH_W) '$(srcdir)/perfmodels/user_base.c'; fi` valid_model.o: perfmodels/valid_model.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT valid_model.o -MD -MP -MF $(DEPDIR)/valid_model.Tpo -c -o valid_model.o `test -f 'perfmodels/valid_model.c' || echo '$(srcdir)/'`perfmodels/valid_model.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/valid_model.Tpo $(DEPDIR)/valid_model.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perfmodels/valid_model.c' object='valid_model.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o valid_model.o `test -f 'perfmodels/valid_model.c' || echo '$(srcdir)/'`perfmodels/valid_model.c valid_model.obj: perfmodels/valid_model.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT valid_model.obj -MD -MP -MF $(DEPDIR)/valid_model.Tpo -c -o valid_model.obj `if test -f 'perfmodels/valid_model.c'; then $(CYGPATH_W) 'perfmodels/valid_model.c'; else $(CYGPATH_W) '$(srcdir)/perfmodels/valid_model.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/valid_model.Tpo $(DEPDIR)/valid_model.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perfmodels/valid_model.c' object='valid_model.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o valid_model.obj `if test -f 'perfmodels/valid_model.c'; then $(CYGPATH_W) 'perfmodels/valid_model.c'; else $(CYGPATH_W) '$(srcdir)/perfmodels/valid_model.c'; fi` value_nan.o: perfmodels/value_nan.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT value_nan.o -MD -MP -MF $(DEPDIR)/value_nan.Tpo -c -o value_nan.o `test -f 'perfmodels/value_nan.c' || echo '$(srcdir)/'`perfmodels/value_nan.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/value_nan.Tpo $(DEPDIR)/value_nan.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perfmodels/value_nan.c' object='value_nan.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o value_nan.o `test -f 'perfmodels/value_nan.c' || echo '$(srcdir)/'`perfmodels/value_nan.c value_nan.obj: perfmodels/value_nan.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT value_nan.obj -MD -MP -MF $(DEPDIR)/value_nan.Tpo -c -o value_nan.obj `if test -f 'perfmodels/value_nan.c'; then $(CYGPATH_W) 'perfmodels/value_nan.c'; else $(CYGPATH_W) '$(srcdir)/perfmodels/value_nan.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/value_nan.Tpo $(DEPDIR)/value_nan.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perfmodels/value_nan.c' object='value_nan.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o value_nan.obj `if test -f 'perfmodels/value_nan.c'; then $(CYGPATH_W) 'perfmodels/value_nan.c'; else $(CYGPATH_W) '$(srcdir)/perfmodels/value_nan.c'; fi` data_locality.o: sched_policies/data_locality.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT data_locality.o -MD -MP -MF $(DEPDIR)/data_locality.Tpo -c -o data_locality.o `test -f 'sched_policies/data_locality.c' || echo '$(srcdir)/'`sched_policies/data_locality.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/data_locality.Tpo $(DEPDIR)/data_locality.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/data_locality.c' object='data_locality.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o data_locality.o `test -f 'sched_policies/data_locality.c' || echo '$(srcdir)/'`sched_policies/data_locality.c data_locality.obj: sched_policies/data_locality.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT data_locality.obj -MD -MP -MF $(DEPDIR)/data_locality.Tpo -c -o data_locality.obj `if test -f 'sched_policies/data_locality.c'; then $(CYGPATH_W) 'sched_policies/data_locality.c'; else $(CYGPATH_W) '$(srcdir)/sched_policies/data_locality.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/data_locality.Tpo $(DEPDIR)/data_locality.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/data_locality.c' object='data_locality.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o data_locality.obj `if test -f 'sched_policies/data_locality.c'; then $(CYGPATH_W) 'sched_policies/data_locality.c'; else $(CYGPATH_W) '$(srcdir)/sched_policies/data_locality.c'; fi` execute_all_tasks.o: sched_policies/execute_all_tasks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT execute_all_tasks.o -MD -MP -MF $(DEPDIR)/execute_all_tasks.Tpo -c -o execute_all_tasks.o `test -f 'sched_policies/execute_all_tasks.c' || echo '$(srcdir)/'`sched_policies/execute_all_tasks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/execute_all_tasks.Tpo $(DEPDIR)/execute_all_tasks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/execute_all_tasks.c' object='execute_all_tasks.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o execute_all_tasks.o `test -f 'sched_policies/execute_all_tasks.c' || echo '$(srcdir)/'`sched_policies/execute_all_tasks.c execute_all_tasks.obj: sched_policies/execute_all_tasks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT execute_all_tasks.obj -MD -MP -MF $(DEPDIR)/execute_all_tasks.Tpo -c -o execute_all_tasks.obj `if test -f 'sched_policies/execute_all_tasks.c'; then $(CYGPATH_W) 'sched_policies/execute_all_tasks.c'; else $(CYGPATH_W) '$(srcdir)/sched_policies/execute_all_tasks.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/execute_all_tasks.Tpo $(DEPDIR)/execute_all_tasks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/execute_all_tasks.c' object='execute_all_tasks.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o execute_all_tasks.obj `if test -f 'sched_policies/execute_all_tasks.c'; then $(CYGPATH_W) 'sched_policies/execute_all_tasks.c'; else $(CYGPATH_W) '$(srcdir)/sched_policies/execute_all_tasks.c'; fi` prio.o: sched_policies/prio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prio.o -MD -MP -MF $(DEPDIR)/prio.Tpo -c -o prio.o `test -f 'sched_policies/prio.c' || echo '$(srcdir)/'`sched_policies/prio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/prio.Tpo $(DEPDIR)/prio.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/prio.c' object='prio.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prio.o `test -f 'sched_policies/prio.c' || echo '$(srcdir)/'`sched_policies/prio.c prio.obj: sched_policies/prio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prio.obj -MD -MP -MF $(DEPDIR)/prio.Tpo -c -o prio.obj `if test -f 'sched_policies/prio.c'; then $(CYGPATH_W) 'sched_policies/prio.c'; else $(CYGPATH_W) '$(srcdir)/sched_policies/prio.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/prio.Tpo $(DEPDIR)/prio.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/prio.c' object='prio.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prio.obj `if test -f 'sched_policies/prio.c'; then $(CYGPATH_W) 'sched_policies/prio.c'; else $(CYGPATH_W) '$(srcdir)/sched_policies/prio.c'; fi` simple_cpu_gpu_sched.o: sched_policies/simple_cpu_gpu_sched.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT simple_cpu_gpu_sched.o -MD -MP -MF $(DEPDIR)/simple_cpu_gpu_sched.Tpo -c -o simple_cpu_gpu_sched.o `test -f 'sched_policies/simple_cpu_gpu_sched.c' || echo '$(srcdir)/'`sched_policies/simple_cpu_gpu_sched.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/simple_cpu_gpu_sched.Tpo $(DEPDIR)/simple_cpu_gpu_sched.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/simple_cpu_gpu_sched.c' object='simple_cpu_gpu_sched.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o simple_cpu_gpu_sched.o `test -f 'sched_policies/simple_cpu_gpu_sched.c' || echo '$(srcdir)/'`sched_policies/simple_cpu_gpu_sched.c simple_cpu_gpu_sched.obj: sched_policies/simple_cpu_gpu_sched.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT simple_cpu_gpu_sched.obj -MD -MP -MF $(DEPDIR)/simple_cpu_gpu_sched.Tpo -c -o simple_cpu_gpu_sched.obj `if test -f 'sched_policies/simple_cpu_gpu_sched.c'; then $(CYGPATH_W) 'sched_policies/simple_cpu_gpu_sched.c'; else $(CYGPATH_W) '$(srcdir)/sched_policies/simple_cpu_gpu_sched.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/simple_cpu_gpu_sched.Tpo $(DEPDIR)/simple_cpu_gpu_sched.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/simple_cpu_gpu_sched.c' object='simple_cpu_gpu_sched.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o simple_cpu_gpu_sched.obj `if test -f 'sched_policies/simple_cpu_gpu_sched.c'; then $(CYGPATH_W) 'sched_policies/simple_cpu_gpu_sched.c'; else $(CYGPATH_W) '$(srcdir)/sched_policies/simple_cpu_gpu_sched.c'; fi` simple_deps.o: sched_policies/simple_deps.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT simple_deps.o -MD -MP -MF $(DEPDIR)/simple_deps.Tpo -c -o simple_deps.o `test -f 'sched_policies/simple_deps.c' || echo '$(srcdir)/'`sched_policies/simple_deps.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/simple_deps.Tpo $(DEPDIR)/simple_deps.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/simple_deps.c' object='simple_deps.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o simple_deps.o `test -f 'sched_policies/simple_deps.c' || echo '$(srcdir)/'`sched_policies/simple_deps.c simple_deps.obj: sched_policies/simple_deps.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT simple_deps.obj -MD -MP -MF $(DEPDIR)/simple_deps.Tpo -c -o simple_deps.obj `if test -f 'sched_policies/simple_deps.c'; then $(CYGPATH_W) 'sched_policies/simple_deps.c'; else $(CYGPATH_W) '$(srcdir)/sched_policies/simple_deps.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/simple_deps.Tpo $(DEPDIR)/simple_deps.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/simple_deps.c' object='simple_deps.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o simple_deps.obj `if test -f 'sched_policies/simple_deps.c'; then $(CYGPATH_W) 'sched_policies/simple_deps.c'; else $(CYGPATH_W) '$(srcdir)/sched_policies/simple_deps.c'; fi` .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< test_arbiter.o: datawizard/test_arbiter.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_arbiter.o -MD -MP -MF $(DEPDIR)/test_arbiter.Tpo -c -o test_arbiter.o `test -f 'datawizard/test_arbiter.cpp' || echo '$(srcdir)/'`datawizard/test_arbiter.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_arbiter.Tpo $(DEPDIR)/test_arbiter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='datawizard/test_arbiter.cpp' object='test_arbiter.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_arbiter.o `test -f 'datawizard/test_arbiter.cpp' || echo '$(srcdir)/'`datawizard/test_arbiter.cpp test_arbiter.obj: datawizard/test_arbiter.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_arbiter.obj -MD -MP -MF $(DEPDIR)/test_arbiter.Tpo -c -o test_arbiter.obj `if test -f 'datawizard/test_arbiter.cpp'; then $(CYGPATH_W) 'datawizard/test_arbiter.cpp'; else $(CYGPATH_W) '$(srcdir)/datawizard/test_arbiter.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_arbiter.Tpo $(DEPDIR)/test_arbiter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='datawizard/test_arbiter.cpp' object='test_arbiter.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_arbiter.obj `if test -f 'datawizard/test_arbiter.cpp'; then $(CYGPATH_W) 'datawizard/test_arbiter.cpp'; else $(CYGPATH_W) '$(srcdir)/datawizard/test_arbiter.cpp'; fi` .f90.o: $(AM_V_FC)$(FCCOMPILE) -c -o $@ $< .f90.obj: $(AM_V_FC)$(FCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .f90.lo: $(AM_V_FC)$(LTFCCOMPILE) -c -o $@ $< @STARPU_HAVE_FC_FALSE@starpu_mod.o: $(top_srcdir)/include/starpu_mod.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o starpu_mod.o `test -f '$(top_srcdir)/include/starpu_mod.f90' || echo '$(srcdir)/'`$(top_srcdir)/include/starpu_mod.f90 starpu_mod.obj: $(top_srcdir)/include/starpu_mod.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o starpu_mod.obj `if test -f '$(top_srcdir)/include/starpu_mod.f90'; then $(CYGPATH_W) '$(top_srcdir)/include/starpu_mod.f90'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/include/starpu_mod.f90'; fi` @STARPU_HAVE_FC_FALSE@init_01.o: fortran90/init_01.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o init_01.o `test -f 'fortran90/init_01.f90' || echo '$(srcdir)/'`fortran90/init_01.f90 init_01.obj: fortran90/init_01.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o init_01.obj `if test -f 'fortran90/init_01.f90'; then $(CYGPATH_W) 'fortran90/init_01.f90'; else $(CYGPATH_W) '$(srcdir)/fortran90/init_01.f90'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf datawizard/.libs datawizard/_libs -rm -rf datawizard/interfaces/.libs datawizard/interfaces/_libs -rm -rf datawizard/interfaces/bcsr/.libs datawizard/interfaces/bcsr/_libs -rm -rf datawizard/interfaces/block/.libs datawizard/interfaces/block/_libs -rm -rf datawizard/interfaces/coo/.libs datawizard/interfaces/coo/_libs -rm -rf datawizard/interfaces/csr/.libs datawizard/interfaces/csr/_libs -rm -rf datawizard/interfaces/matrix/.libs datawizard/interfaces/matrix/_libs -rm -rf datawizard/interfaces/multiformat/.libs datawizard/interfaces/multiformat/_libs -rm -rf datawizard/interfaces/multiformat/advanced/.libs datawizard/interfaces/multiformat/advanced/_libs -rm -rf datawizard/interfaces/variable/.libs datawizard/interfaces/variable/_libs -rm -rf datawizard/interfaces/vector/.libs datawizard/interfaces/vector/_libs -rm -rf datawizard/interfaces/void/.libs datawizard/interfaces/void/_libs -rm -rf disk/.libs disk/_libs -rm -rf errorcheck/.libs errorcheck/_libs -rm -rf fortran90/.libs fortran90/_libs -rm -rf helper/.libs helper/_libs -rm -rf main/.libs main/_libs -rm -rf main/driver_api/.libs main/driver_api/_libs -rm -rf microbenchs/.libs microbenchs/_libs -rm -rf openmp/.libs openmp/_libs -rm -rf overlap/.libs overlap/_libs -rm -rf parallel_tasks/.libs parallel_tasks/_libs -rm -rf perfmodels/.libs perfmodels/_libs -rm -rf sched_policies/.libs sched_policies/_libs install-nobase_STARPU_OPENCL_DATADATA: $(nobase_STARPU_OPENCL_DATA_DATA) @$(NORMAL_INSTALL) @list='$(nobase_STARPU_OPENCL_DATA_DATA)'; test -n "$(STARPU_OPENCL_DATAdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(STARPU_OPENCL_DATAdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(STARPU_OPENCL_DATAdir)" || exit 1; \ fi; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ echo " $(MKDIR_P) '$(DESTDIR)$(STARPU_OPENCL_DATAdir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(STARPU_OPENCL_DATAdir)/$$dir"; }; \ echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(STARPU_OPENCL_DATAdir)/$$dir'"; \ $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(STARPU_OPENCL_DATAdir)/$$dir" || exit $$?; }; \ done uninstall-nobase_STARPU_OPENCL_DATADATA: @$(NORMAL_UNINSTALL) @list='$(nobase_STARPU_OPENCL_DATA_DATA)'; test -n "$(STARPU_OPENCL_DATAdir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ dir='$(DESTDIR)$(STARPU_OPENCL_DATAdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? main/mkdtemp.log: main/mkdtemp$(EXEEXT) @p='main/mkdtemp$(EXEEXT)'; \ b='main/mkdtemp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/execute_schedule.log: main/execute_schedule$(EXEEXT) @p='main/execute_schedule$(EXEEXT)'; \ b='main/execute_schedule'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/insert_task_pack.log: main/insert_task_pack$(EXEEXT) @p='main/insert_task_pack$(EXEEXT)'; \ b='main/insert_task_pack'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/insert_task_nullcodelet.log: main/insert_task_nullcodelet$(EXEEXT) @p='main/insert_task_nullcodelet$(EXEEXT)'; \ b='main/insert_task_nullcodelet'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/multithreaded_init.log: main/multithreaded_init$(EXEEXT) @p='main/multithreaded_init$(EXEEXT)'; \ b='main/multithreaded_init'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/empty_task.log: main/empty_task$(EXEEXT) @p='main/empty_task$(EXEEXT)'; \ b='main/empty_task'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/empty_task_chain.log: main/empty_task_chain$(EXEEXT) @p='main/empty_task_chain$(EXEEXT)'; \ b='main/empty_task_chain'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/starpu_worker_exists.log: main/starpu_worker_exists$(EXEEXT) @p='main/starpu_worker_exists$(EXEEXT)'; \ b='main/starpu_worker_exists'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/codelet_null_callback.log: main/codelet_null_callback$(EXEEXT) @p='main/codelet_null_callback$(EXEEXT)'; \ b='main/codelet_null_callback'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/allocate.log: datawizard/allocate$(EXEEXT) @p='datawizard/allocate$(EXEEXT)'; \ b='datawizard/allocate'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/acquire_cb.log: datawizard/acquire_cb$(EXEEXT) @p='datawizard/acquire_cb$(EXEEXT)'; \ b='datawizard/acquire_cb'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/user_interaction_implicit.log: datawizard/user_interaction_implicit$(EXEEXT) @p='datawizard/user_interaction_implicit$(EXEEXT)'; \ b='datawizard/user_interaction_implicit'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/copy_interfaces.log: datawizard/interfaces/copy_interfaces$(EXEEXT) @p='datawizard/interfaces/copy_interfaces$(EXEEXT)'; \ b='datawizard/interfaces/copy_interfaces'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/locality.log: datawizard/locality$(EXEEXT) @p='datawizard/locality$(EXEEXT)'; \ b='datawizard/locality'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/simgrid-locality.log: datawizard/simgrid-locality$(EXEEXT) @p='datawizard/simgrid-locality$(EXEEXT)'; \ b='datawizard/simgrid-locality'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) errorcheck/starpu_init_noworker.log: errorcheck/starpu_init_noworker$(EXEEXT) @p='errorcheck/starpu_init_noworker$(EXEEXT)'; \ b='errorcheck/starpu_init_noworker'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) errorcheck/invalid_tasks.log: errorcheck/invalid_tasks$(EXEEXT) @p='errorcheck/invalid_tasks$(EXEEXT)'; \ b='errorcheck/invalid_tasks'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) helper/cublas_init.log: helper/cublas_init$(EXEEXT) @p='helper/cublas_init$(EXEEXT)'; \ b='helper/cublas_init'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) helper/cusparse_init.log: helper/cusparse_init$(EXEEXT) @p='helper/cusparse_init$(EXEEXT)'; \ b='helper/cusparse_init'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) helper/pinned_memory.log: helper/pinned_memory$(EXEEXT) @p='helper/pinned_memory$(EXEEXT)'; \ b='helper/pinned_memory'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) helper/execute_on_all.log: helper/execute_on_all$(EXEEXT) @p='helper/execute_on_all$(EXEEXT)'; \ b='helper/execute_on_all'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) microbenchs/display_structures_size.log: microbenchs/display_structures_size$(EXEEXT) @p='microbenchs/display_structures_size$(EXEEXT)'; \ b='microbenchs/display_structures_size'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) microbenchs/local_pingpong.log: microbenchs/local_pingpong$(EXEEXT) @p='microbenchs/local_pingpong$(EXEEXT)'; \ b='microbenchs/local_pingpong'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) overlap/overlap.log: overlap/overlap$(EXEEXT) @p='overlap/overlap$(EXEEXT)'; \ b='overlap/overlap'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) perfmodels/value_nan.log: perfmodels/value_nan$(EXEEXT) @p='perfmodels/value_nan$(EXEEXT)'; \ b='perfmodels/value_nan'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/deprecated_func.log: main/deprecated_func$(EXEEXT) @p='main/deprecated_func$(EXEEXT)'; \ b='main/deprecated_func'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/driver_api/init_run_deinit.log: main/driver_api/init_run_deinit$(EXEEXT) @p='main/driver_api/init_run_deinit$(EXEEXT)'; \ b='main/driver_api/init_run_deinit'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/driver_api/run_driver.log: main/driver_api/run_driver$(EXEEXT) @p='main/driver_api/run_driver$(EXEEXT)'; \ b='main/driver_api/run_driver'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/deploop.log: main/deploop$(EXEEXT) @p='main/deploop$(EXEEXT)'; \ b='main/deploop'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/execute_on_a_specific_worker.log: main/execute_on_a_specific_worker$(EXEEXT) @p='main/execute_on_a_specific_worker$(EXEEXT)'; \ b='main/execute_on_a_specific_worker'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/insert_task.log: main/insert_task$(EXEEXT) @p='main/insert_task$(EXEEXT)'; \ b='main/insert_task'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/insert_task_value.log: main/insert_task_value$(EXEEXT) @p='main/insert_task_value$(EXEEXT)'; \ b='main/insert_task_value'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/insert_task_dyn_handles.log: main/insert_task_dyn_handles$(EXEEXT) @p='main/insert_task_dyn_handles$(EXEEXT)'; \ b='main/insert_task_dyn_handles'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/insert_task_array.log: main/insert_task_array$(EXEEXT) @p='main/insert_task_array$(EXEEXT)'; \ b='main/insert_task_array'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/insert_task_many.log: main/insert_task_many$(EXEEXT) @p='main/insert_task_many$(EXEEXT)'; \ b='main/insert_task_many'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/multithreaded.log: main/multithreaded$(EXEEXT) @p='main/multithreaded$(EXEEXT)'; \ b='main/multithreaded'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/starpu_task_bundle.log: main/starpu_task_bundle$(EXEEXT) @p='main/starpu_task_bundle$(EXEEXT)'; \ b='main/starpu_task_bundle'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/starpu_task_wait_for_all.log: main/starpu_task_wait_for_all$(EXEEXT) @p='main/starpu_task_wait_for_all$(EXEEXT)'; \ b='main/starpu_task_wait_for_all'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/starpu_task_wait.log: main/starpu_task_wait$(EXEEXT) @p='main/starpu_task_wait$(EXEEXT)'; \ b='main/starpu_task_wait'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/static_restartable.log: main/static_restartable$(EXEEXT) @p='main/static_restartable$(EXEEXT)'; \ b='main/static_restartable'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/static_restartable_using_initializer.log: main/static_restartable_using_initializer$(EXEEXT) @p='main/static_restartable_using_initializer$(EXEEXT)'; \ b='main/static_restartable_using_initializer'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/static_restartable_tag.log: main/static_restartable_tag$(EXEEXT) @p='main/static_restartable_tag$(EXEEXT)'; \ b='main/static_restartable_tag'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/regenerate.log: main/regenerate$(EXEEXT) @p='main/regenerate$(EXEEXT)'; \ b='main/regenerate'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/regenerate_pipeline.log: main/regenerate_pipeline$(EXEEXT) @p='main/regenerate_pipeline$(EXEEXT)'; \ b='main/regenerate_pipeline'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/restart.log: main/restart$(EXEEXT) @p='main/restart$(EXEEXT)'; \ b='main/restart'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/wait_all_regenerable_tasks.log: main/wait_all_regenerable_tasks$(EXEEXT) @p='main/wait_all_regenerable_tasks$(EXEEXT)'; \ b='main/wait_all_regenerable_tasks'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/subgraph_repeat.log: main/subgraph_repeat$(EXEEXT) @p='main/subgraph_repeat$(EXEEXT)'; \ b='main/subgraph_repeat'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/subgraph_repeat_tag.log: main/subgraph_repeat_tag$(EXEEXT) @p='main/subgraph_repeat_tag$(EXEEXT)'; \ b='main/subgraph_repeat_tag'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/subgraph_repeat_regenerate.log: main/subgraph_repeat_regenerate$(EXEEXT) @p='main/subgraph_repeat_regenerate$(EXEEXT)'; \ b='main/subgraph_repeat_regenerate'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/subgraph_repeat_regenerate_tag.log: main/subgraph_repeat_regenerate_tag$(EXEEXT) @p='main/subgraph_repeat_regenerate_tag$(EXEEXT)'; \ b='main/subgraph_repeat_regenerate_tag'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/empty_task_sync_point.log: main/empty_task_sync_point$(EXEEXT) @p='main/empty_task_sync_point$(EXEEXT)'; \ b='main/empty_task_sync_point'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/empty_task_sync_point_tasks.log: main/empty_task_sync_point_tasks$(EXEEXT) @p='main/empty_task_sync_point_tasks$(EXEEXT)'; \ b='main/empty_task_sync_point_tasks'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/tag_wait_api.log: main/tag_wait_api$(EXEEXT) @p='main/tag_wait_api$(EXEEXT)'; \ b='main/tag_wait_api'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/task_wait_api.log: main/task_wait_api$(EXEEXT) @p='main/task_wait_api$(EXEEXT)'; \ b='main/task_wait_api'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/declare_deps_in_callback.log: main/declare_deps_in_callback$(EXEEXT) @p='main/declare_deps_in_callback$(EXEEXT)'; \ b='main/declare_deps_in_callback'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/declare_deps_after_submission.log: main/declare_deps_after_submission$(EXEEXT) @p='main/declare_deps_after_submission$(EXEEXT)'; \ b='main/declare_deps_after_submission'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/declare_deps_after_submission_synchronous.log: main/declare_deps_after_submission_synchronous$(EXEEXT) @p='main/declare_deps_after_submission_synchronous$(EXEEXT)'; \ b='main/declare_deps_after_submission_synchronous'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/get_current_task.log: main/get_current_task$(EXEEXT) @p='main/get_current_task$(EXEEXT)'; \ b='main/get_current_task'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/starpu_init.log: main/starpu_init$(EXEEXT) @p='main/starpu_init$(EXEEXT)'; \ b='main/starpu_init'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/submit.log: main/submit$(EXEEXT) @p='main/submit$(EXEEXT)'; \ b='main/submit'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/pause_resume.log: main/pause_resume$(EXEEXT) @p='main/pause_resume$(EXEEXT)'; \ b='main/pause_resume'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/pack.log: main/pack$(EXEEXT) @p='main/pack$(EXEEXT)'; \ b='main/pack'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/get_children_tasks.log: main/get_children_tasks$(EXEEXT) @p='main/get_children_tasks$(EXEEXT)'; \ b='main/get_children_tasks'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/acquire_cb_insert.log: datawizard/acquire_cb_insert$(EXEEXT) @p='datawizard/acquire_cb_insert$(EXEEXT)'; \ b='datawizard/acquire_cb_insert'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/acquire_release.log: datawizard/acquire_release$(EXEEXT) @p='datawizard/acquire_release$(EXEEXT)'; \ b='datawizard/acquire_release'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/acquire_release2.log: datawizard/acquire_release2$(EXEEXT) @p='datawizard/acquire_release2$(EXEEXT)'; \ b='datawizard/acquire_release2'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/acquire_try.log: datawizard/acquire_try$(EXEEXT) @p='datawizard/acquire_try$(EXEEXT)'; \ b='datawizard/acquire_try'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/cache.log: datawizard/cache$(EXEEXT) @p='datawizard/cache$(EXEEXT)'; \ b='datawizard/cache'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/commute.log: datawizard/commute$(EXEEXT) @p='datawizard/commute$(EXEEXT)'; \ b='datawizard/commute'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/commute2.log: datawizard/commute2$(EXEEXT) @p='datawizard/commute2$(EXEEXT)'; \ b='datawizard/commute2'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/copy.log: datawizard/copy$(EXEEXT) @p='datawizard/copy$(EXEEXT)'; \ b='datawizard/copy'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/data_implicit_deps.log: datawizard/data_implicit_deps$(EXEEXT) @p='datawizard/data_implicit_deps$(EXEEXT)'; \ b='datawizard/data_implicit_deps'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/data_lookup.log: datawizard/data_lookup$(EXEEXT) @p='datawizard/data_lookup$(EXEEXT)'; \ b='datawizard/data_lookup'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/scratch.log: datawizard/scratch$(EXEEXT) @p='datawizard/scratch$(EXEEXT)'; \ b='datawizard/scratch'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/sync_and_notify_data.log: datawizard/sync_and_notify_data$(EXEEXT) @p='datawizard/sync_and_notify_data$(EXEEXT)'; \ b='datawizard/sync_and_notify_data'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/sync_and_notify_data_implicit.log: datawizard/sync_and_notify_data_implicit$(EXEEXT) @p='datawizard/sync_and_notify_data_implicit$(EXEEXT)'; \ b='datawizard/sync_and_notify_data_implicit'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/dsm_stress.log: datawizard/dsm_stress$(EXEEXT) @p='datawizard/dsm_stress$(EXEEXT)'; \ b='datawizard/dsm_stress'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/double_parameter.log: datawizard/double_parameter$(EXEEXT) @p='datawizard/double_parameter$(EXEEXT)'; \ b='datawizard/double_parameter'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/write_only_tmp_buffer.log: datawizard/write_only_tmp_buffer$(EXEEXT) @p='datawizard/write_only_tmp_buffer$(EXEEXT)'; \ b='datawizard/write_only_tmp_buffer'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/data_invalidation.log: datawizard/data_invalidation$(EXEEXT) @p='datawizard/data_invalidation$(EXEEXT)'; \ b='datawizard/data_invalidation'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/dining_philosophers.log: datawizard/dining_philosophers$(EXEEXT) @p='datawizard/dining_philosophers$(EXEEXT)'; \ b='datawizard/dining_philosophers'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/manual_reduction.log: datawizard/manual_reduction$(EXEEXT) @p='datawizard/manual_reduction$(EXEEXT)'; \ b='datawizard/manual_reduction'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/readers_and_writers.log: datawizard/readers_and_writers$(EXEEXT) @p='datawizard/readers_and_writers$(EXEEXT)'; \ b='datawizard/readers_and_writers'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/unpartition.log: datawizard/unpartition$(EXEEXT) @p='datawizard/unpartition$(EXEEXT)'; \ b='datawizard/unpartition'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/sync_with_data_with_mem.log: datawizard/sync_with_data_with_mem$(EXEEXT) @p='datawizard/sync_with_data_with_mem$(EXEEXT)'; \ b='datawizard/sync_with_data_with_mem'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/sync_with_data_with_mem_non_blocking.log: datawizard/sync_with_data_with_mem_non_blocking$(EXEEXT) @p='datawizard/sync_with_data_with_mem_non_blocking$(EXEEXT)'; \ b='datawizard/sync_with_data_with_mem_non_blocking'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/sync_with_data_with_mem_non_blocking_implicit.log: datawizard/sync_with_data_with_mem_non_blocking_implicit$(EXEEXT) @p='datawizard/sync_with_data_with_mem_non_blocking_implicit$(EXEEXT)'; \ b='datawizard/sync_with_data_with_mem_non_blocking_implicit'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/mpi_like.log: datawizard/mpi_like$(EXEEXT) @p='datawizard/mpi_like$(EXEEXT)'; \ b='datawizard/mpi_like'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/mpi_like_async.log: datawizard/mpi_like_async$(EXEEXT) @p='datawizard/mpi_like_async$(EXEEXT)'; \ b='datawizard/mpi_like_async'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/critical_section_with_void_interface.log: datawizard/critical_section_with_void_interface$(EXEEXT) @p='datawizard/critical_section_with_void_interface$(EXEEXT)'; \ b='datawizard/critical_section_with_void_interface'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/increment_init.log: datawizard/increment_init$(EXEEXT) @p='datawizard/increment_init$(EXEEXT)'; \ b='datawizard/increment_init'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/increment_redux.log: datawizard/increment_redux$(EXEEXT) @p='datawizard/increment_redux$(EXEEXT)'; \ b='datawizard/increment_redux'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/increment_redux_v2.log: datawizard/increment_redux_v2$(EXEEXT) @p='datawizard/increment_redux_v2$(EXEEXT)'; \ b='datawizard/increment_redux_v2'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/increment_redux_lazy.log: datawizard/increment_redux_lazy$(EXEEXT) @p='datawizard/increment_redux_lazy$(EXEEXT)'; \ b='datawizard/increment_redux_lazy'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/handle_to_pointer.log: datawizard/handle_to_pointer$(EXEEXT) @p='datawizard/handle_to_pointer$(EXEEXT)'; \ b='datawizard/handle_to_pointer'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/lazy_allocation.log: datawizard/lazy_allocation$(EXEEXT) @p='datawizard/lazy_allocation$(EXEEXT)'; \ b='datawizard/lazy_allocation'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/lazy_unregister.log: datawizard/lazy_unregister$(EXEEXT) @p='datawizard/lazy_unregister$(EXEEXT)'; \ b='datawizard/lazy_unregister'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/no_unregister.log: datawizard/no_unregister$(EXEEXT) @p='datawizard/no_unregister$(EXEEXT)'; \ b='datawizard/no_unregister'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/noreclaim.log: datawizard/noreclaim$(EXEEXT) @p='datawizard/noreclaim$(EXEEXT)'; \ b='datawizard/noreclaim'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/nowhere.log: datawizard/nowhere$(EXEEXT) @p='datawizard/nowhere$(EXEEXT)'; \ b='datawizard/nowhere'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/block/block_interface.log: datawizard/interfaces/block/block_interface$(EXEEXT) @p='datawizard/interfaces/block/block_interface$(EXEEXT)'; \ b='datawizard/interfaces/block/block_interface'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/bcsr/bcsr_interface.log: datawizard/interfaces/bcsr/bcsr_interface$(EXEEXT) @p='datawizard/interfaces/bcsr/bcsr_interface$(EXEEXT)'; \ b='datawizard/interfaces/bcsr/bcsr_interface'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/coo/coo_interface.log: datawizard/interfaces/coo/coo_interface$(EXEEXT) @p='datawizard/interfaces/coo/coo_interface$(EXEEXT)'; \ b='datawizard/interfaces/coo/coo_interface'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/csr/csr_interface.log: datawizard/interfaces/csr/csr_interface$(EXEEXT) @p='datawizard/interfaces/csr/csr_interface$(EXEEXT)'; \ b='datawizard/interfaces/csr/csr_interface'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/matrix/matrix_interface.log: datawizard/interfaces/matrix/matrix_interface$(EXEEXT) @p='datawizard/interfaces/matrix/matrix_interface$(EXEEXT)'; \ b='datawizard/interfaces/matrix/matrix_interface'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/multiformat/multiformat_interface.log: datawizard/interfaces/multiformat/multiformat_interface$(EXEEXT) @p='datawizard/interfaces/multiformat/multiformat_interface$(EXEEXT)'; \ b='datawizard/interfaces/multiformat/multiformat_interface'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.log: datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl$(EXEEXT) @p='datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl$(EXEEXT)'; \ b='datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/multiformat/advanced/multiformat_data_release.log: datawizard/interfaces/multiformat/advanced/multiformat_data_release$(EXEEXT) @p='datawizard/interfaces/multiformat/advanced/multiformat_data_release$(EXEEXT)'; \ b='datawizard/interfaces/multiformat/advanced/multiformat_data_release'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/multiformat/advanced/multiformat_worker.log: datawizard/interfaces/multiformat/advanced/multiformat_worker$(EXEEXT) @p='datawizard/interfaces/multiformat/advanced/multiformat_worker$(EXEEXT)'; \ b='datawizard/interfaces/multiformat/advanced/multiformat_worker'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.log: datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion$(EXEEXT) @p='datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion$(EXEEXT)'; \ b='datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/multiformat/advanced/same_handle.log: datawizard/interfaces/multiformat/advanced/same_handle$(EXEEXT) @p='datawizard/interfaces/multiformat/advanced/same_handle$(EXEEXT)'; \ b='datawizard/interfaces/multiformat/advanced/same_handle'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/variable/variable_interface.log: datawizard/interfaces/variable/variable_interface$(EXEEXT) @p='datawizard/interfaces/variable/variable_interface$(EXEEXT)'; \ b='datawizard/interfaces/variable/variable_interface'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/vector/test_vector_interface.log: datawizard/interfaces/vector/test_vector_interface$(EXEEXT) @p='datawizard/interfaces/vector/test_vector_interface$(EXEEXT)'; \ b='datawizard/interfaces/vector/test_vector_interface'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/void/void_interface.log: datawizard/interfaces/void/void_interface$(EXEEXT) @p='datawizard/interfaces/void/void_interface$(EXEEXT)'; \ b='datawizard/interfaces/void/void_interface'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/in_place_partition.log: datawizard/in_place_partition$(EXEEXT) @p='datawizard/in_place_partition$(EXEEXT)'; \ b='datawizard/in_place_partition'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/partition_dep.log: datawizard/partition_dep$(EXEEXT) @p='datawizard/partition_dep$(EXEEXT)'; \ b='datawizard/partition_dep'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/partition_lazy.log: datawizard/partition_lazy$(EXEEXT) @p='datawizard/partition_lazy$(EXEEXT)'; \ b='datawizard/partition_lazy'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/gpu_register.log: datawizard/gpu_register$(EXEEXT) @p='datawizard/gpu_register$(EXEEXT)'; \ b='datawizard/gpu_register'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/gpu_ptr_register.log: datawizard/gpu_ptr_register$(EXEEXT) @p='datawizard/gpu_ptr_register$(EXEEXT)'; \ b='datawizard/gpu_ptr_register'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/variable_parameters.log: datawizard/variable_parameters$(EXEEXT) @p='datawizard/variable_parameters$(EXEEXT)'; \ b='datawizard/variable_parameters'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/wt_host.log: datawizard/wt_host$(EXEEXT) @p='datawizard/wt_host$(EXEEXT)'; \ b='datawizard/wt_host'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/wt_broadcast.log: datawizard/wt_broadcast$(EXEEXT) @p='datawizard/wt_broadcast$(EXEEXT)'; \ b='datawizard/wt_broadcast'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/readonly.log: datawizard/readonly$(EXEEXT) @p='datawizard/readonly$(EXEEXT)'; \ b='datawizard/readonly'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/specific_node.log: datawizard/specific_node$(EXEEXT) @p='datawizard/specific_node$(EXEEXT)'; \ b='datawizard/specific_node'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/task_with_multiple_time_the_same_handle.log: datawizard/task_with_multiple_time_the_same_handle$(EXEEXT) @p='datawizard/task_with_multiple_time_the_same_handle$(EXEEXT)'; \ b='datawizard/task_with_multiple_time_the_same_handle'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/test_arbiter.log: datawizard/test_arbiter$(EXEEXT) @p='datawizard/test_arbiter$(EXEEXT)'; \ b='datawizard/test_arbiter'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/invalidate_pending_requests.log: datawizard/invalidate_pending_requests$(EXEEXT) @p='datawizard/invalidate_pending_requests$(EXEEXT)'; \ b='datawizard/invalidate_pending_requests'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/temporary_partition.log: datawizard/temporary_partition$(EXEEXT) @p='datawizard/temporary_partition$(EXEEXT)'; \ b='datawizard/temporary_partition'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/redux_acquire.log: datawizard/redux_acquire$(EXEEXT) @p='datawizard/redux_acquire$(EXEEXT)'; \ b='datawizard/redux_acquire'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) disk/disk_copy.log: disk/disk_copy$(EXEEXT) @p='disk/disk_copy$(EXEEXT)'; \ b='disk/disk_copy'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) disk/disk_compute.log: disk/disk_compute$(EXEEXT) @p='disk/disk_compute$(EXEEXT)'; \ b='disk/disk_compute'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) disk/disk_pack.log: disk/disk_pack$(EXEEXT) @p='disk/disk_pack$(EXEEXT)'; \ b='disk/disk_pack'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) disk/mem_reclaim.log: disk/mem_reclaim$(EXEEXT) @p='disk/mem_reclaim$(EXEEXT)'; \ b='disk/mem_reclaim'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) errorcheck/invalid_blocking_calls.log: errorcheck/invalid_blocking_calls$(EXEEXT) @p='errorcheck/invalid_blocking_calls$(EXEEXT)'; \ b='errorcheck/invalid_blocking_calls'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) helper/starpu_data_cpy.log: helper/starpu_data_cpy$(EXEEXT) @p='helper/starpu_data_cpy$(EXEEXT)'; \ b='helper/starpu_data_cpy'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) helper/starpu_create_sync_task.log: helper/starpu_create_sync_task$(EXEEXT) @p='helper/starpu_create_sync_task$(EXEEXT)'; \ b='helper/starpu_create_sync_task'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) microbenchs/async_tasks_overhead.log: microbenchs/async_tasks_overhead$(EXEEXT) @p='microbenchs/async_tasks_overhead$(EXEEXT)'; \ b='microbenchs/async_tasks_overhead'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) microbenchs/sync_tasks_overhead.log: microbenchs/sync_tasks_overhead$(EXEEXT) @p='microbenchs/sync_tasks_overhead$(EXEEXT)'; \ b='microbenchs/sync_tasks_overhead'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) microbenchs/tasks_overhead.log: microbenchs/tasks_overhead$(EXEEXT) @p='microbenchs/tasks_overhead$(EXEEXT)'; \ b='microbenchs/tasks_overhead'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) microbenchs/tasks_size_overhead.log: microbenchs/tasks_size_overhead$(EXEEXT) @p='microbenchs/tasks_size_overhead$(EXEEXT)'; \ b='microbenchs/tasks_size_overhead'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) microbenchs/prefetch_data_on_node.log: microbenchs/prefetch_data_on_node$(EXEEXT) @p='microbenchs/prefetch_data_on_node$(EXEEXT)'; \ b='microbenchs/prefetch_data_on_node'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) microbenchs/redundant_buffer.log: microbenchs/redundant_buffer$(EXEEXT) @p='microbenchs/redundant_buffer$(EXEEXT)'; \ b='microbenchs/redundant_buffer'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) microbenchs/matrix_as_vector.log: microbenchs/matrix_as_vector$(EXEEXT) @p='microbenchs/matrix_as_vector$(EXEEXT)'; \ b='microbenchs/matrix_as_vector'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/init_exit_01.log: openmp/init_exit_01$(EXEEXT) @p='openmp/init_exit_01$(EXEEXT)'; \ b='openmp/init_exit_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/init_exit_02.log: openmp/init_exit_02$(EXEEXT) @p='openmp/init_exit_02$(EXEEXT)'; \ b='openmp/init_exit_02'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/environment.log: openmp/environment$(EXEEXT) @p='openmp/environment$(EXEEXT)'; \ b='openmp/environment'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/api_01.log: openmp/api_01$(EXEEXT) @p='openmp/api_01$(EXEEXT)'; \ b='openmp/api_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/parallel_01.log: openmp/parallel_01$(EXEEXT) @p='openmp/parallel_01$(EXEEXT)'; \ b='openmp/parallel_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/parallel_02.log: openmp/parallel_02$(EXEEXT) @p='openmp/parallel_02$(EXEEXT)'; \ b='openmp/parallel_02'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/parallel_03.log: openmp/parallel_03$(EXEEXT) @p='openmp/parallel_03$(EXEEXT)'; \ b='openmp/parallel_03'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/parallel_barrier_01.log: openmp/parallel_barrier_01$(EXEEXT) @p='openmp/parallel_barrier_01$(EXEEXT)'; \ b='openmp/parallel_barrier_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/parallel_master_01.log: openmp/parallel_master_01$(EXEEXT) @p='openmp/parallel_master_01$(EXEEXT)'; \ b='openmp/parallel_master_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/parallel_master_inline_01.log: openmp/parallel_master_inline_01$(EXEEXT) @p='openmp/parallel_master_inline_01$(EXEEXT)'; \ b='openmp/parallel_master_inline_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/parallel_single_wait_01.log: openmp/parallel_single_wait_01$(EXEEXT) @p='openmp/parallel_single_wait_01$(EXEEXT)'; \ b='openmp/parallel_single_wait_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/parallel_single_nowait_01.log: openmp/parallel_single_nowait_01$(EXEEXT) @p='openmp/parallel_single_nowait_01$(EXEEXT)'; \ b='openmp/parallel_single_nowait_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/parallel_single_inline_01.log: openmp/parallel_single_inline_01$(EXEEXT) @p='openmp/parallel_single_inline_01$(EXEEXT)'; \ b='openmp/parallel_single_inline_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/parallel_single_copyprivate_01.log: openmp/parallel_single_copyprivate_01$(EXEEXT) @p='openmp/parallel_single_copyprivate_01$(EXEEXT)'; \ b='openmp/parallel_single_copyprivate_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/parallel_single_copyprivate_inline_01.log: openmp/parallel_single_copyprivate_inline_01$(EXEEXT) @p='openmp/parallel_single_copyprivate_inline_01$(EXEEXT)'; \ b='openmp/parallel_single_copyprivate_inline_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/parallel_critical_01.log: openmp/parallel_critical_01$(EXEEXT) @p='openmp/parallel_critical_01$(EXEEXT)'; \ b='openmp/parallel_critical_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/parallel_critical_inline_01.log: openmp/parallel_critical_inline_01$(EXEEXT) @p='openmp/parallel_critical_inline_01$(EXEEXT)'; \ b='openmp/parallel_critical_inline_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/parallel_critical_named_01.log: openmp/parallel_critical_named_01$(EXEEXT) @p='openmp/parallel_critical_named_01$(EXEEXT)'; \ b='openmp/parallel_critical_named_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/parallel_critical_named_inline_01.log: openmp/parallel_critical_named_inline_01$(EXEEXT) @p='openmp/parallel_critical_named_inline_01$(EXEEXT)'; \ b='openmp/parallel_critical_named_inline_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/parallel_simple_lock_01.log: openmp/parallel_simple_lock_01$(EXEEXT) @p='openmp/parallel_simple_lock_01$(EXEEXT)'; \ b='openmp/parallel_simple_lock_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/parallel_nested_lock_01.log: openmp/parallel_nested_lock_01$(EXEEXT) @p='openmp/parallel_nested_lock_01$(EXEEXT)'; \ b='openmp/parallel_nested_lock_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/parallel_for_01.log: openmp/parallel_for_01$(EXEEXT) @p='openmp/parallel_for_01$(EXEEXT)'; \ b='openmp/parallel_for_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/parallel_for_02.log: openmp/parallel_for_02$(EXEEXT) @p='openmp/parallel_for_02$(EXEEXT)'; \ b='openmp/parallel_for_02'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/parallel_for_ordered_01.log: openmp/parallel_for_ordered_01$(EXEEXT) @p='openmp/parallel_for_ordered_01$(EXEEXT)'; \ b='openmp/parallel_for_ordered_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/parallel_sections_01.log: openmp/parallel_sections_01$(EXEEXT) @p='openmp/parallel_sections_01$(EXEEXT)'; \ b='openmp/parallel_sections_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/parallel_sections_combined_01.log: openmp/parallel_sections_combined_01$(EXEEXT) @p='openmp/parallel_sections_combined_01$(EXEEXT)'; \ b='openmp/parallel_sections_combined_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/task_01.log: openmp/task_01$(EXEEXT) @p='openmp/task_01$(EXEEXT)'; \ b='openmp/task_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/task_02.log: openmp/task_02$(EXEEXT) @p='openmp/task_02$(EXEEXT)'; \ b='openmp/task_02'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/taskwait_01.log: openmp/taskwait_01$(EXEEXT) @p='openmp/taskwait_01$(EXEEXT)'; \ b='openmp/taskwait_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/taskgroup_01.log: openmp/taskgroup_01$(EXEEXT) @p='openmp/taskgroup_01$(EXEEXT)'; \ b='openmp/taskgroup_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/taskgroup_02.log: openmp/taskgroup_02$(EXEEXT) @p='openmp/taskgroup_02$(EXEEXT)'; \ b='openmp/taskgroup_02'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/array_slice_01.log: openmp/array_slice_01$(EXEEXT) @p='openmp/array_slice_01$(EXEEXT)'; \ b='openmp/array_slice_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) openmp/cuda_task_01.log: openmp/cuda_task_01$(EXEEXT) @p='openmp/cuda_task_01$(EXEEXT)'; \ b='openmp/cuda_task_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) overlap/gpu_concurrency.log: overlap/gpu_concurrency$(EXEEXT) @p='overlap/gpu_concurrency$(EXEEXT)'; \ b='overlap/gpu_concurrency'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) parallel_tasks/explicit_combined_worker.log: parallel_tasks/explicit_combined_worker$(EXEEXT) @p='parallel_tasks/explicit_combined_worker$(EXEEXT)'; \ b='parallel_tasks/explicit_combined_worker'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) parallel_tasks/parallel_kernels.log: parallel_tasks/parallel_kernels$(EXEEXT) @p='parallel_tasks/parallel_kernels$(EXEEXT)'; \ b='parallel_tasks/parallel_kernels'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) parallel_tasks/parallel_kernels_spmd.log: parallel_tasks/parallel_kernels_spmd$(EXEEXT) @p='parallel_tasks/parallel_kernels_spmd$(EXEEXT)'; \ b='parallel_tasks/parallel_kernels_spmd'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) parallel_tasks/spmd_peager.log: parallel_tasks/spmd_peager$(EXEEXT) @p='parallel_tasks/spmd_peager$(EXEEXT)'; \ b='parallel_tasks/spmd_peager'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) parallel_tasks/cuda_only.log: parallel_tasks/cuda_only$(EXEEXT) @p='parallel_tasks/cuda_only$(EXEEXT)'; \ b='parallel_tasks/cuda_only'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) perfmodels/regression_based.log: perfmodels/regression_based$(EXEEXT) @p='perfmodels/regression_based$(EXEEXT)'; \ b='perfmodels/regression_based'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) perfmodels/non_linear_regression_based.log: perfmodels/non_linear_regression_based$(EXEEXT) @p='perfmodels/non_linear_regression_based$(EXEEXT)'; \ b='perfmodels/non_linear_regression_based'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) perfmodels/feed.log: perfmodels/feed$(EXEEXT) @p='perfmodels/feed$(EXEEXT)'; \ b='perfmodels/feed'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) perfmodels/user_base.log: perfmodels/user_base$(EXEEXT) @p='perfmodels/user_base$(EXEEXT)'; \ b='perfmodels/user_base'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) perfmodels/valid_model.log: perfmodels/valid_model$(EXEEXT) @p='perfmodels/valid_model$(EXEEXT)'; \ b='perfmodels/valid_model'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) perfmodels/memory.log: perfmodels/memory$(EXEEXT) @p='perfmodels/memory$(EXEEXT)'; \ b='perfmodels/memory'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) sched_policies/data_locality.log: sched_policies/data_locality$(EXEEXT) @p='sched_policies/data_locality$(EXEEXT)'; \ b='sched_policies/data_locality'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) sched_policies/execute_all_tasks.log: sched_policies/execute_all_tasks$(EXEEXT) @p='sched_policies/execute_all_tasks$(EXEEXT)'; \ b='sched_policies/execute_all_tasks'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) sched_policies/prio.log: sched_policies/prio$(EXEEXT) @p='sched_policies/prio$(EXEEXT)'; \ b='sched_policies/prio'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) sched_policies/simple_deps.log: sched_policies/simple_deps$(EXEEXT) @p='sched_policies/simple_deps$(EXEEXT)'; \ b='sched_policies/simple_deps'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) sched_policies/simple_cpu_gpu_sched.log: sched_policies/simple_cpu_gpu_sched$(EXEEXT) @p='sched_policies/simple_cpu_gpu_sched$(EXEEXT)'; \ b='sched_policies/simple_cpu_gpu_sched'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) fortran90/init_01.log: fortran90/init_01$(EXEEXT) @p='fortran90/init_01$(EXEEXT)'; \ b='fortran90/init_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/tag_task_data_deps.log: main/tag_task_data_deps$(EXEEXT) @p='main/tag_task_data_deps$(EXEEXT)'; \ b='main/tag_task_data_deps'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/reclaim.log: datawizard/reclaim$(EXEEXT) @p='datawizard/reclaim$(EXEEXT)'; \ b='datawizard/reclaim'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) coverage/coverage.sh.log: coverage/coverage.sh @p='coverage/coverage.sh'; \ b='coverage/coverage.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/locality.sh.log: datawizard/locality.sh @p='datawizard/locality.sh'; \ b='datawizard/locality.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) overlap/overlap.sh.log: overlap/overlap.sh @p='overlap/overlap.sh'; \ b='overlap/overlap.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(PROGRAMS) $(SCRIPTS) $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(examplebindir)" "$(DESTDIR)$(examplebindir)" "$(DESTDIR)$(STARPU_OPENCL_DATAdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f datawizard/$(DEPDIR)/$(am__dirstamp) -rm -f datawizard/$(am__dirstamp) -rm -f datawizard/interfaces/$(am__dirstamp) -rm -f datawizard/interfaces/bcsr/$(DEPDIR)/$(am__dirstamp) -rm -f datawizard/interfaces/bcsr/$(am__dirstamp) -rm -f datawizard/interfaces/block/$(DEPDIR)/$(am__dirstamp) -rm -f datawizard/interfaces/block/$(am__dirstamp) -rm -f datawizard/interfaces/coo/$(DEPDIR)/$(am__dirstamp) -rm -f datawizard/interfaces/coo/$(am__dirstamp) -rm -f datawizard/interfaces/csr/$(DEPDIR)/$(am__dirstamp) -rm -f datawizard/interfaces/csr/$(am__dirstamp) -rm -f datawizard/interfaces/matrix/$(DEPDIR)/$(am__dirstamp) -rm -f datawizard/interfaces/matrix/$(am__dirstamp) -rm -f datawizard/interfaces/multiformat/$(DEPDIR)/$(am__dirstamp) -rm -f datawizard/interfaces/multiformat/$(am__dirstamp) -rm -f datawizard/interfaces/multiformat/advanced/$(am__dirstamp) -rm -f datawizard/interfaces/variable/$(DEPDIR)/$(am__dirstamp) -rm -f datawizard/interfaces/variable/$(am__dirstamp) -rm -f datawizard/interfaces/vector/$(DEPDIR)/$(am__dirstamp) -rm -f datawizard/interfaces/vector/$(am__dirstamp) -rm -f datawizard/interfaces/void/$(am__dirstamp) -rm -f disk/$(am__dirstamp) -rm -f errorcheck/$(am__dirstamp) -rm -f fortran90/$(am__dirstamp) -rm -f helper/$(am__dirstamp) -rm -f main/$(DEPDIR)/$(am__dirstamp) -rm -f main/$(am__dirstamp) -rm -f main/driver_api/$(am__dirstamp) -rm -f microbenchs/$(am__dirstamp) -rm -f openmp/$(am__dirstamp) -rm -f overlap/$(DEPDIR)/$(am__dirstamp) -rm -f overlap/$(am__dirstamp) -rm -f parallel_tasks/$(am__dirstamp) -rm -f perfmodels/$(am__dirstamp) -rm -f sched_policies/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-recursive clean-am: clean-checkPROGRAMS clean-examplebinPROGRAMS clean-generic \ clean-libtool clean-noinstPROGRAMS mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-examplebinPROGRAMS install-examplebinSCRIPTS \ install-nobase_STARPU_OPENCL_DATADATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-examplebinPROGRAMS uninstall-examplebinSCRIPTS \ uninstall-nobase_STARPU_OPENCL_DATADATA .MAKE: $(am__recursive_targets) all check check-am install install-am \ install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-TESTS check-am clean clean-checkPROGRAMS \ clean-examplebinPROGRAMS clean-generic clean-libtool \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-examplebinPROGRAMS \ install-examplebinSCRIPTS install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-nobase_STARPU_OPENCL_DATADATA install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am recheck tags tags-am uninstall \ uninstall-am uninstall-examplebinPROGRAMS \ uninstall-examplebinSCRIPTS \ uninstall-nobase_STARPU_OPENCL_DATADATA .PRECIOUS: Makefile showcheck: -cat $(TEST_LOGS) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q " runtime error: " $(TEST_LOGS) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET @STARPU_SIMGRID_TRUE@export STARPU_PERF_MODEL_DIR @STARPU_SIMGRID_TRUE@export STARPU_HOSTNAME @STARPU_SIMGRID_TRUE@export MALLOC_PERTURB_ # TODO define NVCCFLAGS @STARPU_USE_CUDA_TRUE@NVCC ?= nvcc @STARPU_USE_CUDA_TRUE@.cu.cubin: @STARPU_USE_CUDA_TRUE@ $(MKDIR_P) `dirname $@` @STARPU_USE_CUDA_TRUE@ $(NVCC) -cubin $< -o $@ --compiler-options -fno-strict-aliasing $(NVCCFLAGS) @STARPU_USE_CUDA_TRUE@.cu.o: @STARPU_USE_CUDA_TRUE@ $(MKDIR_P) `dirname $@` @STARPU_USE_CUDA_TRUE@ $(NVCC) $< -c -o $@ --compiler-options -fno-strict-aliasing $(NVCCFLAGS) -I${includedir} # Fortran90 tests # - list explicit dependences to control proper module files generation # - the overriding rule fully disables the corresponing default rule, thus # the default rule body must be copied entirely @STARPU_HAVE_FC_TRUE@starpu_mod.mod: starpu_mod.o @STARPU_HAVE_FC_TRUE@starpu_mod.o: $(top_srcdir)/include/starpu_mod.f90 @STARPU_HAVE_FC_TRUE@ $(AM_V_FC)$(FC) $(fortran90_init_01_FCFLAGS) $(FCFLAGS) -c -o $@ '$(top_srcdir)/'include/starpu_mod.f90 @STARPU_HAVE_FC_TRUE@init_01.o: $(top_srcdir)/tests/fortran90/init_01.f90 starpu_mod.mod @STARPU_HAVE_FC_TRUE@ $(AM_V_FC)$(FC) $(fortran90_init_01_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'fortran90/init_01.f90' || echo '$(srcdir)/'`fortran90/init_01.f90 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.2.3+dfsg/tests/coverage/000077500000000000000000000000001320135501600167035ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/coverage/coverage.sh000077500000000000000000000102101320135501600210270ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010, 2017 Université de Bordeaux # Copyright (C) 2010, 2011 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. exampledir=../examples/ check_success() { if [ $1 != 0 ] ; then echo "failure" exit $1 fi } apps() { if [ -f $exampledir/basic_examples/block ] ; then echo "block opencl" STARPU_NCUDA=0 STARPU_NCPUS=0 $exampledir/basic_examples/block check_success $? fi if [ -f $exampledir/basic_examples/variable ] ; then echo "variable opencl" STARPU_NCUDA=0 STARPU_NCPUS=0 $exampledir/basic_examples/variable 100 check_success $? echo "variable no worker" STARPU_NCUDA=0 STARPU_NOPENCL=0 STARPU_NCPUS=0 $exampledir/basic_examples/variable check_success $? fi if [ -f $exampledir/incrementer/incrementer ] ; then echo "incrementer opencl" STARPU_NCUDA=0 STARPU_NCPUS=0 $exampledir/incrementer/incrementer 10 check_success $? echo "incrementer no worker" STARPU_NCUDA=0 STARPU_NOPENCL=0 STARPU_NCPUS=0 $exampledir/incrementer/incrementer check_success $? fi if [ -f $exampledir/tag_example/tag_example ] ; then echo "tag_example" $exampledir/tag_example/tag_example -iter 64 -i 128 -j 24 check_success $? fi if [ -f $exampledir/tag_example/tag_example2 ] ; then echo "tag_example2" $exampledir/tag_example/tag_example2 -iter 64 -i 128 check_success $? fi if [ -f $exampledir/cholesky/dw_cholesky ] ; then echo "chol.dm" STARPU_CALIBRATE=1 STARPU_SCHED="dm" $exampledir/cholesky/dw_cholesky -pin check_success $? echo "chol.dmda" STARPU_CALIBRATE=1 STARPU_SCHED="dmda" $exampledir/cholesky/dw_cholesky -pin check_success $? echo "chol.cpu" STARPU_CALIBRATE=1 STARPU_NCUDA=0 STARPU_SCHED="dm" $exampledir/cholesky/dw_cholesky -pin check_success $? echo "chol.gpu" STARPU_CALIBRATE=1 STARPU_NCPUS=0 STARPU_SCHED="dm" $exampledir/cholesky/dw_cholesky -pin check_success $? fi if [ -f $exampledir/heat/heat ] ; then echo "heat.dm.4k.calibrate.v2" STARPU_CALIBRATE=1 STARPU_SCHED="dm" $exampledir/heat/heat -ntheta 66 -nthick 66 -nblocks 4 -v2 -pin check_success $? echo "heat.dm.8k.calibrate.v2" STARPU_CALIBRATE=1 STARPU_SCHED="dm" $exampledir/heat/heat -ntheta 66 -nthick 130 -nblocks 8 -v2 -pin check_success $? echo "heat.dm.8k.no.pin.v2" STARPU_SCHED="dm" $exampledir/heat/heat -ntheta 66 -nthick 130 -nblocks 8 -v2 check_success $? # echo "heat.dm.8k.v2.no.prio" # STARPU_SCHED="no-prio" $exampledir/heat/heat -ntheta 66 -nthick 130 -nblocks 8 -pin -v2 # check_success $? echo "heat.dm.8k.v2.random" STARPU_SCHED="random" $exampledir/heat/heat -ntheta 66 -nthick 130 -nblocks 8 -pin -v2 check_success $? echo "heat.dm.8k.v2" STARPU_SCHED="dm" $exampledir/heat/heat -ntheta 66 -nthick 130 -nblocks 8 -pin -v2 check_success $? echo "heat.greedy.8k.v2" STARPU_SCHED="greedy" $exampledir/heat/heat -ntheta 66 -nthick 130 -nblocks 8 -pin -v2 check_success $? echo "heat.8k.cg" $exampledir/heat/heat -ntheta 66 -nthick 130 -nblocks 8 -pin -v2 -cg check_success $? echo "heat.dm.8k.cg" STARPU_SCHED="dm" $exampledir/heat/heat -ntheta 66 -nthick 130 -nblocks 8 -pin -v2 -cg check_success $? fi if [ -f $exampledir/mult/dw_mult_no_stride ] ; then echo "mult.dm.common" STARPU_SCHED="dm" $exampledir/mult/dw_mult_no_stride -nblocks 4 -x 4096 -y 4096 -z 1024 -pin -common-model check_success $? echo "mult.dm" STARPU_CALIBRATE=1 STARPU_SCHED="dm" $exampledir/mult/dw_mult_no_stride -nblocks 8 -x 4096 -y 4096 -z 4096 -pin check_success $? echo "mult.dmda" STARPU_CALIBRATE=1 STARPU_SCHED="dmda" $exampledir/mult/dw_mult_no_stride -nblocks 8 -x 4096 -y 4096 -z 4096 -pin check_success $? fi } apps; starpu-1.2.3+dfsg/tests/datawizard/000077500000000000000000000000001320135501600172425ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/datawizard/acquire_cb.c000066400000000000000000000027331320135501600215100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" /* * Test that when using starpu_data_acquire_cb, the callback is properly called */ unsigned token = 0; starpu_data_handle_t token_handle; static void callback(void *arg STARPU_ATTRIBUTE_UNUSED) { token = 42; starpu_data_release(token_handle); } int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&token_handle, STARPU_MAIN_RAM, (uintptr_t)&token, sizeof(unsigned)); starpu_data_acquire_cb(token_handle, STARPU_RW, callback, NULL); starpu_data_unregister(token_handle); FPRINTF(stderr, "Token: %u\n", token); starpu_shutdown(); return (token == 42) ? EXIT_SUCCESS : EXIT_FAILURE; } starpu-1.2.3+dfsg/tests/datawizard/acquire_cb_insert.c000066400000000000000000000077061320135501600231010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Test that inserting a task from the callback of a starpu_data_acquire_cb * call, with proper dependency with an already-submitted task */ #define N 16 #define M 4 #define X 2 void which_index_cpu(void *descr[], void *_args) { int *x0 = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); /* A real case would actually compute something */ *x0 = X; } struct starpu_codelet which_index = { .cpu_funcs = {which_index_cpu}, .cpu_funcs_name = {"which_index_cpu"}, .nbuffers = 1, .modes = {STARPU_W} }; void work_cpu(void *descr[], void *_args) { int i, n = STARPU_VECTOR_GET_NX(descr[0]); float *x0 = (float *)STARPU_VECTOR_GET_PTR(descr[0]); for (i = 0; i < n; i++) x0[i] = i + 1; } struct starpu_codelet work = { .cpu_funcs = {work_cpu}, .cpu_funcs_name = {"work_cpu"}, .nbuffers = 1, .modes = {STARPU_W} }; static int x; static starpu_data_handle_t x_handle, f_handle; static void callback(void *arg) { starpu_task_insert(&work, STARPU_W, starpu_data_get_sub_data(f_handle, 1, x), 0); starpu_data_release(x_handle); } int main(int argc, char **argv) { int i, ret; float *f; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); if(starpu_cpu_worker_get_count() == 0) return STARPU_TEST_SKIPPED; /* Declare x */ starpu_variable_data_register(&x_handle, STARPU_MAIN_RAM, (uintptr_t)&x, sizeof(x)); /* Allocate and Declare f */ ret = starpu_malloc((void**)&f, N * sizeof(*f)); STARPU_CHECK_RETURN_VALUE(ret, "starpu_malloc"); memset(f, 0, N * sizeof(*f)); starpu_vector_data_register(&f_handle, STARPU_MAIN_RAM, (uintptr_t)f, N, sizeof(*f)); /* Partition f */ struct starpu_data_filter filter = { .filter_func = starpu_vector_filter_block, .nchildren = M, }; starpu_data_partition(f_handle, &filter); /* Compute which portion we will work on */ ret = starpu_task_insert(&which_index, STARPU_W, x_handle, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); /* And submit the corresponding task */ #ifdef __GCC__ STARPU_DATA_ACQUIRE_CB( x_handle, STARPU_R, starpu_task_insert(&work, STARPU_W, starpu_data_get_sub_data(f_handle, 1, x), 0) ); #else starpu_data_acquire_cb(x_handle, STARPU_R, callback, NULL); #endif /* Wait for acquisition (and thus insertion) */ starpu_data_acquire(x_handle, STARPU_W); starpu_data_release(x_handle); /* Now wait for the inserted task */ ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); /* Can now clean */ starpu_data_unpartition(f_handle, STARPU_MAIN_RAM); starpu_data_unregister(f_handle); starpu_data_unregister(x_handle); FPRINTF(stderr, "VALUES: %d", x); for(i=0 ; i #include #include "../helper.h" /* * Call acquire/release in competition with inserting task working on the same data */ #ifdef STARPU_QUICK_CHECK static unsigned ntasks = 10; #else static unsigned ntasks = 10000; #endif #ifdef STARPU_USE_CUDA extern void increment_cuda(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); #endif #ifdef STARPU_USE_OPENCL extern void increment_opencl(void *buffers[], void *args); #endif void increment_cpu(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); (*tokenptr)++; } static struct starpu_codelet increment_cl = { .modes = { STARPU_RW }, .cpu_funcs = {increment_cpu}, #ifdef STARPU_USE_CUDA .cuda_funcs = {increment_cuda}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {increment_opencl}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs_name = {"increment_cpu"}, .nbuffers = 1 }; unsigned token = 0; starpu_data_handle_t token_handle; static int increment_token(void) { int ret; struct starpu_task *task = starpu_task_create(); task->synchronous = 1; task->cl = &increment_cl; task->handles[0] = token_handle; ret = starpu_task_submit(task); return ret; } static void callback(void *arg STARPU_ATTRIBUTE_UNUSED) { token++; starpu_data_release(token_handle); } #ifdef STARPU_USE_OPENCL struct starpu_opencl_program opencl_program; #endif int main(int argc, char **argv) { unsigned i; int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_load_opencl_from_file("tests/datawizard/acquire_release_opencl_kernel.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif starpu_variable_data_register(&token_handle, STARPU_MAIN_RAM, (uintptr_t)&token, sizeof(unsigned)); FPRINTF(stderr, "Token: %u\n", token); for(i=0; i #include #include "../helper.h" /* * Call acquire/release in competition with inserting task working on the same data */ #ifdef STARPU_QUICK_CHECK static unsigned ntasks = 40; #elif !defined(STARPU_LONG_CHECK) static unsigned ntasks = 4000; #else static unsigned ntasks = 40000; #endif #ifdef STARPU_USE_CUDA extern void increment_cuda(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); #endif #ifdef STARPU_USE_OPENCL extern void increment_opencl(void *buffers[], void *args); #endif void increment_cpu(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); (*tokenptr)++; } static struct starpu_codelet increment_cl = { .modes = { STARPU_RW }, .cpu_funcs = {increment_cpu}, #ifdef STARPU_USE_CUDA .cuda_funcs = {increment_cuda}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {increment_opencl}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs_name = {"increment_cpu"}, .nbuffers = 1 }; unsigned token = 0; starpu_data_handle_t token_handle; static int increment_token(int synchronous) { struct starpu_task *task = starpu_task_create(); task->synchronous = synchronous; task->cl = &increment_cl; task->handles[0] = token_handle; return starpu_task_submit(task); } static void callback(void *arg STARPU_ATTRIBUTE_UNUSED) { starpu_data_release(token_handle); } #ifdef STARPU_DEVEL # warning TODO add threads #endif #ifdef STARPU_USE_OPENCL struct starpu_opencl_program opencl_program; #endif int main(int argc, char **argv) { unsigned i; int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_load_opencl_from_file("tests/datawizard/acquire_release_opencl_kernel.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif starpu_variable_data_register(&token_handle, STARPU_MAIN_RAM, (uintptr_t)&token, sizeof(unsigned)); FPRINTF(stderr, "Token: %u\n", token); for(i=0; i static __global__ void _increment_cuda_codelet(unsigned *val) { val[0]++; } extern "C" void increment_cuda(void *descr[], STARPU_ATTRIBUTE_UNUSED void *cl_arg) { unsigned *val = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); _increment_cuda_codelet<<<1,1, 0, starpu_cuda_get_local_stream()>>>(val); } starpu-1.2.3+dfsg/tests/datawizard/acquire_release_opencl.c000066400000000000000000000030731320135501600241020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include /* * Queue an OpenCL kernel that just increments a variable */ extern struct starpu_opencl_program opencl_program; void increment_opencl(void *buffers[], void *args) { (void) args; int id, devid; cl_int err; cl_kernel kernel; cl_command_queue queue; cl_mem val = (cl_mem)STARPU_VARIABLE_GET_PTR(buffers[0]); id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_program, "_increment_opencl_codelet", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 0, sizeof(val), &val); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=1; size_t local=1; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } starpu_opencl_release_kernel(kernel); } starpu-1.2.3+dfsg/tests/datawizard/acquire_release_opencl_kernel.cl000066400000000000000000000013111320135501600256070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ __kernel void _increment_opencl_codelet(__global unsigned *val) { val[0]++; } starpu-1.2.3+dfsg/tests/datawizard/acquire_try.c000066400000000000000000000050241320135501600217360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2014, 2016-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Try to use data_acquire_try in parallel with tasks */ void func(STARPU_ATTRIBUTE_UNUSED void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { starpu_sleep(0.01); } static struct starpu_codelet cl = { .modes = { STARPU_RW }, .cpu_funcs = {func}, .cuda_funcs = {func}, .opencl_funcs = {func}, .cpu_funcs_name = {"func"}, .nbuffers = 1 }; unsigned token = 0; starpu_data_handle_t token_handle; static void callback(void *arg STARPU_ATTRIBUTE_UNUSED) { starpu_data_release(token_handle); } int main(int argc, char **argv) { unsigned i; int ret; int nacquired; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&token_handle, STARPU_MAIN_RAM, (uintptr_t)&token, sizeof(unsigned)); ret = starpu_task_insert(&cl, STARPU_RW, token_handle, 0); if (ret == -ENODEV) goto enodev; ret = starpu_data_acquire_try(token_handle, STARPU_R); STARPU_ASSERT(ret != 0); starpu_do_schedule(); while ((ret = starpu_data_acquire_try(token_handle, STARPU_R)) != 0) { starpu_sleep(0.001); } ret = starpu_task_insert(&cl, STARPU_RW, token_handle, 0); if (ret == -ENODEV) goto enodev; starpu_data_release(token_handle); starpu_task_wait_for_all(); ret = starpu_data_acquire_try(token_handle, STARPU_R); STARPU_ASSERT(ret == 0); starpu_data_release(token_handle); starpu_data_unregister(token_handle); starpu_shutdown(); return 0; enodev: starpu_data_unregister(token_handle); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/allocate.c000066400000000000000000000152251320135501600211770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" #include #include /* Stress data allocation on a GPU, triggering eviction */ #define SIZE_LIMIT 128 #define STR_LIMIT "128" #define SIZE_ALLOC 128 #if !defined(STARPU_HAVE_SETENV) #warning setenv is not defined. Skipping test int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else static int test_prefetch(unsigned memnodes) { float *buffers[4]; starpu_data_handle_t handles[4]; unsigned i; starpu_ssize_t available_size; buffers[0] = malloc(SIZE_ALLOC*1024*512); STARPU_ASSERT(buffers[0]); /* Prefetch half the memory */ starpu_variable_data_register(&handles[0], STARPU_MAIN_RAM, (uintptr_t)buffers[0], SIZE_ALLOC*1024*512); for(i=1 ; i #include "../helper.h" /* * Trigger re-using a buffer allocation on GPUs */ #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) static void codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { FPRINTF(stderr, "%lx\n", (unsigned long) STARPU_VARIABLE_GET_PTR(descr[0])); FPRINTF(stderr, "codelet\n"); } #endif #ifdef STARPU_USE_CUDA static struct starpu_codelet cuda_cl = { .cuda_funcs = {codelet}, .nbuffers = 1, .modes = {STARPU_R} }; #endif #ifdef STARPU_USE_OPENCL static struct starpu_codelet opencl_cl = { .opencl_funcs = {codelet}, .nbuffers = 1, .modes = {STARPU_R} }; #endif void dotest(struct starpu_codelet *cl) { int ret; int var = 42; starpu_data_handle_t handle; starpu_variable_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)&var, sizeof(var)); ret = starpu_task_insert(cl, STARPU_R, handle, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); starpu_task_wait_for_all(); starpu_data_unregister(handle); starpu_variable_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)&var, sizeof(var)); ret = starpu_task_insert(cl, STARPU_R, handle, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); starpu_task_wait_for_all(); enodev: starpu_data_unregister(handle); } int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_USE_CUDA dotest(&cuda_cl); #endif #ifdef STARPU_USE_OPENCL dotest(&opencl_cl); #endif starpu_shutdown(); return 0; } starpu-1.2.3+dfsg/tests/datawizard/commute.c000066400000000000000000000107751320135501600210710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2014, 2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Trigger various STARPU_R / STARPU_RW / STARPU_RW|COMMUTE patterns */ void begin(void *descr[], void *_args STARPU_ATTRIBUTE_UNUSED) { int *x = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); *x = 0; } static struct starpu_codelet codelet_begin = { .cpu_funcs = {begin}, .cpu_funcs_name = {"begin"}, .nbuffers = 1, .name = "begin", }; void commute1(void *descr[], void *_args STARPU_ATTRIBUTE_UNUSED) { int *x = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); *x = 1; } static struct starpu_codelet codelet_commute1 = { .cpu_funcs = {commute1}, .cpu_funcs_name = {"commute1"}, .nbuffers = 1, .modes = {STARPU_RW | STARPU_COMMUTE}, .name = "commute1", }; void commute2(void *descr[], void *_args STARPU_ATTRIBUTE_UNUSED) { int *x = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); *x = 2; } static struct starpu_codelet codelet_commute2 = { .cpu_funcs = {commute2}, .cpu_funcs_name = {"commute2"}, .nbuffers = 1, .modes = {STARPU_W | STARPU_COMMUTE}, .name = "commute2", }; void commute3(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *_args STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet codelet_commute3 = { .cpu_funcs = {commute3}, .cpu_funcs_name = {"commute3"}, .nbuffers = 1, .modes = {STARPU_RW | STARPU_COMMUTE}, .name = "commute3", }; static struct starpu_codelet codelet_end; void end(void *descr[], void *_args STARPU_ATTRIBUTE_UNUSED) { int *x = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); enum starpu_data_access_mode end_mode = *(enum starpu_data_access_mode*) _args; if (end_mode & STARPU_W) (*x)++; } static struct starpu_codelet codelet_end = { .cpu_funcs = {end}, .cpu_funcs_name = {"end"}, .nbuffers = 1, .name = "end", }; static int x; static starpu_data_handle_t x_handle, f_handle; static void test(enum starpu_data_access_mode begin_mode, enum starpu_data_access_mode end_mode, int order) { struct starpu_task *begin_t, *commute1_t, *commute2_t, *end_t; int ret; codelet_begin.modes[0] = begin_mode; codelet_end.modes[0] = end_mode; begin_t = starpu_task_create(); begin_t->cl = &codelet_begin; begin_t->handles[0] = x_handle; begin_t->use_tag = 1; begin_t->tag_id = (order<<20) + (begin_mode<<10) + end_mode; commute1_t = starpu_task_create(); commute1_t->cl = &codelet_commute1; commute1_t->handles[0] = x_handle; commute2_t = starpu_task_create(); commute2_t->cl = &codelet_commute2; commute2_t->handles[0] = x_handle; if (order) starpu_task_declare_deps_array(commute2_t, 1, &commute1_t); else starpu_task_declare_deps_array(commute1_t, 1, &commute2_t); end_t = starpu_task_create(); end_t->cl = &codelet_end; end_t->handles[0] = x_handle; end_t->detach = 0; end_t->cl_arg = &end_mode; end_t->cl_arg_size = sizeof(end_mode); if (starpu_task_submit(begin_t) == -ENODEV) exit(STARPU_TEST_SKIPPED); if (starpu_task_submit(commute1_t) == -ENODEV) exit(STARPU_TEST_SKIPPED); if (starpu_task_submit(commute2_t) == -ENODEV) exit(STARPU_TEST_SKIPPED); starpu_task_insert(&codelet_commute3, STARPU_RW|STARPU_COMMUTE, x_handle, 0); if (starpu_task_submit(end_t) == -ENODEV) exit(STARPU_TEST_SKIPPED); ret = starpu_task_wait(end_t); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); starpu_data_acquire(x_handle, STARPU_R); if (x != 1 + order + !!(end_mode & STARPU_W)) exit(EXIT_FAILURE); starpu_data_release(x_handle); } int main(int argc, char **argv) { int i, ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* Declare x */ starpu_variable_data_register(&x_handle, STARPU_MAIN_RAM, (uintptr_t)&x, sizeof(x)); for (i = 0; i <= 1; i++) { test(STARPU_R, STARPU_R, i); test(STARPU_W, STARPU_R, i); test(STARPU_W, STARPU_RW, i); test(STARPU_R, STARPU_RW, i); } starpu_data_unregister(x_handle); starpu_shutdown(); STARPU_RETURN(0); } starpu-1.2.3+dfsg/tests/datawizard/commute2.c000066400000000000000000000055541320135501600211520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2016 Université Bordeaux * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include "../helper.h" #include "../helper.h" /* * Test that STARPU_RW vs STARPU_RW|STARPU_COMMUTE get proper dependency */ static unsigned cnt; static void cpu_memcpy(void *descr[], void *cl_arg) { int me = (uintptr_t)cl_arg; int res; FPRINTF(stderr,"%d\n", me); if (me == 0) { /* let commute tasks potentially happen */ usleep(100000); res = STARPU_ATOMIC_ADD(&cnt,1); STARPU_ASSERT(res == 1); } else { res = STARPU_ATOMIC_ADD(&cnt,1); STARPU_ASSERT(res != 1); } } static struct starpu_codelet my_cl = { .where = STARPU_CPU, .cpu_funcs = {cpu_memcpy}, .nbuffers = STARPU_VARIABLE_NBUFFERS }; int main() { double *res, *a; unsigned n=100000, i; starpu_data_handle_t res_handle, a_handle; unsigned nb_tasks = 10, worker; int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_malloc((void**)&res, n*sizeof(double)); starpu_malloc((void**)&a, n*sizeof(double)); for(i=0; i < n; i++) res[i] = a[i] = 1.0; starpu_vector_data_register(&res_handle, 0, (uintptr_t)res, (uint32_t)n, sizeof(double)); starpu_vector_data_register(&a_handle, 0, (uintptr_t)a, (uint32_t)n, sizeof(double)); starpu_data_acquire(a_handle, STARPU_RW); for (i = 0; i < nb_tasks; i++) { struct starpu_task *task = starpu_task_create(); task->cl=&my_cl; task->nbuffers = i == 0 ? 2 : 1; task->handles[0] = res_handle; if (i == 0) task->modes[0] = STARPU_RW; else task->modes[0] = STARPU_RW | STARPU_COMMUTE; task->handles[1] = a_handle; task->modes[1] = STARPU_R; task->cl_arg = (void*)(uintptr_t)i; ret = starpu_task_submit(task); if (ret == -ENODEV) { starpu_data_release(a_handle); goto enodev; } STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } /* let commute tasks potentially happen */ usleep(100000); starpu_data_release(a_handle); starpu_task_wait_for_all (); enodev: starpu_data_unregister(res_handle); starpu_data_unregister(a_handle); starpu_free(res); starpu_free(a); starpu_shutdown(); return ret == -ENODEV ? STARPU_TEST_SKIPPED : EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/datawizard/copy.c000066400000000000000000000063721320135501600203700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" /* * Trigger a lot of transfers of a single variable between CPUs and GPUs */ #ifdef STARPU_QUICK_CHECK static unsigned nloops = 10; #else static unsigned nloops = 1000; #endif void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet cpu_codelet = { .cpu_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 1, .modes = {STARPU_RW} }; static struct starpu_codelet gpu_codelet = { .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 1, .modes = {STARPU_RW} }; int main(int argc, char **argv) { float foo; starpu_data_handle_t float_array_handle; unsigned i; int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); if (starpu_worker_get_count_by_type(STARPU_CUDA_WORKER) == 0 && starpu_worker_get_count_by_type(STARPU_OPENCL_WORKER) == 0 && starpu_worker_get_count_by_type(STARPU_MIC_WORKER) == 0) { FPRINTF(stderr, "This application requires a CUDA , OpenCL or MIC Worker\n"); starpu_shutdown(); return STARPU_TEST_SKIPPED; } foo = 0.0f; starpu_variable_data_register(&float_array_handle, STARPU_MAIN_RAM, (uintptr_t)&foo, sizeof(foo)); for (i = 0; i < nloops; i++) { struct starpu_task *task_cpu, *task_gpu; task_cpu = starpu_task_create(); task_gpu = starpu_task_create(); task_cpu->cl = &cpu_codelet; task_cpu->callback_func = NULL; task_cpu->handles[0] = float_array_handle; task_gpu->cl = &gpu_codelet; task_gpu->callback_func = NULL; task_gpu->handles[0] = float_array_handle; ret = starpu_task_submit(task_cpu); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(task_gpu); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_data_unregister(float_array_handle); starpu_shutdown(); return EXIT_SUCCESS; enodev: starpu_data_unregister(float_array_handle); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/critical_section_with_void_interface.c000066400000000000000000000046161320135501600270270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2016 Université de Bordeaux * Copyright (C) 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include "../helper.h" /* * Use a void interface to protect the access to a variable that is not declared to StarPU */ starpu_data_handle_t void_handle; int critical_var; void critical_section(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { /* We do not protect this variable because it is only accessed when the * "void_handle" piece of data is accessed. */ critical_var++; } static struct starpu_codelet cl = { .cpu_funcs = {critical_section}, .cuda_funcs = {critical_section}, .opencl_funcs = {critical_section}, .nbuffers = 1, .modes = {STARPU_RW} }; int main(int argc, char **argv) { #ifdef STARPU_QUICK_CHECK int ntasks = 10; #else int ntasks = 1000; #endif int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); critical_var = 0; /* Create a void data which will be used as an exclusion mechanism. */ starpu_void_data_register(&void_handle); int i; for (i = 0; i < ntasks; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->handles[0] = void_handle; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_data_unregister(void_handle); ret = (critical_var == ntasks) ? EXIT_SUCCESS : EXIT_FAILURE; starpu_shutdown(); return ret; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/cuda_codelet_unsigned_inc.cu000066400000000000000000000020331320135501600247310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2014 Université de Bordeaux * Copyright (C) 2010, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "./mpi_like.h" static __global__ void _cuda_unsigned_inc(unsigned *val) { val[0]++; } extern "C" void cuda_codelet_unsigned_inc(void *descr[], STARPU_ATTRIBUTE_UNUSED void *cl_arg) { unsigned *val = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); _cuda_unsigned_inc<<<1,1, 0, starpu_cuda_get_local_stream()>>>(val); } starpu-1.2.3+dfsg/tests/datawizard/data_implicit_deps.c000066400000000000000000000135131320135501600232270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2013, 2015-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include "../helper.h" /* * Test that implicit dependencies get properly computed */ #define VECTORSIZE 1024 static unsigned *A, *B, *C, *D; starpu_data_handle_t A_handle, B_handle, C_handle, D_handle; static unsigned var = 0; starpu_data_handle_t var_handle; void f(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *_args STARPU_ATTRIBUTE_UNUSED) { STARPU_SKIP_IF_VALGRIND; usleep(200000); } static struct starpu_codelet cl_f = { .modes = { STARPU_RW, STARPU_R, STARPU_RW }, .cpu_funcs = {f}, .cuda_funcs = {f}, .opencl_funcs = {f}, .cpu_funcs_name = {"f"}, .nbuffers = 3, }; void g(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; unsigned *val = (unsigned *) STARPU_VARIABLE_GET_PTR(descr[0]); usleep(100000); *val = 42; } #ifdef STARPU_USE_CUDA void g_cuda(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; unsigned *val = (unsigned *) STARPU_VARIABLE_GET_PTR(descr[0]); unsigned value = 42; usleep(100000); cudaMemcpy(val, &value, sizeof(value), cudaMemcpyHostToDevice); } #endif static struct starpu_codelet cl_g = { .modes = { STARPU_RW, STARPU_R, STARPU_RW }, .cpu_funcs = {g}, #ifdef STARPU_USE_CUDA .cuda_funcs = {g_cuda}, #endif // TODO //.opencl_funcs = {g}, .cpu_funcs_name = {"g"}, .nbuffers = 3, }; void h(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; unsigned *val = (unsigned *) STARPU_VARIABLE_GET_PTR(descr[0]); FPRINTF(stderr, "VAR %u (should be 42)\n", *val); STARPU_ASSERT(*val == 42); } #ifdef STARPU_USE_CUDA void h_cuda(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; unsigned *val = (unsigned *) STARPU_VARIABLE_GET_PTR(descr[0]); unsigned value; cudaMemcpy(&value, val, sizeof(value), cudaMemcpyDeviceToHost); FPRINTF(stderr, "VAR %u (should be 42)\n", value); STARPU_ASSERT(value == 42); } #endif static struct starpu_codelet cl_h = { .modes = { STARPU_RW, STARPU_R, STARPU_RW }, .cpu_funcs = {h}, #ifdef STARPU_USE_CUDA .cuda_funcs = {h_cuda}, #endif // TODO //.opencl_funcs = {h}, .cpu_funcs_name = {"h"}, .nbuffers = 3 }; int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); A = (unsigned *) malloc(VECTORSIZE*sizeof(unsigned)); B = (unsigned *) malloc(VECTORSIZE*sizeof(unsigned)); C = (unsigned *) malloc(VECTORSIZE*sizeof(unsigned)); D = (unsigned *) malloc(VECTORSIZE*sizeof(unsigned)); starpu_vector_data_register(&A_handle, STARPU_MAIN_RAM, (uintptr_t)A, VECTORSIZE, sizeof(unsigned)); starpu_vector_data_register(&B_handle, STARPU_MAIN_RAM, (uintptr_t)B, VECTORSIZE, sizeof(unsigned)); starpu_vector_data_register(&C_handle, STARPU_MAIN_RAM, (uintptr_t)C, VECTORSIZE, sizeof(unsigned)); starpu_vector_data_register(&D_handle, STARPU_MAIN_RAM, (uintptr_t)D, VECTORSIZE, sizeof(unsigned)); starpu_variable_data_register(&var_handle, STARPU_MAIN_RAM, (uintptr_t)(&var), sizeof(var)); #if 0 starpu_data_set_sequential_consistency_flag(A_handle, 0); starpu_data_set_sequential_consistency_flag(B_handle, 0); starpu_data_set_sequential_consistency_flag(C_handle, 0); starpu_data_set_sequential_consistency_flag(D_handle, 0); #endif /* f(Ar, Brw): sleep * g(Br; Crw); sleep, var = 42 * h(Cr; Drw); check that var == 42 */ struct starpu_task *task_f = starpu_task_create(); task_f->cl = &cl_f; task_f->handles[0] = var_handle; task_f->handles[1] = A_handle; task_f->handles[2] = B_handle; ret = starpu_task_submit(task_f); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); struct starpu_task *task_g = starpu_task_create(); task_g->cl = &cl_g; task_g->handles[0] = var_handle; task_g->handles[1] = B_handle; task_g->handles[2] = C_handle; ret = starpu_task_submit(task_g); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); struct starpu_task *task_h = starpu_task_create(); task_h->cl = &cl_h; task_h->handles[0] = var_handle; task_h->handles[1] = C_handle; task_h->handles[2] = D_handle; ret = starpu_task_submit(task_h); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_data_unregister(A_handle); starpu_data_unregister(B_handle); starpu_data_unregister(C_handle); starpu_data_unregister(D_handle); starpu_data_unregister(var_handle); free(A); free(B); free(C); free(D); starpu_shutdown(); return EXIT_SUCCESS; enodev: starpu_data_unregister(A_handle); starpu_data_unregister(B_handle); starpu_data_unregister(C_handle); starpu_data_unregister(D_handle); starpu_data_unregister(var_handle); free(A); free(B); free(C); free(D); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/data_invalidation.c000066400000000000000000000134421320135501600230640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012, 2014, 2016 Université de Bordeaux * Copyright (C) 2012, 2013, 2015, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include "../helper.h" /* * Try to mix starpu_data_invalidate and starpu_data_invalidate_submit * calls with task insertions */ #ifdef STARPU_QUICK_CHECK # define NLOOPS 100 #else # define NLOOPS 1000 #endif #define VECTORSIZE 1024 static starpu_data_handle_t v_handle; /* * Memset */ #ifdef STARPU_USE_CUDA static void cuda_memset_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; char *buf = (char *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned length = STARPU_VECTOR_GET_NX(descr[0]); cudaMemsetAsync(buf, 42, length, starpu_cuda_get_local_stream()); } #endif #ifdef STARPU_USE_OPENCL static void opencl_memset_codelet(void *buffers[], void *args) { (void) args; cl_command_queue queue; int id = starpu_worker_get_id_check(); int devid = starpu_worker_get_devid(id); starpu_opencl_get_queue(devid, &queue); cl_mem buffer = (cl_mem) STARPU_VECTOR_GET_DEV_HANDLE(buffers[0]); unsigned length = STARPU_VECTOR_GET_NX(buffers[0]); char *v = malloc(length); STARPU_ASSERT(v != NULL); memset(v, 42, length); clEnqueueWriteBuffer(queue, buffer, CL_FALSE, 0, /* offset */ length, /* sizeof (char) */ v, 0, /* num_events_in_wait_list */ NULL, /* event_wait_list */ NULL /* event */); } #endif /* !STARPU_USE_OPENCL */ void cpu_memset_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; char *buf = (char *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned length = STARPU_VECTOR_GET_NX(descr[0]); memset(buf, 42, length * sizeof(*buf)); } static struct starpu_codelet memset_cl = { .cpu_funcs = {cpu_memset_codelet}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_memset_codelet}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_memset_codelet}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs_name = {"cpu_memset_codelet"}, .nbuffers = 1, .modes = {STARPU_W} }; /* * Check content */ void cpu_check_content_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; char *buf = (char *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned length = STARPU_VECTOR_GET_NX(descr[0]); unsigned i; for (i = 0; i < length; i++) { if (buf[i] != 42) { FPRINTF(stderr, "buf[%u] is '%c' while it should be '%c'\n", i, buf[i], 42); exit(-1); } } } static struct starpu_codelet check_content_cl = { .cpu_funcs = {cpu_check_content_codelet}, .cpu_funcs_name = {"cpu_check_content_codelet"}, .nbuffers = 1, .modes = {STARPU_R} }; int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); if(starpu_cpu_worker_get_count() == 0) return STARPU_TEST_SKIPPED; /* The buffer should never be explicitely allocated */ starpu_vector_data_register(&v_handle, (uint32_t)-1, (uintptr_t)NULL, VECTORSIZE, sizeof(char)); unsigned loop; for (loop = 0; loop < NLOOPS; loop++) { struct starpu_task *memset_task; struct starpu_task *check_content_task; memset_task = starpu_task_create(); memset_task->cl = &memset_cl; memset_task->handles[0] = v_handle; memset_task->detach = 0; ret = starpu_task_submit(memset_task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(memset_task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); check_content_task = starpu_task_create(); check_content_task->cl = &check_content_cl; check_content_task->handles[0] = v_handle; check_content_task->detach = 0; ret = starpu_task_submit(check_content_task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(check_content_task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); starpu_data_invalidate(v_handle); } for (loop = 0; loop < NLOOPS; loop++) { struct starpu_task *memset_task; struct starpu_task *check_content_task; memset_task = starpu_task_create(); memset_task->cl = &memset_cl; memset_task->handles[0] = v_handle; ret = starpu_task_submit(memset_task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); check_content_task = starpu_task_create(); check_content_task->cl = &check_content_cl; check_content_task->handles[0] = v_handle; ret = starpu_task_submit(check_content_task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_data_invalidate_submit(v_handle); } /* this should get rid of automatically allocated buffers */ starpu_data_unregister(v_handle); starpu_shutdown(); return EXIT_SUCCESS; enodev: starpu_data_unregister(v_handle); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/data_lookup.c000066400000000000000000000142371320135501600217170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #undef NDEBUG #include #include #include #include #include "../helper.h" /* * Check that starpu_data_lookup returns the proper data handle, given * the registered buffer address */ void task(void **buffers, void *args) { float *numbers; size_t size, i; numbers = (float *) STARPU_VECTOR_GET_PTR(buffers[0]); starpu_codelet_unpack_args (args, &size); for(i = 0; i < size; i++) { numbers[i] = i; } } static struct starpu_codelet cl = { .cpu_funcs = {task}, .cpu_funcs_name = {"task"}, .nbuffers = 1, .modes = {STARPU_W} }; static int test_lazy_allocation(void) { static const size_t count = 123; size_t i; void *pointer; starpu_data_handle_t handle; int ret; /* Lazily-allocated vector. */ starpu_vector_data_register(&handle, -1, 0 /* NULL */, count, sizeof(float)); ret = starpu_task_insert(&cl, STARPU_W, handle, STARPU_VALUE, &count, sizeof(size_t), 0); if (ret == -ENODEV) return ret; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ /* Acquire the handle, forcing a local allocation. */ ret = starpu_data_acquire(handle, STARPU_R); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire"); /* Make sure we have a local pointer to it. */ pointer = starpu_data_get_local_ptr(handle); STARPU_ASSERT(pointer != NULL); for(i = 0; i < count; i++) { float *numbers = (float *)pointer; STARPU_ASSERT(numbers[i] == i); } /* Make sure the pointer/handle mapping is up-to-date. */ STARPU_ASSERT(starpu_data_lookup(pointer) == handle); starpu_data_release(handle); starpu_data_unregister(handle); STARPU_ASSERT(starpu_data_lookup(pointer) == NULL); return 0; } #define VECTOR_COUNT 12 #define VARIABLE_COUNT 42 #define VECTOR_SIZE 123 static void test_filters(void) { #define CHILDREN_COUNT 10 int ret, i; int *ptr, *children_pointers[CHILDREN_COUNT]; starpu_data_handle_t handle; ret = starpu_malloc((void**)&ptr, VECTOR_SIZE * sizeof(*ptr)); STARPU_CHECK_RETURN_VALUE(ret, "starpu_malloc"); starpu_vector_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)ptr, VECTOR_SIZE, sizeof(*ptr)); struct starpu_data_filter f = { .filter_func = starpu_vector_filter_block, .nchildren = CHILDREN_COUNT }; starpu_data_partition(handle, &f); STARPU_ASSERT(starpu_data_get_nb_children(handle) == CHILDREN_COUNT); for (i = 0; i < CHILDREN_COUNT; i++) { starpu_data_handle_t child; child = starpu_data_get_sub_data(handle, 1, i); children_pointers[i] = (int *) starpu_data_get_local_ptr(child); STARPU_ASSERT(children_pointers[i] != NULL); /* Make sure we have a pointer -> handle mapping for CHILD. */ STARPU_ASSERT(starpu_data_lookup(children_pointers[i]) == child); } starpu_data_unpartition(handle, STARPU_MAIN_RAM); for (i = 0; i < CHILDREN_COUNT; i++) { if (children_pointers[i] != ptr) /* Make sure the pointer -> handle mapping is gone. */ STARPU_ASSERT(starpu_data_lookup(children_pointers[i]) == NULL); } /* Make sure the parent's mapping is back. */ STARPU_ASSERT(starpu_data_lookup(ptr) == handle); starpu_data_unregister(handle); starpu_free(ptr); #undef CHILDREN_COUNT } int main(int argc, char *argv[]) { int ret; size_t i; void *vectors[VECTOR_COUNT], *variables[VARIABLE_COUNT]; starpu_data_handle_t vector_handles[VECTOR_COUNT]; starpu_data_handle_t variable_handles[VARIABLE_COUNT]; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* Register data regions. */ for(i = 0; i < VARIABLE_COUNT; i++) { ret = starpu_malloc(&variables[i], sizeof(float)); STARPU_CHECK_RETURN_VALUE(ret, "starpu_malloc"); starpu_variable_data_register(&variable_handles[i], STARPU_MAIN_RAM, (uintptr_t)variables[i], sizeof(float)); } for(i = 0; i < VECTOR_COUNT; i++) { ret = starpu_malloc(&vectors[i], VECTOR_SIZE * sizeof(float)); STARPU_CHECK_RETURN_VALUE(ret, "starpu_malloc"); starpu_vector_data_register(&vector_handles[i], STARPU_MAIN_RAM, (uintptr_t)vectors[i], VECTOR_SIZE, sizeof(float)); } /* Look them up. */ for(i = 0; i < VARIABLE_COUNT; i++) { starpu_data_handle_t handle; handle = starpu_data_lookup(variables[i]); STARPU_ASSERT(handle == variable_handles[i]); } for(i = 0; i < VECTOR_COUNT; i++) { starpu_data_handle_t handle; handle = starpu_data_lookup(vectors[i]); STARPU_ASSERT(handle == vector_handles[i]); } /* Unregister them. */ for(i = 0; i < VARIABLE_COUNT; i++) { starpu_data_unregister(variable_handles[i]); } for(i = 0; i < VECTOR_COUNT; i++) { starpu_data_unregister(vector_handles[i]); } /* Make sure we can no longer find them. */ for(i = 0; i < VARIABLE_COUNT; i++) { starpu_data_handle_t handle; handle = starpu_data_lookup(variables[i]); STARPU_ASSERT(handle == NULL); starpu_free(variables[i]); } for(i = 0; i < VECTOR_COUNT; i++) { starpu_data_handle_t handle; handle = starpu_data_lookup(vectors[i]); STARPU_ASSERT(handle == NULL); starpu_free(vectors[i]); } ret = test_lazy_allocation(); if (ret == -ENODEV) goto enodev; test_filters(); starpu_shutdown(); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/dining_philosophers.c000066400000000000000000000054761320135501600234710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" /* * Test Dijkstra's Dining Philosophers problem */ /* TODO: try to use an arbiter and check improved concurrency */ /* number of philosophers */ #define N 16 starpu_data_handle_t fork_handles[N]; unsigned forks[N]; void eat_kernel(void *descr[], void *arg) { } static struct starpu_codelet eating_cl = { .modes = { STARPU_RW, STARPU_RW }, .cuda_funcs = {eat_kernel}, .cpu_funcs = {eat_kernel}, .opencl_funcs = {eat_kernel}, .cpu_funcs_name = {"eat_kernel"}, .nbuffers = 2 }; static int submit_one_task(unsigned p) { struct starpu_task *task = starpu_task_create(); task->cl = &eating_cl; unsigned left = p; unsigned right = (p+1)%N; task->handles[0] = fork_handles[left]; task->handles[1] = fork_handles[right]; int ret = starpu_task_submit(task); return ret; } int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* initialize the forks */ unsigned f; for (f = 0; f < N; f++) { forks[f] = 0; starpu_vector_data_register(&fork_handles[f], STARPU_MAIN_RAM, (uintptr_t)&forks[f], 1, sizeof(unsigned)); starpu_data_set_sequential_consistency_flag(fork_handles[f], 0); } unsigned ntasks = 1024; unsigned t; for (t = 0; t < ntasks; t++) { /* select one philosopher randomly */ unsigned philosopher = rand() % N; ret = submit_one_task(philosopher); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); FPRINTF(stderr, "waiting done\n"); for (f = 0; f < N; f++) { starpu_data_unregister(fork_handles[f]); } starpu_shutdown(); return EXIT_SUCCESS; enodev: for (f = 0; f < N; f++) { starpu_data_unregister(fork_handles[f]); } fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/double_parameter.c000066400000000000000000000114111320135501600227160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2016 Université de Bordeaux * Copyright (C) 2012, 2013, 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" /* * Try passing the same parameter twice, with various access modes */ void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet codelet_R_R = { .cpu_funcs = { dummy_func }, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 2, .modes = {STARPU_R, STARPU_R} }; static struct starpu_codelet codelet_R_W = { .cpu_funcs = { dummy_func }, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 2, .modes = {STARPU_R, STARPU_W} }; static struct starpu_codelet codelet_R_RW = { .cpu_funcs = { dummy_func }, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 2, .modes = {STARPU_R, STARPU_RW} }; static struct starpu_codelet codelet_W_R = { .cpu_funcs = { dummy_func }, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 2, .modes = {STARPU_W, STARPU_R} }; static struct starpu_codelet codelet_W_W = { .cpu_funcs = { dummy_func }, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 2, .modes = {STARPU_W, STARPU_W} }; static struct starpu_codelet codelet_W_RW = { .cpu_funcs = { dummy_func }, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 2, .modes = {STARPU_W, STARPU_RW} }; static struct starpu_codelet codelet_RW_R = { .cpu_funcs = { dummy_func }, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 2, .modes = {STARPU_RW, STARPU_R} }; static struct starpu_codelet codelet_RW_W = { .cpu_funcs = { dummy_func }, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 2, .modes = {STARPU_RW, STARPU_W} }; static struct starpu_codelet codelet_RW_RW = { .cpu_funcs = { dummy_func }, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 2, .modes = {STARPU_RW, STARPU_RW} }; int main(int argc, char **argv) { float foo = 0.0f; starpu_data_handle_t handle; int ret; struct starpu_task *task; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)&foo, sizeof(foo)); #define SUBMIT(mode0, mode1) \ { \ task = starpu_task_create(); \ task->handles[0] = handle; \ task->handles[1] = handle; \ enum starpu_data_access_mode smode0 = STARPU_##mode0; \ enum starpu_data_access_mode smode1 = STARPU_##mode0; \ if (smode0 == STARPU_R && smode1 == STARPU_R) \ task->cl = &codelet_R_R; \ else if (smode0 == STARPU_R && smode1 == STARPU_W) \ task->cl = &codelet_R_W; \ else if (smode0 == STARPU_R && smode1 == STARPU_RW) \ task->cl = &codelet_R_RW; \ else if (smode0 == STARPU_W && smode1 == STARPU_R) \ task->cl = &codelet_W_R; \ else if (smode0 == STARPU_W && smode1 == STARPU_W) \ task->cl = &codelet_W_W; \ else if (smode0 == STARPU_W && smode1 == STARPU_RW) \ task->cl = &codelet_W_RW; \ else if (smode0 == STARPU_RW && smode1 == STARPU_R) \ task->cl = &codelet_RW_R; \ else if (smode0 == STARPU_RW && smode1 == STARPU_W) \ task->cl = &codelet_RW_W; \ else if (smode0 == STARPU_RW && smode1 == STARPU_RW) \ task->cl = &codelet_RW_RW; \ \ ret = starpu_task_submit(task); \ if (ret == -ENODEV) goto enodev; \ STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); \ } SUBMIT(R,R); SUBMIT(R,W); SUBMIT(R,RW); SUBMIT(W,R); SUBMIT(W,W); SUBMIT(W,RW); SUBMIT(RW,R); SUBMIT(RW,W); SUBMIT(RW,RW); ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_data_unregister(handle); starpu_shutdown(); return EXIT_SUCCESS; enodev: starpu_data_unregister(handle); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/dsm_stress.c000066400000000000000000000152051320135501600215770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012, 2015-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include "../helper.h" #include /* * Trigger various combinations of access modes */ #ifdef STARPU_QUICK_CHECK # define N 100 #else # define N 10000 #endif #define VECTORSIZE 1024 static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static starpu_pthread_cond_t cond = STARPU_PTHREAD_COND_INITIALIZER; static unsigned finished = 0; static unsigned cnt = N; starpu_data_handle_t v_handle, v_handle2; static unsigned *v; static unsigned *v2; static void callback(void *arg) { unsigned res = STARPU_ATOMIC_ADD(&cnt, -1); ANNOTATE_HAPPENS_BEFORE(&cnt); if (res == 0) { ANNOTATE_HAPPENS_AFTER(&cnt); STARPU_PTHREAD_MUTEX_LOCK(&mutex); finished = 1; STARPU_PTHREAD_COND_SIGNAL(&cond); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } } static void cuda_codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } static void opencl_codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } void cpu_codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } static enum starpu_data_access_mode select_random_mode(void) { int r = rand(); switch (r % 3) { case 0: return STARPU_R; case 1: return STARPU_W; case 2: return STARPU_RW; }; return STARPU_RW; } static struct starpu_codelet cl_r_r = { .cpu_funcs = {cpu_codelet_null}, .cuda_funcs = {cuda_codelet_null}, .opencl_funcs = {opencl_codelet_null}, .cpu_funcs_name = {"cpu_codelet_null"}, .nbuffers = 2, .modes = {STARPU_R, STARPU_R} }; static struct starpu_codelet cl_r_w = { .cpu_funcs = {cpu_codelet_null}, .cuda_funcs = {cuda_codelet_null}, .opencl_funcs = {opencl_codelet_null}, .cpu_funcs_name = {"cpu_codelet_null"}, .nbuffers = 2, .modes = {STARPU_R, STARPU_W} }; static struct starpu_codelet cl_r_rw = { .cpu_funcs = {cpu_codelet_null}, .cuda_funcs = {cuda_codelet_null}, .opencl_funcs = {opencl_codelet_null}, .cpu_funcs_name = {"cpu_codelet_null"}, .nbuffers = 2, .modes = {STARPU_R, STARPU_RW} }; static struct starpu_codelet cl_w_r = { .cpu_funcs = {cpu_codelet_null}, .cuda_funcs = {cuda_codelet_null}, .opencl_funcs = {opencl_codelet_null}, .cpu_funcs_name = {"cpu_codelet_null"}, .nbuffers = 2, .modes = {STARPU_W, STARPU_R} }; static struct starpu_codelet cl_w_w = { .cpu_funcs = {cpu_codelet_null}, .cuda_funcs = {cuda_codelet_null}, .opencl_funcs = {opencl_codelet_null}, .cpu_funcs_name = {"cpu_codelet_null"}, .nbuffers = 2, .modes = {STARPU_W, STARPU_W} }; static struct starpu_codelet cl_w_rw = { .cpu_funcs = {cpu_codelet_null}, .cuda_funcs = {cuda_codelet_null}, .opencl_funcs = {opencl_codelet_null}, .cpu_funcs_name = {"cpu_codelet_null"}, .nbuffers = 2, .modes = {STARPU_W, STARPU_RW} }; static struct starpu_codelet cl_rw_r = { .cpu_funcs = {cpu_codelet_null}, .cuda_funcs = {cuda_codelet_null}, .opencl_funcs = {opencl_codelet_null}, .cpu_funcs_name = {"cpu_codelet_null"}, .nbuffers = 2, .modes = {STARPU_RW, STARPU_R} }; static struct starpu_codelet cl_rw_w = { .cpu_funcs = {cpu_codelet_null}, .cuda_funcs = {cuda_codelet_null}, .opencl_funcs = {opencl_codelet_null}, .cpu_funcs_name = {"cpu_codelet_null"}, .nbuffers = 2, .modes = {STARPU_RW, STARPU_W} }; static struct starpu_codelet cl_rw_rw = { .cpu_funcs = {cpu_codelet_null}, .cuda_funcs = {cuda_codelet_null}, .opencl_funcs = {opencl_codelet_null}, .cpu_funcs_name = {"cpu_codelet_null"}, .nbuffers = 2, .modes = {STARPU_RW, STARPU_RW} }; int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_malloc((void **)&v, VECTORSIZE*sizeof(unsigned)); STARPU_CHECK_RETURN_VALUE(ret, "starpu_malloc"); ret = starpu_malloc((void **)&v2, VECTORSIZE*sizeof(unsigned)); STARPU_CHECK_RETURN_VALUE(ret, "starpu_malloc"); starpu_vector_data_register(&v_handle, STARPU_MAIN_RAM, (uintptr_t)v, VECTORSIZE, sizeof(unsigned)); starpu_vector_data_register(&v_handle2, STARPU_MAIN_RAM, (uintptr_t)v2, VECTORSIZE, sizeof(unsigned)); unsigned iter; for (iter = 0; iter < N; iter++) { struct starpu_task *task = starpu_task_create(); task->handles[0] = v_handle; task->handles[1] = v_handle2; enum starpu_data_access_mode mode0 = select_random_mode(); enum starpu_data_access_mode mode1 = select_random_mode(); if (mode0 == STARPU_R && mode1 == STARPU_R) task->cl = &cl_r_r; else if (mode0 == STARPU_R && mode1 == STARPU_W) task->cl = &cl_r_w; else if (mode0 == STARPU_R && mode1 == STARPU_RW) task->cl = &cl_r_rw; else if (mode0 == STARPU_W && mode1 == STARPU_R) task->cl = &cl_w_r; else if (mode0 == STARPU_W && mode1 == STARPU_W) task->cl = &cl_w_w; else if (mode0 == STARPU_W && mode1 == STARPU_RW) task->cl = &cl_w_rw; else if (mode0 == STARPU_RW && mode1 == STARPU_R) task->cl = &cl_rw_r; else if (mode0 == STARPU_RW && mode1 == STARPU_W) task->cl = &cl_rw_w; else if (mode0 == STARPU_RW && mode1 == STARPU_RW) task->cl = &cl_rw_rw; task->callback_func = callback; task->callback_arg = NULL; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_do_schedule(); STARPU_PTHREAD_MUTEX_LOCK(&mutex); if (!finished) STARPU_PTHREAD_COND_WAIT(&cond, &mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); starpu_data_unregister(v_handle); starpu_data_unregister(v_handle2); starpu_free(v); starpu_free(v2); starpu_shutdown(); return EXIT_SUCCESS; enodev: starpu_data_unregister(v_handle); starpu_data_unregister(v_handle2); starpu_free(v); starpu_free(v2); starpu_shutdown(); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/gpu_ptr_register.c000066400000000000000000000157331320135501600230030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2012, 2014, 2016 Université de Bordeaux * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" #include "scal.h" /* * Register the GPU buffer to be used for an existing data, and perform * a partitioned operation */ #if ! (defined(STARPU_USE_OPENCL) || defined(STARPU_USE_CUDA)) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else static int submit_tasks(starpu_data_handle_t handle, int pieces, int n) { int i, ret; for (i = 0; i < pieces; i++) { struct starpu_task *task = starpu_task_create(); task->handles[0] = starpu_data_get_sub_data(handle, 1, i); task->cl = &scal_codelet; task->execute_on_a_specific_worker = 1; task->workerid = i%n; ret = starpu_task_submit(task); if (ret == -ENODEV) return -ENODEV; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); return 0; } static int find_a_worker(enum starpu_worker_archtype type) { int worker[STARPU_NMAXWORKERS]; int ret = starpu_worker_get_ids_by_type(type, worker, STARPU_NMAXWORKERS); if (ret == 0) return -ENODEV; if (ret == -ERANGE) return worker[STARPU_NMAXWORKERS-1]; return worker[ret-1]; } static int check_result(unsigned *t, size_t size) { unsigned i; for (i = 0; i < size; i++) { if (t[i] != i*2) { FPRINTF(stderr,"t[%u] is %u instead of %u\n", i, t[i], 2*i); return 1; } } return 0; } #ifdef STARPU_USE_CUDA #ifdef HAVE_CUDA_MEMCPY_PEER static int test_cuda(void) { int ret; unsigned *foo_gpu; unsigned *foo; int n, i, size, pieces; int devid; int chosen; cudaError_t cures; starpu_data_handle_t handle; /* Find a CUDA worker */ chosen = find_a_worker(STARPU_CUDA_WORKER); if (chosen == -ENODEV) return -ENODEV; n = starpu_worker_get_count(); size = 10 * n; devid = starpu_worker_get_devid(chosen); foo_gpu = (void*) starpu_malloc_on_node(starpu_worker_get_memory_node(chosen), size * sizeof(*foo_gpu)); foo = calloc(size, sizeof(*foo)); for (i = 0; i < size; i++) foo[i] = i; starpu_vector_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)foo, size, sizeof(*foo)); starpu_vector_ptr_register(handle, starpu_worker_get_memory_node(chosen), (uintptr_t)foo_gpu, (uintptr_t)foo_gpu, 0); /* Broadcast the data to force in-place partitioning */ for (i = 0; i < n; i++) starpu_data_prefetch_on_node(handle, starpu_worker_get_memory_node(i), 0); /* Even with just one worker, split in at least two */ if (n == 1) pieces = 2; else pieces = n; struct starpu_data_filter f = { .filter_func = starpu_vector_filter_block, .nchildren = pieces, }; starpu_data_partition(handle, &f); ret = submit_tasks(handle, pieces, n); if (ret == -ENODEV) return -ENODEV; starpu_data_unpartition(handle, starpu_worker_get_memory_node(chosen)); starpu_data_prefetch_on_node(handle, starpu_worker_get_memory_node(chosen), 0); starpu_data_unregister(handle); starpu_cuda_set_device(devid); cures = cudaMemcpy(foo, foo_gpu, size * sizeof(*foo_gpu), cudaMemcpyDeviceToHost); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); return check_result(foo, size); } #endif #endif #ifdef STARPU_USE_OPENCL static int test_opencl(void) { int i; int ret; int chosen; int n; int size; int pieces; cl_mem foo_gpu; starpu_data_handle_t handle; ret = starpu_opencl_load_opencl_from_file("tests/datawizard/scal_opencl.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); /* Find an OpenCL worker */ chosen = find_a_worker(STARPU_OPENCL_WORKER); if (chosen == -ENODEV) return -ENODEV; n = starpu_worker_get_count(); size = 10 * n; int devid; cl_int err; cl_context context; cl_command_queue queue; devid = starpu_worker_get_devid(chosen); starpu_opencl_get_context(devid, &context); starpu_opencl_get_queue(devid, &queue); foo_gpu = (void*) starpu_malloc_on_node(starpu_worker_get_memory_node(chosen), size * sizeof(int)); unsigned int *foo = malloc(size*sizeof(*foo)); for (i = 0; i < size; i++) foo[i] = i; starpu_vector_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)foo, size, sizeof(int)); starpu_vector_ptr_register(handle, starpu_worker_get_memory_node(chosen), (uintptr_t)foo_gpu, (uintptr_t)foo_gpu, 0); /* Broadcast the data to force in-place partitioning */ for (i = 0; i < n; i++) starpu_data_prefetch_on_node(handle, starpu_worker_get_memory_node(i), 0); /* Even with just one worker, split in at least two */ if (n == 1) pieces = 2; else pieces = n; struct starpu_data_filter f = { .filter_func = starpu_vector_filter_block, .nchildren = pieces, }; starpu_data_partition(handle, &f); ret = submit_tasks(handle, pieces, n); if (ret == -ENODEV) return -ENODEV; starpu_data_unpartition(handle, starpu_worker_get_memory_node(chosen)); starpu_data_prefetch_on_node(handle, starpu_worker_get_memory_node(chosen), 0); starpu_data_unregister(handle); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); err = clEnqueueReadBuffer(queue, foo_gpu, CL_FALSE, 0, size*sizeof(*foo), foo, 0, NULL, NULL); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); return check_result(foo, size); } #endif /* !STARPU_USE_OPENCL */ int main(int argc, char **argv) { int skipped_cuda = 1, skipped_opencl = 1; int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_load_opencl_from_file("tests/datawizard/scal_opencl.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif #ifdef STARPU_USE_CUDA #ifdef HAVE_CUDA_MEMCPY_PEER ret = test_cuda(); if (ret == 1) goto fail; else if (ret == 0) skipped_cuda = 0; #endif #endif #ifdef STARPU_USE_OPENCL ret = test_opencl(); if (ret == 1) goto fail; else if (ret == 0) skipped_opencl = 0; #endif starpu_shutdown(); if (skipped_cuda == 1 && skipped_opencl == 1) return STARPU_TEST_SKIPPED; return EXIT_SUCCESS; fail: starpu_shutdown(); return EXIT_FAILURE; } #endif /* defined(STARPU_USE_OPENCL) || defined(STARPU_USE_CUDA) */ starpu-1.2.3+dfsg/tests/datawizard/gpu_register.c000066400000000000000000000167261320135501600221210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2012, 2014-2016 Université de Bordeaux * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" #include "scal.h" /* * Register a handle from a GPU buffer, and performs a partitioned operation */ #if ! (defined(STARPU_USE_OPENCL) || defined(STARPU_USE_CUDA)) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else static int submit_tasks(starpu_data_handle_t handle, int pieces, int n) { int i, ret; for (i = 0; i < pieces; i++) { struct starpu_task *task = starpu_task_create(); task->handles[0] = starpu_data_get_sub_data(handle, 1, i); task->cl = &scal_codelet; task->execute_on_a_specific_worker = 1; task->workerid = i%n; ret = starpu_task_submit(task); if (ret == -ENODEV) return -ENODEV; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); return 0; } static int find_a_worker(enum starpu_worker_archtype type) { int worker[STARPU_NMAXWORKERS]; int ret = starpu_worker_get_ids_by_type(type, worker, STARPU_NMAXWORKERS); if (ret == 0) return -ENODEV; if (ret == -ERANGE) return worker[STARPU_NMAXWORKERS-1]; return worker[ret-1]; } static int check_result(unsigned *t, size_t size) { unsigned i; for (i = 0; i < size; i++) { if (t[i] != i*2) { FPRINTF(stderr,"t[%u] is %u instead of %u\n", i, t[i], 2*i); return 1; } } return 0; } #ifdef STARPU_USE_CUDA #ifdef HAVE_CUDA_MEMCPY_PEER static int test_cuda(void) { int ret; unsigned *foo_gpu; unsigned *foo; int n, i, size, pieces; int devid; int chosen; cudaError_t cures; starpu_data_handle_t handle; /* Find a CUDA worker */ chosen = find_a_worker(STARPU_CUDA_WORKER); if (chosen == -ENODEV) return -ENODEV; n = starpu_worker_get_count(); size = 10 * n; devid = starpu_worker_get_devid(chosen); foo_gpu = (void*) starpu_malloc_on_node(starpu_worker_get_memory_node(chosen), size * sizeof(*foo_gpu)); foo = calloc(size, sizeof(*foo)); for (i = 0; i < size; i++) foo[i] = i; cures = cudaMemcpy(foo_gpu, foo, size * sizeof(*foo_gpu), cudaMemcpyHostToDevice); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); starpu_vector_data_register(&handle, starpu_worker_get_memory_node(chosen), (uintptr_t)foo_gpu, size, sizeof(*foo_gpu)); /* Broadcast the data to force in-place partitioning */ for (i = 0; i < n; i++) starpu_data_prefetch_on_node(handle, starpu_worker_get_memory_node(i), 0); /* Even with just one worker, split in at least two */ if (n == 1) pieces = 2; else pieces = n; struct starpu_data_filter f = { .filter_func = starpu_vector_filter_block, .nchildren = pieces, }; starpu_data_partition(handle, &f); ret = submit_tasks(handle, pieces, n); if (ret == -ENODEV) { starpu_free_on_node(starpu_worker_get_memory_node(chosen), (uintptr_t) foo_gpu, size * sizeof(*foo_gpu)); free(foo); return -ENODEV; } starpu_data_unpartition(handle, starpu_worker_get_memory_node(chosen)); starpu_data_unregister(handle); starpu_cuda_set_device(devid); cures = cudaMemcpy(foo, foo_gpu, size * sizeof(*foo_gpu), cudaMemcpyDeviceToHost); if (STARPU_UNLIKELY(cures)) { starpu_free_on_node(starpu_worker_get_memory_node(chosen), (uintptr_t) foo_gpu, size * sizeof(*foo_gpu)); free(foo); STARPU_CUDA_REPORT_ERROR(cures); } ret = check_result(foo, size); starpu_free_on_node(starpu_worker_get_memory_node(chosen), (uintptr_t) foo_gpu, size * sizeof(*foo_gpu)); free(foo); return ret; } #endif #endif #ifdef STARPU_USE_OPENCL static int test_opencl(void) { int i; int ret; int chosen; int n; int size; int pieces; cl_mem foo_gpu; starpu_data_handle_t handle; ret = starpu_opencl_load_opencl_from_file("tests/datawizard/scal_opencl.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); /* Find an OpenCL worker */ chosen = find_a_worker(STARPU_OPENCL_WORKER); if (chosen == -ENODEV) return -ENODEV; n = starpu_worker_get_count(); size = 10 * n; int devid; cl_int err; cl_context context; cl_command_queue queue; devid = starpu_worker_get_devid(chosen); starpu_opencl_get_context(devid, &context); starpu_opencl_get_queue(devid, &queue); foo_gpu = (void*) starpu_malloc_on_node(starpu_worker_get_memory_node(chosen), size * sizeof(int)); unsigned int *foo = malloc(size*sizeof(*foo)); for (i = 0; i < size; i++) foo[i] = i; err = clEnqueueWriteBuffer(queue, foo_gpu, CL_FALSE, 0, size*sizeof(int), foo, 0, NULL, NULL); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); starpu_vector_data_register(&handle, starpu_worker_get_memory_node(chosen), (uintptr_t)foo_gpu, size, sizeof(int)); /* Broadcast the data to force in-place partitioning */ for (i = 0; i < n; i++) starpu_data_prefetch_on_node(handle, starpu_worker_get_memory_node(i), 0); /* Even with just one worker, split in at least two */ if (n == 1) pieces = 2; else pieces = n; struct starpu_data_filter f = { .filter_func = starpu_vector_filter_block, .nchildren = pieces, }; starpu_data_partition(handle, &f); ret = submit_tasks(handle, pieces, n); if (ret == -ENODEV) return -ENODEV; starpu_data_unpartition(handle, starpu_worker_get_memory_node(chosen)); starpu_data_unregister(handle); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); err = clEnqueueReadBuffer(queue, foo_gpu, CL_FALSE, 0, size*sizeof(*foo), foo, 0, NULL, NULL); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); ret = check_result(foo, size); starpu_free_on_node(starpu_worker_get_memory_node(chosen), (uintptr_t) foo_gpu, size * sizeof(int)); free(foo); return ret; } #endif /* !STARPU_USE_OPENCL */ int main(int argc, char **argv) { int skipped_cuda = 1, skipped_opencl = 1; int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_load_opencl_from_file("tests/datawizard/scal_opencl.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif #ifdef STARPU_USE_CUDA #ifdef HAVE_CUDA_MEMCPY_PEER ret = test_cuda(); if (ret == 1) goto fail; else if (ret == 0) skipped_cuda = 0; #endif #endif #ifdef STARPU_USE_OPENCL ret = test_opencl(); if (ret == 1) goto fail; else if (ret == 0) skipped_opencl = 0; #endif starpu_shutdown(); if (skipped_cuda == 1 && skipped_opencl == 1) return STARPU_TEST_SKIPPED; return EXIT_SUCCESS; fail: starpu_shutdown(); return EXIT_FAILURE; } #endif /* defined(STARPU_USE_OPENCL) || defined(STARPU_USE_CUDA) */ starpu-1.2.3+dfsg/tests/datawizard/handle_to_pointer.c000066400000000000000000000106521320135501600231070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #undef NDEBUG #include #include #include #include "../helper.h" /* * Test the value returned by starpu_handle_to_pointer */ void cpu_task(void **buffers, void *args) { int *numbers; int i; int size; numbers = (int *) STARPU_VECTOR_GET_PTR(buffers[0]); starpu_codelet_unpack_args (args, &size); for(i = 0; i < (int)size; i++) { numbers[i] = i; } } #ifdef STARPU_USE_CUDA static void cuda_task(void **buffers, void *args) { int *numbers; int i; int size; numbers = (int *)STARPU_VECTOR_GET_PTR(buffers[0]); starpu_codelet_unpack_args (args, &size); for(i = 0; i < (int)size; i++) { cudaMemcpyAsync(&numbers[i], &i, sizeof(int), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); } } #endif #ifdef STARPU_USE_OPENCL static void opencl_task(void *buffers[], void *args) { cl_command_queue queue; int id = starpu_worker_get_id_check(); int devid = starpu_worker_get_devid(id); starpu_opencl_get_queue(devid, &queue); cl_mem numbers = (cl_mem) STARPU_VECTOR_GET_DEV_HANDLE(buffers[0]); unsigned size = STARPU_VECTOR_GET_NX(buffers[0]); unsigned i; for (i = 0; i < size; i++) { clEnqueueWriteBuffer(queue, numbers, CL_TRUE, i*sizeof(int), /* offset */ sizeof(int), &i, 0, /* num_events_in_wait_list */ NULL, /* event_wait_list */ NULL /* event */); } } #endif static struct starpu_codelet cl = { .cpu_funcs = {cpu_task}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_task}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_task}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs_name = {"cpu_task"}, .nbuffers = 1, .modes = {STARPU_W} }; int main(int argc, char *argv[]) { int err, ret; int *pointer; starpu_data_handle_t handle; static const int count = 123; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; err = starpu_malloc((void **)&pointer, count * sizeof(int)); STARPU_ASSERT((err == 0) && (pointer != NULL)); starpu_variable_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)pointer, sizeof(int)); STARPU_ASSERT(starpu_data_handle_to_pointer(handle, STARPU_MAIN_RAM) == pointer); starpu_data_unregister(handle); starpu_vector_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)pointer, count, sizeof(int)); STARPU_ASSERT(starpu_data_handle_to_pointer(handle, STARPU_MAIN_RAM) == pointer); starpu_data_unregister(handle); starpu_matrix_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)pointer, 0, count, 1, sizeof(int)); STARPU_ASSERT(starpu_data_handle_to_pointer(handle, STARPU_MAIN_RAM) == pointer); starpu_data_unregister(handle); starpu_free(pointer); pointer = NULL; /* Lazy allocation. */ starpu_vector_data_register(&handle, -1, 0 /* NULL */, count, sizeof(int)); STARPU_ASSERT(starpu_data_handle_to_pointer(handle, STARPU_MAIN_RAM) == NULL); /* Pass the handle to a task. */ err = starpu_task_insert(&cl, STARPU_W, handle, STARPU_VALUE, &count, sizeof(count), 0); if (err == -ENODEV) return STARPU_TEST_SKIPPED; /* Acquire the handle, forcing a local allocation. */ starpu_data_acquire(handle, STARPU_R); /* Make sure we have a local pointer to it. */ ret = EXIT_SUCCESS; pointer = (int *) starpu_data_handle_to_pointer(handle, STARPU_MAIN_RAM); if (pointer == NULL) { FPRINTF(stderr, "pointer should be non NULL\n"); ret = EXIT_FAILURE; } else { int i; for(i = 0; i < count; i++) { int *numbers = (int *)pointer; if (numbers[i] != i) { FPRINTF(stderr, "Incorrect value numbers[%d] == %d should be %d\n", (int)i, numbers[i], (int)i); ret = EXIT_FAILURE; } } } starpu_data_release(handle); starpu_data_unregister(handle); starpu_shutdown(); return ret; } starpu-1.2.3+dfsg/tests/datawizard/in_place_partition.c000066400000000000000000000056301320135501600232550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2015-2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" #include "scal.h" /* * Trigger in-place partitioning by prefetching the whole data before * partitioning */ int main(int argc, char **argv) { unsigned *foo; starpu_data_handle_t handle; int ret; unsigned n, i, size; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_load_opencl_from_file("tests/datawizard/scal_opencl.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif n = starpu_worker_get_count(); if (n == 1) { starpu_shutdown(); return STARPU_TEST_SKIPPED; } size = 10 * n; foo = (unsigned *) calloc(size, sizeof(*foo)); for (i = 0; i < size; i++) foo[i] = i; starpu_vector_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)foo, size, sizeof(*foo)); /* Broadcast the data to force in-place partitioning */ for (i = 0; i < n; i++) starpu_data_prefetch_on_node(handle, starpu_worker_get_memory_node(i), 0); struct starpu_data_filter f = { .filter_func = starpu_vector_filter_block, .nchildren = n, }; starpu_data_partition(handle, &f); for (i = 0; i < f.nchildren; i++) { struct starpu_task *task = starpu_task_create(); task->handles[0] = starpu_data_get_sub_data(handle, 1, i); task->cl = &scal_codelet; task->execute_on_a_specific_worker = 1; task->workerid = i; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_data_unpartition(handle, STARPU_MAIN_RAM); starpu_data_unregister(handle); starpu_shutdown(); ret = EXIT_SUCCESS; for (i = 0; i < size; i++) { if (foo[i] != i*2) { FPRINTF(stderr,"value %u is %u instead of %u\n", i, foo[i], 2*i); ret = EXIT_FAILURE; } } free(foo); return ret; enodev: starpu_data_unregister(handle); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/increment_init.c000066400000000000000000000126141320135501600224210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2014 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Check that the initializer passed to starpu_data_set_reduction_methods * is used to initialize a handle when it is registered from NULL, and when * starpu_data_invalidate is called */ static starpu_data_handle_t handle; /* * Reduction methods */ #ifdef STARPU_USE_CUDA static void neutral_cuda_kernel(void *descr[], void *arg) { unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); /* This is a dummy technique of course */ unsigned host_dst = 0; cudaMemcpyAsync(dst, &host_dst, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } #endif #ifdef STARPU_USE_OPENCL static void neutral_opencl_kernel(void *descr[], void *arg) { unsigned h_dst = 0; cl_mem d_dst = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); cl_command_queue queue; starpu_opencl_get_current_queue(&queue); clEnqueueWriteBuffer(queue, d_dst, CL_TRUE, 0, sizeof(unsigned), (void *)&h_dst, 0, NULL, NULL); clFinish(queue); } #endif void neutral_cpu_kernel(void *descr[], void *arg) { unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *dst = 0; } static struct starpu_codelet neutral_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {neutral_cuda_kernel}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {neutral_opencl_kernel}, #endif .cpu_funcs = {neutral_cpu_kernel}, .cpu_funcs_name = {"neutral_cpu_kernel"}, .modes = {STARPU_W}, .nbuffers = 1 }; /* * Increment codelet */ #ifdef STARPU_USE_OPENCL /* dummy OpenCL implementation */ static void increment_opencl_kernel(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { cl_mem d_token = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned h_token; cl_command_queue queue; starpu_opencl_get_current_queue(&queue); clEnqueueReadBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); h_token++; clEnqueueWriteBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); clFinish(queue); } #endif #ifdef STARPU_USE_CUDA static void increment_cuda_kernel(void *descr[], void *arg) { unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned host_token; /* This is a dummy technique of course */ cudaMemcpyAsync(&host_token, tokenptr, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); host_token++; cudaMemcpyAsync(tokenptr, &host_token, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } #endif void increment_cpu_kernel(void *descr[], void *arg) { unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *tokenptr = *tokenptr + 1; } static struct starpu_codelet increment_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {increment_cuda_kernel}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {increment_opencl_kernel}, #endif .cpu_funcs = {increment_cpu_kernel}, .cpu_funcs_name = {"increment_cpu_kernel"}, .nbuffers = 1, .modes = {STARPU_RW} }; int main(int argc, char **argv) { unsigned *pvar = NULL; int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&handle, -1, 0, sizeof(unsigned)); starpu_data_set_reduction_methods(handle, NULL, &neutral_cl); #ifdef STARPU_QUICK_CHECK unsigned ntasks = 32; unsigned nloops = 4; #else unsigned ntasks = 1024; unsigned nloops = 16; #endif unsigned loop; unsigned t; for (loop = 0; loop < nloops; loop++) { for (t = 0; t < ntasks; t++) { struct starpu_task *task = starpu_task_create(); task->cl = &increment_cl; task->handles[0] = handle; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_data_acquire(handle, STARPU_R); pvar = starpu_data_handle_to_pointer(handle, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire"); if (*pvar != ntasks) { FPRINTF(stderr, "[end of loop] Value %u != Expected value %u\n", *pvar, ntasks * (loop+1)); starpu_data_release(handle); starpu_data_unregister(handle); goto err; } starpu_data_release(handle); starpu_data_invalidate(handle); } starpu_data_unregister(handle); starpu_shutdown(); return EXIT_SUCCESS; enodev: starpu_data_unregister(handle); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; err: starpu_shutdown(); return EXIT_FAILURE; } starpu-1.2.3+dfsg/tests/datawizard/increment_redux.c000066400000000000000000000171131320135501600226040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Check that STARPU_REDUX works with a mere incrementation */ static unsigned var = 0; static starpu_data_handle_t handle; /* * Reduction methods */ #ifdef STARPU_USE_CUDA static void redux_cuda_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned *src = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[1]); unsigned host_dst, host_src; /* This is a dummy technique of course */ cudaMemcpyAsync(&host_src, src, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaMemcpyAsync(&host_dst, dst, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); host_dst += host_src; cudaMemcpyAsync(dst, &host_dst, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); } static void neutral_cuda_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); /* This is a dummy technique of course */ unsigned host_dst = 0; cudaMemcpyAsync(dst, &host_dst, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); } #endif #ifdef STARPU_USE_OPENCL static void redux_opencl_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned h_dst, h_src; cl_mem d_dst = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); cl_mem d_src = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[1]); cl_command_queue queue; starpu_opencl_get_current_queue(&queue); /* This is a dummy technique of course */ clEnqueueReadBuffer(queue, d_dst, CL_TRUE, 0, sizeof(unsigned), (void *)&h_dst, 0, NULL, NULL); clEnqueueReadBuffer(queue, d_src, CL_TRUE, 0, sizeof(unsigned), (void *)&h_src, 0, NULL, NULL); h_dst += h_src; clEnqueueWriteBuffer(queue, d_dst, CL_TRUE, 0, sizeof(unsigned), (void *)&h_dst, 0, NULL, NULL); } static void neutral_opencl_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned h_dst = 0; cl_mem d_dst = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); cl_command_queue queue; starpu_opencl_get_current_queue(&queue); clEnqueueWriteBuffer(queue, d_dst, CL_TRUE, 0, sizeof(unsigned), (void *)&h_dst, 0, NULL, NULL); } #endif void redux_cpu_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned *src = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[1]); *dst = *dst + *src; } void neutral_cpu_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *dst = 0; } static struct starpu_codelet redux_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {redux_cuda_kernel}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {redux_opencl_kernel}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs = {redux_cpu_kernel}, .cpu_funcs_name = {"redux_cpu_kernel"}, .modes = {STARPU_RW, STARPU_R}, .nbuffers = 2 }; static struct starpu_codelet neutral_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {neutral_cuda_kernel}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {neutral_opencl_kernel}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs = {neutral_cpu_kernel}, .cpu_funcs_name = {"neutral_cpu_kernel"}, .modes = {STARPU_W}, .nbuffers = 1 }; /* * Increment codelet */ #ifdef STARPU_USE_OPENCL /* dummy OpenCL implementation */ static void increment_opencl_kernel(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { STARPU_SKIP_IF_VALGRIND; cl_mem d_token = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned h_token; cl_command_queue queue; starpu_opencl_get_current_queue(&queue); clEnqueueReadBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); h_token++; clEnqueueWriteBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); } #endif #ifdef STARPU_USE_CUDA static void increment_cuda_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned host_token; /* This is a dummy technique of course */ cudaMemcpyAsync(&host_token, tokenptr, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); host_token++; cudaMemcpyAsync(tokenptr, &host_token, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); } #endif void increment_cpu_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *tokenptr = *tokenptr + 1; } static struct starpu_codelet increment_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {increment_cuda_kernel}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {increment_opencl_kernel}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs = {increment_cpu_kernel}, .cpu_funcs_name = {"increment_cpu_kernel"}, .nbuffers = 1, .modes = {STARPU_REDUX} }; int main(int argc, char **argv) { int ret; /* Not supported yet */ if (starpu_get_env_number_default("STARPU_GLOBAL_ARBITER", 0) > 0) return STARPU_TEST_SKIPPED; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)&var, sizeof(unsigned)); starpu_data_set_reduction_methods(handle, &redux_cl, &neutral_cl); #ifdef STARPU_QUICK_CHECK unsigned ntasks = 32; unsigned nloops = 4; #else unsigned ntasks = 1024; unsigned nloops = 16; #endif unsigned loop; unsigned t; for (loop = 0; loop < nloops; loop++) { for (t = 0; t < ntasks; t++) { struct starpu_task *task = starpu_task_create(); task->cl = &increment_cl; task->handles[0] = handle; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_data_acquire(handle, STARPU_R); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire"); if (var != ntasks * (loop+1)) { FPRINTF(stderr, "[end of loop] Value %u != Expected value %u\n", var, ntasks * (loop+1)); starpu_data_release(handle); starpu_data_unregister(handle); goto err; } starpu_data_release(handle); } starpu_data_unregister(handle); if (var != ntasks * nloops) { FPRINTF(stderr, "Value %u != Expected value %u\n", var, ntasks * (loop+1)); goto err; } starpu_shutdown(); return EXIT_SUCCESS; enodev: starpu_data_unregister(handle); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; err: starpu_shutdown(); STARPU_RETURN(EXIT_FAILURE); } starpu-1.2.3+dfsg/tests/datawizard/increment_redux_lazy.c000066400000000000000000000170221320135501600236420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" /* * Check that STARPU_REDUX works with a mere incrementation, but without * initializing the variable */ static starpu_data_handle_t handle; /* * Reduction methods */ #ifdef STARPU_USE_CUDA static void redux_cuda_kernel(void *descr[], void *arg) { unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned *src = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[1]); unsigned host_dst, host_src; /* This is a dummy technique of course */ cudaMemcpyAsync(&host_src, src, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaMemcpyAsync(&host_dst, dst, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); host_dst += host_src; cudaMemcpyAsync(dst, &host_dst, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); } static void neutral_cuda_kernel(void *descr[], void *arg) { unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); /* This is a dummy technique of course */ unsigned host_dst = 0; cudaMemcpyAsync(dst, &host_dst, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); } #endif #ifdef STARPU_USE_OPENCL static void redux_opencl_kernel(void *descr[], void *arg) { unsigned h_dst, h_src; cl_mem d_dst = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); cl_mem d_src = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[1]); cl_command_queue queue; starpu_opencl_get_current_queue(&queue); /* This is a dummy technique of course */ clEnqueueReadBuffer(queue, d_dst, CL_TRUE, 0, sizeof(unsigned), (void *)&h_dst, 0, NULL, NULL); clEnqueueReadBuffer(queue, d_src, CL_TRUE, 0, sizeof(unsigned), (void *)&h_src, 0, NULL, NULL); h_dst += h_src; clEnqueueWriteBuffer(queue, d_dst, CL_TRUE, 0, sizeof(unsigned), (void *)&h_dst, 0, NULL, NULL); } static void neutral_opencl_kernel(void *descr[], void *arg) { unsigned h_dst = 0; cl_mem d_dst = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); cl_command_queue queue; starpu_opencl_get_current_queue(&queue); clEnqueueWriteBuffer(queue, d_dst, CL_TRUE, 0, sizeof(unsigned), (void *)&h_dst, 0, NULL, NULL); } #endif void redux_cpu_kernel(void *descr[], void *arg) { unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned *src = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[1]); *dst = *dst + *src; } void neutral_cpu_kernel(void *descr[], void *arg) { unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *dst = 0; } static struct starpu_codelet redux_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {redux_cuda_kernel}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {redux_opencl_kernel}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs = {redux_cpu_kernel}, .cpu_funcs_name = {"redux_cpu_kernel"}, .modes = {STARPU_RW, STARPU_R}, .nbuffers = 2 }; static struct starpu_codelet neutral_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {neutral_cuda_kernel}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {neutral_opencl_kernel}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs = {neutral_cpu_kernel}, .cpu_funcs_name = {"neutral_cpu_kernel"}, .modes = {STARPU_W}, .nbuffers = 1 }; /* * Increment codelet */ #ifdef STARPU_USE_OPENCL /* dummy OpenCL implementation */ static void increment_opencl_kernel(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { cl_mem d_token = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned h_token; cl_command_queue queue; starpu_opencl_get_current_queue(&queue); clEnqueueReadBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); h_token++; clEnqueueWriteBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); } #endif #ifdef STARPU_USE_CUDA static void increment_cuda_kernel(void *descr[], void *arg) { unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned host_token; /* This is a dummy technique of course */ cudaMemcpyAsync(&host_token, tokenptr, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); host_token++; cudaMemcpyAsync(tokenptr, &host_token, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); } #endif void increment_cpu_kernel(void *descr[], void *arg) { unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *tokenptr = *tokenptr + 1; } static struct starpu_codelet increment_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {increment_cuda_kernel}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {increment_opencl_kernel}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs = {increment_cpu_kernel}, .cpu_funcs_name = {"increment_cpu_kernel"}, .nbuffers = 1, .modes = {STARPU_REDUX} }; int main(int argc, char **argv) { int ret; unsigned *var; /* Not supported yet */ if (starpu_get_env_number_default("STARPU_GLOBAL_ARBITER", 0) > 0) return STARPU_TEST_SKIPPED; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&handle, -1, (uintptr_t)NULL, sizeof(unsigned)); starpu_data_set_reduction_methods(handle, &redux_cl, &neutral_cl); #ifdef STARPU_QUICK_CHECK unsigned ntasks = 32; unsigned nloops = 4; #else unsigned ntasks = 1024; unsigned nloops = 16; #endif unsigned loop; unsigned t; for (loop = 0; loop < nloops; loop++) { for (t = 0; t < ntasks; t++) { struct starpu_task *task = starpu_task_create(); task->cl = &increment_cl; task->handles[0] = handle; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_data_acquire(handle, STARPU_R); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire"); var = (unsigned*) starpu_variable_get_local_ptr(handle); starpu_data_release(handle); if (*var != ntasks*(loop + 1)) { ret = EXIT_FAILURE; FPRINTF(stderr, "[end of loop] Value %u != Expected value %u\n", *var, ntasks * (loop+1)); goto err; } } ret = starpu_data_acquire(handle, STARPU_R); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire"); var = (unsigned*) starpu_variable_get_local_ptr(handle); if (*var != ntasks*nloops) { ret = EXIT_FAILURE; FPRINTF(stderr, "Value %u != Expected value %u\n", *var, ntasks * (loop+1)); goto err; } starpu_data_release(handle); starpu_data_unregister(handle); err: starpu_shutdown(); STARPU_RETURN(ret); enodev: starpu_data_unregister(handle); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); STARPU_RETURN(STARPU_TEST_SKIPPED); } starpu-1.2.3+dfsg/tests/datawizard/increment_redux_v2.c000066400000000000000000000200401320135501600232040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Check that STARPU_REDUX works with a mere incrementation, but * intermixing with non-REDUX accesses */ static unsigned var = 0; static starpu_data_handle_t handle; /* * Reduction methods */ #ifdef STARPU_USE_CUDA static void redux_cuda_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned *src = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[1]); unsigned host_dst, host_src; /* This is a dummy technique of course */ cudaMemcpyAsync(&host_src, src, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaMemcpyAsync(&host_dst, dst, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); host_dst += host_src; cudaMemcpyAsync(dst, &host_dst, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); } static void neutral_cuda_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); /* This is a dummy technique of course */ unsigned host_dst = 0; cudaMemcpyAsync(dst, &host_dst, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); } #endif #ifdef STARPU_USE_OPENCL static void redux_opencl_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned h_dst, h_src; cl_mem d_dst = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); cl_mem d_src = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[1]); cl_command_queue queue; starpu_opencl_get_current_queue(&queue); /* This is a dummy technique of course */ clEnqueueReadBuffer(queue, d_dst, CL_TRUE, 0, sizeof(unsigned), (void *)&h_dst, 0, NULL, NULL); clEnqueueReadBuffer(queue, d_src, CL_TRUE, 0, sizeof(unsigned), (void *)&h_src, 0, NULL, NULL); h_dst += h_src; clEnqueueWriteBuffer(queue, d_dst, CL_TRUE, 0, sizeof(unsigned), (void *)&h_dst, 0, NULL, NULL); } static void neutral_opencl_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned h_dst = 0; cl_mem d_dst = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); cl_command_queue queue; starpu_opencl_get_current_queue(&queue); clEnqueueWriteBuffer(queue, d_dst, CL_TRUE, 0, sizeof(unsigned), (void *)&h_dst, 0, NULL, NULL); } #endif void redux_cpu_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned *src = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[1]); *dst = *dst + *src; } void neutral_cpu_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *dst = 0; } static struct starpu_codelet redux_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {redux_cuda_kernel}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {redux_opencl_kernel}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs = {redux_cpu_kernel}, .cpu_funcs_name = {"redux_cpu_kernel"}, .modes = {STARPU_RW, STARPU_R}, .nbuffers = 2 }; static struct starpu_codelet neutral_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {neutral_cuda_kernel}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {neutral_opencl_kernel}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs = {neutral_cpu_kernel}, .cpu_funcs_name = {"neutral_cpu_kernel"}, .modes = {STARPU_W}, .nbuffers = 1 }; /* * Increment codelet */ #ifdef STARPU_USE_OPENCL /* dummy OpenCL implementation */ static void increment_opencl_kernel(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { STARPU_SKIP_IF_VALGRIND; cl_mem d_token = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned h_token; cl_command_queue queue; starpu_opencl_get_current_queue(&queue); clEnqueueReadBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); h_token++; clEnqueueWriteBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); } #endif #ifdef STARPU_USE_CUDA static void increment_cuda_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned host_token; /* This is a dummy technique of course */ cudaMemcpyAsync(&host_token, tokenptr, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); host_token++; cudaMemcpyAsync(tokenptr, &host_token, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); } #endif void increment_cpu_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *tokenptr = *tokenptr + 1; } static struct starpu_codelet increment_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {increment_cuda_kernel}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {increment_opencl_kernel}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs = {increment_cpu_kernel}, .cpu_funcs_name = {"increment_cpu_kernel"}, .nbuffers = 1, .modes = {STARPU_RW} }; struct starpu_codelet increment_cl_redux = { #ifdef STARPU_USE_CUDA .cuda_funcs = {increment_cuda_kernel}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {increment_opencl_kernel}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs = {increment_cpu_kernel}, .cpu_funcs_name = {"increment_cpu_kernel"}, .nbuffers = 1, .modes = {STARPU_REDUX} }; int main(int argc, char **argv) { int ret; /* Not supported yet */ if (starpu_get_env_number_default("STARPU_GLOBAL_ARBITER", 0) > 0) return STARPU_TEST_SKIPPED; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)&var, sizeof(unsigned)); starpu_data_set_reduction_methods(handle, &redux_cl, &neutral_cl); #ifdef STARPU_QUICK_CHECK unsigned ntasks = 32; unsigned nloops = 4; #else unsigned ntasks = 1024; unsigned nloops = 16; #endif unsigned loop; unsigned t; for (loop = 0; loop < nloops; loop++) { for (t = 0; t < ntasks; t++) { struct starpu_task *task = starpu_task_create(); if (t % 10 == 0) { task->cl = &increment_cl; } else { task->cl = &increment_cl_redux; } task->handles[0] = handle; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_data_acquire(handle, STARPU_R); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire"); if (var != ntasks * (loop+1)) { FPRINTF(stderr, "[end of loop] Value %u != Expected value %u\n", var, ntasks * (loop+1)); starpu_data_release(handle); starpu_data_unregister(handle); goto err; } starpu_data_release(handle); } starpu_data_unregister(handle); if (var != ntasks * nloops) { FPRINTF(stderr, "Value %u != Expected value %u\n", var, ntasks * (loop+1)); goto err; } starpu_shutdown(); return EXIT_SUCCESS; enodev: starpu_data_unregister(handle); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; err: starpu_shutdown(); STARPU_RETURN(EXIT_FAILURE); } starpu-1.2.3+dfsg/tests/datawizard/interfaces/000077500000000000000000000000001320135501600213655ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/datawizard/interfaces/bcsr/000077500000000000000000000000001320135501600223165ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/datawizard/interfaces/bcsr/bcsr_cuda.cu000066400000000000000000000040531320135501600245760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../test_interfaces.h" extern struct test_config bcsr_config; __global__ void bcsr_cuda(int *nzval, uint32_t nnz, int *err, int factor) { unsigned i = blockIdx.x*blockDim.x + threadIdx.x; if (i >= nnz) return; if (nzval[i] != i*factor) *err = 1; else nzval[i] = -nzval[i]; } extern "C" void test_bcsr_cuda_func(void *buffers[], void *args) { int factor; int *ret; int *val; cudaError_t error; uint32_t nnz = STARPU_BCSR_GET_NNZ(buffers[0]); uint32_t r = ((struct starpu_bcsr_interface *)buffers[0])->r; uint32_t c = ((struct starpu_bcsr_interface *)buffers[0])->c; nnz *= (r*c); unsigned threads_per_block = 64; unsigned nblocks = (nnz + threads_per_block-1) / threads_per_block; factor = *(int *) args; val = (int *) STARPU_BCSR_GET_NZVAL(buffers[0]); error = cudaMalloc(&ret, sizeof(int)); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); error = cudaMemcpy(ret, &bcsr_config.copy_failed, sizeof(int), cudaMemcpyHostToDevice); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); bcsr_cuda<<>> (val, nnz, ret, factor); error = cudaMemcpy(&bcsr_config.copy_failed, ret, sizeof(int), cudaMemcpyDeviceToHost); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); cudaFree(ret); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.2.3+dfsg/tests/datawizard/interfaces/bcsr/bcsr_interface.c000066400000000000000000000112131320135501600254310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012, 2013, 2015, 2017 CNRS * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" #include "../../../helper.h" /* * In this test, we use the following matrix: * * +----------------+ * | 0 1 0 0 | * | 2 3 0 0 | * | 4 5 8 9 | * | 6 7 10 11 | * +----------------+ * * nzval = [0, 1, 2, 3] ++ [4, 5, 6, 7] ++ [8, 9, 10, 11] * colind = [0, 0, 1] * rowptr = [0, 1, 3 ] * r = c = 2 */ /* Size of the blocks */ #define R 2 #define C 2 #define NNZ_BLOCKS 3 /* out of 4 */ #define NZVAL_SIZE (R*C*NNZ_BLOCKS) #define NROWS 2 #ifdef STARPU_USE_CPU void test_bcsr_cpu_func(void *buffers[], void *args); #endif /* !STARPU_USE_CPU */ #ifdef STARPU_USE_CUDA extern void test_bcsr_cuda_func(void *buffers[], void *_args); #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL extern void test_bcsr_opencl_func(void *buffers[], void *args); #endif /* !STARPU_USE_OPENCL */ static int nzval[NZVAL_SIZE] = { 0, 1, 2, 3, /* First block */ 4, 5, 6, 7, /* Second block */ 8, 9, 10, 11 /* Third block */ }; static int nzval2[NZVAL_SIZE]; static uint32_t colind[NNZ_BLOCKS] = { 0, 0, 1 }; static uint32_t colind2[NNZ_BLOCKS]; static uint32_t rowptr[NROWS+1] = { 0, 1, NNZ_BLOCKS }; static uint32_t rowptr2[NROWS+1] = { 0, 0, NNZ_BLOCKS }; static starpu_data_handle_t bcsr_handle; static starpu_data_handle_t bcsr2_handle; struct test_config bcsr_config = { #ifdef STARPU_USE_CPU .cpu_func = test_bcsr_cpu_func, #endif /* !STARPU_USE_CPU */ #ifdef STARPU_USE_CUDA .cuda_func = test_bcsr_cuda_func, #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL .opencl_func = test_bcsr_opencl_func, #endif /* !STARPU_USE_OPENCL */ #ifdef STARPU_USE_MIC .cpu_func_name = "test_bcsr_cpu_func", #endif .handle = &bcsr_handle, .dummy_handle = &bcsr2_handle, .copy_failed = SUCCESS, .name = "bcsr_interface" }; static void register_data(void) { starpu_bcsr_data_register(&bcsr_handle, STARPU_MAIN_RAM, NNZ_BLOCKS, NROWS, (uintptr_t) nzval, colind, rowptr, 0, /* firstentry */ R, C, sizeof(nzval[0])); starpu_bcsr_data_register(&bcsr2_handle, STARPU_MAIN_RAM, NNZ_BLOCKS, NROWS, (uintptr_t) nzval2, colind2, rowptr2, 0, /* firstentry */ R, C, sizeof(nzval2[0])); } static void unregister_data(void) { starpu_data_unregister(bcsr_handle); starpu_data_unregister(bcsr2_handle); } void test_bcsr_cpu_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; int *val; int factor; int i; uint32_t nnz = STARPU_BCSR_GET_NNZ(buffers[0]); uint32_t r = ((struct starpu_bcsr_interface *)buffers[0])->r; uint32_t c = ((struct starpu_bcsr_interface *)buffers[0])->c; if (r != R || c != C) { bcsr_config.copy_failed = FAILURE; return; } nnz *= (r*c); val = (int *) STARPU_BCSR_GET_NZVAL(buffers[0]); factor = *(int *) args; for (i = 0; i < (int)nnz; i++) { if (val[i] != i * factor) { bcsr_config.copy_failed = FAILURE; return; } val[i] *= -1; } #if 0 /* TODO */ /* Check colind */ uint32_t *col = STARPU_BCSR_GET_COLIND(buffers[0]); for (i = 0; i < NNZ_BLOCKS; i++) if (col[i] != colind[i]) bcsr_config.copy_failed = FAILURE; /* Check rowptr */ uint32_t *row = STARPU_BCSR_GET_ROWPTR(buffers[0]); for (i = 0; i < 1 + WIDTH/R; i++) if (row[i] != rowptr[i]) bcsr_config.copy_failed = FAILURE; #endif } int main(int argc, char **argv) { data_interface_test_summary *summary; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncuda = 2; conf.nopencl = 1; conf.nmic = -1; if (starpu_initialize(&conf, &argc, &argv) == -ENODEV || starpu_cpu_worker_get_count() == 0) return STARPU_TEST_SKIPPED; register_data(); summary = run_tests(&bcsr_config); if (!summary) exit(EXIT_FAILURE); unregister_data(); starpu_shutdown(); data_interface_test_summary_print(stderr, summary); return data_interface_test_summary_success(summary); } starpu-1.2.3+dfsg/tests/datawizard/interfaces/bcsr/bcsr_opencl.c000066400000000000000000000066651320135501600247700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 INRIA * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" #define KERNEL_LOCATION "tests/datawizard/interfaces/bcsr/bcsr_opencl_kernel.cl" extern struct test_config bcsr_config; static struct starpu_opencl_program opencl_program; void test_bcsr_opencl_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; int id, devid, ret; int factor = *(int *) args; cl_int err; cl_kernel kernel; cl_command_queue queue; cl_event event; ret = starpu_opencl_load_opencl_from_file(KERNEL_LOCATION, &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); uint32_t nnz = STARPU_BCSR_GET_NNZ(buffers[0]); uint32_t r = ((struct starpu_bcsr_interface *)buffers[0])->r; uint32_t c = ((struct starpu_bcsr_interface *)buffers[0])->c; nnz *= (r*c); cl_mem nzval = (cl_mem)STARPU_BCSR_GET_NZVAL(buffers[0]); cl_context context; id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); starpu_opencl_get_context(devid, &context); cl_mem fail = clCreateBuffer(context, CL_MEM_COPY_HOST_PTR, sizeof(int), &bcsr_config.copy_failed, &err); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_program, "test_bcsr_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); int nargs; nargs = starpu_opencl_set_kernel_args(&err, &kernel, sizeof(nzval), &nzval, sizeof(nnz), &nnz, sizeof(fail), &fail, sizeof(factor), &factor, 0); if (nargs != 4) { fprintf(stderr, "Failed to set argument #%d\n", err); STARPU_OPENCL_REPORT_ERROR(err); } { size_t global = nnz; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local = global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } err = clEnqueueReadBuffer(queue, fail, CL_TRUE, 0, sizeof(int), &bcsr_config.copy_failed, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); starpu_opencl_collect_stats(event); clReleaseEvent(event); starpu_opencl_release_kernel(kernel); ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); } starpu-1.2.3+dfsg/tests/datawizard/interfaces/bcsr/bcsr_opencl_kernel.cl000066400000000000000000000016111320135501600264660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ __kernel void test_bcsr_opencl(__global int *val, unsigned int nx, __global int *err, int factor) { const int i = get_global_id(0); if (i >= nx) return; if (val[i] != i * factor) *err = 1; else val[i] = - val[i]; } starpu-1.2.3+dfsg/tests/datawizard/interfaces/block/000077500000000000000000000000001320135501600224575ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/datawizard/interfaces/block/block_cuda.cu000066400000000000000000000043201320135501600250750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../test_interfaces.h" extern struct test_config block_config; static __global__ void block_cuda(int *block, int nx, int ny, int nz, unsigned ldy, unsigned ldz, float factor, int *err) { int i, j, k; int val = 0; for (k = 0; k < nz ;k++) { for (j = 0; j < ny ;j++) { for(i = 0; i < nx ;i++) { if (block[(k*ldz)+(j*ldy)+i] != factor * val) { *err = 1; return; } else { block[(k*ldz)+(j*ldy)+i] *= -1; val++; } } } } } extern "C" void test_block_cuda_func(void *buffers[], void *args) { cudaError_t error; int *ret; error = cudaMalloc(&ret, sizeof(int)); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); error = cudaMemcpy(ret, &block_config.copy_failed, sizeof(int), cudaMemcpyHostToDevice); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); int nx = STARPU_BLOCK_GET_NX(buffers[0]); int ny = STARPU_BLOCK_GET_NY(buffers[0]); int nz = STARPU_BLOCK_GET_NZ(buffers[0]); unsigned ldy = STARPU_BLOCK_GET_LDY(buffers[0]); unsigned ldz = STARPU_BLOCK_GET_LDZ(buffers[0]); int *block = (int *) STARPU_BLOCK_GET_PTR(buffers[0]); int factor = *(int*) args; block_cuda<<<1,1, 0, starpu_cuda_get_local_stream()>>> (block, nx, ny, nz, ldy, ldz, factor, ret); error = cudaMemcpy(&block_config.copy_failed, ret, sizeof(int), cudaMemcpyDeviceToHost); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); cudaFree(ret); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.2.3+dfsg/tests/datawizard/interfaces/block/block_interface.c000066400000000000000000000075331320135501600257450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" #include "../../../helper.h" #define NX 16 #define NY NX #define NZ NX /* Prototypes */ static void register_data(void); static void unregister_data(void); void test_block_cpu_func(void *buffers[], void *args); #ifdef STARPU_USE_CUDA extern void test_block_cuda_func(void *buffers[], void *_args); #endif #ifdef STARPU_USE_OPENCL extern void test_block_opencl_func(void *buffers[], void *args); #endif static starpu_data_handle_t _block_handle; static starpu_data_handle_t _block2_handle; struct test_config block_config = { .cpu_func = test_block_cpu_func, #ifdef STARPU_USE_CUDA .cuda_func = test_block_cuda_func, #endif #ifdef STARPU_USE_OPENCL .opencl_func = test_block_opencl_func, #endif #ifdef STARPU_USE_MIC .cpu_func_name = "test_block_cpu_func", #endif .handle = &_block_handle, .dummy_handle = &_block2_handle, .copy_failed = SUCCESS, .name = "block_interface" }; static int _block[NX*NY*NZ]; static int _block2[NX*NY*NZ]; static void register_data(void) { /* Initializing data */ int val = 0; int i, j, k; for (k = 0; k < NZ; k++) for (j = 0; j < NY; j++) for (i = 0; i < NX; i++) _block[(k*NX*NY)+(j*NX)+i] = val++; /* Registering data */ starpu_block_data_register(&_block_handle, STARPU_MAIN_RAM, (uintptr_t)_block, NX, NX * NY, NX, NY, NZ, sizeof(_block[0])); starpu_block_data_register(&_block2_handle, STARPU_MAIN_RAM, (uintptr_t)_block2, NX, NX * NY, NX, NY, NZ, sizeof(_block2[0])); } static void unregister_data(void) { starpu_data_unregister(_block_handle); starpu_data_unregister(_block2_handle); } void test_block_cpu_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; int factor = *(int*)args; int nx = STARPU_BLOCK_GET_NX(buffers[0]); int ny = STARPU_BLOCK_GET_NY(buffers[0]); int nz = STARPU_BLOCK_GET_NZ(buffers[0]); unsigned ldy = STARPU_BLOCK_GET_LDY(buffers[0]); unsigned ldz = STARPU_BLOCK_GET_LDZ(buffers[0]); int *block = (int *) STARPU_BLOCK_GET_PTR(buffers[0]); int i, j, k; int val = 0; block_config.copy_failed = SUCCESS; for (k = 0; k < nz; k++) { for (j = 0; j < ny; j++) { for (i = 0; i < nx; i++) { if (block[(k*ldz)+(j*ldy)+i] != factor * val) { block_config.copy_failed = FAILURE; return; } else { block[(k*ldz)+(j*ldy)+i] *= -1; val++; } } } } } int main(int argc, char **argv) { data_interface_test_summary *summary; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncuda = 2; conf.nopencl = 1; conf.nmic = -1; if (starpu_initialize(&conf, &argc, &argv) == -ENODEV || starpu_cpu_worker_get_count() == 0) goto enodev; register_data(); summary = run_tests(&block_config); if (!summary) exit(EXIT_FAILURE); unregister_data(); starpu_shutdown(); data_interface_test_summary_print(stderr, summary); return data_interface_test_summary_success(summary); enodev: return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/interfaces/block/block_opencl.c000066400000000000000000000063441320135501600252640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" #define KERNEL_LOCATION "tests/datawizard/interfaces/block/block_opencl_kernel.cl" extern struct test_config block_config; static struct starpu_opencl_program opencl_program; void test_block_opencl_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; int id, devid, ret; int factor = *(int *) args; cl_int err; cl_kernel kernel; cl_command_queue queue; cl_event event; ret = starpu_opencl_load_opencl_from_file(KERNEL_LOCATION, &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); int nx = STARPU_BLOCK_GET_NX(buffers[0]); int ny = STARPU_BLOCK_GET_NY(buffers[0]); int nz = STARPU_BLOCK_GET_NZ(buffers[0]); unsigned ldy = STARPU_BLOCK_GET_LDY(buffers[0]); unsigned ldz = STARPU_BLOCK_GET_LDZ(buffers[0]); cl_mem block = (cl_mem) STARPU_BLOCK_GET_DEV_HANDLE(buffers[0]); cl_context context; id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); starpu_opencl_get_context(devid, &context); cl_mem fail = clCreateBuffer(context, CL_MEM_COPY_HOST_PTR, sizeof(int), &block_config.copy_failed, &err); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_program, "block_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); int nargs; nargs = starpu_opencl_set_kernel_args(&err, &kernel, sizeof(block), &block, sizeof(nx), &nx, sizeof(ny), &ny, sizeof(nz), &nz, sizeof(ldy), &ldy, sizeof(ldz), &ldz, sizeof(factor), &factor, sizeof(fail), &fail, 0); if (nargs != 8) { fprintf(stderr, "Failed to set argument #%d\n", nargs); STARPU_OPENCL_REPORT_ERROR(err); } { size_t global = nx * ny * nz; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, NULL, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } err = clEnqueueReadBuffer(queue, fail, CL_TRUE, 0, sizeof(int), &block_config.copy_failed, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); starpu_opencl_collect_stats(event); clReleaseEvent(event); starpu_opencl_release_kernel(kernel); ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); } starpu-1.2.3+dfsg/tests/datawizard/interfaces/block/block_opencl_kernel.cl000066400000000000000000000022241320135501600267710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ __kernel void block_opencl(__global int *block, int nx, int ny, int nz, int ldy, int ldz, int factor, __global int *err) { const int id = get_global_id(0); if (id > 0) return; unsigned int i, j, k; int val = 0; for (k = 0; k < nz; k++) { for (j = 0; j < ny; j++) { for (i = 0; i < nx; i++) { if (block[(k*ldz)+(j*ldy)+i] != factor * val) { *err = 1; return; } else { block[(k*ldz)+(j*ldy)+i] *= -1; val++; } } } } } starpu-1.2.3+dfsg/tests/datawizard/interfaces/coo/000077500000000000000000000000001320135501600221455ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/datawizard/interfaces/coo/coo_cuda.cu000066400000000000000000000036151320135501600242570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../test_interfaces.h" extern struct test_config coo_config; __global__ void coo_cuda(int *val, uint32_t n, int *err, int factor) { unsigned i = blockIdx.x*blockDim.x + threadIdx.x; if (i >= n) return; if (val[i] != i * factor) *err = 1; else val[i] *= -1; } extern "C" void test_coo_cuda_func(void *buffers[], void *args) { int factor; int *ret; int *val; cudaError_t error; uint32_t nvalues = STARPU_COO_GET_NVALUES(buffers[0]); unsigned threads_per_block = 64; unsigned nblocks = (nvalues + threads_per_block-1) / threads_per_block; factor = *(int *) args; val = (int *) STARPU_COO_GET_VALUES(buffers[0]); error = cudaMalloc(&ret, sizeof(int)); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); error = cudaMemcpy(ret, &coo_config.copy_failed, sizeof(int), cudaMemcpyHostToDevice); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); coo_cuda<<>> (val, nvalues, ret, factor); error = cudaMemcpy(&coo_config.copy_failed, ret, sizeof(int), cudaMemcpyDeviceToHost); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); cudaFree(ret); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.2.3+dfsg/tests/datawizard/interfaces/coo/coo_interface.c000066400000000000000000000072221320135501600251140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../test_interfaces.h" #define NX 2 #define NY 2 #define MATRIX_SIZE (NX*NY) #if defined(STARPU_USE_CPU) || defined(STAPRU_USE_MIC) void test_coo_cpu_func(void *buffers[], void *args); #endif #ifdef STARPU_USE_CUDA extern void test_coo_cuda_func(void *buffers[], void *args); #endif #ifdef STARPU_USE_OPENCL extern void test_coo_opencl_func(void *buffers[], void *args); #endif static starpu_data_handle_t coo_handle, coo2_handle; struct test_config coo_config = { #ifdef STARPU_USE_CPU .cpu_func = test_coo_cpu_func, #endif /* ! STARPU_USE_CPU */ #ifdef STARPU_USE_CUDA .cuda_func = test_coo_cuda_func, #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL .opencl_func = test_coo_opencl_func, #endif /* !STARPU_USE_OPENCL */ #ifdef STARPU_USE_MIC .cpu_func_name = "test_coo_cpu_func", #endif .handle = &coo_handle, .dummy_handle = &coo2_handle, .copy_failed = SUCCESS, .name = "coo_interface" }; void test_coo_cpu_func(void *buffers[], void *args) { int factor = *(int *) args; int *values = (int *) STARPU_COO_GET_VALUES(buffers[0]); unsigned size = STARPU_COO_GET_NVALUES(buffers[0]); int i; for (i = 0; i < (int)size; i++) { if (values[i] != i * factor) { coo_config.copy_failed = FAILURE; return; } values[i] *= -1; } } static uint32_t columns[MATRIX_SIZE]; static uint32_t rows[MATRIX_SIZE]; static int values[MATRIX_SIZE]; static uint32_t columns2[MATRIX_SIZE]; static uint32_t rows2[MATRIX_SIZE]; static int values2[MATRIX_SIZE]; static void register_data(void) { /* We use the following matrix : +---+---+ | 0 | 1 | +---+---+ | 2 | 3 | +---+---+ Of course, we're not supposed to register the zeros, but it does not matter for this test. */ columns[0] = 0; rows[0] = 0; values[0] = 0; columns[1] = 1; rows[1] = 0; values[1] = 1; columns[2] = 0; rows[2] = 1; values[2] = 2; columns[3] = 1; rows[3] = 1; values[3] = 3; int i; for (i = 0; i < MATRIX_SIZE; i++) { columns2[i] = -1; rows2[i] = -1; values2[i] = -1; } starpu_coo_data_register(&coo_handle, STARPU_MAIN_RAM, NX, NY, MATRIX_SIZE, columns, rows, (uintptr_t) values, sizeof(values[0])); starpu_coo_data_register(&coo2_handle, STARPU_MAIN_RAM, NX, NY, MATRIX_SIZE, columns2, rows2, (uintptr_t) values2, sizeof(values2[0])); } static void unregister_data(void) { starpu_data_unregister(coo_handle); starpu_data_unregister(coo2_handle); } int main(int argc, char **argv) { struct starpu_conf conf; data_interface_test_summary *summary; starpu_conf_init(&conf); conf.ncuda = 2; conf.nopencl = 1; conf.nmic = -1; if (starpu_initialize(&conf, &argc, &argv) == -ENODEV || starpu_cpu_worker_get_count() == 0) goto enodev; register_data(); summary = run_tests(&coo_config); if (!summary) exit(EXIT_FAILURE); unregister_data(); data_interface_test_summary_print(stderr, summary); starpu_shutdown(); return data_interface_test_summary_success(summary); enodev: return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/interfaces/coo/coo_opencl.c000066400000000000000000000065221320135501600244360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" #define KERNEL_LOCATION "tests/datawizard/interfaces/coo/coo_opencl_kernel.cl" extern struct test_config coo_config; static struct starpu_opencl_program coo_program; void test_coo_opencl_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; int id, devid, factor, ret; unsigned int n; cl_int err; cl_kernel kernel; cl_command_queue queue; cl_event event; cl_context context; cl_mem val, fail; ret = starpu_opencl_load_opencl_from_file(KERNEL_LOCATION, &coo_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); factor = *(int *)args; n = STARPU_COO_GET_NVALUES(buffers[0]); val = (cl_mem) STARPU_COO_GET_VALUES(buffers[0]); id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); starpu_opencl_get_context(devid, &context); err = starpu_opencl_load_kernel(&kernel, &queue, &coo_program, "test_coo_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); fail = clCreateBuffer(context, CL_MEM_COPY_HOST_PTR, sizeof(int), &coo_config.copy_failed, &err); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); /* Setting args */ int nargs; nargs = starpu_opencl_set_kernel_args(&err, &kernel, sizeof(val), &val, sizeof(n), &n, sizeof(fail), &fail, sizeof(factor), &factor, 0); if (nargs != 4) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=n; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local = global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } err = clEnqueueReadBuffer(queue, fail, CL_TRUE, 0, sizeof(int), &coo_config.copy_failed, 0, NULL, NULL); if (coo_config.copy_failed != 0) { fprintf(stderr, "FUCK copy_failed %d\n", coo_config.copy_failed); } if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); starpu_opencl_collect_stats(event); clReleaseEvent(event); starpu_opencl_release_kernel(kernel); ret = starpu_opencl_unload_opencl(&coo_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); } starpu-1.2.3+dfsg/tests/datawizard/interfaces/coo/coo_opencl_kernel.cl000066400000000000000000000016111320135501600261440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ __kernel void test_coo_opencl(__global int *val, unsigned int nx, __global int *err, int factor) { const int i = get_global_id(0); if (i >= nx) return; if (val[i] != i * factor) *err = val[1]; else val[i] = - val[i]; } starpu-1.2.3+dfsg/tests/datawizard/interfaces/copy_interfaces.c000066400000000000000000000053511320135501600247120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../../helper.h" #include static int check_copy(starpu_data_handle_t handle, char *header) { void *old_interface, *new_interface; starpu_data_handle_t new_handle; int ret=0; starpu_data_register_same(&new_handle, handle); if (!getenv("STARPU_SSILENT") && new_handle->ops->display) { fprintf(stderr, "%s: ", header); new_handle->ops->display(new_handle, stderr); fprintf(stderr, "\n"); } old_interface = starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); new_interface = starpu_data_get_interface_on_node(new_handle, STARPU_MAIN_RAM); if (new_handle->ops->compare(old_interface, new_interface) == 0) { FPRINTF(stderr, "Error when copying %s data\n", header); ret = 1; } starpu_data_unregister(handle); starpu_data_unregister(new_handle); return ret; } int main(int argc, char **argv) { int ret; starpu_data_handle_t handle; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); { int x=42; starpu_variable_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)&x, sizeof(x)); ret = check_copy(handle, "variable"); } if (ret == 0) { int xx[] = {12, 23, 45}; starpu_vector_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)xx, 3, sizeof(xx[0])); ret = check_copy(handle, "vector"); } if (ret == 0) { int NX=3; int NY=2; int matrix[NX][NY]; starpu_matrix_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)matrix, NX, NX, NY, sizeof(matrix[0][0])); ret = check_copy(handle, "matrix"); } if (ret == 0) { int NX=3; int NY=2; int NZ=4; int block[NX*NY*NZ]; starpu_block_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)block, NX, NX*NY, NX, NY, NZ, sizeof(block[0])); ret = check_copy(handle, "block"); } if (ret == 0) { uint32_t nnz = 2; unsigned nrow = 5; float nzvalA[nnz]; uint32_t colind[nnz]; uint32_t rowptr[nrow+1]; starpu_csr_data_register(&handle, STARPU_MAIN_RAM, nnz, nrow, (uintptr_t)nzvalA, colind, rowptr, 0, sizeof(float)); ret = check_copy(handle, "csr"); } starpu_shutdown(); return ret; } starpu-1.2.3+dfsg/tests/datawizard/interfaces/csr/000077500000000000000000000000001320135501600221545ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/datawizard/interfaces/csr/csr_cuda.cu000066400000000000000000000036151320135501600242750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../test_interfaces.h" extern struct test_config csr_config; __global__ void csr_cuda(int *nzval, uint32_t nnz, int *err, int factor) { unsigned i = blockIdx.x*blockDim.x + threadIdx.x; if (i >= nnz) return; if (nzval[i] != (i+1)*factor) *err = 1; else nzval[i] = -nzval[i]; } extern "C" void test_csr_cuda_func(void *buffers[], void *args) { int factor; int *ret; int *val; cudaError_t error; uint32_t nnz = STARPU_CSR_GET_NNZ(buffers[0]); unsigned threads_per_block = 64; unsigned nblocks = (nnz + threads_per_block-1) / threads_per_block; factor = *(int *) args; val = (int *) STARPU_CSR_GET_NZVAL(buffers[0]); error = cudaMalloc(&ret, sizeof(int)); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); error = cudaMemcpy(ret, &csr_config.copy_failed, sizeof(int), cudaMemcpyHostToDevice); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); csr_cuda<<>> (val, nnz, ret, factor); error = cudaMemcpy(&csr_config.copy_failed, ret, sizeof(int), cudaMemcpyDeviceToHost); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); cudaFree(ret); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.2.3+dfsg/tests/datawizard/interfaces/csr/csr_interface.c000066400000000000000000000070241320135501600251320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" #include "../../../helper.h" #define WIDTH 8 #define HEIGHT 4 #define SIZE (WIDTH * HEIGHT) #define NNZ (SIZE-1) #ifdef STARPU_USE_CPU void test_csr_cpu_func(void *buffers[], void *args); #endif /* !STARPU_USE_CPU */ #ifdef STARPU_USE_CUDA extern void test_csr_cuda_func(void *buffers[], void *_args); #endif #ifdef STARPU_USE_OPENCL extern void test_csr_opencl_func(void *buffers[], void *args); #endif static int nzval[NNZ]; static int nzval2[NNZ]; static uint32_t colind[NNZ]; static uint32_t colind2[NNZ]; static uint32_t rowptr[HEIGHT+1]; static uint32_t rowptr2[HEIGHT+1]; static starpu_data_handle_t csr_handle; static starpu_data_handle_t csr2_handle; struct test_config csr_config = { #ifdef STARPU_USE_CPU .cpu_func = test_csr_cpu_func, #endif /* ! STARPU_USE_CPU */ #ifdef STARPU_USE_CUDA .cuda_func = test_csr_cuda_func, #endif #ifdef STARPU_USE_OPENCL .opencl_func = test_csr_opencl_func, #endif #ifdef STARPU_USE_MIC .cpu_func_name = "test_csr_cpu_func", #endif .handle = &csr_handle, .dummy_handle = &csr2_handle, .copy_failed = SUCCESS, .name = "csr_interface" }; static void register_data(void) { int i; for (i = 1; i < SIZE; i++) { nzval[i-1] = i; nzval2[i-1] = 42; colind[i-1] = i % WIDTH; colind2[i-1] = colind[i-1]; } rowptr[0] = 1; rowptr2[0] = 1; for (i = 1; i < HEIGHT; i++) { rowptr[i] = i * WIDTH; rowptr2[i] = rowptr[i]; } rowptr[HEIGHT] = NNZ + 1; rowptr2[HEIGHT] = rowptr[HEIGHT]; starpu_csr_data_register(&csr_handle, STARPU_MAIN_RAM, NNZ, HEIGHT, (uintptr_t) nzval, colind, rowptr, 0, sizeof(nzval[0])); starpu_csr_data_register(&csr2_handle, STARPU_MAIN_RAM, NNZ, HEIGHT, (uintptr_t) nzval2, colind2, rowptr2, 0, sizeof(nzval2[0])); } static void unregister_data(void) { starpu_data_unregister(csr_handle); starpu_data_unregister(csr2_handle); } void test_csr_cpu_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; int *val; int factor; int i; uint32_t nnz = STARPU_CSR_GET_NNZ(buffers[0]); val = (int *) STARPU_CSR_GET_NZVAL(buffers[0]); factor = *(int *) args; for (i = 0; i < (int)nnz; i++) { if (val[i] != (i+1) * factor) { csr_config.copy_failed = FAILURE; return; } val[i] *= -1; } } int main(int argc, char **argv) { data_interface_test_summary *summary; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncuda = 2; conf.nopencl = 1; conf.nmic = -1; if (starpu_initialize(&conf, &argc, &argv) == -ENODEV || starpu_cpu_worker_get_count() == 0) goto enodev; register_data(); summary = run_tests(&csr_config); if (!summary) exit(EXIT_FAILURE); unregister_data(); starpu_shutdown(); data_interface_test_summary_print(stderr, summary); return data_interface_test_summary_success(summary); enodev: return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/interfaces/csr/csr_opencl.c000066400000000000000000000064211320135501600244520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" #define KERNEL_LOCATION "tests/datawizard/interfaces/csr/csr_opencl_kernel.cl" extern struct test_config csr_config; static struct starpu_opencl_program opencl_program; void test_csr_opencl_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; int id, devid, ret; int factor = *(int *) args; cl_int err; cl_kernel kernel; cl_command_queue queue; cl_event event; ret = starpu_opencl_load_opencl_from_file(KERNEL_LOCATION, &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); uint32_t nnz = STARPU_CSR_GET_NNZ(buffers[0]); cl_mem nzval = (cl_mem)STARPU_CSR_GET_NZVAL(buffers[0]); cl_context context; id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); starpu_opencl_get_context(devid, &context); cl_mem fail = clCreateBuffer(context, CL_MEM_COPY_HOST_PTR, sizeof(int), &csr_config.copy_failed, &err); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_program, "test_csr_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); int nargs; nargs = starpu_opencl_set_kernel_args(&err, &kernel, sizeof(nzval), &nzval, sizeof(nnz), &nnz, sizeof(fail), &fail, sizeof(factor), &factor, 0); if (nargs != 4) { fprintf(stderr, "Failed to set argument #%d\n", err); STARPU_OPENCL_REPORT_ERROR(err); } { size_t global = nnz; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local = global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } err = clEnqueueReadBuffer(queue, fail, CL_TRUE, 0, sizeof(int), &csr_config.copy_failed, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); starpu_opencl_collect_stats(event); clReleaseEvent(event); starpu_opencl_release_kernel(kernel); ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); } starpu-1.2.3+dfsg/tests/datawizard/interfaces/csr/csr_opencl_kernel.cl000066400000000000000000000016111320135501600261620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ __kernel void test_csr_opencl(__global int *val, unsigned int nx, __global int *err, int factor) { const int i = get_global_id(0); if (i >= nx) return; if (val[i] != (i+1) * factor) *err = 1; else val[i] = - val[i]; } starpu-1.2.3+dfsg/tests/datawizard/interfaces/matrix/000077500000000000000000000000001320135501600226715ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/datawizard/interfaces/matrix/matrix_cuda.cu000066400000000000000000000037221320135501600255260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../test_interfaces.h" extern struct test_config matrix_config; __global__ void matrix_cuda(int *val, unsigned n, int *err, int factor) { unsigned i = blockIdx.x*blockDim.x + threadIdx.x; if (i >= n) return; if (val[i] != i*factor) *err = 1; else val[i] = -val[i]; } extern "C" void test_matrix_cuda_func(void *buffers[], void *args) { int factor; int *ret; int *val; cudaError_t error; unsigned int nx, ny, n; nx = STARPU_MATRIX_GET_NX(buffers[0]); ny = STARPU_MATRIX_GET_NY(buffers[0]); n = nx * ny; unsigned threads_per_block = 64; unsigned nblocks = (n + threads_per_block-1) / threads_per_block; factor = *(int *) args; val = (int *) STARPU_MATRIX_GET_PTR(buffers[0]); error = cudaMalloc(&ret, sizeof(int)); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); error = cudaMemcpy(ret, &matrix_config.copy_failed, sizeof(int), cudaMemcpyHostToDevice); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); matrix_cuda<<>>(val, n, ret, factor); error = cudaMemcpy(&matrix_config.copy_failed, ret, sizeof(int), cudaMemcpyDeviceToHost); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); cudaFree(ret); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.2.3+dfsg/tests/datawizard/interfaces/matrix/matrix_interface.c000066400000000000000000000063731320135501600263720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" #include "../../../helper.h" #define WIDTH 16 #define HEIGHT 16 #ifdef STARPU_USE_CPU void test_matrix_cpu_func(void *buffers[], void *args); #endif /* !STARPU_USE_CPU */ #ifdef STARPU_USE_CUDA extern void test_matrix_cuda_func(void *buffers[], void *_args); #endif #ifdef STARPU_USE_OPENCL extern void test_matrix_opencl_func(void *buffers[], void *args); #endif static starpu_data_handle_t matrix_handle; static starpu_data_handle_t matrix2_handle; struct test_config matrix_config = { #ifdef STARPU_USE_CPU .cpu_func = test_matrix_cpu_func, #endif /* ! STARPU_USE_CPU */ #ifdef STARPU_USE_CUDA .cuda_func = test_matrix_cuda_func, #endif #ifdef STARPU_USE_OPENCL .opencl_func = test_matrix_opencl_func, #endif #ifdef STARPU_USE_MIC .cpu_func_name = "test_matrix_cpu_func", #endif .handle = &matrix_handle, .dummy_handle = &matrix2_handle, .copy_failed = SUCCESS, .name = "matrix_interface" }; static int matrix[WIDTH * HEIGHT]; static int matrix2[WIDTH * HEIGHT]; static void register_data(void) { int i; int size = WIDTH * HEIGHT; for (i = 0; i < size; i++) matrix[i] = i; starpu_matrix_data_register(&matrix_handle, STARPU_MAIN_RAM, (uintptr_t) matrix, WIDTH, /* ld */ WIDTH, HEIGHT, sizeof(matrix[0])); starpu_matrix_data_register(&matrix2_handle, STARPU_MAIN_RAM, (uintptr_t) matrix2, WIDTH, /* ld */ WIDTH, HEIGHT, sizeof(matrix[0])); } static void unregister_data(void) { starpu_data_unregister(matrix_handle); starpu_data_unregister(matrix2_handle); } void test_matrix_cpu_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; int *val; int factor; int i; int nx, ny; nx = STARPU_MATRIX_GET_NX(buffers[0]); ny = STARPU_MATRIX_GET_NY(buffers[0]); val = (int *) STARPU_MATRIX_GET_PTR(buffers[0]); factor = *(int *) args; for (i = 0; i < nx*ny; i++) { if (val[i] != i * factor) { matrix_config.copy_failed = FAILURE; return; } val[i] *= -1; } } int main(int argc, char **argv) { data_interface_test_summary *summary; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncuda = 2; conf.nopencl = 1; conf.nmic = -1; if (starpu_initialize(&conf, &argc, &argv) == -ENODEV || starpu_cpu_worker_get_count() == 0) goto enodev; register_data(); summary = run_tests(&matrix_config); if (!summary) exit(EXIT_FAILURE); unregister_data(); starpu_shutdown(); data_interface_test_summary_print(stderr, summary); return data_interface_test_summary_success(summary); enodev: return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/interfaces/matrix/matrix_opencl.c000066400000000000000000000064501320135501600257060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" #define KERNEL_LOCATION "tests/datawizard/interfaces/matrix/matrix_opencl_kernel.cl" extern struct test_config matrix_config; static struct starpu_opencl_program matrix_program; void test_matrix_opencl_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; int id, devid, factor, ret; unsigned int n; cl_int err; cl_kernel kernel; cl_command_queue queue; cl_event event; cl_context context; cl_mem val, fail; ret = starpu_opencl_load_opencl_from_file(KERNEL_LOCATION, &matrix_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); factor = *(int *)args; n = STARPU_MATRIX_GET_NX(buffers[0]); n*= STARPU_MATRIX_GET_NY(buffers[0]); val = (cl_mem)STARPU_MATRIX_GET_DEV_HANDLE(buffers[0]); id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); starpu_opencl_get_context(devid, &context); err = starpu_opencl_load_kernel(&kernel, &queue, &matrix_program, "matrix_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); fail = clCreateBuffer(context, CL_MEM_COPY_HOST_PTR, sizeof(int), &matrix_config.copy_failed, &err); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); /* Setting args */ int nargs; nargs = starpu_opencl_set_kernel_args(&err, &kernel, sizeof(val), &val, sizeof(n), &n, sizeof(fail), &fail, sizeof(factor), &factor, 0); if (nargs != 4) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=n; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local = global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } err = clEnqueueReadBuffer(queue, fail, CL_TRUE, 0, sizeof(int), &matrix_config.copy_failed, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); starpu_opencl_collect_stats(event); clReleaseEvent(event); starpu_opencl_release_kernel(kernel); ret = starpu_opencl_unload_opencl(&matrix_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); } starpu-1.2.3+dfsg/tests/datawizard/interfaces/matrix/matrix_opencl_kernel.cl000066400000000000000000000015541320135501600274220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ __kernel void matrix_opencl(__global int *val, unsigned int nx, __global int *err, int factor) { const int i = get_global_id(0); if (i >= nx) return; if (val[i] != i * factor) *err = i; else val[i] *= -1; } starpu-1.2.3+dfsg/tests/datawizard/interfaces/multiformat/000077500000000000000000000000001320135501600237305ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/datawizard/interfaces/multiformat/advanced/000077500000000000000000000000001320135501600254755ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/datawizard/interfaces/multiformat/advanced/generic.c000066400000000000000000000121761320135501600272640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "generic.h" #include "../../../../helper.h" struct stats global_stats; #ifdef STARPU_USE_CPU void cpu_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; global_stats.cpu++; } #endif /* !STARPU_USE_CPU */ #ifdef STARPU_USE_CUDA void cuda_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; global_stats.cuda++; } void cpu_to_cuda_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; global_stats.cpu_to_cuda++; } void cuda_to_cpu_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; global_stats.cuda_to_cpu++; } struct starpu_codelet cpu_to_cuda_cl = { .cuda_funcs = {cpu_to_cuda_func}, .nbuffers = 1 }; struct starpu_codelet cuda_to_cpu_cl = { .cpu_funcs = {cuda_to_cpu_func}, .nbuffers = 1 }; #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL void opencl_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; global_stats.opencl++; } static void cpu_to_opencl_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; global_stats.cpu_to_opencl++; } static void opencl_to_cpu_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; global_stats.opencl_to_cpu++; } struct starpu_codelet cpu_to_opencl_cl = { .opencl_funcs = {cpu_to_opencl_func}, .nbuffers = 1 }; struct starpu_codelet opencl_to_cpu_cl = { .cpu_funcs = {opencl_to_cpu_func}, .nbuffers = 1 }; #endif /* !STARPU_USE_OPENCL */ #ifdef STARPU_USE_MIC void mic_dummy_kernel(void *buffers[], void *cl_arg) { } starpu_mic_kernel_t mic_get_kernel() { static starpu_mic_func_symbol_t mic_symbol = NULL; if (mic_symbol == NULL) starpu_mic_register_kernel(&mic_symbol, "mic_dummy_kernel"); return starpu_mic_get_kernel(mic_symbol); } starpu_mic_kernel_t mic_func() { STARPU_SKIP_IF_VALGRIND; global_stats.mic++; return mic_get_kernel(); } starpu_mic_kernel_t cpu_to_mic_func() { STARPU_SKIP_IF_VALGRIND; global_stats.cpu_to_mic++; return mic_get_kernel(); } void mic_to_cpu_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; global_stats.mic_to_cpu++; } struct starpu_codelet cpu_to_mic_cl = { .mic_funcs = {cpu_to_mic_func}, .nbuffers = 1 }; struct starpu_codelet mic_to_cpu_cl = { .cpu_funcs = {mic_to_cpu_func}, .nbuffers = 1 }; #endif // STARPU_USE_MIC struct starpu_multiformat_data_interface_ops ops = { #ifdef STARPU_USE_CUDA .cuda_elemsize = sizeof(int), .cpu_to_cuda_cl = &cpu_to_cuda_cl, .cuda_to_cpu_cl = &cuda_to_cpu_cl, #endif #ifdef STARPU_USE_OPENCL .opencl_elemsize = sizeof(int), .cpu_to_opencl_cl = &cpu_to_opencl_cl, .opencl_to_cpu_cl = &opencl_to_cpu_cl, #endif #ifdef STARPU_USE_MIC .mic_elemsize = sizeof(int), .cpu_to_mic_cl = &cpu_to_mic_cl, .mic_to_cpu_cl = &mic_to_cpu_cl, #endif .cpu_elemsize = sizeof(int) }; void print_stats(struct stats *s) { #ifdef STARPU_USE_CPU FPRINTF(stderr, "cpu : %u\n", s->cpu); #endif /* !STARPU_USE_CPU */ #ifdef STARPU_USE_CUDA FPRINTF(stderr, "cuda : %u\n" "cpu->cuda : %u\n" "cuda->cpu : %u\n", s->cuda, s->cpu_to_cuda, s->cuda_to_cpu); #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL FPRINTF(stderr, "opencl : %u\n" "cpu->opencl : %u\n" "opencl->cpu : %u\n", s->opencl, s->cpu_to_opencl, s->opencl_to_cpu); #endif /* !STARPU_USE_OPENCL */ #ifdef STARPU_USE_MIC FPRINTF(stderr, "mic : %u\n" "cpu->mic : %u\n" "mic->cpu : %u\n", s->mic, s->cpu_to_mic, s->mic_to_cpu); #endif } void reset_stats(struct stats *s) { #ifdef STARPU_USE_CPU s->cpu = 0; #endif /* !STARPU_USE_CPU */ #ifdef STARPU_USE_CUDA s->cuda = 0; s->cpu_to_cuda = 0; s->cuda_to_cpu = 0; #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL s->opencl = 0; s->cpu_to_opencl = 0; s->opencl_to_cpu = 0; #endif /* !STARPU_USE_OPENCL */ #ifdef STARPU_USE_MIC s->mic = 0; s->cpu_to_mic = 0; s->mic_to_cpu = 0; #endif } int compare_stats(struct stats *s1, struct stats *s2) { if ( #ifdef STARPU_USE_CPU s1->cpu == s2->cpu && #endif /* !STARPU_USE_CPU */ #ifdef STARPU_USE_CUDA s1->cuda == s2->cuda && s1->cpu_to_cuda == s2->cpu_to_cuda && s1->cuda_to_cpu == s2->cuda_to_cpu && #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL s1->opencl == s2->opencl && s1->cpu_to_opencl == s2->cpu_to_opencl && s1->opencl_to_cpu == s2->opencl_to_cpu && #endif /* !STARPU_USE_OPENCL */ #ifdef STARPU_USE_MIC s1->mic == s2->mic && s1->cpu_to_mic == s2->cpu_to_mic && s1->mic_to_cpu == s2->mic_to_cpu && #endif 1 /* Just so the build does not fail if we disable EVERYTHING */ ) return 0; else return 1; } starpu-1.2.3+dfsg/tests/datawizard/interfaces/multiformat/advanced/generic.h000066400000000000000000000033071320135501600272650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef MULTIFORMAT_GENERIC_H #define MULTIFORMAT_GENERIC_H #include #define NX 16 #ifdef STARPU_USE_CPU void cpu_func(void *buffers[], void *args); #endif /* !STARPU_USE_CPU */ #ifdef STARPU_USE_CUDA void cuda_func(void *buffers[], void *args); #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL void opencl_func(void *buffers[], void *args); #endif /* !STARPU_USE_OPENCL */ #ifdef STARPU_USE_MIC starpu_mic_kernel_t mic_func(); #endif extern struct starpu_multiformat_data_interface_ops ops; /* Counting the calls to the codelets */ struct stats { #ifdef STARPU_USE_CPU unsigned int cpu; #endif #ifdef STARPU_USE_CUDA unsigned int cuda; unsigned int cpu_to_cuda; unsigned int cuda_to_cpu; #endif #ifdef STARPU_USE_OPENCL unsigned int opencl; unsigned int cpu_to_opencl; unsigned int opencl_to_cpu; #endif #ifdef STARPU_USE_MIC unsigned int mic; unsigned int cpu_to_mic; unsigned int mic_to_cpu; #endif }; void print_stats(struct stats *); void reset_stats(struct stats *); int compare_stats(struct stats *, struct stats *); #endif /* !MULTIFORMAT_GENERIC_H */ starpu-1.2.3+dfsg/tests/datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c000066400000000000000000000071471320135501600325510ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "generic.h" #include "../../../../helper.h" #if defined(STARPU_USE_CUDA) && defined(STARPU_USE_OPENCL) extern struct stats global_stats; static int vector[NX]; static starpu_data_handle_t handle; /* * Initially, our vector should be in RAM. It is then used on a CUDA device, * then on an OpenCL device, and finally, on a CUDA device again. * The following operations should be performed, in this specific order : * - CPU -> CUDA conversion * - CUDA kernel execution * - OpenCL kernel execution * - CUDA kernel execution * - CUDA -> CPU conversion * * Note that we will not run any conversion between CUDA and OpenCL, because * StarPU assumes that the data structures used on CUDA and OpenCL devices are * the same. */ static int test(void) { int ret; struct starpu_task *task_cuda, *task_cuda2, *task_opencl; static struct starpu_codelet cl_cuda = { .cuda_funcs = {cuda_func}, .nbuffers = 1, .modes = {STARPU_RW} }; task_cuda = starpu_task_create(); task_cuda->cl = &cl_cuda; task_cuda->handles[0] = handle; ret = starpu_task_submit(task_cuda); if (ret != 0) { task_cuda->destroy = 0; starpu_task_destroy(task_cuda); return 1; } static struct starpu_codelet cl_opencl = { .opencl_funcs = {opencl_func}, .nbuffers = 1, .modes = {STARPU_RW} }; task_opencl = starpu_task_create(); task_opencl->cl = &cl_opencl; task_opencl->handles[0] = handle; ret = starpu_task_submit(task_opencl); if (ret != 0) { task_opencl->destroy = 0; starpu_task_destroy(task_opencl); return 1; } task_cuda2 = starpu_task_create(); task_cuda2->cl = &cl_cuda; task_cuda2->handles[0] = handle; ret = starpu_task_submit(task_cuda2); if (ret != 0) { task_cuda2->destroy = 0; starpu_task_destroy(task_cuda2); return 1; } return 0; } static void register_handle(void) { int i; for (i = 0; i < NX; i++) vector[i] = i; starpu_multiformat_data_register(&handle, STARPU_MAIN_RAM, vector, NX, &ops); } static void unregister_handle(void) { starpu_data_unregister(handle); } #endif /* !(STARPU_USE_CUDA && STARPU_USE_OPENCL) */ int main(void) { #if defined(STARPU_USE_CUDA) && defined(STARPU_USE_OPENCL) int ret; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncuda = 1; conf.nopencl = 1; ret = starpu_init(&conf); if (ret == -ENODEV) goto enodev; reset_stats(&global_stats); register_handle(); ret = test(); unregister_handle(); starpu_shutdown(); if (ret != 0) return STARPU_TEST_SKIPPED; struct stats expected_stats = { #ifdef STARPU_USE_CPU .cpu = 0, #endif #ifdef STARPU_USE_CUDA .cuda = 2, .cpu_to_cuda = 1, .cuda_to_cpu = 1, #endif #ifdef STARPU_USE_OPENCL .opencl = 1, .cpu_to_opencl = 0, .opencl_to_cpu = 0 #endif }; ret = compare_stats(&global_stats, &expected_stats); if (ret != 0) { print_stats(&global_stats); print_stats(&expected_stats); return EXIT_FAILURE; } return EXIT_SUCCESS; enodev: return STARPU_TEST_SKIPPED; #else return STARPU_TEST_SKIPPED; #endif } starpu-1.2.3+dfsg/tests/datawizard/interfaces/multiformat/advanced/multiformat_data_release.c000066400000000000000000000101351320135501600326750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2012 INRIA * Copyright (C) 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "generic.h" #include "../../../../helper.h" static int vector[NX]; static starpu_data_handle_t handle; #define ENTER() do { FPRINTF(stderr, "Entering %s\n", __starpu_func__); } while (0) extern struct stats global_stats; static void register_handle(void) { int i; for (i = 0; i < NX; i++) vector[i] = i; starpu_multiformat_data_register(&handle, STARPU_MAIN_RAM, vector, NX, &ops); } static void unregister_handle(void) { starpu_data_unregister(handle); } #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) || defined(STARPU_USE_MIC) static void create_and_submit(int where) { static struct starpu_codelet cl = { .modes = { STARPU_RW }, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_func}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_func}, #endif #ifdef STARPU_USE_MIC .mic_funcs = {mic_func}, #endif .nbuffers = 1 }; cl.where = where; struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->handles[0] = handle; /* We need to be sure the data has been copied to the GPU at the end * of this function */ task->synchronous = 1; if (starpu_task_submit(task) == -ENODEV) exit(STARPU_TEST_SKIPPED); } #endif static int test(void) { struct stats expected_stats; memset(&expected_stats, 0, sizeof(expected_stats)); #ifdef STARPU_USE_CUDA create_and_submit(STARPU_CUDA); starpu_data_acquire(handle, STARPU_RW); expected_stats.cuda = 1; expected_stats.cpu_to_cuda = 1; expected_stats.cuda_to_cpu = 1; starpu_data_release(handle); if (compare_stats(&global_stats, &expected_stats) != 0) { FPRINTF(stderr, "CUDA failed\n"); print_stats(&global_stats); FPRINTF(stderr ,"\n"); print_stats(&expected_stats); return -ENODEV; } #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL create_and_submit(STARPU_OPENCL); starpu_data_acquire(handle, STARPU_RW); expected_stats.opencl = 1; expected_stats.cpu_to_opencl = 1; expected_stats.opencl_to_cpu = 1; starpu_data_release(handle); if (compare_stats(&global_stats, &expected_stats) != 0) { FPRINTF(stderr, "OPENCL failed\n"); print_stats(&global_stats); FPRINTF(stderr ,"\n"); print_stats(&expected_stats); return -ENODEV; } #endif /* !STARPU_USE_OPENCL */ #ifdef STARPU_USE_MIC create_and_submit(STARPU_MIC); starpu_data_acquire(handle, STARPU_RW); expected_stats.mic = 1; expected_stats.cpu_to_mic = 1; expected_stats.mic_to_cpu = 1; starpu_data_release(handle); if (compare_stats(&global_stats, &expected_stats) != 0) { FPRINTF(stderr, "MIC failed\n"); print_stats(&global_stats); FPRINTF(stderr ,"\n"); print_stats(&expected_stats); return -ENODEV; } #endif /* !STARPU_USE_CUDA */ return 0; } int main(int argc, char **argv) { #ifdef STARPU_USE_CPU int ret; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncuda = 1; conf.nopencl = 1; conf.nmic = 1; memset(&global_stats, 0, sizeof(global_stats)); ret = starpu_initialize(&conf, &argc, &argv); if (ret == -ENODEV || starpu_cpu_worker_get_count() == 0) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); register_handle(); int err = test(); unregister_handle(); starpu_shutdown(); switch (err) { case -ENODEV: return STARPU_TEST_SKIPPED; case 0: return EXIT_SUCCESS; default: return EXIT_FAILURE; } #else /* ! STARPU_USE_CPU */ /* Without the CPU, there is no point in using the multiformat * interface, so this test is pointless. */ return STARPU_TEST_SKIPPED; #endif } starpu-1.2.3+dfsg/tests/datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c000066400000000000000000000171611320135501600337720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2012 INRIA * Copyright (C) 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "generic.h" #include "../../../../helper.h" #define DEBUG 0 #if DEBUG #define SYNCHRONOUS 1 /* Easier to debug with synchronous tasks */ #define ENTER() do { FPRINTF(stderr, "Entering %s\n", __starpu_func__); } while (0) #else #define SYNCHRONOUS 0 #define ENTER() #endif extern struct stats global_stats; #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) || defined(STARPU_USE_MIC) static void create_and_submit_tasks(int where, starpu_data_handle_t handles[]) { FPRINTF(stderr, "***** Starting Task 1\n"); struct starpu_codelet cl = { .modes = { STARPU_RW }, .nbuffers = 1, .where = where }; #ifdef STARPU_USE_CUDA if (where & STARPU_CUDA) cl.cuda_funcs[0] = cuda_func; #endif #ifdef STARPU_USE_OPENCL if (where & STARPU_OPENCL) cl.opencl_funcs[0] = opencl_func; #endif #ifdef STARPU_USE_MIC if (where & STARPU_MIC) cl.mic_funcs[0] = mic_func; #endif struct starpu_task *task = starpu_task_create(); task->synchronous = SYNCHRONOUS; task->cl = &cl; task->handles[0] = handles[0]; assert(starpu_task_submit(task) == 0); #ifdef STARPU_USE_CPU FPRINTF(stderr, "***** Starting Task 2\n"); struct starpu_codelet cl2 = { .modes = { STARPU_RW }, .cpu_funcs = {cpu_func}, .nbuffers = 1, .where = STARPU_CPU, }; struct starpu_task *task2 = starpu_task_create(); task2->synchronous = SYNCHRONOUS; task2->cl = &cl2; task2->handles[0] = handles[1]; assert(starpu_task_submit(task2) == 0); #endif /* !STARPU_USE_CPU */ FPRINTF(stderr, "***** Starting Task 3\n"); struct starpu_codelet cl3 = { .modes = { STARPU_RW, STARPU_RW }, .nbuffers = 2, .where = where }; #ifdef STARPU_USE_CUDA if (where & STARPU_CUDA) cl3.cuda_funcs[0] = cuda_func; #endif #ifdef STARPU_USE_OPENCL if (where & STARPU_OPENCL) cl3.opencl_funcs[0] = opencl_func; #endif #ifdef STARPU_USE_MIC if (where & STARPU_MIC) cl3.mic_funcs[0] = mic_func; #endif struct starpu_task *task3 = starpu_task_create(); task3->synchronous = SYNCHRONOUS; task3->cl = &cl3; task3->handles[0] = handles[0]; task3->handles[1] = handles[1]; assert(starpu_task_submit(task3) == 0); assert(starpu_task_wait_for_all() == 0); FPRINTF(stderr, "***** End of all tasks\n"); return; } #endif /* XXX Just a little bit of copy/pasta here... */ #ifdef STARPU_USE_CUDA static int test_cuda(void) { int i; int vector1[NX]; int vector2[NX]; starpu_data_handle_t handles[2]; for (i = 0; i < NX; i++) { vector1[i] = i; vector2[i] = i; } starpu_multiformat_data_register(&handles[0], STARPU_MAIN_RAM, vector1, NX, &ops); starpu_multiformat_data_register(&handles[1], STARPU_MAIN_RAM, vector2, NX, &ops); memset(&global_stats, 0, sizeof(global_stats)); create_and_submit_tasks(STARPU_CUDA, handles); starpu_data_unregister(handles[0]); starpu_data_unregister(handles[1]); #if DEBUG print_stats(&global_stats); #endif struct stats expected_stats; #ifdef STARPU_USE_CPU expected_stats.cpu = 1; #endif /* !STARPU_USE_CPU */ #ifdef STARPU_USE_OPENCL expected_stats.opencl = 0; expected_stats.cpu_to_opencl = 0; expected_stats.opencl_to_cpu = 0; #endif /* !STARPU_USE_OPENCL */ #ifdef STARPU_USE_MIC expected_stats.mic = 0; expected_stats.cpu_to_mic = 0; expected_stats.mic_to_cpu = 0; #endif expected_stats.cuda = 2; expected_stats.cpu_to_cuda = 2; expected_stats.cuda_to_cpu = 2; return compare_stats(&expected_stats, &global_stats); } #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL static int test_opencl(void) { int i; int vector1[NX]; int vector2[NX]; starpu_data_handle_t handles[2]; for (i = 0; i < NX; i++) { vector1[i] = i; vector2[i] = i; } starpu_multiformat_data_register(&handles[0], STARPU_MAIN_RAM, vector1, NX, &ops); starpu_multiformat_data_register(&handles[1], STARPU_MAIN_RAM, vector2, NX, &ops); memset(&global_stats, 0, sizeof(global_stats)); create_and_submit_tasks(STARPU_OPENCL, handles); starpu_data_unregister(handles[0]); starpu_data_unregister(handles[1]); #if DEBUG print_stats(&global_stats); #endif struct stats expected_stats; #ifdef STARPU_USE_CPU expected_stats.cpu = 1; #endif /* !STARPU_USE_CPU */ #ifdef STARPU_USE_CUDA expected_stats.cuda = 0; expected_stats.cpu_to_cuda = 0; expected_stats.cuda_to_cpu = 0; #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_MIC expected_stats.mic = 0; expected_stats.cpu_to_mic = 0; expected_stats.mic_to_cpu = 0; #endif expected_stats.opencl = 2; expected_stats.cpu_to_opencl = 2; expected_stats.opencl_to_cpu = 2; return compare_stats(&expected_stats, &global_stats); } #endif /* !STARPU_USE_OPENCL */ #ifdef STARPU_USE_MIC static int test_mic(void) { int i; int vector1[NX]; int vector2[NX]; starpu_data_handle_t handles[2]; for (i = 0; i < NX; i++) { vector1[i] = i; vector2[i] = i; } starpu_multiformat_data_register(&handles[0], STARPU_MAIN_RAM, vector1, NX, &ops); starpu_multiformat_data_register(&handles[1], STARPU_MAIN_RAM, vector2, NX, &ops); memset(&global_stats, 0, sizeof(global_stats)); create_and_submit_tasks(STARPU_MIC, handles); starpu_data_unregister(handles[0]); starpu_data_unregister(handles[1]); #if DEBUG print_stats(&global_stats); #endif struct stats expected_stats; #ifdef STARPU_USE_CPU expected_stats.cpu = 1; #endif /* !STARPU_USE_CPU */ #ifdef STARPU_USE_OPENCL expected_stats.opencl = 0; expected_stats.cpu_to_opencl = 0; expected_stats.opencl_to_cpu = 0; #endif /* !STARPU_USE_OPENCL */ #ifdef STARPU_USE_CUDA expected_stats.cuda = 0; expected_stats.cpu_to_cuda = 0; expected_stats.cuda_to_cpu = 0; #endif expected_stats.mic = 2; expected_stats.cpu_to_mic = 2; expected_stats.mic_to_cpu = 2; return compare_stats(&expected_stats, &global_stats); } #endif /* !STARPU_USE_CUDA */ int main(int argc, char **argv) { #ifdef STARPU_USE_CPU int ret; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncuda = 2; conf.nopencl = 1; conf.nmic = 1; ret = starpu_initialize(&conf, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); unsigned int ncpu = starpu_cpu_worker_get_count(); if (ncpu == 0) { FPRINTF(stderr, "No CPUS, cannot run this test.\n"); return STARPU_TEST_SKIPPED; } unsigned int ncuda = starpu_cuda_worker_get_count(); unsigned int nopencl = starpu_opencl_worker_get_count(); unsigned int nmic = starpu_mic_worker_get_count(); #ifdef STARPU_USE_OPENCL if (nopencl > 0 && test_opencl() != 0) { FPRINTF(stderr, "OPENCL FAILED\n"); return EXIT_FAILURE; } #endif #ifdef STARPU_USE_CUDA if (ncuda > 0 && test_cuda() != 0) { FPRINTF(stderr, "CUDA FAILED \n"); return EXIT_FAILURE; } #endif #ifdef STARPU_USE_MIC if (nmic > 0 && test_mic() != 0) { FPRINTF(stderr, "MIC FAILED \n"); return EXIT_FAILURE; } #endif starpu_shutdown(); if (ncuda == 0 && nopencl == 0 && nmic == 0) return STARPU_TEST_SKIPPED; else return EXIT_SUCCESS; #else /* !STARPU_USE_CPU */ /* Without the CPU, there is no point in using the multiformat * interface, so this test is pointless. */ return STARPU_TEST_SKIPPED; #endif } starpu-1.2.3+dfsg/tests/datawizard/interfaces/multiformat/advanced/multiformat_worker.c000066400000000000000000000074051320135501600316030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "generic.h" #include "../../../../helper.h" #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) || defined(STARPU_USE_MIC) extern struct stats global_stats; static int vector[NX]; static starpu_data_handle_t handle; #endif #ifdef STARPU_USE_CUDA static int ncuda; static int cuda_worker; #endif #ifdef STARPU_USE_OPENCL static int nopencl; static int opencl_worker; #endif #ifdef STARPU_USE_MIC static int nmic; static int mic_worker; #endif #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) || defined(STARPU_USE_MIC) static struct starpu_codelet cl = { .modes = { STARPU_RW }, #ifdef STARPU_USE_CUDA .cuda_funcs = { cuda_func }, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = { opencl_func }, #endif #ifdef STARPU_USE_MIC .mic_funcs = {mic_func}, #endif .nbuffers = 1, }; static void register_handle(void) { int i; for (i = 0; i < NX; i++) vector[i] = i; starpu_multiformat_data_register(&handle, STARPU_MAIN_RAM, vector, NX, &ops); } static void unregister_handle(void) { starpu_data_unregister(handle); } static int create_and_submit_tasks(void) { struct starpu_task *task; task = starpu_task_create(); task->cl = &cl; task->handles[0] = handle; task->execute_on_a_specific_worker = 1; #ifdef STARPU_USE_CUDA if (ncuda > 0) { task->workerid = cuda_worker; } else #endif #ifdef STARPU_USE_OPENCL if (nopencl > 0) { task->workerid = opencl_worker; } else #endif #ifdef STARPU_USE_MIC if (nmic > 0) { task->workerid = mic_worker; } else #endif { task->destroy = 0; starpu_task_destroy(task); return -ENODEV; } return starpu_task_submit(task); } #endif int main(int argc, char **argv) { #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) || defined(STARPU_USE_MIC) int err; err = starpu_initialize(NULL, &argc, &argv); if (err == -ENODEV) goto enodev; #ifdef STARPU_USE_CUDA ncuda = starpu_worker_get_ids_by_type(STARPU_CUDA_WORKER, &cuda_worker, 1); if (ncuda < 0) ncuda = 1; #endif #ifdef STARPU_USE_OPENCL nopencl = starpu_worker_get_ids_by_type(STARPU_OPENCL_WORKER, &opencl_worker, 1); if (nopencl < 0) nopencl = 1; #endif #ifdef STARPU_USE_MIC nmic = starpu_worker_get_ids_by_type(STARPU_MIC_WORKER, &mic_worker, 1); if(nmic < 0) nmic = 1; #endif reset_stats(&global_stats); register_handle(); err = create_and_submit_tasks(); unregister_handle(); starpu_shutdown(); if (err == -ENODEV) goto enodev; #if defined(STARPU_USE_CUDA) if (global_stats.cuda == 1) { if (global_stats.cpu_to_cuda == 1 && global_stats.cuda_to_cpu == 1) return EXIT_SUCCESS; else return EXIT_FAILURE; } #endif /* !STARPU_USE_CUDA */ #if defined(STARPU_USE_OPENCL) if (global_stats.opencl == 1) { if (global_stats.cpu_to_opencl == 1 && global_stats.opencl_to_cpu == 1) return EXIT_SUCCESS; else return EXIT_FAILURE; } #endif /* !STARPU_USE_OPENCL */ #ifdef STARPU_USE_MIC if (global_stats.mic == 1) { if (global_stats.cpu_to_mic == 1 && global_stats.mic_to_cpu == 1) return EXIT_SUCCESS; else return EXIT_FAILURE; } #endif /* We should not get here */ return EXIT_FAILURE; enodev: #endif return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/interfaces/multiformat/advanced/same_handle.c000066400000000000000000000061151320135501600301040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "generic.h" #include "../../../../helper.h" /* * A single handle can be given twice to a given kernel. In this case, it * should only be converted once. */ #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) || defined(STARPU_USE_MIC) extern struct stats global_stats; static int vector[NX]; static starpu_data_handle_t handle; static struct starpu_codelet cl = { .modes = { STARPU_RW, STARPU_RW }, #ifdef STARPU_USE_CUDA .cuda_funcs = { cuda_func }, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = { opencl_func }, #endif #ifdef STARPU_USE_MIC .mic_funcs = {mic_func}, #endif .nbuffers = 2, }; static void register_handle(void) { int i; for (i = 0; i < NX; i++) vector[i] = i; starpu_multiformat_data_register(&handle, STARPU_MAIN_RAM, vector, NX, &ops); } static void unregister_handle(void) { starpu_data_unregister(handle); } static int create_and_submit_tasks(void) { int ret; struct starpu_task *task; cl.where = 0; #ifdef STARPU_USE_CUDA cl.where |= STARPU_CUDA; #endif #ifdef STARPU_USE_OPENCL cl.where |= STARPU_OPENCL; #endif #ifdef STARPU_USE_MIC cl.where |= STARPU_MIC; #endif task = starpu_task_create(); task->cl = &cl; task->handles[0] = handle; task->handles[1] = handle; ret = starpu_task_submit(task); if (ret == -ENODEV) { task->destroy = 0; starpu_task_destroy(task); return -ENODEV; } return 0; } #endif int main(int argc, char **argv) { #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) || defined(STARPU_USE_MIC) int err; err = starpu_initialize(NULL, &argc, &argv); if (err == -ENODEV) goto enodev; reset_stats(&global_stats); register_handle(); err = create_and_submit_tasks(); unregister_handle(); starpu_shutdown(); if (err == -ENODEV) goto enodev; #if defined(STARPU_USE_CUDA) if (global_stats.cuda == 1) { if (global_stats.cpu_to_cuda == 1 && global_stats.cuda_to_cpu == 1) return EXIT_SUCCESS; else return EXIT_FAILURE; } else #endif #if defined(STARPU_USE_OPENCL) if (global_stats.opencl == 1) { if (global_stats.cpu_to_opencl == 1 && global_stats.opencl_to_cpu == 1) return EXIT_SUCCESS; else return EXIT_FAILURE; } else #endif #if defined(STARPU_USE_MIC) if (global_stats.mic == 1) { if (global_stats.cpu_to_mic == 1 && global_stats.mic_to_cpu == 1) return EXIT_SUCCESS; else return EXIT_FAILURE; } else #endif { /* We should not get here */ return EXIT_FAILURE; } enodev: #endif return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/interfaces/multiformat/multiformat_conversion_codelets.c000066400000000000000000000061371320135501600325750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "multiformat_types.h" #include "../../../helper.h" #ifdef STARPU_USE_CUDA void cuda_to_cpu(void *buffers[], void *arg) { STARPU_SKIP_IF_VALGRIND; FPRINTF(stderr, "Entering %s\n", __starpu_func__); struct struct_of_arrays *src = STARPU_MULTIFORMAT_GET_CUDA_PTR(buffers[0]); struct point *dst = STARPU_MULTIFORMAT_GET_CPU_PTR(buffers[0]); int n = STARPU_MULTIFORMAT_GET_NX(buffers[0]); int i; for (i = 0; i < n; i++) { dst[i].x = src->x[i]; dst[i].y = src->y[i]; } } extern void cpu_to_cuda_cuda_func(void *buffers[], void *args); struct starpu_codelet cpu_to_cuda_cl = { .cuda_funcs = {cpu_to_cuda_cuda_func}, .cuda_flags = {STARPU_CUDA_ASYNC}, .nbuffers = 1 }; struct starpu_codelet cuda_to_cpu_cl = { .cpu_funcs = {cuda_to_cpu}, .nbuffers = 1 }; #endif #ifdef STARPU_USE_OPENCL void opencl_to_cpu(void *buffers[], void *arg) { STARPU_SKIP_IF_VALGRIND; struct struct_of_arrays *src = STARPU_MULTIFORMAT_GET_OPENCL_PTR(buffers[0]); struct point *dst = STARPU_MULTIFORMAT_GET_CPU_PTR(buffers[0]); int n = STARPU_MULTIFORMAT_GET_NX(buffers[0]); int i; for (i = 0; i < n; i++) { dst[i].x = src->x[i]; dst[i].y = src->y[i]; } } extern void cpu_to_opencl_opencl_func(void *buffers[], void *args); struct starpu_codelet cpu_to_opencl_cl = { .opencl_funcs = {cpu_to_opencl_opencl_func}, .nbuffers = 1 }; struct starpu_codelet opencl_to_cpu_cl = { .cpu_funcs = {opencl_to_cpu}, .nbuffers = 1 }; #endif #ifdef STARPU_USE_MIC void mic_to_cpu(void *buffers[], void *arg) { STARPU_SKIP_IF_VALGRIND; FPRINTF(stderr, "Entering %s\n", __func__); struct struct_of_arrays *src = STARPU_MULTIFORMAT_GET_MIC_PTR(buffers[0]); struct point *dst = STARPU_MULTIFORMAT_GET_CPU_PTR(buffers[0]); int n = STARPU_MULTIFORMAT_GET_NX(buffers[0]); int i; for (i = 0; i < n; i++) { dst[i].x = src->x[i]; dst[i].y = src->y[i]; } } void cpu_to_mic(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; FPRINTF(stderr, "Entering %s\n", __func__); struct point *src = STARPU_MULTIFORMAT_GET_CPU_PTR(buffers[0]); struct struct_of_arrays *dst = STARPU_MULTIFORMAT_GET_MIC_PTR(buffers[0]); int n = STARPU_MULTIFORMAT_GET_NX(buffers[0]); int i; for (i = 0; i < n; i++) { dst->x[i] = src[i].x; dst->y[i] = src[i].y; } } struct starpu_codelet cpu_to_mic_cl = { .where = STARPU_MIC, .cpu_funcs_name = {"cpu_to_mic"}, .nbuffers = 1 }; struct starpu_codelet mic_to_cpu_cl = { .where = STARPU_CPU, .cpu_funcs = {mic_to_cpu}, .nbuffers = 1 }; #endif starpu-1.2.3+dfsg/tests/datawizard/interfaces/multiformat/multiformat_conversion_codelets_cuda.cu000066400000000000000000000027701320135501600337550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "multiformat_types.h" #include "../../../helper.h" static __global__ void cpu_to_cuda_cuda(struct point *src, struct struct_of_arrays *dst, unsigned n) { unsigned i = blockIdx.x*blockDim.x + threadIdx.x; if (i < n) { dst->x[i] = src[i].x; dst->y[i] = src[i].y; } } extern "C" void cpu_to_cuda_cuda_func(void *buffers[], void *_args) { FPRINTF(stderr, "Entering %s\n", __starpu_func__); struct point *src; struct struct_of_arrays *dst; src = (struct point *) STARPU_MULTIFORMAT_GET_CPU_PTR(buffers[0]); dst = (struct struct_of_arrays *) STARPU_MULTIFORMAT_GET_CUDA_PTR(buffers[0]); int n = STARPU_MULTIFORMAT_GET_NX(buffers[0]); unsigned threads_per_block = 64; unsigned nblocks = (n + threads_per_block-1) / threads_per_block; cpu_to_cuda_cuda<<>>(src, dst, n); } starpu-1.2.3+dfsg/tests/datawizard/interfaces/multiformat/multiformat_conversion_codelets_kernel.cl000066400000000000000000000016151320135501600343050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "multiformat_types.h" __kernel void cpu_to_opencl_opencl(__global struct point *src, __global struct struct_of_arrays *dst, unsigned int n) { const unsigned int i = get_global_id(0); if (i < n) { dst->x[i] = src[i].x; dst->y[i] = src[i].y; } } starpu-1.2.3+dfsg/tests/datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c000066400000000000000000000056631320135501600341400ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * Copyright (C) 2012, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../../../helper.h" #define KERNEL_LOCATION "tests/datawizard/interfaces/multiformat/multiformat_conversion_codelets_kernel.cl" static struct starpu_opencl_program opencl_conversion_program; void cpu_to_opencl_opencl_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; (void) args; int id, devid, ret; cl_int err; cl_kernel kernel; cl_command_queue queue; cl_event event; unsigned n = STARPU_MULTIFORMAT_GET_NX(buffers[0]); cl_mem src = (cl_mem) STARPU_MULTIFORMAT_GET_CPU_PTR(buffers[0]); cl_mem dst = (cl_mem) STARPU_MULTIFORMAT_GET_OPENCL_PTR(buffers[0]); id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); ret = starpu_opencl_load_opencl_from_file(KERNEL_LOCATION, &opencl_conversion_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_conversion_program, "cpu_to_opencl_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 0, sizeof(src), &src); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 1, sizeof(dst), &dst); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 2, sizeof(n), &n); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=n; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local = global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } clFinish(queue); starpu_opencl_collect_stats(event); clReleaseEvent(event); starpu_opencl_release_kernel(kernel); ret = starpu_opencl_unload_opencl(&opencl_conversion_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); } starpu-1.2.3+dfsg/tests/datawizard/interfaces/multiformat/multiformat_cuda.cu000066400000000000000000000043001320135501600276150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "multiformat_types.h" #include "../test_interfaces.h" #include "../../../helper.h" extern struct test_config multiformat_config; static __global__ void multiformat_cuda(struct struct_of_arrays *soa, unsigned n, int *err, int factor) { unsigned i = blockIdx.x*blockDim.x + threadIdx.x; if (i >= n) return; if (soa->x[i] != i * factor || soa->y[i] != i * factor) { *err = 1; } else { soa->x[i] = -soa->x[i]; soa->y[i] = -soa->y[i]; } } extern "C" void test_multiformat_cuda_func(void *buffers[], void *args) { FPRINTF(stderr, "Entering %s\n", __starpu_func__); int factor; int *ret; cudaError_t error; unsigned int n = STARPU_MULTIFORMAT_GET_NX(buffers[0]); struct struct_of_arrays *soa; soa = (struct struct_of_arrays *) STARPU_MULTIFORMAT_GET_CUDA_PTR(buffers[0]); unsigned threads_per_block = 64; unsigned nblocks = (n + threads_per_block-1) / threads_per_block; factor = *(int *) args; error = cudaMalloc(&ret, sizeof(int)); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); error = cudaMemcpy(ret, &multiformat_config.copy_failed, sizeof(int), cudaMemcpyHostToDevice); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); multiformat_cuda<<>>(soa, n, ret, factor); error = cudaMemcpy(&multiformat_config.copy_failed, ret, sizeof(int), cudaMemcpyDeviceToHost); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); cudaFree(ret); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.2.3+dfsg/tests/datawizard/interfaces/multiformat/multiformat_interface.c000066400000000000000000000120611320135501600304570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "multiformat_types.h" #include "../test_interfaces.h" #include "../../../helper.h" static void test_multiformat_cpu_func(void *buffers[], void *args); #ifdef STARPU_USE_CUDA extern void test_multiformat_cuda_func(void *buffers[], void *args); #endif #ifdef STARPU_USE_OPENCL extern void test_multiformat_opencl_func(void *buffers[], void *args); #endif void test_multiformat_mic_func(void *buffers[], void *args); static struct point array_of_structs[N_ELEMENTS]; static struct point array_of_structs_dummy[N_ELEMENTS]; static starpu_data_handle_t multiformat_handle; static starpu_data_handle_t multiformat_dummy_handle; struct test_config multiformat_config = { .cpu_func = test_multiformat_cpu_func, #ifdef STARPU_USE_CUDA .cuda_func = test_multiformat_cuda_func, #endif #ifdef STARPU_USE_OPENCL .opencl_func = test_multiformat_opencl_func, #endif .cpu_func_name = "test_multiformat_mic_func", .handle = &multiformat_handle, .dummy_handle = &multiformat_dummy_handle, .copy_failed = SUCCESS, .name = "multiformat_interface" }; static void test_multiformat_cpu_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; struct point *aos; int n, i; int factor; aos = (struct point *) STARPU_MULTIFORMAT_GET_CPU_PTR(buffers[0]); n = STARPU_MULTIFORMAT_GET_NX(buffers[0]); factor = *(int *) args; for (i = 0; i < n; i++) { FPRINTF(stderr, "(%d %d) [%d]", aos[i].x, aos[i].y, factor); if (aos[i].x != i * factor || aos[i].y != i * factor) { multiformat_config.copy_failed = FAILURE; } aos[i].x = -aos[i].x; aos[i].y = -aos[i].y; } FPRINTF(stderr, "\n"); } void test_multiformat_mic_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; printf("MIC\n"); struct struct_of_arrays *soa; int n, i; int factor; soa = (struct struct_of_arrays *) STARPU_MULTIFORMAT_GET_MIC_PTR(buffers[0]); n = STARPU_MULTIFORMAT_GET_NX(buffers[0]); factor = *(int *) args; for (i = 0; i < n; i++) { FPRINTF(stderr, "(%d %d) [%d]", soa->x[i], soa->y[i], factor); if (soa->x[i] != i * factor || soa->y[i] != i * factor) { multiformat_config.copy_failed = 1; } soa->x[i] = -soa->x[i]; soa->y[i] = -soa->y[i]; } FPRINTF(stderr, "\n"); } #ifdef STARPU_USE_CUDA extern struct starpu_codelet cpu_to_cuda_cl; extern struct starpu_codelet cuda_to_cpu_cl; #endif #ifdef STARPU_USE_OPENCL extern struct starpu_codelet cpu_to_opencl_cl; extern struct starpu_codelet opencl_to_cpu_cl; #endif #ifdef STARPU_USE_MIC extern struct starpu_codelet cpu_to_mic_cl; extern struct starpu_codelet mic_to_cpu_cl; #endif struct starpu_multiformat_data_interface_ops format_ops = { #ifdef STARPU_USE_CUDA .cuda_elemsize = 2* sizeof(float), .cpu_to_cuda_cl = &cpu_to_cuda_cl, .cuda_to_cpu_cl = &cuda_to_cpu_cl, #endif #ifdef STARPU_USE_OPENCL .opencl_elemsize = 2 * sizeof(float), .cpu_to_opencl_cl = &cpu_to_opencl_cl, .opencl_to_cpu_cl = &opencl_to_cpu_cl, #endif #ifdef STARPU_USE_MIC .mic_elemsize = 2 * sizeof(float), .cpu_to_mic_cl = &cpu_to_mic_cl, .mic_to_cpu_cl = &mic_to_cpu_cl, #endif .cpu_elemsize = sizeof(struct point), }; static void register_data(void) { int i; for (i = 0; i < N_ELEMENTS; i++) { array_of_structs[i].x = i; array_of_structs[i].y = i; } starpu_multiformat_data_register(&multiformat_handle, STARPU_MAIN_RAM, &array_of_structs, N_ELEMENTS, &format_ops); starpu_multiformat_data_register(&multiformat_dummy_handle, STARPU_MAIN_RAM, &array_of_structs_dummy, N_ELEMENTS, &format_ops); } static void unregister_data(void) { starpu_data_unregister(multiformat_handle); starpu_data_unregister(multiformat_dummy_handle); } int main(int argc, char **argv) { #ifdef STARPU_USE_CPU int ret; data_interface_test_summary *summary; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncuda = 2; conf.nopencl = 1; conf.nmic = -1; ret = starpu_initialize(&conf, &argc, &argv); if (ret == -ENODEV || starpu_cpu_worker_get_count() == 0) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); register_data(); summary = run_tests(&multiformat_config); if (!summary) exit(EXIT_FAILURE); data_interface_test_summary_print(stderr, summary); unregister_data(); starpu_shutdown(); return data_interface_test_summary_success(summary); #else /* Without the CPU, there is no point in using the multiformat * interface, so this test is pointless. */ return STARPU_TEST_SKIPPED; #endif } starpu-1.2.3+dfsg/tests/datawizard/interfaces/multiformat/multiformat_opencl.c000066400000000000000000000067761320135501600300170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" #define KERNEL_LOCATION "tests/datawizard/interfaces/multiformat/multiformat_opencl_kernel.cl" extern struct test_config multiformat_config; static struct starpu_opencl_program multiformat_program; void test_multiformat_opencl_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; int id, devid, factor, ret; unsigned int n; cl_int err; cl_kernel kernel; cl_command_queue queue; cl_event event; cl_context context; cl_mem val, fail; ret = starpu_opencl_load_opencl_from_file(KERNEL_LOCATION, &multiformat_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); factor = *(int *)args; n = STARPU_MULTIFORMAT_GET_NX(buffers[0]); val = (cl_mem)STARPU_MULTIFORMAT_GET_OPENCL_PTR(buffers[0]); id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); starpu_opencl_get_context(devid, &context); err = starpu_opencl_load_kernel(&kernel, &queue, &multiformat_program, "multiformat_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); fail = clCreateBuffer(context, CL_MEM_COPY_HOST_PTR, sizeof(int), &multiformat_config.copy_failed, &err); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); /* Setting args */ err = clSetKernelArg(kernel, 0, sizeof(val), &val); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 1, sizeof(n), &n); if (err) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 2, sizeof(fail), &fail); if (err) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 3, sizeof(factor), &factor); if (err) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=n; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local = global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } err = clEnqueueReadBuffer(queue, fail, CL_TRUE, 0, sizeof(int), &multiformat_config.copy_failed, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); starpu_opencl_collect_stats(event); clReleaseEvent(event); starpu_opencl_release_kernel(kernel); ret = starpu_opencl_unload_opencl(&multiformat_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); } starpu-1.2.3+dfsg/tests/datawizard/interfaces/multiformat/multiformat_opencl_kernel.cl000066400000000000000000000017611320135501600315200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "multiformat_types.h" __kernel void multiformat_opencl(__global struct struct_of_arrays *soa, unsigned int nx, __global int *err, int factor) { const int i = get_global_id(0); if (i >= nx) return; if (soa->x[i] != i * factor || soa->y[i] != i * factor) { *err = i; } else { soa->x[i] = -soa->x[i]; soa->y[i] = -soa->y[i]; } } starpu-1.2.3+dfsg/tests/datawizard/interfaces/multiformat/multiformat_types.h000066400000000000000000000014771320135501600277010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef TEST_MULTIFORMAT_TYPES_H #define TEST_MULTIFORMAT_TYPES_H #define N_ELEMENTS 2 struct struct_of_arrays { int x[N_ELEMENTS]; int y[N_ELEMENTS]; }; struct point { int x, y; }; #endif starpu-1.2.3+dfsg/tests/datawizard/interfaces/test_interfaces.c000066400000000000000000000461251320135501600247230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * Copyright (C) 2013, 2014 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include /* XXX Why cant we dereference a handle without this one ? */ #include #include #include "test_interfaces.h" #include "../../helper.h" /* * This is definitely note thread-safe. */ static struct test_config *current_config; /* TODO : - OpenCL to OpenCL support */ static char * enum_to_string(int exit_code) { switch (exit_code) { case SUCCESS: return "Success"; case FAILURE: return "Failure"; case UNTESTED: return "Untested"; case TASK_CREATION_FAILURE: return "Task creation failed"; case TASK_SUBMISSION_FAILURE: return "Task submission failed"; default: assert(0); } } struct data_interface_test_summary { int success; /* Copy methods */ #ifdef STARPU_USE_CPU int cpu_to_cpu; #endif #ifdef STARPU_USE_CUDA int cpu_to_cuda; int cuda_to_cuda; int cuda_to_cpu; int cpu_to_cuda_async; int cuda_to_cpu_async; int cuda_to_cuda_async; #endif #ifdef STARPU_USE_OPENCL int cpu_to_opencl; int opencl_to_cpu; int cpu_to_opencl_async; int opencl_to_cpu_async; #endif #ifdef STARPU_USE_MIC int cpu_to_mic; int mic_to_cpu; int cpu_to_mic_async; int mic_to_cpu_async; #endif /* Other stuff */ int compare; #ifdef STARPU_USE_CPU int handle_to_pointer; #endif }; void data_interface_test_summary_print(FILE *f, struct data_interface_test_summary *s) { if (!f) f = stderr; FPRINTF(f, "%s : %s\n", current_config->name, enum_to_string(s->success)); FPRINTF(f, "Asynchronous :\n"); #ifdef STARPU_USE_CUDA FPRINTF(f, "\tCPU -> CUDA : %s\n", enum_to_string(s->cpu_to_cuda_async)); FPRINTF(f, "\tCUDA -> CUDA : %s\n", enum_to_string(s->cuda_to_cuda_async)); FPRINTF(f, "\tCUDA -> CPU : %s\n", enum_to_string(s->cuda_to_cpu_async)); #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL FPRINTF(f, "\tCPU -> OpenCl : %s\n", enum_to_string(s->cpu_to_opencl_async)); FPRINTF(f, "\tOpenCl -> CPU : %s\n", enum_to_string(s->opencl_to_cpu_async)); #endif /* !STARPU_USE_OPENCL */ #ifdef STARPU_USE_MIC FPRINTF(f, "\tCPU -> MIC : %s\n", enum_to_string(s->cpu_to_mic_async)); FPRINTF(f, "\tMIC -> CPU : %s\n", enum_to_string(s->mic_to_cpu_async)); #endif FPRINTF(f, "Synchronous :\n"); #ifdef STARPU_USE_CUDA FPRINTF(f, "\tCPU -> CUDA ; %s\n", enum_to_string(s->cpu_to_cuda)); FPRINTF(f, "\tCUDA -> CUDA : %s\n", enum_to_string(s->cuda_to_cuda)); FPRINTF(f, "\tCUDA -> CPU : %s\n", enum_to_string(s->cuda_to_cpu)); #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL FPRINTF(f, "\tCPU -> OpenCl : %s\n", enum_to_string(s->cpu_to_opencl)); FPRINTF(f, "\tOpenCl -> CPU : %s\n", enum_to_string(s->opencl_to_cpu)); #endif /* !STARPU_USE_OPENCL */ #ifdef STARPU_USE_MIC FPRINTF(f, "\tCPU -> MIC : %s\n", enum_to_string(s->cpu_to_mic)); FPRINTF(f, "\tMIC -> CPU : %s\n", enum_to_string(s->mic_to_cpu)); #endif #ifdef STARPU_USE_CPU FPRINTF(f, "CPU -> CPU : %s\n", enum_to_string(s->cpu_to_cpu)); FPRINTF(f, "handle_to_pointer() : %s\n", enum_to_string(s->handle_to_pointer)); #endif /* !STARPU_USE_CPU */ FPRINTF(f, "compare() : %s\n", enum_to_string(s->compare)); } int data_interface_test_summary_success(data_interface_test_summary *s) { return s->success; } enum operation { #ifdef STARPU_USE_CUDA CPU_TO_CUDA, CUDA_TO_CUDA, CUDA_TO_CPU, #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL CPU_TO_OPENCL, OPENCL_TO_CPU, #endif /* !STARPU_USE_OPENCL */ #ifdef STARPU_USE_MIC CPU_TO_MIC, MIC_TO_CPU, #endif CPU_TO_CPU }; static int* get_field(struct data_interface_test_summary *s, int async, enum operation op) { switch (op) { #ifdef STARPU_USE_CPU case CPU_TO_CPU: return &s->cpu_to_cpu; #endif #ifdef STARPU_USE_CUDA case CPU_TO_CUDA: return async?&s->cpu_to_cuda_async:&s->cpu_to_cuda; case CUDA_TO_CUDA: return async?&s->cuda_to_cuda_async:&s->cuda_to_cuda; case CUDA_TO_CPU: return async?&s->cuda_to_cpu_async:&s->cuda_to_cpu; #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL case CPU_TO_OPENCL: return async?&s->cpu_to_opencl_async:&s->cpu_to_opencl; case OPENCL_TO_CPU: return async?&s->opencl_to_cpu_async:&s->opencl_to_cpu; #endif /* !STARPU_USE_OPENCL */ #ifdef STARPU_USE_MIC case CPU_TO_MIC: return async?&s->cpu_to_mic_async:&s->cpu_to_mic; case MIC_TO_CPU: return async?&s->mic_to_cpu_async:&s->mic_to_cpu; #endif default: STARPU_ABORT(); } /* that instruction should never be reached */ return NULL; } static void set_field(struct data_interface_test_summary *s, int async, enum operation op, int ret) { int *field = get_field(s, async, op); switch (ret) { case SUCCESS: *field = SUCCESS; break; case FAILURE: *field = FAILURE; s->success = FAILURE; break; case UNTESTED: *field = UNTESTED; break; case TASK_CREATION_FAILURE: *field = TASK_CREATION_FAILURE; break; case TASK_SUBMISSION_FAILURE: *field = TASK_SUBMISSION_FAILURE; break; default: STARPU_ABORT(); } } static struct data_interface_test_summary summary = { #ifdef STARPU_USE_CPU .cpu_to_cpu = UNTESTED, .compare = UNTESTED, #endif #ifdef STARPU_USE_CUDA .cpu_to_cuda = UNTESTED, .cuda_to_cuda = UNTESTED, .cuda_to_cpu = UNTESTED, .cpu_to_cuda_async = UNTESTED, .cuda_to_cpu_async = UNTESTED, .cuda_to_cuda_async = UNTESTED, #endif #ifdef STARPU_USE_OPENCL .cpu_to_opencl = UNTESTED, .opencl_to_cpu = UNTESTED, .cpu_to_opencl_async = UNTESTED, .opencl_to_cpu_async = UNTESTED, #endif #ifdef STARPU_USE_MIC .cpu_to_mic = UNTESTED, .mic_to_cpu = UNTESTED, .cpu_to_mic_async = UNTESTED, .mic_to_cpu_async = UNTESTED, #endif #ifdef STARPU_USE_CPU .handle_to_pointer = UNTESTED, #endif .success = SUCCESS }; /* * This variable has to be either -1 or 1. * The kernels should check that the ith value stored in the data interface is * equal to i, if factor == 1, or -i, if factor == -1. */ static int factor = -1; /* * Creates a complete task, only knowing on what device it should be executed. * Note that the global variable is heavily used here. * Arguments : * - taskp : a pointer to a valid task * - type : STARPU_{CPU,CUDA,OPENCL}_WORKER. * - id : -1 if you dont care about the device where the task will be * executed, as long as it has the right type. * >= 0 if you want to make sure the task will be executed on the * idth device that has the specified type. * Return values : * -ENODEV * 0 : success. */ static int create_task(struct starpu_task **taskp, enum starpu_worker_archtype type, int id) { static int cpu_workers[STARPU_MAXCPUS]; #ifdef STARPU_USE_CUDA static int cuda_workers[STARPU_MAXCUDADEVS]; #endif #ifdef STARPU_USE_OPENCL static int opencl_workers[STARPU_MAXOPENCLDEVS]; #endif #ifdef STARPU_USE_MIC static int mic_workers[STARPU_MAXMICDEVS]; #endif static int n_cpus = -1; #ifdef STARPU_USE_CUDA static int n_cudas = -1; #endif #ifdef STARPU_USE_OPENCL static int n_opencls = -1; #endif #ifdef STARPU_USE_MIC static int n_mics = -1; #endif if (n_cpus == -1) /* First time here */ { /* We do not check the return values of the calls to * starpu_worker_get_ids_by_type now, because it is simpler to * detect a problem in the switch that comes right after this * block of code. */ n_cpus = starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, cpu_workers, STARPU_MAXCPUS); #ifdef STARPU_USE_CUDA n_cudas = starpu_worker_get_ids_by_type(STARPU_CUDA_WORKER, cuda_workers, STARPU_MAXCUDADEVS); #endif #ifdef STARPU_USE_OPENCL n_opencls = starpu_worker_get_ids_by_type(STARPU_OPENCL_WORKER, opencl_workers, STARPU_MAXOPENCLDEVS); #endif #ifdef STARPU_USE_MIC n_mics = starpu_worker_get_ids_by_type(STARPU_MIC_WORKER, mic_workers, STARPU_MAXMICDEVS); #endif } int workerid=0; static struct starpu_codelet cl; cl.nbuffers = 1; cl.modes[0] = STARPU_RW; switch (type) { case STARPU_CPU_WORKER: if (id != -1) { if (id >= n_cpus) { FPRINTF(stderr, "Not enough CPU workers\n"); return -ENODEV; } workerid = *(cpu_workers + id); } cl.where = STARPU_CPU; cl.cpu_funcs[0] = current_config->cpu_func; break; #ifdef STARPU_USE_CUDA case STARPU_CUDA_WORKER: if (id != -1) { if (id >= n_cudas) { FPRINTF(stderr, "Not enough CUDA workers\n"); return -ENODEV; } workerid = cuda_workers[id]; } cl.where = STARPU_CUDA; cl.cuda_funcs[0] = current_config->cuda_func; break; #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_WORKER: if (id != -1) { if (id >= n_opencls) { FPRINTF(stderr, "Not enough OpenCL workers\n"); return -ENODEV; } workerid = *(opencl_workers + id); } cl.where = STARPU_OPENCL; cl.opencl_funcs[0] = current_config->opencl_func; break; #endif /* ! STARPU_USE_OPENCL */ #ifdef STARPU_USE_MIC case STARPU_MIC_WORKER: if (id != -1) { if (id >= n_mics) { FPRINTF(stderr, "Not enough MIC workers\n"); return -ENODEV; } workerid = mic_workers[id]; } cl.where = STARPU_MIC; cl.cpu_funcs_name[0] = current_config->cpu_func_name; break; #endif default: return -ENODEV; } struct starpu_task *task = starpu_task_create(); task->synchronous = 1; task->cl = &cl; task->handles[0] = *current_config->handle; task->destroy = 0; if (id != -1) { task->execute_on_a_specific_worker = 1; task->workerid = workerid; } factor = -factor; task->cl_arg = &factor; task->cl_arg_size = sizeof(factor); *taskp = task; return 0; } /* * _to_ functions. * They all create and submit a task that has to be executed on , * forcing a copy between and . * XXX : could we sometimes use starpu_task_insert() ? It seems hars because we * need to set the execute_on_a_specific_worker field... */ #ifdef STARPU_USE_CUDA static enum exit_code ram_to_cuda(void) { int err; struct starpu_task *task; err = create_task(&task, STARPU_CUDA_WORKER, 0); if (err != 0) return TASK_CREATION_FAILURE; err = starpu_task_submit(task); if (err != 0) return TASK_SUBMISSION_FAILURE; FPRINTF(stderr, "[%s] : %d\n", __starpu_func__, current_config->copy_failed); return current_config->copy_failed; } #ifdef HAVE_CUDA_MEMCPY_PEER static enum exit_code cuda_to_cuda(void) { int err; struct starpu_task *task; err = create_task(&task, STARPU_CUDA_WORKER, 1); if (err != 0) return TASK_CREATION_FAILURE; err = starpu_task_submit(task); if (err != 0) return TASK_SUBMISSION_FAILURE; FPRINTF(stderr, "[%s] : %d\n", __starpu_func__, current_config->copy_failed); return current_config->copy_failed; } #endif static enum exit_code cuda_to_ram(void) { int err; struct starpu_task *task; err = create_task(&task, STARPU_CPU_WORKER, -1); if (err != 0) return TASK_CREATION_FAILURE; err = starpu_task_submit(task); if (err != 0) return TASK_SUBMISSION_FAILURE; FPRINTF(stderr, "[%s] : %d\n", __starpu_func__, current_config->copy_failed); return current_config->copy_failed; } #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL static enum exit_code ram_to_opencl(void) { int err; struct starpu_task *task; err = create_task(&task, STARPU_OPENCL_WORKER, 0); if (err != 0) return TASK_CREATION_FAILURE; err = starpu_task_submit(task); if (err != 0) return TASK_SUBMISSION_FAILURE; FPRINTF(stderr, "[%s] : %d\n", __starpu_func__, current_config->copy_failed); return current_config->copy_failed; } static enum exit_code opencl_to_ram(void) { int err; struct starpu_task *task; err = create_task(&task, STARPU_CPU_WORKER, -1); if (err != 0) return TASK_CREATION_FAILURE; err = starpu_task_submit(task); if (err != 0) return TASK_SUBMISSION_FAILURE; FPRINTF(stderr, "[%s] : %d\n", __starpu_func__, current_config->copy_failed); return current_config->copy_failed; } #endif /* !STARPU_USE_OPENCL */ #ifdef STARPU_USE_MIC static enum exit_code ram_to_mic() { int err; struct starpu_task *task; err = create_task(&task, STARPU_MIC_WORKER, 0); if (err != 0) return TASK_CREATION_FAILURE; err = starpu_task_submit(task); if (err != 0) return TASK_SUBMISSION_FAILURE; FPRINTF(stderr, "[%s] : %d\n", __func__, current_config->copy_failed); return current_config->copy_failed; } static enum exit_code mic_to_ram() { int err; struct starpu_task *task; err = create_task(&task, STARPU_CPU_WORKER, -1); if (err != 0) return TASK_CREATION_FAILURE; err = starpu_task_submit(task); if (err != 0) return TASK_SUBMISSION_FAILURE; FPRINTF(stderr, "[%s] : %d\n", __func__, current_config->copy_failed); return current_config->copy_failed; } #endif /* End of the _to_ functions. */ #ifdef STARPU_USE_CUDA static void run_cuda(int async) { /* RAM -> CUDA (-> CUDA) -> RAM */ int err; err = ram_to_cuda(); set_field(&summary, async, CPU_TO_CUDA, err); /* If this failed, there is no point in continuing. */ if (err != SUCCESS) return; #ifdef HAVE_CUDA_MEMCPY_PEER if (starpu_cuda_worker_get_count() >= 2) { err = cuda_to_cuda(); set_field(&summary, async, CUDA_TO_CUDA, err); /* Even if cuda_to_cuda() failed, a valid copy is left on the first * cuda device, which means we can safely test cuda_to_ram() */ } else { summary.cuda_to_cuda_async = UNTESTED; } #else summary.cuda_to_cuda_async = UNTESTED; #endif /* !HAVE_CUDA_MEMCPY_PEER */ #ifdef STARPU_USE_CPU err = cuda_to_ram(); set_field(&summary, async, CUDA_TO_CPU, err); #endif /* !STARPU_USE_CPU */ } #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL static void run_opencl(int async) { /* RAM -> OpenCL -> RAM */ int err; err = ram_to_opencl(); set_field(&summary, async, CPU_TO_OPENCL, err); if (err != SUCCESS) return; #ifdef STARPU_USE_CPU err = opencl_to_ram(); set_field(&summary, async, OPENCL_TO_CPU, err); #endif /*!STARPU_USE_CPU */ } #endif /* !STARPU_USE_OPENCL */ #ifdef STARPU_USE_MIC static void run_mic(int async) { int err; err = ram_to_mic(); set_field(&summary, async, CPU_TO_MIC, err); if (err != SUCCESS) return; #ifdef STARPU_USE_CPU err = mic_to_ram(); set_field(&summary, async, MIC_TO_CPU, err); #endif } #endif /* STARPU_USE_PIC */ #ifdef STARPU_USE_CPU /* Valid data should be in RAM before calling this function */ static void ram_to_ram(void) { int err; struct starpu_task *task; starpu_data_handle_t src, dst; void *src_interface, *dst_interface; src = *current_config->handle; dst = *current_config->dummy_handle; /* We do not care about the nodes */ src_interface = starpu_data_get_interface_on_node(src, STARPU_MAIN_RAM); dst_interface = starpu_data_get_interface_on_node(dst, STARPU_MAIN_RAM); if (src->ops->copy_methods->ram_to_ram) src->ops->copy_methods->ram_to_ram(src_interface, STARPU_MAIN_RAM, dst_interface, STARPU_MAIN_RAM); else src->ops->copy_methods->any_to_any(src_interface, STARPU_MAIN_RAM, dst_interface, STARPU_MAIN_RAM, NULL); err = create_task(&task, STARPU_CPU_WORKER, -1); if (err != 0) goto out; task->handles[0] = dst; err = starpu_task_submit(task); starpu_task_destroy(task); if (err != 0) { err = TASK_SUBMISSION_FAILURE; goto out; } FPRINTF(stderr, "[%s] : %d\n", __starpu_func__, current_config->copy_failed); err = current_config->copy_failed; out: set_field(&summary, 0, CPU_TO_CPU, err); } #endif /* !STARPU_USE_CPU */ static void run_async(void) { int async = starpu_asynchronous_copy_disabled(); if (async == 1) { FPRINTF(stderr, "Asynchronous copies have been disabled\n"); return; } #ifdef STARPU_USE_CUDA run_cuda(1); #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL run_opencl(1); #endif /* !STARPU_USE_OPENCL */ #ifdef STARPU_USE_MIC run_mic(1); #endif } static void run_sync(void) { starpu_data_handle_t handle = *current_config->handle; struct starpu_data_copy_methods new_copy_methods; struct starpu_data_copy_methods *old_copy_methods; old_copy_methods = (struct starpu_data_copy_methods *) handle->ops->copy_methods; memcpy(&new_copy_methods, old_copy_methods, sizeof(struct starpu_data_copy_methods)); #ifdef STARPU_USE_CUDA new_copy_methods.ram_to_cuda_async = NULL; new_copy_methods.cuda_to_cuda_async = NULL; new_copy_methods.cuda_to_ram_async = NULL; #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL new_copy_methods.ram_to_opencl_async = NULL; new_copy_methods.opencl_to_ram_async = NULL; #endif /* !STARPU_USE_OPENCL */ #ifdef STARPU_USE_MIC new_copy_methods.ram_to_mic_async = NULL; new_copy_methods.mic_to_ram_async = NULL; #endif handle->ops->copy_methods = &new_copy_methods; #ifdef STARPU_USE_CUDA run_cuda(0); #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL run_opencl(0); #endif /* !STARPU_USE_OPENCL */ #ifdef STARPU_USE_MIC run_mic(0); #endif handle->ops->copy_methods = old_copy_methods; } static void compare(void) { int err; void *interface_a, *interface_b; starpu_data_handle_t handle, dummy_handle; handle = *current_config->handle; dummy_handle = *current_config->dummy_handle; interface_a = starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); interface_b = starpu_data_get_interface_on_node(dummy_handle, STARPU_MAIN_RAM); err = handle->ops->compare(interface_a, interface_b); if (err == 0) { summary.compare = FAILURE; summary.success = FAILURE; } else { summary.compare = SUCCESS; } } #ifdef STARPU_USE_CPU static void handle_to_pointer(void) { void *ptr; unsigned int node; unsigned int tests = 0; starpu_data_handle_t handle; handle = *current_config->handle; if (!handle->ops->handle_to_pointer) return; for (node = 0; node < STARPU_MAXNODES; node++) { if (starpu_node_get_kind(node) != STARPU_CPU_RAM) continue; ptr = handle->ops->handle_to_pointer(handle, node); if (starpu_data_lookup(ptr) != handle) { summary.handle_to_pointer = FAILURE; return; } tests++; } if (tests > 0) summary.handle_to_pointer = SUCCESS; } #endif /* !STARPU_USE_CPU */ static int load_conf(struct test_config *config) { if (!config || #ifdef STARPU_USE_CPU !config->cpu_func || !config->dummy_handle || #endif #ifdef STARPU_USE_CUDA !config->cuda_func || #endif #ifdef STARPU_USE_OPENCL !config->opencl_func || #endif #ifdef STARPU_USE_MIC !config->cpu_func_name || #endif !config->handle) { return 1; } current_config = config; return 0; } data_interface_test_summary* run_tests(struct test_config *conf) { if (load_conf(conf) == 1) { FPRINTF(stderr, "Failed to load conf.\n"); return NULL; } run_async(); run_sync(); #ifdef STARPU_USE_CPU ram_to_ram(); compare(); handle_to_pointer(); #endif return &summary; } starpu-1.2.3+dfsg/tests/datawizard/interfaces/test_interfaces.h000066400000000000000000000043101320135501600247160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef TEST_INTERFACES_H #define TEST_INTERFACES_H #include "../../helper.h" /* * Users do not know about this enum. They only know that SUCCESS is 0, and * FAILURE is 1. Therefore, the values of SUCCESS and FAILURE shall not be * changed. */ enum exit_code { SUCCESS = 0, FAILURE = 1, UNTESTED = 2, TASK_CREATION_FAILURE = 3, TASK_SUBMISSION_FAILURE = 4 }; struct test_config { /* A pointer to a registered handle */ starpu_data_handle_t *handle; /* A pointer to a registered handle, that will be used to test * RAM to RAM copy. The values it points to should be different from * the ones pointed to by the previous handle. */ starpu_data_handle_t *dummy_handle; /* StarPU codelets. The following functions should : * 1) Check that the values are correct * 2) Negate every element */ starpu_cpu_func_t cpu_func; #ifdef STARPU_USE_CUDA starpu_cuda_func_t cuda_func; #endif #ifdef STARPU_USE_OPENCL starpu_opencl_func_t opencl_func; #endif char *cpu_func_name; /* The previous codelets must update this field at the end of their * execution. copy_failed must be FAILURE if the copy failed, SUCCESS otherwise. */ enum exit_code copy_failed; /* A human-readable name for the test */ const char *name; }; typedef struct data_interface_test_summary data_interface_test_summary; void data_interface_test_summary_print(FILE *, data_interface_test_summary *); int data_interface_test_summary_success(data_interface_test_summary *); data_interface_test_summary *run_tests(struct test_config*); #endif /* !TEST_INTERFACES_H */ starpu-1.2.3+dfsg/tests/datawizard/interfaces/variable/000077500000000000000000000000001320135501600231525ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/datawizard/interfaces/variable/variable_cuda.cu000066400000000000000000000034461320135501600262730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../test_interfaces.h" extern struct test_config variable_config; static __global__ void variable_cuda(int *val, int *err, int factor) { unsigned i = blockIdx.x*blockDim.x + threadIdx.x; if (i > 0) return; if (*val != 42 * factor) *err = 1; else *val *= -1; } extern "C" void test_variable_cuda_func(void *buffers[], void *args) { cudaError_t error; int *ret; error = cudaMalloc(&ret, sizeof(int)); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); error = cudaMemcpy(ret, &variable_config.copy_failed, sizeof(int), cudaMemcpyHostToDevice); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); int *val = (int *)STARPU_VARIABLE_GET_PTR(buffers[0]); int factor = *(int*) args; unsigned threads_per_block = 64; unsigned nblocks = 1; variable_cuda<<>>(val, ret, factor); error = cudaMemcpy(&variable_config.copy_failed, ret, sizeof(int), cudaMemcpyDeviceToHost); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); cudaFree(ret); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.2.3+dfsg/tests/datawizard/interfaces/variable/variable_interface.c000066400000000000000000000055651320135501600271360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" static int variable; static int variable2; static starpu_data_handle_t variable_handle; static starpu_data_handle_t variable2_handle; /* Codelets */ #if defined(STARPU_USE_CPU) || defined(STARPU_USE_MIC) void test_variable_cpu_func(void *buffers[], void *args); #endif #ifdef STARPU_USE_CUDA extern void test_variable_cuda_func(void *buffers[], void *args); #endif #ifdef STARPU_USE_OPENCL extern void test_variable_opencl_func(void *buffers[], void *args); #endif struct test_config variable_config = { #ifdef STARPU_USE_CPU .cpu_func = test_variable_cpu_func, #endif #ifdef STARPU_USE_CUDA .cuda_func = test_variable_cuda_func, #endif #ifdef STARPU_USE_OPENCL .opencl_func = test_variable_opencl_func, #endif #ifdef STARPU_USE_MIC .cpu_func_name = "test_variable_cpu_func", #endif .handle = &variable_handle, .dummy_handle = &variable2_handle, .copy_failed = SUCCESS, .name = "variable_interface" }; void test_variable_cpu_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; int *val; int factor; val = (int *) STARPU_VARIABLE_GET_PTR(buffers[0]); factor = *(int *)args; if (*val != 42 * factor) variable_config.copy_failed = FAILURE; else *val *= -1; } static void register_data(void) { variable = 42; variable2 = 12; starpu_variable_data_register(&variable_handle, STARPU_MAIN_RAM, (uintptr_t) &variable, sizeof(variable)); starpu_variable_data_register(&variable2_handle, STARPU_MAIN_RAM, (uintptr_t) &variable2, sizeof(variable2)); } static void unregister_data(void) { starpu_data_unregister(variable_handle); starpu_data_unregister(variable2_handle); } int main(int argc, char **argv) { int ret; data_interface_test_summary *summary; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncuda = 2; conf.nopencl = 1; conf.nmic = -1; ret = starpu_initialize(&conf, &argc, &argv); if (ret == -ENODEV || starpu_cpu_worker_get_count() == 0) return STARPU_TEST_SKIPPED; register_data(); summary = run_tests(&variable_config); if (!summary) exit(EXIT_FAILURE); unregister_data(); starpu_shutdown(); data_interface_test_summary_print(stderr, summary); return data_interface_test_summary_success(summary); } starpu-1.2.3+dfsg/tests/datawizard/interfaces/variable/variable_opencl.c000066400000000000000000000063751320135501600264560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" #define KERNEL_LOCATION "tests/datawizard/interfaces/variable/variable_opencl_kernel.cl" extern struct test_config variable_config; static struct starpu_opencl_program opencl_program; void test_variable_opencl_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; int id, devid, ret; int factor = *(int *) args; cl_int err; cl_kernel kernel; cl_command_queue queue; cl_event event; ret = starpu_opencl_load_opencl_from_file(KERNEL_LOCATION, &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); cl_mem val = (cl_mem)STARPU_VARIABLE_GET_PTR(buffers[0]); cl_context context; id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); starpu_opencl_get_context(devid, &context); cl_mem fail = clCreateBuffer(context, CL_MEM_COPY_HOST_PTR, sizeof(int), &variable_config.copy_failed, &err); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_program, "variable_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 0, sizeof(val), &val); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 1, sizeof(fail), &fail); if (err) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 2, sizeof(factor), &factor); if (err) STARPU_OPENCL_REPORT_ERROR(err); { size_t global = 1; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local = global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } err = clEnqueueReadBuffer(queue, fail, CL_TRUE, 0, sizeof(int), &variable_config.copy_failed, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); starpu_opencl_collect_stats(event); clReleaseEvent(event); starpu_opencl_release_kernel(kernel); ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); return; } starpu-1.2.3+dfsg/tests/datawizard/interfaces/variable/variable_opencl_kernel.cl000066400000000000000000000015411320135501600301600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ __kernel void variable_opencl(__global int *val, __global int *err, int factor) { const int i = get_global_id(0); if (i > 0) return; if (*val != 42 * factor) *err = 1; else *val *= -1; } starpu-1.2.3+dfsg/tests/datawizard/interfaces/vector/000077500000000000000000000000001320135501600226675ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/datawizard/interfaces/vector/test_vector_cuda.cu000066400000000000000000000035301320135501600265560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../test_interfaces.h" extern struct test_config vector_config; __global__ void framework_cuda(int *val, unsigned n, int *err, int factor) { unsigned i = blockIdx.x*blockDim.x + threadIdx.x; if (i >= n) return; if (val[i] != i*factor) *err = 1; else val[i] = -val[i]; } extern "C" void test_vector_cuda_func(void *buffers[], void *args) { cudaError_t error; int *ret; error = cudaMalloc(&ret, sizeof(int)); if (error != cudaSuccess) { fprintf(stderr, "cudaMalloc failed...\n"); return; } error = cudaMemcpy(ret, &vector_config.copy_failed, sizeof(int), cudaMemcpyHostToDevice); if (error != cudaSuccess) return; unsigned n = STARPU_VECTOR_GET_NX(buffers[0]); int *val = (int *)STARPU_VECTOR_GET_PTR(buffers[0]); int factor = *(int*) args; unsigned threads_per_block = 64; unsigned nblocks = (n + threads_per_block-1) / threads_per_block; framework_cuda<<>>(val, n, ret, factor); error = cudaMemcpy(&vector_config.copy_failed, ret, sizeof(int), cudaMemcpyDeviceToHost); if (error != cudaSuccess) { return; } cudaFree(ret); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.2.3+dfsg/tests/datawizard/interfaces/vector/test_vector_interface.c000066400000000000000000000063331320135501600274210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" #include "../../../helper.h" /* Prototypes */ static void register_data(void); static void unregister_data(void); void test_vector_cpu_func(void *buffers[], void *args); #ifdef STARPU_USE_CUDA extern void test_vector_cuda_func(void *buffers[], void *_args); #endif #ifdef STARPU_USE_OPENCL extern void test_vector_opencl_func(void *buffers[], void *args); #endif static starpu_data_handle_t vector_handle; static starpu_data_handle_t vector2_handle; struct test_config vector_config = { .cpu_func = test_vector_cpu_func, #ifdef STARPU_USE_CUDA .cuda_func = test_vector_cuda_func, #endif #ifdef STARPU_USE_OPENCL .opencl_func = test_vector_opencl_func, #endif #ifdef STARPU_USE_MIC .cpu_func_name = "test_vector_cpu_func", #endif .handle = &vector_handle, .dummy_handle = &vector2_handle, .copy_failed = SUCCESS, .name = "vector_interface" }; #define VECTOR_SIZE 123 static int vector[VECTOR_SIZE]; static int vector2[VECTOR_SIZE]; static void register_data(void) { /* Initializing data */ int i; for (i = 0; i < VECTOR_SIZE; i++) vector[i] = i; /* Registering data */ starpu_vector_data_register(&vector_handle, STARPU_MAIN_RAM, (uintptr_t)vector, VECTOR_SIZE, sizeof(int)); starpu_vector_data_register(&vector2_handle, STARPU_MAIN_RAM, (uintptr_t)vector2, VECTOR_SIZE, sizeof(int)); } static void unregister_data(void) { starpu_data_unregister(vector_handle); starpu_data_unregister(vector2_handle); } void test_vector_cpu_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; unsigned n = STARPU_VECTOR_GET_NX(buffers[0]); int *val = (int *) STARPU_VECTOR_GET_PTR(buffers[0]); int factor = *(int*)args; unsigned int i; for (i = 0; i < n; i++) { if (val[i] != (int)i*factor) { vector_config.copy_failed = FAILURE; return; } val[i] = -val[i]; } } int main(int argc, char **argv) { data_interface_test_summary *summary; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncuda = 2; conf.nopencl = 1; conf.nmic = -1; if (starpu_initialize(&conf, &argc, &argv) == -ENODEV || starpu_cpu_worker_get_count() == 0) goto enodev; register_data(); summary = run_tests(&vector_config); if (!summary) exit(EXIT_FAILURE); unregister_data(); starpu_shutdown(); data_interface_test_summary_print(stderr, summary); return data_interface_test_summary_success(summary); enodev: return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/interfaces/vector/test_vector_opencl.c000066400000000000000000000064451320135501600267450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" #define KERNEL_LOCATION "tests/datawizard/interfaces/vector/test_vector_opencl_kernel.cl" extern struct test_config vector_config; static struct starpu_opencl_program opencl_program; void test_vector_opencl_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; int id, devid, ret; int factor = *(int *) args; cl_int err; cl_kernel kernel; cl_command_queue queue; cl_event event; ret = starpu_opencl_load_opencl_from_file(KERNEL_LOCATION, &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); unsigned n = STARPU_VECTOR_GET_NX(buffers[0]); cl_mem val = (cl_mem)STARPU_VECTOR_GET_DEV_HANDLE(buffers[0]); cl_context context; id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); starpu_opencl_get_context(devid, &context); cl_mem fail = clCreateBuffer(context, CL_MEM_COPY_HOST_PTR, sizeof(int), &vector_config.copy_failed, &err); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_program, "test_vector_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); int nargs; nargs = starpu_opencl_set_kernel_args(&err, &kernel, sizeof(val), &val, sizeof(n), &n, sizeof(fail), &fail, sizeof(factor), &factor, 0); if (nargs != 4) { fprintf(stderr, "Failed to set argument #%d\n", err); STARPU_OPENCL_REPORT_ERROR(err); } { size_t global=n; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local = global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } err = clEnqueueReadBuffer(queue, fail, CL_TRUE, 0, sizeof(int), &vector_config.copy_failed, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); starpu_opencl_collect_stats(event); clReleaseEvent(event); starpu_opencl_release_kernel(kernel); ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); } starpu-1.2.3+dfsg/tests/datawizard/interfaces/vector/test_vector_opencl_kernel.cl000066400000000000000000000015741320135501600304570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ __kernel void test_vector_opencl(__global int *val, unsigned int nx, __global int *err, int factor) { const int i = get_global_id(0); if (i >= nx) return; if (val[i] != i * factor) *err = 1; else val[i] = - val[i]; } starpu-1.2.3+dfsg/tests/datawizard/interfaces/void/000077500000000000000000000000001320135501600223265ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/datawizard/interfaces/void/void_interface.c000066400000000000000000000040171320135501600254550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../test_interfaces.h" #include "../../../helper.h" void fake_func(void *buffers[], void *arg) { (void) buffers; (void) arg; } static starpu_data_handle_t void_handle; static starpu_data_handle_t void2_handle; struct test_config void_config = { .cpu_func = fake_func, #ifdef STARPU_USE_CUDA .cuda_func = fake_func, #endif #ifdef STARPU_USE_OPENCL .opencl_func = fake_func, #endif #ifdef STARPU_USE_MIC .cpu_func_name = "fake_func", #endif .handle = &void_handle, .dummy_handle = &void2_handle, .copy_failed = SUCCESS, .name = "void_interface" }; static void register_data(void) { starpu_void_data_register(&void_handle); starpu_void_data_register(&void2_handle); } static void unregister_data(void) { starpu_data_unregister(void_handle); starpu_data_unregister(void2_handle); } int main(int argc, char **argv) { data_interface_test_summary *summary; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncuda = 2; conf.nopencl = 1; conf.nmic = -1; if (starpu_initialize(&conf, &argc, &argv) == -ENODEV || starpu_cpu_worker_get_count() == 0) goto enodev; register_data(); summary = run_tests(&void_config); if (!summary) exit(EXIT_FAILURE); unregister_data(); starpu_shutdown(); data_interface_test_summary_print(stderr, summary); return data_interface_test_summary_success(summary); enodev: return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/invalidate_pending_requests.c000066400000000000000000000033351320135501600251710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" /* * Try invalidating a variable which is pending a request */ #define SIZE (100<<20) int main(int argc, char **argv) { int ret; char *var = NULL; starpu_data_handle_t handle; ret = starpu_init(NULL); if (ret == -ENODEV) goto skip; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); if (starpu_worker_get_count_by_type(STARPU_CUDA_WORKER) == 0 && starpu_worker_get_count_by_type(STARPU_OPENCL_WORKER) == 0) goto enodev; var = malloc(SIZE); starpu_variable_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)var, SIZE); /* Let a request fly */ starpu_fxt_trace_user_event_string("requesting"); starpu_data_fetch_on_node(handle, 1, 1); starpu_fxt_trace_user_event_string("requested"); /* But suddenly invalidate the data while it's on the fly! */ starpu_data_invalidate_submit(handle); starpu_fxt_trace_user_event_string("invalidated"); starpu_data_unregister(handle); free(var); starpu_shutdown(); return 0; enodev: starpu_shutdown(); skip: return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/lazy_allocation.c000066400000000000000000000132171320135501600225760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012, 2014, 2016 Université de Bordeaux * Copyright (C) 2012 INRIA * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include "../helper.h" /* * Trigger lazy allocation by registering NULL, then setting a value, and * then checking it */ #define VECTORSIZE 1024 static starpu_data_handle_t v_handle; /* * Memset */ #ifdef STARPU_USE_CUDA static void cuda_memset_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; char *buf = (char *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned length = STARPU_VECTOR_GET_NX(descr[0]); cudaMemsetAsync(buf, 42, length, starpu_cuda_get_local_stream()); } #endif #ifdef STARPU_USE_OPENCL static void opencl_memset_codelet(void *buffers[], void *args) { (void) args; cl_command_queue queue; int id = starpu_worker_get_id_check(); int devid = starpu_worker_get_devid(id); starpu_opencl_get_queue(devid, &queue); cl_mem buffer = (cl_mem) STARPU_VECTOR_GET_DEV_HANDLE(buffers[0]); unsigned length = STARPU_VECTOR_GET_NX(buffers[0]); char *v = malloc(length); STARPU_ASSERT(v != NULL); memset(v, 42, length); clEnqueueWriteBuffer(queue, buffer, CL_FALSE, 0, /* offset */ length, /* sizeof (char) */ v, 0, /* num_events_in_wait_list */ NULL, /* event_wait_list */ NULL /* event */); } #endif void cpu_memset_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; char *buf = (char *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned length = STARPU_VECTOR_GET_NX(descr[0]); memset(buf, 42, length * sizeof(*buf)); } static struct starpu_codelet memset_cl = { .cpu_funcs = {cpu_memset_codelet}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_memset_codelet}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_memset_codelet}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs_name = {"cpu_memset_codelet"}, .nbuffers = 1, .modes = {STARPU_W} }; /* * Check content */ void cpu_check_content_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; char *buf = (char *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned length = STARPU_VECTOR_GET_NX(descr[0]); unsigned i; for (i = 0; i < length; i++) { if (buf[i] != 42) { FPRINTF(stderr, "buf[%u] is %c while it should be %c\n", i, buf[i], 42); exit(-1); } } } #ifdef STARPU_USE_CUDA static void cuda_check_content_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; char *buf = (char *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned length = STARPU_VECTOR_GET_NX(descr[0]); unsigned i; for (i = 0; i < length; i++) { char dst; cudaMemcpyAsync(&dst, &buf[i], sizeof(char), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); if (dst != 42) { FPRINTF(stderr, "buf[%u] is %c while it should be %c\n", i, dst, 42); exit(-1); } } } #endif #ifdef STARPU_USE_OPENCL static void opencl_check_content_codelet(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; cl_command_queue queue; int id = starpu_worker_get_id_check(); int devid = starpu_worker_get_devid(id); starpu_opencl_get_queue(devid, &queue); cl_mem buf = (cl_mem) STARPU_VECTOR_GET_DEV_HANDLE(buffers[0]); unsigned length = STARPU_VECTOR_GET_NX(buffers[0]); unsigned i; for (i = 0; i < length; i++) { char dst; clEnqueueReadBuffer(queue, buf, CL_FALSE, i * sizeof(dst), sizeof(dst), &dst, 0, /* num_events_in_wait_list */ NULL, /* event_wait_list */ NULL /* event */); clFinish(queue); if (dst != 42) { FPRINTF(stderr, "buf[%u] is '%c' while it should be '%c'\n", i, dst, 42); exit(-1); } } } #endif static struct starpu_codelet check_content_cl = { .cpu_funcs = {cpu_check_content_codelet}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_check_content_codelet}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_check_content_codelet}, #endif .cpu_funcs_name = {"cpu_check_content_codelet"}, .nbuffers = 1, .modes = {STARPU_R} }; int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_vector_data_register(&v_handle, (uint32_t)-1, (uintptr_t)NULL, VECTORSIZE, sizeof(char)); ret = starpu_task_insert(&memset_cl, STARPU_W, v_handle, 0); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); ret = starpu_task_insert(&check_content_cl, STARPU_R, v_handle, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_data_unregister(v_handle); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/datawizard/lazy_unregister.c000066400000000000000000000041211320135501600226320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include "../helper.h" /* * Test that starpu_data_unregister_submit waits for both tasks to finish */ void dummy_func(void ** buffers, void * args) { (void) buffers; (void) args; } static struct starpu_codelet dummy_cl = { .modes = { STARPU_RW }, .cpu_funcs = { dummy_func }, .cpu_funcs_name = { "dummy_func" }, .nbuffers = 1 }; int main(void) { int ret; int buffer[1024]; starpu_data_handle_t handle; struct starpu_task *t1,*t2; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)buffer, 1024*sizeof(int)); t1 = starpu_task_create(); t2 = starpu_task_create(); t2->cl = &dummy_cl; t2->detach = 0; t2->handles[0] = handle; starpu_task_declare_deps_array(t2, 1, &t1); ret = starpu_task_submit(t2); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_data_unregister_submit(handle); ret = starpu_task_submit(t1); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(t2); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); while (starpu_data_lookup(buffer) != NULL) usleep(100000); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/datawizard/locality.c000066400000000000000000000076301320135501600212340ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This is a dumb sample of stencil application * * Dumb domain split in N pieces: * * 0 | 1 | ... | N-1 * * for each simulation iteration, a task works on some adjactent pieces * * Locality is thus set on the central piece. */ #include #include "../helper.h" #define N 50 #define ITER 50 int task_worker[N][ITER]; int worker_task[STARPU_NMAXWORKERS][N*ITER]; unsigned worker_ntask[STARPU_NMAXWORKERS]; void cpu_f(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *_args) { unsigned i, loop, worker = starpu_worker_get_id(); enum starpu_worker_archtype worker_type = starpu_worker_get_type(worker); starpu_codelet_unpack_args(_args, &loop, &i); task_worker[i][loop] = worker; worker_task[worker][worker_ntask[worker]++] = i; if (worker_type == STARPU_CPU_WORKER) starpu_sleep(0.001); else starpu_sleep(0.0001); } double cost_function(struct starpu_task *t, struct starpu_perfmodel_arch *a, unsigned i) { (void) t; (void) i; STARPU_ASSERT(a->ndevices == 1); if (a->devices[0].type == STARPU_CPU_WORKER) { STARPU_ASSERT(a->devices[0].ncores == 1); return 1000; } else return 100; } static struct starpu_perfmodel perf_model = { .type = STARPU_PER_ARCH, .arch_cost_function = cost_function, }; static struct starpu_codelet cl = { .cpu_funcs = { cpu_f }, .cpu_funcs_name = { "cpu_f" }, .cuda_funcs = { cpu_f }, .opencl_funcs = { cpu_f }, .nbuffers = 4, .modes = { STARPU_RW, STARPU_RW | STARPU_COMMUTE | STARPU_LOCALITY, STARPU_RW | STARPU_COMMUTE | STARPU_LOCALITY, STARPU_RW | STARPU_COMMUTE | STARPU_LOCALITY, }, .flags = STARPU_CODELET_SIMGRID_EXECUTE, .model = &perf_model, }; int main(int argc, char *argv[]) { int ret; starpu_data_handle_t A[N]; starpu_data_handle_t B[N]; unsigned i, loop, finished; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* Get most parallelism by using an arbiter */ starpu_arbiter_t arbiter = starpu_arbiter_create(); for (i = 0; i < N; i++) { starpu_void_data_register(&A[i]); starpu_void_data_register(&B[i]); starpu_data_assign_arbiter(A[i], arbiter); } for (loop = 0; loop < ITER; loop++) { for (i = 1; i < N-1; i++) { starpu_task_insert(&cl, STARPU_RW, B[i], STARPU_RW | STARPU_COMMUTE | STARPU_LOCALITY, A[i-1], STARPU_RW | STARPU_COMMUTE | STARPU_LOCALITY, A[i], STARPU_RW | STARPU_COMMUTE | STARPU_LOCALITY, A[i+1], STARPU_VALUE, &loop, sizeof(loop), STARPU_VALUE, &i, sizeof(i), 0); } } starpu_task_wait_for_all(); for (i = 0; i < N; i++) { starpu_data_unregister(A[i]); starpu_data_unregister(B[i]); } starpu_arbiter_destroy(arbiter); printf("worker where each domain piece was computed, over time\n"); for (loop = 0; loop < ITER; loop++) { for (i = 1; i < N-1; i++) { printf("%02d ", task_worker[i][loop]); } printf("\n"); } printf("\n"); printf("domain piece that each worker has computed, over time\n"); loop = 0; do { finished = 1; for (i = 0; i < starpu_worker_get_count(); i++) { if (loop < worker_ntask[i]) { printf("%02d ", worker_task[i][loop]); finished = 0; } else printf(" "); } loop++; printf("\n"); } while (!finished && loop < 100); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/datawizard/locality.sh000077500000000000000000000020571320135501600214250ustar00rootroot00000000000000#!/bin/sh -x # # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2017 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # Test generation of FxT traces set -e PREFIX=$(dirname $0) test -x $PREFIX/../../tools/starpu_fxt_tool || exit 77 STARPU_SCHED=modular-eager STARPU_FXT_PREFIX=$PREFIX/ $PREFIX/locality $PREFIX/../../tools/starpu_fxt_tool -i $PREFIX/prof_file_${USER}_0 # Check that they are approved by Grenoble :) if type pj_dump > /dev/null 2> /dev/null then $PREFIX/../../tools/starpu_paje_sort paje.trace pj_dump paje.trace fi starpu-1.2.3+dfsg/tests/datawizard/manual_reduction.c000066400000000000000000000166431320135501600227510ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2016 Université de Bordeaux * Copyright (C) 2012, 2013, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Allocate one buffer per worker, doing computations with it, and * eventually reducing it into a single buffer */ #define INIT_VALUE 42 #define NTASKS 10000 static unsigned variable; static starpu_data_handle_t variable_handle; static uintptr_t per_worker[STARPU_NMAXWORKERS]; static starpu_data_handle_t per_worker_handle[STARPU_NMAXWORKERS]; /* Create per-worker handles */ static void initialize_per_worker_handle(void *arg STARPU_ATTRIBUTE_UNUSED) { int workerid = starpu_worker_get_id_check(); /* Allocate memory on the worker, and initialize it to 0 */ switch (starpu_worker_get_type(workerid)) { case STARPU_CPU_WORKER: per_worker[workerid] = (uintptr_t)calloc(1, sizeof(variable)); break; #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_WORKER: { cl_context context; cl_command_queue queue; starpu_opencl_get_current_context(&context); starpu_opencl_get_current_queue(&queue); cl_mem ptr = clCreateBuffer(context, CL_MEM_READ_WRITE, sizeof(variable), NULL, NULL); /* Poor's man memset */ unsigned zero = 0; clEnqueueWriteBuffer(queue, ptr, CL_FALSE, 0, sizeof(variable), (void *)&zero, 0, NULL, NULL); clFinish(queue); per_worker[workerid] = (uintptr_t)ptr; } break; #endif #ifdef STARPU_USE_CUDA case STARPU_CUDA_WORKER: { cudaError_t status; status = cudaMalloc((void **)&per_worker[workerid], sizeof(variable)); if (!per_worker[workerid] || (status != cudaSuccess)) { STARPU_CUDA_REPORT_ERROR(status); } cudaMemset((void *)per_worker[workerid], 0, sizeof(variable)); break; } #endif default: STARPU_ABORT(); break; } STARPU_ASSERT(per_worker[workerid]); } /* * Implement reduction method */ void cpu_redux_func(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { unsigned *a = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned *b = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[1]); FPRINTF(stderr, "%u = %u + %u\n", *a + *b, *a, *b); *a = *a + *b; } static struct starpu_codelet reduction_codelet = { .cpu_funcs = {cpu_redux_func}, .nbuffers = 2, .modes = {STARPU_RW, STARPU_R}, .model = NULL }; /* * Use per-worker local copy */ void cpu_func_incr(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { unsigned *val = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *val = *val + 1; } #ifdef STARPU_USE_CUDA /* dummy CUDA implementation */ static void cuda_func_incr(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { STARPU_SKIP_IF_VALGRIND; unsigned *val = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned h_val; cudaMemcpyAsync(&h_val, val, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); h_val++; cudaMemcpyAsync(val, &h_val, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); } #endif #ifdef STARPU_USE_OPENCL /* dummy OpenCL implementation */ static void opencl_func_incr(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { STARPU_SKIP_IF_VALGRIND; cl_mem d_val = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned h_val; cl_command_queue queue; starpu_opencl_get_current_queue(&queue); clEnqueueReadBuffer(queue, d_val, CL_FALSE, 0, sizeof(unsigned), (void *)&h_val, 0, NULL, NULL); clFinish(queue); h_val++; clEnqueueWriteBuffer(queue, d_val, CL_FALSE, 0, sizeof(unsigned), (void *)&h_val, 0, NULL, NULL); clFinish(queue); } #endif static struct starpu_codelet use_data_on_worker_codelet = { .cpu_funcs = {cpu_func_incr}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_func_incr}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_func_incr}, #endif .nbuffers = 1, .modes = {STARPU_RW}, .model = NULL }; int main(int argc, char **argv) { unsigned worker; unsigned i; int ret; struct starpu_conf conf; starpu_conf_init(&conf); conf.nmic = 0; conf.nscc = 0; variable = INIT_VALUE; ret = starpu_initialize(&conf, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); unsigned nworkers = starpu_worker_get_count(); starpu_variable_data_register(&variable_handle, STARPU_MAIN_RAM, (uintptr_t)&variable, sizeof(unsigned)); /* Allocate a per-worker handle on each worker (and initialize it to 0) */ starpu_execute_on_each_worker(initialize_per_worker_handle, NULL, STARPU_CPU|STARPU_CUDA|STARPU_OPENCL); /* Register all per-worker handles */ for (worker = 0; worker < nworkers; worker++) { STARPU_ASSERT(per_worker[worker]); unsigned memory_node = starpu_worker_get_memory_node(worker); starpu_variable_data_register(&per_worker_handle[worker], memory_node, per_worker[worker], sizeof(variable)); } /* Submit NTASKS tasks to the different worker to simulate the usage of a data in reduction */ for (i = 0; i < NTASKS; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &use_data_on_worker_codelet; int workerid = (i % nworkers); task->handles[0] = per_worker_handle[workerid]; task->execute_on_a_specific_worker = 1; task->workerid = (unsigned)workerid; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } /* Perform the reduction of all per-worker handles into the variable_handle */ for (worker = 0; worker < nworkers; worker++) { struct starpu_task *task = starpu_task_create(); task->cl = &reduction_codelet; task->handles[0] = variable_handle; task->handles[1] = per_worker_handle[worker]; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_data_unregister(variable_handle); /* Destroy all per-worker handles */ for (worker = 0; worker < nworkers; worker++) { starpu_data_unregister_no_coherency(per_worker_handle[worker]); switch(starpu_worker_get_type(worker)) { case STARPU_CPU_WORKER: free((void*)per_worker[worker]); break; #ifdef STARPU_USE_CUDA case STARPU_CUDA_WORKER: cudaFree((void*)per_worker[worker]); break; #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_WORKER: clReleaseMemObject((void*)per_worker[worker]); break; #endif /* !STARPU_USE_OPENCL */ default: STARPU_ABORT(); } } starpu_shutdown(); if (variable == INIT_VALUE + NTASKS) ret = EXIT_SUCCESS; else { FPRINTF(stderr, "%u != %u + %u\n", variable, INIT_VALUE, NTASKS); ret = EXIT_FAILURE; } STARPU_RETURN(ret); enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); starpu_task_wait_for_all(); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/mpi_like.c000066400000000000000000000153601320135501600212040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012, 2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include "../helper.h" #include "./mpi_like.h" /* * Mimic the behavior of libstarpumpi, tested by a ring of threads which * increment the same variable one after the other. * This is the synchronous version: the threads wait for completion of each * step before continuing. */ #define NTHREADS 4 #define NITER 2 //static starpu_pthread_cond_t cond; //static starpu_pthread_mutex_t mutex; struct thread_data { unsigned index; unsigned val; starpu_data_handle_t handle; starpu_pthread_t thread; starpu_pthread_cond_t recv_cond; starpu_pthread_mutex_t recv_mutex; unsigned recv_flag; // set when a message is received unsigned recv_buf; struct thread_data *neighbour; }; static struct thread_data problem_data[NTHREADS]; /* We implement some ring transfer, every thread will try to receive a piece of * data from its neighbour and increment it before transmitting it to its * successor. */ void increment_handle_cpu_kernel(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { unsigned *val = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *val += 1; } static struct starpu_codelet increment_handle_cl = { .modes = { STARPU_RW }, .cpu_funcs = {increment_handle_cpu_kernel}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_codelet_unsigned_inc}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_codelet_unsigned_inc}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs_name = {"increment_handle_cpu_kernel"}, .nbuffers = 1 }; static void increment_handle(struct thread_data *thread_data) { struct starpu_task *task = starpu_task_create(); task->cl = &increment_handle_cl; task->handles[0] = thread_data->handle; task->cl_arg = thread_data; task->cl_arg_size = sizeof(thread_data); task->destroy = 1; task->detach = 0; int ret = starpu_task_submit(task); if (ret == -ENODEV) exit(STARPU_TEST_SKIPPED); STARPU_ASSERT(!ret); ret = starpu_task_wait(task); STARPU_ASSERT(!ret); } static void recv_handle(struct thread_data *thread_data) { starpu_data_acquire(thread_data->handle, STARPU_W); STARPU_PTHREAD_MUTEX_LOCK(&thread_data->recv_mutex); /* We wait for the previous thread to notify that the data is available */ while (!thread_data->recv_flag) STARPU_PTHREAD_COND_WAIT(&thread_data->recv_cond, &thread_data->recv_mutex); /* We overwrite thread's data with the received value */ thread_data->val = thread_data->recv_buf; /* Notify that we read the value */ thread_data->recv_flag = 0; STARPU_PTHREAD_COND_SIGNAL(&thread_data->recv_cond); // FPRINTF(stderr, "Thread %d received value %d from thread %d\n", thread_data->index, thread_data->val, (thread_data->index - 1)%NTHREADS); STARPU_PTHREAD_MUTEX_UNLOCK(&thread_data->recv_mutex); starpu_data_release(thread_data->handle); } static void send_handle(struct thread_data *thread_data) { struct thread_data *neighbour_data = thread_data->neighbour; starpu_data_acquire(thread_data->handle, STARPU_R); // FPRINTF(stderr, "Thread %d sends value %d to thread %d\n", thread_data->index, thread_data->val, neighbour_data->index); /* send the message */ STARPU_PTHREAD_MUTEX_LOCK(&neighbour_data->recv_mutex); neighbour_data->recv_buf = thread_data->val; neighbour_data->recv_flag = 1; STARPU_PTHREAD_COND_SIGNAL(&neighbour_data->recv_cond); /* wait until it's received (ie. neighbour's recv_flag is set back to 0) */ while (neighbour_data->recv_flag) STARPU_PTHREAD_COND_WAIT(&neighbour_data->recv_cond, &neighbour_data->recv_mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&neighbour_data->recv_mutex); starpu_data_release(thread_data->handle); } static void *thread_func(void *arg) { unsigned iter; struct thread_data *thread_data = (struct thread_data *) arg; unsigned index = thread_data->index; starpu_variable_data_register(&thread_data->handle, STARPU_MAIN_RAM, (uintptr_t)&thread_data->val, sizeof(unsigned)); for (iter = 0; iter < NITER; iter++) { /* The first thread initiates the first transfer */ if (!((index == 0) && (iter == 0))) { recv_handle(thread_data); } increment_handle(thread_data); if (!((index == (NTHREADS - 1)) && (iter == (NITER - 1)))) { send_handle(thread_data); } } return NULL; } #ifdef STARPU_USE_OPENCL struct starpu_opencl_program opencl_program; #endif int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_load_opencl_from_file("tests/datawizard/opencl_codelet_unsigned_inc_kernel.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif unsigned t; for (t = 0; t < NTHREADS; t++) { problem_data[t].index = t; problem_data[t].val = 0; STARPU_PTHREAD_COND_INIT(&problem_data[t].recv_cond, NULL); STARPU_PTHREAD_MUTEX_INIT(&problem_data[t].recv_mutex, NULL); problem_data[t].recv_flag = 0; problem_data[t].neighbour = &problem_data[(t+1)%NTHREADS]; } for (t = 0; t < NTHREADS; t++) { ret = starpu_pthread_create(&problem_data[t].thread, NULL, thread_func, &problem_data[t]); STARPU_ASSERT(!ret); } for (t = 0; t < NTHREADS; t++) { void *retval; ret = starpu_pthread_join(problem_data[t].thread, &retval); STARPU_ASSERT(!ret); STARPU_ASSERT(retval == NULL); } /* We check that the value in the "last" thread is valid */ starpu_data_handle_t last_handle = problem_data[NTHREADS - 1].handle; starpu_data_acquire(last_handle, STARPU_R); starpu_data_release(last_handle); for (t = 0; t < NTHREADS; t++) { starpu_data_unregister(problem_data[t].handle); } #ifdef STARPU_USE_OPENCL ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); #endif starpu_shutdown(); ret = EXIT_SUCCESS; if (problem_data[NTHREADS - 1].val != (NTHREADS * NITER)) { FPRINTF(stderr, "Final value : %u should be %d\n", problem_data[NTHREADS - 1].val, (NTHREADS * NITER)); ret = EXIT_FAILURE; } return ret; } starpu-1.2.3+dfsg/tests/datawizard/mpi_like.h000066400000000000000000000017421320135501600212100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #ifdef STARPU_USE_CUDA #ifdef __CUDACC__ extern "C" #endif void cuda_codelet_unsigned_inc(void *descr[], STARPU_ATTRIBUTE_UNUSED void *cl_arg); #endif #ifdef STARPU_USE_OPENCL void opencl_codelet_unsigned_inc(void *buffers[], void *args); #endif starpu-1.2.3+dfsg/tests/datawizard/mpi_like_async.c000066400000000000000000000243701320135501600224020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include /* * Mimic the behavior of libstarpumpi, tested by a ring of threads which * increment the same variable one after the other. * This is the asynchronous version: the threads submit the series of * synchronizations and tasks. */ #ifdef STARPU_QUICK_CHECK # define NTHREADS_DEFAULT 4 # define NITER_DEFAULT 8 #else # define NTHREADS_DEFAULT 16 # define NITER_DEFAULT 128 #endif static unsigned nthreads = NTHREADS_DEFAULT; static unsigned niter = NITER_DEFAULT; //#define DEBUG_MESSAGES 1 //static starpu_pthread_cond_t cond; //static starpu_pthread_mutex_t mutex; struct thread_data { unsigned index; unsigned val; starpu_data_handle_t handle; starpu_pthread_t thread; starpu_pthread_mutex_t recv_mutex; unsigned recv_flag; // set when a message is received unsigned recv_buf; struct thread_data *neighbour; }; struct data_req { int (*test_func)(void *); void *test_arg; struct data_req *next; }; static starpu_pthread_mutex_t data_req_mutex; static starpu_pthread_cond_t data_req_cond; struct data_req *data_req_list; unsigned progress_thread_running; static struct thread_data problem_data[NTHREADS_DEFAULT]; /* We implement some ring transfer, every thread will try to receive a piece of * data from its neighbour and increment it before transmitting it to its * successor. */ #ifdef STARPU_USE_CUDA void cuda_codelet_unsigned_inc(void *descr[], STARPU_ATTRIBUTE_UNUSED void *cl_arg); #endif #ifdef STARPU_USE_OPENCL void opencl_codelet_unsigned_inc(void *buffers[], void *args); #endif void increment_handle_cpu_kernel(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { unsigned *val = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *val += 1; // FPRINTF(stderr, "VAL %d (&val = %p)\n", *val, val); } static struct starpu_codelet increment_handle_cl = { .modes = { STARPU_RW }, .cpu_funcs = {increment_handle_cpu_kernel}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_codelet_unsigned_inc}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = { opencl_codelet_unsigned_inc}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs_name = {"increment_handle_cpu_kernel"}, .nbuffers = 1 }; static void increment_handle_async(struct thread_data *thread_data) { struct starpu_task *task = starpu_task_create(); task->cl = &increment_handle_cl; task->handles[0] = thread_data->handle; task->detach = 1; task->destroy = 1; int ret = starpu_task_submit(task); if (ret == -ENODEV) exit(STARPU_TEST_SKIPPED); STARPU_ASSERT(!ret); } static int test_recv_handle_async(void *arg) { // FPRINTF(stderr, "test_recv_handle_async\n"); int ret; struct thread_data *thread_data = (struct thread_data *) arg; STARPU_PTHREAD_MUTEX_LOCK(&thread_data->recv_mutex); ret = (thread_data->recv_flag == 1); if (ret) { thread_data->recv_flag = 0; thread_data->val = thread_data->recv_buf; } STARPU_PTHREAD_MUTEX_UNLOCK(&thread_data->recv_mutex); if (ret) { #ifdef DEBUG_MESSAGES FPRINTF(stderr, "Thread %u received value %u from thread %d\n", thread_data->index, thread_data->val, (thread_data->index - 1)%nthreads); #endif starpu_data_release(thread_data->handle); } return ret; } static void recv_handle_async(void *_thread_data) { struct thread_data *thread_data = (struct thread_data *) _thread_data; struct data_req *req = (struct data_req *) malloc(sizeof(struct data_req)); req->test_func = test_recv_handle_async; req->test_arg = thread_data; req->next = NULL; STARPU_PTHREAD_MUTEX_LOCK(&data_req_mutex); req->next = data_req_list; data_req_list = req; STARPU_PTHREAD_COND_SIGNAL(&data_req_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&data_req_mutex); } static int test_send_handle_async(void *arg) { int ret; struct thread_data *thread_data = (struct thread_data *) arg; struct thread_data *neighbour_data = thread_data->neighbour; STARPU_PTHREAD_MUTEX_LOCK(&neighbour_data->recv_mutex); ret = (neighbour_data->recv_flag == 0); STARPU_PTHREAD_MUTEX_UNLOCK(&neighbour_data->recv_mutex); if (ret) { #ifdef DEBUG_MESSAGES FPRINTF(stderr, "Thread %u sends value %u to thread %u\n", thread_data->index, thread_data->val, neighbour_data->index); #endif starpu_data_release(thread_data->handle); } return ret; } static void send_handle_async(void *_thread_data) { struct thread_data *thread_data = (struct thread_data *) _thread_data; struct thread_data *neighbour_data = thread_data->neighbour; // FPRINTF(stderr, "send_handle_async\n"); /* send the message */ STARPU_PTHREAD_MUTEX_LOCK(&neighbour_data->recv_mutex); neighbour_data->recv_buf = thread_data->val; neighbour_data->recv_flag = 1; STARPU_PTHREAD_MUTEX_UNLOCK(&neighbour_data->recv_mutex); struct data_req *req = (struct data_req *) malloc(sizeof(struct data_req)); req->test_func = test_send_handle_async; req->test_arg = thread_data; req->next = NULL; STARPU_PTHREAD_MUTEX_LOCK(&data_req_mutex); req->next = data_req_list; data_req_list = req; STARPU_PTHREAD_COND_SIGNAL(&data_req_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&data_req_mutex); } static void *progress_func(void *arg) { STARPU_PTHREAD_MUTEX_LOCK(&data_req_mutex); progress_thread_running = 1; STARPU_PTHREAD_COND_SIGNAL(&data_req_cond); while (progress_thread_running) { struct data_req *req; if (data_req_list == NULL) STARPU_PTHREAD_COND_WAIT(&data_req_cond, &data_req_mutex); req = data_req_list; if (req) { data_req_list = req->next; req->next = NULL; STARPU_PTHREAD_MUTEX_UNLOCK(&data_req_mutex); int ret = req->test_func(req->test_arg); if (ret) { free(req); STARPU_PTHREAD_MUTEX_LOCK(&data_req_mutex); } else { /* ret = 0 : the request is not finished, we put it back at the end of the list */ STARPU_PTHREAD_MUTEX_LOCK(&data_req_mutex); struct data_req *req_aux = data_req_list; if (!req_aux) { /* The list is empty */ data_req_list = req; } else { while (req_aux) { if (req_aux->next == NULL) { req_aux->next = req; break; } req_aux = req_aux->next; } } } } } STARPU_PTHREAD_MUTEX_UNLOCK(&data_req_mutex); return NULL; } static void *thread_func(void *arg) { unsigned iter; struct thread_data *thread_data = (struct thread_data *) arg; unsigned index = thread_data->index; int ret; starpu_variable_data_register(&thread_data->handle, STARPU_MAIN_RAM, (uintptr_t)&thread_data->val, sizeof(unsigned)); for (iter = 0; iter < niter; iter++) { /* The first thread initiates the first transfer */ if (!((index == 0) && (iter == 0))) { starpu_data_acquire_cb( thread_data->handle, STARPU_W, recv_handle_async, thread_data ); } increment_handle_async(thread_data); if (!((index == (nthreads - 1)) && (iter == (niter - 1)))) { starpu_data_acquire_cb( thread_data->handle, STARPU_R, send_handle_async, thread_data ); } } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); return NULL; } #ifdef STARPU_USE_OPENCL struct starpu_opencl_program opencl_program; #endif int main(int argc, char **argv) { int ret; void *retval; #ifdef STARPU_QUICK_CHECK niter /= 16; nthreads /= 4; #endif ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_load_opencl_from_file("tests/datawizard/opencl_codelet_unsigned_inc_kernel.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif /* Create a thread to perform blocking calls */ starpu_pthread_t progress_thread; STARPU_PTHREAD_MUTEX_INIT(&data_req_mutex, NULL); STARPU_PTHREAD_COND_INIT(&data_req_cond, NULL); data_req_list = NULL; progress_thread_running = 0; unsigned t; for (t = 0; t < nthreads; t++) { problem_data[t].index = t; problem_data[t].val = 0; STARPU_PTHREAD_MUTEX_INIT(&problem_data[t].recv_mutex, NULL); problem_data[t].recv_flag = 0; problem_data[t].neighbour = &problem_data[(t+1)%nthreads]; } starpu_pthread_create(&progress_thread, NULL, progress_func, NULL); STARPU_PTHREAD_MUTEX_LOCK(&data_req_mutex); while (!progress_thread_running) STARPU_PTHREAD_COND_WAIT(&data_req_cond, &data_req_mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&data_req_mutex); for (t = 0; t < nthreads; t++) { ret = starpu_pthread_create(&problem_data[t].thread, NULL, thread_func, &problem_data[t]); STARPU_ASSERT(!ret); } for (t = 0; t < nthreads; t++) { ret = starpu_pthread_join(problem_data[t].thread, &retval); STARPU_ASSERT(!ret); STARPU_ASSERT(retval == NULL); } STARPU_PTHREAD_MUTEX_LOCK(&data_req_mutex); progress_thread_running = 0; STARPU_PTHREAD_COND_SIGNAL(&data_req_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&data_req_mutex); ret = starpu_pthread_join(progress_thread, &retval); STARPU_ASSERT(!ret); STARPU_ASSERT(retval == NULL); /* We check that the value in the "last" thread is valid */ starpu_data_handle_t last_handle = problem_data[nthreads - 1].handle; starpu_data_acquire(last_handle, STARPU_R); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); #endif ret = EXIT_SUCCESS; if (problem_data[nthreads - 1].val != (nthreads * niter)) { FPRINTF(stderr, "Final value : %u should be %u\n", problem_data[nthreads - 1].val, (nthreads * niter)); ret = EXIT_FAILURE; } starpu_data_release(last_handle); for (t = 0; t < nthreads; t++) { starpu_data_unregister(problem_data[t].handle); } starpu_shutdown(); return ret; } starpu-1.2.3+dfsg/tests/datawizard/no_unregister.c000066400000000000000000000041711320135501600222740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012, 2013, 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include "../helper.h" /* * Check that not unregistering a data is not too crashy */ void dummy_func(void ** buffers, void * args) { (void) buffers; (void) args; } static struct starpu_codelet dummy_cl = { .modes = { STARPU_RW }, .cpu_funcs = { dummy_func }, .cpu_funcs_name = { "dummy_func" }, .nbuffers = 1 }; int main(void) { int ret; int buffer[1024]; starpu_data_handle_t handle; struct starpu_task *t1,*t2; #ifdef STARPU_HAVE_VALGRIND_H if(RUNNING_ON_VALGRIND) return STARPU_TEST_SKIPPED; #endif #ifdef STARPU_SANITIZE_LEAK return STARPU_TEST_SKIPPED; #endif ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)buffer, 1024*sizeof(int)); t1 = starpu_task_create(); t2 = starpu_task_create(); t2->cl = &dummy_cl; t2->detach = 0; t2->handles[0] = handle; starpu_task_declare_deps_array(t2, 1, &t1); ret = starpu_task_submit(t2); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(t1); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(t2); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/datawizard/noreclaim.c000066400000000000000000000070541320135501600213650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Stress the memory allocation system and force StarPU to reclaim memory from * time to time. */ #if !defined(STARPU_HAVE_SETENV) #warning setenv is not defined. Skipping test int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else void dummy_func(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } static struct starpu_codelet dummy_cl = { .cpu_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .nbuffers = 1, .modes = {STARPU_W} }; static void emit_task(starpu_data_handle_t handle) { struct starpu_task *task = starpu_task_create(); int ret; task->cl = &dummy_cl; task->handles[0] = handle; ret = starpu_task_submit(task); STARPU_ASSERT(ret == 0); } static struct starpu_codelet empty_cl = { .cpu_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .nbuffers = 0, }; static void emit_empty_task(void) { struct starpu_task *task = starpu_task_create(); int ret; task->cl = &empty_cl; ret = starpu_task_submit(task); STARPU_ASSERT(ret == 0); } #define TOTAL "100" #define FILL (99*1024*1024) int main(int argc, char **argv) { int ret; struct starpu_conf conf; starpu_data_handle_t handle; void *allocated; setenv("STARPU_LIMIT_CPU_MEM", TOTAL, 1); starpu_conf_init(&conf); conf.ncpus = 1; conf.ncuda = 0; conf.nopencl = 0; conf.nmic = 0; conf.nscc = 0; ret = starpu_initialize(&conf, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); if (starpu_cpu_worker_get_count() == 0) { FPRINTF(stderr, "We need at least 1 CPU worker.\n"); starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu_variable_data_register(&handle, -1, 0, FILL); /* This makes the data allocated */ emit_task(handle); ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); ret = starpu_malloc_flags(&allocated, FILL, STARPU_MALLOC_COUNT); /* Room should be busy due to data */ STARPU_ASSERT(ret == -ENOMEM); ret = starpu_malloc_flags(&allocated, FILL, STARPU_MALLOC_COUNT|STARPU_MALLOC_NORECLAIM); /* But we should be able to tell we don't care */ STARPU_ASSERT(ret == 0); ((char*)allocated)[FILL-1] = 0; starpu_free_flags(allocated, FILL, STARPU_MALLOC_COUNT); /* Release the automatically allocated data */ starpu_data_unregister(handle); /* Memory may not be available immediately, make sure the driver has * the opportunity to release it */ emit_empty_task(); ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); emit_empty_task(); ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); ret = starpu_malloc_flags(&allocated, FILL, STARPU_MALLOC_COUNT); /* Room should now be available */ STARPU_ASSERT(ret == 0); starpu_free_flags(allocated, FILL, STARPU_MALLOC_COUNT); starpu_shutdown(); return EXIT_SUCCESS; } #endif starpu-1.2.3+dfsg/tests/datawizard/nowhere.c000066400000000000000000000070241320135501600210600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include "../helper.h" /* * Try the NOWHERE flag */ static int x, y; static void prod(void *descr[], void *_args STARPU_ATTRIBUTE_UNUSED) { int *v = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); *v = 1; } static struct starpu_codelet cl_prod = { .cpu_funcs = { prod }, .nbuffers = 1, .modes = { STARPU_W }, }; static void callback0(void *callback_arg) { STARPU_ASSERT(x==0); STARPU_ASSERT(y==0); } static void callback(void *callback_arg) { STARPU_ASSERT(x>=1); STARPU_ASSERT(y>=1); } static struct starpu_codelet cl_nowhere = { .where = STARPU_NOWHERE, .nbuffers = 2, .modes = { STARPU_R, STARPU_R }, }; static void cons(void *descr[], void *_args STARPU_ATTRIBUTE_UNUSED) { int *v = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); STARPU_ASSERT(*v == 1); *v = 2; } static struct starpu_codelet cl_cons = { .cpu_funcs = { cons }, .nbuffers = 1, .modes = { STARPU_RW }, }; int main(int argc, char **argv) { starpu_data_handle_t handle_x, handle_y; int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&handle_x, STARPU_MAIN_RAM, (uintptr_t)&x, sizeof(x)); starpu_variable_data_register(&handle_y, STARPU_MAIN_RAM, (uintptr_t)&y, sizeof(y)); ret = starpu_task_insert(&cl_nowhere, STARPU_R, handle_x, STARPU_R, handle_y, STARPU_CALLBACK, callback0, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_insert(&cl_prod, STARPU_W, handle_x, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_insert(&cl_prod, STARPU_W, handle_y, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_insert(&cl_nowhere, STARPU_R, handle_x, STARPU_R, handle_y, STARPU_CALLBACK, callback, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_insert(&cl_cons, STARPU_RW, handle_x, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_insert(&cl_cons, STARPU_RW, handle_y, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_data_unregister(handle_x); starpu_data_unregister(handle_y); starpu_shutdown(); return EXIT_SUCCESS; enodev: starpu_data_unregister(handle_x); starpu_data_unregister(handle_y); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/opencl_codelet_unsigned_inc.c000066400000000000000000000030671320135501600251200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include /* * Queue an OpenCL kernel which just increments a variable */ extern struct starpu_opencl_program opencl_program; void opencl_codelet_unsigned_inc(void *buffers[], void *args) { (void) args; int id, devid; cl_int err; cl_kernel kernel; cl_command_queue queue; cl_mem val = (cl_mem) STARPU_VARIABLE_GET_PTR(buffers[0]); id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_program, "_opencl_unsigned_inc", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 0, sizeof(val), &val); if (err) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=1; size_t local=1; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } starpu_opencl_release_kernel(kernel); } starpu-1.2.3+dfsg/tests/datawizard/opencl_codelet_unsigned_inc_kernel.cl000066400000000000000000000013041320135501600266240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ __kernel void _opencl_unsigned_inc(__global unsigned *val) { val[0]++; } starpu-1.2.3+dfsg/tests/datawizard/partition_dep.c000066400000000000000000000054041320135501600222520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2015-2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" #include "scal.h" /* * Test scaling a partitioned vector */ int main(int argc, char **argv) { unsigned *foo; starpu_data_handle_t handle; int ret; unsigned n, i, size; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_load_opencl_from_file("tests/datawizard/scal_opencl.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif n = starpu_worker_get_count(); if (n == 1) { starpu_shutdown(); return STARPU_TEST_SKIPPED; } size = 10 * n; foo = (unsigned *) calloc(size, sizeof(*foo)); for (i = 0; i < size; i++) foo[i] = i; starpu_vector_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)foo, size, sizeof(*foo)); starpu_task_insert(&scal_codelet, STARPU_RW, handle, 0); struct starpu_data_filter f = { .filter_func = starpu_vector_filter_block, .nchildren = n, }; starpu_data_partition(handle, &f); for (i = 0; i < f.nchildren; i++) { struct starpu_task *task = starpu_task_create(); task->handles[0] = starpu_data_get_sub_data(handle, 1, i); task->cl = &scal_codelet; task->execute_on_a_specific_worker = 1; task->workerid = i; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_data_unpartition(handle, STARPU_MAIN_RAM); starpu_data_unregister(handle); starpu_shutdown(); ret = EXIT_SUCCESS; for (i = 0; i < size; i++) { if (foo[i] != i*2*2) { FPRINTF(stderr,"value %u is %u instead of %u\n", i, foo[i], 2*i); ret = EXIT_FAILURE; } } free(foo); return ret; enodev: starpu_data_unregister(handle); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/partition_lazy.c000066400000000000000000000051731320135501600224640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2014, 2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" #include "scal.h" /* * Test partitioning an uninitialized vector */ struct starpu_codelet mycodelet = { .cpu_funcs = { scal_func_cpu }, #ifdef STARPU_USE_OPENCL .opencl_funcs = { scal_func_opencl }, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif #ifdef STARPU_USE_CUDA .cuda_funcs = { scal_func_cuda }, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif .cpu_funcs_name = {"scal_func_cpu"}, .modes = { STARPU_W }, .model = NULL, .nbuffers = 1 }; int main(int argc, char **argv) { unsigned *foo; starpu_data_handle_t handle; int ret; int n, size; unsigned i; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_load_opencl_from_file("tests/datawizard/scal_opencl.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif n = starpu_worker_get_count(); size = 10 * n; starpu_vector_data_register(&handle, -1, (uintptr_t)NULL, size, sizeof(*foo)); struct starpu_data_filter f = { .filter_func = starpu_vector_filter_block, .nchildren = n > 1 ? n : 2, }; starpu_data_partition(handle, &f); for (i = 0; i < f.nchildren; i++) { ret = starpu_task_insert(&mycodelet, STARPU_W, starpu_data_get_sub_data(handle, 1, i), 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_data_unpartition(handle, STARPU_MAIN_RAM); starpu_data_unregister(handle); starpu_shutdown(); return 0; enodev: starpu_data_unregister(handle); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/readers_and_writers.c000066400000000000000000000053131320135501600234360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" /* * Try mixing readers and writers on the same variable */ static unsigned book = 0; static starpu_data_handle_t book_handle; void dummy_kernel(void *descr[], void *arg) { } static struct starpu_codelet r_cl = { .cuda_funcs = {dummy_kernel}, .cpu_funcs = {dummy_kernel}, .opencl_funcs = {dummy_kernel}, .cpu_funcs_name = {"dummy_kernel"}, .nbuffers = 1, .modes = {STARPU_R} }; static struct starpu_codelet w_cl = { .cuda_funcs = {dummy_kernel}, .cpu_funcs = {dummy_kernel}, .opencl_funcs = {dummy_kernel}, .cpu_funcs_name = {"dummy_kernel"}, .nbuffers = 1, .modes = {STARPU_W} }; int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* initialize the resource */ starpu_vector_data_register(&book_handle, STARPU_MAIN_RAM, (uintptr_t)&book, 1, sizeof(unsigned)); #ifdef STARPU_QUICK_CHECK unsigned ntasks = 16; #else unsigned ntasks = 16*1024; #endif unsigned t; for (t = 0; t < ntasks; t++) { struct starpu_task *task = starpu_task_create(); task->handles[0] = book_handle; /* we randomly select either a reader or a writer (give 10 * times more chances to be a reader) */ enum starpu_data_access_mode mode = ((rand() % 10)==0)?STARPU_W:STARPU_R; if (mode == STARPU_W) task->cl = &w_cl; else task->cl = &r_cl; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_data_unregister(book_handle); starpu_shutdown(); return EXIT_SUCCESS; enodev: starpu_data_unregister(book_handle); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/readonly.c000066400000000000000000000041171320135501600212260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" /* * Try accessing a variable in read-only mode */ #ifdef STARPU_USE_OPENCL static void codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { FPRINTF(stderr, "codelet\n"); } #endif static struct starpu_codelet cl = { #ifdef STARPU_USE_OPENCL .opencl_funcs = {codelet}, #endif .nbuffers = 1, .modes = {STARPU_R} }; int main(int argc, char **argv) { int ret; int var = 42; starpu_data_handle_t handle; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); int copy = starpu_asynchronous_copy_disabled(); FPRINTF(stderr, "copy %d\n", copy); starpu_variable_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)&var, sizeof(var)); ret = starpu_task_insert(&cl, STARPU_R, handle, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); starpu_task_wait_for_all(); starpu_data_unregister(handle); starpu_shutdown(); return 0; enodev: starpu_data_unregister(handle); starpu_shutdown(); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ fprintf(stderr, "WARNING: No one can execute this task\n"); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/reclaim.c000066400000000000000000000111271320135501600210240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012, 2015-2017 Université de Bordeaux * Copyright (C) 2012, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #ifdef STARPU_HAVE_HWLOC #include #endif #include "../helper.h" #if !defined(STARPU_HAVE_SETENV) #warning setenv is not defined. Skipping test int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else /* * Stress the memory allocation system and force StarPU to reclaim memory from * time to time. */ #ifdef STARPU_QUICK_CHECK # define BLOCK_SIZE (64*1024) static unsigned ntasks = 250; #else # define BLOCK_SIZE (64*1024*1024) static unsigned ntasks = 1000; #endif #ifdef STARPU_HAVE_HWLOC static uint64_t get_total_memory_size(void) { uint64_t size; hwloc_topology_t hwtopology; hwloc_topology_init(&hwtopology); hwloc_topology_load(hwtopology); hwloc_obj_t root = hwloc_get_root_obj(hwtopology); size = root->memory.total_memory; hwloc_topology_destroy(hwtopology); return size; } #endif void dummy_func(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } static unsigned int i = 0; void f(void *arg) { printf("%u\n", ++i); } static struct starpu_codelet dummy_cl = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .nbuffers = 3, .modes = {STARPU_RW, STARPU_R, STARPU_R} }; /* Number of chunks */ static unsigned mb = 16; int main(int argc, char **argv) { unsigned j, taskid; int ret; #ifdef STARPU_HAVE_HWLOC /* We allocate 50% of the memory */ uint64_t total_size = get_total_memory_size(); /* On x86_64-freebsd8.2, hwloc 1.3 returns 0 as the total memory * size, so sanity-check what we have. */ if (total_size > 0) mb = (int)((0.50 * total_size)/(BLOCK_SIZE)); #endif setenv("STARPU_LIMIT_OPENCL_MEM", "1000", 1); ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* An optional argument indicates the number of MB to allocate */ if (argc > 1) mb = atoi(argv[1]); if (2*mb > ntasks) ntasks = 2*mb; #ifdef STARPU_QUICK_CHECK mb /= 100; if (mb == 0) mb = 1; #endif FPRINTF(stderr, "Allocate %u buffers of size %d and create %u tasks\n", mb, BLOCK_SIZE, ntasks); float **host_ptr_array; starpu_data_handle_t *handle_array; host_ptr_array = calloc(mb, sizeof(float *)); STARPU_ASSERT(host_ptr_array); handle_array = calloc(mb, sizeof(starpu_data_handle_t)); STARPU_ASSERT(handle_array); /* Register mb buffers of 1MB */ for (j = 0; j < mb; j++) { size_t size = starpu_lrand48()%BLOCK_SIZE + 1; host_ptr_array[j] = calloc(size, 1); if (host_ptr_array[j] == NULL) { mb = j; FPRINTF(stderr, "Cannot allocate more than %u buffers\n", mb); break; } starpu_variable_data_register(&handle_array[j], STARPU_MAIN_RAM, (uintptr_t)host_ptr_array[j], size); STARPU_ASSERT(handle_array[j]); } for (taskid = 0; taskid < ntasks; taskid++) { struct starpu_task *task = starpu_task_create(); task->cl = &dummy_cl; task->handles[0] = handle_array[taskid%mb]; task->handles[1] = handle_array[(taskid+1)%mb]; task->handles[2] = handle_array[(taskid+2)%mb]; task->callback_func = f; task->callback_arg = NULL; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } for (j = 0; j < mb; j++) { if ( j%20 == 0 ) starpu_data_unregister_submit(handle_array[j]); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); for (j = 0; j < mb; j++) { if ( j%20 != 0 ) starpu_data_unregister(handle_array[j]); free(host_ptr_array[j]); } free(host_ptr_array); free(handle_array); starpu_shutdown(); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } #endif starpu-1.2.3+dfsg/tests/datawizard/redux_acquire.c000066400000000000000000000047261320135501600222570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "helper.h" void init_cpu_func(void *descr[], void *cl_arg) { long int *dot = (long int *)STARPU_VARIABLE_GET_PTR(descr[0]); *dot = 42; } void redux_cpu_func(void *descr[], void *cl_arg) { long int *dota = (long int *)STARPU_VARIABLE_GET_PTR(descr[0]); long int *dotb = (long int *)STARPU_VARIABLE_GET_PTR(descr[1]); *dota = *dota + *dotb; } static struct starpu_codelet init_codelet = { .cpu_funcs = {init_cpu_func}, .nbuffers = 1, .modes = {STARPU_W}, .name = "init_codelet" }; static struct starpu_codelet redux_codelet = { .cpu_funcs = {redux_cpu_func}, .modes = {STARPU_RW, STARPU_R}, .nbuffers = 2, .name = "redux_codelet" }; static void check_dot(void *dot_handle) { long int *x = starpu_data_get_local_ptr(dot_handle); STARPU_ASSERT_MSG(*x == 42, "Incorrect value %ld", *x); starpu_data_release(dot_handle); } int main(int argc, char **argv) { starpu_data_handle_t dot_handle; int ret = starpu_init(NULL); if (ret == -ENODEV) goto skip; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); if (starpu_cpu_worker_get_count() == 0) goto enodev; starpu_variable_data_register(&dot_handle, -1, (uintptr_t)NULL, sizeof(long int)); starpu_data_set_reduction_methods(dot_handle, &redux_codelet, &init_codelet); starpu_data_acquire(dot_handle, STARPU_R); long int *x = starpu_data_get_local_ptr(dot_handle); STARPU_ASSERT_MSG(*x == 42, "Incorrect value %ld", *x); starpu_data_release(dot_handle); starpu_data_unregister(dot_handle); starpu_variable_data_register(&dot_handle, -1, (uintptr_t)NULL, sizeof(long int)); starpu_data_set_reduction_methods(dot_handle, &redux_codelet, &init_codelet); starpu_data_acquire_cb(dot_handle, STARPU_R, check_dot, dot_handle); starpu_data_unregister(dot_handle); starpu_shutdown(); return 0; enodev: starpu_shutdown(); skip: return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/scal.c000066400000000000000000000056421320135501600203370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2014, 2016 Université de Bordeaux * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "scal.h" #include "helper.h" /* * Implement a kernel that just multiplies a vector by 2 */ void scal_func_cpu(void *buffers[], void *cl_arg) { unsigned i; struct starpu_vector_interface *vector = (struct starpu_vector_interface *) buffers[0]; unsigned *val = (unsigned *) STARPU_VECTOR_GET_PTR(vector); unsigned n = STARPU_VECTOR_GET_NX(vector); /* scale the vector */ for (i = 0; i < n; i++) val[i] *= 2; } #ifdef STARPU_USE_OPENCL struct starpu_opencl_program opencl_program; void scal_func_opencl(void *buffers[], void *_args) { int id, devid; cl_int err; cl_kernel kernel; cl_command_queue queue; unsigned n = STARPU_VECTOR_GET_NX(buffers[0]); cl_mem val = (cl_mem)STARPU_VECTOR_GET_DEV_HANDLE(buffers[0]); unsigned offset = STARPU_VECTOR_GET_OFFSET(buffers[0]); id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_program, "vector_mult_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 0, sizeof(val), &val); err |= clSetKernelArg(kernel, 1, sizeof(offset), &offset); err |= clSetKernelArg(kernel, 2, sizeof(n), &n); if (err) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=n; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local=global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } starpu_opencl_release_kernel(kernel); } #endif struct starpu_codelet scal_codelet = { .cpu_funcs = { scal_func_cpu }, #ifdef STARPU_USE_OPENCL .opencl_funcs = { scal_func_opencl }, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif #ifdef STARPU_USE_CUDA .cuda_funcs = { scal_func_cuda }, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif .cpu_funcs_name = {"scal_func_cpu"}, .modes = { STARPU_RW }, .model = NULL, .nbuffers = 1 }; starpu-1.2.3+dfsg/tests/datawizard/scal.h000066400000000000000000000017371320135501600203450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include extern struct starpu_codelet scal_codelet; extern struct starpu_opencl_program opencl_program; void scal_func_cpu(void *buffers[], void *cl_arg); #ifdef STARPU_USE_CUDA void scal_func_cuda(void *buffers[], void *cl_arg); #endif #ifdef STARPU_USE_OPENCL void scal_func_opencl(void *buffers[], void *_args); #endif starpu-1.2.3+dfsg/tests/datawizard/scal_cuda.cu000066400000000000000000000024101320135501600215060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012 CNRS * Copyright (C) 2010-2011, 2014 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include static __global__ void vector_mult_cuda(unsigned *val, unsigned n) { unsigned i = blockIdx.x*blockDim.x + threadIdx.x; if (i < n) val[i] *= 2; } extern "C" void scal_func_cuda(void *buffers[], void *_args) { unsigned n = STARPU_VECTOR_GET_NX(buffers[0]); unsigned *val = (unsigned *)STARPU_VECTOR_GET_PTR(buffers[0]); unsigned threads_per_block = 64; unsigned nblocks = (n + threads_per_block-1) / threads_per_block; vector_mult_cuda<<>>(val, n); } starpu-1.2.3+dfsg/tests/datawizard/scal_opencl.cl000066400000000000000000000016371320135501600220530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012 CNRS * Copyright (C) 2011, 2017 Université Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ __kernel void vector_mult_opencl(__global unsigned* val, unsigned offset, unsigned nx) { const int i = get_global_id(0); val = (__global char*) val + offset; if (i < nx) { val[i] *= 2; } } starpu-1.2.3+dfsg/tests/datawizard/scratch.c000066400000000000000000000103041320135501600210330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include "../helper.h" /* * Test using a scratch data, using it just for temporary storage */ #ifdef STARPU_QUICK_CHECK # define NLOOPS 8 # define VECTORSIZE 128 #else # define NLOOPS 128 # define VECTORSIZE 1024 #endif static unsigned *A; starpu_data_handle_t A_handle, B_handle; //static unsigned var = 0; #ifdef STARPU_USE_CUDA extern void cuda_f(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); #endif #ifdef STARPU_USE_OPENCL extern void opencl_f(void *buffers[], void *args); #endif void cpu_f(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; unsigned *v = (unsigned *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned *tmp = (unsigned *)STARPU_VECTOR_GET_PTR(descr[1]); unsigned nx = STARPU_VECTOR_GET_NX(descr[0]); size_t elemsize = STARPU_VECTOR_GET_ELEMSIZE(descr[0]); memcpy(tmp, v, nx*elemsize); unsigned i; for (i = 0; i < nx; i++) { v[i] = tmp[i] + 1; } } static struct starpu_codelet cl_f = { .cpu_funcs = {cpu_f}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_f}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_f}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs_name = {"cpu_f"}, .nbuffers = 2, .modes = {STARPU_RW, STARPU_SCRATCH} }; #ifdef STARPU_USE_OPENCL struct starpu_opencl_program opencl_program; #endif int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_load_opencl_from_file("tests/datawizard/scratch_opencl_kernel.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif A = (unsigned *) calloc(VECTORSIZE, sizeof(unsigned)); starpu_vector_data_register(&A_handle, STARPU_MAIN_RAM, (uintptr_t)A, VECTORSIZE, sizeof(unsigned)); starpu_vector_data_register(&B_handle, -1, (uintptr_t)NULL, VECTORSIZE, sizeof(unsigned)); unsigned loop; for (loop = 0; loop < NLOOPS; loop++) { struct starpu_task *task_f = starpu_task_create(); task_f->cl = &cl_f; task_f->handles[0] = A_handle; task_f->handles[1] = B_handle; ret = starpu_task_submit(task_f); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_data_unregister(A_handle); starpu_data_unregister(B_handle); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); #endif starpu_shutdown(); /* Check result */ unsigned i; ret = EXIT_SUCCESS; for (i = 0; i < VECTORSIZE; i++) { if (A[i] != NLOOPS) { FPRINTF(stderr, "Error: Incorrect value A[%u] = %u != %d\n", i, A[i], NLOOPS); ret = EXIT_FAILURE; break; } } free(A); STARPU_RETURN(ret); enodev: starpu_data_unregister(A_handle); starpu_data_unregister(B_handle); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); #endif starpu_shutdown(); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ fprintf(stderr, "WARNING: No one can execute this task\n"); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/scratch_cuda.cu000066400000000000000000000031721320135501600222210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2014, 2017 Université de Bordeaux * Copyright (C) 2010, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #define MAXNBLOCKS 32 #define MAXTHREADSPERBLOCK 128 static __global__ void increment_vector(unsigned *v, unsigned *tmp, int nx) { const int tid = threadIdx.x + blockIdx.x*blockDim.x; const int nthreads = gridDim.x * blockDim.x; int i; for (i = tid; i < nx; i += nthreads) { v[i] = tmp[i] + 1; } } extern "C" void cuda_f(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { unsigned *v = (unsigned *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned *tmp = (unsigned *)STARPU_VECTOR_GET_PTR(descr[1]); unsigned nx = STARPU_VECTOR_GET_NX(descr[0]); size_t elemsize = STARPU_VECTOR_GET_ELEMSIZE(descr[0]); cudaMemcpyAsync(tmp, v, nx*elemsize, cudaMemcpyDeviceToDevice, starpu_cuda_get_local_stream()); unsigned nblocks = 128; unsigned nthread_per_block = STARPU_MIN(MAXTHREADSPERBLOCK, (nx / nblocks)); increment_vector<<>>(v, tmp, nx); } starpu-1.2.3+dfsg/tests/datawizard/scratch_opencl.c000066400000000000000000000047231320135501600224030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include /* * Queue an OpenCL kernel for the scratch test. */ extern struct starpu_opencl_program opencl_program; void opencl_f(void *buffers[], void *args) { (void) args; int id, devid; cl_int err; cl_kernel kernel; cl_command_queue queue; unsigned n = STARPU_VECTOR_GET_NX(buffers[0]); unsigned elemsize = STARPU_VECTOR_GET_ELEMSIZE(buffers[0]); cl_mem val = (cl_mem) STARPU_VECTOR_GET_DEV_HANDLE(buffers[0]); cl_mem tmp = (cl_mem) STARPU_VECTOR_GET_DEV_HANDLE(buffers[1]); id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_program, "increment_vector_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clEnqueueCopyBuffer(queue, val, tmp, 0, /* offset in val */ 0, /* offset in tmp */ n * elemsize, 0, /* num_events_in_wait_list */ NULL, /* event_wait_list */ NULL); /* event */ if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 0, sizeof(val), &val); err|= clSetKernelArg(kernel, 1, sizeof(tmp), &tmp); err|= clSetKernelArg(kernel, 2, sizeof(n), &n); if (err) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=n; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local=global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } starpu_opencl_release_kernel(kernel); } starpu-1.2.3+dfsg/tests/datawizard/scratch_opencl_kernel.cl000066400000000000000000000015061320135501600241130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ __kernel void increment_vector_opencl(__global unsigned *val, __global unsigned *tmp, unsigned nx) { const int id = get_global_id(0); if (id < nx) val[id] = tmp[id] + 1; } starpu-1.2.3+dfsg/tests/datawizard/simgrid-locality.c000066400000000000000000000017331320135501600226660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2017 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Check that defining a main makes starpu use MSG_process_attach. */ #include "locality.c" #include #if defined(HAVE_MSG_PROCESS_ATTACH) && SIMGRID_VERSION_MAJOR > 3 || (SIMGRID_VERSION_MAJOR == 3 && SIMGRID_VERSION_MINOR >= 15) #undef main int main(int argc, char *argv[]) { return starpu_main(argc, argv); } #endif starpu-1.2.3+dfsg/tests/datawizard/specific_node.c000066400000000000000000000076061320135501600222110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2014, 2016 Université de Bordeaux * Copyright (C) 2012, 2013, 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include "../helper.h" /* * Test using the specific_nodes field by forcing the data to main memory * even if the task is run on a GPU (and actually doing the computation from * the CPU driving the GPU). It mixes such accesses and normal accesses from * the GPU */ starpu_data_handle_t data_handle; unsigned data; void specific_kernel(STARPU_ATTRIBUTE_UNUSED void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { /* We do not protect this variable because it is only accessed when the * "data_handle" piece of data is accessed. */ unsigned *dataptr = (unsigned*) STARPU_VARIABLE_GET_PTR(descr[0]); STARPU_ASSERT(dataptr == &data); (*dataptr)++; } static struct starpu_codelet specific_cl = { .cpu_funcs = {specific_kernel}, .cuda_funcs = {specific_kernel}, .opencl_funcs = {specific_kernel}, .nbuffers = 1, .modes = {STARPU_RW}, .specific_nodes = 1, .nodes = {STARPU_MAIN_RAM}, }; #ifdef STARPU_USE_CUDA void cuda_codelet_unsigned_inc(void *descr[], STARPU_ATTRIBUTE_UNUSED void *cl_arg); #endif #ifdef STARPU_USE_OPENCL void opencl_codelet_unsigned_inc(void *buffers[], void *args); #endif static struct starpu_codelet cl = { .cpu_funcs = {specific_kernel}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_codelet_unsigned_inc}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_codelet_unsigned_inc}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .nbuffers = 1, .modes = {STARPU_RW}, }; #ifdef STARPU_USE_OPENCL struct starpu_opencl_program opencl_program; #endif int main(STARPU_ATTRIBUTE_UNUSED int argc, STARPU_ATTRIBUTE_UNUSED char **argv) { #ifdef STARPU_QUICK_CHECK unsigned ntasks = 10; #else unsigned ntasks = 1000; #endif int ret, ret2; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_load_opencl_from_file("tests/datawizard/opencl_codelet_unsigned_inc_kernel.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif data = 0; /* Create a void data which will be used as an exclusion mechanism. */ starpu_variable_data_register(&data_handle, STARPU_MAIN_RAM, (uintptr_t) &data, sizeof(data)); unsigned i; for (i = 0; i < ntasks; i++) { struct starpu_task *task = starpu_task_create(); if (i%2) task->cl = &specific_cl; else task->cl = &cl; task->handles[0] = data_handle; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_data_unregister(data_handle); ret = (data == ntasks) ? EXIT_SUCCESS : EXIT_FAILURE; #ifdef STARPU_USE_OPENCL ret2 = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret2, "starpu_opencl_unload_opencl"); #endif starpu_shutdown(); return ret; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/sync_and_notify_data.c000066400000000000000000000122061320135501600235660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include "../helper.h" /* * Mix synchronous tasks and data acquisitions */ #define N_DEF 100 #define K_DEF 256 static unsigned n=N_DEF; static unsigned k=K_DEF; /* * In this test, we maintain a vector v = (a,b,c). * * Each iteration consists of: * - increment a n times * - sync v in ram * - incrementer b * - notify the modification of v * - incrementer c n times * - sync v * * At the end, we have to make sure that if we did k iterations, * v == (kn, k, kn) */ #ifdef STARPU_USE_CUDA void cuda_codelet_incA(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); void cuda_codelet_incC(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); #endif #ifdef STARPU_USE_OPENCL void opencl_codelet_incA(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); void opencl_codelet_incC(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); struct starpu_opencl_program opencl_code; #endif #define VECTORSIZE 16 starpu_data_handle_t v_handle; static unsigned v[VECTORSIZE] STARPU_ATTRIBUTE_ALIGNED(128) = {0, 0, 0, 0}; void cpu_codelet_incA(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { unsigned *val = (unsigned *)STARPU_VECTOR_GET_PTR(descr[0]); val[0]++; } void cpu_codelet_incC(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { unsigned *val = (unsigned *)STARPU_VECTOR_GET_PTR(descr[0]); val[2]++; } int main(int argc, char **argv) { int ret; #ifdef STARPU_QUICK_CHECK n /= 10; #endif #ifndef STARPU_LONG_CHECK k /= 16; #endif ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_load_opencl_from_file("tests/datawizard/sync_and_notify_data_opencl_codelet.cl", &opencl_code, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif starpu_vector_data_register(&v_handle, STARPU_MAIN_RAM, (uintptr_t)v, VECTORSIZE, sizeof(unsigned)); unsigned iter; for (iter = 0; iter < k; iter++) { unsigned ind; for (ind = 0; ind < n; ind++) { /* increment a = v[0] */ struct starpu_codelet cl_inc_a = { .cpu_funcs = {cpu_codelet_incA}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_codelet_incA}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_codelet_incA}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs_name = {"cpu_codelet_incA"}, .nbuffers = 1, .modes = {STARPU_RW} }; struct starpu_task *task = starpu_task_create(); task->cl = &cl_inc_a; task->handles[0] = v_handle; task->synchronous = 1; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } /* synchronize v in RAM */ ret = starpu_data_acquire(v_handle, STARPU_RW); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire"); /* increment b */ v[1]++; starpu_data_release(v_handle); for (ind = 0; ind < n; ind++) { /* increment c = v[2] */ struct starpu_codelet cl_inc_c = { .cpu_funcs = {cpu_codelet_incC}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_codelet_incC}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_codelet_incC}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs_name = {"cpu_codelet_incC"}, .nbuffers = 1, .modes = {STARPU_RW} }; struct starpu_task *task = starpu_task_create(); task->cl = &cl_inc_c; task->handles[0] = v_handle; task->synchronous = 1; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } ret = starpu_data_acquire(v_handle, STARPU_RW); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire"); FPRINTF(stderr, "V = {%u, %u, %u}\n", v[0], v[1], v[2]); starpu_data_release(v_handle); starpu_data_unregister(v_handle); starpu_shutdown(); if ((v[0] != n*k) || (v[1] != k) || (v[2] != n*k)) { FPRINTF(stderr, "Incorrect result\n"); return EXIT_FAILURE; } return EXIT_SUCCESS; enodev: starpu_data_unregister(v_handle); starpu_shutdown(); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ STARPU_RETURN(STARPU_TEST_SKIPPED); } starpu-1.2.3+dfsg/tests/datawizard/sync_and_notify_data_implicit.c000066400000000000000000000120001320135501600254500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2013-2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include "../helper.h" /* * Mix tasks with implicit dependencies and data acquisitions */ #define N_DEF 100 #define K_DEF 256 static unsigned n=N_DEF; static unsigned k=K_DEF; /* * In this test, we maintain a vector v = (a,b,c). * * Each iteration consists of: * - increment a n times * - sync v in ram * - incrementer b * - notify the modification of v * - incrementer c n times * - sync v * * At the end, we have to make sure that if we did k iterations, * v == (kn, k, kn) */ #ifdef STARPU_USE_CUDA void cuda_codelet_incA(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); void cuda_codelet_incC(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); #endif #ifdef STARPU_USE_OPENCL void opencl_codelet_incA(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); void opencl_codelet_incC(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); struct starpu_opencl_program opencl_code; #endif #define VECTORSIZE 16 starpu_data_handle_t v_handle; static unsigned v[VECTORSIZE] STARPU_ATTRIBUTE_ALIGNED(128) = {0, 0, 0, 0}; void cpu_codelet_incA(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { unsigned *val = (unsigned *)STARPU_VECTOR_GET_PTR(descr[0]); val[0]++; } void cpu_codelet_incC(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { unsigned *val = (unsigned *)STARPU_VECTOR_GET_PTR(descr[0]); val[2]++; } /* increment a = v[0] */ static struct starpu_codelet cl_inc_a = { .cpu_funcs = {cpu_codelet_incA}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_codelet_incA}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_codelet_incA}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs_name = {"cpu_codelet_incA"}, .nbuffers = 1, .modes = {STARPU_RW} }; /* increment c = v[2] */ struct starpu_codelet cl_inc_c = { .cpu_funcs = {cpu_codelet_incC}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_codelet_incC}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_codelet_incC}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs_name = {"cpu_codelet_incC"}, .nbuffers = 1, .modes = {STARPU_RW} }; int main(int argc, char **argv) { int ret; #ifdef STARPU_QUICK_CHECK n /= 10; #endif #ifndef STARPU_LONG_CHECK k /= 8; #endif ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_load_opencl_from_file("tests/datawizard/sync_and_notify_data_opencl_codelet.cl", &opencl_code, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif starpu_vector_data_register(&v_handle, STARPU_MAIN_RAM, (uintptr_t)v, VECTORSIZE, sizeof(unsigned)); unsigned iter; for (iter = 0; iter < k; iter++) { unsigned ind; for (ind = 0; ind < n; ind++) { struct starpu_task *task = starpu_task_create(); task->cl = &cl_inc_a; task->handles[0] = v_handle; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } /* synchronize v in RAM */ ret = starpu_data_acquire(v_handle, STARPU_RW); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire"); /* increment b */ v[1]++; starpu_data_release(v_handle); for (ind = 0; ind < n; ind++) { struct starpu_task *task = starpu_task_create(); task->cl = &cl_inc_c; task->handles[0] = v_handle; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } ret = starpu_data_acquire(v_handle, STARPU_RW); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire"); FPRINTF(stderr, "V = {%u, %u, %u}\n", v[0], v[1], v[2]); starpu_data_release(v_handle); starpu_data_unregister(v_handle); starpu_shutdown(); ret = EXIT_SUCCESS; if ((v[0] != n*k) || (v[1] != k) || (v[2] != n*k)) { FPRINTF(stderr, "Incorrect result\n"); ret = EXIT_FAILURE; } return ret; enodev: starpu_data_unregister(v_handle); starpu_shutdown(); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/sync_and_notify_data_kernels.cu000066400000000000000000000024631320135501600255020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2014 Université de Bordeaux * Copyright (C) 2010, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include /* * increment a (val[0]) */ extern "C" __global__ void _cuda_incA(unsigned *v) { v[0]++; } extern "C" void cuda_codelet_incA(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { unsigned *v = (unsigned *)STARPU_VECTOR_GET_PTR(descr[0]); _cuda_incA<<<1,1, 0, starpu_cuda_get_local_stream()>>>(v); } /* * increment c (val[2]) */ extern "C" __global__ void _cuda_incC(unsigned *v) { v[2]++; } extern "C" void cuda_codelet_incC(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { unsigned *v = (unsigned *)STARPU_VECTOR_GET_PTR(descr[0]); _cuda_incC<<<1,1, 0, starpu_cuda_get_local_stream()>>>(v); } starpu-1.2.3+dfsg/tests/datawizard/sync_and_notify_data_opencl.c000066400000000000000000000046011320135501600251260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012, 2016 CNRS * Copyright (C) 2011, 2014, 2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Queue kernels which just increment the vector */ extern struct starpu_opencl_program opencl_code; void opencl_codelet_incA(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; cl_mem val = (cl_mem)STARPU_VECTOR_GET_DEV_HANDLE(descr[0]); cl_kernel kernel; cl_command_queue queue; int id, devid, err; id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_code, "incA", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 0, sizeof(val), &val); if (err) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=100; size_t local=100; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } starpu_opencl_release_kernel(kernel); } void opencl_codelet_incC(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; cl_mem val = (cl_mem)STARPU_VECTOR_GET_DEV_HANDLE(descr[0]); cl_kernel kernel; cl_command_queue queue; int id, devid, err; id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_code, "incC", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 0, sizeof(val), &val); if (err) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=100; size_t local=100; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } starpu_opencl_release_kernel(kernel); } starpu-1.2.3+dfsg/tests/datawizard/sync_and_notify_data_opencl_codelet.cl000066400000000000000000000015321320135501600270010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ __kernel void incA(__global unsigned* input) { const int i = get_global_id(0); if (i == 0) input[i] ++; } __kernel void incC(__global unsigned* input) { const int i = get_global_id(0); if (i == 2) input[i] ++; } starpu-1.2.3+dfsg/tests/datawizard/sync_with_data_with_mem.c000066400000000000000000000066641320135501600243130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include "../helper.h" /* * Mix submitting tasks and synchronously acquiring the corresponding data. */ #define NBUFFERS_DEF 64 #define NITER_DEF 128 #define VECTORSIZE_DEF 1024 static int nbuffers = NBUFFERS_DEF; static int niter = NITER_DEF; static int vectorsize = VECTORSIZE_DEF; float *buffer[NBUFFERS_DEF]; starpu_data_handle_t v_handle[NBUFFERS_DEF]; void dummy_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } static struct starpu_codelet cl = { .modes = { STARPU_RW }, .cpu_funcs = {dummy_codelet}, #ifdef STARPU_USE_CUDA .cuda_funcs = {dummy_codelet}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {dummy_codelet}, #endif .cpu_funcs_name = {"dummy_codelet"}, .nbuffers = 1 }; static int use_handle(starpu_data_handle_t handle) { int ret; struct starpu_task *task; task = starpu_task_create(); task->cl = &cl; task->handles[0] = handle; ret = starpu_task_submit(task); return ret; } int main(int argc, char **argv) { int ret; #ifdef STARPU_QUICK_CHECK nbuffers /= 4; niter /= 4; vectorsize /= 8; #endif ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* Allocate all buffers and register them to StarPU */ int b; for (b = 0; b < nbuffers; b++) { ret = starpu_malloc((void **)&buffer[b], vectorsize); STARPU_CHECK_RETURN_VALUE(ret, "starpu_malloc"); starpu_vector_data_register(&v_handle[b], STARPU_MAIN_RAM, (uintptr_t)buffer[b], vectorsize, sizeof(char)); } int iter; for (iter = 0; iter < niter; iter++) { /* Use the buffers on the different workers so that it may not * be in main memory anymore */ for (b = 0; b < nbuffers; b++) { ret = use_handle(v_handle[b]); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); /* Grab the different pieces of data into main memory */ for (b = 0; b < nbuffers; b++) { ret = starpu_data_acquire(v_handle[b], STARPU_RW); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire"); } /* Release them */ for (b = 0; b < nbuffers; b++) starpu_data_release(v_handle[b]); } /* do some cleanup */ for (b = 0; b < nbuffers; b++) { starpu_data_unregister(v_handle[b]); starpu_free(buffer[b]); } starpu_shutdown(); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/sync_with_data_with_mem_non_blocking.c000066400000000000000000000104411320135501600270210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include "../helper.h" #include /* * Mix submitting tasks and asynchronously acquiring the corresponding data. */ #define NBUFFERS_DEF 64 #define NITER_DEF 128 #define VECTORSIZE_DEF 1024 static unsigned nbuffers = NBUFFERS_DEF; static unsigned niter = NITER_DEF; static unsigned vectorsize = VECTORSIZE_DEF; float *buffer[NBUFFERS_DEF]; starpu_data_handle_t v_handle[NBUFFERS_DEF]; void dummy_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } static struct starpu_codelet cl = { .modes = { STARPU_RW }, .cpu_funcs = {dummy_codelet}, #ifdef STARPU_USE_CUDA .cuda_funcs = {dummy_codelet}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {dummy_codelet}, #endif .cpu_funcs_name = {"dummy_codelet"}, .nbuffers = 1 }; static int use_handle(starpu_data_handle_t handle) { int ret; struct starpu_task *task; task = starpu_task_create(); task->cl = &cl; task->handles[0] = handle; ret = starpu_task_submit(task); return ret; } static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static starpu_pthread_cond_t cond = STARPU_PTHREAD_COND_INITIALIZER; static unsigned n_synced_buffers; static void callback_sync_data(void *arg STARPU_ATTRIBUTE_UNUSED) { STARPU_PTHREAD_MUTEX_LOCK(&mutex); n_synced_buffers++; if (n_synced_buffers == nbuffers) STARPU_PTHREAD_COND_SIGNAL(&cond); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } int main(int argc, char **argv) { int ret; #ifdef STARPU_QUICK_CHECK nbuffers /= 4; niter /= 4; vectorsize /= 8; #endif ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* Allocate all buffers and register them to StarPU */ unsigned b; for (b = 0; b < nbuffers; b++) { ret = starpu_malloc((void **)&buffer[b], vectorsize); STARPU_CHECK_RETURN_VALUE(ret, "starpu_malloc"); starpu_vector_data_register(&v_handle[b], STARPU_MAIN_RAM, (uintptr_t)buffer[b], vectorsize, sizeof(char)); starpu_data_set_sequential_consistency_flag(v_handle[b], 0); } unsigned iter; for (iter = 0; iter < niter; iter++) { /* Use the buffers on the different workers so that it may not * be in main memory anymore */ for (b = 0; b < nbuffers; b++) { ret = use_handle(v_handle[b]); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); STARPU_PTHREAD_MUTEX_LOCK(&mutex); n_synced_buffers = 0; STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); /* Grab the different pieces of data into main memory */ for (b = 0; b < nbuffers; b++) { ret = starpu_data_acquire_cb(v_handle[b], STARPU_RW, callback_sync_data, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire_cb"); } /* Wait for all buffers to be available */ STARPU_PTHREAD_MUTEX_LOCK(&mutex); while (n_synced_buffers != nbuffers) STARPU_PTHREAD_COND_WAIT(&cond, &mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); /* Release them */ for (b = 0; b < nbuffers; b++) starpu_data_release(v_handle[b]); } /* do some cleanup */ for (b = 0; b < nbuffers; b++) { starpu_data_unregister(v_handle[b]); starpu_free(buffer[b]); } starpu_shutdown(); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/sync_with_data_with_mem_non_blocking_implicit.c000066400000000000000000000104361320135501600307170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include "../helper.h" #include /* * Mix submitting tasks and asynchronously acquiring the corresponding * data, but without implicit dependencies. */ #define NBUFFERS_DEF 64 #define NITER_DEF 128 #define VECTORSIZE_DEF 1024 static unsigned nbuffers = NBUFFERS_DEF; static unsigned niter = NITER_DEF; static unsigned vectorsize = VECTORSIZE_DEF; float *buffer[NBUFFERS_DEF]; starpu_data_handle_t v_handle[NBUFFERS_DEF]; void dummy_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } static struct starpu_codelet cl = { .modes = { STARPU_RW }, .cpu_funcs = {dummy_codelet}, #ifdef STARPU_USE_CUDA .cuda_funcs = {dummy_codelet}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {dummy_codelet}, #endif .cpu_funcs_name = {"dummy_codelet"}, .nbuffers = 1 }; static int use_handle(starpu_data_handle_t handle) { int ret; struct starpu_task *task; task = starpu_task_create(); task->cl = &cl; task->handles[0] = handle; ret = starpu_task_submit(task); return ret; } static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static starpu_pthread_cond_t cond = STARPU_PTHREAD_COND_INITIALIZER; static unsigned n_synced_buffers; static void callback_sync_data(void *arg STARPU_ATTRIBUTE_UNUSED) { STARPU_PTHREAD_MUTEX_LOCK(&mutex); n_synced_buffers++; if (n_synced_buffers == nbuffers) STARPU_PTHREAD_COND_SIGNAL(&cond); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } int main(int argc, char **argv) { int ret; #ifdef STARPU_QUICK_CHECK nbuffers /= 4; niter /= 4; vectorsize /= 8; #endif ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* Allocate all buffers and register them to StarPU */ unsigned b; for (b = 0; b < nbuffers; b++) { ret = starpu_malloc((void **)&buffer[b], vectorsize); STARPU_CHECK_RETURN_VALUE(ret, "starpu_malloc"); starpu_vector_data_register(&v_handle[b], STARPU_MAIN_RAM, (uintptr_t)buffer[b], vectorsize, sizeof(char)); } unsigned iter; for (iter = 0; iter < niter; iter++) { /* Use the buffers on the different workers so that it may not * be in main memory anymore */ for (b = 0; b < nbuffers; b++) { ret = use_handle(v_handle[b]); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } STARPU_PTHREAD_MUTEX_LOCK(&mutex); n_synced_buffers = 0; STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); /* Grab the different pieces of data into main memory */ for (b = 0; b < nbuffers; b++) { ret = starpu_data_acquire_cb(v_handle[b], STARPU_RW, callback_sync_data, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire_cb"); } starpu_do_schedule(); /* Wait for all buffers to be available */ STARPU_PTHREAD_MUTEX_LOCK(&mutex); while (n_synced_buffers != nbuffers) STARPU_PTHREAD_COND_WAIT(&cond, &mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); /* Release them */ for (b = 0; b < nbuffers; b++) starpu_data_release(v_handle[b]); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); /* do some cleanup */ for (b = 0; b < nbuffers; b++) { starpu_data_unregister(v_handle[b]); starpu_free(buffer[b]); } starpu_shutdown(); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/task_with_multiple_time_the_same_handle.c000066400000000000000000000046711320135501600275240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" /* * Test passing the same handle several times to the same task */ void sum_cpu(void * descr[], void *cl_arg) { double * v_dst = (double *) STARPU_VARIABLE_GET_PTR(descr[0]); double * v_src = (double *) STARPU_VARIABLE_GET_PTR(descr[1]); *v_dst+=*v_src; } void sum3_cpu(void * descr[], void *cl_arg) { double * v_src1 = (double *) STARPU_VARIABLE_GET_PTR(descr[1]); double * v_src2 = (double *) STARPU_VARIABLE_GET_PTR(descr[1]); double * v_dst = (double *) STARPU_VARIABLE_GET_PTR(descr[0]); *v_dst+=*v_src1+*v_src2; } static struct starpu_codelet sum_cl = { .cpu_funcs = {sum_cpu}, .cpu_funcs_name = {"sum_cpu"}, .nbuffers = 2, .modes={STARPU_RW,STARPU_R} }; static struct starpu_codelet sum3_cl = { .cpu_funcs = {sum3_cpu}, .cpu_funcs_name = {"sum3_cpu"}, .nbuffers = 3, .modes={STARPU_R,STARPU_R,STARPU_RW} }; int main(int argc, char * argv[]) { starpu_data_handle_t handle; int ret = 0; double value=1.0; int i; ret=starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; starpu_variable_data_register(&handle,0,(uintptr_t)&value,sizeof(double)); for (i=0; i<2; i++) { ret = starpu_task_insert(&sum_cl, STARPU_RW, handle, STARPU_R, handle, 0); if (ret == -ENODEV) goto enodev; ret = starpu_task_insert(&sum3_cl, STARPU_R, handle, STARPU_R, handle, STARPU_RW, handle, 0); if (ret == -ENODEV) goto enodev; } starpu_task_wait_for_all(); starpu_data_unregister(handle); if (value != 36) { FPRINTF(stderr, "value is %f instead of %f\n", value, 36.); ret = EXIT_FAILURE; } starpu_shutdown(); return ret; enodev: starpu_data_unregister(handle); starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/temporary_partition.c000066400000000000000000000052321320135501600235230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" #define SIZE (1<<20) #define NPARTS 16 /* * Test asynchronous partitioning on a temporary data. */ static void codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } static struct starpu_codelet clw = { .where = STARPU_CPU, .cpu_funcs = {codelet}, .nbuffers = 1, .modes = {STARPU_W} }; static struct starpu_codelet clr = { .where = STARPU_CPU, .cpu_funcs = {codelet}, .nbuffers = 1, .modes = {STARPU_R} }; int main(int argc, char **argv) { int ret; starpu_data_handle_t handle, handles[NPARTS]; int i; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_vector_data_register(&handle, -1, 0, SIZE, sizeof(char)); /* Fork */ struct starpu_data_filter f = { .filter_func = starpu_vector_filter_block, .nchildren = NPARTS }; starpu_data_partition_plan(handle, &f, handles); starpu_data_partition_submit(handle, NPARTS, handles); /* Process in parallel */ for (i = 0; i < NPARTS; i++) { ret = starpu_task_insert(&clw, STARPU_W, handles[i], 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); } /* Invalidate one random piece we don't care coherency about */ starpu_data_invalidate_submit(handles[NPARTS/2]); /* Join */ starpu_data_unpartition_submit(handle, NPARTS, handles, -1); starpu_data_partition_clean(handle, NPARTS, handles); /* Read result */ starpu_task_insert(&clr, STARPU_R, handle, 0); starpu_data_unregister(handle); starpu_shutdown(); return 0; enodev: starpu_data_unpartition_submit(handle, NPARTS, handles, -1); starpu_data_partition_clean(handle, NPARTS, handles); starpu_data_unregister(handle); starpu_shutdown(); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ fprintf(stderr, "WARNING: No one can execute this task\n"); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/test_arbiter.cpp000066400000000000000000000140021320135501600224320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * for i from 0 to nbA * insert task handles[i] in STARPU_RW|STARPU_COMMUTE * for j from 0 to nbA * if i != j insert task handles[i] in STARPU_RW|STARPU_COMMUTE, and handles[j] in STARPU_RW|STARPU_COMMUTE */ // @FUSE_STARPU #include #include "../helper.h" #include #include #ifdef STARPU_QUICK_CHECK #define SLEEP_SLOW 6000 #define SLEEP_FAST 1000 #elif !defined(STARPU_LONG_CHECK) #define SLEEP_SLOW 60000 #define SLEEP_FAST 10000 #else #define SLEEP_SLOW 600000 #define SLEEP_FAST 100000 #endif static unsigned nb, nb_slow; void callback(void * /*buffers*/[], void * /*cl_arg*/) { unsigned val; val = STARPU_ATOMIC_ADD(&nb, 1); FPRINTF(stdout,"callback in (%u)\n", val); fflush(stdout); usleep(SLEEP_FAST); val = STARPU_ATOMIC_ADD(&nb, -1); FPRINTF(stdout,"callback out (%u)\n", val); fflush(stdout); } void callback_slow(void * /*buffers*/[], void * /*cl_arg*/) { unsigned val; val = STARPU_ATOMIC_ADD(&nb_slow, 1); FPRINTF(stdout,"callback_slow in (%u)\n", val); fflush(stdout); usleep(SLEEP_SLOW); val = STARPU_ATOMIC_ADD(&nb_slow, -1); FPRINTF(stdout,"callback_slow out (%u)\n", val); fflush(stdout); } int main(int /*argc*/, char** /*argv*/) { int ret; struct starpu_conf conf; starpu_arbiter_t arbiter, arbiter2; ret = starpu_conf_init(&conf); STARPU_ASSERT(ret == 0); //conf.ncpus = 1;//// 4 ret = starpu_init(&conf); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_ASSERT(ret == 0); FPRINTF(stdout, "Max Thread %u\n", starpu_worker_get_count()); ////////////////////////////////////////////////////// starpu_codelet normalCodelete; { memset(&normalCodelete, 0, sizeof(normalCodelete)); normalCodelete.where = STARPU_CPU; normalCodelete.cpu_funcs[0] = callback; normalCodelete.nbuffers = 2; normalCodelete.modes[0] = starpu_data_access_mode(STARPU_RW|STARPU_COMMUTE); normalCodelete.modes[1] = starpu_data_access_mode(STARPU_RW|STARPU_COMMUTE); normalCodelete.name = "normalCodelete"; } starpu_codelet slowCodelete; { memset(&slowCodelete, 0, sizeof(slowCodelete)); slowCodelete.where = STARPU_CPU; slowCodelete.cpu_funcs[0] = callback_slow; slowCodelete.nbuffers = 1; slowCodelete.modes[0] = starpu_data_access_mode (STARPU_RW|STARPU_COMMUTE); slowCodelete.name = "slowCodelete"; } ////////////////////////////////////////////////////// ////////////////////////////////////////////////////// ///const int nbA = 3; const int nbA = 10; FPRINTF(stdout, "Nb A = %d\n", nbA); std::vector handleA(nbA); std::vector dataA(nbA); arbiter = starpu_arbiter_create(); arbiter2 = starpu_arbiter_create(); for(int idx = 0 ; idx < nbA ; ++idx) { dataA[idx] = idx; } for(int idxHandle = 0 ; idxHandle < nbA ; ++idxHandle) { starpu_variable_data_register(&handleA[idxHandle], 0, (uintptr_t)&dataA[idxHandle], sizeof(dataA[idxHandle])); starpu_data_assign_arbiter(handleA[idxHandle], arbiter); } ////////////////////////////////////////////////////// ////////////////////////////////////////////////////// FPRINTF(stdout,"Submit tasks\n"); for(int idxHandleA1 = 0 ; idxHandleA1 < nbA ; ++idxHandleA1) { ret = starpu_task_insert(&slowCodelete, (STARPU_RW|STARPU_COMMUTE), handleA[idxHandleA1], 0); if (ret == -ENODEV) goto out; for(int idxHandleA2 = 0 ; idxHandleA2 < nbA ; ++idxHandleA2) { if(idxHandleA1 != idxHandleA2) { ret = starpu_task_insert(&normalCodelete, (STARPU_RW|STARPU_COMMUTE), handleA[idxHandleA1], (STARPU_RW|STARPU_COMMUTE), handleA[idxHandleA2], 0); if (ret == -ENODEV) goto out; } } } ////////////////////////////////////////////////////// FPRINTF(stdout,"Wait task\n"); starpu_task_wait_for_all(); ////////////////////////////////////////////////////// FPRINTF(stdout,"Release data\n"); for(int idxHandle = 0 ; idxHandle < nbA ; ++idxHandle) { starpu_data_unregister(handleA[idxHandle]); } ////////////////////////////////////////////////////// FPRINTF(stdout,"Proceed gain, with several arbiters\n"); for(int idxHandle = 0 ; idxHandle < nbA ; ++idxHandle) { starpu_variable_data_register(&handleA[idxHandle], 0, (uintptr_t)&dataA[idxHandle], sizeof(dataA[idxHandle])); starpu_data_assign_arbiter(handleA[idxHandle], (idxHandle%2)?arbiter:arbiter2); } ////////////////////////////////////////////////////// ////////////////////////////////////////////////////// FPRINTF(stdout,"Submit tasks\n"); for(int idxHandleA1 = 0 ; idxHandleA1 < nbA ; ++idxHandleA1) { ret = starpu_task_insert(&slowCodelete, (STARPU_RW|STARPU_COMMUTE), handleA[idxHandleA1], 0); if (ret == -ENODEV) goto out; for(int idxHandleA2 = 0 ; idxHandleA2 < nbA ; ++idxHandleA2) { if(idxHandleA1 != idxHandleA2) { ret = starpu_task_insert(&normalCodelete, (STARPU_RW|STARPU_COMMUTE), handleA[idxHandleA1], (STARPU_RW|STARPU_COMMUTE), handleA[idxHandleA2], 0); if (ret == -ENODEV) goto out; } } } ////////////////////////////////////////////////////// FPRINTF(stdout,"Wait task\n"); out: starpu_task_wait_for_all(); ////////////////////////////////////////////////////// FPRINTF(stdout,"Release data\n"); for(int idxHandle = 0 ; idxHandle < nbA ; ++idxHandle) { starpu_data_unregister(handleA[idxHandle]); } starpu_arbiter_destroy(arbiter); starpu_arbiter_destroy(arbiter2); ////////////////////////////////////////////////////// FPRINTF(stdout,"Shutdown\n"); starpu_shutdown(); return 0; } starpu-1.2.3+dfsg/tests/datawizard/unpartition.c000066400000000000000000000073131320135501600217660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012, 2016 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include "../helper.h" /* * Test running a task on a partitioned data, then on the unpartitioned * data, etc. in a loop */ #ifdef STARPU_QUICK_CHECK #define NITER 100 #else #define NITER 1000 #endif #define VECTORSIZE 1024 float *buffer; starpu_data_handle_t v_handle; void dummy_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } static struct starpu_codelet cl = { .modes = { STARPU_RW }, .cpu_funcs = {dummy_codelet}, #ifdef STARPU_USE_CUDA .cuda_funcs = {dummy_codelet}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {dummy_codelet}, #endif .cpu_funcs_name = {"dummy_codelet"}, .nbuffers = 1 }; static struct starpu_task* create_task(starpu_data_handle_t handle) { struct starpu_task *task; task = starpu_task_create(); task->cl = &cl; task->handles[0] = handle; task->detach = 0; return task; } int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_malloc((void **)&buffer, VECTORSIZE); STARPU_CHECK_RETURN_VALUE(ret, "starpu_malloc"); starpu_vector_data_register(&v_handle, STARPU_MAIN_RAM, (uintptr_t)buffer, VECTORSIZE, sizeof(char)); struct starpu_data_filter f = { .filter_func = starpu_vector_filter_divide_in_2, /* there are only 2 children */ .nchildren = 2, /* the length of the first part */ .filter_arg = VECTORSIZE/2 }; unsigned iter; for (iter = 0; iter < NITER; iter++) { struct starpu_task *tasks[3]; starpu_data_map_filters(v_handle, 1, &f); tasks[0] = create_task(starpu_data_get_sub_data(v_handle, 1, 0)); ret = starpu_task_submit(tasks[0]); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); tasks[1] = create_task(starpu_data_get_sub_data(v_handle, 1, 1)); ret = starpu_task_submit(tasks[1]); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_data_unpartition(v_handle, STARPU_MAIN_RAM); tasks[2] = create_task(v_handle); ret = starpu_task_submit(tasks[2]); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_task_destroy(tasks[0]); starpu_task_destroy(tasks[1]); starpu_task_destroy(tasks[2]); } starpu_data_unregister(v_handle); starpu_free(buffer); starpu_shutdown(); return EXIT_SUCCESS; enodev: starpu_data_unregister(v_handle); starpu_free(buffer); starpu_shutdown(); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/user_interaction_implicit.c000066400000000000000000000044651320135501600246660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include "../helper.h" /* * Test modifying the data in the callback of starpu_data_acquire_cb */ #ifdef STARPU_QUICK_CHECK # define NBUFFERS 4 # define NITER 16 #else # define NBUFFERS 16 # define NITER 128 #endif struct data { unsigned index; unsigned val; starpu_data_handle_t handle; }; struct data buffers[NBUFFERS]; static void callback_sync_data(void *arg) { struct data *data = (struct data *) arg; data->val++; starpu_data_release(data->handle); } int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); unsigned b; for (b = 0; b < NBUFFERS; b++) { buffers[b].index = b; starpu_variable_data_register(&buffers[b].handle, STARPU_MAIN_RAM, (uintptr_t)&buffers[b].val, sizeof(unsigned)); } unsigned iter; for (iter = 0; iter < NITER; iter++) { for (b = 0; b < NBUFFERS; b++) { ret = starpu_data_acquire_cb(buffers[b].handle, STARPU_RW, callback_sync_data, &buffers[b]); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire_cb"); } } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); /* do some cleanup */ ret = EXIT_SUCCESS; for (b = 0; b < NBUFFERS; b++) { starpu_data_unregister(buffers[b].handle); /* check result */ if (buffers[b].val != NITER) { FPRINTF(stderr, "buffer[%u] = %u should be %d\n", b, buffers[b].val, NITER); ret = EXIT_FAILURE; } } starpu_shutdown(); return ret; } starpu-1.2.3+dfsg/tests/datawizard/variable_parameters.c000066400000000000000000000144431320135501600234240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2014 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Test the variable interface */ static starpu_data_handle_t handle1, handle2, handle3, handle4; /* * Increment codelet */ #ifdef STARPU_USE_OPENCL /* dummy OpenCL implementation */ static void increment_opencl_kernel(void *descr[], void *cl_arg) { int num = starpu_task_get_current()->nbuffers; int i; for (i = 0; i < num; i++) { cl_mem d_token = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[i]); unsigned h_token; cl_command_queue queue; starpu_opencl_get_current_queue(&queue); clEnqueueReadBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); h_token++; clEnqueueWriteBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); clFinish(queue); } } #endif #ifdef STARPU_USE_CUDA static void increment_cuda_kernel(void *descr[], void *arg) { int num = starpu_task_get_current()->nbuffers; int i; for (i = 0; i < num; i++) { unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[i]); unsigned host_token; /* This is a dummy technique of course */ cudaMemcpyAsync(&host_token, tokenptr, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); host_token++; cudaMemcpyAsync(tokenptr, &host_token, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); } cudaStreamSynchronize(starpu_cuda_get_local_stream()); } #endif void increment_cpu_kernel(void *descr[], void *cl_arg) { int num = starpu_task_get_current()->nbuffers; int i; for (i = 0; i < num; i++) { unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[i]); *tokenptr = *tokenptr + 1; } } static struct starpu_codelet increment_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {increment_cuda_kernel}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {increment_opencl_kernel}, #endif .cpu_funcs = {increment_cpu_kernel}, /* starpu_task_get_current() doesn't work on MIC */ /*.cpu_funcs_name = {"increment_cpu_kernel"},*/ .nbuffers = STARPU_VARIABLE_NBUFFERS, }; int main(int argc, char **argv) { unsigned *pvar = NULL; int ret; unsigned var1 = 0, var2 = 0, var3 = 0, var4 = 0; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&handle1, STARPU_MAIN_RAM, (uintptr_t)&var1, sizeof(unsigned)); starpu_variable_data_register(&handle2, STARPU_MAIN_RAM, (uintptr_t)&var2, sizeof(unsigned)); starpu_variable_data_register(&handle3, STARPU_MAIN_RAM, (uintptr_t)&var3, sizeof(unsigned)); starpu_variable_data_register(&handle4, STARPU_MAIN_RAM, (uintptr_t)&var4, sizeof(unsigned)); #ifdef STARPU_QUICK_CHECK unsigned nloops = 4; #else unsigned nloops = 16; #endif unsigned loop; unsigned t; for (loop = 0; loop < nloops; loop++) { for (t = 0; t <= 4; t++) { struct starpu_task *task = starpu_task_create(); unsigned i; task->cl = &increment_cl; task->handles[0] = handle1; task->handles[1] = handle2; task->handles[2] = handle3; task->handles[3] = handle4; for (i = 0; i < t; i++) task->modes[i] = STARPU_RW; task->nbuffers = t; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_task_insert(&increment_cl, STARPU_RW, handle1, 0); starpu_task_insert(&increment_cl, STARPU_RW, handle1, STARPU_RW, handle2, 0); starpu_task_insert(&increment_cl, STARPU_RW, handle1, STARPU_RW, handle2, STARPU_RW, handle3, 0); starpu_task_insert(&increment_cl, STARPU_RW, handle1, STARPU_RW, handle2, STARPU_RW, handle3, STARPU_RW, handle4, 0); } ret = starpu_data_acquire(handle1, STARPU_R); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire"); if (var1 != 8*nloops) { FPRINTF(stderr, "[end of loop] Value %u != Expected value %u\n", var1, 8*nloops); starpu_data_release(handle1); goto err; } starpu_data_release(handle1); ret = starpu_data_acquire(handle2, STARPU_R); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire"); if (var2 != 6*nloops) { FPRINTF(stderr, "[end of loop] Value %u != Expected value %u\n", var2, 6*nloops); starpu_data_release(handle2); goto err; } starpu_data_release(handle2); ret = starpu_data_acquire(handle3, STARPU_R); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire"); if (var3 != 4*nloops) { FPRINTF(stderr, "[end of loop] Value %u != Expected value %u\n", var3, 4*nloops); starpu_data_release(handle3); goto err; } starpu_data_release(handle3); ret = starpu_data_acquire(handle4, STARPU_R); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire"); if (var4 != 2*nloops) { FPRINTF(stderr, "[end of loop] Value %u != Expected value %u\n", var4, 2*nloops); starpu_data_release(handle4); goto err; } starpu_data_release(handle4); starpu_data_unregister(handle1); starpu_data_unregister(handle2); starpu_data_unregister(handle3); starpu_data_unregister(handle4); starpu_shutdown(); return EXIT_SUCCESS; enodev: starpu_data_unregister(handle1); starpu_data_unregister(handle2); starpu_data_unregister(handle3); starpu_data_unregister(handle4); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; err: starpu_data_unregister(handle1); starpu_data_unregister(handle2); starpu_data_unregister(handle3); starpu_data_unregister(handle4); starpu_shutdown(); return EXIT_FAILURE; } starpu-1.2.3+dfsg/tests/datawizard/write_only_tmp_buffer.c000066400000000000000000000100171320135501600240110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2012, 2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include "../helper.h" /* * Test initializing a buffer with a task, then printing it with another task */ #define VECTORSIZE 1024 starpu_data_handle_t v_handle; #ifdef STARPU_USE_OPENCL static void opencl_codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; cl_mem buf = (cl_mem)STARPU_VECTOR_GET_DEV_HANDLE(descr[0]); char ptr = 42; cl_command_queue queue; int id = starpu_worker_get_id_check(); int devid = starpu_worker_get_devid(id); starpu_opencl_get_queue(devid, &queue); clEnqueueWriteBuffer(queue, buf, CL_TRUE, 0, sizeof(char), &ptr, 0, NULL, NULL); } #endif #ifdef STARPU_USE_CUDA static void cuda_codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; char *buf = (char *)STARPU_VECTOR_GET_PTR(descr[0]); cudaMemsetAsync(buf, 42, 1, starpu_cuda_get_local_stream()); } #endif void cpu_codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { char *buf = (char *)STARPU_VECTOR_GET_PTR(descr[0]); *buf = 42; } void display_var(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; char *buf = (char *)STARPU_VECTOR_GET_PTR(descr[0]); if (*buf != 42) { FPRINTF(stderr, "Value = <%c> (should be <%c>)\n", *buf, 42); exit(-1); } } static struct starpu_codelet cl = { .cpu_funcs = {cpu_codelet_null}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_codelet_null}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_codelet_null}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs_name = {"cpu_codelet_null"}, .nbuffers = 1, .modes = {STARPU_W} }; static struct starpu_codelet display_cl = { .cpu_funcs = {display_var}, .cpu_funcs_name = {"display_var"}, .nbuffers = 1, .modes = {STARPU_R} }; int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* The buffer should never be explicitely allocated */ starpu_vector_data_register(&v_handle, (uint32_t)-1, (uintptr_t)NULL, VECTORSIZE, sizeof(char)); struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->handles[0] = v_handle; task->detach = 0; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); task = starpu_task_create(); task->cl = &display_cl; task->handles[0] = v_handle; task->detach = 0; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); /* this should get rid of automatically allocated buffers */ starpu_data_unregister(v_handle); starpu_shutdown(); return EXIT_SUCCESS; enodev: starpu_data_unregister(v_handle); starpu_shutdown(); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/wt_broadcast.c000066400000000000000000000076171320135501600220750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2012, 2014-2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Test using starpu_data_set_wt_mask(handle, ~0);, i.e. broadcasting the * result on all devices as soon as it is available. */ static unsigned var = 0; static starpu_data_handle_t handle; /* * Increment codelet */ #ifdef STARPU_USE_OPENCL /* dummy OpenCL implementation */ static void increment_opencl_kernel(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { cl_mem d_token = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned h_token; cl_command_queue queue; starpu_opencl_get_current_queue(&queue); clEnqueueReadBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); h_token++; clEnqueueWriteBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); } #endif #ifdef STARPU_USE_CUDA static void increment_cuda_kernel(void *descr[], void *arg) { unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned host_token; /* This is a dummy technique of course */ cudaMemcpyAsync(&host_token, tokenptr, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); host_token++; cudaMemcpyAsync(tokenptr, &host_token, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); } #endif void increment_cpu_kernel(void *descr[], void *arg) { unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *tokenptr = *tokenptr + 1; } static struct starpu_codelet increment_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {increment_cuda_kernel}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {increment_opencl_kernel}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs = {increment_cpu_kernel}, .cpu_funcs_name = {"increment_cpu_kernel"}, .nbuffers = 1, .modes = {STARPU_RW} }; int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)&var, sizeof(unsigned)); /* Create a mask with all the memory nodes, so that we can ask StarPU * to broadcast the handle whenever it is modified. */ starpu_data_set_wt_mask(handle, ~0); #ifdef STARPU_QUICK_CHECK unsigned ntasks = 32; unsigned nloops = 4; #else unsigned ntasks = 1024; unsigned nloops = 16; #endif unsigned loop; unsigned t; for (loop = 0; loop < nloops; loop++) { for (t = 0; t < ntasks; t++) { struct starpu_task *task = starpu_task_create(); task->cl = &increment_cl; task->handles[0] = handle; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } starpu_data_unregister(handle); ret = EXIT_SUCCESS; if (var != ntasks*nloops) { FPRINTF(stderr, "VAR is %u should be %u\n", var, ntasks); ret = EXIT_FAILURE; } starpu_shutdown(); return ret; enodev: starpu_data_unregister(handle); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/datawizard/wt_host.c000066400000000000000000000076341320135501600211070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2012, 2014-2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Test writing back the result into main memory as soon as it is available */ static unsigned var = 0; static starpu_data_handle_t handle; /* * Increment codelet */ #ifdef STARPU_USE_OPENCL /* dummy OpenCL implementation */ static void increment_opencl_kernel(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { STARPU_SKIP_IF_VALGRIND; cl_mem d_token = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned h_token; cl_command_queue queue; starpu_opencl_get_current_queue(&queue); clEnqueueReadBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); h_token++; clEnqueueWriteBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); } #endif #ifdef STARPU_USE_CUDA static void increment_cuda_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned host_token; /* This is a dummy technique of course */ cudaMemcpyAsync(&host_token, tokenptr, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); host_token++; cudaMemcpyAsync(tokenptr, &host_token, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); } #endif void increment_cpu_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *tokenptr = *tokenptr + 1; } static struct starpu_codelet increment_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {increment_cuda_kernel}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {increment_opencl_kernel}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs = {increment_cpu_kernel}, .cpu_funcs_name = {"increment_cpu_kernel"}, .nbuffers = 1, .modes = {STARPU_RW} }; int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)&var, sizeof(unsigned)); /* Copy the handle in main memory every time it is modified */ uint32_t wt_mask = (1<cl = &increment_cl; task->handles[0] = handle; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } starpu_data_unregister(handle); ret = EXIT_SUCCESS; if (var != ntasks*nloops) { ret = EXIT_FAILURE; FPRINTF(stderr, "VAR is %u should be %u\n", var, ntasks); } starpu_shutdown(); STARPU_RETURN(ret); enodev: starpu_data_unregister(handle); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/disk/000077500000000000000000000000001320135501600160425ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/disk/disk_compute.c000066400000000000000000000136351320135501600207040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Corentin Salingue * Copyright (C) 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include "../helper.h" /* * Try to write into disk memory * Use mechanism to push datas from main ram to disk ram * Here we just simulate performing a dumb computation C=A+0, i.e. a mere copy * actually */ #define NX (16*1024) int dotest(struct starpu_disk_ops *ops, char *base) { int *A, *C; /* Initialize StarPU with default configuration */ int ret = starpu_init(NULL); if (ret == -ENODEV) goto enodev; /* Initialize path and name */ const char *name_file_start = "STARPU_DISK_COMPUTE_DATA_"; const char *name_file_end = "STARPU_DISK_COMPUTE_DATA_RESULT_"; char * path_file_start = malloc(strlen(base) + 1 + strlen(name_file_start) + 1); strcpy(path_file_start, base); strcat(path_file_start, "/"); strcat(path_file_start, name_file_start); char * path_file_end = malloc(strlen(base) + 1 + strlen(name_file_end) + 1); strcpy(path_file_end, base); strcat(path_file_end, "/"); strcat(path_file_end, name_file_end); /* register a disk */ int new_dd = starpu_disk_register(ops, (void *) base, STARPU_DISK_SIZE_MIN); /* can't write on /tmp/ */ if (new_dd == -ENOENT) goto enoent; unsigned dd = (unsigned) new_dd; /* allocate two memory spaces */ starpu_malloc_flags((void **)&A, NX*sizeof(int), STARPU_MALLOC_COUNT); starpu_malloc_flags((void **)&C, NX*sizeof(int), STARPU_MALLOC_COUNT); FPRINTF(stderr, "TEST DISK MEMORY \n"); unsigned int j; /* you register them in a vector */ for(j = 0; j < NX; ++j) { A[j] = j; C[j] = 0; } /* you create a file to store the vector ON the disk */ FILE * f = fopen(path_file_start, "wb+"); if (f == NULL) goto enoent2; /* store it in the file */ fwrite(A, sizeof(int), NX, f); /* close the file */ fclose(f); int descriptor = open(path_file_start, O_RDWR); if (descriptor < 0) goto enoent2; #ifdef STARPU_HAVE_WINDOWS _commit(descriptor); #else fsync(descriptor); #endif close(descriptor); /* create a file to store result */ f = fopen(path_file_end, "wb+"); if (f == NULL) goto enoent2; /* replace all datas by 0 */ fwrite(C, sizeof(int), NX, f); /* close the file */ fclose(f); descriptor = open(path_file_end, O_RDWR); #ifdef STARPU_HAVE_WINDOWS _commit(descriptor); #else fsync(descriptor); #endif close(descriptor); /* And now, you want to use your datas in StarPU */ /* Open the file ON the disk */ void * data = starpu_disk_open(dd, (void *) name_file_start, NX*sizeof(int)); void * data_result = starpu_disk_open(dd, (void *) name_file_end, NX*sizeof(int)); starpu_data_handle_t vector_handleA, vector_handleC; /* register vector in starpu */ starpu_vector_data_register(&vector_handleA, dd, (uintptr_t) data, NX, sizeof(int)); /* and do what you want with it, here we copy it into an other vector */ starpu_vector_data_register(&vector_handleC, dd, (uintptr_t) data_result, NX, sizeof(int)); starpu_data_cpy(vector_handleC, vector_handleA, 0, NULL, NULL); /* free them */ starpu_data_unregister(vector_handleA); starpu_data_unregister(vector_handleC); /* close them in StarPU */ starpu_disk_close(dd, data, NX*sizeof(int)); starpu_disk_close(dd, data_result, NX*sizeof(int)); /* check results */ f = fopen(path_file_end, "rb+"); if (f == NULL) goto enoent2; /* take datas */ size_t read = fread(C, sizeof(int), NX, f); STARPU_ASSERT(read == NX); /* close the file */ fclose(f); int try = 1; for (j = 0; j < NX; ++j) if (A[j] != C[j]) { FPRINTF(stderr, "Fail A %d != C %d \n", A[j], C[j]); try = 0; } starpu_free_flags(A, NX*sizeof(int), STARPU_MALLOC_COUNT); starpu_free_flags(C, NX*sizeof(int), STARPU_MALLOC_COUNT); unlink(path_file_start); unlink(path_file_end); free(path_file_start); free(path_file_end); /* terminate StarPU, no task can be submitted after */ starpu_shutdown(); if(try) FPRINTF(stderr, "TEST SUCCESS\n"); else FPRINTF(stderr, "TEST FAIL\n"); return try ? EXIT_SUCCESS : EXIT_FAILURE; enodev: return STARPU_TEST_SKIPPED; enoent2: starpu_free_flags(A, NX*sizeof(int), STARPU_MALLOC_COUNT); starpu_free_flags(C, NX*sizeof(int), STARPU_MALLOC_COUNT); enoent: unlink(path_file_start); unlink(path_file_end); free(path_file_start); free(path_file_end); FPRINTF(stderr, "Couldn't write data: ENOENT\n"); starpu_shutdown(); return STARPU_TEST_SKIPPED; } static int merge_result(int old, int new) { if (new == EXIT_FAILURE) return EXIT_FAILURE; if (old == 0) return 0; return new; } int main(void) { int ret = 0; int ret2; char s[128]; char *ptr; snprintf(s, sizeof(s), "/tmp/%s-disk-XXXXXX", getenv("USER")); ptr = _starpu_mkdtemp(s); if (!ptr) { FPRINTF(stderr, "Cannot make directory '%s'\n", s); return STARPU_TEST_SKIPPED; } ret = merge_result(ret, dotest(&starpu_disk_stdio_ops, s)); ret = merge_result(ret, dotest(&starpu_disk_unistd_ops, s)); #ifdef STARPU_LINUX_SYS if ((NX * sizeof(int)) % getpagesize() == 0) { ret = merge_result(ret, dotest(&starpu_disk_unistd_o_direct_ops, s)); } else { ret = merge_result(ret, STARPU_TEST_SKIPPED); } #endif ret2 = rmdir(s); if (ret2 < 0) STARPU_CHECK_RETURN_VALUE(-errno, "rmdir '%s'\n", s); return ret; } starpu-1.2.3+dfsg/tests/disk/disk_copy.c000066400000000000000000000123411320135501600201730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Corentin Salingue * Copyright (C) 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include "../helper.h" /* * Try to write into disk memory * Use mechanism to push datas from main ram to disk ram * Here we make copies between buffers, that StarPU has to evict while * progressing because there is not enough room for all of them. */ /* RAM is not enough to hold 6 times NX * DISK is just enough to hold 6 times NX */ /* size of one vector */ #ifdef STARPU_QUICK_CHECK # define RAM "1" # define DISK 64 # define NX (256*1024/sizeof(double)) #else # define NX (32*1048576/sizeof(double)) # define RAM "160" # define DISK 200 #endif #if !defined(STARPU_HAVE_SETENV) #warning setenv is not defined. Skipping test int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else int dotest(struct starpu_disk_ops *ops, void *param) { double *A,*B,*C,*D,*E,*F; int ret; /* limit main ram to force to push in disk */ setenv("STARPU_LIMIT_CPU_MEM", RAM, 1); /* Initialize StarPU without GPU devices to make sure the memory of the GPU devices will not be used */ struct starpu_conf conf; ret = starpu_conf_init(&conf); if (ret == -EINVAL) return EXIT_FAILURE; conf.ncuda = 0; conf.nopencl = 0; conf.nmic = 0; conf.nscc = 0; ret = starpu_init(&conf); if (ret == -ENODEV) goto enodev; /* register a disk */ int new_dd = starpu_disk_register(ops, param, 1024*1024*DISK); /* can't write on /tmp/ */ if (new_dd == -ENOENT) goto enoent; /* allocate two memory spaces */ starpu_malloc_flags((void **)&A, NX*sizeof(double), STARPU_MALLOC_COUNT); starpu_malloc_flags((void **)&F, NX*sizeof(double), STARPU_MALLOC_COUNT); FPRINTF(stderr, "TEST DISK MEMORY \n"); unsigned int j; /* initialization with bad values */ for(j = 0; j < NX; ++j) { A[j] = j; F[j] = -j; } starpu_data_handle_t vector_handleA, vector_handleB, vector_handleC, vector_handleD, vector_handleE, vector_handleF; /* register vector in starpu */ starpu_vector_data_register(&vector_handleA, STARPU_MAIN_RAM, (uintptr_t)A, NX, sizeof(double)); starpu_vector_data_register(&vector_handleB, -1, (uintptr_t) NULL, NX, sizeof(double)); starpu_vector_data_register(&vector_handleC, -1, (uintptr_t) NULL, NX, sizeof(double)); starpu_vector_data_register(&vector_handleD, -1, (uintptr_t) NULL, NX, sizeof(double)); starpu_vector_data_register(&vector_handleE, -1, (uintptr_t) NULL, NX, sizeof(double)); starpu_vector_data_register(&vector_handleF, STARPU_MAIN_RAM, (uintptr_t)F, NX, sizeof(double)); /* copy vector A->B, B->C... */ starpu_data_cpy(vector_handleB, vector_handleA, 0, NULL, NULL); starpu_data_cpy(vector_handleC, vector_handleB, 0, NULL, NULL); starpu_data_cpy(vector_handleD, vector_handleC, 0, NULL, NULL); starpu_data_cpy(vector_handleE, vector_handleD, 0, NULL, NULL); starpu_data_cpy(vector_handleF, vector_handleE, 0, NULL, NULL); /* StarPU does not need to manipulate the array anymore so we can stop * monitoring it */ /* free them */ starpu_data_unregister(vector_handleA); starpu_data_unregister(vector_handleB); starpu_data_unregister(vector_handleC); starpu_data_unregister(vector_handleD); starpu_data_unregister(vector_handleE); starpu_data_unregister(vector_handleF); /* check if computation is correct */ int try = 1; for (j = 0; j < NX; ++j) if (A[j] != F[j]) { FPRINTF(stderr, "Fail A %f != F %f \n", A[j], F[j]); try = 0; } starpu_free_flags(A, NX*sizeof(double), STARPU_MALLOC_COUNT); starpu_free_flags(F, NX*sizeof(double), STARPU_MALLOC_COUNT); /* terminate StarPU, no task can be submitted after */ starpu_shutdown(); if(try) FPRINTF(stderr, "TEST SUCCESS\n"); else FPRINTF(stderr, "TEST FAIL\n"); return try ? EXIT_SUCCESS : EXIT_FAILURE; enodev: return STARPU_TEST_SKIPPED; enoent: FPRINTF(stderr, "Couldn't write data: ENOENT\n"); starpu_shutdown(); return STARPU_TEST_SKIPPED; } static int merge_result(int old, int new) { if (new == EXIT_FAILURE) return EXIT_FAILURE; if (old == 0) return 0; return new; } int main(void) { int ret = 0; int ret2; char s[128]; char *ptr; snprintf(s, sizeof(s), "/tmp/%s-disk-XXXXXX", getenv("USER")); ptr = _starpu_mkdtemp(s); if (!ptr) { FPRINTF(stderr, "Cannot make directory <%s>\n", s); return STARPU_TEST_SKIPPED; } ret = merge_result(ret, dotest(&starpu_disk_stdio_ops, s)); ret = merge_result(ret, dotest(&starpu_disk_unistd_ops, s)); #ifdef STARPU_LINUX_SYS ret = merge_result(ret, dotest(&starpu_disk_unistd_o_direct_ops, s)); #endif ret2 = rmdir(s); if (ret2 < 0) STARPU_CHECK_RETURN_VALUE(-errno, "rmdir '%s'\n", s); return ret; } #endif starpu-1.2.3+dfsg/tests/disk/disk_pack.c000066400000000000000000000162111320135501600201370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Corentin Salingue * Copyright (C) 2015, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include "../helper.h" /* * Try to write into disk memory * Use mechanism to push datas from main ram to disk ram * Here we force using the pack/unpack mechanism */ #define NX (16*1024) const struct starpu_data_copy_methods my_vector_copy_data_methods_s; struct starpu_data_interface_ops starpu_interface_my_vector_ops; void starpu_my_vector_data_register(starpu_data_handle_t *handleptr, unsigned home_node, uintptr_t ptr, uint32_t nx, size_t elemsize) { struct starpu_vector_interface vector = { .id = STARPU_VECTOR_INTERFACE_ID, .ptr = ptr, .nx = nx, .elemsize = elemsize, .dev_handle = ptr, .slice_base = 0, .offset = 0 }; starpu_data_register(handleptr, home_node, &vector, &starpu_interface_my_vector_ops); } int dotest(struct starpu_disk_ops *ops, char *base) { int *A, *C; /* Initialize StarPU without GPU devices to make sure the memory of the GPU devices will not be used */ struct starpu_conf conf; int ret = starpu_conf_init(&conf); if (ret == -EINVAL) return EXIT_FAILURE; #ifdef STARPU_HAVE_UNSETENV unsetenv("STARPU_NCUDA"); unsetenv("STARPU_NOPENCL"); #endif conf.ncuda = 0; conf.nopencl = 0; conf.nmic = 0; conf.nscc = 0; ret = starpu_init(&conf); if (ret == -ENODEV) goto enodev; if (starpu_cpu_worker_get_count() == 0) { FPRINTF(stderr, "We need at least 1 CPU worker.\n"); starpu_shutdown(); return STARPU_TEST_SKIPPED; } /* Initialize path and name */ const char *name_file_start = "STARPU_DISK_COMPUTE_DATA_"; const char *name_file_end = "STARPU_DISK_COMPUTE_DATA_RESULT_"; char * path_file_start = malloc(strlen(base) + 1 + strlen(name_file_start) + 1); strcpy(path_file_start, base); strcat(path_file_start, "/"); strcat(path_file_start, name_file_start); char * path_file_end = malloc(strlen(base) + 1 + strlen(name_file_end) + 1); strcpy(path_file_end, base); strcat(path_file_end, "/"); strcat(path_file_end, name_file_end); /* register a disk */ int new_dd = starpu_disk_register(ops, (void *) base, STARPU_DISK_SIZE_MIN); /* can't write on /tmp/ */ if (new_dd == -ENOENT) goto enoent; unsigned dd = (unsigned) new_dd; /* allocate two memory spaces */ starpu_malloc_flags((void **)&A, NX*sizeof(int), STARPU_MALLOC_COUNT); starpu_malloc_flags((void **)&C, NX*sizeof(int), STARPU_MALLOC_COUNT); FPRINTF(stderr, "TEST DISK MEMORY \n"); unsigned int j; /* you register them in a vector */ for(j = 0; j < NX; ++j) { A[j] = j; C[j] = 0; } /* you create a file to store the vector ON the disk */ FILE * f = fopen(path_file_start, "wb+"); if (f == NULL) goto enoent2; /* store it in the file */ fwrite(A, sizeof(int), NX, f); /* close the file */ fclose(f); int descriptor = open(path_file_start, O_RDWR); if (descriptor < 0) goto enoent2; #ifdef STARPU_HAVE_WINDOWS _commit(descriptor); #else fsync(descriptor); #endif close(descriptor); /* create a file to store result */ f = fopen(path_file_end, "wb+"); if (f == NULL) goto enoent2; /* replace all datas by 0 */ fwrite(C, sizeof(int), NX, f); /* close the file */ fclose(f); descriptor = open(path_file_end, O_RDWR); if (descriptor < 0) goto enoent2; #ifdef STARPU_HAVE_WINDOWS _commit(descriptor); #else fsync(descriptor); #endif close(descriptor); /* And now, you want to use your datas in StarPU */ /* Open the file ON the disk */ void * data = starpu_disk_open(dd, (void *) name_file_start, NX*sizeof(int)); void * data_result = starpu_disk_open(dd, (void *) name_file_end, NX*sizeof(int)); starpu_data_handle_t vector_handleA, vector_handleC; /* Build an vector-like interface which doesn't have the any_to_any helper, to force making use of pack/unpack */ memcpy(&starpu_interface_my_vector_ops, &starpu_interface_vector_ops, sizeof(starpu_interface_my_vector_ops)); starpu_interface_my_vector_ops.copy_methods = &my_vector_copy_data_methods_s; /* register vector in starpu */ starpu_my_vector_data_register(&vector_handleA, dd, (uintptr_t) data, NX, sizeof(int)); /* and do what you want with it, here we copy it into an other vector */ starpu_my_vector_data_register(&vector_handleC, dd, (uintptr_t) data_result, NX, sizeof(int)); starpu_data_cpy(vector_handleC, vector_handleA, 0, NULL, NULL); /* free them */ starpu_data_unregister(vector_handleA); starpu_data_unregister(vector_handleC); /* close them in StarPU */ starpu_disk_close(dd, data, NX*sizeof(int)); starpu_disk_close(dd, data_result, NX*sizeof(int)); /* check results */ f = fopen(path_file_end, "rb+"); if (f == NULL) goto enoent2; /* take datas */ size_t read = fread(C, sizeof(int), NX, f); STARPU_ASSERT(read == NX); /* close the file */ fclose(f); int try = 1; for (j = 0; j < NX; ++j) if (A[j] != C[j]) { FPRINTF(stderr, "Fail A %d != C %d \n", A[j], C[j]); try = 0; } starpu_free_flags(A, NX*sizeof(int), STARPU_MALLOC_COUNT); starpu_free_flags(C, NX*sizeof(int), STARPU_MALLOC_COUNT); unlink(path_file_start); unlink(path_file_end); free(path_file_start); free(path_file_end); /* terminate StarPU, no task can be submitted after */ starpu_shutdown(); if(try) FPRINTF(stderr, "TEST SUCCESS\n"); else FPRINTF(stderr, "TEST FAIL\n"); return try ? EXIT_SUCCESS : EXIT_FAILURE; enodev: return STARPU_TEST_SKIPPED; enoent2: starpu_free_flags(A, NX*sizeof(int), STARPU_MALLOC_COUNT); starpu_free_flags(C, NX*sizeof(int), STARPU_MALLOC_COUNT); enoent: unlink(path_file_start); unlink(path_file_end); free(path_file_start); free(path_file_end); FPRINTF(stderr, "Couldn't write data: ENOENT\n"); starpu_shutdown(); return STARPU_TEST_SKIPPED; } static int merge_result(int old, int new) { if (new == EXIT_FAILURE) return EXIT_FAILURE; if (old == 0) return 0; return new; } int main(void) { int ret = 0; int ret2; char s[128]; char *ptr; snprintf(s, sizeof(s), "/tmp/%s-disk-XXXXXX", getenv("USER")); ptr = _starpu_mkdtemp(s); if (!ptr) { FPRINTF(stderr, "Cannot make directory <%s>\n", s); return STARPU_TEST_SKIPPED; } ret = merge_result(ret, dotest(&starpu_disk_stdio_ops, s)); ret = merge_result(ret, dotest(&starpu_disk_unistd_ops, s)); #ifdef STARPU_LINUX_SYS ret = merge_result(ret, dotest(&starpu_disk_unistd_o_direct_ops, s)); #endif ret2 = rmdir(s); if (ret2 < 0) STARPU_CHECK_RETURN_VALUE(-errno, "rmdir '%s'\n", s); return ret; } starpu-1.2.3+dfsg/tests/disk/mem_reclaim.c000066400000000000000000000146531320135501600204710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Corentin Salingue * Copyright (C) 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include "../helper.h" /* * Try to write into disk memory * Use mechanism to push datas from main ram to disk ram * Here we stress the memory with more tasks than what the RAM can fit. */ #ifdef STARPU_HAVE_MEMCHECK_H #include #else #define VALGRIND_MAKE_MEM_DEFINED(addr, size) (void)0 #endif #ifdef STARPU_QUICK_CHECK # define NDATA 4 # define NITER 16 #elif !defined(STARPU_LONG_CHECK) # define NDATA 32 # define NITER 256 #else # define NDATA 128 # define NITER 1024 #endif # define MEMSIZE 1 # define MEMSIZE_STR "1" #if !defined(STARPU_HAVE_SETENV) #warning setenv is not defined. Skipping test int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else const struct starpu_data_copy_methods my_vector_copy_data_methods_s; struct starpu_data_interface_ops starpu_interface_my_vector_ops; void starpu_my_vector_data_register(starpu_data_handle_t *handleptr, int home_node, uintptr_t ptr, uint32_t nx, size_t elemsize) { struct starpu_vector_interface vector = { .id = STARPU_VECTOR_INTERFACE_ID, .ptr = ptr, .nx = nx, .elemsize = elemsize, .dev_handle = ptr, .slice_base = 0, .offset = 0 }; starpu_data_register(handleptr, home_node, &vector, &starpu_interface_my_vector_ops); } static unsigned values[NDATA]; static void zero(void *buffers[], void *args) { struct starpu_vector_interface *vector = (struct starpu_vector_interface *) buffers[0]; unsigned *val = (unsigned*) STARPU_VECTOR_GET_PTR(vector); *val = 0; VALGRIND_MAKE_MEM_DEFINED(val, STARPU_VECTOR_GET_NX(vector) * STARPU_VECTOR_GET_ELEMSIZE(vector)); } static void inc(void *buffers[], void *args) { struct starpu_vector_interface *vector = (struct starpu_vector_interface *) buffers[0]; unsigned *val = (unsigned*) STARPU_VECTOR_GET_PTR(vector); unsigned i; starpu_codelet_unpack_args(args, &i); (*val)++; STARPU_ATOMIC_ADD(&values[i], 1); } static void check(void *buffers[], void *args) { struct starpu_vector_interface *vector = (struct starpu_vector_interface *) buffers[0]; unsigned *val = (unsigned*) STARPU_VECTOR_GET_PTR(vector); unsigned i; starpu_codelet_unpack_args(args, &i); STARPU_ASSERT_MSG(*val == values[i], "Incorrect value. Value %u should be %u (index %u)", *val, values[i], i); } static struct starpu_codelet zero_cl = { .cpu_funcs = { zero }, .nbuffers = 1, .modes = { STARPU_W }, }; static struct starpu_codelet inc_cl = { .cpu_funcs = { inc }, .nbuffers = 1, .modes = { STARPU_RW }, }; static struct starpu_codelet check_cl = { .cpu_funcs = { check }, .nbuffers = 1, .modes = { STARPU_R }, }; int dotest(struct starpu_disk_ops *ops, char *base, void (*vector_data_register)(starpu_data_handle_t *handleptr, int home_node, uintptr_t ptr, uint32_t nx, size_t elemsize)) { int *A, *C; starpu_data_handle_t handles[NDATA]; /* Initialize StarPU without GPU devices to make sure the memory of the GPU devices will not be used */ struct starpu_conf conf; int ret = starpu_conf_init(&conf); if (ret == -EINVAL) return EXIT_FAILURE; conf.ncuda = 0; conf.nopencl = 0; ret = starpu_init(&conf); if (ret == -ENODEV) goto enodev; /* Initialize path and name */ /* register swap disk */ int new_dd = starpu_disk_register(ops, (void *) base, STARPU_DISK_SIZE_MIN); /* can't write on /tmp/ */ if (new_dd == -ENOENT) goto enoent; unsigned int i, j; /* Initialize twice as much data as available memory */ for (i = 0; i < NDATA; i++) { vector_data_register(&handles[i], -1, 0, (MEMSIZE*1024*1024*2) / NDATA, sizeof(char)); starpu_task_insert(&zero_cl, STARPU_W, handles[i], 0); } memset(values, 0, sizeof(values)); for (i = 0; i < NITER; i++) { j = rand()%NDATA; starpu_task_insert(&inc_cl, STARPU_RW, handles[j], STARPU_VALUE, &j, sizeof(j), 0); } /* Check and free data */ for (i = 0; i < NDATA; i++) { starpu_task_insert(&check_cl, STARPU_R, handles[i], STARPU_VALUE, &i, sizeof(i), 0); starpu_data_unregister(handles[i]); } /* terminate StarPU, no task can be submitted after */ starpu_shutdown(); return EXIT_SUCCESS; enoent: FPRINTF(stderr, "Couldn't write data: ENOENT\n"); starpu_shutdown(); enodev: return STARPU_TEST_SKIPPED; } static int merge_result(int old, int new) { if (new == EXIT_FAILURE) return EXIT_FAILURE; if (old == 0) return 0; return new; } int main(void) { int ret = 0; int ret2; char s[128]; char *ptr; snprintf(s, sizeof(s), "/tmp/%s-disk-XXXXXX", getenv("USER")); ptr = _starpu_mkdtemp(s); if (!ptr) { FPRINTF(stderr, "Cannot make directory '%s'\n", s); return STARPU_TEST_SKIPPED; } setenv("STARPU_LIMIT_CPU_MEM", MEMSIZE_STR, 1); /* Build an vector-like interface which doesn't have the any_to_any helper, to force making use of pack/unpack */ memcpy(&starpu_interface_my_vector_ops, &starpu_interface_vector_ops, sizeof(starpu_interface_my_vector_ops)); starpu_interface_my_vector_ops.copy_methods = &my_vector_copy_data_methods_s; ret = merge_result(ret, dotest(&starpu_disk_stdio_ops, s, starpu_vector_data_register)); ret = merge_result(ret, dotest(&starpu_disk_stdio_ops, s, starpu_my_vector_data_register)); ret = merge_result(ret, dotest(&starpu_disk_unistd_ops, s, starpu_vector_data_register)); ret = merge_result(ret, dotest(&starpu_disk_unistd_ops, s, starpu_my_vector_data_register)); #ifdef STARPU_LINUX_SYS ret = merge_result(ret, dotest(&starpu_disk_unistd_o_direct_ops, s, starpu_vector_data_register)); ret = merge_result(ret, dotest(&starpu_disk_unistd_o_direct_ops, s, starpu_my_vector_data_register)); #endif ret2 = rmdir(s); STARPU_CHECK_RETURN_VALUE(ret2, "rmdir '%s'\n", s); return ret; } #endif starpu-1.2.3+dfsg/tests/errorcheck/000077500000000000000000000000001320135501600172375ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/errorcheck/invalid_blocking_calls.c000066400000000000000000000063671320135501600240730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2013, 2015-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Check that we catch calling tag_wait, i.e. a blocking call, from the * codelet function, which is invalid. This test is thus expected to fail. */ #ifdef STARPU_NO_ASSERT int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else #define TAG 0x42 static starpu_data_handle_t handle; static unsigned *data; void wrong_func(void *descr[], void *arg) { /* The function is expected to fail. This is indicated in tests/Makefile.am */ /* try to fetch data in the RAM while we are in a codelet, such a * blocking call is forbidden */ starpu_data_acquire(handle, STARPU_RW); starpu_tag_wait(TAG); } static struct starpu_codelet wrong_codelet = { .modes = { STARPU_RW }, .cpu_funcs = {wrong_func}, .cuda_funcs = {wrong_func}, .opencl_funcs = {wrong_func}, .model = NULL, .nbuffers = 0 }; static void wrong_callback(void *arg) { /* The function is expected to fail. This is indicated in tests/Makefile.am */ starpu_data_acquire(handle, STARPU_RW); starpu_tag_wait(TAG); } int main(int argc, char **argv) { int ret; if (RUNNING_ON_VALGRIND) return STARPU_TEST_SKIPPED; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_malloc((void**)&data, sizeof(*data)); *data = 42; /* register a piece of data */ starpu_vector_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)data, 1, sizeof(unsigned)); struct starpu_task *task = starpu_task_create(); task->cl = &wrong_codelet; task->handles[0] = handle; task->use_tag = 1; task->tag_id = TAG; task->callback_func = wrong_callback; task->detach = 0; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_tag_wait(TAG); STARPU_CHECK_RETURN_VALUE(ret, "starpu_tag_wait"); /* This call is valid as it is done by the application outside a * callback */ ret = starpu_data_acquire(handle, STARPU_RW); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire"); starpu_data_release(handle); ret = starpu_task_wait(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); starpu_data_unregister(handle); starpu_free(data); starpu_shutdown(); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } #endif starpu-1.2.3+dfsg/tests/errorcheck/invalid_tasks.c000066400000000000000000000044241320135501600222420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" #include /* * Check that we detect that with only a CPU we can't submit a GPU-only task */ #if !defined(STARPU_HAVE_UNSETENV) || !defined(STARPU_USE_CPU) #warning unsetenv is not defined or no cpu are available. Skipping test int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else void dummy_func(void *descr[], void *arg) { } static struct starpu_codelet gpu_only_cl = { .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .model = NULL, .nbuffers = 0 }; int main(int argc, char **argv) { int ret; /* We force StarPU to use 1 CPU only */ unsetenv("STARPU_NCUDA"); unsetenv("STARPU_NOPENCL"); unsetenv("STARPU_NCPUS"); struct starpu_conf conf; starpu_conf_init(&conf); conf.ncpus = 1; conf.nopencl = 0; conf.ncuda = 0; ret = starpu_init(&conf); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); struct starpu_task *task = starpu_task_create(); task->cl = &gpu_only_cl; /* Only a GPU device could execute that task ! */ ret = starpu_task_submit(task); STARPU_ASSERT(ret == -ENODEV); task->destroy = 0; starpu_task_destroy(task); struct starpu_task *task_specific = starpu_task_create(); task_specific->cl = &gpu_only_cl; task_specific->execute_on_a_specific_worker = 1; task_specific->workerid = 0; /* Only a CUDA device could execute that task ! */ ret = starpu_task_submit(task_specific); STARPU_ASSERT(ret == -ENODEV); task_specific->destroy = 0; starpu_task_destroy(task_specific); starpu_shutdown(); return EXIT_SUCCESS; } #endif starpu-1.2.3+dfsg/tests/errorcheck/starpu_init_noworker.c000066400000000000000000000041021320135501600236670ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2012-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include "../helper.h" /* * Test that starpu_initialize returns ENODEV when no worker is available */ #if !defined(STARPU_HAVE_UNSETENV) #warning unsetenv is not defined. Skipping test int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else static void unset_env_variables(void) { (void) unsetenv("STARPU_NCPUS"); (void) unsetenv("STARPU_NCPU"); (void) unsetenv("STARPU_NCUDA"); (void) unsetenv("STARPU_NOPENCL"); (void) unsetenv("STARPU_NMIC"); (void) unsetenv("STARPU_NSCC"); } int main(int argc, char **argv) { int ret; unset_env_variables(); /* We try to initialize StarPU without any worker */ struct starpu_conf conf; starpu_conf_init(&conf); conf.ncpus = 0; conf.ncuda = 0; conf.nopencl = 0; conf.nmic = 0; conf.nscc = 0; /* starpu_init should return -ENODEV */ ret = starpu_initialize(&conf, &argc, &argv); if (ret == -ENODEV) return EXIT_SUCCESS; else { unsigned ncpu = starpu_cpu_worker_get_count(); unsigned ncuda = starpu_cuda_worker_get_count(); unsigned nopencl = starpu_opencl_worker_get_count(); FPRINTF(stderr, "StarPU has found :\n"); FPRINTF(stderr, "\t%u CPU cores\n", ncpu); FPRINTF(stderr, "\t%u CUDA devices\n", ncuda); FPRINTF(stderr, "\t%u OpenCL devices\n", nopencl); return EXIT_FAILURE; } } #endif starpu-1.2.3+dfsg/tests/fortran90/000077500000000000000000000000001320135501600167345ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/fortran90/init_01.f90000066400000000000000000000015141320135501600205200ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2015 Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ! ! See the GNU Lesser General Public License in COPYING.LGPL for more details. PROGRAM init_01 USE starpu_mod USE iso_c_binding IMPLICIT NONE INTEGER(KIND=C_INT) :: res res = starpu_init(C_NULL_PTR) IF (res /= 0) THEN STOP 77 END IF CALL starpu_shutdown() END PROGRAM init_01 starpu-1.2.3+dfsg/tests/helper.h000066400000000000000000000103731320135501600165440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef _TESTS_HELPER_H #define _TESTS_HELPER_H #include #include #ifdef HAVE_GETRLIMIT #include #endif #ifdef STARPU_HAVE_VALGRIND_H #include #endif #ifdef STARPU_HAVE_HELGRIND_H #include #endif #define STARPU_TEST_SKIPPED 77 //void *ALL_IS_OK = (void *)123456789L; //void *ALL_IS_NOT_OK = (void *)987654321L; // //#define STARPU_CHECK_MALLOC(ptr) {if (!ptr) { fprintf(stderr, "starpu_malloc failed\n"); return 1; }} //#define STARPU_CHECK_MALLOC_HAS_FAILED(ptr) {if (ptr) { fprintf(stderr, "starpu_malloc should have failed\n"); return 1; }} //#define STARPU_CHECK_MALLOC_THREAD(ptr) {if (!ptr) { fprintf(stderr, "starpu_malloc failed\n"); return ALL_IS_NOT_OK; }} //#define STARPU_CHECK_MALLOC_HAS_FAILED_THREAD(ptr) {if (ptr) { fprintf(stderr, "starpu_malloc should have failed\n"); return ALL_IS_NOT_OK; }} //#define STARPU_CHECK_RETURN_VALUE_THREAD(err, message) {if (err < 0) { perror(message); return ALL_IS_NOT_OK; }} //#define STARPU_CHECK_RETURN_VALUE_IS_THREAD(err, value, message) {if (err >= 0 || errno != value) { perror(message); return ALL_IS_NOT_OK; }} //#define STARPU_TEST_OUTPUT #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #if defined(STARPU_HAVE_VALGRIND_H) && !defined(STARPU_VALGRIND_FULL) static int _starpu_valgrind_print_once STARPU_ATTRIBUTE_UNUSED = 0; # define STARPU_SKIP_IF_VALGRIND \ do \ { \ if(STARPU_RUNNING_ON_VALGRIND) \ { \ STARPU_HG_DISABLE_CHECKING(_starpu_valgrind_print_once); \ if (!_starpu_valgrind_print_once) \ { \ FPRINTF(stderr, "Running on valgrind, skipping the actual computations\n"); \ _starpu_valgrind_print_once = 1; \ } \ return; \ } \ } while(0) # define STARPU_SKIP_IF_VALGRIND_RETURN_ZERO \ do \ { \ if(STARPU_RUNNING_ON_VALGRIND) \ { \ STARPU_HG_DISABLE_CHECKING(_starpu_valgrind_print_once); \ if (!_starpu_valgrind_print_once) \ { \ FPRINTF(stderr, "Running on valgrind, skipping the actual computations\n"); \ _starpu_valgrind_print_once = 1; \ } \ return 0; \ } \ } while(0) # define STARPU_SKIP_IF_VALGRIND_RETURN_SKIP \ do \ { \ if(STARPU_RUNNING_ON_VALGRIND) \ { \ STARPU_HG_DISABLE_CHECKING(_starpu_valgrind_print_once); \ if (!_starpu_valgrind_print_once) \ { \ FPRINTF(stderr, "Running on valgrind, skipping the actual computations\n"); \ _starpu_valgrind_print_once = 1; \ } \ return STARPU_TEST_SKIPPED; \ } \ } while(0) # define STARPU_RETURN(ret) \ do \ { \ if(STARPU_RUNNING_ON_VALGRIND) \ { \ FPRINTF(stderr, "Running on valgrind, ignoring return value\n"); \ return 0; \ } \ else return ret; \ } while(0) #else /* defined(STARPU_HAVE_VALGRIND_H) && !defined(STARPU_VALGRIND_FULL) */ # define STARPU_RETURN(ret) return ret # define STARPU_SKIP_IF_VALGRIND # define STARPU_SKIP_IF_VALGRIND_RETURN_ZERO # define STARPU_SKIP_IF_VALGRIND_RETURN_SKIP #endif /* defined(STARPU_HAVE_VALGRIND_H) && !defined(STARPU_VALGRIND_FULL) */ #ifndef ANNOTATE_HAPPENS_BEFORE #define ANNOTATE_HAPPENS_BEFORE(obj) ((void)0) #endif #ifndef ANNOTATE_HAPPENS_BEFORE_FORGET_ALL #define ANNOTATE_HAPPENS_BEFORE_FORGET_ALL(obj) ((void)0) #endif #ifndef ANNOTATE_HAPPENS_AFTER #define ANNOTATE_HAPPENS_AFTER(obj) ((void)0) #endif static inline void disable_coredump(void) { #ifdef HAVE_GETRLIMIT struct rlimit rlim = { 0, 0 }; setrlimit(RLIMIT_CORE, &rlim); #endif } #endif /* _TESTS_HELPER_H */ starpu-1.2.3+dfsg/tests/helper/000077500000000000000000000000001320135501600163675ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/helper/cublas_init.c000066400000000000000000000035641320135501600210370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include "../helper.h" /* * Test initializing cublas, and how much time that takes */ static double start; static double end; //static float *data = NULL; int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); unsigned ngpus = starpu_cuda_worker_get_count(); double init_timing; double shutdown_timing; start = starpu_timing_now(); starpu_cublas_init(); end = starpu_timing_now(); init_timing = end - start; start = starpu_timing_now(); starpu_cublas_shutdown(); end = starpu_timing_now(); shutdown_timing = end - start; FPRINTF(stderr, "Total:\n"); FPRINTF(stderr, "\tinit: %2.2f us\n", init_timing/(1000)); FPRINTF(stderr, "\tshutdown: %2.2f us\n", shutdown_timing/(1000)); if (ngpus != 0) { FPRINTF(stderr, "per-GPU (#gpu = %u):\n", ngpus); FPRINTF(stderr, "\tinit: %2.2f us\n", init_timing/(1000*ngpus)); FPRINTF(stderr, "\tshutdown: %2.2f us\n", shutdown_timing/(1000*ngpus)); } starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/helper/cusparse_init.c000066400000000000000000000035771320135501600214170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014, 2016-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include "../helper.h" /* * Test initializing cusparse, and how much time that takes */ static double start; static double end; //static float *data = NULL; int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); unsigned ngpus = starpu_cuda_worker_get_count(); double init_timing; double shutdown_timing; start = starpu_timing_now(); starpu_cusparse_init(); end = starpu_timing_now(); init_timing = end - start; start = starpu_timing_now(); starpu_cusparse_shutdown(); end = starpu_timing_now(); shutdown_timing = end - start; FPRINTF(stderr, "Total:\n"); FPRINTF(stderr, "\tinit: %2.2f us\n", init_timing/(1000)); FPRINTF(stderr, "\tshutdown: %2.2f us\n", shutdown_timing/(1000)); if (ngpus != 0) { FPRINTF(stderr, "per-GPU (#gpu = %u):\n", ngpus); FPRINTF(stderr, "\tinit: %2.2f us\n", init_timing/(1000*ngpus)); FPRINTF(stderr, "\tshutdown: %2.2f us\n", shutdown_timing/(1000*ngpus)); } starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/helper/execute_on_all.c000066400000000000000000000027131320135501600215240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include "../helper.h" /* * Test executing a function on all workers */ void func(void *arg) { int *ptr = (int *) arg; STARPU_ASSERT(*ptr == 0x42); } int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); int arg = 0x42; starpu_execute_on_each_worker(func, &arg, STARPU_CPU|STARPU_CUDA|STARPU_OPENCL); starpu_execute_on_each_worker(func, &arg, STARPU_CPU); starpu_execute_on_each_worker(func, &arg, STARPU_CUDA); starpu_execute_on_each_worker(func, &arg, STARPU_OPENCL); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/helper/pinned_memory.c000066400000000000000000000024701320135501600214030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Test calling starpu_malloc, i.e. allocating pinned memory */ #define NITER 10 #define SIZE (4*1024*1024*sizeof(float)) static float *data = NULL; int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); unsigned iter; for (iter = 0; iter < NITER; iter++) { ret = starpu_malloc((void **)&data, SIZE); STARPU_CHECK_RETURN_VALUE(ret, "starpu_malloc"); starpu_free(data); } starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/helper/starpu_create_sync_task.c000066400000000000000000000046741320135501600234650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Test starpu_create_sync_task */ #define NITER 10 void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .nbuffers = 0 }; static int create_dummy_task(starpu_tag_t tag) { struct starpu_task *task = starpu_task_create(); task->use_tag = 1; task->tag_id = tag; task->cl = &dummy_codelet; int ret = starpu_task_submit(task); return ret; } int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_tag_t sync_tags[NITER]; unsigned iter; for (iter = 0; iter < NITER; iter++) { starpu_tag_t sync_tag = (starpu_tag_t)iter*100; sync_tags[iter] = sync_tag; unsigned ndeps = 10; starpu_tag_t deps[ndeps]; unsigned d; for (d = 0; d < ndeps; d++) { deps[d] = sync_tag + d + 1; ret = create_dummy_task(deps[d]); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_create_sync_task(sync_tag, ndeps, deps, NULL, NULL); } /* Wait all the synchronization tasks */ ret = starpu_tag_wait_array(NITER, sync_tags); STARPU_CHECK_RETURN_VALUE(ret, "starpu_tag_wait_array"); starpu_shutdown(); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/helper/starpu_data_cpy.c000066400000000000000000000032161320135501600217170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2013, 2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" /* * Test starpu_data_cpy */ int main(int argc, char **argv) { int ret; int var1, var2; starpu_data_handle_t var1_handle, var2_handle; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); var1 = 42; var2 = 12; starpu_variable_data_register(&var1_handle, STARPU_MAIN_RAM, (uintptr_t)&var1, sizeof(var1)); starpu_variable_data_register(&var2_handle, STARPU_MAIN_RAM, (uintptr_t)&var2, sizeof(var2)); ret = starpu_data_cpy(var2_handle, var1_handle, 0, NULL, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_cpy"); starpu_data_acquire(var2_handle, STARPU_R); ret = EXIT_SUCCESS; if (var2 != var1) { FPRINTF(stderr, "var2 is %d but it should be %d\n", var2, var1); ret = EXIT_FAILURE; } starpu_data_release(var2_handle); starpu_data_unregister(var1_handle); starpu_data_unregister(var2_handle); starpu_shutdown(); STARPU_RETURN(ret); } starpu-1.2.3+dfsg/tests/loader-cross.sh.in000066400000000000000000000023421320135501600204470ustar00rootroot00000000000000#!/bin/bash # # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2013, 2015 Universite de Bordeaux # Copyright (C) 2015 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. top_srcdir="@top_srcdir@" export top_builddir="@top_builddir@" exec="$1" shift if test -z "$exec" then echo "[Error] Syntax: $0 " exit 1 fi NATIVE=${PWD/\/build_mic\//\/build_host\/} DIR="$(dirname "$exec")" FILE="$(basename "$exec")" export SINK_LD_LIBRARY_PATH="$top_builddir/src/.libs:$SINK_LD_LIBRARY_PATH" export STARPU_MIC_SINK_PROGRAM_NAME="$exec" # in case libtool got into play [ -x "$DIR/.libs/$FILE" ] && STARPU_MIC_SINK_PROGRAM_NAME="$DIR/.libs/$FILE" $top_builddir/../build_host/tests/loader "$NATIVE/$exec" "$@" starpu-1.2.3+dfsg/tests/loader.c000066400000000000000000000215141320135501600165250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2014-2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #if defined(_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__) #include #else #include #endif #ifdef STARPU_QUICK_CHECK /* Quick checks are supposed to be real quick, typically less than 1s each, sometimes 10s */ #define DEFAULT_TIMEOUT 60 #elif !defined(STARPU_LONG_CHECK) /* Normal checks are supposed to be short enough, typically less than 10s each, sometimes 1-2m */ #define DEFAULT_TIMEOUT 300 #else /* Long checks can be very long */ #define DEFAULT_TIMEOUT 1800 #endif #define AUTOTEST_SKIPPED_TEST 77 static pid_t child_pid = 0; static int timeout; #if defined(_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__) static int mygettimeofday(struct timeval *tv, void *tz) { if (tv) { FILETIME ft; unsigned long long res; GetSystemTimeAsFileTime(&ft); /* 100-nanosecond intervals since January 1, 1601 */ res = ft.dwHighDateTime; res <<= 32; res |= ft.dwLowDateTime; res /= 10; /* Now we have microseconds */ res -= (((1970-1601)*365) + 89) * 24ULL * 3600ULL * 1000000ULL; /* Now we are based on epoch */ tv->tv_sec = res / 1000000ULL; tv->tv_usec = res % 1000000ULL; } } #else #define mygettimeofday(tv,tz) gettimeofday(tv,tz) #endif #ifdef STARPU_GDB_PATH static int try_launch_gdb(const char *exe, const char *core) { # define GDB_ALL_COMMAND "thread apply all bt full" # define GDB_COMMAND "bt full" int err; pid_t pid; struct stat st; const char *top_builddir; char *gdb; err = stat(core, &st); if (err != 0) { fprintf(stderr, "while looking for core file of %s: %s: %m\n", exe, core); return -1; } if (!(st.st_mode & S_IFREG)) { fprintf(stderr, "%s: not a regular file\n", core); return -1; } top_builddir = getenv("top_builddir"); pid = fork(); switch (pid) { case 0: /* kid */ if (top_builddir != NULL) { /* Run gdb with Libtool. */ gdb = alloca(strlen(top_builddir) + sizeof("/libtool") + 1); strcpy(gdb, top_builddir); strcat(gdb, "/libtool"); err = execl(gdb, "gdb", "--mode=execute", STARPU_GDB_PATH, "--batch", "-ex", GDB_COMMAND, "-ex", GDB_ALL_COMMAND, exe, core, NULL); } else { /* Run gdb directly */ gdb = STARPU_GDB_PATH; err = execl(gdb, "gdb", "--batch", "-ex", GDB_COMMAND, "-ex", GDB_ALL_COMMAND, exe, core, NULL); } if (err != 0) { fprintf(stderr, "while launching `%s': %m\n", gdb); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); break; case -1: fprintf(stderr, "fork: %m\n"); return -1; default: /* parent */ { pid_t who; int status; who = waitpid(pid, &status, 0); if (who != pid) fprintf(stderr, "while waiting for gdb " "process %d: %m\n", pid); } } return 0; # undef GDB_COMMAND # undef GDB_ALL_COMMAND } #endif /* STARPU_GDB_PATH */ static void launch_gdb(const char *exe) { #ifdef STARPU_GDB_PATH char s[32]; snprintf(s, sizeof(s), "core.%d", child_pid); if (try_launch_gdb(exe, s) < 0) try_launch_gdb(exe, "core"); #endif /* STARPU_GDB_PATH */ } static char *test_name; static void test_cleaner(int sig) { pid_t child_gid; int status; // send signal to all loader family members fprintf(stderr, "[error] test %s has been blocked for %d seconds. Mark it as failed\n", test_name, timeout); child_gid = getpgid(child_pid); kill(-child_gid, SIGQUIT); waitpid(child_pid, &status, 0); launch_gdb(test_name); exit(EXIT_FAILURE); } static int _decode(char **src, char *motif, const char *value) { char *found; found = strstr(*src, motif); if (found == NULL) return 0; char *new_src = calloc(1, strlen(*src)-strlen(motif)+strlen(value)+1); strncpy(new_src, *src, found - *src); strcat(new_src, value); strcat(new_src, found+strlen(motif)); *src = new_src; return 1; } static void decode(char **src, char *motif, const char *value) { if (*src) { if (strstr(*src, motif) && value == NULL) { fprintf(stderr, "error: $%s undefined\n", motif); exit(EXIT_FAILURE); } int d = _decode(src, motif, value); while (d) d = _decode(src, motif, value); } } int main(int argc, char *argv[]) { int child_exit_status; char *test_args; char *launcher; char *launcher_args; struct sigaction sa; int ret; struct timeval start; struct timeval end; double timing; test_args = NULL; timeout = 0; test_name = argv[1]; if (!test_name) { fprintf(stderr, "[error] Need name of program to start\n"); exit(EXIT_FAILURE); } if (strstr(test_name, "spmv/dw_block_spmv")) { test_args = (char *) calloc(150, sizeof(char)); sprintf(test_args, "%s/examples/spmv/matrix_market/examples/fidapm05.mtx", STARPU_SRC_DIR); } else if (strstr(test_name, "starpu_perfmodel_display")) { test_args = (char *) calloc(5, sizeof(char)); sprintf(test_args, "-l"); } else if (strstr(test_name, "starpu_perfmodel_plot")) { test_args = (char *) calloc(5, sizeof(char)); sprintf(test_args, "-l"); } /* get launcher program */ launcher=getenv("STARPU_CHECK_LAUNCHER"); launcher_args=getenv("STARPU_CHECK_LAUNCHER_ARGS"); if (launcher_args) launcher_args=strdup(launcher_args); /* get user-defined iter_max value */ if (getenv("STARPU_TIMEOUT_ENV")) timeout = strtol(getenv("STARPU_TIMEOUT_ENV"), NULL, 10); if (timeout <= 0) timeout = DEFAULT_TIMEOUT; /* set SIGALARM handler */ sa.sa_flags = 0; sigemptyset(&sa.sa_mask); sa.sa_handler = test_cleaner; if (-1 == sigaction(SIGALRM, &sa, NULL)) perror("sigaction"); child_pid = fork(); if (child_pid == 0) { // get a new pgid if (setpgid(0, 0) == -1) { perror("setpgid"); fprintf(stderr, "[error] setpgid. Mark test as failed\n"); exit(EXIT_FAILURE); } if (launcher) { /* "Launchers" such as Valgrind need to be inserted * after the Libtool-generated wrapper scripts, hence * this special-case. */ const char *top_builddir = getenv ("top_builddir"); const char *top_srcdir = getenv("top_srcdir"); if (top_builddir != NULL) { char *launcher_argv[100]; int i=3; char libtool[strlen(top_builddir) + sizeof("libtool") + 1]; strcpy(libtool, top_builddir); strcat(libtool, "/libtool"); decode(&launcher_args, "@top_srcdir@", top_srcdir); launcher_argv[0] = libtool; launcher_argv[1] = "--mode=execute"; launcher_argv[2] = launcher; launcher_argv[i] = strtok(launcher_args, " "); while (launcher_argv[i]) { i++; launcher_argv[i] = strtok(NULL, " "); } launcher_argv[i] = test_name; launcher_argv[i+1] = test_args; launcher_argv[i+2] = NULL; execvp(*launcher_argv, launcher_argv); } else { fprintf(stderr, "warning: $top_builddir undefined, " "so $STARPU_CHECK_LAUNCHER ignored\n"); execl(test_name, test_name, test_args, NULL); } } else execl(test_name, test_name, test_args, NULL); fprintf(stderr, "[error] '%s' failed to exec. test marked as failed\n", test_name); exit(EXIT_FAILURE); } if (child_pid == -1) { fprintf(stderr, "[error] fork. test marked as failed\n"); exit(EXIT_FAILURE); } free(test_args); ret = EXIT_SUCCESS; gettimeofday(&start, NULL); alarm(timeout); if (child_pid == waitpid(child_pid, &child_exit_status, 0)) { if (WIFEXITED(child_exit_status)) { int status = WEXITSTATUS(child_exit_status); if (status == EXIT_SUCCESS) { alarm(0); } else { if (status != AUTOTEST_SKIPPED_TEST) fprintf(stdout, "`%s' exited with return code %d\n", test_name, status); ret = status; } } else if (WIFSIGNALED(child_exit_status)) { fprintf(stderr, "[error] `%s' killed with signal %d; test marked as failed\n", test_name, WTERMSIG(child_exit_status)); launch_gdb(test_name); ret = EXIT_FAILURE; } else { fprintf(stderr, "[error] `%s' did not terminate normally; test marked as failed\n", test_name); ret = EXIT_FAILURE; } } gettimeofday(&end, NULL); timing = (double)((end.tv_sec - start.tv_sec)*1000000 + (end.tv_usec - start.tv_usec)); fprintf(stderr, "#Execution_time_in_seconds %f %s\n", timing/1000000, test_name); return ret; } starpu-1.2.3+dfsg/tests/main/000077500000000000000000000000001320135501600160345ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/main/codelet_null_callback.c000066400000000000000000000052701320135501600224710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013, 2014 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" /* * Test passing a NULL codelet, but callbacks */ static void callback(void *ptr) { int *x = (int *)ptr; FPRINTF(stderr, "x=%d\n", *x); STARPU_ASSERT_MSG(*x == 40, "%d != %d\n", *x, 40); (*x)++; } static void callback2(void *ptr) { int *x2 = (int *)ptr; FPRINTF(stderr, "x2=%d\n", *x2); STARPU_ASSERT_MSG(*x2 == 41, "%d != %d\n", *x2, 41); (*x2)++; } static void prologue_callback(void *ptr) { int *y = (int *)ptr; FPRINTF(stderr, "y=%d\n", *y); STARPU_ASSERT_MSG(*y == 12, "%d != %d\n", *y, 12); (*y)++; } static void prologue_callback_pop(void *ptr) { int *z = (int *)ptr; FPRINTF(stderr, "z=%d\n", *z); STARPU_ASSERT_MSG(*z == 32, "%d != %d\n", *z, 32); (*z)++; } int main(int argc, char **argv) { int ret; int x=40; int x2=41; int y=12; int z=32; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_task_insert(NULL, STARPU_CALLBACK_WITH_ARG, callback, &x, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); ret = starpu_task_insert(NULL, STARPU_CALLBACK, callback2, STARPU_CALLBACK_ARG, &x2, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); ret = starpu_task_insert(NULL, STARPU_PROLOGUE_CALLBACK, prologue_callback, STARPU_PROLOGUE_CALLBACK_ARG, &y, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); ret = starpu_task_insert(NULL, STARPU_PROLOGUE_CALLBACK_POP, prologue_callback_pop, STARPU_PROLOGUE_CALLBACK_POP_ARG, &z, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); starpu_task_wait_for_all(); STARPU_ASSERT_MSG(x == 41, "x should be equal to %d and not %d\n", 41, x); STARPU_ASSERT_MSG(x2 == 42, "x2 should be equal to %d and not %d\n", 42, x2); STARPU_ASSERT_MSG(y == 13, "y should be equal to %d and not %d\n", 13, y); STARPU_ASSERT_MSG(z == 33, "z should be equal to %d and not %d\n", 33, z); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/main/declare_deps_after_submission.c000066400000000000000000000053261320135501600242540ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Test that we can declare a dependency after submitting a non-auto-destroy task */ #ifdef STARPU_QUICK_CHECK #define NLOOPS 4 #else #define NLOOPS 128 #endif void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 0 }; static struct starpu_task *create_dummy_task(void) { struct starpu_task *task = starpu_task_create(); task->cl = &dummy_codelet; task->cl_arg = NULL; return task; } int main(int argc, char **argv) { int ret; unsigned loop, nloops = NLOOPS; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); for (loop = 0; loop < nloops; loop++) { struct starpu_task *taskA, *taskB; taskA = create_dummy_task(); taskB = create_dummy_task(); /* By default, dynamically allocated tasks are destroyed at * termination, we cannot declare a dependency on something * that does not exist anymore. */ taskA->destroy = 0; taskA->detach = 0; /* we wait for the tasks explicitly */ taskB->detach = 0; ret = starpu_task_submit(taskA); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_task_declare_deps_array(taskB, 1, &taskA); ret = starpu_task_submit(taskB); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(taskB); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(taskA); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_task_destroy(taskA); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/main/declare_deps_after_submission_synchronous.c000066400000000000000000000053441320135501600267260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Test that we can declare a dependency after submitting a non-auto-destroy synchronous task */ #ifdef STARPU_QUICK_CHECK #define NLOOPS 4 #else #define NLOOPS 128 #endif void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 0 }; static struct starpu_task *create_dummy_task(void) { struct starpu_task *task = starpu_task_create(); task->cl = &dummy_codelet; task->cl_arg = NULL; return task; } int main(int argc, char **argv) { int ret; unsigned loop, nloops=NLOOPS; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); struct starpu_task *taskA, *taskB; for (loop = 0; loop < nloops; loop++) { taskA = create_dummy_task(); taskB = create_dummy_task(); /* By default, dynamically allocated tasks are destroyed at * termination, we cannot declare a dependency on something * that does not exist anymore. */ taskA->destroy = 0; taskA->synchronous = 1; ret = starpu_task_submit(taskA); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_task_declare_deps_array(taskB, 1, &taskA); taskB->synchronous = 1; ret = starpu_task_submit(taskB); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_task_destroy(taskA); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_shutdown(); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/declare_deps_in_callback.c000066400000000000000000000051441320135501600231200ustar00rootroot00000000000000 /* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Test that we can declare deps from the callback of the task */ #ifdef STARPU_QUICK_CHECK #define NLOOPS 4 #else #define NLOOPS 128 #endif static void callback(void *arg) { struct starpu_task *taskA, *taskB; int ret; taskA = starpu_task_get_current(); taskB = (struct starpu_task *) arg; starpu_task_declare_deps_array(taskB, 1, &taskA); ret = starpu_task_submit(taskB); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 0 }; static struct starpu_task *create_dummy_task(void) { struct starpu_task *task = starpu_task_create(); task->cl = &dummy_codelet; task->cl_arg = NULL; return task; } int main(int argc, char **argv) { int ret; unsigned loop; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); struct starpu_task *taskA, *taskB; for (loop = 0; loop < NLOOPS; loop++) { taskA = create_dummy_task(); taskB = create_dummy_task(); taskA->callback_func = callback; taskA->callback_arg = taskB; ret = starpu_task_submit(taskA); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_shutdown(); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/deploop.c000066400000000000000000000046271320135501600176530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013, 2015-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Create task A and B such that * - B depends on A by tag dependency. * - A would depend on B by data dependency, but we disable that by disabling * sequential consistency. */ void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { FPRINTF(stderr,"executing task %p\n", starpu_task_get_current()); } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .model = NULL, .nbuffers = 1, .modes = { STARPU_RW } }; int main(int argc, char **argv) { int ret; starpu_data_handle_t handle; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_void_data_register(&handle); struct starpu_task *taskA, *taskB; /* Make B depend on A */ starpu_tag_declare_deps(1, 1, (starpu_tag_t) 0); taskA = starpu_task_create(); taskA->cl = &dummy_codelet; taskA->tag_id = 0; taskA->use_tag = 1; taskA->handles[0] = handle; taskA->sequential_consistency = 0; FPRINTF(stderr,"A is %p\n", taskA); taskB = starpu_task_create(); taskB->cl = &dummy_codelet; taskB->tag_id = 1; taskB->use_tag = 1; taskB->handles[0] = handle; FPRINTF(stderr,"B is %p\n", taskB); ret = starpu_task_submit(taskB); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; ret = starpu_task_submit(taskA); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_data_unregister(handle); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/main/deprecated_func.c000066400000000000000000000070311320135501600213140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012, 2013, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Test that we support the cpu_func and where deprecated field */ void cpu_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { int *valin = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); int *valout = (int *)STARPU_VARIABLE_GET_PTR(descr[1]); *valout = *valin; } void cpu2_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { int *valin = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); int *valout = (int *)STARPU_VARIABLE_GET_PTR(descr[1]); *valout = *valin*2; } struct starpu_codelet cl_cpu_funcs = { .where = STARPU_CPU, .cpu_funcs = {cpu_codelet}, .cpu_funcs_name = {"cpu_codelet"}, .nbuffers = 2, .name = "cpu_funcs", }; struct starpu_codelet cl_cpu_func = { .where = STARPU_CPU, .cpu_func = cpu_codelet, .cpu_funcs_name = {"cpu_codelet"}, .nbuffers = 2, .name = "cpu_func", }; struct starpu_codelet cl_cpu_multiple = { .where = STARPU_CPU, .cpu_func = STARPU_MULTIPLE_CPU_IMPLEMENTATIONS, .cpu_funcs = {cpu_codelet}, .cpu_funcs_name = {"cpu_codelet"}, .nbuffers = 2, .name = "cpu_multiple", }; struct starpu_codelet cl_cpu_func_funcs = { .where = STARPU_CPU, .cpu_func = cpu2_codelet, .cpu_funcs = {cpu_codelet}, .cpu_funcs_name = {"cpu_codelet"}, .nbuffers = 2, .name = "cpu_func_funcs", }; static int submit_codelet(struct starpu_codelet cl, int where) { int x=42, y=14; starpu_data_handle_t handles[2]; int ret; starpu_variable_data_register(&handles[0], STARPU_MAIN_RAM, (uintptr_t)&x, sizeof(x)); starpu_variable_data_register(&handles[1], STARPU_MAIN_RAM, (uintptr_t)&y, sizeof(y)); cl.where = where; ret = starpu_task_insert(&cl, STARPU_R, handles[0], STARPU_W, handles[1], 0); if (ret == -ENODEV) { FPRINTF(stderr, "cannot execute codelet <%s> with where=%d\n", cl.name, where); starpu_data_unregister(handles[0]); starpu_data_unregister(handles[1]); return ret; } starpu_task_wait_for_all(); starpu_data_unregister(handles[0]); starpu_data_unregister(handles[1]); if (x != y) { FPRINTF(stderr, "error when executing codelet <%s> with where=%d\n", cl.name, where); } else { FPRINTF(stderr, "success when executing codelet <%s> with where=%d\n", cl.name, where); } return x != y; } int main(int argc, char **argv) { int ret; unsigned where; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); for(where=0 ; where<=STARPU_CPU ; where+=STARPU_CPU) { ret = submit_codelet(cl_cpu_func, where); if (ret == -ENODEV) { starpu_shutdown(); fprintf(stderr, "WARNING: No one can execute this task\n"); return STARPU_TEST_SKIPPED; } if (!ret) { ret = submit_codelet(cl_cpu_funcs, where); } if (!ret) { ret = submit_codelet(cl_cpu_multiple, where); } if (!ret) { ret = submit_codelet(cl_cpu_func_funcs, where); } } starpu_shutdown(); STARPU_RETURN(ret); } starpu-1.2.3+dfsg/tests/main/driver_api/000077500000000000000000000000001320135501600201605ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/main/driver_api/init_run_deinit.c000066400000000000000000000145011320135501600235100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../../helper.h" #if !defined(STARPU_HAVE_UNSETENV) #warning unsetenv is not defined. Skipping test int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else #define NTASKS 8 #if defined(STARPU_USE_CPU) || defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) void dummy(void *buffers[], void *args) { (void) buffers; (*(int *)args)++; } static struct starpu_codelet cl = { .cpu_funcs = { dummy }, .cuda_funcs = { dummy }, .opencl_funcs = { dummy }, .nbuffers = 0 }; static void init_driver(struct starpu_driver *d) { int ret; ret = starpu_driver_init(d); STARPU_CHECK_RETURN_VALUE(ret, "starpu_driver_init"); } static void run(struct starpu_task *task, struct starpu_driver *d) { int ret; ret = starpu_task_submit(task); starpu_do_schedule(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); while (!starpu_task_finished(task)) { ret = starpu_driver_run_once(d); STARPU_CHECK_RETURN_VALUE(ret, "starpu_driver_run_once"); } ret = starpu_task_wait(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); } static void deinit_driver(struct starpu_driver *d) { int ret; ret = starpu_driver_deinit(d); STARPU_CHECK_RETURN_VALUE(ret, "starpu_driver_deinit"); } #endif /* STARPU_USE_CPU || STARPU_USE_CUDA || STARPU_USE_OPENCL */ #ifdef STARPU_USE_CPU static int test_cpu(void) { int var = 0, ret, ncpu; struct starpu_conf conf; ret = starpu_conf_init(&conf); if (ret == -EINVAL) return 1; struct starpu_driver d = { .type = STARPU_CPU_WORKER, .id.cpu_id = 0 }; conf.not_launched_drivers = &d; conf.n_not_launched_drivers = 1; ret = starpu_init(&conf); if (ret == -ENODEV) { FPRINTF(stderr, "WARNING: No CPU worker found\n"); return STARPU_TEST_SKIPPED; } ncpu = starpu_cpu_worker_get_count(); if (ncpu == 0) { FPRINTF(stderr, "WARNING: No CPU worker found\n"); return STARPU_TEST_SKIPPED; } init_driver(&d); int i; for (i = 0; i < NTASKS; i++) { struct starpu_task *task; task = starpu_task_create(); cl.where = STARPU_CPU; task->cl = &cl; task->cl_arg = &var; task->detach = 0; run(task, &d); } deinit_driver(&d); starpu_task_wait_for_all(); starpu_shutdown(); FPRINTF(stderr, "[CPU] Var is %d (expected value: %d)\n", var, NTASKS); return !!(var != NTASKS); } #endif /* STARPU_USE_CPU */ #ifdef STARPU_USE_CUDA static int test_cuda(void) { int var = 0, ret, ncuda; struct starpu_conf conf; ret = starpu_conf_init(&conf); if (ret == -EINVAL) return 1; struct starpu_driver d = { .type = STARPU_CUDA_WORKER, .id.cuda_id = 0 }; conf.ncuda = 1; conf.nopencl = 0; conf.not_launched_drivers = &d; conf.n_not_launched_drivers = 1; ret = starpu_init(&conf); if (ret == -ENODEV) { FPRINTF(stderr, "WARNING: No CUDA worker found\n"); return STARPU_TEST_SKIPPED; } ncuda = starpu_cuda_worker_get_count(); if (ncuda == 0) { FPRINTF(stderr, "WARNING: No CUDA worker found\n"); return STARPU_TEST_SKIPPED; } init_driver(&d); int i; for (i = 0; i < NTASKS; i++) { struct starpu_task *task; task = starpu_task_create(); cl.where = STARPU_CUDA; task->cl = &cl; task->cl_arg = &var; task->detach = 0; run(task, &d); } deinit_driver(&d); starpu_task_wait_for_all(); starpu_shutdown(); FPRINTF(stderr, "[CUDA] Var is %d (expected value: %d)\n", var, NTASKS); return !!(var != NTASKS); } #endif /* STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL static int test_opencl(void) { cl_int err; cl_platform_id platform; cl_uint pdummy; int nopencl; err = clGetPlatformIDs(1, &platform, &pdummy); if (err != CL_SUCCESS) { FPRINTF(stderr, "WARNING: No OpenCL platform found\n"); return STARPU_TEST_SKIPPED; } cl_device_type device_type = CL_DEVICE_TYPE_GPU|CL_DEVICE_TYPE_ACCELERATOR; if (starpu_get_env_number("STARPU_OPENCL_ON_CPUS") > 0) device_type |= CL_DEVICE_TYPE_CPU; if (starpu_get_env_number("STARPU_OPENCL_ONLY_ON_CPUS") > 0) device_type = CL_DEVICE_TYPE_CPU; cl_device_id device_id; err = clGetDeviceIDs(platform, device_type, 1, &device_id, NULL); if (err != CL_SUCCESS) { FPRINTF(stderr, "WARNING: No GPU devices found on OpenCL platform\n"); return STARPU_TEST_SKIPPED; } int var = 0, ret; struct starpu_conf conf; ret = starpu_conf_init(&conf); if (ret == -EINVAL) return 1; struct starpu_driver d = { .type = STARPU_OPENCL_WORKER, .id.opencl_id = device_id }; conf.ncuda = 0; conf.nopencl = 1; conf.not_launched_drivers = &d; conf.n_not_launched_drivers = 1; ret = starpu_init(&conf); if (ret == -ENODEV) { FPRINTF(stderr, "WARNING: No OpenCL workers found\n"); return STARPU_TEST_SKIPPED; } nopencl = starpu_opencl_worker_get_count(); if (nopencl == 0) { FPRINTF(stderr, "WARNING: No OpenCL workers found\n"); return STARPU_TEST_SKIPPED; } starpu_topology_print(stdout); init_driver(&d); int i; for (i = 0; i < NTASKS; i++) { struct starpu_task *task; task = starpu_task_create(); cl.where = STARPU_OPENCL; task->cl = &cl; task->cl_arg = &var; task->detach = 0; run(task, &d); } deinit_driver(&d); starpu_task_wait_for_all(); starpu_shutdown(); FPRINTF(stderr, "[OpenCL] Var is %d (expected value: %d)\n", var, NTASKS); return !!(var != NTASKS); } #endif /* STARPU_USE_OPENCL */ int main(void) { int ret = STARPU_TEST_SKIPPED; // Ignore environment variables as we want to force the exact number of workers unsetenv("STARPU_NCUDA"); unsetenv("STARPU_NOPENCL"); unsetenv("STARPU_NCPUS"); #ifdef STARPU_USE_CPU ret = test_cpu(); if (ret == 1) return ret; #endif #ifdef STARPU_USE_CUDA ret = test_cuda(); if (ret == 1) return ret; #endif #ifdef STARPU_USE_OPENCL ret = test_opencl(); if (ret == 1) return ret; #endif return ret; } #endif starpu-1.2.3+dfsg/tests/main/driver_api/run_driver.c000066400000000000000000000152561320135501600225140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../../helper.h" #if !defined(STARPU_HAVE_UNSETENV) #warning unsetenv is not defined. Skipping test int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else /* * Users can directly control drivers by using the starpu_driver* functions. * * This test makes sure that the starpu_driver_run function works for CPU, CUDA * and OpenCL drivers, and that the starpu_drivers_request_termination function * correctly shuts down all drivers. * * The test_* functions can return: * - 0 (success) * - 1 (failure) * - STARPU_TEST_SKIPPED (non-critical errors) */ #if defined(STARPU_USE_CPU) || defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) static void dummy(void *buffers[], void *args) { (void) buffers; (*(int *)args)++; usleep(100000); } static struct starpu_codelet cl = { .cpu_funcs = { dummy }, .cuda_funcs = { dummy }, .opencl_funcs = { dummy }, .nbuffers = 0 }; static void * run_driver(void *arg) { struct starpu_driver *d = (struct starpu_driver *) arg; int ret = starpu_driver_run(d); STARPU_CHECK_RETURN_VALUE(ret, "starpu_driver_run"); return NULL; } #endif /* STARPU_USE_CPU || STARPU_USE_CUDA || STARPU_USE_OPENCL */ #ifdef STARPU_USE_CPU static int test_cpu(void) { int ret, var = 0; static starpu_pthread_t driver_thread; struct starpu_conf conf; struct starpu_driver d = { .type = STARPU_CPU_WORKER, .id.cpu_id = 0 }; starpu_conf_init(&conf); conf.n_not_launched_drivers = 1; conf.not_launched_drivers = &d; conf.ncpus = 1; ret = starpu_init(&conf); if (ret == -ENODEV || starpu_cpu_worker_get_count() == 0) { FPRINTF(stderr, "WARNING: No CPU worker found\n"); if (ret == 0) starpu_shutdown(); return STARPU_TEST_SKIPPED; } ret = starpu_pthread_create(&driver_thread, NULL, run_driver, &d); if (ret != 0) { ret = 1; goto out2; } struct starpu_task *task; task = starpu_task_create(); cl.where = STARPU_CPU; task->cl = &cl; task->cl_arg = &var; task->synchronous = 1; ret = starpu_task_submit(task); if (ret == -ENODEV) { FPRINTF(stderr, "WARNING: No worker can execute this task\n"); ret = STARPU_TEST_SKIPPED; goto out; } FPRINTF(stderr, "[CPU] Var = %d (expected value: 1)\n", var); ret = !!(var != 1); out: starpu_drivers_request_termination(); if (starpu_pthread_join(driver_thread, NULL) != 0) return 1; out2: starpu_shutdown(); return ret; } #endif /* STARPU_USE_CPU */ #ifdef STARPU_USE_CUDA static int test_cuda(void) { int ret, var = 0; static starpu_pthread_t driver_thread; struct starpu_conf conf; struct starpu_driver d = { .type = STARPU_CUDA_WORKER, .id.cuda_id = 0 }; starpu_conf_init(&conf); conf.n_not_launched_drivers = 1; conf.not_launched_drivers = &d; conf.ncuda = 1; ret = starpu_init(&conf); if (ret == -ENODEV || starpu_cuda_worker_get_count() == 0) { FPRINTF(stderr, "WARNING: No CUDA worker found\n"); if (ret == 0) starpu_shutdown(); return STARPU_TEST_SKIPPED; } ret = starpu_pthread_create(&driver_thread, NULL, run_driver, &d); if (ret == -1) { ret = 1; goto out; } struct starpu_task *task; task = starpu_task_create(); cl.where = STARPU_CUDA; task->cl = &cl; task->cl_arg = &var; task->synchronous = 1; ret = starpu_task_submit(task); if (ret == -ENODEV) { FPRINTF(stderr, "WARNING: No worker can execute this task\n"); ret = STARPU_TEST_SKIPPED; goto out; } out: starpu_drivers_request_termination(); if (starpu_pthread_join(driver_thread, NULL) != 0) return 1; starpu_shutdown(); FPRINTF(stderr, "[CUDA] Var = %d (expected value: 1)\n", var); ret = !!(var != 1); return ret; } #endif /* STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL static int test_opencl(void) { int ret, var = 0; static starpu_pthread_t driver_thread; struct starpu_conf conf; cl_int err; cl_uint pdummy; cl_platform_id platform; err = clGetPlatformIDs(1, &platform, &pdummy); if (err != CL_SUCCESS) { FPRINTF(stderr, "WARNING: No OpenCL platform found\n"); return STARPU_TEST_SKIPPED; } cl_device_type device_type = CL_DEVICE_TYPE_GPU|CL_DEVICE_TYPE_ACCELERATOR; if (starpu_get_env_number("STARPU_OPENCL_ON_CPUS") > 0) device_type |= CL_DEVICE_TYPE_CPU; if (starpu_get_env_number("STARPU_OPENCL_ONLY_ON_CPUS") > 0) device_type = CL_DEVICE_TYPE_CPU; cl_device_id device_id; err = clGetDeviceIDs(platform, device_type, 1, &device_id, NULL); if (err != CL_SUCCESS) { FPRINTF(stderr, "WARNING: No GPU devices found on OpenCL platform\n"); return STARPU_TEST_SKIPPED; } struct starpu_driver d = { .type = STARPU_OPENCL_WORKER, .id.opencl_id = device_id }; starpu_conf_init(&conf); conf.n_not_launched_drivers = 1; conf.not_launched_drivers = &d; conf.ncuda = 0; conf.nopencl = 1; ret = starpu_init(&conf); if (ret == -ENODEV || starpu_opencl_worker_get_count() == 0) { FPRINTF(stderr, "WARNING: No OpenCL workers found\n"); if (ret == 0) starpu_shutdown(); return STARPU_TEST_SKIPPED; } ret = starpu_pthread_create(&driver_thread, NULL, run_driver, &d); if (ret == -1) { ret = 1; goto out; } struct starpu_task *task; task = starpu_task_create(); cl.where = STARPU_OPENCL; task->cl = &cl; task->cl_arg = &var; task->synchronous = 1; ret = starpu_task_submit(task); if (ret == -ENODEV) { FPRINTF(stderr, "WARNING: No worker can execute the task\n"); ret = STARPU_TEST_SKIPPED; goto out; } out: starpu_drivers_request_termination(); if (starpu_pthread_join(driver_thread, NULL) != 0) return 1; starpu_shutdown(); FPRINTF(stderr, "[OpenCL] Var = %d (expected value: 1)\n", var); ret = !!(var != 1); return ret; } #endif /* STARPU_USE_OPENCL */ int main(void) { int ret = STARPU_TEST_SKIPPED; // Ignore environment variables as we want to force the exact number of workers unsetenv("STARPU_NCUDA"); unsetenv("STARPU_NOPENCL"); unsetenv("STARPU_NCPUS"); #ifdef STARPU_USE_CPU ret = test_cpu(); if (ret == 1) return 1; #endif #ifdef STARPU_USE_CUDA ret = test_cuda(); if (ret == 1) return 1; #endif #ifdef STARPU_USE_OPENCL ret = test_opencl(); if (ret == 1) return 1; #endif return ret; } #endif starpu-1.2.3+dfsg/tests/main/empty_task.c000066400000000000000000000046311320135501600203640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011, 2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Measure the cost of a task with a NULL codelet */ #ifdef STARPU_QUICK_CHECK static unsigned ntasks = 64; #else static unsigned ntasks = 65536; #endif static void usage(char **argv) { FPRINTF(stderr, "%s [-i ntasks] [-h]\n", argv[0]); exit(-1); } static void parse_args(int argc, char **argv) { int c; while ((c = getopt(argc, argv, "i:t:h")) != -1) switch(c) { case 'i': ntasks = atoi(optarg); break; case 'h': usage(argv); break; } } int main(int argc, char **argv) { int ret; double timing; double start; double end; parse_args(argc, argv); ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); FPRINTF(stderr, "#tasks : %u\n", ntasks); start = starpu_timing_now(); unsigned i; for (i = 0; i < ntasks; i++) { struct starpu_task *task = starpu_task_create(); task->cl = NULL; task->detach = 0; task->destroy = 1; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); } end = starpu_timing_now(); timing = end - start; FPRINTF(stderr, "Total: %f secs\n", timing/1000000); FPRINTF(stderr, "Per task: %f usecs\n", timing/ntasks); starpu_shutdown(); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/empty_task_chain.c000066400000000000000000000037331320135501600215300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" /* * Create a chain of tasks with NULL codelet, using manual dependencies */ #define N 4 int main(int argc, char **argv) { int i, ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); struct starpu_task **tasks = (struct starpu_task **) malloc(N*sizeof(struct starpu_task *)); for (i = 0; i < N; i++) { tasks[i] = starpu_task_create(); tasks[i]->cl = NULL; if (i > 0) { starpu_task_declare_deps_array(tasks[i], 1, &tasks[i-1]); ret = starpu_task_submit(tasks[i]); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } if (i == (N-1)) tasks[i]->detach = 0; } ret = starpu_task_submit(tasks[0]); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(tasks[N-1]); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); starpu_shutdown(); free(tasks); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/empty_task_sync_point.c000066400000000000000000000062351320135501600226330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Test using a task with NULL codelet as a synchronization task through tag dependencies */ static starpu_tag_t tagA = 0x0042; static starpu_tag_t tagB = 0x1042; static starpu_tag_t tagC = 0x2042; static starpu_tag_t tagD = 0x3042; static starpu_tag_t tagE = 0x4042; static starpu_tag_t tagF = 0x5042; void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 0 }; int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* {A,B,C} -> D -> {E,F}, D is empty */ struct starpu_task *taskA = starpu_task_create(); taskA->cl = &dummy_codelet; taskA->use_tag = 1; taskA->tag_id = tagA; struct starpu_task *taskB = starpu_task_create(); taskB->cl = &dummy_codelet; taskB->use_tag = 1; taskB->tag_id = tagB; struct starpu_task *taskC = starpu_task_create(); taskC->cl = &dummy_codelet; taskC->use_tag = 1; taskC->tag_id = tagC; struct starpu_task *taskD = starpu_task_create(); taskD->cl = NULL; taskD->use_tag = 1; taskD->tag_id = tagD; starpu_tag_declare_deps(tagD, 3, tagA, tagB, tagC); struct starpu_task *taskE = starpu_task_create(); taskE->cl = &dummy_codelet; taskE->use_tag = 1; taskE->tag_id = tagE; starpu_tag_declare_deps(tagE, 1, tagD); struct starpu_task *taskF = starpu_task_create(); taskF->cl = &dummy_codelet; taskF->use_tag = 1; taskF->tag_id = tagF; starpu_tag_declare_deps(tagF, 1, tagD); ret = starpu_task_submit(taskA); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskB); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskC); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskD); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskE); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskF); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_tag_t tag_array[2] = {tagE, tagF}; ret = starpu_tag_wait_array(2, tag_array); STARPU_CHECK_RETURN_VALUE(ret, "starpu_tag_wait_array"); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/main/empty_task_sync_point_tasks.c000066400000000000000000000052631320135501600240400ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" /* * Test using a task with NULL codelet as a synchronization task through task dependencies */ void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 0 }; int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* {A,B,C} -> D -> {E,F}, D is empty */ struct starpu_task *taskA = starpu_task_create(); taskA->cl = &dummy_codelet; struct starpu_task *taskB = starpu_task_create(); taskB->cl = &dummy_codelet; struct starpu_task *taskC = starpu_task_create(); taskC->cl = &dummy_codelet; struct starpu_task *taskD = starpu_task_create(); taskD->cl = NULL; struct starpu_task *taskE = starpu_task_create(); taskE->cl = &dummy_codelet; struct starpu_task *taskF = starpu_task_create(); taskF->cl = &dummy_codelet; struct starpu_task *tasksABC[3] = {taskA, taskB, taskC}; starpu_task_declare_deps_array(taskD, 3, tasksABC); starpu_task_declare_deps_array(taskE, 1, &taskD); starpu_task_declare_deps_array(taskF, 1, &taskD); ret = starpu_task_submit(taskA); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskB); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskC); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskD); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskE); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskF); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/main/execute_on_a_specific_worker.c000066400000000000000000000101621320135501600240740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2012, 2015-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include "../helper.h" #include /* * Test binding tasks on specific workers */ #ifdef STARPU_QUICK_CHECK #define N 10 #elif !defined(STARPU_LONG_CHECK) #define N 100 #else #define N 1000 #endif #define VECTORSIZE 1024 static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static starpu_pthread_cond_t cond = STARPU_PTHREAD_COND_INITIALIZER; static unsigned finished = 0; static unsigned cnt; starpu_data_handle_t v_handle; static unsigned *v; static void callback(void *arg) { unsigned res = STARPU_ATOMIC_ADD(&cnt, -1); ANNOTATE_HAPPENS_BEFORE(&cnt); if (res == 0) { ANNOTATE_HAPPENS_AFTER(&cnt); STARPU_PTHREAD_MUTEX_LOCK(&mutex); finished = 1; STARPU_PTHREAD_COND_SIGNAL(&cond); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } } void codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { // int id = starpu_worker_get_id(); // FPRINTF(stderr, "worker #%d\n", id); } static struct starpu_codelet cl_r = { .cpu_funcs = {codelet_null}, .cuda_funcs = {codelet_null}, .opencl_funcs = {codelet_null}, .cpu_funcs_name = {"codelet_null"}, .nbuffers = 1, .modes = {STARPU_R} }; static struct starpu_codelet cl_w = { .cpu_funcs = {codelet_null}, .cuda_funcs = {codelet_null}, .opencl_funcs = {codelet_null}, .cpu_funcs_name = {"codelet_null"}, .nbuffers = 1, .modes = {STARPU_W} }; static struct starpu_codelet cl_rw = { .cpu_funcs = {codelet_null}, .cuda_funcs = {codelet_null}, .opencl_funcs = {codelet_null}, .cpu_funcs_name = {"codelet_null"}, .nbuffers = 1, .modes = {STARPU_RW} }; static struct starpu_codelet *select_codelet_with_random_mode(void) { int r = rand(); switch (r % 3) { case 0: return &cl_r; case 1: return &cl_w; case 2: return &cl_rw; }; return &cl_rw; } int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_malloc((void **)&v, VECTORSIZE*sizeof(unsigned)); STARPU_CHECK_RETURN_VALUE(ret, "starpu_malloc"); starpu_vector_data_register(&v_handle, STARPU_MAIN_RAM, (uintptr_t)v, VECTORSIZE, sizeof(unsigned)); unsigned nworker = starpu_worker_get_count(); cnt = nworker*N; unsigned iter, worker; for (iter = 0; iter < N; iter++) { for (worker = 0; worker < nworker; worker++) { /* execute a task on that worker */ struct starpu_task *task = starpu_task_create(); task->handles[0] = v_handle; task->cl = select_codelet_with_random_mode(); task->callback_func = callback; task->callback_arg = NULL; task->execute_on_a_specific_worker = 1; task->workerid = worker; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } STARPU_PTHREAD_MUTEX_LOCK(&mutex); while (!finished) STARPU_PTHREAD_COND_WAIT(&cond, &mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); starpu_data_unregister(v_handle); starpu_free(v); starpu_shutdown(); return EXIT_SUCCESS; enodev: starpu_data_unregister(v_handle); starpu_free(v); starpu_shutdown(); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/execute_schedule.c000066400000000000000000000064671320135501600215330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include "../helper.h" #include /* * Test binding tasks on specific workers and in a specific order */ #ifdef STARPU_QUICK_CHECK #define K 2 #else #define K 16 #endif #define N 64 static unsigned current = 1; void codelet(STARPU_ATTRIBUTE_UNUSED void *descr[], void *_args) { uintptr_t me = (uintptr_t) _args; STARPU_ASSERT(current == me); current++; } static double cost_function(struct starpu_task *task, unsigned nimpl) { (void) task; (void) nimpl; return 1000; } static struct starpu_perfmodel model = { .type = STARPU_COMMON, .cost_function = cost_function, .symbol = "cost" }; static struct starpu_codelet cl = { .cpu_funcs = {codelet}, .cuda_funcs = {codelet}, .opencl_funcs = {codelet}, .nbuffers = 1, .modes = {STARPU_R}, .model = &model, }; int main(int argc, char **argv) { int ret; struct starpu_task *dep_task[N]; int *t[N]; starpu_data_handle_t h[N]; unsigned n, i, k; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); for (n = 0; n < N; n++) { t[n] = malloc((1<<20) * sizeof(*(t[n]))); starpu_variable_data_register(&h[n], STARPU_MAIN_RAM, (uintptr_t) t[n], (1<<20) * sizeof(*(t[n]))); } for (k = 0; k < K; k++) { for (n = 0; n < N; n++) { struct starpu_task *task; dep_task[n] = starpu_task_create(); dep_task[n]->cl = NULL; task = starpu_task_create(); task->cl = &cl; task->execute_on_a_specific_worker = 1; task->workerid = 0; /* We request for running the tasks in the opposite order of the submission order */ task->workerorder = k*N + (N-n); task->cl_arg = (void*) (uintptr_t) (k*N + (N-n)); task->handles[0] = h[n]; starpu_task_declare_deps_array(task, 1, &dep_task[n]); ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } for (n = 0; n < N; n++) { i = (int)starpu_drand48()%(N-n); ret = starpu_task_submit(dep_task[i]); memmove(&dep_task[i], &dep_task[i+1], (N-i-1)*sizeof(dep_task[i])); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } starpu_task_wait_for_all(); for (n = 0; n < N; n++) { starpu_data_unregister(h[n]); free(t[n]); } starpu_shutdown(); return EXIT_SUCCESS; enodev: starpu_shutdown(); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/get_children_tasks.c000066400000000000000000000047711320135501600220450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2016 Université Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Check that starpu_task_get_task_succs returns the set of children tasks */ void func_cpu(void *descr[], void *_args) { } struct starpu_codelet codelet_w = { .modes = { STARPU_W }, .cpu_funcs = {func_cpu}, .cpu_funcs_name = {"func_cpu"}, .nbuffers = 1 }; struct starpu_codelet codelet_r = { .modes = { STARPU_R }, .cpu_funcs = {func_cpu}, .cpu_funcs_name = {"func_cpu"}, .nbuffers = 1 }; int main(int argc, char **argv) { int ret; starpu_data_handle_t h; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_void_data_register(&h); starpu_tag_t tag_init = 0; starpu_tag_declare_deps_array((starpu_tag_t) 1, 1, &tag_init); struct starpu_task *task1 = starpu_task_build(&codelet_w, STARPU_W, h, STARPU_TAG, (starpu_tag_t) 1, 0); struct starpu_task *task2 = starpu_task_build(&codelet_r, STARPU_R, h, 0); struct starpu_task *task3 = starpu_task_build(&codelet_r, STARPU_R, h, 0); ret = starpu_task_submit(task1); if (ret == -ENODEV) goto enodev; ret = starpu_task_submit(task2); if (ret == -ENODEV) goto enodev; ret = starpu_task_submit(task3); if (ret == -ENODEV) goto enodev; struct starpu_task *tasks[4]; ret = starpu_task_get_task_succs(task1, sizeof(tasks)/sizeof(*tasks), tasks); STARPU_ASSERT(ret == 2); STARPU_ASSERT(tasks[0] == task2 || tasks[1] == task2); STARPU_ASSERT(tasks[0] == task3 || tasks[1] == task3); starpu_tag_notify_from_apps(0); starpu_data_unregister(h); starpu_shutdown(); STARPU_RETURN(ret?0:1); enodev: starpu_shutdown(); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/get_current_task.c000066400000000000000000000065031320135501600215470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include "../helper.h" /* * Check that starpu_task_get_current provides the proper task pointer */ #ifdef STARPU_QUICK_CHECK static unsigned ntasks = 64; #else static unsigned ntasks = 65536; #endif void check_task_func(void *descr[], void *arg) { /* We check that the returned task is valid from the callback */ struct starpu_task *task = (struct starpu_task *) arg; STARPU_ASSERT(task == starpu_task_get_current()); } static void check_task_callback(void *arg) { /* We check that the returned task is valid from the callback */ struct starpu_task *task = (struct starpu_task *) arg; STARPU_ASSERT(task == starpu_task_get_current()); } static struct starpu_codelet dummy_cl = { .cuda_funcs = {check_task_func}, .cpu_funcs = {check_task_func}, .opencl_funcs = {check_task_func}, /* starpu_task_get_current()) is not working on MIC */ /*.cpu_funcs_name = {"check_task_func"},*/ .model = NULL, .nbuffers = 0 }; int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); FPRINTF(stderr, "#tasks : %u\n", ntasks); unsigned i; for (i = 0; i < ntasks; i++) { struct starpu_task *task = starpu_task_create(); /* We check if the function is valid from the codelet or from * the callback */ task->cl = &dummy_cl; task->cl_arg = task; task->cl_arg_size = sizeof(task); task->callback_func = check_task_callback; task->callback_arg = task; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); FPRINTF(stderr, "#empty tasks : %u\n", ntasks); /* We repeat the same experiment with null codelets */ for (i = 0; i < ntasks; i++) { struct starpu_task *task = starpu_task_create(); task->cl = NULL; /* We check if the function is valid from the callback */ task->callback_func = check_task_callback; task->callback_arg = task; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_shutdown(); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/increment.cu000066400000000000000000000017011320135501600203500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2014 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include static __global__ void cuda_increment(unsigned *var) { (*var)++; } extern "C" void cuda_host_increment(void *descr[], void *_args) { (void)_args; unsigned *var = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); cuda_increment<<<1,1, 0, starpu_cuda_get_local_stream()>>>(var); } starpu-1.2.3+dfsg/tests/main/insert_task.c000066400000000000000000000111401320135501600205230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013, 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Try the starpu_task_insert interface in various ways */ static int _ifactor = 12; static float _ffactor = 10.0; void func_cpu_args(void *descr[], void *_args) { int *x0 = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); float *x1 = (float *)STARPU_VARIABLE_GET_PTR(descr[1]); int ifactor; float ffactor; starpu_codelet_unpack_args(_args, &ifactor, &ffactor); *x0 = *x0 * ifactor; *x1 = *x1 * ffactor; } void func_cpu_noargs(void *descr[], void *_args) { int *x0 = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); float *x1 = (float *)STARPU_VARIABLE_GET_PTR(descr[1]); *x0 = *x0 * _ifactor; *x1 = *x1 * _ffactor; } struct starpu_codelet mycodelet_args = { .modes = { STARPU_RW, STARPU_RW }, .cpu_funcs = {func_cpu_args}, .cpu_funcs_name = {"func_cpu_args"}, .nbuffers = 2 }; struct starpu_codelet mycodelet_noargs = { .modes = { STARPU_RW, STARPU_RW }, .cpu_funcs = {func_cpu_noargs}, .nbuffers = 2 }; static int test_codelet(struct starpu_codelet *codelet, int task_insert, int args, int x, float f) { starpu_data_handle_t data_handles[2]; int xx = x; float ff = f; int i, ret; starpu_variable_data_register(&data_handles[0], STARPU_MAIN_RAM, (uintptr_t)&xx, sizeof(xx)); starpu_variable_data_register(&data_handles[1], STARPU_MAIN_RAM, (uintptr_t)&ff, sizeof(ff)); FPRINTF(stderr, "values: %d (%d) %f (%f)\n", xx, _ifactor, ff, _ffactor); if (task_insert) { if (args) ret = starpu_task_insert(codelet, STARPU_VALUE, &_ifactor, sizeof(_ifactor), STARPU_VALUE, &_ffactor, sizeof(_ffactor), STARPU_RW, data_handles[0], STARPU_RW, data_handles[1], 0); else ret = starpu_task_insert(codelet, STARPU_RW, data_handles[0], STARPU_RW, data_handles[1], 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); } else { struct starpu_task *task; if (args) task = starpu_task_build(codelet, STARPU_VALUE, &_ifactor, sizeof(_ifactor), STARPU_VALUE, &_ffactor, sizeof(_ffactor), STARPU_RW, data_handles[0], STARPU_RW, data_handles[1], 0); else task = starpu_task_build(codelet, STARPU_RW, data_handles[0], STARPU_RW, data_handles[1], 0); ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } enodev: for(i=0 ; i<2 ; i++) { starpu_data_unregister(data_handles[i]); } FPRINTF(stderr, "values: %d (should be %d) %f (should be %f)\n\n", xx, x*_ifactor, ff, f*_ffactor); return ret == -ENODEV ? ret : xx == x*_ifactor && ff == f*_ffactor; } int main(int argc, char **argv) { int x; float f; int i, ret; int ifactor=12; float ffactor=10.0; starpu_data_handle_t data_handles[2]; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); FPRINTF(stderr, "Testing codelet with task_insert and with arguments\n"); ret = test_codelet(&mycodelet_args, 1, 1, 4, 2.0); if (ret == -ENODEV) goto enodev; if (ret) { FPRINTF(stderr, "Testing codelet with task_insert and without arguments\n"); ret = test_codelet(&mycodelet_noargs, 1, 0, 9, 7.0); } if (ret == -ENODEV) goto enodev; if (ret) { FPRINTF(stderr, "Testing codelet with task_build and with arguments\n"); ret = test_codelet(&mycodelet_args, 0, 1, 5, 3.0); } if (ret == -ENODEV) goto enodev; if (ret) { FPRINTF(stderr, "Testing codelet with task_build and without arguments\n"); ret = test_codelet(&mycodelet_noargs, 0, 0, 7, 5.0); } if (ret == -ENODEV) goto enodev; starpu_shutdown(); STARPU_RETURN(ret?0:1); enodev: starpu_shutdown(); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/insert_task_array.c000066400000000000000000000046741320135501600217370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Test STARPU_DATA_ARRAY */ void func_cpu(void *descr[], void *_args) { int *x0 = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); float *x1 = (float *)STARPU_VARIABLE_GET_PTR(descr[1]); int factor; starpu_codelet_unpack_args(_args, &factor); *x0 = *x0 * factor; *x1 = *x1 * (float)factor; } struct starpu_codelet mycodelet = { .modes = { STARPU_RW, STARPU_RW }, .cpu_funcs = {func_cpu}, .cpu_funcs_name = {"func_cpu"}, .nbuffers = 2 }; int main(int argc, char **argv) { int x; float f; int factor=12; int i, ret; starpu_data_handle_t data_handles[2]; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); x = 1; starpu_variable_data_register(&data_handles[0], STARPU_MAIN_RAM, (uintptr_t)&x, sizeof(x)); f = 2.0; starpu_variable_data_register(&data_handles[1], STARPU_MAIN_RAM, (uintptr_t)&f, sizeof(f)); ret = starpu_task_insert(&mycodelet, STARPU_DATA_ARRAY, data_handles, 2, STARPU_VALUE, &factor, sizeof(factor), STARPU_PRIORITY, 1, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); enodev: for(i=0 ; i<2 ; i++) { starpu_data_unregister(data_handles[i]); } starpu_shutdown(); if (ret == -ENODEV) { fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ return STARPU_TEST_SKIPPED; } else { FPRINTF(stderr, "VALUES: %d %f\n", x, f); ret = !(x == 12 && f == 24.0); return ret; } } starpu-1.2.3+dfsg/tests/main/insert_task_dyn_handles.c000066400000000000000000000215401320135501600231000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013, 2014, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Try the starpu_task_insert interface in various ways, and notably * triggering the use of dyn_handles */ void func_cpu(void *descr[], void *_args) { int num = STARPU_TASK_GET_NBUFFERS(starpu_task_get_current()); int i; for (i = 0; i < num; i++) { int *x = (int *)STARPU_VARIABLE_GET_PTR(descr[i]); *x = *x + 1; } } struct starpu_codelet codelet = { .cpu_funcs = {func_cpu}, /* starpu_task_get_current() doesn't work on MIC */ /* .cpu_funcs_name = {"func_cpu"}, */ .nbuffers = STARPU_VARIABLE_NBUFFERS, }; struct starpu_codelet codelet_minus1 = { .cpu_funcs = {func_cpu}, /* starpu_task_get_current() doesn't work on MIC */ /* .cpu_funcs_name = {"func_cpu"}, */ .nbuffers = STARPU_NMAXBUFS-1, }; struct starpu_codelet codelet_exactly = { .cpu_funcs = {func_cpu}, /* starpu_task_get_current() doesn't work on MIC */ /* .cpu_funcs_name = {"func_cpu"}, */ .nbuffers = STARPU_NMAXBUFS, }; struct starpu_codelet codelet_plus1 = { .cpu_funcs = {func_cpu}, /* starpu_task_get_current() doesn't work on MIC */ /* .cpu_funcs_name = {"func_cpu"}, */ .nbuffers = STARPU_NMAXBUFS+1, }; struct starpu_codelet codelet_plus5 = { .cpu_funcs = {func_cpu}, /* starpu_task_get_current() doesn't work on MIC */ /* .cpu_funcs_name = {"func_cpu"}, */ .nbuffers = STARPU_NMAXBUFS+5, }; starpu_data_handle_t *data_handles; struct starpu_data_descr *descrs; int *expected; int test(int n, struct starpu_codelet *static_codelet) { int i, ret; for (i = 0; i < n; i++) expected[i]++; ret = starpu_task_insert(&codelet, STARPU_DATA_MODE_ARRAY, descrs, n, 0); if (ret == -ENODEV) return ret; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); /* Same with static number of buffers in codelet */ for (i = 0; i < n; i++) expected[i]++; ret = starpu_task_insert(static_codelet, STARPU_DATA_MODE_ARRAY, descrs, n, 0); if (ret == -ENODEV) return ret; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); /* Test a whole array after one data */ expected[0]++; for (i = 1; i < n; i++) expected[i]++; ret = starpu_task_insert(&codelet, STARPU_RW, data_handles[0], STARPU_DATA_MODE_ARRAY, &descrs[1], n-1, 0); if (ret == -ENODEV) return ret; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); if (n > 1) { /* Same with static number of buffers in codelet */ expected[0]++; for (i = 1; i < n; i++) expected[i]++; ret = starpu_task_insert(static_codelet, STARPU_RW, data_handles[0], STARPU_DATA_MODE_ARRAY, &descrs[1], n-1, 0); if (ret == -ENODEV) return ret; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); } return 0; } int main(int argc, char **argv) { int *x; int i, ret, loop; #ifdef STARPU_QUICK_CHECK int nloops = 4; #else int nloops = 16; #endif ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); x = calloc(STARPU_NMAXBUFS+5, sizeof(*x)); data_handles = malloc((STARPU_NMAXBUFS+5) * sizeof(*data_handles)); descrs = malloc((STARPU_NMAXBUFS+5) * sizeof(*descrs)); expected = calloc(STARPU_NMAXBUFS+5, sizeof(*expected)); for(i=0 ; i 2 STARPU_RW, data_handles[1], #endif #if STARPU_NMAXBUFS > 3 STARPU_RW, data_handles[2], #endif #if STARPU_NMAXBUFS > 4 STARPU_RW, data_handles[3], #endif #if STARPU_NMAXBUFS > 5 STARPU_RW, data_handles[4], #endif #if STARPU_NMAXBUFS > 6 STARPU_RW, data_handles[5], #endif #if STARPU_NMAXBUFS > 7 STARPU_RW, data_handles[6], #endif #if STARPU_NMAXBUFS > 8 STARPU_RW, data_handles[7], #endif #if STARPU_NMAXBUFS > 9 STARPU_RW, data_handles[8], #endif #if STARPU_NMAXBUFS > 10 STARPU_RW, data_handles[9], #endif 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); #if STARPU_NMAXBUFS > 1 && STARPU_NMAXBUFS <= 8 /* Same with static number of buffers in codelet */ expected[0]++; for (i = 1; i < STARPU_NMAXBUFS-1 && i < 7; i++) expected[i]++; ret = starpu_task_insert(&codelet_minus1, STARPU_RW, data_handles[0], #if STARPU_NMAXBUFS > 2 STARPU_RW, data_handles[1], #endif #if STARPU_NMAXBUFS > 3 STARPU_RW, data_handles[2], #endif #if STARPU_NMAXBUFS > 4 STARPU_RW, data_handles[3], #endif #if STARPU_NMAXBUFS > 5 STARPU_RW, data_handles[4], #endif #if STARPU_NMAXBUFS > 6 STARPU_RW, data_handles[5], #endif #if STARPU_NMAXBUFS > 7 STARPU_RW, data_handles[6], #endif 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); #endif /* Test datas one after the other, but more than NMAXBUFS */ for (i = 0; i < STARPU_NMAXBUFS+5 && i < 10; i++) expected[i]++; ret = starpu_task_insert(&codelet, STARPU_RW, data_handles[0], STARPU_RW, data_handles[1], STARPU_RW, data_handles[2], STARPU_RW, data_handles[3], STARPU_RW, data_handles[4], STARPU_RW, data_handles[5], #if STARPU_NMAXBUFS > 1 STARPU_RW, data_handles[6], #endif #if STARPU_NMAXBUFS > 2 STARPU_RW, data_handles[7], #endif #if STARPU_NMAXBUFS > 3 STARPU_RW, data_handles[8], #endif #if STARPU_NMAXBUFS > 4 STARPU_RW, data_handles[9], #endif 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); #if STARPU_NMAXBUFS > 1 && STARPU_NMAXBUFS <= 8 /* Same with static number of buffers in codelet*/ for (i = 0; i < STARPU_NMAXBUFS+5 && i < 13; i++) expected[i]++; ret = starpu_task_insert(&codelet_plus5, STARPU_RW, data_handles[0], STARPU_RW, data_handles[1], STARPU_RW, data_handles[2], STARPU_RW, data_handles[3], STARPU_RW, data_handles[4], STARPU_RW, data_handles[5], #if STARPU_NMAXBUFS > 1 STARPU_RW, data_handles[6], #endif #if STARPU_NMAXBUFS > 2 STARPU_RW, data_handles[7], #endif #if STARPU_NMAXBUFS > 3 STARPU_RW, data_handles[8], #endif #if STARPU_NMAXBUFS > 4 STARPU_RW, data_handles[9], #endif #if STARPU_NMAXBUFS > 5 STARPU_RW, data_handles[10], #endif #if STARPU_NMAXBUFS > 6 STARPU_RW, data_handles[11], #endif #if STARPU_NMAXBUFS > 7 STARPU_RW, data_handles[12], #endif 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); #endif } enodev: for(i=0 ; i #include #include #include "../helper.h" /* * Try to pass many parameters to a task, testing the various codelet * declarations */ #define NPARAMS 15 void func_cpu(void *descr[], void *_args STARPU_ATTRIBUTE_UNUSED) { struct starpu_task *task = starpu_task_get_current(); int num = STARPU_TASK_GET_NBUFFERS(task); int i; for (i = 0; i < num; i++) if ((STARPU_TASK_GET_MODE(task, i) & STARPU_W) || (STARPU_TASK_GET_MODE(task, i) & STARPU_SCRATCH)) { int *x = (int *)STARPU_VARIABLE_GET_PTR(descr[i]); *x = *x + 1; } } struct starpu_codelet codelet = { .cpu_funcs = {func_cpu}, /* starpu_task_get_current() doesn't work on MIC */ /* .cpu_funcs_name = {"func_cpu"}, */ .nbuffers = NPARAMS, }; struct starpu_codelet codelet_variable = { .cpu_funcs = {func_cpu}, /* starpu_task_get_current() doesn't work on MIC */ /* .cpu_funcs_name = {"func_cpu"}, */ .nbuffers = STARPU_VARIABLE_NBUFFERS, }; int main(int argc, char **argv) { int *x; int i, ret, loop; #ifdef STARPU_QUICK_CHECK int nloops = 4; #else int nloops = 16; #endif starpu_data_handle_t *data_handles; int *expected; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); codelet.dyn_modes = malloc(NPARAMS * sizeof(*(codelet.modes))); codelet.dyn_modes[0] = STARPU_R, codelet.dyn_modes[1] = STARPU_R, codelet.dyn_modes[2] = STARPU_RW|STARPU_COMMUTE, codelet.dyn_modes[3] = STARPU_RW|STARPU_COMMUTE, codelet.dyn_modes[4] = STARPU_R, codelet.dyn_modes[5] = STARPU_RW, codelet.dyn_modes[6] = STARPU_R, codelet.dyn_modes[7] = STARPU_RW|STARPU_COMMUTE, codelet.dyn_modes[8] = STARPU_R, codelet.dyn_modes[9] = STARPU_RW|STARPU_COMMUTE, codelet.dyn_modes[10] = STARPU_R, codelet.dyn_modes[11] = STARPU_R, codelet.dyn_modes[12] = STARPU_SCRATCH, codelet.dyn_modes[13] = STARPU_SCRATCH, codelet.dyn_modes[14] = STARPU_SCRATCH, x = calloc(NPARAMS, sizeof(*x)); data_handles = malloc(NPARAMS * sizeof(*data_handles)); expected = calloc(NPARAMS, sizeof(*expected)); for(i=0 ; i #include #include "../helper.h" /* * Try starpu_task_insert with a NULL codelet */ int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_task_insert(NULL, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_shutdown(); return EXIT_SUCCESS; enodev: starpu_shutdown(); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/insert_task_pack.c000066400000000000000000000026351320135501600215320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" void func_cpu(void *descr[], void *_args) { (void) descr; (void) _args; } struct starpu_codelet codelet = { .cpu_funcs = { func_cpu }, .cpu_funcs_name = { "func_cpu" } }; int main(int argc, char **argv) { int ret; void *cl_arg = NULL; size_t cl_arg_size = 0; struct starpu_task *task; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_codelet_pack_args(&cl_arg, &cl_arg_size, STARPU_VALUE, &argc, sizeof(argc), 0); task = starpu_task_build(&codelet, STARPU_CL_ARGS, cl_arg, cl_arg_size, STARPU_VALUE, &argc, sizeof(argc), 0); starpu_shutdown(); FPRINTF(stderr, "Task %p\n", task); return (task==NULL)?0:1; } starpu-1.2.3+dfsg/tests/main/insert_task_value.c000066400000000000000000000233721320135501600217310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Test passing values to tasks in different ways */ #define IFACTOR 42 #define FFACTOR 12.00 void func_cpu_int_float(void *descr[], void *_args) { int ifactor[2048]; float ffactor; (void) descr; starpu_codelet_unpack_args(_args, ifactor, &ffactor); FPRINTF(stderr, "[func_cpu_int_float ] Values %d - %3.2f\n", ifactor[0], ffactor); assert(ifactor[0] == IFACTOR && ffactor == FFACTOR); } void func_cpu_int_float_multiple_unpack(void *descr[], void *_args) { int ifactor[2048]; float ffactor; (void) descr; starpu_codelet_unpack_args(_args, ifactor, 0); starpu_codelet_unpack_args(_args, ifactor, &ffactor); FPRINTF(stderr, "[func_cpu_int_float_multiple_unpack] Values %d - %3.2f\n", ifactor[0], ffactor); assert(ifactor[0] == IFACTOR && ffactor == FFACTOR); } void func_cpu_int_float_unpack_copyleft(void *descr[], void *_args) { int ifactor[2048]; float ffactor; void *buffer; size_t buffer_size; (void) descr; buffer_size = sizeof(int)+sizeof(float)+sizeof(size_t); buffer = calloc(buffer_size, 1); starpu_codelet_unpack_args_and_copyleft(_args, buffer, buffer_size, ifactor, 0); starpu_codelet_unpack_args(buffer, &ffactor); FPRINTF(stderr, "[func_cpu_int_float_unpack_copyleft] Values %d - %3.2f\n", ifactor[0], ffactor); assert(ifactor[0] == IFACTOR && ffactor == FFACTOR); free(buffer); } void func_cpu_float_int(void *descr[], void *_args) { int ifactor[2048]; float ffactor; (void) descr; starpu_codelet_unpack_args(_args, &ffactor, ifactor); FPRINTF(stderr, "[func_cpu_float_int ] Values %d - %3.2f\n", ifactor[0], ffactor); assert(ifactor[0] == IFACTOR && ffactor == FFACTOR); } void func_cpu_float_int_multiple_unpack(void *descr[], void *_args) { int ifactor[2048]; float ffactor; (void) descr; starpu_codelet_unpack_args(_args, &ffactor, 0); starpu_codelet_unpack_args(_args, &ffactor, ifactor); FPRINTF(stderr, "[func_cpu_float_int_multiple_unpack] Values %d - %3.2f\n", ifactor[0], ffactor); assert(ifactor[0] == IFACTOR && ffactor == FFACTOR); } void func_cpu_float_int_unpack_copyleft(void *descr[], void *_args) { int ifactor[2048]; float ffactor; void *buffer; size_t buffer_size; (void) descr; buffer_size = sizeof(int)+2048*sizeof(int)+sizeof(size_t); buffer = calloc(buffer_size, 1); starpu_codelet_unpack_args_and_copyleft(_args, buffer, buffer_size, &ffactor, 0); starpu_codelet_unpack_args(buffer, ifactor); FPRINTF(stderr, "[func_cpu_float_int_multiple_unpack] Values %d - %3.2f\n", ifactor[0], ffactor); assert(ifactor[0] == IFACTOR && ffactor == FFACTOR); free(buffer); } void do_test_int_float_task_insert(starpu_cpu_func_t func, char* func_name) { int *ifactor; float ffactor=FFACTOR; int ret; struct starpu_codelet codelet; FPRINTF(stderr, "\nTesting %s\n", __func__); starpu_codelet_init(&codelet); codelet.cpu_funcs[0] = func; codelet.cpu_funcs_name[0] = func_name; ifactor = calloc(2048, sizeof(int)); ifactor[0] = IFACTOR; ret = starpu_task_insert(&codelet, STARPU_VALUE, ifactor, 2048*sizeof(ifactor[0]), STARPU_VALUE, &ffactor, sizeof(ffactor), 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); starpu_task_wait_for_all(); free(ifactor); } void do_test_int_float_task_insert_pack(starpu_cpu_func_t func, char* func_name) { int *ifactor; float ffactor=FFACTOR; int ret; struct starpu_codelet codelet; void *cl_arg = NULL; size_t cl_arg_size = 0; FPRINTF(stderr, "\nTesting %s\n", __func__); ifactor = calloc(2048, sizeof(int)); ifactor[0] = IFACTOR; starpu_codelet_pack_args(&cl_arg, &cl_arg_size, STARPU_VALUE, ifactor, 2048*sizeof(ifactor[0]), STARPU_VALUE, &ffactor, sizeof(ffactor), 0); starpu_codelet_init(&codelet); codelet.cpu_funcs[0] = func; codelet.cpu_funcs_name[0] = func_name; ret = starpu_task_insert(&codelet, STARPU_CL_ARGS, cl_arg, cl_arg_size, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); starpu_task_wait_for_all(); free(ifactor); } void do_test_float_int_task_insert(starpu_cpu_func_t func, char* func_name) { int *ifactor; float ffactor=FFACTOR; int ret; struct starpu_codelet codelet; FPRINTF(stderr, "\nTesting %s\n", __func__); starpu_codelet_init(&codelet); codelet.cpu_funcs[0] = func; codelet.cpu_funcs_name[0] = func_name; ifactor = calloc(2048, sizeof(int)); ifactor[0] = IFACTOR; ret = starpu_task_insert(&codelet, STARPU_VALUE, &ffactor, sizeof(ffactor), STARPU_VALUE, ifactor, 2048*sizeof(ifactor[0]), 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); starpu_task_wait_for_all(); free(ifactor); } void do_test_float_int_task_insert_pack(starpu_cpu_func_t func, char* func_name) { int *ifactor; float ffactor=FFACTOR; int ret; struct starpu_codelet codelet; void *cl_arg = NULL; size_t cl_arg_size = 0; FPRINTF(stderr, "\nTesting %s\n", __func__); ifactor = calloc(2048, sizeof(int)); ifactor[0] = IFACTOR; starpu_codelet_pack_args(&cl_arg, &cl_arg_size, STARPU_VALUE, &ffactor, sizeof(ffactor), STARPU_VALUE, ifactor, 2048*sizeof(ifactor[0]), 0); starpu_codelet_init(&codelet); codelet.cpu_funcs[0] = func; codelet.cpu_funcs_name[0] = func_name; ret = starpu_task_insert(&codelet, STARPU_CL_ARGS, cl_arg, cl_arg_size, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); starpu_task_wait_for_all(); free(ifactor); } void do_test_int_float_pack(starpu_cpu_func_t func, char* func_name) { struct starpu_task *task; struct starpu_codelet codelet; int ret; int *ifactor; float ffactor=FFACTOR; FPRINTF(stderr, "\nTesting %s\n", __func__); ifactor = calloc(2048, sizeof(int)); ifactor[0] = IFACTOR; starpu_codelet_init(&codelet); codelet.cpu_funcs[0] = func; codelet.cpu_funcs_name[0] = func_name; task = starpu_task_create(); task->synchronous = 1; task->cl = &codelet; task->cl_arg_free = 1; starpu_codelet_pack_args(&task->cl_arg, &task->cl_arg_size, STARPU_VALUE, ifactor, 2048*sizeof(ifactor[0]), STARPU_VALUE, &ffactor, sizeof(ffactor), 0); ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_task_wait_for_all(); free(ifactor); } void do_test_float_int_pack(starpu_cpu_func_t func, char* func_name) { struct starpu_task *task; struct starpu_codelet codelet; int ret; int *ifactor; float ffactor=FFACTOR; FPRINTF(stderr, "\nTesting %s\n", __func__); ifactor = calloc(2048, sizeof(int)); ifactor[0] = IFACTOR; starpu_codelet_init(&codelet); codelet.cpu_funcs[0] = func; codelet.cpu_funcs_name[0] = func_name; task = starpu_task_create(); task->synchronous = 1; task->cl = &codelet; task->cl_arg_free = 1; starpu_codelet_pack_args(&task->cl_arg, &task->cl_arg_size, STARPU_VALUE, &ffactor, sizeof(ffactor), STARPU_VALUE, ifactor, 2048*sizeof(ifactor[0]), 0); ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_task_wait_for_all(); free(ifactor); } int main(int argc, char **argv) { int ret; (void) argc; (void) argv; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); if (starpu_worker_get_count_by_type(STARPU_CPU_WORKER) == 0) goto enodev; do_test_int_float_task_insert(func_cpu_int_float, "func_cpu_int_float"); do_test_int_float_task_insert(func_cpu_int_float_multiple_unpack, "func_cpu_int_float_multiple_unpack"); do_test_int_float_task_insert(func_cpu_int_float_unpack_copyleft, "func_cpu_int_float_unpack_copyleft"); do_test_int_float_task_insert_pack(func_cpu_int_float, "func_cpu_int_float"); do_test_int_float_task_insert_pack(func_cpu_int_float_multiple_unpack, "func_cpu_int_float_multiple_unpack"); do_test_int_float_task_insert_pack(func_cpu_int_float_unpack_copyleft, "func_cpu_int_float_unpack_copyleft"); do_test_float_int_task_insert(func_cpu_float_int, "func_cpu_float_int"); do_test_float_int_task_insert(func_cpu_float_int_multiple_unpack, "func_cpu_float_int_multiple_unpack"); do_test_float_int_task_insert(func_cpu_float_int_unpack_copyleft, "func_cpu_float_int_unpack_copyleft"); do_test_float_int_task_insert_pack(func_cpu_float_int, "func_cpu_float_int"); do_test_float_int_task_insert_pack(func_cpu_float_int_multiple_unpack, "func_cpu_float_int_multiple_unpack"); do_test_float_int_task_insert_pack(func_cpu_float_int_unpack_copyleft, "func_cpu_float_int_unpack_copyleft"); do_test_int_float_pack(func_cpu_int_float, "func_cpu_int_float"); do_test_int_float_pack(func_cpu_int_float_multiple_unpack, "func_cpu_int_float_multiple_unpack"); do_test_int_float_pack(func_cpu_int_float_unpack_copyleft, "func_cpu_int_float_unpack_copyleft"); do_test_float_int_pack(func_cpu_float_int, "func_cpu_float_int"); do_test_float_int_pack(func_cpu_float_int_multiple_unpack, "func_cpu_float_int_multiple_unpack"); do_test_float_int_pack(func_cpu_float_int_unpack_copyleft, "func_cpu_float_int_unpack_copyleft"); starpu_shutdown(); return 0; enodev: starpu_shutdown(); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/mkdtemp.c000066400000000000000000000030141320135501600176370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" #include int do_test(char *(*func)(char *tmpl)) { int ret; char *path; char dirname[128]; char *ptr; struct stat sb; path = starpu_getenv("TMPDIR"); if (!path) path = starpu_getenv("TEMP"); if (!path) path = starpu_getenv("TMP"); if (!path) path = "/tmp"; snprintf(dirname, 128, "%s/abcdef_XXXXXX", path); ptr = func(dirname); FPRINTF(stderr, "Directory '%s' (res '%s')\n", dirname, ptr); // use stat ret = stat(dirname, &sb); if (ret != 0 || !S_ISDIR(sb.st_mode)) { FPRINTF(stderr, "Directory '%s' has not been created\n", dirname); return 1; } ret = rmdir(dirname); STARPU_CHECK_RETURN_VALUE(ret, "rmdir '%s'\n", dirname); return ret; } int main(void) { int ret, ret2; ret = do_test(_starpu_mkdtemp); ret2 = do_test(_starpu_mkdtemp_internal); return ret + ret2; } starpu-1.2.3+dfsg/tests/main/multithreaded.c000066400000000000000000000060021320135501600210310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011, 2013-2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * Copyright (C) 2011 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Try submitting tasks from different threads */ starpu_pthread_t threads[16]; #ifdef STARPU_QUICK_CHECK static unsigned ntasks = 64; #else static unsigned ntasks = 65536; #endif static unsigned nthreads = 2; void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 0 }; static void *thread_func(void *arg STARPU_ATTRIBUTE_UNUSED) { int ret; unsigned i; for (i = 0; i < ntasks; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &dummy_codelet; task->cl_arg = NULL; task->callback_func = NULL; task->callback_arg = NULL; ret = starpu_task_submit(task); STARPU_ASSERT_MSG(!ret, "task submission failed with error code %d", ret); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); return NULL; } static void usage(char **argv) { FPRINTF(stderr, "%s [-i ntasks] [-t nthreads] [-h]\n", argv[0]); exit(-1); } static void parse_args(int argc, char **argv) { int c; while ((c = getopt(argc, argv, "i:t:h")) != -1) switch(c) { case 'i': ntasks = atoi(optarg); break; case 't': nthreads = atoi(optarg); break; case 'h': usage(argv); break; } } int main(int argc, char **argv) { // unsigned i; double timing; double start; double end; int ret; parse_args(argc, argv); ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); FPRINTF(stderr, "#tasks : %u\n", ntasks); start = starpu_timing_now(); unsigned t; for (t = 0; t < nthreads; t++) { ret = starpu_pthread_create(&threads[t], NULL, thread_func, NULL); STARPU_ASSERT(ret == 0); } for (t = 0; t < nthreads; t++) { ret = starpu_pthread_join(threads[t], NULL); STARPU_ASSERT(ret == 0); } end = starpu_timing_now(); timing = end - start; FPRINTF(stderr, "Total: %f secs\n", timing/1000000); FPRINTF(stderr, "Per task: %f usecs\n", timing/(nthreads*ntasks)); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/main/multithreaded_init.c000066400000000000000000000043201320135501600220550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 INRIA * Copyright (C) 2010-2011, 2014, 2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Try calling starpu_initialize from different threads in parallel */ #define NUM_THREADS 5 int *glob_argc; char ***glob_argv; static void *launch_starpu(void *unused) { int ret; (void) unused; ret = starpu_initialize(NULL, glob_argc, glob_argv); if (ret == -ENODEV) exit(STARPU_TEST_SKIPPED); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); return NULL; } static void *shutdown_starpu(void *unused) { (void) unused; starpu_shutdown(); return NULL; } int main(int argc, char **argv) { unsigned i; double timing; double start; double end; glob_argc = &argc; glob_argv = &argv; starpu_pthread_t threads[NUM_THREADS]; start = starpu_timing_now(); for (i = 0; i < NUM_THREADS; ++i) { int ret = starpu_pthread_create(&threads[i], NULL, launch_starpu, NULL); STARPU_ASSERT(ret == 0); } for (i = 0; i < NUM_THREADS; ++i) { int ret = starpu_pthread_join(threads[i], NULL); STARPU_ASSERT(ret == 0); } end = starpu_timing_now(); timing = end - start; FPRINTF(stderr, "Success : %d threads launching simultaneously starpu_init\n", NUM_THREADS); FPRINTF(stderr, "Total: %f secs\n", timing/1000000); FPRINTF(stderr, "Per task: %f usecs\n", timing/NUM_THREADS); for (i = 0; i < NUM_THREADS; i++) { int ret = starpu_pthread_create(&threads[i], NULL, shutdown_starpu, NULL); STARPU_ASSERT(ret == 0); } for (i = 0; i < NUM_THREADS; i++) { int ret = starpu_pthread_join(threads[i], NULL); STARPU_ASSERT(ret == 0); } return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/main/pack.c000066400000000000000000000041421320135501600171170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Test starpu_codelet_pack_args and starpu_codelet_unpack_args */ void func_cpu(void *descr[], void *_args) { int factor; char c; int x; starpu_codelet_unpack_args(_args, &factor, &c, &x); FPRINTF(stderr, "values: %d %c %d\n", factor, c, x); assert(factor == 12 && c == 'n' && x == 42); } struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .cpu_funcs_name = {"func_cpu"}, .nbuffers = 0 }; int main(int argc, char **argv) { int ret; int x=42; int factor=12; char c='n'; struct starpu_task *task; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); FPRINTF(stderr, "values: %d %c %d\n", factor, c, x); task = starpu_task_create(); task->synchronous = 1; task->cl = &mycodelet; task->cl_arg_free = 1; starpu_codelet_pack_args(&task->cl_arg, &task->cl_arg_size, STARPU_VALUE, &factor, sizeof(factor), STARPU_VALUE, &c, sizeof(c), STARPU_VALUE, &x, sizeof(x), 0); ret = starpu_task_submit(task); if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_shutdown(); if (ret == -ENODEV) { fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ return STARPU_TEST_SKIPPED; } else return 0; } starpu-1.2.3+dfsg/tests/main/pause_resume.c000066400000000000000000000055021320135501600206770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Try starpu_pause/resume */ #ifdef STARPU_QUICK_CHECK static unsigned ntasks = 64; #else static unsigned ntasks = 200000; #endif void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .model = NULL, .nbuffers = 0 }; int main(int argc, char **argv) { double timing; double start; double end; int ret; #ifdef STARPU_HAVE_VALGRIND_H if(RUNNING_ON_VALGRIND) ntasks = 5; #endif ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* Check that we can submit tasks to a "paused" StarPU and then have * it run normally. */ starpu_pause(); unsigned i; for (i = 0; i < ntasks; i++) { ret = starpu_task_insert(&dummy_codelet, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); } start = starpu_timing_now(); starpu_resume(); starpu_task_wait_for_all(); end = starpu_timing_now(); timing = end - start; FPRINTF(stderr, "Without interruptions:\n\tTotal: %f secs\n", timing/1000000); FPRINTF(stderr, "\tPer task: %f usecs\n", timing/ntasks); /* Do the same thing, but with a lot of interuptions to see if there * is any overhead associated with the pause/resume calls. */ starpu_pause(); for (i = 0; i < ntasks; i++) { ret = starpu_task_insert(&dummy_codelet, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); } starpu_resume(); start = starpu_timing_now(); for (i = 0; i < 100; i++) { starpu_pause(); starpu_resume(); } starpu_task_wait_for_all(); end = starpu_timing_now(); timing = end - start; FPRINTF(stderr, "With 100 interruptions:\n\tTotal: %f secs\n", timing/1000000); FPRINTF(stderr, "\tPer task: %f usecs\n", timing/ntasks); /* Finally, check that the nesting of pause/resume calls works. */ starpu_pause(); starpu_pause(); starpu_resume(); starpu_resume(); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/main/regenerate.c000066400000000000000000000066711320135501600203330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" #include /* * Run one task with regenerate=1, and thus completes several times * before we reset regenerate to 0 in the callback */ #ifdef STARPU_QUICK_CHECK static unsigned ntasks = 64; #else static unsigned ntasks = 65536; #endif static unsigned cnt = 0; static unsigned completed = 0; static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static starpu_pthread_cond_t cond = STARPU_PTHREAD_COND_INITIALIZER; static void callback(void *arg STARPU_ATTRIBUTE_UNUSED) { struct starpu_task *task = starpu_task_get_current(); cnt++; if (cnt == ntasks) { task->regenerate = 0; FPRINTF(stderr, "Stop !\n"); STARPU_PTHREAD_MUTEX_LOCK(&mutex); completed = 1; STARPU_PTHREAD_COND_SIGNAL(&cond); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } } void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 0 }; static void parse_args(int argc, char **argv) { int c; while ((c = getopt(argc, argv, "i:")) != -1) switch(c) { case 'i': ntasks = atoi(optarg); break; } } int main(int argc, char **argv) { // unsigned i; double timing; double start; double end; int ret; parse_args(argc, argv); ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); struct starpu_task task; starpu_task_init(&task); task.cl = &dummy_codelet; task.regenerate = 1; task.detach = 1; task.callback_func = callback; FPRINTF(stderr, "#tasks : %u\n", ntasks); start = starpu_timing_now(); ret = starpu_task_submit(&task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_do_schedule(); STARPU_PTHREAD_MUTEX_LOCK(&mutex); if (!completed) STARPU_PTHREAD_COND_WAIT(&cond, &mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); end = starpu_timing_now(); timing = end - start; FPRINTF(stderr, "Total: %f secs\n", timing/1000000); FPRINTF(stderr, "Per task: %f usecs\n", timing/ntasks); starpu_task_wait_for_all(); starpu_task_clean(&task); starpu_shutdown(); /* Cleanup the statically allocated tasks after shutdown, as StarPU is still working on it after the callback */ starpu_task_clean(&task); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/regenerate_pipeline.c000066400000000000000000000105331320135501600222100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" #include /* * Create a pipeline of regenerated tasks, i.e. a sort of data flow graph */ #ifdef STARPU_QUICK_CHECK static unsigned ntasks = 64; #else static unsigned ntasks = 65536; #endif static unsigned cntA = 0; static unsigned cntB = 0; static unsigned cntC = 0; static unsigned completed = 0; static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static starpu_pthread_cond_t cond = STARPU_PTHREAD_COND_INITIALIZER; static void callback(void *arg) { struct starpu_task *task = starpu_task_get_current(); unsigned *cnt = arg; unsigned res; res = STARPU_ATOMIC_ADD(cnt, 1); ANNOTATE_HAPPENS_BEFORE(&cnt); if (res == ntasks) { ANNOTATE_HAPPENS_AFTER(&cnt); task->regenerate = 0; FPRINTF(stderr, "Stop !\n"); STARPU_PTHREAD_MUTEX_LOCK(&mutex); completed++; STARPU_PTHREAD_COND_SIGNAL(&cond); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } } void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 0 }; static void parse_args(int argc, char **argv) { int c; while ((c = getopt(argc, argv, "i:")) != -1) switch(c) { case 'i': ntasks = atoi(optarg); break; } } int main(int argc, char **argv) { // unsigned i; double timing; double start; double end; int ret; parse_args(argc, argv); ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); struct starpu_task taskA, taskB, taskC; struct starpu_task *taskAp = &taskA; struct starpu_task *taskBp = &taskB; starpu_task_init(&taskA); taskA.cl = &dummy_codelet; taskA.regenerate = 1; taskA.detach = 1; taskA.callback_func = callback; taskA.callback_arg = &cntA; starpu_task_init(&taskB); taskB.cl = &dummy_codelet; taskB.regenerate = 1; taskB.detach = 1; taskB.callback_func = callback; taskB.callback_arg = &cntB; starpu_task_declare_deps_array(&taskB, 1, &taskAp); starpu_task_init(&taskC); taskC.cl = &dummy_codelet; taskC.regenerate = 1; taskC.detach = 1; taskC.callback_func = callback; taskC.callback_arg = &cntC; starpu_task_declare_deps_array(&taskC, 1, &taskBp); FPRINTF(stderr, "#tasks : %u\n", ntasks); start = starpu_timing_now(); ret = starpu_task_submit(&taskA); if (ret == -ENODEV) goto enodev; ret = starpu_task_submit(&taskB); if (ret == -ENODEV) goto enodev; ret = starpu_task_submit(&taskC); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_do_schedule(); STARPU_PTHREAD_MUTEX_LOCK(&mutex); while (completed < 3) STARPU_PTHREAD_COND_WAIT(&cond, &mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); end = starpu_timing_now(); timing = end - start; FPRINTF(stderr, "cntA : %u\n", cntA); FPRINTF(stderr, "cntB : %u\n", cntB); FPRINTF(stderr, "cntC : %u\n", cntC); STARPU_ASSERT(cntA == ntasks); STARPU_ASSERT(cntB == ntasks); STARPU_ASSERT(cntC == ntasks); FPRINTF(stderr, "Total: %f secs\n", timing/1000000); FPRINTF(stderr, "Per task: %f usecs\n", timing/(ntasks*3)); starpu_task_wait_for_all(); starpu_task_clean(&taskA); starpu_task_clean(&taskB); starpu_task_clean(&taskC); starpu_shutdown(); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/restart.c000066400000000000000000000033701320135501600176670ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2013-2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include "../helper.h" /* * Try initializing/shutting down starpu several times */ #ifdef STARPU_QUICK_CHECK #define N 2 #else #define N 10 #endif static double start; static double end; int main(int argc, char **argv) { unsigned iter; double init_timing = 0.0; double shutdown_timing = 0.0; int ret; for (iter = 0; iter < N; iter++) { start = starpu_timing_now(); /* Initialize StarPU */ ret = starpu_initialize(NULL, &argc, &argv); end = starpu_timing_now(); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); init_timing += end - start; start = starpu_timing_now(); /* Shutdown StarPU */ starpu_shutdown(); end = starpu_timing_now(); shutdown_timing += end - start; } FPRINTF(stderr, "starpu_init: %2.2f seconds\n", init_timing/(N*1000000)); FPRINTF(stderr, "starpu_shutdown: %2.2f seconds\n", shutdown_timing/(N*1000000)); return EXIT_SUCCESS; enodev: return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/starpu_init.c000066400000000000000000000053631320135501600205500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012, 2013, 2014 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" #include /* * Try initializing starpu with various CPU parameters */ #if !defined(STARPU_HAVE_UNSETENV) || !defined(STARPU_HAVE_SETENV) || !defined(STARPU_USE_CPU) #warning unsetenv or setenv are not defined. Or CPU are not enabled. Skipping test int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else static int check_cpu(int env_cpu, int conf_cpu, int expected_cpu, int *cpu) { int ret; FPRINTF(stderr, "Testing with env=%d - conf=%d\n", env_cpu, conf_cpu); if (env_cpu != -1) { char string[11]; sprintf(string, "%d", env_cpu); setenv("STARPU_NCPUS", string, 1); } struct starpu_conf user_conf; starpu_conf_init(&user_conf); if (conf_cpu != -1) { user_conf.ncpus = conf_cpu; } ret = starpu_init(&user_conf); if (env_cpu != -1) { unsetenv("STARPU_NCPUS"); } if (ret == -ENODEV) { return STARPU_TEST_SKIPPED; } STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); *cpu = starpu_cpu_worker_get_count(); starpu_shutdown(); if (expected_cpu == -1) { FPRINTF(stderr, "Number of CPUS: %3d\n", *cpu); return 0; } else { FPRINTF(stderr, "Number of CPUS: %3d -- Number of expected CPUs: %3d\n", *cpu, expected_cpu); return *cpu != expected_cpu; } } int main(int argc, char **argv) { int ret; int cpu, cpu_init; int cpu_test1, cpu_test2, cpu_test3; unsetenv("STARPU_NCPUS"); unsetenv("STARPU_NCPU"); ret = check_cpu(-1, -1, -1, &cpu_init); if (ret) return ret; if (cpu_init <= 1) return STARPU_TEST_SKIPPED; if (cpu_init >= STARPU_MAXCPUS-5) { cpu_test1 = cpu_init-1; cpu_test2 = cpu_init-2; cpu_test3 = cpu_init-3; } else { cpu_test1 = cpu_init+1; cpu_test2 = cpu_init+2; cpu_test3 = cpu_init+3; } ret = check_cpu(cpu_test1, -1, cpu_test1, &cpu); if (ret) return ret; ret = check_cpu(-1, -1, -1, &cpu); if (ret) return ret; if (cpu != cpu_init) { FPRINTF(stderr, "The number of CPUs is incorrect\n"); return 1; } ret = check_cpu(-1, cpu_test2, cpu_test2, &cpu); if (ret) return ret; ret = check_cpu(cpu_test3, cpu_test1, cpu_test3, &cpu); if (ret) return ret; STARPU_RETURN(ret); } #endif starpu-1.2.3+dfsg/tests/main/starpu_task_bundle.c000066400000000000000000000071331320135501600220750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Test the bundle interface, putting tasks working on the same data in * the same bundle */ #define NB_BUNDLE 10 #define NB_ITERATION 5 void func_cpu(void *descr[], void *args) { float *x = (float *) STARPU_VARIABLE_GET_PTR(descr[0]); float factor; factor = *(float *) args; *x *= factor; } struct starpu_codelet codelet = { .modes = {STARPU_RW}, .cpu_funcs = {func_cpu}, .cpu_funcs_name = {"func_cpu"}, .nbuffers = 1 }; int main(int argc, char **argv) { int i, j, ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_initialize"); float *data; starpu_malloc((void**)&data, sizeof(*data) * NB_BUNDLE); float factors[NB_BUNDLE]; starpu_data_handle_t handles[NB_BUNDLE]; struct starpu_task *task[NB_ITERATION]; starpu_task_bundle_t bundles[NB_BUNDLE]; for (i = 0; i < NB_BUNDLE; i++) { data[i] = i + 1; factors[i] = NB_BUNDLE - i; } for (i = 0; i < NB_BUNDLE; i++) starpu_variable_data_register(&handles[i], STARPU_MAIN_RAM, (uintptr_t)&data[i], sizeof(float)); FPRINTF(stderr, "VALUES:"); for (i = 0; i < NB_BUNDLE; i++) FPRINTF(stderr, " %f (%f)", data[i], factors[i]); FPRINTF(stderr, "\n"); for (i = 0; i < NB_BUNDLE; i++) { starpu_task_bundle_create(&bundles[i]); for (j = 0; j < NB_ITERATION; j++) { task[j] = starpu_task_create(); task[j]->cl = &codelet; task[j]->cl_arg = &factors[i]; task[j]->cl_arg_size = sizeof(float); task[j]->handles[0] = handles[i]; ret = starpu_task_bundle_insert(bundles[i], task[j]); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); } /* Put one aside, just for fun */ ret = starpu_task_bundle_remove(bundles[i], task[NB_ITERATION / 2]); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_bundle_remove"); for (j = 0; j < NB_ITERATION; j++) { ret = starpu_task_submit(task[j]); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_task_bundle_close(bundles[i]); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); for(i = 0; i < NB_BUNDLE ; i++) { ret = starpu_data_acquire(handles[i], STARPU_R); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire"); } FPRINTF(stderr, "VALUES:"); for (i = 0; i < NB_BUNDLE; i++) FPRINTF(stderr, " %f (%f)", data[i], factors[i]); FPRINTF(stderr, "\n"); for(i = 0; i < NB_BUNDLE ; i++) { starpu_data_release(handles[i]); starpu_data_unregister(handles[i]); } starpu_free(data); starpu_shutdown(); return EXIT_SUCCESS; enodev: starpu_shutdown(); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/starpu_task_wait.c000066400000000000000000000055621320135501600215740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013-2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Test waiting for a task */ #ifdef STARPU_QUICK_CHECK static unsigned ntasks = 64; #else static unsigned ntasks = 65536; #endif void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 0 }; static void usage(char **argv) { FPRINTF(stderr, "%s [-i ntasks] [-h]\n", argv[0]); exit(-1); } static void parse_args(int argc, char **argv) { int c; while ((c = getopt(argc, argv, "i:t:h")) != -1) switch(c) { case 'i': ntasks = atoi(optarg); break; case 'h': usage(argv); break; } } int main(int argc, char **argv) { double timing; double start; double end; int ret; parse_args(argc, argv); #ifdef STARPU_HAVE_VALGRIND_H if(RUNNING_ON_VALGRIND) ntasks = 5; #endif ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); FPRINTF(stderr, "#tasks : %u\n", ntasks); start = starpu_timing_now(); unsigned i; for (i = 0; i < ntasks; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &dummy_codelet; task->cl_arg = NULL; task->callback_func = NULL; task->callback_arg = NULL; task->detach = 0; task->destroy = 0; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); starpu_task_destroy(task); } end = starpu_timing_now(); timing = end - start; FPRINTF(stderr, "Total: %f secs\n", timing/1000000); FPRINTF(stderr, "Per task: %f usecs\n", timing/ntasks); starpu_shutdown(); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/starpu_task_wait_for_all.c000066400000000000000000000056451320135501600232740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012, 2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Test waiting for all tasks */ #ifdef STARPU_QUICK_CHECK static unsigned ntasks = 64; #else static unsigned ntasks = 65536; #endif void dummy_func(void *descr[], void *arg) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 0 }; static int inject_one_task(void) { struct starpu_task *task = starpu_task_create(); task->cl = &dummy_codelet; task->cl_arg = NULL; task->callback_func = NULL; task->callback_arg = NULL; int ret = starpu_task_submit(task); return ret; } static void usage(char **argv) { FPRINTF(stderr, "%s [-i ntasks] [-p sched_policy] [-h]\n", argv[0]); exit(-1); } static void parse_args(int argc, char **argv, struct starpu_conf *conf) { int c; while ((c = getopt(argc, argv, "i:p:h")) != -1) switch(c) { case 'i': ntasks = atoi(optarg); break; case 'p': conf->sched_policy_name = optarg; break; case 'h': usage(argv); break; } } int main(int argc, char **argv) { unsigned i; double timing; double start; double end; int ret; struct starpu_conf conf; starpu_conf_init(&conf); parse_args(argc, argv, &conf); ret = starpu_initialize(&conf, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); FPRINTF(stderr, "#tasks : %u\n", ntasks); start = starpu_timing_now(); for (i = 0; i < ntasks; i++) { ret = inject_one_task(); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); end = starpu_timing_now(); timing = end - start; FPRINTF(stderr, "Total: %f secs\n", timing/1000000); FPRINTF(stderr, "Per task: %f usecs\n", timing/ntasks); starpu_shutdown(); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/starpu_worker_exists.c000066400000000000000000000042021320135501600225040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "core/workers.h" #include "../helper.h" /* * Test that _starpu_worker_exists works appropriately */ static int can_always_execute(unsigned workerid, struct starpu_task *task, unsigned nimpl) { (void) workerid; (void) task; (void) nimpl; return 1; } static int can_never_execute(unsigned workerid, struct starpu_task *task, unsigned nimpl) { (void) workerid; (void) task; (void) nimpl; return 0; } void fake(void *buffers[], void *args) { (void) buffers; (void) args; } static struct starpu_codelet cl = { .cpu_funcs = { fake}, .cuda_funcs = { fake}, .opencl_funcs = { fake}, .cpu_funcs_name = { "fake"}, .nbuffers = 0 }; int main(int argc, char **argv) { int ret; struct starpu_task *task; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; task = starpu_task_create(); task->cl = &cl; task->destroy = 0; task->sched_ctx = 0; cl.can_execute = NULL; ret = _starpu_worker_exists(task); if (!ret) { FPRINTF(stderr, "failure with can_execute=NULL\n"); return EXIT_FAILURE; } cl.can_execute = can_always_execute; ret = _starpu_worker_exists(task); if (!ret) { FPRINTF(stderr, "failure with can_always_execute\n"); return EXIT_FAILURE; } cl.can_execute = can_never_execute; ret = _starpu_worker_exists(task); if (ret) { FPRINTF(stderr, "failure with can_never_execute\n"); return EXIT_FAILURE; } starpu_task_destroy(task); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/main/static_restartable.c000066400000000000000000000052451320135501600220650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011, 2013-2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Test that one can submit+wait the same task several times */ #ifdef STARPU_QUICK_CHECK static unsigned ntasks = 64; #else static unsigned ntasks = 65536; #endif void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 0 }; static void parse_args(int argc, char **argv) { int c; while ((c = getopt(argc, argv, "i:")) != -1) switch(c) { case 'i': ntasks = atoi(optarg); break; } } int main(int argc, char **argv) { unsigned i; double timing; double start; double end; int ret; parse_args(argc, argv); #ifdef STARPU_HAVE_VALGRIND_H if(RUNNING_ON_VALGRIND) ntasks = 5; #endif ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); struct starpu_task task; starpu_task_init(&task); task.cl = &dummy_codelet; task.detach = 0; FPRINTF(stderr, "#tasks : %u\n", ntasks); start = starpu_timing_now(); for (i = 0; i < ntasks; i++) { ret = starpu_task_submit(&task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(&task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); } end = starpu_timing_now(); timing = end - start; FPRINTF(stderr, "Total: %f secs\n", timing/1000000); FPRINTF(stderr, "Per task: %f usecs\n", timing/ntasks); starpu_task_clean(&task); starpu_shutdown(); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/static_restartable_tag.c000066400000000000000000000056211320135501600227160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 CNRS * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Test that one can submit+wait_tag the same task several times */ #ifdef STARPU_QUICK_CHECK static unsigned ntasks = 64; #else static unsigned ntasks = 65536; #endif static starpu_tag_t tag = 0x32; void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 0 }; static void parse_args(int argc, char **argv) { int c; while ((c = getopt(argc, argv, "i:")) != -1) switch(c) { case 'i': ntasks = atoi(optarg); break; } } int main(int argc, char **argv) { unsigned i; double timing; double start; double end; int ret; parse_args(argc, argv); #ifdef STARPU_HAVE_VALGRIND_H if(RUNNING_ON_VALGRIND) ntasks = 5; #endif ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); struct starpu_task task; starpu_task_init(&task); task.cl = &dummy_codelet; task.use_tag = 1; task.tag_id = tag; FPRINTF(stderr, "#tasks : %u\n", ntasks); start = starpu_timing_now(); for (i = 0; i < ntasks; i++) { ret = starpu_task_submit(&task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_tag_wait(tag); STARPU_CHECK_RETURN_VALUE(ret, "starpu_tag_wait"); } end = starpu_timing_now(); timing = end - start; FPRINTF(stderr, "Total: %f secs\n", timing/1000000); FPRINTF(stderr, "Per task: %f usecs\n", timing/ntasks); starpu_task_wait_for_all(); starpu_task_clean(&task); starpu_shutdown(); /* Cleanup the statically allocated tasks after shutdown, as StarPU is still working on it after the callback */ starpu_task_clean(&task); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/static_restartable_using_initializer.c000066400000000000000000000053741320135501600257000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011, 2013-2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Test that one can submit+wait the same task several times, using a static * initialization */ /* This is equivalent to calling starpu_task_init later on */ struct starpu_task task = STARPU_TASK_INITIALIZER; #ifdef STARPU_QUICK_CHECK static unsigned ntasks = 64; #else static unsigned ntasks = 65536; #endif void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 0 }; static void parse_args(int argc, char **argv) { int c; while ((c = getopt(argc, argv, "i:")) != -1) switch(c) { case 'i': ntasks = atoi(optarg); break; } } int main(int argc, char **argv) { unsigned i; double timing; double start; double end; int ret; parse_args(argc, argv); #ifdef STARPU_HAVE_VALGRIND_H if(RUNNING_ON_VALGRIND) ntasks = 5; #endif ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); task.cl = &dummy_codelet; task.detach = 0; FPRINTF(stderr, "#tasks : %u\n", ntasks); start = starpu_timing_now(); for (i = 0; i < ntasks; i++) { ret = starpu_task_submit(&task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(&task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); } end = starpu_timing_now(); timing = end - start; FPRINTF(stderr, "Total: %f secs\n", timing/1000000); FPRINTF(stderr, "Per task: %f usecs\n", timing/ntasks); starpu_task_clean(&task); starpu_shutdown(); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/subgraph_repeat.c000066400000000000000000000122521320135501600213550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Test that one can resubmit a whole task graph repeatedly */ #ifdef STARPU_QUICK_CHECK static unsigned niter = 64; #else static unsigned niter = 16384; #endif /* * * /-->B--\ * | | * -----> A D---\---> * ^ | | | * | \-->C--/ | * | | * \--------------/ * * - {B, C} depend on A * - D depends on {B, C} * - A, B, C and D are resubmitted at the end of the loop (or not) */ static struct starpu_task taskA, taskB, taskC, taskD; static unsigned loop_cnt = 0; static unsigned *check_cnt; static starpu_pthread_cond_t cond = STARPU_PTHREAD_COND_INITIALIZER; static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; extern void cuda_host_increment(void *descr[], void *_args); void cpu_increment(void *descr[], void *arg STARPU_ATTRIBUTE_UNUSED) { unsigned *var = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); (*var)++; } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {cpu_increment}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_host_increment}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif // TODO //.opencl_funcs = {dummy_func}, .cpu_funcs_name = {"cpu_increment"}, .model = NULL, .modes = { STARPU_RW }, .nbuffers = 1 }; static void callback_task_D(void *arg STARPU_ATTRIBUTE_UNUSED) { STARPU_PTHREAD_MUTEX_LOCK(&mutex); loop_cnt++; if (loop_cnt == niter) { /* We are done */ STARPU_PTHREAD_COND_SIGNAL(&cond); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } else { int ret; STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); /* Let's go for another iteration */ ret = starpu_task_submit(&taskA); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(&taskB); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(&taskC); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(&taskD); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } int main(int argc, char **argv) { // unsigned i; // double timing; // double start; // double end; int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_data_set_default_sequential_consistency_flag(0); starpu_malloc((void**)&check_cnt, sizeof(*check_cnt)); *check_cnt = 0; starpu_data_handle_t check_data; starpu_variable_data_register(&check_data, STARPU_MAIN_RAM, (uintptr_t)check_cnt, sizeof(*check_cnt)); starpu_task_init(&taskA); taskA.cl = &dummy_codelet; taskA.handles[0] = check_data; starpu_task_init(&taskB); taskB.cl = &dummy_codelet; taskB.handles[0] = check_data; starpu_task_init(&taskC); taskC.cl = &dummy_codelet; taskC.handles[0] = check_data; starpu_task_init(&taskD); taskD.cl = &dummy_codelet; taskD.callback_func = callback_task_D; taskD.handles[0] = check_data; struct starpu_task *depsBC_array[1] = {&taskA}; starpu_task_declare_deps_array(&taskB, 1, depsBC_array); starpu_task_declare_deps_array(&taskC, 1, depsBC_array); struct starpu_task *depsD_array[2] = {&taskB, &taskC}; starpu_task_declare_deps_array(&taskD, 2, depsD_array); ret = starpu_task_submit(&taskA); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(&taskB); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(&taskC); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(&taskD); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_do_schedule(); /* Wait for the termination of all loops */ STARPU_PTHREAD_MUTEX_LOCK(&mutex); if (loop_cnt < niter) STARPU_PTHREAD_COND_WAIT(&cond, &mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); starpu_data_acquire(check_data, STARPU_R); starpu_data_release(check_data); STARPU_ASSERT(*check_cnt == (4*loop_cnt)); starpu_free(check_cnt); starpu_data_unregister(check_data); starpu_task_wait_for_all(); starpu_task_clean(&taskA); starpu_task_clean(&taskB); starpu_task_clean(&taskC); starpu_task_clean(&taskD); starpu_shutdown(); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_data_unregister(check_data); starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/subgraph_repeat_regenerate.c000066400000000000000000000130411320135501600235530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Test that one can let a whole task graph repeatedly regenerate itself */ #ifdef STARPU_QUICK_CHECK static unsigned niter = 64; #else static unsigned niter = 16384; #endif /* * * /-->B--\ * | | * -----> A D---\---> * ^ | | | * | \-->C--/ | * | | * \--------------/ * * - {B, C} depend on A * - D depends on {B, C} * - A, B, C and D are resubmitted at the end of the loop (or not) */ static struct starpu_task taskA, taskB, taskC, taskD; static unsigned loop_cntB = 0; static unsigned loop_cntC = 0; static unsigned loop_cntD = 0; static unsigned *check_cnt; static starpu_pthread_cond_t cond = STARPU_PTHREAD_COND_INITIALIZER; static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; extern void cuda_host_increment(void *descr[], void *_args); void cpu_increment(void *descr[], void *arg STARPU_ATTRIBUTE_UNUSED) { unsigned *var = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); (*var)++; } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {cpu_increment}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_host_increment}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif // TODO //.opencl_funcs = {dummy_func}, .cpu_funcs_name = {"cpu_increment"}, .model = NULL, .modes = { STARPU_RW }, .nbuffers = 1 }; static void callback_task_B(void *arg STARPU_ATTRIBUTE_UNUSED) { if (++loop_cntB == niter) taskB.regenerate = 0; } static void callback_task_C(void *arg STARPU_ATTRIBUTE_UNUSED) { if (++loop_cntC == niter) taskC.regenerate = 0; } static void callback_task_D(void *arg STARPU_ATTRIBUTE_UNUSED) { STARPU_PTHREAD_MUTEX_LOCK(&mutex); loop_cntD++; if (loop_cntD == niter) { /* We are done */ taskD.regenerate = 0; STARPU_PTHREAD_COND_SIGNAL(&cond); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } else { int ret; STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); /* Let's go for another iteration */ ret = starpu_task_submit(&taskA); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } int main(int argc, char **argv) { // unsigned i; // double timing; // double start; // double end; int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* Implicit data dependencies and regeneratable tasks are not compatible */ starpu_data_set_default_sequential_consistency_flag(0); starpu_malloc((void**)&check_cnt, sizeof(*check_cnt)); *check_cnt = 0; starpu_data_handle_t check_data; starpu_variable_data_register(&check_data, STARPU_MAIN_RAM, (uintptr_t)check_cnt, sizeof(*check_cnt)); starpu_task_init(&taskA); taskA.cl = &dummy_codelet; taskA.regenerate = 0; /* this task will be explicitely resubmitted if needed */ taskA.handles[0] = check_data; starpu_task_init(&taskB); taskB.cl = &dummy_codelet; taskB.callback_func = callback_task_B; taskB.regenerate = 1; taskB.handles[0] = check_data; starpu_task_init(&taskC); taskC.cl = &dummy_codelet; taskC.callback_func = callback_task_C; taskC.regenerate = 1; taskC.handles[0] = check_data; starpu_task_init(&taskD); taskD.cl = &dummy_codelet; taskD.callback_func = callback_task_D; taskD.regenerate = 1; taskD.handles[0] = check_data; struct starpu_task *depsBC_array[1] = {&taskA}; starpu_task_declare_deps_array(&taskB, 1, depsBC_array); starpu_task_declare_deps_array(&taskC, 1, depsBC_array); struct starpu_task *depsD_array[2] = {&taskB, &taskC}; starpu_task_declare_deps_array(&taskD, 2, depsD_array); ret = starpu_task_submit(&taskA); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(&taskB); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(&taskC); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(&taskD); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_do_schedule(); /* Wait for the termination of all loops */ STARPU_PTHREAD_MUTEX_LOCK(&mutex); while (loop_cntD < niter) STARPU_PTHREAD_COND_WAIT(&cond, &mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); starpu_data_acquire(check_data, STARPU_R); starpu_data_release(check_data); STARPU_ASSERT(*check_cnt == (4*niter)); starpu_free(check_cnt); starpu_data_unregister(check_data); starpu_task_wait_for_all(); starpu_task_clean(&taskA); starpu_task_clean(&taskB); starpu_task_clean(&taskC); starpu_task_clean(&taskD); starpu_shutdown(); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_data_unregister(check_data); starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/subgraph_repeat_regenerate_tag.c000066400000000000000000000143311320135501600244110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Test that one can let a whole task graph repeatedly regenerate itself, using * tag dependencies */ #ifdef STARPU_QUICK_CHECK static unsigned niter = 64; #else static unsigned niter = 16384; #endif #define TAG_START 0 #define TAG_A 1 #define TAG_B 2 #define TAG_C 3 #define TAG_D 4 /* * * /-->B--\ * | | * -----> A D---\---> * ^ | | | * | \-->C--/ | * | | * \--------------/ * * - {B, C} depend on A * - D depends on {B, C} * - A, B, C and D are resubmitted at the end of the loop (or not) */ static struct starpu_task taskA, taskB, taskC, taskD; static unsigned loop_cnt = 0; static unsigned loop_cnt_A = 0; static unsigned loop_cnt_B = 0; static unsigned loop_cnt_C = 0; static unsigned *check_cnt; static starpu_pthread_cond_t cond = STARPU_PTHREAD_COND_INITIALIZER; static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; extern void cuda_host_increment(void *descr[], void *_args); void cpu_increment(void *descr[], void *arg STARPU_ATTRIBUTE_UNUSED) { unsigned *var = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); (*var)++; } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {cpu_increment}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_host_increment}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif // TODO //.opencl_funcs = {dummy_func}, .cpu_funcs_name = {"cpu_increment"}, .model = NULL, .modes = { STARPU_RW }, .nbuffers = 1 }; static void callback_task_A(void *arg STARPU_ATTRIBUTE_UNUSED) { loop_cnt_A++; if (loop_cnt_A == niter) { /* We are done */ taskA.regenerate = 0; } } static void callback_task_B(void *arg STARPU_ATTRIBUTE_UNUSED) { loop_cnt_B++; if (loop_cnt_B == niter) { /* We are done */ taskB.regenerate = 0; } } static void callback_task_C(void *arg STARPU_ATTRIBUTE_UNUSED) { loop_cnt_C++; if (loop_cnt_C == niter) { /* We are done */ taskC.regenerate = 0; } } static void callback_task_D(void *arg STARPU_ATTRIBUTE_UNUSED) { STARPU_PTHREAD_MUTEX_LOCK(&mutex); loop_cnt++; if (loop_cnt == niter) { /* We are done */ taskD.regenerate = 0; STARPU_PTHREAD_COND_SIGNAL(&cond); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } else { STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); /* Let's go for another iteration */ starpu_tag_restart((starpu_tag_t) TAG_START); starpu_tag_notify_from_apps((starpu_tag_t)TAG_START); } } int main(int argc, char **argv) { // unsigned i; // double timing; // double start; // double end; int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* Implicit data dependencies and regeneratable tasks are not compatible */ starpu_data_set_default_sequential_consistency_flag(0); starpu_malloc((void**)&check_cnt, sizeof(*check_cnt)); *check_cnt = 0; starpu_data_handle_t check_data; starpu_variable_data_register(&check_data, STARPU_MAIN_RAM, (uintptr_t)check_cnt, sizeof(*check_cnt)); starpu_task_init(&taskA); taskA.cl = &dummy_codelet; taskA.regenerate = 1; /* this task will be explicitely resubmitted if needed */ taskA.use_tag = 1; taskA.tag_id = TAG_A; taskA.callback_func = callback_task_A; taskA.handles[0] = check_data; starpu_task_init(&taskB); taskB.cl = &dummy_codelet; taskB.regenerate = 1; taskB.use_tag = 1; taskB.tag_id = TAG_B; taskB.callback_func = callback_task_B; taskB.handles[0] = check_data; starpu_task_init(&taskC); taskC.cl = &dummy_codelet; taskC.regenerate = 1; taskC.use_tag = 1; taskC.tag_id = TAG_C; taskC.callback_func = callback_task_C; taskC.handles[0] = check_data; starpu_task_init(&taskD); taskD.cl = &dummy_codelet; taskD.callback_func = callback_task_D; taskD.regenerate = 1; taskD.use_tag = 1; taskD.tag_id = TAG_D; taskD.handles[0] = check_data; starpu_tag_declare_deps((starpu_tag_t) TAG_A, 1, (starpu_tag_t) TAG_START); starpu_tag_declare_deps((starpu_tag_t) TAG_B, 1, (starpu_tag_t) TAG_A); starpu_tag_declare_deps((starpu_tag_t) TAG_C, 1, (starpu_tag_t) TAG_A); starpu_tag_declare_deps((starpu_tag_t) TAG_D, 2, (starpu_tag_t) TAG_B, (starpu_tag_t) TAG_C); ret = starpu_task_submit(&taskA); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(&taskB); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(&taskC); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(&taskD); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_tag_notify_from_apps((starpu_tag_t) TAG_START); starpu_do_schedule(); /* Wait for the termination of all loops */ STARPU_PTHREAD_MUTEX_LOCK(&mutex); if (loop_cnt < niter) STARPU_PTHREAD_COND_WAIT(&cond, &mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); starpu_data_acquire(check_data, STARPU_R); starpu_data_release(check_data); STARPU_ASSERT(*check_cnt == (4*loop_cnt)); starpu_free(check_cnt); starpu_data_unregister(check_data); starpu_task_wait_for_all(); starpu_task_clean(&taskA); starpu_task_clean(&taskB); starpu_task_clean(&taskC); starpu_task_clean(&taskD); starpu_shutdown(); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_data_unregister(check_data); starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/subgraph_repeat_tag.c000066400000000000000000000131421320135501600222070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" /* * Test that one can resubmit a whole task graph repeatedly, using tag dependencies */ #ifdef STARPU_QUICK_CHECK static unsigned niter = 64; #else static unsigned niter = 16384; #endif /* * * /-->B--\ * | | * -----> A D---\---> * ^ | | | * | \-->C--/ | * | | * \--------------/ * * - {B, C} depend on A * - D depends on {B, C} * - A, B, C and D are resubmitted at the end of the loop (or not) */ static struct starpu_task taskA, taskB, taskC, taskD; static unsigned loop_cnt = 0; static unsigned loop_cnt_B = 0; static unsigned loop_cnt_C = 0; static unsigned *check_cnt; static starpu_pthread_cond_t cond = STARPU_PTHREAD_COND_INITIALIZER; static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; extern void cuda_host_increment(void *descr[], void *_args); void cpu_increment(void *descr[], void *arg STARPU_ATTRIBUTE_UNUSED) { unsigned *var = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); (*var)++; } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {cpu_increment}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_host_increment}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif // TODO //.opencl_funcs = {dummy_func}, .cpu_funcs_name = {"cpu_increment"}, .model = NULL, .modes = { STARPU_RW }, .nbuffers = 1 }; static void callback_task_B(void *arg STARPU_ATTRIBUTE_UNUSED) { loop_cnt_B++; if (loop_cnt_B == niter) { /* We are done */ taskB.regenerate = 0; } } static void callback_task_C(void *arg STARPU_ATTRIBUTE_UNUSED) { loop_cnt_C++; if (loop_cnt_C == niter) { /* We are done */ taskC.regenerate = 0; } } static void callback_task_D(void *arg STARPU_ATTRIBUTE_UNUSED) { STARPU_PTHREAD_MUTEX_LOCK(&mutex); loop_cnt++; if (loop_cnt == niter) { /* We are done */ taskD.regenerate = 0; STARPU_PTHREAD_COND_SIGNAL(&cond); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } else { int ret; STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); /* Let's go for another iteration */ ret = starpu_task_submit(&taskA); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } int main(int argc, char **argv) { // unsigned i; // double timing; // double start; // double end; int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* Implicit data dependencies and regeneratable tasks are not compatible */ starpu_data_set_default_sequential_consistency_flag(0); starpu_malloc((void**)&check_cnt, sizeof(*check_cnt)); *check_cnt = 0; starpu_data_handle_t check_data; starpu_variable_data_register(&check_data, STARPU_MAIN_RAM, (uintptr_t)check_cnt, sizeof(*check_cnt)); starpu_task_init(&taskA); taskA.cl = &dummy_codelet; taskA.regenerate = 0; /* this task will be explicitely resubmitted if needed */ taskA.handles[0] = check_data; starpu_task_init(&taskB); taskB.cl = &dummy_codelet; taskB.regenerate = 1; taskB.callback_func = callback_task_B; taskB.handles[0] = check_data; starpu_task_init(&taskC); taskC.cl = &dummy_codelet; taskC.regenerate = 1; taskC.callback_func = callback_task_C; taskC.handles[0] = check_data; starpu_task_init(&taskD); taskD.cl = &dummy_codelet; taskD.callback_func = callback_task_D; taskD.regenerate = 1; taskD.handles[0] = check_data; struct starpu_task *depsBC_array[1] = {&taskA}; starpu_task_declare_deps_array(&taskB, 1, depsBC_array); starpu_task_declare_deps_array(&taskC, 1, depsBC_array); struct starpu_task *depsD_array[2] = {&taskB, &taskC}; starpu_task_declare_deps_array(&taskD, 2, depsD_array); ret = starpu_task_submit(&taskA); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(&taskB); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(&taskC); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(&taskD); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_do_schedule(); /* Wait for the termination of all loops */ STARPU_PTHREAD_MUTEX_LOCK(&mutex); if (loop_cnt < niter) STARPU_PTHREAD_COND_WAIT(&cond, &mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); starpu_data_acquire(check_data, STARPU_R); starpu_data_release(check_data); STARPU_ASSERT(*check_cnt == (4*loop_cnt)); starpu_free(check_cnt); starpu_data_unregister(check_data); starpu_task_wait_for_all(); starpu_task_clean(&taskA); starpu_task_clean(&taskB); starpu_task_clean(&taskC); starpu_task_clean(&taskD); starpu_shutdown(); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_data_unregister(check_data); starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/submit.c000066400000000000000000000057621320135501600175150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012, 2015-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Test task submission */ static int i = 0, j; void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { int old_i = STARPU_ATOMIC_ADD(&i, 1); FPRINTF(stdout, "called third task, i = %d\n", old_i+1); } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .model = NULL, .nbuffers = 0 }; static void callback(void *arg STARPU_ATTRIBUTE_UNUSED) { struct starpu_task *task = starpu_task_create(); task->cl = &dummy_codelet; task->detach = 1; if (starpu_task_submit(task) == ENODEV) exit(STARPU_TEST_SKIPPED); FPRINTF(stdout, "submitted third task, i = %d\n", i); } static struct starpu_codelet callback_submit_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .model = NULL, .nbuffers = 0 }; static void task_submit_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { struct starpu_task *task = starpu_task_create(); task->cl = &callback_submit_codelet; task->callback_func = callback; task->detach = 1; if (starpu_task_submit(task) == ENODEV) exit(STARPU_TEST_SKIPPED); int old_i = STARPU_ATOMIC_ADD(&i, 1); FPRINTF(stdout, "submitted second task, i = %d\n", old_i + 1); } static struct starpu_codelet task_submit_codelet = { .cpu_funcs = {task_submit_func}, .cuda_funcs = {task_submit_func}, .opencl_funcs = {task_submit_func}, .model = NULL, .nbuffers = 0 }; int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); struct starpu_task *task = starpu_task_create(); task->cl = &task_submit_codelet; task->detach = 1; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_task_wait_for_all(); j = i; starpu_shutdown(); return j == 3 ? EXIT_SUCCESS : EXIT_FAILURE; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/tag_task_data_deps.c000066400000000000000000000135531320135501600220100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013, 2016-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Test combinations of various tag/task/data dependencies */ void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg) { unsigned duration = (uintptr_t) arg; if (duration) usleep(duration); } static struct starpu_codelet dummy_Rcodelet = { .cpu_funcs = {dummy_func}, .model = NULL, .nbuffers = 1, .modes = {STARPU_R} }; static struct starpu_codelet dummy_Wcodelet = { .cpu_funcs = {dummy_func}, .model = NULL, .nbuffers = 1, .modes = {STARPU_W} }; static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .model = NULL, .nbuffers = 0, }; static struct starpu_task *create_dummy_task(int write, int data, unsigned duration, starpu_data_handle_t handle) { struct starpu_task *task = starpu_task_create(); if (data) { if (write) task->cl = &dummy_Wcodelet; else task->cl = &dummy_Rcodelet; task->handles[0] = handle; } else task->cl = &dummy_codelet; task->cl_arg = (void*) (uintptr_t) duration; return task; } int main(int argc, char **argv) { int ret; /* We have 27 toggles to try below, thus 2^27 possibilities */ unsigned loop, nloops = 128*1024; unsigned duration = 1000; starpu_data_handle_t handle1, handle2; #ifdef STARPU_QUICK_CHECK return STARPU_TEST_SKIPPED; #endif ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_void_data_register(&handle1); starpu_void_data_register(&handle2); starpu_data_set_sequential_consistency_flag(handle2, 0); #if 1 for (loop = 0; loop < nloops; loop++) { #else loop = 0x258; do { #endif int durationA = (loop & 1) ? duration:0; int durationB = (loop & 2) ? duration:0; int durationC = (loop & 4) ? duration:0; int writeA, dataA; int writeB, dataB; int writeC, dataC; starpu_data_handle_t handleA, handleB, handleC; struct starpu_task *taskA, *taskB, *taskC; handleA = handle1; writeA = !!(loop & 8); dataA = !!(loop & 16); if (!dataA && writeA) { handleA = handle2; dataA = 1; } handleB = handle1; writeB = !!(loop & 32); dataB = !!(loop & 64); if (!dataB && writeB) { handleB = handle2; dataB = 1; } handleC = handle1; writeC = !!(loop & 128); dataC = !!(loop & 256); if (!dataC && writeC) { handleC = handle2; dataC = 1; } FPRINTF(stderr,"\r%u", loop); #if 0 if (durationA) FPRINTF(stderr, " longA "); if (durationB) FPRINTF(stderr, " longB "); if (durationC) FPRINTF(stderr, " longC "); if (dataA) { if (writeA) FPRINTF(stderr, " WA"); else FPRINTF(stderr, " RA"); } else if (writeA) FPRINTF(stderr, " wA"); if (dataB) { if (writeB) FPRINTF(stderr, " WB"); else FPRINTF(stderr, " RB"); } else if (writeB) FPRINTF(stderr, " wB"); if (dataC) { if (writeC) FPRINTF(stderr, " WC"); else FPRINTF(stderr, " RC"); } else if (writeC) FPRINTF(stderr, " wC"); if (loop & 512) FPRINTF(stderr, " Tag AB"); if (loop & 1024) FPRINTF(stderr, " Tag AC"); if (loop & 2048) FPRINTF(stderr, " Tag BC"); if (loop & 4096) FPRINTF(stderr, " Task AB"); if (loop & 8192) FPRINTF(stderr, " Task AC"); if (loop & 16384) FPRINTF(stderr, " Task BC"); if (loop & 32768) FPRINTF(stderr, " delayB"); if (loop & 65536) FPRINTF(stderr, " delayC"); FPRINTF(stderr," "); #endif fflush(stderr); taskA = create_dummy_task(writeA, dataA, durationA, handleA); taskB = create_dummy_task(writeB, dataB, durationB, handleB); taskC = create_dummy_task(writeC, dataC, durationC, handleC); taskA->tag_id = 3*loop; taskA->use_tag = 1; taskB->tag_id = 3*loop+1; taskB->use_tag = 1; taskC->tag_id = 3*loop+2; taskC->use_tag = 1; if (loop & 512) starpu_tag_declare_deps(taskB->tag_id, 1, taskA->tag_id); if (loop & 1024) starpu_tag_declare_deps(taskC->tag_id, 1, taskA->tag_id); if (loop & 2048) starpu_tag_declare_deps(taskC->tag_id, 1, taskB->tag_id); if (loop & 4096) starpu_task_declare_deps_array(taskB, 1, &taskA); if (loop & 8192) starpu_task_declare_deps_array(taskC, 1, &taskA); if (loop & 16384) starpu_task_declare_deps_array(taskC, 1, &taskB); taskA->detach = 0; taskB->detach = 0; taskC->detach = 0; ret = starpu_task_submit(taskA); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); if (loop & 32768) usleep(duration); ret = starpu_task_submit(taskB); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); if (loop & 65536) usleep(duration); ret = starpu_task_submit(taskC); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(taskA); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); ret = starpu_task_wait(taskB); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); ret = starpu_task_wait(taskC); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); } while(0); starpu_data_unregister(handle1); starpu_data_unregister(handle2); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/main/tag_wait_api.c000066400000000000000000000107571320135501600206420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Test tag dependencies and waiting for a tag */ void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 0 }; static void callback(void *tag) { fflush(stderr); FPRINTF(stderr, "Callback for tag %p\n", tag); fflush(stderr); } static struct starpu_task *create_dummy_task(starpu_tag_t tag) { struct starpu_task *task = starpu_task_create(); task->cl = &dummy_codelet; task->cl_arg = NULL; task->callback_func = callback; task->callback_arg = (void *)tag; task->use_tag = 1; task->tag_id = tag; return task; } #define tagA ((starpu_tag_t)0x42) #define tagB ((starpu_tag_t)0x12300) #define tagC ((starpu_tag_t)0x32) #define tagD ((starpu_tag_t)0x52) #define tagE ((starpu_tag_t)0x19999) #define tagF ((starpu_tag_t)0x2312) #define tagG ((starpu_tag_t)0x1985) #define tagH ((starpu_tag_t)0x32234) #define tagI ((starpu_tag_t)0x5234) #define tagJ ((starpu_tag_t)0x199) #define tagK ((starpu_tag_t)0x231234) #define tagL ((starpu_tag_t)0x2345) int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); FPRINTF(stderr, "{ A } -> { B }\n"); fflush(stderr); struct starpu_task *taskA, *taskB; taskA = create_dummy_task(tagA); taskB = create_dummy_task(tagB); /* B depends on A */ starpu_tag_declare_deps(tagB, 1, tagA); ret = starpu_task_submit(taskB); STARPU_CHECK_RETURN_VALUE(ret, "starpu_submit"); ret = starpu_task_submit(taskA); STARPU_CHECK_RETURN_VALUE(ret, "starpu_submit"); ret = starpu_tag_wait(tagB); STARPU_CHECK_RETURN_VALUE(ret, "starpu_wait"); FPRINTF(stderr, "{ C, D, E, F } -> { G }\n"); struct starpu_task *taskC, *taskD, *taskE, *taskF, *taskG; taskC = create_dummy_task(tagC); taskD = create_dummy_task(tagD); taskE = create_dummy_task(tagE); taskF = create_dummy_task(tagF); taskG = create_dummy_task(tagG); /* NB: we could have used starpu_tag_declare_deps_array instead */ starpu_tag_declare_deps(tagG, 4, tagC, tagD, tagE, tagF); ret = starpu_task_submit(taskC); STARPU_CHECK_RETURN_VALUE(ret, "starpu_submit"); ret = starpu_task_submit(taskD); STARPU_CHECK_RETURN_VALUE(ret, "starpu_submit"); ret = starpu_task_submit(taskG); STARPU_CHECK_RETURN_VALUE(ret, "starpu_submit"); ret = starpu_task_submit(taskE); STARPU_CHECK_RETURN_VALUE(ret, "starpu_submit"); ret = starpu_task_submit(taskF); STARPU_CHECK_RETURN_VALUE(ret, "starpu_submit"); ret = starpu_tag_wait(tagG); STARPU_CHECK_RETURN_VALUE(ret, "starpu_tag_wait"); FPRINTF(stderr, "{ H, I } -> { J, K, L }\n"); struct starpu_task *taskH, *taskI, *taskJ, *taskK, *taskL; taskH = create_dummy_task(tagH); taskI = create_dummy_task(tagI); taskJ = create_dummy_task(tagJ); taskK = create_dummy_task(tagK); taskL = create_dummy_task(tagL); starpu_tag_declare_deps(tagJ, 2, tagH, tagI); starpu_tag_declare_deps(tagK, 2, tagH, tagI); starpu_tag_declare_deps(tagL, 2, tagH, tagI); starpu_tag_t tagJKL[3] = {tagJ, tagK, tagL}; ret = starpu_task_submit(taskH); STARPU_CHECK_RETURN_VALUE(ret, "starpu_submit"); ret = starpu_task_submit(taskI); STARPU_CHECK_RETURN_VALUE(ret, "starpu_submit"); ret = starpu_task_submit(taskJ); STARPU_CHECK_RETURN_VALUE(ret, "starpu_submit"); ret = starpu_task_submit(taskK); STARPU_CHECK_RETURN_VALUE(ret, "starpu_submit"); ret = starpu_task_submit(taskL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_submit"); ret = starpu_tag_wait_array(3, tagJKL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_tag_wait_array"); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/main/task_wait_api.c000066400000000000000000000111601320135501600210160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Test task dependencies and waiting for a task */ void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 0 }; static struct starpu_task *create_dummy_task(void) { struct starpu_task *task = starpu_task_create(); task->cl = &dummy_codelet; task->cl_arg = NULL; task->detach = 0; return task; } int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); FPRINTF(stderr, "{ A } -> { B }\n"); fflush(stderr); struct starpu_task *taskA, *taskB; taskA = create_dummy_task(); taskB = create_dummy_task(); /* B depends on A */ starpu_task_declare_deps_array(taskB, 1, &taskA); ret = starpu_task_submit(taskB); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskA); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(taskB); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); FPRINTF(stderr, "{ C, D, E, F } -> { G }\n"); struct starpu_task *taskC, *taskD, *taskE, *taskF, *taskG; taskC = create_dummy_task(); taskD = create_dummy_task(); taskE = create_dummy_task(); taskF = create_dummy_task(); taskG = create_dummy_task(); struct starpu_task *tasksCDEF[4] = {taskC, taskD, taskE, taskF}; starpu_task_declare_deps_array(taskG, 4, tasksCDEF); ret = starpu_task_submit(taskC); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskD); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskG); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskE); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskF); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(taskG); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); FPRINTF(stderr, "{ H, I } -> { J, K, L }\n"); struct starpu_task *taskH, *taskI, *taskJ, *taskK, *taskL; taskH = create_dummy_task(); taskI = create_dummy_task(); taskJ = create_dummy_task(); taskK = create_dummy_task(); taskL = create_dummy_task(); struct starpu_task *tasksHI[2] = {taskH, taskI}; starpu_task_declare_deps_array(taskJ, 2, tasksHI); starpu_task_declare_deps_array(taskK, 2, tasksHI); starpu_task_declare_deps_array(taskL, 2, tasksHI); ret = starpu_task_submit(taskH); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskI); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskJ); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskK); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(taskJ); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); ret = starpu_task_wait(taskK); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); ret = starpu_task_wait(taskL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); starpu_task_wait_for_all(); /* Destroy all the tasks that were not detached */ starpu_task_destroy(taskA); starpu_task_destroy(taskC); starpu_task_destroy(taskD); starpu_task_destroy(taskE); starpu_task_destroy(taskF); starpu_task_destroy(taskH); starpu_task_destroy(taskI); starpu_shutdown(); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/main/wait_all_regenerable_tasks.c000066400000000000000000000062721320135501600235430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013-2014, 2016-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Test that starpu_task_wait_for_all can work with a regenerating task */ #ifdef STARPU_QUICK_CHECK static unsigned ntasks = 64; #else static unsigned ntasks = 1024; #endif static void callback(void *arg) { struct starpu_task *task = starpu_task_get_current(); unsigned *cnt = (unsigned *) arg; (*cnt)++; if (*cnt == ntasks) task->regenerate = 0; } void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 0 }; static void parse_args(int argc, char **argv) { int c; while ((c = getopt(argc, argv, "i:")) != -1) switch(c) { case 'i': ntasks = atoi(optarg); break; } } #define K 128 int main(int argc, char **argv) { int ret; double timing; double start; double end; parse_args(argc, argv); ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); struct starpu_task task[K]; unsigned cnt[K]; int i; for (i = 0; i < K; i++) { starpu_task_init(&task[i]); cnt[i] = 0; task[i].cl = &dummy_codelet; task[i].regenerate = 1; task[i].detach = 1; task[i].callback_func = callback; task[i].callback_arg = &cnt[i]; } FPRINTF(stderr, "#tasks : %d x %u tasks\n", K, ntasks); start = starpu_timing_now(); for (i = 0; i < K; i++) { ret = starpu_task_submit(&task[i]); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_wait_for_all(); for (i = 0; i < K; i++) starpu_task_clean(&task[i]); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); end = starpu_timing_now(); /* Check that all the tasks have been properly executed */ unsigned total_cnt = 0; for (i = 0; i < K; i++) total_cnt += cnt[i]; STARPU_ASSERT(total_cnt == K*ntasks); timing = end - start; FPRINTF(stderr, "Total: %f secs\n", timing/1000000); FPRINTF(stderr, "Per task: %f usecs\n", timing/(K*ntasks)); starpu_shutdown(); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/microbenchs/000077500000000000000000000000001320135501600174045ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/microbenchs/async_tasks_overhead.c000066400000000000000000000122361320135501600237530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Measure the cost of submitting asynchronous tasks */ static unsigned ntasks = 65536; //static unsigned finished = 0; static double cumulated = 0.0; static double cumulated_push = 0.0; static double cumulated_pop = 0.0; void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 0 }; //static void inject_one_task(void) //{ // struct starpu_task *task = starpu_task_create(); // // task->cl = &dummy_codelet; // task->cl_arg = NULL; // task->detach = 0; // // int ret = starpu_task_submit(task); // STARPU_ASSERT(!ret); //} static void usage(char **argv) { fprintf(stderr, "%s [-i ntasks] [-p sched_policy] [-h]\n", argv[0]); exit(-1); } static void parse_args(int argc, char **argv, struct starpu_conf *conf) { int c; while ((c = getopt(argc, argv, "i:p:h")) != -1) switch(c) { case 'i': ntasks = atoi(optarg); break; case 'p': conf->sched_policy_name = optarg; break; case 'h': usage(argv); break; } } int main(int argc, char **argv) { int ret; unsigned i; double timing; double start; double end; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncpus = 2; #ifdef STARPU_QUICK_CHECK ntasks = 128; #endif parse_args(argc, argv, &conf); ret = starpu_initialize(&conf, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_profiling_status_set(STARPU_PROFILING_ENABLE); fprintf(stderr, "#tasks : %u\n", ntasks); /* Create an array of tasks */ struct starpu_task **tasks = (struct starpu_task **) malloc(ntasks*sizeof(struct starpu_task *)); for (i = 0; i < ntasks; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &dummy_codelet; task->cl_arg = NULL; task->detach = 0; tasks[i] = task; } start = starpu_timing_now(); for (i = 0; i < ntasks; i++) { ret = starpu_task_submit(tasks[i]); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); end = starpu_timing_now(); /* Read profiling feedback */ for (i = 0; i < ntasks; i++) { struct starpu_profiling_task_info *info; info = tasks[i]->profiling_info; double queued = starpu_timing_timespec_delay_us(&info->push_end_time, &info->pop_end_time); double length = starpu_timing_timespec_delay_us(&info->submit_time, &info->end_time); double push_duration = starpu_timing_timespec_delay_us(&info->push_start_time, &info->push_end_time); double pop_duration = starpu_timing_timespec_delay_us(&info->pop_start_time, &info->pop_end_time); starpu_task_destroy(tasks[i]); cumulated += (length - queued); cumulated_push += push_duration; cumulated_pop += pop_duration; } timing = end - start; fprintf(stderr, "Total: %f secs\n", timing/1000000); fprintf(stderr, "Per task: %f usecs\n", timing/ntasks); fprintf(stderr, "Per task (except scheduler): %f usecs\n", cumulated/ntasks); fprintf(stderr, "Per task (push): %f usecs\n", cumulated_push/ntasks); fprintf(stderr, "Per task (pop): %f usecs\n", cumulated_pop/ntasks); { char *output_dir = getenv("STARPU_BENCH_DIR"); char *bench_id = getenv("STARPU_BENCH_ID"); if (output_dir && bench_id) { char file[1024]; FILE *f; snprintf(file, 1024, "%s/async_tasks_overhead_total.dat", output_dir); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing/1000000); fclose(f); snprintf(file, 1024, "%s/async_tasks_overhead_per_task.dat", output_dir); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing/ntasks); fclose(f); } } starpu_shutdown(); free(tasks); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); free(tasks); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/microbenchs/display_structures_size.c000066400000000000000000000016341320135501600245560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2016 Université de Bordeaux * Copyright (C) 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include /* * Display the sizes of various StarPU data structures */ int main(int argc, char **argv) { _starpu_debug_display_structures_size(stderr); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/microbenchs/local_pingpong.c000066400000000000000000000056221320135501600225500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include "../helper.h" /* * Trigger a ping-pong test between two CUDA GPUs */ static size_t vector_size = 1; static int niter = 1000; //static unsigned cnt; //static unsigned finished = 0; starpu_data_handle_t v_handle; static unsigned *v; static char worker_0_name[128]; static char worker_1_name[128]; static unsigned memory_node_0; static unsigned memory_node_1; double start; double end; int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* Create a piece of data */ ret = starpu_malloc((void **)&v, vector_size); STARPU_CHECK_RETURN_VALUE(ret, "starpu_malloc"); starpu_vector_data_register(&v_handle, STARPU_MAIN_RAM, (uintptr_t)v, vector_size, 1); /* Find a pair of memory nodes */ if (starpu_cuda_worker_get_count() > 1) { /* Take the two devices that come first */ int nworkers = (int)starpu_worker_get_count(); unsigned found_node_0 = 0; int w; for (w = 0; w < nworkers; w++) { if (starpu_worker_get_type(w) == STARPU_CUDA_WORKER) { if (!found_node_0) { memory_node_0 = starpu_worker_get_memory_node(w); starpu_worker_get_name(w, worker_0_name, 128); found_node_0 = 1; } else { memory_node_1 = starpu_worker_get_memory_node(w); starpu_worker_get_name(w, worker_1_name, 128); break; } } } fprintf(stderr, "Ping-pong will be done between %s (node %u) and %s (node %u)\n", worker_0_name, memory_node_0, worker_1_name, memory_node_1); } // unsigned iter; /* warm up */ // unsigned nwarmupiter = 128; _starpu_benchmark_ping_pong(v_handle, memory_node_0, memory_node_1, 128); start = starpu_timing_now(); _starpu_benchmark_ping_pong(v_handle, memory_node_0, memory_node_1, niter); end = starpu_timing_now(); double timing = end - start; fprintf(stderr, "Took %f ms\n", timing/1000); fprintf(stderr, "Avg. transfer time : %f us\n", timing/(2*niter)); starpu_data_unregister(v_handle); starpu_free(v); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/microbenchs/matrix_as_vector.c000066400000000000000000000165211320135501600231260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012, 2013, 2014 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" #ifdef STARPU_USE_CUDA # include #endif /* * Compare the efficiency of matrix and vector interfaces */ #ifdef STARPU_QUICK_CHECK #define LOOPS 10 #elif !defined(STARPU_LONG_CHECK) #define LOOPS 30 #else #define LOOPS 100 #endif void vector_cpu_func(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { STARPU_SKIP_IF_VALGRIND; float *matrix = (float *)STARPU_VECTOR_GET_PTR(descr[0]); int nx = STARPU_VECTOR_GET_NX(descr[0]); int i; float sum=0; for(i=0 ; i mean=%7f != %7f\n", nx, matrix[0], mean); ret = EXIT_FAILURE; } end: if (ret == -ENODEV) fprintf(stderr, "# Uh, ENODEV?!"); starpu_free(matrix); starpu_task_wait_for_all(); return ret; } #define NX_MIN 1024 #define NX_MAX 1024*1024 static int check_size_on_device(uint32_t where, char *device_name) { int nx, ret; struct starpu_codelet vector_codelet; struct starpu_codelet matrix_codelet; fprintf(stderr, "# Device: %s\n", device_name); fprintf(stderr, "# nx vector_timing matrix_timing\n"); starpu_codelet_init(&vector_codelet); vector_codelet.modes[0] = STARPU_RW; vector_codelet.nbuffers = 1; if (where == STARPU_CPU) vector_codelet.cpu_funcs[0] = vector_cpu_func; if (where == STARPU_CUDA) vector_codelet.cuda_funcs[0] = vector_cuda_func; if (where == STARPU_CUDA) vector_codelet.cuda_flags[0] = STARPU_CUDA_ASYNC; // if (where == STARPU_OPENCL) vector_codelet.opencl_funcs[0] = vector_opencl_func; starpu_codelet_init(&matrix_codelet); matrix_codelet.modes[0] = STARPU_RW; matrix_codelet.nbuffers = 1; if (where == STARPU_CPU) matrix_codelet.cpu_funcs[0] = matrix_cpu_func; if (where == STARPU_CUDA) matrix_codelet.cuda_funcs[0] = matrix_cuda_func; if (where == STARPU_CUDA) matrix_codelet.cuda_flags[0] = STARPU_CUDA_ASYNC; // if (where == STARPU_OPENCL) matrix_codelet.opencl_funcs[0] = matrix_opencl_func; for(nx=NX_MIN ; nx<=NX_MAX ; nx*=2) { ret = check_size(nx, &vector_codelet, &matrix_codelet, device_name); if (ret != EXIT_SUCCESS) break; } return ret; } int main(int argc, char **argv) { int ret; unsigned devices; #ifdef STARPU_USE_CUDA int cublas_version; #endif ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); devices = starpu_cpu_worker_get_count(); if (devices) { ret = check_size_on_device(STARPU_CPU, "STARPU_CPU"); if (ret) goto error; } #ifdef STARPU_USE_CUDA devices = starpu_cuda_worker_get_count(); if (devices) { cublasHandle_t handle; cublasCreate(&handle); cublasGetVersion(handle, &cublas_version); cublasDestroy(handle); if (cublas_version >= 7050) { starpu_cublas_init(); ret = check_size_on_device(STARPU_CUDA, "STARPU_CUDA"); if (ret) goto error; starpu_cublas_shutdown(); } } #endif #if 0 devices = starpu_opencl_worker_get_count(); if (devices) { ret = check_size_on_device(STARPU_OPENCL, "STARPU_OPENCL"); if (ret) goto error; } #endif error: if (ret == -ENODEV) ret=STARPU_TEST_SKIPPED; starpu_shutdown(); STARPU_RETURN(ret); } starpu-1.2.3+dfsg/tests/microbenchs/microbench.sh000077500000000000000000000037071320135501600220630ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # This provides a helper function to be used for microbenchs that should be run # under the various schedulers. # # The caller should fill either the XFAIL or XSUCCESS variable with the list of # schedulers which are supposed to fail or succeed, and then call test_scheds set -e SCHEDS=`$top_builddir/tools/starpu_sched_display` test_scheds() { TEST=$1 RESULT=0 for sched in $SCHEDS; do if STARPU_SCHED=$sched $top_builddir/tests/microbenchs/$TEST ; then echo " SUCCESS: STARPU_SCHED=$sched ./microbenchs/$TEST" continue fi if [ -n "$XSUCCESS" ] then # We have a list of schedulers that are expected to # succeed, others are allowed to fail case " $XSUCCESS " in *\ $sched\ *) echo " FAIL: STARPU_SCHED=$sched ./microbenchs/$TEST" | ( tee /dev/tty || true ) RESULT=1 ;; *) echo " XFAIL: STARPU_SCHED=$sched ./microbenchs/$TEST" ;; esac else # We have a list of schedulers that are expected to # fail, others are expected to succeed case " $XFAIL " in *\ $sched\ *) echo " XFAIL: STARPU_SCHED=$sched ./microbenchs/$TEST" ;; *) echo " FAIL: STARPU_SCHED=$sched ./microbenchs/$TEST" | ( tee /dev/tty || true ) RESULT=1 ;; esac fi done return $RESULT } starpu-1.2.3+dfsg/tests/microbenchs/prefetch_data_on_node.c000066400000000000000000000110251320135501600240410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012, 2015-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include "../helper.h" /* * Try calling starpu_data_prefetch_on_node before running a task there */ #ifdef STARPU_QUICK_CHECK #define N 10 #elif !defined(STARPU_LONG_CHECK) #define N 100 #else #define N 1000 #endif #define VECTORSIZE 1024 starpu_data_handle_t v_handle; static unsigned *v; static void callback(void *arg) { unsigned node = (unsigned)(uintptr_t) arg; starpu_data_prefetch_on_node(v_handle, node, 1); } void codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { // fprintf(stderr, "pif\n"); // fflush(stderr); } static struct starpu_codelet cl_r = { .cpu_funcs = {codelet_null}, .cuda_funcs = {codelet_null}, .opencl_funcs = {codelet_null}, .cpu_funcs_name = {"codelet_null"}, .nbuffers = 1, .modes = {STARPU_R} }; static struct starpu_codelet cl_w = { .cpu_funcs = {codelet_null}, .cuda_funcs = {codelet_null}, .opencl_funcs = {codelet_null}, .cpu_funcs_name = {"codelet_null"}, .nbuffers = 1, .modes = {STARPU_W} }; static struct starpu_codelet cl_rw = { .cpu_funcs = {codelet_null}, .cuda_funcs = {codelet_null}, .opencl_funcs = {codelet_null}, .cpu_funcs_name = {"codelet_null"}, .nbuffers = 1, .modes = {STARPU_RW} }; static struct starpu_codelet *select_codelet_with_random_mode(void) { int r = rand(); switch (r % 3) { case 0: return &cl_r; case 1: return &cl_w; case 2: return &cl_rw; }; return &cl_rw; } int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_malloc((void **)&v, VECTORSIZE*sizeof(unsigned)); starpu_vector_data_register(&v_handle, STARPU_MAIN_RAM, (uintptr_t)v, VECTORSIZE, sizeof(unsigned)); unsigned nworker = starpu_worker_get_count(); unsigned iter, worker; for (iter = 0; iter < N; iter++) { for (worker = 0; worker < nworker; worker++) { /* synchronous prefetch */ unsigned node = starpu_worker_get_memory_node(worker); ret = starpu_data_prefetch_on_node(v_handle, node, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_prefetch_on_node"); /* execute a task */ struct starpu_task *task = starpu_task_create(); task->handles[0] = v_handle; task->cl = select_codelet_with_random_mode(); task->synchronous = 1; task->execute_on_a_specific_worker = 1; task->workerid = worker; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } for (iter = 0; iter < N; iter++) { for (worker = 0; worker < nworker; worker++) { /* asynchronous prefetch */ unsigned node = starpu_worker_get_memory_node(worker); ret = starpu_data_prefetch_on_node(v_handle, node, 1); STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_prefetch_on_node"); /* execute a task */ struct starpu_task *task = starpu_task_create(); task->handles[0] = v_handle; task->cl = select_codelet_with_random_mode(); task->callback_func = callback; task->callback_arg = (void*)(uintptr_t) starpu_worker_get_memory_node((worker+1)%nworker); task->execute_on_a_specific_worker = 1; task->workerid = worker; task->synchronous = 0; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_data_unregister(v_handle); starpu_free(v); starpu_shutdown(); return EXIT_SUCCESS; enodev: starpu_free(v); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/microbenchs/redundant_buffer.c000066400000000000000000000051501320135501600230660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include "../helper.h" /* * Try passing the same buffer twice to the same task */ #define N 10000 #define VECTORSIZE 1024 starpu_data_handle_t v_handle; static unsigned *v; static void opencl_codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } static void cuda_codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } void cpu_codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } static struct starpu_codelet cl = { .cpu_funcs = {cpu_codelet_null}, .cuda_funcs = {cuda_codelet_null}, .opencl_funcs = {opencl_codelet_null}, .cpu_funcs_name = {"cpu_codelet_null"}, .nbuffers = 2, .modes = {STARPU_R, STARPU_R} }; int main(int argc, char **argv) { int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_malloc((void **)&v, VECTORSIZE*sizeof(unsigned)); starpu_vector_data_register(&v_handle, STARPU_MAIN_RAM, (uintptr_t)v, VECTORSIZE, sizeof(unsigned)); unsigned iter; for (iter = 0; iter < N; iter++) { struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->handles[0] = v_handle; task->handles[1] = v_handle; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_data_unregister(v_handle); starpu_free(v); starpu_shutdown(); return EXIT_SUCCESS; enodev: starpu_data_unregister(v_handle); starpu_free(v); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/microbenchs/sync_tasks_overhead.c000066400000000000000000000066521320135501600236170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Measure the cost of submitting synchronous tasks */ static unsigned ntasks = 65536; void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 0 }; static int inject_one_task(void) { int ret; struct starpu_task *task = starpu_task_create(); task->cl = &dummy_codelet; task->cl_arg = NULL; task->callback_func = NULL; task->synchronous = 1; ret = starpu_task_submit(task); return ret; } static void parse_args(int argc, char **argv) { int c; while ((c = getopt(argc, argv, "i:")) != -1) switch(c) { case 'i': ntasks = atoi(optarg); break; } } int main(int argc, char **argv) { int ret; unsigned i; double timing; double start; double end; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncpus = 2; #ifdef STARPU_QUICK_CHECK ntasks = 128; #endif parse_args(argc, argv); ret = starpu_initialize(&conf, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); fprintf(stderr, "#tasks : %u\n", ntasks); start = starpu_timing_now(); for (i = 0; i < ntasks; i++) { ret = inject_one_task(); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } end = starpu_timing_now(); timing = end - start; fprintf(stderr, "Total: %f secs\n", timing/1000000); fprintf(stderr, "Per task: %f usecs\n", timing/ntasks); { char *output_dir = getenv("STARPU_BENCH_DIR"); char *bench_id = getenv("STARPU_BENCH_ID"); if (output_dir && bench_id) { char file[1024]; FILE *f; snprintf(file, 1024, "%s/sync_tasks_overhead_total.dat", output_dir); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing/1000000); fclose(f); snprintf(file, 1024, "%s/sync_tasks_overhead_per_task.dat", output_dir); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing/ntasks); fclose(f); } } starpu_shutdown(); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/microbenchs/tasks_overhead.c000066400000000000000000000156401320135501600225600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013-2014, 2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Measure the submission time and execution time of asynchronous tasks */ starpu_data_handle_t data_handles[8]; float *buffers[8]; #ifdef STARPU_QUICK_CHECK static unsigned ntasks = 128; #else static unsigned ntasks = 65536; #endif static unsigned nbuffers = 0; struct starpu_task *tasks; void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .model = NULL, .nbuffers = 0, .modes = {STARPU_RW, STARPU_RW, STARPU_RW, STARPU_RW, STARPU_RW, STARPU_RW, STARPU_RW, STARPU_RW} }; static int inject_one_task(void) { struct starpu_task *task = starpu_task_create(); task->cl = &dummy_codelet; task->cl_arg = NULL; task->callback_func = NULL; task->synchronous = 1; int ret; ret = starpu_task_submit(task); return ret; } static void parse_args(int argc, char **argv) { int c; while ((c = getopt(argc, argv, "i:b:h")) != -1) switch(c) { case 'i': ntasks = atoi(optarg); break; case 'b': nbuffers = atoi(optarg); dummy_codelet.nbuffers = nbuffers; break; case 'h': fprintf(stderr, "Usage: %s [-i ntasks] [-b nbuffers] [-h]\n", argv[0]); break; } } int main(int argc, char **argv) { int ret; unsigned i; double timing_submit; double start_submit; double end_submit; double timing_exec; double start_exec; double end_exec; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncpus = 2; parse_args(argc, argv); ret = starpu_initialize(&conf, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); unsigned buffer; for (buffer = 0; buffer < nbuffers; buffer++) { starpu_malloc((void**)&buffers[buffer], 16*sizeof(float)); starpu_vector_data_register(&data_handles[buffer], STARPU_MAIN_RAM, (uintptr_t)buffers[buffer], 16, sizeof(float)); } fprintf(stderr, "#tasks : %u\n#buffers : %u\n", ntasks, nbuffers); /* submit tasks (but don't execute them yet !) */ tasks = (struct starpu_task *) calloc(1, ntasks*sizeof(struct starpu_task)); for (i = 0; i < ntasks; i++) { starpu_task_init(&tasks[i]); tasks[i].callback_func = NULL; tasks[i].cl = &dummy_codelet; tasks[i].cl_arg = NULL; tasks[i].synchronous = 0; tasks[i].use_tag = 1; tasks[i].tag_id = (starpu_tag_t)i; /* we have 8 buffers at most */ for (buffer = 0; buffer < nbuffers; buffer++) { tasks[i].handles[buffer] = data_handles[buffer]; } } tasks[ntasks-1].detach = 0; start_submit = starpu_timing_now(); for (i = 1; i < ntasks; i++) { starpu_tag_declare_deps((starpu_tag_t)i, 1, (starpu_tag_t)(i-1)); ret = starpu_task_submit(&tasks[i]); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } /* submit the first task */ ret = starpu_task_submit(&tasks[0]); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); end_submit = starpu_timing_now(); /* wait for the execution of the tasks */ start_exec = starpu_timing_now(); ret = starpu_task_wait(&tasks[ntasks-1]); STARPU_CHECK_RETURN_VALUE(ret, "starpu_tag_wait"); end_exec = starpu_timing_now(); starpu_task_wait_for_all(); for (i = 0; i < ntasks; i++) starpu_task_clean(&tasks[i]); for (buffer = 0; buffer < nbuffers; buffer++) starpu_data_unregister(data_handles[buffer]); timing_submit = end_submit - start_submit; timing_exec = end_exec - start_exec; fprintf(stderr, "Total submit: %f secs\n", timing_submit/1000000); fprintf(stderr, "Per task submit: %f usecs\n", timing_submit/ntasks); fprintf(stderr, "\n"); fprintf(stderr, "Total execution: %f secs\n", timing_exec/1000000); fprintf(stderr, "Per task execution: %f usecs\n", timing_exec/ntasks); fprintf(stderr, "\n"); fprintf(stderr, "Total: %f secs\n", (timing_submit+timing_exec)/1000000); fprintf(stderr, "Per task: %f usecs\n", (timing_submit+timing_exec)/ntasks); { char *output_dir = getenv("STARPU_BENCH_DIR"); char *bench_id = getenv("STARPU_BENCH_ID"); if (output_dir && bench_id) { char file[1024]; FILE *f; snprintf(file, 1024, "%s/tasks_overhead_total_submit.dat", output_dir); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing_submit/1000000); fclose(f); snprintf(file, 1024, "%s/tasks_overhead_per_task_submit.dat", output_dir); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing_submit/ntasks); fclose(f); snprintf(file, 1024, "%s/tasks_overhead_total_execution.dat", output_dir); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing_exec/1000000); fclose(f); snprintf(file, 1024, "%s/tasks_overhead_per_task_execution.dat", output_dir); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing_exec/ntasks); fclose(f); snprintf(file, 1024, "%s/tasks_overhead_total_submit_execution.dat", output_dir); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, (timing_submit+timing_exec)/1000000); fclose(f); snprintf(file, 1024, "%s/tasks_overhead_per_task_submit_execution.dat", output_dir); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, (timing_submit+timing_exec)/ntasks); fclose(f); } } starpu_shutdown(); free(tasks); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); free(tasks); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/microbenchs/tasks_size_overhead.c000066400000000000000000000206001320135501600236020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2014, 2016-2017 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * This benchmark creates a thousand tasks of the same (small) duration, with * various number of cpus and various durations. * * Use ./tasks_size_overhead.sh to generate a plot of the result. * * Thanks Martin Tillenius for the idea. */ #define START 4 #define STOP 4096 #ifdef STARPU_QUICK_CHECK #define FACTOR 8 #else #define FACTOR 2 #endif #ifdef STARPU_QUICK_CHECK static unsigned ntasks = 1; #elif !defined(STARPU_LONG_CHECK) static unsigned ntasks = 64; #else static unsigned ntasks = 256; #endif static unsigned nbuffers = 0; static unsigned total_nbuffers = 0; static unsigned mincpus = 1, maxcpus, cpustep = 1; static unsigned mintime = START, maxtime = STOP, factortime = FACTOR; struct starpu_task *tasks; void func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg) { unsigned n = (uintptr_t)arg; long usec = 0; double tv1 = starpu_timing_now(); do { double tv2 = starpu_timing_now(); usec = tv2 - tv1; } while (usec < n); } double cost_function(struct starpu_task *t, struct starpu_perfmodel_arch *a, unsigned i) { (void) t; (void) i; unsigned n = (uintptr_t) t->cl_arg; return n; } static struct starpu_perfmodel perf_model = { .type = STARPU_PER_ARCH, .arch_cost_function = cost_function, }; static struct starpu_codelet codelet = { .cpu_funcs = {func}, .nbuffers = 0, .modes = {STARPU_R, STARPU_R, STARPU_R, STARPU_R, STARPU_R, STARPU_R, STARPU_R, STARPU_R}, .model = &perf_model, }; static void parse_args(int argc, char **argv) { int c; while ((c = getopt(argc, argv, "i:b:B:c:C:s:t:T:f:h")) != -1) switch(c) { case 'i': ntasks = atoi(optarg); break; case 'b': nbuffers = atoi(optarg); codelet.nbuffers = nbuffers; break; case 'B': total_nbuffers = atoi(optarg); break; case 'c': mincpus = atoi(optarg); break; case 'C': maxcpus = atoi(optarg); break; case 's': cpustep = atoi(optarg); break; case 't': mintime = atoi(optarg); break; case 'T': maxtime = atoi(optarg); break; case 'f': factortime = atoi(optarg); break; case 'h': fprintf(stderr, "\ Usage: %s [-h]\n\ [-i ntasks] [-b nbuffers] [-B total_nbuffers]\n\ [-c mincpus] [ -C maxcpus] [-s cpustep]\n\ [-t mintime] [-T maxtime] [-f factortime]\n\n", argv[0]); fprintf(stderr,"\ runs 'ntasks' tasks\n\ - using 'nbuffers' data each, randomly among 'total_nbuffers' choices,\n\ - with varying task durations, from 'mintime' to 'maxtime' (using 'factortime')\n\ - on varying numbers of cpus, from 'mincpus' to 'maxcpus' (using 'cpustep')\n\ \n\ currently selected parameters: %u tasks using %u buffers among %u, from %uus to %uus (factor %u), from %u cpus to %u cpus (step %u)\n\ ", ntasks, nbuffers, total_nbuffers, mintime, maxtime, factortime, mincpus, maxcpus, cpustep); exit(EXIT_SUCCESS); break; } } int main(int argc, char **argv) { int ret; unsigned i; unsigned size; unsigned ncpus; double timing; double start; double end; struct starpu_conf conf; unsigned buffer; char *starpu_sched = getenv("STARPU_SCHED"); if (starpu_sched && !strcmp(starpu_sched, "pheft")) /* pheft does not run tasks in parallel, avoid burning time... */ return STARPU_TEST_SKIPPED; /* Get number of CPUs */ starpu_conf_init(&conf); conf.ncuda = 0; conf.nopencl = 0; #ifdef STARPU_SIMGRID /* This will get serialized, avoid spending too much time on it. */ maxcpus = 2; #else ret = starpu_init(&conf); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); maxcpus = starpu_worker_get_count_by_type(STARPU_CPU_WORKER); starpu_shutdown(); #endif #ifdef STARPU_HAVE_UNSETENV /* That was useful to force the max number of cpus to use, but now we * want to make it vary */ unsetenv("STARPU_NCPUS"); unsetenv("STARPU_NCPU"); #endif parse_args(argc, argv); float *buffers[total_nbuffers?total_nbuffers:1]; /* Allocate data */ for (buffer = 0; buffer < total_nbuffers; buffer++) buffers[buffer] = (float *) malloc(16*sizeof(float)); tasks = (struct starpu_task *) calloc(1, ntasks*maxcpus*sizeof(struct starpu_task)); /* Emit headers and compute raw tasks speed */ FPRINTF(stdout, "# tasks : %u buffers : %u total_nbuffers : %u\n", ntasks, nbuffers, total_nbuffers); FPRINTF(stdout, "# ncpus\t"); for (size = mintime; size <= maxtime; size *= factortime) FPRINTF(stdout, "%u iters(us)\ttotal(s)\t", size); FPRINTF(stdout, "\n"); FPRINTF(stdout, "\"seq\"\t"); for (size = mintime; size <= maxtime; size *= factortime) { double dstart, dend; dstart = starpu_timing_now(); for (i = 0; i < ntasks; i++) func(NULL, (void*) (uintptr_t) size); dend = starpu_timing_now(); FPRINTF(stdout, "%.0f \t%f\t", (dend-dstart)/ntasks, (dend-dstart)/1000000); } FPRINTF(stdout, "\n"); fflush(stdout); starpu_data_handle_t data_handles[total_nbuffers?total_nbuffers:1]; /* For each number of cpus, benchmark */ for (ncpus= mincpus; ncpus <= maxcpus; ncpus += cpustep) { FPRINTF(stdout, "%u\t", ncpus); fflush(stdout); conf.ncpus = ncpus; ret = starpu_init(&conf); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); for (buffer = 0; buffer < total_nbuffers; buffer++) starpu_vector_data_register(&data_handles[buffer], STARPU_MAIN_RAM, (uintptr_t)buffers[buffer], 16, sizeof(float)); for (size = mintime; size <= maxtime; size *= factortime) { /* submit tasks */ start = starpu_timing_now(); for (i = 0; i < ntasks * ncpus; i++) { starpu_data_handle_t *handles; starpu_task_init(&tasks[i]); tasks[i].callback_func = NULL; tasks[i].cl = &codelet; tasks[i].cl_arg = (void*) (uintptr_t) size; tasks[i].synchronous = 0; if (nbuffers > STARPU_NMAXBUFS) { tasks[i].dyn_handles = malloc(nbuffers * sizeof(*data_handles)); handles = tasks[i].dyn_handles; tasks[i].dyn_modes = malloc(nbuffers * sizeof(tasks[i].dyn_modes)); for (buffer = 0; buffer < nbuffers; buffer++) tasks[i].dyn_modes[buffer] = STARPU_R; } else handles = tasks[i].handles; if (nbuffers >= total_nbuffers) for (buffer = 0; buffer < nbuffers; buffer++) handles[buffer] = data_handles[buffer%total_nbuffers]; else for (buffer = 0; buffer < nbuffers; buffer++) handles[buffer] = data_handles[starpu_lrand48()%total_nbuffers]; ret = starpu_task_submit(&tasks[i]); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task"); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); end = starpu_timing_now(); for (i = 0; i < ntasks * ncpus; i++) starpu_task_clean(&tasks[i]); timing = end - start; FPRINTF(stdout, "%u\t%f\t", size, timing/ncpus/1000000); fflush(stdout); { char *output_dir = getenv("STARPU_BENCH_DIR"); char *bench_id = getenv("STARPU_BENCH_ID"); char *sched = getenv("STARPU_SCHED"); if (output_dir && bench_id) { char file[1024]; FILE *f; snprintf(file, 1024, "%s/tasks_size_overhead_total%s%s.dat", output_dir, sched?"_":"", sched?sched:""); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing/ncpus/1000000); fclose(f); } } } for (buffer = 0; buffer < total_nbuffers; buffer++) { starpu_data_unregister(data_handles[buffer]); } starpu_shutdown(); FPRINTF(stdout, "\n"); fflush(stdout); } free(tasks); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); free(tasks); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/microbenchs/tasks_size_overhead.gp000077500000000000000000000042451320135501600240000ustar00rootroot00000000000000#!/bin/sh # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009, 2010, 2016 Université de Bordeaux # Copyright (C) 2010, 2011 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. #!/bin/sh OUTPUT=tasks_size_overhead.output VALS=$(sed -n -e '3p' < $OUTPUT) VAL1=$(echo "$VALS" | cut -d ' ' -f 3) VAL2=$(echo "$VALS" | cut -d ' ' -f 5) VAL3=$(echo "$VALS" | cut -d ' ' -f 7) VAL4=$(echo "$VALS" | cut -d ' ' -f 9) VAL5=$(echo "$VALS" | cut -d ' ' -f 11) VAL6=$(echo "$VALS" | cut -d ' ' -f 13) VAL7=$(echo "$VALS" | cut -d ' ' -f 15) VAL8=$(echo "$VALS" | cut -d ' ' -f 17) VAL9=$(echo "$VALS" | cut -d ' ' -f 19) VAL10=$(echo "$VALS" | cut -d ' ' -f 21) VAL11=$(echo "$VALS" | cut -d ' ' -f 23) gnuplot << EOF set terminal eps set output "tasks_size_overhead.eps" set key top left set xlabel "number of cores" set ylabel "speedup" plot \ x title "linear", \ "$OUTPUT" using 1:($VAL11)/(\$23) with linespoints title columnheader(22), \ "$OUTPUT" using 1:($VAL10)/(\$21) with linespoints title columnheader(20), \ "$OUTPUT" using 1:($VAL9)/(\$19) with linespoints title columnheader(18), \ "$OUTPUT" using 1:($VAL8)/(\$17) with linespoints title columnheader(16), \ "$OUTPUT" using 1:($VAL7)/(\$15) with linespoints title columnheader(14), \ "$OUTPUT" using 1:($VAL6)/(\$13) with linespoints title columnheader(12), \ "$OUTPUT" using 1:($VAL5)/(\$11) with linespoints title columnheader(10), \ "$OUTPUT" using 1:($VAL4)/(\$9) with linespoints title columnheader(8), \ "$OUTPUT" using 1:($VAL3)/(\$7) with linespoints title columnheader(6), \ "$OUTPUT" using 1:($VAL2)/(\$5) with linespoints title columnheader(4), \ "$OUTPUT" using 1:($VAL1)/(\$3) with linespoints title columnheader(2) EOF starpu-1.2.3+dfsg/tests/microbenchs/tasks_size_overhead.sh000077500000000000000000000014211320135501600237750ustar00rootroot00000000000000#!/bin/sh # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009, 2010 Université de Bordeaux # Copyright (C) 2010, 2011 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. #!/bin/sh ROOT=${0%.sh} $ROOT "$@" > tasks_size_overhead.output $ROOT.gp gv tasks_size_overhead.eps starpu-1.2.3+dfsg/tests/openmp/000077500000000000000000000000001320135501600164065ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/openmp/api_01.c000066400000000000000000000104601320135501600176240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" #include #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret; /* we clear the whole OMP environment for this test, to check the * default behaviour of API functions */ unsetenv("OMP_DYNAMIC"); unsetenv("OMP_NESTED"); unsetenv("OMP_SCHEDULE"); unsetenv("OMP_STACKSIZE"); unsetenv("OMP_WAIT_POLICY"); unsetenv("OMP_THREAD_LIMIT"); unsetenv("OMP_MAX_ACTIVE_LEVELS"); unsetenv("OMP_CANCELLATION"); unsetenv("OMP_DEFAULT_DEVICE"); unsetenv("OMP_PROC_BIND"); unsetenv("OMP_NUM_THREADS"); unsetenv("OMP_PLACES"); unsetenv("OMP_DISPLAY_ENV"); ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } #define check_omp_func(f,_tv) \ { \ const int v = (f()); \ const int tv = (_tv); \ printf(#f ": %d (should be %d)\n", v, tv); \ STARPU_ASSERT(v == tv); \ } const char * get_sched_name(int sched_value) { const char *sched_name = NULL; switch (sched_value) { case starpu_omp_sched_undefined: sched_name = ""; break; case starpu_omp_sched_static: sched_name = "static"; break; case starpu_omp_sched_dynamic: sched_name = "dynamic"; break; case starpu_omp_sched_guided: sched_name = "guided"; break; case starpu_omp_sched_auto: sched_name = "auto"; break; case starpu_omp_sched_runtime: sched_name = "runtime"; break; default: _STARPU_ERROR("invalid omp schedule value"); } return sched_name; } int main (int argc, char *argv[]) { const int nb_cpus = starpu_cpu_worker_get_count(); check_omp_func(starpu_omp_get_num_threads, 1); check_omp_func(starpu_omp_get_thread_num, 0); /* since OMP_NUM_THREADS is cleared, starpu_omp_get_max_threads() should return nb_cpus */ check_omp_func(starpu_omp_get_max_threads, nb_cpus); check_omp_func(starpu_omp_get_num_procs, nb_cpus); check_omp_func(starpu_omp_in_parallel, 0); check_omp_func(starpu_omp_get_dynamic, 0); check_omp_func(starpu_omp_get_nested, 0); check_omp_func(starpu_omp_get_cancellation, 0); { const enum starpu_omp_sched_value target_kind = starpu_omp_sched_static; const int target_modifier = 0; enum starpu_omp_sched_value kind; int modifier; const char *sched_name; const char *target_sched_name; starpu_omp_get_schedule(&kind, &modifier); sched_name = get_sched_name(kind); target_sched_name = get_sched_name(target_kind); printf("starpu_omp_get_schedule: %s,%d (should be %s,%d)\n", sched_name, modifier, target_sched_name, target_modifier); STARPU_ASSERT(kind == target_kind && modifier == target_modifier); } check_omp_func(starpu_omp_get_thread_limit, nb_cpus); check_omp_func(starpu_omp_get_max_active_levels, 1); check_omp_func(starpu_omp_get_level, 0); { const int tv = 0; const int v = starpu_omp_get_ancestor_thread_num(0); printf("starpu_omp_get_ancestor_thread_num(0): %d (should be %d)\n", v, tv); STARPU_ASSERT(v == tv); } { const int tv = 1; const int v = starpu_omp_get_team_size(0); printf("starpu_omp_get_team_size(0): %d (should be %d)\n", v, tv); STARPU_ASSERT(v == tv); } check_omp_func(starpu_omp_get_active_level, 0); check_omp_func(starpu_omp_in_final, 0); check_omp_func(starpu_omp_get_proc_bind, starpu_omp_proc_bind_undefined); check_omp_func(starpu_omp_get_default_device, 0); /* TODO: support more than one device */ check_omp_func(starpu_omp_get_num_devices, 1); check_omp_func(starpu_omp_get_num_teams, 1); check_omp_func(starpu_omp_get_team_num, 0); check_omp_func(starpu_omp_is_initial_device, 1); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/array_slice_01.c000066400000000000000000000146021320135501600213520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else #define NX 64 int global_vector[NX]; __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void task_region_h(void *buffers[], void *_args) { void **args = _args; struct starpu_vector_interface *_vector = buffers[0]; int nx = STARPU_VECTOR_GET_NX(_vector); int elemsize = STARPU_VECTOR_GET_ELEMSIZE(_vector); int slice_base = STARPU_VECTOR_GET_SLICE_BASE(_vector); int *v = (int *)STARPU_VECTOR_GET_PTR(_vector); int f = (int)(intptr_t)args[0]; int imin = (int)(intptr_t)args[1]; int imax = (int)(intptr_t)args[2]; int i; assert(elemsize == sizeof(v[0])); printf("depth 2 task, entry: vector ptr = %p, slice_base = %d, imin = %d, imax = %d\n", v, slice_base, imin, imax); for (i = imin; i < imax; i++) { assert(i-slice_base>=0); assert(i-slice_base= 2); memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; starpu_omp_parallel_region(&attr); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/cuda_task_01.c000066400000000000000000000124131320135501600210110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) || !defined(STARPU_USE_CUDA) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else #define NX 64 int global_vector_1[NX]; int global_vector_2[NX]; __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void task_region_g(void *buffers[], void *args) { struct starpu_vector_interface *_vector_1 = buffers[0]; int nx1 = STARPU_VECTOR_GET_NX(_vector_1); int *v1 = (int *)STARPU_VECTOR_GET_PTR(_vector_1); struct starpu_vector_interface *_vector_2 = buffers[1]; int nx2 = STARPU_VECTOR_GET_NX(_vector_2); int *v2 = (int *)STARPU_VECTOR_GET_PTR(_vector_2); int f = (int)(intptr_t)args; STARPU_ASSERT(nx1 == nx2); printf("depth 1 task, entry: vector_1 ptr = %p\n", v1); printf("depth 1 task, entry: vector_2 ptr = %p\n", v2); printf("depth 1 task, entry: f = %d\n", f); fprintf(stderr, "cudaMemcpy: -->\n"); cudaMemcpy(v2,v1,nx1*sizeof(*_vector_1), cudaMemcpyDeviceToDevice); fprintf(stderr, "cudaMemcpy: <--\n"); } void master_g1(void *arg) { (void)arg; { starpu_data_handle_t region_vector_handle; int i; printf("master_g1: vector ptr = %p\n", global_vector_1); for (i = 0; i < NX; i++) { global_vector_1[i] = 1; } starpu_vector_data_register(®ion_vector_handle, STARPU_MAIN_RAM, (uintptr_t)global_vector_1, NX, sizeof(global_vector_1[0])); printf("master_g1: region_vector_handle = %p\n", region_vector_handle); } { starpu_data_handle_t region_vector_handle; int i; printf("master_g1: vector ptr = %p\n", global_vector_2); for (i = 0; i < NX; i++) { global_vector_2[i] = 0; } starpu_vector_data_register(®ion_vector_handle, STARPU_MAIN_RAM, (uintptr_t)global_vector_2, NX, sizeof(global_vector_2[0])); printf("master_g1: region_vector_handle = %p\n", region_vector_handle); } } void master_g2(void *arg) { (void)arg; starpu_data_handle_t region_vector_handles[2]; struct starpu_omp_task_region_attr attr; int i; region_vector_handles[0] = starpu_data_lookup(global_vector_1); printf("master_g2: region_vector_handles[0] = %p\n", region_vector_handles[0]); region_vector_handles[1] = starpu_data_lookup(global_vector_2); printf("master_g2: region_vector_handles[1] = %p\n", region_vector_handles[1]); memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = NULL; attr.cl.cuda_funcs[0] = task_region_g; attr.cl.where = STARPU_CUDA; attr.cl.nbuffers = 2; attr.cl.modes[0] = STARPU_R; attr.cl.modes[1] = STARPU_W; attr.handles = region_vector_handles; attr.cl_arg_size = sizeof(void *); attr.cl_arg_free = 0; attr.if_clause = 1; attr.final_clause = 0; attr.untied_clause = 1; attr.mergeable_clause = 0; i = 0; attr.cl_arg = (void *)(intptr_t)i; starpu_omp_task_region(&attr); } void parallel_region_f(void *buffers[], void *args) { (void)buffers; (void)args; starpu_omp_master(master_g1, NULL); starpu_omp_barrier(); { starpu_data_handle_t region_vector_handle_1; region_vector_handle_1 = starpu_data_lookup(global_vector_1); printf("parallel_region block 1: region_vector_handle_1 = %p\n", region_vector_handle_1); } { starpu_data_handle_t region_vector_handle_2; region_vector_handle_2 = starpu_data_lookup(global_vector_2); printf("parallel_region block 1: region_vector_handle_2 = %p\n", region_vector_handle_2); } starpu_omp_barrier(); starpu_omp_master(master_g2, NULL); starpu_omp_barrier(); { starpu_data_handle_t region_vector_handle_1; region_vector_handle_1 = starpu_data_lookup(global_vector_1); printf("parallel_region block 2: region_vector_handle_1 = %p\n", region_vector_handle_1); } { starpu_data_handle_t region_vector_handle_2; region_vector_handle_2 = starpu_data_lookup(global_vector_2); printf("parallel_region block 2: region_vector_handle_2 = %p\n", region_vector_handle_2); } } int main (int argc, char *argv[]) { (void)argc; (void)argv; struct starpu_omp_parallel_region_attr attr; if (starpu_cuda_worker_get_count() < 1) { return STARPU_TEST_SKIPPED; } memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; starpu_omp_parallel_region(&attr); int i; for (i = 0; i < NX; i++) { if (global_vector_1[i] != global_vector_2[i]) { fprintf(stderr, "check failed: global_vector_1[%d] = %d, global_vector_2[%d] = %d\n", i, global_vector_1[i], i, global_vector_2[i]); return EXIT_FAILURE; } } return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/environment.c000066400000000000000000000027311320135501600211210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" #include #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else int main (int argc, char *argv[]) { setenv("OMP_DYNAMIC","false", 1); setenv("OMP_NESTED","false", 1); setenv("OMP_SCHEDULE","auto", 1); setenv("OMP_STACKSIZE","2M", 1); setenv("OMP_WAIT_POLICY","passive", 1); setenv("OMP_THREAD_LIMIT","0", 1); setenv("OMP_MAX_ACTIVE_LEVELS","4", 1); setenv("OMP_CANCELLATION","false", 1); setenv("OMP_DEFAULT_DEVICE","0", 1); setenv("OMP_PROC_BIND","spread, spread, close", 1); setenv("OMP_NUM_THREADS","4, 16, 2", 1); setenv("OMP_PLACES","{1,2,3,4},{5,6,7,8}", 1); setenv("OMP_DISPLAY_ENV","verbose", 1); int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); starpu_omp_shutdown(); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/init_exit_01.c000066400000000000000000000016771320135501600210610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else int main (int argc, char *argv[]) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); starpu_omp_shutdown(); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/init_exit_02.c000066400000000000000000000021051320135501600210450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } int main (int argc, char *argv[]) { return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/parallel_01.c000066400000000000000000000030531320135501600206470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d\n", (void *)tid, worker_id); } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; starpu_omp_parallel_region(&attr); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/parallel_02.c000066400000000000000000000040521320135501600206500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void parallel_region_2_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] parallel region 2: task thread = %d\n", (void *)tid, worker_id); } void parallel_region_1_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; struct starpu_omp_parallel_region_attr attr; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] parallel region 1: task thread = %d\n", (void *)tid, worker_id); memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_2_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; starpu_omp_parallel_region(&attr); } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_1_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; starpu_omp_parallel_region(&attr); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/parallel_03.c000066400000000000000000000031171320135501600206520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d\n", (void *)tid, worker_id); } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; starpu_omp_parallel_region(&attr); starpu_omp_parallel_region(&attr); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/parallel_barrier_01.c000066400000000000000000000036421320135501600223610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d -- barrier 1\n", (void *)tid, worker_id); starpu_omp_barrier(); printf("[tid %p] task thread = %d -- barrier 2\n", (void *)tid, worker_id); starpu_omp_barrier(); printf("[tid %p] task thread = %d -- barrier 3\n", (void *)tid, worker_id); starpu_omp_barrier(); printf("[tid %p] task thread = %d -- barrier 4\n", (void *)tid, worker_id); starpu_omp_barrier(); } int main (int argc, char *argv[]) { pthread_t tid; struct starpu_omp_parallel_region_attr attr; tid = pthread_self(); memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; starpu_omp_parallel_region(&attr); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/parallel_critical_01.c000066400000000000000000000042421320135501600225220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void critical_g(void *arg) { (void) arg; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d -- critical\n", (void *)tid, worker_id); } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d -- parallel -->\n", (void *)tid, worker_id); starpu_omp_critical(critical_g, NULL, NULL); starpu_omp_critical(critical_g, NULL, NULL); starpu_omp_critical(critical_g, NULL, NULL); starpu_omp_critical(critical_g, NULL, NULL); printf("[tid %p] task thread = %d -- parallel <--\n", (void *)tid, worker_id); } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); printf("
    \n"); memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; starpu_omp_parallel_region(&attr); printf("
    \n"); starpu_omp_parallel_region(&attr); printf("
    \n"); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/parallel_critical_inline_01.c000066400000000000000000000046121320135501600240610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d -- parallel -->\n", (void *)tid, worker_id); starpu_omp_critical_inline_begin(NULL); printf("[tid %p] task thread = %d -- critical\n", (void *)tid, worker_id); starpu_omp_critical_inline_end(NULL); starpu_omp_critical_inline_begin(NULL); printf("[tid %p] task thread = %d -- critical\n", (void *)tid, worker_id); starpu_omp_critical_inline_end(NULL); starpu_omp_critical_inline_begin(NULL); printf("[tid %p] task thread = %d -- critical\n", (void *)tid, worker_id); starpu_omp_critical_inline_end(NULL); starpu_omp_critical_inline_begin(NULL); printf("[tid %p] task thread = %d -- critical\n", (void *)tid, worker_id); starpu_omp_critical_inline_end(NULL); printf("[tid %p] task thread = %d -- parallel <--\n", (void *)tid, worker_id); } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); printf("
    \n"); memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; starpu_omp_parallel_region(&attr); printf("
    \n"); starpu_omp_parallel_region(&attr); printf("
    \n"); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/parallel_critical_named_01.c000066400000000000000000000045771320135501600237010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void critical_g(void *arg) { (void) arg; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d -- critical \"g\"\n", (void *)tid, worker_id); } void critical_h(void *arg) { (void) arg; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d -- critical \"h\"\n", (void *)tid, worker_id); } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d -- parallel -->\n", (void *)tid, worker_id); starpu_omp_critical(critical_g, NULL, "g"); starpu_omp_critical(critical_h, NULL, "h"); starpu_omp_critical(critical_g, NULL, "g"); starpu_omp_critical(critical_h, NULL, "h"); printf("[tid %p] task thread = %d -- parallel <--\n", (void *)tid, worker_id); } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); printf("
    \n"); memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; starpu_omp_parallel_region(&attr); printf("
    \n"); starpu_omp_parallel_region(&attr); printf("
    \n"); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/parallel_critical_named_inline_01.c000066400000000000000000000046321320135501600252270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d -- parallel -->\n", (void *)tid, worker_id); starpu_omp_critical_inline_begin("g"); printf("[tid %p] task thread = %d -- critical \"g\"\n", (void *)tid, worker_id); starpu_omp_critical_inline_end("g"); starpu_omp_critical_inline_begin("h"); printf("[tid %p] task thread = %d -- critical \"h\"\n", (void *)tid, worker_id); starpu_omp_critical_inline_end("h"); starpu_omp_critical_inline_begin("g"); printf("[tid %p] task thread = %d -- critical \"g\"\n", (void *)tid, worker_id); starpu_omp_critical_inline_end("g"); starpu_omp_critical_inline_begin("h"); printf("[tid %p] task thread = %d -- critical \"h\"\n", (void *)tid, worker_id); starpu_omp_critical_inline_end("h"); printf("[tid %p] task thread = %d -- parallel <--\n", (void *)tid, worker_id); } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); printf("
    \n"); memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; starpu_omp_parallel_region(&attr); printf("
    \n"); starpu_omp_parallel_region(&attr); printf("
    \n"); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/parallel_for_01.c000066400000000000000000000111471320135501600215200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else #define NB_ITERS 256 #define CHUNK 16 unsigned long long array[NB_ITERS]; __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void for_g(unsigned long long i, unsigned long long nb_i, void *arg) { int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d, for [%s] iterations first=%llu:nb=%llu\n", (void *)tid, worker_id, (const char *)arg, i, nb_i); for (; nb_i > 0; i++, nb_i--) { array[i] = 1; } } void parallel_region_1_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d\n", (void *)tid, worker_id); starpu_omp_for(for_g, (void*)"static chunk", NB_ITERS, CHUNK, starpu_omp_sched_static, 0, 0); } void parallel_region_2_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d\n", (void *)tid, worker_id); starpu_omp_for(for_g, (void*)"static nochunk", NB_ITERS, 0, starpu_omp_sched_static, 0, 0); } void parallel_region_3_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d\n", (void *)tid, worker_id); starpu_omp_for(for_g, (void*)"dynamic chunk", NB_ITERS, CHUNK, starpu_omp_sched_dynamic, 0, 0); } void parallel_region_4_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d\n", (void *)tid, worker_id); starpu_omp_for(for_g, (void*)"dynamic nochunk", NB_ITERS, 0, starpu_omp_sched_dynamic, 0, 0); } void parallel_region_5_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d\n", (void *)tid, worker_id); starpu_omp_for(for_g, (void*)"guided nochunk", NB_ITERS, 0, starpu_omp_sched_guided, 0, 0); } void parallel_region_6_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d\n", (void *)tid, worker_id); starpu_omp_for(for_g, (void*)"guided nochunk", NB_ITERS, 0, starpu_omp_sched_guided, 0, 0); } static void clear_array(void) { memset(array, 0, NB_ITERS*sizeof(unsigned long long)); } static void check_array(void) { unsigned long long i; unsigned long long s = 0; for (i = 0; i < NB_ITERS; i++) { s += array[i]; } if (s != NB_ITERS) { printf("missing iterations\n"); exit(1); } } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); attr.cl.where = STARPU_CPU; attr.if_clause = 1; clear_array(); attr.cl.cpu_funcs[0] = parallel_region_1_f; starpu_omp_parallel_region(&attr); check_array(); clear_array(); attr.cl.cpu_funcs[0] = parallel_region_2_f; starpu_omp_parallel_region(&attr); check_array(); clear_array(); attr.cl.cpu_funcs[0] = parallel_region_3_f; starpu_omp_parallel_region(&attr); check_array(); clear_array(); attr.cl.cpu_funcs[0] = parallel_region_4_f; starpu_omp_parallel_region(&attr); check_array(); clear_array(); attr.cl.cpu_funcs[0] = parallel_region_5_f; starpu_omp_parallel_region(&attr); check_array(); clear_array(); attr.cl.cpu_funcs[0] = parallel_region_6_f; starpu_omp_parallel_region(&attr); check_array(); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/parallel_for_02.c000066400000000000000000000056141320135501600215230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else #define NB_ITERS 4321 #define CHUNK 42 __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void for_g(unsigned long long i, unsigned long long nb_i, void *arg) { int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d, for [%s] iterations first=%llu:nb=%llu\n", (void *)tid, worker_id, (const char *)arg, i, nb_i); for (; nb_i > 0; i++, nb_i--) { printf("[tid %p] task thread = %d, for [%s] iteration %llu\n", (void *)tid, worker_id, (const char *)arg, i); } } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d\n", (void *)tid, worker_id); starpu_omp_for(for_g, (void*)"static chunk", NB_ITERS, CHUNK, starpu_omp_sched_static, 0, 1); printf("[tid %p] task thread = %d\n", (void *)tid, worker_id); starpu_omp_for(for_g, (void*)"static nochunk", NB_ITERS, 0, starpu_omp_sched_static, 0, 1); printf("[tid %p] task thread = %d\n", (void *)tid, worker_id); starpu_omp_for(for_g, (void*)"dynamic chunk", NB_ITERS, CHUNK, starpu_omp_sched_dynamic, 0, 1); printf("[tid %p] task thread = %d\n", (void *)tid, worker_id); starpu_omp_for(for_g, (void*)"dynamic nochunk", NB_ITERS, 0, starpu_omp_sched_dynamic, 0, 1); printf("[tid %p] task thread = %d\n", (void *)tid, worker_id); starpu_omp_for(for_g, (void*)"guided chunk", NB_ITERS, CHUNK, starpu_omp_sched_guided, 0, 1); printf("[tid %p] task thread = %d\n", (void *)tid, worker_id); starpu_omp_for(for_g, (void*)"guided nochunk", NB_ITERS, 0, starpu_omp_sched_guided, 0, 1); } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; starpu_omp_parallel_region(&attr); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/parallel_for_ordered_01.c000066400000000000000000000120371320135501600232230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else #define NB_ITERS 256 #define CHUNK 16 unsigned long long array[NB_ITERS]; __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } struct s_ordered_arg { const char *msg; unsigned long long i; }; void ordered_f(void *_arg) { struct s_ordered_arg *arg = _arg; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d, for [%s] iteration (ordered) %llu\n", (void *)tid, worker_id, arg->msg, arg->i); } void for_g(unsigned long long i, unsigned long long nb_i, void *arg) { int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d, for [%s] iterations first=%llu:nb=%llu\n", (void *)tid, worker_id, (const char *)arg, i, nb_i); for (; nb_i > 0; i++, nb_i--) { struct s_ordered_arg ordered_arg = { arg, i }; array[i] = 1; starpu_omp_ordered(ordered_f, &ordered_arg); } } void parallel_region_1_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d\n", (void *)tid, worker_id); starpu_omp_for(for_g, (void*)"static chunk", NB_ITERS, CHUNK, starpu_omp_sched_static, 1, 0); } void parallel_region_2_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d\n", (void *)tid, worker_id); starpu_omp_for(for_g, (void*)"static nochunk", NB_ITERS, 0, starpu_omp_sched_static, 1, 0); } void parallel_region_3_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d\n", (void *)tid, worker_id); starpu_omp_for(for_g, (void*)"dynamic chunk", NB_ITERS, CHUNK, starpu_omp_sched_dynamic, 1, 0); } void parallel_region_4_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d\n", (void *)tid, worker_id); starpu_omp_for(for_g, (void*)"dynamic nochunk", NB_ITERS, 0, starpu_omp_sched_dynamic, 1, 0); } void parallel_region_5_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d\n", (void *)tid, worker_id); starpu_omp_for(for_g, (void*)"guided nochunk", NB_ITERS, 0, starpu_omp_sched_guided, 1, 0); } void parallel_region_6_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d\n", (void *)tid, worker_id); starpu_omp_for(for_g, (void*)"guided nochunk", NB_ITERS, 0, starpu_omp_sched_guided, 1, 0); } static void clear_array(void) { memset(array, 0, NB_ITERS*sizeof(unsigned long long)); } static void check_array(void) { unsigned long long i; unsigned long long s = 0; for (i = 0; i < NB_ITERS; i++) { s += array[i]; } if (s != NB_ITERS) { printf("missing iterations\n"); exit(1); } } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); attr.cl.where = STARPU_CPU; attr.if_clause = 1; clear_array(); attr.cl.cpu_funcs[0] = parallel_region_1_f; starpu_omp_parallel_region(&attr); check_array(); clear_array(); attr.cl.cpu_funcs[0] = parallel_region_2_f; starpu_omp_parallel_region(&attr); check_array(); clear_array(); attr.cl.cpu_funcs[0] = parallel_region_3_f; starpu_omp_parallel_region(&attr); check_array(); clear_array(); attr.cl.cpu_funcs[0] = parallel_region_4_f; starpu_omp_parallel_region(&attr); check_array(); clear_array(); attr.cl.cpu_funcs[0] = parallel_region_5_f; starpu_omp_parallel_region(&attr); check_array(); clear_array(); attr.cl.cpu_funcs[0] = parallel_region_6_f; starpu_omp_parallel_region(&attr); check_array(); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/parallel_master_01.c000066400000000000000000000041661320135501600222300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void master_g(void *arg) { (void) arg; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d -- master\n", (void *)tid, worker_id); } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d -- parallel -->\n", (void *)tid, worker_id); starpu_omp_master(master_g, NULL); starpu_omp_master(master_g, NULL); starpu_omp_master(master_g, NULL); starpu_omp_master(master_g, NULL); printf("[tid %p] task thread = %d -- parallel <--\n", (void *)tid, worker_id); } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; printf("
    \n"); starpu_omp_parallel_region(&attr); printf("
    \n"); starpu_omp_parallel_region(&attr); printf("
    \n"); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/parallel_master_inline_01.c000066400000000000000000000043051320135501600235610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d -- parallel -->\n", (void *)tid, worker_id); if (starpu_omp_master_inline()) printf("[tid %p] task thread = %d -- master\n", (void *)tid, worker_id); if (starpu_omp_master_inline()) printf("[tid %p] task thread = %d -- master\n", (void *)tid, worker_id); if (starpu_omp_master_inline()) printf("[tid %p] task thread = %d -- master\n", (void *)tid, worker_id); if (starpu_omp_master_inline()) printf("[tid %p] task thread = %d -- master\n", (void *)tid, worker_id); printf("[tid %p] task thread = %d -- parallel <--\n", (void *)tid, worker_id); } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; printf("
    \n"); starpu_omp_parallel_region(&attr); printf("
    \n"); starpu_omp_parallel_region(&attr); printf("
    \n"); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/parallel_nested_lock_01.c000066400000000000000000000061261320135501600232250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } starpu_omp_nest_lock_t omp_nest_lock; void locked_func_n2(void) { const int worker_id = starpu_worker_get_id(); const pthread_t tid = pthread_self(); printf("[tid %p] task thread = %d -- locked function n2\n", (void *)tid, worker_id); } void locked_func_n1(void) { const int worker_id = starpu_worker_get_id(); const pthread_t tid = pthread_self(); printf("[tid %p] task thread = %d -- locked function n1 -->\n", (void *)tid, worker_id); starpu_omp_set_nest_lock(&omp_nest_lock); locked_func_n2(); starpu_omp_unset_nest_lock(&omp_nest_lock); printf("[tid %p] task thread = %d -- locked function n1 <--\n", (void *)tid, worker_id); } void master_g1(void *arg) { starpu_omp_init_nest_lock(&omp_nest_lock); } void master_g2(void *arg) { starpu_omp_destroy_nest_lock(&omp_nest_lock); } void parallel_region_f(void *buffers[], void *args) { const int worker_id = starpu_worker_get_id(); const pthread_t tid = pthread_self(); (void) buffers; (void) args; printf("[tid %p] task thread = %d -- parallel -->\n", (void *)tid, worker_id); starpu_omp_master(master_g1, NULL); starpu_omp_barrier(); starpu_omp_set_nest_lock(&omp_nest_lock); locked_func_n1(); starpu_omp_unset_nest_lock(&omp_nest_lock); starpu_omp_set_nest_lock(&omp_nest_lock); locked_func_n1(); starpu_omp_unset_nest_lock(&omp_nest_lock); starpu_omp_set_nest_lock(&omp_nest_lock); locked_func_n1(); starpu_omp_unset_nest_lock(&omp_nest_lock); starpu_omp_set_nest_lock(&omp_nest_lock); locked_func_n1(); starpu_omp_unset_nest_lock(&omp_nest_lock); starpu_omp_barrier(); starpu_omp_master(master_g2, NULL); printf("[tid %p] task thread = %d -- parallel <--\n", (void *)tid, worker_id); } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); printf("
    \n"); memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; starpu_omp_parallel_region(&attr); printf("
    \n"); starpu_omp_parallel_region(&attr); printf("
    \n"); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/parallel_sections_01.c000066400000000000000000000051371320135501600225630ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void f(void *arg) { int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d, section [%s]\n", (void *)tid, worker_id, (const char *)arg); } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; void (*section_f[4])(void *); void *section_args[4]; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d\n", (void *)tid, worker_id); section_f[0] = f; section_f[1] = f; section_f[2] = f; section_f[3] = f; section_args[0] = (void *)"A"; section_args[1] = (void *)"B"; section_args[2] = (void *)"C"; section_args[3] = (void *)"D"; starpu_omp_sections(4, section_f, section_args, 0); section_args[0] = (void *)"E"; section_args[1] = (void *)"F"; section_args[2] = (void *)"G"; section_args[3] = (void *)"H"; starpu_omp_sections(4, section_f, section_args, 0); section_args[0] = (void *)"I"; section_args[1] = (void *)"J"; section_args[2] = (void *)"K"; section_args[3] = (void *)"L"; starpu_omp_sections(4, section_f, section_args, 0); section_args[0] = (void *)"M"; section_args[1] = (void *)"N"; section_args[2] = (void *)"O"; section_args[3] = (void *)"P"; starpu_omp_sections(4, section_f, section_args, 0); } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; starpu_omp_parallel_region(&attr); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/parallel_sections_combined_01.c000066400000000000000000000050521320135501600244170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void f(unsigned long long section_num, void *arg) { int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d, section [%llu: %s]\n", (void *)tid, worker_id, section_num, (const char *)arg); } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; void *section_args[4]; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d\n", (void *)tid, worker_id); section_args[0] = (void *)"A"; section_args[1] = (void *)"B"; section_args[2] = (void *)"C"; section_args[3] = (void *)"D"; starpu_omp_sections_combined(4, f, section_args, 0); section_args[0] = (void *)"E"; section_args[1] = (void *)"F"; section_args[2] = (void *)"G"; section_args[3] = (void *)"H"; starpu_omp_sections_combined(4, f, section_args, 0); section_args[0] = (void *)"I"; section_args[1] = (void *)"J"; section_args[2] = (void *)"K"; section_args[3] = (void *)"L"; starpu_omp_sections_combined(4, f, section_args, 0); section_args[0] = (void *)"M"; section_args[1] = (void *)"N"; section_args[2] = (void *)"O"; section_args[3] = (void *)"P"; starpu_omp_sections_combined(4, f, section_args, 0); } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; starpu_omp_parallel_region(&attr); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/parallel_simple_lock_01.c000066400000000000000000000051031320135501600232260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } starpu_omp_lock_t omp_lock; void locked_func(void) { const int worker_id = starpu_worker_get_id(); const pthread_t tid = pthread_self(); printf("[tid %p] task thread = %d -- locked function\n", (void *)tid, worker_id); } void master_g1(void *arg) { starpu_omp_init_lock(&omp_lock); } void master_g2(void *arg) { starpu_omp_destroy_lock(&omp_lock); } void parallel_region_f(void *buffers[], void *args) { const int worker_id = starpu_worker_get_id(); const pthread_t tid = pthread_self(); (void) buffers; (void) args; printf("[tid %p] task thread = %d -- parallel -->\n", (void *)tid, worker_id); starpu_omp_master(master_g1, NULL); starpu_omp_barrier(); starpu_omp_set_lock(&omp_lock); locked_func(); starpu_omp_unset_lock(&omp_lock); starpu_omp_set_lock(&omp_lock); locked_func(); starpu_omp_unset_lock(&omp_lock); starpu_omp_set_lock(&omp_lock); locked_func(); starpu_omp_unset_lock(&omp_lock); starpu_omp_set_lock(&omp_lock); locked_func(); starpu_omp_unset_lock(&omp_lock); starpu_omp_barrier(); starpu_omp_master(master_g2, NULL); printf("[tid %p] task thread = %d -- parallel <--\n", (void *)tid, worker_id); } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); printf("
    \n"); memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; starpu_omp_parallel_region(&attr); printf("
    \n"); starpu_omp_parallel_region(&attr); printf("
    \n"); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/parallel_single_copyprivate_01.c000066400000000000000000000057201320135501600246400ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void single_g(void *arg, void *_data, unsigned long long data_size) { (void) arg; int *data = _data; STARPU_ASSERT(data_size >= sizeof(*data)); int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); *data = worker_id; printf("[tid %p] task thread = %d -- single\n", (void *)tid, worker_id); } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; int single_worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d -- parallel -->\n", (void *)tid, worker_id); starpu_omp_single_copyprivate(single_g, NULL, &single_worker_id, sizeof(single_worker_id)); printf("[tid %p] task thread = %d -- copyprivate: single_worker_id = %d\n", (void *)tid, worker_id, single_worker_id); starpu_omp_single_copyprivate(single_g, NULL, &single_worker_id, sizeof(single_worker_id)); printf("[tid %p] task thread = %d -- copyprivate: single_worker_id = %d\n", (void *)tid, worker_id, single_worker_id); starpu_omp_single_copyprivate(single_g, NULL, &single_worker_id, sizeof(single_worker_id)); printf("[tid %p] task thread = %d -- copyprivate: single_worker_id = %d\n", (void *)tid, worker_id, single_worker_id); starpu_omp_single_copyprivate(single_g, NULL, &single_worker_id, sizeof(single_worker_id)); printf("[tid %p] task thread = %d -- copyprivate: single_worker_id = %d\n", (void *)tid, worker_id, single_worker_id); printf("[tid %p] task thread = %d -- parallel <--\n", (void *)tid, worker_id); } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; printf("
    \n"); starpu_omp_parallel_region(&attr); printf("
    \n"); starpu_omp_parallel_region(&attr); printf("
    \n"); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/parallel_single_copyprivate_inline_01.c000066400000000000000000000044471320135501600262030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; int single_worker_id; int i; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d -- parallel -->\n", (void *)tid, worker_id); for (i=0; i<4; i++) { int *single_data; if ((single_data = starpu_omp_single_copyprivate_inline_begin(&single_worker_id)) == NULL) { printf("[tid %p] task thread = %d -- single\n", (void *)tid, worker_id); single_worker_id = worker_id; } else { memcpy(&single_worker_id, single_data, sizeof(single_worker_id)); } starpu_omp_single_copyprivate_inline_end(); printf("[tid %p] task thread = %d -- single_worker_id = %d\n", (void *)tid, worker_id, single_worker_id); } printf("[tid %p] task thread = %d -- parallel <--\n", (void *)tid, worker_id); } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; printf("
    \n"); starpu_omp_parallel_region(&attr); printf("
    \n"); starpu_omp_parallel_region(&attr); printf("
    \n"); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/parallel_single_inline_01.c000066400000000000000000000054611320135501600235530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d -- parallel -->\n", (void *)tid, worker_id); /* nowait = 0 */ if (starpu_omp_single_inline()) printf("[tid %p] task thread = %d -- single nowait\n", (void *)tid, worker_id); starpu_omp_barrier(); if (starpu_omp_single_inline()) printf("[tid %p] task thread = %d -- single nowait\n", (void *)tid, worker_id); starpu_omp_barrier(); if (starpu_omp_single_inline()) printf("[tid %p] task thread = %d -- single nowait\n", (void *)tid, worker_id); starpu_omp_barrier(); if (starpu_omp_single_inline()) printf("[tid %p] task thread = %d -- single nowait\n", (void *)tid, worker_id); starpu_omp_barrier(); /* nowait = 1 */ if (starpu_omp_single_inline()) printf("[tid %p] task thread = %d -- single nowait\n", (void *)tid, worker_id); if (starpu_omp_single_inline()) printf("[tid %p] task thread = %d -- single nowait\n", (void *)tid, worker_id); if (starpu_omp_single_inline()) printf("[tid %p] task thread = %d -- single nowait\n", (void *)tid, worker_id); if (starpu_omp_single_inline()) printf("[tid %p] task thread = %d -- single nowait\n", (void *)tid, worker_id); printf("[tid %p] task thread = %d -- parallel <--\n", (void *)tid, worker_id); } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; printf("
    \n"); starpu_omp_parallel_region(&attr); printf("
    \n"); starpu_omp_parallel_region(&attr); printf("
    \n"); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/parallel_single_nowait_01.c000066400000000000000000000042111320135501600235660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void single_g(void *arg) { (void) arg; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d -- single nowait\n", (void *)tid, worker_id); } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d -- parallel -->\n", (void *)tid, worker_id); starpu_omp_single(single_g, NULL, 1); starpu_omp_single(single_g, NULL, 1); starpu_omp_single(single_g, NULL, 1); starpu_omp_single(single_g, NULL, 1); printf("[tid %p] task thread = %d -- parallel <--\n", (void *)tid, worker_id); } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; printf("
    \n"); starpu_omp_parallel_region(&attr); printf("
    \n"); starpu_omp_parallel_region(&attr); printf("
    \n"); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/parallel_single_wait_01.c000066400000000000000000000042021320135501600232310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void single_g(void *arg) { (void) arg; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d -- single\n", (void *)tid, worker_id); } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d -- parallel -->\n", (void *)tid, worker_id); starpu_omp_single(single_g, NULL, 0); starpu_omp_single(single_g, NULL, 0); starpu_omp_single(single_g, NULL, 0); starpu_omp_single(single_g, NULL, 0); printf("[tid %p] task thread = %d -- parallel <--\n", (void *)tid, worker_id); } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; printf("
    \n"); starpu_omp_parallel_region(&attr); printf("
    \n"); starpu_omp_parallel_region(&attr); printf("
    \n"); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/task_01.c000066400000000000000000000043201320135501600200130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void task_region_g(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d: explicit task \"g\"\n", (void *)tid, worker_id); } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; struct starpu_omp_task_region_attr attr; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d: implicit task \"f\"\n", (void *)tid, worker_id); memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = task_region_g; attr.cl.where = STARPU_CPU; attr.if_clause = 1; attr.final_clause = 0; attr.untied_clause = 1; attr.mergeable_clause = 0; starpu_omp_task_region(&attr); starpu_omp_task_region(&attr); starpu_omp_task_region(&attr); starpu_omp_task_region(&attr); } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; starpu_omp_parallel_region(&attr); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/task_02.c000066400000000000000000000117651320135501600200270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else #define NX 64 int global_vector[NX]; __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void task_region_h(void *buffers[], void *args) { struct starpu_vector_interface *_vector = buffers[0]; int nx = STARPU_VECTOR_GET_NX(_vector); int *v = (int *)STARPU_VECTOR_GET_PTR(_vector); int f = (int)(intptr_t)args; int i; printf("depth 2 task, entry: vector ptr = %p\n", v); for (i = 0; i < nx; i++) { v[i] += f; } printf("depth 2 task ending\n"); } void task_region_g(void *buffers[], void *args) { struct starpu_vector_interface *_vector = buffers[0]; int nx = STARPU_VECTOR_GET_NX(_vector); int *v = (int *)STARPU_VECTOR_GET_PTR(_vector); int f = (int)(intptr_t)args; printf("depth 1 task, entry: vector ptr = %p\n", v); { starpu_data_handle_t task_vector_handle; int i; for (i = 0; i < nx; i++) { v[i] += f; } starpu_vector_data_register(&task_vector_handle, STARPU_MAIN_RAM, (uintptr_t)v, NX, sizeof(v[0])); printf("depth 1 task, block 1: task_vector_handle = %p\n", task_vector_handle); } { starpu_data_handle_t task_vector_handle; struct starpu_omp_task_region_attr attr; int i; task_vector_handle = starpu_data_lookup(v); printf("depth 1 task, block 2: task_vector_handle = %p\n", task_vector_handle); memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = task_region_h; attr.cl.where = STARPU_CPU; attr.cl.nbuffers = 1; attr.cl.modes[0] = STARPU_RW; attr.handles = &task_vector_handle; attr.cl_arg_size = sizeof(void *); attr.cl_arg_free = 0; attr.if_clause = 1; attr.final_clause = 0; attr.untied_clause = 1; attr.mergeable_clause = 0; i = 0; attr.cl_arg = (void *)(intptr_t)i++; starpu_omp_task_region(&attr); attr.cl_arg = (void *)(intptr_t)i++; starpu_omp_task_region(&attr); } starpu_omp_taskwait(); } void master_g1(void *arg) { starpu_data_handle_t region_vector_handle; int i; printf("master_g1: vector ptr = %p\n", global_vector); for (i = 0; i < NX; i++) { global_vector[i] = 1; } starpu_vector_data_register(®ion_vector_handle, STARPU_MAIN_RAM, (uintptr_t)global_vector, NX, sizeof(global_vector[0])); printf("master_g1: region_vector_handle = %p\n", region_vector_handle); } void master_g2(void *arg) { starpu_data_handle_t region_vector_handle; struct starpu_omp_task_region_attr attr; int i; region_vector_handle = starpu_data_lookup(global_vector); printf("master_g2: region_vector_handle = %p\n", region_vector_handle); memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = task_region_g; attr.cl.where = STARPU_CPU; attr.cl.nbuffers = 1; attr.cl.modes[0] = STARPU_RW; attr.handles = ®ion_vector_handle; attr.cl_arg_size = sizeof(void *); attr.cl_arg_free = 0; attr.if_clause = 1; attr.final_clause = 0; attr.untied_clause = 1; attr.mergeable_clause = 0; i = 0; attr.cl_arg = (void *)(intptr_t)i++; starpu_omp_task_region(&attr); attr.cl_arg = (void *)(intptr_t)i++; starpu_omp_task_region(&attr); attr.cl_arg = (void *)(intptr_t)i++; starpu_omp_task_region(&attr); attr.cl_arg = (void *)(intptr_t)i++; starpu_omp_task_region(&attr); } void parallel_region_f(void *buffers[], void *args) { starpu_omp_master(master_g1, NULL); starpu_omp_barrier(); { starpu_data_handle_t region_vector_handle; region_vector_handle = starpu_data_lookup(global_vector); printf("parallel_region block 1: region_vector_handle = %p\n", region_vector_handle); } starpu_omp_barrier(); starpu_omp_master(master_g2, NULL); starpu_omp_barrier(); { starpu_data_handle_t region_vector_handle; region_vector_handle = starpu_data_lookup(global_vector); printf("parallel_region block 2: region_vector_handle = %p\n", region_vector_handle); } } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; starpu_omp_parallel_region(&attr); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/taskgroup_01.c000066400000000000000000000062071320135501600210760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void task_region_g(void *buffers[], void *args) { (void) buffers; int i = (int)(intptr_t) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d: explicit task \"g[%d]\"\n", (void *)tid, worker_id, i); } void taskgroup_f(void *arg) { struct starpu_omp_task_region_attr attr; int *p_i = (int *)arg; memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = task_region_g; attr.cl.where = STARPU_CPU; attr.cl_arg_size = sizeof(void *); attr.cl_arg_free = 0; attr.if_clause = 1; attr.final_clause = 0; attr.untied_clause = 1; attr.mergeable_clause = 0; attr.cl_arg = (void *)(intptr_t)(*p_i)++; starpu_omp_task_region(&attr); attr.cl_arg = (void *)(intptr_t)(*p_i)++; starpu_omp_task_region(&attr); } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; struct starpu_omp_task_region_attr attr; int i = 0; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d: implicit task \"f\"\n", (void *)tid, worker_id); starpu_omp_taskgroup(taskgroup_f, (void *)&i); printf("[tid %p] task thread = %d: implicit task \"f\": taskgroup\n", (void *)tid, worker_id); starpu_omp_taskgroup(taskgroup_f, (void *)&i); printf("[tid %p] task thread = %d: implicit task \"f\": taskgroup\n", (void *)tid, worker_id); memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = task_region_g; attr.cl.where = STARPU_CPU; attr.cl_arg_size = sizeof(void *); attr.cl_arg_free = 0; attr.if_clause = 1; attr.final_clause = 0; attr.untied_clause = 1; attr.mergeable_clause = 0; attr.cl_arg = (void *)(intptr_t)i++; starpu_omp_task_region(&attr); attr.cl_arg = (void *)(intptr_t)i++; starpu_omp_task_region(&attr); } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; starpu_omp_parallel_region(&attr); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/taskgroup_02.c000066400000000000000000000063571320135501600211050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void task_region_g(void *buffers[], void *args) { (void) buffers; int i = (int)(intptr_t) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d: explicit task \"g[%d]\"\n", (void *)tid, worker_id, i); } void taskgroup_f(void *arg) { struct starpu_omp_task_region_attr attr; int *p_i = (int *)arg; memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = task_region_g; attr.cl.where = STARPU_CPU; attr.cl_arg_size = sizeof(void *); attr.cl_arg_free = 0; attr.if_clause = 1; attr.final_clause = 0; attr.untied_clause = 1; attr.mergeable_clause = 0; attr.cl_arg = (void *)(intptr_t)(*p_i)++; starpu_omp_task_region(&attr); attr.cl_arg = (void *)(intptr_t)(*p_i)++; starpu_omp_task_region(&attr); } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; struct starpu_omp_task_region_attr attr; int i = 0; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d: implicit task \"f\"\n", (void *)tid, worker_id); starpu_omp_taskgroup_inline_begin(); taskgroup_f((void *)&i); starpu_omp_taskgroup_inline_end(); printf("[tid %p] task thread = %d: implicit task \"f\": taskgroup\n", (void *)tid, worker_id); starpu_omp_taskgroup_inline_begin(); taskgroup_f((void *)&i); starpu_omp_taskgroup_inline_end(); printf("[tid %p] task thread = %d: implicit task \"f\": taskgroup\n", (void *)tid, worker_id); memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = task_region_g; attr.cl.where = STARPU_CPU; attr.cl_arg_size = sizeof(void *); attr.cl_arg_free = 0; attr.if_clause = 1; attr.final_clause = 0; attr.untied_clause = 1; attr.mergeable_clause = 0; attr.cl_arg = (void *)(intptr_t)i++; starpu_omp_task_region(&attr); attr.cl_arg = (void *)(intptr_t)i++; starpu_omp_task_region(&attr); } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; starpu_omp_parallel_region(&attr); return 0; } #endif starpu-1.2.3+dfsg/tests/openmp/taskwait_01.c000066400000000000000000000055161320135501600207100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #if !defined(STARPU_OPENMP) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void task_region_g(void *buffers[], void *args) { (void) buffers; int i = (int)(intptr_t) args; int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d: explicit task \"g[%d]\"\n", (void *)tid, worker_id, i); } void parallel_region_f(void *buffers[], void *args) { (void) buffers; (void) args; int worker_id; pthread_t tid; struct starpu_omp_task_region_attr attr; int i = 0; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf("[tid %p] task thread = %d: implicit task \"f\"\n", (void *)tid, worker_id); memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = task_region_g; attr.cl.where = STARPU_CPU; attr.cl_arg_size = sizeof(void *); attr.cl_arg_free = 0; attr.if_clause = 1; attr.final_clause = 0; attr.untied_clause = 1; attr.mergeable_clause = 0; attr.cl_arg = (void *)(intptr_t)i++; starpu_omp_task_region(&attr); attr.cl_arg = (void *)(intptr_t)i++; starpu_omp_task_region(&attr); starpu_omp_taskwait(); printf("[tid %p] task thread = %d: implicit task \"f\": taskwait\n", (void *)tid, worker_id); attr.cl_arg = (void *)(intptr_t)i++; starpu_omp_task_region(&attr); attr.cl_arg = (void *)(intptr_t)i++; starpu_omp_task_region(&attr); starpu_omp_taskwait(); printf("[tid %p] task thread = %d: implicit task \"f\": taskwait\n", (void *)tid, worker_id); attr.cl_arg = (void *)(intptr_t)i++; starpu_omp_task_region(&attr); attr.cl_arg = (void *)(intptr_t)i++; starpu_omp_task_region(&attr); } int main (int argc, char *argv[]) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); attr.cl.cpu_funcs[0] = parallel_region_f; attr.cl.where = STARPU_CPU; attr.if_clause = 1; starpu_omp_parallel_region(&attr); return 0; } #endif starpu-1.2.3+dfsg/tests/overlap/000077500000000000000000000000001320135501600165605ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/overlap/gpu_concurrency.c000066400000000000000000000057261320135501600221430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include "../helper.h" #include /* * Check that concurrency does happen when using multi-stream CUDA. */ #ifdef STARPU_QUICK_CHECK #define NITERS 100000 #else #define NITERS 1000000 #endif #define NTASKS 64 #define SYNC 16 #ifdef STARPU_USE_CUDA extern void long_kernel_cuda(unsigned long niters); void codelet_long_kernel_async(STARPU_ATTRIBUTE_UNUSED void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { long_kernel_cuda(NITERS); } void codelet_long_kernel_sync(STARPU_ATTRIBUTE_UNUSED void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { long_kernel_cuda(NITERS); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } static struct starpu_perfmodel model_async = { .type = STARPU_HISTORY_BASED, .symbol = "long_kernel_async", }; static struct starpu_perfmodel model_sync = { .type = STARPU_HISTORY_BASED, .symbol = "long_kernel_sync", }; static struct starpu_codelet cl_async = { .cuda_funcs = {codelet_long_kernel_async}, .cuda_flags = {STARPU_CUDA_ASYNC}, .nbuffers = 0, .model = &model_async, }; static struct starpu_codelet cl = { .cuda_funcs = {codelet_long_kernel_sync}, .nbuffers = 0, .model = &model_sync, }; #endif int main(int argc, char **argv) { #ifndef STARPU_USE_CUDA return STARPU_TEST_SKIPPED; #else setenv("STARPU_NWORKER_PER_CUDA", "4", 1); int ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); if (starpu_cuda_worker_get_count() == 0) { starpu_shutdown(); return STARPU_TEST_SKIPPED; } unsigned iter; for (iter = 0; iter < NTASKS; iter++) { struct starpu_task *task = starpu_task_create(); if (!(iter % SYNC)) /* Insert a synchronous task, just for fun */ task->cl = &cl; else task->cl = &cl_async; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_shutdown(); STARPU_RETURN(EXIT_SUCCESS); enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); STARPU_RETURN(STARPU_TEST_SKIPPED); #endif } starpu-1.2.3+dfsg/tests/overlap/long_kernel.cu000066400000000000000000000017331320135501600214140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include extern "C" __global__ void long_kernel(unsigned long niters) { unsigned long i; for (i = 0; i < niters; i++) __syncthreads(); } extern "C" void long_kernel_cuda(unsigned long niters) { dim3 dimBlock(1,1); dim3 dimGrid(1,1); long_kernel<<>>(niters); } starpu-1.2.3+dfsg/tests/overlap/overlap.c000066400000000000000000000075121320135501600204010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012, 2015-2016 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include "../helper.h" #include /* * Check that working on a partitioned vector gets overlapping of prefetches etc. */ #ifdef STARPU_QUICK_CHECK #define NTASKS 100 #else #define NTASKS 10000 #endif #define VECTORSIZE 1024 #define TASKDURATION 24U #define SYMBOL "sleep" static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static starpu_pthread_cond_t cond = STARPU_PTHREAD_COND_INITIALIZER; static unsigned finished = 0; static unsigned cnt = NTASKS; static void callback(void *arg) { unsigned res = STARPU_ATOMIC_ADD(&cnt, -1); ANNOTATE_HAPPENS_BEFORE(&cnt); if (res == 0) { ANNOTATE_HAPPENS_AFTER(&cnt); STARPU_PTHREAD_MUTEX_LOCK(&mutex); finished = 1; STARPU_PTHREAD_COND_SIGNAL(&cond); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } } void codelet_sleep(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; usleep(TASKDURATION); } static struct starpu_perfmodel model = { .type = STARPU_HISTORY_BASED, .symbol = NULL /* to be defined later */ }; static struct starpu_codelet cl = { .cpu_funcs = {codelet_sleep}, .cuda_funcs = {codelet_sleep}, .opencl_funcs = {codelet_sleep}, .cpu_funcs_name = {"codelet_sleep"}, .nbuffers = 1, .modes = {STARPU_R}, .model = &model }; static char symbolname[128]; int main(int argc, char **argv) { int ret; starpu_data_handle_t handle; float *buffer; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* create data */ starpu_malloc((void **)&buffer, NTASKS*VECTORSIZE*sizeof(char)); /* declare data to StarPU */ starpu_vector_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)buffer, NTASKS*VECTORSIZE, sizeof(char)); struct starpu_data_filter f = { .filter_func = starpu_vector_filter_block, .nchildren = NTASKS }; starpu_data_partition(handle, &f); snprintf(symbolname, 128, "overlap_sleep_%d_%u", VECTORSIZE, TASKDURATION); model.symbol = symbolname; unsigned iter; for (iter = 0; iter < NTASKS; iter++) { struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->handles[0] = starpu_data_get_sub_data(handle, 1, iter); task->callback_func = callback; task->callback_arg = NULL; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } STARPU_PTHREAD_MUTEX_LOCK(&mutex); if (!finished) STARPU_PTHREAD_COND_WAIT(&cond, &mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); starpu_data_unpartition(handle, STARPU_MAIN_RAM); starpu_data_unregister(handle); starpu_free(buffer); starpu_shutdown(); STARPU_RETURN(EXIT_SUCCESS); enodev: starpu_data_unregister(handle); starpu_free(buffer); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); STARPU_RETURN(STARPU_TEST_SKIPPED); } starpu-1.2.3+dfsg/tests/overlap/overlap.sh000077500000000000000000000042651320135501600205760ustar00rootroot00000000000000#!/bin/sh -x # # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2017 Université de Bordeaux # Copyright (C) 2017 Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # Test parsing of FxT traces set -e PREFIX=$(dirname $0) STARPU_SCHED=dmdas STARPU_FXT_PREFIX=$PREFIX/ $PREFIX/overlap [ ! -x $PREFIX/../../tools/starpu_perfmodel_display ] || $PREFIX/../../tools/starpu_perfmodel_display -s overlap_sleep_1024_24 [ ! -x $PREFIX/../../tools/starpu_perfmodel_plot -o ! -f $PREFIX/prof_file_${USER}_0 ] || $PREFIX/../../tools/starpu_perfmodel_plot -s overlap_sleep_1024_24 -i $PREFIX/prof_file_${USER}_0 if [ -x $PREFIX/../../tools/starpu_fxt_tool ]; then # Generate paje, dag, data, etc. $PREFIX/../../tools/starpu_fxt_tool -i $PREFIX/prof_file_${USER}_0 $PREFIX/../../tools/starpu_paje_sort paje.trace $PREFIX/../../tools/starpu_codelet_profile distrib.data overlap_sleep_1024_24 [ -f distrib.data.gp -a \( -f distrib.data.0 -o -f distrib.data.1 -o -f distrib.data.2 -o -f distrib.data.3 -o -f distrib.data.4 \) ] $PREFIX/../../tools/starpu_fxt_data_trace $PREFIX/prof_file_${USER}_0 overlap_sleep_1024_24 [ -f data_trace.gp ] $PREFIX/../../tools/starpu_fxt_stats -i $PREFIX/prof_file_${USER}_0 $PREFIX/../../tools/starpu_tasks_rec_complete tasks.rec tasks2.rec $PREFIX/../../tools/starpu_workers_activity activity.data [ -f activity.eps ] # needs some R packages $PREFIX/../../tools/starpu_paje_draw_histogram paje.trace || true $PREFIX/../../tools/starpu_paje_state_stats paje.trace || true $PREFIX/../../tools/starpu_paje_summary paje.trace || true $PREFIX/../../tools/starpu_codelet_histo_profile distrib.data || true [ -f distrib.data.overlap_sleep_1024_24.0.a3d3725e.1024.pdf ] || true fi starpu-1.2.3+dfsg/tests/parallel_tasks/000077500000000000000000000000001320135501600201115ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/parallel_tasks/cuda_only.c000066400000000000000000000052761320135501600222440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013, 2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include "../helper.h" /* * Check that pheft works with only GPUs */ void codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } struct starpu_perfmodel model = { .type = STARPU_HISTORY_BASED, .symbol = "test" }; static struct starpu_codelet cl = { .cuda_funcs = {codelet_null}, .model = &model, .nbuffers = 1, .modes = {STARPU_R} }; struct starpu_perfmodel model2 = { .type = STARPU_HISTORY_BASED, .symbol = "test2" }; static struct starpu_codelet cl2 = { .cuda_funcs = {codelet_null}, .model = &model2, .nbuffers = 1, .modes = {STARPU_W} }; int main(int argc, char **argv) { int ret; starpu_data_handle_t handle; unsigned data; struct starpu_conf conf; starpu_conf_init(&conf); conf.sched_policy_name = "pheft"; ret = starpu_init(&conf); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)&data, sizeof(data)); unsigned iter; struct starpu_task *task; for (iter = 0; iter < 100; iter++) { task = starpu_task_create(); task->cl = &cl; task->handles[0] = handle; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); task = starpu_task_create(); task->cl = &cl2; task->handles[0] = handle; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_data_unregister(handle); starpu_shutdown(); STARPU_RETURN(EXIT_SUCCESS); enodev: task->destroy = 0; starpu_task_destroy(task); starpu_data_unregister(handle); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); STARPU_RETURN(STARPU_TEST_SKIPPED); } starpu-1.2.3+dfsg/tests/parallel_tasks/explicit_combined_worker.c000066400000000000000000000063121320135501600253310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012, 2014-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include "../helper.h" /* * Check that one can bind a parallel task on a parallel worker */ #ifndef STARPU_QUICK_CHECK #define N 1000 #else #define N 100 #endif #define VECTORSIZE 1024 void codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; int worker_size = starpu_combined_worker_get_size(); STARPU_ASSERT(worker_size > 0); usleep(1000/worker_size); #if 1 int id = starpu_worker_get_id(); int combined_id = starpu_combined_worker_get_id(); FPRINTF(stderr, "worker id %d - combined id %d - worker size %d\n", id, combined_id, worker_size); #endif } static struct starpu_codelet cl = { .type = STARPU_FORKJOIN, .max_parallelism = INT_MAX, .cpu_funcs = {codelet_null}, .cpu_funcs_name = {"codelet_null"}, .cuda_funcs = {codelet_null}, .opencl_funcs = {codelet_null}, .nbuffers = 1, .modes = {STARPU_R} }; int main(int argc, char **argv) { starpu_data_handle_t v_handle; unsigned *v; int ret; struct starpu_conf conf; ret = starpu_conf_init(&conf); STARPU_CHECK_RETURN_VALUE(ret, "starpu_conf_init"); conf.sched_policy_name = "pheft"; conf.calibrate = 1; ret = starpu_init(&conf); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_malloc((void **)&v, VECTORSIZE*sizeof(unsigned)); starpu_vector_data_register(&v_handle, STARPU_MAIN_RAM, (uintptr_t)v, VECTORSIZE, sizeof(unsigned)); unsigned nworker = starpu_worker_get_count() + starpu_combined_worker_get_count(); unsigned iter, worker; for (iter = 0; iter < N; iter++) { for (worker = 0; worker < nworker; worker++) { /* execute a task on that worker */ struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->handles[0] = v_handle; task->execute_on_a_specific_worker = 1; task->workerid = worker; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_data_unregister(v_handle); starpu_free(v); starpu_shutdown(); return EXIT_SUCCESS; enodev: starpu_data_unregister(v_handle); starpu_free(v); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/parallel_tasks/parallel_kernels.c000066400000000000000000000062761320135501600236070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012, 2015-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include "../helper.h" /* * Submit dumb parallel forkjoin tasks */ #ifndef STARPU_QUICK_CHECK #define N 1000 #else #define N 100 #endif #define VECTORSIZE 1024 void codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; int worker_size = starpu_combined_worker_get_size(); STARPU_ASSERT(worker_size > 0); usleep(1000/worker_size); #if 0 int id = starpu_worker_get_id(); int combined_id = starpu_combined_worker_get_id(); FPRINTF(stderr, "worker id %d - combined id %d - worker size %d\n", id, combined_id, worker_size); #endif } struct starpu_perfmodel model = { .type = STARPU_HISTORY_BASED, .symbol = "parallel_kernel_test" }; static struct starpu_codelet cl = { .type = STARPU_FORKJOIN, .max_parallelism = INT_MAX, .cpu_funcs = {codelet_null}, .cuda_funcs = {codelet_null}, .cpu_funcs_name = {"codelet_null"}, .opencl_funcs = {codelet_null}, .model = &model, .nbuffers = 1, .modes = {STARPU_R} }; int main(int argc, char **argv) { int ret; starpu_data_handle_t v_handle; unsigned *v; struct starpu_conf conf; starpu_conf_init(&conf); conf.sched_policy_name = "pheft"; conf.calibrate = 1; ret = starpu_init(&conf); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_malloc((void **)&v, VECTORSIZE*sizeof(unsigned)); starpu_vector_data_register(&v_handle, STARPU_MAIN_RAM, (uintptr_t)v, VECTORSIZE, sizeof(unsigned)); unsigned nworker = starpu_worker_get_count() + starpu_combined_worker_get_count(); unsigned iter, worker; for (iter = 0; iter < N; iter++) { for (worker = 0; worker < nworker; worker++) { /* execute a task on that worker */ struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->handles[0] = v_handle; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_data_unregister(v_handle); starpu_free(v); starpu_shutdown(); STARPU_RETURN(EXIT_SUCCESS); enodev: starpu_data_unregister(v_handle); starpu_free(v); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); STARPU_RETURN(STARPU_TEST_SKIPPED); } starpu-1.2.3+dfsg/tests/parallel_tasks/parallel_kernels_spmd.c000066400000000000000000000063771320135501600246340ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012, 2015-2016 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include "../helper.h" /* * Submit dumb parallel spmd tasks */ #ifndef STARPU_QUICK_CHECK #define N 1000 #else #define N 100 #endif #define VECTORSIZE 1024 void codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; int worker_size = starpu_combined_worker_get_size(); STARPU_ASSERT(worker_size > 0); usleep(1000/worker_size); #if 0 int id = starpu_worker_get_id(); int combined_id = starpu_combined_worker_get_id(); int rank = starpu_combined_worker_get_rank(); FPRINTF(stderr, "worker id %d - combined id %d - worker size %d - SPMD rank %d\n", id, combined_id, worker_size, rank); #endif } struct starpu_perfmodel model = { .type = STARPU_HISTORY_BASED, .symbol = "parallel_kernel_test_spmd" }; static struct starpu_codelet cl = { .type = STARPU_SPMD, .max_parallelism = INT_MAX, .cpu_funcs = {codelet_null}, .cpu_funcs_name = {"codelet_null"}, .cuda_funcs = {codelet_null}, .opencl_funcs = {codelet_null}, .model = &model, .nbuffers = 1, .modes = {STARPU_R} }; int main(int argc, char **argv) { int ret; starpu_data_handle_t v_handle; unsigned *v; struct starpu_conf conf; starpu_conf_init(&conf); conf.sched_policy_name = "pheft"; conf.calibrate = 1; ret = starpu_init(&conf); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_malloc((void **)&v, VECTORSIZE*sizeof(unsigned)); starpu_vector_data_register(&v_handle, STARPU_MAIN_RAM, (uintptr_t)v, VECTORSIZE, sizeof(unsigned)); unsigned nworker = starpu_worker_get_count() + starpu_combined_worker_get_count(); unsigned iter, worker; for (iter = 0; iter < N; iter++) { for (worker = 0; worker < nworker; worker++) { /* execute a task on that worker */ struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->handles[0] = v_handle; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_data_unregister(v_handle); starpu_free(v); starpu_shutdown(); STARPU_RETURN(EXIT_SUCCESS); enodev: starpu_data_unregister(v_handle); starpu_free(v); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); STARPU_RETURN(STARPU_TEST_SKIPPED); } starpu-1.2.3+dfsg/tests/parallel_tasks/spmd_peager.c000066400000000000000000000060601320135501600225450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2015-2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include "../helper.h" /* * Submit dumb parallel spmd tasks with the peager scheduler */ #ifndef STARPU_QUICK_CHECK #define N 1000 #else #define N 100 #endif #define VECTORSIZE 1024 starpu_data_handle_t v_handle; static unsigned *v; void codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; int worker_size = starpu_combined_worker_get_size(); STARPU_ASSERT(worker_size > 0); // FPRINTF(stderr, "WORKERSIZE : %d\n", worker_size); usleep(1000/worker_size); #if 0 int id = starpu_worker_get_id(); int combined_id = starpu_combined_worker_get_id(); int rank = starpu_combined_worker_get_rank(); FPRINTF(stderr, "worker id %d - combined id %d - worker size %d - SPMD rank %d\n", id, combined_id, worker_size, rank); #endif } static struct starpu_codelet cl = { .type = STARPU_SPMD, .max_parallelism = INT_MAX, .cpu_funcs = {codelet_null}, .cpu_funcs_name = {"codelet_null"}, .cuda_funcs = {codelet_null}, .opencl_funcs = {codelet_null}, .nbuffers = 1, .modes = {STARPU_R} }; int main(int argc, char **argv) { int ret; struct starpu_conf conf; starpu_conf_init(&conf); conf.sched_policy_name = "peager"; ret = starpu_init(&conf); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_malloc((void **)&v, VECTORSIZE*sizeof(unsigned)); STARPU_CHECK_RETURN_VALUE(ret, "starpu_malloc"); starpu_vector_data_register(&v_handle, STARPU_MAIN_RAM, (uintptr_t)v, VECTORSIZE, sizeof(unsigned)); unsigned iter;//, worker; for (iter = 0; iter < N; iter++) { /* execute a task on that worker */ struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->handles[0] = v_handle; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_data_unregister(v_handle); starpu_free(v); starpu_shutdown(); return EXIT_SUCCESS; enodev: starpu_data_unregister(v_handle); starpu_free(v); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.2.3+dfsg/tests/perfmodels/000077500000000000000000000000001320135501600172505ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/perfmodels/feed.c000066400000000000000000000051141320135501600203200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012, 2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Test the starpu_perfmodel_update_history function */ static struct starpu_perfmodel model = { .type = STARPU_REGRESSION_BASED, .symbol = "feed" }; static struct starpu_perfmodel nl_model = { .type = STARPU_NL_REGRESSION_BASED, .symbol = "nlfeed" }; static struct starpu_codelet cl = { .model = &model, .nbuffers = 1, .modes = {STARPU_W} }; int main(int argc, char **argv) { struct starpu_task task; int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); if (starpu_worker_get_count_by_type(STARPU_CUDA_WORKER) < 2) { starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu_task_init(&task); task.cl = &cl; int size; for (size = 1024; size < 16777216; size *= 2) { float measured_fast, measured_slow; starpu_data_handle_t handle; starpu_vector_data_register(&handle, -1, 0, size, sizeof(float)); task.handles[0] = handle; /* Simulate Fast GPU. In real applications this would be * replaced by fetching from actual measurement */ measured_fast = 0.002+size*0.00000001; measured_slow = 0.001+size*0.0000001; struct starpu_perfmodel_arch arch; arch.ndevices = 1; arch.devices = (struct starpu_perfmodel_device*)malloc(sizeof(struct starpu_perfmodel_device)); arch.devices[0].type = STARPU_CUDA_WORKER; arch.devices[0].ncores = 0; /* Simulate Fast GPU */ arch.devices[0].devid = 0; starpu_perfmodel_update_history(&model, &task, &arch, 0, 0, measured_fast); starpu_perfmodel_update_history(&nl_model, &task, &arch, 0, 0, measured_fast); /* Simulate Slow GPU */ arch.devices[0].devid = 1; starpu_perfmodel_update_history(&model, &task, &arch, 0, 0, measured_slow); starpu_perfmodel_update_history(&nl_model, &task, &arch, 0, 0, measured_slow); starpu_task_clean(&task); starpu_data_unregister(handle); } starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/perfmodels/memory.c000066400000000000000000000032761320135501600207340ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014, 2015 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Test providing the memory perfmodel function */ void func(void *descr[], void *arg) { } static struct starpu_perfmodel my_model = { .type = STARPU_HISTORY_BASED, .symbol = "my_model", }; static struct starpu_codelet my_codelet = { .cpu_funcs = {func}, .cpu_funcs_name = {"func"}, .model = &my_model }; double cuda_cost_function(struct starpu_task *t, struct starpu_perfmodel_arch *a, unsigned i) { t; a; return (double)i; } int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_perfmodel_init(&my_model); starpu_perfmodel_set_per_devices_cost_function(&my_model, 0, cuda_cost_function, STARPU_CUDA_WORKER, 0, 1, -1); ret = starpu_task_insert(&my_codelet, 0); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_task_wait_for_all(); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/perfmodels/non_linear_regression_based.c000066400000000000000000000066171320135501600251500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2012, 2014-2016 Université de Bordeaux * Copyright (C) 2012, 2013 CNRS * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Benchmark memset with a non-linear regression */ #define START_LOG 8 #ifdef STARPU_QUICK_CHECK #define END_LOG 20 #else #define END_LOG 25 #endif #ifdef STARPU_USE_CUDA static void memset_cuda(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; int *ptr = (int *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned n = STARPU_VECTOR_GET_NX(descr[0]); cudaMemsetAsync(ptr, 42, n * sizeof(*ptr), starpu_cuda_get_local_stream()); } #endif void memset_cpu(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; int *ptr = (int *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned n = STARPU_VECTOR_GET_NX(descr[0]); memset(ptr, 42, n * sizeof(*ptr)); } static struct starpu_perfmodel model = { .type = STARPU_NL_REGRESSION_BASED, .symbol = "non_linear_memset_regression_based" }; #ifdef STARPU_USE_OPENCL extern void memset_opencl(void *buffers[], void *args); #endif static struct starpu_codelet memset_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {memset_cuda}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {memset_opencl}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs = {memset_cpu}, .cpu_funcs_name = {"memset_cpu"}, .model = &model, .nbuffers = 1, .modes = {STARPU_W} }; static void test_memset(int nelems) { starpu_data_handle_t handle; starpu_vector_data_register(&handle, -1, (uintptr_t)NULL, nelems, sizeof(int)); int nloops = 200; int loop; for (loop = 0; loop < nloops; loop++) { struct starpu_task *task = starpu_task_create(); task->cl = &memset_cl; task->handles[0] = handle; int ret = starpu_task_submit(task); if (ret == -ENODEV) exit(STARPU_TEST_SKIPPED); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_data_unregister(handle); } #ifdef STARPU_USE_OPENCL struct starpu_opencl_program opencl_program; #endif int main(int argc, char **argv) { int ret; struct starpu_conf conf; starpu_conf_init(&conf); conf.sched_policy_name = "eager"; conf.calibrate = 2; ret = starpu_initialize(&conf, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_load_opencl_from_file("tests/perfmodels/opencl_memset_kernel.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif int slog; for (slog = START_LOG; slog < END_LOG; slog++) { int size = 1 << slog; test_memset(size); } #ifdef STARPU_USE_OPENCL ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); #endif starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/perfmodels/opencl_memset.c000066400000000000000000000037611320135501600222550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * Copyright (C) 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include /* * Enqueue an OpenCL kernel which just does a memset */ extern struct starpu_opencl_program opencl_program; void memset_opencl(void *buffers[], void *args) { (void) args; int id, devid; cl_int err; cl_kernel kernel; cl_command_queue queue; unsigned n = STARPU_VECTOR_GET_NX(buffers[0]); cl_mem val = (cl_mem)STARPU_VECTOR_GET_DEV_HANDLE(buffers[0]); id = starpu_worker_get_id_check(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_program, "_memset_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 0, sizeof(val), &val); err|= clSetKernelArg(kernel, 1, sizeof(n), &n); if (err) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=n; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local=global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } starpu_opencl_release_kernel(kernel); } starpu-1.2.3+dfsg/tests/perfmodels/opencl_memset_kernel.cl000066400000000000000000000014171320135501600237650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ __kernel void _memset_opencl(__global int *val, int nx) { const int i = get_global_id(0); if (i < nx) val[i] = 42; } starpu-1.2.3+dfsg/tests/perfmodels/regression_based.c000066400000000000000000000121511320135501600227320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2016 Université de Bordeaux * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Benchmark memset with a linear regression */ #define START 1024 #ifdef STARPU_QUICK_CHECK #define END 1048576 #else #define END 16777216 #endif #ifdef STARPU_USE_CUDA static void memset_cuda(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; int *ptr = (int *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned n = STARPU_VECTOR_GET_NX(descr[0]); cudaMemsetAsync(ptr, 42, n * sizeof(*ptr), starpu_cuda_get_local_stream()); } #endif #ifdef STARPU_USE_OPENCL extern void memset_opencl(void *buffers[], void *args); #endif void memset_cpu(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; int *ptr = (int *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned n = STARPU_VECTOR_GET_NX(descr[0]); memset(ptr, 42, n * sizeof(*ptr)); } static struct starpu_perfmodel model = { .type = STARPU_REGRESSION_BASED, .symbol = "memset_regression_based" }; static struct starpu_perfmodel nl_model = { .type = STARPU_NL_REGRESSION_BASED, .symbol = "non_linear_memset_regression_based" }; static struct starpu_codelet memset_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {memset_cuda}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {memset_opencl}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs = {memset_cpu}, .cpu_funcs_name = {"memset_cpu"}, .model = &model, .nbuffers = 1, .modes = {STARPU_W} }; static struct starpu_codelet nl_memset_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {memset_cuda}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {memset_opencl}, .opencl_flags = {STARPU_OPENCL_ASYNC}, #endif .cpu_funcs = {memset_cpu}, .cpu_funcs_name = {"memset_cpu"}, .model = &nl_model, .nbuffers = 1, .modes = {STARPU_W} }; static void test_memset(int nelems, struct starpu_codelet *codelet) { int nloops = 100; int loop; starpu_data_handle_t handle; starpu_vector_data_register(&handle, -1, (uintptr_t)NULL, nelems, sizeof(int)); for (loop = 0; loop < nloops; loop++) { struct starpu_task *task = starpu_task_create(); task->cl = codelet; task->handles[0] = handle; int ret = starpu_task_submit(task); if (ret == -ENODEV) exit(STARPU_TEST_SKIPPED); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_data_unregister(handle); } static void show_task_perfs(int size, struct starpu_task *task) { unsigned workerid; for (workerid = 0; workerid < starpu_worker_get_count(); workerid++) { char name[16]; starpu_worker_get_name(workerid, name, sizeof(name)); unsigned nimpl; for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) { FPRINTF(stdout, "Expected time for %d on %s (impl %u):\t%f\n", size, name, nimpl, starpu_task_expected_length(task, starpu_worker_get_perf_archtype(workerid, task->sched_ctx), nimpl)); } } } #ifdef STARPU_USE_OPENCL struct starpu_opencl_program opencl_program; #endif int main(int argc, char **argv) { struct starpu_conf conf; starpu_data_handle_t handle; int ret; starpu_conf_init(&conf); conf.sched_policy_name = "eager"; conf.calibrate = 2; ret = starpu_initialize(&conf, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_load_opencl_from_file("tests/perfmodels/opencl_memset_kernel.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif int size; for (size = START; size < END; size *= 2) { /* Use a linear regression */ test_memset(size, &memset_cl); /* Use a non-linear regression */ test_memset(size, &nl_memset_cl); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); /* Now create a dummy task just to estimate its duration according to the regression */ size = 12345; starpu_vector_data_register(&handle, -1, (uintptr_t)NULL, size, sizeof(int)); struct starpu_task *task = starpu_task_create(); task->cl = &memset_cl; task->handles[0] = handle; task->destroy = 0; show_task_perfs(size, task); task->cl = &nl_memset_cl; show_task_perfs(size, task); starpu_task_destroy(task); starpu_data_unregister(handle); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); #endif starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/perfmodels/user_base.c000066400000000000000000000062531320135501600213720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2016 Université Bordeaux * Copyright (C) 2012, 2013, 2014, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Test using a user-provided base for the perfmodel */ void func(void *descr[], void *arg) { } size_t get_size_base(struct starpu_task *task, unsigned nimpl) { return 3; }; uint32_t get_footprint(struct starpu_task *task) { uint32_t orig = starpu_task_data_footprint(task); return starpu_hash_crc32c_be(42, orig); }; static struct starpu_perfmodel rb_model = { .type = STARPU_REGRESSION_BASED, .symbol = "user_base_valid_model_regression_based", .size_base = get_size_base, }; static struct starpu_perfmodel nlrb_model = { .type = STARPU_NL_REGRESSION_BASED, .symbol = "user_base_valid_model_non_linear_regression_based", .size_base = get_size_base, }; static struct starpu_perfmodel hb_model = { .type = STARPU_HISTORY_BASED, .symbol = "user_base_valid_model_history_based", .size_base = get_size_base, }; static struct starpu_perfmodel hb_model_foot = { .type = STARPU_HISTORY_BASED, .symbol = "user_base_valid_model_history_based_footprint", .footprint = get_footprint, }; static struct starpu_codelet mycodelet = { .cuda_funcs = {func}, .opencl_funcs = {func}, .cpu_funcs = {func}, .cpu_funcs_name = {"func"}, .nbuffers = 1, .modes = {STARPU_W} }; static int submit(struct starpu_codelet *codelet, struct starpu_perfmodel *model) { int nloops = 123; int loop; starpu_data_handle_t handle; int ret; struct starpu_conf conf; starpu_conf_init(&conf); conf.sched_policy_name = "eager"; conf.calibrate = 1; ret = starpu_init(&conf); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); codelet->model = model; starpu_vector_data_register(&handle, -1, (uintptr_t)NULL, 100, sizeof(int)); for (loop = 0; loop < nloops; loop++) { ret = starpu_task_insert(codelet, STARPU_W, handle, 0); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_data_unregister(handle); starpu_shutdown(); return EXIT_SUCCESS; } int main(int argc, char **argv) { int ret; /* Use a linear regression model */ ret = submit(&mycodelet, &rb_model); if (ret) return ret; /* Use a non-linear regression model */ ret = submit(&mycodelet, &nlrb_model); if (ret) return ret; /* Use a history model */ ret = submit(&mycodelet, &hb_model); if (ret) return ret; /* Use a history model with footprints*/ ret = submit(&mycodelet, &hb_model_foot); if (ret) return ret; return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/perfmodels/valid_model.c000066400000000000000000000110251320135501600216720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012, 2013, 2014, 2015, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Check that measurements get recorded in the performance model */ void func(void *descr[], void *arg) { } static struct starpu_perfmodel rb_model = { .type = STARPU_REGRESSION_BASED, .symbol = "valid_model_regression_based" }; static struct starpu_perfmodel nlrb_model = { .type = STARPU_NL_REGRESSION_BASED, .symbol = "valid_model_non_linear_regression_based" }; #if 0 static struct starpu_perfmodel hb_model = { .type = STARPU_HISTORY_BASED, .symbol = "valid_model_history_based" }; #endif static struct starpu_codelet mycodelet = { .cuda_funcs = {func}, .opencl_funcs = {func}, .cpu_funcs = {func}, .cpu_funcs_name = {"func"}, .nbuffers = 1, .modes = {STARPU_W} }; static int submit(struct starpu_codelet *codelet, struct starpu_perfmodel *model) { int nloops = 123; int loop; starpu_data_handle_t handle; struct starpu_perfmodel lmodel; int ret; int old_nsamples, new_nsamples; struct starpu_conf conf; starpu_conf_init(&conf); conf.sched_policy_name = "eager"; conf.calibrate = 1; ret = starpu_init(&conf); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); codelet->model = model; old_nsamples = 0; memset(&lmodel, 0, sizeof(struct starpu_perfmodel)); lmodel.type = model->type; ret = starpu_perfmodel_load_symbol(codelet->model->symbol, &lmodel); if (ret != 1) { int i, impl; for(i = 0; i < lmodel.state->ncombs; i++) { int comb = lmodel.state->combs[i]; for(impl = 0; impl < lmodel.state->nimpls[comb]; impl++) old_nsamples += lmodel.state->per_arch[comb][impl].regression.nsample; } } starpu_vector_data_register(&handle, -1, (uintptr_t)NULL, 100, sizeof(int)); for (loop = 0; loop < nloops; loop++) { ret = starpu_task_insert(codelet, STARPU_W, handle, 0); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_data_unregister(handle); starpu_perfmodel_unload_model(&lmodel); starpu_shutdown(); // To force dumping perf models on disk // We need to call starpu_init again to initialise values used by perfmodels ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); char path[256]; starpu_perfmodel_get_model_path(codelet->model->symbol, path, 256); FPRINTF(stderr, "Perfmodel File <%s>\n", path); ret = starpu_perfmodel_load_file(path, &lmodel); if (ret == 1) { FPRINTF(stderr, "The performance model for the symbol <%s> could not be loaded\n", codelet->model->symbol); starpu_shutdown(); return 1; } else { int i; new_nsamples = 0; for(i = 0; i < lmodel.state->ncombs; i++) { int comb = lmodel.state->combs[i]; int impl; for(impl = 0; impl < lmodel.state->nimpls[comb]; impl++) new_nsamples += lmodel.state->per_arch[comb][impl].regression.nsample; } } ret = starpu_perfmodel_unload_model(&lmodel); starpu_shutdown(); if (ret == 1) { FPRINTF(stderr, "The performance model for the symbol <%s> could not be UNloaded\n", codelet->model->symbol); return 1; } if (old_nsamples + nloops == new_nsamples) { FPRINTF(stderr, "Sampling for <%s> OK %d + %d == %d\n", codelet->model->symbol, old_nsamples, nloops, new_nsamples); return EXIT_SUCCESS; } else { FPRINTF(stderr, "Sampling for <%s> failed %d + %d != %d\n", codelet->model->symbol, old_nsamples, nloops, new_nsamples); return EXIT_FAILURE; } } int main(int argc, char **argv) { int ret; /* Use a linear regression model */ ret = submit(&mycodelet, &rb_model); if (ret) return ret; /* Use a non-linear regression model */ ret = submit(&mycodelet, &nlrb_model); if (ret) return ret; #ifdef STARPU_DEVEL # warning history based model cannot be validated with regression.nsample #endif #if 0 /* Use a history model */ ret = submit(&mycodelet, &hb_model); if (ret) return ret; #endif return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/perfmodels/value_nan.c000066400000000000000000000050321320135501600213640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013, 2015, 2016 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include #ifdef STARPU_HAVE_WINDOWS #include #include #endif /* * Test that _starpu_write_double and _starpu_read_double properly manipulate * NaN values */ #define STRING "booh" static int _check_number(double val, int checknan) { char *tmp = "starpu_XXXXXX"; char filename[100]; strcpy(filename, tmp); #ifdef STARPU_HAVE_WINDOWS _mktemp(filename); #else { int id = mkstemp(filename); /* fail */ if (id < 0) { FPRINTF(stderr, "Error when creating temp file\n"); return 1; } } #endif /* write the double value in the file followed by a predefined string */ FILE *f = fopen(filename, "w"); if (!f) { FPRINTF(stderr, "Error when opening file %s\n", filename); return 1; } // A double is written with the format %e ... _starpu_write_double(f, "%e", val); fprintf(f, " %s\n", STRING); fclose(f); /* read the double value and the string back from the file */ f = fopen(filename, "r"); if (!f) { FPRINTF(stderr, "Error when opening file %s\n", filename); return 1; } double lat; char str[10]; // ... but is read with the format %le int x = _starpu_read_double(f, "%le", &lat); int y = fscanf(f, " %9s", str); fclose(f); unlink(filename); /* check that what has been read is identical to what has been written */ int pass; pass = (x == 1) && (y == 1); pass = pass && strcmp(str, STRING) == 0; if (checknan) pass = pass && isnan(val) && isnan(lat); else pass = pass && (int)lat == (int)val; return pass?0:1; } int main(int argc, char **argv) { int ret1, ret2; double nanvalue = nan(""); ret1 = _check_number(42.0, 0); FPRINTF(stderr, "%s when reading %e\n", ret1==0?"Success":"Error", 42.0); ret2 = _check_number(nanvalue, 1); FPRINTF(stderr, "%s when reading %e\n", ret2==0?"Success":"Error", nanvalue); return ret1+ret2; } starpu-1.2.3+dfsg/tests/regression/000077500000000000000000000000001320135501600172705ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/regression/profiles.build.only.in000066400000000000000000000017501320135501600235240ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010 Université de Bordeaux # Copyright (C) 2010, 2011 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # Build configuration # Build configuration --enable-coverage # Build configuration --disable-opencl # Build configuration --disable-cuda # Build configuration --disable-cuda --disable-opencl # Build configuration --enable-cuda --disable-opencl # Build configuration --disable-cuda --enable-opencl # Build configuration --with-fxt starpu-1.2.3+dfsg/tests/regression/profiles.in000066400000000000000000000031361320135501600214460ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010, 2014 Université de Bordeaux # Copyright (C) 2010, 2011 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # Build configuration --enable-coverage # Execution configuration # Build configuration --enable-debug --enable-verbose # Execution configuration STARPU_LOGFILENAME=/tmp/starpu_run.log # # Build configuration # Execution configuration STARPU_NCUDA=0 # Execution configuration STARPU_NCUDA=1 # Execution configuration STARPU_SCHED=ws # Execution configuration STARPU_SCHED=lws # Execution configuration STARPU_SCHED=prio # Execution configuration STARPU_SCHED=no-prio # Execution configuration STARPU_SCHED=dm # Execution configuration STARPU_SCHED=dmda # Execution configuration STARPU_SCHED=random # Execution configuration STARPU_SCHED=eager # Execution configuration STARPU_SCHED=dmda STARPU_SCHED_ALPHA=10 STARPU_SCHED_BETA=15 # Execution configuration STARPU_CALIBRATE=1 # Execution configuration STARPU_PREFETCH=1 # # Build configuration --disable-cuda # Execution configuration # # Build configuration --disable-opencl # Execution configuration starpu-1.2.3+dfsg/tests/regression/regression.sh.in000077500000000000000000000072751320135501600224270ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. WORKDIR=`mktemp -d` SRCDIR=@STARPU_SRC_DIR@ MAKE="${MAKE:-make -j3}" ################################################## # arg: returned status from the previous command check_exec() { PROFILE=$PROFILE_NUM if [ $SUBPROFILE_NUM -ne 0 ] ; then PROFILE="${PROFILE}.${SUBPROFILE_NUM}" fi if [ $1 -eq 0 ]; then echo "PASS: Profile $PROFILE" else echo "FAIL: Profile $PROFILE" if [ ${ABORT_ON_ERROR} -eq 1 ]; then echo "Aborting ..." exit 1; fi fi } do_build() { PROFILE_NUM=`expr ${PROFILE_NUM} + 1` echo ">>> Build configuration ${PROFILE_NUM}: <$@>" rm -rf ${WORKDIR}/build/* cd ${WORKDIR}/build ${SRCDIR}/configure "$@" > $WORKDIR/logs/profile.${PROFILE_NUM} 2>&1 cd - code_build=$? if [ $code_build -ne 0 ]; then check_exec $code_build else ${MAKE} -C ${WORKDIR}/build >> $WORKDIR/logs/profile.${PROFILE_NUM} 2>&1 code_build=$? check_exec $code_build fi } do_test() { SUBPROFILE_NUM=`expr ${SUBPROFILE_NUM} + 1` echo ">>>> Execution configuration ${PROFILE_NUM}.${SUBPROFILE_NUM} : <$@>" ( export $* ; ${MAKE} -C ${WORKDIR}/build check ) > $WORKDIR/logs/profile.${PROFILE_NUM}.${SUBPROFILE_NUM} 2>&1 code_check=$? check_exec $code_check if [ $code_check -ne 0 ] ; then grep FAIL: $WORKDIR/logs/profile.${PROFILE_NUM}.${SUBPROFILE_NUM} fi coverage=$(find ${WORKDIR}/build -name "*.gcda" 2>/dev/null) if [ -n "$coverage" ] ; then lcov -c -d ${WORKDIR}/build -o ${WORKDIR}/cov/profile_${PROFILE_NUM}.${SUBPROFILE_NUM}.lcov >> $WORKDIR/logs/profile.${PROFILE_NUM}.${SUBPROFILE_NUM} 2>&1 fi } ################################################## ABORT_ON_ERROR=0 while [ $# -ne 0 ]; do case $1 in --abort-on-error) ABORT_ON_ERROR=1 shift ;; --help) echo echo "Error. Syntax $0 [ --abort-on-error ] " echo exit 0 ;; *) break ;; esac done if [ -z "$1" ] ; then echo "Error. Syntax $0 [ --abort-on-error ] " exit 0 fi ################################################# ## Create and jump to the workdir mkdir ${WORKDIR}/build ; mkdir ${WORKDIR}/cov ; mkdir ${WORKDIR}/html ; mkdir ${WORKDIR}/logs PROFILE_NUM=0 code_build=1 for file in $* ; do ( while read line ; do if [ "$line" == "# Build configuration" ] ; then read line SUBPROFILE_NUM=0 do_build $line elif [ "$line" == "# Execution configuration" ] ; then read line if [ $code_build -eq 0 ] ; then do_test $line fi fi done ) < $file done echo $WORKDIR ### End of script coverage=$(ls ${WORKDIR}/cov/*.lcov 2>/dev/null) if [ -n "${coverage}" ] ; then genhtml --function-coverage --legend ${WORKDIR}/cov/*.lcov -o ${WORKDIR}/html -t "StarPU coverage test results" > ${WORKDIR}/logs/genhtml.log echo "The coverage report is located at : ${WORKDIR}/html" fi echo "Tests done" starpu-1.2.3+dfsg/tests/sched_policies/000077500000000000000000000000001320135501600200655ustar00rootroot00000000000000starpu-1.2.3+dfsg/tests/sched_policies/data_locality.c000066400000000000000000000125301320135501600230430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * Check that scheduling policies tend to put tasks on the worker which has a * copy of the data */ #define NTASKS 8 /* * It is very inefficient to keep moving data between memory nodes. This * test makes sure the scheduler will take account of the data locality * when scheduling tasks. * * Applies to : dmda, pheft. */ void dummy(void *buffers[], void *args) { (void) buffers; (void) args; } /* * Dummy cost function, used to make sure the scheduler does schedule the * task, instead of getting rid of it as soon as possible because it doesn't * know its expected length. */ static double cost_function(struct starpu_task *task, unsigned nimpl) { (void) task; (void) nimpl; return 1.0; } static struct starpu_perfmodel model = { .type = STARPU_COMMON, .cost_function = cost_function }; static struct starpu_codelet cl = { .cpu_funcs = { dummy }, .cuda_funcs = { dummy }, .opencl_funcs = { dummy }, .modes = { STARPU_RW }, .model = &model, .nbuffers = 1 }; static int var = 42; static starpu_data_handle_t rw_handle; static void init_data(void) { starpu_variable_data_register(&rw_handle, STARPU_MAIN_RAM, (uintptr_t) &var, sizeof(var)); } static void free_data(void) { starpu_data_unregister(rw_handle); } static int run(struct starpu_sched_policy *policy) { int ret; struct starpu_conf conf; starpu_conf_init(&conf); conf.sched_policy = policy; ret = starpu_init(&conf); if (ret == -ENODEV) { FPRINTF(stderr, "No device found\n"); return -ENODEV; } if (starpu_cpu_worker_get_count() == 0 || (starpu_cuda_worker_get_count() == 0 && starpu_opencl_worker_get_count() == 0)) goto enodev; starpu_profiling_status_set(1); init_data(); /* Send the handle to a GPU. */ cl.where = STARPU_CUDA | STARPU_OPENCL; struct starpu_task *tasks[NTASKS]; tasks[0] = starpu_task_create(); tasks[0]->cl = &cl; tasks[0]->synchronous = 1; tasks[0]->handles[0] = rw_handle; tasks[0]->destroy = 0; ret = starpu_task_submit(tasks[0]); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); /* Now, run multiple tasks using this handle. */ cl.where |= STARPU_CPU; int i; for (i = 1; i < NTASKS; i++) { tasks[i] = starpu_task_create(); tasks[i]->cl = &cl; tasks[i]->handles[0] = rw_handle; tasks[i]->destroy = 0; ret = starpu_task_submit(tasks[i]); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_task_wait_for_all(); /* All tasks should have been executed on the same GPU. */ ret = 0; int workerid = tasks[0]->profiling_info->workerid; for (i = 0; i < NTASKS; i++) { if (tasks[i]->profiling_info->workerid != workerid) { FPRINTF(stderr, "Error for task %d. Worker id %d different from expected worker id %d\n", i, tasks[i]->profiling_info->workerid, workerid); ret = 1; break; } starpu_task_destroy(tasks[i]); } /* Clean everything up. */ for (; i < NTASKS; i++) starpu_task_destroy(tasks[i]); free_data(); starpu_shutdown(); return ret; enodev: FPRINTF(stderr, "No device found\n"); starpu_shutdown(); return -ENODEV; } /* XXX: Does this test apply to other schedulers ? */ //extern struct starpu_sched_policy _starpu_sched_ws_policy; //extern struct starpu_sched_policy _starpu_sched_prio_policy; //extern struct starpu_sched_policy _starpu_sched_random_policy; //extern struct starpu_sched_policy _starpu_sched_dm_policy; extern struct starpu_sched_policy _starpu_sched_dmda_policy; //extern struct starpu_sched_policy _starpu_sched_dmda_ready_policy; //extern struct starpu_sched_policy _starpu_sched_dmda_sorted_policy; //extern struct starpu_sched_policy _starpu_sched_eager_policy; extern struct starpu_sched_policy _starpu_sched_parallel_heft_policy; //extern struct starpu_sched_policy _starpu_sched_peager_policy; static struct starpu_sched_policy *policies[] = { //&_starpu_sched_ws_policy, //&_starpu_sched_prio_policy, //&_starpu_sched_dm_policy, &_starpu_sched_dmda_policy, //&_starpu_sched_dmda_ready_policy, //&_starpu_sched_dmda_sorted_policy, //&_starpu_sched_random_policy, //&_starpu_sched_eager_policy, &_starpu_sched_parallel_heft_policy, //&_starpu_sched_peager_policy }; int main(void) { int i; int n_policies = sizeof(policies)/sizeof(policies[0]); int global_ret = 0; #ifdef STARPU_HAVE_UNSETENV unsetenv("STARPU_SCHED"); #endif for (i = 0; i < n_policies; ++i) { struct starpu_sched_policy *policy = policies[i]; FPRINTF(stdout, "Running with policy %s.\n", policy->policy_name); int ret = run(policy); if (ret == -ENODEV && global_ret == 0) global_ret = STARPU_TEST_SKIPPED; if (ret == 1 && global_ret == 0) global_ret = ret; } return global_ret; } starpu-1.2.3+dfsg/tests/sched_policies/execute_all_tasks.c000066400000000000000000000046561320135501600237430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * All tasks submitted by StarPU should be executed once. * Applies to: all schedulers. */ #define NTASKS 8 void dummy(void *buffers[], void *args) { (void) buffers; (void) args; } static int run(struct starpu_sched_policy *p) { int ret; struct starpu_conf conf; (void) starpu_conf_init(&conf); conf.sched_policy = p; ret = starpu_init(&conf); if (ret == -ENODEV) exit(STARPU_TEST_SKIPPED); struct starpu_task *tasks[NTASKS] = { NULL }; struct starpu_codelet cl = { .cpu_funcs = {dummy}, .cpu_funcs_name = {"dummy"}, .cuda_funcs = {dummy}, .opencl_funcs = {dummy}, .nbuffers = 0 }; int i; for (i = 0; i < NTASKS; i++) { struct starpu_task *task = starpu_task_create(); tasks[i] = task; task->cl = &cl; task->synchronous = 1; task->destroy = 0; ret = starpu_task_submit(task); if (ret != 0) { FPRINTF(stderr,"task submission returned %d\n", ret); return 1; } } starpu_task_wait_for_all(); ret = 0; for (i = 0; i < NTASKS; i++) { struct _starpu_job *j = tasks[i]->starpu_private; if (j == NULL || j->terminated == 0) { FPRINTF(stderr, "Error with policy %s.\n", p->policy_name); ret = 1; break; } } for (i = 0; i < NTASKS; i++) { starpu_task_destroy(tasks[i]); } starpu_shutdown(); return ret; } int main(void) { struct starpu_sched_policy **policies; struct starpu_sched_policy **policy; #ifdef STARPU_HAVE_UNSETENV unsetenv("STARPU_SCHED"); #endif policies = starpu_sched_get_predefined_policies(); for(policy=policies ; *policy!=NULL ; policy++) { FPRINTF(stderr, "Running with policy %s.\n", (*policy)->policy_name); int ret; ret = run(*policy); if (ret == 1) return EXIT_FAILURE; } return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/sched_policies/prio.c000066400000000000000000000052501320135501600212040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013, 2015-2016 Université Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Task1 must be executed before task0, even if task0 is submitted first. * Applies to : all schedulers. */ #ifdef STARPU_QUICK_CHECK #define NTASKS 10 #elif !defined(STARPU_LONG_CHECK) #define NTASKS 100 #else #define NTASKS 1000 #endif void A(void *buffers[], void *args) { (void) buffers; (void) args; FPRINTF(stdout,"A"); usleep(1000); } void B(void *buffers[], void *args) { (void) buffers; (void) args; FPRINTF(stdout,"B"); usleep(1000); } static int run(struct starpu_sched_policy *policy) { int ret; struct starpu_conf conf; int i; starpu_conf_init(&conf); conf.sched_policy = policy; ret = starpu_init(&conf); if (ret != 0) exit(STARPU_TEST_SKIPPED); starpu_profiling_status_set(1); struct starpu_codelet clA = { .cpu_funcs = {A}, .cpu_funcs_name = {"A"}, .nbuffers = 0 }; struct starpu_codelet clB = { .cpu_funcs = {B}, .cpu_funcs_name = {"B"}, .nbuffers = 0 }; starpu_srand48(0); for (i = 0; i < NTASKS; i++) { struct starpu_task *task = starpu_task_create(); if (((int)(starpu_drand48()*2))%2) { task->cl = &clA; task->priority=STARPU_MIN_PRIO; } else { task->cl = &clB; task->priority=STARPU_MAX_PRIO; } task->detach=1; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_task_wait_for_all(); FPRINTF(stdout,"\n"); starpu_shutdown(); return 0; enodev: starpu_shutdown(); return -ENODEV; } int main(void) { struct starpu_sched_policy **policies; struct starpu_sched_policy **policy; #ifdef STARPU_HAVE_UNSETENV unsetenv("STARPU_SCHED"); #endif policies = starpu_sched_get_predefined_policies(); for(policy=policies ; *policy!=NULL ; policy++) { int ret; FPRINTF(stderr, "Running with policy %s.\n", (*policy)->policy_name); ret = run(*policy); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; if (ret == 1) return EXIT_FAILURE; } return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tests/sched_policies/simple_cpu_gpu_sched.c000066400000000000000000000163171320135501600244220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #include /* * Schedulers that are aware of the expected task length provided by the * perfmodels must make sure that : * - cpu_task is cheduled on a CPU. * - gpu_task is scheduled on a GPU. * * Applies to : dmda and to what other schedulers ? */ void dummy(void *buffers[], void *args) { (void) buffers; (void) args; } /* * Fake cost functions. */ static double cpu_task_cpu(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { (void) task; (void) arch; (void) nimpl; return 1.0; } static double cpu_task_gpu(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { (void) task; (void) arch; (void) nimpl; return 1000.0; } static double gpu_task_cpu(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { (void) task; (void) arch; (void) nimpl; return 1000.0; } static double gpu_task_gpu(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { (void) task; (void) arch; (void) nimpl; return 1.0; } static struct starpu_perfmodel model_cpu_task = { .type = STARPU_PER_ARCH, .symbol = "model_cpu_task" }; static struct starpu_perfmodel model_gpu_task = { .type = STARPU_PER_ARCH, .symbol = "model_gpu_task" }; static void init_perfmodels_gpu(int gpu_type) { int nb_worker_gpu = starpu_worker_get_count_by_type(gpu_type); int *worker_gpu_ids = malloc(nb_worker_gpu * sizeof(int)); int worker_gpu; starpu_worker_get_ids_by_type(gpu_type, worker_gpu_ids, nb_worker_gpu); for(worker_gpu = 0 ; worker_gpu < nb_worker_gpu ; worker_gpu ++) { starpu_perfmodel_set_per_devices_cost_function(&model_cpu_task, 0, cpu_task_gpu, gpu_type, starpu_worker_get_devid(worker_gpu_ids[worker_gpu]), 1, -1); starpu_perfmodel_set_per_devices_cost_function(&model_gpu_task, 0, gpu_task_gpu, gpu_type, starpu_worker_get_devid(worker_gpu_ids[worker_gpu]), 1, -1); } free(worker_gpu_ids); } static void init_perfmodels(void) { starpu_perfmodel_init(&model_cpu_task); starpu_perfmodel_init(&model_gpu_task); starpu_perfmodel_set_per_devices_cost_function(&model_cpu_task, 0, cpu_task_cpu, STARPU_CPU_WORKER, 0, 1, -1); starpu_perfmodel_set_per_devices_cost_function(&model_gpu_task, 0, gpu_task_cpu, STARPU_CPU_WORKER, 0, 1, -1); // We need to set the cost function for each combination with a CUDA or a OpenCL worker init_perfmodels_gpu(STARPU_CUDA_WORKER); init_perfmodels_gpu(STARPU_OPENCL_WORKER); } /* * Dummy codelets. */ static struct starpu_codelet cpu_cl = { .cpu_funcs = { dummy }, .cuda_funcs = { dummy }, .opencl_funcs = { dummy }, .nbuffers = 0, .model = &model_cpu_task }; static struct starpu_codelet gpu_cl = { .cpu_funcs = { dummy }, .cuda_funcs = { dummy }, .opencl_funcs = { dummy }, .nbuffers = 0, .model = &model_gpu_task }; static int run(struct starpu_sched_policy *policy) { struct starpu_conf conf; starpu_conf_init(&conf); conf.sched_policy = policy; int ret = starpu_init(&conf); if (ret == -ENODEV) exit(STARPU_TEST_SKIPPED); /* At least 1 CPU and 1 GPU are needed. */ if (starpu_cpu_worker_get_count() == 0) { starpu_shutdown(); exit(STARPU_TEST_SKIPPED); } if (starpu_cuda_worker_get_count() == 0 && starpu_opencl_worker_get_count() == 0) { starpu_shutdown(); exit(STARPU_TEST_SKIPPED); } starpu_profiling_status_set(1); init_perfmodels(); struct starpu_task *cpu_task = starpu_task_create(); cpu_task->cl = &cpu_cl; cpu_task->destroy = 0; struct starpu_task *gpu_task = starpu_task_create(); gpu_task->cl = &gpu_cl; gpu_task->destroy = 0; ret = starpu_task_submit(cpu_task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(gpu_task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_task_wait_for_all(); enum starpu_worker_archtype cpu_task_worker, gpu_task_worker; cpu_task_worker = starpu_worker_get_type(cpu_task->profiling_info->workerid); gpu_task_worker = starpu_worker_get_type(gpu_task->profiling_info->workerid); if (cpu_task_worker != STARPU_CPU_WORKER || (gpu_task_worker != STARPU_CUDA_WORKER && gpu_task_worker != STARPU_OPENCL_WORKER)) { FPRINTF(stderr, "Tasks did not execute on expected worker\n"); if (cpu_task_worker != STARPU_CPU_WORKER) { FPRINTF(stderr, "The CPU task did not run on a CPU worker\n"); } if (gpu_task_worker != STARPU_CUDA_WORKER && gpu_task_worker != STARPU_OPENCL_WORKER) { FPRINTF(stderr, "The GPU task did not run on a Cuda or OpenCL worker\n"); } ret = 1; } else { FPRINTF(stderr, "Tasks DID execute on expected worker\n"); ret = 0; } starpu_task_destroy(cpu_task); starpu_task_destroy(gpu_task); starpu_shutdown(); return ret; } /* extern struct starpu_sched_policy _starpu_sched_ws_policy; extern struct starpu_sched_policy _starpu_sched_prio_policy; extern struct starpu_sched_policy _starpu_sched_random_policy; extern struct starpu_sched_policy _starpu_sched_dm_policy; extern struct starpu_sched_policy _starpu_sched_dmda_ready_policy; extern struct starpu_sched_policy _starpu_sched_dmda_sorted_policy; extern struct starpu_sched_policy _starpu_sched_eager_policy; extern struct starpu_sched_policy _starpu_sched_parallel_heft_policy; extern struct starpu_sched_policy _starpu_sched_peager_policy; */ extern struct starpu_sched_policy _starpu_sched_dmda_policy; /* XXX: what policies are we interested in ? */ static struct starpu_sched_policy *policies[] = { //&_starpu_sched_ws_policy, //&_starpu_sched_prio_policy, //&_starpu_sched_dm_policy, &_starpu_sched_dmda_policy, //&_starpu_sched_dmda_ready_policy, //&_starpu_sched_dmda_sorted_policy, //&_starpu_sched_random_policy, //&_starpu_sched_eager_policy, //&_starpu_sched_parallel_heft_policy, //&_starpu_sched_peager_policy }; int main(void) { #ifndef STARPU_HAVE_SETENV /* XXX: is this macro used by all the schedulers we are interested in ? */ #warning "setenv() is not available, skipping this test" return STARPU_TEST_SKIPPED; #else setenv("STARPU_SCHED_BETA", "0", 1); #ifdef STARPU_HAVE_UNSETENV unsetenv("STARPU_SCHED"); #endif if (starpu_get_env_number_default("STARPU_NWORKER_PER_CUDA", 1) != 1) return STARPU_TEST_SKIPPED; int i; int n_policies = sizeof(policies)/sizeof(policies[0]); for (i = 0; i < n_policies; ++i) { struct starpu_sched_policy *policy = policies[i]; FPRINTF(stdout, "Running with policy %s.\n", policy->policy_name); int ret; ret = run(policy); if (ret == 1) return EXIT_FAILURE; } return EXIT_SUCCESS; #endif } starpu-1.2.3+dfsg/tests/sched_policies/simple_deps.c000066400000000000000000000051311320135501600225350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Task1 must be executed before task0, even if task0 is submitted first. * Applies to : all schedulers. */ void dummy(void *buffers[], void *args) { (void) buffers; (void) args; usleep(10000); } static int run(struct starpu_sched_policy *policy) { int ret; struct starpu_conf conf; starpu_conf_init(&conf); conf.sched_policy = policy; ret = starpu_init(&conf); if (ret != 0) exit(STARPU_TEST_SKIPPED); starpu_profiling_status_set(1); struct starpu_codelet cl = { .cpu_funcs = {dummy}, .cpu_funcs_name = {"dummy"}, .nbuffers = 0 }; struct starpu_task *task0 = starpu_task_create(); task0->cl = &cl; task0->destroy = 0; struct starpu_task *task1 = starpu_task_create(); task1->cl = &cl; task1->destroy = 0; starpu_task_declare_deps_array(task0, 1, &task1); ret = starpu_task_submit(task0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(task1); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_task_wait_for_all(); double task1_end, task0_start; task1_end = starpu_timing_timespec_to_us(&task1->profiling_info->end_time); task0_start = starpu_timing_timespec_to_us(&task0->profiling_info->start_time); starpu_task_destroy(task0); starpu_task_destroy(task1); starpu_shutdown(); return !!(task1_end > task0_start); enodev: starpu_shutdown(); return -ENODEV; } int main(void) { struct starpu_sched_policy **policies; struct starpu_sched_policy **policy; #ifdef STARPU_HAVE_UNSETENV unsetenv("STARPU_SCHED"); #endif policies = starpu_sched_get_predefined_policies(); for(policy=policies ; *policy!=NULL ; policy++) { int ret; FPRINTF(stderr, "Running with policy %s.\n", (*policy)->policy_name); ret = run(*policy); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; if (ret == 1) return EXIT_FAILURE; } return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tools/000077500000000000000000000000001320135501600151065ustar00rootroot00000000000000starpu-1.2.3+dfsg/tools/Makefile.am000066400000000000000000000303121320135501600171410ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2017 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016, 2017 CNRS # Copyright (C) 2016 Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. include $(top_srcdir)/starpu.mk if STARPU_SIMGRID STARPU_PERF_MODEL_DIR=$(abs_top_srcdir)/tools/perfmodels/sampling STARPU_HOSTNAME=mirage MALLOC_PERTURB_=0 export STARPU_PERF_MODEL_DIR export STARPU_HOSTNAME export MALLOC_PERTURB_ endif SUBDIRS = AM_CFLAGS = $(HWLOC_CFLAGS) $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(STARPU_COI_CPPFLAGS) $(GLOBAL_AM_CFLAGS) LIBS = $(top_builddir)/src/@LIBSTARPU_LINK@ @LIBS@ $(FXT_LIBS) AM_CPPFLAGS = -I$(top_srcdir)/include/ -I$(top_srcdir)/tools/ -I$(top_srcdir)/mpi/ -I$(top_builddir)/src -I$(top_srcdir)/src AM_LDFLAGS = @STARPU_EXPORT_DYNAMIC@ $(STARPU_COI_LDFLAGS) $(STARPU_SCIF_LDFLAGS) bin_PROGRAMS = dist_bin_SCRIPTS = dist_pkgdata_DATA = gdbinit pkgdata_perfmodels_sampling_busdir = $(datarootdir)/starpu/perfmodels/sampling/bus pkgdata_perfmodels_sampling_codeletsdir = $(datarootdir)/starpu/perfmodels/sampling/codelets/44 dist_pkgdata_perfmodels_sampling_bus_DATA = \ perfmodels/sampling/bus/attila.affinity \ perfmodels/sampling/bus/attila.bandwidth \ perfmodels/sampling/bus/attila.config \ perfmodels/sampling/bus/attila.latency \ perfmodels/sampling/bus/attila.platform.xml \ perfmodels/sampling/bus/attila.platform.v4.xml \ perfmodels/sampling/bus/idgraf.affinity \ perfmodels/sampling/bus/idgraf.bandwidth \ perfmodels/sampling/bus/idgraf.config \ perfmodels/sampling/bus/idgraf.latency \ perfmodels/sampling/bus/idgraf.platform.xml \ perfmodels/sampling/bus/idgraf.platform.v4.xml \ perfmodels/sampling/bus/mirage.affinity \ perfmodels/sampling/bus/mirage.bandwidth \ perfmodels/sampling/bus/mirage.config \ perfmodels/sampling/bus/mirage.latency \ perfmodels/sampling/bus/mirage.platform.xml \ perfmodels/sampling/bus/mirage.platform.v4.xml \ perfmodels/sampling/bus/sirocco.affinity \ perfmodels/sampling/bus/sirocco.bandwidth \ perfmodels/sampling/bus/sirocco.config \ perfmodels/sampling/bus/sirocco.latency \ perfmodels/sampling/bus/sirocco.platform.xml \ perfmodels/sampling/bus/sirocco.platform.v4.xml dist_pkgdata_perfmodels_sampling_codelets_DATA = \ perfmodels/sampling/codelets/44/chol_model_11.attila \ perfmodels/sampling/codelets/44/chol_model_21.attila \ perfmodels/sampling/codelets/44/chol_model_22.attila \ perfmodels/sampling/codelets/44/cl_update.attila \ perfmodels/sampling/codelets/44/save_cl_bottom.attila \ perfmodels/sampling/codelets/44/save_cl_top.attila \ perfmodels/sampling/codelets/44/starpu_sgemm_gemm.attila \ perfmodels/sampling/codelets/44/starpu_dgemm_gemm.attila \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_11.attila \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_12.attila \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_21.attila \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_22.attila \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_11.attila \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_12.attila \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_21.attila \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_22.attila \ perfmodels/sampling/codelets/44/overlap_sleep_1024_24.attila \ perfmodels/sampling/codelets/44/chol_model_11.idgraf \ perfmodels/sampling/codelets/44/chol_model_21.idgraf \ perfmodels/sampling/codelets/44/chol_model_22.idgraf \ perfmodels/sampling/codelets/44/cl_update.idgraf \ perfmodels/sampling/codelets/44/save_cl_bottom.idgraf \ perfmodels/sampling/codelets/44/save_cl_top.idgraf \ perfmodels/sampling/codelets/44/starpu_sgemm_gemm.idgraf \ perfmodels/sampling/codelets/44/starpu_dgemm_gemm.idgraf \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_11.idgraf \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_12.idgraf \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_21.idgraf \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_22.idgraf \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_11.idgraf \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_12.idgraf \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_21.idgraf \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_22.idgraf \ perfmodels/sampling/codelets/44/chol_model_11.mirage \ perfmodels/sampling/codelets/44/chol_model_21.mirage \ perfmodels/sampling/codelets/44/chol_model_22.mirage \ perfmodels/sampling/codelets/44/cl_update.mirage \ perfmodels/sampling/codelets/44/save_cl_bottom.mirage \ perfmodels/sampling/codelets/44/save_cl_top.mirage \ perfmodels/sampling/codelets/44/starpu_sgemm_gemm.mirage \ perfmodels/sampling/codelets/44/starpu_dgemm_gemm.mirage \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_11.mirage \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_12.mirage \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_21.mirage \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_22.mirage \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_11.mirage \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_12.mirage \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_21.mirage \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_22.mirage \ perfmodels/sampling/codelets/44/overlap_sleep_1024_24.mirage \ perfmodels/sampling/codelets/44/chol_model_11.sirocco \ perfmodels/sampling/codelets/44/chol_model_21.sirocco \ perfmodels/sampling/codelets/44/chol_model_22.sirocco \ perfmodels/sampling/codelets/44/cl_update.sirocco \ perfmodels/sampling/codelets/44/save_cl_bottom.sirocco \ perfmodels/sampling/codelets/44/save_cl_top.sirocco \ perfmodels/sampling/codelets/44/starpu_sgemm_gemm.sirocco \ perfmodels/sampling/codelets/44/starpu_dgemm_gemm.sirocco \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_11.sirocco \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_12.sirocco \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_21.sirocco \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_22.sirocco \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_11.sirocco \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_12.sirocco \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_21.sirocco \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_22.sirocco \ perfmodels/sampling/codelets/44/overlap_sleep_1024_24.sirocco EXTRA_DIST = \ dev/checker/rename.sed \ dev/checker/rename.sh \ dev/cppcheck/suppressions.txt \ dev/valgrind/fxt.suppr \ dev/valgrind/hwloc.suppr \ dev/valgrind/libc.suppr \ dev/valgrind/libgomp.suppr \ dev/valgrind/libnuma.suppr \ dev/valgrind/madmpi.suppr \ dev/valgrind/opencl.suppr \ dev/valgrind/openmpi.suppr \ dev/valgrind/openmp.suppr \ dev/valgrind/padico.suppr \ dev/valgrind/pthread.suppr \ dev/valgrind/starpu.suppr \ dev/valgrind/valgrind.suppr \ dev/valgrind/valgrind.sh \ dev/valgrind/valgrind_xml.sh \ dev/valgrind/helgrind.sh \ dev/tsan/starpu.suppr \ dev/lsan/libc.suppr \ dev/lsan/openmpi.suppr \ perfmodels/README \ msvc/starpu_clean.bat \ msvc/starpu_open.bat \ msvc/starpu_exec.bat \ msvc/starpu_var.bat \ msvc/starpu.sln \ msvc/starpu/starpu.vcxproj CLEANFILES = *.gcno *.gcda *.linkinfo starpu_idle_microsec.log ##################################### # What to install and what to check # ##################################### STARPU_TOOLS = TESTS = $(STARPU_TOOLS) if STARPU_HAVE_WINDOWS check_PROGRAMS = $(STARPU_TOOLS) else check_PROGRAMS = $(LOADER) $(STARPU_TOOLS) endif if !STARPU_HAVE_WINDOWS ## test loader program if !STARPU_CROSS_COMPILING LOADER = loader loader_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -I$(top_builddir)/src/ LOADER_BIN = $(abs_top_builddir)/tools/$(LOADER) loader_SOURCES = ../tests/loader.c else LOADER = LOADER_BIN = $(top_builddir)/tests/loader-cross.sh endif if STARPU_HAVE_AM111 TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" LOG_COMPILER = $(LOADER_BIN) else TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(LOADER_BIN) endif endif if STARPU_USE_FXT bin_PROGRAMS += \ starpu_fxt_tool \ starpu_fxt_stats \ starpu_fxt_data_trace STARPU_TOOLS += \ starpu_fxt_tool \ starpu_fxt_stats \ starpu_fxt_data_trace starpu_fxt_tool_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) $(FXT_CFLAGS) starpu_fxt_tool_LDADD = $(FXT_LIBS) starpu_fxt_tool_LDFLAGS = $(FXT_LDFLAGS) starpu_fxt_stats_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) $(FXT_CFLAGS) starpu_fxt_stats_LDADD = $(FXT_LIBS) starpu_fxt_stats_LDFLAGS = $(FXT_LDFLAGS) starpu_fxt_data_trace_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) $(FXT_CFLAGS) starpu_fxt_data_trace_LDADD = $(FXT_LIBS) starpu_fxt_data_trace_LDFLAGS = $(FXT_LDFLAGS) endif bin_PROGRAMS += \ starpu_perfmodel_display \ starpu_perfmodel_plot \ starpu_calibrate_bus \ starpu_machine_display \ starpu_sched_display \ starpu_tasks_rec_complete \ starpu_lp2paje starpu_perfmodel_plot_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) $(FXT_CFLAGS) if STARPU_LONG_CHECK STARPU_TOOLS += \ starpu_calibrate_bus endif STARPU_TOOLS += \ starpu_machine_display \ starpu_sched_display if !STARPU_HAVE_WINDOWS STARPU_TOOLS += \ starpu_perfmodel_display \ starpu_perfmodel_plot endif dist_bin_SCRIPTS += \ starpu_workers_activity \ starpu_codelet_histo_profile \ starpu_codelet_profile \ starpu_paje_draw_histogram \ starpu_paje_draw_histogram.R \ starpu_paje_state_stats if STARPU_USE_AYUDAME2 dist_bin_SCRIPTS += \ starpu_temanejo2.sh dist_pkgdata_DATA += \ ayudame.cfg endif if STARPU_HAVE_WINDOWS STARPU_MSVC_dir = $(bindir) nobase_STARPU_MSVC__DATA = \ msvc/starpu_clean.bat \ msvc/starpu_open.bat \ msvc/starpu_exec.bat \ msvc/starpu_var.bat \ msvc/starpu.sln \ msvc/starpu/starpu.vcxproj endif if STARPU_HAVE_HELP2MAN starpu_calibrate_bus.1: starpu_calibrate_bus$(EXEEXT) help2man --no-discard-stderr -N --output=$@ ./$< starpu_machine_display.1: starpu_machine_display$(EXEEXT) help2man --no-discard-stderr -N --output=$@ ./$< starpu_perfmodel_display.1: starpu_perfmodel_display$(EXEEXT) help2man --no-discard-stderr -N --output=$@ ./$< starpu_perfmodel_plot.1: starpu_perfmodel_plot$(EXEEXT) help2man --no-discard-stderr -N --output=$@ ./$< starpu_tasks_rec_complete.1: starpu_tasks_rec_complete$(EXEEXT) help2man --no-discard-stderr -N --output=$@ ./$< starpu_lp2paje.1: starpu_lp2paje$(EXEEXT) help2man --no-discard-stderr -N --output=$@ ./$< starpu_workers_activity.1: starpu_workers_activity chmod +x $< help2man --no-discard-stderr -N --output=$@ ./$< starpu_codelet_profile.1: starpu_codelet_profile chmod +x $< help2man --no-discard-stderr -N --output=$@ ./$< starpu_codelet_histo_profile.1: starpu_codelet_histo_profile chmod +x $< help2man --no-discard-stderr -N --output=$@ ./$< starpu_paje_draw_histogram.1: starpu_paje_draw_histogram chmod +x $< help2man --no-discard-stderr -N --output=$@ ./$< starpu_paje_state_stats.1: starpu_paje_state_stats chmod +x $< help2man --no-discard-stderr -N --output=$@ ./$< if STARPU_USE_FXT starpu_fxt_tool.1: starpu_fxt_tool$(EXEEXT) help2man --no-discard-stderr -N --output=$@ ./$< starpu_fxt_stats.1: starpu_fxt_stats$(EXEEXT) help2man --no-discard-stderr -N --output=$@ ./$< starpu_fxt_data_trace.1: starpu_fxt_data_trace$(EXEEXT) help2man --no-discard-stderr -N --output=$@ ./$< endif dist_man1_MANS =\ starpu_calibrate_bus.1 \ starpu_machine_display.1 \ starpu_perfmodel_display.1 \ starpu_perfmodel_plot.1 \ starpu_tasks_rec_complete.1 \ starpu_lp2paje.1 \ starpu_workers_activity.1 \ starpu_codelet_profile.1 \ starpu_codelet_histo_profile.1 \ starpu_paje_draw_histogram.1 \ starpu_paje_state_stats.1 if STARPU_USE_FXT dist_man1_MANS +=\ starpu_fxt_tool.1 \ starpu_fxt_stats.1 \ starpu_fxt_data_trace.1 endif clean-local: $(RM) $(dist_man1_MANS) endif if STARPU_SIMGRID dist_pkgdata_DATA += starpu_smpi.xslt dist_bin_SCRIPTS += starpu_smpirun endif starpu-1.2.3+dfsg/tools/Makefile.in000066400000000000000000002631241320135501600171630ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2017 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016, 2017 CNRS # Copyright (C) 2016 Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = $(am__EXEEXT_1) starpu_perfmodel_display$(EXEEXT) \ starpu_perfmodel_plot$(EXEEXT) starpu_calibrate_bus$(EXEEXT) \ starpu_machine_display$(EXEEXT) starpu_sched_display$(EXEEXT) \ starpu_tasks_rec_complete$(EXEEXT) starpu_lp2paje$(EXEEXT) TESTS = $(am__EXEEXT_5) @STARPU_HAVE_WINDOWS_FALSE@check_PROGRAMS = $(am__EXEEXT_2) \ @STARPU_HAVE_WINDOWS_FALSE@ $(am__EXEEXT_5) @STARPU_HAVE_WINDOWS_TRUE@check_PROGRAMS = $(am__EXEEXT_5) @STARPU_USE_FXT_TRUE@am__append_1 = \ @STARPU_USE_FXT_TRUE@ starpu_fxt_tool \ @STARPU_USE_FXT_TRUE@ starpu_fxt_stats \ @STARPU_USE_FXT_TRUE@ starpu_fxt_data_trace @STARPU_USE_FXT_TRUE@am__append_2 = \ @STARPU_USE_FXT_TRUE@ starpu_fxt_tool \ @STARPU_USE_FXT_TRUE@ starpu_fxt_stats \ @STARPU_USE_FXT_TRUE@ starpu_fxt_data_trace @STARPU_LONG_CHECK_TRUE@am__append_3 = \ @STARPU_LONG_CHECK_TRUE@ starpu_calibrate_bus @STARPU_HAVE_WINDOWS_FALSE@am__append_4 = \ @STARPU_HAVE_WINDOWS_FALSE@ starpu_perfmodel_display \ @STARPU_HAVE_WINDOWS_FALSE@ starpu_perfmodel_plot @STARPU_USE_AYUDAME2_TRUE@am__append_5 = \ @STARPU_USE_AYUDAME2_TRUE@ starpu_temanejo2.sh @STARPU_USE_AYUDAME2_TRUE@am__append_6 = \ @STARPU_USE_AYUDAME2_TRUE@ ayudame.cfg @STARPU_HAVE_HELP2MAN_TRUE@@STARPU_USE_FXT_TRUE@am__append_7 = \ @STARPU_HAVE_HELP2MAN_TRUE@@STARPU_USE_FXT_TRUE@ starpu_fxt_tool.1 \ @STARPU_HAVE_HELP2MAN_TRUE@@STARPU_USE_FXT_TRUE@ starpu_fxt_stats.1 \ @STARPU_HAVE_HELP2MAN_TRUE@@STARPU_USE_FXT_TRUE@ starpu_fxt_data_trace.1 @STARPU_SIMGRID_TRUE@am__append_8 = starpu_smpi.xslt @STARPU_SIMGRID_TRUE@am__append_9 = starpu_smpirun subdir = tools ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__dist_bin_SCRIPTS_DIST) \ $(am__dist_pkgdata_DATA_DIST) \ $(dist_pkgdata_perfmodels_sampling_bus_DATA) \ $(dist_pkgdata_perfmodels_sampling_codelets_DATA) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = starpu_codelet_profile \ starpu_codelet_histo_profile starpu_workers_activity \ starpu_paje_draw_histogram starpu_paje_state_stats \ starpu_paje_summary starpu_paje_sort starpu_smpirun CONFIG_CLEAN_VPATH_FILES = @STARPU_USE_FXT_TRUE@am__EXEEXT_1 = starpu_fxt_tool$(EXEEXT) \ @STARPU_USE_FXT_TRUE@ starpu_fxt_stats$(EXEEXT) \ @STARPU_USE_FXT_TRUE@ starpu_fxt_data_trace$(EXEEXT) am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" \ "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pkgdatadir)" \ "$(DESTDIR)$(pkgdata_perfmodels_sampling_busdir)" \ "$(DESTDIR)$(pkgdata_perfmodels_sampling_codeletsdir)" \ "$(DESTDIR)$(STARPU_MSVC_dir)" @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@am__EXEEXT_2 = loader$(EXEEXT) @STARPU_LONG_CHECK_TRUE@am__EXEEXT_3 = starpu_calibrate_bus$(EXEEXT) @STARPU_HAVE_WINDOWS_FALSE@am__EXEEXT_4 = \ @STARPU_HAVE_WINDOWS_FALSE@ starpu_perfmodel_display$(EXEEXT) \ @STARPU_HAVE_WINDOWS_FALSE@ starpu_perfmodel_plot$(EXEEXT) am__EXEEXT_5 = $(am__EXEEXT_1) $(am__EXEEXT_3) \ starpu_machine_display$(EXEEXT) starpu_sched_display$(EXEEXT) \ $(am__EXEEXT_4) PROGRAMS = $(bin_PROGRAMS) am__loader_SOURCES_DIST = ../tests/loader.c @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@am_loader_OBJECTS = loader-loader.$(OBJEXT) loader_OBJECTS = $(am_loader_OBJECTS) loader_LDADD = $(LDADD) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = starpu_calibrate_bus_SOURCES = starpu_calibrate_bus.c starpu_calibrate_bus_OBJECTS = starpu_calibrate_bus.$(OBJEXT) starpu_calibrate_bus_LDADD = $(LDADD) starpu_fxt_data_trace_SOURCES = starpu_fxt_data_trace.c starpu_fxt_data_trace_OBJECTS = \ starpu_fxt_data_trace-starpu_fxt_data_trace.$(OBJEXT) am__DEPENDENCIES_1 = @STARPU_USE_FXT_TRUE@starpu_fxt_data_trace_DEPENDENCIES = \ @STARPU_USE_FXT_TRUE@ $(am__DEPENDENCIES_1) starpu_fxt_data_trace_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(starpu_fxt_data_trace_LDFLAGS) \ $(LDFLAGS) -o $@ starpu_fxt_stats_SOURCES = starpu_fxt_stats.c starpu_fxt_stats_OBJECTS = \ starpu_fxt_stats-starpu_fxt_stats.$(OBJEXT) @STARPU_USE_FXT_TRUE@starpu_fxt_stats_DEPENDENCIES = \ @STARPU_USE_FXT_TRUE@ $(am__DEPENDENCIES_1) starpu_fxt_stats_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(starpu_fxt_stats_LDFLAGS) $(LDFLAGS) \ -o $@ starpu_fxt_tool_SOURCES = starpu_fxt_tool.c starpu_fxt_tool_OBJECTS = starpu_fxt_tool-starpu_fxt_tool.$(OBJEXT) @STARPU_USE_FXT_TRUE@starpu_fxt_tool_DEPENDENCIES = \ @STARPU_USE_FXT_TRUE@ $(am__DEPENDENCIES_1) starpu_fxt_tool_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(starpu_fxt_tool_LDFLAGS) $(LDFLAGS) \ -o $@ starpu_lp2paje_SOURCES = starpu_lp2paje.c starpu_lp2paje_OBJECTS = starpu_lp2paje.$(OBJEXT) starpu_lp2paje_LDADD = $(LDADD) starpu_machine_display_SOURCES = starpu_machine_display.c starpu_machine_display_OBJECTS = starpu_machine_display.$(OBJEXT) starpu_machine_display_LDADD = $(LDADD) starpu_perfmodel_display_SOURCES = starpu_perfmodel_display.c starpu_perfmodel_display_OBJECTS = starpu_perfmodel_display.$(OBJEXT) starpu_perfmodel_display_LDADD = $(LDADD) starpu_perfmodel_plot_SOURCES = starpu_perfmodel_plot.c starpu_perfmodel_plot_OBJECTS = \ starpu_perfmodel_plot-starpu_perfmodel_plot.$(OBJEXT) starpu_perfmodel_plot_LDADD = $(LDADD) starpu_sched_display_SOURCES = starpu_sched_display.c starpu_sched_display_OBJECTS = starpu_sched_display.$(OBJEXT) starpu_sched_display_LDADD = $(LDADD) starpu_tasks_rec_complete_SOURCES = starpu_tasks_rec_complete.c starpu_tasks_rec_complete_OBJECTS = \ starpu_tasks_rec_complete.$(OBJEXT) starpu_tasks_rec_complete_LDADD = $(LDADD) am__dist_bin_SCRIPTS_DIST = starpu_workers_activity \ starpu_codelet_histo_profile starpu_codelet_profile \ starpu_paje_draw_histogram starpu_paje_draw_histogram.R \ starpu_paje_state_stats starpu_temanejo2.sh starpu_smpirun am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } SCRIPTS = $(dist_bin_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/common -I$(top_builddir)/include -I$(top_builddir)/gcc-plugin/include/starpu-gcc -I$(top_builddir)/starpu-top depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(loader_SOURCES) starpu_calibrate_bus.c \ starpu_fxt_data_trace.c starpu_fxt_stats.c starpu_fxt_tool.c \ starpu_lp2paje.c starpu_machine_display.c \ starpu_perfmodel_display.c starpu_perfmodel_plot.c \ starpu_sched_display.c starpu_tasks_rec_complete.c DIST_SOURCES = $(am__loader_SOURCES_DIST) starpu_calibrate_bus.c \ starpu_fxt_data_trace.c starpu_fxt_stats.c starpu_fxt_tool.c \ starpu_lp2paje.c starpu_machine_display.c \ starpu_perfmodel_display.c starpu_perfmodel_plot.c \ starpu_sched_display.c starpu_tasks_rec_complete.c RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac man1dir = $(mandir)/man1 NROFF = nroff MANS = $(dist_man1_MANS) am__dist_pkgdata_DATA_DIST = gdbinit ayudame.cfg starpu_smpi.xslt DATA = $(dist_pkgdata_DATA) \ $(dist_pkgdata_perfmodels_sampling_bus_DATA) \ $(dist_pkgdata_perfmodels_sampling_codelets_DATA) \ $(nobase_STARPU_MSVC__DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ check recheck distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(dist_man1_MANS) $(srcdir)/Makefile.in \ $(srcdir)/starpu_codelet_histo_profile.in \ $(srcdir)/starpu_codelet_profile.in \ $(srcdir)/starpu_paje_draw_histogram.in \ $(srcdir)/starpu_paje_sort.in \ $(srcdir)/starpu_paje_state_stats.in \ $(srcdir)/starpu_paje_summary.in $(srcdir)/starpu_smpirun.in \ $(srcdir)/starpu_workers_activity.in \ $(top_srcdir)/build-aux/depcomp \ $(top_srcdir)/build-aux/test-driver $(top_srcdir)/starpu.mk DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = $(top_builddir)/src/@LIBSTARPU_LINK@ @LIBS@ $(FXT_LIBS) LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POTI_CFLAGS = @POTI_CFLAGS@ POTI_LIBS = @POTI_LIBS@ PROG_DATE = @PROG_DATE@ PROG_STAT = @PROG_STAT@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_COI_CPPFLAGS = @STARPU_COI_CPPFLAGS@ STARPU_COI_LDFLAGS = @STARPU_COI_LDFLAGS@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LEVELDB_LDFLAGS = @STARPU_LEVELDB_LDFLAGS@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RCCE_CFLAGS = @STARPU_RCCE_CFLAGS@ STARPU_RCCE_CPPFLAGS = @STARPU_RCCE_CPPFLAGS@ STARPU_RCCE_LDFLAGS = @STARPU_RCCE_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SCIF_CPPFLAGS = @STARPU_SCIF_CPPFLAGS@ STARPU_SCIF_LDFLAGS = @STARPU_SCIF_LDFLAGS@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SC_HYPERVISOR_DEBUG = @STARPU_SC_HYPERVISOR_DEBUG@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ mpifort_path = @mpifort_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ smpirun_path = @smpirun_path@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @STARPU_SIMGRID_TRUE@STARPU_PERF_MODEL_DIR = $(abs_top_srcdir)/tools/perfmodels/sampling @STARPU_SIMGRID_TRUE@STARPU_HOSTNAME = mirage @STARPU_SIMGRID_TRUE@MALLOC_PERTURB_ = 0 SUBDIRS = AM_CFLAGS = $(HWLOC_CFLAGS) $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(STARPU_COI_CPPFLAGS) $(GLOBAL_AM_CFLAGS) AM_CPPFLAGS = -I$(top_srcdir)/include/ -I$(top_srcdir)/tools/ -I$(top_srcdir)/mpi/ -I$(top_builddir)/src -I$(top_srcdir)/src AM_LDFLAGS = @STARPU_EXPORT_DYNAMIC@ $(STARPU_COI_LDFLAGS) $(STARPU_SCIF_LDFLAGS) dist_bin_SCRIPTS = starpu_workers_activity \ starpu_codelet_histo_profile starpu_codelet_profile \ starpu_paje_draw_histogram starpu_paje_draw_histogram.R \ starpu_paje_state_stats $(am__append_5) $(am__append_9) dist_pkgdata_DATA = gdbinit $(am__append_6) $(am__append_8) pkgdata_perfmodels_sampling_busdir = $(datarootdir)/starpu/perfmodels/sampling/bus pkgdata_perfmodels_sampling_codeletsdir = $(datarootdir)/starpu/perfmodels/sampling/codelets/44 dist_pkgdata_perfmodels_sampling_bus_DATA = \ perfmodels/sampling/bus/attila.affinity \ perfmodels/sampling/bus/attila.bandwidth \ perfmodels/sampling/bus/attila.config \ perfmodels/sampling/bus/attila.latency \ perfmodels/sampling/bus/attila.platform.xml \ perfmodels/sampling/bus/attila.platform.v4.xml \ perfmodels/sampling/bus/idgraf.affinity \ perfmodels/sampling/bus/idgraf.bandwidth \ perfmodels/sampling/bus/idgraf.config \ perfmodels/sampling/bus/idgraf.latency \ perfmodels/sampling/bus/idgraf.platform.xml \ perfmodels/sampling/bus/idgraf.platform.v4.xml \ perfmodels/sampling/bus/mirage.affinity \ perfmodels/sampling/bus/mirage.bandwidth \ perfmodels/sampling/bus/mirage.config \ perfmodels/sampling/bus/mirage.latency \ perfmodels/sampling/bus/mirage.platform.xml \ perfmodels/sampling/bus/mirage.platform.v4.xml \ perfmodels/sampling/bus/sirocco.affinity \ perfmodels/sampling/bus/sirocco.bandwidth \ perfmodels/sampling/bus/sirocco.config \ perfmodels/sampling/bus/sirocco.latency \ perfmodels/sampling/bus/sirocco.platform.xml \ perfmodels/sampling/bus/sirocco.platform.v4.xml dist_pkgdata_perfmodels_sampling_codelets_DATA = \ perfmodels/sampling/codelets/44/chol_model_11.attila \ perfmodels/sampling/codelets/44/chol_model_21.attila \ perfmodels/sampling/codelets/44/chol_model_22.attila \ perfmodels/sampling/codelets/44/cl_update.attila \ perfmodels/sampling/codelets/44/save_cl_bottom.attila \ perfmodels/sampling/codelets/44/save_cl_top.attila \ perfmodels/sampling/codelets/44/starpu_sgemm_gemm.attila \ perfmodels/sampling/codelets/44/starpu_dgemm_gemm.attila \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_11.attila \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_12.attila \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_21.attila \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_22.attila \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_11.attila \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_12.attila \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_21.attila \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_22.attila \ perfmodels/sampling/codelets/44/overlap_sleep_1024_24.attila \ perfmodels/sampling/codelets/44/chol_model_11.idgraf \ perfmodels/sampling/codelets/44/chol_model_21.idgraf \ perfmodels/sampling/codelets/44/chol_model_22.idgraf \ perfmodels/sampling/codelets/44/cl_update.idgraf \ perfmodels/sampling/codelets/44/save_cl_bottom.idgraf \ perfmodels/sampling/codelets/44/save_cl_top.idgraf \ perfmodels/sampling/codelets/44/starpu_sgemm_gemm.idgraf \ perfmodels/sampling/codelets/44/starpu_dgemm_gemm.idgraf \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_11.idgraf \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_12.idgraf \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_21.idgraf \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_22.idgraf \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_11.idgraf \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_12.idgraf \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_21.idgraf \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_22.idgraf \ perfmodels/sampling/codelets/44/chol_model_11.mirage \ perfmodels/sampling/codelets/44/chol_model_21.mirage \ perfmodels/sampling/codelets/44/chol_model_22.mirage \ perfmodels/sampling/codelets/44/cl_update.mirage \ perfmodels/sampling/codelets/44/save_cl_bottom.mirage \ perfmodels/sampling/codelets/44/save_cl_top.mirage \ perfmodels/sampling/codelets/44/starpu_sgemm_gemm.mirage \ perfmodels/sampling/codelets/44/starpu_dgemm_gemm.mirage \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_11.mirage \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_12.mirage \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_21.mirage \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_22.mirage \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_11.mirage \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_12.mirage \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_21.mirage \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_22.mirage \ perfmodels/sampling/codelets/44/overlap_sleep_1024_24.mirage \ perfmodels/sampling/codelets/44/chol_model_11.sirocco \ perfmodels/sampling/codelets/44/chol_model_21.sirocco \ perfmodels/sampling/codelets/44/chol_model_22.sirocco \ perfmodels/sampling/codelets/44/cl_update.sirocco \ perfmodels/sampling/codelets/44/save_cl_bottom.sirocco \ perfmodels/sampling/codelets/44/save_cl_top.sirocco \ perfmodels/sampling/codelets/44/starpu_sgemm_gemm.sirocco \ perfmodels/sampling/codelets/44/starpu_dgemm_gemm.sirocco \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_11.sirocco \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_12.sirocco \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_21.sirocco \ perfmodels/sampling/codelets/44/starpu_slu_lu_model_22.sirocco \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_11.sirocco \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_12.sirocco \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_21.sirocco \ perfmodels/sampling/codelets/44/starpu_dlu_lu_model_22.sirocco \ perfmodels/sampling/codelets/44/overlap_sleep_1024_24.sirocco EXTRA_DIST = \ dev/checker/rename.sed \ dev/checker/rename.sh \ dev/cppcheck/suppressions.txt \ dev/valgrind/fxt.suppr \ dev/valgrind/hwloc.suppr \ dev/valgrind/libc.suppr \ dev/valgrind/libgomp.suppr \ dev/valgrind/libnuma.suppr \ dev/valgrind/madmpi.suppr \ dev/valgrind/opencl.suppr \ dev/valgrind/openmpi.suppr \ dev/valgrind/openmp.suppr \ dev/valgrind/padico.suppr \ dev/valgrind/pthread.suppr \ dev/valgrind/starpu.suppr \ dev/valgrind/valgrind.suppr \ dev/valgrind/valgrind.sh \ dev/valgrind/valgrind_xml.sh \ dev/valgrind/helgrind.sh \ dev/tsan/starpu.suppr \ dev/lsan/libc.suppr \ dev/lsan/openmpi.suppr \ perfmodels/README \ msvc/starpu_clean.bat \ msvc/starpu_open.bat \ msvc/starpu_exec.bat \ msvc/starpu_var.bat \ msvc/starpu.sln \ msvc/starpu/starpu.vcxproj CLEANFILES = *.gcno *.gcda *.linkinfo starpu_idle_microsec.log ##################################### # What to install and what to check # ##################################### STARPU_TOOLS = $(am__append_2) $(am__append_3) starpu_machine_display \ starpu_sched_display $(am__append_4) @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@LOADER = loader @STARPU_CROSS_COMPILING_TRUE@@STARPU_HAVE_WINDOWS_FALSE@LOADER = @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@loader_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -I$(top_builddir)/src/ @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@LOADER_BIN = $(abs_top_builddir)/tools/$(LOADER) @STARPU_CROSS_COMPILING_TRUE@@STARPU_HAVE_WINDOWS_FALSE@LOADER_BIN = $(top_builddir)/tests/loader-cross.sh @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@loader_SOURCES = ../tests/loader.c @STARPU_HAVE_AM111_FALSE@@STARPU_HAVE_WINDOWS_FALSE@TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(LOADER_BIN) @STARPU_HAVE_AM111_TRUE@@STARPU_HAVE_WINDOWS_FALSE@TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" @STARPU_HAVE_AM111_TRUE@@STARPU_HAVE_WINDOWS_FALSE@LOG_COMPILER = $(LOADER_BIN) @STARPU_USE_FXT_TRUE@starpu_fxt_tool_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) $(FXT_CFLAGS) @STARPU_USE_FXT_TRUE@starpu_fxt_tool_LDADD = $(FXT_LIBS) @STARPU_USE_FXT_TRUE@starpu_fxt_tool_LDFLAGS = $(FXT_LDFLAGS) @STARPU_USE_FXT_TRUE@starpu_fxt_stats_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) $(FXT_CFLAGS) @STARPU_USE_FXT_TRUE@starpu_fxt_stats_LDADD = $(FXT_LIBS) @STARPU_USE_FXT_TRUE@starpu_fxt_stats_LDFLAGS = $(FXT_LDFLAGS) @STARPU_USE_FXT_TRUE@starpu_fxt_data_trace_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) $(FXT_CFLAGS) @STARPU_USE_FXT_TRUE@starpu_fxt_data_trace_LDADD = $(FXT_LIBS) @STARPU_USE_FXT_TRUE@starpu_fxt_data_trace_LDFLAGS = $(FXT_LDFLAGS) starpu_perfmodel_plot_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) $(FXT_CFLAGS) @STARPU_HAVE_WINDOWS_TRUE@STARPU_MSVC_dir = $(bindir) @STARPU_HAVE_WINDOWS_TRUE@nobase_STARPU_MSVC__DATA = \ @STARPU_HAVE_WINDOWS_TRUE@ msvc/starpu_clean.bat \ @STARPU_HAVE_WINDOWS_TRUE@ msvc/starpu_open.bat \ @STARPU_HAVE_WINDOWS_TRUE@ msvc/starpu_exec.bat \ @STARPU_HAVE_WINDOWS_TRUE@ msvc/starpu_var.bat \ @STARPU_HAVE_WINDOWS_TRUE@ msvc/starpu.sln \ @STARPU_HAVE_WINDOWS_TRUE@ msvc/starpu/starpu.vcxproj @STARPU_HAVE_HELP2MAN_TRUE@dist_man1_MANS = starpu_calibrate_bus.1 \ @STARPU_HAVE_HELP2MAN_TRUE@ starpu_machine_display.1 \ @STARPU_HAVE_HELP2MAN_TRUE@ starpu_perfmodel_display.1 \ @STARPU_HAVE_HELP2MAN_TRUE@ starpu_perfmodel_plot.1 \ @STARPU_HAVE_HELP2MAN_TRUE@ starpu_tasks_rec_complete.1 \ @STARPU_HAVE_HELP2MAN_TRUE@ starpu_lp2paje.1 \ @STARPU_HAVE_HELP2MAN_TRUE@ starpu_workers_activity.1 \ @STARPU_HAVE_HELP2MAN_TRUE@ starpu_codelet_profile.1 \ @STARPU_HAVE_HELP2MAN_TRUE@ starpu_codelet_histo_profile.1 \ @STARPU_HAVE_HELP2MAN_TRUE@ starpu_paje_draw_histogram.1 \ @STARPU_HAVE_HELP2MAN_TRUE@ starpu_paje_state_stats.1 \ @STARPU_HAVE_HELP2MAN_TRUE@ $(am__append_7) all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/starpu.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tools/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tools/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/starpu.mk $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): starpu_codelet_profile: $(top_builddir)/config.status $(srcdir)/starpu_codelet_profile.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ starpu_codelet_histo_profile: $(top_builddir)/config.status $(srcdir)/starpu_codelet_histo_profile.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ starpu_workers_activity: $(top_builddir)/config.status $(srcdir)/starpu_workers_activity.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ starpu_paje_draw_histogram: $(top_builddir)/config.status $(srcdir)/starpu_paje_draw_histogram.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ starpu_paje_state_stats: $(top_builddir)/config.status $(srcdir)/starpu_paje_state_stats.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ starpu_paje_summary: $(top_builddir)/config.status $(srcdir)/starpu_paje_summary.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ starpu_paje_sort: $(top_builddir)/config.status $(srcdir)/starpu_paje_sort.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ starpu_smpirun: $(top_builddir)/config.status $(srcdir)/starpu_smpirun.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list loader$(EXEEXT): $(loader_OBJECTS) $(loader_DEPENDENCIES) $(EXTRA_loader_DEPENDENCIES) @rm -f loader$(EXEEXT) $(AM_V_CCLD)$(LINK) $(loader_OBJECTS) $(loader_LDADD) $(LIBS) starpu_calibrate_bus$(EXEEXT): $(starpu_calibrate_bus_OBJECTS) $(starpu_calibrate_bus_DEPENDENCIES) $(EXTRA_starpu_calibrate_bus_DEPENDENCIES) @rm -f starpu_calibrate_bus$(EXEEXT) $(AM_V_CCLD)$(LINK) $(starpu_calibrate_bus_OBJECTS) $(starpu_calibrate_bus_LDADD) $(LIBS) starpu_fxt_data_trace$(EXEEXT): $(starpu_fxt_data_trace_OBJECTS) $(starpu_fxt_data_trace_DEPENDENCIES) $(EXTRA_starpu_fxt_data_trace_DEPENDENCIES) @rm -f starpu_fxt_data_trace$(EXEEXT) $(AM_V_CCLD)$(starpu_fxt_data_trace_LINK) $(starpu_fxt_data_trace_OBJECTS) $(starpu_fxt_data_trace_LDADD) $(LIBS) starpu_fxt_stats$(EXEEXT): $(starpu_fxt_stats_OBJECTS) $(starpu_fxt_stats_DEPENDENCIES) $(EXTRA_starpu_fxt_stats_DEPENDENCIES) @rm -f starpu_fxt_stats$(EXEEXT) $(AM_V_CCLD)$(starpu_fxt_stats_LINK) $(starpu_fxt_stats_OBJECTS) $(starpu_fxt_stats_LDADD) $(LIBS) starpu_fxt_tool$(EXEEXT): $(starpu_fxt_tool_OBJECTS) $(starpu_fxt_tool_DEPENDENCIES) $(EXTRA_starpu_fxt_tool_DEPENDENCIES) @rm -f starpu_fxt_tool$(EXEEXT) $(AM_V_CCLD)$(starpu_fxt_tool_LINK) $(starpu_fxt_tool_OBJECTS) $(starpu_fxt_tool_LDADD) $(LIBS) starpu_lp2paje$(EXEEXT): $(starpu_lp2paje_OBJECTS) $(starpu_lp2paje_DEPENDENCIES) $(EXTRA_starpu_lp2paje_DEPENDENCIES) @rm -f starpu_lp2paje$(EXEEXT) $(AM_V_CCLD)$(LINK) $(starpu_lp2paje_OBJECTS) $(starpu_lp2paje_LDADD) $(LIBS) starpu_machine_display$(EXEEXT): $(starpu_machine_display_OBJECTS) $(starpu_machine_display_DEPENDENCIES) $(EXTRA_starpu_machine_display_DEPENDENCIES) @rm -f starpu_machine_display$(EXEEXT) $(AM_V_CCLD)$(LINK) $(starpu_machine_display_OBJECTS) $(starpu_machine_display_LDADD) $(LIBS) starpu_perfmodel_display$(EXEEXT): $(starpu_perfmodel_display_OBJECTS) $(starpu_perfmodel_display_DEPENDENCIES) $(EXTRA_starpu_perfmodel_display_DEPENDENCIES) @rm -f starpu_perfmodel_display$(EXEEXT) $(AM_V_CCLD)$(LINK) $(starpu_perfmodel_display_OBJECTS) $(starpu_perfmodel_display_LDADD) $(LIBS) starpu_perfmodel_plot$(EXEEXT): $(starpu_perfmodel_plot_OBJECTS) $(starpu_perfmodel_plot_DEPENDENCIES) $(EXTRA_starpu_perfmodel_plot_DEPENDENCIES) @rm -f starpu_perfmodel_plot$(EXEEXT) $(AM_V_CCLD)$(LINK) $(starpu_perfmodel_plot_OBJECTS) $(starpu_perfmodel_plot_LDADD) $(LIBS) starpu_sched_display$(EXEEXT): $(starpu_sched_display_OBJECTS) $(starpu_sched_display_DEPENDENCIES) $(EXTRA_starpu_sched_display_DEPENDENCIES) @rm -f starpu_sched_display$(EXEEXT) $(AM_V_CCLD)$(LINK) $(starpu_sched_display_OBJECTS) $(starpu_sched_display_LDADD) $(LIBS) starpu_tasks_rec_complete$(EXEEXT): $(starpu_tasks_rec_complete_OBJECTS) $(starpu_tasks_rec_complete_DEPENDENCIES) $(EXTRA_starpu_tasks_rec_complete_DEPENDENCIES) @rm -f starpu_tasks_rec_complete$(EXEEXT) $(AM_V_CCLD)$(LINK) $(starpu_tasks_rec_complete_OBJECTS) $(starpu_tasks_rec_complete_LDADD) $(LIBS) install-dist_binSCRIPTS: $(dist_bin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(dist_bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-dist_binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(dist_bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loader-loader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_calibrate_bus.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_fxt_data_trace-starpu_fxt_data_trace.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_fxt_stats-starpu_fxt_stats.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_fxt_tool-starpu_fxt_tool.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_lp2paje.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_machine_display.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_perfmodel_display.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_perfmodel_plot-starpu_perfmodel_plot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_sched_display.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_tasks_rec_complete.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< loader-loader.o: ../tests/loader.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT loader-loader.o -MD -MP -MF $(DEPDIR)/loader-loader.Tpo -c -o loader-loader.o `test -f '../tests/loader.c' || echo '$(srcdir)/'`../tests/loader.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/loader-loader.Tpo $(DEPDIR)/loader-loader.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../tests/loader.c' object='loader-loader.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o loader-loader.o `test -f '../tests/loader.c' || echo '$(srcdir)/'`../tests/loader.c loader-loader.obj: ../tests/loader.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT loader-loader.obj -MD -MP -MF $(DEPDIR)/loader-loader.Tpo -c -o loader-loader.obj `if test -f '../tests/loader.c'; then $(CYGPATH_W) '../tests/loader.c'; else $(CYGPATH_W) '$(srcdir)/../tests/loader.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/loader-loader.Tpo $(DEPDIR)/loader-loader.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../tests/loader.c' object='loader-loader.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loader_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o loader-loader.obj `if test -f '../tests/loader.c'; then $(CYGPATH_W) '../tests/loader.c'; else $(CYGPATH_W) '$(srcdir)/../tests/loader.c'; fi` starpu_fxt_data_trace-starpu_fxt_data_trace.o: starpu_fxt_data_trace.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(starpu_fxt_data_trace_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_fxt_data_trace-starpu_fxt_data_trace.o -MD -MP -MF $(DEPDIR)/starpu_fxt_data_trace-starpu_fxt_data_trace.Tpo -c -o starpu_fxt_data_trace-starpu_fxt_data_trace.o `test -f 'starpu_fxt_data_trace.c' || echo '$(srcdir)/'`starpu_fxt_data_trace.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_fxt_data_trace-starpu_fxt_data_trace.Tpo $(DEPDIR)/starpu_fxt_data_trace-starpu_fxt_data_trace.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='starpu_fxt_data_trace.c' object='starpu_fxt_data_trace-starpu_fxt_data_trace.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(starpu_fxt_data_trace_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_fxt_data_trace-starpu_fxt_data_trace.o `test -f 'starpu_fxt_data_trace.c' || echo '$(srcdir)/'`starpu_fxt_data_trace.c starpu_fxt_data_trace-starpu_fxt_data_trace.obj: starpu_fxt_data_trace.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(starpu_fxt_data_trace_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_fxt_data_trace-starpu_fxt_data_trace.obj -MD -MP -MF $(DEPDIR)/starpu_fxt_data_trace-starpu_fxt_data_trace.Tpo -c -o starpu_fxt_data_trace-starpu_fxt_data_trace.obj `if test -f 'starpu_fxt_data_trace.c'; then $(CYGPATH_W) 'starpu_fxt_data_trace.c'; else $(CYGPATH_W) '$(srcdir)/starpu_fxt_data_trace.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_fxt_data_trace-starpu_fxt_data_trace.Tpo $(DEPDIR)/starpu_fxt_data_trace-starpu_fxt_data_trace.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='starpu_fxt_data_trace.c' object='starpu_fxt_data_trace-starpu_fxt_data_trace.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(starpu_fxt_data_trace_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_fxt_data_trace-starpu_fxt_data_trace.obj `if test -f 'starpu_fxt_data_trace.c'; then $(CYGPATH_W) 'starpu_fxt_data_trace.c'; else $(CYGPATH_W) '$(srcdir)/starpu_fxt_data_trace.c'; fi` starpu_fxt_stats-starpu_fxt_stats.o: starpu_fxt_stats.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(starpu_fxt_stats_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_fxt_stats-starpu_fxt_stats.o -MD -MP -MF $(DEPDIR)/starpu_fxt_stats-starpu_fxt_stats.Tpo -c -o starpu_fxt_stats-starpu_fxt_stats.o `test -f 'starpu_fxt_stats.c' || echo '$(srcdir)/'`starpu_fxt_stats.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_fxt_stats-starpu_fxt_stats.Tpo $(DEPDIR)/starpu_fxt_stats-starpu_fxt_stats.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='starpu_fxt_stats.c' object='starpu_fxt_stats-starpu_fxt_stats.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(starpu_fxt_stats_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_fxt_stats-starpu_fxt_stats.o `test -f 'starpu_fxt_stats.c' || echo '$(srcdir)/'`starpu_fxt_stats.c starpu_fxt_stats-starpu_fxt_stats.obj: starpu_fxt_stats.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(starpu_fxt_stats_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_fxt_stats-starpu_fxt_stats.obj -MD -MP -MF $(DEPDIR)/starpu_fxt_stats-starpu_fxt_stats.Tpo -c -o starpu_fxt_stats-starpu_fxt_stats.obj `if test -f 'starpu_fxt_stats.c'; then $(CYGPATH_W) 'starpu_fxt_stats.c'; else $(CYGPATH_W) '$(srcdir)/starpu_fxt_stats.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_fxt_stats-starpu_fxt_stats.Tpo $(DEPDIR)/starpu_fxt_stats-starpu_fxt_stats.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='starpu_fxt_stats.c' object='starpu_fxt_stats-starpu_fxt_stats.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(starpu_fxt_stats_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_fxt_stats-starpu_fxt_stats.obj `if test -f 'starpu_fxt_stats.c'; then $(CYGPATH_W) 'starpu_fxt_stats.c'; else $(CYGPATH_W) '$(srcdir)/starpu_fxt_stats.c'; fi` starpu_fxt_tool-starpu_fxt_tool.o: starpu_fxt_tool.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(starpu_fxt_tool_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_fxt_tool-starpu_fxt_tool.o -MD -MP -MF $(DEPDIR)/starpu_fxt_tool-starpu_fxt_tool.Tpo -c -o starpu_fxt_tool-starpu_fxt_tool.o `test -f 'starpu_fxt_tool.c' || echo '$(srcdir)/'`starpu_fxt_tool.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_fxt_tool-starpu_fxt_tool.Tpo $(DEPDIR)/starpu_fxt_tool-starpu_fxt_tool.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='starpu_fxt_tool.c' object='starpu_fxt_tool-starpu_fxt_tool.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(starpu_fxt_tool_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_fxt_tool-starpu_fxt_tool.o `test -f 'starpu_fxt_tool.c' || echo '$(srcdir)/'`starpu_fxt_tool.c starpu_fxt_tool-starpu_fxt_tool.obj: starpu_fxt_tool.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(starpu_fxt_tool_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_fxt_tool-starpu_fxt_tool.obj -MD -MP -MF $(DEPDIR)/starpu_fxt_tool-starpu_fxt_tool.Tpo -c -o starpu_fxt_tool-starpu_fxt_tool.obj `if test -f 'starpu_fxt_tool.c'; then $(CYGPATH_W) 'starpu_fxt_tool.c'; else $(CYGPATH_W) '$(srcdir)/starpu_fxt_tool.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_fxt_tool-starpu_fxt_tool.Tpo $(DEPDIR)/starpu_fxt_tool-starpu_fxt_tool.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='starpu_fxt_tool.c' object='starpu_fxt_tool-starpu_fxt_tool.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(starpu_fxt_tool_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_fxt_tool-starpu_fxt_tool.obj `if test -f 'starpu_fxt_tool.c'; then $(CYGPATH_W) 'starpu_fxt_tool.c'; else $(CYGPATH_W) '$(srcdir)/starpu_fxt_tool.c'; fi` starpu_perfmodel_plot-starpu_perfmodel_plot.o: starpu_perfmodel_plot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(starpu_perfmodel_plot_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_perfmodel_plot-starpu_perfmodel_plot.o -MD -MP -MF $(DEPDIR)/starpu_perfmodel_plot-starpu_perfmodel_plot.Tpo -c -o starpu_perfmodel_plot-starpu_perfmodel_plot.o `test -f 'starpu_perfmodel_plot.c' || echo '$(srcdir)/'`starpu_perfmodel_plot.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_perfmodel_plot-starpu_perfmodel_plot.Tpo $(DEPDIR)/starpu_perfmodel_plot-starpu_perfmodel_plot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='starpu_perfmodel_plot.c' object='starpu_perfmodel_plot-starpu_perfmodel_plot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(starpu_perfmodel_plot_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_perfmodel_plot-starpu_perfmodel_plot.o `test -f 'starpu_perfmodel_plot.c' || echo '$(srcdir)/'`starpu_perfmodel_plot.c starpu_perfmodel_plot-starpu_perfmodel_plot.obj: starpu_perfmodel_plot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(starpu_perfmodel_plot_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_perfmodel_plot-starpu_perfmodel_plot.obj -MD -MP -MF $(DEPDIR)/starpu_perfmodel_plot-starpu_perfmodel_plot.Tpo -c -o starpu_perfmodel_plot-starpu_perfmodel_plot.obj `if test -f 'starpu_perfmodel_plot.c'; then $(CYGPATH_W) 'starpu_perfmodel_plot.c'; else $(CYGPATH_W) '$(srcdir)/starpu_perfmodel_plot.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_perfmodel_plot-starpu_perfmodel_plot.Tpo $(DEPDIR)/starpu_perfmodel_plot-starpu_perfmodel_plot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='starpu_perfmodel_plot.c' object='starpu_perfmodel_plot-starpu_perfmodel_plot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(starpu_perfmodel_plot_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_perfmodel_plot-starpu_perfmodel_plot.obj `if test -f 'starpu_perfmodel_plot.c'; then $(CYGPATH_W) 'starpu_perfmodel_plot.c'; else $(CYGPATH_W) '$(srcdir)/starpu_perfmodel_plot.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(dist_man1_MANS) @$(NORMAL_INSTALL) @list1='$(dist_man1_MANS)'; \ list2=''; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(dist_man1_MANS)'; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-dist_pkgdataDATA: $(dist_pkgdata_DATA) @$(NORMAL_INSTALL) @list='$(dist_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \ done uninstall-dist_pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(dist_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir) install-dist_pkgdata_perfmodels_sampling_busDATA: $(dist_pkgdata_perfmodels_sampling_bus_DATA) @$(NORMAL_INSTALL) @list='$(dist_pkgdata_perfmodels_sampling_bus_DATA)'; test -n "$(pkgdata_perfmodels_sampling_busdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdata_perfmodels_sampling_busdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgdata_perfmodels_sampling_busdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdata_perfmodels_sampling_busdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdata_perfmodels_sampling_busdir)" || exit $$?; \ done uninstall-dist_pkgdata_perfmodels_sampling_busDATA: @$(NORMAL_UNINSTALL) @list='$(dist_pkgdata_perfmodels_sampling_bus_DATA)'; test -n "$(pkgdata_perfmodels_sampling_busdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgdata_perfmodels_sampling_busdir)'; $(am__uninstall_files_from_dir) install-dist_pkgdata_perfmodels_sampling_codeletsDATA: $(dist_pkgdata_perfmodels_sampling_codelets_DATA) @$(NORMAL_INSTALL) @list='$(dist_pkgdata_perfmodels_sampling_codelets_DATA)'; test -n "$(pkgdata_perfmodels_sampling_codeletsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdata_perfmodels_sampling_codeletsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgdata_perfmodels_sampling_codeletsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdata_perfmodels_sampling_codeletsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdata_perfmodels_sampling_codeletsdir)" || exit $$?; \ done uninstall-dist_pkgdata_perfmodels_sampling_codeletsDATA: @$(NORMAL_UNINSTALL) @list='$(dist_pkgdata_perfmodels_sampling_codelets_DATA)'; test -n "$(pkgdata_perfmodels_sampling_codeletsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgdata_perfmodels_sampling_codeletsdir)'; $(am__uninstall_files_from_dir) install-nobase_STARPU_MSVC_DATA: $(nobase_STARPU_MSVC__DATA) @$(NORMAL_INSTALL) @list='$(nobase_STARPU_MSVC__DATA)'; test -n "$(STARPU_MSVC_dir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(STARPU_MSVC_dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(STARPU_MSVC_dir)" || exit 1; \ fi; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ echo " $(MKDIR_P) '$(DESTDIR)$(STARPU_MSVC_dir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(STARPU_MSVC_dir)/$$dir"; }; \ echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(STARPU_MSVC_dir)/$$dir'"; \ $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(STARPU_MSVC_dir)/$$dir" || exit $$?; }; \ done uninstall-nobase_STARPU_MSVC_DATA: @$(NORMAL_UNINSTALL) @list='$(nobase_STARPU_MSVC__DATA)'; test -n "$(STARPU_MSVC_dir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ dir='$(DESTDIR)$(STARPU_MSVC_dir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? starpu_fxt_tool.log: starpu_fxt_tool$(EXEEXT) @p='starpu_fxt_tool$(EXEEXT)'; \ b='starpu_fxt_tool'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) starpu_fxt_stats.log: starpu_fxt_stats$(EXEEXT) @p='starpu_fxt_stats$(EXEEXT)'; \ b='starpu_fxt_stats'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) starpu_fxt_data_trace.log: starpu_fxt_data_trace$(EXEEXT) @p='starpu_fxt_data_trace$(EXEEXT)'; \ b='starpu_fxt_data_trace'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) starpu_calibrate_bus.log: starpu_calibrate_bus$(EXEEXT) @p='starpu_calibrate_bus$(EXEEXT)'; \ b='starpu_calibrate_bus'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) starpu_machine_display.log: starpu_machine_display$(EXEEXT) @p='starpu_machine_display$(EXEEXT)'; \ b='starpu_machine_display'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) starpu_sched_display.log: starpu_sched_display$(EXEEXT) @p='starpu_sched_display$(EXEEXT)'; \ b='starpu_sched_display'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) starpu_perfmodel_display.log: starpu_perfmodel_display$(EXEEXT) @p='starpu_perfmodel_display$(EXEEXT)'; \ b='starpu_perfmodel_display'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) starpu_perfmodel_plot.log: starpu_perfmodel_plot$(EXEEXT) @p='starpu_perfmodel_plot$(EXEEXT)'; \ b='starpu_perfmodel_plot'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-recursive all-am: Makefile $(PROGRAMS) $(SCRIPTS) $(MANS) $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(pkgdata_perfmodels_sampling_busdir)" "$(DESTDIR)$(pkgdata_perfmodels_sampling_codeletsdir)" "$(DESTDIR)$(STARPU_MSVC_dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." @STARPU_HAVE_HELP2MAN_FALSE@clean-local: clean: clean-recursive clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ clean-libtool clean-local mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dist_pkgdataDATA \ install-dist_pkgdata_perfmodels_sampling_busDATA \ install-dist_pkgdata_perfmodels_sampling_codeletsDATA \ install-man install-nobase_STARPU_MSVC_DATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-dist_binSCRIPTS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-man1 install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-dist_binSCRIPTS \ uninstall-dist_pkgdataDATA \ uninstall-dist_pkgdata_perfmodels_sampling_busDATA \ uninstall-dist_pkgdata_perfmodels_sampling_codeletsDATA \ uninstall-man uninstall-nobase_STARPU_MSVC_DATA uninstall-man: uninstall-man1 .MAKE: $(am__recursive_targets) check-am install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-TESTS check-am clean clean-binPROGRAMS \ clean-checkPROGRAMS clean-generic clean-libtool clean-local \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am \ install-dist_binSCRIPTS install-dist_pkgdataDATA \ install-dist_pkgdata_perfmodels_sampling_busDATA \ install-dist_pkgdata_perfmodels_sampling_codeletsDATA \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-man1 install-nobase_STARPU_MSVC_DATA \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \ uninstall uninstall-am uninstall-binPROGRAMS \ uninstall-dist_binSCRIPTS uninstall-dist_pkgdataDATA \ uninstall-dist_pkgdata_perfmodels_sampling_busDATA \ uninstall-dist_pkgdata_perfmodels_sampling_codeletsDATA \ uninstall-man uninstall-man1 uninstall-nobase_STARPU_MSVC_DATA .PRECIOUS: Makefile showcheck: -cat $(TEST_LOGS) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -q " runtime error: " $(TEST_LOGS) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET @STARPU_SIMGRID_TRUE@export STARPU_PERF_MODEL_DIR @STARPU_SIMGRID_TRUE@export STARPU_HOSTNAME @STARPU_SIMGRID_TRUE@export MALLOC_PERTURB_ @STARPU_HAVE_HELP2MAN_TRUE@starpu_calibrate_bus.1: starpu_calibrate_bus$(EXEEXT) @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_machine_display.1: starpu_machine_display$(EXEEXT) @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_perfmodel_display.1: starpu_perfmodel_display$(EXEEXT) @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_perfmodel_plot.1: starpu_perfmodel_plot$(EXEEXT) @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_tasks_rec_complete.1: starpu_tasks_rec_complete$(EXEEXT) @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_lp2paje.1: starpu_lp2paje$(EXEEXT) @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_workers_activity.1: starpu_workers_activity @STARPU_HAVE_HELP2MAN_TRUE@ chmod +x $< @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_codelet_profile.1: starpu_codelet_profile @STARPU_HAVE_HELP2MAN_TRUE@ chmod +x $< @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_codelet_histo_profile.1: starpu_codelet_histo_profile @STARPU_HAVE_HELP2MAN_TRUE@ chmod +x $< @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_paje_draw_histogram.1: starpu_paje_draw_histogram @STARPU_HAVE_HELP2MAN_TRUE@ chmod +x $< @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_paje_state_stats.1: starpu_paje_state_stats @STARPU_HAVE_HELP2MAN_TRUE@ chmod +x $< @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@@STARPU_USE_FXT_TRUE@starpu_fxt_tool.1: starpu_fxt_tool$(EXEEXT) @STARPU_HAVE_HELP2MAN_TRUE@@STARPU_USE_FXT_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@@STARPU_USE_FXT_TRUE@starpu_fxt_stats.1: starpu_fxt_stats$(EXEEXT) @STARPU_HAVE_HELP2MAN_TRUE@@STARPU_USE_FXT_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@@STARPU_USE_FXT_TRUE@starpu_fxt_data_trace.1: starpu_fxt_data_trace$(EXEEXT) @STARPU_HAVE_HELP2MAN_TRUE@@STARPU_USE_FXT_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@clean-local: @STARPU_HAVE_HELP2MAN_TRUE@ $(RM) $(dist_man1_MANS) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.2.3+dfsg/tools/ayudame.cfg000066400000000000000000000007731320135501600172230ustar00rootroot00000000000000# default configuration file for Ayudame2 connect { stdout_human = "true"; stdout_raw = "false"; temanejo1 = "false"; temanejo = "true"; dot = "false"; dot_filename = "ayudame.dot"; xml = "true"; xml_filename = "ayudame.xml"; ayu_port = "8888"; ayu_host = "localhost"; } logging { error = "true"; warning = "true"; info = "true"; verbosity_level = "3"; debug = "true"; } starpu-1.2.3+dfsg/tools/dev/000077500000000000000000000000001320135501600156645ustar00rootroot00000000000000starpu-1.2.3+dfsg/tools/dev/checker/000077500000000000000000000000001320135501600172705ustar00rootroot00000000000000starpu-1.2.3+dfsg/tools/dev/checker/rename.sed000066400000000000000000000241651320135501600212440ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. s/\bstruct starpu_per_arch_perfmodel\b/struct starpu_perfmodel_per_arch/g s/\bstruct starpu_regression_model\b/struct starpu_perfmodel_regression_model/g s/\bstruct starpu_history_table\b/struct starpu_perfmodel_history_table/g s/\bstruct starpu_history_entry\b/struct starpu_perfmodel_history_entry/g s/\bstruct starpu_history_list\b/struct starpu_perfmodel_history_list/g s/\bstarpu_list_models\b/starpu_perfmodel_list/g s/\bstruct starpu_model_list\b/struct _starpu_perfmodel_list/g s/\bstarpu_load_history_debug\b/starpu_perfmodel_load_symbol/g s/\bstarpu_access_mode\b/enum starpu_access_mode/g s/\bstruct starpu_codelet_t\b/struct starpu_codelet/g s/\bstarpu_codelet\b/struct starpu_codelet/g s/\bstarpu_codelet_t\b/struct starpu_codelet/g s/\bstarpu_data_handle\b/starpu_data_handle_t/g s/\bstarpu_block_interface_t\b/struct starpu_block_interface/g s/\bstarpu_matrix_interface_t\b/struct starpu_matrix_interface/g s/\bstarpu_vector_interface_t\b/struct starpu_vector_interface/g s/\bstarpu_variable_interface_t\b/struct starpu_variable_interface/g s/\bstarpu_csr_interface_t\b/struct starpu_csr_interface/g s/\bstarpu_bcsr_interface_t\b/struct starpu_bcsr_interface/g s/\bstarpu_multiformat_interface_t\b/struct starpu_multiformat_interface/g s/\bstarpu_machine_topology_s\b/starpu_machine_topology/g s/\bstarpu_htbl32_node_s\b/starpu_htbl32_node/g s/\bstarpu_history_list_t\b/starpu_history_list/g s/\bstarpu_buffer_descr_t\b/starpu_buffer_descr/g s/\bstarpu_history_entry_t\b/starpu_history_entry/g s/\bstarpu_history_list_t\b/starpu_history_list/g s/\bstarpu_model_list_t\b/starpu_model_list/g s/\bstarpu_regression_model_t\b/starpu_regression_model/g s/\bstarpu_per_arch_perfmodel_t\b/starpu_per_arch_perfmodel/g #s/\bstarpu_buffer_descr\b/struct starpu_buffer_descr/g s/\bstarpu_perfmodel_t\b/starpu_perfmodel/g s/\bstarpu_sched_policy_s\b/starpu_sched_policy/g s/\bstarpu_data_interface_ops_t\b/starpu_data_interface_ops/g s/\bstarpu_submit_task\b/starpu_task_submit/g s/\bstarpu_wait_task\b/starpu_task_wait/g s/\bstarpu_helper_init_cublas\b/starpu_helper_cublas_init/g s/\bstarpu_helper_shutdown_cublas\b/starpu_helper_cublas_shutdown/g s/\bstarpu_deregister_progression_hook\b/starpu_progression_hook_deregister/g s/\bstarpu_register_progression_hook\b/starpu_progression_hook_register/g s/\bstarpu_get_worker_id\b/starpu_worker_get_id/g s/\bstarpu_get_worker_devid\b/starpu_worker_get_devid/g s/\bstarpu_get_worker_memory_node\b/starpu_worker_get_memory_node/g s/\bstarpu_get_worker_name\b/starpu_worker_get_name/g s/\bstarpu_get_worker_type\b/starpu_worker_get_type/g s/\bstarpu_get_worker_count\b/starpu_worker_get_count/g s/\bstarpu_get_cpu_worker_count\b/starpu_cpu_worker_get_count/g s/\bstarpu_get_spu_worker_count\b/starpu_spu_worker_get_count/g s/\bstarpu_get_opencl_worker_count\b/starpu_opencl_worker_get_count/g s/\bstarpu_get_cuda_worker_count\b/starpu_cuda_worker_get_count/g s/\bstarpu_get_local_cuda_stream\b/starpu_cuda_get_local_stream/g s/\bstarpu_wait_all_tasks\b/starpu_task_wait_for_all/g s/\bstarpu_delete_data\b/starpu_data_unregister/g s/\bstarpu_malloc_pinned_if_possible\b/starpu_data_malloc_pinned_if_possible/g s/\bstarpu_free_pinned_if_possible\b/starpu_data_free_pinned_if_possible/g s/\bstarpu_sync_data_with_mem\b/starpu_data_acquire/g s/\bstarpu_data_sync_with_mem\b/starpu_data_acquire/g s/\bstarpu_sync_data_with_mem_non_blocking\b/starpu_data_acquire_cb/g s/\bstarpu_data_sync_with_mem_non_blocking\b/starpu_data_acquire_cb/g s/\bstarpu_release_data_from_mem\b/starpu_data_release/g s/\bstarpu_data_release_from_mem\b/starpu_data_release/g s/\bstarpu_advise_if_data_is_important\b/starpu_data_advise_as_important/g s/\bstarpu_request_data_allocation\b/starpu_data_request_allocation/g s/\bstarpu_prefetch_data_on_node\b/starpu_data_prefetch_on_node/g s/\bstarpu_get_sub_data\b/starpu_data_get_sub_data/g s/\bstarpu_partition_data\b/starpu_data_partition/g s/\bstarpu_unpartition_data\b/starpu_data_unpartition/g s/\bstarpu_map_filters\b/starpu_data_map_filters/g s/\bstarpu_test_if_data_is_allocated_on_node\b/starpu_data_test_if_allocated_on_node/g s/\bstarpu_get_block_elemsize\b/starpu_block_get_elemsize/g s/\bstarpu_get_block_local_ldy\b/starpu_block_get_local_ldy/g s/\bstarpu_get_block_local_ldz\b/starpu_block_get_local_ldz/g s/\bstarpu_get_block_local_ptr\b/starpu_block_get_local_ptr/g s/\bstarpu_get_block_nx\b/starpu_block_get_nx/g s/\bstarpu_get_block_ny\b/starpu_block_get_ny/g s/\bstarpu_get_block_nz\b/starpu_block_get_nz/g s/\bstarpu_register_block_data\b/starpu_block_data_register/g s/\bstarpu_get_bcsr_c\b/starpu_bcsr_get_c/g s/\bstarpu_get_bcsr_elemsize\b/starpu_bcsr_get_elemsize/g s/\bstarpu_get_bcsr_firstentry\b/starpu_bcsr_get_firstentry/g s/\bstarpu_get_bcsr_local_colind\b/starpu_bcsr_get_local_colind/g s/\bstarpu_get_bcsr_local_nzval\b/starpu_bcsr_get_local_nzval/g s/\bstarpu_get_bcsr_local_rowptr\b/starpu_bcsr_get_local_rowptr/g s/\bstarpu_get_bcsr_nnz\b/starpu_bcsr_get_nnz/g s/\bstarpu_get_bcsr_nrow\b/starpu_bcsr_get_nrow/g s/\bstarpu_get_bcsr_r\b/starpu_bcsr_get_r/g s/\bstarpu_register_bcsr_data\b/starpu_bcsr_data_register/g s/\bstarpu_get_csr_elemsize\b/starpu_csr_get_elemsize/g s/\bstarpu_get_csr_firstentry\b/starpu_csr_get_firstentry/g s/\bstarpu_get_csr_local_colind\b/starpu_csr_get_local_colind/g s/\bstarpu_get_csr_local_nzval\b/starpu_csr_get_local_nzval/g s/\bstarpu_get_csr_local_rowptr\b/starpu_csr_get_local_rowptr/g s/\bstarpu_get_csr_nnz\b/starpu_csr_get_nnz/g s/\bstarpu_get_csr_nrow\b/starpu_csr_get_nrow/g s/\bstarpu_register_csr_data\b/starpu_csr_data_register/g s/\bstarpu_get_matrix_elemsize\b/starpu_matrix_get_elemsize/g s/\bstarpu_get_matrix_local_ld\b/starpu_matrix_get_local_ld/g s/\bstarpu_get_matrix_local_ptr\b/starpu_matrix_get_local_ptr/g s/\bstarpu_get_matrix_nx\b/starpu_matrix_get_nx/g s/\bstarpu_get_matrix_ny\b/starpu_matrix_get_ny/g s/\bstarpu_register_matrix_data\b/starpu_matrix_data_register/g s/\bstarpu_divide_in_2_filter_func_vector\b/starpu_vector_divide_in_2_filter_func/g s/\bstarpu_register_vector_data\b/starpu_vector_data_register/g s/\bstarpu_get_vector_elemsize\b/starpu_vector_get_elemsize/g s/\bstarpu_get_vector_local_ptr\b/starpu_vector_get_local_ptr/g s/\bstarpu_get_vector_nx\b/starpu_vector_get_nx/g s/\bstarpu_data_set_wb_mask\b/starpu_data_set_wt_mask/g s/\bstarpu_list_filter_func_vector\b/starpu_vector_list_filter_func/g s/\bSTARPU_GET_MATRIX_PTR\b/STARPU_MATRIX_GET_PTR/g s/\bSTARPU_GET_MATRIX_NX\b/STARPU_MATRIX_GET_NX/g s/\bSTARPU_GET_MATRIX_NY\b/STARPU_MATRIX_GET_NY/g s/\bSTARPU_GET_MATRIX_LD\b/STARPU_MATRIX_GET_LD/g s/\bSTARPU_GET_MATRIX_ELEMSIZE\b/STARPU_MATRIX_GET_ELEMSIZE/g s/\bSTARPU_GET_BLOCK_PTR\b/STARPU_BLOCK_GET_PTR/g s/\bSTARPU_GET_BLOCK_NX\b/STARPU_BLOCK_GET_NX/g s/\bSTARPU_GET_BLOCK_NY\b/STARPU_BLOCK_GET_NY/g s/\bSTARPU_GET_BLOCK_NZ\b/STARPU_BLOCK_GET_NZ/g s/\bSTARPU_GET_BLOCK_LDY\b/STARPU_BLOCK_GET_LDY/g s/\bSTARPU_GET_BLOCK_LDZ\b/STARPU_BLOCK_GET_LDZ/g s/\bSTARPU_GET_BLOCK_ELEMSIZE\b/STARPU_BLOCK_GET_ELEMSIZE/g s/\bSTARPU_GET_VECTOR_PTR\b/STARPU_VECTOR_GET_PTR/g s/\bSTARPU_GET_VECTOR_NX\b/STARPU_VECTOR_GET_NX/g s/\bSTARPU_GET_VECTOR_ELEMSIZE\b/STARPU_VECTOR_GET_ELEMSIZE/g s/\bSTARPU_GET_VARIABLE_PTR\b/STARPU_VARIABLE_GET_PTR/g s/\bSTARPU_GET_VARIABLE_ELEMSIZE\b/STARPU_VARIABLE_GET_ELEMSIZE/g s/\bSTARPU_GET_CSR_NNZ\b/STARPU_CSR_GET_NNZ/g s/\bSTARPU_GET_CSR_NROW\b/STARPU_CSR_GET_NROW/g s/\bSTARPU_GET_CSR_NZVAL\b/STARPU_CSR_GET_NZVAL/g s/\bSTARPU_GET_CSR_COLIND\b/STARPU_CSR_GET_COLIND/g s/\bSTARPU_GET_CSR_ROWPTR\b/STARPU_CSR_GET_ROWPTR/g s/\bSTARPU_GET_CSR_FIRSTENTRY\b/STARPU_CSR_GET_FIRSTENTRY/g s/\bSTARPU_GET_CSR_ELEMSIZE\b/STARPU_CSR_GET_ELEMSIZE/g s/\bstarpu_print_bus_bandwidth\b/starpu_bus_print_bandwidth/g s/\bstarpu_get_handle_interface_id\b/starpu_handle_get_interface_id/g s/\bstarpu_get_current_task\b/starpu_task_get_current/g s/\bstarpu_pack_cl_args\b/starpu_codelet_pack_args/g s/\bstarpu_unpack_cl_args\b/starpu_codelet_unpack_args/g s/\bstarpu_task_deinit\b/starpu_task_clean/g s/\bstarpu_helper_cublas_init\b/starpu_cublas_init/g s/\bstarpu_helper_cublas_shutdown\b/starpu_cublas_shutdown/g s/\bstarpu_allocate_buffer_on_node\b/starpu_malloc_on_node/g s/\bstarpu_free_buffer_on_node\b/starpu_free_on_node/g s/\benum starpu_access_mode\b/enum starpu_data_access_mode/g s/\bstruct starpu_buffer_descr\b/struct starpu_data_descr/g s/\bstarpu_memory_display_stats\b/starpu_data_display_memory_stats/g s/\bstarpu_handle_to_pointer\b/starpu_data_handle_to_pointer/g s/\bstarpu_handle_get_local_ptr\b/starpu_data_get_local_ptr/g s/\bstarpu_crc32_be_n\b/starpu_hash_crc32c_be_n/g s/\bstarpu_crc32_be\b/starpu_hash_crc32c_be/g s/\bstarpu_crc32_string\b/starpu_hash_crc32c_string/g s/\benum starpu_perf_archtype\b/enum starpu_perfmodel_archtype/g s/\bstarpu_history_based_expected_perf\b/starpu_permodel_history_based_expected_perf/g s/\bstruct starpu_task_profiling_info\b/struct starpu_profiling_task_info/g s/\bstruct starpu_worker_profiling_info\b/struct starpu_profiling_worker_info/g s/\bstruct starpu_bus_profiling_info\b/struct starpu_profiling_bus_info/g s/\bstarpu_set_profiling_id\b/starpu_profiling_set_id/g s/\bstarpu_worker_get_profiling_info\b/starpu_profiling_worker_get_info/g s/\bstarpu_bus_profiling_helper_display_summary\b/starpu_profiling_bus_helper_display_summary/g s/\bstarpu_worker_profiling_helper_display_summary\b/starpu_profiling_worker_helper_display_summary/g s/\benum starpu_archtype\b/enum starpu_worker_archtype/g s/\bstarpu_handle_get_interface_id\b/starpu_data_get_interface_id/g s/\bstarpu_handle_get_size\b/starpu_data_get_size/g s/\bstarpu_handle_pack_data\b/starpu_data_pack/g s/\bstarpu_handle_unpack_data\b/starpu_data_unpack/g starpu-1.2.3+dfsg/tools/dev/checker/rename.sh000077500000000000000000000014031320135501600210740ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010 Université de Bordeaux # Copyright (C) 2010, 2011, 2012 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. find . -type f -not -name rename.sed -not -path "*svn*"|xargs sed -i -f $(dirname $0)/rename.sed starpu-1.2.3+dfsg/tools/dev/cppcheck/000077500000000000000000000000001320135501600174445ustar00rootroot00000000000000starpu-1.2.3+dfsg/tools/dev/cppcheck/suppressions.txt000066400000000000000000000057501320135501600227710ustar00rootroot00000000000000// StarPU --- Runtime system for heterogeneous multicore architectures. // // Copyright (C) 2017 CNRS // // StarPU is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 2.1 of the License, or (at // your option) any later version. // // StarPU is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // // See the GNU Lesser General Public License in COPYING.LGPL for more details. memleakOnRealloc knownConditionTrueFalse variableScope unusedStructMember ConfigurationNotChecked *:tools/dev/* *:starpufft/* *:min-dgels/* *:starpu-top/* *:socl/src/CL/* // TODO. We should cppcheck the code *:sc_hypervisor/* varFuncNullUB:examples/sched_ctx/two_cpu_contexts.c:76 negativeIndex:examples/stencil/stencil-tasks.c:200 negativeIndex:examples/stencil/stencil-tasks.c:203 constStatement:examples/stencil/* unreadVariable:tests/openmp/* unusedLabel:tests/datawizard/gpu_register.c unusedLabel:tests/datawizard/gpu_ptr_register.c redundantAssignment:tests/datawizard/interfaces/test_interfaces.c:752 redundantAssignment:tests/datawizard/mpi_like_async.c:165 redundantAssignment:tests/datawizard/mpi_like_async.c:211 unusedPrivateFunction:tests/main/combined_workers/bfs/timer.h:45 redundantAssignment:tests/main/driver_api/init_run_deinit.c redundantAssignment:tests/main/driver_api/run_driver.c uselessAssignmentPtrArg:mpi/src/starpu_mpi.c:155 unreadVariable:mpi/src/starpu_mpi.c:849 redundantAssignment:src/core/workers.c:249 redundantAssignment:src/core/workers.c:245 redundantAssignment:src/core/workers.c:253 invalidPointerCast:src/core/perfmodel/perfmodel_nan.c:74 unreadVariable:src/core/dependencies/tags.c:111 uselessAssignmentPtrArg:src/core/sched_ctx_list.c:144 unusedStructMember:src/core/perfmodel/perfmodel_bus.c:62 unusedStructMember:src/core/perfmodel/perfmodel_bus.c:63 unusedStructMember:src/core/perfmodel/perfmodel_bus.c:64 unusedStructMember:src/core/perfmodel/perfmodel_bus.c:65 unusedStructMember:src/core/perfmodel/perfmodel_bus.c:66 unusedStructMember:src/core/simgrid.c:225 unusedStructMember:src/core/simgrid.c:226 // TODO: this could be an error? redundantCopy:src/core/disk_ops/disk_leveldb.cpp:192 nullPointerRedundantCheck:src/common/rbtree.c unreadVariable:src/datawizard/interfaces/* unreadVariable:src/drivers/driver_common/driver_common.c:482 clarifyCondition:src/drivers/opencl/driver_opencl.c:936 unreadVariable:src/drivers/opencl/driver_opencl.c:767 clarifyCondition:src/drivers/cuda/driver_cuda.c:506 arithOperationsOnVoidPointer:src/drivers/scc/* nullPointerRedundantCheck:src/sched_policies/deque_modeling_policy_data_aware.c:197 sizeofDereferencedVoidPointer:src/util/fstarpu.c allocaCalled:gcc-plugin/src/* unusedVariable:gcc-plugin/tests/* unreadVariable:gcc-plugin/tests/* negativeIndex:gcc-plugin/src/* pointerSize:socl/src/cl_getcontextinfo.c:33 starpu-1.2.3+dfsg/tools/dev/lsan/000077500000000000000000000000001320135501600166215ustar00rootroot00000000000000starpu-1.2.3+dfsg/tools/dev/lsan/libc.suppr000066400000000000000000000012151320135501600206240ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # leak:lt__malloc starpu-1.2.3+dfsg/tools/dev/lsan/openmpi.suppr000066400000000000000000000013611320135501600213640ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2017 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. leak:ompi_free_list_grow leak:opal_dss_unpack_value leak:opal_dss_copy_value leak:mca_bml_base_btl_array_reserve starpu-1.2.3+dfsg/tools/dev/tsan/000077500000000000000000000000001320135501600166315ustar00rootroot00000000000000starpu-1.2.3+dfsg/tools/dev/tsan/starpu.suppr000066400000000000000000000052031320135501600212420ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2015-2016 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # Disabled checking race:^active_hook_cnt$ race:^worker_exp_start$ race:^worker_exp_end$ race:^worker_exp_len$ race:^ntasks$ race:^mc_cache_size$ race:^mc_nb$ race:^mc_clean_nb$ race:^data_requests$ race:^prefetch_requests$ race:^idle_requests$ race:^data_requests_npending$ race:^used_size$ race:^hit_cnt$ race:^miss_cnt$ race:^alloc_cache_hit_cnt$ race:^alloc_cnt$ race:^comm_amount$ race:^_starpu_valgrind_print_once$ race:^_starpu_silent$ race:^keys_initialized$ race:^tidying$ race:^reclaiming$ # don't care about cache hit stats race:^_starpu_msi_cache_hit$ race:^_starpu_msi_cache_miss$ # This is racy, but since we'll always put the same values, this is not a problem. race:^_starpu_codelet_check_deprecated_fields$ # This is racy, but we don't care, it's only a statistic race:^starpu_task_nsubmitted$ race:^starpu_task_nready$ race:^_starpu_bus_update_profiling_info$ # The config.running/pause_depth state is only protected by memory barriers race:^_starpu_machine_is_running$ race:^_starpu_kill_all_workers$ race:^starpu_pause$ race:^_starpu_may_pause$ race:^starpu_resume$ # worker_is_initialized is not actually racy since deinit happens only after main set running to 0 race:^_starpu_opencl_driver_deinit$ race:^_starpu_cuda_driver_deinit$ race:^_starpu_cpu_driver_deinit$ # The integer access is atomic, and we use the sched mutex to avoid missing wake ups race:^_starpu_fifo_empty$ race:^push_task_eager_policy$ # These are just statistics race:^starpu_memory_get_available$ race:^_starpu_profiling$ race:^_starpu_history_based_job_expected_perf$ race:^compute_ntasks_end$ race:^compute_expected_end$ race:^compute_all_performance_predictions$ # There is actually no race with busy_count, see comment race:_starpu_data_unregister # ignore other libraries' races called_from_lib:^libmpi.so$ called_from_lib:^libhwloc*.so$ # see valgrind/starpu.suppr deadlock:starpu_pthread_mutex_lock_sched deadlock:_starpu_sched_component_lock_worker deadlock:_starpu_sched_component_worker_lock_scheduling deadlock:simple_worker_pull_task starpu-1.2.3+dfsg/tools/dev/valgrind/000077500000000000000000000000001320135501600174725ustar00rootroot00000000000000starpu-1.2.3+dfsg/tools/dev/valgrind/fxt.suppr000066400000000000000000000022661320135501600213740ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # { Memcheck:Leak match-leak-kinds: reachable fun:calloc fun:fxt_setinfos fun:fut_setup } { Memcheck:Leak match-leak-kinds: reachable fun:realloc fun:fxt_get_cpu_info fun:fxt_setinfos fun:fut_setup } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:strdup fun:fut_set_filename } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:fxt_setinfos fun:fut_setup } starpu-1.2.3+dfsg/tools/dev/valgrind/helgrind.sh000077500000000000000000000026701320135501600216320ustar00rootroot00000000000000#!/bin/bash # # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016, 2017 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. EXEC=$(basename $0 .sh) DIRNAME=$(dirname $0) if test "$EXEC" == "valgrind" then RUN="valgrind --track-origins=yes --show-reachable=yes --leak-check=full --errors-for-leak-kinds=all --show-leak-kinds=all --error-exitcode=42" elif test "$EXEC" == "valgrind_xml" then mkdir -p ${DIRNAME}/../../../valgrind XML_FILE=$(mktemp -p ${DIRNAME}/../../../valgrind starpu-valgrind_XXXXXXXXXX.xml) RUN="valgrind --track-origins=yes --show-reachable=yes --leak-check=full --errors-for-leak-kinds=all --show-leak-kinds=all --xml=yes --xml-file=${XML_FILE}" else RUN="valgrind --tool=$EXEC --error-exitcode=42" fi SUPPRESSIONS=$(for f in $(dirname $0)/*.suppr /usr/share/hwloc/hwloc-valgrind.supp; do if test -f $f ; then echo "--suppressions=$f" ; fi ; done) $RUN --num-callers=42 --gen-suppressions=all $SUPPRESSIONS $* starpu-1.2.3+dfsg/tools/dev/valgrind/hwloc.suppr000066400000000000000000000021621320135501600217020ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2015 Université de Bordeaux # Copyright (C) 2012, 2016, 2017 CNRS # Copyright (C) 2012 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # { Memcheck:Leak match-leak-kinds: reachable ... fun:hwloc_components_init } { Memcheck:Leak match-leak-kinds: definite fun:malloc fun:lt__malloc fun:lt__zalloc obj:/usr/lib/x86_64-linux-gnu/libltdl.so.7.3.0 fun:lt_dlopenadvise obj:* obj:* obj:/usr/lib/x86_64-linux-gnu/libhwloc.so.5.6.8 fun:hwloc_topology_init } starpu-1.2.3+dfsg/tools/dev/valgrind/libc.suppr000066400000000000000000000052121320135501600214760ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014-2016 Université de Bordeaux # Copyright (C) 2014,2016 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # { Ignore libc aio-internal races Helgrind:Race ... fun:aio_read ... } { Ignore libc aio-internal races Helgrind:Race ... fun:aio_write ... } { Ignore libc aio-internal races Helgrind:Race ... fun:__aio_notify ... } { Ignore libc aio-internal races Helgrind:Race ... fun:aio_suspend ... } { Ignore libc aio errors Memcheck:Leak match-leak-kinds: reachable ... fun:__aio_enqueue_request ... } { Memcheck:Leak ... fun:dlopen@@GLIBC_2.2.5 ... } { Memcheck:Leak match-leak-kinds: definite fun:malloc fun:lt__malloc fun:lt__zalloc obj:/usr/lib/x86_64-linux-gnu/libltdl.so.7.3.1 ... } { Memcheck:Leak match-leak-kinds: reachable fun:malloc obj:/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22 fun:call_init.part.0 fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.21.so } { Memcheck:Leak match-leak-kinds: reachable fun:calloc fun:_dl_new_object fun:_dl_map_object_from_fd fun:_dl_map_object fun:openaux fun:_dl_catch_error fun:_dl_map_object_deps fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:_dl_new_object fun:_dl_map_object_from_fd fun:_dl_map_object fun:openaux fun:_dl_catch_error fun:_dl_map_object_deps fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:strdup fun:_dl_load_cache_lookup fun:_dl_map_object fun:openaux fun:_dl_catch_error fun:_dl_map_object_deps fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error } starpu-1.2.3+dfsg/tools/dev/valgrind/libgomp.suppr000066400000000000000000000026711320135501600222240ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2015-2016 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # { gomp1 Memcheck:Leak match-leak-kinds: reachable fun:malloc obj:/usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0 obj:/usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0 obj:/usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0 fun:call_init.part.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.19.so } { gomp2 Memcheck:Leak match-leak-kinds: reachable fun:malloc obj:/usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0 obj:/usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0 obj:/usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0 fun:call_init.part.0 fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.21.so } { gomp3 Memcheck:Leak match-leak-kinds: reachable fun:malloc obj:/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 fun:call_init.part.0 fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.21.so } starpu-1.2.3+dfsg/tools/dev/valgrind/libnuma.suppr000066400000000000000000000014371320135501600222210ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2012 CNRS # Copyright (C) 2012 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # { libnuma error Memcheck:Cond ... fun:numa_node_size64 ... } { libnuma error Memcheck:Value8 ... fun:numa_node_size64 ... } starpu-1.2.3+dfsg/tools/dev/valgrind/madmpi.suppr000066400000000000000000000027111320135501600220350ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # { Memcheck:Leak match-leak-kinds: indirect fun:malloc fun:hwloc_bitmap_alloc fun:piom_topo_current_obj fun:piom_ltask_schedule fun:nm_schedule fun:nm_sr_progress fun:nm_sr_stest fun:MPI_Test } { Memcheck:Leak match-leak-kinds: definite ... fun:nm_schedule fun:nm_sr_progress fun:nm_sr_stest fun:MPI_Test } { Memcheck:Leak match-leak-kinds: indirect fun:malloc fun:hwloc_bitmap_alloc fun:piom_topo_current_obj fun:piom_ltask_schedule fun:nm_schedule fun:nm_sr_progress fun:nm_sr_rtest fun:MPI_Test } { Memcheck:Leak match-leak-kinds: definite ... fun:nm_schedule fun:nm_sr_progress fun:nm_sr_rtest fun:MPI_Test } starpu-1.2.3+dfsg/tools/dev/valgrind/opencl.suppr000066400000000000000000000545551320135501600220630ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016 Université de Bordeaux # Copyright (C) 2016 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # { Memcheck:Leak match-leak-kinds: reachable fun:malloc obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.21.so } { Memcheck:Leak match-leak-kinds: indirect fun:malloc fun:strdup obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.21.so } { Memcheck:Leak match-leak-kinds: definite fun:malloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 } { Memcheck:Leak match-leak-kinds: possible fun:calloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 ... obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 } { Memcheck:Leak match-leak-kinds: definite fun:malloc fun:__alloc_dir obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 ... } { Memcheck:Leak match-leak-kinds: definite fun:calloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.21.so } { Memcheck:Leak match-leak-kinds: reachable fun:malloc obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.21.so } { Memcheck:Leak match-leak-kinds: reachable fun:malloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.21.so } { Memcheck:Leak match-leak-kinds: reachable fun:malloc obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.21.so } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:_dl_new_object fun:_dl_map_object_from_fd fun:_dl_map_object fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.2.5 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 } { Memcheck:Leak match-leak-kinds: reachable fun:realloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.21.so } { Memcheck:Leak match-leak-kinds: possible fun:calloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.21.so } { Memcheck:Leak match-leak-kinds: possible fun:calloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 } { Memcheck:Leak match-leak-kinds: possible fun:calloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.21.so } { Memcheck:Leak match-leak-kinds: possible fun:calloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.21.so } { Memcheck:Leak match-leak-kinds: possible fun:calloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.21.so } { Memcheck:Leak match-leak-kinds: reachable fun:malloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.21.so } { Memcheck:Leak match-leak-kinds: reachable fun:malloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.21.so } { Memcheck:Leak match-leak-kinds: reachable fun:malloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init } { Memcheck:Leak match-leak-kinds: reachable fun:malloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init } { Memcheck:Leak match-leak-kinds: reachable fun:malloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.21.so } { Memcheck:Leak match-leak-kinds: reachable fun:calloc fun:_dl_check_map_versions fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.2.5 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 } { Memcheck:Leak match-leak-kinds: reachable fun:calloc fun:_dl_new_object fun:_dl_map_object_from_fd fun:_dl_map_object fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.2.5 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:calloc fun:_dl_new_object fun:_dl_map_object_from_fd fun:_dl_map_object fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.2.5 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 } { Memcheck:Leak match-leak-kinds: reachable fun:calloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 } { Memcheck:Leak match-leak-kinds: reachable fun:calloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.21.so } { Memcheck:Leak match-leak-kinds: reachable fun:calloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.21.so } { Memcheck:Leak match-leak-kinds: reachable fun:calloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.21.so } { Memcheck:Leak match-leak-kinds: reachable fun:malloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.21.so } { Memcheck:Leak match-leak-kinds: reachable fun:malloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 ... obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 } { Memcheck:Leak match-leak-kinds: reachable fun:malloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 ... obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:malloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 ... obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 } { Memcheck:Leak match-leak-kinds: reachable fun:calloc fun:_dl_check_map_versions fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.2.5 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 } { Memcheck:Leak match-leak-kinds: reachable fun:calloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 ... obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.21.so } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:_dl_new_object fun:_dl_map_object_from_fd fun:_dl_map_object fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.2.5 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:strdup fun:_dl_load_cache_lookup fun:_dl_map_object fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.2.5 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 } { Memcheck:Leak match-leak-kinds: indirect fun:calloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 ... obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.21.so } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:strdup fun:_dl_load_cache_lookup fun:_dl_map_object fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.2.5 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 } { Memcheck:Leak match-leak-kinds: reachable fun:calloc obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:strdup obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 obj:/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.331.49 } { Memcheck:Leak match-leak-kinds: reachable fun:calloc fun:_dlerror_run fun:dlopen@@GLIBC_2.2.5 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.21.so } { Helgrind:UnlockUnlocked fun:mutex_unlock_WRK obj:/usr/lib/x86_64-linux-gnu/libamdocl64.so fun:aclCompilerInit obj:/usr/lib/x86_64-linux-gnu/libamdocl64.so obj:/usr/lib/x86_64-linux-gnu/libamdocl64.so obj:/usr/lib/x86_64-linux-gnu/libamdocl64.so obj:/usr/lib/x86_64-linux-gnu/libamdocl64.so fun:clIcdGetPlatformIDsKHR obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.2.5 ... } { Helgrind:PthAPIerror fun:mutex_unlock_WRK obj:/usr/lib/x86_64-linux-gnu/libamdocl64.so fun:aclCompilerInit obj:/usr/lib/x86_64-linux-gnu/libamdocl64.so obj:/usr/lib/x86_64-linux-gnu/libamdocl64.so obj:/usr/lib/x86_64-linux-gnu/libamdocl64.so obj:/usr/lib/x86_64-linux-gnu/libamdocl64.so fun:clIcdGetPlatformIDsKHR obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.2.5 ... } { Helgrind:Race ... fun:init_one_static_tls fun:__pthread_init_static_tls fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.2.5 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:call_init.part.0 fun:_dl_init fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.2.5 ... } { Memcheck:Cond ... obj:/usr/lib/x86_64-linux-gnu/libamdocl64.so ... fun:call_init.part.0 fun:_dl_init fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.2.5 ... } { Memcheck:Value8 ... obj:/usr/lib/x86_64-linux-gnu/libamdocl64.so ... fun:call_init.part.0 fun:_dl_init fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.2.5 ... } { Memcheck:Leak ... obj:/usr/lib/x86_64-linux-gnu/libamdocl64.so ... fun:call_init.part.0 fun:_dl_init fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.2.5 ... } { Memcheck:Leak match-leak-kinds: reachable fun:calloc fun:_dlerror_run fun:dlclose obj:/usr/lib/x86_64-linux-gnu/libamdocl64.so fun:__run_exit_handlers fun:exit ... } starpu-1.2.3+dfsg/tools/dev/valgrind/openmp.suppr000066400000000000000000000117371320135501600220740ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2017 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # { Memcheck:Leak match-leak-kinds: reachable fun:realloc obj:/usr/lib/x86_64-linux-gnu/libpciaccess.so.0.11.1 obj:/usr/lib/x86_64-linux-gnu/libpciaccess.so.0.11.1 fun:pci_device_get_device_name fun:hwloc_look_pci fun:hwloc_discover fun:hwloc_topology_load fun:_starpu_init_topology fun:_starpu_topology_get_nhwcpu fun:check_bus_config_file fun:_starpu_load_bus_performance_files fun:starpu_initialize fun:starpu_init fun:omp_initial_thread_setup fun:omp_initial_region_setup fun:starpu_omp_init fun:omp_constructor fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:strdup obj:/usr/lib/x86_64-linux-gnu/libpciaccess.so.0.11.1 obj:/usr/lib/x86_64-linux-gnu/libpciaccess.so.0.11.1 fun:pci_device_get_device_name fun:hwloc_look_pci fun:hwloc_discover fun:hwloc_topology_load fun:_starpu_init_topology fun:_starpu_topology_get_nhwcpu fun:check_bus_config_file fun:_starpu_load_bus_performance_files fun:starpu_initialize fun:starpu_init fun:omp_initial_thread_setup fun:omp_initial_region_setup fun:starpu_omp_init fun:omp_constructor fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:strdup obj:/usr/lib/x86_64-linux-gnu/libpciaccess.so.0.11.1 obj:/usr/lib/x86_64-linux-gnu/libpciaccess.so.0.11.1 fun:pci_device_get_device_name fun:hwloc_look_pci fun:hwloc_discover fun:hwloc_topology_load fun:_starpu_init_topology fun:_starpu_topology_get_nhwcpu fun:check_bus_config_file fun:_starpu_load_bus_performance_files fun:starpu_initialize fun:starpu_init fun:omp_initial_thread_setup fun:omp_initial_region_setup fun:starpu_omp_init fun:omp_constructor fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:calloc obj:/usr/lib/x86_64-linux-gnu/libpciaccess.so.0.11.1 obj:/usr/lib/x86_64-linux-gnu/libpciaccess.so.0.11.1 fun:hwloc_look_pci fun:hwloc_discover fun:hwloc_topology_load fun:_starpu_init_topology fun:_starpu_topology_get_nhwcpu fun:check_bus_config_file fun:_starpu_load_bus_performance_files fun:starpu_initialize fun:starpu_init fun:omp_initial_thread_setup fun:omp_initial_region_setup fun:starpu_omp_init fun:omp_constructor fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:calloc obj:/usr/lib/x86_64-linux-gnu/libpciaccess.so.0.11.1 obj:/usr/lib/x86_64-linux-gnu/libpciaccess.so.0.11.1 fun:hwloc_look_pci fun:hwloc_discover fun:hwloc_topology_load fun:_starpu_init_topology fun:_starpu_topology_get_nhwcpu fun:check_bus_config_file fun:_starpu_load_bus_performance_files fun:starpu_initialize fun:starpu_init fun:omp_initial_thread_setup fun:omp_initial_region_setup fun:starpu_omp_init fun:omp_constructor fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:calloc obj:/usr/lib/x86_64-linux-gnu/libpciaccess.so.0.11.1 obj:/usr/lib/x86_64-linux-gnu/libpciaccess.so.0.11.1 fun:hwloc_look_pci fun:hwloc_discover fun:hwloc_topology_load fun:_starpu_init_topology fun:_starpu_topology_get_nhwcpu fun:check_bus_config_file fun:_starpu_load_bus_performance_files fun:starpu_initialize fun:starpu_init fun:omp_initial_thread_setup fun:omp_initial_region_setup fun:starpu_omp_init fun:omp_constructor fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:strdup obj:/usr/lib/x86_64-linux-gnu/libpciaccess.so.0.11.1 obj:/usr/lib/x86_64-linux-gnu/libpciaccess.so.0.11.1 fun:hwloc_look_pci fun:hwloc_discover fun:hwloc_topology_load fun:_starpu_init_topology fun:_starpu_topology_get_nhwcpu fun:check_bus_config_file fun:_starpu_load_bus_performance_files fun:starpu_initialize fun:starpu_init fun:omp_initial_thread_setup fun:omp_initial_region_setup fun:starpu_omp_init fun:omp_constructor fun:__libc_csu_init fun:(below main) } starpu-1.2.3+dfsg/tools/dev/valgrind/openmpi.suppr000066400000000000000000000252011320135501600222340ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014-2016 Université de Bordeaux # Copyright (C) 2012-2016 CNRS # Copyright (C) 2012 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # { suppr1 Memcheck:Param writev(vector[...]) ... fun:ompi_mpi_init ... } { suppr2 Memcheck:Addr4 ... fun:orte_init ... } { suppr3 Memcheck:Param sched_setaffinity(mask) ... fun:orte_init ... } { suppr4 Memcheck:Addr8 ... fun:orte_init } { suppr5 Memcheck:Leak ... fun:ompi_mpi_init } { suppr5 Helgrind:Race ... fun:ompi_mpi_init } { suppr6 Memcheck:Leak ... fun:mca_pml_base_open } { suppr7 Memcheck:Leak ... fun:orte_init } { suppr7 Memcheck:Leak ... fun:orte_progress_thread_engine } { suppr7 Helgrind:Race ... fun:orte_progress_thread_engine } { suppr8 Memcheck:Leak ... fun:orte_ess_base_app_setup } { suppr9 Memcheck:Leak ... fun:opal_paffinity_base_open } { suppr10 Memcheck:Leak ... fun:ompi_mpi_finalize } { suppr10 Helgrind:Race ... fun:ompi_mpi_finalize } { suppr10 Helgrind:Misc ... fun:ompi_mpi_finalize } { suppr10 Helgrind:PthAPIerror ... fun:ompi_mpi_finalize } { suppr11 Memcheck:Leak ... fun:mca_base_components_open } { suppr12 Memcheck:Param writev(vector[...]) ... fun:PMPI_Init_thread } { suppr13 Memcheck:Param writev(vector[...]) ... fun:PMPI_Init_thread } { suppr14 Memcheck:Param sched_setaffinity(mask) ... fun:PMPI_Init_thread } { suppr15 Memcheck:Leak fun:malloc fun:ompi_free_list_grow ... fun:opal_progress fun:ompi_request_default_test fun:PMPI_Test } { suppr16 Memcheck:Leak fun:malloc fun:ompi_ddt_set_args fun:PMPI_Type_vector } { suppr17 Memcheck:Leak fun:malloc fun:ompi_ddt_optimize_short.constprop.0 fun:ompi_ddt_commit fun:PMPI_Type_commit } { suppr18 Memcheck:Leak fun:calloc fun:ompi_ddt_create fun:ompi_ddt_create_vector fun:PMPI_Type_vector } { suppr19 Memcheck:Leak fun:malloc fun:ompi_ddt_create fun:ompi_ddt_create_vector fun:PMPI_Type_vector } { suppr20 Memcheck:Leak fun:malloc fun:ompi_free_list_grow ... fun:PMPI_Isend } { suppr21 Memcheck:Leak ... fun:hwloc_topology_set_xmlbuffer fun:opal_hwloc_unpack fun:opal_dss_unpack_buffer } { suppr22 Memcheck:Leak ... fun:hwloc_topology_set_xmlbuffer fun:opal_hwloc_unpack } { suppr23 Memcheck:Leak ... fun:hwloc_topology_load fun:opal_hwloc_unpack } { suppr24 Memcheck:Leak fun:malloc ... fun:xmlParseElement } { suppr25 Memcheck:Leak match-leak-kinds: indirect ... fun:ompi_datatype_commit fun:PMPI_Type_commit } { suppr26 Memcheck:Leak match-leak-kinds: definite ... fun:ompi_datatype_create_vector fun:PMPI_Type_vector } { suppr27 Memcheck:Leak match-leak-kinds: indirect ... fun:ompi_datatype_create_vector fun:PMPI_Type_vector } { suppr28 Memcheck:Leak match-leak-kinds: indirect fun:malloc fun:ompi_datatype_set_args fun:PMPI_Type_vector } { suppr29 Memcheck:Leak ... fun:PMPI_Comm_split fun:main } { Memcheck:Leak match-leak-kinds: definite fun:malloc fun:orte_grpcomm_base_update_modex_entries fun:orte_grpcomm_base_modex_unpack obj:* obj:* obj:* obj:* obj:* fun:opal_event_base_loop fun:opal_progress obj:* fun:ompi_modex_recv_key_value } { Memcheck:Leak match-leak-kinds: definite fun:malloc obj:/usr/lib/openmpi/lib/libmpi.so.1.0.8 fun:orte_grpcomm_base_update_modex_entries fun:orte_grpcomm_base_modex_unpack obj:* obj:* obj:* obj:* obj:* fun:opal_event_base_loop fun:opal_progress obj:* } { Memcheck:Leak match-leak-kinds: indirect fun:malloc fun:orte_grpcomm_base_update_modex_entries fun:orte_grpcomm_base_modex_unpack obj:* obj:* obj:* obj:* obj:* fun:opal_event_base_loop fun:opal_progress obj:* fun:ompi_modex_recv_key_value } { Memcheck:Leak match-leak-kinds: indirect fun:malloc obj:/usr/lib/openmpi/lib/libmpi.so.1.0.8 fun:orte_grpcomm_base_update_modex_entries fun:orte_grpcomm_base_modex_unpack obj:* obj:* obj:* obj:* obj:* fun:opal_event_base_loop fun:opal_progress obj:* } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:lt__malloc fun:lt__zalloc obj:/usr/lib/x86_64-linux-gnu/libltdl.so.7.3.0 fun:lt_dlopenadvise obj:/usr/lib/x86_64-linux-gnu/hwloc/hwloc_cuda.so obj:/usr/lib/x86_64-linux-gnu/hwloc/hwloc_cuda.so obj:/usr/lib/x86_64-linux-gnu/libhwloc.so.5.6.8 fun:hwloc_topology_init fun:opal_hwloc_unpack fun:opal_dss_unpack_buffer fun:opal_dss_unpack } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:strdup obj:/usr/lib/x86_64-linux-gnu/libhwloc.so.5.6.8 obj:/usr/lib/x86_64-linux-gnu/libltdl.so.7.3.0 obj:/usr/lib/x86_64-linux-gnu/libltdl.so.7.3.0 fun:lt_dlforeachfile obj:/usr/lib/x86_64-linux-gnu/libhwloc.so.5.6.8 obj:/usr/lib/x86_64-linux-gnu/libhwloc.so.5.6.8 fun:hwloc_topology_init fun:opal_hwloc_unpack fun:opal_dss_unpack_buffer fun:opal_dss_unpack } { Memcheck:Leak match-leak-kinds: reachable fun:malloc obj:/usr/lib/x86_64-linux-gnu/libhwloc.so.5.6.8 obj:/usr/lib/x86_64-linux-gnu/libltdl.so.7.3.0 obj:/usr/lib/x86_64-linux-gnu/libltdl.so.7.3.0 fun:lt_dlforeachfile obj:/usr/lib/x86_64-linux-gnu/libhwloc.so.5.6.8 obj:/usr/lib/x86_64-linux-gnu/libhwloc.so.5.6.8 fun:hwloc_topology_init fun:opal_hwloc_unpack fun:opal_dss_unpack_buffer fun:opal_dss_unpack fun:orte_util_nidmap_init } { Memcheck:Leak match-leak-kinds: definite fun:malloc fun:opal_dss_unpack_string fun:opal_dss_unpack_buffer fun:opal_dss_unpack fun:orte_grpcomm_base_update_modex_entries fun:orte_grpcomm_base_modex_unpack obj:* obj:* obj:* obj:* obj:* fun:opal_event_base_loop } { Memcheck:Leak match-leak-kinds: indirect fun:malloc fun:strdup fun:orte_grpcomm_base_update_modex_entries fun:orte_grpcomm_base_modex_unpack obj:* obj:* obj:* obj:* obj:* fun:opal_event_base_loop fun:opal_progress obj:* } # the following suppression occurs on bertha with openmpi 1.10.2 # no idea why it is failing # Invalid read of size 8 # at 0x4C2E726: memcpy@@GLIBC_2.14 (vg_replace_strmem.c:1018) # by 0x77F31C0: opal_convertor_pack (in /usr/lib/openmpi/lib/libopen-pal.so.13.0.2) # by 0x105D8C41: mca_btl_vader_sendi (in /usr/lib/openmpi/lib/openmpi/mca_btl_vader.so) # by 0x10C16F05: mca_pml_ob1_send_inline (in /usr/lib/openmpi/lib/openmpi/mca_pml_ob1.so) # by 0x10C17662: mca_pml_ob1_isend (in /usr/lib/openmpi/lib/openmpi/mca_pml_ob1.so) # by 0x5B6471D: PMPI_Isend (in /usr/lib/openmpi/lib/libmpi.so.12.0.2) # by 0x4E3F08E: _starpu_mpi_isend_size_func (starpu_mpi.c:384) # by 0x4E4602D: _starpu_mpi_handle_ready_request (starpu_mpi.c:1132) # by 0x4E47C3C: _starpu_mpi_progress_thread_func (starpu_mpi.c:1342) # by 0x58E6283: start_thread (pthread_create.c:333) # by 0x60F5A4C: clone (in /lib/x86_64-linux-gnu/libc-2.21.so) # Address 0x1ab67c40 is 16 bytes inside a block of size 24 alloc'd # at 0x4C2BBD5: calloc (vg_replace_malloc.c:711) # by 0x4E3EDBA: _starpu_mpi_isend_size_func (starpu_mpi.c:369) # by 0x4E4602D: _starpu_mpi_handle_ready_request (starpu_mpi.c:1132) # by 0x4E47C3C: _starpu_mpi_progress_thread_func (starpu_mpi.c:1342) # by 0x58E6283: start_thread (pthread_create.c:333) # by 0x60F5A4C: clone (in /lib/x86_64-linux-gnu/libc-2.21.so) { Memcheck:Addr8 fun:memcpy@@GLIBC_2.14 fun:opal_convertor_pack fun:mca_btl_vader_sendi fun:mca_pml_ob1_send_inline fun:mca_pml_ob1_isend fun:PMPI_Isend fun:_starpu_mpi_isend_size_func fun:_starpu_mpi_handle_ready_request fun:_starpu_mpi_progress_thread_func fun:start_thread } { Memcheck:Addr2 fun:memcpy@@GLIBC_2.14 fun:opal_convertor_pack fun:mca_btl_vader_sendi fun:mca_pml_ob1_send_inline fun:mca_pml_ob1_isend fun:PMPI_Isend fun:_starpu_mpi_isend_data_func fun:_starpu_mpi_isend_size_func fun:_starpu_mpi_handle_ready_request fun:_starpu_mpi_progress_thread_func fun:start_thread } { Memcheck:Addr8 fun:memcpy@@GLIBC_2.14 fun:vader_prepare_src fun:mca_pml_ob1_send_request_start_prepare fun:mca_pml_ob1_isend fun:PMPI_Isend fun:_starpu_mpi_isend_data_func fun:_starpu_mpi_isend_size_func fun:_starpu_mpi_handle_ready_request fun:_starpu_mpi_progress_thread_func fun:start_thread } { Memcheck:Addr8 fun:memcpy@@GLIBC_2.14 fun:mca_btl_vader_sendi fun:mca_pml_ob1_send_inline fun:mca_pml_ob1_isend fun:PMPI_Isend fun:_starpu_mpi_isend_size_func fun:_starpu_mpi_handle_ready_request fun:_starpu_mpi_progress_thread_func fun:start_thread } { Memcheck:Addr8 fun:memcpy@@GLIBC_2.14 fun:opal_convertor_pack ... fun:PMPI_Isend fun:_starpu_mpi_isend_size_func fun:_starpu_mpi_handle_ready_request fun:_starpu_mpi_progress_thread_func fun:start_thread } { Memcheck:Addr2 fun:memcpy@@GLIBC_2.14 fun:opal_convertor_pack ... fun:PMPI_Isend fun:_starpu_mpi_isend_data_func fun:_starpu_mpi_isend_size_func fun:_starpu_mpi_handle_ready_request fun:_starpu_mpi_progress_thread_func fun:start_thread } { Memcheck:Addr8 fun:_starpu_mpi_isend_size_func fun:_starpu_mpi_handle_ready_request fun:_starpu_mpi_progress_thread_func fun:start_thread } starpu-1.2.3+dfsg/tools/dev/valgrind/padico.suppr000066400000000000000000000344361320135501600220360ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # { Memcheck:Param match-leak-kinds: reachable ... fun:padico_tasklet_worker.2516.2614 } { Memcheck:Leak match-leak-kinds: reachable ... fun:padico_tasklet_worker.2516.2614 } { Memcheck:Param ioctl(SIOCETHTOOL) ... fun:padico_tasklet_worker.2516.2614 } { Memcheck:Param write(buf) ... fun:nm_launcher_init } { Memcheck:Param match-leak-kinds: reachable ... fun:nm_launcher_init } { Memcheck:Leak match-leak-kinds: reachable ... fun:nm_launcher_init } { Memcheck:Leak match-leak-kinds: reachable ... fun:puk_xml_parse_file } { Memcheck:Leak match-leak-kinds: reachable ... fun:puk_xml_end_handler.3579 } { Memcheck:Leak match-leak-kinds: reachable ... fun:puk_xml_parse_buffer } { Memcheck:Leak match-leak-kinds: indirect ... fun:padico_tasklet_worker.2516.2614 } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:puk_mod_builtin_declare fun:call_init.part.0 fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.21.so } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:hwloc_bitmap_alloc fun:piom_topo_current_obj fun:__piom_ltask_timer_worker.3325 fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:_dl_close_worker fun:_dl_close fun:_dl_catch_error fun:dlerror_run fun:free_mem fun:__libc_freeres fun:_vgnU_freeres fun:__run_exit_handlers fun:exit fun:(below main) } { Memcheck:Leak match-leak-kinds: indirect fun:malloc fun:strdup fun:topo_property_end_handler fun:puk_xml_end_handler.3579 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 fun:XML_ParseBuffer fun:puk_xml_parse_buffer fun:na_control_event_listener fun:padico_tasklet_flush fun:sysio_control_start fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:piom_topo_current_obj } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:hwloc_bitmap_alloc fun:piom_topo_current_obj fun:piom_ltask_schedule fun:__piom_ltask_idle_worker.3322 fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: definite fun:malloc fun:padico_addrdb_publish_handler fun:puk_xml_start_handler.3574 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 fun:XML_ParseBuffer fun:puk_xml_parse_buffer fun:na_control_event_listener fun:padico_tasklet_worker.2516.2614 fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:_puk_component_instantiate fun:sysio_control_bootstrap_acceptor fun:sfplain_acceptor_finalizer fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: definite fun:malloc fun:topo_property_end_handler fun:puk_xml_end_handler.3579 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 fun:XML_ParseBuffer fun:puk_xml_parse_buffer fun:sysio_control_start fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: definite fun:malloc fun:topo_property_end_handler fun:puk_xml_end_handler.3579 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 fun:XML_ParseBuffer fun:puk_xml_parse_buffer fun:na_control_event_listener fun:padico_tasklet_worker.2516.2614 fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:sysio_control_instantiate fun:_puk_component_instantiate fun:sysio_control_bootstrap_acceptor fun:sfplain_acceptor_finalizer fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:padico_tasklet_schedule fun:sysio_control_read_callback fun:na_sysio_thread fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:padico_control_deliver_message fun:sysio_control_read_callback fun:na_sysio_thread fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:padico_tasklet_schedule fun:sysio_control_read_callback fun:na_sysio_thread fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:puk_iface_register fun:puk_component_declare2 fun:padico_module_init fun:unit_binary_load.5249.2496 fun:padico_puk_mod_load fun:_puk_component_resolve fun:padico_control_send_msg fun:padico_control_send_ext fun:control_router_event_listener fun:padico_tasklet_flush fun:control_router_event_listener fun:padico_tasklet_flush fun:sysio_control_start fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:realloc fun:na_control_event_listener fun:padico_tasklet_flush fun:sysio_control_start fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:strdup fun:puk_iface_register fun:puk_component_declare2 fun:padico_module_init fun:unit_binary_load.5249.2496 fun:padico_puk_mod_load fun:_puk_component_resolve fun:padico_control_send_msg fun:padico_control_send_ext fun:control_router_event_listener fun:padico_tasklet_flush fun:control_router_event_listener fun:padico_tasklet_flush fun:sysio_control_start fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: definite fun:malloc fun:topo_property_end_handler fun:puk_xml_end_handler.3579 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 fun:XML_ParseBuffer fun:puk_xml_parse_buffer fun:na_control_event_listener fun:padico_tasklet_flush fun:padico_module_init fun:unit_binary_load.5249.2496 fun:padico_puk_mod_load fun:_puk_component_resolve fun:padico_control_send_msg fun:padico_control_send_ext fun:control_router_event_listener fun:padico_tasklet_worker.2516.2614 fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: definite fun:malloc fun:padico_tm_tasks_process.2519.2436 fun:padico_tasklet_worker.2516.2614 fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: definite fun:malloc fun:padico_addrdb_publish_handler fun:puk_xml_start_handler.3574 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 fun:XML_ParseBuffer fun:puk_xml_parse_buffer fun:na_control_event_listener fun:padico_tm_req_wait fun:padico_tm_mod_action_args fun:run_end_handler.2909.2464 fun:puk_xml_end_handler.3579 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 fun:XML_ParseBuffer fun:puk_xml_parse_buffer fun:na_control_event_listener fun:padico_tasklet_worker.2516.2614 fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:sysio_control_read_callback fun:na_sysio_thread fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: definite fun:malloc fun:topo_property_end_handler fun:puk_xml_end_handler.3579 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 fun:XML_ParseBuffer fun:puk_xml_parse_buffer fun:na_control_event_listener fun:padico_tasklet_flush fun:padico_module_init fun:unit_binary_load.5249.2496 fun:padico_puk_mod_load fun:_puk_component_resolve fun:padico_control_send_msg fun:padico_control_send_ext fun:control_router_event_listener fun:padico_tasklet_worker.2516.2614 fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: definite fun:malloc fun:padico_tm_tasks_process.2519.2436 fun:padico_tasklet_worker.2516.2614 fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: definite fun:malloc fun:padico_addrdb_publish_handler fun:puk_xml_start_handler.3574 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 fun:XML_ParseBuffer fun:puk_xml_parse_buffer fun:na_control_event_listener fun:padico_tm_req_wait fun:padico_tm_mod_action_args fun:run_end_handler.2909.2464 fun:puk_xml_end_handler.3579 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 fun:XML_ParseBuffer fun:puk_xml_parse_buffer fun:na_control_event_listener fun:padico_tasklet_worker.2516.2614 fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:sysio_control_read_callback fun:na_sysio_thread fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: definite fun:malloc fun:topo_property_end_handler fun:puk_xml_end_handler.3579 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 fun:XML_ParseBuffer fun:puk_xml_parse_buffer fun:na_control_event_listener fun:padico_tasklet_flush fun:padico_module_init fun:unit_binary_load.5249.2496 fun:padico_puk_mod_load fun:_puk_component_resolve fun:padico_control_send_msg fun:padico_control_send_ext fun:control_router_event_listener fun:padico_tasklet_worker.2516.2614 fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: definite fun:malloc fun:padico_tm_tasks_process.2519.2436 fun:padico_tasklet_worker.2516.2614 fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: definite fun:malloc fun:padico_addrdb_publish_handler fun:puk_xml_start_handler.3574 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 fun:XML_ParseBuffer fun:puk_xml_parse_buffer fun:na_control_event_listener fun:padico_tm_req_wait fun:padico_tm_mod_action_args fun:run_end_handler.2909.2464 fun:puk_xml_end_handler.3579 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 fun:XML_ParseBuffer fun:puk_xml_parse_buffer fun:na_control_event_listener fun:padico_tasklet_worker.2516.2614 fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:sysio_control_read_callback fun:na_sysio_thread fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: definite fun:malloc fun:topo_property_end_handler fun:puk_xml_end_handler.3579 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 fun:XML_ParseBuffer fun:puk_xml_parse_buffer fun:na_control_event_listener fun:padico_tasklet_flush fun:router_update_end_handler fun:puk_xml_end_handler.3579 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 obj:/lib/x86_64-linux-gnu/libexpat.so.1.6.0 fun:XML_ParseBuffer fun:puk_xml_parse_buffer fun:na_control_event_listener fun:padico_tasklet_worker.2516.2614 fun:start_thread fun:clone } starpu-1.2.3+dfsg/tools/dev/valgrind/pthread.suppr000066400000000000000000000017451320135501600222230ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2013 Université de Bordeaux # Copyright (C) 2012 CNRS # Copyright (C) 2012 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # { pthread_create Memcheck:Leak ... fun:pthread_create@@GLIBC_2.2.5 ... } { name Memcheck:Leak ... fun:pthread_cancel_init ... } { Helgrind 3.9 wrongly compares to-be-destroyed mutex with init value Helgrind:Race fun:my_memcmp fun:pthread_mutex_destroy ... } starpu-1.2.3+dfsg/tools/dev/valgrind/starpu.suppr000066400000000000000000000122641320135501600221100ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2013-2016 Université de Bordeaux # Copyright (C) 2012 CNRS # Copyright (C) 2012 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # { don't care about cache hit stats Helgrind:Race fun:_starpu_msi_cache_hit ... } { don't care about cache miss stats Helgrind:Race fun:_starpu_msi_cache_miss ... } { known race, but not problematic in practice, see comment in _starpu_tag_clear Helgrind:LockOrder ... fun:_starpu_tag_free fun:_starpu_htbl_clear_tags ... fun:_starpu_tag_clear fun:starpu_shutdown ... } { There is actually no race on current_mode, because the mode can not change unexpectedly, until _starpu_notify_data_dependencies() is called further down. Valgrind can not know about such software rwlock. Helgrind:Race fun:_starpu_release_data_on_node fun:_starpu_push_task_output ... } { We do not care about races on profiling statistics Helgrind:Race fun:_starpu_worker_get_status fun:_starpu_worker_reset_profiling_info_with_lock ... } { This is racy, but since we'll always put the same values, this is not a problem. Helgrind:Race fun:_starpu_codelet_check_deprecated_fields ... } { This is racy, but we don't care, it's only a statistic Helgrind:Race fun:starpu_task_nsubmitted ... } { This is racy, but we don't care, it's only a statistic Helgrind:Race fun:starpu_task_nready ... } { This is racy, but we don't care, it's only a statistic Helgrind:Race fun:_starpu_bus_update_profiling_info ... } { fscanf error Memcheck:Cond ... fun:fscanf fun:_starpu_load_bus_performance_files ... } { mc / handle locking order. We always take handle before mc, except when we tidy memory, where we use trylock, but helgrind doesn't handle that :/ Helgrind:LockOrder fun:mutex_trylock_WRK fun:__starpu_spin_trylock ... } { mc / handle locking order1 Helgrind:LockOrder ... fun:__starpu_spin_lock fun:try_to_free_mem_chunk ... } { mc / handle locking order2 Helgrind:LockOrder ... fun:__starpu_spin_lock fun:try_to_find_reusable_mem_chunk ... } { mc / handle locking order3 Helgrind:LockOrder ... fun:__starpu_spin_lock fun:free_potentially_in_use_mc ... } { mc / handle locking order4 Helgrind:LockOrder ... fun:__starpu_spin_lock fun:free_potentially_in_use_mc ... } { mc / handle locking order5 Helgrind:LockOrder ... fun:__starpu_spin_lock fun:register_mem_chunk ... } { mc / handle locking order6 Helgrind:LockOrder ... fun:__starpu_spin_lock fun:_starpu_request_mem_chunk_removal ... } { mc / handle locking order7 Helgrind:LockOrder ... fun:__starpu_spin_lock fun:_starpu_allocate_interface ... } { mc / handle locking order8 Helgrind:LockOrder ... fun:__starpu_spin_lock fun:_starpu_memchunk_recently_used ... } { TODO1: This is temporary. It perhaps does not pose problem because only the worker takes this mutex. Fixing this will require changing the scheduler interface, so that the schedulers themselves take the scheduling lock, not the caller. Filter it out for now, so we can see other races more easily. Helgrind:LockOrder fun:mutex_lock_WRK fun:simple_worker_pull_task ... } { TODO1: This is temporary. It perhaps does not pose problem because only the worker takes this mutex. Fixing this will require changing the scheduler interface, so that the schedulers themselves take the scheduling lock, not the caller. Filter it out for now, so we can see other races more easily. Helgrind:LockOrder fun:mutex_lock_WRK fun:starpu_pthread_mutex_lock_sched fun:_starpu_sched_component_worker_lock_scheduling fun:simple_worker_pull_task ... } { TODO2: This is temporary. It perhaps does not pose problem because only the worker takes this mutex. Fixing this will require changing the scheduler interface, so that the schedulers themselves take the scheduling lock, not the caller. Filter it out for now, so we can see other races more easily. Helgrind:LockOrder fun:mutex_lock_WRK fun:_starpu_sched_component_lock_worker fun:simple_worker_pull_task ... } { TODO2: This is temporary. It perhaps does not pose problem because only the worker takes this mutex. Fixing this will require changing the scheduler interface, so that the schedulers themselves take the scheduling lock, not the caller. Filter it out for now, so we can see other races more easily. Helgrind:LockOrder fun:mutex_lock_WRK fun:_starpu_sched_component_lock_worker fun:_starpu_sched_component_worker_lock_scheduling fun:simple_worker_pull_task ... } starpu-1.2.3+dfsg/tools/dev/valgrind/valgrind.sh000077500000000000000000000026701320135501600216440ustar00rootroot00000000000000#!/bin/bash # # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016, 2017 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. EXEC=$(basename $0 .sh) DIRNAME=$(dirname $0) if test "$EXEC" == "valgrind" then RUN="valgrind --track-origins=yes --show-reachable=yes --leak-check=full --errors-for-leak-kinds=all --show-leak-kinds=all --error-exitcode=42" elif test "$EXEC" == "valgrind_xml" then mkdir -p ${DIRNAME}/../../../valgrind XML_FILE=$(mktemp -p ${DIRNAME}/../../../valgrind starpu-valgrind_XXXXXXXXXX.xml) RUN="valgrind --track-origins=yes --show-reachable=yes --leak-check=full --errors-for-leak-kinds=all --show-leak-kinds=all --xml=yes --xml-file=${XML_FILE}" else RUN="valgrind --tool=$EXEC --error-exitcode=42" fi SUPPRESSIONS=$(for f in $(dirname $0)/*.suppr /usr/share/hwloc/hwloc-valgrind.supp; do if test -f $f ; then echo "--suppressions=$f" ; fi ; done) $RUN --num-callers=42 --gen-suppressions=all $SUPPRESSIONS $* starpu-1.2.3+dfsg/tools/dev/valgrind/valgrind.suppr000066400000000000000000000016321320135501600223750ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016 CNRS # Copyright (C) 2017 Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # { valgrind_suppr1 Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:ensure_sReq_space fun:add_shadow_Request fun:PMPI_Irecv } { _dl_init_suppr_01 Memcheck:Leak fun:malloc ... fun:call_init.part.0 fun:_dl_init ... } starpu-1.2.3+dfsg/tools/dev/valgrind/valgrind_xml.sh000077500000000000000000000026701320135501600225240ustar00rootroot00000000000000#!/bin/bash # # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016, 2017 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. EXEC=$(basename $0 .sh) DIRNAME=$(dirname $0) if test "$EXEC" == "valgrind" then RUN="valgrind --track-origins=yes --show-reachable=yes --leak-check=full --errors-for-leak-kinds=all --show-leak-kinds=all --error-exitcode=42" elif test "$EXEC" == "valgrind_xml" then mkdir -p ${DIRNAME}/../../../valgrind XML_FILE=$(mktemp -p ${DIRNAME}/../../../valgrind starpu-valgrind_XXXXXXXXXX.xml) RUN="valgrind --track-origins=yes --show-reachable=yes --leak-check=full --errors-for-leak-kinds=all --show-leak-kinds=all --xml=yes --xml-file=${XML_FILE}" else RUN="valgrind --tool=$EXEC --error-exitcode=42" fi SUPPRESSIONS=$(for f in $(dirname $0)/*.suppr /usr/share/hwloc/hwloc-valgrind.supp; do if test -f $f ; then echo "--suppressions=$f" ; fi ; done) $RUN --num-callers=42 --gen-suppressions=all $SUPPRESSIONS $* starpu-1.2.3+dfsg/tools/gdbinit000066400000000000000000000625431320135501600164630ustar00rootroot00000000000000 # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010-2016 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # To set a breakpoint when starting gdb with option "-ex run", # here what you need to do: #set breakpoint pending on #break starpu_mpi.c:419 define starpu-print-job set language c set $job = (struct _starpu_job *)$arg0 printf "StarPU Job (%p)\n", $job if ($job != 0) printf "\ttask:\t\t\t\t<%p>\n", $job->task printf "\tsubmitted:\t\t\t<%d>\n", $job->submitted printf "\tterminated:\t\t\t<%d>\n", $job->terminated printf "\tjob_id:\t\t\t\t<%d>\n", $job->job_id if $job->task && $job->task->name printf "\tname:\t\t\t\t<%s>\n", $job->task->name end end end document starpu-print-job Prints a StarPU job end define starpu-print-task set language c set $task = (struct starpu_task *)$arg0 set $job = (struct _starpu_job *)$task->starpu_private set $status=0 if $task->status == 0 set $status="STARPU_TASK_INVALID" end if $task->status == 1 set $status="STARPU_TASK_BLOCKED" end if $task->status == 2 set $status="STARPU_TASK_READY" end if $task->status == 3 set $status="STARPU_TASK_RUNNING" end if $task->status == 4 set $status="STARPU_TASK_FINISHED" end if $task->status == 5 set $status="STARPU_TASK_BLOCKED_ON_TAG" end if $task->status == 6 set $status="STARPU_TASK_BLOCKED_ON_TASK" end if $task->status == 7 set $status="STARPU_TASK_BLOCKED_ON_DATA" end if $task->status == 8 set $status="STARPU_TASK_STOPPED" end printf "StarPU Task (%p)\n", $task if $task->name printf "\tname:\t\t\t\t<%s>\n", $task->name end printf "\tcodelet:\t\t\t<%p>\n", $task->cl printf "\tcallback:\t\t\t<%p>\n", $task->callback_func printf "\tsynchronous:\t\t\t<%d>\n", $task->synchronous printf "\texecute_on_a_specific_worker:\t<%d>\n", $task->execute_on_a_specific_worker printf "\tworkerid:\t\t\t<%d>\n", $task->workerid printf "\tdetach:\t\t\t\t<%d>\n", $task->detach printf "\tdestroy:\t\t\t<%d>\n", $task->destroy printf "\tregenerate:\t\t\t<%d>\n", $task->regenerate printf "\tstatus:\t\t\t\t<%s>\n", $status printf "\tjob:\t\t\t\t<%p>\n", $job printf "\tndeps:\t\t\t\t<%u>\n", $job->job_successors->ndeps printf "\tndeps_completed:\t\t<%u>\n", $job->job_successors->ndeps_completed printf "\tnsuccs:\t\t\t\t<%u>\n", $job->job_successors->nsuccs if $job starpu-print-job $job end end define starpu-print-task-and-successor set language c set $t = (struct starpu_task *) ($arg0) starpu-print-task $t set $j = (struct _starpu_job *) $t->starpu_private set $nsuccs = $j->job_successors.nsuccs set $i = 0 while $i < $nsuccs set $cg = $j->job_successors.succ[$i] if ($cg->cg_type == 1) # STARPU_CG_APPS printf "waited for by application" end if ($cg->cg_type == 2) # STARPU_CG_TAG printf "will produce tag %x\n", $cg->succ.tag end if ($cg->cg_type == 4) # STARPU_CG_TASK printf "dep of task %p\n", $cg->succ.job starpu-print-task $cg->succ.job->task end set $i = $i + 1 end end document starpu-print-task Prints a StarPU task end define starpu-tasks-on-worker set language c set $worker=_starpu_config->workers[$arg0] set $task=$worker.local_tasks.head while $task != 0x0 starpu-print-task $task set $task=$task->next end end define starpu-tasks-on-workers set language c set $num=0 while $num<_starpu_config->topology->nworkers printf "Worker %s\n", _starpu_config->workers[$num].name starpu-tasks-on-worker $num set $num = $num + 1 end end define starpu-workers set language c set $num=0 printf "[Id] Name Arch Mask Devid Bindid Workerid Isrunning Isinitialized Status\n" while $num<_starpu_config->topology->nworkers set $worker=&_starpu_config->workers[$num] if $worker->status == STATUS_INVALID set $status="INVALID" end if $worker->status == STATUS_UNKNOWN set $status="UNKNOWN" end if $worker->status == STATUS_INITIALIZING set $status="INITIALIZING" end if $worker->status == STATUS_EXECUTING set $status="EXECUTING" end if $worker->status == STATUS_CALLBACK set $status="CALLBACK" end if $worker->status == STATUS_SCHEDULING set $status="SCHEDULING" end if $worker->status == STATUS_WAITING set $status="WAITING" end if $worker->status == STATUS_SLEEPING set $status="SLEEPING" end if $worker->status == STATUS_WAKING_UP set $status="WAKING_UP" end printf "[%2d] %-40s %-4d %-4d %-5d %-6d %-8d %-9d %-13d %s\n", $num, $worker->name, $worker->arch, $worker->worker_mask, \ $worker->devid, $worker->bindid, $worker->workerid, $worker->worker_is_running, $worker->worker_is_initialized, $status set $num = $num + 1 end end document starpu-workers Prints a list of the StarPU workers end define starpu-tags printf "tags htbl %p\n", tag_htbl printf "TODO\n" end define starpu-tasks set language c set $num=0 set $nsubmitted=0 set $nready=0 while $num<_starpu_config->topology->nsched_ctxs set $nsubmitted = $nsubmitted + _starpu_config->sched_ctxs[$num]->tasks_barrier->barrier->reached_start set $nready = $nready + _starpu_config->sched_ctxs[$num]->ready_tasks_barrier->barrier->reached_start set $num = $num + 1 end printf "%d submitted tasks\n", $nsubmitted printf "%d ready tasks\n", $nready printf "Tasks being run:\n" set $n = 0 while $n < _starpu_config.topology.nworkers printf "worker %d %s:\n", $n, _starpu_config.workers[$n].short_name if _starpu_config.workers[$n].pipeline_length > 0 set $m = 0 while $m < _starpu_config.workers[$n].ntasks set $t = _starpu_config.workers[$n].current_tasks[(_starpu_config.workers[$n].first_task + $m) % (sizeof(_starpu_config.workers[$n].current_tasks)/sizeof(_starpu_config.workers[$n].current_tasks[0]))] printf " task %p\n", $t set $m = $m + 1 end end set $task = _starpu_config.workers[$n].current_task if ($task) printf " task %p\n", $task end set $n = $n + 1 end if (tag_htbl) printf "TODO: tags\n" end print "TODO: complete\n" end define starpu-print-all-tasks set language c set $l = all_jobs_list->next while $l != &all_jobs_list set $j = (struct _starpu_job*) (((unsigned long) $l) - ((unsigned long) &((struct _starpu_job *)0)->all_submitted)) printf "task %p\n", $j->task starpu-print-task $j->task set $l = $l->next end end define starpu-all-tasks set language c set $l = all_jobs_list->next while $l != &all_jobs_list set $j = (struct _starpu_job*) (((unsigned long) $l) - ((unsigned long) &((struct _starpu_job *)0)->all_submitted)) printf "task %p\n", $j->task set $l = $l->next end end define starpu printf "Here I am...\n" end define starpu-print-mode if ($arg0 & 1) printf "R" end if ($arg0 & 2) printf "W" end if ($arg0 & 4) printf " SCRATCH" end if ($arg0 & 8) printf " REDUX" end end define starpu-print-data set language c set $data = (starpu_data_handle_t) $arg0 printf "Data handle %p\n", $data if $data->ops->interfaceid == 0 printf "Matrix\n" end if $data->ops->interfaceid == 1 printf "Block\n" end if $data->ops->interfaceid == 2 printf "Vector\n" end if $data->ops->interfaceid == 3 printf "CSR\n" end if $data->ops->interfaceid == 4 printf "BCSR\n" end if $data->ops->interfaceid == 5 printf "Variable\n" end if $data->ops->interfaceid == 6 printf "Void\n" end if $data->ops->interfaceid == 7 printf "Multiformat\n" end if $data->ops->interfaceid == 8 printf "COO\n" end if $data->ops->interfaceid > 8 printf "Interface id %d\n", $data->ops->interfaceid end printf "Home node %d\n", $data->home_node printf "RWlock refs %d\n", $data->refcnt printf "Busy count %d\n", $data->busy_count printf "Current mode " starpu-print-mode $data->current_mode printf "\n" if $data->current_mode & (4|8) set $n = 0 while $n < _starpu_config.topology.nworkers set $replicate = $data->per_worker[$n] printf "Worker %2d %10s:", $n, _starpu_config->workers[$n]->name if $replicate.state == 0 printf " OWNER" end if $replicate.state == 1 printf " SHARED" end if $replicate.state == 2 printf " INVALID" end if $replicate.initialized printf " initialized" end printf "\n" set $n = $n + 1 end else set $n = 0 while $n < _starpu_descr.nnodes set $replicate = &$data->per_node[$n] printf "Node %2d (%2d):", $n, $replicate->refcnt if $replicate.state == 0 printf " OWNER" end if $replicate.state == 1 printf " SHARED" end if $replicate.state == 2 printf " INVALID" end if $replicate.initialized printf " initialized" end printf "\n" set $m = 0 while $m < _starpu_descr.nnodes if $replicate->request[$m] printf " request %p from %d\n", $replicate->request[$m], $m end set $m = $m + 1 end set $n = $n + 1 end set $r = $data->write_invalidation_req if $r printf "w_req %p for %d\n", $r, $r->dst_replicate->memory_node end end printf "Post sync tasks\n" set $tasklist = $data->post_sync_tasks while $tasklist != 0x0 starpu-print-task $tasklist->task set $tasklist = $tasklist->next end printf "Requester tasks\n" set $requesterlist = $data->req_list._head while $requesterlist != 0x0 printf "mode: " starpu-print-mode $requesterlist->mode printf "\n" starpu-print-job $requesterlist->j set $requesterlist = $requesterlist->_next end printf "Arbitered requester tasks\n" set $requesterlist = $data->arbitered_req_list._head while $requesterlist != 0x0 printf "mode: " starpu-print-mode $requesterlist->mode printf "\n" starpu-print-job $requesterlist->j set $requesterlist = $requesterlist->_next end if ($data->nchildren) printf "%d children\n", $data->nchildren end end define starpu-print-datas set $entry = registered_handles while $entry starpu-print-data $entry->handle printf "\n" set $entry = (struct handle_entry *) $entry.hh.next end end define starpu-print-datas-summary set language c set $entry = registered_handles set $data_n = 0 set $pw_data_n = 0 set $data_n_allocated = 0 set $replicate_n_owners = 0 set $replicate_n_shared = 0 set $replicate_n_invalid = 0 set $replicate_n_initialized = 0 set $replicate_n_allocated = 0 set $pw_replicate_n_owners = 0 set $pw_replicate_n_shared = 0 set $pw_replicate_n_invalid = 0 set $pw_replicate_n_initialized = 0 set $pw_replicate_n_allocated = 0 while $entry set $data = (starpu_data_handle_t) $entry->handle if $data->current_mode & (4|8) set $pw_data_n = $pw_data_n + 1 set $n = 0 while $n < _starpu_config.topology.nworkers set $replicate = $data->per_worker[$n] if $replicate.state == 0 set $pw_replicate_n_owners = $pw_replicate_n_owners + 1 end if $replicate.state == 1 set $pw_replicate_n_shared = $pw_replicate_n_shared + 1 end if $replicate.state == 2 set $pw_replicate_n_invalid = $pw_replicate_n_invalid + 1 end if $replicate.initialized set $pw_replicate_n_initialized = $pw_replicate_n_initialized + 1 end if $replicate.allocated set $pw_replicate_n_allocated = $pw_replicate_n_allocated + 1 end set $n = $n + 1 end else set $data_n = $data_n + 1 set $n = 0 while $n < _starpu_descr.nnodes set $replicate = &$data->per_node[$n] if $replicate.state == 0 set $replicate_n_owners = $replicate_n_owners + 1 end if $replicate.state == 1 set $replicate_n_shared = $replicate_n_shared + 1 end if $replicate.state == 2 set $replicate_n_invalid = $replicate_n_invalid + 1 end if $replicate.initialized set $replicate_n_initialized = $replicate_n_initialized + 1 end if $replicate.allocated set $replicate_n_allocated = $replicate_n_allocated + 1 set $data_allocated = 1 end set $n = $n + 1 end if $data_allocated set $data_n_allocated = $data_n_allocated + 1 end end set $entry = (struct handle_entry *) $entry.hh.next end printf "Number of handles: %d\n", $data_n printf "Number of allocated handles: %d\n", $data_n_allocated printf "Number of OWNER replicates: %d\n", $replicate_n_owners printf "Number of SHARED replicates: %d\n", $replicate_n_shared printf "Number of INVALID replicates: %d\n", $replicate_n_invalid printf "Number of initialized replicates: %d\n", $replicate_n_initialized printf "Number of allocated replicates: %d\n", $replicate_n_allocated printf "Number of per-worker handles: %d\n", $pw_data_n printf "Number of OWNER per-worker replicates: %d\n", $pw_replicate_n_owners printf "Number of SHARED per-worker replicates: %d\n", $pw_replicate_n_shared printf "Number of INVALID per-worker replicates: %d\n", $pw_replicate_n_invalid printf "Number of initialized per-worker replicates: %d\n", $pw_replicate_n_initialized printf "Number of allocated per-worker replicates: %d\n", $pw_replicate_n_allocated end define starpu-print-request set $r = (struct _starpu_data_request *)$arg0 printf "Request %p\n", $r printf "Refcnt %d\n", $r->refcnt printf "Handle %p\n", $r->handle printf "src_replicate %p\n", $r->src_replicate printf "dst_replicate %p\n", $r->dst_replicate printf "handling_node %d\n", $r->handling_node if ($r->mode & 1) printf "R" end if ($r->mode & 2) printf "W" end if ($r->mode & 4) printf "S" end if ($r->mode & 8) printf "X" end printf "\n" printf "completed: %d\n", $r->completed printf "prefetch: %d\n", $r->prefetch printf "retval: %d\n", $r->retval printf "ndeps: %d\n", $r->ndeps printf "next_req_count: %d\n", $r->next_req_count printf "comid: %u\n", $r->com_id set $c = $r->callbacks while $c != 0 printf "callback: %p %p\n", $c->callback_func, $c->callback_arg set $c = $c->next end end define starpu-print-requests set $node = 0 while $node < _starpu_descr.nnodes printf "Node %u:\n", $node set $request = data_requests[$node]._head while $request != 0 printf " Request %p: handle %p ", $request, $request->handle starpu-print-mode $request->mode printf "\n" set $request = $request->_next end set $node = $node + 1 end end define starpu-print-prequests set $node = 0 while $node < _starpu_descr.nnodes printf "Node %u:\n", $node printf "%u pending requests\n", data_requests_npending[$node] set $request = data_requests_pending[$node]._head while $request != 0 printf " Request %p: handle %p ", $request, $request->handle starpu-print-mode $request->mode printf "\n" set $request = $request->_next end set $node = $node + 1 end end define starpu-print-arch set $arch = (struct starpu_perfmodel_arch *)$arg0 set $device = 0 while $device < $arch->ndevices printf " Device type %d - devid: %d - ncores: %d\n", $arch->devices[$device].type, $arch->devices[$device].devid, $arch->devices[$device].ncores set $device = $device + 1 end end define starpu-print-archs set $comb = 0 while $comb < current_arch_comb printf "Combination %d with %d devices\n", $comb, arch_combs[$comb]->ndevices starpu-print-arch arch_combs[$comb] set $comb = $comb + 1 end end define starpu-print-frequests set $node = 0 while $node < _starpu_descr.nnodes printf "Node %u:\n", $node set $request = prefetch_requests[$node]._head while $request != 0 printf " Request %p: handle %p ", $request, $request->handle starpu-print-mode $request->mode printf "\n" set $request = $request->_next end set $node = $node + 1 end end define starpu-print-irequests set $node = 0 while $node < _starpu_descr.nnodes printf "Node %u:\n", $node set $request = idle_requests[$node]._head while $request != 0 printf " Request %p: handle %p ", $request, $request->handle starpu-print-mode $request->mode printf "\n" set $request = $request->_next end set $node = $node + 1 end end define starpu-memusage set scheduler-locking on set $node = 0 while $node < _starpu_descr.nnodes printf "\n\nNode %u:\n", $node set $total = 0 set $total_b = 0 set $wt = 0 set $wt_b = 0 set $home = 0 set $home_b = 0 set $redux = 0 set $redux_b = 0 set $relax = 0 set $relax_b = 0 set $noref = 0 set $noref_b = 0 set $nodataref = 0 set $nodataref_b = 0 set $nosubdataref = 0 set $nosubdataref_b = 0 set $mc = mc_list[$node]->_head while $mc != 0 set $handle = $mc->data set $size = _starpu_data_get_size($handle) set $total = $total + 1 set $total_b = $total_b + $size if $handle->wt_mask & (1 << $node) set $wt = $wt + 1 set $wt_b = $wt_b + $size end if $node == $handle->home_node set $home = $home + 1 set $home_b = $home_b + $size end if $mc->relaxed_coherency == 2 set $redux = $redux + 1 set $redux_b = $redux_b + $size end if $mc->relaxed_coherency == 1 set $relax = $relax + 1 set $relax_b = $relax_b + $size if $mc->replicate if $mc->replicate->refcnt == 0 set $noref = $noref + 1 set $noref_b = $noref_b + $size end end end if $mc->relaxed_coherency == 0 if (may_free_subtree($handle,$node)) set $nosubdataref = $nosubdataref + 1 set $nosubdataref_b = $nosubdataref_b + $size end if $handle->per_node[$node].refcnt == 0 set $nodataref = $nodataref + 1 set $nodataref_b = $nodataref_b + $size end end set $mc = $mc->_next end printf " Total used: %u, %uMiB\n", $total, $total_b / 1048576 printf " WT: %u, %uMiB\n", $wt, $wt_b / 1048576 printf " home: %u, %uMiB\n", $home, $home_b / 1048576 printf " redux: %u, %uMiB\n", $redux, $redux_b / 1048576 printf " relax: %u, %uMiB\n", $relax, $relax_b / 1048576 printf " noref: %u, %uMiB\n", $noref, $noref_b / 1048576 printf " nosubdataref: %u, %uMiB\n", $nosubdataref, $nosubdataref_b / 1048576 printf " nodataref: %u, %uMiB\n", $nodataref, $nodataref_b / 1048576 printf "\n cached: %u, %uMiB\n", mc_cache_nb[$node], mc_cache_size[$node] / 1048576 set $node = $node + 1 end end define starpu-print-model set $model = (struct starpu_perfmodel *)$arg0 printf "Model %p type %d symbol ", $model, $model->type if $model->symbol printf "%s", $model->symbol else printf "NULL" end printf "\n" end define starpu-print-registered-models set $node = registered_models while $node starpu-print-model $node->model set $node = $node->next end end define starpu-mpi-print-request set $request = (struct _starpu_mpi_req *)$arg0 set $request_type = "unknown_type" if $request->request_type == SEND_REQ set $request_type = "SEND_REQ" end if $request->request_type == RECV_REQ set $request_type = "RECV_REQ" end if $request->request_type == WAIT_REQ set $request_type = "WAIT_REQ" end if $request->request_type == TEST_REQ set $request_type = "TEST_REQ" end if $request->request_type == BARRIER_REQ set $request_type = "BARRIER_REQ" end if $request->request_type == PROBE_REQ set $request_type = "PROBE_REQ" end if $request->request_type == UNKNOWN_REQ set $request_type = "UNKNOWN_REQ" end printf "Request (struct _starpu_mpi_req *) %p data %p tag %d to MPI node %d type %s submitted %d completed %d posted %d detached %d is_internal_req %d\n", $request, $request->data_handle, $request->data_handle ? ((struct _starpu_mpi_node_tag *) ($request->data_handle->mpi_data))->data_tag : -1, $request->node_tag.rank, $request_type, $request->submitted, $request->completed, $request->posted, $request->detached, $request->is_internal_req end define starpu-mpi-print-ready-requests set $list = (struct _starpu_mpi_req_list *) ready_requests if $list set $request = $list->_head while $request starpu-mpi-print-request $request set $request = $request->_next end else printf "No ready requests\n" end end define starpu-mpi-print-detached-requests set $list = (struct _starpu_mpi_req_list *) detached_requests if $list set $request = $list->_head while $request starpu-mpi-print-request $request set $request = $request->_next end else printf "No detached requests\n" end end define starpu-mpi-print-early-data set $hash = (struct _starpu_mpi_early_data_handle_hashlist *)_starpu_mpi_early_data_handle_hashmap if $hash while $hash printf "Communicator %p Rank %d Data_tag %d\n", $hash->node_tag->comm, $hash->node_tag->rank, $hash->node_tag->data_tag set $list = (struct _starpu_mpi_early_data_handle_list *) $hash->list if $list set $data = (struct _starpu_mpi_early_data_handle *)$list->_head while $data starpu-mpi-print-request $data->req set $data = $data->_next end end set $hash = (struct _starpu_mpi_early_data_handle_hashlist *) $hash->hh.next end else printf "No early data\n" end end define starpu-mpi-print-early-requests set $hash = (struct _starpu_mpi_early_request_hashlist *)_starpu_mpi_early_request_hash if $hash while $hash printf "Communicator %p Rank %d Data_tag %d\n", $hash->node_tag->comm, $hash->node_tag->rank, $hash->node_tag->data_tag set $list = (struct _starpu_mpi_req_list*) $hash->list if $list set $request = $list->_head while $request starpu-mpi-print-request $request set $request = $request->_next end end set $hash = (struct _starpu_mpi_early_request_hashlist *) $hash->hh.next end else printf "No early request\n" end end define starpu-mpi-print-sync-data set $hash = (struct _starpu_mpi_sync_data_handle_hashlist *)_starpu_mpi_sync_data_handle_hashmap if $hash while $hash printf "Communicator %p Rank %d Data_tag %d\n", $hash->node_tag->comm, $hash->node_tag->rank, $hash->node_tag->data_tag set $list = (struct _starpu_mpi_req_list *) $hash->list if $list set $request = $list->_head while $request starpu-mpi-print-request $request set $request = $request->_next end end set $hash = (struct _starpu_mpi_sync_data_handle_hashlist *) $hash->hh.next end else printf "No sync data\n" end end document starpu List of StarPU-specific gdb functions: starpu-workers prints a list of the StarPU workers starpu-tasks-on-workers prints a list of the tasks queued on workers starpu-tasks-on-worker prints a list of the tasks queued on the given worker starpu-print-job prints a StarPU job starpu-print-task prints a StarPU task starpu-print-all-tasks prints all StarPU tasks starpu-print-task-and-successor prints a StarPU task and its successors starpu-print-data prints a StarPU data handle starpu-print-datas prints all StarPU data handles starpu-print-datas-summary prints a summary of data handles starpu-print-request prints a StarPU data request starpu-print-prequests prints all pending StarPU data requests starpu-print-requests prints all queued StarPU data requests starpu-print-frequests prints all queued StarPU prefetch data requests starpu-print-irequests prints all queued StarPU idle data requests starpu-tasks prints a summary of the tasks flowing in StarPU starpu-all-tasks prints a list of all the tasks flowing in StarPU starpu-tags prints a list of the tags known to StarPU starpu-memusage prints the memory node usage starpu-print-archs prints all known arch combinations starpu-print-arch prints a given arch combination starpu-print-registered-models prints all registered performance models starpu-print-model prints a given performance model starpu-mpi-print-ready-requests prints all MPI ready requests starpu-mpi-print-detached-requests prints all MPI detached requests starpu-mpi-print-early-data prints all MPI early received data starpu-mpi-print-early-requests prints all MPI early requests starpu-mpi-print-sync-data prints all MPI sync data end starpu-1.2.3+dfsg/tools/msvc/000077500000000000000000000000001320135501600160565ustar00rootroot00000000000000starpu-1.2.3+dfsg/tools/msvc/starpu.sln000077500000000000000000000015721320135501600201220ustar00rootroot00000000000000 Microsoft Visual Studio Solution File, Format Version 11.00 # Visual C++ Express 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "starpu", "starpu\starpu.vcxproj", "{1A4DC8EB-1250-4DC5-B3CE-2E4BB4C51CA3}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {1A4DC8EB-1250-4DC5-B3CE-2E4BB4C51CA3}.Debug|Win32.ActiveCfg = Debug|Win32 {1A4DC8EB-1250-4DC5-B3CE-2E4BB4C51CA3}.Debug|Win32.Build.0 = Debug|Win32 {1A4DC8EB-1250-4DC5-B3CE-2E4BB4C51CA3}.Release|Win32.ActiveCfg = Release|Win32 {1A4DC8EB-1250-4DC5-B3CE-2E4BB4C51CA3}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal starpu-1.2.3+dfsg/tools/msvc/starpu/000077500000000000000000000000001320135501600173745ustar00rootroot00000000000000starpu-1.2.3+dfsg/tools/msvc/starpu/starpu.vcxproj000077500000000000000000000102551320135501600223350ustar00rootroot00000000000000 Debug Win32 Release Win32 {1A4DC8EB-1250-4DC5-B3CE-2E4BB4C51CA3} Win32Proj starpu Application true Unicode Application false true Unicode true false NotUsing Level3 Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) $(STARPU_PATH)\include\starpu\1.2;%(AdditionalIncludeDirectories) Console true $(STARPU_PATH)\lib;%(AdditionalLibraryDirectories) libstarpu-1.2.lib;%(AdditionalDependencies) Level3 Use MaxSpeed true true WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) Console true true true starpu-1.2.3+dfsg/tools/msvc/starpu_clean.bat000066400000000000000000000015301320135501600212250ustar00rootroot00000000000000@ECHO OFF REM StarPU --- Runtime system for heterogeneous multicore architectures. REM REM Copyright (C) 2013, 2014 CNRS REM REM StarPU is free software; you can redistribute it and/or modify REM it under the terms of the GNU Lesser General Public License as published by REM the Free Software Foundation; either version 2.1 of the License, or (at REM your option) any later version. REM REM StarPU is distributed in the hope that it will be useful, but REM WITHOUT ANY WARRANTY; without even the implied warranty of REM MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. REM REM See the GNU Lesser General Public License in COPYING.LGPL for more details. TITLE MSVC StarPU Cleaning ECHO. ECHO MSVC StarPU Cleaning ECHO. FOR %%d in (debug starpu\debug ipch) DO IF EXIST %%d RMDIR /S /Q %%d FOR %%f in (starpu.sdf starpu.suo) DO IF EXIST %%f DEL %%f starpu-1.2.3+dfsg/tools/msvc/starpu_exec.bat000066400000000000000000000024251320135501600210730ustar00rootroot00000000000000@ECHO OFF REM StarPU --- Runtime system for heterogeneous multicore architectures. REM REM Copyright (C) 2013, 2014, 2015, 2017 CNRS REM REM StarPU is free software; you can redistribute it and/or modify REM it under the terms of the GNU Lesser General Public License as published by REM the Free Software Foundation; either version 2.1 of the License, or (at REM your option) any later version. REM REM StarPU is distributed in the hope that it will be useful, but REM WITHOUT ANY WARRANTY; without even the implied warranty of REM MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. REM REM See the GNU Lesser General Public License in COPYING.LGPL for more details. TITLE MSVC StarPU Execution ECHO. ECHO MSVC StarPU Execution IF "%1" == "" GOTO invalidparam IF NOT EXIST %1 GOTO invalidparam call .\starpu_var.bat mkdir starpu FOR %%F IN (%STARPU_PATH%\bin\*dll) DO COPY %%F starpu\%%~nF FOR %%F IN (%HWLOC%\bin\*dll) DO COPY %%F starpu set STARPU_OLDPATH=%PATH% call "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat" x86 cl %1 %STARPU_CFLAGS% %STARPU_LDFLAGS% set PATH=starpu;c:\MinGW\bin;%PATH% .\%~n1.exe set PATH=%STARPU_OLDPATH% GOTO end :invalidparam ECHO. ECHO Syntax error. You need to give the name of a StarPU application EXIT /B 2 GOTO end :end starpu-1.2.3+dfsg/tools/msvc/starpu_open.bat000066400000000000000000000027041320135501600211100ustar00rootroot00000000000000@ECHO OFF REM StarPU --- Runtime system for heterogeneous multicore architectures. REM REM Copyright (C) 2013, 2014 CNRS REM REM StarPU is free software; you can redistribute it and/or modify REM it under the terms of the GNU Lesser General Public License as published by REM the Free Software Foundation; either version 2.1 of the License, or (at REM your option) any later version. REM REM StarPU is distributed in the hope that it will be useful, but REM WITHOUT ANY WARRANTY; without even the implied warranty of REM MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. REM REM See the GNU Lesser General Public License in COPYING.LGPL for more details. TITLE MSVC StarPU Execution ECHO. ECHO MSVC StarPU Execution IF NOT EXIST %STARPU_PATH%\AUTHORS GOTO starpunotfound ECHO. ECHO %STARPU_PATH% IF "%1" == "" GOTO invalidparam IF NOT EXIST %1 GOTO invalidparam COPY %1 starpu\starpu_appli.c FOR %%F IN (%STARPU_PATH%\bin\*dll) DO COPY %%F starpu\%%~nF FOR %%F IN (%STARPU_PATH%\bin\*dll) DO COPY %%F starpu COPY c:\MinGW\bin\pthreadGC2.dll starpu IF EXIST Debug RMDIR /S /Q Debug IF EXIST starpu\Debug RMDIR /S /Q starpu\Debug "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\VCExpress.exe" starpu.sln GOTO end :invalidparam ECHO. ECHO Syntax error. You need to give the name of a StarPU application GOTO end :starpunotfound ECHO. ECHO You need to set the variable STARPU_PATH to a valid StarPU installation directory GOTO end :end starpu-1.2.3+dfsg/tools/msvc/starpu_var.bat000066400000000000000000000022341320135501600207350ustar00rootroot00000000000000@ECHO OFF REM StarPU --- Runtime system for heterogeneous multicore architectures. REM REM Copyright (C) 2013, 2014 CNRS REM REM StarPU is free software; you can redistribute it and/or modify REM it under the terms of the GNU Lesser General Public License as published by REM the Free Software Foundation; either version 2.1 of the License, or (at REM your option) any later version. REM REM StarPU is distributed in the hope that it will be useful, but REM WITHOUT ANY WARRANTY; without even the implied warranty of REM MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. REM REM See the GNU Lesser General Public License in COPYING.LGPL for more details. TITLE MSVC StarPU Environment ECHO. ECHO MSVC StarPU Environment IF NOT EXIST %STARPU_PATH%\AUTHORS GOTO starpunotfound ECHO. ECHO Setting environment from %STARPU_PATH% set STARPU_LIBDIR=%STARPU_PATH%/lib set STARPU_INCLUDEDIR=%STARPU_PATH%/include set STARPU_CFLAGS=/I%STARPU_INCLUDEDIR%\starpu\1.2 set STARPU_LDFLAGS=/link %STARPU_PATH%\lib\libstarpu-1.2.lib GOTO end :starpunotfound ECHO. ECHO You need to set the variable STARPU_PATH to a valid StarPU installation directory exit /B 1 GOTO end :end starpu-1.2.3+dfsg/tools/msvc/starpu_var.bat.in000066400000000000000000000023401320135501600213400ustar00rootroot00000000000000@ECHO OFF REM StarPU --- Runtime system for heterogeneous multicore architectures. REM REM Copyright (C) 2013, 2014 CNRS REM REM StarPU is free software; you can redistribute it and/or modify REM it under the terms of the GNU Lesser General Public License as published by REM the Free Software Foundation; either version 2.1 of the License, or (at REM your option) any later version. REM REM StarPU is distributed in the hope that it will be useful, but REM WITHOUT ANY WARRANTY; without even the implied warranty of REM MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. REM REM See the GNU Lesser General Public License in COPYING.LGPL for more details. TITLE MSVC StarPU Environment ECHO. ECHO MSVC StarPU Environment IF NOT EXIST %STARPU_PATH%\AUTHORS GOTO starpunotfound ECHO. ECHO Setting environment from %STARPU_PATH% set STARPU_LIBDIR=%STARPU_PATH%/lib set STARPU_INCLUDEDIR=%STARPU_PATH%/include set STARPU_CFLAGS=/I%STARPU_INCLUDEDIR%\starpu\@STARPU_EFFECTIVE_VERSION@ @STARPU_CUDA_CPPFLAGS@ set STARPU_LDFLAGS=/link %STARPU_PATH%\lib\libstarpu-@STARPU_EFFECTIVE_VERSION@.lib GOTO end :starpunotfound ECHO. ECHO You need to set the variable STARPU_PATH to a valid StarPU installation directory exit /B 1 GOTO end :end starpu-1.2.3+dfsg/tools/perfmodels/000077500000000000000000000000001320135501600172465ustar00rootroot00000000000000starpu-1.2.3+dfsg/tools/perfmodels/README000066400000000000000000000032731320135501600201330ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014-2016 Université de Bordeaux # Copyright (C) 2014 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # This directory contains performance models for given architectures and examples. The architecture 'mirage' is composed of: - 2 Intel Xeon X5650 @2.67GHz, thus 12 CPU cores - MKL 11.1.3 - 3 NVidia GF100 Tesla M2070, thus 3 GPUs - CUDA 6.0 - Magma 1.6.0 The architecture 'attila' is composed of: - 2 Intel Xeon X5650 @2.67GHz, thus 12 CPU cores - OpenBlas 0.2.12-1 - 3 NVidia GF100 Tesla C2050, thus 3 GPUs - CUDA 6.0 The architecture 'idgraf' is composed of: - 2 Intel Xeon X5650 @2.67GHz, thus 12 CPU cores - MKL 11.1.0 - 8 NVIDIA GF100 Tesla C2050, thus 8 GPUs - CUDA 6.0 The architecture 'sirocco' is composed of: - 2 Intel Xeon E5-2680 @2.50GHz, thus 24 CPU cores - MKL 11.2 - 4 NVIDIA GK110BGL Tesla K40m, thus 4 GPUs - CUDA 6.5 To use performance models stored in this directory, one needs to set the environment variable 'STARPU_PERF_MODEL_DIR' to the location of the directory, e.g.: export STARPU_PERF_MODEL_DIR=.../tools/perfmodels/sampling and then select the desired architecture: export STARPU_HOSTNAME=mirage starpu-1.2.3+dfsg/tools/perfmodels/sampling/000077500000000000000000000000001320135501600210605ustar00rootroot00000000000000starpu-1.2.3+dfsg/tools/perfmodels/sampling/bus/000077500000000000000000000000001320135501600216515ustar00rootroot00000000000000starpu-1.2.3+dfsg/tools/perfmodels/sampling/bus/attila.affinity000066400000000000000000000003631320135501600246640ustar00rootroot00000000000000# GPU CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 CPU8 CPU9 CPU10 CPU11 0 0 1 2 3 4 5 6 7 8 9 10 11 1 0 1 2 3 4 5 6 7 8 9 10 11 2 0 1 2 3 4 5 6 7 8 9 10 11 0 0 1 2 3 4 5 6 7 8 9 10 11 1 0 1 2 3 4 5 6 7 8 9 10 11 2 0 1 2 3 4 5 6 7 8 9 10 11 starpu-1.2.3+dfsg/tools/perfmodels/sampling/bus/attila.bandwidth000066400000000000000000000111141320135501600250130ustar00rootroot00000000000000# to 0 to 1 to 2 to 3 to 4 to 5 to 6 to 7 to 8 to 9 to 10 to 11 to 12 to 13 to 14 to 15 to 16 to 17 to 18 to 19 to 20 to 21 to 22 to 23 to 24 to 25 to 26 to 27 to 28 to 29 to 30 to 31 0.000000 6008.942513 6015.054829 5191.265149 3549.286897 4151.586883 4150.380415 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 6526.606701 0.000000 5296.854371 3827.552062 2299.031785 2537.486754 2537.035995 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 6526.729932 5297.158728 0.000000 3836.700007 2299.047076 2537.505381 2537.054615 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4533.335723 3081.579529 3082.603074 0.000000 1990.703988 2167.035675 2166.706914 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3931.561374 2376.592429 2377.547977 2237.220832 0.000000 2019.289776 2019.004313 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4431.559719 2550.546612 2551.647193 2390.711859 1970.828109 0.000000 2143.181889 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4121.971523 2444.862313 2445.873558 2297.616593 1907.126408 2068.363099 0.000000 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan starpu-1.2.3+dfsg/tools/perfmodels/sampling/bus/attila.config000066400000000000000000000001761320135501600243220ustar00rootroot00000000000000# Current configuration 12 # Number of CPUs 3 # Number of CUDA devices 3 # Number of OpenCL devices 0 # Number of MIC devices starpu-1.2.3+dfsg/tools/perfmodels/sampling/bus/attila.latency000066400000000000000000000107641320135501600245200ustar00rootroot00000000000000# to 0 to 1 to 2 to 3 to 4 to 5 to 6 to 7 to 8 to 9 to 10 to 11 to 12 to 13 to 14 to 15 to 16 to 17 to 18 to 19 to 20 to 21 to 22 to 23 to 24 to 25 to 26 to 27 to 28 to 29 to 30 to 31 0.000000 9.500836 9.473047 10.237367 9.863812 9.678141 10.473812 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 10.286836 0.000000 14.883266 24.716781 20.150648 19.964977 20.760648 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 10.005258 14.426969 0.000000 24.677023 19.869070 19.683398 20.479070 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 11.149320 20.650156 20.622367 0.000000 21.013133 20.827461 21.623133 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 14.257031 23.757867 23.730078 24.494398 0.000000 23.935172 24.730844 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 13.983570 23.484406 23.456617 24.220938 23.847383 0.000000 24.457383 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 14.954109 24.454945 24.427156 25.191477 24.817922 24.632250 0.000000 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan starpu-1.2.3+dfsg/tools/perfmodels/sampling/bus/attila.platform.v4.xml000066400000000000000000000252341320135501600260320ustar00rootroot00000000000000 starpu-1.2.3+dfsg/tools/perfmodels/sampling/bus/attila.platform.xml000066400000000000000000000247361320135501600255100ustar00rootroot00000000000000 starpu-1.2.3+dfsg/tools/perfmodels/sampling/bus/idgraf.affinity000066400000000000000000000004551320135501600246440ustar00rootroot00000000000000# GPU CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 CPU8 CPU9 CPU10 CPU11 0 0 1 2 3 4 5 6 7 8 9 10 11 1 0 1 2 3 4 5 6 7 8 9 10 11 2 0 1 2 3 4 5 6 7 8 9 10 11 3 0 1 2 3 4 5 6 7 8 9 10 11 4 6 7 8 9 10 11 0 1 2 3 4 5 5 6 7 8 9 10 11 0 1 2 3 4 5 6 6 7 8 9 10 11 0 1 2 3 4 5 7 6 7 8 9 10 11 0 1 2 3 4 5 starpu-1.2.3+dfsg/tools/perfmodels/sampling/bus/idgraf.bandwidth000066400000000000000000000033261320135501600247770ustar00rootroot00000000000000# to 0 to 1 to 2 to 3 to 4 to 5 to 6 to 7 to 8 to 9 to 10 to 11 to 12 to 13 to 14 to 15 0.000000 5985.150529 5982.867814 6004.601450 6002.864228 6017.068835 6017.279500 6014.519783 6025.792854 nan nan nan nan nan nan nan 6518.853316 0.000000 6634.627873 5290.661415 5290.656130 3070.759552 3077.363038 3081.101044 3071.316544 nan nan nan nan nan nan nan 6507.263283 6634.402756 0.000000 5290.497370 5290.566592 3070.780185 3077.514743 3081.028777 3071.425106 nan nan nan nan nan nan nan 6468.888505 5290.537572 5290.537715 0.000000 6634.508569 3071.001714 3077.753708 3081.299378 3071.319606 nan nan nan nan nan nan nan 6379.975977 5290.504747 5290.535878 6634.456149 0.000000 3070.823130 3077.536005 3081.267119 3071.334077 nan nan nan nan nan nan nan 6520.767791 3803.989690 3804.097536 3799.684659 3800.145340 0.000000 6635.277188 5293.782380 5293.769441 nan nan nan nan nan nan nan 6520.979807 3803.774735 3804.546566 3799.981880 3800.522991 6635.252627 0.000000 5293.483381 5293.507488 nan nan nan nan nan nan nan 6520.981045 3803.433709 3804.330189 3799.708364 3800.220748 5293.757566 5293.607121 0.000000 6635.079661 nan nan nan nan nan nan nan 6518.969813 3803.670471 3803.908300 3799.582824 3800.130361 5293.416171 5293.465355 6635.049331 0.000000 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan starpu-1.2.3+dfsg/tools/perfmodels/sampling/bus/idgraf.config000066400000000000000000000001761320135501600243000ustar00rootroot00000000000000# Current configuration 12 # Number of CPUs 8 # Number of CUDA devices 0 # Number of OpenCL devices 0 # Number of MIC devices starpu-1.2.3+dfsg/tools/perfmodels/sampling/bus/idgraf.latency000066400000000000000000000031061320135501600244660ustar00rootroot00000000000000# to 0 to 1 to 2 to 3 to 4 to 5 to 6 to 7 to 8 to 9 to 10 to 11 to 12 to 13 to 14 to 15 0.000000 11.018609 10.962211 10.954469 11.007844 11.005922 11.098250 11.109961 11.063805 nan nan nan nan nan nan nan 11.927148 0.000000 18.151891 18.879328 18.799250 28.088742 27.684023 27.682789 27.425391 nan nan nan nan nan nan nan 11.955969 18.258547 0.000000 18.841516 18.742984 27.801375 27.632695 27.804492 27.925742 nan nan nan nan nan nan nan 11.869312 18.796500 18.733070 0.000000 18.166664 27.588664 27.297711 27.356961 27.379555 nan nan nan nan nan nan nan 11.895391 18.823414 18.725125 18.160563 0.000000 27.561664 27.485000 27.345914 27.047594 nan nan nan nan nan nan nan 12.104258 27.886172 28.017508 27.861555 27.938109 0.000000 17.586773 18.179898 18.207852 nan nan nan nan nan nan nan 12.097562 28.033187 27.980211 27.902445 28.026523 17.499156 0.000000 18.177344 18.203297 nan nan nan nan nan nan nan 12.132922 27.677352 27.910406 27.592461 27.664289 18.172375 18.238891 0.000000 17.600648 nan nan nan nan nan nan nan 12.117094 23.135703 23.079305 23.071563 23.124938 23.123016 23.215344 23.227055 0.000000 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan starpu-1.2.3+dfsg/tools/perfmodels/sampling/bus/idgraf.platform.v4.xml000066400000000000000000002025321320135501600260060ustar00rootroot00000000000000 starpu-1.2.3+dfsg/tools/perfmodels/sampling/bus/idgraf.platform.xml000066400000000000000000002014561320135501600254620ustar00rootroot00000000000000 starpu-1.2.3+dfsg/tools/perfmodels/sampling/bus/mirage.affinity000066400000000000000000000003631320135501600246520ustar00rootroot00000000000000# GPU CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 CPU8 CPU9 CPU10 CPU11 0 0 1 2 3 4 5 6 7 8 9 10 11 1 6 7 8 9 10 11 0 1 2 3 4 5 2 6 7 8 9 10 11 0 1 2 3 4 5 0 0 1 2 3 4 5 6 7 8 9 10 11 1 6 7 8 9 10 11 0 1 2 3 4 5 2 6 7 8 9 10 11 0 1 2 3 4 5 starpu-1.2.3+dfsg/tools/perfmodels/sampling/bus/mirage.bandwidth000066400000000000000000000111141320135501600250010ustar00rootroot00000000000000# to 0 to 1 to 2 to 3 to 4 to 5 to 6 to 7 to 8 to 9 to 10 to 11 to 12 to 13 to 14 to 15 to 16 to 17 to 18 to 19 to 20 to 21 to 22 to 23 to 24 to 25 to 26 to 27 to 28 to 29 to 30 to 31 0.000000 6030.996807 6011.099701 6023.264949 4533.752864 4530.361672 4457.700383 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 6517.591026 0.000000 3074.666060 3073.669260 2673.805763 2672.625905 2647.170533 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 6517.940403 3834.443072 0.000000 5296.205823 2673.864562 2672.684652 2647.228166 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 6517.196551 3831.214832 5296.294945 0.000000 2673.739370 2672.559571 2647.105457 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4380.832064 2537.573804 2534.044575 2536.203977 0.000000 2227.171158 2209.465982 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4385.089408 2539.001663 2535.468464 2537.630294 2229.091070 0.000000 2210.548390 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4367.520334 2533.101675 2529.584866 2531.736671 2224.542196 2223.725456 0.000000 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan starpu-1.2.3+dfsg/tools/perfmodels/sampling/bus/mirage.config000066400000000000000000000001761320135501600243100ustar00rootroot00000000000000# Current configuration 12 # Number of CPUs 3 # Number of CUDA devices 3 # Number of OpenCL devices 0 # Number of MIC devices starpu-1.2.3+dfsg/tools/perfmodels/sampling/bus/mirage.latency000066400000000000000000000107651320135501600245070ustar00rootroot00000000000000# to 0 to 1 to 2 to 3 to 4 to 5 to 6 to 7 to 8 to 9 to 10 to 11 to 12 to 13 to 14 to 15 to 16 to 17 to 18 to 19 to 20 to 21 to 22 to 23 to 24 to 25 to 26 to 27 to 28 to 29 to 30 to 31 0.000000 9.836008 9.800445 9.824289 11.355898 11.248469 10.962445 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 10.565859 0.000000 24.149859 24.293578 21.921758 21.814328 21.528305 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 12.277023 25.184922 0.000000 17.178188 23.632922 23.525492 23.239469 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 10.580664 20.416672 20.381109 0.000000 21.936563 21.829133 21.543109 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 15.931570 25.767578 25.732016 25.755859 0.000000 27.180039 26.894016 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 15.837656 25.673664 25.638102 25.661945 27.193555 0.000000 26.800102 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 15.669383 25.505391 25.469828 25.493672 27.025281 26.917852 0.000000 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan starpu-1.2.3+dfsg/tools/perfmodels/sampling/bus/mirage.platform.v4.xml000066400000000000000000000252341320135501600260200ustar00rootroot00000000000000 starpu-1.2.3+dfsg/tools/perfmodels/sampling/bus/mirage.platform.xml000066400000000000000000000247361320135501600254760ustar00rootroot00000000000000 starpu-1.2.3+dfsg/tools/perfmodels/sampling/bus/sirocco.affinity000066400000000000000000000012251320135501600250450ustar00rootroot00000000000000# GPU CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 CPU8 CPU9 CPU10 CPU11 CPU12 CPU13 CPU14 CPU15 CPU16 CPU17 CPU18 CPU19 CPU20 CPU21 CPU22 CPU23 0 6 7 8 9 10 11 0 1 2 3 4 5 18 19 20 21 22 23 12 13 14 15 16 17 1 6 7 8 9 10 11 0 1 2 3 4 5 18 19 20 21 22 23 12 13 14 15 16 17 2 18 19 20 21 22 23 12 13 14 15 16 17 0 1 2 3 4 5 6 7 8 9 10 11 3 18 19 20 21 22 23 12 13 14 15 16 17 0 1 2 3 4 5 6 7 8 9 10 11 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 2 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 3 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 starpu-1.2.3+dfsg/tools/perfmodels/sampling/bus/sirocco.bandwidth000066400000000000000000000035021320135501600252000ustar00rootroot00000000000000# to 0 to 1 to 2 to 3 to 4 to 5 to 6 to 7 to 8 to 9 to 10 to 11 to 12 to 13 to 14 to 15 0.000000e+00 1.051768e+04 1.051743e+04 1.051732e+04 1.051718e+04 7.997534e+03 7.978223e+03 8.025122e+03 8.002101e+03 nan nan nan nan nan nan nan 1.052170e+04 0.000000e+00 1.024409e+04 7.662719e+03 8.527736e+03 4.543798e+03 4.537558e+03 4.552690e+03 4.545272e+03 nan nan nan nan nan nan nan 1.052123e+04 1.024068e+04 0.000000e+00 7.630370e+03 8.542254e+03 4.543711e+03 4.537471e+03 4.552602e+03 4.545185e+03 nan nan nan nan nan nan nan 1.052183e+04 8.504225e+03 8.517476e+03 0.000000e+00 1.023200e+04 4.543822e+03 4.537582e+03 4.552715e+03 4.545296e+03 nan nan nan nan nan nan nan 1.052172e+04 8.496221e+03 8.514240e+03 1.024287e+04 0.000000e+00 4.543801e+03 4.537561e+03 4.552693e+03 4.545275e+03 nan nan nan nan nan nan nan 7.434276e+03 4.355589e+03 4.355546e+03 4.355527e+03 4.355503e+03 0.000000e+00 3.848326e+03 3.859204e+03 3.853873e+03 nan nan nan nan nan nan nan 7.232140e+03 4.285414e+03 4.285373e+03 4.285355e+03 4.285331e+03 3.797802e+03 0.000000e+00 3.804012e+03 3.798832e+03 nan nan nan nan nan nan nan 7.300126e+03 4.309194e+03 4.309152e+03 4.309134e+03 4.309110e+03 3.816466e+03 3.812063e+03 0.000000e+00 3.817506e+03 nan nan nan nan nan nan nan 7.333166e+03 4.320685e+03 4.320643e+03 4.320625e+03 4.320601e+03 3.825477e+03 3.821053e+03 3.831778e+03 0.000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan starpu-1.2.3+dfsg/tools/perfmodels/sampling/bus/sirocco.config000066400000000000000000000001761320135501600245050ustar00rootroot00000000000000# Current configuration 24 # Number of CPUs 4 # Number of CUDA devices 4 # Number of OpenCL devices 0 # Number of MIC devices starpu-1.2.3+dfsg/tools/perfmodels/sampling/bus/sirocco.latency000066400000000000000000000035021320135501600246730ustar00rootroot00000000000000# to 0 to 1 to 2 to 3 to 4 to 5 to 6 to 7 to 8 to 9 to 10 to 11 to 12 to 13 to 14 to 15 0.000000e+00 1.029027e+01 1.031898e+01 9.529422e+00 1.039846e+01 9.643953e+00 1.113670e+01 1.055939e+01 1.004796e+01 nan nan nan nan nan nan nan 1.085040e+01 0.000000e+00 1.152573e+01 2.350899e+01 2.337711e+01 2.049435e+01 2.198709e+01 2.140979e+01 2.089836e+01 nan nan nan nan nan nan nan 9.920578e+00 1.167180e+01 0.000000e+00 2.304539e+01 2.330630e+01 1.956453e+01 2.105727e+01 2.047997e+01 1.996854e+01 nan nan nan nan nan nan nan 1.093016e+01 2.380006e+01 2.358666e+01 0.000000e+00 1.101548e+01 2.057412e+01 2.206686e+01 2.148955e+01 2.097812e+01 nan nan nan nan nan nan nan 1.097311e+01 2.126338e+01 2.129209e+01 2.050253e+01 0.000000e+00 2.061706e+01 2.210980e+01 2.153250e+01 2.102107e+01 nan nan nan nan nan nan nan 1.162996e+01 2.192023e+01 2.194894e+01 2.115938e+01 2.202842e+01 0.000000e+00 2.276666e+01 2.218935e+01 2.167792e+01 nan nan nan nan nan nan nan 1.359506e+01 2.388534e+01 2.391404e+01 2.312448e+01 2.399352e+01 2.323902e+01 0.000000e+00 2.415445e+01 2.364302e+01 nan nan nan nan nan nan nan 1.245815e+01 2.274842e+01 2.277712e+01 2.198757e+01 2.285661e+01 2.210210e+01 2.359484e+01 0.000000e+00 2.250611e+01 nan nan nan nan nan nan nan 1.236026e+01 2.265053e+01 2.267923e+01 2.188968e+01 2.275872e+01 2.200421e+01 2.349695e+01 2.291965e+01 0.000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan starpu-1.2.3+dfsg/tools/perfmodels/sampling/bus/sirocco.platform.v4.xml000066400000000000000000000171141320135501600262130ustar00rootroot00000000000000 starpu-1.2.3+dfsg/tools/perfmodels/sampling/bus/sirocco.platform.xml000066400000000000000000000166541320135501600256730ustar00rootroot00000000000000 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/000077500000000000000000000000001320135501600226625ustar00rootroot00000000000000starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/000077500000000000000000000000001320135501600231115ustar00rootroot00000000000000starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/chol_model_11.attila000066400000000000000000000076521320135501600267310ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 7.593370e+04 4.030251e+03 2.353945e+06 1.792473e+11 31 afdd228b 1638400 8.758624e+07 2.346245e+04 1.988237e+03 1.032348e+06 2.439534e+10 44 cea37d6d 409600 1.097392e+07 3.401100e+03 3.819888e+02 1.564506e+05 5.388163e+08 46 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 4.425357e+04 2.763302e+03 7.523107e+05 3.342224e+10 17 afdd228b 1638400 8.758624e+07 2.425311e+04 2.094515e+03 2.910373e+05 7.111204e+09 12 cea37d6d 409600 1.097392e+07 1.130795e+04 5.745206e+02 1.130795e+05 1.281997e+09 10 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 4.555777e+04 5.907293e+03 7.744821e+05 3.587692e+10 17 afdd228b 1638400 8.758624e+07 2.509024e+04 3.469720e+03 2.509024e+05 6.415590e+09 10 cea37d6d 409600 1.097392e+07 1.082278e+04 2.477308e+02 1.082278e+05 1.171939e+09 10 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 4.828333e+04 3.379151e+03 5.311166e+05 2.576968e+10 11 afdd228b 1638400 8.758624e+07 2.737149e+04 3.217773e+03 2.737149e+05 7.595526e+09 10 cea37d6d 409600 1.097392e+07 1.143954e+04 1.654563e+02 1.143954e+05 1.308904e+09 10 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/chol_model_11.idgraf000066400000000000000000000212721320135501600267010ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 9 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 2.069576e+04 7.440388e+01 4.346110e+05 8.994720e+09 21 cea37d6d 409600 1.097392e+07 1.068290e+03 2.074934e+01 3.098041e+04 3.310855e+07 29 afdd228b 1638400 8.758624e+07 6.632886e+03 6.634864e+01 1.392906e+05 9.239911e+08 21 #################### # COMB_6 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 7 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda7_impl0 (Comb6) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 5.998499e+04 6.600211e+03 5.998499e+05 3.641761e+10 10 cea37d6d 409600 1.097392e+07 1.500406e+04 5.740284e+02 1.500406e+05 2.254514e+09 10 afdd228b 1638400 8.758624e+07 3.368249e+04 5.947857e+03 3.368249e+05 1.169887e+10 10 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 5 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda5_impl0 (Comb8) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 5.745646e+04 7.363450e+03 5.745646e+05 3.355466e+10 10 cea37d6d 409600 1.097392e+07 1.559370e+04 1.137871e+03 1.559370e+05 2.444583e+09 10 afdd228b 1638400 8.758624e+07 3.216379e+04 4.954206e+03 3.216379e+05 1.059054e+10 10 #################### # COMB_5 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 6 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda6_impl0 (Comb5) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 5.761859e+04 8.603827e+03 5.761859e+05 3.393928e+10 10 cea37d6d 409600 1.097392e+07 1.498399e+04 7.885417e+02 1.498399e+05 2.251416e+09 10 afdd228b 1638400 8.758624e+07 3.033086e+04 2.968298e+03 3.033086e+05 9.287718e+09 10 #################### # COMB_7 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 4 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda4_impl0 (Comb7) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 5.207197e+04 2.780602e+03 5.207197e+05 2.719222e+10 10 cea37d6d 409600 1.097392e+07 1.609271e+04 2.681035e+03 1.609271e+05 2.661633e+09 10 afdd228b 1638400 8.758624e+07 3.107603e+04 1.620445e+03 3.107603e+05 9.683455e+09 10 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 5.062446e+04 2.429137e+03 5.062446e+05 2.568736e+10 10 cea37d6d 409600 1.097392e+07 1.506158e+04 8.561331e+02 1.506158e+05 2.275840e+09 10 afdd228b 1638400 8.758624e+07 3.034398e+04 4.027845e+03 3.034398e+05 9.369809e+09 10 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb4) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 5.174953e+04 6.183695e+03 5.174953e+05 2.716252e+10 10 cea37d6d 409600 1.097392e+07 1.518996e+04 9.403764e+02 1.518996e+05 2.316193e+09 10 afdd228b 1638400 8.758624e+07 3.100983e+04 5.124047e+03 3.100983e+05 9.878653e+09 10 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 5.475211e+04 6.512121e+03 5.475211e+05 3.040202e+10 10 cea37d6d 409600 1.097392e+07 1.504708e+04 5.064339e+02 1.504708e+05 2.266711e+09 10 afdd228b 1638400 8.758624e+07 2.918927e+04 4.035680e+03 2.918927e+05 8.683004e+09 10 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n cea37d6d 409600 1.097392e+07 1.467875e+04 2.659893e+02 1.467875e+05 2.155366e+09 10 afdd228b 1638400 8.758624e+07 3.186232e+04 5.396938e+03 3.186232e+05 1.044334e+10 10 617e5fe6 3686400 2.953730e+08 5.896762e+04 1.233845e+04 5.896762e+05 3.629418e+10 10 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/chol_model_11.mirage000066400000000000000000000076531320135501600267200ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n cea37d6d 409600 1.097392e+07 9.221097e+02 4.521529e+01 7.930143e+04 7.330044e+07 86 617e5fe6 3686400 2.953730e+08 1.884969e+04 7.370619e+02 2.111165e+06 3.985565e+10 112 afdd228b 1638400 8.758624e+07 5.940712e+03 2.434960e+02 2.376285e+05 1.414054e+09 40 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 5.366740e+03 9.457424e+01 1.556354e+05 8.355143e+08 29 cea37d6d 409600 1.097392e+07 2.003232e+03 2.738589e+01 5.809372e+04 1.163969e+08 29 afdd228b 1638400 8.758624e+07 3.522008e+03 5.701992e+01 1.021382e+05 3.598259e+08 29 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 1638400 8.758624e+07 3.775579e+03 6.170997e+01 1.094918e+05 4.135053e+08 29 cea37d6d 409600 1.097392e+07 2.237869e+03 3.535637e+01 6.489820e+04 1.452699e+08 29 617e5fe6 3686400 2.953730e+08 5.557011e+03 6.001156e+01 1.611533e+05 8.956353e+08 29 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 5.500099e+03 6.565775e+01 1.595029e+05 8.774066e+08 29 cea37d6d 409600 1.097392e+07 2.220120e+03 2.867670e+01 6.438348e+04 1.429629e+08 29 afdd228b 1638400 8.758624e+07 3.742877e+03 5.898784e+01 1.085434e+05 4.063656e+08 29 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/chol_model_11.sirocco000066400000000000000000000126271320135501600271120ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 5 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb0) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 25ebb669 8294400 9.963650e+08 1.842284e+04 2.612920e+03 1.271176e+06 2.388975e+10 69 617e5fe6 3686400 2.953730e+08 7.379027e+03 1.089221e+03 5.903221e+05 4.450915e+09 80 afdd228b 1638400 8.758624e+07 2.799281e+03 5.546704e+02 2.323403e+05 6.759213e+08 83 cea37d6d 409600 1.097392e+07 4.391691e+02 4.300491e+01 7.597626e+04 3.368638e+07 173 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb3) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 25ebb669 8294400 9.963650e+08 4.852293e+04 1.266847e+04 4.852293e+05 2.514965e+10 10 617e5fe6 3686400 2.953730e+08 7.699799e+03 1.513211e+03 9.239759e+04 7.389205e+08 12 afdd228b 1638400 8.758624e+07 5.010966e+03 7.544427e+02 5.010965e+04 2.567896e+08 10 cea37d6d 409600 1.097392e+07 3.343709e+03 3.943178e+02 3.343709e+04 1.133588e+08 10 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 25ebb669 8294400 9.963650e+08 3.188534e+04 1.123169e+04 3.188534e+05 1.142826e+10 10 617e5fe6 3686400 2.953730e+08 8.514691e+03 1.568765e+03 9.366160e+04 8.245709e+08 11 afdd228b 1638400 8.758624e+07 5.436465e+03 1.325711e+03 5.436465e+04 3.131266e+08 10 cea37d6d 409600 1.097392e+07 3.336739e+03 3.113015e+02 3.336739e+04 1.123074e+08 10 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb1) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 25ebb669 8294400 9.963650e+08 3.051372e+04 1.107281e+04 3.051372e+05 1.053694e+10 10 617e5fe6 3686400 2.953730e+08 8.456328e+03 1.411439e+03 1.014759e+05 8.820196e+08 12 afdd228b 1638400 8.758624e+07 4.996835e+03 9.396038e+02 4.996835e+04 2.585122e+08 10 cea37d6d 409600 1.097392e+07 3.060839e+03 4.968177e+01 3.060839e+04 9.371202e+07 10 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb4) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 25ebb669 8294400 9.963650e+08 1.332935e+04 3.063746e+03 2.132696e+05 2.992929e+09 16 617e5fe6 3686400 2.953730e+08 8.333388e+03 1.108400e+03 1.000007e+05 8.480868e+08 12 afdd228b 1638400 8.758624e+07 5.517925e+03 1.047059e+03 5.517925e+04 3.154382e+08 10 cea37d6d 409600 1.097392e+07 3.435367e+03 2.405829e+02 3.435367e+04 1.185962e+08 10 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/chol_model_21.attila000066400000000000000000000076661320135501600267370ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 8.856576e+08 4.361594e+04 1.992990e+03 1.840593e+07 8.044680e+11 422 d39bff17 3276800 2.625536e+08 1.391260e+04 9.732436e+02 6.552836e+06 9.161314e+10 471 2c1922b7 819200 3.287040e+07 2.026126e+03 2.243730e+02 1.355478e+06 2.780050e+09 669 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 8.856576e+08 6.302421e+03 2.284702e+02 1.739468e+06 1.097727e+10 276 d39bff17 3276800 2.625536e+08 2.553136e+03 1.599096e+02 6.714747e+05 1.721091e+09 263 2c1922b7 819200 3.287040e+07 6.889531e+02 1.162392e+02 1.198778e+05 8.494121e+07 174 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 8.856576e+08 6.325409e+03 1.859324e+02 1.688884e+06 1.069211e+10 267 d39bff17 3276800 2.625536e+08 2.539349e+03 1.556256e+02 6.297585e+05 1.605183e+09 248 2c1922b7 819200 3.287040e+07 6.837878e+02 1.012279e+02 1.319710e+05 9.221787e+07 193 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 8.856576e+08 6.297128e+03 2.218514e+02 1.542796e+06 9.727245e+09 245 d39bff17 3276800 2.625536e+08 2.528040e+03 1.085312e+02 7.255475e+05 1.837594e+09 287 2c1922b7 819200 3.287040e+07 6.470080e+02 5.924722e+01 1.598110e+05 1.042660e+08 247 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/chol_model_21.idgraf000066400000000000000000000213231320135501600266770ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 9 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 8.856576e+08 4.711469e+04 4.337925e+02 3.203799e+06 1.509588e+11 68 2c1922b7 819200 3.287040e+07 1.979166e+03 8.798869e+01 6.828124e+05 1.354070e+09 345 d39bff17 3276800 2.625536e+08 1.482664e+04 2.506296e+02 2.298130e+06 3.408328e+10 155 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb4) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 8.856576e+08 6.573848e+03 6.169449e+02 1.360787e+06 9.024393e+09 207 2c1922b7 819200 3.287040e+07 6.955196e+02 8.976154e+01 1.286711e+05 9.098386e+07 185 d39bff17 3276800 2.625536e+08 2.647434e+03 2.520462e+02 4.685958e+05 1.251821e+09 177 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 8.856576e+08 6.555664e+03 6.950469e+02 1.252132e+06 8.300825e+09 191 2c1922b7 819200 3.287040e+07 6.812499e+02 8.342802e+01 1.273937e+05 8.808853e+07 187 d39bff17 3276800 2.625536e+08 2.596800e+03 1.668067e+02 5.894736e+05 1.537061e+09 227 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 8.856576e+08 6.446442e+03 5.413553e+02 1.276395e+06 8.286236e+09 198 2c1922b7 819200 3.287040e+07 6.941204e+02 8.002896e+01 1.277182e+05 8.983023e+07 184 d39bff17 3276800 2.625536e+08 2.630763e+03 2.300111e+02 4.603835e+05 1.220418e+09 175 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 8.856576e+08 6.554622e+03 7.028631e+02 1.238824e+06 8.213390e+09 189 2c1922b7 819200 3.287040e+07 6.905951e+02 7.284704e+01 1.353566e+05 9.451674e+07 196 d39bff17 3276800 2.625536e+08 2.623425e+03 2.211699e+02 4.905805e+05 1.296149e+09 187 #################### # COMB_7 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 4 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda4_impl0 (Comb7) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 8.856576e+08 6.504271e+03 6.367049e+02 9.951534e+05 6.534773e+09 153 2c1922b7 819200 3.287040e+07 7.029111e+02 9.289767e+01 7.169693e+04 5.127683e+07 102 d39bff17 3276800 2.625536e+08 2.684586e+03 3.481310e+02 4.080571e+05 1.113886e+09 152 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 5 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda5_impl0 (Comb8) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 8.856576e+08 6.618862e+03 8.843940e+02 8.405955e+05 5.663119e+09 127 2c1922b7 819200 3.287040e+07 7.079333e+02 9.356613e+01 6.796160e+04 4.895273e+07 96 d39bff17 3276800 2.625536e+08 2.800887e+03 4.371231e+02 3.221020e+05 9.241450e+08 115 #################### # COMB_5 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 6 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda6_impl0 (Comb5) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 8.856576e+08 6.576395e+03 7.489644e+02 8.878133e+05 5.914339e+09 135 2c1922b7 819200 3.287040e+07 7.050156e+02 1.025857e+02 8.037177e+04 5.786307e+07 114 d39bff17 3276800 2.625536e+08 2.645162e+03 2.750078e+02 4.205807e+05 1.124529e+09 159 #################### # COMB_6 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 7 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda7_impl0 (Comb6) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 8.856576e+08 6.544427e+03 6.576164e+02 9.358531e+05 6.186464e+09 143 2c1922b7 819200 3.287040e+07 7.150712e+02 1.054194e+02 8.223319e+04 6.008061e+07 115 d39bff17 3276800 2.625536e+08 2.613530e+03 2.505172e+02 3.972565e+05 1.047781e+09 152 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/chol_model_21.mirage000066400000000000000000000076701320135501600267200ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 3.287040e+07 1.868713e+03 9.872163e+01 2.535843e+06 4.751987e+09 1357 ff82dda0 7372800 8.856576e+08 4.564676e+04 7.031596e+02 5.687586e+07 2.596815e+12 1246 d39bff17 3276800 2.625536e+08 1.417018e+04 5.255501e+02 8.232874e+06 1.168218e+11 581 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 3.287040e+07 6.829247e+02 7.632991e+01 1.420483e+05 9.822018e+07 208 ff82dda0 7372800 8.856576e+08 6.393638e+03 3.362739e+02 3.650767e+06 2.340625e+10 571 d39bff17 3276800 2.625536e+08 2.602204e+03 1.876810e+02 6.895839e+05 1.803772e+09 265 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 3.287040e+07 6.842707e+02 6.860830e+01 1.211159e+05 8.370922e+07 177 ff82dda0 7372800 8.856576e+08 6.416842e+03 2.746569e+02 2.951747e+06 1.897560e+10 460 d39bff17 3276800 2.625536e+08 2.601751e+03 2.008905e+02 6.114115e+05 1.600224e+09 235 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 3.287040e+07 6.827700e+02 7.214633e+01 1.297263e+05 8.956219e+07 190 ff82dda0 7372800 8.856576e+08 6.409443e+03 3.434222e+02 3.243178e+06 2.084664e+10 506 d39bff17 3276800 2.625536e+08 2.604891e+03 2.068197e+02 6.069396e+05 1.590978e+09 233 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/chol_model_21.sirocco000066400000000000000000000121451320135501600271060ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 5 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb0) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0e8bce2b 16588800 2.988058e+09 6.085177e+04 1.761936e+04 4.551712e+07 3.002008e+12 748 ff82dda0 7372800 8.856576e+08 1.775772e+04 3.736007e+03 2.386637e+07 4.425714e+11 1344 d39bff17 3276800 2.625536e+08 5.276862e+03 9.789431e+02 7.070995e+06 3.859682e+10 1340 2c1922b7 819200 3.287040e+07 7.675336e+02 1.464194e+02 2.842177e+06 2.260854e+09 3703 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb3) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0e8bce2b 16588800 2.988058e+09 5.422549e+03 1.109859e+03 2.917331e+06 1.648207e+10 538 ff82dda0 7372800 8.856576e+08 2.018325e+03 2.870643e+02 1.687320e+06 3.474450e+09 836 d39bff17 3276800 2.625536e+08 1.179394e+03 1.705358e+02 3.538181e+05 4.260157e+08 300 2c1922b7 819200 3.287040e+07 4.644748e+02 7.687001e+01 3.297771e+04 1.573685e+07 71 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb1) # number of entries 1 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0e8bce2b 16588800 2.988058e+09 5.480822e+03 1.130650e+03 2.899355e+06 1.656711e+10 529 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0e8bce2b 16588800 2.988058e+09 5.510320e+03 1.138149e+03 2.992104e+06 1.719084e+10 543 ff82dda0 7372800 8.856576e+08 2.005118e+03 2.787124e+02 1.836689e+06 3.753933e+09 916 d39bff17 3276800 2.625536e+08 1.227664e+03 1.874122e+02 2.970946e+05 3.732321e+08 242 2c1922b7 819200 3.287040e+07 4.209987e+02 9.547071e+01 6.441281e+04 2.851225e+07 153 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb4) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0e8bce2b 16588800 2.988058e+09 5.534879e+03 1.226333e+03 3.210230e+06 1.864049e+10 580 ff82dda0 7372800 8.856576e+08 2.051755e+03 2.742098e+02 1.811700e+06 3.783559e+09 883 d39bff17 3276800 2.625536e+08 1.153240e+03 1.913332e+02 3.194475e+05 3.785401e+08 277 2c1922b7 819200 3.287040e+07 4.950127e+02 6.747714e+01 5.445140e+04 2.745498e+07 110 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/chol_model_22.attila000066400000000000000000000077021320135501600267270ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 1.769472e+09 8.407559e+04 3.415249e+03 1.399859e+08 1.178881e+13 1665 f0ac7beb 4915200 5.242880e+08 2.610119e+04 1.422415e+03 4.251883e+07 1.113088e+12 1629 d46431bb 1228800 6.553600e+07 3.432588e+03 1.640071e+02 9.130685e+06 3.141343e+10 2660 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 1.769472e+09 2.795670e+03 5.624760e+01 1.818024e+07 5.084653e+10 6503 f0ac7beb 4915200 5.242880e+08 8.880682e+02 3.243424e+01 5.760010e+06 5.122105e+09 6486 d46431bb 1228800 6.553600e+07 2.022322e+02 1.071833e+01 1.116119e+06 2.263493e+08 5519 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 1.769472e+09 2.815870e+03 4.694553e+01 1.827781e+07 5.148226e+10 6491 f0ac7beb 4915200 5.242880e+08 8.961392e+02 3.565427e+01 5.741564e+06 5.153386e+09 6407 d46431bb 1228800 6.553600e+07 2.020566e+02 9.551669e+00 1.107876e+06 2.243540e+08 5483 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 1.769472e+09 2.810209e+03 3.946230e+01 1.806121e+07 5.076578e+10 6427 f0ac7beb 4915200 5.242880e+08 8.833768e+02 3.092949e+01 5.707497e+06 5.048051e+09 6461 d46431bb 1228800 6.553600e+07 1.637484e+02 6.969807e+00 1.084015e+06 1.778273e+08 6620 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/chol_model_22.idgraf000066400000000000000000000213551320135501600267050ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 9 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 1.769472e+09 8.987520e+04 9.682708e+02 2.085105e+07 1.874210e+12 232 d46431bb 1228800 6.553600e+07 3.465410e+03 7.427679e+01 2.737674e+06 9.491521e+09 790 f0ac7beb 4915200 5.242880e+08 2.744657e+04 5.713498e+02 7.575252e+06 2.080048e+11 276 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb4) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 1.769472e+09 2.825219e+03 1.227364e+02 1.106356e+07 3.131597e+10 3916 d46431bb 1228800 6.553600e+07 2.060677e+02 2.909125e+01 5.497887e+05 1.155516e+08 2668 f0ac7beb 4915200 5.242880e+08 9.076961e+02 5.977819e+01 3.441076e+06 3.136998e+09 3791 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 1.769472e+09 2.823818e+03 1.560928e+02 1.063450e+07 3.012164e+10 3766 d46431bb 1228800 6.553600e+07 1.632767e+02 2.137437e+01 5.224853e+05 8.677162e+07 3200 f0ac7beb 4915200 5.242880e+08 9.226606e+02 6.080500e+01 3.410153e+06 3.160079e+09 3696 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 1.769472e+09 2.821988e+03 1.631366e+02 1.046111e+07 2.961977e+10 3707 d46431bb 1228800 6.553600e+07 1.661504e+02 2.199315e+01 5.172263e+05 8.744312e+07 3113 f0ac7beb 4915200 5.242880e+08 9.172785e+02 5.967474e+01 3.492079e+06 3.216766e+09 3807 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 1.769472e+09 2.817019e+03 1.506473e+02 1.119202e+07 3.161828e+10 3973 d46431bb 1228800 6.553600e+07 2.042642e+02 2.707555e+01 5.498791e+05 1.142941e+08 2692 f0ac7beb 4915200 5.242880e+08 9.044446e+02 5.780357e+01 3.477590e+06 3.158134e+09 3845 #################### # COMB_7 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 4 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda4_impl0 (Comb7) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 1.769472e+09 2.816710e+03 1.414989e+02 1.032888e+07 2.916687e+10 3667 d46431bb 1228800 6.553600e+07 1.639497e+02 2.257894e+01 4.474187e+05 7.474542e+07 2729 f0ac7beb 4915200 5.242880e+08 9.331501e+02 5.611510e+01 3.235231e+06 3.029874e+09 3467 #################### # COMB_5 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 6 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda6_impl0 (Comb5) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 1.769472e+09 2.815225e+03 1.445443e+02 1.009821e+07 2.850368e+10 3587 d46431bb 1228800 6.553600e+07 1.659035e+02 2.475202e+01 4.006569e+05 6.794997e+07 2415 f0ac7beb 4915200 5.242880e+08 9.137585e+02 6.301297e+01 3.125968e+06 2.869963e+09 3421 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 5 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda5_impl0 (Comb8) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 1.769472e+09 2.807699e+03 1.292512e+02 1.006279e+07 2.831317e+10 3584 d46431bb 1228800 6.553600e+07 1.680450e+02 2.634123e+01 3.922170e+05 6.752957e+07 2334 f0ac7beb 4915200 5.242880e+08 8.912551e+02 5.629783e+01 3.090873e+06 2.765747e+09 3468 #################### # COMB_6 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 7 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda7_impl0 (Comb6) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 1.769472e+09 2.827622e+03 1.304764e+02 1.027841e+07 2.912533e+10 3635 d46431bb 1228800 6.553600e+07 1.666216e+02 2.357918e+01 4.083895e+05 6.940921e+07 2451 f0ac7beb 4915200 5.242880e+08 9.077285e+02 5.688987e+01 3.089908e+06 2.815814e+09 3404 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/chol_model_22.mirage000066400000000000000000000077051320135501600267200ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d46431bb 1228800 6.553600e+07 3.262643e+03 7.810468e+01 1.532463e+07 5.002746e+10 4697 24c84a50 11059200 1.769472e+09 8.778020e+04 9.598441e+02 2.889724e+08 2.536909e+13 3292 f0ac7beb 4915200 5.242880e+08 2.647095e+04 4.073263e+02 4.762124e+07 1.260878e+12 1799 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d46431bb 1228800 6.553600e+07 2.011248e+02 1.498037e+01 1.633334e+06 3.303264e+08 8121 24c84a50 11059200 1.769472e+09 2.805491e+03 6.931361e+01 3.683329e+07 1.033985e+11 13129 f0ac7beb 4915200 5.242880e+08 8.944354e+02 3.828761e+01 5.687714e+06 5.096615e+09 6359 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d46431bb 1228800 6.553600e+07 2.004836e+02 1.337883e+01 1.620709e+06 3.263726e+08 8084 24c84a50 11059200 1.769472e+09 2.828590e+03 6.702999e+01 3.650578e+07 1.033178e+11 12906 f0ac7beb 4915200 5.242880e+08 9.090465e+02 3.898196e+01 5.691540e+06 5.183389e+09 6261 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d46431bb 1228800 6.553600e+07 1.603761e+02 1.178063e+01 1.522450e+06 2.454821e+08 9493 24c84a50 11059200 1.769472e+09 2.828209e+03 7.003112e+01 3.675541e+07 1.040157e+11 12996 f0ac7beb 4915200 5.242880e+08 8.858930e+02 3.323656e+01 5.675030e+06 5.034546e+09 6406 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/chol_model_22.sirocco000066400000000000000000000127061320135501600271120ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 5 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 8cfc3ba0 24883200 5.971968e+09 2.632193e+03 3.963412e+02 2.414774e+07 6.500262e+10 9174 24c84a50 11059200 1.769472e+09 7.545142e+02 4.622075e+01 1.174100e+07 8.891991e+09 15561 f0ac7beb 4915200 5.242880e+08 2.651541e+02 2.896639e+01 2.197862e+06 5.897272e+08 8289 d46431bb 1228800 6.553600e+07 5.633559e+01 1.027680e+01 7.345034e+05 4.275566e+07 13038 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb1) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 8cfc3ba0 24883200 5.971968e+09 2.577659e+03 3.627579e+02 2.443621e+07 6.423574e+10 9480 24c84a50 11059200 1.769472e+09 7.434516e+02 4.620554e+01 1.184541e+07 8.840509e+09 15933 f0ac7beb 4915200 5.242880e+08 2.633265e+02 2.997768e+01 2.185610e+06 5.829880e+08 8300 d46431bb 1228800 6.553600e+07 5.716015e+01 1.157773e+01 6.223597e+05 3.703364e+07 10888 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb3) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 8cfc3ba0 24883200 5.971968e+09 2.575702e+03 3.709810e+02 2.479886e+07 6.519954e+10 9628 24c84a50 11059200 1.769472e+09 7.437036e+02 4.816754e+01 1.192752e+07 8.907749e+09 16038 f0ac7beb 4915200 5.242880e+08 2.593699e+02 2.791728e+01 2.302427e+06 6.040986e+08 8877 d46431bb 1228800 6.553600e+07 5.656092e+01 1.160148e+01 5.523739e+05 3.255722e+07 9766 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb4) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 8cfc3ba0 24883200 5.971968e+09 2.620269e+03 3.685780e+02 2.431872e+07 6.498239e+10 9281 24c84a50 11059200 1.769472e+09 7.558763e+02 4.610795e+01 1.204791e+07 9.140616e+09 15939 f0ac7beb 4915200 5.242880e+08 2.625144e+02 2.860172e+01 2.207221e+06 5.863054e+08 8408 d46431bb 1228800 6.553600e+07 5.829194e+01 1.220705e+01 7.805874e+05 4.749737e+07 13391 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb0) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 8cfc3ba0 24883200 5.971968e+09 1.120418e+05 2.694960e+04 3.755640e+08 4.451334e+13 3352 24c84a50 11059200 1.769472e+09 3.494026e+04 6.587010e+03 1.697048e+08 6.140270e+12 4857 f0ac7beb 4915200 5.242880e+08 1.147661e+04 2.242393e+03 3.799907e+07 4.527495e+11 3311 d46431bb 1228800 6.553600e+07 1.593513e+03 3.073908e+02 2.396962e+07 3.961722e+10 15042 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/cl_update.attila000066400000000000000000000076641320135501600262660ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 49ec0825 34613280 0.000000e+00 7.774706e+04 9.102018e+02 4.664824e+06 3.627260e+11 60 6d78e48f 4461600 0.000000e+00 9.929947e+03 1.596124e+02 1.797320e+06 1.785191e+10 181 8ec75d42 14753312 0.000000e+00 3.310870e+04 5.189822e+02 1.920304e+06 6.359440e+10 58 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 49ec0825 34613280 0.000000e+00 5.051327e+03 6.437605e+02 2.692357e+06 1.382086e+10 533 6d78e48f 4461600 0.000000e+00 1.009230e+03 9.724548e+01 3.835076e+05 3.906410e+08 380 8ec75d42 14753312 0.000000e+00 1.883088e+03 3.340290e+02 1.069594e+06 2.077513e+09 568 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 49ec0825 34613280 0.000000e+00 5.105276e+03 6.922431e+02 2.807902e+06 1.459867e+10 550 6d78e48f 4461600 0.000000e+00 1.012651e+03 9.766669e+01 3.686049e+05 3.767403e+08 364 8ec75d42 14753312 0.000000e+00 2.097710e+03 2.383227e+02 9.880215e+05 2.099334e+09 471 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 49ec0825 34613280 0.000000e+00 4.938766e+03 7.348710e+02 2.780525e+06 1.403640e+10 563 6d78e48f 4461600 0.000000e+00 1.022015e+03 1.088844e+02 3.740577e+05 3.866319e+08 366 8ec75d42 14753312 0.000000e+00 1.829845e+03 3.604651e+02 8.893047e+05 1.690438e+09 486 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/cl_update.idgraf000066400000000000000000000213251320135501600262320ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 9 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 8ec75d42 14753312 0.000000e+00 1.774670e+03 3.622348e+02 1.348749e+06 2.493306e+09 760 6d78e48f 4461600 0.000000e+00 1.036351e+03 9.390524e+01 2.839601e+05 2.966985e+08 274 49ec0825 34613280 0.000000e+00 4.962997e+03 6.650844e+02 5.096998e+06 2.575067e+10 1027 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 8ec75d42 14753312 0.000000e+00 1.813689e+03 3.729019e+02 1.331248e+06 2.516537e+09 734 6d78e48f 4461600 0.000000e+00 1.023951e+03 1.005326e+02 3.553110e+05 3.673281e+08 347 49ec0825 34613280 0.000000e+00 5.017264e+03 7.095917e+02 4.365019e+06 2.233852e+10 870 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 8ec75d42 14753312 0.000000e+00 4.692078e+04 5.010795e+02 1.501465e+06 7.045793e+10 32 6d78e48f 4461600 0.000000e+00 1.405585e+04 1.896523e+02 7.590156e+05 1.067055e+10 54 49ec0825 34613280 0.000000e+00 1.108029e+05 1.348959e+03 3.545692e+06 3.929311e+11 32 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 7 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda7_impl0 (Comb8) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 8ec75d42 14753312 0.000000e+00 1.859413e+03 3.366203e+02 1.309027e+06 2.513795e+09 704 6d78e48f 4461600 0.000000e+00 1.027564e+03 1.046018e+02 3.483442e+05 3.616551e+08 339 49ec0825 34613280 0.000000e+00 5.060000e+03 7.405627e+02 4.164380e+06 2.152312e+10 823 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 6 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda6_impl0 (Comb4) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 8ec75d42 14753312 0.000000e+00 1.862800e+03 3.783314e+02 8.438483e+05 1.636760e+09 453 6d78e48f 4461600 0.000000e+00 9.567271e+02 3.148502e+01 5.606421e+05 5.369624e+08 586 49ec0825 34613280 0.000000e+00 4.965851e+03 6.509733e+02 5.810046e+06 2.934763e+10 1170 #################### # COMB_6 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb6) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 8ec75d42 14753312 0.000000e+00 1.889366e+03 3.958521e+02 1.186522e+06 2.340180e+09 628 6d78e48f 4461600 0.000000e+00 1.028680e+03 8.044529e+01 2.880303e+05 2.981029e+08 280 49ec0825 34613280 0.000000e+00 5.035634e+03 7.113130e+02 4.899672e+06 2.516526e+10 973 #################### # COMB_5 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb5) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 8ec75d42 14753312 0.000000e+00 1.814024e+03 3.173708e+02 1.186372e+06 2.217980e+09 654 6d78e48f 4461600 0.000000e+00 1.025445e+03 7.185494e+01 3.466003e+05 3.571646e+08 338 49ec0825 34613280 0.000000e+00 5.092715e+03 7.051028e+02 3.513973e+06 1.823871e+10 690 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 4 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda4_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 8ec75d42 14753312 0.000000e+00 1.793350e+03 3.531620e+02 1.388053e+06 2.585801e+09 774 6d78e48f 4461600 0.000000e+00 1.033622e+03 1.055186e+02 3.783058e+05 3.951004e+08 366 49ec0825 34613280 0.000000e+00 4.986601e+03 7.025210e+02 5.345636e+06 2.718562e+10 1072 #################### # COMB_7 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 5 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda5_impl0 (Comb7) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 8ec75d42 14753312 0.000000e+00 1.781570e+03 3.261441e+02 1.501864e+06 2.765346e+09 843 6d78e48f 4461600 0.000000e+00 1.022184e+03 1.018115e+02 3.751415e+05 3.872679e+08 367 49ec0825 34613280 0.000000e+00 5.102994e+03 7.050225e+02 4.327339e+06 2.250389e+10 848 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/cl_update.mirage000066400000000000000000000076711320135501600262520ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 6d78e48f 4461600 0.000000e+00 6.670318e+03 3.279077e+02 6.103341e+06 4.080961e+10 915 8ec75d42 14753312 0.000000e+00 2.178007e+04 1.559694e+03 1.008417e+07 2.207603e+11 463 49ec0825 34613280 0.000000e+00 5.101465e+04 2.613713e+03 2.443602e+07 1.249867e+12 479 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 6d78e48f 4461600 0.000000e+00 1.028619e+03 1.201323e+02 5.626547e+05 5.866515e+08 547 8ec75d42 14753312 0.000000e+00 1.871093e+03 3.437894e+02 1.981488e+06 3.832713e+09 1059 49ec0825 34613280 0.000000e+00 5.018828e+03 7.664203e+02 4.672528e+06 2.399748e+10 931 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 6d78e48f 4461600 0.000000e+00 1.024201e+03 1.096599e+02 6.452464e+05 6.684377e+08 630 8ec75d42 14753312 0.000000e+00 1.877457e+03 3.608958e+02 1.907496e+06 3.713572e+09 1016 49ec0825 34613280 0.000000e+00 5.018101e+03 7.255196e+02 5.314169e+06 2.722447e+10 1059 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 6d78e48f 4461600 0.000000e+00 1.010004e+03 1.090743e+02 5.383321e+05 5.500588e+08 533 8ec75d42 14753312 0.000000e+00 1.986058e+03 3.264552e+02 1.288952e+06 2.629100e+09 649 49ec0825 34613280 0.000000e+00 5.064765e+03 7.492118e+02 4.948276e+06 2.561026e+10 977 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/cl_update.sirocco000066400000000000000000000116261320135501600264420ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 5 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 8ec75d42 14753312 0.000000e+00 1.292737e+03 8.111826e+01 1.783977e+06 2.315293e+09 1380 6d78e48f 4461600 0.000000e+00 7.254397e+02 8.693801e+01 2.717497e+06 1.999693e+09 3746 49ec0825 34613280 0.000000e+00 2.847204e+03 1.159244e+02 5.255939e+06 1.498954e+10 1846 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 8ec75d42 14753312 0.000000e+00 2.010356e+04 1.739800e+03 4.201644e+06 8.510064e+10 209 6d78e48f 4461600 0.000000e+00 6.471465e+03 9.708551e+02 2.344612e+07 1.551456e+11 3623 49ec0825 34613280 0.000000e+00 4.705100e+04 5.067137e+03 1.383299e+07 6.584049e+11 294 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 8ec75d42 14753312 0.000000e+00 1.333639e+03 8.095890e+01 1.871095e+06 2.504561e+09 1403 6d78e48f 4461600 0.000000e+00 7.466797e+02 9.599725e+01 2.594712e+06 1.969443e+09 3475 49ec0825 34613280 0.000000e+00 2.914989e+03 1.085303e+02 5.037101e+06 1.470345e+10 1728 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb4) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 8ec75d42 14753312 0.000000e+00 1.319437e+03 8.470023e+01 1.921100e+06 2.545216e+09 1456 6d78e48f 4461600 0.000000e+00 7.342135e+02 9.435309e+01 2.608661e+06 1.946944e+09 3553 49ec0825 34613280 0.000000e+00 2.843027e+03 1.019747e+02 5.080489e+06 1.446255e+10 1787 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 8ec75d42 14753312 0.000000e+00 1.324805e+03 7.460278e+01 1.748742e+06 2.324088e+09 1320 6d78e48f 4461600 0.000000e+00 7.321696e+02 8.668478e+01 2.571380e+06 1.909076e+09 3512 49ec0825 34613280 0.000000e+00 2.873920e+03 1.173279e+02 5.566783e+06 1.602515e+10 1937 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/overlap_sleep_1024_24.attila000066400000000000000000000061771320135501600301370ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4, MPI_MS - 5) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb1) # number of entries 1 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n a3d3725e 1024 0.000000e+00 8.457435e+01 8.456846e+01 6.080896e+05 5.145841e+07 7190 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4, MPI_MS - 5) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb0) # number of entries 1 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n a3d3725e 1024 0.000000e+00 8.959785e+01 8.957735e+01 1.959505e+05 1.756781e+07 2187 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4, MPI_MS - 5) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb2) # number of entries 1 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n a3d3725e 1024 0.000000e+00 9.097446e+01 8.933429e+01 2.547285e+03 2.318591e+05 28 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4, MPI_MS - 5) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb3) # number of entries 1 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n a3d3725e 1024 0.000000e+00 9.082936e+01 9.075245e+01 5.368015e+04 4.878224e+06 591 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/overlap_sleep_1024_24.mirage000066400000000000000000000061771320135501600301250ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4, MPI_MS - 5) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb1) # number of entries 1 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n a3d3725e 1024 0.000000e+00 8.457435e+01 8.456846e+01 6.080896e+05 5.145841e+07 7190 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4, MPI_MS - 5) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb0) # number of entries 1 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n a3d3725e 1024 0.000000e+00 8.959785e+01 8.957735e+01 1.959505e+05 1.756781e+07 2187 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4, MPI_MS - 5) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb2) # number of entries 1 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n a3d3725e 1024 0.000000e+00 9.097446e+01 8.933429e+01 2.547285e+03 2.318591e+05 28 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4, MPI_MS - 5) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb3) # number of entries 1 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n a3d3725e 1024 0.000000e+00 9.082936e+01 9.075245e+01 5.368015e+04 4.878224e+06 591 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/overlap_sleep_1024_24.sirocco000066400000000000000000000076031320135501600303150ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4, MPI_MS - 5) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb1) # number of entries 1 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n a3d3725e 1024 0.000000e+00 8.457435e+01 8.456846e+01 6.080896e+05 5.145841e+07 7190 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4, MPI_MS - 5) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb0) # number of entries 1 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n a3d3725e 1024 0.000000e+00 8.959785e+01 8.957735e+01 1.959505e+05 1.756781e+07 2187 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4, MPI_MS - 5) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb2) # number of entries 1 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n a3d3725e 1024 0.000000e+00 9.097446e+01 8.933429e+01 2.547285e+03 2.318591e+05 28 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4, MPI_MS - 5) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb3) # number of entries 1 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n a3d3725e 1024 0.000000e+00 9.082936e+01 9.075245e+01 5.368015e+04 4.878224e+06 591 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4, MPI_MS - 5) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb4) # number of entries 1 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n a3d3725e 1024 0.000000e+00 9.097446e+01 8.933429e+01 2.547285e+03 2.318591e+05 28 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/save_cl_bottom.attila000066400000000000000000000076561320135501600273270ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f2ff9ae5 34480152 0.000000e+00 4.419323e+01 9.394629e+00 1.825180e+04 8.430572e+05 413 fb4b8624 4427800 0.000000e+00 1.267467e+01 2.411186e+00 5.754301e+03 7.557335e+04 454 4af260f6 14678040 0.000000e+00 2.442142e+01 5.135780e+00 1.394463e+04 3.556084e+05 571 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f2ff9ae5 34480152 0.000000e+00 3.910144e+01 6.371108e+00 1.329449e+03 5.336347e+04 34 fb4b8624 4427800 0.000000e+00 3.998483e+01 8.150933e+00 2.519044e+03 1.049091e+05 63 4af260f6 14678040 0.000000e+00 3.398450e+01 5.156207e+00 8.156280e+02 2.835679e+04 24 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f2ff9ae5 34480152 0.000000e+00 3.173112e+01 3.816078e+00 7.615470e+02 2.451424e+04 24 fb4b8624 4427800 0.000000e+00 2.860497e+01 5.248990e+00 1.029779e+03 3.044867e+04 36 4af260f6 14678040 0.000000e+00 3.652883e+01 8.229435e+00 1.716855e+03 6.589771e+04 47 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f2ff9ae5 34480152 0.000000e+00 3.719045e+01 7.851419e+00 2.566141e+03 9.968943e+04 69 fb4b8624 4427800 0.000000e+00 4.509905e+01 6.110617e+00 9.470800e+02 4.349654e+04 21 4af260f6 14678040 0.000000e+00 2.634116e+01 3.746211e+00 6.479926e+03 1.741412e+05 246 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/save_cl_bottom.idgraf000066400000000000000000000213251320135501600272720ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 9 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 2.985465e+01 6.158621e+00 3.552703e+03 1.105782e+05 119 fb4b8624 4427800 0.000000e+00 1.132689e+01 2.249702e+00 2.423954e+03 2.853894e+04 214 f2ff9ae5 34480152 0.000000e+00 5.622304e+01 1.121739e+01 9.276802e+03 5.423319e+05 165 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 2.632587e+01 4.244468e+00 1.174134e+04 3.171360e+05 446 fb4b8624 4427800 0.000000e+00 2.560067e+01 2.946464e+00 6.809779e+03 1.766442e+05 266 f2ff9ae5 34480152 0.000000e+00 2.687395e+01 3.041318e+00 1.378634e+04 3.752385e+05 513 #################### # COMB_6 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb6) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 2.682825e+01 3.688517e+00 9.309402e+03 2.544759e+05 347 fb4b8624 4427800 0.000000e+00 2.601287e+01 3.034296e+00 6.711320e+03 1.769561e+05 258 f2ff9ae5 34480152 0.000000e+00 2.650277e+01 3.250317e+00 1.327789e+04 3.571937e+05 501 #################### # COMB_5 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb5) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 2.844841e+01 4.987346e+00 1.118023e+04 3.278350e+05 393 fb4b8624 4427800 0.000000e+00 2.545228e+01 3.038424e+00 7.533874e+03 1.944869e+05 296 f2ff9ae5 34480152 0.000000e+00 2.671593e+01 2.977811e+00 9.510870e+03 2.572485e+05 356 #################### # COMB_7 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 5 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda5_impl0 (Comb7) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 2.683154e+01 3.643920e+00 1.145707e+04 3.130806e+05 427 fb4b8624 4427800 0.000000e+00 2.439165e+01 2.519213e+00 6.951620e+03 1.713702e+05 285 f2ff9ae5 34480152 0.000000e+00 2.686670e+01 3.337051e+00 1.332588e+04 3.635460e+05 496 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 7 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda7_impl0 (Comb8) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 2.743422e+01 5.313897e+00 8.504608e+03 2.420709e+05 310 fb4b8624 4427800 0.000000e+00 2.591823e+01 3.009457e+00 7.879143e+03 2.069667e+05 304 f2ff9ae5 34480152 0.000000e+00 2.671837e+01 2.963498e+00 1.282482e+04 3.468736e+05 480 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 4 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda4_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 2.572873e+01 2.716127e+00 1.232406e+04 3.206163e+05 479 fb4b8624 4427800 0.000000e+00 2.555023e+01 2.989409e+00 6.362008e+03 1.647760e+05 249 f2ff9ae5 34480152 0.000000e+00 2.648407e+01 2.593556e+00 1.504295e+04 4.022192e+05 568 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 6 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda6_impl0 (Comb4) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 2.535931e+01 2.801001e+00 7.303480e+03 1.874707e+05 288 fb4b8624 4427800 0.000000e+00 2.706983e+01 4.764143e+00 1.228970e+04 3.429847e+05 454 f2ff9ae5 34480152 0.000000e+00 2.645378e+01 3.704623e+00 1.251264e+04 3.374982e+05 473 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 2.565071e+01 2.881053e+00 1.064505e+04 2.764977e+05 415 fb4b8624 4427800 0.000000e+00 2.622930e+01 4.388391e+00 8.262230e+03 2.227788e+05 315 f2ff9ae5 34480152 0.000000e+00 2.628917e+01 2.974884e+00 1.204044e+04 3.205863e+05 458 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/save_cl_bottom.mirage000066400000000000000000000076571320135501600273160ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n fb4b8624 4427800 0.000000e+00 1.291871e+01 2.707056e+00 1.452063e+04 1.958246e+05 1124 4af260f6 14678040 0.000000e+00 2.737328e+01 5.740626e+00 2.241872e+04 6.406639e+05 819 f2ff9ae5 34480152 0.000000e+00 4.727593e+01 1.006422e+01 4.179193e+04 2.065291e+06 884 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n fb4b8624 4427800 0.000000e+00 4.529760e+01 1.106616e+01 3.940891e+03 1.891669e+05 87 4af260f6 14678040 0.000000e+00 5.186998e+01 9.163546e+00 2.386019e+03 1.276254e+05 46 f2ff9ae5 34480152 0.000000e+00 5.555996e+01 1.123960e+01 2.777998e+03 1.606619e+05 50 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n fb4b8624 4427800 0.000000e+00 4.174505e+01 7.717897e+00 1.711547e+03 7.389082e+04 41 4af260f6 14678040 0.000000e+00 4.338701e+01 9.950636e+00 8.677401e+03 3.962895e+05 200 f2ff9ae5 34480152 0.000000e+00 5.523574e+01 1.243105e+01 2.154194e+03 1.250152e+05 39 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n fb4b8624 4427800 0.000000e+00 5.145250e+01 1.035300e+01 1.955195e+03 1.046727e+05 38 4af260f6 14678040 0.000000e+00 4.717138e+01 8.365012e+00 2.217055e+03 1.078703e+05 47 f2ff9ae5 34480152 0.000000e+00 4.374296e+01 8.852326e+00 3.455694e+03 1.573530e+05 79 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/save_cl_bottom.sirocco000066400000000000000000000116131320135501600274760ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 5 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 3.447447e+01 7.398265e+00 3.237153e+04 1.167387e+06 939 fb4b8624 4427800 0.000000e+00 5.439097e+01 1.253425e+01 3.094846e+05 1.772711e+07 5690 f2ff9ae5 34480152 0.000000e+00 5.041329e+01 1.085485e+01 6.226042e+04 3.284270e+06 1235 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 3.176283e+01 6.812714e+00 1.673901e+04 5.561382e+05 527 fb4b8624 4427800 0.000000e+00 5.311651e+01 1.346481e+01 1.290731e+04 7.296474e+05 243 f2ff9ae5 34480152 0.000000e+00 4.192896e+01 9.759572e+00 3.207566e+04 1.417765e+06 765 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 3.786531e+01 9.328071e+00 1.991715e+04 7.999380e+05 526 fb4b8624 4427800 0.000000e+00 5.555598e+01 1.303330e+01 9.444517e+03 5.535768e+05 170 f2ff9ae5 34480152 0.000000e+00 4.359390e+01 1.022197e+01 2.218929e+04 1.020503e+06 509 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 4.035980e+01 9.947105e+00 1.989738e+04 8.518341e+05 493 fb4b8624 4427800 0.000000e+00 8.863692e+01 1.909792e+01 1.161144e+04 1.076982e+06 131 f2ff9ae5 34480152 0.000000e+00 3.838146e+01 9.359960e+00 2.890124e+04 1.175241e+06 753 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb4) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 3.505264e+01 8.845541e+00 1.945422e+04 7.253469e+05 555 fb4b8624 4427800 0.000000e+00 4.717545e+01 1.027132e+01 6.227160e+03 3.076951e+05 132 f2ff9ae5 34480152 0.000000e+00 3.110432e+01 6.170515e+00 2.370149e+04 7.662320e+05 762 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/save_cl_top.attila000066400000000000000000000076631320135501600266230ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f2ff9ae5 34480152 0.000000e+00 4.346555e+01 9.370422e+00 2.103733e+04 9.568966e+05 484 fb4b8624 4427800 0.000000e+00 1.080055e+01 2.408554e+00 6.631537e+03 7.518614e+04 614 4af260f6 14678040 0.000000e+00 2.045608e+01 4.186697e+00 1.294870e+04 2.759751e+05 633 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f2ff9ae5 34480152 0.000000e+00 3.184284e+01 5.707419e+00 4.840111e+03 1.590742e+05 152 fb4b8624 4427800 0.000000e+00 3.194475e+01 5.964283e+00 1.150011e+03 3.801743e+04 36 4af260f6 14678040 0.000000e+00 3.430576e+01 6.297323e+00 5.523228e+03 1.958632e+05 161 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f2ff9ae5 34480152 0.000000e+00 2.735681e+01 5.823931e+00 3.063963e+03 8.761910e+04 112 fb4b8624 4427800 0.000000e+00 3.161427e+01 5.733859e+00 2.212999e+03 7.226375e+04 70 4af260f6 14678040 0.000000e+00 3.666193e+01 6.692591e+00 6.819119e+03 2.583331e+05 186 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f2ff9ae5 34480152 0.000000e+00 3.900993e+01 8.465923e+00 7.489907e+03 3.059418e+05 192 fb4b8624 4427800 0.000000e+00 3.364966e+01 7.354940e+00 1.278687e+03 4.508300e+04 38 4af260f6 14678040 0.000000e+00 2.853135e+01 5.469952e+00 8.730594e+03 2.582513e+05 306 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/save_cl_top.idgraf000066400000000000000000000213251320135501600265700ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 9 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 3.246622e+01 6.891153e+00 3.928413e+03 1.332868e+05 121 fb4b8624 4427800 0.000000e+00 1.139753e+01 2.243693e+00 2.644226e+03 3.130556e+04 232 f2ff9ae5 34480152 0.000000e+00 5.591168e+01 1.328211e+01 1.241239e+04 7.331618e+05 222 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 4 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda4_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 2.604823e+01 3.286196e+00 1.130493e+04 2.991603e+05 434 fb4b8624 4427800 0.000000e+00 2.652276e+01 4.354433e+00 7.850738e+03 2.138358e+05 296 f2ff9ae5 34480152 0.000000e+00 2.714414e+01 3.836601e+00 1.555359e+04 4.306232e+05 573 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 2.599288e+01 3.808778e+00 1.115095e+04 2.960687e+05 429 fb4b8624 4427800 0.000000e+00 2.539365e+01 2.861737e+00 6.678529e+03 1.717461e+05 263 f2ff9ae5 34480152 0.000000e+00 2.629746e+01 2.517281e+00 1.159718e+04 3.077710e+05 441 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 2.561750e+01 2.633232e+00 1.155349e+04 2.990988e+05 451 fb4b8624 4427800 0.000000e+00 2.673210e+01 4.378492e+00 1.031859e+04 2.832378e+05 386 f2ff9ae5 34480152 0.000000e+00 2.631930e+01 2.903449e+00 1.339652e+04 3.568781e+05 509 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 6 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda6_impl0 (Comb4) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 2.607685e+01 3.121182e+00 7.979517e+03 2.110617e+05 306 fb4b8624 4427800 0.000000e+00 2.621449e+01 3.800716e+00 7.654632e+03 2.048804e+05 292 f2ff9ae5 34480152 0.000000e+00 2.661811e+01 2.706929e+00 1.810031e+04 4.867788e+05 680 #################### # COMB_5 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb5) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 2.759081e+01 5.463486e+00 5.435390e+03 1.558472e+05 197 fb4b8624 4427800 0.000000e+00 2.575898e+01 3.723342e+00 7.779212e+03 2.045713e+05 302 f2ff9ae5 34480152 0.000000e+00 2.684177e+01 3.098778e+00 1.181038e+04 3.212366e+05 440 #################### # COMB_6 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb6) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 2.613306e+01 2.901462e+00 1.100202e+04 2.910606e+05 421 fb4b8624 4427800 0.000000e+00 2.615768e+01 3.461177e+00 7.010257e+03 1.865826e+05 268 f2ff9ae5 34480152 0.000000e+00 2.749333e+01 3.923485e+00 1.492888e+04 4.188033e+05 543 #################### # COMB_7 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 5 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda5_impl0 (Comb7) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 2.628755e+01 3.829892e+00 1.025215e+04 2.752243e+05 390 fb4b8624 4427800 0.000000e+00 2.540957e+01 3.333356e+00 8.258109e+03 2.134461e+05 325 f2ff9ae5 34480152 0.000000e+00 2.728087e+01 3.903560e+00 1.404965e+04 3.911340e+05 515 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 7 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda7_impl0 (Comb8) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 2.705248e+01 4.049710e+00 1.163257e+04 3.217418e+05 430 fb4b8624 4427800 0.000000e+00 2.626990e+01 3.774104e+00 6.908983e+03 1.852444e+05 263 f2ff9ae5 34480152 0.000000e+00 2.670502e+01 3.597311e+00 1.303205e+04 3.543362e+05 488 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/save_cl_top.mirage000066400000000000000000000076661320135501600266140ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n fb4b8624 4427800 0.000000e+00 1.161593e+01 2.312881e+00 1.684310e+04 2.034051e+05 1450 4af260f6 14678040 0.000000e+00 2.793439e+01 6.208645e+00 2.807406e+04 8.229715e+05 1005 f2ff9ae5 34480152 0.000000e+00 5.388292e+01 1.191766e+01 4.930288e+04 2.786541e+06 915 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n fb4b8624 4427800 0.000000e+00 3.349897e+01 6.495369e+00 7.939257e+03 2.759560e+05 237 4af260f6 14678040 0.000000e+00 3.814493e+01 8.460348e+00 1.609716e+04 6.442306e+05 422 f2ff9ae5 34480152 0.000000e+00 3.894616e+01 8.022125e+00 1.339748e+04 5.439182e+05 344 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n fb4b8624 4427800 0.000000e+00 4.505725e+01 1.044174e+01 7.209160e+02 3.422697e+04 16 4af260f6 14678040 0.000000e+00 3.820932e+01 8.787776e+00 1.138638e+04 4.580788e+05 298 f2ff9ae5 34480152 0.000000e+00 4.714002e+01 1.060923e+01 1.343491e+04 6.654002e+05 285 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n fb4b8624 4427800 0.000000e+00 2.397521e+01 2.109607e+00 5.754050e+02 1.390227e+04 24 4af260f6 14678040 0.000000e+00 3.827520e+01 8.943097e+00 9.453975e+03 3.816076e+05 247 f2ff9ae5 34480152 0.000000e+00 5.567087e+01 1.159966e+01 8.127947e+03 4.721345e+05 146 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/save_cl_top.sirocco000066400000000000000000000116131320135501600267740ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 5 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 3.501046e+01 7.466097e+00 2.835847e+04 1.037995e+06 810 fb4b8624 4427800 0.000000e+00 2.773216e+01 6.482940e+00 1.680846e+05 4.916085e+06 6061 f2ff9ae5 34480152 0.000000e+00 5.337509e+01 1.160081e+01 6.591824e+04 3.684596e+06 1235 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 3.362211e+01 7.569501e+00 1.795421e+04 6.342550e+05 534 fb4b8624 4427800 0.000000e+00 3.231969e+01 5.862640e+00 1.877774e+04 6.268602e+05 581 f2ff9ae5 34480152 0.000000e+00 3.995777e+01 9.699452e+00 3.180638e+04 1.345799e+06 796 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 3.654429e+01 8.110997e+00 1.710273e+04 6.557958e+05 468 fb4b8624 4427800 0.000000e+00 3.606370e+01 8.402269e+00 2.171034e+04 8.254553e+05 602 f2ff9ae5 34480152 0.000000e+00 3.192218e+01 6.956874e+00 1.695068e+04 5.668019e+05 531 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 3.551068e+01 7.784366e+00 1.278384e+04 4.757777e+05 360 fb4b8624 4427800 0.000000e+00 3.460669e+01 7.284566e+00 1.996806e+04 7.216470e+05 577 f2ff9ae5 34480152 0.000000e+00 3.547098e+01 8.430109e+00 2.805755e+04 1.051443e+06 791 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb4) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 4af260f6 14678040 0.000000e+00 3.712899e+01 8.969310e+00 2.030956e+04 7.980787e+05 547 fb4b8624 4427800 0.000000e+00 3.619911e+01 8.162351e+00 2.287784e+04 8.702638e+05 632 f2ff9ae5 34480152 0.000000e+00 3.132201e+01 6.179930e+00 2.584066e+04 8.408892e+05 825 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_dgemm_gemm.attila000066400000000000000000000076621320135501600300200ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 66355200 7.077888e+09 6.739553e+05 1.180373e+04 5.391643e+07 3.634841e+13 80 0b0b0ce8 7372800 2.621440e+08 2.919185e+04 3.106016e+03 2.335348e+06 6.894489e+10 80 4220e23d 29491200 2.097152e+09 2.058556e+05 4.934163e+03 1.646845e+07 3.392071e+12 80 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 66355200 7.077888e+09 2.313178e+04 3.749098e+01 2.451969e+06 5.671856e+10 106 0b0b0ce8 7372800 2.621440e+08 1.039822e+03 4.572723e+01 9.982293e+04 1.039988e+08 96 4220e23d 29491200 2.097152e+09 7.017044e+03 9.150160e+00 7.367896e+05 5.170094e+09 105 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 66355200 7.077888e+09 2.311999e+04 3.792305e+01 2.427599e+06 5.612623e+10 105 0b0b0ce8 7372800 2.621440e+08 1.036523e+03 7.589914e+00 8.810443e+04 9.132713e+07 85 4220e23d 29491200 2.097152e+09 7.017425e+03 3.431116e+01 7.298122e+05 5.121525e+09 104 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 66355200 7.077888e+09 2.312215e+04 3.532854e+01 2.427826e+06 5.613668e+10 105 0b0b0ce8 7372800 2.621440e+08 1.036998e+03 4.343669e+01 1.078478e+05 1.120342e+08 104 4220e23d 29491200 2.097152e+09 7.010229e+03 3.598880e+01 7.360740e+05 5.160183e+09 105 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_dgemm_gemm.idgraf000066400000000000000000000212721320135501600277670ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 9 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 7372800 2.621440e+08 1.052061e+03 3.198115e+01 6.838395e+04 7.201055e+07 65 4220e23d 29491200 2.097152e+09 7.092203e+03 4.667104e+02 6.028372e+05 4.293959e+09 85 492beed5 66355200 7.077888e+09 2.348390e+04 1.879558e+03 2.230970e+06 5.272750e+10 95 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 7372800 2.621440e+08 1.052063e+03 4.974434e+01 7.680058e+04 8.097966e+07 73 4220e23d 29491200 2.097152e+09 7.169429e+03 6.510141e+02 6.165709e+05 4.456910e+09 86 492beed5 66355200 7.077888e+09 2.369721e+04 2.666656e+03 2.203840e+06 5.288620e+10 93 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 4 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda4_impl0 (Comb4) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 7372800 2.621440e+08 1.073351e+03 1.039589e+02 5.796097e+04 6.279609e+07 54 4220e23d 29491200 2.097152e+09 7.178253e+03 6.674450e+02 6.245080e+05 4.521634e+09 87 492beed5 66355200 7.077888e+09 2.322028e+04 3.606800e+02 2.252367e+06 5.231319e+10 97 #################### # COMB_7 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 5 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda5_impl0 (Comb7) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 7372800 2.621440e+08 1.047275e+03 4.810046e+01 6.074194e+04 6.374769e+07 58 4220e23d 29491200 2.097152e+09 7.215871e+03 7.571281e+02 6.277808e+05 4.579858e+09 87 492beed5 66355200 7.077888e+09 2.323291e+04 1.169036e+03 2.230359e+06 5.194892e+10 96 #################### # COMB_5 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb5) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 7372800 2.621440e+08 1.045464e+03 2.548321e+01 6.168239e+04 6.452506e+07 59 4220e23d 29491200 2.097152e+09 7.130284e+03 4.158059e+02 5.632924e+05 4.030093e+09 79 492beed5 66355200 7.077888e+09 2.322391e+04 7.530407e+02 2.090152e+06 4.859253e+10 90 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 7 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda7_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 7372800 2.621440e+08 1.058842e+03 8.984549e+01 6.353054e+04 6.775316e+07 60 4220e23d 29491200 2.097152e+09 7.197321e+03 6.902584e+02 6.549562e+05 4.757287e+09 91 492beed5 66355200 7.077888e+09 2.322727e+04 1.128695e+03 2.253045e+06 5.245566e+10 97 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 6 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda6_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 7372800 2.621440e+08 1.063382e+03 9.562944e+01 5.529587e+04 5.927619e+07 52 4220e23d 29491200 2.097152e+09 7.227464e+03 8.541890e+02 6.287894e+05 4.608031e+09 87 492beed5 66355200 7.077888e+09 2.322877e+04 9.079114e+02 2.253191e+06 5.241882e+10 97 #################### # COMB_6 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb6) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 7372800 2.621440e+08 1.057961e+03 6.059722e+01 5.289807e+04 5.614771e+07 50 4220e23d 29491200 2.097152e+09 7.169935e+03 6.166650e+02 5.592549e+05 4.039483e+09 78 492beed5 66355200 7.077888e+09 2.322622e+04 8.447450e+02 2.090360e+06 4.861539e+10 90 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb8) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 7372800 2.621440e+08 3.132122e+04 3.995607e+03 8.456730e+05 2.691857e+10 27 4220e23d 29491200 2.097152e+09 2.241875e+05 7.780157e+03 6.053063e+06 1.358656e+12 27 492beed5 66355200 7.077888e+09 7.222063e+05 7.344712e+03 1.661074e+07 1.199762e+13 23 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_dgemm_gemm.mirage000066400000000000000000000076631320135501600300070ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 7372800 2.621440e+08 2.783376e+04 1.016266e+03 2.254534e+06 6.283582e+10 81 492beed5 66355200 7.077888e+09 7.068870e+05 1.582112e+04 5.725785e+07 4.049511e+13 81 4220e23d 29491200 2.097152e+09 2.135531e+05 4.787239e+03 1.729780e+07 3.695855e+12 81 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 7372800 2.621440e+08 1.040745e+03 1.710737e+01 1.040745e+05 1.083442e+08 100 492beed5 66355200 7.077888e+09 2.322675e+04 6.514638e+01 2.438809e+06 5.664606e+10 105 4220e23d 29491200 2.097152e+09 7.042883e+03 4.736092e+01 7.395027e+05 5.208467e+09 105 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 7372800 2.621440e+08 1.057967e+03 4.209841e+01 1.057967e+05 1.121067e+08 100 492beed5 66355200 7.077888e+09 2.322865e+04 8.861437e+01 2.439008e+06 5.665569e+10 105 4220e23d 29491200 2.097152e+09 7.053091e+03 5.410169e+01 7.405746e+05 5.223647e+09 105 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 7372800 2.621440e+08 1.050834e+03 7.708100e+01 1.019309e+05 1.076889e+08 97 492beed5 66355200 7.077888e+09 2.323864e+04 5.619683e+01 2.440057e+06 5.670394e+10 105 4220e23d 29491200 2.097152e+09 7.040571e+03 3.296604e+01 7.392600e+05 5.204926e+09 105 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_dgemm_gemm.sirocco000066400000000000000000000126471320135501600302020ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 5 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb2) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 66355200 7.077888e+09 6.467396e+03 5.820387e+02 1.403425e+06 9.150018e+09 217 0b0b0ce8 7372800 2.621440e+08 2.828637e+02 4.132770e+01 2.376055e+04 6.864469e+06 84 4220e23d 29491200 2.097152e+09 2.091138e+03 2.430963e+02 3.764048e+05 7.977516e+08 180 87a7dc42 149299200 2.388787e+10 2.171545e+04 9.979353e+02 3.431041e+06 7.466394e+10 158 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb0) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 66355200 7.077888e+09 6.530201e+03 6.982602e+02 1.214617e+06 8.022384e+09 186 0b0b0ce8 7372800 2.621440e+08 2.596160e+02 3.720670e+01 2.907699e+04 7.703898e+06 112 4220e23d 29491200 2.097152e+09 2.068075e+03 2.561461e+02 4.156832e+05 8.728519e+08 201 87a7dc42 149299200 2.388787e+10 2.178854e+04 1.485331e+03 3.355435e+06 7.344977e+10 154 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb1) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 66355200 7.077888e+09 6.594324e+03 6.341124e+02 1.384808e+06 9.216313e+09 210 0b0b0ce8 7372800 2.621440e+08 2.592059e+02 3.728165e+01 2.773503e+04 7.337807e+06 107 4220e23d 29491200 2.097152e+09 2.149687e+03 2.853500e+02 3.847940e+05 8.417616e+08 179 87a7dc42 149299200 2.388787e+10 2.210351e+04 9.525598e+02 3.426044e+06 7.586825e+10 155 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb3) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 66355200 7.077888e+09 6.615698e+03 6.959563e+02 1.210673e+06 8.098082e+09 183 0b0b0ce8 7372800 2.621440e+08 2.665077e+02 3.721734e+01 3.278045e+04 8.906615e+06 123 4220e23d 29491200 2.097152e+09 2.090283e+03 2.730830e+02 4.285080e+05 9.109906e+08 205 87a7dc42 149299200 2.388787e+10 2.206407e+04 1.175820e+03 3.397867e+06 7.518367e+10 154 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb4) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 66355200 7.077888e+09 2.793361e+05 4.545353e+04 2.039154e+07 5.846913e+12 73 0b0b0ce8 7372800 2.621440e+08 1.003329e+04 9.763114e+02 3.471519e+06 3.516056e+10 346 4220e23d 29491200 2.097152e+09 8.266143e+04 1.577004e+04 6.860899e+06 5.877733e+11 83 87a7dc42 149299200 2.388787e+10 9.422627e+05 1.729617e+05 1.517043e+08 1.477617e+14 161 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_dlu_lu_model_11.attila000066400000000000000000000076521320135501600306660ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 7372800 0.000000e+00 2.515766e+05 2.096151e+04 2.515766e+06 6.373017e+11 10 afdd228b 3276800 0.000000e+00 7.350482e+04 4.292777e+03 9.555626e+05 7.047802e+10 13 cea37d6d 819200 0.000000e+00 9.586125e+03 1.023620e+03 2.108948e+05 2.044715e+09 22 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 7372800 0.000000e+00 6.990473e+04 4.071360e+03 1.118476e+06 7.845196e+10 16 afdd228b 3276800 0.000000e+00 2.992444e+04 7.760944e+02 4.787910e+05 1.433719e+10 16 cea37d6d 819200 0.000000e+00 9.620220e+03 2.335102e+02 1.058224e+05 1.018635e+09 11 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 7372800 0.000000e+00 6.793522e+04 8.600858e+02 6.793522e+05 4.615934e+10 10 afdd228b 3276800 0.000000e+00 2.989699e+04 1.490344e+03 3.587638e+05 1.075261e+10 12 cea37d6d 819200 0.000000e+00 9.974140e+03 1.055336e+03 1.097155e+05 1.106569e+09 11 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 7372800 0.000000e+00 6.962168e+04 1.952172e+02 1.322812e+06 9.209711e+10 19 afdd228b 3276800 0.000000e+00 3.047853e+04 4.777511e+01 4.571780e+05 1.393415e+10 15 cea37d6d 819200 0.000000e+00 1.119488e+04 2.171263e+03 1.231437e+05 1.430437e+09 11 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_dlu_lu_model_11.idgraf000066400000000000000000000212721320135501600306360ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 9 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb8) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 7372800 0.000000e+00 2.127055e+05 1.216918e+04 3.190582e+06 6.808756e+11 15 afdd228b 3276800 0.000000e+00 6.346686e+04 7.329654e+02 6.346686e+05 4.028580e+10 10 cea37d6d 819200 0.000000e+00 7.969263e+03 1.770463e+02 1.354775e+05 1.080188e+09 17 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb4) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 7372800 0.000000e+00 8.656100e+04 6.943816e+03 1.471537e+06 1.281974e+11 17 afdd228b 3276800 0.000000e+00 3.567215e+04 3.302464e+03 3.567215e+05 1.283409e+10 10 cea37d6d 819200 0.000000e+00 1.101988e+04 5.146633e+02 1.101988e+05 1.217027e+09 10 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 7 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda7_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 3276800 0.000000e+00 3.935885e+04 6.351673e+03 3.935885e+05 1.589463e+10 10 cea37d6d 819200 0.000000e+00 1.194615e+04 1.359754e+03 1.194615e+05 1.445595e+09 10 617e5fe6 7372800 0.000000e+00 8.781176e+04 9.198610e+03 1.317176e+06 1.169328e+11 15 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 7372800 0.000000e+00 8.754335e+04 8.654029e+03 1.575780e+06 1.392972e+11 18 afdd228b 3276800 0.000000e+00 3.542725e+04 1.501284e+03 3.542725e+05 1.257344e+10 10 cea37d6d 819200 0.000000e+00 1.193774e+04 1.685032e+03 1.193774e+05 1.453490e+09 10 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 4 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda4_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 7372800 0.000000e+00 8.763521e+04 5.876858e+03 9.639873e+05 8.485914e+10 11 afdd228b 3276800 0.000000e+00 3.909159e+04 6.650440e+03 4.300075e+05 1.729619e+10 11 cea37d6d 819200 0.000000e+00 1.211577e+04 1.649480e+03 1.211577e+05 1.495126e+09 10 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 7372800 0.000000e+00 8.616388e+04 4.981316e+03 1.550950e+06 1.340825e+11 18 afdd228b 3276800 0.000000e+00 3.647899e+04 2.965394e+03 4.377479e+05 1.607412e+10 12 cea37d6d 819200 0.000000e+00 1.073272e+04 1.010096e+02 1.073272e+05 1.152015e+09 10 #################### # COMB_6 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 6 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda6_impl0 (Comb6) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 7372800 0.000000e+00 8.786078e+04 7.200822e+03 1.317912e+06 1.165705e+11 15 afdd228b 3276800 0.000000e+00 3.795195e+04 3.399141e+03 3.795195e+05 1.451905e+10 10 cea37d6d 819200 0.000000e+00 1.163527e+04 1.023060e+03 1.163527e+05 1.364262e+09 10 #################### # COMB_7 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 5 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda5_impl0 (Comb7) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 7372800 0.000000e+00 8.814631e+04 6.725805e+03 1.498487e+06 1.328551e+11 17 cea37d6d 819200 0.000000e+00 1.170806e+04 1.094676e+03 1.170806e+05 1.382770e+09 10 afdd228b 3276800 0.000000e+00 4.283079e+04 7.621190e+03 4.283079e+05 1.892559e+10 10 #################### # COMB_5 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb5) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 7372800 0.000000e+00 9.172766e+04 1.075608e+04 1.375915e+06 1.279449e+11 15 cea37d6d 819200 0.000000e+00 1.117240e+04 8.447401e+02 1.117240e+05 1.255362e+09 10 afdd228b 3276800 0.000000e+00 3.472448e+04 1.278416e+03 3.819693e+05 1.328166e+10 11 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_dlu_lu_model_11.mirage000066400000000000000000000076521320135501600306540ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 3276800 0.000000e+00 7.065042e+04 7.118479e+03 1.271707e+06 9.075877e+10 18 617e5fe6 7372800 0.000000e+00 2.321971e+05 3.386520e+04 2.554168e+06 6.056858e+11 11 cea37d6d 819200 0.000000e+00 8.644872e+03 1.175676e+03 4.581782e+05 4.034149e+09 53 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 3276800 0.000000e+00 3.469534e+04 1.243993e+03 9.714695e+05 3.374879e+10 28 617e5fe6 7372800 0.000000e+00 8.533007e+04 9.757927e+03 1.194621e+06 1.032701e+11 14 cea37d6d 819200 0.000000e+00 1.145973e+04 6.017234e+02 1.145973e+05 1.316874e+09 10 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 3276800 0.000000e+00 3.498011e+04 2.179531e+03 6.996022e+05 2.456717e+10 20 617e5fe6 7372800 0.000000e+00 8.442764e+04 6.770170e+03 1.350842e+06 1.147818e+11 16 cea37d6d 819200 0.000000e+00 1.080764e+04 2.151492e+02 1.188840e+05 1.285365e+09 11 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 3276800 0.000000e+00 3.506064e+04 2.956747e+03 6.310915e+05 2.228383e+10 18 617e5fe6 7372800 0.000000e+00 8.151052e+04 4.250155e+02 1.059637e+06 8.637388e+10 13 cea37d6d 819200 0.000000e+00 1.153062e+04 1.200141e+03 1.153062e+05 1.343956e+09 10 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_dlu_lu_model_11.sirocco000066400000000000000000000126261320135501600310460ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb4) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 7372800 0.000000e+00 1.778570e+05 1.735127e+04 1.778570e+06 3.193419e+11 10 cea37d6d 819200 0.000000e+00 5.904224e+03 6.575598e+02 5.668055e+05 3.388055e+09 96 afdd228b 3276800 0.000000e+00 4.953149e+04 6.709149e+03 6.439093e+05 3.247895e+10 13 25ebb669 16588800 0.000000e+00 7.801727e+05 1.214440e+05 7.801727e+06 6.234180e+12 10 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb0) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 7372800 0.000000e+00 5.552387e+04 5.714037e+03 1.054954e+06 5.919546e+10 19 cea37d6d 819200 0.000000e+00 9.707597e+03 9.439210e+02 9.707597e+04 9.512842e+08 10 afdd228b 3276800 0.000000e+00 2.633937e+04 3.608518e+03 3.950905e+05 1.060175e+10 15 25ebb669 16588800 0.000000e+00 1.397955e+05 9.676594e+03 1.537750e+06 2.160006e+11 11 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb2) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 7372800 0.000000e+00 5.675882e+04 6.232185e+03 1.248694e+06 7.172888e+10 22 cea37d6d 819200 0.000000e+00 9.541018e+03 9.285702e+02 9.541018e+04 9.189326e+08 10 afdd228b 3276800 0.000000e+00 2.651477e+04 2.554649e+03 3.181772e+05 8.514711e+09 12 25ebb669 16588800 0.000000e+00 1.382255e+05 7.304438e+03 1.382255e+06 1.915965e+11 10 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb1) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 7372800 0.000000e+00 5.624387e+04 5.549003e+03 8.436581e+05 4.791247e+10 15 cea37d6d 819200 0.000000e+00 9.661577e+03 7.114114e+02 9.661577e+04 9.385217e+08 10 afdd228b 3276800 0.000000e+00 2.574090e+04 2.071791e+03 5.148179e+05 1.333772e+10 20 25ebb669 16588800 0.000000e+00 1.361676e+05 1.958095e+03 1.770178e+06 2.410907e+11 13 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb3) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 7372800 0.000000e+00 5.895007e+04 8.369498e+03 7.663509e+05 4.608707e+10 13 cea37d6d 819200 0.000000e+00 9.910778e+03 1.200981e+03 9.910778e+04 9.966588e+08 10 afdd228b 3276800 0.000000e+00 2.572979e+04 2.095041e+03 5.917851e+05 1.532746e+10 23 25ebb669 16588800 0.000000e+00 1.422314e+05 1.728252e+04 1.422314e+06 2.052844e+11 10 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_dlu_lu_model_12.attila000066400000000000000000000076671320135501600306750ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 8.869540e+04 4.010843e+03 1.765039e+07 1.568709e+12 199 d39bff17 6553600 0.000000e+00 2.736718e+04 1.452565e+03 3.886139e+06 1.066523e+11 142 2c1922b7 1638400 0.000000e+00 4.006489e+03 3.502972e+02 8.493756e+05 3.429028e+09 212 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 7.250005e+03 1.530886e+03 8.555006e+05 6.478930e+09 118 d39bff17 6553600 0.000000e+00 2.060505e+03 3.149423e+02 4.265246e+05 8.993882e+08 207 2c1922b7 1638400 0.000000e+00 5.794447e+02 1.035504e+02 9.155226e+04 5.474365e+07 158 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 6.906255e+03 1.105050e+03 1.042844e+06 7.386541e+09 151 d39bff17 6553600 0.000000e+00 2.044032e+03 3.248232e+02 3.863220e+05 8.095958e+08 189 2c1922b7 1638400 0.000000e+00 6.103626e+02 1.085471e+02 1.062031e+05 6.687255e+07 174 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 6.859160e+03 1.144150e+03 1.008296e+06 7.108501e+09 147 d39bff17 6553600 0.000000e+00 2.022724e+03 3.006626e+02 4.308402e+05 8.907256e+08 213 2c1922b7 1638400 0.000000e+00 5.771721e+02 9.999833e+01 9.638774e+04 5.730226e+07 167 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_dlu_lu_model_12.idgraf000066400000000000000000000213071320135501600306360ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 9 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 6.925318e+03 8.376976e+02 5.748014e+05 4.038926e+09 83 d39bff17 6553600 0.000000e+00 2.271937e+03 3.454949e+02 2.340095e+05 5.439496e+08 103 2c1922b7 1638400 0.000000e+00 7.049814e+02 1.197767e+02 1.254867e+05 9.101946e+07 178 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 7.291615e+03 1.041939e+03 4.593717e+05 3.417957e+09 63 d39bff17 6553600 0.000000e+00 2.282720e+03 4.096195e+02 3.903452e+05 9.197407e+08 171 2c1922b7 1638400 0.000000e+00 6.999720e+02 1.145665e+02 1.343946e+05 9.659256e+07 192 #################### # COMB_7 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 5 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda5_impl0 (Comb7) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 7.177388e+03 9.455873e+02 3.947563e+05 2.882497e+09 55 d39bff17 6553600 0.000000e+00 2.335362e+03 3.317057e+02 2.825788e+05 6.732374e+08 121 2c1922b7 1638400 0.000000e+00 7.266144e+02 9.381637e+01 4.432348e+04 3.274297e+07 61 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb8) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 9.210227e+04 5.563000e+02 1.252591e+07 1.153707e+12 136 d39bff17 6553600 0.000000e+00 2.809162e+04 4.267578e+02 1.573131e+06 4.420199e+10 56 2c1922b7 1638400 0.000000e+00 3.732094e+03 1.582101e+02 3.993341e+05 1.493031e+09 107 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 7 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda7_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 7.047943e+03 9.923280e+02 4.017327e+05 2.887518e+09 57 d39bff17 6553600 0.000000e+00 2.358363e+03 2.904964e+02 2.381946e+05 5.702726e+08 101 2c1922b7 1638400 0.000000e+00 7.376273e+02 1.192099e+02 4.425764e+04 3.349831e+07 60 #################### # COMB_5 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb5) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 7.125894e+03 1.170430e+03 6.769599e+05 4.954085e+09 95 d39bff17 6553600 0.000000e+00 2.913435e+03 7.837592e+02 2.651226e+05 8.283167e+08 91 2c1922b7 1638400 0.000000e+00 7.396845e+02 1.557697e+02 7.692719e+04 5.942533e+07 104 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 4 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda4_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 6.906666e+03 1.069281e+03 3.177066e+05 2.246888e+09 46 d39bff17 6553600 0.000000e+00 2.331985e+03 3.108312e+02 2.914982e+05 6.918465e+08 125 2c1922b7 1638400 0.000000e+00 7.036069e+02 1.117682e+02 5.277052e+04 3.806661e+07 75 #################### # COMB_6 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 6 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda6_impl0 (Comb6) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 7.634969e+03 1.278868e+03 4.122883e+05 3.236126e+09 54 d39bff17 6553600 0.000000e+00 2.361692e+03 2.763159e+02 1.747652e+05 4.183915e+08 74 2c1922b7 1638400 0.000000e+00 7.215132e+02 1.060983e+02 7.287283e+04 5.371565e+07 101 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb4) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 7.011366e+03 8.280915e+02 6.871138e+05 4.884809e+09 98 d39bff17 6553600 0.000000e+00 2.294721e+03 3.366230e+02 4.451759e+05 1.043537e+09 194 2c1922b7 1638400 0.000000e+00 6.840134e+02 1.166270e+02 1.114942e+05 7.848061e+07 163 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_dlu_lu_model_12.mirage000066400000000000000000000076661320135501600306620ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 6553600 0.000000e+00 2.758103e+04 7.024890e+02 7.033162e+06 1.941076e+11 255 ff82dda0 14745600 0.000000e+00 9.143755e+04 1.725750e+03 1.234407e+07 1.129114e+12 135 2c1922b7 1638400 0.000000e+00 3.516018e+03 1.528455e+02 1.613852e+06 5.685057e+09 459 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 6553600 0.000000e+00 2.131008e+03 3.294125e+02 6.755295e+05 1.473957e+09 317 ff82dda0 14745600 0.000000e+00 7.209283e+03 1.090675e+03 1.564414e+06 1.153644e+10 217 2c1922b7 1638400 0.000000e+00 6.237527e+02 1.148972e+02 1.210080e+05 7.804013e+07 194 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 6553600 0.000000e+00 2.163459e+03 3.374464e+02 5.538454e+05 1.227372e+09 256 ff82dda0 14745600 0.000000e+00 6.895326e+03 1.111793e+03 1.234263e+06 8.731908e+09 179 2c1922b7 1638400 0.000000e+00 6.290993e+02 1.019490e+02 1.333690e+05 8.610581e+07 212 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 6553600 0.000000e+00 2.119354e+03 3.243594e+02 5.912998e+05 1.282527e+09 279 ff82dda0 14745600 0.000000e+00 6.998019e+03 1.239620e+03 1.070697e+06 7.727865e+09 153 2c1922b7 1638400 0.000000e+00 6.140937e+02 1.075567e+02 1.430838e+05 9.056234e+07 233 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_dlu_lu_model_12.sirocco000066400000000000000000000126501320135501600310440ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb4) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 3.402547e+04 6.005726e+03 7.111323e+06 2.495045e+11 209 2c1922b7 1638400 0.000000e+00 6.443940e+03 1.476966e+03 1.610985e+05 1.092645e+09 25 d39bff17 6553600 0.000000e+00 1.041247e+04 1.992240e+03 3.092503e+06 3.337940e+10 297 0e8bce2b 33177600 0.000000e+00 1.103734e+05 1.699353e+04 1.037510e+07 1.172281e+12 94 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb1) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 3.238292e+03 4.902889e+02 6.768030e+05 2.241926e+09 209 2c1922b7 1638400 0.000000e+00 5.889641e+02 1.063542e+02 1.272162e+05 7.736903e+07 216 d39bff17 6553600 0.000000e+00 1.349909e+03 1.936514e+02 2.942801e+05 4.054266e+08 218 0e8bce2b 33177600 0.000000e+00 7.038455e+03 8.353918e+02 1.182460e+06 8.439938e+09 168 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb2) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 3.179744e+03 4.016259e+02 6.804652e+05 2.198224e+09 214 2c1922b7 1638400 0.000000e+00 5.796961e+02 1.048897e+02 1.199971e+05 7.183924e+07 207 d39bff17 6553600 0.000000e+00 1.343917e+03 2.039127e+02 2.244341e+05 3.085646e+08 167 0e8bce2b 33177600 0.000000e+00 6.913467e+03 8.366528e+02 1.244424e+06 8.729283e+09 180 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb3) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 3.362936e+03 5.457359e+02 6.524096e+05 2.251791e+09 194 2c1922b7 1638400 0.000000e+00 5.405600e+02 9.344101e+01 1.513568e+05 8.426217e+07 280 d39bff17 6553600 0.000000e+00 1.275634e+03 1.830051e+02 2.270629e+05 2.956105e+08 178 0e8bce2b 33177600 0.000000e+00 6.852169e+03 8.897789e+02 8.291125e+05 5.777016e+09 121 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb0) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 3.306190e+03 4.921154e+02 7.009122e+05 2.368690e+09 212 2c1922b7 1638400 0.000000e+00 5.641572e+02 1.012475e+02 1.376544e+05 8.015997e+07 244 d39bff17 6553600 0.000000e+00 1.355727e+03 1.656730e+02 2.331851e+05 3.208564e+08 172 0e8bce2b 33177600 0.000000e+00 6.732998e+03 6.928655e+02 1.144610e+06 7.788266e+09 170 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_dlu_lu_model_21.attila000066400000000000000000000076671320135501600306750ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 8.795690e+04 4.598673e+03 1.715160e+07 1.512725e+12 195 d39bff17 6553600 0.000000e+00 2.744119e+04 1.740624e+03 4.390591e+06 1.209678e+11 160 2c1922b7 1638400 0.000000e+00 4.091631e+03 5.062810e+02 7.283104e+05 3.025603e+09 178 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 6.847320e+03 1.168001e+03 8.285257e+05 5.838253e+09 121 d39bff17 6553600 0.000000e+00 2.123746e+03 3.153004e+02 4.226254e+05 9.173322e+08 199 2c1922b7 1638400 0.000000e+00 5.446913e+02 9.530021e+01 1.040360e+05 5.840221e+07 191 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 6.816836e+03 1.179433e+03 1.172496e+06 8.231973e+09 172 d39bff17 6553600 0.000000e+00 2.055421e+03 3.154533e+02 3.864192e+05 8.129623e+08 188 2c1922b7 1638400 0.000000e+00 6.121868e+02 1.314710e+02 9.550115e+04 6.116094e+07 156 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 6.940618e+03 1.147691e+03 1.006390e+06 7.175959e+09 145 d39bff17 6553600 0.000000e+00 2.093041e+03 3.377347e+02 3.851195e+05 8.270585e+08 184 2c1922b7 1638400 0.000000e+00 6.098259e+02 1.286153e+02 1.091588e+05 6.952888e+07 179 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_dlu_lu_model_21.idgraf000066400000000000000000000213051320135501600306340ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 9 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb4) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 6.700359e+03 1.036459e+03 3.886208e+05 2.666205e+09 58 d39bff17 6553600 0.000000e+00 2.067623e+03 3.658691e+02 3.825102e+05 8.156510e+08 185 2c1922b7 1638400 0.000000e+00 6.344928e+02 1.313164e+02 1.091328e+05 7.220992e+07 172 #################### # COMB_5 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb5) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 6.634729e+03 1.380283e+03 4.777005e+05 3.306586e+09 72 d39bff17 6553600 0.000000e+00 2.102108e+03 3.770829e+02 2.690698e+05 5.838144e+08 128 2c1922b7 1638400 0.000000e+00 6.251127e+02 1.334964e+02 1.168961e+05 7.640580e+07 187 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 4 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda4_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 5.973111e+03 7.873858e+02 4.420102e+05 2.686054e+09 74 d39bff17 6553600 0.000000e+00 2.088129e+03 3.411148e+02 2.129891e+05 4.566174e+08 102 2c1922b7 1638400 0.000000e+00 5.816119e+02 1.098601e+02 6.165086e+04 3.713622e+07 106 #################### # COMB_6 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 6 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda6_impl0 (Comb6) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 5.813439e+03 5.835403e+02 2.441645e+05 1.433737e+09 42 d39bff17 6553600 0.000000e+00 2.170079e+03 5.032568e+02 7.161259e+04 1.637628e+08 33 2c1922b7 1638400 0.000000e+00 6.080488e+02 1.225789e+02 3.101049e+04 1.962219e+07 51 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb8) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 9.133611e+04 7.141260e+02 1.032098e+07 9.427358e+11 113 d39bff17 6553600 0.000000e+00 2.797330e+04 6.068477e+02 1.482585e+06 4.149232e+10 53 2c1922b7 1638400 0.000000e+00 3.803279e+03 2.345034e+02 3.308852e+05 1.263233e+09 87 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 6.609495e+03 1.035460e+03 4.296172e+05 2.909244e+09 65 d39bff17 6553600 0.000000e+00 2.129873e+03 3.868465e+02 3.407797e+05 7.497615e+08 160 2c1922b7 1638400 0.000000e+00 6.443548e+02 1.239934e+02 8.054435e+04 5.382094e+07 125 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 7 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda7_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 5.938773e+03 5.045720e+02 2.078570e+05 1.243326e+09 35 d39bff17 6553600 0.000000e+00 2.180034e+03 4.239424e+02 1.286220e+05 2.910041e+08 59 2c1922b7 1638400 0.000000e+00 5.996256e+02 1.220514e+02 5.816368e+04 3.632139e+07 97 #################### # COMB_7 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 5 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda5_impl0 (Comb7) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 6.467618e+03 9.651621e+02 2.910428e+05 1.924273e+09 45 d39bff17 6553600 0.000000e+00 2.057931e+03 3.333471e+02 1.872717e+05 3.955042e+08 91 2c1922b7 1638400 0.000000e+00 6.141799e+02 1.365857e+02 5.159111e+04 3.325329e+07 84 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 6.429538e+03 9.929716e+02 5.015040e+05 3.301346e+09 78 d39bff17 6553600 0.000000e+00 2.056349e+03 3.356881e+02 4.565094e+05 9.637588e+08 222 2c1922b7 1638400 0.000000e+00 6.374873e+02 1.360140e+02 9.498561e+04 6.330859e+07 149 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_dlu_lu_model_21.mirage000066400000000000000000000076661320135501600306620ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 6553600 0.000000e+00 2.762618e+04 9.983022e+02 6.575032e+06 1.818802e+11 238 ff82dda0 14745600 0.000000e+00 9.068591e+04 1.985325e+03 1.324014e+07 1.201270e+12 146 2c1922b7 1638400 0.000000e+00 3.579286e+03 2.361748e+02 1.449611e+06 5.211162e+09 405 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 6553600 0.000000e+00 2.106536e+03 3.670134e+02 5.856171e+05 1.271070e+09 278 ff82dda0 14745600 0.000000e+00 7.299043e+03 1.073594e+03 1.284632e+06 9.579441e+09 176 2c1922b7 1638400 0.000000e+00 6.166979e+02 1.186269e+02 1.362902e+05 8.715990e+07 221 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 6553600 0.000000e+00 2.072463e+03 3.421274e+02 6.590431e+05 1.403064e+09 318 ff82dda0 14745600 0.000000e+00 6.791353e+03 1.183637e+03 1.195278e+06 8.364131e+09 176 2c1922b7 1638400 0.000000e+00 6.128580e+02 1.104622e+02 1.378931e+05 8.725430e+07 225 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 6553600 0.000000e+00 2.129169e+03 3.327197e+02 5.024838e+05 1.095999e+09 236 ff82dda0 14745600 0.000000e+00 6.700018e+03 1.125184e+03 1.139003e+06 7.846568e+09 170 2c1922b7 1638400 0.000000e+00 6.207819e+02 1.142635e+02 1.440214e+05 9.243491e+07 232 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_dlu_lu_model_21.sirocco000066400000000000000000000126451320135501600310500ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb4) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 4.935132e+04 1.056942e+04 1.875350e+06 9.679609e+10 38 2c1922b7 1638400 0.000000e+00 1.386830e+03 2.636504e+02 1.256468e+06 1.805486e+09 906 d39bff17 6553600 0.000000e+00 1.762919e+04 3.396463e+03 6.170218e+05 1.128135e+10 35 0e8bce2b 33177600 0.000000e+00 2.090375e+05 4.666688e+04 3.762675e+06 8.257406e+11 18 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb0) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 2.580226e+03 3.710017e+02 5.495882e+05 1.447380e+09 213 2c1922b7 1638400 0.000000e+00 3.441326e+02 6.695097e+01 4.267244e+04 1.524080e+07 124 d39bff17 6553600 0.000000e+00 9.089165e+02 1.570596e+02 1.590604e+05 1.488895e+08 175 0e8bce2b 33177600 0.000000e+00 5.659456e+03 7.119452e+02 1.058318e+06 6.084289e+09 187 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb2) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 2.485190e+03 3.288259e+02 6.188122e+05 1.564789e+09 249 2c1922b7 1638400 0.000000e+00 3.565977e+02 7.541526e+01 3.672956e+04 1.368348e+07 103 d39bff17 6553600 0.000000e+00 9.441529e+02 1.527244e+02 2.398148e+05 2.323464e+08 254 0e8bce2b 33177600 0.000000e+00 5.713813e+03 7.827526e+02 8.456444e+05 4.922534e+09 148 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb3) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 2.615067e+03 4.428563e+02 5.334737e+05 1.435078e+09 204 2c1922b7 1638400 0.000000e+00 3.667814e+02 6.561130e+01 3.227676e+04 1.221734e+07 88 d39bff17 6553600 0.000000e+00 9.018562e+02 1.587421e+02 1.470026e+05 1.366826e+08 163 0e8bce2b 33177600 0.000000e+00 5.604694e+03 6.527594e+02 1.132148e+06 6.431415e+09 202 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb1) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 2.480709e+03 3.749281e+02 4.514890e+05 1.145597e+09 182 2c1922b7 1638400 0.000000e+00 3.718262e+02 7.249781e+01 2.342505e+04 9.041172e+06 63 d39bff17 6553600 0.000000e+00 9.130900e+02 1.739240e+02 2.182285e+05 2.064919e+08 239 0e8bce2b 33177600 0.000000e+00 5.804941e+03 6.806052e+02 9.113758e+05 5.363209e+09 157 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_dlu_lu_model_22.attila000066400000000000000000000077031320135501600306650ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 22118400 0.000000e+00 1.687897e+05 8.023245e+03 3.110794e+08 5.262564e+13 1843 f0ac7beb 9830400 0.000000e+00 5.125521e+04 2.656019e+03 7.375625e+07 3.790543e+12 1439 d46431bb 2457600 0.000000e+00 6.821106e+03 3.878220e+02 1.100926e+07 7.533811e+10 1614 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 22118400 0.000000e+00 5.852261e+03 2.067645e+02 2.783335e+07 1.630914e+11 4756 f0ac7beb 9830400 0.000000e+00 1.831142e+03 6.447275e+01 9.274735e+06 1.700441e+10 5065 d46431bb 2457600 0.000000e+00 2.556618e+02 1.838263e+01 1.252232e+06 3.218030e+08 4898 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 22118400 0.000000e+00 5.846675e+03 2.141855e+02 2.732736e+07 1.599886e+11 4674 f0ac7beb 9830400 0.000000e+00 1.834114e+03 5.380375e+01 9.566740e+06 1.756159e+10 5216 d46431bb 2457600 0.000000e+00 2.610266e+02 2.020042e+01 1.246402e+06 3.272925e+08 4775 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 22118400 0.000000e+00 5.840318e+03 1.756302e+02 2.921911e+07 1.708032e+11 5003 f0ac7beb 9830400 0.000000e+00 1.840833e+03 4.879997e+01 9.542881e+06 1.757920e+10 5184 d46431bb 2457600 0.000000e+00 2.617920e+02 1.853601e+01 1.281472e+06 3.371609e+08 4895 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_dlu_lu_model_22.idgraf000066400000000000000000000213551320135501600306420ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 9 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 22118400 0.000000e+00 5.901996e+03 2.140574e+02 2.574451e+07 1.521439e+11 4362 f0ac7beb 9830400 0.000000e+00 1.855425e+03 1.035707e+02 7.464374e+06 1.389274e+10 4023 d46431bb 2457600 0.000000e+00 2.667843e+02 3.133790e+01 9.321442e+05 2.521128e+08 3494 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 4 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda4_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 22118400 0.000000e+00 5.924812e+03 2.030546e+02 2.715934e+07 1.611030e+11 4584 f0ac7beb 9830400 0.000000e+00 1.850857e+03 1.138114e+02 6.774137e+06 1.258537e+10 3660 d46431bb 2457600 0.000000e+00 2.743267e+02 3.237528e+01 7.903352e+05 2.198298e+08 2881 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb4) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 22118400 0.000000e+00 5.905959e+03 2.324106e+02 2.885061e+07 1.706544e+11 4885 f0ac7beb 9830400 0.000000e+00 1.844033e+03 9.904039e+01 7.516278e+06 1.390024e+10 4076 d46431bb 2457600 0.000000e+00 2.662813e+02 2.651200e+01 1.098144e+06 2.953140e+08 4124 #################### # COMB_5 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb5) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 22118400 0.000000e+00 5.905860e+03 2.088868e+02 2.619840e+07 1.549176e+11 4436 f0ac7beb 9830400 0.000000e+00 1.843182e+03 9.714398e+01 7.671323e+06 1.417892e+10 4162 d46431bb 2457600 0.000000e+00 2.666213e+02 3.154593e+01 1.003829e+06 2.713890e+08 3765 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 22118400 0.000000e+00 5.916743e+03 2.291447e+02 2.686793e+07 1.592091e+11 4541 f0ac7beb 9830400 0.000000e+00 1.837574e+03 9.255327e+01 7.197777e+06 1.326000e+10 3917 d46431bb 2457600 0.000000e+00 2.645367e+02 2.904285e+01 1.078252e+06 2.886751e+08 4076 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb8) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 22118400 0.000000e+00 1.776444e+05 1.603881e+03 1.085407e+08 1.928322e+13 611 f0ac7beb 9830400 0.000000e+00 5.438487e+04 1.553469e+03 1.598915e+07 8.702776e+11 294 d46431bb 2457600 0.000000e+00 6.892168e+03 1.879454e+02 4.218007e+06 2.909283e+10 612 #################### # COMB_6 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 6 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda6_impl0 (Comb6) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 22118400 0.000000e+00 5.908798e+03 2.191022e+02 2.432652e+07 1.439381e+11 4117 f0ac7beb 9830400 0.000000e+00 1.870298e+03 1.158137e+02 6.306645e+06 1.184053e+10 3372 d46431bb 2457600 0.000000e+00 2.622005e+02 3.221213e+01 7.630036e+05 2.030794e+08 2910 #################### # COMB_7 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 5 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda5_impl0 (Comb7) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 22118400 0.000000e+00 5.908890e+03 2.133901e+02 2.731089e+07 1.615875e+11 4622 f0ac7beb 9830400 0.000000e+00 1.853662e+03 1.234628e+02 6.493379e+06 1.208993e+10 3503 d46431bb 2457600 0.000000e+00 2.672063e+02 3.249622e+01 7.262666e+05 1.969332e+08 2718 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 7 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda7_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 22118400 0.000000e+00 5.908429e+03 2.149126e+02 2.371053e+07 1.402773e+11 4013 f0ac7beb 9830400 0.000000e+00 1.855601e+03 1.161756e+02 6.509447e+06 1.212628e+10 3508 d46431bb 2457600 0.000000e+00 2.697690e+02 3.186509e+01 7.013994e+05 1.918558e+08 2600 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_dlu_lu_model_22.mirage000066400000000000000000000077021320135501600306520ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f0ac7beb 9830400 0.000000e+00 5.319005e+04 1.072845e+03 1.074439e+08 5.717271e+12 2020 24c84a50 22118400 0.000000e+00 1.747556e+05 3.288616e+03 2.457064e+08 4.295378e+13 1406 d46431bb 2457600 0.000000e+00 6.731248e+03 2.017842e+02 1.758875e+07 1.185006e+11 2613 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f0ac7beb 9830400 0.000000e+00 1.857771e+03 5.953793e+01 1.442559e+07 2.682697e+10 7765 24c84a50 22118400 0.000000e+00 5.825821e+03 1.536397e+02 3.023019e+07 1.762382e+11 5189 d46431bb 2457600 0.000000e+00 2.626388e+02 2.130047e+01 1.891262e+06 4.999858e+08 7201 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f0ac7beb 9830400 0.000000e+00 1.841710e+03 6.898710e+01 1.448873e+07 2.672149e+10 7867 24c84a50 22118400 0.000000e+00 5.866678e+03 1.842980e+02 2.977339e+07 1.748433e+11 5075 d46431bb 2457600 0.000000e+00 2.614108e+02 2.029949e+01 1.936531e+06 5.092829e+08 7408 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f0ac7beb 9830400 0.000000e+00 1.853277e+03 6.983878e+01 1.439996e+07 2.672502e+10 7770 24c84a50 22118400 0.000000e+00 5.858635e+03 1.761006e+02 3.008995e+07 1.764453e+11 5136 d46431bb 2457600 0.000000e+00 2.701366e+02 1.779276e+01 1.899060e+06 5.152311e+08 7030 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_dlu_lu_model_22.sirocco000066400000000000000000000126761320135501600310550ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 5 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb0) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 22118400 0.000000e+00 1.754881e+03 1.567907e+02 8.516439e+06 1.506464e+10 4853 d46431bb 2457600 0.000000e+00 9.227862e+01 1.339393e+01 6.585925e+05 6.205436e+07 7137 f0ac7beb 9830400 0.000000e+00 5.560171e+02 4.481480e+01 2.452035e+06 1.372230e+09 4410 8cfc3ba0 49766400 0.000000e+00 5.688840e+03 4.278238e+02 1.962081e+07 1.122509e+11 3449 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb3) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 22118400 0.000000e+00 1.725012e+03 1.556789e+02 8.775134e+06 1.526049e+10 5087 d46431bb 2457600 0.000000e+00 9.099306e+01 1.290433e+01 7.117477e+05 6.606663e+07 7822 f0ac7beb 9830400 0.000000e+00 5.497124e+02 4.364744e+01 2.308242e+06 1.276869e+09 4199 8cfc3ba0 49766400 0.000000e+00 5.591076e+03 4.188165e+02 1.997692e+07 1.123192e+11 3573 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb2) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 22118400 0.000000e+00 1.724207e+03 1.559700e+02 8.529651e+06 1.482723e+10 4947 d46431bb 2457600 0.000000e+00 9.395983e+01 1.410875e+01 5.884704e+05 5.653928e+07 6263 f0ac7beb 9830400 0.000000e+00 5.531811e+02 3.935565e+01 3.264875e+06 1.815209e+09 5902 8cfc3ba0 49766400 0.000000e+00 5.682607e+03 4.627422e+02 2.006529e+07 1.147792e+11 3531 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb4) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 22118400 0.000000e+00 6.659236e+04 1.142300e+04 1.507651e+08 1.033522e+13 2264 d46431bb 2457600 0.000000e+00 3.623237e+03 8.721045e+02 1.668138e+07 6.394225e+10 4604 f0ac7beb 9830400 0.000000e+00 2.355764e+04 4.984182e+03 4.405279e+07 1.084235e+12 1870 8cfc3ba0 49766400 0.000000e+00 2.164742e+05 3.673582e+04 3.325044e+08 7.405148e+13 1536 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb1) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 22118400 0.000000e+00 1.746747e+03 1.539679e+02 8.628932e+06 1.518967e+10 4940 d46431bb 2457600 0.000000e+00 9.539483e+01 1.447066e+01 7.032507e+05 6.863017e+07 7372 f0ac7beb 9830400 0.000000e+00 5.601014e+02 3.783630e+01 3.218342e+06 1.810824e+09 5746 8cfc3ba0 49766400 0.000000e+00 5.710157e+03 4.302245e+02 2.027106e+07 1.164080e+11 3550 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_sgemm_gemm.attila000066400000000000000000000076641320135501600300410ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 33177600 7.077888e+09 3.328725e+05 1.185902e+04 2.563119e+07 8.542747e+12 77 0b0b0ce8 3686400 2.621440e+08 1.421718e+04 3.409134e+02 9.098993e+05 1.294364e+10 64 4220e23d 14745600 2.097152e+09 1.008105e+05 2.361630e+03 8.064841e+06 8.134670e+11 80 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 33177600 7.077888e+09 1.123499e+04 6.785566e+01 1.190909e+06 1.338033e+10 106 0b0b0ce8 3686400 2.621440e+08 6.738679e+02 4.393713e+01 6.873452e+04 4.651489e+07 102 4220e23d 14745600 2.097152e+09 5.557425e+03 3.241733e+02 5.835297e+05 3.253957e+09 105 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 33177600 7.077888e+09 1.123077e+04 9.504466e+01 1.179231e+06 1.324463e+10 105 0b0b0ce8 3686400 2.621440e+08 6.672056e+02 3.376608e+01 6.805497e+04 4.552295e+07 102 4220e23d 14745600 2.097152e+09 5.553764e+03 3.500896e+02 5.831453e+05 3.251521e+09 105 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 33177600 7.077888e+09 1.124174e+04 2.629960e+01 1.180383e+06 1.326963e+10 105 0b0b0ce8 3686400 2.621440e+08 6.002221e+02 2.259043e+01 6.242310e+04 3.752080e+07 104 4220e23d 14745600 2.097152e+09 5.577722e+03 1.615194e+02 5.912385e+05 3.300529e+09 106 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_sgemm_gemm.idgraf000066400000000000000000000212721320135501600300060ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 9 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 3686400 2.621440e+08 6.801013e+02 7.013561e+01 4.760709e+04 3.272198e+07 70 4220e23d 14745600 2.097152e+09 5.623635e+03 5.419920e+02 4.442672e+05 2.521603e+09 79 492beed5 33177600 7.077888e+09 1.150361e+04 5.884814e+02 1.000814e+06 1.154310e+10 87 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb4) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 3686400 2.621440e+08 6.717051e+02 6.137607e+01 4.500424e+04 3.048197e+07 67 4220e23d 14745600 2.097152e+09 5.648275e+03 4.677390e+02 4.575103e+05 2.601865e+09 81 492beed5 33177600 7.077888e+09 1.157020e+04 6.521027e+02 1.018178e+06 1.181795e+10 88 #################### # COMB_6 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb6) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 3686400 2.621440e+08 6.265559e+02 5.536840e+01 4.824481e+04 3.046412e+07 77 4220e23d 14745600 2.097152e+09 5.631203e+03 4.767455e+02 4.561275e+05 2.586957e+09 81 492beed5 33177600 7.077888e+09 1.162826e+04 6.757302e+02 1.023286e+06 1.193922e+10 88 #################### # COMB_7 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb7) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 3686400 2.621440e+08 6.780899e+02 4.241206e+01 4.543202e+04 3.092751e+07 67 4220e23d 14745600 2.097152e+09 5.857201e+03 8.346836e+02 4.744333e+05 2.835284e+09 81 492beed5 33177600 7.077888e+09 1.150498e+04 4.254093e+02 9.894285e+05 1.139892e+10 86 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 4 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda4_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 3686400 2.621440e+08 6.759139e+02 4.092799e+01 4.190666e+04 2.842915e+07 62 4220e23d 14745600 2.097152e+09 5.527477e+03 2.733928e+02 4.421982e+05 2.450220e+09 80 492beed5 33177600 7.077888e+09 1.146770e+04 1.768909e+02 1.100899e+06 1.262778e+10 96 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 5 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda5_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 3686400 2.621440e+08 6.339465e+02 7.125158e+01 4.184047e+04 2.685969e+07 66 4220e23d 14745600 2.097152e+09 5.624130e+03 4.755864e+02 4.668028e+05 2.644133e+09 83 492beed5 33177600 7.077888e+09 1.149102e+04 5.375188e+02 1.114629e+06 1.283625e+10 97 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 6 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda6_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 3686400 2.621440e+08 6.389750e+02 8.615382e+01 4.728415e+04 3.076266e+07 74 4220e23d 14745600 2.097152e+09 5.648331e+03 5.220897e+02 4.631632e+05 2.638450e+09 82 492beed5 33177600 7.077888e+09 1.155069e+04 5.660846e+02 1.108866e+06 1.283893e+10 96 #################### # COMB_5 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 7 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda7_impl0 (Comb5) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 3686400 2.621440e+08 6.386625e+02 8.094896e+01 4.342905e+04 2.818209e+07 68 4220e23d 14745600 2.097152e+09 5.638657e+03 3.709019e+02 4.454539e+05 2.522630e+09 79 492beed5 33177600 7.077888e+09 1.144012e+04 2.531108e+02 1.109691e+06 1.270122e+10 97 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb8) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 3686400 2.621440e+08 1.414338e+04 6.441210e+02 3.535844e+05 5.011251e+09 25 4220e23d 14745600 2.097152e+09 1.091117e+05 2.701159e+03 3.382462e+06 3.692924e+11 31 492beed5 33177600 7.077888e+09 3.621356e+05 7.764608e+03 8.329119e+06 3.017657e+12 23 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_sgemm_gemm.mirage000066400000000000000000000076641320135501600300270ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 3686400 2.621440e+08 1.352609e+04 3.616534e+02 1.082087e+06 1.464687e+10 80 492beed5 33177600 7.077888e+09 3.550396e+05 8.949994e+03 2.840317e+07 1.009066e+13 80 4220e23d 14745600 2.097152e+09 1.078112e+05 1.983800e+03 8.624897e+06 9.301755e+11 80 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 3686400 2.621440e+08 6.589631e+02 8.406511e+00 6.787320e+04 4.473321e+07 103 492beed5 33177600 7.077888e+09 1.151398e+04 9.050114e+01 1.220482e+06 1.405348e+10 106 4220e23d 14745600 2.097152e+09 5.574713e+03 3.353004e+02 5.909196e+05 3.306125e+09 106 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 3686400 2.621440e+08 6.663664e+02 8.616537e+01 6.796937e+04 4.604980e+07 102 492beed5 33177600 7.077888e+09 1.150036e+04 8.404527e+01 1.207538e+06 1.388786e+10 105 4220e23d 14745600 2.097152e+09 5.579034e+03 3.672012e+02 5.857985e+05 3.282348e+09 105 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 3686400 2.621440e+08 6.181769e+02 5.174143e+01 6.181769e+04 3.848198e+07 100 492beed5 33177600 7.077888e+09 1.148096e+04 7.289415e+01 1.205501e+06 1.384086e+10 105 4220e23d 14745600 2.097152e+09 5.580581e+03 3.970717e+02 5.859610e+05 3.286558e+09 105 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_sgemm_gemm.sirocco000066400000000000000000000126511320135501600302140ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 5 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb2) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 33177600 7.077888e+09 2.745578e+03 3.064191e+02 6.616844e+05 1.839335e+09 241 0b0b0ce8 3686400 2.621440e+08 1.582927e+02 3.333442e+01 3.434951e+04 5.678402e+06 217 4220e23d 14745600 2.097152e+09 8.206871e+02 1.017181e+02 1.148962e+05 9.574235e+07 140 87a7dc42 74649600 2.388787e+10 9.813897e+03 7.998509e+02 1.570224e+06 1.551237e+10 160 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb1) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 33177600 7.077888e+09 2.686428e+03 2.002215e+02 6.716071e+05 1.814247e+09 250 0b0b0ce8 3686400 2.621440e+08 1.630480e+02 3.438768e+01 3.097912e+04 5.275762e+06 190 4220e23d 14745600 2.097152e+09 8.448030e+02 7.773742e+01 2.433033e+05 2.072837e+08 288 87a7dc42 74649600 2.388787e+10 9.873153e+03 8.026227e+02 1.579704e+06 1.569974e+10 160 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb0) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 33177600 7.077888e+09 2.791098e+03 3.147711e+02 6.503258e+05 1.838209e+09 233 0b0b0ce8 3686400 2.621440e+08 1.624855e+02 3.298013e+01 2.940987e+04 4.975550e+06 181 4220e23d 14745600 2.097152e+09 8.152506e+02 1.017614e+02 1.173961e+05 9.719839e+07 144 87a7dc42 74649600 2.388787e+10 1.001360e+04 7.827579e+02 1.582149e+06 1.593981e+10 158 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb3) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 33177600 7.077888e+09 2.754203e+03 2.682327e+02 6.830422e+05 1.899080e+09 248 0b0b0ce8 3686400 2.621440e+08 1.622246e+02 3.553894e+01 3.714942e+04 6.315779e+06 229 4220e23d 14745600 2.097152e+09 8.611626e+02 9.290485e+01 2.411255e+05 2.100651e+08 280 87a7dc42 74649600 2.388787e+10 9.935915e+03 7.366769e+02 1.569875e+06 1.568389e+10 158 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb4) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 33177600 7.077888e+09 1.712078e+05 4.163047e+04 2.773567e+07 5.029326e+12 162 0b0b0ce8 3686400 2.621440e+08 6.441655e+03 1.152866e+03 3.220827e+05 2.141201e+09 50 4220e23d 14745600 2.097152e+09 4.927734e+04 1.166029e+04 5.913281e+06 3.077063e+11 120 87a7dc42 74649600 2.388787e+10 5.091210e+05 1.022002e+05 6.974957e+07 3.694192e+13 137 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_slu_lu_model_11.attila000066400000000000000000000076521320135501600307050ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 1638400 0.000000e+00 4.182946e+04 4.195402e+03 1.171225e+06 4.948453e+10 28 617e5fe6 3686400 0.000000e+00 1.431791e+05 1.961610e+04 1.431791e+06 2.088506e+11 10 cea37d6d 409600 0.000000e+00 4.839229e+03 3.061560e+02 1.258200e+05 6.113086e+08 26 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 1638400 0.000000e+00 2.565619e+04 2.729977e+03 4.618114e+05 1.198247e+10 18 617e5fe6 3686400 0.000000e+00 5.517976e+04 5.023576e+03 8.828762e+05 4.912068e+10 16 cea37d6d 409600 0.000000e+00 9.325377e+03 4.741281e+02 9.325377e+04 8.718745e+08 10 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 1638400 0.000000e+00 2.512124e+04 2.223761e+03 4.773036e+05 1.208442e+10 19 617e5fe6 3686400 0.000000e+00 5.116041e+04 1.272422e+03 7.674062e+05 3.928511e+10 15 cea37d6d 409600 0.000000e+00 9.353760e+03 7.152342e+02 9.353760e+04 8.800438e+08 10 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 1638400 0.000000e+00 2.814234e+04 3.880171e+03 5.065622e+05 1.452685e+10 18 617e5fe6 3686400 0.000000e+00 5.467956e+04 6.741916e+03 8.201934e+05 4.552961e+10 15 cea37d6d 409600 0.000000e+00 1.004502e+04 9.839619e+02 1.004502e+05 1.018706e+09 10 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_slu_lu_model_11.idgraf000066400000000000000000000212721320135501600306550ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 9 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb8) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n cea37d6d 409600 0.000000e+00 4.307978e+03 6.474305e+01 1.249314e+05 5.383232e+08 29 afdd228b 1638400 0.000000e+00 3.550524e+04 4.451382e+02 3.550524e+05 1.260821e+10 10 617e5fe6 3686400 0.000000e+00 1.169735e+05 9.368471e+02 1.169735e+06 1.368368e+11 10 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n cea37d6d 409600 0.000000e+00 1.140547e+04 1.799023e+03 1.140547e+05 1.333212e+09 10 afdd228b 1638400 0.000000e+00 2.728447e+04 8.307498e+02 2.728447e+05 7.451326e+09 10 617e5fe6 3686400 0.000000e+00 6.234962e+04 7.670296e+03 6.858458e+05 4.340939e+10 11 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 5 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda5_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 1638400 0.000000e+00 3.084154e+04 4.741973e+03 3.084154e+05 9.736872e+09 10 cea37d6d 409600 0.000000e+00 1.194801e+04 1.916839e+03 1.194801e+05 1.464291e+09 10 617e5fe6 3686400 0.000000e+00 6.590141e+04 1.170188e+04 6.590141e+05 4.479930e+10 10 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 6 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda6_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 7.169178e+04 1.134864e+04 7.886096e+05 5.795353e+10 11 cea37d6d 409600 0.000000e+00 1.144166e+04 1.161786e+03 1.144166e+05 1.322613e+09 10 afdd228b 1638400 0.000000e+00 2.872444e+04 2.010264e+03 3.159688e+05 9.120481e+09 11 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 4 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda4_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n cea37d6d 409600 0.000000e+00 1.150326e+04 1.434617e+03 1.150326e+05 1.343832e+09 10 afdd228b 1638400 0.000000e+00 3.088151e+04 4.858348e+03 3.088151e+05 9.772711e+09 10 617e5fe6 3686400 0.000000e+00 6.102500e+04 7.308309e+03 6.102500e+05 3.777463e+10 10 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 7 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda7_impl0 (Comb4) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 5.751510e+04 2.006299e+03 6.901812e+05 3.974415e+10 12 cea37d6d 409600 0.000000e+00 1.125363e+04 1.219431e+03 1.125363e+05 1.281312e+09 10 afdd228b 1638400 0.000000e+00 3.238968e+04 5.459084e+03 3.238968e+05 1.078893e+10 10 #################### # COMB_6 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb6) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 1638400 0.000000e+00 2.926764e+04 3.325362e+03 3.219440e+05 9.544181e+09 11 cea37d6d 409600 0.000000e+00 1.088648e+04 1.129883e+03 1.088648e+05 1.197920e+09 10 617e5fe6 3686400 0.000000e+00 6.506731e+04 1.183046e+04 8.458750e+05 5.685829e+10 13 #################### # COMB_5 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb5) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 1638400 0.000000e+00 2.775893e+04 1.476662e+03 3.331071e+05 9.272862e+09 12 cea37d6d 409600 0.000000e+00 1.026126e+04 8.160679e+01 1.026126e+05 1.053001e+09 10 617e5fe6 3686400 0.000000e+00 6.215917e+04 1.023772e+04 6.215917e+05 3.968573e+10 10 #################### # COMB_7 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb7) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n cea37d6d 409600 0.000000e+00 1.022286e+04 3.601879e+01 1.022286e+05 1.045081e+09 10 afdd228b 1638400 0.000000e+00 2.891317e+04 4.592264e+03 2.891317e+05 8.570604e+09 10 617e5fe6 3686400 0.000000e+00 5.724831e+04 3.045025e+03 7.442280e+05 4.272633e+10 13 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_slu_lu_model_11.mirage000066400000000000000000000076521320135501600306730ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 1638400 0.000000e+00 3.789658e+04 4.182352e+03 1.250587e+06 4.797021e+10 33 617e5fe6 3686400 0.000000e+00 1.286436e+05 1.271269e+04 2.958803e+06 3.843483e+11 23 cea37d6d 409600 0.000000e+00 4.236597e+03 2.366692e+02 2.372495e+05 1.008267e+09 56 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 1638400 0.000000e+00 2.864580e+04 3.233071e+03 5.156243e+05 1.495862e+10 18 617e5fe6 3686400 0.000000e+00 5.948740e+04 4.910517e+03 1.070773e+06 6.413154e+10 18 cea37d6d 409600 0.000000e+00 1.060245e+04 4.247968e+02 1.060245e+05 1.125924e+09 10 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 1638400 0.000000e+00 3.046163e+04 4.754796e+03 5.483094e+05 1.710934e+10 18 617e5fe6 3686400 0.000000e+00 5.865963e+04 4.672589e+03 1.349171e+06 7.964405e+10 23 cea37d6d 409600 0.000000e+00 1.042618e+04 1.817032e+02 1.042618e+05 1.087383e+09 10 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 1638400 0.000000e+00 2.939722e+04 4.040622e+03 4.409582e+05 1.320784e+10 15 617e5fe6 3686400 0.000000e+00 5.704610e+04 3.429433e+03 1.255014e+06 7.185241e+10 22 cea37d6d 409600 0.000000e+00 1.049902e+04 4.776188e+02 1.049902e+05 1.104575e+09 10 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_slu_lu_model_11.sirocco000066400000000000000000000126261320135501600310650ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb4) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 25ebb669 8294400 0.000000e+00 4.111343e+05 7.639666e+04 4.111343e+06 1.748679e+12 10 afdd228b 1638400 0.000000e+00 2.923093e+04 1.278718e+03 5.553877e+05 1.626557e+10 19 cea37d6d 409600 0.000000e+00 4.037068e+03 3.335771e+02 2.906689e+05 1.181462e+09 72 617e5fe6 3686400 0.000000e+00 1.029624e+05 6.177928e+03 1.029624e+06 1.063943e+11 10 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb3) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n cea37d6d 409600 0.000000e+00 9.866251e+03 7.665217e+02 9.866251e+04 9.793047e+08 10 afdd228b 1638400 0.000000e+00 2.088164e+04 1.502169e+03 4.176328e+05 8.765989e+09 20 617e5fe6 3686400 0.000000e+00 4.153583e+04 9.473225e+02 9.968599e+05 4.142694e+10 24 25ebb669 8294400 0.000000e+00 9.378398e+04 2.901838e+03 1.594328e+06 1.496655e+11 17 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 25ebb669 8294400 0.000000e+00 9.434448e+04 6.197321e+03 2.075578e+06 1.966643e+11 22 afdd228b 1638400 0.000000e+00 2.242688e+04 2.707726e+03 3.139763e+05 7.144153e+09 14 cea37d6d 409600 0.000000e+00 9.238189e+03 1.713378e+02 9.238189e+04 8.537349e+08 10 617e5fe6 3686400 0.000000e+00 4.357190e+04 5.271768e+03 7.842942e+05 3.467343e+10 18 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb1) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 25ebb669 8294400 0.000000e+00 9.395404e+04 4.337001e+03 1.973035e+06 1.857696e+11 21 afdd228b 1638400 0.000000e+00 2.096495e+04 7.732458e+02 3.773690e+05 7.922284e+09 18 cea37d6d 409600 0.000000e+00 9.471831e+03 5.475075e+02 9.471831e+04 9.001535e+08 10 617e5fe6 3686400 0.000000e+00 4.647825e+04 9.283373e+03 5.577390e+05 2.695691e+10 12 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb0) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 25ebb669 8294400 0.000000e+00 9.896522e+04 1.438963e+04 1.187583e+06 1.200141e+11 12 afdd228b 1638400 0.000000e+00 2.172039e+04 1.567348e+03 2.823650e+05 6.165013e+09 13 cea37d6d 409600 0.000000e+00 9.338877e+03 3.249828e+02 9.338877e+04 8.732025e+08 10 617e5fe6 3686400 0.000000e+00 4.258012e+04 2.921691e+03 8.090223e+05 3.461046e+10 19 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_slu_lu_model_12.attila000066400000000000000000000076621320135501600307070ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 1.416946e+04 8.998511e+02 5.341885e+06 7.599687e+10 377 ff82dda0 7372800 0.000000e+00 4.394377e+04 1.700468e+03 1.138144e+07 5.008920e+11 259 2c1922b7 819200 0.000000e+00 1.978198e+03 1.079993e+02 7.517154e+05 1.491475e+09 380 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 2.676312e+03 2.039650e+02 4.549731e+05 1.224722e+09 170 ff82dda0 7372800 0.000000e+00 6.450199e+03 3.193507e+02 5.482669e+05 3.545099e+09 85 2c1922b7 819200 0.000000e+00 7.090855e+02 1.344985e+02 5.247233e+04 3.854602e+07 74 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 2.648361e+03 2.330106e+02 2.913197e+05 7.774920e+08 110 ff82dda0 7372800 0.000000e+00 3.907893e+03 1.767346e+02 3.790657e+05 1.484378e+09 97 2c1922b7 819200 0.000000e+00 5.977702e+02 1.137267e+02 6.695026e+04 4.146945e+07 112 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 2.649815e+03 2.112061e+02 4.054218e+05 1.081118e+09 153 ff82dda0 7372800 0.000000e+00 6.517136e+03 3.918474e+02 3.454082e+05 2.259210e+09 53 2c1922b7 819200 0.000000e+00 6.507707e+02 8.750699e+01 4.750626e+04 3.147468e+07 73 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_slu_lu_model_12.idgraf000066400000000000000000000213061320135501600306540ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 9 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb8) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 0.000000e+00 2.469013e+03 5.595193e+01 2.765294e+05 6.831054e+08 112 d39bff17 3276800 0.000000e+00 1.667528e+04 1.964808e+02 1.300672e+06 2.169208e+10 78 ff82dda0 7372800 0.000000e+00 5.216745e+04 4.664151e+02 3.443052e+06 1.796296e+11 66 #################### # COMB_5 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb5) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 0.000000e+00 7.490410e+02 1.344248e+02 7.415506e+04 5.733412e+07 99 d39bff17 3276800 0.000000e+00 2.737524e+03 2.974057e+02 3.942034e+05 1.091878e+09 144 ff82dda0 7372800 0.000000e+00 7.212728e+03 1.319942e+03 6.924219e+05 5.161506e+09 96 #################### # COMB_6 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb6) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 0.000000e+00 7.688939e+02 1.457751e+02 6.843156e+04 5.450789e+07 89 d39bff17 3276800 0.000000e+00 2.735563e+03 2.889694e+02 2.899697e+05 8.020820e+08 106 ff82dda0 7372800 0.000000e+00 6.820126e+03 9.314994e+02 7.638542e+05 5.306763e+09 112 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 5 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda5_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 0.000000e+00 7.150281e+02 1.235393e+02 6.363750e+04 4.686092e+07 89 d39bff17 3276800 0.000000e+00 2.835249e+03 4.125186e+02 1.899617e+05 5.499903e+08 67 ff82dda0 7372800 0.000000e+00 6.720945e+03 7.632032e+02 6.989783e+05 4.758372e+09 104 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 7 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda7_impl0 (Comb4) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 0.000000e+00 7.190609e+02 1.144317e+02 7.406327e+04 5.460474e+07 103 d39bff17 3276800 0.000000e+00 2.867186e+03 4.168496e+02 2.838514e+05 8.310575e+08 99 ff82dda0 7372800 0.000000e+00 6.809425e+03 9.031920e+02 6.400859e+05 4.435298e+09 94 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 4 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda4_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 0.000000e+00 7.136273e+02 1.258701e+02 7.350362e+04 5.408605e+07 103 d39bff17 3276800 0.000000e+00 2.942246e+03 4.585544e+02 1.706502e+05 5.142907e+08 58 ff82dda0 7372800 0.000000e+00 6.744194e+03 8.416374e+02 5.597681e+05 3.833978e+09 83 #################### # COMB_7 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb7) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 0.000000e+00 7.204798e+02 9.746533e+01 1.080720e+05 7.928859e+07 150 d39bff17 3276800 0.000000e+00 2.539831e+03 4.296517e+02 3.885942e+05 1.015208e+09 153 ff82dda0 7372800 0.000000e+00 7.293979e+03 1.385713e+03 6.929280e+05 5.236621e+09 95 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 6 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda6_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 0.000000e+00 7.460951e+02 1.203288e+02 7.386342e+04 5.654256e+07 99 d39bff17 3276800 0.000000e+00 2.972783e+03 5.066224e+02 2.259315e+05 6.911522e+08 76 ff82dda0 7372800 0.000000e+00 6.643349e+03 8.230064e+02 6.510482e+05 4.391520e+09 98 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 0.000000e+00 7.518059e+02 1.406096e+02 8.495406e+04 6.610309e+07 113 d39bff17 3276800 0.000000e+00 2.794983e+03 3.357608e+02 4.164524e+05 1.180775e+09 149 ff82dda0 7372800 0.000000e+00 6.735838e+03 7.525487e+02 6.803197e+05 4.639723e+09 101 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_slu_lu_model_12.mirage000066400000000000000000000076661320135501600307010ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 1.615269e+04 4.099119e+02 4.748890e+06 7.675673e+10 294 ff82dda0 7372800 0.000000e+00 5.118532e+04 6.422962e+02 1.530441e+07 7.834845e+11 299 2c1922b7 819200 0.000000e+00 2.296074e+03 7.445272e+01 1.021753e+06 2.348487e+09 445 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 2.740712e+03 2.663471e+02 5.755494e+05 1.592313e+09 210 ff82dda0 7372800 0.000000e+00 6.504044e+03 4.912781e+02 1.385361e+06 9.061859e+09 213 2c1922b7 819200 0.000000e+00 6.801212e+02 1.149855e+02 1.129001e+05 7.898057e+07 166 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 2.716114e+03 2.688407e+02 4.237138e+05 1.162130e+09 156 ff82dda0 7372800 0.000000e+00 6.512491e+03 5.367987e+02 8.270864e+05 5.422988e+09 127 2c1922b7 819200 0.000000e+00 7.284912e+02 1.021807e+02 1.049027e+05 7.792421e+07 144 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 2.294336e+03 5.071880e+02 4.909878e+05 1.181540e+09 214 ff82dda0 7372800 0.000000e+00 6.469485e+03 5.370376e+02 7.698688e+05 5.014976e+09 119 2c1922b7 819200 0.000000e+00 7.112055e+02 1.136474e+02 1.002800e+05 7.314078e+07 141 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_slu_lu_model_12.sirocco000066400000000000000000000126511320135501600310640ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb4) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0e8bce2b 16588800 0.000000e+00 5.637990e+04 1.036285e+04 8.118706e+06 4.731958e+11 144 d39bff17 3276800 0.000000e+00 5.106660e+03 6.848530e+02 2.134584e+06 1.109665e+10 418 2c1922b7 819200 0.000000e+00 4.245334e+03 7.020174e+02 6.368000e+04 2.777353e+08 15 ff82dda0 7372800 0.000000e+00 1.726784e+04 3.264426e+03 3.021872e+06 5.404608e+10 175 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb3) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0e8bce2b 16588800 0.000000e+00 5.668892e+03 6.964909e+02 1.394547e+06 8.024874e+09 246 d39bff17 3276800 0.000000e+00 1.216432e+03 1.410794e+02 1.934127e+05 2.384382e+08 159 2c1922b7 819200 0.000000e+00 4.901281e+02 6.729653e+01 6.616730e+04 3.304185e+07 135 ff82dda0 7372800 0.000000e+00 2.106719e+03 2.638200e+02 5.646006e+05 1.208108e+09 268 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0e8bce2b 16588800 0.000000e+00 5.677828e+03 6.218985e+02 1.311578e+06 7.536257e+09 231 d39bff17 3276800 0.000000e+00 1.199302e+03 1.658297e+02 1.774966e+05 2.169419e+08 148 2c1922b7 819200 0.000000e+00 4.968224e+02 7.860110e+01 5.415364e+04 2.757816e+07 109 ff82dda0 7372800 0.000000e+00 2.138085e+03 2.696288e+02 6.371492e+05 1.383944e+09 298 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb0) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0e8bce2b 16588800 0.000000e+00 5.593766e+03 7.653530e+02 1.510317e+06 8.606516e+09 270 d39bff17 3276800 0.000000e+00 1.148300e+03 2.163448e+02 2.021009e+05 2.403102e+08 176 2c1922b7 819200 0.000000e+00 8.901347e+01 1.918734e+01 2.412265e+04 2.247011e+06 271 ff82dda0 7372800 0.000000e+00 2.196957e+03 3.265420e+02 4.349975e+05 9.767837e+08 198 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb1) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0e8bce2b 16588800 0.000000e+00 5.652338e+03 6.245997e+02 1.520479e+06 8.699205e+09 269 d39bff17 3276800 0.000000e+00 1.203544e+03 1.679024e+02 2.286733e+05 2.805746e+08 190 2c1922b7 819200 0.000000e+00 4.930666e+02 7.623523e+01 7.642532e+04 3.858360e+07 155 ff82dda0 7372800 0.000000e+00 2.164310e+03 2.607466e+02 4.869698e+05 1.069251e+09 225 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_slu_lu_model_21.attila000066400000000000000000000076621320135501600307070ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 1.377909e+04 1.008911e+03 6.145473e+06 8.513300e+10 446 ff82dda0 7372800 0.000000e+00 4.298380e+04 1.919778e+03 1.177756e+07 5.072542e+11 274 2c1922b7 819200 0.000000e+00 1.936516e+03 1.503574e+02 4.725100e+05 9.205395e+08 244 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 2.656425e+03 2.270595e+02 3.320531e+05 8.885184e+08 125 ff82dda0 7372800 0.000000e+00 6.358340e+03 3.816293e+02 5.023088e+05 3.205356e+09 79 2c1922b7 819200 0.000000e+00 3.867923e+02 4.867053e+01 4.564149e+04 1.793330e+07 118 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 1.902887e+03 4.574719e+02 4.585957e+05 9.230924e+08 241 ff82dda0 7372800 0.000000e+00 3.810456e+03 1.334249e+02 3.353201e+05 1.279289e+09 88 2c1922b7 819200 0.000000e+00 3.835296e+02 4.543249e+01 2.262825e+04 8.800385e+06 59 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 2.657310e+03 2.918518e+02 3.162199e+05 8.504305e+08 119 ff82dda0 7372800 0.000000e+00 3.819809e+03 1.073068e+02 3.055848e+05 1.168197e+09 80 2c1922b7 819200 0.000000e+00 4.020211e+02 5.372009e+01 3.256371e+04 1.332505e+07 81 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_slu_lu_model_21.idgraf000066400000000000000000000213101320135501600306470ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 9 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb8) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 0.000000e+00 1.946809e+03 8.216247e+01 4.049363e+05 7.897378e+08 208 d39bff17 3276800 0.000000e+00 1.423970e+04 2.281585e+02 1.395491e+06 1.987647e+10 98 ff82dda0 7372800 0.000000e+00 4.640991e+04 5.437505e+02 4.919451e+06 2.283426e+11 106 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 4 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda4_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 0.000000e+00 4.484181e+02 9.807341e+01 3.004401e+04 1.411671e+07 67 d39bff17 3276800 0.000000e+00 1.658665e+03 2.005859e+02 2.388477e+05 4.019622e+08 144 ff82dda0 7372800 0.000000e+00 3.922083e+03 2.271290e+02 2.588575e+05 1.018665e+09 66 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 0.000000e+00 5.042679e+02 1.229686e+02 7.362312e+04 3.933348e+07 146 d39bff17 3276800 0.000000e+00 2.167031e+03 5.827483e+02 2.773800e+05 6.445595e+08 128 ff82dda0 7372800 0.000000e+00 4.035358e+03 4.245106e+02 4.035358e+05 1.646433e+09 100 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 6 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda6_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 0.000000e+00 4.873044e+02 1.174149e+02 2.631443e+04 1.356760e+07 54 d39bff17 3276800 0.000000e+00 1.705876e+03 1.721886e+02 1.808228e+05 3.116041e+08 106 ff82dda0 7372800 0.000000e+00 3.936492e+03 2.608005e+02 2.440625e+05 9.649671e+08 62 #################### # COMB_7 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb7) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 0.000000e+00 5.272057e+02 1.307030e+02 5.535660e+04 3.097805e+07 105 d39bff17 3276800 0.000000e+00 1.638590e+03 9.390080e+01 1.163399e+05 1.912593e+08 71 ff82dda0 7372800 0.000000e+00 4.055643e+03 3.711103e+02 4.177313e+05 1.708355e+09 103 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 5 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda5_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 0.000000e+00 4.303558e+02 7.490536e+01 2.840348e+04 1.259392e+07 66 d39bff17 3276800 0.000000e+00 1.669452e+03 1.444951e+02 1.419035e+05 2.386758e+08 85 ff82dda0 7372800 0.000000e+00 4.288060e+03 7.671104e+02 2.744359e+05 1.214459e+09 64 #################### # COMB_5 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb5) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 0.000000e+00 4.394264e+02 8.387153e+01 6.283798e+04 2.861859e+07 143 d39bff17 3276800 0.000000e+00 2.098818e+03 5.403136e+02 2.140795e+05 4.790917e+08 102 ff82dda0 7372800 0.000000e+00 4.766912e+03 1.123433e+03 7.579390e+05 3.813703e+09 159 #################### # COMB_6 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb6) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 0.000000e+00 4.660051e+02 1.021627e+02 6.477470e+04 3.163611e+07 139 d39bff17 3276800 0.000000e+00 2.103985e+03 5.293854e+02 2.377503e+05 5.318912e+08 113 ff82dda0 7372800 0.000000e+00 3.972257e+03 3.858968e+02 2.899747e+05 1.162725e+09 73 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 7 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda7_impl0 (Comb4) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 0.000000e+00 5.222345e+02 1.241013e+02 2.715620e+04 1.498276e+07 52 d39bff17 3276800 0.000000e+00 1.941135e+03 4.386059e+02 1.824667e+05 3.722759e+08 94 ff82dda0 7372800 0.000000e+00 4.892155e+03 1.147723e+03 2.397156e+05 1.237272e+09 49 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_slu_lu_model_21.mirage000066400000000000000000000076631320135501600306760ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 1.373117e+04 2.756172e+02 7.167670e+06 9.846014e+10 522 ff82dda0 7372800 0.000000e+00 4.545501e+04 7.462378e+02 1.750018e+07 7.956851e+11 385 2c1922b7 819200 0.000000e+00 1.798916e+03 8.480081e+01 1.219665e+06 2.198952e+09 678 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 2.883473e+03 4.679640e+02 2.537456e+05 7.509396e+08 88 ff82dda0 7372800 0.000000e+00 6.462089e+03 4.136967e+02 5.751259e+05 3.731746e+09 89 2c1922b7 819200 0.000000e+00 4.040830e+02 6.411732e+01 3.717564e+04 1.540026e+07 92 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 2.231007e+03 5.378925e+02 3.234960e+05 7.636746e+08 145 ff82dda0 7372800 0.000000e+00 3.904524e+03 2.515208e+02 4.021660e+05 1.576783e+09 103 2c1922b7 819200 0.000000e+00 5.307827e+02 1.276617e+02 5.467062e+04 3.069686e+07 103 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 1.665736e+03 1.392688e+02 2.881723e+05 4.833744e+08 173 ff82dda0 7372800 0.000000e+00 3.891632e+03 2.259287e+02 7.199519e+05 2.811230e+09 185 2c1922b7 819200 0.000000e+00 5.125766e+02 1.240167e+02 5.587085e+04 3.031453e+07 109 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_slu_lu_model_21.sirocco000066400000000000000000000126471320135501600310710ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb4) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0e8bce2b 16588800 0.000000e+00 8.483517e+04 1.709999e+04 1.781539e+06 1.572777e+11 21 d39bff17 3276800 0.000000e+00 8.986208e+03 1.629610e+03 1.797242e+05 1.668151e+09 20 2c1922b7 819200 0.000000e+00 3.523655e+03 5.077738e+02 5.990214e+04 2.154576e+08 17 ff82dda0 7372800 0.000000e+00 1.583302e+04 2.624137e+03 3.974089e+06 6.465024e+10 251 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb1) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0e8bce2b 16588800 0.000000e+00 4.641113e+03 5.516013e+02 1.257742e+06 5.919777e+09 271 d39bff17 3276800 0.000000e+00 8.365056e+02 1.344660e+02 1.396964e+05 1.198764e+08 167 2c1922b7 819200 0.000000e+00 2.882912e+02 5.271451e+01 7.409085e+04 2.207390e+07 257 ff82dda0 7372800 0.000000e+00 1.570696e+03 2.281691e+02 4.115224e+05 6.600167e+08 262 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb0) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0e8bce2b 16588800 0.000000e+00 4.556926e+03 5.099622e+02 1.048093e+06 4.835897e+09 230 d39bff17 3276800 0.000000e+00 7.019049e+02 1.632697e+02 1.109010e+05 8.205375e+07 158 2c1922b7 819200 0.000000e+00 9.967334e+01 2.197557e+01 2.372225e+04 2.479413e+06 238 ff82dda0 7372800 0.000000e+00 1.571709e+03 2.150516e+02 4.007858e+05 6.417117e+08 255 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb3) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0e8bce2b 16588800 0.000000e+00 4.650733e+03 7.073225e+02 1.232444e+06 5.864350e+09 265 d39bff17 3276800 0.000000e+00 8.352707e+02 1.515223e+02 1.587014e+05 1.369209e+08 190 2c1922b7 819200 0.000000e+00 2.858293e+02 5.241353e+01 7.460146e+04 2.204030e+07 261 ff82dda0 7372800 0.000000e+00 1.569547e+03 2.419662e+02 2.589752e+05 4.161341e+08 165 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0e8bce2b 16588800 0.000000e+00 4.671203e+03 5.859459e+02 1.331293e+06 6.316588e+09 285 d39bff17 3276800 0.000000e+00 8.453596e+02 1.395049e+02 1.420204e+05 1.233279e+08 168 2c1922b7 819200 0.000000e+00 2.930233e+02 5.590601e+01 5.362326e+04 1.628483e+07 183 ff82dda0 7372800 0.000000e+00 1.591448e+03 2.256700e+02 2.387172e+05 3.875451e+08 150 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_slu_lu_model_22.attila000066400000000000000000000077031320135501600307040ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f0ac7beb 4915200 0.000000e+00 2.587052e+04 1.487038e+03 5.386241e+07 1.398052e+12 2082 24c84a50 11059200 0.000000e+00 8.218890e+04 3.347888e+03 1.244340e+08 1.024406e+13 1514 d46431bb 1228800 0.000000e+00 3.265838e+03 1.561177e+02 8.347482e+06 2.732382e+10 2556 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f0ac7beb 4915200 0.000000e+00 9.047163e+02 4.943457e+01 7.022408e+06 6.372255e+09 7762 24c84a50 11059200 0.000000e+00 2.963966e+03 7.453353e+01 1.530888e+07 4.540369e+10 5165 d46431bb 1228800 0.000000e+00 1.924610e+02 1.043827e+01 8.556817e+05 1.651698e+08 4446 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f0ac7beb 4915200 0.000000e+00 8.810829e+02 4.167975e+01 6.874209e+06 6.070301e+09 7802 24c84a50 11059200 0.000000e+00 2.960803e+03 8.260112e+01 1.519780e+07 4.503271e+10 5133 d46431bb 1228800 0.000000e+00 1.894698e+02 9.561378e+00 8.340462e+05 1.584290e+08 4402 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f0ac7beb 4915200 0.000000e+00 8.953024e+02 5.096374e+01 6.835634e+06 6.139790e+09 7635 24c84a50 11059200 0.000000e+00 2.963787e+03 5.048433e+01 1.524275e+07 4.518938e+10 5143 d46431bb 1228800 0.000000e+00 1.803248e+02 8.617192e+00 8.859357e+05 1.601210e+08 4913 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_slu_lu_model_22.idgraf000066400000000000000000000213561320135501600306620ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 9 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb8) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d46431bb 1228800 0.000000e+00 3.393927e+03 8.566524e+01 3.533078e+06 1.199865e+10 1041 f0ac7beb 4915200 0.000000e+00 2.682238e+04 4.332821e+02 9.951104e+06 2.669820e+11 371 24c84a50 11059200 0.000000e+00 8.930213e+04 1.450773e+03 2.679064e+07 2.393092e+12 300 #################### # COMB_5 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb5) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d46431bb 1228800 0.000000e+00 1.946363e+02 2.537099e+01 6.294539e+05 1.245963e+08 3234 f0ac7beb 4915200 0.000000e+00 9.257288e+02 6.590058e+01 3.791785e+06 3.527953e+09 4096 24c84a50 11059200 0.000000e+00 2.991139e+03 1.645886e+02 1.221282e+07 3.664085e+10 4083 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 4 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda4_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d46431bb 1228800 0.000000e+00 1.954243e+02 2.831383e+01 5.661443e+05 1.129608e+08 2897 f0ac7beb 4915200 0.000000e+00 9.376794e+02 7.341921e+01 3.415966e+06 3.222718e+09 3643 24c84a50 11059200 0.000000e+00 2.995872e+03 1.614697e+02 1.133938e+07 3.407000e+10 3785 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 6 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda6_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d46431bb 1228800 0.000000e+00 1.867261e+02 2.556099e+01 5.342234e+05 1.016227e+08 2861 f0ac7beb 4915200 0.000000e+00 8.996740e+02 6.639270e+01 3.427758e+06 3.100659e+09 3810 24c84a50 11059200 0.000000e+00 2.987519e+03 1.530428e+02 1.113747e+07 3.336072e+10 3728 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d46431bb 1228800 0.000000e+00 1.927028e+02 2.478568e+01 6.783137e+05 1.328754e+08 3520 f0ac7beb 4915200 0.000000e+00 9.234475e+02 6.432680e+01 3.846159e+06 3.568960e+09 4165 24c84a50 11059200 0.000000e+00 2.982449e+03 1.542480e+02 1.210278e+07 3.619247e+10 4058 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 5 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda5_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d46431bb 1228800 0.000000e+00 1.868734e+02 2.558187e+01 5.049318e+05 9.612659e+07 2702 f0ac7beb 4915200 0.000000e+00 9.407115e+02 6.874274e+01 3.317889e+06 3.137844e+09 3527 24c84a50 11059200 0.000000e+00 2.972987e+03 1.569773e+02 1.177600e+07 3.510750e+10 3961 #################### # COMB_6 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb6) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d46431bb 1228800 0.000000e+00 1.924732e+02 2.459364e+01 6.245755e+05 1.221768e+08 3245 f0ac7beb 4915200 0.000000e+00 9.173887e+02 7.039530e+01 3.781476e+06 3.489510e+09 4122 24c84a50 11059200 0.000000e+00 3.001859e+03 1.612679e+02 1.156916e+07 3.482922e+10 3854 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 7 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda7_impl0 (Comb4) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d46431bb 1228800 0.000000e+00 1.877972e+02 2.764994e+01 5.324050e+05 1.021516e+08 2835 f0ac7beb 4915200 0.000000e+00 9.245688e+02 6.946750e+01 3.363581e+06 3.127419e+09 3638 24c84a50 11059200 0.000000e+00 3.005524e+03 1.690713e+02 1.154422e+07 3.480621e+10 3841 #################### # COMB_7 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb7) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d46431bb 1228800 0.000000e+00 1.865351e+02 2.381101e+01 6.651841e+05 1.261020e+08 3566 f0ac7beb 4915200 0.000000e+00 9.257403e+02 6.896157e+01 3.669635e+06 3.415980e+09 3964 24c84a50 11059200 0.000000e+00 3.007743e+03 1.477912e+02 1.238889e+07 3.735258e+10 4119 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_slu_lu_model_22.mirage000066400000000000000000000077021320135501600306710ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb3) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f0ac7beb 4915200 0.000000e+00 2.645658e+04 4.968429e+02 5.820449e+07 1.540435e+12 2200 24c84a50 11059200 0.000000e+00 8.756135e+04 9.752924e+02 1.866808e+08 1.634805e+13 2132 d46431bb 1228800 0.000000e+00 3.234444e+03 8.877025e+01 1.325799e+07 4.291452e+10 4099 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb0) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f0ac7beb 4915200 0.000000e+00 8.760921e+02 3.574580e+01 7.074444e+06 6.208182e+09 8075 24c84a50 11059200 0.000000e+00 2.988744e+03 8.136061e+01 2.363499e+07 7.069126e+10 7908 d46431bb 1228800 0.000000e+00 1.911930e+02 1.434147e+01 1.248108e+06 2.399722e+08 6528 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f0ac7beb 4915200 0.000000e+00 9.198175e+02 4.677043e+01 6.931745e+06 6.392425e+09 7536 24c84a50 11059200 0.000000e+00 3.016176e+03 6.737054e+01 2.311597e+07 6.975663e+10 7664 d46431bb 1228800 0.000000e+00 1.910500e+02 1.400155e+01 1.317099e+06 2.529832e+08 6894 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb1) # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f0ac7beb 4915200 0.000000e+00 9.143628e+02 4.685332e+01 6.720566e+06 6.161171e+09 7350 24c84a50 11059200 0.000000e+00 3.002393e+03 6.861698e+01 2.339765e+07 7.028562e+10 7793 d46431bb 1228800 0.000000e+00 1.898967e+02 1.421585e+01 1.327568e+06 2.535136e+08 6991 starpu-1.2.3+dfsg/tools/perfmodels/sampling/codelets/44/starpu_slu_lu_model_22.sirocco000066400000000000000000000126761320135501600310740ustar00rootroot00000000000000################## # Performance Model Version 44 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 0 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cpu0_impl0 (Comb4) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 8cfc3ba0 24883200 0.000000e+00 1.164877e+05 2.576301e+04 2.054842e+08 2.510721e+13 1764 f0ac7beb 4915200 0.000000e+00 1.087142e+04 2.109400e+03 2.505863e+07 2.826792e+11 2305 d46431bb 1228800 0.000000e+00 1.613402e+03 3.115535e+02 8.438094e+06 1.412169e+10 5230 24c84a50 11059200 0.000000e+00 3.517390e+04 7.045528e+03 6.925741e+07 2.533794e+12 1969 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 0 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda0_impl0 (Comb1) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 8cfc3ba0 24883200 0.000000e+00 2.688252e+03 2.597845e+02 1.459721e+07 3.960743e+10 5430 f0ac7beb 4915200 0.000000e+00 2.657700e+02 2.996380e+01 1.356225e+06 3.650255e+08 5103 d46431bb 1228800 0.000000e+00 6.142508e+01 1.012391e+01 4.393736e+05 2.772170e+07 7153 24c84a50 11059200 0.000000e+00 7.851775e+02 4.684799e+01 4.315336e+06 3.400367e+09 5496 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_impl0 (Comb0) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 8cfc3ba0 24883200 0.000000e+00 2.707789e+03 2.773178e+02 1.421860e+07 3.890480e+10 5251 f0ac7beb 4915200 0.000000e+00 2.693001e+02 2.710216e+01 1.308798e+06 3.560293e+08 4860 d46431bb 1228800 0.000000e+00 6.592485e+01 1.426453e+01 1.071279e+05 7.393038e+06 1625 24c84a50 11059200 0.000000e+00 7.926860e+02 4.760061e+01 4.363736e+06 3.471546e+09 5505 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_impl0 (Comb2) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 8cfc3ba0 24883200 0.000000e+00 2.706383e+03 2.631153e+02 1.444938e+07 3.947516e+10 5339 f0ac7beb 4915200 0.000000e+00 2.686331e+02 2.912062e+01 1.401996e+06 3.810483e+08 5219 d46431bb 1228800 0.000000e+00 6.317490e+01 1.087216e+01 2.866877e+05 1.864788e+07 4538 24c84a50 11059200 0.000000e+00 7.922324e+02 5.091772e+01 4.156844e+06 3.306790e+09 5247 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, SCC - 4) 1 #################### # DEV_0 # device id 3 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda3_impl0 (Comb3) # number of entries 4 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 8cfc3ba0 24883200 0.000000e+00 2.681149e+03 2.665822e+02 1.451306e+07 3.929636e+10 5413 f0ac7beb 4915200 0.000000e+00 2.642224e+02 2.666799e+01 1.450317e+06 3.871098e+08 5489 d46431bb 1228800 0.000000e+00 5.975719e+01 9.345113e+00 4.033610e+05 2.469321e+07 6750 24c84a50 11059200 0.000000e+00 7.867204e+02 4.699968e+01 4.148377e+06 3.275261e+09 5273 starpu-1.2.3+dfsg/tools/starpu_calibrate_bus.1000066400000000000000000000010561320135501600213670ustar00rootroot00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH STARPU_CALIBRATE_BUS "1" "November 2017" "starpu_calibrate_bus (StarPU) 1.2.3" "User Commands" .SH NAME starpu_calibrate_bus \- manual page for starpu_calibrate_bus (StarPU) 1.2.3 .SH SYNOPSIS .B starpu_calibrate_bus [\fIOPTION\fR] .SH DESCRIPTION Force a bus calibration. .SH OPTIONS .TP \fB\-h\fR, \fB\-\-help\fR display this help and exit .TP \fB\-v\fR, \fB\-\-version\fR output version information and exit .SH "REPORTING BUGS" Report bugs to . starpu-1.2.3+dfsg/tools/starpu_calibrate_bus.c000066400000000000000000000035501320135501600214520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #if defined(_WIN32) && !defined(__CYGWIN__) #include #endif #define PROGNAME "starpu_calibrate_bus" static void usage(void) { (void) fprintf(stdout, "Force a bus calibration.\n\ \n\ Usage: %s [OPTION]\n\ \n\ Options:\n\ -h, --help display this help and exit\n\ -v, --version output version information and exit\n\ \n\ Report bugs to <%s>.\n", PROGNAME, PACKAGE_BUGREPORT); } static void parse_args(int argc, char **argv) { if (argc == 1) return; if (argc > 2) { usage(); exit(EXIT_FAILURE); } if (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0) { usage(); exit(EXIT_SUCCESS); } else if (strcmp(argv[1], "-v") == 0 || strcmp(argv[1], "--version") == 0) { fputs(PROGNAME " (" PACKAGE_NAME ") " PACKAGE_VERSION "\n", stderr); exit(EXIT_SUCCESS); } else { (void) fprintf(stderr, "Unknown arg %s\n", argv[1]); exit(EXIT_FAILURE); } } int main(int argc, char **argv) { int ret; struct starpu_conf conf; parse_args(argc, argv); starpu_conf_init(&conf); conf.bus_calibrate = 1; ret = starpu_init(&conf); if (ret == -ENODEV) return 77; if (ret != 0) return ret; starpu_shutdown(); return 0; } starpu-1.2.3+dfsg/tools/starpu_codelet_histo_profile000077500000000000000000000042531320135501600230030ustar00rootroot00000000000000#!/bin/sh # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009, 2010, 2013 Université de Bordeaux # Copyright (C) 2010, 2013 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. PROGNAME=$0 usage() { echo "Offline tool to draw codelet profile histogram over a traced execution" echo "" echo "Usage: $PROGNAME distrib.data" echo "" echo "Options:" echo " -h, --help display this help and exit" echo " -v, --version output version information and exit" echo "" echo "Report bugs to " exit 1 } if [ "$1" = "-v" ] || [ "$1" = "--version" ] ; then echo "$PROGNAME (StarPU) 1.2.3" exit 0 fi if [ "$1" = "-h" ] || [ "$1" = "--help" ] || [ "$1" = "" ] ; then usage fi create_histograms() { inputfile=$1 R --no-save > /dev/null << EOF handle_hash <- function (codelet, arch, hash) { mytable <- table mytable <- mytable[mytable[,1]==codelet,] mytable <- mytable[mytable[,2]==arch,] mytable <- mytable[mytable[,4]==hash,] val <- mytable[,5] # there is certainly a better way to do this ! size <- unique(mytable[,3]) pdf(paste("$inputfile", codelet, arch, hash, size, "pdf", sep=".")); try ( { h <- hist(val[val > quantile(val,0.01) & val starpu-1.2.3+dfsg/tools/starpu_codelet_histo_profile.in000077500000000000000000000042601320135501600234060ustar00rootroot00000000000000#!/bin/sh # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009, 2010, 2013 Université de Bordeaux # Copyright (C) 2010, 2013 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. PROGNAME=$0 usage() { echo "Offline tool to draw codelet profile histogram over a traced execution" echo "" echo "Usage: $PROGNAME distrib.data" echo "" echo "Options:" echo " -h, --help display this help and exit" echo " -v, --version output version information and exit" echo "" echo "Report bugs to <@PACKAGE_BUGREPORT@>" exit 1 } if [ "$1" = "-v" ] || [ "$1" = "--version" ] ; then echo "$PROGNAME (@PACKAGE_NAME@) @PACKAGE_VERSION@" exit 0 fi if [ "$1" = "-h" ] || [ "$1" = "--help" ] || [ "$1" = "" ] ; then usage fi create_histograms() { inputfile=$1 R --no-save > /dev/null << EOF handle_hash <- function (codelet, arch, hash) { mytable <- table mytable <- mytable[mytable[,1]==codelet,] mytable <- mytable[mytable[,2]==arch,] mytable <- mytable[mytable[,4]==hash,] val <- mytable[,5] # there is certainly a better way to do this ! size <- unique(mytable[,3]) pdf(paste("$inputfile", codelet, arch, hash, size, "pdf", sep=".")); try ( { h <- hist(val[val > quantile(val,0.01) & val" exit 1 } if [ "$1" = "-v" ] || [ "$1" = "--version" ] ; then echo "$PROGNAME (StarPU) 1.2.3" exit 0 fi if [ "$1" = "-h" ] || [ "$1" = "--help" ] || [ "$2" = "" ] ; then usage fi inputfile=$1 codelet_name=$2 archlist=`< $inputfile grep "^$codelet_name " | cut -f 2 | sort | uniq | xargs` # extract subfiles from the history file for arch in $archlist do echo "Arch $arch" grep "^$codelet_name $arch" $inputfile > $inputfile.$arch done # create the gnuplot file gpfile=$inputfile.gp echo "#!/usr/bin/gnuplot -persist" > $gpfile echo "set term postscript eps enhanced color" >> $gpfile echo "set logscale x" >> $gpfile echo "set logscale y" >> $gpfile echo "set output \"$inputfile.eps\"" >> $gpfile echo "set key top left" >> $gpfile echo "set xlabel \"Total data size\"" >> $gpfile echo "set ylabel \"Execution time (ms)\"" >> $gpfile echo -n "plot " >> $gpfile first=1 for arch in $archlist do if [ $first = 0 ] then echo -n " , " >> $gpfile else first=0 fi echo -n " \"$inputfile.$arch\" using 3:5 title \"${codelet_name//_/\\\\_} arch $arch\"" >> $gpfile done starpu-1.2.3+dfsg/tools/starpu_codelet_profile.1000066400000000000000000000011541320135501600217260ustar00rootroot00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH STARPU_CODELET_PROFILE "1" "November 2017" "starpu_codelet_profile (StarPU) 1.2.3" "User Commands" .SH NAME starpu_codelet_profile \- manual page for starpu_codelet_profile (StarPU) 1.2.3 .SH SYNOPSIS .B starpu_codelet_profile \fIdistrib.data codelet_name\fR .SH DESCRIPTION Offline tool to draw codelet profile over a traced execution .SH OPTIONS .TP \fB\-h\fR, \fB\-\-help\fR display this help and exit .TP \fB\-v\fR, \fB\-\-version\fR output version information and exit .SH "REPORTING BUGS" Report bugs to starpu-1.2.3+dfsg/tools/starpu_codelet_profile.in000077500000000000000000000042341320135501600222010ustar00rootroot00000000000000#!@BASH@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2008, 2009, 2010, 2013 Université de Bordeaux # Copyright (C) 2010, 2013 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. PROGNAME=$0 usage() { echo "Offline tool to draw codelet profile over a traced execution" echo "" echo "Usage: $PROGNAME distrib.data codelet_name" echo "" echo "Options:" echo " -h, --help display this help and exit" echo " -v, --version output version information and exit" echo "" echo "Report bugs to <@PACKAGE_BUGREPORT@>" exit 1 } if [ "$1" = "-v" ] || [ "$1" = "--version" ] ; then echo "$PROGNAME (@PACKAGE_NAME@) @PACKAGE_VERSION@" exit 0 fi if [ "$1" = "-h" ] || [ "$1" = "--help" ] || [ "$2" = "" ] ; then usage fi inputfile=$1 codelet_name=$2 archlist=`< $inputfile grep "^$codelet_name " | cut -f 2 | sort | uniq | xargs` # extract subfiles from the history file for arch in $archlist do echo "Arch $arch" grep "^$codelet_name $arch" $inputfile > $inputfile.$arch done # create the gnuplot file gpfile=$inputfile.gp echo "#!/usr/bin/gnuplot -persist" > $gpfile echo "set term postscript eps enhanced color" >> $gpfile echo "set logscale x" >> $gpfile echo "set logscale y" >> $gpfile echo "set output \"$inputfile.eps\"" >> $gpfile echo "set key top left" >> $gpfile echo "set xlabel \"Total data size\"" >> $gpfile echo "set ylabel \"Execution time (ms)\"" >> $gpfile echo -n "plot " >> $gpfile first=1 for arch in $archlist do if [ $first = 0 ] then echo -n " , " >> $gpfile else first=0 fi echo -n " \"$inputfile.$arch\" using 3:5 title \"${codelet_name//_/\\\\_} arch $arch\"" >> $gpfile done starpu-1.2.3+dfsg/tools/starpu_fxt_data_trace.c000066400000000000000000000077531320135501600216340ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Joris Pablo * Copyright (C) 2011-2014, 2016 Universite de Bordeaux * Copyright (C) 2014, 2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #define PROGNAME "starpu_fxt_data_trace" #define MAX_LINE_SIZE 100 static void usage() { fprintf(stderr, "Get statistics about tasks lengths and data size\n\n"); fprintf(stderr, "Usage: %s [ options ] [ .... ]\n", PROGNAME); fprintf(stderr, "\n"); fprintf(stderr, "Options:\n"); fprintf(stderr, " -h, --help display this help and exit\n"); fprintf(stderr, " -v, --version output version information and exit\n\n"); fprintf(stderr, " filename specify the FxT trace input file.\n"); fprintf(stderr, " codeletX specify the codelet name to profile (by default, all codelets are profiled)\n"); fprintf(stderr, "Report bugs to <%s>.", PACKAGE_BUGREPORT); fprintf(stderr, "\n"); } static int parse_args(int argc, char **argv) { int i; if(argc < 2) { fprintf(stderr, "Incorrect usage, aborting\n"); usage(); return 77; } for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) { usage(); return EXIT_SUCCESS; } if (strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "--version") == 0) { fputs(PROGNAME " (" PACKAGE_NAME ") " PACKAGE_VERSION "\n", stderr); return EXIT_SUCCESS; } } return 0; } static void write_gp(int argc, char **argv) { FILE *codelet_list = fopen("codelet_list", "r"); if(!codelet_list) { perror("Error while opening codelet_list:"); exit(-1); } char codelet_name[MAX_LINE_SIZE]; FILE *plt = fopen("data_trace.gp", "w+"); if(!plt) { perror("Error while creating data_trace.gp:"); exit(-1); } fprintf(plt, "#!/usr/bin/gnuplot -persist\n\n"); fprintf(plt, "set term postscript eps enhanced color\n"); fprintf(plt, "set output \"data_trace.eps\"\n"); fprintf(plt, "set title \"Data trace\"\n"); fprintf(plt, "set logscale x\n"); fprintf(plt, "set logscale y\n"); fprintf(plt, "set xlabel \"data size (B)\"\n"); fprintf(plt, "set ylabel \"tasks size (ms)\"\n"); fprintf(plt, "plot "); int c_iter; char *v_iter; int begin = 1; while(fgets(codelet_name, MAX_LINE_SIZE, codelet_list) != NULL) { if(argc == 0) { if(begin) begin = 0; else fprintf(plt, ", "); } int size = strlen(codelet_name); if(size > 0) codelet_name[size-1] = '\0'; if(argc != 0) { for(c_iter = 0, v_iter = argv[c_iter]; c_iter < argc; c_iter++, v_iter = argv[c_iter]) { if(!strcmp(v_iter, codelet_name)) { if(begin) begin = 0; else fprintf(plt, ", "); fprintf(plt, "\"%s\" using 2:1 with dots lw 1 title \"%s\"", codelet_name, codelet_name); } } } else { fprintf(plt, "\"%s\" using 2:1 with dots lw 1 title \"%s\"", codelet_name, codelet_name); } } fprintf(plt, "\n"); fprintf(stdout, "Gnuplot file has been successfully created.\n"); if(fclose(codelet_list)) { perror("close failed :"); exit(-1); } if(fclose(plt)) { perror("close failed :"); exit(-1); } } int main(int argc, char **argv) { int ret = parse_args(argc, argv); if (ret) return ret; starpu_fxt_write_data_trace(argv[1]); write_gp(argc - 2, argv + 2); starpu_perfmodel_free_sampling_directories(); return 0; } starpu-1.2.3+dfsg/tools/starpu_fxt_stats.c000066400000000000000000000103601320135501600206670ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013, 2014, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ //#include "fxt_tool.h" #include #include #include #include #include #include #include #include #include #include #include static fxt_t fut; struct fxt_ev_64 ev; static uint64_t transfers[16][16]; #define PROGNAME "starpu_fxt_stat" static void usage() { fprintf(stderr, "Parse the log generated by FxT\n\n"); fprintf(stderr, "Usage: %s [ options ]\n", PROGNAME); fprintf(stderr, "\n"); fprintf(stderr, "Options:\n"); fprintf(stderr, " -i specify the input file.\n"); fprintf(stderr, " -o specify the output file\n"); fprintf(stderr, " -h, --help display this help and exit\n"); fprintf(stderr, " -v, --version output version information and exit\n\n"); fprintf(stderr, "Report bugs to <%s>.", PACKAGE_BUGREPORT); fprintf(stderr, "\n"); } static int parse_args(int argc, char **argv, char **fin, char **fout) { int i; *fin = NULL; *fout = NULL; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-o") == 0) { *fout = argv[++i]; continue; } if (strcmp(argv[i], "-i") == 0) { *fin = argv[++i]; continue; } if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) { usage(); return EXIT_SUCCESS; } if (strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "--version") == 0) { fputs(PROGNAME " (" PACKAGE_NAME ") " PACKAGE_VERSION "\n", stderr); return EXIT_SUCCESS; } } if (!*fin) { fprintf(stderr, "Incorrect usage, aborting\n"); usage(); return 77; } return 0; } static void handle_data_copy(void) { unsigned src = ev.param[0]; unsigned dst = ev.param[1]; unsigned size = ev.param[2]; transfers[src][dst] += size; // printf("transfer %d -> %d : %d \n", src, dst, size); } /* * This program should be used to parse the log generated by FxT */ int main(int argc, char **argv) { char *fin, *fout; int ret; int fd_in; FILE *fd_out; ret = parse_args(argc, argv, &fin, &fout); if (ret) return ret; fd_in = open(fin, O_RDONLY); if (fd_in < 0) { perror("open failed :"); exit(-1); } fut = fxt_fdopen(fd_in); if (!fut) { perror("fxt_fdopen :"); exit(-1); } if (!fout) { fd_out = stdout; } else { fd_out = fopen(fout, "w"); if (fd_out == NULL) { perror("open failed :"); exit(-1); } } fxt_blockev_t block; block = fxt_blockev_enter(fut); unsigned njob = 0; unsigned nws = 0; double start_time = 10e30; double end_time = -10e30; while(1) { ret = fxt_next_ev(block, FXT_EV_TYPE_64, (struct fxt_ev *)&ev); if (ret != FXT_EV_OK) { fprintf(stderr, "no more block ...\n"); break; } end_time = STARPU_MAX(end_time, ev.time); start_time = STARPU_MIN(start_time, ev.time); STARPU_ATTRIBUTE_UNUSED int nbparam = ev.nb_params; switch (ev.code) { case _STARPU_FUT_DATA_COPY: handle_data_copy(); break; case _STARPU_FUT_JOB_POP: njob++; break; case _STARPU_FUT_WORK_STEALING: nws++; break; default: break; } } fprintf(fd_out, "Start : start time %e end time %e length %e\n", start_time, end_time, end_time - start_time); unsigned src, dst; for (src = 0; src < 16; src++) { for (dst = 0; dst < 16; dst++) { if (transfers[src][dst] != 0) { fprintf(fd_out, "%u -> %u \t %lu MB\n", src, dst, (unsigned long)(transfers[src][dst]/(1024*1024))); } } } fprintf(fd_out, "There was %u tasks and %u work stealing\n", njob, nws); if (fd_out != stdout) fclose(fd_out); return 0; } starpu-1.2.3+dfsg/tools/starpu_fxt_tool.c000066400000000000000000000077431320135501600205210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2014, 2016-2017 Universite de Bordeaux * Copyright (C) 2012-2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This program should be used to parse the log generated by FxT */ #include #include #define PROGNAME "starpu_fxt_tool" static void usage() { fprintf(stderr, "Generate a trace in the Paje format\n\n"); fprintf(stderr, "Usage: %s [ options ]\n", PROGNAME); fprintf(stderr, "\n"); fprintf(stderr, "Options:\n"); fprintf(stderr, " -i specify the input file[s]. Several files can be provided,\n"); fprintf(stderr, " or the option specified several times for MPI execution\n"); fprintf(stderr, " case\n"); fprintf(stderr, " -o specify the output file\n"); fprintf(stderr, " -c use a different colour for every type of task\n"); fprintf(stderr, " -no-events do not show events\n"); fprintf(stderr, " -no-counter do not show scheduler counters\n"); fprintf(stderr, " -no-bus do not show PCI bus transfers\n"); fprintf(stderr, " -no-flops do not show flops\n"); fprintf(stderr, " -h, --help display this help and exit\n"); fprintf(stderr, " -v, --version output version information and exit\n\n"); fprintf(stderr, "Report bugs to <%s>.", PACKAGE_BUGREPORT); fprintf(stderr, "\n"); } static struct starpu_fxt_options options; static int parse_args(int argc, char **argv) { /* Default options */ starpu_fxt_options_init(&options); /* We want to support arguments such as "fxt_tool -i trace_*" */ unsigned reading_input_filenames = 0; int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-c") == 0) { options.per_task_colour = 1; reading_input_filenames = 0; continue; } if (strcmp(argv[i], "-o") == 0) { options.out_paje_path = argv[++i]; reading_input_filenames = 0; continue; } if (strcmp(argv[i], "-i") == 0) { options.filenames[options.ninputfiles++] = argv[++i]; reading_input_filenames = 1; continue; } if (strcmp(argv[i], "-no-events") == 0) { options.no_events = 1; reading_input_filenames = 0; continue; } if (strcmp(argv[i], "-no-counter") == 0) { options.no_counter = 1; reading_input_filenames = 0; continue; } if (strcmp(argv[i], "-no-bus") == 0) { options.no_bus = 1; reading_input_filenames = 0; continue; } if (strcmp(argv[i], "-no-flops") == 0) { options.no_flops = 1; reading_input_filenames = 0; continue; } if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) { usage(); return EXIT_SUCCESS; } if (strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "--version") == 0) { fputs(PROGNAME " (" PACKAGE_NAME ") " PACKAGE_VERSION "\n", stderr); return EXIT_SUCCESS; } /* That's pretty dirty: if the reading_input_filenames flag is * set, and that the argument does not match an option, we * assume this may be another filename */ if (reading_input_filenames) { options.filenames[options.ninputfiles++] = argv[i]; continue; } } if (!options.ninputfiles) { fprintf(stderr, "Incorrect usage, aborting\n"); usage(); return 77; } return 0; } int main(int argc, char **argv) { int ret = parse_args(argc, argv); if (ret) return ret; starpu_fxt_generate_trace(&options); return 0; } starpu-1.2.3+dfsg/tools/starpu_lp2paje.1000066400000000000000000000006721320135501600201300ustar00rootroot00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH STARPU_LP2PAJE "1" "November 2017" "starpu_lp2paje (StarPU) 1.2.3" "User Commands" .SH NAME starpu_lp2paje \- manual page for starpu_lp2paje (StarPU) 1.2.3 .SH SYNOPSIS .B lp_solve \fIfile.lp | starpu_lp2paje > paje.trace\fR .SH DESCRIPTION Convert schedule optimized by lp into the Paje format .SH "REPORTING BUGS" Report bugs to . starpu-1.2.3+dfsg/tools/starpu_lp2paje.c000066400000000000000000000103571320135501600202130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013-2014, 2017 Université de Bordeaux * Copyright (C) 2014, 2015, 2016, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #define PROGNAME "starpu_lp2paje" struct task { double start; double stop; int num; int worker; }; int main(int argc, char *argv[]) { int nw, nt; double tmax; int i, w, ww, t, tt; int foo; double bar; if (argc != 1) { if (strcmp(argv[1], "-v") == 0 || strcmp(argv[1], "--version") == 0) { fprintf(stderr, "%s (%s) %s\n", PROGNAME, PACKAGE_NAME, PACKAGE_VERSION); exit(EXIT_SUCCESS); } fprintf(stderr, "Convert schedule optimized by lp into the Paje format\n\n"); fprintf(stderr, "Usage: lp_solve file.lp | %s > paje.trace\n", PROGNAME); fprintf(stderr, "Report bugs to <%s>.", PACKAGE_BUGREPORT); fprintf(stderr, "\n"); exit(EXIT_SUCCESS); } assert(scanf("Suboptimal solution\n") == 0); assert(scanf("\nValue of objective function: %lf\n", &tmax) == 1); assert(scanf("Actual values of the variables:\n") == 0); assert(scanf("tmax %lf\n", &tmax) == 1); assert(scanf("nt %d\n", &nt) == 1); assert(nt >= 0); assert(scanf("nw %d\n", &nw) == 1); assert(nw >= 0); printf( "%%EventDef PajeDefineContainerType 1\n" "%% Alias string\n" "%% ContainerType string\n" "%% Name string\n" "%%EndEventDef\n" "%%EventDef PajeCreateContainer 2\n" "%% Time date\n" "%% Alias string\n" "%% Type string\n" "%% Container string\n" "%% Name string\n" "%%EndEventDef\n" "%%EventDef PajeDefineStateType 3\n" "%% Alias string\n" "%% ContainerType string\n" "%% Name string\n" "%%EndEventDef\n" "%%EventDef PajeDestroyContainer 4\n" "%% Time date\n" "%% Name string\n" "%% Type string\n" "%%EndEventDef\n" "%%EventDef PajeDefineEntityValue 5\n" "%% Alias string\n" "%% EntityType string\n" "%% Name string\n" "%% Color color\n" "%%EndEventDef\n" "%%EventDef PajeSetState 6\n" "%% Time date\n" "%% Type string\n" "%% Container string\n" "%% Value string\n" "%%EndEventDef\n" "1 W 0 Worker\n" ); printf("3 S W \"Worker State\"\n"); for (t = 0; t < nt; t++) printf("5 R%d S Running_%d \"0.0 1.0 0.0\"\n", t, t); printf("5 F S Idle \"1.0 0.0 0.0\"\n"); for (i = 0; i < nw; i++) printf("2 0 W%d W 0 \"%d\"\n", i, i); for (w = 0; w < nw; w++) printf("4 %f W%d W\n", tmax, w); fprintf(stderr,"%d workers, %d tasks\n", nw, nt); { struct task task[nt]; memset(&task, 0, sizeof(task)); for (t = nt-1; t >= 0; t--) { assert(scanf("c%d %lf\n", &foo, &task[t].stop) == 2); } for (t = nt-1; t >= 0; t--) for (w = 0; w < nw; w++) { assert(scanf("t%dw%d %lf\n", &tt, &ww, &bar) == 3); assert(ww == w); if (bar > 0.5) { task[t].num = tt; task[t].worker = w; } } for (t = nt-1; t >= 0; t--) { assert(scanf("s%d %lf\n", &tt, &task[t].start) == 2); fprintf(stderr,"%d: task %d on %d: %f - %f\n", nt-1-t, tt, task[t].worker, task[t].start, task[t].stop); assert(tt == task[t].num); } for (t = 0; t < nt; t++) { printf("6 %f S W%d R%d\n", task[t].start, task[t].worker, t); printf("6 %f S W%d F\n", task[t].stop, task[t].worker); } for (t = 0; t < nt; t++) { int t2; for (t2 = 0; t2 < nt; t2++) { if (t != t2 && task[t].worker == task[t2].worker) { if (!(task[t].start >= task[t2].stop || task[t2].start >= task[t].stop)) { fprintf(stderr,"oops, %d and %d sharing worker %d !!\n", task[t].num, task[t2].num, task[t].worker); } } } } } return 0; } starpu-1.2.3+dfsg/tools/starpu_machine_display.1000066400000000000000000000014531320135501600217220ustar00rootroot00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH STARPU_MACHINE_DISPLAY "1" "November 2017" "starpu_machine_display (StarPU) 1.2.3" "User Commands" .SH NAME starpu_machine_display \- manual page for starpu_machine_display (StarPU) 1.2.3 .SH SYNOPSIS .B starpu_machine_display [\fIOPTION\fR] .SH DESCRIPTION Show the processing units that StarPU can use, and the bandwitdh and affinity measured between the memory nodes. .SH OPTIONS .TP \fB\-h\fR, \fB\-\-help\fR display this help and exit .TP \fB\-v\fR, \fB\-\-version\fR output version information and exit .TP \fB\-i\fR, \fB\-\-info\fR display the name of the files containing the information .TP \fB\-f\fR, \fB\-\-force\fR force bus sampling and show measures .SH "REPORTING BUGS" Report bugs to . starpu-1.2.3+dfsg/tools/starpu_machine_display.c000066400000000000000000000116051320135501600220040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2012, 2014-2015, 2017 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #define PROGNAME "starpu_machine_display" static void usage() { fprintf(stderr, "Show the processing units that StarPU can use,\n"); fprintf(stderr, "and the bandwitdh and affinity measured between the memory nodes.\n"); fprintf(stderr, "\n"); fprintf(stderr, "Usage: %s [OPTION]\n", PROGNAME); fprintf(stderr, "\n"); fprintf(stderr, "Options:\n"); fprintf(stderr, "\t-h, --help display this help and exit\n"); fprintf(stderr, "\t-v, --version output version information and exit\n"); fprintf(stderr, "\t-i, --info display the name of the files containing the information\n"); fprintf(stderr, "\t-f, --force force bus sampling and show measures \n"); fprintf(stderr, "\n"); fprintf(stderr, "Report bugs to <%s>.\n", PACKAGE_BUGREPORT); } static void display_worker_names(enum starpu_worker_archtype type) { int nworkers = starpu_worker_get_count_by_type(type); if (!nworkers) return; STARPU_ASSERT(nworkers>0); int ids[nworkers]; starpu_worker_get_ids_by_type(type, ids, nworkers); int i; for (i = 0; i < nworkers; i++) { char name[256]; starpu_worker_get_name(ids[i], name, 256); fprintf(stdout, "\t\t%s\n", name); } } static void display_combined_worker(unsigned workerid) { int worker_size; int *combined_workerid; starpu_combined_worker_get_description(workerid, &worker_size, &combined_workerid); fprintf(stdout, "\t\t"); int i; for (i = 0; i < worker_size; i++) { char name[256]; starpu_worker_get_name(combined_workerid[i], name, 256); fprintf(stdout, "%s\t", name); } fprintf(stdout, "\n"); } static void display_all_combined_workers(void) { unsigned ncombined_workers = starpu_combined_worker_get_count(); if (ncombined_workers == 0) return; unsigned nworkers = starpu_worker_get_count(); fprintf(stdout, "\t%u Combined workers\n", ncombined_workers); unsigned i; for (i = 0; i < ncombined_workers; i++) display_combined_worker(nworkers + i); } static void parse_args(int argc, char **argv, int *force, int *info) { int i; if (argc == 1) return; for (i = 1; i < argc; i++) { if (strncmp(argv[i], "--force", 7) == 0 || strncmp(argv[i], "-f", 2) == 0) { *force = 1; } else if (strncmp(argv[i], "--info", 6) == 0 || strncmp(argv[i], "-i", 2) == 0) { *info = 1; } else if (strncmp(argv[i], "--help", 6) == 0 || strncmp(argv[i], "-h", 2) == 0) { usage(); exit(EXIT_FAILURE); } else if (strncmp(argv[i], "--version", 9) == 0 || strncmp(argv[i], "-v", 2) == 0) { fputs(PROGNAME " (" PACKAGE_NAME ") " PACKAGE_VERSION "\n", stderr); exit(EXIT_FAILURE); } else { fprintf(stderr, "Unknown arg %s\n", argv[1]); usage(); exit(EXIT_FAILURE); } } } int main(int argc, char **argv) { int ret; int force = 0; int info = 0; struct starpu_conf conf; parse_args(argc, argv, &force, &info); starpu_conf_init(&conf); if (force) conf.bus_calibrate = 1; /* Even if starpu_init returns -ENODEV, we should go on : we will just * print that we found no device. */ ret = starpu_init(&conf); if (ret != 0 && ret != -ENODEV) { return ret; } if (info) { starpu_bus_print_filenames(stdout); starpu_shutdown(); return 0; } unsigned ncpu = starpu_cpu_worker_get_count(); unsigned ncuda = starpu_cuda_worker_get_count(); unsigned nopencl = starpu_opencl_worker_get_count(); #ifdef STARPU_USE_MIC unsigned nmicdevs = starpu_mic_device_get_count(); unsigned nmiccores = starpu_mic_worker_get_count(); #endif fprintf(stdout, "StarPU has found :\n"); fprintf(stdout, "\t%u CPU threads\n", ncpu); display_worker_names(STARPU_CPU_WORKER); fprintf(stdout, "\t%u CUDA devices\n", ncuda); display_worker_names(STARPU_CUDA_WORKER); fprintf(stdout, "\t%u OpenCL devices\n", nopencl); display_worker_names(STARPU_OPENCL_WORKER); #ifdef STARPU_USE_MIC fprintf(stdout, "\t%u MIC cores (from %u devices)\n", nmiccores, nmicdevs); display_worker_names(STARPU_MIC_WORKER); #endif display_all_combined_workers(); if (ret != -ENODEV) { fprintf(stdout, "\ntopology ... (hwloc logical indexes)\n"); starpu_topology_print(stdout); fprintf(stdout, "\nbandwidth and latency ...\n"); starpu_bus_print_bandwidth(stdout); starpu_shutdown(); } return 0; } starpu-1.2.3+dfsg/tools/starpu_paje_draw_histogram000077500000000000000000000065361320135501600224550ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014 Université Joseph Fourier # Copyright (C) 2014-2015 Université Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # Script for giving statistical analysis of the paje trace set -e # fail fast # File names basename="$PWD" r_script="$(dirname $(which $0))/starpu_paje_draw_histogram.R" r_input="" # Command line arguments range="0:-1" name="All" verbose=0 inputfiles="" help_script() { cat << EOF Give statistical analysis of the paje trace $0 [ options ] paje.trace [paje.trace2 ...] Options: -r To fix range x1:x2 ("-1" for infinity) -n To choose a certain state -v Print output to command line -h Show this message Examples: $0 -n chol_model_22 example.native.trace $0 -r 100:300 -n FetchingInput,Overhead -v example.native.trace example.simgrid.trace Report bugs to EOF } if [ "$1" = "--version" ] ; then echo "$PROGNAME (StarPU) 1.2.3" exit 0 fi if [ "$1" = "-h" ] || [ "$1" = "--help" ] || [ "$1" = "" ] ; then help_script exit 0 fi while getopts "r:n:vh" opt; do case $opt in r) range="$OPTARG" ;; n) name="$OPTARG" ;; v) verbose=1 ;; h) help_script exit 4 ;; \?) echo "Invalid option: -$OPTARG" help_script exit 3 ;; esac done # Reading files that need to be analyzed shift $((OPTIND - 1)) inputfiles=$@ if [[ $# < 1 ]]; then echo "Error!" help_script exit 2 fi # Getting range range1=$(eval echo $range | cut -d: -f1) range2=$(eval echo $range | cut -d: -f2) ##################################### # Transforming input files into .csv for file in $inputfiles; do if [ ! -s $file ] then echo "Error: file $file does not exist!" exit 5 fi # Sorting traces grep -e '^\(\(%\)\|\(\(0\|1\|2\|3\|4\|5\|6\|7\)\>\)\)' $file > start.trace grep -e '^\(\(%\)\|\(\(0\|1\|2\|3\|4\|5\|6\|7\)\>\)\)' -v $file > end.trace sort -s -V --key=2,2 end.trace > endSorted.trace if grep -q start_profiling endSorted.trace then echo Using start_profiling/stop_profiling trace selection. sed -ne '/start_profiling/,/stop_profiling/p' < endSorted.trace > endSorted2.trace else cp endSorted.trace endSorted2.trace fi cat start.trace endSorted2.trace > outputSorted.trace # Transferring to .csv pj_dump -n outputSorted.trace > $file.csv perl -i -ne 'print if /^State/' $file.csv r_input=$(eval echo "$r_input $file.csv") done ##################################### # Running R file to get actual results Rscript $r_script $range1 $range2 $name $r_input # Directly opening .pdf result if [[ $verbose == 1 ]]; then evince Rplots.pdf fi # Cleanup: delete temporary files rm -f outputSorted.trace rm -f start.trace rm -f end.trace rm -f endSorted.trace rm -f endSorted2.trace starpu-1.2.3+dfsg/tools/starpu_paje_draw_histogram.1000066400000000000000000000016021320135501600225760ustar00rootroot00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH STARPU_PAJE_DRAW_HISTOGRAM "1" "November 2017" "starpu_paje_draw_histogram (StarPU) 1.2.3" "User Commands" .SH NAME starpu_paje_draw_histogram \- manual page for starpu_paje_draw_histogram (StarPU) 1.2.3 .SH DESCRIPTION Give statistical analysis of the paje trace .PP \&./starpu_paje_draw_histogram [ options ] paje.trace [paje.trace2 ...] .SH OPTIONS .TP \fB\-r\fR To fix range x1:x2 ("\-1" for infinity) .TP \fB\-n\fR To choose a certain state .TP \fB\-v\fR Print output to command line .TP \fB\-h\fR Show this message .SH EXAMPLES \&./starpu_paje_draw_histogram \fB\-n\fR chol_model_22 example.native.trace .PP \&./starpu_paje_draw_histogram \fB\-r\fR 100:300 \fB\-n\fR FetchingInput,Overhead \fB\-v\fR example.native.trace example.simgrid.trace .SH "REPORTING BUGS" Report bugs to starpu-1.2.3+dfsg/tools/starpu_paje_draw_histogram.R000077500000000000000000000110651320135501600226460ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014 Université Joseph Fourier # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # R script that is giving statistical analysis of the paje trace # Can be called from the command line with: # Rscript $this_script $range1 $range2 $name $outputfile $inputfiles # Package containing ddply function library(plyr) library(ggplot2) library(data.table) # Function for reading .csv file read_df <- function(file,range1,range2) { df<-read.csv(file, header=FALSE, strip.white=TRUE) names(df) <- c("Nature","ResourceId","Type","Start","End","Duration", "Depth", "Value") df = df[!(names(df) %in% c("Nature","Type", "Depth"))] df$Origin<-file # Changing names if needed: df$Value <- as.character(df$Value) df$Value <- ifelse(df$Value == "F", "Freeing", as.character(df$Value)) df$Value <- ifelse(df$Value == "A", "Allocating", as.character(df$Value)) df$Value <- ifelse(df$Value == "W", "WritingBack", as.character(df$Value)) df$Value <- ifelse(df$Value == "No", "Nothing", as.character(df$Value)) df$Value <- ifelse(df$Value == "I", "Initializing", as.character(df$Value)) df$Value <- ifelse(df$Value == "D", "Deinitializing", as.character(df$Value)) df$Value <- ifelse(df$Value == "Fi", "FetchingInput", as.character(df$Value)) df$Value <- ifelse(df$Value == "Po", "PushingOutput", as.character(df$Value)) df$Value <- ifelse(df$Value == "C", "Callback", as.character(df$Value)) df$Value <- ifelse(df$Value == "B", "Overhead", as.character(df$Value)) df$Value <- ifelse(df$Value == "Sl", "Sleeping", as.character(df$Value)) df$Value <- ifelse(df$Value == "P", "Progressing", as.character(df$Value)) df$Value <- ifelse(df$Value == "U", "Unpartitioning", as.character(df$Value)) df$Value <- ifelse(df$Value == "Ar", "AllocatingReuse", as.character(df$Value)) df$Value <- ifelse(df$Value == "R", "Reclaiming", as.character(df$Value)) df$Value <- ifelse(df$Value == "Co", "DriverCopy", as.character(df$Value)) df$Value <- ifelse(df$Value == "CoA", "DriverCopyAsync", as.character(df$Value)) # Considering only the states with a given name if (name != "All") df<-df[df$Value %in% name[[1]],] # Aligning to begin time from 0 m <- min(df$Start) df$Start <- df$Start - m df$End <- df$Start+df$Duration # Taking only the states inside a given range df <- df[df$Start>=range1 & df$End<=range2,] # Return data frame df } ######################################### ######################################### # Main ######################################### # Reading command line arguments args <- commandArgs(trailingOnly = TRUE) range1<-as.numeric(args[1]) if (range1==-1) range1<-Inf range2<-as.numeric(args[2]) if (range2==-1) range2<-Inf name<-strsplit(args[3], ",") # Reading first file filename<-args[4] df<-read_df(filename,range1,range2) i=5 while (i <= length(args)) { # Reading next input file filename<-args[i] dft<-read_df(filename,range1,range2) df<-rbindlist(list(df,dft)) i <- i+1 } # Error: if there is no results for a given range and state if (nrow(df)==0) stop("Result is empty!") # Plotting histograms plot <- ggplot(df, aes(x=Duration)) + geom_histogram(aes(y=..count.., fill=..count..),binwidth = diff(range(df$Duration))/30) plot <- plot + theme_bw() + scale_fill_gradient(high = "#132B43", low = "#56B1F7") + ggtitle("Histograms for state distribution") + ylab("Count") + xlab("Time [ms]") + theme(legend.position="none") + facet_grid(Origin~Value,scales = "free_y") # Adding text for total duration ad<-ggplot_build(plot)$data[[1]] al<-ggplot_build(plot)$panel$layout ad<-merge(ad,al) anno1 <- ddply(ad, .(ROW), summarise, x = max(x)*0.7, y = max(y)*0.9) anno1<-merge(anno1,al) anno2 <- ddply(df, .(Origin,Value), summarise, tot=as.integer(sum(Duration))) anno2$PANEL <- row.names(anno2) anno2$lab <- sprintf("Total duration: \n%ims",anno2$tot) anno <- merge(anno1,anno2) plot <- plot + geom_text(data = anno, aes(x=x, y=y, label=lab, colour="red")) # Printing plot plot # End write("Done producing a histogram plot. Open Rplots.pdf located in this folder to see the results", stdout()) starpu-1.2.3+dfsg/tools/starpu_paje_draw_histogram.in000077500000000000000000000065431320135501600230600ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014 Université Joseph Fourier # Copyright (C) 2014-2015 Université Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # Script for giving statistical analysis of the paje trace set -e # fail fast # File names basename="$PWD" r_script="$(dirname $(which $0))/starpu_paje_draw_histogram.R" r_input="" # Command line arguments range="0:-1" name="All" verbose=0 inputfiles="" help_script() { cat << EOF Give statistical analysis of the paje trace $0 [ options ] paje.trace [paje.trace2 ...] Options: -r To fix range x1:x2 ("-1" for infinity) -n To choose a certain state -v Print output to command line -h Show this message Examples: $0 -n chol_model_22 example.native.trace $0 -r 100:300 -n FetchingInput,Overhead -v example.native.trace example.simgrid.trace Report bugs to <@PACKAGE_BUGREPORT@> EOF } if [ "$1" = "--version" ] ; then echo "$PROGNAME (@PACKAGE_NAME@) @PACKAGE_VERSION@" exit 0 fi if [ "$1" = "-h" ] || [ "$1" = "--help" ] || [ "$1" = "" ] ; then help_script exit 0 fi while getopts "r:n:vh" opt; do case $opt in r) range="$OPTARG" ;; n) name="$OPTARG" ;; v) verbose=1 ;; h) help_script exit 4 ;; \?) echo "Invalid option: -$OPTARG" help_script exit 3 ;; esac done # Reading files that need to be analyzed shift $((OPTIND - 1)) inputfiles=$@ if [[ $# < 1 ]]; then echo "Error!" help_script exit 2 fi # Getting range range1=$(eval echo $range | cut -d: -f1) range2=$(eval echo $range | cut -d: -f2) ##################################### # Transforming input files into .csv for file in $inputfiles; do if [ ! -s $file ] then echo "Error: file $file does not exist!" exit 5 fi # Sorting traces grep -e '^\(\(%\)\|\(\(0\|1\|2\|3\|4\|5\|6\|7\)\>\)\)' $file > start.trace grep -e '^\(\(%\)\|\(\(0\|1\|2\|3\|4\|5\|6\|7\)\>\)\)' -v $file > end.trace sort -s -V --key=2,2 end.trace > endSorted.trace if grep -q start_profiling endSorted.trace then echo Using start_profiling/stop_profiling trace selection. sed -ne '/start_profiling/,/stop_profiling/p' < endSorted.trace > endSorted2.trace else cp endSorted.trace endSorted2.trace fi cat start.trace endSorted2.trace > outputSorted.trace # Transferring to .csv pj_dump -n outputSorted.trace > $file.csv perl -i -ne 'print if /^State/' $file.csv r_input=$(eval echo "$r_input $file.csv") done ##################################### # Running R file to get actual results Rscript $r_script $range1 $range2 $name $r_input # Directly opening .pdf result if [[ $verbose == 1 ]]; then evince Rplots.pdf fi # Cleanup: delete temporary files rm -f outputSorted.trace rm -f start.trace rm -f end.trace rm -f endSorted.trace rm -f endSorted2.trace starpu-1.2.3+dfsg/tools/starpu_paje_sort.in000077500000000000000000000057261320135501600210370ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014 Université Joseph Fourier # Copyright (C) 2014-2015, 2017 Université Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # Script for sorting paje traces set -e # fail fast # File names basename="$PWD" inputfiles="" help_script() { cat << EOF Give statistical analysis of the paje trace $0 [ options ] paje.trace [paje.trace2 ...] Options: -h Show this message Examples: $0 example.trace Report bugs to <@PACKAGE_BUGREPORT@> EOF } if [ "$1" = "--version" ] ; then echo "$PROGNAME (@PACKAGE_NAME@) @PACKAGE_VERSION@" exit 0 fi if [ "$1" = "-h" ] || [ "$1" = "--help" ] || [ "$1" = "" ] ; then help_script exit 0 fi while getopts "h" opt; do case $opt in h) help_script exit 4 ;; \?) echo "Invalid option: -$OPTARG" help_script exit 3 ;; esac done # Reading files that need to be analyzed shift $((OPTIND - 1)) inputfiles=$@ if [[ $# < 1 ]]; then echo "Error!" help_script exit 2 fi get_event_num() { grep "^%EventDef[ ]$2" $1 | sed -e "s/.*$2[ ]*//" } ##################################### # Transforming input files into .csv for file in $inputfiles; do if [ ! -s $file ] then echo "Error: file $file does not exist!" exit 5 fi DefCont="$(get_event_num $file PajeDefineContainerType) " DefEvent="$(get_event_num $file PajeDefineEventType) " DefState="$(get_event_num $file PajeDefineStateType) " DefVar="$(get_event_num $file PajeDefineVariableType) " DefLink="$(get_event_num $file PajeDefineLinkType) " DefEnt="$(get_event_num $file PajeDefineEntityValue) " CreateCont="$(get_event_num $file PajeCreateContainer) " AddVar="$(get_event_num $file PajeAddVariable) " grepstr="^\\(%\\|$DefCont\\|$DefEvent\\|$DefState\\|$DefVar\\|$DefLink\\|$DefEnt\\|$CreateCont\\|$AddVar\\)" grepstr=${grepstr//[ ]/[ ]} # Sorting traces grep -e "$grepstr" $file > start.trace grep -e "$grepstr" -v $file > end.trace sort -s -V --key=2,2 end.trace > endSorted.trace if grep -q start_profiling endSorted.trace then echo Using start_profiling/stop_profiling trace selection. sed -ne '/start_profiling/,/stop_profiling/p' < endSorted.trace > endSorted2.trace else cp endSorted.trace endSorted2.trace fi cat start.trace endSorted2.trace > $file done # Cleanup: delete temporary files rm -f start.trace rm -f end.trace rm -f endSorted.trace rm -f endSorted2.trace starpu-1.2.3+dfsg/tools/starpu_paje_state_stats000077500000000000000000000066111320135501600217730ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014 Université Joseph Fourier # Copyright (C) 2014-2015 Université Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # Script for giving statistical analysis of the paje trace set -e # fail fast # File names basename="$PWD" outputfile="starpu_paje_state_stats.csv" r_script="$(dirname $(which $0))/starpu_paje_state_stats.R" r_input="" # Command line arguments range="0:-1" name="All" verbose=0 inputfiles="" help_script() { cat << EOF Give statistical analysis of the paje trace $0 [ options ] paje.trace [paje.trace2 ...] Options: -r To fix range x1:x2 ("-1" for infinity) -n To choose a certain state -v Print output to command line -h Show this message Examples: $0 example.native.trace $0 -r 100:300 -n FetchingInput -v example.native.trace example.simgrid.trace Report bugs to EOF } if [ "$1" = "--version" ] ; then echo "$PROGNAME (StarPU) 1.2.3" exit 0 fi if [ "$1" = "-h" ] || [ "$1" = "--help" ] || [ "$1" = "" ] ; then help_script exit 0 fi while getopts "r:n:vh" opt; do case $opt in r) range="$OPTARG" ;; n) name="$OPTARG" ;; v) verbose=1 ;; h) help_script exit 4 ;; \?) echo "Invalid option: -$OPTARG" help_script exit 3 ;; esac done # Reading files that need to be analyzed shift $((OPTIND - 1)) inputfiles=$@ if [[ $# < 1 ]]; then echo "Error!" help_script exit 2 fi # Getting range range1=$(eval echo $range | cut -d: -f1) range2=$(eval echo $range | cut -d: -f2) ##################################### # Transforming input files into .csv for file in $inputfiles; do if [ ! -s $file ] then echo "Error: file $file does not exist!" exit 5 fi # Sorting traces grep -e '^\(\(%\)\|\(\(0\|1\|2\|3\|4\|5\|6\|7\)\>\)\)' $file > start.trace grep -e '^\(\(%\)\|\(\(0\|1\|2\|3\|4\|5\|6\|7\)\>\)\)' -v $file > end.trace sort -s -V --key=2,2 end.trace > endSorted.trace if grep -q start_profiling endSorted.trace then echo Using start_profiling/stop_profiling trace selection. sed -ne '/start_profiling/,/stop_profiling/p' < endSorted.trace > endSorted2.trace else cp endSorted.trace endSorted2.trace fi cat start.trace endSorted2.trace > outputSorted.trace # Transferring to .csv pj_dump -n outputSorted.trace > $file.csv perl -i -ne 'print if /^State/' $file.csv r_input=$(eval echo "$r_input $file.csv") done ##################################### # Running R file to get actual results Rscript $r_script $range1 $range2 $name $outputfile $r_input # If verbose then write results to stdout if [[ $verbose == 1 ]]; then column -s, -t $outputfile fi # Cleanup: delete temporary files rm -f outputSorted.trace rm -f start.trace rm -f end.trace rm -f endSorted.trace rm -f endSorted2.trace starpu-1.2.3+dfsg/tools/starpu_paje_state_stats.1000066400000000000000000000015141320135501600221240ustar00rootroot00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH STARPU_PAJE_STATE_STATS "1" "November 2017" "starpu_paje_state_stats (StarPU) 1.2.3" "User Commands" .SH NAME starpu_paje_state_stats \- manual page for starpu_paje_state_stats (StarPU) 1.2.3 .SH DESCRIPTION Give statistical analysis of the paje trace .PP \&./starpu_paje_state_stats [ options ] paje.trace [paje.trace2 ...] .SH OPTIONS .TP \fB\-r\fR To fix range x1:x2 ("\-1" for infinity) .TP \fB\-n\fR To choose a certain state .TP \fB\-v\fR Print output to command line .TP \fB\-h\fR Show this message .SH EXAMPLES \&./starpu_paje_state_stats example.native.trace .PP \&./starpu_paje_state_stats \fB\-r\fR 100:300 \fB\-n\fR FetchingInput \fB\-v\fR example.native.trace example.simgrid.trace .SH "REPORTING BUGS" Report bugs to starpu-1.2.3+dfsg/tools/starpu_paje_state_stats.in000077500000000000000000000066161320135501600224050ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014 Université Joseph Fourier # Copyright (C) 2014-2015 Université Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # Script for giving statistical analysis of the paje trace set -e # fail fast # File names basename="$PWD" outputfile="starpu_paje_state_stats.csv" r_script="$(dirname $(which $0))/starpu_paje_state_stats.R" r_input="" # Command line arguments range="0:-1" name="All" verbose=0 inputfiles="" help_script() { cat << EOF Give statistical analysis of the paje trace $0 [ options ] paje.trace [paje.trace2 ...] Options: -r To fix range x1:x2 ("-1" for infinity) -n To choose a certain state -v Print output to command line -h Show this message Examples: $0 example.native.trace $0 -r 100:300 -n FetchingInput -v example.native.trace example.simgrid.trace Report bugs to <@PACKAGE_BUGREPORT@> EOF } if [ "$1" = "--version" ] ; then echo "$PROGNAME (@PACKAGE_NAME@) @PACKAGE_VERSION@" exit 0 fi if [ "$1" = "-h" ] || [ "$1" = "--help" ] || [ "$1" = "" ] ; then help_script exit 0 fi while getopts "r:n:vh" opt; do case $opt in r) range="$OPTARG" ;; n) name="$OPTARG" ;; v) verbose=1 ;; h) help_script exit 4 ;; \?) echo "Invalid option: -$OPTARG" help_script exit 3 ;; esac done # Reading files that need to be analyzed shift $((OPTIND - 1)) inputfiles=$@ if [[ $# < 1 ]]; then echo "Error!" help_script exit 2 fi # Getting range range1=$(eval echo $range | cut -d: -f1) range2=$(eval echo $range | cut -d: -f2) ##################################### # Transforming input files into .csv for file in $inputfiles; do if [ ! -s $file ] then echo "Error: file $file does not exist!" exit 5 fi # Sorting traces grep -e '^\(\(%\)\|\(\(0\|1\|2\|3\|4\|5\|6\|7\)\>\)\)' $file > start.trace grep -e '^\(\(%\)\|\(\(0\|1\|2\|3\|4\|5\|6\|7\)\>\)\)' -v $file > end.trace sort -s -V --key=2,2 end.trace > endSorted.trace if grep -q start_profiling endSorted.trace then echo Using start_profiling/stop_profiling trace selection. sed -ne '/start_profiling/,/stop_profiling/p' < endSorted.trace > endSorted2.trace else cp endSorted.trace endSorted2.trace fi cat start.trace endSorted2.trace > outputSorted.trace # Transferring to .csv pj_dump -n outputSorted.trace > $file.csv perl -i -ne 'print if /^State/' $file.csv r_input=$(eval echo "$r_input $file.csv") done ##################################### # Running R file to get actual results Rscript $r_script $range1 $range2 $name $outputfile $r_input # If verbose then write results to stdout if [[ $verbose == 1 ]]; then column -s, -t $outputfile fi # Cleanup: delete temporary files rm -f outputSorted.trace rm -f start.trace rm -f end.trace rm -f endSorted.trace rm -f endSorted2.trace starpu-1.2.3+dfsg/tools/starpu_paje_summary.in000077500000000000000000000054401320135501600215360ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014 Université Joseph Fourier # Copyright (C) 2014-2015 Université Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # Script for giving statistical analysis of the paje trace set -e # fail fast # File names basename="$PWD" outputfile="summary.html" analysis_script="$(dirname $(which $0))/starpu_paje_summary.Rmd" analysis_input="" # Command line arguments inputfiles="" help_script() { cat << EOF Give statistical analysis of the paje trace Options: -h Show this message Examples: $0 example.native.trace $0 example.native.trace example.simgrid.trace Report bugs to <@PACKAGE_BUGREPORT@> EOF } if [ "$1" = "--version" ] ; then echo "$PROGNAME (@PACKAGE_NAME@) @PACKAGE_VERSION@" exit 0 fi if [ "$1" = "-h" ] || [ "$1" = "--help" ] || [ "$1" = "" ] ; then help_script exit 0 fi while getopts "h" opt; do case $opt in \?) echo "Invalid option: -$OPTARG" help_script exit 3 ;; esac done # Reading files that need to be analyzed shift $((OPTIND - 1)) inputfiles=$@ # Error if there is no input files specified if [[ $# < 1 ]]; then echo "Error!" help_script exit 2 fi ##################################### # Transforming input files into .csv for file in $inputfiles; do if [ ! -s $file ] then echo "Error: file $file does not exist!" exit 5 fi # Sorting traces grep -e '^\(\(%\)\|\(\(0\|1\|2\|3\|4\|5\|6\|7\|9\)\>\)\)' $file > start.trace grep -e '^\(\(%\)\|\(\(0\|1\|2\|3\|4\|5\|6\|7\|9\|18\|19\)\>\)\)' -v $file > end.trace sort -s -V --key=2,2 end.trace > endSorted.trace cat start.trace endSorted.trace > outputSorted.trace # Transferring to .csv pj_dump -n outputSorted.trace > $file.csv perl -i -ne 'print if /^State/' $file.csv done analysis_input=`echo \"$inputfiles".csv\"" | sed 's/ */.csv", "/g'` ##################################### # Running analysis file to get actual results Rscript -e "library(knitr); input_traces = c($analysis_input) ; outputhtml='$outputfile';\ outputRmd = gsub('.html\$','.Rmd',outputhtml);\ knit('$analysis_script',output=outputRmd); knitr::knit2html(outputRmd)" # Cleanup: delete temporary files rm -f outputSorted.trace rm -f start.trace rm -f end.trace rm -f endSorted.trace starpu-1.2.3+dfsg/tools/starpu_perfmodel_display.1000066400000000000000000000017641320135501600223000ustar00rootroot00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH STARPU_PERFMODEL_DISPLAY "1" "November 2017" "starpu_perfmodel_display (StarPU) 1.2.3" "User Commands" .SH NAME starpu_perfmodel_display \- manual page for starpu_perfmodel_display (StarPU) 1.2.3 .SH SYNOPSIS .B starpu_perfmodel_display [ \fIoptions \fR] .SH DESCRIPTION Display a given perfmodel .PP One must specify either \fB\-l\fR or \fB\-s\fR Options: .TP \fB\-l\fR display all available models .TP \fB\-s\fR specify the symbol .TP \fB\-p\fR specify the parameter (e.g. a, b, c, mean, stddev) .TP \fB\-a\fR specify the architecture (e.g. cpu, cpu:k, cuda) .TP \fB\-f\fR display the history\-based model for the specified footprint .TP \fB\-d\fR display the directory storing performance models .TP \fB\-h\fR, \fB\-\-help\fR display this help and exit .TP \fB\-v\fR, \fB\-\-version\fR output version information and exit .SH "REPORTING BUGS" Report bugs to . starpu-1.2.3+dfsg/tools/starpu_perfmodel_display.c000066400000000000000000000120241320135501600223510ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2013-2014, 2017 Université de Bordeaux * Copyright (C) 2011, 2012, 2013, 2014, 2016, 2017 CNRS * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #if defined(_WIN32) && !defined(__CYGWIN__) #include #endif #define PROGNAME "starpu_perfmodel_display" /* display all available models */ static int plist = 0; /* display directory */ static int pdirectory = 0; /* what kernel ? */ static char *psymbol = NULL; /* what parameter should be displayed ? (NULL = all) */ static char *pparameter = NULL; /* which architecture ? (NULL = all)*/ static char *parch = NULL; /* should we display a specific footprint ? */ static unsigned pdisplay_specific_footprint; static uint32_t pspecific_footprint; static void usage() { fprintf(stderr, "Display a given perfmodel\n\n"); fprintf(stderr, "Usage: %s [ options ]\n", PROGNAME); fprintf(stderr, "\n"); fprintf(stderr, "One must specify either -l or -s\n"); fprintf(stderr, "Options:\n"); fprintf(stderr, " -l display all available models\n"); fprintf(stderr, " -s specify the symbol\n"); fprintf(stderr, " -p specify the parameter (e.g. a, b, c, mean, stddev)\n"); fprintf(stderr, " -a specify the architecture (e.g. cpu, cpu:k, cuda)\n"); fprintf(stderr, " -f display the history-based model for the specified footprint\n"); fprintf(stderr, " -d display the directory storing performance models\n"); fprintf(stderr, " -h, --help display this help and exit\n"); fprintf(stderr, " -v, --version output version information and exit\n\n"); fprintf(stderr, "Report bugs to <%s>.", PACKAGE_BUGREPORT); fprintf(stderr, "\n"); } static void parse_args(int argc, char **argv) { int c; int res; static struct option long_options[] = { {"arch", required_argument, NULL, 'a'}, {"footprint", required_argument, NULL, 'f'}, {"help", no_argument, NULL, 'h'}, /* XXX Would be cleaner to set a flag */ {"list", no_argument, NULL, 'l'}, {"dir", no_argument, NULL, 'd'}, {"parameter", required_argument, NULL, 'p'}, {"symbol", required_argument, NULL, 's'}, {"version", no_argument, NULL, 'v'}, {0, 0, 0, 0} }; int option_index; while ((c = getopt_long(argc, argv, "dls:p:a:f:h", long_options, &option_index)) != -1) { switch (c) { case 'l': /* list all models */ plist = 1; break; case 's': /* symbol */ psymbol = optarg; break; case 'p': /* parameter (eg. a, b, c, mean, stddev) */ pparameter = optarg; break; case 'a': /* architecture (cpu, cuda) */ parch = optarg; break; case 'f': /* footprint */ pdisplay_specific_footprint = 1; res = sscanf(optarg, "%08x", &pspecific_footprint); STARPU_ASSERT(res==1); break; case 'd': /* directory */ pdirectory = 1; break; case 'h': usage(); exit(EXIT_SUCCESS); case 'v': fputs(PROGNAME " (" PACKAGE_NAME ") " PACKAGE_VERSION "\n", stderr); exit(EXIT_SUCCESS); case '?': default: fprintf(stderr, "Unrecognized option: -%c\n", optopt); } } if (!psymbol && !plist && !pdirectory) { fprintf(stderr, "Incorrect usage, aborting\n"); usage(); exit(-1); } } int main(int argc, char **argv) { #if defined(_WIN32) && !defined(__CYGWIN__) WSADATA wsadata; WSAStartup(MAKEWORD(1,0), &wsadata); #endif parse_args(argc, argv); starpu_perfmodel_initialize(); if (plist) { starpu_perfmodel_list(stdout); } else if (pdirectory) { starpu_perfmodel_directory(stdout); } else { struct starpu_perfmodel model = { .type = STARPU_PERFMODEL_INVALID }; int ret = starpu_perfmodel_load_symbol(psymbol, &model); if (ret == 1) { fprintf(stderr, "The performance model for the symbol <%s> could not be loaded\n", psymbol); return 1; } uint32_t *footprint = NULL; if (pdisplay_specific_footprint == 1) { footprint = &pspecific_footprint; } starpu_perfmodel_print_all(&model, parch, pparameter, footprint, stdout); starpu_perfmodel_unload_model(&model); } starpu_perfmodel_free_sampling_directories(); return 0; } starpu-1.2.3+dfsg/tools/starpu_perfmodel_plot.1000066400000000000000000000021451320135501600216030ustar00rootroot00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH STARPU_PERFMODEL_PLOT "1" "November 2017" "starpu_perfmodel_plot (StarPU) 1.2.3" "User Commands" .SH NAME starpu_perfmodel_plot \- manual page for starpu_perfmodel_plot (StarPU) 1.2.3 .SH SYNOPSIS .B starpu_perfmodel_plot [ \fIoptions \fR] .SH DESCRIPTION Draw a graph corresponding to the execution time of a given perfmodel .PP One must specify a symbol with the \fB\-s\fR option or use \fB\-l\fR or \fB\-d\fR Options: .TP \fB\-d\fR display the directory storing performance models .TP \fB\-l\fR display all available models .TP \fB\-s\fR specify the symbol .TP \fB\-f\fR draw GFlops instead of time .TP \fB\-i\fR input FxT files generated by StarPU .TP \fB\-lc\fR display all combinations of a given model .TP \fB\-c\fR specify the combination (use the option \fB\-lc\fR to list all combinations of a given model) .TP \fB\-h\fR, \fB\-\-help\fR display this help and exit .TP \fB\-v\fR, \fB\-\-version\fR output version information and exit .SH "REPORTING BUGS" Report bugs to . starpu-1.2.3+dfsg/tools/starpu_perfmodel_plot.c000066400000000000000000000366261320135501600217000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2014, 2017 Université de Bordeaux * Copyright (C) 2011, 2012, 2013, 2014, 2015, 2016, 2017 CNRS * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #ifdef STARPU_USE_FXT #include #endif #include #include #include // we need to browse the list associated to history-based models #if defined(_WIN32) && !defined(__CYGWIN__) #include #endif #define PROGNAME "starpu_perfmodel_plot" struct _perfmodel_plot_options { /* display all available models */ int list; /* display directory */ int directory; /* what kernel ? */ char *symbol; /* which combination */ int comb_is_set; int comb; /* display all available combinations of a specific model */ int list_combs; int gflops; /* Unless a FxT file is specified, we just display the model */ int with_fxt_file; char avg_file_name[256]; #ifdef STARPU_USE_FXT struct starpu_fxt_codelet_event *dumped_codelets; struct starpu_fxt_options fxt_options; char data_file_name[256]; #endif }; static void usage() { fprintf(stderr, "Draw a graph corresponding to the execution time of a given perfmodel\n"); fprintf(stderr, "Usage: %s [ options ]\n", PROGNAME); fprintf(stderr, "\n"); fprintf(stderr, "One must specify a symbol with the -s option or use -l or -d\n"); fprintf(stderr, "Options:\n"); fprintf(stderr, " -d display the directory storing performance models\n"); fprintf(stderr, " -l display all available models\n"); fprintf(stderr, " -s specify the symbol\n"); fprintf(stderr, " -f draw GFlops instead of time\n"); fprintf(stderr, " -i input FxT files generated by StarPU\n"); fprintf(stderr, " -lc display all combinations of a given model\n"); fprintf(stderr, " -c specify the combination (use the option -lc to list all combinations of a given model)\n"); fprintf(stderr, " -h, --help display this help and exit\n"); fprintf(stderr, " -v, --version output version information and exit\n\n"); fprintf(stderr, "Report bugs to <%s>.", PACKAGE_BUGREPORT); fprintf(stderr, "\n"); } static void parse_args(int argc, char **argv, struct _perfmodel_plot_options *options) { int correct_usage = 0; memset(options, 0, sizeof(struct _perfmodel_plot_options)); #ifdef STARPU_USE_FXT /* Default options */ starpu_fxt_options_init(&options->fxt_options); options->fxt_options.out_paje_path = NULL; options->fxt_options.activity_path = NULL; options->fxt_options.distrib_time_path = NULL; options->fxt_options.dag_path = NULL; options->fxt_options.dumped_codelets = &options->dumped_codelets; #endif /* We want to support arguments such as "-i trace_*" */ unsigned reading_input_filenames = 0; int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-s") == 0) { options->symbol = argv[++i]; correct_usage = 1; continue; } if (strcmp(argv[i], "-i") == 0) { reading_input_filenames = 1; #ifdef STARPU_USE_FXT options->fxt_options.filenames[options->fxt_options.ninputfiles++] = argv[++i]; options->with_fxt_file = 1; #else fprintf(stderr, "Warning: FxT support was not enabled in StarPU: FxT traces will thus be ignored!\n"); #endif continue; } if (strcmp(argv[i], "-l") == 0) { options->list = 1; correct_usage = 1; continue; } if (strcmp(argv[i], "-lc") == 0) { options->list_combs = 1; continue; } if (strcmp(argv[i], "-f") == 0) { options->gflops = 1; continue; } if (strcmp(argv[i], "-c") == 0) { options->comb_is_set = 1; options->comb = atoi(argv[++i]); continue; } if (strcmp(argv[i], "-d") == 0) { options->directory = 1; correct_usage = 1; continue; } if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) { usage(); exit(EXIT_SUCCESS); } if (strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "--version") == 0) { fputs(PROGNAME " (" PACKAGE_NAME ") " PACKAGE_VERSION "\n", stderr); exit(EXIT_SUCCESS); } /* If the reading_input_filenames flag is set, and that the * argument does not match an option, we assume this may be * another filename */ if (reading_input_filenames) { #ifdef STARPU_USE_FXT options->fxt_options.filenames[options->fxt_options.ninputfiles++] = argv[i]; #endif continue; } } if (correct_usage == 0) { fprintf(stderr, "Incorrect usage, aborting\n"); usage(); exit(-1); } } static char *replace_char(char *str, char old, char new) { char *p = strdup(str); char *ptr = p; while (*ptr) { if (*ptr == old) *ptr = new; ptr ++; } return p; } static void print_comma(FILE *gnuplot_file, int *first) { if (*first) { *first = 0; } else { fprintf(gnuplot_file, ",\\\n\t"); } } static void display_perf_model(FILE *gnuplot_file, struct starpu_perfmodel_arch* arch, struct starpu_perfmodel_per_arch *arch_model, int impl, int *first, struct _perfmodel_plot_options *options) { char arch_name[256]; starpu_perfmodel_get_arch_name(arch, arch_name, 256, impl); #ifdef STARPU_USE_FXT if (options->with_fxt_file && impl == 0) { if (options->gflops) { _STARPU_DISP("gflops unit selected, ignoring fxt trace\n"); } else { char *arch_name2 = replace_char(arch_name, '_', '-'); print_comma(gnuplot_file, first); fprintf(gnuplot_file, "\"< grep '^%s' %s\" using 3:4 title \"Profiling %s\"", arch_name, options->data_file_name, arch_name2); free(arch_name2); } } #endif /* Only display the regression model if we could actually build a model */ if (!options->gflops && arch_model->regression.valid && !arch_model->regression.nl_valid) { print_comma(gnuplot_file, first); fprintf(stderr, "\tLinear: y = alpha size ^ beta\n"); fprintf(stderr, "\t\talpha = %e\n", arch_model->regression.alpha * 0.001); fprintf(stderr, "\t\tbeta = %e\n", arch_model->regression.beta); fprintf(gnuplot_file, "0.001 * %f * x ** %f title \"Linear Regression %s\"", arch_model->regression.alpha, arch_model->regression.beta, arch_name); } if (!options->gflops && arch_model->regression.nl_valid) { print_comma(gnuplot_file, first); fprintf(stderr, "\tNon-Linear: y = a size ^b + c\n"); fprintf(stderr, "\t\ta = %e\n", arch_model->regression.a * 0.001); fprintf(stderr, "\t\tb = %e\n", arch_model->regression.b); fprintf(stderr, "\t\tc = %e\n", arch_model->regression.c * 0.001); fprintf(gnuplot_file, "0.001 * %f * x ** %f + 0.001 * %f title \"Non-Linear Regression %s\"", arch_model->regression.a, arch_model->regression.b, arch_model->regression.c, arch_name); } } static void display_history_based_perf_models(FILE *gnuplot_file, struct starpu_perfmodel *model, int *first, struct _perfmodel_plot_options *options) { FILE *datafile; struct starpu_perfmodel_history_list *ptr; char arch_name[32]; int col; unsigned long minimum = 0; datafile = fopen(options->avg_file_name, "w"); col = 2; int i; for(i = 0; i < model->state->ncombs; i++) { int comb = model->state->combs[i]; if (options->comb_is_set == 0 || options->comb == comb) { struct starpu_perfmodel_arch *arch; int impl; arch = starpu_perfmodel_arch_comb_fetch(comb); for(impl = 0; impl < model->state->nimpls[comb]; impl++) { struct starpu_perfmodel_per_arch *arch_model = &model->state->per_arch[comb][impl]; starpu_perfmodel_get_arch_name(arch, arch_name, 32, impl); if (arch_model->list) { char *arch_name2 = replace_char(arch_name, '_', '-'); print_comma(gnuplot_file, first); fprintf(gnuplot_file, "\"%s\" using 1:%d:%d with errorlines title \"Average %s\"", options->avg_file_name, col, col+1, arch_name2); col += 2; free(arch_name2); } } } } /* Dump entries in size order */ while (1) { unsigned long last = minimum; minimum = ULONG_MAX; /* Get the next minimum */ for(i = 0; i < model->state->ncombs; i++) { int comb = model->state->combs[i]; if (options->comb_is_set == 0 || options->comb == comb) { int impl; for(impl = 0; impl < model->state->nimpls[comb]; impl++) { struct starpu_perfmodel_per_arch *arch_model = &model->state->per_arch[comb][impl]; for (ptr = arch_model->list; ptr; ptr = ptr->next) { unsigned long size = ptr->entry->size; if (size > last && size < minimum) minimum = size; } } } } if (minimum == ULONG_MAX) break; fprintf(stderr, "%lu ", minimum); fprintf(datafile, "%-15lu ", minimum); for(i = 0; i < model->state->ncombs; i++) { int comb = model->state->combs[i]; if (options->comb_is_set == 0 || options->comb == comb) { int impl; for(impl = 0; impl < model->state->nimpls[comb]; impl++) { struct starpu_perfmodel_per_arch *arch_model = &model->state->per_arch[comb][impl]; for (ptr = arch_model->list; ptr; ptr = ptr->next) { struct starpu_perfmodel_history_entry *entry = ptr->entry; if (entry->size == minimum) { if (options->gflops) fprintf(datafile, "\t%-15le\t%-15le", entry->flops / (entry->mean * 1000), entry->flops / ((entry->mean + entry->deviation) * 1000) - entry->flops / (entry->mean * 1000) ); else fprintf(datafile, "\t%-15le\t%-15le", 0.001*entry->mean, 0.001*entry->deviation); break; } } if (!ptr && arch_model->list) /* No value for this arch. */ fprintf(datafile, "\t\"\"\t\"\""); } } } fprintf(datafile, "\n"); } fprintf(stderr, "\n"); fclose(datafile); } static void display_all_perf_models(FILE *gnuplot_file, struct starpu_perfmodel *model, int *first, struct _perfmodel_plot_options *options) { int i; for(i = 0; i < model->state->ncombs; i++) { int comb = model->state->combs[i]; if (options->comb_is_set == 0 || options->comb == comb) { struct starpu_perfmodel_arch *arch; int impl; arch = starpu_perfmodel_arch_comb_fetch(comb); for(impl = 0; impl < model->state->nimpls[comb]; impl++) { struct starpu_perfmodel_per_arch *archmodel = &model->state->per_arch[comb][impl]; display_perf_model(gnuplot_file, arch, archmodel, impl, first, options); } } } } #ifdef STARPU_USE_FXT static void dump_data_file(FILE *data_file, struct _perfmodel_plot_options *options) { int i; for (i = 0; i < options->fxt_options.dumped_codelets_count; i++) { /* Dump only if the codelet symbol matches user's request (with or without the machine name) */ char *tmp = strdup(options->symbol); char *dot = strchr(tmp, '.'); if (dot) tmp[strlen(tmp)-strlen(dot)] = '\0'; if ((strncmp(options->dumped_codelets[i].symbol, options->symbol, (FXT_MAX_PARAMS - 4)*sizeof(unsigned long)-1) == 0) || (strncmp(options->dumped_codelets[i].symbol, tmp, (FXT_MAX_PARAMS - 4)*sizeof(unsigned long)-1) == 0)) { char *archname = options->dumped_codelets[i].perfmodel_archname; size_t size = options->dumped_codelets[i].size; float time = options->dumped_codelets[i].time; fprintf(data_file, "%s %f %f\n", archname, (float)size, time); } free(tmp); } } #endif static void display_selected_models(FILE *gnuplot_file, struct starpu_perfmodel *model, struct _perfmodel_plot_options *options) { char *symbol = replace_char(options->symbol, '_', '-'); fprintf(gnuplot_file, "#!/usr/bin/gnuplot -persist\n"); fprintf(gnuplot_file, "\n"); fprintf(gnuplot_file, "set term postscript eps enhanced color\n"); fprintf(gnuplot_file, "set output \"starpu_%s.eps\"\n", options->symbol); fprintf(gnuplot_file, "set title \"Model for codelet %s\"\n", symbol); fprintf(gnuplot_file, "set xlabel \"Total data size\"\n"); if (options->gflops) fprintf(gnuplot_file, "set ylabel \"GFlops\"\n"); else fprintf(gnuplot_file, "set ylabel \"Time (ms)\"\n"); fprintf(gnuplot_file, "\n"); fprintf(gnuplot_file, "set key top left\n"); fprintf(gnuplot_file, "set logscale x\n"); fprintf(gnuplot_file, "set logscale y\n"); fprintf(gnuplot_file, "\n"); /* If no input data is given to gnuplot, we at least need to specify an * arbitrary range. */ if (options->with_fxt_file == 0 || options->gflops) fprintf(gnuplot_file, "set xrange [1:10**9]\n\n"); int first = 1; fprintf(gnuplot_file, "plot\t"); /* display all or selected combinations */ display_all_perf_models(gnuplot_file, model, &first, options); display_history_based_perf_models(gnuplot_file, model, &first, options); free(symbol); } int main(int argc, char **argv) { int ret = 0; struct starpu_perfmodel model = { .type = STARPU_PERFMODEL_INVALID }; char gnuplot_file_name[256]; struct _perfmodel_plot_options options; #if defined(_WIN32) && !defined(__CYGWIN__) WSADATA wsadata; WSAStartup(MAKEWORD(1,0), &wsadata); #endif parse_args(argc, argv, &options); starpu_perfmodel_initialize(); if (options.directory) { starpu_perfmodel_directory(stdout); } else if (options.list) { ret = starpu_perfmodel_list(stdout); if (ret) { _STARPU_DISP("The performance model directory is invalid\n"); } } else { /* Load the performance model associated to the symbol */ ret = starpu_perfmodel_load_symbol(options.symbol, &model); if (ret) { _STARPU_DISP("The performance model for the symbol <%s> could not be loaded\n", options.symbol); } else if (options.list_combs) { ret = starpu_perfmodel_list_combs(stdout, &model); if (ret) { fprintf(stderr, "Error when listing combinations for model <%s>\n", options.symbol); } } else { /* If some FxT input was specified, we put the points on the graph */ #ifdef STARPU_USE_FXT if (options.with_fxt_file) { starpu_fxt_generate_trace(&options.fxt_options); snprintf(options.data_file_name, 256, "starpu_%s.data", options.symbol); FILE *data_file = fopen(options.data_file_name, "w+"); STARPU_ASSERT(data_file); dump_data_file(data_file, &options); fclose(data_file); } #endif snprintf(gnuplot_file_name, 256, "starpu_%s.gp", options.symbol); snprintf(options.avg_file_name, 256, "starpu_%s_avg.data", options.symbol); FILE *gnuplot_file = fopen(gnuplot_file_name, "w+"); STARPU_ASSERT(gnuplot_file); display_selected_models(gnuplot_file, &model, &options); fprintf(gnuplot_file,"\n"); fclose(gnuplot_file); /* Retrieve the current mode of the gnuplot executable */ struct stat sb; ret = stat(gnuplot_file_name, &sb); if (ret) { perror("stat"); STARPU_ABORT(); } /* Make the gnuplot scrit executable for the owner */ ret = chmod(gnuplot_file_name, sb.st_mode|S_IXUSR); if (ret) { perror("chmod"); STARPU_ABORT(); } _STARPU_DISP("Gnuplot file <%s> generated\n", gnuplot_file_name); } } starpu_perfmodel_free_sampling_directories(); return ret; } starpu-1.2.3+dfsg/tools/starpu_sched_display.c000066400000000000000000000017321320135501600214660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include int main(void) { struct starpu_sched_policy **policies; struct starpu_sched_policy **policy; policies = starpu_sched_get_predefined_policies(); for(policy=policies ; *policy!=NULL ; policy++) printf("%s\n", (*policy)->policy_name); return EXIT_SUCCESS; } starpu-1.2.3+dfsg/tools/starpu_smpi.xslt000066400000000000000000000044171320135501600203760ustar00rootroot00000000000000 - - - - - starpu-1.2.3+dfsg/tools/starpu_smpirun000077500000000000000000000065051320135501600201350ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014-2016 Université Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # Script for running starpu-mpi application in simgrid mode prefix=/mnt/scratch/buildbot/starpu//conan-tags-starpu-1_2_3-tarball-release/install SMPIRUN= STARPU_DATADIR=${prefix}/share STARPU_XSLTDIR=$STARPU_DATADIR/starpu SOURCE_DATADIR=/mnt/scratch/buildbot/starpu/conan-tags-starpu-1_2_3-tarball-release/build/tools BUILDDIR=/mnt/scratch/buildbot/starpu/conan-tags-starpu-1_2_3-tarball-release/build/tools SMPI_VERSION=$($SMPIRUN -version | grep " version " | sed -e 's/.* \([0-9]*\.[0-9]*\).*/\1/') SMPI_MAJOR=${SMPI_VERSION%.*} SMPI_MINOR=${SMPI_VERSION#*.} if [ "$SMPI_MAJOR" -ge 4 -o \( "$SMPI_MAJOR" = 3 -a "$SMPI_MINOR" -ge 13 \) ] then DTD=http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd V=4 VF=.v4 DASH=- else DTD=http://simgrid.gforge.inria.fr/simgrid.dtd V=3 VF="" DASH=_ fi # When executed from source, take xslt from source [ "$0" -ef $BUILDDIR/starpu_smpirun ] && STARPU_XSLTDIR=$SOURCE_DATADIR MPI_PLATFORM="" MPI_HOSTFILE="" NP="" while true; do case "$1" in "-platform") MPI_PLATFORM=$2 if [ ! -r "$MPI_PLATFORM" ]; then echo "$MPI_PLATFORM can't be read" exit 1 fi shift 2 ;; "-hostfile") MPI_HOSTFILE=$2 if [ ! -r "$MPI_HOSTFILE" ]; then echo "$MPI_HOSTFILE can't be read" exit 1 fi shift 2 ;; "-np") NP=$2 shift 2 ;; *) break ;; esac done if [ -z "$MPI_PLATFORM" ] || [ -z "$MPI_HOSTFILE" ]; then echo "$0 -platform PLATFORM -hostfile HOSTFILE [ -np N ] [ ... ] program [ args ]" exit 2 fi PLATFORM=$(mktemp /tmp/StarPU-MPI-platform-XXXXXXXX.xml) [ -n "$STARPU_HOME" ] || STARPU_HOME=$HOME [ -n "$STARPU_PERF_MODEL_DIR" ] || STARPU_PERF_MODEL_DIR=$STARPU_HOME/.starpu/sampling [ -n "$STARPU_HOSTNAME" ] || STARPU_HOSTNAME=$(hostname) NODE_PLATFORM=$STARPU_PERF_MODEL_DIR/bus/${STARPU_HOSTNAME}.platform$VF.xml [ -n "$NP" ] || NP=$(grep -v "^$" $MPI_HOSTFILE | wc -l) if ! type xsltproc > /dev/null 2> /dev/null then echo xsltproc is needed for starpu simgrid mpi. exit 1 fi ( cat << EOF EOF tail -n +3 $MPI_PLATFORM | grep -v ' EOF ) > $PLATFORM STACKSIZE=$(ulimit -s) [ "$STACKSIZE" != unlimited ] || STACKSIZE=8192 $SMPIRUN -platform $PLATFORM -hostfile $MPI_HOSTFILE -np $NP "$@" --cfg=smpi/privatize${DASH}global${DASH}variables:yes --cfg=smpi/simulate${DASH}computation:no --cfg=contexts/stack${DASH}size:$STACKSIZE RET=$? rm -f $PLATFORM exit $RET starpu-1.2.3+dfsg/tools/starpu_smpirun.in000066400000000000000000000062061320135501600205350ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014-2016 Université Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # Script for running starpu-mpi application in simgrid mode prefix=@prefix@ SMPIRUN=@smpirun_path@ STARPU_DATADIR=@datarootdir@ STARPU_XSLTDIR=$STARPU_DATADIR/starpu SOURCE_DATADIR=@abs_srcdir@ BUILDDIR=@abs_builddir@ SMPI_VERSION=$($SMPIRUN -version | grep " version " | sed -e 's/.* \([0-9]*\.[0-9]*\).*/\1/') SMPI_MAJOR=${SMPI_VERSION%.*} SMPI_MINOR=${SMPI_VERSION#*.} if [ "$SMPI_MAJOR" -ge 4 -o \( "$SMPI_MAJOR" = 3 -a "$SMPI_MINOR" -ge 13 \) ] then DTD=http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd V=4 VF=.v4 DASH=- else DTD=http://simgrid.gforge.inria.fr/simgrid.dtd V=3 VF="" DASH=_ fi # When executed from source, take xslt from source [ "$0" -ef $BUILDDIR/starpu_smpirun ] && STARPU_XSLTDIR=$SOURCE_DATADIR MPI_PLATFORM="" MPI_HOSTFILE="" NP="" while true; do case "$1" in "-platform") MPI_PLATFORM=$2 if [ ! -r "$MPI_PLATFORM" ]; then echo "$MPI_PLATFORM can't be read" exit 1 fi shift 2 ;; "-hostfile") MPI_HOSTFILE=$2 if [ ! -r "$MPI_HOSTFILE" ]; then echo "$MPI_HOSTFILE can't be read" exit 1 fi shift 2 ;; "-np") NP=$2 shift 2 ;; *) break ;; esac done if [ -z "$MPI_PLATFORM" ] || [ -z "$MPI_HOSTFILE" ]; then echo "$0 -platform PLATFORM -hostfile HOSTFILE [ -np N ] [ ... ] program [ args ]" exit 2 fi PLATFORM=$(mktemp /tmp/StarPU-MPI-platform-XXXXXXXX.xml) [ -n "$STARPU_HOME" ] || STARPU_HOME=$HOME [ -n "$STARPU_PERF_MODEL_DIR" ] || STARPU_PERF_MODEL_DIR=$STARPU_HOME/.starpu/sampling [ -n "$STARPU_HOSTNAME" ] || STARPU_HOSTNAME=$(hostname) NODE_PLATFORM=$STARPU_PERF_MODEL_DIR/bus/${STARPU_HOSTNAME}.platform$VF.xml [ -n "$NP" ] || NP=$(grep -v "^$" $MPI_HOSTFILE | wc -l) if ! type xsltproc > /dev/null 2> /dev/null then echo xsltproc is needed for starpu simgrid mpi. exit 1 fi ( cat << EOF EOF tail -n +3 $MPI_PLATFORM | grep -v ' EOF ) > $PLATFORM STACKSIZE=$(ulimit -s) [ "$STACKSIZE" != unlimited ] || STACKSIZE=8192 $SMPIRUN -platform $PLATFORM -hostfile $MPI_HOSTFILE -np $NP "$@" --cfg=smpi/privatize${DASH}global${DASH}variables:yes --cfg=smpi/simulate${DASH}computation:no --cfg=contexts/stack${DASH}size:$STACKSIZE RET=$? rm -f $PLATFORM exit $RET starpu-1.2.3+dfsg/tools/starpu_tasks_rec_complete.1000066400000000000000000000011501320135501600224310ustar00rootroot00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH COULDN'T "1" "November 2017" "couldn't open --version for read: No such file or directory" "User Commands" .SH NAME couldn't \- manual page for couldn't open --version for read: No such file or directory .SH SYNOPSIS .B starpu_tasks_rec_complete [\fIinput-file \fR[\fIoutput-file\fR]] .SH DESCRIPTION Complete a tasks.rec file with additional information, notably estimated termination times. .PP If input or output file names are not given, stdin and stdout are used. .SH "REPORTING BUGS" Report bugs to . starpu-1.2.3+dfsg/tools/starpu_tasks_rec_complete.c000066400000000000000000000110631320135501600225170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2014, 2016 Universite de Bordeaux * Copyright (C) 2012-2015, 2017 CNRS * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #define PROGNAME "starpu_tasks_rec_complete" /* * This program takes a tasks.rec file, and emits a tasks.rec file with * additional information, notably estimated termination times. */ static struct model { UT_hash_handle hh; char *name; struct starpu_perfmodel model; } *models; int main(int argc, char *argv[]) { FILE *input; FILE *output; char s[1024], *c; uint32_t footprint = 0; int already_there = 0; char *model_name = NULL; struct model *model, *tmp; int ret; if (argc >= 2) { if (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) { fprintf(stderr, "Complete a tasks.rec file with additional information, notably estimated termination times.\n"); fprintf(stderr, "\n"); fprintf(stderr, "Usage: %s [input-file [output-file]]\n", PROGNAME); fprintf(stderr, "\n"); fprintf(stderr, "If input or output file names are not given, stdin and stdout are used."); fprintf(stderr, "\n"); fprintf(stderr, "Report bugs to <%s>.\n", PACKAGE_BUGREPORT); exit(EXIT_SUCCESS); } } #ifdef STARPU_HAVE_SETENV setenv("STARPU_FXT_TRACE", "0", 1); #endif if (starpu_init(NULL) != 0) { fprintf(stderr, "StarPU initialization failure\n"); exit(EXIT_FAILURE); } starpu_pause(); if (argc >= 2) { input = fopen(argv[1], "r"); if (!input) { fprintf(stderr, "couldn't open %s for read: %s\n", argv[1], strerror(errno)); exit(EXIT_FAILURE); } } else input = stdin; if (argc >= 3) { output = fopen(argv[2], "w+"); if (!output) { fprintf(stderr, "couldn't open %s for write: %s\n", argv[1], strerror(errno)); exit(EXIT_FAILURE); } } else output = stdout; while (fgets(s, sizeof(s), input)) { if (strlen(s) == sizeof(s) - 1) { fprintf(stderr, "oops, very long line '%s', it's odd\n", s); exit(EXIT_FAILURE); } if (s[0] == '\n') { /* empty line, end of task */ if (model_name) { if (already_there) { free(model_name); } else { /* Try to get already-loaded model */ HASH_FIND_STR(models, model_name, model); if (model == NULL) { _STARPU_MALLOC(model, sizeof(*model)); model->name = model_name; memset(&model->model, 0, sizeof(model->model)); model->model.type = STARPU_PERFMODEL_INVALID; ret = starpu_perfmodel_load_symbol(model_name, &model->model); if (ret == 1) { fprintf(stderr, "The performance model for the symbol <%s> could not be loaded\n", model_name); exit(EXIT_FAILURE); } HASH_ADD_STR(models, name, model); } else free(model_name); fprintf(output, "EstimatedTime: "); starpu_perfmodel_print_estimations(&model->model, footprint, output); fprintf(output, "\n"); } model_name = NULL; } already_there = 0; fprintf(output, "\n"); continue; } /* Get rec field name */ c = strchr(s, ':'); if (!c) { fprintf(stderr, "odd line '%s'\n", s); exit(EXIT_FAILURE); } #define STRHEADCMP(s, head) strncmp(s, head, strlen(head)) if (!STRHEADCMP(s, "Footprint: ")) { footprint = strtoul(s + strlen("Footprint: "), NULL, 16); } else if (!STRHEADCMP(s, "Model: ")) { model_name = strdup(s + strlen("Model: ")); model_name[strlen(model_name) - 1] = '\0'; /* Drop '\n' */ } else if (!STRHEADCMP(s, "EstimatedTime: ")) { already_there = 1; } fprintf(output, "%s", s); } if (fclose(input)) { fprintf(stderr, "couldn't close input: %s\n", strerror(errno)); exit(EXIT_FAILURE); } if (fclose(output)) { fprintf(stderr, "couldn't close output: %s\n", strerror(errno)); exit(EXIT_FAILURE); } starpu_resume(); starpu_shutdown(); HASH_ITER(hh, models, model, tmp) { free(model->name); HASH_DEL(models, model); } return 0; } starpu-1.2.3+dfsg/tools/starpu_temanejo2.sh000077500000000000000000000021271320135501600207310ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016 Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # d=${AYUDAME2_INSTALL_DIR?} cmd=${1?"usage: $0 [args*]"} shift if test ! -r ayudame.cfg; then echo "warning: no 'ayudame.cfg' file found in current working directory, an example is available in /share/starpu/ayudame.cfg" fi PATH=$d/bin:$PATH LD_LIBRARY_PATH=$d/lib:$LD_LIBRARY_PATH PYTHONPATH=$d/lib/python2.7/site-packages:$PYTHONPATH export PATH LD_LIBRARY_PATH PYTHONPATH $d/bin/Temanejo2 -p 8888 -d 8889 -P $d/lib/libayudame.so -L $d/lib -A $cmd "$@" starpu-1.2.3+dfsg/tools/starpu_workers_activity000077500000000000000000000120711320135501600220430ustar00rootroot00000000000000#!/bin/sh # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010, 2012 Université de Bordeaux # Copyright (C) 2010, 2011, 2012 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. PROGNAME=$0 usage() { echo "Offline tool to display the activity of the workers during the execution." echo "" echo " The starpu_fxt_tool utility now generates a file named 'activity.data' which" echo " can be processed by this script to generate a plot named activity.eps" echo "" echo " Typical usage:" echo " ./starpu_fxt_tool -i /tmp/prof_file_foo" echo " $PROGNAME activity.data" echo "" echo "Options:" echo " -h, --help display this help and exit" echo " -v, --version output version information and exit" echo "" echo "Report bugs to " exit 0 } if [ "$1" = "-v" ] || [ "$1" = "--version" ] ; then echo "$PROGNAME (StarPU) 1.2.3" exit 0 fi if [ "$1" = "-h" ] || [ "$1" = "--help" ] || [ "$1" = "" ] ; then usage fi if [ ! -f $1 ] ; then echo "Error. File <$1> not found" echo "" usage fi # The input file must be generated by the starpu_fxt_tool command inputfile_with_counters=$1 # We extract the counters out of the input file inputfile=.$inputfile_with_counters.activity inputfile_cnt_ready=.$1.cnt_ready inputfile_cnt_submitted=.$1.cnt_submitted set_profiling_list=.$1.set_profiling_list names=.$1.names grep "^set_profiling" $inputfile_with_counters > $set_profiling_list grep "0$" $set_profiling_list | cut -f 2 | sort -n > $set_profiling_list.disable grep "1$" $set_profiling_list | cut -f 2 | sort -n > $set_profiling_list.enable grep "^name" $inputfile_with_counters > $names grep -v "^cnt" $inputfile_with_counters | grep -v "^set_profiling" | grep -v "^name" > $inputfile grep "^cnt_ready" $inputfile_with_counters > $inputfile_cnt_ready grep "^cnt_submitted" $inputfile_with_counters > $inputfile_cnt_submitted # Count the number of workers in the trace workers=`cut -f1 $inputfile | sort -n | uniq` nworkers=`cut -f1 $inputfile | sort -n | uniq|wc -l` # size of the entire graph width=1.5 heigth=0.40 total_heigth=$(echo "$heigth + ($heigth * $nworkers)"|bc -l) # In case 3 arguments are provided, the 2nd (resp. 3rd) indicates the start # (resp. the end) of the interval to be displayed. if [ $# -ge 3 ]; then starttime=$2 endtime=$3 else #if profiling is explicitely enabled (resp. disabled) at some point, we set the # default start (rest. end) point when we enable (resp. disable) profiling for # the first time. profiling_enable_cnt=`wc -l $set_profiling_list.enable|sed -e "s/\(.*\) .*/\1/"` if [ $profiling_enable_cnt -ge 1 ]; then starttime=`head -1 $set_profiling_list.enable` else starttime=$(cut -f 2 $inputfile |sort -n|head -1) fi # TODO test if last disable > first enable profiling_disable_cnt=$(wc -l $set_profiling_list.disable|sed -e "s/\(.*\) .*/\1/") if [ $profiling_disable_cnt -ge 1 ]; then endtime=`tail -1 $set_profiling_list.disable` else endtime=$(cut -f 2 $inputfile |sort -n|tail -1) fi # The values in the file are in ms, we display seconds starttime=$(echo "$starttime * 0.001 "| bc -l) endtime=$(echo "$endtime * 0.001 "| bc -l) fi echo "START $starttime END $endtime" # Gnuplot header cat > gnuplotcmd << EOF set term postscript eps enhanced color set output "activity.eps" set xrange [$starttime:$endtime] set size $width,$total_heigth set multiplot; set origin 0.0,0.0; set size $width,$heigth; set logscale y plot "$inputfile_cnt_submitted" using (\$2/1000):3 with filledcurves lt rgb "#999999" title "submitted",\ "$inputfile_cnt_ready" using (\$2/1000):3 with filledcurves lt rgb "#000000" title "ready" set nologscale y EOF cnt=0 for worker in $workers do grep "^$worker\s" $inputfile > .tmp.$worker starty=$(echo "$heigth + ($heigth * $cnt)"|bc -l) cat >> gnuplotcmd << EOF set origin 0.0,$starty; set size $width,$heigth; set key off set yrange [0:100] set ylabel "$(cut -f2- $names |grep "^$worker$" | cut -f2)" plot ".tmp.$worker" using (\$2/1000):(100) with filledcurves y1=0.0 lt rgb "#000000" notitle,\ ".tmp.$worker" using (\$2/1000):((100*(\$4+\$5))/\$3) with filledcurves y1=0.0 lt rgb "#ff0000" notitle,\ ".tmp.$worker" using (\$2/1000):((100*\$4)/\$3) with filledcurves y1=0.0 lt rgb "#00ff00" notitle EOF cnt=$(($cnt+1)) done cat >> gnuplotcmd << EOF unset multiplot EOF gnuplot < gnuplotcmd rm gnuplotcmd rm $inputfile rm $inputfile_cnt_ready rm $inputfile_cnt_submitted rm $set_profiling_list rm $set_profiling_list.enable rm $set_profiling_list.disable #rm $names for worker in $workers do rm .tmp.$worker done starpu-1.2.3+dfsg/tools/starpu_workers_activity.1000066400000000000000000000014771320135501600222070ustar00rootroot00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH STARPU_WORKERS_ACTIVITY "1" "November 2017" "starpu_workers_activity (StarPU) 1.2.3" "User Commands" .SH NAME starpu_workers_activity \- manual page for starpu_workers_activity (StarPU) 1.2.3 .SH DESCRIPTION Offline tool to display the activity of the workers during the execution. .IP The starpu_fxt_tool utility now generates a file named 'activity.data' which can be processed by this script to generate a plot named activity.eps .IP Typical usage: .IP \&./starpu_fxt_tool \fB\-i\fR /tmp/prof_file_foo \&./starpu_workers_activity activity.data .SH OPTIONS .TP \fB\-h\fR, \fB\-\-help\fR display this help and exit .TP \fB\-v\fR, \fB\-\-version\fR output version information and exit .SH "REPORTING BUGS" Report bugs to starpu-1.2.3+dfsg/tools/starpu_workers_activity.in000077500000000000000000000120761320135501600224550ustar00rootroot00000000000000#!/bin/sh # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010, 2012 Université de Bordeaux # Copyright (C) 2010, 2011, 2012 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. PROGNAME=$0 usage() { echo "Offline tool to display the activity of the workers during the execution." echo "" echo " The starpu_fxt_tool utility now generates a file named 'activity.data' which" echo " can be processed by this script to generate a plot named activity.eps" echo "" echo " Typical usage:" echo " ./starpu_fxt_tool -i /tmp/prof_file_foo" echo " $PROGNAME activity.data" echo "" echo "Options:" echo " -h, --help display this help and exit" echo " -v, --version output version information and exit" echo "" echo "Report bugs to <@PACKAGE_BUGREPORT@>" exit 0 } if [ "$1" = "-v" ] || [ "$1" = "--version" ] ; then echo "$PROGNAME (@PACKAGE_NAME@) @PACKAGE_VERSION@" exit 0 fi if [ "$1" = "-h" ] || [ "$1" = "--help" ] || [ "$1" = "" ] ; then usage fi if [ ! -f $1 ] ; then echo "Error. File <$1> not found" echo "" usage fi # The input file must be generated by the starpu_fxt_tool command inputfile_with_counters=$1 # We extract the counters out of the input file inputfile=.$inputfile_with_counters.activity inputfile_cnt_ready=.$1.cnt_ready inputfile_cnt_submitted=.$1.cnt_submitted set_profiling_list=.$1.set_profiling_list names=.$1.names grep "^set_profiling" $inputfile_with_counters > $set_profiling_list grep "0$" $set_profiling_list | cut -f 2 | sort -n > $set_profiling_list.disable grep "1$" $set_profiling_list | cut -f 2 | sort -n > $set_profiling_list.enable grep "^name" $inputfile_with_counters > $names grep -v "^cnt" $inputfile_with_counters | grep -v "^set_profiling" | grep -v "^name" > $inputfile grep "^cnt_ready" $inputfile_with_counters > $inputfile_cnt_ready grep "^cnt_submitted" $inputfile_with_counters > $inputfile_cnt_submitted # Count the number of workers in the trace workers=`cut -f1 $inputfile | sort -n | uniq` nworkers=`cut -f1 $inputfile | sort -n | uniq|wc -l` # size of the entire graph width=1.5 heigth=0.40 total_heigth=$(echo "$heigth + ($heigth * $nworkers)"|bc -l) # In case 3 arguments are provided, the 2nd (resp. 3rd) indicates the start # (resp. the end) of the interval to be displayed. if [ $# -ge 3 ]; then starttime=$2 endtime=$3 else #if profiling is explicitely enabled (resp. disabled) at some point, we set the # default start (rest. end) point when we enable (resp. disable) profiling for # the first time. profiling_enable_cnt=`wc -l $set_profiling_list.enable|sed -e "s/\(.*\) .*/\1/"` if [ $profiling_enable_cnt -ge 1 ]; then starttime=`head -1 $set_profiling_list.enable` else starttime=$(cut -f 2 $inputfile |sort -n|head -1) fi # TODO test if last disable > first enable profiling_disable_cnt=$(wc -l $set_profiling_list.disable|sed -e "s/\(.*\) .*/\1/") if [ $profiling_disable_cnt -ge 1 ]; then endtime=`tail -1 $set_profiling_list.disable` else endtime=$(cut -f 2 $inputfile |sort -n|tail -1) fi # The values in the file are in ms, we display seconds starttime=$(echo "$starttime * 0.001 "| bc -l) endtime=$(echo "$endtime * 0.001 "| bc -l) fi echo "START $starttime END $endtime" # Gnuplot header cat > gnuplotcmd << EOF set term postscript eps enhanced color set output "activity.eps" set xrange [$starttime:$endtime] set size $width,$total_heigth set multiplot; set origin 0.0,0.0; set size $width,$heigth; set logscale y plot "$inputfile_cnt_submitted" using (\$2/1000):3 with filledcurves lt rgb "#999999" title "submitted",\ "$inputfile_cnt_ready" using (\$2/1000):3 with filledcurves lt rgb "#000000" title "ready" set nologscale y EOF cnt=0 for worker in $workers do grep "^$worker\s" $inputfile > .tmp.$worker starty=$(echo "$heigth + ($heigth * $cnt)"|bc -l) cat >> gnuplotcmd << EOF set origin 0.0,$starty; set size $width,$heigth; set key off set yrange [0:100] set ylabel "$(cut -f2- $names |grep "^$worker$" | cut -f2)" plot ".tmp.$worker" using (\$2/1000):(100) with filledcurves y1=0.0 lt rgb "#000000" notitle,\ ".tmp.$worker" using (\$2/1000):((100*(\$4+\$5))/\$3) with filledcurves y1=0.0 lt rgb "#ff0000" notitle,\ ".tmp.$worker" using (\$2/1000):((100*\$4)/\$3) with filledcurves y1=0.0 lt rgb "#00ff00" notitle EOF cnt=$(($cnt+1)) done cat >> gnuplotcmd << EOF unset multiplot EOF gnuplot < gnuplotcmd rm gnuplotcmd rm $inputfile rm $inputfile_cnt_ready rm $inputfile_cnt_submitted rm $set_profiling_list rm $set_profiling_list.enable rm $set_profiling_list.disable #rm $names for worker in $workers do rm .tmp.$worker done

    ),5O jzccI֝&|鮟Ǩ^>M=gn48Fk?  _6ض}Mg d0-2VuޤgsH?sHfqB9t\SgęZ%Q2cG[/6n5w?OzGh޿Rx1;?x&~BwcٽnGi`H$K^d|ܙ~PnZMr}u06FF)A%nۓ1Zlܷcd-뼖*yU}#zƛE-2Jx:E0EJf|Hs]'?73raS[idUΙT'$ei֌ӧw*elz(W~dF[=U'5w|޻ݻwo%ԜQ_݄O=_}ޯGuSKL f2261*:L*=M5> ~b{/uVI ~xؐkf[Y֩1Hȣd5}d.szƞ {zLt;9,EozEծpZ#tw 6ч_)4Iݞ3@"SV\r%=%lGAQ󃱈()jݗ8ܗc*X\ -NNFsyOr|?SYTCgFMaۜAh+zB58Eq\RILDɦ1b-~>݈<~Y3nS3pqYz50Yo8q…υݤzN-o+pJS[v}yv|EZҕA]HI/GKyhhB9Kھ:xAcZL؄CNVR}N7')ssz|OoH"9}||G3>>q`C^/bTJn]~ ?_}OKv&k(xsܷ+?B2XJYߞ)1hw^+r@XF%K/Mkl߬,h|9l뺒yo|ZQE-VȒY7>d}O%6D1^tjŲ|bE7G?xȬ$[͙϶gڞ);eue'tW/4>N~Rg6"u;?N񩯵#Y^aDKv^x+dq=oW.?J? xydtRY oa0:jE憭ۣ&lUWpV'Ѧӹo2 6Mzq,6X[lv2ʿO{yeVUodUjQg۾,S >ePs{ݞ~:r7Qs9 ^QFsv0yՃi* {Nn]z:ד.\ǩ+n.d;߽~qoɞݤoe3?Uvj }ϧ[s$\ڗ 5{rU$8ܮ5 4佦9&uW}Wï,(źNS ZC%cs 1vM1JrS}rm-Pp}"d!r맽fj;} = Dвޝ3_?[Ӟ;KSZfZX8sq%c[˺;r.!Hd[6)W{`L}h&p1#RGη&t]{W*Ffuf:?vɲ[G_n}E*˴ŜC k ޤw v`*_Q L[zdثhK ݤZvTQIsDj^m.8ezޟe*W9<u#(3dZ4Ƶs`ڣNP{DVl 7a>|aoF49g}41Ғ=ιz=v~WTF%ON my7uu+"{n}Gɪd'^=M؉-7A֚;IJh&ixdM߲Yw:UV:dtV K oDՊ{2;2늨 L Ʒm;V2%f4N$9lro R ^kejAYT Ⱥx%Ҏ( ad_8xxըV;vNe\MLrLzWھw'LD,ڇOXDsP>E Nr<&քVdddMg41ګU;]7%3z&-;jn{Ax'c3rDKLP%c>xFNl($D; R)z,̦ѲJvc+YM[ͤ8èfk4oE;5v7(d7vQOU 2?qrkmljhͰoKF:'XyXKx5odʬ#JڵiRKjK#9"E*I&xЃEkh8lYL#bO :3A<7e[z2b&':S[L`3xw~^@ed_= ֭wNM؇mlӇ3s}AN͒kej~'eLk5 7b-3?:SCYݧR $~G^gK~L;qv$S^frJުr{D?\&c#?}rL=n5Pfɕ;,I9\~i?y&FXw<ۚs>" 3j-ӮOtLmz祳y1f{¼NQևM+J#|;#g ƣv>%ㇼJ׽޿`{hWE5:~Oȩ3Oxw0&ܛRC(?^7Ѷ#kl8y0u bLpF,MW٣cEQלvjz.! +QVڊgDg?NLZ+rη =ל|r^^x"k_3A>lhr:}Ѩo^6565.ɖUFeԄS5LVwJ.h+ow鍼2dsCҎ٣+jNv k'ބ'h51TN!lW5z–IAz5uez}*o8d47B%hkgjҝ?[ɺα*“=A{/gFEs`wnz)q]o̽?̤{n<||XQMhC_j_#?(FU~5EW/x&^,e9Nmu<`8iya~#v9[Ykn_ϯNJX&֫E c=s\4t܇&e3wܒuײv3$S}R|^yڍG%SүQstGjB#Fuƣk|MIfj3dkoɓ#@E(S#izV̈t8L ~g#F6_U2$jqV#`j/<~‡yW)-%j;fL!>{gzW5ה%C7M}w9Oe}Ojժ[#AD{ʨZɪ1cd뗒ߠQGnEbD\Iu}mHKf:w V>ܶ ỷQe>ÆZlYAvwv&WDuLK'v^$O)T)ʁ Hm[@ V4947jMx(u90SDG㗼̖UN}tGNI>dވi&mhYkg/Kn3ȾL`46:vEO E{X;hX «Q`Zo/#vsi%K3YV5k(ɜ J=)D?TQfvo깟%_μ^2c “UK{L[H?He[~xR[lzd=Al Aذ^+Y=V_wM|iZc_{~j{G K_έsؖ<\%铬d9;+oɌn-o$kGѶKVԞkJ6Y~Q85>̝eXD=^Axԇ,{ҽ2m;-['w'ާɈVh=#HZ. ښ]M\+uA*#gGm\q*:Ǻ_[1pa_ask$ݒY%x n#k,w+R3>16ٓ 1f|FOcJFǞ&A|GsW9s(W>k௚KK%X2%TD_ Wm6̨9gd_%;/9 ҵkg/[F149n&SQ*;`0==,\3z?1׈ N%d}=ίu&Qπ6oF:_:D̹~hZ~rv^9~/^'JIVU;*gbi_rėv-H1bV_{^79;Bd }dw۪3ͽrAz+fPk\+̬>sgD}ǂz_ MAX=dNcj~M"nE>99^}A<L1lifKF#g a:zqA: _c&l?-TgOݴjɯ?(Ǭ g1Sb,Vm5 B(3zOnjwJ';QKvѢKg RFfmFݫZw>杵Gr=4Qkp.8#ے# @v0Qd<&ʣ}H! k^08rnd2j!ChB탰b~J'z[>ǽC[b0պ?@E3k0_Ѣrkw=v_?voݝvW+IQvk6ʜA_V %YD{j&l3КsLƈνVs.~e/qʚym^J%x%zY܌ ['hA:%zBǘ5&|WU8MVkU6OٳlbC j0͞\V^';k_fpڀt".'3<ӎ{ x:LL6g5G?Q+_C*/{&1jA5o%fY"j1wGV{f%3<6m2^^}/ŒN,}jү˝%֦ihHctu/Y|x|fy8%ItG7^oJM4gSy:2z4lYdtȿ{`=kstWLuOԀ3'A99X%l]^9nEϹ7jzv4gؒr..v$ʫ=:A܊i7",cߙ=M]eȩ#G{8&kN&J.ٶ/m{L [u&F۰SѧCS(= 6 㤒y VlO+h|s3{>Ιfhw ۡ*?US%ٲ >ڃv;yArEsȃh=#M<%)qI񇖭3A3Y FzQWI>7eХsL9:Z2zO UG'\Gn&)OZiudy}%SDK Zc—]"351ϝVOhA=zQ=_y)|&5|5Um{/yV{=w,擛h13VxjRAGћ{G;,@=܋EY'C}@[V{*Y3V``%[GGy4C;53e_$G8K"l4YF RmW2>f^mcQb#[5#@a9Vα9Z1תtvCĿqB|MĻX%{%QvLJFg?y-k y蛽duZ j Pڦ8OZ]2.^{ֱg=3fE{}֩dlt3xbXj#ԬKr ǑGn&zg<{0o1#U7zYs~̛0 Gdl"2;ݿ^G bTx'o%-[3,KvmE>9_Wm9H&x$ <Վ쒯+Oe ]=deF yXXD[\9A;3$3DF.ҷkTvKKz^49|.k/FftwhM2-҄]~4%m'6c0zՏݚ%Vx{ F.e/J|Ւc=}!nm5Zkә'RIl}|XI Ld0Z_Mx#<= ?< 0HcAF־{G`H^~ÿeWx۞osj3%d;=&O!9]ߕ+iXY{ Vw;d4"^FMҦ>4Q-ZN8A_SD9TWt{3FIZYΖ)qҠ"*&[Z7LkV"( ue=ژ9}j8dž6ϾY~$s3{G#"gsl[zo ~PD?lf/{ؔ\j$~2ђugޢ-k{x3|0}OJBIx3GAh{L_:G%Sñ2Z9z@cծ^y#Y^c0ɈXQ 2kE+/ڄm19/(VfUYяS?ɲq]4{ߌ1}R;y*G淋mdMΫӕT"rzxsC߭kڄ8TC5f2#<~5_k3{lƞ`lV|FJΨ qX/ڿXV;ꐣƓm9Rd]ZGTA0= _!XHkg~~݇ 9vGȣ UE+沃(V׽'dyQ*m=sꕖUrK5],.KA Iu|dF{ikx>"Gdʕ Jr\OGUR%e-sd#ʚޥw+iկzӒKk^1 Jų4#'V1fAu暽O{"%۾\g~kZٚ'=!C^yyWff ':#HϿg_}VZAQ]\a s7^oAڄfx̋&hYIMu%₩ yzm Fѕsi05Glo|Q2Z8wnQ"['=n}=~sM ^cӲfLy~muLOzüd"wEvU$8%66s _Wvv2#l J&յܽd}vdc=1AX\cNRyEA\'codDӾ"7d[Oݩg3cK#+D4yL3,8x%A}%Odܡ< FT@KV-ՙw-5:-N/ҵʘ( G+Z[3vSs&GWsה#EjG G*Q{vpZvxɴ~t4Hާo>p{P[3߳v{\2K@ސ_g {wxvfǞ{/OE7K[%K_Jf䒙G&l>5{(=&yS:wnB!%ckK&K*A>Ӗ$=kͽd4_ǟޱ}VdtpuID]k]dvmf"NLKN~I3`s{H򛥧W0_E{޸dXܯMcAZw-:wzQ7X%%=f={_~ی~=Ö)ժJ7jmYmdXiRi:X?wjiomǧ/14]16y5e~Z+WxzL?*]%2e=y$%+T$B(.+ڡ&kdё c2O_=5_`[WxN>T~*}sE0 o' s۲_7Ew ykqO?aZV 9 s뱋qe}X ==Q]Z爦|5vjs̹ßk,QNU,R鞹A}a(ƴx#ða*WSzWFD{jY-dKֻ֙C2KPa>;5DM#²iG;uޢGMMOfIޝf6~r뛦5d՟f/29BKFn j{t۰RH-eJcܲq%:A-ikP5V{Nv*eI| %ӓxo&/giu~[O_u-g۪BVrq4.Q2e 5٧,uϜyF!0qfog0_3| ֳӝ=8pv2V׊HSzG{Feb_ejxx~8 ̭2qYڲdz#+'ʌ'2,Y\ʸ7Xa]\AJQΘEYy߲m;s i?gh zRFɊPI74N=Gdo*wv8u0d}sSۼImʈ {lRZܶ&<yƎ&=72ټG&U[w7HWZJg|HS$6a㷌[LiQA%9kv{=-C=5^HF_T M*co9*˗~ӫ:`iAƷ5џ=+Y^1;gA}reh DN}5z!Y ˌ*vAx|ccЪAå,A*5vޱ33=7dIi.c$(3ٟ3{r{үf7{k y,))8Y;cn=*IvYqVd}=[2փVL)A1vjYs.讋׷6zEւ^zwf`{JBsD %gVA-~dK!cKKLdΕ e죰#3x*O1Jg;> }ͺy~gI{ ̃ΠZ+,R^"-"tTW#ZzM>hA3gZ+pu5ɼ뱎=x=:(1׈{Bv0e=GiIcX;#O"ِA'H|uSWq;'˼%3k!r`89~FD:"_\4HWM/e <1F 'S-DT4<ȉ]s3hmT Hńo1A߫קDK#aΑ:Cg9=.TrTD}؃ȯ( ]3r̙m6浢z'-i-jCMSKcbs)Ϡdy})YeMwօJo]+_Eǹ&۬q?;|mKWzU;YPh%pv|Ɍ ?:25HsMx'ضRz_gۖ?9nXOos]nrp+{oȴOoɌ0]|ʚ^Q^0ѳ =W{,ߝݮdz'}}:YۏS%<=0T/YcP?Nn너&|+_nW&DRZg;fџ^kIWk}|ËDcR[=W]2v=rʲQwӟ,RYX`:̷eVmyݟV|S gZda|D$Z:-%{T3T/MH.Rk.Go£ lYw_kE/rf0T9Nq͵u;ژm/ucU9(sYiMxW ƺy6K:BC dqoeoku 3 V>_9_O)ƔǬכW7De1;cE H.FxW9gL2'C s8:>dxk:|/YWNXE> |Og,~ڧ%9㭰g۹u=sm3o7fвO;](d| V 8ݤH_mJ$GG%Ql+A܋]Sz97ذ_sg٤>qϥ3ֲgyv>Q8%k7Na_/4u2{C˻VwJOF,>#^ޛsE斌=pAxܙ|fzMck^8b;H{D#Jmܦo>öէ U: K<6q.eWF=w*r /x`zODdw:@TO7 mgiUd\7L-L}=d1s`%–y?5H2 )OS(,*y1m>g/wtg鵨 ^PzxR{lc?GzfzքcFI'7ο~8t8هQȃrw jYL,s!ʊe|g:"Jౖ"{9,X-Yn#8Ϙ9WD->"՛)K)K,E]jUP$=bGT^wEۺXt:krkz%g Œyjdƞs~t0^9`jz$z+1s?`.#k8zQxۈJ53y)o uG:汩}BgL?b-[Ɍ;Ӧ_ٟ#qίQ߂nm%ۖ..y ];yQV9U&Hԙ+CT0%={'9< a?>=)/MWYƧ\Aj5_k{kCmkUnMz 5;ۚhW26` .%|ds #p2w Az|ܔW}h9>%XoYk*@e]2@IHliO= -uꙣ ߗ}v[)sMce'c2'oߴU֠Y=x(YWmg3+`|2"I=v S\Z`+~;dlFE3^9^DĒNى |l'b\N%c28}};^-]ݼk{D6QF9zRsVhc'k'ۿEܝŞTp WH[lh֠חkO[8!(z91EqLx<̓y&x.4Öq~~ wk;_oŘOP~ZSz'尊 ]JnUS]-/ocstI\wՊd86&ߧZޅVQ=S2N?(BY"FcG1WQN{p>Ó0iyt'ײ^i0챈ZZ.VUN[:0H8]&}: Zte8dlHh֖b ё_%Sr̻ƽG9Wǽc?z3ȡD;^%ۘEh1l3U[n־ii 1w8һ ;%u钱85#qS(T2xmVFؚ60 ?#_e]cvЙ#̿+ y(funLߧu=_Y"81+O_ZQTɲk h\9c*H. lz0Zdm%ɮ&[TFd;<חL/i0e=Xewا{>]΢ݴs&b1fWgQ 6dỹ}DV"Ya*yvAH:Y[[Ϩ ʧ#WK\YkmXɺw'z6=ioAh;m /89wjhD,<~O{W|+{g9y25cI/ԣ73~}י{w-.(jt1 5au{9䵷L]{-H]d먕d!wKʽAKN} _$)"^ ³JtҀ뮈Ehqȑ玬d8>U1vq89̞d[i&A?z$]fG3?4m9cd<_0=֪( Jwъ^ɪW0DiE[o0rB5^ώx9ۧL=}K=_eUmjnVn*&i#g#s`}NFΘƷ6{zwu l㫒Ug%w Z{g,5gΘUκBg]QFީ23e[gU%lU%A^`~Hoºgg{C*a o~zvX*ޮ̼҄iA D5Q.))_PYg`u0휷uK ݓKF(hQf-3I߸vDD~ܣgnKv3ɡ6%~kn{Dۘccvm؁ed2YLPV6O!=N)ԫ%c箮!:?A~n%kt`׃TkGl/O~Lg51⛾3|$@M?9uڵFe YݷG =58'rDVHyehez6No;dM%xΒ&O+/"H*Yﻼ_7Z;7\Y]ɔFf! [v=2Qy6 bl`ql+&|u0~K-p4я)kN&3 ^GL t+5v vk hIiG?Iw$QD9Zqy> EaxFcwlS^o+H-ჍѼR#&c>?8qH;R(G[4w'4*ڥ[,3r9W]e*sT2_ukFq%3 ބyEjdHۻOsyY_DSK^?^,rީ>;#J/ڶkLܤaGQn%_md>ui7M ԄA3mHfzAS7ȵRg /Vu3-ֵ\2+ڜJzq|2ڳHƖ}IEv3`Wؚ <̮~d]uUmBg6eĮ5;]iu(.H9}K,oi3:+'{uՉ}Ͽ2E&x"(uoL["z`}vE ?1`z:.8 -BA^rDf$MͫQIۅ &:r8(}3<:/.{>ɫlkB}wnc]dX ,йE熚1Cg^1E6_Pa䕂d}~r0*j$Yow9A {J՜^]{%ɛ:7 t2.H9x9s?v}rt3ve~羽1[07Y'eXe;U.]^y߷shs:Z7orƯ=#LJ%L%Szkؼ 5Ws>ErÅu:X}1YݥmM6_' ϥjg'>/pvi~ȣk-[֞Dej#-Y\'mAuoٗ w:IwZf4Ɏރ駳5'V9__g3+6}ϡb?/_]ڨnº&ALV#b{~;QDOHy>kxŻ0fӰ*&ފwZ Yo^[iZ5T2VOl67t4ӞdaW#>E+]g!#by+cv֫5hhIexJc뫼;h²ˮޫȳEc=`Dkڗ&"CכL{Qe?SNᅦ&_aɺhGvZvIxM+z žleU6%Ǩ<&1#C |t/LfW5gTy~HjKmrWx=T2_1&##'c'KvHy.&K(ҽ&՜=16a:n۲eFt˔^ðs~ȆXFsPR8EzjŽ6cٶR='Ui/8FojD4XW V-cmrkl^+=t+ -6?=W֎&]u[̒-Ǚ{=d<:9 Xc~rhM!r9m:1vd4}f ꈼ|c #T+W1EMxOgD_-+YkeGH/VBi$ci==GZg#ر;_geKFgMU: wU?yŊЦ=d,3O'!׎,9tFϯ̕*#61:Yh^d5_3 1Ӑ1믘nxmJƞ}k}cezcEXGE Zxe; SNm6ךc(7Ju8n~낤+{SjEysM&M28{\G $߶%g{ni|Y4ڛQ:`clmm/o"UOGb/v&{!AGPX $mj}EWlw̯JF/?w c$QO5ZeSnhN4g hi[}{ɺS|`~AԖؖ *WxR{u%`{[]⇐ѬLgܳN w];u#3^r~fXL?V X0_%?_U{QOH'ۃ/u<|׻׳JV-.;eݣ=4Ib07֜MX=[lzi&WWi[u1ycd|Usėmk2oء}~ųhs`tRd<,}X5Bֶ?uE'8vzlJF.on\vӄ}*iRйAnw*bgqYaA{j tR}ds@Y`[5к7ﲿ^,1=ʔ2?oXE*{5li6CʾTKc 5G+DZlbwAqowNnߔMӲݾ3٣?!~~4{%Kg}V{Q2j>D zjOgo"ۼx} Og YϽ~U#=3kϽIcWUqڒ|)d˃G=Wdgg- {GFY&B5{"C^(qؒ~ǒ)^d5=jc{qՙy)mEx}Xߐ$yiQ%3JSZKF u&='+җF}O\AXتP,:z" :RZFH%M^2WTޓ 5 +3E+"7e=Ƒ /cdW(hAXvV,s0>b~o:X*,ZE+efk%C)~v-&| ],6{yi)9Ox;r)ӣרEehj6~^1jE+G[DٽFٽFmWmS}SgdGl 7{ܯj>ڱEyfr/\g6;Є .E #_wf1[#ל׭dzEG'f$/E5SwoŲ{cTF?1GGۛsm6QꝛdzvkfzhvgzMhX{y?Hu!pREQy`ezς狒g\D#þ<ӾrЭ`k{힃SjIi۬r_Z[2eLw&j@c }$6HԾrI^&5wъD+A)3kLלA&{gKwl#Adw?ߪ%i:֗zM'4GE؊W zMx0`G!U;JΗ=:noYvMҗܙK-$߈ #8̧lS([pj2Vzp.i:ˑ_k,NA\%36gx5ae:`tI[v×J"*#-bJ\TbwMX?bo=CǞ`_2.ZyJf{4oD;Dk}?=* 7a3:v]'i-\M31ndvڊt&'7PoքzX~7 Rb`{F5{ `hmh"[rYyƦY󆑹w5ᵍh9T|ǎ\,NzQ{Ӫd X2ekyQȘIWGsu4]-su>3g8Ⱥr) %S#kY}Q?#zr2ٙK7AmzAhʽdkj%F4}=l+dc2zdv'#n>3v5&ˈomf~YdZqU{,\}qG ;gƃLJ ^ o5_l}%H.24O}xx jm2+Q8iZ?,>)d|}`=njt&Tβ&-uve<,>zܯS&ZpK"zV!5D{̳+uW*cdi^s`n1M@yv&5ELxZZm&FG4v熅>o 3M u-Aڻޔ1KAr*H5VdF[ Ybeu2L^bt>ۡ}M#CS65 { |7&S-1UVY2MC[Ծ_7zIW6>Nýk{^c&~yfw]ݓCg,w:jI]4wf;dֻvx#fˑL:v&7Sʹ.dKYѨ:L;g>GvIuw[nB?|Qe揇7vjL2}wEs!Ъ[f%3K!5+zv-Udms؟3:3{1?AXFjMqX+] @aOkɼX7<놯VuIӾw;Χ-#o|KkvGlwبϽ7dAlՔ״rnc!FWb+Ags_g^y5tG!hV2v*Rsg/E3iE̲J'QKp<򕠡AkCE;r?b9$+(`)rKˌLmM*:;Ƨ(2SxzASe,", eo({v==RHcAJ8 r:1_F爾8~GUWJV, ƹhd#`Axٺ**v>WGjq{lExG,ܭ<̗r :t&Fwuwpq+Mhޱ>$^ yKsXDgCE,^٣] K ƋCE;n;X-:{dq8n{c0-|LM Mﯳ c_+_:_^o,H#eG%K\;djG*ߦHWGv8Y+IWg+ޞ ss6H9^Ϫ&ٱh"MX8Asd̛UfU%c3aOx3Mz^ks8g˂RTKV{| BcfVL|<ڳsakn-Ehq2EIgGT*'L9zgOeq`_10ZuMYw'{ /qD2eՀ *Eet7Rs#*=YݖyA>[dǟȦքܭ%yZJj^,&O Vcs/I'V|FEJJJڣg7G+_^s꼂?3/w{-m9F[R2b)&OBlQ2#@tv~]#kUyhMQ+EƿR+dߑz7٣?9}XXinB5cYGS荃'D%Z2e&j+.w]cUMWrY>ԉx ƻ=񮙯0Hzh Mk=`,byg+s`|oTU^jEr>8ziPjzwhmUG.;FW3ڛc}kOo5/EKa~rV&HWόZR'T K82"[h)M̽ c"|kؔEN]d{CF{;KڻiJ={#RDydNe92o-Axa{}dv`E7ؽ>/Ξ1&9sY_䴸; KCXi=X^V"+j6>I[aq֨ ]u9LG/LW昊h+VWNmm{g*i؇ Js9FזlGr,I{SzoTZs?jݣc ʒ1I|g %Arգ=՞.幌[ a:7k_sQJ#=\ 5L~gzAԏb^Ĭaf;Ľ~ӱ _ӳdƂOGEoftiyd_&^3;vml_Py TK&ggo`zLfb4`Y֗jsY/5UZQDy q^2 >0L &oskWs-wVD-{_Y϶ϖ6w<ކe!ƃ&RD/܂:y%ۊ^R& pߌE,19OJuN>ߖQ[3`zt b 8cw['*{Zg<Q2ܽ<+=$,\Fb}PY]%/쳀%k| 2~d3>5`o$9d\>*.Yϖ8:djX ͔5m &cr\xƙ6L+g=.nq.ٶ5`}rxDw֘.|;*%"Mghgs_⭂KA *W8c_K ] t{>X{W;B}b +ʓt}FU6w{gxLΙ~M-,tYƕL RkN{&r3uڀsF(85ބ nMϻ?&pŇ,=)k1XiX9_7KD\/a#<«gLoP=RMj_[|rd}{JniٚtߑW}[ɣ{qnI4`Z;j-13 ֻ\s+O7HPi4;tTlɶUU%뒥_g(V򏻲ѿhc]\x Y|z[rEk&ˮӴ93YD ?~~9E(R xޝ"E=&3bی} w[Fmm~ݻkM0ȣ-S7Hb6Y}Oi.ɔ~r  rxCK#>7Ѧ;?kɴS-65Xsf b yfhyKl7N?0u 9tչj.-ؾʽ(OA~Kҩ֖ADFy9\IgSe,-oM]Zm/33ʃx5?o7:251AGg&ac?æM 6^Mv?DI\ o(-_~s8VwLѵTܹgp0:A~/כVay =H t#fw_G/hѡawjϬ,[Y2uf/uLMhA#(7S.迌*{>"SNSV3٭Da7OqA z=NoswQPZ?3ּcڂN%e>& 4SxJ湟dk;sjJ-zǾ$1ȓ"_<į'˲WXwweFH-m^d/jZbշ-{^<*odݧ9[VOn62'c==X~Z3kzAܚuuɼ'Zn}>%`p`Az== Ʒx,Y-Dm|2 u\J1f&M֛3HTV[DuB?^#Jj[ ?eʻ1rڕ&KUװidtU5A~ԒGdtd싾{Ljs{>`FdDX@_v>,JM< _ }z'|uv(;e{=h/lbjk9CYV>5g:)~ ;E/[F6ksm4;W}I d`}ƵCU,cmny&OP2cK|\5:n/KwZ RKy%S63|0O=dj3MXɷL;cA4;nodzjRU?eiKnH&ǎ9B>ލZGa_<##(m1(Goo=Rxz~f/ܝ] _yy}1қд|dG5$pjHRtZ5+-%#+r?㍂+DN&y|>v؋oFcmq,.ɺ k%~673.v YG(9Y#?W Bjgz\ |INf(`>$k X.vy$<۵LUf0%1AʌQ̈kh%`КyF_.Ao7Cz?C#^3H++=YN.˴)fE%3NlA@Y&5|&j~!A<;ҍ3ؾ/fZnsѵ֙4Jf4{`ճwYf ?H9跽jS29csbrTϼ3Biyz,`+ Aش#.U-넢\Ra> }x+E~PzGE kV)Y;zv$?#IzbxG%EnK]dF='^2?cGKs}mF蕠1Z֌-o(Վٚl~f̖k֤v8{ϛ%zrX ~sc3,APjx2"1;/㝗;ۅ3Ea3\J~}nWlWnl `& r+51Nxdv>Sه,Pt8g;NVMGk2Fah;/:]GEjod5BK[Wkc%I\aE߫שC7uF>fVӄ )Ȯ%3Lw6Ns\[̶=o!Aئk =[\W³ 7Mԏrx~uN'c"?;yGjeP2=f"V|MA^jIx&juqt?^o)H_ɹ tdo M8W# x lw[ʒ8Xk1Zoʖ 5|=6Wny䞬Ω IJ̕j1xQbGع:FɌJ^eF&<yYe4=up6MCS25L%޺HoU|Q2cwy9YB,3>V}d7>}MyEzB>XuiwZs`&ٞw&SE/z_Yڐ|sǯ~^==s8'GI9Z"_wsXpeW[?lAa2F(Vc9֍wZe5c24wa_>xPn;$띕kIβh=W.}<MX6}Zs=T!_}`cɷU۠L;=ߖmS'5qU<51RUMD0bN#W~i4]^&Kn"gq2%VgЫ)eZ7no+M;,yX-]iM?=MHRߐ).dΤǛAL~9~3XQeJqXs\ѪWj/x:M_J: q#b^(˯=%㫿[ [- ;GASzX2uѵgH|!Ԅ?m_Ѷ5r^9J/[Qid*?yP9jB:vZۄ&̓wȔ` 5Ǐ䮪A/|]JtW-gX~wGeF1kL\;jtQ(~D/1Y!Nݚ5ga9~Y2\6 $7$~yh1S*@pәd,;Vh΅ъՂVיWAo ?dG9S7Vas[udt/;TJſHomvtɴ1³YОqN'} ˫wZ]NJQhףM99g.bWn޿_2^wT(WwQ$o{̈1viF2=[U9z~ĠJSWdX—M&h qn(mƚ7y5H_B~Cg6u*Yd4b/4"~DO]K={ǯqOLܵ7LUS26Xe5*i&=+=ӞNWF~芊}D9q8Ą&Y" w6>fFH퉫9纽"T"_}{[J6Dd^*Qo>-uB&zNvlA2v=gʉt0oNi_mgۚ~|W͔,;G n6tQziރݐw?|NiQA㤻٢&DMcUl哧!9n͢Au,C%RĸӇvM${wYH7{]'ZO-Ydvc;:d5sj/GWA" k5y %s>``m|V*Pj;2qNZ>-``j=tA(R6>hb Fhxuzޡ2_nh#$=_S$Vܧhq(}f"|:.d;]2Eeniiï;J4#9R?TY[f{h˥= _+&woE!<&a6+xϢJM5|`zVwv?ߓ?b&dݚ/uyz^MOmv,=3~Z~ȒU>3q#zg/]{f[nsi| V7OewxW ITN+ 8me V o fܓYbDR#&8k8k]d >=Ks-gY>tfiY@%O dZ#3Y%Yy7brTnHw/KGL~=s03)|9OO9בh5W ܞnU) "Ǵⵯ@_=|l7@ Fǹ uԞ"j#uSj-PIW*qC-ȾܟԘeF ձ3;O2)b2<|o:lIA\%;aګqj:ԙXfA~jsl>]gP&F,W|y7{ɒ |w=dFFdo>ufo1N劣msSNTE^^5K O9dj/s"{{3ز;R&ZD_O%(c7Go&\TVȌzɖHBIiUV(БZ_\hיc08GItEKN=s+BɴcY`E41{/,|ɔy+e(4Negh.+O'|{e(Ax k^Eܖ^M˫=lu2}+zOUޞR$CSzN.kd4k`ǕTZ>ֺbO_V{޿ Vk'{՚2n*5. }/YWV9ךlU)c׼[s -s6[ΚV^~&lmYvr0Q.)gn8IuL&9xd[AzA|ږ߲mwG(%~æ3w }Py-I]Qȿs/5dEy nsNzE$ey1s\;^ɺs]{/[V;#Ggiٷˌ+u˴=o.S>JQzL[444GEUbz+}E-U+1~HgKjtk J KmpHd"-V 'A, QzW{2OV,yxC}s+[` hK֯FX;, AA\%cc_>eG6 0am{>g}ΉI4>-zk<֤7Ƌcxzvi0;f)9KAqՋL%EwkiUS%ݞ;6 9d{(_ZaLMظFF8G%ճdZ izq`вo-x-=p#:nh\Wk=xBoj6m0%ѻ4J旯3ɖiKY5Zr[uܛ}d^ BgϜǯj/qޑ_?WmrgsP2>~d +K'^scf>8 ;'X:z+RIF׬4X^7>3z5Wgg8I/:X]~ř";v%TCG:,ۃ>E `kZN*Ͼ$+Z`Ol{DL*gW'5WGic55+&Z+j-Ht0auώcLZ~0OZ.Yz>DU u۟Vdex_~V48w3"jr>z<M}p4'9A}=J+sޭu;,9C>]jS L'ZJ-~œGw痚3+dc ]P1{[VٟfL:>y1bEՕ ,ٚ)j >Q`A{glVJw75ⅸv)c$c;fΔ⽈ɌO1$-Ԅ_dW1Z3VBPʇDmJ}ZAfQx)A3hZQcd^8R-8E|UZ"XW"_l]Г1- GĘdv?Jv&udD$^O=кde²-8z&l>zgӯё |Ck%WgGM{D}+LOamK?"㭟 L4m2le||Zh(gfZ@j̱F3,:фNx@)7ү|+jlnV`Y'^Ll+*Y|MxJhMmS / ?|gn3Qqk&w1ŠaqiyN,d OCXvջdYzHWO8A25<؃kY,kvm7ўZ_*v={3c0Vefr:WHi쇕Nok%Gٳ#2%{ώ:'bR66Z:6ׂ?<3fqh0aݔڼR0=΢mR &Z6Qb+ymf/eT;Dfv}`◃Яs`C0?B ٷM KWa)a -1X*Ah*A06.oG;_Kеg ƯKv}qwi[=t*5= F>)ǥWJ=LAh/f=cyd\byJ2]SNˢ5Ξف_>űwU:kfZe=]{ʂŽZHnHqsPdiEfn9SV&B"lu |#t@аl+R_}D}ASO%$ymgaĒWE'_$Q9'?uVB4lښi^Cѽ>{nED~]#d#id녚m[+c0z Hz5NiG 4W{wg*YBSnU>e~nwJѺV迳^W3t9_2}YƮ涘36dEį}4o_']YcMuXL{'1w}䪸[$9+YvdsBޭdtԂ=96ܣ,3M{S:5]Jדs֘2Yd|A\պ| 4^s%K+5c1kdPb.š3™T)wD6`x~og4"Qӽ|εYޛۯ\2!Hi7 ~b;Mw^ǓBmFx=9E ammu|wJsUbDeJ֯:W󒱏y&:EnMFƹއ,"PJf:;Kte=ױ'~n~>է-S$ShYϮ}xn ’aуg$AhsT1U i*]=K#2#cXc&,V ZYU/(w}~ tΧJ֗<Q{2= o1cyΘlgك R |s+%hYoţdڃ#.:EE6V'yߖ.Xaҳ u?N^Dߐ㪈9F ʊkk;%~f7 ?mܤ̹F B_7Mh=]AxqKVA}dtO^]eKƦ΂ fl`483q9μU_Wn&[F0(3g#D!F>@2m+v51x 7_9>޶& h01@M)9=Zfݪ4Qd,-sk6;dvL Yosb0O̯dO2?N۝f5( ·T3gf|{yӄo:tZyA & sh3і݇s\Œ՛I&kBК-fdkC}0M;X&F#Wx}уk]Q;&k4JtZ3_6N5¿L/}IVI:ɳ+N5Xcz+ݳ&AzJk%fW ZuQw7iA|湃ZsJ }=_yx}񶃟K#IɧuEfE^K*9W>_AjM^e}#+~J3"}GmR+ [D2+,_{oݺM߫9gYEi~5q2{1?#JFdf lGڟ+D{ER^t_|2z)HZzmŸ5 ǽA^gV#lR?$KaJ\+&dFn(Ѿg~ؙe9v*1\b+qP9wEvFJ"Aw5DIR41m ] #36ۖ}3Mj_]ޭkw41ڗ[ފ<“^eOK;Fk, Qz$^_̬NJ\|oUl`lmy;|rV ]oY\s.Y_.95|q[uOwۄ:93)YU6Hs5xӋ|_Np@Vf a;mS*FNA5ͽ]/g{IwwueO9YϿ\-G&l@1 ݌#=FU լDfe ܍~Wf ǁS$kn^`~:?L.?|Aj+.?{Y֒f8SۤOkd>?\+~ۿZ[r>ST2#XE#elSkDnx\ W~;>߶\duv m_l&yB 2=9fE>:WL1jϯƫ3E̚ ZXc WU`G ƒ6$icfr~~err#el${ʂD,҄.Ȍ J̒cʲ3 [*OѢ[jǭȞz$<4L_3n4̌2ߕcq U%ON`j?Z}{es_ 7d};/a]ӧ m+#2k_FʶF*Nj+yLXj3)ёg5P1C5EDIk =9`' B7[ћ3gspϫX7suڒ9WeeK~d.%o<ge|`f1}0ff~ fZM^|/=dDћ;|NG[~O+yz<<ΦX'L<)̽Dfecr*ZP'-3[F8SD\0.[aGjdb̝b<߂p1J/T|ۋ!s:[Op >O"3/ ҸXX{1}zk\¡>ft9滬Mz# X;>'Szg@9:*\6*7-ڒ=~GY(Mijߺn&l?/6>͛ZE=&9Ä[s%|l"k! ڄy[_=j<ݤ:֧>)zQ+YsZ9Zx{q2!M*HO<^t~ſeM8}=Axglǫ⪱Є#[&?wUs,Q٥X23SdϽ?Iq26oڑI# Ƅ]U#M{cf;0ևWV:r֠3JFgwէVzҷ::C6+٣#{t] E~Fmΐe˻kK Lak~sUG>#G)+XCzMtkuG޺ ?z/ޥ 73,KEaO1#d<\8+wiyFr8_3{橂&{C fRMVhW7k37^ǖ)"댨ޯ}~ʣ^Ǝ5ړGQpȚm"֙st0Z+o%ћRuEX,岒g54sV(MezûJfv^QﮖT2{̷1uѽ`S{q}:ϴ {_&W&V%+~#ccob<]DMrr`) Vu_%cAΚ%ՃHO6%xr)XDK<~|QgI~e%Ӓ9 7y}ˇigg gw*Ž\ܯ(גKL1rS_z_st+ ; ]d[yzMX%Z>Hud9ڤdqHp̘; B1`TWeW4KUKFy +< AןusN_[UmwpyטYAD9wI1rrDKSk~tCcVh^VWWb#؟ b;k`A3W7c,c,Iekʛ:Mue˩5y F\;ZHY5?>V5oXPvEEOCɌ =šsMFADNe699tU:,Kj GD ΊTQ~gb`FLڦzc-TzMϚ5"(fpz;Z^y5*b'!M UA7i*KeFofԥ9jy=Ȓj"[2cf5 Ղ% ,K4s{:LZæi6C]*rه̯yPޮz9({T́5wlfdj ZoW# A싗׎Fai"'kB%ШE|v(ل8{Xb-4A[XV+|co1ڿ!ckxyV2o+1sj[[ؑQfUY5kEv蓕ςyzqU#- <0X=J1WBWEdFLm_򾐧2Uxzg= :[juh2<{L?^n 6V@VW'+jV`F1riMh_Ĩ9bxd"Q3vjh%ӤhsU6`f'#s9\)'|FvCuzduZDޏe&gnwnKK˵ YdZŌ*jytiޞϊhT\G"Th k?_: ye{ԏ1L#š'ZHJi28$*ԯ F%3[:RrChT}| lە(UMONƋ{[044+5W׺JstjfV: i u?s^9##͵x{y~p6-볻nk?gʼ e3jZXGK 7ǣ&Mv^ 6Ѭ]`1 3_$V7^rL]?XCY9^iOvJ 󛃘oȶ=hO=ħ7Oo µQ1jАAhHҐ|n_z9t8]tii`VmiƟ&?Y ?@0oW2gn<΂߮?͹jg/ Gzw O"/Dɼ;=WVV,=_ln+7Qڄ_} EEU>JY& }_3"QЭo82as?1ha?:}?mdM`=kCi^Kƿs7*XPHs;%5^V76G*`;n1h7UW!^=_n}Ծe)}+0slS=섦'PgԶ%3s3c"HO3>UZ.x^,w .X~r~wT &H_߷E;qqOUkg=3%y og8mqnjj6uu =OZ$cG}^h,r^aaY\Ļߙ >$quXne.-f\ssW]˴'zIsdyMqWOGV 2jd+qAJ'mEk2SMQ(qzCe"5 4Mߘ]27y/)c2uF_:P#7_S2' "< ,!-KG딴e1# }{-۞F?^뗗Rc$[ n`bXb"Ͽ܋ZdTi/ߵW;DjWZk2oMk7qz: Unk|G{wSxք-DS;H3哞YЈ:݃sj0{dt۫VJ&Z{ЂGᦌ-Qwto4w7̿jUKޒeyBk0-3nIK̛d|͵SDԄ]`}{TnFkfǿZT]K#TYװǯ*wU{ng텠Z-[5H|W>C{͜ ^]v÷-2 1i|uVPɴhҲd =rᗫgtɶڮ1[=OjOƹJѪkYV*(@3HEyޱ.܄ћ6rLZIzo%cOϴxM<3]EhQF4ˊF6Y-KmxfϰA<5Ec~ai3tBѵجm-} xw\sW,ί>dGW:=zaQ}( ۘ"A5diwVEhi_hsMBO5Gre.mY<"`QysNcd瑶>ϻ<E|sy7(|ɞN |kd~޵-+|{կqgh ~uZ]kn?i٣ӨMo&|I kN:53TV[w*9V "g7wkk}k-FJԢtT>At嘒gmXfFvh⬅$m~g45قusGn#33e3K&B{a\2}UKV{{ r-WhD+5wn}wgӽW2Gc@yy;6H':N?,H5M1ܯ]XK+|>U2rΕۓtjo#jJjnYꞡd}?+醯Ho WDIY3]KFowxö$YZ#E96;j[2l0FUKkۗx Cd&sA)O}uNY:GêjQpjMF7&ܡb:Syzjק-g+Y)+!/g\>9YoDϣW)YFK*Mؾ?7[}z~z_d:b2%뛏BKj?dIFt}wgٹr;th &.eמseEnMAic!h61e꼸ev6ߗ6Xcl#reݝ듶k>+?~y0y|pF3iw50.ƎZJ+pLhbܔfpZ^QގqyQȋ|.yiwnOK߄j%ŹuxLr- Q# ONwdˋC t؉Ujr\PShW}d߻Mɼ/Xe*>RDTe ɼg \2VsJ-=4'Xϼw;?3ekcm=<2/\爯_/gz\A~{إ*Q=Z5[d˨ɱD[eNq&kua ҚMbwXccdpOi';&}yos{T6sub0 z8w[kV٭WJfp@<>kO~g?# _Ȼz{AxR)y&cٲ]9wM 7:vy&t^ kٖGָ[zJB|܄`>?4߂U3783KF9BZL֕kK}yUR5>7r’ۄBe=2s}q>q(dwz\o[H˼=ֈ^kR(qoTc^)S.;ڮ,O9UPMǬ&k|9OjXn7ch&;ǭ}sDtt;4 Z竚\Z`fħdx8d5a+zE{+ڕX3?O>ݹdf^,-F;Wb6\kGk̈;\e;{r? [g ]ϕ&Z1Hw湷 tSdufV;JN뷆{b3I_ԓ˙Z؉EjTIM˼Qj:cdQdY8Sg*VvYČkL #]$le&k24&"A]Wnw2"R%ߚxa1/O 1tΖN;rRUMYV/U"{uՈLxzmr;{o&Ʌ.mb䭮AhU2-p XFxu[ڧU~0OP4mһpK4gXL&|]ɾIzOD|l"I3V9hCcò zF4ὙdMfi|=N2dv.u%y55YUQDe\}&F5t`Z״KFk=DLun glg ii̎h__hqun'X=d0r[MiAzQ{y.WRywN;wVU=B[[_AzcT[i89Kfc>kYc񼝫yff$nZKwX2&sGnQ?UL45 ]3fr;;7N3tm:#lPzdyi>[2}i-ӷ-kdt]'g8yoѷd|;oӉ1IX&Џ̥mdo ^ܵٞ7/{uy?Hr˻xq#^s/O1[(}t i+XX[ERt֖7N=>ɴM*b4}˫;dͶ7|kbNu떌8 {GɌ>z_0ck+EMw[}%5Gx>ff ֛]:{5-{R{s~jw6iwjw@M'-D҃}`r/{#s# {f6.~IkM+YYFXZ5z5{|KԷ曩2&qB5wJz͙go7ë@7Z*6rhgWp;xJ;ZMu.o|*0bX9%u ]JXI/')XEPiT`=>oQg6ʛdi~?zWhZ[zɳ7Ml1WLW.oqyQPMq)UGkL3c0QьD&c`)ժMsbnEfg:JvlXsdfE._GW3.gVԫ淃wil2z|0#+ V]{@ժz3'TPFu`j JAjWPի8Uzkk?q*`{@jGj4a~ϒe5^#Dǿ!sU4L?[ՇәMƛTM&<[<5W_cБI*>fM<ex5e&(1~1Ӈ[Tf>,^fkEĝ?a0Ͻ(4T5%9z\\p|QUoRٓTq23c0cq2Xs(+u+(/iF/ˈ^k|sOї(XB>G~.h?cM{wfSVSG^ܝ4;|cmwDOv"XC.j}=}7DlGж135 kRIkYUD|\u"蜀 _2ޢwxﶄLܵmLfw>:olA%>E>LmD=וwwR2{M2CԝD__u=sG'Oqm[˂,D+x^Pg(wkzޓؘlB3umT\\a;fb}^x}4۬-jgι炘 M.mm"^M`f@ h}:=EAs~X<;(k7%9g Wג7>ASs;)m%O>he^RȚ/&wFAhoj;EFj"u%P4aG"`OU?7c+m&rܼޤoMT)F^j͒ciY[bzħW_MJ£#ߵ{~MO AWd.o Sq_ΚF ~?OonSL"J&8jiBQ913fNa';rv%ﹴN>MԚRVdT(B;R/bEmW|6%疮_2?~ k0>-͙bPZLv)a3m^/YG L(mB\inU tv#j8Xfʤ &""tJ5,_ۇdǰ.uԸAhC FӻKdm Z3so%9X=z=Oxe7ejU >zڪd[v~H_}oFN;q^p5gqkdΜuֹy="= gK<_P29^뫲J_*5ff;NcKW8w:G3]~Kܼ\]l5+KdcVy#Mw^[7d>Dגwf7hz|i5=;J\sgWW(sc&< 3p0vl0ڑtG21k_w3՚,fo>Js>i͂b][_5EѣEEKlkxh= ZU++wOdF~퇭[ߝ]2_Jz;\f%y2"~oq4~̽ܽ;Lee5.]*kEhaWQD` Yc+*~:|=U+}ce<9m}ƈ|>{ƹ4CPN_nyE6&.<"JIY:jW=i+&H#n FvGk.Xw&t׋m[mXi#Oa*֤qs.{U|115=KU$w576Y Z*W|LCƸWde7V!;AvK=e,f7M V"7OIqmit:Og\KgvVU(!O֤xe >,]F.j#S%OaliIJ(g1-=/-kvN$3+ydJvM͑oO :}o//"bL1ϙc-SiY ``%EGWЈKk&.y>H_AtSܡ~;|sem!@N]2EEx^K&:x'k pӒFX'^5u>j-xJɚŮRKvʓKFGзDa0#^݋zWNdA=w~wͼ uIOg04Xf-AqB l_[`FCuU2=C8uvY&AJw4_TH~ xx">}V+}Y?>?~K\:6c k3wJ-2SS2ɓA|nδ[#"3^>ٔǶGKE?^'y<~w~9uER|{UDlѻxÙ18,e~WC̻GΝe696|`eJQc~uiE! n+kIg3|e?*ʷV6ᵞ"bb)Ҵv>0FVǭ% SEz%+x1}2=L G-1ף412"YKV/vչ`3kozf_ק2L 1QG}GKޏ|SāA̻gԤV\A<3e&*Fʵ,qS2boe趑޵m%KX^*ZƋaxx:/Y-f@*a}]LI@`=εY`ؙK2S+`t7^zl?#O1yLV~RFu|GKf-,?2[2qgPKߞVr1|NHmUmՄMgЯG5HOEZd>4<}{QkR2oos%99!:~~.ek-^2z+T1pfJUֻJOԕKsڣT}[Ӫ4ܰ9熴`pAd4r_w֠g vqOp}~qo䃿!;[0Ar~z>Q5s#Rw9ѵf1>dt`Y^KLlcUͧʓʬZ $;/LX :=tre9Wx^ 8S.ssc08+Gd]s~0s+GIFed0JV;^a%t:zWdF Azx7Wvxe79~`{?Yo;qYԮO[;I%.oMmqzsjmK؄u2a]11{zѷ̼׻FJjۼu4ޚ]+d|-ZS^@.^s.+ɞ}dQgV&Fٚ-ׄ 'ٲ̺3}Jg˨~:bX~V;ضa!f4Xvn-;\kMj۽sJV+l&}ι`"<;oHFIX4Em|[\oMIJ!s`7Ǔge3W.ճY0Qu2/YxECsmVYwGJZ)h2 ҷUl?jƫLoó۳c蝥p˷Aw묀ئ_WwL{'#4lPsX@&@};G&tXa1;̋h"HXK[orM-hZi羽Bg+5eYa>٠Е71[Ck ]2]ɋn LuozC2QU[ p]-n`ff]ZKN⛗jܽ|&uao[ccoJy^oùu"?_Z8hXw0}wU W>*G2ZsJN[tk* :s s{dar7-DA{'ՄgqןB#AӋ[v^Yd*[Xr> {?K_\ v|ݖ΢eSZwU%Y},-"|V㚰 \2Y_ҒYUA?zڒ-r$3|D_ej3SZJꗰ}d (BDKǯ>؄oY- f/A,dwIW 3#h-T~0}h_i26 }N)܄8XA}:|7_T58-;ll_01c77 kdF&Q4V;-]Njs=8Rg՟٧flҾ-+v"99gA|g`凧5,v/oψmgY7n+XA[r]$cr^Y- [6H3Œ*;`#HՁY0t ђlXƌ㟿5s#HouWApOe&īCf[:Բw`_g*Y}BrOFVFB1KF&2qz0%ӗdjhD;&iVvZ$4ZϹNm0Oc0q :vo&髯8sߘawfdYDTՀKFx]!S;Úekd*wlgg4#+Es܄ɾ Xî1&o;cJzyɴDSGoW)=V"[Fý},kvjMGq>"[!$+Z2ߞ}Dykb`y?e }3v]14d>˻ٖ'т4q͖6>ᠸfw15vv޲9X> *=,3e)Zra|N֨\~GGYВQ#5?ZoT(n472Z+yz#S{{LFm\Odf٦9?;Z#LZwz'N; -SZ}mɵ ,)7s_*|Ic!σүMhcg ӧh:ƽȎO,ӗKYْS5Iߜ}gQɶًM;Y\=efM7us}bb'&֥b}:di *X26sH'l/ެԤ?B~ݾuuכaCU>Y8^ b@_Q'VNP-3ߚAs,H=rQ蒙 ~/;3Z ޶Z>e2ZC&~>9mVjA̟XM˽ή=ZG' Ɍk|`48'Dw3oߣƳe(AzwGM9*^؍*ؿt$?4sǧw :Ia}+/A̭WZ&(=X2RfL۟3o ;412_sf\^/*_fW2/ki쬭E2kXg99:8 [.}$+}h~NzdeИi8n#h=&(}P&F\;L$]̩dywuwɵRdaDY-?5r5>^1g2zޝz9'/,Y=w Aj+R+0ouUx+r" _n{41u#ٙA|+Ǭhī}SӅnq#kzG 6-vͰ#Che}-y޸y">?' 4^}TL|i;; Cg13a[+Upu>Hd߁3E2\1{ KӸ"23%2vUwߓ7ԫL{ J9 }kj/;Wg$+m)cg žCYZ̾^9oXzdٔmc㒱ʑd(OSA Yd4,,S;Yg͙W jm5*zkclGFJ5 *^=UWo[A5vU^IFC}j7lg?~dtDh}Հ9612/+k{N$unHs xbG ҈F3lbf,;JY9s #+Ơ)8[y"'n܄y%nzMGMd ;̙"4HN鳦A[]|J"'G{u؊6ayCud|И{;o l c,?g6݆+岀Р%Sj^| }1&Feoxk'/~%FI-d֟E̟kʮo->g slIV{JQZd6iA+M_K& ^sdZ !먖BK owa,ky[Ǚ-U2>'>XP ""7 ⩆o}>QAmTP{mw(2jdZ]zdqǶR2'[&ynV+gyX]7lܖe}s қ<* |S1L|>Ss˕+e o}o)RԞg6+QguuVc4{3W}0z~<[zpd݇Mrj)'Ɠܝ^%㯼JqZ2&:x}`b\ £:|"<7|:~NrNPd+(8s\ś1K]j͵Jaz 3b4eMk~k_{PY74h2JFC^̹ʻ,9蠩:m>%3Z:OV5yy^,(|!~ zՙg9Yk*̽|_ɎlJs3c [Wƥr4f-crE+͔kAjԞ(QS_>\ɂq_A-g,itϬ$ʿwMxߜM:2q:٧Œrkmḁ ʝe 3iߢ_חQ1scxlsej6n=f}si󌴃h;G_D njdY" "ֺe};= hA096̬EO,SakĬmKGRxg5ͧ[dz9g+4yrSKƒOw$1nϭe^,^mà_{l*4靦13-g&9wߓA!}Tem"6鶏[z/ fTǘ<ǯ &JzL tmVBodLze\d}:- >;@vdOܪ֢f~w_lPdZ( Ffc4o:tڰWmļ.f]-<ρ΁wli_lezc}1ؗwC,\g0v5o ǑDd:s|6 R\Ku,?kEj UQe b|W%@N- >^N&~+f*2}ש^El3{sa`diUu&ѧslK%%c/KWGmaMx2{=Kz0M髬ᩔ?7[ƦdQi]3*ֿW}c%7UVsbqqӢCrlLe܁2d1A#^phy&&iƺW8+bvhkf 683X{d5 ,Ef :GWi.>Z}/ךA֚òꃒӯѾD;h'v[V rT+]A֣VLYY!Wߤ߬jR6}ۋpa%AO<5z3򳎼 #78TWRa"|aџ\۷&ʑo6YmV3s]={k5~FTyD%>ˬQ )[5鯮Q ҄Тɡ]G!}QZmBA{M3]?L"JZj͹WTEk8]Uy|Y ĩi[j&t'=M7>[;|xr5Ѵqi-gY|.H{^2 D5*7/鯯>k\IALM%cI`iVڸ71O@T\:tW3&tXA]Kd$YG{uU#d?̯oz=`H 3-˒ms7VMh u[e51zצd"ge"%;O ƛ[h7g{݂aJƓC>ܙ[ i³gJ_gJwf̊_+^rJS >fB+bWXnIc5q`ghjYx+^;LXx}~-V+ ≖VОіgsC3%3(MӶ|A:&D$z_d̵?~Յ}gk}P=^ Z2ij,y >B֒*4>"dѡϵd_O_Qӳ?|ڛY=7"4^of?~Akّm:|8M} I)w͡l˚I1N;xIElu#ےѦĘ5K,Ơ_ׅ5,,z8ڽ ħгҳȎ~^2Qލe3$ӛr^GT5yռI95 fZmLz?JYG_„ g}J ,KD+1R|R5s-#'nYseϵ E=%~7߂6ޒӎ1:G &j[:&k {q?sc๟Hs9tڹjRKsmc0^SD/q޶Ȗ5;J%ZgjU'onOdwz4AX-S:' b ^){ >y`{¶qO睶9nsڍ{}\]sOۄp*82roSI?rޕH;ٛZCf["I-5Ӈ RĖj4ޥJfޙ2uNo仾Q=d53^vQWu9U &UKVT~{u K?}ܾq6{96.g%qqɉ(4/; ǥAĴy*c !_?AKflF'|͙tj}Tmo;oo! fbt͹e 7oB/n_Ze緕7'dv/U-V2cFim<ٮؒ,sL&]!}/zZiֽ^jo2rA/=.W9sx{lUO|7ia*;.+rL/\LfT,%Ewyw _``} hq:3.OU\uN_*-󭪮o-"Z;2nmy&myI;Qkrz+UզQ4~v#wW8Q2mgyo%.«x+ &+e:M븛d{M4Xڿ^8*Hu&jfLO: Mݖ5Ճ3[{Xܹ5k^݆5r:IT|=G1H֛ܫeY1s/s0$OFO3[4\mpơ w("{>!}?g^M_DeVL?m3͵{i={fwDYKߚjs˘E̍Ged~`{<C(5"`i=WVh+h6ҏd"]d<=4WʦПx{zIۺ%ǓN~mM|n\Ru\DLv'f~cwO.=%,{.֪<lw|I5ݟ~łeYKf}m8B%q[o.Wz4];s5mҷ+<+NYŕ譾dHrfn< |==.-x&d; Ws^U9~}ndӎNi[:8Y;XvsZr&_+Y1o1CH>*bϬ׉ neY[AhjJѢK?{wV'Od SG~m]9{WT }`nefzO۩"zΘ{ 2Boͨf](׏{o)QߨguuG^ImUun*O!-ANFŌJDt2-3GmƦѹ(E9ukVZ, wY@,O^뒟96i止dqQ`'vʤڛeα }әr<O){sY=ӊM$Odl>lAhSlEP-LwfBij*3%$xc<ɺZlmkkפo^VĒ1wғ bVѾ>k\L$A>n-R;ҩ%ߚ& O!xib޾g#&Ϯ̻zHZUƾihyJipZ\Hk;2 nd5I-s[%2vdV2nzT>7t,zF2{23j"lwTnwo?n@MlJ ]2io?Dk^FfdzZ/p<3o C紶xLGxO>vLF_o\MXfn617tɺ73[rJ2F96o"&׳  ڤ~JxckAhP*Yf6@ʚ Ƃ=\?A;)9NL bNQ YʎFsr0/y42õ _k̨OZanˌr]1E&̴"@#<[rt3ZE:üJɌ֒[qO[ȵAO;c]u>xE)ZQjBo)>pPg]32#hOYAXWh΋ Of^=g83,%3 t{QbU|Mg0s}gg*Nocf5 |JΌ5M2,WkG%#ډ#XW y^)*b̯5+K4Z#\giRk@Awחh/ft0F~uȰUrL:N$c>7תؤnXn+'=l-E~9y[ل-L Ъ.݄c4fldGf[[Cdvo]_g?a#R1`V~])Obyw21~Ɔem3I<5>M!E|=HSM&nmpjU.hdkAx-3-[s^YԬL65e}9r5!Tl~d|q\2sg+GAUL?RQxXd[,#ϕ{oOs-}0ͬ6 Z*^cV ַ4edѮo&U "1 bEz9ڟ{6af5w"<#1^/)_dw& 7K-hոli}SoL͔xoܚ:HOm&K˲>W-ׄV̞܏ b٣ug+{Ц:3VN0vxv s4ٓ-ٔ^W;СdD~9Gcuʒ{eL7`i z=~7$߾Vv~gqԣKBW26:˶\/;KD5sHU᫉'ڣn;h+*\2#]H-qdz UG?іvYV,g|`?*ϲ>;jZuz~|ꆒ?huhJ-^gz{=(Cٲg{5v䊰nE"`0h Uexod;;}MX0}vA<~Une|,"VhB,&}$=K>]EesrוmWV rXvV6cP%Q$$9s5y bX@DQVz^Օ`,̖jme 11CU5m]%/C_s{TX! r 6þ?zfdYd^̯W+aCby[VS ¯AX}ؖi> %sϴOvbj\,]gAM#` 5/^T2c1+$ߟlə9;og٫e'^٧ߒu'@#n״>Q%9j7W0o?׵8^Nk~Y!⚆,{!~ҷfwO{&zv.]gѓo\!ﯼeAZ&aT&h71{mdb8H)pM5J.`})Y/Jm?Z'EEǮey+tkdȻ]zVYKD/rVd7s 3֞Lv#>zżd}Gu1D}AUCaRdu,o52=gt%*woW|DD5',RO`CMaӤvie&Iު ߩ?h3·\&~{w oʯKhQ2cm]l2H뜞MrלpZ <ӫӑb4y.[;ۙԞp5'?w+z8ws/Qi1܄0w \>;<[FjMyԮd}UdJ^"l>'|rKyj+FrkAx GT {`<[}V91<% I5PU$ӣio˻!$Yv{b?b-y:;ϓ߲;EAhms]ɴJP {߳oɌyj]UqNUW3 9p)+z;{~s}5&J&2r""@UVL/Q2DW/,s7>E49}׼| ,kdԨЄ@ȌVQD=jd+xe),G}<}WU`tě`4Q]2<>cTliҧO|dl3֜"s8}:Mtc%WOM7 h`//-֫%G;l=Kƫi۞.پ!'֎c]dffoQ+i/nK2oԝ>{k<zQeR$KﮙUZܧv Bs{uGq̺>A24Iud=R@PO5CԄ;cyMK^ɒyDZM<ē宿 be>0`~eDF?F?|ʋ$+}%YϾq?o5ğj_8'?#9: ~֢iÆW ?2.HJ^qgAgϽbgV2,{T23 !z=wos0c ]$xJDzOsS:Iny>|=3;Ed,ZvyAWDAӓy ONe|Ё&5}X[B2MzA]/;}}|<'=x.eNt/ҧvej&4CV&/|xgvkźm?kFLalhIS)x-[Cs̜#Xgϒ>EryhdTKֵD躇%bUhBt:=?$j5t|qYh~ &^K&6yKF㭫kҲYe}An韈{];d13sy^/~FV#_M2qE<>c:Aw$eС7/n2q;? ǸH ;Ok&@(YC4 _$;=n<}ǽicۮ4v-E܊ezLsy&c3Q}̨v? l^kOO##edmW]{dlXyu}D~QٿQ-ѝ+z_]A3Z11I]idF;7iI2~?LsT$ZSxO ySzq^T[Omxxcͷ<ױʃC8u'GlR;Ԣ~L_8پ>{?z5Z>>uODwzOu: x~x-Yz=%j0>%u^ѓL&?$=)?~DK#[)Y^e4Ei]}5Kƾf8[7ཊ~u)Kƻ"=3K&Ql[~lyn]U?i=~K+a-:EӶ% ؄Iv3bɌwZ&Z_GJmل;JM9x~W]d>L9gG>UϣJFwkk~%s?oN=Ej’y'q{P2dqZ2Vj},a͚4aǜo;ݵ^*cVcU؟+THf2y :wU蠈Z_:"Rx-[-Ӌמa&zZq$mz,}ڤOU.%Qڄ{z7>\ fT?i =w;T o~zMzs=^!LF'Mg>Z%bDI]d+}ϲITzzJO2Z^j[#91ۊ[g+?sT r^aY{엌^Ax;iP0Xlwi\|ȔY]8vS&&]U^=kY},,A誹VU9i; >L,K>^kG"%Ğ&@zAAi76_9onWluj-|}Cqo89b|n\Ko}S}VxJ6bQk/Gcoeir41el2l&+_ϘLj:SSz~}3{T<2>Ϙ[vǷ&OF':O1U/f{[ߙ%'{Y2^yK{[-~o'seT$QHKdbe=b?I.A[ ;;⬜""b',4e3UزOFɡ#dUeZqd`ܪ>׶ڿFz/r#$ŃںM#zz-nݎEw|7_~(}-cs٭l'YbՃy]y`~o,qq;ZO%Z2F5-]|=|O9gkSf&WDT!A=J&"J^)Yցy0=`GΠϡq\ڔg92#V}XɴLoZJAXg2YzMA\+ֹkժȽB''3J+LcdNC]Au+}?Cc1o)J;+N NC q&zͫ[rRXbgxaxf4>}|ia~㵼}[fλλ~>{ Sg;Sۚd[3wf5le}]ʹke"f\PO/_6MhMV ڻdZsK}nAŇb2#Lے?1({YC֯~t\9ُ>dt=AEx̃y'3"syߩ1=N}]{i'[\7N ݞ678 ~*8LSϬ=6Z4qYXqϯ8Nn;dbg<}jwUN=RW̹`y)*['{}T?(-+|AKWn/H[&W<e#*Z&s߹-wNtdbH#k]dǂ?>`b֨H]sa( ԤO]\6E\C_?޵=mSn&<7*{ә3%+ŊE,{U˴n{}d"} ZsqզKV W]pFw'l[Yr>Ί͚#?m>@@T)f+le)8.q]gdr֯ET_ W¨YWv?m6>=fu}ZͤDiSâzѭdwƼadMxY"Wd܋DkY%nt 'n1kY+<+&Hw5'$H>׳ׄb1Y$ץj-%wXL&6ӌjMP7[Sװ{ؽ zxV躟U~Ic7!M(vO)veUq Fyd};5_$ ho]dYzvyVq+-8\ /:}?7Ksw3h|/ɝ;ADWYSktW΋̎{[Y xU㾫VnAjɭ}sϪ$R"ћ ӵ6d~`=X" ݦ ]QbllᾓEjr|3(q:s}Vi{ܚY4-StFrKnr>%o+l^-?|\ufEקW |\U~Z㑑bFyk/k7aOnO ]yua28|<^cuͱg+35HOuf&RU5L{nG闌6e %ǘe@$SӼ+dϛW^WMFϯ8]'Z[$В`۫ ԵJFc yՇz1H~C IԖ>n=/d'۾iF/n|YEM|2+ħY;jWKm6&zGU(;'VEs5:;ZuݯʊM<Ƀ}m,'QH?&|S3˵B'r7<~Q IlSd}ƃ[sѦA]*DкquoFܻк=ԄO do;Uu#z}VS |ͷy*Wv1_"}ny2w&mW|je>}Aqߟﺫ^ 3V".XeQ{Te, ⵨d#[ ї+CYxG|/HO׌>5> xּ[vՒiՈu1+zY/ڤOs_`4^o-~)3AW3(?s_Հɷȯَ2Ax4gjHu'Kۄo8h9/פ'zQz5:*YSTOI*v&=KUדXN;\0X9HE?=^N벾kx?|EKFsxg Nl#Y#"$ZtӮY^KH=^^rUQ^J旿s'ϊym Pl{G61F)~e&J#M9,r,e6+  [<:dy k?}^Avݲzϑ+VO.Y-걌 ztk_כ,Y`"'S[h-{ŖUD,\ey8L/d*wZO&zn[ -O nh,->3=9t+%c]U2}b^2ڈEr1zj2;isJ{&l>1d>bWJל R bےwޝQ]H_$0+}G^Po;oJL[5mWu\zW5/y/4+9Hn , IEYv?|6~c2ϻ >'{!McqXhw}N5-x%S4Fe"se*AVdܤe%C"}xқX{W]d~_, y-==8+ "FX4Iz_̊tKɌ˹5XU1s##s3gMɌ(J]"h^x̌c09n;L4_OYy,_ե#!l=s%+ܗ9r^kL9y&b![i'3vb=N\zh\ղڢgi~gx\#pQ79jHoub_l ;o9`uɃ@U1?+_l'|Ba4iW2.پzc=}o+hE{AhG\;HW4kP?'AUSyz &;uI0+qd28FLFD-׌'= мs`˱JWqNM` {T+h²{w9'f+[dOHYUiR/ K,wە}~vEfʡhΨ-yh6&~8~7X}听xu"XgzZ(:[F`-Igq;;KFywt\c˫d6DUGJ%\ jiY>}yMwK'#KvZݿ\2o,N Ƭyɜ28bqvm.GI812к֮ |wdhTz&~F$[3GG銒ZJeeϳ:*]JDی|c!,enoL?XOOR(w>e~7Eu ؂zx4e6am5c,otqw5Źuw\U{ٲ7靽AX<]%jɶ?)?(}GHUneFT݋",wDa/BS6sF`m7kOkנnR5#k꒱Y)H-|ns1`Up_z̨ ";T9_'r7qߛqSോ~ʟ-Vd%l_TBsɓޝZmA,cq 9j0bx?lݥ?Y.H^AO%1W&,eɝAUm 5~}0oMVs~o 1׾Q\{%WGV-zӷq~j_,q[zvšzs΍27Y;œڳgvB_(O4˲JzΝ3C-R'ο>8uFo>γF}QAxyYw(DɌh0ZO8~/x cU BP"|ssph߷+Oj7msdA=ARM\2=gH\ru֌CM3Az`zgXdlY.nSu+<kka2@Yw0[&]iKلL39A-D/|e0K6lڵgyP;ne9%;sd(^9l&q9&}W&+z> Fu%(O XzdlR%OƇyMul"skyjAk'3k呬~ idK&d52eK(S&s vcz7[Lk9Y5_ds-4ڹltsZ>gd|/&`W/yLgI5`5{߯ۛ7Z<^ m:Xw/$=osܽ"GϖVZ lkҁ[<`tݩy~ˌ;5LψxglO%o-˶~5T&u06m丵VɌ^c*o9ӭd§W0-?ǃx ZӿCV"4ѳd}OT+2E?%1^#6cĵm='dPҧ$*QQz\Cg.`|VKA0k&̙L/Zk }׻xٞvv-˒yI0)Y{^>C~2#Uv"m'"MR`G2S:Z#( nPY힞(ۡ]\~eK'k$-326f%%/=n-c~+jY%;O-#y>fK);x;%5SD9q\my^^ۯ%U^Auܱ=)YieuY#'[kkB]DkE+&Aܙg}gdRmz6IL(<#{tcM7{ZeN?*oDϊZjkց&<3/+%T;-Nd.LlZ~Fuϭ:v:MxQnJzȖeoHgζ}xʒ.2>*pN.BKjsD& ^O`92ay{=ZK潌9sιH; =.-ԯMMz޽=ƒ ?b/eGv*<4ﺳ_u=t <4ZO޳=Fq%o KڧA.s呭kQDEfg1U|0VJ]A+~R]EFH'1P]Oޑ<"=3{AFCy #SSVY8N }Nz+w&{zAk~#QOu-o5Q3^ox덊WKS91ѾYT?igX =]ysTOD4A%ݾ#?+zCkپk֗yUk"*+W2gK&:l/Տ8HreZe4} o}'-TMd`;ƌZwsx˹+'aA2/EȕWA +M,my lEb+3+}}OEaΘ-nkׯǗW6G0ge~kRVBxy[=ϛ}=xEj1hYŚ (;z`>#*>eҳ}g[U*Fͤ[LsM(nLsѻf?:__j6zro^Јlt%;Ww?4f_c5x Zބ^yVoem]yY^?~ǭzojzӣzoW{@RbNsvn,? rgf1t`N y߹/sm%3?ًx;yܵ`BϮf>$:a-V Q"y<:ɶa5.2XWUg&g`zY~AdԠo s6vh = ~N);-9Aợ]1+lW_iӲZ(YϲVAOYXz+cfL"һH}Ni&hrzw*hꎨ‹?Ϟ>fߦ ;<9r ;#V!JSmR2:7,;7uz)' WNwL?ȞjɺWe;NhBݫc ujd]{VE=4ۤ_w6IzpAD5u2q::XNn~`WD|\;׺MCv=]嗿LNA.2 T ^,A<`s~\)Kl2C澳vB%x-W"s%`0̷~,S5B3}^[χ'9EwW܈jS=*zbSv83K].1rJ؎EΖs*)޿%[ zGHQӛzXWn-_-i8M%vܛw$쑰Lff`=h2tIZO'3~u=Ac&^`ul,=W@DU&Ygkժ5E&<^V]yZ!*H ҧ_]uC֖j)dETKBfeA~᜕ڗTZTqewh 5is:ǃrm7˵0ĚkaAӂl_%q{w>v'ֈϽL 7wH +M>ehhq&.2 H8ꜷ:+\pEB+W`GMkX2xYwW@%C`Fޚ26<8mlD?01O4:Q-yeZ"bdz<}]콶t*r.ދqXvv WH ֊٘KS{`yEQ -OgWUEhBUjU=vM5/%uG{O6ykd#ޙ[ -3Sd\[2d9ˌueS))2;-埽SrSqn5*-0n*-~-lx*'LS2>Yu1zYUDijQd42Sy8sIJ^|dǽ҃<ЌHyEKyƿI~2At}i%Ss;z7i)?Be>q^-w(FixWPm2WmCG&]O{V١tJL)gN&?96+Lדn}Dh\ ¢15i)N!w<5oAK#a2Ag JMRΚI&ܹ9{`[%G׵+]?>G:,ˮNn`zk}?H\UqpuJ#pkѫS>d?"ȗ90Ukr)*O-'~\Q#^N iM?iogL|֩ds*L,~3Ϧ ӑ>4w٫5IywyE3%^h;od.vT:/ =9%O{ l(O r|52z[6yﳌfB+E#V&kJJ~yƑҜ:n'|f6k;Lϼ {O znGe?=_Y26i&Fho҄״˼|N*Mŭ eC;ɯ8M#8Ga&ncmnq̱eƟW qleY:g99z4_2df'Vѣwcmϐj#Gؙwsg\/g`e eT-L?hi>%u3"x2ۮ<;7m:1*U~'2hCFHqg%Ӈ{.Yjn/$S4Ѣ;<+2ޘc_5?رʩ"&k4(sIx泞`̑CO{KXP蓞)+Y{($a_LF1MozwmhoPY--&86*Y>ܲ\7$dzvb_ :}z+6Si㩈7§A'9c>&x"Xޜ vĨ}z+bVg^=fiB'k<=Q2:-YZ=B>k>4 E k}V{S>{M`zl} !қ;cx''CA\5S ߧ@\%9bՕ8c1< Ӡi4k3S D7}?}^A>qbu>})I%jwszwDQZ1gmT`fӗX*38S}F2;c9:ۧdsͣɛ^p)Ӛ- a^EO}V=?5vMmqy&ng`ZEрۤ}f-z+xfSFT#j/3x,ӂd۔`O$Ӯﺋ8'Syxs?Gt[W)2Wx{OL̙ jbѧ/fcm0:챡LI?s*,w䨨dKVүja `lyVIV=zd{k/r,o5C3mI_>H虾d }\/=&ČRV|2qyzEeCBF_gηEޭ #{J?~M r~w>?Ãa52].H h;#*Yy۳29Eogol{;2-˽˼dD%9JQ]ZpBnT9ڤkz]738n&<'6Ӄyyd3Z3Nf-i]8+²Ӻɚ|]8&}ʍ&(=+O_9.WӖjǪk4ztOo«zE wHuLMy[Z7HFWJ[׵w&AGׯ.,.vs}=% 1/ ڊaq~H6i~= !sx0QM>X8r'a}2-ŧAxmS{-c~A, P2}bؓGa0قӔY'#Ֆzʓ΂6cvJUd+%~aLh҃:je,jPfenE~Έ^OS}MsGAɥ=JƟaFגuoy/\3zV?n;RF=&&1t2#^8.B|Aau5{$MXUMUg:̀qGmK/V294`Z0UӼf>#;1ptjG驶 r,8CxI%kj԰ҿ!{j0H^!y7M(UD&`Wѧcc5d|z &tȿ2c0H:ֵX|0agewQ~5$'y~, }c듭QCqGyEm'[VIr\2mQL)^D ~ 'FAQ}d#Dq!QO]ko0{ O`լH7 /`pc`XvZQdYyiŃ;mn:c0vc,&<`|jndsknȫd">ܖihu׈\YzX<3В'=Yz5M~}Lu6o^Ȑ| ɚ܃s^ˤ_$sbd:Pud^zDO6驪ȵG\.YIl5}j=dAL=Pr{3\kґSrnv}&YG$ۮydTykAĚmWY5٪ &ٿFH\`z&:S ߯Pܙf?c޿b+Ni=Ȍ "5+׻MѕKHO--oVw~-u0x_k>jb`̘dl(ѧ7w<ל\ug%;L`뙛k՞hSqV^`Fvԑ3%Fo5~SjAO?k-Y[NŜD{(sk'ن <y?43r~>(vvA(odw M<7BHE$>M[Y61~Z˴RL9eAﮁI{ jy[mݐ#e?x滳`{s,-ےϵ2mUnJFcx-]:|vlE55N*YUC&F#x"4vxXbzD׻+ag }5Qa|*M裳fɌ1ۄzUՄl6Zo4-J -sO\Obz%]\peHgt8ه"O'D{Tvѯ^U>u~AW GxM0ëd#p#k߮XV]/Y t>M;sMcFOނ`#3=ڥsMzW3{ثiɾ?KyGn+J6#5;{Z=&,Ӥ)kؤ]9ţ浕KNd_Z:1rx`#kĂ\A•6郳>`l&9j6`)[Ъw4iD fÊix4ɇxs`,^}d3 t^#5 pP!h 6aO\ywsw U7ve=)`\ǻ~Oh P+7^};Ph}&4Q^faMP1dw R[k}}iYWY zM-BԗX*>FkcF=fi@(VvÜ5H'zTOjr;}y{g}ݫ{zlB~<"5_&=9Y1!ʍ B 7rHX*j ϸWJO?5_K=xg"Î x&}ŵ[7xtƱMuOZF}(mwz0Ni-['ck}>kS?{3ɰ7U2D7y{ﯥ,&,̛tֲQW(d>WѮg-4'`DOzBOx-9芤%ad~L< ]wW(Wmcfޭy#k+~vdݕ+=܆&Ώ)k*ys :bUM6- s-<&k٢AzSu*7=vI$Ml `poM̨WQIsDLj5hYdڻ8}V/kAF,6K<2+~;3V>A%71V2g}ҟ#=oaݥ }R1z`;.pyKoj1m- 4N45>ciՍ䜫;w${y;]t)vZPI˹FލL<Pt+3/&l3AUT뒉>u?%Ssb[@2ZǗ̯ZXBYk ֓~RU4{Z ̌1vyW c}[s]'kpy8dM3x|bnQF$QMB5 Kw4o{͚ܽՕE-Veֽ2vlPɎ(voK]YM^or1r.U򱌮.&me4az7K^qzx݌J?>=S6?G$M},A; #sX7黮zz,=ud] Fc6Smz9ThrQuj6mziZ#];hFM+_ĕދc&lf BmZRcghZ~у (ےUr8͎wFk0+;S-\G ŽٯM${Lw=KjOq2 E܇~{MnwwTͩ`sKFӰ{YqnŽifmXޢŃsi0S20IGIhlIE4促˂ثi/'͕:-ȳAcdvş`l䧽ˌee-[WD "J2 J; `(ոBM|S2qȪT幈&ہ#z("{KGSߨ/qMw5'l2]at24wYKҧ[g(oD~ ªz`o -DU"z*> XB:3~9nut>Tꥬ+0?n>3?o5j8+#x殱^z۾1'Y*D2r㛈333[|;Yg`4ms]~|44tk a/o>Y__]d\X[EoQcQZzDOg|?¨\~VDюod4U2OmyT2觴e%*y3Z7%~!bT 9fV1x[i̖4wdz#ڷdZi0OG)Yoi7y׳|?Mmh3aϖ,gih}^J⮂h(YU3''_BD92i_3-~e&d"O͘3E_ Z9Wo _G`W։炚]UE:",n,ﶈY2F`|k5S9Jsm%sGY 1 G 4o]G#j oP`}2wxwNٿ5ޜ=JMhzRɼh+Yo{2Jֵ쿻O-p Cט,Ycem~o+UӹVŖFs̈&<=XO,B#xgtB=,`]YY||Z?L74xFm;TWoVM텕;V"µ^V[NȚ0AʑYM+ba=ϞkA?Gl=Xf `v̯vCZrDXo*w5YOh?G}wzr]'sL1t8egn_}o[lBV>-cKn7]ܝ蓕/"}f-g꬀d~7I{|BOSwcǬg;5ݷ(ɺgFAؒkz2wgxƝP)۞{֗VШ)g<:k&z;'۝1}fwۤ1bofdǾ|{KZ{ַ_{֯U'ʫ$K-<|Q+*~Qu?EW|aDקl{}̶SӚs>SKnx=Q2Gv9f'i15ɺo2][~[y+$)q\ f RK~ }ϟ z?XZUxhZ BW@Ss>U|@X>y^0XNPЄ}ʚA0UI~i&C8\lM|7V{hZX!Nnw*IZ脘)F~ۊJ&Q[2Ui3"y[EAķWoF+3ֻ㽿¢1zXɼgjux!u&te ݶ1Dt6y3zf%YQʝH[x_2מoGZo&Z{&xIǸ^c(Yߵ̻zM-8t}R3;'kE ADG\;|ͳ7ޙ+dFJ&[t\\#{ZWjNZڳd,ATұ:hR`(D65,fe-<곒5sv㜝>U[>+)YXsMV^mn[xvғiGmCG6zM zgl51U$Ad쎝7v,[>Zg;{vlQ2C7L&> 3omyfXoblw5q㮽 <\㙻Scrmʛ/,kWi%&*#)kRgN3+]͐'s(EaU2VhP3Us:% 䨓'M 1g!A, Wr99ǖA~33Wz2x.k'̈{'S{OF{&#LV ѭèH5N ۇ1J9F8齥 k} VOgdݕx"9DZWv&Ü}L -3XQ_3.<;ۤko_CYj91פ&ēVD13TuN '{m>Zkh:;Z{qL͜zK{7Eaoq}w0&smU*Q<ǧ{jzko2PT7xE:M׼W盔$=<-sKMGo{ssuӡ5{r,{ei,:o7VOYh!H~[ȸh&ztMCP9gћT6 Y&KTȦIra/B7t-y;s`4_`M`Fq#zGv;#:s䙞K<¢Ңjח: D B0%? KUcE+YUA&{O/sIA]PQҀb=?Gwk-2Z1{`2#|3}Ok[0=mRKeW/-h_fM<vJ;^61`b=+H~^#+JV]dt3lc9k'TpkO, (m+2wԿW2QzZɴ̺h튐%zw ]8dAΜsAҁ{.e6"48>FyO{d~d˭+_|ՏWykLeJUI~> v'h6,@x$Gǫ"ǻ#Ȍcu}~kC>y~1:Qy蜊u5 |k`gog`34XP@gcUEqnU_U1ʘzyJ&::!#92{M34E~7w/zEa1^\eY{+s_~ow/Mk msA$,67T3ղyj-GYPczVj6Z9Yϼuo=Nߚ׾4rrCZ?zh+M3-F^Bg"@=^_M7I׼yOY&( |#jbW{bM#r$ޤ:!Ym55[5TugT>EwxtX/;Qf2 \+Tw;ރgdNڞ >A͹3a+cI#5xc#>\d"-E`gLt}(“&'q+Go}=qN egdZe*nD IWPdW;s֩=szM';r>3M;,k4{؞RbD0qZHgx:)z ƕʸnr@eigXtԙAzwV ,&.]ĝp̧!3jX# C~r~6r[)gTw2ċCjwezC2myMFֵ b\=a}42yq履ZZ<  F_)(w'̵`3mwMc2Az<$hƣG}v3+k2=s*wRu#"gE?nfZv-~F.}I'}shV,3z5$;ѵ$A}d}ϕtt͚{ro b~%GdXXc.ݒ3A30'5q߼ #cO{ܹ+lL$س'1{k.ZWcvv6eڣό)# ǔk=d(W;dig@^fɌLedK.Fv)_F3~%FrJR?Ya/sH2ZfL~%cY˨28?~~UPߺdvx>I`_0<4Sun,ڪK>GgUL>OekX:_<[z-lUQG6b٦i3?b:BX^Oo3ۯUi ܪS\S.;MA8kFo<]Wuxk$mxE)sMZgkY;C-KsVZn/gZ)y= S-w,ܳェ Zk喹{x0ƮDw} fzFo#DOF'OɎ(b곒GE%wT|S{ێK,3>b3V`56,ﺋ{Դݸi3Nv,LڰfxM==7YsǧA\gMݦ1'w^̪p=PUMcOivV[7&̻9AxLk_uOe_4edK:M<ɧE}F;ϗ{ȼר`o951IF('gH߻^w['[ְGlq4u篚?먾W =lgMk]Ɏ>desR/WD[{T{[~8dm/.X&|-t]_+{Sw5r.ZzKfzqݴ(Ax[Y&gmwD|#zžh^z$q\9p1yȿI[Cn}7zV>4csԟcۃ^+XޮS=b9H*?4'ϛDXΣI>K// Rs|scg庎+ѩβ5cPVzة6H xși4*#lhihҷ>be4{Fd]q>mߒxƃ<&"o,%5yq;7+Eim褐>oX2o5z"뙬^%|# ƌ1MÒ0[фS]Ў]%cR[,[&yÒ3{j9GZb2of8~e8\G4.zd_v6{ߝt>,%Ӿi+.r4+c_d^rSƗ__DnN_5ټlW4̏>'dkJ71nGliEQ i&;Zz}h]%DK 1P2$RYۖFiR{WuDIzlo~f$R#*ͷfؽk~NdEFWjA/w[{Fd|A|VyuQ2[RP2K}bEGݱdzAc(+e9r\bQdqkcW}Gho.)A:zaMW,fe<&LkaPI=UcF~,};”+sIA=LSJd*R:3橛|FE}ߜ Q/#*izU*9Ԅd\%_03 ,0z Jٟa$FcڿMUw~ sGj$Y}QpAbҷ^>g-KCZّl%{_?+ ɴf*2!XXZkRjfRU)Ss02?2@i/އvLb.ū@yyo򠈃^bE2 wa21N|J &^#_dh#z-_;_Ҟ AVd~F΄ӱyϣ<&^#bw 9_'x@Mj=_ބmK~vjad050MΒi팆ȣTV`e/+H5}Xjd|i;SN+{O&L3w4jcг\zf*Kf;bZۜ994R2ZS6d]ְg6uN|:U\{wvU#|kMZ2VafgDy.xOpTd}|Ok]^U]*u=mk!m[$'j2P\eIG`Gy`dV%Y2^e_3`7WD(\=[*J$l 1lB`xϕ=|E͎Di{^oz1_쭃a͌[U`ZShScߥ17Ѿ V'IJ<춒I;5YĈkQ<QpV-IO[2ux؋|"ժ92>KW2hygAw%b;(13]D^IRLo%̨&廊ݣv#KezF:qn~eLM\qrODt%FlsVAW=M83QpPKgNQ)s,ݤs-ns %ϗol >U.Nܢ\825;qEEkIz<ÒNl`ZJf bLBsX؜;o9-os3Of ]fO&Hwgd<3| |UOGLN Z0Q֥o9澖 kV41d'#Mn>7fvΚ}Mx`{wS2CΩaɷ=Rm| -3WRl+6黯v*733 {@9ATfAsGMj}6\]m}}dsz0o,^^@wGqvoQ{~BrQ7 Tz*ZN=G7,;0i%ӳ+T+Go3"!o7XqY: K4=F 4DSHLe 07OsNa;{x"EhOiK?-;OfO⾖Lu//~rr5="zgoG;i^d+%~"<=-Ye2j(_LCA+:|55h֎􊚲 Eký<ڗfRqc4{^s+OA0s1WDqrvrckgAGf&_Ѩ`wNWW=>%:9N{>{}dF8Q9mIG01XFɌyf84_Rj3*YLFeSd-4Y2wMǣJɔe B&/,eٞmjYua=2ɜ#̗-הt=a0z9#փhoYA[kV"Pe+ V͠dgZ YE!' ݥ 7R3M*L;H9&"JT׊aZ^~*ʖAGfSmpV} }{Kg0L~dغL2Us%c{zud JYoR2c>+d[?=K˔ƥY, w8ޒN=b8?Cߣzkf)(<;%<8z[{E[ȭHoFTAe'OxlsP`tߵX7djֳ}$#2;O 77}ZJL ZswP&~?= e$tP^h/IO}eh> dяWQ'`h9rtJsan,Wt2~:jk׃5_. s,HOئ': {>3@!=ғhJt }$W{OWg$[o*iY}߫L5皸kGjfOozU ٢8ֲ~3ZKx=sY'ΫS;%o1nI-}FڕճHMo<*Mixc} m3Aꑳ,ǘM|%wf-e0eMJƮ]Q>A=Uw$d-WN@Ko9u.+ loon˘;k%;Uwj>l[H@Edj$Nx<&nV3LA /io?ӿ ֳ~2X5+u <% ;-i#͒)M9ʜLȓ{ٚOKHxu$"7?dz߈o2 k{KVt4SeaMoVyOZfcn\DDngolǬI V+rRxɔ׫F%K'S'dv󾷛Ǚ5з M>D7_cu*:ˣ&t[b'#;/Yě͊9R b 9ƃ4m B2";2ڒ=ߔL;e-m--:a_ڤYNjʾj{cՠ&7>}:a*Z%ԄPړ2S131=",2~kF1I+&tuJX5F9ҸnmׯsC;oVxfzg9~w~zP2= mRqX΄Y2%cG+7S|?9lM۞UNƻx @瞳A+ٕy,Esn_7KFǓncVZDS5ɣ{0LqӖ~E}B*4hAj۟<(H5pf }unEzgg~Q#`ڳ[F|ʊͷydjd<23gfn9gE^fɕW77SNplAz->sy(rY潉rOFyq6~;ѻ"8w[Ja/~OcW柋x5c}9ׇwbb}likToC@Î&| |`wzA^U%%;4;48Y2wopbv2('ز~{)%$%n{^YamSW6v+%I<&l#,RJfK Aج VY'?}ִd<D}rƎ&* Pq\y^v1aǯ3r61]S=SoC{o=⽃hyK'i2zmyxf7`?]<#g:3`jt؋mڋ䯛nk_f;ctE6Q+Hrg.Hn_r`MDX }^S7G}kVqs%Ӣ޼7?s6֩^TY) `,J{6?>^sKI# %3JTŠ ҡod-A÷d K~Ov1֓/H6MugKN1WX9a?Ul=yG贠h=^]EVM|nsL o(BWn K}Y/}k&omyqOF(jEۖI6鎑߾d 4\KS/&O͐Ѿ'UD_=gjbԺ{>WE.jߣ/fXw-RYl}Z#,ȣxvPxZ4Z+Ywtbk:UN."yMT/k|)W~d K7%coɪF/f󋖿*w( Y:oY&FS F۞J%v&bzu:dEy.1;37a,AãdjcڠXe<9~D_#^{FYVhG~+v=$ÂXjЄkՊdH'kYX}*mϛZ75aГ,]8YW±]f$ Aů9~I5J'Wf3Z9r 5x0T;˾xrZg킿<;<%NhNr <A3?lBS-͊tW2Z3%3ÑHVQ#y[XU>XwF?X,ҷ䗒>F{&xtgrs>cożM-sWQ]d4CƲb컩I͘:4#D ͥI51DjPqZjk{ Mͷzz+,h_s.%g>tjQ1aEsWKUVˌ9GmdЁA6XaIё%nsƫM@g/xvƛŨ,6ΪzDZSD]q3=&ӂTSuZ-!MuȠuE2`Y~Soj۲=3|ꖹgHRcj5ք]g R \YUicQ}1XO"?ɭ0ߓiɺ Є.WȌ3}e9;#no>x0o} 7ޯ<"F.GݻdqbvbŎ*e ̼_y~6tIlgq̨ZiԎ]SxGƒk9'b7n|;`ɌّY+hfcDFsV+g޷3ܞ=>T]&;4('(ڤ^;'X~dvY2%S>x5N V>d\PG1V •Lͧ a=ӐJs_5S͝w>fH[il>{ܒwĒu]~gHRI([x{R2ez+kS^5Q[\ڇË|}2|BsvcݛМjW2w}Wٖΰ1A|+뻚kjA߷YZ)B/b\e"]}I,K8&RZd͵br$x |$GB拶ϯrndݑ#f{2D>]5\ꂨO&{_rd6 iѯ+gK r3.h1~sw <%!뮊bW4]gE7YsF}uF=вh6q[$p2c<%H69la>&ciIJѯcqs>H #FT_tWk0^?G0i'ͭhY=_1~wk֟mdh<O<#B(42yE$<+Yl>_2-u^<_Kkx46pA±og2~뱺eJיbTEj>W}{;{TMx\W2inӄOF f~ǯg.Uh7KhPF&|>)dA7ֱȺX $yu+Ize?Vvư$tjɺ0XzQeetE $6{)%SNyLVzYV{֖dwXJ&,h>7󷯜U|=jsϺ|Y/d۾ddژ QG͂T`tV|ZsZF^̕1ؤV =oELztDۖߦvGޞM*(d/G8j#2j>ixH bmes{OFEnmiix&<ߩ-{8=,K !IeYͶYO}N'qvK}sSb 5-X;lvV JFudM qS=$ nyG}3a0~SGL=%jm_O( ]ctV\5ڰDW]yװ 'n {шHe}jvq"Yȹ !H^V|W^wym_mHw_>GVy17ڄ՜3wG}['ۼι }5$3U(s rOˌ:it&}Ͳ*Ϙ9 k*x5s ;wi_X^ p{-]'5kSet$V}+s[CzpWڟ}`-D}"+[;;A\͘ qDu( hkٙ+-aF =фb](cP_V8zqZ`ҲE&hgZ5ISzghla,< ]=;_J1--5xoLVzuɼPe(S*5|Dcf{9hnjEsWh7Ϯa#Xq~[Y.xdzcyɼwfă2͞uc˪#1܂%SU1D%Ӣlk6g?-zlW4nli>(}3}˚5z',؃Dɴ)YoѵJڲtmm<~4\250w[w[;"L_Ȓ T5q LRӒ)|Ey5Qgux?YS:'E$rS㲬\n=&V[lKVKNa0et輕ѡ5lN?QFb?=aSĦeC5GΏuфW$\{U2g|`tjS:nш,_ =Gޛ rV-VstCz1N߻t{ɴrЂ>6__,{teiGWomYq?ⷝ=d/#Zk&68Ỉ|c`{Kws=bI/zs)Ic!vY)2{ rE T0ۚ תxo2wZ~69X_S6eJCνb+LaWc~cibyL ّ CwCwV>>y<ڟރFVqiaN( ơ:~Dɹ } -{exNF`5}PzZ<"<3V5݄}AhDݾA6IjX] Սw1V<M=AGs,vѩ".YΖ53JF{ݚ䟼D FN#Ioț̢x#Yyk5NgUw[_حF~ΏWܵݙ殱 ,y!k-^}^}טۙe6$JQg5)qj,ǭ{?p8BydG%3bui1c#OZ%mrME{E$͜gzbx:qWщQjжg>!DlR ֻyL_Ly.5^+a{Y)=qqr+rlsϿG 㜼g*|M+K4cŝ3hbz2"J,bu&/<+}l$d>wΑ{nU6x# Ozn?-g3}&Sd93G3SZDn 5 M{fx߲YSJ/<Ǜ>Sƫ7sA~z0j>' `B_y&ʷ@N\ˌp`lm:y1J2a|fV^Z[kyze<6xA3h0>*mQm1Au21=\:D|j%>]%U)7~EHߪ^#e~<ez֟tZm)cBlg5ψ4jK\4mgXpx" =JVI8bXe܄fk)x$QIv XQFH_*:c$/"Qw-?+@Y%?CMj~ssW\Sm[2Z2xu(D`S(wSɪӊ|V>巕h z^d֣ޤd}KS lbdQ%wgAt@+ mĵ_D}e I[.l]nnʼn>Ex,=]m"ܮP+z&kJ9{[yLo묡%WjGF\8b1di12 _˚ /{Y˿}3oAPى^ *_+trt{&i/1H۝v0Ww\M_\ubYqVh_ݑkqC|XϽ< RW`ueRsE~8 'RZr>(3ǔVkZC{ Y%]^ڡ4겱ɺ3v2og -XߔLߝ/ +x~m0䲆-?(Gb%pYxvvc4z])Y?Tlx?[6|aS5Dh&i&sAx]hAh~!\ȬAXU5N2: G?Wڧ*YoJ'c0E32/#mӪ)=F ܛ=XJ&zAc}zZOc̨d'> 2)QznFMZw}άȾ_cje4@JYGo ¯J=d;%dVk~ׄ]> +qȔ3ZDJ k.k=M-\ފO[YF9NS2++E1BY;9 E躒t1"2v_ߣ+%jUkEzql"q%E<3פK9^ql;--1Y_b_iuXD+X삤=: ӯHW[|&Cd=ۧ -𨙞UNjH^Uଣ}QqӛM&iBKuiz1+x<#xʎ*Ye ikM_>랻V#+% '|lŘ+eVU+MHVK8gqf^7tkǾKrfp=E*+9{qW_o[2uY[lY~`G8oʟMZO S`F( sqqlUWhnqs;ro>j&Xֳ<h“}oh_5.kBÍ܎MMWCg*B/c:FEX+9=fǘлsl0AmZ3Ľwx,'_3-qeZQe&&L0^TRUnK+K^E&>Kj oy=|Bһ jδ|5v;%RAzל7W|ڳ5ZCfp>S3˭1dU^}:IY胨OvUd2~}[뫷aUF؏+yTچ)m m}юǯtraﴟ >&<^#(kUX]M9LƒJNNe/| ~e;?"E):IC7aНz*otZحyfdս3P,,SxcƣDipv_LJX#rjT2a;7cɪAG(cK[i]\Ê F?PޗUA+'{!dQ>5n~YFMosO FG㓰*R4ƯL;Az3ooNpm=yoKFc.;H.cƵS~kv"V\y=K߄^<qvi.7j!#7*N(ܻޯL DrA9֛={ed֌x hbuOٗ` +<*7g|礋"\ |BWQ#q[=X}5gjW_A8#n];ugiet`^6#ǻbrkoh\(G(=y[vg{>DO?‡`+;<'|`˪5L-n?3rNՙNŊbENVkkEك[\M#̏jλ_5QX3S&K+V{!-Yu~xJ'S+++k#eTO\+He:+:;Xr7~d*R{Z,A|[]+ %ejd:@1M֨#&jY-d z˜u,qJESؒ(5Y"ַ%c~y&=h3k&wr"Y V|L~[Э6}>dVx:Iw~/y-7IW^=-9v=AXUE4kܤrqa{;|23Hq߲~GfN0k`,d9gYwzFd_Fj<4(=*d#hWYɒ#(-,9\qX~[5sJLMܑ*A,:HWT1_9<s&CE\ce,n2l<32Hw?:< ^}d>GiK"l4<*EݪR[2e<+SQEW* ҊM@;ݵ_$S*9~PeodFk>T9'S7˖Ѫ喿|f>eAJ{g8KOdWQI[Ue{`z:M.%@-{R %Ss~:Ɋl[-cWdf-?JE\? ՚d0dcdSVp/R9/4u=?U%IzdJ/Ns٤FXd-Zxǭ)~ϒ\=%ik2<3!A6 qAoR<;71 ӃJf3HԊ;˴ &6 %ykOeT[ҷ=BH]ߤ:/w$5ͨo7~֤N3ń4agVK` 7QujMX7ZH Ww,;-0b d}66Xփ: PׯvHTjIg1VxN ~o<2Px)dB׬w*#W^+3bj0=I{8ԓw2H-TjՖ_<&W]1A9o³)3ёףck&z#伟n򸚰{Yk? X6(-]]_We Ԍ{9~ǽ|ڒim`=>A}k-Ǟ+A [f4Zw_3S]=rYX[AO<3 Z*#\|7ڄge-a]otX2h6w>mFǏԎYW]r K3AM]壔,NV);֓&ES*m06ni+JZc դ6FPgO_kڏ׻W,Ͼm2ey 1ݧju6cʯY#_ɏg AzS(P%:H*跃iٹ31Hh;{Fc7QPѓm/~KZJF_*t%28s']u&=-(ިZA:j.Pkn' D>XQ'G^`=)6ٻ_߁g/=kgPLLA֖$v t3ϘL6Jr=ɔ3dK E|-nX25D39JECߩױ<;9=x{f _G%y5mYo!,VVƌ`sz+H61x20\e3.k)̓N`z1߀J"zBo:jdJ4==kgex#+X-s9;i}ًLƃwyEvVޯw᧝SK'^0r>8$S52,%.LYG#uy#G)A}d޻>5nB;vL%:|"]TVc{L#¦"c49 /3R(gXfɟֻMG`UQ<,ojرMԀשXF |^Yٕnܩԑ%c!uـs~8'Έvgm&͙$RBw&z [9kzqۊ6~ ]\_8'st1s<`EY}0\.T:'qF OX62bf+ ߥۿj` tJz{52+U}x1|k~w|Zqmu6x0H^3nMŇE=WPKF'VثݯsW[/yS'kҗ8[^!OC-[rRd6~C"3~=t`F#HcYf^='ǑU52BtX9oO#E蕱㺉/6>R[$Jw~g<ij,JV}%Ms+3heNJ՛&޽Dc\=%m,r3Cg:F/GTfd{ng~"h?߂`tYddq5c?-ȜQ?̌Axswf|>'XޙuvS4zYk'; jnZq={Q*=tg]7%Wdz _dD@=G &oǑM!vW{ggh(Y%0Nt?o'YFیKl-l >%G1M{~o홑HmNx]mm6RIDkwY[֝s5&ӫdȈפ}=ojvb#֢wY BGg4mPXr{kCgV /TK68[Z ;Nb k. /OÜkIiȪXŻ] ]s]PnL^+#yGq<ߕ%v%=p"j 6ߔݼw3~~Go=2:M6Y9MxX}cɔXF֜m-['}fGDV8Icd``ݻmYZjͥ|>;#)eyvi^%?V_m#UfGrǚ"wi&3mSTy H[cS!Kg=dvdV,w&sJ3[Zg}z#} rdΣ4ZɶP_`=Ț Wg'Sh=.4?Ŕ o-dt=p&۶jWؖ3~{;.oli`zcRuѢԺb3R<$|Li]juD[J((!2(FXZ3Wל T48~+{#>r\xVm%O ˴!"( 2he2ZqfaLw#%4#o-`"Mz M|Ew6gc Úx+J;6r ;t6a✊_聚mk5_wpVht7_;U^+gm6a%]5x d;нA_w-b4L]q ۷JDg5Z˕~eGY`mU*9H51y A9t>u`~)Z$+NhX{&_2:"c/vkhLMRk0=Lu qm+鍃`ՐN{M1FUEZ;箵2:Υd J _< u!Q ^*=rD=&߳Io\0v ߦX}%!yn%8'򦈱Nts1#P߄ܞAmJtA+ldc#(HK>N4{y ?%%oxdxM2ZzuI%Q:XY xв7o<?y0; 򜻠I+V2Z~9ZW'z&,Su_7 M=oU >Ȟ&=&"d+T2Eo[C% f4 pZ3]mgtVyMKͦԄ|>1xN|uEs'SQ%ђvKF[l7H}Eh 8 جd1}ơVZح>6Xpe{;z{-h_E8ӧ o(ۋR`^͕Vviv坰C2sa>3ncӻnw|\2'(3憽Xdq,.dvwxY^}JY~GM͜hYsLq0ؾTHmJDG/&zlRJqf֭1)Y_g& v7.ƹsh1ɔ0=3#Td3ݪ5z-c)q*Uvwj,{C\T[_E|-OS2Q2?5amz3FoG{?^M+4NJ}T /zND_cam;6_Ghnj;_(l#K fIBv/ z5?+Z*>|E/ɢ&zwdycC;+GZahmhON&ZnwcɌol{UsA1Yّ֙XCϏ&eh6۬ykŬW=Sɔ<ǧǜz>Z^Br{1[zGi{#[4oM*g/ɣ9DS| QWDes}9~ SKx8l&sk5n{ s.>tE Z*Ʃ/9ja;( #4Uz*I[ _kwJQZ q5Ũ臏^Lb>YjpWZx"g$Kv\Ow^+D{{ӖܬȯҢ[=h`Ixb25gk`|h+j2-;sB{&]=,Y{\^֫ 穿T&gɹV-J&׳{z"4a`#G{VN_;^Yڤ:qܴLЀRm—"% .iGjф|DMaaA3,Hz wg𻏘u>3_C"w( D79c%ӫ補>Z3hMC3;Z%ۇAN47,EckTE5d#ۺR2ڲJƟV_r+sκu F ㌑&=m!CFNaY2?gc V:JMhAV~5ej.1Lk8ؾTh yȁϯȁ3 =z'FM*6o[fu&w [cz}egyKχ:2aiŽX;"_ʛzj϶pywݷdd<s!y%**C;ݛ^Vf54E?yGnez&rF_M{/s3_~^A5UϱQ.F+}͙gӟQAx[g(ٺe2HBG083VIۈW;'㏦VAgi'OsmR͏%cG`~\F﷈dJnkG-Y{ R)hhRF;z:WA)GYo3'mv;sGc* *X&2vd~{VLk8=b` O %Q%3rMJs ~V?';ͩEu2mzb[F .K5&ɻ5!}]4i1JAUtY9b}=eHv\9BksAxEcg\)ZY{) -dvExv)>;֝qepr*Sx\{ j_1rUMZ)ŶQ%+J9vd=27+j&~&%gV lщWX#\v%SsGdJ4[s46s-'sTdRV&_1s no睖&;%3jwux%+U ϻ6m'Js$gͺ?yJe]9c]k>^O=]=qK+qR82 kUOJsJ<;{Vs8'In"lq{%%Ӻ쪒\GnӜGy5%;>;V_;GlmwkwH45gX_32 D\D|z5ʲzjV[Ӥo3| %*->YqLP~M~K䥉>2Pqtclg;#9FA#wGaƝ'c,=7]qh'oiJC)%o~SDS|_D%狯UcӚn+f(y7vG6I9%P`~| R^2_tꕹ3c\ɔ+t\ahc̏s~lghv0m?dtZ265:o j Xj=AԁNMعe9Jt*9Z$֠j(?t =c}:ܲ3gu\uDQ޺P1 F}06bꠠz->GI>ā+[ ل8r5a- Yٞk>wDۯif;ݿ&XM.U Aܑ惚W\NuZ0Z s7`PgmjVz:^J.(=3ڶ(Ykd2kb$ߒiM4Xȳt 55m?̻hddɕ]ǽ7~8d]]OoRᩱ_5Okge+ImUڄ4ҤVȘ zwrwr Ϯ*Yb ycA*W[%sZV] RYi߶|1h׹Z;[-RynMkNZͲM~4 W̬_RZ!Q Dfvqz. 4m6mAi"pJ, lEWy9 -"<^=- X9.닉sSWD=!:<"k[/;>&1p0%~&Z=wl5۞A5;YӑM~OMa%~6DVX-ELVM޹5h'[]U%mޤ6vժrƜ"ZzfJMXyj>].e؄ș <z8о@鿣t_NsJΖlMKWi?aAt(UR }T{f ҵ}CMI'Ӄ3Tu ?ʯMGQ /;D?[#vM]5 ;iԄ97Z}2;^ 4G彴MzVӂsf`aֹW!YʽA9իfMݛp8`z5Ф{f ¶L;/%5wC2=m Z#zmlpE|%Nx~׎JfI?Hw?O g9{(+ =+- V]gg]\D7#֛r.2-s"ȊG <|>6XVdyNֳԗs_`[musY]dlɣb^%>W2Z_LSVw+."&'As`{Irc׎(mz[2Z"H}M`XZi⭈b%(a['-{=2'Y;[K郱 G-.[46ZƦZ}eQo GvYJ"-X}KM* >Ժp* aH ղns%މƔA.ْ}-z= d8[ԲY \gƺ+@ɶAZ/G;QbYBu3VLA0dzAzd,x=;*='4˼QVC*; mhFf\㩑9X?5?لv>c$K1"VY&ٹاx5=41*1ǩhbgܣ3_YZ/YHZN{uF?5QSuʻ>​TMٹ'0^Qg*K5+hϨ =wqqˌ/-e[k.,}*t-[G-)sPxQFZLPN:-t؟\DَלoY}ۖoV}%n蕹+W0*NYJV).r^)Q7 R O&]Achh펿7q:k gY%5~< Z__{M}Q,zH觶BKFD_ Ϟy)>dΈħy}b=|":gz=M2< ]vDk*AX΀!+Hmt?GhYmRc$ S܄v5X<W+h{1r fe[Izq kAQ?A\T2o~9֧ߑF5IR1i$K㥨B9]: 2=^wN?5C5/^`|Yg3);9* $ j1cj>ƺ3Ť%3ufyi3ayMEةs`5= {EšR?7QV֕x+JE껰snsH̺:'xK+M*#k! cO7H]kQ69m{zM="+_[|&;F#ғU2)9'0~Cᕽe,˻aŗf+_D˴$uػJ H>D(kB?7XK;fܲG8HuĨ+>,HmԔ" fŠ)? WK٢eDgWɩlfvh~䴈:!M3W3FEj˶9G8ʾrʦʩw;@h[V2;IiXF`+G'ߤʼAOC"AX_Kss&ϲt޵c9юyJf,}enBff ]֒\q7d#f|`qۖM2(3%jde=CE'c7!gd`\%3Bj< FD[8hxGnB7L^\2%sƷaM.Mr,&w>3ftk 5I`&Kq꼑$I3qh.O- B͝ƃA_cd+Q/%!ф\@)_vI\5J5>+dXf,җ+(Տ)9e?Hw<\Dz{F"Jd޵gqnyÌf_󂚻̵٪'**R9ݼ7"ziՊosK-0>sAz3}ɠa0{Dociү{&Ֆs;#O#2j>'4=#ĉEz߱xmmml_f""΂E':J W l "8[3AhZB B/|SX} 6NA~>( +arSḉQJ;*6ƨ"F-7Hl!cνGK!sTߜzV.ZNPZ;zedFao6~jhr+Y3DM+qQ_X23|h\)ByV:Ho$ɑ|~ =αZm†\>#{ٖP2^yj)QA+A*O9vp %NyW2u 2"杺ikR1,}^MSKъ]Qsb0~:m" '&j#_-ѽd}꫿5Ye Y\-r֪Ȕ/Qo1@&2DQQnZs᫥6i /T{CQ\eKFi{n3{q5v3ǎ_Bk%_m8#c nA8zgC2IxEj{쩑d3-}5'Z'Vz㻒x먽"E/Y=+nSMFd>:O=׼.~e*)uXRnڙ;#Ӧf`lE,&J&2J$ȵ?0X5TJֳ^+yhbV,3޲iY žYkfxxLJOٔh<-30˚jcLxO]J^;TX(K!YG&j[Z(ү>"uӒt&/Dk*[+C(]ό8Ժ}iB Mm? k"6VwJ-=(mrkҝ/8k༦57[糝=N򳌇12J,HLn·}FiQO[F4Q"Ef4(Gl{jJL\ݟ=lVJVg[>SyKM\7X>E|J[|ze,{_M3}+H҆4[GWz/2ׄzT)%3v?[Y5H!MߤBS_M*Y!< *M<"w]g`ͽ˲wbc'Fl6H>v _ 38EyFmbTH8H_lfقOl0[oak^A1Oy:1E<}jM*ʌW-Y3BEXVk&+zL]MDgdP&ͩSiMCK9Wh}Bq ¾9+t.u KvQMJljیMǜ[йIA'j61a(W<7K ; ݺsl+3bTd,KV+pZAz+*uK~~ dk~&U;X{*Z0q]J\z# үGZACQ]k9㙺dFKU_bdƿO^5Z}U _ɔ׌xKM*Gqy-Yׯld,MXg?^W |&4߀.ŽFh~?;냖]yjݺd잌M t=mxL FoQAnZIz/Ǿ! zH/6VlN3+Zuw}AޱGOsf*dlK2߲ٚϻP~MY! ՑT'*swZ5d퐹g}WG6":lxrok97g?߱r>+–ldOaΟ-(Qnov7A-cR^u:æ3l+VzQ#ȋۄmvKf/5ѦnuM\l=S#~2N01 ^=FkERZ_+aAiiޝ/H"gjdһ(mtbvQc@|6w%c)$ٌjd.b,&=Mٜ93+ozjwƞEzw֞v݅7t>V?sv5Gh6_luK-hR?qg6>M; 5L (Q2qw B>^,쟴_.*3mwneTF咿e>9֢ahoGGd[91R1Ah(U,w"~P2g&s6qeՓJM#ToJj7kf&qjap~/;S( wh1X!͈ ռ%BΊ d. 3Y%3JZa`2*V2}odY=~_he45Wp9u0{`Z;f9(Z k'i0\EW~mCqnEzo SF=ۂRwdZ-v"}ϚA &]D $\һ9侱UXZh䀘XS3A kM=HddUݭeU;i^hzgbe}MKwEԊjQXd|Lm~c](-=,/JXiWlx>"|1 R=53UĘ"kO^jZ'8ҦޡQ&GX0A"Eh2 qkɴ 7N7sF zU 89h}2JR!j5iC\-KmsmzhSM]2}#bb?żHڔvaEc VqN#֣ewfI*>9O5π r{`dL{$-6yi/\yգWh1[+YޟnQV>$̳uޭ'5UuܞiI#caMwfѧΪڛW<7O I+}vf-Wk/'cr3:O?7Q֏TKx>)2O>{"؟W5bEL;a$-a샞H{el?U%lx (WT!SqfU-x2Cwo;DދVδRdgLCƆ6>b͎:n\QA MQ)\?=+MkeB2:r4ad#UleCur]ydY"P=#߇m»6vܮmӈ,aY5`[{1L #N>0ɼmO֯3ͷgr8/5 (cNWDx%^ոdtW;뒩:c͞g߫]iZdaYձ[ҨMXJ֗YxV\SyLEXg%cB}ZF&FgǣSɴ/7֜kASeh6tU%> i +F ƀw 4왒<4yO%eU2ߛ{Apf|> z&xݷCEW7ƹiMҬ/V@h#HlYjЙK_v1c= + }Y+qOi^e**.g"rNd<Źk0___?3A9֙nIGvڵ>=XU2wUǔ]o1VN.O-YZW 2/6{pE%0}Cyd?%ozCE5j2[F9SPAzI~ߠ6=5uD{|De}Q[u'~^A[{>`&T^7 9Hإ b9݂KZh{%gXYdl>dSWZ )yJkׯEU"9"Zz iڙ~NFCkU6Ѫ5zE}yR{ }=9_D;=&'-?Klқl!#뎧iM%>od'K"S-dq%gmoT2OP`Jf0ǯqOMD9%gZ:n0s.p޴6eYUϐ$]ؤz[nz?gWyO"-cG`N7]UQΨٽA>:`饑}vvz㌓އ/LV|:׎`q0"Zwީ[DM|Qf$ ݪ/=Sr>L GƸ*߳K^oKDP;U;4R١VWۑ%-?㔳&界>x,YonN2ëV26m=ݽGO қ(W;23HKA\ +SɼY`Uf^ AV)v߽kWڷ~bYcbD[T\B0-N~e졕S:Vuv̈L,,&4̗4X-ǻ5+ۄG|{[: +V():UMdZ6c(hA۬SZ;ғKՖK|:O&i9>G%_fAikp#v֝ms.Oܲ~e33gju5L3J2[Tv&l<+R}̣etmzZmr&zj ݷx0|CA>Zݯ\ɪ6`5Mq-7as%+Hw n hA''QgUEs_:te;D*~sOM1Vl\1)Ak,8bHفE3`5-xkAjGP.cdK#`֋4{p0#NtM_,KgLLVs|V4TGWGy.zT:sxwRkd{0Ksrd1rE 6v9jXƚ 닛VGd"rEjsx{+y[=zN "+/z/ K&uzFYsM3G&z'd}fִ̳W%Uikޒi5~jMcKm\IiY1z䥋ZSX4Gؗ/8n:>Tqgm[AVL2(Y!b/ z\m1}=b/>Ym&lGqe5&Ɍyĸ9lRٮ7=dqr|/>x9X~LȀ $׌8h?yxe91#kzշʼݚ ٤^< -Ӳ3KK$߷RTkJF/{vOzHe =gPNʿFxPD\aAg4tMekimO2Ʈ[5H%LlMl7^_Kft&Ț*5s=qn?EcGat;BZ4CfKIed=gOdd@d0'feޓ" F&zɼ4 |w B^1gԮ?Ȳ-E- JZH=5L}bTR Tnq^&9}mjS-d+!i8_A7 bQڷ >꛽VJֵV%DmG=NH)NGN-뮶 'f\xfQQEX0OgoghۯS,]ZS؟LKd*үG[*3cn+Eџ܉|nh<'JCU:g\MkqZM3ohEÐ3˲J9&G۞ r|=nǸD?*)7B<|mi ;d}0o~D-[&ջ8mvNenEF{\c̝$ * ooLKj.H/C;+?fKU(~urd}=+1z73Iɷ3i^{J% - 򎊟ޅDmkAX_Zeڑw =%Ӟo2mvv1;4< }0J?7zVsڥbM`9JVtݚzrv 243W쎘P M6`ӫO-ޱ%com[XfT^h(kQsDDQEdc x̜ۣI=LO˕ ^z<[ ڳO-Ƨ+MhΖV2՜#=T-iA؊Km8s;nIIyW|\-V?r6kAQ+G5q2w 4qf b`M<ӪW}bn33o2;`{53$#IkMu׸¯MZ{䁷>8uD}Jg,?|V_/%&Cײ{u0WӼN"=W1%ǽ L6hk?z06`>~2%WZ ks?vۏٞC }4c0-'vadiYVdz+E}냰vzg1[lk2!h;|n[/ Fe w޹JF_$֛tݰt;WZɌ y]mi=ċHbLAUoPD/`, =XO82{\ZyV\ejdaM{kw˧6ėH dNN;Ֆjzj~Xm }W24jD1ζ ܞ'n]Nۄ=XȫFʌDי4^}׭o,`Ff]Di{ʺHkvT{ +Ӑ{<ηVIkQnE,M"}ӃUYwl&*]'kie#^1E%[yxwXƦkɽ*sr< Ԟ`DyɌރiatْrljMz3'P'Md9N4DM0Zqc{ъ[> kY3 hKݧKVM_*z&|b-v~vOgIΥ=#e 5,c BKvԒѫ2XmسXgKLehK=<%c A֚AjQv45nĊau OV(yy-X+Q;N/2JV|'v_Ҟ[5OY:2s=n-q*}5'3&xF"1=CARϺ1.D\םzMnme 7Y2h6Qޞ-O;;+%>lѶgJƟrß(r$u^wm&J`:Iʶvb0X䯐TDgcmfղJV2KFaNuSC[h tˑMfԦM-fЃcFz{VV >5~kr JV!\u23%S\.`.g(U6hQ+ɔ;zV9 *R7ncg7F~#kgTGt~?VSL]M%S/z߾zZXZg"6šTV:]%e9Dō5{LWZ<>|Gk8_DYSMҦ'kE<%_+mL_νA*OH=6'mAs=v3+ZiJ 7Nd̫ ԹdaAh5`;3ּoqSESʒ5{Mw߁ZL*=Q^kUy%lZK)6[>}d/ B;զKmĉU7!IzzjPTnd)A]-~{-52]{+VT7dϨ?eZVKU'|B7Ό-3fdLzNL[|1i0_4^&ڀàidZ+oObaO ٭򛃩u+JmfD1*wkbzƯAj/,9д&+a&Ni 30H*{LˌÃ^'KG 9YH{-KR+ߩi}G` >G7Ѥ7#c>Ա;% %_xlӦіQQ_5lӒmw=;L+!Gk%`ll0oh[~}ZWZm` #GJ~^W.2[RVE6{;2d'o>;K?9XOwX}5^&n m:}"4QdIj<ާgyEO [eo啭e6 4;&HW%S/[C&|GI |e7y,jM0Nx7?a٧G8GygKϓquAhU},32!MzVk=֒s{u\{.A>-dU:^ֳe1ތdc"#M{o,GZMMѻj7}厝 ?0}38r'ɒEg{?H%\#lqn4Q2_rn V+;3޹IcٙAM1vv5k1 bLgfVMh4Gdz# 2sVly&MK$Iy. f;ö GnْmlXz 7uݠ/~:W} ϝk|us%qlJj_睢?mӟ̤y]l0vm7RǬ^~|c8-*~8d}Ux:֯lVɶ=tO rKw}w'Тբd[aǰkrUb 2`-;HYYdW3Rɫ_j)"#i`MjY\m A -(jMޖeV2zەMAZU2M}obԝ߄ LMl'Lf ~P&c=SVnqڃ"h,.ܤvFNZ *>Gw%}2uQ2ڤl/yiwUͩzجIWd۴ єY"eRYעT<1(t_4<ދvyYslK\m"OiײJs[(;`$Usc[vP3vq}&TOߤlӤHVR&עacs{l%kqZhbƟ:l2_xxD7kY 4Q_MjH_O[f0oc4hת-T6\2;A_6e1T/%N:dl'u=)v՗ ַ+KYH-ZU1M]X޳NU=$viѓ3~{o[c^;2;'7!zFzOYd6Af8;dƑeuFdˌK*z{13jEu-&ރ^hdǪϽk|#۽-gz#UMoq0H>b)# +yE9O4Zٔڃ =X^_BdւlM&qd<~R4w2<烂h甌^}D^Bhr嚬d lFǤ'Ӛ1؄Muo{adY qjb6Z2^fJ䝣cPaX}3MhGr;)`fԻ^J_(dJꑬ٧W2L+Oc»-,*[wY<r֫țK$`ݫGR>`Yw/9py]xjF闧6J=^ƃXO Go Su[ɔ0mJ_ M`0Z f|sJֵ̺ }A*U>C,KfS.ҔeqyˬAz{,?[M8HI5, dFhmSKV)KvJ晎#r}\G>O}ew=M;m l5MYso*>WAG JR'8$Ƹ,/jOd|+ +4G$obYy>`]ݐdrK1em}لE}Rrj71Pw3-ٞނ!j?!Ȕc\Fskx/,뱟Y4 8ɵ=Jul88j/\2#]H;oKƚmNt$sGv*}'<&yvh"Ym'1mݎ pDIzsmJW=]3~LF,dbW#~dq,ߴI]w2m-{=b  қ=q 3\1Ə?%뮏Q^244aN~0<^`"羙 ,j+]}(561>ɓLamd7/Z}r~_p(ʮdݙLB뮖%-VXQvL]`*Drb,bteB_oDY\RkǘwzȲ)R]^ 8?1H<~ l(Yθ Z)j +W-7]?ڍl5\S9&Zk4Gd8Fw˖LQ+A|'QD+܁"F-KRXWEg̭2P2F^舜f~MI~U"}.I#%]ԄZ/(4{hʨL7zQԄv4 wM{'i;ɴ=4BJ ]H үTLҤu$zGqaòSGw길&iwP2'_uRsUs{2]-Y%5+Ӥ7YT$]G,+2ܖoڟfXy~y%[E>s[sdӶ,ANi]ѫ*ɴ5{2̈pIίd#@o̕k5Ov`m-Ye|Por_UUEԎuelG -1i$(duUx;x^}dJa/mX2wwtq2Yp}k^+ƹ З7ntƢ;jYv2kq"<8yd(X܆e}4ƊNm(xU  qmG-?Rs#Qm*W2^׶=4eWTrz}gbѰj?Yc'bOnzح4ѩpLJׯǦZ,uBM=s|>Ӓi3&~0(oyd[>~ <huG%,=_(&*kOޔl*3JTH06>-ЄVdFw lp`wz&E<Y;;oP_@,덮gC4-h،EآH^N^oN璒u"eM\ë瘬wsuqj2ob({dfs{NFې Nb}%ONҳ?d4rĝ;>GS_Y}dkǭ=_xRyH`(,-ipMXI3Gjl MDOv ~twlFu^&-7S3 EuݙKδ3K htGFkIȣǣ`4Jd] jn/dzY#ўq –-WLwEw$;Q{Zq BEiһ~zPhP2|y1Yz/|sΞX3Jf_2[Yd5w>dW]Rɴ<(hdkb]%GT:/~i~:d'tdG:}x% ~_)5گ`5E;ibdQ(F{OkR?gFM)vk(c B0Yg'c[dL\Zkggf*Y9gj}Z](Ή3cwG<{1ض\Զ>K]N]7l[-J>v\2ٺ<-gQSڧd@he;_J-}Zmq?TTV zF2j7Q0e;f􅶎ȆWQѵLε QvBɲ {JK/~e8˖tBW6kDynS%cEt'c-r0`6acBMV; ٶ#B&? 9rК9@@#TXlZYT4qAzb'61NS>ysx3~K鼕3SWZvJbEX-Aw2C8O])MqG%;`_{w6`g{PR/y5n/,`=F)۾HV{ĶFs1+שV8K"AT\~K(7CDr8ʶqj; )M~גU: dw1oSK$z+YnוMK-3 #MO9o/B;xwJk'Z`l=狛;;|g bt͜AюZ&SfWu.ќȪCQjy㌭v)/Ae,vo?MxapM_&_i-? cU2c 9IKIw}9:aݷ KYC&uNy.%ƒc2[ތl>LI\sBSW,wuyEHCvKj}%ӿ]n˺9jgQK&zqoAcm"ʛ&K9xlg YeȧQӛBS8>6<#Hq]C*j%%c1b{!Vӏg]JZ8l ѷYɺ[פvnp߸ںZ弶geus"KuF)8㌌}=g0H(>XOx>+Ѹm؆8' ZxLx%]4E51vx1 Bk*dz,s%/fi ƫ\-4M}WyU}{:է_(7Ft "ie ˻ɹ:yLf o-:iqGXWڤk4YVz\bϜ3A=qny0=O RϓXˌsxʕQeݴM1kX|鸮OV)Ӕ&|gY3Hgu)kQWox2mptoB?om}$lNh LX7,Hw{\{\šJ'^&ΧwL>y譓o~/=Մګe3tyz:gD=F"26F08GHVyDw'z>%Fcc;RLגU9Z̛-d_6uVS˴^kyZc5s9!AUyugxeYSg"p^5FI4yL3O^^nyuXgù=MI%zw4a=5kQG]YŤ4an-3l5y)WolGZ~rm?jEԭ,Z-)H%qq [boLYٽ_X Hz(#?0Oh-V2% ]4494;|]ɴvZjE؅{Y$%l;?-WƢ.}"`PݜCc\|emtV)]gɔHĄruqb=)JS<}2olEXK3`]іjSN&9fm>%+ hJ@2ۣJdtm6 fXVOk\x{x^ ޫL&/>uԘjYZl5-,̻3ܱv,"`2\vj%c^m1^ak_Or> Ѽ<GԩK2Yn*IE)8osW}ɞf)ol4[k&d%EXB_FV-˞<kDm&I+|j{͍eSeƝ-tiGJcr~[<]l`"l4f IGLsuGC *>2>L\G!@QZ gX 'Q,c\͒UoZlķ;C ^mpjqZ=d=xY{Zw4kDr&vy^aY $5ȣ;evFXfqyi|)8Y h4װv}QAՙDWtR֘24#Se]OxUOx/Y%[@Ec1ghgY΢xϢ^#-Z/QXH$_(W[O2QWr?HD 2d-sSjm{۶5^˴d4Wa(5;ơߪc,?ɴY2Z)3 ++0Oy*G黊h11{~06#-gGEfR vqMP1#εGNzʝv?z$%ɒ oIK;1Ŋh@Wf Fؑxg2;~bt?f]<;MMTMY^kKt 7Jޫ[G* bF : դqS:iɌsd[EKAfũI_ Ϝ=Qg%ӫd2ydrjMK㰩}>(q?a3DӔ56/O/4֫>]2n" gr];Ғ.[2(Ejd{?ܻbd /GGDnGd3+Zj)Wwu"[+Uk-3{MW=W֮i_[|jIWGP2# "|^ZcRJPMFVF-$Bh Sߤ{+#-)4e=ӽdY%aE=M=ӊŧ_(FI:^vrnZCi㚹_Q~[۔f鋰_k};ƃ=.LYg_b}: )WM۪ɡ5oZdPsW1,m}jB3kJݹJ^^,؇,?-lEcf{֜L[q:[l-J/9i4c [*zSA3VR*q< &}3IM!i":61L?ʝAh/Yъy6ϴ[uK9#ydGWgVli5rZ9r|u4a-"N r/MX8h|{ ;XzUEF{aq{"QfsS8OD)+2^5&4ŻZhɴϵҭ~c}^Pqa0Pug?ݡE"2,W\K&af󃻷Tfx<|~k;`J3veh06ޛduCEA̜fuʰ硚xKF;QY:AO V `o/gJ+kE9etho؇N֝A36f}1vnYJ@M|U kkAվdQMFfg.Yߪ$ci7릿w@,IjK}s\rFQ,kޖ[]%ǑbEjQnqRg)@-e–z `M"Pd~̽G=,Td=CϘ߯ H{b Ĭj,/we/uJ[`f9ߺDdq,ڛz:ALkŽq깒gтyc8Ѧt2ڊԎwץ<x#G:I߾s\5ɔth#5MiN{iB)rf~#ӭM<FKʖ::v?ο̿xP+&"XV=\I;,YۯXKu3%'fe~aFuf(YBզ {Ժb>6ٿdDaH0c kȫwrf4a,=^ l,}3r6/n=zl~wܝwCd|l+o(YLě_q1.Y#F^PZ:Kb) _ޜWGFvuרN#;떹&qIbCm"ZkrLE5;ҏ+/Ys ;^MAdbq(Zd=+0s_u,7+סG1PV6 cA~ ?s/:mM2ِ#+K+Ɇ:lQ F>{>MF#QY76>'Kflf ͍=cv b䬓slx̰=7^߻KXu759e/W&_Yg=W ؂ܛ :'aM&ϟ^ikw/S4Y`jK̝^{>ڳ(tDYU# 0&Y)WJ2=mټE iG}T6?~:)oHsMQ&= }YwYp;?wK_^aQuDM4#Zx'Mfdcdsd)RMɰiMz}x7?71e5DCљMxĕS1V`O%CY2'+DwgWlR|s6 ٮy6;9 }bx%~{{Ql_Y4a+Z'ï!-cNu}?ڰtS3#5`GjŃDf~9Z}׹of$H~quԒ⯒yϮ]rz|G{ḻmr4G:-Y؈g7%gF#هҩ&=oUռi< ?ٹG׿^S3h>SW׫7w]r‚y\Y  %ddU*:[$1bYYWRėҎ}u03 7C-YJ/%DO`rָ61;Z;-سd̰ b=,ӣpL5iE2^U§CNL;+T)~§y,䈰6ce1{ȫSK&{J_TOB7o;߶dN_ ܫjdX]1h'Z=9xgXOu(5Myg~6g&oQԿ:j^MDvzFڢh2^9Xo[/Y/59t"'$&3Y1q} u=o Jى~WCXd}#ȑOzze2'K&~Ƀ69d=+^?ъd=5-~q0wvcWXqTkpVX bve[J֨QilZF oZ֘窌id<=F]DLF^2:΁̓kL̷.vd-k"ၿ&3ڝC^r?ߟfh(.y{]ֺl}1#S2mycA~8*hFg֘l'x>3Y_KVK{V)HU~- *~^^ȏ-x^"O=qɴ6(5NU\̸u 9}Rw&̵Vqz+WoOњwO6eŹ XAwXVLaJzgP >; TY=QUlXx3Ȑj%k$߽/Z2cež:ͶMLQz{Ԥ>`qQ쓔%yWFw^,˴Z%L<],x[.n<^h-A)idzѫ{ɞC':*'a; Z?\8>LCdhlh#I›ʛ |jFVm/Axd]Z~\9s]5nL&iRu<˃`}j19|1-蟻sK*_ڴI#r~,SAjU}̵WV 퍱׳Qz~u'v4jӲxMh;Z2Eڕل)ϫ~تj/IkRAHˌPk ѻ1q*+N9 L5G/MzWAmXcVV16jfYdF^mR2\̘ԤY ҚM nIαw/*p*`}w7Gy_SHʵ FaO1+C-+7lb>[ jYC:R~G_ljdt@WS,YZ^j߽.aaqsV{ozw7?ewO{}FخZgjY}J[dz,WN46F`yWy%3}GqxVsdAD]di$ FOau#S<%VޔX?a|%OyJfސwL&4Ϟ6 _ٽ=?jb,NX^o.dUD'#c=:j5񾑧ќ)OflclclnWT=Ij02Wg B_@fS] Xs-eXV{mA.JƓ|2rm!I n0LѧK2K/L 9 h=Vr)¢5K&9=ZH| =%}ޡcEFң^Y@zd,Z'@Vh@+yG[MzW/YOA&Hfrsj=4S( Mƹ&ߔbܾrU Ž3ԕ^V,qdhGsqS'DtO>sp>+Gx5|]YYFRxxd $hy>AL&kh>v,l_L@ݑ˼ +48iߞvS5jbUuM5]^e47fʅ> ,3kyyyA݆C؄7wethևIkܗ4獓In鱪n$+|uWh2^cq3J&S3kGU.J[_1"3x0[V2: y(v>z2OSuz"ygg뗌Wο`bkZd]/ҳ\FhFi˫~-83 {Mxw~=y;Μhjmjrmd%'hY_Zw ,Aי/2j¦}KF-/j?G@˭j!Tw bZ6YK?MѫeRP{˕) &pg' "9ׂl9bJ~WtNRj%\~w)UvIh/Wq79*SH.j̖'<1Eh p<~Yk0Zj+dfeefHk"9Z#d;-`-q'/?JĘ@KFc^~AD|d|UShAX>cX~WW| {Ec,y/>of{j/o:n虩e~w=9-R2Vj{ZdLyNF߼# ZkIC̐[P#hוZ_,8Iҳ _a}̓-6AhC³'<{D'>L[{Um]]g?}g{W(]yIWfHVk7D+ݐ7Izcdޢ'%;V("VZ!p|{d*_rKۄ/7ONsmtweͪVg/$poFg9xxY{,|2mRdN>ٻ5(ҤvG&+= }0Hױ&sì^0XO,)4ч[AF` %kܝS2cO"L$zjokT)53xM u@Ϥ]~oS]+3%3/f&X;r%S!W?#Ofv=~~7 b63uRs.O稛$+7 R_]qò~;fwΤo~)Q|SX_]xy/bSZƋ%KCLn ]2o˹nQK$AÂs}}VD8 ƣ^ކe+:4֋%=޵W2JK_voM}#˶vYT'.œN̫mhfW~Xzp=Jg`jSܛm2W2.U&=7k5;ѰY5g{T]{kxYzԅԔA̒55ɢzZ~O-ssS?%3Ě荬lG$3'qS1nJ{sSkLfIJBĞK[@πV-Ri[?ǃy:-H30vQ]SbmHOngU;; 5w\VhU7m鎵a;ӇJ&+>DL;ASÔjbFkZN?l<'R6,Q'zZ.>L,q8z<8=~VydWMo9*[OeE̶AD2^c-5^ek-4ng ~ PK^U'yl)۲rb{3zj:Z^Bxhu%A= =iH{W,A̚SxPys5x +FrW|rȯ'Of/y~m2?Fm‡}~0-tAvڱN&Vq1n߼?fޕM܀.ά bf (֧'pߺK%w5tFPxFUoͽ"rk#2_c).Մ:l`':%9R {4᭾}:B#7+zHs+#Е,Y\9{e) $Hcoƒ]z::.zl'S| c3K:2X38MowtsWt柬5G斱ȿ4e"ŖZ Br2SEx`G}kzd N %OKbOH>Z7=_֤v򾪣[ތ0 _XQYote͎Uf`O]" ]!} 6B,3J%3ڬ}&ayχ\d:i\jVZ[3uJ$cM,_}?򕚬aՋ&Pt QPiكQڄgkL5g:4RU5YM;U/Mwؒ=+uE0GTZbx䪚/>hwDqAX;l;$O'ӚkΫ`M؞Y e}&+=y5K3NP6[ |YWN8wsY'y*j61K:3rML獔$ { Z1 &EAe/8sD:NM<{ r8>}wwL`;*1#2/![o2W2=O7c;hvc% %U.d,v"񊴪S'>a%\b۟UxYYuZW]g9#UV}=DgD\rmJS>Me FH1ꋾ]{K&YS2VNՄv5˧٤zJx3Nާ6/Y_NFCR2~uvjFlpDyY!,JMĬs\2BpHkAD8wF2Pu0i>IV7$tjLMjNeZ^G=!a_(+nYsƢ?:*5amqYoyL ҈a7?I_|6Y+cſ+)x\ђD$}"!ȞBب t>n&[d7P0E]RhL`,:v ElW7ђВEgޮ /po9);Ζ0oMwɞc 43yl([JF7KFS[跌$Hyc--"`R=dtXٕ縃9ۖB2ߛDD4Q# b~6ßPGl:N֯m*_.H-rh}j)9q>oB=q>XD<~ţEX凫FeĻOݖv+ۻqJAo0'/8ƧW Ry]׹ :NybS<,1ʏK9m>ժ!MU =Wq7{uv>-UX1hfɼ"K3'J5ֲtHвBO^Vekp2A) bzGVU=Z2㋵,&k_%&Kɭcn oAhոh5Eѫ&lZ*I L"jr6-A@tc׃v.P]h Z(kMZi~[%OxA hU#c/H=sߕcWw]]d# )n/R7r\f+%9'@ ,SfǙ+'zF">҂40y ;E41TD t4L+MyF( Z1wyYs:*^Y^P;ҾIxNUs~x{9',۾ ۾Vkғ9VfH{f <1D)h0Ki2 8+"ϫ x/You`=/%=&>TtY4#7XfrҺrҸqR>uwU9:;,޾s cϱ86^Zlt*az%7m͹̌wX dž_fxc\ $ތ6&ֲXd"gGtg>d&8Fmck=qe<F|:J>)YΚA9ԑ_ery~ůn=ˌAW,Bf@{R|Kao%zcmvk[L~kZ ,Xga9heDܮ'֙N8v5 ú6s4}O&mزoNԭrɌоQh><<[DZ45d#;軱ʶU=;$5܃x}`8%z\ T)B2s*YִB_7*\FՋϣݵcǹIZ΅M&cF]7fFzf[?5RJKڇ=Hd4쫭eʫe(ИɌOeu4okhrdl97;{QEx \>O7'tO(;ñ~24O>cvx9Ę=YhKwu {~ܛznjU]t?&U>1;3QݢN½&cN/ʞwӲUy-cyϒdʧiMāTA5&{>Au\ ywM|[dfff;rĭ&M|!w O/[:w0zo.g⛃I8\D_jZhүy/HI@$=s>M̬0yy cǭIV%[|.^+%I=mGg3Ef}( 5\+B04;E_>ow86iOK4+ZwqZyMjmy;Ӳ+kyQ,?^oF~lPkj׻GRKUNYNLVe>W~X o`2KwU܂"Zb~`|/rRd0-ۙMyk`hh ?lajE_GAOރ~˿LE<:1\g`ªiΔLKjQz"՚tO VŨշuTI_@摪w4AZptD2k!ZQƃI{6ng2Vr~0ql[m"|< assSm}W;Z(7ٱOi`z"s߃ ^οnxQ>kh1}9kZ~WI^E~7MF[2>/*6-q4uZֹ`,ĸaʚ9YE+bwABs=Q&y_iEsMXd|a cǚ9DubڧO:MaM\3q~.[b̘k6.ڗLXTrG:y=>~W.Ϋf`eKV˸n g9WIcoTz$P4fG buʽ)ndZw9 Ui|G_V*Y^jn8kd6%/gV }s_̮P-nIo<BcvzB)fI[dch"4ׇOf˯E7a7{?Uw}\UyF/1&7yu ]z72Ik@Wiǥg+AuZx"|0HX,v6zg3UCgy%ӂi2wip2B ׈h[HhE2z8WU/Q< [鯒5=}§dZE#fغ-Vu !1g`"s`O5FZ^'K6О[޳jR EM֡zϬ=}d>98}{?qN5Ήگd/Ĝ>ҖI_6Xw_c<961zY &k^{mZb2st0<[5'Uefog0hGMD+δDv(IAb1O mf ֿ8NBWC~/9;xʩ]˯jR/n9 a7o?c9QU$ v)1HͽMXo-Q動&wԂMD{9jWؿ kX~(w7i<]yV-͜ }s2Zwg_FB4{#wދT:sxw0#4w|n)XlBrjԡ? ;aIq|^+Q0Ufe6/ }cq9EGK?1J{ 6B?nGd7<0X#KN6UH~}ŊgfST2Z|g$xN橖OS!}mn,quoWEwVȳ%Y}|fs\-S1V}/+| k 1-ޓJƃ[{k:'b&_r|ޞXg&( WbB(Ӗv-2ф d9|M8W15{ka?6[W32rFGݿX22rELq033\}h7\znNK[YҀi<VPfwxwAQVd{DZ 1 3Qwg%3r=8}|勫H-߽ *5x+znrWs_,gJ+AX,cJF^`Ԫe{A]k%c9畨d on.o8t+ Y4F*UhHK.WM5ݣj>MBSi\Duj6a~5~ueFLpSAj  kgOP'KO:˦d|bTOz׷Zx|>&H߼Շ~Eui2v{in7-J#k,wߵۻL՟mufG[]*Y f]<3>Q,_\S[+RlR:i%Yu ׺]dI3Q1jZ/](-㗽#)Ymr-?1& 蚆2Ύnc܍{ɌchƷ}ˌoebo cв,JPK9FshI}-AmT`7OKs Svd8;*nee+My|ͱF[ەKf6gR=5pcـAsvѺjEYzdO4sCM?c0)䙨 Dg>ܾ9+ %G@Moʒi5CEq|^5XY6A3g߾:/'=d1SKwD v1Jց&lntUXk⹮Azm#&9M،<S1$)c4j)]zJݣɲfy9sD$Mq>>̷>6j< FV`<5&jH_v+e0c_cLwI> YrOFwKwg(dkNW_Lf>e})Y|J֛<+uR8gj#?7˰a_=YϽvE=Kv ̛Y}?hUa]\":α޲bLP{ 7%j-,iٯINxgs$ֿx9oB_:RNfxǎQ]UU߫dNQ^P0m$̻2[̼})YUjxš]l?yYdɏcZK,p=́"Q᲎,":"b>w1 9V^+b鹿̿X1ngTq_;ZjpaO1Y!7U':؄܋erFuzV~R=C+c ~:Y&<eVWBw\vz{9=r4[n; )kX2o~o|.d4Ygt{'d0xow0("Zw!;S~)o᭭o,cYtvZ;5vV7;_O&o֣\!y$HOvjw: sX%ӟqWe-oG (jZ~ Jk NVUzz #3oRP'n iwS3o0>hG8v1u(vRHzLmʂ mJf&y%cf~ڢfdsJF?Z,GD+` n{ ȲoC &F;wo)?{_ZYZOoI/U"2%gyJ!uc574Vull[׫jmR[̲JF$dxpFW@ÃDU,ޙR%cu}CV9<ݷƯ`,3Ku ==W늚,]2[&z\jGɚ;΢,8 %˦jȴYڱdwh bͳ\K7kX9dz+Oi,*rބsB wT͂<;D$WAϼ>Ek^.@#۩{is|0QN>S=8RK}+XFYc{&_-{ϖ6(95l7*Bk%㱞=s-3}wk{ lŨr| ֱQF4U2W㷱Ik\j;Hk6+)MrՄGVɏ;샬O曵~ddx\]$N_Ͻ@h⯱1NmaOqYZg H|S]/~Vj3%&O:w\ھIwzrϪ8RB1Z8͙"f O"D86-޾"k`=9K7E;Q_D 3.6͖yvzSK'g\Ds D6sVueis-uQUUc=w3,hd]#˳qE\5be|:H"~KI#}e K;ȶU?KMֿ`G7&iUK:BN }Իe,O}ۆ/\MNIZN}5ɢmG6&FoY+b {'TW) P20Ax̱B0zG $Vhv 4 -_Ji0LOgxAMRI߼54NSǚ}OpbMx U5`NV? ⹯X_ B}A;#d=[f9hnY`Ⱜ:A9x VQOϭֹ- 2kMqMq|v 'KM\ 5Hoe?^I3v"dw%uV!+,2LmMΨ elԚ],3ْ[: m=ل5R6-=mjM/ΒDBTrmez2j!WAh:y-WO)Y䕵l w%3;wXFG;QG}3F&ᬡ*5oķ~r5_mMzO*f7ou2I~DA-m`j"ѩ?Ii{fϷ6%ߡIx6qǝe&{mHiyG%ֽ:ڴ/Y^ϊ[nݳ+/"W6|Dl^`<- UZ/xڙgɶΏ|f1"jC48['-K3i8K` ujBKy9ɽm lV{4[2Q1}}Xs kƚh DVgm:ђ8S;1BWYZ@-=ʚ 5JF\K]:*}+s$ \ےL]:SCJkVΖ |5ve!Y&ȱT{Pџ1~OVo R43Z}k2 WHͿbo1l`5`,QdXVwsL{ "O?b"Q%Z;v/YA>Q2hס-ex+EY{M=>'ƫny='IiRYMO^w%3YOK{1\Wx!A7d2^_nhҷ\㑫i5Ȏi~Q+Yf1‚(17]'k$lC\2Z6!unғ]q9:k2?kJoΌƈ=Y-v.ۚߏ_Y'- ,Jҿ̧xDKפrȷDWMO__zA̅5R^u;U2q` S-{Wd6ɚm{v]UkL_;uY?# ώd4ĻZɌ b|!'?n&~sOK]̊X3#yaEzC;YFwhuI:`+e5k}H ٷ/-E'LJ/:59vo,ZA_ m+aCFuH2snu~,O¸]`NYo+$XcAqqB1 ɷ[wQ21:Zyz7|ͳX GZ#; MYj/ȗ_c*vՒ9adQWş}/=+Y>U}o=gM>^yw\aߤǸ":ufۄtF+1ѓW Z5c185}o/Rɒ&f%͛X>k:[&>Y}E5._?O>7h48[ R;FcL FO+5e0ydYfEhU=Iѽ>ٴ~{db-z"q{zMj{HEx׻⊒yr+]u[KƗ k+ LaAzoi,W?}{`SJ^3__*kX|o,5h12%Xxd'KAh6 b9j-{\zzidQE hz"s<|߲dϕA-%g&rkP{!>.ǻw?E="]vz5wOfe㖉[&N,~<gWqvt4]罂fޫl;㎻+PGj'A#T;uKfWT,73Xd,m%]Y?ڍ&f_%Ɗw^-,_طf$FCU<gEnU!/kcw`*"Vjk>$Uъg!8 f^,NoBk=7,| =qNvDʷ ƷN'rd{FM$\S^^o $Is+as%g03ϗ/o_T>23{mEh)?w 􍗶CmYޗOR_\N,dv;O2X;+CYgKu*Mu7Kfa.O:OF*'(R2s,3by4Ahr㘯o~IFWv%S_ud}w}shkﳪ%32 B{=V^*Xє}Gƿ+7 FSɔl c>_gfNi}쒱.g_%cysV'A;wvwpW|`]-*eb1_eI#ݟ iDZo7ZOxSL<YkLKa~ykM2YHAպdk6Uo5Gmyk%^,/VMDk,b qL,34- uIb@,L(;ЧKf`$=/GA"$kn(Uz2ƧmkGu>jd+6pխPgL[-Y-z>lrVqg';WuDX `B߶)yxM9kVU;׵>qR_Ngc cEwf+g&EWD0 cTkSM̓+ }Z9}0_c?DO~"Xgϛp*G~{8$eDUQD'mʙ"fҥޕjb:G_NVT־oɌ dv[&i wqUd~w͛}y5`~vZ(Em&}kX͌S(XWZdd7(dy,Mºx 1* nʂՒh׺ٱ>[2NY79rh۾Gd}HKƇ-w۲Sg*A|v);WlaJN21 ָK;P45pe͌"bEet { ?B^O$};*|^y-_'8Z+Ϥ&"<]$[l?!ccWRjϤlOv d+=ՙ&,'lAJlSK[U"XouΪѱΨ&Ɔkxt{_>OM˷J^w;k4felleEgѥ-c?[Ajo{={ԧKO6YF b\f82&EZMzoW/q/odz'4`h֖ءge"gAʋ ^^6A 47PI3_-v|yHV*v)rl3.cNOq0L؅%gvu_vҤpYKB3>.J[:J^-mݧֻOxޅ_ZDOuE*;jbocai[v6МxM땬CE6a{xfEܤ92 T}?2~$=G$ +23eʿE hPc0^Oz$=ckA3cWfΨ=qOzfŒ&[}js3!,I9:>dFk54$`we܅dzJ|e|ܡ %]Oȑ{%3˳HoZqco)WE7W_ҟ[\)߹p%[x[K;qebی{WdF'ⱠyVdfe,]"Mެp6`0vs"(&YrVO2##-GZeZd&EY~̚`%3wJs)#,c%y_yՖyϳyj#Ah '[2(O6^d->ڤ6m&fYvs\Vr{X^C 7|N& $鯫A mI5rE/N48nN^#Siн})ժADe'"f64g'3xGVTj`tǷbuV69\炆e3ksS[ַʕ|HĦmߣYo?gL-8xh%=v,55>o\ʓ0dQ-k59YOS27eq]5V5 ko둤9Izn*UzOE{ -Yϻ:aSO2Yo DOl?!cQXS8EhKl#_&b޽(yۺS(5tFV)ҝ㖥"YC2Q 2 +?#*oxTMw]WiQ}u4w5ۥST֣ί,;Y>9+әs>g^3%[@gx $7"1g=?%k ɻ;4XOBS%c9|KvhUv7a lɫɛ!D`;6mBcE:?QZPߔUMqkYmY:6}2S"}%I|w&S̫̆ r 3,U}2Xx$)%uHO9{MH1wsx[H҄.ttaGoWT]c&Z2w!#HobzϮyɕ/\D"2xIkFMIJWG̟qKf.ĿS|8O"#,K_Qz]'Xe*Y uy5 ҳ~u>e=e=3d<+3“iFbz׊p2rZ_D$S؝ՎCVʻ5|4n=5 U24|CA. wIً&n"|' z!8 j%cNwAxvomgA#? Mae6w'] Ε&G"HzPqZ%3ARu:dp\Y-311n沽JV;oޓRmDZP1I=˞jwlN3a%3Bgik=qD}+ Ҝ[z]%β{볬͞'o,&BaMhD/f5 #Ɍ\N)͚q`39U ,y&ˎE<+=W4ZAo@43RuxR2wq| )4<:{ }㉾NFFXkt'-^J-?.EP5]_@c m{3'v_1k]dFSlo>z|f}0c4w~UyW֮ ^Sڞ%_pn\&>ϊGG2Qs(EV~*{<`Z/ˏ]Lּ> )B+*߭EzM'y&6<Ӓ"[ t&Fh~>w<~f{VYh)ۉdb-S}np8Z1'7H cZ@vgi{=kɊC3VLKĈGW7)&JVd?g0v R[[NOgW{΃#"mnxf̎Oz¡9ծ_#Xj"{{/6z^^;9+-cwJQ.ez&ӧax0[t2޲;aFPX_i>@-^}-'i&X$ԙ6uϻw!NC+Q:R4XDv@3BmaOW-Q|:DA*\`<;V}2 ߏ{Af1Z#2=-@ڃUI&j* ZE?O肠_uDz$ǃFM&+:|Q6?vf_Č'uAi>g.{'tb&ިd˗̨zL|X5q-kп:Hx9=At0ïյʤ>U7|oYyd8.h.V~E#7 b}YBh}bY/'WxZA|lvi p[_t{Mu&1s|Z'G:N'5aXKm3njwk~Mz y`YO떰D5|8[Az3k+h.5雩 WW1`ٷ+~lˎ=FXνl3? B]LB|+qq1|9ϼ!v&fZ 'I0:Yϭ{7a֢ =u6 osAU"#'@fRfv٢XuG=:dDm%cbmlq`F$뀲M;ql(B{haZ-kM}mddeVPԊLUқ;ٝUw$!6y|'NqMV,uzJ{>"< ɴKyǧ,JV^uXַ+۪LO}>Xcg'K_| l;3_3<) eZ,P=C%㉨deս]Ae*WdKs[KnRi!oʙ=w>EiMyRyz2>|o{56z׸iu?>lAz{evrVR2].9:N>aL+#P&9R ]z+˒s>g>c( vwϬ `A $%YoUMugRM3&llQz1ZKFt[*ȘhrCpKڳr*)fEVIYouMƏ;gdt|.$՛Zo*tS+3ם-ή7.˴B?5'jQ׺e*ףc0=9gNv>iJcM#R-іάyyt~Z#Ah]P Zo^2mVgy;d2_<Hqa1w딌K؄UͼAsxn;6R0Xw҈ k}]2:ojW7fI=m쓬W1gR:2\>g9Q1h *saD,:, }Ahc\? үWg,?G髰%˲(r[֝"K塛N?\%%g$s#\,߬M3JGYknf,2 p`GKx^YK`3f鎞D%̞~Ttf7mR_Ykl&UTԓ8w|}r'h `DG 5E?\=}ޅMyG_S?yQe,?\?T;76H_utfѠ[E<%Iޒ2_2B)w0:}|?untUk%S"s}Flf SftO^ZC(u*dPM*}>rqP=Y|.doDM΂},صӃnaee#z^գ&J$aML.& Ng7XsZ}Wy+XOOzKdWy]-2ZK'}ZkqeA"Lo+hm'Xv,_L,V~ >G]a !2[G;+Y[Aukz #MX}*\^Tsq6+ám==ȺM쑤̠D:/J>Y3^} үk-ahZFYm&wDxnD2#2Fɸ3t{Aj[2>fϼ-Y8?H%],x֣+U˟l%)1 RD_5,_2/S%~S|YVTicJeP2%*㫸&= {O҄6l^xV*Y%LAx ړ$Yos%Y1Tz^KGeWyb%r&>Ak?<$ߢ 맶\%4g[V c#HVmQjs6M&~:z |R6Ժ}Z`Ԛs.tkwvEz3:NF5<߽Y*MÚiѵUV+OuG]8f.ea7py3yMGY2%9KWL{Vi[<2%~kZxG!hDl-V25Hp:.][2_-:HoΝ=vfvU7W뮈f]{ǿ5;g%шkGÛT6fmٖi=1Z[V+wόW{_-CxroZ&4<"n0UegNeg A%sAo]3Ǐ_ߟ+|+,T+XZ{!soX`9mҲv2hFh}RՃ.^uڄWؽL y+t<(+JFo5ƮǹWFxAYueJQƚ)d"S=~S[7m?>udni+YwKViGN Eۃk1kg%d[մMUjgyz\n#:*"b87/] r%RV YƗ:}u"t+BYW'/\Eh}&ٽ5#pDtj=(ɃiG0֤7ؚGG_5RL9UV=S˂FYSX6f9LN=MzGG~h5*Òi5YAW[hxΑr>e դz5x$( ۧ"㫞Ka=#Z.D RXl2#cXQ(]S_04M;dp ®x L =~MLE_^_2A&d'ǘm9D.566;9cS[CWӈ%͝ʑ{Xgj+&-ZVz犰XL~`>Ju0̨rQ3/K=V9[ _Tۑi[z4MKΞAYsAcʡIzg25eAaz`OL[ĹM:'-k wQPWZQG_S96 ?Hl;mIܕbig(lj]2l5Zd;r' #<宓5i xFO 7xGxqKd|^#MoO~";߫^GFM|3L+R{8џpAQ}^ěh HvuNBL 3|mvf1e͜9d}:ۂ͖ !}:^S㉖uVy`͘>c^Z&=MX_kxrmyemܺ2qR#Zce\&R}e,֧k2QScUOc[qoLOTQ2o5HlZ5bRr.>=zx2:%ek5QC#?d"WYFhιHS^m/GMUwV"V'Ԏ*սYO,,jY?q 5ۄ xeO]z]@[~Wm7 \mM<X2%8 jһ=s^}J#K$%UiךJWך=doG51wt 53F4TQ&Yo3*_JںK8=<{D^Jާ \)d4 WxO>ĦUڇu%5=Da?ܣSz~SЄȓ|d J`.`uP{ijY_`{2CoFyώXڢ"3ceǩMX)3ŊcjYa_Ѧ"4=ZKl"JqǔI]ծ`+ :۷:oU{dy?|o\}^ZPXN,6ezj1RVwboNϖDM0Xq+g΂VߦdI%ۊ}\jט`C~e NܿSAv 2`uDKGK+O?/?|IVMzW21}`K=^7>H%9z*dYA EqGO"PAڬQϽ&M(︿#Ư]{+⻏%:zxv`47v;Y2I(VqJc|jSc4|k|x~%sw\ V۞O5[GmOHOa|`ziC`l6>Oޘ Pb"kUP x<*rz^٤J+{D㏺w3-[9+`G һ{&J;jb0^U2*@ vsdY΁?ǻ^އS2eW3A&큗o;zdУ$/HD|wW8g*;`Q,#kĈX[EY\{>Vnnz?2dec9WI\wj ]ƒё9DJ>#WeNJ?+.?\EpEW. }&<(HqYLլU Mh-ÖӖ*Y3UiqZ]49S߲%csԒ)ͽ/̤}w= =.dܯv>ڻlj_g>ҨF1#żEJ/Kʾ)\RBdl5sEDYy`,*dt!{{IYStubVE ̌|Nv3['ǞMҚYZ>L?&98*3>䒧]vt;?X!^-re X&IG&OΉ4ѳ^9դ&SjW O[fX9:0ADl˜L+Ƿu[H&|OB% K:7^Ui&nWnRɰkeEx(ه",vdސXZMqX˻欭t[NV?#;֊`j5͛ӌtx3ҎZ&^dw&Z4o>Rkdtky8M\ᖩ#-Um? _qhŁe{Yel2A!NjS%ugЖ̓cztǾ|Fc~8o<%2SZ49UrEq~'A,3o6'I5% UcMx$c?чG B{~bI?'0DPf1"}ڹ:gh˧ݻeyD-|k6G!5}dsor/}[2vt}ՙKnEM"A;\ =J9HbxVdo˙ ӻw]̝3G:w Vۺ2TJΖUMd" hexB:hiB[/N+$z*`4ױϨrx_HxA t7B%c'AG5X5Zc҄G^Y2@MOۇB#Ox]M㳬|E4taSj\ZeyG2Q ˕A\׫=yxksSk秣ӳWqHBPj,kǾk9{m{dAҰGo+x)r5XVo=Z&< ]跖U9 M rV#Hѓ9cAj:)#|חwN% Zd\w(]]4809zJaFQ@Ei;s2s4;;$7Uj%뗭*]>$SRZu>9ˑkwusq3M-hYsFf0~Z[j}%62Ni3h0w_6e ;ɗN`#~үlq+bI3ޖѥUDi^(OgE%KxrEyʹ5Ѯr7:9ႵFKr]7* L]]uQ#$~G؟X}Of-XnƨL^0_2&1&f\ Ex1d?gh9WUnR)[ǯy띂T:?ěБ}_ɎiV+UZ숻q2c0Zܕ~+yw Ws叼cdgdMzi5mku<>mh' ˂?W|'Ayw_=2Yg+2nRY}3Rd@&Bٚ{2-;LcmDd}~ODk9uɯȢDBvcWpzSΏBigDCpe,2CEEa؛oqW{Uq}$;f:o>~ wYE~zt$zJϗLIwqYce.OT+}g:]DRy+td|dF6(C sh3`ݱeedk;bh5+M4.tdyR:["]]u0W&&%jtZ/6<5whV'l9c곌Naݜd Z2RЙm+gAV΋ !DA eڒ鯙W)HeU%;mzי!VUUDVߎ=-uTZ2%g{~`}^ ?K3͛,mRiyΩ4=?'<94Vgtgɴ=I{T˺2ٛl 'c#7VǞd[>35 I Dzd-yߜ^Xś;+[M=^㔌&>7dy^9&j_+~ zwç?m?}5HmzMy%ϕC<:+BG瑋{_#wuho3gͯ5k=zo< 'WƳ5y1yWF_M{jdבk޶ZEY~"44h/DO,㕸ZEn}F-vDnM㾲d(W'ۖL.4`Y~79Q;v$c[YSRwq$n5 _kk I3k17Io'gczq~.KVy=r\2dIaJ[&Ɲ죺엑a?idy].WZsD-y~oz unׁKtvdef ⺚jmyEƝ Tva՟e< vEp j#^V#ڃ)/їK[F8mZ FOX%ca!UW RKϴd>ɦdJ=|(#fdtGfMH _ѓrlxǝԋߕe{(d535riv,H~3Jһ+{糛T:\X]; 探hOYO$/7H-kL0˫Y<^hE^t6[&9I@eI^@OwFђUw _4G?hc镌0NP=K9>VUPim[h:c{9=|8lV $d~zuAuU#E [kuBJ(%n}6뺒A2R\]d}:%O_Z~֒)q.pq8}|?ŷ =BM_Q ۏs_~k Kuss)=4O1#r&!ec̖e|B_1;F0<8dlНLIo Z:XA蔹^`0m1x~=bo~< LY{,ML%'H/5\1(>(zgde+y'Z_jI<RyR7 F%;>-GGg; "\D v/ֵMcAD(w&:a/s#V@FEvr~&{= ];햱WEzDjX^e=;uY䓈2O;iѺg~*E+P9z<`ʚY8ֶkW} G)gg/\zh?OYM1:oNT2T6a;{e+fx yF@-Z)v- )z!TC< ?yXsnx]Axd۪ρL$L YКlTN͔ݳ_KM:H[hƺH5[&^ث5Lg VtS_GD˔3gߓiWmXnE$%j峏{&^eD}Ԟ`y_{_zkЌX-ST pO,^2>=d"YvÙztg,m2m6~4gx%e2wߣWaAe?-$c_ &l^>SjGDi,zw$균բ<8(x"֋t5 ~҄x}cyZmz_B0h`Q=Vj3E'b&鳵ݧ\bر]Ǵd u\5XwUdPt %亸 NZ5d[C*+8BXݤNGτ7S&c#l`- w޼=}xz-WNkO"Mhi?^19~e!T΍MP0b횕'D7^z'zOeAd18K7ΚŖ~Lt|CN&Ov}Qd<`=+k9 =HUD:f2u"0DqS[x?A7:Td. nUZxs263G^d-go`vHvpn@ԗߏ k>^iJ;Aف\yd_'J,4 jc 6[cO /a\ѭ/Yo =Vg'uvV&J'H|kym[V\dyEvUN^5c(ONFS OeLigP7p}dK3(\7i#Ф}klZif,N9b'߽Yo -=pXU[wb7*2[L5_d\G~Xd%rX?X{D6ѵ%]d"1Zcd9w Yś%^eo ү̦ (DL˖nDMk@l.KzM ymO+M&jmJsy_ >)o8)YY@cE)zF\d?gg5\1Θ 3gxo=XsxAؗGYϲ\'ϓdފe@GE9''|טOw{>+wYP~QL1r7zWbi2!R䄶ʄŞz-~Fn+LSS~fkT\x h^2bɎH G9a\d&tO2X%/?dJ6aUkj-y.iʰAx6kۭo"rA9|?̿1X17]+Z("ɱ iƵgȭ?qtF񚰼a0ewy7^[& k*5>O-X+9g}U^~њp6̲ȦYr %@fQ^ 6\@Az6Vv$4y^W63ݗ)o7_7/6֣7MGO`ݾ*w<>΃*'bAhB~Q[$vt鯙M$H%zFm%6ʭGYd>ew읭ROx'e#-~Zj~$-A=wx?: -AXi߄76id|֒)}fծ`4:`m Ko}%/jߙE,Gid!]m^ki1vUnj+xn Rt9 NO3Mx/>kqt˞+3\h^2w)R_;<Z+1b-U5DڪL8XMr<\d$SO+YްNJV&QhkE0e/тr: ĈM!]<h3S[ֵ[ R߫VVkg+Z^Gg?(JFK& ".k׬5gǘ>f{L=4Y2',v|OӒ8so.ꩵQ9kR+f&hOQ|ݾerO;4 `ߧJf>P2|`c ZezWW[OE).~$Gx9Wz9͙\D^(;X^l1ꠌ!戢[_X d"\g :f;yG+ 'JcZ4?[ƙ7H2ZV^vzj X*%g(ן٫jdۻllcؙMj_ʅd;Mj^oTE라_3z`508)$3E뤉~|ca&wN hA3>pI9Wjkk?[zcZ3xTrzGxuj A~}>c,@ˎxd6;̷V2mq2w=L)PkWoopWs39Z(Y5G;bLd&voփax-b |z22wάE&i%}uNDthOtMgNp %kA]'کo#dQG!Ye4BIrx_{VSM5i`l'`'9vMVF$<θP2H 449SE9Hoȯszn7/H5s})g_7]}aMwޝ6O BG2GQ$^+?{/z'mJ&jzȲDiݹS r1+Kd*"'hepFl55\Z㙧'Xgΰ7AÚ#FسK^ݧ?2tloBlW[buU;xԤ`&tol:jϬd4V#hD5"KD[sUPD ̷lϱdK{"O+P+ssse{ޕii8wՠ<z.~qwcbIu9F֛fₒGm--Ϳ*s`Ֆׄy5ikdhz0q,[5"繳G'h$֪"{ ]x?}d¬ƒpA!X2z}]U_X.Y&]Qmo2Lׯ9Ly釴*ZJ `٦"⃽=Rz܋:tm[g%+_6]jGȱhF>E8Yϭ3דԖ`2aD.Hגo]imI{[.z&y1^5Pzqo>4O ݯw=5a?=Xz&lH-Y{> [Z1Ӕ쑸&], mK m5NFs&/oZY֓qvHAdG*T":[ĂDs߄8KWaZ_z1#Dx̺zv&=I#Y_ }r s6r[ xezs\u3=pzGhP2~}AYED&gAO&cj2mf; VC/bfߊ;Qv&sCywkx_6Yed4e M[s.Jߥi,Ԥ/]ʇ(eSzFq4qR1O`${oC; *:mrVвC=D]EAXPGȲEkIIeNf Mz+@]x{WWydkl*(ϳ;uHĉMGW tkZbN~wqHXRWl}"sĕodQ2-17^7e\3%SJ&&{<G>5aB?Y_r2-M)kĝ#eYmd7AXU6 ylYX z; BjhܾG>Y~q~Z스u ux\>׋k} y,)d?MOtggjdy{|6M2ṿ3G5gfc5[."UWl-'+ٱnUAxjΐh6K m]K{z$2d ~2Z9w:vM_s:@"oDf:A*ozu^=5EYmkgEh^W2 _Q+`Fz V y%lAx{gθ'KF"+gi"hA*eKvۙ|j;W ƾy۰G][˱VP-dVߕs~j嫓VҸew ʖw5IE<ϗ-Y-|+A pϒkhVrJ/5.J_;=<Mz_(R7[?9=sd'o&a 77{C<+Z6ޏĴo2qgwl2&,q"ڒc'`AX<_]y ;=X=[F2,#h|A %wD./Y(ہe6w: VI&je7{^5Y"jTC:SɴjU]Yoʷ*Wzϻn[""RdM\]!3Aj;ij 6IǬ9}2=-v4vr5魾CYj#y }tZQZH={4ФRvE"MVѼ >$m_]_Doaf2dD V}2̌,7g&]S&Ug2e7=WELc?,HoLgAG;_R9՞eK@'6ї}2bT-ÒiOgi>6=cm۽KҲzwf=o3Dw%Sr#ijVa\g?}e'Sn/^M zW`c'iwr{ZLETD 11{h0$ײϨ .󋟏ӱgAV4N4G x>oj&|􅣚d=35߄uZ(1#D;E mY?3s(,-9ўG&b߸@g3f>)i"<㹏h%[m,Y鿏Q#.|B彖g{{ò_̢9{{EW/Yv%c^ѺhaKg++(r'v;m,瑑*g׈b GhJEDeޣ;3S뙐dZYJ':&Zok#eډMZX2m~ZQcym(Xl?,MNb$21h?[.dl'[@wV,,^>d5Â~6sK3j5JVJ#vD`ז)YS23R|AZpy|~RlL݌-Me9|R~2޼=j5`kHu";25iL&wenxBta clV@;3#u ;H-LguihB犈 ʟ*`g۔LEy!-rM𒘕Ҭ\8 4oh{Vg0_25>Vmw^[# ꚗu7=i 3,mJD)kDsL-,25&V)1dR;xhA Gbo,V, yԗCN?tCU&tY$1=Za+wHOj[-l}BZL-һiKT YVD3 ۤ)ޯwSShx/ }'שVO2Q8:W7(R&3~ )AȑI)}^TD{d J;+տ^Ul[94[D8KīʵAiPVDTD,c{leD`j{R{w v'6oS]_ιȼX#08O<(YQ`fD*> }xgiRGX I4zdunRϷWQ&,QmdiwyWgD~~ǠN %݄nL{n+4߶MXOY`չnj+]㕚55IOԪ%DK㕬k}.wɪmu>&-[VIR{Biuyb-̻ZŠ(l SDF 5?Yp<׊Slz{a]Ej^eo$YOPޅ/oD;Eɴod=yLSdzvM ynr,ݻtT&[Yɴ\$ɻL{E3߀߈YgEsY+/E'I&dt"Zozz3pN#&ĕ{ud0ބ7k W{m`d;$rm2@O,y*,1luůSz*B&4YkDo,Q2gdl$~vQe ߶\V :3`yd7qw@Xv<}iGJ`9hkýa0u<9q"|!$tƓw4Qx`=(Acı&ڨ2عrmz6F#Kd ϶M[z-V5K2hԒ[h =%ܾw΃Gߖta~U]AhF4bTB߇25IR=! Rbº+W{}ML:*""cÛ3Bfj :uo r$gzs2Z3!YAWz4AʧdJ63Ïgwtf]vߑL LME3y[^mH͐Ѥ{!>GF\5+z={<֖|Y[rbdO;bDqj-g͸A|Ӻ4e 6%)JZQ y=[2-k/`jE\Ն13Fw_k'ʼnfc~,D;R/ZgIee Z'G1XϾ玣G{^#w8=&=5N"FO-9{v4Ic]ލUÓٟ̎Kɶ&Gk1Қ!?kw$ˬ Ac*>A)Y y5L۷Ϩ_X#Ⱦ|>ϾSF5;Vh h~ޔ lݓya] ⻱TjdDH+Yw?b~YE爉8חW x&STAF+-c*zVku~92v6Z5#13Hvd"lƊ<؄=zw26;=UWփvR3Ms &$6rSn[$~ Mf{<,(笺*Yx:}f[E,MI$>G |O&~^fƷ'uڜ(Ey)7}FqDդ$+NU@73Ih6Q/O|)ˍe|gL9lv_Zmj@"ֽ]Yִ*G&|Mx3j,/YxHg} >o_Zk2+ "Mɉ-ED$ySIdj:lS㌟zy芜a $WLv{~[&W|cfƠY('ίj;zճY F=f}SDK񺒱I^b:VUFɐ,Ӷ:Fxo_&-ܼ&ccMĻ[F~)=Yw֮j|Nҷ =2yiY|2RИoҵyu]sUdUd+'InW!#oL"Fx_3c=/_La|q}d|h8;I߿rGDzjb~rأ#gAQؾMϜ\lMXs*-瀂%Ryyg]7tW5ѧr%HV:NF+}QVֻd, }[ÛоXgӒ+ -F0[r0=jr0ߌ㫋942&EҼz[ԯ3x~QxxWeM7)Zr?%G&k`=A'vAG9 t=ιo"<#Az66VH5Ɨ )p]N9t-.W쮯l3Y0+YјjL [[FK hd 6I[=%Nc'vLe5s FUM_(:>*V/;{˖4g^%7XVx9yފɯj=%Gw3-ߝQotezUR2gQ Y|KOFcsݑ]kQAx=wAP+WtW)]ړތL o =ot{k7~>' VU|j,=+vOAka GXIY*{ Sqү&yAҽ-c{\rQ[tyc`ԪP7ܽ{Geh;׳Gz,;/}U.ydu[KFs<F?IHm"*_5l@2ѧA*-M_V_3HOMvI%Z |&ˊG/g;hF{8Zsoү^MMXc8MޛլmCxn5"s# &lJdGJ镦ɴ8לy D~ܡ `dmr?B{ 9N(rL|'m8$;[l)Ri:w$h0Z%>sX sq:Rp[dϒŷ4-[kT`gh za٥`׳ޯdi(1짖{ng*jXu':+O B,w^jOV q&}c%ߕ#Ȩ[^L1 z*d_2ZhjN'Sؓ_WjS߈Lq =a4MB'Euk=.t 2=8ȼs'`qf ‹ITnMջJV;MX_EGwA<[׊eKS-kYeAX#j:~I>n)2헽KFq `=g/IUQR5} ?O)Oqd|չp0)Ju>f꫎$8Q{}:Cj(92V=X^]%RzĺE~ 8:>W8*+,j>:D[GdݕW杉j7z^4J:3uMjwMy_{z3`1{ޑ.RN1N2L4ԛhxqb`ݷ;*Sh}*-֝7%SWdSsi?{jkl kN8EU5ch.=Pm\AwX>s+ܗCC\uגU9O=ަfo94f6Gf?e&qd:)B)Az{fԤ_+tAΨ#"E\;K{_[4cmDEd|Zsz7eڢWR^&|X2s/v0-V: DͼnAZ^cW&zj)3`E"O4цz6Ѯ'"b3~3Eo:2a-^SNorn7 :6ї}9;9CJFߟOW[/-#=KQ_Pb%=D+[l^f ,mFC7+FHD5Q>/[' eqZ/{eJ*a5AdKt-΢鹏di_YdJվ#a>zw(ο@+J}!HonA2^\ӫ3GD^L)B> -m]-"疮!_Ԅ#.` /rhGQ %ɖ-xвGK؝K񰾣 5>My&Zϸƣa5VBգ0ͤ({|&4bڤwsCdPi|Wѣѫr"+WXkLԈVzkj ]U2q( *B'{͆4r(^3K $Ykv1cy@t5=d7߸{|9:f7X+d-<ml6EM>doauBm}E}m+mYJ'^mӸB\ :^Mh z+cEU܍d=#Mi϶fGZeM7w3櫶JAEnu2_!eզ>z IeIPM]Dʲt3%[ybSW!S,h~q*Nﰮg$wIڒF.k<ghd{?2 CmZм'`ڲq[eݜD$ٞ6<ނd=ި%ʿ\M|'ś§f%e[{C5 +hF.Lj\c)AxI]&]zJ&<_.仒sh뗓G 8fM}$;8s$ V_TS)j߹(ymmf"8Q9Ie3p:W2kD &z٫MxW!ݒ}ri/h> /.Yλ8/ww my(?7z>?*Ovp=&1\FㄡQrq˴Πk?U_2}lDɯ KYF -,1Қ++A֩>uy^_=J߃"PqdQ{ޕM/9ւ7ၾFODwve nAzvDz I &c -KonIw:nJ=^筝W?jaeHb2O{nr~+2t+au@{aH~{Zq]sHφwlW-n"&Jx2v~HOhUl0QH?H% SV&gwzbznjgˇP~ש2MlE}ѷzDɫGA8||AO;*t?d.H?cw%}9 ;Q١"hw ,I_J`koF,d!:dzjDLJ|v6I}mŠ{~&NC]=~R&,Y_B73x콶22 /M@*181FĩsΫX/Ŵ 0Y^KqNo0vd4Mr7}OZ|smck C;՛+C*rqdj Ԅ:vujepܙ4=Hdskz;7EfԬV4vfd4yf} +>ݘFEXbid+2.[vodF T4c@-Sϻ޺f){ن5FKLF]C59o"hmA]ygZ>?xx1yz`-xXeN}ImL UHE*mm,% UX _tO,YeY?D7 9&hwjʍ|Թ؁$囻 *(,EF " ; ܚ|?v&+]6f.اJ=>"^WEިx#ߺAE&ڟNr+Z_7gAGvӻAu`εz.wƓ\YfI˯*SoǬh ;uKkW?}G&CSzT26s %?s`۱jd2eBϱH=]z$Y%DJIO8sx6w---+X~tdJdo/SWFHAXw%s}=4~w~e]6{GMm5)>yd~WV2 cޗ^cOվ+; M '&7sL+#H@_\fby5a̾>6+y֯_1"f/9 ͩg`nq:`ydKٽd}[VG6 u )Yε\ܹt=v.UqKh}wK}1Fy&4o.Y5ι}$^*Wɔ1>ON2靽nKsM|T^c`[xtddyZsZ YT^|ɶN,sۤez8qL=,MU{ܲDkavsO6Dٝ7L4ɌR. ?15S2ajTh bAA@:T2x~+d zNpd DK@MM6g`1svP\c׎lXw hFri#WDA@Q(}vdJJHdNAɔ(8cH3-QѶ[]lh F\_%׀ul}/PyJ_^tz.a[Q7Z^7.3{dYnuȕohI+\1VR"ssas#Xo\2,F#e5JtԚdzZɺy$ԞuGbcuS%Z9DChS X[2#UD--_>$$Y; Ǫ&fXGZ?c4H9[ q V}G<5]2\a9Z[,*op "ΔLMsƵǧjB `?*"b!$V,TD8%Vz:u$S֘O+Kf9"icu"jhϲɾX}a|{`B5ߓwx_-n^Ivڞt0=&V&oGYo;<|F%s2g]:-[W.ƺHyf9QiςhڋMFKF^4~m= qrmR$VrOZK# {ŶkNEdl5`ik* G#5Ql" a>խExS{&]wM;娡]UxE2vrPTdf;o66/ YwUA"/2DtRez+FV[i$꾿}y-m_ץdʯr=n%5稳(0G)ߏQwӯEh!iK+K LS('K|-}S*Y5z }>wۗ3j^S>L_\E;K`ylX:N\׎}zZK-ʕ^'k^ac6蕹R6H}dϽA⌳yd$zTM &~ƵAՑ~mCS# +(d4jϒI $Af3{fj;J/-J$6s)_ֈG9mɔY< _S/&=ɪ ZHM[ZuKky@,X K3 ؉Z2c>5i2*w u_)j(Yj+F=;66[UȫT5Ռ7I\Mi$-V]Q#U(V{;QD-MTQZ`2.w ;o{a#4kBs i쑈dZdhey緜smUn+Wo¯Q2>N.L/8=Ao "-)g4"`f>TA\USU7|FRt /zlͽ1[u\|y%ޑ-RԆ +b^=׌7swM}2|ǺXWbguTzo:*Wid<+R6gwD|V:{:g_9g jaeݹNɴ1"#CZV-^/4/bEv18^,s: Gn"Z39Mzufֻ/3[ xo7VAm*6j <~Қ|35aAċ;yBwWQd,=3qd(gY}k%{W;5armQSznx 3(h#E-闌R'7}sɺ9hϿ:]kaDLܤg3Hn0wDK'vNah'Exٶѫjdue;woF2dw͛h +q2gw}|8a|沝o/RZW7XĦ;XTi`۷~{;= YwdIkhwwz#ʹzr0-u}0%gݣ;@컪`=#lAGHqIa&9RDJ&: t9%}e4Jmh2"|rZ5N2sM)ا,4KXk\;Γ/B&>뭔}.Y7a#mgJR+]߱] 2$=[<7+ux:Gr B冷Bi7*G. y(z ÆL*c֦U[7_֚lQA#g/^L9oE%ֿMEZ4XmN$Z lU6Y-O<Rmx\2_ހ} z D`\?:"%^g ([ziWޱy 'g<|7 WcEeh>`;r[ӪF^t|ڙKl} "Fn,4y0w❃ՌQ;&Z.Bsm=EDP%HzOR4^OZ-R;s f!&~ߒE/QH4vQ 6@귲|Z/ wWm-.s,=>_q44W /`9c.Z5ւ-zHVݼb>Is BKxMD0zVx{C;~ {4kHAZ-m;zZ.}3Ec`*K+4NGZxz[{݃ZpQhbՂDSJ&]Vd-nGM_+vceÊԮ?Un`+t]:tu;4GA(wF=rRڗx^joS*Iu j|+˳x Ym{޴hˑy ?U~%s>ǵdޅe?;?^ i5y;ЀUjIC4g("0Xsn*Ho41eL!79{E~CoL/+b <1 Y島er [#'SGip# =~Vr#ryM*jͭ ~YͶGD]K֜q0zv+/}FDWzyce|gJ|"":`:{X>dܙق2^%S^%cv;f7>\Wg h\ Kg,3sZMXtڇ6_Xפ;+fm\L-Nu݃g^si1Vkh_7ݱq,VJ%3zue H~^'Y43KjEL:e%v~Iؔ!*idN~&<82~gXvoֳJda̕1uh4A,"ghZ^ckM5 y\v<ִ=+^+L[\A"{(YG)%r|C֩瞧:;Fp"eJ4ՒL+}92[z=e sd95##<;#˟52 =yH j/+ Rx]ej,oI3dD7AzJrv6'YK9VDNp`٦qxθ;&k-PWXoPc:2ͽTAx=1}'K#}bWzѣ%{1\C(A.֞k(hAs`!U#aMNU6$&B|Zif?o6bόr/lzZD,=]rW9niKv[q`ɔ5;VODظIm31`; ݝ*OHvLhO^.f4b`ΤX2V~jC6hޙ{XqgvxyVEH h d}so0sh0H>Z)>, ZYSx'aUv'~|"'w NK5g쏳 >>o]ٱSɪ|r[^XggjٯJ'ANynײZ}at>W"I):t&묈Ȋx:! Y`Α_X19yWz'Þ|9(6Ů磶k YNt((S;r"sJЫ1kx#5ƚ<"θV{*Y5AKx ==hw& 0[vNC!so/Y)yǖ(h ȡ>-%+Ç}&AUe|iҵi:W q⻁b5DgLxor{*V'-Џ9_>Mn&R-.FյdC]?5>P+IL "2ZŅEhF}%nX9_9tW F,]@ɴ*dNV-»&f=TLJEٚI=Zf[u%ڱp'|w&|j]9$uu\V?s9ZȜrvv-X^zmh%Mo:]ojt&aZ5ִKP{9P:x,Yq=./RD+V#S{>x2k8%y;)Ďڷ6=+r(9Z*,,3| "ڰ%Z-$W$ R _yCڍOt\znOxhWt"i&GЫx j27Bj;NOO_q: '߭SquuMO=EڢE0 \įwgߩ<tQ!bGxnxzrE-_'tuqѻ<~&뫋쁉$d87I^ܣMjwG^ބuu}Z]ٯTe+)"JYJ\ݤo}?- N{7Y߽: 1Ș8罚g%G#KG iu◬lejJ>^%SxMA)Fwjml9U5΋!ݽ|f13GVzZDI 衹2OnY3N[I,] v\6 .4QyvүgODz[5[D);9X>oU2ws+7eWYtD\yV1΅j"zqD6yfdod7y?4~c0턱u26a+tn,2| K(ͻ2^z=FղZ»_d5n1aR2MR8V)6)8ge~?Q/3Lmid5a21Gcl ڋ|N05(x y2GPZ:dM-ɣz<햻tgejuVYNAĊs'`YkAOr-}5^f1K&ZXzO#ȲSv4hY)g1,SFokN ߼l`U!Vq&Yu-u04{FM4ht,&נ^gܤ{y&=9ֶnX6+nEX'k!C~A=:=r>fEvoHtf sܜAOZ8a:NֵlMz[e`92#VO(ϙ8"^$شAh`0//gI [-g-gcъ <~&Yoԑ2ߺt +_#7X< 3HyצA~ ҳuƌeMis?Ċ :_V-W፜^[~1 vM4Z}ۨ&{S=wYƾ)dIė}Y*ʛպMptd}Z5Q \Df+te4YY%FGs}0 e_CV2ޏ@VdU9afL_e-6uȔdMsg%Mj-[eiMl#2 B y&4'-leH>Ì w[«,Y%BWpꓽEACŎDMnC?{ _+ ٪RZlk}9GLĵl}_[e$m|w=vaRcA|Z~!#^( "6QXxA^djeuo5:fBnpj/^1az#qWfk}PJճK=Ĵf,93N"W7ܜe'hVZV}0銨&iFUd| ( jW 5féS߶A! #ih‡EMwj&J/D4kޤk߹?hj kSf\S>O":w_%DZG#,??g==F+(u&U~cY E|ի@n'hB_}T{8X}vEsng0y bVn bn ]2}ϹJ]O;W/KǑ-KVO"Nt?kx$4 #ExS$_.nJ4-EAOn%.ٖ=yZ 9]->d|!re{vS+,Ӿі[FMh5jXcEXeT#ddײz;+@3M*y.dZkCػy]kW4rj-+q^{}W[f ^w 9%gdyF~>lEΏA'oB.Mh1Y"V7 4Iz#*d }ЫHUZ+kBle"+m=={Jss<9̭']YוM{3+c;swxAjԵA|ֶ2c5=9.kuG`$IhkHÞ7 xr3plRا~& #ڄj&?-;.hRZvQA&Y_dlCg*YSgD,\2Zi튼x3&Zr>=2%[ܔ]MHȧ([]ydmrDHՖLyiT[*&<5,Mh#{Y=4Gh,]CJ:vr&Iɭ//yoQ"^Pf*{1˺nYOï\sJju+[dSUhϸ`w'ߡve'ZN=G6-m-k| k?gΗbٶ|.ZWZ b6YU'ҏxg*I{`,:A][~Pgl}?K'M٢}d眫Y=gNݑ,; BiF01V,&ȡ4<>G2S-{Kn{ws\lY,vT4d묚z="&f<5[riҒ)%뭼Ebr9iMgfNVgT<o#o'l5.Q2Q݃Bm~>۠ K@֣"Ekă)kֆn5{sDO5#uv}U=KC -HwyF,%U#%Hesm?*{:+O R];S:]˼&b%V+Os|z0}+r>Y[$ŹIx9Gog,yIz*eԗWKYL)0qd\5+>ّ"ĻrlqI_\>yǯ{E 5Zn 5 ~4E澳k7a!AzBWw͗7h" %Ӗc`{&;8|Ddtd;jB;0Hsƚelҝ5:ng[LJD+үGD  @LѪdz {˞YmR.yd_cȺ+:ĻŔLaOi^zd}';VSn7VN[ކej2}7);O jUڬ%o{߳e-oSLK9,}XA닚+MyH{0RcM؜ou篳pdi鰧ք{_>%ARQ&ˎѲwF-ok%r]zng:q{e~z&{S97-+V2ߚE3Z-uR^/Ik}hH~u$SM>9d"MM w]W2^=`ike\Ag֚h`U{ 4ACq9G>o_#?;r K4AƫG,˛Yn;޳&VP}E Ȕ޻&)̝gf`ᝮ7(s:&Vmd<<8myGrO㲌m;oC%cosX_Q洚H]"HeղO }:3ňA>߻"f۲)\VAU`p{e\}MxRFˊg,&~۳L{X7Os(Fh1%(k 4rF·$O'yBV&L.d`1z"' MGd2#IMs|`|8_rw5:YJ}. ҝEט gkOˤI^+؂oZW %& !gُbYZ9b Rkk723hOUly5J{I)̎: Mk_B2$ үY$2g& &>kM\H'-g}L[$KYV4妱LiUb3Fel{tk"3, hnL#)&|G>d]=٤9UMݶ/y+kVꖌmvr:2rlj3`4?ndS7E:}IMj9@V Z(oVKbQ ֣ d2} Γܚ\XFLG!|oT{J5VXc+Cߡ('G镣 Ϲzzr1C b+:чd4ɛh#GYoӻ^D:s){guр^-$WDy124+˺n<;7g4QKn»u%k4{ }gm7Bs.tc)>#:Ac:]m2Q?2 B[2fWz+=-˗Ӽ#&ǴA1FvX{`zfϚil`dU3Ȕc'Q2Y3&\~KjԞ-9[&J7},?}.7+csɮ*璱)Q -O' B{(i26_ZAhƇ|}2ɿAƆ*o/uՄ{eiO=/:hd,ŃW3F\*x]_HGU_E[,|3cZ;ɐ?Jd!XYRXmokVYc#}ڳjE1uu$H,׌Qkz׿E*gfex+Q(ۤkkLMDo8H-͒WQt;uf|/IOg »yhBx}LPc9:U2;p{W(Yu;@,c{̫<Ӫǒ9g9JV$LGMbUJvѰe1e~>"]떛hA:Hw'gK,A;^ֺez޿X晽d" ߑ9 Uĝ!HV:$-JW]X${kuKuyoψ~f[rpي&i*LƦj}%Swk䭹{dײ > >gd/HϾ:G]6e+Yo42 8ǭ.LĔcAxΔOwŚw}+OdZ˷Ú$4]he_l[vD ¾q Jއd;-Hi>nbYhgKT*'W2WdX,JV qF'u֤_-96a4mV$[.QWy粮jB%KQ`gB A|G_׽OY[>[љ2~ٹJF-TrDf MְIFSܥcJƣw@M'ZŨY`υVY4髶>dyEZ ɋ^aLx ?=OD{\uS+VV*$z}_Y3MسG~dOۻy_Z>+ǽuf^ݢm3 >U@OG%Op|yI*MΎ47VAXeA>udn=2_3,Y%wE#gWzϔ+YN_g{'^?cH.T/>GyʛTdDS-Ԅul|]>ǑuA./{XC&M% F GoJɑ <9XW6}pI*OdNLhRO0Lmqur.ЛA5NIu{'s\ԹdAohĠe#ߑ0`Σsn%h]M@8IڀWfض'@UĔ7MRJ~rس mbΰ+Vߨف {{`Z~?d}3-|~`e,w2>GydZ cs\X 1gf(-q^cAG,u>Kl/5ee>&+W'm>X2ݒײj. ȏD< =Clk2`7$ߡa3cT4wΑ"&9O `t=߳҃=EK~>^[kux=rpFu,lˣw-{A[iJ7zc3K6_ᨷ"ێ5~mGYsEġSڪNhRs>Ӫ4;XoUz;wX a|AԾ`Aڋ <4~ )'2Mh_[,e%&}.=y'FuE Ө9:O^v] BwʓU"O$u]#ZEfy< ascvgQ?xyUV2mR׊Ԧe4rXDlZ鈩iz2GZb51oȣ'MJV̢_e!.ʹ zQg,VnvOF *êc7de5)'|\Y^;zzwMO'c|F1} gOiNjQVޒWY’-#l]-F."=9QKEѣWw*"#=_؄Ƿjm5GSY{h,rz֕I_x$VZ2Z~tt]+-ZZg8(wr@e0_N/ [LKߣWxAyKvPL;^OWTn{.Y|3R(Yl38f;2C_]*",K}[ F@t9׃o54QM֛9? 'yu]L8#r_4-(q9XG=k}UcLXqef{)3OGBϛonm_,䚒Nvx >[ɴ3PZ&^j}nѣ?s6W֊2g%0%ojmV*J׳W%{O5;D_ՄYVWdgjmY&}>`dzd5zZbkG@2KYD[ùmOvvOJ۩5C;Fss4 2-wmn|mGDGG{y_h!( YxbM#%G*2zq,Yr:ղ@ir0d$A.ؾIGJ"bT6|"=B--(׋}5aau̓7X٧&zGQ,AZ7 җkM,kۄύc=>ڵD<絼.]Z-_1od,&zbo6yumeuaEx,=SW{2U%ۇ.~tmVn^>PN ]wy,?mu͙g}亐\=t>(-LdͫGK93Jフt3G~r2F0=zӤ])ݿ'M!)R]c~f3#ʰĘYɲwUWէ5Ƶy4,3y_"}rN\y\uG'|s厫Sӛ{`*w~nTlA?鑋uIEڶHdpM ]J\":g QߤzmexK_S&~m*Q ED(Y<::^Ϻ;kUvd#X?jFǬA{MmkXS{lJZs*;[cOFgL.q +-WL /_rl*ߠdzY:d޿XƷLA;Ǭ9+OyGLAF9rD=,deg;F);^q]Q0~!ۄ'YUY?iM*ȿ/9x6αD+ʔL~`cc2Qg)wQ=~o\63 f >-w{ &Y> _Yho""}V˿L^)-g٭Ϝc4} LYZ dW u٭"Sūǎ&lsz&ZMy.oa%[ٽ5XV5n›?6X,q}k]]DmYӹW)U%5,c9\-ܤ3ůIM5ሩK|}f\%/ڎڹ2;G*͕˃Q%OZ5Mj]Xey'7/1 E3%jdlUiɺfuUSx??Yih̟zl MXF9"o;ߏq9NPAYw.Y5㜡ˋ Jhk[l*B]ۃ2-ӊ^* ֵ(' zΫ_}KsU(c-AOdg .l^[dH_SX6Y{c^+d8_"˶{MrnN:D(>2U.OZAW_sslJ sU2WExMYDTB|HN{dYMjoI>9a=Iϵ>ȖG$9?qkzhu;ۗ<(olq9c01F ׈XG+RԄm͝Asfݬ<^gg<5K"j-ࣱ8e]eʈY]jI٠}&KK:nus~A:SC&p*]`d,o/b'eghԨK/yОAդ'W-LT;o4雼B#MZزJ铫 h]W*ª羳}FfͳOj0%1s+ V]O B/-ZkD\*җ 7#`s-'Mؿҋ`d귽X:nhһnE\][2zh8'%OK>%5Fy$tdޡWRs%WbfB-?{{X j(we~46jeb8 !|%8|soF{W$ITڿ݆M*=E`u-/]T<oŰ9Xz8Izgo,ޗ(ڷU^&z 5NUDk*5MЙ6(dZc&y+VY*"F%y~Χ{(]x"K 񘭼~f|+gXVkwugi"<' gqD6H.ozV]iL߃lW:4Wؑm_"Ye*&tQ[fgheHfVA=[MwXXg=0ǷGKF]Jo6 (ү{I d\9kNu79~QN>y΂`Uθ VmjժSKV 8ؙ?3`l0L=.o8v{GGE+P=D/`E45Qk܂~: gJ'S^=rR2mDKWJd4Ȫ9 9InX,Wtj0w49zh盽b:md"AzwS>צU Bq)?U%:\(Fl%__}?hst./vr$KSo'KcyYmE><4C.&3E*un<˯?o6KBר~0:&^/聿F' %ABhvz2;.ѽ'"`6 0b&;1uFzH_tbsvzp2R};Wmd]g hWI'LDy ,y)K3W P~: w6HQ>d0nJұI{Jtz/ʭAΑqo4¥LM~'YO8=/Фzvkzl^SkDg V{g){VV^U %G[fe6 E<6<#WQc^ R|~i1Qir wfZJ5׏g ֯M--KchZa`?Vn{MD'xKz=[]85g>F"~yl>Y_U&WnmZ%YϨA\t!>^KH/ֿQˊzG[%~?Ӄ5 ;Fɴ+4iۆ)Iq~2.`"ѳ4fvjˤhI9e=sKﰫAXn[%+^`4~gW!l#uiݯUdt3SAWmXVϱģKtףd1A5Y]"\_c#$bJf돒WR5H荿}|h[mɽƐ,̜UePUQk8}sM!L+g۞B2&TCG%jYϷG7a%[ӄxwtm~eb+DDqdQOo}i\ӺI~dfQD3aA2]̾6a۞GG%]S6H.w&y'+p[&߃:5 5'b}8Ezw%cWY[qd4E?įzwDAo,w=Ms)ynEGܻ = <=~ RxjM1~1מ;h5Aҷv3.$4}l>Y aG&)gXoH,6%SsOgj{(T5H(:ɑ@ s2i,}O#^#6HӢS ׈}$x3%+rJKwL{L+YfiQMŴA?6Z~~y43҄ORI=ZVIkёc==Q:|sǗBE8oB۽ +-))-y^\4XztZVkMXF# !Ax[k~33ѳF?ݥKVgԜ3Y=־.w."ǔV}VZp2AZ;QxCɴ8V+6^1S>q͂T[G r,YSZMbv-5QQXkBc֎:U~uFoLޘ4SI ΜuA\קyNNLh`Lӎ&4/I]^<1-ђPQ=LDHκ9nXٹmU3-{ONoko$Z(=lZ^[c>?&H׽>X֛^$)w׹g<5%oY,_+}|sY6Z`O.Ƚd޿Xn@|- ts-uGZ·RJG 4hxČuIWx^KI3ə& uM|QFOAT_)ү,8` Mx^g*F6Ժ7jid}Mh=i,9teP +Yu+ӾTkS4ܔ 4sWTZlg5>Im^RTSn?d55V-P&]쌪&L~O I5ݥɺO ؁>z7q㌹G\2s=e{^:=K1AekuK{?Jז;~( gG6mm%~xar6Xo3e1q,kRj"Gygsb!/B-u*.HJeP/~&U᱌&5K-!ߕ_X+soy%cXq<9o3-c`W V~>#-Q|`On[2u $^m-clwf[=d{Ym{0J{_gZ)5іdKxfri9vx6PX^d|h2wM&xc%ǵAc}k tǬk%4T9QQbw$X< s6ry2TV/i"Os_m/G y\IiK\2-qd+kH1jn j%slu#ۆLQ1Z"ZFUʐU>{[2CWPQnJrR,S1>9'X7ݒ.=v V=zݹfE-kG㸖^kuwroȪ=3!CڏWqu2QfM "v9ϷL"%r7gZrkGs0T_]268o}?"ȡ 3 MH[ӯ35Lufi9Hwamݳ =kM &P.v~=Є_`V&l+]W;]3瓃8k8;s魬&S鮒)z2<ɲ u=~bk$ r(}OAƜC sѣ)q"W;\ ;2A|k@*N~^ Zf<1I>H_(A۹M_[]#E[ ֝?Z2mulɺי1VYA҇Bd:﹦t|{xo֙Goo1fY뭠m agH4$N9ؚt=#IϬ|=ZoR;\"iEvY'_x U4U_bI{<)Jg>Y9js{th V{ѯY5y;U?ӑЦ7XWLf߶>dTVj :1f>Wzcfo?wWnK%wgR}j0_`&thVV ’x5kj3 zz=G?9d=}]Gdߛ-c*\IDP=41:e- a# |Zͭ51^j8/T_$[/Y&=7<b"^~ƳkP^12h͠&*U4=;]K&b@9Fny! }ĤOWyls/?3-JW"9A'{gS{ZܤtvRS(稻{6!b*xJϧjTe FUn[_6&jd=]~Ǧ?d|еT{,圻%-Ww%Zwi̭ "x)gx\{3ASOpTY)EzMS[&A])+O%Ǭi1XsׯhuƟ#[XX^ڛL_hĸdQѾmK0^$V}bnWJ% K(n":9Фe/J牽ǖE%cIRy"yrjR/ޔAnUul?%޸d߈Z @>AQǁkID黫ѕEJ&bmd!Te$avWOݚ_Q%^*T2Vtp{k&,yxΒO̘U2>f0OR2yǕ5=;XP3$'G f =_n!;Jƫ}As\yky3^[0leW@"+A|| >IU"=xɞG,W*{E+u 5h)q8,J_̃Z2Fi "马9ָyǫeFAm}NQ|cN9Ul&|A"ӌ7 |W.+-z$kܹ;1rǯ%<32HGZ'cg5"-=Q!rohxxu$YK_o{GAs믽'דZ+H%G3Ahݷw:L~%ϴA|϶~}%/*+hb̖1[DT*=%n]{ZzNEdUs~w%nBMhA /`t$_9.hyNk{{{6LV־;43}V><&dlo vt1:@1k0 "r=LE^E׬׬\krtS>O)LR~qU fTdGOt6=!%woULl_ܞ]+M078 D[sR4)gIՊx-32S$HUe-;d]u89 vj:/$tYeMxG=Mjn"h~ۄ~+o+33V'OΏ)kz ҳP%-`Yuو Ɨ"? Y`칤dZG&vv,U^Jj+d1uzF<2~_}%3~z=n2vUo@kxڐ%9sWFkj O>398΋)QmOk B)'Pyxl~~owv{z Gx2Oܒrx gLɏ(B{΋/C桲׭OH)Yz^pL]ZQQ\ҖsI[IIoϹ`׭d(f lr|<|9m`zhydtlWB,yJd$<J>KK\M_zw}{/ή!/ W"9A!ں%sob1??Y=^5Fe,O55؄'|<&ĨAiƮ畓]26nj&P]cԄ76u`-<<4KV''XE2%d˲F"VE~G^z01H5U2cP2ёM83kNk~xq%gQ`"8#dtB:MhU $׀>ôȵ%9YKt]G9;7{2zW&LZo:94s8- |$6By-;WW,2ZF_ϒh(ZD?;NB{s\ܔ5OSGsk޻ɠmf|ZU. ,WUmM Rx`LJvԑ}+~h/T~ d^Bd;-))W⼗0MNl./ҕ][{^S9>!kdizG`Y]3K~iWltYVů| Kj ,bGRݢ{W^ x u z^d=;3^ ;-?ϝ]۴d[],"eUKMr!H#Z$2hSn6վdFy?=K_-H3쭵,~T{Z|akuuCQ-`0 2j"&ۭA+N`3~ 6*k E8Ms57x:,,EUە_U+sAu%Wu5/dہ[%Fc|XDI*3I!Ĕ^+HF(|+$eےLyZe!o kQi"OY4UlCɴTWV.YZy[(@<p5J2SO]'ѧk_/q/uߒ]ԓlZ:gNIz'Z_OeVߴd=:oc {31N[KoCK(W==[=H W?4_nY͖A+gghUdguՕI֪e~~yodJsYkD ⻾JǗAާ$gQnWs&y2|}M>V WdW)j13A94=8^y*Yw{m#o`˛׺A}vszƧ뚖Ld_&KJk;.ڧcXOBwBۤskm֕ =d=ul 83~wœa`YAzfVnBd=}&=8yU X'8hI~?)o}Ϧ$2G=MXI% 3Ag sk_3z].,jj&NvGAhEe:(D=ǑgSe,ѹHkGvM{ EҨ/(OR2,8sJfeC:qsUUm:wƮ{5Avs%g;zI;9[K2F(ptOx'ۮdEscehk2:C,/&ViWA+1*DLL 'tՃd^%2|sus4-7./>JSxքwĔ7ZvMw-y6K梲g 4a/M%Za&kɃ6 )L3즒jC_U2'l¢|&gDVgs=BFv_q$/upI&k˴1+LԂw^5{KFc͙shbwMwϔL<AG~ ?oQ2v{e׊z֒X-Lu''d.R:GKc]pݑ5^h_H&S\ޤ/o>H>v>_ Joiئ28" =霱rYCvmR*r =.UP{Mýv9lQSxK򍑱vX;dlc5Hy%LʿTZ0UQJxA^էumWs.Ze}֩)IKW7L/2k.o~̳ncԾ5hUƜ"&'^Pqukxx{6٥$[bѾ&ƞvei!UʩYDin?R2Mrڻ( ЖdCxz*eZ_{ Iz--h^+:Qַ4Kkdgt jy`fM?{qJrh陃6DZht/*/D_Ee_fMnDĽl:? 35{Zҧh/W+<l#zȵ2j ]z'jjd{HmU|,mH;ۓS=UEg2ˌ/9qAcD5D9m_?g8}zZ+;Am/etrMhs}1s`bSGZ`+TGdԧdxtqɵЯU2*(J&2aۚ衊Vw\7{$Ѹs{|)V&}wf?E\'{F.yS)ԧo{,%?=%k&$Xϴ`JB_YY!M5σɣ kg6uW;|HUKF}:IGr}&+*XYϳLLքFe7GTd=Sd<'=]/- 5OARGz'"◥G5cY_9M7%kxO3kuzoeWי]6bܾZl\ibxUmV2#hD՟"|3v;)YOsM|%NEW޳=HMxUĺ^N}]芞9iO=wH[Й+݄מAjMlB ع ^5_DoXVx>'P-|ׂǜ #+ _팫"Zw_]FM{5I=l }k 7 zГS٪h_) o̶&=}ɛto2fJ2:;M762F+`T)1f&'=؆&m`#ѺA\mXڢ ?q >_5a^#2`#2p-ç,h ٙ*V㯿Z&tLIO`|ˬKXPJ"Fͨ d[k30-쉅6 ҘVLfJF6GujZ7 sd%cgwv|"I,0=Rii q<k+5GRdͤ;yN9Yz-~ou降vh Qh$Y&<΍*YO5oe9XPyc+c]Ľ'L=%ۻ_ʚ:=ygdXw%{\|[j&CFǟJ&VI(YO6ܙg(;{IpTxq~tb݄.G ]PDSKg jL7r6h㎼$9WS_Kuu B/,bh:NN"44X=)i"^K!=+ ZWGY2;'!#}<`3z2jXb.2؃韫jAXo K_)sK y++7|ǽփIz 3NY APo`k+_mz:[nZAx1}~`xӜ-K\̽$__#/myi A坿MOTU&|WkwU[kHFx'b,P& hgYd3՚s;-$T0hd̳?QTOɊf%z^&g7K|ɫϽl1Dx G[' Nua Yu˕Q-{H]E&f~_<ލy=b]0Az^jjmc=-r]JrOiko,ք%cϗuM&%V%5,nO!9VKVtV3+:k"Brb"!~O_9IzZzIUHķmud&C b㉂Okuˌi>i3{K%S1:/磗L_K:{ə-ͪe,`IeyͪX`ΏV8 F3p9ʏ*Y-ڧ7Cߗ++gMf3+/\ZU#2Yvjg̻ћ"3.jE&5)"{ʫH`ЄGszsԇof>W=wږY AkKw}V˶Tc< սg»e=&kQSsehߦt${$х=7/?71Tc];b* [>2˚t_,eSyknB|՗KS",'q3Luz~UgLk{Mŷ&O-LNйXbpWIsZU3yD{M}z߮T;Lh}]/%ޯb%s܁%;o+F_8-"w]":[dܳ z"?QI_ o=X}H3M8zlNEчe+MOAkh3jt<_5:_7 z}=:OMjj]Cw 3_lkɎM\CJVAD޽zW"&c_?^)+0voOv"ҲJ کߤ4 k#OiWO&t賈/S[-!u qY?u5?k>[{Nkh/q!SԄG/I:ES,Wyl4I[:iZ'(@h;>?UdY ;Ո&}OEM--Mt^knX`O֒Mq)וߟ8Kַa,th%GX QEzjc7D# B5ل*OAxLN/gf+|R2zgK:gX?D\$XW'OTĜ}ўsHm/2-UMy0\O{Ϝ9'sc}J{Wi1<1_;y*2#dIfD鷩lzUհkIe^~%]MD&aaa*g:-Y諾W}CR[7:&8jv0Ӝ>?q LA\4e'#MB+ynz)8F;`,O >"YR& M춬jz&W&41d`lK{%]TA<=H3gH#qŬV]}qUT2:9Mh_VPeAI}ҤD ,3>aM0P=ħ?ڎ'ĪF!'~<ɔX9MDWqJk~$~frзdJ4oN K;riDpjorxܙaxNF~N(<dhºs:ej-K{Qt)Ie1}=&eѪWS5?h+(H=:#d^^3kwGh l1U{{w D5e2dZq UFr:'KvHHd9j0_/s<]GgQxAbW0}28y ēӝ^DԐ;it_qq_vY1Rzmۤ':3%)g 4}~MU5k“MGoYNSY 6XۜiC ;cd|'4sPhϭ3Gx̝߾*sb{<{ ~g9{u^f}3 zZ/,/eLF/:IoF=&ٚ UVd|x=Ec&}UɌ{`YGTz%YX_+A|Y4g@FxXZUEh8sA7wg&fԓ\ٝ1ud WTTڄ~4|[Ž[_+uNMEAEw5f 1F=G%x mF TAXIz_-Klڭ\Ɍm`VdEgTv^Y߳l&4'iDd}#--Y| }'\z+ϊL"^@Z&ku&^oR2=4`z>iYY"뷚y"zT2/)rO4 >(,dzLD? d|&9ӣ z{2 Keyd}uAP}]lS2QSsk1=ۚ,X,Iz<ϚncY- $6&=yFıU).v~7,1VBn^SrC'McZdކ_x%c{:Gd3$ms^>Yw`*%˯^əkwIՐk"Zgjg/[晟1Ruuz/9{gGrro̐ tlLF+ F;^_6&xbcUzC|DIUt6-S{-k_MXgc L0ќz] A (oNˮ7y"4Af2atZ1֤+y]n7k%q +hYYA<]$P[F]ћ:ZEr{ %U``4mhiσWV Vo>m(gXɬo~?M5|WߏVi#ϱ#W3Zo.}޷gvY&Jf7dȷjҳG?+YW&`=^x2_(]t m7Xw$}pjrL~3h]]Jt=2ݩxT_{{n>CW{U-wJixjKͬYE<񳯜M <-kL?AVV$-΄ْu5Zk2aÜ5R\2E}}vM%:}r=(h$gxub4%c\%PV~Re@ǙlE<˞dd7<:;/i'Ur;)*qb_m${eOZTM}9sx&F1_)5w &T?zXݬǖYAfLLyu ≘wKV9*RZkBSw3j.U2)d.egWcL{jde߂HYO5\;,QX-|T2z3Ex؇ڗn޽\{һ̷Bx0QZ5yYؒ_[埒E_ UٌEل&㭃cX>CWVN{2LފqӣⷦpQ1FNr;7GYJX H~^MWA*{X eV R۔Lkҕ3)0ɑOŋޕlB:j5Xj`}[x4gB75"~]ыG@$I lg%7vs"j"5G˴Yᑓ߄GO4On1oQ2</<+- f>"n]ZGYU 6HmXYyIg,7AqKc3#%9d㙘Y)˱|< "pxΌĝ P2+D4^>X_W[ ?u}UIgZnFƧ>yf%+Vs|֤6M;W/<[&J} ->-)[Z2W bAzg[U=k|#?vWrɊMxӯJ^5♒ikTK嗬3wZﳌ哶)}+||ʯ GE%:/dλ~S2q>v,=h07wcV6dtNvxYGRn;Ҥ^v~M~ &i(&zE$cgk~0㴫s*JƾMK_J9 k wF3mp@61fͭ [~g2' ~>\}V#nl9k&v+R._A,ynɌ6 KXh$BNk M\3`h}SHa &sni2̺nI*$3)gMDc=UY=;X}'Lm}̘>}Io8r^դ<<:'9}P{M>vJe ӊP~շ_KG; X*YWHW}w]uu꺲e|vCVo= 㟐y#mZ6ڶ9Ac1]261{ |={Fϼހ'FF[rE+O A@֒ "!(!=Sµl&<^(Y<<{ϪAKʔ$,=&AW S+YO}ԚL5Jv_rGţ&Z3*9tΝN'B0Żu-$n=n~Ը)k<7퇵}\D-3~џx&GGr|Y& 4AuY&i=+<Zͮ&O6{odMhOPA#DHQL~7׻iK6'lχ^ F}8UTz;c ^<]i0=WijyAZ?5Ľg`]gx5)JVc~̓iBOx(˺u5߳W9@]R] }+ٓ&9Ah9l+ "*^2ot?[X +t~'x[kC+k[L-禈G|N]Mʭ$}Ȓ㯰AhgTZ%ՃܧL%tݻw2vw{{ 8m#-}V-/2kU=$ȕLtZY4y[`e0x ]W}?:zl-8>[7/7Z2’y߬wv=$!HZlTb}JgWg]vodW;zwy%Koxo0m9'5vtm(=|ɴf'J~|IS%,)yhṘ&t'E)/u6Ĉ Yqϳъug"'cWŵDחVyUX _W=1Ce2q ˿;De l9GrƘ Z^\fʤY &=3c{MT"dƛh!^WlT2>ڔLYIXsp*K };E]8ܪ lI^}kݺsG;y+HZM!,aw%2: p-=*EꙮQ3Wq_`fƏz" ªoCVnsu0vcr{~Im?Φt.Ƃ:JdPɺjrsdn{%az]Pf<  {>$}W~ O-2Z[F;eͅ Jߖݟ!W %W~)6\Wôz`,mKR%HI-)i)=UKxd潫3Lؑu{isWOTV2}sKƃ.51?㞃kW623֓W_5Z6êrBˎDc$h+>_( `Bz:Is~^?嵂?SAЙc.Ax0xzJX%o8:AEOg˂)OZ/صDKu)x[鷒Os5jZZ82VD5jVmntڔWnj= J&n/EExyIz3YFX!"zg9ZծEzkZud+_0Ewx mZD{k&MymcO|<_0X5zN56| )6EiSzĄǒ EcG߮j-|ʦNhb9 N2y\2QG2'ǽc9&9k˨=è5ȈnO]y+Y#sTx|Wx33+r0>s7z2h2>2;UoQYɴ$pKY2cz*w10sV =AˇߠlSsuJ 3e<Ԟ&;~J։UIO85LW.iugexhAD'z0= ~V l'=5;~jKO![$ݭ3EU%2Ӯ &3gOr/Kl~X2zz+kAKǗ^"C+Ϯ4 77nr5OƎϜG&pZy-7=*SzkL<RvVdz3jf0X=r }$\$HMUMWy"!S9NFol9zx$So=k7hd_\02unZ2M9?kš~]hsG`yN_hOJm+GW;v\KF2u2Y5oZDܕ{}m~[Ԏgd %ݩl}Uo\7}m%nN2$}_}rwV8O'RoS8;oNZ{!P2̓sM|g臷]ej{JwR҄w 擥Ѵ>oMUjO7G?iAh{|V^ř1_=pu5kOscW5qx1ْA;| &sn>4{yyVgqJCw%tDZ2y&.sJҕ#B`Vf8Aj~kˆQakyFwyV'~WU2gz9M/'4jNm(Dm]FxAveRV8kյny{g3Nz{z^+c 󕉔}%sA=Ho6Ʒ0?}S ›Ϻ,A#" ~أiX>mIm̱Ӌ˒Ů8#I_5.*XT/JW|g&Tu<̷3-Y-]YθMn[JL_2 ͋6+^"xay2#?{6aTQTOD9C^zN׶wi=ldtu܄05[%3v\GcEG"45qmyo|'k0>(Ҙ{ݡ J'w{IIW{ʖ?u{4ً~Wcxqzjib}[Y K՜ӄUZU ϝ'Rqc5Yp2m%ph/1zٓc,>J>>qO}_{5-Gh wlhdz铿oyeEm)Q=2vޟ wZyפ^3Vd”} VdQ%K*n*Yw7}MS jd*hGs,몯<)AHTd2r_䯓ѢْH{&9K}H*UW0>kk{xϭ${.2خgJS/'%Hx fT6-eSG㚲OߓѢl|&S^u XS˃_5I.__KV?cm0z^V0s^i(Mzfֳ5Gijm偽Ng1Xߵd+qLO)R˒̽DKO[$tV턖u')Mط*;71땞^|_+U]]dl~Vp[x-K3hާwwk^]+J>-늞\JZ+RAzPpGSc%DzFj623Wգ2ķȚFWM $cUqd8!=Lq4ߔTxo+a0kbޝYy""s@IVϝ,#WQl[Σzrz}j^2V*ړXsfK~dʹƲw4I nڵJSy ;Ee}Ggz%;. }|Uٝ[6zA [{VkŸUY|ߘQ^u* &f{YF:ZLĮOXYA>a~|G/;w}H]@< <3&H:AyWaSڤvZ=#^lRoR`M{ş:U-@4Zyfq_PAϙ0㲯mյO2XVU[&̨Ĉ?⩃Y3'ȓ96**xBq eT״sdZu˴ﳟ_Mk]"6ց\zq-`=Z:Ǭ>^ R%/\M~"|"z2jEp _.H[;=Jף&ԜV/PA7k{tMDF^QdT$5*;s= V2U2c}*%&hב(":=HѬ"gZwy#eoNGrLd1F8# +$縩2{NwA5J&R_8t83w~gUVLx(,ge ;^_gVYl5їYa2\ƹՃWm˼ ]WO땼Ⱦ^$=m9ݱfNgYWUseji mY *`[UДfY_im^Yh\!B =,źUɌe2K'E;9\"Q$2@wtFpi] f4Y#|s{m bT> OGAxsnp0~ϕoRTuJH`< Sp#Iuk<hLM/kgʚ&]KWjxM26\cDr.]W^؎Au}k7I}GI0y:qəV/Eo,wJF~a%YFS|Q*_ܲԺO֓w\2< ˲q~c;*BD1S^#iMOrMwxAꗮ4M{hdɴnG&QZ$;ח/ ЋAT:{XmCmr[%WtnenXG4wZGZ=\?Tf(ݜOƊ=z/HN*$3;l ė˓aίawٺ&WGk)xi(sw lc/Iw~:g߮MDOyuޅsh+}R6âCRIYGGs:~LJ.Ǔqyr`zךx΂s{_;Țu,p_a^~_O;mJ^_n#4r\UmqObת,SĨ͜+ga eq|&Ǿ$cAyLf?Ԋ*/ғY Hu̓Ix%E (sd׼`t?h"}볳6K_2wZ h;E{MzՎx ;tR? Ĩc9ߥDeKSN"CLx*+oNU֩Vh"~!E/j0/-bD^ }:WҿO\p>0̺^'H\Mu{u+Z="?`󠈯׳%QTAh<:|U#U)1j=&=sW%˲=uOF<5K_)-,UΪ,|rFM+OyoOn{яْiT⫚Rj\]s#)f- OZ0qB&ZjDJ%UAA YǬ8E32;кijn`FY ={2~\{qveUwie{M㸟vh +` ͶJ%gʛ!ϿIu56-N2sGyN>j"XfҾ{U;N*Ɨ//"G%w):jYU5ί:_&ۂG^%MS1dEZ2Ft))Q2/S(M\qY%^޿^V堞cQcdisZ]kaskjAW'ot,CWS?,}cVMmM+z({ K3~{27(۠ryϸ`,b}cdSd9wz_?M=q%}"ΟlOxWjHlu# qmO!LBԃ=zw}*ϴeݗY,NZjW:a[2b"=>'뉜ۄާ_y-PB[j{7-ѻ-MΜ9ݤ#g,IWے&(A*;=7z+|Ďpe/GZ ֦a ޹ĔlϢ| n7Y{_%|wA؃~?_q_q:ֳAj!4yLelUv&'8Cr}1>.Ny&e&R75gUϲ&zvd _)Y_bJzPT#vh6/^=EZ`EmK˼y3Na\߾хMzcg=m >hI^ԳɞdVu ;H&u 壨ڌeO~Ĩtf#yo"롃xqFڛ{W2qޝIuj&n}ey,41ReBf^_Y{s\b03 ضN<3L{]{/MxWaSrFDkmU߿ 3m`=;{AKZQw5,׼+ O@$k\<և9Ti"|H~ʳLС0-ct og^Lˣ+‹.׿_T2qH,\_9 ٻ|7*`}=8 _{syb^ Rdp£هsm5;R2WQQj{6S-YxlqՠoFM+m)&az~n}7Fז\ۓeY2~R$Ͳ"фn{5Q6"_u +GDaa%>F%r8b H~jCxDQe} M54/DPttxN[*DDΏطvZ=QJՎ"Tx[ePp~q-|K`OSzޣ+;MWm%]<[=SuUWUi^'пas'ȑ]kc.~ʜ&bTg32f`,Ux{Wz{NRe%Pqz-:(=^9H۪L撱Q+&k[֮t:kJAؠ*IղGԗQwyT'4~+#\W-sw 曈1pXC(CGkw5cvd\2Q^ADy#_Uh*HΖtK-}g K%wca:@w|u&qQɌsؖXh~hv mUTeRlb]5VL>sqC2.Ɗu"M#ٶz:$} Upe%]rS++בgųH=rI~Js𝶿I_emguN?c#YN;<DtxߨgYA V^K`&94>9vن_&h&Q-H4磂SeT7\ɃL_NW f$}M|Ux(efHH?p#ғ%3-'as{W}srj e+3<~U#+Wr綽{Gcsg0`Sf! wXmζt^E|#v6CGIz˙멚֝DOzM߄Jf/WƓOg6yx:jszׯc̲qe;A.oҠjm`P:C A0b&ٷKV9; gC1^AVHD) iug =s+v~+v) 5wDkb 8vM-frZV5Df<kɸ ?Ɲ$&[zs^\2e|uיִYEFΒӃX䰝-˦NVYGԞd^+;KΞK[QAԢuk1^ݛh=A'`'Yw) 5ޥ82n-뽏^_)w R*E,{\D_Z$m6\aⷋך{)9oN=={Ѭdw%K(6 J{7gzD`kzߒ*Aǚ~7dvq.[憃g`WSJf-K *ږ1{t 'rQN[r^k&dj?Q1v{do !Eh82( ͷ}v鉽d<dJ1x;F-ZeUg5)2mO*Yϲ_HMR!2*/ư 9o8Xo ;ϫؓIֻr P3%2V_25TEG.Ԫ zL Fx\Z&< [X1e,0AqӲʥVUd;:z_Pzwn/M5ߕ'ҷkc;ΤzޡoM٧o3'+f7n߻ʕ_w֙}92%-⭘Aq~dWx7A(Xc3gW2`AʐG]"dc5uLj?2tjyHM2̼K.B&W|9O&-cA?:g)ٞ֏sJV 3_0use}AauZFiRқ#`<;g%c)^K|QcCo":Q^ؐ:d䵟 |\o˂h yB=찲狰}ʄ"{Tym:]3%cWMĸăL=@r%}~Oijhsu6bKs}4=w%?كywl7թ F ~&GF3WD]aڣWJfO{#)NE>`/(-lJǫ, W>}d,wA*5砚-پ$cXXleC7WZw V&OzqVVN n9,jLe]3Ui&iq3sew.a\Q XFdtPx7įJEsc(Ф>xHdt|͌L?}%'`YINCFH_<&XM:c`0bk-3 c+\S_wƞTE4_>$HuXgM5k`=5w ƚtİl"ʞHdm$3M#PѲ'iLV Rds䣛̈q׈\2ӶeWE^glmU*l үkaUϢ-xFB|7G^J֪v|0Bڸ_HA[˔*e0K{9HVgPrz8E%d߮#= 61J$@QAgli-&l5-&31&Z9r9u ؞KF~ :G[Sg5ABG|Bcq Hm{dQ[2,_E*ELii0|M"+LBmtڒ:d)gsVxetr8\+ X+>ɼ'to Զer[ҳݖ3AseU[mҸ7 jD+W滈ޤнYdF`px24K8Xݽb,0M׼u~2 1%c睓u=_X}B>e~HﻴE{YME9Y_۳io?o Aqo%NKZ==WOm&x4T-kgz?F71zuex ܧ|`?%c2cqGCLKGrM;ousdIZ)-|?#>}uOrޘ1dmZuv9HxL9ݪbJ&Le|ffʒU.aˑ I%z2U'N> :3~ʞVAAiqd3 Q(K;?IAQ;~ҋ%̸;ytT8#{1#v=}AɼER2_("]*ONɺ=;=vT(YԑkV5Hwk5מ2(XW /9FZ<ئ|s"|=Kl=R#xXK.hB3)R 9ZZ=4#xiPJAp{_cj1;zUU- 2X3OZBAj]#7;l̝;/\91;j%3u/ 6oFRXkIFe z󚹯x-eT{b-Mjθf0yx`,5R8S6Wpђx myw-uT(VJ"[]ɹ34rk]SqN~`2u`}O[OZ} ٲ>vAט| $IV;:Bɔ;, {+uU[=Ⱦ`jGǴѓnznݲ~gNn`DU+RY%A,J~U*SeKs<-!^:ο)wwEro}ެxdK;׮dخ-fD+rTZQQriF ZM‡].ڍ&^EBQA?6{sm{p;J&>g$Ӿ;cEz"{_C&HsɷL rr?kNA5㫾kս² B0ZLRM%-¿[VYy | w['3sR3Y2#ENfl3>d=k)RMKZt.K딌ǐ;vɿML~GΊwl+{4 n:_:A=D;;A8+&6c F6C{fɪ/[^F:r-2_րm&} kw5aAq =sdiV{ܕ0q O;5aA4(Sį 1"F;(ȖOKAأ&jb񨲥%:jZ^qL ǻVY%3 &R]J0~cj]_㮕ne֒+s+2FCoڼszV$n=Żw[5H5x{V}_;?1OLKeQR4MOF;l%#>CV xԩ <^mlRYZKҰ߭=M?gh ;bNB8RKj'Xd=ߞ$3sVvҧ*W±'s/E*d; jMM~~TIhbZW5aOtU:FcedfzoLYaWivQ;҉<}35#&^OXAb]r)-kHw^P_3qoݞH9ȹu0#S?qxu̟"hm씴_WZ'U_y;9r*_M}d=Sk$ =d-ud|| Ơ>dF5g!ӨV63)3#<9~?iA DWTG:3&|OڷWSg!M_wcAΒUWwXyS} ㎗Wr윖(GhS.VX;-ڕ%Z1%/%?KfGy\Jy%wX弭"JYh苶&JV2AK:ZY#V~ĸgBceCyt|6^kh ЊA4˒ShrMZW~q4){0TVs3 ;D36=Š{ڞ|9715”UR-#<`g%M7+Nьloubmiϧv)ΆZ0kŽj :ǒiUt$i*[VZѶ|G,I]4hgg2GXi&b@="[y]mw߬Vo ۫F{jTUlAGɎ?N̮bKg/^vfHoY8r`yLWwj̗.US[t=51f. ,Yg?L x?1ŕtZְEV=[DKįAx\[XAv{{؄2wVY]D;M97;ӦiգLuEݗDi2&MZݏd|WLAL p&Ӄx 835nC4i?<߲&^F5ɣX]ƽȃUĨ: Ok.X]k.Vce} ކqUI}2L9?5}kA \Gn87Y}}S2oXmB繐׹vy:G61 ]xMoF_ dW=AUN 9&t|F_u/)\RM\?dF[//Fr=M ݚS6VW.p閹Svo֠AԩW`TEꕿ.ZaO^ڽX _{dj3jl0o=-# Km&c-S^oᝒs6w<"?N:5&Z[뫵5.Mzgvv-‡N-ka^,"t'|9]mmH!P"C%3g)z"}Z7^ Gi&:s^Ԗyd]$~g)]Ma{}Yx Z';ǻ`FscPћ!=k{3SW>=W`^Ɏ"=`c9zI5fϫ4Wq9a%hdjzHEz簗WJM5)xZu@J'[[hI7['c#Z+0,gߑքָe ughD3 K:bL җxVFGeI(kW}UxlEآdƊwN[!u-h-kGW2)Y-q̗j,[d,+-'^ Ry?)EU֤>88G˔k o"fּ Kc&lOAz3E3/ǻϦ-y۞^-]gƗn'z;Ox{1z=P{ +fA*wH|Q!бAV< 8l1|BEVauHGL}㗲תH8-R$̫y*;^6ad\Gu|xAx ;D-H{pe-(i'qhy~};`X1PW3sDճޙ5HߵJd@egiq&<䃤cw;b4X'7Ѻ=Y~8fnzE챻. Ied7!T% ]妻6ibReDdc2it%h>X Mf!Cjk!d dEƲ؟RaYg Ǒ+ᱨesRD9Ϫ {AmgaaZ=Y ?h#=_/&d =`v7Mغr?L3l!k^ۨL|'s`:GN{dמ3T|˳Фޜ) @nk4a5HoQY拾 ʧy$QzF;*0K֝]fr/3V6`] ֲ!iV5`_\4-c/鉕k9_Pv?tۅVb^2zK%GF$Hld̙jnI-{ }؊~M#&ʻ3ǔ~MhZc܅Jq }>qP|Uq뼩=\(Yob_[w&zv }qm#:ɽqFcX5GdOMVFAe)Nn~ ->{^Ozy>'g(gj+okMiԛboSx$sE2m,-R2:3F#FF hd4EڎA*͙w`2aFD?Y9_T\ikk/Dv"Zv,][I*1rX{̓[<__6w8y ^"mVMzv@d'OsHZ2z)dΝX2Vwݏ%OZAjWƫяrc}UZ^|ы -dWdqoYJ;$SkzaZ>^z;DZ[ ּE)%̸Dm1ě:]ҤV21*HXsi,6WciFNo ք$;"hIwGL9:x||ݚj}s-1"7ٶ&l f 6VdM1HwX* Ktɺɨ W'[ئQ=v*%SI3+.Ee&k;G 496rv|yx)gsV=FbMzg<n-rU^YQYXEX5[Co)ٖ vM=Zي F\S fƒdjg-5bt-Բ -WLe~w*Cf4؄G:|Pn_yt]hYZA=s@,?Xw_cw]RYVx~S1Ƀe?dUjҳ>dZE%Fy&AuJFGWd,')Bә3ޛ~3_MQɪUkڣUo)}JؤRTY 6Wkh;up+d3^3;!W%>̳GtkFgh'u:24+kd,S?K9CؤĻv^>kEj -Ȗ_z ,2kZ~+Zm_9&ZdʖV8GHaMO]ejk/M?* =`mK呱eíWzKw;++6:b<2[;ИA薑-Ѯ!{nMta|eJmU% =aiΓ!ƉMOAj5H:=Ek$c0w\?Z\wֻC s{\ B;,kAe9"jU 5&1gE\J&0VegcSFLY]sh fװ>Mkd%r&ꉾkUcpLh2V4dfe%ӏlew#-ETD7-;#&~p,.lF42O|yV [v}=XZvN433 YDߕF Ӡ\\-cڥMһWMz:mwӪ!m1m%.{N;}}:d]]L|h1,XYMz:^~ocμԈL?=_dzvI&y,q쑞nүׯM瘛̛((+V01=zDv{n =1/{s_w"'Qy~9k;#7sS2'֖ˈ@ɴ^"F=}&Zݞeψ|{+RԾdR2@;h0^-_I_$2~kg?FpoSX'D֪Sjj:Ϸe}QA=I^;&\#,M:aYhK*Wl}e nWʾdU/%3IRM}|ذ k9>}GeIeuHoʈ tq\Bka2m]#h/tk)r(}朽H{->9KLnG4ٗGɼsgr-ƧiT5 -O%~gqA:csg̕e8?hk=J.,6ΒU dW}KC F7Ql~{_NwD2V_MWOOyX>g}MK9q V=y?gE;Y}Aˌ~^MRNDb廖UyJx lUb$SzŻ[Y,ؤp(SeS"=m/-.x^cֱڍªxL2'|a;{I:ddrLΎ5t顎GW,F˒T R."z3y(mjaak|KdZ.].L^jUf,ṢyD2}㝵:Z}0x&"~_j}=jds|d]&d4bPJf4h'^E4'ڊh"}j~2ǹ;:Y\:cM ?egmPj7M߲isL{G.{"-A3wA*-2u|dǒZX-V[7l+dJ0OX.v:^ΣXD/MQw\d߂x[E2pƈ_<=H³]ig\`tpe_Fw;Wg)%ϰ%Fzܚ9xT&RiK5?_6h'E+/GZ;3_/kd}'giTm7\2v-^\G26Q{.v`l}?Y=: /+3xJ>YE# ޹Щ|'_kYo<8#.Y_a/J=׻{k&4ofT /^g[%Sc{sLKY?hj%=ޚt8ul|‰͓(z$Yxr^4=UC3aag 4?&lDO$-!Y9?-ӭ-ߤKv[ٚ*f ," Ɍ^W[2+xA,w.;*WxA-OT&SYXO+Һ|"}+鮚Uפ־宾  @ZKkdI-byψaEuސxONR,+i޿/1Md;au"FY:'u-'3 |Fgw=1U>ah1v|Ͱ՛;Q2mnwc`k/!83SuKtW:hB:Vyd4^oT2#%RKzhQ2ڏO(=і%a('J,E+9r͹ffS\eưD̳*[ [q j-/fcœ.[,%=[gbnmgwOeͬ# 6u y~S]:zdtH'u2w=ԒԖZ2}f+d:aEe]Lgњl{]1>֖AXGO#m^ٯ>Urf#ί#T{-ݝ17AX$1~jl7kܮSE+;ˁ^2Ϟ=+אtב_/8؜Թ'=O^qY2#NﯟW{Z,bʦ Cޖ\IkZ;co؛iѹyBFL\_μ"}FbkRHE -羃=JW2vF~>9$$.lKWkj%c 9_mfE֞&]nj8h|NU?WD $z[ݞO\eo,Pu= r[oWtYE=l l ϰ(B;҇9uIśu{d yuVj[ɴֶXJƃhdd 3%/4=T\w؞z>D}O;j5Dd?;/<<{oƻޫ.(93:I } +{f MF-xiJ5b-埽)YKh6z}W2v/֓f$4)k$nRޝdZxWo2={ͧL;h=AOOB}?G>uǵ7,%<,_"ˑqk^3AX:cEWDaZe@T4JQ"P2du;)oX Q= ϊ򬂥UdFe9S(}Ckg/yG\ІTAsgELSK?qvW۞Z{J`ܲtiAֺ]AS~o pߟЊAҴwQkt|zGNɴΕ]j78ڑ@է^ R?pmyeɴH޽Z0cJλzޤImKCl[(ҥMxO{T(ٺd6@P2v*v{ZGGqi\wjY]Unf FJRߤXk59TP޷&zvj,~d *mU2ͽzU_L h<z ˑҞ y,Dw³MnˬAXgeJ9`w4j_`|5{&{?I<;٠jV{JuI>3H5B$5Q;,IԱIo4h2rutvHoO# Z^ԚX]Dm7;- NQqMkLD\_*(f ҹ|M*:x:\%Sfc>vȖzlacpVOf?;4q]f}kCN7պ=Y_r*dJ` ۾9Jys-zY#ob/kIm>,DlVE44 zȲ{Ȫߵ_s.%]r1V&1`iuJXƖ@+" eͳK,3 |虽z]2f۹T[/җ ]29ž55h-`7k>HZ*+\0Ψ <|vngcd>^ctZV}[ϑ,Yy~LX2l,qsө>}[V }L?=IAY_"ƛ vT,g2m B_^ԧJԓWl|7p4eZRjYwTq'FE2%?E4a zn͜H:H+ ?a˟hh.]WX`/`>Y-bW>&ս씖i+:EFטěyޫz(K=RuAxe[%2_+_Nnswn|jC~&١krk+5o6zZw#sM^JFm^̲\dꁽ`Q{ "-Mzg6Mz+zׁzOFF;5inҤ^jg7e,6qWEEj_>lEz_,)"вyiwUsOg/Y׼zdZ) DraSp+ٶ׵Ǽ8Ha_i2D?y~0O$,p?{UGU&Ҡڵ_2"4ü[|-S&$ӟ2GZ_ίĵvwͻҳcNUrg ~v5_>oՕE7_3ָdYv:[22Us}@v/IY/{ԋz] oz*FT>dZy^w2+u˽O}Igx5w*iKf}koRV֢UM<1~j0٧tt+0i3Yڪ,J{a}Ƴɪɭ#%K;aq uLפB8:nS"MhfNJV{J;5g&XxM'4rl s^ljsޜXm2ph^Բ)RsaR Okz.%@&4_ɴEX.dãɗrr %cyؕYDhGˮZ<_A&3j Hw"25d85jY-ɆѤ`Ѿ7YӮXar?Xڹd}yhK^ם^qU[lS$rWX-YwDs-kM{DQ5[2mbd]A ->%cUZٖb&Nljψ8҄~eQ3MXe=dYWLO<*$V-^1$w,ڣm瓘%VKzo{2v4ьɌg&}y8KƣAA+V5oX2v?-OhWjJF{ΰ z,ȭ? ,+;IjY+TJ #O[1%;~?ӧJ^X2w3f`qcYub*j߹הL^W2abOR]s%30Yd슽$FQz dھ*r_nigQ{ZJQ+(i:8yhgZwoIɝ:饉*^h5d ,4{,%2@e;3Ř=c5CR23:EhY2Z ͚5a=Ej5 qzz13v#G#)Y,UȖ=זLc³}y"W\> w lιzQ}f/Qۯɪ֕2&Kqm}h®Yzž~2 ץ:Y|UMu?R?/Ub Ӹ3f7ѽ1vLFq Fz:m5+ 3ƍ$&ȹj=Oa_ʫOƊjY^=NƯK]gM̜tNcV8,gmtdi5]M:Z+7Mr'臹2mՓF+j fR܈ȔDy3R=%){=CD{Y,SWؔDiޱ{{d7jk-ޣ~tϫ-Ҥn}hx^S( <4`{Ē nW `E/%lJVm; }]^2wEmdҨPķ.O&ʔVS';?Sk%c3K+Ϛi,B1#ɉuEh;ϻK>k`jF;~kRUXVΏx3U1Zk@ٚ ,c`)*2/4#ƂT鹹dFuݐ_!7bjeJsec5Q&HjԞ]C)IgcqIg#X\%M#(ZdzǮΒekG^hRVcn t[;| Z'\{2@^5LPc<a7NP XN=.}7Vc2#L~YjZzIeD$C1cC,^Wv`EG.΂j8G;lOf~d+{W~nԯciUɌa9ǻ?TZ s|Y_Vv^1Ɲd=]=L-c}ƗSɭԊy`,kԲqʾMֲXy=fM%3LcfAJYڠ#FLXEθJ9Hwu 6+5Ҿ?\S^O^_.߿Qj16~Q("y=mjD[p3،qSDIh* (d=.q}fKwh }Cy.κdʗʷᗱ+khܤڻ"M溚 ԈY22;NQA4`=_v՞N.]Ex DyKƇr,Y8[q&WւT<]Y2-5"F"ޗ0+bL XAqmgkmgF-SsVep'&..FWSvYKZn<*Hޟ ouʡ}ߧQsW$ɞԛZ{>ɚFs"+(*$}}YDͳ" _49{gW}enXlپՏWK5x?Le v+Y6W<~nƺk]'1fӯJֻJmho[ Edk Hou架 F lA:K9= bpF"uwL~=2_M Ryվko)dFh/o}i;:C7hbS7QnU- <&,S3z"E@%rX#~ҳۼhmͺNbVˆWK:'β({]ב%$bA-cu<<YYЗ{g3s*槬`k-vy&[TɺNiF{l+2ZJqy|ù]}Vɴvx3K367 թxn)KOevgϞkJ?ewH1I#޷vA̓+T&Q%3Q AꈋL$Ҁ";bskl>цqnjN9m7Q'O %j>7]D2ڰW$kqZaiB{)I ygJ$OeY;[;Ya_' a锌oв+Tw]2VYZQ63"ЁւUr%[EagW:}w&K/2UdP텼rmi(]8`pݻdFkW޻ jf - 'sz?HAJ9U>on0Zdۧm-$1^=xWy%w(Yؒ*9X=rA7y6 lcΜ wt?ۚ(ψR|9`z-VS53tA\{_lO%SF?W SPKlgiveA?{2h?ĘJi0ʉDiW/cW#ʖ#ʛX+ v5kKֳ^nwRjIײ޿^zGm?~ZZJFy~cb~E?^ܤ)R@zӲJAmvQ=gdI(, q7Q?ԈgG'9<_'9쎰uHV "Մ$E-'hMzγU`jc,Wl`5\ n|]KVI}iE7+F ]3I=K9#ޟV fY<)4^GΤX2:M6-d`PxAx)Ucs"H׾=xX'7{rujj?YO|O|L. ߡs6}{.,ZeԜNjPrԷ,3u\U|'9bߤKo^mM*c5 <A9.9)_=k]2}E :`^>dk -cmV2`h /[1,9͖1/= RhQV#+Kd4nB_k׀i ++M~V[$S6`)18+ }̉!DF|<ی'3\NÃFl tWJq5Ƶ䇱}L%c?.(`ay 1?9c:< 90Hw֌\Ū=SJe'G 4'[dl&7dJl5 `DX޶CZDj]1XQ*-,dwoVp,s^S_ɼcu6EjÞF2}`Ɍkgr*SV,Am6MwU7G$2&9{_(} S 3G6+e=)?I5NPŰ&3VR1o>j^I;?Ixnۨdo~L=V.Y fKMgkdad>mLNVx4!4sIOSX2K-Vۊ+Yw}ɱx9˖//-)OAQi0iQdI~3@4Rs(߱R%yi{ J<1Ezw|+]|_݉_YYu]Y2^%gЄ-s&yǵAUV-pRkm꼮 (Sv~$r|I#!kXsS%c]V !gQ@6GK<+M:VhEOAآ]dk$ZôSk촅DI1zWF_1'f|r4i;ksMhO]Y2u4鋎grj'#u+Αd2:4c /ïB'/45IԊGĩ׻[:=QikU|"g S^ђGsd+$1lYzw^n{-s5u:Qxug+LK^ӥ٤4J:/֨[NkOH{_$Y%빚s-VdRȺ#+%⭈?n})겞U'G'V2w~e_"2ܣU+~9x?+Yw3[Ph#13hD^ҝ jM+51d [*kDr,$ZK[h*v8xxk+s$o3v;o$V+;ldծU@<%Y3:Q-뗯ssw*s篑ۄRTw:V2ZKF]U| <>[dQdm92-c}Q1tǵgQAg/EX~1|<9d@~g%QFEcWe|EFcv[MhhtfINr6fr6ya$`1 JX~Qԡ#Ϛ_uZ: Ų}#qy#Y:zdz^kB [JֻzߚdkԧuKɌ{7b^kT=0f/s d<P- ݲ-A= йtVdx*W^=Gמ#O18v ܂e+A"zF"_$}~e.$b,\`lgbˠH.,_@r :1Iowc]}dZjԳEh\%)EX[=22HިReF YY7{lФ3cFΆq kPރޔ~VUqxs˖E(<=;K$(yP=9{=? _*`+蓾U2͑oEx$9D}Ai-8X_| h缿'%*Zvau=6vL>UYAb5;h G_/=8Ʈd.QIǙ̝٧H!v v5l2=Yg0,jJD h;+su݄kgit{<<3Yϼ"QMO#| w"%1bV 2sYҋͬrLP2p қh2(=]p%t=c'dC п۫`d^V*: {Wz-2vq0qE]iYlyߠ{y!%瞊W}A}y}|B(' {[eo#3gusw:Ě {117%:j'%/aҫK+FW{_ضAVOƈ DeݢdΊ<ɫ5 8GΌ|Ix~O 꿝U~a,Es KpЉ_r;_>}dl!gq@S$cq|C.Y}@yʉF֪qddՑ=&mÕg9xU2m -фUވ1jR]q{[ɴ~ـj{'H%%ӏ_1奥y__ye'W^U>CgVtn 1M*0yu>{V1ner :`f2u]߳{ wˌw^:פnF ]۲,ӳ嘋&ZZrjZepԵ%Y AsXAJ)--KB_A\s%]۸Œu-Ys ůܛhϯؙҤVS&8f='K=Ɩc{=q;~ ]=;Z3œbƒi",OXAէRK[nqnzMi^{V.RI<Lqd>ۭ#/ HP$UCчi)NF;Q( ƫi} ֳ?dl{Xd[vڷo%n*YzKƏ&{.QAar|#[lerjLdWzp[nۜu;6d-hAxE[E&i0X%פc޸W -y=c۫H_9peWqM82]X{ϸg2V&JSlKW\Rg>̜5ai}mL_A?IzCP2>@4]k܄߸"Aڥ99uY8?u0r;]ΰ΃䗕Xz il^2#' o WW'Lzrnd]ܝ5qWrc"r ¥&dDDzU+VcͲqe۩r[U}mAyOwl' KjZ7#v61E wUdh]U kz1Z]_߾A2r0HzdƏO\Df. |Ϟ,>ºT+J>I' 7Wcd|e+ /,ϣzujA9c#Iw?r#HL^Uf4~ϓ^W2>O7?5ּdj}d =3{t-+~uViV#O b6XVX{8tEfʹ JK2G\$|6|^"~uf%Z6ʑdJ{d1JX&[>-x+Lj W~ڧw]m?o;VJ%5|`W1ݹTGi,vy& tR=81:}wԞX6KGJ]!EAUA;?CS9N/ \A$=Cɲ1 '{ǍzrZz+T2cp'FA\7rL^JrwRuKRx#v skX2KzA*5[Bj_[Z3@Mc췲gVekV޼OIw:ӏhBm~:E_Ax:.-פV#Y"?똱?hZWh$"k502M/ +ywҳNcȲz maydt{\woQr[b!,5F3nMSG{)U ˌ2[߱ji[jHa9zMV3[%-E/aM&Kٕe|^seyiUǻƬ{Ί[fLҵgQ vO|\;mUIw>I=7[HdBVi](ŸyeoiV|o{ {ڮ5&nX5mOY5)Q3aP{_YUCusW&/ISIuFV$0/X>Nig;;_`l#HT2qKF0gQQt9R b ȯMn7l՞eZq|+YZJ.dy:gCZN<5xsvu0qrW dw$z^Q־wŹOxn^_ĊNA>q F!%3)F ;o-D*v[J7J+6yhjYd,m%JINPHg钩|0HZzqZѼe畳iA4W8-YcQːy珧DZV ձ?eo{_2%!OfL8] җ_ s)58s%$p^ӲomROQ!.Gm?cm]UG駒G$qt?)hȕ/zl_BP{UD帊d3 oKUZ}Lr}:NAc&}y&fU/8bm$X:3koTE؄o?滿]ş ˔Ge]&4q>`Kݧ" Q4,cc+j Yַ;?'wQߟlT^z3}^O.Yw^Y1VlYsJEz_GKym.1'| (ީtIIȿftj2%w _ڧT/ }"VSB{V3fVu:qy Me9n-+X}'$L7aj]%35{+MrN'H3֪}5P֢׋"߶\_Y;j}%ĬEhy5#dƒ#__mT{КXz\b{5W5u>dY#2&H2*6QGX v}LpZ?IwWkK>%UH>hiMxoGzZMW*ls5%=hDm8遲nevkb?26ew&xՂdjQRww̜=tS5y|Rh>_di)߾O-YpZeg93ʈ3gf[j6NIx,{] R o32cϽ3t-Mˉ1X6}VIj9S1JYKdSB~h\m9YE|e]< hY:aϜA: &V9s\k!6rXg4*sU9w%-_įxn:`7WvyKe;.r{kI}]k%mQ=Q^0’x9wvu0Vl-mo&Q_a!dl}dKtWme5'c!xkL.Iޯ3nYWx ]˲L|Y>}0c %9S?Mvߙn iL^zO)Y[k{@eҘʰP3ۨs -xm2Jp"2ٳkRkLZ~9e|Փdd=db_Y@7:vN`Ydϗ{7Q\mޏ{3P{{3o31[vD&3 x+OAͿL̹5*ZiV^hL{ܺX׬ؿXk^*+^oSsMܕ>X+RrJ2[ӥ&]2!YwK-[yFyA` QJǨ/ lf=݂[= Z2eHfJ>Qp }m6^=XHڲzQ״L)_XZ6eUA42kCuzF֥NGjYvv$-,ź<-d|4=BJ7Ęmkk>ff6aahA9陰dYy}4"+z#q"ZTkVIA J'"i"H?*_sOڭIz+^SN8Z=ݷkg|/ !e/mtx@3S`=X aԤ4joΕ tYds}Y||V $EsbBZA 3J.z+2ߑ^x^sd%ί@6&|+>YzwO:@Wޭ`$N`o: =~.Yhh̩Lv#Hoowy}%c3;1rplˋ eJKn} Yzzk~y_>MX5FaIJ[P6sRK's?x07&OoQ+On+BGD}Pg s  l^aF;L| 9F:ii^o&\zAF|{HhާdƠFi FA&F=U3DڒxG6,=4Gyį3 ɔV;Q:\M9t&lɊV6ʬД )-LQ\m87v |/p6|:qbpJYKQcZ7>ko:>!Xձ)V49&zr2|#uIjeܣ_fjJuKɲ쵧gLf6t[: mpkcGaq]Ğ23cL9E˨ȑKɪ=ĒsMƌ/ RM|o~k`Z=yMLmﯱYaA5|}XkM*s9:IעS=^&?Ӥx]k>wҝ#kd`WwyEmb-ҚAOީכhMx_덏w}M9X΀E\T*)fUsfYG4~opdW*U2):YJKk^AUf §><Ҥ$KST^S|Wּ4]idKҲB5,;}ZEmY\2o*>y&|Mǹ,Rm];%3̾}+u衝(ߧhY4fVnNH(W%LדrۑɴD( < DڀhNV{T蛯d9*;Ï'Kg2]Z1T 5,U&݃jOznMjgXuzH&3 32XU+rZUkώ-lLfiܣ,뎼`?k'g} SG^CpZ>e~yBsQO_%y29_!ɫTHE֯h]ڴ i1KMUƟ&ƖOh Հ!%c;{|sO`Fj^4!eFbox0&SW *rmįA-,X򕼾8LhԞ-Yν]iUQ2BA+֛e Y_&i3KM*;wL1<Xe7[8"4ex5 J5`cI=ɺ~ؿxoEzfնOg6-=3`91DE ^l h<3_7͉23];VwݷxU,cNc 7LWX/u%sjɉO=^ |4h¯ڤkYK"obr,뗽̻5U2vLy&{3u+B^ǘx Y5{iY',Xǻ$S{(?㫼ߓ&Jzmw]|y>v$jdHhLXwsJ'ko1xÒZΛR2>^dI RǂXUA9x"d" Ƚ9AXwwWUV5Y-e+g߳d<? = B3cAF"xoQN_ w̘k{R~ؑH-<.N,MeFw̭ẮdJ}D51:Iˋ~_;;,y 0IV| !Rky8zejQJY׏w&F'H kR+ˌҺlK0m=9ZAdVbkB>Qp&\EbQLwV}^v7#쥗KƏg,YeEAXOqmN`|-S5?idF;qeKj_+1 B'47VRZ̚2^Uj ^os\{Yb2 aG?Q+Av+nA' |L3a18o'tm&+ ==Zt@CuN&FFhkT]aUpL Ēn KoEŻ0ku;Ye)AarDAwfο;;wǗ8&ݏ#*Jֵ:Ewkx"F9 G Jv;^]>%+Di$5"QOyh P݈m1?dQJl5dNK.gˌzd7,oiG#.s2 6!EsM =xG b$ey66aJOY2>AmYĶ1ɌYG&&# ؽ"4Z""P{|,㭨I߼Ɣ<:hU:TrcYeJƣdݑ9D_̾%xgpLg`i"A39OtzchRͰˮ&'gWzg`Jd7k&95];#!qW]ء+9,vL,Xܚc2~y͎H-jSZ2~3>CfwLx2:ٚdr9JAml+,zX`] ĝ#SY6z`8ʣI59A771>iR2u_!_$wm<n>FPk‡sDK3r!$H<[#,M|h/#`vزow=&pej3 ~ ,c} Bf(\yO¾"vӲ𞉑+9XϽr<V M2A&+f/⶜/n/*ͣK֝_#ffcygNLlVx-[f~.uEveS#j2-u1e\q֫פ[ȝf2R- s39G j3lSAh Eԉg"T+Ex|Z+B(2AXk.I]I^lR{|_>`"|t75cӄ7> ^[=eY2^}B>lsA3xW{V%S~d\֫'rd]Kk%Es'U NW*R34гAzץ;*H9gW&c{oTx%E?y0}r?e,{ئr785W0Зg/ZX%^ILk:5ٚt&饻-YV걖+~b4iSTydtYPڽOXZ3e-)Z!~߯Hosn5"j4Wắ tl MX9F 0kg!7aLuzhr {M*3v Y׬ׄįAj3`$Ӳ7RAz:bқOHgFZoĜ3FU]ڻfӄOq-{FӨ$w _oVq@rnڢ7U25ؑI%sS}d9snCàk9du -D(j6-vgY׊a0lZGh Dr\] %[YPYZl\=}̄ ]Bg`JTEٱuoBkh-~y9 7{Fb΂3`F䧞 A:AԦG=u_δI&,e1Ae#E+ZȲW]ӲjqÞQqet #39euG-GZ׉z<˴'J;6 n [JθAzCЎMgݰ*AmKLyY ¦ƚ^-OEYfȾ vj.핌GyuyȌR{tphc g&H%a]ݤV Xx&]G6OV$ml*qG86:٣:ՠNJɔ5}L$hd/|icENǦ[鍼*Ly5F]Aopr8fisV+b\x= B~&uzr6I{ㄌ&CY1Y&t\):'|0Y3#tE-hU "oB; {ĵ[[2t Lo_oM*e dYߧ9>VІD5ީ^v5M?F/qD_ZG& WFhᙱ`DcNrn;kdZ;fE/HIb#ۓc Fڷ,2NmpP?5aI?)T/^vyMzם ScҤy]T +ǵAzj3g9GKV$ 4/EɯD ZIqShIѕ%OٿVYQψHmF[ރ٢d+{3ʶH7l#=rʜWzAzXWQ'W'ȗs:kc] uCMiD5el^f]{Y O߻.Kʒu:ƙ{ξTOM 3b˦ Mvˍ2 f%3 'AdF5RlBazd# 5QQQXXsNzU 4wJ3#Hr:6Q wٴg+C̘WCרLtQ#-{׻Jֳݞ<2r&S?ZGvz~?Sz U2AM6w]WhYЃdk—FY%CY~z4ܩءxKnؘdu좸. 2;A^GX'Fol/_fMMdBw햬|ǾNW,Q[VOztqJtڭ3_3%Ij,c̸v|wKR +AYs2x6X_vLz%lɾ6 ̕vIP'Y5EEY˩h9Ik|&Iě>q6X'S7O:9bkdç򳵌?W2ؙ d#kAyqT e]y9'_3@$] *8N}ғ ,:RdyD:7 jTqA~}br0+_D_Tѓkyқ"jh+d}0(}oy߮ͿgnP<}Ύ >r Hv#-}zj[TH_˝A=zM>dA BzV^dcZ˪35JR^mN"KϓnhKjyĘv/ RAJj/2Vqqm>4ɲĶ~IAMCYM֕A%1/pJg2^61>]mD&<˼S㧒U 8E|'uFzQͶi0~jq:=ޫݝ֤QN-g ۤ*gGHlzDo\ZkM] Fym'ݯQnb4yFg ݙKVX~Ԫe˳ڂ5sɜ_dqt$R'CyRZF?-ˢ+M,-uW,i6;}`W! #jÞ>`^-qS䇱C3g(0He97sتhҳF6YoĬXh l!}u`K$uݲ-:*j݇$Xm2>{EڂS5لnna幛dsUV;XW$QYeUR/5ޣc-= 8^gٽ8jYhG2'@=hOAz+~>xK䒱A y8nWh>SkkMFSEWAt[[mRi[MN<{Uxk]"猈 { %K9jnIj[:3o~Ff&]볒PYGԎejqoX\Ix] qΟQ&z)1eEw J9^{~ ks;R5X#~?^`Uo,-L΄&٫Y%9cO+:sdrެ |efb1Fx(=lu2?vG덛r8 e,:scͲw_yY6R}iG eJ>'SN)_sg}W7EjI%#2`پrܜYYUm`}ъqy1{EiW?ga^*tdlsVa1zO2x_oKZ bԱZxE_1O6Y jVnm%K^|'ю&| VuJ'ӦKԄ1az3'a%}d%6b+fY@o2# '}AxYPT͛Nr^_lYXx ,;DA-flxgd?R&Ϙ L=I.oyV G% Ư9ywV2{qV+*\2>-"؊) Z^kb$YVW]M W+;jG,u{{Aj#So{[}0hՉ}&|OY=búkv%G7&ӞWHc=_ʕXڜIul{K2L,fGf1ە$_ }&8ڄ#SGTt eϫmPw k׊)FgpMW{d.Y'`w|_1F $| Boo]I[xnAo/˹ R8xy,Sk5<SפkOq5MNvW&J=sñW٫bY%q\{̻z ԄҹJO^P-+2U\n],Ijk/ |hx0 O I46ިdox}=&eŧdbW ү>Yadq/2 ->ȵX-d\%g=zmEh1{4/af3EIVͿ$͗#[^=Ё2zPS=j结W_A VxEǹY+_g4JAoY׽~ ώ^Af,c=b%( /,kc$飯O<Ȳ|bg ,t;Xڲ+-gAlLy(_;IyGIe+V0̳^XӘKm|y+z['T&OYV;Fx~TgZd1=w[+zIU*^eB55AJ[g6ߜWYcaU?7֤_+\GK[Vy2c^P]G5QOj&+V0XU8*SF=xA4wYZ%| QѧrR=`գT^9@eF1[Y""׸~q4:eQy]"F:QYdF6@;lBGY0E`̜OSKvxXfPa[e++fT^7y&cQL^On8ajd'ϸ]؊;ui-8㒃Fۄ/ 0+nKم ҵ* v--ʔs쨲l ۍXm;d#yQ_Mh5Q~~]W b̺&]=˨k =>]x6ޛm`2ZΎI#zw-'yG? }:5GK{vSxEi~MXc3Aq?̸"5v2"vASo_=m5z@^xdz#d2#̗zG 5knefos7]D416:*|W/_`WyBƇ=g+֝{:ܤUW_Kk~ʒq@Mw4z>W}373r>dMFSlKmaST > EzW3:x&韭և[}Ny(sĴOVz勖wL-և-^5}\=H8e=/וOSu!I-꧕*r9MĔ=dt{XCfg)[{g~eNͱ*(a/x m8Y:>ΥAHiZ2BibY~I>]zGqek1Xm/+@UAŻ4-uևM-΄?$mkoLn7̈́MRy_qYw48f8HdϜs?cTkoU_5!=NƊy/m`zq3I<=&{k(8Ի2Z [;AKCTC?_;YM,ED$ʓvI5A)#&4GO'4Y=h1>-\K4_s.5WMﯬMQ3%6< YQ*Ȫ57ބ6GM|΢%Q`|Wl˪nr3Lɧ> ҝEXnW<ѷIƒA6dޫdZwȪFdyZupx޳Q]bu׈;ZǺ4?(w!ϱ`L݋}G~dy55Kޤv,AXWT`Øw,ʹ:!);ŵ)+L2b>rYidGC"TnX9s0X5|Bk;bz<<u1=Xw-͸ <6d7 5||c#23`+ Onvݤ~*[%1j%}A'w^uͫO*ۄזL %? d=w8'*Yzb8Y,Hj:ZK3EHl̗"޿?{&1#㟈Xjd/3,1-Ӿ)CI+[o(~[D($<ǚ1ҬS&ihwgMoNT{W%^ -Y9 L;'k=-<REfm\ynњ̢y1YyXj?S丆&cY)]0XP& ΢~RD.9VD2DQeCgh j3g)s<4`Vme]zdZp't 3F`=SsMه?>B}KV)VVtV-みL֝ +&ܝu^Gs$&tW' Z'vI V?7ѝswc(}(i{WEr˳y {ԟtznnі)?fF Fy_^0ųL*_a\ɲ Ӥ_:=esJD 2֪nSzI$ߑh}9^stz}.Exk q:}9ϲFV|X2^wmRZ*&D[."z?(4*Rr,:3 OW潿=UW, NQκ|8Xe|vfH? }=]OU_<dxK_+R%6 f̒Y뗦-vFg5*lJ^/}"D?=D:Ba. —T/g`͗ga3hjg|ʻw֗[~ ߽|HF5Z6w*+;Aƪ1Wsse{fE+VM|-d,+=Uq +;U-yd)omc0V-WE[F4ӯg@KƋX+5v*[jq%i3u!]Yshk٬Vj!O :e%=K*A(u]W^E7WE$x ucO{۾1 }3J)MN4~c Z:~fwwVӒՇmXƎ}&C2$"ٍx Y=ǟ2*YyslZ$aݚ"5|4g@[JsM,c}6+5H5uOOKF{Azh zr{Of4ylI71J|귒yϯ5d|s=XϦj$_Ix#GD]Ih8(ӵuKz[y?ީ(ۇʚk^ؖʹ5o> zf+=xӨvpAޮf<5\_<ƨ=Dk;o&=y&#bm i-%g7QcJ櫓HOj%VhgA*˪dq&d,yJ&3ARۮDkU<)Ϥd|3i2zP̅5*xIײCo"O^Ib;G,5JV\elLZJS^n}O/SWݥym#Ư̈̄ dzI.Ad}{yzv0zՄB\zKgm8G23,6ПHh5{ Z5%zbmkuej|&zI]ײ޵fò{뭈\^&7\dՕtƚeNАMEn`VWH(-eڣb9=sZ(mg=YMjW骖ybf?ߌMxwX g9'(5rZxrlKK%eF=kO o"Ht p2>b(Y_SU9٣ g)qNc#1++i{zZC25tI/ۣL\*uI9)٭?Cljȫ+1Ԃqn[FBPv]s)z}޵IT\]'&K)a0X=u`Fyj-:*-=6N:s92wyb61Q(Ru^Ф~Fh'?jF~įGxAzw oMҝ?_?@,wޘdxxVڝݤQC5I{`e?HeldYD FcM.7~$Ğnys1!瀂e?lJ{>=Yt2X5q d n&wlK61̈m'cvrWr.6+B"`:ôMobkU,dw,}ftY M Fd1e RMz^S#3X7'3:ʚWV, X3`ɴ@Vj M[|t@Qڞ}߻em{J6}Ѥk]wSJ֛9vE6y;JeڷGk'Hw?ˌ;hR:fϢdlLd\KZ=ϋڷ.M;} 1gHj}֠ubR, eZUo1z'WSȃ㔽mrdK{&ZW\)F[YƬm1+8L=dljzAԧ#UEا?PkP㪊 L=w][2zёNX?^f64dYGOAQWd%c!-뭶 ndy>cdۨ曤g 9fݚhGJ~>~sWHΊlyr~?u^[!ɳXyK1dwhRi`+9X~ 389kEAiE^푌AL{{U"O^nYxuM+.F3u=}jC|BJAAwޛ(tRw%ږ5+~۫A/ete!Y>Ǘ^,m"j+qkkwmf;1^7<1wPW4Ѣuu {?^)̛AQCWI1_{SJfpؾNT>a 4#9__q J~ksA#ٖ=ӢYb=Gl}(F25elR9+FMU־Is`؇]_$mDC[%SnݿR^ h\`%: =T4x==$CkdboL>c&yA(+=N'fBR>=.yb,H~`=]&l|WdkY}&}el+tZwzZҺew JbG.7 #ix*ߔzn RYT?C)V^P22o1ަ,MR2cO$;{uVe؄IxW%fMQzUa}TFζ$ w}[w4yS?'@th&{t}i=d_fsOvV@2,k7{vv|Cc ^;Ǜl2\c2ӎZzd"+cQ2-3VjE;JA[Z?Yon=澚~"JI1Қ9%ێTg:KV27Wλje;b~θ 4`HdJz.O|t\nXLX#1dzRXFWЃk.QZĘOO=Fų1Vzoր[[N^ڒu7(6gV3W=VtE~^)v3%[sM׺W~WԞB`>cZlbk%m+M[F `^-=I դW% "~OVi8s&Ra( s?cui?ֵg,[2_nO MrcxU%}y]Aĩ%^5I23c0>#d{>)3c: a$ 8ȣ߲Iŝ9mZV++3cZiM!To@ݵ ^QyW\8rujZI^Y'ߴ_ʊV §{-IJjs=LZ:ͳ!M;&ZmKu߄7;5|<(H}vze}N4QߵeF,%ӳ#{Ke;rcs}-H 'Q_d*Mgn#J^2p&ʬG%wmpFƖ TTm}޵R?9mj-&*o&:X#%iui'm A|><&8OwV8k\LjbW ΔAKwfSAXh֎\.oj7\$eps DeԄ7Њד>&i(eQ =;/5rsXnL\ڃlQ`o(y3+R[z^CՆ9DXq#i;{΀hûdswz\yѕw c"^;__E_`2;зN><-o$s0Z1FjEjkNS^gjۯ\O`<ӛ _8 wtoLүړhsV٩+H}xb&,H-ݛN/_QQɼ#NEßvmNOD+zT&cgT;VHtXIE82mdƷ Hzĭ!pEI3r#Ye:KF[/y&_kɪ|Ͽoޓ۝E~{Pfe,{I}w!~Jlf+,3hxђ.s% O sMhl9kq>u>*v<[ǔU*lBj=^oL:z}òI36&ulJsԎ__w>Y%NHpT-m{3^Z 2MZ\ |h<)Kŷo< z3gͧ?4ݗ/>s7e`-S=Dd;L;Zeiy~ox|AXˤ-2WN~Hջ`j٠_jүzxZ.ф_u4:3EG.H6aQshZ=>O2N!MVfM5귒ѭ zWηQ_ݒwJsYfu -YStv{0Qjg%3FA;!HE`9 O}gLJ/Z{jY}|A=#+e+W㴓~d>1`z'R(=טt{gJu =wOp RJi(8kVn'K;᭓W}RuG˴ c26N٤71M;o1MJѫMVRDm75'WI'\iZҩ},]Ŋ}ӣ F{kW۱$aW` @N3,v͚DڧkG[Z(D =H N-g%a{dF3`y((y[QHujJMhխj*'WTF[yrb^1³uT<"Z5i3Ơђɟ+]bgDddZk5L8 \O\ںeW8v98FI_l_Sx7znɌ3k^c3TH\4S z?gzHَXJ+YuxEk&FW^>ѫh`[h!iSqLRU&;6鋰H/:-Ozq&;vt'|ф=a&}Ψɓaw VɸQ7ٕe=Z#ףiyBtZ]di[\ϭ&Ͷ&YKdu1 ,ajû\jkwLݓm]>ìTwEzdW14n/}$PkiNCQXx}&Q+.†؛\8ζ=ywT"H5D+tA^gB%r>Ov(ws=i^9sȳ*DY>5+dls]۲lshΡI_tt֪t8q'.α#|WI kƇ^4n-Ssgky^7͊b"}zt0^;t>^zwE6S5Tj3[VG(Y`!'1MN:}6t79~E"t.47ؤ֝9&o^d3<: 3K ii5'Y&IOvErA]{[jeM]cifquʻOu.&J-?)]Zd],AGn7Ͳ{FY;k"xGBh5{O$gyD鋙} ^a =3Mxwh1ۨk"üvLTigI8]zIzSX99 ȺOxxMxDuyFdydlaYwj2d|Fk֝syO'<@Dܝ51oi 7MƿdZc&|q"9վk`+nghih;9C7/`诌 RIgh (|Nh柟e fJ =IzSP3s65~9> m[`x݊FFM_hCA)mzRd+ tUȏmYw^xժ_>ӹzE*AUXu;2sB jp-י"vh^jIY4ڄnOтz)=]Hy5GoY ĘeF f9ǒ+RsjxK;+L>O+;S\*Aɪkk /{hfd'JTގu'[20RY30*d]݄FrZoX^_^TS'L{Bn=K`,PDo+ 8TgY,n?'/+]%2A#Go^3,@3\z/ZDk?<=2>孹&n,mR"STcoNY41cq*A/_:{xjdvܑ)jgڛhQ4]sùk/ WKX#u}ke"VXI3V ?cwpd[ekk[3340Ưc8+N%GPu, z*+ +$^@*7ye(>mG&MMdo伧⑌|v-Yo=tsuvmV`cQ A2K;;QneaCFSz9J6$+״0ߞ'f{_qoGdic ZëtKƊD R9;ri?wD1M ^𶘭soIV}Lk]&W(z{XLRcIl% !H5^o=S׃XaHݸg${{ɴWYAX#}EǘT&y:t+W5c}-| :]FV;2=3Xܛ~B[ީ煓mkD!_ZP,%ěe36Q2;iIo9<{*Or Qv1/~ }}}f;R նfؤZӽlecL3) F;~ӒӺ&t3^J4{*d3(H:#ݞsnogn2Ħ B 9Ez"'D9k$]Vw qy5Rg&iD.ۖy+@aTޗwURɔșIڥYڥIcx"zOf~> `"@zL; R)9V>Zgvw✽b[_@˪;E\9D5 =>kzls?mAk;${Z7$_b<͝Ax* ֎8Uބ5E|oZ3*g՛Ժ|uźl_%^t>xJevh^]lkO%RcFzWk/sԦޅQ2R{#%, Elj~MʹC!Qy*;"yHtib &sAe,^%K/%>H_],kܯ%c)1hliJOJ;{Wgny~diMp*_ B&|\ZfX[[Kׄ%O&֣[f ؄E;+EWYfl?s))X#~z~dFȣ6Fdu6^u դ*.[gNʇ⻛YH_{AstxPswrzj`+"XG?Ho[Y4G?o H=4 Y֯yGR'k4؆91X}3V϶l ǫ$%)i䊚̯~ IFgF߲Jq۪l+ ˪5yu&}پIӛTwgx~vh>_^m׼Jɺgˑ"H-F2!cd6u5$i;ǽt$]el}-#JfĘ^_/]sA_Y85X2'݃ R>r^SjDE4aWw|,琬r?<,MD$,3J7Hp:D|DOjU^n܄7v}X Y29tb|^3LIEBstdŬ ~D;֒Tc Ŗs6ީi8" o`FOқݛ- RaGSj^UjNE—LؗO tm8I}hTE8wGVSwLJ#NJɋܤ{S̱ɪ>_eݻV^5C[Z=w07l~6dO{gdH%"G44ZiO&JJO{rN/|A%gK~KVi_2cDOZ%k"4GWH}:ꛬv]Z`|xF틕ru&XW}jw5[!X -c5Xc5*3WՋ<.H_Y1QCA@sy0mkd<5̊ r_h ƩuhBW?MM<豟 , YWN]Yqtjb/ k+d4#LƋ3^Ԓx Wxi?d3 j9٣EE%Q8VMj]˗ؗ+oS'ihm]yIJL5 FܐU#ה:Ivm)(mdgQj+Vy?* USN^k ppqXӷ)*E˴ gq zFm'${/U26w6/k&el#ʮc*Z־ޞ"AVqb2clB%csRi-߲HWW_~gs =zlmT#~ɺl]@g˚+iM.Z( PA-y+ce7[aQyo}ze&/x_Zk~}׵ն_JVk[qٖJF4QB+gvE BcC ?&?|~~OC6uReʼU'8V'6oMeUhlk#`|)f9H%̆.&tHư=y/yرCg@Z M2cz-/s2ozJx_<,mZ(}= 8Qhy0o)odj7_5zݒ;hx*UN^dlI5 A͘'l,jCK5o7TܧcSϳ7YQAhm`͹blvo& ֪>_~"&ۑ"W}}}d˼/-7.~? hxmo+j-,l6"\ռNTEXHIjOT2pdrFDJ>U:]eƜ!VtkG>oˣB2e'ש0yZ/,O*(*ۡd,Yq] Vkr:h3S jEZ]+%3.AëQ?oWi_^ +cY{xϕ}mO"< |Mco'Tg`_{Xgɶ~FZ`וD /mudtdj!}W m3fN u 4Qw3rl`eyrA2:_bV ZyTI˒-tݜe[M|5=%2Xou.ᒳ{/Y+mY7aG/Vmix}ۙ^_rc :qu:di@GF6_Hve?zQɿqD9OSZxLvG9N$8ceyN^9M*2^`=+dL AXӎ&y#TG]ͿNA+&Fl6{Q_nKa>QAq_j E\AD( I3`Z؋ZD$j.o/uc;Q_c{l V6ty0G#PIMWh ZVw9Ѕ#]=Lid }hZeF""Esyd߯zSP䠰mtټʡR\Qx>[+`QM9bNkzFEb5%j,[16rƪ f-ӗg})x5 (.,hS,&FK^ΒUC{r B>>%v9y'>rE->|(&3XsOvl#vg=bD}V`F\ Ej/o4Z$M w`'Hc> n%dg.,{j[giYf5` +$+{ىX X?v;EZ$Zg ̗&Q2z+%c]}mmm]Ij9ځߤ_ZKg Fdz+;Ehv~ii}UxoDxv0 $ד*Ou5a%m.lsF^Oƾ1.uG=Ѷ;GzeKGVf䒱;{ɪ "Ho`%?z2o ?g9wwDf՚T g%.Y{ $ՑC-Y-H^-,6h͒jG+SngchmBJ֮d҄ (cƶ$쮌# R=)7+-'!jXHUȻ **"DhE`2:{~3h輊Nfl}ڑv!l-{ŝ,7aδL+spn{VcdoJz"7hm$k[ӗ}#Yy ig*1 D7UԤdӄFs,H+Gs1;iGy߁zXQ_ |9&l5Zkazllp%ӂnX✘'u =zxӸD#z搂_ݳKLLV)rF>eDGƫ&k͂7a4x#~9Ƚg-Jr~p%f2^ҤW\$l9rn!vjA}}.|&l/xiV%a֜eF[Hu/JR󝟯?0Ф:"1nIةc qm0c r/m}W?i4aaĉԖWuNx]C+RL¾o62zIϨl^|ôdѦ%&7{]]ζfS92SӤU{ɪ9Vp8wz]߬sk5HS KYkVx=j#e-o8JKEh4M=gpK;Ɋd wBLV 9K 疓yw7/Eyɿ; mCEC7uܒn}V : ?H̚γlsWg0W֕d*+R<U2 9\B9"3rJ4j=봪d9dO]`Ry{0g]OۉAhe˨IXGM8lU5t`l͑Xg J/z^24v3yngZ1ӺE떑J;OQKҳez O.m_2veބSOFa(dư&ΐ^2ȱnIk} sVO,b{Vf_>hv=ZFP%c)<"oc; ~+g+#ޱYo.QW6gC#]M6r TL_Sxq Iձ,-*^oR {ͬdk}1mCΊKۤ}Dn$5גv΀׻#3bǽ'֛d<]?#wϻc_C+lx'qa1vNɪ Oe`)WGv&`gShZM%4M_2st,&]VuVgZRپ?*NdFf<7aDY۸oOgȎJ&:w3YvH2QM|4Q˝dF+bzW2u޷˵JE=g۶,\28o>kMU3ިI}':>9#ׄ 6F?&Mx%3`}-7~RQ+>H–_^h2\BIef '>zD右D |s[LTȫOQûW[^fvt nFN!1Y%Ja6<EYϴoc{͑O|}jk6C3%c1nk7'I)m&vMaߝqoWmP/AX켥b XEjGWiG[~靬>+Imjz#W܂9dȶH!k׳͖ygfk,X-nEmcɴ忳>|œ;1y&)*BQŌIcx<.M >(mCи)'gb]ZjBS{wINKoƲ}Ƣux=`ƒ'0跼`aY6ڻN,=Z6_h XdZv?% 趇|TZheKK 6I %}i_ݽEP> Dڲ5N=cPr-c;ͨnc&FANx`FW7XN>~ %l&>GxhW%N?6H-=ONR8tx*KؿƒӯA̋d\aFdFO~@]VmhU5a9{Gp'{|1>|fL:5XOxuunGz>ue6齙eIt;1+lZڦ:߮IocأN2Sc\9uQXL7N ;ܲJ2D JQɺһi6 T2:{sY SheLMgg8uJdƂ9 F3y9֫Lvk+陷֚&,6Ѳ׊\c RS֓q}FEoz}m]^Jx Ej?/z'S؆^HV=Gʐ>:3g [FZ~4 FfYVGG$?> ^כ;>* #pKX%UYzrY_,nHЉQI7{&<͒=Vu% ba뢈1do4ʙlM ym)}t_bl8[/(`4ޓ7aWXkj%;_>%cOAϬ1)BI>9G41%W Zǩ7Q2:c#JֻUMWgY-sz\]% '#Udgh$ѽshk2KvcxQQ2~~qd)6"~#^cPMqo~e}o 4YֻjhVK`2Kkh֗zWJ~]sg-Z?'N2ޘ}p}[P^ kdmTzXq"BŠK~O `_-D<%Mu7TRC{xH'k ^[7x/ Νy-[ɝhO$e{eɼUz- ֯;R3~vlYɪ&ꮉ>εN+:l?F_q+NN~u'4$fmyZVXkBbѧ)3-_ ]z%Su;Ƭ⒛V;j\ 4+Ie5m:"H-- ,Jd+ ү23;AϸvS'rѥ&#M~]6+2v<-v{xz2g0J֯(a '?Vn5&gY5Lh0e>">&d=2jeRs$F##Y>`j kdlוJz²D[!mWdxf~_]VRhh˴-kB۽L_zAj-+v}DkoJ晹+[~ܛs(5e|-=&+NJ F?oW^wTW7wE[gx&{;,D$4ŬFC^9iU69"4+Y2T3Lz?g{̨MdMv62OՄnxG :Y ~9D+,BAm❱XMxhR=cy'3Fw{WUeiGA].{ŲZi{~ONovd$I[U?g?cf ~2^-U3piZCKa6& ,i/#Ytͪ3CjN VijN~M* J}GYFUB%Se"o6OMn%ЦAME16aI2=(d) ,]Hgf6-,֣ܷv\ڔeZR L<#b/\P9^;<%/HZyFrw1qci}iK:7⿛Ԛ93xܠG>EoٿUіQؤE+?z#I5wS׳9G$quFVnF[n F.&U}2^AK b}EFS2|ӟ:܄Պ?l2Vz66 Vj-S1NH.|wɲ;r)M K2({-t->J*zwLX\C^wKQg/?`R bk\~+?_)\32s_c/zdF- ;WKnvqkeEcgI'`Fu>GGY|5={6yW6{-c[9bBU~']8?qH+g|iYvV;~Ɯu^)D`|Ao{,{R/kزx'eC,Y&TA*5#<11gUv*YqǷ&^{g`'׵:_LS ?1MXiMmyk6MOQCgOcܚ&7{ӲmAX<9+AylcoQj3(v{8w&\f%WABٯjX&jɲK%ߛĿG VI9YdL<8 sEܻ|"j5yqzO/ EF>ٵuØLݘh7X@ EՌl2l%:~rڙk-SҼ1E ٓVM#ʊxӄ_9J٤^W^Ʋ_J}>AoM Fp1//֯w}8`=?Qf՞rmZ֕KƂc:gaIAC>dyqL(WGx~6}]*3O '}E'V^zsX',N:st0>^EΖ زu*j6(K֯-Ggowf,׬z׬975X%pfv k6djMܯѹJzƥdF0Xvg; V1XA|2EsooҽgmEHVo\8a0^1^1 ,zyE&yN]{?Zv~Ihx]0ֈjwݹJ,?饹 VԈ-N_ew;ՂRMWzL=XQzd߼3Hou *%w:ߛW֭?=CD[DY2rĪb3֗.JV{:s:4 {t/HiX [tZ !0znXw$sd;T3?C Zz-YӒVDl>dό\!ci5;+ZU:)'HA0ʆD; 6r_-Yy7w`'JEɪ7J2˓7>k=eN z{G۝O_2cA>G,J;#[3∟G+~d~9]kvA4Yļ"zQ;kr#ߎojQxl&G̥̕uwna^>ӚLEkԢs05Jؓcg:8˵l|0=2 )mӭdFg|*i&sX-!s" 42m(ShBsDMyIob/bE1(QE7adaz{[%PM*+~ϫz'-lE Ooqtv4Iѥ s%S"KZ7IwfokmcF2`c١l'SUR- k= M|8;Y]ǕˑH:OYpct}|Ќe͞kA #M:k0eѰAjwH/23 z&ǜ/sM|'[di'#TU A+r9*LzDIYFIjԓ޵h99荌`͕vV`g;Ɵ#ВT^Z7c펱:sk}]2-vX3iyWzzxl25"Ak~I5rzi^dY޵9d%sՃe4pyɌeUj:ۛ;Vtwu2Xos$;woOɌĬ{&/_{٣Ed*N2--r>'WhA[J {V7n{ƹGlvWiLk`ƢiA"Y۵_&Tz>ԜVTޫ`Ffil.ª^=65j}IjK{zW/3XRZguPRfJ>ea^TEd,;t8ܤw ;d,?k'%=u D/]>,u~ zz5h7[V,?lY"mJ/#ej,%{`d\@ “|ըVy$Ƽ囱 #@VSJ\ RhU3%Mh:E*#F$tIVxu} YUfm9D^i1~n5sۢ,f^MEњ VYSw41dw41gv 4z&IQs!Mzo~垛L?Nm)Yr]%n5&̸sYcQ6'%MJ?=n*YoBƙGיGKyWYYe[!xIf]ɪc"W [Vk^@&jWx5rYuwfMջ64E_ bT%SUE+15"NF#.޻ck/n{̻;d};Rc& w~HRp i5Q= ` ګIեcˤ_wF6ao08U1d&y0}_"+ >ָO7Ǘxl?fߣiZ:[+gN{Ol?01i$<1RAvd}{|2twwDzZ%sOr.Yup}.ɸxJ}W$oG.qzx&yZIs.8(Z)bD16H[1 ?G1M+UXݎ]_eFwɓB$^ TwŽRKӊ$ SѥMWrnJS˯(d`dZA85/){YK|Fdd Bϩ/H!GxU2ﻬKk&~ɪwDm'a=Y]EPhaղ;gQ}Ď_oEh~Be6 QXTלyv\+O 1_hkAzglMYISs%;+E*<gSKS}ϰ$UgV@sn`ڲ\2gKxy^]ijH%|Axk \m&8(fݤzLDٶk3X59)IWI"[x#{Kr6}L>ruIv6f&c?R;ԧZ064|WA{fet|[2TG8X5VD 5*J"8!آ7EzBDѧxT{[.zw%u J /UJ<$vgytc<}-!ʋH2+;b0vɚoק11-Uǟ ^A#= 4+, hڡO<"듸$k ~mT:i^f3`4 ^⭛\z.fժM{_{2RzA^(YWng/f~FX>}ǎgqNs!Xf7#t虹|wMFhU\:چ/xVz[1M| /2rc>KzS52z'Vd{;:6>Xmnɪq{<+M.?LZd;ZqG'^ϳde` KO(kMqWg`Coaj064lwܥ"y_9䧒)Eіգ#=`[h5MVM`,ι5Z,2qm }2SrdYV\cBS{r0n'G_+Yzʧ1 [^v"FWyEɪ7 Ie,uXwG+M%ϡOf}浅& }(?`'2'}7a߶.3&jazg<3x24H`°\7$k H9ny: 1n #wcg;YV+Q$m& `K+2$doqeA?ZyKV(כc,5ë"z`zkQMYFޱ3v^^:]+J<[=lgyWZ2_%D ccMnMh d(ZQM'r#8Y e:XqX]ǃ>G"I\9~3(yDM%+ܲg8X׏Z[VVe켌-7A_}zMɌhGiڒkMf7eZƊwg]+=rݤqRUQn鯎w V;ou pԣwع&clgϚ~I$%!{2>h΅ŶgY34 MA<>]~k\K 4QO]+Y1׭GyI*Oel8 v TTgg=hu usv0:_S+4YE=XǠ\jbt騦Gı&]՞95jV.SL6*2mKt: Yb-c9)\ĸtc]0E"f*iR+rfΖ8Z]=bi f>zk׾o6h}}ii\Z;ǬʾZY_2/ك 4:`wI6aC>k}NqZZU$eaE RzxUMwkP?/g˙ TM:P&z#Gh:ԿY2VPzA;{wnܞa45}xpj#Vl︲ue=#MEHF3Me>URܵe}kjOӰ.XZUK+;3B>l0e%TFb-)Y52Se,[mRxJd3_CTŠw:J/WdwT+vf6aM*J)6'~%i]9 {/=۫ iɚi‚)ⲟsU0qdc`Z,P$9Qx^2[oDzD#ybMz/VVN^c99PvS=p>~U81ȶvfɪGm,vow\RFd6dTu6Y;{䁺W}BFkuD]Ɍ`ׄ d 3roEygh l<3:3',vXLhfIm_:;k4^yqzsZ]܄_#˹J:z{55&t1ind<k>tk`Ϊf+tߵ^,1jq5Zf,̰F"|;V2IS1^t.} Yxoή{-cyl"=dZ˲l?~dc0:8ɞŏglK2WMwlc͢I:ogh'Ki9EvMzw(8-1mdƽd(3[~DD+&"Z="iWZA{dcg ,3X_ձ@%wW_2FѰMV*"۪E|\*$s iki$]Mjc=奰*dYqT UdYWde6mhi,"ڨ^ތ0MX1%n]2_h}G%7uꐹjɪǙu2V{dg|)+:3KW5fQIW_m9c )юF/* =,Zw Rؠ+v$IqiiB5Gs_ff%7Ly{%:b^Rve^.$#mg0nے˾ܵcYW}pj7sA\JN[U/n£èȪ`,dzd6ǰd3y%ۣy-͎f=#}{䵏*]; wS ٻF)>d{*cgLƪۢN>C2>BRK،]13{.;l5J`:_J2d+ tQAz;v%ћfUCk&N@l>d[0- h1M=zL0ܳ5Xlρu dբWq=HWjO*z4iMfo?G(dlXHgE>O]*IvڤVN6Wv(҈ /PL2$rm$IǞZvY-ZL1lyǼ>eJ{jQ9Jz3r]>(|{fY}!h`rFRzWymF nkdZqLʾmǖ&;εvac<޽*6g;dV_sd[Жd=/,<"= ~&E׎`a<f&ٞџ?TkuTu2Uh["=Yuߊ~8ꨳ} %鍈(2I,f: ^Ɵ=lK^"lU3U&FY*趥Ud|\ ̗[dٛ/`l@O3|WK=*w/h&tC9zZv(E sAOmxdE`ʙX={ƒHkh8.XvI2}V=>|Qf`Z㥓( K{\VMz(_2I &׽ca9$ s䉡AX^4X%ZE/_תr+ZƧ|Rڅ2TW:hүn74>]߉6qH$3sH'{Q'Ku:&:oK30vMΆQt~dz=]w?վ7Xct6" .{[FQm.X XkPW%b$4Hoyi]U' &yOw2*s ?U%c I47j=NX'"4ꖭc2mi~fxBt J8gt_J6gkyv&JF A<3DWl9<3sY3._UY+T4i{KϹ&6Q2q3j/Ex^leٲ3j[zG0Mĩ>tPL_D{ݒTIپ&\M7(4a?>ѵd؆ѵ"gePel-Ə i1H|Oy2}{du&ۓOVO#WU331؛'eUxL+sJv;"D}m$HߑH}Ējz&lOBj" }jfpc91{Ur+fXhārcj1vgUx%c_-~k9~lI/jQsOX `b7h5|>\j{JvÎ!d,"g˕=TDos z[`FyT9]Gv=-҄u1%xU_mZv*زXp9Tw0Ym(kɔB$Q7*VòGRVebsSdڳ5zI.$]&YO1vni8J`}4jSWyH|Ŗm܄߲Lf+wtQ{j?==`yow0Qח)-Rԅ Օϲ.MSe|-|-;NRݿrڧՊ;crb$uwղu"vJᔭZ`~cA' G2V[i&(3pK'μӓZɴɌ_"}A.6% -v=k%KGz>B;Y5rkUJ#li*\kYm8AoŊok&KV=YOQjԪx٤r=ƒx2>o2W"2N=jrkJqC\d}ŊH4U2ZUK+9Cd~K{xEwXi-d~7kq4Gv0&׶/MñNcǐ{ǐ+fg%*wDIRkeH7;J#5j MuDv})C`F9kVi[h iAįdʒ<޺i؀ԪYLd4"Cƫ^:v:t72_c~ضyG*m1+#ko2mTC^ؾwZπb?"E24ѤŃhvN5y!O2{ k{I2~oR뎓o2S^3ADTrAo?؈ZrPF#yA^Y5^kQpia`b5dX c:cIGk,S6s%ے=%f ?X.77[^<8dZk_"Z5"SJ^:tO ]KqlJJ#G=> "}S3|~A)1$ݨQrBƗ"|]}}>'Y턵~`Z?AKK;\PNM '{Տi7I WGuR:z5q(}ڤ7K+KVU֮{aJt&Z}~AjIVTĽNZyVk9s]g}a ?LlOQ;{lr~-.nx׭-/~㓲r?DGMac%ZƝģ˒L~g%E*YO&tCKIF5Qvkc=M<k1s`B'UY뗖U#^IX+X7b^3ǁY2Xמ*&#Ox2: 2yޅAZ E {"!Aҧރd]yzznὺ5]@MjgEL_ZH봒+=FT2^)EXΥoIf`l뚭bW.dS񡃒m16Dٮ+L\YEEU>P-n=ʘ"U"ޣxIװ%K\Ig/% GR;;Fz|ŭ>3S\DDt[1<˼94`,Q{EsNLƚuoZu4n'i /ӢߥKVYma`YE%3a26z̵L^ƆIm]{c~_;כ9B4tNU|uʌwQ'AcR3@o `[dQY& >rZoS e|zrɿWn{P"}+GHUִ&A-*~gi<&̲"Z ڶW;$?cc~IeAD#  f&b'[GY9^;ޤK>Q^wdj$ oYom?EҚ{u~MvM RU܄O4 -/O<"{ _(5ًQK4Mx#jIA'K댓<>_'yxD],~$|#L%sT5YηHonR=/OeE-V}V2->Zz!MIR5xBJѧ.H3zx9%ІAx~ d}z0HOUڄ/lrEWg'gu̠&,ʜv✌dw2A|?>Fb+ X}SJ^WWYk }Vi5m#RL(g|j5Gxcjdz@=eʚo&'7jMM{Bo,f`XmO逸<<ˌ Z- }ֲJd=SB[Ʈگ |V6%mhӯ?|2{QqRr{ŵ&zWIӞg&ɹ>O@ac#W>"To ʴ ͶL MjYHO饖C[z6e FEę4ف93VA60\~w|bޥJ}.Y_s,g52sW`dߚWUX+⛤(x=2+<~-g|Jֿ^4Fw6S.5|Jׯ(ţ{MIqfjoB>* 1׆ ҽܺJeGzyh0V&E =CyWI7UkW{xsMxO\ 4sF?#T$5|&ձOLCw.fq-YY&}*HeSGJow_8vMB%cm9~><홫8,D|t"g7YԌefXhM R=Ezljv{~dvhtvr$Skҷ{[d'9z&pUQvx l"[[5QvvQM%_4QwYJbUMpLb akE6j1&KG1^{'S* s6FֹεxK9vi}#Ew6f1 摚Wk;`sIh#K{dLXʬ^ղ>htL$ 6+?^-8Io{'?D~jXP`{,csm@-;h O9w"{81661G:OiUm3ockӒW_i)ʽM>D|/-D)IJf.U%Uf]%?]%ͭ:$7}&qZI[,cEz=Zx*ZMGf CbdYMOyT0Ya=MOblКT"x5>ȲI猔<ړݗŨڍ}'Xc21>jnZeZ6=LyMX- FK"#衽d޽gKVM푕SnP)}8i]}k%f,3wf^Uz Az[yɴ= "Z#9nMX;6ҳ%#NnХ|<ޛToˎ#e|ikzw,VǑHɴj,dG1jq(bxIOLz'1;pz~zRY&3.p>~Y20*,Ū`L+c 9~Okg?^Ɇ[w[5A^!'xD;O%7ؾ/朗 Rx;#/糒uJ֠)4 7ʠhެtZ?0椽8^eIV=Z?څ(yY(yu^diKқSDOʸLFҪ7a[x^-kUuyyB6YdQ>1Cby&?'ӆM׽b4 ="6I{/O$%TKns׬F,gŜ̛Vh} hhdm}29k+Ęd>X>FD$hRTȉOi'EA;EOgT<ˆfe{f5H2g.ҤN(6IkmߓU>iXyoMD{d"c/"KyAM؛^{Y2~*o="?ƞמ:G[ވeYV|#G<|&|3ks~x"HN|^I􎬃$K_z܏Us';?2OseDjTMk1 K |gEjDI^G22{|eZgQk9 x|͎}Y3n4 m|!4%W,^R.*?KH}k,OWRfSY -!)la6f?$g\ / "f0իt9}~ۻغ1BD?meEҡ|мWVV/kR~K˯9Vڗ R^!ΌmB~émF[o "ӜIfwD/39o RId&FUFCnSu mw]8%|LT2ֈ9{ 5=QAO[q`cjbŠ~JV ɒ5魴ۨ£nbOB3sNu mԳ[_OhBKgv[q'I%r.GX5;sjy׃tuex7 zٻ~prWWDk54`gqkZN'6'"2Į(9^J^e45"B07zZ#',p=zڒx4AGui+k,=KVI"4#w{d%R>}0)VE&jL ]O-YndZ̢Dhu_=z'dj},n2ǪAMzO/:oRP&e~lE ",ydjP=-oz$d}뻚V{wlYsG6e҈)Vg&l/O ]j7p"*.Xxzu嘬^߫]WPQ['Lq N_LV_%٧k}|j>76. Q54mNۤ%ɷN6;Hmz(-#y,㿢K/wwyuu]/r5o$}O~D[шn>1.ғ_tAV)%$|z<ln|4e=ѢgߒJvLSdxfYeLS̛,MY2.oSMߥKJ{w]2>Cɶ?EKV\gun!3]_ʺzȣsTNk:9kH%x M xI;d%{}rC|/uѭ>^ey" @}~%!~m_#`{VQ#OU^KH`1o)E0NaY`-v2-5c0mGKVaFkYZQBЁ5뛝y& -DvU*YW82}%J&I[H5Euꎔ#˯\C)OKRr3zux;fU?hEMVyXJ4f(>Id]qkgQL8.H_ϱz2kOxu["LId{@M'gVYVY3HT3~'mv)Αrٕl[Є <ΒlaWqW5le| "*}{o2}ayd_h²@k )W%ls9얁D:s;UΘ2mxञaثɱ 6Ǥw9cD+xc%S}yxMIxneY V/vrbfES?x{w&JSd]8%LN4,BeKM: ep]'E\odS޲^wIhr,$()_ ؟Pk)Rd {8g5氘Br+,\aqwW'zGG(Y_k_$ %7X6<օ^_B督MXbA$~u _w_xwl9#AoWZtyZ==s`4c"Prw#ʎlnudwmnL,d-㋭Ydѳf`#c;{W</Y6S²n!? ^yJuevA*kGehO%'sI;X:U3"1Ӓ _cxݪK7{fdjU=M FkћY_mX!Hr)G >^5<^yPEjmjA|A<앓sל,Ul0IG\[xABhMX\0,Mwna:odGh_w)-W%ɂiLdѲ+r Zs<ւc}Ҙ%9_`g˺ѽykϬ}ۜqD>5暋l:2 _V`"`4C82#2Kg]%#\׷'HRy]{6d &;z7x\Lz&#;˒he}U{3Ÿ㻂Єy{(P*.S5 ޯ8ϻ_5a2:H%O8'ӶբԮնоI|Q֨dݷ־yIQmd_JjIymG3_mcHd{o]y%Kwhػl5a1Wl]z.Iu>uL,o59O߹(۔cAȧU>O M "jUki&H_AD xA? cGcvF5P2VgL" M,gzjTXgt~%i87ܮrL,cθ//\3w~ޞwJ3q]0Q,c \/Zs0VY^ٙL- wS2zRܥ%DIu]2ZЫ;3xMMq@XE9_Eum WՑ}G5AO=X5q_җ,[b]vsvxzHz8o TO8}҄eH_'RdPIgӳ`Fzr!XN+CMD4V|1nϼd˔׸=f7k.9c3bVG:C[|/6ɶM{[*g \9LQ3=NT2qog5;ʊKcR)t(r酅 ºud,OmBCA+B煇H%ZW 62>Uдɪ5e8Rl—ë Ho:M]-dc`vjѻb_k&{4I?>{͟?L`q#x Pn%#gDa_(ù>ftիJV ;Th /i$%J>ʾV|_;R=l[=IQs`8}:>Xp`}R닛TBrMz;ɚeQd5[hV& a,{y~i\Xe<,s/ wHR_h*KhBF,meỌzC}k,Y0Iu;->eOmMZyj0h}KwjIE*sd7鋼F%3z?gH }-)_5ށ>iD/ėo 15Qc;xc`tj05x w+?%|Z&I{dۣ*ѶީdPi)d+%sūptuL+Giƒik|E5kJVE_xם%M=dUi>%Mo /D*oA=(=g{t*ʮiY OuFJ5 ,Axִ\͢5+JFXq BMzy?<٣n%7kVeDT$K] (AZe;Jӫ7X/c 'V?u*e,Z~xr+rF$:&y{IS%뾕3dm6nƃ6b0 tx'>j"ff t#uA33|B4NI<*H\c^M޷Zۤ8 {kLJ Wz~ ^+K%x׺d!JYҚjo0 qqZ<77=v_Y'72:4jkNellW+y]jɨ,Ճ]{|ԊU8%W<5ϲoqb-vZ.2_t{oʘ4>3Qk^KFQr*^ٍ^Lx :F__iMCزzQHΙeDveF6GuCDEӗ~}{0NƜAؗ~`0-$Gߗϭ}e->"gIԚdgcV<6 I1D}ύ%w ]*g"X:޶;Y햜j-cznh94=c8)>Y SlҦgYvs\ZS1sٞ~%d [FV)|L8u<4sdzm; u~M2.Yo׾IAWoaФf"F):ȾjFEAeKVYxX*XdǚݰJxoE*-e_8Yo6f59zکiFpLj ߵ XwbIGr23Fefv*Ln\ s^5c޵ Yţr!MyVl£lgM^S{zUk2^oSȰMBeXzJމF {&;3z1TLj"fe5^G^IDk~ͨ#&,1~{0ܿmݿb: P{Ū$jY?ӈTW[;26l1aYRR'kZyQI=CdA-k[2qo/Osm`Z:8Hʽʃܗj,25GUGα*d~kjaX}f.`|u-_!d/Ǒmɺo [=_ KF{\ڻTHyLje5gY-W6cUcն|=b^q=(-ڴF[KIV5MMu>Sg9b|y\V)kޤd  qvU3 i7c/.u V+_ 92_=V|t>4˳Օuӧ һjAQoҽWA*}Ң_J)% J{Ue%SSX2hpf*2O.YIRgŲ|`dd}]dz~݃{нFA</Z3tH埳IH`2>N}Lou(ƘUL ޡ1j#9"Z=HWj&Ba3r%gړ6Xs%ńv R3u9;/ (/矐 ȧ|Oz{^ӝ ,\c=X1DQ`rc[8⽒t'Qg+o]_?<>(b?LV\ckhmO?;Jy=DRdFFd=h[LdRc-On$5d֎Iwe_W /`أ{ty&l8amox(W%_F,DH=<ָɛmgz&#f>ckPe;C#tS~mgk0+R;cez^j>-o{=잍"J-UQAA>su2կޚY2z}[4ξVJkFjҗhO5 eE~6髌f 9DΈYgDC F28lzmhj'kd4<d0lKmI:o?&G|ku3hFz*{'ք\CEzZVlw[$G$bb0Z]5_25z./b匟LpgGR*B[r%]أd^`j֤w^~ syZ-'臃|ڦ{vL-Gcy3G^/i+tߪ KKdJV(%n枳~T9LsHV2~qkG;]КeKs#iK#J:{K&sto-N;\ CM$LdzuL /BExk_{EWLg WSz*1H5]|HeYAß~ sdwvO !':Ww}UkK"-s`ԒQ<ȜF'{%/}_D߻D<6-nUϱÃJW .(cK&qV|&;Hwzcjq5Fd=N\Ohu{//2XQ+Q&j]ᇾ?酖ZqD隦v^j S&oVɎr`{ǚ$ǫgKom,ý?4x~OҴ ~/# 2#MD}';do81֐'F;. _C6x6^gOE~kLU˶g0l%멜XiC\@Qw`"dѣɺ2bo0Z~֞@um8vg~?mYz;-Y@sfDAX52 Lק c&|ȓZF._3M}h+ʪ&,8#:3uK.Ҧ%FEiUIǴWZ YYkZ|~4\m-NkgMpY^̇M* G}=v$zCHƪjt'xxv54;bYCV7T# ~SC՜jӴa]=7ǎ,Izf,sƹAʑ7? kP*R<Xz.}Nro"ai+!ԤM5q}cDf,-_^_D=!g=@kBh]ju/ZiՖM.:Rq2HcEZ7ǮTOX=dO5mݼkEl˴0z/%1[<>,mvYI򧴞mMhm_]Z+I,EfԊ虃u[oR{bUo>T &^`~ey@E*!4Qϧ+ AZǪifUR^Sm>PwW%z9:9 7,3-g(*YyD f=Ǡտ^s`o(2`J>ؼqi&QR2XʛZGir+\M*mpЄ?p ZY V'_'iU oi 4{)UDv}ZAB?<7ȼհTM'IH}̭RE\D:(4Ƿ|54y&v@& ͼMg≮d|К=L&T`j0TMttYgM88w7aNGC񾈚f+$(ZݲkTO}vW珔,sL8% "mj9{}Lɼ/ң7.BoDO˵A>}ޒ1AxEO~Q\z6ynWx/D 'Mj Vk& tmzE "B644HT &"3kIhݰzCPD?v+1Yy3 tΩM* jdT{:UGkOv%cq>]{.Vq^[٫*YVO{mt0v4RzT%I}O;M(?k'7RNV_;p:etѧև:.x&β}SIo9Z֗q G;eU6G؜$ޥKV+j&l7hR ;3Y}pY\2(O[55h}͐a߾ֲcUF&#ܓu fgM*A߸HO7ѿyI3@/RiD t3z:.Y5bF\-~=뱋dݻ:cyζI˦"/d[ޒ'VKA{JGzeaAsoML)VCy \2dE ]k*jBs\Fg'K#ǚm:1`FYk@KXޥe4AnG$*[[߷@{ۓ#Xɺ`kAzyOVIzw6QRΜ>atںZzN+\e'} iOgyA7nAj"Y1k?`4io~G_=~$<-܄yHTiq^ᖬ7Ó݁U2KF-z²jž2!Ԃ=>XVc2Ojx|dJh*ȑgh d=;9Hl%,wZS%^`6Tn%.H;DVKC#G{k%AaϓbayYp<dfK/ϖ72涓hgxdkld|>6a{Wn#&ʋUnQXWV+jձssJͱ n>3wy5s2} D^Aj۴O?+eJsA]>Y~NJȳQGb 4ZfIoY5iXixf4/\yM*EfJ+" yEvv[cA~&9H:*'yݪ<"8KaY ^9r3z]O$jג` ]e>ӟ›.8=.ǻhA]Fyo շmٚyr3E5kPv&|US[HOvƗ|]TkΜ* f<4x|֠xF2jhϚzLm610Ĵ[Z6/\`l\}QUU2Qq!5 eޛut+=–V#MX_t&Qߕ~Ŝ|=v=Aˡq/QMsZפ(U:Mє pμ雽gaޥM5l44.DtzdKOIKғgu:A#`{Uѫ=RMפoz~P%w}Oɺmmc$0 / zJV n#fQ{bAj?z%F<ȂFFW{Ʀ([ ('KDQژO߶IHXYAx[@%jޯBg {ϴwղ,'D[viYOJvCw.ҫ͉/Ýz*RMӳg7wkZ0R8 )&5̉mDVwdzH$#N鿖SIW73_݆k=yNzg;I=m!,ʂceʨ^eԤҎ->T`mgђb=PJmμNKsJv;WE%əߖow[hUS‚0Ow,mUGM2ȹoq$}zQOsC?T0:u# &bd| j¢֞j-߯bAx[}SLVh|}M ƨXe(}L-Wz"=Q ,]-==nM,,ix_ERe|1  igfO>pgL%|r nhȲ&F,1byvޣ+ׄQCNF_O$fnM@I&0.ФrƦ\/gt= l/",)*"~ag&ɮ<#dMgPUd~ =Ӥ(NLM_&O${zeV yZG!ؠ5i_i#R%cXteإNjتރ0sޫ]wYGr %ˇg틳ЅϓTSαjʲ4m ֈb-l˞HFwIy#L;jEQ۳,}wNo_m R}O3X%ܴhJ^Y.&4M%{s߳z&M*8 'A*E;Iϲ~2w}*#[V# b+}tf3֯^7[1uZ֘Nܭ qN`հ3K%,PjDMAz#[ZUy ЪӲ烥՟eJЮP1'mU㛐dbZ/ݲ7IcEo4vnt구fT ]1@k`ռGk6O+Y@ Lm TyjŚZ =}zג6ȳ>c7IWс=VgkMƛ?NY;v5^ؒdy^,,;˚;hu-62WOߥL3chEX>2F+6Qz7Y}yj֘W4QuUꙔN}Le^z.YunmujzךodҲZ'WzַX7.AlqA"esCeʹZvSd7gDii1jԖw{^a)r Iz r7^ԐoJ%gG^Cq D7+?L+,"vq慢"ҭ,BɪGuT/xt|O:֤D'˶5<\ބ~PIs/ӿʦ#mD~4^2mh*aoS-n0:q<+=tv5áQaص8ղz_D?l>yT:oXeF!i?A6"iBٳQMXާdvYOL[6*ohZ/cO۲Vk2.O#X-$|jI5O]d[kؒ߯ܡ+ZWJ֛Iɔ;UE,n @Q^Cv; 5>]1'%\|d]jdbpg[:-"Z3EI歰ZՄ?5X7ʮ`MX#J$H}֯ jb08i0Jՙ-VO?3IZ{G-ogyڻ`+V& o _ǭvzɓVITRk$EdC 2&HÓ]>"UesY"z0 =}>p:dťlSgѤK֙ MXl<й5SDkt,֨vPRmoUi} R)zG/Ck:^TWjD6x#~1Ն{ʥhhKuJ[V)LcS^{keVWXV|f> ޾{̱ BgShM&c ?v.Hi}JS蔥ȴ5q\˪eh;N)IҬ_]6wW[DK^OIx ?X_؞oƷ)wٲlV_yIqyTjxEE$md3-.RijNj ?h"t)9]{HU&^-+I`hf6nYx GA]Fkeq~]Iy~|'3h2p<˴;w͕/~NIg֔ɖy>dΊnY[1ړ{CmJ֕3 d<\DeZXJs\sBgYU'Iو 4Giז[|[t\6YMN.ZI߬WXMnC &XZ-HdD'&K]Ti֎@,c{+3e4e9cd=ueܭ 4H4jڄvԷ2b}!{MkM7ފFQ6w1'3O\]+c?dfFƃ^moTgD'9p%SuW"i~茫AuM*́X4(m؄^ʈ mw^O5 JƇAF7:sڃGվAJetR{=d%Ŕ{Y}`B&F=m›/rJGpux׿ᕏW-]̥":XF_NAPXȷHO}kT˴cjpX֮GJi_ﱺ_*Y-Ǯxw 4oþ-26 "l}_ܓx` D?q=k1.'^Y&@ΜN/~fI>Eж,ѿ}uT$Z'q?;H\#Mٔ/WEBZV=!8' 967\$e{K#nu|J:r~!H}sMlOʣhYWhW,~5Gw;kId<ޕd'tDVh=g^+MԂڕ<ބ&/M!?|Ʃf_TzD{t_vi@Zd{j~#$4Ȝm,/;U;s)ͽj 4V;BqX^gXٿw9 ɾy}gxȳr]n[JVy}/"o2ecG{/ Ưyޏvqswxd#Ob Rc0Iuɬ mo멟, ԲUsi_k޽֎ѶVXCo3~: Bi֝ܤ7n:IQS-l] -Rپuu3{ +sdia?E#>Hk6zDcV_Azx?xN7}hȇ~MhI7HӹOVkr2e[ْi_Geuv\t"}]ve7lVqWzs LoQ2kurZs 6鷷8, m;Y%qw_9r Z*|2t61] lv}cFqg>M3l1P~&= fq^9}& [d-?/&YIh fwի .mEw2IY!h@EhqF5=:?s+HZ;\v,^lk_t;JUF( Yc%cAbghU"D]-JiUԵ#+^hm1Iy=Y! }QƘ>=Ҳ3c$FGy)+1gD5յf!F)|&G5~.Ƽrw ]=:dzerxr ׷4G_$Q>9hxzO`]oBӥ ҽ>[R6^mTO k2ə9]$v1q|u훗.,F\=&(vՈe݋&YϱhVn9ImF|>\V~T&SEh{tެaBVy}$b"}o~s+Yv[3P*kgUzOFj# oznImxLH{j>>n>[dթsuZ=GD;`Egh?W s*s{uΰC=Yq-M]5q_MնZֽqk_J%뉞cH%1N~8-؄>LaoAwQdiZ_L 2Z#cɴf"6ĻuVTGL?Q$ߒ(LzD",5LĂdvCo$KzF_ T3΅uI]͓˳*u\\E\7X>-l"XmMeՋ\e*f\5ׄ%ID$8U'e;]ɠ/RY+~4/Ӥ~ܒӪ~8ADޅCqA[t*˒OֹEHM{d H_\_2OBGcc2=nylR{SWU֕e͕/ʲܞXAx`~%Go'gٳ7MxLb,>,&wJtKYbg _Z`⹘qI[9\6-6b.^ʘ%mk1kX2b~9IVZ}r@JwZfRMxgwTD_[фm]ފ;Yn׸BaCԢKVu*IxqzҰOALOd'ڣ*^2XT ЌIXŜ ҽkۻ=Q>xuVğjxj9$mJF_a ],[CZ =Ry.q a5d&uhjz ]뢓l7ϕDlz2-v㋃gzoYoxii,WŝVz&4YL S֚2OL{ޖu5fTNbG=Xkeӯ;57RZSLֽgꔄ$4pl?gڿO7j"Wm\sFeKRw- ׬W5nAD+Eqe(Y#,ӎ֬xakaaRAjqZˡf%D|BaƃՎoe, =NQd|BlULޡ j떚oKMYƚcO'^L]{]Z ˾-G細Z Gs " v-B,/dzuME{$*H\ǖU3wEψDTViUM1  7Uk]yM*Uוmٙe%ZV25,d^ĝGÅzS5!ߨdOӲ˩9dOL\Qjd) ZGL_""Z&hNҼ%KJw[6ޡg{ؾ z.kdJ5J Y; VmW諵D'O$y>pEAGX +c&,['~f)/@G9fΞ`ՈNWBa=MžN ]U[ekmO?g:@ybBdh=g!HU{dh͞eǓ4FلyE B;Hs떹%?߽ |?\^i[ށrJy ,o8xߌ `a-멬Wz3iɝ"tђlA{jdȖ= vkYOr ]=ʔvvqPAjީQP25FOk݄]f[[gǣKh͵ԣMK/z+kodW %%D+rU$d^Ѳ0e/Y捞%`MjA&1˟$}ѧdoɽ6:ֹDK}$7Ǟn?5R=Z=`ZF,Ү%m֭-N1 IiһjN=yT\SDx;9 RMJ㵬2c.L}0Hc{G 6ꔠEM{OüW>>9J%5C!s6,՚6?`Ͻ&|)eӄu>[F/3iSg}Nh^X{_52Sn"J[iiR/Mw&g,s4Iqܙ?+۱yzp\ˎ?T,Do[DjY$?sɑiikZSU'}}wG< |ޙ3Xu}GFR<&wEJ->dݳDz]O.R}gP8/ g]1c]V畁qvȲnԌW8ڦ5zZ6Kr;a|rW mJ&B{~ɷ9h~c)Iz퓱_ 3^sO}c^(IouGlS-ӦbYZ/gO&uUMXaFl8-rlYeC8R=VC+YoD\c ޱ'sS~.^`j4kQW)OVMu>c˶]'1HT$6v໿v{@6q5Hq*wvx`&ՓNSﶷNN^IUx9{K2>ׄXsgrbJ*9j!IOg$cTճ94xkɴ;MZR%gN1s*EJgd$FnTҷݮ\2~nв軼&Qi#rN._sD)ʳW"ߣӒ9V2HfcV/ɋnRѾ $hG'0{h} 'O!:؋wMS&] 'u2 |C6#ߖu}hUyʖ>|FZt坳h^癌x/ﺓLOY}J޾e={ZmȂtQ5G%= hY""9l`ي2vup0Ό զFf,sKd"OiѪy`b$"9d>3-SSQEJ#)I+JOj YWF\qɿLl23F%ʕXvd\SIRyt:*H~qLbm؟y%ܗuj1sq&tyD9uH^9]E^= 5ߝUV2HCղ6ӠJWv|"㊳dKV|r7 4g\1l{/iJCz´ tJ]vǁ:*.QzYYz\2hsnBc-me,4Xou%cz~dIYNYhWqO\{tgѣ>Ų^嗤v<[daDGHҺoHM*'$䟌OL?I&~$i! Ȫ'KmQ_Y͵'ӱtI"܄$kΰ_AwW2ںV,2h\do cYރN-H=;WH8I_}94$m'͎Mi;b5:U2]䴌$AeY}דЋ'jR[)G.IeW| i1,*ȑmSh??guJ;L{G_z=957EocdkӴAğ,,[=>OxS B;>'&l8+>ք#Y%%" z#(s+kdzodOӏ$ݲ:թRن0XAh( "&=} #c <[rh"W鳝jhn"`7QN`Zޝdj.X߼j׃TVeSJVis |0/dcvz;G2%v;\Exsnc0y%9-M Vm3YrAW?ˠ-YJN )=,=7àֶ5fՓg}vA21ݙ@Wuest6 S -3k.5&=֪&A zfy֯{ 6%2މĒkm"?㼋&eM_#o␧SY?EؓZӲ5Zʒ _yamwz{2ߩYJzlS3{Z&Zo,O&`W6aajm\xhwmKn"&c ٩u.+*H-G~$_mhO+ +G@LpE,oKj&%˺nPOm'4vY-}4/zf*H}ካIĨ^Y߱E?ۢ{+19jbʙk'XuqyҤ,'dbR9[֕;>̗j`TG;y~ԾM,Jƕ5Kijcf2'h2`.U!MB'4WL{dɴǶ%A+^amW6d[SvA n9 ]-֔s}+K>%|VY_M#Vێ|=ԃ޽ǍUk<;c_;S)dlNUjskE`j#"}ٵ\d-Jw7M*-$z?1iScI*U|w౿}EM]ɝk1g(=K'%mU6rϽ&k^,ɗ?]VyF{WkRa2''3uM.NoT>9Fo:@kRm{oRhkfL ۾rɪWMlҗK%yUMjwi%s_HQc%~`Ջf<ڤ:%AU[$D Ѳ>=+tU';&qT,q\W_]gg+9o:޿L { V{w'~Ư3lo%w-[LkgD6aC+2=%2ȳ|yDEjԊuR_zDIy 4Χla{PtYѤv\Le6[h ,\Gb%> n:ehdͲ4GTN.&J"&{=%ӆI5G*Ф߬d+r:'mwc_LyuL*+\9&5~b:M.i=> NMDn(kr3+e48ɚn}>TǵƊ:Nާn'a"zMA#[bܰpi wX;Z' (&i}h/ǭ ߑDڳ_LnN#Mj'~ ƫ/. /.WLRkxx LaLǿԜlDc~1` )[L͘3Aƥ\zjkꑬhE(Q=Y,? 9G{MލRM/^FZ)Pپ }=ϟ,]`'GHT{MuѤh~bɦ]GMUV@2oDVyL3#˒JMZVWf7˼#Gid6ُiOI\Ft\*kYAYo'yαI$<M_K#켄, g+.mWdDrWNkt;s_ϩhȴx OYtOcό냉Y7(0PhZW- jbUEW?yUTL}5>Vy<6+`ՙϖ|ZAH 'fGn|~w^MՃVӲWhOA֐͊TUMjCwhQ26m,rՐ&Yh>XS{+Uӳ1M(ާ6 CAxs=BY2+< d{z~E9MG$C*%wn?=XVb8 Mԉ"}uwMjkGL&NDOVm8V3nM~ZI57,} }ӱ_-95Zd2&V[5KbSï)YKW̒,19?P~xzW瘟RēcuKuE\L|X@2S^Fjm9c$h$H5orn=דV^]oMeJFyMh}Am!iR_8 Mz3N+%yyn|?z%"6vmƒp#H5r3=W\_#]괬ۯd}GTDg4fA23?MO/_x{&{[*sج&I";%_KƲh<Ֆo"V%S͑xk[};:L=:yImtj@龒ի.mmX"IX[Wl=m^O20ֈ&103w0]qU==e|+4R6g+K[TLHW5.7NY Jєx y}A=S+S̜:M{X;]Jce)kO'B%[~.ͲL<6>2R;joѮ* |}=f-kvݟs)?`mմz{]ZBd"Top3dTB+ ?ƗZh.4z>V?w]z?Oq6Jیu:3fa(I8'ud-g#5{)Yu)'*`OK,|Z[{S^MzUd=o3b+scw|41A Yy}晑d 0,&4%sNччG!s7a5SݵO>elJ?sXAw۔T^JdZO$/ ]+'XXYV`5xkԨeRJ8Y_mߎ<7Ƚ[E}ꆖ*kqvZy jE^Hz`Ynš. l)LT( l_m-m/~I&N{-[J6KWղ[Vܟ m|&,M9籆m{c-*W>VRTk猑̱ =S_-cGvzԽ[Fu)Y_Y٤'z4B@Mzuﯗ>tHIUqMxOkϴ^AQŌByʝӤ\w7!H|{D_^zWǼdzRӟybM_+e+"kV6`UfjC eG:AyES2GmZӫTڿ_v/YX2 $[`j(dOڄu#ɜ7r>gdo[?ID[h˃ROG &NKӵ س_MBy3FEZ;s,a#kMjZ{\&1?msܤɐ&skܣ dYMV]dKt6V ~+{+22&f_%lYO|JɲP~wD+ gn$GZc@>JZֽ)U_޲ꆜ!vkfT znhUAXF65核2Dx\^9jbsUW=]n/#v.DjA,hUe4joJ[?Z$ F}1txg6=zor,˦ʕ6}W~2,Ҝ+Zb-MVI S[G3YNy}χ6Røf*W'-kN#hB0-ٔ~1>z_ =]2u t<&{6з֝o>?az}Dt+TTǯu'߮sZVkbn/I߼U`^ˎE;F «="&ػ%<ֽa$|{}´GI%msn._ :{!Zco.VIuGR"'&AszWjj's`ޒqW[߹hAh۵_#uί |8ww}ZrSz&} vQgh7}%q,~jXeLIjG?5QD~ҥMltZ~|+Xh&?6^yub_8Ir,‹q/ #4;"KĶa_cIc^t _ղ-/2R~yQ/xoEhݥѲ_x&NgR_,|킐LmyG<j>R2[ײ(IGRXУ^%gFoڄ/U,YGGW4e'sT^)%؄gc{IHVi칲5h]8`GOKob-w$LhyΔkgZ*- ,;tI V,K;*ٳ&5L Z7Y9{> A Ov"bؿ^#"?Jy|O=1>̅C{ ‡Ԥ6z<ДZkϗf'5Op_s_4.؄k2x(m^ N|\mkkd4M<.׮XV9.-:bgesGQO?7>wi қ1vMfcc^O|9n3|d2$k 4DYӓ1^y1$S/I_FЭ+آXg: -CLJvi-;|~Ds˷qe|ȒΎcO tV^PUXۭ Ý=u2z'Hk^= V, k::޾u3PS;w$Y-+*F~[:?o "$QBjʑg~* Ty*F|N`zӶ2EhzhAxy5HouZɴ:3eX82lZ<yEs:B-eEĢ脸&4wz|AOiJ퓶4+=7OzUP鍴Ғ^᲻AN汛3H7+iʮd'q5gh6;#-:vf$&4;{W$eAzGuJd_.~uWf|<lz§#dbmJAʅL;ƽ[3}9'ɴ+% ޹GUcTŎكy2m4fu%J{/lm{e T,фOЫUK,]RjtE)7Zrg'=i.A*#jI_5N{}r lhŒ-b=ZDEYaFd>`%ڤoI`;0vy{\^m5%0R B7Po2'T\ن1'}5%뾽$nJ;, |i(I=MT؟5J ?AO W$_Q孑./-Y1Or|,T2R9J)5e\,}ymE]=~Q[&ZQ~"d}3Գ_2]-;m&d.e_(BV=xg3g:WVm%bWK&-x͝ƒ՛)%?gYo)eb5^6tD :sVT%yw?J"\{"{׼v޳ݖ-SjcvyG.GTEjCP>VB)=~3W4/r\W2Uzjos.yhבBmMhڃe7*&zon&p{%1k֋9 ȸg0UJh3lxw $r WS:Orl}>\j@o (M`gŚ7TFo8/Z>w{Zۯ8Aȭ5kVkkwW^'_al_"m1#k})I_ݓl{X zZyZq:.5myo{:5v`otIQdynYim!:+fo7'xFN1I|!4cβvj=39dozw9콨]dt5̽ЙRѯ̞21,\1KFϮL7[&X}h͖w^#X|DAfQ?*K+[V;c3t,lcmѶ=_fXqE7v^ #;bK}Ʋ|ɪck͙_L^zwl-KMYxsg0yɪ[[Źӊ]3-S3}̥3jOw ' ݤQ|oYӫ$c/s=K;Ўo?eHmt26z>5Y_zF f_kovzDۭx[D-4ZHJbŊʞ[N86MҼRʇ  5^}[x'/!K&d5ExV4sc $YJd% hMAJ~e-}!{jue]MZvKUMlrVN"gZVk{oNBwG7ȡT?گt_j뙛&};똋xH^jqgj%?~F R=j |y B37a}/|mj<Ɖ_^NV]26&I}25=.hJ`0}\xI~ӲX^m@3['$G9V5ք-#K&Z%IuhϴSx`b5쌊&,ɫެdo*xKZ"{6לl=jR+!yYCV97,"%Rc=j;&&Udi,V%L&ddkH\m"XUMz*$& =>CN=U;k\QɴM{"=V31Vwho*GAw&Oƹ8LW''3]Tόǚ>sVg&V'd%w[$;kaZW4W"%뾚]_5Ɏm^IZ\elL=4=?_ծ[Ǔk'lj]s#]6/6a ~KH=o=~jI3Mh;j_OoW Rgb*n{k(bYMֻ8 {K%OI인<=RҌh~M*ydf>qk}E'W&aL;%I7ʋεL/2G׬M))x9xk\wreϻNhYZԫVid[$Huӥ՚-aW~$,X j&^+t{cXQɲk^Ffg'$+wc +\:{R"kޱ&$Il l"rqx "E;7ɶ52ޔs/.杅&4Պ(/2xR= 3I>Y-/8 ; u2 $X6ҩzz+3[j[2{.!*zf7)XPd4 6_(d"tPDTlY'ou x"o[%cLXadkѶ_j$=òOe&r,MIМɺ`=RnuΠL֯hAx3 Xs;AX>=6zWg~2>wS2ջvyMlWʎ9ꟘWcIx|ϋJ&ޑJ2>ūFg_3ҵ#CƷ~Y׃|CΊZ\r{zd=t6HW9r'~Otמ2JZeY=V~Dou 2m:WaP5+85ew$vI_#CI ywtWkDžM~7o<=}Mwϝs#c >NݪNJD崌W5uY<*2әeФ{(t0m8T2Oy|&HOoRפOdK5=7IoJFJi*׀ZkϯS#ejD of DdI4N#q7~jQV4QA^삓,b`֧t0^ꬼd{i&{?Uƚ"O^Wx Lz{ɺ.bYL,:X-UtB>ݺ-eֽkt2S_(VkE+g,}j?ʾ/?7hyg _o=Rd=]+7'W >YO<ՄLYMwc%ʣzs{(&3M.ғb]-{۱dӚSp&G)W=&cܝW3I' w݊F7Io}o*iY;I7s^A#:v(KU2^F Ļ5xyXƃ?{6MMX.Ț_mɼ3ު&<5ҦͲ~wK%SezAYMԇ3\cjhlyzl-ӞaZKS/xwpen3%kfW5=mkK}y"<ʤF k_k"=7%S#DWIVf]EL3=Ț " vj]~Y,sn~ 5vF8?"g[SJH*&ho4ZbW%>mq^ ~"#d4-.M5V4SߟL}?EJ'Aiihd%묍dSKM["ۺ'xe5t?󶝙7ʽ(ެ<&Qںd=,_(H+/O%xw=>([iߪ ͳz؂JdM|*W %ѽN Ita_hkZdZY=ݽGYRcSɪک~q㌅"<5"-TԛؖDe0/FԮ1k{}Mq#1ߦվI$$YQwHhJQRs=`,z">U%aR^[g %˼#) heh< %͸#d5ʬْUV:Hr]8\y/{gEEDOǒZV\5aU더۪Hr!Y"Rd,\}8vbKRKy W;iR}zw\5fVdWz* U,O1ҚMvDoEc*dԿfNΊH݄fNUW_iNɖO~KuE-{0x Ͱ|Pۣ&K=o )2N_#{V(ey `Mq=ۓ{;l ttH{d&] ˚߽~*3) ~&$7D=]?"}k2 ۢ.T:28?^w ^u_:H2uDDZ uz&<ͮ 7/ZVu]MѥeZ&̢UKJ_ZTxWS$c3v?ejvF,fŠgI&{|*N2E-FTC[I3oQdOƃޟKg\uEtt~KWD .;3fh_f2:LR_)FDO_2﹕V(YJ'p~UOqzm.ގ=弗"5e!hYԼ\ք"ΒwNijR]uug B_E0$A}UAj^\31^u Z=UJlTjkK?]1]WVbYmYZwjYSZ& 9Xpw_~jN;lޚЯ[dՒ4Q|.%s5b/ķ+ Z}+/X_M5zbd)XuL>3cs/ 43 1wz5>X=/>?6$~edb34ROM[^+S -Zl' ΁W_(>q5HoKGr4ysY36`< ʻ`9ID|'+җz%[# 8TBוss=yh1:?)^R>|}5Vy mқlUmc ^:X%wnj] ғO1<9Yگ[O߫:wMU,YqsA~hՃ6I_|n-2>uھ?y zcͧ,gŷ\ODɃ*"fic%P +Lk\e!Ѥr"H_N9DE=ׄnޮJ۶x;qSx{C hw.7"ʼFL杴Se<⹱@^ɷެ w^qqTsjc!#,ν(ߺW 8RcMT葬tC{wߒ)>'dF˼>E0b@Xytv= nJR xWЫyj bS]+hIxyw:+V#Mx1O ugN^M4a/j%cJd̬kE =Mif\2cx:Z׃t Un+RMg[ICS)*2&ӊV]I8ezy &;djDQHu)AXէkHW~v51m ]cKl9A47`&:]7(RymRK|&h"L^^x~dJ=vNl^IhK$ :G99ϒe[KV=Orر) ŒFn{M Y\n?c0I\5XW Ft?&~t_U%DZ5r9:>ךRҺZ ]eq&w,MFK//;3kYe%eg]\d,ʞY{&"M ]j5f@{d[ ۜFfH>#y2zr붜Z{ƒ4;ў<;Hc%{tsԞ%ם_zV\RZ֗hI Rң nL bWsGвp<Ϩ-"Ek @9f2u+YeJ= A*ò;e_>M>myk胯Qst$]Yjʓr*>yN+dzpijch%Cͻhgz"&J$]]}W'W "r87V_ߞЀw+pEI 8'wi&/~훓_y׸u\QKՂT$яqojqIG`|؈m`t6ÉԤ !RQg>=Y8rٓ&}aǿ y&z-Zg6qM[aEj|&8nZ>wdt=*jJɟzg.xZy "ljŔ?hĢ{yuJefWֲtv:ֿlc +oN?-(_'KXL3jYW(_ >sdx9$_뮝e˝mιExO emQED^/;=5y.'Ѯw`}>d<AX !mW;Eۮ*WDywe5ƽ#Pٻ8W#e5@Yռ]I5JjVp6vzoJ}uS涴e;rߑ۾sVT7I3y.lul\}H-mAJi=OS^Ӵzn-{_I*'ܚc쿓 E-^iԄp ՄF*{e_?U냉t>նo# oҨ>"vAS휷u]i/e^V8Y_JKd ]{h͂&}+Za2V X`nY%rҪ7Oʪk &?|뻜 =]s0VQDTWuNz)29:'Y="ϰe HoQl`Nx?=*D{KƖixEq"zf{Ldy%Q p =]d. ݿF5>Zz2Z/YoN Q-d$ĻS;iZWGT'0[q,o*Yф)~.ED5X'6g;u0r딕]edkiš)U`4w&3G l_fy z蓵eb S6rVA,U˷sY&&4ZUAM?٤'?9d,d^gK5|`Ӱ'^S+Xj-ɪScdhMIj-Phn_"J[Hzr0(+ڼVK6aˮ(Q>ã_ggGi.£Z%4l+O|kZ\~y@~I-]!Z~IēwdǤ?JP~$HyNi(=^yooIYgQl ?`zۙ7H-x/+jY_ZA{rV[VUdBZܩ-Wy7- Y:-HdO u9Ey&YԽ22ֿ昝֤_X{?T nҽҴ' ;C$Y'lW]I*md=NьʷHOWmeZoQ.̖9߱H-XljUi.N[FOZ2z{`Ho=N/E$7_2Mz;l4#34I5 $MggM,MkTB*=]y3M-l=Og 4_j2mWkOveqΰg2Bv;>H}< ڝNs%V[6;hږ5נ=ce+E7ޣʽewwTj&t[aZI`c:U1doOsM]ʮrHJrW'R]V U'4?}|g|szZ֚yk _~%d}{/{7$Z} ]%^"Hsi[Lkנ&5:ORUٵ LN %㧖oj23AK(kR+|BK}>a(/ f%?8'9Ҕ+1WBoT^N:ED 23E/[>x[&MWC ?}59X 8+H5?XK.YYfJR@&eϰMDa2V\㹳 Փ>lwh|pyM=v-T׭n49b>`;*уm Gr 3g"he6 %MqJ+7VL?IX9syVl. |8WDzfoғyI\}|=X̚aV@MbLƋ˽΂{^E67lS§s}k[cˢFoZ=<5󒨽&?vI^UD湏&| q0^)Ѿp2}gmcؕ2}v v o$kpyI6GA&늩) W9yMsnKBx}Hu힜vnHTor|'"׈xi4ơ^$O\-jrKo\=xX?m&^?2<%XSY }Җi]=l{AXz0I6dpY>'[d4eֲ4[&4["{KM-U#Ql&Ax6R47dY_}Bf?{]+3Ax=#\~SWZVm1ƜDjz蚰pg\ oOOV#>w-YO|&{,;/PfZhvcIj!븼˟x^KSwj"㷃Zڭe14OmZ:k ^{3ݞՁz8vgR4 k·a=?=~-=ݵ2+ӽ oָ},~S43즽>&x)YKJ ?u) NC9'EsE4wQk+Jb+-rFoWڲJ#W'ac~R`Y7}hhQ:dKVxǎUڷ{+,d}o3Hy1!jғWߡV$} Y65.`YuӬ>ɾ0iơ+".wt}f`⨣޺dE.͘HIڮ<`,X<=`VW]ZdTT}[[\dU=3y01wyu'˞iOiX_,J;K%>KV=[&ɒ̸x)'vfF<s'u^sV+e+t~^_L/-e?dMTw ?`[,!#E_RuBr~G #X>3TjpѲUrAԇFc4aÛI[QgA?5ZdYW1=վx16;y)#D9b_j%7ȏh›YT̢:Opy|5'C{񠉊\Ɏ~“dm#W`,yY5A"֮!@[Vi|Z×0OUS{ɲ.+C:39Hߧf[VY,?#v.6魼Fdd=sk) tjmD ':t痿/XeYXV yZC$p_ժJȎle^}XsϾ/ E'qoP[V+DY瘦4WƮPAx#c~2}t}u9U%cuX~w;sRL:# kyUޱjc_-ۨ&¾=kO=w0ݧ)L)`{?5a\}#*e{׋1 6ic]+YoCyM#w/jlMrhΚuQ*W U_q<)XE-v4{<&{F6zk3dX7Yuu6LܮXlTDV\%7U~2eL/hLlUd,zgD ӳ*&lw/BӽB"/{="{^'_Z̚ųUr!S+S`z 3r̰+%S`E+;ŻO$ӏ%״Ɋ JV/ljIz-Qn+Ax m9W/=#[rʖr&,s,{X'7+óeˮFSL87E@u 3b$\y*YnL_1߁I[d= {WTkÈvd٥kxd5Zġs݇KOYnI5RpѦ/x   V<`=<zokMZw :NXM)Wz[&gwNH֯8wLM{LjmjK0Yet0{" iFNDp?GZ }f-e<`<"c2~ڍ=[}eWG7ђKһjt`")JjT{h}I+ ғ XPe[X%9*džMX^  `o"%s+n`>dt5z`XEhvZlYrYV~oEx~0z~FiZvS'ti2#=7#LsMĥ e_l74DMҺ5o1qd@l6,E-A:Fɬ߹7ϊ|YNm&S)>d _^yfЋ}dՄFKHV$yL/x%:^`^*/i /hjE=WM*:vFc ǩ?_%a%)w2uckAvZ?#EZ³xw=/ UYhB;(ŚpF$<<刌 ]3U ށu/QFGjO$6ui|ٲ9;g|uJߣdڵ?(]+Y-\3Zii-ӕY%2̙}<(ݷ7H}ʲ3X 4zl?>GۤV]Cԫޯ:׫e4Wa=P>K=k Vh7VZɌBh{MF8J6)ROZo}ݧ>CtIɺrWAcG#jrJMӭKt,Wwk&Ӛe~熗V4]7eŪwbe$n=JZ{/jsJ&z+O嚭pTc_60H;ǀJVy*L|8mVa>9Ž$ڄZҝ%SOMꎾ/h(e:xV9{ zJ`/Z>s-n=u'$H.?:AG륛t/ںӲݾFxX&Y;$I[$]$#S2>=z`էrz-ϠJ\iװA' &R| 1Б}juR-4Y߬]B ?rj{(^{dbpnec5>kM6YuUgz[#-|o:9.wY hY}ѵ$z&AHV`{`|~1\9/cSH43nReuMb_kK}ؕȲ~OQ߲|.ɶTeVKIĒVM6|&5SѲtmͭ5iD\X/4Ü>V/+$ogQhAV4޾IZEgM}σޛsъ@j`} &=]`w_ʞ4#V]2t=dfNj21-l}L43X9w?;'P6?/`ޡdi3bAKK~yL7Y9$m'HW A4]9Ҋ%SN:јRl»䳐$40gy>$y6V"SUV|,(k .7EpMֻNi+֦xR5/gh 4yfɾ,XcMIJY%/#e/;YqJB|z\$˳~ J=)U69ZS$se444Fptz.DAĮQX4Q%'MrBƺ1"Ō]g1VZq&ed?O{A6zE2:ٶZZCꑚ3H_?q!_&)H:voB) Lz YVBJ4+kG$Ms%Y`{_OR o:[聵~.wmɪ,X',n+Q(DVxv>کIok-hOP&{E-~[p%K7q˲ZYMc̲Uf;  Рj2ljoA4Egm2~Mk2' |Bq3lcV!W 5?'P#-^ϺV2a=ﰞw oDu&v â~QV=ʴ{W'5ڳ7n}gɔ8I9&vwɞzJ2ͳeG]3q_LR=jyj]OtU/o^vӳB9ғ_*ʡ 6zmԞf8Y:">r"{wX&yodU*Y xDx0ߏ|K={ ǽ[u^bG,t%co:(²;Whц"MzLѫ_ uMx֬#q>$]1j5YPGeU;?d ?X.kMX\#'sPϲk_h'b+.{؄^7Ԛ&,Y-dEjqĄ$ʄu BEN#I2}!7yEFEz33JAz[#,KEղGf1IL&qʋZ>o5p*E6Z2}Y MQ%Z`Yȧn4eKf0bYW&v|g:xEҢ}['YowswՌTI~'o^Ɠ>oIR{Ú{BV?O^x쒱[T.Qi <5CHڴdVdzVh Sɴk G2vnYߒfkU󚃩zLB[{7dޙdi.H;g߄zF >X =X.{+-ymyך1^fӴL]Ϣ߫HH/c[:/ǕqoE؅W "^PqaɴuHJďhҷzcdݺ-iyt`<̜XDyK+X"u/R7ZiF|]-&6lx̹>lB#>ĖeJYmB ME&> ohC"YDxOJ>Bc$X+L^g}ۨkd|^S2ߋF#Q}ҝEjSKaYd,,3.uBZz_Y=qޖv .#zy^A{=קa5-y̦}h|&}թU,^x{](Y|iRIzU)L;ݲJOyFѾ,}׺s\ VQbҳw I}L?|Zl}DKL[|61X%yOof0e}o$ͬ2ld%~}ƁtN\i#Ռ7q_Oռd$ϐ/Sku'gfɁ_݄v.el7w\ڋH%sƪ@xʽrd<1D 3SڣIkw]ݤ{?mۤl9VI4QW$rj|/w׈N[p(RY+q&]gyMXay&=圯$zgKy>LlL[S|<]H2v}DR7L+]ҞX5F N妈ۥVշ^Dc%JUpY&S7ѢEX5 ;kZTD+qN$뻙wkv6wYЖMz#>Z&ޭ 9W=Gنf;)ݱ25cHO{YbOhphm^MF,1D4Oh9kdguOt@k%lMC'P'Mj=xMiM蝣fZsz d|3t\5ؾKx5DpouʷI ~jisdŋ芈 (&]eXӽ>d'R ۫]!06T)e^u_QO;~',f8 DJ#,kBʌߋe/>;k?Xo\WMhjhExc%δ:5M23ծ[Q2-w &RMk&YPdvxc{KQhX |yQoh^aL.%lbVb&-ڎl}_z筭QɎy{9Έ:3w@ )|9U /W`\tG2:_̑/>^tgE_8s'^^ZvEkR=}|x2"CF2(yUG)L-8XmU9*Wّ3> d"vkd~rp,]M\V(Yzd5XU:\^2 [D ?h=_6̳uu-a>iJ^|v碓}K1˴w&tКdi5ƖmzV3T{kfs ,h=ҷ B;Ξ%˻`/27w䜬7md=c9Vxg33y}i&~ %{w2Hm>ɝ<U Vȑ l)#d}k.!rxƺI-lw05x;*(r0vOMk~v~ݚo;2o -DI2fQ2_92:VV4^|.򢬃-|l@i>NVIo`t^Y,Ӛ{zɺ{+յ/-ֲJoA1H} eu&ztd~sJL3x+["{q'םk\tyuF'6W ?=]XVX5EzC,w)Y=jdw6=$j{i11ogޖweA*e'T|" :^q5HeRsWk@WJ֕W2-} Yftu{􍬯/!yx1c3Aiɲ2_]s5Y>IW#}O waތ VM.mAwޘu2keVXug1 f[d5N#;фz{S?n%;-fňT/JӲtwhldO]2 Rx*M&"/ϞED9#roMkR,+2瑾OQGGAb75NoRlQ&4& y齙w/oXRzΩUO?!yx+YM=MDt1YQM_ "ZJ*{"3?[Y2^WK"6fl}x˭eͲlY;eP,\h&ҶɮHK\%a]Ry 0ZYAx }Bhc`գbtocaAsXnoJ/NT?.Y}M\:3]CfSQQ,+Z_4HVqeSU%czMت'o_L?['KVܭBW&ɵD4MЬԬʤ8Dk[UHkUFÿ ЩVW$ȃE]UG3+ 8A=Ammg'N}3I7?4.o{ vWiњ+du-a.gږO:^_"gy.7N*" %VYߦ精 zZ斑g5s+KRY^Qg.I:v =ST"^a"{ށLir{S2e.KO̽Kg{g&qo>6#&Axcoɲ,ڻ3`T knc E 4g>9o;Q{jneՙ }|j ~s*;{4MQ֞Md}wp)d1EXm'TD& "f܃Z^ȜHd'&,#MJ7ޚ ݤ9߶߲ww؆ Y5Eao*_=?ЫG6dJRfle =z3#93fcQ0m&G7z~v rL=-YuyZsڄ-j+qXž`S:dԜI^V؄i"C[E=̑]25lR/ǧE4%T{K5YeSmwG2:OOˌ"w'|[oZw4k6:,'FޥJV shL O ,i RI]뷯WZ2-37's'\eK1<>5X^{-93Gږb "ZV_x\#V. 9rƞ%ۭRV4%ʧ,'[MGG. ;S+YKH5ٳNm/9O],ݔj5p=u63?5u&GhW$"je=uWyHv\c6&axߠ<ܭ㬽e ւjRKg7َ>bnҾrO$J'>locWk|=d"-ZY-{$ěQAX 4X]kYMe[^W4#DUw7DT$~Lho‹< ՃV곖WlMyF jV:y!-u_`++Ev{^OLϼ[S&W?s>V6VoUoB#M0He :r O["{[9YWdgu弈"10"U~h)mmy~{P9OE3-VU ys>~f0`HkTCȼ>j§Yc Z`YK&zWu})ꙂM ϓW#Ƴ/¿x2lqp_K;xߚUvh*HurjJWYFv{ڪvb*"zLY^7g"WCm51kD:ilC `#&|4`~vLɺow躉E:OƟmZ+$k\}$E+W3_{ءGxnxOa|ں&=ȫ5&2̬U$s~uAMƭo۶Z YgMz24.^xѺlUAhwY>RhyTʹ)"?v*Ri,xgO{C/o}>UDrg+k/ hU2OVcGq2ohV13D 8W j4Ia+{^|U`z۝1YVjzC_'~O4wVsyMjLT*בY1K>&bk`"1."b}GQ+c&~w}"|˺r%c5&I'I;nLVomZg4aw;?KFB^w$Ϥڄu:ݒ|#2M*Ijv]Zg-nt{ /|F?7lF }&+_c(RX[U\ßѴg OP' ~7WHғ`{$gh~ׅ C/Y_=Ӡ#IYNVγ{Mskvz,Yf}${TSSyյk693۴&4;ngnTWV܄Veşϼ29rɈ`0V|'7Gޢ߃ɔ1;P /ϷVI&oѓfck'MT?KFS({g%gdEٚAZ,p^Ax{ROwS.B<a}Qyi4+##w.z5n3=:eY,m9c6CAaɛ)2I)Jg߽ۤm'[ƫu&V~m>ˋeΘC &"]I_dMh/X^mYf)b: /5 +  sزk5ͲG BH+4^E!v?3ʘJ ZV_ly}s5y7d=y->j:Acym\B;K]-SFԬfȻYQVQ:ef"zUɴ"ZCg"$}zW0=;>YwCt V'=x[ DGYUd=j._b>g.!(nK%w6(D~Yi47k=mx 9<[uH.uIRRC5Q7c^dݖ!I6G]Zz|L[v{x=LxD^M•/_ Ts2:LViUuel0~6G>GshיUzYuQxLg/<_-qVwi*o%_W9`^94q_L 80z?p++۰EH5d/p++ |_*R߳~<#'chӌЃr~@=#crɝO&_kq`wcd}]Dse{ Ɗ ztϱ)h/YWK3ɲL,ssMڧZKDv* iISg,eYyW Mfc ªΙ"t<d-25LE)krl%D>H\mBgv{6j}%sWƕF܃ԾzݫY&z7$׈<,"FeWG}PLDu9 tOѨ Z-LlQkgZv2Wٹ& 7p[$]7lW^G:^ɪ _ʹZ^o9:7< |XDljE^) |6a׀Vd< fy+{V)"5Z>+q_^f;]* _Y9Eq6$ބyۄgwIJ?9gƩ[>!qcUrDn5܄{IZFDZ ®"۪!M7zS2:L&!X$͠q7anru,R?flvhmBυ9slk7]A͵Ty%MV.Eϖu9IJlػΛk, W2^tGhϫu\ӜȴF횻exז$.jTg6MbkLmAXs&eˑs_? ]%wq`Gx Y ӵS%/zC~wm2 MQp\Z"_9R ҽh YDVx=5Z<ڶ5)}oBa(/g +K_z#F! kr.&l+k06x!Le"F%jr#)Y㝻mwB>w< w./^EUy_[M2~c>*;Y\=ܿf%neMJF =΂ma@w~KmJ\і5߲,ʤYcZ Im9 Y`~BޏvXd*^2:B[=(2X&\=v<'羏A&?agF zv( zs21YT&W[H9w+J[y{uIJ%WVO9M뿞<:*;X&(Ovoai$:UejL"'G%[=[u>]׈ e-!nQR'')D&}G Q7ט`3LXkP=^5EAg&1`tovW݄yEēCgT] YHDkM8QYyc`/cm2wKcجQ[Ƃnې`We<4ai#$xXLq̠ ?Պ?xSEhXt@2V APҿ^12~-;2[;TDm=6i&Q3NLGָ:52=QW2-aiZSd\ֻdzQJc۱,ߩ ` 7-/~~OяL_94X}3wՙzcyIzCna zFsJ_(Q=u}W_ ~uDnI7NA3=ݒU ZѤ7;z/*vBmpH>H_7~xF¶l L핿lOWtusފWknN,ɜi4^݄:ZX܇$HWWb7AddG%cL5z< /೴|dbճ +t BoŪ$ybK+ N+kloh-ߌ;i9}v͘J1bǷIhkodqtmFCbɔj>ck4g-&kT7|15ѹDMXgZ z0%S_Ml6"3($K&=& ˴`d6Hڥފӹp қLuhփ)4S9`8s~o,YZmߧ}&=+51CPSzgWxg㤼YssEX,p3(}P2e2&˗TР&9n:}~iNϴdAh3\4ccĪh·vw ؄?][Mg^}@;E*Ql Ye`_ mB>{FifYR>kdl'J"{ӡl ;=dZyk\ґ|8vK~5t72Ugzˮ"S[elY^@3Nlz~i"i3j_@ư׸5~lM򨜩e+1q`jorܻeGٔOǓcu*sس0LhZ[h賃iqqx=ֿI詎ZKhϋ(k89ͳ U>UJ̞AN˘%x&HzDMVo7P.Om\ɹLm63>#[DXzO9'zϠy}nt56, 6wlWA9G=HWk4'cu>,6<p|g ܷwyl&=Y{ 3_ko+3xФH sk&, ډ^v 2_}E*{`FULMLջyLHZn-Z[PvVueeN+/D/5rpg3ry0(ݤ{_{G,]iƯT>>6/jjykn;㤿|jc? Wޏe"o$NBV)zσW^Υ."tX5?8s a,`9ɔFlHһ*ǒILw۩$*} =Q^Gʒ)wX cPH~J:4m^~N^W7Ԧle,*/gL]92{M+6ѣr_%=\Nי->]3QXt(BmQ'Ak<=bM؋cԍ1 ;TI & ~:F2Wp~GuByqzj> ƚA\amT3 tcMwŭ-S"[F7Ңk>iE O HcZ{2W<,S^K}c$&܆-vLtI{$Uե=oIO}.ٿS3ʒg,Yu0V.N+1>qgl"YV\m韲F%cS[Z)0IιK0HR+_IH^j#vg# }o}j֏$u1k]9%j5z&[;Oqk&=U5 ߡyξXy߁}뭙wLSm-.C($*_ϼC䭫Jc&lAY2zYE\%kPoIdUZ+Bk zjdzp;DΙEW?gE>^{vjⷷj%Dv0 k4vlFLt:[`jb=$',.y"4'djRsAUȔG]X[NL Y&8k@| Mymy6RjZ;vI$g4}R RD+KjYߪ=Ľ. ?2IzgnD끒t;5;~ti϶n>G,t> 'o⹢8в~Cb6v=v=ϙUL6q)o7Ķ59XP'_,+S2 $'A+-Y}I`r[fzYp&|V(?X(a o'׍wϖGw{"=wnDzҒGul3xǵfA_xͳ)R;Q^%FZšA&1xaι AiYS[j\H97ՎYʹRv)* od]%2dO>s_gؕ'k gxɰ,{YܷE\ײ;$ciȎlV8ܷ϶&IEn-㡞|&&L"س|+8e|Yh%z`Ն׌{n}?7bN2MO[$"s#J&%gG[$}y:2629ƈ&tU]q=H{Mg%]-7<3Tݣk)N5nhI}9^QUFKA *"r6YܭTI7ڧnR>4o:`f1UY}Z^zoC%y!بR~W[+~Iq/gf<ˮ[FÑk"*SX'@5Ǖ6KRkNN1A[+Bzk`nm~ݮYxW٨;X漅6>ђtUlzt.vnnu1#"؄ߥS~)˦__ujSPQǃx"7-+/x!J|e*U>e5v ®Ǖ,|":gaЖ2W0H:[RY&Zj䘇oq,JAYrP} B&f3w2&8n`~73O"<{ce.6Y ]&+| seg:K杉d7WZ)O?*j(0wkqĐs%H@Lp*S3[=&鿨wҰ҂E+¾Yʺp=II:!HؠLT4֨3徭5ۧ$^{kۄΊYIxr{qg5^ew)yKVDsVȧ;F[F߼SˣU Ex>.kVq`{bJVKzܲZZjzGDAXfx*钩>dxL KT&Q GF nj"Z8ǩXD{-SZj1ga/X%9<ZFoþMnWL]dzuY̌tNjqk 51kX eSdݳna&e, xL[w~ez_I+EZ!qy^WHg֘'v?N^'֗fxߒs%[#i"Ye559+R.dhQñb<"?1j;h}w`n YM-{sA V }F6&ih;|qWo = _xlqYqNP2ڋ`kdҤ85{zeGHxGW*+-kd.遲NNn/nmDOOd4< WYdLj_giU/2%&}7u?:YJV|UMh\'[ݏdѻ4ݖD,7(㪒H,)c2ʒUJE0 \ohx zVpW~eJ-[59f D1uZmkֲyL12Xg 9Gb>3E{2؁'yd_Z==H- Fi)4b&"=~7h]=&~=9o%IxtnԏK}3/{s~A?gd6{"dzE܄n>AgcI[֚QJN1a[y7W˫)I JGgϘ:{ `ٷI~yysa޻zK#M: };>EږNxu`ϒc."&k$7?ˮ̓G/oZvK#p6c-z?GD_ U{Z^`{d`5%q:,S['|-޷ he>{-ShYA5wMu-}ʊu]te:BB0wsz,H[75M;I6ueYVMvriӺO5v<;:u7eW҄ɺw坮>Jow?/~~`d4N㝚t&lmMh;F?H֛i_Z1T4m`E8eL/1Lvi/:e/ۄ2ruXW){פG/[ 󭔏HMLTZ~jO;Duutsm`&ݿѱ_h gX2h\^|6Xa*Z+Y1'[0n%dMxOdc6i~{N+KQ.s0ib2-mk&KAv//hEM+ۥ5Mxfe]y劋 =U;z- Q9MD.o#Ex_{y&%oU3;HO ;* +4BZ9<^KڌGGp"AW3yx<"t_<=So&]ujmRzMoWd9䜣lR֚d9/=/jϪI嶡g&!yKƬ6x;=dd뻎d1ZCL 0Nۄ/o,Y-FޜiE?./Wj>&oM8*5Ƴk f,D`Q%hx.񟵧knz˶G Vڛ(M9g Wd䑖d\1&6>G[ֈ9FDj,Ii| kr(26#2>+ڲb+ezfDlx)aLK7-|W,$ûOlғ#/HwyV;b:<2hM-wi_w7~G&ӻpoғw<|zje<9׫ cF2>Y#vsX[ao#He_%7z׀ӻm"> Č"ZlKZwѸxaڧI:}=M~{Ɏ~"hǯ[wgO9X&vpJ'5a~H=S-J3#+Y"gEv դٯ(1l2{oꑒ֙V;FoFcUd>i^ӛZ "Uza}qWu0ޣFWxwYbh]<"v%<`UZjO~'[Kc =9k_[\k~72}bj8]5YO5s%i3ϿO+:{VeGR3Y-]v9 5` (-sT4яsI6QW 4 s"*~Y=0Z&:@u$IU,Ԥ_j1+YkwZV$mAe+ySm3|WS[IA*K$~ρUjŸݫwyI9"|i"Z|BKYF%d%>ɺU'ַ}ev%h&":OsgsZdf5V|$m &sxE*Wu͖'`>1HYy盃kwy!M~oLI:,zgحd.B<"פk{ZAy ~|e16ʍ]r|߇-VN3dwcW,cWf"݌+ڍQVYWoPfچS ݗL=7dۛUuSA\GBzA}~6{KD$HƢ,]E ޻fԄo$G27%Qj޻Le,MΞ7A*m ' d!r/Y7heDo%a4bX/Wnv|b"<#|&;YBgPM};|/9`SΧ4)g):hFituK21_$x$4E\%^U%S=dAY˞h}q`ji0M􅲓->Hg7{h}VSawl[Yo8HyZ@Du{D}n惨tqmW+)w%ɴP2=4`餻Ίhݳ Kn7VNI>D%~wjfzGfjj6qcYSmo#ZƲ?Qrh])ψL''QK zm~1EA\uz0O %; orT)BrnjiYo#NkE9Wl9zlsfj!Mhz1=oR&;Ԥ@;?PW7'hoW">f빫tsep豚ܤ'VUe}I~ޑ_b{ O5yn]xbCFg4zt]dO- xh'BpZso-/ e'-Fg,H_DYIjK+ s[O|.R{/,uN]ׂ=dG Y<+sw }^uNq5U0^uz.ٻ&{`q-3й[轠5 - wWަUKuyESe9wِlLyY)["J7e+ƪEi=1z2Lӄezg]"s3G iuxӗ혖ú8-|дug7ަfcaق5Ce]A&Z*e(0cB̙TAԎ||:=@:!tԺu2ODs9H|:+ME|mmve5&]ulE\go';VxTLnXqut$LWf& sK4czNoA#mm|"ldzک)Xmy${HAGDOAmHAD|5@a_n^ Itz oY0`n3Y5v7cTZZU&}kg1}$~{omAd&;:?z4"3#;$P mPAW&kmi[&Ukx7lz}`|U-缷 uڄ2~ ,}d'#F#!c|dik=WY򉑹p2>sD Bsc=&:Y3\7cG46ÄSMKF/׿|iߒy lg.K}wW2z2{٧>ΔYcaʘ7Nw-OreԻΡ&s ܱa0~Qڧd-e/Cͽ3.\X˺1̗<R$]cLy}o3*L[t>a;bO]EL_=Ciehq:x#&򴜠&k^^Z֤ W'?82+Ic|͐w3zc[~bd⊣B<,2cϫeu//NNYAJ Z5Q:C9q% &tWBZ㋬<Ӛ"U%㋑aϽZ(-L̲埕<,| ]e4Q-(OnG*+Giw Ue<ԷхXx&VT{j:o3Pf{WQs2w).dr,Z-EcZ=Q26o{,}1TA"fؐaٛxe529U2ڎY†xinfj-4lm`{ǭ9F]ߝU,S0߾Ov豮E#4|<"o?og; I?*!=˔~Q~κ츱4^|'J$D:H:jǏ;W7ZH{]B3dZ=`{*OɬKʮ\o5'Id45wGM_;{;fXLf0ķj}绕QڕS;\ d>mו3`!sFWѱ `=kkoS}w3SgW6_(B%;TWw/8{\)|+~wrGY݃{ݼٞՄjz-Sz) (-$JߵnwK'2w3Dvwi/[axLY2kqZ4Tj&}l+Zh0'WV] vkfa*u}CU 7?:ֿ~o:S'8GmNeljAB ɡ )Bo4MdFEҝ1!9CiǨYCXT}w4~mmM]Nܿ:$bU&ZQ=TڮߨV:Ňak &n/dQ5m>7ˎ2`FWsVp=o카M'lZLFnԣaz {{~.]ڦ?!XB'"K-чOEMս1>u_esMsBdĶe P+<{ݗ,+glWkV|.E%9Ŧxj«<הlX+ʵhlbK{1Q5:D"36WW\Ħw ƎsciDMnޞkLl.8:=wTF%S W`4#WSO;Ʀu򆵆|CGCЏ+Q^# ҝPJ܈LRs+l"J|VYDKߐ8Q=h%vEGHɴB Um53nƫwWLIk.FYiB<3nd.*E&Yk!=W.=e=5*-lyt}FDRFoZH,=On jܫv窽p*ƔM8FG)F^ ڮX;L!ewfU;Lyƪ3_#֗.i+0?5YT嵹Ju4g{բuu?TXM9bt2|sERěZև;!>cb(1cfʮ{ߏQg|ma .M_~hV ,whg 38S;ꗱT.pd"-Dp~̶qiħ8Wz]ۜ 6ѯ\}`#w)jIoXee f^0MQ#VC\S~H"HlT;qeKi,FZ+F|ƌ:adb*&C(z YaNa䥞em4hZǪoL^܊ҚTߦC{//'W QlG'-t7wOpx!C|-=|) js٘SGlN7|1;c-bΕj~.o{mhEdm&7^rx^#ZifАbۿڧ1*zު)u;+^?YA{kEfI;2ʸWSRQm`Z+'lg]p|E?B'C/&S6}kFם>+lRec;u2ED-u?Gd[6ھgѨZg2%/5kFVfW~/^#w0OԶ0sonfMj Lv?ڱ=*Ui&Y5EU9/F|Z='dVk{`&:J[#қk*5_U3"[֛i(cA7Lכcj^>}FhgG6, 깿~ו=(O;6G^e56џUׄug-&rSMfL YcDWx!iڷ{`>5|y`DT^~?FxVmʼn(Æ{kU61}MU֛:QDht!E χ6 VLeT1=Qau_13",3VCjvN>+w7V-:>]e ND3՛w} Fu{լjFR2;%R4W[lua#8Ux?wA6ܥf:6^|tޏA牜yfA8ݵ(dc397D$Aw;_Tq^HIYf=ˬnʶy d35)Z+f\kU`)QF1kJ1Ի. wcj֌g &nwZ\#?AƥC54D|xD ~l5ǷZSCQR6uN]MT'鯜_Mt&rb=7,I0ﭝ߹1z5gy1E҇9ZֶǙh:Pgb$-QtGUIUEkY9PLPZM6GAj7d"E49겢/dFUI;385o茲HٍeU65NqDYR׈VPZCMukv۴c/W`dq#{ Z)+׻;xE4~F}coOW %\.ʛT V}p>s6\[;2+vKs4X1H\} Oy 6R_̹{,ǚzPg5l"m؉_􈇶_ilG|V+ xxO99q-{1n(8+8B6YGgJNoU6UԻRG}9uyjT^e N\3DsfF̋䍌ivSյmZ;7 7SZ4Tu%4(upwuB5ϤT)=|u]tr"^^^IV؝vʁh|~sޭ~31vUw" gɘX##VJU2_L|#fMג>YbF9\}4T93B!!q!)ՋfrZlk4qL(%+.nOD W{GU0o _XT%m7/{FUFuY$w\#kOݬm>Eδ}qJh*C9:}:9 bFo6oH~#~)ÙYkO?6[^a ڨK(_dBh5!pԙ=v)1T̨[>Wꗕ³ybTy=jX(3l=Jg(rX0-ҟsk\ɳW$[e#=~*zġg7x?QjNؙJ[!W|r=I)G4nTQNq9CՅ82s_R:[m~QN4(5rgVTMn֬sc VD,n[ܭdO":Y8ks/"bvZSj=[0-l6m=MݹjG M+/x_?$Z_'x'g-w&Uu@i&um{cϳ~($|%ѺO6sg#|ъvݧDxl 6CDΞlD PTфW9ͧ־7{0WmqҥTW{o¬k:Z@׵jQ}}J+W5U)r{c'gg@QVieUfgK/]%Y셶|jυ6⡌ƹBzjt?ڹ6 qw{,ҽMuu}k십5qٽ6U֡qBlc?k}ժ'iCu\}_ʙȽȂ/n%c[S4i(JQ5 cSE睿Y%O5TW ujfgfۆxF\ZnD&;Q,f5Ԛϊl~ ڙl+Heו#D#|x4/6m78װrO &f/z@sgYmCnC'r9_hNbg"ʌM;[?fy\\> =\,j'=}5|9ZVZbSrݯ}ncBOmWS#X"7V;,w}ŻnhNƫeWޚs?, V[9T!\f׍*,j'vՈ|6D.s03I oDĽ zNY&8%gl]ƏFgmd}sv|- E411Yq6_ۼ=eco*R"Y'-^{h(m99lΡOuQyt*􁞛x!bq5go3{XcՋDDef;JebO!_݌L,:b f$&|6ywv3u{Ԟі?& ˡ/lb!bEGܿf.U%J0E||f;!9/[|QkD-ZpD-X޵α]1@yNkm'*A~+>Ss/w{{_4}sY;OӞxgj\Y,ԝZ }wDDs9)C5ц<^9_xik꡺ZA@u_cjFܯu_; cd>v'ӹ!X3(~ms%b!bKL6yxk|l_|FmϢXb|wΗ]:0:#"T8SV/(f(@9瑳+ܯdʺxWu(^we:>VlT-s˽3>HTnZ񉨼iӴ+#W/f*.8)w(" Y9E$8uy/ϑޜQQvɥKGԀdTTR!.quɫ̹'m^ﭞY񋟮{m'ɝWb`g NßֹU{!>U#MMPc Adfo|˽_ZG%0*3f8#}FOvfKd&s`~>X÷g眳a/~*|ҸЬ9>1V_ ٔ9 2 Ʒs׋EDKV[o^p_<$dn\0Ͽ klՌy=gjgD—ms?ĻSFDrKõ[JkLج;o Yc:%djt_YNugnGivO{m}F?rG1_kI|Qz#|wO6^V36Qo/!eeB2~kvj6Y eJsޜ6m(vz˷s%~qawZ-kVCQ nq<"}|.ҊRѤ3`T>4Z%r_nu Owo6,lm>U3S\rS99_|2l|?~?k&7M7y^yY^c~];Qc y}~l}Ht-Oׄ\h+;co)8{HKrkIJmg]zz__U۶[\k /oj5Ge%' }F*턷wi ts@{7Vgwq?5dy9jGyv\p\Gqti/-geݗ؉밓QfWc 6׵WH5EQ2燷K_NMtx-&nmB=WMB=jO؄?2 w{Ӽ L]aCp9m I+v2>[sg7᥮VtnDlz`jRl3_īMv]hڃ wwY݇wį;,/xG9M7+My#jmLsJn+ztO`R޳!Tr3X}m~C|eMGdMʃqqrg0Cd@GΔbHʽJTy&jHcK<3>mvm1;VM|?rF&mg&У?]P&*ߓpF+qo)eIG)/ &3 :G9+Aӿd2?'0-yӢEvlJp6}?r5O):s&Q>S9HS]Uq5C-m$?d{Տ6Ӕl U̐x8aϞڽ_$[{2#sϥ&!c?[hc:oe;#s:u=^;C}9g+gd+>`k6l⛞,m<Yx m0^qq4W'hPf6{5-`ͣɵXx0hF(m[;ߛ29.mTI Fu晀 <yL+Cy[꽳k3߰]ņyhd62?#|1gh~r%'NYcsϬmUHCds/#|g]JEFFΒ:=agKFc9M+R%7q'; i|y!c%y2/W{#7Hz+gh:'o?{I:2ήz3u+<;[}:Sҧ/8:C/!޹>;T*iTWw1ጦ ƗyvcT~LexfԑcEg OǸ=j$kgC7x?cuÙqDSў܇g~W>I^r^ ?<^~unb!]k)/8Urw Ewld _C-oj}F|lƙ'yjmt'42ELȥC( rgCڮيG#LvOW!kv/pO`>Ψ.W坬X="ew9l)Q!TXOT*܄_i=DtrJ ^T Gߌ^*<{3>&Jdv3kHu(lt.mu&oqıOm ~R۳`'"6mBg=bƧE?͐QW|B~] "qgy5Ɛ+™AM\u|Fߙ+CHewF)}֢CRɤx(gt_61˕y?v*ݬiz1B_C`ZIUjj"N ='|U־6uPp015w U,UoFoP/Qؿ8&|D{{;Quٔ;ħzd#T}Vδi[_* %Seu)Q*j3~=8sg*mygto渷3jΞCuuɵi|z5=t>q BMiWR?gb^_k;笐jbHڙy_ǗkD"s ?^"*A&g_eD&]Ì~)7Ѹq)*760dDmKe\Gq3 WxĈdk_Řu4U0ѩ$'sk6i9;u[(5Љ7/2Wity&ZzRzw5lY_FRiײӀ\*+giGĹӦ=UbD~Q]#ʜȘ7ic$HS]_ʇ~N(5+UR՜5i3/xEVн6TˇVƒKkNxwi02~O[̞Wx!fL"9cFz֯ۙЌ֨mdةjiv"qL6Q8~(h?B;] |\]5Թ9H+* pQ1Ɠt>;9s<~ē q=5l-mwDo,_ި Gҳ ҋnvᦕCZ\S3g12'M=׹Hz~V.X@f ƥK 9~FuUTh<֙e֨@[$_||P#33:J,7U頏wȶ6ɮ'='"d|]9[cTo\;F՗)A'|o _[06ly񒻗/3[F=_r~lOd+dS>w}h?Qe}C1;Q =sGsߒoWOt4Y3Z- >FdAX_LNфx=1ߤv4U;iG6^O~^9gzwԫ 5|G遱Iˉ? cݗy˼cZS1dPYإ:_eoN(/Zy3ujx!|ҹ:+P\r?'\#Mx"Jorc<:I6k&ږ_ju>mGrgUPDK;$%۶2Q-_~L=s ~ 9jlEM-'9݃rdilO)Owp=&[2h/cvr캷遲57^)l!k~*?$=vŽRq\.<@^;VtӄR_ݒۮ6~m"]>p'g|l2bL+#{XFm ٥m{g5k'6=BssNW碱^韎OYS+dޮVѶ]{R!#vArD`}l |g^bTs/>+xlŰ9gYhLr" Vq7e~V|M|3>]{:赛p³LPWh׫3kFן Z$w=B]M9DIܑcKJ:v5FhBsg0eDP2e D.p &>EOl!:S{9s.]ۨc%)uOp*Iѿ-'n=l"ˈll&yͷ{tw4B5T{Υa-S343 +|п|5w52>+'hZ1iB/jѶ\}#J͘x{O![|Tx_]^`(uzlS[b)1H:O ktYq>1_NFed&șX{O҄k|Ծz 8 1LL>}7ml!>ï_]r_Q}֑4D4ΛFG)=v=ԙY|M\st2*WԽ?{70ؼ {hzKb!4 CP!>15:.G1ƨ~qzheħθb?{{jU!.MjB|XRr++lshѷ2(*fiȵ0-lLS^vK#s߻H*ϡ5_/m֮ ](keVu?ɋhEC+MTֻ?՘FNm=N-٨P0gx4'timoaLyHO.Y'npC[w(nD#"iCDΔ17bW*-eHYRx㦺s䌪~;3~F=oaC}N6O=-: ڮ@}t(b[t$ۢ^;w #h j*,eZqѾmT^;HKkǐZW2 \JPz#WGAQMۡC6bc\NSǨQ5mD?/d I:Ê>ʈHჶ_>&2gxd wQseSYք۞~%fڛ|H)eO2n<}"VgIQQ\!k 5';[ԣΊCM_v\3 Fguyy^qտ ?AL<5cmئPW' \#9|s}[:i1i"3)O,Qm~z\u I-B׫!tZcqc3>I9D]F|ww7#S3Smkܷc'wcW?[Jl2 ݲiDvA5k_4s]FI5$%5ޯgZQ)F۸{J%rk2m22ξm~q|ᯚ2eqh6z'yRޯϴw(jlNFkYFIO,o\e˸`4>ׄmAvyc}x]Kn3؂=޹>k1xwc}T4jnpɲk5o2#މSUa5V([jկ{v?+Eljʼn4jfH1e2n&U1Υ\y#KqLl6JuEٛuJ3?[C~l##cj:DL{+N*\*Q#1DڂKi\ :::$ wF麥-uVϡ4鷷gNLF;P-W׍Qf(sG}h"6'`O\\qrѯ"1z~*gf<bYY'z6q˵w_MdǴrjߑ:>5\<~zyj#PT|soKnP5ř8g]/kF>5܉+JPhaəJY>OOBKםK?pÙ`9IZ]FP`U#~g ?q5ًk㐲(b};P+WQdRĩkN7qXk~Q{6Wh+]͌O]gwPg-T}lʳ5f 8qx̂_K;WӮ5N*]VȌ6;Qܩ=3DuXm,ډg-`"ؿlvнϣuvzz:)QF`ȸs+ZQҚ&TFt.^`۞hdZ_7y4.O*=)Z#[k_!C-_'#kh` #b=?nhbX1KgXQTlmN\wFr #L#cFz=2tq{Fۍs`::[V)&*jnN^_-ߙt%"z\wCR" ˡe~3ʪѮbeR՜ѭ7,2F^ޡ{U~\/V'F:khhz}O+ѻ!5cV9ѽkֶTz(Tс' &{Y;T}iϯPtm3U[T,=b06Q޷mƭhF*k.BI(zvњߩΨZt"rF\2*z6ުSŤ3G{ kFvoCdr&6jք'MynjR~ħ!p=s:ǴuV6lULTjW4ɚQݤ%tIY߷E%Z# W'>M"_aъzE1}&?߱ѝѐi1!,Z-]TkEL ca7 )FʯB3V9#Rci"Ldʞ{ܫ()h"beЪ:QImHSkF>=YQRzp#O%R2zYX+&Bǔ5$DZbSfg~::"1=gPڃkD6>"# Ǯ/^|mM蕧5NlD"۴'bWkWhS&1)uO: mZM[)!w;*҉&Ge~ '.#ECD[Ԁoz1@?iGVƣ.R$(ˌgyIΔ5W5kE2aS:#sA۴e4D6mR}&OkH };m؄hܻԤ RSZՄ2Ш̠6re?'?3C::Tvo}J-Hqlz04YX%{g켰z'lsE-M)͓M8B;&T *l"3YQ 5(՚Cd'\/1oC+e-ֻj/bENÈw4h9ny} eFь𷇵Z#Z۵d(Z#4hsO_,t4X*Mv_u^65v*J1;ߟ"OD˷N339N\c#R7iL=zFZlzg|z`z6]k#d3v]Ӎ͗~5ի7!n\lӮR(c#;c5bs E =KZkX_y{瞱1^N(aXv~ץyhӋ6\ߍHTgti׿h'Rj#Fa>Md;kY#*m"|_t}jm\=Jf2q:w-Vp>F7i Q'zvXdElz8wj{;c҆Pڃ 7gr۴ӼQթumJGhW䚞qgjCՂ<1;5olWqpt"5) ƴ̌ӳRccTIr/9/*脧ٻ=y{u,~(U ׿!+;t .㪭5Ȧ|싶.=F~_#1Wљ=(!Zev7՘I_no%6kǕ{ͥQuhDwo3mvRswrrpnSNčƝ(%L8Ѳs'Jrl#pK)!v]yM:lUw|"Ǣ-WuI9J2xSd.!U y,اʮ+z[I  ."QLƪ[NdSc-]zcEMdMhrFʋſ튿gG&cyz2JhCj3zJLΓ]W؄=Ȧ؊|9gIo~zVMjlZpe{w=?TU꬘y{7^ݣ饢|![cn&2X~gwZtƴo>cEn/Cܣ=DC##W#Kh9kz#ͥ5=H궷OD6w5V!V>Dڛ6m*#|RK8ވ3m{99ux'@3Y߼32M&su3›< :>hKigRK媜#ކzK,#-ɘO_ w2>[.jC_F}jljkwԸvmX"w nS7(slYh)eJV,FD(b[¯,W6]FsS蝫Jq2\ks}lOM=S\QKcy2q8T܅dتVw2窥+QQ!⺏װ!ڝwQ<7q8=>3.޺w<ֳSN Mݿ[Bl0#޺Ƭ^WYE߬Uml42:/C%sgz2wWJS7-Zl\-Z8Z+5S8#Z LQ5si^MK[Mی̫^+BMm7L9/sNO;]5x.G9%}֕*EzJU(&h359D˹-Q[0-21ZD==S )=u{B/C(1}6Biw[ye~ 3](Wۊ-8ywEN?eP05gmZFFLL}Mm?~Z{҈֜!j+6dznTyV-o#s#Ttu${^~{mkQrx-ERpg&j5gΩ/=Yyoaw}5wpwmfyu\A+Oўƈ7O:m'A\Tޭ׼1'W؞ży1w#<痞w7FSد4JTfL#?>;+;̬lJPИxyTeuL]jhD]:WVeS&jzE:Bim*ׯ?AcjRhϸ=,h_8$kh;x됴޺ϼ$Sk#]# 3KkiSs.V ԧ 4Xd__SO/uݙZǓV{gcS$&&,m'' kT#,J=ۮ6qBGpsÜy7mK97Wd)b.FӟXi7DXz3V KĉxzmrQ],Qc^3ҾG)M'M2'gˈZGY}jٵeJӳ=GN>&rhZJbD[N_(;#)9䃧8S"GY0TIYWF? 'R.=":Qm{oF^{˯nfm{hmNc~q.ނ̳'"o ƛoboRgOŲmFz[v+7ԝٓj歷Fm.!kW&Ǜ⩂ꌦ*QƟ:5ֹ*¯W3OlM|z:IQ㻃S g|y)ͯ=;< | o@Oht]%:+SLnKoVGv3x`JR2/?x?iku~}ƑL[oNj7yYf^b{!ZuBk^Ֆgc6uIkM=s{ڣ~ٽ[Y;{/6RR"~1Y<~spyjǧ{Ξo)ʷ;Y֎u=稜Hv>xYv =OuψY~8U7yK5 ugy+JvOvww<\jtG~gc)iR߿_?endstream endobj 6 0 obj 628110 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 10 0 obj <> endobj 11 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 12 0 obj <>stream xU TSG5"dh*(<\EʳQ@؝"D %#+'hѰΈXlMم9iתӧo/((HRmnFZj mku,Cj 244]avz*%5Uf3tٛU^KUf͠yؔ\ZMӥ 0Хa9ͲT튕1q;ˏa<7)L,3cUL(e0&1L4frƍa8f83qaF1AUd8f7sΆخao+M刪D]`IL$$5.+NJKғ >o[1<>Y`6[d]6-}{L]&tY5;5ߩ>ucOP<*IqT 悫ŕH;.1qc:m|Ŗv-oD؞<(F|uՎpnMV\~`O,p" Y{r%r3}8Xۊ>4Co0|A fF xq/ Fh!f͜$"Ač'HfA?j)*IQ xZln73EE K#9T\|vEEgU6O*<6NY]W?F!>Gp]jHtEnn׭͈_)A'E ?ܲerW<픥w^KmC@& ﲊpH qծ'":( V h @ص]V8:C<'%w.ExA;1Kp 84Ǚ *dG{qoy\rKor^ %$ࡔ.;"Bd[3?Wp"[ SvG4"^|&Qp7]} "LLTCHTo־NwďMl}?E/l% Aaur1׾\X>sCGو<,.{V_Υՙ-6_=/hYc'i  !xR̝c?@WkD@)-8Uh&22: N!>/U2d<Tz:B>4ׂ /$G%&/^XCI.ϭΝ"o+_-?'TEk*qShDIw\x&|! N%E6. n7!5DO7>FHBBB {D*MMТ hl ľ<=_pNڱ̞TQQЊ k|^\94 ȡy?pqeU$COv o5O!>stream Tue -Ju-l T30: 1:0:38::2 Tue -Ju-l T30: 1:0:38::2 gnuplot 4.6 patchlevel 0 data_trace.epsjpablognuplot plot endstream endobj 2 0 obj <>endobj xref 0 14 0000000000 65535 f 0000628427 00000 n 0000633541 00000 n 0000628368 00000 n 0000628217 00000 n 0000000015 00000 n 0000628195 00000 n 0000628492 00000 n 0000628593 00000 n 0000628992 00000 n 0000628533 00000 n 0000628563 00000 n 0000629330 00000 n 0000631960 00000 n trailer << /Size 14 /Root 1 0 R /Info 2 0 R /ID [<4595BA95152E444A8B7DD67ADCEE2E03><4595BA95152E444A8B7DD67ADCEE2E03>] >> startxref 633762 %%EOF starpu-1.2.3+dfsg/doc/doxygen/chapters/images/data_trace.png000066400000000000000000000171671320135501600240570ustar00rootroot00000000000000PNG  IHDR, PLTE@Ai @0`@ԥ**@333MMMfff22U݂d"".Wp͇PErz挽k ܠ ݠݐP@Uk/@@``@@`pͷ|@ KIDATx흋* GgHhnغ&9C.VDM;h}RqsMtB&eTg*VƗ( eq=x6Y8Ꝥh%/JDb#~Yl;%iYN&R3Ϣ "\ܕbE#öH7'>\&Ϣ./[E5o|.'Jߣ5.EmHg=)xM_/|tIN7 5wzOEgI*oD=TSyr\< %S4pi~7ǽ w窶GIKf $ԟW$-< %o|Ѳ%}9Qe;ƑLxz}e#~YܙS4WTke*=)qZ$%|峠*Շy!'6D>g%я?6,Is? ]߬ʮ/\T[E!ۜ^ -n:#ֲܩrfN>^L8vsŒx$Qbק-:SKN@4ӿ+KN!?.f/ +guzm kW/W)S5TGMŲoǷEZ6Vc'~zhiI$tsKv祿ӫ_wskvj7 vw>s$b.Dzo'&M]u9½dNI Puh1nfOa"@sKS"w˱TpxIG )5A`N:cqP)}w=G]s^ [#̜%~E_C1EэJ?SLi-K:;gz\12;n~ihֻ&!@Oy|x 2ߐs")y9x?]ޟ+7rΞEt< bidV;㟼|Jz6M>zQ?sgTeKьym6 eÀр7~/ < L{avSrp( 0@o I@#Rl]P-@Krꫧ܁U|[gq6!@` 82]4y<+6?wGހDNdpdƶfpD;_;'Ը[;⒨ :Hɰ xOsGTՏ@b{JTmb̷ lܞ̌pyzo8PǙLn=+V2J3ma0j.@W&'dKr|V5Yه7;9V U(]v)~~KŧIK:^^O9*qZ+4eK Co2|~?A=(lウ{N(?.ą]?S]C v_b}9أ~6aX^D[KMU} -|x̗gzF?а4f{\4|(/o>>* &_RmjC[N jQM!)m.8InbD )Wfˢ-Nuz]'{ ^l9i3p~dRlZGU_Esob~_rkkTWHӿ0/uBמac*i+R2崤t:m{PBrz/EWdBkG`fC+f+Q7\i߿.P@YSQ/ՙ6'FOq.(1xd3IEF4q\գ/ f"v[7&\q|>\M~1=u^1˹rbn],Dz@ݫ;ػ%t2J]>W1Wv+R__n 2Iw?_AE∫;yv^'wSMׯ|ccQݚ}Y&np`]@uZ~jHx95Muz`\fam!%`]Y]SlS|&E:[m d,ii!wpѼƢqaVӭ*fMEs:*+_tKC3}N#q,LHQs\\!d?7p_6ktð!F>[E* u3Z,$n Ui~(MEnQm]5inUψ^Y&#s閭 Ɖ%ōcU(sهʲWViW6Xw~6UF}L,6"Lo1\I:oVմ/I?=C+Nfm5F7 Qx/O:PF9>%8͵ [b'σ*r ʹc>wNOs)=ҳWi\:Z2DydH ,ޅ)Ij)<y7Az9 _-Wlqff!g-Їyu{,Xf'28 pB Ϝ+;6}x[l#Zq\N5c{V}q4}[7J>O#I :1t28]f43re>2oN$<{)>/RxKX/($ ]gfbDfϧGS||ťcHQq{\U[ Q@OJTDQe7_B'Ba5JCvScr1X2b2JsjWPF݋"Y({lD+&s윣)|*=ڕ?chW(zM۴P ITw/MiCSV;qT8FB1S%"sS}b .ˑ>aZ}0#pV{:!2Q!.qB'ݰr|٧Ԃ}xMV B~@<eCE.ۻQ8nKNO/EB%wl `(lxTk:23,` 1 6#6Rh&RFմ $RS-\("vQ.JqԵ8P9-/]Q%1}['90̐ c O]`D??_/`WL`$sI1ݏyIQ}!5&8wGv*S 0xlIﶤk˦-b/$I._RVhx,8PqZ jw Ž.ArՆ,-p6oS"睺>CB7# qqhgK|_ȭ e 9 Uy ?pi7 QsF8bqJߙ%7Rr2D'696]-`0}y7{_o 2>tNba}.}0 빬2v"7_sZry#f``Iĝn%ӖNMv'5;Qarab;fb`Ov;|=tw5[jEyPi a fEǛ Kxa69(St-BzVVRH#/R/;J kc9E7}" |,M#֡̃cn?Y!6dM0^xa=l :ҝËojġ{3"{樴C|G<S{e _+4XcqK4"?ub}%fQqgz{< إ}|0vWdp,HcV&&(t+U(c*BX$- ]q􍳜s%ZJrk,^ ,StI1[f-+$S KCNPG Sg#)|,!dDT-f!oXN\jq$ǷM 8fTudTc1k_>pI^UpU,txD-v\;Ǩ wV&(ǗE6f_eE&~%uB]" s"}b Xp89G@͕Ǭ?1UĆpL~~odv]眥*0$焂%|ٶ[/c3z:"p {IND>bs+eKlc5(L:;=Fi7F=ʑ䏥eS$#ZIL 8]2eꦎR=k?˂?粮hO1},ŔmV:ӆ哝d%}~1*10:2tLreNBus E&qdQ|J=NmI,4Ƨ/Ho m7(;s=&q Bx7q.is%IpN`c3=l58 IzCd>A*P0E/8[ؑ 3j2Ε9^xJ_e=Xc\Ԇ#h*^l m@mb#e[M #awC߲RoaǍ郶 |9?ə0"Džso߳JA5y>͵/^)61>Y>K SU))Bx(ZSAFF|,,3С̆Yu.A_ sC&?>9͚4~tp1& y/fÀazc#!3Nm:Ag,Zgy( Gow0Gz+lhjnG+ z@S>!@e0v\FH'Yշ4/.I6UZ4Hz+2O0r/ rz,(B.wT}0ڈ-V\D0 AѾ߽͌zbDXg x 0@S @`@D $@F Ku@dC̆a|Ac @` L) 0@2r~c QRF x) 0e,^L)2[) 0@!ߘt L) 0@S @` L) 0@SH#dBv~kX `Ma-`HH# gh'Twd@Z4p( 0E'$raq@L 2[OQNB@S @` L) 0@dC ) 0@S @` L) 0@S @` L) 0@S @` Ľ) 0@S @` L) 0@Su  !'s :kЯղ.vr,E[^_F@Muu%.AXB<Dz  @`{wct/Aw_$?,JuuXժ7W|"XXqU=ͫ[tn \ȦN*y;Scw|j}]p oyu:PCH# v{kj)|^LZˍԿ@i_]扈KRQQ>""znRznlX X&n2xh Xs98t`J\J9 s2탹^२$؜&u y S @H2R?)pxII~JJRJel[ Pw Y#LR Sx?D`~<IENDB`starpu-1.2.3+dfsg/doc/doxygen/chapters/images/distrib_data.eps000066400000000000000000002071721320135501600244210ustar00rootroot00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Title: distrib.data.eps %%Creator: gnuplot 4.6 patchlevel 4 %%CreationDate: Fri Nov 8 14:42:59 2013 %%DocumentFonts: (atend) %%BoundingBox: 50 50 410 302 %%EndComments %%BeginProlog /gnudict 256 dict def gnudict begin % % The following true/false flags may be edited by hand if desired. % The unit line width and grayscale image gamma correction may also be changed. % /Color true def /Blacktext false def /Solid false def /Dashlength 1 def /Landscape false def /Level1 false def /Rounded false def /ClipToBoundingBox false def /SuppressPDFMark false def /TransparentPatterns false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def /Gamma 1.0 def /BackgroundColor {-1.000 -1.000 -1.000} def % /vshift -46 def /dl1 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if } def /dl2 { 10.0 Dashlength mul mul Rounded { currentlinewidth 0.75 mul add } if } def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def /doclip { ClipToBoundingBox { newpath 50 50 moveto 410 50 lineto 410 302 lineto 50 302 lineto closepath clip } if } def % % Gnuplot Prolog Version 4.6 (September 2012) % %/SuppressPDFMark true def % /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /Z {closepath} bind def /C {setrgbcolor} bind def /f {rlineto fill} bind def /g {setgray} bind def /Gshow {show} def % May be redefined later in the file to support UTF-8 /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow {currentpoint stroke M 0 vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Rshow {currentpoint stroke M dup stringwidth pop neg vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R Blacktext {gsave 0 setgray show grestore} {show} ifelse} def /UP {dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def} def /DL {Color {setrgbcolor Solid {pop []} if 0 setdash} {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse} def /BL {stroke userlinewidth 2 mul setlinewidth Rounded {1 setlinejoin 1 setlinecap} if} def /AL {stroke userlinewidth 2 div setlinewidth Rounded {1 setlinejoin 1 setlinecap} if} def /UL {dup gnulinewidth mul /userlinewidth exch def dup 1 lt {pop 1} if 10 mul /udl exch def} def /PL {stroke userlinewidth setlinewidth Rounded {1 setlinejoin 1 setlinecap} if} def 3.8 setmiterlimit % Default Line colors /LCw {1 1 1} def /LCb {0 0 0} def /LCa {0 0 0} def /LC0 {1 0 0} def /LC1 {0 1 0} def /LC2 {0 0 1} def /LC3 {1 0 1} def /LC4 {0 1 1} def /LC5 {1 1 0} def /LC6 {0 0 0} def /LC7 {1 0.3 0} def /LC8 {0.5 0.5 0.5} def % Default Line Types /LTw {PL [] 1 setgray} def /LTb {BL [] LCb DL} def /LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def /LT0 {PL [] LC0 DL} def /LT1 {PL [4 dl1 2 dl2] LC1 DL} def /LT2 {PL [2 dl1 3 dl2] LC2 DL} def /LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def /LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def /LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def /LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def /LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def /LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 DL} def /Pnt {stroke [] 0 setdash gsave 1 setlinecap M 0 0 V stroke grestore} def /Dia {stroke [] 0 setdash 2 copy vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke Pnt} def /Pls {stroke [] 0 setdash vpt sub M 0 vpt2 V currentpoint stroke M hpt neg vpt neg R hpt2 0 V stroke } def /Box {stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke Pnt} def /Crs {stroke [] 0 setdash exch hpt sub exch vpt add M hpt2 vpt2 neg V currentpoint stroke M hpt2 neg 0 R hpt2 vpt2 V stroke} def /TriU {stroke [] 0 setdash 2 copy vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke Pnt} def /Star {2 copy Pls Crs} def /BoxF {stroke [] 0 setdash exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath fill} def /TriUF {stroke [] 0 setdash vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath fill} def /TriD {stroke [] 0 setdash 2 copy vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V closepath stroke Pnt} def /TriDF {stroke [] 0 setdash vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V closepath fill} def /DiaF {stroke [] 0 setdash vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath fill} def /Pent {stroke [] 0 setdash 2 copy gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat closepath stroke grestore Pnt} def /PentF {stroke [] 0 setdash gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat closepath fill grestore} def /Circle {stroke [] 0 setdash 2 copy hpt 0 360 arc stroke Pnt} def /CircleF {stroke [] 0 setdash hpt 0 360 arc fill} def /C0 {BL [] 0 setdash 2 copy moveto vpt 90 450 arc} bind def /C1 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 90 arc closepath fill vpt 0 360 arc closepath} bind def /C2 {BL [] 0 setdash 2 copy moveto 2 copy vpt 90 180 arc closepath fill vpt 0 360 arc closepath} bind def /C3 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 180 arc closepath fill vpt 0 360 arc closepath} bind def /C4 {BL [] 0 setdash 2 copy moveto 2 copy vpt 180 270 arc closepath fill vpt 0 360 arc closepath} bind def /C5 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 90 arc 2 copy moveto 2 copy vpt 180 270 arc closepath fill vpt 0 360 arc} bind def /C6 {BL [] 0 setdash 2 copy moveto 2 copy vpt 90 270 arc closepath fill vpt 0 360 arc closepath} bind def /C7 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 270 arc closepath fill vpt 0 360 arc closepath} bind def /C8 {BL [] 0 setdash 2 copy moveto 2 copy vpt 270 360 arc closepath fill vpt 0 360 arc closepath} bind def /C9 {BL [] 0 setdash 2 copy moveto 2 copy vpt 270 450 arc closepath fill vpt 0 360 arc closepath} bind def /C10 {BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill 2 copy moveto 2 copy vpt 90 180 arc closepath fill vpt 0 360 arc closepath} bind def /C11 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 180 arc closepath fill 2 copy moveto 2 copy vpt 270 360 arc closepath fill vpt 0 360 arc closepath} bind def /C12 {BL [] 0 setdash 2 copy moveto 2 copy vpt 180 360 arc closepath fill vpt 0 360 arc closepath} bind def /C13 {BL [] 0 setdash 2 copy moveto 2 copy vpt 0 90 arc closepath fill 2 copy moveto 2 copy vpt 180 360 arc closepath fill vpt 0 360 arc closepath} bind def /C14 {BL [] 0 setdash 2 copy moveto 2 copy vpt 90 360 arc closepath fill vpt 0 360 arc} bind def /C15 {BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill vpt 0 360 arc closepath} bind def /Rec {newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath} bind def /Square {dup Rec} bind def /Bsquare {vpt sub exch vpt sub exch vpt2 Square} bind def /S0 {BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare} bind def /S1 {BL [] 0 setdash 2 copy vpt Square fill Bsquare} bind def /S2 {BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def /S3 {BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare} bind def /S4 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def /S5 {BL [] 0 setdash 2 copy 2 copy vpt Square fill exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def /S6 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare} bind def /S7 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill 2 copy vpt Square fill Bsquare} bind def /S8 {BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare} bind def /S9 {BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare} bind def /S10 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def /S11 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare} bind def /S12 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare} bind def /S13 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill 2 copy vpt Square fill Bsquare} bind def /S14 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def /S15 {BL [] 0 setdash 2 copy Bsquare fill Bsquare} bind def /D0 {gsave translate 45 rotate 0 0 S0 stroke grestore} bind def /D1 {gsave translate 45 rotate 0 0 S1 stroke grestore} bind def /D2 {gsave translate 45 rotate 0 0 S2 stroke grestore} bind def /D3 {gsave translate 45 rotate 0 0 S3 stroke grestore} bind def /D4 {gsave translate 45 rotate 0 0 S4 stroke grestore} bind def /D5 {gsave translate 45 rotate 0 0 S5 stroke grestore} bind def /D6 {gsave translate 45 rotate 0 0 S6 stroke grestore} bind def /D7 {gsave translate 45 rotate 0 0 S7 stroke grestore} bind def /D8 {gsave translate 45 rotate 0 0 S8 stroke grestore} bind def /D9 {gsave translate 45 rotate 0 0 S9 stroke grestore} bind def /D10 {gsave translate 45 rotate 0 0 S10 stroke grestore} bind def /D11 {gsave translate 45 rotate 0 0 S11 stroke grestore} bind def /D12 {gsave translate 45 rotate 0 0 S12 stroke grestore} bind def /D13 {gsave translate 45 rotate 0 0 S13 stroke grestore} bind def /D14 {gsave translate 45 rotate 0 0 S14 stroke grestore} bind def /D15 {gsave translate 45 rotate 0 0 S15 stroke grestore} bind def /DiaE {stroke [] 0 setdash vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke} def /BoxE {stroke [] 0 setdash exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke} def /TriUE {stroke [] 0 setdash vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke} def /TriDE {stroke [] 0 setdash vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V closepath stroke} def /PentE {stroke [] 0 setdash gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat closepath stroke grestore} def /CircE {stroke [] 0 setdash hpt 0 360 arc stroke} def /Opaque {gsave closepath 1 setgray fill grestore 0 setgray closepath} def /DiaW {stroke [] 0 setdash vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V Opaque stroke} def /BoxW {stroke [] 0 setdash exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V Opaque stroke} def /TriUW {stroke [] 0 setdash vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V Opaque stroke} def /TriDW {stroke [] 0 setdash vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V Opaque stroke} def /PentW {stroke [] 0 setdash gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat Opaque stroke grestore} def /CircW {stroke [] 0 setdash hpt 0 360 arc Opaque stroke} def /BoxFill {gsave Rec 1 setgray fill grestore} def /Density { /Fillden exch def currentrgbcolor /ColB exch def /ColG exch def /ColR exch def /ColR ColR Fillden mul Fillden sub 1 add def /ColG ColG Fillden mul Fillden sub 1 add def /ColB ColB Fillden mul Fillden sub 1 add def ColR ColG ColB setrgbcolor} def /BoxColFill {gsave Rec PolyFill} def /PolyFill {gsave Density fill grestore grestore} def /h {rlineto rlineto rlineto gsave closepath fill grestore} bind def % % PostScript Level 1 Pattern Fill routine for rectangles % Usage: x y w h s a XX PatternFill % x,y = lower left corner of box to be filled % w,h = width and height of box % a = angle in degrees between lines and x-axis % XX = 0/1 for no/yes cross-hatch % /PatternFill {gsave /PFa [ 9 2 roll ] def PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse clip currentlinewidth 0.5 mul setlinewidth /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def 0 0 M PFa 5 get rotate PFs -2 div dup translate 0 1 PFs PFa 4 get div 1 add floor cvi {PFa 4 get mul 0 M 0 PFs V} for 0 PFa 6 get ne { 0 1 PFs PFa 4 get div 1 add floor cvi {PFa 4 get mul 0 2 1 roll M PFs 0 V} for } if stroke grestore} def % /languagelevel where {pop languagelevel} {1} ifelse 2 lt {/InterpretLevel1 true def} {/InterpretLevel1 Level1 def} ifelse % % PostScript level 2 pattern fill definitions % /Level2PatternFill { /Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8} bind def /KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} >> matrix makepattern /Pat1 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke} >> matrix makepattern /Pat2 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L 8 8 L 8 0 L 0 0 L fill} >> matrix makepattern /Pat3 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L 0 12 M 12 0 L stroke} >> matrix makepattern /Pat4 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L 0 -4 M 12 8 L stroke} >> matrix makepattern /Pat5 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L 0 12 M 8 -4 L 4 12 M 10 0 L stroke} >> matrix makepattern /Pat6 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L 0 -4 M 8 12 L 4 -4 M 10 8 L stroke} >> matrix makepattern /Pat7 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L 12 0 M -4 8 L 12 4 M 0 10 L stroke} >> matrix makepattern /Pat8 exch def << Tile8x8 /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L -4 0 M 12 8 L -4 4 M 8 10 L stroke} >> matrix makepattern /Pat9 exch def /Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def /Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def /Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def /Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def /Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def /Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def /Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def } def % % %End of PostScript Level 2 code % /PatternBgnd { TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse } def % % Substitute for Level 2 pattern fill codes with % grayscale if Level 2 support is not selected. % /Level1PatternFill { /Pattern1 {0.250 Density} bind def /Pattern2 {0.500 Density} bind def /Pattern3 {0.750 Density} bind def /Pattern4 {0.125 Density} bind def /Pattern5 {0.375 Density} bind def /Pattern6 {0.625 Density} bind def /Pattern7 {0.875 Density} bind def } def % % Now test for support of Level 2 code % Level1 {Level1PatternFill} {Level2PatternFill} ifelse % /Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall currentdict end definefont pop /MFshow { { dup 5 get 3 ge { 5 get 3 eq {gsave} {grestore} ifelse } {dup dup 0 get findfont exch 1 get scalefont setfont [ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6 get exch 4 get {Gshow} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq {dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5 get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop pop aload pop M} ifelse }ifelse }ifelse } ifelse } forall} def /Gswidth {dup type /stringtype eq {stringwidth} {pop (n) stringwidth} ifelse} def /MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse } {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont 6 get Gswidth pop add} {pop} ifelse} ifelse} forall} def /MLshow { currentpoint stroke M 0 exch R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MRshow { currentpoint stroke M exch dup MFwidth neg 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /MCshow { currentpoint stroke M exch dup MFwidth -2 div 3 -1 roll R Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def /XYsave { [( ) 1 2 true false 3 ()] } bind def /XYrestore { [( ) 1 2 true false 4 ()] } bind def Level1 SuppressPDFMark or {} { /SDict 10 dict def systemdict /pdfmark known not { userdict /pdfmark systemdict /cleartomark get put } if SDict begin [ /Title (distrib.data.eps) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 4) /Author (samy) % /Producer (gnuplot) % /Keywords () /CreationDate (Fri Nov 8 14:42:59 2013) /DOCINFO pdfmark end } ifelse end %%EndProlog %%Page: 1 1 gnudict begin gsave doclip 50 50 translate 0.050 0.050 scale 0 setgray newpath (Helvetica) findfont 140 scalefont setfont BackgroundColor 0 lt 3 1 roll 0 lt exch 0 lt or or not {BackgroundColor C 1.000 0 0 7200.00 5040.00 BoxColFill} if 1.000 UL LTb LCb setrgbcolor 854 448 M 63 0 V 6030 0 R -63 0 V stroke 770 448 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.001)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 854 781 M 31 0 V 6062 0 R -31 0 V 854 976 M 31 0 V 6062 0 R -31 0 V 854 1114 M 31 0 V 6062 0 R -31 0 V 854 1221 M 31 0 V 6062 0 R -31 0 V 854 1308 M 31 0 V 6062 0 R -31 0 V 854 1382 M 31 0 V 6062 0 R -31 0 V 854 1447 M 31 0 V 6062 0 R -31 0 V 854 1503 M 31 0 V 6062 0 R -31 0 V 854 1554 M 63 0 V 6030 0 R -63 0 V stroke 770 1554 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.01)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 854 1887 M 31 0 V 6062 0 R -31 0 V 854 2081 M 31 0 V 6062 0 R -31 0 V 854 2219 M 31 0 V 6062 0 R -31 0 V 854 2327 M 31 0 V 6062 0 R -31 0 V 854 2414 M 31 0 V 6062 0 R -31 0 V 854 2488 M 31 0 V 6062 0 R -31 0 V 854 2552 M 31 0 V 6062 0 R -31 0 V 854 2609 M 31 0 V 6062 0 R -31 0 V 854 2660 M 63 0 V 6030 0 R -63 0 V stroke 770 2660 M [ [(Helvetica) 140.0 0.0 true true 0 ( 0.1)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 854 2992 M 31 0 V 6062 0 R -31 0 V 854 3187 M 31 0 V 6062 0 R -31 0 V 854 3325 M 31 0 V 6062 0 R -31 0 V 854 3432 M 31 0 V 6062 0 R -31 0 V 854 3520 M 31 0 V 6062 0 R -31 0 V 854 3594 M 31 0 V 6062 0 R -31 0 V 854 3658 M 31 0 V 6062 0 R -31 0 V 854 3715 M 31 0 V 6062 0 R -31 0 V 854 3765 M 63 0 V 6030 0 R -63 0 V stroke 770 3765 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 854 4098 M 31 0 V 6062 0 R -31 0 V 854 4293 M 31 0 V 6062 0 R -31 0 V 854 4431 M 31 0 V 6062 0 R -31 0 V 854 4538 M 31 0 V 6062 0 R -31 0 V 854 4626 M 31 0 V 6062 0 R -31 0 V 854 4700 M 31 0 V 6062 0 R -31 0 V 854 4764 M 31 0 V 6062 0 R -31 0 V 854 4820 M 31 0 V 6062 0 R -31 0 V 854 4871 M 63 0 V 6030 0 R -63 0 V stroke 770 4871 M [ [(Helvetica) 140.0 0.0 true true 0 ( 10)] ] -46.7 MRshow 1.000 UL LTb LCb setrgbcolor 854 448 M 0 63 V 0 4360 R 0 -63 V stroke 854 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1000)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1221 448 M 0 31 V 0 4392 R 0 -31 V 1706 448 M 0 31 V 0 4392 R 0 -31 V 1955 448 M 0 31 V 0 4392 R 0 -31 V 2073 448 M 0 63 V 0 4360 R 0 -63 V stroke 2073 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 10000)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 2439 448 M 0 31 V 0 4392 R 0 -31 V 2924 448 M 0 31 V 0 4392 R 0 -31 V 3173 448 M 0 31 V 0 4392 R 0 -31 V 3291 448 M 0 63 V 0 4360 R 0 -63 V stroke 3291 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 100000)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 3658 448 M 0 31 V 0 4392 R 0 -31 V 4143 448 M 0 31 V 0 4392 R 0 -31 V 4392 448 M 0 31 V 0 4392 R 0 -31 V 4510 448 M 0 63 V 0 4360 R 0 -63 V stroke 4510 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1e+06)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 4877 448 M 0 31 V 0 4392 R 0 -31 V 5362 448 M 0 31 V 0 4392 R 0 -31 V 5610 448 M 0 31 V 0 4392 R 0 -31 V 5728 448 M 0 63 V 0 4360 R 0 -63 V stroke 5728 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1e+07)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 6095 448 M 0 31 V 0 4392 R 0 -31 V 6580 448 M 0 31 V 0 4392 R 0 -31 V 6829 448 M 0 31 V 0 4392 R 0 -31 V 6947 448 M 0 63 V 0 4360 R 0 -63 V stroke 6947 308 M [ [(Helvetica) 140.0 0.0 true true 0 ( 1e+08)] ] -46.7 MCshow 1.000 UL LTb LCb setrgbcolor 1.000 UL LTb LCb setrgbcolor 854 4871 N 854 448 L 6093 0 V 0 4423 V -6093 0 V Z stroke LCb setrgbcolor 112 2659 M currentpoint gsave translate -270 rotate 0 0 moveto [ [(Helvetica) 140.0 0.0 true true 0 (Execution time \(ms\))] ] -46.7 MCshow grestore LTb LCb setrgbcolor 3900 98 M [ [(Helvetica) 140.0 0.0 true true 0 (Total data size)] ] -46.7 MCshow LTb 1.000 UP 1.000 UL LTb LCb setrgbcolor % Begin plot #1 1.000 UP 1.000 UL LT0 LC0 setrgbcolor LCb setrgbcolor 4130 4738 M [ [(Helvetica) 140.0 0.0 true true 0 (non_linear_memset_regression_ba arch 0)] ] -46.7 MRshow LT0 867 1182 Pls 867 664 Pls 867 681 Pls 867 747 Pls 867 716 Pls 867 686 Pls 867 653 Pls 867 646 Pls 867 737 Pls 867 653 Pls 867 736 Pls 867 666 Pls 867 712 Pls 867 718 Pls 867 667 Pls 867 697 Pls 867 858 Pls 867 747 Pls 867 625 Pls 867 647 Pls 867 659 Pls 867 631 Pls 867 726 Pls 867 713 Pls 867 635 Pls 867 640 Pls 867 641 Pls 867 594 Pls 867 603 Pls 867 641 Pls 867 714 Pls 867 682 Pls 867 580 Pls 867 662 Pls 867 636 Pls 867 707 Pls 867 651 Pls 867 724 Pls 867 612 Pls 867 650 Pls 867 667 Pls 867 622 Pls 867 678 Pls 867 649 Pls 867 672 Pls 867 687 Pls 867 674 Pls 867 646 Pls 867 720 Pls 867 637 Pls 867 657 Pls 867 534 Pls 867 520 Pls 867 607 Pls 867 509 Pls 867 705 Pls 867 497 Pls 867 502 Pls 867 732 Pls 867 587 Pls 1233 844 Pls 1233 716 Pls 1233 673 Pls 1233 683 Pls 1233 567 Pls 1233 659 Pls 1233 678 Pls 1233 700 Pls 1233 630 Pls 1233 643 Pls 1233 629 Pls 1233 673 Pls 1233 666 Pls 1233 687 Pls 1233 765 Pls 1233 663 Pls 1233 631 Pls 1233 645 Pls 1233 607 Pls 1233 653 Pls 1233 703 Pls 1233 705 Pls 1233 729 Pls 1233 635 Pls 1233 618 Pls 1233 649 Pls 1233 661 Pls 1233 636 Pls 1233 663 Pls 1233 615 Pls 1233 679 Pls 1233 670 Pls 1233 705 Pls 1233 669 Pls 1233 617 Pls 1233 639 Pls 1233 619 Pls 1233 665 Pls 1233 633 Pls 1233 661 Pls 1233 659 Pls 1233 684 Pls 1233 590 Pls 1233 672 Pls 1233 646 Pls 1233 623 Pls 1233 621 Pls 1233 665 Pls 1233 621 Pls 1233 583 Pls 1233 660 Pls 1233 622 Pls 1233 629 Pls 1233 648 Pls 1233 680 Pls 1233 601 Pls 1233 660 Pls 1233 619 Pls 1233 664 Pls 1233 655 Pls 1233 675 Pls 1233 658 Pls 1233 616 Pls 1600 841 Pls 1600 782 Pls 1600 795 Pls 1600 751 Pls 1600 760 Pls 1600 795 Pls 1600 797 Pls 1600 831 Pls 1600 783 Pls 1600 775 Pls 1600 824 Pls 1600 801 Pls 1600 759 Pls 1600 734 Pls 1600 781 Pls 1600 719 Pls 1600 733 Pls 1600 765 Pls 1600 726 Pls 1600 729 Pls 1600 707 Pls 1600 724 Pls 1600 746 Pls 1600 736 Pls 1600 771 Pls 1600 736 Pls 1600 778 Pls 1600 745 Pls 1600 725 Pls 1600 732 Pls 1600 733 Pls 1600 741 Pls 1600 765 Pls 1600 746 Pls 1600 767 Pls 1600 750 Pls 1600 716 Pls 1600 721 Pls 1600 716 Pls 1600 761 Pls 1600 741 Pls 1600 712 Pls 1600 706 Pls 1600 749 Pls 1600 707 Pls 1600 762 Pls 1600 793 Pls 1600 718 Pls 1600 730 Pls 1600 762 Pls 1600 778 Pls 1600 774 Pls 1600 758 Pls 1600 709 Pls 1600 763 Pls 1600 742 Pls 1600 728 Pls 1600 735 Pls 1600 717 Pls 1600 728 Pls 1600 718 Pls 1600 764 Pls 1600 782 Pls 1600 751 Pls 1600 745 Pls 1600 765 Pls 1967 957 Pls 1967 1025 Pls 1967 960 Pls 1967 930 Pls 1967 851 Pls 1967 976 Pls 1967 940 Pls 1967 931 Pls 1967 974 Pls 1967 891 Pls 1967 986 Pls 1967 888 Pls 1967 912 Pls 1967 896 Pls 1967 886 Pls 1967 979 Pls 1967 933 Pls 1967 945 Pls 1967 915 Pls 1967 973 Pls 1967 884 Pls 1967 922 Pls 1967 967 Pls 1967 893 Pls 1967 926 Pls 1967 900 Pls 1967 888 Pls 1967 925 Pls 1967 897 Pls 1967 913 Pls 1967 892 Pls 1967 878 Pls 1967 904 Pls 1967 889 Pls 1967 888 Pls 1967 928 Pls 1967 924 Pls 1967 899 Pls 1967 891 Pls 1967 913 Pls 1967 786 Pls 1967 642 Pls 1967 622 Pls 1967 691 Pls 1967 583 Pls 1967 595 Pls 1967 588 Pls 1967 652 Pls 1967 620 Pls 1967 587 Pls 1967 600 Pls 1967 606 Pls 1967 606 Pls 1967 625 Pls 1967 597 Pls 1967 617 Pls 1967 596 Pls 1967 595 Pls 1967 568 Pls 1967 568 Pls 2334 618 Pls 2334 842 Pls 2334 855 Pls 2334 855 Pls 2334 832 Pls 2334 837 Pls 2334 858 Pls 2334 813 Pls 2334 819 Pls 2334 888 Pls 2334 844 Pls 2334 806 Pls 2334 828 Pls 2334 818 Pls 2334 819 Pls 2334 820 Pls 2334 805 Pls 2334 852 Pls 2334 824 Pls 2334 811 Pls 2334 832 Pls 2334 836 Pls 2334 879 Pls 2334 826 Pls 2334 840 Pls 2334 816 Pls 2334 836 Pls 2334 841 Pls 2334 838 Pls 2334 849 Pls 2334 819 Pls 2334 822 Pls 2334 840 Pls 2334 842 Pls 2334 842 Pls 2334 813 Pls 2334 830 Pls 2334 833 Pls 2334 832 Pls 2334 805 Pls 2334 823 Pls 2334 811 Pls 2334 832 Pls 2334 816 Pls 2334 818 Pls 2334 886 Pls 2334 843 Pls 2334 811 Pls 2334 814 Pls 2334 821 Pls 2334 836 Pls 2334 838 Pls 2334 823 Pls 2334 802 Pls 2334 803 Pls 2334 813 Pls 2334 833 Pls 2334 810 Pls 2334 817 Pls 2701 776 Pls 2701 1104 Pls 2701 1060 Pls 2701 1072 Pls 2701 1067 Pls 2701 1038 Pls 2701 1105 Pls 2701 1068 Pls 2701 1052 Pls 2701 1069 Pls 2701 1100 Pls 2701 1058 Pls 2701 1081 Pls 2701 1056 Pls 2701 1060 Pls 2701 1064 Pls 2701 1064 Pls 2701 1070 Pls 2701 1052 Pls 2701 1072 Pls 2701 1059 Pls 2701 1072 Pls 2701 1054 Pls 2701 1070 Pls 2701 1069 Pls 2701 1065 Pls 2701 1068 Pls 2701 1072 Pls 2701 1067 Pls 2701 1066 Pls 2701 1054 Pls 2701 1072 Pls 2701 1057 Pls 2701 1060 Pls 2701 1067 Pls 2701 1067 Pls 2701 1063 Pls 2701 1049 Pls 2701 1073 Pls 2701 1061 Pls 2701 1104 Pls 2701 1070 Pls 2701 1067 Pls 2701 1075 Pls 2701 1071 Pls 2701 1069 Pls 2701 1096 Pls 2701 1055 Pls 2701 1061 Pls 2701 1056 Pls 2701 1056 Pls 2701 1062 Pls 2701 1056 Pls 2701 1061 Pls 2701 1057 Pls 2701 1060 Pls 2701 1076 Pls 2701 1063 Pls 3068 1249 Pls 3068 1316 Pls 3068 1263 Pls 3068 1316 Pls 3068 1306 Pls 3068 1313 Pls 3068 1307 Pls 3068 1313 Pls 3068 1302 Pls 3068 1317 Pls 3068 1311 Pls 3068 1295 Pls 3068 1303 Pls 3068 1313 Pls 3068 1301 Pls 3068 1303 Pls 3068 1332 Pls 3068 1307 Pls 3068 1305 Pls 3068 1299 Pls 3068 1303 Pls 3068 1310 Pls 3068 1319 Pls 3068 1364 Pls 3068 1347 Pls 3068 1376 Pls 3068 1327 Pls 3068 1352 Pls 3068 1387 Pls 3068 1375 Pls 3068 1305 Pls 3068 1301 Pls 3068 1314 Pls 3068 1313 Pls 3068 1306 Pls 3068 1315 Pls 3068 1305 Pls 3068 1317 Pls 3068 1307 Pls 3068 1307 Pls 3068 1308 Pls 3068 1310 Pls 3068 1302 Pls 3068 1309 Pls 3068 1301 Pls 3068 1302 Pls 3068 1303 Pls 3068 1305 Pls 3068 1305 Pls 3068 1304 Pls 3068 1313 Pls 3068 1314 Pls 3068 1312 Pls 3068 1308 Pls 3068 1297 Pls 3068 1316 Pls 3434 1579 Pls 3434 1597 Pls 3434 1588 Pls 3434 1604 Pls 3434 1607 Pls 3434 1591 Pls 3434 1601 Pls 3434 1590 Pls 3434 1595 Pls 3434 1598 Pls 3434 1590 Pls 3434 1592 Pls 3434 1603 Pls 3434 1594 Pls 3434 1588 Pls 3434 1588 Pls 3434 1595 Pls 3434 1602 Pls 3434 1637 Pls 3434 1579 Pls 3434 1600 Pls 3434 1588 Pls 3434 1603 Pls 3434 1598 Pls 3434 1588 Pls 3434 1601 Pls 3434 1590 Pls 3434 1602 Pls 3434 1586 Pls 3434 1614 Pls 3434 1590 Pls 3434 1598 Pls 3434 1600 Pls 3434 1582 Pls 3434 1599 Pls 3434 1592 Pls 3434 1604 Pls 3434 1590 Pls 3434 1590 Pls 3434 1589 Pls 3434 1590 Pls 3434 1589 Pls 3434 1607 Pls 3434 1594 Pls 3434 1592 Pls 3434 1597 Pls 3434 1583 Pls 3434 1604 Pls 3434 1598 Pls 3434 1594 Pls 3434 1594 Pls 3434 1605 Pls 3434 1580 Pls 3434 1589 Pls 3434 1594 Pls 3434 1591 Pls 3434 1596 Pls 3434 1602 Pls 3434 1595 Pls 3434 1591 Pls 3434 1596 Pls 3434 1596 Pls 3434 1594 Pls 3801 1806 Pls 3801 1782 Pls 3801 1761 Pls 3801 1812 Pls 3801 1813 Pls 3801 1816 Pls 3801 1819 Pls 3801 1810 Pls 3801 1814 Pls 3801 1813 Pls 3801 1813 Pls 3801 1819 Pls 3801 1811 Pls 3801 1817 Pls 3801 1820 Pls 3801 1819 Pls 3801 1819 Pls 3801 1825 Pls 3801 1814 Pls 3801 1815 Pls 3801 1831 Pls 3801 2015 Pls 3801 1807 Pls 3801 1805 Pls 3801 1811 Pls 3801 1820 Pls 3801 1819 Pls 3801 1820 Pls 3801 1818 Pls 3801 1821 Pls 3801 1820 Pls 3801 1822 Pls 3801 1822 Pls 3801 1824 Pls 3801 1820 Pls 3801 1816 Pls 3801 1821 Pls 3801 1822 Pls 3801 1816 Pls 3801 1833 Pls 3801 1817 Pls 3801 1822 Pls 3801 1829 Pls 3801 1816 Pls 3801 1816 Pls 3801 1828 Pls 3801 1811 Pls 3801 1814 Pls 3801 1817 Pls 3801 1818 Pls 3801 1812 Pls 3801 1823 Pls 3801 1824 Pls 3801 1828 Pls 3801 1814 Pls 3801 1819 Pls 3801 1818 Pls 3801 1827 Pls 3801 1827 Pls 4168 1960 Pls 4168 2053 Pls 4168 2052 Pls 4168 2059 Pls 4168 2070 Pls 4168 2061 Pls 4168 2059 Pls 4168 2058 Pls 4168 2052 Pls 4168 2060 Pls 4168 2061 Pls 4168 2055 Pls 4168 2060 Pls 4168 2060 Pls 4168 2058 Pls 4168 2057 Pls 4168 2055 Pls 4168 2055 Pls 4168 2062 Pls 4168 2061 Pls 4168 2053 Pls 4168 2059 Pls 4168 2053 Pls 4168 2060 Pls 4168 2060 Pls 4168 2062 Pls 4168 2058 Pls 4168 2060 Pls 4168 2065 Pls 4168 2057 Pls 4168 2066 Pls 4168 2066 Pls 4168 2063 Pls 4168 2062 Pls 4168 2062 Pls 4168 2061 Pls 4168 2051 Pls 4168 2059 Pls 4168 2057 Pls 4168 2111 Pls 4168 2050 Pls 4168 2055 Pls 4168 2055 Pls 4168 2059 Pls 4168 2058 Pls 4168 2056 Pls 4168 2056 Pls 4168 2056 Pls 4168 2051 Pls 4168 2055 Pls 4168 2053 Pls 4168 2062 Pls 4168 2058 Pls 4168 2055 Pls 4168 2058 Pls 4168 2059 Pls 4168 2049 Pls 4168 2063 Pls 4168 2062 Pls 4168 2061 Pls 4535 2506 Pls 4535 2498 Pls 4535 2494 Pls 4535 2492 Pls 4535 2498 Pls 4535 2495 Pls 4535 2559 Pls 4535 2496 Pls 4535 2493 Pls 4535 2494 Pls 4535 2491 Pls 4535 2491 Pls 4535 2497 Pls 4535 2491 Pls 4535 2490 Pls 4535 2485 Pls 4535 2485 Pls 4535 2486 Pls 4535 2494 Pls 4535 2492 Pls 4535 2494 Pls 4535 2496 Pls 4535 2496 Pls 4535 2496 Pls 4535 2498 Pls 4535 2493 Pls 4535 2494 Pls 4535 2492 Pls 4535 2495 Pls 4535 2492 Pls 4535 2496 Pls 4535 2494 Pls 4535 2492 Pls 4535 2496 Pls 4535 2493 Pls 4535 2493 Pls 4535 2492 Pls 4535 2495 Pls 4535 2493 Pls 4535 2489 Pls 4535 2489 Pls 4535 2492 Pls 4535 2493 Pls 4535 2495 Pls 4535 2495 Pls 4535 2492 Pls 4535 2494 Pls 4535 2492 Pls 4535 2494 Pls 4535 2491 Pls 4535 2494 Pls 4535 2493 Pls 4535 2495 Pls 4535 2494 Pls 4535 2493 Pls 4535 2494 Pls 4535 2494 Pls 4535 2494 Pls 4535 2496 Pls 4535 2493 Pls 4535 2493 Pls 4535 2495 Pls 4535 2496 Pls 4535 2491 Pls 4535 2493 Pls 4535 2493 Pls 4535 2494 Pls 4535 2494 Pls 4535 2491 Pls 4535 2495 Pls 4535 2545 Pls 4535 2497 Pls 4535 2493 Pls 4535 2494 Pls 4535 2495 Pls 4535 2494 Pls 4535 2493 Pls 4535 2495 Pls 4902 2833 Pls 4902 2829 Pls 4902 2830 Pls 4902 2840 Pls 4902 2825 Pls 4902 2828 Pls 4902 2825 Pls 4902 2820 Pls 4902 2819 Pls 4902 2829 Pls 4902 2827 Pls 4902 2825 Pls 4902 2826 Pls 4902 2826 Pls 4902 2826 Pls 4902 2826 Pls 4902 2821 Pls 4902 2820 Pls 4902 2826 Pls 4902 2827 Pls 4902 2827 Pls 4902 2826 Pls 4902 2826 Pls 4902 2827 Pls 4902 2826 Pls 4902 2826 Pls 4902 2827 Pls 4902 2826 Pls 4902 2827 Pls 4902 2828 Pls 4902 2825 Pls 4902 2826 Pls 4902 2828 Pls 4902 2856 Pls 4902 2827 Pls 4902 2825 Pls 4902 2825 Pls 4902 2826 Pls 4902 2827 Pls 4902 2826 Pls 4902 2826 Pls 4902 2827 Pls 4902 2839 Pls 4902 2828 Pls 4902 2825 Pls 4902 2826 Pls 4902 2826 Pls 4902 2825 Pls 4902 2827 Pls 4902 2826 Pls 4902 2824 Pls 4902 2818 Pls 4902 2826 Pls 4902 2827 Pls 4902 2828 Pls 4902 2827 Pls 4902 2825 Pls 4902 2827 Pls 4902 2829 Pls 4902 2826 Pls 4902 2827 Pls 4902 2824 Pls 4902 2822 Pls 4902 2826 Pls 4902 2824 Pls 4902 2827 Pls 4902 2826 Pls 4902 2827 Pls 4902 2827 Pls 4902 2828 Pls 4902 2826 Pls 4902 2827 Pls 5269 3161 Pls 5269 3160 Pls 5269 3161 Pls 5269 3161 Pls 5269 3161 Pls 5269 3160 Pls 5269 3160 Pls 5269 3159 Pls 5269 3161 Pls 5269 3161 Pls 5269 3159 Pls 5269 3157 Pls 5269 3161 Pls 5269 3159 Pls 5269 3159 Pls 5269 3159 Pls 5269 3161 Pls 5269 3161 Pls 5269 3160 Pls 5269 3160 Pls 5269 3159 Pls 5269 3159 Pls 5269 3162 Pls 5269 3161 Pls 5269 3161 Pls 5269 3160 Pls 5269 3161 Pls 5269 3152 Pls 5269 3159 Pls 5269 3161 Pls 5269 3160 Pls 5269 3158 Pls 5269 3160 Pls 5269 3160 Pls 5269 3160 Pls 5269 3159 Pls 5269 3160 Pls 5269 3160 Pls 5269 3160 Pls 5269 3161 Pls 5269 3162 Pls 5269 3161 Pls 5269 3161 Pls 5269 3160 Pls 5269 3160 Pls 5269 3162 Pls 5269 3159 Pls 5269 3159 Pls 5269 3161 Pls 5269 3153 Pls 5269 3159 Pls 5269 3160 Pls 5269 3160 Pls 5269 3160 Pls 5269 3157 Pls 5269 3156 Pls 5269 3159 Pls 5269 3160 Pls 5269 3160 Pls 5269 3161 Pls 5269 3161 Pls 5269 3159 Pls 5269 3160 Pls 5269 3160 Pls 5269 3159 Pls 5269 3160 Pls 5269 3160 Pls 5269 3160 Pls 5269 3164 Pls 5269 3159 Pls 5269 3158 Pls 5269 3152 Pls 5269 3161 Pls 5635 3493 Pls 5635 3497 Pls 5635 3493 Pls 5635 3493 Pls 5635 3493 Pls 5635 3494 Pls 5635 3497 Pls 5635 3485 Pls 5635 3492 Pls 5635 3493 Pls 5635 3493 Pls 5635 3493 Pls 5635 3493 Pls 5635 3495 Pls 5635 3494 Pls 5635 3493 Pls 5635 3493 Pls 5635 3493 Pls 5635 3486 Pls 5635 3493 Pls 5635 3493 Pls 5635 3491 Pls 5635 3492 Pls 5635 3494 Pls 5635 3498 Pls 5635 3491 Pls 5635 3492 Pls 5635 3493 Pls 5635 3493 Pls 5635 3490 Pls 5635 3497 Pls 5635 3492 Pls 5635 3499 Pls 5635 3493 Pls 5635 3493 Pls 5635 3494 Pls 5635 3492 Pls 5635 3493 Pls 5635 3492 Pls 5635 3495 Pls 5635 3492 Pls 5635 3490 Pls 5635 3493 Pls 5635 3492 Pls 5635 3494 Pls 5635 3486 Pls 5635 3494 Pls 5635 3494 Pls 5635 3495 Pls 5635 3492 Pls 5635 3497 Pls 5635 3492 Pls 5635 3493 Pls 5635 3491 Pls 5635 3489 Pls 5635 3494 Pls 5635 3492 Pls 5635 3495 Pls 5635 3489 Pls 5635 3493 Pls 5635 3493 Pls 5635 3492 Pls 5635 3492 Pls 5635 3495 Pls 5635 3495 Pls 5635 3495 Pls 5635 3491 Pls 5635 3494 Pls 5635 3492 Pls 5635 3493 Pls 5635 3491 Pls 5635 3493 Pls 5635 3495 Pls 5635 3491 Pls 5635 3492 Pls 5635 3495 Pls 5635 3492 Pls 5635 3487 Pls 5635 3495 Pls 6002 3828 Pls 6002 3826 Pls 6002 3826 Pls 6002 3827 Pls 6002 3826 Pls 6002 3825 Pls 6002 3829 Pls 6002 3826 Pls 6002 3826 Pls 6002 3825 Pls 6002 3826 Pls 6002 3827 Pls 6002 3822 Pls 6002 3825 Pls 6002 3827 Pls 6002 3825 Pls 6002 3826 Pls 6002 3824 Pls 6002 3825 Pls 6002 3823 Pls 6002 3826 Pls 6002 3825 Pls 6002 3826 Pls 6002 3823 Pls 6002 3825 Pls 6002 3826 Pls 6002 3827 Pls 6002 3826 Pls 6002 3826 Pls 6002 3826 Pls 6002 3826 Pls 6002 3822 Pls 6002 3826 Pls 6002 3827 Pls 6002 3827 Pls 6002 3827 Pls 6002 3825 Pls 6002 3825 Pls 6002 3827 Pls 6002 3825 Pls 6002 3826 Pls 6002 3825 Pls 6002 3826 Pls 6002 3828 Pls 6002 3826 Pls 6002 3827 Pls 6002 3827 Pls 6002 3826 Pls 6002 3824 Pls 6002 3824 Pls 6002 3826 Pls 6002 3832 Pls 6002 3826 Pls 6002 3826 Pls 6002 3822 Pls 6002 3826 Pls 6002 3826 Pls 6002 3825 Pls 6002 3838 Pls 6002 3820 Pls 6002 3829 Pls 6002 3823 Pls 6002 3825 Pls 6002 3830 Pls 6002 3827 Pls 6002 3823 Pls 6002 3825 Pls 6002 3827 Pls 6002 3825 Pls 6002 3825 Pls 6369 4157 Pls 6369 4157 Pls 6369 4159 Pls 6369 4159 Pls 6369 4160 Pls 6369 4159 Pls 6369 4157 Pls 6369 4157 Pls 6369 4159 Pls 6369 4158 Pls 6369 4160 Pls 6369 4158 Pls 6369 4158 Pls 6369 4158 Pls 6369 4157 Pls 6369 4158 Pls 6369 4159 Pls 6369 4159 Pls 6369 4159 Pls 6369 4159 Pls 6369 4159 Pls 6369 4159 Pls 6369 4159 Pls 6369 4157 Pls 6369 4157 Pls 6369 4159 Pls 6369 4159 Pls 6369 4158 Pls 6369 4156 Pls 6369 4160 Pls 6369 4157 Pls 6369 4157 Pls 6369 4159 Pls 6369 4158 Pls 6369 4158 Pls 6369 4159 Pls 6369 4158 Pls 6369 4158 Pls 6369 4159 Pls 6369 4156 Pls 6369 4160 Pls 6369 4158 Pls 6369 4159 Pls 6369 4158 Pls 6369 4157 Pls 6369 4158 Pls 6369 4159 Pls 6369 4160 Pls 6369 4159 Pls 6369 4157 Pls 6369 4157 Pls 6369 4159 Pls 6369 4160 Pls 6369 4159 Pls 6369 4159 Pls 6369 4159 Pls 6369 4160 Pls 6369 4159 Pls 6369 4159 Pls 6369 4159 Pls 6369 4159 Pls 6369 4158 Pls 6369 4158 Pls 6369 4159 Pls 6369 4159 Pls 6369 4160 Pls 6369 4159 Pls 6369 4157 Pls 6369 4157 Pls 6369 4158 Pls 6369 4157 Pls 6369 4157 Pls 6369 4159 Pls 6736 4492 Pls 6736 4491 Pls 6736 4491 Pls 6736 4491 Pls 6736 4491 Pls 6736 4494 Pls 6736 4492 Pls 6736 4491 Pls 6736 4492 Pls 6736 4492 Pls 6736 4492 Pls 6736 4491 Pls 6736 4491 Pls 6736 4491 Pls 6736 4492 Pls 6736 4491 Pls 6736 4491 Pls 6736 4491 Pls 6736 4492 Pls 6736 4491 Pls 6736 4490 Pls 6736 4492 Pls 6736 4491 Pls 6736 4491 Pls 6736 4492 Pls 6736 4491 Pls 6736 4491 Pls 6736 4491 Pls 6736 4490 Pls 6736 4492 Pls 6736 4491 Pls 6736 4495 Pls 6736 4491 Pls 6736 4492 Pls 6736 4493 Pls 6736 4492 Pls 6736 4491 Pls 6736 4490 Pls 6736 4493 Pls 6736 4491 Pls 6736 4493 Pls 6736 4491 Pls 6736 4491 Pls 6736 4491 Pls 6736 4492 Pls 6736 4491 Pls 6736 4492 Pls 6736 4491 Pls 6736 4494 Pls 6736 4491 Pls 6736 4492 Pls 6736 4491 Pls 6736 4491 Pls 6736 4493 Pls 6736 4494 Pls 6736 4494 Pls 6736 4553 Pls 6736 4491 Pls 6736 4492 Pls 6736 4491 Pls 4413 4738 Pls % End plot #1 % Begin plot #2 1.000 UP 1.000 UL LT1 LC1 setrgbcolor LCb setrgbcolor 4130 4598 M [ [(Helvetica) 140.0 0.0 true true 0 (non_linear_memset_regression_ba arch 1)] ] -46.7 MRshow LT1 867 1659 Crs 867 847 Crs 867 731 Crs 867 688 Crs 867 739 Crs 867 712 Crs 867 680 Crs 867 809 Crs 867 677 Crs 867 615 Crs 867 616 Crs 867 681 Crs 867 705 Crs 867 700 Crs 867 719 Crs 867 797 Crs 867 664 Crs 867 611 Crs 867 646 Crs 867 688 Crs 867 681 Crs 867 807 Crs 867 673 Crs 867 679 Crs 867 594 Crs 867 627 Crs 867 643 Crs 867 599 Crs 867 591 Crs 867 657 Crs 867 772 Crs 867 688 Crs 867 646 Crs 867 724 Crs 867 663 Crs 867 621 Crs 867 580 Crs 867 585 Crs 867 638 Crs 867 683 Crs 867 662 Crs 867 650 Crs 867 669 Crs 867 641 Crs 867 835 Crs 867 562 Crs 867 601 Crs 867 586 Crs 867 568 Crs 867 744 Crs 867 518 Crs 867 535 Crs 867 533 Crs 867 568 Crs 867 604 Crs 867 547 Crs 867 527 Crs 867 538 Crs 867 509 Crs 867 537 Crs 867 596 Crs 1233 722 Crs 1233 623 Crs 1233 810 Crs 1233 700 Crs 1233 606 Crs 1233 719 Crs 1233 721 Crs 1233 640 Crs 1233 692 Crs 1233 636 Crs 1233 732 Crs 1233 711 Crs 1233 770 Crs 1233 660 Crs 1233 649 Crs 1233 659 Crs 1233 616 Crs 1233 622 Crs 1233 597 Crs 1233 677 Crs 1233 612 Crs 1233 674 Crs 1233 580 Crs 1233 780 Crs 1233 682 Crs 1233 631 Crs 1233 613 Crs 1233 621 Crs 1233 653 Crs 1233 649 Crs 1233 691 Crs 1233 625 Crs 1233 627 Crs 1233 620 Crs 1233 764 Crs 1233 584 Crs 1233 694 Crs 1233 664 Crs 1233 673 Crs 1233 619 Crs 1233 633 Crs 1233 685 Crs 1233 577 Crs 1233 605 Crs 1233 676 Crs 1233 666 Crs 1233 619 Crs 1233 626 Crs 1233 666 Crs 1233 645 Crs 1233 597 Crs 1233 678 Crs 1233 621 Crs 1233 597 Crs 1233 592 Crs 1233 600 Crs 1233 674 Crs 1233 623 Crs 1233 575 Crs 1600 895 Crs 1600 819 Crs 1600 785 Crs 1600 741 Crs 1600 738 Crs 1600 759 Crs 1600 1000 Crs 1600 781 Crs 1600 784 Crs 1600 829 Crs 1600 864 Crs 1600 711 Crs 1600 765 Crs 1600 710 Crs 1600 734 Crs 1600 767 Crs 1600 732 Crs 1600 721 Crs 1600 727 Crs 1600 741 Crs 1600 687 Crs 1600 784 Crs 1600 743 Crs 1600 869 Crs 1600 782 Crs 1600 725 Crs 1600 858 Crs 1600 770 Crs 1600 765 Crs 1600 738 Crs 1600 753 Crs 1600 729 Crs 1600 753 Crs 1600 775 Crs 1600 800 Crs 1600 740 Crs 1600 754 Crs 1600 732 Crs 1600 748 Crs 1600 748 Crs 1600 716 Crs 1600 708 Crs 1600 728 Crs 1600 747 Crs 1600 777 Crs 1600 755 Crs 1600 774 Crs 1600 767 Crs 1600 753 Crs 1600 738 Crs 1600 698 Crs 1600 769 Crs 1600 756 Crs 1600 752 Crs 1600 772 Crs 1600 710 Crs 1600 757 Crs 1600 795 Crs 1600 746 Crs 1600 746 Crs 1600 737 Crs 1600 722 Crs 1600 778 Crs 1600 784 Crs 1600 733 Crs 1600 757 Crs 1967 959 Crs 1967 873 Crs 1967 984 Crs 1967 905 Crs 1967 957 Crs 1967 928 Crs 1967 940 Crs 1967 891 Crs 1967 941 Crs 1967 896 Crs 1967 882 Crs 1967 934 Crs 1967 895 Crs 1967 928 Crs 1967 901 Crs 1967 888 Crs 1967 879 Crs 1967 940 Crs 1967 988 Crs 1967 908 Crs 1967 921 Crs 1967 997 Crs 1967 984 Crs 1967 979 Crs 1967 916 Crs 1967 934 Crs 1967 914 Crs 1967 929 Crs 1967 883 Crs 1967 888 Crs 1967 921 Crs 1967 919 Crs 1967 937 Crs 1967 924 Crs 1967 884 Crs 1967 680 Crs 1967 606 Crs 1967 588 Crs 1967 625 Crs 1967 631 Crs 1967 590 Crs 1967 603 Crs 1967 624 Crs 1967 612 Crs 1967 617 Crs 1967 686 Crs 1967 632 Crs 1967 637 Crs 1967 613 Crs 1967 602 Crs 1967 636 Crs 2334 869 Crs 2334 818 Crs 2334 866 Crs 2334 845 Crs 2334 832 Crs 2334 841 Crs 2334 856 Crs 2334 823 Crs 2334 829 Crs 2334 832 Crs 2334 833 Crs 2334 834 Crs 2334 806 Crs 2334 828 Crs 2334 810 Crs 2334 800 Crs 2334 793 Crs 2334 823 Crs 2334 815 Crs 2334 813 Crs 2334 801 Crs 2334 811 Crs 2334 805 Crs 2334 834 Crs 2334 810 Crs 2334 843 Crs 2334 844 Crs 2334 823 Crs 2334 811 Crs 2334 788 Crs 2334 869 Crs 2334 815 Crs 2334 804 Crs 2334 818 Crs 2334 822 Crs 2334 833 Crs 2334 815 Crs 2334 817 Crs 2334 832 Crs 2334 820 Crs 2334 813 Crs 2334 834 Crs 2334 842 Crs 2334 834 Crs 2334 830 Crs 2334 843 Crs 2334 827 Crs 2334 795 Crs 2334 797 Crs 2334 877 Crs 2334 812 Crs 2334 802 Crs 2334 838 Crs 2334 816 Crs 2334 863 Crs 2334 819 Crs 2334 836 Crs 2334 877 Crs 2334 835 Crs 2334 882 Crs 2334 814 Crs 2334 823 Crs 2701 1094 Crs 2701 1078 Crs 2701 1056 Crs 2701 1067 Crs 2701 1074 Crs 2701 1073 Crs 2701 1064 Crs 2701 1058 Crs 2701 1061 Crs 2701 1071 Crs 2701 1066 Crs 2701 1063 Crs 2701 1070 Crs 2701 1073 Crs 2701 1060 Crs 2701 1063 Crs 2701 1048 Crs 2701 1058 Crs 2701 1062 Crs 2701 1075 Crs 2701 1074 Crs 2701 1064 Crs 2701 1074 Crs 2701 1061 Crs 2701 1051 Crs 2701 1059 Crs 2701 1074 Crs 2701 1063 Crs 2701 1050 Crs 2701 1067 Crs 2701 1066 Crs 2701 1071 Crs 2701 1072 Crs 2701 1060 Crs 2701 1063 Crs 2701 1056 Crs 2701 1056 Crs 2701 1077 Crs 2701 1060 Crs 2701 1065 Crs 2701 1058 Crs 2701 1044 Crs 2701 1101 Crs 2701 1066 Crs 2701 1060 Crs 2701 1072 Crs 2701 1055 Crs 2701 1058 Crs 2701 1061 Crs 2701 1076 Crs 2701 1057 Crs 2701 1061 Crs 2701 1082 Crs 2701 1071 Crs 2701 1069 Crs 2701 1051 Crs 2701 1068 Crs 2701 1053 Crs 3068 1326 Crs 3068 1304 Crs 3068 1268 Crs 3068 1267 Crs 3068 1254 Crs 3068 1307 Crs 3068 1307 Crs 3068 1306 Crs 3068 1317 Crs 3068 1314 Crs 3068 1311 Crs 3068 1313 Crs 3068 1314 Crs 3068 1314 Crs 3068 1304 Crs 3068 1336 Crs 3068 1309 Crs 3068 1313 Crs 3068 1272 Crs 3068 1303 Crs 3068 1293 Crs 3068 1297 Crs 3068 1305 Crs 3068 1218 Crs 3068 1304 Crs 3068 1306 Crs 3068 1308 Crs 3068 1306 Crs 3068 1301 Crs 3068 1313 Crs 3068 1314 Crs 3068 1316 Crs 3068 1299 Crs 3068 1301 Crs 3068 1302 Crs 3068 1297 Crs 3068 1299 Crs 3068 1302 Crs 3068 1313 Crs 3068 1303 Crs 3068 1302 Crs 3068 1314 Crs 3068 1317 Crs 3068 1320 Crs 3068 1308 Crs 3068 1311 Crs 3068 1303 Crs 3068 1311 Crs 3068 1309 Crs 3068 1321 Crs 3068 1312 Crs 3068 1313 Crs 3068 1305 Crs 3068 1309 Crs 3068 1321 Crs 3068 1309 Crs 3068 1323 Crs 3068 1314 Crs 3068 1320 Crs 3068 1306 Crs 3068 1310 Crs 3068 1306 Crs 3068 1298 Crs 3068 1310 Crs 3068 1306 Crs 3434 1284 Crs 3434 1535 Crs 3434 1516 Crs 3434 1595 Crs 3434 1598 Crs 3434 1585 Crs 3434 1584 Crs 3434 1594 Crs 3434 1602 Crs 3434 1595 Crs 3434 1596 Crs 3434 1593 Crs 3434 1591 Crs 3434 1597 Crs 3434 1592 Crs 3434 1587 Crs 3434 1599 Crs 3434 1585 Crs 3434 1610 Crs 3434 1600 Crs 3434 1596 Crs 3434 1593 Crs 3434 1602 Crs 3434 1593 Crs 3434 1593 Crs 3434 1592 Crs 3434 1590 Crs 3434 1595 Crs 3434 1604 Crs 3434 1592 Crs 3434 1606 Crs 3434 1594 Crs 3434 1602 Crs 3434 1588 Crs 3434 1597 Crs 3434 1598 Crs 3434 1597 Crs 3434 1592 Crs 3434 1599 Crs 3434 1597 Crs 3434 1585 Crs 3434 1594 Crs 3434 1584 Crs 3434 1590 Crs 3434 1594 Crs 3434 1604 Crs 3434 1597 Crs 3434 1598 Crs 3434 1593 Crs 3434 1578 Crs 3434 1595 Crs 3434 1603 Crs 3434 1590 Crs 3434 1589 Crs 3434 1596 Crs 3434 1592 Crs 3434 1588 Crs 3434 1598 Crs 3434 1582 Crs 3434 1604 Crs 3434 1592 Crs 3434 1596 Crs 3434 1597 Crs 3434 1584 Crs 3434 1593 Crs 3434 1599 Crs 3434 1597 Crs 3801 1606 Crs 3801 1816 Crs 3801 1767 Crs 3801 1763 Crs 3801 1813 Crs 3801 1814 Crs 3801 1815 Crs 3801 1821 Crs 3801 1815 Crs 3801 1828 Crs 3801 1818 Crs 3801 1825 Crs 3801 1816 Crs 3801 1812 Crs 3801 1810 Crs 3801 1826 Crs 3801 1818 Crs 3801 1817 Crs 3801 1824 Crs 3801 1818 Crs 3801 1821 Crs 3801 1806 Crs 3801 1818 Crs 3801 1820 Crs 3801 1820 Crs 3801 1820 Crs 3801 1787 Crs 3801 1830 Crs 3801 1822 Crs 3801 1815 Crs 3801 1823 Crs 3801 1808 Crs 3801 1814 Crs 3801 1816 Crs 3801 1803 Crs 3801 1816 Crs 3801 1819 Crs 3801 1824 Crs 3801 1820 Crs 3801 1805 Crs 3801 1811 Crs 3801 1794 Crs 3801 1820 Crs 3801 1822 Crs 3801 1823 Crs 3801 1813 Crs 3801 1813 Crs 3801 1813 Crs 3801 1823 Crs 3801 1823 Crs 3801 1812 Crs 3801 1818 Crs 3801 1817 Crs 3801 1824 Crs 3801 1822 Crs 3801 1810 Crs 3801 1813 Crs 3801 1816 Crs 3801 1817 Crs 3801 1822 Crs 3801 1827 Crs 3801 1820 Crs 3801 1822 Crs 3801 1817 Crs 3801 1819 Crs 3801 1822 Crs 3801 1814 Crs 3801 1829 Crs 3801 1816 Crs 3801 1810 Crs 3801 1813 Crs 3801 1818 Crs 3801 1821 Crs 3801 1820 Crs 4168 2048 Crs 4168 2059 Crs 4168 2059 Crs 4168 2057 Crs 4168 2054 Crs 4168 2055 Crs 4168 2050 Crs 4168 2042 Crs 4168 2051 Crs 4168 2055 Crs 4168 2053 Crs 4168 2057 Crs 4168 2055 Crs 4168 2062 Crs 4168 2063 Crs 4168 2062 Crs 4168 2052 Crs 4168 2059 Crs 4168 2062 Crs 4168 2060 Crs 4168 2056 Crs 4168 2060 Crs 4168 2059 Crs 4168 2057 Crs 4168 2053 Crs 4168 2054 Crs 4168 2055 Crs 4168 2061 Crs 4168 2062 Crs 4168 2060 Crs 4168 2061 Crs 4168 2060 Crs 4168 2049 Crs 4168 2057 Crs 4168 2055 Crs 4168 2060 Crs 4168 2051 Crs 4168 2065 Crs 4168 2054 Crs 4168 2064 Crs 4168 2058 Crs 4168 2053 Crs 4168 2059 Crs 4168 2063 Crs 4168 2061 Crs 4168 2055 Crs 4168 2056 Crs 4168 2049 Crs 4168 2059 Crs 4168 2061 Crs 4168 2048 Crs 4168 2064 Crs 4168 2057 Crs 4168 2063 Crs 4168 2068 Crs 4168 2056 Crs 4168 2059 Crs 4168 2064 Crs 4168 2054 Crs 4168 2055 Crs 4168 2057 Crs 4168 2065 Crs 4168 2054 Crs 4168 2056 Crs 4168 2058 Crs 4168 2060 Crs 4168 2054 Crs 4168 2061 Crs 4168 2053 Crs 4168 2057 Crs 4168 2054 Crs 4168 2054 Crs 4535 2489 Crs 4535 2486 Crs 4535 2483 Crs 4535 2485 Crs 4535 2484 Crs 4535 2484 Crs 4535 2485 Crs 4535 2484 Crs 4535 2483 Crs 4535 2482 Crs 4535 2477 Crs 4535 2477 Crs 4535 2486 Crs 4535 2484 Crs 4535 2485 Crs 4535 2489 Crs 4535 2485 Crs 4535 2484 Crs 4535 2484 Crs 4535 2488 Crs 4535 2484 Crs 4535 2484 Crs 4535 2484 Crs 4535 2482 Crs 4535 2487 Crs 4535 2482 Crs 4535 2486 Crs 4535 2482 Crs 4535 2483 Crs 4535 2481 Crs 4535 2480 Crs 4535 2477 Crs 4535 2483 Crs 4535 2485 Crs 4535 2484 Crs 4535 2485 Crs 4535 2484 Crs 4535 2485 Crs 4535 2486 Crs 4535 2483 Crs 4535 2484 Crs 4535 2482 Crs 4535 2497 Crs 4535 2483 Crs 4535 2485 Crs 4535 2484 Crs 4535 2486 Crs 4535 2487 Crs 4535 2482 Crs 4535 2485 Crs 4535 2487 Crs 4535 2486 Crs 4535 2485 Crs 4535 2484 Crs 4535 2483 Crs 4535 2483 Crs 4535 2486 Crs 4535 2487 Crs 4535 2487 Crs 4535 2491 Crs 4535 2484 Crs 4535 2486 Crs 4535 2485 Crs 4535 2484 Crs 4535 2485 Crs 4535 2483 Crs 4535 2485 Crs 4902 2820 Crs 4902 2819 Crs 4902 2819 Crs 4902 2820 Crs 4902 2817 Crs 4902 2818 Crs 4902 2819 Crs 4902 2816 Crs 4902 2821 Crs 4902 2816 Crs 4902 2810 Crs 4902 2810 Crs 4902 2820 Crs 4902 2819 Crs 4902 2818 Crs 4902 2818 Crs 4902 2817 Crs 4902 2818 Crs 4902 2818 Crs 4902 2816 Crs 4902 2819 Crs 4902 2818 Crs 4902 2817 Crs 4902 2835 Crs 4902 2816 Crs 4902 2818 Crs 4902 2818 Crs 4902 2818 Crs 4902 2815 Crs 4902 2819 Crs 4902 2817 Crs 4902 2821 Crs 4902 2817 Crs 4902 2820 Crs 4902 2818 Crs 4902 2818 Crs 4902 2818 Crs 4902 2815 Crs 4902 2817 Crs 4902 2818 Crs 4902 2816 Crs 4902 2818 Crs 4902 2821 Crs 4902 2817 Crs 4902 2819 Crs 4902 2817 Crs 4902 2810 Crs 4902 2809 Crs 4902 2820 Crs 4902 2821 Crs 4902 2818 Crs 4902 2818 Crs 4902 2818 Crs 4902 2817 Crs 4902 2820 Crs 4902 2819 Crs 4902 2811 Crs 4902 2815 Crs 4902 2817 Crs 4902 2825 Crs 4902 2816 Crs 4902 2816 Crs 4902 2819 Crs 4902 2820 Crs 4902 2817 Crs 4902 2819 Crs 4902 2818 Crs 4902 2816 Crs 4902 2817 Crs 4902 2819 Crs 4902 2818 Crs 5269 3152 Crs 5269 3151 Crs 5269 3153 Crs 5269 3152 Crs 5269 3153 Crs 5269 3152 Crs 5269 3151 Crs 5269 3151 Crs 5269 3144 Crs 5269 3156 Crs 5269 3154 Crs 5269 3150 Crs 5269 3151 Crs 5269 3146 Crs 5269 3150 Crs 5269 3152 Crs 5269 3150 Crs 5269 3152 Crs 5269 3151 Crs 5269 3150 Crs 5269 3151 Crs 5269 3155 Crs 5269 3150 Crs 5269 3153 Crs 5269 3153 Crs 5269 3150 Crs 5269 3152 Crs 5269 3152 Crs 5269 3150 Crs 5269 3159 Crs 5269 3147 Crs 5269 3152 Crs 5269 3151 Crs 5269 3152 Crs 5269 3150 Crs 5269 3150 Crs 5269 3151 Crs 5269 3152 Crs 5269 3151 Crs 5269 3154 Crs 5269 3150 Crs 5269 3151 Crs 5269 3152 Crs 5269 3152 Crs 5269 3153 Crs 5269 3155 Crs 5269 3150 Crs 5269 3155 Crs 5269 3153 Crs 5269 3150 Crs 5269 3152 Crs 5269 3152 Crs 5269 3152 Crs 5269 3150 Crs 5269 3151 Crs 5269 3151 Crs 5269 3143 Crs 5269 3151 Crs 5269 3154 Crs 5635 3483 Crs 5635 3484 Crs 5635 3485 Crs 5635 3485 Crs 5635 3484 Crs 5635 3486 Crs 5635 3483 Crs 5635 3483 Crs 5635 3487 Crs 5635 3479 Crs 5635 3486 Crs 5635 3485 Crs 5635 3484 Crs 5635 3483 Crs 5635 3485 Crs 5635 3486 Crs 5635 3484 Crs 5635 3485 Crs 5635 3483 Crs 5635 3485 Crs 5635 3484 Crs 5635 3486 Crs 5635 3483 Crs 5635 3476 Crs 5635 3485 Crs 5635 3483 Crs 5635 3484 Crs 5635 3487 Crs 5635 3484 Crs 5635 3487 Crs 5635 3486 Crs 5635 3484 Crs 5635 3483 Crs 5635 3483 Crs 5635 3485 Crs 5635 3485 Crs 5635 3485 Crs 5635 3486 Crs 5635 3484 Crs 5635 3484 Crs 5635 3483 Crs 5635 3479 Crs 5635 3484 Crs 5635 3482 Crs 5635 3483 Crs 5635 3483 Crs 5635 3488 Crs 5635 3487 Crs 5635 3484 Crs 5635 3484 Crs 5635 3483 Crs 5635 3485 Crs 5635 3485 Crs 5635 3476 Crs 5635 3483 Crs 5635 3488 Crs 5635 3485 Crs 5635 3485 Crs 5635 3485 Crs 5635 3483 Crs 5635 3484 Crs 5635 3486 Crs 5635 3483 Crs 5635 3485 Crs 5635 3481 Crs 6002 3816 Crs 6002 3818 Crs 6002 3814 Crs 6002 3819 Crs 6002 3814 Crs 6002 3816 Crs 6002 3818 Crs 6002 3818 Crs 6002 3818 Crs 6002 3813 Crs 6002 3818 Crs 6002 3814 Crs 6002 3816 Crs 6002 3818 Crs 6002 3819 Crs 6002 3818 Crs 6002 3817 Crs 6002 3819 Crs 6002 3817 Crs 6002 3818 Crs 6002 3813 Crs 6002 3817 Crs 6002 3817 Crs 6002 3818 Crs 6002 3815 Crs 6002 3816 Crs 6002 3819 Crs 6002 3818 Crs 6002 3818 Crs 6002 3816 Crs 6002 3818 Crs 6002 3817 Crs 6002 3818 Crs 6002 3818 Crs 6002 3819 Crs 6002 3817 Crs 6002 3818 Crs 6002 3821 Crs 6002 3814 Crs 6002 3816 Crs 6002 3815 Crs 6002 3818 Crs 6002 3819 Crs 6002 3817 Crs 6002 3818 Crs 6002 3818 Crs 6002 3818 Crs 6002 3816 Crs 6002 3819 Crs 6002 3817 Crs 6002 3818 Crs 6002 3817 Crs 6002 3817 Crs 6002 3817 Crs 6002 3817 Crs 6002 3835 Crs 6002 3819 Crs 6002 3818 Crs 6002 3824 Crs 6002 3815 Crs 6002 3819 Crs 6002 3816 Crs 6002 3818 Crs 6002 3817 Crs 6002 3816 Crs 6002 3818 Crs 6002 3817 Crs 6369 4151 Crs 6369 4149 Crs 6369 4148 Crs 6369 4150 Crs 6369 4151 Crs 6369 4151 Crs 6369 4150 Crs 6369 4151 Crs 6369 4150 Crs 6369 4150 Crs 6369 4151 Crs 6369 4151 Crs 6369 4150 Crs 6369 4150 Crs 6369 4149 Crs 6369 4148 Crs 6369 4148 Crs 6369 4150 Crs 6369 4151 Crs 6369 4151 Crs 6369 4151 Crs 6369 4150 Crs 6369 4148 Crs 6369 4149 Crs 6369 4150 Crs 6369 4150 Crs 6369 4149 Crs 6369 4149 Crs 6369 4150 Crs 6369 4149 Crs 6369 4149 Crs 6369 4150 Crs 6369 4150 Crs 6369 4150 Crs 6369 4151 Crs 6369 4151 Crs 6369 4151 Crs 6369 4149 Crs 6369 4149 Crs 6369 4148 Crs 6369 4149 Crs 6369 4150 Crs 6369 4150 Crs 6369 4150 Crs 6369 4148 Crs 6369 4150 Crs 6369 4147 Crs 6369 4150 Crs 6369 4150 Crs 6369 4149 Crs 6369 4150 Crs 6369 4149 Crs 6369 4149 Crs 6369 4148 Crs 6369 4150 Crs 6369 4150 Crs 6369 4148 Crs 6369 4150 Crs 6369 4150 Crs 6369 4150 Crs 6369 4150 Crs 6369 4150 Crs 6369 4151 Crs 6369 4151 Crs 6736 4483 Crs 6736 4482 Crs 6736 4483 Crs 6736 4483 Crs 6736 4482 Crs 6736 4483 Crs 6736 4482 Crs 6736 4483 Crs 6736 4482 Crs 6736 4483 Crs 6736 4482 Crs 6736 4482 Crs 6736 4483 Crs 6736 4482 Crs 6736 4483 Crs 6736 4482 Crs 6736 4483 Crs 6736 4483 Crs 6736 4482 Crs 6736 4484 Crs 6736 4481 Crs 6736 4483 Crs 6736 4483 Crs 6736 4483 Crs 6736 4482 Crs 6736 4482 Crs 6736 4483 Crs 6736 4483 Crs 6736 4482 Crs 6736 4483 Crs 6736 4482 Crs 6736 4483 Crs 6736 4482 Crs 6736 4483 Crs 6736 4482 Crs 6736 4484 Crs 6736 4482 Crs 6736 4482 Crs 6736 4482 Crs 6736 4482 Crs 6736 4484 Crs 6736 4484 Crs 6736 4482 Crs 6736 4483 Crs 6736 4484 Crs 6736 4482 Crs 6736 4482 Crs 6736 4483 Crs 6736 4483 Crs 6736 4483 Crs 6736 4483 Crs 6736 4483 Crs 6736 4482 Crs 6736 4483 Crs 6736 4482 Crs 6736 4483 Crs 6736 4482 Crs 6736 4482 Crs 6736 4484 Crs 6736 4482 Crs 6736 4484 Crs 6736 4482 Crs 6736 4483 Crs 6736 4482 Crs 6736 4482 Crs 6736 4483 Crs 6736 4483 Crs 6736 4483 Crs 6736 4482 Crs 6736 4483 Crs 6736 4517 Crs 6736 4484 Crs 6736 4484 Crs 6736 4483 Crs 4413 4598 Crs % End plot #2 % Begin plot #3 1.000 UP 1.000 UL LT2 LC2 setrgbcolor LCb setrgbcolor 4130 4458 M [ [(Helvetica) 140.0 0.0 true true 0 (non_linear_memset_regression_ba arch 2)] ] -46.7 MRshow LT2 867 1117 Star 867 782 Star 867 752 Star 867 733 Star 867 763 Star 867 749 Star 867 832 Star 867 670 Star 867 682 Star 867 570 Star 867 699 Star 867 602 Star 867 722 Star 867 677 Star 867 693 Star 867 620 Star 867 653 Star 867 629 Star 867 638 Star 867 623 Star 867 596 Star 867 624 Star 867 646 Star 867 602 Star 867 605 Star 867 684 Star 867 676 Star 867 683 Star 867 683 Star 867 584 Star 867 653 Star 867 625 Star 867 661 Star 867 686 Star 867 792 Star 867 684 Star 867 627 Star 867 671 Star 867 700 Star 867 697 Star 867 690 Star 867 735 Star 867 707 Star 867 594 Star 867 554 Star 867 517 Star 867 582 Star 867 635 Star 867 518 Star 867 536 Star 867 574 Star 867 612 Star 1233 808 Star 1233 684 Star 1233 781 Star 1233 776 Star 1233 653 Star 1233 695 Star 1233 595 Star 1233 618 Star 1233 703 Star 1233 781 Star 1233 605 Star 1233 654 Star 1233 586 Star 1233 588 Star 1233 605 Star 1233 633 Star 1233 587 Star 1233 659 Star 1233 594 Star 1233 571 Star 1233 630 Star 1233 574 Star 1233 629 Star 1233 669 Star 1233 651 Star 1233 699 Star 1233 610 Star 1233 588 Star 1233 652 Star 1233 570 Star 1233 575 Star 1233 579 Star 1233 627 Star 1233 618 Star 1233 651 Star 1233 647 Star 1233 637 Star 1233 595 Star 1233 673 Star 1233 642 Star 1233 671 Star 1233 633 Star 1233 614 Star 1233 658 Star 1233 669 Star 1233 760 Star 1233 679 Star 1233 628 Star 1233 613 Star 1233 587 Star 1233 666 Star 1600 675 Star 1600 756 Star 1600 802 Star 1600 762 Star 1600 751 Star 1600 817 Star 1600 762 Star 1600 783 Star 1600 783 Star 1600 881 Star 1600 736 Star 1600 723 Star 1600 721 Star 1600 718 Star 1600 714 Star 1600 709 Star 1600 675 Star 1600 698 Star 1600 782 Star 1600 774 Star 1600 758 Star 1600 765 Star 1600 773 Star 1600 724 Star 1600 777 Star 1600 731 Star 1600 732 Star 1600 710 Star 1600 755 Star 1600 789 Star 1600 740 Star 1600 767 Star 1600 742 Star 1600 698 Star 1600 775 Star 1600 770 Star 1600 750 Star 1600 725 Star 1600 741 Star 1600 775 Star 1600 774 Star 1600 776 Star 1600 750 Star 1600 736 Star 1600 841 Star 1600 670 Star 1600 764 Star 1600 772 Star 1600 767 Star 1600 750 Star 1600 794 Star 1600 758 Star 1600 737 Star 1600 696 Star 1600 691 Star 1600 725 Star 1967 937 Star 1967 898 Star 1967 944 Star 1967 917 Star 1967 976 Star 1967 893 Star 1967 957 Star 1967 900 Star 1967 906 Star 1967 904 Star 1967 931 Star 1967 938 Star 1967 940 Star 1967 918 Star 1967 996 Star 1967 950 Star 1967 913 Star 1967 919 Star 1967 895 Star 1967 934 Star 1967 914 Star 1967 916 Star 1967 875 Star 1967 938 Star 1967 904 Star 1967 939 Star 1967 894 Star 1967 935 Star 1967 913 Star 1967 910 Star 1967 919 Star 1967 929 Star 1967 1842 Star 1967 688 Star 1967 619 Star 1967 607 Star 1967 590 Star 1967 582 Star 1967 587 Star 1967 578 Star 1967 640 Star 1967 613 Star 1967 609 Star 1967 610 Star 1967 627 Star 1967 598 Star 1967 613 Star 1967 598 Star 1967 638 Star 1967 578 Star 1967 581 Star 1967 595 Star 2334 828 Star 2334 856 Star 2334 806 Star 2334 819 Star 2334 844 Star 2334 823 Star 2334 810 Star 2334 815 Star 2334 820 Star 2334 808 Star 2334 800 Star 2334 837 Star 2334 816 Star 2334 820 Star 2334 812 Star 2334 801 Star 2334 802 Star 2334 807 Star 2334 811 Star 2334 834 Star 2334 804 Star 2334 827 Star 2334 839 Star 2334 818 Star 2334 822 Star 2334 836 Star 2334 801 Star 2334 817 Star 2334 807 Star 2334 832 Star 2334 805 Star 2334 799 Star 2334 803 Star 2334 807 Star 2334 828 Star 2334 805 Star 2334 817 Star 2334 832 Star 2334 813 Star 2334 828 Star 2334 840 Star 2334 815 Star 2334 788 Star 2334 804 Star 2334 810 Star 2334 841 Star 2334 848 Star 2334 818 Star 2334 820 Star 2334 813 Star 2334 837 Star 2334 820 Star 2334 812 Star 2334 809 Star 2334 808 Star 2334 802 Star 2334 883 Star 2334 838 Star 2334 814 Star 2334 840 Star 2334 825 Star 2334 801 Star 2334 839 Star 2334 802 Star 2334 849 Star 2334 844 Star 2701 995 Star 2701 1034 Star 2701 1011 Star 2701 1073 Star 2701 1088 Star 2701 1072 Star 2701 1082 Star 2701 1093 Star 2701 990 Star 2701 1017 Star 2701 1049 Star 2701 1051 Star 2701 1068 Star 2701 1053 Star 2701 1060 Star 2701 1052 Star 2701 1081 Star 2701 1064 Star 2701 1074 Star 2701 1074 Star 2701 1065 Star 2701 1069 Star 2701 1055 Star 2701 1052 Star 2701 1062 Star 2701 1068 Star 2701 1053 Star 2701 1055 Star 2701 1069 Star 2701 1061 Star 2701 1053 Star 2701 1059 Star 2701 1045 Star 2701 1065 Star 2701 1067 Star 2701 1070 Star 2701 1060 Star 2701 1049 Star 2701 1064 Star 2701 1072 Star 2701 1046 Star 2701 1068 Star 2701 1071 Star 2701 1067 Star 2701 1060 Star 2701 1062 Star 2701 1073 Star 2701 1105 Star 2701 1059 Star 2701 1129 Star 3068 1037 Star 3068 1256 Star 3068 1322 Star 3068 1309 Star 3068 1270 Star 3068 1283 Star 3068 1326 Star 3068 1313 Star 3068 1309 Star 3068 1299 Star 3068 1307 Star 3068 1314 Star 3068 1323 Star 3068 1311 Star 3068 1310 Star 3068 1304 Star 3068 1305 Star 3068 1318 Star 3068 1320 Star 3068 1310 Star 3068 1301 Star 3068 1282 Star 3068 1324 Star 3068 1313 Star 3068 1317 Star 3068 1248 Star 3068 1301 Star 3068 1311 Star 3068 1307 Star 3068 1316 Star 3068 1306 Star 3068 1305 Star 3068 1306 Star 3068 1311 Star 3068 1313 Star 3068 1317 Star 3068 1319 Star 3068 1310 Star 3068 1312 Star 3068 1305 Star 3068 1301 Star 3068 1290 Star 3068 1305 Star 3068 1313 Star 3068 1302 Star 3068 1312 Star 3068 1315 Star 3068 1305 Star 3068 1334 Star 3068 1315 Star 3068 1313 Star 3068 1306 Star 3068 1316 Star 3068 1308 Star 3068 1303 Star 3068 1306 Star 3068 1310 Star 3068 1315 Star 3434 1548 Star 3434 1602 Star 3434 1598 Star 3434 1581 Star 3434 1603 Star 3434 1586 Star 3434 1601 Star 3434 1593 Star 3434 1589 Star 3434 1603 Star 3434 1596 Star 3434 1597 Star 3434 1596 Star 3434 1594 Star 3434 1595 Star 3434 1605 Star 3434 1602 Star 3434 1599 Star 3434 1592 Star 3434 1599 Star 3434 1595 Star 3434 1603 Star 3434 1590 Star 3434 1598 Star 3434 1593 Star 3434 1599 Star 3434 1598 Star 3434 1603 Star 3434 1594 Star 3434 1588 Star 3434 1606 Star 3434 1601 Star 3434 1600 Star 3434 1596 Star 3434 1593 Star 3434 1593 Star 3434 1598 Star 3434 1598 Star 3434 1600 Star 3434 1606 Star 3434 1594 Star 3434 1597 Star 3434 1594 Star 3434 1600 Star 3434 1599 Star 3434 1601 Star 3434 1601 Star 3434 1600 Star 3434 1604 Star 3434 1608 Star 3434 1608 Star 3434 1587 Star 3434 1599 Star 3801 1782 Star 3801 1809 Star 3801 1809 Star 3801 1829 Star 3801 1813 Star 3801 1813 Star 3801 1815 Star 3801 1823 Star 3801 1827 Star 3801 1819 Star 3801 1821 Star 3801 1813 Star 3801 1820 Star 3801 1827 Star 3801 1820 Star 3801 1822 Star 3801 1829 Star 3801 1817 Star 3801 1821 Star 3801 1817 Star 3801 1822 Star 3801 1817 Star 3801 1818 Star 3801 1814 Star 3801 1819 Star 3801 1816 Star 3801 1830 Star 3801 1813 Star 3801 1815 Star 3801 1821 Star 3801 1818 Star 3801 1841 Star 3801 1823 Star 3801 1815 Star 3801 1816 Star 3801 1822 Star 3801 1811 Star 3801 1823 Star 3801 1828 Star 3801 1823 Star 3801 1815 Star 3801 1820 Star 3801 1819 Star 3801 1813 Star 3801 1824 Star 3801 1815 Star 3801 1815 Star 3801 1821 Star 3801 1819 Star 3801 1828 Star 3801 1832 Star 3801 1837 Star 3801 1810 Star 3801 1811 Star 3801 1811 Star 3801 1826 Star 3801 1822 Star 3801 1810 Star 3801 1823 Star 3801 1820 Star 3801 1812 Star 3801 1821 Star 3801 1821 Star 4168 2066 Star 4168 2061 Star 4168 2063 Star 4168 2052 Star 4168 2054 Star 4168 2063 Star 4168 2060 Star 4168 2044 Star 4168 2051 Star 4168 2054 Star 4168 2061 Star 4168 2051 Star 4168 2052 Star 4168 2068 Star 4168 2058 Star 4168 2058 Star 4168 2055 Star 4168 2061 Star 4168 2059 Star 4168 2053 Star 4168 2056 Star 4168 2057 Star 4168 2060 Star 4168 2060 Star 4168 2062 Star 4168 2059 Star 4168 2054 Star 4168 2056 Star 4168 2051 Star 4168 2063 Star 4168 2050 Star 4168 2058 Star 4168 2052 Star 4168 2065 Star 4168 2054 Star 4168 2056 Star 4168 2052 Star 4168 2053 Star 4168 2033 Star 4168 2057 Star 4168 2049 Star 4168 2057 Star 4168 2067 Star 4168 2067 Star 4168 2061 Star 4168 2059 Star 4168 2067 Star 4168 2050 Star 4168 2065 Star 4168 2063 Star 4168 2066 Star 4168 2063 Star 4168 2051 Star 4168 2058 Star 4535 2498 Star 4535 2489 Star 4535 2486 Star 4535 2487 Star 4535 2484 Star 4535 2488 Star 4535 2485 Star 4535 2489 Star 4535 2490 Star 4535 2483 Star 4535 2480 Star 4535 2479 Star 4535 2491 Star 4535 2488 Star 4535 2490 Star 4535 2487 Star 4535 2501 Star 4535 2486 Star 4535 2486 Star 4535 2491 Star 4535 2488 Star 4535 2480 Star 4535 2481 Star 4535 2488 Star 4535 2488 Star 4535 2487 Star 4535 2488 Star 4535 2487 Star 4535 2491 Star 4535 2488 Star 4535 2491 Star 4535 2490 Star 4535 2485 Star 4535 2487 Star 4535 2488 Star 4535 2487 Star 4535 2490 Star 4535 2486 Star 4535 2487 Star 4535 2489 Star 4535 2487 Star 4535 2487 Star 4535 2485 Star 4535 2486 Star 4535 2491 Star 4535 2488 Star 4535 2487 Star 4535 2489 Star 4535 2485 Star 4535 2487 Star 4535 2491 Star 4902 2826 Star 4902 2820 Star 4902 2819 Star 4902 2821 Star 4902 2820 Star 4902 2812 Star 4902 2821 Star 4902 2821 Star 4902 2819 Star 4902 2820 Star 4902 2823 Star 4902 2821 Star 4902 2820 Star 4902 2821 Star 4902 2815 Star 4902 2812 Star 4902 2822 Star 4902 2823 Star 4902 2820 Star 4902 2821 Star 4902 2821 Star 4902 2822 Star 4902 2820 Star 4902 2820 Star 4902 2818 Star 4902 2822 Star 4902 2820 Star 4902 2821 Star 4902 2823 Star 4902 2820 Star 4902 2819 Star 4902 2818 Star 4902 2822 Star 4902 2820 Star 4902 2820 Star 4902 2820 Star 4902 2821 Star 4902 2820 Star 4902 2812 Star 4902 2823 Star 4902 2821 Star 4902 2821 Star 4902 2820 Star 4902 2821 Star 4902 2821 Star 4902 2821 Star 4902 2815 Star 4902 2820 Star 4902 2822 Star 4902 2820 Star 4902 2820 Star 4902 2822 Star 4902 2822 Star 4902 2821 Star 5269 3154 Star 5269 3155 Star 5269 3154 Star 5269 3153 Star 5269 3147 Star 5269 3155 Star 5269 3154 Star 5269 3154 Star 5269 3154 Star 5269 3154 Star 5269 3154 Star 5269 3154 Star 5269 3154 Star 5269 3154 Star 5269 3153 Star 5269 3154 Star 5269 3154 Star 5269 3154 Star 5269 3153 Star 5269 3153 Star 5269 3154 Star 5269 3156 Star 5269 3154 Star 5269 3152 Star 5269 3148 Star 5269 3155 Star 5269 3153 Star 5269 3148 Star 5269 3153 Star 5269 3157 Star 5269 3154 Star 5269 3156 Star 5269 3153 Star 5269 3153 Star 5269 3161 Star 5269 3151 Star 5269 3147 Star 5269 3155 Star 5269 3152 Star 5269 3153 Star 5269 3156 Star 5269 3153 Star 5269 3147 Star 5269 3153 Star 5269 3155 Star 5269 3153 Star 5269 3153 Star 5269 3155 Star 5269 3155 Star 5269 3153 Star 5269 3154 Star 5269 3153 Star 5269 3161 Star 5269 3153 Star 5269 3154 Star 5269 3155 Star 5269 3153 Star 5269 3152 Star 5635 3485 Star 5635 3490 Star 5635 3487 Star 5635 3486 Star 5635 3486 Star 5635 3487 Star 5635 3486 Star 5635 3488 Star 5635 3487 Star 5635 3486 Star 5635 3488 Star 5635 3486 Star 5635 3486 Star 5635 3486 Star 5635 3490 Star 5635 3488 Star 5635 3486 Star 5635 3482 Star 5635 3489 Star 5635 3486 Star 5635 3481 Star 5635 3491 Star 5635 3486 Star 5635 3487 Star 5635 3488 Star 5635 3488 Star 5635 3488 Star 5635 3486 Star 5635 3485 Star 5635 3487 Star 5635 3488 Star 5635 3488 Star 5635 3485 Star 5635 3487 Star 5635 3487 Star 5635 3489 Star 5635 3487 Star 5635 3486 Star 5635 3489 Star 5635 3485 Star 5635 3486 Star 5635 3489 Star 5635 3488 Star 5635 3486 Star 5635 3487 Star 5635 3487 Star 5635 3487 Star 5635 3482 Star 5635 3487 Star 5635 3486 Star 5635 3487 Star 5635 3486 Star 5635 3488 Star 5635 3490 Star 6002 3821 Star 6002 3821 Star 6002 3820 Star 6002 3816 Star 6002 3820 Star 6002 3820 Star 6002 3820 Star 6002 3819 Star 6002 3821 Star 6002 3819 Star 6002 3817 Star 6002 3819 Star 6002 3821 Star 6002 3820 Star 6002 3821 Star 6002 3822 Star 6002 3820 Star 6002 3820 Star 6002 3819 Star 6002 3822 Star 6002 3817 Star 6002 3820 Star 6002 3819 Star 6002 3819 Star 6002 3822 Star 6002 3816 Star 6002 3820 Star 6002 3817 Star 6002 3820 Star 6002 3819 Star 6002 3818 Star 6002 3821 Star 6002 3815 Star 6002 3820 Star 6002 3821 Star 6002 3819 Star 6002 3821 Star 6002 3820 Star 6002 3820 Star 6002 3820 Star 6002 3820 Star 6002 3816 Star 6002 3820 Star 6002 3817 Star 6002 3822 Star 6002 3820 Star 6002 3818 Star 6002 3820 Star 6002 3820 Star 6002 3819 Star 6002 3815 Star 6002 3827 Star 6002 3820 Star 6002 3820 Star 6002 3820 Star 6002 3820 Star 6002 3820 Star 6002 3822 Star 6002 3820 Star 6002 3823 Star 6002 3822 Star 6002 3816 Star 6369 4154 Star 6369 4152 Star 6369 4154 Star 6369 4153 Star 6369 4152 Star 6369 4150 Star 6369 4153 Star 6369 4152 Star 6369 4150 Star 6369 4153 Star 6369 4154 Star 6369 4154 Star 6369 4151 Star 6369 4150 Star 6369 4152 Star 6369 4153 Star 6369 4153 Star 6369 4153 Star 6369 4152 Star 6369 4152 Star 6369 4150 Star 6369 4152 Star 6369 4154 Star 6369 4153 Star 6369 4154 Star 6369 4152 Star 6369 4153 Star 6369 4154 Star 6369 4152 Star 6369 4154 Star 6369 4152 Star 6369 4151 Star 6369 4150 Star 6369 4151 Star 6369 4153 Star 6369 4153 Star 6369 4152 Star 6369 4153 Star 6369 4153 Star 6369 4154 Star 6369 4153 Star 6369 4154 Star 6369 4151 Star 6369 4153 Star 6369 4151 Star 6369 4153 Star 6369 4153 Star 6369 4152 Star 6369 4151 Star 6369 4152 Star 6369 4150 Star 6369 4154 Star 6369 4154 Star 6369 4154 Star 6369 4153 Star 6369 4153 Star 6369 4151 Star 6369 4153 Star 6369 4154 Star 6369 4152 Star 6736 4485 Star 6736 4484 Star 6736 4485 Star 6736 4486 Star 6736 4484 Star 6736 4485 Star 6736 4485 Star 6736 4486 Star 6736 4484 Star 6736 4485 Star 6736 4487 Star 6736 4486 Star 6736 4486 Star 6736 4485 Star 6736 4484 Star 6736 4484 Star 6736 4486 Star 6736 4484 Star 6736 4485 Star 6736 4486 Star 6736 4485 Star 6736 4485 Star 6736 4486 Star 6736 4485 Star 6736 4486 Star 6736 4485 Star 6736 4487 Star 6736 4485 Star 6736 4484 Star 6736 4491 Star 6736 4485 Star 6736 4485 Star 6736 4490 Star 6736 4502 Star 6736 4485 Star 6736 4485 Star 6736 4486 Star 6736 4485 Star 6736 4485 Star 6736 4485 Star 6736 4486 Star 6736 4484 Star 6736 4484 Star 6736 4486 Star 6736 4484 Star 6736 4486 Star 6736 4486 Star 6736 4484 Star 6736 4486 Star 6736 4486 Star 6736 4484 Star 6736 4486 Star 6736 4485 Star 6736 4485 Star 6736 4486 Star 6736 4497 Star 4413 4458 Star % End plot #3 % Begin plot #4 1.000 UP 1.000 UL LT3 LC3 setrgbcolor LCb setrgbcolor 4130 4318 M [ [(Helvetica) 140.0 0.0 true true 0 (non_linear_memset_regression_ba arch 3)] ] -46.7 MRshow LT3 867 1262 Box 867 969 Box 867 1037 Box 867 957 Box 867 716 Box 867 707 Box 867 717 Box 867 655 Box 867 646 Box 867 641 Box 867 626 Box 867 693 Box 867 650 Box 867 687 Box 867 729 Box 867 846 Box 867 508 Box 867 539 Box 867 528 Box 867 531 Box 867 582 Box 867 543 Box 867 506 Box 867 514 Box 867 507 Box 867 588 Box 867 542 Box 1233 1118 Box 1233 971 Box 1233 900 Box 1233 969 Box 1233 932 Box 1233 640 Box 1233 684 Box 1233 640 Box 1233 645 Box 1233 620 Box 1233 621 Box 1233 582 Box 1233 693 Box 1233 678 Box 1233 660 Box 1233 622 Box 1233 683 Box 1233 649 Box 1233 584 Box 1233 647 Box 1233 551 Box 1233 600 Box 1233 594 Box 1233 580 Box 1233 600 Box 1233 623 Box 1233 645 Box 1600 1126 Box 1600 959 Box 1600 884 Box 1600 781 Box 1600 777 Box 1600 938 Box 1600 766 Box 1600 743 Box 1600 712 Box 1600 764 Box 1600 735 Box 1600 772 Box 1967 1072 Box 1967 1057 Box 1967 1088 Box 1967 1091 Box 1967 1084 Box 1967 1074 Box 1967 919 Box 1967 913 Box 1967 893 Box 1967 920 Box 1967 946 Box 1967 893 Box 1967 923 Box 1967 953 Box 1967 886 Box 1967 933 Box 1967 893 Box 1967 891 Box 1967 871 Box 1967 873 Box 1967 946 Box 1967 922 Box 1967 931 Box 1967 966 Box 1967 920 Box 1967 902 Box 1967 742 Box 1967 602 Box 1967 598 Box 1967 614 Box 1967 625 Box 1967 614 Box 1967 591 Box 1967 567 Box 1967 631 Box 1967 591 Box 1967 599 Box 2334 1172 Box 2334 860 Box 2334 841 Box 2334 893 Box 2334 839 Box 2334 839 Box 2334 833 Box 2334 837 Box 2334 834 Box 2334 843 Box 2334 823 Box 2334 818 Box 2334 822 Box 2701 1194 Box 2701 1168 Box 2701 1133 Box 2701 1135 Box 2701 1122 Box 2701 1064 Box 2701 1061 Box 2701 1057 Box 2701 1053 Box 2701 1067 Box 2701 1066 Box 2701 1060 Box 2701 1046 Box 2701 1064 Box 2701 1108 Box 2701 1056 Box 2701 1056 Box 2701 1074 Box 2701 1075 Box 2701 1066 Box 2701 1061 Box 2701 1070 Box 2701 1063 Box 2701 1060 Box 2701 1086 Box 2701 1060 Box 2701 1062 Box 2701 1055 Box 2701 1077 Box 2701 1064 Box 2701 1061 Box 2701 1055 Box 2701 1074 Box 2701 1050 Box 3068 1372 Box 3068 1312 Box 3068 1310 Box 3068 1330 Box 3068 1299 Box 3068 1306 Box 3068 1309 Box 3068 1319 Box 3068 1308 Box 3068 1305 Box 3068 1309 Box 3068 1313 Box 3068 1303 Box 3068 1308 Box 3068 1311 Box 3068 1293 Box 3068 1291 Box 3068 1299 Box 3068 1312 Box 3068 1311 Box 3068 1325 Box 3434 1623 Box 3434 1582 Box 3434 1596 Box 3434 1606 Box 3434 1593 Box 3434 1610 Box 3434 1588 Box 3434 1592 Box 3434 1599 Box 3434 1498 Box 3434 1598 Box 3434 1602 Box 3434 1603 Box 3434 1606 Box 3434 1601 Box 3434 1598 Box 3434 1584 Box 3801 1833 Box 3801 1820 Box 3801 1816 Box 3801 1829 Box 4168 2077 Box 4168 2058 Box 4168 2065 Box 4168 2062 Box 4168 2054 Box 4168 2070 Box 4168 2062 Box 4168 2062 Box 4168 2065 Box 4168 2069 Box 4168 2062 Box 4168 2059 Box 4168 2057 Box 4168 2061 Box 4535 2506 Box 4535 2497 Box 4535 2499 Box 4535 2498 Box 4902 2834 Box 4902 2851 Box 4902 2835 Box 5269 3164 Box 5269 3172 Box 5269 3163 Box 5269 3164 Box 5269 3161 Box 5269 3162 Box 5269 3162 Box 5269 3163 Box 5269 3162 Box 5269 3162 Box 5635 3496 Box 5635 3497 Box 6002 3829 Box 6369 4162 Box 6369 4163 Box 6369 4162 Box 6736 4495 Box 6736 4493 Box 6736 4495 Box 6736 4493 Box 6736 4494 Box 6736 4494 Box 6736 4493 Box 6736 4494 Box 6736 4493 Box 6736 4494 Box 4413 4318 Box % End plot #4 1.000 UL LTb LCb setrgbcolor 854 4871 N 854 448 L 6093 0 V 0 4423 V -6093 0 V Z stroke 1.000 UP 1.000 UL LTb LCb setrgbcolor stroke grestore end showpage %%Trailer %%DocumentFonts: Helvetica starpu-1.2.3+dfsg/doc/doxygen/chapters/images/distrib_data.pdf000066400000000000000000001021011320135501600243650ustar00rootroot00000000000000%PDF-1.4 %쏢 5 0 obj <> stream xۮ%u-^_e4N9W2@:eYI5Nʌ˜cWTW-+bc^#Vf~1y|_;__~//΅B,?!v"k~g?}󪨼oݭھ^yoR(/||Wd7y "WFпB=fRƜǿnjk}pDt_kNÜjy3ל5+Z9뺚ڇ5+9wo'8z:-# y_ n1˚ .Ǽ5q|zʹʙ?gOɫ˙Iufzu1gsO!!!!9bQq}r&ܗsV?gz3.iw)~Rņ*n'׌X9|^3Srr}9gkfbκ?ܟ33͸>gTT 1N?fWŜqtϸ?g,/Ŭq>g$Y:wGͮݫ jhOq&^]' Xm]Pm3KQV=3 1+M' o3'hČhhhƌČ 1͸>f+t<.{=G!RqzoO&} 1E>(L2]&]߿֩G5f*[uL{0Vos׿]s:ڿیvk5>i/qS_{33։]4r7\wϺ.ƜXqׯ)9]tٯ>k{V[p%zg] ǰxhe7y?b̹?AŘq_}伦F3\g@Яoԩ>gu]9=gq]U˜gg溘3~;13y0/~9oP{WMwϺ.ƜE.goN6?U"ߛ_:2U+ wxxEu_㫮o~)} ks?*e2}+o61,^kMr]`c?8>.\#xsǖ6uc~j~8?{5?{=u_?챈ٱ(Y}h`nW!纤pqۓn'u;;:Y@ݩ(FQs^Tv[;к\W~ekKNIznUέYE>굏zQ^A+h{؃؃դ60:5ߺr'NwH_-L&W;SEgs=a{AH9H U);םX:95լFNRJggcVؽSuaR)VF.k{ףE){Y7^/zUܪ|u|';B|twԻ$ٻ$ٻ2:'FPli뉫֎lmu0RzUKLѸ *h[m+ķ|{ŷӜE,h1)ib^-Δ@\O4NwQq $sxR9\Ѻ\SvEڒO]F?uQ})sy:`Z.n~dݧ>rqS;qr{}\Z.\Y}O zh9|W_ TDzܮW͜>_ꫜ냚"n$FV5k%j0͹'Ν۠=3}mVs/g{;k/ IIͯ緯=]ǮĽ{j-q5Q7'Nw}9ğ7m@wl5ha^G ~Ҿd:87Faw6|h5v]g<+-[Fwy77Nx]'< u|>k#k9] 殀5w;[ߣ+4k2pI%?4OD}*'d{K\H5?0Uxě oxkpnJjnJ$y*dW,x]^jb^x o:7B7J/iiIyXAΥ:gJRt+ʺhH¦2_m&n6 u&΢uLF^A"?C2VʷYۼ-ߦ(}z"{"{A QUh[cQ(X^ߓ k6[9z"{"z$y/K}Yw2NԾ_EEQZ,y͂P+1B|"MMO>~>~~dT**gf֫ ,.ikjȷM]UK1x_y_c}m~J/}impdr>7IIKuQRmBvRw4pȹQК\s5K܅p';!nq;%,:;uԝW,V{=<4řQsg^}H6+;DvAezZo*LDKU\G~$|U\ q=o3'E/Oҗ{'w {pn9Ynq{k%Zw}.%sIy)Q^2/E->e}-y]հkX48fNE\{RSy[=G}n>ǣ^3CYk~znIM+j.99)/L95 >[3ge~zrZ Au"=.=`hs5g83?226:-!WAvl髏r܀yIyR9bo(Ys5:P{L붤HF.Y%5G5WC}/?c>6 |%@>#p|8.IΎlsUYwrEG eȶ`kVؿo%n')?qOZ5fS6omU\zKҪUT0;3iUݴvO}fU0_B>~ƺ-iW>y6~ȣv\L^yޖ9G>.}vwJ ;Y Yȧ3}\%yɨd+um'ڳdht|fc0cl75:o߬}__%o߿yrϏ촏7yy=0EOSIOZ; ϜL ^sGtNacK39TLCa<4Q<ytGPZ|J/$|!j_`vpNۡ8l!ګÆPƃx ^ţw{WGĭ~t>"@{Lx,p6rZ!9<%l9pAx(9x62", 2 Vr[c(b18DZ֍o~ 6 ed 2,ˈ #{zp \8b_=C=;?~iuwp"H#^W"׶"\z4s=ບOc"cv{N=ߒ2l}5s^#q;kܤq{kn1>!t|֞xVͶs;]|#̏zUy2]gs>(oW 1zonqc;|G}׭*ˆ4BXy u<|ڝ1O<\ 1iͻbD!@~/ٷdG<|R=e2g{xo㦿v럼ARwsmƹ81q%f"^:g{aQ 7_0o]Jgg+݁uW5m\sܨ֜o |Xw֌mY;Ge5csn1*/x P,gRP#c7:vq=[Y5^/Vӎb]}OϹZjY\X!Ogܢ2W¶xzV3)?yUP|g~fnR|~4*egg{t{]n_teWStuЕk3tjUu/wmKm~]o+1h WZCYw{g EI(z 1TPø0AK5Xx~V~we"dD -#2 `H6"#B2kJx?-` Ȉ³_X ~Q5 @[ALݰ2,b,Ͳ%TNp18wrϪ~*?5^sGZ۽<$wϖ6|P `%B v,axxó ̯A+؟-;|!2_gsۓz=b gJx͸|13z33wX۫qfl~N]@ S@5PC Ua[L^Kz~chw 0X\$lEɛh 1#=u<7Y;:AXpPx!#j.҂K}jG;p|i~֞ƳAYCr`:b^[G"vsl+gd[Fe aOyXKĵH|(,z)lYwNǜ X[bc-w/]s6DtPF [|Tp/Yן8wº;OK-ã2BU2BeedaP]HZF,kZƌ6b5hgOçSӉbME)mF) v/ۗvf,DIJKN*C )(|.<"f1J IJ#,`<t N1;pSdȹM>lƧzR-'$۲Mr璳}9jN1䇃Ms'y,5ֵ]>m1}GƜg"[bߚqߚiߺl0{kSk Ѿ{rqM/v=[- PFh$$u=?Wp38]Rk(aޡ'yc<V`5^c7%vC8BGd3k>˂O(~U0-84ȡs/}m `8V ``\_Lcc{ko@9N˙M!|6,2<'z}CʼOX~wˡSPN9~]9~mKN5Ś^MzX,c~=DX);d/VthLNYI1>vp{ZMܗA[I'}u3;db%Ym=;d$2>[y7??ɿ%}q_yr?8r ) ir=BN&9YKɟexrq(-5Ś0sNcQ_(';Mr3"TQ]ȉ('.<;|ϣQz0' ,ք|y~=b ,Q}Y#쩑l}߶~G1vT=o8d9c&iuqclOiG.XXw ϐ#&jY|_|o?~lNv1?- lPoNݪ, s)\Roa՜)݇˯V׽Rg8N;sVLGί7_  k3z~*ǜ'q?yy?ϯ2ґO=&{'-<cO[b א?Or>^w&efEz]b5/?}_^7ޟt>~_w?|?>?~7Cy avObW*v|QGvfGqdF_`2h#|X%Ç 2_bQF>%a"p >[="֒-i@k 4"B-.FpN#+j_ #_ 4@k 8xO('-#&'<ж>Zm?mѶm3cXӱ FežמM&(v >-5mb@>O#F!p`D=2DDe=Qv-g͇ȇ`}Ce0*ɃE_ВsmȐq3eG;^vmA2SDb?,G NkqcU}GH ]F˵|ғ5돞} j!y@j"vLSGHpH*rLg(;ȸe^ʒZH 1fuOk9*1 党SS U+ьoQ~Ua-:6taUJ#̌H}rԶm3 2Г_ 7pj3hAN_~`d?Aݧ'HGGTSGUy/ fKsD sۖ?ww }Ĭ@}D`/mOuѲ6"Zav}D-s/GX}-Lz N@X d@F0'>N i1EVkp+#8 TBZS Z?M Ԑ%XK X!/4ړOE6g q3blHK  H `XC|lx!pւ-8q2pR}L=: 5cdxAF nK=lɶ^Vt(S[ό9Q2B^/ udž^jvuv86 )r/3̗&.>"mqF]ƌ.IwD ]<#Q1=GS!FD\c -HG||}O;cOۈ8tp |dBp|;3]Ey?BctAZثwsGXVD~ؖ4=b"phҳSBa3㎵D%~%8C80às>"@T.ɼ #G8cG~8`vwd 6X[~0 389b.ЈZ0xPT,TBqN7<(UX F9AHv فz e 8f0pd1zN .$B^OJy}GN.P #yaO.TMw)pxJ29v_6e~ yaxIdT)^ )wJm-ylC>M Ó A4A5O!^6cX?= $#Cwa8ko+K"/L;UBŸZ>tlE|p%oBn>艱 x'C4D^X(z <3#A1 ~G>|>bretNۈ89H1#=c#- N{#i t>t1R v!-ήoЬ78BCh #XΑ:H/`HXa{1#XgvdvId8p#;G_֒i-YP O2Ƙ Ƙy:G9qnjø!g>:5b '0611a3kʱ0 r8nInIɏc~vwweL{Eޠ{93}~/%;cEo ʡ Uȫk?{Aþj"f\`-׵˟7`ɜ2\?Mqj3k,#{צ%YND9쪃a@9֯brv]c5?r~Ϯ(,qQ8. ]qQ".j%ʉ,Yŗ_b+ ]!694W"z\B1W_aᇰvqo c8\`xa0m1-֎~X1d? W=1ǘӿcDcFc7c8Ocު{>F' 9ƈiɠ+T8'.A̢r 芼j+!?l/ {.c, 9"-y;+ Lj:D\hS>fW#6A̢v {?]x|h(žџ3D^K$"o+oló)oe7 XX b6_sc0-^D]W!~˫Mr"ݱ;nknM#N1gzDcsb]Mh c, lgSq0N"bEZƠvE?^YyW-8r¢F߰X%杌)I)I611yrǏqA3acSLSW9>f30ו=Ʋ.E38cE&nc[1cncFLja#6XSO<2N?^l3[/rwC+gW`b^e- ~h]XNB9DCkg/SYx>e1tk^Q٢nĺC9a'㺈-.{sB_-;'x\ضr!̹ڋ#(!lK@#9͟w.@B#Ya!Fͻ,Bc]b\p.Cv ;Ve>HւUCb \ĄYx!/ VHւ KF?\#.hɎaeL٤ߞ&dό߮*;[s5v90,,]x &:7֎DBV Yi)L߹Ɲ(3£L!\,wl~ZBK=#b;Z?(ka!Kؚ wɾ<3v9goϴڽ/G{.WXܙ'^nZwΚvNKֺ6g]]sT=lJ֎QFo$BcQtxʊ1.4BBV"Ye!+b֘k'5#\)YkDavCGsUI#&ok)kg_ Ǻ𯝸v扝{ZxN$n}e@5S{CjCCܚk73~dI֢sw H3o:Ev |1j%~Yr ӨSJ NYֈįw YpCjQk #$ "j?.]SVM[2Y֩W:3w6;zh,k&GyFSk{_{~;kN\{3T_=΍3s~p¸J!\f׾'9L;,ʚoP~B֩Hש9Ժ}j[Cknc(:.|ߟv9SN)+j-]OM|{ߡl2F6oYd,OB#Yv!˒,au+k'S?U2!~F2dGf\_='v^B\ ,%q]>\5xbqƽ}n<\x+.5~NZѧ;כ:sЩv<9R'V 79ʯrΩ}N&Y\OI Yy!kgoծti:3gꜙsT?f#dU 2,yکdƲ@?vr,L|5u |oy᫛W x0_5)Ԝshzj}|/ZvB;3j, rđ>[XoBY=ש}N}97Gɩ}۟ oao ]#J Yd,5aqXO߿&xqf9r@YPVK왞ly۟v+FQmc?||oK~?o>?o>^?^z߼w˻/ Ɨح. X>})?LW#6B踔< &_aS=BʿzySش>b HHBzT$m6cW0TBG * 5#bR5PyȀS1L0=<`4`/Džk_h”jRh[/%?me[!=VOd,C,:EA?ĢKzҍ^&g'X{|0 ^'J%xp T%hX60V۠ ja3OR3@`AFN$&Vce5~5i~5뜜('9s$C&ɮz M-34YgB.irKX &x V5*&x xehU%]?h ?h;klumX]ГnJn50Hts8`AұNNw~ s:L>@r|},h{ $僶 Ra( `AD } hC{M@p:"WLCwM_H^t"xWR1\~`\u2FL #ꢎGGhu`ãKJ  `ybN\KB~CvhhE;dC$;DC_8 &AWl,mX¡/D ` {giʌ1[\?cRkק+^9h_IS|cmr5HL_lun=mXfcAvis!c*- 0Pu)2/(BǨ-gAK(l6hj;P"AkhSUx&= S jO/jA6(Ub0 ڠ9׏t<GmP9)uD$1D5OC SE/h_ T]\iERG#_D9!0'$ r('xp]"#BP ×i?%~Mf!U.uNTSO܋$OUϑTN=C==C=C q"p3Qq0U Gƺ{LD"w1| 9h;xvphO'2Wea EBA 'Kgzouzw{w{?\du:d2wV*梨~9FH1uLx]1BFPU=:6RZ%:7ʍNFscй E?g_J'SňŨ*ZQVKft]#E:!t:E$| 3cQ,cXtcq l-7{/=AtK֦b躈#s 6o(6c>`~G mq7^_G \\g >bo#K]q=mvlSCG=]L\7JVt'ҝ"[Gu[y`^aE+ ~lox?M0x/R})??0;?4S>Gygn# :}Y }su]W+u(Ke3y?uܾ/M|dI:7M|St {O} ^ܡԟ@?r?t~ ȭf_̤u@*@%oVꦌԝn)cȈS?Pp65Anx7/]㽴{bv =KYxC\_u73 5@R7\>W >J[Э}.I+q%Ys^D'jS6wcN[q_(Y-ebY֟Aφ3Jq$;ٕs5d)_vwacoeL P.{B^to,Izˢ{~8(B:qL&>@,zKIݴ.r\ [,;Э_Ś3g&L 83߭=^%q-n}+U"{{ U3d %(-,I3 aW/S|X+2Y>d;a_|B޻u ȧ\Ȏ޻y s\(2QN}c}c}}}c/+zC7NwfzGjw}PFpow W?ߧ~~ Z!/ao$dԟ^X[a6dmll /:\BcMpC=Bo>`$wi%& i a޹=hBP*1TCvh vHdv A|`@+0_H= ? ױ(Ũc1A,zE(·%DA ĉX:ʇIäa|)FȇB>f|0r6,A?\ϰ@/:ZʅUªs\X(ȅsaoT{L-`,7ɞ^׹yԹ8b.l*ʌ8x!.VDY1`Պ?s{R5)6 j BG|pE*i_l![ ZN@"?~X~p<5c,:M>֑8H>QB \0"(*| aD퇅&VPI -`Chn7u~}/ }tBǥ/|Ismzmusc,Nm_ ~q7hC;p>bo#r7Gxy`ܗJ^SEG ~C鯸C ^cjowttC1d+cj_c&ggP/ZMA?ߡ5[OhE*7VP O 2 k?pJ#W?XYo~Qqenm,B:z/JJ"֥L0"uюJhX4ɏU2#ES 1XtY+?(ba,V %gpG0c,8JP!Bѱ`)cB,P5%}r0)Ÿ%E_A: T1R˃%`n>񐳜axGQR0hhB`23v/s9<,:yiPǨS1'D'ZoL%G>umhF8ap$GD qx>GHB#}$~''$%TM0AGw SIO8 h*' rpZOnQ uXx[xBЂ菢i,RS-pns嶀9p&0r|XWC> r>O 8~ď ?JSȜ#"'6 'q?4## Ӂslж N/q$"_"$$mn-iFNx5Dk1z¡$}RcpmA gGr',WsZj9M+{\)G ˹b-z25G, ,z|bg lez6=[@ܳYlooQNדj|̱y`8M8>_<`Y*`cugFoX B rT<ƫd0xA' Xh7,~;/԰4.v 3\^E'K9[$ K^K4[O.pH-)pnyӹEĽX⤜vH.9>CNp:06Y.q>W Pw gu'Q) 0 MDM/וRRִ5}ч{k^5pu%nuu c6FjF!'4' >pF f8 أJ.D7$hҠ=*ۣNuprc̦\Z :}-ó"`./_xr+AR˅(`nTHlՀvNuV7*HǼ"5]8^= ƁGaȈZ壔MCim} (^3Ax u|6*6bl((N2bx 9tܔ}'{JΉC RK c=QWgWjj]G`.BQ3Sч=";ulBE'eP>^ !@lQ6Z!z=_Ds\֙=_P19F11F 1zJ Haza?2E[5( 9>PN&1^KU3wh. mc)^ի=I:zӌk|Q}0$r!)HH0dpG՞ JDK~YcNI'8 V g!{dG&{~8JbNϨ WUq%`P~G~5q~5~5a_9<ƐSf2o߄\{>!x8"cwJ<Gs|3!>ԧ> Nc6FjF;r?wۦmt7G0U4!R˅+ x^?TO 1xC!A<1;0w}`*יW!p7M{,N6ASM#k 6 ( $J~lb&lb&mR&mbǾ7p08ؤ(qAe8̙>ZQq(6 `ࣅ-[nJK l6)E@.sᐋp VaUԬ0d`E 0d#=2ã=,â=!82#pP,tpQ%,tVx""#0 jM:\p.rqJRKƋzm%lp]~SŬ: 69$FNY=sU{)3g3gJŃYꠋj:, { *L1 )y'0'j1{8/OΩ |_bȀAzb^pY״kaH{nSq/ }s& 5ƞKz\UUuVz\OxWG {pW7CSN` xx251BӁX*`KXQPY5cN!'8#v I@,8srI'qrjVBP#Lȉz욨8,p'$޿u?Ȍ>B8'UTѫلs,**8NONOgjϜ8'8f3''NS!} V F"j\ƏGlЊ[˧ا} ڧ.NNS'n'* C:eG> j*LE'a9;'u}%ʯs}$Y|PRK ,X:7Gb  t*}k:3fjV땧xgM)hz# jT~5bpP~Jf X)Ś~}w~g5_+/]b9dޅ?GME}uc ]Ѝ%@MEIi*D,V-ⱌV>x"Ɉh[Yr~wL`d+![YXKX2bq.Xiv g,#2U>D$e#Qi;9ĚYDn,UiasMd;Ģ]Jvh|wN}EcY!aXh)hXƲX',d,VBJE쿤.<ϒgI}Gwl("?Dx<ቈh:l/՟x!;|JGq27'7'I̢}ƱPkRrͧ|~h<~0ⱌc_G|h< Wx!0gC'Rߑج,*L]yx ʼn9L!1٬ w7ԟg 5UQR&ÒB3&gLLͻW権n`: Ņ5"G4x2&Q |Dx~t"O'b:3ws'oKgy;(B/ < نQ{Eu?҇%uAR׍%h,qh,DXa,(%WL!]" Ng9/㨹,5`W% J(뢦s8'z/CA,TKD[93SS',n~s/oXX;C1c)R, e}?Na4)=;d#p:?I~7QsX2=P(X'a9-Orߜ,?VX oƷӶb7 gYVUXNf<"rx,'i:-N,yr:mNOY}9崚}Z5x3JxO&<;oXް=XOrL&)dsLëD;ҙXM׽9\\W^Q!9j 4x,1 <دxHR{d=!9 u;fָg2PFWZsn&f7}o>6h6#mPGh3K6;Я# WYCNoCo6lՍ>gjىtTyo}g"'퍧8/VO8:<-o kEt}*/΍_.2ťsgޗ&=lwnjQSY%u ϛ|~5g<,XvĢwߜ49+rϜi{4NyW_NsS;Ofy9 ˛lxl&7) ;^T6  C)rB>|Af T:B4kK\Ł^B<1O0Jq] NdBl ap_ wx=M`x9G7>Vn6?( 66p@2*fپA*X1e<վ,\Ȋ 3pnEY[LoΫ\Myl$*e>&/ XQFlTMiD}"ڍQ .M';DBC&(: iΡXͩN(D M*T8lop];Kk uv J|F* EP(`@npCylp|D?1.$E "<~pnPG*ݲ**=PB}0CX3eT:TB |p+m$ H5?~-DppܦpQS!6wx> }lFEks_{_VwU^x@>KĚgL~ .}r&e<,ӈBK6wq,?>t@t6+TPDg׀|XAi Vn*y(I2e@q⣂FUJ<3I OmP@:ʌT~g4}K{xA6Ct6N`HngEV*k,7`qe ,1$QBb+* 0tY,aYNKwgy΍U5L",CY3ǑR4L\q^YqD/A.3+>x^W<++Q¡1hAk;IS>4~]v.F}¼faֳ߲|'W>|e >OݟPOv (wgt蠠Z?;;\U2O3qb| oI n?۰BF7 b*kA'D~Et_>pNVm ^י9DsϿsN;;|3by1d47thN f"nXAi{ 0A9nTGt4 ޣ\x]Ac.~bFƼQcejBߨ| ADZ4U"6{Cٽ$Fۀa9ڥ p'ú[SC5}B>]TX]ZWF4t8ң0#j(Q15WffD]bDTaa}e}X>P5p nmO*)$Мk}:w(#\^i&I{*MAFS}3 frVTG u͐/P $aB4%ҘZl0sSct50L3V~H%&56xFT ~Yh7ڇόI:O/PȞJLXղf~؋UD%{ *;,,$A'f*Ƨ?;럙U]$ QFS>j %endstream endobj 6 0 obj 27803 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 10 0 obj <> endobj 11 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 12 0 obj <>stream xUU TTG߆_UՌ !( "b -[ªĸFK4zB\iB2#F!5" C,6L^q=ԫWu{2VeDŽiuyڜͰY-nSI 0gpQW|K$vK|DwLJ!g{`c`.b\xJe l.]RRt--ܧd\m: u|Q{'_J7n۳BRr{>c W/aY#ye2m,Tx]4$i'$&\{xbӑGvT>2e LF<̔\=r +Zn6*l"jmć&P=-/VPwZh,L&QQcCf7yo pb=5n(2Sq3ߴ>Tm+0܎]:eUf8D?ډv ްI%\OH+|܄5 \)JٰnMtP(/ujOs}Ip>nP<"Z +e\ho,{pHwؾC<-*FCAz6Gd$ ډ@RD"1 $z[&5:Y.5 ŗzPq7ۃ!|=&w3*\ I8pu>G^.؁}?HQA;u~yZ,BFX SB|m))z4K;/`{CHBX xtaEwv.M"↳\rOM' n,- škjK|ax`ʍw܅v51Def{_\]h~Ra0{2׳$:Ay6FԌ)gJQЖy\݊u"-(9;*ܧ3;2['Z w]< vq[;0MØ(Ֆ~Fm.ݿ)ܩS[6EYhJԍY{BQWQ$)LRHJ0С IyR^y!NbXHP%D`~db_e4(ʰ*1)2 Qd]" \bU0X=H56)iÜeO .<~>stream Fri -No-v T 8: 1:4:42::9 Fri -No-v T 8: 1:4:42::9 gnuplot 4.6 patchlevel 4 distrib.data.epssamygnuplot plot endstream endobj 2 0 obj <>endobj xref 0 14 0000000000 65535 f 0000028119 00000 n 0000033202 00000 n 0000028060 00000 n 0000027909 00000 n 0000000015 00000 n 0000027888 00000 n 0000028184 00000 n 0000028285 00000 n 0000028686 00000 n 0000028225 00000 n 0000028255 00000 n 0000029039 00000 n 0000031621 00000 n trailer << /Size 14 /Root 1 0 R /Info 2 0 R /ID [<6E2BC7D25FC9DEC9F10392CD5B60B7C4><6E2BC7D25FC9DEC9F10392CD5B60B7C4>] >> startxref 33423 %%EOF starpu-1.2.3+dfsg/doc/doxygen/chapters/images/distrib_data.png000066400000000000000000000141471320135501600244140ustar00rootroot00000000000000PNG  IHDR,2PLTE@Ai @0`@ԥ**@333MMMfff22U݂d"".Wp͇PErz挽k ܠ ݠݐP@Uk/@@``@@`pͷ|@ ___???E$8pA!C(@??yZ1Ye:^u #@Gi?|KX#4n#FFT{xh#[ \䡎Ϭe {ݩG(۷o'D*Ôt`iZ.Uj.2ܖ9<\8:ή Suɒ-ߺ!FGД?̀Mn P .r1X^"f~-fމfxq3gL犥oᡌL1š~.Nf_8B pxq}gZ]>7172lӭm;(eIEŶ_XU6ՀXw;\],ύ5k띏[l U'仙O%  HuͲ<(`:^|3MtcT5z#m۫] 9W軏X]MQ8^z}Q庀캦 ^|;ȣ%ȵ~wCvtYn~BݵH#n&Nj~WUӹqP,e{;cβGS{rz^v/bPOuJQA!A w?IE$?ͳ Џi8Ȕ|n$'@S3?k=K%.Kt,S3KkWg|v$q!)nBꟼ/{,%#l R%wޑ [&,@/l6`dJNJ\,@67)2 SH&%?^H&%?x~0%'$ ;3(Gx%(~Ϡ> 8}ϋI`::%õaaBC.@S.@[p9u SmRvg[7RUh$o_:/ L/%f|!`xr6wk2;/g_) ˷/Mm 6wR+id/t}蘒e|iI%(~ =Pc83(Gx%(~+M5x?j`J>(A<x?gP JQ A <3(Gx%(~ϠA<x?gP JQ A <D+.Ps{Z4JQ zG@XEO* b,$Tb`rk|)rQ$(0|BrpAg HP$( J%`A<x?gP JqZ#8aGx%(~ϠA<x?gP" ;3(Gx%(~ϠA<x?ͷ%8yYϗqŽGܾ< HB$ _m/uWPGf[g@x'(~XBEUąeˢuVp"A 0Q/ ڷ$:Գ Ad ٞB5cP8k@ǠX_@ <1 5}m@r;(Gx%(~X~|jR,4vRrQܩYqeQ,$H, ЧVd:R%A=G$^/V(@2@7A[$Jf)@2%د?Kswqj8 7gű "YqPB;pP gaNzBq 5REep?HEYg50AՀ0ݡ'm@ Rd`[PxZJJQxZJJQ l$((0Lձ,0A w_N.t580|tD>]󯮸B}j D^0݆a/PuΫ~l# }xaI@}  $C&3x:b‘'n}oPw~J?M2.`C&P= 0qUi([2@DmRۤ{ *loP=(G`JQ6_n%(~x㕫JQFUah7x?RQOHy6x?gP F_6CKPi"֏nƧ?>lFՀ  kM5wjc4^|e}3`Yg# c&-Een_v#NUQ{/sn7uID-px1 |m^ 0tQ(8hu8H\VCuoeIFjiBbeTӎ(@=( PQ:pŽǍH%(~{%@ <7^ (Gx%8QA<x?ioWA <x?n ŏ#:(K;dxqނo%(~q P(@ <Go%8!{ Kpqԟ73-o#:Rf( '}P UCNt`s%ɻT檎1omwl <P=<+@R:ePۀ 9s#8>}d+1 )'ζo>!@Nx`0!@Rf^q0〼C6NڬQ D~ak'"\/]KLp[I>i??~Y yoY?R~2NbknDmw3ΐyl̙޿YD^AaF ] !@0/>(@` @S m|34\%#p ki4GC:!GqxƜg -zvv z=GPlnH^zSl@}w)Iو`Ö1/wjCbhqpindV.(H̱YխNy#y2exKʿм]|S[;3ȤrLozuF-ٗyU2}Mhi/mϜ \d_-T3@~~u]Ud7CLgVuԍPW57FFLv3nW5 V6b}fw:k07Lnן;gYÑ|UBQ?vD4V3d=T*ۋD7 OQ6ܲV3wghvȯ9#F>5&NE=׋Jό{_rh~q#fm@)Ū (̸7/ۭ2B Wkj 3:fϠ*3l%S[̺$8xfy]G9~~ު*B!B!B9?AyYKIENDB`starpu-1.2.3+dfsg/doc/doxygen/chapters/images/distrib_data_histo.eps000066400000000000000000000601321320135501600256200ustar00rootroot00000000000000%!PS-Adobe-3.0 %Produced by poppler pdftops version: 0.22.5 (http://poppler.freedesktop.org) %%Creator: R %%LanguageLevel: 2 %%DocumentSuppliedResources: (atend) %%DocumentMedia: 504x504 504 504 0 () () %%BoundingBox: 0 0 504 504 %%Pages: 1 %%EndComments %%BeginProlog %%BeginResource: procset xpdf 3.00 0 %%Copyright: Copyright 1996-2011 Glyph & Cog, LLC /xpdf 75 dict def xpdf begin % PDF special state /pdfDictSize 15 def /pdfSetup { /setpagedevice where { pop 2 dict begin /Policies 1 dict dup begin /PageSize 6 def end def { /Duplex true def } if currentdict end setpagedevice } { pop } ifelse } def /pdfSetupPaper { 2 array astore /setpagedevice where { pop 2 dict begin /PageSize exch def /ImagingBBox null def currentdict end setpagedevice } { pop } ifelse } def /pdfStartPage { pdfDictSize dict begin /pdfFillCS [] def /pdfFillXform {} def /pdfStrokeCS [] def /pdfStrokeXform {} def /pdfFill [0] def /pdfStroke [0] def /pdfFillOP false def /pdfStrokeOP false def /pdfLastFill false def /pdfLastStroke false def /pdfTextMat [1 0 0 1 0 0] def /pdfFontSize 0 def /pdfCharSpacing 0 def /pdfTextRender 0 def /pdfPatternCS false def /pdfTextRise 0 def /pdfWordSpacing 0 def /pdfHorizScaling 1 def /pdfTextClipPath [] def } def /pdfEndPage { end } def % PDF color state /cs { /pdfFillXform exch def dup /pdfFillCS exch def setcolorspace } def /CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def setcolorspace } def /sc { pdfLastFill not { pdfFillCS setcolorspace } if dup /pdfFill exch def aload pop pdfFillXform setcolor /pdfLastFill true def /pdfLastStroke false def } def /SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if dup /pdfStroke exch def aload pop pdfStrokeXform setcolor /pdfLastStroke true def /pdfLastFill false def } def /op { /pdfFillOP exch def pdfLastFill { pdfFillOP setoverprint } if } def /OP { /pdfStrokeOP exch def pdfLastStroke { pdfStrokeOP setoverprint } if } def /fCol { pdfLastFill not { pdfFillCS setcolorspace pdfFill aload pop pdfFillXform setcolor pdfFillOP setoverprint /pdfLastFill true def /pdfLastStroke false def } if } def /sCol { pdfLastStroke not { pdfStrokeCS setcolorspace pdfStroke aload pop pdfStrokeXform setcolor pdfStrokeOP setoverprint /pdfLastStroke true def /pdfLastFill false def } if } def % build a font /pdfMakeFont { 4 3 roll findfont 4 2 roll matrix scale makefont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /Encoding exch def currentdict end definefont pop } def /pdfMakeFont16 { exch findfont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /WMode exch def currentdict end definefont pop } def % graphics state operators /q { gsave pdfDictSize dict begin } def /Q { end grestore /pdfLastFill where { pop pdfLastFill { pdfFillOP setoverprint } { pdfStrokeOP setoverprint } ifelse } if } def /cm { concat } def /d { setdash } def /i { setflat } def /j { setlinejoin } def /J { setlinecap } def /M { setmiterlimit } def /w { setlinewidth } def % path segment operators /m { moveto } def /l { lineto } def /c { curveto } def /re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath } def /h { closepath } def % path painting operators /S { sCol stroke } def /Sf { fCol stroke } def /f { fCol fill } def /f* { fCol eofill } def % clipping operators /W { clip newpath } def /W* { eoclip newpath } def /Ws { strokepath clip newpath } def % text state operators /Tc { /pdfCharSpacing exch def } def /Tf { dup /pdfFontSize exch def dup pdfHorizScaling mul exch matrix scale pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put exch findfont exch makefont setfont } def /Tr { /pdfTextRender exch def } def /Tp { /pdfPatternCS exch def } def /Ts { /pdfTextRise exch def } def /Tw { /pdfWordSpacing exch def } def /Tz { /pdfHorizScaling exch def } def % text positioning operators /Td { pdfTextMat transform moveto } def /Tm { /pdfTextMat exch def } def % text string operators /xyshow where { pop /xyshow2 { dup length array 0 2 2 index length 1 sub { 2 index 1 index 2 copy get 3 1 roll 1 add get pdfTextMat dtransform 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put } for exch pop xyshow } def }{ /xyshow2 { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval show moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval show moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /cshow where { pop /xycp { 0 3 2 roll { pop pop currentpoint 3 2 roll 1 string dup 0 4 3 roll put false charpath moveto 2 copy get 2 index 2 index 1 add get pdfTextMat dtransform rmoveto 2 add } exch cshow pop pop } def }{ /xycp { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval false charpath moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval false charpath moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /Tj { fCol 0 pdfTextRise pdfTextMat dtransform rmoveto currentpoint 4 2 roll pdfTextRender 1 and 0 eq { 2 copy xyshow2 } if pdfTextRender 3 and dup 1 eq exch 2 eq or { 3 index 3 index moveto 2 copy currentfont /FontType get 3 eq { fCol } { sCol } ifelse xycp currentpoint stroke moveto } if pdfTextRender 4 and 0 ne { 4 2 roll moveto xycp /pdfTextClipPath [ pdfTextClipPath aload pop {/moveto cvx} {/lineto cvx} {/curveto cvx} {/closepath cvx} pathforall ] def currentpoint newpath moveto } { pop pop pop pop } ifelse 0 pdfTextRise neg pdfTextMat dtransform rmoveto } def /TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 pdfTextMat dtransform rmoveto } def /TJmV { 0.001 mul pdfFontSize mul neg 0 exch pdfTextMat dtransform rmoveto } def /Tclip { pdfTextClipPath cvx exec clip newpath /pdfTextClipPath [] def } def /Tclip* { pdfTextClipPath cvx exec eoclip newpath /pdfTextClipPath [] def } def % Level 2/3 image operators /pdfImBuf 100 string def /pdfImStr { 2 copy exch length lt { 2 copy get exch 1 add exch } { () } ifelse } def /skipEOD { { currentfile pdfImBuf readline not { pop exit } if (%-EOD-) eq { exit } if } loop } def /pdfIm { image skipEOD } def /pdfImM { fCol imagemask skipEOD } def /pr { 2 index 2 index 3 2 roll putinterval 4 add } def /pdfImClip { gsave 0 2 4 index length 1 sub { dup 4 index exch 2 copy get 5 index div put 1 add 3 index exch 2 copy get 3 index div put } for pop pop rectclip } def /pdfImClipEnd { grestore } def % shading operators /colordelta { false 0 1 3 index length 1 sub { dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { pop true } if } for exch pop exch pop } def /funcCol { func n array astore } def /funcSH { dup 0 eq { true } { dup 6 eq { false } { 4 index 4 index funcCol dup 6 index 4 index funcCol dup 3 1 roll colordelta 3 1 roll 5 index 5 index funcCol dup 3 1 roll colordelta 3 1 roll 6 index 8 index funcCol dup 3 1 roll colordelta 3 1 roll colordelta or or or } ifelse } ifelse { 1 add 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch 6 index 6 index 4 index 4 index 4 index funcSH 2 index 6 index 6 index 4 index 4 index funcSH 6 index 2 index 4 index 6 index 4 index funcSH 5 3 roll 3 2 roll funcSH pop pop } { pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul funcCol sc dup 4 index exch mat transform m 3 index 3 index mat transform l 1 index 3 index mat transform l mat transform l pop pop h f* } ifelse } def /axialCol { dup 0 lt { pop t0 } { dup 1 gt { pop t1 } { dt mul t0 add } ifelse } ifelse func n array astore } def /axialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index axialCol 2 index axialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index axialSH exch 3 2 roll axialSH } { pop 2 copy add 0.5 mul axialCol sc exch dup dx mul x0 add exch dy mul y0 add 3 2 roll dup dx mul x0 add exch dy mul y0 add dx abs dy abs ge { 2 copy yMin sub dy mul dx div add yMin m yMax sub dy mul dx div add yMax l 2 copy yMax sub dy mul dx div add yMax l yMin sub dy mul dx div add yMin l h f* } { exch 2 copy xMin sub dx mul dy div add xMin exch m xMax sub dx mul dy div add xMax exch l exch 2 copy xMax sub dx mul dy div add xMax exch l xMin sub dx mul dy div add xMin exch l h f* } ifelse } ifelse } def /radialCol { dup t0 lt { pop t0 } { dup t1 gt { pop t1 } if } ifelse func n array astore } def /radialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index dt mul t0 add radialCol 2 index dt mul t0 add radialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index radialSH exch 3 2 roll radialSH } { pop 2 copy add 0.5 mul dt mul t0 add radialCol sc encl { exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 0 360 arc h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 360 0 arcn h f } { 2 copy dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arcn dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arcn h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arc dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arc h f } ifelse } ifelse } def end %%EndResource %%EndProlog %%BeginSetup xpdf begin /F10_0 /Helvetica 1 1 [ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle /parenleft/parenright/asterisk/plus/comma/minus/period/slash /zero/one/two/three/four/five/six/seven /eight/nine/colon/semicolon/less/equal/greater/question /at/A/B/C/D/E/F/G /H/I/J/K/L/M/N/O /P/Q/R/S/T/U/V/W /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore /quoteleft/a/b/c/d/e/f/g /h/i/j/k/l/m/n/o /p/q/r/s/t/u/v/w /x/y/z/braceleft/bar/braceright/asciitilde/bullet /Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl /circumflex/perthousand/Scaron/guilsinglleft/OE/bullet/Zcaron/bullet /dotlessi/grave/acute/circumflex/tilde/macron/breve/dotaccent /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron /space/exclamdown/cent/sterling/currency/yen/brokenbar/section /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] pdfMakeFont /F11_0 /Helvetica-Bold 1 1 [ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle /parenleft/parenright/asterisk/plus/comma/minus/period/slash /zero/one/two/three/four/five/six/seven /eight/nine/colon/semicolon/less/equal/greater/question /at/A/B/C/D/E/F/G /H/I/J/K/L/M/N/O /P/Q/R/S/T/U/V/W /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore /quoteleft/a/b/c/d/e/f/g /h/i/j/k/l/m/n/o /p/q/r/s/t/u/v/w /x/y/z/braceleft/bar/braceright/asciitilde/bullet /Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl /circumflex/perthousand/Scaron/guilsinglleft/OE/bullet/Zcaron/bullet /dotlessi/grave/acute/circumflex/tilde/macron/breve/dotaccent /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron /space/exclamdown/cent/sterling/currency/yen/brokenbar/section /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] pdfMakeFont false pdfSetup %%EndSetup %%Page: 1 1 %%PageMedia: 504x504 %%PageBoundingBox: 0 0 504 504 %%BeginPageSetup %%PageOrientation: Portrait 504 504 pdfSetupPaper pdfStartPage 0 0 504 504 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q 1 J 1 j q Q q [1 0 0 1 0 0] Tm 0 0 Td /DeviceRGB {} cs [0 0 0] sc [0 0 0] sc [14 0 0 14 45.74 469.45] Tm 0 0 Td /F11_0 1 Tf (Histogram of v) [0.722 0 0.278 0 0.556 0 0.333 0 0.611 0 0.611 0 0.389 0 0.556 0 0.889 0 0.278 0 0.611 0 0.333 0 0.278 0 0.556 0] Tj 20 TJm (al[v) [0.556 0 0.278 0 0.333 0 0.556 0] Tj 20 TJm (al > quantile\(v) [0.556 0 0.278 0 0.278 0 0.584 0 0.278 0 0.611 0 0.611 0 0.556 0 0.611 0 0.333 0 0.278 0 0.278 0 0.556 0 0.333 0 0.556 0] Tj 20 TJm (al, 0.01\) & v) [0.556 0 0.278 0 0.278 0 0.278 0 0.556 0 0.278 0 0.556 0 0.556 0 0.333 0 0.278 0 0.722 0 0.278 0 0.556 0] Tj 20 TJm (al < quantile\(v) [0.556 0 0.278 0 0.278 0 0.584 0 0.278 0 0.611 0 0.611 0 0.556 0 0.611 0 0.333 0 0.278 0 0.278 0 0.556 0 0.333 0 0.556 0] Tj 20 TJm (al, 0.99\)]) [0.556 0 0.278 0 0.278 0 0.278 0 0.556 0 0.278 0 0.556 0 0.556 0 0.333 0 0.333 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [12 0 0 12 124.42 18.72] Tm 0 0 Td /F10_0 1 Tf (v) [0.5 0] Tj 25 TJm (al[v) [0.556 0 0.222 0 0.278 0 0.5 0] Tj 25 TJm (al > quantile\(v) [0.556 0 0.222 0 0.278 0 0.584 0 0.278 0 0.556 0 0.556 0 0.556 0 0.556 0 0.278 0 0.222 0 0.222 0 0.556 0 0.333 0 0.5 0] Tj 25 TJm (al, 0.01\) & v) [0.556 0 0.222 0 0.278 0 0.278 0 0.556 0 0.278 0 0.556 0 0.556 0 0.333 0 0.278 0 0.667 0 0.278 0 0.5 0] Tj 25 TJm (al < quantile\(v) [0.556 0 0.222 0 0.278 0 0.584 0 0.278 0 0.556 0 0.556 0 0.556 0 0.556 0 0.278 0 0.222 0 0.222 0 0.556 0 0.333 0 0.5 0] Tj 25 TJm (al, 0.99\)]) [0.556 0 0.222 0 0.278 0 0.278 0 0.556 0 0.278 0 0.556 0 0.556 0 0.333 0 0.278 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [0 12 -12 0 12.96 230.86] Tm 0 0 Td /F10_0 1 Tf (Frequency) [0.611 0 0.333 0 0.556 0 0.556 0 0.556 0 0.556 0 0.556 0 0.5 0 0.5 0] Tj Q q /DeviceRGB {} CS [0 0 0] SC [0 0 0] SC 0.75 w [] 0 d 1 J 1 j 10 M 98.91 73.44 m 425.72 73.44 l S 98.91 73.44 m 98.91 66.24 l S 180.61 73.44 m 180.61 66.24 l S 262.31 73.44 m 262.31 66.24 l S 344.02 73.44 m 344.02 66.24 l S 425.72 73.44 m 425.72 66.24 l S [1 0 0 1 0 0] Tm 0 0 Td /DeviceRGB {} cs [0 0 0] sc [0 0 0] sc [12 0 0 12 83.9 47.52] Tm 0 0 Td /F10_0 1 Tf (0.070) [0.556 0 0.278 0 0.556 0 0.556 0 0.556 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [12 0 0 12 165.6 47.52] Tm 0 0 Td /F10_0 1 Tf (0.072) [0.556 0 0.278 0 0.556 0 0.556 0 0.556 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [12 0 0 12 247.3 47.52] Tm 0 0 Td /F10_0 1 Tf (0.074) [0.556 0 0.278 0 0.556 0 0.556 0 0.556 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [12 0 0 12 329.01 47.52] Tm 0 0 Td /F10_0 1 Tf (0.076) [0.556 0 0.278 0 0.556 0 0.556 0 0.556 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [12 0 0 12 410.71 47.52] Tm 0 0 Td /F10_0 1 Tf (0.078) [0.556 0 0.278 0 0.556 0 0.556 0 0.556 0] Tj 59.04 87.2 m 59.04 414.82 l S 59.04 87.2 m 51.84 87.2 l S 59.04 169.1 m 51.84 169.1 l S 59.04 251.01 m 51.84 251.01 l S 59.04 332.91 m 51.84 332.91 l S 59.04 414.82 m 51.84 414.82 l S [1 0 0 1 0 0] Tm 0 0 Td [0 12 -12 0 41.76 83.86] Tm 0 0 Td /F10_0 1 Tf (0) [0.556 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [0 12 -12 0 41.76 165.77] Tm 0 0 Td /F10_0 1 Tf (5) [0.556 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [0 12 -12 0 41.76 244.34] Tm 0 0 Td /F10_0 1 Tf (10) [0.556 0 0.556 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [0 12 -12 0 41.76 326.24] Tm 0 0 Td /F10_0 1 Tf (15) [0.556 0 0.556 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [0 12 -12 0 41.76 408.15] Tm 0 0 Td /F10_0 1 Tf (20) [0.556 0 0.556 0] Tj Q q 59.04 73.44 414.72 371.52 re W /DeviceRGB {} CS [0 0 0] SC [1 0 0] SC 0.75 w [] 0 d 1 J 1 j 10 M 74.4 101.76 m 76.22 103.58 l S 74.4 91.57 m 82.57 99.74 l S 80.21 87.2 m 82.57 89.56 l S 82.57 99.74 m 86.41 103.58 l S 82.57 89.56 m 90.74 97.73 l S 90.39 87.2 m 90.74 87.55 l S 98.91 116.08 m 102.79 119.96 l S 98.91 105.9 m 107.08 114.07 l S 98.91 95.72 m 107.08 103.89 l S 100.57 87.2 m 107.08 93.71 l S 107.08 93.71 m 115.25 101.88 l S 110.76 87.2 m 115.25 91.7 l S 115.25 295.34 m 120.06 300.15 l S 115.25 285.16 m 123.42 293.33 l S 115.25 274.98 m 123.42 283.15 l S 115.25 264.8 m 123.42 272.97 l S 115.25 254.61 m 123.42 262.78 l S 115.25 244.43 m 123.42 252.6 l S 115.25 234.25 m 123.42 242.42 l S 115.25 224.07 m 123.42 232.24 l S 115.25 213.88 m 123.42 222.05 l S 115.25 203.7 m 123.42 211.87 l S 115.25 193.52 m 123.42 201.69 l S 115.25 183.34 m 123.42 191.51 l S 115.25 173.15 m 123.42 181.32 l S 115.25 162.97 m 123.42 171.14 l S 115.25 152.79 m 123.42 160.96 l S 115.25 142.61 m 123.42 150.78 l S 115.25 132.43 m 123.42 140.6 l S 115.25 122.24 m 123.42 130.41 l S 115.25 112.06 m 123.42 120.23 l S 115.25 101.88 m 123.42 110.05 l S 115.25 91.7 m 123.42 99.87 l S 120.94 87.2 m 123.42 89.68 l S 123.42 425.7 m 128.92 431.2 l S 123.42 415.52 m 131.59 423.69 l S 123.42 405.34 m 131.59 413.51 l S 123.42 395.15 m 131.59 403.32 l S 123.42 384.97 m 131.59 393.14 l S 123.42 374.79 m 131.59 382.96 l S 123.42 364.61 m 131.59 372.78 l S 123.42 354.42 m 131.59 362.59 l S 123.42 344.24 m 131.59 352.41 l S 123.42 334.06 m 131.59 342.23 l S 123.42 323.88 m 131.59 332.05 l S 123.42 313.69 m 131.59 321.87 l S 123.42 303.51 m 131.59 311.68 l S 123.42 293.33 m 131.59 301.5 l S 123.42 283.15 m 131.59 291.32 l S 123.42 272.97 m 131.59 281.14 l S 123.42 262.78 m 131.59 270.95 l S 123.42 252.6 m 131.59 260.77 l S 123.42 242.42 m 131.59 250.59 l S 123.42 232.24 m 131.59 240.41 l S 123.42 222.05 m 131.59 230.22 l S 123.42 211.87 m 131.59 220.04 l S 123.42 201.69 m 131.59 209.86 l S 123.42 191.51 m 131.59 199.68 l S 123.42 181.32 m 131.59 189.49 l S 123.42 171.14 m 131.59 179.31 l S 123.42 160.96 m 131.59 169.13 l S 123.42 150.78 m 131.59 158.95 l S 123.42 140.6 m 131.59 148.77 l S 123.42 130.41 m 131.59 138.58 l S 123.42 120.23 m 131.59 128.4 l S 123.42 110.05 m 131.59 118.22 l S 123.42 99.87 m 131.59 108.04 l S 123.42 89.68 m 131.59 97.85 l S 131.12 87.2 m 131.59 87.67 l S 131.59 372.78 m 139.76 380.95 l S 131.59 362.59 m 139.76 370.76 l S 131.59 352.41 m 139.76 360.58 l S 131.59 342.23 m 139.76 350.4 l S 131.59 332.05 m 139.76 340.22 l S 131.59 321.87 m 139.76 330.04 l S 131.59 311.68 m 139.76 319.85 l S 131.59 301.5 m 139.76 309.67 l S 131.59 291.32 m 139.76 299.49 l S 131.59 281.14 m 139.76 289.31 l S 131.59 270.95 m 139.76 279.12 l S 131.59 260.77 m 139.76 268.94 l S 131.59 250.59 m 139.76 258.76 l S 131.59 240.41 m 139.76 248.58 l S 131.59 230.22 m 139.76 238.39 l S 131.59 220.04 m 139.76 228.21 l S 131.59 209.86 m 139.76 218.03 l S 131.59 199.68 m 139.76 207.85 l S 131.59 189.49 m 139.76 197.67 l S 131.59 179.31 m 139.76 187.48 l S 131.59 169.13 m 139.76 177.3 l S 131.59 158.95 m 139.76 167.12 l S 131.59 148.77 m 139.76 156.94 l S 131.59 138.58 m 139.76 146.75 l S 131.59 128.4 m 139.76 136.57 l S 131.59 118.22 m 139.76 126.39 l S 131.59 108.04 m 139.76 116.21 l S 131.59 97.85 m 139.76 106.02 l S 131.59 87.67 m 139.76 95.84 l S 139.76 279.12 m 144.41 283.77 l S 139.76 268.94 m 147.93 277.11 l S 139.76 258.76 m 147.93 266.93 l S 139.76 248.58 m 147.93 256.75 l S 139.76 238.39 m 147.93 246.56 l S 139.76 228.21 m 147.93 236.38 l S 139.76 218.03 m 147.93 226.2 l S 139.76 207.85 m 147.93 216.02 l S 139.76 197.67 m 147.93 205.84 l S 139.76 187.48 m 147.93 195.65 l S 139.76 177.3 m 147.93 185.47 l S 139.76 167.12 m 147.93 175.29 l S 139.76 156.94 m 147.93 165.11 l S 139.76 146.75 m 147.93 154.92 l S 139.76 136.57 m 147.93 144.74 l S 139.76 126.39 m 147.93 134.56 l S 139.76 116.21 m 147.93 124.38 l S 139.76 106.02 m 147.93 114.19 l S 139.76 95.84 m 147.93 104.01 l S 141.3 87.2 m 147.93 93.83 l S 147.93 144.74 m 155.91 152.72 l S 147.93 134.56 m 156.1 142.73 l S 147.93 124.38 m 156.1 132.55 l S 147.93 114.19 m 156.1 122.36 l S 147.93 104.01 m 156.1 112.18 l S 147.93 93.83 m 156.1 102 l S 151.48 87.2 m 156.1 91.82 l S 156.1 102 m 157.68 103.58 l S 156.1 91.82 m 164.27 99.99 l S 161.67 87.2 m 164.27 89.81 l S 171.85 87.2 m 171.85 87.2 l S 182.03 87.2 m 182.03 87.2 l S 192.21 87.2 m 192.21 87.2 l S 202.4 87.2 m 202.4 87.2 l S 205.12 100.11 m 208.6 103.58 l S 205.12 89.93 m 213.29 98.1 l S 212.58 87.2 m 213.29 87.91 l S 222.76 87.2 m 222.76 87.2 l S 232.94 87.2 m 232.94 87.2 l S 243.13 87.2 m 243.13 87.2 l S 253.31 87.2 m 253.31 87.2 l S 263.49 87.2 m 263.49 87.2 l S 273.67 87.2 m 273.67 87.2 l S 283.86 87.2 m 283.86 87.2 l S 294.04 87.2 m 294.04 87.2 l S 304.22 87.2 m 304.22 87.2 l S 314.4 87.2 m 314.4 87.2 l S 324.58 87.2 m 324.58 87.2 l S 334.77 87.2 m 334.77 87.2 l S 344.95 87.2 m 344.95 87.2 l S 355.13 87.2 m 355.13 87.2 l S 365.31 87.2 m 365.31 87.2 l S 375.5 87.2 m 375.5 87.2 l S 385.68 87.2 m 385.68 87.2 l S 395.86 87.2 m 395.86 87.2 l S 406.04 87.2 m 406.04 87.2 l S 416.23 87.2 m 416.23 87.2 l S 426.41 87.2 m 426.41 87.2 l S 436.59 87.2 m 436.59 87.2 l S 446.77 87.2 m 446.77 87.2 l S 450.23 100.84 m 452.97 103.58 l S 450.23 90.66 m 458.4 98.83 l S 456.95 87.2 m 458.4 88.65 l S 74.4 87.2 8.17 16.38 re S 82.57 87.2 8.17 16.38 re S 90.74 87.2 8.17 0 re S 98.91 87.2 8.17 32.76 re S 107.08 87.2 8.17 16.38 re S 115.25 87.2 8.17 212.95 re S 123.42 87.2 8.17 344 re S 131.59 87.2 8.17 294.86 re S 139.76 87.2 8.17 196.57 re S 147.93 87.2 8.17 65.52 re S 156.1 87.2 8.17 16.38 re S 164.27 87.2 8.17 0 re S 172.44 87.2 8.17 0 re S 180.61 87.2 8.17 0 re S 188.78 87.2 8.17 0 re S 196.95 87.2 8.17 0 re S 205.12 87.2 8.17 16.38 re S 213.29 87.2 8.17 0 re S 221.46 87.2 8.17 0 re S 229.63 87.2 8.17 0 re S 237.8 87.2 8.17 0 re S 245.97 87.2 8.17 0 re S 254.14 87.2 8.17 0 re S 262.31 87.2 8.18 0 re S 270.49 87.2 8.17 0 re S 278.66 87.2 8.17 0 re S 286.83 87.2 8.17 0 re S 295 87.2 8.17 0 re S 303.17 87.2 8.17 0 re S 311.34 87.2 8.17 0 re S 319.51 87.2 8.17 0 re S 327.68 87.2 8.17 0 re S 335.85 87.2 8.17 0 re S 344.02 87.2 8.17 0 re S 352.19 87.2 8.17 0 re S 360.36 87.2 8.17 0 re S 368.53 87.2 8.17 0 re S 376.7 87.2 8.17 0 re S 384.87 87.2 8.17 0 re S 393.04 87.2 8.17 0 re S 401.21 87.2 8.17 0 re S 409.38 87.2 8.17 0 re S 417.55 87.2 8.17 0 re S 425.72 87.2 8.17 0 re S 433.89 87.2 8.17 0 re S 442.06 87.2 8.17 0 re S 450.23 87.2 8.17 16.38 re S Q Q showpage %%PageTrailer pdfEndPage %%Trailer end %%DocumentSuppliedResources: %%EOF starpu-1.2.3+dfsg/doc/doxygen/chapters/images/distrib_data_histo.pdf000066400000000000000000000147641320135501600256140ustar00rootroot00000000000000%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20131108153836) /ModDate (D:20131108153836) /Title (R Graphics Output) /Producer (R 3.0.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 2572 /Filter /FlateDecode >> stream xM ϧSeF!A@ $@1<l'-Dv;]]OD˳nz1=}{vz˲L痷o<\YQT9sS99O_~ߜ?N|6e{eӯo>Ӈw%ճ7f#ճ^O/n/xy~?A9:J2l}d`[h~2FvOϦdw#kt|W|_eM/͕r)9霢_ U0J6uy7Q(z9Eч0]ϢpD\a浬Tii}Bl뼍{ cQ_a[*mN8 B؞j[wU i]UtnLens!TTMHD:RDe)0ΪW@ 929M TL CT{, yV@G!gE pQDB&Cv !3ldG X=ZMH~i—\L@#S\HIf.Z"*nx^G nf.n+>Y\ZRmixH{ݭui ^wPN UAjDǭTkvY|c:GZo !Q̅i&j{&\oy:!Bn[7BDA\ozp\N8Id>p^ TCRK\4I,D*;&j h0I,$Q$A$8e;B D?8;w @Bd @B D '[D5@Zs uNb!Υ&QoRX4I,Ēswcr 8f.BrcDMb!4xXuI,DB̚I,.HB@o^Xe<&C_]٫Z2!GDp3D 9!~i"6w1*w]7CԐ 5䄠b CNe\'|p J4>"[s 3nRCN,qs!'TrBb1'.̥Klo&{x=*sXro7DYrqHFGl.:a3D8:tQQV?$A4S/;{{sGIl]ŢAZ, #cQӈURˁsttR3dCɉtEV=y{"?T)5NbF,hz-hz-hz-=.jXiX{/F$}@|z9]+dĢG(eIoĢGaF,zEN׈E2kQh75~-=U"IXT eF,z_^EOYÈEO%]kĢ_E2Ըk &v\JC2 jmEV9,iOZgiԈ=L(J`z'?LvKVzeGg{lZH Ŗi}Gn󩖕9Wf=EԧF2۟(X0ףAVtbemN?ϡ6ʜn]mO }'deN9E*J]ʜnsEG Q|3eLg2xaq2~/02xa X?]~fƪׯQ0qhG;S4NpA ^uuXB4:>]FA8$Gg¾xaqK:=/:,N2mbl:,cy-xaqùgQ5]?o@d0}э eWNbl:,c>0Vuz ^vuXlA8a_txaq@w|/:,Nel:,cio:>]齹xaqۃs</:,~>}:,Nvz@cxaqso:>]?]u|/:,cC0!xa:>]'cYX~Ӵ7qendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 504 504] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000002936 00000 n 0000003019 00000 n 0000003142 00000 n 0000003175 00000 n 0000000212 00000 n 0000000292 00000 n 0000005870 00000 n 0000006127 00000 n 0000006224 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 6326 %%EOF starpu-1.2.3+dfsg/doc/doxygen/chapters/images/distrib_data_histo.png000066400000000000000000000230171320135501600256160ustar00rootroot00000000000000PNG  IHDRMgAMA asRGB cHRMz&u0`:pQ<qPLTE81ytRNSD3"fݻwU0 DPf3짟ڙݟuiu~\"憂wUN@qr[}?0Y=g?ix5bKGDH pHYsHHFk>"IDATx흋yq'\iD9.gQHnEr;kӬۺ6˺֥[mwI#}~B Oy'I_k6享Yce`ͼ_]9Hʔ껮(+8at0}Pf7{,kv89¼8a3UP"%CP.m E$NQv>[}w:,>pu _0QJ{8Lg.v4S2S?/%CS ?GIGA}' MA$rxs*{ӄ9Ƒ/sMHd!ueQ ONo dAΝCzҼ>kHA;~H"F"K=yei>t"2$<:`,]҄0 3)1ftՐO޳q})|rx\;K.ٲW4\+. 4";;Qq%̳A.vCRHj"RGڌJH]:) U&Rxq$N7~q{).j u%Rꆑ-T#٘qr:/GoRݥvT O[)#sz+¯.o-&4_6S!$v:.%X}ק6(ivkL0jPW"enB5R,bPw]v-A]YQCxKPVQcCxKP^ s!%h=CxKfM#aJ@5ہ&kSiFtفk΅?{[kz_DŽ?ܛRo:I<y@5 Цԇ;ہE~,6vrہ6kЦY!h&w!h& h&%.v͚Wm$\wo ڬIYs!%h!.!܉M!h=!-Eι@Sn)*w;CljS9IlB[XX$vr7$ T@On.IsX؁\Z,&&!34TҚ-Ar7$Lwo Kk;}sX؄6SaXEg'N&ث$vYΧSÚ.: a*l݅o07w Ego7w ۅgxDg4Z+wiMrd޻#~8㥵=ZZ\Ytn#gg>ÔWu>R$ǥ5 0%q)Ll~i*8*[9j$]/r3T|I8r\;w=ѳGKQ)Q,F~uÔ?sWZ SI5y}&ILx5Ii*\Zrg>I*IPM${#Tl@5 |/I›kz_'6)*wVÚKS"Y5h&y4%5[]4 C;Xzڴ|+w5IQ5V45 (V°&rT$vTrhS ہJ宖7IP1]=oXdk4+wnM2Úl4Xg~iM2Úp4 $Dw5mbMBuT^i*<52.I>Ú4 C~$6TtI@p9l.I`*l6:LˡM}4~ǤFp9)sXMgӊ5 㸩$њTxkgMugsXe~.IpԄHk/&M$ˇ&=$]k+bMB)$vÚsS vq̔h>%h0ˡMYSa;PЦ<WЦ\w [jKkTGrWKkT,@rWKkTl@rWЦ?C T*wvP SaXN]# Út: LaMbЦO5 9W5 h1uMkOWt 0f kçvL4 f}F2Gl: ;]/]m(WJkz.6}d׻TO}b5a=CRo$ ?YNytsB&b&)Mfٜ~OkWJķf/0WGbЦL6G.*|-/ITm dSo*w9OeN m dx>=P,8hMS_|ͿdK_4/y;o& 8=:muSrho>l_~q(N#1{Tt84mj*\m:Ro$[;mVSrh|x3\xfKSrhSZfm媩g)|zST*wUSaiMBzqŦxΧ]5CJS}`VoiM%ESWdn\,z׍aM2JCt #=fakM+K }U#[rhӛ_ߦ4v `z"Σ f1nv{\=y_1ҔŸ^+΄/-׏>= _KSz.L%o6ۋL(~Aa0wnJ4//aDc_Vr ??S[{{Klx>=107bD:9nC|NtlKSڔ./-np \ROOY9nX~"9|&/LʡM1殞q;M.gj9n okwy%I\"lܡ#Z[X瓟ř_wDxϛ.WxNxq tW,h/5 Dwow sgߚ˧yY;i󨑿3ˡMpݖtqX>ܨRSЦ_B4X-/W{TU"-}ˡMeٴrƖT%;_;ܴ{_싙DoEߋKӾXA4N4=+L'rϿk˷! $ccgwfx@x3Ct !^:/of73KGy-{.ጣ:*{:a е趦G{RN_6$J 9Ū=ltZ"yZw:ʢw:wS 9'U^19n8A'քH~I7@NtЂN=^6DQY兎I:ש5!2}!s;4}+? =%%n兎~ N5!:p/DI֝85sEYCG@{tL.ΝvS:xO .〝EɠetMNS܁1u{+i粡B9u\O9T#]&DFnv{Q#9s-w|wSggӚ8;&_;uk|N6]op=Dv0K#?IK]UF: *̓G np]$e(^HOLQi_"|"%0\FhK }8w bğ96}v#HJ5 YDWhD›=oʏ3G]m#?rABxH.*WJzN$9]LFqeQGaB:Iҕh#!qmA0]#BFP" oVT@erGrŅ4a!|[r mP|>#JjG_1fKjWN)l(E$Bz$[&HDWea9\q8`OE8Er oӖ Cz3lT>Jr3g^Fh\2F=#E"_7kމҘ4?ٲ.|4Kdn!<]T,ͼ?2TҨ*%CG³ n=8$Lu7"]ן!s5bQ!<]T,ፊ~*F9{86O/ծsG-6r=\G-Ee$9誈L$mF'' dGx d %镗e0ȏ,6"Sys7(hfd0W1<ROF$T$d"s=qj$@pJOJWBAā[l5HD(6E(Hfre[\%N;>ļZqy: *sy\N`n(-_r$~W\>&EqpbX%tEXtdate:create2013-11-08T15:41:34+01:00ؒ%tEXtdate:modify2013-11-08T15:41:34+01:00`. tEXtpdf:HiResBoundingBox504x504+0+0wtEXtpdf:VersionPDF-1.4 G:xIENDB`starpu-1.2.3+dfsg/doc/doxygen/chapters/images/paje_draw_histogram.eps000066400000000000000000001107361320135501600260000ustar00rootroot00000000000000%!PS-Adobe-3.0 EPSF-3.0 %Produced by poppler pdftops version: 0.22.5 (http://poppler.freedesktop.org) %%Creator: R %%LanguageLevel: 2 %%DocumentSuppliedResources: (atend) %%BoundingBox: 0 0 504 504 %%HiResBoundingBox: 0 0 504 504 %%DocumentSuppliedResources: (atend) %%EndComments %%BeginProlog %%BeginResource: procset xpdf 3.00 0 %%Copyright: Copyright 1996-2011 Glyph & Cog, LLC /xpdf 75 dict def xpdf begin % PDF special state /pdfDictSize 15 def /pdfSetup { /setpagedevice where { pop 2 dict begin /Policies 1 dict dup begin /PageSize 6 def end def { /Duplex true def } if currentdict end setpagedevice } { pop } ifelse } def /pdfSetupPaper { 2 array astore /setpagedevice where { pop 2 dict begin /PageSize exch def /ImagingBBox null def currentdict end setpagedevice } { pop } ifelse } def /pdfStartPage { pdfDictSize dict begin /pdfFillCS [] def /pdfFillXform {} def /pdfStrokeCS [] def /pdfStrokeXform {} def /pdfFill [0] def /pdfStroke [0] def /pdfFillOP false def /pdfStrokeOP false def /pdfLastFill false def /pdfLastStroke false def /pdfTextMat [1 0 0 1 0 0] def /pdfFontSize 0 def /pdfCharSpacing 0 def /pdfTextRender 0 def /pdfPatternCS false def /pdfTextRise 0 def /pdfWordSpacing 0 def /pdfHorizScaling 1 def /pdfTextClipPath [] def } def /pdfEndPage { end } def % PDF color state /cs { /pdfFillXform exch def dup /pdfFillCS exch def setcolorspace } def /CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def setcolorspace } def /sc { pdfLastFill not { pdfFillCS setcolorspace } if dup /pdfFill exch def aload pop pdfFillXform setcolor /pdfLastFill true def /pdfLastStroke false def } def /SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if dup /pdfStroke exch def aload pop pdfStrokeXform setcolor /pdfLastStroke true def /pdfLastFill false def } def /op { /pdfFillOP exch def pdfLastFill { pdfFillOP setoverprint } if } def /OP { /pdfStrokeOP exch def pdfLastStroke { pdfStrokeOP setoverprint } if } def /fCol { pdfLastFill not { pdfFillCS setcolorspace pdfFill aload pop pdfFillXform setcolor pdfFillOP setoverprint /pdfLastFill true def /pdfLastStroke false def } if } def /sCol { pdfLastStroke not { pdfStrokeCS setcolorspace pdfStroke aload pop pdfStrokeXform setcolor pdfStrokeOP setoverprint /pdfLastStroke true def /pdfLastFill false def } if } def % build a font /pdfMakeFont { 4 3 roll findfont 4 2 roll matrix scale makefont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /Encoding exch def currentdict end definefont pop } def /pdfMakeFont16 { exch findfont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /WMode exch def currentdict end definefont pop } def % graphics state operators /q { gsave pdfDictSize dict begin } def /Q { end grestore /pdfLastFill where { pop pdfLastFill { pdfFillOP setoverprint } { pdfStrokeOP setoverprint } ifelse } if } def /cm { concat } def /d { setdash } def /i { setflat } def /j { setlinejoin } def /J { setlinecap } def /M { setmiterlimit } def /w { setlinewidth } def % path segment operators /m { moveto } def /l { lineto } def /c { curveto } def /re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath } def /h { closepath } def % path painting operators /S { sCol stroke } def /Sf { fCol stroke } def /f { fCol fill } def /f* { fCol eofill } def % clipping operators /W { clip newpath } def /W* { eoclip newpath } def /Ws { strokepath clip newpath } def % text state operators /Tc { /pdfCharSpacing exch def } def /Tf { dup /pdfFontSize exch def dup pdfHorizScaling mul exch matrix scale pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put exch findfont exch makefont setfont } def /Tr { /pdfTextRender exch def } def /Tp { /pdfPatternCS exch def } def /Ts { /pdfTextRise exch def } def /Tw { /pdfWordSpacing exch def } def /Tz { /pdfHorizScaling exch def } def % text positioning operators /Td { pdfTextMat transform moveto } def /Tm { /pdfTextMat exch def } def % text string operators /xyshow where { pop /xyshow2 { dup length array 0 2 2 index length 1 sub { 2 index 1 index 2 copy get 3 1 roll 1 add get pdfTextMat dtransform 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put } for exch pop xyshow } def }{ /xyshow2 { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval show moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval show moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /cshow where { pop /xycp { 0 3 2 roll { pop pop currentpoint 3 2 roll 1 string dup 0 4 3 roll put false charpath moveto 2 copy get 2 index 2 index 1 add get pdfTextMat dtransform rmoveto 2 add } exch cshow pop pop } def }{ /xycp { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval false charpath moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval false charpath moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /Tj { fCol 0 pdfTextRise pdfTextMat dtransform rmoveto currentpoint 4 2 roll pdfTextRender 1 and 0 eq { 2 copy xyshow2 } if pdfTextRender 3 and dup 1 eq exch 2 eq or { 3 index 3 index moveto 2 copy currentfont /FontType get 3 eq { fCol } { sCol } ifelse xycp currentpoint stroke moveto } if pdfTextRender 4 and 0 ne { 4 2 roll moveto xycp /pdfTextClipPath [ pdfTextClipPath aload pop {/moveto cvx} {/lineto cvx} {/curveto cvx} {/closepath cvx} pathforall ] def currentpoint newpath moveto } { pop pop pop pop } ifelse 0 pdfTextRise neg pdfTextMat dtransform rmoveto } def /TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 pdfTextMat dtransform rmoveto } def /TJmV { 0.001 mul pdfFontSize mul neg 0 exch pdfTextMat dtransform rmoveto } def /Tclip { pdfTextClipPath cvx exec clip newpath /pdfTextClipPath [] def } def /Tclip* { pdfTextClipPath cvx exec eoclip newpath /pdfTextClipPath [] def } def % Level 2/3 image operators /pdfImBuf 100 string def /pdfImStr { 2 copy exch length lt { 2 copy get exch 1 add exch } { () } ifelse } def /skipEOD { { currentfile pdfImBuf readline not { pop exit } if (%-EOD-) eq { exit } if } loop } def /pdfIm { image skipEOD } def /pdfImM { fCol imagemask skipEOD } def /pr { 2 index 2 index 3 2 roll putinterval 4 add } def /pdfImClip { gsave 0 2 4 index length 1 sub { dup 4 index exch 2 copy get 5 index div put 1 add 3 index exch 2 copy get 3 index div put } for pop pop rectclip } def /pdfImClipEnd { grestore } def % shading operators /colordelta { false 0 1 3 index length 1 sub { dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { pop true } if } for exch pop exch pop } def /funcCol { func n array astore } def /funcSH { dup 0 eq { true } { dup 6 eq { false } { 4 index 4 index funcCol dup 6 index 4 index funcCol dup 3 1 roll colordelta 3 1 roll 5 index 5 index funcCol dup 3 1 roll colordelta 3 1 roll 6 index 8 index funcCol dup 3 1 roll colordelta 3 1 roll colordelta or or or } ifelse } ifelse { 1 add 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch 6 index 6 index 4 index 4 index 4 index funcSH 2 index 6 index 6 index 4 index 4 index funcSH 6 index 2 index 4 index 6 index 4 index funcSH 5 3 roll 3 2 roll funcSH pop pop } { pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul funcCol sc dup 4 index exch mat transform m 3 index 3 index mat transform l 1 index 3 index mat transform l mat transform l pop pop h f* } ifelse } def /axialCol { dup 0 lt { pop t0 } { dup 1 gt { pop t1 } { dt mul t0 add } ifelse } ifelse func n array astore } def /axialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index axialCol 2 index axialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index axialSH exch 3 2 roll axialSH } { pop 2 copy add 0.5 mul axialCol sc exch dup dx mul x0 add exch dy mul y0 add 3 2 roll dup dx mul x0 add exch dy mul y0 add dx abs dy abs ge { 2 copy yMin sub dy mul dx div add yMin m yMax sub dy mul dx div add yMax l 2 copy yMax sub dy mul dx div add yMax l yMin sub dy mul dx div add yMin l h f* } { exch 2 copy xMin sub dx mul dy div add xMin exch m xMax sub dx mul dy div add xMax exch l exch 2 copy xMax sub dx mul dy div add xMax exch l xMin sub dx mul dy div add xMin exch l h f* } ifelse } ifelse } def /radialCol { dup t0 lt { pop t0 } { dup t1 gt { pop t1 } if } ifelse func n array astore } def /radialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index dt mul t0 add radialCol 2 index dt mul t0 add radialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index radialSH exch 3 2 roll radialSH } { pop 2 copy add 0.5 mul dt mul t0 add radialCol sc encl { exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 0 360 arc h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 360 0 arcn h f } { 2 copy dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arcn dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arcn h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arc dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arc h f } ifelse } ifelse } def end %%EndResource %%EndProlog %%BeginSetup xpdf begin /F10_0 /Helvetica 1 1 [ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle /parenleft/parenright/asterisk/plus/comma/minus/period/slash /zero/one/two/three/four/five/six/seven /eight/nine/colon/semicolon/less/equal/greater/question /at/A/B/C/D/E/F/G /H/I/J/K/L/M/N/O /P/Q/R/S/T/U/V/W /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore /quoteleft/a/b/c/d/e/f/g /h/i/j/k/l/m/n/o /p/q/r/s/t/u/v/w /x/y/z/braceleft/bar/braceright/asciitilde/bullet /Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl /circumflex/perthousand/Scaron/guilsinglleft/OE/bullet/Zcaron/bullet /dotlessi/grave/acute/circumflex/tilde/macron/breve/dotaccent /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron /space/exclamdown/cent/sterling/currency/yen/brokenbar/section /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] pdfMakeFont %%EndSetup pdfStartPage [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer 0 0 504 504 re W q 1 J 1 j q Q q Q q Q q /DeviceRGB {} cs [0 0 0] sc [1 1 1] sc /DeviceRGB {} CS [0 0 0] SC [1 1 1] SC 1.06 w [] 0 d 1 J 1 j 10 M 0 0 504 504 re f 0 0 504 504 re S Q q Q q 41.22 457.97 142.27 14.38 re W /DeviceRGB {} cs [0 0 0] sc [0.8 0.8 0.8] sc /DeviceRGB {} CS [0 0 0] SC [0.498 0.498 0.498] SC 1.06 w [] 0 d 1 J 1 j 10 M 41.22 457.97 142.27 14.38 re f 41.22 457.97 142.27 14.38 re S [1 0 0 1 0 0] Tm 0 0 Td [0 0 0] sc [10 0 0 10 78.45 461.57] Tm 0 0 Td /F10_0 1 Tf (chol_model_11) [0.5 0 0.556 0 0.556 0 0.222 0 0.556 0 0.833 0 0.556 0 0.556 0 0.556 0 0.222 0 0.556 0 0.556 0 0.556 0] Tj Q q Q q 187.09 457.97 142.27 14.38 re W /DeviceRGB {} cs [0 0 0] sc [0.8 0.8 0.8] sc /DeviceRGB {} CS [0 0 0] SC [0.498 0.498 0.498] SC 1.06 w [] 0 d 1 J 1 j 10 M 187.09 457.97 142.27 14.38 re f 187.09 457.97 142.27 14.38 re S [1 0 0 1 0 0] Tm 0 0 Td [0 0 0] sc [10 0 0 10 224.32 461.57] Tm 0 0 Td /F10_0 1 Tf (chol_model_21) [0.5 0 0.556 0 0.556 0 0.222 0 0.556 0 0.833 0 0.556 0 0.556 0 0.556 0 0.222 0 0.556 0 0.556 0 0.556 0] Tj Q q Q q 332.95 457.97 142.27 14.38 re W /DeviceRGB {} cs [0 0 0] sc [0.8 0.8 0.8] sc /DeviceRGB {} CS [0 0 0] SC [0.498 0.498 0.498] SC 1.06 w [] 0 d 1 J 1 j 10 M 332.95 457.97 142.27 14.38 re f 332.95 457.97 142.27 14.38 re S [1 0 0 1 0 0] Tm 0 0 Td [0 0 0] sc [10 0 0 10 370.18 461.57] Tm 0 0 Td /F10_0 1 Tf (chol_model_22) [0.5 0 0.556 0 0.556 0 0.222 0 0.556 0 0.833 0 0.556 0 0.556 0 0.556 0 0.222 0 0.556 0 0.556 0 0.556 0] Tj Q q Q q 41.22 249.43 142.27 208.54 re W /DeviceRGB {} cs [0 0 0] sc [1 1 1] sc 41.22 249.43 142.27 208.54 re f /DeviceRGB {} CS [0 0 0] SC [0.98 0.98 0.98] SC 1.06 w [] 0 d 0 J 1 j 10 M 41.22 294.01 m 183.49 294.01 l S 41.22 364.23 m 183.49 364.23 l S 41.22 434.45 m 183.49 434.45 l S 53.25 249.43 m 53.25 457.97 l S 80.05 249.43 m 80.05 457.97 l S 106.85 249.43 m 106.85 457.97 l S 133.64 249.43 m 133.64 457.97 l S 160.44 249.43 m 160.44 457.97 l S [0.898 0.898 0.898] SC 0.43 w [] 0 d 41.22 258.9 m 183.49 258.9 l S 41.22 329.12 m 183.49 329.12 l S 41.22 399.34 m 183.49 399.34 l S 66.65 249.43 m 66.65 457.97 l S 93.45 249.43 m 93.45 457.97 l S 120.24 249.43 m 120.24 457.97 l S 147.04 249.43 m 147.04 457.97 l S 173.84 249.43 m 173.84 457.97 l S [0.333 0.694 0.969] sc 47.69 258.9 m 51.61 258.9 l 51.61 258.9 l 47.69 258.9 l h f [0.31 0.643 0.902] sc 51.61 258.9 3.92 17.55 re f 55.53 258.9 3.92 17.55 re f [0.333 0.694 0.969] sc 59.45 258.9 m 63.37 258.9 l 63.37 258.9 l 59.45 258.9 l h f 63.37 258.9 m 67.29 258.9 l 67.29 258.9 l 63.37 258.9 l h f 67.29 258.9 m 71.21 258.9 l 71.21 258.9 l 67.29 258.9 l h f 71.2 258.9 m 75.12 258.9 l 75.12 258.9 l 71.2 258.9 l h f 75.12 258.9 m 79.04 258.9 l 79.04 258.9 l 75.12 258.9 l h f 79.04 258.9 m 82.96 258.9 l 82.96 258.9 l 79.04 258.9 l h f 82.96 258.9 m 86.88 258.9 l 86.88 258.9 l 82.96 258.9 l h f 86.88 258.9 m 90.8 258.9 l 90.8 258.9 l 86.88 258.9 l h f 90.8 258.9 m 94.72 258.9 l 94.72 258.9 l 90.8 258.9 l h f 94.72 258.9 m 98.64 258.9 l 98.64 258.9 l 94.72 258.9 l h f 98.64 258.9 m 102.56 258.9 l 102.56 258.9 l 98.64 258.9 l h f 102.56 258.9 m 106.48 258.9 l 106.48 258.9 l 102.56 258.9 l h f 106.48 258.9 m 110.4 258.9 l 110.4 258.9 l 106.48 258.9 l h f 110.4 258.9 m 114.32 258.9 l 114.32 258.9 l 110.4 258.9 l h f 114.32 258.9 m 118.24 258.9 l 118.24 258.9 l 114.32 258.9 l h f 118.23 258.9 m 122.15 258.9 l 122.15 258.9 l 118.23 258.9 l h f 122.15 258.9 m 126.07 258.9 l 126.07 258.9 l 122.15 258.9 l h f 126.07 258.9 m 129.99 258.9 l 129.99 258.9 l 126.07 258.9 l h f 129.99 258.9 m 133.91 258.9 l 133.91 258.9 l 129.99 258.9 l h f 133.91 258.9 m 137.83 258.9 l 137.83 258.9 l 133.91 258.9 l h f 137.83 258.9 m 141.75 258.9 l 141.75 258.9 l 137.83 258.9 l h f 141.75 258.9 m 145.67 258.9 l 145.67 258.9 l 141.75 258.9 l h f 145.67 258.9 m 149.59 258.9 l 149.59 258.9 l 145.67 258.9 l h f 149.59 258.9 m 153.51 258.9 l 153.51 258.9 l 149.59 258.9 l h f 153.51 258.9 m 157.43 258.9 l 157.43 258.9 l 153.51 258.9 l h f 157.43 258.9 m 161.35 258.9 l 161.35 258.9 l 157.43 258.9 l h f 161.35 258.9 m 165.27 258.9 l 165.27 258.9 l 161.35 258.9 l h f 165.26 258.9 m 169.18 258.9 l 169.18 258.9 l 165.26 258.9 l h f 169.18 258.9 m 173.1 258.9 l 173.1 258.9 l 169.18 258.9 l h f 173.1 258.9 m 177.02 258.9 l 177.02 258.9 l 173.1 258.9 l h f [0.498 0.498 0.498] SC 1.06 w [] 0 d 1 J 41.22 249.43 142.27 208.54 re S Q q Q q 41.22 37.28 142.27 208.54 re W /DeviceRGB {} cs [0 0 0] sc [1 1 1] sc 41.22 37.28 142.27 208.54 re f /DeviceRGB {} CS [0 0 0] SC [0.98 0.98 0.98] SC 1.06 w [] 0 d 0 J 1 j 10 M 41.22 78.89 m 183.49 78.89 l S 41.22 143.16 m 183.49 143.16 l S 41.22 207.43 m 183.49 207.43 l S 53.25 37.28 m 53.25 245.83 l S 80.05 37.28 m 80.05 245.83 l S 106.85 37.28 m 106.85 245.83 l S 133.64 37.28 m 133.64 245.83 l S 160.44 37.28 m 160.44 245.83 l S [0.898 0.898 0.898] SC 0.43 w [] 0 d 41.22 46.76 m 183.49 46.76 l S 41.22 111.03 m 183.49 111.03 l S 41.22 175.29 m 183.49 175.29 l S 41.22 239.56 m 183.49 239.56 l S 66.65 37.28 m 66.65 245.83 l S 93.45 37.28 m 93.45 245.83 l S 120.24 37.28 m 120.24 245.83 l S 147.04 37.28 m 147.04 245.83 l S 173.84 37.28 m 173.84 245.83 l S [0.333 0.694 0.969] sc 47.69 46.76 m 51.61 46.76 l 51.61 46.76 l 47.69 46.76 l h f [0.318 0.651 0.914] sc 51.61 46.76 3.92 12.85 re f [0.306 0.635 0.886] sc 55.53 46.76 3.92 19.28 re f [0.333 0.694 0.969] sc 59.45 46.76 m 63.37 46.76 l 63.37 46.76 l 59.45 46.76 l h f 63.37 46.76 m 67.29 46.76 l 67.29 46.76 l 63.37 46.76 l h f 67.29 46.76 m 71.21 46.76 l 71.21 46.76 l 67.29 46.76 l h f 71.2 46.76 m 75.12 46.76 l 75.12 46.76 l 71.2 46.76 l h f 75.12 46.76 m 79.04 46.76 l 79.04 46.76 l 75.12 46.76 l h f 79.04 46.76 m 82.96 46.76 l 82.96 46.76 l 79.04 46.76 l h f 82.96 46.76 m 86.88 46.76 l 86.88 46.76 l 82.96 46.76 l h f 86.88 46.76 m 90.8 46.76 l 90.8 46.76 l 86.88 46.76 l h f 90.8 46.76 m 94.72 46.76 l 94.72 46.76 l 90.8 46.76 l h f 94.72 46.76 m 98.64 46.76 l 98.64 46.76 l 94.72 46.76 l h f 98.64 46.76 m 102.56 46.76 l 102.56 46.76 l 98.64 46.76 l h f 102.56 46.76 m 106.48 46.76 l 106.48 46.76 l 102.56 46.76 l h f 106.48 46.76 m 110.4 46.76 l 110.4 46.76 l 106.48 46.76 l h f 110.4 46.76 m 114.32 46.76 l 114.32 46.76 l 110.4 46.76 l h f 114.32 46.76 m 118.24 46.76 l 118.24 46.76 l 114.32 46.76 l h f 118.23 46.76 m 122.15 46.76 l 122.15 46.76 l 118.23 46.76 l h f 122.15 46.76 m 126.07 46.76 l 126.07 46.76 l 122.15 46.76 l h f 126.07 46.76 m 129.99 46.76 l 129.99 46.76 l 126.07 46.76 l h f 129.99 46.76 m 133.91 46.76 l 133.91 46.76 l 129.99 46.76 l h f 133.91 46.76 m 137.83 46.76 l 137.83 46.76 l 133.91 46.76 l h f 137.83 46.76 m 141.75 46.76 l 141.75 46.76 l 137.83 46.76 l h f 141.75 46.76 m 145.67 46.76 l 145.67 46.76 l 141.75 46.76 l h f 145.67 46.76 m 149.59 46.76 l 149.59 46.76 l 145.67 46.76 l h f 149.59 46.76 m 153.51 46.76 l 153.51 46.76 l 149.59 46.76 l h f 153.51 46.76 m 157.43 46.76 l 157.43 46.76 l 153.51 46.76 l h f 157.43 46.76 m 161.35 46.76 l 161.35 46.76 l 157.43 46.76 l h f 161.35 46.76 m 165.27 46.76 l 165.27 46.76 l 161.35 46.76 l h f 165.26 46.76 m 169.18 46.76 l 169.18 46.76 l 165.26 46.76 l h f 169.18 46.76 m 173.1 46.76 l 173.1 46.76 l 169.18 46.76 l h f 173.1 46.76 m 177.02 46.76 l 177.02 46.76 l 173.1 46.76 l h f [0.498 0.498 0.498] SC 1.06 w [] 0 d 1 J 41.22 37.28 142.27 208.54 re S Q q Q q 187.09 249.43 142.27 208.54 re W /DeviceRGB {} cs [0 0 0] sc [1 1 1] sc 187.09 249.43 142.27 208.54 re f /DeviceRGB {} CS [0 0 0] SC [0.98 0.98 0.98] SC 1.06 w [] 0 d 0 J 1 j 10 M 187.09 294.01 m 329.35 294.01 l S 187.09 364.23 m 329.35 364.23 l S 187.09 434.45 m 329.35 434.45 l S 199.12 249.43 m 199.12 457.97 l S 225.91 249.43 m 225.91 457.97 l S 252.71 249.43 m 252.71 457.97 l S 279.51 249.43 m 279.51 457.97 l S 306.31 249.43 m 306.31 457.97 l S [0.898 0.898 0.898] SC 0.43 w [] 0 d 187.09 258.9 m 329.35 258.9 l S 187.09 329.12 m 329.35 329.12 l S 187.09 399.34 m 329.35 399.34 l S 212.51 249.43 m 212.51 457.97 l S 239.31 249.43 m 239.31 457.97 l S 266.11 249.43 m 266.11 457.97 l S 292.91 249.43 m 292.91 457.97 l S 319.71 249.43 m 319.71 457.97 l S [0.333 0.694 0.969] sc 193.56 258.9 m 197.48 258.9 l 197.48 258.9 l 193.56 258.9 l h f 197.47 258.9 m 201.39 258.9 l 201.39 258.9 l 197.47 258.9 l h f 201.39 258.9 m 205.31 258.9 l 205.31 258.9 l 201.39 258.9 l h f 205.31 258.9 m 209.23 258.9 l 209.23 258.9 l 205.31 258.9 l h f 209.23 258.9 m 213.15 258.9 l 213.15 258.9 l 209.23 258.9 l h f 213.15 258.9 m 217.07 258.9 l 217.07 258.9 l 213.15 258.9 l h f 217.07 258.9 m 220.99 258.9 l 220.99 258.9 l 217.07 258.9 l h f 220.99 258.9 m 224.91 258.9 l 224.91 258.9 l 220.99 258.9 l h f 224.91 258.9 m 228.83 258.9 l 228.83 258.9 l 224.91 258.9 l h f 228.83 258.9 m 232.75 258.9 l 232.75 258.9 l 228.83 258.9 l h f [0.329 0.682 0.953] sc 232.75 258.9 3.92 3.51 re f [0.227 0.475 0.675] sc 236.67 258.9 3.92 80.75 re f [0.239 0.502 0.71] sc 240.59 258.9 3.92 70.22 re f [0.329 0.682 0.953] sc 244.5 258.9 3.92 3.51 re f [0.333 0.694 0.969] sc 248.42 258.9 m 252.34 258.9 l 252.34 258.9 l 248.42 258.9 l h f 252.34 258.9 m 256.26 258.9 l 256.26 258.9 l 252.34 258.9 l h f 256.26 258.9 m 260.18 258.9 l 260.18 258.9 l 256.26 258.9 l h f 260.18 258.9 m 264.1 258.9 l 264.1 258.9 l 260.18 258.9 l h f 264.1 258.9 m 268.02 258.9 l 268.02 258.9 l 264.1 258.9 l h f 268.02 258.9 m 271.94 258.9 l 271.94 258.9 l 268.02 258.9 l h f 271.94 258.9 m 275.86 258.9 l 275.86 258.9 l 271.94 258.9 l h f 275.86 258.9 m 279.78 258.9 l 279.78 258.9 l 275.86 258.9 l h f 279.78 258.9 m 283.7 258.9 l 283.7 258.9 l 279.78 258.9 l h f 283.7 258.9 m 287.62 258.9 l 287.62 258.9 l 283.7 258.9 l h f 287.62 258.9 m 291.54 258.9 l 291.54 258.9 l 287.62 258.9 l h f 291.53 258.9 m 295.45 258.9 l 295.45 258.9 l 291.53 258.9 l h f 295.45 258.9 m 299.37 258.9 l 299.37 258.9 l 295.45 258.9 l h f 299.37 258.9 m 303.29 258.9 l 303.29 258.9 l 299.37 258.9 l h f 303.29 258.9 m 307.21 258.9 l 307.21 258.9 l 303.29 258.9 l h f 307.21 258.9 m 311.13 258.9 l 311.13 258.9 l 307.21 258.9 l h f 311.13 258.9 m 315.05 258.9 l 315.05 258.9 l 311.13 258.9 l h f 315.05 258.9 m 318.97 258.9 l 318.97 258.9 l 315.05 258.9 l h f 318.97 258.9 m 322.89 258.9 l 322.89 258.9 l 318.97 258.9 l h f [0.498 0.498 0.498] SC 1.06 w [] 0 d 1 J 187.09 249.43 142.27 208.54 re S Q q Q q 187.09 37.28 142.27 208.54 re W /DeviceRGB {} cs [0 0 0] sc [1 1 1] sc 187.09 37.28 142.27 208.54 re f /DeviceRGB {} CS [0 0 0] SC [0.98 0.98 0.98] SC 1.06 w [] 0 d 0 J 1 j 10 M 187.09 78.89 m 329.35 78.89 l S 187.09 143.16 m 329.35 143.16 l S 187.09 207.43 m 329.35 207.43 l S 199.12 37.28 m 199.12 245.83 l S 225.91 37.28 m 225.91 245.83 l S 252.71 37.28 m 252.71 245.83 l S 279.51 37.28 m 279.51 245.83 l S 306.31 37.28 m 306.31 245.83 l S [0.898 0.898 0.898] SC 0.43 w [] 0 d 187.09 46.76 m 329.35 46.76 l S 187.09 111.03 m 329.35 111.03 l S 187.09 175.29 m 329.35 175.29 l S 187.09 239.56 m 329.35 239.56 l S 212.51 37.28 m 212.51 245.83 l S 239.31 37.28 m 239.31 245.83 l S 266.11 37.28 m 266.11 245.83 l S 292.91 37.28 m 292.91 245.83 l S 319.71 37.28 m 319.71 245.83 l S [0.333 0.694 0.969] sc 193.56 46.76 m 197.48 46.76 l 197.48 46.76 l 193.56 46.76 l h f 197.47 46.76 m 201.39 46.76 l 201.39 46.76 l 197.47 46.76 l h f 201.39 46.76 m 205.31 46.76 l 205.31 46.76 l 201.39 46.76 l h f 205.31 46.76 m 209.23 46.76 l 209.23 46.76 l 205.31 46.76 l h f 209.23 46.76 m 213.15 46.76 l 213.15 46.76 l 209.23 46.76 l h f 213.15 46.76 m 217.07 46.76 l 217.07 46.76 l 213.15 46.76 l h f 217.07 46.76 m 220.99 46.76 l 220.99 46.76 l 217.07 46.76 l h f 220.99 46.76 m 224.91 46.76 l 224.91 46.76 l 220.99 46.76 l h f 224.91 46.76 m 228.83 46.76 l 228.83 46.76 l 224.91 46.76 l h f 228.83 46.76 m 232.75 46.76 l 232.75 46.76 l 228.83 46.76 l h f [0.322 0.663 0.929] sc 232.75 46.76 3.92 9.64 re f [0.231 0.482 0.686] sc 236.67 46.76 3.92 70.69 re f [0.243 0.51 0.722] sc 240.59 46.76 3.92 61.05 re f [0.329 0.682 0.953] sc 244.5 46.76 3.92 3.21 re f [0.333 0.694 0.969] sc 248.42 46.76 m 252.34 46.76 l 252.34 46.76 l 248.42 46.76 l h f 252.34 46.76 m 256.26 46.76 l 256.26 46.76 l 252.34 46.76 l h f 256.26 46.76 m 260.18 46.76 l 260.18 46.76 l 256.26 46.76 l h f 260.18 46.76 m 264.1 46.76 l 264.1 46.76 l 260.18 46.76 l h f 264.1 46.76 m 268.02 46.76 l 268.02 46.76 l 264.1 46.76 l h f 268.02 46.76 m 271.94 46.76 l 271.94 46.76 l 268.02 46.76 l h f 271.94 46.76 m 275.86 46.76 l 275.86 46.76 l 271.94 46.76 l h f 275.86 46.76 m 279.78 46.76 l 279.78 46.76 l 275.86 46.76 l h f 279.78 46.76 m 283.7 46.76 l 283.7 46.76 l 279.78 46.76 l h f 283.7 46.76 m 287.62 46.76 l 287.62 46.76 l 283.7 46.76 l h f 287.62 46.76 m 291.54 46.76 l 291.54 46.76 l 287.62 46.76 l h f 291.53 46.76 m 295.45 46.76 l 295.45 46.76 l 291.53 46.76 l h f 295.45 46.76 m 299.37 46.76 l 299.37 46.76 l 295.45 46.76 l h f 299.37 46.76 m 303.29 46.76 l 303.29 46.76 l 299.37 46.76 l h f 303.29 46.76 m 307.21 46.76 l 307.21 46.76 l 303.29 46.76 l h f 307.21 46.76 m 311.13 46.76 l 311.13 46.76 l 307.21 46.76 l h f 311.13 46.76 m 315.05 46.76 l 315.05 46.76 l 311.13 46.76 l h f 315.05 46.76 m 318.97 46.76 l 318.97 46.76 l 315.05 46.76 l h f 318.97 46.76 m 322.89 46.76 l 322.89 46.76 l 318.97 46.76 l h f [0.498 0.498 0.498] SC 1.06 w [] 0 d 1 J 187.09 37.28 142.27 208.54 re S Q q Q q 332.95 249.43 142.27 208.54 re W /DeviceRGB {} cs [0 0 0] sc [1 1 1] sc 332.95 249.43 142.27 208.54 re f /DeviceRGB {} CS [0 0 0] SC [0.98 0.98 0.98] SC 1.06 w [] 0 d 0 J 1 j 10 M 332.95 294.01 m 475.22 294.01 l S 332.95 364.23 m 475.22 364.23 l S 332.95 434.45 m 475.22 434.45 l S 344.98 249.43 m 344.98 457.97 l S 371.78 249.43 m 371.78 457.97 l S 398.58 249.43 m 398.58 457.97 l S 425.38 249.43 m 425.38 457.97 l S 452.17 249.43 m 452.17 457.97 l S [0.898 0.898 0.898] SC 0.43 w [] 0 d 332.95 258.9 m 475.22 258.9 l S 332.95 329.12 m 475.22 329.12 l S 332.95 399.34 m 475.22 399.34 l S 358.38 249.43 m 358.38 457.97 l S 385.18 249.43 m 385.18 457.97 l S 411.98 249.43 m 411.98 457.97 l S 438.77 249.43 m 438.77 457.97 l S 465.57 249.43 m 465.57 457.97 l S [0.333 0.694 0.969] sc 339.42 258.9 m 343.34 258.9 l 343.34 258.9 l 339.42 258.9 l h f 343.34 258.9 m 347.26 258.9 l 347.26 258.9 l 343.34 258.9 l h f 347.26 258.9 m 351.18 258.9 l 351.18 258.9 l 347.26 258.9 l h f 351.18 258.9 m 355.1 258.9 l 355.1 258.9 l 351.18 258.9 l h f 355.1 258.9 m 359.02 258.9 l 359.02 258.9 l 355.1 258.9 l h f 359.02 258.9 m 362.94 258.9 l 362.94 258.9 l 359.02 258.9 l h f 362.94 258.9 m 366.86 258.9 l 366.86 258.9 l 362.94 258.9 l h f 366.86 258.9 m 370.78 258.9 l 370.78 258.9 l 366.86 258.9 l h f 370.77 258.9 m 374.69 258.9 l 374.69 258.9 l 370.77 258.9 l h f 374.69 258.9 m 378.61 258.9 l 378.61 258.9 l 374.69 258.9 l h f 378.61 258.9 m 382.53 258.9 l 382.53 258.9 l 378.61 258.9 l h f 382.53 258.9 m 386.45 258.9 l 386.45 258.9 l 382.53 258.9 l h f 386.45 258.9 m 390.37 258.9 l 390.37 258.9 l 386.45 258.9 l h f 390.37 258.9 m 394.29 258.9 l 394.29 258.9 l 390.37 258.9 l h f 394.29 258.9 m 398.21 258.9 l 398.21 258.9 l 394.29 258.9 l h f 398.21 258.9 m 402.13 258.9 l 402.13 258.9 l 398.21 258.9 l h f 402.13 258.9 m 406.05 258.9 l 406.05 258.9 l 402.13 258.9 l h f 406.05 258.9 m 409.97 258.9 l 409.97 258.9 l 406.05 258.9 l h f 409.97 258.9 m 413.89 258.9 l 413.89 258.9 l 409.97 258.9 l h f 413.89 258.9 m 417.81 258.9 l 417.81 258.9 l 413.89 258.9 l h f [0.302 0.624 0.875] sc 417.8 258.9 3.92 24.58 re f [0.29 0.604 0.851] sc 421.72 258.9 3.92 31.6 re f [0.298 0.616 0.863] sc 425.64 258.9 3.92 28.09 re f [0.212 0.447 0.635] sc 429.56 258.9 3.92 91.28 re f [0.094 0.204 0.314] sc 433.48 258.9 3.92 189.58 re f [0.2 0.42 0.6] sc 437.4 258.9 3.92 101.81 re f [0.286 0.596 0.835] sc 441.32 258.9 3.92 35.11 re f [0.298 0.616 0.863] sc 445.24 258.9 3.92 28.09 re f [0.325 0.671 0.941] sc 449.16 258.9 3.92 7.02 re f [0.306 0.635 0.886] sc 453.08 258.9 3.92 21.06 re f [0.31 0.643 0.902] sc 457 258.9 3.92 17.55 re f [0.329 0.682 0.953] sc 460.92 258.9 3.92 3.51 re f [0.333 0.694 0.969] sc 464.83 258.9 m 468.75 258.9 l 468.75 258.9 l 464.83 258.9 l h f [0.498 0.498 0.498] SC 1.06 w [] 0 d 1 J 332.95 249.43 142.27 208.54 re S Q q Q q 332.95 37.28 142.27 208.54 re W /DeviceRGB {} cs [0 0 0] sc [1 1 1] sc 332.95 37.28 142.27 208.54 re f /DeviceRGB {} CS [0 0 0] SC [0.98 0.98 0.98] SC 1.06 w [] 0 d 0 J 1 j 10 M 332.95 78.89 m 475.22 78.89 l S 332.95 143.16 m 475.22 143.16 l S 332.95 207.43 m 475.22 207.43 l S 344.98 37.28 m 344.98 245.83 l S 371.78 37.28 m 371.78 245.83 l S 398.58 37.28 m 398.58 245.83 l S 425.38 37.28 m 425.38 245.83 l S 452.17 37.28 m 452.17 245.83 l S [0.898 0.898 0.898] SC 0.43 w [] 0 d 332.95 46.76 m 475.22 46.76 l S 332.95 111.03 m 475.22 111.03 l S 332.95 175.29 m 475.22 175.29 l S 332.95 239.56 m 475.22 239.56 l S 358.38 37.28 m 358.38 245.83 l S 385.18 37.28 m 385.18 245.83 l S 411.98 37.28 m 411.98 245.83 l S 438.77 37.28 m 438.77 245.83 l S 465.57 37.28 m 465.57 245.83 l S [0.333 0.694 0.969] sc 339.42 46.76 m 343.34 46.76 l 343.34 46.76 l 339.42 46.76 l h f 343.34 46.76 m 347.26 46.76 l 347.26 46.76 l 343.34 46.76 l h f 347.26 46.76 m 351.18 46.76 l 351.18 46.76 l 347.26 46.76 l h f 351.18 46.76 m 355.1 46.76 l 355.1 46.76 l 351.18 46.76 l h f 355.1 46.76 m 359.02 46.76 l 359.02 46.76 l 355.1 46.76 l h f 359.02 46.76 m 362.94 46.76 l 362.94 46.76 l 359.02 46.76 l h f 362.94 46.76 m 366.86 46.76 l 366.86 46.76 l 362.94 46.76 l h f 366.86 46.76 m 370.78 46.76 l 370.78 46.76 l 366.86 46.76 l h f 370.77 46.76 m 374.69 46.76 l 374.69 46.76 l 370.77 46.76 l h f 374.69 46.76 m 378.61 46.76 l 378.61 46.76 l 374.69 46.76 l h f 378.61 46.76 m 382.53 46.76 l 382.53 46.76 l 378.61 46.76 l h f 382.53 46.76 m 386.45 46.76 l 386.45 46.76 l 382.53 46.76 l h f 386.45 46.76 m 390.37 46.76 l 390.37 46.76 l 386.45 46.76 l h f 390.37 46.76 m 394.29 46.76 l 394.29 46.76 l 390.37 46.76 l h f 394.29 46.76 m 398.21 46.76 l 398.21 46.76 l 394.29 46.76 l h f 398.21 46.76 m 402.13 46.76 l 402.13 46.76 l 398.21 46.76 l h f 402.13 46.76 m 406.05 46.76 l 406.05 46.76 l 402.13 46.76 l h f 406.05 46.76 m 409.97 46.76 l 409.97 46.76 l 406.05 46.76 l h f 409.97 46.76 m 413.89 46.76 l 413.89 46.76 l 409.97 46.76 l h f 413.89 46.76 m 417.81 46.76 l 417.81 46.76 l 413.89 46.76 l h f [0.31 0.643 0.902] sc 417.8 46.76 3.92 16.07 re f [0.282 0.584 0.824] sc 421.72 46.76 3.92 35.35 re f [0.318 0.651 0.914] sc 425.64 46.76 3.92 12.85 re f [0.208 0.435 0.624] sc 429.56 46.76 3.92 86.76 re f [0.075 0.169 0.263] sc 433.48 46.76 3.92 189.58 re f [0.184 0.392 0.565] sc 437.4 46.76 3.92 102.83 re f [0.267 0.557 0.784] sc 441.32 46.76 3.92 44.99 re f [0.302 0.624 0.875] sc 445.24 46.76 3.92 22.49 re f [0.325 0.671 0.941] sc 449.16 46.76 3.92 6.43 re f 453.08 46.76 3.92 6.43 re f 457 46.76 3.92 6.43 re f [0.333 0.694 0.969] sc 460.92 46.76 m 464.84 46.76 l 464.84 46.76 l 460.92 46.76 l h f 464.83 46.76 m 468.75 46.76 l 468.75 46.76 l 464.83 46.76 l h f [0.498 0.498 0.498] SC 1.06 w [] 0 d 1 J 332.95 37.28 142.27 208.54 re S Q q Q q Q q [1 0 0 1 0 0] Tm 0 0 Td /DeviceRGB {} cs [0 0 0] sc [0 0 0] sc [10 0 0 10 28.58 255.31] Tm 0 0 Td /F10_0 1 Tf (0) [0.556 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [10 0 0 10 23.02 325.53] Tm 0 0 Td /F10_0 1 Tf (20) [0.556 0 0.556 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [10 0 0 10 23.02 395.75] Tm 0 0 Td /F10_0 1 Tf (40) [0.556 0 0.556 0] Tj Q q Q q /DeviceRGB {} CS [0 0 0] SC [0 0 0] SC 1.06 w [] 0 d 0 J 1 j 10 M 36.97 258.9 m 41.22 258.9 l S 36.97 329.12 m 41.22 329.12 l S 36.97 399.34 m 41.22 399.34 l S Q q Q q Q q Q q Q q Q q [1 0 0 1 0 0] Tm 0 0 Td /DeviceRGB {} cs [0 0 0] sc [0 0 0] sc [10 0 0 10 28.58 43.17] Tm 0 0 Td /F10_0 1 Tf (0) [0.556 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [10 0 0 10 23.02 107.44] Tm 0 0 Td /F10_0 1 Tf (20) [0.556 0 0.556 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [10 0 0 10 23.02 171.7] Tm 0 0 Td /F10_0 1 Tf (40) [0.556 0 0.556 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [10 0 0 10 23.02 235.97] Tm 0 0 Td /F10_0 1 Tf (60) [0.556 0 0.556 0] Tj Q q Q q /DeviceRGB {} CS [0 0 0] SC [0 0 0] SC 1.06 w [] 0 d 0 J 1 j 10 M 36.97 46.76 m 41.22 46.76 l S 36.97 111.03 m 41.22 111.03 l S 36.97 175.29 m 41.22 175.29 l S 36.97 239.56 m 41.22 239.56 l S Q q Q q Q q Q q Q q 475.22 249.43 14.38 208.54 re W /DeviceRGB {} cs [0 0 0] sc [0.8 0.8 0.8] sc /DeviceRGB {} CS [0 0 0] SC [0.498 0.498 0.498] SC 1.06 w [] 0 d 1 J 1 j 10 M 475.22 249.43 14.38 208.54 re f 475.22 249.43 14.38 208.54 re S [1 0 0 1 0 0] Tm 0 0 Td [0 0 0] sc [0 -10 10 0 478.82 408.17] Tm 0 0 Td /F10_0 1 Tf (e) [0.556 0] Tj 30 TJm (xample) [0.5 0 0.556 0 0.833 0 0.556 0 0.222 0 0.556 0] Tj 15 TJm (.nativ) [0.278 0 0.556 0 0.556 0 0.278 0 0.222 0 0.5 0] Tj 25 TJm (e) [0.556 0] Tj 15 TJm (.tr) [0.278 0 0.278 0 0.333 0] Tj 10 TJm (ace) [0.556 0 0.5 0 0.556 0] Tj 15 TJm (.csv) [0.278 0 0.5 0 0.5 0 0.5 0] Tj Q q Q q 475.22 37.28 14.38 208.54 re W /DeviceRGB {} cs [0 0 0] sc [0.8 0.8 0.8] sc /DeviceRGB {} CS [0 0 0] SC [0.498 0.498 0.498] SC 1.06 w [] 0 d 1 J 1 j 10 M 475.22 37.28 14.38 208.54 re f 475.22 37.28 14.38 208.54 re S [1 0 0 1 0 0] Tm 0 0 Td [0 0 0] sc [0 -10 10 0 478.82 199.07] Tm 0 0 Td /F10_0 1 Tf (e) [0.556 0] Tj 30 TJm (xample) [0.5 0 0.556 0 0.833 0 0.556 0 0.222 0 0.556 0] Tj 15 TJm (.simgr) [0.278 0 0.5 0 0.222 0 0.833 0 0.556 0 0.333 0] Tj -15 TJm (id.tr) [0.222 0 0.556 0 0.278 0 0.278 0 0.333 0] Tj 10 TJm (ace) [0.556 0 0.5 0 0.556 0] Tj 15 TJm (.csv) [0.278 0 0.5 0 0.5 0 0.5 0] Tj Q q Q q Q q /DeviceRGB {} CS [0 0 0] SC [0 0 0] SC 1.06 w [] 0 d 0 J 1 j 10 M 66.65 33.03 m 66.65 37.28 l S 93.45 33.03 m 93.45 37.28 l S 120.24 33.03 m 120.24 37.28 l S 147.04 33.03 m 147.04 37.28 l S 173.84 33.03 m 173.84 37.28 l S Q q Q q [1 0 0 1 0 0] Tm 0 0 Td /DeviceRGB {} cs [0 0 0] sc [0 0 0] sc [10 0 0 10 58.31 23.02] Tm 0 0 Td /F10_0 1 Tf (100) [0.556 0 0.556 0 0.556 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [10 0 0 10 85.11 23.02] Tm 0 0 Td /F10_0 1 Tf (200) [0.556 0 0.556 0 0.556 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [10 0 0 10 111.9 23.02] Tm 0 0 Td /F10_0 1 Tf (300) [0.556 0 0.556 0 0.556 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [10 0 0 10 138.7 23.02] Tm 0 0 Td /F10_0 1 Tf (400) [0.556 0 0.556 0 0.556 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [10 0 0 10 165.5 23.02] Tm 0 0 Td /F10_0 1 Tf (500) [0.556 0 0.556 0 0.556 0] Tj Q q Q q Q q Q q Q q Q q /DeviceRGB {} CS [0 0 0] SC [0 0 0] SC 1.06 w [] 0 d 0 J 1 j 10 M 212.51 33.03 m 212.51 37.28 l S 239.31 33.03 m 239.31 37.28 l S 266.11 33.03 m 266.11 37.28 l S 292.91 33.03 m 292.91 37.28 l S 319.71 33.03 m 319.71 37.28 l S Q q Q q [1 0 0 1 0 0] Tm 0 0 Td /DeviceRGB {} cs [0 0 0] sc [0 0 0] sc [10 0 0 10 204.17 23.02] Tm 0 0 Td /F10_0 1 Tf (100) [0.556 0 0.556 0 0.556 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [10 0 0 10 230.97 23.02] Tm 0 0 Td /F10_0 1 Tf (200) [0.556 0 0.556 0 0.556 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [10 0 0 10 257.77 23.02] Tm 0 0 Td /F10_0 1 Tf (300) [0.556 0 0.556 0 0.556 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [10 0 0 10 284.57 23.02] Tm 0 0 Td /F10_0 1 Tf (400) [0.556 0 0.556 0 0.556 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [10 0 0 10 311.37 23.02] Tm 0 0 Td /F10_0 1 Tf (500) [0.556 0 0.556 0 0.556 0] Tj Q q Q q Q q Q q Q q Q q /DeviceRGB {} CS [0 0 0] SC [0 0 0] SC 1.06 w [] 0 d 0 J 1 j 10 M 358.38 33.03 m 358.38 37.28 l S 385.18 33.03 m 385.18 37.28 l S 411.98 33.03 m 411.98 37.28 l S 438.77 33.03 m 438.77 37.28 l S 465.57 33.03 m 465.57 37.28 l S Q q Q q [1 0 0 1 0 0] Tm 0 0 Td /DeviceRGB {} cs [0 0 0] sc [0 0 0] sc [10 0 0 10 350.04 23.02] Tm 0 0 Td /F10_0 1 Tf (100) [0.556 0 0.556 0 0.556 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [10 0 0 10 376.84 23.02] Tm 0 0 Td /F10_0 1 Tf (200) [0.556 0 0.556 0 0.556 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [10 0 0 10 403.64 23.02] Tm 0 0 Td /F10_0 1 Tf (300) [0.556 0 0.556 0 0.556 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [10 0 0 10 430.43 23.02] Tm 0 0 Td /F10_0 1 Tf (400) [0.556 0 0.556 0 0.556 0] Tj [1 0 0 1 0 0] Tm 0 0 Td [10 0 0 10 457.23 23.02] Tm 0 0 Td /F10_0 1 Tf (500) [0.556 0 0.556 0 0.556 0] Tj Q q Q q Q q Q q Q q [1 0 0 1 0 0] Tm 0 0 Td /DeviceRGB {} cs [0 0 0] sc [0 0 0] sc [12 0 0 12 231.89 10.8] Tm 0 0 Td /F10_0 1 Tf (Time [ms]) [0.611 0 0.222 0 0.833 0 0.556 0 0.278 0 0.278 0 0.833 0 0.5 0 0.278 0] Tj Q q Q q [1 0 0 1 0 0] Tm 0 0 Td /DeviceRGB {} cs [0 0 0] sc [0 0 0] sc [0 12 -12 0 19.42 231.62] Tm 0 0 Td /F10_0 1 Tf (Count) [0.722 0 0.556 0 0.556 0 0.556 0 0.278 0] Tj Q q Q q [1 0 0 1 0 0] Tm 0 0 Td /DeviceRGB {} cs [0 0 0] sc [0 0 0] sc [14 0 0 14 160.12 475.95] Tm 0 0 Td /F10_0 1 Tf (Histogr) [0.722 0 0.222 0 0.5 0 0.278 0 0.556 0 0.556 0 0.333 0] Tj 10 TJm (ams f) [0.556 0 0.833 0 0.5 0 0.278 0 0.278 0] Tj 30 TJm (or state distr) [0.556 0 0.333 0 0.278 0 0.5 0 0.278 0 0.556 0 0.278 0 0.556 0 0.278 0 0.556 0 0.222 0 0.5 0 0.278 0 0.333 0] Tj -15 TJm (ib) [0.222 0 0.556 0] Tj 20 TJm (ution) [0.556 0 0.278 0 0.222 0 0.556 0 0.556 0] Tj Q q Q q Q Q showpage %%PageTrailer pdfEndPage %%Trailer end %%DocumentSuppliedResources: %%EOF starpu-1.2.3+dfsg/doc/doxygen/chapters/images/paje_draw_histogram.pdf000066400000000000000000000155521320135501600257620ustar00rootroot00000000000000%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20140325130949) /ModDate (D:20140325130949) /Title (R Graphics Output) /Producer (R 3.0.3) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 3079 /Filter /FlateDecode >> stream x[Moϯ}0n^e$0 0^YHb5-֌fF4j=cwL~.뇍QZ>\U|8gäO3/!`MA{tAMQN>*͓VK%cmjsZLpbsqig_,dXQaӫy{Ƽl|2`YRZ`$9R^Iӓf"%VX$a<`_3ORZrK$` ưqd_75EyxZ)Zo% 4XdQ-,ys*ze,toϜ<[j¢f2KMX,,,9 Fٳb53ֆc?207,٩G`y'Y9HSL>JS)j+F0*fV!`Tp8nAH%;D,aRgxeZB~J3S0݋<5JWԖ1Č*HcK10x9%Oh2[46*-F-I1O ɈA0jgA>(6P3a͋ qbbPV|1e@FzeluEH]`E"%I}7;^=Ο')mrH0c+ [G5,`e@YjjYkѥZ`2^O4#H 2Hv7X9yKf$0%mu(-I6#8ٌX0'D3D3b"0.mM9oٵE)3gbaCwDUڸҜA{=\ElڨX(/y™LKW'ooim`؄Tve<<"#, XD-ffX>RRκuKo)[OS<#K("E`?/ZnQ3yD yG`u@qDg,;l\q!E+;RDt6,mbeg(;g[v60Dg㵕*:zGt6ϲg+hsZV{àpB[lRDhczu^ KtNX%Z]6Cޓ:i#t#=z,?->VYHУK_YTZzڅeݓgqm,n-ߗ%omY.-ߕ&'}1u(4I=ʂ"S{]|çcz|/(z#g |9pW /ڣ\i=ͱ?Gy_e8GyWNQ_YuLɦޔWۛG܊] }3c<o%}>6=<~|>A@T c?$wȱendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 504 504] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj xref 0 11 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000003443 00000 n 0000003526 00000 n 0000003638 00000 n 0000003671 00000 n 0000000212 00000 n 0000000292 00000 n 0000006366 00000 n 0000006623 00000 n trailer << /Size 11 /Info 1 0 R /Root 2 0 R >> startxref 6720 %%EOF starpu-1.2.3+dfsg/doc/doxygen/chapters/images/paje_draw_histogram.png000066400000000000000000001076471320135501600260040ustar00rootroot00000000000000PNG  IHDRgAMA asRGB cHRMz&u0`:pQ<bKGD pHYs  ~IDATxw\%a! [E]Z]u[Y[m݊[=W- Wr}ӔH"磏>ޟ; C$IA iA4 H@$ IA iA4 H@$ IA iA4 H@Q P>8p 77ã?ٳ'55jժcǎؠ!o߾=|ׯkԨ_߇:::fggݻʕ+keϟsNڵ !gΜYJoVV  P^ݹs2bĈGܹ3}[nW[_MyՁ>}qa<==޾}{ԩ.]ddd:tŋCvɓ'ׯ?n8333Uݣs̥K!O~!Co>s fkkK;wr֭[0ҒRPP[n4lpذa}v^^^~rss[~ 9111{TTYPPаaÌ!vz!ǧSN<}oܸuwܹsɃV`YСCׯ_8.((?ܹsͭS_]z]h~rK5 G%ATٓbkk[F /<azxdǏ.΄WWכ7ob={ʊill-ϟ?O9pnС<ٳL*\$,,n˄~ֶ^ze˖4hЀ]vtRz,--7o|XX+!ٙ~ ŖtBHʕ}||166UԽ{w٘{xx;BY5*UDqssKLLy~֬Y4K011y>&&~J*]\\"""Jm2. 87T48qB&IR___ r=<z>}utt22F T2w\znZjVVVgϞy^Tnڴa>}Ѕ=V[laaaRTQo>B !tκu!k֬OdffBF9jԨb[;臫R|! M [hqƄXI߫П'Vǎ{]R1m4t֭H$}UMJ/_GDDhE5ͭiӦmA)nIwUTPD)m~JMMo\\\|}}ON?k!.Q$?::ՕtRaS>>>ꓱӧOo۶CժU V)b#Mw2y߿ 49JZΝ;cǎmڴU:uN:UmVRC?K#zJIuǎkР͛5jdkkۧO .^i?jՕ^zXYyzzzfffݻz=G* &{̙3SLH$+WSNY5I033+Bs?E^~n:&&&niE_-F>}zpp0˲EtR&M_VwEFFqzC^R ;;;BH'+m#ڵk߾}ɓ'WnٲcڷoyRTzm}PBܜa;#JU$ P}:gΜ䐐 'UիW'>11Q}ǏR;vСCG4hX.z X[n[[[_~ѣ۷o߾]tkB?Ts9Kڈh-޼yshhGiccөS'L&yfjjy^zռym۶tC*իYfW=zѣGWZյkW???Eƌs…k׮-XUV/_, qC 9uT׮]CBBmּy󘘘_.O?ݵkӧ,Xdɒ5k֭['!'|_Ї}W&MJݣ]իiZ&M:|۶mmvر^z:uj„ E :[޾}ڼyb BH:uUI&8qݺuU]J sO gg-[ 4+Vh޼9q4puuݹsU~׮]zz+ٳg[[[g ,8qĜ9shkk;{lk(/p [ /OIII\x:f]^~]CuoFWH1559siii}d611ٱcѣ޺u+00ś3gw5j\vMuwKٳgO՜{>~Xe˖7oIB1}tSSSU [B رcҥ x{{{B5W-K:'00y\^V-t#Jrʕ͚5H)ɓ'jY^OƦMOϴ^`RzE_mڴy~큁g6qD<Ϗ1bʔ)[nU%4.]R-.f477駟lҴiӒ_3ϟѼyhտΞ=֡J\\\``z^rylllZZ}* ???_z~˲,˚dff>z666]v~BBB)|Ⅻͯ^bYVqS333M4+BQJUEeee=~^w޽U:=?[֬YSUJŋ W ѣG\8111..ۻuɯ^rww3zyDK\Y}eVVV͚5=SlSK___<$ ٵkСC8zA\\ϐ!C;4&##A_u@@W6mڔ.Bqqq MLLhԨE0\4lݺUu@IR*,,؇y^ ANNNwBvڕjmiӦyΐTvx$}rORA|\T*tɓ'꯷.f-߇G^T[A[J+WWf-B/ SDz+WY8A^z5w\/Z'j… ߩSϟ/d;+V8~x#G$mϞ=E({ӧO-ZT;v8{l) ͝;m۶͚5/ }=|h}]S(ӦM{?جo]t3mڴR!C4o޼M6k֬|xߴiS.]4iү_x޽{ e ,>}tŊO|811ǧ ]vuIIIڵkԨ޽{_|?`z7WI[vիW-,,z꥾ .ܼy :00PΟ?8@ҿbBYDDD={e͛_zիFFF Rj)p)?~jnnjnn>dȐǏݻN:l9///$$$::Fmfdd:t(::ӳ_~vvv,\.?׮]K9sO>'N8w\FFȠu=z...{VܞoEEEU^} \r>} ѣ7|ׯ߫Wcǎ...C/(iˏ?>uBС6߿-ZܸqzرGG|xW² {T:ekÆ 'O,e!!!3f̰433o2336׭[fOOOKKoF;v޽[6?k۷oGкW?ܜ2$$οpӧbbb+۷o7o^Jlmm;¥ _jFl2__ߔo]Y5jӧVl2?zVZCUuR(ʹsҗnBB>tݻw1AO~!gϞ <811Χ?V^}[l!/?󋊊4hj޽o宮˖-4hӧOkԨqرM6{92++rK,yvt@ӦM_XZ5B0oBHJun9>>>;;[ue˖Ǐ[XXܻwرcǎKOOOHH]PffflllVw^% BR8Yft~pppVVVoV?99::*UD8-?~iӦ TXZZu kk븸8P(~>vK,AN:% ߿:%=8<~y׋'¯z8::_NNNoɓ';v3+WGyMjjwh{%0¯B;v??8qW^ 4 g#++&WH.''GpJ$O5.vRTUDBʒJ 07E|䘙L&>ػr~~zS3++K&:{nfff۶mQ_%u0WWW9S(ꝟ0z6<`UQEoŊ3fxٳU :A;ܢ<ϛ7wޥ,ŋvɗ/_6nX[(eWWW^xATH? &xm9,J/>ܷo_I߿233߽{GƲ,K;F{W[vww?wjgϞ?ݽgk׮999 wըQcܹ.__\\\T_=Ȩ&?~k_,J+WS>,ոqc777?sکϞ="K]I&׭[w^\f[:<ݻwp78;qą *W\=z8x`xxB8vÇ;wbee˖%&&/]R~}ssիWggg͜9޽{hrH&uyݺu)))9996l(YwwKfff~Ŋ-[/{1J~cǎt={\poroLLLDDO)"kӦMJJʞ={ ţGmFbu֭[gΜaYΝ;ǎѣVQҖw/<~8//oƍ3/X %%%55uG7wɓ uEO8QJϫ櫾¿G]̙3ϟnoo?8;;gdd!:tHHH4iRNNʕ+I9__R޲(HdժUoʕ+ӳ%myѣ,,,d2ٚ5k͛׶m[[n=m4BzKQjբ71 秺bԩ-֭q 4םi,Xо}{a5k6{l!E633S]Ϗ.vNNN+W\d+W '00PV.Ek׮]pO?dll_6mTPph^dիΝkeeW_kJoVBHjT_TǺnyСɣG8.88rtt$̙3~ڵ+quԡWKR??:zj˫aÆQQQQQQibx7.Z_۟UeggSb|LVo^^L&s`qG-YãRPp'Df-i%gE@r`՜yk׮mnnND;hELZ_+ ekR_0x`ƙ-X;x`W# <PҖK)vۢ xw(h$SqqqW\)v6MKu% s.bxb0@-A~BPԬY؟~pG u@@@#i9]E;+$ sqq))oeccC ~zyEeHIqN<(E\0"H,&y^wYh㢣iUG> Èr;| ] Hok0Gi>333׬Y#6&O,& L}Ҁ@ER(".=R5D1q ÈXQTXtTc'Jmmm>HBVLi9Es\1;;ׅV^3R8|棏gcqjj*)CJ>0"Wzzk,T*Uw( aee88###MennD" JeYLi9Yq\.H$kGS=^wP( D\v.˥R)VYPAWX?Ç^={ٵkW5ò,zOR$T㉞϶m;95U~fMN IA iA4 H@$ IWcmONˁP- i Y9rIQyA iA4 H@$ IA iA4 H@$ I"3*J <*ŭQ1 #"˲wv,5pBDR*Q!<3 cGDDÇ`bд鹹EORxB/ÇVGa`I˲6Ю,b-q%THĜ8N* ÈAqS'bEq_8 Je;k>!,v,jzU!Oh9|4.L,0T*4D"(7r[L&|X!UT*ՑMI ,iШ1 0,4]fD#.B nEq)!VX~eGDDÇ`bVe9h|>1i IA iA4 H@$ IA iA4 H@$ IA iA4 H@$ IA iA4 H@$ D*0tɎuֵE$ ͳLOO755ϟ>}z.]?OٳgO85jXnʕ+/_kB`?н{w՜ƍ7iݻZdtg3 XH X͚5gΜM_~gς Id6lOHH ̝;Ν;ׯ~,}.JJ'srrlӠÇK$`4fbbn:Bȏ?hiiIg盚j7>޽_޻wNrתUgg%K1 Bϟ?Oûw&L@zJ쬚sر/vz%@S/^vYΜ9ӿʕ+שSG47sAAA9Nԩ͉|}}k׮}i4<4iP(tz˗Ϝ9LqM߿ΝAf&$$4iD5BCC ="++ =+Wܽ{EΝz' 111&Mx񢉉4+++դX~}sGNKKZT2 #FU\Q yE\)9Ӵñ,0L^^p"STrDzu<_hN~~v/c(V!EBg=e5]Qt8z+󭐌NǓ܊w##CXzzL 6 P(4t[[[GTkbFF݋8㌌4uDKjJ%˲2Lr, <DwWLMMw0P( T7kT!RT*?gddTDϧ]޽{WtaYyY'RwŠq<133+G&.]J,VVVK, MOO7,<<|ĉ8##gϞ=x3**JXtttnW,zTq̙*OuHB>|o~=J}Yhh(I"<<˗={DhI&ׯm۶gϞ%3&$$D>ڵkצM-[7SN ,pqqAhѣG<8z?i&BHv֯_WV0LHHȹs={vȑM4P(jԨt}^v-""G4x{{OJN:u M N5RRR---իӆ ҫMKfܼe˖'On۶m^^/rƍw;V("H^'J;™fcc3iҤ!ѳgςB󍌌D}k=&zٳgOB]]۷owttJ $ 'BZYYi+ֲeKqC]H [zz͛\jgg׬Yc:;;k=`JԩSccc/^?feǎXH ثW駆 ֮]{ѢE7oz,$ ,%%D5awwDB`|}}߼ysu՜7nh=.0`SN2e޽{ !s}u߾}4@a}i޼E>}xV.!i0x...;4 i0l 6M6q@=mȐ! cii@H ĉU)J77~N: ]zU7˲W\9{BHC&k֭[߸aՅB0, )']LM;_y^᫜O8RP#ÿ}6!!h~0lK,Q|Ǐ[2H4k4GDQ eYR)bENTfFFFd2dF*\.H|(BhۉT*JS!#4'qBd2;HOr<1 x"ߑdff>٨QI&mÙ6yd5DmӦM-Zݻwdd$!dwE $ ,&&fsҥ A.O6-))I@asE5iajtuYZjuؑe}̜9˗wҥvcL^zjj*q2N:/^ ٥k=fkkۮ]˗GDD:twޭVc sNccg97nСCPPc!i0`999ݻw I/4 6Zvc!i0`,ﱱ3߿eÇk$ ѣG!!!=zP'O\]]MLL I333ݻرcghѢFڍU^ɩSciiP(rrrEZXH [vܸqczzYN:쬕@H ۅ δy… ڪO_x~UV-Oe"˻rJhhhXXSݺuIJL\avڵkW^upph۶_~YV-]B9G%8|Δ)S֬YӸqc[. ۲e<=='O~xzA4oܸ^lɓCBBN<XH ˗/===k׮#B`sssUs8)$ 7 `Ȑ!)))?sĉZ]}aaannn[n555z r `LMMnjCYdNLa[p[xA/h5<PEĤ=A8N*]+ÇI@x&]}SZ;֮]ۮ];7h?{ׯ_LJJx񢙙ٜ9s I{/ƍ'JU3wդI___777-B`\]]G١Crvڍ٩?FlbbXH [VܸqcPPv!i0l'NP|A h=wݺuvڰab@q\J>P&<ϫff„ Z͛ 6433:u*˲tŋk֬ibbҤIODشiS-zIYz}ZHIC\\\֭?'N߿ٲe.]|WQQQҥ N9h*&&fsҥ }˥\.6mZRRc>E>Ebjj*f\e9HbO? +To;w466>{,sƍ:hND?I޽{G=nܸ#GX[[ә)))eRSS kzKh<ϋԑH$"֢#At8M0dTMI/SQNI4ZQt}z.]?OٳgO85jXnʕ+/_kB`?@D5nܸI&jlL^՗"^?AH X͚5gΜM_~gς Id6lOHH ̝;Ν;ׯ~,T7Asss[n!sq=~Dof@`؆@ymٲ]4 BSRRMMMuIa[l٭[dzM@)I&߿ʕ+]饑څ=>>^^^&Myc!i0`rL":˲,j=痕5o޼xBHnn?Fi=fffnݺ7oޜ;w|rWWWF7nPx{{ܹSGpm۶e˖111#GܹmtIKLL_ϟ}ѣGܹ322R뱐4N:dcǎ1W^ 6|c!i0`޽#~:))QFJ2))Lp!$322?~lllǎMЪU+™fdd~z\2vXBHϞ=gooX8`تVdd-?~0v!i bccCCCϞ=믿"iINN>wܙ3g^xQ~AnA끐4.]:uֺAB!C燄=zJG4 &:ujܸq=ӧϰaݛ@ydSN>|ZjAAAZ0:tPeq<Pd?/A iA4 v.*E%e(zVβ+ͧ]"*D//n12GȊ%-Q_Ox—euu0{4( M@U!JRZJH8NPH$b8;qqz T*Jޚ6+eY4-Z*^D-aYVqV|nYPhzqqBB90E}Yek|"b`IF7,0T*4D"q q<ϋX4i@*2 ъtMfI.A4 xT4q2T yemЃ49]kڢ^ ?O H@$ ipdd&S˸<\6}F$ Pݎ{ϣetwrդ!i Ikz00F0x/S $&M'AW[q5e?Y~w I㒲y( ~A4 H@yMõWy?HWco&yTMe15##_{9U^LA iA4 H@$ IA iA4 -_r7rNWDPVUfRw?O H@ICF=zThffff5Pf4DGG;w{n///} ^vٳg5W@k*5+},ɱgr9=k;lY䟡m+.Ah4DDDL8"W^0J$ݻ ϝ;נA)S̝;oE+Tjҍ@Ґ4IM'PE]YW^/6lPtׯ;vѣG^^^.]ܹэ'4ܽ{ve wގ;8ڴiv@%9 UTٻw/J|wwZ^~~C5~۷o>I:dii>? @`ҐlkkMNNV_`ҥOV3z贴4!w2R JaB!J*֊R6%R<'or9q.]8eaM˩T*9cYVr*J7~X[~~v/cht i4RqQՠs,'Ie2Lо˲(:q3322:]T>Orss?񤃷4j҈[YGJ%/a :j@kIkJ,ʤ2B#ڨ/`"6s3T*R^"㥬?W6I̕_+BOU[$ ZriDRg999 l۶PGܵk?wP(4tFQ*_Maeep88###MG]nnD"155t,+4-'˲yyyVVV"}DwWLMMvTB((((m T*Jܥ,5FFFXXXhOD|UJ_ݻwEgey[x"JML4_Ǔve?V}zd7Ig5>>^5'/Rh "BHOOȲܹٳgi:xN:=-wO8p`ҤIgΜ,޽{ݺuׯ43իW;w0QӬY3[011zjϟ??t]v13wO;>'''3g LFO4{ñD"q"''̢ݻjxD& \+/__[u P!LWhW\p³gϢZ*5dȐ.++K3y͛7—E/鱻 JVfgggeexRd"0Ǿr'JE3???++KjQ(DwWlLt,+[-'!Dc?|4Ç53 q<OD\V'z>+Dse|6RA.oٲ耵uxxxxx8Ӟ={P-E׮]PF[ԭ]E%33s&&&QQQ"^Ȥjժs$I׭[נAT+@#2i2]Ӑ___v4p`5kdgg9SN;wS7o hn:m1559szgS*(}4̞={Ŋ_}U>}\\\:?(~AGidd4p@sG---5]K-R999T*-R+((`F[xHiZNr}Ǭ۷odrrrڵsH$Wφ2|LMM5-CjᓐpBcaaQ>,D齲x 5k$$e &i8nڵ/Zjiuҥ ,Zj—W( È鶶":Rꍌ ++++sgdd͕H$SXd"K'.\\.Ht|EwVx]! @aH.KR!qYPBD<8AB~"zл>8|gF!keYVe9HR}`=+UD4'T|w޽^zpĜi\D"yǏKRWWע\|?P*GUe˖O >Ow(|Nwiر'N('N7sEOܭ[FFF 6|1!VZ8;;/YdĈh L䅐{{addTRw)~В}݅ 5kF֭ݻ,Yrر(KKˡC͞=MP>L*Ut͋/޿?>>ݽ~m۶-cǼh@?Nԩ׷vڧO0a|*Ýڶm۶m[zlI˼z{֬Y4229rɓIHHhҤj1//B/_LX-.iW?+D>⣜5NtΈ#"""w}ݻwϟwuuݽ{wttرc更4f L?}ѣGkFTZ""^J9}sᲳ}މJ4D"q7iZN]-F.B;EM8,PS+:3;;[x9\e9H$MO|ӫ% :t(qAAAnZhQHHȍ7 9jii믿J$ƍGEEm߾oWUzzN*}ɒ%666fqiy^@ PljWLLL=A\}O9|NCq^3 >2A~ԨQAAAo߾߿jȑ#={vҥ7o|rwwwqqQ WWW+xzzE i8uTffmk֭曐B'zSBRnYPhzqx|q^+ ,i裎VOGqe <ӱps8SDhŲԿ c:|h+vʩs6 T>,M+ ,i4(B`FUTc[Z,*J4^4dT*bJ%˲t]'=tE>nܸ7775 J?Ǧ_~ر;w9ssIIIAm5´e=iXl~wގ;zyyBڴivȑ/ ǏOzիZ!,,lӦM3fjׯկcQF\\Z/_PSPPPȑ#'6lؾ}{yҐ9hРm۶UTI}~rrj699Y}'>}Z}ѣ҄V* 0 irF(y O\qeYaDQJ8e5-Bs{+DP )"?y,銢qG)NǓ܊w¬wicc#fXy^o_T*511x333;;9|d22/e1___kkkU:Oo9[lQ( |Eo¼}6BX>}B=xڵkk7Γ;w5ZJ&uS(FFF߽{7: >>77W5㸨(/ $ 7 `Ȑ!)))?sĉZ]}aaannn[n.r `LMMnjCYdNLa[p[Ia4~0lO i0l44~~~c!i0`,>|PPԭ[7%%ɓ'Z' XիT2lذ>}N8LF`6nx1K={!i0l,vڕRPPPPP`eecii|NND4vqYf:uY+4 .I4\pZ[46[[[$֧O3͛WNB`Ǝeٻw'>i='aDzRbnb嶴m۶Uر)S?@H ˑ+IVMZVY}yO<}믿z $ M  E.]j֬@H ɓ'JQ>}@x%@"H\\\õei0lVrJǎIa;}ȑ#[j@4,+|ayhJT[Kd